John Angie

John Angie

lunes, 28 de marzo de 2011

Arreglos

 Arreglos (array)

Arreglos unidimensionales y multidimensionales: 

Los arreglos son una colección de variables del mismo tipo que se referencian utilizando un nombre común. Un arreglo consta de posiciones de memoria contigua. La dirección más baja corresponde al primer elemento y la más alta al último. Un arreglo puede tener una o varias dimensiones


Un arreglo está formado por un número fijo de elementos contíguos de un mismo tipo. Al tipo se le llama tipo base del arreglo. Los datos individuales se llaman elementos del arreglo.

Para definir un tipo estructurado arreglo, se debe especificar el tipo base y el número de elementos.

Un array se caracteríza por :

Almacenar los elementos del array en posiciones de memoria contínua

Tener un único nombre de variable que representa a todos los elementos, y éstos a su vez se diferencían por un índice o subíndice.

Acceso directo o aleatorio a los elementos individuales del array.
Los arrays se clasifican en :

Unidimensionales (vectores o listas)
Multidimensionales ( tablas o matrices)


El formato para definir un tipo array es :

nombre_array = array [tipo subíndice] of tipo
nombre_array   identificador válido
tipo subíndice puede ser de tipo ordinal:
     boolean o char, un tipo
               enumerado o un tipo subrango.
               Existe un elemento por cada
               valor del tipo subíndice
tipo           describe el tipo de cada elemento
               del vector; todos los elementos
               de un vector son del mismo tipo
Las variables de tipo array se declaran en la sección Var o Type.



Declaración en Var:

Var
  nombres   : array[1..30] of string[30];
  calif     : array[1..30] of real;
  numero    : array[0..100] of 1..100;
Declaración en Type:

Type
  nombres   : array[1..30] of string[30];
  calif     : array[1..30] of real;
  numero    : array[0..100] of 1..100;
Var
  nom       : nombres;
  califica  : calif;
  num       : numero;
Arrays unidimensionales

Un array de una dimensión (vector o lista) es un tipo de datos estructurado compuesto de un número de elementos finitos, tamaño fijo y elementos homogéneos.

Supongamos que desea conservar las edades de 10 personas. Para almacenar estas edades se necesita reservar 10 posiciones de memoria, darle un nombre al array, y a cada persona asignarle su edad correspondiente.





Nombre del vector  edades
Subíndice          [1],[2],...
Contenido          edades[2]= 28
Ejemplo:

Program Vector_edades;
 {El siguiente programa captura  20 edades
  y las muestra en forma ascendente por medio
  de arrays}
Uses Crt;
Const
  MaxPersonas = 10;
Var
  edades   : array [1..MaxPersonas] of byte;
  i,j,paso : byte;
begin
  ClrScr;
  {lectura de array}
  for i:=1 to MaxPersonas do
  begin
    gotoxy(10,5);
    ClrEol;
    Write('Edad de la ',i,' persona : ');
    ReadLn(edades[i])
  end;
  {ordenación}
  for i:=1 to MaxPersonas-1 do
    begin
      for j:=i+1 to MaxPersonas do
        begin
          if edades[i]>edades[j] then
            begin
              paso     :=edades[i];
              edades[i]:=edades[j];
              edades[j]:=paso
            end
        end;
      WriteLn(edades[i]) {escritura del array}
    end;
   Readkey
end.
Arrays paralelos

Dos o más arrays que utilizan el mismo subíndice para referirse a términos homólogos se llaman arrays paralelos.

Basados en el programa anterior se tienen las edades de 'x' personas, para saber a que persona se refiere dicha edad se puede usar otro arreglo en forma paralela y asociarle los nombres de manera simultánea con las edades.





Ejemplo:

Program Paralelo_edades;
 {El siguiente programa captura 10 edades
  y nombres por medio de arrays paralelos y
  los muestra ordenados en forma ascendente}
Uses Crt;
Const
  MaxPersonas = 10;
Var
  edades       :array [1..MaxPersonas] of byte;
  nombres      :array [1..MaxPersonas] of string [10];
  aux_nom      :string[10];
  i,j,aux_edad :byte;
