0

私の問題は、ここから何かを出力する方法がわからないことです。printResult() を使用してこれまでの後置結果を印刷したい..どうすればこれを行うことができますか? postfix に変換した結果であるはずの inToPost() 関数内で取得した結果を計算する方法がわかりません。ありがとう。

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

using namespace std;

class Expression{
    public:
        string inToPost();
        string convertThis; // Expression that we want converted

        Expression(string input, int direction);   //constructor
        bool isOperator(char character);
        bool isOperand(char character);
        int isHigherWeight(char character);
        bool isHigherPrecedence(char op1, char op2);
        string printResult();

    private:
        string infix;
        string postfix;
        string prefix;


};

                                      //Constructor function
Expression::Expression(string input, int direction){
    switch (direction){
        case 1: infix = input;
        case 2: postfix = input;
        case 3: prefix = input;

    }
}

                                    //Operator Function checks to see if character is a legal symbol
bool Expression::isOperator(char character){
    if((character == '*')||(character == '+')||(character == '-')||(character == '/'))
                            return true;
                            else
                            return false;
    }


                                    //Operand Function checks to see if character is a legal character
bool Expression::isOperand(char character){
    if(character >= 'a' && character <= 'z')
    return true;
    if(character >= 'A' && character <= 'Z')
    return true;
    if(character >= '0' && character <= '9')
    return true;
    else
    return false;
}

                                //Function determines the weight of Operator.
int Expression::isHigherWeight(char character){
    int weight = 0;   // or -1?
    switch(character){
    case '+':
    case '-':
        weight = 1;
    case '*':
    case '/':
        weight = 2;
    }
    return weight;
}

                               //Function that compares weights of two different Operators.
bool Expression::isHigherPrecedence(char oper1, char oper2){
    int op1Weight = isHigherWeight(oper1);
    int op2Weight = isHigherWeight(oper2);

    // If operators have equal precedence, return true
    // return false
    return op1Weight > op2Weight ?  true: false;{

    }
}

string Expression::inToPost(){

    stack<char> Stack;
    string postfix = "";  // Initialize postfix as empty string.

        for(int i = 0;i< convertThis.length();i++){   //go through array of string convertThis

            if (convertThis[i] == '('){            //1-Read the left parenthesis and push it onto the stack
                Stack.push(convertThis[i]);
        }


            else if(isOperand(convertThis[i])){    //2-else if( the next input is a number or letter)
                 cout << convertThis[i];           //3-Read the operand and write it to the output
        }



            else if(isOperator(convertThis[i])){   //4-else if the next input is operator
                   cout << Stack.top();
                   Stack.pop();                    //5-Print the top operation and pop it
            }
                                    //6-
            while(!Stack.empty() && Stack.top() != '(' && isHigherPrecedence(Stack.top(),convertThis[i])){
                Stack.push(convertThis[i]);     //7- Read the next input symbol, and push this symbol onto the stack
            }
                          // 8- Read and discard the next input symbol(which should be a right parenthesis).
                if (convertThis[i] == ')'){
                    i+1;

                                           //  9- Print the top operation and pop it; Keep printing and popping until
                while (!Stack.top() == '('){
                   cout << Stack.top();
                   Stack.pop();
                }
    }
                Stack.pop();                 //10- Finally, pop the left parenthesis.

            while(!Stack.empty()){
                 cout << Stack.top();

            }


    return postfix;

   }

  }




string Expression::printResult(){





  return postfix;

   }


int main(){

string convertThis;


int choice;


cout << "|-----Here is my conversion menu-----|" << endl;
cout << "|----What are you converting to?-----|" << endl << endl;
cout << "1- Infix to postfix" << endl;
cout << "2- Infix to prefix" << endl;
cout << "3- postfix to infix?" << endl;
cout << "4- prefix to infix?" << endl;
//cin >> choice;
//cin.ignore();

cout << "Now enter the expression you want to convert ";
getline(cin,convertThis);

//Expression printResult;

//cout << printResult.printResult();


}
4

1 に答える 1

0

あなたの質問は複雑すぎて、「出力を画面に送信するにはどうすればよいですか?」と尋ねることはできません。1 つのクラスに 10 個の関数があります... で使用したことのないクラスですmain。関数の半分は空です...小さく始めてください。stringプライベート変数を持つクラス、つまりとその文字列を表示stringする単一のpublic関数を受け取るコンストラクターから始めます。

それはこのように見えるでしょう...

#include <string>
#include <iostream>

class MyClass{
public:
    MyClass(std::string str) : m_string(str){}
    void PrintString() { std::cout << m_string << std::endl; }

private:
    std::string m_string;
};

int main(int argc, char * argv[]){

    std::string inputString("This is my test string.");

    MyClass myClass(inputString); // create an instance of your class
    myClass.PrintString(); // Print the variable within your class

    return 0;
}

作業が完了したら、4 つのオプションのコンストラクターに 2 番目の入力を追加します。これを行うには多くの方法があります。次に、残りの関数を 1 つずつ追加してテストします。

于 2017-02-25T02:26:37.090 に答える