表达式计算_C++

上传人:xmg****18 文档编号:118955591 上传时间:2020-01-01 格式:DOC 页数:25 大小:65.50KB
返回 下载 相关 举报
表达式计算_C++_第1页
第1页 / 共25页
表达式计算_C++_第2页
第2页 / 共25页
表达式计算_C++_第3页
第3页 / 共25页
表达式计算_C++_第4页
第4页 / 共25页
表达式计算_C++_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《表达式计算_C++》由会员分享,可在线阅读,更多相关《表达式计算_C++(25页珍藏版)》请在金锄头文库上搜索。

1、. . . . .表达式计算-C+1, 这是使用C+编写的一个表达式转后缀式再求值的一个类2, 由于本人只是学生一个,这些都是为了验证学习上的东西,写得比较粗糙,只供初学者参考3, 本类可以计算小数,负数。只能识别+ - * / % (这是一个乘方运算符,用法如:216计算2的16次方,%这是一个求余运算符,使用规则和C+编译器类似),只能包含()这一种括号,并且在操作数和括号之间的运算符不能省略,每个运算符要明确给出4, 本类负数处理的方法是采用:符号来替换,可以在表达式中输入(-)负号,但在字符检测函数来区分负号时,如果检测出来是负号就会自动转换为(:)这个符号。这主要是为了在以后计算时可

2、以不用每次来区分是不是负号,而只区分一次即可。也可以直接在表达式中用:这个符号来表示负号,识别函数可以直接识别而不需要区分和替换。要注意的是,(-)这种负号一定要使用表达式检查函数才能识别,如果不想使用检查函数,就只能用:来代替。5, 本类的表达式检查函数会按照一定的规则来检测表达式输入是否合要求,如果有不合要求的字符或字符位置不合要求都会报错,并会指出是那一个字符,而且当函数检测到一个错误时不会立即停下,而会继续检测,只到表达式结束。并输出表达式中的那些字符不合要求。6, 单个0是不能出现在表达式中,但0.0可以,如果表达式中需要出0可以用0.0代替,但如:30/0.0这样的计算会在计算时给

3、出错误提示。7, 表达式中可以出现-(-(-13+5)+5)这样的深层负号计算,计算结果和VC+编译器结果一样8, 本类在VC6.0,w7系统下编译通过并运算。9, 本类中没有主动清空数据成员的方法,所以有使用时,要将类的对象定义在计算循环或函数内,这样每一次计算都会对对象进行创建和析构,不然会出现异常,当然你可以增加一个清空数据成员的方法。/以下是ExpEvaluate.h类的头文件#ifndef Exp_h#define Exp_h#include /字符串类头文件#include /STL栈头文件#include /STL队列头文件#include /STL向量头文件#include /

4、STL链表头文件using namespace std;class ExpEvaluatepublic:ExpEvaluate(); /用于初始化错误列表void ExpInto(string &Exp); /输入一个表达式int ExpDetector(); /字符串规则检测函数int ExpIdentification(char Exp); /数字运算符识别函数int ExpPriority(char Ope); /返回运算符的优先级void ExpSuffix(); /将表达式转为后缀式double ExpCompute(); /计算后缀表达式,并返回结果void ErrorBacktr

5、ack(); /根据错误号返回相应错误private:string exps; /表达式字符串stack oper; /运算符栈stack operand; /操作数栈queue postfix; /后缀队列vector error; /错误列表list index; /错误索引表int grade; /错误标号string errorout; /错误输出缓冲区double OpReadop(); /读取操作数,并返回转换后的结果double OpOrder(double op,double x); /求op数的x次方;#endif/以下是.cpp实现文件#include ExpEvaluat

6、e.h#include resource.h#include /字符转换数字头文件#include #include ExpEvaluate:ExpEvaluate()/初始错误列表error.resize(15); /为列表初始为15个元素grade=0; /初始标号为0,表示没有错误 error.at(0)= 操作数错误:操作数前不能是)右括号!;error.at(1)= 操作数错误:0不可以出现在操作的开始,也不能作为一个单独的操作数!;error.at(2)= 操作数错误:小数点不能在一个操作数中重复出现!;error.at(3)= 运算符错误:运算符前面必须是操作数或)右括号,并且运

7、算符不能重叠!;error.at(4)= 括号错误: 左括号前面必须是运算符或左括号或负号!;error.at(5)= 括号错误: 右括号前面必须是操作数或右括号!;error.at(6)= 括号错误: 括号输入不匹配!;error.at(7)= 分隔符错误:#号分隔符只能出现在表达式的边界位置!;error.at(8)= 表达式错误:表达式的结尾必须是操作数或右括号!;error.at(9)= 负号错误: 负号前面必须是运算符或左括号呀分隔符!;error.at(10)= 字符错误: 表达式中除数字,运算符,:负号,()括号之外不能出现其它符号!;error.at(11)= 计算错误: 除数

8、不能为0,也不能小于0.0001(个人限制)!;error.at(12)= 计算错误: 求余运算中,除数不能为0或小于0!;error.at(13)= 计算错误: 次方运算中,次方数不能小于0!;error.at(14)= 计算错误: 计算结果出现错误!;void ExpEvaluate:ErrorBacktrack()list:iterator pexp; /使用迭代器来遍历链表char m18; /字符缓冲区if(grade=0) /如果错误标号为0表示没有错误,就直接返回return;else if(grade=1) /如果为1表示错误由检测函数发现for(pexp=index.begi

9、n();pexp!=index.end();) /通过sprintf函数将错误的字符位置整数,格式化到字符缓冲区数组m中sprintf(m,错误字符位置:%2d,*pexp);errorout+=m; /将格式化的字符连接到错误输出缓冲区中pexp+;errorout+=error.at(*pexp); /将相对应的错误提示连接至缓冲区中errorout+=rn; pexp+; couterroroutendl;/输出错误else if(grade=2) /如果错误标号为2,表示是在计算时发现for(pexp=index.begin();pexp!=index.end();) /将相应的错误连

10、接到错误缓冲区中errorout+=error.at(*pexp);errorout+=rn;pexp+; couterrorout=48&iexp=57)return 1; /表示识别到的是数字和小数点switch(iexp)case 94: case 37:case 43:case 45:case 42:case 47: return 2; /表示识别到+-*/运算符case 40:case 41:return 3; /表示识别到括号case 35: return 4; /如果是#号,这只是一个分隔符,没有其它含意case 58: return -1; /用这个符号来替换负号,表示识别到一个负号return 0; /表示识别到其它运算符int ExpEvaluate:ExpPriority(char Ope) /返回运算符的优先级 switch(Ope)case :return 4; /赋于次方运算符最高优先级case %:case *:case /:return 3; /赋于*,/,%侁先级case +:case -:return 2; case (: return 1;return 0; /如果不是运算符就返回0void ExpEvaluate:ExpInto(string &Exp) /输入一个表达式if(Exp.empty()return;exps=Exp; /将表达

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号