Lösungsansatz für Aufgabe gesucht.

moccajoghurt

Bekanntes Mitglied
Arbeite immernoch an den Aufgaben meines Java-Kurses und habe bei folgender einfach keine Idee, wie ich sie lösen könnte:

Aufgabe 7:
Schreiben Sie ein Java-Programm, das nach Eingabe einer ungeraden Natürlichen Zahl „basislaenge“ ein Sterndreieck auf den Bildschirm ausgibt. Die unterste Reihe soll dabei aus „basislaenge“ Sternchen bestehen. Beispielausgabe für „basislaenge == 9“:
Code:
    *
   ***
  *****
 *******
*********

Ich kenne bisher nur folgende Befehle (also sind nur diese für die Aufgabe vorgesehen): for, do, while, if, break, return, continue.

Brauche nicht unbedingt die Lösung, nur einen Denkanstoß 🙂
 
Java:
for (...) { // für alle Zeilen, welche auszugeben sind
    for (...) { // Leerzeichen ausgeben
        System.out.print(' ');
    }
    for (...) { // Sterne ausgeben
        System.out.print('*');
    }
    System.out.println();
}
 
Such doch mal nach einem Muster:

Wenn basislänge gegeben ist, kannst du
-die Anzahl der Zeilen bestimmen: numberOfRows=basislänge/2+1
-die Anzahl der Sterne pro Zeile (die 1. Zeile hat Nummer 0) bestimmen: numberOfStarsInRow=1+numberOfRow*2
-die Anzahl der Leerzeichen pro Zeile bestimmen: numberOfSpaces=numberOfRows/2-numberOfRow
 
Oh mann, mein Kopf platzt... ich bekomm es nicht hin. Kann mir jemand die Lösung posten damit ich wenigstens nachvollziehen kann wie es gehen würde?
 
Also die von faetz ist doch schonmal ganz nett...

Jetzt musst du dir nurnoch überlegen, was in die Klammern kommt:

