Programm bricht ab
-
Hallo Leute, bin neu hier und auch noch leider ein Anfänger.
Ich habe folgendes Problem, mein Programm bricht an der Stelle ,,Bitte Wert für %i Messwert eingeben" einfach ab und es kommt das Programm reagiert nicht mehr.
Aufgabe: Mittelwertberechnung mit Felder/ arrays.
1. Anzahl Messwerte eingeben (0-1000)
2. Werte eingeben für Messwerte
3. Berechnen Mittelwert
4. Ausgabe MittelwertMein aktueller Code:
#include<stdio.h>
int main (void)
{int k,i,n;
double mw = 0;typedef double Mittelwert[1000];
Mittelwert Messung;
printf("Geben sie die Anzahl der Messwerte ein: ");
scanf("%i", &n);if ( (n<0) || (n>1000) )
{printf("Fehler, Messerrte nur zwischen 0-1000"); }else
{
for ( i=0; i<=(n-1); i=i+1)
{
printf("Bitte Wert fuer Messwert %i eingeben: " ,i+1);
scanf("%lf", Messung[i]);
}}
for (k=0; k<=(n-1); k=k+1)
{ mw = mw + Messung[k];}mw = mw / n;
printf("Der Mittelwert beträgt %lf", mw);
}Vorab besten Dank
-
Von welchem Typ ist Messung[i], was erwartet scanf bei Formatspezifizierer %lf?
Viele Compiler können dich vor solchen typischen Anfängerfehlern warnen. Denn ist mag zwar technisch korrektes C sein, aber nur weil C so ziemlich alles zulässt in der Annahme, dass der Programmierer sich auskennt. Aber der Compiler kann verdächtige Stellen trotzdem erkennen, du musst bloß Warnungen einschalten, damit er dir diese Stellen meldet. Der viel genutzte GCC meldet zu deinem Programm beispielsweise:
test.c: In function ‘main’: test.c:26:11: warning: format ‘%lf’ expects argument of type ‘double *’, but argument 2 has type ‘double’ [-Wformat] scanf("%lf", Messung[i]); ^ test.c:38:1: warning: control reaches end of non-void function [-Wreturn-type] } ^
-
Vielen vielen Dank für die schnelle Antwort, habe gerade gemerkt, dass ich das "&" vor Messung[i] vergessen habe.
-
Statt
i<=(n-1);
schreibt man in Ci<n;
(Kürzer und besser Erkennbar, dass es n Durchläufe sind)Und viel Spaß bei der Berechnung des Mittelwerts von 0 Werten
-
Hallo, wie meinst das "Und viel Spaß bei der Berechnung des Mittelwerts von 0 Werten"? Das Programm läuft bei mir eigentlich so ich es mir vorgestellt hatte und der Mittelwert wird auch berechnet aus den Werten die ich eingebe.
-
Dann gib doch mal bei "Geben sie die Anzahl der Messwerte ein:" eine 0 ein.
Der Mittelwert betrõgt -1.#IND00
^Division by Zero ist auch nicht mehr das, was es mal war.^
-
Oh ja stimmt, hätte ich jetzt garnicht bemerkt.
hätte es jetzt so geschrieben aber merke gerade das der fehler immer noch besteht.
if ( (n<=0) || (n>1000) )
{printf("Fehler, Messwerte nur zwischen 0-1000"); }Kannst mir sagen woran das liegt?
-
Du gibst zwar eine nette Fehlermeldung im Fehlerfall aus (die übrigens nicht passt - guck dir mal die Zahlen an), aber deine Rechnung wird ja trotzdem durchgeführt.
Wobei ich den Fall von 0 Messungen nicht abfangen würde. Der Durchschnittswert von 0 Messungen ist eben 0/0, not a number. DirkBs Implementierung drückt NaN ein bisschen komisch aus, aber da dran kannst du nichts ändern.
P.S.: Weitaus wichtiger: Wieso überhaupt eine Obergrenze?
double sum = 0, value; unsigned N = 0; while (scanf("%lf", &value) == 1) { ++N; sum += value; } double mean = sum / N;
Viel unkomplizierter, kann dafür aber mehr.
-
Paddy2208 schrieb:
Oh ja stimmt, hätte ich jetzt garnicht bemerkt.
hätte es jetzt so geschrieben aber merke gerade das der fehler immer noch besteht.
if ( (n<=0) || (n>1000) )
{printf("Fehler, Messwerte nur zwischen 0-1000"); }Kannst mir sagen woran das liegt?
Kann das sein,dass dein Code nach der Fehlermeldung hinter der if-else Abfrage weiterläuft ?
OK, war zu langsam;)