XX学
数结构
课程设计说明书
题目 表达式求值
院 系: 计算机科学工程学院
专业班级: 计算机班
学 号:
学生姓名:
指导教师:
2013年 X 月X 日
XX学课程设计(文)务书
计算机科学工程 学院
学 号
学生姓名
专业(班级)
设计题目
表达式求值
设
计
技
术
参
数
系统台:Windows 7Windows XP
开发工具:VC++60
设
计
求
(1)够计算运算符包括:加减圆括号
(2)够计算数求实数范围
(3)执行重括号嵌套运算
(4)异常表达式出错误提示
工
作
量
课程设计报告求少3000字
源程序求少300行
工
作
计
划
201311211201 根课程设计纲求查找相关资料完成需求分析
201312021216 进行系统概设计
201312171231 进行系统详细设计源代码书写
201401010117 系统进行调试分析写出课程设计报告
参
考
资
料
[1]钦铭编C语言程序设计北京:高等教育出版社2007
[2]谭浩强编著C程序设计(第四版)北京:清华学出版社2008
[3]严蔚敏吴伟民编著数结构(C语言版)北京:清华学出版社2007
[4]严蔚敏吴伟民编著数结构题集 北京:清华学出版社2007
指导教师签字
教研室签字
2013年 X月 X 日
学生姓名: 学号: 专业班级:
课程设计题目: 表达式求值
指导教师评语:
成绩:
指导教师:
年 月 日
XX学课程设计(文)成绩评定表
目 录
1 需求分析 1
2 概设计 1
21 设计思路 1
22 存储结构设计 1
23 功模块设计 1
3 详细设计 1
4 运行测试 1
5总结 1
参考文献 2
(求:出级目录二级目录宋体四号字15倍行距页码罗马数字居中)
(报告正文部分):
(求:正文部分律四号字宋体行距20磅级标题左加粗二级标题左加粗正文页码单独开始阿拉伯数字编码居中)
1 需求分析
1程序达功:够处理字符序列形式输入含变量实数表达式正确处理数判断表达式语法正确正确实现算术四混合运算表达式求值
2输入形式输入值范围:字符串形式输入表达式#结束
3输出形式:计算程中遇问题终答案显示屏幕
4测试数:输入3*(72)#时输出15000000测试正确输入(92)#时输出输入错误测试正确
2 概设计
21 设计思路
实现算符优先算法两工作栈称OPTR寄存运算符称作OPND寄存操作数运算结果算法基思想:
(1)首先置非运算符栈空栈表达式起始符# 运算符栈栈底元素
(2)次读入表达式中字符非运算符进OPND栈运算符OPTR栈栈顶运算符较优先权做相应操作直整表达式求值完毕(OPTR栈栈顶元素前读入字符均#)
算法中调两函数中Precede判定运算符栈顶运算符a读入运算符b间优先关系函数Operate进行二元运算a theta b函数果编译表达式产生运算组相应指令返回存放结果中间变量名果解释执行表达式直接进行该运算返回运算结果
22 存储结构设计
表达式操作符运算符界限符组成需两栈char类型栈寄存运算符int类型栈寄存非运算符
定义结点元素结构(存放运算符)
typedef struct charstack
{
char *base
char *top
int stacksize
}SqStackchar
定义结点元素结构(存放非运算符)
typedef struct intstack
{
float *base
float *top
int stacksize
}SqStackint
23 功模块设计
1栈基功:
(1) InitStackchar(Stackchar &S):构造运算符栈
(2) InitStackint(Stackint &S):构造非运算符栈
(3) Pushchar(SqStackchar &Schar e):运算符栈插入元素e新栈顶元素
(4) Pushint(SqStackint &Sfloat e):非运算符栈插入元素e新栈顶元素
(5) Popchar(SqStackchar &Schar &e): 删运算符栈S栈顶元素e返回值
(6) Popint(SqStackint &Sfloat &e):删非运算符栈S栈顶元素e返回值
(7) GetTopchar(SqStackchar S):e返回运算符栈S栈顶元素
(8) float GetTopint(SqStackint S) e返回操作数栈S栈顶元素
2功分析:
(1) Xiaoshu(char c)计算数
(2) Precede(char achar b) 判断运算符优先权功算符间优先关系见表1:
表1 算符间优先关系
+
*
(
)
#
+
>
<
<
<
<
>
>
>
>
<
<
<
>
>
*
>
>
>
>
<
>
>
>
>
>
>
<
>
>
(
<
<
<
<
<
)
>
>
>
>
>
>
#
<
<
<
<
<
(3) Operate(float achar thetafloat b) 操作数应运算符进行运算功运算结果直接返回
3 详细设计(程序源代码)
#include
#include
#define MAXSIZE 100 存储空间初始分配量
#define STACKINCREMENT 10 存储空间分配增量
typedef struct charstack
{
char *base 栈构造前base值NULL
char *top 栈顶指针
int stacksize 前已分配存储空间元素单位
}SqStackchar 定义结点元素结构(存放运算符)
typedef struct intstack
{
float *base 栈构造前base值NULL
float *top 栈顶指针
int stacksize 前已分配存储空间元素单位
}SqStackint 定义结点元素结构(存放非运算符)
int InitStackchar(SqStackchar &S){
构造空栈(存放非运算符)
Sbase(char *)malloc(MAXSIZE * sizeof(char))
if(Sbase)
return 0 存储分配失败
StopSbase 空栈
SstacksizeMAXSIZE
return 1
}
int InitStackint(SqStackint &S){
构造空栈(存放运算符)
Sbase(float *)malloc(MAXSIZE * sizeof(float))
if(Sbase)
return 0 存储分配失败
StopSbase 空栈
SstacksizeMAXSIZE
return 1
}
int Pushchar(SqStackchar &Schar e){
元素进运算符栈
if(StopSbase>Sstacksize){ 栈满追加存储空间
Sbase(char *)realloc(Sbase(Sstacksize+STACKINCREMENT)*sizeof(char))
if(Sbase)
return 0 存储分配失败
StopSbase+Sstacksize sbase原值
Sstacksize+STACKINCREMENT
}
*Stop++e 元素入栈栈顶指针增1
return 1
}
int Pushint(SqStackint &Sfloat e){
元素进非运算符栈
if(StopSbase>Sstacksize){ 栈满追加存储空间
Sbase(float *)realloc(Sbase(Sstacksize+STACKINCREMENT)*sizeof(float))
if(Sbase)
return 0 存储分配失败
StopSbase+Sstacksize sbase原值
Sstacksize+STACKINCREMENT
}
*Stop++e 元素入栈栈顶指针增1
return 1
}
char GetTopchar(SqStackchar S){
取栈顶元素(存放运算符栈顶元素)
char e
if(StopSbase)
return 0
e*(Stop1) 栈身改变
return e
}
float GetTopint(SqStackint S){
取栈顶元素(存放非运算符栈顶元素)
float e
if(StopSbase)
return 0
e*(Stop1) 栈身改变
return e
}
int Xiaoshu(char c)
{
if(c>48&&c<57)
{
c48
return c
}
else
return 0
}
int Popchar(SqStackchar &Schar &e){
出栈(运算符)
if(StopSbase)
return 0
e*Stop 栈顶指针减1取出前指元素
return 1
}
int Popint(SqStackint &Sfloat &e){
出栈(非运算符)
if(StopSbase)
return 0
e*Stop 栈顶指针减1取出前指元素
return 1
}
char Precede(char achar b){
判断运算符栈栈顶元素读入运算符间优先关系函数
char c
if(a'+'||a'')
{
if(b'*'||b''||b'(')
return c'<'
else
return c'>'
}
else if(a'*'||a'')
{
if(b'(')
return c'<'
else
return c'>'
}
else if(a'(')
{
if(b')')
return c''
else if(b'#')
{
printf( )
exit(0)
}
else
return c'<'
}
else if(a')')
{
if(b'(')
{
printf( )
exit(0)
}
else
return c'>'
}
else if(a'#')
{
if(b'#')
return c''
else if(b')')
{
printf( )
exit(0)
}
else
return c'<'
}
}
float Operate(float achar thetafloat b){
执行相应运算操作
float c
switch(theta)
{
case '+'ca+b
break
case ''cab
break
case '*'ca*b
break
case ''if(b0)cab
else
printf(输入错误\n)
break
}
return c
}
void main()
{
SqStackchar OPTR
SqStackint OPND
float ab
int sum0
int m1
float f
char cxtheta
InitStackchar(OPTR)
Pushchar(OPTR'#')
InitStackint(OPND)
printf(\n)
printf(*************学号:2012303038**************\n)
printf(\n)
printf(*************课程设计:表达式求值**********\n)
printf(\n)
printf(请输入表达式'#'结尾\n)
cgetchar()
if(c35||(c>40&&c<43)||c45||(c>47&&c<57))
{
while(c'#'||GetTopchar(OPTR)'#')
{
if(Xiaoshu(c))
{
sumsum*10+Xiaoshu(c)
cgetchar()
while(Xiaoshu(c)||c'')
{
if(c'')
{
cgetchar()
while(Xiaoshu(c))
{
m*10
sumsum*10+Xiaoshu(c)
cgetchar()
}
}
else
{
sumsum*10+Xiaoshu(c)
cgetchar()
}
}
fsum(float)m
Pushint(OPNDf)
sum0
m1
} 运算符进栈
else
{
switch(Precede(GetTopchar(OPTR)c))
{
case '<' 栈顶元素优先权低
{
Pushchar(OPTRc)
cgetchar()
break
}
case '' 拖脱括号接受字符
{
Popchar(OPTRx)
cgetchar()
break
}
case '>' 退栈运算结果进栈
{
Popchar(OPTRtheta)
Popint(OPNDb)
Popint(OPNDa)
Pushint(OPNDOperate(athetab))
break
}
}
}
}
printf( f\nGetTopint(OPND))
}
else
printf(输入错误\n)
}
4 运行测试
1.加法测试输入正确输出正确测试正确:
2.减法测试输入正确输出正确测试正确:
3.法测试输入正确输出正确测试正确:
3.法测试输入正确输出正确测试正确:
4.输入表达式正确输出正确测试正确:
5.输入表达式错误正确判断测试正确:
5总结
通段时间课程设计计算机应数结构作C语言更深解然遇少问题正国问题引发思考带收获初喜欢机写程序现动写程序初着程序知手现知道分析问题专业知识解决实际问题转变发现专业知识动手力程度提高实际机操作程中仅解数结构理知识更重培养解决实际问题力续课程学实践良基础
次课程设计更加解学C语言学期学数结构紧密联系设计题目仅求设计者课知识较深刻解时较强思维动手力
次课程设计深刻体会:严谨编程需严谨检查错误某括号分号引号等应该犯错方程序设计时难免遇错误坏事情发现薄弱环节具体操作中巩固学C语言数结构更加体会C语言语句简洁灵活执行效率高等特点
外注意:报告中图表格式求
(1)正文中图表规范图号图题图方正中五号字表号表题表格方正中五号字图编号图1开始表编号表1开始
(2)表格文字宋体五号字加粗
(3)正文中应图表引图引:图*示表引:见表*
:
图:
图1 图题
表:
表1 表题
容
字体
段落
行间距
字间距
表格文字
宋体五号
居中
1倍
标准
参考文献
[1] 刘国钧陈绍业王凤翥 图书馆目录[M] 北京:高等教育出版社1957
(求五号字宋体单倍行距作者书名点:
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档