Histogramm horizontal spiegeln

jacka

Mitglied
Hi,
habe hier diesen Code geschrieben:
Java:
public static void histogrammAusgeben(int[] werte, int[] anzahlSterne) {
		for (int i = 0; i < werte.length; i++) {
			System.out.print(String.format("%-4d", werte[i]));
		}
		System.out.println();

		for (int i = 0; i < werte.length * 4; i++) {
			System.out.print("-");
		}
		System.out.println();

		for (int zeile = 0; zeile < werte.length; zeile++) {
			for (int spalte = 0; spalte < werte.length; spalte++) {
				if (anzahlSterne[spalte] >= zeile) {
					System.out.print(String.format("%-4s", "*"));
				} else {
					System.out.print(String.format("%-4s", " "));
				}
			}
			System.out.println();
		}
	}
Der sollte ein Histogramm so ausgeben: aber ich will das die Zahlen ganz unten stehen dann kommen die Striche und dann die Sterne nur leider weiß ich nciht wie ich das machen soll.

1 10 30 40 200 50 100 45 100
------------------------------------
* * * * * * * * *
* * * * * * * *
* * * * * * *
* * * * * * *
* * * * * *
* * * *
* * *
* * *
* * *
Der gibt das nicht richtig aus ich meinte für 1: 1 Stern für 10 2 sterne, 30: 4, 40: 5, 200: 20, 50: 6, 100: 10, und 45: 5
 
Zuletzt bearbeitet:
Ich bin mir nicht sicher wie du es genau haben willst.
Daher glaube ich es wäre hilfreich, wenn du es jetzt einmal von Hand so hinschreibst, wie dein Programm es ausgeben soll.

Edit:
Hast du als Eingabe das hier genommen?

Java:
werte = {1, 10, 30, 40, 200, 50, 100};

anzahlSterne = {1, 2, 4, 5, 20, 6, 10};
 
Zuletzt bearbeitet:
Ich bin mir nicht sicher wie du es genau haben willst.
Daher glaube ich es wäre hilfreich, wenn du es jetzt einmal von Hand so hinschreibst, wie dein Programm es ausgeben soll.

Edit:
Hast du als Eingabe das hier genommen?

Java:
werte = {1, 10, 30, 40, 200, 50, 100};

anzahlSterne = {1, 2, 4, 5, 20, 6, 10};

Java:
int[] werte = { 1, 10, 30, 40, 200, 50, 100, 45, 100 };

war die Eingabe und die Anzahl der Sterne hab ich in einer anderen Methode programmiert.
Also es soll so ausgegeben werden, dass die Werte ganz unten stehen , dann darüber die Bindestriche und dann die Sterne zur Zahl passend nach oben.. d.h. beim größten Wert gehen am meisten Sterne hinauf und beim kleinsten also 1 nur einer.
 
Auf den ersten Blick kann ich sagen:

die Reihenfolge muss so geändert werden:

Java:
for (int zeile = 0; zeile < werte.length; zeile++) {  //erst die Sterne
        
            for (int spalte = 0; spalte < werte.length; spalte++) {
            
                if (anzahlSterne[spalte] >= zeile) {
                    System.out.print(String.format("%-4s", "*"));
                } else {
                    System.out.print(String.format("%-4s", " "));
                }
            }
            System.out.println();
        }
        for (int i = 0; i < werte.length * 4; i++) { //dann die Striche
            System.out.print("-");
        }
        System.out.println();
        for (int i = 0; i < werte.length; i++) { //dann die Zahlen
            System.out.print(String.format("%-4d", werte[i]));
        }
und außerdem vergleichst du hier
Java:
spalte < werte.length
zweimal mit werte.length.
werte.length ist immer gleich (hier 9) also kannst du nicht mehr als neun Sterne ausgeben.
 
OK, wenn du vorher das Maximum aus deinem Wertefeld raussuchst kannst du hiermit deine Ausgabe erzielen:
Java:
int max = 100; //aus dem Bsp

for(int zeile = max; zeile != 0; --zeile){
  for(int spalte = 0; spalte != werte.length; ++spalte){
     if(anzahlSterne[spalte] >= zeile ) System.out.print(" * ");
       else System.out.print("   ");
   }
   System.out.println();
}
Die Ausgabe ist nicht 100% formatiert, aber das ist egal.
 
Auf den ersten Blick kann ich sagen:

die Reihenfolge muss so geändert werden:

Java:
for (int zeile = 0; zeile < werte.length; zeile++) {  //erst die Sterne
        
            for (int spalte = 0; spalte < werte.length; spalte++) {
            
                if (anzahlSterne[spalte] >= zeile) {
                    System.out.print(String.format("%-4s", "*"));
                } else {
                    System.out.print(String.format("%-4s", " "));
                }
            }
            System.out.println();
        }
        for (int i = 0; i < werte.length * 4; i++) { //dann die Striche
            System.out.print("-");
        }
        System.out.println();
        for (int i = 0; i < werte.length; i++) { //dann die Zahlen
            System.out.print(String.format("%-4d", werte[i]));
        }
und außerdem vergleichst du hier
Java:
spalte < werte.length
zweimal mit werte.length.
werte.length ist immer gleich (hier 9) also kannst du nicht mehr als neun Sterne ausgeben.

Ja und wie müsste ich das machen dass ich jetzt aber für 200 20Sterne ausgeben möchte? und das aber jetzt zb. der eine Stern der zum einser gehört auch beim einser ist und nicht ganz oben und das für alle?? und das maximum hab ich in einer seperaten Methode schon programmiert..
 
Java:
//Du nimmst: A die Reihenfolge von oben und B die untere Schleife
  
  public static void histogrammAusgeben(int[] werte, int[] anzahlSterne) {

    int max = 100;     // als Bsp

    for(int zeile = max; zeile != 0; --zeile){          
      for(int spalte = 0; spalte != werte.length; ++spalte){
        if(anzahlSterne[spalte] >= zeile ) System.out.print(" *  ");
        else System.out.print("    ");
      }
      System.out.println();
    }

    for (int i = 0; i < werte.length * 4; i++) {
        System.out.print("-");
    }
    System.out.println();
    for (int i = 0; i < werte.length; i++) {
        System.out.print(String.format("%-4d", werte[i]));
    }
  }

Wobei du natürlich max an das Maximum von anzahlSterne anpassen solltest.
 
Zuletzt bearbeitet:

Zurück
Oben