Pagini recente » Cod sursa (job #641098) | Cod sursa (job #511296) | Cod sursa (job #1430805) | Cod sursa (job #2789814) | Cod sursa (job #3293968)
#include <fstream>
#include <string>
#include <cctype>
ifstream fin ("evaluare.in");
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 (s[i] == '(') {
i++;
double val = parseExpression(s);
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 = "";
fin.getline(input, 100001);
input.erase(remove(input.begin(), input.end(), ' '), input.end());
i = 0;
double result = parseExpression(input);
fout << result;
return 0;
}