Histogramm erstellen.

Farid19

Grünschnabel
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.
 
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?
 
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 .
 
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:
Code:
1.0
2.4
1.7
Dann soll dein Programm diese Ausgabe lieferrn:

0*
1
2*
3
4*
...

Oder hab ich dich da missverstanden?
 
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ß
 
Hi
Die histogramm muss dann so aus sehen
Code:
|
  |
  |
  |
  |
  |
  |
  |
  |
  |
  |
  |
  |
  |                   #
  |                #  #  #
  |             #  #  #  #  #
  |       #     #  #  #  #  #
  | #  #  #     #  #  #  #  #        #
  | #  #  #  #  #  #  #  #  #  #     #  #
  | #  #  #  #  #  #  #  #  #  #  #  #  #
  --+--+--+--+--+--+--+--+--+--+--+--+--+
    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:
Code:
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
Code:
if(Zeile[k]==1.3)
++Note[1];

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


Code:
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.
 
Also ich versteh den Queltext von dir nicht ganz in manchen Punkten aber naja... Probier diesen Code mal:
Code:
#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
 
Zuletzt bearbeitet:
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
C++:
int kategorie = (int) round(note * 3 - 3);
einordnen.

Gruß
 
Zurück