Sägezahn-Muster

JavaAnfeangerHelp

Neues Mitglied
hilfe, ich muss ein Sägezahn-Muster in Java programmieren und habe keine Ahnung wie. Ich soll 2 for schleifen benutzen.
*
**
***
****
*****
*
**
***
****
*****
so soll das dann aussehen
 
Hi,
der Trick liegt darin zunächst ein gewisses Muster festzustellen.

Was könnte das sein?

Ansonsten ist es schwer so gänzlich ohne Quellcode entsprechende Hilfe zu leisten.

Schöne Grüße
Martin
 
Die Frage ist doch, woran es hier hängt. Evtl. ist das Problem einfach, dass man es mit 2 Schleifen und nicht mit 3 Schleifen machen soll.

Denn wenn man es aufteilt:
  • man muss n Sternchen in eine Zeile schreiben
  • man muss n Zeilen mit den 1...n Sternchen schreiben
  • man muss das Muster wiederholen

Das wären dann 3 Schleifen und nicht 2 Schleifen, auf die es hinaus laufen soll.

Aber man kann da natürlich überlegen, ob man das wirklich so braucht. Nehmen wir einfach einmal an, dass wir 3 Sternchen haben und 2 Wiederholungen:
- Die Anzahl der Zeichen pro Zeile kann man dann für jede Zeile aufschreiben:

1 1
2 2
3 3
4 1
5 2
6 3

Siehst Du da, wie Du aus der Zeilenzahl denn die zweite Zahl berechnen kannst? Der Reminder Operator (oft auch als Module bezeichnet, was mathematisch nicht 100% korrekt ist) könnte eingesetzt werden, aber der ist 0 basiert - ziehen wir mal einfach von beiden Zahlen 1 ab, damit wir auch mit 0 starten:
0 0
1 1
2 2
3 0
4 1
5 2

Also wenn wir die Zeilen mit 0 anfangen zu zählen, dann haben wir in jeder Zeile Zeilenindex % Sternchenzahl + 1

Damit könnten wir aus den beiden äußeren Schleifen (Musterwiederholung und Muster selbst) eine Schleife über die Zeilenanzahl machen.

Zur Einordnung machen wir einfach einmal etwas weiter

Jetzt könnte man sich noch überlegen, ob man die innere Schleife nicht auch los werden können. Wir könnten uns einfach die Zeile merken. Die zu zeichnende Zeile ist "". Dann starten wir immer bei der Darstellung und hängen da immer erst ein * an. Und nach der Ausgabe einer Zeile prüfen wir, ob wir am Ende eines Musters sind (oder vorab, ob wir am Start sind). Je nachdem, ob die Zeilennummer schon erhöht wurde ist es halt ein zeilennumer % sternchenzahl == 0 oder zeilennummer % sternchenzahl = sternchenzahl - 1.

Dann hätte man sogar nur eine einzige Schleife. Aber wie lesbar wird der Code? Wir wollen doch unseren Code lesen können. Und auch gerade am Anfang: Wir wollen den Code problemlos schreiben können!

Also was liegt denn da näher als Code wie:

Anforderung: Ein Muster aus einer Anzahl Sternchen soll n mal wiederholt werden
Java:
public void wiederholeMuster(int anzahlWiederholungen, int anzahlSternchen) {
    for (count = 0; count < anzahlWiederholungen; count++) {
        musterAusgeben(anzahlSternchen);
    }
}

Anforderung: Ein Muster wie in der Aufgabe beschrieben mit maximal n Sternchen soll ausgegeben werden
Java:
void musterAusgeben(int anzahlZeilen){
    for (int count = 1; count <= anzahlZeilen; count++) {
        schreibeZeileMitSternchen(count);
    }
}

Anforderung: Schreibe eine Zeile mit n Sternchen:
Java:
void schreibeZeileMitSternchen(int anzahlSternchen) {
    for (int count = 0; count < anzahlSternchen; count++) {
        System.out.print("*");
    }
    System.out.println();
}

Das sind dann sehr kurze und einfach zu verstehende Methoden. Das wird oft auch als teile und herrsche bezeichnet. Teile ein Problem in viele kleine Probleme auf, die dann jedes für sich einfach zu lösen ist. Es ist also naheliegend, dies zu machen, statt zu versuchen, irgendwas zu "optimieren". (Eine Schleife über n*m oder zwei Schleifen mit n und m Durchläufen sind gleichwertig. Da ist also keine Optimierung!)
 
Kein "Hallo zusammen !" als Bergüßung bei einem allerersten Post

Kein "Vielen Dank !" zum Abschluß

Keinerlei eigene Lösungsansätze, sondern der Versuch sich um 2 Uhr Nachts eine Lösung zu erbetteln, nachdem man den Abend dann doch lieber anderweitig verbracht hat.

Und trotzdem bekommt er hier ausführliche Hilfe.

Manche hier sind einfach zu nett für diese Welt 🤣
 
Man könnte auch mit 2 Schleifen statt 3 Schleifen auskommen, wenn man das Sternchen nicht wiederholt,
sondern einen String mit allen (maximale Anzahl) Sternchen erzeugt und dann die Anzahl Sternchen mit

Java:
sternchen.substring(0, anzahl)

raus holt.
 
Man könnte auch mit 2 Schleifen statt 3 Schleifen auskommen, wenn man das Sternchen nicht wiederholt,
sondern einen String mit allen (maximale Anzahl) Sternchen erzeugt und dann die Anzahl Sternchen mit

Java:
sternchen.substring(0, anzahl)

raus holt.
Oder man nimmt einfach String#repeat 😛

Nachtrag: man könnte natürlich auch mit einer Schleife auskommen.
Nachtrag 2: Code wieder entfernt, ich will ja hier nicht die Hausaufgabe machen.
 
Nachtrag: man könnte natürlich auch mit einer Schleife auskommen.
Das hatte ich ja auch beschrieben 🙂

Wobei es mir natürlich mehr um den Prozess der Entwicklung und damit verbunden Clean Code ging. Und dann ist die Frage, in wie weit man Alternativen wie Streams auch als Schleife zählen würde... Unter dem Strich wird da ja sowas mit verbaut sein - ähnlich wie bei String::repeat

Aber statt einer Schleife, die zählt, kann man ja natürlich einen Stream dieser Zahlen nehmen und diese dann einfach in der gegebenen Reihenfolge abarbeiten.
 
Also ich kann mich noch an viele Dinge aus meinem Leben erinnern, aber Dinge die ich Samstags morgens um 2 Uhr gemacht habe gehören mit Sicherheit nicht dazu.

Daher vermute ich mal der Kollege weiß aktuell gar nicht mehr das er sich in diesem Forum angemeldet hat 🤣

P.S. Würde vorschlagen den Thread Richtung Hausaufgaben zu verschieben, möge er dort in Frieden ruhen ...
 

Zurück
Oben