begin
  ClrScr;
  {lectura de arrays paralelos de manera simultánea}
  for i:=1 to MaxPersonas do
    begin
      gotoxy(10,5);
      ClrEol;
      Write(i,'.- Nombre : ','Edad : ');
      gotoxy(23,5);ReadLn(nombres[i]) ;
      gotoxy(48,5);ReadLn(edades[i])
    end;
  {ordenación}
  for i:=1 to MaxPersonas-1 do
    begin
      for j:=i+1 to MaxPersonas do
        begin
          if edades[i]>edades[j] then
            begin
              aux_edad  :=edades[i];
              edades[i] :=edades[j];
              edades[j] :=aux_edad;
              aux_nom   :=nombres[i];
              nombres[i]:=nombres[j];
              nombres[j]:=aux_nom
            end
        end;
      WriteLn(nombres[i]:10,' ',edades[i]:3)
      {escritura de los arrays paralelos}
    end;
  Readkey
end.
Arrays bidimensionales (tablas)

Un array bidimensional (tabla o matríz) es un array con dos índices, al igual que los vectores que deben ser ordinales o tipo subrango.



Para localizar o almacenar un valor en el array se deben especificar dos posiciones (dos subíndices), uno para la fila y otro para la columna.

Formato:

identificador = array [índice1, indice 2] of tipo de elemento
identificador = array [ índice 1 ] of array [ indice 2 ] of tipo de elemento
Supongase que se desea almacenar las calificaciones de 5 alumnos obtenidas en 3 examenes y mostrar en orden ascendente sus promedios respectivamente. En este caso se usará un array bidimensional (tabla o matríz) de 5 filas y 4 columnas en la cual se almacenará las calificaciones de 3 examenes en 3 columnas y la cuarta columna se utilizará para almacenar su promedio respectivo, además de un array unidimensional (vector) donde en forma paralela se almacenarán los nombres de los alumnos de la siguiente forma :



Ejemplo:

Program Matriz_Vector;
 {El siguiente programa captura las calificaciones
 de 5 alumnos en 3 examenes, y despliega en pantalla
 los promedios ordenados en forma descendente }
Uses Crt;
Const
  MaxAlumno = 5;
  MaxExamen = 4;{Columna 4 almacena el promedio}
Var
  Alumno     :array[1..MaxAlumno]              of string[10];
  examen     :array[1..MaxAlumno,1..MaxExamen] of real;
  aux_examen :array[1..MaxExamen]              of real;
{reserva 20 posiciones de memoria de datos reales :
5 filas por 4 columnas}
  promedio     :real;
  aux_alumno   :string [10];
  i,j,col,ren  :byte;
begin
  ClrScr;
  {lectura de arrays paralelos de manera simultánea}
  gotoxy(5,5);Write('Nombre');
  gotoxy(20,5);Write('Examen1 Examen2 Examen3 Promedio');
  col:=5;ren:=6;
  for i:=1 to MaxAlumno do
    begin
      gotoxy(col,ren);
      ReadLn(alumno[i]); {lectura de vector}
      col:=22;promedio:=0;
      for j:=1 to MaxExamen-1 do
        begin
          gotoxy(col,ren);
          ReadLn(examen[i,j]); {lectura de matríz}
          promedio:=promedio+examen[i,j];
          col:=col+10
        end;
      examen[i,j+1]:=promedio/3;
      gotoxy(col,ren);Write(promedio/3:3:2);
      inc(ren);
      col:=5
    end;
  {ordenación}
  for i:=1 to MaxAlumno-1 do
  for j:=i+1 to MaxAlumno do
    begin
      if examen[i,MaxExamen]<examen[j,MaxExamen] then
        begin
          {intercambio de nombres en vector}
          aux_alumno:=alumno[i];
          alumno[i] :=alumno[j];
          alumno[j] :=aux_alumno;
          {intercambio de calificaciones en matríz}
          move(examen[i],aux_examen,SizeOf(aux_examen));
          move(examen[j],examen[i],SizeOf(aux_examen));
          move(aux_examen,examen[j],SizeOf(aux_examen))
        end
    end;
  {recorrido de matríz y vector}
  gotoxy(25,14);Write('Datos ordenados');
  gotoxy(5,16);Write('Nombre');
  gotoxy(20,16);Write('Examen1 Examen2 Examen3 Promedio');
  col:=5;ren:=17;
  for i:=1 to MaxAlumno do
    begin
      gotoxy(col,ren);
      Write(alumno[i]);
      col:=22;
      for j:=1 to MaxExamen do
        begin
          gotoxy(col,ren);
          Write(examen[i,j]:3:2);
          col:=col+10
        end;
      col:=5;
      inc(ren)
    end;
  readkey
