Update README.md
This commit is contained in:
@@ -1,16 +1,35 @@
|
||||
#include "Calc.h"
|
||||
#include <iostream>
|
||||
#include<algorithm>
|
||||
|
||||
// <20><>̬<EFBFBD><CCAC>Ա<EFBFBD><D4B1>ʼ<EFBFBD><CABC>
|
||||
Tokenizer Calc::tokenizer;
|
||||
InfixToPostfix Calc::converter;
|
||||
PostfixEval Calc::evaluator;
|
||||
|
||||
std::unordered_map<std::string, double> Calc::vars = {
|
||||
{"PAI", 2 * std::asin(1)},
|
||||
{"pi", 3.14159265358979},
|
||||
{"e", std::exp(1)}
|
||||
};
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿڣ<D3BF><DAA3><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> -> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
double Calc::eval(const string& expression) {
|
||||
std::string varName, rightExpr;
|
||||
|
||||
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x = 3 + sin(2)
|
||||
if (is_assign(expression, varName, rightExpr)) {
|
||||
vector<Token> tokens = tokenizer.run(rightExpr);
|
||||
vector<Token> postfix = converter.run(tokens);
|
||||
double val = evaluator.run(postfix, vars);
|
||||
vars[varName] = val;
|
||||
return val;
|
||||
}
|
||||
|
||||
vector<Token> tokens = tokenizer.run(expression);
|
||||
vector<Token> postfix = converter.run(tokens);
|
||||
return evaluator.run(postfix);
|
||||
return evaluator.run(postfix,vars);
|
||||
}
|
||||
|
||||
// <20><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD>ӿڣ<D3BF><DAA3><EFBFBD> try-catch <20><>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD> bool <20><>־
|
||||
@@ -42,3 +61,18 @@ void Calc::debug(const string& expr) {
|
||||
cerr << "[Debug Error] " << e.what() << endl;
|
||||
}
|
||||
}
|
||||
|
||||
bool Calc::is_assign(const std::string& expr, std::string& varName, std::string& rightExpr) {
|
||||
size_t eqPos = expr.find('=');
|
||||
if (eqPos != std::string::npos) {
|
||||
varName = expr.substr(0, eqPos);
|
||||
rightExpr = expr.substr(eqPos + 1);
|
||||
// ȥ<><C8A5><EFBFBD>ո<EFBFBD>
|
||||
varName.erase(remove_if(varName.begin(), varName.end(), isspace), varName.end());
|
||||
rightExpr.erase(remove_if(rightExpr.begin(), rightExpr.end(), isspace), rightExpr.end());
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>Ϸ<EFBFBD><CFB7><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8>
|
||||
return !varName.empty() && std::all_of(varName.begin(), varName.end(), ::isalpha);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user