算术表达式实验报告.docx
《算术表达式实验报告.docx》由会员分享,可在线阅读,更多相关《算术表达式实验报告.docx(9页珍藏版)》请在冰豆网上搜索。
算术表达式实验报告
本科学生综合性实验报告
项目组长:
学号:
成员:
专业:
计算机科学与技术班级:
B02
实验项目名称算术表达式求值
指导教师及职称:
开课学期2011-2012学年第一学期
上课时间2011年10月15日-2011年11月5日
一、实验设方案
实验名称:
算术表达式求值
实验时间:
2010年10月15日
小组合作:
是●否○
小组成员:
0103356吴荣福0103316倪志鹏
1、实验目的
实验目的:
写代码来计算算术表达式
2、实验思路(实验内容、数据处理方法及实验步骤等)
#include
#include
#include
#definesize100
#defineaddsize20
typedefintselemtype;
typedefintstatus;
typedefstruct{
selemtype*base;
selemtype*top;
intstacksize;
}sqstack;
//构造空栈
statusinitstack(sqstack&l){
l.base=(selemtype*)malloc(size*sizeof(selemtype));
if(!
l.base)exit(0);
l.top=l.base;
l.stacksize=size;
return1;
}
//返回栈顶元素
statusgettop(sqstacks)
{
selemtypee;
if(!
s.top)return0;
e=*(s.top-1);
returne;;
}
//进栈
statuspush(sqstack&l,selemtypee){
if(l.top-l.base>=l.stacksize){
l.base=(selemtype*)realloc(l.base,l.stacksize+addsize*sizeof(selemtype));
if(!
l.base)exit(0);
l.top=l.base+l.stacksize;
l.stacksize+=addsize;
}
*l.top++=e;
return1;
}
//出栈
statuspop(sqstack&l,selemtype&e){
if(l.top==l.base)return0;
e=*--l.top;
returne;
}
//判断是不是运算符
statusischar(charc){
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='#'||c=='('||c==')')
return1;
else
return0;
}
//判断优先级
charyouxian(charm,charn){
inta,b;
switch(m)
{
case'+':
case'-':
a=6;break;
case'*':
case'/':
a=9;break;
case'(':
a=5;break;
case'#':
a=-1;break;
}
switch(n)
{
case'+':
case'-':
b=7;break;
case'*':
case'/':
b=8;break;
case')':
b=5;break;
case'(':
b=7;break;
case'#':
b=-1;break;
}
if(a>b)
return'>';
if(a
return'<';
else
return'=';
}
//计算函数
selemtypeoperate(selemtypea,selemtypem,selemtypeb){
selemtypes;
switch(m){
case'+':
s=(a+b);
break;
case'-':
s=(a-b);
break;
case'*':
s=(a*b);
break;
case'/':
s=(a/b);
break;
}
returns;
}
//主函数
voidmain(){
charch[5];
ch[0]='Y';
do{
printf("输入:
\n");
sqstacka,b;
charc;
selemtypex,y,theta;
initstack(a);push(a,'#');
initstack(b);c=getchar();
while(c!
='#'||gettop(a)!
='#'){
if(!
ischar(c)){
push(b,c-'0');
c=getchar();
}
else{
switch(youxian(gettop(a),c)){
case'<':
push(a,c);
c=getchar();
break;
case'=':
pop(a,x);
c=getchar();
break;
case'>':
pop(a,theta);
pop(b,y);
pop(b,x);
push(b,operate(x,theta,y));
break;
}
}
}
getchar();
printf("结果是:
");
printf("%d\n",gettop(b));
printf("是否继续(Y/N):
");
gets(ch);
}while(ch[0]=='Y'||ch[0]=='y');
printf("*************************\n");
}
指导老师对实验设计方案的意见
指导老师签名:
年月日
二、实验结果与分析
1、实验目的、实验思路。
实验目的:
计算算术表达式;
实验思路:
把一个算术表达式分解成数字和运算符,而把数字和运算符分别进入两个栈中,再考虑到运算符的优先级而进行相对应的计算;最终得到结果。
2、实验现象、数据及结果
3、对实验现象、数据及观察结果的分析与讨论
首先每个表达式都是以‘#’来结尾的,正如上面的实验结果所示,该程序满足‘+’‘—’‘*’‘/’‘()’等各种运算,并且对于各种运算符的结合也同样适用,总体来说,该程序还是不错的。
4、结论
该程序对于加减乘除等各种运算还是比较实用,总体上说来还可以
5、实验总结
(1)首先对于任意一个实验,每个实验都有它的原理,想把实验完成必须弄懂理解原理是怎么样的,遇到不懂得问题可以问老师、同学还可以查网络;
(2)在运行程序时,遇到错误是不可避免的,遇到错误要认真分析,一个一个解决。
(3)完成实验最重要的一点就是合作,懂得合作才是关键。
1次实验成败之处及其原因分析
成败之处:
首先我认为该实验是成多而败少,因为他是我们的团队小组共同完成的成果,而败就是我们花的时间还是长了点,效率还得提高。
分析:
实验的最终目的不仅仅是完成实验,同时也是对我们学生的一种考验,我和我的团队成员,一起努力,最终完美的完成实验。
2实验的关键环节及改进措施
做好本实验需要把握的关键环节
1.首先是对实验原理的把握
2.其次是对栈的各种用法的掌握
3.再者对各种运算符的优先级的表示
若重做本实验,为实现预期效果,实验步骤应如何改善
如果说本次实验还有要改善的那就是时间观念要得到加强,效率得提高。
3实验的自我评价:
1.自我评价:
首先总体上说来本次实验中我们的表现还是不错的,但是还是有要改进的地方,比如说:
遇到问题的时候不要着急,要认真分析其中的原因,再解决它。
2.再次就是还要更加注重团队问题。
指导老师评语及得分:
签名:
年月日