Tamesis Geschrieben 19. November 2008 Geschrieben 19. November 2008 Hallo, ich bin gerade mal im 1. Lehrjahr zur Informatikkauffrau und lerne momentan C, also sind gerade bei den absoluten Grundlagen. Nun habe ich ein bisschen vorgearbeitet und einen Taschenrechner programmiert. Mein Arbeitskollege hat mich aber darauf hingewiesen, dass man auch anstatt Zahlen Text eingeben kann. Gibt es irgendeine Abfrage, die unterscheiden kann zwischen Zahlen und Buchstaben, damit eine Fehlermeldung ("Fehler, bitte geben Sie eine ZAHL ein" oder irgend so was) ausgegeben kann, wenn Text eingegeben wurde? Liebe Grüße Tamesis Zitieren
unbenannt Geschrieben 19. November 2008 Geschrieben 19. November 2008 Stichwort: Zeichenklassifizierung und Umwandlung Hinter dem Link verbirgt sich das OpenBook "C von A bis Z", mit dessen Hilfe ich meine ersten Gehversuche in C unternahm. Aber das nur am Rande... Für Dich interessant wäre die dort beschriebene Headerdatei "<ctype.h>" mit den Funktionen "isalpha" und "isdigit". Alternativ kannst Du natürlich auch die ASCII-Werte der einzelnen Zeichen manuell prüfen. Zitieren
Klotzkopp Geschrieben 19. November 2008 Geschrieben 19. November 2008 Stichwort: Galileo Computing :: C von A bis Z – 22.2 <ctype.h> – Zeichenklassifizierung und UmwandlungAll diese Funktionen setzen aber voraus, dass die Eingabe als Zeichenkette vorliegt, und selbst dann kann man nur jedes Zeichen einzeln prüfen. Ich würde als einfachste Lösung erst einmal den Rückgabewert von scanf prüfen Zitieren
Tamesis Geschrieben 19. November 2008 Autor Geschrieben 19. November 2008 also ich les die Eingabe mit scanf ein, und dann? also beispielsweise: scanf("%f", &eingabe1); ... scanf("%f", &eingabe2); und wie kann ich jetzt festsetzen, dass float nur zahlen beinhalten darf und dass, falls irgendetwas anderes eingetippt wird, eine Fehlermeldung erscheint? mir würde da spontan nur die switch-case-Variante einfallen, wüsste aber nicht, was die einzelnen fälle dann sein sollten... und danke an unbenannt, die tabelle wird mir später sehr nützlich sein Zitieren
unbenannt Geschrieben 19. November 2008 Geschrieben 19. November 2008 Da ich noch nie mit scanf() gearbeitet habe (keinerlei Verwendungsmöglichkeit in meinem derzeitigen Projekt) bin ich mal vorsichtig und bitte um Korrektur, sollte ich mich irren. scanf - Format prüfen scanf() liefert als Rückgabewert die Anzahl der erfolgreich gelesenen Werte. Im Fall von scanf("%f", &eingabe1); müsste also eine 1 zurückgeliefert werden. All diese Funktionen setzen aber voraus, dass die Eingabe als Zeichenkette vorliegt, und selbst dann kann man nur jedes Zeichen einzeln prüfen. Vielen Dank für den Hinweis. Da ich bislang größtenteils nur Zeichenketten zerlegen und verarbeiten musste, gibt es wohl noch einiges, was ich noch lernen muss. Zitieren
Tamesis Geschrieben 19. November 2008 Autor Geschrieben 19. November 2008 hm o.O wenn ich das aus dem unterricht richtig verstanden habe, liest scanf den speicher der tastatur aus und setzt das dann für die variable, die in meinem fall jetzt eingabe 1 heißt... es sei denn ich hab da grundlegend was missverstanden o.O Zitieren
Klotzkopp Geschrieben 19. November 2008 Geschrieben 19. November 2008 hm o.O wenn ich das aus dem unterricht richtig verstanden habe, liest scanf den speicher der tastatur aus und setzt das dann für die variable, die in meinem fall jetzt eingabe 1 heißt... es sei denn ich hab da grundlegend was missverstanden o.O scanf liest vom Standardeingabestrom des Prozesses, da muss nicht zwangsläufig die Tastatur dahinterstehen, das Konzept ist allgemeiner. Im Normalfall ist es aber so. Scanf wertet dabei den Formatstring aus ("%f" in deinem Fall) und schreibt dann die eingelesenen Daten in die zusätzlichen Parameter. Außerdem hat die Funktion aber auch noch einen Rückgabewert, den du abfragen kannst, indem du den Ausdruck mit dem Funktionsaufruf einer int-Variablen zuweist: int result = scanf( ... ); Zitieren
Tamesis Geschrieben 19. November 2008 Autor Geschrieben 19. November 2008 hm... das mit dem int result funktioniert bei mir nicht, er ließt da irgendwie gar nicht mehr ein O.o aber meine frage ist immer noch, wie kann ich unterscheiden, ob der benutzer wörter oder zahlen eintippt... vielleicht geht das mit c in dieser form auch gar nicht, hab im internet darüber leider nichts gefunden... Zitieren
Klotzkopp Geschrieben 19. November 2008 Geschrieben 19. November 2008 hm... das mit dem int result funktioniert bei mir nicht, er ließt da irgendwie gar nicht mehr ein O.o "er ließt da irgendwie gar nicht mehr ein" ist keine ausreichende Fehlerbeschreibung. Zeig den Code, und beschreib, was du eingibst und was das Programm macht. Zitieren
Tamesis Geschrieben 19. November 2008 Autor Geschrieben 19. November 2008 tschuldigung, hab ich vergessen o.O ich gebe die erste zahl ein, drücke enter und es passiert nichts. ich kann so oft enter drücken wie ich will, es passiert nichts das meinte ich mit "er ließt da irgendwie gar nicht mehr ein" #include <stdio.h> #include <stdlib.h> int main(void) { float erste_zahl; float zweite_zahl; char operatoren; float ergebnis; char wiederholung; do { system("Cls"); printf("\t\tTaschenrechner\n\n"); printf("Bitte geben Sie Ihre erste Zahl ein (Punkt anstatt Komma!):\n"); scanf("%f", &erste_zahl); fflush(stdin); int result = scanf("%f", &erste_zahl); printf("%d", result); system("pause"); system("Cls"); printf("\n\nBitte geben Sie Ihre zweite Zahl ein (Punkt anstatt Komma!):\n"); scanf("%f", &zweite_zahl); fflush(stdin); system("Cls"); do { printf("\n\nBitte geben Sie die Zahl f\x81r die Rechenart, die sie durchf\x81hren wollen, an\n"); printf("(+ = Addition, - = Subtraktion, * = Multiplikation, / = Division):\n"); scanf("%c", &operatoren); fflush(stdin); system("Cls"); switch(operatoren) { case '+': /* Addition */ ergebnis = erste_zahl + zweite_zahl; printf("\n\nErgebnis: %.2f \n\n\n", ergebnis); break; case '-': /* Subtraktion */ ergebnis = erste_zahl - zweite_zahl; printf("\n\nErgebnis: %.2f \n\n\n", ergebnis); break; case '*': /* Multiplikation */ ergebnis = erste_zahl * zweite_zahl; printf("\n\nErgebnis: %.2f \n\n\n", ergebnis); break; case '/': /* Division */ ergebnis = erste_zahl / zweite_zahl; printf("\n\nErgebnis: %.2f \n\n\n", ergebnis); break; default: /* Operator unbekannt! */ printf("\n\n! FEHLER: Operator unbekannt!\n\n"); } }while(operatoren != '+' && operatoren != '-'&& operatoren != '*'&& operatoren != '/'); printf("\n\nMoechten Sie weiterrechnen? (j/n):\n"); printf("\"n\" beendet das Programm!"); scanf("%c", &wiederholung); }while (wiederholung != 'n'); return 0; } Zitieren
Klotzkopp Geschrieben 19. November 2008 Geschrieben 19. November 2008 fflush(stdin) erzeugt undefiniertes Verhalten. Mach das raus. Zitieren
Tamesis Geschrieben 19. November 2008 Autor Geschrieben 19. November 2008 okay habs rausgelöscht. macht aber immer noch den gleichen fehler. Zitieren
Klotzkopp Geschrieben 19. November 2008 Geschrieben 19. November 2008 Hmm, kann ich nicht reproduzieren. Ich muss die Zahl zweimal eingeben, weil du zweimal scanf aufrufst, aber danach geht es normal weiter. Welchen Compiler bzw. welche Entwicklungsumgebung benutzt du? Zitieren
Guybrush Threepwood Geschrieben 19. November 2008 Geschrieben 19. November 2008 den solltest du ganz schnell loswerden Der ist total veraltet und verbuggt, wird aber leider meistens von Anfängern weiterempfohlen. Wenn du unter Windows arbeitest ist Visual C++ Express von Microsoft zu empfehlen. PS: Falls du unter Windows arbeitest kannst du auch fflush(stdin) verwenden weil es dort den Eingabepuffer löscht.... Zitieren
Tamesis Geschrieben 20. November 2008 Autor Geschrieben 20. November 2008 visual express c++ hab ich schon mal runtergeladen, nur hat er mir das immer als c++ datei abgespeichert, und nicht als c, hab auch nichts gefunden, wo ich das umstellen konnte o.O aber ich werds bei gelegenheit nochmal ausprobieren. danke =) Zitieren
Klotzkopp Geschrieben 20. November 2008 Geschrieben 20. November 2008 nur hat er mir das immer als c++ datei abgespeichert, und nicht als c, hab auch nichts gefunden, wo ich das umstellen konnte o.ONormalerweise reicht es, wenn du die vorgegebene Dateierweiterung auf .c änderst. Zitieren
Tamesis Geschrieben 20. November 2008 Autor Geschrieben 20. November 2008 okay, und wie krieg ich dann jetzt die abfrage hin? gar nicht? Zitieren
Klotzkopp Geschrieben 20. November 2008 Geschrieben 20. November 2008 okay, und wie krieg ich dann jetzt die abfrage hin? gar nicht? Möchtest du uns damit sagen, dass du mit MS Visual C++ dasselbe Problem hast? Zitieren
Tamesis Geschrieben 20. November 2008 Autor Geschrieben 20. November 2008 hm, ich glaube, ihr habt mein problem noch nicht ganz verstanden... vielleicht hab ich mich auch etwas verständlich ausgedrückt. ich habe mit dem taschenrechner selbst kein problem, der läuft und rennt wunderbar, sowohl mit dev-c++ als auch mit visual c++. Ich möchte allerdings eine Abfrage gestalten, die dem Benutzer erlauben, nur mit Zahlen weiter zu kommen, nicht aber mit Buchstaben. D.h. wenn der Nutzer sieht "Bitte geben Sie eine Zahl ein:" und "4" eintippt, gehts weiter zur zweiten Zahl. Wenn er allerdings "vier" eintippt, soll eine Fehlermeldung erscheinen, die ihm sagt, dass er nur Ziffern benutzen darf. Meine Frage war nun, ob das mit C überhaupt geht und wenn ja, wie. Zitieren
Klotzkopp Geschrieben 20. November 2008 Geschrieben 20. November 2008 Meine Frage war nun, ob das mit C überhaupt geht und wenn ja, wie.Das geht, indem du den Rückgabewert von scanf prüfst. Das hatten wir doch schon. Zitieren
Tamesis Geschrieben 20. November 2008 Autor Geschrieben 20. November 2008 hm, dann hab ich das nicht verstanden :confused: ich muss also bloß int result = scanf( ... ); eingeben, nur was muss ich dann damit tun? Zitieren
Klotzkopp Geschrieben 20. November 2008 Geschrieben 20. November 2008 ich muss also bloß int result = scanf( ... ); eingeben, nur was muss ich dann damit tun? Dann musst du den Wert von result prüfen. scanf gibt die Anzahl der erfolgreich eingelesenen Felder zurück, oder EOF bei einem Fehler. In deinem Fall würde das in etwa so aussehen: if( result == 1 ) { // Eingabe OK } else { // Fehler }[/code] Zitieren
Tamesis Geschrieben 20. November 2008 Autor Geschrieben 20. November 2008 hm.. okay danke =) Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.