计算器回调函数

一、代码

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

相关推荐
爱敲代码的TOM6 小时前
数据结构总结
数据结构
CoderCodingNo6 小时前
【GESP】C++五级练习题 luogu-P1865 A % B Problem
开发语言·c++·算法
大闲在人6 小时前
7. 供应链与制造过程术语:“周期时间”
算法·供应链管理·智能制造·工业工程
VekiSon6 小时前
Linux内核驱动——杂项设备驱动与内核模块编译
linux·c语言·arm开发·嵌入式硬件
小熳芋6 小时前
443. 压缩字符串-python-双指针
算法
Charlie_lll7 小时前
力扣解题-移动零
后端·算法·leetcode
chaser&upper7 小时前
矩阵革命:在 AtomGit 解码 CANN ops-nn 如何构建 AIGC 的“线性基石”
程序人生·算法
weixin_499771557 小时前
C++中的组合模式
开发语言·c++·算法
2的n次方_7 小时前
CANN Ascend C 编程语言深度解析:异构并行架构、显式存储层级与指令级精细化控制机制
c语言·开发语言·架构
iAkuya7 小时前
(leetcode)力扣100 62N皇后问题 (普通回溯(使用set存储),位运算回溯)
算法·leetcode·职场和发展