Cod sursa(job #384272)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 19 ianuarie 2010 20:08:14
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<iostream>
#include<fstream>
#include<string.h>

using namespace std;

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

char e[101000];
long long int i,lg;
long long int k=0;
void Citire();
long long int eval(char);
long long int Evaluare_Expresie();
long long int Evaluare_Factor();
long long int Evaluare_Termen();

int main()
{   
	Citire();
	lg=strlen(e);
	fout<<Evaluare_Expresie();
	return 0;
}

void Citire()
{
	fin.getline(e,101000);
	return;
}

long long int eval(char c)
{  
   
   long long int sc=0;
   k=i;
   while(e[k]<='9' && e[k]>='0')
     {
	   sc=sc*10+e[k]-'0';
	   k++;
	 }
   return sc;
}

long long int Evaluare_Factor()
{
	long long int f;
	if(e[i]=='(')
	{
		i++;
		f=Evaluare_Expresie();
		i++;
	}
	else
	{
		f=eval(e[i]);
		if(k-i>=2)
			i=k;
		else
		    i++;
	}
	return f;
}

long long int Evaluare_Termen()
{
long long int f=Evaluare_Factor();
while( (e[i]=='*' || e[i]=='/') && i<lg)
{
if(e[i]=='*')
  {
	i++;
	f*=Evaluare_Factor();
  }
 else
    if(e[i]=='/')
     {  
	  i++;
      f/=Evaluare_Factor();
     }
}
	return f;
}

long long int Evaluare_Expresie()
{
	long long int t=Evaluare_Termen();
	while(i<lg && (e[i]=='+' || e[i]=='-'))
	{
	if(e[i]=='+')
	  {
		 i++;
		 t+=Evaluare_Termen();}
	else
		if(e[i]=='-')
	{
		i++;
		t-=Evaluare_Termen();}
	}
	return t;
}