表达式求值课程设计数据结构C语言版.docx

上传人:b****6 文档编号:3020101 上传时间:2022-11-17 格式:DOCX 页数:21 大小:124.33KB
下载 相关 举报
表达式求值课程设计数据结构C语言版.docx_第1页
第1页 / 共21页
表达式求值课程设计数据结构C语言版.docx_第2页
第2页 / 共21页
表达式求值课程设计数据结构C语言版.docx_第3页
第3页 / 共21页
表达式求值课程设计数据结构C语言版.docx_第4页
第4页 / 共21页
表达式求值课程设计数据结构C语言版.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

表达式求值课程设计数据结构C语言版.docx

《表达式求值课程设计数据结构C语言版.docx》由会员分享,可在线阅读,更多相关《表达式求值课程设计数据结构C语言版.docx(21页珍藏版)》请在冰豆网上搜索。

表达式求值课程设计数据结构C语言版.docx

表达式求值课程设计数据结构C语言版

课程设计报告

课程设计题目:

表达式求值

姓名胡*其

学号20162018****

班级*****17Z

指导教师徐**

2017年12月30日

东华理工大学

课程设计评分表

学生姓名:

胡*其班级:

*****17Z学号:

20162018****

课程设计题目:

表达式求值

项目内容

满分

实评

能结合所学课程知识、有一定的能力训练。

符合选题要求

(1人一题)

10

工作量适中,难易度合理

10

能熟练应用所学知识,有一定查阅文献及运用文献资料能力

10

理论依据充分,数据准确,公式推导正确

10

能应用计算机软件进行编程、资料搜集录入、加工、排版、制图等

10

能体现创造性思维,或有独特见解

10

总体设计正确、合理,各项技术指标符合要求。

10

说明书综述简练完整,概念清楚、立论正确、技术用语准确、结论严谨合理;分析处理科学、条理分明、语言流畅、结构严谨、版面清晰

10

设计说明书栏目齐全、合理,符号统一、编号齐全。

 格式、绘图、表格、插图等规范准确,符合国家标准

10

有一定篇幅,字符数不少于5000

10

总分

100

指导教师评语:

指导教师签名:

年月日

四.结构分析:

1

4.1用于存储操作数和运算结果(Sfloat)1

五.实现流程3

5.1程序主流程图3

5.2求值操作流程3

六.个性功能介绍4

七.部分问题及解决方案5

7.1不能进行带有小数点的数的运算5

7.2在输错后,跳回主界面直接提示指令输入错误,重输6

八.课程设计小结7

九.附录一:

部分测试数据7

十.附录二:

源代码7

一、题目:

表达式求值

二、课程设计任务:

要求能输入一个带“()”的任意多位实数的表达式。

要求:

1、有合理的提示;

2、有非法数据的判断;

3、能够进行多次计算。

测试数据及测试结果请在上交的资料中写明;

三、问题分析:

任何一个表达式都是由操作符,运算符组成的。

我们分别用顺序栈来寄存表达式的操作数和运算符。

栈是限定于紧仅在表尾进行插入或删除操作的线性表。

顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素。

为了实现算符优先算法。

可以使用两个栈。

一个称为Schar,用以寄存运算符,另一个称做Sfloat,用以寄存操作数或运算结果。

1.首先置操作数栈为空栈,表达式起始符”#”为运算符栈的栈底元素;

2.依次读入表达式,若是操作符即进Sfloat栈,若是运算符则和Schar栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即Schar栈的栈顶元素和当前读入的字符均为”#”)。

四、结构分析:

1.用于存储操作数和运算结果(Sfloat):

ADTs_float{

数据元素:

此链栈中的所有元素类型为字符型的数字字符

数据关系:

栈中数据元素之间是线性关系。

基本操作:

(1)Init(Sfloat*S);

初始化数字栈

(2)Push(Sfloat*S,floate)

进栈

(3)Pop(Sfloat*S,float*x)

出栈

(4)GetTop(Sfloat*S,float*x)

取栈顶

(5)voidClearStack(Sfloat*S)

清空栈

}ADTs_float

2.用于存储运算符(Schar):

ADTs_char{

数据对象D:

元素类型为字符型的符号字符

数据关系R:

栈中数据元素之间是线性关系。

基本操作:

(1)Init(Schar*S)

初始化字符栈

(2)Push(Schar*S,charx)

进栈

(3)Pop(Schar*S,char*x)

出栈

(4)GetTop(Schar*S,char*x)

取栈顶

(5)ClearStack(Schar*S)

清空栈

}ADTs_char

3.系统中子程序及功能要求:

(1)boolIsFloat(charch)

判断输入的是否为数字

(2)boolIsChar(charch)

判断输入的是否为所需要的字符

(3)floatGetNumber(char*ch)

将字符型数字转化为浮点型

(4)floatOperation(floata,charsign,floatb)

+、-、*、/的基本运算

(5)intCmp(charx,charch)

比较字符的优先级

(6)voidMaster();

程序主功能函数

(7)voidError()

