我必须写一个do while循环来读取整数并计算它们的总和。它继续添加整数,直到用户输入-1,但不应将-1添加到总和中。
do
{
printf("Enter a number. Enter -1 to stop\n");
scanf(" %d", &n);
sum = sum + n;
printf("The sum is %d\n", sum);
}
while (n >= 0);
{
return 0;
printf("Have a nice day!\n");
}
我哪里错了?如何获得-1以避免被添加到总和中?
答案 0 :(得分:2)
您需要在使用前声明n
,i
。检测输入-1时需要break
。
int sum = 0, n = 0;
do
{
printf("Enter a number. Enter -1 to stop\n");
scanf("%d", &n);
if( -1 == n )
break; // <-- break here to get out the loop
sum = sum + n;
printf("The sum is %d\n", sum);
} while (1); // <-- note while(1) should be used instead of while(n >= 0), this makes sure your loop only exits when detecting input -1
在printf
之后添加return
也毫无意义 - 即可以删除此代码:
{
return 0;
printf("Have a nice day!\n"); // <-- any code after `return` is meaningless
}
答案 1 :(得分:1)
有两种方法可以避免将-1添加到总和中。让我们先看看你的代码:
do
{
printf("Enter a number. Enter -1 to stop\n");
scanf(" %d", &n);
sum = sum + n;
printf("The sum is %d\n", sum);
}
while (n >= 0);
如果n小于零,则do / while循环将退出。这是捕获-1作为标记值的一种方法,所以没有问题。
不幸的是,您的代码读取数字,将其添加到总数中,然后检查它是否应该停止。使用该订单,您始终在检查前添加。
避免添加号码最明显,最蛮力的方法是添加一个明确的检查:
do {
printf ... scanf ... ;
if (n != -1)
sum = sum + n;
} while (n >= 0);
另一种方法是作弊。鉴于-1始终位于列表的末尾,只需在结尾处撤消:
do {
printf... scanf...;
sum = sum + n;
} while (n >= 0);
sum = sum - n; // CHEAT - just subtract out the last number
printf("The sum is %d\n", sum);
最后,你可以使用一个技巧。有时在这些情况下,你可以“转移”#34;循环,这样你实际上做的事情有点乱。在这种情况下,您希望在添加之前进行测试。所以把add放在循环的顶部,然后设置一下,这样第一次添加就是无害的:
n = 0; // X + 0 is X, so adding 0 is harmless.
do {
sum = sum + n;
printf ... scanf ...;
} while (n >= 0);
这可能会让你感到不舒服一分钟,但这是一个你会看到很多的成语。循环代码已被&#34;扭曲&#34;在循环内部,使自然的顶部&#34;循环不会从实际循环体的顶部开始。这是一个很好的诀窍。
答案 2 :(得分:0)
如果你根据编译器认为的GOTO来考虑你的do-while循环的行为会更清楚:
// prior code before here...
START_OF_DO:
printf("Enter a number. Enter -1 to stop\n");
scanf(" %d", &n);
sum = sum + n;
printf("The sum is %d\n", sum);
if ( n >= 0 ) {
goto START_OF_DO; // this is what "while (n >= 0);" does
}
return 0;
printf("Have a nice day!\n"); // <-- note that this will never print, because you have already returned
以这种方式形成,您可以在检查sum = sum + n
之前看到if ( n >= 0)
已发生。
(注意我并不是说你曾经使用过goto!但有时候根据编译器发出的机器指令来看这些东西是有帮助的。)
答案 3 :(得分:-1)
在检查条件再次运行循环之前,您将覆盖n的值。
进行这些更改,现在应该可以正常使用。
int input = 0; // Change
int n = 0; // Change
do
{
printf("Enter a number. Enter -1 to stop\n");
scanf(" %d", &input); // Change
if(input >=0 ) // Change
{
n = input; // Change
sum = sum + n;
printf("The sum is %d\n", sum);
}
}
while (input != -1); // Change
{
return 0;
printf("Have a nice day!\n");
}