Cod sursa(job #2109925)

Utilizator MarianConstantinMarian Constantin MarianConstantin Data 20 ianuarie 2018 11:28:10
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

char a[100010], n;

int cautasemn(int st, int dr)
{
    int nr=0, poz1=-1, poz2=-1;
    for (int i=st; i<=dr; i++)
    {
        if ((a[i]=='-' || a[i]=='+') && nr==0)
        {
            poz1=i;
        }
        if ((a[i]=='*' || a[i]=='/') && nr==0)
        {
            poz2=i;
        }
        if (a[i]=='(')
            nr++;
        if (a[i]==')')
            nr--;
    }
    if (poz1!=-1)
        return poz1;
    return poz2;
}

int paranteze(int st, int dr)
{
    int nr=0, p=0;
    for (int i=st; i<=dr; i++)
    {
        if (nr==0 && p==1)
            return 0;
        if (a[i]=='(')
        {
            nr++;
            p=1;
        }
        if (a[i]==')')
            nr--;
    }
    if (p==1)
        return 1;
    return 0;
}

int valoare(char x)
{
    return x-48;
}

int calcul(int x, int y, char a)
{
    if (a=='-')
        return x-y;
    if (a=='+')
        return x+y;
    if (a=='*')
        return x*y;
    return x/y;
}

int num(int st, int dr)
{
    int numar=0;
    for (int i=st; i<=dr; i++)
        numar=numar*10+valoare(a[i]);
    return numar;
}

int ex(int st, int dr)
{
    if (paranteze(st, dr))
        return ex(st+1, dr-1);
    int semn=cautasemn(st, dr);
    if (semn==-1)
        return num(st, dr);
    int e1=ex(st, semn-1), e2=ex(semn+1, dr);
    return calcul(e1, e2, a[semn]);
}

int main()
{
    ifstream fin("evaluare.in");
    ofstream fout("evaluare.out");
    fin.getline(a, 100010);
    n=strlen(a);
    fout << ex(0, n-1);
    return 0;
}