Methoden Unerwünschte Ausgabe bei System.out.print in For-Schleife

paulen1

Mitglied
Moin,

Das ist meine erste Frage als relativ neuer Student, deshalb etwas Verständnis bitte 😉.

Ich habe die Aufgabe alle echten Teiler von einer vom User übergebenen Zahl n auszugeben.
Folgendes ist mein Ansatz:

Java:
 public void properDivisors(int n){
    System.out.print ("Echte Teiler von " + n + " sind ");
    for (int i = 1; i <= n; i++){
        if (n%i==0 && n!=i && i!=1){
        System.out.print (i + ", ");
    }
    }
    System.out.println(" ");   
    }

Das Problem: Es ist eine genaue Formatierung erforderlich. Angenommen der User übergibt 15. Dann kriege ich natürlich "Echte Teiler von 15 sind 3, 5, " als Systemausgabe. Gefordert ist aber: "Echte Teiler von 15 sind 3, 5" (ohne "," und ohne Leerzeichen. Abgeschlossen werden soll es mit einem Zeilenumbruch, deshalb das System.out.println).

Wenn ich bestimmen könnte, was der letzte oder erste Teiler der jeweiligen Zahl ist, könnte ich mit einer if abfrage verhindern das dort das Komma mit gedruckt wird.

Hat jemand eine Idee wie man das herausfindet, oder wahrscheinlich gibt es einen noch viel einfacheren Weg?

Vielen Dank im Voraus,
Paul
 
Beste Antwort
K
Die erste Antwort kam, ehe ich fertig geschrieben hatte, daher hatte ich abgebrochen.

Mein Tipp ist bei sowas immer: Vergiss erst einmal den Code!

Du bekommst eine Zahl und sollst dann mit Zettel und Papier alle Teiler aufschreiben.

Wie gehst Du da dann vor?

Du suchst einen Teiler und wenn Du ihn gefunden hast, schreibst Du ihn auf.
Beim Aufschreiben schaust Du: Ist es der erste Teiler, dann schreibst Du ihn direkt auf. (Also dann hast Du etwas wie "3".)
Und bei allen weiteren Teilern weisst Du: "Ich habe schon ein Teilergebnis, also schreibst Du erst ein ", " und dann den zweiten Teiler (und hast dann das "3, 5".

Das wäre dann eine erste Idee, sowas umzusetzen. Du brauchst also nur eine weitere Variable, in der Du dir merkst, ob...
Die erste Antwort kam, ehe ich fertig geschrieben hatte, daher hatte ich abgebrochen.

Mein Tipp ist bei sowas immer: Vergiss erst einmal den Code!

Du bekommst eine Zahl und sollst dann mit Zettel und Papier alle Teiler aufschreiben.

Wie gehst Du da dann vor?

Du suchst einen Teiler und wenn Du ihn gefunden hast, schreibst Du ihn auf.
Beim Aufschreiben schaust Du: Ist es der erste Teiler, dann schreibst Du ihn direkt auf. (Also dann hast Du etwas wie "3".)
Und bei allen weiteren Teilern weisst Du: "Ich habe schon ein Teilergebnis, also schreibst Du erst ein ", " und dann den zweiten Teiler (und hast dann das "3, 5".

Das wäre dann eine erste Idee, sowas umzusetzen. Du brauchst also nur eine weitere Variable, in der Du dir merkst, ob schon Teiler gefunden wurden. Dann wäre es nur etwas wie "if (teilerGefunden) System.out.print(", "); else teilerGefunden=true;" -> Also wenn Teiler gefunden wahr ist, dann gib das Trennzeichen aus. Ansonsten setz es auf true (denn dann hast Du ja jetzt einen ersten Teiler gefunden).

Dieser erste Ansatz ist in meinen Augen extrem wichtig. Den muss man am Anfang ganz viel üben! Du musst dir also überlegen: Was muss da überhaupt passieren? Da es schwer ist, sich das im Kopf zu überlegen: Nimm Stift und Papier zur Hand! Spiel es von Hand durch!

