算术表达式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中 北 大 学

课程设计说明书

日期: 2013年10月4日

学 院、系: 软件学院 专 业:

软件工程

学 生 姓 名: 刘星

学 号:

设 计 题 目:

实现带括号的四则运算。

要 求: 1) 在屏幕能够手动输

入待运算的带有括号的四则运算

式子;

2) 输入完成后,通过

选择可以完成运算式的运算;。

起 迄 日 期: 2012年10月11日~2013年10月4日 指 导 教

:

1 设计目的实现带括号的四则运算并完成正确计算

2 任务概述:输入是一个带有括号的四则运算表达式,输出是计算得出的正确计

算结果。例如:输入:123+213-67*34+345/23*45*(34+34-345+245+567)回车,然后程序计算得出结果为:359183

3 模块划分:

4主函数说明及N-S图:

(1)主函数

void main()

{

for(;;)

{

char exp[Size];

char postexp[MaxSize];

printf("请输入表达式:");

gets(exp);

trans(exp,postexp);

printf("中缀表达式: %s\n",exp);

printf("后缀表达式: %s\n",postexp);

printf("表达式的值: %g\n",compvalue(postexp));

}

}

(2)将算术表达式exp转换为后缀表达式postexp

void trans(char *exp,char postexp[])

//将算术表达式exp转换为后缀表达式postexp

{

struct

{

char data[MaxSize]; //存放运算符

int top; //栈指针

}op; //定义运算符栈

int i=0; //i作为postexp的下标

op.top=-1;

op.top++;

op.data[op.top]='='; //将'='进栈

while(*exp!='\0') //exp表达式未扫描完时循环

{

if(!InOp(*exp)) //为数字字符的情况

{

while(*exp>='0'&&*exp<='9') //判定为数字

{

postexp[i++]=*exp;

exp++;

}

postexp[i++]='#'; //用#标志一个数值串的结束

}

else

switch(Precede(op.data[op.top],*exp))

{

case -1: //栈顶运算符的优先级低

op.top++;op.data[op.top]=*exp;

exp++; //继续扫描其他字符

break;

case 0: // 只有括号满足这种情况

op.top--; //将退栈

exp++;

break;

case 1:

postexp[i++]=op.data[op.top];

op.top--;

break;

}

}

while(op.data[op.top]!='=') //此时exp扫描完毕,退栈到'='为止

{

postexp[i++]=op.data[op.top];

op.top--;

}

postexp[i]='\0'; //给postexp表达式添加结束标志

}

(3)计算后缀表达式postexp的值

float compvalue(char *postexp) //计算后缀表达式postexp的值{

struct

{

float data[MaxSize]; //存放数值

int top; //栈指针

}st;

float d,a,b,c;

st.top=-1;

while(*postexp!='\0') //postexp字符串未扫描完时循环

{

switch(*postexp)

{

case '+':

a=st.data[st.top];

st.top--;

b=st.data[st.top];

st.top--;

c=a+b;

st.top++;

st.data[st.top]=c;

break;

case '-':

a=st.data[st.top];

st.top--;

b=st.data[st.top];

st.top--;

c=b-a;

st.top++;

st.data[st.top]=c;

break;

case '*':

a=st.data[st.top];

st.top--;

b=st.data[st.top];

st.top--;

c=a*b;

st.top++;

st.data[st.top]=c;

break;

case '/':

a=st.data[st.top];

st.top--;

b=st.data[st.top];

st.top--;

if(a!=0)

{

c=b/a;

st.top++;

st.data[st.top]=c;

}

else

{

printf("\n\t除零错误!\n");

exit(0);

}

break;

default:

d=0;

while(*postexp>='0'&&*postexp<='9')

{

d=10*d+*postexp-'0';

postexp++;

}

st.top++;

st.data[st.top]=d;

break;

}

postexp++;

}

return(st.data[st.top]);

}

N-S图:将算术表达式exp转换为后缀表达式postexp

相关文档
最新文档