myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   C++ Eingabe in Term umformen (?) (https://mygully.com/showthread.php?t=2974292)

gangstergangster 09.07.13 17:29

C++ Eingabe in Term umformen (?)
 
Hallo, ich möchte einen Taschenrechner in C++ erstellen.
Hierbei soll in der Eingabeaufforderung ein beliebig langer Term stehen, dieser soll dann umgewandelt werden, dass mein Programm auch damit umgehen kann...

mein programm sieht momentan so aus:
Code:

double zahl1, zahl2, ergebnis;                // Variablen für Zahlen
    char rechenzeichen;                          // Variable fürs Rechenzeichen
               
    cout << "Geben Sie eine Rechenaufgabe ein: "; // Eingabeaufforderung ausgeben
    cin >> zahl1 >> rechenzeichen >> zahl2;      // Aufgabe einlesen

    switch(rechenzeichen){                        // Wert von rechenzeichen ermitteln
        case '+': ergebnis = zahl1+zahl2; break;  // entsprechend dem
        case '-': ergebnis = zahl1-zahl2; break;  // Rechenzeichen
        case '*': ergebnis = zahl1*zahl2; break;  // das Ergebnis
        case '/': ergebnis = zahl1/zahl2; break;  // berechnen
        // Fehlerausgabe und Programm beenden, falls falsches Rechenzeichen eingegeben wurde
        default: cout << "unbekanntes Rechenzeichen...\n"; return 1;
    }

    // Aufgabe noch mal komplett ausgeben
    cout << zahl1 << ' ' << rechenzeichen << ' ' << zahl2 << " = " << ergebnis << '\n';

}

jedoch soll das programm auch sachen wie "1+1+1+1+1+1+1++1+1+...+1" ausrechnen können, sprich der benutzer soll einen beliebig langen term verfassen können.

mit meiner methode klappt leider nur bei vorgegebener termlänge.. wie bekomme ich es hin dass nun die ganze zeile vom benutzer .. (später auch komplexe terme wie " 1.57+sin(2.5PI)+-3.239/0.21" ) in brauchbare teile zerlegt und umgewandelt werden.. ??

danke schonmal im vorraus...

dustail 09.07.13 17:37

Da das hier nicht C sondern C++ ist, kannst du auch mit Strings arbeiten. Meine Vorangehensweise wäre:
Zuerst eine Zeile einlesen (Abbruchbedingung wäre dann "Enter") oder solange einlesen bis ein bestimmtes Zeichen eingelesen wird.
Hat man nun den String, zerlegt man dieses. Da KLAPS (Klammer vor Punkt vor Strich) in Mathe herrscht (:D) würde ich sagen, man zerlegt von innen nach außen, d.h. die innerste zuerst, dann nach außen hin arbeiten, die Ergebnisse der jeweiligen Klammern anschließend zwischenspeichern.

gangstergangster 09.07.13 17:56

okay klingt schonmal nicht schlecht..
ja string verwende ich sowiso nacher.. hast du recht.. die zeile hatte ich vor mit getline einzulesen.. also dann halt so:
Zitat:

string MeineZeile;
getline(cin, MeineZeile)
oder?

kannst du mir vlt mal ein beispiel für deinen ansatz geben? wie genau zerteil ich das ganze? und wie sag ich ihm wo er anfangen soll mit dem zerteilen?

dustail 09.07.13 19:09

Ein Beispiel in c++ ist schlecht, allerdings sollte es möglich sein, wie du auch schon erwähnt hast, eine ganze Zeile einzulesen. Ich würde erstmal eine Schleiße durch den String laufen lassen (char für char) und die Stelle der letzten öffnenden Klammer, also "(" merken, danach die dazu gehörige schließende Klammer suchen (ab der Stelle der öffnenden Klammer).
Du kannst mit einfachen Beispielen anfangen und mit der Zeit dein Algorithmus für komplexere Terme erweitern.

gangstergangster 10.07.13 09:20

sorry.. ich kann dich nicht ganz nachvollziehen.. :( .. also klar.. char für char muss nachgelesen werden.. ich hatte irgendwie sogedacht dass ich eben einen vektor zahl.double und einen vektor zeichen.char hab. und dass bei einem term der 1+2+3+1 eben 1 in zahl.double[0] geht, + in zeichen.char[0] geht, 2 in zahl.double[1] geht.. und soo weiter.. .

und ich dann eben nur eine schleife machen muss bei der eben dann i.wie sowas hier steht:

zahl.double[i] zeichen.char[i]
und i eben hochgezählt wird.. soweit es eben zeichen gab... aber mit dem ansatz komm ich irgendiwe nicht weiter...

naja.. lange gegoogelt.. jetzt hat mir jemand von der uni dieses pdf hier empfohlen.. ohne viel drüber zu verlieren: [Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

aber dass sind 255 seiten in nicht ganz angenehmer literatur.. und naja.. bei der 50 seite hatte man mehr "hä" momente als erleuchtungen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:42 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.