计算器回调函数

一、代码

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

相关推荐
青山的青衫3 小时前
【优先级队列(堆)+排序】LeetCode hot100+面试高频
算法·leetcode·面试
枫叶丹43 小时前
【Qt开发】Qt窗口(八) -> QFileDialog 文件对话框
c语言·开发语言·数据库·c++·qt
第二只羽毛3 小时前
基于Deep Web爬虫的当当网图书信息采集
大数据·开发语言·前端·爬虫·算法
Ayanami_Reii4 小时前
详解Splay平衡树
数据结构·算法·线段树·主席树·持久化线段树
JiaJZhong4 小时前
560. 和为 K 的子数组
数据结构·算法
小年糕是糕手4 小时前
【C++】模板初阶
java·开发语言·javascript·数据结构·c++·算法·leetcode
秦苒&5 小时前
【C语言指针二】从入门到通透:核心知识点全梳理(野指针,assert断言,指针的使用和传址调用,数组名的理解和使用指针反访问数组)
c语言·开发语言
AndrewHZ5 小时前
【遥感图像入门】遥感图像专用去噪算法:核心方案与实战(PyTorch代码)
pytorch·算法·计算机视觉·cv·遥感图像·高分辨率·去噪算法
前端小L6 小时前
回溯算法专题(八):精细化切割——还原合法的「IP 地址」
数据结构·算法