Está en la página 1de 7

1

APUNTES DE PROGRAMACIÓN (0790)


TIPO DE DATO ARRAY
Muchas veces es usual el querer almacenar un conjunto de valores, relacionados de alguna
manera, bajo una estructura con cierta organización. En estos casos nos referiremos a una
variable denominada compuesta. Es decir una localidad de memoria capaz de almacenar más de
un valor donde todos se llaman de la misma manera y la diferencia entre un elemento u otro va a
depender del valor de una posición de referencia.
Como se define un tipo ARRAY? En primera instancia debemos conocer el tipo de valor que
vamos a almacenar y la cantidad máxima de valores. Eso constituirá la definición del tipo. Por
ejemplo, supongamos que tenemos información correspondiente a los estados civiles y edades de
un grupo de personas, y las queremos almacenar en sendos vectores A y B, de la siguiente
manera:
VECTOR A, ESTADOS CIVILES (cinco categorías: S por soltero, C por casado, V por viudo,
D por divorciado y O por no identificado.)
‘S’ ‘S’ ‘V’ ‘D’ ‘C’ ‘C’ ‘V’ ‘D’ ‘S’ ‘V’
VECTOR B, EDADES
23 40 36 48 50 35 89 56 34 60
Entonces, una definición de tipo para estas variables pudiera ser:
TYPE
T1=Array [1..100] of char;
T2=Array [1..100] of byte;
Donde:
VAR
A:T1;
B:T2;
En la definición de un tipo arreglo se indica entre los corchetes un subrango que significa la
cantidad máxima de valores a almacenar y la manera de organizarlos y luego de la palabra Of el
tipo de dato que se almacena. Un arreglo almacena UN SOLO TIPO de dato. En mi ejemplo
estoy declarando que manipulare hasta 100 valores, organizados en posiciones de la 1 a la 100 y
esos serán los valores pertinentes para referirme a cualquier posición. Es decir, no podré
referirme tanto en A como en B a la posición -4 ni tampoco a la posición 150 porque no están
definidas. La manera de organizar el arreglo es completamente arbitraria, se pudiera también
almacenar 100 valores con la siguiente declaración: [-50..49]. En este caso los valores de
posiciones deberán referir valores entre -50 como la primera, -49 como la segunda, -48 como la
tercera, y así sucesivamente hasta la posición 49 que es la última. Siempre los valores de las
posiciones deberán ser dadas con un subrango.
Solo hay dos maneras de darle valor a una variable, por lectura o por asignación. Todo lo dicho
para variables simples en este aspecto vale para variables compuestas.
Creación de un vector por lectura: Creación de un vector por asignación
For i:=1 to N do For i:=1 to N do
Readln (vector [i] ); Vector [i]:= x+y;
2

Por cualquiera de las dos acciones se esta creando una variable compuesta de N elementos,
organizados en posiciones de la 1 a la N. Siendo N el numero real de elementos que se
almacenan y debe ser un valor acorde con la definición que se hizo del tipo vector. Por ejemplo
si vector es declarada como una variable del tipo T1 o T2, el valor de N debe estar entre 1 y 100.
La creación de un vector nos permite almacenar valores en una única variable y tenerlos vigentes
en toda la ejecución del programa. Visto como un subprograma sus parámetros serian N de
entrada y vector de salida y su encabezado podría ser:

PROCEDURE CREAR_VECTOR (N: BYTE; ( O MEJOR 1..100)


VAR VECTOR:T1);
VAR
I: BYTE;
Para referenciar cualquier elemento de un vector basta con indicar la posición en cuestión. Por
ejemplo
Writeln (A[5]) se escribe en pantalla el valor del elemento de A ubicado en la quinta posición. La
referencia a una posición en particular se puede hacer con una constante, con una variable o con
una expresión aritmética evaluable. En cualquier caso debe hacerse referencia a una posición
“legal”. Esto significa que el valor debe ser ordinal y estar comprendido en el rango de
posiciones definidas en el tipo.
(**************************************)
Proceso de Búsqueda en un Vector:

Supongamos que se ha creado un vector donde se almaceno la información correspondiente a la


nota de un examen de un grupo de N estudiantes. Queremos saber la cantidad de aprobados en el
examen
Contador:=0;
For w:=1 to N do
If (vector [w] >=10) then contador:=contador+1;
Los reprobados:
Contador:=0;
For w:=1 to N do
If (vector [w]<10) then contador:=contador+1;
O simplemente N-contador de aprobados

Para un valor de nota en particular:


Contador:=0;
For w:=1 to N do
If (vector [w] =valor_particular) then contador:=contador+1;

