#include <stdio.h>
int main() {
while (height > 0) {
if (throttle >= 0 && throttle <= 100) {
printf("%d %.1f %.1f %.1f ", time, height, velocity, fuel);
scanf("%d", &throttle);
height = heightTemp + velocityTemp - (throttle * K-G) / 2;
velocity = velocityTemp + (throttle * K-G);
fuel = fuelTemp - throttle;
time = time + 1;
heightTemp = height;
velocityTemp = velocity;
fuelTemp = fuel;
}
else {
printf("Please choose a number between 0 and 100! \n");
break;
}
}
if (velocity >= -2.0) {
printf("You landed successfully: ");
}
else {
printf("Failed! You crashed");
}
return 0;
}
我只想在循环没有中断的情况下运行if velocity部分,如果我保持代码这样,它会运行代码,无论发生什么,因为中断显然只是退出循环,我没有写完整的代码。
5条答案
按热度按时间wlsrxk511#
基本上有两种解决方案:
1.使用
break
时设置为1的idBreak
变量,如mikyll98's answer中所示1.使用
goto pastTheIfElse;
代替break;
。如果
pastTheIfElse
标签标记了return
(就像它在代码中所做的那样),那么您可以直接使用return
而不是goto
。goto
解决方案是一个优化编译器应该优化didBreak
版本的东西,所以有些人喜欢它,而另一些人则非常非常强烈地反对它,因为“goto
被认为是有害的”。qlfbtfca2#
将
break;
替换为return 0;
,或者如果您认为无效,则向主机环境输入错误值return -1;
(或其他非零值-它是实现定义的)。如果你想成为超正式的
#include <stdlib.h>
和return EXIT_SUCCESS
或return EXIT_FAILURE
,尽管在真实的代码的例子中很少看到这些宏常量的使用。一些C标准认为函数应该只有一个出口点,但遵守这一点有时会导致代码像早期返回一样扭曲和不可读。
zbq4xfa03#
只要在循环中断时给变量赋值,并添加一个
if
条件来检查该值。deyfvvtc4#
在我看来,解决你所提到的问题的最好方法是用
return 1;
替换break
,这样它就退出了函数,如果你用#include <stdlib.h>
,那么你也可以用return EXIT_FAILURE;
来代替,这样更容易阅读。然而,如果你不想退出函数(例如,因为你想执行函数的其余部分),那么我建议你用明确的
break
语句将循环重构为一个无限循环,这样,你可以在循环中移动if
...else
:但是,我不认为你所说的问题是你的实际问题,当用户输入无效的输入时,你可能不想退出功能(或甚至整个程序)。相反,当输入无效时,重新提示用户输入有效将更有意义。为了确定输入是否无效,你不仅要检查
throttle
是否在所需的范围内,还要检查用户是否在第一个地方输入了整数(即,确保用户没有输入无法转换为整数的内容)。由于this answer of mine to another question中所述的原因,我不建议您使用
scanf
进行基于行的用户输入。为了确定用户输入的整数是否有效,通常最好使用函数fgets
将用户输入的一行内容读取为字符串。然后尝试使用函数strtol
将字符串转换为整数。这两个函数调用可以组合成单个函数,如果用户没有输入有效的整数,它会自动重新提示用户。在我的链接答案中,我创建了一个名为get_int_from_user
的函数。进行上述更改后,您的代码将如下所示:
下面是一个测试程序的完整代码:
由于你发布的物理计算没有编译,我已经添加了我自己的(简单)物理计算。
此程序具有以下输出:
gcxthw6b5#
提示重新输入数据,然后退出处理,去别的地方,这是没有意义的......
修改while循环并在输入时测试用户输入。
可能是“哨兵值”(例如:999)可以用来中止循环...