Taschenrechner mit 4 Grundrechenarten mit Switch und Case
-
Hi,
Bitte nutze C/C++ code tags wenn du hier im Forum code postest.
#include <stdio.h> int main() { int auswahl1; int auswahl2; float zahl1; float zahl2; int zahl4; int zahl5; int ergebnis_i; float ergebnis_f; printf("Choice your Datatype \n"); printf("1 for Interger \n"); printf("2 for Float \n"); scanf("%i",&auswahl1); switch (auswahl1) { case 1: printf("Please choice your Operation \n"); printf("1 for Addition \n"); printf("2 for Subtraktion \n"); printf("3 for Multiplikation \n"); printf("4 for Division \n"); scanf("%i",&auswahl2); switch (auswahl2) { case 1: printf("Bitte geben Sie die erste Zahl ein \n"); scanf("%i", &zahl4); fflush(stdin); printf("Bite geben sie die zweite Zahl ein \n"); scanf("%i", &zahl5); fflush(stdin); ergebnis_i=zahl4+zahl5; printf("Das Ergebnis der Addition lautet: %i", ergebnis_i); break; case 2: printf("Bitte geben Sie die erste Zahl ein \n"); scanf("%i", &zahl4); fflush(stdin); printf("Bitte geben Sie die Zweite Zahl ein \n"); scanf("%i", &zahl5); fflush(stdin); ergebnis_i=zahl4-zahl5; printf("Das Ergebnis der Subbratktion lautet: %i", ergebnis_i); break; } } fflush(stdin); getchar(); }
Bitte int main() benutzen.
Du hattest die Klammern beim 2. switch vergessen.
Das Verhalten von fflush(stdin) wurde im Standard nicht definiert und ist somit undefiniert. Falls du allerdings als Anfänger eh nur unter Windows und Visual Studio arbeitest ist das erstmal egal, sollte man nur im Hinterkopf haben.Ansonsten würde ich noch zu englischen Variablennamen raten.
Die Funktion scanf ist so wie du sie benutzt unsicher. (Ist zum testen aber auch egal)
Man kanns auch übertreiben mit Leerzeilen, am besten du überlegst dir ein System wann du wo Leerzeilen machst, dass führt zu einer besseren Übersicht.
-
Ok Danke werde am Programm weiter arbeiten.
-
Ok habe das Porgramm fertig aber sobald ich jetzt mit Float Zahlen arbeiten möchte arbeitet das Programm nicht mehr weiter?
Hab ich da was falsch oder?#include <stdio.h> int main() { int auswahl1; int auswahl2; float auswahl2; float auswahl1; float zahl1; float zahl2; int zahl4; int zahl5; int ergebnis_i; float ergebnis_f; printf("Bitte waehlen Sie ihren Datentype \n"); printf("1 Fuer Interger \n"); printf("2 Fuer Float \n"); scanf("%i",&auswahl1); switch (auswahl1) { case 1: printf("Bitte waehlen Sie ihre Rechenoperation \n"); printf("1 Fuer Addition \n"); printf("2 Fuer Subtraktion \n"); printf("3 Fuer Multiplikation \n"); printf("4 Fuer Division \n"); scanf("%i",&auswahl2); switch (auswahl2) { case 1: printf("Bitte geben Sie die erste Zahl ein \n"); scanf("%i", &zahl4); fflush(stdin); printf("Bite geben sie die zweite Zahl ein \n"); scanf("%i", &zahl5); fflush(stdin); ergebnis_i=zahl4+zahl5; printf("Das Ergebnis der Addition lautet: %i", ergebnis_i); break; case 2: printf("Bitte geben Sie die erste Zahl ein \n"); scanf("%i", &zahl4); fflush(stdin); printf("Bitte geben Sie die Zweite Zahl ein \n"); scanf("%i", &zahl5); fflush(stdin); ergebnis_i=zahl4-zahl5; printf("Das Ergebnis der Subtraktion lautet: %i", ergebnis_i); break; case 3: printf("Bitte geben Sie die erste Zahl ein \n"); scanf("%i", &zahl4); fflush(stdin); printf("Bitte geben Sie die Zweite Zahl ein \n"); scanf("%i", &zahl5); fflush(stdin); ergebnis_i=zahl4*zahl5; printf("Das Ergebnis der Multiplikation lautet: %i", ergebnis_i); break; case 4: printf("Bitte geben Sie die erste Zahl ein \n"); scanf("%i", &zahl4); fflush(stdin); printf("Bitte geben Sie die Zweite Zahl ein \n"); scanf("%i", &zahl5); fflush(stdin); ergebnis_i=zahl4/zahl5; printf("Das Ergebnis der Division lautet: %i", ergebnis_i); break; } } switch (auswahl2) { case 1: printf("Bitte waehlen Sie ihre Rechenoperation \n"); printf("1 Fuer Addition \n"); printf("2 Fuer Subtraktion \n"); printf("3 Fuer Multiplikation \n"); printf("4 Fuer Division \n"); scanf("%f",&auswahl2); switch (auswahl2) { case 1: printf("Bitte geben Sie die erste Zahl ein \n"); scanf("%f", &zahl1); fflush(stdin); printf("Bite geben sie die zweite Zahl ein \n"); scanf("%f", &zahl2); fflush(stdin); ergebnis_f=zahl1+zahl2; printf("Das Ergebnis der Addition lautet: %f", ergebnis_f); break; case 2: printf("Bitte geben Sie die erste Zahl ein \n"); scanf("%f", &zahl1); fflush(stdin); printf("Bitte geben Sie die Zweite Zahl ein \n"); scanf("%f", &zahl2); fflush(stdin); ergebnis_f=zahl1-zahl2; printf("Das Ergebnis der Subtraktion lautet: %f", ergebnis_f); break; case 3: printf("Bitte geben Sie die erste Zahl ein \n"); scanf("%f", &zahl1); fflush(stdin); printf("Bitte geben Sie die Zweite Zahl ein \n"); scanf("%f", &zahl2); fflush(stdin); ergebnis_f=zahl1*zahl2; printf("Das Ergebnis der Multiplikation lautet: %f", ergebnis_f); break; case 4: printf("Bitte geben Sie die erste Zahl ein \n"); scanf("%f", &zahl1); fflush(stdin); printf("Bitte geben Sie die Zweite Zahl ein \n"); scanf("%f", &zahl2); fflush(stdin); ergebnis_f=zahl1/zahl2; printf("Das Ergebnis der Division lautet: %i", ergebnis_f); break; } } fflush(stdin); getchar(); }
-
Mein Stand bei C++ ist erst Anfänger und so bringen die es uns an der Uni bei.
-
naja - das hier hat nichts mit C++ zu tun.
aber versuch doch einfach mal, die funktionalität in funktionen aufzuspalten:
switch(auswahl) { case 0: do_it_with_int(); break; case 1: do_it_with_float(); break; default: printf("wrong choice"); }
und dann kannst du in den beiden funktionen jeweils eine funktion get_operand() aufrufen:
char get_operand() { //printf... //scanf... return '+'; //dummy-rückgabe, weil du auch noch was zu tun haben sollst ;) } void do_it_with_int() { int lhs; int rhs; char operand = get_operand(); switch(operand) { case '+': printf("%i", lhs+rhs); break; case '-': printf("%i", lhs-rhs); break; case '/': printf("%i", lhs/rhs); break; case '*': printf("%i", lhs*rhs); break; default: /*sollte nicht mehr gebraucht werden, weil du das idealerweise bei get_operand prüfst*/ } }
das gleiche machst du noch mti float und schon bist du fertig
bb
edit:
so ähnlich würde ich es wohl in C++ machen.#include <iostream> char get_op() { char ret_val; do { std::cout << "Operand?" << '\n'; std::cin >> ret_val; } while(ret_val != '+' && ret_val != '-' && ret_val != '/' && ret_val != '*'); return ret_val; } template<typename T> T calc() { T lhs, rhs; std::cin >> lhs >> rhs; char op = get_op(); switch(op) { case '+': return lhs+rhs; case '-': return lhs-rhs; case '/': return lhs/rhs; case '*': return lhs*rhs; default: //das hier könntest du auch wegmachen, aber dann könnte es sein, dass dich so mancher... return T(); //... compiler warnt bzw so gar einen fehler ausgibt. } } #include <cstdlib> //system("PAUSE") int main() { const int int_ = 0; const int float_ = 1; int auswahl; std::cout << "Welcher Datentyp?" << '\n' << '[' << int_ << ']' << "\t fuer integer" << '\n' << '[' << float_ << ']' << "\t fuer gleitkommazahlen" << '\n'; std::cin >> auswahl; switch(auswahl) { case int_: std::cout << calc<int>() << std::endl; break; case float_: std::cout << calc<float>() << std::endl; break; default: std::cout << "fehler, programm wird beendet...." << std::endl; } system("PAUSE"); //böse - in der konsolen-faq stehen bessere wege }
-
Ja danke für den Tipp aber wie soll ich dan das meinen Prof erklären mit den neuen codes da, ich bitte doch nur zu gucken wo ich da einen Fehler habe.
Danke
-
aber versuch doch einfach mal, die funktionalität in funktionen aufzuspalten
mach das doch einfach mal - und dann wirst du selbst sehen, wo iwas nicht mehr richtig läuft...
bb
-
unskilleds Lösung ist natürlich besser, aber da du ja deine Fehler aufgezeigt haben möchtest:
Gucke dir mal deine switch anweisungen an:
switch(a1) { case 1:.. switch(a2) { } } switch(a2) { case 1:.. switch(a2) { } }
Das macht so keinen Sinn oder? Sollte so aussehen:
Frage: Int/Float switch(a1) { case 1:.. switch(a2) case 2:.. switch(a2) }
Oder?
Das system("pause") ist zwar unschön, aber vielleicht kannste dein Programm damit ja für den anfang quasi "debuggen" und "breakpoints" setzen. Mach einfach so ein paar system("pause") in dein Programm und gucke was passiert. Dann siehst du genau wo du in deinem Programm gerade bist und was schief läuft.
-
unskilled schrieb:
so ähnlich würde ich es wohl in C++ machen.
cooky451 schrieb:
unskilleds Lösung ist natürlich besser
Unsinn. Ein echter C++ Programmierer schreibt etwas in dieser Art:
#include <iostream> #include <map> #include <boost/array.hpp> #include <boost/tr1/functional.hpp> template<typename T> class calculator { char read_op() { std::cout << "Operand?" << std::endl; char retv; while (!(std::cin>>retv && ops.find(retv)!=ops.end())); return retv; } T read_value() { T val; while (!(std::cin >> val)); return val; } std::map<T, std::tr1::function<T(T,T)> > ops; public: calculator() { ops['+'] = std::plus <T>(); ops['-'] = std::minus <T>(); ops['*'] = std::multiplies<T>(); ops['/'] = std::divides <T>(); } T calc() { char op = read_op(); T a=read_value(), b=read_value(); return ops[op](a, b); } }; template<typename T> void calc() { calculator<T> c; std::cout << c.calc() << std::endl; } template<typename InputIterator> InputIterator prompt_pair(InputIterator first, InputIterator last, int firstnum=0) { InputIterator it = first; int nr; for (int i=firstnum; it!=last; it++,i++) std::cout << '[' << i << "] für " << it->first << std::endl; while (!(std::cin >> nr && nr-firstnum>=0 && nr-firstnum<last-first)); std::cout << "Auswahl: " << nr << std::endl; std::advance(first, nr-firstnum); return first; } int main() { boost::array<std::pair<const char*, std::tr1::function<void()> >, 4> choices = { { { "Ganzzahlen", &calc<int> }, { "Gleitkommazahlen", &calc<float> }, { "Genaue Gleitkommazahlen", &calc<double> }, { "Sehr genaue Gleitkommazahlen", &calc<long double>} } }; std::cout << "Welcher Datentyp?" << std::endl; prompt_pair(choices.begin(), choices.end())->second(); }
-
Haha ja, vielleicht, aber besser != am besten