Restaurarea unui apel de functie
1Se citeste din fisierul fisier.in un sir de maxim 100 de caractere care reprezinta o succesiune de nume de functii si variabile, formate dintr-un singur caracter. Pentru fiecare functie ce intervine in sir se citesc numele si aritatea ( numarul de argumente) de pe o linie din fisier. Restaurati sirul de caractere, punand la locul lor parantezele si virgulele, astfel incat sa reprezinta un apel de funcite corect.
Exemplu:
fxgxyzhx
f 3
g 3
h 1
functia restaurata va fi
f(x,g(x,y,z),h(x))
- Solutie
Vom aborda problema recursiv. Memoram numele functiilor in vectorul NumeFunctie, iar aritatea o vom memora in vectorul Aritate. Numarul de functii fa fi notat cu NrFunctii.
Pentru a restaura apelul de functie din sirul de caractere (pe care-l vom nota cu sir) vom utiliza o functie recursiva denumita Restaurare(), cu parametrul i. Cu ajutorul acestei functii vom indica pozitia la care am ajuns cu restarurarea in sirul de intrare. Mai precis, in functia Restaurare verificam daca pe pozitia i din sir este un nume de functie. In acest caz vom scrie numele functiei, urmat de ‘(‘ , apoi vom restaura din nou (recursiv) fiecare argument al functiei, separand argumentele prin ‘ , ‘. Dupa ce ultimul argument a fost restaurat, afisam caracterul ‘)’.
Programul va arata astfel:
#include #include using namespace std; #define MAX 100 char NumeFunctie[MAX]; char sir[MAX]; int Aritate[MAX], NrFunctii; void citire() { ifstream f("fisier.in"); char c; int a; f.getline(sir, 100); while (!f.eof() ) { f>>c>>a; NumeFunctie[NrFunctii] = c; Aritate[NrFunctii++] = a; } f.close(); } int AR (char c) { for (int j=0; j<NrFunctii; ++j) if (NumeFunctie[j] == c) return Aritate[j]; return 0; } void Restaurare (int & i) { int k, j; cout<<sir[i]; k = AR(sir[i++]); if (k) { cout<<'('; for (j=1; j<k; ++j) { Restaurare(i); cout<<','; } Restaurare(i); cout<<')'; } } int main() { int i = 0; citire(); Restaurare(i); return 0; }
Salutare. Eu am de facut problema respectiva in C. Am refacut functiile de citire di nfisier din C++ in C, tot ce trebuie in C, dar programul imi da eroare” ) expected” la void Restaurare (int & i) , mai exact imediat dupa &. Poate cineva sa converteasca programul din C++ in C? poate am gresit eu ceva … Multumesc.