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

C语言编程练手:手写一个计算器程序

于C语言编程学习的途径之中,同学们于知晓基本概念、把握基础语法以后,必定满怀热切之心想要去开发一款具备意义的实用程序。

将编程实现计算器当作一个不错的选择是可行的。这是由于它的难度处于适中的程度,其所需要运用到的知识刚好可以覆盖住C语言的基本关键点,并且它还具备一定的实用性,是比较适宜C语言初学者用来练手的项目。

于开展后续练习题之前,各位同学先去对照一番,看看自身是不是掌握了下面这些知识,标点符号你可不能忘记加上。

假若上面提及的那些知识点,你通通都已然掌握,那么我们便能够去了解一下,计算器程序究竟都具备哪些功能了。

大家都用过手持式计算器,它存在这样一个窗口,此窗口能够显示输入进去的数字,并且还能显示计算之后得出的结果,另外,它还有若干按键,这些按键包含着数字以及运算符,我们借助按这些按键来输入数字以及运算符,进而达成计算。

参照手持式计算器,我们能够把程序设计成命令行式交互,去接收来自键盘输入的数字,以及来自键盘输入的运算符,在进行计算之后,将结果显示于屏幕之上。这就需要思考怎样对四则运算表达式做求值,还要思考数据的验证,更要思考交互的友好性等诸多问题。

我们现在开始手撸一个计算器程序吧。

手写计算器

先确定计算器具体功能,再动手写代码,不然直接一头扎进代码细节里,写着写着就会发现难度比自己想象中大,像四则运算的混合运算得判断运算符优先级,这对初学者来说实现起来不容易哟,真是呢。

所以,我们能够依照最小可用原则,即是说,规划功能尽可能从简单实现予以起始,然而要确保核心功能是完整具备的。在达成一个版本以后,再去增添复杂度,持续不断地迭代向前推进。

能够确保每一步都获得可以使用的程序,同时还能够逐步增强自身的信心,就像这样。针对第一版计算器程序,计划安排以下核心功能:

根据上述功能规划实现的第一版程序,同学们可以参考一下:

#include
#include
int main(int argc, char *argv[]) {
double num1, num2, result; // 声明变量
char op;
printf("请输入第一个数字:");
scanf("%lf", &num1);
printf("请输入运算符:");
scanf(" %c", &op);
printf("请输入第二个数字:");
scanf("%lf", &num2);
switch(op) { // 根据运算符进行相应运算
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
if(num2 == 0) { // 处理除数为0的情况
printf("错误:除数不能为0\n");
exit(1);
}
result = num1 / num2;
break;
default: // 处理无效运算符的情况
printf("错误:%c 是无效运算符\n", op);
exit(1);
}
printf("%.2f %c %.2f = %.2f\n", num1, op, num2, result);
return 0;
}

审查之前提到的代码,我们用double类型去定义准备进行计算的变量,把char类型用于将运算符当作字符型来进行存储,之后借助switch - case这种条件分支语句针对运算符开展识别以及处理。

Linux环境之中,我们能够运用gcc工具,对示例代码展开编译,进行调试,予以测试。

正常运行示例:

判断出&是无效字符的错误运行示例:

判断出除数不能为零的错误运行示例:

到这个时候,一个能够完成两个数之间四则运算的简单计算器程序就已经开发完成了。同学们肯定会察觉到这个程序依然存在诸多地方是能够进行优化的,比如说,在输入的并非数字而是字符串的时候会出现什么样的情况呢?交互方式是不是仍旧能够变得更加友好一些呢?

有着待改进的各个方面,同学们能够去踊跃探寻。接下来我们要去挑战一项更具难度的功能,也就是怎样达成复杂表达式的运算。

更进一步:复杂表达式的计算

一款具备实用性的计算器,得能够按照运算符的优先级,去达成对多个数的混合四则运算,而且还要支持针对括号的优先级处理。

这段内容需要引入一种数据结构,也就是栈,它被称为stack。其具备的特点是先进后出,并且只能于栈顶去执行压入,也就是push操作以及弹出,即pop操作。我们要去创建两个栈,一个是操作数栈,另一个是运算符栈。为了简便起见,此栈能够使用数组来达成实现。

先有了栈,之后便要去对表达式做解析,得通过针对运算符以及操作数的入栈动作、出栈动作,以此来完成整个表达式的计算相关工作。按照运算符和括号的优先级次序,从左边朝着右边去遍历表达式,下面是以伪代码的形式来进行说明求值规则。

#define STACK_SIZE 128
double eval_expr(char* expr) {
// 定义运算符栈和操作数栈
char op_stack[STACK_SIZE];
double num_stack[STACK_SIZE];
对于每个token in expr:
如果 token 是操作数:
将 token 解析为操作数,并压入 num_stack
如果 token 是运算符:
当 op_stack 非空 且 栈顶运算符的优先级 >= token 的优先级:
弹出栈顶运算符,从 num_stack 弹出两个操作数进行运算,并将结果压入 num_stack
将 token 压入 op_stack
当 op_stack 非空:
弹出栈顶运算符,从 num_stack 弹出两个操作数进行运算,并将结果压入 num_stack
return num_stack 的栈顶元素
}

为了能有更优的理解状况,我们着手去观察一个混合运算的示例,这个示例是“3 * 4 + (2 - 1) / 5 ^ 2”。

