Pagini recente » Cod sursa (job #3289617) | Clasamentul arhivei educationale | Cod sursa (job #3291512) | Cod sursa (job #236379) | Cod sursa (job #3294059)
#include <iostream>
#include <fstream>
#include <string>
#include <cctype>
using namespace std;
string s; // șirul ce conține expresia
int pos; // poziția curentă în șir
// Parsează un factor: fie număr, fie expresie între paranteze
int parseFactor() {
int result = 0;
if (s[pos] == '(') {
pos++; // sare peste '('
result = parseExpression();
pos++; // sare peste ')'
return result;
} else {
// Verifică semnul negativ
bool neg = false;
if (s[pos] == '-') {
neg = true;
pos++;
}
// Construiește numărul din cifre
while (pos < s.size() && isdigit(s[pos])) {
result = result * 10 + (s[pos] - '0');
pos++;
}
return neg ? -result : result;
}
}
// Parsează termeni: factori separați prin '*' sau '/'
int parseTerm() {
int result = parseFactor();
while (pos < s.size() && (s[pos] == '*' || s[pos] == '/')) {
char op = s[pos++];
int nextFactor = parseFactor();
if (op == '*')
result = result * nextFactor;
else // op == '/'
result = result / nextFactor; // împărțire întreagă
}
return result;
}
// Parsează întreaga expresie: termeni separați prin '+' sau '-'
int parseExpression() {
int result = parseTerm();
while (pos < s.size() && (s[pos] == '+' || s[pos] == '-')) {
char op = s[pos++];
int nextTerm = parseTerm();
if (op == '+')
result = result + nextTerm;
else // op == '-'
result = result - nextTerm;
}
return result;
}
int main() {
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
// Se citește expresia din fișierul de intrare
getline(fin, s);
pos = 0; // inițializare poziție
// Evaluează expresia
int result = parseExpression();
// Scrie rezultatul în fișierul de ieșire
fout << result;
fin.close();
fout.close();
return 0;
}