Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Funciones Recursivas
Directorio de la Prctica
Cree el subdirectorio precursiva en su directorio de inicio de sesin y sitese en l.
Escriba todos los programas de esta prctica en dicho directorio.
Descarge en dicho directorio el archivo comprimido recursiva.zip y descomprmalo.
Paso de Tablas Bidimensionales como Parmetro
En este ejercicio se practicarn los diferentes mtodos para pasar una tabla multidimensional como parmetro a una funcin. Repase lo relacionado con tablas multidimesionales en el apartado 9.8 de los apuntes de la asignatura, donde podr ver algunos ejemplos
directamente aplicables a esta prctica. En todos los casos deber implementar la funcin
imprimeTabla, dependiendo de cmo se declare dicha funcin.
Ejercicio1
a) En este primer caso se pasan tres parmetros a la funcin: una tabla multimensional
de la que no es necesario especificar su dimensin ms interna (y slo esa) y las
dos dimensiones de la tabla.
/*
Fichero:
**
Autor:
**
Fecha:
**
**
** Descripcion:
**
*/
tablasMultidim1.c
Departamento de Ingeniera Telemtica
5-diciembre-2014
Implementa una funcin que imprime una tabla bidimensional
que se le pasa como parmetro.
/* Includes de la aplicacion */
289
290
/************************************************************/
int main ()
{
char tabla [
{A, B,
{E, F,
{I, J,
{M, N,
{Q, R,
{U, V,
};
TAMV
C,
G,
K,
O,
S,
W,
][ TAMH ] = {
D},
H},
L},
P},
T},
X}
tablasMultidim2.c
Departamento de Ingeniera Telemtica
5-diciembre-2014
Implementa una funcin que imprime una tabla bidimensional
que se le pasa como parmetro.
291
*/
/* Includes del sistema */
#include <stdio.h>
/* Includes de la aplicacion */
/* Definicin de constantes */
#define TAMV 6
#define TAMH 4
TAMV
C,
G,
K,
O,
S,
W,
][ TAMH ] = {
D},
H},
L},
P},
T},
X}
292
tablasMultidim3.c
Departamento de Ingeniera Telemtica
5-diciembre-2014
Implementa una funcin que imprime una tabla bidimensional
que se le pasa como parmetro.
/* Includes de la aplicacion */
/* Definicin de constantes */
#define TAMV 6
#define TAMH 4
TAMV
C,
G,
K,
O,
S,
W,
][ TAMH ] = {
D},
H},
L},
P},
T},
X}
293
return 0;
}
void imprimeTabla( char *tabla, int tamv, int tamh)
{
En este caso, la obtencin del elemento correspondiente a una fila y una columna
deber hacerla la implementacin de la funcin, sabiendo que el tercer elemento
de la primera fila sera el de ndice 2 (recuerde que en C el primer elemento de
cualquier tabla es el de ndice cero), el cuarto elemento de la segunda fila sera
TAMH + 3, ... y, en general, el m elemento de la fila n sera:
(n 1) TAMH + m 1
Repase el primer mtodo del apartado 11.2.4 de los apuntes.
Compile y ejecute el programa tal y como lo ha hecho en las prcticas anteriores.
Hgalo tambin utilizando el makefile proporcionado tecleando:
make -f multidimensionales tablasMultidim3
Resolucin de un laberinto
Se pretende encontrar de forma recursiva un camino de salida en un laberinto.
Vamos a suponer que el laberinto es un recinto rectangular dividido en cuadrados,
estando cada cuadro o bien ocupado por un obstculo (se representa con el carcter #) o
bien libre (carcter .). El permetro del rectngulo est ocupado por obstculos, excepto
en una o ms salidas. Se pretende buscar slamente una salida, aunque pueden existir
varias o ninguna.
La siguiente figura recoge un ejemplo de laberinto:
#
#
#
#
#
#
#
#
#
.
#
.
#
.
.
#
#
.
.
.
#
.
#
#
#
#
.
#
.
.
.
#
#
#
.
.
.
#
.
#
#
#
#
#
.
#
.
#
#
.
.
.
.
#
.
#
#
.
#
#
#
.
.
#
#
.
#
.
#
.
#
#
#
.
#
.
#
.
#
#
#
#
.
.
#
.
.
.
#
#
#
#
#
#
#
#
Comenzamos en alguna posicin (columna , fila) dentro del laberinto que no sea
un obstculo, (es decir, no se puede comenzar en una posicin que contenga el carcter
#), y tenemos que encontrar un camino hasta una de las salidas. Desde una posicin del
laberinto, podemos movernos a las casillas situadas a la derecha, a la izquierda, abajo
o arriba (nunca en diagonal), pero siempre que dicha casilla no est ocupada por un
obstculo.
Se ha encontrado una ruta cuando se llega a una posicin sin obstculo en los lmites
del laberinto.
294
#
*
#
.
#
o
o
#
#
*
*
.
#
o
#
#
#
#
*
#
*
*
*
#
#
#
*
*
*
#
*
#
#
#
#
#
o
#
*
#
#
o
o
o
o
#
*
#
#
o
#
#
#
*
*
#
#
o
#
.
#
*
#
#
#
o
#
.
#
*
#
#
#
#
.
.
#
*
*
*
#
#
#
#
#
#
#
#
A partir de un determinado punto de comienzo, puede ser que no exista ruta de salida.
En el laberinto anterior, si el punto de comienzo es el (10, 2) no existe ruta de salida.
Ejercicio 2
Realizar un programa que permita obtener la solucin a un laberinto mediante una funcin recursiva de nombre encuentraRuta. A continuacin se proporciona el diagrama de flujo de una posible solucin a dicha funcin:
295
296
salas@318CDCr12:$ ./laberinto1
Numero incorrecto de parametros.
salas@318CDCr12:$ ./laberinto1 1 2 3
Numero incorrecto de parametros.
salas@318CDCr12:$ ./laberinto1 12 15
El punto (12, 15) no pertenece al laberinto.
salas@318CDCr12:$ ./laberinto1 2 4
El punto (2, 4) es un obstaculo.
salas@318CDCr12:$ ./laberinto1 10 2
No existe salida desde el punto (10, 2).
salas@318CDCr12:$ ./laberinto1 2 1
############
#o*###oooo##
##***#o###.#
#..#*#o#...#
###**oo#####
#oo*###****#
#o#*****##*#
##########*#
salas@318CDCr12:$
Ejercicio 3
Realice una modificacin del programa anterior (laberinto2.c) para que la solucin
presentada por pantalla slo recoja la solucin final, y no los diferentes intentos que han
sido necesarios hasta llegar a dicha solucin.
Modifique tambin el archivo Makefile para que la compilacin de esta segunda versin tambin se realice por defecto (regla todo), es decir, al invocar al comando make deben compilarse automaticamente laberinto1 y laberinto2. Tambin
incluya en el archivo Makefile, una regla borra que elimine los dos ejecutables
(laberinto1 y laberinto2) as como todos los archivos objeto.
El siguiente es un ejemplo de ejecucin del programa dado el siguiente laberinto:
############
#..###....##
##...#.###.#
#..#.#.#...#
###....#####
#...###....#
#.#.....##.#
##########.#
297
salas@318CDCr12:$ ./laberinto2
Numero incorrecto de parametros.
salas@318CDCr12:$ ./laberinto2 1 2 3
Numero incorrecto de parametros.
salas@318CDCr12:$ ./laberinto2 12 15
El punto (12, 15) no pertenece al laberinto.
salas@318CDCr12:$ ./laberinto2 2 4
El punto (2, 4) es un obstaculo.
salas@318CDCr12:$ ./laberinto2 10 2
No existe salida desde el punto (10, 2).
salas@318CDCr12:$ ./laberinto2 2 1
############
#.*###....##
##***#.###.#
#..#*#.#...#
###**..#####
#..*###****#
#.#*****##*#
##########*#
salas@318CDCr12:$
Entrega
Deber entregar un fichero practica09.zip que contenga un nico directorio precursiva
en el que se ubiquen los siguientes ficheros fuente (y slo stos):
multidim1.c
multidim2.c
multidim3.c
Makefile
encruta1.h
encruta1.c
laberinto1.c (cdigo fuente) y laberinto1.dia (diagrama de flujo).
laberinto2.c (cdigo fuente) y laberinto2.dia (diagrama de flujo).