Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1 ÍNDICE ÍNDICE... 1 1.1 Ejercicio 1: Máquina Expendedora (3.5 ptos.)... 1 1.2 Ejercicio 2: Clase Circulo (1.0 pto.)... 3 1.3 Ejercicio 3: Herencia. Clase Agencia (4.5 ptos.)... 4 Antes de empezar a desarrollar los ejercicios del examen, es conveniente que revises que tienes creado tu disco G:\. En él vas a poner todos los ejercicios. Lee atentamente las indicaciones del ejercicio y debes hacer los programas conforme se te indica en este cuadernillo, es decir, si te dicen que desarrolles el programa con 3 funciones, debes hacerlo así; si dice que las variables de las clases deben ser privadas, así debes declararlas. 1.1 Ejercicio 1: Máquina Expendedora (3.5 ptos.) Para empezar a hacer este ejercicio, crea el Proyecto Maquina en tu disco G:\ y en él crea el fichero maquina.cpp, que es donde vas a escribir el código del ejercicio. A continuación se te explica lo que se pretende conseguir con este ejercicio: Has sido elegido para hacer el programa de una máquina expendedora. La máquina debe contener inicialmente 10 monedas de cada una de las siguientes: 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02 y 0.01. Es decir habrá 10 monedas de 2, 10 de 1 y así sucesivamente. En total son 8 monedas diferentes. Debes tener dos array s, uno para las monedas y otro para las cantidades. Cada vez que el usuario hace una compra, el programa le pedirá que introduzca el importe que deposita (por ejemplo 5 ) y le pedirá también el precio que debe cobrar (por ejemplo 1.5 ), luego el programa debe decir cuantas monedas de 2, de 1 o de las que sean necesarias debe devolver al usuario (en nuestro ejemplo 1 de 2, 1 de 1 y 1 de 0.5, que en total suman 3.5 que es lo que debe devolver al comprador) y debe restar las cantidades que va devolviendo (en nuestro ejemplo ya le quedan 9 de 2, 9 de 1 y 9 de 0.5 ), de tal forma que si al final se queda sin monedas debe sacar un aviso por la consola que no tiene monedas para realizar al venta y NO dar por válida dicha operación. El programa además, debe tener un menú con 4 opciones: 1. Listado: Mostrar cuantas monedas quedan de cada una. 2. Agregar: debe permitir poder agregar más monedas. 3. Comprar: esta parte es la más importante. Aquí estará el algoritmo que determinará cuántas monedas de cada una debe utilizar para devolver al usuario. 4. Salir: para finalizar el programa. A continuación se muestra el esqueleto de lo que debe ser la función main(): void main() //.. definicion de array s y variables necesarias while(true) int opc=menu(); switch(opc) case 1: Lista(...); break; case 2: Agregar(...); break; case 3: Comprar(...); break; case 4: exit(0);
Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 2 Como puedes ver, el programa principal llama a las funciones de Menu(), Lista(), Agregar() y Comprar(). Debes decidir qué argumentos deben ir en cada una de las funciones. Además debes agregar las definiciones y encabezamientos que hagan falta. La función Menú debe devolver un entero con la opción elegida por el usuario. En las siguientes figuras se muestran el menú que debe aparecer y la lista de la cantidad de monedas que se tienen de cada una, cuando se elige la opción 1: Cuando se elige la opción comprar (opción 3 del menú) y la opción 2 de agregar monedas, aparecerán las siguientes pantallas. Notar que en la opción de agregar monedas, si después hacemos un listado, veremos que han aumentado el número de monedas que hemos dado: Opción 3: Realizar una compra Opción 2: Agregar más monedas Como ayuda, recuerda el uso del operador % que devuelve el resto de una división. Es mejor que trabajes con enteros y luego hagas las conversiones. Por ejemplo una moneda de 0.01 es igual a 1 céntimo y una de 2 es 200 céntimos. La puntuación de este ejercicio es como sigue:
Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 3 Menú: Si el menú funciona bien: 0.75 ptos. Lista: Si la función Lista muestra las cantidades de las monedas que quedan: 0.5 ptos. Agregar: si se pueden agregar más monedas y se ven con la función lista: 0.5 ptos. Comprar: 1.5 ptos. Aquí estará el algoritmo. Si el programa compila bien: 0.15 pts. Salidas por consola con formatos e indicadores: 0.1 ptos. Total: 3.5 ptos. 1.2 Ejercicio 2: Clase Circulo (1.0 pto.) Para el desarrollo de este ejercicio debes crear un proyecto nuevo, al que le pondrás Circulo. En él debes crear el fichero circulo.cpp para escribir el código que te explicaré a continuación. En este ejercicio debes crear dos clases: a. Clase Circulo: Esta clase debe tener tres variables miembro privadas: double x,y,r, las cuales van a representar la posición del círculo (x,y) y el radio ( r ).. - El constructor de esta clase debe permitir inicializar a cero dichas variables, al momento de la creación de los objetos. - Sobrecargar el operador >> para introducir los datos por teclado (x,y,r). b. Clase Point: Esta clase debe tener dos variables miembro privadas: double x,y, las cuales representan un punto en un sistema de coordenadas. También el constructor de esta clase debe permitir inicializar a cero las variables. - Sobrecargar el operador >> para introducir los datos por teclado (x,y). La clase Circulo debe tener una función miembro amiga EstaDentro(...) que permita verificar si un punto (objeto de la clase Point) está dentro de un círculo (objeto de la clase Circulo). Dicha función debe retornar verdadero o falso si el pto. está dentro o no del circulo. Recuerda que para calcular la 2 2 distancia que hay entre dos ptos. se usa la sgte. fórmula: dist = ( x2 x1) + ( y2 y1) A continuación se muestra el esqueleto de la función main(): void main() Circulo c1; cin >> c1; Point p1; cin >> p1; //creacion de un objeto de la clase Circulo //pide por teclado los datos del círculo: x,y,r //pide por teclado los datos del punto: x,y if ( EstaDentro(c1,p1) ) //llamada a la funcion amiga EstaDentro cout << "El Pto. P1 SI esta dentro del círculo C1"; else cout << "El Pto. P1 NO esta dentro del círculo C1"; cout << endl; Si hace falta crear más funciones dentro de cada clase o más variables, hay libertad de hacerlo. Lo único que hay que respetar es la estructura del programa main(). Incluir también todos los ficheros *.h que hagan falta.
Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 4 1.3 Ejercicio 3: Herencia. Clase Agencia (4.5 ptos.) Parte I: (3.5 ptos.) Para este ejercicio debes crear un proyecto nuevo Agencia y el fichero Agencia.cpp para escribir el código en él. Tanto las clases como main lo pondrás en este fichero. El ejercicio consiste en hacer un programa para una agencia de viajes. La clase base se llamará Agencia y las clases derivadas serán Turismo y Libre. La jerarquía de clases que debes seguir es la siguiente: Agencia Turismo Libre A continuación vamos a describir las variables miembro que deben tener las clases: a. Clase Agencia: 1) Tendrá 2 variables miembro privadas: i. char *nombre: para almacenar el nombre del cliente que hace la reserva. ii. long duracion: para almacenar los días de duración del viaje. 2) Tendrá 1 variable protected tipo static (una sola para todos los objetos), la cual tendrá el precio de la noche: static double precio (Esta variable debe ser inicializada en main() con el valor de 50 ). El constructor de esta clase NO tendrá argumentos y sólo se encargará de pedir el nombre al usuario. La duración del viaje debe ponerla la clase derivada. Esta clase debe definir la función void Display() para mostrar por pantalla los datos de la reserva. Debe ser o no virtual esta función? Queda a criterio del alumno. También queda a criterio del alumno ver si esta clase necesita o no destructor. class Agencia private: char *nombre; //el constructor pide el nombre long duracion; //debe pedirlo la clase derivada protected: static double precio; //precio del hotel... //escribir el resto ; b. clase Turismo: Esta clase tiene 2 variables miembro protegidas: 1) int tipo: para definir el tipo de alojamiento (1:SA 2:AD 3:MP 4:PC) 2) static int plazas: será una sola variable para todos los objetos, ya que el número de plazas es único. Cada vez que se crea un objeto, se debe decrementar el número de plazas (hacerlo en el constructor), de tal forma que cuando ya no queden plazas libres no permita hacer ninguna reserva más. Esta variable, al ser static, tiene que ser inicializada en main con 5 plazas. El constructor de esta clase NO tendrá argumentos y sólo se encargará de pedirlos por teclado. Pedirá dos cosas:
Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 5 - El tipo de alojamiento (SA(1):solo alojamiento AD(2):alojamiento y desayuno y así sucesivamente). - La duración del viaje (los dias). Este dato debe ser pasado a la clase Agencia, que es la que tiene la variable long duración. Esta clase también debe redefinir la función void Display() para sacar la información por la consola. class Turismo: public Agencia protected: int tipo; static int plazas; //... escribir el resto ; c. Clase Libre: Esta clase también 2 variables miembro protegidas: 1) char *hotel: para almacenar el nombre del hotel 2) static int plazas: será una sola variable para todos los objetos, ya que el número de plazas es único. Cada vez que se crea un objeto, se debe decrementar el número de plazas, de tal forma que cuando ya no queden plazas libres no permita hacer ninguna reserva. Esta variable, al ser static, tiene que ser inicializada en main con 5 plazas. class Libre: public Agencia private: char *hotel; protected: static int plazas; public: Libre()... //más código ; El constructor de esta clase NO tiene argumentos, debe pedirlos al usuario. Que debe pedir? 2 cosas: El nombre del hotel y la duración del viaje (días). d. Programa principal main(): En el programa principal debe haber un menú con 5 opciones, las cuales pasamos a describir a continuación: 1) Ver Plazas libres: esta opción permitirá sacar por pantalla el número de plazas libres que quedan de Turismo y Libre. 2) Ver Reservas: esta opción sacará por pantalla todas las reservas que se hallan hecho hasta el momento. 3) Hacer Reserva de Turismo: permitirá hacer una reserva de Turismo (crear un nuevo objeto de la clase Turismo). 4) Hacer Reserva Libre: permitirá hacer una reserva Libre (crear un nuevo objeto de la clase Libre). 5) Salir: terminar el programa.
Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 6 Se tiene que crear un vector de punteros a la clase base Agencia para ir almacenando todos los nuevos objetos creados, de tal forma que cuando queremos imprimir la lista se puede hacer con un simple for. A continuación se muestra el esqueleto de lo que sería la función main(): //inicializar variables static de las clases #define NUM 20 void main() Agencia *lista[num]; //Vector de punteros While(true) //hacer Menú // 1. Ver Plazas Libres\n // 2. Ver Reservas\n // 3. Reserva de Turismo\n // 4. Reserva Libre\n // 5. Salir\n //según la opcion elegida, poner el código correspondiente //solo se sale del while por la opcion 5 Fig.1 Menú y Opción 1 elegida Fig. 2 Menú y Opción 3 elegida: introducir datos de Turismo Fig.3 Menú y Opción 4 elegida: introducir datos de Reserva Libre Fig.4 Opción 2: muestra las reservas y Opción 1 las plazas libres (se han restado las reservas) Si has llegado hasta aquí, tienes los 3.5 ptos. La distribución de los puntos es como sigue: 0.25 si el programa compila bien; 0.75 Programa main() con Menú bien hecho. 0.5 clase Agencia bien hecha; 1.0 clase turismo bien hecha; 1.0 clase Libre bien hecha.
Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 7 Parte II: (1.0 pto.) Para continuar con el ejercicio, es mejor que hagas un nuevo proyecto Agencia1 y crees un nuevo fichero Agencia1.cpp, en el que vas a copiar todo el código escrito hasta ahora en el fichero Agencia.cpp. Antes de ponerte a escribir más código (que te diré a continuación) prueba a compilar y ejecutar el programa para verificar que lo has hecho bien. Esta nueva parte consiste en agregar una nueva función para calcular el costo del viaje. Dicha función será double Costo() y debe ser redefinida en cada una de las clases. Debe ser virtual? Se aplicarán dos criterios diferentes para el cálculo del costo del viaje: 1. Clase Turismo: dependiendo del tipo de alojamiento, se aplicará un porcentaje al precio del hotel: a. SA: 0% b. AD: 10% c. MP: 20% d. PC: 40%. Sí la reserva es por 7 días o más, se hará un dcto. del 10% al costo total. 2. clase Libre: como este tipo de reservas no permite elegir el tipo de alojamiento, sólo se aplicará un dcto. del 10% para reservas de 5 o más días. La función Display() es la que debe llamar a la función Costo(). Para mostrar toda la información del viaje más el costo. Veamos cómo sería la nueva salida para la opción 2 del menú (ver reservas): Como puedes ver en la figura de la salida por consola, cuando queremos ver las reservas, aparece el costo del viaje, teniendo en cuenta los criterios explicados anteriormente. Por ejemplo para la reserva libre de 5 días, el precio del hotel es 50 el día y como 5 días o más se le aplican un 10% de dcto. el costo resulta 5*50*0.9=225. Lo mismo se aplica para la reserva de Turismo. El resto del programa debe seguir funcionando igual.