当前位置: 首页 > article >正文

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 语言提升代码扩展性的经典技巧可大幅简化多分支的函数调用逻辑模块化解耦是工程化编程的核心思想将 “输入、处理、输出” 分离可显著提升代码的可维护性。通过这个案例可以发现优秀的代码不仅要 “能跑”更要符合 “易读、易改、易扩展” 的工程化标准 —— 这也是从 “新手” 到 “合格程序员” 的关键转变。

相关文章:

C语言简易计算器程序的实现与优化

目录 一、基础版本:简单直接的功能实现 完整代码 版本分析 优点 缺点 二、进阶版本:函数指针数组优化 完整代码 版本分析 核心优化点 优点 三、改进版本:功能解耦与模块化 完整代码 版本分析 核心设计思想:模块化解…...

优秀堡垒机功能学习

用户管理 1. 用户,角色 2. 资产授权给角色(用户)资源管理 1. 新建:新建,导入,同步第三方云,同步用户自己的系统 2. 更新:定时同步,定时检测状态 3. Group:资源…...

Coredump-X: movaps 可能会导致 段错误(SIGSEGV)

文章目录 简介 需要注意这种情况。 gcc 代码片段 GCC的选择 movups movaps -mpreferred-stack-boundary=num intel 文档说明 简介 这个情况,还是第一次看到,gcc在做优化的时候,对于memset函数,可能使用sse相关的movups/movaps这种指令来提升性能,但是这两个指令的区别是m…...

企业决策视角下微服务全链路性能瓶颈分析平台对比及实践指南

核心观点摘要 微服务架构提升了业务弹性,却因跨服务调用链的不可见性造成性能盲区,需借助全链路性能分析平台实现端到端可观测与瓶颈定位。全链路性能分析,是指采集并关联从前端入口到后端微服务的请求轨迹与资源消耗数据,其核心特…...

GARbro:视觉小说资源浏览器

GARbro:视觉小说资源浏览器 【免费下载链接】GARbro Visual Novels resource browser 项目地址: https://gitcode.com/gh_mirrors/gar/GARbro 项目介绍 GARbro 是一款专门用于浏览和操作视觉小说(Visual Novels,简称VN)资…...

电源动态响应测试

电源动态响应测试,旨在评估电源在面对快速变化负载和电压条件时的性能表现。确保电源系统能够在系统负载发生瞬时变化时快、有效的调整输出电压,仍然提供稳定、可靠的电源输出,以维持整个系统的稳定性和可靠性。电源上升通道和下降通道测试。…...

UE 最全FString字符串与各格式转换 输出

一、UE4 Source Header References CString.h UnrealString.h NameTypes.h StringConv.h (TCHAR_TO_ANSI etc) CString.h可以查到更多,如 atoi64 (string to int64) Atod (string to double precision float) 二、日志打印 1.输出字符串到output log中 1.1 最…...

UE 树形图 C++版

