parciales/2022-2C-1p/4.cpp (3041B)
1 #include <iostream> 2 #include <string> 3 4 class Colecta { 5 private: 6 double total, maxDonacion, objetivo; 7 unsigned int cantDonaciones; 8 9 public: 10 /** 11 * post: inicializa `Colecta` 12 */ 13 Colecta() { 14 this->objetivo = this->total = this->maxDonacion = this->cantDonaciones = 0; 15 } 16 17 /** 18 * post: inicializa `Colecta` con los atributos pasados como argumento 19 * `objetivo`, `total`, `maxDonacion`, `cantDonaciones` 20 */ 21 Colecta(double objetivo, double total, double maxDonacion, size_t cantDonaciones) { 22 this->objetivo = objetivo; 23 this->total = total; 24 this->maxDonacion = maxDonacion; 25 this->cantDonaciones = cantDonaciones; 26 } 27 28 /** 29 * post: libera la memoria de Colecta 30 */ 31 virtual ~Colecta() {} 32 33 /** 34 * pre: `Colecta` debe estar inicializado 35 * post: asigna `objetivo` al atributo `objetivo` de la clase 36 */ 37 void setObjetivo(long objetivo) { 38 this->objetivo = objetivo; 39 } 40 41 /** 42 * pre: `Colecta` debe estar inicializado 43 * post: devuelve el atributo `objetivo` de la clase 44 */ 45 double getObjetivo() { 46 return this->objetivo; 47 } 48 49 /** 50 * pre: `Colecta` debe estar inicializado 51 * post: devuelve el atributo `total` de la clase 52 */ 53 double calcularRecaudacion() { 54 return this->total; 55 } 56 57 /** 58 * pre: `Colecta` debe estar inicializado 59 * post: incrementa `total` en `monto` solo si `monto` es mayor a 0, 60 * ademas si `monto` es mayor a la donacion maxima lo guarda 61 * en `maxDonacion` 62 */ 63 void donar(double monto) { 64 if(monto < 0) { 65 throw "El monto a donar no puede ser negativo"; 66 } else if(monto > maxDonacion) { 67 maxDonacion = monto; 68 } 69 70 this->total += monto; 71 this->cantDonaciones++; 72 } 73 74 /** 75 * pre: `Colecta` debe estar inicializado 76 * post: devuelve el atributo `cantDonaciones` de la clase 77 */ 78 unsigned int contarDonaciones() { 79 return this->cantDonaciones; 80 } 81 82 /** 83 * pre: `Colecta` debe estar inicializado 84 * post: devuelve el atributo `maxDonacion` de la clase 85 */ 86 double calcularDonacionMaxima() { 87 return this->maxDonacion; 88 } 89 90 /** 91 * pre: `Colecta` debe estar inicializado 92 * post: devuelve el monto faltante para llegar a `objetivo`, devuelve 0 93 * si el monto faltante es 0 o menor a cero (en case de excedente) 94 */ 95 double calcularRecaudacionFaltante() { 96 double faltante = (this->objetivo - this->total); 97 return (faltante < 0) ? 0 : faltante; 98 } 99 }; 100 101 void printStatus(Colecta colecta) { 102 std::cout << "Total: `" << colecta.calcularRecaudacion() << "`\n"; 103 std::cout << "Objetivo: `" << colecta.getObjetivo() << "`\n"; 104 std::cout << "Faltante: `" 105 << colecta.calcularRecaudacionFaltante() << "`\n"; 106 std::cout << "Maxima donacion: `" 107 << colecta.calcularDonacionMaxima() << "`\n"; 108 std::cout << "Cant. de donaciones: `" 109 << colecta.contarDonaciones() << "`\n"; 110 } 111 112 int main() { 113 Colecta c; 114 c.setObjetivo(100000.0); 115 printStatus(c); 116 std::cout << "\n"; 117 118 c.donar(91.52); 119 printStatus(c); 120 std::cout << "\n"; 121 122 c.donar(1020.00); 123 printStatus(c); 124 std::cout << "\n"; 125 126 c.donar(20.00); 127 printStatus(c); 128 std::cout << "\n"; 129 return 0; 130 }
