Cod sursa(job #1127377)

Utilizator rughibemBelcineanu Alexandru Ioan rughibem Data 27 februarie 2014 12:13:48
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<stdio.h>
#include<string.h>
#define DIM 100005
FILE *f=fopen("evaluare.in","r"), *g=fopen("evaluare.out","w");

long int Ls, P;
char s[DIM];

long int DecodareNumar(){
long int nr;
    nr=0;
    while('0' <= s[P] && s[P] <= '9'){
        nr=nr*10+ (s[P]-'0'); P++;
    }
    return nr;
}

long int Rezolva(){
long int sum=0, inter=1;    // sum = final, inter = intermediar
long int SemnPM=1;    // 0 = -, 1 = +
long int SemnII=1;    // 0 = /, 1 = *

    while(P<Ls){

        if( s[P]=='-' || s[P]=='+' || s[P]==')' ){
            if( SemnPM == 0 ) { sum-=inter; inter=1; SemnII=1; }
            else              { sum+=inter; inter=1; SemnII=1; }
        }

             if( s[P]=='-' ){ SemnPM=0; P++; }
        else if( s[P]=='+' ){ SemnPM=1; P++; }
        else if( s[P]=='/' ){ SemnII=0; P++; }
        else if( s[P]=='*' ){ SemnII=1; P++; }

        else if( s[P]==')' ){ P++; return sum; }

        else if( '0' <= s[P] && s[P] <= '9' ){

            if( SemnII==0 ) inter/= DecodareNumar();
            else            inter*= DecodareNumar();

        }
        else if( s[P]=='(' ){
            P++;
            if( SemnII==0 ) inter/= Rezolva();
            else            inter*= Rezolva();

        }

    }

    if( SemnPM == 0 ) { sum-=inter; inter=1; SemnII=1; }
    else              { sum+=inter; inter=1; SemnII=1; }

    return sum;

}

int main(){

    fscanf(f,"%s\n",s);
    Ls=strlen(s); P=0;
    fprintf(g,"%ld\n",Rezolva());

return 0;
}