Grundlagen verstanden - was jetzt?



  • Wenn du es etwas spannender haben und deine Motivation steigern willst, kannst du ja mal ein paar Oberflächen mit GTK+ programmieren.
    Sieht toll aus und damit kannst du auch einen Taschenrechner basteln:

    http://www.gtk.org/



  • Hallo, wieder. 🙂

    knivil schrieb:

    Nein, erstmal String von der Kommandozeile einlesen, Zeichen, Zahlen, Operationen erkennen und dann dann korrekt auswerten.

    Ich habe mich mal an das Projekt gemacht und auch zwei Programme abgeschlossen, nur bin ich mir immer noch nicht sicher, ob ich die "Aufgabe" richtig verstanden habe. Hat richtig Spaß gemacht, auch wenn ich meine Herangehensweise nach Programm 1 überdenken musste und während Programm 2 kürzer und besser ist, habe ich immer noch Probleme mit "gemischten Ausdrücken", was sich leider nicht so leicht beheben lässt ohne wieder alles neu zu schreiben.

    Programm 1 überprüft jedes einzelne Zeichen, erkennt sie und gibt dann aus, ob es sich um einen Buchstaben, eine Ziffer, einen Operator handelt oder gar nichts (Leerzeichen) handelt.
    Programm 2 überprüft, wie viele Zeichen zusammenhängen und erkennt dann, ob es ein Wort, eine Zahl (auch aus mehreren Ziffern) oder ein Operator ist.

    Eingabe:
    "Hallo. 154 + 341 / (1+7a) 1x"
    Ausgabe:
    Wir finden das Wort "Hallo."
    Wir finden die Zahl 154
    Wir finden den Operator "+"
    Wir finden die Zahl 341
    Wir finden den Operator "/"
    Wir finden den Operator "(1+7a)"
    Wir finden die Zahl 1x
    

    Die zwei letzten Ausdrücke, also "gemische Gebilde" bereiten noch Probleme.

    Wie schwierig ist es, eine "game of life" Simulation oder einen Sudoku-Löser zu schreiben? Anfängerniveau oder bin ich noch Welten entfernt?



  • Glückwunsch, einen Scanner hast Du schon. Jetzt brauchst Du noch einen Parser, der die "Wörter" bzw. Terme auch zusammenrechnet.



  • GUI Programmierung ist langweilig. Programmier doch ein kleines Spiel!



  • ghhjjjjjjjjjj schrieb:

    GUI Programmierung ist langweilig. Programmier doch ein kleines Spiel!

    Naja, was will er da machen? Low-level Grafik Programmierung? DirectX ist (nähmlich) wohl noch ein bisschen zu schwer. Und DOS-Konsolen Spiele machen keinen Spaß.



  • Hacker schrieb:

    ghhjjjjjjjjjj schrieb:

    GUI Programmierung ist langweilig. Programmier doch ein kleines Spiel!

    Naja, was will er da machen? Low-level Grafik Programmierung? DirectX ist (nähmlich) wohl noch ein bisschen zu schwer. Und DOS-Konsolen Spiele machen keinen Spaß.

    Kein Schwein benutzt direkt DirectX, wenn es nicht wirklich nötig ist.
    SDL, sfml, oder eine fertige Engine suchen, sich damit beschäftigen, spaß haben.



  • Du könntest mal in dieses Buch schauen:

    http://dl.acm.org/citation.cfm?id=1496384



  • LordJaxom schrieb:

    Glückwunsch, einen Scanner hast Du schon. Jetzt brauchst Du noch einen Parser, der die "Wörter" bzw. Terme auch zusammenrechnet.

    👍 Ging recht flott für einen Anfänger. Bin gespannt ob er auch den Parser mit Punkt-Vor-Strich-Rechnung packt!



  • Ich.möchte.lernen schrieb:

    Für einen Texteditor müsste man sich mit GUI-Programmierung (z.b. Windows API) auseinandersetzen, richtig?

    Nö. Ein Texteditor ist reiner Text, man kann ihn auch in der Konsole realisieren.

    Schau dir edit.exe, mc oder nano an, damit du eine Vorstellung davon bekommt.

    Wie schwierig/komplex ist das? Liegen deine angekündigten Überraschungen (:)) im Texteditor selbst oder im Programmieren der GUI?

    MfG.

    Im Texteditor.



  • Schon mal was mit Rekursion gemacht? Oder Listen, Bäume...?



  • cooky451 schrieb:

    LordJaxom schrieb:

    Glückwunsch, einen Scanner hast Du schon. Jetzt brauchst Du noch einen Parser, der die "Wörter" bzw. Terme auch zusammenrechnet.

    👍 Ging recht flott für einen Anfänger.

    Ja, sofern er nicht einfach nur Space als Token-Trenner genommen hat, was ich vermute.



  • cooky451 schrieb:

    👍 Ging recht flott für einen Anfänger. Bin gespannt ob er auch den Parser mit Punkt-Vor-Strich-Rechnung packt!

    Meinen ersten funktionstüchtigen Mathe-Parser hab ich vor geschätzt einem halben Jahr geschrieben. Ich tippe darauf, dass er das nicht schafft.



  • 314159265358979 schrieb:

    cooky451 schrieb:

    👍 Ging recht flott für einen Anfänger. Bin gespannt ob er auch den Parser mit Punkt-Vor-Strich-Rechnung packt!

    Meinen ersten funktionstüchtigen Mathe-Parser hab ich vor geschätzt einem halben Jahr geschrieben.

    Spirit? 🤡



  • Nene, schon ohne.



  • 314159265358979 schrieb:

    Nene, schon ohne.

    Schade. Ich bin nähmlich gerade auch dabei, nur muss ich jetzt noch "Aktionen" lernen. Soweit bin ich aber schon, das er auf richtigkeit prüfen kann:

    struct calculator : public boost::spirit::grammar<calculator>
    {
        template <typename Scanner>
        struct definition
        {
            boost::spirit::rule<Scanner> TERM, p_sign, m_sign, multi_sign, divide_sign, any_sign, partial_term;
    
            definition(calculator const& self)
            {
                using namespace boost::spirit;
                TERM = real_p >> *partial_term;
                partial_term = any_sign >> real_p;
                m_sign = ch_p("-");
                p_sign = ch_p("+");
                multi_sign = ch_p("*");
                divide_sign = ch_p("/");
                any_sign = m_sign | p_sign | multi_sign | divide_sign;
            }
    
            boost::spirit::rule<Scanner> const& start()
            {
                return TERM;
            }
        };
    };
    

    (bitte nicht weinen, du weisst ja)

    Edit: Ah, Stop! Jetzt auch mit Klammern. 🕶

    struct calculator : public boost::spirit::grammar<calculator>
    {
        template <typename Scanner>
        struct definition
        {
            boost::spirit::rule<Scanner> term, object,  p_sign, m_sign, multi_sign, divide_sign, any_sign, brace_enclosed_expression;
    
            definition(calculator const& self)
            {
                using namespace boost::spirit;
    
                object = brace_enclosed_expression | real_p;
                brace_enclosed_expression = ch_p("(") >> term >> ch_p(")");
                term = object >> *(any_sign >> object);
    
                m_sign = ch_p("-");
                p_sign = ch_p("+");
                multi_sign = ch_p("*");
                divide_sign = ch_p("/");
    
                any_sign = m_sign | p_sign | multi_sign | divide_sign;
            }
    
            boost::spirit::rule<Scanner> const& start()
            {
                return term;
            }
        };
    };
    


  • Sowas ist doch ohne den ganzen Spirit-Ballast viel einfacher.
    Einfach eine Funktion schreiben, die für einen beliebigen Ausdruck einen AST erzeugt und im Falle von Klammern rekursiv weitere ASTs erzeugen.

    Dann kann man sogar super Gleichungen/Tautologien/Contradictionen etc Lösen. 😉

    Hab mir ein kleines Tool gebaut, das logische Propositionen parsed und umformt. Hat an der Uni in Einführung Logik ungefähr das erste halbe Semester sämtliche Beweise machen können, sowas macht Spaß. 😃



  • Rechner gibt es ja wie Sand am Meer. Macht das doch mal zur Compile-Time, mit Templates, so dass folgendes geht:

    calculate<decltype(make_string("3+4+(5*3)")>::value
    

    Oder noch besser:

    std::map<char, float> values;
    values['y'] = 3;
    values['v'] = 4;
    values['z'] = 5;
    solve<decltype(make_string("yx+z = v") ), 'x'>::calculateWith(values);
    

    😃



  • 314159265358979 schrieb:

    cooky451 schrieb:

    👍 Ging recht flott für einen Anfänger. Bin gespannt ob er auch den Parser mit Punkt-Vor-Strich-Rechnung packt!

    Meinen ersten funktionstüchtigen Mathe-Parser hab ich vor geschätzt einem halben Jahr geschrieben. Ich tippe darauf, dass er das nicht schafft.

    Er hat ja wahrscheinlich auch keine Zeitmaschine.



  • Thema erschien ernsthaft. Die bisherigen Antworten scheinen aus Norwegen zu stammen, wo die Trolle wohnen. 😮



  • ich habe es aus der Not heraus gelernt. Ich hatte ein Problem und musste dann etwas programmieren.


Anmelden zum Antworten