C中的指针无法正常工作

时间:2014-09-17 06:23:52

标签: c cs50

我正在努力解决哈佛的CS50问题集,并且我发现自己陷入了一个非常基本的贪婪问题,即如果硬币仅以25c,10c,5c的面额提供,则可以找到给定更改的最少数量的硬币。 1C。虽然指针不是真的需要这个问题,甚至有一个单独的功能可能是一个过度杀伤,我试图通过在这里实现它来更好地理解指针,但是,我没有得到'硬币'的所需输出由于某些原因。函数调用之前和之后的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);
}

这是输出:

How much change is owed?
0.41
Temp: 1
Inside else:: Change: 16.000000, Coins: 134516108
Temp: 1
Inside else:: Change: 6.000000, Coins: 134516109
Temp: 1
Inside else:: Change: 1.000000, Coins: 134516110
Temp: 1
Inside else:: Change: 0.000000, Coins: 134516111
134516111

我不明白为什么'改变'按预期工作,但'硬币'没有。

3 个答案:

答案 0 :(得分:1)

while循环必须保留非零值change(当达到else分支时),但coins仅在{{1}中初始化上面的分支。总的来说,行为是不确定的。

答案 1 :(得分:1)

首先删除函数中的while循环。

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

因为你已经分开所以只能在一次获得硬币总数。

首先,不需要循环。

然后你不得不只删除一个书房,而是要删除总金额,这将是tmp硬币的倍数。

所以纠正了函数中的以下语句。

*change=(*change-(tmp*den));

第二件事初始化硬币变量。

因为我认为这有点垃圾价值。

所以在main中用零初始化它。

int Coins=0;

答案 2 :(得分:1)

我没有看到硬币被初始化的任何地方,它的新值总是依赖于之前的值,这可能是它看起来像它不是指针问题的问题