Matrices y Arreglos Multidimensionales.
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 :

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.
|