Cod sursa(job #270532)

Utilizator PopaStefanPopa Stefan PopaStefan Data 4 martie 2009 09:29:34
Problema Evaluarea unei expresii Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.51 kb
/*
Acest program transforma o expresie aritmetica cu paranteze,
adunari, scaderi, inmultiri, impartiri in forma poloneza postfixata.
Forma poloneza postfixata are urmatoarele reguli :
1.    exp1 oper exp2      devine      exp1 exp2 operator;
2.    (exp)               devine      exp
Dupa aceea o evalueaza pe baza valorilor constantelor din fifier.
*/
#include<fstream.h>
#include<string.h>
#include<stdlib.h>

ifstream fin("evaluare.in");
ofstream fout("evaluare.out");

void termen(char &b);
void factor(char &c);

char exp[100001];
int poz=0;
long stiva[100001];
//char mat[101][10],n;

char citire()
{char q;
fin.get(q);
if(q!='\n');
return q;
}

void expresie(char &a)
{char op;
termen(a);
while(a=='+' || a=='-')
   {op=a;
   a=citire();
   termen(a);
   exp[poz]=op;
   poz++;
   }
}

void termen(char &b)
{char op;
factor(b);
while(b=='*' || b=='/')
   {op=b;
   b=citire();
   factor(b);
   exp[poz]=op;
   poz++;
   }
}

void factor(char &c)
{if(c>='a' && c<='z' || c>='0' && c<='9')
  {exp[poz]=c;
  poz++;
  c=citire();
  while(c>='0' && c<='9')
     {exp[poz]=c;
     c=citire();poz++;
     }
  if(c=='+' || c=='-' || c=='*' || c=='/')
	  if(exp[poz-1]>='0' && exp[poz-1]<='9') {exp[poz]=',';poz++;}
  }
 else if(c=='(')
	{c=citire();
	expresie(c);
	c=citire();
	}

}

void calculare()
{long i=0,j,p,q,nr,semn;
char numar[8];
for(j=0;j<strlen(exp);j++)
   /*   if(exp[j]>='a' && exp[j]<='z')
    {for(p=0;p<=n;p++)
      if(exp[j]==mat[p][0])
	 {nr=0;
	 q=2;   semn=0;
	 if(mat[p][q]=='-') {semn=1;q++;}
	 for(; mat[p][q]>='0' && mat[p][q]<='9';q++,nr++)
	     numar[nr]=mat[p][q];
	 numar[nr]='\0';
	 stiva[i]=atof(numar);
	 if(semn==1) stiva[i]=stiva[i]*(-1);
	 i++;
	 break;
	 }
     }
   else  */  if(exp[j]>='0' && exp[j]<='9')
		   {nr=0;
		   for(q=j;exp[q]>='0' && exp[q]<='9';q++,nr++)
		       numar[nr]=exp[q];
		   numar[nr]='\0';
		   stiva[i]=atol(numar);
		   i++;j=q-1;
		   }
      else
	   if(exp[j]=='+') {stiva[i-2]=stiva[i-2]+stiva[i-1];
			 i--;
			 }
	   else  if(exp[j]=='-')  {stiva[i-2]=stiva[i-2]-stiva[i-1];
				  i--;
				  }
		    else if(exp[j]=='*')
				  {stiva[i-2]=stiva[i-2]*stiva[i-1];
				  i--;
				  }
			   else if(exp[j]=='/')
				 {stiva[i-2]=stiva[i-2]/stiva[i-1];
				  i--;
				  }
fout<<stiva[0];
}

int main()
{char c=citire();
expresie(c);
/*int i=0;
while(!fin.eof())
  {fin>>mat[i];
  i++;
  }
n=i-1; */
exp[poz]='\0';
calculare();
fin.close();
fout.close();
return 0;
}