Проверьте 50 Ошибка в приложении Ca sh для CS50 Гарвард - PullRequest
0 голосов
/ 13 января 2020

Очень плохо знаком с кодированием, поэтому любая помощь приветствуется, на некоторое время застрял в этих ошибках проверки.

//source codde
#include <stdio.h>
#include <cs50.h>
#include <unistd.h>

int main(void)
{
    float user;
    int change, coins, decimals;

    do
    {
       printf("Enter change amount\n");
       user = get_float("");
    } while (user <= 0);

    change = user * 100;
    coins = 0; 

    while (change >= 25)
    {
        change = change - 25;
        coins++;
    }

    while (change >= 10)
    {
       change = change - 10;
       coins++;
    }

    while (change >= 5)
    {
       change = change - 5;
       coins++;
    }

    while (change >= 1)
    {
        change = change - 1;
        coins++;
    }

    printf("You have entered\f%.1f\n", user);
    sleep(1);
    printf("The least amount of coins possible\f%.2d\n", coins);
}

Сообщения об ошибках, которые я продолжаю получать: :( ввод 0,01 приводит к выводу 1 ожидаемого «1 \ n», а не «У вас есть ввод ...» это фактически возвращает назад 01, поэтому не уверен :( ввод 1.6 дает выход 7 ожидаемых «7 \ n», а не «У вас есть ввод» ... " то же самое, только 07, есть ли способ удалить ноль?

:( ввод 4.2 дает выход 18 ожидаемого" 18 \ n ", а не" Вы вводите ... "Вы забыли округлить ваш ввод до ближайшего цента?

Этот, я не уверен, что выдает результат 22 * ​​1013 *

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Сложная задача очень ясна о том, какой вывод должна выдавать программа. Вы не соответствуете этому. Прочтите еще раз.

И не забудьте округлить введенные данные в соответствии с набором задач.

0 голосов
/ 13 января 2020

Причина, по которой вы видите 22 вместо 18 для ввода 4.20, заключается в неточности с плавающей запятой. Число с плавающей запятой не может точно представлять значение 4.20, поэтому оно будет хранить значение немного больше или чуть меньше, чем 4.20 в вашей переменной.

В случае, если используется немного меньшее значение (например, 4.1999999 или 4.19998567), при умножении этого значения на 100 вы получите что-то близкое к 419.99999. Превращение этого в int усечет это до 419 и даст вам результат в 22 монеты.

Решение состоит в том, чтобы округлять до ближайшего целого, а не усекать, превращая числа с плавающей точкой в ​​целые числа. Обычный прием, который работает для небольших чисел с плавающей запятой, заключается в добавлении 0,5 перед усечением:

 change = user * 100 + 0.5;

Значения в диапазоне от 419.5000 до 420.4999 будут преобразованы в значения в диапазоне от 420.0000 до 420.99999. И усечение тогда даст 420.

Естественно, вы также можете использовать встроенные функции округления, которые поставляются с c.

Вам также следует рассмотреть возможность использования double вместо float. Пространство, сэкономленное с помощью float, обычно не стоит в современных настольных системах.

...