Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream> //für hauptoperatoren wie cin cout
- #include <cstdlib> //für system(pause)
- #include <locale> // für umlaute
- #include <complex> //für komplexe Zahlen
- #include <cmath> //für trigonometrie, hyperbolische, exponentiale, logarithmische, u. A.
- #include <string>
- #include <vector>
- #include <stdlib.h> //für strtod()
- using namespace std;
- 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.
- char err_zeiger[1000];
- #define PI 3.14159265
- void leerzeichenentfernen();
- class Calculator
- {
- public:
- void Run();
- protected:
- void error();
- void error_nulldiv();
- void error_zeichen();
- double list();
- double expr();
- double num();
- void error_zeiger();
- };
- void Calculator::error()
- {
- Calculator::error_zeiger();
- cerr << "\nSyntaxfehler beim " << position + 1 << " Zeichen\n"
- << "Unbekannter Fehler.\n";
- system("pause");
- goto: punkt;
- //exit(1);
- }
- void Calculator::error_nulldiv()
- {
- Calculator::error_zeiger();
- cerr << "\nSyntaxfehler beim " << position << " Zeichen\n"
- << "Es kann nicht durch 0 geteilt werden.\n";
- system("pause");
- goto: punkt;
- //exit(1);
- }
- void Calculator::error_zeichen()
- {
- Calculator::error_zeiger();
- cerr << "\nSyntaxfehler beim " << position + 1 << " Zeichen\n"
- << "Es wurde eine Zahl erwartet\n";
- system("pause");
- goto: punkt;
- //exit(1);
- }
- void Calculator::error_zeiger(){
- for(int i=0; i>position; i++)
- err_zeiger[i+9] = '_';
- err_zeiger[position+9] = 'I';
- cout << err_zeiger << "\n";
- }
- 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();
- if(b != 0)
- return a / b;
- else
- error_nulldiv();
- }
- 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_zeichen();
- position += len;
- return a;
- }
- void leerzeichenentfernen(){
- register unsigned i = 0, j = 0; //zeiger i und j
- while(buffer[i]){ //geht eingabe durch
- if(isspace(buffer[i])) //wenn buffer[i] leerzeichen ist i erhöhen
- i++;
- else if(i != j) //damit sind i und j nichtmehr gleich
- buffer[j++] = buffer[i++]; //beide zeiger wandern 1 weiter. und dass leerzeichen eliminiert.--> speicheroptimierung
- else {
- i++;
- j++;
- }
- }
- buffer[j] = '\0';
- }
- void Calculator::Run()
- {
- cout << "\nEingabe: ";
- cin.getline(buffer, sizeof(buffer));
- leerzeichenentfernen();
- position = 0;
- klammern = 0;
- cout << "Ergebniss: " << buffer << " = " << list() << endl;
- }
- void rechnen(){
- }
- int main(){
- cout <<"Copyright(c) 2013" << endl;
- punkt:
- int eingabe;
- cout << "\n->Rechnen(1)\n->Beenden(2)\n";
- cin >> eingabe;
- cin.ignore();
- switch(eingabe){
- case 1 :
- Calculator calculator;
- calculator.Run();
- goto punkt;
- case 2 :
- cout << endl << "Bye!" << endl;
- break;
- }
- system("Pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment