2011-04-18 19 views
0

“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); 
} 

谢谢你,我 解决problem.The正确的代码是

#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); 
} 
+1

为了完整起见,你要添加的输入值,你的问题。 – nathan 2011-04-18 14:35:54

回答

1

这不是对待金钱的浮点数量是个好主意;浮点数具有有限的精度和(更差)的限制,它们可以表示小数部分。

如果您更好地描述了您的问题,那么提供更具体的帮助会更容易。

1

while(coin_change>0)比较双精确到0从来不是一个好主意,因为浮点数有一个不精确的表示。设置一些容差,如0.01并检查,看看是否coin change > 0.01

0

在你的变化()函数,你应该直接写变量,EG:

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

您当前的方法会增加很多不必要的硬币。想想看:

`q = 0; // ...

如果(coin_change> = 0.25){//真,进入条件

 q++; //q == 1 

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

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

    } 

// ...

如果(coin_change> = 0.25){//真中,输入条件

 q++; //q == 2 

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

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

    } 

// ...

如果(coin_change> = 0.25){//真,进入条件

 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(coin_change >= 0.25){ *quarters = *quarters ++; coin_change = coin_change - q*0.25; }

相关问题