Как я могу ввести текстовый файл формулы caculate в этот код? - стек - PullRequest
0 голосов
/ 06 октября 2019

Эта программа будет вводить файл формулы инфикса и преобразовывать формулу постфикса, а затем вычислять формулу.

Я хочу, чтобы эта программа работала в следующих условиях: введите txt-файл, и, если нет txt-файла, введите значение.

как я могу?

Попытка 1:

    #include <iostream>
    #include <cstring>
    #include <string>
    #include <stack>
    #include <vector>
    #include <fstream>

    using namespace std;

    char input[100];
    int length;

    vector<string> postfix;

    stack<char> stack_operator;
    stack<int> stack_calculator;


    int precedence(char c) {
        switch (c) {
        case '*':
        case '/':
            return 1;
        case '+':
        case '-':
            return 0;
        case '(':
        case ')':
            return -1;
        }
    }

    void infixToPostfix();

    void calculate();

    void fileopen(FILE *fp = stdin){
        char c;
        int i=0;
        while ((c = getc(fp)) != '\n') {

            input[i] = c;
            i++;
        }
            length = strlen(input);
            infixToPostfix();

            calculate();
    }

    int main() {
        fileopen();

            system("pause");
        }

    void infixToPostfix() {
        char c;
        string s;

        for (int i = 0; i < length; i++) {
            c = input[i];
            if (c >= '0' && c <= '9') {
                postfix.push_back(to_string(atoi(input + i)));
                while (input[i] >= '0' && input[i] <= '9')
                    i++;
                i--;
            }
            else {
                if (c == '(')
                    stack_operator.push('(');
                else if (c == ')') {
                    while (stack_operator.top() != '(') {
                        string str(1, stack_operator.top());
                        postfix.push_back(str);
                        stack_operator.pop();
                    }
                    stack_operator.pop();
                }
                else {
                    if (stack_operator.empty())
                        stack_operator.push(c);

                    else {
                        while (precedence(stack_operator.top()) >= precedence(c)) {

                            string str(1, stack_operator.top());
                            postfix.push_back(str);
                            stack_operator.pop();

                            if (stack_operator.empty())
                                break;
                        }
                        stack_operator.push(c);
                    }
                }
            }
        }

        while (!stack_operator.empty()) {
            string str(1, stack_operator.top());
            postfix.push_back(str);
            stack_operator.pop();
        }
    }

    void calculate() {
        for (string s : postfix) {
            char c = s.at(0);
            if (c == '+' || c == '-' || c == '*' || c == '/') {
                int left = stack_calculator.top();
                stack_calculator.pop();
                int right = stack_calculator.top();
                stack_calculator.pop();

                switch (c) {
                case '+':
                    stack_calculator.push(right + left);
                    break;
                case '-':
                    stack_calculator.push(right - left);
                    break;
                case '*':
                    stack_calculator.push(right * left);
                    break;
                case '/':
                    stack_calculator.push(right / left);
                    break;
                }
            }

            else
                stack_calculator.push(atoi(s.c_str()));
        }
        cout << stack_calculator.top() << endl;
    }

Попытка 2 (почти такая же):

    void fileopen() {
        ifstream fp;
        string s;
        int i = 0;

        fp.open("Text.txt");
        while (getline(fp, s))
        {
            cout << s;
        }
        length = s.size();
        infixToPostfix();

        calculate();
    }

    int main() {
        fileopen();

            system("pause");
        }
...