C语言简易计算器程序的实现与优化
目录一、基础版本简单直接的功能实现完整代码版本分析优点缺点二、进阶版本函数指针数组优化完整代码版本分析核心优化点优点三、改进版本功能解耦与模块化完整代码版本分析核心设计思想模块化解耦适用场景四、三个版本的对比与学习启示学习启示总结在 C 语言编程学习中实现一个简易计算器是经典且极具价值的练习项目。它不仅能巩固函数、循环、分支结构等核心语法还能帮助我们理解程序设计的核心思想 ——模块化、可扩展性、代码复用。本文将通过三个版本的计算器实现代码从基础功能到结构优化逐步拆解 C 语言编程的进阶思路。一、基础版本简单直接的功能实现基础版本的核心目标是完成核心功能让初学者快速理解 “输入 - 处理 - 输出” 的基本程序逻辑。完整代码#define _CRT_SECURE_NO_WARNINGS #includestdio.h // 菜单打印函数展示操作选项 void menu() { printf( 简易计算器 \n); printf(*** 1.add(加法) 2.sub(减法) ***\n); printf(*** 3.mul(乘法) 4.div(除法) ***\n); printf(*********** 0.exit(退出) *********\n); printf(\n); printf(请选择功能); } // 加法函数 int add(int x, int y) { return x y; } // 减法函数 int sub(int x, int y) { return x - y; } // 乘法函数 int mul(int x, int y) { return x * y; } // 除法函数增加除零判断避免运行时错误 int div(int x, int y) { if (y 0) { printf(错误除数不能为0\n); return -1; // 返回异常值标识错误 } return x / y; } int main() { menu(); // 打印菜单 int input 0; scanf(%d, input); int x 0, y 0; int ret 0; // 根据选择执行对应操作 switch (input) { case 1: case 2: case 3: case 4: printf(请输入两个操作数以空格分隔); scanf(%d%d, x, y); break; case 0: printf(退出成功\n); return 0; default: printf(输入错误请输入0-4之间的数字。\n); return 0; } // 分支调用对应运算函数 switch (input) { case 1: ret add(x, y); printf(计算结果%d %d %d\n, x, y, ret); break; case 2: ret sub(x, y); printf(计算结果%d - %d %d\n, x, y, ret); break; case 3: ret mul(x, y); printf(计算结果%d × %d %d\n, x, y, ret); break; case 4: ret div(x, y); if (y ! 0) // 仅在除数非零时输出结果 printf(计算结果%d ÷ %d %d\n, x, y, ret); break; } return 0; }版本分析优点逻辑极简代码按 “菜单展示→输入选择→执行运算→输出结果” 的流程编写初学者易理解职责清晰运算逻辑拆分为独立函数符合 “单一职责” 的编程思想友好提示补充了中文注释和操作指引降低使用门槛。缺点扩展性差新增运算如取模需修改switch分支违反 “开闭原则”交互体验差执行一次运算后程序直接退出无法连续计算鲁棒性不足原版本未处理 “除数为 0” 的异常场景易导致程序崩溃已优化。二、进阶版本函数指针数组优化进阶版本的核心目标是提升扩展性利用 C 语言的函数指针数组特性简化分支逻辑降低新增功能的修改成本。完整代码#define _CRT_SECURE_NO_WARNINGS #includestdio.h // 菜单打印函数优化格式 void menu() { printf(\n 简易计算器 \n); printf(*** 1.add(加法) 2.sub(减法) ***\n); printf(*** 3.mul(乘法) 4.div(除法) ***\n); printf(*** 5.mod(取模) 0.exit(退出) ***\n); printf(\n); } // 基础运算函数新增取模函数 int add(int x, int y) { return x y; } int sub(int x, int y) { return x - y; } int mul(int x, int y) { return x * y; } int div(int x, int y) { if (y 0) { printf(错误除数不能为0\n); return -1; } return x / y; } int mod(int x, int y) { if (y 0) { printf(错误模数不能为0\n); return -1; } return x % y; } int main() { // 函数指针数组下标对应功能编号0位置占位无意义 int(*calc_func[6])(int, int) { NULL, add, sub, mul, div, mod }; int input 0; int x 0, y 0; int ret 0; // do-while循环实现连续计算 do { menu(); printf(请选择功能); scanf(%d, input); // 输入合法性判断 if (input 0 || input 5) { printf(输入错误请输入0-5之间的数字。\n); continue; // 跳过本次循环重新展示菜单 } // 退出逻辑 if (input 0) { printf(退出计算器感谢使用\n); break; } // 执行运算 printf(请输入两个操作数以空格分隔); scanf(%d%d, x, y); ret calc_func[input](x, y); // 函数指针数组直接调用对应函数 // 输出结果排除除零/模零异常 if (!((input 4 || input 5) y 0)) { const char* op[] { , , -, ×, ÷, % }; // 运算符数组 printf(计算结果%d %s %d %d\n, x, op[input], y, ret); } } while (1); // 无限循环直到输入0退出 return 0; }版本分析核心优化点函数指针数组calc_func数组存储运算函数的指针下标与功能编号一一对应无需嵌套switch连续计算通过do-while循环实现 “一次启动多次计算”提升交互体验易扩展新增运算仅需两步① 编写运算函数② 将函数指针加入数组如新增取模仅需添加mod函数并更新数组代码简化运算符也通过数组管理避免重复编写输出语句。优点核心逻辑与功能扩展解耦符合 “开闭原则”代码行数减少分支复杂度降低可读性提升新增功能的修改成本从 “修改多处” 变为 “修改两处”。三、改进版本功能解耦与模块化改进版本的核心目标是极致解耦将 “计算”“输出”“输入校验” 等功能完全分离为后续复杂扩展如 GUI、文件输出打下基础。完整代码#define _CRT_SECURE_NO_WARNINGS #includestdio.h #includestdlib.h // 用于system(cls)清屏 // 函数声明统一管理便于维护 void menu(); int get_user_choice(); int get_operands(int* x, int* y); int add(int x, int y); int sub(int x, int y); int mul(int x, int y); int div(int x, int y); void print_result(int x, int y, int res, int op_type); int is_valid_choice(int choice); int is_valid_operand(int y, int op_type); // 菜单展示独立模块 void menu() { system(cls); // 清屏优化视觉体验 printf( 模块化计算器 \n); printf(*** 1.add(加法) 2.sub(减法) ***\n); printf(*** 3.mul(乘法) 4.div(除法) ***\n); printf(*********** 0.exit(退出) *********\n); printf(\n); } // 获取用户选择输入校验独立 int get_user_choice() { int choice 0; printf(请选择功能); while (scanf(%d, choice) ! 1 || !is_valid_choice(choice)) { // 清空输入缓冲区避免非法输入导致死循环 while (getchar() ! \n); printf(输入非法请输入0-4之间的整数); } return choice; } // 校验选择合法性 int is_valid_choice(int choice) { return (choice 0 choice 4); } // 获取操作数独立输入模块 int get_operands(int* x, int* y) { printf(请输入两个操作数以空格分隔); while (scanf(%d%d, x, y) ! 2) { while (getchar() ! \n); // 清空缓冲区 printf(输入格式错误请输入两个整数以空格分隔); } return 1; } // 校验操作数合法性针对除法 int is_valid_operand(int y, int op_type) { if (op_type 4 y 0) { printf(错误除数不能为0\n); return 0; } return 1; } // 运算函数纯计算无副作用 int add(int x, int y) { return x y; } int sub(int x, int y) { return x - y; } int mul(int x, int y) { return x * y; } int div(int x, int y) { return x / y; } // 结果输出独立输出模块 void print_result(int x, int y, int res, int op_type) { const char* op[] { , , -, ×, ÷ }; printf(\n【计算结果】%d %s %d %d\n, x, op[op_type], y, res); printf(按任意键继续...\n); getchar(); // 等待用户确认 getchar(); } int main() { int choice 0; int x 0, y 0; int res 0; do { menu(); choice get_user_choice(); // 分离输入逻辑 if (choice 0) { printf(退出计算器感谢使用\n); break; } get_operands(x, y); // 分离操作数输入 // 校验操作数仅除法 if (!is_valid_operand(y, choice)) continue; // 分支调用运算函数 switch (choice) { case 1: res add(x, y); break; case 2: res sub(x, y); break; case 3: res mul(x, y); break; case 4: res div(x, y); break; } print_result(x, y, res, choice); // 分离输出逻辑 } while (1); return 0; }版本分析核心设计思想模块化解耦功能拆分将程序拆分为 “菜单、输入、校验、计算、输出”5 个独立模块每个函数仅负责一件事输入鲁棒性新增输入合法性校验如非数字输入、除数为 0避免程序崩溃可维护性修改输出格式仅需改print_result函数修改输入规则仅需改get_user_choice函数交互优化新增清屏、等待确认等逻辑提升用户体验。适用场景适合需要长期维护、可能持续扩展功能的场景如添加科学计算、历史记录等。四、三个版本的对比与学习启示版本核心特点适用阶段核心学习点基础版本功能完整、逻辑简单入门阶段分支结构、函数封装进阶版本函数指针数组、高扩展进阶阶段函数指针、开闭原则改进版本完全模块化、高可维护工程化阶段模块化设计、鲁棒性设计学习启示编程是迭代的过程从 “能用” 到 “好用”再到 “易维护”是每个程序员的成长路径特性服务于需求函数指针、模块化不是 “炫技”而是为了解决 “扩展难、维护难” 的实际问题鲁棒性优先工业级代码需考虑异常场景如非法输入、除零而非仅实现核心功能。总结简易计算器的三个版本体现了 C 语言编程从 “实现功能” 到 “优化结构” 的进阶思路核心是降低耦合、提升扩展 / 维护性函数指针数组是 C 语言提升代码扩展性的经典技巧可大幅简化多分支的函数调用逻辑模块化解耦是工程化编程的核心思想将 “输入、处理、输出” 分离可显著提升代码的可维护性。通过这个案例可以发现优秀的代码不仅要 “能跑”更要符合 “易读、易改、易扩展” 的工程化标准 —— 这也是从 “新手” 到 “合格程序员” 的关键转变。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2419985.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!