目录
1.实现目标
2.实现方法
1.回调函数法
2.函数指针数组法
我们要实现一个简易计算器,提供可选择功能包括加,减,乘,除,取模和异或。
首先我们需要打印一个计算器菜单供使用者选择计算类型,我们可以自定义简单的菜单函数menu,再利用do while循环加switch语句完成用户选则功能,具体实现方法可以看我的另一篇博客:猜数字游戏。如果是在每一个case里进行打印提示和,输入数字和函数调用会显得非常繁冗,并且不利于新运算类型的添加,我们可以将其改进:将以上数条语句包装,利用一个函数Calc来实现我们将不同的运算函数的地址传入Calc函数,利用函数指针接收,在内部进行调用。程序形式便得到简化。
void menu()
{
printf("***************************\n");
printf("***** 1.加法 2.减法 *****\n");
printf("***** 3.乘法 4.除法 *****\n");
printf("***** 5.取模 6.异或 *****\n");
printf("***** 0.exit *****\n");
printf("***************************\n");
}
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int Mul(int x, int y)
{
return x*y;
}
int Dvi(int x, int y)
{
return x / y;
}
int Mol(int x, int y)
{
return x%y;
}
int Xor(int x, int y)
{
return x^y;
}
void Calc(int(*p)(int, int))
{
int a, b;
printf("请输入运算数");
scanf("%d%d", &a, &b);
printf("%d\n", (*p)(a, b));
}
int main()
{
int input;
do
{
menu();
printf("请选择运算\n");
scanf("%d", &input);
switch (input)
{
case 1:
Calc(Add);
break;
case 2:
Calc(Sub);
break;
case 3:
Calc(Mul);
break;
case 4:
Calc(Dvi);
break;
case 5:
Calc(Mol);
break;
case 6:
Calc(Xor);
break;
case 0:
printf("退出成功\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
我们还有一种方法可以更加方便地解决上述问题:将几个基本运算函数用数组的形式存储和调用,这便用到了函数指针数组,这样做还有一个好处:switch语句也不需要了。
void menu()
{
printf("****************************\n");
printf("***** 1.加法 2.减法 ******\n");
printf("***** 3.乘法 4.除法 ******\n");
printf("***** 5.取模 6.异或 ******\n");
printf("***** 0.exit ******\n");
printf("****************************\n");
}
int Add(int x, int y)
{
return x+y;
}
int Sub(int x, int y)
{
return x-y;
}
int Mul(int x, int y)
{
return x*y;
}
int Dvi(int x, int y)
{
return x/y;
}
int Mol(int x, int y)
{
return x%y;
}
int Xor(int x, int y)
{
return x^y;
}
int main()
{
int input,a,b;
do
{
menu();
printf("请选择计算类型>:");
scanf("%d", &input);
if (0:");
scanf("%d%d", &a, &b);
int(*Fun[])(int, int) = { 0, Add, Sub, Mul, Dvi, Mol, Xor };
printf("%d\n", Fun[input](a, b));
}
else if (input==0)
{
printf("计算器关闭\n");
}
else
{
printf("输入错误\n");
break;
}
} while (input);
return 0;
}