1 / 24

Diseño descendente

Diseño descendente. Programación II 24-25 de febrero de 2009. Algunas citas. “El tiempo que un ser humano necesita para entender un programa aumenta exponencialmente con su longitud” Edsger Dijkstra

ciara
Télécharger la présentation

Diseño descendente

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Diseño descendente Programación II 24-25 de febrero de 2009

  2. Algunas citas • “El tiempo que un ser humano necesita para entender un programa aumenta exponencialmente con su longitud” Edsger Dijkstra • “Dividir cada dificultad que se examina en tantos fragmentos como sea posible y que se requieren para mejorar la solución” René Descartes

  3. Organización de programas • Normalmente un programa lleva miles de líneas de código • Podría poner todo dentro de una función • Sin embargo, hay algunas normas de implementación para mejorar la calidad • En particular, es buena práctica aplicar diseño descendente y descomposición funcional

  4. Programación spaghetti • Lo que uno quiere evitar: • funciones muy largas que cada una realiza varias tareas • programas difíciles a entender para otros programadores • código que no se puede reutilizar con facilidad

  5. 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

  6. 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

  7. Ejemplo: QuickSort accion QuickSort(V: vector de natural, i,d: natural) variable x,y,temp: natural; si (i < d) entonces x  i; temp  V[x]; y  d – 1; V[x]  V[d]; mientras (x < y) hacer V[d]  temp; mientras (V[x] < V[d]) hacer QuickSort(V, i, x-1); x  x + 1; QuickSort(V, x, d); fmientrasfsi mientras (V[y] ≥ V[d]) hacerfaccion y  y - 1; fmientras si (x < y) entonces temp  V[x]; V[x]  V[y]; V[y]  temp; fsi fmientras

  8. Ejemplo: QuickSort accion QuickSort(V: vector de natural, i,d: natural) variable p: natural; si (i < d) entonces p  Particionar(V, i, d); QuickSort(V, i, p-1); QuickSort(V, p, d); fsi faccion

  9. Segundo nivel funcion Particionar(V: vector de natural, i,d: natural) devuelvenatural variable x,y: natural; x  i; y  d – 1; mientras (x < y) hacer mientras (V[x] < V[d]) hacer x  x + 1; fmientras mientras (V[y] ≥ V[d]) hacer y  y - 1; fmientras si (x < y) entonces Intercambiar(V, x, y); fsi fmientras Intercambiar(V, x, d); devuelve x; ffuncion

  10. Tercer nivel accion Intercambiar(V: vector de natural, x,y: natural) variable temp: natural; temp  V[x]; V[x]  V[y]; V[y]  temp; faccion

  11. Diseño descendente QuickSort Particionar Intercambiar

  12. Ejemplo • Escribir un programa que juega a Tres-en-Raya

  13. Idea • Probar todas las posibilidades

  14. Idea • Cada jugador intenta maximizar su resultado • Por lo tanto, escoge el mejor movimiento desde su perspectiva • El tablero es suficientemente pequeño para probar todas las posibilidades

  15. Representación • Representar el tablero por un vector de nueve números naturales • 0: casilla vacía • 1, 2: este jugador ha jugado en la casilla 123 456 789

  16. Acción principal accion TresEnRaya() variable jugador,ganador:natural; T,R:vector de natural; jugador  1; ganador  0; T  InicializarTablero(); MostrarTablero(T); mientras (ganador = 0) hacer R  Mover(jugador,T); T[R[1]]  jugador; MostrarTablero(T); jugador  3 – jugador; ganador  DetectarGanador(T); fmientras MostrarGanador(ganador); faccion

  17. Segundo nivel funcion InicializarTablero() devuelvevector de natural variable i:natural; T:vector de natural; para i  1 hasta 9 hacer T[i] = 0; fpara devuelve T; ffuncion accion MostrarGanador(ganador:natural) si (ganador < 3) entonces Mostrar(“Ha ganado el jugador ” + ganador); sino Mostrar(“Ha sido un empate”); fsi faccion

  18. Segundo nivel accion MostrarTablero(T:vector de natural) variable i,j:natural; para i  1 hasta 3 hacer para j  1 hasta 3 hacer Mostrar(Simbolo(T[3*i + j])); fpara Mostrar(‘\n’); fparafaccion funcion Simbolo(jugador:natural) devuelvecaracter si (jugador = 1) entonces devuelve ‘X’; sinosi (jugador = 2) entonces devuelve ‘O’; sino devuelve ‘ ’; fsiffuncion

  19. Segundo nivel funcion DetectarGanador(T:vector de natural) devuelvenatural variable ganador:natural; ganador  AnalizarFilas(T); ganador  Maximo(ganador, AnalizarColumnas(T)); ganador  Maximo(ganador, AnalizarDiagonales(T)); si (ganador > 0) entonces devuelve ganador; sinosi (TableroLleno(T)) entonces devuelve 3;sino devuelve 0; fsi ffuncion

  20. Tercer nivel funcion AnalizarFilas(T:vector de natural) devuelvenatural variable i:natural; para i  1 hasta 3 hacer si (Iguales(T[3*i-2], T[3*i-1], T[3*i]) y T[3*i] > 0) devuelve T[3*i]; fsi fpara devuelve 0; ffuncion funcion Iguales(a,b,c:natural) devuelvebooleano si (a = b y a = c) entonces devuelvecierto; sino devuelvefalso; fsi ffuncion

  21. Tercer nivel funcion AnalizarColumnas(T:vector de natural) devuelvenatural variable i:natural; para i  1 hasta 3 hacer si (Iguales(T[i], T[i+3], T[i+6]) y T[i] > 0) entonces devuelve T[i]; fsi fpara devuelve 0; ffuncion funcion AnalizarDiagonales(T:vector de natural) devuelvenatural si (Iguales(T[1], T[5], T[9]) y T[1] > 0) entonces devuelve T[1]; sinosi (Iguales(T[3], T[5], T[7]) y T[3] > 0) entonces devuelve T[3]; fsi devuelve 0; ffuncion

  22. Tercer nivel funcion TableroLleno(T:vector de natural) devuelvebooleano variable i:natural; para i  1 hasta 9 hacer si (T[i] = 0) entonces devuelvefalso; fsi fpara devuelvecierto; ffuncion funcion Maximo(a,b:natural) devuelvenatural si (a > b) entonces devuelve a; sino devuelve b; fsi ffuncion

  23. La función Mover funcion Mover(jugador:natural, T:vector de natural) devuelvevector de natural variable i,ganador:natural; res, R:vector de natural; ganador  DetectarGanador(T); si (ganador > 0) entonces devuelve [0, ganador]; fsi res  [0, 0]; para i  1 hasta 9 hacer si (T[i] = 0) entonces T[i]  jugador; R  Mover(3 – jugador, T); T[i]  0; si (R[2] = jugador) entonces devuelve [i, jugador]; sinosi (R[2] = 3 o res[1] = 0) entonces res  [i, R[2]]; fsifsifpara devuelve res; ffuncion

  24. Diseño descendente TresEnRaya InicializarTablero Mover MostrarGanador MostrarTablero DetectarGanador TableroLleno Simbolo Maximo AnalizarFilas AnalizarColumnas AnalizarDiagonales Iguales

More Related