Práctica 2

Anuncio
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.
Descargar