12 - Punteros y Estructuras Dinámicas
12 - Punteros y Estructuras Dinámicas
12 - Punteros y Estructuras Dinámicas
Cuello
!APA E !E!"#$A
" continuacin se pasar# a detallar como divide el lengua$e Turbo Pascal las regiones de memoria interna, al cargarse un programa.
Segmento de C(digo de la *ltima )nidad Segmento de C(digo del Programa Principal Prefi Seg Segmento Prefi+o del Programa ,PSP-
!emoria .a+a
!apa de memoria /ur%o Pascal La memoria interna est# dividida en segmentos, en donde cada segmento tiene un tama0o de 123%ytes. "lgunos de estos segmentos cumplen un rol especfico a la 'ora de Clase 12 AyE )./.4. 5.#...A. Pgina 1
correr o e$ecutar un programa. ,stos segmentos especiales son 3 m#s una regin de memoria restante que representan lo siguiente. 4. Segmento de A/"S 6 A/A7. ,l lengua$e Turbo Pascal utili5a este segmento para reservar espacio para las variables de #mbito o alcance glo%al. Las variables definidas en este segmento son 8aria%les estticas y deben ser definidas en tiempo de compilaci(n, ocupar#n el espacio reservado mientras la e$ecucin del programa est# en marc'a. Todas las variables del mdulo principal m#s todas las variables de las unidades empleadas por el mdulo principal ocupar#n el 6nico segmento de datos, que no podr# e ceder los 789bytes. 2. Segmento de C9 $:" 7C" E7. ,l lengua$e Turbo Pascal utili5a este segmento para el cdigo del programa &bloque principal : mdulos definidos(, pero el tama;o total no est# limitado a un segmento de 789bytes. La manera de ampliar el tama;o de cdigo por encima de los 789bytes es empleando unidades. 2ada unidad tiene su propio segmento de cdigo, en donde, cada uno de ellos no puede e ceder los 789bytes, pero el tama;o total de cdigo est# limitado solamente por el tama;o de la memoria disponible. 3. Segmento de la P$LA 6S/AC37. ,l lengua$e Turbo Pascal utili5a este segmento para guardar la direccin de retorno al invocar a un mdulo, los par#metros y las variables de alcance o #mbito local. ,l valor asignado por defecto es de 479bytes, pero puede ser ampliado a 789bytes por medio de la directiva al compilador <*. ,l stac= crece desde direccin de memoria m#s alta 'acia direcciones de memoria m#s ba$as. 8. ;rea de memoria del !"4/<C)L" 6HEAP7. ,l lengua$e Turbo Pascal utili5a esta regin de memoria, en realidad son varios segmentos, para la creacin de variables din#micas, esto es, 8aria%les =ue se crearn y se eliminarn cuando ya no se las necesite, en tiempo de e+ecuci(n . ,sto permite ampliar los 789bytes del segmento de datos> por lo tanto, est# regin de memoria estar# disponible para poder e tender la cantidad de variables en caso de requerir m#s nuestro proceso en e$ecucin. ,l tama;o real del heap estar# establecido por un valor mnimo, que puede ser cero &valor por defecto( u otro valor mayor y por un valor m# imo, que pueden ser los 78/9bytes &valor por defecto( u otro valor menor, que puede ser establecido por medio de la directiva al compilador <*. Si la cantidad mnima de memoria no est# disponible, el programa no se e$ecutar#. ,l 'eap crece desde una direccin de memoria ba$a 'acia direcciones de memoria m#s altas. ,n conclusin, si un programa requiere m#s espacio para variables que los 789bytes que ofrece el segmento de datos, se debe emplear el #rea del 'eap. Por otro lado para ampliar el tama;o del cdigo de programa por encima de los 789bytes que ofrece el segmento de cdigo, se deben emplear las unidades, cada una de las cuales pueden utili5ar un m# imo de 789bytes y cada una de ellas tiene su propio segmento de cdigo, pero las variables que utilicen se ubicar#n en el segmento de datos empleado por el mdulo principal. ,sto significa que la totalidad de variables &bloque principal : las variables definidas en c?u. de las unidades( se ubican en un solo segmento de datos, por lo tanto no podr# superar los 789bytes. Si se divide el bloque principal en mdulos podremos a'orrar el espacio del segmento de datos, debido a que ciertas variables de traba$o temporal estaran definidas dentro de Clase 12 AyE )./.4. 5.#...A. Pgina 2
cada mdulo ubic#ndose en el segmento de la pila o stac= y de$aran de estar ubicadas en el segmento de datos. 0e esta manera se consigue aliviar para que no recaigan todas las variables al segmento de datos, sino que se distribuyan en el segmento de la pila. ,sto es cada ve5 que se invoca a un mdulo tanto los par#metros como las variables locales se guardan en la pila, es decir se crean en el momento de invocar al mdulo y son destruidas al abandonarlo. Segmento de atos Segmento de la Pila 6Stack7 !>imo 123%ytes. !>imo 123%ytes. ?aria%les glo%ales /ur%o Pascal lo fi+a en 113%ytes. Son variables est#ticas, ya que Puede ampliarse con la directi8a al se definen en tiempo de compilacin compilador @! @ncluye las variables definidas en el bloque Parmetros formales y principal m#s las variables definidas en c?u. ?aria%les locales de las unidades mencionadas. Se crean al invocar a un mdulo y son destruidas al salir de !l. Segmento de C(digo ;rea del !ontAculo 6Heap7 !>imo 123%ytes. #esto de la memoria disponi%le. Puede ampliarse utili5ando unidades. ?aria%les dinmicas sin nombre propio 2ada unidad emplea su propio segmento de Se accede en forma indirecta a trav!s de cdigo con un m# imo de 789bytes. variables de tipo puntero. Se crean y eliminan en tiempo de e$ecucin.
)4$ A ES
Ana unidad es una coleccin de diferentes ob$etos. ,stos ob$etos pueden ser )nidades, Constantes, /ipos, Procedimientos, 5unciones y ?aria%les . Las unidades presentan las caractersticas m#s interesante para la descomposicin de un proyecto grande en mdulos m#s peque;os. Permiten la compilacin independiente, ya que cada unidad es compilada en forma separada del programa principal. " trav!s de las unidades se pueden construir grandes programas. Por otro lado al dividir el proyecto en mdulos independientes cuando sur$a la necesidad de reali5ar alg6n cambio, solo se deber# recurrir el mdulo correspondiente. Las unidades requeridas por el programa principal son indicadas en la cl#usula uses las que se enla5ar#n con el cdigo del programa principal, en el momento de compilar solo se compilar#n las sentencias del bloque principal y los mdulos definidos en !l, pero no las unidades, debido a que se encuentran ya compiladas. Por lo tanto se conseguir# un a'orro en tiempo de compilacin. La compilacin de una unidad se reali5a una sola ve5 y luego de 'aberla creado y 'abi!ndola depurado de posibles errores. Luego estar# lista para ser usada en diferentes programas que requieran de su uso. "l crear una unidad debemos tener en cuenta cual es su ob$etivo de uso, ya que sabiendo esto se construiran las unidades para un tema especfico. Por e$emplo unidades para funciones matem#ticas, para tratamiento de cadenas, para operaciones de entrada y salida, etc.. Turbo Pascal brinda diferentes colecciones de unidades cada una de las cuales cumple una tarea concreta, algunas de las cuales son.
Clase 12
AyE
)./.4. 5.#...A.
Pgina B
C#/. Anidad dedicada al mane$o de la pantalla y el teclado, brinda diferentes posibilidades para mane$ar la pantalla y el teclado de manera sencilla por medio de los ob$etos definidos en esta unidad, algunos de los cuales son. gotoxy(x,y) que ubica al puntero de la pantalla en las coordenadas & , y(> clr cr que borra la pantalla y ubica al puntero de la pantalla en B4, yB4> !herex y !herey son funciones que informan la posicin del cursor indicando la columna y fila respectivamente> delay(n) que reali5a una espera de n milisegundos> "eypressed avisa se se oprimi una tecla> textcolor(n) cambia el color a los caracteres> textbac"ground(n) cambia el color de fondo del car#cter> read"ey lee una la tecla presionada> !indo!s(x#,y#,x2,y2) crea una ventana> sound(n) genera un sonido de n 'ercios y nosound desactiva el sonido, entre otros. P#$4/E#. Anidad dedicada al mane$o de la impresora, brinda servicios para el f#cil mane$o de la impresora ya que no requiere reali5ar la asignacin de nombres fsico y lgico, abrir la impresora o cerrarla, adem#s define la variable lst para ser utili5ada como nombre lgico del arc'ivo de la impresora, para poder ser empleada en las sentencia Crite y Criteln como nombre del dispositivo al que se destinar# la salida impresa. "S. Anidad dedicada al mane$o de los servicios brindados por el 0.+.S., entre los cuales contamos getdate(aa,mm,dd,ds) el cual obtiene la fec'a del sistema> gettime(hh,mm,ss,cs) el cual obtiene la 'ora del sistema> e ec&NomProg, Linea2do( e$ecuta una aplicacin desde Turbo Pascal> dis"$ree(n) retorna el espacio disponible en el disco de la unidad n, entre otros. +tras unidades predefinidas por Turbo Pascal son :#APH que define un con$unto de diferentes ob$etos relacionados con aplicaciones gr#ficas. La unidad SCS/E! es una unidad un tanto especial ya que $am#s debe ser indicada en la cl#usula uses debido a que esta unidad, dada su importancia, se incluye directamente en todo programa Turbo Pascal que se desarrolle. ,n esta unidad encontramos todas las funciones num!ricas, como ser, sqrt& (, sqr& (, e p& (, ln& (, sin& (, cos& (, abs& (, int& (, trunc& (, round& (, random& (, randomi5e, frac& (, funciones para el tratamiento de cadenas alguna de las cuales son lengt'&cad(, upcase&car(, copy&subcad,posDini,cant(, mane$o de las operaciones de entrada y salida de arc'ivos como ser assign&nl, nf(, reset&nl(, reCrite&nl(, close&nl(, read&nl, nr(, Crite&nl, nr(, filepos&nl(, see=&nl, dir(, entre otros. Turbo Pascal re6ne varias unidades en un solo arc'ivo denominado /)#."./PL el cual forma una li%rerAa.
Clase 12
AyE
)./.4. 5.#...A.
Pgina 2
un #mbito e terno a la unidad, esto es, los programas que requieran el servicio de la unidad pueden utili5ar estos ob$etos. ,n el caso de los mdulos, funciones y procedimientos, solo de definen las cabeceras, por lo cual solo se indicar# el nombre del mdulo, la lista de par#metros formales con sus tipos de datos, como son pasados por valor o por referencia y en el caso de las funciones el tipo de valor devuelto por la funcin. 3. Ana parte de implementacin precedida por la palabra reservada implementation que tiene car#cter privado, es decir los ob$etos aqu definidos y que no fueron indicados en la parte de interface no podr#n ser accedidos desde un #mbito e terno a la unidad, solo podr# acceder la unidad para un requerimiento de uso local necesario para el desarrollo del proceso interno a la misma. ,n el caso de los mdulos, funciones y procedimientos, adem#s de establecer la cabecera de los mismos, se desarrollan en forma completa el con$unto de las sentencia que deban de reali5arse para la actividad del mdulo como as tambien los ob$etos propios y locales del mdulo. 8. Ana 6ltima parte de iniciali5acin de la unidad encerrada entre las palabras reservadas %egin y end. Por e$emplo, iniciali5ar las variables definidas en la unidad, e$ecutar algunas sentencias o invocaciones a los mdulos definidos en la unidad. Ana ve5 que la unidad 'a sido probada con ! ito se procede a reali5ar la compilacin por 6nica ve5, a menos que en el futuro debamos efectuar alg6n cambio. ,l programa que 'aga uso de la unidad, solo deber# enla5arla a su propio cdigo, el 6nico que deber# compilarse. Las venta$as de usar unidades es que permiten la construccin de grandes programas, dividen las tareas en problemas menores, son m#s f#ciles de corregir, se pueden clasificar de acuerdo a su tem#tica y formar libreras para ser empleadas por diferentes programas. " continuacin se presenta la estructura de una unidad. )nit %d&nidad> E ,ncabe5ado o cabecera de la unidad F interface E Parte p6blica F uses E+b$etos p6blicosF const type procedure function 8ar implementation E Parte privada F uses E+b$etos privadosF const type procedure function 8ar %egin E @niciali5acin de la unidad F sentencias,send.
ba$o la familia de procesadores G/GG y G/G7. ,l esquema de la memoria permite direccionar 'asta 4*byte a pesar de que el cableado de la circuitera interna de los registros sean de 47 bits. Para poder acceder a las direcciones de 2/ bits debe utili5ar un m!todo de direccionamiento que enca$e en el formato de 47 bits.
ireccionamiento segmentado
,l espacio de memoria est# dividio en segmentos, cada uno de los cuales tiene 789bytes de memoria. Para poder acceder a cada posicin dentro de un segmento se utili5a un despla5amiento. 0ebido a que el despla5amiento se mide siempre en relacin al segmento, este m!todo se conoce como direccionamiento relati8o. La combinacin de un segmento y un despla5amiento forma una direcci'n segmentada que puede 'acer referencia a un byte del espacio de memoria de un total de 4*ega byte. Ana direccin segmentada de 32 bits es convertida por el procesador en una direccin de 2/ bits utili5ando la direccin del segmento como un p#rrafo adicionando la direccin del despla5amiento. ,n realidad se despla5a la direccin del segmento 8 bits 'acia la i5quierda y se le suma el valor del despla5amiento, dando como resultado una direccin de 2/ bits. ,l siguiente e$emplo ilustra lo dic'o anteriormente, si tomamos 4238) como una direccin de segmento y 8324) como una direccin de despla5amiento, la notacin empleada para indicar una direccin segmentada sera 4238).8324). ,l n6mero de la parte i5quierda de los 2 puntos indica el segmento y el n6mero de la parte derec'a de los 2 puntos indica el despla5amiento. La letra ) indica que el n6mero est# e presado en el sistema de numeracin en base 'e adecimal. Para calcular la direcci(n real en memoria se procede a reali5ar las siguientes operaciones. : 4238/) se agrega un cero por el e tremo derec'o a la direccin del segmento 8324) se suma la direccin del despla5amiento relativo 11111H es la direcci(n real en memoria
2ualquier direccin de memoria puede ser establecida con diferentes combinaciones de direcciones segmentadas, por e$emplo la direccin real de memoria 47774) puede ser establecida no solo como 4238.8324, sino tambi!n como 4777.///4, 477H.//44, 4778.//24 y as sucesivamente. " continuacin se presenta otro e$emplo utili5ando notacin binaria E+emplo.
Segmento B 0espla5amiento B //// //// //4/ //// &//2/'( //// ///4 //// //// &/4//'(
Segmento despla5ado B //// //// //4/ //// EEEE &//2//'( 0espla5amiento B : //// //// ///4 //// //// &//4//'( 0ireccion real B //// //// //44 //// //// &//3//'( Segmento : 0espla5amiento B //2/./4// B /3//'
0istintas combinaciones de egmento:(espla)amiento pueden obtener la misma direccion real de memoria, por e$emplo. //2/./4// B //3/.//// B //4/./2// B ////./3// B ...
Clase 12
AyE
)./.4. 5.#...A.
Pgina 1
Punteros cercanos.
Los punteros cercanos J*E+,K son punteros que solamente pueden apuntar a su propio segmento, utili5an solo la parte de despla5amiento para poder acceder dentro de los 789bytes o 7HH37 posiciones de memoria dentro del segmento. Por lo tanto 2 %ytes ser#n necesarios, es decir, con 47 bits o 247 para poder direccionar a cada byte de un segmento.
Punteros le+anos.
Los punteros le+anos J$+,K son punteros que pueden no solo apuntar a su propio segmento sino tambi!n pueden apuntar a otros segmentos, por lo tanto, estos tipos de punteros requieren 2 %ytes, es decir, 2 bytes para la parte de segmento y 2 bytes para la parte de despla5amiento.
!odelos de !emoria
Los modelos de memoria surgen de la combinacin entre punteros cercanos y le$anos por un lado y por otro con respecto a la regin de almacenamiento para los datos y para el cdigo del programa. Seis combinaciones se presentan a continuacin. 4. /$4C J0iminutoK. 2digo, datos y pila en un solo segmento de memoria de 789b. Atili5a punteros cercanos, es el m#s r#pido de e$ecucin tanto para acceder al cdigo como para acceder a los datos, ya que la aritm!tica que debe emplear para punteros cercanos es m#s simple que para punteros le$anos y adem#s son los programas de menor tama;o. Puede ser convertido a .2+*. 2. S!ALL JPeque;oK. 2digo en un segmento de 789b, datos y pila en otro segmento de memoria de 789b, por lo que el tama;o total ser# de 42G 9b. ,s tan r#pido como el modelo anterior, ya que utili5a punteros cercanos, tanto para el cdigo como para acceder a los datos. 3. C"!PAC/ J2ompactoK. 2digo en un segmento de 789b, datos en varios segmentos de memoria de 789b. ,s tan r#pido como los modelos anteriores, debido a que requiere de punteros cercanos, aunque el acceso a los datos es m#s lento, debido a que requiere asignar a los registros del sistema, el segmento y el despla5amiento de la direccin de memoria, por lo que utili5a punteros le$anos, pero se obtiene como venta$a poder tener m#s espcaio de almacenamiento para los datos. 8. !E $)! J*edioK. 2digo en varios segmentos de memoria, datos en un solo segmento de memoria de 789b. La e$ecucion es mas lenta que en los modelos anteriores, al invocar a los Clase 12 AyE )./.4. 5.#...A. Pgina F
modulos, debido a que requiere de punteros le$anos, aunque el acceso a los datos es tan rapido como en los dos primeros modelos, ya que requiere solo de asignar el despla5amiento solamente por lo que usa punteros cercanos. Atili5ado para programas grandes pero que usan pocos datos. H. LA#:E JLrandeK. 2digo en varios segmentos de memoria, datos en varios segmentos de memoria, aunque no se permite utili5ar estructuras de datos de m#s de 789b. Tanto el cdigo como los accesos a los datos lo 'acen m#s lentos que en los modelos anteriores, ya que utili5a punteros le$anos en ambos casos. Mequerido cuando se requiere gran cantidad de cdigo y de datos. 7. H):E J,normeK. 2digo en varios segmentos de memoria, datos en varios segmentos de memoria y se permite utili5ar estructuras de datos de m#s de 789b. Tanto el cdigo como los accesos a los datos lo 'acen m#s lentos que en los modelos anteriores, ya que utili5a punteros le$anos.
Clase 12
AyE
)./.4. 5.#...A.
Pgina H
ptrS'ort B Ns'ortint> Los siguientes e$emplos muestran definiciones de tipos punteros a tipos de datos estructurados. type Meg"lu B record NroLeg . longint> "peNom . cad2/> %ecNac . longint end> ptrMec B NMeg"lu> E ptrMec es un puntero a un tipo de dato Meg"lu F Las variables de tipo puntero se definir#n de la siguiente manera. 8ar ptr4, ptr2 . ptrQord> ptr3 . ptrMec> ptr8 . ptrlong> ptrH . pointer> Los punteros ptr4 y ptr2 apuntan a tipos de datos Cord y se referir#n en consecuencia a dos bytes, el puntero ptr3 apunta a un tipo de dato Meg"lu y se referir# a 2R bytes, el puntero ptr8 apunta a un tipo de dato longint y se refiere a 8 bytes, por 6ltimo el puntero ptrH apunta a una regin de memoria y se refiere de una forma gen!rica es decir no se refiere a ning6n tipo de dato en particular. " continuacin se presentan otros tipos de estructuras de datos y punteros. type 1ecPtr B arrayO4..4/P of ptrMec> ptr1ector B N1ecPtr> 8ar 1ec . 1ecPtr> ptr1ec . ptr1ector> r"lu . Meg"lu> E ,st# definido m#s arriba F i . byte> %egin for i.B 4 to 4/ do 1ecOiP.B nilI r"lu.NroLeg.B 44238H> r"lu."peNom.B S*artine5, @n!sT> r"lu.%ecNac.B 23/H4RG4 1ecO4P.B Ur"lu> ptr1ec.B "ddr&1ec(> Criteln&ptr1ecNO4PN.NroLeg,T S,ptr1ecNO4PN."peNom,T S,ptr1ecNO4PN.%ecNac( end. Clase 12 AyE )./.4. 5.#...A. Pgina J
An puntero puede apuntar a cualquier regin de memoria, esto es, al segmento de datos, &como en los e$emplos dados anteriormente( o a los segmentos de cdigo o al segmento de pila o al 'eap o como a cualquier otro segmento. Turbo Pascal brinda de varias 'erramientas para el mane$o de punteros y de acceder a diferentes posiciones de memoria incluso a los propios puertos de entrada y?o salida. " continuacin se indican y e plican estos diferentes elementos. K"%+eto. +perador de direccin. ,s un operador unario, lo que significa que requiere de un solo operando y que debe ser una variable o un identificador de mdulo, escribi!ndose a continuacin del smbolo arroba. ,$.. Ua obtiene la direccin de la variable a, es decir, su resultado est# formado por el Segmento y el 0espla5amiento en donde est# alo$ada la variable indicada. ,l resultado de esta operacin podra ser asignada a una variable de tipo puntero compatible con el tipo de dato con la variable a. Si a se la defini de tipo Cord y ptrQ es un puntero a un tipo de dato de tipo Cord, entonces es v#lida la siguiente asignacin. ptrQ .B Ua> ,l resultado de esta asignacin es que ptrQ apunta a la direccin en donde est# ubicada la variable a. Luego se podra asignar alg6n valor de tipo Cord a dic'a direccin, por medio del puntero, como se indica a continuacin. ptrQN .B H23I> La variable a, pasa a contener el valor H23I. E+emplo. ,l siguiente e$emplo muestra como pasar un par#metro por referencia desde el punto de la llamada al mdulo. type ptrQord B NCord> procedure suma& . ptrQord(> %egin N.B N : 2 end> 8ar sum . Cord> i . byte> %egin sum.B /> for i.B 4 to 4/ do suma&Usum(> Criteln&SSuma. S,sum( Clase 12 AyE )./.4. 5.#...A. Pgina 1E
end. Addr,"%+eto-. La funcin "ddr&+b$eto( retorna la direccin de +b$eto. ,l valor devuelto es un puntero gen!rico compatible con cualquier tipo de puntero al igual que nil &valor para indicar que un puntero no apunta a nada(. La funcin "ddr tiene el mismo significado que el operador U visto en los p#rrafos previos. E+emplo. 8ar ptr . pointer> %egin ptr.B "ddr&ptr( E'ace que ptr apunte a s mismoF if ptr B Uptr tLen Ela direccin que contiene ptr es B a la direccin donde est# ubicada ptrF Criteln&SsiT( else Criteln&SnoT( end. A%solute 8ar o A%solute Seg:"fs. Se puede definir una variable solapada sobre la definicin de otra variable sin importar el tipo de dato de c?u. de ellas. La palabra reservada absolute define una variable en una regin de memoria indicada por un segmento y un despla5amiento, como se indica en el siguiente e$emplo. 8ar a . s'ortint> b . boolean absolute a> c . Cord> d . byte absolute c> Si 'acemos. a .B H> Criteln&a,T S,b(> ,mite H y TMA,, MPor =uGN Si 'acemos. a .B /> Criteln&b(> c .B 4238> Criteln&d(. ,mite 24/, MPor =uGN ,mite %"LS,, MPor =uGN y si 'acemos. a .B K3> Criteln&b(> ,mite TMA,, MPor =uGN Si 'acemos.
Seg,"%+eto-. La funcin eg(-b.eto) retorna un valor de tipo Cord indicando la direccin del segmento en donde se locali5a el ob$eto indicado en su par#metro formal. +b$eto puede ser una variable o el nombre de un mdulo.
Clase 12
AyE
)./.4. 5.#...A.
Pgina 11
"fs,"%+eto-. La funcin -fs(-b.eto) retorna un valor de tipo Cord indicando la direccin del despla5amiento en donde se locali5a el ob$eto indicado en su par#metro formal. +b$eto puede ser un variable o el nombre de un mdulo. E+emplos. ,l siguiente e$emplo muestra el uso de las funciones eg y -fs. uses neOdelay, crtI Procedure Proc> %egin Criteln&S*dulo ProcT( end> 5unction %unc.byte> %egin %unc.B H end> 8ar a . longint> %egin Criteln&SSegmento&a(. S,Seg&a((> Criteln&S0espla5amiento&a(. S,+fs&a((> Criteln&SSegmento&Proc(. S,Seg&Proc((> Criteln&S0espla5amiento&Proc(. S,+fs&Proc((> Criteln&Seg&%unc(,T.T,+fs&%unc((> Criteln&Seg&2lrScr(,T.T,+fs&2lrScr((> E+ops, es otro segmento de cdigoF Criteln&Seg&goto y(,T.T,+fs&goto y((> Criteln&Seg&Patc'2rt(,T.T,+fs&Patc'2rt((> E+ops, y este otro segmento de cdigoF end. !emPSeg:"fsQ. Turbo Pascal implementa tres arreglos predefinidos para acceder directamente a la memoria. mem, memR y memL, cada una de las componentes es de tipo byte, Cord y longint respectivamente. Los arreglos de memoria utili5an una sinta is especial para los ndices. dos e presiones de palabra de tipoKentero, separadas por dos puntos, indican el segmento base y el despla5amiento para acceder a la locacin en la memoria. E+emplo. ,l siguiente e$emplo ilustra como acceder a la memoria de video. memO<-G//./P .B 7H> memO<-G//.4P .B 4> ,n la pantalla de te to en las coordenadas &4, 4( se visuali5a el car#cter /A0 en color a5ul para el car#cter y con fondo negro. La direccin @.HEE:@EEEE representa la memoria de video en modo te to para la primer p#gina de un total de oc'o, Las direcciones de inicio Clase 12 AyE )./.4. 5.#...A. Pgina 12
de las siete restantes p#ginas se ubican en los despla5amientos <4///, <2///, <3///, <8///, <H///, <7/// y <I/// respectivamente. La venta$a de tener varias p#ginas se destaca al momento de cambiar los datos presentes en la pantalla> en ve5 de cambiar los datos sobre la misma p#gina se podra utili5ar otra p#gina y luego mostrar los datos de esa otra p#gina, el resultado ser# verlos m#s r#pidamente. Los despla5amientos pares representan caracteres y los despla5amientos impares representan los atributos de esos caracteres. ,n el e$emplo, el valor 7H representa el car#cter S"T asignado a una posicin par, mientras que el valor 4 representa el color a5ul para ese car#cter y color de fondo negro, asignado a la posicin impar adyacente, por lo tanto, un par de bytes indican una posicin en la pantalla de video en modo te to, el primer byte JparK representa el car#cter o smbolo y el segundo byte JimparK representa el atributo de ese car#cter. Los valores de atributos de / a 4H, el color de fondo es el negro, de 47 a 34, el color de fondo es el a5ul, de 32 a 8I, el color de fondo es el verde y siguiendo as con otros colores. ,n total, los colores para el car#cter son 47 y para los de fondo del car#cter son G. Ana pantalla de te to presenta G/ columnas por 2H filas, lo que da un total de G/ 2H B 2/// posiciones en la pantalla. ,sto requiere 2/// posiciones en memoria para el car#cter y 2/// posiciones de memoria para el atributo intercalados, en donde, la primer componente de cada par es el car#cter y la segunda componente de cada par representa el atributo. E+emplo. memO<-G//.2P .B 77> memO<-G//.3P .B 4G> ,n las coordenadas &2, 4(, se representa el car#cter S .T con color verde para el smbolo y de color a5ul para el fondo. Para establecer una posicin en la memoria de video para una coordenada & , y(, se procede a aplicar la siguiente e presin. Para la representaci(n del carcter. pos1em2ar :3 ((y-#) 4 56 7 (x-#)) 4 2 !ientras =ue para el atri%uto es. pos1em+trib :3 ((y-#) 4 56 7 (x-#)) 4 2 7 # E+emplo: ,l siguiente e$emplo muestra como cambiar el valor de una posicin de memoria representado por una variable. 8ar a . byte> %egin memOSeg&a(.+fs&a(P.B H> Criteln&SaB S,a,T B S,memOSeg&a(.+fs&a(P(> readln end.
Clase 12
AyE
)./.4. 5.#...A.
Pgina 1B
,l cdigo anterior asigna el valor H en la direccin de memoria en donde est# alo$ada la variable a, luego se emite el contenido de la variable a y el contenido de la direccin en donde est# ubicada la variable a, por lo que el programa emite dos veces el valor H. E+emplo. ,l siguiente e$emplo obtine de la lectura en la posicin de memoria <//8/.<//H/ y <//8/.<//H4 la ubicacin del cursor de la primer p#gina en la pantalla de te to. 8ar , y . byte> %egin goto y&2/, H(> .B memO<//8/.<//H/P : 4> E,quivalente a C'ere F y.B memO<//8/.<//H4P : 4> E,quivalente a C'ereyF Criteln&SPosicin del cursor. B S, ,T yB S,y( end. Ptr,Seg:"fs-. La funcin ptr( eg,-fs) retorna un valor de tipo pointer, es decir, una direccin de memoria a partir de un segmento base y de un despla5amiento dados. ,l tipo de cada uno de los par#metros formales son Cord. E+emplo. 8ar a ,b . byte> ptrLen . pointer> ptr-yte . Nbyte> %egin a.B H> ptrLen .B ptr&Seg&a(,+fs&a((> Criteln&-yte&ptrLenN((> ptr-yte.B ptr&Seg&a(,+fs&a((> Criteln&ptr-yteN(> -yte&ptrLenN(.B 2> Criteln&a(> ptr-yteN.B I> Criteln&a(> ptr-yte.B ptr&Seg&a(,+fs&a(:4(> ptr-yteN>B R> Criteln&b(> readln end.
PortPdirQ. Para accesos a los puertos de datos del microprocesador. Turbo Pascal implementa dos arreglos predefinidos de una dimensin, port y portR, y cada elemento representa un puerto de datos, en donde las direcciones de los puertos corresponden a sus ndices. ,l tipo de indice es una palabra de tipo entero. Las componentes del arreglo de puerto son componentes de tipo -yte y de tipo Cord para el arreglo de portC. 2uando un valor es asignado a la componente de port o portC, el valor es una salida al puerto seleccionado. 2uando una componente de port o portC es referenciado en una e presin, su valor es ledo del puerto seleccionado. ,l uso de los arreglos port y portC est# limitado a asignaciones y referencias en e presiones solamente> esto es, las componentes de port y portC no pueden ser utili5ados como par#metros variables. Tambi!n, las referencias completas a los arreglos port o portC &referencias sin el ndice( no son permitidas. E+emplos.
Clase 12
AyE
)./.4. 5.#...A.
Pgina 12
EPuerto del controlador del tecladoF EPuerto del adaptador gr#fico avan5ado ,L"F
Se debe tener muc'o cuidado al traba$ar con los puertos en forma directa, ya que un valor mal asignado podra ocasionar ciertos problemas, como por e$emplo bloquearse el sistema. Las direcciones de un puerto no tienen nada que ver con las direcciones de memoria, es decir, ante un mismo valor de direccin son dos lugares fsicos diferentes si uno se refiere a un puerto y el otro se refiere a la memoria M.".*. nil. La palabra reservada nil es utili5ada para asignar un valor nulo a cualquier variable puntero, como por e$emplo, ptr .B nil. ,s v#lido comparar el valor de un puntero para averiguar si no apunta a nada o bien si apunta a una direccin especfica, como por e$emplo, ptr B nil o bien ptr V nil. Si un puntero no apunta a nada o tiene un valor indefinido ser# error 'acer una desreferencia del mismo. neO,ptr-. ,l procedimiento ne!(ptr) crea una 8aria%le dinmica en el heap y que pasar# ser apuntada por el puntero ptr indicado en su par#metro actual. La regin de memoria asignada debe ser contigua, es decir, no fragmentada, por lo tanto, se debe encontrar un bloque de memoria lo suficientemente grande como para poder abastecer el pedido solicitado, de acuerdo al tama;o del nodo. ,n caso de encontrar espacio suficiente contiguo, se descuenta del 'eap la cantidad de memoria solicitada y ptr pasa a apuntar el primer byte de esa regin de memoria. La cantidad de bytes a descontar se determina por el tipo de dato al que apunta ptr. Si no se llegara a encontrar un bloque de memoria contiguo lo suficientemente requerido, entonces ptr quedar# indefinido. El siguiente e+emplo crea una 8aria%le dinmica en el Leap: 8ar Seg. atos var.est#tica Heap variable din#mica //////4/ //44//4/ ptr ptr . NCord> %egin neC&ptr(> ptrN.B H72> Criteln&Svalor. S, ptrN( end. dispose,ptr-. ,l procedimiento dispose(ptr) libera la regin de memoria en el 'eap apuntada por ptr. Se producir# un error si ptr no apunta a nada o si no apunta al 'eap. Luego de reali5ar esta accin ptr quedar# indefinido y 'acer una desreferencia ocasionar#
Clase 12
AyE
)./.4. 5.#...A.
Pgina 1D
en un error4. La regin de memoria liberada queda nuevamente disponible al 'eap y se incrementa el tama;o disponible de acuerdo a la magnitud del tipo de dato al que apuntaba el puntero ptr. !emA8ail. La funcin mema8ail retorna un valor de tipo longint que indica la cantidad de memoria libre en el 'eap. !a>A8ail. La funcin maxa8ail retorna un valor de tipo longint que indica el bloque de memoria contigua m#s grande. Las estructuras dinmicas de datos pueden di8idirse en dos grandes grupos: 1. Lineales Estr. datos Pila Cola Lista #estricciones S$ S$ 4" ProLi%ido recorrer los elementos !o8imiento L.$.5.". 5.$.5.". Ptr. e>terno 1 2 1
4.4. Pilas 4.2. 2olas 4.3. Listas 2. 4o lineales 2.4. Lrafos 2.2. Wrboles ,n esta c#tedra se llega 'asta las estructuras lineales. 4" ". ,l nodo es una unidad de informacin y que contiene b#sicamente dos campos, un campo $45" y un campo S:/E. ,l campo @N%+ puede ser de tipo estructurado para que pueda contener m#s de un valor.
0ebo aclarar que en Turbo Pascal esto no es tan as, en realidad, se sigue apuntando a la misma regin de memoria y por otro lado, en ese lugar sigue almacenada la misma informacin anterior al dispose.
Clase 12
AyE
)./.4. 5.#...A.
Pgina 11
notacin m#s adaptada para el proceso computacional como lo es la notacin prefi.a o sufi.a &esto es el operador aparece antes de sus operandos o bien despu!s de sus operandos respectivamente(. ,n estas dos 6ltimas formas no son necesarios el uso de los par!ntesis. ,stos tipos de notaciones se deben a los traba$os reali5ados por el matem#tico polaco 9u"asie!ics). E+emplos. a:b Enotacin infi$aF :ab Enotacin prefi$aF ab: Enotacin postfi$aF Las estructuras din#micas de datos del tipo pila presentan restricciones en cuanto a su mane$o. ,sto es, cada nuevo elemento que se incorpore a la pila debe de reali5arse por la parte superior o tope o cima, y cada elemento que se retire de la pila debe efectuarse tambien por la parte superior o tope o cima. ,sto 'ace que este tipo de estructura el 6ltimo elemento en ingresar sea el primer elemento en salir, a este movimiento de los elementos que entran y salen se lo conoce como m!todo L.$.5.".. Por lo tanto, est# terminantemente pro'ibido recorrer la pila, es decir, acceder a los elementos del mismo sin 'aber retirado los que se encontraban por el tope. Todo elemento que se incorpore o retire debe de 'acerse si o si por el tope. An puntero e terno estar# apuntando siempre al elemento que se encuentre en el tope. Ana ve5 que se incorpore un nuevo elemento, el puntero e terno apuntar# al nuevo elemento incorporado. Por otro lado, cada ve5 que se retire un elemento, el puntero e terno apuntar# al elemento que 'aya quedado en el tope, siempre y cuando 'aya otro elemento en la pila, caso contrario la pila quedar# vaca y el puntero e terno no apuntar# a nada. ,l primer elemento incorporado a la pila no apunta a nada y cada nuevo elemento que se incorpore posteriormente apuntar# al elemento que se encontraba en el tope antes de la incorporacin del nuevo elemento. La primer accin que debemos reali5ar con una pila ser# asignar el valor nil al puntero e terno a la pila. ,l valor nil es un valor gen!rico para que un puntero no apunte a nada, en realidad le asigna la direccin de segmento B / y despla5amiento B /. ,s decir, si Pila es el puntero e terno a la pila, 'acer Pila.B nil, es lo mismo que 'acer Pila.B ptr&/,/(. ,n general un elemento de la pila estar# constituido por 2 componentes. Ana componente indicar# la informacin de ese elemento y la otra componente un puntero empotrado el cual apuntar# al elemento anterior ubicado en la pila. Por lo tanto el puntero e terno a la pila y cada uno de los punteros empotrados apuntan a una misma estructura de datos del tipo pila. La estructura idnea para representar un elemento de la pila es el tipo registro que tendr# b#sicamente dos campos, un campo $45" que contiene un valor de informacin y un campo S:/E que contendr# la direccin del elemento anterior en la pila, salvo que sea el primero en cuyo caso contendr# el valor nil. type Tipo@nfo B stringO3/P> Epuede ser un registroF TipoPila B NTipoNodo> TipoNodo B #ecord @nfo . tipo@nfo> Sgte . tipoPila end> Clase 12 AyE )./.4. 5.#...A. Pgina 1F
8ar Pila . TipoPila> Los procesos para el mane+o de la estructura del tipo pila son: 4. 2. 3. 8. H. 2rearPila&8ar Pila.tipoPila(> o en su lugar Pila.B nil *eter&8ar Pila.tipoPila> valor.tipo@nfo(> Sacar&8ar Pila.tipoPila> 8ar valor.tipo@nfo(> Pila1acia&8ar Pila.tipoPila(. boolean> o en su lugar preguntar si Pila B nil. PilaLlena&*agnitudNodo. Cord(. boolean> o en su lugar *a "vail X Si5e+f&Nodo(
" continuacin se presenta un proceso que ingresa tres elementos a la pila y posteriormente los retira. Pila.B nil> for i.B 4 to 3 do %egin Crite&S@ng. readln& (> *eter&Pila, ( end> OLile Pila V nil do %egin Sacar&Pila, (> Criteln& ( end>
Animar Meter
Animar Sacar
Clase 12
AyE
)./.4. 5.#...A.
Pgina 1H
parte posterior o final o atr#s, y cada elemento que se retire de la cola debe efectuarse por la parte del frente o por delante o inicio. ,sto 'ace que este tipo de estructura el primer elemento en ingresar sea el primer elemento en salir, a este movimiento de los elementos que entran y salen se lo conoce como m!todo 5.$.5.".. ,st# en consecuencia terminantemente pro'ibido recorrer la cola, es decir, acceder a los elementos del mismo sin 'aber retirado los que se encontraban por el frente. Todo elemento que se incorpore debe de 'acerse si o si por el final y cada elemento que se retire debe de 'acerse si o si por el frente. An puntero e terno estar# apuntando siempre al primer elemento de la cola y un segundo puntero e terno estar# apuntando siempre al 6ltimo elemento de la cola. Ana ve5 que se incorpore un nuevo elemento, el puntero e terno final apuntar# al nuevo elemento incorporado. Por otro lado, cada ve5 que se retire un elemento, el puntero e terno frente apuntar# al nuevo elemento que 'aya quedado al inicio, siempre y cuando 'aya otro elemento en la cola, caso contrario la cola quedar# vaca y los punteros e ternos no apuntar#n a nada. 2ada nuevo elemento incorporado a la cola el campo Sgte no apunta a nada y el elemento anterior de$ar# de no apuntar a nada para pasar a apuntar al nuevo elemento incorporado a la cola. La primera accin que debemos reali5ar ser# asignar el valor nil a los punteros e ternos a la cola, esto es, 2ola$rente y 2ola$in, si estos fueran los nombres de los punteros e ternos. ,l valor nil es un valor gen!rico para que un puntero no apunte a nada, en realidad le asigna la direccin de segmento B / y despla5amiento B /. ,s decir, si 2ola%rente y 2ola%in son los punteros e ternos a la cola, 'acer 2ola%rente.B nil, y 2ola%in.B nil, es lo mismo que 'acer 2ola%rente.B ptr&/,/( y 2ola%in.B ptr&/,/(. ,n general un elemento de la cola estar# constituido por 2 componentes. Ana componente indicar# la informacin de ese elemento y la otra componente un puntero empotrado el cual apuntar# al elemento siguiente ubicado en la cola. Por lo tanto los punteros e ternos a la cola y cada uno de los punteros empotrados apuntan a una misma estructura de datos del tipo cola. La estructura idnea para representar un elemento de la cola es el tipo registro que tendr# b#sicamente dos campos, un campo $45" que contiene un valor de informacin y un campo S:/E que contendr# la direccin del elemento siguiente en la cola, salvo que sea el 6ltimo en cuyo caso contendr# el valor nil. type Tipo@nfo B stringO3/P> Epuede ser un registroF Tipo2ola B NTipoNodo> TipoNodo B #ecord @nfo . tipo@nfo> Sgte . tipo2ola end> 8ar 2ola%rente, 2ola%in . Tipo2ola> Los procesos para el mane+o de la estructura del tipo Cola son: 4. 2rear2ola&8ar 2ola%rente, 2ola%in.tipo2ola(> o 2ola%rente.B nil> 2ola%in.B nil> 2. "gregar&var 2ola%rente, 2ola%in.tipo2ola> valor.tipo@nfo(> Clase 12 AyE )./.4. 5.#...A. Pgina 1J
3. Suprimir&8ar 2ola%rente, 2ola%in.tipo2ola> 8ar valor.tipo@nfo(> 8. 2ola1acia&8ar 2ola%rente.tipo2ola(.boolean> o en su lugar preguntar si Pila B nil. H. 2olaLlena&*agnitudNodo.Cord(.boolean> o en su lugar *a "vail X Si5e+f&Nodo( " continuacin se presenta un proceso que ingresa tres elementos a la pila y posteriormente los retira. 2ola%rente.B nil> 2ola%in.B nil> for i.B 4 to 3 do %egin Crite&S@ng. valor. S(> readln& (> "gregar&2ola%rente, 2ola%in, ( end> OLile 2ola%rente V nil do %egin Suprimir&2ola%rente, 2ola%in, (> Criteln& ( end> Hacer do%le clic Hacer do%le clic
Animar Agregar
Animar Suprimir
un campo S:/E que contendr# la direccin del elemento siguiente en la lista, salvo que sea el 6ltimo en cuyo caso contendr# el valor nil. type Tipo@nfo B stringO3/P> Epuede ser un registroF TipoLista B NTipoNodo> TipoNodo B #ecord @nfo . tipo@nfo> Sgte . tipoLista end> 8ar Pila . TipoLista> Los procesos para el mane+o de la estructura del tipo lista son: 4. 2. 3. 8. H. 7. I. G. 2rearLista&8ar Lista.tipoLista(> o en su lugar Lista.B nil @nsertaNodo&8ar Lista.tipoLista> valor.tipo@nfo(> @nsertaPrimero&var Lista.tipoLista> valor.tipo@nfo(> @nserta0elante&var Lista.tipoLista> valor.tipo@nfo(> @nserta,n*edio&8ar Lista.tipoLista> valor.tipo@nfo(> SuprimeNodo&var Lista.tipoLista> var valor.tipo@nfo(> Lista1acia&8ar Lista.tipoLista(. boolean> o en su lugar preguntar si Lista B nil. ListaLlena&*agnitudNodo. Cord(. boolean> o en su lugar *a "vail X Si5e+f&Nodo(
,l mdulo @nsertaPrimero es invocado cuando el puntero a la Lista es nil y esto sucede una ve5, en cambio el mdulo @nserta0elante es invocado cuando un nuevo nodo se incorpora a la lista al inicio, debido a que el valor del campo clave es menor al valor del primer nodo en la lista. Solo una sentencia difiere en ambos mdulos, esto es, cuando se asigna al campo Sgte del nuevo nodo el valor nil o el valor del puntero e terno de Lista, pero tanto en un caso como en el otro se podra asignar el valor del puntero e terno de Lista, debido a que cuando la lista est# vaca se asignar# el valor nil y cuando ya e ista alg6n nodo en la lista se le asignar# la direccin del nodo que est# siendo apuntado por el puntero e terno Lista. Por lo tanto, se reempla5ar#n los mdulos @nsertaPrimero e @nserta0elante por el mdulo @nserta@nicio&var Lista.tipoLista> valor.tipo@nfo(> en el cual la sentencia ptrN.Sgte.B nil o ptrN.Sgte.Lista establecida en los mdulos @nsertaPrimero e @nserta0elante respectivamente se reemplar# por ptrN.Sgte.Lista. ,l mdulo @nsertaNodo&Lista, valor(> tambi!n se reempla5ar# por otras sentencias. ,n lugar de reali5ar tres decisiones solo ser#n necesarias tomar dos decisiones, en la cual, la primera decisin tendr# una condicin compuesta, siendo ellas &Lista B nil( or &valor X ListaN.@nfo(, en los casos en que sea verdadero se invocar# al mdulo @nserta@nicio y en caso contrario, se invocar# a @nserta,n*edio. " continuacin se presenta un proceso que ingresa cinco elementos a la lista manteniendo siempre un orden por el valor del campo @nfo en forma ascendente y posteriormente los retira.
Clase 12
AyE
)./.4. 5.#...A.
Pgina 21
Lista.B nil> for i.B 4 to H do %egin Crite&S@ng. valor. S(> readln& (> E2/, H/, 4/, 3/, I/F @nsertaNodo&Lista, ( end> OLile Lista V nil do %egin Criteln&S@ng. valor. S(> readln& (> EH/, 4/, I/, 2/, 3/F SuprimeNodo&Lista, (> Criteln& ( end>
Animar InsertaNodo
Animar SuprimeNodo
Hacer do%le clic Hacer do%le clic Los mdulos presentados anteriormente son solo un modelo que resuelven algunas de las situaciones que podr#n presentarse en diferentes procesos. Por e$emplo, los procesos anteriormente indicados ordenan una lista en forma creciente, siempre genera una nueva variable din#mica al invocarlos, y en casos de repeticin del campo clave, se inserta como segundo nodo si el valor de la clave que se repite es el valor del primer nodo de la lista, pero se incorporar# delante de los valores de las otras claves correspondientes. Tal ve5 este comportamiento sea el esperado para ciertos procesos pero no para otros. ,n ciertos casos algunos ligeros cambios modificar#n esos comportamiento y en otros casos debamos reali5ar modificaciones m#s dr#sticas. )ay situaciones en la cual no queremos repetir el valor de un campo clave, lo que 'acemos es buscar si e iste ese valor en la lista, en caso de no encontrarse creamos el nodo, pero si e iste no. ,n el primer caso al no e istir el nodo, si invocamos al mdulo @nsertaNodo, se volver# a recorrer nuevamente la lista 'asta el punto de insercin, pero si ya 'abamos recorrido la lista, porque no optimi5ar el proceso enla5ando el nuevo nodo con aquellos nodos dentro de su entorno locali5ados en la b6squeda previa. Si queremos enla5ar los nodos en una lista pero ordenada en forma decreciente, Yqu! debemos modificar de los mdulos mencionados m#s arribaZ. Si el campo @nfo debemos almacenar m#s de un valor, entonces deber# ser de un tipo estructurado de datos, como ser del tipo registro y en estos casos tambi!n vale la siguiente pregunta Ycu#les son los cambios a reali5ar en los mdulos indicados precedentementeZ ,stas y otras cuestiones m#s podran presentarse en los diferentes procesos y que deberamos replantearnos acerca de utili5ar o no esos mdulos o reempla5arlos por otros. Para los procesos que requieran no repetir nodos para el valor de una misma clave, a continuacin se presentan dos mdulos adicionales a los establecidos previamente.
Clase 12
AyE
)./.4. 5.#...A.
Pgina 22
4.2
A nim ar E xisteNodoA nt
4.3
A nim ar E x isteNodoA ct
,l mdulo Existe*odo busca un nodo con un valor en cuyo campo clave coincida con el valor pasado, en ese caso informa la direccin de memoria del nodo con valor igual a valor, caso contrario retorna la direccin del nodo previo o si no e iste un valor nil. 2. 2rearNodo&var Lista, ptrNodo"nt.tipoLista> valor.tipo@nfo(>
2.4.
A nim ar C rearN odoN il
,l mdulo 2rear*odo crea un nuevo nodo enla5ado a continuacin del nodo apuntado por ptrNodo"nt si es distinto de nil, caso contrario lo inserta por el inicio de la lista. ,n los casos de requerir la locali5acin ordinal de un nodo en la lista, se presenta el siguiente mdulo. Hacer do%le clic -uscarNodo&var Lista.tipoLista> pos.longint( . tipoLista>
A nim ar Bus c ar N odo
E+emplo. Se tiene una lista, en donde cada nodo representa un da de un mes. -uscar el nodo que se corresponde con un da informado se proceder# a recorrer la lista tantos nodos como lo indique el n6mero del da conocido, es decir, si el da dado es el primero la funcin :uscar*odo retorna el puntero al primer nodo de la lista, si el da dado es el segundo entonces la funcin retorna el puntero al segundo nodo y as sucesivamente. La diferencia con el mdulo , isteNodo est# dada por el 'ec'o de que en la lista mencionada en el e$emplo anterior no necesitamos guardar el dato del n6mero del da, ya que en la lista e iste un nodo por cada da del mes, en cambio cuando no aseguramos encontrar un nodo por cada da de un mes, Kseg6n este e$emploK en estos casos debemos
Clase 12
AyE
)./.4. 5.#...A.
Pgina 2B
guardar en el nodo el n6mero del da, la funcin , isteNodo buscar# si el nodo visitado en un momento determinado su campo clave coincide con el valor buscado. " continuacin se presentar# una estructura din#mica combinada con otra estructura din#mica. ,n estos casos podemos encontrarnos con una lista de listas o una lista de pilas o una lista de colas. Por un lado tenemos una lista principal y por otro una lista secundaria o sublista o subpila o subcola por cada uno de los nodos de la lista principal. ,l campo @N%+ del nodo en la lista principal deber# contar con un subKcampo de tipo puntero el cual apuntar# a la subKestructura de datos din#mica. -uscar un subKnodo requerir# primero buscar un nodo en la lista principal y una ve5 locali5ado ese nodo, buscar el subKnodo en la subKestructura din#mica que cuelga de ese nodo en la lista principal. Lr#ficamente lo podemos representar de la siguiente manera.
Lista
,l siguiente e$emplo representa una estructura est#tica de punteros a estructuras din#micas de datos y de esta una subKestructura tambi!n din#mica de datos. 4 2 3 8 H 7 I G R 4/
1ecPtrOiP
An nodo sin el campo Sgte. An nodo en que el campo @nfo es de tipo registro. An nodo en que el campo @nfo es un arreglo. An nodo con el campo @nfo que es un puntero a un tipo registro. Y2u#l sera la utilidadZ C"4CL)S$94.
Clase 12
AyE
)./.4. 5.#...A.
Pgina 22
Las variantes que podemos formar con las ES/#)C/)#AS E A/"S aprendidas en la cursada de ["lgoritmos y ,structuras de 0atos\, solo depender#n de nuestra imaginaci'n, creati8idad, o el ingenio, para representar al mundo real. ,l uso de una metodologAa para resolver problemas, como fue anali5ada en las primeras clases, nos brindar# de un cimiento slido para encarar la solucin. ,s imprescindible primero comprender el problema, luego de lo cual, elaboraremos una estrategia, en la cual destacaremos las partes rele8antes, y por refinamiento sucesi8o iremos ampliando nuestro grado de detalles> por lo tanto, siempre iniciaremos nuestra solucin desde lo general Lacia lo particular. Luego construiremos nuestro algoritmo el cual dar# la solucin a nuestro problema. Por 6ltimo, codificaremos el algoritmo con un lengua$e de computadora, para que pueda ser e$ecutado por la m#quina. ,s importante elaborar una muestra de datos bien pensada para la situacin, que contemple todas las posibilidades, incluso las m#s e tremas y de los resultados =ue esperarAamos o%tener para luego compararlo con los resultados conseguidos con la e$ecucin del programa por la computadora. 0efinimos "lgoritmo como la concatenacin de sentencias de asignaciones internas y?o e ternas que son regidas por ES/#)C/)#AS E C"4/#"L E P#":#A!A Jconcatenaci'n, selecci'n y repetici'nK, que determinan el orden de e$ecucin de esas sentencias. Por lo tanto, la solucin no solo correcta, sino, ptima depender# muc'o de las estructuras de control seleccionadas, es decir, debemos plantearnos que tipo de estructura de control debemos utili5ar, en el caso de repeticin, un ciclo mientras o 'asta o e acto> en una seleccin una seleccin simple o m6ltiple, ciclos anidadas o en secuencia, decisiones anidadas o en secuencia. ,l uso adecuado de las estructuras elegidas, tanto para los datos como para el control de programa 'ar#n que nuestro algoritmo sea m#s sencillo, simple, compacto, m#s r#pido para e$ecutar, y esto no es poca cosa. ,ncontrar alternativas de solucin para un mismo problema nos va a permitir seleccionar la m#s adecuada, oportuna, en otras palabras, la solucin ptima. ,l que encontremos diferentes alternativas, no implica que no e istan otras. Lo importante es obtener un abanico de posibilidades y decidir cual elegir y no quedarnos con la primera solucin encontrada.
Clase 12
AyE
)./.4. 5.#...A.
Pgina 2D