Pagini recente » Cod sursa (job #1861185) | Cod sursa (job #828683) | Cod sursa (job #3203631) | Cod sursa (job #2720769) | Cod sursa (job #146527)
Cod sursa(job #146527)
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define in "evaluare.in"
#define out "evaluare.out"
#define lgt 100500
char exp[lgt];
void citire()
{
freopen(in,"r",stdin);
fgets(exp,lgt,stdin);
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 2; 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;
}
if (prioritate(exp[pos]) == 3)
return 0;
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);
}
}
long long 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];
//left = new char;
//right = new char;
if (k>0) // exp e expresie
{
strncpy(left,exp,k);//strncat(left,exp,k); // Partea dreapta a semnului
left[k]='\0';
strcpy(right,exp+k+1);//strcat(right,exp+k+1); // Partea stanga a semnului
right[strlen(exp)-(k+1)]='\0';
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
return atoi(exp);
}
int main()
{
citire();
freopen(out,"w",stdout);
printf("%.Ld",eval(exp));
fclose(stdout);
return 0;
}