C++ 简单计算器(无 if、Switch、Case 及其种类)
C++ Simple Calculator (no if, Switch, Case, and its kind)
我尝试制作简单的计算器。有 3 个输入:
- 数字 1
- 2号
- 运营商
使用数字选择运算符:
1 = '+'
2 = '-'
3 = '*'
4 = '/'
示例:
Number1 = 1, number 2 = 1, operator = 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" 值作为 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
作为 FALSE
的 int
表示。然后将其乘以每个可能运算符的计算值和 return 计算值或 0
(因为 0 * 99 == 0
)。
你基本上必须同时计算所有四个(警告,“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
是完整的位掩码(因为您没有指定平台,这可能会在一些奇怪的平台上中断.. . 原来的乘法答案也适用于那些)。
我尝试制作简单的计算器。有 3 个输入:
- 数字 1
- 2号
- 运营商
使用数字选择运算符:
1 = '+'
2 = '-'
3 = '*'
4 = '/'
示例:
Number1 = 1, number 2 = 1, operator = 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" 值作为 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
作为 FALSE
的 int
表示。然后将其乘以每个可能运算符的计算值和 return 计算值或 0
(因为 0 * 99 == 0
)。
你基本上必须同时计算所有四个(警告,“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
是完整的位掩码(因为您没有指定平台,这可能会在一些奇怪的平台上中断.. . 原来的乘法答案也适用于那些)。