Anda di halaman 1dari 5

Programación I

Práctica 4 Curso 2019/20 1º curso

Arrays bidimensionales y gestión dinámica de memoria

Introducción

En esta práctica seguiremos ción, no sabemos la cantidad


trabajando con las instruccio- de memoria que necesitamos
nes que nos proporciona el para almacenar alguna in-
Objetivos
lenguaje C para codificar la formación. •••
ejecución repetitiva.
Esta forma de gestión de la Esta práctica tiene como
Además, introduciremos los memoria se realiza a través objetivos fundamentales:
arrays con 2 índices, es decir, de los punteros. Estudiare- - Seguir trabajando con las
los llamados arrays bidimen- mos su declaración, su sinta- instrucciones de control de
sionales. xis y su uso. flujo del lenguaje C.
- Empezar a utilizar arrays
Por otra parte, esta práctica Además, aprenderemos la bidimensionales.
nos servirá para introducir el estrecha relación existente - Empezar a utilizar varia-
bles del tipo básico puntero
concepto de gestión dinámica entre los “arrays” y los pun-
en C.
de memoria, utilizada en teros. - Continuar adquiriendo
aquellas situaciones en las destreza en el proceso de
que, en tiempo de compila- desarrollo de programas C.

Planificación

Sesión 4 de laboratorio
• Primera hora:
- Realización de los ejercicios 1 y 2.
• Segunda hora
- Realización de los ejercicios 3 a 5.

Trabajo fuera del aula:


- Terminar los ejercicios no completados en el aula.

1
Control de la ejecución repetitiva

Ejercicio 1(*):
Dibuja el diagrama de flujo y escribe un programa en C que, utilizando el código que has desarrollado
en los ejercicios 4 y 7 de la práctica 2 y los ejercicios 1 y 5 de la práctica 3, tenga el siguiente comporta-
miento:

El programa presentará lo siguiente por pantalla:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ CARTAS +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

A) Dar de alta a un abonado


E) Escribir un mensaje
L) Listar abonados
B) Borrar un mensaje
S) Salir del programa

Elige una opcion:

Cuando se elija alguna de las opciones ‘A’ a ‘B’ se presentará un mensaje indicando la opción seleccio-
nada y se volverá a presentar el menú (sólo el menú, sin la carátula; es decir, sin la caja de guiones alre-
dedor de la palabra “CARTAS”).

Si se introduce la opción ‘S’, el programa debe terminar. Pero, antes, el programa deberá solicitar una
confirmación como la siguiente:

Seguro que desea salir del programa? (s/n):

Si el usuario contesta afirmativamente (‘S’ o ‘s’), se saldrá del programa, y, si contesta negativamente
(‘N’ o ‘n’), se volverá a presentar el menú principal (nuevamente, sin la carátula).

Para trabajar internamente con las opciones del menú, se deben definir y utilizar las siguientes constan-
tes: ALTA, ESCRIBIR, LISTAR, BORRAR y SALIR.

2
Arrays bidimensionales

Los arrays que vimos en la práctica anterior tienen un único índice; sin embargo el tipo array admite
múltiples índices, lo que nos permite mantener tablas multidimensionales.

Concretamente, las tablas bidimensionales (es decir, los arrays con 2 índices) son muy útiles, ya que
nos permiten representar de una forma sencilla matrices de MxN elementos de un determinado tipo
base.

Por ejemplo, para declarar un array, llamado “matriz”, formado por 10x8 enteros (es decir, es una ma-
triz de 10 filas x 8 columnas, cuyo el tipo base es int), lo haríamos con la siguiente instrucción:

int matriz[10][8];

Obviamente, aquí, la indexación requiere de 2 índices.

Por ejemplo, para asignar al 4º elemento de la 7ª fila de dicho array “matriz” el valor de una variable
entera “a“, lo haríamos con la siguiente instrucción:

tabla[6][3] = a;

Recuerda que los índices empiezan en 0.

Ejercicio 2:
Modifica el ejercicio 7 de la práctica 3 para que el programa declare y use un array formado por 5x3
variables de tipo entero.

A continuación el programa deberá almacenar en ese array valores aleatorios entre -10 y +10.

Finalmente el programa deberá mostrar por pantalla, en forma de matriz, los 5x3 valores almacenados.

Por ejemplo, el programa podría mostrar:

-2 4 0
1 2 -3
0 3 -2
-2 4 -9
-4 -2 3

