C++ C++;简单计算器(无if、开关、Case及其类型)

C++ C++;简单计算器(无if、开关、Case及其类型),c++,calculator,C++,Calculator,我试着做一个简单的计算器。有3个输入: 第一 二号 操作员 使用编号选择操作员: 1='+' 2='-' 3='*' 4='/' 示例: 数字1=1,数字2=1,运算符=1,则方程为1+1=2 我不知道如何使这个等式成为可能。任何帮助都将不胜感激。谢谢 *注意:不使用数组或字符串,不使用大小写,不使用开关,不使用if,while,for 这是我的代码,但尚未完成,我需要更改运算符选择器 #include <iostream> using namespace std; int ma

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

  • 第一
  • 二号
  • 操作员
  • 使用编号选择操作员:

    1='+'

    2='-'

    3='*'

    4='/'

    示例:
    数字1=1,数字2=1,运算符=1,则方程为1+1=2

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

    *注意:不使用
    数组
    字符串
    ,不使用
    大小写
    ,不使用
    开关
    ,不使用
    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;
    }
    
    #包括
    使用名称空间std;
    int main(){
    INTA、b、c、hasil;
    cout>a;
    cout>b;
    cout>c;
    hasil=a+(c*-2+1)*b;
    
    cout您可以对不同的运算符使用不同的函数,然后使用“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";
    }
    
    #包括
    使用名称空间std;
    类型定义int(*运算符函数)(int a、int b);
    静态整数运算符Plus(整数a、整数b)
    {
    返回a+b;
    }
    静态整数运算符最小值(整数a、整数b)
    {
    返回a-b;
    }
    静态整数运算符乘法(整数a、整数b)
    {
    返回a*b;
    }
    静态整型运算符vide(整型a、整型b)
    {
    返回a/b;
    }
    运算符函数运算符[]={OperatorPlus,OperatorMinus,OperatorMultiply,operatorVide};
    int main()
    {
    INTA、b、c、hasil;
    cout>a;
    cout>b;
    cout>c;
    hasil=运算符[c](a,b);
    
    cout您可以对不同的运算符使用不同的函数,然后使用“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";
    }
    
    #包括
    使用名称空间std;
    类型定义int(*运算符函数)(int a、int b);
    静态整数运算符Plus(整数a、整数b)
    {
    返回a+b;
    }
    静态整数运算符最小值(整数a、整数b)
    {
    返回a-b;
    }
    静态整数运算符乘法(整数a、整数b)
    {
    返回a*b;
    }
    静态整型运算符vide(整型a、整型b)
    {
    返回a/b;
    }
    运算符函数运算符[]={OperatorPlus,OperatorMinus,OperatorMultiply,operatorVide};
    int main()
    {
    INTA、b、c、hasil;
    cout>a;
    cout>b;
    cout>c;
    hasil=运算符[c](a,b);
    
    在这个任务中,我唯一能想到的就是在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;
    }
    
    #包括
    使用名称空间std;
    int main(){
    INTA、b、c、hasil;
    cout>a;
    cout>b;
    cout>c;
    //如果您的输入为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
    //等等。。。
    哈西尔=((a+b)*!c)+((a-b)*!(c-1))+((a*b)*!(c-2))+((a/b)*!(c-3));
    
    在这个任务中,我唯一能想到的就是在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;
    }
    
    #包括
    使用名称空间std;
    int main(){
    INTA、b、c、hasil;
    cout>a;
    cout>b;
    cout>c;
    //如果您的输入为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
    //等等。。。
    哈西尔=((a+b)*!c)+((a-b)*!(c-1))+((a*b)*!(c-2))+((a/b)*!(c-3));
    
    cout您基本上必须同时计算所有四个变量(警告,“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)


    这是“纯数学”的解决方案,不使用C++ <代码>布尔O/COD>隐式转换为0/1,这在生产代码中会更好,但我认为这是一个“欺骗”在这个练习中,这就是为什么我用多项式来计算0/1个系数而没有<代码>布尔O/CART>这样复杂的转换。


    更新很少,从“纯数学”转向更实用的东西

    • 不需要的零除法解决方案:您可以计算(a/(b |(c4-1))(c4为0或1)。这将使除数等于
      -1
      ,每当c4为零时,它将中和“a=1,b=0,c=1”(即“1+0”)等输入的“零除法”,并且只有在操作时才可能发生零除法选择“除法”且b==0

    • 如果您将ci值从[0,1]翻转到[0,-1](只需在最终规格化除法处更改固定常数的符号),并且所有内容都是
      int
      ,那么您可以用按位
      替换最终公式中的ci乘法,如:result=(c1&(a+b))+(c2&(a-b))+(c3&(a*b))+(c4&(a/b))-这在现代CPU上会稍微快一点(在历史CPU上也会快很多)。{然后当然也必须翻转零除修复=>b |(-1-c4)}

    注:呃,我的除法修正目标是-1,考虑在大多数输入的无符号数学中使整个除法变为0,然后我发现这是有符号的
    int
    ,总的来说没有什么意义,但我保留了
    -1
    作为目标值,而任何非零的值都可以工作,即使是简单的
    1
    仅在负整数由2的补码逻辑实现的平台上工作,因此
    -1