Cod sursa(job #2241666)

Utilizator cristii2000cristiiPanaite Cristian cristii2000cristii Data 16 septembrie 2018 17:37:00
Problema Evaluarea unei expresii Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <cmath>

using namespace std;

char a[100];

ifstream f("evaluare.in");
ofstream g("evaluare.out");

int VerifParanteze(int st, int dr)
{
    int v = 0;
    for(int i=st; i<=dr; i++)
    {
        if(a[i] == '(')
            v++;
        else if(a[i] == ')')
        {
            v--;
            if(v < 0) return 0;
        }
    }
    return v == 0;
}

int CautaSemne(char s1, char s2, int st, int dr)
{
    int v = 0;
    for(int i=dr; i>=st; i--)
    {
        if(a[i] == '(')
            v++;
        else if(a[i] == ')')
            v--;
        if((a[i] == s1 || a[i] == s2) && v == 0)
            return i;
    }
    return -1;
}

float Transform(int st, int dr)
{
    float nr = 0;
    for(int i=st; i<=dr; i++)
        nr = nr * 10 + (a[i] - '0');
    return nr;
}

float Operation(float x, float y, char op)
{
    switch(op)
    {
        case '+':
            return x+y;
        case '-':
            return x-y;
        case '*':
            return x*y;
        case '/':
            return x/y;
        case '^':
            return pow(x, y);
    }
}

float DivEtImp(int st, int dr)
{
    while(a[st] == '(' && a[dr] == ')' && VerifParanteze(st+1, dr-1))
    {
        st++;
        dr--;
    }
    int p = CautaSemne('+', '-', st, dr);
    if(p == -1)
        p = CautaSemne('*', '/', st, dr);
    if(p == -1)
        p = CautaSemne('^', '^', st, dr);
    if(p == -1)
        return Transform(st, dr);
    return Operation(DivEtImp(st, p-1), DivEtImp(p+1, dr), a[p]);
}

void citire()
{
    f.getline(a, 100);
}

int main()
{
    citire();
    g<<DivEtImp(0, strlen(a)-1);
    return 0;
}