Программа, которая распространяет изменения среди клиентов. (С)
Цель:
Реализуйте программу, которая рассчитывает минимальное количество монет, необходимое для внесения пользовательских изменений.
Выпуск:
Программа не выполняется должным образом. Я вполне уверен, что моя проблема логична по своей природе, но также может быть результатом моей неопытности с правильным форматированием.
Дополнительная информация:
Я добавил функцию печати в код, чтобы определить, где была проблема. "test1" транслируется, "test2" - нет.
Я использую некоторые функции, локальные для библиотеки cs50.h:
- get_float (); - получает значение с плавающей запятой от пользователя и сохраняет его.
Пожалуйста, не исправляйте мой код для меня! Мне нужно научиться делать это самому. Мне просто нужна помощь в поиске логической ошибки или ошибки форматирования. Да, я знаю, что это не эффективно.
Примеры того, что я ищу:
"Ваша проблема в строке X, ваши значения делают так, чтобы VARIABLE никогда не достигал 0".
"В C вы не можете отформатировать '( x < 0);' - вы должны сказать '(x<0);'."
Проход кода:
Программа получает 2 значения с плавающей запятой от пользователя, количество и стоимость. "сумма" - это сумма, которую клиент дал, "стоимость" - стоимость товара.
Программа находит "сумму - стоимость", чтобы определить, сколько изменений должно быть. Это значение хранится в 'diff'.
Программа вычитает 0,25 из 'diff' и добавляет 1 к переменной 'четверть'.
Программа вычитает 0.10 из 'diff' и добавляет 1 к переменной 'dime'.
...
Программа печатает, сколько кварталов, центов, никелей и пенни нужно использовать, чтобы максимально эффективно изменить клиента.
Предположим, что можно использовать только монеты.
Код:
#include <stdio.h>
#include <cs50.h>
int main()
{
float cost;
do
{
printf("How much did it cost?\n");
cost = get_float();
}
while (cost < 0);
float amount;
do
{
printf("How much did you pay?\n");
amount = get_float();
}
while (amount < cost);
int quarter = 0;
int dime = 0;
int nickel = 0;
int penny = 0;
float diff = amount - cost;
do
{
while (diff >= 0.25)
{
diff = diff - .25;
quarter++;
}
printf("test1");
while (.10 <= diff < .25)
{
diff = diff - 0.10;
dime++;
}
printf("test2");
while (0.05 <= diff < .10)
{
diff = diff - 0.05;
nickel++;
}
while (0.01 < diff < 0.05)
{
diff = diff - 0.01;
penny++;
}
while (diff == 0.01)
{
penny++;
diff = 0;
}
} // end bracket for do function
while (diff > 0);
if (diff == 0)
{
printf("Your change consists of:\n");
printf("%i quarters.\n", quarter);
printf("%i dimes.\n", dime);
printf("%i nickels.\n", nickel);
printf("%i pennies.\n", penny);
exit(0);
}
if (diff < 0)
{
printf("Your change consists of:\n");
printf("%i quarters.\n", quarter);
printf("%i dimes.\n", dime);
printf("%i nickels.\n", nickel);
printf("%i pennies.\n", penny);
exit(0);
}
} // end bracket for int main
Ожидаемый результат:
Программа работает, как описано выше.
Фактический результат:
Программа не выполняется полностью. "test1" транслируется, "test2" - нет.
3 ответа
Прежде всего, вам необходимо проверить точность арифметики с плавающей запятой.
Тем не менее, заявления, как
while (.10 <= diff < .25)
не делает то, что вы думаете, они делают. Цепочка реляционных операторов невозможна при использовании подхода, который вы использовали в C.
Вы должны соединить их, используя &&
оператор, как
while (.10 <= diff && diff < .25) {
Прежде всего, ваша петля вечна. while (сумма <стоимость); <- Сумма и стоимость никогда не меняются. Так...
Во-вторых, вы не можете писать такие условия, как (1 <= 2 < 3), это не означает, что вы думаете, что это значит. Он по отдельности выполняет операторы, поэтому в итоге получается что-то похожее на (1 <= 2) < 3, причем первым является 1 (истина) или 0 (ложь).
Беда в сравнении как 0.05 <= diff < .10
которые не совпадают с 0.05 <= diff && diff < .10
Последний делает то, что вы намереваетесь, первый сравнивает 0 или 1 с 0,10. Если значение diff больше 0,05, то значение 0,05 <= diff равно 1, что затем сравнивается с 0,10. То, что вы написали, так же, как (0.05 <= diff) < .10
,