Las tablas
Objetivos del capítulo
Desarrollar aplicaciones que utilizan tablas.
Presentar la noción de dirección de memoria antes de abordar los punteros en el capítulo siguiente.
Presentación de las tablas
Una tabla es un conjunto repetitivo de variables del mismo tipo.
La declaración int tab[3]; reserva tres enteros en memoria:
int main()
{
int tab[3];
A cada uno de los enteros (decimos cada celda) se accede con un número (índice o número de la celda) entre corchetes.
Atención, la primera celda lleva el número 0.
Las tres instrucciones:
tab[0] = 5;
tab[1] = 15;
tab[2] = 10;
introducen valores en las tres variables:
A continuación se muestra un programa que permite visualizar algunas celdas de la tabla:
printf("tab[1] = %d\n\n", tab[1]);
printf("tab[0] = %d\n\n", tab[0]);
Preste atención: las siguientes instrucciones muestran que C no controla los desbordamientos de las tablas. Podemos mostrar un valor fuera de la tabla, incluso modificarlo. Hay que estar muy atentos.
printf("tab[-1] = %d\n", tab[-1]);
tab[-1] = 17;
printf("tab[-1] = %d\n\n", tab[-1]);
Para terminar, la siguiente instrucción muestra dos veces el valor de tab. Es un valor numérico mostrado bajo dos formas (%d para una visualización decimal y %p para una visualización hexadecimal). tab es la dirección de la tabla en memoria.
La dirección...
Ejemplos de utilización de tablas
1. Tabla de una dimensión
El objetivo del siguiente ejemplo es calcular la media de 10 notas introducidas por el teclado. El programa muestra la media y el número de notas superiores a la media.
t[10]: tabla de 10 enteros.
i: índice de recorrido de la tabla (número de celda).
suma: suma de las notas de la tabla.
media: media de las 10 notas.
numero: número de notas superiores a la media.
int main()
{
int i;
int suma;
float media;
int numero;
int t[10];
Introducir las 10 notas:
for (i = 0; i < 10; i++)
{
printf("Escriba la nota numero %d: ", i+1);
scanf("%d", &t[i]);
}
&t[i] es la dirección de la celda t[i].
Cálculo de la suma de las notas y después de la media:
suma = 0;
for (i = 0; i < 10; i++)
{
suma += t[i];
}
media = (float) suma / 10;
printf("\n\nMedia de las notas: %6.2f\n", media);
Búsqueda del número de notas superiores a la media:
numero...
Dirección de una tabla y de sus celdas (operadores * y &)
1. Tabla de una dimensión
int main()
{
int tab[3] = {5, 15, 10};
Las siguientes instrucciones muestran el contenido de las tres celdas:
printf("tab[0] = %d\n", tab[0]);
printf("tab[1] = %d\n", tab[1]);
printf("tab[2] = %d\n\n", tab[2]);
Las siguientes instrucciones muestran la dirección de las tres celdas:
tab es la dirección de la tabla, es decir, la dirección de la primera celda de la tabla: tab[0].
tab + 1 es la dirección del entero siguiente.
Se observa que estas direcciones aumentan de 4 en 4 porque tab contiene enteros (4 bytes).
printf("tab = %p\n", tab);
printf("tab + 1 = %p\n", tab + 1);
printf("tab + 2 = %p\n\n", tab + 2);
Visualización de los valores contenidos en las direcciones indicadas.
*(tab + 1) significa: el valor contenido en la dirección tab + 1. Es el equivalente de tab[1].
printf("*tab = %d\n", *tab);
printf("*(tab + 1) = %d\n", *(tab + 1));
printf("*(tab + 2) = %d\n\n", *(tab + 2));
Visualización de las direcciones de las celdas indicadas....
Trabajo práctico: tabla
1. Tema
El objetivo de estos ejercicios es escribir los algoritmos de recuento y búsqueda en una tabla.
Ejercicio 1
Escribir un programa que cuente el número de veces que un valor (introducido por el teclado), está presente en una tabla (inicializada en el programa).
Ejercicio 2
Escribir un programa que indique si un valor (introducido por el teclado) se presenta en una tabla (inicializada en el programa).
Ejercicio 3
El objetivo es el mismo que en el ejercicio 2, pero con la búsqueda del valor en una tabla ordenada en orden creciente.
2. Tablas: proposición de corrección
a. Ejercicio 1
tabla: tabla de enteros.
i: índice de recorrido de la tabla.
valor: valor que hay que buscar en la tabla.
numero: número de veces que el valor está en la tabla.
int main()
{
int tabla[10] = {1, 3, 8, 5, 14, 3, 3, 5, 12, 7};
int i;
int valor;
int numero;
printf("se encuentra en la tabla");
scanf("%d", &valor);
El recuento hace necesario el recorrido completo de la tabla, de ahí la utilización del bucle for.
numero = 0;
for (i = 0; i < 10; i++)
{
if (tabla[i]...
Trabajo práctico: ordenación de una tabla
1. Tema
El objetivo de este ejercicio es escribir los algoritmos de ordenación de las tablas.
Escribir un programa que ordene una tabla de ocho celdas que contiene enteros.
2. Ordenación de tablas: proposición de corrección
a. Ordenación por el algoritmo de selección/cambio
Variables utilizadas |
|
|
tab |
tabla de ocho celdas. |
|
i |
índice para el examen de cada celda de la tabla. |
|
permut |
variable intermedia para la permutación de dos celdas. |
|
iter |
número de iteración. |
|
pp |
índice más pequeño de las celdas de la tablas. |
|
Principio de la solución |
||
Iteración número 1: iter = 0; |
||
Buscar la celda más pequeña de la tabla. |
||
Sea pp el índice de este elemento. |
Intercambiar esta celda (pp) con la primera celda (iter).
Después de la permutación, todas las celdas de la tabla hasta la celda iter están ordenadas. Cuando las 7 primeras celdas están ordenadas, la octava también lo está forzosamente; 7 iteraciones son suficientes para ordenar la tabla.
Volver a comenzar (iter = 1), buscando el elemento más pequeño a partir de iter. Intercambiar.
Volver a comenzar siete veces…
Enfoque estructurado
-
Se repite siete veces el recorrido de la tabla.
Es la estructura repetitiva (inicio recorrido - fin recorrido).
-
El recorrido de la tabla consiste en examinar cada celda.
Es una repetición sobre las celdas (inicio celda - fin celda).
-
Para cada celda, miramos si es más pequeña (tratamiento <) o no (tratamiento >=) que la más pequeña ya encontrada.
Es una alternativa.
De ahí el siguiente organigrama:
Ordenación por selección/cambio: programa
int main()
{
int tab[8] = {5, 15, 10, 12, 3, 1, 6, 2};
int iter;
int pp;
int i;
int permut;
Visualización...
Trabajo práctico: triángulo de Pascal
1. Objetivo
Formar una tabla que contenga el triángulo de Pascal.
El triángulo de Pascal es bien conocido por los matemáticos. Cada fila de la tabla contiene 1 en la primera columna y 1 para las celdas situadas en la diagonal (celdas cuyo índice de fila es igual al índice de la columna). El resto de las celdas de una fila se calculan a partir de la fila anterior. La celda de la columna col de la fila fila es igual a la suma de la columna col y de la columna col - 1 de la fila fila - 1.
2. Tema
Mostrar las n primeras filas del triángulo de Pascal.
(n es un número inferior o igual a 16 introducido por el teclado).
Principio
En la tabla tab, la celda col de la fila fila se calcula a partir de la fila fila - 1 de la siguiente manera:
tab[fila][col] = tab[fila - 1][col] + tab[fila - 1][col - 1]
3. Triángulo de Pascal: proposición de corrección
Triángulo de Pascal: solución que utiliza una tabla de dos dimensiones
tab: tabla de dos dimensiones.
fila, col: índices de fila y de columna de la tabla.
numl: número de filas que se han de mostrar.
int main()
{
int tab[16][16];
int fila,col;
int numl;
printf("Escriba el número de fila(s) de la tabla: ");
scanf("%d"...