Programación II 3-4 de marzo de 2009 Diseño descendente Programación II 3-4 de marzo de 2009
Descomposición funcional Descomponer un programa en funciones más sencillas Cada función resuelve una sola tarea Cada tarea es claramente diferenciada de las otras tareas Ayuda en la comprensión del programa Facilita la reutilización de código
Diseño descendente Empezar por el problema a resolver Diseñar una solución intuitiva sin especificar detalles Esta solución representa el primer nivel de abstracción Complementar detalles con funciones de segundo nivel (descender un nivel) Continuar hasta llenar todos los detalles
Secuencia Estructura de datos secuencial Funciones: LeerPrimerElemento(L, e); LeerSiguienteElemento(L, e); UltimoElemento(L); InicializarSecuencia(L); EscribirElemento(L, e);
Ejercicio Contar el número de veces que aparece la primera palabra en un texto acabado en punto “lo que sabemos es una gota de agua; lo que ignoramos es el océano.” (Isaac Newton) “lo” aparece 2 veces Suponer que el texto está representado por una secuencia de caracteres
Problema de las ocho reinas Situar ocho reinas en un tablero de ajedrez sin que se amenacen entre sí
Idea Idea: para cada columna, encontrar la primera fila no amenazada Situar una reina allí Continuar con la próxima columna Si encontramos una columna sin posibilidades, dar vuelta atrás (backtrack) Probar la siguiente fila posible
Ejemplo
Algoritmo accion OchoReinas() pos:vector (dim 8) de natural; Situar(1, pos); faccion pos: posición de la reina en cada columna
Segundo nivel accion Situar(col:natural, pos:vector de natural) variable fila:natural; si (col > 8) entonces Mostrar(pos); sino fila ProximaFila(0, col, pos); mientras (fila ≤ 8) hacer pos[col] fila; Situar(col + 1, pos); fila ProximaFila(fila, col, pos); fmientras fsi faccion
Tercer nivel accion Mostrar(pos:vector de natural) variable i:natural; para i 1 hasta 8 hacer Mostrar(pos[i]); fpara Mostrar(‘\n’); faccion
Tercer nivel funcion ProximaFila(fila,col:natural, pos:vector de natural) devuelve natural fila fila + 1; mientras (fila ≤ 8 y Amenazado(fila,col,pos)) hacer fmientras devuelve fila; ffuncion
Detectar amenazas
Cuarto nivel funcion Amenazado(fila,col:natural, pos:vector de natural) devuelve booleano variable i:natural; para i 1 hasta (col-1) hacer si ((pos[col-i] = fila-i) o (pos[col-i] = fila) o (pos[col-i] = fila+i)) entonces devuelve cierto; devuelve falso; faccion
Diseño descendente OchoReinas Situar Mostrar ProximaFila Amenazado
Pista de Carreras Estructura del código de la práctica 3 3023 líneas de código 51 funciones 19 archivos
main (p2Main.c) Leer los parámetros de la línea de comanda Llamar a la función StartGame con la pista y las estrategias Mostrar el ganador
StartGame (p2Game.c) Crear e inicializar las estructuras de datos Crear la matriz de adyacencia Repetir hasta finalizar el juego: Seleccionar el movimiento de un jugador Mostrar la pista Comprobar si el juego ha finalizado Liberar la memoria
CreateAdjacencyMatrix Diseño descendente main StartGame FreeMatrix ReadMatrix DisplayRaceTrack CreateAdjacencyMatrix MoveCar IsGameOver
Resumen Algoritmos de búsqueda y de ordenación Recurrencia Complejidad Diseño descendente