Advertisement
Guest User

Untitled

a guest
Oct 21st, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.84 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstdio>
  4. #include <cctype>
  5. #include <cstring>
  6.  
  7. using namespace std;
  8.  
  9. class Recurs_descent_calc {
  10.     public:
  11.         int count_up(char* str_expr) {
  12.             expr = str_expr;
  13.             return add_sub();
  14.         }
  15.         void error() {
  16.             cout << "error" << '\n';
  17.             exit(1);
  18.         }
  19.     private:
  20.         char* expr;
  21.         void eat_up_next_spaces() { for(; expr[0] == ' '; expr++); }
  22.         int add_sub() {
  23.             eat_up_next_spaces();
  24.             int counted = mul_div();
  25.             eat_up_next_spaces();
  26.             //if(*expr == '\0') { return counted; }
  27.             if(*expr == '+') { expr++; return counted + add_sub(); }
  28.             if(*expr == '-') { expr++; return counted - add_sub(); }
  29.             //error();
  30.             return counted;
  31.         }
  32.         int mul_div() {
  33.             eat_up_next_spaces();
  34.             int counted = minus();
  35.             eat_up_next_spaces();
  36.             //if(*expr == '\0') { return counted; }
  37.             if(*expr == '*') { expr++; return counted * add_sub(); }
  38.             if(*expr == '/') {
  39.                 expr++;
  40.                 int divider = add_sub();
  41.                 if(divider != 0) return counted / divider;
  42.                 else error();
  43.             }
  44.             //error();
  45.             return counted;
  46.         }
  47.         int minus() {
  48.             eat_up_next_spaces();
  49.             if(*expr == '-') {
  50.                 expr++;
  51.                 return -1 * num(); //Может ли быть много ун. минусов подряд?
  52.             }
  53.             return num();
  54.         }
  55.         int number_of_digits(int num) {
  56.             int q;
  57.             for(q = 0; num != 0; q++) num = num / 10;
  58.             return q;
  59.         }
  60.         int num() {
  61.             eat_up_next_spaces();
  62.             int number;
  63.             if(sscanf(expr, "%d", &number)) {
  64.                 expr += number_of_digits(number);
  65.                 eat_up_next_spaces();
  66.                 return number;
  67.             }
  68.             else error();
  69.         }
  70. };
  71.  
  72. int main(int argc, char* argv[]) {
  73.     Recurs_descent_calc calc;               //Create a calculator instance
  74.     if(argc != 2) calc.error();             //Сheck the correctness of input
  75.     cout << calc.count_up(argv[1]) << '\n'; //Feed him the entered expr to calculate
  76.     return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement