[2]报告正文(2)

2019-01-27 13:35

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

a->size--;

return a->num[--(a->top)]; /*得到栈顶的值*/ }

void push2(numstack *a,double num) /*入栈*/ {

a->size++;

a->num[(a->top)++]=num; }

int main(void) /*主函数*/ {

void change (char str[],char exp[]); /*声明要用到的各个函数*/

double CalResult(char exp[]); /*声明后缀表达式的计算函数*/ double Directcalresult(char str[]); int check(char str[],char chestr[100]);

char str[100],exp[100],chestr[100]; /*str存储原算术表达式,exp存储对

应的 printf(\算术表达式为:\\n\ 后缀表达式,chestr存储容错字符'^'*/

gets(str);

if(check(str,chestr)) /*调用容错函数*/ { printf(\表达式错在:\\n\ printf(\ }

exit(-1);

printf(chestr); /*根据输入情况指出错误的地方*/

change(str,exp); /*调用函数将中缀转化为后缀*/ printf(\后缀表达式为:%s\\n\

printf(\运算结果为: %f\\n\ /*调用函数计算后缀表达式*/ }

void change (char str[],char ch[]) /*将前缀表达式转化为后缀表达式*/ {

int i=0; /*str的索引*/ int k=0;

char c; /*字符串中取出的放在C中*/ stack st; /*定义符号栈*/ OpNode op; OpNode ops; c=str[i++]; {

if ( (c>='0'&&c<='9')||c=='.') /*如果字符为数字或小数点*/ {

init(&st); /*初始化符号栈*/

printf(\直接运算的结果为: %f\\n\ /*调用直接计算函数*/

while (c!='\\0') /*对字符串进行扫描*/

while ( (c>='0'&&c<='9')||c=='.')

- 6 -

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

{

ch[k++]=c; /*将字符直接放入数组中*/

c=str[i++]; }

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

if(c==')') /*如果字符为右括号*/ { }

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

op.level=1; /*优先级为1*/ { } else {

while (ops.level>=op.level) /*如果栈顶优先级高*/

{

ops=pop(&st);

ch[k++]=ops.op; /*将栈顶元素取出存入数组中*/

if (st.size>0) else

break;

ops=top(&st); /*进行判空操作,栈为空结束*/

push(&st,op); /*如果此时栈为空直接入栈*/ op=top(&st); /*首先观察栈顶*/

while (st.size!=0&&op.op!='(') /*如果不是左括号并且栈不为空*/ {

ch[k++]=op.op;

if (st.size>0) /*再次检查栈是否为空,*/ }

pop(&st); /*去掉左括号*/

op=top(&st);

else break; /*为空就结束*/ op.level=-1; /*定义其优先级为-1*/ push(&st,op); /*将左括号直接入栈*/ }

ch[k++]='|'; /*在其后面放入一个分隔符*/

op.op='(';

op=pop(&st); /*出栈并存入数组中*/

op.op=c; if (st.size==0)

ops=top(&st); /*观察栈顶*/

- 7 -

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

}

if(c=='*'||c=='/'||c=='%') { op.op=c;

op.level=2; /*优先级为1*/ }

}

push(&st,op); /*此时栈顶优先级低,入栈*/

if (st.size==0)

{ push(&st,op); } else {

ops=top(&st); while (ops.level>=op.level) {

ops=pop(&st); ch[k++]=ops.op; if (st.size>0) ops=top(&st); else

break; }

push(&st,op); }

}

c=str[i++]; } while(st.size!=0) { ops=pop(&st); ch[k++]=ops.op;

}

ch[k]='\\0'; }

double CalResult(char exp[]) {

char c; numstack numst; double d1,d2,dr; int k=0; int i=0;

char *s; - 8 -

/*如果此时栈为空直接入栈*/ /*观察栈顶*/

/*如果栈顶优先级高*/ /*将栈顶元素取出存入数组中*/ /*进行判空操作,栈为空结束*/ /*此时栈顶优先级低,入栈*/ /*索引自加检索下一个字符*/

/*最后判断栈如果不为空*/

/*取出栈内元素存入数组中*/ /*将\\0作为结尾存入数组*/

/*后缀表达式的计算*/ /*建立数值栈*/

/*后缀表达式的索引*/

/*将字符转化为浮点数的索引*/

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

char trans[100]; /*存字符表示的一段数字*/ init2 (&numst); /*实现数值栈*/ c=exp[k++];

while (c!='\\0') /*开始扫描后缀表达式*/ {

if(c=='+'||c=='-'||c=='*'||c=='/'||c=='%') /*如果是操作符*/ { }

if (c>='0'&&c<='9'||c=='.') /*如果是字符表示的数字*/ {

{

case '+' : /*如果是加法操作*/

d2=pop2(&numst); d1=pop2(&numst);

dr=d1+d2; /*相加后入栈*/ push2(&numst,dr); break;

d2=pop2(&numst); d1=pop2(&numst);

dr=d1-d2; /*相减后入栈*/ push2(&numst,dr); break;

d2=pop2(&numst); d1=pop2(&numst);

dr=d1*d2; /*相乘后入栈*/ push2(&numst,dr); break;

d2=pop2(&numst); d1=pop2(&numst);

dr=d1/d2; /*相除后入栈*/ push2(&numst,dr); break;

d2=pop2(&numst); d1=pop2(&numst);

dr=(double)((int)d1%(int)d2); /*类型转化并取余后入栈*/ push2(&numst,dr); break;

switch(c)

case '-' : /*如果是减法操作*/

case '*' : /*如果是乘法操作*/

case '/' : /*如果是除法操作*/

case '%' : /*如果是取余操作*/

}

while(c>='0'&&c<='9'||c=='.')

- 9 -

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

}

double Directcalresult(char str[]) /*表达式的直接计算出结果*/ {

stack ms; /*建立符号栈*/ numstack mns; /*建立数值栈*/ double calculate(double od1,double od2,OpNode op); int index=0; /*str的索引*/ int len=strlen(str); char c;

char trans[100]; /*存放数值的一段字符*/ int i=0; /*trans的索引*/ char * s; double d;

OpNode tempn; /*存放当前扫描的操作符*/ OpNode templn; double oda,odb,odr;

double result; /*作为返回值返回结果*/ init (&ms); /*实现两个栈*/ init2(&mns);

while(index

c=str[index++];

if(c>='0'&&c<='9'||c=='.') /*如果是数字字符或小数点*/ {

{ }

trans[i++]='\\0'; /*扫描完一个数结束数组*/ i=0; /*索引归0*/

trans[i++]=c; /*将其存入数组扫描下一个*/ c=str[index++];

}

}

c=exp[k++];

{ }

trans[i++]='\\0'; /*将表示数字的字符串结束*/ s=trans; /*将指针指向该数组*/ d1=atof(s);

/*利用函数将字符串转化为浮点数*/

push2(&numst,d1);

trans[i++]=c; /*将字符存入数组进行下一个的扫描*/ c=exp[k++];

i=0;

return pop2(&numst); /*最后结果将在数值栈中,取出作为返回值*/

while(c>='0'&&c<='9'||c=='.')

- 10 -


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

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

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

马上注册会员

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