《程序设计方法学》实验报告.docx
《《程序设计方法学》实验报告.docx》由会员分享,可在线阅读,更多相关《《程序设计方法学》实验报告.docx(3页珍藏版)》请在冰豆网上搜索。
《程序设计方法学》实验报告
《程序设计方法学》实验报告
XXXXX大学 《程序设计方法学》实验报告 实验一:
算术表达式求值 学院:
XXX 专业:
计算机科学与技术姓名:
XXX学号:
XXXXX 2010年11月18日 目录 1.前 言.................................................................................................................................12.概要设计.................................................................................................................................1 数据结构设计........................................................................................................................................................................1算法设计..............................................................................................................................................................................1ADT描述.............................................................................................................................................................................2功能模块分析.....................................................................................................................................................................3 3.详细设计.................................................................................................................................3 数据存储结构设计...............................................................................................................................................................3主要算法流程图.................................................................................................................................4 4.测试结果.................................................................................................................................75.
intstacksize;}Stack2; 主要算法流程图 1.Precede(chara1,chara2)判断运算符优先权,返回优先权高的。
算符间的优先关系如下:
+-*/()#+>>>>>>> charPrecede(chara1,chara2){ staticchararray[49]={‘>‘,‘>‘,‘‘,‘>‘,‘>‘,‘>‘,‘‘,‘>‘,‘>‘,‘>‘,‘>‘,‘>‘,‘‘,‘>‘,‘>‘,‘>‘,‘>‘,‘>‘,‘‘,‘>‘,‘ ’>‘,‘>‘,‘>‘,‘>‘,‘!
’,‘>‘,‘>‘, ’ /*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(a2) { /*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]);/*返回运算符array[7*i+j]为对应的c1,c2优先关系*/} 2.SElemTypeEvaluateExpression()主要操作函数。
算法概要流程图:
利用该算法对算术表达式3*(7-2)求值操作过程如下:
步骤12345678910OPTR栈###*#*(#*(#*(-#*(-#*(#*#OPND栈3333737372353515表2 算法伪代码如下:
SElemTypeEvaluateExpression()//主要操作函数 输入字符3*(7-2)#*(7-2)#(7-2)#7-2)#-2)#2)#)#)###主要操作Push(OPND,’3’)Push(OPTR,’*’)Push(OPNR,’(’)Push(OPND,’7’)Push(OPNR,’-’)Push(OPND,’2’)Operate(‘7’,’-’,’2’)Pop(OPTR)Operate(‘3’,’*’,5’)Return(GetTop2(OPND)){//算符表达式的优先算法。
设OPTR和OPND分别为运算符栈和运算数栈SqStackOPTR,OPND;charc; charData[11];//定义此数组为了存放整数或小数SElemTypea,b,d,e; InitStack(OPTR);//构造一个运算符栈InitStack(OPND);//构造一个运算数栈Push(OPTR,’#’);//将#压入栈底c=getchar();GetTop(OPTR,e); while(c!
=‘#’||e!
=‘#’)//栈顶不是#号且输入不是#号{ if(In(c))//是符号则进栈{ switch(Precede(e,c)) { case’ case’=‘:
//脱括号并接受下一字符 Pop(OPTR,e); c=getchar(); break; case’>‘:
//退栈并将运算结果入栈 Pop(OPTR,e); Pop(OPND,b); Pop(OPND,a); Push(OPND,Operate(a,e,b)); break; }//switch} elseif(c>=‘0’&&c while(c>=‘0’&&c { Data[i]=c; i++; c=getchar(); } Data[i]=‘\\0’;//数字没有存满,输入字符串结束符 d=atof(Data);//此处是把数组里的数字,实际上是按字符串;转换为double类型,然后把浮点型数字入栈 Push(OPND,d);//atof函数的形参是指针类型,故用数组名}else{ cout GetTop(OPTR,e);}//while GetTop(OPND,e);returne;} 4.测试结果 1.运行成功后界面。
2.输入正确的表达式后。
5.
SElemType*top;intstacksize;}SqStack; voidInitStack(SqStack&S)//构造一个空栈{ =(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));//分配储存空间if(!
)exit(-1); //空间分配失败=; =STACK_INIT_SIZE; //空间初始分配}//InitStack boolGetTop(SqStackS,SElemType&e) { //若栈不空,则用e返回S的栈顶元素,并返回true;否则返回falseif(==)returnfalse;e=*();returntrue;}//GetTop boolPush(SqStack&S,SElemTypee){ //插入元素为e的新的栈顶元素if(>=){ //栈满,追加存储空间 =(SElemType*)realloc(,(+STACKINCREMENT)*sizeof(SElemType)); if(!
) exit(-1);//存储空间分配失败 =+;//此处内存有可能重新分配,地址有可能会变,此句不能省 +=STACKINCREMENT;} *++=e;//top自增returntrue; }//Push boolPop(SqStack&S,SElemType&e)//若栈不空,则删除S的栈顶元素,用e返回其值{ if(==)returnfalse; e=*--; //删除一个元素,top减一 ?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
returntrue;}//Pop ///////////////////////////////////////////////////////////////////////////////////////////////// /*以下为判断符号优先级的函数*/ charPrecede(chara1,chara2)//判定运算符的优先级。
{ //根据课本p53页的表charr;switch(a2){ case’+’:
//此处于加减几乎优先级一样,故放在一起case’-’:
if(a1==‘(‘||a1==‘#’) r=‘ r=‘>‘; break; case’*’:
//此处于乘除优先级一样,故放在一起case’/’:
if(a1==‘*’||a1==‘/’|