Интерпретировать арифметику c выражение C ++ - PullRequest
0 голосов
/ 17 января 2020

Я пишу программу на C ++, которая читает одну строку ввода из stdin, интерпретирует ее как арифметическое c выражение (сложение и умножение), оценивает его и записывает результат.

Это может быть Предполагается, что целые числа помещаются в одно 32-разрядное целое число без знака, а результат также помещается в 32-разрядное целое число без знака, а входные данные не вызывают целочисленное переполнение. Мне посоветовали не использовать дерево разбора.

Также программа должна иметь возможность поддерживать скобки для группировки и обнаруживать целочисленное переполнение во время оценки. Я вставил приведенный ниже код.

Я ищу предложения по улучшению и дальнейшей оптимизации.

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;

int calcSum();
int calcProd();
vector<int> num_vector;
vector<char> op_vector;
int op_count=0,num_count=0;

int main(){
    string expr,operand;
    getline(cin,expr);
    for(size_t i=0;i<expr.size();i++){
        bool insert =0;int number =0;
        if(expr[i] >= '0' && expr[i] <= '9'){
            operand += expr[i];
            if(i==expr.size()-1) insert=1;
        }
        else if(((expr[i] == '+' || expr[i] == '*' || expr[i] == ' ') && (expr[i+1] >= '0' && expr[i+1] <= '9'))){
            insert = 1;
        }
        if(expr[i] == '+' || expr[i]== '*') op_vector.push_back(expr[i]);

        if(insert){
            stringstream newop(operand);
            newop >> number;
            num_vector.push_back(number);
            operand = "";
        }   
    }
    int result = calcSum();cout << result << endl;
    return 0;
}

int calcSum(){
    int val1 = calcProd();
    while(op_vector[op_count] == '+'){
        ++op_count;
        int val2 = calcProd();
        val1 = val1 + val2;
    }
    return val1;
}

int calcProd(){
    int val1 = num_vector[num_count];num_count++;
    while(op_vector[op_count] == '*'){
        ++op_count;
        int val2 = num_vector[num_count];num_count++;
        val1 = val1 * val2;
    }
    return val1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...