表达式求值报告.docx
《表达式求值报告.docx》由会员分享,可在线阅读,更多相关《表达式求值报告.docx(11页珍藏版)》请在冰豆网上搜索。
![表达式求值报告.docx](https://file1.bdocx.com/fileroot1/2023-6/4/b724eb19-850d-4dc4-84ca-bed7ff952459/b724eb19-850d-4dc4-84ca-bed7ff9524591.gif)
表达式求值报告
课程设计报告样本
数据结构课程设计报告
题目:
表达式求值
院(系):
计算机工程学院
专业:
计算机科学与技术
班级:
嵌入式109
(1)
学生:
倪利权
指导教师:
寇海洲孙成富
邱军林殷路
2010年12月
目录
一、设计目的1
二、设计内容1
三、程序设计步骤1
四、调试分析9
五、测试结果10
六、课程设计小结:
11
一、设计目的
1、能根据实际问题的具体情况,结合数据结构课程中的基本理论和基本算法,分析并正确确定数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。
2、提高程序设计和调试能力。
学生通过上机实习,验证自己设计的算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
3、初步掌握软件开发过程中问题分析、系统设计、程序编码、测试等基本方法和技能。
4、训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
5、培养根据选题需要选择学习书籍,查阅文献资料的自学能力。
二、设计内容
1、系统名称:
表达式求值
通过屏幕输入加减乘除及括号来实现表达式求值。
2、要求:
(1)当用户输入一个合法的算术表达式后,能够返回正确的结果。
能够计算的运算符包括:
加、减、乘、除、括号;能够计算的操作数要求包括在整数范围内;对于异常的表达式能给出错误的提示。
三、程序设计步骤
1)功能分析说明图:
2)采用主要的数据结构类型。
定义一两个栈一个为存储整数一个存储运算符、全局变量
/*定义字符类型栈*/
typedefstruct{
intstacksize;
char*base;
char*top;
}Stack
/*定义整型栈*/
typedefstruct{
intstacksize;
int*base;
int*top;
}Stack2;
/*-----------------全局变量---------------*/
StackOPTR;/*定义运算符栈*/
Stack2OPND;/*定义操作数栈*/
charexpr[255]="";/*存放表达式串*/
char*ptr=expr;
2、对数据初始化及判断、操作的函数
初始化函数
intInitStack(Stack*s)//构造运算符栈
{
s->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
if(!
s->base)returnERROR;
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
returnOK;
}
intInitStack2(Stack2*s)//构造操作数栈
{
s->base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));
if(!
s->base)returnERROR;
s->stacksize=STACK_INIT_SIZE;
s->top=s->base;
returnOK;
}
对栈中数据存取和删除的函数
intPush(Stack*s,charch)//运算符栈插入ch为新的栈顶元素
{
*s->top=ch;
s->top++;
return0;
}
intPush2(Stack2*s,intch)//操作数栈插入ch为新的栈顶元素
{
*s->top=ch;
s->top++;
return0;
}
charPop(Stack*s)//删除运算符栈s的栈顶元素,用p返回其值
{
charp;
s->top--;
p=*s->top;
returnp;
}
intPop2(Stack2*s)//删除操作数栈s的栈顶元素,用p返回其值
{
intp;
s->top--;
p=*s->top;
returnp;
}
charGetTop(Stacks)//用p返回运算符栈s的栈顶元素
{
charp=*(s.top-1);
returnp;
}
intGetTop2(Stack2s)//用p返回操作数栈s的栈顶元素
{
intp=*(s.top-1);
returnp;
}
对操作符的运算优先级别的定义的函数
/*判断运算符优先权,返回优先权高的*/
charPrecede(charc1,charc2)
{
inti=0,j=0;
staticchararray[49]={
'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=','!
',
'>','>','>','>','!
','>','>',
'<','<','<','<','<','!
','='};
switch(c1)
{
/*i为下面array的横标*/
case'+':
i=0;break;
case'-':
i=1;break;
case'*':
i=2;break;
case'/':
i=3;break;
case'(':
i=4;break;
case')':
i=5;break;
case'#':
i=6;break;
}
switch(c2)
{
/*j为下面array的纵标*/
case'+':
j=0;break;
case'-':
j=1;break;
case'*':
j=2;break;
case'/':
j=3;break;
case'(':
j=4;break;
case')':
j=5;break;
case'#':
j=6;break;
}
return(array[7*i+j]);/*返回运算符*/
}
3、主函数和主要计算函数
intEvalExpr()//主要操作函数
{
charc,theta,x;intn,m;
inta,b;
c=*ptr++;
while(c!
='#'||GetTop(OPTR)!
='#')
{
if(!
In(c))
{if(!
In(*(ptr-1)))ptr=ptr-1;
m=atoi(ptr);//取字符串前面的数字段
n=num(m);
Push2(&OPND,m);
ptr=ptr+n;
c=*ptr++;
}
else
switch(Precede(GetTop(OPTR),c))
{
case'<':
Push(&OPTR,c);
c=*ptr++;
break;
case'=':
x=Pop(&OPTR);
c=*ptr++;
break;
case'>':
theta=Pop(&OPTR);
b=Pop2(&OPND);a=Pop2(&OPND);
Push2(&OPND,Operate(a,theta,b));
break;
}
}
returnGetTop2(OPND);
}
intmain()
{
printf("请输入正确的表达式以'#'结尾:
");
do{
gets(expr);
}while(!
*expr);
InitStack(&OPTR);/*初始化运算符栈*/
Push(&OPTR,'#');/*将#压入运算符栈*/
InitStack2(&OPND);/*初始化操作数栈*/
printf("表达式结果为:
%d\n",EvalExpr());
return0;
}
四、调试分析
调试的过程中,对程序做了几点改进,增加了程序的容错能力,不论用户输入什么内容,程序都能安全检查。
每次输入以#为结束。
本习题是对栈的经典应用需理解栈的存储结构和数据操作,同时要有清晰的思路分析。
五、测试结果
进入演示程序后,即显示主界面为:
输入一串表达式字符
输出结果
六、课程设计小结:
通过本次课程设计自己感觉编程水平有了一定程度上的提高尤其对数据、有更深层次的理解本次设计遇到了相当大的困难尤其是如何对输入的字符、数据之间的判断、但是在查阅资料后问题顺利解决虽然程序顺利编译是还是有两个警告可能和指针有关,说明还是要注重基础知识的应用,还有程序的层次必须要清晰,明白了在本课程设计开始之前对整个程序要有整体上的把握,搭建好框架,然后再详细实现每个模块所实现的功能这次课程设计的界面不是很友好,原本计划是用c#来实现窗口应用程序的但是由于c#中没有指针所以放弃。
通过本次课程设计发现自己存在严重的不足,在今后的学习中应该更加努力地学习,在实践中不断完善自己。