2013-02-01 118 views
1

到目前爲止,這可以讀取更簡單的十進制數字,如$ 10.00,$ 220.50,$ 14.25。但是當它變成12.76美元,320.84美元,47.53美元等數字時,它甚至不會運行。不知道是什麼原因導致這個錯誤,Moneyconverter程序C

我想知道是什麼導致它,以及如何修復它。

這是.h文件

#define TWENTY_BILL 20.00 
#define TEN_BILL 10.00 
#define FIVE_BILL 5.00 
#define ONE_BILL 1.00 
#define QUARTER_COIN 0.25 
#define DIME_COIN 0.10 
#define NICKEL_COIN 0.05 
#define PENNY_COIN 0.01 

這是.c文件

#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 
#include "Value.h" 

int main(int argc, char *argv[]) { 

/* 
*Checks if argc has just one argument 
*If not, give error message 
*/ 
if (argc < 2) { 
    printf("Error: One argument required."); 
    return 0;//If more than 1 argument, stops it 
}//end if 

/* 
* Converts argv[1] into double input 
* Then input2 is created as a float 
* input is transferred to input2 
* Floor function is used, Multiplies 
* input2 by 100 and then divide by 100 to 
* leave only 2 decimal places 
* Then Prints input2, %6.2f sets the field width 
* for 2 decimal places 
*/ 
double input = atof(argv[1]); 
float input2; 
input2 = input; 
input2 = floor(input2 * 100)/100; 
printf("You have entered: %6.2f\n", input2); 

/* 
* Creates variables for dollar 
* bill and coin set to 0 
*/ 
int twentycount = 0; 
int tencount = 0; 
int fivecount = 0; 
int onecount = 0; 
int quartercount = 0; 
int dimecount = 0; 
int nickelcount = 0; 
int pennycount = 0; 

//Loops when input is greater than 0.0 
while (input2 > 0.0) 
    { 
     /*Twenty Dollar Bill 
     * When $20 is less than input2, 
     * input2 - $20 = new input2 
     * Add count to twentycount 
     */ 
     if (TWENTY_BILL <= input2) 
     { 
      input2 = input2 - TWENTY_BILL; 
      twentycount++; 
     }//end if twenty 
     /************************/ 
     /*Ten Dollar Bill 
     * When $10 is less than input2, 
     * input2 - $10 = new input2 
     * Add count to tencount 
     */ 
     else if (TEN_BILL <= input2) 
     { 
      input2 = input2 - TEN_BILL; 
      tencount++; 
     }//end if ten 
     /***********************/ 
     /*Five Dollar Bill 
     * When $5 is less than input2, 
     * input2 - $5 = new input2 
     * Add count to fivecount 
     */ 
     else if (FIVE_BILL <= input2) 
     { 
      input2 = input2 - FIVE_BILL; 
      fivecount++; 
     }//end if five 
     /**********************/ 
     /*One Dollar Bill 
     * When $1 is less than input2, 
     * input2 - $1 = new input2 
     * Add count to onecount 
     */ 
     else if (ONE_BILL <= input2) 
     { 
      input2 = input2 - ONE_BILL; 
      onecount++; 
     }//end if one 
     /*********************/ 
     /*Quarter Coin 
     * When $0.25 is less than input2, 
     * input2 - $0.25 = new input2 
     * Add count to quartercount 
     */ 
     else if (QUARTER_COIN <= input2) 
     { 
      input2 = input2 - QUARTER_COIN; 
      quartercount++; 
     }//end if quarter 
     /*********************/ 
     /*Dime Coin 
     * When $0.10 is less than input2, 
     * input2 - $0.10 = new input2 
     * Add count to dimecount 
     */ 
     else if (DIME_COIN <= input2) 
     { 
      input2 = input2 - DIME_COIN; 
      dimecount++; 
     }//end if dime 
     /*********************/ 
     /*Nickel Coin 
     * When $0.05 is less than input2, 
     * input2 - $0.05 = new input2 
     * Add count to nickelcount 
     */ 
     else if (NICKEL_COIN <= input2) 
     { 
      input2 = input2 - NICKEL_COIN; 
      nickelcount++; 
     }//end if nickel 
     /*********************/ 
     /*Penny Coin 
     * When $0.01 is less than input2, 
     * input2 - $0.01 = new input2 
     * Add count to pennycount 
     */ 
     else if (PENNY_COIN <= input2) 
     { 
      input2 = input2 - PENNY_COIN; 
      pennycount++; 
     }//end if penny 
     /********************/ 
     /* 
     * If anything else 
     * Print Invalid Change 
     */ 
     else 
     { 
      printf("Invalid change"); 
     } 

    }//end while loop 

    /* 
    * If twentycount is more than 0 
    * Print amount of $20 bills used 
    */ 
    if (twentycount > 0) 
    { 
     printf("Amount of $20: %i\n", twentycount); 
    }//end twentycount 
    /* 
    * If tencount is more than 0 
    * Print amount of $10 bills used 
    */ 
    if (tencount > 0) 
    { 
     printf("Amount of $10: %i\n", tencount); 
    }//end tencount 
    /* 
    * If fivecount is more than 0 
    * Print amount of $5 bills used 
    */ 
    if (fivecount > 0) 
    { 
     printf("Amount of $5: %i\n", fivecount); 
    }//end fivecount 
    /* 
    * If onecount is more than 0 
    * Print amount of $1 bills used 
    */ 
    if (onecount > 0) 
    { 
     printf("Amount of $1: %i\n", onecount); 
    }//end onecount 
    /* 
    * If quartercount is more than 0 
    * Print amount of $0.25 bills used 
    */ 
    if (quartercount > 0) 
    { 
     printf("Amount of $0.25: %i\n", quartercount); 
    }//end quartercount 
    /* 
    * If dimecount is more than 0 
    * Print amount of $0.10 bills used 
    */ 
    if (dimecount > 0) 
    { 
     printf("Amount of $0.10: %i\n", dimecount); 
    }//end dimecount 
    /* 
    * If nickelcount is more than 0 
    * Print amount of $0.05 bills used 
    */ 
    if (nickelcount > 0) 
    { 
     printf("Amount of $0.05: %i\n", nickelcount); 
    }//end nickelcount 
    /* 
    * If pennycount is more than 0 
    * Print amount of $0.01 bills used 
    */ 
    if (pennycount > 0) 
    { 
     printf("Amount of $0.01: %i\n", pennycount); 
    }//end pennycount 


return 0; 
}//end main 
+0

