0

課題: この課題では、ユーザーが提供する逆ポーランド式の結果を計算するプログラムを作成します。

次の状況 (エラー) を処理する必要があります。

演算子が多すぎます (+ - / *)

オペランドが多すぎます (double)

ゼロ除算

プログラムは、演算子とオペランドを 1 つのスペースで区切るポーランド式を取り込み、等号で式を終了します。

プログラムは、ユーザーが行にゼロ (0) だけを入力し、その後に新しい行を入力するまで、式の取得と評価を続けます。

問題 1: 演算子とオペランドが多すぎることをユーザーに伝えるのに問題があります。コーディングしようとしましたが、どこから始めればよいかわかりません。

問題 2:ユーザーが 0 を入力したときにプログラムを終了させたいのですが、プログラムでそれを実行しても何も実行されません。

#include<iostream>
#include<iomanip>
#include<string>
#include<sstream>

using namespace std;

class Node
{
    double data;
    Node *top;
    Node *ptr;
public:
    Node()
    {
        top = NULL;
        ptr = NULL;
    }

    bool isEmpty()
    {
        return top == 0;
    }

    void pushValue(double val)
    {
        Node *next = new Node;
        next->data = val;
        next->ptr = top;
        top = next;
    }

    double popVal()
    {
        if (isEmpty())
        {
            cout << "Error: Too many operators" << endl;
        }
        else
        {
            Node *next = top->ptr;
            double ret = top->data;
            delete top;
            top = next;
            return ret;
        }

    }
//Displays the answer of the equation
    void print()
    {
        cout << "= " << top->data << endl;
    }
};

bool isOperator(const string& input)
{
    string ops[] = { "+", "-", "*", "/" };
    for (int i = 0; i < 4; i++)
    {
        if (input == ops[i])
        {
            return true;
        }
    }
    return false;
}
//This function tells the operators what to do with the values.
void performOp(const string& input, Node& stack)
{
    double Val1, Val2;
    int errorCheck = 0;

    Val1 = stack.popVal();
    Val2 = stack.popVal();

    if (input == "+")
    {
        stack.pushValue(Val1 + Val2);
    }
    else if (input == "-")
    {
        stack.pushValue(Val1 - Val2);
    }
    else if (input == "*")
    {
        stack.pushValue(Val1 * Val2);
    }
    else if (input == "/" && Val2 != 0)
    {
        stack.pushValue(Val1 / Val2);
    }

    if (input == "/" && Val2 == 0)
    {
        cout << "Error: Division by zero" << endl;
        errorCheck = 1;
    }

    if (errorCheck == 0)
    {
        stack.print();
    }
}

int main()
{
    cout << "Reverse Polish Notation Calculator!" << endl;
    cout << "-------------------------------------------------------------------" << endl;
    cout << "Enter your values followed by your operators(Enter 0 to exit)" << endl;

    string input;
    Node stack;
//Checks the user's input to see which function to use.
    while (true)
    {
        cin >> input;
        double num;

        if (stringstream(input) >> num)
        {
            stack.pushValue(num);
        }
        else if (isOperator(input))
        {
            performOp(input, stack);
        }
        else if (input == "0")
        {
            return 0;
        }
    }
}
4

0 に答える 0