为什么我的代码在提示用户后没有 return 所需的输出

Why does my code not return the required output after prompting user

我正在制作一个简单的算法,当输入 $ 值时,returns 只使用 25c、10c、5c 和 1c 硬币来找零所需的最少硬币数量。

例如欠款:0.31 硬币:3

请看下面的代码,它会正确提示用户,但在给定输入时会 return 任何数字。

#include <cs50.h>
#include <stdio.h>
#include <math.h>

int main(void)

{
    //Declaring the variables
   float change_owed;
   int quarter, dime, nickel, penny;
    //Defining types of coins that can be given as change.
    quarter = 25;
    dime = 10;
    nickel = 5;
    penny = 1;

    do
    {
    //Defining function and storing in variable change
        change_owed = get_float("Change: ");
    }  
    //Repeat prompt while input is negative  
    while (change_owed <= 0);
    //rounding the numbers so we can divide
    int amount = round(change_owed * 100);

    ///Deciding if to use a Quarter
    //Defining Quarter counter
    int count_quarter=0;
    while (amount >= quarter)
    {   
        //Counting number of quarters used
        count_quarter++;
        //Decreasing amount owed by a quarter
        return amount - quarter;
    }
    //Deciding whether to use a dime
    //Defining dime counter
    int count_dime=0;
    while (amount >= dime)
    {
        //Counting number of dimes used
        count_dime++;
        //Decreasing amount owed by a dime
        return amount - dime;
    }
    int count_nickel=0;
    while (amount >= nickel)
    {
       //Deciding whether to use a nickel
       //counting number of nickels used 
        count_nickel++;
        //Decreasing amount by a nickel
        return amount - nickel;
    }

    //Deciding whether to use a penny
    //Defining penny counter
    int count_penny=0;
    while (amount >= penny)
    {
       //counting number of pennies used
        count_penny++;
      //Decreasing amount by a penny
      return amount - penny; 
    }

  int total_coins = (count_quarter + count_dime + count_nickel + count_penny);

    printf("%i", total_coins);

}

C 语言(或我能想到的任何语言)中的 return 语句 return 是函数的值。意思是在 return 语句之后不再执行该函数的代码,下一条指令将是您的函数之后的下一条指令。如果您从 main return,将调用退出函数,其中包括终止进程并确保进程的 return 值可用。

在 bash 如果你这样做:

./a.out
echo $?

您可以看到您的 C 程序的 return 值。

你想要的是尽可能长时间地添加最大的硬币(贪心算法),然后切换到下一个较小的硬币。

好方法,使用整数并以美分计算所有内容。

#include "stdio.h"

#define NUM_COIN_TYPES 4

int main(void)
{
        int coins[NUM_COIN_TYPES] = {25, 10, 5, 1};
        float change_owed_float = 13.37; //insert your read from commandline code here
        int change_owed = (int)(change_owed_float * 100.f);
        int num_coins = 0;

        for(int ctr = 0; ctr < NUM_COIN_TYPES && change_owed > 0; ++ctr)
        {
                while(change_owed - coins[ctr] >= 0)
                {
                        change_owed -= coins[ctr];
                        ++num_coins;
                }
        }

        printf("Number of coins required: %d\nChange owed: %d\n", num_coins, change_owed);
        return 0; //could be void main and no return
}

会发生怪事的浮动方式:

#include "stdio.h"

#define NUM_COIN_TYPES 4

int main(void)
{
        float coins[NUM_COIN_TYPES] = {.25,.10,.05, .01};
        float change_owed = 13.37; //insert your read from commandline code here
        int num_coins = 0;

        for(int ctr = 0; ctr < NUM_COIN_TYPES && change_owed > 0.0; ++ctr)
        {
                while(change_owed - coins[ctr] >= -.009) //floats are weird
                {
                   change_owed -= coins[ctr];
                   ++num_coins;
                }
        }

        if(change_owed > -.01 && change_owed <= 0.0)
        {
                //sanity check
                printf("It works!\n");
                change_owed = 0;
        }

        printf("Number of coins required: %d\nChange owed: %f\n", num_coins, change_owed);
        return 0; //could be void main and no return
}

编辑:可能是避免浮点运算怪异的最简单方法是在将所有内容乘以 100 后使用整数。

HTH