四则运算表达式求值实验报告

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

HUNAN UNIVERSITY 课程实习报告

题目:四则运算表达式求值

学生姓名:

学生学号:

专业班级:

指导老师:

完成日期:

一、需求分析

四则运算表达式求值,将四则运算表达式用中缀表达式表示,然后转换为后缀表达式,并计算结果。

本程序要求利用二叉树后序遍历来实现表达式的转换,同时可以使用实验2的结果来求解后缀表达式的值。

在字符界面上输入一个中缀表达式,回车表示结束。如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。

测试数据

输入:

21+23*(12-6)

输出:

21 23 12 6 -*+

二、详细设计

输入和输出的格式

输入

本程序可以将输入的四则运算表达式(中缀表达式)转换为后缀表达式

输出

后缀表达式为://输出结果的位置

表达式的值为://输出结果的位置

三、调试分析

本次实验的难点主要是在建立二叉树的问题上。关于如何把中缀表达式存入二叉树中,我参考了网上的一些方法,成功实现了目标,但是却遇到了一个问题,那就是不能处理小数,甚至两位或两位以上的整数。因为如果采用字符数组来存储操作数,运算符合一位整数还可以处理,但对于两位数就就会出问题,最后我改进采用字符串数组来存储操作数,成功解决了问题。

另外在处理输入的非法表达式问题中,我也费了很大功夫,但总体问题不大。

四、测试结果

五、用户使用说明(可选)

1、运行程序时

提示输入四则运算表达式

本程序可以将中缀表达式转化为后缀表达式,并计算结果

请输入四则运算表达式:

输出

后缀表达式为:

表达式的值为:

程序源代码(c++)

#include

#include

#include

#include

const int Max=100;

using namespace std;

class Node{

public:

char ch[Max]; //考虑到数值有时会是两位数,所以使用字符串数组

Node* lChild;

Node* rChild;

Node(){

strcpy(ch,"");

lChild=rChild=NULL;

}

~Node(){

if(lChild!=NULL)

delete lChild;

if(rChild!=NULL)

delete rChild;

}

};

static int count=0;

static char array[Max]; //保存原始的中缀表达式

static char str[2*Max]; //保存后序遍历出来的字符串,为表达式求值提供方便static int k=0;

char getOp(Node *temp); //temp指针保存每个结点,返回的是运算符

Node* crtTree(Node* root); //传入根结点指针,返回根结点指针

void output(Node *root); //获得处理后的字符串

bool isError(char); //判断字符是否有问题

void deal(); //对字符数组进行处理

double value(string); // 计算后缀表达式,得到其结果。

int main(){

Node* root=NULL;

cout<<"输入中缀表达式:";

cin.getline(array,40);

deal();

root=crtTree(root);

cout<<"输出后缀表达式:";

output(root);

cout<

cout<<"输出后缀表达式的值:";

if(value(str)!=0)

cout<

else

cout<<"A Wrong Input!"<

return 0;

}

//将数字字符存入一个结点,并返回数字字符的后一个符号char getOp(Node *temp){

int i=0;

if( isError(array[count]) )

exit(0);

while(array[count]<='9'&&array[count]>='0'||array[count]=='.'){ temp->ch[i]=array[count];

i++;

count++;

}

temp->ch[i]='\0';

count++;

return array[count-1];

}

//传入根结点指针,返回根结点指针

Node* crtTree(Node* root) {

Node *p,*q;

char op;

if(root==NULL){

root=new Node;

p=new Node;

}

op=getOp(root);

while(op!='='){

q=new Node;

q->ch[0]=op;

q->ch[1]='\0';

switch(op)

{

case '+':

case '-':

q->lChild=root;

root=q;

p=new Node;

op=getOp(p);

root->rChild=p;

break;

case '*':

case '/':

if(root->ch[0]=='+'||root->ch[0]=='-'){

p=new Node;

strcpy(p->ch,root->ch);

相关文档
最新文档