Cod sursa(job #1303587)
Utilizator | Data | 28 decembrie 2014 09:24:47 | |
---|---|---|---|
Problema | Evaluarea unei expresii | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 4.28 kb |
#include<iostream>
#include<fstream>
#include<stdio.h>
#include<bitset>
#include<string>
using namespace std;
string s;
int i;
int parant(int n)
{
long long a=0;
//i=0;
++i;
if(s[i]!='(')
{
while(s[i]>='0'&&s[i]<='9')
{
a=a*10+s[i]-'0';
++i;
}
}
else
{
a=parant(n);
}
if(s[i]==')')
{
++i;
return a;
}
char o1;
o1=s[i];
++i;
long long b=0;
if(s[i]!='(')
{
while(s[i]>='0'&&s[i]<='9'&&i<n)
{
b=b*10+s[i]-'0';
++i;
}
}
else
{
b=parant(n);
}
char o2;
long long c;
for(;i<n&&s[i]!=')';)
{
o2=s[i];
++i;
if(s[i]!='(')
{
c=0;
while(s[i]>='0'&&s[i]<='9'&&i<n)
{
c=c*10+s[i]-'0';
++i;
}
}
else
{
c=parant(n);
}
if(o1=='*')
{
a=a*b;
b=c;
o1=o2;
}
else
if(o1=='/')
{
a=a/b;
b=c;
o1=o2;
}
else
{
if(o1=='+'&&(o2=='+'||o2=='-'))
{
a=a+b;
b=c;
o1=o2;
}
else
{
if(o1=='-'&&(o2=='+'||o2=='-'))
{
a=a-b;
b=c;
o1=o2;
}
else
{
if(o2=='*')
{
b=b*c;
}
else
b=b/c;
}
}
}
}
++i;
switch(o1)
{
case '+':a=a+b; break;
case '-':a=a-b; break;
case '*':a=a*b; break;
case '/':a=a/b; break;
}
return a;
}
int main()
{
ifstream si;
si.open("evaluare.in");
FILE* so=fopen("evaluare.out","w");
// string s;
si>>s;
//int i;
long long n=s.length();
long long a=0;
//i=0;
if(s[i]!='(')
{
while(s[i]>='0'&&s[i]<='9')
{
a=a*10+s[i]-'0';
++i;
}
}
else
{
a=parant(n);
}
char o1;
o1=s[i];
++i;
long long b=0;
if(s[i]!='(')
{
while(s[i]>='0'&&s[i]<='9'&&i<n)
{
b=b*10+s[i]-'0';
++i;
}
}
else
{
b=parant(n);
}
char o2;
long long c;
for(;i<n;)
{
o2=s[i];
++i;
if(s[i]!='(')
{
c=0;
while(s[i]>='0'&&s[i]<='9'&&i<n)
{
c=c*10+s[i]-'0';
++i;
}
}
else
{
c=parant(n);
}
if(o1=='*')
{
a=a*b;
b=c;
o1=o2;
}
else
if(o1=='/')
{
a=a/b;
b=c;
o1=o2;
}
else
{
if(o1=='+'&&(o2=='+'||o2=='-'))
{
a=a+b;
b=c;
o1=o2;
}
else
{
if(o1=='-'&&(o2=='+'||o2=='-'))
{
a=a-b;
b=c;
o1=o2;
}
else
{
if(o2=='*')
{
b=b*c;
}
else
b=b/c;
}
}
}
}
switch(o1)
{
case '+':a=a+b; break;
case '-':a=a-b; break;
case '*':a=a*b; break;
case '/':a=a/b; break;
}
fprintf(so,"%i\n",a);
}