En aquest exercici considerarem arbres que representen expressions
sobre els operadors +, -, *, i
sobre operands que són nombres naturals. Per exemple, el següent
arbre
*
|-- -
| |-- 7
| |-- 1
| |-- 5
| '-- 2
'-- +
|-- 7
|-- 3
'-- 8
representa l’expressió
((7 - 1 - 5 - 2) * (7 + 3 + 8)).
Tots els nodes de l’arbre que són fulles contenen un valor natural, i els nodes amb fills sempre en tenen almenys 2 i el seu valor és sempre un operador. No hi ha subarbres buits.
Implementeu, doncs, la funció següent:
/**
* @brief Transforma una expressió en la seva representació com a `string`.
*
* Una expressió està formada per operadors (`+`, `*` i `-`), i
* operands (naturals), que són nodes d'un arbre. Els operands tenen dos
* fills o més, i els operands són fulles (no tenen fills).
*
* L'expressió representada com a `string` és de la següent manera. Per a
* operands: cal retornar l'operand mateix. Per a operadors, cal retornar
* els fills de l'operador, separats per l'operador, amb un espai entre
* operand i operadors, i tot el conjunt sempre entre parèntesis.
*
* @pre L'arbre representa una expressió ben formada
*
* @param t L'arbre que representa l'expressió.
* @returns La representació com a `string` de `t`
*/
string expression_to_string(Tree<string> t);
Els fitxers públics (icona del gatet) contenen:
tree.hh |
la classe Tree |
tree-io.hh |
l’entrada/sortida de
Tree |
main.cc |
el programa principal |
També hi ha un Makefile i el directori
.vscode que té la configuració per compilar i depurar amb
VSCode.
Cal implementar expression_to_string en un
fitxer .cc nou, compilar, i finalment
enviar només el fitxer amb la funció.
Cada cas consisteix en una representació textual d’una expressió del tipus definit. (Aquesta lectura ja la fa el programa principal.)
Per a cada cas, la sortida és el resultat de transformar l’expressió a la seva representació textual, amb cada resultat en una línia separada. (Això també ho fa el programa principal.)
Input
*
|-- 1
'-- 5
*
|-- -
| |-- 7
| |-- 1
| |-- 5
| '-- 2
'-- +
|-- 7
|-- 3
'-- 8
*
|-- +
| |-- 6
| '-- 5
'-- 7
3
*
|-- 4
|-- 7
|-- +
| |-- 1
| |-- 6
| |-- 7
| |-- 6
| '-- 9
'-- 6
Output
(1 * 5) ((7 - 1 - 5 - 2) * (7 + 3 + 8)) ((6 + 5) * 7) 3 (4 * 7 * (1 + 6 + 7 + 6 + 9) * 6)