2017-01-19 72 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; 
} 
相關問題