BotonMenu
BotonIndice

Visita : http://www.conoce3000.com
Paypal : https://www.paypal.me/conoce3000/1

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL


7. INTRODUCCIÓN A LOS PUNTEROS Y VARIABLES DINÁMICAS.
7.7. ARREGLOS DINÁMICOS. (ARRAY OF)
7. INTRODUCCIÓN A LOS PUNTEROS Y VARIABLES DINÁMICAS.
7.7. ARREGLOS DINÁMICOS. (ARRAY OF)
7. INTRODUCCIÓN A LOS PUNTEROS Y VARIABLES DINÁMICAS.
7.7. ARREGLOS DINÁMICOS. (ARRAY OF)

SIGUIENTE

SIGUIENTE

SIGUIENTE


‒ Arreglos dinámicos.

El compilador permite la creación de arreglos dinámicos, estos arreglos son punteros y se pueden crear usando las palabras reservadas Array y of, se crean de manera parecida a un arreglo con la diferencia de que no se indica los elementos, o el rango de elementos que se van a usar. Ejemplo:


Descargar
{$codepage UTF8}

 
VAR
 A01: Array of integer; 
 i:byte;

BEGIN 
 SetLength(A01,10);
  
 for i:=0 to 9 do A01[i]:=i;

  
 for i:=0 to 9 do Writeln(A01[i]);

 
 SetLength(A01,0) 
END.
Código fuente 23: Ejemplo de arreglos dinámicos.
Descargar

El programa anterior crea un arreglo dinámico A01, esta variable viene a ser un puntero y con el uso de la rutina SetLength, creamos la variable dinámica asociado a este puntero, en este ejemplo A01 es un arreglo de 10 enteros. Cada elemento de los arreglos dinámicos se enumera empezando desde 0. Los arreglos dinámicos no se pueden usar con las rutinas getmem y freemen, al igual que sucede con Ansistring y Unicodestring, tienen un tratamiento especial por el compilador. No es necesario eliminar o liberar la variable dinámica ya que el proceso es automático o mejor dicho el compilador añade código al programa para su tratamiento. Sin embargo podemos indicar que el arreglo deba ser eliminado o liberado, usando la rutina Setlength con un valor a cero, como se mostró en el ejemplo anterior.

También es posible modificar el tamaño del arreglo dinámico, en este caso el arreglo se quedará con la mayor cantidad de elementos que entren en el nuevo tamaño. Ejemplo:


Descargar
{$codepage UTF8}

 
VAR
 A01: Array of integer; 
 i:byte;

BEGIN 
 SetLength(A01,10);
  
 for i:=0 to 9 do A01[i]:=i;

  
 for i:=0 to 9 do Writeln(A01[i]);

 
 SetLength(A01,5); 


 for i:=0 to 4 do Writeln(A01[i]);


 SetLength(A01,0) 


END.
Código fuente 24: Ejemplo del uso de Setlength para indicar que se debe eliminar o liberar un arreglo dinámico.
Descargar

Cuando se intenta acceder a un elemento del arreglo que no está dentro de las dimensiones del arreglo, se generará un error, en la ejecución del programa. Hay que tener presente que la asignación de una variable que es un arreglo dinámico a otra, hará que ambos punteros apunten al mismo arreglo dinámico. Ejemplo:


Descargar
{$codepage UTF8}

 
VAR
 A,B:array of integer;
 i:byte;

BEGIN 
 SetLength(A,5);
 for i:=0 to 4 do A[i]:=i;

 B:=A;
 for i:= 0 to 4 do Writeln(A[i]:2,B[i]:2); 
 B[3]:=5; 
 for i:= 0 to 4 do Writeln(A[i]:2,B[i]:2); 
END.
Código fuente 25: Ejemplo de asignación de arreglos dinámicos.
Descargar

Del ejemplo anterior al hacer en B[3] el valor 5, también cambiamos el contenido de A[3], ya que ambos punteros apuntan a la misma variable dinámica. Al igual que los arreglos abiertos también se puede usar la función High, para saber cuál es el índice del último elemento de un arreglo dinámico, otras funciones como Low nos permite saber el índice del primer elemento que siempre será 0 y length que nos permite saber la cantidad de elementos. Ejemplo:


Descargar
{$codepage UTF8}

 
VAR
 A:array of integer;
 i:byte;

