Мне нужна ваша помощь, чтобы понять, что я делаю не так в цикле for.

Я пытаюсь написать функцию, которая принимает общую сумму счета и общую сумму денежных средств, предоставленных для оплаты этого счета. Верните новый объект, который описывает общую сумму сдачи, которую кассир должен вернуть. Пропустите любые изменения, которые я не должен возвращать, т.е. если я не верну двадцатидолларовую купюру, я не включаю ее в результаты.

Я получаю объект с результатами, но не так, как ожидалось разделение между ценами в долларах.

Я ожидаю получить этот результат:

{ tenDollar: 1, twoDollar: 1, oneDollar: 1, quarter: 3, penny: 2 }

Но вместо этого получаю это:

{ tenDollar: 1, twoDollar: 0, oneDollar: 3, quarter: 0, dime: 7, penny: 7}

Реализация кода:


const calculateChange = function(total, cash) {
  // Your code here
  let arr = [];
  let change = cash - total;
  //console.log(change);
  //creates an aaray of split numbers 
    var i = 1;
    while (change > 0) {
      arr.unshift((change % 10) * i);
      change = Math.floor(change / 10);
      i *= 10
    }
  let changeType = {tenDollar: 0, twoDollar: 0, oneDollar: 0, quarter: 0, dime: 0, penny: 0};
    
    for(i = 0; i < arr.length; i++) {

      if (arr[i] % 1000 === 0) {
        changeType.tenDollar = arr[i] / 1000;
      } else if (arr[i] % 200 === 0 && arr[i] >=200 ) {
        changeType.twoDollar = arr[i] / 200;
      } else if (arr[i] % 100 === 0) {
        changeType.oneDollar = arr[i] / 100;
      } else if (arr[i] % 25 === 0) {
        changeType.quarter = arr[i] / 25;
      } else if (arr[i] % 10 === 0) {
        changeType.dime = arr[i] / 10;
      } else if (arr[i] % 1 === 0) {
        changeType.penny = arr[i] / 1;
      }
    }
  return changeType;
};
  console.log(calculateChange(2623, 4000));

1
Rashad Bayram 1 Мар 2021 в 03:09

2 ответа

Лучший ответ

Я сделаю это так:

const moneys =
  [ { face: 'fiftyDollar',  val: 50   *100 }
  , { face: 'twentyDollar', val: 20   *100 }
  , { face: 'tenDollar',    val: 10   *100 }
  , { face: 'twoDollar',    val:  2   *100 }
  , { face: 'oneDollar',    val:  1   *100 }
  , { face: 'quarter',      val:  .25 *100 }
  , { face: 'dime',         val:  .1  *100 }
  , { face: 'penny',        val:  .01 *100 }
  ]

const calculateChange = (total, cash) =>
  {
  let result = {}
    , change = cash - total  
    ;
  moneys.forEach( ({face,val}) =>
    {
    let count = Math.floor(change / val)
    change   %= val
    if (count > 0) result[face] = count
    })
  return result
  }

console.log( JSON.stringify( calculateChange( 2623, 4000 )) )
.as-console-wrapper { max-height: 100% !important; top: 0; }

Логика вашего кода искажена, потому что вы пытаетесь сопоставить 2 разных набора. Первая последовательность arr увеличивается в степени десяти (1000,100,10,1), тогда как последовательность ее раскрутки отличается из-за $ 20 и quarters ($ 0.25). в вашем тесте (arr = [1000,300,70,7]) 70c не может вернуть ожидаемое 3 quarters, потому что в следующем делении будет отсутствовать 5c из 7c.

Лучший код, который мы можем сделать с вашей логикой, будет (но он никогда не даст ожидаемого результата):

const calculateChange = function(total, cash)
  {
  let arr    = []
    , change = cash - total
    ;
  // console.log(`${cash} - ${total} = ${change}`);
  //creates an aaray of split numbers 
    var i = 1;
    while (change > 0)
      {
      arr.push((change % 10) * i);
      change = Math.floor(change / 10);
      // console.log( i, JSON.stringify(arr), change, (i*10))
      i *= 10
      }
  // console.log( 'arr =', JSON.stringify(arr), ' = ',arr.reduce((a,c)=>a+c,0))

  let changeType = {};
    
  for(i=arr.length; i--;)
    {
    let tenP = 10**i
    if (tenP === 1000 && arr[i] >= 1000 ) { changeType.tenDollar = arr[i] / 1000;                           } 
    if (tenP ===  100 && arr[i] >=  200 ) { changeType.twoDollar = Math.floor(arr[i] / 200); arr[i] %= 200; } 
    if (tenP ===  100 && arr[i] >=  100 ) { changeType.oneDollar = arr[i] / 100;                            } 
    if (tenP ===   10 && arr[i] >=   25 ) { changeType.quarter   = Math.floor(arr[i] / 25);  arr[i] %= 25;  } 
    if (tenP ===   10 && arr[i] >=   10 ) { changeType.dime      = arr[i] / 10;                             } 
    if (tenP ===    1 && arr[i] >     0 ) { changeType.penny     = arr[i];                                  } 
    }

  return changeType;
  }
console.log( JSON.stringify( calculateChange(2623, 4000)))
.as-console-wrapper { max-height: 100% !important; top: 0; }
0
Mister Jojo 1 Мар 2021 в 16:19

Я думаю, твой путь неверен,

Это верный способ решить похожую

(function () {
  var app = angular.module("calcApp", []);
  app.controller("calcController", function () {
    this.amountChange = function (amount, money) {
      //if(form.$invalid)
      //return alert("Please check form and enter correct values");

      var change = money - amount;

      var remaining = change * 100;

      var calcQuarter = Math.floor(remaining / 25);
      remaining = remaining % 25;

      var calcDime = Math.floor(remaining / 10);
      remaining = remaining % 10;

      var calcNickel = Math.floor(remaining / 5);
      remaining = remaining % 5;

      var calcPenny = Math.floor(remaining / 1);
      alert(
        "\nThe total was $" +
          amount +
          " with " +
          "$" +
          money +
          " tendered.\n\nPlease return $" +
          change.toFixed(2) +
          ":  " +
          calcQuarter +
          " quarters, " +
          calcDime +
          " dimes, " +
          calcNickel +
          " nickels, and " +
          calcPenny +
          " pennies, Thank you!"
      );
    };
  });
})();

Полный код можно найти здесь

0
Ehsan Ghaffarii 1 Мар 2021 в 00:43