计算器回调函数

一、代码

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

相关推荐
小O的算法实验室17 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
‎ദ്ദിᵔ.˛.ᵔ₎17 小时前
LIST 的相关知识
数据结构·list
qq_3395548218 小时前
英飞凌ModusToolbox环境搭建
c语言·eclipse
M--Y18 小时前
Redis常用数据类型
数据结构·数据库·redis
张張40818 小时前
(域格)环境搭建和编译
c语言·开发语言·python·ai
郭涤生18 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿18 小时前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz19 小时前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能19 小时前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****19 小时前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