BotonMenu
BotonIndice

Visita : http://www.conoce3000.com
Paypal : https://www.paypal.me/conoce3000/1

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL

PASCAL CON FREE PASCAL


13. LISTAS Y COLECCIONES.
13.6. AGREGACIÓN Y COMPOSICIÓN DE LISTAS Y COLECCIONES.
13. LISTAS Y COLECCIONES.
13.6. AGREGACIÓN Y COMPOSICIÓN DE LISTAS Y COLECCIONES.
13. LISTAS Y COLECCIONES.
13.6. AGREGACIÓN Y COMPOSICIÓN DE LISTAS Y COLECCIONES.

SIGUIENTE

SIGUIENTE

SIGUIENTE


‒ 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




SIGUIENTE
SIGUIENTE
SIGUIENTE



 
‒ Comentarios y sugerencias.

Agradezco de antemano, todo comentario, sugerencia, y donativo (a través de Paypal me), que ayude a mejorar los contenidos educativos de Conoce 3000. Además, cualquier pregunta o duda que tengas lo puedes hacer por este medio. Pero, todo contenido que pueda resultar ofensivo, malicioso, racista, sexista, discriminatorio, obsceno, vulgar será eliminado.


Comments System WIDGET PACK






PORTADA |  INTERESANTE |  APUNTES |  LIBROS |  GALERIA


Creative Commons License


Todos los textos, imágenes y videos de Conoce3000 estan colocados bajo una licencia : Creative Commons Reconocimiento-NoComercial 3.0 Unported License.