# Histogram mittels Schleifen und Arrays



## lucksn (17. Okt 2013)

Hallo liebe Forumgemeinde,

ich studiere seit ein paar Wochen Informatik und bin im Programmieren bisher sehr gut mitgekommen, jedoch habe ich aktuell einfach eine kleine Denkblockade.
Folgende Aufgabe wurde gestellt:



> Schreiben Sie eine Klasse mit einer Methode, die Histogramme auf dem Bildschirm darstellt. Die Methode bekommt
> ein eindimensionales int-Array (mit nicht-negativen Werten) als Parameter übergeben und soll entsprechend hohe
> *-Säulen auf den Bildschirm zeichnen. Nutzen Sie zunächst nur geeignete for-Schleifen.
> Beispiel: f([3, 1, 2, 2, 4, 1, 0, 2, 3]) produziert
> ...



Ich stehe aktuell total auf dem Schlauch und komme aktuell nur zu Endlosschleifen & anderen Fehlern, mein Ansatz:


```
public class Histogramm {
	private int checkZahl = 0;
	
	public void printHisto (int[] printArray) {
		int[] array = printArray;
		
		for (int i=0; i < array.length; i++) {
			int x = array[i];
				if (checkZahl < x) {
					checkZahl++;
				}
				else if (checkZahl > x) {
					checkZahl--;
				}
				else {
					System.out.println("baZingA");
				}
			}
	}
}
```

Ich weiß, dass ich irgendwie mit verschachtelten FOR Schleifen arbeiten muss, jedoch bin ich aktuell einfach zu doof die richtige Stelle für eine weitere FOR Schleife zu finden.
Mir ist ebenfalls klar, dass ich es irgendwie programmieren muss, dass die Schleifen solange & so oft durchlaufen werden, bis alle Zahlen aus dem Arrays mit meiner checkZahl überingestimmt haben.

Es gibt noch eine dazugehörige Main Klasse in der der Parameter vorerst mit 9 Zahlen meiner Wahl gefüllt wird, in einem weiteren Schritt, wenn ich es hinbekommen habe, das mein Programm die * richtig anzeigt, möchte ich das Array mit 9 zufälligen Zahlen befüllen lassen, die jedoch kleiner als 13 sind.

Dies ist aber erstmal nicht die Frage , sondern einfach die Suche nach einem kleinen Denkanstoß, wie die weiteren Schleifen aufgebaut sein müssen.

LG


----------



## VfL_Freak (17. Okt 2013)

Moin,

erstens verstehe das Beispiel nicht wirklich ...


> f([3, 1, 2, 2, 4, 1, 0, 2, 3])


da hätte ich jetzt der Beschreibung nach sowas erwartet:


> ***
> *
> **
> **
> ...


???:L

Zweitens sehe ich bei Dir überhaupt keine Ausgabe von Sternen 

Drittens (nur als Tipp): die innere Variable kannst Du Dir hier auch sparen und direkt mit dem Übergabeparameter arbeiten:

```
public void printHisto (int[] printArray) 
{
        for (int i=0; i < printArray.length; i++) {
            int x = printArray[i];
                if (checkZahl < x) {
                    checkZahl++;
                }
                else if (checkZahl > x) {
                    checkZahl--;
                }
                else {
                    System.out.println("baZingA");
                }
            }
    }
```

Gruß
Klaus


----------



## lucksn (17. Okt 2013)

Hallo Klaus,

vielen Dank für deine Antwort erstmal.
Also wegen der Aufgabenstellung, da wurde wohl mit 
	
	
	
	





```
System.out.print("*");
```
 gearbeitet, statt mit println...
Bei mir fehlt diese Ausgabe (stattdessen das aktuelle Bazinga), weil ich ja selbst schon gemerkt habe, dass mir eine weitere for-Schleife fehlt.
Ich habe mal bei meinen Komolitonen reinschnuppern können und mittlerweile weiß ich eben auch, dass es selbstverständlich mehrere Lösungsansätze gibt.

Mir fehlt nur leider der "Grundgedanke".
Ich stehe einfach total auf dem Schlauch.