Agrupando estos tres procesos en uno solo podríamos generalizar de la siguiente manera:
Contador:=0;
For w:=1 to N do
If (vector [w] IN [inicio..fin]) then contador:=contador+1;
3

Donde se indica incrementar el valor de la variable contador en uno si el elemento del vector de
posición w pertenece al conjunto de todos los valores indicados en el subrango inicio..fin. Si la
búsqueda corresponde a los aprobados al momento de invocar este subprograma se indica
inicio=10, fin=20. Los reprobados, inicio=0, fin=9. Una nota en particular, tanto inicio como fin
el mismo valor

Procedure búsqueda (N,INICIO,FIN:byte;


Var contador:byte);
Var
X:Byte;
Begin
Contador:=0;
For X:=1 to N do
If (vector [X] in [inicio..fin] ) then contador:=contador+1;
End;

BUSQUEDA CUALITATIVA EN UN VECTOR. USO DE UN VECTOR APUNTADOR


Del proceso anterior se obtiene la cantidad de personas que cumplen con la condición del
proceso de búsqueda planteado, un único valor. Si adicionalmente a la cantidad de aprobados mi
interés fuese también quienes? Y con cuanto? se complica un poco este proceso. Cuantos
resultados espero obtener? Uno solo? Solo una persona aprobada? No me parece estar haciendo
un buen modelo de la realidad. Si mis datos fuesen los siguientes:
7 5 3 14 6 12 9
Con N=7, Una buena respuesta a mi proceso de búsqueda de los aprobados pudiera ser:
Existen 2 personas aprobadas
La numero 1 ocupa la posición número 4 con 14 puntos
La numero 2 ocupa la posición número 6 con 12 puntos
Nótese que en este caso se sospecha que se puede obtener mas de un resultado del proceso de
búsqueda y de alguna manera deben poderse “guardar” las posiciones de aquellos elementos del
vector que cumplen con la condición de búsqueda. Esto se hará haciendo uso de otro vector que
se denomina APUNTADOR porque en el se copian las POSICIONES de los elementos que en el
vector de búsqueda cumplen con el criterio dado. Ahora bien, cual será la estructura o dimensión
de ese “apuntador”. Si todas las personas resultasen aprobadas el apuntador seria:
1 2 3 4 5 6 7
Si ninguna persona resultara aprobada, el apuntador seria:

En nuestro ejemplo, que seria una aproximación a la situación real, el apuntador seria:
4 6
Si el vector de búsqueda es de tipo Array [-100..100] of byte, un vector apuntador de este
pudiera ser de tipo: Array [1..201] of -100..100 lo que significaría: Máximo 201 elementos que
pudiesen cumplir con el criterio de búsqueda pero los valores que se almacenan en cada una de
esas posiciones son los valores de las posiciones definidas para el vector original.
Como se construye este apuntador? Realicemos el mismo recorrido hecho en el vector original
cuando quisimos hallar la cantidad de aprobados
4

Begin
Contador:=0;
For X:=1 to N do
If (vector [X] in [inicio..fin] ) then contador:=contador+1;
End;

En nuestro ejemplo:
X=1 la condición del If es falsa,
X=2 la condición del If es falsa,
X=3 la condición del If es falsa,
X=4 la condición del If es cierta, esto significa que ese valor de posición debería ser almacenado
en el apuntador. En cual posición? En este caso en la primera porque es el primer valor que
cumple con la condición, pero si fuese el segundo entonces debería ser en la segunda, y si fuese
el tercero en la tercera, y así sucesivamente. Esto significa que el incremento del contador va
“abriendo” la posición que debe ser llenada en el vector apuntador y para ir creando el apuntador
debe procederse de la siguiente manera:

Begin
Contador:=0;
For X:=1 to N do
If (vector [X] in [inicio..fin] ) then begin
contador:=contador+1;
Apuntador [contador]:=X;
end;
End;
Continuando el recorrido en el vector original con el ciclo For
X=5 la condición del If es falsa,
X=6 la condición del If es cierta, ese valor de posición debería ser almacenado en el apuntador.
X=7 la condición del If es falsa.
Salida del For, cierre del ciclo, fin del procedimiento
Que tenemos? Un subprograma diseñado para obtener un vector apuntador resultado de un
proceso de búsqueda generalizada. Entrada? El vector original, la cantidad de elementos del
vector original y el rango inicio, fin de búsqueda. Salida? El vector apuntador (calidad, quienes)
y el contador (cantidad, cuantos). Muy importante es definir como parámetro de salida la
cantidad real de valores que se almacenan en el vector apuntador porque cualquier manipulación
posterior de este vector deberá hacerse sobre las posiciones efectivamente creadas, que no
necesariamente son iguales a las definidas

