Programm soll Gleitkommawerte aus einer Datei lesen.


  • Mod

    YG schrieb:

    Ich brauch jetzt einfach nochmal einen kleinen Denkanstupser wie man die Werte einließt.

    Dann lies den Thread noch einmal. Du hast bestimmt 5 Mal nicht nur einen kleinen Stupser, sondern einen Wink mit dem Zaunpfahl bekommen, wie das geht. Abgesehen von einer Komplettlösung kann ich nicht mehr Hilfe geben. Und eine Komplettlösung werde ich dir nicht geben.

    Ich würde jetzt hingehen 10 double Variablen festlegen und mit "fscanf", diese alle einzeln einlesen.

    😮 Totaler Holzweg!



  • YG schrieb:

    Doch das funktioniert ja nur, wenn ich weiß wie viele Werte die Datei beinhaltet.

    Nein.

    Dein erster Ansatz mit der while-Schleife war doch gar nicht schlecht.

    Weißt du denn warum da bei while(fscanf(datei, "%lf", &x) ==1) der Vergleich mit 1 steht?



  • Die Schleife läuft jede Zeile der Datei ab, wenn in der Zeile etwas drin steht "kommt die 1 zurück", wenn die Zeile leer ist "kommt eine Null zurück" oder?


  • Mod

    YG schrieb:

    Die Schleife läuft jede Zeile der Datei ab, wenn in der Zeile etwas drin steht "kommt die 1 zurück", wenn die Zeile leer ist "kommt eine Null zurück" oder?

    Nein, nicht ganz. scanf interessieren so etwas wie Zeilen nicht. Zumindest nicht, bei dem hier gegebenen Formatstring. Zeilenumbrüche sind auch nur irgendwelche Zeichen in einer Datei, die haben für den Computer keine spezielle Bedeutung (außer man befielt ihm, dass er das nicht so machen soll). Für scanf ist ein Zeilenumbruch standardmäßig bloß ein Trennzeichen wie jedes andere (zum Beispiel Leerzeichen).

    Hast du mal in einer Referenz geguckt, was der Rückgabewert von scanf bedeutet?

    Hier ist zum Beispiel eine gute Online-Referenz:
    www.cplusplus.com
    Ist zwar für C++, aber wenn du nur die "C-Library" anguckst, ist dort alles bewusst kompatibel zu C gehalten.



  • Fast.

    fscanf gibt die Anzahl der erfolgreich gelesenen Elemente zurück.
    Da du nur eins lesen willst kommt beim erfolg die 1 zurück.

    Jetzt hast du eine Schleife, die Werte einliest, solange welche in der Datei stehen.
    Was willst du in der Schleife machen?
    Du kannst
    - den Wert zum Test ausgeben (printf)
    - mitzählen wie oft die Schleife durchlaufen wurde
    - ...
    Probier mal.

    (jedenfalls solltest du nicht nochmal Werte mit fscanf einlesen)



  • So ich hab mich heute morgen nochmal in ruhe dran gesetzt. Das Programm funktioniert soweit nur der minimal Wert wird falsch ausgegeben.
    Danke nochmal für die Antworten von gestern.

    #include <stdio.h>

    int main()

    {
    FILE *datei;
    double x;
    double mittel;
    double summe;
    double max;
    double min;
    double anzahl=0;

    datei= fopen("punkte.txt", "r");

    while(fscanf(datei,"%lf",&x) ==1)
    {

    anzahl++;
    summe = summe + x;
    if(max<x ){
    max = x;
    }
    if(min>x){
    min = x;
    }

    }

    fclose(datei);

    mittel = summe/anzahl;
    printf("Maximalwert: %lf\n",max);
    printf("Minimalwert: %lf\n",min);
    printf("Mittelwert: %lf\n",mittel);

    return 0;

    }



  • Nochmal mit Code-tags (Code markieren und auf den C-Button unter dem 😡 klicken.

    #include <stdio.h>
    
    int main()
    
    {
    	FILE *datei;
    	double x;
    	double mittel;
    	double summe;
    	double max;
    	double min;
    	double anzahl=0;
    
    	datei= fopen("punkte.txt", "r");
    
    	while(fscanf(datei,"%lf",&x) ==1)
    	{
    
    		anzahl++;		
    		summe = summe + x;
    		if(max<x ){
    			max = x;
    			}
    		if(min>x){
    			min = x;
    			} 
    
    	}
    
    	fclose(datei);
    
    	mittel = summe/anzahl;
    	printf("Maximalwert: %f\n",max); // %f ist für float und double (bei printf)
    	printf("Minimalwert: %f\n",min);
    	printf("Mittelwert: %f\n",mittel);
    
    	return 0;
    
    }
    

    Welchen Wert hat summe auf der rechten Seite in Zeile 20?
    Welchen Wert hat max in Zeile 21?
    Welchen Wert hat min in Zeile 24?



  • Meist du das man summe, max und min mit 0 vor besetzten muss?



  • wenn in der Datei punkte.txt diese Werte stehen

    17.88
    44.78
    78.99
    -1.2
    70.5
    20.88

    gibt das Programm das aus:
    Maximalwert: 78.990000
    Minimalwert: -1.200000
    Mittelwert: 38.638333

    Also alles richtig.

    Wenn diese Werte drin stehen
    17.88
    44.78
    78.99
    1.2
    70.5
    20.88

    wird das ausgegeben:
    Maximalwert: 78.990000
    Minimalwert: 0.000000
    Mittelwert: 39.038333

    also der minimalwert ist falsch



  • Ist ja klar, 0 ist kleiner als 1.2

    Du kannst min mit dem größten möglichen Wert und max mit dem kleinsten möglichen Wert vorbesetzen.
    Diese Werte sind Compiler- und Typabhängig.
    Schau mal in der float.h für Fließkommazahlen
    oder in der limits.h für ganzzahlige Typen nach.

    Eine andere Möglichkeit ist, indem du min und max gleich den ersten Wert zuweist.
    Dies funktioniert immer (solange du mindestens einen Wert hast), egal welchen Variablentyp du hast.


Anmelden zum Antworten