Está en la página 1de 23

ADP 2013

Arreglos
1

Arreglos
Un tipo de dato Arreglo (array) es una coleccin ordenada e indexada de elementos, con las siguientes caractersticas: Todos los elementos son del mismo tipo, por eso es una estructura de datos homognea.

Los elementos o componentes pueden recuperarse en cualquier orden, indicando su posicin, por eso es una estructura de datos indexada.

La memoria ocupada durante la ejecucin del programa es fija, por eso se dice que es una estructura de datos esttica.

Arreglos - Vector y Matriz


Arreglo de una dimensin: Se denomina h o l a

Vector
Vector con espacio para 6 caracteres

Arreglo de dos dimensiones: Se denomina


23 789
78 54

Matriz
Matriz con 6 filas y 3 columnas, de enteros.

6 67
222 2

45 7
6 6423

34
23

33
454

876
234

VECTOR - Declaracin de tipo


Se pueden declarar vectores de: boolean, integer, real, char, registro. Declaracin de tipo vector: nombre = Array [ rango ] of tipo;

Un tipo permitido previamente definido

Rango no nulo, de un tipo ordinal. Ejemplo: a.. z

VECTOR - Acceso a los elementos


Acceso directo: Los elementos de un arreglo se acceden mediante la especificacin de un ndice para cada dimensin, que indican la posicin a acceder.

Ejemplo:
Hacer un mdulo que cargue todo un arreglo de 10 enteros, leyendo valores de teclado. type vector = array [1..10] of integer; procedure Cargar (var v:vector); var i: integer; begin for i: = 1 to 10 do readln (v[i]) ; end;
Si la variable/parmetro vector se llama v, accedo a la posicin i haciendo v[ i ]

v[ i ] ser del tipo de dato que contiene el vector. Qu operaciones puedo hacer con v[i]?

VECTOR - Dimensin fsica y lgica


La dimensin fsica es la que se le asign al vector en su declaracin. La dimensin lgica indica la posicin del ltimo elemento que se carg en el vector, y debe controlarla el programador a medida que agrega/quita elementos.
Type ejemplo = Array [1..9] of integer; Var Cul es la dimensin fsica del arreglo a? a: ejemplo; 9 dl: integer; begin Cul es la dimensin lgica del arreglo a? dl:=0; 7 A continuacin, cargo 7 valores en a

? ? ? ? 8 ? 5 ? 7 ? 5 ?5 ? 3 9
1 2 3 4 5 6 7 8 9

posiciones

VECTOR - Ejercicio 1
Se leen el Nros de alumnos que pueden presentarse a rendir un final de ADP. Los datos se leen hasta que llegue el nro. de alumno igual a 0.

A lo sumo pueden presentarse 40 alumnos a rendir por mesa.


Una vez realizada la carga se pide :
a) Informar las posiciones en que se encuentran los nro de alumno mltiplos de 3.

Por qu almacenar en vector?

Cul es la condicin de fin de carga? Cul es la condicin de fin de procesamiento, luego de la carga ?

Porque conocemos la cantidad maxima de informacin total que puede llegar a venir. Adems los clculos deben hacerse una vez finalizada la carga. Que venga un 0 (cero) o que lleguen 40 elementos Que alcance la dimensin lgica
7

VECTOR - Ejercicio 1
Program Nros; type alumnos = array [ 1..40 ] of integer; var alus : alumnos; dimlog : integer; nroAlu: integer {Procedures} begin Cargar(alus,dimlog); Informar(alus,dimlog); End.

VECTOR - Ejercicio 1
procedure cargar (var alus: alumnos; var dimlog: integer) var nroalu : integer; begin dimlog:= 0;

read(nroalu);
while (nroalu <> 0) and (dimlog < 40) do begin dimlog := dimlog + 1;

alus[ dimlog ] := nroalu;


read(nroalu); end;
9

end;

VECTOR - Ejercicio 1
procedure informar (alus: alumnos; dimlog: integer)
var i: integer;

begin
for i:=1 to dimlog do begin if (alus[i] mod 3 = 0) then writeln (Nro. Alumno multiplo de tres en posicin: , i); end; end;

10

VECTOR - Ejercicio 2
Hacer un proceso que lea una secuencia de nmeros enteros terminada en -1. Informar la cantidad de veces que aparece cada dgito del 0 al 9 entre todos los nmeros ledos. Ejemplo: se leen los nmeros: 457 9875 5 24879 -1
{Se debe informar por cada digito cuantas veces aparecieron cada uno de ellos} 0 aparece 0 veces; 1 aparece 0 veces; 2 aparece 1 veces; 3 aparece 0 veces; 4 aparece 2 veces; 5 aparece 3 veces; 6 aparece 0 veces; 7 aparece 3 veces; 8 aparece 2 veces; 11 9 aparece 2 veces;

VECTOR - Ejercicio 2
Anlisis del enunciado
Debo almacenar los nmeros ledos? Cmo calculo cuntas veces se ingres cierto dgito? Entonces declaro diez variables separadas de tipo entero? No!! Eso no lo pide el enunciado.