3
Punteros

Gestión dinámica de memoria

Cuando definimos una variable de cualquier tipo, sea básico o estructurado, el compilador se encarga
de reservar el espacio de memoria necesario para almacenar el valor correspondiente.

Sin embargo, existen situaciones en las que no podemos saber la cantidad de memoria que necesitamos
para almacenar alguna información en el momento en que se compila nuestro programa. Por ejemplo,
porque dicha cantidad depende de un dato que introduce el usuario cuando se ejecuta el programa. En
esos casos, debemos reservar la memoria que necesitemos en tiempo de ejecución del programa. Esto es
lo que llamamos gestión dinámica de memoria.

Esta forma de gestión de la memoria se basa en el uso de punteros. Un puntero es una variable que, en
vez de contener el valor de un dato relevante a nivel de aplicación, contiene la dirección de la memoria
que ocupa una determinada información.

Para realizar una gestión dinámica de memoria se utilizan dos funciones básicas:

- malloc(<expresión>): Esta función permite reservar memoria. La expresión debe evaluar a un valor
entero que indicará el número de bytes de memoria que queremos reservar. Si esta función se ejecuta
correctamente devuelve la dirección del primer byte del bloque de memoria reservado (es decir, un
puntero).
- free(<puntero>): Esta función libera un espacio de memoria previamente reservado cuando ya no es
necesario. El puntero apunta a la dirección del comienzo del espacio de memoria que se quiere liberar.

En la expresión utilizada para calcular la cantidad de memoria a reservar se suele utilizar el operador:

- sizeof(<tipo>): devuelve el número de bytes necesarios para almacenar un elemento del tipo indicado.

Ejercicio 3:
Crea un programa en C con el siguiente código. Ejecútalo. Explica los resultados obtenidos.

#include <stdio.h>

int main() {
int a;
int *b;

b = &a;
a = 5;
fprintf (stdout, "a vale: %d\n", a);
*b = 7;
fprintf (stdout, "a vale: %d\n", a);
return 0;
}

4
Arrays y punteros

A modo de ejemplo, para declarar una variable dinámica llamada “tabla”, formada por un número
indeterminado de enteros (es decir, el tipo base es int), lo haríamos con la siguiente instrucción:

int *tabla;

Para reservar tanta memoria dinámica como sea necesaria para almacenar N enteros en dicha variable
“tabla”, lo haríamos con la siguiente instrucción:

tabla = (int *) malloc (N*sizeof(int));

Y, para asignar a una variable entera “a“ el contenido de la variable que ocupa la 7ª posición de dicha
“tabla”, lo podríamos hacer con una de las siguientes instrucciones:

a = tabla[6]; o: a = *(tabla + 6);

Ejercicio 4:
Vamos a modificar el ejercicio 7 de la práctica 3, de manera que utilice gestión dinámica de memoria.

Es decir, en vez de guardar siempre exactamente 5 elementos de tipo entero en un array de 5 enteros,
ahora, cada vez que se ejecute, el programa dejará que sea el usuario el que decida el número de ele-
mentos que se van a guardar.

Para ello, el programa pedirá al usuario que introduzca un valor entero ( N ) entre 1 y 10. El programa
deberá repetir la solicitud anterior hasta que se introduzca un valor correcto (pista: ya tienes el código
que hace esto en el programa que escribiste para el ejercicio 4 de la práctica 3).

Una vez hemos obtenido un valor correcto, el programa deberá reservar dinámicamente memoria para
almacenar N valores de tipo entero (empleando, para ello, la anteriormente mencionada función ma-
lloc()) y almacenará en esa memoria N valores aleatorios entre -10 y +10.

Por último, el programa imprimirá en pantalla los valores almacenados en memoria.

Ejercicio 5:
Escribe un programa que le pida al usuario que introduzca 5 cadenas de caracteres.

A continuación, le pedirá al usuario que introduzca un número entre 1 y 5.

Finalmente, le mostrará por pantalla la cadena introducida en la posición dada por ese número. Es de-
cir, si se da un 3, se mostrará la cadena introducida en la 3ª posición (ojo).

Reflexiona: tal como está planteado el ejercicio, ¿qué tipo de datos es más apropiado para almacenar la
colección de cadenas, un array estático como los de la práctica 3 o un puntero como los de esta práctica?

Anda mungkin juga menyukai