Está en la página 1de 2

SOLUCIÓN AL EJERCICIO 4º (TEMA 6)

MÓDULO ponerBarcoVer:
M. llamador

t',error t,f,c,tam

ponerBarcoVer
1º) ANÁLISIS:
a) Datos de entrada:
 NUMFIL=9. Número de filas del tablero. Dato fijo.
 NUMCOL=9. Número de columnas del tablero. Dato fijo.
 t[1..NUMFIL][1..NUMCOL].ocu: Indicador de si la casilla está o no ocupada por una
porción de barco. Módulo llamador. (t[i][j].ocu є {0,1})
 t[1..NUMFIL][1..NUMCOL].tam: Tamaño del barco del que forma parte la casilla.
Módulo llamador. (si t[i][j].ocu=1, entonces 1 ≤ t[i][j].tam ≤ 4)
 t[1..NUMFIL][1..NUMCOL].pos: Posición que ocupa la porción respecto al barco
completo. Módulo llamador. (si t[i][j].ocu=1, entonces 1 ≤ t[i][j].pos ≤ t[i][j].tam)
 t[1..NUMFIL][1..NUMCOL].dir: Dirección en la que está situado el barco. Módulo
llamador. (si t[i][j].ocu=1, entonces t[i][j].dir є {'H','V'})
 t[1..NUMFIL][1..NUMCOL].des: Indicador de si la porción está o no destruida. Módulo
llamador. (si t[i][j].ocu=1, entonces t[i][j].des є {0,1})
 tam: tamaño del barco. Módulo llamador. (1 ≤ tam ≤ 4)
 f: fila donde se situará el extremo superior del barco. Módulo llamador.
(0 ≤ f ≤ NUMFIL-tam)
 c: columna donde se situará el extremo superior del barco. Módulo llamador.
(0 ≤ c ≤ NUMCOL-1)
b) Datos de salida:
 error: indicador de si alguna de las casillas donde debe situarse el barco está ya ocupada
(1) o no (0). Módulo llamador.
 t'[1..NUMFIL][1..NUMCOL]: tablero actualizado con el nuevo barco situado en
posición vertical. Módulo llamador.
c) Comentarios:
 Suponemos que en algún módulo ascendiente se ha definido lo siguiente:
CONSTANTES
NUMCOL=9
TIPOS
tCasilla = ocu,tam,pos,des:entero
dir:carácter
 Utilizaremos una variable índice para comprobar si las casillas donde debe situarse el
barco están o no ocupadas y, en caso de negativo, colocar el barco.
2º) DISEÑO:
a) Parte declarativa:
ponerBarcoVer(t[][NUMCOL]:tCasilla, tam:entero, f:entero, c:entero, *error:entero)
VARIABLES
i:entero
b) Representación algorítmica:
ponerBarcoVer(t,tam,f,c,error)
BLOCK

i←0 while do *error←t[f+i][c].ocu if then

no(t[f+i][c].ocu) y i<tam-1 i←i+1 no(*error) for do

i ← 0,tam-1,1 BLOCK

t[f+i][c].ocu←1 t[f+i][c].tam←tam t[f+i][c].pos←i+1 t[f+i][c].dir←'V' t[f+i][c].des←0

3º) CODIFICACIÓN:
/****************************************************************/
/*** E J E R C I C I O 4 - T E M A 6 ***/
/*** ***/
/*** Módulo para colocar un barco en posición vertical en el ***/
/*** juego de los barcos. ***/
/****************************************************************/

(...)

#define NUMCOL 9 /* Número de columnas del tablero */

typedef struct
{
int ocu,tam,pos,des;
char dir;
} tCasilla;

(...)

/** ponerBarcoVer(t,tam,f,c,*error) **/


/** Coloca un barco en posición vertical en el tablero situando el extremo **/
/** superior en la fila de índice f y la columna de índice c. **/
/** Devolverá un indicador de si las casillas donde debe situarse el barco **/
/** están ya ocupadas (1) o no (0) y, en caso negativo, el tablero actualizado **/

void ponerBarcoVer(tCasilla t[][NUMCOL],int tam,int f,int c,int *error)


{
int i;

i=0;
while (!t[f+i][c].ocu && i < tam-1)
i=i+1;
*error=t[f+i][c].ocu;
if (!*error) /* ¿Las casillas del nuevo barco están libres? */
for (i=0; i<=tam-1; i=i+1)
{
t[f+i][c].dir='V';
t[f+i][c].ocu=1;
t[f+i][c].pos=i+1;
t[f+i][c].tam=tam;
t[f+i][c].des=0;
}
}

También podría gustarte