2017-01-19 54 views
0

难以置信的新编程我收到第12行的错误,指出我的break语句不在循环或开关中。任何人都可以解释我的错误在哪里以及如何解决它?为什么我在我的“for”循环中收到错误,说'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; 
} 
+6

'if(n1 == - 1,n2 == - 1)'您能解释一下吗? – DeiDei

+4

如果你是新手,Stack Overflow可能不适合你。有许多免费的教程资源,你应该花一些时间。一旦你掌握了基本知识,你可能会发现这个网站对于具体的,经过深入研究的问题很有用。 –

+3

break语句在第15行(不是12) - 您确定我们正在查看与您相同的代码吗? –

回答

0

如果您在“第12行收到错误,指出我的break语句不在循环或开关”那么无论你有一个非常缺乏的编译器或你贴错代码。该代码有几个的问题,但在错误的地方break不是其中之一。

也就是说,当你遗失了一些支撑,沿着线经常发生特定的错误信息:

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; 
} 
相关问题