算式计算器说明文档.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算式计算器说明文档

算式计算器说明文档 作者:赵明现(Alpher,小现) email: Alpher@pku.org.cn 编译器:TC20 完成时间:2004-3-24 【序】 【功能说明】 要求输入计算式满足C语言语法,支持加、减、乘、除运算和括号,支持单目运算符’+’、’-’;支持整形和浮点型数据的输入,浮点型数据输入可以省略小数点之前和之后的0,如.9,9.,它们等价与0.9和9.0;运算优先级与C中相同。 参与运算的如果有两个数,需要他们是相同的数据类型,而且运算结果也为该类型的数据。如“1/3”的运算结果为0;如果两个数具有不同的数据类型,即为整形和浮点型,则将整形转换为浮点型再进行运算。 【递归方法说明】 -0- 考虑到单目运算符,以及将来可能的功能扩展,直接简单的将运算式作为一个堆栈来实现的话个人感觉很不容易,所以,考虑用递归的方法来实现,然后再根据所编写的递归函数,改写为非递归函数,实现堆栈方式的算式计算器。 -1-输入算式的处理 首先,将输入的算式存放在字符串Formula中,然后利用 StackFormula=BreakDown(Formula); /*返回值为双向链表的头指针*/ 将算式字符串转换为由数据和运算符组成的双向链表StackFormula中。BreakDown的具体实现不是本文的重点,这里不作叙述,读者请参看源码。 链表的节点定义如下: struct Node { void *Info; char InfoType; /*Sign if the Info is a integer or a float*/ /* or an operator, I or F or O*/ struct Node *Prev; /*Previous Node*/ struct Node *Next; /*Next Node*/ }; 其中,Info为一个void类型指针,用来指向该节点的数据(int型或float型)或者运算符(char型)的地址;InfoType标记本节点存放的是数据或者是运算符,可以取’I’(整形)、’F’(浮点型)、’O’(运算符);Prev和Next分别指向本节点的前一个节点和后一个节点。 注意★BreakDown分离出的数据都为正数,算式中负数的’-’作为单目运算符处理。 -2-递归函数的结构 递归函数Caculate声明如下: void *Caculate(struct Node *StackFormula,char *ResultType) 入口参数为链表中的一个节点,返回值为void类型的指针,以及返回数据的类型(整形或者浮点型)。由于要返回两个值比较麻烦(可以定义一个结构,设定返回值为结构类型),所以在函数调用前,先定义一个字符型数据,将该数据地址作为Caculate函数的一个参数,在函数中对ResultType指向的字符进行更改来达到返回多个量的目的。 在将递归函数进行非递归化的时候,可以将返回数据类型作为堆栈数据结构体的其中一个量即可,具体参看后文。 函数Caculate的逻辑结构如下(省略细节): void *Caculate(struct Node *StackFormula,char *ResultType) { if(StackFormula-InfoType == I || StackFormula-InfoType == F) {/*第一个节点的中存放的数据*/ if(!StackFormula-Next) { 如果第一个节点也是最后一个节点,则将该节点的数据值作为运算返回值。 } else if(StackFormula-Next-InfoType == O) {/*下一个节点为运算符*/ char Op=*(char *)StackFormula-Next-Info; 如果运算符Op是非法运算符,’(’、’)’,或者运算符节点是链表最后一个节点,则提示算式不合法,退出程序。 if(Op == + || Op == -) { 运算符为’+’、’-’时,该运算符后如果为运算符的话,只能为’+’、’-’、’(’,而且不能与Op相同(不允许”++5”,”--5”,只能“+-+-5”、“-+5”),否则提示出错,退出程序。 /*Op后面是合法的数据或运算符,则计算Op后面部分算式的结果,然后与Op前的节点中的数据进行Op指定的加或减运算,然后返回运算结果*/ tmpResult=Caculate(StackFormula-Next-Next,tmpType); ………… return Result;

文档评论(0)

shaofang00 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档