网站大量收购独家精品文档,联系QQ:2885784924

求复杂表达式的值程设计报告.docVIP

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

本科课程设计(报告)

数据结构课程设计

求复杂表达式的值

1.问题描述:

输入一个含有运算符和运算函数的表达式,计算其结果

2.程序结构(程序中的函数调用关系图)

intleftpri(charop);//求左运算符op的优先级

intrightpri(charop);//求右运算符op的优先级

boolInOp(charch);//判断ch是否为运算符

intPrecede(charop1,charop2);//op1和op2运算符优先级的比较结果

voidtrans(char*exp,charpostexp[]);//将算术表达式exp转换成后缀表达式postexp

doublecompvalue(char*postexp);//计算后缀表达式postexp的值

intmain();//主函数

主函数

主函数

main

计算后缀表达式的值函数

compvalue

将中缀表达式转后缀表达式的函数

trans

比较优先级的函数

Precede

求左运算符优先级函数

Leftpri

求左运算符优先级函数

Rightpri

判断是否为运算符函数

InOp

程序中各函数原型和函数功能描述

intleftpri(charop);//求左运算符op的优先级

intrightpri(charop);//求右运算符op的优先级

boolInOp(charch);//判断ch是否为运算符

intPrecede(charop1,charop2);//op1和op2运算符优先级的比较结果

voidtrans(char*exp,charpostexp[]);//将算术表达式exp转换成后缀表达式postexp

doublecompvalue(char*postexp);//计算后缀表达式postexp的值

intmain();//主函数

主要算法及数据结构描述(算法可用伪代码或流程图描述)

主要算法描述:

中缀表达式转后缀表达式

在原支持“+,-,*,/”的正整数合法算术表达式求值的基础上,本程序需要增加一些功能。

原来的运算符优先级表为:

运算符/函数

=

(

+

-

*

/

)

识别标志

=

(

+

-

*

/

)

lprich(ch)

0

1

3

3

5

5

6

rpri(ch)

0

6

2

2

4

4

1

识别实数

实数与原来的正整数比有两点不同:一是有负数,二是有小数。负数识别问题可以在输入的时候以(0-x)输入代替负数输入的方式直接解决。而小数的识别问题,这里的解决方式为把小数点“.”看成一个优先度仅次于右括弧“)”的运算符。运算符“.”为一个双目运算符,“a.b”表示把b循环除以10直到小于1再加上a而得到的值。

识别运算符“%”和“^”

这两个运算符与之前的运算符类似都是双目运算符,求模运算符“%”的优先级与“*”和“/”相等;乘方运算符“^”优先级应该高于“*”、“/”、“%”而低于右括弧“)”。据此可以拓展运算符优先级表,然后在用简单的语句实现“%”和“^”(a^b相当于b个a连续相乘)的功能。

识别并处理运算符“!”

此运算符优先级高于“^”,低于小数点“.”,据此可以拓展优先级表。

识别函数sin,cos,tan,abs,sqrt,exp,ln

根据一般认知,这些函数应该优先度相等且高于“!”低于“.”,据此可以继续拓展优先级表。在优先级表的存储过程中分别用“a”,“r”,“e”,“l”,“s”,“c”,“t”,代表“abs”,“sqrt”,“exp”,“ln”,“sin”,“cos”,“tan”。在表达式录入的过程中,当遇到字符“a”,“e”,“l”,“s”,“c”,“t”(不含r),先判断是否是函数,再确定是哪一种函数,然后把表示该函数的字符进运算符栈,最后指针前移函数名长度位置继续读取下一字符

最终我们可以得到最终的优先级表

运算符/函数

=

(

+

-

*

/

%

^

!

abs

sqrt

exp

ln

sin

cos

tan

.

)

识别标志

=

(

+

-

*

/

%

^

!

a

r

e

l

s

c

t

.

)

lprich(ch)

0

1

3

3

5

5

5

7

9

11

11

11

11

11

11

11

13

14

rpri(ch)

0

14

2

2

4

4

4

6

8

10

10

10

10

10

10

10

12

1

后缀表达式求值

原来的后缀表达式求值方式保持不变,添加以下内容:

求模运算符“%”

与除法的情况类似。

次方运算符“^”

a^b=a*a*a*a*……*a(b个a)

阶乘运算符“!”

这个运算符与前面的运算符不同,是一个单目运算符。在处理运算的时候其他运算符一次出栈两个运算数,进行运算然后进栈;而“!”

文档评论(0)

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

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

1亿VIP精品文档

相关文档