# Tannenbaum auf der Konsole ausgeben lassen



## ceko1907 (22. Jan 2016)

Hallo Leute,

unten ist mein Ansatz, aber komme nicht weiter. Danke im Voraus.



```
//Schreiben Sie ein Programm, welches einen Tannenbaum in Form von Sonderzeichen auf der Konsole ausgibt (ASCII).
//Die Hoehe des Baumes soll variabel, d.h. mittels eines Parameters einstellbar sein.
//
//Hinweis: Verwenden Sie Schleifen
//
//Beispiel fuer die Ausgabe auf der Konsole:
//
//         *
//        ***
//       *****
//      *******
//     *********
//    ***********
//   *************
//  ***************
// *****************
//*******************
//         I

import java.util.Scanner;

public class E_Tannenbaum {
    public static void main (String[] args) {     
        Scanner s = new Scanner (System.in);
        System.out.println("Bitte geben Sie eine Zahl ein, um die Höhe des Baumes zu bestimmen");
        int eingZahl;
        eingZahl=s.nextInt();
     
     
        for (int i=1; i<=eingZahl; i++){          
            System.out.println("      " + "*");
        }
    }
}
```


----------



## Tarrew (22. Jan 2016)

Also ein erster Ansatz wäre ja mal, es mit zwei for-Schleifen zu versuchen.
Eine äußere für die Anzahl der Zeilen, und eine innere für das ausgeben der Zeichen in der jeweiligen Zeile.

Und Code bitte in den Java-Tags posten.


----------



## ceko1907 (22. Jan 2016)

Ok. Und wie codiere ich die Leerzeichen und die Sterne in der Ausgabe ()?


----------



## Tarrew (22. Jan 2016)

Was hast du denn jetzt noch probiert und was funktioniert nicht so wie du es dir vorstellst?


----------



## ceko1907 (22. Jan 2016)

```
public class E_Tannenbaum {
    public static void main (String[] args) {      
        Scanner s = new Scanner (System.in);
        System.out.println("Bitte geben Sie eine Zahl ein, um die Höhe des Baumes zu bestimmen");
        int eingZahl;
        eingZahl=s.nextInt();     
      
        for (int i=1; i<=eingZahl; i++){
            for (int x=1; x<=10; x++);          
            System.out.println();                  
        }                      
    }
}
```


----------



## ceko1907 (22. Jan 2016)

Also ich weiß nicht wie ich diese * darstellen soll. Ich meine ich könnte System.out.println("       *"); eingeben, aber ich komm nicht drauf, wie die Anzahl der Sterne variiert werden soll.


----------



## Schesam (23. Jan 2016)

Hey du 

Mich hat das selbst interessiert wie man das löst und habe jetz auch ca 15min dafür gebraucht um das hinzubekommen, ist aber ganz leicht eigentlich. Ich werde dir hier keine Lösung vorgeben, aber ien paar Tipps:

1. Lege dir 2 Strings an. Der eine macht die rechte Seite des Baumes, der andere die linke. DIe Ausgabe machst du dann mit [java]System.out.println(ausgabeL + ausgabeR);[/java] wobei du natürlich deine beiden Variablen-Namen einsetzt.
2. du brauchst 3 for-Schleifen:
Die 1. brauchst du für die Höhe des Baumes, sie zählt also die Höhe ab.
Die 2. fügt der linken-Baumseite die Leerzeichen hinzu, für jeden Höhenschritt und Benutzer-eingegebene Höhe anders. Musst also die Parameter geschickt einsetzen.
Die 3. fügt dann der Linken Seite die "*" hinzu, sodass am Ende der Baum entsteht.
Als Screen bei meinem Ergebnis:






Bei weiteren Fragen, schreib ruhig, dann helfe ich dir gerne weiter


----------



## Tarrew (23. Jan 2016)

Wobei hier viele Wege nach Rom führen. 
Man könnte das ganze auch mit einer for-Schleife machen, dann wäre das grade mal 4 Zeilen 

Aber gute Idee!


----------



## Schesam (23. Jan 2016)

Ich hab das wie gesagt gerade selbst nur mal versucht und nach 5min überlegen bin ich drauf gekommen, beide Seiten einzeln zu erstellen. SO wie ich es momentan hier stehen habe, ist es selbst für Anfänger auch sehr einfach zu verstehen 
Hab sogar links mal in "/" und rechts in "\\" geändert, damit man auf der Konsole die beiden String besser auseinanderhalten kann und es auch besser ausschaut  
Dazu nach dem ganzen noch nen Stamm in der Mitte ausgeben, was aber außerhalb der Aufgabenstellung wäre^^ Die ganze Klasse hat 32 Zeilen.


