计算器回调函数

一、代码

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;
*/
  • 函数指针数组:arrpfArr是数组,每个元素都是 "指向运算函数的指针",可通过索引快速调用不同函数(例如pfArr[1]即指向add)。
  • 用途:如果计算器功能扩展(如增加更多运算),用函数指针数组可替代switch语句,通过索引直接调用函数,更简洁。

总结

这段代码的核心是函数指针的应用 :通过将运算函数作为参数传递,实现了代码复用(calc函数统一处理输入输出),同时注释部分展示了函数指针数组的进阶用法,为扩展功能提供了思路。注意代码中存在中文乱码,需调整编码格式解决。

相关推荐
格林威1 天前
多相机重叠视场目标关联:解决ID跳变与重复计数的 8 个核心策略,附 OpenCV+Halcon 实战代码!
人工智能·数码相机·opencv·算法·计算机视觉·分类·工业相机
金融小师妹1 天前
基于AI多模态分析的日本黄金储备60%跃升研究:外汇结构重构与资产价格联动机制解构
大数据·数据结构·人工智能·深度学习
郝学胜-神的一滴1 天前
深入理解网络分层模型:数据封包与解包全解析
linux·开发语言·网络·程序人生·算法
永远都不秃头的程序员(互关)1 天前
【K-Means深度探索(九)】K-Means与数据预处理:特征缩放与降维的重要性!
算法·机器学习·kmeans
源代码•宸1 天前
Golang原理剖析(逃逸分析)
经验分享·后端·算法·面试·golang··内存逃逸
重生之后端学习1 天前
25. K 个一组翻转链表
java·数据结构·算法·leetcode·职场和发展
CoderCodingNo1 天前
【GESP】C++五级练习题 luogu-P2242 公路维修问题
开发语言·c++·算法
阿华hhh1 天前
day2(IMX6ULL)<led(c语言版)>
java·c语言·jvm
不知名XL1 天前
day30 动态规划03
算法·动态规划
张祥6422889041 天前
线性代数本质笔记十二
人工智能·算法·机器学习