2010-08-19 39 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