BEGIN 
 SetLength(A,5);
 for i:=Low(A) to High(A) do A[i]:=i;
 for i:=Low(A) to High(A) do Writeln(A[i]); 
 Writeln(Length(A));
 SetLength(A,2);
 for i:=Low(A) to High(A) do A[i]:=i;
 for i:=Low(A) to High(A) do Writeln(A[i]); 
 Writeln(Length(A));

END.
Código fuente 26: Ejemplo del uso de Low y High.
Descargar

Con los arreglos dinámicos también se pueden crear arreglos de 2, 3, 4 dimensiones, simplemente concatenando la declaración del arreglo dinámico, y al crear el arreglo dinámico se colocan como parámetros las dimensiones adicionales en la función setlength, separados por comas. Para acceder a un elemento del arreglo se accede como cualquier arreglo común de n dimensiones, pero para hacer el recorrido de un arreglo dinámico usando High, se debe hacer del siguiente modo:

for i:=low(A) to high(A) do
   for j:=low(A[i]) to high(A[i]) do
      for k:=low(A[i,j]) to High(A[i,j]) do
            Writeln(A[i,j,k]);

Debido a que High y Low sólo te permite obtener el índice de un arreglo dinámico, se debe ir accediendo por dimensiones para obtener el índice correspondiente. Ejemplo:


Descargar
{$codepage utf8}
Var A:array of array of array of word;
    i,j,k:integer;	
Begin
  SetLength(A,3,3,3);
  for i:=low(A) to high(A) do
   for j:=low(A[i]) to high(A[i])  do
    for k:=low(A[i,j]) to High(A[i,j]) do
	   Begin
	     A[i,j,k]:=(i*100)+(j*10)+(k);
	   End;
	   
  for i:=low(A) to high(A) do
   for j:=low(A[i]) to high(A[i])  do
    for k:=low(A[i,j]) to High(A[i,j]) do
	   Begin
	     Writeln('[',i,',',j,',',k,']:=',A[i,j,k]:3)		 
	   End; 
End.
Código fuente 27: Ejemplo de arreglos dinámicos de n dimensiones.
Descargar

A continuación otro ejemplo que es una adaptación del ejemplo: "Código fuente 6" del capítulo 5.2 Arreglos (Array), pero esta vez usando arreglos dinámicos:


Descargar
{$codepage UTF8}

VAR
 MatrizA,MatrizB,MatrizC:array of array of real;
 m,n:byte;
 i,j:byte;

BEGIN
 Writeln('Ingrese las dimensiones de las matrices a sumar (100 max) : ');
 Write('m :'); Readln(m);
 Write('n :'); Readln(n);
 
 SetLength(MatrizA,m,n);
 SetLength(MatrizB,m,n);
 SetLength(MatrizC,m,n);
 
 Writeln('Ingrese los datos de la Matriz A :');
 for i:=0 to High(MatrizA) do
   for j:=0 to High(MatrizA[i]) do
     Begin
       Write('MatrizA[',i,',',j,'] : ');       
       read(MatrizA[i,j])
     End; 
	 
 Writeln('Ingrese los datos de la Matriz B :');
 for i:=0 to High(MatrizB) do
   for j:=0 to High(MatrizB[i]) do
     Begin
       Write('MatrizB[',i,':',j,'] : ');
       read(MatrizB[i,j])
     End;
	 
//Sumando
 for i:=0 to High(MatrizC) do
    for j:= 0 to High(MatrizC[i]) do
      MatrizC[i,j]:=MatrizA[i,j]+MatrizB[i,j]; Writeln('La suma es : ');
      for i:=0 to m-1 do
       Begin
        for j:=0 to n-1 do Write(MatrizC[i,j]:10:2);
        Writeln 
       End; 
  
END.
Código fuente 28: Suma 2 matrices con arreglos dinámicas de tipo real.
Descargar


Última revisión: 10/12/2013.



SIGUIENTE
SIGUIENTE
SIGUIENTE



 
‒ Comentarios y sugerencias.

Agradezco de antemano, todo comentario, sugerencia, y donativo (a través de Paypal me), que ayude a mejorar los contenidos educativos de Conoce 3000. Además, cualquier pregunta o duda que tengas lo puedes hacer por este medio. Pero, todo contenido que pueda resultar ofensivo, malicioso, racista, sexista, discriminatorio, obsceno, vulgar será eliminado.


Comments System WIDGET PACK






PORTADA |  INTERESANTE |  APUNTES |  LIBROS |  GALERIA


Creative Commons License


Todos los textos, imágenes y videos de Conoce3000 estan colocados bajo una licencia : Creative Commons Reconocimiento-NoComercial 3.0 Unported License.