《四则运算表达式求值实验报告(共7页).docx》由会员分享,可在线阅读,更多相关《四则运算表达式求值实验报告(共7页).docx(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上HUNAN UNIVERSITY课程实习报告题 目: 四则运算表达式求值 学生姓名: 学生学号: 专业班级: 指导老师: 完 成 日 期 : 一、需求分析四则运算表达式求值,将四则运算表达式用中缀表达式表示,然后转换为后缀表达式,并计算结果。本程序要求利用二叉树后序遍历来实现表达式的转换,同时可以使用实验2的结果来求解后缀表达式的值。在字符界面上输入一个中缀表达式,回车表示结束。如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。测试数据输入:21+23*(12-6)输出:2
2、1 23 12 6 -*+二、详细设计输入和输出的格式输入本程序可以将输入的四则运算表达式(中缀表达式)转换为后缀表达式输出后缀表达式为:/输出结果的位置表达式的值为:/输出结果的位置三、调试分析本次实验的难点主要是在建立二叉树的问题上。关于如何把中缀表达式存入二叉树中,我参考了网上的一些方法,成功实现了目标,但是却遇到了一个问题,那就是不能处理小数,甚至两位或两位以上的整数。因为如果采用字符数组来存储操作数,运算符合一位整数还可以处理,但对于两位数就就会出问题,最后我改进采用字符串数组来存储操作数,成功解决了问题。另外在处理输入的非法表达式问题中,我也费了很大功夫,但总体问题不大。四、测试结
3、果五、用户使用说明(可选)1、运行程序时提示输入四则运算表达式本程序可以将中缀表达式转化为后缀表达式,并计算结果请输入四则运算表达式:输出后缀表达式为:表达式的值为:程序源代码(c+)#include #include #include#includeconst int Max=100;using namespace std; class Node public: char chMax; /考虑到数值有时会是两位数,所以使用字符串数组Node* lChild; Node* rChild; Node() strcpy(ch,); lChild=rChild=NULL; Node() if(lCh
4、ild!=NULL) delete lChild; if(rChild!=NULL) delete rChild; ; static int count=0; static char arrayMax; /保存原始的中缀表达式static char str2*Max; /保存后序遍历出来的字符串,为表达式求值提供方便static int k=0; char getOp(Node *temp); /temp指针保存每个结点,返回的是运算符Node* crtTree(Node* root); /传入根结点指针,返回根结点指针void output(Node *root); /获得处理后的字符串bo
5、ol isError(char); /判断字符是否有问题void deal(); /对字符数组进行处理double value(string); / 计算后缀表达式,得到其结果。 int main() Node* root=NULL; cout输入中缀表达式:;cin.getline(array,40); deal(); root=crtTree(root); cout输出后缀表达式:;output(root); coutstrendl; cout输出后缀表达式的值:;if(value(str)!=0)coutfixedsetprecision(2)value(str)endl; elseco
6、utA Wrong Input!endl;return 0; /将数字字符存入一个结点,并返回数字字符的后一个符号char getOp(Node *temp)int i=0; if( isError(arraycount) ) exit(0); while(arraycount=0|arraycount=.) temp-chi=arraycount; i+; count+; temp-chi=0; count+; return arraycount-1; /传入根结点指针,返回根结点指针Node* crtTree(Node* root) Node *p,*q; char op; if(root
7、=NULL) root=new Node;p=new Node; op=getOp(root); while(op!=) q=new Node; q-ch0=op; q-ch1=0; switch(op) case +: case -:q-lChild=root; root=q;p=new Node; op=getOp(p); root-rChild=p; break; case *: case /:if(root-ch0=+|root-ch0=-) p=new Node; strcpy(p-ch,root-ch); p-lChild=root; p-rChild=q; op=getOp(ro
8、ot); root=p; else q-lChild=root; root=q; p=new Node; op=getOp(p);root-rChild=p; break; case (:p=root; while(p-rChild) p=p-rChild; if(p-lChild=NULL) p-lChild=crtTree(p-lChild); /递归创建括号里的指针op=arraycount; count+; break; else p-rChild=crtTree(p-rChild); /递归创建括号里的指针op=arraycount; count+; break; case ): r
9、eturn root; return root; /传入根结点,后序遍历,赋值给另一个字符数组(主要是为了给后序的计算表达式值提供方便)void output(Node *root) int n; if(root) output(root-lChild); output(root-rChild); n=0; while(root-chn!=0) strk+=root-chn+;strk+= ; bool isError(char ch) /判断每个字符是否有错if(ch!=+&ch!=-&ch!=*&ch!=/&!(ch=0)&ch!=.&ch!=(&ch!=)cout 字符错误!; retu
10、rn true; return false; void deal() /对字符数组进行处理int i=0,n=0; while(arrayi) if(arrayi= |arrayi=) i+; arrayn+=arrayi+; arrayn+=;arrayn=0; double value(string s2) / 计算后缀表达式,得到其结果。 stack s; double x,y; int i = 0; while(i =2)x = s.top(); s.pop(); x += s.top(); s.pop(); i+; break; elsereturn 0;case -: if(s.s
11、ize()=2)x = s.top(); s.pop(); x =s.top()-x; s.pop(); i+; break; elsereturn 0;case *: if(s.size()=2)x = s.top(); s.pop(); x *= s.top(); s.pop(); i+; break; elsereturn 0; case /: if(s.size()=2)if( s.top()=0) return 0;elsex = s.top(); s.pop(); x = s.top()/x; s.pop(); i+; break; elsereturn 0; default : x = 0; while(0 = s2i&s2i = 9) x = x*10+s2i - 0; i+; if(s2i = .) double k = 10.0; y = 0; i+; while(0 = s2i&s2i = 9) y += (s2i-0)/k); i+; k *= 10; x += y; break; if(x!=0)s.push(x); if( s.size()=1 )return s.top();elsereturn 0; 六、实验结论*专心-专注-专业