myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

C++ Eingabe in Term umformen (?)

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 09.07.13, 17:29   #1
gangstergangster
Mitglied
 
Benutzerbild von gangstergangster
 
Registriert seit: Dec 2008
Beiträge: 481
Bedankt: 114
gangstergangster wird langsam von ratten respektiert | 144 Respekt Punktegangstergangster wird langsam von ratten respektiert | 144 Respekt Punkte
Standard 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...
__________________
gangstergangster ist offline   Mit Zitat antworten
Ungelesen 09.07.13, 17:37   #2
dustail
Newbie
 
Benutzerbild von dustail
 
Registriert seit: Mar 2009
Beiträge: 83
Bedankt: 45
dustail gewöhnt sich langsam dran | 35 Respekt Punkte
Standard

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 () 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.
dustail ist offline   Mit Zitat antworten
Ungelesen 09.07.13, 17:56   #3
gangstergangster
Mitglied
 
Benutzerbild von gangstergangster
 
Registriert seit: Dec 2008
Beiträge: 481
Bedankt: 114
gangstergangster wird langsam von ratten respektiert | 144 Respekt Punktegangstergangster wird langsam von ratten respektiert | 144 Respekt Punkte
Standard

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?
__________________
gangstergangster ist offline   Mit Zitat antworten
Ungelesen 09.07.13, 19:09   #4
dustail
Newbie
 
Benutzerbild von dustail
 
Registriert seit: Mar 2009
Beiträge: 83
Bedankt: 45
dustail gewöhnt sich langsam dran | 35 Respekt Punkte
Standard

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.
dustail ist offline   Mit Zitat antworten
Ungelesen 10.07.13, 09:20   #5
gangstergangster
Mitglied
 
Benutzerbild von gangstergangster
 
Registriert seit: Dec 2008
Beiträge: 481
Bedankt: 114
gangstergangster wird langsam von ratten respektiert | 144 Respekt Punktegangstergangster wird langsam von ratten respektiert | 144 Respekt Punkte
Standard

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 Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]

aber dass sind 255 seiten in nicht ganz angenehmer literatur.. und naja.. bei der 50 seite hatte man mehr "hä" momente als erleuchtungen...
__________________
gangstergangster ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:25 Uhr.


Sitemap

().