Array, geschachtelte For-Schleifen

OPMajor

Aktives Mitglied
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:


Java:
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?
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    4,7 KB · Aufrufe: 104
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
 
So in etwa?
Und wo genau kommt die if-Bedingung hin?

Java:
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;
  }
}
 
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
 
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)

Java:
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("*");
           }
    }
       
    }
  }
}
 
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.
 
Das ist noch irgendwas falsch, oder?

Java:
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(" ");
    }
      
    }
  }
  }
}
 
Ist der Wert aus dem Array größer-gleich als der aus der variablen der äußeren Schleife

Dies
Java:
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
Java:
j<=array.length
sollte so
Java:
j<array.length
lauten.
 
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.
 
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.
 
Wieso wiederholen sich die Zahlen bei der Konsolenausgabe?

Java:
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
*
 
Danke,
irgendwie passt die Anzahl der Sterne nicht.
Java:
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
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
 
Pseudocode:

Code:
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
 
Zuletzt bearbeitet:
Danke.
Muss ich noch mehrere Leerzeichen einfügen, damit die Sterne nach rechts wandern?


Java:
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******
****
 
Bei der Ausgabe nach 10 ist noch eine Verschiebung, die nicht sein sollte.
Habe ich noch einen Fehler drin?
Java:
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****** ****
 
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) ;
 
Ja du kannst ja wie folgt prüfen und ein Leerzeichen einfügen:
Java:
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 < ...) { .. }
}
 
Dankeschön.
Ich habe es auch gerade geschafft.
Java:
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:****** ****
 

Zurück
Oben