# Weihnachtsbaum - Konsole



## passi (29. Okt 2011)

Moin! Ich muss ein Programm schreiben, welches einen Weihnachtsbaum auf der Konsole ausgibt.

Beispiel-Ausgabe:

Anzahl der Zeilen: 5
....*....
...***...
..*****..
.*******.
*********

Mein Quelltext:

```
import javax.swing.JOptionPane;

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

		int a, b, c;
		int n = Integer.parseInt(JOptionPane.showInputDialog(null,
				"Höhe des Baums"));

		for (a = 1; a <= n; a++) { //Zeilen bestimmen
			for (b = 1; b <= n - a; b++) { //Beginnt bei einem kleiner als n, dann b hochzählen    
                                                                   //für die nächsten Zeilen
				System.out.print(".");
			}
			for (b = 1; b <= (2 * a - 1); b++) {
				System.out.print("*");
			}
			for (c = 1; c <= n - a; c++) { //Beginnt bei einem kleiner als n, dann c hochzählen            
                                                                  //für die nächsten Zeilen
				System.out.print(".");
			}
			System.out.println();
		}
	}
}
```

Der Quelltext funktioniert einwandfrei. Ich muss zugeben, dass ich mir folgende Schleife nur mit der Hilfe von Google erstellen konnte:

```
for (b = 1; b <= (2 * a - 1); b++) {
				System.out.print("*");
			}
```

Ich verstehe die for-Schleife nicht, besonders 
	
	
	
	





```
(2 * a - 1)
```
. Kann mir jemand dabei helfen, die Zeilen zu verstehen?
Gruß
Passi


----------



## Final_Striker (29. Okt 2011)

Die for-Schleife läuft solange 
	
	
	
	





```
b
```
 kleiner/gleich 
	
	
	
	





```
2*a - 1
```
 ist. Was gibt es da nicht zu verstehen?


----------



## Marcinek (29. Okt 2011)

Naja, wenn man sich anschaut, wie die zeilenanzal mit der anzahl der sternchen einhergeht, dann

in der 0. Zeile = 1 Stern
1. Zeile = 3 Stern 
2. Zeile = 5 Stern

Also:  Zeile * 2 + 1

0. Zeile: 0 * 2 + 1 = 1
1. Zeile = 1 * 2 + 1 = 3 ...

u.s.w.

Damit das in das Programm passt, hier sind die indezes anders, da beginnt die erste Zeile mit 1 und nicht mit 0, dann muss man 1 abziehen.

Kurz: Koorelation zwischen zeile und anzahl sternchen.

Gruß,


----------



## passi (29. Okt 2011)

warum -1? 2*5-1 = 9
9 Sterne in der letzten Zeile
welchen Zweck erfüllt die Anweisung? Anzahl der Sterne in der letzten Zeile? Ich verstehe nicht woher er weiß, wann er z.b. 3 oder 5 Sterne ausgeben muss.


----------



## pask (29. Okt 2011)

Zu spät gelesen. Danke an Marcinek, nun ist alles verstanden


----------



## Andi_CH (31. Okt 2011)

HURAAAAA - wie ich letzte Woche in einem Zickenthread darauf hingewiesen habe - jetzt ist die endlich da - die erste Weihnachtsbaum-Frage und alle die keine höhergestellten Fragen mögen dürfen sich jetzt auf die Beantwortung stürzen - ich machs auch

Da die Luxusvariante des letzten Jahres:


```
package com.javaforum.asciiart;

public class Tanne
{
	public static void main (String[]args)
	{
		int aZ,aS,heighTree,heighBark,widthBark,h,h2,h3,aSbackup;
		aZ=4;
		aS=9;
		heighTree=7;
		heighBark=2;
		widthBark=3;
		h=1;
		h2=1;
		h3=1;
		aSbackup=aS;

		while(h<aZ){
			System.out.println();
			h=h+1;
		}
		h=1;                                    //in die Zeilen Rücken
		while(h<aS){
			System.out.print(" ");
			h=h+1;
		}
		h=1;
		while((heighTree-heighBark)>=h2){

			while(h<=h3){                       //* Zeichnen
				System.out.print("*");
				h=h+1;  
			}
			if ((heighTree-heighBark)>h2)
				System.out.println("Î");
			else
				System.out.println();
			h=1;
			aS=aS-1;

			if(h2!=heighTree-heighBark){
				while(h<aS){                    //Abstand von links wird immer um 1 weniger
					System.out.print(" ");
					h=h+1;
				}
			}
			h2=h2+1;
			h3=h3+2;
			h=1;
		}
		h=1;
		h2=1;
		h3=1;

		while(h<=heighBark){
			while(h2<=aSbackup-2){
				System.out.print(" ");          //Anfang vom Stamm berechnen und einrücken 
				h2=h2+1;
			}
			while(h3<=widthBark){
				System.out.print("*");          //Stamm zeichnen
				h3=h3+1;
			}
			System.out.println();
			h=h+1;
			h2=1;
			h3=1;
		}
	}
}
```


----------