Ein zweiter Ansatz ist aber auch ebenso wichtig (und kommt ins Spiel, wenn Du den ersten Ansatz beherrscht): Teile und Herrsche!
Die Idee ist, dass Du die Komplexität gering hältst! Dazu ist z.B. wichtig, dass eine Methode nur eine Sache macht und zugleich kurz ist!
Hier wäre also denkbar, die Ermittlung der Teiler und die Ausgabe zu trennen. Damit vereinfacht sich der Code etwas, denn die jeweilige Verantwortung wird deutlich geringer. Das will ich aber an dieser Stelle noch nicht vertiefen, denn der erste Ansatz sollte Dir bei diesem konkreten Problem erst einmal helfen.
 
Beste Antwort
Ungetestet müsste es etwa so aussehen:
Java:
public void properDivisors(int n){
    int anzahlGefundeneTeiler = 0;
    System.out.print ("Echte Teiler von " + n + " sind ");
    for (int i = 2; i < n; i++){
        if (n%i==0){
            if (anzahlGefundeneTeiler == 0) {
                System.out.print (i);
            } else {
                System.out.print (", " + i);
            }
            anzahlGefundeneTeiler += 1;
        }
    }
    System.out.println();
}
(Ich habe noch weitere Vereinfachungen vorgenommen.)

EDIT: Diesmal waren @kneitzel und ich fast gleich schnell; nimm dir bitte auch die Tipps von @kneitzel zu Herzen uns schau nicht nur auf meine Lösung!
 
Die erste Antwort kam, ehe ich fertig geschrieben hatte, daher hatte ich abgebrochen.

Mein Tipp ist bei sowas immer: Vergiss erst einmal den Code!

Du bekommst eine Zahl und sollst dann mit Zettel und Papier alle Teiler aufschreiben.

Wie gehst Du da dann vor?

Du suchst einen Teiler und wenn Du ihn gefunden hast, schreibst Du ihn auf.
Beim Aufschreiben schaust Du: Ist es der erste Teiler, dann schreibst Du ihn direkt auf. (Also dann hast Du etwas wie "3".)
Und bei allen weiteren Teilern weisst Du: "Ich habe schon ein Teilergebnis, also schreibst Du erst ein ", " und dann den zweiten Teiler (und hast dann das "3, 5".

Das wäre dann eine erste Idee, sowas umzusetzen. Du brauchst also nur eine weitere Variable, in der Du dir merkst, ob schon Teiler gefunden wurden. Dann wäre es nur etwas wie "if (teilerGefunden) System.out.print(", "); else teilerGefunden=true;" -> Also wenn Teiler gefunden wahr ist, dann gib das Trennzeichen aus. Ansonsten setz es auf true (denn dann hast Du ja jetzt einen ersten Teiler gefunden).

Dieser erste Ansatz ist in meinen Augen extrem wichtig. Den muss man am Anfang ganz viel üben! Du musst dir also überlegen: Was muss da überhaupt passieren? Da es schwer ist, sich das im Kopf zu überlegen: Nimm Stift und Papier zur Hand! Spiel es von Hand durch!

Ein zweiter Ansatz ist aber auch ebenso wichtig (und kommt ins Spiel, wenn Du den ersten Ansatz beherrscht): Teile und Herrsche!
Die Idee ist, dass Du die Komplexität gering hältst! Dazu ist z.B. wichtig, dass eine Methode nur eine Sache macht und zugleich kurz ist!
Hier wäre also denkbar, die Ermittlung der Teiler und die Ausgabe zu trennen. Damit vereinfacht sich der Code etwas, denn die jeweilige Verantwortung wird deutlich geringer. Das will ich aber an dieser Stelle noch nicht vertiefen, denn der erste Ansatz sollte Dir bei diesem konkreten Problem erst einmal helfen.
vielen Dank, auf die Idee mit einer weiteren Variable war ich auch gekommen, aber dann doch zu doof um zu verstehen dass man die ja an die if Bedingung knüpfen kann. Danke! 🙂
 

Neue Themen


Zurück
Oben