Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Examen Laboratorio de Programación, Exámenes de Programación Informática

Laboratorio de Programación. Templates, herencia y hash

Tipo: Exámenes

2018/2019

Subido el 06/01/2019

Arual7
Arual7 🇪🇸

4 documentos

1 / 7

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Exàmen LP 1er parcial 2017-18
Nom……………………………………………. Cognoms………………………………………………………………………….…
NIU…………………………………………….. Grup (41(11h-13h),43(9h-11h),45,51,52(17h-19h))…………….
1. Una empresa de venda de productes online ens ha demanat ajuda en la gestió dels seus enviaments.
Inicialment, suposarem que només envia llibres i definirem les següents classes:
La classe Llibre que gestiona les dades del llibre que es vol enviar
La classe Enviament que guarda les dades del destinatari i de l’enviament (prioritat i data) i conté
un objecte de tipus Llibre amb les dades del llibre que s’envia
La classe Enviaments que gestiona un array dinàmic per guardar tots els enviaments.
1. class Llibre
2. {
3. public:
4. Llibre();
5. Llibre(const string &codiLlibre);
6. ~Llibre();
7. void setCodi(const string &codiLlibre);
8. string &getCodi();
9. Llibre& operator = (const Llibre& ll);
10. friend std::ostream& operator<<(std::ostream& out, const Llibre& ll);
11. private:
12. string m_codiLlibre;
13. };
14.
15. class Enviament
16. {
17. public:
18. Enviament();
19. Enviament(const string nomDestinatari, const string adrecaDestinatari,
20. const int prioritat, const string data, const Llibre& ll);
21. Enviament(const Enviament& env);
22. ~Enviament();
23. int getPrioritat();
24. string& getData();
25. void inicialitzarEnviament(const string nomDestinatari,
26. const string adrecaDestinatari,
27. const int prioritat,
28. const string data, const Llibre& ll);
29. private:
30. string m_nomDestinatari;
31. string m_adrecaDestinatari;
32. int m_prioritat;
33. string m_data;
34. Llibre m_llibre;
35. };
36.
37. class Enviaments
38. {
39. public:
40. Enviaments(int max);
41. ~Enviaments();
42. bool afegirEnviament(const string nomDestinatari,
43. const string adrecaDestinatari,
44. const int prioritat,
45. const string data, const Llibre& ll);
46. bool lliurar();
47. private:
48. Enviament* m_envs;
49. int m_maxEnvs;
50. int m_envsAct;
51. };
pf3
pf4
pf5

Vista previa parcial del texto

¡Descarga Examen Laboratorio de Programación y más Exámenes en PDF de Programación Informática solo en Docsity!

Exàmen LP 1er parcial 2017- Nom……………………………………………. Cognoms………………………………………………………………………….…

NIU…………………………………………….. Grup (41(11h-13h),43(9h-11h),45,51,52(17h-19h))…………….

  1. Una empresa de venda de productes online ens ha demanat ajuda en la gestió dels seus enviaments. Inicialment, suposarem que només envia llibres i definirem les següents classes:  La classe Llibre que gestiona les dades del llibre que es vol enviar  La classe Enviament que guarda les dades del destinatari i de l’enviament (prioritat i data) i conté un objecte de tipus Llibre amb les dades del llibre que s’envia  La classe Enviaments que gestiona un array dinàmic per guardar tots els enviaments.
  2. class Llibre
  3. {
  4. public:
  5. Llibre();
  6. Llibre(const string &codiLlibre);
  7. ~Llibre();
  8. void setCodi(const string &codiLlibre);
  9. string &getCodi();
  10. Llibre& operator = (const Llibre& ll);
  11. friend std::ostream& operator<<(std::ostream& out, const Llibre& ll);
  12. private:
  13. string m_codiLlibre;
  14. };
  15. class Enviament
  16. {
  17. public:
  18. Enviament();
  19. Enviament(const string nomDestinatari, const string adrecaDestinatari,
  20. const int prioritat, const string data, const Llibre& ll);
  21. Enviament(const Enviament& env);
  22. ~Enviament();
  23. int getPrioritat();
  24. string& getData();
  25. void inicialitzarEnviament(const string nomDestinatari,
  26. const string adrecaDestinatari,
  27. const int prioritat,
  28. const string data, const Llibre& ll);
  29. private:
  30. string m_nomDestinatari;
  31. string m_adrecaDestinatari;
  32. int m_prioritat;
  33. string m_data;
  34. Llibre m_llibre;
  35. };
  36. class Enviaments
  37. {
  38. public:
  39. Enviaments(int max);
  40. ~Enviaments();
  41. bool afegirEnviament(const string nomDestinatari,
  42. const string adrecaDestinatari,
  43. const int prioritat,
  44. const string data, const Llibre& ll);
  45. bool lliurar();
  46. private:
  47. Enviament* m_envs;
  48. int m_maxEnvs;
  49. int m_envsAct;
  50. };

