C++ 简单计算器(无 if、Switch、Case 及其种类)

C++ Simple Calculator (no if, Switch, Case, and its kind)

我尝试制作简单的计算器。有 3 个输入:

  1. 数字 1
  2. 2号
  3. 运营商

使用数字选择运算符:

1 = '+'
2 = '-'
3 = '*'
4 = '/'

示例:
Number1 = 1, number 2 = 1, operator = 1, 那么等式为 1 + 1 = 2.

我不知道如何使这个等式成为可能。任何帮助将不胜感激。谢谢!

*注意:不使用 arraystring,不使用 case,不使用 switch,不使用 if , while, for.

这是我的代码,但尚未完成,我需要更改运算符选择器。

#include <iostream>

using namespace std;

int main (){

    int a, b, c, hasil;

    cout << "Masukkan Bilangan 1 : ";
    cin >> a;
    cout << "Masukkan Bilangan 2 : ";
    cin >> b;
    cout << "Masukkan Operator ['(0 = +)' , '(1 = -)' , '(2 = *)', '(3 = /)' ] : ";
    cin >> c;

    hasil = a + (c * -2 + 1 )* b;
    cout << "Hasilnya = " << hasil;
}

您可以对不同的运算符使用不同的函数,然后通过使用 "c" 值作为 table 函数的索引来 select 它们。

#include <iostream>

using namespace std;

typedef int (*OperatorFunction)(int a, int b);

static int OperatorPlus(int a, int b)
{
    return a + b;
}

static int OperatorMinus(int a, int b)
{
    return a - b;
}

static int OperatorMultiply(int a, int b)
{
    return a * b;
}

static int OperatorDivide(int a, int b)
{
    return a / b;
}

OperatorFunction operators[] = { OperatorPlus, OperatorMinus, OperatorMultiply, OperatorDivide };

int main()
{

    int a, b, c, hasil;

    cout << "Masukkan Bilangan 1 : ";
    cin >> a;
    cout << "Masukkan Bilangan 2 : ";
    cin >> b;
    cout << "Masukkan Operator ['(0 = +)' , '(1 = -)' , '(2 = *)', '(3 = /)' ] : ";
    cin >> c;

    hasil = operators[c](a, b);

    cout << "Hasilnya = " << hasil << "\n";
}

对于这个赋值,我唯一能想到的就是在 C++ 中利用布尔类型和整数之间的隐式转换。要利用它,您可以这样做:

#include <iostream>

using namespace std;

int main (){

    int a, b, c, hasil;

    cout << "Masukkan Bilangan 1 : ";
    cin >> a;
    cout << "Masukkan Bilangan 2 : ";
    cin >> b;
    cout << "Masukkan Operator ['(0 = +)' , '(1 = -)' , '(2 = *)', '(3 = /)' ] : ";
    cin >> c;

    // if your input is a=10, b=5, c=0 :
    // a + b == 15
    // !c == 1
    // 15 * 1 == 15
    // a - b == 5
    // !(c - 1) == !(0 - 1) == 0
    // 5 * 0 == 0
    // and so on...

    hasil = ((a + b) * !c) + ((a - b) * !(c - 1)) + ((a * b) * !(c - 2)) + ((a / b) * !(c - 3));

    cout << "Hasilnya = " << hasil;
}

解释:

如果您的 c 输入是 0 而您正在执行 !c 它将 return 1 作为 int 的表示TRUE 但是对于彼此的值,例如。 3 它将 return 0 作为 FALSEint 表示。然后将其乘以每个可能运算符的计算值和 return 计算值或 0(因为 0 * 99 == 0)。

Try this online

你基本上必须同时计算所有四个(警告,“1+0”会崩溃,因为它会在计算过程中除以零,即使选择了“+”运算),并且过滤掉不需要的。

要过滤掉不需要的值,您需要将 c 转换为四个值集之一:

c==1: [1, 0, 0, 0]
c==2: [0, 1, 0, 0]
c==3: [0, 0, 1, 0]
c==4: [0, 0, 0, 1]

我们称这四个内部值为ci, i=1..4

c1 = ((c-2) * (c-3) * (c-4)) / -6;
c2 = ((c-1) * (c-3) * (c-4)) / 2;
c3 = ((c-1) * (c-2) * (c-4)) / -2;
c4 = ((c-1) * (c-2) * (c-3)) / 6;

然后:

结果=c1*(a+b)+c2*(a-b)+c3 * (a*b) + c4 * (a/b);


这是"pure math"解决方案,没有利用C++ bool隐式转换为0/1,这在生产代码中会更好,但我认为这有点"cheating"练习,这就是为什么我使用多项式以如此复杂的方式计算没有 bool 转换的 0/1 系数。


很少更新,从"pure math"转向更实用的东西。

  • 不需要的除以零的解决方案:您可以计算 (a/(b|(c4-1) 而不是 (a/b) ))(因为 c4 为 0 或 1)。只要 c4 为零,这将使除数等于 -1,因此它将中和 "division by zero" 等输入,如 "a = 1, b = 0, c = 1"(即“1 +0"),除以零可能只发生在操作 "division" 被选择并且 b == 0.

  • 如果您将 ci 值从 [0, 1] 翻转为 [0, -1](只需更改固定常量的符号最后归一化除法),一切都是 int,那么你可以用按位 AND 替换最终公式中的 ci 乘法,例如:result = (c1 & (a+b)) + (c2 & (a-b)) + (c3 & (a*b)) + (c4 & (a/b)); - 在现代 CPU 上会稍微快一些(在历史 CPU 上会快很多)。 {然后当然也必须翻转除以零修复=> b|(-1-c4)}

注意:呃,我的目标是 -1 用于除法修复,考虑让整个除法在大多数输入的无符号数学中变为 0,然后我发现这是有符号的 int 和整体这没什么意义,但我将 -1 作为目标值,而任何非零值都可以,即使是简单的 1。按位 AND 仅适用于负整数由二进制补码逻辑实现的平台,因此 -1 是完整的位掩码(因为您没有指定平台,这可能会在一些奇怪的平台上中断.. . 原来的乘法答案也适用于那些)。