Pagini recente » Cod sursa (job #1163397) | Cod sursa (job #2961954) | Cod sursa (job #2467898) | Cod sursa (job #406495) | Cod sursa (job #894714)
Cod sursa(job #894714)
#include<fstream>
#include<cstring>
#define Nmax 100010
#define INFI 10000000
using namespace std;
int n, i, nr, p[Nmax], m, s[Nmax], sf, c[Nmax], val;
char d[Nmax];
void expresie ();
void factor ();
void termen ();
void exp_plus();
void exp_minus();
void term_ori();
void term_cat();
int main()
{
ifstream f("evaluare.in");
ofstream h("evaluare.out");
f.getline(d, Nmax);
m = strlen(d) - 1;
i = 0;
n = 0;
while (i <= m)
{
if (d[i] == '*')
{
s[n] = (- INFI - 4);
++i;
++n;
}
else
if (d[i] == '/')
{
s[n] = (- INFI - 3);
++i;
++n;
}
else
if (d[i] == '+')
{
s[n] = (- INFI - 2);
++i;
++n;
}
else
if (d[i] == '-')
{
s[n] = (- INFI - 1);
++i;
++n;
}
else
if (d[i] == '(' || d[i] == ')')
{
s[n] = (- INFI);
++i;
++n;
}
else
{
nr = int (d[i]) - 48;
++i;
while (d[i] >= '0' && d[i] <= '9')
{
nr *= 10;
nr += (int(d[i]) - 48);
++i;
}
s[n] = nr;
++n;
}
}
nr = 0;
i = 0;
expresie();
i = 0;
sf = 0;
while (i < nr)
{
if (p[i] > -INFI)
{
c[sf] = p[i];
++sf;
}
else
if (p[i] == -INFI - 2)
{
val = c[sf - 2] + c[sf - 1];
sf -= 2;
c[sf] = val;
++sf;
}
else
if (p[i] == -INFI - 1)
{
val = c[sf - 2] - c[sf - 1];
sf -= 2;
c[sf] = val;
++sf;
}
else
if (p[i] == -INFI - 4)
{
val = c[sf - 2] * c[sf - 1];
sf -= 2;
c[sf] = val;
++sf;
}
else
{
val = c[sf - 2] / c[sf - 1];
sf -= 2;
c[sf] = val;
++sf;
}
++i;
}
h << c[0] << '\n';
}
void expresie ()
{
termen ();
if (s[i] == (- INFI - 2))
exp_plus();
else
if (s[i] == (- INFI - 1))
exp_minus();
}
void exp_plus ()
{
while (i < n && s[i] == (- INFI - 2))
{
++i;
termen();
p[nr] = (- INFI - 2);
++nr;
//p[nr] = ;
}
}
void exp_minus ()
{
while (i < n && s[i] == (- INFI - 1))
{
++i;
termen();
p[nr] = (- INFI - 1);
++nr;
//p[nr] = 45;
}
}
void termen ()
{
factor();
if (s[i] == (- INFI - 4))
term_ori();
else
if (s[i] == (- INFI - 3))
term_cat();
}
void term_ori()
{
while (i < n && s[i] == (- INFI - 4))
{
++i;
factor();
p[nr] = (- INFI - 4);
++nr;
//p[nr] = 42;
}
}
void term_cat ()
{
while (i < n && s[i] == (- INFI - 3))
{
++i;
factor();
p[nr] = (- INFI - 3);
++nr;
//p[nr] = 47;
}
}
void factor ()
{
if (s[i] == (- INFI))
{
++i;
expresie();
++i;
}
else
{
p[nr] = s[i];
//p[nr] = int (s[i]);
++nr;
++i;
}
}