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

时间:2017-09-07 13:51:17

标签: c++ calculator

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

  1. 1号
  2. 2号
  3. 运营商
  4. 使用数字

    选择运算符

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

    示例:
    Number1 = 1,数字2 = 1,operator = 1,则等式为1 + 1 = 2.

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

    * 注意:未使用arraystring,未使用case,未使用switch,未使用if,{{1 },while

    这是我的代码,但它还没有完成,我需要更改操作符选择器。

    for

3 个答案:

答案 0 :(得分:3)

您可以为不同的运算符使用不同的函数,然后使用“c”值作为函数表的索引来选择它们。

#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";
}

答案 1 :(得分:1)

我唯一可以想到的就是在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,则会1作为int代表TRUE,但是然后为彼此的价值,例如。 3它将0作为int的{​​{1}}表示返回FALSE。然后将其乘以每个可能运算符的计算值,并返回计算值或0(因为0 * 99 == 0)。

Try this online

答案 2 :(得分:1)

你基本上必须同时计算所有四个(警告,“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]

让我们称之为内部四个值c i ,i = 1..4

c 1 =((c-2)*(c-3)*(c-4))/ -6;
c 2 =((c-1)*(c-3)*(c-4))/ 2;
c 3 =((c-1)*(c-2)*(c-4))/ -2;
c 4 =((c-1)*(c-2)*(c-3))/ 6;

然后:

result = c 1 *(a + b)+ c 2 *(ab)+ c 3 *(a * b) + c 4 *(a / b);

这是“纯数学”解决方案,没有利用C ++ bool隐式转换为0/1,这在生产代码中更好,但我认为这在练习中有点“作弊”,这就是为什么我通过使用多项式,以这种复杂的方式计算没有bool转换的0/1系数。

很少有更新,以避免“纯数学”转向更实用的东西。

  • 不需要的除零解决方案:代替(a / b)你可以计算(a /(b |(c 4 -1)))(对于c 4 为0或1)。只要c 4 为零,这将使除数等于-1,因此对于诸如“a = 1,b = 0,c = 1”之类的输入,它将中和“除以零” “(即”1 + 0“),除非选择操作”除法“且b == 0,否则可能会发生除零。

  • 如果你将c i 值从[0,1]翻转到[0,-1](只是改变最终正规化除法中固定常数的符号),以及一切是int,那么您可以将最终公式中的c i 乘法替换为按位AND,如:result =(c 1 &amp;(a + b))+(c 2 &amp;(ab))+(c 3 &amp;(a * b))+(c 4 &amp;(a / b)); - 现代CPU上的速度会略微提高(在历史CPU上速度要快得多)。 {当然,零修复除法也必须翻转=&gt; C |(-1-C <子> 4 )}

注意:呃,我的目标是-1用于分区修复,考虑在大多数输入中使整数除法在无符号数学中变为0,然后我发现这是签名的int并且总体而言没什么意义,但我保持-1为目标值,而任何非零都可以,甚至简单1。并且按位AND仅适用于负整数由二进制补码逻辑实现的平台,因此-1是完全位掩码(因为您没有指定平台,这可能会破坏一些奇怪的... 。乘法的原始答案甚至可以用于那些)。