2016-04-08 77 views
1

如何突破沒有休息聲明的循環?我的教授哈特斯斷言並告訴我們不要使用它。我只是好奇,如果我得到的數字不是素數,我將如何擺脫while循環?突破一個沒有休息聲明的循環[C]

這裏是我的代碼:

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

/* Prototypes */ 
void primeChecker(int num1); 

int main() { 
    int num1 = 5; 

    primeChecker(num1); 

    return 0; 
} 

void primeChecker(int num1) { 
    int i, flag = 0; 

    printf("Enter a number to check for prime numbers: "); 
    scanf("%d", &num1); 

    /* Number to start with */ 
    i = 2; 

    while (i <= num1/2) { 
     if (num1 % i == 0) { 
      flag = 1; 
     } else { 
      i++; 
     } 
    } 

    if (flag == 0) { 
     printf("The number is a prime number!"); 
    } else { 
     printf("The number is NOT a prime number!"); 
    } 
} 
+3

「break」聲明究竟是什麼錯誤?不得不不同意那個人的教授。我使用它們,並在較低的程度上「繼續」陳述......有人可以告訴我爲什麼我現在是白癡嗎? – yano

+3

對於簡單的循環(比如你的),你可以通過某種方式改變條件。但是你也應該知道,除非教師*強迫你不使用'break'或'continue',那麼你可以自由地使用這些語句,它們確實存在是有原因的,並且在有意義時不使用它們是愚蠢的。編碼風格是一件非常私人的事情,除非你有一個特定的指導方針,你必須遵循那麼你可以並且應該使用(和開發)你自己的風格,你喜歡的東西。哎呀,我已經編程了30年,我的風格還在不斷髮展(儘管現在很慢)。 :) –

+1

如果老師只是因爲使用了他或她不喜歡的風格而給了你低分,那麼他或她就是個傻瓜,需要向他或她的上級報告。個人不同意不應該用於評分。當然,如果老師把它作爲不使用某些具體陳述的任務的一部分,那麼這是另一回事。 –

回答

1

你可以做

while (i <= num1/2) { 
    if (num1 % i == 0) { 
     i = num1; 
    } else { 
     i++; 
    } 
} 

這使得較大i然後num1/2while退出循環。

您可能需要做一些更改才能完成此項工作。

+0

對於返回類型爲「void」的函數,'return EXIT_SUCCESS'不起作用。 –

+0

@CoolGuy,沒有注意到。謝謝 – Haris

2

或者

int prime = 1; 
while (i <= num1/2 && prime) { 
    if (num1 % i == 0){ 
     prime = 0; 
    } else { 
     i++; 
    } 
} 

if(prime){ 
    printf("The number is a prime number!"); 
}else{ 
    printf("The number is not prime."); 
} 

我的意思是,你幾乎擁有了:

while (i <= num1/2 && !flag){ 

會做的伎倆以及

+1

你應該使用一個布爾值而不是一個int來表示素數或標誌,但是int也可以工作,而且我不像以前那麼流暢。我喜歡這個代碼來講述故事 -​​ 不需要那麼多評論。我也不喜歡break語句,但同意你應該能夠在有意義的地方使用它們的意見。我相信你是教授,就像你想到不同的方式來完成同樣的任務。這很好玩。 – BLE

1

在你的情況,你可以使用作爲flag值條件:

while (flag == 0 && i <= num1/2) { 
    if (num1 % i == 0) { 
     flag = 1; 
    } else { 
     i++; 
    } 
} 

但是,看起來像帕斯卡爾而不是C.一個更好的解決方案可能是重構循環,使其在一個單獨的功能:

int is_prime(int num1) 
{ 
    int i = 2; 

    while (i <= num1/2) { 
     if (num1 % i == 0) return 0; 
     i++; 
    } 

    return 1; 
} 

這使得代碼更簡單,並從在primeChecker分離輸入的東西實際的主要檢查。