Pagini recente » Cod sursa (job #2539358) | Cod sursa (job #1703172) | Cod sursa (job #2898230) | Cod sursa (job #883861) | Cod sursa (job #2358266)
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
int eval(char str[], int len){
bool signs = false;
for(int i=0; i<len && !signs; i++)
if(strchr("+-/*", str[i]) != NULL)
signs = true;
if(!signs){
int value = 0;
for(int i=0; i<len; i++)
value = value *10 + str[i] - '0';
return value;
}
int start = 0, brackets = 0;
bool lastAndFirst = false;
if(str[start] == '(')
lastAndFirst = true;
char * plus=NULL, * minus=NULL;
char * mult=NULL, * div=NULL;
for(int i=start; i<len; i++)
{
if(str[i] == '(')
brackets++;
else if(str[i] == ')')
brackets--;
if(brackets == 0 && i != len -1)
lastAndFirst = false;
if(brackets == 0 && str[i] == '+')
plus = str+i;
else if(brackets == 0 && str[i] == '-')
minus = str+i;
else if(brackets == 0 && str[i] == '*')
mult = str+i;
else if(brackets ==0 && str[i] == '/')
div = str+i;
}
if(lastAndFirst)
return eval(str+1, len-2);
if(plus != NULL && minus != NULL){
if(plus > minus){
return eval(str+start, (int)(plus-str)) + eval(plus+1, len-(int)(plus-str)-1);
}else{
return eval(str+start, (int)(minus-str)) - eval(minus+1, len-(int)(minus-str)-1);
}
}else if(plus != NULL)
return eval(str+start, (int)(plus-str)) + eval(plus+1, len-(int)(plus-str)-1);
else if(minus != NULL)
return eval(str+start, (int)(minus-str)) - eval(minus+1, len-(int)(minus-str)-1);
if(mult != NULL && div != NULL){
if(mult > div){
return eval(str+start, (int)(mult-str)) * eval(mult+1, len-(int)(mult-str)-1);
}else{
return eval(str+start, (int)(div-str)) / eval(div+1, len-(int)(div-str)-1);
}
}else if(mult != NULL)
return eval(str+start, (int)(mult-str)) * eval(mult+1, len-(int)(mult-str)-1);
else if(div != NULL)
return eval(str+start, (int)(div-str)) / eval(div+1, len-(int)(div-str)-1);
return 0;
}
int main() {
ifstream f("evaluare.in");
ofstream g("evaluare.out");
char str[100000]="";
f>>str;
g<<eval(str, strlen(str));
return 0;
}