ChatGPT schreibt einen kleinen Taschenrechner



  • Sind mein Prompt, die Erklärungen und der Code von chatGPT OK?

    Schreibe bitte in sehr gutem idiomatischen C++ gemäß RAII ein erweiterbares Programm für einen Taschenrechner.

    chatGPT-3.5 (Version vom 23.03.2023)
    Erstellt am 09.04.2023

    Gerne! Hier ist ein Beispielprogramm für einen Taschenrechner in C++ mit RAII. Das Programm verwendet einen Stack, um die Operanden und Operationen zu speichern, und verfügt über eine einfache Benutzeroberfläche, die vom Benutzer Eingaben entgegennimmt und das Ergebnis auf der Konsole ausgibt. Es ist auch möglich, das Programm um weitere Funktionen zu erweitern, indem Sie die Klasse "Operation" erweitern und die entsprechenden Funktionen implementieren.

    #include <iostream>
    #include <stack>
    #include <string>
    
    class Operation {
    public:
        virtual ~Operation() {}
        virtual double evaluate(double a, double b) const = 0;
    };
    
    class AddOperation : public Operation {
    public:
        virtual double evaluate(double a, double b) const {
            return a + b;
        }
    };
    
    class SubtractOperation : public Operation {
    public:
        virtual double evaluate(double a, double b) const {
            return a - b;
        }
    };
    
    class MultiplyOperation : public Operation {
    public:
        virtual double evaluate(double a, double b) const {
            return a * b;
        }
    };
    
    class DivideOperation : public Operation {
    public:
        virtual double evaluate(double a, double b) const {
            if (b == 0) {
                throw std::runtime_error("Division by zero");
            }
            return a / b;
        }
    };
    
    class Calculator {
    public:
        void pushOperand(double operand) {
            operands_.push(operand);
        }
    
        void pushOperation(Operation* operation) {
            operations_.push(operation);
        }
    
        double calculate() {
            double result = 0;
            if (!operands_.empty()) {
                result = operands_.top();
                operands_.pop();
            }
    
            while (!operations_.empty() && !operands_.empty()) {
                Operation* operation = operations_.top();
                operations_.pop();
                double operand = operands_.top();
                operands_.pop();
                result = operation->evaluate(operand, result);
            }
    
            return result;
        }
    
    private:
        std::stack<double> operands_;
        std::stack<Operation*> operations_;
    };
    
    int main() {
        Calculator calculator;
        while (true) {
            std::string input;
            std::cout << "> ";
            std::getline(std::cin, input);
    
            if (input == "exit") {
                break;
            }
    
            try {
                double operand = std::stod(input);
                calculator.pushOperand(operand);
            } catch (const std::exception&) {
                if (input == "+") {
                    calculator.pushOperation(new AddOperation());
                } else if (input == "-") {
                    calculator.pushOperation(new SubtractOperation());
                } else if (input == "*") {
                    calculator.pushOperation(new MultiplyOperation());
                } else if (input == "/") {
                    calculator.pushOperation(new DivideOperation());
                } else if (input == "=") {
                    double result = calculator.calculate();
                    std::cout << "Result: " << result << std::endl;
                } else {
                    std::cerr << "Invalid input" << std::endl;
                }
            }
        }
    
        return 0;
    }
    

    In diesem Beispiel verwendet das Programm das Konzept der RAII, um sicherzustellen, dass die Ressourcen, die von den Operationen verwendet werden, automatisch freigegeben werden, wenn sie nicht mehr benötigt werden. Das Programm definiert eine abstrakte Basisklasse "Operation", die die Methode "evaluate" deklariert, die von allen abgeleiteten Klassen implementiert werden muss. Jede abgeleitete Klasse stellt eine spezifische Operation dar (Addition, Subtraktion, Multiplikation, Division), die in der Methode "evaluate" implementiert wird. Jede Operation kann dann durch Übergeben eines Zeigers auf ein Objekt der abgeleiteten Klasse an die Methode "pushOperation" des Taschenrechners hinzugefügt werden.

    Der Taschenrechner selbst verwendet zwei Stacks, einen für Operanden und einen für Operationen. Wenn der Benutzer eine Zahl eingibt, wird sie als Operand auf den Operanden-Stack gelegt. Wenn der Benutzer eine Operation eingibt, wird sie als Objekt der entsprechenden abgeleiteten Klasse erstellt und auf den Operationen-Stack gelegt.

    Wenn der Benutzer das Gleichheitszeichen "=" eingibt, wird die "calculate"-Methode des Taschenrechners aufgerufen, die die Operanden und Operationen auf den Stacks ausführt und das Ergebnis zurückgibt. Wenn eine Division durch Null auftritt, wird eine Ausnahme ausgelöst, die vom Hauptprogramm abgefangen wird und eine Fehlermeldung ausgibt.

    Insgesamt ist dieses Programm ein solides Beispiel für eine implementierung von RAII in C++. Es bietet eine solide Basis für einen erweiterbaren Taschenrechner, der um weitere Operationen und Funktionen erweitert werden kann, indem weitere Klassen abgeleitet und implementiert werden.

    Test:

    3+5

    Invalid input

    3 + 5

    Invalid input

    3
    +
    5

    Result: 8

    3
    *
    66

    Result: 198



  • @Erhard-Henkes
    wenn Du das bekommen hast, was Du wolltest?
    Das musst Du schon selbst entscheiden.
    Ansonsten den Prompt ändern, bzw. erweitern.
    Du erwartest doch wohl nicht, dass das andere für Dich übernehmen?



  • Das Programm ist compilierbar und funktioniert.



  • @Helmut-Jakoby Warum so unfreundlich? Da wird man von chatGPT deutlich zuvorkommender behandelt. 😁
    Daraus folgt, dass sich solche Foren bald von selbst überholen.



  • @Erhard-Henkes
    entschuldige! Sollte nicht unfreundlich sein.
    Wollte nur sagen, dass die Beurteilung von jedem selbst übernommen werden sollte.
    Ich habe mir auch schon von chatGPT helfen lassen. Manchmal muss man den Prompt anpassen.
    Ich wollte nur (evtl. etwas unfreundlich) sagen, dass man die Beurteilung nur selbst vornehmen kann, da man nur selbst weiß, was man will.
    Also, war nicht böse gemeint.
    Edit; sehe gerade, dass Du Deinen Beitrag geändert hast. Damit hängt natürlich mein Beitrag ohne Bezug im Raum.



  • @Erhard-Henkes sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    Schreibe bitte in sehr gutem idiomatischen C++ gemäß RAII ein erweiterbares Programm für einen Taschenrechner.

    Mir geht es um diesen Prompt. Hättest du noch etwas hinzugefügt?
    Mir persönlich gefällt die Art der Eingabe nicht besonders. Das kann man aber leicht selbst ändern. Ansonsten bin ich vom Programmaufbau beeindruckt. Mache das nur noch hobby-mäßig.



  • Guten Morgen @Erhard-Henkes ,
    Da Du mit der Art der Eingabe nicht zufrieden bist, formuliere doch im Prompt die Art, welche Dir vorschwebt. Z.B. dass solange Zahlen und Operanten eingegeben werden können bis zu einem abschließenden "Enter"; erst dann soll das Berechnen vorgenommen werden.

    Ich habe mich auch mal hier mit chatGPT beschäftigt.



  • Es hilft nur, sowohl mit als auch ohne KI den Durch- und Überblick zu behalten. Alles andere führt ins Elend.



  • Ich hab hier eine Studie gefunden, welche sich mit dem Thema Security von ChatGPT generieren Code beschäftigt, wenn ein Anfänger ChatGPT nutzt um code zu generieren.

    https://arxiv.org/abs/2304.09655 (How Secure is Code Generated by ChatGPT?)

    Nach dieser Studie kann ChatGPT code erzeugen, der nicht robust ist auf gewisse Angriffsvektoren ist. (z.b. SQL Injection)
    Des weiteren behauptet ChatGPT, aufgrund eines Missverständnis von ChatGPT selbst, das ein Security Bug gar nicht auftreten kann.
    In diesem Falle ging es darum, dass ChatGPT ein Programm schreiben soll, dass ein zip-file entpacken soll.
    ChatGPT hat dabei code generiert, welches das zip-file entpackt aber die entpackten Daten nicht auf einen Datenträger schreibt.
    Als ChatGPT darauf hingewiesen wurde, dass der code unter umständen andere bestehende Dateien überschreiben kann (durch z.b. Zip Path Traversal), behauptete ChatGPT dass das nie auftreten kann weil der code die Daten nicht auf einen Datenträger schreibt.
    Hier ist, laut der Studie, dass Missverständnis von ChatGPT bezüglich der Intention des Fragers. ChatGPT hat scheinbar nicht verstanden, dass der code vom Nutzer angepasst werden könnte, um die entpackten Daten auf einen Datenträger zu schreiben.

    In der Studie geht es explizit darum dass ein Anfänger, der bezüglich möglicher security bugs kaum oder kein wissen hat, mit ChatGPT arbeitet und dadurch problematisch code verwendet der anfällig ist für security bugs.
    Das muss man beachten wenn man die Studie liest.

    Ein Entwickler mit Erfahrung kann ChatGPT so informieren, dass der Code robust gegen Angriffsvektoren ist, wenn sie dem Entwickler bekannte sind, dass es sie gibt.



  • @firefly Das gilt aber alles auch ohne ChatGPT!? Klar können Anfänger Sicherheitlücken einbauen. Das haben sogar erfahrene Leute schon geschafft.



  • @Tyrdal sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    @firefly Das gilt aber alles auch ohne ChatGPT!? Klar können Anfänger Sicherheitlücken einbauen. Das haben sogar erfahrene Leute schon geschafft.

    Klar, das gilt für alle dieser "KI" Code Generatoren. Man sollte sich aktuell nicht darauf blind verlassen, dass diese Tools robusten code erzeugen. Egal wie der Input vom Nutzer an den Generator aussieht.
    Aktuell muss der Nutzer selbst viel Erfahrung haben, damit zum einen der Generator robusten Code überhaupt erzeugt.
    Und zum anderen das der Nutzer auch nachprüfen kann, dass der Code robust ist.
    Und Anfänger können das generell nicht, weil sie entweder zu wenig Erfahrung in der Problemdomain (für den code erzeugt werden soll) haben oder ihnen das Wissen über mögliche sicherheitsrelevante Fallstricke fehlt.

    Daher ist der Hype über diese "KI" Code Generatoren eher mit vorsicht zu geniesen.
    Und das man nicht ungeprüft den generieren Code übernimmt.



  • Es sind seit gestern mehrere Fälle bekannt, in denen Schüler während ihren (Dativ?) Abiturprüfungen ChatGPT aufgerufen haben (sollen). ... Die wissen aber schon, dass das dann keine Eigenleistung mehr ist, oder? 🤔



  • @Fragender Ist halt fuschen. Ob man ChatGPT oder Google fragt, sollte keinen Unterschied machen



  • Als Hausaufgabenhilfe? Wieso nicht. Aber in Abiturprüfungen? Wie dämlich muss man sein ... Und es macht sehr einen Unterschied, ob ich google befrage ... oder das, was ChatGPT ausgibt, nur noch abschreiben muss.

    Zu meiner Zeit (anno dazumal ...) war es eine Selbstverständlichkeit, alle elektronischen Geräte vor Klausurbeginn vorn abzugeben. Weiß nicht, ob das immer noch so ist.

    BTW: Genitiv.



  • @Fragender sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    Zu meiner Zeit (anno dazumal ...) war es eine Selbstverständlichkeit, alle elektronischen Geräte vor Klausurbeginn vorn abzugeben. Weiß nicht, ob das immer noch so ist.

    Ja, ist es. Und damals wie heute gibt es Schüler, die (mal mehr mal weniger erfolgreich) Wege finden zu beschummeln



  • @Leon0402 sagte in ChatGPT schreibt einen kleinen Taschenrechner:

    Wege finden zu beschummeln

    Ja, das gab es bei uns auch. Es mündete dann in einem (Berufs-)Feuerwehreinsatz mit 5-6 Fahrzeugen, da mehrere Notschalter betätigt wurden. Die Kosten dafür musste die Betreffende tragen. Und das ist ja gleich zweimal ärgerlich, Abi nicht bestanden respektive wiederholen und für die Einsatzkosten aufkommen.



  • @firefly Hat man das mit chatGPT-4o wiederholt?


Anmelden zum Antworten