Problem mit Programm zur Mittelwertberechnung



  • Hallo!

    Ich habe bei einer Prüfungsaufgabe aus meinem Studium, dass Problem, dass ich es nicht zu laufen bekomme.

    Die Aufgabenstellung lautet:

    Erstellen Sie ein Programm zur Berechnung des Mittelwerts m und der mittleren quadratischen Abweichung s von n Messwerten. Dabei ist zunächst die Anzahl n der Messwerte einzugeben. Danach sind die Messwerte selbst einzugeben, sie werden in einem Feld gespeichert. m und s berechnen sich aus (hier stehen die beiden Formeln zur Berechnung ).
    Für die Anzahl der Messwerte gilt 2 <= n <= 100.

    /*Programm zur Berechnung des Mittelwerts und der Standartabweichung von n Messwerten*/
    
    #include <stdio.h>
    #include <math.h>
    
    main()
    {
    
          int n,i;
          float m, v, s, summe=0, summe2=0, mw[n];
    
          printf("Bitte geben Sie die Anzahl der Messwerte ein: ");
          scanf("%d",&n);
    
          if ( n < 2 || n > 100 )
          {
             printf("Die Anzahl der Messwerte muss zwischen 2 und 100 liegen!\a\a\a \n");
          }
    
           else
          {
              for( i=0 ; i < n ; i++)
              {
                printf("Bitte geben Sie den %2d. Messwert ein ", i+1);
                scanf("%f",&mw[i]);
                summe += mw[i];
              }
    
          m = (1/n) * summe;
    
          for( i=0 ; i < n ; i++)
              {  
                 summe2 += pow((mw[i] - m),2);
                 i++;
              }
    
              v = ( 1 / ( n - 1 ) ) * summe2;
    
              s = sqrt ( v );
    
              printf("\nDer Mittelwert der %n von Ihnen eingegebenen Messwerte ist %f", n, m);
              printf("\nDie Standartabweichung betr\x84gt %f", s);
          }
    
          system("PAUSE");
          return;
    
    }
    

    Ich würde mich sehr über einen Tipp freuen.

    Gruß

    PS: Sobald das obige Programm läuft. Sollte ich die Berechnung von v noch auslagern in ein Unterprogramm. Aber erstmal sollte es so laufen.



  • C# != C/C++ (=> Falsches Forum)

    Mir kommt die Deklaration von mw[n] komisch vor.
    Wie kann er da schon den korrekten Wert von n kennen, der erst danach eingelesen wird?
    Gibt das keinen Compilerfehler?



  • Nein es wird kein Compilerfehler angezeigt.

    Kann ein MOD den Beitrag in das richtige Forum verschieben?



  • ShaoLintt schrieb:

    Nein es wird kein Compilerfehler angezeigt.

    Ist in C99 auch vollkommen okay. Dennoch undefiniert, weil n zu dem Zeitpunkt nicht initialisiert ist, sprich alles enthalten kann. Daran liegt es vielleicht auch, dass Dein Programm nicht läuft. "Vielleicht" nur deshalb, weil Du uns bis jetzt noch garnicht mitgeteilt hast, was nicht läuft.

    Kann ein MOD den Beitrag in das richtige Forum verschieben?

    Das wird passieren, aber Du würdest es den Moderatoren noch leichter machen, wenn Du Dich zuerst auf eine Sprache festlegst. C, C++ oder C#?



  • C!



  • ShaoLintt schrieb:

    C!

    Ok. Wenn das obige Programm keinen Compilerfehler verursacht, hast Du offensichtlich eine C99-Implementierung. Dann kannst Du zwar das Array mit n als Größe definieren, aber natürlich erst wenn n auch feststeht. Zudem solltest Du Dir angewöhnen, Variablen zu initialisieren.

    (Oder würdest Du es als sinnvoll erachten, wenn Dir jemand sagt "mache mir JETZT einen Stapel mit n Briefumschlägen fertig. Den Wert von n sage ich Dir aber erst, wenn Du fertig bist!" :D)

    Glücklicherweise kann man in C99 Variablen auch erst dort definieren, wo sie benötigt werden. Zum Beispiel so:

    #include <stdio.h>
    #include <math.h>
    
    int main() /* <- deutlicher als nur main(), was dasselbe bedeutet */
    {
          int n = 0;
    
          printf("Bitte geben Sie die Anzahl der Messwerte ein: ");
          scanf("%d",&n);
    
          float mw[n];
          /* ...... */
    
          return 0; /* <- return ohne 0 ist hier aber nicht zulässig. Jetzt wundere ich mich wirklich, dass Dein Compiler nicht meckert */
    }
    


  • Mein Compiler gibt mir keine Fehlermeldung aus. Ich nutze "DEV-C++ Version 4.9.9.2".

    /*Programm zur Berechnung des Mittelwerts und der Standartabweichung von n Messwerten*/
    
    #include <stdio.h>
    #include <math.h>
    
    main()
    {
    
          int n, i;
          float m, v, s, summe=0, summe2=0; 
    
          printf("Bitte geben Sie die Anzahl der Messwerte ein: ");
          scanf("%d",&n);
    
          if ( n < 2 || n > 100 )
          {
             printf("Die Anzahl der Messwerte muss zwischen 2 und 100 liegen!\a\a\a \n");
          }
    
          else
          {
              float mw[n];
    
              for( i=0 ; i < n ; i++)
              {
                printf("Bitte geben Sie den %2d. Messwert ein ", i+1);
                scanf("%f",&mw[i]);
                summe += mw[i];
              }
    
          m = (1/n) * summe;
    
          for( i=0 ; i < n ; i++)
              {  
                 summe2 += pow((mw[i] - m),2);
                 i++;
              }
    
              v = ( 1 / ( n - 1 ) ) * summe2;
    
              s = sqrt ( v );
    
              printf("\nDer Mittelwert der %n von Ihnen eingegebenen Messwerte ist %f", n, m);
              printf("\nDie Standartabweichung betr\x84gt %f", s);
          }
    
          system("PAUSE");
          return 0;
    
    }
    

    Wenn ich diesen Quelltext compilieren lasse, dann meckert er nicht rum.
    Erst bei der Eingabe der Messwerte.
    Wenn ich z.B. n=2 und eingebe, dann kommt eine Fehlermeldung, dass das Programm beendet werden muß nach der Eingabe des zweiten Messwerts.

    Wo liegt der Fehler?



  • LordJaxom hat Dir doch die Antwort schon gepostet, wieso hast Du Zeile 23 noch nicht bearbeitet? Willst Du nicht std::vector<float> nehmen?



  • 😕 Wo steht im seinem Posting die Antwort für mein Problem?😕

    Hast du das Programm, wie ich es gepostet schon compilieren lassen und getestet?



  • Ich habe in der Tat Dein Programm getestet, allerding mit dem BCB6. Er meckert an, dass n kein konstanter Initialisierer für mw ist.



  • witte schrieb:

    Ich habe in der Tat Dein Programm getestet, allerding mit dem BCB6. Er meckert an, dass n kein konstanter Initialisierer für mw ist.

    Ich gehe wie gesagt immernoch von C99 aus, und da geht das. Und vector zu benutzen wird dann auch schwer.

    @ShaoLintt:
    Bei meinem C99-kompatiblen Compiler geht das Programm durch, und ich kann die Messwerte auch ordentlich eingeben. Ein Problem gibts erst bei der Ausgabe des Mittelwerts durch printf, weil da ein Fehler im Formatstring ist. Tipp: Für Ganzzahlen nimmt man %d oder %i.



  • %2d schreib ich nur wegen der Übersichtlichkeit, dass alle Zeilen untereinander gleich aussehen.

    So jetzt läuft das Programm wie gewünscht!
    Vielen Dank!

    /*Programm zur Berechnung des Mittelwerts und der Standartabweichung von n Messwerten*/
    
    #include <stdio.h>
    #include <math.h>
    
    main()
    {
    
          int n, i;
          float m, v, s, summe=0, summe2=0;
    
          printf("Bitte geben Sie die Anzahl der Messwerte ein: ");
          scanf("%d",&n);
    
          if ( n < 2 || n > 100 )
          {
             printf("Die Anzahl der Messwerte muss zwischen 2 und 100 liegen!\a\a\a \n");
          }
    
          else
          {
              float mw[n];
    
              for( i=0 ; i < n ; i++)
              {
                printf("Bitte geben Sie den %2d. Messwert ein ", i+1);
                scanf("%f",&mw[i]);
                summe += mw[i];
              }
    
          m = summe / n;
    
          for( i=0 ; i < n ; i++)
              {  
                 summe2 += pow((mw[i] - m),2);
                 i++;
              }
    
              v =  summe2 / ( n - 1 );
    
              s = sqrt ( v );
    
              printf("\nDer Mittelwert der %d von Ihnen eingegebenen Messwerte ist %f", n, m);
              printf("\nDie Standartabweichung betr\x84gt %f \n\n", s);
          }
    
          system("PAUSE");
          return;
    
    }
    

    Kommen wir nun zur Aufgabe b):
    Die Varianz hier im Programm mit "v" bezeichnet soll ich einem Unterprogramm berechnet werden.
    Leider komm nicht richtig weiter. 😞
    Ich bekomm immer eine Fehlermeldung in Zeile 46 "conflicting types for 'varianz'".
    Falls ich das Unterprogramm vor main() setze, dann gibt er mir eine Fehlermeldung aus, dass es ein Problem mit dem 3. Argument von 'varianz' gibt - sprich mit mw[]. Was soll ich in die Klammern eintragen?

    Meine bisherige Idee sieht folgendermassen aus:

    /*Programm zur Berechnung des Mittelwerts und der Standartabweichung von n Messwerten*/
    
    #include <stdio.h>
    #include <math.h>
    
    main()
    {
          int n, i;
          float m, v, s, summe=0;
    
          printf("Bitte geben Sie die Anzahl der Messwerte ein: ");
          scanf("%d",&n);
    
          if ( n < 2 || n > 100 )
          {
             printf("Die Anzahl der Messwerte muss zwischen 2 und 100 liegen!\a\a\a \n");
          }
    
          else
          {
              float mw[n];
    
              for( i=0 ; i < n ; i++)
              {
                printf("Bitte geben Sie den %2d. Messwert ein ", i+1);
                scanf("%f",&mw[i]);
                summe += mw[i];
              }
    
              m = summe / n;
    
              varianz(m, n, mw); 
    
              s = sqrt ( v );
    
              printf("\nDer Mittelwert der %d von Ihnen eingegebenen Messwerte ist %f", n, m);
              printf("\nDie Standartabweichung betr\x84gt %f \n\n", s);
          }
          system("PAUSE");
          return;    
    } 
    
    /* Unterprogramm zur Berechnung der Varianz */
    
    float varianz(float m,int n,float mw)  
    {
          float summe2=0, v;
          int i;
    
          for( i=0 ; i < n ; i++)
          {  
                 summe2 += pow((mw - m),2);
                 i++;
          }
    
          v =  summe2 / ( n - 1 );
    
          return v;
    }
    

    Wo liegt der Fehler?



  • Probier mal das:

    varianz(m,n,mw[i]);
    

    durch das:

    varianz(m,n,mw);
    

    zu ersetzen, da du sonst der Funktion nur einen Float-Wert übergibst und kein Array.

    MfG



  • Leider bekomm ich immer noch die Fehlermeldung in Zeile 46 "conflicting types for 'varianz'". 😞

    Andere Vorschläge?
    Leider hab ich noch nie ein Unterprogramm mit Arrays programmiert.


Anmelden zum Antworten