Examen de Lenguajes de Programación II Ingeniería Técnica en Informática de Gestión Convocatoria de febrero de 2001 Pregunta 1 (3 puntos) Se quiere realizar un programa para la Universidad que maneje un fichero de personas relacionadas con la Titulación de Ingeniería Informática de Gestión. Cada ficha contendrá la información de una persona relacionada con la titulación, y se implementará a partir de una clase “persona” definida de la siguiente forma: class persona { char *nombre; int DNI; public: persona(); ~persona(); int ConsultarDNI(); virtual void RellenarFicha(); virtual void VisualizarFicha(); ...// Esto significa que se pueden añadir tanto miembros privados, como públicos }; Define dos clases derivadas de “persona”: • La clase “alumno”, que además de la información de la clase base, contenga el curso más alto en el que está matriculado. • La clase “profesor”, que además de la información de la clase base, contenga el nombre del departamento al que pertenece. Además, implementa otra clase “registroITIG” que contenga una lista de alumnos y profesores relacionados con la titulación, de modo que se puedan realizar sobre esta lista las siguientes tres operaciones: • Introducir una persona en la lista • Visualizar la información de todas las personas de la lista. • Buscar y mostrar la información de una persona de la lista por DNI. Escribe el código completo de todas las clases, con sus métodos y variables miembro y una función principal que ofrezca un menú mediante el que se puedan elegir las tres operaciones anteriores de la clase “registroITIG”. Pregunta 2 (5 puntos) Apartado A. Dada la siguiente clase: class cuenta { char *titular; int saldo; }; completa la clase para que la siguiente función sea correcta: cuenta NuevaCuentaMismoTitular ( cuenta c1) Examen de Lenguajes de Programación II 17/02/2001 1/4 { cuenta c2; int saldo; c2.AsignaTitular (c1.titular); cout << “¿Cuál es el saldo inicial?”; cin>>saldo; c2.AsignaSaldo (saldo); return c2; } Apartado B. Dada la siguiente estructura: struct movimiento { int pts; char fecha[9]; }; define la clase “historico_cuenta” de manera que contenga los mismos datos que la clase “cuenta” más una lista de movimientos (la suma de las cantidades de todos los movimientos de una cuenta debe concordar con el saldo de la misma). Para ello debes reutilizar el código del apartado anterior y definir aquellas funciones que sean necesarias para que la siguiente función sea correcta: historico_cuenta NuevaCuentaMismoTitular (historico_cuenta c1) { movimiento m; historico_cuenta c2; char resp; c2.AsignaTitular (c1.titular); cout<<”¿Desea agregar nuevos movimientos?”; cin>>resp; while (resp==’s’ || resp==’S’) { PedirDatosMovimiento (m); c2.InsertarMovimiento (m); cout<<”¿Desea agregar más movimientos?”; cin>>resp; } cout<<”¿Desea agregar los movimientos de la cuenta original?”; cin>>resp; if(resp==’s’ || resp==’S’) c2.AgregarMovimientosCuenta (c1); return c2; } Apartado C. Completa la clase “historico_cuenta” para que el código de la siguiente función sea correcto: void Ingreso (historico_cuenta &c) { movimiento m; PedirDatosMovimiento (m); c=c+m; cout<<”El contenido actual de la cuenta es:” << c; } Apartado D. En la clase “cuenta” tenemos las funciones “AsignaTitular” y “AsignaSaldo”. Mientras la primera función es interesante que sea accesible en la clase “historico_cuenta”, no sucede lo mismo con la segunda, pues modifica el saldo sin introducir ningún movimiento. ¿Cómo puede solventarse esta situación?. Examen de Lenguajes de Programación II 17/02/2001 2/4 Nombre: ATENCIÓN: Esta hoja se entregará junto con el examen. Pregunta 3 (2 puntos) Contesta con verdadero o falso a las afirmaciones que se te formulan a continuación. Recuerda que las preguntas falladas descuentan sobre las acertadas (Respuestas acertadas +0,1 y respuestas falladas –0.1). Escribe “V” o “F”, según sea verdadero o falso, junto al número correspondiente a la afirmación. 1. Las variables de clase se definen mediante la palabra static y presentan el mismo contenido para todos los objetos de la clase. 2. Dadas las siguientes declaraciones: char s1[30], s2[30]; para que la siguiente instrucción copie la cadena s2 en s1 s1=s2; se debe definir la sobrecarga del operador asignación. 3. Las funciones template son una forma de definir sobrecarga de funciones de una manera automática. 4. El tipo genérico de una función template debe aparecer en los parámetros o en el tipo de retorno. 5. Una función virtual pura se define con “=0” y no permite que la clase tenga objetos, aunque sí punteros. 6. Aunque no definamos ningún constructor en una clase siempre tenemos el llamado constructor por defecto el cual no recibe parámetros y se encarga de inicializar a cero las variables de la clase. 7. Además de los operadores de conversión, los constructores permiten convertir objetos de una clase en otra. 8. En el operador de subíndice [ ] se suele devolver un valor por referencia. 9. En la sobrecarga de C++ no es posible definir nuevos operadores aparte de los que da el lenguaje, pero sí que se puede cambiar el número de operandos de la mayoría de ellos. 10. La herencia virtual sirve para impedir que en la herencia simple una clase reciba varias veces el contenido de su clase base. 11. En la herencia virtual se puede realizar una llamada desde el constructor de la clase nieta al de la clase abuela. 12. Los punteros a una clase base pueden apuntar a objetos de sus clases derivadas, pero no es correcto lo contrario. 13. En una función donde se requiere como parámetro un objeto de una clase derivada puede pasarse en su lugar un objeto de la clase base. 14. Una diferencia entre new y malloc es que la primera puede llevar aparejada la ejecución de un constructor. 15. Dadas las siguientes tres clases: zoológico, animal, mono. La relación de herencia más lógica entre ellas sería: mono derivada de animal, animal derivada de zoológico. Examen de Lenguajes de Programación II 17/02/2001 3/4 16. Un miembro protegido (protected) en una clase X es accesible desde X, desde las clases derivadas directamente de ésta y desde las funciones amigas (friend), pero no desde el resto del programa. 17. Dada la siguiente clase: class A { int v; public: A(int x) { v=x;} }; la siguiente instrucción define un vector de 10 objetos A y los inicializa con el valor 30: A vector[10] (30); 18. A las variables de clase sólo se puede acceder desde las funciones de clase. 19. Una función friend no puede hacer uso de la palabra this. 20. Una clase puede tener varios destructores, aunque todos ellos deberán llevar parámetro void. Examen de Lenguajes de Programación II 17/02/2001 4/4