Stack-Rechner nach dem Beispiel eines HP15C
-
mal schauen, wie gx weitermacht. abgesehen von den fehlern, in den break-zweigen sehe ich viel doppelten code. variablen könnten lokaler werden. cin könnte verwendet werden. die verschachtelungstiefe in der main läßt sich vielleicht reduzieren. es gibt noch viel zu tun, wenn man es drauf anlegt.
das zeugs allerdings in eine klasse zu stopfen, die genau einmal benutzt wird, naja, es bringt wenig und stört nicht. sollte aber wirklich nicht das primärziel sein.FreakY<3Cpp schrieb:
Ich finde den Code nicht sooo gut, ich hatte ein wenig Zeit gebraucht mich einzulesen. Danach kann man ihn immernoch in eine Klasse stopfen ... Wieso nicht gleich ?
weil ihr scherzkekse sofort übertreibt. dann bekommt die klasse erstmal ein template-argument für den zu verrechnenden typ. wissenschaftlicher rechner oder finanzrechner? ja, noch eine policy reinmischen. natürlich mit te,plate-metaprogrammierung aus rechnertyp und den datentyp die erlaubten operationen berechnen. uih, cout ist aber dumm. eine observer-schnittstelle würde das viel allgemeiner lösen. und bla und blubb und overenegneered unfug. dazu kann ich nur sagen: wirklich gut wird's erst, wenn man auch mal verzichten kann.
-
Hm letztens war der Code noch gut wartbar und verständlich, jetzt hast du Mängel? Ich kann dich leider nicht ganz verstehen volkard, wir hatten nie von großen Extras geredet. Wir hatten lediglich zu einer Klasse geraten. Wer hat den gesagt, dass das der Code schon fertig ist ? In seinem Post steht "soweit", d.h. da kommt noch was. Vielleicht wird man noch eine Liste erstellen wollen, das wird wohl mit dem Code nicht gehen und wenn man doch nur ein Objekt erstellt, dann macht man die Klasse nunmal Singleton. Ich weiss echt nicht was hier gegen eine Klasse spricht.
-
volkard schrieb:
weil ihr scherzkekse sofort übertreibt. dann bekommt die klasse erstmal ein template-argument für den zu verrechnenden typ. wissenschaftlicher rechner oder finanzrechner? ja, noch eine policy reinmischen...
volkard, nichts für ungut, aber wo in diesen Thread wurden Templates auch nur erwähnt? Klassen wiederum sehe ich wirklich nicht als "Übertreibung" an. Und um Policies drehen sich im C++ Forum die allerwenigsten Threads, ebenso von Template Metaprogrammierung (Das sollte selbst dir bewusst sein).
Man kann es in beide Richtungen übertreiben. Und das man in einen ANSI-C++ Forum tendenziell zu einer C++ Lösung greift sehe ich nicht als Fehler an - falls doch, bitte ich um eine Umbenennung des Forums!
-
asc schrieb:
Man kann es in beide Richtungen übertreiben. Und das man in einen ANSI-C++ Forum tendenziell zu einer C++ Lösung greift sehe ich nicht als Fehler an - falls doch, bitte ich um eine Umbenennung des Forums!
es reicht, wenn du lernst, daß es kein gesetzt gibt, daß man in c++ alle c++-sprechmittel verwenden muß. daß es sogar manchmal doof ist.
-
asc schrieb:
volkard, nichts für ungut, aber wo in diesen Thread wurden Templates auch nur erwähnt? Klassen wiederum sehe ich wirklich nicht als "Übertreibung" an. Und um Policies drehen sich im C++ Forum die allerwenigsten Threads, ebenso von Template Metaprogrammierung (Das sollte selbst dir bewusst sein).
ich weiß, daß ihr wolltet. oder wenigstens es nicht geschafft hättet, es zu vermeiden.
am schluß schreibt man dann vielleicht
Taschenrechner<double> tr(cout); tr.arbeite(cin);
ist ein bekanntes muster. sowas passiert auch, wenn man die wurzelberechnung in eine klasse stopft.
Wurzelberechnung wb(49); cout<<wb.berechne();
und jetzt sag nicht, daß dir sowas noch nicht negativ aufgefallen ist.
alternativ auch gerne
Taschenrechner<double> tr; tr.arbeite(cin,cout);
nur auf gar keinen fall
taschenrechner(cin,cout);//IST ANGEBLICH KEIN C++
-
volkard schrieb:
ich weiß, daß ihr wolltet. oder wenigstens es nicht geschafft hättet, es zu vermeiden.
Ach, du kannst unsere Gedanken lesen?
Zudem würde ich persönlich den Stack als Klasse ansehen, nicht einen Taschenrechner. Und zudem sind die Methoden auch schon bekannt, sie stehen in Code derzeit als Funktionen (push, pop...). Davon abgesehen das ich auch Eingabe und Ausgabe davon getrennt lassen würde (Wie es auch ist).
volkard schrieb:
Taschenrechner<double> tr; tr.arbeite(cin,cout);
Bedienst du so einen Taschenrechner? Also ich drücke am Taschenrechner nicht auf einen großen "Arbeiten"-Knopf. Ich gebe eine Zahl ein, drücke dann (zumindest beim HP48G, den HP15C kenne ich nicht) Enter, gebe die nächste Zahl ein, und drücke dann den Operanten.
cu André
-
FreakY<3Cpp schrieb:
C++ Fan, du findest also das die Funktionen und das Struct kein Zusammenhang haben ? Doch ? Dann ist eine Klasse angebracht.
Es geht hier um ein sehr kleines Programm, aus wenigen Zeilen, in einer Datei, einschließlich der main-Funktion. Hätte der Fragesteller von vorn herein eine Klasse programmiert, hätte niemand was dagegen gehabt. Ob man um das bestehende Programm eine Klasse drumrum strickt oder nicht, ist völlig ohne Belang und geht kilometerweit an der Fragestellung vorbei. Wenn er irgendwann vor hat, aus seinem Code aus Gründen der Wiederverwendbarkeit eine Klasse zu machen, dann sei ihm das auch gegönnt. Was mich am meisten stört, ist die Tatsache, daß in diesem Forum oft nicht geholfen, sondern stattdessen auf besserwisserische Weise der Stil bemängelt wird. Es geht doch in erster Linie darum, einen Code erstmal zum Laufen zu bringen.
-
C++Fan 2009 schrieb:
...
Und manche können wohl einfach nicht den Frage-Post lesen ?
gx schrieb:
Es wäre nett wenn ihr mir eure Meinung bzw. Vorschläge zu Verbesserung postet.
Soso, ich soll also meine Meinung und einen Vorschlag posten ? Hab ich wenn ich mich recht entsinne getan
Natürlich ist das Programm momentan klein, aber wie kann man, ohne das es hässlich wird, mehrere Listen davon erstellen? Und warum soll man das Struct nicht kapseln und es in eine gewisse Übersicht bringen, wenn man aus der Main sowieso nicht draufgreift? Also laut der Forum Abteilung und der Aussage des Frage-Posts das ich meine Meinung äußern soll, hab ich alles richtig gemacht.
mfg
-
gx schrieb:
for(int i=1;i<n;i++)
muß eigentlich weg.
siehe http://hp15c.org/hp15c.pdf seite 23.aber die eingabe
6 7 + 9 3 - *
kann dann trotzdem nicht verarbeitet werden, weil du bisher verlangst, daß immer auch eine zahl eingegeben wird.
wäre sowas wie
6, 7+ 9, 3- *
in der untersten zeile klappts nicht mehr, welche zahl soll ich ihm geben, obwohl ich ihm gar keine zahl geben will?
-
danke für die zahlreichen Antworten.
ich habe einige kleine Änderungen vorgenommen
die Diskussion ob Klassen oder nicht habe ich aufmerksam verfolgt aber noch keine Änderungen dahin gehen gemacht
#include <cstdlib> #include <iostream> using namespace std; struct lk{ double data; lk *next; }; lk *anker = 0; // Globaler Ankerpunkt //daten auf den Stapel legen void push(double data){ lk* node = new lk; node -> data = data; node -> next = anker; anker = node; } //daten vom Stapel nehmen double pop(){ double inhalt=0; if(anker){ lk *old = anker; anker = anker -> next; inhalt = old -> data; delete old; } return inhalt; } void anleitung(){ cout << "---------------------------------------------" << endl; cout << " HP15C Rechner" << endl << endl; cout << " Rechnen mit dem HP15C Rechner" << endl; cout << " Bsp:" << endl; cout << " \"2+3+4\" wird wie folgt Eingegeben \"2;3;4+\"" << endl << endl; cout << " die Eingabe von \"0\" beendet das Programm" << endl; cout << "---------------------------------------------" << endl << endl; } void add(int n){ for(int i=1;i<n;i++) push(pop()+pop()); } void sub(int n){ for(int i=1;i<(n-1);i++) push(pop()+pop()); push(-(pop()-pop())); } void mul(int n){ for(int i=1;i<n;i++) push(pop()*pop()); } void div(int n){ for(int i=1;i<(n-1);i++) push(pop()*pop()); push((1/pop())*pop()); } void ausgabe(){ double wert=pop(); cout << "=" << wert << endl; cout << wert << ";" ; push(wert); } int main(int argc, char *argv[]){ bool x=true; int n=0; // Zählt die Elemente der Stapels char z; double wert; anleitung(); do{ cin >> wert; // Eingabe der Operanten //scanf("%lf%c",&wert,&z); push(wert); n++; if (wert!=0){ cin >> z; // wenn z=';' dann kann die nächste Zahl eingegeben werden if(z!=';'){ switch (z) { // Fallunterscheidung der Operanten case '+': add(n); ausgabe(); break; case '-': sub(n); ausgabe(); break; case '*': mul(n); ausgabe(); break; case '/': div(n); ausgabe(); break; default: x=false; break; } n=1; }else; } else { x=false; } }while(x); system("PAUSE"); return EXIT_SUCCESS; }
ich werde an meinem Programm noch weitere Änderungen vornehmen wie zB das Rechen mit klammern ich wies nur noch nicht wie ich die Eingabe realisieren soll
(bisher kann man nur Summen und Produkte einzel ausrechen) vielleicht könnt mir jemand einen Tipp gebendanke schon mal
-
GX schrieb:
ich werde an meinem Programm noch weitere Änderungen vornehmen wie zB das Rechen mit klammern ich wies nur noch nicht wie ich die Eingabe realisieren soll
(bisher kann man nur Summen und Produkte einzel ausrechen) vielleicht könnt mir jemand einen Tipp gebenKlammern?
Ich dachte, du meinst den HP15C und UPN, also Stack-Rechner. Wozu Klammern? Der braucht doch gar keine.
Will man
(3+4)*5 rechnen, gibt man 3 4 + 5 * ein.
Und will man
3+(4*5) rechnen, gibt man 3 4 5 * + ein.
Immer ohne Klammern.Kurzer Abriß UPN
http://hp15c.org/RPNHowTo.phpKeyboard ohne Klammern
http://hp15c.org/Looks.php