# Muster nur mit verschachtelten Schleifen erzeugen



## 3vilrine (14. Nov 2019)

Moin, es geht um folgende Aufgabe:
 Versuchen Sie  die zwei Codeblöcke zur Erzeugung der beiden gespiegelten Dreiecke zu einem zusammenzufassen (also eine äußere Schleife statt zwei hintereinander ausgeführten), so dass ein Stundenglas von folgender Form entsteht: 

Hilfreich dafür ist folgende Beobachtung: Zunächst nimmt die Zahl der Einrückzeichen von Zeile zu Zeile um 1 zu (die Zahl der Füllzeichen nimmt dabei um 2 ab), während ab der Mitte die Zahl der Einrückzeichen jeweils um 1 abnimmt (und die Zahl der Füllzeichen um 2 zunimmt). Diese Beobachtung kann man numerisch durch eine Variable indentIncrement ausdrücken, die für die ersten Zeilen den Wert 1 hat und ab der Mitte auf -1 "umkippt". 

Das habe ich bis jetzt:      

```
// Teil 3 von Aufgabe 5
public class Aufg5_a3 {

    public static void main(String[] args) {

        final char indentChar = ' ';
        final char fillChar = '+';
        int fillWidth;
        int indentWidth;
        final int triangleBaseLength = 5;
        int triangleHeight = (triangleBaseLength / 2) + 1;
        
        int indentIncrement = 1;

        for (int i = 0; i < triangleHeight; i++) {
            
            for (indentWidth = 0; indentWidth < i; indentWidth++)
                System.out.print(indentChar);

            for (fillWidth = 0; fillWidth < triangleBaseLength - i * 2; fillWidth++)
                System.out.print(fillChar);

            System.out.println();
        }
        for (int i = 0; i < triangleHeight; i++) { // Spitze oben

            for (indentWidth = 0; indentWidth < triangleHeight - 1 - i; indentWidth++)
                System.out.print(indentChar);

            for (fillWidth = 0; fillWidth < i * 2 + 1; fillWidth++)
                System.out.print(fillChar);

            System.out.println();
        }

    }
}
```



... also quasi den Vorläufer mit jeweils 2 gespiegelten Dreiecken. Die Basis Länge lässt sich für ungerade Zahlen ändern, in der Variable "triangleBaseLength", dadurch wird das Dreieck größer oder kleiner je nach Wert eben.
Ich weiß nun leider nicht wie man das machen soll, dass aus den 2 Codeblöcken für die zwei Dreiecke nur eine äußere Schleife verwendet wird.

Später sollen dann noch Variablen für vertikale und horizontale Wiederholung eingefügt werden, aber das ist erstmal nebensächlich solange ich das Grundmuster nicht hinbekomme.
Ich wäre für jede Hilfe dankbar.


----------



## mihe7 (15. Nov 2019)

Zu Beginn ist die Zahl der Einrückungen gleich 0, außerdem gibt es ein Delta, das zu Beginn gleich 1 ist.

Jetzt erzeugst Du die Figur Zeile für Zeile (die Höhe der Figur entspricht ihrer Breite), also eine Schleife. Nach jeder Zeile musst Du die Zahl der Einrückungen verändern, d. h. das Delta addieren. Unmittelbar nachdem Du für eine Zeile nur noch 1 Füllzeichen verwendet hast, muss das Delta auf -1 geändert werden. Hierbei ist ein if hilfreich.


----------

