printf не работает и другие проблемы

Я наконец-то получил свою программу изменений, чтобы распечатать некоторые числа вместо того, чтобы выдавать исключение с плавающей точкой Тем не менее, сейчас он немного выключен. Вместо того, чтобы давать 2 четверти, 1 цент, 1 никель и 2 пенни, программа выбирает только один пенни, и я не могу понять, почему из какого-либо осмотра условий или структуры кода. Я добавил несколько проверок в каждое утверждение if, но даже не то, что оно распечатывается, сейчас я невероятно растерялся..

#include <stdio.h>
#include <cs50.h>
#include <math.h>

int changeF(float change, float  div)
{
    int c = change/div;
    return c;
}

int main(void)
{
    printf("Enter the bill amount:");
    float bill = GetFloat();
    printf("Enter the payment amount:");
    float payment = GetFloat();
    float q = .25; float di = .1; float n = .05; float p = .01;
    float change = payment - bill;
    do
    {
        if (bill >= 0.0 && payment >= 0.0 && change >= 0.0)
        {
            if (change >= q)
            {
                int quarters = changeF(change, q);
                printf("%d quarters\n", quarters);
                change = change - (.25*quarters);
            }
            if (change >= di)
            {
                int dimes = changeF(change, di);
                printf("%d dimes\n", dimes);
                change = change - (.1*dimes);
            }
            if (change >= n)
            {   
                int nickels = changeF(change, n);
                printf("%d nickels\n", nickels);
                change = change - (.05*nickels);
                printf("%f change", change);
            }
            if (change >= p)
            {
                int pennies = changeF(change, p);
                printf("%d pennies\n", pennies);
                change = change - (.01*pennies);
                printf("%f", change);
            }
        }
    }
    while (change > 0.0);
}

2 ответа

Попробуйте еще раз, добавив новую строку в конце строки:

printf("Enter the bill amount:\n");

Причина: stdout строка буферизована, и вам нужно дать ей новую строку, чтобы очистить вывод.

Или явно очистить его fflush(stdout);,

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

int bill = GetFloat() * 100 + 0.5;

Константы для значений тогда, конечно, также будут целыми числами, а именно 25, 10, 5 и 1.

Тогда ваш changeF Функция это просто целочисленное деление. (Вы можете отказаться от деления на единицу за копейки - просто сделайте остальную часть разменных копеек.)

Вам даже не нужно do... while петля. Достаточно сделать расчет только один раз. Ищите кварталы, десять центов и никелей, а остальное - копейки. Готово. Нет необходимости повторять.

Другие вопросы по тегам