Почему вывод показывает правильный ответ для минимального количества монет, требуемого, когда введено изменение 2,2, но показывает неправильный вывод, когда я ввожу 4.2? - PullRequest
0 голосов
/ 26 января 2019

Я новичок в кодировании и пытаюсь решить проблему cash.c CS50. В этой задаче кассир должен предоставить минимальное количество изменений, используя только 25,10,5 и 1 цент, соответственно.

У меня были проблемы с выходами, о которых я только упомянул проблему, касающуюся использования 25 и 10 центов. Для 2.2 я должен получить ответ как 10, и это то, что я получаю, но для 4.2 я должен получить 18 и получить ответ как 22. Почему это происходит?

Полезные советы и конструктивная критика будут оценены.

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int clear_buffer()
{
int c;
while((c=getchar())!='\n' && c!=EOF);
}
int main(void)
{
fflush(stdin);
float a=0,b=0,c=0,d=0,e=0;
float n;
do
{
printf("The change is ");
}
while ((scanf("%f",&n)!=1) && clear_buffer() || n<0);

while((n-0.25)>=0)
{
    n=n-0.25;
    a++;
}
while((n-0.10)>=0)
{
    n=n-0.10;
    b++;
}
while((n-0.05)>=0)
{
    n=n-0.05;
    c++;
}
while((n-0.01)>=0)
{
    n=n-0.01;
    d++;
}
printf("The minimum coins required are %f", (a+b+c+d));
}

1 Ответ

0 голосов
/ 26 января 2019

Проблема, которую вы видите, вызвана ограничениями точности с плавающей запятой . Если вы отлаживаете программу, как я показал ниже на скриншоте, используя onlinegdb (если вы еще не совсем знакомы с использованием GDB в командной строке, вам важно научиться, но, возможно, это может будь хорошим первым шагом). Это довольно тесно связано с https://cs50.stackexchange.com/questions/2259/greedy-c-works-for-all-numbers-except-4-2 (где также есть некоторые рекомендации для потенциальных обходных путей / решений).

enter image description here Обратите внимание, что значение n после вычитания первого 0.10 действительно меньше, чем 0.10, но равно 0.0999998078, и, следовательно, оно думает, что есть только один цент, а не 2, который вы ожидаете.

Что касается конструктивной критики, ваши отступы немного плохи (не уверен, что это вызвано просто вставкой копии здесь или нет), у вас есть неиспользуемая переменная e, ваш a, b, c, d переменные могут быть int s, не обязательно с плавающей запятой, у вас есть некоторые магические числа, повторяющиеся 0.25, 0.10 и т. Д., Где они должны быть предварительно объявленными константами или, возможно, даже #define заявления. Есть и другие вещи, и если вы действительно заинтересованы, вы можете опубликовать на родственном сайте обзор кода после того, как вы сделали все улучшения, о которых вы только можете подумать.

...