「甚至不會跑」是什麼意思? –

+0

請更具體一點,它不會立即崩潰而運行?它永遠不會結束?還有其他的東西嗎? – AnthonyM

+0

好吧,我想我用了一個錯誤的單詞選擇,我的意思是沒有顯示任何東西 – user2031589

回答

1

我覺得你的問題在於input2 > 0.0。像input2 >= 0.00001會更好。這是因爲浮點在內存中的表示方式。 (x+y) - x - y不保證是= 0

更簡單的方法也只是由100

輸入到整數乘以轉換我也建議你刪除while循環和if語句裏面用while循環替換所有。

0

我相信你還沒有覆蓋結構。如果你有,你需要重新訪問你的代碼。事實上,你可以用數組改進東西,但是一組結構會更好。

請記住,二進制浮點值不能準確表示大多數小數值。那些如14.25確實具有確切的二進制表示,但是14.26不具有。 (另見:C compiler bug (floating point arithmetic)?觀察「10 * 0.1幾乎沒有1.0」和「浮點數就像小沙堆;每次移動一個沙子,就會失去一點沙子,並且會有一點污垢」。)

您應該將這些值轉換爲美分的整數。你也應該避免float;使用double,但優先使用int

當我改變了代碼Invalid change子句中閱讀:

 else 
     { 
      printf("Invalid change (%e)\n", input2); 
      break; 
     } 

