//我们先简单看看以下这串简易计算器的代码
#define _CRT_SECURE_NO_WARNINGS
#include
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;
}
void menu()
{
printf("********************\n");
printf("****1.add 2.sub****\n");
printf("****3.mul 4.div****\n");
printf("****0.exist ****\n");
printf("********************\n");
printf("请输入:>");
}
int main()
{
int n,a,b,ret;
do
{
menu();
scanf("%d", &n);
switch (n)
{
case 1:
printf("请输入两个操作数:>");
scanf("%d%d",&a,&b);
ret = Add(a, b);
printf("%d\n", ret);
break;
case 2:
printf("请输入两个操作数:>");
scanf("%d%d", &a, &b);
ret = Sub(a, b);
printf("%d\n", ret);
break;
case 3:
printf("请输入两个操作数:>");
scanf("%d%d", &a, &b);
ret = Mul(a, b);
printf("%d\n", ret);
break;
case 4:
printf("请输入两个操作数:>");
scanf("%d%d", &a, &b);
ret = Div(a, b);
printf("%d\n", ret);
break;
case 0:
printf("退出计算机\n");
break;
default:
printf("输入错误\n");
}
} while (n);
return 0;
}
//上面的程序使用了switch语句,我们再简单的看一下,我们使用函数指针数组优化后
//的代码
#define _CRT_SECURE_NO_WARNINGS
#include
void menu()
{
printf("***********************************\n");
printf("*** 1.add 2.sub ***\n");
printf("*** 3.mul 4.div ***\n");
printf("*** 0.exist ***\n");
printf("***********************************\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 div(int x, int y)
{
return x / y;
}
int main()
{
int a, b, n, ret;
int(*calc[5])(int, int) = { NULL,add,sub,mul,div };
do
{
menu();
printf("请输入:>");
scanf("%d", &n);
if (n == 0)
{
printf("推出计算器\n");
break;
}
else if (n >= 1 && n <= 4)
{
printf("请输入两个操作数:>");
scanf("%d%d", &a, &b);
ret = calc[n](a, b);
printf("%d\n", ret);
}
else
printf("输入错误\n");
} while (n);
return 0;
}
//这两个程序这样看,没有明显的差距,但当功能的数量不断增加时,switch语句的
//劣势就凸显出来了,代码十分冗长,而第二个只需修改部分地方。所以,我们的函数
//指针数组可不是摆设噢。
//在第二个程序中,函数指针数组起到了一个跳板的作用,我通过数组下标找到对应的
//函数指针,再通过函数指针去调用函数。所以,我们也把函数指针数组称为转移表