C 在do while语句中添加整数

C 在do while语句中添加整数,c,do-while,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("Hav

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

使用前需要声明
n
I
。当检测输入-1时,您需要一个
中断

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

使用前需要声明
n
i
。当检测输入-1时,您需要一个
中断

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

在n检查再次运行循环的条件之前,您正在覆盖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");
  }

在n检查再次运行循环的条件之前,您正在覆盖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");
  }

如果从编译器将其视为的GOTOs的角度来考虑,则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 
//前面的代码。。。
开始执行以下操作:
printf(“输入一个数字。输入-1停止\n”);
scanf(“%d”和“&n”);
sum=sum+n;
printf(“总和为%d\n”,总和);
如果(n>=0){
转到开始;//这就是“while(n>=0);”所做的
} 
返回0;
printf(“祝您愉快!\n”);//=0)


(请注意,我并不是建议您使用goto!但有时候,从编译器发出的机器指令的角度来看待这些事情是很有帮助的。)

如果您从编译器所看到的goto的角度来看待do while循环,那么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 
//前面的代码。。。
开始执行以下操作:
printf(“输入一个数字。输入-1停止\n”);
scanf(“%d”和“&n”);
sum=sum+n;
printf(“总和为%d\n”,总和);
如果(n>=0){
转到开始;//这就是“while(n>=0);”所做的
} 
返回0;
printf(“祝您愉快!\n”);//=0)


(请注意,我并不是建议您使用goto!但有时,从编译器发出的机器指令的角度来看这些东西会很有帮助。)

有几种方法可以避免将-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总是出现在列表的末尾,只需撤销列表末尾的-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);
最后,你可以使用一个技巧。有时在这些情况下,您可以“移动”循环,这样您实际上会稍微有点乱。在本例中,您希望在添加之前进行测试。因此,将add放在循环的顶部,并进行设置,以便第一次add是无害的:

n = 0; // X + 0 is X, so adding 0 is harmless.
do {
    sum = sum + n;
    printf ... scanf ...;
} while (n >= 0);

这可能会让你感到不舒服,但这是一个你会经常看到的习惯用语。循环代码在循环内部被“扭曲”,因此“自然”循环的顶部不会从实际循环体的顶部开始。这是一个很好的技巧。

有几种方法可以避免将-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总是出现在列表的末尾,只需撤销列表末尾的-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);
最后,你可以使用一个技巧。有时在这些情况下,您可以“移动”循环,这样您实际上会稍微有点乱。在本例中,您希望在添加之前进行测试。因此,将add放在循环的顶部,并进行设置,以便第一次add是无害的:

n = 0; // X + 0 is X, so adding 0 is harmless.
do {
    sum = sum + n;
    printf ... scanf ...;
} while (n >= 0);

这可能会让你感到不舒服,但这是一个你会经常看到的习惯用语。循环代码在循环内部被“扭曲”,因此“自然”循环的顶部不会从实际循环体的顶部开始。这是一个很好的技巧。

如果你不想添加
-1
,你就不必添加它。问题是什么?您格式化程序的方式使底部大括号中的代码似乎与while循环关联。事实并非如此。另外,请注意,返回0后出现的printf;将永远不会执行。请将其全部打包在丑陋的
状态下<代码>执行{printf(“输入一个数字。输入-1停止\n”);}而(scanf(“%d”,&n)==1&&n>=0&&printf(“总和是%d\n”,总和+=n))
如果不想添加
-1
,则不必添加它。问题是什么?您格式化程序的方式使底部大括号中的代码似乎与while循环关联。事实并非如此。另外,请注意,返回0后出现的printf;将永远不会执行。请将其全部打包在丑陋的
状态下<代码>执行{printf(“输入一个数字。输入-1停止\n”);}而(scanf(“%d”,&n)==1&&n>=0&&printf(“总和是%d\n”,总和+=n))while(n>0)
可以替换为
while(1)
。现在我认为应该是,而不是可以。。thanks@AnT同意。我提到
while(n>0)
可以替换为
while(1)