Wheinachtsbaum

Neue Frage »

Auf diesen Beitrag antworten »
JKU11 Wheinachtsbaum

Meine Frage:
Hallo. Habe hier eine Übungsaufgabe, finde aber keinen Lösungsansatz :

Write a program to print a ?tree? by
stacking number pyramids. Your algorithm will stack (n-1) pyramids,
where each pyramid has an increased height, and ?n? is entered by the
user. Each element of the pyramid shall be a 2n result, restarting with 21 in each row and incrementing n until the middle of the row is reached.

Then n is decreased until 21 is reached again at the end of the row.
Note that ?n? is also the maximum number of rows in the last pyramid of
the tree. The image on the left side shows a maximum of 5 rows for the
last pyramid ? find appropriate limits for the user input. Limit the user
input appropriately to achieve a Christmas Tree fitting to the max width
of your console window.


Meine Ideen:
Wie gesagt habe ich leider keine Ahnung wie ich anfangen soll. Nehme mal an, dass es nur mit Arrays realisierbar ist.

Und wenns geht bitte keine fertigen Codes nur mal ein paar Ideen wie ich vorgehen soll. smile

Beste Grüße
 
Auf diesen Beitrag antworten »
Karlito

Hallo,

1. Schau mal wie breit der Baum maximal in Abhängigkeit von der Höhe werden kann.
2. wie kannst du eine einzelne Ebene so ausgeben, dass sie zentriert ist (in Abhängigkeit von einer Zeilenbreite)
3. Wie kannst du eine einzelne Stufe des Baumes ausgeben

Und dann alles zusammenfügen Augenzwinkern

VG,

Karlito
Auf diesen Beitrag antworten »
JKU11

Alsooo:

Die Höhe des Baumes errechne ich mir mit (2+3+4...+n) Zeilen
Die Breite mit (n*2)-1

Also jede Pyramide: fängt mit 2 an und erhöhe um 2 solange 2^n erreicht, anschließend subtrahiere bis Ergebnis 2 ist.
Das wäre mein Algorithmus für die letzte Zeile jeder Pyramide.

Das Problem ist halt, dass ich nicht genau weiß wie ich das ganze mit Arrays realisieren soll .

MfG
Auf diesen Beitrag antworten »
Karlito

Naja, Du schreibst die Werte in ein Array und gibst dieses aus? Welche Sprache sollst du denn verwenden?

VG,

Karlito
 
Auf diesen Beitrag antworten »
JKU11

Java.

Haben mit den Arrays noch nicht viel durch genommen, daher tu ich mir ziemlich schwer :/
Auf diesen Beitrag antworten »
Karlito

Mach halt mal einen Vorschlag, wie eine Methode aussähe, welche eine Zeile des Baumes in einem Array erzeugt...

VG,

Karlito
Auf diesen Beitrag antworten »
JKU11

also hab hier den code. Er gibt mir aber was komischer raus und hab auch ne Fehlermeldung dazu. Nach meinem "Schreibtischtest" sollte eigentlich alles funktionieren. verwirrt

public class Pyr {

public static void main(String[] args) {

int n,x;
int b;
n=Input.readInt();
int a=(2*n)-1;
int [] Zeile;
Zeile = new int[a];

for (int i=0; i<=(2*n-1);i++) {
Zeile[i]=b;
System.out.print(b);
b=b*2;
if (b>=Math.pow(2.0, n)) {
for (x=n-1; x>=1; ) {
b=b-Math.pow(2.0, x);
System.out.print(b);
x=x-1;
}
}
}
}
}


Er gibt mir folgendes auf der Konsole aus:

Input : 3
2481632Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at Pyr.main(Pyr.java:13)
Drücken Sie eine beliebige Taste . . .

Keine Ahnung was da gemeint ist, die Zahlen stimmen ja nach der 8 auch nicht mehr
Auf diesen Beitrag antworten »
Karlito

Schau dir mal den Schleifenkopf an...
Auf diesen Beitrag antworten »
JKU11

