# Ausgabe von Sternen



## elias12 (8. Jun 2010)

Hallo zusammen

mein Programm soll Folgenden Output erzeugen

Beispiel mit 5 Zeilen
Anzahl der Zeilen:5


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


```
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


----------



## Eldorado (8. Jun 2010)

So würde ich es lösen:


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

mfg 
Eldorado


----------



## ARadauer (8. Jun 2010)

> char b ='*';
> for (b = 2 ; a>=b; b='*')


ist b jetzt 2 oder * ???

Ließ das mal uns setze für a und b die Werte eine die sie gerade haben...


----------



## Wortraum (8. Jun 2010)

Eldorado hat gesagt.:


> So würde ich es lösen:
> 
> […]
> 
> ...


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!  )


```
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:

```
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.

```
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.


----------



## eRaaaa (8. Jun 2010)

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 !


----------



## Wortraum (8. Jun 2010)

eRaaaa hat gesagt.:


> 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!


----------



## elias12 (8. Jun 2010)

Hallo alle

Danke für Eure Tipps werde ich mal aschauen und ein bisschen durchprobieren


----------



## aumaster (9. Jun 2010)

Hi,

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

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


```
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:


```
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


----------



## Landei (9. Jun 2010)

Eine Lösung mit einer Schleife:

```
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!


----------



## Shulyn (9. Jun 2010)

Landei hat gesagt.:


> Eine Lösung mit einer Schleife:
> 
> ```
> public static void sterne(int zeilen) {
> ...



Geschickter einsatz von Primzahlen...


----------



## Landei (9. Jun 2010)

Nö.


----------



## Shulyn (9. Jun 2010)

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


----------



## Landei (9. Jun 2010)

Immer wenn (1+8*i) eine Quadratzahl ist, ist i eine Dreieckszahl.


----------



## Daniel_L (9. Jun 2010)

aumaster hat gesagt.:


> ```
> String starString = "";
> for (int i = 1; i < 6; ++i) {
> while (starString.length() < i) {
> ...



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



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


----------



## Wortraum (9. Jun 2010)

aumaster hat gesagt.:


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


Ich hätte sie „unnötig verwirrend“ genannt. 



Daniel_L hat gesagt.:


> 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.


----------



## Landei (9. Jun 2010)

Und weil das so ein interessantes Thema ist, einmal ganz ohne Schleife:


```
public static String sterne(int n) {
        String result = n == 0 ? "" : sterne(n-1) + "*";
        System.out.println(result);
        return result;
    }
```


----------



## Landei (9. Jun 2010)

Aber natürlich ist so ein String mit Sternen äußerst nützlich, da sollten wir diese Funktionalität in eine extra Methode auslagern...

```
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) ? "*" : "");
   }
```


----------



## Shulyn (15. Jun 2010)

Landei hat gesagt.:


> Immer wenn (1+8*i) eine Quadratzahl ist, ist i eine Dreieckszahl.



Wieder was gelernt 
Werde ich ab jetzt immer "versuchen" einzubauen ^^


----------



## Landei (15. Jun 2010)

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.


----------



## El Kabong (13. Aug 2010)

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:


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


```
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:


```
*
   *
   *
    *
```

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


Gruß,
El Kabong


----------



## SlaterB (13. Aug 2010)

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


----------



## Gast2 (13. Aug 2010)

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:


```
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("*");
        }
    }
```


----------



## El Kabong (13. Aug 2010)

SlaterB hat gesagt.:


> 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



Arrrgh, die zweite Ausgabe war der Fehler. Danke.


----------

