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