Stack-Rechner nach dem Beispiel eines HP15C



  • FreakY<3Cpp schrieb:

    Entweder nutze ich deinen Rechner falsch, oder er funktioniert nicht. Nachdem ich mich etwas in deine do Schleife eingelesen hab, habe ich deinen Rechner so genutzt:

    HP15C Rechner

    Eingabe: 12+
    Ausgabe: 12,
    Eingabe: 5=
    Ausgabe: 5

    Nach meinen Rechenkünsten sollte das 17 ergeben 😃 .

    sollte so gehen, wenn ich den rechner nicht ganz falsch einschätze:

    Eingabe: 12
    Eingabe: 5
    Eingabe: +
    Ausgabe: 17
    Eingabe: 3
    Eingabe: *
    Ausgabe: 51
    
    Eingabe: 2
    Eingabe: 3
    Eingabe: 5
    Eingabe: *
    Eingabe: +
    Ausgabe: 30
    
    Eingabe: 2
    Eingabe: 3
    Eingabe: 5
    Eingabe: +
    Eingabe: *
    Ausgabe: 16
    


  • C-Fan 2009 schrieb:

    Es ist schon C++. Oder hatte dein C++ Compiler ernsthafte Schwierigkeiten damit?

    Was außer das cout ist an dem Code bitte C++? (Das hat jetzt nicht mit Klassen oder nicht-Klassen zu tun, sondern am Programmierstil als solchen).

    Davon abgesehen würde ich hier tatsächlich eine Klasse verwenden.



  • oooooooooooooooooooooooo schrieb:

    Also um hier etwas klar zu stellen: C++ hat keinen Classen Zwang! Einige Sachen sind sogar prodezual sinnvoller und übersichtlicher. Immer Klassen zu verwenden macht den Code auch nicht besser!

    Mein Reden. In C++ hat man viele Freiheiten und viele Möglichkeiten, das Beste daraus zu machen. Klassen sind nicht immer das Sinnvollste.

    asc schrieb:

    C-Fan 2009 schrieb:

    Es ist schon C++. Oder hatte dein C++ Compiler ernsthafte Schwierigkeiten damit?

    Was außer das cout ist an dem Code bitte C++?

    Alles.

    asc schrieb:

    Davon abgesehen würde ich hier tatsächlich eine Klasse verwenden.

    Schau Dir Java an. Das wäre das Richtige für Dich.



  • push(-(pop()-pop()));
    

    ist falsch.
    da dürfen nicht zwei - sein. 8-5 ist ja nicht gleich -8-5

    push((1/pop())*pop());
    

    ist falsch wegen fehlernder sequence points.
    richtig ist wohl

    double a=pop();
    double b=pop();
    return a/b;
    

    und was soll überhaupt immer das

    for(int i=1;i<n;i++)
    

    ? das paßt da irgendwie gar nicht hin.



  • C-Fan 2009 schrieb:

    asc schrieb:

    Was außer das cout ist an dem Code bitte C++?

    Alles.

    printf und scanf gehören aus Kompatibilitätsgründen zu C++, sind in C++ aber nicht unbedingt der präferierte Stil. Zudem sind Klassen zwar nicht nötig, doch üblicherweise würde man in Situationen wie dieser mit Klassen hantieren.

    C-Fan 2009 schrieb:

    Schau Dir Java an. Das wäre das Richtige für Dich.

    Reden wir mal darüber, wenn du schon 10+ Jahre im C++ Umfeld gearbeitet hast. Deinen Verhalten nach traue ich dir das nur im C-Umfeld (wenn überhaupt) zu.

    cu André



  • C++Fan 2009 schrieb:

    asc schrieb:

    Davon abgesehen würde ich hier tatsächlich eine Klasse verwenden.

    Schau Dir Java an. Das wäre das Richtige für Dich.

    ja, der gedanke kam mir auch.

    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. 😃
    die verwendung einer standard-stack-klasse könnte man antizipieren.



  • asc schrieb:

    printf und scanf gehören aus Kompatibilitätsgründen zu C++, sind in C++ aber nicht unbedingt der präferierte Stil.

    Es geht nicht um Stil. Der Fragesteller möchte sein Programm zum Laufen kriegen. Über seinen Stil herumzunörgeln hilft ihm nicht weiter.

    asc schrieb:

    üblicherweise würde man in Situationen wie dieser mit Klassen hantieren.

    Üblicherweise würdest Du daraus eine Klasse machen. Wie ich bereits sagte: beschäftige Dich lieber mit Java.



  • 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).



  • 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?



  • 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.


Anmelden zum Antworten