计算器回调函数

一、代码

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函数统一处理输入输出),同时注释部分展示了函数指针数组的进阶用法,为扩展功能提供了思路。注意代码中存在中文乱码,需调整编码格式解决。

相关推荐
量子炒饭大师4 分钟前
Cyber骇客的逻辑节点美学 ——【初阶数据结构与算法】二叉树
c语言·数据结构·c++·链表·排序算法
課代表14 分钟前
从初等数学到高等数学
算法·微积分·函数·极限·导数·积分·方程
ullio18 分钟前
arc206d - LIS ∩ LDS
算法
等等小何42 分钟前
leetcode1593拆分字符串使唯一子字符串数目最大
算法
量子炒饭大师1 小时前
Cyber骇客神经塔尖协议 ——【初阶数据结构与算法】堆
c语言·数据结构·c++·二叉树·github·
XLYcmy2 小时前
TarGuessIRefined密码生成器详细分析
开发语言·数据结构·python·网络安全·数据安全·源代码·口令安全
王老师青少年编程2 小时前
2025年12月GESP(C++二级): 环保能量球
c++·算法·gesp·csp·信奥赛·二级·环保能量球
KingRumn2 小时前
DBUS源码剖析之DBusMessage数据结构
linux·服务器·数据结构
weixin_433417672 小时前
Canny边缘检测算法原理与实现
python·opencv·算法
CoderCodingNo2 小时前
【GESP】C++五级真题(贪心思想考点) luogu-P11960 [GESP202503 五级] 平均分配
开发语言·c++·算法