C语言编程制作学习,简单计算器

这些是C/C++能做的

服务器开发工程师、人工智能、云计算工程师、信息安全(黑客反黑客)、大数据 、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频视频开发工程师、游戏服务器、分布式系统、游戏辅助等

C语言是面向过程的,而C++是面向对象的

由于工作需要最近在研究PHP扩展,无可避免的涉及到了C语言。从出了学校以后C语言在实际工作中还没有用到过,所以必须要先进行一点复习工作。个人认为对于熟悉一样东西说最好的方法是上手实践。于是便想起了当时大学的时候老师布置过的一道题目,用C语言实现简单数学表达式的分析和求值,比较遗憾的是当初没能把题目完成。就想着从新试一试,算是补一下当初的作业。

还记得当初的思路是,循环C字符串。用链表将不同的计算项存储到链表中。然后在进行循环求值。如果遇到括号就递归调用。回忆并整理了一下当初的思路大致如下。

1.输入 3+5*(2-6)/2

2.解析为

小编推荐一个学C语言/C++的学习裙【 二六三,六八八,二七六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

3.计算 通过两次循环对不同优先级进行运算得出结果

第一次对*/进行计算,拿当前节点,和节点的next节点,求值后将值赋给next节点,并删除自身节点

第二次对+-进行求值,直到遇到end

最初也打算按这个思路去实现的,之后发现解析的步骤会比较复杂,涉及到多次的字符串搜索,比对。再加上C本身不支持正则表达式,所以就放弃了当初的思路。找了一些相关的资料后发现了一种更简单也更科学的方法,那就是将输入转换成后缀表达式再进行求值,这后缀表达式究竟是什么呢,请继续看下去。

一、后缀表达式

百度百科介绍: 不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,如:(2 + 1) * 3 , 即2 1 + 3 *

了解了后缀表达式才知道,原来我们习以为常的数学表达式被称之为中缀表达式。花了点时间研究了一下发现后缀表达式的计算还蛮简单的,也更符合计算机运算。

计算方法,从左往右进行计算。取运算符号前两位数字进行运算,运算结果替代运算符以及前两位数字,持续运算到最右边得出结果。

这么说起来可能比较难理解,我们看几个例子

最简单的 21+

计算过程为 2 + 1 = 3

值为 3

普通的 325-2*+

计算过程 从左往右先计算 2-5=-3,-3取代前面的25-之后为 3-32*+,完整的计算步骤如下

计算2-5=3 计算完之后表达式为 3 -3 2 *+

计算-3*2=-6 计算完之后表达式为 3 -6 +

计算3+-6=-3 计算完之后表达式为 -3

值为 -3

稍微复杂一点的 21+3*5387-/*-

计算过程 从左往右先计算 2+1 = 3,4取代前面的21+之后为 33*5387-/*- 完整的计算步骤如下

计算2+1=3 计算完之后表达式为 3 3 *5 3 8 7 -/*-

计算3*3=9 计算完之后表达式为 9 5 3 8 7 -/*-

计算8-7=1 计算完之后表达式为 9 5 3 1 /*-

计算3/1=3 计算完之后表达式为 9 5 3 *-

计算5*3=15 计算完之后表达式为 9 15 -

计算9-15=-6 结果为 -6

值为 -6

看完了以上结果,我们会发现每一次参与计算的数字,都是最靠近运算符号的两位数字。然后由运算出来的结果代替参与运算的数字和运算符,直到表达式只剩下一个值,计算完成。

根据这样的规律,程序处理起来就简单了。

1.从左往右的循环整个输入。

2.判断是否是数字,如果是数字就保存起来。如果遇到符号,则把保存的前两个值取出来,计算后把本次计算结果存回去

3.循环完成之后,剩下的表达式便是计算结果了

根据如上规则不难发现每次参与计算的两个数字都是最后存进去的,这样一来我们便可以用栈轻松的完成这样一个程序了,下面跟大家简单介绍一下栈。

二、栈

百度百科的解释比较复杂,就不摘抄了。其实栈可以简单的理解为一个存放数据的空间,数据按照后进先出的原则进行存取。对数据的操作有push和pop,分别称之为压入,弹出。

由于比较简单,所以直接用代码实现了一个简单的栈,包含如下四个方法。

小编推荐一个学C语言/C++的学习裙【 二六三,六八八,二七六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

简单的进行测试,输入结果为

item is : 1.120000

item is : 2.800000

2.800000

1.120000

实现了预期输出,一个简单的栈就搞定了,接下来就可以利用整个简单的栈来完成求值的函数了。

三、后缀表达式求的具体实现

由于栈已经实现了,所以只需要按照后缀表达式求值的逻辑进行运算在配合栈就可以实现整个计算过程了。方法比较简单,用while循环整字符串,在配合switch对数字和运算符做不同的处理就能够完成一个简单的后缀表达式求值函数了。以下是第一版的实现代码

在第一个版本的过程中,遇到一个C语言知识点是 C语言的字符串指针指向的地址是字符串第一个字符的地址。

所以当i为0的时候,&str[i] = &str, atof 接收的是一个字符串指针,如果使用 STACKpush(atof(&str[i])),i为0时,会将整个字符串传入进去转换。采用了一个char变量,讲str[i]拷贝出来,然后传入&num,则可以解决这个问题。

其实这段程序里还涉及到一个指针运算的知识点,但是这里的程序里涉及还比较简单易懂,后续还有更难的地方涉及到这个知识点,所以先放到后面再跟大家分享。

对上面的方法进行了测试,输入我们之前分析的三个表达式,得出结果如下

printf("%f ", calculate("21+")); //3

printf("%f ", calculate("325-2*+")); //-3

printf("%f ", calculate("21+3*5387-/*-")); //-6

测试通过,跟之前的计算结果一直。以上便是一个简单的后缀表达式的计算程序了。进行了多几次的测试发现了一个小问题,就是目前无法进行多位数的识别。因为程序没一次都将一位数压入站内了。思考了一下在表达式的每个计算项上加了一个空格符作为数字的区分。变为 21 3 +这种形式,于是动手将代码做了一点小改动

在 switch 中加入了对空格的处理,以及多位数的处理

//如果遇到空格,则重置标志位

小编推荐一个学C语言/C++的学习裙【 二六三,六八八,二七六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,114评论 0 13
  • •1 C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,使读者对c语...
    CONLYOUC阅读 8,694评论 9 66
  • 1通俗易懂的产品介绍 不做产品说明书,而是将产品的效果生活化,描绘出使用的产品前后的对比, 很多人一上来,就说产品...
    熊芳菲阅读 539评论 0 0
  • 专业引领——导师模拟授课环节主持词 第一场开场—— 尊敬的导师们和亲爱的星火小伙伴们: 大家上午好! 在这个火热的...
    尘缘心语阅读 639评论 0 0
  • T娘做过最棒的一件事大概就是从美杜莎时空瀑布中送planet earth回家了吧。也是为了送别DT,三季全体小伙伴...
    妙宗舶攸阅读 199评论 0 0