Stefan21j Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 Hallo zusammen, ich habe ein kleines Programm als Hilfe geschrieben. Fragt mich nicht wofür denn eigentlich ist der Aufwand größer als der nutzen. Nur habe ich noch ein kleines Problem. Eigentlich sollte nuur w, s oder g eingeben werden, um die Aufgaben zu lösen. Aber ich habe festgestellt das ich auch mehr als einen Buchstaben eingeben kann und sich das Programm dann aufhängt (while-Schleife als wirkliche Schleife....) Wie kann ich es umgehen? Definieren das ich nur genau die Buchstaben als zulässige EIngabe erkenne? Einfach nur zulassen das er nur genau einen Buchstaben erkennt? Auch wenn mehr da stehen? Was denkt dir ist die sauberste Lösung? Und entschuldigt das Chaos im Programm..... Danke im Vorraus für Tips. LG Stefan #include <cstdlib> #include <iostream> #include <iomanip> #include <string> #include <cmath> using namespace std; void gwcalc (void) // 1. void-Container (Name: gwcalc) { float pwert; // "pwert" wird als float deklariert float psatz; // "psatz" wird als float deklariert cout<<"Sie haben die Berechnung des Grundwerts gewaehlt.\n\n\n"; cout<<"Bitte geben Sie den Prozentsatz ein.\n"; cin>>psatz; // die eingegebene Zahl wird als "psatz" eingelesen cout<<endl; // Zeilenumbruch mit Pufferleerung cout<<"Bitte geben Sie den Prozentwert ein.\n"; cin>>pwert; // die eingegebene Zahl wird als "pwert" eingelesen cout<<endl; cout<<"Grundwert: "<<pwert*100/psatz<<endl<<endl; // ^^ Der berechnete Wert wird neben "Grundwert:" ausgegeben } void pwcalc (void) // 2. void-Container (Name: pwcalc) { float gwert; float psatz; cout<<"Sie haben die Berechnung des Prozentwerts gewaehlt.\n\n\n"; cout<<"Bitte geben Sie den Grundwert ein.\n"; cin>>gwert; cout<<endl; cout<<"Bitte geben Sie den Prozentsatz ein.\n"; cin>>psatz; cout<<endl; cout<<"Grundwert: "<<gwert*psatz/100<<endl<<endl; } void pscalc (void) // 3. void-Container (Name: pscalc) { float gwert; float pwert; cout<<"Sie haben die Berechnung des Prozentsatzes gewaehlt.\n\n\n"; cout<<"Bitte geben Sie den Grundwert ein.\n"; cin>>gwert; cout<<endl; cout<<"Bitte geben Sie den Prozentwert ein.\n"; cin>>pwert; cout<<endl; cout<<"Grundwert: "<<100*pwert/gwert<<endl<<endl; } int main(int argc, char *argv[]) { system("color 6B"); char taste; taste='j'; while(tolower(taste)=='j') { system("cls"); char erwert; /* ^^ Die Leerstelle zwischen ' ' wird mit dem Variablenname "erwert" als "char" deklariert. */ cout<<"Bitte geben Sie an, was Sie berechnen moechten:\n\n"; cout<<"Grundwert = g, Prozentwert = w oder Prozentsatz = s\n\n"; cin>>erwert; cout<<endl; if (erwert == 'g') // wenn die Eingabe = mit 'g' ist dann ... gwcalc (); // ... fuehre den void-Container "gwcalc" aus else if (erwert == 'w') // wenn aber die Eingabe = mit 'w' ist dann ... pwcalc (); // ... fuehre den void-Container "pwcalc" aus else if (erwert == 's') // wenn aber die Eingabe = mit 's' ist, dann ... pscalc (); // ... fuehre den void-Container "pscalc" aus else // anderenfalls schreibe ... cout<<endl<<endl<<"Ihre Eingabe war nicht korrekt. Erneut versuchen?(j/n)"; cin>>taste; cout<<endl; } return 0; } Zitieren
TDM Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 Also ausm Stehgreif für main: int main(int argc, char* argv[]) { int coption; do { //clrscr(); cout<<"Hier Text"<<endl; cout<<"Hier Text"<<endl; fflush(stdin); coption = cin.get(); switch(tolower(coption)) { case 'g': cout << "g" << endl; break; case 'w': cout << "w" << endl; break; case 's': cout << "s" << endl; break; default: cout << "Hier Text" << endl; break; } cout << "Nochmal?" << endl; fflush(stdin); coption = cin.get(); } while (tolower(coption)!='n'); cin.get(); return 0; } btw: system-Befehle sind Müll. Zitieren
Stefan21j Geschrieben 3. Dezember 2008 Autor Geschrieben 3. Dezember 2008 Ich weiss des das Programm nicht wirklich schön geschrieben wurde... Hab den Code auch nur von nem Kollegen bekommen (angehender FiAE grad mit C++ angefangen) der nicht weiter kommt... hab kurz drüber geschaut und mir gefallen so ein paar Sachen nicht... Wollte sein Code aber nicht zu sehr ändern, da das die Sachen sind mit den er grad arbeitet... Es läuft soweit auch alles...nur sind halt schönheitsfehler drin die ich auch anders lösen würde.... Danke aber erstmal Zitieren
Klotzkopp Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 btw: system-Befehle sind Müll. Übrigens: fflush auf Eingabeströme erzeugt undefiniertes Verhalten. Zitieren
TDM Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 Übrigens: fflush auf Eingabeströme erzeugt undefiniertes Verhalten. War ja auch nur eine Quick&Dirty-Lösung. Wieso eigentlich? Ich geh aber ehrlich gesagt, lieber das Risiko ein, undefiniertes Verhalten zu provozieren, als Systembefehle zu nutzen (cls unter Linux gibts meines Wissens nach nicht) Zitieren
Klotzkopp Geschrieben 3. Dezember 2008 Geschrieben 3. Dezember 2008 War ja auch nur eine Quick&Dirty-Lösung. Wieso eigentlich?Da musst du die fragen, die den Standard verfasst haben. Ich geh aber ehrlich gesagt, lieber das Risiko ein, undefiniertes Verhalten zu provozieren, als Systembefehle zu nutzen (cls unter Linux gibts meines Wissens nach nicht)Und fflush(stdin) bewirkt beim gcc soweit ich weiß gar nichts. Wenn Portierbarkeit keine Anforderung ist, und du einen Compiler hast, der bei fflush(stdin) etwas Definiertes tut, ist beides gleichermaßen in Ordnung. Zitieren
TDM Geschrieben 4. Dezember 2008 Geschrieben 4. Dezember 2008 Da musst du die fragen, die den Standard verfasst haben. hmm, bei Google find ich immer nur was von wegen undefiniertem Verhalten bzw. keinen Grund. Ich dächte aber mich zu entsinnen, dass es eine Erweiterung im C-Standard gibt, welche das flushen des Inputstreams erlaubt. :beagolisc Was wäre denn die portablere flush-Alternative? fgets mit buffer auf stdin? Zitieren
Stefan21j Geschrieben 4. Dezember 2008 Autor Geschrieben 4. Dezember 2008 der fflush funzt schon im iostream... Hab bis jetzt noch nie Probs gehabt wenn ich es genutzt habe... Allerdings muss ich auch sagen das ich selten in C++ schreibe Zitieren
Klotzkopp Geschrieben 4. Dezember 2008 Geschrieben 4. Dezember 2008 der fflush funzt schon im iostream... Hab bis jetzt noch nie Probs gehabt wenn ich es genutzt habe... Das ist ein Argument, dass dir bei C und C++ schnell Kopfschmerzen bereiten kann, weil beide Sprachen leider an allen Ecken und Enden das beliebte "undefinierte Verhalten" haben. Daraus, dass dein Code funktioniert, kannst du nicht folgern, dass er richtig ist. Es ist möglich, dass er schon morgen, oder auf einem anderen Rechner, oder mit einem anderen Compiler, nicht mehr funktioniert. Wie gesagt, wenn du einen Compiler hast, der bei fflush auf Eingabeströmen etwas Definiertes tut, und wenn Portabilität für dich kein Thema ist, ist das in Ordnung. Ansonsten solltest du das lieber lassen. Zitieren
Stefan21j Geschrieben 4. Dezember 2008 Autor Geschrieben 4. Dezember 2008 Ich würde auch nie behaupten das mein Code richtig ist... Dann würde ich ja sagen, ich wäre richtig...das bin ich nun auch nicht Ich ziehe ein SPS oder eine I3E-programmierung jedem C vor Damit kann ich umgehen Wie gesagt C++ ist nur weil ich es mal gelernt habe. Arbeiten damit tue ich sehr selten. Und ich denke Ahnung von C++ habe ich auch nicht wirklich. Daher kann ich nur sagen das ich bis jetzt nie Probleme hatte, bei den Sachen die ich gemacht habe. 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.