Мне нужно написать программу изменения дозировки. Я выполнил код, но у него есть некоторые проблемы. Пожалуйста, помогите мне отладить код - PullRequest
0 голосов
/ 18 апреля 2011

В книге «Решение проблем и разработка программ на C» есть вопрос. Я написал код, но цикл не прерывается.

#include <stdio.h>
#include <math.h>
void change(double coin_change, int *quarters, int *dimes, int *nickels, int *pennies);
int main(void)
{
    int c_dollars, c_quarters = 0, c_dimes = 0, c_nickels = 0, c_pennies = 0;
    double a_paid, a_due, m_change, coin_change;
    printf("Enter the amount paid> ");
    scanf("%lf", &a_paid);
    printf("Enter the amount due> ");
    scanf("%lf", &a_due);
    m_change = a_paid - a_due;
    c_dollars = floor(m_change);
    coin_change = m_change - floor(m_change);
    // shows coin change
    printf("\n%f\n", coin_change);
    change(coin_change, &c_quarters, &c_dimes, &c_nickels, &c_pennies);
    printf("Change is dollars: %d$, quarters: %d, dimes: %d, nickels: %d,\
pennies: %d", c_dollars, c_quarters, c_dimes, c_nickels, c_pennies);
    return(0);
}
void change(double coin_change, int *quarters, int *dimes, int *nickels, int *pennies)
{
    int q = 0, d = 0, n = 0, p = 0;
     do{
        if(coin_change >= 0.25){
            q++;
            *quarters = *quarters + q;
            coin_change = coin_change - q*0.25;
        }
        else if( coin_change >= 0.10){
            d++;
            *dimes = *dimes + d;
            coin_change = coin_change - 0.1;
        }
        else if( coin_change  >=  0.05){
            n++;
            *nickels = *nickels + n;    
            coin_change = coin_change - (n*0.05);
        }
        else if(coin_change >= 0.01){
            p++;
            *pennies = *pennies + p;
            coin_change = coin_change - (p*0.01);
        }
    }while(coin_change>0);
}

Спасибо, я решил проблему. Правильный кодэто

#include <stdio.h>
#include <math.h>
void change(double coin_change, int *quarters, int *dimes, int *nickels, int *pennies);
int main(void)
{
    int c_dollars, c_quarters = 0, c_dimes = 0, c_nickels = 0, c_pennies = 0;
    double a_paid, a_due, m_change, coin_change;
    printf("Enter the amount paid> ");
    scanf("%lf", &a_paid);
    printf("Enter the amount due> ");
    scanf("%lf", &a_due);
    m_change = a_paid - a_due;
    c_dollars = floor(m_change);
    coin_change = (int)((m_change - floor(m_change)) * 100 + 0.5);
    // shows coin change (int)((m_change - floor(m_change)) * 100 + 0.5)
    //coin_change = coin_change * 100;
    printf("\n%f\n", coin_change);

    change(coin_change, &c_quarters, &c_dimes, &c_nickels, &c_pennies);
    printf("Change is dollars: %d$, quarters: %d, dimes: %d, nickels: %d,\
pennies: %d", c_dollars, c_quarters, c_dimes, c_nickels, c_pennies);
    return(0);
}
void change(double coin_change, int *quarters, int *dimes, int *nickels, int *pennies)
{
    int q = 1, d = 1, n = 1, p = 1;
     do{
        if(coin_change >= 25){
            *quarters = *quarters + q;
            coin_change = coin_change - 25;
        }
        else if( coin_change >= 10){
            *dimes = *dimes + d;
            coin_change = coin_change - 10;
        }
        else if( coin_change  >=  5){
            *nickels = *nickels + n;    
            coin_change = coin_change - 5;
        }
        else if(coin_change >= 1){
            *pennies = *pennies + p;
            coin_change = coin_change - 1;
        }
    }while (coin_change >= 1);
}

Ответы [ 3 ]

1 голос
/ 18 апреля 2011

В while(coin_change>0) сравнение двойных чисел с точным 0 никогда не является хорошей идеей, потому что числа с плавающей запятой имеют неточное представление.Установите некоторый допуск, например 0.01, и проверьте, если coin change > 0.01.

1 голос
/ 18 апреля 2011

Не стоит рассматривать деньги как число с плавающей запятой;Числа с плавающей запятой имеют ограниченную точность и (что еще хуже) пределы, в которых они могут представлять десятичные дроби.

Если бы вы лучше описали свою проблему, было бы легче оказать более конкретную помощь.

0 голосов
/ 18 апреля 2011

В вашей функции change () вы должны просто писать непосредственно в переменные, например:

if(coin_change >= 0.25){ *quarters = *quarters ++; coin_change = coin_change - q*0.25; }

Ваш текущий метод добавит много ненужных монет. Подумай об этом:

`q = 0; //...

if (coin_change> = 0.25) {// True, введите условное

        q++;   //q == 1

        *quarters = *quarters + q;   //*quarters = 1

        coin_change = coin_change - q*0.25;    //Coin change == .75

    }

// ...

if (coin_change> = 0.25) {// True, введите условное

        q++;   //q == 2

        *quarters = *quarters + q;   //*quarters = 3 ( 1 + 2 )

        coin_change = coin_change - q*0.25;    //Coin change == .50

    }

// ...

if (coin_change> = 0.25) {// True, введите условное

        q++;   //q == 3

        *quarters = *quarters + q;   //*quarters = 6 ( 3 + 3 )

        coin_change = coin_change - q*0.25;    //Coin change = .25

    }

`

Вы также должны использовать целое число для замены монет, просто умножьте значение на 100 и следите за копейками, так что $ 1 = 100.

также, вы можете использовать 4 цикла while для более ясной командной строки:

while(coin_change >= 0.25){ *quarters = *quarters ++; coin_change = coin_change - q*0.25; }

...