C++简单的计算器(没有如果,开关,案例及其种类)

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

本文关键字:案例 种类 开关 C++ 计算器 没有如果 简单      更新时间:2023-10-16

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

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

使用数字选择运算符:


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

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

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

*注意:不使用arraystring,不使用case,不使用switch,不使用ifwhilefor

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

#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"值作为函数表的索引来选择它们。

#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+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;c 2 = ((
c-1) * (c-3) * (c-4))/2;c
3= ((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++bool隐式转换为 0/1,这在生产代码中会更好,但我认为在这个练习中有点"作弊",这就是为什么我使用多项式以如此复杂的方式计算没有bool转换的 0/1 系数。


很少更新,以避开"纯数学"转向更实用的东西。

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

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

注意:呃,我的目标是 -1 进行除法修复,考虑让大多数输入在无符号数学中将整个除法变为 0,然后我发现这是有符号的int,总的来说这没什么意义,但我保留-1作为目标值,而任何非零都可以,即使是简单的1。而且按位AND仅适用于负整数由 two 的补码逻辑实现的平台,因此-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作为TRUEint表示形式,但随后对于每个值,例如 3,它将返回0作为FALSEint表示形式。然后乘以每个可能的运算符的计算值,返回计算值或0(因为0 * 99 == 0)。

在线试用