Cod sursa(job #157614)

Utilizator FlorinC1996Florin C FlorinC1996 Data 13 martie 2008 10:03:21
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.35 kb
#include <stdio.h>      
#include <string.h>      
#define MAX 100001   
     
char a[MAX];      
int n;      
     
void citire()      
{   
   freopen ("evaluare.in","r",stdin);   
   fgets(a,100001,stdin);   
   fclose (stdin);      
}      
     
long da(int st,int dr,char s1,char s2)   
{   
   int num=0;   
   for (int i=dr;i>=st;i--)   
   {   
       if (a[i]==')')   
      num++;   
       else  
     if (a[i]=='(')   
      num--;   
     else  
       if ((a[i]==s1 || a[i]==s2) && num==0)   
       return i;   
   }   
  
  return -1;   
}   
  
void paranteza(int &st,int &dr)   
{   
   int num=0;   
   if (a[st]!='('&& a[dr]!=')')   
      return ;   
   for (int i=dr-1;i>st;i--)   
      if (a[i]==')')   
     num++;   
      else  
    if (a[i]=='(')   
    {   
       num--;   
       if (num<0)   
      return ;   
    }   
   if (num==0)   
   {   
       st++;   
       dr--;   
       return ;   
   }   
}   
  
long lal (int n,int m)   
{   
    long aa=0;   
    char pp[100];   
     for (int k=n;k<=m;k++)   
          pp[k-n]=a[k];   
          pp[m-n+1]=0;   
    sscanf(pp,"%ld",&aa);   
    return aa;   
}   
  
long lol(int st,int dr)   
{   
  paranteza(st,dr);   
  long aux=da(st+1,dr,'+','-');   
  if (aux==-1)   
     aux=da(st+1,dr,'*','/');   
   if (aux==-1)   
       return lal(st,dr);   
   long S1=lol(st,aux-1),S2=lol(aux+1,dr);   
  switch (a[aux])   
   {   
   case '+': return S1+S2;   
   case '-':  return S1-S2;   
   case '*': return S1*S2;   
   default:  return S1/S2;   
   }   
}   
  
int main ()   
{   
   citire();   
   n=(a[strlen (a)-1]=='\n')?strlen(a)-2:strlen(a)-1;   
   freopen ("evaluare.out","w",stdout);   
   printf ("%ld\n",lol(0,n));   
   fclose(stdout);   
   return 0;   
}  
#include <stdio.h>   
#include <string.h>   
#define MAX 100001
  
char a[MAX];   
int n;   
  
void citire()   
{
   freopen ("evaluare.in","r",stdin);
   fgets(a,100001,stdin);
   fclose (stdin);   
}   
  
long da(int st,int dr,char s1,char s2)
{
   int num=0;
   for (int i=dr;i>=st;i--)
   {
       if (a[i]==')')
      num++;
       else
     if (a[i]=='(')
	  num--;
     else
       if ((a[i]==s1 || a[i]==s2) && num==0)
	   return i;
   }

  return -1;
}

void paranteza(int &st,int &dr)
{
   int num=0;
   if (a[st]!='('&& a[dr]!=')')
      return ;
   for (int i=dr-1;i>st;i--)
      if (a[i]==')')
     num++;
      else
    if (a[i]=='(')
    {
       num--;
       if (num<0)
	  return ;
    }
   if (num==0)
   {
       st++;
       dr--;
       return ;
   }
}

long lal (int n,int m)
{
    long aa=0;
    char pp[100];
	 for (int k=n;k<=m;k++)
	      pp[k-n]=a[k];
	      pp[m-n+1]=0;
    sscanf(pp,"%ld",&aa);
    return aa;
}

long lol(int st,int dr)
{
  paranteza(st,dr);
  long aux=da(st+1,dr,'+','-');
  if (aux==-1)
     aux=da(st+1,dr,'*','/');
   if (aux==-1)
       return lal(st,dr);
   long S1=lol(st,aux-1),S2=lol(aux+1,dr);
  switch (a[aux])
   {
   case '+': return S1+S2;
   case '-':  return S1-S2;
   case '*': return S1*S2;
   default:  return S1/S2;
   }
}

int main ()
{
   citire();
   n=(a[strlen (a)-1]=='\n')?strlen(a)-2:strlen(a)-1;
   freopen ("evaluare.out","w",stdout);
   printf ("%ld\n",lol(0,n));
   fclose(stdout);
   return 0;
}