📄 calculator.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 + -