# Histogramm erstellen.



## Farid19 (21. Juni 2008)

Hi habe folgendes problem .
In einer Datei sind die Noten (jede zeile eine Note).
Die müssen jetzt in einer Diagramm dargestellt werden.Wie ich sie alle auslese habe schon drauf aber weiter komme ich nicht .Hilfeeeeeeeeeeeeeee
das ganze soll ungefähr so aus sehen


   * *      * * *  *   *     *
* * * *    * * *  *  * *   *   *   *
0 1 2 3 4 5 6 7 8 9 10 11 12
also für jede zahl wurde eine Note zugeordnet(z.B 0 bekommt alle 1.0  
                                                                         1 bekommt  alle 1.3 und so weiter)
die werden als Sterne  dargestellt(die Anzahl von Sternen über die Zahl ist gleich  Anzahl von Noten in der Datei 

vielen Dank voraus.


----------



## Mr Apfelkuchen (21. Juni 2008)

Also ne Lösung wär da glaub ich nicht so schwer aber ich versteh dein Problem noch nciht ganz.
Auf welche Art sollen die Noten dargestellt werden? (0 bekommt alle 1...) Was meinst du damit?


----------



## Farid19 (23. Juni 2008)

Also die Aufgabesieht   folgende  Maßen aus.

Die Noten werden bei der Eingabe in Kategorien (0 bis 12) eingeteilt und zwar nach folgenden Schema: 
Noten:      1.0 1.3 1.7 2.0 2.3 2.7 3.0 3.3 3.7 4.0 4.3 4.7 5.0  
Kategorie:   0   1   2   3   4   5   6   7   8   9  10  11  12
Damit die gesamte Bildschirmausgabe sichtbar ist, ist bei Noten, deren Auftritte die Anzahl 20 überschreitet die Ausgabe auf 19 Sternchen zu begrenzen und an der Position des 20. (obersten) Sternchens die tatsächliche Anzahl der Auftritte auszugeben. 

Die Noten stehen in einer Textdatei namens noten.dat, jeweils eine Note pro Zeile. Das Programm öffnet die Datei und liest alle Noten (bis EOF). Danach wird die Datei geschlossen und das Histogramm ausgegeben.


Ich weiß jetzt nicht wie ich sie alle sortieren kann.
danke .


----------



## Mr Apfelkuchen (24. Juni 2008)

Also wenn ich dich richtig Verstanden hab dann soll dein Programm die Noten in die Kategorien einordnen und als Sterne ausbeben...
Dann wäre als Beispiel wenn die Datei noten.dat das enthält:

```
1.0
2.4
1.7
```
Dann soll dein Programm diese Ausgabe lieferrn:

0*
1
2*
3
4*
...

Oder hab ich dich da missverstanden?


----------



## deepthroat (24. Juni 2008)

Hi.

Wie wäre es denn wenn du in einem Array der Größe 13 (für jede Kategorie ein Element) die Anzahl der Noten für diese Kategorie zählst?!

Dann mußt du das Array nur noch so ausgeben wie gewünscht.

Gruß


----------



## Farid19 (24. Juni 2008)

Hi 
Die histogramm muss dann so aus sehen

```
|
  |
  |
  |
  |
  |
  |
  |
  |
  |
  |
  |
  |
  |                   #
  |                #  #  #
  |             #  #  #  #  #
  |       #     #  #  #  #  #
  | #  #  #     #  #  #  #  #        #
  | #  #  #  #  #  #  #  #  #  #     #  #
  | #  #  #  #  #  #  #  #  #  #  #  #  #
  --+--+--+--+--+--+--+--+--+--+--+--+--+
    0  1  2  3  4  5  6  7  8  9 10 11 12
```

Die Noten werden bei der Eingabe in Kategorien (0 bis 12) eingeteilt und zwar nach folgenden Schema: 

```
Noten:      1.0 1.3 1.7 2.0 2.3 2.7 3.0 3.3 3.7 4.0 4.3 4.7 5.0  
Kategorie:   0   1   2   3   4   5   6   7   8   9  10  11  12
```

Damit die gesamte Bildschirmausgabe sichtbar ist, ist bei Noten, deren Auftritte die Anzahl 20 überschreitet die Ausgabe auf 19 Sternchen zu begrenzen und an der Position des 20. (obersten) Sternchens die tatsächliche Anzahl der Auftritte auszugeben. 
Die Noten werden über die Tastatur eingegeben, jeweils eine Note pro Zeile. Das Programm wird bei Eingabe der Note "0" beendet. Danach wird das Histogramm ausgegeben. 
also uber den Anordnungszahl muss die Anzahl von die Noten  stehen.



Ich habe schon die Quellcode erstellt die zählt mir die Anzal von Noten ,aber nur die Ganzen 
also wenn ich 

```
if(Zeile[k]==1.3)
++Note[1];
```

schreibe dann gibt er mir die null raus 
#include <stdio.h>



```
int main(void) {


  FILE *file;
  float Zeile[3000];
  float Note[13]={0};


  int k,i,j;

file=fopen("noten.dat", "r");

  if(file==NULL) {
    printf("Error:File konnte nicht geoffnet werden.\n");
    return 1;
  }
  else {
    printf("File <noten.dat> wurde geoefnet.\n");

    i = 0 ;

    while(!feof(file)) {

      fscanf(file, "%f", &Zeile[i]);
      i++;
    }

    printf("Anzahl von Noten: %d\n\n", i);
    printf("Folgende Noten wurden gefunden:\n");

    for(j=0 ; j<i ; j++)

	{
      printf("%1.1f\n\n", Zeile[j]);

	  }


    fclose(file);
k=0;

for(k=0;k<i;++k)

{
      	if (Zeile[k]==1.0)
	   		++Note[0];
			else if(Zeile[k]==4.0)
			++Note[1];

}

      printf("%f\n",Note[0]);
	  printf("%f\n",Note[1]);


    return 0;
  }
}
```

Danke voraus.


----------



## Mr Apfelkuchen (24. Juni 2008)

Also ich versteh den Queltext von dir nicht ganz in manchen Punkten aber naja... Probier diesen Code mal:

```
#include <stdio.h>

main(){
	int		iNote[3000],iKategorie[13],iWert1,iWert2,i,f;
	float	fZahl[3000];
	char	Zeichen[2],Ausgabe[30];
	FILE	*file;

	if ((file = fopen("noten.dat","r")) == NULL){
		printf("\nFehler beim öffnen der Datei!");
	}
	else 
		printf("\nDatei gelesen... Auswertung beginnt");

	Zeichen[1]='\0';		//Zum Abschluss der Zahl
	f = 0;

	while(Zeichen[0] != '!') { //.dat Datei mit einem ! hinter der letzten Zahl abschliessen
		for(i=0;i<3;i++){
			Zeichen[0] = fgetc (file);
			if(i==0)
				iWert1 = atoi(Zeichen);
			if(i==2)
				iWert2 = atoi(Zeichen);
		}
		fZahl[f] = ((float)(iWert1*10+iWert2)/10);
		f++;
		Zeichen[0] = fgetc (file); // Zeilenumschübe zählen auch als Zeichen!
	}
	fclose (file);
	printf("\n\nEs wurden %i Noten gefunden\n",f);

	iKategorie[0]=0;
	iKategorie[1]=0;
	iKategorie[2]=0;
	iKategorie[3]=0;
	iKategorie[4]=0;
	iKategorie[5]=0;
	iKategorie[6]=0;
	iKategorie[7]=0;
	iKategorie[8]=0;
	iKategorie[9]=0;
	iKategorie[10]=0;
	iKategorie[11]=0;
	iKategorie[12]=0;

	for(i=0;i<f;i++){
		if(fZahl[i]>=1.0 && fZahl[i]<1.3)
			iKategorie[0]++;
		else if(fZahl[i]>=1.3 && fZahl[i]<1.7)
			iKategorie[1]++;
		else if(fZahl[i]>=1.7 && fZahl[i]<2.0)
			iKategorie[2]++;
		else if(fZahl[i]>=2.0 && fZahl[i]<2.3)
			iKategorie[3]++;
		else if(fZahl[i]>=2.3 && fZahl[i]<2.7)
			iKategorie[4]++;
		else if(fZahl[i]>=2.7 && fZahl[i]<3.0)
			iKategorie[5]++;
		else if(fZahl[i]>=3.0 && fZahl[i]<3.3)
			iKategorie[6]++;
		else if(fZahl[i]>=3.3 && fZahl[i]<3.7)
			iKategorie[7]++;
		else if(fZahl[i]>=3.7 && fZahl[i]<4.0)
			iKategorie[8]++;
		else if(fZahl[i]>=4.0 && fZahl[i]<4.3)
			iKategorie[9]++;
		else if(fZahl[i]>=4.3 && fZahl[i]<4.7)
			iKategorie[10]++;
		else if(fZahl[i]>=4.7 && fZahl[i]<5.0)
			iKategorie[11]++;
		else if(fZahl[i]==5.0)
			iKategorie[12]++;
	}
	
	//Einteilung in die Gruppen
	
	for(i=20;i>0;i--){
		if(iKategorie[0]>=i)
			Ausgabe[0]='*';
		else
			Ausgabe[0]=' ';
		Ausgabe[1]=' ';
		if(iKategorie[1]>=i)
			Ausgabe[2]='*';
		else
			Ausgabe[2]=' ';
		Ausgabe[3]=' ';
		if(iKategorie[2]>=i)
			Ausgabe[4]='*';
		else
			Ausgabe[4]=' ';
		Ausgabe[5]=' ';
		if(iKategorie[3]>=i)
			Ausgabe[6]='*';
		else
			Ausgabe[6]=' ';
		Ausgabe[7]=' ';
		if(iKategorie[4]>=i)
			Ausgabe[8]='*';
		else
			Ausgabe[8]=' ';
		Ausgabe[9]=' ';
		if(iKategorie[5]>=i)
			Ausgabe[10]='*';
		else
			Ausgabe[10]=' ';
		Ausgabe[11]=' ';
		if(iKategorie[6]>=i)
			Ausgabe[12]='*';
		else
			Ausgabe[12]=' ';
		Ausgabe[13]=' ';
		if(iKategorie[7]>=i)
			Ausgabe[14]='*';
		else
			Ausgabe[14]=' ';
		Ausgabe[15]=' ';
		if(iKategorie[8]>=i)
			Ausgabe[16]='*';
		else
			Ausgabe[16]=' ';
		Ausgabe[17]=' ';
		if(iKategorie[9]>=i)
			Ausgabe[18]='*';
		else
			Ausgabe[18]=' ';
		Ausgabe[19]=' ';
		if(iKategorie[10]>=i)
			Ausgabe[20]='*';
		else
			Ausgabe[20]=' ';
		Ausgabe[21]=' ';
		Ausgabe[22]=' ';
		if(iKategorie[11]>=i)
			Ausgabe[23]='*';
		else
			Ausgabe[23]=' ';
		Ausgabe[24]=' ';
		Ausgabe[25]=' ';
		if(iKategorie[12]>=i)
			Ausgabe[26]='*';
		else
			Ausgabe[26]=' ';
		Ausgabe[27]=' ';
		Ausgabe[28]=' ';
		Ausgabe[29]='\0';
		printf("\n%s  %i",Ausgabe,i);
	}
	printf("\n1 2 3 4 5 6 7 8 9 10 11 12");
	scanf("%i",&i);	//Vorrichtung damit das Programm sich nicht nach der Ausgabe sofort schliesst!
}
```
Also bei mir ging es ganz gut ich kann dir zur not auch die .exe schicken 

mfg Apfelkuchen


----------



## deepthroat (24. Juni 2008)

Hi.

Wozu sollte man die Zeilen der Datei speichern? Man kann doch gleich die Daten in das Array schreiben und spart sich noch eine Schleife.

Die Noten lassen sich in die Kategorien durch

```
int kategorie = (int) round(note * 3 - 3);
```
einordnen.

Gruß


----------



## Farid19 (25. Juni 2008)

Vilen Dank für die Quellcode
es hat alles geklappt.

also vielen Dank nochmal .MR.Apfelkuchen.


----------



## Mr Apfelkuchen (25. Juni 2008)

Kein Problem ich weiss wie das is wenn man nich weiter kommt^^


----------

