Conoce300 __ Pascal Con Free Pascal __ Listas y Colecciones __ Creando y Manejando Listas

download Conoce300 __ Pascal Con Free Pascal __ Listas y Colecciones __ Creando y Manejando Listas

of 8

description

,jb ,b,b

Transcript of Conoce300 __ Pascal Con Free Pascal __ Listas y Colecciones __ Creando y Manejando Listas

  • 15/10/2015 Conoce300::PascalconFreePascal::Listasycolecciones::Creandoymanejandolistas

    http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1302CreandoManejandoListas.php 1/8

    PASCALCONFREEPASCAL

    13.Listasycolecciones.

    13.2.Creandoymanejandolistas.anterior::indice::siguiente13.1.Introduccin.13.2.Creandoymanejandolistas.13.3.Creandoymanejandocolecciones.

    13.4.Excepcionesenlistasycolecciones.13.5.Generalizacindelistasycolecciones.13.6.Agregacinycomposicindelistasycolecciones.

    13.7.Polimorfismoenlistasycolecciones.13.8.Ordenandolistasycolecciones.

    LaslistastantoTListcomoTFPList,tienenlosmtodosypropiedadesnecesariosparasumanipulacincomosonaadir,insertar,borrarelementosdeunalistayotrosms.TListyTFPListsonclasesquepermitenenrealidadmanejaromanipularunarreglodepunteros.Enlasiguientetablaseexplicabrevementealgunosdeellos.

    Mtodo Descripcin

    Add Permiteaadirunpunteroalalista.

    Insert(i) Permiteinsertarunpunteroalalista,enlaposicinindicadapori

    Delete PoneaNilunpunterodelalista.

    Exchange(i,j) Permiteintercambiardospunterosdelalistaindicadosporiyj.

    Move(i,j) Permitemoverunpunterodelaposicinialaposicinindicadaporj,enlalista.

    First Permiteobtenerelprimerpunterodiferenteanildelalista.

    Last Permiteobtenerelltimopunterodiferenteanildelalista.

    Clear Borraslolalistadepunteros,peronolasvariablesdinmicasoobjetosalosqueapuntancadapunterodelalista.

    Pack Permiteliberarespacioocupadoporlospunterosdelalistaquetengannil.

    Items[i] Es unaatributo quenos permite acceder a un puntero de la lista indicadopor elindice i.La listasseenumeranempezandocon0.EsdecirelprimerelementodelalistaesItems[0].

    Capacity Esunatributoquenosindicalacantidaddepunterosquepuedeusarlalista.

    Count Esunatributoquenosindicalacantidaddepunterosquetienelalista.

    DebidoaqueTListyTFPListmanejanunarreglodepunteroscadavezquequeremosaccederaunodeloselementosdelalista,sedebehacerunsolapamientoconeltipodedatocorrespondiente.Ademssedebetenerpresentequeantesdeborrarunalistaodestruirunalista,sedebeborrartodaslasvariablesdinmicasalasqueapuntanlospunterosdelalista,yaquesinoestossequedarnocupandoespaciomientrasdurlaejecucindelprograma.Ejemplo:

    {$codepageutf8}{$modeobjfpc}USESsysutils,classes;VARListaN,ListaD:Tlist;n:^integer;d:^double;i:byte;BEGINrandomize;ListaN:=Tlist.create;ListaD:=Tlist.create;

    LENGUAJESDEPROGRAMACIN

    ThinfinityRemoteDesktopBestBrowserbasedHTML5RDP.AccessWindowsApps&Desktops.

  • 15/10/2015 Conoce300::PascalconFreePascal::Listasycolecciones::Creandoymanejandolistas

    http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1302CreandoManejandoListas.php 2/8

    FORi:=0TO10DOBEGINNEW(n);NEW(d);n^:=random(1000);d^:=random;ListaN.add(n);ListaD.add(d);END;

    Writeln('ListaN');Writeln('Capacidad=',ListaN.Capacity);Writeln('Cantidad=',ListaN.Count);

    FORi:=0TO10DOWriteln('[',i:2,']',integer(ListaN.items[i]^));

    Writeln('Borrando');//Sinousamosfreememparaeliminarlasvariablesdinmicas//nestaraapuntandoalaltimavariabledinmicacreada.FORi:=0TO10DOfreemem(ListaN.items[i]);

    //Ponelalistaanilylacantidada0ListaN.clear;ListaN.destroy;

    Writeln('ListaD');Writeln('Capacidad=',ListaD.Capacity);Writeln('Cantidad=',ListaD.Count);FORi:=0TO10DOWriteln('[',i:2,']',double(ListaD.items[i]^):0:3);

    Writeln('Borrando');//Sinousamosfreememparaeliminarlasvariablesdinmicas//destaraapuntandoalaltimavariabledinmicacreada.FORi:=0TO10DOfreemem(ListaD.items[i]);

    //Ponelalistaanilylacantidada0ListaD.clear;ListaD.destroy;

    END.

    Cdigofuente1:Creandoymanejandounlista.

    En el ejemplo anterior se crean dos listas una de nmeros enteros y la otro de nmeros reales, para eliminar las variablesdinmicassehaceusodefreememynodedispose,estoesdebidoaqueloselementosdelalistasonpunterossintipo,esdecirsondeltipopointer.Sideseamoshacerunalistadecadenadecaracteresdeltipoansistringounicodestring,debemoshacerunartificio,yaqueestostiposdedatosapesardeservariablesdinmicassecomportancomovariablesestticasde tipostring.Elartificioconsisteencrearunpunteroaunregistroquecontengaunacadenadecaracterescomounodesuscampos.Yelpunteroaregistroeselquesevacolocandoalalista.Ejemplo:

    {$codepageutf8}{$modeobjfpc}USESsysutils,classes;TYPETCad=RECORDcad:unicodestringEND;VARLista:Tlist;i:byte;Pcad:^TCad;BEGINrandomize;Lista:=Tlist.create;FORi:=0TO10DOBEGINNEW(Pcad);Pcad^.cad:='Numero'+IntToStr(random(1000));Lista.add(Pcad);END;FORi:=0TO10DOwriteln(TCad(Lista.items[i]^).cad);

    Writeln('Capacidad=',Lista.Capacity);Writeln('Cantidad=',Lista.Count);Writeln('Borrando');

    FORi:=0TO10DOfreemem(Lista.items[i]);

    Lista.clear;Lista.destroy

    END.

    Cdigofuente2:Listaconcadenadecaracteres.

    Debido a que una instancia o objeto de una clase en realidad es un puntero a una estructura que representa una clase, estostambinsepuedenusarconlistas,peroalmomentodeusarunaelementodelalistadebemoshacerelsolapamientoconeltipo

  • 15/10/2015 Conoce300::PascalconFreePascal::Listasycolecciones::Creandoymanejandolistas

    http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1302CreandoManejandoListas.php 3/8

    dedatodelaclase.Ejemplo:

    {$codepageutf8}{$modeobjfpc}USESsysutils,classes;

    TYPETPersona=CLASSNombre,Ciudad:string;PROCEDUREMostrarPersona;END;

    PROCEDURETPersona.MostrarPersona;BEGINWriteln('Nombre:',Nombre);Writeln('Ciudad:',Ciudad)END;

    VARLista:Tlist;rpta:char;i:byte;Persona:TPersona;aux:pointer;BEGINLista:=Tlist.create;

    REPEATPersona:=TPersona.create;Write('Nombre:');Readln(Persona.Nombre);Write('Ciudad:');Readln(Persona.Ciudad);Lista.add(Persona);Write('Deseacontinuar[S]i[N]o:');readln(rpta)UNTIL(rpta='N')OR(rpta='n');

    FORi:=0TOlista.Count1DOTPersona(Lista.items[i]).MostrarPersona;

    Writeln('Capacidad=',Lista.Capacity);Writeln('Cantidad=',Lista.Count);Writeln('Borrando');

    //Sinousamosdestroyparaeliminarlasinstancias//estasestarnocupandomemoriaRAMenlacomputadora.

    FORi:=0TOlista.Count1DOTPersona(Lista.items[i]).destroy;

    Lista.clear;Lista.destroyEND.

    Cdigofuente3:Listaconobjetos.

    Talcomosepuedeobservardelejemploanterior,nosepuedeusarfreememparaborrarlasinstanciasolosobjetoscolocadosenlalista,sedebeusareldestructorcorrespondientedelobjeto,queenestecasoesdestroy.Encualquiercasocuandosemanejanlistasysedebeneliminaralgnelementodelalistasedebeeliminaranteslavariabledinmicauobjetoalqueapuntaelpunterodelalista.Elsiguienteejemplomuestraelusodelosmtodosinsert,delete,exchange,move,first,lastypack.

    {$codepageutf8}{$modeobjfpc}USESsysutils,classes;

    TYPETCadenas=CLASSCad:ansistring;CONSTRUCTORcrear(ccad:ansistring);END;

    CONSTRUCTORTCadenas.crear(ccad:ansistring);BEGINcad:=ccadEND;

    VARLista:Tlist;i:byte;

    BEGINLista:=Tlist.create;FORi:=0TO10DOLista.add(TCadenas.crear('Numero'+intTostr(i)));

    FORi:=0TOlista.Count1DOWriteln('[',i:2,']',TCadenas(Lista.items[i]).cad);

    Writeln('========INSERTANDOEN5========');//insertaelelementoenlaposicin5,elqueseencuentraenesa//posicinsedesplazaalasiguiente

  • 15/10/2015 Conoce300::PascalconFreePascal::Listasycolecciones::Creandoymanejandolistas

    http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1302CreandoManejandoListas.php 4/8

    Lista.Insert(5,TCadenas.Crear('insertado'));

    Writeln('Capacidad=',Lista.Capacity);Writeln('Cantidad=',Lista.Count);

    FORi:=0TOlista.Count1DOWriteln('[',i:2,']',TCadenas(Lista.items[i]).cad);

    Writeln('========BORRANDO5========');//Sedebedestruirantesdeborrarelelementodelalista//Borraelelementoenlaposicin5,poneelpunteroanil,//noborraaloqueapuntaelpunteroolainstanciadeunaclase.

    TCadenas(Lista.items[5]).destroy;Lista.Delete(5);

    Writeln('Capacidad=',Lista.Capacity);Writeln('Cantidad=',Lista.Count);

    FORi:=0TOlista.Count1DOWriteln('[',i:2,']',TCadenas(Lista.items[i]).cad);

    Writeln('========INTERCAMBIANDO1con4========');Lista.Exchange(1,4);FORi:=0TOlista.Count1DOWriteln('[',i:2,']',TCadenas(Lista.items[i]).cad);

    Writeln('========MOVIENDO4a1========');Lista.Move(4,1);FORi:=0TOlista.Count1DOWriteln('[',i:2,']',TCadenas(Lista.items[i]).cad);

    Writeln('========MOVIENDO2a4========');Lista.Move(2,4);FORi:=0TOlista.Count1DOWriteln('[',i:2,']',TCadenas(Lista.items[i]).cad);

    Writeln('Elprimeroelementodelalistaes:',TCadenas(Lista.First).cad);Writeln('Elultimoelementodelalistaes:',TCadenas(Lista.Last).cad);

    Lista.PACK;Lista.destroyEND.

    Cdigofuente4:Usodeinsert,delete,exchange,move,first,lastypack.

    En este ejemplo para aadir los elementos a la lista se hace uso de una clase que contiene un constructor, que nos permitecolocar un contenido a la cadena de caracteres que la clase contiene. Cuando insertamos un puntero u objeto a la lista en laposicin indica loselementosapartirde laposicinsedesplazantodosa lasiguiente,ycomosepuedeobservaraleliminarunelementodelalistadebemosdeeliminarlavariabledinmicaoobjetoalqueapuntaelpuntero,yaquecuandoseusaelmtododelete,loquesehaceesponeranilelpuntero.Otros mtodos que tienen Tlist y TFPList son Extract, Remove y IndexOf, estos necesitan como parmetro un puntero, lasiguientetabladescribesufuncionamiento.

    Mtodo Descripcin

    Extrac(p) Coloca a nil el primer puntero p, que encuentre en la lista y devuelve el punteroencontradoparasuposterioruso.

    Remove(p) Colocaanilelprimerpunterop,queencuentreenlalistaydevuelvelaposicinendondefueencontrado,encasonoloencontrdevuelveun1.

    IndexOf(p) Busca el primer puntero p, que encuentre en la lista y devuelve la posicin endondefueencontrado,encasonoloencontrdevuelveun1.

    Aunque obviamente no es muy natural para el ser humano buscar punteros en una lista, estos mtodos se suelen usar parabuscarobjetosenlalista,ysesueleusarcuandohayvariaslistasysedeseasabersiunobjetoseencuentraenunalistaoenlaotra.Porejemploelmtodoextractdevuelveelobjetoencontrado(esdecirelpuntero),ysuusoposteriorpuedesercolocarloenotra lista,yenelcasodelmtodoRemove,quedevuelve laposicinendondeencontrelpunterosepuedeusarsimplementeparaborrarelobjetodelalistaporqueesteyaseencuentraenotralista.Ejemplo:

    {$codepageutf8}{$modeobjfpc}USESsysutils,classes;

    TYPETCadenas=CLASSCad:ansistring;CONSTRUCTORcrear(ccad:ansistring);END;

    CONSTRUCTORTCadenas.crear(ccad:ansistring);BEGINcad:=ccadEND;

    VARLista01,Lista02,Lista03:Tlist;aux:pointer;i:byte;BEGINLista01:=Tlist.create;Lista02:=Tlist.create;Lista03:=Tlist.create;

  • 15/10/2015 Conoce300::PascalconFreePascal::Listasycolecciones::Creandoymanejandolistas

    http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1302CreandoManejandoListas.php 5/8

    Writeln('=====LISTA01=====');Lista01.Add(TCadenas.crear('Juan'));Lista01.Add(TCadenas.crear('Jose'));Lista01.Add(TCadenas.crear('Miguel'));Lista01.Add(TCadenas.crear('Ana'));FORi:=0TOlista01.Count1DOWriteln('[',i:2,']',TCadenas(Lista01.items[i]).cad);

    Writeln('=====LISTA02=====');Lista02.Add(Lista01.items[2]);//MiguelLista02.Add(TCadenas.crear('Sofia'));Lista02.Add(TCadenas.crear('Mary'));Lista02.Add(Lista01.items[0]);//JuanFORi:=0TOlista02.Count1DOWriteln('[',i:2,']',TCadenas(Lista02.items[i]).cad);

    Writeln('=====LISTA03=====');Lista03.Add(Lista02.items[2]);//MaryLista03.Add(TCadenas.crear('Grace'));Lista03.Add(TCadenas.crear('Luis'));Lista03.Add(Lista01.items[0]);//JuanFORi:=0TOlista03.Count1DOWriteln('[',i:2,']',TCadenas(Lista03.items[i]).cad);

    Writeln('BuscandoaJuanenlalista02ylista03');aux:=Lista01.items[0];IFLista02.indexof(aux)>=0THENWriteln('Estaenlalista02')ELSEwriteln('noseencontroenlista02');IFLista03.indexof(aux)>=0THENWriteln('Estaenlalista03')ELSEwriteln('noseencontroenlista03');

    Writeln('BuscandoaGraceenlalista01ylista02');aux:=Lista03.items[1];IFLista01.indexof(aux)>=0THENWriteln('Estaenlalista01')ELSEwriteln('noseencontroenlista01');IFLista02.indexof(aux)>=0THENWriteln('Estaenlalista02')ELSEwriteln('noseencontroenlista02');

    Writeln('BorrandoaMarydelista03paraponerloenlalista01');aux:=Lista03.Extract(Lista02.items[2]);Lista01.add(aux);

    Writeln('=====LISTA03=====');FORi:=0TOlista03.Count1DOWriteln('[',i:2,']',TCadenas(Lista03.items[i]).cad);Writeln('=====LISTA01=====');FORi:=0TOlista01.Count1DOWriteln('[',i:2,']',TCadenas(Lista01.items[i]).cad);

    Writeln('BorrandoaJuandelalista03,perodejandoloenlista01');

    Lista03.remove(Lista01.items[0]);Writeln('=====LISTA03=====');FORi:=0TOlista03.Count1DOWriteln('[',i:2,']',TCadenas(Lista03.items[i]).cad);Writeln('=====LISTA01=====');FORi:=0TOlista01.Count1DOWriteln('[',i:2,']',TCadenas(Lista01.items[i]).cad);

    END.

    Cdigofuente5:Usodeextract,removeyindexof.

    Otromtodoqueesmuytilen las listasybastante fcildeentendereselmtodoAddlist, loquehaceestemtodoesaadirtodoslospunterosdeotralistaenlalistadelmtodoquelocontienen.Ejemplo:

    {$codepageutf8}{$modeobjfpc}USESsysutils,classes;

    TYPETCadenas=CLASSCad:ansistring;CONSTRUCTORcrear(ccad:ansistring);END;

    CONSTRUCTORTCadenas.crear(ccad:ansistring);BEGINcad:=ccadEND;

    VARLista01,lista02,lista03:Tlist;i:byte;BEGINLista01:=Tlist.create;FORi:=0TO10DOLista01.add(TCadenas.crear('Numero'+intTostr(i)));

  • 15/10/2015 Conoce300::PascalconFreePascal::Listasycolecciones::Creandoymanejandolistas

    http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1302CreandoManejandoListas.php 6/8

    Lista02:=Tlist.create;FORi:=11TO20DOLista02.add(TCadenas.crear('Numero'+intTostr(i)));

    Lista03:=Tlist.create;Lista03.AddList(Lista01);Lista03.AddList(Lista02);

    FORi:=0TOlista03.Count1DOWriteln(TCadenas(Lista03.items[i]).cad);END.

    Cdigofuente6:UsodeAddlist.Enlosejemplosanterioreshemosrecorridolaslistasusandounfordesde0hastaCount1,estosepuedeabreviarohacerdeunmodomscmodoconelusodeunbucleforinloop.La clase Tlist y TFPList estn diseadas para trabajar con este bucle, slo se necesita crear una variable de control de tipopointer,pararecorrerlalistaconelbucleforinloop.Esdeciralgocomoesto:

    fori:=0toLista01.Count1doWriteln(Integer(ListaN.items[i]^))sepuedeescribirdelasiguientemanera:

    forauxinListaNdoWriteln(integer(aux^))En donde aux es una variable de tipo pointer, y si queremos eliminar los elementos de una lista tambin se puede hacer delsiguientemodo:

    forauxinListaNdofreemem(aux)Acontinuacinelcdigofuente01,vistoanteriormenteconelusodeforinloop.

    {$codepageutf8}{$modeobjfpc}USESsysutils,classes;VARListaN,ListaD:Tlist;n:^integer;d:^double;i:byte;aux:pointer;BEGINrandomize;ListaN:=Tlist.create;ListaD:=Tlist.create;FORi:=0TO10DOBEGINNEW(n);NEW(d);n^:=random(1000);d^:=random;ListaN.add(n);ListaD.add(d);END;

    Writeln('ListaN');Writeln('Capacidad=',ListaN.Capacity);Writeln('Cantidad=',ListaN.Count);

    i:=0;FORauxINListaNDOBEGINWriteln('[',i:2,']',integer(aux^));i+=1END;

    Writeln('Borrando');

    FORauxINListaNDOfreemem(aux);

    ListaN.clear;ListaN.destroy;

    Writeln('ListaD');Writeln('Capacidad=',ListaD.Capacity);Writeln('Cantidad=',ListaD.Count);

    i:=0;FORauxINListaDDOBEGINWriteln('[',i:2,']',double(aux^):0:3);i+=1END;

    Writeln('Borrando');

    FORauxINListaDDOfreemem(aux);

    ListaD.clear;ListaD.destroyEND.

  • 15/10/2015 Conoce300::PascalconFreePascal::Listasycolecciones::Creandoymanejandolistas

    http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1302CreandoManejandoListas.php 7/8

    Cdigofuente7:Usodeforinloop.Encasoseusanobjetosenvezdepunteroscomosevioanteriormentepodemosusarcomovariabledecontrolunpunteroounobjetodelaclasecorrespondientequeseusaenlalista.Encasodeusarunpunterosedebehacerunsolapamientodelavariabledecontrolconlaclasecorrespondientealobjeto.Esdecirenelsiguientecdigo:

    forauxinlistadoTPersona(aux).MostrarPersonaLavariableauxesdetipopointer,entoncesaestavariableseledebehacerunsolapamientoconlaclaseTPersona,delcualsonlosobjetosqueestnenlalista.Por otro lado en caso de usar un objeto como variable de control, entonces se debe hacer un solapamiento de la variable decontrolconeltipodedatopointer.Esdecirenelsiguientecdigo:

    forpointer(Persona)inlistadoPersona.MostrarPersonaPersonaesunobjetodelaclaseTPersonaysehaceunsolapamientoconpointerparaaccederaloselementosdelalista.Enelsiguienteejemploeselmismoejemplo04peroconelusodeforinloop,usandocomovariabledecontrolalobjetoPersona.

    {$codepageutf8}{$modeobjfpc}USESsysutils,classes;

    TYPETPersona=CLASSNombre,Ciudad:string;PROCEDUREMostrarPersona;END;

    PROCEDURETPersona.MostrarPersona;BEGINWriteln('Nombre:',Nombre);Writeln('Ciudad:',Ciudad)END;

    VARLista:Tlist;rpta:char;Persona:TPersona;BEGIN

    Lista:=Tlist.create;

    REPEATPersona:=TPersona.create;Write('Nombre:');Readln(Persona.Nombre);Write('Ciudad:');Readln(Persona.Ciudad);Lista.add(Persona);Write('Deseacontinuar[S]i[N]o:');readln(rpta)UNTIL(rpta='N')OR(rpta='n');

    FORpointer(Persona)INlistaDOPersona.MostrarPersona;

    Writeln('Capacidad=',Lista.Capacity);Writeln('Cantidad=',Lista.Count);Writeln('Borrando');

    FORpointer(Persona)INListaDOPersona.destroy;

    Lista.clear;Lista.destroyEND.

    Cdigofuente8:Usodeforinloopconobjetos.

    Tweet 0

    anterior::indice::siguiente

    SUGERENCIAS

    0Recomendar

  • 15/10/2015 Conoce300::PascalconFreePascal::Listasycolecciones::Creandoymanejandolistas

    http://www.conoce3000.com/html/espaniol/Libros/PascalConFreePascal/Cap1302CreandoManejandoListas.php 8/8

    "Agradezco que se tomen su tiempo, para escribirme una sugerencia. Toda sugerencia que meescribameayudaamejorarloscontenidosdelawebacordeasusnecesidades.Lassugerencias,serecibirn siempre y cuando ingrese al menos su nombre o seudnimo y la sugerencia. LassugerenciassondeusointernoynosernpublicadasenlawebConoce3000"Nombreoseudnimo :

    CorreoElectrnico :Sugerencias :

    Deseorecibirunacopiadelmensaje. Enviar

    PORTADA|LIBROS|APUNTES|ARTCULOS

    Todoslostextos,imgenesyvideosdeConoce3000estancolocadosbajounalicencia:CreativeCommonsReconocimientoNoComercial3.0UnportedLicense.