INTRODUCCIÓ:
En aquest exercici considerarem arbres que representen expressions sobre els operadors +,-,*, i sobre operands naturals i variables (una variable serà una seqüència de lletres minúscules). Per exemple, el següent arbre representa l’expressió 3+x*2-y.
-
|
---- ----
| |
+ y
|
---- ----
| |
3 *
|
---- ----
| |
x 2
EXERCICI:
Implementeu una funció que, donat un arbre binari d’strings que representa una expressió correcta sobre naturals, variables i operadors +,-,*, i també donat un map<string,int> que conté els valors de les variables, retorna la seva avaluació de l’expressió. Aquesta és la capcelera:
// Pre: t és un arbre no buit que representa una expressió correcta // sobre naturals i variables enteres, i els operadors +,-,*. // Totes les variables que apareixen a t estan definides a variable2value. // Les operacions no produeixen errors d'overflow. // Post: Retorna l'avaluació de l'expressió representada per t. int evaluate(map<string,int> &variable2value, BinTree<string> t);
Aquí tenim un exemple de paràmetre d’entrada de la funció i la corresponent sortida:
variable2value = {x:2, y:3}
t= *
|
------- -------
| |
+ -
| |
---- ---- ---- ----
| | | |
1 x 5 y
=>
6
Fixeu-vos que l’enunciat d’aquest exercici ja ofereix uns fitxers que haureu d’utilitzar per a compilar: main.cc, BinTree.hh, evaluate.hh, utils.hh, utils.cc. Us falta crear el fitxer evaluate.cc amb els corresponents includes i implementar-hi la funció anterior. Valdrà la pena que utilitzeu algunes de les funcions oferides a utils.hpp. Només cal que pugeu evaluate.cc al jutge.
Entrada
La primera linia de l’entrada descriu el format en el que es descriuen els arbres, o bé INLINEFORMAT o bé VISUALFORMAT. Després venen un nombre arbitrari de casos. Cada cas té una primera linia amb una descripció dels valors de les variables (una seqüència de parelles <variable,valor>), i després una descripció d’un arbre binari que representa una expressió. Fixeu-vos en que el programa que us oferim ja s’encarrega de llegir aquesta entrada. Només cal que implementeu la funció abans esmentada.
Sortida
Per a cada cas, la sortida conté la corresponent avaluació de l’arbre. Fixeu-vos en que el programa que us oferim ja s’encarrega d’escriure aquesta sortida. Només cal que implementeu la funció abans esmentada.
Input
VISUALFORMAT
a 2 b 2
+
|
-------- --------
| |
- +
| |
------- ------- ---- ----
| | | |
- - 9 5
| |
---- ---- ---- ----
| | | |
a 5 7 b
a 6 b 7 c 1
*
|
------------- -------------
| |
+ +
| |
---- ---- ------------- -------------
| | | |
* a - -
| | |
---- ---- ------- ------- ---- ----
| | | | | |
5 7 - - - 7
| | |
---- ---- ---- ---- ---- ----
| | | | | |
9 1 7 b c a
a 3
*
|
---- ----
| |
a 2
1
a 3 b 8
*
|
---- ----
| |
a +
|
---- ----
| |
2 *
|
------- -------
| |
- *
| |
---- ---- ---- ----
| | | |
b 8 a 5
a 4
*
|
---- ----
| |
a 6
*
|
---- ----
| |
6 2
a 3
+
|
------- -------
| |
* -
| |
---- ---- ---- ----
| | | |
a 4 3 a
a 5
*
|
---- ----
| |
+ 3
|
------------ ------------
| |
+ *
| |
---- ---- ---- ----
| | | |
7 * + 2
| |
---- ---- ---- ----
| | | |
7 a 3 a
-
|
---- ----
| |
2 8
Output
6 -164 6 1 6 24 12 12 174 -6
Input
INLINEFORMAT a 2 b 2 +(-(-(a,5),-(7,b)),+(9,5)) a 6 b 7 c 1 *(+(*(5,7),a),+(-(-(9,1),-(7,b)),-(-(c,a),7))) a 3 *(a,2) 1 a 3 b 8 *(a,+(2,*(-(b,8),*(a,5)))) a 4 *(a,6) *(6,2) a 3 +(*(a,4),-(3,a)) a 5 *(+(+(7,*(7,a)),*(+(3,a),2)),3) -(2,8)
Output
6 -164 6 1 6 24 12 12 174 -6