[2]报告正文(3)

2019-01-27 13:35

用两种方式实现表达式自动计算

s=trans;

d=atof(s);

}

if(c=='+'||c=='-') /*如果是+-*/ {

tempn.op=c; if(ms.size==0) { } else {

templn=top(&ms);

{

push(&ms,tempn); /*栈为空直接入栈*/

push2(&mns,d); /*转化为浮点数入栈*/

tempn.level=1; /*优先级设为1*/

while (templn.level>=tempn.level) /*栈顶优先级高*/

templn=pop(&ms); /*取出操作数和操作符计算*/

odb=pop2(&mns); }

if(c=='*'||c=='/'||c=='%') {

tempn.op=c; if(ms.size==0) { } else {

templn=top(&ms);

push(&ms,tempn); /*栈空直接入栈*/

}

}

oda=pop2(&mns);

push2(&mns,odr); /*结算结果入栈*/ if(ms.size>0) {

templn=top(&ms); /*如果栈空结束*/ } else

break;

odr=calculate(oda,odb,templn);

push(&ms,tempn); /*操作符入栈*/

tempn.level=2; /*定义优先级为2*/

while (templn.level>=tempn.level) /*栈顶优先级高*/

- 11 -

用两种方式实现表达式自动计算

}

tempn=top(&ms); while(1) {

templn=pop(&ms); }

if(c=='(') /*如果是左括号*/ { }

if(c==')') /*如果是右括号*/ { }

{ }

pop(&ms); /*取出左括号*/

odb=pop2(&mns); /*从数栈中取两个数,从符号栈里取操作符*/ oda=pop2(&mns); push2(&mns,odr); if (ms.size>0)

tempn.level=-1;

tempn.op=c; /*直接入栈优先级定位-1*/ push(&ms,tempn);

}

{ }

odb=pop2(&mns); oda=pop2(&mns);

push2(&mns,odr); /*结算结果入栈*/ {

templn=top(&ms); } else

break; /*如果栈空结束*/ templn=top(&ms);

templn=pop(&ms); /*取出操作数和操作符计算*/

odr=calculate(oda,odb,templn); if(ms.size>0)

push(&ms,tempn); /*操作符入栈*/

while(tempn.op!='(') /*遇到左括号结束*/ templn=pop(&ms);

odr=calculate(oda,odb,templn); /*计算出结果入栈*/

tempn=top(&ms);

break; /*如果栈空结束*/

else

- 12 -

用两种方式实现表达式自动计算

odb=pop2(&mns); /*从数栈中取两个数,从符号栈里取操作符*/

oda=pop2(&mns);

odr=calculate(oda,odb,templn); /*计算出结果入栈*/ }

result =pop2(&mns); /*最后的结果在数值栈中返回*/ return result; }

double calculate(double od1,double od2,OpNode op) /*已知操作符和操作数的计算*/ {

switch(op.op) {

case '+' : return od1+od2;

case '-' : return od1-od2; /*判断操作符是哪个执行相应计算*/ case '*' : return od1*od2; push2(&mns,odr); if (ms.size>0)

tempn=top(&ms);

/*如果栈空结束*/

else break;

case '/' : return od1/od2;

case '%' : return (double)((int)od1%(int)od2); }

int check(char str[],char chestr[100]) /*容错函数*/ {

char c;

char cdivide;

int i=0; /*str的索引*/ stack che; /*括号匹配用到的栈*/ OpNode temp;

int k=0; /*chestr的索引*/

int isinteger(char integer[100]); /*%计算是判断是否是整数*/ char s1[10]; /*%操作时存储%左右的数字*/ char s2[10];

int indexs1=0; /*s1s2的索引*/ int indexs2=0; init (&che);

int flag=0; /*0--没有出错1--有错*/ int tag=0;

c=str[i]; /*开始扫描*/

int j; /*数组chestr索引*/ for(j=0;j<99;j++) { }

return 0; /*如果上面的都没有执行返回0*/

- 13 -

用两种方式实现表达式自动计算

}

chestr[j]='\\0'; while(c!='\\0') { {

chestr[j]=' '; /*数组初始化待以后加入'^'*/

if(c=='(') /*如果是左括号就入栈*/

temp.op=c; push(&che,temp);

直存*/

}

if(c==')') /*如果是右括号*/ { if(che.size>0) {

pop(&che); /*栈不为空就取出一个左括号*/ } else { flag=1;

printf(\缺少左括号\\n\ /*否则提示有错*/ chestr[i]='^';

/*右括号下加'^'*/

}

} if(c=='/') /*判断除数是否为0*/

{ j=0;

cdivide=str[i+1+j]; /*取出除号后的数*/

while(cdivide>='0'&&cdivide<='9'||cdivide=='.') /*如果是数或小数点就一

{ s1[j++]=cdivide; if(cdivide!='0'&&cdivide!='.') /*如果不是0则正确并结束*/ { tag=1;

break;

}

cdivide=str[i+j+1];

} if(!tag) /*如果tag为0则存在错误除数为0*/

{ chestr[i+1]='^';

flag=1; /*flag为1表示有错*/

}

}

- 14 -

用两种方式实现表达式自动计算

*/

扫描*/

数点*/

*/

}

int isinteger(char integer[100]) /*判断数组内是否是整数*/ {

int i=0; /*传过来的数组的索引*/ char c; c=integer[i++]; }

if(che.size>0)

{ /*如果最后栈不为空*/ }

printf(\缺少右括号\\n\ /*栈中还有没配对的左括号报错*/ } i++;

c=str[i]; /*检索下一个字符*/

{ }

if(isinteger(s2)) /*调用函数判断s2内存到是否是整数*/ { }

printf(\取余算法第二个数应为整数运算\\n\

flag=1; /*记录为有错*/ printf(\取余算法第一个数应为整数运算\\n\

flag=1; /*记录为有错*/

}

if(isinteger(s1)) /*调用函数判断s1内存到是否是整数

s2[indexs2++]=str[i+indexs2+1]; /*放在s1中*/

||str[i+indexs2+1]=='.')

{ /*如果是数或小

} /*放在s1中*/ while(str[i+indexs2+1]>='0'&&str[i+indexs2+1]<='9' /*以%为中心向后

if(c=='%') /*取余操作的容错*/ {

while(str[i-indexs1-1]>='0'&&str[i-indexs1-1]<='9' {

s1[indexs1++]=str[i-indexs1-1]; /*如果是数或小数点 ||str[i-indexs1-1]=='.') /*以%为中心向前扫描*/

chestr[i-indexs1]='^';

chestr[i+indexs2]='^';

return flag; /*返回是否有错*/

- 15 -


[2]报告正文(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:人教版五年级语文下册[草原]一课一练

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: