Carnet Nombre: Examen C++ Grupo A Informática II Fundamentos de Programación Prof. Dr. Paul Bustamante Escuela Superior de Ingenieros – TECNUN- Universidad de Navarra Programación C++ - Examen Junio 2004 Pág.1 Índice 1. INTRODUCCIÓN................................................................................................................................................... 1 2. EJERCICIO 1: AGENDA TELEFÓNICA (4.0 PTOS.).................................................................................... 1 3. EJERCICIO 2: OFICINA DE CORREOS (5.0 PTOS.)................................................................................... 4 1. Introducción Algunas sugerencias con respecto al examen: verifique que tiene su Disco G:\ creado y que no tiene nada en él (ejercicios anteriores). Trate de realizar primero el ejercicio que crea que es más sencillo y deje el complicado para el final. Lea detenidamente los enunciados. 2. Ejercicio 1: Agenda Telefónica (4.0 ptos.) Ud. ha sido elegido para realizar un programa de una agenda telefónica, que posteriormente será introducido en una PDA. El programa principal debe contener el menú que se puede observar en la figura de la derecha. Existe en él 5 opciones que se describirán más adelante. Descripción del funcionamiento del programa: • • Opción 1, Agregar Contacto: Esta opción permitirá introducir los siguientes datos de una persona: o Nombre, Apellidos, Dirección y Teléfono (ver figura siguiente. Siempre que aparece en la consola el “?” significa que pide que el usuario introduzca los datos). Opción 2, Buscar Contacto: esta opción permite buscar un registro de la agenda (contacto) por medio del Apellido o el Teléfono (ver figura). o Si se busca por el Teléfono, se pedirá dicho número y en cuanto encuentre a la persona debe mostrar sus datos por la consola, y en caso de no encontrarlo, debe mostrar un mensaje. o Si se busca por apellido, hay que tener en cuenta lo siguiente: solo basta con introducir algunas letras del apellido para que muestre todos los contactos que hay con esas letras iniciales, incluso si solo se pone una letra, debe buscar todos los apellidos que empiecen son esa letra. Cuando encuentre los contactos, debe mostrar Escuela Superior de Ingenieros – TECNUN- Universidad de Navarra Programación C++ - Examen Junio 2004 Pág.2 toda la información en la pantalla (en la figura, se escribe “Ga” y encuentra todos los contactos cuyos apellidos empiecen por “Ga” ). • Opción 3, Ver Agenda: es opción permite listar en la consola todos los contactos que hay introducidos en la Agenda, según el siguiente formato (al inicio poner la Posición que ocupa en la memoria, para poder borrar con más facilidad): • Opción 4, Borrar Contacto: esta opción permite dar de baja a un contacto de la agenda (porque se ha cambiado de domicilio por ejemplo o porque ya no es nuestro amigo). En la siguiente figura podemos ver que para borrar el contacto nos pide la posición de la memoria. Cuando lo encuentra lo borrar y tiene que “reordenar” de nuevos nuestros contactos, para que cuando veamos de nuevo la agenda ya no aparezca (se ha borrado el 4, Luis Flores). Descripción interna del programa En este apartado se va a describir cómo debe ser internamente el programa. Para que sea modular y eficiente, el programa se ha dividido en varias funciones, las cuales tienen cada una su objetivo. Además, para la manipulación correcta de los datos y la sencillez en el paso de los argumentos a las funciones, se debe crear la estructura Agenda con los datos del contacto (Nombre, Apellidos, Direccion y Telefono). A continuación se presenta el esqueleto del programa: #include <iostream.h> #include <iomanip.h> #include <string.h> Escuela Superior de Ingenieros – TECNUN- Universidad de Navarra Programación C++ - Examen Junio 2004 Pág.3 struct Agenda{ char Nombre[10]; char Apellidos[20]; char Direccion[30]; long Telefono; }; int Menu(); Agenda AgregarContacto(); void BuscarContacto(Agenda Lista[],int num); void BorrarContacto(Agenda Lista[], int &num); void PrtCabecera(); void PrtContacto(Agenda tmp); void main() { int num=0; //numero de contactos Agenda lista[400]; //lista de contactos while(true){ int ret = Menu(); if (ret==5) break; if (ret==1) { //Agregar // agregar contacto a la lista } if (ret==2) { //Buscar // llama a la fun. BuscarContacto; } if (ret==3) { //ver Lista // bucle que llamar a la función PrtContacto; } if (ret==4) { //Borrar // llamar a la función BorrarContacto } } • • • • } La función AgregarContacto no recibe ningún argumento y sólo devuelve una variable del tipo Agenda (recordar que Agenda es una estructura, y como tal, es un nuevo tipo de datos del usuario, que puede ser tratado como cualquier tipo de datos). En esta función se pedirán los datos necesarios (Nombre, Apellidos, Direccion y Telefono). La función BuscarContacto recibe la lista entera y el número de contactos que hay en ella. Dentro de esta función se debe pedir el teléfono o el apellido (según las condiciones dadas anteriormente). Una vez que encuentra el contacto, llamará a la función Prtcontacto con el/los elemento/s de la lista que hubiese encontrado. La función PrtContacto recibe como argumento 1 variable del tipo Agenda, la cual la imprimirá en la consola según el formato que se ha propuesto en la figura de la opción 3. La función BorrarContacto recibe dos argumentos, la lista de los contactos y el número de elementos que hay en ella. Dentro de esta función hay que pedir al usuario la posición del elemento a borrar de la lista, actualizar la variable num (numero de elementos) y reordenar la lista. Nota: Se debe mantener la estructura main() así como las funciones. Distribución de puntos: • • • • • Agregar Datos: Listado Agenda: Buscar Datos: Borrar y reordenar: Resto (main): 0.5 0.75 Por Apellido: 1.0 0.75 0.5 Por teléfono: 0.5 Escuela Superior de Ingenieros – TECNUN- Universidad de Navarra Programación C++ - Examen Junio 2004 3. Ejercicio 2: Oficina de Correos Pág.4 (5.0 ptos.) A Ud. le han contratado para que haga un programa que permita llevar el control del franqueo de una oficina de correos, para lo cual nos basaremos en las clases, la herencia y el polimorfismo, técnicas del C++ que ya sabe y domina. El programa debe permitir introducir al sistema Cartas Normales y Cartas Certificadas, las cuales tienen un coste diferente. Por ahora sólo haremos el programa para el ámbito nacional, con el fin de poder luego actualizarlo e incluir el ámbito internacional. En la siguiente figura se puede observar el funcionamiento del programa: Hay un menú con 5 opciones. Las 2 primeras opciones permitirán introducir los datos de las cartas. Para cada una de las dos opciones hay que pedir siempre los datos del remitente y el destinatario, para lo cual se ha creado la clase Datos: class Datos { private: char nombre[20]; char direccion[30]; char ciudad[15]; long codpostal; public: friend istream& operator>>(/* poner argumentos */){ //poner código } friend ostream& operator<<(/* poner argumentos */){ //poner código } }; Esta clase tiene los miembros privados nombre, direccion, ciudad y codpostal. No tiene ningún método ni constructor, ya que los datos se pedirán y se sacarán a la consola usando la sobrecarga de los operadores >> y <<. Para el franqueo de Cartas Normales se ha creado la clase Carta, la cual no tiene ningún constructor y tiene los siguientes miembros: • 3 variables: Datos remitente, Datos destinatario y double precio. • El método virtual VerFranqueo, que sacará por consola todos los datos: remitente, destinatario y precio del franqueo. • El método CalculaFranqueo, que lo único que hará será poner el valor a la variable precio: en cartas normales el precio es de 0.3 €. • Y hay que sobrecargar el operador >> para pedir los datos. Ver figura adjunta para pedir los datos de una Carta Normal. class Carta { protected: Datos remitente; Datos destinatario; double precio; public: friend istream& operator>>(/* poner argumentos */); Escuela Superior de Ingenieros – TECNUN- Universidad de Navarra Programación C++ - Examen Junio 2004 Pág.5 double CalculaFranqueo(); virtual void VerFranqueo(); }; Para el franqueo de Cartas Certificadas se ha creado la clase CartaCertificada, la cual es una clase derivada de la clase Carta. Esta clase tiene un constructor que recibe como datos el peso y si es urgente o no, para lo cual se han creado las variables double peso y bool urgente respectivamente. El resto de datos se piden sobrecargando el operador << y se sacan los datos a la consola a través del método VerFranqueo. Esta clase también tiene redefinido el método CalculaFranqueo, al cual se le aplicarán las siguientes reglas: • Si la carta pesa menos de 20gr, el precio es: urgente: 2.5€ y no urgente: 2.0€ • Si la carta pesa más de 20gr, el precio es: urgente: 0.125€/gr y no urgente: 0.1€/gr. En la figura anterior se pueden ver los datos que se piden al introducir una carta certificada: el peso y si es urgente o no (para calcular el precio). El resto de datos se piden de la misma forma que en la carta normal, es decir el remitente y el destinatario. A continuación se muestra la estructura de la clase CartaCertificada: class CartaCertificada : public Carta { protected: bool urgente; double peso,precio; public: CartaCertificada(double pes, bool urg); friend istream& operator>>(/* poner argumentos */); double CalculaFranqueo(); void VerFranqueo(); }; Mediante la Opción 3 del menú se podrán ver todas las cartas que se han franqueado, con los respectivos datos de remitente y destinatario, así como el precio del franqueo. Ver figura: La opción 4 (1.0 pto) del menú debe permitir grabar un fichero de texto con un reporte de las cartas franqueadas, con todos los datos que aparecen en la consola de los remitentes y destinatarios, así como el precio del franqueo, y además, muy importante, que imprima la Oficina de Correos, El nombre del operador y la Fecha (estos datos se deben pedir por la consola). Esta opción tiene 1 pto. A continuación se muestra la estructura de lo que podría se la función principal main(): void main() { Carta *Lista[30]; //lista de objetos Escuela Superior de Ingenieros – TECNUN- Universidad de Navarra Programación C++ - Examen Junio 2004 } Pág.6 int opc,num=0; //más variables necesarias while(1){ opc = Menu(); if (opc==1){ //crear objeto Carta y agregar a Lista } else if(opc== 2){ //crear objeto CartaCertificada y agregar a Lista } else if(opc== 3){ //Imprimir datos a consola, por medio de VerFranqueo } else if(opc== 4){ //Grabar reporte } else if(opc== 5){ //liberar memoria de objetos y terminar programa } } Si necesita crear más funciones de las que se han puesto puede hacerlo, sin cambiar las protecciones de las variables en las clases, es decir que las variables que son privadas o protegidas se deben dejar tal cual, caso contrario se descontarán puntos. Nota: Se deben hacer todas las clases y utilizarlas, manteniendo también la estructura main(). Distribución de puntos: • • • • • Opción 1: Opción 2: Opción 3: Opción 4: Resto (main): 1.0 1.5 1.0 1.0 0.5 Suerte! Escuela Superior de Ingenieros – TECNUN- Universidad de Navarra