我试着制作简单的计算器。有3个输入:
使用数字
选择运算符 1 = '+'
2 = '-'
3 = '*'
4 = '/'
示例:
Number1 = 1,数字2 = 1,operator = 1,则等式为1 + 1 = 2.
我不知道如何使这个等式成为可能。任何帮助将不胜感激。谢谢!
* 注意:未使用array
或string
,未使用case
,未使用switch
,未使用if
,{{1 },while
。
这是我的代码,但它还没有完成,我需要更改操作符选择器。
for
答案 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
)。
答案 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
是完全位掩码(因为您没有指定平台,这可能会破坏一些奇怪的... 。乘法的原始答案甚至可以用于那些)。