String in Rechenzeichen



  • hallo ich plane grad einen variablenrechner
    da soll man nen term eingeben (mit variablen(aber des is jetzt egal) und dann kann man den öfters ausrechnen

    ich hab schon geschafft jedes zeichen des terms in nen einzelnen String zu packen, aber wie kann man wenn jetzt ein String in ein Rechenzeichen umwandeln, da gibts ja kein Format
    also wenn jetzt:

    s[1] = "1";
    s[2] = "+";
    s[3] = "2";
    

    die s[1] und s[3] zu interger is ja gein problem aber was mach ich mit dem s[2] 😕
    also bye mollitz



  • Hallo

    du kannst nicht aus dem Zeichen einfach eine Rechenoperation machen. Das must du sozusagen per Hand auswählen

    int Ergebnis;
    int Zahl1,Zahl2;
    char Zeichen = '+';
    switch (Zeichen)
    {
      '+' : Ergebnis = Zahl1 + Zahl2; break;
      '-' : Ergebnis = Zahl1 - Zahl2; break;
      ...
      }
    

    bis bald
    akari



  • so hab ich's mir auch schon überlegt
    allerdings was ist wenn der term jetzt so ist:
    1+3+y+2*1/3-43+1
    bye mollitz



  • Dann mußt Du ein wenig mehr Gehirnschmalz einsetzen und zuerst feststellen, in welcher Reihenfolge die Operationen ausgeführt werden müssen (Punktrechnung vor Strichrechnung). Am Prinzip, das akari gezeigt hat, ändert sich dadurch nichts.
    Wenn Du akaris Code in eine Funktion packst und jeweils den Operator und die Werte übergibst und als Rückgabewert jeweils die Teilsumme erhälst, bist Du schon fast fertig.



  • sowas hab ich vor längerem zum Spaß mal programmiert, kann man natürlich noch
    beliebig erweitern hier nur die Variante mit +, -, *, /

    ShowMessage(Calc("1 +5*6+4"));
    
    double __fastcall TForm1::Calc(AnsiString sF)
    {
        double dReturn=0;
        sF = NoSpace(sF);
    
        char cOperator;
    
        int iPos = -1, iTempPos;
    
        iTempPos = sF.AnsiPos("*");
        if (iTempPos > 0) iPos = iTempPos;
    
        iTempPos = sF.AnsiPos("/");
        if (iTempPos > 0) iPos = iTempPos;
    
        iTempPos = sF.AnsiPos("+");
        if (iTempPos > 0) iPos = iTempPos;
    
        iTempPos = sF.AnsiPos("-");
        if (iTempPos > 0) iPos = iTempPos;
    
        if (iPos > 0) {
            cOperator = sF.c_str()[iPos -1];
            AnsiString sLeft = sF.SubString(1, iPos -1);
            AnsiString sRight = sF.SubString(iPos +1, sF.Length());
    
            /*
            ShowMessage("Left: '" + sLeft
                      + "' Right: '" + sRight + "'");
            */
    
            switch (cOperator) {
                case '+':
                    dReturn = Calc(sLeft) + Calc(sRight);
                    break;
                case '-':
                    dReturn = Calc(sLeft) - Calc(sRight);
                    break;
                case '*':
                    dReturn = Calc(sLeft) * Calc(sRight);
                    break;
                case '/':
                    dReturn = Calc(sLeft) / Calc(sRight);
                    break;
            }
        } else {
            return sF.ToDouble();
        }
    
        return dReturn;
    }
    
    AnsiString __fastcall TForm1::NoSpace(AnsiString sIn)
    {
        AnsiString sReturn = "";
        for (int i = 0; i < sIn.Length(); i++) {
            char cChar = sIn.c_str()[i];
            if (cChar != ' ') sReturn = sReturn + sIn.c_str()[i];
        }
    
        return sReturn;
    }
    


  • Hallo

    außerdem ist im Forum zum Thema "Taschenrechner" auch einiges zu finden.

    bis bald
    akari



  • was ist mit geklammerten ausdrücken? z.b. (1 + 2) * 3 = ? oder werden die nicht unterstützt? 😃



  • Am besten, man benutzt dafür einen Top-Down-Parser, anstatt selbst irgendwelche Pseudo-Parser-Routinen zu schreiben... (siehe auch EBNF-Grammatik)


Anmelden zum Antworten