gpt4 book ai didi

c - 为什么我在 "for"循环中收到错误,提示 'break' 语句不在循环或 switch 中?

转载 作者:行者123 更新时间:2023-11-30 16:51:30 25 4
gpt4 key购买 nike

对编程非常陌生,我在第 12 行收到错误,指出我的break语句不在循环或开关中。谁能解释一下我的错误在哪里以及如何修复它?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
int n1, n2, i, gcd, lcm;

printf("Enter two positive integers: ");
scanf("%d %d",&n1,&n2);

for(i=1; i <= n1 && i <= n2; ++i) {
printf("Enter two positive integers: ");
scanf("%d %d",&n1,&n2);
if(n1==-1,n2==-1) break;
// Checks if i is factor of both integers
if(n1%i==0 && n2%i==0)
gcd = i;
}

lcm = (n1*n2)/gcd;
printf("The LCM of two numbers %d and %d is %d.", n1, n2, lcm);

return 0;
}

最佳答案

如果您“在第 12 行收到错误,指出我的 break 语句不在循环或 switch 中”,那么要么您的编译器有缺陷,要么您发布了错误的代码。该代码存在一些问题,但错误位置的中断并不是其中之一。

当您放错了一些大括号时,通常会出现该特定错误消息,大致如下:

int i;
for (i = 0; i < 10; ++i)
printf("%d\n", i);
if (someCondition)
break;

这是因为,尽管事实上看起来就像你正在跳出循环,但实际的break语句并不内环形。只有 printf 是。

就您提供的代码而言,有多种清理方法:

  • 删除不需要的包含内容。
  • 重构通用函数的数字输入。
  • 允许单个非正数终止程序。
  • 使用DRY原则进行输入,如果结构正确,确实不需要重复代码段。
  • 使输入更加稳健,允许出现无效数字。
  • 添加更多注释,这些将对您(或其他必须维护您的代码的人)将来提供很大帮助。
  • 使用更好的变量名称。除了用于小型局部循环的 i 之外,我几乎从不使用单字符变量名。
  • 修复 if(n1==-1,n2==-1) 位。这并不像你想象的那样。逗号运算符将评估两个表达式,但完整表达式的结果是最右边的结果。所以它实际上是if(n2==-1)

为此,以下是我将如何编写代码:

#include <stdio.h>

#define ERR_NON_POS -1
#define ERR_INVALID -2

// Gets a single number.
// If non-positive or invalid, returns error (a negative value ERR_*).
// Otherwise, returns the (positive) number.

int getNumber(void) {
int number;
if (scanf("%d", &number) != 1) return -2;
if (number <= 0) return -1;
return number;
}

int main(void) {
// Infinite loop, we'll break from within as needed.

for (;;) {
printf("Enter two positive integers (a negative number will stop): ");

// Do it one at a time so a SINGLE negative number can stop.

int number1 = getNumber();
if (number1 == ERR_INVALID) {
puts("** Non-integral value entered");
break;
}
if (number1 == ERR_NON_POS) break;

int number2 = getNumber();
if (number2 == ERR_INVALID) {
puts("** Non-integral value entered");
break;
}
if (number2 == ERR_NON_POS) break;

// Work out greatest common divisor (though there are better ways
// to do this than checking EVERY possibility).

int gcd = 1;
for (int i = 2; (i <= number1) && (i <= number2); ++i) {
if (number1 % i == 0 && number2 % i == 0) {
gcd = i;
}
}

// Work out the lowest common multiple.

int lcm = number1 * number2 / gcd;

// Print them both and go get more.

printf("For numbers %d and %d, GCD is %d and LCM is %d.\n", number1, number2, gcd, lcm);
}

return 0;
}
<小时/>

而且,如果您想知道计算 GCD 的更有效方法,您应该研究欧几里得算法。这可以定义为(对于非负 ab):

gcd(a,b) = a               if b is zero
gcd(b, a mod b) if b is non-zero

这意味着你可以有一个递归函数:

int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}

如果您强烈反对递归,则可以选择迭代:

int gcd(int a, int b) {
while (b != 0) {
int t = a % b;
a = b;
b = t;
}
return a;
}

关于c - 为什么我在 "for"循环中收到错误,提示 'break' 语句不在循环或 switch 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41749817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com