Ausgabe von Sternen

elias12

Mitglied
Hallo zusammen

mein Programm soll Folgenden Output erzeugen

Beispiel mit 5 Zeilen
Anzahl der Zeilen:5


*
**
***
****
*****

Java:
package aufgabe425;

/**
 *
 * @author Elvis Altherr
 * Aufgabe aus Java Buch geschachtelte Schleifen mit * Ausgabe
 * Abfrage durch IOTools wieviel Zeilen ausgegeben werden sollen
 */
import static Prog1Tools.IOTools.*;
public class Main {


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
         int a;
         char b ='*';
         
         a = readInteger("AnzahlZeilen = ");
         System.out.println("Anzahl Zeilen"+ a);
         System.out.println();
         for (b = 2 ; a>=b; b='*')
             System.out.println('*'+b);
             
    }
}

Wie muss ich den obigen Code anpassen, dass aufgrund des Inputs durch den User, der dann die Anzahl Zeilen ergibt eben die Anzahl Sterne wie in einer Art Dreieck angeordnet werden

Danke für Eure Hilfe
 
So würde ich es lösen:

Java:
for(int i=0;i <= zeilenAnzahl;i++){
    System.out.println();
    for(int j=0;j < i;j++){
        System.out.print("*");
    }
}

mfg
Eldorado
 
Zuletzt bearbeitet:
So würde ich es lösen:

[…]

mfg
Eldorado
Ich so, weil ich es für besser lesbar halte, ich keine verschachtelten Schleifen mag und es um so schneller ist, je mehr Sterne angezeigt werden müssen.
(Natürlich kommt es bei diesem Programm auf Effizienz an! 😳 )

