# Pyramide auf Konsole ausgeben? Leerzeichen-Problem!



## puschelemo21 (12. Nov 2011)

Hi,
ich soll ne Pyramide ausgeben und hab die mit for-schleife schon realisiert.
ich bekomm nur kein Leerzeichen rein weil dann gitbs Fehler


```
public class Aufg5a {
public static void main(String[] args) {
final char wert='+';
char leer= ' ';
int zaehler;
 {
 for (zaehler = 1; zaehler<= 4; zaehler = zaehler + 1)
       System.out.print (wert);
       System.out.println (wert);
       for (zaehler = 2; zaehler <= 3; zaehler = zaehler + 1)
                System.out.print(wert );
                System.out.println (wert);
           for (zaehler = 3; zaehler == 3; zaehler = zaehler + 1)
                System.out.println (wert);
       }
  {
 for (zaehler = 2; zaehler<= 3; zaehler = zaehler + 1)
       System.out.print (wert);
       System.out.println (wert);
       for (zaehler = 1; zaehler <= 4; zaehler = zaehler + 1)
                System.out.print(wert );
                System.out.println (wert);

       }


}
}
```
 also in der zweiten Zeile ein Leerzeichen vor der Ausgabe un in dritten 2 in der vierten wieder 1 dann wird es ne Sanduhr aber wenn ich die Variable schreib dann schreibt er mir die Werte getrennt  Hoffe jemand kann mir helfen


----------



## ARadauer (12. Nov 2011)

mhn das ist wohl nicht Sinn der Sache. Ich denke eher dass die aufgabenstellung die ist, dass du die Breite der Pyramide eingibst und diese automatisch gezeichnet wird. Was du machst ist dass du einfach für jede Zeile eine For Schleife machst die mehr oder weniger absichtlich eine Anzahl von + ausgibt.

Wie soll denn das Ergebnis aussehen?

Ich würde auch bei jeder for Schleife die Klammern schreiben. Dann wird es übersichtlicher


----------



## puschelemo (12. Nov 2011)

habs erledigt hab vor der nächsten for-schleife einfach system.out.print  (" "); gehaun ^^nun hängts bei 'While-schleife.. dreckeck is gleichschenklig runter


----------



## Camill (12. Nov 2011)

Hab dein Code mal ein wenig formatiert:

```
public class Aufg5a {
	
	public static void main(String[] args) {
		
		final char wert='+';
		int zaehler;
		
		{
			for(zaehler = 1; zaehler <= 4; zaehler++)
				System.out.print(wert);
			
			System.out.println(wert);
			
			for(zaehler = 2; zaehler <= 3; zaehler++)
				System.out.print(wert);
			
			System.out.println(wert);
			
			for(zaehler = 3; zaehler == 3; zaehler++)
				System.out.println(wert);
		}
		
		{
			for(zaehler = 2; zaehler <= 3; zaehler++)
				System.out.print(wert);
			
			System.out.println(wert);
			
			for(zaehler = 1; zaehler <= 4; zaehler++)
				System.out.print(wert);
			
			System.out.println(wert);
		}
	}
}
```

Wo genau liegt nun das Problem, sehe keine while-Schleife(Wie lautet die Aufgabe)? Außerdem für was setzt du überflüssige Klammern(Zeile 8, 21, 23, 33)?


----------



## puschelemo21 (13. Nov 2011)

das problem is wie bau ich die while-schleife ich habs jetzt mit FOR realisiert mit WHILE hab ich das nu

```
// Konstanten
int zaehler = 1; // Schrittweite
final char wert='+';


// als Anfangswert wird fahr
// der Wert 0 zugewiesen
while (zaehler<= 5)
{
System.out.print (wert);
zaehler++;
System.out.print(" ");
break;
```
ausgabe 1 zeichen zaehler wird NICHT hochgezählt. mit FOR isses einfacher aber ich muss es eben auch mit while realisieren >.<


----------



## Camill (13. Nov 2011)

Etwas mehr Angaben wären schön, wie breit soll die Pyramide denn sein ?


----------



## puschelemo21 (13. Nov 2011)

+++++
_+++ 
__+ 

_ sollte leerzeichen sein.
so sollte sie aussehen


----------



## Camill (13. Nov 2011)

Kann ich mir nicht vorstellen das dies die Aufgabe ist, wäre ja zu leicht:

