📄 calculat.cpp
字号:
#include <calculat.h>#include <strstream.h>calculator::calculator(String Input) : query_processor(Input){ char Character; Result = 0; Character = '0'; strcpy(FunctionResult,""); while(Character <= '9') {
ValidNumbers.insert(Character); ValidOperands.insert(Character); ValidCharacters.insert(Character); Character++; } ValidOperators.insert('*'); ValidOperators.insert('-'); ValidOperators.insert('+'); ValidOperators.insert('/'); Character = 'a'; while(Character <= 'z') {
ValidLetters.insert(Character);
ValidCharacters.insert(Character);
Character++;
}
Character = 'A';
while(Character < 'Z')
{
ValidLetters.insert(Character);
ValidCharacters.insert(Character);
Character++;
}
ValidCharacters.insert(' ');
ValidCharacters.insert('.');
ValidCharacters.insert(')');
ValidCharacters.insert('(');
ValidCharacters.insert('*');
ValidCharacters.insert('/');
ValidCharacters.insert('+');
ValidCharacters.insert('-');
ValidFunctions.insert("tan");
ValidFunctions.insert("sqr");
ValidFunctions.insert("log");
ValidFunctions.insert("sin");
ValidFunctions.insert("cos");
ValidFunctions.insert("acos");
ValidFunctions.insert("atan");
ValidFunctions.insert("asin");
}
calculator::calculator(String Input,VSet VOperands,
VSet VOperators,
VSet VFunctions,
VSet VCharacters,
VSet VLetters,
VSet VNumbers) : query_processor(Input,VOperands,
VOperators,
VFunctions,
VCharacters,
VLetters,
VNumbers)
{
Result = 0;}
calculator::calculator(void)
{
char Character;
Result = 0;
Character = '0';
strcpy(FunctionResult,"");
while(Character <= '9')
{
ValidNumbers.insert(Character);
ValidOperands.insert(Character);
ValidCharacters.insert(Character);
Character++;
}
ValidOperators.insert('*');
ValidOperators.insert('-');
ValidOperators.insert('+');
ValidOperators.insert('/');
Character = 'a';
while(Character <= 'z')
{
ValidCharacters.insert(Character);
ValidLetters.insert(Character);
Character++;
}
Character = 'A';
while(Character < 'A')
{
ValidLetters.insert(Character);
ValidCharacters.insert(Character);
Character++;
}
ValidCharacters.insert(' ');
ValidCharacters.insert('.');
ValidCharacters.insert(')');
ValidCharacters.insert('(');
ValidCharacters.insert('*');
ValidCharacters.insert('/');
ValidCharacters.insert('+');
ValidCharacters.insert('-');
ValidFunctions.insert("tan");
ValidFunctions.insert("sqr");
ValidFunctions.insert("log");
ValidFunctions.insert("sin");
ValidFunctions.insert("cos");
ValidFunctions.insert("acos");
ValidFunctions.insert("atan");
ValidFunctions.insert("asin");
}
void calculator::evaluate(void)
{
list<expression_component>::iterator X;
X = ExpressionTokens.begin();
expression_component Temp;
expression_component Stacktop;
expression_component Answer;
double Value;
while(X != ExpressionTokens.end())
{
Temp = *X;
if(Temp.isOperand()){
OperandStack.push(Temp);
}
else{
if(Temp.op() == '('){
OperatorStack.push(Temp);
}
else{
if(Temp.op() == ')'){
processCloseParenthesis();
}
else{
if(OperatorStack.empty()){
OperatorStack.push(Temp);
}
else{
Stacktop = OperatorStack.top();
if(Temp.opType() > Stacktop.opType()){
OperatorStack.push(Temp);
}
else{
OperatorStack.pop();
Value = processOperator(Stacktop);
Answer.isOperand(1);
Answer.value(Value);
OperandStack.push(Answer);
OperatorStack.push(Temp);
}
}
}
}
}
X++;
}
while(!OperatorStack.empty())
{
Temp = OperatorStack.top();
OperatorStack.pop();
Value = processOperator(Temp);
Temp.isOperand(1);
Temp.value(Value);
OperandStack.push(Temp);
}
Answer = OperandStack.top();
OperandStack.pop();
Result = Answer.value();
}
void calculator::processCloseParenthesis(void)
{
expression_component Temp;
double Value;
while(Temp.op() != '(')
{
Temp = OperatorStack.top();
OperatorStack.pop();
if(Temp.op() != '('){
Value = processOperator(Temp);
Temp.isOperand(1);
Temp.value(Value);
OperandStack.push(Temp);
}
}
}
double calculator::processOperator(expression_component Operator)
{
expression_component Temp1;
expression_component Temp2;
switch(Operator.op())
{
case '+' : Temp2 = OperandStack.top();
OperandStack.pop();
Temp1 = OperandStack.top();
OperandStack.pop();
return(Temp1.value() + Temp2.value());
case '-' : Temp2 = OperandStack.top();
OperandStack.pop();
Temp1 = OperandStack.top();
OperandStack.pop();
return(Temp1.value() - Temp2.value());
case '*' : Temp2 = OperandStack.top();
OperandStack.pop();
Temp1 = OperandStack.top();
OperandStack.pop();
return(Temp1.value() * Temp2.value());
case '/' : Temp2 = OperandStack.top();
OperandStack.pop();
Temp1 = OperandStack.top();
OperandStack.pop();
if(Temp2.value() != 0){
return(Temp1.value() / Temp2.value());
}
else{
ValidExpression = 0;
return(0);
}
case '@' : Temp1 = OperandStack.top();
OperandStack.pop();
return(Operator.function(Temp1.value()));
default: break;
}
return(0);
}
double calculator::result(void)
{
return(Result);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -