如何在C++中正确返回运算符(*、/、-、+)?

3

编辑—谢谢大家的帮助。我甚至没有想到使用switch语句。出于某种原因,我一直认为C++与Java有很大的不同……这在使用switch时非常容易理解。感谢您注意到这一点。

如何正确返回运算符并在返回后使用它?我编写了一个函数来获取输入中的运算符并检查其是否是有效的输入…这是我为此编写的代码(我将其称为doctor,因为我猜测在C ++中operator是保留名称,而医生会进行手术哈哈…抱歉…只是开个玩笑)…:

string doctor()
{
    string getDoc;

    cin >> getDoc;

    if (getDoc == "*")
        return "*";

    if (getDoc == "/")
        return "/" ;

    if (getDoc == "-")
        return "-" ;

    if (getDoc == "+")
        return "+" ;

    else 
    {
        cout << "You entered " << getDoc << " please only use +,-,*,/ : ";
        return doctor();
    }
}

当值被返回时,我让我的main()函数执行以下操作(将其返回到“operation”变量中...):

cout << firstNum << operation << secondNum << " is " << answer;

除了那个运算符以外,我的所有东西都能正常运行......我该怎么做才能让它执行它需要执行的操作呢?换句话说,如果它是一个 * ,那就要进行乘法等操作......

如果这太基础了,对不起,我刚接触 C++,在谷歌上搜索并没有得到结果......

谢谢!


小心使用 using namespace std; - LihO
也许是一系列的if-else if语句或者一个switch语句? - Some programmer dude
@A P - 我认为在Java中做这件事情的难度完全相同。实际上,它的代码几乎不会有任何变化。 - mah
@AP:如果你拿到了Stroustrup的《C++程序设计语言》,书的开头附近有一个计算器的示例应用。对于为什么要这样做有充分的解释,这可能有助于你的其余代码,而不仅仅是这部分。 - Steve Jessop
@mah 是的,你说得对...我没有想到我可以在C++中使用switch语句(这是我在Java中使用的)。 - Duxa
显示剩余3条评论
7个回答

2

好的,无论如何你都需要比较字符。但更简短的方法是使用(如果你在char中有sign)。

switch(sign) { 
    case '*':
    case '/':
    case '+':
    case '-':
        string str; str += sign;
        return str; 
    default:
        return "error message";
}

或者

if(sign == "+" || sign == "-" || sign == "/" || sign == "*")
    return sign;
else
    return "Error message";

我会抛出异常,而不是尝试将错误信息写入返回的字符串中。 - LihO
确实,有很大的领域可以让用户知道发生了错误。 - dreamzor

1
一个经典的方法是在这里使用switch-case结构。如果给定了'*',则乘以参数,如果给定了'/',则除以参数。
double doctored(char operation, double arg1, double arg2) {
    switch (operation) {
        case '+': return arg1+arg2;
        case '-': return arg1-arg2;
        case '*': return arg1*arg2;
        case '/': return arg1/arg2;
        default:  // ignore
            return arg1;
    }
}

如果用户输入了垃圾数据,重新询问用户的最佳方式是什么?调用自身即返回自身是最好的方式吗? - Duxa
不,你只需创建一个do-while循环,等待输入操作符,并在正确的输入提供后将退出条件(一个单独的布尔值)设置为true。此函数是一个示例,说明一旦解析出正确的操作符号,您可以如何工作。 - Vesper

0

你可以像在获取输入流的函数中那样对其进行大小写转换:

float result;
switch(operation) {
    case '*':
        result = firstNum * secondNum;
        break;
    case '/':
        result = firstNum / secondNum;
        break;
    case '+':
        result = firstNum + secondNum;
        break;
    case '-':
        result = firstNum - secondNum;
        break;
}
cout << firstNum << operation << secondNum << " is " << result;

0
写另一个方法来执行你的计算并调用它:
float doDoctoryStuff(float a, float b, const char op)
{
  switch(op) {
    case '*':
      return a * b:
      break;
    ...
    ...
    ...
 }
}

在你的主函数中

cout << firstNum << operation << secondNum << " is ";
cout << doDoctoryStuff(firstNum, secondNum, doctor().c_str());

0
从返回的字符串中,你可以选择一个函数或可调用对象(函数对象)。例如,你可以使用 if-else 来实现,或者你可以使用 std::map。然后,通过这个函数或可调用对象,直接调用它。

0
你可以像之前验证一样进行操作,例如。
if (operation == "*")
    answer = firstNum *secondNum;

等等(最好是在 switch-case 中都这样做,就像我其他答案中提到的那样),不过更好的方法是创建一个类来解析字符串并将操作符信息(作为枚举)存储内部。给它一个方法,将操作应用于两个数字并返回结果,并实现另一种方法来以字符串形式返回文本表示。然后你就可以将数据与视觉呈现分离了。(别忘了从字符串中提取所需操作符的方法 )


0

doctor(运算符)的使用取决于操作数,如果它们是类的实例 - 您必须为它们重载operator,否则我认为您可以为每个运算符编写一个函数,该函数需要1、2、3个参数。当使用switch语句时,根据所需操作的值调用函数并返回所需结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接