```
while(true) {			
		System.out.println("+++++\n +++\n  +");
		break;
	}
```
Die while-Schleife ist völlig überflüssig aber sollte ja laut deiner Aufgabenstellung vorkommen.


----------



## puschelemo21 (13. Nov 2011)

das is die aufgabe nur mit dem dreieck rückwärts rum (for-schleife) dasselbe muss ich halt auch mit while machen :/
kann dir ja den Text posten ^^



    Schreiben Sie ein kleines Programm, das auf dem Bildschirm ein Dreieck von folgender Form erzeugt.

    +++++
     +++ 
      + 

    Die Seitenlänge des Dreiecks (erste Zeile) sowie das Füllzeichen (hier +) sollen am Anfang des Programms als Konstante festgelegt werden.
    Realisieren Sie die Aufgabe mit mind. 2 Schleifentypen und vergleichen Sie das Ergebnis. Welcher Schleifentyp erscheint Ihnen hier am besten geeignet?

    Erweitern Sie nun das Programm so, dass ein "Stundenglas" von folgender Form entsteht.


----------



## Camill (13. Nov 2011)

Na dann entspricht die Aufgabe wohl doch dem Gedanken von "ARadauer", die breite soll am Anfang des Programm festgelegt werden.


----------



## puschelemo21 (13. Nov 2011)

