我的代码有什么问题(CS50 2012 Pset 1)

我的代码有什么问题(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_

我试图制作一个程序,提供最少的硬币兑换,但如果我提供的数字不是分成四分之一的数字,它将失败得很惨。例如,如果我输入1.25,我会得到5个25美分硬币,但是如果我输入1.26,我会得到5个25美分硬币,这当然是不正确的。我做错了什么

#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);         
}