diseño descendente

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

Upload: ciara

Post on 06-Jan-2016

52 views

Category:

Documents


0 download

DESCRIPTION

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 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Diseño descendente

Diseño descendente

Programación II

24-25 de febrero de 2009

Page 2: Diseño descendente

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

Page 3: Diseño descendente

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

Page 4: Diseño descendente

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

Page 5: Diseño descendente

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

Page 6: Diseño descendente

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

Page 7: Diseño descendente

Ejemplo: QuickSortaccion 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);

fmientras fsi

mientras (V[y] ≥ V[d]) hacer faccion

y y - 1;fmientras

si (x < y) entonces

temp V[x];V[x] V[y];V[y] temp;

fsi

fmientras

Page 8: Diseño descendente

Ejemplo: QuickSortaccion 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);

fsifaccion

Page 9: Diseño descendente

Segundo nivelfuncion Particionar(V: vector de natural, i,d: natural) devuelve natural

variable x,y: natural;x i;y d – 1;mientras (x < y) hacer

mientras (V[x] < V[d]) hacerx x + 1;

fmientrasmientras (V[y] ≥ V[d]) hacer

y y - 1;fmientrassi (x < y) entonces

Intercambiar(V, x, y);fsi

fmientrasIntercambiar(V, x, d);devuelve x;

ffuncion

Page 10: Diseño descendente

Tercer nivelaccion Intercambiar(V: vector de natural,

x,y: natural)

variable temp: natural;

temp V[x];V[x] V[y];V[y] temp;

faccion

Page 11: Diseño descendente

Diseño descendente

QuickSort

Particionar

Intercambiar

Page 12: Diseño descendente

Ejemplo

• Escribir un programa que juega a Tres-en-Raya

Page 13: Diseño descendente

Idea

• Probar todas las posibilidades

Page 14: Diseño descendente

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

Page 15: Diseño descendente

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

1 2 34 5 67 8 9

Page 16: Diseño descendente

Acción principalaccion 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);

fmientrasMostrarGanador(ganador);

faccion

Page 17: Diseño descendente

Segundo nivelfuncion InicializarTablero() devuelve vector de natural

variable i:natural; T:vector de natural;

para i 1 hasta 9 hacerT[i] = 0;

fparadevuelve T;

ffuncion

accion MostrarGanador(ganador:natural)si (ganador < 3) entonces

Mostrar(“Ha ganado el jugador ” + ganador);sino

Mostrar(“Ha sido un empate”);fsi

faccion

Page 18: Diseño descendente

Segundo nivelaccion MostrarTablero(T:vector de natural)

variable i,j:natural;para i 1 hasta 3 hacer

para j 1 hasta 3 hacerMostrar(Simbolo(T[3*i + j]));

fparaMostrar(‘\n’);

fpara faccion

funcion Simbolo(jugador:natural) devuelve caractersi (jugador = 1) entonces

devuelve ‘X’;sino si (jugador = 2) entonces

devuelve ‘O’;sino

devuelve ‘ ’;fsi ffuncion

Page 19: Diseño descendente

Segundo nivelfuncion DetectarGanador(T:vector de natural) devuelve natural

variable ganador:natural;ganador AnalizarFilas(T);ganador Maximo(ganador, AnalizarColumnas(T));ganador Maximo(ganador, AnalizarDiagonales(T));si (ganador > 0) entonces

devuelve ganador;sino si (TableroLleno(T)) entonces

devuelve 3;sino

devuelve 0;fsi

ffuncion

Page 20: Diseño descendente

Tercer nivelfuncion AnalizarFilas(T:vector de natural) devuelve natural

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];

fsifparadevuelve 0;

ffuncion

funcion Iguales(a,b,c:natural) devuelve booleanosi (a = b y a = c) entonces

devuelve cierto;sino

devuelve falso;fsi

ffuncion

Page 21: Diseño descendente

Tercer nivelfuncion AnalizarColumnas(T:vector de natural) devuelve natural

variable i:natural;para i 1 hasta 3 hacer

si (Iguales(T[i], T[i+3], T[i+6]) y T[i] > 0) entoncesdevuelve T[i];

fsifparadevuelve 0;

ffuncion

funcion AnalizarDiagonales(T:vector de natural) devuelve naturalsi (Iguales(T[1], T[5], T[9]) y T[1] > 0) entonces

devuelve T[1];sino si (Iguales(T[3], T[5], T[7]) y T[3] > 0) entonces

devuelve T[3];fsidevuelve 0;

ffuncion

Page 22: Diseño descendente

Tercer nivelfuncion TableroLleno(T:vector de natural) devuelve booleano

variable i:natural;para i 1 hasta 9 hacer

si (T[i] = 0) entoncesdevuelve falso;

fsifparadevuelve cierto;

ffuncion

funcion Maximo(a,b:natural) devuelve naturalsi (a > b) entonces

devuelve a;sino

devuelve b;fsi

ffuncion

Page 23: Diseño descendente

La función Moverfuncion Mover(jugador:natural, T:vector de natural) devuelve vector de natural

variable i,ganador:natural; res, R:vector de natural;

ganador DetectarGanador(T);si (ganador > 0) entonces

devuelve [0, ganador];fsires [0, 0];para i 1 hasta 9 hacer

si (T[i] = 0) entoncesT[i] jugador;R Mover(3 – jugador, T);T[i] 0;si (R[2] = jugador) entonces

devuelve [i, jugador];sino si (R[2] = 3 o res[1] = 0) entonces

res [i, R[2]];fsi fsi fpara

devuelve res;ffuncion

Page 24: Diseño descendente

Diseño descendenteTresEnRaya

MostrarTablero

Mover

DetectarGanador

InicializarTablero

MostrarGanador

TableroLleno

AnalizarDiagonalesAnalizarColumnasAnalizarFilas

Simbolo

Iguales

Maximo