Preliminars
En aquest exercici extendrem la classe List
suposant que el tipus T dels elements de la
llista té definida la operació de suma +, és a
dir, que dues variables de tipus T es poden
sumar. Aquesta suma satisfarà la propietat d’associativitat usual
(),
i tindrà element neutre (per exemple,
és el neutre per a la suma d’enters, i l’string buit és el neutre per a
la suma d’strings).
També suposem que una variable x de tipus
T permet una assignació
x = 0, de manera que, internament, a
x se li assigna el neutre de la suma.
Testejarem l’exercici amb el tipus int i
amb un tipus contenidor d’string que permetrà
fer assignacions x = 0 (internament
s’assignarà l’string buit). Fixeu-vos que en el cas
d’strings la suma és de fet la concatenació
d’strings, i que no és commutativa. Per
exemple, "a"+"b" = "ab"
"ba" = "b"+"a".
Exercici
Implementeu un nou mètode de la classe List que retorni la suma dels elements continguts a la llista des del principi fins al final. És a dir, si és el contingut de la llista, el mètode ha de retornar .
D’entre els fitxers que s’adjunten en aquest exercici, trobareu
list.old.hpp, a on hi ha una implementació de
la classe genèrica List. En primer lloc,
haureu de fer:
cp list.old.hpp list.hpp
A continuació, haureu de buscar dins
list.hpp les següents línies:
// Pre: Sigui [a1,...,an] el contingut actual de la llista.
// Post: Retorna a1+...+an.
// Descomenteu les següents dues linies i implementeu el mètode:
// T sum() {
// }
Descomenteu les dues linies que s’indiquen i implementeu el mètode. No toqueu la resta de la implementació de la classe, excepte si, per algun motiu, considereu que necessiteu afegir algun mètode auxiliar a la part privada.
Observació: Una implementació senzilla inicialitzant una variable de tipus T a (que es transformarà automàticament en el neutre de la suma) i recorrent i sumant-hi els elements de la llista hauria de ser suficient per a superar tots els jocs de proves.
D’entre els fitxers que s’adjunten a l’exercici també hi ha
program.cpp (programa principal) i
Makefile per a compilar. Per a pujar la vostra
solució, heu de crear el fitxer solution.tar
així:
tar cf solution.tar list.hpp
L’entrada del programa té una primera línia amb o bé
int o bé
string, que indica el tipus T
dels elements de la llista l amb la que
treballarà el programa, que se suposa inicialment buida. Després, hi ha
una seqüència d’instruccions del següent tipus que s’aniran aplicant
sobre la llista i un iterador que se suposa situat inicialment al
principi (i final) de la llista:
push_front x (x és de tipus T)
push_back x (x és de tipus T)
pop_front
pop_back
it = begin
it = end
it = erase it
it++
it--
++it
--it
*it = x (x és de tipus T)
insert it x (x és de tipus T)
cout << *it
cout << sum
cout << l
Se suposa que la seqüència d’entrada serà correcta, és a dir, que no es produeixen errors d’execució si s’apliquen correctament sobre una llista i un iterador amb les condicions abans esmentades.
El programa principal que us oferim ja s’encarrega de llegir aquestes
entrades i fer les crides als corresponents mètodes de la classe list.
Només cal que implementeu el mètode sum abans
esmentat.
Per a cada instrucció cout << *it
s’escriurà el contingut apuntat per l’iterador. Per a cada instrucció
cout << l s’escriurà el contingut de
tota la llista. Per a cada instrucció
cout << sum s’escriurà la suma de la
llista. El programa que us oferim ja fa això. Només cal que implementeu
el mètode sum abans esmentat.
Avaluació sobre 10 punts: (Afegiu comentaris si el vostre codi no és prou clar)
Solució lenta: 6 punts.
solució ràpida: 10 punts.
Entenem com a solució lenta una que és correcta i capaç de superar els jocs de proves públics. Entenem com a solució ràpida una que és correcta i capaç de superar els jocs de proves públics i privats.
Input
int cout << l cout << sum push_back 1 push_back 2 push_back 3 cout << l cout << sum it = begin insert it -1 --it push_front 4 push_front -2 cout << l cout << sum *it = 5 cout << l cout << sum it++ it = erase it cout << l cout << sum it = end cout << l cout << sum --it it = erase it push_back 6 cout << l cout << sum it-- --it *it = 0 cout << l cout << sum pop_back push_back 7 cout << l cout << sum insert it 8 cout << l cout << sum ++it pop_front it = erase it cout << l cout << sum insert it 9 cout << l cout << sum
Output
() 0 1 2 3 () 6 -2 4 (-1) 1 2 3 7 -2 4 (5) 1 2 3 13 -2 4 5 (2) 3 12 -2 4 5 2 3 () 12 -2 4 5 2 6 () 15 -2 4 5 (0) 6 13 -2 4 5 (0) 7 14 -2 4 5 8 (0) 7 22 4 5 8 0 () 17 4 5 8 0 9 () 26
Input
string cout << l cout << sum push_back a push_back b push_back c cout << l cout << sum it = begin insert it dd --it push_front ee push_front f cout << l cout << sum *it = g cout << l cout << sum it++ it = erase it cout << l cout << sum it = end cout << l cout << sum --it it = erase it push_back hhh cout << l cout << sum it-- --it *it = iiiii cout << l cout << sum pop_back push_back j cout << l cout << sum insert it kkkk cout << l cout << sum ++it pop_front it = erase it cout << l cout << sum insert it mmm cout << l cout << sum
Output
() a b c () abc f ee (dd) a b c feeddabc f ee (g) a b c feegabc f ee g (b) c feegbc f ee g b c () feegbc f ee g b hhh () feegbhhh f ee g (iiiii) hhh feegiiiiihhh f ee g (iiiii) j feegiiiiij f ee g kkkk (iiiii) j feegkkkkiiiiij ee g kkkk iiiii () eegkkkkiiiii ee g kkkk iiiii mmm () eegkkkkiiiiimmm
Input
int push_back 8 pop_back push_front 10 push_back 1 push_back 7 it = begin pop_back cout << sum push_front 10 push_back 7 *it = 3 pop_back cout << sum insert it 8 cout << sum cout << sum push_front 4 cout << sum insert it 7 insert it 1 cout << *it pop_back cout << *it insert it 7 push_back 8 it++ insert it 8 insert it 4 push_back 9 insert it 9 push_front 2 push_back 3 cout << *it *it = 9 *it = 3 *it = 7 cout << *it cout << *it cout << *it it = erase it cout << *it push_front 8 cout << sum cout << l
Output
11 14 22 22 26 3 3 8 7 7 7 9 83 8 2 4 10 8 7 1 7 3 8 4 9 (9) 3
Input
string push_back rb push_front hc push_back k push_back iddq pop_back cout << sum push_front rx push_back bld insert it sa push_front yn insert it yg pop_back insert it lln insert it wkho cout << sum insert it q push_back u it-- *it = gbb it = erase it push_front iv push_back d insert it bx insert it v cout << l --it push_front nsnf insert it fjm *it = rr *it = o push_back cn pop_back push_front fb cout << sum *it = x cout << sum cout << l
Output
hcrbk ynrxhcrbkbldsallnwkho iv yn rx hc rb k bld sa lln wkho q d bx v () fbnsnfivynrxhcrbkbldsallnwkhoqdbxfjmo fbnsnfivynrxhcrbkbldsallnwkhoqdbxfjmx fb nsnf iv yn rx hc rb k bld sa lln wkho q d bx fjm (x)