使用修饰符

时间:2018-04-20 17:20:07

标签: c++ performance io sequence

在C ++中,是否可以使用变量输入运算符(例如“ - ,+,*,/”),然后在计算中使用它?

示例:

cin>>(input operator here)
cout<< i (inputted operator here) b;

目前我已经通过使用长度非常不友好的“开关”来完成它 - 我坚信有一种输入操作员的方法,但我无法弄清楚如何。

这是我制作的代码 - 请按照我问的方式修复它(并解释你是如何做到的!)。帮助很多赞赏:)。

#include <iostream>
#include <string>

using namespace std;

bool wantedModifyed=0;
string choice;
char operato;

template<typename T>
T get(const string &prompt)
{
    std::cout<<prompt;
    T ret;
    std::cin>>ret;
    return ret;
}

void modifier()
{
    if (!(choice=="Y" || choice=="y" || choice=="N" || choice=="n"))
    {
        cout<<"Y or N: ";
        cin>>choice;
        modifier();
    }
    if (choice=="Y" || choice=="y")
    {
        wantedModifyed=1;
    }
}
void operatorChecker()
{
    if (!(operato=='+' || operato=='-' || operato=='*' || operato=='/'))
    {
        operato=get<char>("\nEnter your modifier (+,-,*,/): ");
        operatorChecker();
    }
}

int OperatorPlus(int a, int c){return a+c;}

int OperatorMinus(int a, int c){return a-c;}

int OperatorMultiply(int a, int c){return a*c;}

int OperatorDivide(int a, int c){return a/c;}

int main()
{
    int a,b;
    a=get<int>("\nEnter number A: ");
    b=get<int>("\nEnter number B: ");
    if(a>b) swap(a,b);
    modifier();
    if(wantedModifyed==0)
        for(int i=a; i<=b; i++)
            if(i==b) cout<<i<<". ";
            else cout<<i<<", ";
    else
    {
        get<char>("\nEnter your operator (+,-,*,/): ");
        operatorChecker();
        int modifier=get<int>("\nEnter your modifier: ");
        for(int i=a; i<=b; i++)
        {
            switch(operato)
            {
            case '+':
                cout<<OperatorPlus(i,modifier);
                if(i==b) cout<<".";
                else cout<<", "; break;
            case '-':
                cout<<OperatorMinus(i,modifier);
                if(i==b) cout<<".";
                else cout<<", "; break;
            case '*':
                cout<<OperatorMultiply(i,modifier);
                if(i==b) cout<<".";
                else cout<<", "; break;
            case '/':
                cout<<OperatorDivide(i,modifier);
                if(i==b) cout<<".";
                else cout<<", "; break;
            }
        }
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

如果要输入运算符而不是字符类型,则需要创建运算符类型并重载operator>>

class Operator
{
  public:
    Operator(const char symbol)
    : operator_char(symbol)
    { ; }
    virtual int evaluate(int a, int b) = 0;
  private:
    const char operator_char;
};

class Multiply_Operator : public Operator
{
  public:
    Multiply_Operator() : Operator('*')
    { ; }
};

// ...
Operator * Create_Operator()
{
  static std::map<char, Operator *> dictionary;
  if (dictionary.empty())
  {
     dictionary['*'] = new Multiply_Operator;
     //...
  }
  char operator_char;
  std::cout << "Enter operator (*, /, +, -): ";
  std::cin >> operator_char;
  Operator * p_operator = dictionary[operator_char];
  return p_operator;
}

以上类似于 Factory Design 模式,并且比使用简单的switch语句有点过分。

编辑1:简化
我们只有一个通用运算符:

class Operator
{
  public:
    friend std::istream operator>>(std::istream& input, Operator& opr);
  private:
    enum Operation_Type
    {
       OPR_MULTIPLE, OPR_DIVIDE, OPR_ADD, OPR_SUBTRACT
    };
    Operation_type ot;
};
std::istream operator>>(std::istream& input, Operator& opr)
{
  char opr_char;
  input >> opr_char;
  switch (opr_char)
  {
    case '*' : opr.ot = OPR_MULTIPLY; break;
    //...
  }
  return input;
}

<强>摘要
根本问题是,您需要将关联映射一个字符添加到运算符中。有很多方法可以进行关联,switch就是其中之一,std::map是另一种方法。