然後,當我與參數14.26運行程序,然後用14.48,我得到的輸出:

$ ./change 14.26 
You have entered: 14.26 
Invalid change (2.288818e-07) 
Amount of $10: 1 
Amount of $1: 4 
Amount of $0.25: 1 
Amount of $0.01: 1 
$ ./change 14.48 
You have entered: 14.48 
Invalid change (9.999549e-03) 
Amount of $10: 1 
Amount of $1: 4 
Amount of $0.25: 1 
Amount of $0.10: 2 
Amount of $0.01: 2 
$ 

請注意,該錯誤消息包含一個換行符。該子句也終止循環。我應該設置一個標誌來指示出現錯誤並且抑制了更改的輸出。 14.26的計算結果是正確的,但是14.48的計算結果只有一分錢。正如你所看到的,我的診斷打印出造成麻煩的價值,所以很明顯,剩下的數字爲14.26,而14.48的數字略低於一分。

使用數組和整數,你可以寫:

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

int main(int argc, char *argv[]) 
{ 
    for (int n = 1; n < argc; n++) 
    { 
     double input = atof(argv[n]); 
     int cents = (100 * input + 0.5); 
     printf("You have entered: %6d.%.2d\n", cents/100, cents % 100); 
     int denom[] = { 2000, 1000, 500, 100, 25, 10, 5, 1, 0 }; 

     for (int i = 0; denom[i] != 0 && cents > 0; i++) 
     { 
      if (cents >= denom[i]) 
      { 
       int count = cents/denom[i]; 
       cents = cents - count * denom[i]; 
       printf("Amount of $%2d.%.2d: %i\n", denom[i]/100, denom[i] % 100, count); 
      } 
     } 
    } 

    return 0; 
} 

輸出:

$ ./change 14.48 14.26 14.47 14.31 14.00 20 10 5 1 0.25 0.10 0.05 0.01 
You have entered:  14.48 
Amount of $10.00: 1 
Amount of $ 1.00: 4 
Amount of $ 0.25: 1 
Amount of $ 0.10: 2 
Amount of $ 0.01: 3 
You have entered:  14.26 
Amount of $10.00: 1 
Amount of $ 1.00: 4 
Amount of $ 0.25: 1 
Amount of $ 0.01: 1 
You have entered:  14.47 
Amount of $10.00: 1 
Amount of $ 1.00: 4 
Amount of $ 0.25: 1 
Amount of $ 0.10: 2 
Amount of $ 0.01: 2 
You have entered:  14.31 
Amount of $10.00: 1 
Amount of $ 1.00: 4 
Amount of $ 0.25: 1 
Amount of $ 0.05: 1 
Amount of $ 0.01: 1 
You have entered:  14.00 
Amount of $10.00: 1 
Amount of $ 1.00: 4 
You have entered:  20.00 
Amount of $20.00: 1 
You have entered:  10.00 
Amount of $10.00: 1 
You have entered:  5.00 
Amount of $ 5.00: 1 
You have entered:  1.00 
Amount of $ 1.00: 1 
You have entered:  0.25 
Amount of $ 0.25: 1 
You have entered:  0.10 
Amount of $ 0.10: 1 
You have entered:  0.05 
Amount of $ 0.05: 1 
You have entered:  0.01 
Amount of $ 0.01: 1 
$ 
0

您已到達的地方浮點運算是不是很喜歡,我們認爲在學校裏。:-)

要將input2與零比較,您需要使用絕對epsilon,其值是FLT_EPSILON的一小部分。發生這種情況是因爲浮動/雙打無法精確表示所有值,例如double(.1) == 0.1000000000000000055511151231257827021181583404541015625。爲了解釋這一點,您需要確定您的號碼何時「足夠接近」到零。

相關問題