Cod sursa(job #2111687)

Utilizator vlad_schillerSchiller Vlad Radu vlad_schiller Data 22 ianuarie 2018 16:27:22
Problema Evaluarea unei expresii Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
char a[5000];
void citire()
{
    fin.getline(a,1000);
}
int pozitie(char semn1,char semn2,int st, int dr)
{ int nr=0;
    for(int i=dr; i>=st; i--)
    {
         if(a[i]==')')
            nr--;
        else if(a[i]=='(')
            nr++;
        if((a[i]==semn1||a[i]==semn2) && nr==0)
            return i;
    }

    return -1;
}
int scp(int st,int dr)
{
    int nr=0;
    for(int i=st; i<=dr; i++)
    {
        if(a[i]=='(')
            nr++;
        if(a[i]==')')
            nr--;
        if(nr==-1)
        {
            return 0;
        }
    }
    if(nr==0)
        return 1;
    else
        return 0;
}
void elimpara(int &st,int &dr)
{
      while(a[st]=='(' && a[dr]==')')
    {
        if(scp(st+1,dr-1) == 0)
            return;
        st++;
        dr--;
    }
}
int int_str(int st,int dr)
{
    int nr=0;
    for(int i=st; i<=dr; i++)
    {
        nr=nr*10+(a[i]-'0');
    }
    return nr;
}
int eval(int st, int dr)
{
    elimpara(st,dr);
    int p=pozitie('+','-',st,dr);
    if(p==-1)
    {
        p=pozitie('*','/',st,dr);
        if(p==-1)
            return int_str(st,dr);
    }
    int v1=eval(st,p-1);
    int v2=eval(p+1,dr);

    switch (a[p])
    {
    case '+':
        return v1+v2;
    case '-':
        return v1-v2;
    case '*':
        return v1*v2;
    case '/':
        return v1/v2;
    }
    return -1;
}
int main()
{
    citire();
    int st=0;
    int dr=strlen(a)-1;
    fout<<eval(st,dr);
    return 0;
}