‒ Agregación y composición de listas y colecciones.
Debemos recordar que una agregación es cuando una clase forma parte de otra clase, y el objeto que se crea de la clase que pertenece a la clase contenedora, es creado desde fuera. En una composición sucede lo contrario la instancia es creado desde dentro, es decir al crear la instancia u objeto de la clase contenedora se crean los objetos de la clase que forman parte de la clase contenedora.
La clase TCollecction es una clase que tiene como atributo a una clase TList, lo que hace que se forme una composición, es decir TCollection tiene una relación de composición con Tlist.
En este capítulo implementaremos dos ejemplos de como usar las clases TList y TCollection, en una agregación y en una composición. Se usará el ejemplo de las tablas de frecuencias visto en el capitulo 12.3.
‒
Descargar
{$codepage utf8}
{$mode objfpc}
Uses sysutils,classes;
Type
TTablaFrecuencias = class
class var
i:longint;
var
ni,hi,NiMenorQ:TList;
Tni,Thi:double;
cantidad:longint;
Constructor Crear(n:longint;a,b,c:Tlist);
Procedure Lectura;
Procedure Calculos;
Procedure Mostrar;
End;
Constructor TTablaFrecuencias.Crear(n:longint;a,b,c:Tlist);
Begin
ni:=a;
hi:=b;
NiMenorQ:=c;
cantidad:=n
End;
Procedure TTablaFrecuencias.Lectura;
var aux:^double;
Begin
for i:=0 to cantidad-1 do
Begin
new(aux);
Write('ni[',i,'] ');
readln(aux^);
ni.add(aux);
Tni:=Tni+double(ni[i]^);
new(aux);aux^:=0;hi.add(aux);
new(aux);aux^:=0;NiMenorQ.add(aux)
End;
End;
Procedure TTablaFrecuencias.Calculos;
var aux:pointer;
Begin
for i:= 0 to cantidad-1 do
Begin
double(hi[i]^):=double(ni[i]^)/Tni;
Thi:=Thi+double(hi[i]^);
End;
double(NiMenorQ[0]^):=double(ni[0]^);
for i:=1 to cantidad-1 do
double(NiMenorQ[i]^):=double(NiMenorQ[i-1]^)+double(ni[i]^);
End;
Procedure TTablaFrecuencias.Mostrar;
Begin
Writeln(' ni hi Ni');
for i:=0 to cantidad-1 do
Writeln(' ',double(ni[i]^):10:2,double(hi[i]^):10:2,double(NiMenorQ[i]^):10:2);
Writeln;
Writeln('Total ',tni:5:2,thi:10:2)
End;
Var TablaFrecuencias:TTablaFrecuencias;
ni,hi,NiMenorQ:Tlist;
n:longint;
Begin
Write('Ingrese numero de datos : ');readln(n);
ni:=Tlist.Create;
hi:=Tlist.Create;
NiMenorQ:=Tlist.Create;
TablaFrecuencias:=TTablaFrecuencias.Crear(n,ni,hi,NiMenorQ);
TablaFrecuencias.Lectura;
TablaFrecuencias.Calculos;
TablaFrecuencias.Mostrar;
ni.destroy;
hi.destroy;
NiMenorQ.destroy;
TablaFrecuencias.destroy;
End.
Código fuente 20: Ejemplo de agregacion con listas.
Descargar
En este ejemplo, tal como se puede observar las instancias ni,hi,NiMenorQ son de la clase TList, estas deben ser creadas antes de crear la instancia TablaFrecuencias. Otra observación importante es que al momento de hacer la lectura de las frecuencias es necesario ir añadiendo los elementos de las listas hi y NiMenorQ, ya que un TList no es como un arreglo dinámico.
En el caso de hacer una composición de el ejemplo anterior, lo único que se tendría que hacer es cambiar el constructor y crear las instancias ni,hi,NiMenorQ, dentro del cosntructor y el resto del código fuente quedaría igual.
‒
Descargar
{$codepage utf8}
{$mode objfpc}
Uses sysutils,classes;
Type
TTablaFrecuencias = class
class var
i:longint;
var
ni,hi,NiMenorQ:TList;
Tni,Thi:double;
cantidad:longint;
Constructor Crear(n:longint);
Procedure Lectura;
Procedure Calculos;
Procedure Mostrar;
Destructor destroy;override;
End;
Constructor TTablaFrecuencias.Crear(n:longint);
Begin
ni:=Tlist.create;
hi:=Tlist.create;
NiMenorQ:=TList.create;
cantidad:=n
End;
Procedure TTablaFrecuencias.Lectura;
var aux:^double;
Begin
for i:=0 to cantidad-1 do
Begin
new(aux);
Write('ni[',i,'] ');
readln(aux^);
ni.add(aux);
Tni:=Tni+double(ni[i]^);
new(aux);aux^:=0;hi.add(aux);
new(aux);aux^:=0;NiMenorQ.add(aux)
End;
End;
Procedure TTablaFrecuencias.Calculos;
Begin
for i:= 0 to cantidad-1 do
Begin
double(hi[i]^):=double(ni[i]^)/Tni;
Thi:=Thi+double(hi[i]^);
End;
double(NiMenorQ[0]^):=double(ni[0]^);
for i:=1 to cantidad-1 do
double(NiMenorQ[i]^):=double(NiMenorQ[i-1]^)+double(ni[i]^);
End;
Procedure TTablaFrecuencias.Mostrar;
Begin
Writeln(' ni hi Ni');
for i:=0 to cantidad-1 do
Writeln(' ',double(ni[i]^):10:2,double(hi[i]^):10:2,double(NiMenorQ[i]^):10:2);
Writeln;
Writeln('Total ',tni:5:2,thi:10:2)
End;
Destructor TTablaFrecuencias.destroy;
Begin
inherited;
ni.destroy;
hi.destroy;
NiMenorQ.destroy
End;
Var TablaFrecuencias:TTablaFrecuencias;
n:longint;
Begin
Write('Ingrese numero de datos : ');readln(n);
TablaFrecuencias:=TTablaFrecuencias.Crear(n);
TablaFrecuencias.Lectura;
TablaFrecuencias.Calculos;
TablaFrecuencias.Mostrar;
TablaFrecuencias.destroy;
End.
Código fuente 21: Ejemplo de composición con listas.
Descargar
El código fuente que viene a continuación es una composición usando la clase Tcollection para las instancias ni,hi,NiMenorQ, en este caso se hace necesario la creación de una clase TDouble, que servirá para la creación de los objetos de la colección.
‒
Descargar
{$codepage utf8}
{$mode objfpc}
Uses sysutils,classes;
Type
TDouble = class(TCollectionItem)
public
n:double;
End;
TTablaFrecuencias = class
class var
i:longint;
var
ni,hi,NiMenorQ:TCollection;
Tni,Thi:double;
cantidad:longint;
Constructor Crear(n:longint);
Procedure Lectura;
Procedure Calculos;
Procedure Mostrar;
Destructor destroy;override;
End;
Constructor TTablaFrecuencias.Crear(n:longint);
Begin
ni:=TCollection.create(TDouble);
hi:=TCollection.create(TDouble);
NiMenorQ:=TCollection.create(TDouble);
cantidad:=n
End;
Procedure TTablaFrecuencias.Lectura;
Begin
for i:=0 to cantidad-1 do
Begin
Write('ni[',i,'] ');
ni.add;
readln(TDouble(ni.items[i]).n);
Tni:=Tni+TDouble(ni.items[i]).n;
hi.add;TDouble(hi.items[i]).n:=0;
NiMenorQ.add;TDouble(NiMenorQ.items[i]).n:=0
End;
End;
Procedure TTablaFrecuencias.Calculos;
Begin
for i:= 0 to cantidad-1 do
Begin
TDouble(hi.items[i]).n:=TDouble(ni.items[i]).n/Tni;
Thi:=Thi+TDouble(hi.items[i]).n
End;
TDouble(NiMenorQ.items[0]).n:=TDouble(ni.items[0]).n;
for i:=1 to cantidad-1 do
TDouble(NiMenorQ.items[i]).n:=TDouble(NiMenorQ.items[i-1]).n+TDouble(ni.items[i]).n;
End;
Procedure TTablaFrecuencias.Mostrar;
Begin
Writeln(' ni hi Ni');
for i:=0 to cantidad-1 do
Writeln(' ',Tdouble(ni.items[i]).n:10:2,Tdouble(hi.items[i]).n:10:2,
Tdouble(NiMenorQ.items[i]).n:10:2);
Writeln;
Writeln('Total ',tni:5:2,thi:10:2)
End;
Destructor TTablaFrecuencias.destroy;
Begin
inherited;
ni.destroy;
hi.destroy;
NiMenorQ.destroy
End;
Var TablaFrecuencias:TTablaFrecuencias;
n:longint;
Begin
Write('Ingrese numero de datos : ');readln(n);
TablaFrecuencias:=TTablaFrecuencias.Crear(n);
TablaFrecuencias.Lectura;
TablaFrecuencias.Calculos;
TablaFrecuencias.Mostrar;
TablaFrecuencias.destroy;
End.
Código fuente 22: Composición con colecciones.
Descargar