2015-09-28 3 views
-3

на самом деле, его не показывают правильные изменения и total_price, приходят в том же самом, и в них есть отрицательные, а у психов - тоже проблема. Может кто-нибудь, пожалуйста, скажите мне, почему?программирование на языке поиска находок изменения

int main() 
{ 
    int items; 
    int loonies=0; 
    int cent=0; 
    float hst=0.13; 
    double change,tax, unit_price,purchase_price,total_price,cash_tendered; 

    printf("enter the number of items:\n"); 
      scanf("%d",&items); 
    printf("enter the unit_price:\n"); 
      scanf("%lf",&unit_price); 
    printf("cash_tendered:\n"); 
      scanf("%.2lf",&cash_tendered); 

    purchase_price=items*unit_price; 
    tax=purchase_price*hst; 
    total_price=purchase_price+tax; 

    printf("price for items:%.2lf\n",purchase_price); 
    printf("price for items with tax:%.2lf\n",total_price); 

    change = cash_tendered - total_price; 
    loonies=(int)change; 
    cent=((change - loonies)*100); 

    printf("change:%.2lf\n",change); 
    printf("loonies:%d\n",loonies); 
    printf("cent:%d\n",cent); 

    return 0; 
} 
+1

Опубликованный образец ввода, ожидаемый выход и наблюдаемый выход. –

+2

Не работайте с реальными числами, вы получите ошибки округления. Работайте с 'int' в центах. Используйте также «int» для налоговой ставки, например «tax = purchase_price» hst/100'. Найдите способ ввода десятичного числа, а затем скопируйте его в 'int' в центах. –

+0

это плохая форма: loonies = (int) change; вы должны использовать loonies = (int) floor (change); tgmath.h – tdbeckett

ответ

1

У вас ошибка во входном заявлении

scanf("%.2lf",&cash_tendered); 

, который должен быть

scanf("%lf",&cash_tendered); 

У вас также есть ошибки в printf заявления, используя формат %lf для double, где он должен быть %f , Обратите внимание, что формат для scanf не совпадает с форматом для printf.

Я также заметил, что вы почему-то смешали float и double.

После исправления, моя версия дала неправильное изменение на 1 цент. Вероятно, это потому, что вы работаете с реальными числами, которые могут давать ошибки округления. Лучшая работа в int. Используйте int для ставки налога, и рассчитать с помощью tax=purchase_price*hst/100. Найдите способ ввода десятичного числа, а затем скопируйте его в int в центах.

Я оставлю вас для улучшения этой детали.

+0

Не должно быть, 'printf()' также принимает ''% lf '', 'l'-модификатор для спецификатора' f'. Но это, безусловно, не нужно. –

+0

@iharob не '% lf' в' printf' для 'long double'? –

+0

Да, правда, и думая об этом, если тип параметра не является ожидаемым типом, поведение не определено. –

0
  1. В коде не было достаточно предупреждений о компиляторе или OP использует слабый компилятор. Ниже показан плохой и скорректированный формат.

    // scanf("%.2lf", &cash_tendered); // compiler showed warning 
    scanf("%lf", &cash_tendered); 
    
  2. код не проверяет результаты scanf(). Если значение возвращаемого значения не проверено, простые ошибки остаются незамеченными, как неудавшееся чтение из строки с недопустимым форматом. (для краткости не указывается и код ниже.)

  3. После любых расчетов, таких как расчет налогов, которые могут повлечь за собой нецелевое число результатов и необходимо исправить «пенни» (наименьшая единица), значение должно быть округлено ,

  4. Преобразование валюты целых чисел, как центы не следует использовать int преобразования, (int) бросок, floor() или truncate(). Код должен сначала использовать round().

    // loonies=(int)change; 
    // cent=((change - loonies)*100); 
    long long change_cents = (long long) round(change * 100); 
    int cent = change_cents % 100; 
    long long loonie = change_cents/100; 
    

Измененный код следующим образом:

double round_to_nearest(double x, unsigned unit) { 
    return round(x*unit)/unit; 
} 

int main(void) { 
    int items; 
    // These 2 are not money 
    double hst = 0.13; // tax rate 
    double unit_price; // price/unit 
    // Keep money type on separate line 
    double change, tax, purchase_price, total_price, cash_tendered; 

    printf("enter the number of items:\n"); 
    scanf("%d", &items); 

    // Note that unit price could be fractional like $1.234 each 
    printf("enter the unit_price:\n"); 
    scanf("%lf", &unit_price); 

    printf("cash_tendered:\n"); 
    scanf("%lf", &cash_tendered); 
    // Could add check that the cash entered in not fractional money 
    if (cash_tendered != round_to_nearest(cash_tendered, 100)) 
    Handle_Error(); 

    purchase_price = round_to_nearest(items * unit_price, 100); 
    tax = round_to_nearest(purchase_price * hst, 100); 
    total_price = round_to_nearest(purchase_price + tax, 100); 

    printf("price for items:%.2lf\n", purchase_price); 
    printf("price for items with tax:%.2lf\n", total_price); 

    change = round_to_nearest(cash_tendered - total_price, 100); 

    // round change to the nearest whole number of cents 
    long long change_cents = (long long) round(change * 100); 
    int cent = change_cents % 100; 
    long long loonie = change_cents/100; 

    printf("change:%.2lf\n", change); 
    printf("loonies:%lld\n", loonie); 
    printf("cent:%d\n", cent); 

    return 0; 
} 

кандидат упрощение:

Внутренне использовать целый ряд самых низких денежных единиц (например центы) в качестве округления не нужно с простым сложением/вычитание.

ИЛИ

Если с плавающей запятой доступна, использовать этот тип, как округление не требуется для простого сложения/вычитания.

Смежные вопросы