Conoce300 __ Pascal Con Free Pascal __ Listas y Colecciones __ Creando y Manejando Listas
description
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.