Entwickler-Ecke
Basistechnologien - Histogram in Senkrechterform
Vegeto - Do 22.05.14 13:01
Titel: Histogram in Senkrechterform
Hallo,
ich glaube das was ich suche ist eigentlich ganz einfach, doch irgendwie komme ich da nicht drauf.
Ich habe eine Methode geschrieben die liest ein Array aus und gibt es als Histogramm wieder, doch in der WAAGERECHTENFORM !
Methode von mir:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| static void writeHistrogramm(int[] Array) { float max = 0; for (int i = 0; i < Array.Length; i++) { if (Array[i] > max) max = Array[i]; } for (int i = 0; i < Array.Length; i++) { for (int j = 0; j < (int)(Array[i] / max * 25f); j++) { Console.Write('*'); } Console.WriteLine(); } } |
So wird die Methode genutzt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| int[] iArray = new int[5]; iArray[0] = 11; iArray[1] = 3; iArray[2] = 0; iArray[3] = 21; iArray[4] = 6;
writeHistrogramm(iArray); |
Ausgabe wäre zum Beispiel so:
Quelltext
1: 2: 3: 4: 5:
| *********** ***
********************* ****** |
_____________________________________________________________________________________
Doch ich möchte das die Ausgabe wie folgt sein soll:
Quelltext
1: 2: 3: 4: 5: 6:
| * * * * * * * * * * * * * * * * * * * |
Ich hoffe jemand kann mir auf die schnelle weiterhelfen.
Lg
Moderiert von
Christian S.: Code-Tags hinzugefügt
Christian S. - Do 22.05.14 14:19
Wie kommt dann auf das untere Histogramm? :gruebel:
Th69 - Do 22.05.14 14:49
Hallo Vegeto,
erzeuge dir dynamisch ein 2-dimensionales Array und fülle es. Und am Ende einfach mittels zweier Schleifen Zeichen für Zeichen ausgeben.
@Christian: ich denke, daß untere Beispiel war exemplarisch gemeint.
Vegeto - Do 22.05.14 14:53
Hallo
Christian S. hat folgendes geschrieben : |
Wie kommt dann auf das untere Histogramm? :gruebel: |
Wie schon Th69 es gesagt hat, es sollte nur ein BEISPIEL sein, so habe ich mir das vorgestellt.
@Th69 Ich werde es versuchen, danke für den Tipp
Horst_H - Do 22.05.14 15:34
Hallo,
2-Dim Array?
Man kann den größten Wert suchen und dann in einer Schleife alle Spalten abfragen, ob sie größer sind , als der momentane Wert.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Suche Maximalen Wert Max Solange Max > 0 Begin Für alle Spalten von 0 bis n Falls Histogram[spalte] > Max dann Ausgabe "#" sonst Ausgabe " " Ausgabe(NeueZeile) Max = Max-1 end |
Gruß Horst
Ralf Jansen - Do 22.05.14 15:55
Wer ein Array Array nennt sollte eigentlich vom Compiler ausgebuht werden ;)
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| public static void WriteHistogramm(int[] array) { int max = array.Max(); array = array.Select(x => (int)((float)x / max * 25f)).ToArray();
for (int i = max; i >= 0; i--) { for (int j = 0; j < array.Length; j++) { if (array[j] > i) Console.Write("* "); else Console.Write(" "); } Console.WriteLine(); } } |
Horst_H - Do 22.05.14 16:31
Hallo,
Hollah, ist alles ganz anders.
Die Zahlen werden auf max == 25 normiert.
Ich hoffe, so wird gerundet.
C#-Quelltext
1:
| array = array.Select(x => (int)((float)x / max * 25f + 0.5f)).ToArray(); |
Das geht bei max= 0 voll daneben.
Die Schleife bei Normierung auf 25 lautet dann wohl
for (int i = 25; i >= 0; i--)
Gruß Horst
Ralf Jansen - Do 22.05.14 16:51
Das mit dem +0.5f wird zwar auch funktionieren ist aber irgendwie nicht C#-like.
C#-Quelltext
1: 2: 3:
| if (max == 0) return; array = array.Select(x => (int)Math.Round((float)x / max * 25f, 0, MidpointRounding.AwayFromZero)).ToArray(); |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!