Cod sursa(job #3148777)

Utilizator proflaurianPanaete Adrian proflaurian Data 4 septembrie 2023 11:10:36
Problema Evaluarea unei expresii Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("evaluare.in");
ofstream g("evaluare.out");
const int N = 100010;
char s[N];/// sirul de caractere continand expresia
int p;/// pozitia la care ma gasesc in s[]
int numar(),paranteza(),factor(),termen(),expresie();
int main()
{
    f>>s;
    g<<expresie();
    return 0;
}
int numar()
{
    /// p pozitionat pe prima cifra numarului
    int nr=0;///valoarea numarului
    while(isdigit(s[p]))
    {
        nr=10*nr+s[p]-'0';/// adaug cifra corespunzatoare lui s[p] la finalul nr
        p++;///trec la caracterul urmator
    }
    /// p pozitionat dupa ultima cifra a numarului
    /// nr = numarul dorit
    return nr;
}
int paranteza()
{
    /// p se afla pe pozitia caracterului '(' la care se deschide paranteza
    p++;/// mut cursorul la dreapta - am intrat in paranteza - trebuie sa evaluez expresia din paranteza
    int nr=expresie();/// se evalueaza expresia din paranteza < este treaba functiei expresie sa faca asta>
    /// dupa evaluare p se va gasi la finalul expresiei unde gaseste caracterul ')' care inchide paranteza
    p++;///mut cursorul la dreapta - p ajunge pe pozitia de dupa intreaga paranteza
    /// nr = valoare situata in paranteza
    return nr;
}
int factor()
{
    if(s[p]=='(')
        return paranteza();
    return numar();
}
int termen()
{
    int nr=factor();
    while(s[p]=='*' || s[p]=='/')
    {
        if(s[p]=='*'){p++;nr*=factor();}
        else{p++;nr/=factor();}
    }
    return nr;
}
int expresie()
{
    int nr=termen();
    while(s[p]=='+' || s[p]=='-')
    {
        if(s[p]=='+'){p++;nr+=termen();}
        else{p++;nr-=termen();}
    }
    return nr;
}