C语言编程练手:手写一个计算器程序
于C语言编程学习的途径之中同学们于知晓基本概念、把握基础语法以后必定满怀热切之心想要去开发一款具备意义的实用程序。将编程实现计算器当作一个不错的选择是可行的。这是由于它的难度处于适中的程度其所需要运用到的知识刚好可以覆盖住C语言的基本关键点并且它还具备一定的实用性是比较适宜C语言初学者用来练手的项目。于开展后续练习题之前各位同学先去对照一番看看自身是不是掌握了下面这些知识标点符号你可不能忘记加上。假若上面提及的那些知识点你通通都已然掌握那么我们便能够去了解一下计算器程序究竟都具备哪些功能了。大家都用过手持式计算器它存在这样一个窗口此窗口能够显示输入进去的数字并且还能显示计算之后得出的结果另外它还有若干按键这些按键包含着数字以及运算符我们借助按这些按键来输入数字以及运算符进而达成计算。参照手持式计算器我们能够把程序设计成命令行式交互去接收来自键盘输入的数字以及来自键盘输入的运算符在进行计算之后将结果显示于屏幕之上。这就需要思考怎样对四则运算表达式做求值还要思考数据的验证更要思考交互的友好性等诸多问题。我们现在开始手撸一个计算器程序吧。手写计算器先确定计算器具体功能再动手写代码不然直接一头扎进代码细节里写着写着就会发现难度比自己想象中大像四则运算的混合运算得判断运算符优先级这对初学者来说实现起来不容易哟真是呢。所以我们能够依照最小可用原则即是说规划功能尽可能从简单实现予以起始然而要确保核心功能是完整具备的。在达成一个版本以后再去增添复杂度持续不断地迭代向前推进。能够确保每一步都获得可以使用的程序同时还能够逐步增强自身的信心就像这样。针对第一版计算器程序计划安排以下核心功能根据上述功能规划实现的第一版程序同学们可以参考一下#include#includeint 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 128double 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_stackreturn 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第版》这本书这本书当中涵盖了更为丰富以及更为详细的C语言方面的知识一旦将它学会那你便能够达成任何自己想要达成的功能。限时特惠5折读懂《C Primer Plus第版》给自己写更多实用程序《C Primer Plus第版》是一本针对初学者的经典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版》一本。