#include <stdio.h>
#include <cs50.h>
int GetPositiveInt();
int main (void)
{
int min; /*variable to hold minutes*/
printf ("How many minutes does it take you to use a shower?");
scanf ("%d", &min);
int numbtl = min * 12; /*computes number of bottles*/
if (min > 0)
{
printf ("Taking a shower you use %d bottles of water", numbtl);
}
else
{
printf ("Please enter the positive number: \n");
scanf ("%d", &min);}
return min;
}
}
我写过这个程序,但我在其他地方有一些错误。 这是我试图执行该程序的文本。
~/workspace/pset1/ $ make water
clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wshadow water.c -lcs50 -lm -o water
~/workspace/pset1/ $ ./water
How many minutes does it take you to use a shower?0
Please enter the positive number:
10
~/workspace/pset1/ $
让我说明这个代码及其执行的含义。此代码用于计算淋浴时使用的瓶装水量。 1分钟的淋浴等于12瓶。
如果输入正整数(例如10),结果将如下所示:洗澡时使用120瓶水。但是如果输入0或负整数,程序将要求您输入正整数。这是问题发生的时候。输入正整数后,我得到0瓶的结果。
答案 0 :(得分:1)
让我们分解您的计划,看看它在做什么;第一
int GetPositiveInt();
对于从未使用或定义的函数是forward declaration,您可以完全删除它。
int main (void)
{
int min; /*variable to hold minutes*/
printf ("How many minutes does it take you to use a shower?");
scanf ("%d", &min);
这里我们定义main函数(c程序的入口点)并声明一个名为int
的{{1}}类型的变量。然后打印出一行询问用户输入并读取他们的响应,将其存储在min
变量中。
min
在此处理 int numbtl = min * 12; /*computes number of bottles*/
,将其乘以12并将结果存储在min
中。
numbtl
在此检查 if (min > 0)
{
printf ("Taking a shower you use %d bottles of water", numbtl);
}
是否有效,如果是,则打印回复。在这里你可以看到你的程序的成功路径是正确的,问题是当min
不大于0时会发生什么。(注意在下一位中有一个小的格式化错误,我通过我的假设更正了意味着 - 请注意,这就是正确的缩进和格式化很重要的原因。)
min
如果 else
{
printf ("Please enter the positive number: \n");
scanf ("%d", &min);
}
无效(即小于或等于0),那么您要求另一个输入并将其存储在min
。
min
最后,你返回以min为单位存储的内容。请注意,除了返回它之外,你永远不会对第二个值做任何事情。
附注:main上的返回值用作应用程序的退出状态。您可以使用 return min;
}
在bash中查看最后一个命令的退出状态。
echo $?
这可能不是你想要的。退出状态通常为0表示成功,否则为正数。最后一次返回,您可能希望$ ./water
How many minutes does it take you to use a shower?
2
Taking a shower you use 24 bottles of water
$ echo $?
2
表示您的程序已成功运行。
现在对于程序的逻辑,你想要做的是从用户那里获得一些输入;验证它(如果无效则获得新的输入);然后处理它。因此,首先要做的是将处理移至程序的最后
return 0
现在我们只需要获取并验证用户输入;这样做的典型算法是:
int main (void)
{
int min; /*variable to hold minutes*/
...
int numbtl = min * 12; /*computes number of bottles*/
printf ("Taking a shower you use %d bottles of water", numbtl);
return 0;
}
将此转换为c您的应用程序最终会以;
prompt for user input
while (input is not valid) {
reprompt for user input
}
process user input
这将继续向用户询问正数,直到他们输入一个或点击 crtl + c 来终止命令。一旦获得有效数字,它将处理它并打印出结果。
答案 1 :(得分:0)
#include <stdio.h>
#include <string.h>
int main (void)
{
long min;
char msg[255];
strcpy(msg,"How many minutes does it take you to use a shower?\n");
do {
printf ("%s", msg);
scanf ("%lu", &min);
strcpy(msg , "Please enter the positive number: \n");
}while( min <= 0 );
long numbtl = min * 12; /*computes number of bottles*/
printf ("Taking a shower you use %lu bottles of water", numbtl);
return 0;
}
答案 2 :(得分:0)
您还可以使用转到标签。在这里,我使用了一个名为start的goto标签。如果输入的数字小于零,则程序进入程序的开头。希望能帮助到你。
#include<stdio.h>
int main (void)
{
int min; /*variable to hold minutes*/
start :
printf ("How many minutes does it take you to use a shower?\nEnter here : ");
scanf ("%d", &min);
if (min <= 0)
{
printf("Enter a number grater than zero\n\n");
goto start;
}
int numbtl = min * 12; /*computes number of bottles*/
printf ("Taking a shower you use %d bottles of water", numbtl);
return 0;
}