Computadores II Práctica 2 – 2007 Práctica 2 1. Dada la definición de clase Tiempo que se detallan a continuación: class Tiempo { public: Tiempo(); Tiempo(unsigned int horas, unsigned int minutos, unsigned int segundos); Tiempo(const Tiempo& tiempo); unsigned int get_horas() const; void set_horas(const unsigned int horas); unsigned int get_minutos() const; void set_minutos(const unsigned int minutos); unsigned int get_segundos() const; void set_segundos(const unsigned int segundos); bool operator==(const Tiempo& tiempo); Tiempo& operator+=(const unsigned int segundos); Tiempo& operator-=(const unsigned int segundos); Tiempo operator+(const unsigned int segundos); Tiempo operator-(const unsigned int segundos); Tiempo& operator+=(const Tiempo& tiempo); Tiempo& operator-=(const Tiempo& tiempo); Tiempo operator+(const Tiempo& tiempo); Tiempo operator-(const Tiempo& tiempo); private: unsigned int horas; unsigned int minutos; unsigned int segundos; }; ostream& operator<<(ostream& os, const Tiempo& t); Implemente los métodos declarados en la clase Tiempo. Condiciones: Los objetos de esta clase deben poder ser creados de tres maneras diferentes: – Crear un objeto Tiempo con horas, minutos y segundos en 0. – Crear un objeto Tiempo con los valores dados por los parámetros del constructor. – Crea un objeto Tiempo con los valores obtenidos de otro objeto tiempo. ¿Es realmente necesario definir el primer constructor sin parámetros? ¿Es posible evitarlo? Modifique la clase para que no incluya al primer constructor sin cambiar el funcionamiento de la misma. Los setters de horas, minutos y segundos deben validar que el parámetro dado se encuentre en un rango aceptable. De no ser así, deberán ignorar la petición de asignar el valor inválido. El operator<<() se encargará de imprimir un objeto Tiempo en la pantalla con el formato HH:MM:SS. Deberá agregarse un '0' tanto a la hora como a los minutos o segundos si estos resultaran ser menores a 10, por ejemplo: 17:04:00 en lugar de 17:4:0. El operadores operator==() deberá determinar si dos objetos Tiempo son iguales observando los valores de los atributos horas, minutos y segundos. Computadores II Práctica 2 – 2007 Los operadores operator+(), operator-(), operator+=() y operator-=() que reciben como parámetro un objeto Tiempo, sumarán o restarán tiempos. Los operadores que reciben como parámetro un unsigned int, sumarán o restarán (según corresponda) una cantidad positiva de segundos. Por ejemplo: Tiempo t1(17, 40, 22); cout << t1 << endl; | 17:40:22 cout << t1 – 50 << endl; | 17:39:32 cout << t1 + 234 << endl; | 17:40:56 El algoritmo para sumar dos tiempos T1 y T2 de manera de obtener TS es el siguiente: // Sumo los segundos de cada Tiempo. unsigned int seg = T1.segundos + T2.segundos // Tomo el resto de dividir los segundos por 60, de forma que esté entre 0 y 59. TS.segundos = seg % 60 // Sumo los minutos más lo que sobró de la suma de los segundos. unsigned int min = T1.minutos + T2.minutos + (seg / 60) // Tomo el resto de dividir los minutos por 60, de forma que esté entre 0 y 59. TS.minutos = min % 60 // Sumo las horas más lo que sobró de la suma de los minutos. unsigned int hor = T1.horas + T2.horas + (min / 60) // Tomo el resto de dividir las horas por 24, de forma que esté entre 0 y 23. TS.horas = hor % 24 El algoritmo para restar dos tiempos T1 y T2 de manera de obtener TR es el siguiente: // Resto los segundos de cada Tiempo. unsigned int seg = T1.segundos - T2.segundos // Resto los minutos de cada Tiempo. unsigned int min = T1.minutos - T2.minutos // Resto las horas de cada Tiempo unsigned int hor = T1.horas - T2.horas // Si al restar, los segundos quedaron negativos, sumamos 60 segundos para hacerlos positivos y // le restamos 1 minuto a los minutos, de forma que se mantenga el mismo Tiempo. if (seg < 0) { seg += 60 min-} // Si al restar, los minutos quedaron negativos, sumamos 60 minutos para hacerlos positivos y // le restamos 1 hora a las horas, de forma que se mantenga el mismo Tiempo. if (min < 0) { min += 60 hor-} // Si al restar, las horas quedaron negativas, sumamos 24 horas para hacerlas positivas. // Ignoramos la diferencia de 1 día. if (hor < 0) hor += 24 TR.segundos = seg TR.minutos = min TR.horas = hor Computadores II Práctica 2 – 2007 Para sumarle o restarle a un tiempo T una cantidad N de segundos, basta con calcular cuantas horas, minutos y segundos representa esa cantidad N de segundos, crear un objeto Tiempo con esos valores y usar los operadores hechos para sumar y restar tiempos. Observe que algunos operadores devuelven un objeto Tiempo y otros operadores devuelven una referencia a un objeto Tiempo. Esto se debe a que los operadores operator+=() y operator-=() deben retornar el mismo objeto Tiempo al que se le aplicó la operación mientras que los operadores operator+() y operator-() devuelven un objeto Tiempo nuevo resultante de la operación. En más de un método de la clase será necesario hacer referencia al objeto al que se le aplica el método. Para ello, recordar que C++ dispone de la palabra clave this, que es un puntero al objeto sobre el cual se disparó el método. Notar que this es un puntero al objeto mientras que *this es el objeto en cuestión. 2. Defina e implemente la clase RelojConAlarma. Los objetos de dicha clase deberán ser capaces de mantener el tiempo actual del reloj (tiempo virtual realmente) y el tiempo en el que se activará la alarma. También contarán con métodos para acceder y modificar a esos atributos, activar o desactivar la alarma y aumentar en un segundo el tiempo actual (simular el paso del tiempo) comprobando simultáneamente si la alarma se ha activado. Una vez que la alarma se activó, sonará en cada paso de tiempo (imprimiendo en pantalla “PIP PIP... PIP PIP...”) hasta haber sonado por más de 30 segundos. También puede agregar todos los métodos que considere necesarios para un mejor uso de dicha clase, pensando tanto en usted como en cualquier otro futuro usuario. Nota: ¡¡¡NO REINVENTE LA RUEDA!!!. En el ejercicio anterior acaba de definir una clase para el manejo de tiempos. ¡Utilícela! Esa es la base de la programación orientada a objetos. 3. Indicar si las jerarquías de clases de la Figura 1 son adecuadas y fundamentar su respuesta. Recuerde que en toda jerarquía se debe poder responder positivamente al siguiente planteo: Sea la clase Y una subclase de la clase X Sea XO un objeto de la clase X Sea YO un objeto de la clase Y ⇒ YO ES UN XO. 4. Diseñe e implemente una jerarquía de clases para los siguientes instrumentos musicales: Guitarra, Clarinete, Batería, Flauta, Violín, Bongos, Pandereta, Bajo, Piano, Saxofón, Trompeta Todos los objetos de éstas clases deben implementar el método tocar(), imprimiendo el nombre de la clase y algún texto acorde al sonido del instrumento. Analice si es conveniente definir clases adicionales a las mencionadas, pensando, por ejemplo, en el método afinar(), que sólo tiene sentido para algún tipo de instrumentos y no para todos. Justifique brevemente su respuesta. Computadores II Práctica 2 – 2007 Punto Auto Círculo Motor a) Ruedas b) Abuelo Padre Hijo Hija c) Figura 1: Jerarquías de clases a analizar.