Sei sulla pagina 1di 5

13

ARREGLOS
Después de la intuición de algunas proposiciones simples, cuando sacamos de ellas otra conclusión, es útil recorrer las
mismas proposiciones en un movimiento continuo y completamente ininterrumpido del pensamiento, reflexionar en sus
diversas relaciones mutuas y concebir de manera distinta varias de ellas a la vez, en la medida de lo posible; de esta
manera, en efecto, nuestro conocimiento se hace mucho más cierto y se aumenta sobre todo la extensión de nuestro
espíritu.
René Descartes – Reglas para la dirección de la mente – Regla XI - 1628.

Un arreglo, al igual que un registro, permite el almacenamiento de más de un dato en una misma variable a la vez, pero a
diferencia de éste, restringe este almacenamiento a datos del mismo tipo, siendo tal tipo cualquiera de los que ofrece Pascal,
con algunas excepciones. Así, elementos tales como: vectores, matrices y determinantes, listas y tablas pueden ser
manipulados tanto a nivel de cada uno de sus componentes o como toda una unidad, lo que agrega al programador un
conjunto aún mayor de posibilidades para el procesamiento ordenado de la información.

13.1 Composición X

Dado que es un tipo estructurado, el arreglo ofrece la 12.34 0.58 -5.2 108.1 -0.093
posibilidad de manipular un conjunto de datos como un
colectivo a la vez que permite el acceso a cada uno de Esta representación está incompleta. Para acceder a cada
esos datos individualmente. Los tipos registro y objeto elemento individual de este arreglo es necesario, como ya
también lo hacen, por lo que conviene saber cuáles son se dijo, un índice. Éste funciona de manera similar al
las principales características que los diferencian de éste: índice con el que se accede a cada caracter individual de
– Los tipos registro y objeto permiten el una cadena o al índice de un vector, de modo que, por
almacenamiento, en una misma variable y a la vez, ejemplo, el arreglo mostrado podría aparecer así:
de elementos de distinto tipo. En un arreglo, estos
elementos deben ser del mismo tipo.
X
– Para acceder a cada elemento individualmente, los
tipos registro y objeto utilizan la notación de punto. 12.34 0.58 -5.2 108.1 -0.093
El tipo arreglo utiliza un índice. 1 2 3 4 5
Para ilustrar la composición de un arreglo se puede usar En esta condición, se dice entonces que x1 = 12.34, x2 =
una representación ya conocida. En un capítulo anterior 0.58, x3 = -5.2, x4 = 108.1 y x5 = -0.093, muy parecido a la
se utilizó el esquema mostrado en el siguiente ejemplo notación vectorial usada en matemáticas. En Pascal, los
para representar una variable numérica y su contenido: subíndices se escriben entre corchetes. Así por ejemplo,
para ingresar por asignación el primer valor del arreglo,
X
se escribiría x[1]:=12.34;
12.34

Ahora bien, manteniendo este esquema, la representación


Otro punto a considerar, y uno de los más
de un arreglo de elementos numéricos podría ser como se ► A PROPÓSITO
importantes cuando se manipulan
muestra a continuación, donde se puede apreciar el arreglos, es que el índice puede ser una expresión ordinal, no
ejemplo de una variable de nombre X y que almacena sólo un valor entero.
cinco valores numéricos:
Pag. 13-2 Cap.13: Arreglos

Ejemplo 13-1
El siguiente segmento de programa imprime, en una aplicación
X
tipo cónsola, los elementos de un arreglo como el de los
ejemplos anteriores: una variable de nombre x que almacena 12.34 0.58 -5.2 108.1 -0.093
cinco valores numéricos:
‘a’ ‘b’ ‘c’ ‘d’ ‘e’
For i:=1 to 5 do
Writeln(x[i]); Observe que el primer elemento del primer ejemplo se
llamaría X[-2] y el del segundo, X['a']. Cuándo se
Observe entonces, que cuando la variable de control i toma el llama de una manera o de otra, queda determinado en la
valor 1, se imprime x[1], cuando toma el valor 2, se imprime declaración del tipo.
x[2], etc. Si se quisiera imprimir el arreglo en orden inverso,
No Confunda el valor del índice con el
es decir del quinto elemento al primero, se podría escribir: ► IMPORTANTE valor almacenado en la casilla. Ambos son
totalmente independientes a menos que el programador indique
For i:=1 to 5 do
lo contrario. De hecho, observe que el índice puede ser de un
Writeln(x[6-i]); tipo y el valor almacenado puede ser de otro totalmente distinto.

Así es más evidente el uso de una expresión como índice.


Se ve pues, que el índice y el valor almacenado pueden
El arreglo presenta otra semejanza con las cadenas: así ser de distinto tipo, pero no siempre tiene que ocurrir así.
como un elemento de una cadena puede ser asignado a Observe la siguiente instrucción:
una variable simple de tipo char, un elemento de un
For i:=1 to 5 do X[i]:=2*i;
arreglo puede recibir y traspasar información a una
variable simple, siempre que ésta sea del mismo tipo o En esta se asigna a cada elemento del arreglo un valor
compatible. Es más, pueden formarse expresiones donde numérico igual al doble del índice. Si el tipo del valor
aparezcan mezclados ambos. Así, en referencia al almacenado y el tipo del índice son compatibles,
ejemplo anterior, si una variable simple, numérica y de instrucciones como la anterior son perfectamente válidas.
nombre Y existe en el mismo programa de dicho ejemplo,
entonces las siguientes asignaciones son válidas: 13.2 Clasificación
Y:=X[1]; En los ejemplos anteriores se pueden ver los elementos
X[5]:=Y; de un arreglo agrupados como una lista, de tal modo que
con un solo índice basta para ubicar con toda seguridad a
o incluso, un poco más complicadas: cualquiera de ellos. Sin embargo, esta no es la única
Y:=X[1]+X[2]; manera en que se pueden organizar los elementos; por
ejemplo, observe siguiente figura:
X[3]:=5*Y/20;
For i:=1 to 5 do Y:=Y+X[i];
De hecho, si los elementos de varios arreglos son TAB
compatibles, éstos también pueden formar expresiones 1 12.34 0.58 -5.2 108.1 -0.093
donde aparezcan mezclados. Tomando el ejemplo
2 -43.2 1002 0.003 3.141 29.12
anterior, si hubiera una variable de nombre Z del mismo
tipo de la variable X, se podría escribir: 3 0.65 578.1 -6520 49.52 2.58

Y:=X[1]+Z[1]; 1 2 3 4 5

Z[i]:=Y+X[j]; Aquí, los elementos están agrupados en forma de tabla.


Ahora bien, a nivel de índices existe una diferencia Para ubicar un elemento en la misma, es necesario el uso
importante con las cadenas: en una cadena el índice de dos índices. Observe que la casilla que contiene el
siempre es numérico y el valor del índice del primer número 3.141 está ubicada en la fila 2 y en la columna 4,
carácter de la cadena es 1. En un arreglo, el índice no sólo por lo que, en Pascal, esta casilla sería referida como
puede ser no numérico sino que tampoco tiene que ser 1 TAB[2,4]. Entonces, una primera clasificación
el valor del índice del primer elemento. Sabiendo esto, el proviene del número de índices necesarios para ubicar
arreglo del ejemplo anterior podría ser referenciado de las cada casilla en un arreglo:
siguientes maneras: – Lineales o unidimensionales: cuando sólo precisan
de un índice.
X
– Bidimensionales, tridimensionales o en general,
12.34 0.58 -5.2 108.1 -0.093 multidimensionales: cuando precisan de más de un
-2 -1 0 1 2
índice.
Como es lógico, sólo hasta los arreglos tridimensionales

Programación con Delphi Ing. José Ricardo Vargas


Cap.13: Arreglos Pag. 13-3

pueden ser visualizados fácilmente. Observe la siguiente tendrá el arreglo y cómo se llamará cada elemento, es
figura, en ella se muestra un arreglo de 3 filas por 4 decir, qué valores tomará el índice. En la misma
columnas por 5 páginas, llamado BOX: declaración, el segundo TIPO se refiere al tipo de los
elementos que almacenarán las casillas. Por ejemplo,
observe la siguiente declaración:
Type TA1 = Array[1..10] of Extended;

Una variable del tipo TA1 estará compuesta de 10


