Komplexer Taschenrechner
-
Hallo,
das ist mein erster Post und gleich ne harte Nuss.Ich muss folgende Aufgabe erstellen.
Schreiben Sie in C++ ein Programm mymath, welches einen einfachen Taschenrechner
nachbildet.
Implementieren Sie eine Klasse CMathFloat, welche für den Datentyp „float“ einen
Taschenrechner mit den Operationen „+“, „-“, „unäres –“, und „*“ sowie
Klammersetzung beherrscht. Als Eingabe soll ein Textstring dienen, wobei Lehrzeichen
(Blanks, Tabs) zu ignorieren sind. Die Klasse soll für einen mathematischen Ausdruck
den Ergebniswert ausrechnen.
Sollte der Eingabestring syntaktische Fehler aufweisen, so sind entsprechend
aussagekräftige Exceptions zu werfen. Die Exception soll neben dem konkreten
Fehlertyp auch den ursprünglichen String mit ausgeben, wobei die Stelle mit dem
Syntaxfehler durch eckige Klammern zu markieren ist.
Schreiben Sie weiters eine Klasse CMathFloatTrig, welche dieselbe Funktionalität wie
CMathFloat bereitstellt, allerdings zusätzlich zu den beschriebenen Grundoperationen
noch die trigonometrischen Funktionen „sin(x)“ und „cos(x)“ beherrscht.
CMathFloatTrig soll von CMathInt abgeleitet werden.
Das Programm soll per Option auf die Benutzung von CMathFloat und CMathFloatTrig
umschaltbar sein:
mymath [-t] mathstr
-t … damit wird die Benutzung der Klasse CMathFloatTrig aktiviert.
Defaultmäßig ist die Klasse CMathFloat zu benutzen.
Zusätzlich soll als Argument der zu parsende String übergeben werden. Ein String mit
Lehrzeichen ist beim Aufruf unter Anführungszeichen zu setzen.Tja keine Ahnung wie Ich da rangehen soll.
Vieleicht könnt ihr mir helfen.
-
Entweder Leute hier bezahlen, damit sie das das fertig machen, oder erstmal selbst anfangen und dann bei Problemen sagen, wo es hängt.
Sind doch schon konkrete Anweisungen in der Aufgabe. z.B. welche Klassen zu erstellen sind...
-
Nur dumm, dass du es selbst programmieren sollst
-
Zuerst mal eine Klasse CMathFloat erstellen, dann ein paar Funktionen hinzufügen und rumprobieren, bis es das macht, was du willst..
Es gibt Gründe, warum das AUFGABE heisst. Du sollst hier was lernen. Und solang du nicht wenigstens Ansatzweise Code zeigst, dass du es versuchst, wirst du keine Lösung bekommen.
-
Thorgos schrieb:
Tja keine Ahnung wie Ich da rangehen soll.
Vieleicht könnt ihr mir helfen.Hi Bruder !
Hast du schon einmal eine Klasse in C++ geschrieben ?
-
das ist aber keine Aufgabe für einen Anfänger, der nicht weiß wie man eine Klasse anlegt. Und diese Aufgabenstellung ist mir auch suspekt; da gibt es eine Menge Interpretationsspielraum. Eine Klasse hat nicht automatisch eine Eingabe. Die Sache mit der Ableitung macht man normal so nicht - siehe Item 35 und 36 von Scott Meyers 'Effektiv C++ programmieren' Thema Vererbung.
Eine Methode und wie diese zu benutzen ist, wurde nicht genannt. Gibt es eine graphische Oberfläche oder soll das eine Konsolenapplikation werden?Hier ist ein Artikel über die Auswertung mathematischer Terme; vielleicht ist der hilfreich.
Eine einfachere Aufgabe mit einem Taschenrechner, der die sogenannte polnische Notation versteht hatten wir hier schon mal.
Gruß
Werner
-
Werner Salomon schrieb:
das ist aber keine Aufgabe für einen Anfänger, der nicht weiß wie man eine Klasse anlegt. Und diese Aufgabenstellung ist mir auch suspekt; da gibt es eine Menge Interpretationsspielraum. Eine Klasse hat nicht automatisch eine Eingabe. Die Sache mit der Ableitung macht man normal so nicht - siehe Item 35 und 36 von Scott Meyers 'Effektiv C++ programmieren' Thema Vererbung.
Eine Methode und wie diese zu benutzen ist, wurde nicht genannt. Gibt es eine graphische Oberfläche oder soll das eine Konsolenapplikation werden?Hier ist ein Artikel über die Auswertung mathematischer Terme; vielleicht ist der hilfreich.
Eine einfachere Aufgabe mit einem Taschenrechner, der die sogenannte polnische Notation versteht hatten wir hier schon mal.
Gruß
WernerNa, das passt hier schon. Die Namen müssten bloß "Taschenrechner" und "wissenschaftlicher Taschenrechner" heissen.
Der "wissenschaftliche Taschenrechner" spezialisiert den Taschenrechner und hat ansonsten alle sein Funktionen. Ich finde schon, dass man da vererben sollte.
-
Tachyon schrieb:
Na, das passt hier schon. Die Namen müssten bloß "Taschenrechner" und "wissenschaftlicher Taschenrechner" heissen.
Der "wissenschaftliche Taschenrechner" spezialisiert den Taschenrechner und hat ansonsten alle sein Funktionen. Ich finde schon, dass man da vererben sollte.Nein, und hier ist mehr Genauigkeit bei der Wortwahl notwendig. Der "wissenschaftliche Taschenrechner" kann keine Spezialisierung des "normalen Taschenrechners" sein, denn Spezialisierung bedeutet, dass das Speziellere durch bestimmte Konkretisierungen des Allgemeineren ausgedrückt werden könnte, keine Instanz eines "normaler Taschenrechner" verhält sich aber wie ein "wissenschaftlicher Taschenrechner". Wir haben es also mit einer Modifikation und nicht einer Konkretisierung von Verhalten zu tun: dafür ist Vererbung nach Liskov aber nicht geeignet. Wir können aber feststellen, dass "normaler Taschenrechner" und "wissenschaftlicher Taschenrechner" Teil einer allgemeineren Kategorie, die wir einfach "Taschenrechner" nennen können, sind. Diese allgemeine Kategorie wiederum ist abstrakt, ihr fehlen die Merkmale, die den Taschenrechner (im konkreten Fall) "normal" oder aber "wissenschaftlich" machen - umgekehrt kann sie wahrscheinlich eine Menge gemeinsames Verhalten implementieren. Tatsächlich ist es denkbar, dass der "normale Taschenrechner" praktisch keinerlei zusätzlich Implementation erfordert - in diesem Falle mag die zusätzliche Klasse überflüssig erscheinen. Dem ist nicht so.
class AbstractCalculator { /* ... */ }; class VanillaCalculator : public AbstractCalculator { /* ... */ }; class ScientificCalculator : public AbstractCalculator { /* ... */ };
"Leite niemals von einer konkreten Klasse ab" (nicht konkret hier: eine Klasse, die im konkreten Programm keine "most-derived"-Objekte erzeugt; sie muss nicht zwingend abstrakt im Sinne der Sprache sein). Leider wird dieses wichtige Prinzip - wie oben - viel zu oft ignoriert oder gar nicht verstanden.
-
beim dem taschenrechner hat alles noch soweit geklappt nur bei der erweiterung dazu wirds schwer.
es sollen beliebig viele rechnungen eigegeben werden (erledigt)
es sollen aber die letzten 10 rechnungen wieder ausgegeben werden (hauptproblem)
und zwar so 1+1=2.....ich weis nicht wie ich da ran gehe was muss ich den da schreiben brauch ich bestimmte variablen??
bin schon auf antwort gespannt
-
habe das proplem soweit gelöst aber ich bekomme beim ausgeben der felder das ergebnis nicht mit guckt mal vielleicht findet ihr was
[/code] #pragma <hdrstop> #include <iostream.h> #pragma argsused //--------------------------------------------------------------------------- int main(int argc, char* argv[]) { double zahl1, zahl2, ergebnis; double speicherzahl1[9]; double speicherzahl2[9]; char zeichenkette[9]; double ergebniszahl[9]; char coperator, auswahl; int i=0; do { std::cout << "--------Taschenrechner-------" << std::endl; std::cout << "-----------------------------" << std::endl; std::cout << "zahl eingeben" << std::endl; std::cin >> zahl1; std::cout << "operator eingeben" << std::endl; std::cin >> coperator; std::cout << "zahl eingeben" << std::endl; std::cin >> zahl2; //--Vergleich der Operatoren mit Rechnung--------- while (!( coperator == '/' || coperator == '*' || coperator == '+' || coperator == '-')) { std::cout << "rechenzeichen ungueltig, neues rechenzeichen eingeben" << std::endl; std::cin >> coperator; } if (i<=9) { speicherzahl1[i]=zahl1; zeichenkette[i]=coperator; speicherzahl2[i]=zahl2; i=i++; } switch (coperator) { case '*': ergebnis = zahl1 * zahl2; std::cout << zahl1 << " " << coperator << " " << zahl2 << " = " << ergebnis << std::endl << std::endl; break; case '/': ergebnis = zahl1 / zahl2; std::cout << zahl1 << " " << coperator << " " << zahl2 << " = " << ergebnis << std::endl << std::endl; break; case '+': ergebnis = zahl1 + zahl2; std::cout << zahl1 << " " << coperator << " " << zahl2 << " = " << ergebnis << std::endl << std::endl; break; case '-': ergebnis = zahl1 - zahl2; std::cout << zahl1 << " " << coperator << " " << zahl2 << " = " << ergebnis << std::endl << std::endl; break; } std::cout << "nochmal (j/n)" << std::endl; std::cin >> auswahl; } while (auswahl == 'j' || auswahl == 'J'); for (int a=0;a<i;a++) { cout<<speicherzahl1[a]<<zeichenkette[a]<<speicherzahl2[a]; } std::system ("Pause"); return 0; } [code]
-
ihr könnt die beiden einträge löschen hat sich erledigt