Cod sursa(job #151854)

Utilizator alecmanAchim Ioan Alexandru alecman Data 8 martie 2008 18:18:58
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include<stdio.h>
#include<string.h>

#define INPUT "evaluare.in"
#define OUTPUT "evaluare.out"

FILE *fin=fopen(INPUT, "r"),*fout=fopen(OUTPUT, "w");

void readValues();

long solveFunction();

inline void printSolution(long val){fprintf(fout, "%ld\n", val);}

long preiaNumar();

long pozitie,nr;

char vect[100002];

int main(){
  readValues();
  pozitie=0;
  printSolution(solveFunction());
  fclose(fin);
  fclose(fout);
  return 0;
}

void readValues(){
  char ch;
  fscanf(fin, "%c", &ch);
  vect[0]='(';
  nr=1;
  while(ch!='\n'&&!feof(fin)){
    vect[nr++]=ch;
    fscanf(fin, "%c", &ch);
  }
  vect[nr++]=')';
}

long solveFunction(){
  long val1,val2,val3,val0;
  int exista;
  char semn,semn2,semnSchimb;
  val0=0;
  exista=0;
  val1=preiaNumar();
  while(vect[pozitie]!=')'&&pozitie<nr){
    semn=vect[pozitie];
    if(semn=='*'||semn=='/'){
      ++pozitie;
      if(vect[pozitie]=='('){
	++pozitie;
	val2=solveFunction();
      }
      else
	val2=preiaNumar();
      if(semn=='*') val1*=val2;
      else if(semn=='/') val1/=val2;
    }
    else
    if(semn=='+' || semn=='-'){
      if(exista){
	if(semnSchimb=='+') val1+=val0;
	else if(semnSchimb=='-') val1=val0-val1;
	exista=0;
	semnSchimb='\0';
      }
      ++pozitie;
      if(vect[pozitie]=='('){
	++pozitie;
	val2=solveFunction();
      }
      else
	val2=preiaNumar();
      semn2=vect[pozitie];
      if(semn2=='+'||semn2=='-'||semn2==')'){
	if(semn=='+') val1+=val2;
	else if(semn=='-') val1-=val2;
      }
      else{
	++pozitie;
	if(vect[pozitie]=='('){
	  ++pozitie;
	  val3=solveFunction();
	}
	else
	  val3=preiaNumar();
	if(semn2=='*') val2*=val3;
	else if(semn2=='/') val2/=val3;
	val0=val1;
	semnSchimb=semn;
	exista=1;
	val1=val2;
      }
    }
    else
    if(semn=='('){
      ++pozitie;
      val1=solveFunction();
    }
  }
  if(exista){
    if(semnSchimb=='+') val1+=val0;
    else if(semnSchimb=='-') val1=val0-val1;
    exista=0;
    semnSchimb='\0';
  }
  ++pozitie;
  return val1;
}

long preiaNumar(){
  long x=0;
  while(vect[pozitie]>='0' && vect[pozitie]<='9'){
    x=x*10+vect[pozitie]-'0';
    ++pozitie;
  }
  return x;
}