1-用最简单的switch语句实现
最普遍也是最基础就是用switch开关语句实现,代码很简单,也很好像将switch放在一个死循环中然后在循环内输入input的值来调用不同四个函数。
这个代码写得很挫,而且很基础了所以还有下面用函数指针,以及指针数组来完成的简单操作。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Add(int num1, int num2)
{
return num1 + num2;
}
int Sub(int num1, int num2)
{
return num1 - num2;
}
int Mul(int num1, int num2)
{
return num1*num2;
}
int Div(int num1, int num2)
{
return num1 / num2;
}
enum OP //不给赋值的之后,枚举自动从0开始加
{
EXIT, //0
Add, //1
Sub, //2
Mul, //3
Div //4
};
void Menu()//菜单列表
{
printf(" ***1 ADD *** \n");
printf(" ***2 Sub *** \n");
printf(" ***3 Mul *** \n");
printf(" ***4 Div *** \n");
printf(" ***0 exit*** \n");
}
int main()
{
int num1 = 0;
int num2 = 0;
int input = 1;
while (input)
{
Menu();
printf("请选择");
scanf("%d", &input);
switch (input)
{
case Add:
{
printf("请给两个操作数:");
scanf("%d%d", &num1, &num2);
printf("%d\n", Add(num1, num2));
break;
}
case Sub:
{
printf("请给两个操作数:");
scanf("%d%d", &num1, &num2);
printf("%d\n", Sub(num1, num2));
break;
}
case Mul:
{
printf("请给两个操作数:");
scanf("%d%d", &num1, &num2);
printf("%d\n", Mul(num1, num2));
break;
}
case Div:
{
printf("请给两个操作数:");
scanf("%d%d", &num1, &num2);
printf("%d\n", Div(num1, num2));
break;
}
case Exit:
break;
default:
printf("选择不规范\n");
}
}
system("pause");
return 0;
}
上面的用switch实现,你会发现代码里每个case语句了都得有一行输入操作数的代码,让代码看起来很繁琐,怎么用点稍微高端点的东西呢
2-用指针数组以及函数指针。
我们不用开关语句怎么有相同的效果呢,我们知道指针数组可以存放多个指针地址,那我们可不可以把每个函数的地址都存放在一个指针数组里呢?当我们输入一个选择数,我们就访问相对应函数的地址,从而访问函数。同时要访问函数的地址我们是不是还需要一个可以存放函数地址的指针,也就是函数指针。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Add(int num1, int num2)
{
return num1 + num2;
}
int Sub(int num1, int num2)
{
return num1 - num2;
}
int Mul(int num1, int num2)
{
return num1*num2;
}
int Div(int num1, int num2)
{
return num1 / num2;
}
void Menu()//菜单
{
printf(" ***1 ADD *** \n");
printf(" ***2 Sub *** \n");
printf(" ***3 Mul *** \n");
printf(" ***4 Div *** \n");
printf(" ***0 exit*** \n");
}
int main()
{
int num1 = 0;
int num2 = 0;
int input = 1;
int ret = 0;
//我们知道函数名存放的便是函数的地址,并且这里&Add,其实区别并不大
int(*pfunarr[5])(int, int) = { 0, Add, Sub, Mul, Div };
//这里首先是一个指向函数的函数指针,然后再把这些函数指针存放在指针数组里
//因为我们输入0不需要进行操作,所以让pfunarr[0]为0
while (input)
{
Menu();
printf("请选择:");
scanf("%d", &input);
if (input >= 1 && input <= 4)
{
printf("请输入操作数:");
scanf("%d%d", &num1, &num2);
ret=pfunarr[input](num1,num2);
printf("%d\n", ret);
}
else if (input==0)
{
break;
}
else
{
printf("输入有误!");
}
}
system("pause");
return 0;
}
我们发现程序确实比上面的switch实现好了很多并且也很高效,但我们还觉得不尽人意, 看过上面的指针数组处理方法,我们发现main函数中感觉还是很凌乱,在main函数中创建了一大堆变量,所以我们先里面可以分装成一个函数,而且还是感觉不是很高大上,那我们试点别的?
三-对代码进行优化-回调函数
我们可以分装一个函数,然后把操作都在函数中进行,这里主要注意的是我们已经将函数放到一个指针数组中,并且这些指针都指向函数,而我们要在这个函数中进行一系列加减乘除操作就必须把指着数组传参进去,所以我们要合理设计参数。所以就得给函数传进去一个函数指针类型。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Add(int num1, int num2)
{
return num1 + num2;
}
int Sub(int num1, int num2)
{
return num1 - num2;
}
int Mul(int num1, int num2)
{
return num1*num2;
}
int Div(int num1, int num2)
{
return num1 / num2;
}
void Menu()//菜单
{
printf(" ***1 ADD *** \n");
printf(" ***2 Sub *** \n");
printf(" ***3 Mul *** \n");
printf(" ***4 Div *** \n");
printf(" ***0 exit*** \n");
}
void option(int (*op)(int , int))//这里就需要传进去一个函数指针类型的参数
{
int num1 = 0;
int num2 = 0;
int ret = 0;
printf("请输入两个操作数:>");
scanf("%d%d", &num1, &num2);
ret = op(num1, num2);
printf("%d\n", ret);
}
int main()
{
int input = 1;
int(*pfunarr[5])(int, int) = { 0, &Add, &Sub, &Mul, &Div };
while (input)
{
Menu();
printf("请选择:");
scanf("%d", &input);
if (input >= 1 && input <= 4)
{
option(pfunarr[input]);
}
else if (input==0)
{
break;
}
else
{
printf("输入有误!");
}
}
system("pause");
return 0;
}
一步一步的从最简单的switch语句到函数指针,进行大幅度优化,所有代码都是可以这样的,用所学到的知识,从多方面完成代码,并且优化它。这样才是好的。