表达式计算-C++.doc
文本预览下载声明
表达式计算-C++
这是使用C++编写的一个表达式转后缀式再求值的一个类
由于本人只是学生一个,这些都是为了验证学习上的东西,写得比较粗糙,只供初学者参考
本类可以计算小数,负数。只能识别+ - * / % ^ (^这是一个乘方运算符,用法如:2^16计算2的16次方,%这是一个求余运算符,使用规则和C++编译器类似),只能包含()这一种括号,并且在操作数和括号之间的运算符不能省略,每个运算符要明确给出
本类负数处理的方法是采用:符号来替换,可以在表达式中输入(-)负号,但在字符检测函数来区分负号时,如果检测出来是负号就会自动转换为(:)这个符号。这主要是为了在以后计算时可以不用每次来区分是不是负号,而只区分一次即可。也可以直接在表达式中用:这个符号来表示负号,识别函数可以直接识别而不需要区分和替换。要注意的是,(-)这种负号一定要使用表达式检查函数才能识别,如果不想使用检查函数,就只能用:来代替。
本类的表达式检查函数会按照一定的规则来检测表达式输入是否合要求,如果有不合要求的字符或字符位置不合要求都会报错,并会指出是那一个字符,而且当函数检测到一个错误时不会立即停下,而会继续检测,只到表达式结束。并输出表达式中的那些字符不合要求。
单个0是不能出现在表达式中,但0.0可以,如果表达式中需要出0可以用0.0代替,但如:30/0.0这样的计算会在计算时给出错误提示。
表达式中可以出现-(-(-13+5)+5)这样的深层负号计算,计算结果和VC++编译器结果一样
本类在VC6.0,w7系统下编译通过并运算。
本类中没有主动清空数据成员的方法,所以有使用时,要将类的对象定义在计算循环或函数内,这样每一次计算都会对对象进行创建和析构,不然会出现异常,当然你可以增加一个清空数据成员的方法。
//以下是ExpEvaluate.h类的头文件
#ifndef Exp_h
#define Exp_h
#include string //字符串类头文件
#include stack //STL栈头文件
#include queue //STL队列头文件
#include vector //STL向量头文件
#include list //STL链表头文件
using namespace std;
class ExpEvaluate
{
public:
ExpEvaluate(); //用于初始化错误列表
void ExpInto(string Exp); //输入一个表达式
int ExpDetector(); //字符串规则检测函数
int ExpIdentification(char Exp); //数字运算符识别函数
int ExpPriority(char Ope); //返回运算符的优先级
void ExpSuffix(); //将表达式转为后缀式
double ExpCompute(); //计算后缀表达式,并返回结果
void ErrorBacktrack(); //根据错误号返回相应错误
private:
string exps; //表达式字符串
stackchar oper; //运算符栈
stackdouble operand; //操作数栈
queuechar postfix; //后缀队列
vectorchar * error; //错误列表
listint index; //错误索引表
int grade; //错误标号
string errorout; //错误输出缓冲区
double OpReadop(); //读取操作数,并返回转换后的结果
double OpOrder(double op,double x); //求op数的x次方
};
#endif
//以下是.cpp实现文件
#include ExpEvaluate.h
#include resource.h
#include stdlib.h //字符转换数字
显示全部