float werte fehleingabe überprüfen
-
huhu wir sollen Dynamisch Speicherplatz zuweisen
also haben wir zbfloat zahlen[zug speicher];
sagen wir wir haben 20 float´s zugewiesen .Nun kann der Benutzer 20 zahlen eingeben,davon wird dann der mittelwert usw gebildet.
Auch eine Fehlerabfrage soll das Programm haben.ich hab nur gerade keine idee wie genau ich das machen soll.Wir hatten das mal mit isdigit gemacht aber das geht ja nur bei char und dann würde ja das "." bei einer kommazhal auch als störent angesehen werden.
Aber da ich hier float zahlen habe geht das ja sowieso nicht
hat da jemand nen Tipp was ich da machen kann?
-
scanf liefert als Rückgabewert die Anzahl der erfolgreich gelesenen Werte. Denk daran, dass die nicht erfolgreich gelesenen Zeichen danach immer noch im Eingabestrom sind!
-
scanf macht kein Wertebereichsprüfungen, d.h. liefert trotzdem OK, falls ein Wert <>FLT_MAX/MIN usw. eingegeben wurde. Auch bricht scanf beim ersten nicht passenden Zeichen ab und liefert, falls zuvor mind. 1 Ziffer ausgewertet wurde, auch wieder OK.
Besser ist die Funktion strtod.
-
Hallo alle Zusammen,
ich bin neu hier und brauche dringend hilfe. Ich muss ein Programm schreiben, welches Statistikwerte ermittelt.
Funktion des Programms: Der Benutzer wird gefragt von wie vielen Werten er die Statistikwerte ermitteln möchte. Nach eingabe dieser Zahl gibt er die Werte ein.
Das Programm berechnet die Werte und gibt diese aus. Fertig!Mein Problem ist, dass ich keine Fehleingabe abfangen kann bzw. null Ahnung habe, wie ich das programmieren soll
. Es sind nämlich nur Zahlen erlaubt. Also keine Buchstaben oder Sonderzeichen, etc.
Kann mir jemand bitte dringend helfen!?
Hier mein Quellcode des Programmes:
# include <stdio.h>
# include <stdlib.h>
# include <math.h>void eingabe(float*,int);
float get_statistikwerte(float*,int,float*);
void ausgabe(float*);int main (void)
{
float* feld;
int dimension;
float ergebnis[6];
int wiederholen;do
{
printf("Geben Sie bitte an mit wie vielen Werten die Berechnung durch gefuehrt\nwerden soll.\n");
scanf("%i",&dimension);
fflush (stdin);feld=(float*)malloc((float)dimension*sizeof(float));
if(feld==NULL)
{
printf("Speicherplatz konnte nicht reserviert werden!\n");
}
else
{
eingabe(feld,dimension);get_statistikwerte(feld,dimension,ergebnis);
ausgabe(ergebnis);
}
printf("Moechten Sie eine weitere Rechnung durch fuehren? Druecken Sie 1 fuer Ja\nund 2 fuer Nein!\n");
scanf("%i",&wiederholen);
fflush(stdin);
}while(wiederholen==1);
printf("Ende\n");
getchar();
return(1);}
void eingabe(float *werte,int dimension1)
{
int index2;
printf("Bitte Zahl eingeben:\n");
for(index2=0;index2<dimension1;index2++)
{
scanf("%f",&werte[index2]);
}
printf("\nAlle Werte wurden eingelesen. Berechnung startet:\n");
printf("__________________________________________________\n");
}float get_statistikwerte(float *zahlen,int dimension,float *ergebnis)
{
int index3;
int index4;float zwischenergebnis1=0;
float zwischenergebnis2=0;ergebnis[0]=zahlen[0];
ergebnis[1]=zahlen[0];for(index3=0;index3<dimension;index3++)
{
if(zahlen[index3]<ergebnis[0])
{
ergebnis[0]=zahlen[index3];
}
if(zahlen[index3]>ergebnis[1])
{
ergebnis[1]=zahlen[index3];
}
}for(index4=0;index4<dimension;index4++)
{
zwischenergebnis1=zahlen[index4]+zwischenergebnis1;
}
ergebnis[2]=zwischenergebnis1/dimension;for(index4=0;index4<dimension;index4++)
{
zwischenergebnis2=((zahlen[index4]-ergebnis[2])*(zahlen[index4]-ergebnis[2]))+zwischenergebnis2;
}
ergebnis[3]= zwischenergebnis2/(dimension-1);ergebnis[4]=sqrt(ergebnis[3]);
return(1);
}void ausgabe(float *lösung)
{
printf("Das Minimum betraegt: %f\n\n",lösung[0]);printf("Das Maximum batraegt: %f\n\n",lösung[1]);
printf("Der Mittelwert betraegt: %f\n\n",lösung[2]);
printf("Die Streuung ist: %f\n\n",lösung[3]);
printf("Die Standartabweichung ist: %f\n\n",lösung[4]);
}
-
lekkenlu schrieb:
Mein Problem ist, dass ich keine Fehleingabe abfangen kann bzw. null Ahnung habe, wie ich das programmieren soll
. Es sind nämlich nur Zahlen erlaubt. Also keine Buchstaben oder Sonderzeichen, etc.
Du hast doch schon diesen alten Thread mi zwei sinnvollen Antworten gefunden.
Du musst den Rückgabewert von scanf auswerten:
int geleseneWerte; ... geleseneWerte = scanf(/*dein Code hier*/);
Bei dir muss geleseneWerte == 1 sein wenn scanf eine float-Zahl erkannt hat.
Zum Wiederholen gibt es Schleifen (Habe ich in deinem Programm schon gesehen).In der Zeile mit
feld=(float*)malloc((float)dimension*sizeof(float));
solltest du eine Warnung bekommen, dass die Typen nicht zusammenpassen.
Mit dem(float)
vor dimension wandelst du dimension in einfloat
um.
malloc
erwartet als Parameter einen Wert vom Typsize_t
(ein Ganzzahltyp).
Das du Speicher für float haben möchtest ergibt sich aus dem Typ von feld.
Darum ist in C auch der cast (das float*) vor dem malloc nicht nötig.Bitte nutze beim nächsten mal die cpp Tags für deinen Code (Code markieren und den C/C++ Button unter den
anklicken). Dann bleibt der Code richtig formatiert.
Zudem solltest du statt float lieber double nehmen. Das einzige was sich für dich ändert ist der Formatspecifier bei
scanf
.Wegen der Standartabweichung schau noch mal hier