KELA Presentacion Costa Rica 2024 - evento Protégeles
Practica evaluable sistemas electronicos
1. ETSI Telecomunicación
PROGRAMACIÓN 1
PRÁCTICA EVALUABLE
En esta práctica se deberá desarrollar una aplicación para almacenar información sobre
distintos servicios disponibles en un área geográfica determinada. Este área se
representará por un mapa (del tipo TMapa) de tamaño NxN ocupando la zona superior
izquierda de una rejilla (del tipo TMatrizMapa) de 100x100 celdas. Los objetos del tipo
TMapa deberán guardar la rejilla y el número N (num_celdas) que determina la zona
ocupada por el mapa. Cada servicio estará situado en una celda del mapa y su ubicación
vendrá dada por sus coordenadas (posición de la celda) en el mapa que se expresarán
como dos números enteros correspondientes a la fila y la columna (tipo TCoordenadas).
Grado en Sistemas Electrónicos (Grupo A) Curso 2012-13
En cada celda del mapa se podrá guardar un número variable de servicios (como máximo
10), se utilizará para ello una estructura del tipo TListaServicios. Cada servicio (del
tipo TServicio) se identificará por el tipo de servicio, su ubicación en el mapa (tipo
TCoordenadas), su nombre y su identificador (ambos cadenas de caracteres). El tipo de
servicio vendrá dado mediante un enumerado (del tipo TTipoServicio), con los valores
HOTEL, GASOLINERA, HOSPITAL y COLEGIO.
En este caso concreto el mapa es de 5x5 celdas
0 1 2 3 4 99
0
1
2
3
4
mapa TMatrizMapa
TMapa
99
num_celdas 5
tipoServicio 0
0 1 2 9 nombre Hotel Málaga Plaza
TListaServicios ... TArrayServicios 12320 TServicio
identificador
coord fila columna
5
0 3 TCoordenadas
La estructura de datos necesaria para resolver el problema descrito se muestra en la
figura anterior, donde aparece un ejemplo concreto con un mapa de 5x5 celdas. La
estructura principal será del tipo TMapa. En la figura, aparecen en negrita todos los
tipos de datos básicos que es necesario definir para poder resolver el problema,
aunque se podrá definir algún tipo de dato adicional si se considera necesario.
2. Teniendo en cuenta ja descripción anterior del problema, así como la estructura de datos de la figura, se
pide:
1. (1 punto) Definir todos los tipos de datos necesarios para poder resolver el problema.
2. Definir los siguientes subalgoritmos (funciones) para el manejo de un servicio:
a. (0.25 puntos) leerTipoServicio: Lee el tipo de servicio como un número natural hasta
que el usuario introduzca un valor correcto, es decir, un valor que esté entre 0 y 3, y
genera el correspondiente valor del tipo enumerado TTipoServicio.
b. (0.75 puntos) leerServicio: Lee los datos de un servicio (su tipo, sus coordenadas, su
nombre y su identificador). Este subalgoritmo devuelve el servicio leído (del tipo
TServicio) como un parámetro de salida. Habrá que asegurarse de que el tipo de servicio
introducido por el usuario es correcto. Si no lo es se le volverá a preguntar hasta que
introduzca un tipo de servicio correcto.
c. (0.5 puntos) mostrarServicio: Muestra por pantalla todos los datos de un servicio (del
tipo TServicio) pasado como parámetro. Para el tipo de servicio se mostrará una cadena
de caracteres con el nombre del tipo de servicio. Toda la información se mostrará en una
sola línea en el formato del ejemplo siguiente:
HOTEL, posicion=(0,3), identificador=12320, nombre=Hotel Málaga Plaza
3. Definir los siguientes subalgoritmos (funciones) para el manejo de la lista de servicios localizada
en una celda determinada de un mapa:
a. (0.25 puntos) Definir la igualdad de servicios (función iguales) teniendo en cuenta que
dos servicios se consideran iguales cuando son del mismo tipo y tienen el mismo
identificador. No se tiene en cuenta ni el nombre ni la ubicación de cada uno.
b. (0.75 puntos) existeServicio: Dada una lista de servicios (del tipo TListaServicios)
y un servicio concreto (del tipo TServicio) devuelve true o false dependiendo de si
existe o no ese servicio (u otro igual) en la lista de servicios.
c. (0.5 puntos) insertarServicioEnLista: Dada una lista (del tipo TListaServicios) y
un servicio concreto (del tipo TServicio) inserta el servicio dado en la lista si la lista
tiene menos de 10 servicios y no existe dicho servicio en la lista; en tal caso devuelve true
en un tercer parámetro OK de tipo bool. De lo contrario, no inserta y devuelve false en
el parámetro OK.
d. (1.0 puntos) insertarServicio: Dado un mapa (del tipo TMapa) y un servicio (del tipo
TServicio) inserta el servicio en la lista de la celda correpondiente a las coordenadas del
servicio, respetando las condiciones del apartado anterior y siempre que las coordenadas
estén dentro del mapa. En caso de no poder insertarse el servicio por alguno de los
motivos anteriores, se indicará devolviendo false en un parámetro OK de tipo bool. Si la
inserción tiene éxito en OK se devuelve true.
e. (1 punto) mostrarServicios: Dado un mapa (tipo TMapa) y el tipo de servicio en el que
estamos interesados, este procedimiento muestra todos los servicios de dicho tipo que
haya en el mapa.
4. Definir los siguientes subalgoritmos (funciones) para el manejo del mapa:
a. (2 puntos) leerMapa: Lee los datos de un mapa (tipo TMapa) desde la consola. Debe pedir
la dimensión N del mismo (será un mapa NxN) y el número de servicios con el que se va a
inicializar el mapa. Después se solicitará al usuario que introduzca, uno a uno, tantos
servicios como haya indicado. Si por alguno de los motivos descritos en el apartado d un
servicio no puede ser insertado en el mapa, se mostrará el error en la pantalla y se pedirá
que se vuelva a introducir.
b. (2 puntos) servicioMasCercano: Dado un mapa (del tipo TMapa), un tipo de servicio (del
tipo TTipoServicio) y una determinada posición (del tipo TCoordenadas) devuelve el
3. servicio (del tipo TServicio) del tipo solicitado que se encuentre más cercano a la
posición introducida. Si se encuentra, se devuelve además true en un parámetro OK de
tipo bool. Si no se encuentra ningún servicio de ese tipo en el mapa se devolverá false
en OK. Para localizar el servicio más cercano se buscará primero en la celda del mapa
correspondiente a la posición proporcionada (celda a distancia 0). Si en esa celda no hay
ningún servicio del tipo solicitado se buscará en las celdas adyacentes (celdas a distancia
1) y así se irá desplazando a distancia 2, 3, etc… hasta encontrar el servicio o hasta
terminar de recorrer todo el mapa sin encontrarlo. Si se encuentra una celda con más de
un servicio del tipo buscado, se devolverá el primero que se aparezca.
NOTA:
1. Se proporciona un posible esquema de programa principal (main) para probar el correcto
funcionamiento de los subprogramas (funciones) implementados. Para utilizarlo se deberá
completar las declaraciones de datos y prototipos de funciones y “destapar” (quitar las marcas de
comentario /* */ de) las zonas que se quiera probar, en el orden en el que aparecen, a medida que
se van completando las definiciones de las funciones pedidas.
==================================================================
// -- Importaciones ---------------------------------------------------
// Completar con las importaciones necesarias
// -- Declaraciones de tipos ----------------------------------------
// Completar con las declaraciones de los tipos de datos necesarios
// -- Declaraciones de funciones ---------------------------------
// Completar con los prototipos de las funciones que se piden
// -- Programa principal --------------------------------------------
int main() {
// Escenario de pruebas nivel 2 ..................
/*
TServicio servicio;
leerServicio(servicio);
cout << endl;
cout << "Se ha creado el servicio: n";
mostrarServicio(servicio);
*/
// Escenario de pruebas nivel 3 ..................
/*
TListaServicios ls;
ls.num_servicios = 0;
bool OK;
cout << "Insertamos el servicio en una listan";
insertarServicioEnLista(ls, servicio, OK);
if (OK and existeServicio(ls, servicio)) {
cout << "El servicio se ha insertadon";
} else {
cout << "No se ha podido insertarn";
}
*/
4. // Escenario de pruebas nivel 4 (1) ..................
/*
TMapa mapa;
leerMapa(mapa);
cout << "Hoteles del mapa: n";
mostrarServicios(mapa, HOTEL);
cout << "Gasolineras del mapa: n";
mostrarServicios(mapa, GASOLINERA);
*/
// Escenario de pruebas nivel 4 (2) ..................
/*
cout << "Hotel más próximo a la posicion (3,4)n";
TTipoServicio ts = HOTEL;
TCoordenadas coor = {3, 4};
servicioMasCercano(mapa, ts, coor, servicio, OK);
if (OK) {
mostrarServicio(servicio);
} else {
cout << "No hay servicio de este tipon";
}
*/
return 0;
}
// -- Definiciones de funciones
// Completar con las definiciones de las funciones pedidas
// y funciones auxiliares que se considere necesarias
================================================================