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()

Enunciado: Exercici 3 · Metodologia de la Programació UAB 2018

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.

‹ Exercici 4 · 2024

Más ejercicios de Ús de les estructures de dades de la STL