三位数运算计算器

时间:2016-11-28 08:13:03

标签: c++ calculator

问题是如果程序计算的第一个动作(取决于操作的顺序)是除以0(例如7/0 + 3或3 + 7/0),它会输出错误信息但执行下一步行动。

实施例 -

输入:7/0 + 2 ----->输出:您不能除以零.7 / 0 + 2 = 2

应该做什么---->输出:您不能除以零。

这是因为我无法跳过下一个开关操作。如果您有想法或知道如何解决它,请帮助。 谢谢

P.S 如果您知道解决操作顺序问题的更好方法,请提供帮助。

缩短代码: 只需输入7 + 4/0或7-4 / 0

之类的内容
#include"stdafx.h"
using namespace System;
#include<iostream>
using namespace std;
int main()
{
    long double num1, num2, num3, res;
    char action1, action2;
    cin >> num1 >> action1 >> num2 >> action2 >> num3;
    if ((action2 == '*' || action2 == '/') && (action1 == '-' || action1 == '+'))  //action2 will be preformed before action1 (Order of operation)
    {
        switch (action2)  //I didn't include the options for '+' or '-' because the if statement requires action2 to be '*' or '/'.
        {
        case('/'):
            if(num3==0)
                cout<< "Error, you can't divide by zero";
            else
                res = num2 / num3;
            break;
            default:
                cout << "Input not recognized";
                break;
            }
            switch (action1)
            {
            case('+'):
                cout << num1 << "+" << num2 << action2 << num3 << "=" << res + num1;
                break;
            case('-'):
                cout << num1 << "-" << num2 << action2 << num3 << "=" << res - num1;
                break;
            default:
                cout << "Input not recognized";
                break;
            }
    }
    cout << "\n\n";
    system("PAUSE");
    return 0;
}

完整代码:

// Three numbers Calculator
/*Known problems: when the first action is divided by zero the programs prints the error message but runs the next action.
Other than that I think most of the stuff works but I need to check*/
#include "stdafx.h"
using namespace System;
#include<iostream>
using namespace std;
int main()
{
    cout << "Enter action as # to exit program" << endl;
    cout << "Possible actions:+,-,*,/\n" << endl;
    int a = 1; //loop veriable
    while (a == 1) //loop
    {
        long double num1, num2, num3, res;
        char action1, action2;
        cin >> num1 >> action1 >> num2 >> action2 >> num3;
        if ((action2 == '*' || action2 == '/') && (action1 == '-' || action1 == '+'))  //action2 will be preformed before action1 (Order of operation)
        {
            switch (action2)  //I didn't include the options for '+' or '-' because the if statement requires action2 to be '*' or '/'.
            {
            case('/'):
                if (num3 == 0)      //The problem I described at the top occurs here and at another place below
                    cout << "You can't divide by zero.";
                else
                    res = num2 / num3;
                break;
            case('*'):
                res = num2*num3;
                break;
            default:
                cout << "Input not recognized";
                break;
            }
            switch (action1)    //I didn't include the options for '*' or '/' because the if statement requires action1 to be '+' or '-'.
            {
            case('+'):
                cout << num1 << "+" << num2 << action2 << num3 << "=" << res + num1;
                break;
            case('-'):
                cout << num1 << "-" << num2 << action2 << num3 << "=" << res - num1;
                break;
            default:
                cout << "Input not recognized";
                break;
            }
        }
        else //action1 will be performed before action2 (Order of operation)
        {
            switch (action1)
            {
            case('+'):
                res = num1 + num2;
                break;
            case('-'):
                res = num1 - num2;
                break;
            case('/'):
                if (num2 == 0)     //The problem I described at the top occurs here and at anothe place above
                    cout << "You can't divide by zero.";
                else
                    res = num1 / num2;
                break;
            case('*'):
                res = num1*num2;
                break;
            case('#'):
                system("PAUSE");
                return 0;
                break;
            default:
                cout << "Input not recognized";
                break;
            }
            switch (action2)
            {
            case('+'):
                cout << num1 << action1 << num2 << "+" << num3 << "=" << res + num3;
                break;
            case('-'):
                cout << num1 << action1 << num2 << "-" << num3 << "=" << res - num3;
                break;
            case('/'):
                if (num3 == 0)
                    cout << "You can't divide by zero.";
                else
                    res = num2 / num3;
                break;
            case('*'):
                res = num2*num3;
                break;
            case('#'):
                system("PAUSE");
                return 0;
                break;
            default:
                cout << "Input not recognized";
                break;
            }
        }
        cout << "\n\n";
    }
}

2 个答案:

答案 0 :(得分:1)

在输入之后(以及if之前)对零进行特殊检查,如果是,则继续循环。

类似

while (...)
{
    ...
    std::cin >> ...
    if (action1 == '/' && num2 == 0 || action2 == '/' && num3 == 0)
    {
        std::cout << "Division by zero\n";
        continue;
    }
    if (...)
    ...
}

答案 1 :(得分:0)

如您所知break只会让您脱离switch块,而不是循环。

如果您希望避免使用goto(我将会这样做),那么一个简单的补救措施是在单独的函数中编写while循环,并使用return if遇到零除条件以提前退出该函数。无论如何,将代码拆分成各种函数是件好事。

(我使用Boost Spirit - www.boost.org - 用于在生产系统中解析表达式。学习曲线非常陡峭,但非常值得。)