为什么我的代码在提示用户后没有 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
我正在制作一个简单的算法,当输入 $ 值时,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