实现一个计算器的功能:
一般的形式:
#include<stdio.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;
}
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 ret = 0;
int x, y;
int input = 0;
do
{
menu();
printf("请输入你的选择:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("请输入两个数字:");
scanf("%d %d", &x, &y);
ret = Add(x, y);
printf("%d\n", ret);
break;
case 2:
printf("请输入两个数字:");
scanf("%d %d", &x, &y);
ret = Sub(x, y);
printf("%d\n", ret);
break;
case 3:
printf("请输入两个数字:");
scanf("%d %d", &x, &y);
ret = Mul(x, y);
printf("%d\n", ret);
break;
case 4:
printf("请输入两个数字:");
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);
return 0;
}
这种一般的形式,比较冗余,有很多重复的代码,所以我们考虑到了函数指针数组的形式。
函数指针数组的形式
//利用函数指针数组的形式完成计算器
#include<stdio.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;
}
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 ret = 0;
int x, y;
int input = 0;
int (*pf[5])(int, int) = { 0,Add,Sub,Mul,Div };
do {
menu();
printf("请输入你的选择:");
scanf("%d", &input);
if (input >= 1 && input <= 4)
{
printf("请输入两个整数:");
scanf("%d %d", &x, &y);
ret=pf[input](x,y);
printf("%d\n", ret);
}
else if (input == 0)
{
printf("退出!\n");
}
else
{
printf("请重新输入一个值\n");
}
} while (input);
}
除了函数指针数组可以减少冗余,还有一种回调函数,也可以减少冗余度。
回调函数的形式
//利用函数回调的方法
#include<stdio.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;
}
void menu()
{
printf("************************\n");
printf("*** 1.Add 2.Sub ***\n");
printf("*** 3.Mul 4.Div ***\n");
printf("*** 0.exit ***\n");
printf("************************\n");
}
void cals(int(*pf)(int, int))
{
int ret = 0;
int x, y;
printf("请输入两个数字:");
scanf("%d %d", &x, &y);
ret = pf(x, y);
printf("%d\n", ret);
}
int main()
{
int ret = 0;
int x, y;
int input = 0;
int (*pf[5])(int, int) = { 0,Add,Sub,Mul,Div };
do {
menu();
printf("请输入你的选择:");
scanf("%d", &input);
switch (input)
{
case 1:
cals(Add);
break;
case 2:
cals(Sub);
break;
case 3:
cals(Mul);
break;
case 4:
cals(Div);
break;
case 0:
printf("退出!\n");
break;
default:
printf("请输入合适的数字!\n");
break;
}
} while (input);
}
输出结果: