算术表达式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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