Update README.md

This commit is contained in:
2025-07-01 18:33:49 +08:00
committed by KiriAky 107
parent 3b330a9da3
commit 67c9589446
7 changed files with 135 additions and 32 deletions

View File

@@ -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;
}