// 在“3 * 4”入栈后,栈中数据如下
num_stack = [3, 4];
op_stack = [*];
// 遇到 + 号,它的优先级低于 * 号,暂停入栈,将 3 * 4 出栈先行计算,再将结果12入栈
num_stack = [12];
op_stack = [+];
// “(2-1”入栈之后数据如下
num_stack = [12, 2, 1];
op_stack = [+, (, -];
// 遇到右括号,停止入栈,要匹配左括号,并弹出栈中数据进行计算
num_stack = [12, 1];
op_stack = [+];
// “/5^2”入栈后数据如下
num_stack = [12, 1, 5, 2];
op_stack = [+, /, ^];
// 接下来依次对出栈数据进行计算,得到结果
num_stack = [12.04];
op_stack=;

同学们能够于先前完成的完整示例之作基础上增添功能,拿来用以把伪代码改写成具体的功能达成情况,此功能更为繁杂,实施之际需存有耐心去掌控细节,与此同时要多多考量对于差错处置以及异样情况。

围绕这个主题,同学们知晓了怎样运用C语言搭建一个简易的计算器,并且掌握了应对用户输入、表达式解析以及求值的基础技术。与此同时还能够进一步拓展计算器的功能,或者开展其他有意思的项目,从而持续发展并挑战自身。

对于那些有着更高抱负与追求的同学们而言,可以以一种系统的方式去学习《C Primer Plus第6版》这本书,这本书当中涵盖了更为丰富以及更为详细的C语言方面的知识,一旦将它学会那你便能够达成任何自己想要达成的功能。

限时特惠5折

读懂《C Primer Plus(第6版)》,

给自己写更多实用程序

《C Primer Plus(第6版)》是一本针对初学者的经典C语言教材,其作者是Stephen Prata,他于加州Kentfield的Marin学院教授天文学、物理学以及程序设计课程,凭借独特的教学风格收获了广泛赞誉。

凭借着简洁明了,可以让人轻易理解的语言,以及通俗易懂,以便于领会分析的示例,该书协助同学们迅速地进入C语言编程的入门阶段,并且对于计算机科学的基础知识有所了解。本书主要具备以下这些特点:

《C Primer Plus(第6版)》采取分章形式来组织内容,这致使学习进程变得更为系统且又有序,每一个章节都具备明确定义的目标以及主题,助力同学们一步步掌握C语言编程的核心要点。

此外,本书内容更新十分及时,已涵盖了 C99 以及 C11 标准的某些新特性,还有编程技巧。作者还对 C 语言于实际项目里的应用做了介绍,助力同学们了解并掌握实际编程中的常用技巧,以及经验。

总的来说,《C Primer Plus(第6版)》凭借表达简洁清晰的语言,有着丰富多样的示例,还有具体的实践项目,从而助力读者迅速掌握C语编程的基础要点以及相关技巧。

各位同学,你们是不是想要借助C语言去编写出具备真正实用价值的程序呢,翻开那本《C Primer Plus (第6版)》就可以了,有关内容全都写在其中了。

文末福利

于评论区之中分享你自身的编程学习经历情况,小编将会从评论区那里选择3位人员进而赠送《C Primer Plus第6版》一本。

http://www.jsqmd.com/news/648653/

相关文章:

  • OpenLayers(六)动态聚合策略与性能优化
  • GEO优化怎么选?看完这篇实力对比就够了
  • 上拉/下拉电阻原理、选型与避坑全解:90%硬件新手都栽在这5个地方
  • 输入处理输出结构递归嵌套模型技能ipo-model
  • Mathtype公式与AI论文:如何撰写DeOldify技术报告
  • 2026年企业网盘排行榜:10大主流方案安全性与协作效率深度实测
  • Python日志记录logging模块配置与使用:从入门到生产环境
  • Nano-Banana开源镜像教程:基于PEFT的LoRA动态加载机制详解
  • Day05:Windows配置:内置用户、内置组(一)
  • Phi-4-mini-reasoning简单调用:curl命令直连7860端口获取推理结果示例
  • ​从CNN到Transformer:基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类
  • 2026算法新规则!中腰部账号3个合规涨粉突围法
  • AI编程革命:用Codex一键生成高效脚本
  • 从Gotham到Foundry:一文读懂Palantir三大产品线(Gotham/Foundry/Apollo)的核心差异与适用场景
  • 2026年月付会员和按篇付费降AI工具对比:长期用哪种更划算
  • Wan2.2-I2V-A14B原理与YOLOv11技术趋势交叉解读
  • Rust的#[cfg(doctest)]配置属性与文档测试在库开发中的自动化验证
  • SAP_MM模块同工厂库存转储两步法313+315调拨
  • 前端组件设计原则
  • 华硕天选2 FA506Q FA706Q 原厂Win11 22H2系统分享下载-宇程系统站
  • 代码工厂夜未眠:我让AI(Droid Mission)造了30小时轮子,发现了软件开发的天花板不在代码里
  • 两串锂电池充电管理芯片未接电池状态指示灯行为分析
  • 菜花矮化栽培水肥一体系统搭建实战手册
  • 2026年评价高的上柴集装箱/扬州静音集装箱/扬州储能集装箱优质厂家汇总推荐 - 品牌宣传支持者
  • 2026年4月亲测:宠物智能猫砂盆哪家强?
  • 2026年评价高的钨钢模具/异型模具/钻石模具/拉管模具优质厂家推荐榜 - 品牌宣传支持者
  • Gemma-3-12B-IT效果展示:多轮对话、代码生成,实测效果分享
  • 文脉定序环境部署:适配中小企业知识库的轻量级重排序服务搭建指南
  • 2026石笼网厂家推荐排行榜安平县润盛丝网制造有限公司领衔(产能规模+专利技术+质量认证) - 爱采购寻源宝典
  • AgentCPM-Report落地指南:Pixel Epic镜像免配置一键部署教程(含Streamlit定制)