按照之前写过的扫雷和三子棋的框架,我们首先写一个框架
int main()
{
int input = 0;
int x = 0;
int y = 0;
int ret = 0;
do
{
menu();//调用菜单函数
printf("请输入要进行的操作:>\n");
scanf("%d", &input);//输入选择功能
switch (input)
{
case 1://加法
printf("请输入两个操作数:>\n");
scanf("%d%d", &x, &y);
ret = add(x, y);
printf("结果是%d\n", ret);
break;
case 2:减法
printf("请输入两个操作数:>\n");
scanf("%d%d", &x, &y);
ret = sub(x, y);
printf("结果是%d\n", ret);
break;
case 3:乘法
printf("请输入两个操作数:>\n");
scanf("%d%d", &x, &y);
ret = mul(x, y);
printf("结果是%d\n", ret);
break;
case 4://除法
printf("请输入两个操作数:>\n");
scanf("%d%d", &x, &y);
ret = div(x, y);
printf("结果是%d\n", ret);
break;
case 0://退出
printf("退出计算器\n");
break;
default://输入错误
printf("输入错误,请重新输入\n");
}
} while (input);
return 0;
}
加减乘除的函数实现在此就不过多赘述。观察上面的代码我们可以看出用switch语句会造成代码冗余很多,而且后期如果要加入新的功能,就只能在case语句后面再加入,使代码量巨大,形成“屎山”,对后期维护极度不友好。所以我们可以对代码框架进行更改。
观察上面的函数可以发现,加减乘除函数的返回值、参数都是相同的,那么如果用函数指针表示,然后把函数指针存在一个数组中,通过输入的值(input)调用,会使整个代码框架优化很多。
更改为转移表的框架以后,整个代码中没有冗余的部分了,而且后期如果想要增加功能,只需要增加该功能函数,然后在函数指针数组中增加元素就可以实现。大大增加了程序的可维护性。
最后,附上整个项目代码
#include<stdio.h>
void menu()
{
printf("********************************\n");
printf("****** 1.add 2.sub ******\n");
printf("****** 3.mul 4.div ******\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 div(int x, int y)
{
return x / y;
}
int main()
{
int input = 0;
int x = 0;
int y = 0;
int ret = 0;
do
{
menu();//调用菜单函数
printf("请输入要进行的操作:>\n");
scanf("%d", &input);//输入选择功能
if (input > 0 && input <= 4)
{
printf("请输入两个操作数:>\n");
scanf("%d%d", &x, &y);
int (*pf[5])(int, int) = { 0,add,sub,mul,div };//定义函数指针数组
ret = pf[input](x, y);//通过input的值调用函数
printf("结果是%d\n", ret);
}
else if (input == 0)
{
printf("退出\n");
break;
}
else
{
printf("输入错误,请重新输入\n");
}
} while (input);
return 0;
}