一、代码
cs
#include <stdio.h>
void menu() {
printf("************************\n");
printf("***** 1.add 2.sub *****\n");
printf("***** 3.mul 4.div *****\n");
printf("***** 0.exit *****\n");
}
int add(int a, int b) {
return a + b;
}
int sub(int a, int b) {
return a - b;
}
int mul(int a, int b) {
return a * b;
}
int div(int a, int b) {
return a / b;
}
void calc(int (*pf)(int ,int)) {
int x = 0;
int y = 0;
int ret = 0;
printf("请输入两个操作数:>\n");
scanf_s("%d %d", &x, &y);
ret = pf(x, y);
printf("%d\n", ret);
}
int main() {
int input = 0;
do {
menu();
printf("请选择;>\n");
scanf_s("%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:
printf("选择错误\n");
break;
}
} while (input);
//int(*pf)(int, int);//pf是函数指针
//int (*arr[4])(int,int) = {add,sub,mul,div};//arr就是函数指针的数组
//for (int i = 0; i < 4; i++) {
// int ret=arr[i](8, 4);
// printf("%d\n", ret);
//}
/*
函数指针数组
int (*pfArr[])(int ,int) = {0,add,sub,mul,div};
指向[函数指针数组]的指针
int (*(*ppdArr)[5])(int ,int) = &pfArr;
*/
return 0;
}
二、分析
1. 菜单函数(menu)
cs
void menu() {
printf("************************\n");
printf("***** 1.add 2.sub *****\n");
printf("***** 3.mul 4.div *****\n");
printf("***** 0.exit *****\n");
}
- 功能:打印计算器的操作菜单,提示用户选择功能(1-4 对应加减乘除,0 对应退出)。
2. 运算函数(add/sub/mul/div)
cs
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int div(int a, int b) { return a / b; }
- 功能:分别实现整数的加、减、乘、除运算,接收两个
int参数,返回运算结果。 - 注意:
div函数未处理除数为 0 的情况,实际使用时可能导致程序异常。
3. 计算函数(calc)
cs
void calc(int (*pf)(int ,int)) {
int x = 0;
int y = 0;
int ret = 0;
printf("请输入两个数:>\n");
scanf_s("%d %d", &x, &y);
ret = pf(x, y); // 调用函数指针指向的运算函数
printf("%d\n", ret);
}
- 核心:参数是一个函数指针
pf,该指针指向 "接收两个int参数、返回int" 的函数(如add/sub等)。 - 流程:提示用户输入两个数字,通过函数指针
pf调用对应的运算函数,最后输出结果。 - 作用:通过函数指针实现 "回调",避免重复编写输入、输出逻辑,简化代码。
4. 主函数(main)
cs
int main() {
int input = 0;
do {
menu(); // 打印菜单
printf("请选择:>\n"); //
scanf_s("%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: printf("选择错误\n"); break;
}
} while (input); // 当input为0时退出循环
return 0;
}
- 逻辑:通过
do-while循环实现程序持续运行,用户输入选项后,通过switch语句匹配对应的运算,将运算函数(如add)作为参数传给calc函数执行。 - 退出条件:当用户输入
0时,循环结束,程序退出。
5. 注释中的扩展知识(函数指针数组)
代码中注释掉的部分是对 "函数指针数组" 的练习:
cs
// int (*arr[4])(int,int) = {add,sub,mul,div}; // 函数指针数组,存储4个运算函数的地址
// for (int i = 0; i < 4; i++) {
// int ret=arr[i](8, 4); // 通过数组索引调用函数
// printf("%d\n", ret);
// }
/*
// 函数指针数组(索引0留空,对应选项1-4)
int (*pfArr[])(int ,int) = {0,add,sub,mul,div};
// 指向函数指针数组的指针(二级指针)
int (*(*ppdArr)[5])(int ,int) = &pfArr;
*/
- 函数指针数组:
arr或pfArr是数组,每个元素都是 "指向运算函数的指针",可通过索引快速调用不同函数(例如pfArr[1]即指向add)。 - 用途:如果计算器功能扩展(如增加更多运算),用函数指针数组可替代
switch语句,通过索引直接调用函数,更简洁。
总结
这段代码的核心是函数指针的应用 :通过将运算函数作为参数传递,实现了代码复用(calc函数统一处理输入输出),同时注释部分展示了函数指针数组的进阶用法,为扩展功能提供了思路。注意代码中存在中文乱码,需调整编码格式解决。