⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculator.h

📁 这是一个对数学表达式求值的C++ class
💻 H
字号:
/*
作者介绍:陈硕,男,1982年4月生,现就读于北京师范大学电子系2000级。
通信方法:100875,北京师范大学 电子系1300信箱 陈硕 
E - Mail : chenshuo@chenshuo.com ,个人主页:http://www.chenshuo.com 
代码的说明在readme.txt中
Version 0.99 beta
*/

#ifndef CALCULATOR_CLASS
#define CALCULATOR_CLASS

#include "stack.h" // include Stack class
#include "queue.h" // include Queue class

#include <math.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <iostream.h>

const int  MaxLength_of_Expression = 500; // 表达式的最大长度
const int  MaxLength_of_VariableName = 30; // 变量名的最大长度
const int  MaxNumber_of_Variable = 15; // 变量的最大个数,需小于 19

enum ERR_TYPE{
    ERR_NO_ERROR = 0,
    ERR_EXPRESSION_TOO_LONG = 1, // 表达式太长
    ERR_MISS_OPERAND = 2, // 缺少操作数
    ERR_MISS_OPERATOR = 3, // 缺少操作符
    ERR_MISS_LEFT_PARENTHESIS = 4, // 缺左括号
    ERR_MISS_RIGHT_PARAENTHESIS = 5, // 缺右括号
    ERR_DEVIDE_BY_ZERO = 6, // 除数为零
    ERR_UNKNOWN_OPERATOR = 7, // 未知的操作符
    ERR_INVALID_OPERATOR = 8, // 非法操作符
    ERR_UNKNOWN_ERROR = 9, // 未知的错误
    ERR_TOO_MANY_VARIABLES = 10, // 变量个数太多
    ERR_VARIABLE_NAME_TOO_LONG = 11 // 变量名太长
};

enum OPTR_TYPE{
    OPTR_MINUS = 41, // 负号
    OPTR_POSITIVE = 42, // 正号

    OPTR_ADD = 21, // 加法
    OPTR_SUBTRACT = 22, // 减法
    OPTR_MULTIPLY = 23, // 乘法
    OPTR_DIVIDE = 24, // 除法
    OPTR_POWER = 25, // 乘方

    OPTR_LEFT_PARENTHESIS = 20, // 左括号
    OPTR_RIGHT_PARENTHESIS = 40 // 右括号
};

inline double cot(double n)
{ // 反正切
	return 1.0 / tan(n);
}
/*
int _matherr (struct _exception *a) 
{ //数学运算的异常处理,不同的编译器要求不一
	a->retval = 100000.0;
	return 1;
}
*/
class Calculator
{
private:

	struct element {
		int type; // 元素类别,是操作数还是操作符由此定
		int icp; // 栈外优先级
		int isp; // 栈内优先级
		double value; // 如果是普通操作数(非变量),此为值
    };

	Queue<element> PO; // 后缀表达式, 存储在队列中

	double Result; // 表达式的运算结果
	double Vars[MaxNumber_of_Variable]; // 表达式中各个变量的值存放于此
	char VarName[MaxNumber_of_Variable][MaxLength_of_VariableName]; // 各个变量的名字
	char Expression[MaxLength_of_Expression]; // 输入的表达式
	mutable int ErrorID; // 最近发生的错误的号码
	mutable int ErrorLineNo; // 最近发生的错误的行号
	int  VarCount; // 变量的个数

	void Error(int err, int lineno) const {	ErrorID = err; ErrorLineNo = lineno; } // 处理错误

	// 以下为将输入的表达式转换为中缀表达式的元素序列所用的函数
	void Trim(char *); // 整理输入的表达式,除去非法字符
	bool IsOperandChar(int) const; // 当前字符是否属于一个操作数
	bool IsOperatorChar(int) const; // 当前字符是否属于一个操作符
	void GetOperand(int &, char *) const; // 取得一个操作数(纯数字)
	bool GetOperator(int &, char *) const; // 取得一个操作符(字母序列或“+-*/^”等),成功返回true
    bool GetUnary(element &, char , int) const;  // 单字符非字母操作符对应的属性,成功返回true
    bool GetVariable(element &, const char *, int &); // 表达式中出现的变量的属性,成功返回true
	bool GetElement(element &, const char *, int &); // 取得字符串buf对应的元素属性,成功返回true
	bool Construe_Numeric(element &, int &, int &) const; // 
	bool Construe_Operator(element &, int &, int &);
    void Construe(Queue<element> &); // 将输入表达式整理为元素序列(即中缀表达式)
	
	// 将中缀表达式转换为后缀表达式
	void Conversion(Queue<element> &); 

	double Calculate(element EL, double x, double y) const; // 双目操作符的运算
	double Calculate(element EL, double x) const; // 单目操作符的运算

public: //以下为接口

	Calculator(void) { Clear(); }
	void Clear(void); // 初始化计算器
	const char* GetErrorMessage(int errid) const; // 得到错误信息
	int  GetErrorID(void) const { return ErrorID; } // 返回错误的号码
	int  GetErrorLineNo(void) const { return ErrorLineNo; } // 返回发生错误的行号

	bool Input(char *); // 向计算器输入一个表达式,成功则返回true
    int  GetNumberOfVariables(void) { return VarCount; } // 返回表达式中的变量个数
    const char* Calculator::GetVariableName(int i); // 得到表达式第i个变量的名称
	void Assign(double *); // 给变量赋值
	bool Compute(void); // 执行计算,成功则返回true
	double GetResult(void) { return Result; }// 返回计算结果
	void Test(void); // 演示基本的功能
};


#endif  // CALCULATOR_CLASS

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -