Documentos de Académico
Documentos de Profesional
Documentos de Cultura
7 Tablas
7 Tablas
Introducción
Podríamos hacer una primera clasificación de los tipos de datos que maneja un ordenador:
tipos de datos simples y tipos de datos compuestos.
*Simples: son aquellos que sirven para representar información de tipos elementales
como por ejemplo números enteros, reales o información de tipo carácter. Son los que hemos
estudiado hasta este momento.
*Compuestos: son conjuntos de datos simples relacionados entre sí de alguna forma.
Dentro de los tipos de datos compuestos, podremos hablar de estáticos y de dinámicos. En los
primeros el tamaño de los datos está prefijado al iniciar el programa. En los segundos el
tamaño de los datos puede variar durante la ejecución del programa.
Definición
En este apartado vamos a introducir una estructura compuesta: las tablas, y en concreto las de
carácter monodimensional (una dimensión). Más adelante estudiaremos las tablas
multidimensionales (más de una dimensión).
Definimos tabla como un conjunto finito y ordenado de elementos homogéneos. Las tablas
también reciben el nombre de matrices o arrays.
En las tablas monodimensionales los elementos están ordenados desde el primero hasta el
último, pudiendo acceder a los mismos mediante un índice que indica su posición.
Una tabla se identifica por un nombre. Si especificamos dicho nombre sin hacer referencia al
índice nos estaremos refiriendo a la tabla entera, no a alguno de sus elementos.
-1-
TABLAS AULA MENTOR
El índice de una tabla podrá variar desde el límite inferior hasta el superior, que se especifican
en la definición de la tabla. Estos límites deberán ser constantes, y por lo tanto el tamaño de la
tabla esta fijado en el momento de la compilación.
Las tablas se utilizan para facilitar el acceso a información que puede ser agrupada siguiendo
algún concepto lógico de agrupación, y que además sea información homogénea, por ejemplo:
-Las notas de un conjunto de alumnos: todas son del mismo tipo, reales, y podemos tener a los
alumnos ordenados alfabéticamente.
-Los precios de los productos de una tienda: son todos del mismo tipo, y pueden ser ordenados
por el número de referencia.
-Las medidas de un termómetro, o cualquier tipo de sensor o alarma, a lo largo del día: todas
las medidas serán del mismo tipo, y pueden ser ordenadas por la hora en que fueron tomadas.
Definición
Para definir una tabla en Pascal se utiliza la palabra reservada array. Además necesitamos
conocer:
Se pueden definir directamente variables de tipo tabla o utilizar la sección de tipos definidos
por el usuario:
Type
lecturas = array[1..24] of integer; (* tipo base: integer *)
-2-
TABLAS AULA MENTOR
Var
temperaturas : lecturas; (* Almacena temperaturas cada hora *)
humedad : lecturas; (* Almacena humedad cada hora *)
medias: array[1..31] of real;
i: integer;
Definimos en la sección Type un tipo definido por el usuario de nombre lecturas, que será una
tabla de 24 valores de tipo entero. Una vez definido este tipo lecturas, podremos usarlo en las
definiciones de variables como cualquier tipo básico. Es lo que encontramos a continuación:
la definición de dos variables, temperatura y humedad de ese tipo.
En la misma sección definimos otra tabla de nombre medias, que almacena 31 valores de tipo
real. Observe la notación para especificar el valor inicial y final de los índices, encerrados
entre corchetes y separados por dos puntos.
Utilización
temperaturas[7] := 25;
media := (temperaturas[7] + temperaturas[8]) / 2;
Tablas y bucles
Lo que hace realmente útil y potente a las tablas es la posibilidad de usarlas en bucles, en los
que la variable de control se utiliza al mismo tiempo como índice de acceso a los elementos de
la tabla:
end;
-3-
TABLAS AULA MENTOR
En este bucle se solicita al usuario que vaya introduciendo las temperaturas medidas a lo largo
del día. Y para ello aprovecha la variable de control (o índice) para acceder a los distintos
elementos de la tabla temperatura.
Tablas y módulos
Los módulos (funciones y procedimientos) pueden recibir como parámetros tablas. Siguiendo
los ejemplos anteriores, observe esta función que recibe como parámetro una tabla (del tipo
lecturas) y devuelve como resultado de la función la media de las medidas realizadas.
Para calcular la media de un conjunto de valores se suman todos los valores, y la suma total se
divide por el número de valores. Para ello necesitamos una variable que acumule la suma, e
iniciarla antes del bucle a cero.
No es posible en Pascal que una función devuelva como resultado de la función una tabla. Por
lo tanto la única manera de modificar una tabla dentro de una función o procedimiento es
pasarla por referencia. Puede repasar como se usan los parámetros por referencia o consultar
el tema de subprogramas.
Observe la siguinte función Lectura: se solicita al usuario que vaya tecleando los 24 valores de
temperatura y se van almacenando en los elementos de la tabla, que se ha pasado por
referencia. Y de nuevo utilizamos la variable de control del bucle como índice de los
elementos de la tabla.
-4-
TABLAS AULA MENTOR
readln(medidas[i]);
end;
End;
Existe otra limitación: es necesario definir un tipo de datos definido por usuario (sección
Type) que se corresponda con la tabla antes de definir la función y usarla como parámetro. La
siguiente definición sería errónea:
(* *)
(* !!!!!!!!!!!! Este procedimiento no compila !!!!!!!!!!!!!!! *)
(* *)
Procedure Lectura(VAR medidas: array[1..24] of integer);
Var
i: integer;
Begin
writeln('Introduzca los valores(01:00 hasta 24:00');
for i:= 1 to 24 do
begin
write('Medida a las ', i, ': ');
readln(medidas[i]);
end;
End;
Será necesario definir primero un tipo de datos que se corresponda con esa tabla y usar el
identificador de ese tipo creado por el usuario en el procedimiento:
Type
lecturas = array[1..24] of integer;
Antes de continuar, estudiemos ejemplos de uso de tablas y funciones. Vamos a analizar una
función que calcula la media de todos los valores de una tabla.
-5-
TABLAS AULA MENTOR
Begin
(* Como no conocemos los valores de la tabla *)
(* suponemos que el primer valor es el max. *)
max := medidas[1];
(* Recorremos el resto de la tabla comprobando *)
for i:= 2 to 24 do (* si hay algún valor mayor en la tabla *)
if max < medidas[i] then
max := medidas[i]; (* si lo hay, es nuestro nuevo máximo *)
Maximo := max;
End;
*La tabla medidas se pasa por valor: no hay que modificarla, sólo consultarla.
*Se supone que el máximo es el primero elemento de la tabla.
*A continuación se recorre el resto de la tabla. En el caso que algún valor sea mayor que le
primero, será nuestro nuevo máximo.
*La última sentencia de la función es una sentencia de asignación. Recuerde: se le asigna al
nombre de la función el valor que deseamos que devuelva la función.
Repase todas estas funciones, y algunas más, en el programa tablas.pas. Observe que si
compila este ejemplo recibirá unos mensajes de aviso o atención, llamados warnings o avisos
que puede observar en la siguinte figura:
Nos avisa que hemos definido variables que luego no se utilizan en el código. Esto es debido a
que dentro de este programa hemos conservado la versión inicial para que compare como se
va mejorando y haciendo modular un programa.
-6-
TABLAS AULA MENTOR
Antes vamos a detenernos en un tipo muy particular de tabla monodimensional: las tablas de
caracteres, llamadas cadenas de caracteres. Las cadenas de caracteres no son más que tablas
unidimensionales cuyo tipo base es char. Para facilitar su uso en Pascal se utiliza el tipo de
datos string.
Definición
type
var
nombre = cadena40;
direccion = cadena80;
descripcion = cadena;
apellidos = string[50];
Como podemos observar es posible definir un tipo de datos string en la sección Type. O
definir variables de este tipo usando la palabra string directamente en la definición de la
variable.
En este tipo no se define el valor inicial y final de la tabla: sólo se define el tamaño. El valor
inicial se supone siempre que es uno (1). Luego el tipo cadena40 significa que tenemos una
tabla de 40 caracteres, y el índice varía desde 1 hasta 40.
Acceso
Se puede acceder a los elementos de una cadena de caracteres de forma individual como en las
tablas, o hacer asignaciones directas utilizando el nombre de la variable:
-7-
TABLAS AULA MENTOR
readln(descripcion);
writeln(nombre);
Se puede observar que no siempre utilizamos todas las posiciones de una cadena. Por lo tanto
existen dos tamaños a utilizar cuando trabajamos con cadenas de caracteres o strings:
Limitaciones
En el tipo string existen limitaciones similares a las tablas: no es posible que una función
devuelva como resultado una cadena ni definir este tipo de datos en la cabecera de un módulo.
Por otra parte, los índices de las tablas pueden ser de cualquier tipo ordinal: enteros, carácter,
subrango, etc. Estudie el siguiente ejemplo, donde el índice de la tabla es de tipo carácter.
Se trata de solicitar al usuario una cadena de caracteres por pantalla y contar el número de
repeticiones de las distintas letras:
-8-
TABLAS AULA MENTOR
long := ord(cadena[0]);
(* La longitud lógica de una cadena se *)
(* almacena en el elemento 0 *)
Intente mejorar este programa, creando procedimientos que hagan el cálculo de ocurrencias y
la presentación por pantalla de los resultados.
(*
Tema 7: Tablas
*)
Program TablasLetras;
Var
i: integer; (* Var. auxiliar para bucles *)
long: integer; (* Longitud lógica de la cadena *)
l: char; (* Var. auxiliar para bucles *)
cadena: string; (* Var. que lamacena la cadena *)
(* Modulo principal *)
begin
write('Introduzca una cadena de muestra: ');
readln(cadena);
-9-
TABLAS AULA MENTOR
(* almacena en el elemento 0 *)
end.
Tablas Multidimensionales
type
var
- 10 -
TABLAS AULA MENTOR
El acceso a los elementos de una tabla mutidimensional se hace especificando un índice para
cada dimensión, separados estos por comas dentro de los corchetes:
for i:=1 to 10 do
for j :=1 to 10 do
total := total + valor[i,j];
Es muy frecuente utilizar tablas de dos dimensiones para representar variables que son
funciones de dos parámetros distintos.
Esto es lo que se representa en la siguiente figura: tres filas por cinco columnas. En las
posiciones de las tablas hemos representado los índices necesarios para acceder a cada
elemento de al tabla.
*Gastos mensuales clasificados por tipo de gastos: una dimensión puede representar los meses
y otra el tipo de gastos.
- 11 -
TABLAS AULA MENTOR
Ejemplo: ventas
Estudie el siguiente programa: intentamos que una tabla refleje las ventas por meses y por
zonas de varios agentes comerciales.
Necesitamos una tabla bidimensional: las filas representan los meses y las columnas las zonas.
Type
ventas = array[1..2, 1..4] of real;
(* Tabla para almacenar las ventas mensuales en cada región *)
(* Tenemos 12 meses (1..12) y 4 regiones (1..4) *)
Var
i: integer; (* Var. auxiliar para contadores *)
- 12 -
TABLAS AULA MENTOR
A continuación nuestro programa solicita al usuario los datos por meses y por zonas. Par ello
debe recorrer la tabla por filas y columnas. Es necesario un bucle que recorra las filas. Para
cada iteración de este bucle necesitamos un bucle interior que vaya recorriendo las columnas
de esa fila.
(* Observe: para "llenar" la tabla bidimensional necesitamos dos bucles for anidados. El
primero o exterior recorre las filas, y el segundo o interior recorre las columnas *)
end;
end;
Un bucle similar se utiliza para presentar los valores de la tabla por pantalla. El código
completo lo puede encontrar en tablasmulti_01.pas.
Pero esta es simplemente nuestra primera versión. Posiblemente tengamos varios vendedores,
y no sería muy elegante ni eficaz repetir los bucles de lectura y escritura anteriores para cada
uno ellos. Es necesario crear un procedimiento genérico para la lectura y otro para la escritura.
A estos habrá que pasarles como parámetro la tabla que queremos actualizar o presentar por
pantalla.
Además, a las funciones de lectura y escritura le vamos a pasar como parámetro una cadena de
caracteres para avisar al usuario del comercial del que se trata.
i,j: integer;
- 13 -
TABLAS AULA MENTOR
begin
(* Observe: para "llenar" la tabla bidimensional necesitamos dos bucles for
anidados. El primero o exterior recorre las filas, y el segundo o interior recorre
las columnas *)
end;
end;
end;
Observe que:
La tabla de ventas se pasa por valor o referencia.
Se le pasa también una cadena de caracteres para ayudar a la presentación por pantalla, y
almacenará el nombre del vendedor.
Se usa como límite del bucle más externo las constantes Enero y Diciembre, definidas como 1
y 12 en la zona de constantes.
Pero además de la legibilidad hemos conseguido que leer y presentar las ventas de cualquier
otro vendedor sea inmediato:
- 14 -
TABLAS AULA MENTOR
Y ahora seguramente querrá hacer algo con los datos de ventas, como por ejemplo calcular el
máximo de ventas de cada vendedor. Vamos a implementar una función que reciba los datos
de ventas de un empleado y devuelva el máximo de dichas ventas.
(* Calcula el máximo de ventas (en todos los meses y en todas las zonas de un empleado que
se le pasa como parámetro por valor *)
max: Real;
i,j: integer;
begin
max := -1.0;
for i:= Enero to Diciembre do (* recorre filas: Enero hasta Diciembre *)
begin
max := empleado[i,j];
end;
max_ventas := max;
end;
writeln('Maximos de ventas');
writeln('Cesar: ', max_ventas(Cesar):0:1);
writeln('Jesus: ', max_ventas(Jesus):0:1);
- 15 -
TABLAS AULA MENTOR
A partir de aquí las posibilidades son infinitas. Por ejemplo el tipo base de las tablas no tiene
por que ser un tipo básico: puede ser un tipo definido por el usuario. De esta forma las
posibilidades se multiplican, sobre todo cuando estudiemos en el tema siguiente los registros.
Vamos a proponer un nuevo cambio: crear una tabla unidimensional, donde cada uno de los
elementos sea una tabla del tipo ventas.
Type
ventas = array[Enero..Diciembre, 1..NumZonas] of real;
(* Tabla para almacenar las ventas mensuales en cada región *)
(* Tenemos 12 meses (1..12) y 4 regiones (1..4) *)
Var
plantilla: vendedores;
De esta forma no tendremos que modificar los procedimientos creados, sólo las llamadas o
invocaciones a estos procedimientos. Si a las funciones de los ejemplos anteriores se le pasaba
como parámetro una tabla del tipo ventas, ahora le pasaríamos como parámetro un elemento
de la tabla vendedores. Cada uno de estos elementos es del tipo ventas.
Las llamadas a las funciones de lectura y escritura del módulo principal quedarían de la
siguiente forma:
Y podremos crear una función que a partir de lo anterior calcule el máximo de todos los
vendedores, aprovechando que ya tenemos una función que calcula el máximo de un
vendedor:
- 16 -
TABLAS AULA MENTOR
max := -1.0;
for i:= 1 to NumEmple do
if max_ventas(empleados[i]) > max then
max := max_ventas(empleados[i]);
max_todos := max;
end;
(*
Tema 7: Tablas
Se crea un tabla cuyos elementos son tablas del tipo ventas. Es similar a
una tabla de tres dimensiones.
Nota: Para abreviar las pruebas se reduce el número de meses a dos o tres
*)
Program TablasMulti_03;
Const
Enero = 1;
Diciembre = 2;
NumEmple = 2;
NumZonas = 2;
Type
ventas = array[Enero..Diciembre, 1..NumZonas] of real;
(* Tabla para almacenar las ventas mensuales en cada región *)
(* Tenemos 12 meses (1..12) y 4 regiones (1..4) *)
- 17 -
TABLAS AULA MENTOR
plantilla: vendedores;
(* Calcula el máximo de ventas (en todos los meses y en todas las zonas
de un empleado que se le pasa como parámetro por valor *)
- 18 -
TABLAS AULA MENTOR
(* Modulo principal *)
begin
writeln('Maximos de ventas');
writeln('Angel : ',max_ventas(plantilla[1]):0:1);
writeln('Carmen: ',max_ventas(plantilla[2]):0:1);
writeln('TODOS : ',max_todos(plantilla):0:1);
end.
- 19 -