1.创建以下三个C类(1)UTreeViewItemBase(基类UObject)UCLASS() class UTreeViewItemBase : public UObject {GENERATED_BODY() public:UTreeViewItemBase();virtual ~UTreeViewItemBase() override; public:FString Id;//层级int32 Level;//标签FText Label;//与自身对应的Acto…...

UE 树形图(Tree View)_1

一.树形图介绍1.所需类型(1)TreeView控件:作为树形图主体,后面简称树形图(2)EntryWidget:本质是一个UserWidget,作为树形图中的子元素存在,必须要实现UserObjectListEntry接口,否则无法作为树形图的子元素.后面简称Entry(3)TreeViewItem:EntryWidget对应的信息or实体,基类为UOb…...

华为OD机试双机位C卷-生成哈夫曼树 (Py/Java/C/C++/Js/Go)

生成哈夫曼树 华为OD机试双机位C卷 华为OD上机考试双机位C卷 100分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解 题目描述 给定长度为 n 的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大…...

Java毕业设计基于springboot的智能推荐旅游平台95722270

前言 在个性化消费时代背景下,旅游市场的需求日益多样化和个性化。传统的旅游推荐方式已经难以满足游客对个性化、精准化服务的需求。因此,开发一个基于Spring Boot的智能推荐旅游平台具有重要意义。该平台能够综合分析游客的旅行偏好、时间安排、预算限…...

Java毕业设计基于springboot+Java株洲崔氏服装有限公司服装生产管理信息系统

前言 随着株洲崔氏服装有限公司业务的不断发展,传统的生产管理方式已难以满足高效、精准的管理需求。因此,公司决定采用现代信息技术,设计与实现一个服装生产管理信息系统,以实现对服装生产全过程的信息化管理,提高生产…...

JAVA EE(进阶)_CSS

人与人之间总是渐渐疏离 ——陳長生. ❀主页:陳長生.-CSDN博客❀ 📕上一篇:JAVA EE(进阶)_HTML-CSDN博客 1.CSS 1.1.介绍 如果说HTML是前端的骨架,那么CSS就是前端的外表 可以做到…...

Java毕业设计基于springboot的某炼油厂盲板管理系统

前言 在炼油厂的生产过程中,盲板的管理是一个至关重要的环节。传统的盲板管理方式往往依赖于人工记录和跟踪,这种方式不仅效率低下,而且容易出错。为了提高盲板管理的效率和安全性,炼油厂引入了基于Spring Boot的盲板管理系统。该…...

如何快速上手Motion UI:从安装到第一个动画效果的简单教程

如何快速上手Motion UI:从安装到第一个动画效果的简单教程 【免费下载链接】motion-ui 💎 The powerful Sass library for creating CSS transitions and animations 项目地址: https://gitcode.com/gh_mirrors/mo/motion-ui Motion UI是一个功能…...

GoMLX核心组件解析:从张量操作到神经网络层

GoMLX核心组件解析:从张量操作到神经网络层 【免费下载链接】gomlx GoMLX -- Accelerated ML Libraries for Go 项目地址: https://gitcode.com/gh_mirrors/go/gomlx GoMLX是Go语言生态中一款强大的加速机器学习库,它提供了从底层张量操作到高层神…...

double-conversion深度解析:从V8引擎到高效IEEE浮点数转换库

double-conversion深度解析:从V8引擎到高效IEEE浮点数转换库 【免费下载链接】double-conversion Efficient binary-decimal and decimal-binary conversion routines for IEEE doubles. 项目地址: https://gitcode.com/gh_mirrors/do/double-conversion dou…...

TDL vs DSEFix:哪种Windows驱动签名绕过工具更适合你?深度对比分析

TDL vs DSEFix:哪种Windows驱动签名绕过工具更适合你?深度对比分析 【免费下载链接】TDL Driver loader for bypassing Windows x64 Driver Signature Enforcement 项目地址: https://gitcode.com/gh_mirrors/tdl1/TDL 在Windows系统开发中&#…...

为什么选择Torch?Elixir开发者必备的5大理由与优势分析

为什么选择Torch?Elixir开发者必备的5大理由与优势分析 【免费下载链接】torch A rapid admin generator for Elixir & Phoenix 项目地址: https://gitcode.com/gh_mirrors/tor/torch Torch是Elixir和Phoenix框架生态中一款强大的快速管理后台生成工具&a…...

【WIN开发】04 四种文件操作之注册表编程

一、什么是注册表? 注册表就是Windows系统的档案室! 按 Win + R 键 输入 regedit 回车即可打开注册表编辑器二、注册表的结构 2.1 五大根键(就像五个大柜子) 根键 缩写 存放什么 HKEY_CLASSES_ROOT HKCR 文件类型、扩展名关联 HKEY_CURRENT_USER HKCU 当前用户的设置 HK…...

华为OD机试双机位C卷-出错的或电路 (C/C++/Py/Java/Js/Go)

出错的或电路 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解 华为OD机试双机位C卷 华为OD上机考试双机位C卷 100分题型 题目描述 某生产门电路的厂商发现某一批次的或门电路不稳定,具体现象为计算两个二进制数的或操作时…...

JAVA EE初阶 2: 多线程-初阶

1.认识线程(Thread)1.1 概念1.2 创建线程(1) 方法1 - 继承Thread类【 Ctrl C 取消 终止 】(2) 方法2 - 实现Runnable接口(3) 总结(4) 匿名内部类&#xff0…...

python --飞浆离线ocr使用/paddleocr

python 3.10.3 和 飞浆ocr 3.2使用 依赖 paddlepaddle3.2.0 paddleocr3.2.0运行测试 paddleocr ocr -i https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/general_ocr_002.png --use_doc_orientation_classify False --use_doc_unwarping False --use_text…...

稳转细胞株构建全攻略:从理论到实践的生物制药核心技术解析

为何稳转细胞株成为生物制药领域的“兵家必争之地”?稳转细胞株被称为“药物研发的基石”,是单克隆抗体、双抗、疫苗、ADC等生物制品规模化生产的核心环节,还是药物生产成本、效率和质量的关键决定因素。一株高产稳定的细胞株有可能直接缩短药…...

PHing配置文件完全手册:build.xml编写指南与示例

PHing配置文件完全手册:build.xml编写指南与示例 【免费下载链接】phing PHing Is Not GNU make; its a PHP project build system or build tool based on Apache Ant. 项目地址: https://gitcode.com/gh_mirrors/ph/phing PHing是一款基于Apache Ant的PHP项…...

laravel-menu性能优化:高效生成与缓存策略

laravel-menu性能优化:高效生成与缓存策略 【免费下载链接】laravel-menu A quick way to create menus in Laravel 项目地址: https://gitcode.com/gh_mirrors/la/laravel-menu laravel-menu是一款专为Laravel框架设计的菜单生成工具,能够帮助开…...

2026高职物联网毕业起薪一般多少?就业方向、岗位薪资与升职路径全解析

【先说结论】2026年高职物联网专业毕业生的起薪,通常会落在【4500元—8000元/月】这个区间。若在新一线、强二线城市,且具备项目经验、证书、实习经历,起点拿到【7000元以上】并不罕见;如果是制造业城市、传统中小企业&#xff0c…...

MobileCoin智能合约开发入门:构建基于隐私支付的去中心化应用

MobileCoin智能合约开发入门:构建基于隐私支付的去中心化应用 【免费下载链接】mobilecoin Private payments for mobile devices. 项目地址: https://gitcode.com/gh_mirrors/mo/mobilecoin MobileCoin是一个专注于移动设备隐私支付的开源项目,它…...

2026大专财富管理毕业工资多少?就业薪资、岗位方向与升职考证全攻略

【先说结论】2026年大专学财富管理,毕业后的起薪通常不会“一步到位特别高”,但它是一个【越做越值钱】的专业。若进入银行、证券、保险、第三方财富公司等行业,刚毕业月薪大多在【4500元—9000元】之间;如果在一线城市、业绩岗、…...

2026年低功耗国产32位MCU哪家强?业内权威评测榜单揭晓

在物联网、智能家居、可穿戴设备以及工业传感器等终端应用爆发的当下,低功耗已成为衡量微控制器(MCU)核心竞争力的关键指标之一。对于工程师和采购决策者而言,如何在琳琅满目的国产芯片中选择一款兼具“低功耗”与“高性能”的32位…...