Cod sursa(job #1610405)

Utilizator Emy1337Micu Emerson Emy1337 Data 23 februarie 2016 15:14:01
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <ctype.h>
using namespace std;

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


string a;
int n;


int fadunascade (int &poz);


int getNumber(int &poz)
{
    int nr = 0;

    while (isdigit(a[poz]))
    {
        nr = nr * 10 + (int)a[poz] - 48;
        poz++;
    }

    return nr;
}

int finmul(int &poz, int prod, int type)
{

    while (poz <= n)
    {
        int nr = 0;
        if (isdigit(a[poz]))
            nr = getNumber(poz);
        else if (a[poz] == '(') {
            poz++;
            nr = fadunascade(poz);
        }

        if (type == 1)
            prod *= nr;
        else
            prod /= nr;

        if (a[poz] == '+' || a[poz] == '-')
            return prod;

        if (a[poz] == '*')
            type = 1;
        else type = -1;

        if (a[poz] == ')')
            return prod;

        poz++;
    }

    return prod;
}


int fadunascade (int &poz)
{
    int sum = 0, semn = 1;

    if (a[poz] == '-')
    {
        semn = -1;
        poz++;
    }

    while (poz <= n)
    {
        int nr = 0;
        if (isdigit(a[poz]))
            nr = getNumber(poz);
        else if (a[poz] == '(') {
            poz++;
            nr = fadunascade(poz);
        }

        if (a[poz] == '*' || a[poz] == '/'){
            if (a[poz] == '*')
                sum += semn * finmul(++poz, nr, 1);
            else
                sum += semn * finmul(++poz, nr, -1);

        }
        else
            sum += semn * nr;

        if (a[poz] == '+')
            semn = 1;
        else semn = -1;

        if (a[poz] == ')') {
            ++poz;
            return sum;
        }

        poz++;
    }

    return sum;
}

int main()
{

    fin >> a;

    n = a.size() - 1;
    int poz = 0;

    fout << fadunascade(poz);

    return 0;

}