Guest User

Untitled

a guest
Jul 11th, 2013
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cmath>
  4. #include <string>
  5. #include <stdlib.h>
  6. using namespace std;
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14. class Calculator
  15. {
  16. public:
  17. void Run();
  18.  
  19. protected:
  20. void error();
  21. double list();
  22. double expr();
  23. double num();
  24. };
  25.  
  26. unsigned position;
  27. char buffer[1000];
  28. int klammern = 0;  //für das zählen der Klammern. Wenn am Ende 0, dann wurden alle Klammern geschlossen bzw. geöffnet.
  29.  
  30.  
  31. void Calculator::error()
  32. {
  33.     cerr << "Syntaxfehler bei position " << position + 1 << endl;
  34.     system("pause");
  35.     exit(1);
  36. }
  37.  
  38. double Calculator::list()
  39. {
  40.         double a = expr(), b;
  41.         if(buffer[position] == '+') {
  42.             position++;
  43.             b = list();
  44.             return a + b;
  45.         } else if(buffer[position] == '-') {
  46.             position++;
  47.             b = list();
  48.             return a - b;
  49.         } else if(buffer[position] && buffer[position] != ')')
  50.             /*Lookhead ist eine schließende Klammer.
  51.             Falls der Zähler klammern Null ist liegt ein Syntaxfehler vor.*/
  52.         if(!klammern)
  53.             error();
  54.         else
  55.             error();
  56.         return a;
  57. }
  58.  
  59. double Calculator::expr()
  60. {
  61.         double a, b;
  62.        
  63.         if(buffer[position] == '(') {
  64.                 klammern++; //bei nächsterklammerebene wird klammern erhöht
  65.                 position++;
  66.                 a = list();
  67.            
  68.             if(buffer[position] != ')')
  69.                     error();
  70.                 klammern--; //bei geschlossener klammer wird klammern erniedrigt.
  71.                 position++;
  72.         } else
  73.                 a = num();
  74.  
  75.        
  76.         if(buffer[position] == '*') {
  77.                 position++;
  78.                 b = expr();
  79.                 return a * b;
  80.         } else if(buffer[position] == '/') {
  81.                 position++;
  82.                 b = expr();
  83.                 return a / b;
  84.         }
  85.  
  86.         return a;
  87. }
  88.  
  89. double Calculator::num()
  90. {
  91.                 char *endptr;
  92.                 double a = strtod(&buffer[position], &endptr); //strtod analyisert die Zahlen
  93.                 unsigned len = (unsigned) (endptr - &buffer[position]);
  94.  
  95.                 if(!len) //wenn len = 0 dann wurde mit strtod keine fließkommazaheln aus dem eingangsbuffer gelesen
  96.                         error();
  97.                         position += len;
  98.  
  99.                         return a;
  100. }
  101.  
  102.  
  103.  
  104. void Calculator::Run()
  105. {
  106.     while(!cin.eof()) {
  107.         cin.getline(buffer, sizeof(buffer));
  108.         position = 0;
  109.         klammern = 0;
  110.         cout << buffer << " = " << list() << endl;
  111.        
  112.     }
  113. }
  114.  
  115.  
  116. int main(){
  117.     cout << "Bitte Term eingeben.\n";
  118.     Calculator calculator;
  119.     calculator.Run();
  120.     cout << endl << "Bye!" << endl;
  121.    
  122.     system("Pause");
  123.     return 0;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment