Cal implementar la classe matriu <T> i dues
operacions en matrius: la suma i el producte. Cal que implementeu la
matriu com a vector de llistes, com normalment es fa en matrius
esparses. Una matriu esparsa és una matriu que té moltes
posicions amb el valor zero. D’aquesta manera, per cada fila només tenim
una llista que conté parells posicio, valor, en què
posicio indica el valor de la columna en què es troba el
valor.
Més formalment, tenim que les files es desen en un vector de parells tals que per al parell (j,x) de la fila i:
L’entrada consisteix en un codi d’operació, que pot ser 1 o 2 (1 = suma, 2 = producte) i dues matrius representades de forma esparsa.
Per cada matriu hi ha primer dos enters que representen les
diemnsions de la matriu, i després, per cada fila, hi ha el nombre
N d’elements de la fila. Si aquest número és zero, voldrà
dir òbviament que tots els elements de la fila són zero. Altrament, hi
haurà N parelles posicio valor.
La sortida és la suma o el producte de les dues matrius d’entrada segons el codi d’entrada.
Cal implementar les matrius com a vector de llistes de parells.
Cal enviar 1 sol fitxer: matriu.tcc com a fitxer
.tar. Aquest fitxer té la implementació de la classe
matriu.
Per a implementar les funcions al fitxer matriu.tcc cal
posar el prefix
template <typename T> matriu <T> a les
capçaleres de cada funció. Per exemple:
template <typename T> int matriu <T>::num_columnes () const { ...
Per a instanciar un iterador de la llista de parint, cal fer-ho així:
typename list<parint>::iterator it
A més, cal no declarar aquest iterador a dins d’in
for. Per exemple, aquesta és una manera incorrecta
de declarar l’iterador:
for (typename list<parint>::iterator it= it.begin() ...
Cal fer-ho així:
typename list<parint>::iterator it;
for (it= it.begin() ...
Input
2 2 3 2 0 1 2 3 2 1 2 2 1 3 2 1 0 1 2 0 2 1 1 0
Output
1 0 3 0 2 1 1 0 2 1 0 0 1 0 4 2
Input
1 2 3 3 0 1 1 2 2 3 3 0 3 1 2 2 1 2 3 3 0 5 1 9 2 1 3 0 1 1 4 2 7
Output
1 2 3 3 2 1 5 9 1 1 4 7 6 11 4 4 6 8