2015-03-08 20 views
0

我一直在我的初學者C課上爲一兩天的程序工作。我已經寫了,重寫了,分解了,並且已經重寫了這些代碼,在我的幫助下搜索了所有的問題。我懷疑我做錯了很簡單,但我認爲我只是不理解。C中簡單的修改程序;不理解初始化

該計劃旨在提示收銀員提供價格,投標金額,計算變更,並告知收銀員每退回多少鈔票/硬幣。 void main(void)to change = round的代碼由我的教師提供。我明白這就是我應該如何將一個雙數轉化爲一個整數。花了很長時間才弄清楚,如果我是唯一可以用於我的scanf的格式,並且我的導師特別要求使用大量的定義。

當程序運行時,它會成功提示支付的價格和金額,但總是將輸出更改爲-2,147,483,648(我知道它是int的最低值)。但是,我不知道爲什麼它正在挑選那個價值。變化的數學=圓的,它計算付費成本,是由我的老師提供的,我沒有玩弄它。

此外,我的編譯器給我發出警告「_____用於未初始化該功能」,用於「變更列表」下列出的「二十,十,五」等。當我將它們列爲int的頂部時,我認爲我已經初始化了它們?我的教練描述事情的方式對我來說似乎有點深奧,所以我肯定我只是錯過了一些超級簡單的東西。任何關於int和int *之間差異的解釋,或者爲什麼%f在我列出的%lf之後都不起作用,因爲它們是我以前的頭痛,並獎勵了互聯網獎勵點。

在此先感謝。希望我格式化好。

#include <stdio.h> 
#define TWENTY 2000 
#define TEN 1000 
#define FIVE 500 
#define SINGLE 100 
#define QUARTER 25 
#define DIME 10 
#define NICKEL 5 
#define PENNY 1 


    void main(void) 
{ 
    int round(double num) 
     { 
     return (int) (num + 0.5); 
     } 
    int change, // to be paid, in cents 
     twenties, tens, fives, singles, quarters, dimes, nickels, pennies;  
       //bills and coins used 
    double cost, // item cost, in dollars and cents 
      paid; // amount paid, in dollars and cents 

     change = round((paid - cost) * 100.0); 


//Ask for cost 
printf("Enter amount cost ($): "); 
scanf("%lf", &cost); 

//Ask for amount paid 
printf("Enter amount tendered ($): "); 
scanf("%lf", &paid); 

//Change list 
printf("Change is: %d\n", change); 
printf("$20 bills: %d\n", twenties); 
printf("$10 bills: %d\n", tens); 
printf("$5 bills: %d\n", fives); 
printf("$1 bills: %d\n", singles); 
printf("Quarters: %d\n", quarters); 
printf("Dimes: %d\n", dimes); 
printf("Nickels: %d\n", nickels); 
printf("Pennies: %d\n", pennies); 

//Calculations 
twenties = (change/TWENTY); 
change = (change % TWENTY); 
tens = (change/TEN); 
change = (change % TEN); 
fives = (change/FIVE); 
change = (change % FIVE); 
singles = (change/SINGLE); 
change = (change % SINGLE); 

} 
+1

這是迄今爲止我見過的最錯誤縮進的代碼。你實際上設法採取每一行,並把它放在錯誤的縮進,這是了不起的! – 2015-03-08 20:28:06

+0

C&P,編譯併爲我工作。發佈時是否更改了某些內容?你在Linux或Windows中編譯?(好吧,'工作',結果不好) – 2015-03-08 20:31:40

+0

@barakmanos大聲笑。我一直都知道我是個特例...:'^)謝謝你的提高。 – Keapora 2015-03-08 22:53:39

回答

0

的主要問題是,你實際上打印出未初始化的變量:一個塊中

// Here they are: 
int change, twenties, tens, fives, singles, quarters, dimes, nickels, pennies; 

// Then you print it out, still unitialized: 
printf("$20 bills: %d\n", twenties); 

// Then you give it a value 
twenties = (change/TWENTY); 

語句以相同的順序出現的語句發生。該任務代表立即計算;它沒有爲未來(或過去)的應用程序建立公式。

要解決此問題,您需要將所有賦值語句(twenties =等)移至printf語句之前。

您與change發生同樣的錯誤。首先,你寫:

// here "paid" and "cost" are uninitialized 
change = round((paid - cost) * 100.0); 

,然後你給他們的價值觀:

// too late, horse has bolted 
scanf("%lf", &cost); 
scanf("%lf", &paid); 

量需要的變化計算前要輸入。在變化計算硬幣之前必須先進行計算。

另一件事是round函數應該被移動到main()開始之前。在標準C中,嵌套函數定義是非法的。

+0

謝謝。是的,我認爲這會是非常簡單的。現在你以這種方式解釋它,這是完全合理的。重新排列後,它完美運作。謝謝,非常感謝您的幫助。 – Keapora 2015-03-08 23:00:56