C中的指针未按预期工作
我正在努力研究哈佛大学的CS50习题集,我发现自己陷入了一个非常基本的贪婪问题:如果硬币的面额只有25c、10c、5c和1c,那么为给定的零钱找到最少数量的硬币。虽然这个问题并不真正需要指针,而且即使有一个单独的函数也可能有点过分,但我试图通过在这里实现它来更好地理解指针,然而,出于某种原因,我没有得到“coins”所需的输出。函数调用前后的printf语句用于调试目的。代码后面给出了一个示例输出 代码如下:C中的指针未按预期工作,c,cs50,C,Cs50,我正在努力研究哈佛大学的CS50习题集,我发现自己陷入了一个非常基本的贪婪问题:如果硬币的面额只有25c、10c、5c和1c,那么为给定的零钱找到最少数量的硬币。虽然这个问题并不真正需要指针,而且即使有一个单独的函数也可能有点过分,但我试图通过在这里实现它来更好地理解指针,然而,出于某种原因,我没有得到“coins”所需的输出。函数调用前后的printf语句用于调试目的。代码后面给出了一个示例输出 代码如下: #include <stdio.h> #include <cs50.
#include <stdio.h>
#include <cs50.h>
void denomination(float* change, int* coins, int den);
int main(void){
float change;
do{
printf("How much change is owed?\n");
change = GetFloat();
}while(change < 0);
int coins; //number of coins in total to be given in change
if(change == 0){
coins = 0;
printf("%d\n", coins);
}else{
change = change * 100; //converting to cents
denomination(&change, &coins, 25);
printf("Inside else:: Change: %f, Coins: %d\n", change, coins);
denomination(&change, &coins, 10);
printf("Inside else:: Change: %f, Coins: %d\n", change, coins);
denomination(&change, &coins, 5);
printf("Inside else:: Change: %f, Coins: %d\n", change, coins);
denomination(&change, &coins, 1);
printf("Inside else:: Change: %f, Coins: %d\n", change, coins);
printf("%d\n", coins);
}
return 0;
}
void denomination(float* change, int* coins, int den){
int tmp;
tmp = (*change/den);
printf("Temp: %d\n", tmp);
*coins = *coins + tmp;
*change = *change - (tmp*den);
}
我不明白为什么“改变”能如愿以偿,但“硬币”却不能 while循环必须保留非零值
change
(当到达else
分支时),但是coins
仅在上面的分支中初始化。总之,行为是未定义的。首先删除while循环In函数
void denomination(float* change, int* coins, int den)
{
int tmp;
tmp = (*change/den);
printf("Temp: %d\n", tmp);
*coins = *coins + tmp;
*change = *change - (tmp*den);
}
*change=(*change-(tmp*den));
因为你已经在分钱了,所以一次只能得到硬币的总数
所以首先不需要循环
然后,除了只移除一个巢穴之外,你还必须移除总金额,这将是所给tmp硬币的倍数
因此,更正了函数中的以下语句
void denomination(float* change, int* coins, int den)
{
int tmp;
tmp = (*change/den);
printf("Temp: %d\n", tmp);
*coins = *coins + tmp;
*change = *change - (tmp*den);
}
*change=(*change-(tmp*den));
第二件事是初始化coins变量
因为我认为这有点垃圾价值
所以在main中用零初始化它
int Coins=0;
我看不到硬币被初始化的地方,它的新值总是依赖于以前的值,这可能是个问题,在我看来这不是一个指针问题,硬币的初始值是多少?我注意到change=GetFloat()
包含两个分号,我知道这不是问题,完全可以接受,但可能不是为了可读性。在else子句中,在开始使用之前,将coins初始化为0。FWIW,我会使第一个参数change
为int,因为您无论如何都在计算整数值(美分)。这避免了使用浮点时可能遇到的一些问题。为什么要删除函数中的while循环?如果传入的零钱是52美分,而巢穴是25美分,那么它必须循环两次才能得到2枚25美分面值的硬币。啊,我明白了。知道了。谢谢您通过使用语句“tmp=(*change/den);”获得硬币总数,这是一个完美的语句,因此不需要使用循环。请删除循环并按照我指定的方式更正代码。请把你们的回复放在评论中,你们是否删除了循环?因为它也会帮助其他人。我删除了循环,并做了您建议的其他更改。程序现在可以运行了。谢谢