C 在do while语句中添加整数
我必须写一个do-while循环来读取整数并计算它们的和。它将继续添加整数,直到用户输入-1,但不应将-1添加到总和中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
{
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))如果你指的是我的答案,我并不是建议实际使用goto,我只是替换do{}while()的语法糖;如果你指的是我的答案,我不是建议实际使用goto,我只是替换do{}while()的语法糖;其编译输出用于说明。@AnT同意。我提到while(n>0)
可以替换为while(1)
。现在我认为应该是,而不是可以。。thanks@AnT同意。我提到while(n>0)
可以替换为while(1)