Mein bisheriger Ansatz ist eben, dass die checkZahl aufaddiert wird, bis sie mit x übereinstimmt, ist dies der Fall soll ein * ausgegeben werden.
Ich weiß also auch, dass ich, um das Bild dort zu erzeigen mit einem eindimensionalen Array, sowas wie eine Matrix erstellen muss.
Mein Gedankengang sieht also aktuell so aus:

- eine for-Schleife für die Waagerechte 
- eine for-Schleife für die Senkrechte
- eine if Bedingung, die beide durchläuft und bei Übereinstimmung ein * ausgibt. :bahnhof:


----------



## lucksn (17. Okt 2013)

Hallo nochmal,

ich habe nun meinen Code mal überarbeitet und bin nun wenigstens soweit, dass mir "+" Zeichen in einer bestimmten Anzahl angezeigt werden mit folgendem Code.


```
public class Histogramm {
	
	public void printHisto (int[] printArray) {
		for (int i = 0; i < printArray.length; i++) {
			int x = printArray[i];
			for (int y = 0; y < x; y++) {
				if (y == x) {
					System.out.print("*");
				}
				else {
					System.out.print("+");
				}
				for (y = printArray.length; y > x; y--) {
					if (y == x) {
						System.out.print("*");
					}
					else {
						System.out.print("+");
					}
				}
			}
			System.out.println("");
		}
	}
}
```
Ich bin zwar immernoch nicht weiter mit dem eigentlichen Problem, jedoch habe ich irgendwie das Gefühl, dass ich auf dem richtigen Weg bin.
Falls dies nicht der Fall ist würde ich mich wie gesagt über eine Hilfestellung sehr freuen.
Ich möchte keineswegs, dass mir jemand die Aufgabe löst, aber ein Schubs in die richtige Richtung wäre wirklich toll.


----------



## BuddaKaeks (17. Okt 2013)

Erklär doch nochmal die aufgabe, denn ich glaube, dein Beispiel wird hier nicht so recht verstanden


----------



## lucksn (17. Okt 2013)

Hallo BuddaKaeks,

das ist ja die Krux ;-)
Ich habe die komplette Aufgabenstellung kopiert von meinem Aufgabenblatt.
Ich kann es also gar nicht genauer erklären.


----------



## BuddaKaeks (17. Okt 2013)

> Ein Histogramm ist eine graphische Darstellung der Häufigkeitsverteilung metrisch skalierter Merkmale. Es erfordert die Einteilung der Daten in Klassen (engl. bins), die eine konstante oder variable Breite haben können. Es werden direkt nebeneinanderliegende Rechtecke von der Breite der jeweiligen Klasse gezeichnet, deren Flächeninhalte die (relativen oder absoluten) Klassenhäufigkeiten darstellen. Die Höhe jedes Rechtecks stellt dann die (relative oder absolute) Häufigkeitsdichte dar, also die (relative oder absolute) Häufigkeit dividiert durch die Breite der entsprechenden Klasse.



Das sagt Wikipedia zu Histogrammen.


----------



## BuddaKaeks (17. Okt 2013)

Ok, verstanden.

Dein Programm bekommt eingabe parameter, z.B. 1, 4, 5

und anstelle von

*
****
*****

soll es das ganze vertikal, also

--*
-**
-**
-**
***

ausgeben (- ist ein Leerzeichen)


----------



## lucksn (18. Okt 2013)

Ja so habe ich die Aufgabe auch verstanden


----------



## BuddaKaeks (18. Okt 2013)

Das heißt, du hast dein array und musst daraus quasi ein 2D boolean array machen, mir true für ein *, false für eine leerzeichen.

Also in etwa so:

```
int biggestNumber = dieGrößteNummerAusDemEingangsArrayHerusfinden(inputArray);
boolean[][] stars = new boolean[inputArray.length][biggestNumber];

for(int i = 0; i< inputArray.length; i++){
     for(int j = biggestNumber-1; j > biggestNumber - inputArray[i]){
        stars[i][j] = true;
    }
}

//jetzt einfach ausgeben
//für den input [1][2][3]
//müsste das folgendes Ergeben:
//[f,f,t]
//[f,t,t]
//[t,t,t]
//t = true, f = false
//wenn es nicht das ergibt ist noch irgendwo ein fehler :)
```


----------

