Exercici 3 · Metodologia de la Programació UAB 2018
Tema: Ús de les estructures de dades de la STL · Del examen Examen Segon Parcial Curs 2018-2019 (2018)
Enunciado
Exercici 3 (4 punts). Gestió de repositori de fitxers i desfer accions
Es vol dissenyar un sistema per controlar les versions dels fitxers d'un repositori o directori, oferint la possibilitat de desfer accions prèvies. Es compta amb la classe Fitxer:
class Fitxer
{
public:
Fitxer();
~Fitxer();
string getNom() const { return m_nom; }
string getData() const { return m_dataModificacio; }
FileContent getContingut() const { return m_contingut; }
void setNom(const string& nom) { m_nom = nom; }
void setData(const string& data) { m_data = data; }
void setContingut(const FileContent& contingut) { m_contingut = contingut; }
private:
string m_nom;
string m_dataModificacio;
FileContent m_contingut;
};
I la classe auxiliar Operacio que emmagatzema el tipus d'operació (0: afegir, 1: modificar, 2: eliminar) i l'estat anterior del fitxer:
class Operacio
{
public:
Operacio();
~Operacio();
int getTipus() const { return m_tipus; }
Fitxer getEstatAnterior() const { return m_estatAnterior; }
void setTipus(const int& tipus) { m_tipus = tipus; }
void setEstatAnterior(const Fitxer& estat) { m_estatAnterior = estat; }
private:
int m_tipus;
Fitxer m_estatAnterior;
};
a)
Definiu la part privada de la classe Repositori seleccionant els contenidors més adients de la biblioteca estàndard ( list, forward_list, stack, queue) tant per mantenir la col·lecció de fitxers (que s'ha de poder llistar ordenadament per nom) com per a la pila de desfer operacions.
b)
Implementeu els següents mètodes de Repositori (suposeu que eliminaFitxer i modificaFitxer ja estan implementats):
• afegeixFitxer: rep nom, data de creació i contingut; crea l'objecte Fitxer i l'insereix en la posició que li correspon per mantenir l'ordre alfabètic.
bool Repositori::afegeixFitxer(const string& nom, const string& data, const FileContent& contingut)
• fesOperacio: rep el tipus d'operació (0: afegir, 1: modificar, 2: eliminar), nom, data i contingut. Executa l'acció cridant el mètode corresponent i registra l'operació a l'històric guardant l'estat previ per permetre el desfer.
bool Repositori::fesOperacio(int tipus, const string& nom, const string& data, const FileContent& contingut)
• desfesOperacio: extreu l'última operació realitzada i la reverteix: si es va afegir, elimina el fitxer; si es va modificar, restaura l'estat previ; si es va eliminar, el torna a afegir.
bool Repositori::desfesOperacio()

Solución
Según los criterios oficiales de corrección
a. Definiu la part privada de la classe Repositori seleccionant els contenidors més adients de la biblioteca estàndard (list, forward_list, stack, queue) tant per mantenir la col·lecció de fitxers (que s'ha de poder llistar ordenadament per nom) com per a la pila de desfer operacions.
Solución: ```cpp list<Fitxer> m_fitxers; stack<Operacio> m_operacions; ```
b. afegeixFitxer: rep nom, data de creació i contingut; crea l'objecte Fitxer i l'insereix en la posició que li correspon per mantenir l'ordre alfabètic.
Solución: ```cpp Fitxer nou; nou.setNom(nom); nou.setData(data); nou.setContingut(contingut); // Cerca de la posició d'inserció alfabètica auto it = m_fitxers.begin(); while (it != m_fitxers.end() && it->getNom() < nom) { ++it; } m_fitxers.insert(it, nou); return true; ```
b. fesOperacio: rep el tipus d'operació (0: afegir, 1: modificar, 2: eliminar), nom, data i contingut. Executa l'acció cridant el mètode corresponent i registra l'operació a l'històric guardant l'estat previ per permetre el desfer.
Solución: ```cpp Operacio op; op.setTipus(tipus); bool exit = false; if (tipus == 0) // Afegir { Fitxer buit; buit.setNom(nom); op.setEstatAnterior(buit); exit = afegeixFitxer(nom, data, contingut); } else if (tipus == 1) // Modificar { // Cerquem l'estat anterior abans de modificar for (const auto& f : m_fitxers) { if (f.getNom() == nom) { op.setEstatAnterior(f); break; } } exit = modificaFitxer(nom, data, contingut); } else if (tipus == 2) // Eliminar { for (const auto& f : m_fitxers) { if (f.getNom() == nom) { op.setEstatAnterior(f); break; } } exit = eliminaFitxer(nom); } if (exit) { m_operacions.push(op); } return exit; ```
b. desfesOperacio: extreu l'última operació realitzada i la reverteix: si es va afegir, elimina el fitxer; si es va modificar, restaura l'estat previ; si es va eliminar, el torna a afegir.
Solución: ```cpp if (m_operacions.empty()) return false; Operacio ultima = m_operacions.top(); m_operacions.pop(); int tipus = ultima.getTipus(); Fitxer anterior = ultima.getEstatAnterior(); if (tipus == 0) // Es va afegir: desfer implica eliminar { return eliminaFitxer(anterior.getNom()); } else if (tipus == 1) // Es va modificar: restaurar l'estat previ { return modificaFitxer(anterior.getNom(), anterior.getData(), anterior.getContingut()); } else if (tipus == 2) // Es va eliminar: desfer implica tornar-lo a afegir { return afegeixFitxer(anterior.getNom(), anterior.getData(), anterior.getContingut()); } return false; ```
La explicación paso a paso, hecha con IA, es Premium. Premium
Resuélvelo aquí mismo: corrección automática, pistas y solución paso a paso.