C++简单的计算器(没有如果,开关,案例及其种类)
C++ Simple Calculator (no if, Switch, Case, and its kind)
我试图制作简单的计算器。有 3 个输入:
- 数字 1
- 数字 2
- 运营商
使用数字选择运算符:
1 = '+'
2 = '-'
3 = '*'
4 = '/'
示例:数字 1 = 1,数字 2 = 1,运算符 = 1,则方程为 1 + 1 = 2。
我不知道如何使这个等式成为可能。任何帮助将不胜感激。谢谢!
*注意:不使用array
或string
,不使用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"值作为函数表的索引来选择它们。
#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
作为TRUE
的int
表示形式,但随后对于每个值,例如 3,它将返回0
作为FALSE
的int
表示形式。然后乘以每个可能的运算符的计算值,返回计算值或0
(因为0 * 99 == 0
)。
在线试用
- C 和 C++ 中开关语句的案例标签的常量值,但显示不同的行为
- 为什么这个案例陈述需要一个"if else"而不仅仅是一个"if"?
- 任何种类的分数 在任何类型的订单中
- C++ switch 语句:对案例进行分组,并针对每个案例给出特定的说明
- 任意大小的 constexpr 数组是否可以用作 switch 语句中的案例?
- Python & C-C++ 扩展模块案例段故障
- 与 SDL2(以及类似案例)一起构建SDL2_image
- 自定义分配器,包括放置新案例
- 案例内部的功能
- 正在读取开关案例中的.txt文件
- 弄清楚这段代码是怎么回事(递归下降案例研究)
- C++实用程序,用于将长开关语句转换为封装开关案例阶梯的简洁函数调用
- 在任何案例之前,在 switch 语句中的使用声明是否合法?
- 案例标签值已出现错误
- 案例语句不会前进到下一个语句
- C++的研究案例.抽象类和实例
- 对两个案例标签使用相同的值与对单个案例使用多个案例标签有什么区别?
- QR码生成算法数据掩盖实现案例分析
- C .如何通过在交换机案例中再次询问用户名来找到密码
- C++简单的计算器(没有如果,开关,案例及其种类)