speicherrückstände löschen..



  • bei meinem taschenrechner werden keine speicherrückstände gelöscht..
    der rechner funktioniert so:
    1. eingabe
    2. rechnen
    3. wenn eingabe nicht stop wird die nächste eingabe auch gerechnet.

    wenn ich jetzt nun als erstes "1234" eingebe und es "ausrechnen" lasse und beim zweiten mal nur "3" eingebe, kommt jedoch als ergebniss "3234" und nicht 3.

    woran kann das liegen?
    hier der code:

    #include <iostream> //für hauptoperatoren wie cin cout
    #include <cstdlib> //für system(pause)
    #include <locale> // für umlaute
    #include <complex> //für komplexe Zahlen
    #include <cmath> //für trigonometrie, hyperbolische, exponentiale, logarithmische, u. A.
    #include <string>
    #include <vector>
    #include <stdlib.h> //für strtod()
    using namespace std;
    
    unsigned position;
    char buffer[1000];
    int klammern = 0;  //für das zählen der Klammern. Wenn am Ende 0, dann wurden alle Klammern geschlossen bzw. geöffnet.
    char err_zeiger[1000];
    string eingabe;
    
    void leerzeichenentfernen();
    
    class Calculator
    {
    public:
    void Run();
    
    protected:
    void error();
    void error_nulldiv();
    void error_zeichen();
    double list();
    double expr();
    double num();
    void error_zeiger();
    
    };
    
    void Calculator::error()
    {
        cerr << "\nSyntaxfehler beim " << position + 1 << " Zeichen\n"
                    << "Unbekannter Fehler.\n";
    }
    
    void Calculator::error_nulldiv()
    {
        cerr << "\nSyntaxfehler beim " << position << " Zeichen\n"
                    << "Es kann nicht durch 0 geteilt werden.\n";
    }
    
    void Calculator::error_zeichen()
    {
        cerr << "\nSyntaxfehler beim " << position + 1 << " Zeichen\n"
                    << "Es wurde eine Zahl erwartet\n";
    }
    
    double Calculator::list()
    {
     double a = expr(), b;
     if(buffer[position] == '+') {
             position++;
       b = list();
       return a + b;
      }
     else if(buffer[position] == '-') {
             position++;
       b = list();
       return a - b;
     }
     else if(buffer[position] && buffer[position] != ')')
    //      Lookhead ist eine schließende Klammer.
    //      Falls der Zähler klammern Null ist liegt ein Syntaxfehler vor.
     if(!klammern)
      error();
     else
      error();
            return a;
    
    }
    
    double Calculator::expr()
    {
            double a, b;
    
      if(buffer[position] == '(') {
                    klammern++; //bei nächsterklammerebene wird klammern erhöht
        position++;
        a = list();
    
        if(buffer[position] != ')')
         error();
        klammern--; //bei geschlossener klammer wird klammern erniedrigt.
        position++;
       }
    	if(buffer[position] == 'p'){ 
    		a = 3.14159265; //pi wird ausgegeben
    		position++;
    	}
            else
       a = num();
    
            if(buffer[position] == '*') {
       position++;
       b = expr();
       return a * b;
      }
            else if(buffer[position] == '/') {
       position++;
       b = expr();
             if(b != 0)
                    return a / b;
             else
                    error_nulldiv();
      }
     return a;
    }
    
    double Calculator::num()
    {
            char *endptr;
            double a = strtod(&buffer[position], &endptr); //strtod analyisert die Zahlen
            unsigned len = (unsigned) (endptr - &buffer[position]);
    
                                    if(!len) //wenn len = 0 dann wurde mit strtod keine fließkommazaheln aus dem eingangsbuffer gelesen
                                    error_zeichen();
                                    position += len;
                                    return a;
    
    }
    
    void leerzeichenentfernen(){
            register unsigned i = 0, j = 0;                 //zeiger i und j
            while(buffer[i]){                       //geht eingabe durch
                    if(isspace(buffer[i]))          //wenn buffer[i] leerzeichen ist i erhöhen
                            i++;
                    else if(i != j)         //damit sind i und j nichtmehr gleich
                            buffer[j++] = buffer[i++]; //beide zeiger wandern 1 weiter. und dass leerzeichen eliminiert.--> speicheroptimierung
                    else {
                            i++;
                            j++;
                    }
            }
            buffer[0] = '\0';
    }
    
    void Calculator::Run()
    {
    	leerzeichenentfernen();
      position = 0;
      klammern = 0;
      cout << "Ergebniss: " << buffer << " = " << list() << endl;
    
    }
    
    void replace(){
    //Suche nach bestimmtem wort
    if (static_cast<int>(eingabe.find("PI", 0)) != -1)   //gibt bei false -1 aus
    {
       eingabe.replace(eingabe.find("PI"), 2, "p");	//ersetzt mit p damit nur ein char.
    }
    
    if (static_cast<int>(eingabe.find("sin", 0)) != -1)
    {
       eingabe.replace(eingabe.find("sin"), 3, "s"); // für sin = s
    }
    if (static_cast<int>(eingabe.find("cos", 0)) != -1)
    {
       eingabe.replace(eingabe.find("cos"), 3, "c"); // für cos = c
    }
    if (static_cast<int>(eingabe.find("tan", 0)) != -1)
    {
       eingabe.replace(eingabe.find("tan"), 3, "t"); // für tan = t
    }
    
    if (static_cast<int>(eingabe.find("arcsin", 0)) != -1)
    {
       eingabe.replace(eingabe.find("arcsin"), 6, "a"); // für arcsin = a
    }
    if (static_cast<int>(eingabe.find("arccos", 0)) != -1)
    {
       eingabe.replace(eingabe.find("arccos"), 6, "r"); // für arccos = r
    }
    if (static_cast<int>(eingabe.find("arctan", 0)) != -1)
    {
       eingabe.replace(eingabe.find("arctan"), 6, "z"); // für arctan = z
    }
    }
    
    int main(){
        cout << "****************************************************************\n**Tasch1enrechner \n****************************************************************" << endl;
    
    		punkt:
    
    		cout << "\nEingabe (Stop zum Beenden): ";
    		getline(cin,eingabe);
    		cin.clear();
    		while(eingabe != "stop"){
    
    			replace();
    			int lenght = eingabe.length();
    			for (int i = 0; i < lenght; i++)
    				buffer[i] = eingabe[i];
    
    			Calculator calculator;
    			calculator.Run();
    
    			cout << "-------------------------------------------------------------\n";
    		goto punkt;
    		}
    
    			cout << "Bye!\n";
    
            system("Pause");
            return 0;
    }
    

    edit:

    for(int i = 0; i<1000; i++)
    buffer[i]=0;
    

    manmanman ist das mir jetzt peinlich.. 😃

    für bessere lösungen lass ichs mal offen...


  • Mod

    Globale Variablen, Goto, ...

    Muss man sich da wirklich über einen nicht nachvollziehbaren Programmzustand wundern? Sag nicht, dass man dich nicht gewarnt hätte.

    P.S.: Woah, sogar ein register! 😮 Das habe ich ja schon seit Jahren nicht mehr in freier Wildbahn gesehen. Wo hast du C++ gelernt? Ich denke, der richtige Schritt wäre hier das Studium der Bücherlisten in meiner Signatur und der Linkliste für Neulinge hier im Forum. Du hast dir so viele schlechte Praktiken angewöhnt, der erste Schritt zur Besserung muss sein, dir diese wieder auszutreiben.

    P.P.S.: Deine Einrückung macht mir ebenfalls Angst. An manchen Stellen (z.B. Zeile 71 ff.) bin ich mir nicht sicher, ob du wirklich weißt, was diese machen oder ob du nur blöd eingerückt hast. Macht jedenfalls nicht viel Sinn, was in diesen Zeilen steht.



  • Warum benutzt du immer noch ein char-Array buffer. Da wird dann wohl noch alter Müll drin stehen.

    Suche im String geht so:

    if(s.find('a') != std::string::npos)
    ...
    


  • jungs jungs jungs.. erstmal danke..

    ich muss etwas schnell programmieren.. habe nicht alle zeit der welt.. ich weis das schönes programmieren weit entfernt von dem hier liegt.. jedoch steht mir grad bei all dem streß überhaupt keine zeit auch noch 5 bücher zu lesen.. es ist hier mehr alles mittel zum zweck.. im august habe ich mehr zeit.. da werde ich mir ein paar bücher durchlesen.. versprochen! 😉

    bis dahin.. bitte bitte die nerven mit mir bewahren 🙂

    ich danke euch


  • Mod

    Der Trick ist, wenn man sauber programmiert, ist man schneller fertig, da das Debuggen ungefähr 0 Minuten benötigt, anstatt 14 Tage. Dafür kann man wohl 25 Minuten für mehr Schreibarbeit und durchdachte Strukturen opfern.



  • bin mit dem programm auf den letzen 100 metern.. 🙂 noch ein bischen sinus und cosinus beibringen und dannn wird abegeben.. bewertet wird nur obs läuft oder nicht.. gott sei dank.. danach werden ein paar prüfungen geschrieben und dann sind semsterferien.. dann werd ich deine bücherliste durchgehen..


  • Mod

    gangstergangster schrieb:

    bin mit dem programm auf den letzen 100 metern.. 🙂 noch ein bischen sinus und cosinus beibringen und dannn wird abegeben..

    Ähh, hast du dein Programm mal getestet? Eine verdächtige Stelle habe ich schon genannt, aber ich bin mir sicher, da sind noch mehr Fehler drin. Jedenfalls ist bei mir die einzige funktionierende Eingabe "stop", alles andere führt zu Syntaxfehlern beim 1. Zeichen. Ebenfalls schwer verdächtig ist die gesamte Funktion replace, da total unportabel programmiert. Vielleicht läuft es deshalb nicht auf meinem 64-Bit System. Du solltest hoffen, dass dein Prüfer ein 32-Bit System benutzt.

    bewertet wird nur obs läuft oder nicht..

    Wird nicht auf die Codequalität geachtet? 😮

    Nun, laufen tut es auch nicht, siehe oben.

    P.S: Sogar "Taschenrechner", "Ergebnis" und "Stopp" sind falsch geschrieben. Also als Dozent würde ich beleidigt sein. Das ist dermaßen schluderig schon von der äußeren Form her, da weiß man sofort, dass das nichts sein kann.



  • Naja es hängt davon ab, was er studiert. In unserem damaligen C-fuer-Ingenieure-Grundkurs wurde auch nicht so sehr auf den Quellcode geachtet, sondern nur geschaut, ob der Student das Grundprinzip der jeweilige Aufgabe verstanden hat und der Kram läuft.



  • -ich studiere Elektrotechnik und nicht informatik.
    -es läuft auf meinem 64 Bit System (Win8. PC und Laptop)
    -habe Inhalt mit Text schnell und spontan geändert, da name und matrikelnummer u.Ä. drinnen stehen. dazu kommt, dass ich noch nicht sonderlich lange in deutschland lebe.
    -nein es wird (noch) nicht sonderlich auf die qualität des codes geachtet.

    ja es klappen alle funktionen soweit sehr gut. wie gesagt, dass einzigste das noch nicht funktioniert sind die trigonometrischen funktionen.

    ich bitte dahingehend für verständniss...


Anmelden zum Antworten