Documente Academic
Documente Profesional
Documente Cultură
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:
#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;
}