2013年12月实训报告实训小组成员:易鑫邹恒锐祝安苇王文珍目录表达式计算器简介小组成员主要分工主要代码及代码展示成员代码讲解程序截图展示表达式计算器计算器在当今社会的应用无处不在,大到政府、公司,小到家庭个人,计算器已经广泛应用到了社会的方方面面。但是,常用计算器的功能不够丰富,比如我们手机上的计算器程序,只能进行简单的加减乘除的运算,而且要一个数字一个数字的进行输入,功能差而且效率低。表达式计算器这它可以任由你输入一串算式,其中可以包含加减乘除、括号、三角函数等各种运算符,而且括号可以多重嵌套,计算数据位双精度型,精确度较高。小组分工易鑫:括号匹配等函数的编写,以及文档PPT制作。邹恒锐:进行运算函数的编写,以及整体流程。祝安苇:四则运算函数和atof函数的编写。王文珍:差错检测函数的编写。用到的数据结构类型:顺序栈typedefstruct{SElemType*base;SElemType*top;intstacksize;}SqStack;InitStack(N);存数据InitStack(S);存运算符和括号typedefstruct{int*q;int*h;intsize;}pos;存括号位置q为前括号;h为后括号;主要函数input(SqStack&S,SqStack&N,char*a);将字符n存入字符栈S和数字栈NStatusTellError_1(SqStackS);判断括号是否对齐StatusTellError_2(SqStackS);判断符号是否正确StatusTellError_3(SqStackN);判断表括达式是否不存在StatusTellError_4(char*a);判断数字接括号无运算符的错误StatusTellError_5(SqStackS,*num);判断被除数是否为0Statusatof(SqStackN,double*a);数字栈N转换为数字,Statusfindsymbol_kh(int&i,SqStackS,pos&pos,int&flag);找到N中的括号StatusGetNumof(int&num_len,int&sym_len,SqStackS);得到运算符和数字的个数StatusGetChaPos(SqStackS,intstart,intpos);得到运算符的次序doubleOperate(SqStack&S,int&num_len,int&sym_len,int&kh_len,double*num,pos&kh,pos&p,int&flag);进行运算过程doubleOperate_arith(doubletemp1,charsymbol,doubletemp2);进行单个四则运算doubleOperate_pos(intstart,int&end,SqStack&S,double*num,int&num_len,int&sym_len);进行按位置的运算过程设计思路输入表达式判断正确性分离符号与数字到栈S与栈N,并且判断符号是否出错找括号并排序否输出错误信息栈N数字存入数组num按序进行运算输出结果除数为0输出错误信息截图StatusTellError_1(SqStackS){SqStacktemp;InitStack(temp);intleft=0;intright=0;SElemTypen;while(S.top!=S.base){Pop(S,n);if(n=='(')left++;if(n==')')right++;Push(temp,n);}while(temp.top!=temp.base){Pop(temp,n);Push(S,n);}if(left==right)returnTRUE;elsereturnFALSE;}//判断括号是否对齐StatusTellError_2(SqStackN){if(*(N.base)==''||*(N.top-1)==''||*(N.base)=='.'||*(N.top-1)=='.')returnERROR;SElemType*p=N.base;while(p!=N.top-1){if(*p==''&&*p==*(p+1))returnERROR;if(*p=='.'&&(*(p-1)=='.'||*(p+1)=='.'||*(p+1)==''||*(p-1)==''))returnERROR;p++;}returnOK;}//判断符号是否正确StatusTellError_3(SqStackN){if(StackEmpty(N))returnERROR;elsereturnOK;}//判断是否不存在数字StatusTellError_4(char*a){intlen=strlen(a);for(inti=0;ilen-1;i++){if((a[i]=='1'||a[i]=='2'||a[i]=='3'||a[i]=='4'||a[i]=='5'||a[i]=='6'||a[i]=='7'||a[i]=='8'||a[i]=='9'||a[i]=='0')&&a[i+1]=='(')returnERROR;elseif((a[i]==')')&&(a[i]=='1'||a[i]=='2'||a[i]=='3'||a[i]=='4'||a[i]=='5'||a[i]=='6'||a[i]=='7'||a[i]=='8'||a[i]=='9'||a[i]=='0'))returnERROR;}returnOK;}//判断数字接括号无运算符的错误StatusTellError_3(SqStackN){if(StackEmpty(N))returnERROR;elsereturnOK;}//判断是否不存在数字StatusTellError_4(char*a){intlen=strlen(a);for(inti=0;ilen-1;i++){if((a[i]=='1'||a[i]=='2'||a[i]=='3'||a[i]=='4'||a[i]=='5'||a[i]=='6'||a[i]=='7'||a[i]=='8'||a[i]=='9'||a[i]=='0')&&a[i+1]=='(')returnERROR;elseif((a[i]==')')&&(a[i]=='1'||a[i]=='2'||a[i]=='3'||a[i]=='4'||a[i]=='5'||a[i]=='6'||a[i]=='7'||a[i]=='8'||a[i]=='9'||a[i]=='0'))returnERROR;}returnOK;}//判断数字接括号无运算符的错误Statusatof(SqStackN,double*a){SElemType*p=N.base;charc[100];inti=0;intj=0;while(p!=N.top){if(*p!=''){c[i++]=*p;}else{c[i]='\0';a[j++]=atof(c);i=0;}p++;}if(p==N.top){c[i]='\0';a[j++]=atof(c);i=0;}returnOK;}//数字栈N转换为数字存入数组adoubleOperate_arith(doubletemp1,charsymbol,doubletemp2){switch(symbol){case'+':{returntemp1+temp2;}case'-':{returntemp1-temp2;}case'*':{returntemp1*temp2;}case'/':{returntemp1/temp2;}case'^':{returnpow(temp1,temp2);}}}//进行单个四则运算Statusfindsymbol_q(int&i,SqStackS,pos&pos,int&flag){SElemType*p=S.base;while(*(p+i)!='('&&*(p+i)!=')'&&p+i!=S.top){i++;}if(p+i!=S.top){if(*(p+i)=='('){intt=i;i++;flag=1;findsymbol_q(i,S,pos,flag);if(flag==0){*(pos.q++)=t;findsymbol_q(i,S,pos,flag);}}if(*(p+i)==')'){intt=i;i++;flag=0;*(pos.h++)=t;pos.size++;}returnTRUE;}elsereturnFALSE;}//找到N中的前括号StatusTellError_5(SqStackS,double*num){Intstart=0;while(S.base+start!=S.top){intpos_c;if(*(S.base+start)==‘/’){pos_c=GetChaPos(S,start);if(num[pos_c==0])returnERROR;}start++;}returnOK;}•doubleOperate(SqStack&S,int&num_len,int&sym_len,int&kh_len,double*num,pos&kh,pos&p,int&flag)•{•doubletemp1;doubletemp2;•intstart;intend;•for(inti=0;ikh_len;)•{•intj=0;•Start=*(kh.q+i);end=*(kh.h+i);•Ints=start+1;nte=end-1;•Operate_pos(s,e,S,num,num_len,sym_len);•Pop(S,e);Pop(S,start);•kh.h=(int*)malloc(100*sizeof(int));kh.q=(int*)malloc(100*sizeof(int));•kh.size=0;p=kh;•num_len=0;sym_len=0;•Findsymbol_q(j,S,p,flag);GetNumof(num_len,sym_len,S);•kh_len=p.size;•i=0;•}•ints=0;intlen=sym_len-1;•if(len0)•returnnum[0];•else•returnOperate_pos(s,len,S,num,num_len,sym_len);•}doubleOperate_pos(intstart,int&end,SqStack&S,double*num,int&num_len,int&sym_len){if(start==end){doubletemp1,temp2;intc_pos=GetChaPos(S,start);temp1=num[c_pos];temp2=num[c_pos+1];num[c_pos]=Operate_arith(temp1,*(S.base+start),temp2);for(inti=c_pos+1;inum_len-1;i++){num[i]=num[i+1];}num_len--;Pop(S,start);sym_len--;end--;returnnum[c_pos];}elseif(S.base+start!=S.base+end&&end=0&&start=0){if(*(S.base+start)=='+'||*(S.base+start)=='-'){doubletemp1;ints;intc_pos;c_pos=GetChaPos(S,start);temp1=num[c_pos];s=start+1;returnOperate_arith(temp1,*(S.base+start),Operate_pos(s,end,S,num,num_len,sym_len));}elseif(*(S.base+start)=='*'||*(S.base+start)=='/'){if(*(S.base+