blondi2108 Geschrieben 14. April 2008 Geschrieben 14. April 2008 Hi leutz.. Muss für die Schule nen Taschenrechner programmieren und soll Fehler dabei abfangen! Wie mache ich das bitte, dass mein Prog nicht abstürzt, wenn Zahlen wie 123df3 eingeben werden.. Also wie lese ich einen String (eine Zeichenkette) an Zahlen ein und üperprüfe diese??? Zitieren
perdian Geschrieben 14. April 2008 Geschrieben 14. April 2008 Also wie lese ich einen String (eine Zeichenkette) an Zahlen ein und üperprüfe diese???In dem du die entsprechenden IO-Funktionen aus einer Standardbibliothek nutzt. Deine Frage ist viel zu unspezifisch. Wo genau hast du Probleme, was möchtest du erklärt bekommen? Hast du Probleme dabei den Algorithmus für dein Programm zu entwickeln (wie soll überprüft werden, ob die Eingabe eine gültige Zahl darstellt?) oder hast du Probleme mit der konkreten Umsetzung in C(++)? Was hast du bereits probiert, wie sieht dein Lösungsansatz aus? Zitieren
blondi2108 Geschrieben 14. April 2008 Autor Geschrieben 14. April 2008 hatte den gedankengang mit isdigit den eingegebene string zu überprüfen, doch der überprüft ja leider nur die erste zahl ich bin anfängerin und habe da so meine probleme soll also nen rechner programmieren (ist soweit auch fertig) nur die beiden einzugebenene zahlen sollen auch nur zahlen sein! nur wenn der string aus ziffern besteht soll das programm weiterlaufen (die auswahl der rechenoperation beginnen...) Zitieren
Guybrush Threepwood Geschrieben 14. April 2008 Geschrieben 14. April 2008 Naja also isdigit wäre schonmal eine Möglichkeit. Wenn du die Eingabe jetzt als String vorliegen hast dann musst nur noch mit einer Schleife darüber laufen und jedes einzelne Zeichen prüfen ob es eine Ziffer ist und wenn nicht entsprechend reagieren. Zitieren
perdian Geschrieben 14. April 2008 Geschrieben 14. April 2008 soll also nen rechner programmieren (ist soweit auch fertig) nur die beiden einzugebenene zahlen sollen auch nur zahlen sein!Ja, das hast du in deinem Ursprungsposting schon gesagt. Daher nochmal: Was willst du hier hören? Es wird dir niemand ein fertiges Programm vorsetzen und sagen "Bitteschön, das ist es" - das wäre auch kontraproduktiv. Du sollst an dem Beispiel lernen, wie die verschiedenen Funktionen und Programmierparadigmen eingesetzt werden. Das geht nur durch "Learning by Doing". Und wenn du dann Detailfragen hast - stell sie einfach. Aber komm nicht mit einer Rundumfrage "Muss das machen, wie geht das?" an. Die Idee mit "isDigit" ist doch schonmal gut - jetzt musst du das nur auf den Anwendungsfall übertragen. Als kleiner Hint: Ein String besteht aus mehreren Zeichen. Wenn du also nicht den String als ganzes kontrollieren kannst dann lauf einfach über die einzelnen Characters und führe die Überprüfung für jeden Character durch. Zitieren
blondi2108 Geschrieben 14. April 2008 Autor Geschrieben 14. April 2008 //if anweisung einbauen, in der eine Fehlermeldung auftritt, wenn buchstaben bzw falsche zahlen eingegeben werden. #include <stdlib.h> #include <math.h> #include <iostream.h> #include <conio.h> #include <ctype.h> double zahl1,zahl2,ergebnis,ergebnis2; //Benoetigte Werte char wdh,x; //Wiederholung des Programmes,eingegebene Auswahl der Rechenoperation int main(void){ do { system ("cls"); cout<<"<....................................................>"<<endl; cout<<"<................ WILLKOMMEN.........................>"<<endl; cout<<"<....................................................>\n"<<endl<<endl; cout<<"Dies ist ein Taschenrechner, zur Durchfuehrung von "<<endl; cout<<"Rechenoperationen mit 2 Zahlen!\n"<<endl; cout<<"Bitte geben Sie die erste Zahl ein: \n"<<endl; cin >>zahl1; cout<<"Bitte geben Sie eine zweite Zahl ein: \n"<<endl; cin>>zahl2; if (zahl2==0){ cout<<"Eine Division durch Null ist nicht moeglich!\n"<<endl; } else { do { system ("cls"); cout<<"\nBitte waehlen Sie eine Rechenoperation aus!"<<endl; cout<<"-------------------------------------"<<endl; cout<<"-- /-Addieren (1) --"<<endl; cout<<"-- /-Subtrahieren (2) --"<<endl; cout<<"-- /-Multiplikation (3) --"<<endl; cout<<"-- /-Division (4) --"<<endl; cout<<"-- /-Wurzel (5) --"<<endl; cout<<"-- /-Quadratzahl (6) --"<<endl; cout<<"-- --"<<endl; cout<<"-- /-Programm verlassen (0) --"<<endl; cout<<"-------------------------------------"<<endl<<endl; cin>>x; } while (x!='0' && x!='1' && x!='2' && x!='3' && x!='4' && x!='5' && x!='6'); { switch (x){ case '1':{ system ("cls"); ergebnis=zahl1+zahl2; cout<<"Das Ergebnis lautet: "<<ergebnis<<endl; break; } case '2':{ system ("cls"); ergebnis=zahl1-zahl2; cout<<"Das Ergebnis lautet: " <<ergebnis<<endl; break; } case '3':{ system ("cls"); ergebnis=zahl1*zahl2; cout<<"Das Ergebnis lautet: " <<ergebnis<<endl; break; } case '4': { system ("cls"); ergebnis=zahl1/zahl2; cout<<"Das Ergebnis lautet: " <<ergebnis<<endl; break; } case '5':{ system ("cls"); ergebnis=zahl1*zahl1; ergebnis2=zahl2*zahl2; cout<<"Die Quadratzahl der ersten Zahl lautet: " <<ergebnis<<endl; cout<<"Die Quadratzahl der zweiten Zahl lautet: " <<ergebnis2<<endl; break; } case '6': { system ("cls"); ergebnis=sqrt (zahl1); ergebnis2=sqrt (zahl2); cout<<"Die Wurzel der ersten Zahl lautet: " <<ergebnis<<endl; cout<<"Die Wurzel der zweiten Zahl lautet: " <<ergebnis2<<endl; break; } case '0': { system("cls"); cout<<"///////// // //"<<endl; cout<<"// //"<<endl; cout<<"// // // // //"<<endl; cout<<"// // // // ////////"<<endl; cout<<"////// //// // //"<<endl; cout<<"////// // // //"<<endl; cout<<"// // // //"<<endl; cout<<"// //// // //"<<endl; cout<<"// // // // //"<<endl; cout<<"///////// // // // //"<<endl<<endl<<endl<<endl<<endl<<endl<<endl; //system("PAUSE"); return EXIT_SUCCESS; break; } default: cout<<"Falsche Eingabe!"<<endl; }//Ende Switch }//Ende if }//Ende else cout << "\nMoechten Sie das Programm wiederholen?[J]\n\n"<<endl; cout<<"Ansonsten Abbruch mit jeder beliebigen anderen Taste!"<<endl; wdh = getch(); }//Ende do while(wdh =='J' || wdh == 'j'); return 0; }//Ende main Zitieren
blondi2108 Geschrieben 14. April 2008 Autor Geschrieben 14. April 2008 out<<"Dies ist ein Taschenrechner, zur Durchfuehrung von "<<endl; cout<<"Rechenoperationen mit 2 Zahlen!\n"<<endl; cout<<"Bitte geben Sie die erste Zahl ein: \n"<<endl; cin >>zahl1; cout<<"Bitte geben Sie eine zweite Zahl ein: \n"<<endl; cin>>zahl2; hier habe ich das problem! ich weiß halt nicht wie ich hier die zahlen abfragen kann... kann ja schließlich nicht jede position mit einer ifabfrage zu jedem buchstaben überprüfen Zitieren
blondi2108 Geschrieben 14. April 2008 Autor Geschrieben 14. April 2008 cout<<"///////// // //"<<endl; cout<<"// //"<<endl; cout<<"// // // // //"<<endl; cout<<"// // // // ////////"<<endl; cout<<"////// //// // //"<<endl; cout<<"////// // // //"<<endl; cout<<"// // // //"<<endl; cout<<"// //// // //"<<endl; cout<<"// // // // //"<<endl; cout<<"///////// // // // //"<<endl<<endl<<endl<<endl<<endl<<endl<<endl; stellt sonst übrigens EXIT dar :-) Zitieren
Klotzkopp Geschrieben 14. April 2008 Geschrieben 14. April 2008 stellt sonst übrigens EXIT dar :-)Und wenn du Code-Tags verwenden würdest, könnte man das auch erkennen. Ich hole das mal für dich nach. Das nächste Mal denk bitte selbst dran. Zitieren
perdian Geschrieben 14. April 2008 Geschrieben 14. April 2008 kann ja schließlich nicht jede position mit einer ifabfrage zu jedem buchstaben überprüfenAber du kannst die Eingabe zunächst in einen String einlesen, anschließend den String überprüfen (Character für Character) und nach erfolgreicher Prüfung des String in einen numerischen Wert umwandeln und für die Berechnung weiterverwenden. Zitieren
Klotzkopp Geschrieben 14. April 2008 Geschrieben 14. April 2008 kann ja schließlich nicht jede position mit einer ifabfrage zu jedem buchstaben überprüfenDoch, genau das kannst du und musst du auch. Lies die Zahl als String ein, und prüf dann in einer Schleife jedes einzelne Zeichen. Zitieren
blondi2108 Geschrieben 14. April 2008 Autor Geschrieben 14. April 2008 wie soll den das funktionieren??? das wäre ja ne endloslange if abfrage... müsste ja abfragen, dass stringposition1 nich (a,b,c,...A,B,C ...etc.) geht das nicht auch einfacher??? Zitieren
Guybrush Threepwood Geschrieben 14. April 2008 Geschrieben 14. April 2008 Ja Naja also isdigit wäre schonmal eine Möglichkeit. Wenn du die Eingabe jetzt als String vorliegen hast dann musst nur noch mit einer Schleife darüber laufen und jedes einzelne Zeichen prüfen ob es eine Ziffer ist und wenn nicht entsprechend reagieren. Zitieren
blondi2108 Geschrieben 14. April 2008 Autor Geschrieben 14. April 2008 denkt ihr auch dran, das ich im 1. lehrjahr bin ? Zitieren
Klotzkopp Geschrieben 14. April 2008 Geschrieben 14. April 2008 wie soll den das funktionieren??? das wäre ja ne endloslange if abfrage... müsste ja abfragen, dass stringposition1 nich (a,b,c,...A,B,C ...etc.)Die Funktion isdigit hast du doch schon gefunden. Die musst du doch nur ein einer Schleife auf jedes Zeichen des Strings anwenden. geht das nicht auch einfacher???Du kannst auch die Eingabe in einen Stringstream packen, in einen int einlesen und hinterher prüfen, ob das Ende-Flag des Streams gesetzt, und das Fehlerflag nicht gesetzt ist. Damit kommst du um die Schleife herum. Aber ob das einfacher ist? Zitieren
blondi2108 Geschrieben 14. April 2008 Autor Geschrieben 14. April 2008 bin doch erst im 1. lehrjahr... also habt nen herz und nicht so nervige antworten, sorry, aber das hilft mir dann auch nicht weiter Zitieren
Klotzkopp Geschrieben 14. April 2008 Geschrieben 14. April 2008 bin doch erst im 1. lehrjahr...Na und? Darf man im ersten Jahr noch nicht denken? Die hier nun schon mehrfach vorgeschlagene Lösung enthält nichts, was in deinem Programm nicht schon drin wäre. Schleifen und Funktionen hast du doch schon. also habt nen herz und nicht so nervige antworten, sorry, aber das hilft mir dann auch nicht weiter Du hast hier klare Anweisungen bekommen, wie du das Problem lösen kannst. Wenn du das nicht umsetzen kannst, liegt das nicht daran, dass die Antworten "nervig" sind. Wenn du etwas an der vorgeschlagenen Lösung nicht verstehst, dann erkläre, was genau das Problem ist. Zitieren
blondi2108 Geschrieben 14. April 2008 Autor Geschrieben 14. April 2008 eure antworten sind nicht nervig... sie hören sich für mich so an als seit ihr genervt nem anfänger zu erklären was er zu tun hat.... so meinte ich das!!! bin doch froh über jede hilfe Zitieren
TDM Geschrieben 14. April 2008 Geschrieben 14. April 2008 bool tryparse(int character) { return ((character >= 0x30) && (character <= 0x39)); } int parse(int character) { return (character-0x30); } in Main: int character; double value = 0; while(tryparse(character = getch())) { value *= 10 + character; } Geht sicher noch sauberer/übersichtlicher... Zitieren
perdian Geschrieben 14. April 2008 Geschrieben 14. April 2008 eure antworten sind nicht nervig...Ich habe es weiter oben schon geschrieben: Willst du etwas lernen oder nicht? Wenn nein brauchen wir gar nicht weiter zu diskutieren - die fertige Lösung wirst du hier nicht bekommen - es sei denn du bist bereit meinen Standard-Stundensatz zu zahlen, dann mache ich nichts anderes als die das entsprechende Programm zu schreiben. Wenn du dennoch etwas lernen willst: Setz dich dran und denk selbst. Ob du im ersten Lehrjahr oder im 20. Berufsjahr bist macht da keinen Unterschied - aber das eigenständige Denken wird dir hier niemand abnehmen. Und zum Tonfall: Du willst etwas von uns - nämlich Hilfe. Und dann solltest du es denjenigen, die bis von ein paar Postings sicher noch bereits waren dir zu helfen so einfach wie möglich machen und nicht bei jedem Mal wo dir geholfen wird auch noch meckern. bin doch froh über jede hilfeAber scheinbar nicht für den Tipp (auch) selbst denken zu wollen. Zitieren
Klotzkopp Geschrieben 14. April 2008 Geschrieben 14. April 2008 bool tryparse(int character) { return ((character >= 0x30) && (character <= 0x39)); } int parse(int character) { return (character-0x30); }[/CODE] tryparse tut dasselbe wie die Standardfunktion isdigit. [CODE] while(tryparse(character = getch())) { value *= 10 + character; }getch ist nicht im Standard. Deine Lösung hat zudem das Problem, dass sie bei ungültigen Zeichen einfach vorzeitig abbricht, statt einen Fehler zu melden. Zitieren
TDM Geschrieben 14. April 2008 Geschrieben 14. April 2008 tryparse tut dasselbe wie die Standardfunktion isdigit. getch ist nicht im Standard. Deine Lösung hat zudem das Problem, dass sie bei ungültigen Zeichen einfach vorzeitig abbricht, statt einen Fehler zu melden. getch war auch nur ein Lösungsansatz. Das mit dem Abbrechen ist mir auch klar, ich wollte ihr nur ein (unfertiges) Beispiel zeigen, für Geistesblitz und so. Zitieren
Klotzkopp Geschrieben 14. April 2008 Geschrieben 14. April 2008 getch war auch nur ein Lösungsansatz. Das mit dem Abbrechen ist mir auch klar, ich wollte ihr nur ein (unfertiges) Beispiel zeigen, für Geistesblitz und so.War ja auch nur ein Hinweis . Ich finde solche Lösungen mit Einlesen einzelner Zeichen immer etwas "frickelig", vor allem, wenn das alles auch sauber mit Standardmitteln geht. Hier kann man die Prüfung ja auch prima nach der Eingabe machen. Zitieren
TDM Geschrieben 14. April 2008 Geschrieben 14. April 2008 Ich finde solche Lösungen mit Einlesen einzelner Zeichen immer etwas "frickelig", vor allem, wenn das alles auch sauber mit Standardmitteln geht. Hier kann man die Prüfung ja auch prima nach der Eingabe machen. Dito. Ich habe extra auf eine Zeicheniteration verzichtet und getch() nur genommen, damit sie sieht, wie sie jedes einzelne Zeichen abprüfen kann. Soviel zu "endloslange if abfrage...". getchar(), was ja meines Wissens im Standard ist, wollte ich nicht nehmen, weil das Enterdrücken bei großen Zahlen auf dauernd sicher nervig ist. Zitieren
blondi2108 Geschrieben 14. April 2008 Autor Geschrieben 14. April 2008 bool eingabe ( char zahl1 [7] ) { int anzahl = 0, stelle = 50; for (int i = 0; i < 7; i++) { if (isdigit(zahl1[i])) { if (zahl1[i] <= stelle) { if (i == 0) {stelle = 51; anzahl++;} else if ((i == 1)|(i == 3)) {stelle = 53; anzahl++;} else if ((i == 2)|(i == 4)) {stelle = 57; anzahl++;} else if (i == 5) {anzahl++;} } } } if (anzahl == 6) {cout<<"Falsche Eingabe";} else { ..... }//Wiederholung mit Abfrage der 2ten zahl } wo ist denn jetzt bitte mein gedankenfehler.... 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.