erstes for(...){ => Wieviele Zeilen brauchst du?
zweites for(...){ => Wieviele Leerzeilen brauchst du in der aktuellen Zeile? Hat was mit der Eingabe zu tun und wie weit du schon runter bist
drittes for(...){ => Hier dann die Anzahl der * malen, die für die aktuelle Zeile gelten
 
Eigentlich musst du nur meinen Code und agentone's Erläuterung zusammenbringen 😉
Nur folgendes ist nicht gaanz korrekt:
-die Anzahl der Leerzeichen pro Zeile bestimmen: numberOfSpaces=numberOfRows/2-numberOfRow
Das wär ganz einfach [c]numberOfRows - numberOfRow - 1[/c]
 
In deiner äußeren for-Schleife:
Java:
for(int numberOfRow = 0; numberOfRow < numberOfRows; numberOfRow++){
...
}
 
hier wär mein Ansatz (habs auch so ausprogrammiert, funktioniert):
angenommene Basislänge 9:
Anzahl Leerzeichen Anzahl Sterne
4 1
3 3
2 5
1 7
0 9

die Anzahl der Leerzeichen ist also (basis - 1) / 2 und muss pro Zeile um eins vermindert werden solange es größer gleich 0 ist
die Anzahl der Sterne beginnt immer mit 1 und muss immer um 2 erhöht werden.

Die Abbruchbedingung muss also lauten: solange anzahlLeerzeichen >= 0
 
Java:
int n = ...;

for (int i = 1; i <= n; i += 2) {
  // i = anzahl der Strenchen
  char[] davor = ...;
  char[] sternchen = ...;
  char[] danach = ...;
  // können mithilfe der Information i erstellt werden

  System.out.println(new String(davor) + new String(sternchen) + new String(danach));
}

// es müssen keine Zeilen mehr gedruckt werden
 
Java:
public class Test {
   public static void main(String[] args){int b  = 9;for(int i =0; 
   i < b/2+1; i++){za(" ", b/2-i);za("*", 1+i*2); so(
   "\n");}}public static void za(String z, int a){
    for(int i =0; i < a; i++)so(z);}public static void
    so(String s){System.out.print(s);}
}
 
Wie wäre es damit:

Java:
   public static void pyramid(int length) {
       char[] c = new char[length];
       java.util.Arrays.fill(c,' ');
       c[length/2] = '*';
       String s = new String(c);
       while(s.charAt(0) == ' ') {
           System.out.println(s);
           s = s.replace(" *", "**").replace("* ","**");
       }
       System.out.println(s);
   }

😛
 
Oh mann, mein Kopf platzt... ich bekomm es nicht hin. Kann mir jemand die Lösung posten damit ich wenigstens nachvollziehen kann wie es gehen würde?
hier zwei Varianten von mir:

Java:
 public static void var1(int basislaenge)
  {
  char [] buffer = new char[basislaenge];
  Arrays.fill(buffer, ' ');
  String leer = new String(buffer);
  Arrays.fill(buffer, '*');
  String sterne = new String(buffer);

  for(int i = 0; i < basislaenge/2+1; i++)
     System.out.println(leer.substring(0, basislaenge/2-i) +
                        sterne.substring(0, i*2+1));
  }

Java:
 public static void var3(int basislaenge) {
  int b = basislaenge+1;
  for(int i = b*(basislaenge/2+1)-1; i >= 0; i--)
     System.out.print(i%b == 0 ? '\n' : (i/b)<(i%b) && (i/b)<((i-1)%(b-1)) || i == 1 ? '*' : ' ' );
  }

Slawa
 
Ok also habe rumprobiert und der code ist jetzt eine Mischung aus "hab ich selbst gemacht und verstanden" und "wieso funktioniert das jetzt?"... leider ist die pyramide falsch rum (keine Ahnung wieso ;()
Das es nicht ganz korrekt ist, liegt wohl daran, dass ich noch nicht zu 100% verstanden habe wie eine for-schleife funktionert... (hatte sie bisher auch fast nie genutzt)

Java:
public class Sterndreieck {	
	public static void main(String[] args) {
		
		int sterne = IO.readInt("Sterne: ");
		int numberOfRows = sterne / 2 + 1;		
		
		for (int numberOfRow = 0; numberOfRow < numberOfRows; numberOfRow++){			
			for (int numberOfSpace = numberOfRows - numberOfRow; numberOfSpace <= numberOfRows; numberOfSpace++) {
				System.out.print(" ");
			}			
			for (int numberOfStars = 1 + numberOfRow * 2; numberOfStars <= sterne; numberOfStars++) {
				System.out.print("*");
				
			} System.out.println();	
		} 	
	}		
}
 
Zuletzt bearbeitet:
Java:
 public static void var3(int basislaenge) {
  int b = basislaenge+1;
  for(int i = b*(basislaenge/2+1)-1; i >= 0; i--)
     System.out.print(i%b == 0 ? '\n' : (i/b)<(i%b) && (i/b)<((i-1)%(b-1)) || i == 1 ? '*' : ' ' );
  }

Slawa

Findest du das lesbar oder für einen Anfänger geeignet? Etwas von Formatierung gehört? Nur zur Info: Er iteriert hier nicht über Zeilen, sondern über einzelne Zeichen.
 
Java:
   public static void pyramid1(int length) {
       for(int y = 0; y <= length / 2; y++) {
           for(int x = 0; x < length; x++) {
              System.out.print(x + y >= length / 2 && x - y <= length / 2 ? '*' : ' ');
           }
           System.out.println();
       }
   }
 
So hab es nochmal neu programmiert und diesmal ist es fehlerfrei. Danke an alle, die hilfreiche Antworten gegeben haben!

Java:
public class Sterndreieck {
	
	
	public static void main(String[] args) {
		
		int basis = IO.readInt("Basislaenge: ");
		int rows = basis / 2 + 1;
		
		for (int row = 0; row < rows; row++){
			
			for (int space = row; space <= rows; space++) {
				System.out.print(" ");
			}			
			for (int star = basis - row * 2; star <= basis; star++) {
				System.out.print("*");
			}			
			System.out.println();			
		} 		
	}
}
 

Zurück
Oben