Problem mit Programm zur Mittelwertberechnung
-
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.