实现一个计算器的功能:
一般的形式:
#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);
}
输出结果: