Cod sursa(job #283097)

Utilizator shnakoVlad Schnakovszki shnako Data 18 martie 2009 18:43:25
Problema Evaluarea unei expresii Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define NR 100001
FILE *f, *g;
char a[NR], v[NR], st[NR];
long i, n, r, k, sw, j, stn[NR], q;
int main(void)
{
f=fopen("evaluare.in", "r");
g=fopen("evaluare.out", "w");
fgets(v, NR, f);
n=strlen(v)-1;
k=0;
for (i=0;i<=n;i++)
	if (isdigit(v[i]))
   	{
      while (isdigit(v[i]))
      	a[r++]=v[i++];
      a[r++]=' ';
      i--;
      }
   else
   	{
      sw=0;
      if (v[i]=='(')
      	{
         sw=1;
      	st[++k]=v[i];
         }
      if (v[i]==')')
         {
      	while (st[k]!='(')
            {
         	a[r++]=st[k--];
            a[r++]=' ';
            st[k+1]='\0';
				}
         st[k--]='\0';
         continue;
         }

      if (v[i]=='*'||v[i]=='/')
      	{
      	st[++k]=v[i];
         continue;
         }
      if ((v[i]=='-'||v[i]=='+')&&(st[k]=='-'||st[k]=='*'||st[k]=='/'||st[k]=='+'))
         {
      	while (st[k]=='-'||st[k]=='*'||st[k]=='/'||st[k]=='+')
         	{
            a[r++]=st[k];
            st[k--]='\0';
            a[r++]=' ';
				}
         st[++k]=v[i];
         continue;
         }
   	if (v[i]=='-'||v[i]=='+')
      	st[++k]=v[i];
      }
for (j=k;j>0;j--)
  	{
   a[r++]=st[j];
   a[r++]=' ';
   st[j]='\0';
   }
   
k=0;
r-=2;
for (i=0;i<=r;i++)
	if (isdigit (a[i]))
   	{
      q=0;
      while (isdigit(a[i]))
      	{
         q=10*q+a[i]-48;
         i++;
         }
      stn[++k]=q;
      }
   else
   	{
      if (a[i]=='+')
         stn[k-1]=stn[k]+stn[k-1];
      if (a[i]=='-')
         stn[k-1]=stn[k-1]-stn[k];
      if (a[i]=='*')
         stn[k-1]=stn[k-1]*stn[k];
      if (a[i]=='/')
      	stn[k-1]=stn[k-1]/stn[k];
      stn[k--]=0;
      i++;
      }
fprintf(g, "%ld", stn[1]);
fcloseall();
return 0;
}