Examen C++ Grupo A Informática II Fundamentos de Programación

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