A partir d’aquestes classes, escrivim el següent programa principal que primer afegeix 4 enviaments del mateix llibre i després simula que es fa el lliurament d’aquests enviaments.

  1. int main()
  2. { const int MAX_ENVIAMENTS = 15;
  3. Enviaments envs(MAX_ENVIAMENTS);
  4. Llibre llibre("1234");
  5. envs.afegirEnviament ("Albert", "Lepant", 5, "02/02/2017", llibre);
  6. envs.afegirEnviament ("Anna", "Medina", 12, "03/02/2017", llibre);
  7. envs.afegirEnviament ("Lucia", "Florals", 2, "05/02/2017", llibre);
  8. envs.afegirEnviament ("Jordi", "Berlin", 5, "01/02/2017", llibre);
  9. bool lliurat = true;
  10. while (lliurat)
  11. {
  12. lliurat = envs.lliurar();
  13. }
  14. }

Ara volem modificar les classes i el programa principal anteriors per fer que els enviaments puguin ser llistes homogènies de qualsevol producte, no necessàriament llibres. Per aquest motiu, volem que l’atribut m_llibre de la classe Enviament es modifiqui per un atribut m_objecte que pugui correspondre a qualsevol tipus d’objecte. a) Fes les modificacions que consideris oportunes a les declaracions de les classes Enviament i Enviaments per tal de poder enviar qualsevol tipus d’objecte que pugui estar definit en una classe qualsevol. No cal que reescriguis tota la declaració de les classes. Indica només el número de línia que cal modificar i posa el codi modificat per aquella línia.

  1. Calcula el cost màxim del mètode afegirEnviament , segons la implementació següent:

bool Enviaments::afegirEnviament (const string nomDestinatari, const string adrecaDestinatari,const int prioritat, const string data, const Llibre& ll) {//Afegeix enviaments ordenats de major a menor, menor a ultima posició //Menor te prioritat menor i data menor (mes prioritari i demanat abans). bool retorn = false; if (m_envsAct < m_maxEnvs) { Enviament nouEnv(nomDestinatari, adrecaDestinatari,prioritat, data,ll); bool menor = true; int i = 0; while (menor && (i<m_envsAct)) { if (nouEnv < m_envs[i]){i++;} else{menor = false; } } if (i < m_envsAct) { for (int j = m_envsAct; j > i; j--) { m_envs[j] = m_envs[j - 1]; } } m_envs[i].inicialitzaEnviament(nomDestinatari, adrecaDestinatari, prioritat, data, ll); cout << "Afegint Enviament:" << endl; cout << m_envs[i]; m_envsAct++; retorn = true; } return retorn; }

  1. Ara volem tornar a modificar el codi original de l’exercici 1 per aconseguir que els enviaments puguin contenir objectes de qualsevol dels tipus que definirem amb una jerarquia de classes amb herència. D’aquesta forma, l’array de la classe Enviaments podrà guardar enviaments barrejats que corresponguin a tipus d’objectes diferents. Per fer aquest exercici oblideu-vos completament de les modificacions al codi que heu fet a l’exercici 1.

Volem crear una jerarquia de classes on la classe Objecte serà la classe base i d’ella en deriven altres, com per exemple Llibre i Electrodomestic. Tots els objectes han de tenir com a atributs comuns un codi d’objecte i el preu de l’objecte. Pels llibres hem de guardar, a més a més, el pes del llibre , mentre que pels electrodomèstics guardarem el volum que ocupa l’embalatge de l’aparell. A nivell de mètodes, tots els objectes han de tenir un mètode getDespesesEnviament() que permeti calcular les despeses associades a l’enviament de l’objecte. La forma de calcular les despeses serà diferent depenent de l’objecte. També han de tenir un mètode mostra() per mostrar per pantalla les dades de cada objecte que també haurà de ser diferent per cada tipus d’objecte.

a) Declarar la classe base Objecte , segons les especificacions que hem donat abans. Només heu de fer la declaració de la classe. No heu d’implementar cap dels mètodes. Penseu a incloure com a mínim el constructor i destructor per defecte i un constructor per inicialitzar els atributs de la classe. Tingueu present també quins dels mètodes s’han de declarar com a virtuals.

b) Declarar les classes Electrodomestic i Llibre derivades de la classe base Objecte , segons les especificacions que hem donat abans. Només heu de fer la declaració de la classe. No heu d’implementar cap dels mètodes. Hauran de tenir també el constructor i destructor per defecte i un constructor per inicialitzar tots els atributs de la classe, tant els heretats com els específics.

e) Modificar el programa principal de l’exercici 1 per fer que els dos primers enviaments que s’afegeixen siguin de la classe Llibre i els dos últims de la classe Electrodomestic. Segurament haureu de modificar la declaració i implementació del mètode afegirEnviament de l’exercici 2. Indiqueu totes les modificacions necessàries. Feu també que al final de tot del mètode afegirEnviament es mostrin les dades específiques de l’objecte que s’està enviant i també les despeses d’enviament associades a l’objecte que s’envia. Si en algun moment creeu objectes dinàmics, indiqueu una possible forma d’assegurar-nos que s’alliberen tots els objectes dinàmics que s’han creat abans d’acabar el programa (no cal que ho implementeu, només que expliqueu quines modificacions faríeu).