表达式求值.docx
《表达式求值.docx》由会员分享,可在线阅读,更多相关《表达式求值.docx(15页珍藏版)》请在冰豆网上搜索。
![表达式求值.docx](https://file1.bdocx.com/fileroot1/2022-11/23/5f14a60d-c85e-42af-9c95-950f15cd43a8/5f14a60d-c85e-42af-9c95-950f15cd43a81.gif)
表达式求值
课程设计报告
课程名称数据结构
课题名称表达式求值
专业计算机科学与技术
班级0901
学号200903010102
姓名覃宇星
指导教师李珍辉邓作杰郭芳
2011年7月7日
湖南工程学院
课程设计任务书
课程名称C语言程序设计
课题表达式求值
专业班级计算机0901
学生姓名
学号
指导老师周铁山
审批
任务书下达日期2011年6月23日
任务完成日期2011年7月7日
《数据结构课程设计》
一、课程设计的性质和目的
数据结构课程设计是计算机专业的专业课程,通过课程设计使学生进一步巩固课堂所学知识,全面熟悉、掌握数据结构的基本设计方法和技巧,进一步提高分析问题、解决问题及上机操作能力,为将来从事计算机工作打下一定的专业基础。
二、设计课题
课题一:
迷宫问题
详细内容见后
课题二:
马踏遍棋盘问题
详细内容见后
课题三:
表达式求值问题
详细内容见后
课题四:
B+树的实现
详细内容见后
三、课程设计报告要求
课程设计报告每人一份,必须包含如下几个方面的内容:
1.基本设计思想;2.主要数据结构;3.主要实施流程;4.所有源代码;
5.课程设计总结与体会。
四、分组及选题办法
1、一人一组。
2、若选择课题四,则只需完成一题即可;否则,必须至少完成前三个课题中的任意两个。
3、成绩考核按个人课题完成情况、设计报告质量及对课程设计的态度等综合评定。
五、设计进度安排
1、讲课及上机调试时间安排:
各班具体时间另行安排
2、其余时间:
查阅资料,确定方案,设计课题相关程序。
3、分组答辩,交课程设计报告。
设计课题三:
表达式求值问题
一、问题提出
在高级语言程序中出现的数学表达式要进行求值运算,本课程设计要求模拟编译程序的求值过程,利用栈这种数据结构,对包含四则算术运算及多重括号及常量的表达式进行求值运算。
二、设计要求
1.一次性输入一个表达式,包含数值常量、四则算术运算符、括号等。
2.能输出表达式的正确结果。
1.输入输出界面清晰明了。
三、设计提示
1.可用两个栈(操作数栈和运算符栈)来存储运算过程中的原始数据及中间结果。
2.运算过程中要将输入的数字型字符转化为数值。
3.可以利用一个函数返回运算符之间的优先关系;也可将一个运算符放入一个一维数组,并根据运算符在该数组中的位置建立一个二维数组,存放运算符之间的优先关系。
目录
一.流程图……………………………………………………………vi
二.基本设计思想……………………………………………………vii
三.主要数据结构……………………………………………………vii
四.主要实施流程……………………………………………………vii
五.运行结果举例……………………………………………………vii
六.源代码………………………………………………………………ix
七.课程设计总结与体会………………………………………………xvi
八.评分表………………………………………………………………xvii
一.流程图
二.基本设计思想:
1.可用两个栈(操作数栈和运算符栈)来存储运算过程中的原始数据及中间结果。
2.运算过程中要将输入的数字型字符转化为数值。
3.可以利用一个函数返回运算符之间的优先关系;也可将一个运算符放入一个一维数组,并根据运算符在该数组中的位置建立一个二维数组,存放运算符之间的优先关系。
三.主要数据结构:
Shuzizifu两个栈;
四.主要实施流程:
一次性输入一个表达式,包含数值常量、四则算术运算符、括号,中括号大括号等。
通过push(分别把数字和字符入站)gettop(分别取数字和字符两个栈顶元素)top(分别读数字和字符两个栈顶元素)in(判断是否为数字还是字符)compare(比较运算符的优先级)jisuan(四则运算)ExpEvaluation(对表达式进行总体运算)等函数进行计算并得出结果
五.运行结果举例
进入主菜单,选1
输入表达式,并计算结果显示出来(带中括号)
输入表达式,并计算结果显示出来(带大括号)
输入2程序结束
六.源代码:
/*头文件haha.h*/
#include"stdio.h"
#defineM100
typedefstruct
{intt1[M];
inttop;
}shuzi;
intPush1(shuzi*p,intx)
{if(p->top==M-1)
return(0);
p->top++;
p->t1[p->top]=x;
return
(1);}
intgettop1(shuzi*p,int*x)
{if(p->top==-1)/*将栈S的栈顶元素弹出,放到x所指的存储空间中*/
return(0);
else
{*x=p->t1[p->top];
p->top--;/*修改栈顶指针*/
return
(1);}
}
intTop1(shuzi*p,int*x)//将栈S的栈顶元素弹出,放到x所指的存储空间中,但栈顶指针保持不变
{if(p->top==-1)/*栈为空*/
return(0);
else
{*x=p->t1[p->top];
return
(1);}
}
typedefstruct
{chart2[M];
inttop;
}zifu;
charPush2(zifu*s,charx)
{if(s->top==M-1)
return(0);
s->top++;
s->t2[s->top]=x;
return
(1);}
chargettop2(zifu*s,char*x)/*将栈S的栈顶元素弹出,放到x所指的存储空间中*/
{if(s->top==-1)
return(0);
else
{*x=s->t2[s->top];
s->top--;
return
(1);}
}
intTop2(zifu*s,char*x)//将栈S的栈顶元素弹出,放到x所指的存储空间中,但栈顶指针保持不变
{if(s->top==-1)
return(0);
else
{*x=s->t2[s->top];
return
(1);}
}
intIn(charch)
{if(ch=='+')
return1;
elseif(ch=='-')
return1;
elseif(ch=='*')
return1;
elseif(ch=='/')
return1;
elseif(ch=='(')
return1;
elseif(ch==')')
return1;
elseif(ch=='[')
return1;
elseif(ch==']')
return1;
elseif(ch=='{')
return1;
elseif(ch=='}')
return1;
elseif(ch=='#')
return1;
elsereturn0;}
charCompare(charx,charch)
{switch(x)
{
case'+':
if(ch=='+'||ch=='-'||ch==')'||ch==']'||ch=='}'||ch=='#')
return'>';
elseif(ch=='*'||ch=='/'||ch=='('||ch=='{'||ch=='[')
return'<';
break;
case'-':
if(ch=='+'||ch=='-'||ch==')'||ch=='#'||ch==']'||ch=='}')
return'>';
elseif(ch=='*'||ch=='/'||ch=='('||ch=='['||ch=='{')
return'<';
break;
case'*':
if(ch=='('||ch=='['||ch=='{')
return'<';
else
return'>';
break;
case'/':
if(ch=='('||ch=='['||ch=='{')
return'<';
else
return'>';
break;
case'(':
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='(')
return'<';
elseif(ch==')')
return'=';
elseif(ch=='#'||ch=='['||ch==']'||ch=='{'||ch=='}')
return'0';
break;
case')':
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch==')'||ch=='#'||ch==']'||ch=='}')
return'>';
elseif(ch=='('||ch=='['||ch=='{')
return'0';
break;
case'[':
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='(')
return'<';
elseif(ch=']')
return'=';
elseif(ch=='#'||ch=='{'||ch=='}'||ch=='['||ch==')')
return'0';
case']':
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='#'||ch=='}')
return'>';
elseif(ch=='('||ch=='['||ch=='{'||ch==')'||ch==']')
return'0';
break;
case'{':
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch=='[')
return'<';
elseif(ch='}')
return'=';
elseif(ch=='#'||ch==')'||ch==']'||ch=='{')
return'0';
case'}':
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='#')
return'>';
elseif(ch=='('||ch=='['||ch=='{'||ch==')'||ch==']'||ch=='}')
return'0';
break;
case'#':
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch=='['||ch=='{')
return'<';
elseif(ch=='#')
return'=';
elseif(ch==')'||ch==']'||ch=='}')
return'0';
break;
default:
return'0';
break;
}
}
intjisuan(inta,charc,intb)
{
switch(c)
{
case'+':
return(a+b);
break;
case'-':
return(a-b);
break;
case'*':
return(a*b);
break;
case'/':
return(a/b);
break;}
}
/*执行文件*/
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#include"haha.h"
intExpEvaluation()/*计算*/
{charch;
charx,y;
charc;
inta,b,v;
shuzi*p;
zifu*s;
p=(shuzi*)malloc(sizeof(shuzi));
s=(zifu*)malloc(sizeof(zifu));
p->top=-1;
s->top=-1;
Push2(s,'#');
Top2(s,&y);
printf("\nPleaseinputanexpression(Endingwith#):
\n");
fflush(stdin);
ch=getchar();
while(ch!
='#'||y!
='#')/*Top()通过函数值返回栈顶元素*/
{
if(!
In(ch))/*不是运算符,是运算数*/
{inttemp;
temp=ch-'0';/*将字符转换为十进制数*/
fflush(stdin);
ch=getchar();
while(!
In(ch))//用ch逐个读入运算数的各位数码,并转化为十进制数temp
{temp=temp*10+ch-'0';//将逐个读入运算数的各位转化为十进制数
fflush(stdin);
ch=getchar();}
Push1(p,temp);
}
else
switch(Compare(y,ch))
{
case'<':
Push2(s,ch);
fflush(stdin);
ch=getchar();
break;
case'=':
gettop2(s,&x);
fflush(stdin);
ch=getchar();
break;
case'>':
gettop2(s,&c);
gettop1(p,&b);
gettop1(p,&a);
v=jisuan(a,c,b);/*对a和b进行c运算*/
Push1(p,v);
break;
}
Top2(s,&y);
}
Top1(p,&v);
return(v);
}
voidmain()
{intg=1,h,k;
while(g)
{
printf("---------------------主菜单----------------------------\n\n");
printf("---------------------1表达式输入计算并输出结果------------\n");
printf("---------------------2退出程序------------------------\n");
printf("输入对应的序列号:
\n");
scanf("%d",&h);
switch(h)
{
case1:
system("CLS");
k=ExpEvaluation();
printf("计算结果为:
%d\n\n",k);
break;
case2:
g=0;break;
default:
g=0;}
}
}
七.课程设计总结与体会:
这次的课程设计,遇到的问题颇多,比如走不出循环,没吃掉前面的字符,或者根本没进入循环等等,遇到问题后,就着手解决了,通过不断的努力和坚持,终于解决了以上问题,努力才有收获。
计算机科学与技术系课程设计评分表
课题名称:
表达式求值
项目
评价
设计方案的合理性与创造性
设计与调试结果
设计说明书的质量
答辩陈述与回答问题情况
课程设计周表现情况
综合成绩
教师签名:
日期:
(注:
1.此页附在课程设计报告最后一页;2.综合成绩按优、良、中、及格和不及格五级评定。
)