Pagini recente » Cod sursa (job #2645965) | Cod sursa (job #2072513) | Cod sursa (job #1362360) | Cod sursa (job #2593832) | Cod sursa (job #419865)
Cod sursa(job #419865)
//#include <iostream>
#include <string>
#include <fstream>
using namespace std;
ifstream cin("evaluare.in");
ofstream cout("evaluare.out");
void init_expr(string &a)
{
int len = a.length(), nested = 0;
if (a[len - 1] == ')' && a[0] == '(')
{
int i;
for (i = 0; i < len; ++i)
{
if (a[i] == '(') nested++;
if (a[i] == ')') nested--;
if (!nested && i != len - 1) break;
}
if (i == len)
{
a.erase(len - 1);
a.erase(0, 1);
init_expr(a);
return;
}
}
if (a[0] == '+') a.erase(0, 1);
if (a[0] == '-') a = '0' + a;
}
int split_position(string a)
{
int len = a.length(), nested = 0;
for (int i = 0; i < len; ++i)
{
if (a[i] == '(') nested++;
if (a[i] == ')') nested--;
if (!nested && (a[i] == '+' || a[i] == '-')) return i;
}
for (int i = 0; i < len; ++i)
{
if (a[i] == '(') nested++;
if (a[i] == ')') nested--;
if (!nested && (a[i] == '*' || a[i] == '/')) return i;
}
return -1;
}
inline int get_sign_code(char a)
{
if (a == '+') return 1;
if (a == '-') return 2;
if (a == '*') return 3;
if (a == '/') return 4;
return 0;
}
bool is_number(string a)
{
int len = a.length();
for (int i = 0; i < len; ++i)
{
if (a[i] < '0' || a[i] > '9') return 0;
}
return 1;
}
int get_int(string a)
{
int len = a.length(), nr = 0;
for (int i = 0; i < len; ++i)
{
nr = nr * 10;
nr = nr + (a[i] - '0');
}
return nr;
}
int calc(int a, int b, int s)
{
if (s == 1) return a + b;
if (s == 2) return a - b;
if (s == 3) return a * b;
if (s == 4) return a / b;
return 0;
}
int solve_expr(string a)
{
init_expr(a); //cout << a << endl;
if (is_number(a)) return get_int(a);
string b = a;
int pos = split_position(a);
int sign = get_sign_code(a[pos]);
a.erase(pos);
b.erase(0, pos + 1);
return calc(solve_expr(a), solve_expr(b), sign);
}
int main()
{
string a;
cin >> a;
string inm;
inm = '*';
for (unsigned int i = 0; i < a.length() - 1; ++i)
{
if (a[i] >= '0' && a[i] <= '9' && a[i+1] == '(')
{
a.insert(i + 1, inm);
}
}
cout << solve_expr(a);
}