BOX
casillas, numeradas del 1 al 10, y cada casilla podrá
1 12.34 0.58 -5.2 108.1 almacenar un valor de tipo Extended o compatible.
5
-43.2 1002 0.003 3.141 4
2 3 Ejemplo 13-3
0.65 578.1 -6520 49.52 2 A continuación se muestran varias declaraciones de arreglos
3
1 lineales:
1 2 3 4
Type TVector = Array[1..100] of Extended;
TArr = Array[-10..10] of String;
Ahora bien, el hecho de que sean difíciles de visualizar,
TV1 = Array[Byte] of Integer;
no significa que no se puedan manipular arreglos de más
de tres dimensiones. La primera se refiere a un arreglo de 100 elementos, numerados
del 1 al 100 y que almacenan valores Extended. La segunda se
Ejemplo 13-2 refiere a un arreglo de 21 elementos, numerados del -10 al 10 y
Sea una tienda por departamentos formada por 7 de los mismos. que almacenan, cada uno, una cadena alfanumérica. La tercera
Para llevar el monto de las ventas totales de cada departamento se refiere a un arreglo de 256 elementos, numerados del 0 al 255
se puede usar un arreglo lineal de 7 elementos, por ejemplo: y que almacenan, cada uno, números enteros (Recuerde que el
tipo Byte es un tipo numérico predefinido de Pascal, el cual es
Type TArr1 = Array[1..7] of Extended; ordinal y cuyos valores van del 0 al 255).
Var Ventas = TArr1;
Como se vio en el ejemplo anterior, el rango de un
Así, el monto de las ventas del departamento i se almacenaría arreglo puede ser definido de diferentes maneras. De
en Ventas[i]. Suponga ahora que el dueño de la tienda hecho, pueden utilizarse incluso tipos enumerados o tipos
decide abrir 3 tiendas más en la misma ciudad. Para llevar el subrango declarados por el programador. Observe los
monto de las ventas de cada departamento de cada tienda, debe siguientes ejemplos:
modificar el arreglo a uno bidimensional de 7 filas por 4
columnas: Type Rango1 = 1..1000;
TA2 = Array[Rango] of Extended;
Type TArr1 = Array[1..7,1..4] of Extended;
Var Ventas = TArr1; En este, se refiere a un tipo compuesto por 1000
elementos de tipo Extended, numerados del 1 al 1000.
Así, el monto de las ventas del departamento i de la tienda j se Type Dias = (lun,mar,mie,jue,vie,sab,dom);
almacenaría en Ventas[i,j]. Si se abrieran 4 tiendas más en
TA3 = Array[Dias] of Integer;
otras cinco ciudades, habría entonces que modificar el arreglo a
uno tridimensional de 7 × 4 × 6 elementos. Si luego se abrieran TA4 = Array[lun..vie] of String;
otras 4 tiendas en otras 5 ciudades de otros 8 estados, habría que
modificar el arreglo a uno de 7 × 4 × 6 × 9 elementos. Entonces, En este se refiere a dos arreglos: el primero es un arreglo
el elemento Ventas[i,j,k,l] denotaría el monto de las de siete elementos de tipo Integer, numerados del lun al
ventas del departamento i de la tienda j de la ciudad k del dom. El segundo es un arreglo de cinco elementos de tipo
estado l. String, numerados del lun al vie. Suponga ahora un
programa que incluya estas declaraciones. Las siguientes
Existe otra clasificación, pero para entenderla, es
declaraciones e instrucciones serían válidas:
necesario conocer el modo de declarar un tipo arreglo.
Var V1: TA3;
13.3 Declaración V2: TA4;
i: Dias;
Primero se mostrará la declaración de un tipo arreglo :
lineal:
For i:=lun to dom do Readln(V1[i]);
TYPE :
For i:=Lun to vie do Writeln(V2[i]);
NOMBRE DEL TIPO = ARRAY [RANGO] OF TIPO;
En esta última instrucción, se imprime primero el
En esta declaración, RANGO se refiere a un tipo subrango, elemento V2[lun] y por último el elemento V2[vie],
declarado o no, e indica el número de elementos que todos ellos conteniendo una cadena alfanumérica.
Programación con Delphi Ing. José Ricardo Vargas
Pag. 13-4 Cap.13: Arreglos

