Download Explicacion ArreglosI

Document related concepts
no text concepts found
Transcript
Programación I - 2011
Arreglos
Arreglo (Array)
Es una colección ordenada e indexada de
elementos.
Ejemplo
A
Indices
34
123
1
2
99
3
454
222
98
34
12
1
66
4
5
6
7
8
9
10
Los elementos de un arreglo son todos del mismo
tipo de dato (todos integer o real o char o registros o
aún arreglos) por lo tanto se denomina estructura de
datos “homogénea”.
Declaración
type
vector = array [Rango] of tipo_de_dato;
Integer
Char
enumerativo
Integer
Real
Char
Boolean
String
Registro
Array
var
v: vector
A los elementos se los accede directamente, indicando simplemente
su posición, por eso es una “estructura de datos indexada” y de
“acceso directo”.
Asignación de valores
v [1] := 5;
v [1] := 5;

Read( v[1] );
En la posición 1 del arreglo v se almacena el número 5.
V
5
1
2
3
4
5
6
7
8
9
10
Read( v[1] );  Se lee un dato desde teclado y se almacena en la
posición 1.
La memoria ocupada durante la ejecución del programa es fija, por
eso se dice que es una “estructura de datos estática”.
Un arreglo con un sólo índice se denomina “vector”. Con dos índices,
se lo denomina “matriz”.
Dimensión Física y Lógica
V
V
5
?
?
?
?
?
?
?
?
?
1
2
3
4
5
6
7
8
9
10
5
34
80
?
?
?
?
?
1
2
3
4
5
6
7
8
Dimensión física: 10
Dimensión lógica: 1
Dimensión física: 8
Dimensión lógica: 3
Declaración
type
vector = array [1..5] of integer;  Dimensión Física 5
var
v: vector ;
dimLog: integer ;  Dimensión Lógica
begin
DimLog:= 0;
…
end.
 Inicialización de la Dimensión Lógica en 0, pues aún no posee elementos.
Enunciado de ejemplo
Realizar un programa que lea números hasta que
llegue el número 0 (como máximo 100). Una vez
realizada la carga:
• Informar las posiciones en que se encuentran los
números múltiplos de 3.
• Informar la cantidad de números pares.
Solución propuesta
program Arreglos;
type
vectorNumeros = array [1..100] of integer;
var
Si no sabemos la cantidad de
v : vectorNumeros;
elementos que contendrá un
dimLog: integer;
arreglo siempre trabajaremos
con su dimensión lógica
begin {PROGRAMA PRINCIPAL}
llenarVector (v , dimLog);
realizarInforme(v, dimLog);
end.
procedure llenarVector (var v: vectorNumeros; var dimLog: integer);
var
num: integer;
begin
dimLog := 0;
write(‘Ingrese un Número: ');
readln(num);
while (num <> 0) and (dimLog < 100) do begin
dimLog := dimLog + 1;
Es responsabilidad del
v[dimLog]:= num;
programador mantener
write(‘Ingrese un número: ');
actualizado el valor de la
dimensión lógica
readln(num);
end;
end;
function esPar (a: integer ): Boolean;
begin
esPar := (a mod 2 = 0);
end;
procedure realizarInforme (v: vectorNumeros; dimLog: integer);
var
Usamos la dimensión
i, cantPar: integer;
lógica para recorrer el
begin
vector solo hasta la
cantPar:= 0;
posición que contiene
for i:= 1 to dimlog do begin
elementos
if (v[i] mod 3 = 0 ) then
writeln('En la posición ', i, ' hay un numero múltiplo de 3');
if (esPar(v[i])) then
cantPar:= cantPar + 1;
end;
writeln ('La cantidad de números pares es: ', cantPar);
end;
Enunciado de ejemplo
Se lee la información del personal administrativo de la
Facultad de Informática y se sabe que son exactamente 50
personas. De cada persona se lee la siguiente información:
Apellido, Nombre, DNI y Fecha de Nacimiento. Una vez
cargado todo el personal informar:
• Cantidad de personas que posean DNI con mayor cantidad
de dígitos pares que impares.
• Apellido de aquellas personas que cumplen años en el mes
de enero.
Solución propuesta
program ejercicio2;
El uso de la constante
const
nos ayuda en el
dim = 50;
mantenimiento
type
fecha = record
La fecha de nacimiento
dia : 1..31;
debe ser un registro
mes : 1..12;
pues el enunciado nos
anio: 1900..2005; pide informar datos
referentes solo al mes
end;
persona = record
apellido : string[20];
nombre : string[20];
DNI
: integer;
fecha_nac: fecha;
end;
personas = array [1..dim] of persona;
Var
vp: personas;
begin {PROGRAMA PRINCIPAL}
llenarVector (vp);
realizarInforme(vp);
end.
procedure llenarVector (var vp: personas);
var
p: persona;
i: integer;
begin
for i := 1 to dim do begin
writeln('----Ingrese los datos de una persona----');
leerPersona(p); Recordar: Siempre que cargamos los datos
de un registro usamos un módulo para
vp[i] := p;
hacerlo.
end;
end;
procedure leerPersona (var p: persona);
begin
write(‘Ingrese Apellido: ');
readln(p.apellido);
write(‘Ingrese Nombre: ');
readln(p.nombre);
write(‘Ingrese D.N.I.: ');
readln(p.DNI);
writeln(‘Ingrese fecha de nacimiento');
leerFecha(p.fecha_nac);
end;
procedure leerFecha (var f:fecha);
begin
write(‘Ingrese el día: ');
readln(f.dia);
write(‘Ingrese el mes: ');
readln(f.mes);
write(‘Ingrese el año: ');
readln(f.anio);
end;
Usamos un proceso aparte para
cargar los datos que componen
una fecha para que sea mas
claro.
procedure realizarInforme (vp: personas);
var
i, cant_par, cant_impar, cantPersonas: integer;
begin
Accedemos a los datos de una
persona campo a campo usando el
cantPersonas:= 0;
operador ¨.¨
for i:= 1 to dim do begin
desglosarNumero (vp[i].DNI, cant_par, cant_impar);
if (cant_par > cant_impar) then
cantPersonas := cantPersonas + 1;
if (vp[i].fecha_nac.mes = 1 ) then
writeln('La persona ', vp[i].apellido, ' cumple años en enero');
end;
writeln ('La cantidad de personas es: ', cantPersonas);
end;
function esPar (a: integer ): Boolean;
begin
esPar := (a mod 2 = 0);
end;
procedure desglosarNumero
(n: integer; var cp: integer;
var ci: integer);
var
dig: integer;
begin
cp := 0;
ci := 0;
while (n <> 0) do begin
dig := n mod 10;
if (esPar(dig)) then
cp := cp + 1
else
ci := ci + 1;
n := n div 10;
end;
end;
¿Preguntas?