Cod sursa(job #282898)

Utilizator shnakoVlad Schnakovszki shnako Data 18 martie 2009 15:20:40
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 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, 100001, 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';
         }
      if (v[i]=='+'&&st[k]!='+'&&st[k]!='*'&&st[k]!='/')
      	{
      	st[++k]=v[i];
         continue;
         }
      if (v[i]=='-'&&st[k]!='-'&&st[k]!='*'&&st[k]!='/')
         {
      	st[++k]=v[i];
         continue;
         }
      if (v[i]=='*'||v[i]=='/')
      	{
      	st[++k]=v[i];
         continue;
         }
      if (v[i]=='+'&&(st[k]=='+'||st[k]=='*'||st[k]=='/'))
         {
      	while (st[k]=='+'||st[k]=='*'||st[k]=='/')
         	{
            a[r++]=st[k];
            st[k--]='\0';
            a[r++]=' ';
				}
         st[++k]=v[i];
         }
      if (v[i]=='-'&&(st[k]=='-'||st[k]=='*'||st[k]=='/'))
         {
      	while (st[k]=='-'||st[k]=='*'||st[k]=='/')
         	{
            a[r++]=st[k];
            st[k--]='\0';
            a[r++]=' ';
				}
         st[k]=v[i];
         }
      if (i==n)
      	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;
}