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