Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdlib>
- #include <cmath>
- #include <string>
- #include <stdlib.h>
- using namespace std;
- class Calculator
- {
- public:
- void Run();
- protected:
- void error();
- double list();
- double expr();
- double num();
- };
- 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.
- void Calculator::error()
- {
- cerr << "Syntaxfehler bei position " << position + 1 << endl;
- system("pause");
- exit(1);
- }
- 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++;
- } else
- a = num();
- if(buffer[position] == '*') {
- position++;
- b = expr();
- return a * b;
- } else if(buffer[position] == '/') {
- position++;
- b = expr();
- return a / b;
- }
- 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();
- position += len;
- return a;
- }
- void Calculator::Run()
- {
- while(!cin.eof()) {
- cin.getline(buffer, sizeof(buffer));
- position = 0;
- klammern = 0;
- cout << buffer << " = " << list() << endl;
- }
- }
- int main(){
- cout << "Bitte Term eingeben.\n";
- Calculator calculator;
- calculator.Run();
- cout << endl << "Bye!" << endl;
- system("Pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment