018
18.05.2003, 08:18 Uhr
Hans
Library Walker (Operator)
|
Hallo Sara,
so wie ich Dich verstanden habe, kann man Dein Problem nur lösen, indem man sich von scanf verabschiedet, und stattdessen eine andere Art der Zahleneingabe wählt. Denn scanf liefert bei fehlerhaften Eingaben, (in Deinem Fall was anderes als Ziffern) im besten Fall eine Null zurück. Wahrscheinlicher ist aber, dass scanf einfach abbricht, und gar nichts, bzw irgendwas undefiniertes zurück liefert. Deshalb hier mal eine abgeänderte Version von Deinem Programm. Die meisten Änderungen sind im Quelltext kommentiert. Hier aber folgendes: Ich hab die Aufrufe von scanf durch Aufrufe der Funktion zahlein() ersetzt, die ich gestern schon gepostet habe. (Ich hoffe, das dadurch auch klar wird, was sie macht, auch wenn das wie noch unklar bleibt.) Deine Pufferzuordnungen mittels setvbuf() ergeben meiner Ansicht nach nicht viel Sinn, weshalb ich sie auskommentiert habe. Dann war noch ein logischer Fehler bei Deiner Bereichüberprüfung:
C++: |
if(zufallszahl<x && x<1000) if(zufallszahl>x && x>1)
|
Wenn man da nämlich 1 bzw. 1000 eingibt, sagt einem das Programm nur, das man eine neue Zahl eingeben soll, aber nichts darüber, ob die eingegebe Zahl zu gross oder zu klein war. (Ist hier zwar nichts schwerwiegendes, kann aber verwirren). Doch jetzt erst mal das Programm:
C++: |
/* Datei: zalnratn.c
Eine Version des berühmten Zahlenraten Programms von Sara (Der Computer) aus dem C/C++ Forum (mit einer Lösung ihres Problems made by Hans) */
#include <stdio.h> #include <stdlib.h> /* für rand() und srand() */ #include <ctype.h> /* für isdigit() in der Funktion zalein() */ #include <time.h> /* für time() */ /* Weil in diesem Programm keinerlei höhere Mathematik betrieben wird, brauchen wir <math.h> nicht. */
/* Prototyp für eine eigene Funktion */ int zahlein(void);
main() { int i,x,zufallszahl; char weiter;
srand(time(NULL)); /* Sollte vor der Schleife stehen, weil es nur einmal beim Programmstart benötigt wird */ do { zufallszahl = rand() % 1000+1; /* Erst die Zahl "ausdenken", dann mit raten anfangen lassen. (Erscheint mir jeden- falls logischer ;-) */ printf("\n\t\t Zahlenraten zwischen 1 und 1000"); printf("\n\n\nBitte geben Sie eine Zahl ein: "); fflush(stdin); /* Eingabepuffer leeren */ x=zahlein(); /* Vom Benutzer eine Zahl eingeben lassen */ i=1; /* Damit zähle ich jetzt die Eingaben durch den Benutzer */ while(zufallszahl != x) { if(zufallszahl<x && x<=1000) /* Hier den Vergleich zu x<[b]=[/b]1000 geändert */ { /* Siehe Text, was das soll */ printf("\n%3d ist zu gross", x); } if(x<1) { printf("\n%3d liegt unter dem gesuchten Bereich!", x); } if(x>1000) { printf("\n%3d liegt ueber dem gesuchten Bereich!", x); }
if(zufallszahl>x && x>=1) /* Hier den Vergleich zu x>[b]=[/b]1 geändert */ { /* Siehe Text, was das soll */ printf("\n%3d ist zu klein", x); } printf("\n\nBitte geben Sie erneut eine Zahl ein: "); /* setvbuf (stdin, NULL, _IONBF, 0); setvbuf(stdin, NULL, _IOFBF, BUFSIZ); */ x=zahlein(); /* Vom Benutzer eine Zahl eingeben lassen */ i++; /* Eingaben mitzählen */ } printf("\nERRATEN!!!"); printf("\n(Mit %i Versuchen.)", i);
printf("\n\n\nMoechten Sie fortfahren? ja/nein"); fflush(stdin); weiter = fgetc(stdin); } while (weiter=='j' || weiter=='J');
return 0; /* Damit der Compiler die Warnung Warning W8070 Zalnratn.c 60: Function should return a value... nicht mehr ausgeben muss */ }
/* Funktion zur Eingabe von Zahlen; Es werden nur Ziffernzeichen akzeptiert, bei allen anderen Zeichen erscheint eine Fehlermeldung. Die Funktion erwartet keine Parameter, und gibt eine int-zahl zurück */
int zahlein(void) { int c,w;
w=0; /* In w "entsteht" die Zahl, die eigegeben wird. */ do { /* Lesen eines Zeichens aus der Standardeingabe, also der Tastatur */ c = fgetc(stdin);
/* Wenn c ein '\n' ist, die Schleife beenden */ if (c=='\n') break;
if ( !isdigit(c)) /* Wenn das Zeichen keine Ziffer ist, einen Fehler melden */ { printf ("Fehler!\a %c ist keine Ziffer.\n", c); continue; /* Schleife von vorne beginnen, ohne den Rest ab zu arbeiten */ } /* Anzeigen des Zeichens indem es in die Standardausgabe geschrieben wird */ /* putc(c, stdout); */
/* Eingegebene Ziffer zur Zahl hinzu fügen (siehe Text) */ w=w*10+(c-'0'); } while (c);
return w; }
|
Ich hoffe, das kommt Deinen Vorstellungen von der Lösung des Problems nahe, obwohl ich vermute, das ich Deinem Kurs ein wenig vorgreife...
Hans -- Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung. Dieser Post wurde am 18.05.2003 um 08:26 Uhr von Hans editiert. |