1/10 APELLIDOS: NOMBRE: DNI: FIRMA: Pregunta 1 (0,75 puntos

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