计算器的要求:
1.能够对整数进行加减乘除运算
2.能够重复运算
3.能够显示错误
实现1:
//
//写一个计算器
//整数的加、减、乘、除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.exit ****\n");printf("***************************\n");
}int main()
{int input = 0;int x = 0;int y = 0;int ret = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:printf("请输入2个操作数:>");scanf("%d %d", &x, &y);ret = Add(x, y);printf("%d\n", ret);break;case 2: printf("请输入2个操作数:>");scanf("%d %d", &x, &y);ret = Sub(x, y);printf("%d\n", ret);break;case 3:printf("请输入2个操作数:>");scanf("%d %d", &x, &y);ret = Mul(x, y);printf("%d\n", ret);break;case 4:printf("请输入2个操作数:>");scanf("%d %d", &x, &y);ret = Div(x, y);printf("%d\n", ret);break;case 0:printf("退出计算器\n");break;default:printf("选择错误\n");break;}} while (input);
}//代码冗余

上述代码存在问题
1.有冗余
2.假如,我日后想要实现更复杂的计算功能,岂不是要一直加case语句,假如我要增加30种功能,难不成我要加上30个case语句吗?显然不现实,因此,此代码的可维护性不强。
继续优化:
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.exit ****\n");printf("***************************\n");
}int main()
{int input = 0;int x = 0;int y = 0;int ret = 0;//函数指针数组 - 转移表int (*pfArr[])(int, int) = { 0, Add, Sub, Mul, Div };do{menu();printf("请选择:>");scanf("%d", &input);if (input == 0){printf("退出计算器\n");break;}if (input >= 1 && input <= 4){printf("请输入2个操作数:>");scanf("%d %d", &x, &y);ret = pfArr[input](x, y);printf("%d\n", ret);}else{printf("选择错误\n");} } while (input);
}
在这里引述函数指针数组(转移表)的概念
使得代码量大大减少,并且能够方便日后维护
需要增加功能就直接在函数指针数组里面加就好了












![[已授权] 互联网定位技术小谈](http://xianzhi.aliyun.com/forum/attachment/Mon_1703/14_1150978582736040_635685898d3bfc6.jpg)



