Guest User

Untitled

a guest
Jul 15th, 2013
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.17 KB | None | 0 0
  1. #include <iostream> //für hauptoperatoren wie cin cout
  2. #include <cstdlib> //für system(pause)
  3. #include <locale> // für umlaute
  4. #include <complex> //für komplexe Zahlen
  5. #include <cmath> //für trigonometrie, hyperbolische, exponentiale, logarithmische, u. A.
  6. #include <string>
  7. #include <vector>
  8. #include <stdlib.h> //für strtod()
  9. using namespace std;
  10.  
  11.  
  12.  
  13. unsigned position;
  14. char buffer[1000];
  15. int klammern = 0;  //für das zählen der Klammern. Wenn am Ende 0, dann wurden alle Klammern geschlossen bzw. geöffnet.
  16. char err_zeiger[1000];
  17.  
  18. #define PI 3.14159265
  19.  
  20.  
  21. void leerzeichenentfernen();
  22.  
  23. class Calculator
  24. {
  25. public:
  26. void Run();
  27.  
  28. protected:
  29. void error();
  30. void error_nulldiv();
  31. void error_zeichen();
  32. double list();
  33. double expr();
  34. double num();
  35. void error_zeiger();
  36.  
  37. };
  38.  
  39.  
  40. void Calculator::error()
  41. {
  42.     Calculator::error_zeiger();
  43.     cerr << "\nSyntaxfehler beim " << position + 1 << " Zeichen\n"
  44.         << "Unbekannter Fehler.\n";
  45.     system("pause");
  46.     goto: punkt;
  47.     //exit(1);
  48. }
  49.  
  50. void Calculator::error_nulldiv()
  51. {      
  52.     Calculator::error_zeiger();
  53.     cerr << "\nSyntaxfehler beim " << position << " Zeichen\n"
  54.         << "Es kann nicht durch 0 geteilt werden.\n";
  55.     system("pause");
  56.     goto: punkt;
  57.     //exit(1);
  58. }
  59.  
  60. void Calculator::error_zeichen()
  61. {      
  62.     Calculator::error_zeiger();
  63.     cerr << "\nSyntaxfehler beim " << position + 1 << " Zeichen\n"
  64.         << "Es wurde eine Zahl erwartet\n";
  65.     system("pause");
  66.     goto: punkt;
  67.     //exit(1);
  68.  
  69. }
  70.  
  71. void Calculator::error_zeiger(){
  72.     for(int i=0; i>position; i++)
  73.         err_zeiger[i+9] = '_';
  74.     err_zeiger[position+9] = 'I';
  75.     cout << err_zeiger << "\n";
  76. }
  77.  
  78.  
  79. double Calculator::list()
  80. {
  81.  double a = expr(), b;
  82.  if(buffer[position] == '+') {
  83.      position++;
  84.    b = list();
  85.    return a + b;
  86.   }
  87.  else if(buffer[position] == '-') {
  88.      position++;
  89.    b = list();
  90.    return a - b;
  91.  }
  92.  else if(buffer[position] && buffer[position] != ')')
  93. //      Lookhead ist eine schließende Klammer.
  94. //      Falls der Zähler klammern Null ist liegt ein Syntaxfehler vor.
  95.  if(!klammern)
  96.   error();
  97.  else
  98.   error();
  99.     return a;
  100.  
  101. }
  102.  
  103. double Calculator::expr()
  104. {
  105.     double a, b;
  106.              
  107.   if(buffer[position] == '(') {
  108.         klammern++; //bei nächsterklammerebene wird klammern erhöht
  109.     position++;
  110.     a = list();
  111.                    
  112.     if(buffer[position] != ')')
  113.      error();
  114.     klammern--; //bei geschlossener klammer wird klammern erniedrigt.
  115.     position++;
  116.    }
  117.     else
  118.    a = num();
  119.  
  120.     if(buffer[position] == '*') {
  121.    position++;
  122.    b = expr();
  123.    return a * b;
  124.   }
  125.     else if(buffer[position] == '/') {
  126.    position++;
  127.    b = expr();
  128.      if(b != 0)
  129.         return a / b;
  130.      else
  131.         error_nulldiv();
  132.   }
  133.  return a;
  134. }
  135.  
  136. double Calculator::num()
  137. {
  138.         char *endptr;
  139.         double a = strtod(&buffer[position], &endptr); //strtod analyisert die Zahlen
  140.         unsigned len = (unsigned) (endptr - &buffer[position]);
  141.  
  142.                 if(!len) //wenn len = 0 dann wurde mit strtod keine fließkommazaheln aus dem eingangsbuffer gelesen
  143.                 error_zeichen();
  144.                 position += len;
  145.                 return a;
  146.  
  147. }
  148.  
  149.  
  150. void leerzeichenentfernen(){
  151.     register unsigned i = 0, j = 0;         //zeiger i und j
  152.     while(buffer[i]){           //geht eingabe durch
  153.         if(isspace(buffer[i]))      //wenn buffer[i] leerzeichen ist i erhöhen
  154.             i++;
  155.         else if(i != j)     //damit sind i und j nichtmehr gleich
  156.             buffer[j++] = buffer[i++]; //beide zeiger wandern 1 weiter. und dass leerzeichen eliminiert.--> speicheroptimierung
  157.         else {
  158.             i++;
  159.             j++;
  160.         }
  161.     }
  162.     buffer[j] = '\0';
  163. }
  164.  
  165.  
  166.  
  167. void Calculator::Run()
  168. {
  169.         cout << "\nEingabe: ";
  170.         cin.getline(buffer, sizeof(buffer));
  171.         leerzeichenentfernen();
  172.         position = 0;
  173.         klammern = 0;
  174.         cout << "Ergebniss: " << buffer << " = " << list() << endl;
  175.                
  176.  
  177. }
  178.  
  179. void rechnen(){
  180.  
  181. }
  182.  
  183. int main(){
  184.     cout <<"Copyright(c) 2013" << endl;
  185.        
  186.     punkt:
  187.     int eingabe;
  188.     cout << "\n->Rechnen(1)\n->Beenden(2)\n";
  189.     cin >> eingabe;
  190.     cin.ignore();
  191.        
  192.  
  193.     switch(eingabe){
  194.     case 1 :
  195.         Calculator calculator;
  196.         calculator.Run();
  197.         goto punkt;
  198.        
  199.     case 2 :
  200.         cout << endl << "Bye!" << endl;
  201.     break;
  202.         }
  203.  
  204.  
  205.         system("Pause");
  206.         return 0;
  207. }
Advertisement
Add Comment
Please, Sign In to add comment