# Array, geschachtelte For-Schleifen



## OPMajor (13. Nov 2017)

Hi Leute

ich möchte eine Methode schreiben, der ein int-Array übergeben wird.
Es soll folgende Ausgabe bei {1,3,4,5,8,13,0,7,2,4,18} erzeugen:
siehe Bild.
Ich soll *2 ineinander geschachtelte For-Schleifen* benutzen.
Mein Anfang:



```
public class H {
  public static void main(String[] args) {
  
    int [] array1 = {1,3,4,5,8,13,0,7,2,4,18};
  
  }
  public static int printHisto(int[] array){
    
  
    for (int i = 0 ; i<array.length -1 ; i++ ) {
       switch ()
    }
  }
```

Ich brauche doch eine Switch-Bedingung, oder?


----------



## truesoul (14. Nov 2017)

Hallo,

also das kannst du ganz simple mit einer if Bedingung Lösung und zwei schleifen.
Du musst erstmal die größte Zahl im Array finden und diese verwendest du für die äußere Schleife (absteigend).
In der inneren Schleifen iterierst du über das Array und verwendest einen Wert aus dem Array mit dem Wert *for(int i = 0; .....)* der äußeren schleife.

Verwendest solltest du System.out.print und System.out.println.

Grüße


----------



## OPMajor (14. Nov 2017)

So in etwa?
Und wo genau kommt die if-Bedingung hin?


```
public class H {
  public static void main(String[] args) {
   
    int [] array1 = {1,3,4,5,8,13,0,7,2,4,18};
    printHisto(array1);
   
  }
  public static int printHisto(int[] array){
     
   
    for (int i = 18 ; i<array.length -1 ; i-- ) {
       for (int j=0;j<i;j++) {
    }
       
    }return;
  }
}
```


----------



## truesoul (14. Nov 2017)

Ja fast.

Die erste Schleife sollte immer größer als 0 sein.
Die zweite sollte solange gehen wie das array lang ist.

und dann in der zweiten Schleife die Bedingung reinpacken und dementsprechend ein Stern oder Leerzeichen ausgeben in der Zeile ohne Umbruch.

If Bedingung sollte in etwa so lauten: 

Ist der Wert aus dem Array größer-gleich als der aus der variablen der äußeren Schleife


----------



## OPMajor (14. Nov 2017)

Danke.
Bei mir kommt leider ein Fehler:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 18
   at H.printHisto(H.java:14)
   at H.main(H.java:6)


```
public class H {
  public static void main(String[] args) {
   
    int [] array1 = {1,3,4,5,8,13,0,7,2,4,18};
    printHisto(array1);
   
  }
  public static void printHisto(int[] array){
     
   
    for (int i = 18 ; i>0  ; i-- ) {
       for (int j=0;j<=array.length;j++) {
           if(array[i]>=i) {
               System.out.println("*");
           }
    }
       
    }
  }
}
```


----------



## truesoul (14. Nov 2017)

_Du solltest mit j über das Array iterieren. 
und nicht <= sonder < 

Und du musst noch ein else einbauen mit einen Leerzeichen. 
Nach der Inneren Schleife sollte ein println hin._


----------



## temi (14. Nov 2017)

Wieviele Elemente hat dein Array? Wirklich 18?


----------



## OPMajor (14. Nov 2017)

Das ist noch irgendwas falsch, oder?


```
public class H {
  public static void main(String[] args) {
  
    int [] array1 = {1,3,4,5,8,13,0,7,2,4,18};
    printHisto(array1);
  
  }
  public static void printHisto(int[] array){
    
  
    for (int i = 18 ; i>0  ; i-- ) {
       for (int j=0;j<=array.length;j++) {
           System.out.println("*");
      
           if(array[j]<i) {
               System.out.println("*");
           }else {System.out.println(" ");
    }
      
    }
  }
  }
}
```


----------



## OPMajor (14. Nov 2017)

temi hat gesagt.:


> Wieviele Elemente hat dein Array? Wirklich 18?


Das Array hat 11 Elemente. Muss ich das im Code irgendwie kenntlich machen?


----------



## Robat (14. Nov 2017)

OPMajor hat gesagt.:


> *if*(array[j]<i) {


Überleg noch mal ob das wirklich deine Bedingung ist um ein * zu schreiben


----------



## truesoul (14. Nov 2017)

truesoul hat gesagt.:


> Ist der Wert aus dem Array größer-gleich als der aus der variablen der äußeren Schleife



Dies 
	
	
	
	





```
System.out.println("*");
```
 kann da weg. 
Vor der inneren Schleife gibst du i mit println aus. 
Nach der inneren Schleife gibst du ein println aus. 
Und das 
	
	
	
	





```
j<=array.length
```
 sollte so 
	
	
	
	





```
j<array.length
```
 lauten.


----------



## truesoul (14. Nov 2017)

Und die 18 könntest du herausfinden in dem du eine Methode implementierst die durch das Array geht und dir den größten Wert zurück gibt. 

Dazu speicherst du am besten den aktuellen Wert in einer Variable und prüfst immer mit dem nächsten Wert aus dem Array.


----------



## temi (14. Nov 2017)

OPMajor hat gesagt.:


> Das Array hat 11 Elemente. Muss ich das im Code irgendwie kenntlich machen?


Das sollte dich dazu anregen selbst darüber nachzudenken, wo der Fehler liegen könnte. Die Meldung sagt schließlich ziemlich wörtlich aus, dass du auf einen Index zugreifen möchtest, den es bei deinem Array nicht gibt.


----------



## OPMajor (14. Nov 2017)

Robat hat gesagt.:


> Überleg noch mal ob das wirklich deine Bedingung ist um ein * zu schreiben


if(array[j]<=i), richtig?


----------



## truesoul (14. Nov 2017)

OPMajor hat gesagt.:


> if(array[j]<=i), richtig?



Siehe nochmal Post #4


----------



## OPMajor (14. Nov 2017)

temi hat gesagt.:


> Das sollte dich dazu anregen selbst darüber nachzudenken, wo der Fehler liegen könnte. Die Meldung sagt schließlich ziemlich wörtlich aus, dass du auf einen Index zugreifen möchtest, den es bei deinem Array nicht gibt.


Danke,
for (int j=0;j<=array.length-1;j++)

Jetzt müssen nur noch die Sterne an der richtigen Position sein und Anzahl pro Line größer werden.
Ich versuchs mal.


----------



## OPMajor (14. Nov 2017)

Wieso wiederholen sich die Zahlen bei der Konsolenausgabe?


```
public class H {
  public static void main(String[] args) {
  
    int [] array1 = {1,3,4,5,8,13,0,7,2,4,18};
    printHisto(array1);
  
  }
  public static void printHisto(int[] array){
    
  
    for (int i = 18 ; i>0  ; i-- ) {
       for (int j=0;j<array.length-1;j++) {
           System.out.println(i);
      
           if(array[j]>=i) {
               System.out.println("*");
           }else {System.out.println(" ");
    }
      
    }
  }
  }
}

Konsole
18
18
18
18
18
18
18
18
18
18
17
17
17
17
17
17
17
17
17
17
16
16
16
16
16
16
16
16
16
16
15
15
15
15
15
15
15
15
15
15
14
14
14
14
14
14
14
14
14
14
13
13
13
13
13
13
*
13
13
13
13
12
12
12
12
12
12
*
12
12
12
12
11
11
11
11
11
11
*
11
11
11
11
10
10
10
10
10
10
*
10
10
10
10
9
9
9
9
9
9
*
9
9
9
9
8
8
8
8
8
*
8
*
8
8
8
8
7
7
7
7
7
*
7
*
7
7
*
7
7
6
6
6
6
6
*
6
*
6
6
*
6
6
5
5
5
5
*
5
*
5
*
5
5
*
5
5
4
4
4
*
4
*
4
*
4
*
4
4
*
4
4
*
3
3
*
3
*
3
*
3
*
3
*
3
3
*
3
3
*
2
2
*
2
*
2
*
2
*
2
*
2
2
*
2
*
2
*
1
*
1
*
1
*
1
*
1
*
1
*
1
1
*
1
*
1
*
```


----------



## Robat (14. Nov 2017)

Weil du die Ausgabe der Zeilennummer in die innere for-Schleife gepackt hast


----------



## OPMajor (14. Nov 2017)

Danke, 
irgendwie passt die Anzahl der Sterne nicht.

```
public class H {
  public static void main(String[] args) {
   
    int [] array1 = {1,3,4,5,8,13,0,7,2,4,18};
    printHisto(array1);
   
  }
  public static void printHisto(int[] array){
     
   
    for (int i = 18 ; i>0  ; i-- ) {
       System.out.println(i);
       for (int j=0;j<array.length-1;j++) {
           System.out.println("*");
       
           if(array[j]>=i) {
               System.out.println("*");
           }else {System.out.println(" ");
    }
       
    }
  }
  }
}

Konsole
18
*
*
*
*
*
*
*
*
*
*
17
*
*
*
*
*
*
*
*
*
*
16
*
*
*
*
*
*
*
*
*
*
15
*
*
*
*
*
*
*
*
*
*
14
*
*
*
*
*
*
*
*
*
*
13
*
*
*
*
*
*
*
*
*
*
*
12
*
*
*
*
*
*
*
*
*
*
*
11
*
*
*
*
*
*
*
*
*
*
*
10
*
*
*
*
*
*
*
*
*
*
*
9
*
*
*
*
*
*
*
*
*
*
*
8
*
*
*
*
*
*
*
*
*
*
*
*
7
*
*
*
*
*
*
*
*
*
*
*
*
*
6
*
*
*
*
*
*
*
*
*
*
*
*
*
5
*
*
*
*
*
*
*
*
*
*
*
*
*
*
4
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
3
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
2
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
1
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
```


----------



## truesoul (14. Nov 2017)

Robat hat gesagt.:


> Weil du die Ausgabe der Zeilennummer in die innere for-Schleife gepackt hast



Siehe Zitat. 

Warum ist den wieder ein println(*) vor der Bedingung? Hat doch keiner erwähnt das es fehlt


----------



## truesoul (14. Nov 2017)

und println in der Bedingung ist auch falsch. print wäre da angebracht


----------



## truesoul (14. Nov 2017)

Pseudocode:


```
for i = groessteZahlImArray; i groeßer als 0; i um 1 reduzieren
    ausgabe i ohne zeilenumbruch
 
    for j = 0 ; j kleiner als array groeße;j um eins erhöhen
 
        wenn wert aus array[j] groeßer gleich i
            sternchen ausgabe ohne zeilenumbruch
        sonst
            leerzeichen ohne zeilenumbruch
 
    ausgabe mit zeichenumbruch

Ende äußere Schleife
```


----------



## OPMajor (14. Nov 2017)

Danke.
Muss ich noch mehrere Leerzeichen einfügen, damit die Sterne nach rechts wandern?



```
public class H {
  public static void main(String[] args) {
   
    int [] array1 = {1,3,4,5,8,13,0,7,2,4,18};
    printHisto(array1);
   
  }
  public static void printHisto(int[] array){
     
   
    for (int i = 18 ; i>0  ; i-- ) {
       System.out.print(i);
   
       for (int j=0;j<array.length;j++) {
           
       
           if(array[j]>=i) {
               System.out.print("*");
           }else {System.out.println(" ");
    }
       
    }
  }System.out.println(" ");
  }
}
Konsole
18
*17
*16
*15
*14
*13
*
*12
*
*11
*
*10
*
*9
*
*8
**
*7
**
*
*6
**
*
*5
***
*
*4
****
*
**3
*****
*
**2
*****
****1******
****
```


----------



## OPMajor (14. Nov 2017)

truesoul hat gesagt.:


> Siehe Zitat.
> 
> Warum ist den wieder ein println(*) vor der Bedingung? Hat doch keiner erwähnt das es fehlt


Ja, es hat sich irgendwie richtig angefühlt; war aber wohl nichts


----------



## truesoul (14. Nov 2017)

Weißt du was ein Zeilenumbruch ist? 

https://www.hpg-speyer.de/pdf/unterrichtsfaecher/informatik/printf.pdf


----------



## OPMajor (14. Nov 2017)

truesoul hat gesagt.:


> Weißt du was ein Zeilenumbruch ist?
> 
> https://www.hpg-speyer.de/pdf/unterrichtsfaecher/informatik/printf.pdf



Ja, also:System.out.print*ln*().
Das habe ich doch zum Schluss gemacht.


----------



## OPMajor (14. Nov 2017)

Achja; ich habe es in dem System.out.println davor vergessen das ln wegnzumachen.
Danke


----------



## truesoul (14. Nov 2017)

Dann lies nochmal den Pseudocode.


----------



## OPMajor (14. Nov 2017)

Bei der Ausgabe nach 10 ist noch eine Verschiebung, die nicht sein sollte.
Habe ich noch einen Fehler drin?

```
public class H {
  public static void main(String[] args) {
   
    int [] array1 = {1,3,4,5,8,13,0,7,2,4,18};
    printHisto(array1);
   
  }
  public static void printHisto(int[] array){
     
   
    for (int i = 18 ; i>0  ; i-- ) {
       System.out.print(i);
   
       for (int j=0;j<array.length;j++) {
           
       
           if(array[j]>=i) {
               System.out.print("*");
           }else {System.out.print(" ");
           }
       
    }System.out.println(" ");
  }
  }
}

Konsole
18          *
17          *
16          *
15          *
14          *
13     *    *
12     *    *
11     *    *
10     *    *
9     *    *
8    **    *
7    ** *  *
6    ** *  *
5   *** *  *
4  **** * **
3 ***** * **
2 ***** ****
1****** ****
```


----------



## truesoul (14. Nov 2017)

Die Zahlen die du ausgibst sind entweder 1-stellig oder 2-stellig.


----------



## Robat (14. Nov 2017)

Schau dir mal printf an und lass dir damit die Zeilennummer ausgeben. Dann hast du es schön formatiert. 
Bspw: System.out.printf(%2d ", i) ;


----------



## OPMajor (14. Nov 2017)

truesoul hat gesagt.:


> Die Zahlen die die ausgibst sind entweder 1-stellig oder 2-stellig.


Kann ich das irgendwie vermeiden(z.B. durch das Einfügen eines Leezeichens vor der einstelligen Zahl)?
Und es muss noch nach jeder Zahl ein ":" eingefügt werden.
Wie bekommt man das hin?


----------



## OPMajor (14. Nov 2017)

Robat hat gesagt.:


> Schau dir mal printf an und lass dir damit die Zeilennummer ausgeben. Dann hast du es schön formatiert.
> Bspw: System.out.printf(%2d ", i) ;


Danke, aber wir hatten printf noch nicht. Gibt es vielleicht noch eine andere Möglichkeit?


----------



## Robat (14. Nov 2017)

Ja du kannst ja wie folgt prüfen und ein Leerzeichen einfügen:

```
for(int i = 18; i > 0; i--) {
     //Einzeilervariante: String rowNr = i < 10 ? (" " + i + ": ") : (i + ": ");
     String rowNr = "";
     if(i < 10) {
         rowNr += " ";
     }
     rowNr += i + ": ";
     System.out.print(rowNr);
   
     for(int j = 0; j < ...) { .. }
}
```


----------



## OPMajor (14. Nov 2017)

Dankeschön.
Ich habe es auch gerade geschafft.

```
public class H {
  public static void main(String[] args) {
   
    int [] array1 = {1,3,4,5,8,13,0,7,2,4,18};
    printHisto(array1);
   
  }
  public static void printHisto(int[] array){
     
   
    for (int i = 18 ; i>0  ; i-- ) {
       
       if(i<=9) {
           System.out.print(" "+i+":");
       }else {
       System.out.print(i+":");
       }
   
       for (int j=0;j<array.length;j++) {
           
           
           if(array[j]>=i) {
               System.out.print("*");
           }else {System.out.print(" ");
           }
       
    }System.out.println(" ");
  }
  }
}
Konsole
18:          *
17:          *
16:          *
15:          *
14:          *
13:     *    *
12:     *    *
11:     *    *
10:     *    *
 9:     *    *
 8:    **    *
 7:    ** *  *
 6:    ** *  *
 5:   *** *  *
 4:  **** * **
 3: ***** * **
 2: ***** ****
 1:****** ****
```


----------

