Stack-Rechner nach dem Beispiel eines HP15C
-
asc schrieb:
C-Fan 2009 schrieb:
Wie ich bereits sagte: beschäftige Dich lieber mit Java.
Tut mir leid, aber ich verdiene seit längeren mit C++ und nicht mit Java mein Geld (Und würde ohnehin C# Java vorziehen).
Und deswegen bist du erhaben von jeder Kritik?
-
pumuckl schrieb:
C++Fan 2009 schrieb:
Es geht nicht um Stil. Der Fragesteller möchte sein Programm zum Laufen kriegen. Über seinen Stil herumzunörgeln hilft ihm nicht weiter.
Was hilfts wenn er sein Programm jetzt zum Laufen bringt, es aber wegen schlechtem Stil so labil ist dass bei irgendeiner Änderung alles zusammenbricht und er in einem unwartbaren Codewrack steckt?
IN DIESEM FALL würde ein Klasse lediglich 3 Zeilen mehr Code bringen. Für DIESES Programm ist es einfach nur unnötig! Und die Behauptung Prodzedual -> "codewrack" ist absurd!
Vergesst das Topic nicht :p
-
asc schrieb:
(Und würde ohnehin C# Java vorziehen).
Kennt C# keine freien Funktionen, oder woher kommt dein Irrglaube aus jeder Kleinigkeit Klassen machen zu müssen?
pumuckl schrieb:
Was hilfts wenn er sein Programm jetzt zum Laufen bringt, es aber wegen schlechtem Stil so labil ist dass bei irgendeiner Änderung alles zusammenbricht und er in einem unwartbaren Codewrack steckt?
Ich finde seinen Stil nicht schlecht. Für ein Programm dieser Größe und geringen Kompexität ist er angemessen.
-
C++Fan 2009 schrieb:
Für ein Programm dieser Größe und geringen Kompexität ist er angemessen.
Das ist das Problem an der Sache. Der Stil ist schlecht skalierbar. Und sich für Programme verschiedener Größe verschiedene Stile anzugewöhnen ist nicht nur unnötig sondern auch potentiell gefährlich da man die Stile dann schnell mal vermischt. Außerdem weiß man selten von vornherein wie groß das Programm dann wirklich wird.
-
C-Fan 2009 schrieb:
asc schrieb:
(Und würde ohnehin C# Java vorziehen).
Kennt C# keine freien Funktionen, oder woher kommt dein Irrglaube aus jeder Kleinigkeit Klassen machen zu müssen?
Oh, glaube bloss nicht das ich zwangsweise überall Klassen verwende. Aber wenn einige Funktionen auf den gleichen Datenbestand arbeiten, schreit dies förmlich nach einer Klasse.
Wobei ich durchaus Funktionen mit Klassen kombiniere sofern dies sinnvoll ist (Siehe hierzu auch die Scott-Meyers Bücher).
Ein Stack, ist wohl mit die klassischste aller Anwendungsbeispiele einer Klasse.
C-Fan 2009 schrieb:
Ich finde seinen Stil nicht schlecht. Für ein Programm dieser Größe und geringen Kompexität ist er angemessen.
Ich sehe auf Anhieb einiges an unnötigen Codeduplikaten und unnötiger Komplexität.
cu André
-
pumuckl schrieb:
Und sich für Programme verschiedener Größe verschiedene Stile anzugewöhnen ist nicht nur unnötig sondern auch potentiell gefährlich da man die Stile dann schnell mal vermischt.
Jemand der üblicherweise in Teams nach Kodierrichtlinien riesengroße Softwaresysteme zu entwickelt, die nach allen Regeln der Kunst objektorientiert analysiert und designed werden, sollte bei einem kleinen, für den Privatgebrauch bestimmten, Miniprogramm genauso vorgehen?
-
C++Fan 2009 schrieb:
pumuckl schrieb:
Und sich für Programme verschiedener Größe verschiedene Stile anzugewöhnen ist nicht nur unnötig sondern auch potentiell gefährlich da man die Stile dann schnell mal vermischt.
Jemand der üblicherweise in Teams nach Kodierrichtlinien riesengroße Softwaresysteme zu entwickelt, die nach allen Regeln der Kunst objektorientiert analysiert und designed werden, sollte bei einem kleinen, für den Privatgebrauch bestimmten, Miniprogramm genauso vorgehen?
Es ist kein Team nötig, man kann auch im Privatgebrauch durchaus Programme in Größenordnungen produzieren wo ein strukturierterer Stil nötig ist.
-
Wir hatten hier schon Beiträge zum Thema Taschenrechner.
-
C-Fan 2009 schrieb:
Jemand der üblicherweise in Teams nach Kodierrichtlinien riesengroße Softwaresysteme zu entwickelt, die nach allen Regeln der Kunst objektorientiert analysiert und designed werden, sollte bei einem kleinen, für den Privatgebrauch bestimmten, Miniprogramm genauso vorgehen?
1. Was haben Klassen mit "riesengroßen Softwaresystemen" zu tun?
2. Weißt du eigentlich wie leicht (sowohl im privaten wie auch Firmenumfeld) kleine Projekte unverhofft wachsen können? Und weißt du auch wie viele Projekte (ob nun privat oder beruflich) am schlechten Codestil zerbrechen können?
3. Hast du schon mit Auszubildenden oder Neuen zu tun gehabt, die ihren privaten Stil so sehr gewöhnt waren, das sie Schwierigkeiten haben sich an einen Neuen zu gewöhnen?Nein, ich habe nichts, aber auch überhaupt nichts gegen den sinnvollen Einsatz von freien Funktionen. Doch gerade wenn es wie hier um logische Einheiten (wie einem Stack) geht, sind Klassen einfach ein sinnvoller Ansatz, der nur unwesentlich mehr Aufwand bei der Umsetzung erfordert, und dennoch die Wahrscheinlichkeit einer Wiederverwendung oder die Wartbarkeit erhöht.
Und damit es dir auch klar wird: Ich hasse es ebenso rein auf Klassen zu setzen, ziehe aber die Trennlinie nicht nach der Projektgröße sondern dem Sinn (Und den Programmierstil jedesmal umzustellen ist unsinnig - zumal Viele sich auf die Dauer genau _einen_ Stil angewöhnen).
Und auch die C-Kompatibilitätsheader wie ich sie mal nenne, verteufel ich nicht allgemein, nur was ich schlecht finde sich zuerst bei diesen zu bedienen (Wenn wirklich ein guter Grund des Umstiegs besteht, kann man dies später noch ändern).
Das ist genauso mit dem beliebten Thema Performance: Nein, ich bin kein Fan von langsamen Programmen, aber ich bin ein Gegner davon Code unleserlich zu schreiben weil man nur Performance im Hinterkopf hat. Wenn ein Programmteil langsam ist, muss man nachschauen warum es der Fall ist, aber vorzeitig unnötigen Aufwand in etwas reinzustecken wo mit 90%iger Wahrscheinlichkeit kein Flaschenhals existiert, ist ebenso unsinnig.
Lieber Programme schreiben die man leicht warten und anpassen kann, die auch für andere Verständlich sind, und möglichst noch Selbstdokumentierend. Zudem würde ich nicht verschiedene Bibliotheken wie im hiesigen Originalcode mischen, die das gleiche Ziel haben: Entweder cout oder printf... Und wenn man das cout entfernen würde, wäre der Code C in reinster Form.
C und C++ sind zwar verwand, aber werden unterschiedlich angewendet. Der Codestil unterscheidet sich, und zwar nicht nur durch die Wahl der Bibliotheken.
cu André
-
C++ Fan, du findest also das die Funktionen und das Struct kein Zusammenhang haben ? Doch ? Dann ist eine Klasse angebracht.
volkard schrieb:
noch ist der code gut nachvollziehbar und gut wartbar. vielleicht ist jetzt die gelegenheit, ihn korrekt und hübsch zu machen. danach kann man ihn immernoch in eine klasse stopfen.
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 ? Wir sind im C++ ISO Forum, also gebe ich ihm den Rat als C++'ler es mit einer Klasse zu machen. Die Funktionen greifen alle auf die gleichen Daten zu, ich finde wie eben schon gesagt eine Klasse für angebracht.
Nur weil mein eine Klasse für angebracht hält, muss man nicht gleich als Java Liebhaber dahin gestellt werden und warum C# pur objekt orientiert ist, wird wohl seinen Grund haben.
mfg
-
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