Cod sursa(job #256821)

Utilizator otilia_sOtilia Stretcu otilia_s Data 12 februarie 2009 11:38:16
Problema Evaluarea unei expresii Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
//evaluarea unei expresii artimetice date
#include <stdio.h>
#include <string.h>
#define NMAX 100001
int p[NMAX],n;
struct ind {long v; char c;}e[NMAX];
long s;
struct Nod {ind op; Nod *as,*ad;};


void citire()
{ int pri; char ch;
 FILE *fin=fopen("evaluare.in","r");
 pri=0; n=0; e[0].c=0; int i;
 char expresie[NMAX];
 fscanf(fin,"%s",&expresie); int l=strlen(expresie);
 for (i=0;i<l;i++)
  {
   ch=expresie[i];
   if (('0'<=ch&&ch<='9')||(ch==')')||(ch=='(')||(ch=='*')||(ch=='-')||(ch=='+')||(ch=='/'))
      {
	switch (ch)
	 {
	  case '(': {pri+=10;break;}
	  case ')': {pri-=10;break;}
	  case '+': { e[++n].c=ch;p[n]=pri+1;break;}
	  case '-': { e[++n].c=ch;p[n]=pri+1;break;}
	  case '*': { e[++n].c=ch;p[n]=pri+10;break;}
	  case '/': { e[++n].c=ch;p[n]=pri+10;break; }
	  default : {
		     if (e[n].c==0&&n>0) e[n].v=e[n].v*10+(ch-'0');
			else {e[++n].v=ch-'0';p[n]=1000;}
		    }
	 }
      }
  }
 fclose(fin);
}

Nod *arb(int li, int ls)
{
 Nod *cc;
 int i,j,min;
 min=p[ls];
 i=ls;
 for (j=ls;j>=li;j--)
  if (p[j]<min) {min=p[j]; i=j;}
 cc=new Nod;
 cc->op=e[i];
 if (li==ls) {cc->as=cc->ad=0;}
    else
     {
      cc->as=arb(li,i-1);
      cc->ad=arb(i+1,ls);
     }
 return cc;
}


long parc(Nod *cc)
{
 if (cc)
    {
      if (cc->op.c)
	  {
	   switch (cc->op.c)
	   {
	    case '+': {return (parc(cc->as)+parc(cc->ad));}
	    case '-': {return (parc(cc->as)-parc(cc->ad));}
	    case '*': {return (parc(cc->as)*parc(cc->ad));}
	    case '/': {return (parc(cc->as)/parc(cc->ad));}
           }
	  }
	 else return cc->op.v;
    }
 return 0;
}

void afisare()
{
 FILE *fout=fopen("evaluare.out","w");
 fprintf(fout,"%ld\n",s);
 fclose(fout);
}

int main()
{
 citire();
 Nod *C=arb(1,n);
 s=parc(C);
 afisare();
 return 0;
}