Pagini recente » Cod sursa (job #3293617) | Diferente pentru implica-te/arhiva-educationala intre reviziile 186 si 223 | Cod sursa (job #3293555) | Diferente pentru implica-te/arhiva-educationala intre reviziile 210 si 223 | Cod sursa (job #3293971)
#include <fstream>
#include <string>
#include <cctype>
#include <algorithm>
std::ifstream fin("evaluare.in");
std::ofstream fout("evaluare.out");
int i = 0;
double parseExpression(const std::string& s);
double parseNumber(const std::string& s) {
double num = 0;
while (i < s.size() && std::isdigit(s[i])) {
num = num * 10 + (s[i++] - '0');
}
if (i < s.size() && s[i] == '.') {
i++;
double frac = 0.1;
while (i < s.size() && std::isdigit(s[i])) {
num += (s[i++] - '0') * frac;
frac *= 0.1;
}
}
return num;
}
double parseFactor(const std::string& s) {
if (i < s.size() && s[i] == '-') {
i++;
return -parseFactor(s);
}
if (i < s.size() && s[i] == '+') {
i++;
return parseFactor(s);
}
if (i < s.size() && s[i] == '(') {
i++;
double val = parseExpression(s);
if (i < s.size() && s[i] == ')') {
i++;
}
return val;
}
return parseNumber(s);
}
double parseTerm(const std::string& s) {
double val = parseFactor(s);
while (i < s.size() && (s[i] == '*' || s[i] == '/')) {
char op = s[i++];
double right = parseFactor(s);
if (op == '*') val *= right;
else val /= right;
}
return val;
}
double parseExpression(const std::string& s) {
double val = parseTerm(s);
while (i < s.size() && (s[i] == '+' || s[i] == '-')) {
char op = s[i++];
double right = parseTerm(s);
if (op == '+') val += right;
else val -= right;
}
return val;
}
int main() {
std::string input;
std::getline(fin, input);
input.erase(std::remove(input.begin(), input.end(), ' '), input.end());
i = 0;
double result = parseExpression(input);
fout << result;
return 0;
}