Sunteți pe pagina 1din 4

Evaluare expresiilor folosind recursivitatea

Se da un sir de caractere ce reprezintă o expresie aritmetica.

Forma poloneza
Sa se determine forma poloneza a expresiei
Exemplu: (a+b)*(a*c-b/d)
se va afișa forma poloneza: ab+ac*bd/-*
Se va folosi recursivitatea indirecta in rezolvarea problemei.
Vom observa ca orice expresie este "împărțită" in următoarele componente:
1) termeni ai unei adunări, separați de '+' sau '-'
2) factori ai unui produs, separați de '*' sau '/'
3) subexpresii, încadrate intre paranteze '(' si ')' sau litere.

Solutie:
#include <bits/stdc++.h>
#define N 100001
using namespace std;
ifstream fin("polonez.in");
ofstream fout("polonez.out");
char e[N], pol[N];
int i,lg,lgp;
void Expresie();
void Termen();
void Factor();
int main()
{
fin.getline(e,N);
lg=strlen(e);
Expresie();
fout<<pol;
return 0;
}

void Expresie()
{
Termen();
while(i<lg && (e[i]=='+'||e[i]=='-'))
{
if(e[i]=='+'){i++; Termen();pol[lgp++]='+';}
else {i++; Termen(); pol[lgp++]='-';}
}
}

void Termen()
{
Factor();
while(i<lg && (e[i]=='*'||e[i]=='/'))
{
if(e[i]=='*'){i++; Factor();pol[lgp++]='*';}
else {i++; Factor();pol[lgp++]='/';}
}
}

void Factor()
{
if(e[i]=='('){i++; Expresie();i++;}
else pol[lgp++]=e[i++];
}

Evaluarea expresiei
Fisierul de intrare evaluare.in va conține pe prima linie un sir de caractere compus din cifre ( '0' -
'9' ), operatorii '+', '-', '*', '/' si paranteze( '(', ')' ).

evaluare.in evaluare.out
(1+1)*13+10/2 31

Solutie:

Se va folosi recursivitatea indirecta in rezolvarea problemei.


Vom observa ca orice expresie este "împărțită" in următoarele componente:
1) termeni ai unei adunări, separați de '+' sau '-'
2) factori ai unui produs, separați de '*' sau '/'
3) subexpresii, încadrate intre paranteze '(' si ')' sau numere formate numai din cifre.
Prezenta subexpresiilor ne indica faptul ca la un moment dat va fi necesara întoarcerea in
cazul (1) si implicit a necesitații recursivității indirecte.

Funcția expresie() va "aduna" toți termenii unei expresii/subexpresii.


Funcția termen() se ocupa de conținutul unui termen. Acesta este compus la rândul lui din
factori înmulțiți.
Funcția factor() va returna valoarea unui singur factor, care poate fi o subexpresie sau un
număr natural

#include <fstream>
using namespace std;
ifstream fin ( "evaluare.in" );
ofstream fout ("evaluare.out" );
const int N = 100001;
int p;
char s[N];

int expresie();
int termen();
int factor();

int expresie()
{
int sum = termen();
while ( s[p] == '+' || s[p] == '-' )
{
if ( s[p] == '+' ){ p++; sum += termen();}
else { p++; sum -= termen();}
}
return sum;
}

int termen ()
{
int prod = factor();
while ( s[p] == '*' || s[p] == '/' )
{
if ( s[p] == '*' ){p++; prod *= factor();}
if ( s[p] == '/' ){p++;prod /= factor();}
}
return prod;
}
int factor ()
{
int val = 0, semn = 1;
while ( s[p] == '-' )
{
semn = -semn; p++;
}
if ( s[p] == '(' )
{
p++; val = expresie(); p++;
return semn * val;
}
while ( s[p] >= '0' && s[p] <= '9' )
val = val * 10 + ( s[p++] - '0' );
return semn * val;
}
int main()
{
fin.getline( s, N );
fout << expresie();
return 0;
}

S-ar putea să vă placă și