Java:
public static void main(String[] args) {    public static void main(String[] args) {
    int numLines = …
    for (int i = 1; i <= numLines; ++i) {
        System.out.println(getStars(i));
    }
}

public static char[] getStars(int numStars) {
    char result[] = new char[numStars];
    Arrays.fill(result, '*');
    return result;
}

Möglichkeiten gibt es aber viele. Man könnte sich auch erst einen String mit numLines Sternchen erstellen und dann hübsch in jeder Zeile mit substring den benötigen Teil herausschnippeln. Oder man nimmt sich gleich immer nur einen Teil aus einem char-Feld, so zum Beispiel:
Java:
public static void main(String[] args) {
    int numLines = 10;
    char stars[] = new char[numLines];
    Arrays.fill(stars, '*');
    for (int i = 1; i <= numLines; ++i) {
        System.out.println(new String(stars, 0, i));
    }
}
Oder man nimmt einen StringBuilder, kloppt bei jedem Schleifendurchlauf einen Stern dran und gibt den Inhalt aus. So ähnlich hatte es der Themenersteller wohl auch vor. Eigentlich eine gute Idee.
Java:
public static void main(String[] args) {
    int numLines = 10;
    StringBuilder sb = new StringBuilder(numLines);
    for (int i = 1; i <= numLines; ++i) {
        sb.append('*');
        System.out.println(sb);
    }
}
So, das reicht nun aber. 🙂
 
Zuletzt bearbeitet:
Mhm moment, übersehe ich jetzt was? Dein Code ist doch fast gleich zu dem von Eldorado, nur dass du eben die zweite Schleife versteckst(fill macht doch auch nichts anderes) ?

Mag aber auch sein dass ich da jetzt was übersehe, immerhin sehe ich auch schon main-Methoden doppelt *g*

/edit: Okay, klingt durch aus plausibel !
 
Zuletzt bearbeitet:
Mhm moment, übersehe ich jetzt was? Dein Code ist doch fast gleich zu dem von Eldorado, nur dass du eben die zweite Schleife versteckst(fill macht doch auch nichts anderes) ?
Arrays.fill ist eben sehr viel schneller als die Ausgabe eines einzelnes Sternchens auf einer langsamen Konsole, selbst wenn ein Puffer dazwischen ist. Aber ich habe meinen Beitrag editiert und noch zwei andere Lösung hinzugefügt, die sich stärker unterscheiden. Ich möchte hier ja nicht des Plagiates beschuldigt werden! 😀
 
Zuletzt bearbeitet:
Hi,

ja kompliziert geht's immer... :autsch:

Hier mal zwei simple Lösungen für Dein Problem:

Java:
String starString = "";
for (int i = 1; i < 6; ++i) {
     while (starString.length() < i) {
         starString += "*";
     }
     System.out.println(starString);
}

Oder eine Variante, die mehr auf Geschwindigkeit getrimmt ist:

Java:
StringBuilder sb;
for (int i = 1; i < 6; ++i) {
     sb = new StringBuilder();
     while (sb.length() < i) {
          sb.append("*");
      }
     System.out.println(sb.toString());
}

Beides ergibt dann halt:

*
**
***
****
*****

Gruß, aumaster
 
Zuletzt bearbeitet:
Eine Lösung mit einer Schleife:
Java:
public static void sterne(int zeilen) {
    for(int i = 1; i <= zeilen*(zeilen+1)/2; i++) {
        int r = (int) Math.sqrt(1+8*i);
        System.out.print(r*r == 1+8*i ? "*\n" : "*");
    }
}

Wer erklären kann warum das funktioniert, bekommt eine Luftgitarre!
 
Zuletzt bearbeitet:
Eine Lösung mit einer Schleife:
Java:
public static void sterne(int zeilen) {
    for(int i = 1; i <= zeilen*(zeilen+1)/2; i++) {
        int r = (int) Math.sqrt(1+8*i);
        System.out.print(r*r == 1+8*i ? "*\n" : "*");
    }
}

Wer erklären kann warum das funktioniert, bekommt eine Luftgitarre!

Geschickter einsatz von Primzahlen...
 
hmm doch,
immer wenn (1+8*i) eine primzahl² ist, ist es das letzte zeichen in der aktuellen zeile...

gibt aber bestimmt einen namen dafür 😉
 
Java:
String starString = "";
for (int i = 1; i < 6; ++i) {
     while (starString.length() < i) {
         starString += "*";
     }
     System.out.println(starString);
}

Gruß, aumaster

Da starString und i gleichmäßig anwachsen, kann man sich hier die while-schleife auch sparen, oder nicht?


Java:
String starString = "";
for (int i = 1; i < 6; ++i) {
     starString += "*";
     System.out.println(starString);
}
 
Hier mal zwei simple Lösungen für Dein Problem:
Ich hätte sie „unnötig verwirrend“ genannt. 😉

Da starString und i gleichmäßig anwachsen, kann man sich hier die while-schleife auch sparen, oder nicht?
Ja, und im zweiten Beispiel ebenfalls, ebenso bei jedem Schleifendurchlauf die Erzeugung eines neuen StringBuilders. Aber wozu die vielen Worte: vor etwa 24 Stunden schrieb ich die Lösung bereits hier hinein.
 
Und weil das so ein interessantes Thema ist, einmal ganz ohne Schleife:

Java:
    public static String sterne(int n) {
        String result = n == 0 ? "" : sterne(n-1) + "*";
        System.out.println(result);
        return result;
    }
 
Aber natürlich ist so ein String mit Sternen äußerst nützlich, da sollten wir diese Funktionalität in eine extra Methode auslagern...
Java:
   public static void stars(int n) {
       if (n > 1) stars(n-1);
       System.out.println(line(n));
   }

   public static String line(int n) {
       String s = n == 0 ? "" : line(n/2);
       return s + s + ((n % 2 == 1) ? "*" : "");
   }
 
Bitte nicht! Jede "normale" Lösung geht zeilenweise vor, und so eine Lösung wird auch normalerweise erwartet. Mein Code druckt alle nötigen Sterne aus und streut nach einer mysteriösen Formel an den richtigen Stellen Zeilenumbrüche ein. Es ist immer bedenklich, wenn man versucht, "zu clever" zu programmieren, der obige Code ist nur als Scherz und kleines Rätsel gedacht.
 
Hallo!

Ich wollte jetzt extra wegen meinem kleinen Problem kein neues Thema aufmachen. Mein Problem ist das ich eine Ausgabe in folgender Form haben möchte:

Code:
* 
  *
    *
      *
Bei mir sieht das aber eher so aus als ob die Sterne besoffen wären.

Java:
public class Sterne {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

                String s = "*";
		for (int i = 1; i <= n; i++) {
			System.out.println(s);
			s = " " + s;

                        System.out.println(s);
            }
    }
}

Meine Ausgabe sieht allerdings so aus:

Java:
 *
   *
   *
    *

Liegt der Fehler jetzt in der for-Schleife oder muss ich irgendwo noch ein Leerzeichen einfügen?


Gruß,
El Kabong
 
Zuletzt bearbeitet:
du hast doch nur 3-4 Code-Zeilen, probiere bisschen aus,
zweimal System.out.println(), also zwei Ausgaben pro Schleifendurchlauf scheinen in jedem Fall eine zuviel
 
du fügst ja auch immer ein Leerzeichen vorne dran.
Eine Ausgabe wie du in deinem Post geschildert hast bekommst du doch ganz einfach so:

Java:
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

        for (int i = 0; i < n; i++) {
            System.out.println("*");
        }
    }
 

Zurück
Oben