Necesito 10 contadores, uno para cada dgito.

NO !!!

Cmo hago entonces?

Defino una nica variable de tipo arreglo con rango entre 0 y 9 (cada posicin es un contador)

VECTOR - Ejercicio 2
Program Digitos; type numeros = array [0..9] of integer; var losnros : numeros; num: integer; Necesito en este ejercicio begin llevar una dimensin lgica? inicializar (losnros); Por qu? read (num); while (num <> -1) do begin descomponer (losnros, num); read (num); end; informo(losnros ); end.

13

VECTOR - Ejercicio 2
procedure inicializar (var a: numeros ); var i: integer; begin for i:= 0 to 9 do a[i]:= 0; End.

14

VECTOR - Ejercicio 2
procedure descomponer(var a: numeros; num:integer); var resto: 0..9; begin If (num = 0) then Por qu tomo este caso aparte? a[0]:= a[0] + 1 else while (num <> 0) do begin Obtengo el ltimo dgito de num resto:= num mod 10; a[resto]:= a[resto] + 1; num:= num div 10; Incremento uno ms en la end; posicin del arreglo end;
indicada por el resto Achico num

VECTOR - Ejercicio 2
procedure informo ( a: numeros ); Var i: integer; begin for i:= 0 to 9 do writeln(i, = ,a[i]); End.

16

MATRIZ - Acceso a los elementos


Una matriz es un arreglo de dos dimensiones. Acceso directo: Para acceder un elemento, tengo que indicar la fila y la columna en la que se encuentra.
Ejemplo declaracin matriz:
Un tipo permitido previamente definido

matriz= array [rango1,rango2] of tipo;


Rangos no nulos, de un tipo ordinal. Ejemplo: a.. z y 1..10

Acceso a elementos (especificar fila y columna) type M[2,c], accedo al matriz = array [1..10,a..z] of integer; elemento que esta en fila 2, Var columna c m: matriz

MATRIZ Ejercicio
Una empresa de electricidad necesita facturar el consumo de los usuarios. La empresa dispone de una tabla donde para cada categora de usuario (1..4) y tipo de consumo (1..3) se tiene el precio por kw.
Consumo Usuario

1
Prec11 Prec21 Prec31 Prec41

2
Prec12 Prec22 Prec32 Prec42

3
Prec13 Prec23 Prec33 Prec43

1 2 3 4

Un empleado ingresa la informacin de cada usuario (nro. de usuario, categora, tipo de consumo y el consumo real), hasta que ingresa el nro. de usuario 0. Se pide : Calcular e informar el monto a pagar por cada usuario (el monto se calcula multiplicando el precio por kw para este usuario y el consumo real).

Informar el monto facturado para cada tipo de usuario.

18

MATRIZ - Estructuras
Cmo represento la tabla con la informacin de la empresa?
Matriz, las filas varan de 1 a 4 (categora usuario), las columnas varan de 1 a 3 (tipo de consumo) Registro El enunciado NO dice que cargue los usuarios y luego procese. Por lo tanto: cuando leo un usuario lo proceso. Uso NO NO, un vector USO 4 con VARIABLES, 4 posiciones ya que como los tipos de usuario acumulador. Aprovecho podran el acceso ser 100!! del vector. directo

Cmo represento cada usuario? Necesito poner a los usuarios en una estructura?

19

Cmo informo el monto facturado para cada tipo de usuario? Uso 4 variables para contar?

Program uno; CONST MAXUSU = 4; MAXCONS = 3; Type TipoUsuario = 1..MAXUSU; TipoConsumo = 1..MAXCONS;

MATRIZ - Ejercicio

Tabla = array [TipoUsuario, TipoConsumo] of real; Tipos = array [TipoUsuario] of real; Usuario = record numero:integer; cat:TipoUsuario; tipoCon:TipoConsumo; consumo:integer; End; 20 {Procedimientos y funciones}

MATRIZ - Ejercicio
VAR precios: tabla; montos: tipos; u : usuario; a_pagar: real; BEGIN LlenarPrecios (precios); //NO hay que implementarlo, SE DISPONE InicializarMontos (montos); Leer (u); While (u.numero <> 0) do begin a_pagar := precios[u.cat, u.tipoCon] * u.consumo; write (el usuario debe pagar, a_pagar); montos[u.cat] := montos[u.cat] + a_pagar; Leer (u); End; ImprimirRecaudacin (montos); END.

21

MATRIZ - Ejercicio
procedure inicializarMontos (var m: tipos); var i: TipoUsuario; begin for i:= 1 to MAXUSU do m[i]:= 0; end; procedure leer (var r: usuario); begin read (r.numero); if (r.numero <> 0) then begin read (r.cat); read (r.tipoCon); read (r.consumo); end; end;

22

MATRIZ - Ejercicio
procedure imprimirRecaudacion (m: tipos) var i: TipoUsuario; begin for i:= 1 to MAXUSU do write (Para el tipo de usuario ,i, se recaud: , m[i]); end;

23