在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;
}
答案 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
是另一种方法。