Mittelwert berechnen



  • Hallo zusammen,

    ich lese eine Textdatei ein, aus der ich gerne einen Mittelwert berechnen möchte.

    Input:
    T3=50 T4=600
    T3=60 T4=100
    T3=200 T4=150

    Ich möchte aus dieser Liste gerne die Mittelwerte von T3 und T4 errechnen.
    Die Textdatei lese ich zeilenweise ein. Würde demzufolge einen Zähler mitlaufen lassen, falls T3 oder T4 vorhanden ist. Dieser würde für die Anzahl stehen. Nur wie kann ich am Besten die verschieden T-Werte speichern ?

    Danke im Voraus für Tipps !



  • Wie wäre es, wenn die Werte jeweils in einem Array gespeichert werden?



  • ja das ist mir bewusst...nur wie komme ich an die Werte ? Ich muss ja die Zahl irgendwie finden, um sie zu übergeben...



  • Das ließe sich zum Beispiel mit strtok() lösen.

    http://www.imb-jena.de/~gmueller/kurse/c_c++/c_strtok.html



  • Du kannst auch mit strstr() nach "T3=" suchen und ab der gefundenen Position +3 dann mit strtol() die Werte einlesen.

    Oder mit

    int T3, T4;
    sscanf(zeile,"T3=%d T4=%d", &T3, &T4);
    


  • Habe zuerst mal den Tipp von Scimansix getestet. Habe auf dem Beispiel aufgebaut.

    #include <stdio.h>
    #include <string.h>
    
      int main(void)
      {
        char string[] = "23.03.2011 T4=600 T3=200";
        char separator[] = "= ";
        char TEST[10];
    	char *token;
    	int i=0;
    	double erg;
    
        printf("%s\n\nEinzelne Token:\n", string);
    
        token = strtok(string, separator);        /* erstes Token ermitteln */
        while( token != NULL )
        {
    
    	  TEST[i]=token;     
    	  i++;
    
    	  printf("%s\n", token);
          token = strtok(NULL, separator);        /* weitere Token ermitteln */
        }
    
    	erg = TEST[2] + TEST[4];
    
    	printf("%s\n", erg);
    
        return 0;
      }
    

    Nur leider gibt er hier:

    TEST[i]=token;
    

    folgenden Fehler aus:

    error C2440: '=' : cannot convert from 'char *' to 'char'
    

    Wie kann ich den Wert korrekt übergeben ?



  • Ich gehe mal davon aus, dass du in TEST einfach erstmal die Referenzen auf die einzelnen Tokens speichern möchtest. Bei diesen handelt es sich ja um Strings, also müsstest du TEST wie folgt deklarieren:

    char *TEST[10];
    

    Denke daran, die Grenzen des Feldes zu beachten. Weiterhin erschließt sich mir der Sinn folgender Zeile noch nicht ganz:

    erg = TEST[2] + TEST[4];
    

    strtok() liefert dir erstmal nur die einzelnen Tokens als Strings. Um die Umwandlung in Zahlen musst du dich noch selbst kümmern.



  • Lasse die strtok-Versuche sein, nimm sscanf, da dein Beispielcode auf große Defizite im Umgang mit der Sprache C schließen lassen.
    Auch solltest du dir klar sein, dass dein 1.Beispiel

    "T3=200 T4=150"
    

    und das 2.

    "23.03.2011 T4=600 T3=200"
    

    unterschiedliche (bzw. kompliziertere) Auswertungen benötigen.



  • danke für eure bisherige Hilfe...Habe es jetzt mit sscanf gelöst und mich ein wenig eingelesen.

    sscanf (Zeile, "%g %g", &arr1[q], &arr2[y]);
    

    Jetzt stehe ich allerdings vor dem angesprochenen Problem. Wie bekomme ich aus den char arrays an die Zahlen ? Die brauche ich natürlich um den Mittelwert zu berechnen. Im Netz fand ich nur String --> int....



  • Mir schwant böses. Poste doch mal deinen aktuellen Code. Zumindest wo zeile und arr1 und arr2 deklariert sind.



  • sscanf() kann diese Umwandlung für dich übernehmen. Lies dir DirkBs Vorschlag noch mal durch. Und ja, poste bitte mal deinen bisherigen Code.



  • char Zeile[300], zei[5], c[20], *z, *p, *w;
    float arr1[10];
    float arr2[10];
    float erg;
    
    sscanf (Zeile, "%g %g", &arr1[q], &arr2[y]);
    

    Die arr1-Felder laufen durch...Habe schon ein wenig rumprobiert wegen der Umwandlung, durch folgendem Post hier aus dem Forum:

    #include <cstdio>
    #include <iostream>
    using namespace std;
    int main()
    {  
        const char* AlsString = "3.14";
        float d = 0;
        // ACHTUNG! sscanf erwartet ein float. Kein double!
        sscanf(AlsString, "%g", &d);
        cout << d << endl;
    }
    

    http://www.c-plusplus.net/forum/39488



  • Warum haben arr1 und arr2 unterschiedliche Indizes (q und y)

    %g list ein float ein, %d ine int, %lg oder %lf oder %le lesen double ein.
    Von welchem Typ ist den jetzt dein Zahlenwert.

    Bei "%g %g" dürfen dann aber nur die nackten Zahlenwerte in Zeile stehen (ohne T3=). Z.B.: "3.141 1.414"
    Wie sehen deine Zeilen aus. Ist die Reihenfolge von T3= und T4= beliebig.? Sind da noch andere Tx=?



  • stimmt die Indizes q und y bei arr könnten gleich sein...

    die Werte die ich einlese werden vorher bearbeitet und sehen dann wie folgt aus:

    Vorher:
    "T3=20.325 T4=3232"
    
    Nachher:
    "20.325 3232"
    

    mit der Zeile gehts zum sscanf...andere Tx= gibt es nicht, nur die Anzahl der Zeilen differiert.

    und so wollte ich testweise was ausrechnen:

    float erg;
    	float erg1;
    	float erg2;
    erg2 = arr1[0] + arr1[1];
    fprintf(fpOut,"\nTges=%d", erg2);
    

    Heraus bekomme ich aber:

    Tges=-2147483648



  • KlausH schrieb:

    und so wollte ich testweise was ausrechnen:

    float erg;
    	float erg1;
    	float erg2;
    erg2 = arr1[0] + arr1[1];
    fprintf(fpOut,"\nTges=%d", erg2);
    

    Heraus bekomme ich aber:

    Tges=-2147483648

    Das liegt daran, dass du %d als Formatbezeichner benutzt, aber ein float übergibst. fprintf() "weiß" nicht, dass der übergebene Wert ein float ist und behandelt ihn dem Format entsprechend als int. Willst du erg2 wirklich als Ganzzahl ausgeben, musst du also explizit nach int casten.

    Erklärung ist, dass variable Argumentlisten in C nicht typsicher sind. Falls dich der Hintergrund interessiert, kannst du dich mal mit stdarg.h beschäftigen.



  • Du hast ja auch nach dem Mittelwert gefragt.

    Welchen denn? (T3+T4)/2 oder den Mittelwert von allen T3 und allen T4 getrennt?

    Und vergiss float, nimm double.



  • @scimansix

    Leider verstehe ich das mit dem casten nicht ganz.Wenn ich unsigned definiere:

    float erg;
    float erg1;
    float erg2;
    erg2 = arr1[0] + arr1[1];
    fprintf(fpOut,"\nTges=%d", (unsigned)erg2);
    

    bekomme ich nur ganze Werte raus. Nicht aber die Kommastellen.

    @DirkB

    (T3+T4)/2



  • Wenn du Fließkommazahlen ausgeben willst, musst du auch printf sagen das da eine kommt. Dazu ist der Formatstring da und für Fließkommazahlen gibt es %f oder %e oder %g (je nach gewünschtem Format).

    float erg;
    float erg1;
    float erg2;
    erg2 = (arr1[0] + arr1[0])/2.0;
    fprintf(fpOut,"\nTges=%f", erg2);
    

    unsigned ist nur eine Abkürzung für unsigned int.
    Und Integer sind Ganzzahlen, die haben keine Nachkommastellen.



  • Danke euch...Jetzt hat es geklappt !!



  • nochmals:

    Hier rät man Dir dazu, den Typ double statt float zu verwenden.


Anmelden zum Antworten