@Akrei

Не могу понять причину зацикливания функции?

Есть функция, которая принимает три аргумента: цену товара, который покупаешь, купюру которой расплачиваешься и двумерный массив из денег которые присутствуют в кассе (к примеру в примере ниже пенни суммарно на 1 доллар и 1 цент, двадцаток на 60 долларов), результатом на данном этапе является двумерный массив, который показывает сколько сдачи, каждой купюрой выдали (к примеру двадцатками выдали 40 долларов)

howMuchCid - двумерный массив, который показывает какое количество каждого номинала в кассе (к примеру двадцаток 3, пенни 101)

change - двумерный массив, который показывает сколько сдачи, каждой купюрой выдали (к примеру десяток выдали на 20 долларов) (тот массив который является промежуточным результатом)

Проблема в том, что цикл зацикливается на очевидным для меня образом
Ниже 4 условия, которые на мой взгляд должны работать, но работает только половина (в каждом примере разница только в цене товара)
1) checkCashRegister(30, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]); //работает
2) checkCashRegister(20, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]); //не работает
3) checkCashRegister(24.25, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]); //работает
4) checkCashRegister(24.15, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]); //не работает

Также не понимаю почему массив howMuchCid выглядит одинаково при логировании до цикла и после

Сам код:
function checkCashRegister(price, cash, cid) {
  let difference = cash - price;
  let PENNY = 0.01;
  let NICKEL = 0.05;
  let DIME = 0.1;
  let QUARTER = 0.25;
  let ONE = 1;
  let FIVE = 5;
  let TEN = 10;
  let TWENTY = 20;
  let ONEHUNDRED = 100;
  let howMuchCid = [["PENNY", Math.round(cid[0][1]/PENNY)], ["NICKEL", Math.round(cid[1][1]/NICKEL)], ["DIME", Math.round(cid[2][1]/DIME)], ["QUARTER", Math.round(cid[3][1]/QUARTER)], ["ONE", Math.round(cid[4][1]/ONE)], ["FIVE", Math.round(cid[5][1]/FIVE)], ["TEN", Math.round(cid[6][1]/TEN)], ["TWENTY", Math.round(cid[7][1]/TWENTY)], ["ONE HUNDRED", Math.round(cid[8][1]/ONEHUNDRED)]];
  let change = [["PENNY", 0], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]];
  console.log(howMuchCid);
  //console.log(difference);
  //console.log(change);
  while(difference > 0) {
	  if (difference - ONEHUNDRED >= 0) {
	  	if (howMuchCid[8][1] > 0) {
	  		difference = difference - ONEHUNDRED;
	  		howMuchCid[8][1] = howMuchCid[8][1] - 1;
	  		change[8][1] = change[8][1] + 100;
	  	}

	  } else if (difference - TWENTY >= 0) {
			if (howMuchCid[7][1] > 0) {
	  		difference = difference - TWENTY;
	  		howMuchCid[7][1] = howMuchCid[7][1] - 1;
	  		change[7][1] = change[7][1] + 20;
	  	}

	  } else if (difference - TEN >= 0) {
			if (howMuchCid[6][1] > 0) {
	  		difference = difference - TEN;
	  		howMuchCid[6][1] = howMuchCid[6][1] - 1;
	  		change[6][1] = change[6][1] + 10;
	  	}

	  } else if (difference - FIVE >= 0) {
			if (howMuchCid[5][1] > 0) {
	  		difference = difference - FIVE;
	  		howMuchCid[5][1] = howMuchCid[5][1] - 1;
	  		change[5][1] = change[5][1] + 5;
	  	}

	  } else if (difference - ONE >= 0) {
			if (howMuchCid[4][1] > 0) {
	  		difference = difference - ONE;
	  		howMuchCid[4][1] = howMuchCid[4][1] - 1;
	  		change[4][1] = change[4][1] + 1;
	  	}

	  } else if (difference - QUARTER >= 0) {
			if (howMuchCid[3][1] > 0) {
	  		difference = difference - QUARTER;
	  		howMuchCid[3][1] = howMuchCid[3][1] - 1;
	  		change[3][1] = change[3][1] + 0.25;
	  	}

	  } else if (difference - DIME >= 0) {
			if (howMuchCid[2][1] > 0) {
	  		difference = difference - DIME;
	  		howMuchCid[2][1] = howMuchCid[2][1] - 1;
	  		change[2][1] = change[2][1] + 0.1;
	  	}

	  } else if (difference - NICKEL >= 0) {
			if (howMuchCid[1][1] > 0) {
	  		difference = difference - NICKEL;
	  		howMuchCid[1][1] = howMuchCid[1][1] - 1;
	  		change[1][1] = change[1][1] + 0.05;
	  	}

	  } else if (difference - PENNY >= 0) {
			if (howMuchCid[0][1] > 0) {
	  		difference = difference - PENNY;
	  		howMuchCid[0][1] = howMuchCid[0][1] - 1;
	  		change[0][1] = change[0][1] + 0.01;
	  	}
	  }
	}
	console.log(howMuchCid);
	console.log(change);
}

checkCashRegister(24.15, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]); //один из примеров вызова функции
  • Вопрос задан
  • 99 просмотров
Решения вопроса 1
@Akrei Автор вопроса
Вопрос решен, проблема была в неправильной проверке на наличие определенной валюты в кассе, ее следовало добавить через логическое И к проверке "difference - определенный номинал"
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы