C中的指针未按预期工作

C中的指针未按预期工作,c,cs50,C,Cs50,我正在努力研究哈佛大学的CS50习题集,我发现自己陷入了一个非常基本的贪婪问题:如果硬币的面额只有25c、10c、5c和1c,那么为给定的零钱找到最少数量的硬币。虽然这个问题并不真正需要指针,而且即使有一个单独的函数也可能有点过分,但我试图通过在这里实现它来更好地理解指针,然而,出于某种原因,我没有得到“coins”所需的输出。函数调用前后的printf语句用于调试目的。代码后面给出了一个示例输出 代码如下: #include <stdio.h> #include <cs50.

我正在努力研究哈佛大学的CS50习题集,我发现自己陷入了一个非常基本的贪婪问题:如果硬币的面额只有25c、10c、5c和1c,那么为给定的零钱找到最少数量的硬币。虽然这个问题并不真正需要指针,而且即使有一个单独的函数也可能有点过分,但我试图通过在这里实现它来更好地理解指针,然而,出于某种原因,我没有得到“coins”所需的输出。函数调用前后的printf语句用于调试目的。代码后面给出了一个示例输出

代码如下:

#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);”获得硬币总数,这是一个完美的语句,因此不需要使用循环。请删除循环并按照我指定的方式更正代码。请把你们的回复放在评论中,你们是否删除了循环?因为它也会帮助其他人。我删除了循环,并做了您建议的其他更改。程序现在可以运行了。谢谢