end.

Arrays multidimensionales

Turbo Pascal no limita el número de dimensiones de un array, pero sí que debe estar declarado el tipo de cada subíndice.

Formato :



identificador = array [índice1] of array [índice 2]..
of array [índice n] of tipo de elemento
identificador = array [índice 1, índice 2,...,índice n] of tipo de elemento
Ampliando el ejemplo anterior supongase que ahora deseamos capturar calificaciones para 3 materias en cuyo caso aplicaremos un array tridimensional. De la siguiente forma :



(nombre,examen,materia)

Ejemplo:

Program Tridimensional;
 {El siguiente programa captura calificaciones
 de 5 alumnos en 3 examenes de 3 materias
 distintas, y despliega en pantalla los promedios
 ordenados en forma descendente }
Uses Crt;
Const
  MaxAlumno  = 5;
  MaxExamen  = 4; {Columna 4 almacena el promedio}
  MaxMateria = 3;
  materia    : array[1..3]of string[8]=('Fisica','Ingles','Historia');
Var
  Alumno     : array [1..MaxAlumno] of string[10];
  examen     : array [1..MaxAlumno,1..MaxExamen,1..MaxMateria] of real;
  aux_examen : array [1..MaxExamen]of real;
  {reserva 60 posiciones de memoria de datos reales :
   5 filas por 4 columnas y 3 dimensiones}
  promedio   :real;
  aux_alumno :string [10];
  i,j,k,col,ren : byte;
begin
  ClrScr;
  {lectura de arrays paralelos de manera simultánea}
  for k:=1 to MaxMateria do
    begin
      ClrScr;
      gotoxy(34,3);Write(materia[k]);
      gotoxy(5,5);Write('Nombre');
      gotoxy(20,5);Write('Examen1 Examen2 Examen3 Promedio');
      col:=5;ren:=6;
      for i:=1 to MaxAlumno do
        begin
          gotoxy(col,ren);
          if k=1 then
            ReadLn(alumno[i]) {lectura de vector}
          else
            Write(alumno[i]);
          col:=22;promedio:=0;
          for j:=1 to MaxExamen-1 do
            begin
              gotoxy(col,ren);
              ReadLn(examen[i,j,k]); {lectura de matríz}
              promedio:=promedio+examen[i,j,k];
              col:=col+10
            end;
          examen[i,j+1,k]:=promedio/3;
          gotoxy(col,ren);Write(promedio/3:3:2);
          inc(ren);
          col:=5
        end;
      gotoxy(15,22);
      Write('Presione una tecla para continuar....');
      ReadKey
    end;
  {ordenación}
  for k:=1 to MaxMateria do
    for i:=1 to MaxAlumno-1 do
      for j:=i+1 to MaxAlumno do
        begin
          if examen[i,MaxExamen,k]<examen[j,MaxExamen,k] then
            begin
              {intercambio de nombres en vector}
              aux_alumno:=alumno[i];
              alumno[i] :=alumno[j];
              alumno[j] :=aux_alumno;
              {intercambio de calificaciones en matríz}
              move(examen[i,k],aux_examen,SizeOf(aux_examen));
              move(examen[j,k],examen[i,k],SizeOf(aux_examen));
              move(aux_examen,examen[j,k],SizeOf(aux_examen))
            end
        end;
  {recorrido de matríz y vector}
  for k:=1 to MaxMateria do
    begin
      ClrScr;
      gotoxy(35,4);Write(materia[k]);
      gotoxy(25,5);Write('Datos ordenados');
      gotoxy(5,6);Write('Nombre');
      gotoxy(20,6);Write('Examen1 Examen2 Examen3 Promedio');
      col:=5;ren:=7;
      for i:=1 to MaxAlumno do
        begin
          gotoxy(col,ren);
          Write(alumno[i]);
          col:=22;
          for j:=1 to MaxExamen do
            begin
              gotoxy(col,ren);
              Write(examen[i,j,k]:3:2);
              col:=col+10
            end;
          col:=5;
          inc(ren)
        end;
      gotoxy(15,22);
      Write('Presione una tecla para continuar....');
      readkey
    end
end.

No hay comentarios:

Publicar un comentario