2016-06-27 22 views
0

Ich arbeite an einer Aufgabe, bei der ich eine Primzahl faktorisieren soll. Hier ist die Lösung, die ich gekommen bin oben mit:Keine Unterbrechung in der verschachtelten Schleife?

import java.util.Scanner; 

public class Task8 { 

    public static void main(String[] args) { 

     Scanner input = new Scanner(System.in); 

     System.out.print("Which number to factorize:"); 

     int number = input.nextInt(); 

     System.out.println(); 

     int counter = 1; 

     for (int i = 2; i <= number; i++) { 
      while (number % i == 0) { 

       if (counter == 1 && i == number) { 
        System.out.println("The number is a prime, can’t be factorized."); 
        break; 
       } else { 

        System.out.println("Prime" + " " + "#" + counter + ":" + " " + i); 
        number = number/i; 
        ++counter; 
       } 
      } 
     } 
    } 
} 

jedoch ein Buch ich zur Zeit des Studiums, stark Ratschläge gegen die Verwendung von break-Anweisungen in Schleifen. Wie also würde ich in diesem Fall auf einen verzichten?

Prost!

+2

Gibt dieses Buch Gründe? – Blorgbeard

+1

Sie können die Schleife in eine Methode ziehen und stattdessen 'return' verwenden. Aber natürlich mögen manche Leute das auch nicht (mehrfache Rückkehrpunkte aus einer Methode). Es ist eine Stilfrage. Sie müssen selbst entscheiden, was zu tun ist. – Blorgbeard

+1

Sie könnten ein boolesches Flag außerhalb der while-Schleife hinzufügen, es in die 'while'-Prüfung einbeziehen und es innerhalb der Schleife basierend auf der 'if'-Anweisung setzen. –

Antwort

0

Eine mögliche Lösung ist eine Rückkehr anstelle der Pause zu tun. Aber das wird von der ganzen Funktionsausführung zurückkehren, was nicht das gewünschte Ergebnis sein kann. Darüber hinaus ist eine break-Anweisung nicht unbedingt schlecht zu verwenden. Bitte beziehen Sie sich auf this.

2

Hier ist eine Methode, es zu tun. Ich machte Kommentare zu meinen Änderungen:

import java.util.Scanner; 

public class Task8 { 

    public static void main(String[] args) { 

     Scanner input = new Scanner(System.in); 

     System.out.print("Which number to factorize:"); 

     int number = input.nextInt(); 

     System.out.println(); 

     int counter = 1; 

     for (int i = 2; i <= number; i++) { 
      boolean canBeFactored = true; // Add a flag 
      while (canBeFactored && number % i == 0) { // Add a check 
       if (counter == 1 && i == number) { 
        System.out.println("The number is a prime, can’t be factorized."); 
        canBeFactored = false; // Set that check to false 
       } else { 

        System.out.println("Prime" + " " + "#" + counter + ":" + " " + i); 
        number = number/i; 
        ++counter; 
       } 
      } 
     } 
    } 
} 
0

Ich sehe nichts falsch mit der Verwendung von "Pause" in diesem Fall. Obwohl, wenn Sie würde es stark nicht verwenden möchten, können Sie alles, was Sie haben in Haupt in ein neues Unterprogramm machen, und verwenden Sie „Return“, wie folgt aus:

import java.util.Scanner; 

public class Task8 { 

    public static void main(String[] args) { 

     function(); 

    } 

    public static void function() { 

     Scanner input = new Scanner(System.in); 

     System.out.print("Which number to factorize:"); 

     int number = input.nextInt(); 

     System.out.println(); 

     int counter = 1; 

     for (int i = 2; i <= number; i++) { 
      while (number % i == 0) { 

       if (counter == 1 && i == number) { 
        System.out.println("The number is a prime, can’t be factorized."); 
        return; 
       } else { 

        System.out.println("Prime" + " " + "#" + counter + ":" + " " + i); 
        number = number/i; 
        ++counter; 
       } 
      } 
     } 
     return; 
    } 
} 
+0

IMO das ist viel schwieriger zu folgen als die ursprüngliche "Pause" an Ort und Stelle zu verlassen. –

0

Das Buch wahrscheinlich bedeutet, dass die übermäßige Einsatz von break (und continue, return auch) machen den Code unlesbar.

z. Statt

for (int i = 0; i < N; i++) { 
    if (b) 
    break; 
    ... 
} 

könnten Sie

for (int i = 0; i < N && !b; i++) { ... } 

Am Ende schreiben ich denke, es ist nur eine Frage von Stil und was Sie mit dem Code zum Ausdruck bringen wollen.

Sie können auch äußere Schleifen durchbrechen, indem sie die Kennzeichnung:

outer: 
for (;;) { 
    for(;;) { 
    if (<some_special_case>) 
     break outer; // execution... 
    } 
} 
// ...continues here 

Welche ziemlich hässlich je nach Szenario ohne break (zusätzliches Flag gesetzt werden, bevor sie reißen und geprüft in allen äußeren Schleifen) werden kann. Die Quintessenz ist, es gibt gültige Anwendungsfälle für break, wo es (meiner Meinung nach) den saubersten und schnellsten Weg (um den Code zu schreiben) getan wird.