----------



## Tarrew (23. Jan 2016)

Ja in dem Beispiel ist der Stamm nur der Buchstabe "I"  Also relativ einfach gehalten.


----------



## Schesam (23. Jan 2016)

bei mir "||", aber halt in der Mitte des baumes, egal wie groß der geworden ist^^ Wenns dort sogar drin steht, könnte es sogar echt  zur AUfgabenstellung gehören, das müsste der To aber noch sagen


----------



## ceko1907 (24. Jan 2016)

Also habe jetzt mal versucht was zu erreichen aber kriege es nicht hin. Möchte nebenbei bemerken dass ich gerade seit knapp über einer Woche mit Java angefangen und aufgrund meines Studiengangs eigentlich nichts mit Informatik am Hut habe (studiere Wirtschaftsingenieurwesen mit Maschinenbau ). Deswegen fällt mir das etwas schwer. Aber hier mal mein "Ansatz". Bitte nicht fertig machen 

```
public class E_Tannenbaum{
    public static void main (String [] args){

        String L;
        L=" ";


        String R;
        R="*";

        int a,b,c;

        Scanner Höhe = new Scanner (System.in);
        System.out.println("Wie hoch soll der Baum sein?");
        int eingHöhe = Höhe.nextInt();


        for(a=eingHöhe; a<=100; a++){                          //soll die Höhe sein (anzahl der zeilen)
            for (b=a; b<=100; b++){                           //fügt der linken seite die * hinzu
                for(c=a; c<=100; c=a+2){                       //fügt der linken Baumseite die Leerzeichen hinzu (pro Zeile 2 Sterne mehr
        
                    System.out.println(c + a*L + b*R);           //weiß dass man string nicht multiplizieren kann, wollte nur zeigen was ich machen wollte. die ausgabe ist auch völlig falsch :D
    
        


        }}}}}
```

Ich komme ehrlich gesagt nicht damit klar, dass ich "Zeichen" in Abhängigkeit von Zahlen ausgeben soll. Integer und String Datentypen gemeinsam verwirren mich etwas. Oder ich habe einfach deine Tipps nicht gecheckt. Ich würde mich freuen wenn ihr auf meinen Ansatz eingehen würdet und sagt was ich verbessern muss.
Danke im Voraus für eure Hilfe.


----------



## Schesam (24. Jan 2016)

Wieso willst du immer auf <= 100 prüfen? Wenn man als Höhe 8 eingeben würde würde der 92 Reihen ausgeben. Und ich versteh auch nicht so ganz was du mit  den inneren 2 Schleifen erreichen willst, zumal die 3. eine Endlosschleife ist ( a verändert sich erst, sobald die inneren beiden Schleifen fertig sind. Aber die letzte wird erst fertig wenn c + a + 2 >= 100 ist, also wird das nie fertig).

Ich geb dir mal nen Grundaufbau vom ganzen in Worten vor, vllt hilft dir das ja schon zum Ergebnis:
1. Starte den Scanner und frage die gewünschte Höhe des Baumes ab und speicher dir diese. Dann leg dir 2 leere Strings für rechts und links an.
2. Nun erstellst du die erste Schleife, die die Höhe des Baumes darstellt. Sie läuft solange bis die Höhe erreicht ist.
3. In dieser Schleife fügst du der rechten einen Stern hinzu und löscht die linke Seite wieder. Dann erstellst du 2 weitere einzelne Schleifen. Du hast dann also 3 Schleifen, aber 2, die nacheinander ausgeführt werden.
4. In der ersten inneren Schleife fügst du links die Leerzeichen hinzu, abhängig von der Höhe und der eingegebenen gewünschten Höhe.
5. In der 2. inneren Schleife fügst du der Linken Seite die Zeichen hinzu, abhängig von der länge der rechten Seite. Bei deinem Stern Beispiel willst du natürlich eine spitze Spitze, also fängst du bei der 2. Höheneinheit an.
6. Dann gibst du die beiden Seiten aus.

Wenn du das hingekriegt hast, können wir mit dem Stamm weitermachen 

Und PS: Wenn du x mal an einen String was anketten willst, benutzt du dafür ne einfache for-Schleife, sowie ich es oben angedeutet habe. DU lässt die for-Schleife solange laufen, wie du willst und in jedem Durchgang hängst du was hinten/vorne/sonstwo dran


----------