den ersten?
Auf diesen Beitrag antworten »
Karlito

Jap. Brauchst du wirklich so viele Schleifendurchläufe?
Auf diesen Beitrag antworten »
JKU11

hab jetzt den ersten Schleifenkopf durch: for (i=0; i<=n-1;i++) ersetzt.

Kommt aber noch immer dasselbe raus :/
Auf diesen Beitrag antworten »
JKU11

.
Auf diesen Beitrag antworten »
Karlito

Hallo.

Nein, ich finde sogar, dass deine IDE zu wenig sagt großes Grinsen
Auf diesen Beitrag antworten »
JKU11

großes Grinsen jetzt kommt wenigstens keine Fehlermeldung mehr ^^.. Hatte das b nicht gecastet.

Naja das Ouput sieht jetzt so aus :

5
248160-32-64-96-96Drücken Sie eine beliebige Taste . . .
Auf diesen Beitrag antworten »
Karlito

Schau dir noch mal meinen Post an. Dann wirst du sehen, woran die komischen Ausgaben liegen.
Auf diesen Beitrag antworten »
JKU11

Ja habs jetzt endlich großes Grinsen

Jetzt nur mehr 1 Problem lösen, und zwar dass die größte Zahl nicht 2 mal ausgegeben werden soll:

6
24816323216842Drücken Sie eine beliebige Taste . . .


Versteh nicht warum, mein code sieht nun so aus:

public class Pyr {

public static void main(String[] args) {

int n,x;
int b=2;
n=Input.readInt();
int a=(2*n)-1;
int [] Zeile;
Zeile = new int[a];

System.out.print(b);

for (int i=0; i<n-1;i++) {
Zeile[i]=b;
b=b*2;
if (b>=Math.pow(2.0, n)) {
for (x=n-1; x>=1Augenzwinkern {
b=(int)(b-Math.pow(2.0, x));
System.out.print(b);
x=x-1;
}
}
else {
System.out.print(b);
}
}
}
}
Auf diesen Beitrag antworten »
Karlito

Schau dir einfach dein Programm noch mal an. Die anderen Zahlen passen ja auch nicht...
Auf diesen Beitrag antworten »
JKU11

So, hab jetzt den Fehler gefunden.

public class Pyr {

public static void main(String[] args) {

int n,x;
int b=2;
n=Input.readInt();
int a=(2*n)-1;
int c=(int)(Math.pow(2.0, n)) ;
int [] Zeile;
Zeile = new int[a];


for (int i=0; i<=n-1;i++) {
Zeile[i]=b;
System.out.print(b);
b=b*2;
}
for (x=n-1; x>=1; ) {
c=(int)(c-Math.pow(2.0, x));
System.out.print(c);
x=x-1;
}
System.out.println();

}
}


Das Output stimmt jetzt auch smile
Auf diesen Beitrag antworten »
Karlito

OK, du kannst jetzt eine Zeile des Baumes ausgeben. Ich würde jetzt noch Leerzeichen einfügen, so dass man die einzelnen Zahlen erkennt.
Außerdem würde ich das jetzt in eine Funktion packen, wo du nur noch die Zeilenzahl übergibst und die enxprechende Zeile dann Ausgegeben wird.

VG,

Karlito
Auf diesen Beitrag antworten »
JKU11

Habs jetzt so versucht, kommt aber ganz was anderes raus.

int n,x;
int b=2;
n=Input.readInt();
int y=n;
int a=(2*n)-1;
int c=(int)(Math.pow(2.0, n));
int [] Zeile;
Zeile = new int[a];

for (int z=0; z<=y; z++) {
for (int i=0; i<=n-1;i++) {
Zeile[i]=b;
System.out.print(b +" ");
b=b*2;
}
for (x=n-1; x>=1Augenzwinkern {
c=(int)(c-Math.pow(2.0, x));
System.out.print(c+ " ");
x=x-1;
}
System.out.println();
n=n-1;
}
}
}

Hab grad keinen Plan wie ich das umsetzen soll.
Auf diesen Beitrag antworten »
Karlito

Du machst es dir zu schwer!

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
public class Pyr {

	public static void print_zeile(int n){
		int x;
		int b = 2;
		int a = (2 * n) - 1;
		int c = (int) (Math.pow(2.0, n));
		int[] Zeile;
		Zeile = new int[a];

		for (int i = 0; i <= n - 1; i++) {
			Zeile[i] = b;
			System.out.print(b+ " ");
			b = b * 2;
		}
		for (x = n - 1; x >= 1;) {
			c = (int) (c - Math.pow(2.0, x));
			System.out.print(c + " ");
			x = x - 1;
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		int n;
		
		n = 5;
		
		for(int c = 1; c<=n; c++){
			print_zeile(c);
		}
	}
}
Auf diesen Beitrag antworten »
JKU11 RE: Wheinachtsbaum

Ah vielen Dank!

Naja das mit den statischen Variablen war mir bisher neu.

Frage: Wozu steht das int n in public static void print_zeile(int n)?
Und was genau sagt das print_zeile(c); aus?

Sorry für die Fragen im Inet hab ich nichts Verständliches gefunden.
Auf diesen Beitrag antworten »
Karlito RE: Wheinachtsbaum

Zitat:
Original von JKU11
Naja das mit den statischen Variablen war mir bisher neu.


Was genau meinst du mit statischen Variablen?

Zitat:
Original von JKU11
Frage: Wozu steht das int n in public static void print_zeile(int n)?


Das n ist ein Parameter. Er wird verlangt, wenn man die Funktion print_zeile aufruft.

Zitat:
Original von JKU11
Und was genau sagt das print_zeile(c); aus?


Rufe die Funktion print_zeile() mit dem Wert von c als Parameter auf.

VG,

Karlito
Auf diesen Beitrag antworten »
JKU11 RE: Wheinachtsbaum

Hab nach dem ausdruck gegoogelt und bin iwie auf statische variablen gekommen. smile

Mir ist noch nicht ganz klar was jetzt genau die absteigende Form der Pyramide im code ausmacht.

Warum wird das n in public static void print_zeile.. nicht benötigt. Dachte der Compiler läuft von oben nach unten das Progaramm ab?
Auf diesen Beitrag antworten »
Karlito

Es ist wenn dann eine statische Funktion, keine statische Variable. Was das zu bedeuten hat, wirst du irgendwann noch erfahren. Fürs erste: normalerweise musst du für die Benutzung von Funktionen in einer Klasse immer Objekte dieser Klasse instanziieren. Bei statischen Methoden braucht man das nicht.

Wie der Compiler das Programm abgeht ist erst einmal egal. Die Frage ist, wie das Programm abgearbeitet wird. Bei Java ist es so, dass der Einstieg immer die main ist. Von da aus wird das Programm Zeile für Zeile abgegangen. Bei Schleifen ist Klar, dass der Verlauf nicht linear ist. In der Schleife wird die Funktion print_zeile aufgerufen und komplett abgearbeitet.

In print_zeile wird das n weiterhin benötigt. Der Wert von n wird durch den Aufruf der Funktion festgelegt. (Der Parameter)

VG,

Karlito
Auf diesen Beitrag antworten »
JKU11

Vielen Dank, sehr verständlich erklärt!

Habe jetzt beide Funktionen separat ausgeführt.

Bei public static void print_zeile als main funktion werden ja nur die Zahlen in einer Zeile ausgeführt: 2 4 8 4 2 zb.

Bei

public class Zeile {
public static void main(String[] args) {
int n;
System.out.println("Input: ");
n=Input.readInt();

for(int c = 1; c<=n; c++){
System.out.print("1");

werden alle 1 in der Zeile ausgegeben.

Wie kommt man dann zu dem "halben Berg" als Output?
Auf diesen Beitrag antworten »
Karlito

Ich verstehe leider nicht, was du zu erreichen versuchst und was deine Frage ist.
Auf diesen Beitrag antworten »
JKU11

Würd gern genau wissen wie die halbe Pyramide im Ouput entsteht:

2
242
24842 ..

Mir is schon klar mit dem Code, den du mir gegeben hast. Das Einzige was mir nicht klar ist, mit welcher Funktion erreicht wird das um in jeder Zeile 2 Werte dazukommen.

Hoffe ich konnte es dir verständlich erklären großes Grinsen
Auf diesen Beitrag antworten »
Karlito

Na jede Zeile wird durch die Funktion print_zeile erzeugt.

print_zeile(1) erzeugt 2
print_zeile(2) erzeugt 242
print_zeile(3) erzeugt 24842

usw.

Die Aufrufe mit den aufsteigenden Werten werden in der Schleife in der main erzeugt.

Passe doch mal den Schleifenkopf der for-Schleife an und schau was passiert...

VG,

Karlito
Auf diesen Beitrag antworten »
JKU11

In der main wird im ersten Durchlauf c mit 1 initialisiert, im zweiten Durchlauf mit 2 usw. Wie weiß dann die Funktion print_Zeile das sie nur 2 und nicht 2 4 8 16 8 4 2 ausgeben soll?

Beste Güße
Auf diesen Beitrag antworten »
Karlito

Das c aus der Schleife wird dem n in der Funktion zugewiesen. Das passiert bei dem Funktionsaufruf in Zeile 30.

Stell es dir vor wie in der Mathematik mit Funktionen. Wenn du sagst
[latex]<br />
f(x) = x^2<br />
[/latex]

Hast du definiert, was die Funktion macht. Sie gibt das Quadrat zurück.

Diese Defintion findest du in Zeile 3 bis 22.

In Zeile 30 passiert das, was passieren würde, wenn man, wie in der Mathematik, die Funktion "aufruft". Angenommen ich möchte wissen, was das quadrat von 5 ist. Dann rufe ich [latex]f(x)[/latex] mit [latex]x:=5[/latex] auf und erhalte 25.

Würde ich nun wollen, dass alle quadrate von 1-5 ausgegeben werden, machte ich das in einer Schleife und nehme eine Variable zur Hilfe, welche ich immer erhöhe. Also:

code:
1:
2:
3:
4:
5:
for(int c = 1; c<=5;c++){
 f(c);
}


So gibt [latex]f(c)[/latex] immer das Quadrat von c zurück. Bemerkenswert ist hier, dass sich der Name der Variable von Deklaration und Aufruf unterscheiden. Ich habe definiert, dass [latex]f(x)=x^2[/latex] und frage nach [latex]f(c)[/latex], wobei c einen bestimmten Wert hat. Genauso funktioniert das mit der print_zeile. Der Übergebene Parameter beeinflusst die Ausgabe.

VG,

Karlito
Auf diesen Beitrag antworten »
JKU11

Jetzt ist mir einiges klar geworden smile

Dachte zuerst, dass das print_zeile(c) eine Augabemethode wie system.out.print ist.

Wegen den einrückungen soll ich ja printf verwenden.

Also:
......2
....2 4 2
2 4 8 4 2

Gibts da ne bestimmte printf Funktion ?
Auf diesen Beitrag antworten »
Karlito

Nicht dass ich wüsste. Schau dir mal folgenden Link an:
http://www.java-forum.org/java-basics-an...k-ausgeben.html

Edit: Dass deine Zahlen unterschiedlich breit sind, wird sicher ein Problem. Vlt ist es günstig bis zur Mitte rechtsbündig auszugeben und danach linksbündig...

VG,

Karlito
Auf diesen Beitrag antworten »
JKU11

Ok da muss ich mich noch einarbeiten. Vielen Dank für die Hilfe smile
Auf diesen Beitrag antworten »
Karlito

Bitte, gerne!

VG,

Karlito
 
Neue Frage »
Antworten »


Verwandte Themen