2010-08-19 41 views
-2

問題:要求用戶輸入物品價格值,然後顯示如何使用最小數量50美元,20美元,10美元,5美元和1美元的鈔票支付該數額的計劃。C程序練習。簡單交易報告

輸出示例:

Enter Price: 187 
Enter Amount to pay: 500 
Change is : 313 

(6)$50 (1)$10 (3)$1 
(0)$20 (0)$5 

這裏是我的代碼:希望大家幫幫我,我有一個很難在瞭解它的正確方法..

#include <stdio.h> 
#include <conio.h> 
#define p printf 
#define s scanf 
#define g gotoxy 

main() 
{ 
    clrscr(); 
    int c1,c2,c3,c4,c5; 
    int price,amount; 
    float change; 
    p("Enter Price: ");s("%d",&price); 
    p("Enter amount: ");s("%d",&amount); 
    change=amount-price; 
    p("Change is : %f ",change); 
    c1=(change/50); 
    c2=(0); 
    c3=(change/change); 
    c4=(0); 
    c5=(change/change)+2; 
    g(5,5);p("(%d) Php 50",c1); 
    g(5,6);p("(%d) Php 20",c2); 
    g(18,5);p("(%d)Php 10 \t",c3);p("(%d)Php 1",c5); 
    g(18,6);p("(%d) Php 5 ",c4); 


    getch(); 
    return 0; 
} 
+0

這是功課嗎?聽起來像是...... – FrustratedWithFormsDesigner 2010-08-19 15:22:24

+21

提示#1:無論你的代碼有什麼問題,都不要用宏縮短名字。 '#define p printf'絕對不是一個好主意。 – 2010-08-19 15:22:50

+0

歡迎來到SO!下一次點擊那個按鈕,用零和一個來設置你的代碼的格式。 – NullUserException 2010-08-19 15:23:17

回答

3

你」重新在正確的軌道上:

change也應該是int太(這意味着你應該將%f更改爲%d)。然後你會正確地確定50的數量(注意C中的整數除法截斷)。你應該看看%(模運算),以獲得50年代後的變化的剩餘量進行了討論:

使用你的例子:

變化= 313個
五=五十○分之三百一十三(6)
變化(%)= 50(13)

這意味着劃分本身由50(=變化變化%50)

二十=變化/ 20(0)
℃後設置change到其餘焊割(%)= 20(13)

幾十=變化/ 10(1)
變化(%)= 10(3)

這應該給你你需要的代碼的基本思想。您只需按遞減面額的順序繼續此模式。如上所述,使用更好的變量名稱,不要使用那些定義,並且通常每行堅持一條語句(在分號後添加一個換行符)。這將使您的代碼更具可讀性。你也使用了比所需更多的括號,但這不是什麼大不了的事。

+0

如果我將價格更改爲500,該怎麼辦?並達到1000;我應該改變我的公式嗎?..對不起新手.. //輸出錯誤(O_O)獲得了$ 13以上.. 輸入價格:500 輸入金額支付:1000 變化是:500 (10)$ 50(1)$ 10(3)$ 1 (0) $ 20(0)$ 5 – 2010-08-19 15:31:34

+0

不,公式對所有價格和金額都是一樣的。這只是一個例子。 – 2010-08-19 15:32:14

2

我會建議界定其持有的票據面額數組,票據計數的初空數組:

int denoms[5] = {50, 20, 10, 5, 1}; 
int bills[5] = {0, 0, 0, 0, 0}; 

for(int i =0; i < 5; ++i) 
{ 
    bills[i] = /* do something interesting with denoms[i] here */ 
    change = /* more work for you here */ 
} 

/* output answer */ 
for(int i =0; i < 5; ++i) 
{ 
    if (bills[i] > 0) 
      p("{%d)$%d", bills[i], denoms[i]); 
} 
p("\n"); 
for(int i =0; i < 5; ++i) 
{ 
    if (bills[i] == 0) 
      p("{%d)$%d", bills[i], denoms[i]); 
} 
p("\n"); 
+0

我想使用循環不打算在這個練習中引起我的教授仍然沒有教我們的條件語句... – 2010-08-19 15:35:46

0
void changeloop(int* change, int* counter, int amount) { 
    while (*change > amount) { 
     (*counter)++; 
     (*change) -= amount; 
    } 
} 
int main() { 
    clrscr(); 
    int price; printf("Enter Price: "); scanf("%d", &input); 
    int amount; printf("Enter Amount: "); scanf("%d", &amount); 
    int change = amount - price; 
    int fifties, twenties, tens, fives, ones; 
    fifties = twenties = tens = fives = ones = 0; 
    changeloop(&change, &fifties, 50); 
    changeloop(&change, &twenties, 20); 
    changeloop(&change, &tens, 10); 
    changeloop(&change, &fives, 5); 
    changeloop(&change, &ones, 1); 
    printf("Fifties: %d\n", fifties); 
    printf("Twenties: %d\n", twenties); 
    printf("Tens: %d\n", tens); 
    printf("Fives: %d\n", fives); 
    printf("Ones: %d\n", ones); 
    getch(); 
    return; 
} 

還有工作要做,比如輸入驗證和錯誤處理。但基本知識在這裏。代碼可以被重構得更加可擴展......但是meh。

+0

這裏的輸出: 例子: 輸入價格:187 輸入金額:500個 五十年代= 584 <--- 500+五十年代? heheh 二十幾歲:1 張數:0 fives:1 個人:3 – 2010-08-19 15:48:29

+0

然後你搞砸了。我給了6/0/1/0/2,這顯然不太對。我想你可能實際上必須嘗試解決問題。 – Puppy 2010-08-19 18:37:18