Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdlib>
- #include <cstdio>
- #include <cctype>
- #include <cstring>
- using namespace std;
- class Recurs_descent_calc {
- public:
- int count_up(char* str_expr) {
- expr = str_expr;
- return add_sub();
- }
- void error() {
- cout << "error" << '\n';
- exit(1);
- }
- private:
- char* expr;
- void eat_up_next_spaces() { for(; expr[0] == ' '; expr++); }
- int add_sub() {
- eat_up_next_spaces();
- int counted = mul_div();
- eat_up_next_spaces();
- //if(*expr == '\0') { return counted; }
- if(*expr == '+') { expr++; return counted + add_sub(); }
- if(*expr == '-') { expr++; return counted - add_sub(); }
- //error();
- return counted;
- }
- int mul_div() {
- eat_up_next_spaces();
- int counted = minus();
- eat_up_next_spaces();
- //if(*expr == '\0') { return counted; }
- if(*expr == '*') { expr++; return counted * add_sub(); }
- if(*expr == '/') {
- expr++;
- int divider = add_sub();
- if(divider != 0) return counted / divider;
- else error();
- }
- //error();
- return counted;
- }
- int minus() {
- eat_up_next_spaces();
- if(*expr == '-') {
- expr++;
- return -1 * num(); //Может ли быть много ун. минусов подряд?
- }
- return num();
- }
- int number_of_digits(int num) {
- int q;
- for(q = 0; num != 0; q++) num = num / 10;
- return q;
- }
- int num() {
- eat_up_next_spaces();
- int number;
- if(sscanf(expr, "%d", &number)) {
- expr += number_of_digits(number);
- eat_up_next_spaces();
- return number;
- }
- else error();
- }
- };
- int main(int argc, char* argv[]) {
- Recurs_descent_calc calc; //Create a calculator instance
- if(argc != 2) calc.error(); //Сheck the correctness of input
- cout << calc.count_up(argv[1]) << '\n'; //Feed him the entered expr to calculate
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement