Kleiner "Taschenrechner" (als Quellcode)



  • abc.w schrieb:

    Bist wohl ein Informatiker oder studierst Du etwa auf einer Uni? (In Anlehnung an die heissen Diskussionen hier http://www.c-plusplus.net/forum/viewforum-var-f-is-61.html 😃 )

    Weder noch. Ich bin Hobby-Programmierer (ich versteh den Witz dabe nicht) 🙂

    abc.w schrieb:

    Aber Spass bei Seite... 🙂
    Habe dein Programm aus Neugier bei mir kompiliert (unter VS2008) und mal laufen lassen.

    Bitte einen mathematischen Term eingeben ("exit" zum beenden): 5 / 0

    Ergebnis: 1

    Da läuft scheinbar was schief...

    Ja das ist mir bekannt, habe den Fehler aber noch nicht gefunden ...

    abc.w schrieb:

    Danach habe das hier eingegeben:

    Bitte einen mathematischen Term eingeben ("exit" zum beenden): -5 + (-1)
    Assertion failed: Check(NULL), file c:\dokumente und einstellungen\alex\eigene d
    ateien\visual studio 2008\projects\rechner\rechner.cpp, line 158

    Dann öffnet sich ein Dialog von MS2008 "...Visual C++ Debug Library" mit dem Text "Debug error!" usw...

    Bei mir funktionierts jetzt... Hab aber noch gestern spaetabends Bugs gefixt, dadurch wird sich dieser Bug wohl auch "gefixt haben". Code update ich gleich.
    Trotzdem danke fuer den Hinweis. Bin fuer jede Fehlermeldung dankbar 🙂

    @/rant/
    lol, ich auch

    Gruss
    Cartman



  • Eric Cartman schrieb:

    abc.w schrieb:

    Bist wohl ein Informatiker oder studierst Du etwa auf einer Uni? (In Anlehnung an die heissen Diskussionen hier http://www.c-plusplus.net/forum/viewforum-var-f-is-61.html 😃 )

    Weder noch. Ich bin Hobby-Programmierer (ich versteh den Witz dabe nicht) 🙂

    abc.w schrieb:

    Aber Spass bei Seite... 🙂
    Habe dein Programm aus Neugier bei mir kompiliert (unter VS2008) und mal laufen lassen.

    Bitte einen mathematischen Term eingeben ("exit" zum beenden): 5 / 0

    Ergebnis: 1

    Da läuft scheinbar was schief...

    Ja das ist mir bekannt, habe den Fehler aber noch nicht gefunden ...

    Ich hab jetzt nur kurz über deine Check Methode drüber gesehen und nicht alles angekuckt aber eventuell solltest du einfach überprüfen ob eine Division durch 0 stattfindet?

    Noch was:

    else
            {
                if (fehlermeldung)
                    *fehlermeldung = "Nicht erlaubtes Zeichen enthalten";
                return false;
            }
    

    Kuck dir mal exceptions an, mit denen kannst du deinen Code merklich reduzieren.



  • Eric Cartman schrieb:

    Weder noch. Ich bin Hobby-Programmierer (ich versteh den Witz dabe nicht) 🙂

    Das ist hier so ne Sache, es gibt hier viele Diskussionen, wo es im Prinzip darum geht, ob Informatik studieren, oder ob Uni besser als Fachhochschule und umgekehrt, oder ob mehr Theorie oder mehr Praxis usw... Kannst die Beiträge durchlesen und eigene Meinung bilden. 😉 Ich habe übrigens Elektrotechnik studiert...

    Bezüglich des Taschenrechnerprogramms hast Du dir eine Aufgabe gestellt, die auf den ersten Blick simpel aber sich doch als komplex rausstellt. Hatte nämlich auch mal mit einem Mikrocontroller einen Taschenrechner zusammengebastelt. Eine Sache unter vielen anderen vergisst man immer: Das Ding muss bedienbar sein. Ich denke, Du hast einen komplizierteren Weg eingeschlagen, indem Du versuchst, einen ganzen String, der alles mögliche enthalten kann, einzulesen und zu interpretieren. Das ist lexikalische Analyse und ist eine Wissenschaft für sich. Und Du versuchst das alles in einer Klasse zu machen und dann zu interpretieren und auszuführen. Du hast also einen kleinen Interpreter oder "Compiler" geschrieben - auch eine Wissenschaft für sich. Musst Du vielleicht überdenken. Bei meinem Taschenrechner hatte ich im Prinzip das gleiche Problem und habe dann meiner Meinung nach einen einfacheren Weg eingeschlagen und das Prinzip der Eingabe nach der umgekehrten polnischen Notation verwendet. Vielleicht als Tip für Dich? 🙂 (Und dran denken: Das Ding muss bedienbar sein. Das Argument "ich lerne bloss C++" greigt hier nicht...)



  • @abc.w
    Klingt wirklich sehr interessant. Danke fuer die sehr aufschlussreiche Antwort. Kannst du vielleicht gute Buecher zu diesem Thema empfehlen (C++ als Sprache und in deutsch waere natuerlich der Optimalfall...)? Wuerde mich gerne mehr in dieses Gebiet der lexikalischen Analyse bzw. Interpreter/Compilerbau reinsteigern, da ich das aeusserst interessant finde 🙂

    @blub
    Das Problem dabei ist, dass ich alles ausrechen muesste, um eine Division durch 0 zu verhindern, was aergerlich waere... mal sehen, ob ich eine andere Loesung finde...

    Gruss
    Cartman



  • Schau dir mal das "Dragon Book" an. Es beschäftigt sich mit Compilerbau und was so alles dazugehört. Ist aber definitiv kein Anfängerthema und mit viel Theorie verbunden. Auch kann es schwer werden wirklich "einfache" Listings zu dem Thema zu finden, da Compilerbau und Lexer und Parser und co sehr verwickelt sind/sein können.



  • Schau dir evtl auch mal den Quellcode von AngelScript an. Das ist eine Scriptsprache die C++ ähnelt mit Java und Python-Einflüssen. Der Parser dürfte für dich auch interessant sein. Ist auch in C++ geschrieben.
    rya.



  • Bei solchen Sachen empfehle ich immer Flex/Bison. Gerade das Taschenrechnerbeispiel wird im online Manual sehr gut und ausfuehrlich behandelt.



  • Und ich empfehl dir einen Blick auf boost::spirit:
    http://www.boost.org/doc/libs/1_38_0/libs/spirit/doc/html/index.html

    In den Examples findest du sogar einen Taschenrechner.



  • Die haben auch nur kopiert. Und irgendwie finde ich es reichlich ueberdimensioniert.



  • Hallo
    Danke fuer eure Empfehlungen. Ich werd mir das alles mal naeher anschauen.
    Das Drachenbuch ist sogut wie gekauft, da ich nur gutes darueber gelesen habe.

    Gruss
    Cartman


Anmelden zum Antworten