当前位置:首页 > 利用栈求表达式的值课程设计最后老师改- 副本
4.2函数间的调用关系
main() Exit() Stack1() load() Check() result() shown() Start2() save() 图4-2函数关系调用图
4.3函数调用详细说明
main()函数:调用了一个函数stack1(),stack1()判断执行查看所有计算记录函数load(),或是清空以往的所有计算记录,或是退出程序,或是检查输入表达式语法check()并计算表达式result(op,nu)的操作。
void main() { czm op; //操作码栈 czs nu; //操作数栈 printf(\用栈计算表达式------------------------\\n\\n\
warning(); stack1(&op,&nu);//启动程序 }
13
result(op,nu)函数:是计算表达式,调用了初始化栈函数和字符级别判断change_opnd(*ps),若是数字,则调用转化数字change_num(str2)然后压入操作数栈,若是运算符,刚调用判断操作procede(get (op),*ps),若是“<”,则压入操作码栈push (op,*ps),若是“=”,则弹出操作码栈顶pop (op),若是“>”,则弹出操作码栈的栈顶元素和操作数栈的两个栈顶元素,进行运算caculate(op,nu)后再压入操作数栈,计算完毕后按stack1()顺序运行。 void result(czm *op,czs *nu)//计算结果 { char str2[MAXSIZE]=\ char *ps=EXPRESS[i].express; initstack(op);//初始化栈 Initstack(nu); push(op,'='); while(!((*ps=='=')&&(get(op)=='=')))//检查是表达式和操作码是否到尾
if(change_opnd(*ps)==-1)//操作数处理 { while(change_opnd(*ps)==-1) { strncpy(str3,ps,1);//数字字符一个个取出放在str2 strcat(str2,str3); ps++; } Push(nu,change_num(str2)); strcpy(str2,\ } else //操作码处理 { switch(procede(get(op),*ps)) { case '<':push(op,*ps);break; case '=':pop(op);break; case '>':Push(nu,caculate(op,nu));continue;break; } if(*ps==')'&&get(op)=='=') { ps++; continue; } if(*ps=='='||get(op)=='=')
14
continue;//表达式和操作码有一个到尾,则跳出继续循环
ps++; } EXPRESS[i].result=Get(nu); printf(\ 表达式:%s\\t计算结果:%lf\\n\
printf(\--------------\\n\
i++;//表达式个数加1; }
stack2()函数:在计算结果后调用跟随的选择菜单,进行查看结果shown()、保存结果save()、查看计算记录load()、回到主菜单的操作。
void stack2(czm *op,czs *nu)//第二层计算选择菜单 { char ch; char out; while(1) { next: printf(\--------------\\n\ printf(\查看本次计算记录,请输入\\\或\\\ printf(\保存本次计算记录,请输入\\\或\\\ printf(\查看所有计算记录,请输入\\\或\\\ printf(\回到主菜单,按任意键返回:\ scanf(\ out = getchar(); if ( out != '\\n' ) { printf(\ fflush(stdin); goto next; } if(ch=='r'||ch=='R') shown(); else if(ch=='s'||ch=='S')
15
}
save(); else
if(ch=='l'||ch=='L') load(); else {
i=0;
stack1(op,nu); } }
4.4数据结构设计
1)表达式可以用一个字符串表示,计算结果可以用一个双精度浮点数即小数表示,结构简单,可以使用一段连续的地址空间,故定义一个结构体表示即可。定义如下:
struct expression {
double result;
//表达式结构
char express[MAXSIZE];
}EXPRESS[N];
2)使用栈计算表达式时可以定义两个栈——存放数字的操作数栈(czs)和存放计算字符(+、-、*、/、(、))的操作码栈(czm)。它们的定义如下: typedef struct {
char code[MAXSIZE]; int top;
//操作码栈定义
}czm;
typedef struct {
double data[MAXSIZE];
16
//操作数栈定义
共分享92篇相关文档