我们用c语言简单实现两个数的加减乘除,可采用下面的代码方式:
~~~c
#include <stdio.h>
#include <stdlib.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;
do
{
menu();
printf("请输入您的选择:\n");
scanf("%d", &input);
switch (input)
{
case 1:
printf("请输入两个可操作数\n");
scanf("%d%d", &x, &y);
printf("%d\n", Add(x, y));
break;
case 2:
printf("请输入两个可操作数\n");
scanf("%d%d", &x, &y);
Sub(x,y);
printf("%d\n", Sub(x, y));
break;
case 3:
printf("请输入两个可操作数\n");
scanf("%d%d", &x, &y);
Mul(x, y);
printf("%d\n", Mul(x, y));
break;
case 4:
printf("请输入两个可操作数\n");
scanf("%d%d", &x, &y);
Div(x, y);
printf("%d\n", Div(x, y));
break;
case 0:
printf("退出程序\n");
break;
default:
break;
}
}while(input);
system("pause");
return 0;
}
~~~
这种方式虽可实现简单的加减乘除,但在case语句中有很多重复内容显得代码整体很冗杂,所以我们将使用函数回调的方式优化这一缺陷
我们封装一个函数,把case语句中将这些内容统一调用
~~~c
void Calc(int(*p)(int, int))
{
int x = 0;
int y = 0;
printf("请输入两个可操作数\n");
scanf("%d%d", &x, &y);
printf("%d\n", p(x, y)); //若用*p,一定要加上(),本例(*p)
}
~~~
优化后的代码为:
~~~c
#include <stdio.h>
#include <stdlib.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;
}
void Calc(int(*p)(int, int)) //采用函数指针接受函数的地址
{
int x = 0;
int y = 0;
printf("请输入两个可操作数\n");
scanf("%d%d", &x, &y);
printf("%d\n", p(x, y)); //若用*p,一定要加上(),本例(*p)
}
int main()
{
int input = 0;
int x = 0;
int y = 0;
do
{
menu();
printf("请输入您的选择:\n");
scanf("%d", &input);
switch (input)
{
case 1:
Calc(Add);
break;
case 2:
Calc(Sub);
break;
case 3:
Calc(Mul);
break;
case 4:
Calc(Div);
break;
case 0:
printf("退出程序\n");
break;
default:
break;
}
}while(input);
system("pause");
return 0;
}
~~~
接下来我们再采用函数指针数组的形式实现这一功能代码如下
~~~c
#include <stdio.h>
#include <stdlib.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;
do
{
menu();
printf("请输入您的选择:\n");
scanf("%d", &input);
int(*parr[5])(int, int) = { 0, Add, Sub, Mul, Div }; //函数指针数组
if (1 <= input && input <= 5)
{
printf("请输入两个可操作数\n");
scanf("%d%d", &x, &y);
int ret = parr[input](x,y); //选择数组元素并对其进行传参
printf("%d\n", ret);
}
else if (input==0)
{
printf("退出程序\n");
break;
}
else
{
printf("输入有误\n");
}
}while(input);
system("pause");
return 0;
}
~~~
函数指针数组比较方便添加计算器的新算法,比如添加按位^操作
int A(int x, int y)
{
return x^y;
}
int(*parr[6])(int, int) = { 0, Add, Sub, Mul, Div, A };
if (1 <= input && input <= 6)
只需将这三个地方修改就可添加新的计算功能!!!