Otra consideración respecto de los rangos indica que el Así mismo, un arreglo puede ser campo de un registro,
rango puede estar formado no sólo por valores sino como se muestra en el siguiente ejemplo:
también por constantes: lo importante es que, al momento Type TR2 = Record
de la compilación, las constantes tengan definido un Nombre, Apellido: String;
valor, tal como se aprecia en el siguiente ejemplo, el cual Cedula: Integer;
está formado por una declaración válida:
Nota: Array[1..10] of Integer;
Const N = 100; End;
Type TVX = Array[0..N] of Double; Si quisiera imprimir el contenido de una variable de
Lo que no acepta Pascal es el uso de variables como nombre Alumno y del tipo TR2, se escribiría:
extremos de un rango, aun cuando estas tengan un valor Writeln(Alumno.Nombre);
al momento de compilar, por ejemplo: Writeln(Alumno.Apellido);
Var N: Integer = 10; Writeln(Alumno.Cedula);
For i:=1 to 10 do Writeln(Alumno.Nota[i]);
Type TVY: Array[1..N] of String;
no está permitido.
Otra manera de declarar la existencia de un arreglo es
Ejemplo 13-4
declarando una variable tipo arreglo sin declarar el tipo, Dadas las siguientes declaraciones:
de modo similar al que se hace con los registros: Type TR2 = Record
Nombre, Apellido: String;
VAR Cedula: Integer;
Nota: Array[1..10] of Integer;
NOMBRE DE VARIABLE : ARRAY [RANGO] OF TIPO; End;
DOS PUNTOS Datos = Array[1..1000] of TR2;
Var Seccion: Datos;
Por ejemplo, las siguientes declaraciones son válidas: i,k: Integer;
Observe la existencia de un arreglo –Seccion– cuyos
Var V1: Array[0..50] of Integer;
componentes son registros, en cuyos campos se incluye otro
V2: Array[-20..20] of String; arreglo. El siguiente segmento de programa imprime, en una
aplicación tipo cónsola, los elementos del arreglo Seccion de
En este caso se declaran dos variables tipo arreglo cuyos la siguiente manera: un dato por cada línea excepto las notas de
tipos no están identificados. cada registro las cuales se imprimen en la misma línea:
Como ya se dijo, los elementos de un arreglo pueden ser,
con algunas excepciones, de cualquier tipo; ello incluye For i:=1 to 1000 do
al tipo registro. Así, la siguiente es una declaración Begin
Writeln(Seccion[i].Nombre);
válida: Writeln(Seccion[i].Apellido);
Type TRec1 = Record Writeln(Seccion[i].Cedula);
Nombre, Apellido: String; For k:=1 to 10 do
Cedula: Integer; Write(Seccion[i].Nota[k]:4);
Writeln;
End; End;
Datos = Array[1..1000] of TRec1;
Observe que los elementos del arreglo son, cada uno, un La declaración de un tipo arreglo multidimensional se
registro, es decir, que cada casilla almacena en este caso escribe de la siguiente manera:
tres datos: un nombre, un apellido y una cédula, por lo
que se puede afirmar que este arreglo almacena 3000 TYPE
datos. Para acceder a cada campo de registro hay que NOMBRE DEL TIPO =
utilizar combinadamente el índice y la notación de punto.
Así, por ejemplo, para imprimir los valores almacenados ARRAY [RANGO 1, RANGO 2,….,RANGO N ] OF TIPO;
en una variable de nombre XX del tipo Datos, se
En esta declaración, la cantidad de RANGOS determina la
escribiría:
dimensionalidad del arreglo, es decir, la cantidad de
For i:=1 to 1000 do índices necesarios para ubicar cada elemento del mismo.
Begin Por lo general, todos los rangos son del mismo tipo, como
Writeln(XX[i].Nombre); en el siguiente ejemplo:
Writeln(XX[i].Apellido); Type TM1 = Array[1..10,1..5] of String;
Writeln(XX[i].Cedula);
Aquí se está declarando un tipo arreglo de 10 filas y 5
End; columnas, es decir, de 50 elementos, cuyas filas están
Programación con Delphi Ing. José Ricardo Vargas
Cap.13: Arreglos Pag. 13-5

numeradas del 1 al 10 y cuyas columnas lo están del 1 al


5, y que almacena datos de tipo String. Ahora bien, no
siempre tiene que ser así: cada rango puede ser de un tipo
distinto, como se aprecia en el siguiente ejemplo:
Type TM2 = Array[1..100,'a'..'z'] of String;
Dada ahora la siguiente declaración, basada en las dos
anteriores:
Var A: TM1;
B: TM2;
El primer elemento de la variable A sería A[1,1]
mientras que el primer elemento de la variable B sería
B[1,'a'].
Todas las consideraciones mencionadas para los rangos
de los arreglos lineales, también se aplican a los rangos
de los arreglos no lineales: estos no tienen que comenzar
siempre en 1, pueden ser rangos definidos por el
programador o predefinidos, con constantes, etc.

Programación con Delphi Ing. José Ricardo Vargas

Potrebbero piacerti anche