EXAMEN DE METODOLOGÍA Y TECNOLOGÍA DE LA PROGRAMACIÓN EUI - FI - UPV Junio de 2002 Responda únicamente en el espacio adjunto a cada pregunta. TIEMPO = 3 horas COMPRUEBE QUE EL EXAMEN CONSTA 8 PREGUNTAS (10 páginas) NO SE ADMITIRÁN EXÁMENES DESGRAPADOS APELLIDOS: Indique si pertenece a Escuela o Facultad NOMBRE: DNI: FIRMA: Pregunta 1 (0,75 puntos) Corrija o complete las siguientes afirmaciones: 1. Los principios fundamentales sobre los que se sustenta la Ingeniería de la Programación son principalmente la abstracción de procedimientos y datos, y la ocultación de información. 2. En el ciclo de vida con prototipado, el prototipo permite que el cliente vea funcionando exactamente lo que será su programa final. 3. Por producto software se entiende documentación de diseño, código fuente y manual de usuario. Solución: 1. falta el principio de modularidad. 2. el prototipo permite ver una versión inicial no completa del sistema 3. Producto software = sistema software + documentación para su instalación y uso. Pregunta 2 (0,75 puntos) Indique y justifique el tipo de acoplamiento presente entre los módulos de la figura. Procesar Vector Vector posición Elemento goto Fin_Búsqueda Buscar elemento Respuesta: La instrucción de salto no influye en el acoplamiento, presentan el que se deduce de los parámetros de la llamada, acoplamiento por estampado. 1/10 Pregunta 3 (1.5 puntos) Los siguientes diagramas presentan dos versiones de una parte aferente encargada de la lectura y validación de un alumno para su matriculación en un curso. Primeramente se comprueba que el alumno exista en la base de datos y que el alumno sea mayor de edad. A continuación se valida que el alumno no esté ya matriculado en ese curso, y se recuenta el número de alumnos matriculados en el curso. Discuta las ventajas y desventajas de una opción frente a la otra, y proponga otra opción más conveniente en el caso de que exista (no es necesario dibujar la solución). Las definiciones de los almacenes de datos son: Alumno = {@NIF + nombre + fecha nacimento + dirección} Matrícula = {@NIF + nota} Opción A NIF_no_matriculado Nº de alumnos Obtener alumno y nº de alumnos Nº de alumnos NIF_no_matriculado Obtener NIF no matrículado obtener nº alumnos matriculados Nº error Reg matrícula NIF_valido EOF Leer de matrícula Obtener NIF válido NIF_valido Nº error está_matriculado Validar alumno no matrículado NIF_existente Validar mayor de edad Obtener NIF existente Mostrar Error EOF fecha EOF NIF Reg Alumno Leer fecha Nº error NIF Leer de alumnos existe Validar NIF existente Leer cadena Mostrar Error es_mayor_de_edad NIF_existente Mostrar Error EOF Reg Alumno Leer de alumnos 2/10 Reg matrícula Leer de matrícula Opción B NIF_no_matriculado Nº de alumnos Obtener alumno y nº de alumnos NIF_valido Nº error Nº de alumnos NIF_valido está_matriculado Obtener NIF válido Validr al. no matr. y obt nº al Mostrar Error Nº error NIF_existente Reg matrícula EOF NIF_existente Leer de matrícula es_mayor_de_edad Obtener NIF existente NIF Validar mayor de edad Nº error fecha NIF Reg Alumno existe Leer cadena Mostrar Error Validar NIF existente LR Mostrar Error ER Leer fecha LR Reg Alumno EOF leer Reg. Alumno Reg Alumno Reg Alumno escribir reg. alumno Reg Alumno Leer de alumnos ER Reg. alumno Solución La opción A tiene la desventaja que contiene acceso repetido al almacen “alumnos”. La opción B resuelve el acceso repetido a “alumno” mediante un cluster. El acceso repetido a “matrícula” lo evita utilizando el módulo “validar alumno no matriculado” para devolver el nº de alumnos matriculados. Esto empeora la cohesión del módulo, por lo que dificulta la comprensión y reutilización del mismo. Por lo tanto una opción adecuada sería utilizar el cluster para el reg alumno (ver opción B), y separar en dos módulos la validación de alumno no matriculado y el recuento del nº de alumnos (ver opción A). 3/10 Pregunta 4 (1 punto) Determine y justifique la cohesión de aquellos módulos que no son de librería. ¿Crees que se podría mejorar el diagrama? Justifique la respuesta y en caso afirmativo indique una alternativa. Cantidad_valida Cod_producto Obtener Cantidad_valida error Cod_producto cantidad Obtenercantidad eof ok Imprimir error Validar stock registro Leer_productos ok registro actualiza_productos Solución: Validar stock: secuencial Obtener cantidad valida: secuencial (o funcional) Mejora: Desplazar “actualizar productos” por encima de Obtener_cantidad_valida 4/10 Pregunta 5 (1 punto) Dado el siguiente DFD: a) Determine las transacciones de que consta y dibuje el diagrama de primer nivel en el que aparece un proceso por cada transacción. b) Dibuje el diagrama de contexto. P1 validar_datos Datos reserva válidos P2 Validar_ reserva P3 Registrar reserva Datos reserva P4 Imprimir justificante Justificante reserva Reserva válida D Vuelos Línea justificante Cliente D Vuelos D Cliente Reservas P8 Actualizar reservas Código reserva Administrador fecha + hora P5 Validar_ reserva_a_ cancelar Código válido Solución: P6 Cancelar_ reserva Línea justificante Justificante cancelación P7 Imprimir justificante cancel. P1 Datos reserva Crear reserva Transacciones: Línea justificante T1: P1,P2,P3,p4 T2: P5,P6,P7 Cliente Código reserva P2 T3: P8 Cancelar reserva D Línea justificante P3 Administrador fecha + hora Actualizar reservas Diagrama de contexto P Sistema de reservas Datos reserva Administrador Cliente Código reserva fecha + hora Línea justificante 5/10 reservas Problema 6 (2,25 puntos) Se dispone de la siguiente información relativa a un sistema de matriculación de vehículos que se ha obtenido tras la fase de análisis: el DFD de la transacción “Asignar Nueva Matrícula”, el diccionario de datos y una breve descripción de los procesos. Derive el Diagrama de Estructura de la transacción “Asignar Nueva Matrícula” a partir de la información proporcionada. Diagrama de Flujo de Datos de la transacción “Asignar Nueva Matrícula” D1 PROPIETARIO S PROPIETARIO NIF no existe P1 Obtener Nombre Propiet. Válido NIF existente + nombre Justif. Matricula NIF NIF existente PROPIETARIO P5 Generar Justific. Matriculación P3 Asignar Matrícula D3 Datos Vehículo Válidos P2 Validar Vehículo Datos Vehículo VEHÍCULOS MATRICULADOS Fecha Fecha Matrícula Nueva Matrícula Nueva P4 Calcular Matrícula Marca no existente D2 MARCAS Diccionario de Datos: matrícula = número + serie /* ejemplo de matrícula: 1234 BST */ número = {dígitos}4 serie = {letra}3 dígito = [0-9] letra = [A-Z] series_válidas = {serie}* /* fichero que guarda ordenadas las series que pueden aparecer en una matrícula */ vehículo = @matrícula + nif_propietario + datos_vehículo + fecha_matriculación datos_vehículo = marca + modelo + potencia propietario = @nif + nombre + dirección + fecha_nacimiento propietarios = {propietario}* vehículos_matriculados = {vehículo}* marcas ={marca + descripción}* justificante_matriculación = matrícula + nif_propietario + nombre_propietario + fecha_matriculación 6/10 Descripción de procesos: Obtener Nombre Propietario Válido: lee el NIF del PROPIETARIO del vehículo y comprueba si existe en el almacén de PROPIETARIOS. Si existe obtiene el nombre y si no indica que el NIF no existe y no puede proceder a la matriculación del vehículo. Validar Vehículo: lee los datos del vehículo y comprueba que la marca introducida exista. Si no existe informa de ello al PROPIETARIO. Calcular Matrícula: devuelve la nueva matrícula a asignar. Lee del almacén de vehículos matriculados para obtener la última matrícula asignada. Asignar Matrícula: guarda el registro del vehículo matriculado. Generar Justificante Matriculación: proporciona al PROPIETARIO un justificante con la información que se indican en el Diccionario de datos. Solución: Asignar Matrícula Nueva Nombre NIF Válido Matrícula Nueva Datos Vehículo Datos Vehículo nombre Matrícula Nueva Matrícula Nueva NIF Válido Obtener Vehículo Válido Calcular Matrícula Asignar Matrícula Vehículo Nuevo n. error NIF válido dato marca Leer de USUARIO Obtener Propietario Válido es válido Validar Vehículo Reg. Marca n. error Reg. Vehículo Emitir Mensaje de Error Leer de VEHICULOS MATRICULADOS eof Leer de MARCAS NIF NIF no existe Leer de PROPIETARIO Obtener Nombre PROPIETARIO Propietario eof ok nombre NIF Generar Justif. Matriculación Emitir Mensaje de Error eof Leer de PROPIETARIOS 7/10 Escribir VEHICULOS MATRICULADOS Fecha Leer Fecha Fecha Justif. Matric. Escribir en PROPIETARIOS Problema 7 (1,75 punto) Factorice y modifique el módulo “Calcular matrícula” según la especificación de módulos que se acompaña. MÓDULO Obtener_serie_nueva; Entrada: última_serie: serie; Salida: serie_nueva: serie; error: entero; Descripción: Busca en el almacén de datos series_válidas la serie válida siguiente a última_serie (serie_nueva). error es 0 si devuelve la serie_nueva error es 1 si no quedan disponibles más series MÓDULO Leer_última_matrícula_asignada; Entrada: -Salida: última_matrícula: matrícula Descripción: Busca en el almacén de datos vehículos_matriculados la última matricula asignada. MÓDULO Calcular_matrícula; Entrada: -Salida: matrícula_nueva: matrícula; error: entero Descripción: INICIO última_matrícula = Leer_última_matrícula_asignada(); SI (última_matrícula.número == “9999”) /* Fin de la serie */ ENTONCES { número = “0000”; /* se inicializa el contador de números */ error = Obtener_serie_nueva(última_matrícula.serie, serie_nueva); SI error ==1 ENTONCES emitir_error(“No quedan más series. No se pueden matricular más vehículos”) } SI NO número = incrementar(última_matrícula.número); /* se obtiene el siguiente número dentro de la misma serie*/ SI (error == 0) /* si no hay error devuelve la nueva matrícula */ ENTONCES { matrícula_nueva.número = número; matrícula_nueva.serie = serie_nueva; DEVUELVE matrícula_nueva y error; } SI NO DEVUELVE error; FIN NOTA: Los módulos incrementar y emitir_error son módulos del librería utilizados por el sistema. 8/10 CM fin_series Matrícula Nueva Calcular Matrícula n. error Última matrícula fin_series Número último Leer Última Matrícula Reg. Vehículo Leer de VEHICULOS MATRICULADO S Número nuevo serie nueva Obtener Serie Nueva Comprueba Último Núm. de Serie eof Número serie Incrementar eof Serie Leer de SERIES VÁLIDAS 9/10 Emitir Mensaje de Error Pregunta 8 (1 punto) Construya los casos de prueba utilizando la técnica del camino básico para la siguiente función. typedef struct {int dia,mes} Fecha; int validar_no_caducada (Fecha t, Fecha h) /* Entrada: t, fecha de la tarjeta; h, fecha del día de hoy Salida: 1 si la fecha de la tarjeta es mayor o igual que hoy 0 en otro caso */ { if (t.mes<h.mes) return 0; else if (t.mes==h.mes && t.dia<h.dia) return 0; else return 1; } Solución: int validar_no_caducada (Fecha t; Fecha h) /* Entrada: t, fecha de la tarjeta; h, fecha del día de hoy Salida: 1 si la fecha de la tarjeta es mayor o igual que hoy 0 en otro caso */ 1 2 { if (t.mes<h.mes) return 0; 3 4 5 else if (t.mes==h.mes && t.dia<h.dia) return 0; else return 1;6 } 7 1 2 C1: 1 – 2 – 7 C2: 1 – 3 – 4 – 5 – 7 C3: 1 – 3 – 4 – 6 – 7 C4: 1 – 3 – 6 – 7 3 R1 4 5 6 R2 C1: h=1/2, t=1/1. Devuelve 0; C2: h=2/1, t=1/1. Devuelve 0; C3: h=2/1, t=2/1. Devuelve 1; C4: h=1/1, t=1/2. Devuelve 1; 6 R3 7 R4 10/10