Hilfe!? Scanf - Bei Eingabe von Buchstaben neu Abfragen...
-
Hallo!
ich hab folgendes vor, der benutzer soll eine Variable eingeben. Wenn er einen Buchstaben eingibt, soll er sofort erneut nach der Variablen gefragt werden.
So schauts bisher aus.
do
{
printf("Bitte den Wert für Variable a eingeben :\n");if (scanf("%f", &zahla) != TRUE)
{
printf("\n\n\nEingabefehler! Bitte keine Buchstaben eingeben!");
fehler=1;
}}while (fehler==1);
Leider kommt beim eingabe eines Buchstabens eine Endlosschleife.
Was hab ich da falsch gemacht.Vielen Dank!
MfG
Jan
-
Hab mal ints genommen, kannst du ja leicht auf double, float, was weiß ich umbiegen
int ret = 0, zahl = 0; do { puts("Bitte den Wert für Variable a eingeben:"); ret = scanf("%d", &zahl); //scanf gibt die Anzahl der erfolgreich eingelesenen Variablen zurück } while(ret != 1);
-
Vielen Dank schonmal. ich hab das nun so eingebaut:
Mal das ganze Prog...es kommt wieder eine endlosschleife bei eingabe von einem buchstaben...
Hab ich da jetzt was falsch gemacht?
Wofür weist Du zahl 0 zu?
DANKE!#include <stdio.h> #include <math.h> #define TRUE 1 #define FALSE 0 float zahla, zahlb, zahlc, nullst1, nullst2, nullstlinear; float wurzelinhalt, zwischenrechnung, negiert, fehler; double wurzel; char menue; int ret = 0, zahl = 0; int main() { do { printf("Nullstellenberechnung - Polynom 2.Grades\n"); printf("Normalform: ax²+bx+c\n\n"); do { printf("Bitte den Wert für Variable a eingeben:"); ret = scanf("%f", &zahla); //scanf gibt die Anzahl der erfolgreich eingelesenen Variablen zurück } while(ret != 1); printf("Bitte den Wert für Variable b eingeben :\n"); scanf ("%f", &zahlb); //Eingabe "b" printf("Bitte den Wert für Variable c eingeben :\n"); scanf ("%f", &zahlc); //Eingabe "c" if (zahla==0 && zahlb==0 && zahlc==0) printf("Die Funktion: %.1fX²+%.1fX+%.1f hat als Lösung " "die Menge der Reellen Zahlen\n",zahla,zahlb,zahlc); else if (zahla==0 && zahlb==0 && (zahlc>0 || zahlc<0)) printf("Die Funktion: %.1fX²+%.1fX+%.1f hat keine gültige Lösung!" ,zahla,zahlb,zahlc); else if (zahla==0 && zahlb!=0) { printf("Linearer Fall! "); if (zahlc < 0) { nullstlinear=(-1*zahlc)/zahlb; printf("X1 = %.3f",nullstlinear); } else { nullstlinear=(-1*zahlc)/zahlb; printf("X1 = %.3f",nullstlinear); } } else { printf("Funktion: %.1fX²+%.1fX+%.1f\n\n",zahla,zahlb,zahlc); printf("\n\nNullstellenberechnung:\n"); zwischenrechnung=-1*(zahlb/(2*zahla)); printf("Zwischenergebnis - Zwischenrechnung: %.3f\n\n",zwischenrechnung); wurzelinhalt=(zahlb*zahlb-4*zahla*zahlc)/(4*zahla*zahla); printf("Zwischenergebnis - Wurzelinhalt: %.3f\n\n",wurzelinhalt); if (wurzelinhalt < 0) //Bei negativem Wurzelinhalt: { negiert=-1*wurzelinhalt; //Negation printf("Zwischenergebnis - Wurzelinhalt Negiert: %.3f\n\n",negiert); wurzel = sqrt(negiert); printf("Zwischenergebnis - Wurzelauflösung: %.3f\n\n",wurzel); } else { wurzel = sqrt(wurzelinhalt); printf("Zwischenergebnis - Wurzelauflösung: %.3f\n\n",wurzel); } if (wurzelinhalt < 0) //Bei negativem Wurzelinhalt: { printf("X1 = %.3f + Wurzel aus 1 * %.3f\n",zwischenrechnung,wurzel); //Ausg. X1 printf("X2 = %.3f - Wurzel aus 1 * %.3f\n",zwischenrechnung,wurzel); //Ausg. X2 } else //Bei positivem Wurzelinhalt: { nullst1=zwischenrechnung+wurzel; nullst2=zwischenrechnung-wurzel; printf("X1 = %.3f\n",nullst1); //Ausg. X1 printf("X2 = %.3f\n",nullst2); //Ausg. X2 } } getchar(); printf("\n\n\n\n Programm neustarten (j) oder (n) ? ");//Abfr.: Neustart scanf("%c",&menue); getchar(); if (menue == 'n' ) { printf("\n\n\n\n Auf Wiedersehen !"); } else menue = menue; } while (menue == 'j' ); }
-
Joker333 schrieb:
Vielen Dank schonmal. ich hab das nun so eingebaut:
Mal das ganze Prog...es kommt wieder eine endlosschleife bei eingabe von einem buchstaben...
Windows, hm? Na ja, das Problem ist, dass noch ein '\n' im Eingabepuffer liegt, wenn die Auswertung erfolgt. Und das muss noch rausgeholt werden.
Neuer Anlauf:
#include <stdio.h> //Leert den Eingabepuffer void ignore(void) { int c; while ( (c=getchar()) != '\n' && c != EOF); } int main(int argc, char **argv) { int ret = 0, zahl = 0; do { puts("Bitte den Wert für Variable a eingeben:"); ret = scanf("%d", &zahl); ignore(); //Eingabepuffer leeren } while(ret != 1); return 0; }
Hab ich da jetzt was falsch gemacht?
Ne, war mein Fehler.
Wofür weist Du zahl 0 zu?
Ich initialisiere einfach die Variablen, damit sie nicht irgendwelche undefinierten Werte haben, die mir dann evtl. Probleme bereiten. Sollte man immer so machen.
MfG
GPC
-
Super ich glaube so läufts :-),
allerdings habe ich das return 0; weggelassen, mit dem läufts nicht, da beendet sich sofrt das Programm wenn man eine zahl eingibt.
Was bewirkt das denn? Kann ich das jetzt so lassen?VIELEN VIELEN DANK!
#include <stdio.h> #include <math.h> #define TRUE 1 #define FALSE 0 float zahlb, zahlc, nullst1, nullst2, nullstlinear; float wurzelinhalt, zwischenrechnung, negiert, fehler; double wurzel; char menue; void ignore() { int c; while ( (c=getchar()) != '\n' && c != EOF); } int main() { do { printf("Nullstellenberechnung - Polynom 2.Grades\n"); printf("Normalform: ax²+bx+c\n\n"); int ret = 0; float zahla = 0; do { printf("Bitte den Wert für Variable a eingeben:\n"); ret = scanf("%f", &zahla); ignore(); //Eingabepuffer leeren } while(ret != 1); printf("Bitte den Wert für Variable b eingeben :\n"); scanf ("%f", &zahlb); //Eingabe "b" printf("Bitte den Wert für Variable c eingeben :\n"); scanf ("%f", &zahlc); //Eingabe "c" if (zahla==0 && zahlb==0 && zahlc==0) printf("Die Funktion: %.1fX²+%.1fX+%.1f hat als Lösung " "die Menge der Reellen Zahlen\n",zahla,zahlb,zahlc); else if (zahla==0 && zahlb==0 && (zahlc>0 || zahlc<0)) printf("Die Funktion: %.1fX²+%.1fX+%.1f hat keine gültige Lösung!" ,zahla,zahlb,zahlc); else if (zahla==0 && zahlb!=0) { printf("Linearer Fall! "); if (zahlc < 0) { nullstlinear=(-1*zahlc)/zahlb; printf("X1 = %.3f",nullstlinear); } else { nullstlinear=(-1*zahlc)/zahlb; printf("X1 = %.3f",nullstlinear); } } else { printf("Funktion: %.1fX²+%.1fX+%.1f\n\n",zahla,zahlb,zahlc); printf("\n\nNullstellenberechnung:\n"); zwischenrechnung=-1*(zahlb/(2*zahla)); printf("Zwischenergebnis - Zwischenrechnung: %.3f\n\n",zwischenrechnung); wurzelinhalt=(zahlb*zahlb-4*zahla*zahlc)/(4*zahla*zahla); printf("Zwischenergebnis - Wurzelinhalt: %.3f\n\n",wurzelinhalt); if (wurzelinhalt < 0) //Bei negativem Wurzelinhalt: { negiert=-1*wurzelinhalt; //Negation printf("Zwischenergebnis - Wurzelinhalt Negiert: %.3f\n\n",negiert); wurzel = sqrt(negiert); printf("Zwischenergebnis - Wurzelauflösung: %.3f\n\n",wurzel); } else { wurzel = sqrt(wurzelinhalt); printf("Zwischenergebnis - Wurzelauflösung: %.3f\n\n",wurzel); } if (wurzelinhalt < 0) //Bei negativem Wurzelinhalt: { printf("X1 = %.3f + Wurzel aus 1 * %.3f\n",zwischenrechnung,wurzel); //Ausg. X1 printf("X2 = %.3f - Wurzel aus 1 * %.3f\n",zwischenrechnung,wurzel); //Ausg. X2 } else //Bei positivem Wurzelinhalt: { nullst1=zwischenrechnung+wurzel; nullst2=zwischenrechnung-wurzel; printf("X1 = %.3f\n",nullst1); //Ausg. X1 printf("X2 = %.3f\n",nullst2); //Ausg. X2 } } getchar(); printf("\n\n\n\n Programm neustarten (j) oder (n) ? ");//Abfr.: Neustart scanf("%c",&menue); getchar(); if (menue == 'n' ) { printf("\n\n\n\n Auf Wiedersehen !"); } else menue = menue; } while (menue == 'j' ); }
-
Joker333 schrieb:
Super ich glaube so läufts :-),
allerdings habe ich das return 0; weggelassen, mit dem läufts nicht, da beendet sich sofrt das Programm wenn man eine zahl eingibt.
Hast du das auch ans Ende deiner main geschrieben, so wie ich oben?
Was bewirkt das denn?
return an sich gibt Werte zurück (und zwar aus einer Funktion heraus) oder "beendet" eine Funktion, die nichts zurückgibt.
In dem Fall sind wir in einer speziellen Funktion, der main-Funktion. Diese gibt int zurück. Und dieser Rückgabewert wurde/wird dazu benutzt, z.B. einen Fehlerstatus anzuzeigen. Gibt main 0 zurück, lief alles glatt. Bei 1 konnte man z.B. die Datei nicht finden, bei 2 konnte man sie nicht öffnen und so weiter.
Das kann man frei vergeben, sollte aber irgendwo dokumentiert sein, wenn man denn davon gebrauch macht. Besser ist natürlich auch eine Fehlermeldung (mittels perror("Fehler"); ) auszugeben, anstatt einfach 3 zurückzugeben.Kann ich das jetzt so lassen?
Keine Ahnung, sieht ziemlich wirr aus, aber wenn's funktioniert geht's wohl klar
-
Super, danke für deine ausführliche Hilfe, nun klappts auch mit return 0;
Ja, schaut sicher noch Wirr aus, aber Abgabe ist "erst" morgen und als Erstsemester`er bin ich froh das das läuft
MfG
Jan
-
oder du machst
... int bInput = scanf(....) if(!bInput) while(getchar != '\n);
damit löst du auch die endlosschleife, sry wenns nicht das ist was du brauchst