在上一篇博客中写到过函数指针数组,它是一个数组,里面存放着函数指针。函数指针有一个作用就是作为函数转移表。
今天,利用它的这个特性来编写一个简单的计算器:
先写一个一个常规写法的计算器来看看:
常规写法一般先打印一个有选择项的目录,利用switch case语句分别调用需要的+,-,*,/ 函数。最后输出结果,但是这样做会使用多个 case 语句,是代码看起来有些繁琐。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
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 Div(int x, int y)
{
return x / y;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
while (input)
{
printf("-------------------------\n");
printf("| 1.+ 2.- |\n");
printf("| 3.* 4./ |\n");
printf("| 0.退出程序 |\n");
printf("-------------------------\n");
printf("请选择操作:");
scanf("%d", &input);
if (input == 0)
return ;
else if (input>=0&&input<=4)
{
printf("请输入操作数:");
scanf("%d %d", &x, &y);
switch (input)
{
case 1:
ret = Add(x, y);
break;
case 2:
ret = Sub(x, y);
break;
case 3:
ret = Mul(x, y);
break;
case 4:
ret = Div(x, y);
break;
}
printf("ret=%d\n", ret);
}
else
printf("输入错误,请重新输入!");
}
system("pause");
return 0;
}
再利用函数指针数组将其改进一下:
先创建一个函数指针数组,分别存放 +,-,*,/ 对应的函数指针,以输入的input作为它的下标,在后面需要调用函数时只需要通过数组下标访问相应函数即可,这样做可以简化代码。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
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 Div(int x, int y)
{
return x / y;
}
int main()
{
int x, y;
int input = 1;
int ret = 0;
int(*p[5])(int x, int y) = { 0, Add, Sub, Mul, Div }; //转移表
while (input)
{
printf("-------------------------\n");
printf("| 1.+ 2.- |\n");
printf("| 3.* 4./ |\n");
printf("| 0.退出程序 |\n");
printf("-------------------------\n");
printf("请选择操作:");
scanf("%d", &input);
if (input == 0)
return;
else if (input >= 1 && input <= 4)
{
printf("请输入操作数:");
scanf("%d %d",&x,&y);
ret = (*p[input])(x, y);
printf("ret=%d\n", ret);
}
else
{
printf("输入错误,请重新输入。");
}
}
system("pause");
return 0;
}
试运行一下:
很OK!
来对比一下常规写法和函数转移表写法的不同:
很显然,利用函数指针数组的函数转移表的代码比常规写法简便很多,也不容易出错,这就是函数指针数组的妙用了!