PROCEDURE BUSQUEDA (N,INICIO,FIN:BYTE;


VECTOR:T1;
VAR APUNTADOR:T99;
VAR CONTADOR:BYTE);
VAR
X:BYTE;
Begin
5

Contador:=0;
For X:=1 to N do
If (vector [X] in [inicio..fin] ) then begin
contador:=contador+1;
Apuntador [contador]:=X;
end;
End;

Donde:
Type
T99=Array [1..100] of 1..100;

Supóngase que en un programa se hace invocación de BUSQUEDA de la siguiente manera:

BEGIN
:
:
:
BUSQUEDA (34,5,15,A,B,X);
:
:
END.

Se esta realizando la búsqueda en un vector llamado A que tiene 34 elementos de las personas
con rango de notas entre 5 y 15 inclusive. Se obtiene la cantidad en la variable X y las posiciones
que tienen esas personas en el vector A con el vector B que es un apuntador.

Retomando el resultado que debería escribir del proceso de búsqueda en nuestro ejemplo se
concluye que cualquier escritura de resultados debe incluir como parámetros de entrada a todas
las variables que fueron involucradas en el referido proceso.

PROCEDURE ESCRIBIR_RESULTADO_D_BUSQUEDA (N,INICIO,FIN:BYTE;


VECTOR:T1;
APUNTADOR:T99;
CONTADOR:BYTE);
VAR
X:BYTE;
Begin
IF (CONTADOR=0) THEN WRITELN (‘NINGUNA PERSONA CUMPLE CRITERIO DE
BUSQUEDA’)
ELSE IF (CONTADOR=N) THEN
WRITELN (‘TODAS LAS PERSONAS CUMPLEN CON EL CRITERIO DE
BUSQUEDA’)
ELSE BEGIN
WRITELN (‘EXISTEN ‘,CONTADOR,’ PERSONAS QUE CUMPLEN CON CRITERIO
DE BUSQUEDA’);
6

WRITELN (‘ ESTAS SON LAS SIGUIENTES:’);


FOR J:=1 TO CONTADOR DO BEGIN
WRITE (‘LA NUMERO ‘,J,’ OCUPA LA POSICIÓN NUMERO ‘,APUNTADOR[J]);
WRITELN (’ CON ‘,VECTOR [ APUNTADOR [ J ] ] ,’ PUNTOS’);
END;
END; (* FIN DEL ELSE*)
End;

Observe la función del apuntador: VECTOR [ APUNTADOR [ J ] ]

En nuestro ejemplo
Para J=1 APUNTADOR [ 1 ] =4 se referencia a VECTOR [ 4 ] que es igual a 14
Para J=2 APUNTADOR [ 2 ] =6 se referencia a VECTOR [ 6 ] que es igual a 12
7

( *************** NOTAS AL MARGEN **************************** )


FUNCION RANDOM - RANDOMIZE
J:=RANDOM (N) → J ES UN VALOR NUMERICO GENERADO AL AZAR
COMPRENDIDO ENTRE O Y N-1. RANDOM ES UNA FUNCION PREDEFINIDA, SE
UTILIZA CON EL PROCEDIMIENTO RANDOMIZE PARA CAMBIAR LA SEMILLA DE
GENERACION DE NUMEROS ALEATORIOS
P:=CHR (K) → K ES UN VALOR NUMERICO Y P ES EL CARÁCTER
CORRESPONDIENTE AL VALOR DE K EN EL CODIGO ASCII
P:=ORD (K) → K ES UN CARÁCTER Y P ES UN VALOR NUMERICO
CORRESPONDIENTE AL CODIGO ASCII DE K
INC (X,Y); PROCEDIMIENTO PREDEFINIDO PARA INCREMENTAR EL VALOR DE LA
VARIABLE X EN Y UNIDADES. X y Y DEBEN SER VALORES ORDINALES. SI EL
INCREMENTO ES EN UNO, SE PUEDE OBVIAR EL VALOR DE Y. INC(X,Y)
EQUIVALE A X:=X+Y; INC (X); EQUIVALE A X:=X+1;
DEC (X,Y); PROCEDIMIENTO PREDEFINIDO PARA DECREMENTAR EL VALOR DE
LA VARIABLE X EN Y UNIDADES. X y Y DEBEN SER VALORES ORDINALES. SI EL
DECREMENTO ES EN UNO, SE PUEDE OBVIAR EL VALOR DE Y. DEC(X,Y)
EQUIVALE A X:=X-Y; DEC (X); EQUIVALE A X:=X- 1;
Espero les sea de utilidad.
Profa. Marilyn Ramos

También podría gustarte