DeletedUser
Gast
Hallo zusammen
Ich lerne zurzeit C++ mithilfe des Buches "Einführung in die Programmierung mit C++" von Bjarne Stroustrup. Zurzeit programmiere ich das Beispiel mit dem Taschenrechner. Jedoch habe ich hier zu eine Frage. Ich habe aufgrund meines Programmierstils immer die If's mit geschweiften Klammern gemacht. Deswegen kam bei Kommando "q" (für Schliessen/Verlassen) immer, dass der Faktor ungültig sei (Fehlermeldung, Fenster schliesst sich mit Enter). Jetzt habe ich mal die geschweiften Klammern beim If weggelassen und jetzt schliesst sich das Fenster wie gewollt sofort. Jetzt kommt meine Frage, wieso funktioniert es ohne die geschweiften Klammern einwandfrei und mit nicht?
C++-Code ohne die geschweiften Klammern am erwähnten Ort:
Ich bedanke mich schon mal für die Aufklärung.
Freundliche Grüsse aus der Schweiz.
Ich lerne zurzeit C++ mithilfe des Buches "Einführung in die Programmierung mit C++" von Bjarne Stroustrup. Zurzeit programmiere ich das Beispiel mit dem Taschenrechner. Jedoch habe ich hier zu eine Frage. Ich habe aufgrund meines Programmierstils immer die If's mit geschweiften Klammern gemacht. Deswegen kam bei Kommando "q" (für Schliessen/Verlassen) immer, dass der Faktor ungültig sei (Fehlermeldung, Fenster schliesst sich mit Enter). Jetzt habe ich mal die geschweiften Klammern beim If weggelassen und jetzt schliesst sich das Fenster wie gewollt sofort. Jetzt kommt meine Frage, wieso funktioniert es ohne die geschweiften Klammern einwandfrei und mit nicht?
C++-Code ohne die geschweiften Klammern am erwähnten Ort:
Code:
/*
* File: Taschenrechner.cpp
* Author: FalkenaugeMihawk
*
* Created on 3. September 2012, 21:30
*/
#include <iostream>
#include <stdexcept>
#include <string>
using namespace std;
void user_error(string s) {
throw runtime_error(s);
}
class Token {
public:
char kind; //Token-Kategorie
double value; //Für Zahlen: ein Wert
Token(char ch):kind(ch), value(0) {
}
Token(char ch, double val):kind(ch), value(val) {
}
};
class Token_stream {
public: //Benutzerschnittstelle
Token_stream(); //Erstelle einen Token_stream, der aus cin liest
Token get(); //Liest ein Token ein
void putback(Token t); //Legt ein Token zurück
private: //Implementierungsdetails
bool full; //Befindet sich ein Token im Buffer?
Token buffer; //Hier legen wir ein Token ab, das mit putback() zurückgestellt wird
};
Token_stream::Token_stream():full(false), buffer(0) { //Kein Token im Puffer
}
Token Token_stream::get() {
if(Token_stream::full) {
Token_stream::full = false;
return Token_stream::buffer;
}
char ch;
cin >> ch;
switch(ch) {
case ';':
case 'q':
case '(':
case ')':
case '+':
case '-':
case'*':
case '/':
return Token(ch);
break;
case '.':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
{
cin.putback(ch);
double val;
cin >> val;
return Token('8', val);
}
break;
default:
user_error("Ungueltiges Token");
break;
}
}
void Token_stream::putback(Token t) {
if(Token_stream::full) {
user_error("Putback(): Zurueckstellen nicht möglich, Puffer voll");
}
Token_stream::buffer = t; //kopiere t in den Puffer
Token_stream::full = true; //Puffer ist jetzt voll
}
Token_stream ts; //Liefert get() und putback()
double expression(); //Ausdruck-Regel; behandelt + und -
double term(); //Term-Regel; behandelt *, / und %
double primary(); //Faktor-Regel; behandelt Zahlen und Klammern
int main() {
try {
cout << "Willkommen zu unserem einfachen Taschenrechnerprogramm.\n" << "Bitte gebe einen Ausdruck mit reellen Zahlen ein.\n"
<< "Ausdruck: ";
double val = 0;
while(cin) {
Token t = ts.get();
if(t.kind == 'q') //'q' steht für Verlassen
break;
if(t.kind == ';') { //';' steht für Jetzt ausgeben
cout << "Ergebnis: " << val << endl;
} else {
ts.putback(t);
}
val = expression();
}
return 0;
} catch(exception& e) {
cerr << "Fehler: " << e.what() << endl;
cin.get();
return 1;
}
}
double expression() {
double left = term(); //Lies einen Term und werte ihn aus
Token t = ts.get(); //Lies das nächste Token ein
while(true) {
switch(t.kind) {
case '+':
left += term();
t = ts.get();
break;
case '-':
left -= term();
t = ts.get();
break;
default:
ts.putback(t);
return left;
break;
}
}
}
double term() {
double left = primary();
Token t = ts.get();
while(true) {
switch(t.kind) {
case '*':
left *= primary();
t = ts.get();
break;
case '/':
{
double d = primary();
if(d == 0) {
user_error("Division durch Null");
}
left /= primary();
t = ts.get();
}
break;
default:
ts.putback(t);
return left;
break;
}
}
}
double primary() {
Token t = ts.get();
switch(t.kind) {
case '(':
{
double d = expression();
t = ts.get();
if(t.kind != ')') {
user_error("')' erwartet");
}
return d;
}
break;
case '8':
return t.value;
break;
default:
user_error("Faktor erwartet");
break;
}
}
Ich bedanke mich schon mal für die Aufklärung.
Freundliche Grüsse aus der Schweiz.