1. 方法一:
Switch选择语句实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Mod(int x, int y)
{
return x * y;
}
int Del(int x, int y)
{
return x / y;
}
int Add(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
menu()
{
printf("*********************\n");
printf("******1.乘法运算*****\n");
printf("******2.除法运算*****\n");
printf("******3.加法运算*****\n");
printf("******4.减法运算*****\n");
printf("******5.退出程序*****\n");
printf("*********************\n");
}
enum Option
{
EXIT,
MOD,
DEL,
ADD,
SUB
};
int main()
{
int input;
int a, b;
int ret = 0;
do
{
menu();
printf("请选择:\n");
scanf("%d", &input);
printf("请输入两个整数:\n");
scanf("%d%d", &a,& b);
switch (input)
{
case MOD:
ret = Mod(a,b);
printf("%d\n", ret);
break;
case DEL:
ret = Del(a,b);
printf("%d\n", ret);
break;
case ADD:
ret = Add(a,b);
printf("%d\n", ret);
break;
case SUB:
ret = Sub(a,b);
printf("%d\n", ret);
break;
case EXIT:
printf("退出程序\n");
break;
default:
printf("输入出错,请重新输入\n");
break;
}
} while (input);
return 0;
}
结果:
2. 方法二:
函数指针数组实现:
通过方法一,我们发现代码非常冗余,出现了很多switch语句,不易阅读,那么怎么才能简化代码呢?
int main()
{
int input = 0;
do
{
menu();
int (*pArr[5])(int, int) = { NULL,Mod,Del,Add,Sub };函数指针数组,通过下表来访问数组中存放的函数的地址,进而访问函数;
int x = 0;
int y = 0;
int ret = 0;
printf("请选择:\n");
scanf("%d", &input);
if (input >= 1 && input <= 4)
{
printf("请输入两个数:\n");
scanf("%d%d", &x, &y);
ret = (pArr[input])(x, y);//此时,通过用户输入的选择,进而用函数指针数组来访问函数,之后把函数返回的值赋值给指针;
printf("结果为:%d\n", ret);
}
else if (input == 0)
{
printf("退出程序\n");
break;
}
else
{
printf("输入错误,请重新输入\n");
}
} while (input);
return 0;
}
结果:
- 方法一和方法二对比,方法二的代码是不是更简洁了,那还有更简洁的办法吗?
3. 方法三:
回调函数方法实现:
回调函数概念:
- 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个
函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数
的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进
行响应。
代码实现:
int calc(int (*pf)(int, int))
{
int x = 0;
int y = 0;
printf("请输入两个数:\n");
scanf("%d%d", &x, &y);
return pf(x, y);//此时通过这个函数指针去访问所需要访问的函数
}
int main()
{
int input;
int ret = 0;
do
{
menu();
printf("请选择:\n");
scanf("%d", &input);
switch (input)
{
case MOD:
ret = calc(Mod);
printf("%d\n", ret);
break;
case DEL:
ret = ret = calc(Del);;
printf("%d\n", ret);
break;
case ADD:
ret = ret = calc(Add);
printf("%d\n", ret);
break;
case SUB:
ret = ret = calc(Sub);
printf("%d\n", ret);
break;
case EXIT:
printf("退出程序\n");
break;
default:
printf("输入出错,请重新输入\n");
break;
}
} while (input);
return 0;
}
结果:
4. 最后
- 关于这三种方式,其实都是之前函数指针和数组的知识,这里只是重新复习一下;
- 回调函数使用时要求其调用的函数形参要一样;
- 最后,感谢大家的支持🤞,我们下次见!