Threads Patternfrage

Ballastt

Mitglied
Ich muss für einen Kurs ein Beispiel lösen und ich krieg es nicht gebacken. Ich kann mir ungefähr zusammendenken, wie es zu lösen ist, aber sobald ich dann davor sitze, dreht mein Hirn ab. Ich bin bei den Javabasics und das Beispiel gehört zum Teil for/while/if/else etc.
So soll der Code aussehen:

  • 2 3 4 5
  • * 3 4 5
  • * * 4 5
  • * * * 5
  • * * * *

Bis jetzt bin ich soweit, dass ich die aufsteigende Sternchenpyramide coden kann. Ich weiß auch, dass ich in die abhängige for-Schleife einen if-else Code schreiben muss. Aber ich häng damit, zu sagen, schreib hier Sternchen + 2 + 3 +4 +5 usw. Kann mir hier jemand weiterhelfen?
 

Oneixee5

Top Contributor
Schreib eine Schleife die 4 mal den 'Index + 2' ausgibt (Schleife 1, Index-Variable: i).
Dann schreibe außen herum eine Schleife die das 5 mal macht, also Schleife 1 ausführt (Schleife 2, Index-Variable: j).
Dann schreibe in die innere Schleife (Schleife 1) ein if-else -> wenn 'j < i' dann gib aus: '*' else gib aus: 'i + 2'
... so denke ich mal...
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Das vorgehen ist immer gleich:
a) Beschreibe das Problem - Was ist die Eingabe? Was muss raus kommen? Das muss 100% klar sein.
b) Beschreibe einen Lösungsweg. Das ist eine sprachliche Anforderung. Stell Dir vor, dass Du mir sagen musst, was ich machen soll. Aber ich will nichts von a) wissen. Ich will klare Anforderungen, was ich zu schreiben habe.
c) Spiel die Beschreibung durch. Stift und Papier sind hier Dein Freund. Du merkst Dir nichts groß. Alles, was Du wissen musst, muss auf dem Zettel stehen. Wenn das klappt, dann hast Du eine Beschreibung (b) und weisst auch, was Du merken musst (c) und damit kannst Du dann anfangen, ein Programm zu schreiben.

Aber das Schreiben von Java Code kommt erst ganz am Ende! Und das ist ein Standard Vorgehen, das bei der Software Entwicklung immer durchgeführt wird:
a) Das ist in der agilen Vorgehensweise ein ganz wichtiger Punkt. Anforderungen müssen sauber dokumentiert sein, damit sie dann in der Planung berücksichtig werden können. (Z.B. in SAFe wäre dies die "Definition of Ready".)
b) Das ist das fachliche Verständnis. Natürlich wird später nicht im kleinsten besprochen, wie es jetzt bei Deinen Aufgaben von Dir verlangt wird. Das Vorgehen, das hier oft gefunden wird, wird oft als "Divide and Conquer" bezeichnet. Du teilst eine Aufgabe auf und gewinnst so. Du solltest also nicht versuchen, alles in eine Beschreibung zu packen:

Statt also nur eine Anleitung zu machen, hast Du eine Anleitung, die dann aber so komplexe Schritte hat, dass du dafür erneut Anleitungen brauchst.

Also sowas wie:
Zähle ZeilenNr von 1 bis 5 und schreibe Zeile mit der ZeilenNr.
==> Das mit dem zählen beschreibt eine einfache Schleife, aber "schreibe Zeile mit der ZeilenNr" - Keine Ahnung, wie das geht ... Daher gibt es dazu dann eine eigene Anleitung.

Das hat den Vorteil, dass Du dann auch einen Code bekommst, der Übersichtlich ist. Keine mehrfachen Verschachtellungen und so. Und der Code ist dann auch einfach anpassbar und lesbar.

Um das in der Umsetzung zu zeigen: Dein Code ist dann erst einmal etwas wie:

Java:
public static void main (String[] args) {
    for (int zeilennr = 1; zeilennr <= 5; zeilennr++){
        schreibeZeile(zeilennr);
    }
}

Die Beschreibung von schreibe Zeile mit nr ist dann evtl. eine Beschreibung gewesen wie:
schreibeZeile mit ZeilenNr:
  • Schreibe Sternchen bis ZeilenNr
  • Schreibe Zahlen ab ZeilenNr

was dann in Code sein könnte:

Java:
public static int schreibeZeile(int zeilennr) {
    schreibeSternchen(zeilennr);
    schreibeZahlen(zeilennr);
}

Und das muss dann halt weiter beschrieben werden. In der Praxis später bricht man dann ab, weil einfach klar ist, wie es geht. Aber man spielt halt alles so lange durch, bis der Lösungsweg 100% klar ist. Und das setzt man dann um.

Das nur um Dir ein Ausblick zu geben, dass das, was ich Dir beschreibe, nicht irgend etwas ist, das Kinderkram ist, sondern das findet sich - wenn auch auf einem deutlich höheren Level - auch in der Software Entwicklung.
 

LimDul

Top Contributor
Was helfen kann, erkläre einem Kleinkind, wie es dieses Muster aufmalen soll.
Da kommt man schnell in eine Variante, die so "simpel" ist, dass man sie umsetzen kann. Weil einfach ein Kleinkind noch nichts von komplexen Vorgängen, Schleifen etc. weiß.

Ich fang mal an:
  • Du sollst 5 Zeilen aufschreiben
  • In der ersten Zeile ist an der ersten Stelle ein *, an der 2ten Stelle die Ziffer 2, an der dritten Stelle die Ziffer 3, an der der vierten Stelle die Ziffer 4 und an der 5ten Stelle die Ziffer 5
  • In der zweiten Zeile ist an der ersten Stelle ein *, an der 2ten Stelle ein *, an der dritten Stelle die Ziffer 3, an der der vierten Stelle die Ziffer 4 und an der 5ten Stelle die Ziffer 5
  • In der dritten Zeile ist an der ersten Stelle ein *, an der 2ten Stelle ein *, an der dritten Stelle ein *, an der der vierten Stelle die Ziffer 4 und an der 5ten Stelle die Ziffer 5
  • In der vierten Zeile ist an der ersten Stelle ein *, an der 2ten Stelle ein *, an der dritten Stelle ein *, an der der vierten Stelle ein * und an der 5ten Stelle die Ziffer 5
  • Die fünfte Zeile wird dem geneigten Leser zur Übung überlassen ;)

Wenn man das jetzt mal so wirklich aufgeschrieben hat - dann sollte man jetzt hoffentlich in der Lage sein, da Regeln draus abzulesen.
Fragen dazu:

  • Wenn ich n Zeilen ausgebe, wie viele Stellen hab ich dann pro Zeile?
  • Wie viele Sterne werden in der Zeile i ausgeben?
  • Ab welcher Stelle in der Zeile j werden Zahlen ausgegeben?
  • Wenn eine Zahl an der k in der Zeile m ausgegeben wird - welche Zahl wird ausgegeben.


Und dann kann man einen Algorithmus draus basteln. Mit mehr Erfahrung passieren diese Dinge viel schneller und viel mehr im Kopf als Automatismus. Aber am Anfang ist es immer gut wirklich ganz kleine Schritte zu machen.
 

Ballastt

Mitglied
Das vorgehen ist immer gleich:
a) Beschreibe das Problem - Was ist die Eingabe? Was muss raus kommen? Das muss 100% klar sein.
b) Beschreibe einen Lösungsweg. Das ist eine sprachliche Anforderung. Stell Dir vor, dass Du mir sagen musst, was ich machen soll. Aber ich will nichts von a) wissen. Ich will klare Anforderungen, was ich zu schreiben habe.
c) Spiel die Beschreibung durch. Stift und Papier sind hier Dein Freund. Du merkst Dir nichts groß. Alles, was Du wissen musst, muss auf dem Zettel stehen. Wenn das klappt, dann hast Du eine Beschreibung (b) und weisst auch, was Du merken musst (c) und damit kannst Du dann anfangen, ein Programm zu schreiben.

Aber das Schreiben von Java Code kommt erst ganz am Ende! Und das ist ein Standard Vorgehen, das bei der Software Entwicklung immer durchgeführt wird:
a) Das ist in der agilen Vorgehensweise ein ganz wichtiger Punkt. Anforderungen müssen sauber dokumentiert sein, damit sie dann in der Planung berücksichtig werden können. (Z.B. in SAFe wäre dies die "Definition of Ready".)
b) Das ist das fachliche Verständnis. Natürlich wird später nicht im kleinsten besprochen, wie es jetzt bei Deinen Aufgaben von Dir verlangt wird. Das Vorgehen, das hier oft gefunden wird, wird oft als "Divide and Conquer" bezeichnet. Du teilst eine Aufgabe auf und gewinnst so. Du solltest also nicht versuchen, alles in eine Beschreibung zu packen:

Statt also nur eine Anleitung zu machen, hast Du eine Anleitung, die dann aber so komplexe Schritte hat, dass du dafür erneut Anleitungen brauchst.

Also sowas wie:
Zähle ZeilenNr von 1 bis 5 und schreibe Zeile mit der ZeilenNr.
==> Das mit dem zählen beschreibt eine einfache Schleife, aber "schreibe Zeile mit der ZeilenNr" - Keine Ahnung, wie das geht ... Daher gibt es dazu dann eine eigene Anleitung.

Das hat den Vorteil, dass Du dann auch einen Code bekommst, der Übersichtlich ist. Keine mehrfachen Verschachtellungen und so. Und der Code ist dann auch einfach anpassbar und lesbar.

Um das in der Umsetzung zu zeigen: Dein Code ist dann erst einmal etwas wie:

Java:
public static void main (String[] args) {
    for (int zeilennr = 1; zeilennr <= 5; zeilennr++){
        schreibeZeile(zeilennr);
    }
}

Die Beschreibung von schreibe Zeile mit nr ist dann evtl. eine Beschreibung gewesen wie:
schreibeZeile mit ZeilenNr:
  • Schreibe Sternchen bis ZeilenNr
  • Schreibe Zahlen ab ZeilenNr

was dann in Code sein könnte:

Java:
public static int schreibeZeile(int zeilennr) {
    schreibeSternchen(zeilennr);
    schreibeZahlen(zeilennr);
}

Und das muss dann halt weiter beschrieben werden. In der Praxis später bricht man dann ab, weil einfach klar ist, wie es geht. Aber man spielt halt alles so lange durch, bis der Lösungsweg 100% klar ist. Und das setzt man dann um.

Das nur um Dir ein Ausblick zu geben, dass das, was ich Dir beschreibe, nicht irgend etwas ist, das Kinderkram ist, sondern das findet sich - wenn auch auf einem deutlich höheren Level - auch in der Software Entwicklung.
Danke!!!!!!!!
 

Oben