INTRODUCCIÓ:
L’entrada d’aquest exercici és una llista d’arbres binaris d’strings, on cadascun representa una instrucció d’un llenguatge de programació molt simple que descrivim a continuació.
Les variables del llenguatge poden guardar dígits, és a dir, valors entre 0 i 9. Les expressions del llenguatge tenen variables, dígits, i els operadors + i *, que treballen mòdul 10, de manera que el resultat d’avaluar un d’aquests operadors sobre dígits dona com a resultat un dígit. Per exemple, suposem que les variables x i y guarden valors 4 i 5, respectivament, i considerem l’expressió 3+x*2+y. Llavors, l’avaluació d’aquesta expressió serà 6.
Nota: Quan una expressió conté una variable que no ha estat assignada abans, suposem que té valor per defecte 0.
Com a tipus d’instruccions del llenguatge, tenim assignació, if, while, amb el significat habitual, print per a escriure l’avaluació d’una expressió per la sortida seguida de salt de línia, i també subllistes d’instruccions. Per a les expressions de la condició de if i while, es considera que es cumpleixen si s’avaluen a diferent de 0, és a dir, a qualsevol dels valors 1,…,9. Aquest és un exemple de programa:
x = 1 while (x) { if (2*x) { print(x) print(3*x) } x = x + 1 } print(x)
El programa anterior té com a sortida:
1 3 2 6 3 9 4 2 6 8 7 1 8 4 9 7 0
Com hem mencionat al principi, l’entrada d’aquest exercici és una llista d’arbres que representen instruccions d’aquest llenguatge. Per a l’exemple anterior de programa, aquesta seria l’entrada en INLINEFORMAT:
=(x,1) while(x,list(if(*(2,x),list(print(x),print(*(3,x)))),=(x,+(x,1))) print(x)
I aquesta seria la mateixa entrada en VISUALFORMAT:
= | ---- ---- | | x 1 while | ---- ---- | | x list | ---------- ---------- | | if = | | -------- -------- ---- ---- | | | | * list x + | | | ---- ---- ---- ---- ---- ---- | | | | | | 2 x print print x 1 | | ---- ---- | | x * | ---- ---- | | 3 x print | ---- | x
L’objectiu d’aquest exercici és que implementeu dues funcions, una funció que avalua una expressió del llenguatge, i una funció que simula una instrucció del llenguatge. Convindrà que la segona funció cridi a la primera quan sigui convenient. Aquestes son les capceleres:
// Pre: t és un arbre no buit d'strings que representa una expressió correcta // sobre dígits i variables que guarden dígits, i els operadors +,* mòdul 10. // En particular, l'arrel de t és o bé +, o bé *, o bé un dígit, o bé una variable. // var2val és un mapeig de variables a dígits. // Post: Retorna l'avaluació de l'expressió representada per t reemplaçant les variables // pels seus corresponents valors definits a var2val, o per 0 si no estan definides. int evaluate(map<string,int> &var2val, BinTree<string> t); // Pre: t és un arbre no buit d'strings que representa una instrucció correcta // del llenguatge de programació descrit a l'enunciat. // En particular, o bé és l'arbre buit, // o bé la seva arrel és, o bé =, o bé print, o bé if, o bé while, // o bé list, cas en el cual, representa una subllista d'instruccions. // Post: S'ha simulat l'execució d'aquesta instrucció, modificant var2val // i escrivint el que calgui per la sortida estandar, // d'acord a aquesta simulació. void execute(map<string,int> &var2val, BinTree<string> t);
Fixeu-vos que l’enunciat d’aquest exercici ja ofereix uns fitxers que haureu d’utilitzar: main.cc, BinTree.hh, execute.hh. Us falta crear el fitxer execute.cc amb els corresponents includes i implementar-hi les dues funcions anteriors. Només cal que pugeu execute.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 d’instruccions representades per arbres. Fixeu-vos en que el programa que us oferim ja s’encarrega de llegir aquestes instruccions i mantenir un mapeig de variables a dígits amb el valor actual de les variables. Només cal que implementeu les dues funcions abans esmentades.
Nota: Els casos d’entrada s’han creat mirant de garantir que l’execució de les instruccions d’entrada acaben.
Sortida
La sortida conté el que seria la sortida esperada com a resultat d’executar les instruccions que venen descrites a l’entrada. Fixeu-vos en que el programa que us oferim ja s’encarrega de cridar a la vostra funció execute que alhora hauria de cridar a la funció evaluate quan calgui. Només cal que implementeu aquestes funcions de manera que simulin correctament el comportament de les instruccions, actualitzant el mapeig de variables a dígits correctament, i escrivint dígits per la sortida amb la instrucció print. Cadascun d’aquests dígits escrits ha de venir seguit d’un salt de línia.
Observació
Avaluació sobre 10 punts:
Entenem com a solució ràpida una que és correcta, de cost lineal i capaç de superar els jocs de proves públics i privats. Entenem com a solució lenta una que no és ràpida, però és correcta i capaç de superar els jocs de proves públics.
Input
VISUALFORMAT = | ---- ---- | | x 1 while | ---- ---- | | x list | ---------- ---------- | | if = | | -------- -------- ---- ---- | | | | * list x + | | | ---- ---- ---- ---- ---- ---- | | | | | | 2 x print print x 1 | | ---- ---- | | x * | ---- ---- | | 3 x print | ---- | x
Output
1 3 2 6 3 9 4 2 6 8 7 1 8 4 9 7 0
Input
INLINEFORMAT =(x,1) while(x,list(if(*(2,x),list(print(x,),print(*(3,x),))),=(x,+(x,1)))) print(x,)
Output
1 3 2 6 3 9 4 2 6 8 7 1 8 4 9 7 0
Input
VISUALFORMAT if | --------- --------- | | * list | | ---- ---- -------- -------- | | | | 6 2 = = | | ---- ---- ---- ---- | | | | x0 + x1 * | | ------- ------- ---- ---- | | | | + + 8 x0 | | ---- ---- ---- ---- | | | | 6 2 7 9 = | ---- ---- | | x2 1 while | ----------- ----------- | | * list | | ---- ---- --------- --------- | | | | x0 x2 print list | | ---- ---- ---- | | | + print list | | | ------- ------- ---- ---- ---- | | | | | + * x2 print = | | | | ---- ---- ---- ---- ---- ---- ---- | | | | | | | x2 3 x0 x2 5 x2 + | ---- ---- | | x2 1 if | ------------ ------------ | | + list | | ---- ---- ------------- ------------- | | | | + x2 = list | | | ---- ---- ---- ---- -------------- -------------- | | | | | | 6 8 x3 1 while = | | -------- -------- ---- ---- | | | | * list x3 * | | | ---- ---- ---- ---- ---- ---- | | | | | | * x3 print = * x1 | | | | ---- ---- ---- ---- ---- ---- ---- | | | | | | | + 8 2 x3 + 9 9 | | ---- ---- ---- ---- | | | | 4 x3 x3 1 if | ------------- ------------- | | + list | | ---- ---- --------------- --------------- | | | | x1 5 print list | | ---- --------------------------- --------------------------- | | | 9 if if | | ---- ---- -------------- -------------- | | | | 8 list + list | | | -------- -------- ------- ------- ---- ---- | | | | | | print list * + print print | | | | | | ---- ------- ------- ---- ---- ---- ---- ---- ---- | | | | | | | | | + = = 3 x0 x3 x2 x1 + | | | | ---- ---- ---- ---- ---- ---- ------- ------- | | | | | | | | + 1 x3 * x2 + + + | | | | | ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- | | | | | | | | | | x3 x0 4 x0 x0 x3 x0 x0 6 x2 if | ---- ---- | | 8 list | -------- -------- | | = list | | ---- ---- ------- ------- | | | | x4 8 = print | | ---- ---- ---- | | | x4 + x3 | ---- ---- | | x0 5 = | ---- ---- | | x5 1 while | --------- --------- | | * list | | ---- ---- ------- ------- | | | | * x5 = = | | | ---- ---- ---- ---- ---- ---- | | | | | | * 8 x4 * x5 + | | | ---- ---- ---- ---- ---- ---- | | | | | | 6 9 3 x5 x5 1 = | ---- ---- | | x2 5 = | ---- ---- | | x6 1
Output
8 1 5 3 2 5 8 3 5 3 4 5 9 7 2 4 6
Input
INLINEFORMAT if(*(6,2),list(=(x0,+(+(6,2),+(7,9))),=(x1,*(8,x0)))) =(x2,1) while(*(x0,x2),list(print(+(+(x2,3),*(x0,x2)),),list(print(x2,),list(print(5,),=(x2,+(x2,1)))))) if(+(+(6,8),x2),list(=(x3,1),list(while(*(*(+(4,x3),8),x3),list(print(2,),=(x3,+(x3,1)))),=(x3,*(*(9,9),x1))))) if(+(x1,5),list(print(9,),list(if(8,list(print(+(+(x3,x0),1),),list(=(x3,*(4,x0)),=(x2,+(x0,x3))))),if(+(*(3,x0),+(x3,x2)),list(print(x1,),print(+(+(x0,x0),+(6,x2)),)))))) if(8,list(=(x4,8),list(=(x4,+(x0,5)),print(x3,)))) =(x5,1) while(*(*(*(6,9),8),x5),list(=(x4,*(3,x5)),=(x5,+(x5,1)))) =(x2,5) =(x6,1)
Output
8 1 5 3 2 5 8 3 5 3 4 5 9 7 2 4 6