在do-while语句中添加整数

时间:2016-03-02 00:24:18

标签: c do-while

我必须写一个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以避免被添加到总和中?

4 个答案:

答案 0 :(得分:2)

您需要在使用前声明ni。检测输入-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");
  }