错误提示界面

(8)voidWelcome()

程序欢迎界面

(9)voidEnd()

结束选择界面

五、实现流程

1.程序主流程图

2.求值操作流程

(下例为3*(7-2)的操作流程)

步骤

Schar栈

Sfloat栈

输入表达式

主要操作

1

#

3*(7-2)#

Push(Sfloat,’3’)

2

#

3

*(7-2)#

Push(Schar,’*’)

3

#*

3

(7-2)#

Push(Schar,’(’)

4

#*(

3

7-2)#

Push(Sfloat,’7’)

5

#*(

37

-2)#

Push(Schar,’-’)

6

#*(-

37

2)#

Push(Sfloat,’2’)

7

#*(-

372

)#

Operation(‘7’,’-’,’2’)

8

#*(

35

)#

Pop(Sfloat)

9

#*

35

#

Operation(‘3’,’*’,5’)

10

#

15

#

Return(GetTop(Sfloat))

六、个性功能介绍

在本程序中,通过windows头文件的作用,实现了程序背景色的改变,不在是原本的黑白色,让人看得很新颖。

通过Sleep函数,让程序出错或跳转其它界面时,不是迅速跳过,而是先提示即将跳转,让使用者更方便地了解程序的基本执行过程。

七、实验过程中遇到的部分问题及解决方案

1.不能进行带有小数点的数的运算

①错误运行结果

②解决方案

③解决后运行结果

2.在输入错误后,跳回主界面时直接提示指令输入错误,重新输入。

①解决方案

导致这个的原因是错误后跳回主界面没有清除缓存,所以需要在错误提示函数中添一个fflush(stdin)来刷新当前内存。

②运行结果

八、课程设计小结

通过这次的课程设计,让我更加地了解到C语言和数据结构的魅力。

课程设计不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力,同时这也使我更加了解编程思想和编程技巧。

这次课程设计让我有一个深刻的体会,那就是细节决定成败,编程最需要的是严谨,如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类型上,还有函数或变量命名一般要遵循其默认命名规则。

就像我在写Master()函数时,起初将各种标识符名称设置的乱七八糟,导致我后面自己都对各种变量名的指向的作用都混淆了,后来还浪费了大量的时间进行优化命名,所以说细节很重要。

程序设计时,也不要怕遇到错误,在实际操作过程中犯的一些错误还会有意外的收获,感觉课程设计很有意思。

在具体操作中这学期所学的数据结构的理论知识得到巩固,达到课程设计的基本目的,也发现自己的不足之出,在以后的上机中应更加注意。

以后我们会继续努力,大胆创新,争取能编写出透射着自己思想的程序。

这次课程设计让我们充分认识到了自己的不足,认识到了动手能力的重要性。

我们会在以后的学习中更加努力锻炼自己,提高自己,让自己写出更好更完善的程序,为以后的编程打好基础!

附录一:

部分测试数据

组别

表达式

正确值

1

1.23+4.5*10

46.23

2

1.5*(1+9)-10/5

13

3

-(100-101)/5

0.20

4

1.23.5+6.5*12

错误

5

5+4*1.25)

错误

附录二:

源代码

#include

#include

#include

#defineMAXSIZE20

////////////////////////////////建立字符栈

typedefstruct

{

chararr[MAXSIZE];

inttop;

}Schar;

voidInit(Schar*S)//初始化

{

S->top=-1;

}

intPush(Schar*S,charx)//进栈

{

if(S->top==MAXSIZE-1)

return0;

S->top++;

S->arr[S->top]=x;

return1;

}

intPop(Schar*S,char*x)//出栈

{

if(S->top==-1)

return0;

else

{

*x=S->arr[S->top];

S->top--;

return1;

}

}

intGetTop(Schar*S,char*x)//取栈顶

{

if(S->top==-1)

return0;

else

{

*x=S->arr[S->top];

return1;

}

}

charGetTop(ScharS)

{

charx;

GetTop(&S,&x);

returnx;

}

voidClearStack(Schar*S)//清空栈

{

if(S->top!

=-1)S->top=-1;

}

////////////////////////////////建立数字栈

typedefstruct

{

floatarr[MAXSIZE];

inttop;

}Sfloat;

voidInit(Sfloat*S)//初始化

{

S->top=-1;

}

intPush(Sfloat*S,floate)//进栈

{

if(S->top==MAXSIZE-1)

return0;

else

{

S->top++;

S->arr[S->top]=e;

return1;

}

}

intPop(Sfloat*S,float*x)//出栈

{

if(S->top==-1)

return0;

else

{

*x=S->arr[S->top];

S->top--;

return1;

}

}

intGetTop(Sfloat*S,float*x)//取栈顶

{

if(S->top==-1)

return0;

else

{

*x=S->arr[S->top];

return1;

}

}

floatGetTop(SfloatS)

{

floatx;

GetTop(&S,&x);

returnx;

}

voidClearStack(Sfloat*S)//清空栈

{

if(S->top!

=-1)

S->t

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1