0

在我的初学者 C 课上,我已经在一个程序上工作了几天。我已经编写、重写、分解和重写了这段代码,在几乎没有帮助的情况下搜索了我所有的问题。我怀疑我做错了什么很简单,但我想我只是不理解。

该程序旨在提示收银员提供价格、投标金额、计算找零,并告诉收银员每张钞票/硬币要退还多少。从 void main(void) 到 change=round 的代码由我的导师提供。我知道这就是我应该将双数转换为整数的方式。花了很长时间才发现 lf 是唯一适用于我的 scanf 的格式,我的导师特别要求使用大量定义。

当程序运行时,它成功提示输入价格和支付的金额,但是零钱总是输出到 –2,147,483,648(我知道这是 int 的最低值)。但是,我不知道它为什么选择该值。change = round 的数学计算,它计算付费 - 成本,是由我的导师提供的,我没有玩弄它。

此外,我的编译器在 //Change List 下列出的“二十、十、五”等警告“____ 未用于此函数的初始化”。当我将它们列为顶部的 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);

}
4

1 回答 1

1

主要问题是您实际上确实打印出未初始化的变量:

// 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 中,嵌套函数定义是非法的。

于 2015-03-08T21:01:42.057 回答