Pagini recente » Cod sursa (job #1876445) | Cod sursa (job #2987166) | Cod sursa (job #1877265) | Cod sursa (job #1838533) | Cod sursa (job #146435)
Cod sursa(job #146435)
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define in "evaluare.in"
#define out "evaluare.out"
#define lgt 100000
char exp[lgt];
void citire()
{
freopen(in,"r",stdin);
gets(exp);
fclose(stdin);
}
void deparantezare(char *exp) // sterge parantezele
{
char *x=new char;
x = exp;
int l=strlen(x);
strcpy(exp,"");
strncat(exp,x+1,l-2);
}
int prioritate(char p)
{
switch (p)
{
case '+': return 0; break;
case '-': return 0; break;
case '/': return 1; break;
case '*': return 1; break;
default: return 3; break;
}
}
int semn(char *exp)
{
int pos=0,p=0;
for (int i=0;i<strlen(exp);i++)
{
if (exp[i] == '(') p++;
if (exp[i] == ')') p--;
if (prioritate(exp[i])<=prioritate(exp[pos]) && p == 0)
pos = i;
}
return pos;
}
void curata(char *exp)
{
int k=0;
if (exp[0] == '(' && exp[strlen(exp)-1] == ')')
while (!k && strlen(exp)>2)
{
int p=0;
int l=strlen(exp);
for (int i=0;i<l-1;i++)
{
if (exp[i] == '(') p++;
if (exp[i] == ')') p--;
if (p==0 && i>0)
{
k=1;
break;
}
}
if (!k)
deparantezare(exp);
}
}
int eval(char *exp)
{
curata(exp); // curatam expresia de paranteze
int k = semn (exp); // se cauta semnul cu prioritate in expresie
char left[lgt],right[lgt];
if (k>0) // exp e expresie
{
strcpy(left,""); strncat(left,exp,k); // Partea dreapta a semnului
strcpy(right,""); strcat(right,exp+k+1); // Partea stanga a semnului
switch(exp[k])
{
case '+': return eval(left)+eval(right); break;
case '-': return eval(left)-eval(right); break;
case '/': return eval(left)/eval(right); break;
case '*': return eval(left)*eval(right); break;
}
}
// exp e numar
//printf("%f\n",atof(exp));
return atoi(exp);
}
int main()
{
citire();
freopen(out,"w",stdout);
printf("%d",eval(exp));
fclose(stdout);
return 0;
}