6.4. Parámetros arreglos abiertos (open array).
anterior :: indice :: siguiente
El compilador admite la creación de procedimientos o funciones con parámetros que se conocen como arreglos abiertos (open array), estos parámetros sólo se usan con arreglos de una dimensión. Estos parámetros nos permiten usar distintos arreglos con una cantidad variable de elementos, es decir que se pueden pasar arreglos con diferente cantidad de elementos a un procedimiento o función, su uso es como se muestra a continuación:
| |
Procedure HacerAlgo(Var N:array of integer); |
Esto es muy útil, si por ejemplo se desea hacer un procedimiento o función, que permita ordenar dos arreglos con diferente cantidad de elementos. Cuando un arreglo se pasa como un arreglo abierto a un procedimiento o función, este es tratado como un arreglo de 0 hasta n elementos. Por ejemplo: si a un procedimiento o función le pasamos un arreglo de 5 a 8 elementos es tratado como un arreglo desde 0 hasta 3 elementos (tiene 4 elementos). Además se debe usar o hacer uso de la función High, esta función nos permite devolver el índice del último elemento que tendrá el parámetro que se pase al procedimiento o función. A continuación un ejemplo:
| |
{$codepage UTF8}
VAR Lista01:array [1..10 ] of integer = (8,5,4,2,3,10,11,5,8,9);
Lista02:array [1..5] of integer = (5,8,2,3,1);
PROCEDURE Ordenar(Var lista:array of integer);
Var i,j:longint;
aux:integer;
Begin
For i:=1 to High(lista) do //después del primero
Begin
aux:=lista[i];
j:=i-1;
While ( (j>=0) and (lista[j]>aux) ) do
//mientras no se termina la lista y la comparación (mayor que ) del elemento con
//el anterior sea verdadera
Begin
lista[j+1]:= lista[j];
j := j - 1;
End;
lista[j+1]:=aux;
End;
End;
PROCEDURE Mostrar(Var lista:array of integer);
Var i:integer;
Begin
For i:=0 to High(lista) do
Writeln(lista[i]);
End;
BEGIN
Writeln('Lista01');
Ordenar(Lista01);
Mostrar(Lista01);
Writeln('Lista02');
Ordenar(Lista02);
Mostrar(Lista02);
END. |
| |
Código fuente 10 : Parámetros con arreglos abiertos (open array). |
Debido a que los arreglos abiertos (open array) empiezan en 0, se debe adaptar el algoritmo de ordenación para usar estos índices, es por eso que dentro del procedimiento Ordenar se puede observar que el for empieza en 1, porque el segundo elemento de la lista se encuentra en el índice o posición 1, además dentro del bucle While para verificar que se llego al inicio de la lista la comparación de la variable j se hace con el valor 0, porque el primer elemento de la lista se encuentra en el índice o posición 0.
El compilador permite pasar una parte de un arreglo a una función o procedimiento que use arreglos abiertos. Esto se puede hacer especificando parte del rango del arreglo que se desea usar en el procedimiento o función. Por ejemplo, cuando se declara la siguiente variable:
| |
Var lista : array [1..10] of integer; |
y se tiene una función que calcule el promedio de los números de la lista, y queremos obtener el promedio sólo de los primeros 5 números, debemos hacerlo del siguiente modo:
a continuación el programa completo de ejemplo:
| |
{$codepage UTF8}
FUNCTION Promedio(lista:array of integer):single;
Var
i:integer;
aux:single;
Begin
aux:=0;
for i:= 0 to high(lista) do aux:=aux+lista[i];
Promedio:=aux/(high(lista)+1)
End;
VAR lista:array [1..10] of integer = (10,15,12,14,11,8,1,5,10,20);
BEGIN
Writeln('Promedio de los 5 primeros =',Promedio(lista[1..5]):5:3);
Writeln('Promedio de los 5 ultimos =',Promedio(lista[6..10]):5:3)
END. |
| |
Código fuente 11: Pasando parte de un arreglo con arreglos abiertos (open array). |
Cuando una función o procedimiento usa arreglos abiertos, entonces se pueden pasar los elementos de un arreglo sin haberlos creado de manera directa usando sólo corchetes, el parametro de la función o procedimiento no debe usar la palabra reservada var, porque lo que se pasa no es una variable si no los valores de un arreglo que no existe. A continuación el ejemplo:
| |
{$codepage UTF8}
FUNCTION Promedio(lista:array of integer):single; //no usar var
Var
i:integer;
aux:single;
Begin
aux:=0;
for i:= 0 to high(lista) do aux:=aux+lista[i];
Promedio:=aux/(high(lista)+1)
End;
BEGIN
Writeln('Promedio de 5 numeros =',Promedio([1,2,3,4,5]):5:3)
END. |
| |
Código fuente 12: Pasando un arreglo de manera directa con arreglos abiertos. |
anterior :: indice :: siguiente |