2016-04-08 11 views
1

Wie brechen Sie aus einer Schleife ohne eine Break-Anweisung? Mein Professor HATES bricht Aussagen und sagt uns, wir sollten es nicht benutzen. Ich bin nur neugierig, wie würde ich aus der While-Schleife ausbrechen, wenn die Nummer, die ich bekam, keine Primzahl war?Breakout einer Schleife ohne Pause-Anweisung [C]

Hier ist mein Code:

#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

was zur Hölle ist falsch mit einer 'Break' Aussage? Ich muss dem Professor nicht zustimmen. Ich benutze sie und in einem geringeren Maße "Fortsetzung" Aussagen die ganze Zeit ... kann mir jemand sagen, warum ich jetzt der Idiot bin? – yano

+3

Für einfache Schleifen (wie Ihre) können Sie den Zustand ändern. Aber du solltest auch wissen, dass es dir freisteht, diese Aussagen zu verwenden, es sei denn, der Lehrer * zwingt dich dazu, 'break' oder' continue' nicht zu verwenden, sie existieren aus einem bestimmten Grund und sie nicht zu verwenden, wenn es Sinn ergibt, ist dumm. Kodierungsstil ist eine sehr persönliche Sache, und wenn Sie nicht eine bestimmte Richtlinie haben, der Sie * folgen müssen, dann können und sollten Sie Ihren eigenen Stil verwenden und entwickeln, etwas, mit dem Sie vertraut sind. Ich programmiere seit 30 Jahren und mein Stil entwickelt sich immer noch weiter (wenn auch langsam in diesen Tagen). :) –

+1

Und wenn der Lehrer Ihnen niedrigere Noten gibt, nur weil Sie einen Stil verwenden, den er oder sie nicht mag, dann ist er oder sie ein Idiot und muss seinen Vorgesetzten gemeldet werden. Persönliche Meinungsverschiedenheiten sollten niemals für die Einstufung verwendet werden. Natürlich, wenn der Lehrer es zu einem Teil der Aufgabe macht, bestimmte Aussagen nicht zu verwenden, dann ist das etwas anderes. –

Antwort

1

Sie tun können

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

Dies macht i größer als num1/2 und die while Schleife beendet.

Sie benötigen wahrscheinlich noch einige Änderungen, damit dies funktioniert.

+0

'return EXIT_SUCCESS' funktioniert nicht für eine Funktion mit dem Rückgabetyp' void'. –

+0

@CoolGuy, nicht bemerkt. Danke – Haris

2

Oder

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."); 
} 

Ich meine, man hatte es fast:

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

würde den Trick

auch getan haben
+1

Und Sie sollten wahrscheinlich einen Booleschen anstelle eines Int für Prime oder Flag verwenden, aber Int funktioniert genauso gut, und ich bin nicht so fließend in C wie ich einmal war. Ich mag den Code, um die Geschichte zu erzählen - weniger Kommentare auf diese Weise. Ich mag auch keine Breakaussagen, aber stimme den Kommentaren zu, dass du sie dort verwenden kannst, wo sie Sinn machen. Ich bin mir sicher, dass Sie Professor sind, würden Sie gerne über verschiedene Wege nachdenken, die gleiche Aufgabe zu erledigen. Es macht alles Spaß. – BLE

1

In Ihrem Fall können Sie den Wert von flag verwenden als Zustand:

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

Aber das sieht aus wie Pascal anstatt C. Eine bessere Lösung könnte die Schleife Refactoring, so dass es in einer separaten Funktion ist:

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

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

    return 1; 
} 

Dies macht den Code einfacher und trennt die Eingang Sachen in primeChecker aus dem tatsächliche Hauptprüfung.