我的代码有什么问题(CS50 2012 Pset 1)
我试图制作一个程序,提供最少的硬币兑换,但如果我提供的数字不是分成四分之一的数字,它将失败得很惨。例如,如果我输入1.25,我会得到5个25美分硬币,但是如果我输入1.26,我会得到5个25美分硬币,这当然是不正确的。我做错了什么我的代码有什么问题(CS50 2012 Pset 1),c,cs50,C,Cs50,我试图制作一个程序,提供最少的硬币兑换,但如果我提供的数字不是分成四分之一的数字,它将失败得很惨。例如,如果我输入1.25,我会得到5个25美分硬币,但是如果我输入1.26,我会得到5个25美分硬币,这当然是不正确的。我做错了什么 #include <stdio.h> #include <cs50.h> #include <math.h> void calculate_change(change_requested){ int num_
#include <stdio.h>
#include <cs50.h>
#include <math.h>
void calculate_change(change_requested){
int num_quarters = 0;
int num_dimes = 0;
int num_nickles = 0;
int num_pennies = 0;
int val_quarters = 25;
int val_dimes = 10;
int val_nickles = 5;
num_quarters = floor(change_requested/val_quarters);
if(change_requested % val_quarters != 0){
num_dimes = floor( (change_requested - (num_quarters * val_quarters))/val_dimes );
if( change_requested - (((num_quarters * val_quarters) + (num_dimes * val_dimes))) != 0){
num_nickles = floor( change_requested - ( (num_quarters * val_quarters) + (num_dimes * val_dimes)/val_nickles ));
if( change_requested - (((num_quarters * val_quarters) + (num_dimes * val_dimes) + (num_nickles * val_nickles))) != 0){
for(int i = 0; i<change_requested - (((num_quarters * val_quarters) + (num_dimes * val_dimes) + (num_nickles * val_nickles))); i++){
num_pennies++;
}
}
}
}
if(num_quarters > 0){
printf("%i Quarters ",num_quarters);
}
if(num_dimes > 0){
printf("%i Dimes ",num_dimes);
}
if(num_nickles > 0){
printf("%i Nickles",num_nickles);
}
if(num_pennies > 0){
printf("%i Pennies",num_pennies);
}
printf("\n");
}
int main (void){
printf("How Much Change Do You Need?\nAmount: ");
float change_requested = GetFloat();
calculate_change(change_requested * 100);
return 0;
}
我觉得你把这件事复杂化了。如果你需要写
for(int i = 0; i<change_requested - (((num_quarters * val_quarters) + (num_dimes * val_dimes) + (num_nickles * val_nickles))); i++){
所有这些都集中在一行,那么肯定是出了问题。你可以用一种简单得多的方法,从总金额中减去刚刚计算出的硬币价值,从而得到剩余的:
int vals[] = { 25, 10, 5 };
const char *names[] = { "quarters", "dimes", "nickles" };
int pennies = 100 * GetFloat(); // not good at all, btw (*)
for (int i = 0; i < 3; i++) {
int n = pennies / vals[i];
if (n) {
printf("%d %s ", n, names[i]);
}
pennies -= n * vals[i];
}
if (pennies)
printf("%d pennies", pennies);
printf("\n");
至于GetFloat不好的原因:浮点数并不精确,因此,例如,1.26实际上可能表示为类似于1.25999946的值。当您将其转换为整数值时,如果运气不好,可能会因为截断而损失一分钱左右。您的代码中括号已关闭。请看这一行: num_nickles=请求的楼层更改-num_quarters*val_quarters+num_dimes*val_dimes/val_nickles; 代码首先计算num_quarters*val_quarters,结果是125。然后计算num_dimes*val_dimes,结果为0。然后它将num_dimes*val_dimes除以val_nickles,也就是0,然后将0加上num_quarters*val_quarters。因此,这一行代码的基本结果是:
num_nickles=楼层126-125+0,结果是1 请求的更改类型是什么?float、double或其他内容?另请参见欢迎使用堆栈溢出。请尽快阅读这一页。请学习使用编译器警告标志,并确保打开它们并注意它们。他们是来保护你的。您绝对不应该编写诸如void calculate_changechange_requested{…}之类的代码。这使用“隐式int”规则将请求的更改声明为int类型的变量。由于范围中没有用于计算更改的原型,函数定义不提供原型,因此参数以双精度传递。所有的地狱都会从那里爆发。[…continued…][…continuence…]让我有些惊讶的是,在Mac OS X上使用gcc进行测试时,编译器没有识别参数类型不匹配,并且进行了正确的类型转换,因此尽管范围中没有原型,浮点表达式还是转换为int参数。我不得不求助于单独编译count_change函数,以获得我从过去的痛苦经历中所期望的行为。编译器会改变。您仍然不应该使用参数的隐式int声明。为了更好地衡量,C语言的最新版本已经完全放弃了对“隐式int”的支持。真的不要再这样做了。
#include <stdio.h>
#include <cs50.h>
#include <math.h>
int main(void)
{
// four kinds of coins as constant variables
const int quarter = 25, dime = 10, nickel = 5;
float change;
unsigned int changeCoin, count, reminder;
do
{
printf ("O hai! How much change is owned?\n");
change = GetFloat();
}
while (change < 0);
// convert input into cents
changeCoin = round (change * 100);
// count the coins
count = changeCoin / quarter;
reminder = changeCoin % quarter;
count += reminder / dime;
reminder %= dime;
count += reminder / nickel;
reminder %= nickel;
count += reminder;
printf ("%d\n", count);
}