Cod sursa(job #680864)
Utilizator | Data | 16 februarie 2012 00:58:23 | |
---|---|---|---|
Problema | Evaluarea unei expresii | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 4.18 kb |
/*
w/o ( support . for tests
*/
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <stdlib.h>
#include <string.h>
using namespace std;
void calc(unsigned &pos, char &op, string expr, unsigned long &rezultat)
{
string::iterator it = expr.begin();
it += pos;
int num, num2;
unsigned pstart;
unsigned long rez_sub = 0;
char op_sub;
char len[32], len2[32];
size_t sl, s2;
if(*it >= '0' && *it <= '9')
{
num = atoi(&*it);
sprintf(len, "%d", num);
sl = strlen(len);
if((it + sl) < expr.end() || *(it + sl) == ')')
{
pos += sl;
it += sl;
}
if(strchr("*/", *it))
{
if(*it == '*')
{
if(*(it + 1) == '(')
{
pstart = pos;
++pos;
++it;
op_sub = '+';
while(*it != ')')
{
calc(pos, op_sub, expr, rez_sub);
++it;
++pos;
}
++it;
--pos;
num2 = rez_sub;
s2 = pos - pstart;
}
else
{
num2 = atoi(&*(it + 1));
sprintf(len2, "%d", num2);
s2 = strlen(len2);
}
if(op == '+')
rezultat += (num * num2);
else if(op == '-')
rezultat -= (num * num2);
else if(op == '/')
rezultat /= (num * num2);
else if(op == '*')
rezultat *= (num * num2);
if((it + 1 + s2) < expr.end() || *(it + 1 + s2) == ')')
{
pos += s2 + 1;
it += s2 + 1;
}
}
else if(*it == '/')
{
num2 = atoi(&*(it + 1));
sprintf(len2, "%d", num2);
s2 = strlen(len2);
if(op == '+')
rezultat += (num / num2);
else if(op == '-')
rezultat -= (num / num2);
else if(op == '/')
rezultat /= (num / num2);
else if(op == '*')
rezultat *= (num / num2);
if((it + 1 + s2) < expr.end() || *(it + 1 + s2) == ')')
{
pos += s2 + 1;
it += s2 + 1;
}
}
}
else if(op == '+')
rezultat += num;
else if(op == '-')
rezultat -= num;
op = *it;
}
else if(strchr("+*-/", *it))
op = *it;
}
int main()
{
string expr;
unsigned long rezultat = 0;
freopen("evaluare.in", "r", stdin);
while(!feof(stdin))
expr.push_back(fgetc(stdin));
fclose(stdin);
string::iterator it;
char op = '+';
unsigned pos = 0;
for(it=expr.begin();it<expr.end();++it,++pos)
calc(pos, op, expr, rezultat);
expr.clear();
freopen("evaluare.out", "w", stdout);
cout<<rezultat<<"\n";
fclose(stdout);
return 0;
}