ich bin Anfänger in der Programmierung und weis langsam echt nicht mehr weiter das macht mich so richtig fertig das der prof...von klein auf gleich 10 geht... ......... ich hab noch nichtma die vorherige Aufgabe abgegeben weil mehrere Leute nicht mitkommen und ich nicht mehr weis was ich noch tun soll..... ;(


----------



## Camill (13. Nov 2011)

So, hier hast du mal ein Beispiel wie das ganze mit for-Schleifen aussehen kann(breite kann nun auch verändert werden):

```
final int BREITE = 5;
	final char ZEICHEN = '+';
	int lines;
	
	//calculate number of lines
	if(BREITE % 2 == 1) {
		lines = (BREITE - 1) / 2 + 1;			
	} else {
		lines = BREITE / 2;			
	}
	
	//draw pyramid
	for(int i = 0; i < lines; i++) {
		
		//whitespace
		for(int j = 0; j < i; j++) {
			System.out.print(" ");
		}
		
		//print out character
		for(int j = 0; j < BREITE - (i * 2); j++) {
			System.out.print(ZEICHEN);
		}
		
		System.out.println();
	}
```

Hoffe das es zu verstehen ist.


----------



## puschelemo21 (14. Nov 2011)

danke aber funktioniert nicht so wie die Ausgabe und dasselbe Konstrukt brauch ich mit while und da verzweifel ich am meisten


----------



## ARadauer (14. Nov 2011)

puschelemo21 hat gesagt.:


> ich bin Anfänger in der Programmierung und weis langsam echt nicht mehr weiter das macht mich so richtig fertig das der prof...von klein auf gleich 10 geht... ......... ich hab noch nichtma die vorherige Aufgabe abgegeben weil mehrere Leute nicht mitkommen und ich nicht mehr weis was ich noch tun soll..... ;(



Leute Leute! Das sind normale Anfänger Beispiele die am Anfang des ersten Semesters gegeben werden. Diese Pyramide hat jeder von uns schon mal geschrieben. Das ist ein standard Beispiel! Von klein gleich auf 10? Wenn du wüsstes was da noch kommt ;-) Also aufhören dich selbst zu bemitleiden. Das wird schon!

Um was gehts? Es geht darum aufgrund der Breite der Pyramide i, die Anzahl der Leerzeichen die vorher stehen müssen zu errechnen.
for(int i = 1; i < höhe; i=i+2){
 hier jetzt breite errechnen..

Ob das Teil jetzt mit while oder verkehrt ist, wurscht... dann muss man sich einfach aunschaun was while macht.


----------



## puschelemo21 (14. Nov 2011)

aber man kann ja while nicht verschachteln... 
trotzdem thx. und ich bemitleide mich nicht nur ich rast jetz dann aus und dann lauf ich wirklich AMOK


meine for-schleife macht nun auch was ich will o.o

```
public class Aufg5a {
public static void main(String[] args) {
final char wert='+';
int zaehler;
 {
 for (zaehler = 1; zaehler<= 4; zaehler = zaehler + 1)
       System.out.print (wert);
       System.out.println (wert);
       System.out.print(" ");
       for (zaehler = 2; zaehler <= 3; zaehler = zaehler + 1)

                System.out.print(wert);
                System.out.println (wert);
                System.out.print("  ");
           for (zaehler = 3; zaehler == 3; zaehler = zaehler + 1)

                System.out.println (wert);
                System.out.print(" ");
       }
  {
 for (zaehler = 2; zaehler<= 3; zaehler = zaehler + 1)
       System.out.print (wert);
       System.out.println (wert);
       for (zaehler = 1; zaehler <= 4; zaehler = zaehler + 1)
                System.out.print(wert );
                System.out.println (wert);

       }
}
}
```


----------



## puschelemo21 (14. Nov 2011)

also mit While hab ich folgendes:

```
// Konstanten
int zaehler = 1; // Schrittweite
final char wert='+';
while (zaehler<= 5)
{
System.out.print (wert);
zaehler++;
         while(zaehler<=3)
         {
          System.out.print(" ");
          System.out.println (wert);
          zaehler++;
         }

}
}
}
```
 die Ausgabe sieht so aus:   
+_+
_+
++       die _ stellen wieder die Leerzeichen dar aber ich soll ja die selbe Ausgabe wie for-Schleife bekommen?!


----------



## Michael... (14. Nov 2011)

Ich kenne zwar die genaue Aufgabenstellung nicht, aber ich vermute mal, dass Deine "Lösung" mit den for-Schleifen vom Lehrer nicht aktzeptiert werden wird.

Das Problem mit der Abbildung einer for-Schleife in eine while verstehe ich nicht.

```
for (int i=0; i<n; i++) {
    //mach was
}
```
entspricht einfach nur:

```
int i = 0;
while(i<n) {
    //mach was
    i++;
}
```


----------



## ARadauer (14. Nov 2011)

for (zaehler = 1; zaehler<= 4; zaehler = zaehler + 1)
for (zaehler = 2; zaehler <= 3; zaehler = zaehler + 1)
das wird nicht stimmen.
da kannst gleich schon einen zettel mit pyramide abgeben.

hör auf irgendwie rum zu probieren und überleg dir wie viele leer zeichen und x du in der ersten zeile bei einer 5 zeichen hohen pyramide machen musst.
dann in der 2. 3. 4. 5. zeile und dann versuchst du das in eine formel zu packen und machst eine schleife...


----------



## ARadauer (14. Nov 2011)

ok kleine hilfestellung


```
public class Pyramide {

	
	public static void main(String[] args) {
		int höhe =8;
		
		for(int i = 0; i < höhe; i++){
			int x =// wie viele X?
			int leer = // wie viele leerzeichen?
			printZeichen(leer, ' ');
			printZeichen(x, 'X');
			System.out.println();
		}
	}
	
	public  static  void printZeichen(int anzahl, char zeichen){
		for(int i =0; i < anzahl; i++){
			System.out.print(zeichen);
		}
	}
}
```

Lösung in ganz klein:
int x = i*2+1;
int leer = höhe-1-i;

das selbe mit while


```
public class Pyramide {

	
	public static void main(String[] args) {
		int höhe =3;
		
		int i =0;
		while(i< höhe){			
			int x =//das musst du machen
			int leer = // nicht schwer
			printZeichen(leer, ' ');
			printZeichen(x, 'X');
			System.out.println();
			i++;
		}
	}
	
	public  static  void printZeichen(int anzahl, char zeichen){
		while(anzahl >0){
			anzahl--;
			
			System.out.print(zeichen);
		}
	}
}
```


----------



## Camill (14. Nov 2011)

puschelemo21 hat gesagt.:


> danke aber funktioniert nicht so wie die Ausgabe und dasselbe Konstrukt brauch ich mit while und da verzweifel ich am meisten



"funktioniert nicht" - sehr Informationsreich
Was genau funktioniert denn an dem von mir geschriebenen Code nicht? Fehlermeldungen?


----------



## puschelemo21 (15. Nov 2011)

ahhh okay aber sie sollte andersrum sein  naja das krieg ich hin. Danke das is echt eine leichte Lösung aber ich denk manchmal um 3 Ecken zu kompliziert.


----------

