<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5100408444678612840</id><updated>2011-09-18T20:04:49.934-07:00</updated><title type='text'>+AlgoritmosEstructurasDeDatos</title><subtitle type='html'>Sitio destinado a estudiantes e interesados en la programación de computadoras.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pascalgo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://pascalgo.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Lic. Hugo Cuello</name><uri>http://www.blogger.com/profile/00801409318639239421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5100408444678612840.post-4660046404887241699</id><published>2009-12-02T16:50:00.000-08:00</published><updated>2009-12-02T16:54:17.405-08:00</updated><title type='text'>DiaN</title><content type='html'>&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"  &lt;br /&gt; width="320"  &lt;br /&gt; height="230"  &lt;br /&gt; codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab"&gt;  &lt;br /&gt; &lt;param name="movie" value="http://dian.publiquest.net/app/blogEmbbed/blogEmbed.swf?key=5117d46c31c819e46e06d88902cfd3a1&amp;blogOwnerId=18b283f070f0ec2f327a94a85f62a9f6" /&gt;  &lt;br /&gt; &lt;param name="quality" value="high" /&gt;  &lt;br /&gt; &lt;param name="salign" value="TL" /&gt;  &lt;br /&gt; &lt;param name="base" value="http://dian.publiquest.net/app/blogEmbbed/blogEmbed.swf" /&gt;  &lt;br /&gt; &lt;param name="bgcolor" value="#000000" /&gt;  &lt;br /&gt; &lt;param name="allowScriptAccess" value="always" /&gt;  &lt;br /&gt;    &lt;"http://dian.publiquest.net/app/blogEmbbed/blogEmbed.swf" width="320" height="230" salign="TL" scale="noscale" quality="high" allowScriptAccess="always" src="http://dian.publiquest.net/app/blogEmbbed/blogEmbed.swf?key=5117d46c31c819e46e06d88902cfd3a1&amp;amp;blogOwnerId=18b283f070f0ec2f327a94a85f62a9f6" type="application/x-shockwave-flash" /&gt;  &lt;br /&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100408444678612840-4660046404887241699?l=pascalgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://dian.publiquest.net/app/blogEmbbed/blogEmbed.swf' title='DiaN'/><link rel='replies' type='application/atom+xml' href='http://pascalgo.blogspot.com/feeds/4660046404887241699/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5100408444678612840&amp;postID=4660046404887241699' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/4660046404887241699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/4660046404887241699'/><link rel='alternate' type='text/html' href='http://pascalgo.blogspot.com/2009/12/dian.html' title='DiaN'/><author><name>Lic. Hugo Cuello</name><uri>http://www.blogger.com/profile/00801409318639239421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5100408444678612840.post-2274809819481449612</id><published>2008-04-02T16:21:00.000-07:00</published><updated>2009-03-11T18:08:53.832-07:00</updated><title type='text'>Punteros y Estructuras Dinámicas Lineales: Pilas, Colas y Listas</title><content type='html'>&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;p align="center"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=5100408444678612840&amp;amp;postID=2274809819481449612#ABAJO"&gt;Abajo&lt;/a&gt;&lt;br /&gt;&lt;a name="estrdin"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;a name="_Toc70612883"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;CLASE 12:&lt;/strong&gt; &lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;em&gt;Punteros y Estructuras dinámicas de datos: Pilas, Colas y Listas&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;strong&gt;Estructuras dinámicas de Datos&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;Los punteros son variables cuyos contenidos son una dirección en la memoria interna de la computadora. Si bien apuntan a una dirección de memoria, para que 2 punteros puedan ser comparados, o asignar la dirección que contiene una variable puntero a otra, deben ser ambos del mismo tipo de dato al que apuntan, para que no se genere un error de incompatibilidad de tipo o &lt;em&gt;type mismatch -Error: 26 informado por Turbo Pascal-&lt;/em&gt;. Por lo tanto, los punteros en Turbo Pascal son &lt;strong&gt;punteros a un tipo de dato&lt;/strong&gt; específico. No obstante, existe la posibilidad de poder definir punteros genéricos por medio del identificador &lt;strong&gt;pointer&lt;/strong&gt;.&lt;br /&gt;&lt;a name="mapmem"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;MAPA DE MEMORIA&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;A continuación se pasará a detallar como divide el lenguaje Turbo Pascal las regiones de memoria interna, al cargarse un programa.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Memoria Superior D.O.S.&lt;/strong&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R_QVeBEk_oI/AAAAAAAAAOQ/LIMxDT0mjGA/s1600-h/MapaMem.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184792676438179458" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R_QVeBEk_oI/AAAAAAAAAOQ/LIMxDT0mjGA/s400/MapaMem.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;La memoria interna está dividida en segmentos, en donde &lt;strong&gt;cada segmento tiene un tamaño de 64Kbytes&lt;/strong&gt;. Algunos de estos segmentos cumplen un rol específico a la hora de correr o ejecutar un programa. Estos segmentos especiales son 3 más una región de memoria restante que representan lo siguiente: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol type="1"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Segmento de DATOS –DATA-:&lt;/strong&gt; El lenguaje Turbo Pascal utiliza este segmento para reservar espacio para las variables de ámbito o &lt;strong&gt;alcance global&lt;/strong&gt;. Las variables definidas en este segmento son &lt;strong&gt;variables estáticas&lt;/strong&gt; y deben ser definidas en &lt;strong&gt;tiempo de compilación&lt;/strong&gt;, ocuparán el espacio reservado mientras la ejecución del programa está en marcha. Todas las variables del módulo principal más todas las variables de las unidades empleadas por el módulo principal ocuparán el único segmento de datos, que no podrá exceder los 64Kbytes. &lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Segmento de CÓDIGO -CODE-&lt;/strong&gt;: El lenguaje Turbo Pascal utiliza este segmento para el código del programa (bloque principal + módulos definidos), pero el tamaño total no está limitado a un segmento de 64Kbytes. La manera de ampliar el tamaño de código por encima de los 64Kbytes es empleando unidades. Cada unidad tiene su propio segmento de código, en donde, cada uno de ellos no puede exceder los 64Kbytes, pero el tamaño total de código está limitado solamente por el tamaño de la memoria disponible. &lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Segmento de la PILA –STACK-:&lt;/strong&gt; El lenguaje Turbo Pascal utiliza este segmento para guardar la dirección de retorno al invocar a un módulo, los parámetros y las variables de alcance o ámbito local. El valor asignado por defecto es de 16Kbytes, pero puede ser ampliado a 64Kbytes por medio de la directiva al compilador $M. El stack crece desde dirección de memoria más alta hacia direcciones de memoria más bajas. &lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Área de memoria del MONTÍCULO –HEAP-:&lt;/strong&gt; El lenguaje Turbo Pascal utiliza esta región de memoria, en realidad son varios segmentos, para la creación de variables dinámicas, esto es, &lt;strong&gt;variables que se crearán y se eliminarán cuando ya no se las necesite, en tiempo de ejecución&lt;/strong&gt;. Esto permite ampliar los 64Kbytes del segmento de datos; por lo tanto, está región de memoria estará disponible para poder extender la cantidad de variables en caso de requerir más nuestro proceso en ejecución. El tamaño real del &lt;em&gt;heap&lt;/em&gt; estará establecido por un valor mínimo, que puede ser cero (valor por defecto) u otro valor mayor y por un valor máximo, que pueden ser los 640Kbytes (valor por defecto) u otro valor menor, que puede ser establecido por medio de la &lt;strong&gt;directiva al compilador $M.&lt;/strong&gt; Si la cantidad mínima de memoria no está disponible, el programa no se ejecutará. El heap crece desde una dirección de memoria baja hacia direcciones de memoria más altas. &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;En conclusión, si un programa requiere más espacio para variables que los 64Kbytes que ofrece el segmento de datos, se debe emplear el área del heap.&lt;br /&gt;Por otro lado para ampliar el tamaño del código de programa por encima de los 64Kbytes que ofrece el segmento de código, se deben emplear las unidades, cada una de las cuales pueden utilizar un máximo de 64Kbytes y cada una de ellas tiene su propio segmento de código, pero las variables que utilicen se ubicarán en el segmento de datos empleado por el módulo principal. Esto 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 64Kbytes.Si se divide el bloque principal en módulos podremos ahorrar el espacio del segmento de datos, debido a que ciertas variables de trabajo temporal estarían definidas dentro de cada módulo ubicándose en el segmento de la pila o stack y dejarían de estar ubicadas en el segmento de datos. De 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. Esto es cada vez que se invoca a un módulo tanto los parámetros como las variables locales se guardan en la pila, es decir se crean en el momento de invocar al módulo y son destruidas al abandonarlo.&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R_QW5BEk_pI/AAAAAAAAAOY/QH3DLkRWU0A/s1600-h/MapaMem2.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184794239806275218" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R_QW5BEk_pI/AAAAAAAAAOY/QH3DLkRWU0A/s400/MapaMem2.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;a name="unidades"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;UNIDADES&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Una unidad es una colección de diferentes objetos. Estos objetos pueden ser &lt;strong&gt;Unidades, Constantes, Tipos, Procedimientos, Funciones y Variables&lt;/strong&gt;. Las unidades presentan las características más interesante para la descomposición de un proyecto grande en módulos más pequeños. Permiten la compilación independiente, ya que cada unidad es compilada en forma separada del programa principal. A través de las unidades se pueden construir grandes programas. Por otro lado al dividir el proyecto en módulos independientes cuando surja la necesidad de realizar algún cambio, solo se deberá recurrir el módulo correspondiente. Las unidades requeridas por el programa principal son indicadas en la cláusula &lt;strong&gt;uses &lt;/strong&gt;las que se enlazarán con el código del programa principal, en el momento de compilar solo se compilarán las sentencias del bloque principal y los módulos definidos en él, pero no las unidades, debido a que se encuentran ya compiladas. Por lo tanto se conseguirá un ahorro en tiempo de compilación. La compilación de una unidad se realiza una sola vez y luego de haberla creado y habiéndola depurado de posibles errores. Luego estará lista para ser usada en diferentes programas que requieran de su uso.&lt;br /&gt;Al crear una unidad debemos tener en cuenta cual es su objetivo de uso, ya que sabiendo esto se construiran las unidades para un tema específico. Por ejemplo unidades para funciones matemáticas, para tratamiento de cadenas, para operaciones de entrada y salida, etc..&lt;br /&gt;Turbo Pascal brinda diferentes colecciones de unidades cada una de las cuales cumple una tarea concreta, algunas de las cuales son: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;CRT:&lt;/strong&gt; Unidad dedicada al manejo de la pantalla y el teclado, brinda diferentes posibilidades para manejar la pantalla y el teclado de manera sencilla por medio de los objetos definidos en esta unidad, algunos de los cuales son: &lt;em&gt;gotoxy(x,y)&lt;/em&gt; que ubica al puntero de la pantalla en las coordenadas (x, y); &lt;em&gt;clrScr&lt;/em&gt; que borra la pantalla y ubica al puntero de la pantalla en x=1, y=1; wherex y wherey son funciones que informan la posición del cursor indicando la columna y fila respectivamente; &lt;em&gt;delay(n)&lt;/em&gt; que realiza una espera de n milisegundos; &lt;em&gt;keypressed&lt;/em&gt; avisa se se oprimió una tecla; &lt;em&gt;textcolor(n)&lt;/em&gt; cambia el color a los caracteres; &lt;em&gt;textbackground(n) &lt;/em&gt;cambia el color de fondo del carácter; &lt;em&gt;readkey&lt;/em&gt; lee una la tecla presionada; &lt;strong&gt;windows(x1,y1,x2,y2)&lt;/strong&gt; crea una ventana; &lt;em&gt;sound(n&lt;/em&gt;) genera un sonido de n hercios y &lt;em&gt;nosound&lt;/em&gt; desactiva el sonido, entre otros. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;PRINTER:&lt;/strong&gt; Unidad dedicada al manejo de la impresora, brinda servicios para el fácil manejo de la impresora ya que no requiere realizar la asignación de nombres físico y lógico, abrir la impresora o cerrarla, además define la variable &lt;em&gt;lst&lt;/em&gt; para ser utilizada como nombre lógico del archivo de la impresora, para poder ser empleada en las sentencia write y writeln como nombre del dispositivo al que se destinará la salida impresa. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;DOS:&lt;/strong&gt; Unidad dedicada al manejo de los servicios brindados por el D.O.S., entre los cuales contamos &lt;em&gt;getdate(aa,mm,dd,ds)&lt;/em&gt; el cual obtiene la fecha del sistema; &lt;em&gt;gettime(hh,mm,ss,cs)&lt;/em&gt; el cual obtiene la hora del sistema; &lt;em&gt;exec(NomProg, LineaCdo)&lt;/em&gt; ejecuta una aplicación desde Turbo Pascal; &lt;em&gt;diskFree(n)&lt;/em&gt; retorna el espacio disponible en el disco de la unidad n, entre otros.&lt;br /&gt;Otras unidades predefinidas por Turbo Pascal son GRAPH que define un conjunto de diferentes objetos relacionados con aplicaciones gráficas. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;La unidad &lt;strong&gt;SYSTEM&lt;/strong&gt; es una unidad un tanto especial ya que jamá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. En esta unidad encontramos todas las funciones numéricas, como ser, &lt;em&gt;sqrt(x), sqr(x), exp(x), ln(x), sin(x), cos(x), abs(x), int(x), trunc(x), round(x), random(x), randomize, frac(x)&lt;/em&gt;, funciones para el tratamiento de cadenas alguna de las cuales son &lt;em&gt;length(cad), upcase(car), copy(subcad,pos_ini,cant)&lt;/em&gt;, manejo de las operaciones de entrada y salida de archivos como ser &lt;em&gt;assign(nl, nf), reset(nl), rewrite(nl), close(nl), read(nl, nr), write(nl, nr), filepos(nl), seek(nl, dir)&lt;/em&gt;, entre otros.&lt;br /&gt;Turbo Pascal reúne varias unidades en un solo archivo denominado &lt;strong&gt;TURBO.TPL&lt;/strong&gt; el cual forma una &lt;em&gt;librería&lt;/em&gt;. &lt;/span&gt;&lt;br /&gt;&lt;a name="unidxusu"&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Unidades definidas por el usuario&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Turbo Pascal da la posibilidad de que el programador pueda crear sus propias unidades. Para poder confeccionar una unidad debemos conocer su composición o esquema lógico.&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Una unidad de Turbo Pascal consta de las siguientes partes:&lt;/strong&gt; &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Una cabecera precedida por la palabra reservada &lt;strong&gt;Unit&lt;/strong&gt;, el identificador &lt;em&gt;IdUnidad&lt;/em&gt; debe tener el mismo nombre que el archivo en disco de la unidad. &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Una parte de interfaz precedida por la palabra reservada &lt;strong&gt;interface&lt;/strong&gt; que tiene &lt;strong&gt;carácter público&lt;/strong&gt;, es decir los objetos aquí definidos pueden ser accedidos desde un ámbito externo a la unidad, esto es, los programas que requieran el servicio de la unidad pueden utilizar estos objetos. En el caso de los módulos, funciones y procedimientos, solo de definen las cabeceras, por lo cual solo se indicará el nombre del módulo, 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 función. &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Una parte de implementación precedida por la palabra reservada &lt;strong&gt;implementation&lt;/strong&gt; que tiene &lt;strong&gt;carácter privado&lt;/strong&gt;, es decir los objetos aquí definidos y que no fueron indicados en la parte de interface no podrán ser accedidos desde un ámbito externo a la unidad, solo podrá acceder la unidad para un requerimiento de uso local necesario para el desarrollo del proceso interno a la misma. En el caso de los módulos, funciones y procedimientos, además de establecer la cabecera de los mismos, se desarrollan en forma completa el conjunto de las sentencia que deban de realizarse para la actividad del módulo como así tambien los objetos propios y locales del módulo. &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Una última parte de inicialización de la unidad encerrada entre las palabras reservadas &lt;strong&gt;begin&lt;/strong&gt; y &lt;strong&gt;end&lt;/strong&gt;. Por ejemplo, inicializar las variables definidas en la unidad, ejecutar algunas sentencias o invocaciones a los módulos definidos en la unidad.&lt;br /&gt;Una vez que la unidad ha sido probada con éxito se procede a realizar la compilación por única vez, a menos que en el futuro debamos efectuar algún cambio. El programa que haga uso de la unidad, solo deberá enlazarla a su propio código, el único que deberá compilarse. Las ventajas de usar unidades es que permiten la construcción 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 librerías para ser empleadas por diferentes programas.&lt;br /&gt;A continuación se presenta la estructura de una unidad:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;!-- .syntax0 { color: #000000; } .syntax1 { color: #cc0000; } .syntax2 { color: #ff8400; } .syntax3 { color: #6600cc; } .syntax4 { color: #cc6600; } .syntax5 { color: #ff0000; } .syntax6 { color: #9966ff; } .syntax7 { background: #ffffcc; color: #ff0066; } .syntax8 { color: #006699; font-weight: bold; } .syntax9 { color: #009966; font-weight: bold; } .syntax10 { color: #0099ff; font-weight: bold; } .syntax11 { color: #66ccff; font-weight: bold; } .syntax12 { color: #02b902; } .syntax13 { color: #ff00cc; } .syntax14 { color: #cc00cc; } .syntax15 { color: #9900cc; } .syntax16 { color: #6600cc; } .syntax17 { color: #0000ff; } .syntax18 { color: #000000; font-weight: bold; } .gutter { background: #ededed; color: #000000; } .gutterH { background: #ededed; color: #990066; } --&gt;&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;pre&gt;&lt;span class="syntax0"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:78%;"&gt;&lt;span class="gutter"&gt;   1:&lt;/span&gt;&lt;span class="syntax8"&gt;Unit&lt;/span&gt; IdUnidad&lt;span class="syntax18"&gt;;&lt;/span&gt;      &lt;span class="syntax1"&gt;{&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;Encabezado&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;o&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;cabecera&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;de&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;la&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;unidad&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;}&lt;/span&gt;&lt;p&gt;&lt;span class="gutter"&gt;   2:&lt;/span&gt;&lt;span class="syntax8"&gt;interface&lt;/span&gt;           &lt;span class="syntax1"&gt;{&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;Parte&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;pública&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;}&lt;/span&gt;&lt;p&gt;&lt;span class="gutter"&gt;   3:&lt;/span&gt;  &lt;span class="syntax8"&gt;uses&lt;/span&gt;              &lt;span class="syntax1"&gt;{&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;Objetos&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;públicos&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;}&lt;/span&gt;&lt;p&gt;&lt;span class="gutter"&gt;   4:&lt;/span&gt;  &lt;span class="syntax8"&gt;const&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="gutterH"&gt;   5:&lt;/span&gt;  &lt;span class="syntax8"&gt;type&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="gutter"&gt;   6:&lt;/span&gt;  &lt;span class="syntax8"&gt;procedure&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="gutter"&gt;   7:&lt;/span&gt;  &lt;span class="syntax8"&gt;function&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="gutter"&gt;   8:&lt;/span&gt;  &lt;span class="syntax8"&gt;var&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="gutter"&gt;   9:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="gutterH"&gt;  10:&lt;/span&gt;&lt;span class="syntax8"&gt;implementation&lt;/span&gt;      &lt;span class="syntax1"&gt;{&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;Parte&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;privada&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="gutter"&gt;  11:&lt;/span&gt;  &lt;span class="syntax8"&gt;uses&lt;/span&gt;              &lt;span class="syntax1"&gt;{&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;Objetos&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;privados&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="gutter"&gt;  12:&lt;/span&gt;  &lt;span class="syntax8"&gt;const&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="gutter"&gt;  13:&lt;/span&gt;  &lt;span class="syntax8"&gt;type&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="gutter"&gt;  14:&lt;/span&gt;  &lt;span class="syntax8"&gt;procedure&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="gutterH"&gt;  15:&lt;/span&gt;  &lt;span class="syntax8"&gt;function&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="gutter"&gt;  16:&lt;/span&gt;  &lt;span class="syntax8"&gt;var&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="gutter"&gt;  17:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="gutter"&gt;  18:&lt;/span&gt;&lt;span class="syntax8"&gt;begin&lt;/span&gt;               &lt;span class="syntax1"&gt;{&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;Inicialización&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;de&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;la&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;unidad&lt;/span&gt;&lt;span class="syntax1"&gt; &lt;/span&gt;&lt;span class="syntax1"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="gutter"&gt;  19:&lt;/span&gt;  sentencias&lt;span class="syntax18"&gt;(&lt;/span&gt;s&lt;span class="syntax18"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="gutterH"&gt;  20:&lt;/span&gt;&lt;span class="syntax8"&gt;end&lt;/span&gt;&lt;span class="syntax18"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="gutter"&gt;&lt;span style="font-size:78%;"&gt;  21:&lt;/span&gt;&lt;p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;pre&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span class="syntax0"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;a name="dirmem"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Direccionamiento de memoria bajo el D.O.S.&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;El &lt;strong&gt;D.O.S. –Sistema Operativo en Disco-&lt;/strong&gt; puede direccionar hasta 1Mbyte de memoria, esto es 2&lt;sup&gt;20&lt;/sup&gt; = 1.048.576 bytes. El Turbo Pascal fue desarrollado para correr bajo el DOS y bajo la familia de procesadores 8088 y 8086. El esquema de la memoria permite direccionar hasta 1Mbyte a pesar de que el cableado de la circuitería interna de los registros sean de 16 bits. Para poder acceder a las direcciones de 20 bits debe utilizar un método de direccionamiento que encaje en el formato de 16 bits. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Direccionamiento segmentado&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;El espacio de memoria está dividio en segmentos, cada uno de los cuales tiene 64Kbytes de memoria. Para poder acceder a cada posición dentro de un segmento se utiliza un desplazamiento. Debido a que el desplazamiento se mide siempre en relación al segmento, este método se conoce como &lt;strong&gt;direccionamiento relativo.&lt;/strong&gt;&lt;br /&gt;La combinación de un segmento y un desplazamiento forma una &lt;em&gt;dirección segmentada&lt;/em&gt; que puede hacer referencia a un byte del espacio de memoria de un total de 1Mega byte. Una dirección segmentada de 32 bits es convertida por el procesador en una dirección de 20 bits utilizando la dirección del segmento como un párrafo adicionando la dirección del desplazamiento. En realidad se desplaza la dirección del segmento 4 bits hacia la izquierda y se le suma el valor del desplazamiento, dando como resultado una dirección de 20 bits.&lt;br /&gt;El siguiente ejemplo ilustra lo dicho anteriormente, si tomamos 1234H como una dirección de segmento y 4321H como una dirección de desplazamiento, la notación empleada para indicar una dirección segmentada sería 1234H:4321H. El número de la parte izquierda de los 2 puntos indica el segmento y el número de la parte derecha de los 2 puntos indica el desplazamiento. La letra H indica que el número está expresado en el sistema de numeración en base hexadecimal. Para calcular la &lt;strong&gt;dirección real&lt;/strong&gt; en memoria se procede a realizar las siguientes operaciones:&lt;br /&gt;12340H se agrega un cero por el extremo derecho a la dirección del segmento&lt;br /&gt;+ 4321H se suma la dirección del desplazamiento relativo&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;16661H es la dirección real en memoria&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Cualquier dirección de memoria puede ser establecida con diferentes combinaciones de direcciones segmentadas, por ejemplo la dirección real de memoria 16661H puede ser establecida no solo como 1234:4321, sino también como 1666:0001, 1665:0011, 1664:0021 y así sucesivamente.&lt;br /&gt;A continuación se presenta otro ejemplo utilizando notación binaria &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R_QYxREk_rI/AAAAAAAAAOo/3HIKPV00CV8/s1600-h/DirSeg.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184796305685544626" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R_QYxREk_rI/AAAAAAAAAOo/3HIKPV00CV8/s400/DirSeg.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;Distintas combinaciones de Segmento:Desplazamiento pueden obtener la misma direccion real de memoria, por ejemplo:&lt;br /&gt;0020:0100 = 0030:0000 = 0010:0200 = 0000:0300 = ...&lt;br /&gt;&lt;a name="ptrcer"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Punteros cercanos:&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Los &lt;strong&gt;punteros cercanos&lt;/strong&gt; –&lt;em&gt;NEAR&lt;/em&gt;- son punteros que solamente pueden apuntar a su propio segmento, utilizan solo la parte de desplazamiento para poder acceder dentro de los 64Kbytes o 65536 posiciones de memoria dentro del segmento. Por lo tanto &lt;strong&gt;2 bytes&lt;/strong&gt; serán necesarios, es decir, con 16 bits o 2&lt;sup&gt;16&lt;/sup&gt; para poder direccionar a cada byte de un segmento. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;a name="ptrlej"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Punteros lejanos:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Los &lt;strong&gt;punteros lejanos&lt;/strong&gt; –&lt;em&gt;FAR&lt;/em&gt;- 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 &lt;strong&gt;4 bytes&lt;/strong&gt;, es decir, 2 bytes para la parte de segmento y 2 bytes para la parte de desplazamiento. &lt;/span&gt;&lt;br /&gt;&lt;a name="modmem"&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Modelos de Memoria&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Los modelos de memoria surgen de la combinación entre punteros cercanos y lejanos por un lado y por otro con respecto a la región de almacenamiento para los datos y para el código del programa.&lt;br /&gt;Seis combinaciones se presentan a continuación: &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol type="1"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;TINY&lt;/strong&gt; –Diminuto-:&lt;br /&gt;Código, datos y pila en un solo segmento de memoria de 64Kb. Utiliza punteros cercanos, es el más rápido de ejecución tanto para acceder al código como para acceder a los datos, ya que la aritmética que debe emplear para punteros cercanos es más simple que para punteros lejanos y además son los programas de menor tamaño. Puede ser convertido a .COM. &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;SMALL&lt;/strong&gt; –Pequeño-:&lt;br /&gt;Código en un segmento de 64Kb, datos y pila en otro segmento de memoria de 64Kb, por lo que el tamaño total será de 128 Kb. Es tan rápido como el modelo anterior, ya que utiliza punteros cercanos, tanto para el código como para acceder a los datos. &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;COMPACT&lt;/strong&gt; –Compacto-:&lt;br /&gt;Código en un segmento de 64Kb, datos en varios segmentos de memoria de 64Kb. Es 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 desplazamiento de la dirección de memoria, por lo que utiliza punteros lejanos, pero se obtiene como ventaja poder tener más espcaio de almacenamiento para los datos. &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;MEDIUM&lt;/strong&gt; –Medio-:&lt;br /&gt;Código en varios segmentos de memoria, datos en un solo segmento de memoria de 64Kb. La ejecucion es mas lenta que en los modelos anteriores, al invocar a los modulos, debido a que requiere de punteros lejanos, aunque el acceso a los datos es tan rapido como en los dos primeros modelos, ya que requiere solo de asignar el desplazamiento solamente por lo que usa punteros cercanos. Utilizado para programas grandes pero que usan pocos datos. &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;LARGE&lt;/strong&gt; –Grande-:&lt;br /&gt;Código en varios segmentos de memoria, datos en varios segmentos de memoria, aunque no se permite utilizar estructuras de datos de más de 64Kb. Tanto el código como los accesos a los datos lo hacen más lentos que en los modelos anteriores, ya que utiliza punteros lejanos en ambos casos. Requerido cuando se requiere gran cantidad de código y de datos. &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;HUGE&lt;/strong&gt; –Enorme-:&lt;br /&gt;Código en varios segmentos de memoria, datos en varios segmentos de memoria y se permite utilizar estructuras de datos de más de 64Kb. Tanto el código como los accesos a los datos lo hacen más lentos que en los modelos anteriores, ya que utiliza punteros lejanos. &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;a name="ptrpascal"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;PUNTEROS EN TURBO PASCAL&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Turbo Pascal presenta dos clases de punteros: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol type="1"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Genéricos &lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;A un tipo de datos &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Los &lt;strong&gt;punteros genéricos&lt;/strong&gt; se definen por medio del identificador &lt;em&gt;pointer&lt;/em&gt;, el cual establece que las variables definidas con este identificador contendrán direcciones de memoria. Este tipo de punteros es más ampliamente utilizado para el soft de base o de sistema, no tanto para programas de aplicaciones.&lt;br /&gt;Los &lt;strong&gt;punteros que apuntan a un tipo de datos&lt;/strong&gt; se definen por medio del símbolo ^ y a continuación al tipo de dato al que apuntarán. El símbolo ^ se lee &lt;strong&gt;acento circunflejo&lt;/strong&gt;. Las variables definidas como puntero a un tipo de dato determinan la cantidad de bytes a que hace referencia el puntero. Este tipo de puntero es el que se utilizará para desarrollar los diferentes problemas a resolver. En la sección type se definirán los tipos punteros. A continuación presentamos diferentes ejemplos de tipos punteros a tipos de datos simples: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;br /&gt;cadn = string[20]; { se lee }&lt;br /&gt;ptrEnt = ^integer; { ptrEnt es un tipo igual a &lt;strong&gt;puntero a un tipo de dato integer&lt;/strong&gt; }&lt;br /&gt;ptrLong = ^longint;&lt;br /&gt;ptrReal = ^real;&lt;br /&gt;ptrChar = ^char;&lt;br /&gt;ptrCadn = ^cadn;&lt;br /&gt;ptrBool = ^boolean;&lt;br /&gt;ptrWord = ^word;&lt;br /&gt;ptrByte = ^byte;&lt;br /&gt;ptrShort = ^shortint;&lt;br /&gt;Los siguientes ejemplos muestran definiciones de tipos punteros a tipos de datos estructurados:&lt;br /&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;br /&gt;RegAlu = &lt;strong&gt;record&lt;/strong&gt;&lt;br /&gt;NroLeg : longint;&lt;br /&gt;ApeNom : cad20;&lt;br /&gt;FecNac : longint&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;ptrRec = ^RegAlu; { ptrRec es un puntero a un tipo de dato RegAlu }&lt;br /&gt;Las variables de tipo puntero se definirán de la siguiente manera:&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;ptr1, ptr2 : ptrWord;&lt;br /&gt;ptr3 : ptrRec;&lt;br /&gt;ptr4 : ptrlong;&lt;br /&gt;ptr5 : pointer;&lt;br /&gt;Los punteros ptr1 y ptr2 apuntan a tipos de datos word y se referirán en consecuencia a dos bytes, el puntero ptr3 apunta a un tipo de dato RegAlu y se referirá a 29 bytes, el puntero ptr4 apunta a un tipo de dato longint y se refiere a 4 bytes, por último el puntero ptr5 apunta a una región de memoria y se refiere de una forma genérica es decir no se refiere a ningún tipo de dato en particular.&lt;br /&gt;A continuación se presentan otros tipos de estructuras de datos y punteros: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;br /&gt;VecPtr = &lt;strong&gt;array&lt;/strong&gt;[1..10] &lt;strong&gt;of&lt;/strong&gt; ptrRec;&lt;br /&gt;ptrVector = ^VecPtr;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;Vec : VecPtr;&lt;br /&gt;ptrVec : ptrVector;&lt;br /&gt;rAlu : RegAlu; { Está definido más arriba }&lt;br /&gt;i : byte;&lt;br /&gt;&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;for&lt;/strong&gt; i:= 1 &lt;strong&gt;to&lt;/strong&gt; 10 &lt;strong&gt;do&lt;/strong&gt;&lt;br /&gt;Vec[i]:= &lt;strong&gt;nil&lt;/strong&gt;;&lt;br /&gt;rAlu.NroLeg:= 112345;&lt;br /&gt;rAlu.ApeNom:= ‘Martinez, Inés’;&lt;br /&gt;rAlu.FecNac:= 23051981&lt;br /&gt;Vec[1]:= @rAlu;&lt;br /&gt;ptrVec:= Addr(Vec);&lt;br /&gt;writeln(ptrVec^[1]^.NroLeg,’ ‘,ptrVec^[1]^.ApeNom,’ ‘,ptrVec^[1]^.FecNac)&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;.&lt;br /&gt;Un puntero puede apuntar a cualquier región de memoria, esto es, al segmento de datos, (como en los ejemplos dados anteriormente) o a los segmentos de código o al segmento de pila o al heap o como a cualquier otro segmento.&lt;br /&gt;Turbo Pascal brinda de varias herramientas para el manejo de punteros y de acceder a diferentes posiciones de memoria incluso a los propios puertos de entrada y/o salida. A continuación se indican y explican estos diferentes elementos.&lt;br /&gt;&lt;strong&gt;@Objeto&lt;/strong&gt;: Operador de dirección. Es un operador unario, lo que significa que requiere de un solo operando y que debe ser una variable o un identificador de módulo, escribiéndose a continuación del símbolo arroba. Ej.: @a obtiene la dirección de la variable a, es decir, su resultado está formado por el Segmento y el Desplazamiento en donde está alojada la variable indicada. El resultado de esta operación podría 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 word y ptrW es un puntero a un tipo de dato de tipo word, entonces es válida la siguiente asignación:&lt;br /&gt;ptrW := @a;&lt;br /&gt;El resultado de esta asignación es que ptrW apunta a la dirección en donde está ubicada la variable a. Luego se podría asignar algún valor de tipo word a dicha dirección, por medio del puntero, como se indica a continuación:&lt;br /&gt;ptrW^ := 5237;&lt;br /&gt;La variable a, pasa a contener el valor 5237.&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;El siguiente ejemplo muestra como pasar un parámetro por referencia desde el punto de la llamada al módulo. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;type&lt;br /&gt;&lt;/strong&gt;ptrWord = ^word;&lt;br /&gt;&lt;strong&gt;procedure&lt;/strong&gt; suma(x : ptrWord);&lt;br /&gt;&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;x^:= x^ + 2&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;sum : word;&lt;br /&gt;i : byte;&lt;br /&gt;&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;sum:= 0;&lt;br /&gt;&lt;strong&gt;for&lt;/strong&gt; i:= 1 &lt;strong&gt;to&lt;/strong&gt; 10 &lt;strong&gt;do&lt;/strong&gt;&lt;br /&gt;suma(@sum);&lt;br /&gt;writeln(‘Suma: ‘,sum)&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;.&lt;br /&gt;&lt;strong&gt;Addr(Objeto):&lt;/strong&gt; La función Addr(Objeto) retorna la dirección de Objeto. El valor devuelto es un puntero genérico compatible con cualquier tipo de puntero al igual que &lt;strong&gt;nil&lt;/strong&gt; (valor para indicar que un puntero no apunta a nada).&lt;br /&gt;La función Addr tiene el mismo significado que el operador @ visto en los párrafos previos.&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;ptr : pointer;&lt;br /&gt;&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;ptr:= Addr(ptr) {hace que ptr apunte a sí mismo}&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; ptr = @ptr &lt;strong&gt;then&lt;/strong&gt; {la dirección que contiene ptr es = a la dirección donde está ubicada ptr}&lt;br /&gt;writeln(‘si’)&lt;br /&gt;&lt;strong&gt;else&lt;/strong&gt;&lt;br /&gt;writeln(‘no’)&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;.&lt;br /&gt;&lt;strong&gt;Absolute var o Absolute Seg:Ofs:&lt;/strong&gt; Se puede definir una variable solapada sobre la definición de otra variable sin importar el tipo de dato de c/u. de ellas. La palabra reservada absolute define una variable en una región de memoria indicada por un segmento y un desplazamiento, como se indica en el siguiente ejemplo:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R_QZhhEk_sI/AAAAAAAAAOw/DKhOuX1goCs/s1600-h/PuntEj.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184797134614232770" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R_QZhhEk_sI/AAAAAAAAAOw/DKhOuX1goCs/s400/PuntEj.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Seg(Objeto):&lt;/strong&gt; La función &lt;em&gt;Seg(Objeto)&lt;/em&gt; retorna un valor de tipo word indicando la dirección del segmento en donde se localiza el objeto indicado en su parámetro formal. Objeto puede ser una variable o el nombre de un módulo.&lt;br /&gt;&lt;strong&gt;Ofs(Objeto):&lt;/strong&gt; La función &lt;em&gt;Ofs(Objeto)&lt;/em&gt; retorna un valor de tipo word indicando la dirección del desplazamiento en donde se localiza el objeto indicado en su parámetro formal. Objeto puede ser un variable o el nombre de un módulo.&lt;br /&gt;&lt;strong&gt;Ejemplos:&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;El siguiente ejemplo muestra el uso de las funciones &lt;em&gt;Seg&lt;/em&gt; y &lt;em&gt;Ofs&lt;/em&gt;.&lt;br /&gt;&lt;strong&gt;uses&lt;/strong&gt;&lt;br /&gt;newdelay, crt;&lt;br /&gt;&lt;strong&gt;Procedure&lt;/strong&gt; Proc;&lt;br /&gt;&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;writeln(‘Módulo Proc’)&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;&lt;strong&gt;Function&lt;/strong&gt; Func:byte;&lt;br /&gt;&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;Func:= 5&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;a : longint;&lt;br /&gt;&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;writeln(‘Segmento(a): ‘,Seg(a));&lt;br /&gt;writeln(‘Desplazamiento(a): ‘,Ofs(a));&lt;br /&gt;writeln(‘Segmento(Proc): ‘,Seg(Proc));&lt;br /&gt;writeln(‘Desplazamiento(Proc): ‘,Ofs(Proc));&lt;br /&gt;writeln(Seg(Func),’:’,Ofs(Func));&lt;br /&gt;writeln(Seg(ClrScr),’:’,Ofs(ClrScr)); {Oops, es otro segmento de código}&lt;br /&gt;writeln(Seg(gotoxy),’:’,Ofs(gotoxy));&lt;br /&gt;writeln(Seg(PatchCrt),’:’,Ofs(PatchCrt)); {Oops, y este otro segmento de código}&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;.&lt;br /&gt;&lt;strong&gt;Mem[Seg:Ofs]:&lt;/strong&gt; Turbo Pascal implementa tres arreglos predefinidos para acceder directamente a la memoria: &lt;strong&gt;mem, memW y memL&lt;/strong&gt;, cada una de las componentes es de tipo byte, word y longint respectivamente. Los arreglos de memoria utilizan una sintaxis especial para los índices: dos expresiones de palabra de tipo-entero, separadas por dos puntos, indican el segmento base y el desplazamiento para acceder a la locación en la memoria. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;El siguiente ejemplo ilustra como acceder a la memoria de video:&lt;br /&gt;mem[$B800:0] := 65;&lt;br /&gt;mem[$B800:1] := 1;&lt;br /&gt;En la pantalla de texto en las coordenadas (1, 1) se visualiza el carácter ‘&lt;span style="color:#3333ff;"&gt;A&lt;/span&gt;’ en color azul para el carácter y con fondo negro. La dirección &lt;strong&gt;$B800:$0000&lt;/strong&gt; representa la memoria de video en modo texto para la primer página de un total de ocho, Las direcciones de inicio de las siete restantes páginas se ubican en los desplazamientos $1000, $2000, $3000, $4000, $5000, $6000 y $7000 respectivamente. La ventaja de tener varias páginas se destaca al momento de cambiar los datos presentes en la pantalla; en vez de cambiar los datos sobre la misma página se podría utilizar otra página y luego mostrar los datos de esa otra página, el resultado será verlos más rápidamente. Los desplazamientos &lt;strong&gt;pares&lt;/strong&gt; representan &lt;em&gt;caracteres&lt;/em&gt; y los desplazamientos &lt;strong&gt;impares&lt;/strong&gt; representan los &lt;em&gt;atributos&lt;/em&gt; de esos caracteres. En el ejemplo, el valor 65 representa el carácter ‘A’ asignado a una posición par, mientras que el valor 1 representa el color azul para ese carácter y color de fondo negro, asignado a la posición impar adyacente, por lo tanto, un par de bytes indican una posición en la pantalla de video en modo texto, el primer byte –par- representa el carácter o símbolo y el segundo byte –impar- representa el atributo de ese carácter. Los valores de atributos de 0 a 15, el color de fondo es el negro, de 16 a 31, el color de fondo es el azul, de 32 a 47, el color de fondo es el verde y siguiendo así con otros colores. En total, los colores para el carácter son 16 y para los de fondo del carácter son 8. Una pantalla de texto presenta 80 columnas por 25 filas, lo que da un total de 80 x 25 = 2000 posiciones en la pantalla. Esto requiere 2000 posiciones en memoria para el carácter y 2000 posiciones de memoria para el atributo &lt;strong&gt;intercalados&lt;/strong&gt;, en donde, la primer componente de cada par es el carácter y la segunda componente de cada par representa el atributo. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejemplo:&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;mem[$B800:2] := 66;&lt;br /&gt;mem[$B800:3] := 18;&lt;br /&gt;En las coordenadas (2, 1), se representa el carácter ‘&lt;span style="color:#33cc00;"&gt;B&lt;/span&gt;’ con color verde para el símbolo y de color azul para el fondo. Para establecer una posición en la memoria de video para una coordenada (x, y), se procede a aplicar la siguiente expresión:&lt;br /&gt;&lt;strong&gt;Para la representación del carácter:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;posMemCar := ((y-1) * 80 + (x-1)) * 2&lt;br /&gt;&lt;strong&gt;Mientras que para el atributo es:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;posMemAtrib := ((y-1) * 80 + (x-1)) * 2 + 1&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;El siguiente ejemplo muestra como cambiar el valor de una posición de memoria representado por una variable.&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;a : byte;&lt;br /&gt;&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;mem[Seg(a):Ofs(a)]:= 5;&lt;br /&gt;writeln(‘a= ‘,a,’ = ‘,mem[Seg(a):Ofs(a)]);&lt;br /&gt;readln&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;.&lt;br /&gt;El código anterior asigna el valor 5 en la dirección de memoria en donde está alojada la variable a, luego se emite el contenido de la variable a y el contenido de la dirección en donde está ubicada la variable a, por lo que el programa emite dos veces el valor 5.&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;El siguiente ejemplo obtine de la lectura en la posición de memoria $0040:$0050 y $0040:$0051 la ubicación del cursor de la primer página en la pantalla de texto. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;x, y : byte;&lt;br /&gt;&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;gotoxy(20, 5);&lt;br /&gt;x:= mem[$0040:$0050] + 1; {Equivalente a wherex}&lt;br /&gt;y:= mem[$0040:$0051] + 1; {Equivalente a wherey}&lt;br /&gt;writeln(‘Posición del cursor: x= ‘,x,’ y= ‘,y)&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;.&lt;br /&gt;&lt;strong&gt;Ptr(Seg:Ofs):&lt;/strong&gt; La función &lt;em&gt;ptr(Seg,Ofs)&lt;/em&gt; retorna un valor de tipo pointer, es decir, una dirección de memoria a partir de un segmento base y de un desplazamiento dados. El tipo de cada uno de los parámetros formales son word.&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R_QaJREk_tI/AAAAAAAAAO4/uvnwB6aJkOo/s1600-h/PuntEj2.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184797817514032850" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R_QaJREk_tI/AAAAAAAAAO4/uvnwB6aJkOo/s400/PuntEj2.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Port[dir]:&lt;/strong&gt; Para accesos a los puertos de datos del microprocesador. Turbo Pascal implementa dos arreglos predefinidos de una dimensión, &lt;strong&gt;port&lt;/strong&gt; y &lt;strong&gt;portW&lt;/strong&gt;, y cada elemento representa un puerto de datos, en donde las direcciones de los puertos corresponden a sus índices. El tipo de indice es una palabra de tipo entero. Las componentes del arreglo de puerto son componentes de tipo Byte y de tipo word para el arreglo de portw.&lt;br /&gt;Cuando un valor es asignado a la componente de port o portw, el valor es una salida al puerto seleccionado. Cuando una componente de port o portw es referenciado en una expresión, su valor es leído del puerto seleccionado. El uso de los arreglos port y portw está limitado a asignaciones y referencias en expresiones solamente; esto es, las componentes de port y portw no pueden ser utilizados como parámetros variables. También, las referencias completas a los arreglos port o portw (referencias sin el índice) no son permitidas. &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejemplos&lt;/strong&gt;:&lt;br /&gt;valor:= port[$60]; {Puerto del controlador del teclado}&lt;br /&gt;port[$3D0]:= valor; {Puerto del adaptador gráfico avanzado EGA}&lt;br /&gt;Se debe tener mucho cuidado al trabajar con los puertos en forma directa, ya que un valor mal asignado podría ocasionar ciertos problemas, como por ejemplo 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 dirección son dos lugares físicos diferentes si uno se refiere a un puerto y el otro se refiere a la memoria R.A.M.&lt;br /&gt;&lt;strong&gt;nil:&lt;/strong&gt; La palabra reservada &lt;strong&gt;nil&lt;/strong&gt; es utilizada para asignar un valor nulo a cualquier variable puntero, como por ejemplo, ptr := nil. Es válido comparar el valor de un puntero para averiguar si no apunta a nada o bien si apunta a una dirección específica, como por ejemplo, ptr = nil o bien ptr ≠ nil. Si un puntero no apunta a nada o tiene un valor indefinido será error hacer una desreferencia del mismo.&lt;br /&gt;&lt;strong&gt;new(ptr):&lt;/strong&gt; El procedimiento &lt;em&gt;new(ptr)&lt;/em&gt; crea una &lt;strong&gt;variable dinámica&lt;/strong&gt; en el &lt;em&gt;heap&lt;/em&gt; y que pasará ser apuntada por el puntero ptr indicado en su parámetro actual. La región de memoria asignada debe ser &lt;strong&gt;contigua&lt;/strong&gt;, 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. En caso de encontrar espacio suficiente contiguo, se descuenta del heap la cantidad de memoria solicitada y ptr pasa a apuntar el primer byte de esa región 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.&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family:trebuchet ms;"&gt;El siguiente ejemplo crea una variable dinámica en el heap:&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R_QawhEk_uI/AAAAAAAAAPA/x5Zbhcz2aWA/s1600-h/PuntEj3.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184798491823898338" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R_QawhEk_uI/AAAAAAAAAPA/x5Zbhcz2aWA/s400/PuntEj3.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;dispose(ptr):&lt;/strong&gt; El procedimiento &lt;em&gt;dispose(ptr)&lt;/em&gt; libera la región de memoria en el heap apuntada por ptr. Se producirá un error si ptr no apunta a nada o si no apunta al heap. Luego de realizar esta acción ptr quedará indefinido y hacer una desreferencia ocasionará en un error&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;a title="" style="mso-footnote-id: ftn1" href="http://www.blogger.com/post-create.g?blogID=5100408444678612840#_ftn1" name="_ftnref1"&gt;&lt;span style="font-family:trebuchet ms;"&gt;[1]&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;. La región de memoria liberada queda nuevamente disponible al heap y se incrementa el tamaño disponible de acuerdo a la magnitud del tipo de dato al que apuntaba el puntero ptr.&lt;br /&gt;&lt;strong&gt;MemAvail:&lt;/strong&gt; La función &lt;em&gt;memavail&lt;/em&gt; retorna un valor de tipo longint que indica la cantidad de memoria libre en el heap.&lt;br /&gt;&lt;strong&gt;MaxAvail:&lt;/strong&gt; La función &lt;em&gt;maxavail&lt;/em&gt; retorna un valor de tipo longint que indica el bloque de memoria contigua más grande.&lt;br /&gt;&lt;a name="estrdinlin"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Las estructuras dinámicas de datos pueden dividirse en dos grandes grupos:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R_QbkhEk_vI/AAAAAAAAAPI/EW0aRRxntCk/s1600-h/EstrDin.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184799385177095922" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R_QbkhEk_vI/AAAAAAAAAPI/EW0aRRxntCk/s400/EstrDin.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;En esta cátedra se llega hasta las estructuras lineales.&lt;br /&gt;&lt;strong&gt;NODO:&lt;/strong&gt; El nodo es una unidad de información y que contiene básicamente dos campos, un campo &lt;strong&gt;INFO&lt;/strong&gt; y un campo &lt;strong&gt;SGTE&lt;/strong&gt;. El campo INFO puede ser de tipo estructurado para que pueda contener más de un valor. &lt;/span&gt;&lt;br /&gt;&lt;a name="pilas"&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Estructura lineal dinámica del tipo PILA&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:trebuchet ms;"&gt;PILAS &lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Una pila esta compuesta por una superposición de elementos, como por ejemplo una pila de platos. En los procesos de Sistemas computacionales una pila es utilizada, por ejemplo, cuando el bloque principal invoca a un módulo A y éste a otro módulo B, cuando el módulo B finaliza debe retornar a quien lo llamó y una vez que finaliza el módulo A debe retornar a quien lo llamó que es el bloque principal. Para saber esto el sistema guarda en una pila las direcciones de retorno y va retirando en la medida que finaliza un módulo. La última dirección guardada en la pila es la primera en ser retirada. Otra situación que puede presentarse es en el caso de las expresiones, el proceso debe transformar una notación &lt;em&gt;infija&lt;/em&gt; (esto es los operadores están ubicados entre sus operandos) a otra forma de notación más adaptada para el proceso computacional como lo es la notación &lt;em&gt;prefija&lt;/em&gt; o &lt;em&gt;sufija&lt;/em&gt; (esto es el operador aparece antes de sus operandos o bien después de sus operandos respectivamente). En estas dos últimas formas no son necesarios el uso de los paréntesis. Estos tipos de notaciones se deben a los trabajos realizados por el matemático polaco &lt;em&gt;Lukasiewicsz&lt;/em&gt;. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejemplos:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;a+b {notación infija}&lt;br /&gt;+ab {notación prefija}&lt;br /&gt;ab+ {notación postfija}&lt;br /&gt;Las estructuras dinámicas de datos del tipo pila presentan &lt;strong&gt;restricciones&lt;/strong&gt; en cuanto a su manejo. Esto es, cada nuevo elemento que se incorpore a la pila debe de realizarse 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. Esto hace que este tipo de estructura el último 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 &lt;strong&gt;L.I.F.O..&lt;/strong&gt; Por lo tanto, está terminantemente prohibido recorrer la pila, es decir, acceder a los elementos del mismo sin haber retirado los que se encontraban por el tope. Todo elemento que se incorpore o retire debe de hacerse si o si por el tope. Un puntero externo estará apuntando siempre al elemento que se encuentre en el tope. Una vez que se incorpore un nuevo elemento, el &lt;strong&gt;puntero externo&lt;/strong&gt; apuntará al nuevo elemento incorporado. Por otro lado, cada vez que se retire un elemento, el puntero externo apuntará al elemento que haya quedado en el tope, siempre y cuando haya otro elemento en la pila, caso contrario la pila quedará vacía y el puntero externo no apuntará a nada. El 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 incorporación del nuevo elemento. La primer acción que debemos realizar con una pila será asignar el valor nil al puntero externo a la pila. El valor &lt;strong&gt;nil&lt;/strong&gt; es un valor genérico para que un puntero no apunte a nada, en realidad le asigna la dirección de segmento = 0 y desplazamiento = 0. Es decir, si Pila es el puntero externo a la pila, hacer Pila:= nil, es lo mismo que hacer Pila:= ptr(0,0).&lt;br /&gt;En general un elemento de la pila estará constituido por 2 componentes. Una componente indicará la información de ese elemento y la otra componente un &lt;strong&gt;puntero empotrado&lt;/strong&gt; el cual apuntará al elemento anterior ubicado en la pila. Por lo tanto el puntero externo a la pila y cada uno de los punteros empotrados apuntan a una misma estructura de datos del tipo pila.&lt;br /&gt;La estructura idónea para representar un elemento de la pila es el tipo registro que tendrá básicamente dos campos, un campo &lt;strong&gt;INFO&lt;/strong&gt; que contiene un valor de información y un campo &lt;strong&gt;SGTE&lt;/strong&gt; que contendrá la dirección del elemento anterior en la pila, salvo que sea el primero en cuyo caso contendrá el valor nil. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;br /&gt;TipoInfo = &lt;strong&gt;string&lt;/strong&gt;[30]; {puede ser un registro}&lt;br /&gt;TipoPila = ^TipoNodo;&lt;br /&gt;TipoNodo = &lt;strong&gt;Record&lt;/strong&gt;&lt;br /&gt;Info : tipoInfo;&lt;br /&gt;Sgte : tipoPila&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;Pila : TipoPila;&lt;br /&gt;&lt;strong&gt;Los procesos para el manejo de la estructura del tipo pila son:&lt;/strong&gt;&lt;br /&gt;1. &lt;/span&gt;&lt;a href="http://www.blogger.com/CrearPila.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;CrearPila(var Pila:tipoPila);&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt; o en su lugar Pila:= &lt;strong&gt;nil&lt;/strong&gt;&lt;br /&gt;2. &lt;/span&gt;&lt;a href="http://www.blogger.com/Meter.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Meter(var Pila:tipoPila; valor:tipoInfo);&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;3. &lt;/span&gt;&lt;a href="http://www.blogger.com/Sacar.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Sacar(var Pila:tipoPila; var valor:tipoInfo);&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;4. &lt;/span&gt;&lt;a href="http://www.blogger.com/PilaVacia.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;PilaVacia(var Pila:tipoPila): boolean;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt; o en su lugar preguntar si Pila = &lt;strong&gt;nil&lt;/strong&gt;.&lt;br /&gt;5. &lt;/span&gt;&lt;a href="http://www.blogger.com/PilaLlena.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;PilaLlena(MagnitudNodo: word): boolean;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt; o en su lugar MaxAvail MENOR SizeOf(Nodo)&lt;br /&gt;A continuación se presenta un proceso que ingresa tres elementos a la pila y posteriormente los retira.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/Meter.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Meter(Pila,x)&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/Sacar.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Sacar(Pila,x);&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt; &lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;br /&gt;&lt;br /&gt;Estructura lineal dinámica del tipo COLA&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;COLAS&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;El término cola es aplicado a muchos aspectos de la realidad, por citar algunos, una cola de espera en la parada del colectivo, en la sala de espera de un consultorio, en la caja de un supermercado o para la atención de la primer caja que se desocupe en un banco. En los procesos de Sistemas computacionales una cola es utilizada, por ejemplo, cuando distintas tareas requieran el uso de un periférico no compartido, como lo es la impresora, en estos casos cada tarea que requiera el uso de la impresora, y estando ocupada atendiendo a un proceso previo, el Sistema Operativo redirecciona la salida hacia un archivo, de manera tal que, cada tarea en curso puede continuar su proceso. Cada una de las salidas enviadas a archivos en disco se ubican en una cola de espera, para que reciban en su momento oportuno la asignación de la impresora. El primero en ingresar a la cola será el primero en ser atendido al liberarse el recurso de la impresora.&lt;br /&gt;Las estructuras dinámicas de datos del tipo cola presentan &lt;strong&gt;restricciones&lt;/strong&gt; en cuanto a su manejo. Esto es, cada nuevo elemento que se incorpore a la cola debe de realizarse por la 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. Esto hace 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 &lt;strong&gt;F.I.F.O..&lt;/strong&gt; Está en consecuencia terminantemente prohibido recorrer la cola, es decir, acceder a los elementos del mismo sin haber retirado los que se encontraban por el frente. Todo elemento que se incorpore debe de hacerse si o si por el final y cada elemento que se retire debe de hacerse si o si por el frente. Un puntero externo estará apuntando siempre al primer elemento de la cola y un segundo puntero externo estará apuntando siempre al último elemento de la cola. Una vez que se incorpore un nuevo elemento, el puntero externo final apuntará al nuevo elemento incorporado. Por otro lado, cada vez que se retire un elemento, el puntero externo frente apuntará al nuevo elemento que haya quedado al inicio, siempre y cuando haya otro elemento en la cola, caso contrario la cola quedará vacía y los punteros externos no apuntarán a nada. Cada nuevo elemento incorporado a la cola el campo Sgte no apunta a nada y el elemento anterior dejará de no apuntar a nada para pasar a apuntar al nuevo elemento incorporado a la cola. La primera acción que debemos realizar será asignar el valor &lt;strong&gt;nil&lt;/strong&gt; a los punteros externos a la cola, esto es, &lt;em&gt;ColaFrente&lt;/em&gt; y &lt;em&gt;ColaFin&lt;/em&gt;, si estos fueran los nombres de los punteros externos. El valor nil es un valor genérico para que un puntero no apunte a nada, en realidad le asigna la dirección de segmento = 0 y desplazamiento = 0. Es decir, si ColaFrente y ColaFin son los punteros externos a la cola, hacer ColaFrente:= nil, y ColaFin:= nil, es lo mismo que hacer ColaFrente:= ptr(0,0) y ColaFin:= ptr(0,0).&lt;br /&gt;En general un elemento de la cola estará constituido por 2 componentes. Una componente indicará la información de ese elemento y la otra componente un &lt;strong&gt;puntero empotrado&lt;/strong&gt; el cual apuntará al elemento siguiente ubicado en la cola. Por lo tanto los punteros externos a la cola y cada uno de los punteros empotrados apuntan a una misma estructura de datos del tipo cola.&lt;br /&gt;La estructura idónea para representar un elemento de la cola es el tipo registro que tendrá básicamente dos campos, un campo &lt;strong&gt;INFO&lt;/strong&gt; que contiene un valor de información y un campo &lt;strong&gt;SGTE&lt;/strong&gt; que contendrá la dirección del elemento siguiente en la cola, salvo que sea el último en cuyo caso contendrá el valor nil.&lt;br /&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;br /&gt;TipoInfo = &lt;strong&gt;string&lt;/strong&gt;[30]; {puede ser un registro}&lt;br /&gt;TipoCola = ^TipoNodo;&lt;br /&gt;TipoNodo = &lt;strong&gt;Record&lt;/strong&gt;&lt;br /&gt;Info : tipoInfo;&lt;br /&gt;Sgte : tipoCola&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;ColaFrente, ColaFin : TipoCola;&lt;br /&gt;&lt;strong&gt;Los procesos para el manejo de la estructura del tipo Cola son:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;1. &lt;/span&gt;&lt;a href="http://www.blogger.com/CrearCola.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;CrearCola(var ColaFrente, ColaFin:tipoCola);&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt; o ColaFrente:= &lt;strong&gt;nil&lt;/strong&gt;; ColaFin:= &lt;strong&gt;nil&lt;/strong&gt;;&lt;br /&gt;2. &lt;/span&gt;&lt;a href="http://www.blogger.com/Agregar.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Agregar(var ColaFrente, ColaFin:tipoCola; valor:tipoInfo);&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;3. &lt;/span&gt;&lt;a href="http://www.blogger.com/Suprimir.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Suprimir(var ColaFrente, ColaFin:tipoCola; var valor:tipoInfo);&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;4. &lt;/span&gt;&lt;a href="http://www.blogger.com/ColaVacia.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;ColaVacia(var ColaFrente:tipoCola):boolean;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt; o en su lugar preguntar si Pila = &lt;strong&gt;nil&lt;/strong&gt;.&lt;br /&gt;5. &lt;/span&gt;&lt;a href="http://www.blogger.com/ColaLlena.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;ColaLlena(MagnitudNodo:word):boolean;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt; o en su lugar MaxAvail MENOR SizeOf(Nodo)&lt;br /&gt;A continuación se presenta un proceso que ingresa tres elementos a la pila y posteriormente los retira.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/Agregar.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Agregar(ColaFrente, ColaFin, x)&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R_RAdxElADI/AAAAAAAAARo/WVohHKbvSZE/s1600-h/AnimarAgregar.GIF"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184839951143206962" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R_RAdxElADI/AAAAAAAAARo/WVohHKbvSZE/s400/AnimarAgregar.GIF" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R_QjqxEk_xI/AAAAAAAAAPY/1UclSec-acw/s1600-h/ModCola.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184808288644300562" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R_QjqxEk_xI/AAAAAAAAAPY/1UclSec-acw/s400/ModCola.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;a href="http://www.blogger.com/Suprimir.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Suprimir(ColaFrente, ColaFin, x);&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R_Q_rhElACI/AAAAAAAAARg/2JRGsxb2ZiA/s1600-h/AnimarSuprimir.GIF"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184839087854780450" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R_Q_rhElACI/AAAAAAAAARg/2JRGsxb2ZiA/s400/AnimarSuprimir.GIF" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;a name="listas"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Estructura lineal dinámica del tipo LISTA&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;LISTAS&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Una lista esta compuesta por una serie de elementos, como por ejemplo una lista de personas, o animales o cosas. En general, trabajaremos con listas ordenadas por el valor de un campo clave o llave.&lt;br /&gt;Las estructuras dinámicas de datos del tipo lista &lt;strong&gt;no presentan ningún tipo de restricciones&lt;/strong&gt; en cuanto a su manejo. Esto es, cada nuevo elemento que se incorpore a la lista puede realizarse por cualquier parte, y cada elemento que se retire de la lista puede efectuarse tambien por cualquier parte. Un puntero externo estará apuntando siempre al primer elemento que se encuentre en la lista en un momento determinado. La primer acción que debemos realizar con una lista será asignar el valor &lt;strong&gt;nil&lt;/strong&gt; al puntero externo a la lista. El valor nil es un valor genérico para que un puntero no apunte a nada, en realidad le asigna la dirección de segmento = 0 y desplazamiento = 0. Es decir, si Lista es el puntero externo a la lista, hacer Lista:= nil, es lo mismo que hacer Lista:= ptr(0,0).&lt;br /&gt;En general un elemento de la lista estará constituido por 2 componentes. Una componente indicará la información de ese elemento y la otra componente un &lt;strong&gt;puntero empotrado&lt;/strong&gt; el cual apuntará al elemento siguiente ubicado en la lista. Por lo tanto el puntero externo a la lista y cada uno de los punteros empotrados apuntan a una misma estructura de datos del tipo lista.&lt;br /&gt;La estructura idónea para representar un elemento de la lista es el tipo registro que tendrá básicamente dos campos, un campo &lt;strong&gt;INFO&lt;/strong&gt; que contiene un valor de información y un campo &lt;strong&gt;SGTE&lt;/strong&gt; que contendrá la dirección del elemento siguiente en la lista, salvo que sea el último en cuyo caso contendrá el valor nil.&lt;br /&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;br /&gt;TipoInfo &lt;strong&gt;=&lt;/strong&gt; &lt;strong&gt;string&lt;/strong&gt;[30]; {puede ser un registro}&lt;br /&gt;TipoLista = ^TipoNodo;&lt;br /&gt;TipoNodo = &lt;strong&gt;Record&lt;/strong&gt;&lt;br /&gt;Info : tipoInfo;&lt;br /&gt;Sgte : tipoLista&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;Pila : TipoLista;&lt;br /&gt;&lt;strong&gt;Los procesos para el manejo de la estructura del tipo lista son:&lt;/strong&gt;&lt;br /&gt;1. &lt;/span&gt;&lt;a href="http://www.blogger.com/CrearLista.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;CrearLista(var Lista:tipoLista);&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt; o en su lugar Lista:= &lt;strong&gt;nil&lt;/strong&gt;&lt;br /&gt;2. &lt;/span&gt;&lt;a href="http://www.blogger.com/InsertaNodo.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;InsertaNodo(var Lista:tipoLista; valor:tipoInfo);&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;3. &lt;/span&gt;&lt;a href="http://www.blogger.com/InsertaPrimero.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;InsertaPrimero(var Lista:tipoLista; valor:tipoInfo);&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;4. &lt;/span&gt;&lt;a href="http://www.blogger.com/InsertaDelante.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;InsertaDelante(var Lista:tipoLista; valor:tipoInfo);&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;5. &lt;/span&gt;&lt;a href="http://www.blogger.com/InsertaEnMedio.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;InsertaEnMedio(var Lista:tipoLista; valor:tipoInfo);&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;6. &lt;/span&gt;&lt;a href="http://www.blogger.com/SuprimeNodo.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;SuprimeNodo(var Lista:tipoLista; var valor:tipoInfo);&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;7. &lt;/span&gt;&lt;a href="http://www.blogger.com/ListaVacia.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;ListaVacia(var Lista:tipoLista): boolean;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt; o en su lugar preguntar si Lista = &lt;strong&gt;nil&lt;/strong&gt;.&lt;br /&gt;8. &lt;/span&gt;&lt;a href="http://www.blogger.com/ListaLlena.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;ListaLlena(MagnitudNodo: word): boolean;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt; o en su lugar MaxAvail MENOR SizeOf(Nodo)&lt;br /&gt;El módulo InsertaPrimero es invocado cuando el puntero a la Lista es nil y esto sucede una vez, en cambio el módulo InsertaDelante 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 módulos, esto es, cuando se asigna al campo Sgte del nuevo nodo el valor nil o el valor del puntero externo de Lista, pero tanto en un caso como en el otro se podría asignar el valor del puntero externo de Lista, debido a que cuando la lista está vacía se asignará el valor nil y cuando ya exista algún nodo en la lista se le asignará la dirección del nodo que está siendo apuntado por el puntero externo Lista. Por lo tanto, se reemplazarán los módulos InsertaPrimero e InsertaDelante por el módulo &lt;/span&gt;&lt;a href="http://www.blogger.com/InsertaInicio.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;InsertaInicio(var Lista:tipoLista; valor:tipoInfo);&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt; en el cual la sentencia ptr^.Sgte:= nil o ptr^.Sgte.Lista establecida en los módulos InsertaPrimero e InsertaDelante respectivamente se reemplará por ptr^.Sgte.Lista.&lt;br /&gt;El módulo &lt;/span&gt;&lt;a href="http://www.blogger.com/InsertaNodo.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;InsertaNodo(Lista, valor); &lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;también se reemplazará por otras sentencias. En lugar de realizar tres decisiones solo serán necesarias tomar dos decisiones, en la cual, la primera decisión tendrá una condición compuesta, siendo ellas (Lista = nil) or (valor MENOR Lista^.Info), en los casos en que sea verdadero se invocará al módulo InsertaInicio y en caso contrario, se invocará a InsertaEnMedio.&lt;br /&gt;A continuación se presenta un proceso que ingresa cinco elementos a la lista manteniendo siempre un orden por el valor del campo Info en forma ascendente y posteriormente los retira.&lt;br /&gt;Lista:= nil;&lt;br /&gt;for i:= 1 to 5 do begin&lt;br /&gt;write(‘Ing. valor: ‘);&lt;br /&gt;Hacer doble clic readln(x); {20, 50, 10, 30, 70}&lt;br /&gt;&lt;/span&gt;&lt;a href="http://www.blogger.com/InsertaNodo.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;InsertaNodo(Lista,x)&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://www.blogger.com/SuprimeNodo.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;SuprimeNodo(Lista,x);&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R_Q-uRElABI/AAAAAAAAARY/aowpxtzZNbE/s1600-h/AnimarInsertaNodo.GIF"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184838035587792914" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R_Q-uRElABI/AAAAAAAAARY/aowpxtzZNbE/s400/AnimarInsertaNodo.GIF" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R_QkfhEk_yI/AAAAAAAAAPg/U3LMy04ltHU/s1600-h/ModLista.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184809194882400034" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R_QkfhEk_yI/AAAAAAAAAPg/U3LMy04ltHU/s400/ModLista.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R_Q9pREk__I/AAAAAAAAARI/vAlbr_IF6DQ/s1600-h/AnimarSuprimeNodo.GIF"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184836850176819186" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R_Q9pREk__I/AAAAAAAAARI/vAlbr_IF6DQ/s400/AnimarSuprimeNodo.GIF" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Los módulos presentados anteriormente son solo un modelo que resuelven algunas de las situaciones que podrán presentarse en diferentes procesos. Por ejemplo, los procesos anteriormente indicados ordenan una lista en forma creciente, siempre genera una nueva variable dinámica al invocarlos, y en casos de repetición 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 vez este comportamiento sea el esperado para ciertos procesos pero no para otros. En ciertos casos algunos ligeros cambios modificarán esos comportamiento y en otros casos debamos realizar modificaciones más drásticas. Hay situaciones en la cual no queremos repetir el valor de un campo clave, lo que hacemos es buscar si existe ese valor en la lista, en caso de no encontrarse creamos el nodo, pero si existe no. En el primer caso al no existir el nodo, si invocamos al módulo InsertaNodo, se volverá a recorrer nuevamente la lista hasta el punto de inserción, pero si ya habíamos recorrido la lista, porque no optimizar el proceso enlazando el nuevo nodo con aquellos nodos dentro de su entorno localizados en la búsqueda previa. Si queremos enlazar los nodos en una lista pero ordenada en forma decreciente, ¿qué debemos modificar de los módulos mencionados más arriba?. Si el campo Info 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 ¿cuáles son los cambios a realizar en los módulos indicados precedentemente? Estas y otras cuestiones más podrían presentarse en los diferentes procesos y que deberíamos replantearnos acerca de utilizar o no esos módulos o reemplazarlos por otros.&lt;br /&gt;Para los procesos que requieran no repetir nodos para el valor de una misma clave, a continuación se presentan dos módulos adicionales a los establecidos previamente:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;1. &lt;/span&gt;&lt;a href="http://www.blogger.com/ExisteNodo.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;ExisteNodo(var Lista.tipoLista; valor:tipoInfo): tipoLista;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;El módulo &lt;em&gt;ExisteNodo&lt;/em&gt; busca un nodo con un valor en cuyo campo clave coincida con el valor pasado, en ese caso informa la dirección de memoria del nodo con valor igual a valor, caso contrario retorna la dirección del nodo previo o si no existe un valor nil.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R_Q46REk_-I/AAAAAAAAARA/CGJe9mk_u6I/s1600-h/AnimarExisteNodoNil.GIF"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184831644676456418" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R_Q46REk_-I/AAAAAAAAARA/CGJe9mk_u6I/s400/AnimarExisteNodoNil.GIF" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R_Q4LxEk_8I/AAAAAAAAAQw/WD48-AbdWS0/s1600-h/AnimarCrearNodoAnt.GIF"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184830845812539330" style="FLOAT: right; MARGIN: 0px 0px 10px 10px; CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R_Q4LxEk_8I/AAAAAAAAAQw/WD48-AbdWS0/s400/AnimarCrearNodoAnt.GIF" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R_QmiBEk_zI/AAAAAAAAAPo/ODIhHybMe9A/s1600-h/ModExist.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184811436855328562" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R_QmiBEk_zI/AAAAAAAAAPo/ODIhHybMe9A/s400/ModExist.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R_Q3vREk_7I/AAAAAAAAAQo/kL2r33i18bg/s1600-h/AnimarExisteNodoAct.GIF"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184830356186267570" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R_Q3vREk_7I/AAAAAAAAAQo/kL2r33i18bg/s400/AnimarExisteNodoAct.GIF" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;1. &lt;/span&gt;&lt;a href="http://www.blogger.com/%3Ca"&gt;&lt;span style="font-family:trebuchet ms;"&gt;CrearNodo(var&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt; Lista, ptrNodoAnt:tipoLista; valor.tipoInfo);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R_Q3DBEk_6I/AAAAAAAAAQg/xVd9u3xAgjI/s1600-h/AnimarCrearNodoNil.GIF"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184829595977056162" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R_Q3DBEk_6I/AAAAAAAAAQg/xVd9u3xAgjI/s400/AnimarCrearNodoNil.GIF" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R_Qn2BEk_0I/AAAAAAAAAPw/38TgEIg6jB0/s1600-h/ModcrearN.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184812879964340034" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R_Qn2BEk_0I/AAAAAAAAAPw/38TgEIg6jB0/s400/ModcrearN.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R_Q2jxEk_5I/AAAAAAAAAQY/nW4qmydX56M/s1600-h/AnimarCrearNodoAnt.GIF"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184829059106144146" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R_Q2jxEk_5I/AAAAAAAAAQY/nW4qmydX56M/s400/AnimarCrearNodoAnt.GIF" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;El módulo &lt;em&gt;CrearNodo&lt;/em&gt; crea un nuevo nodo enlazado a continuación del nodo apuntado por ptrNodoAnt si es distinto de nil, caso contrario lo inserta por el inicio de la lista.&lt;br /&gt;En los casos de requerir la localización ordinal de un nodo en la lista, se presenta el siguiente módulo:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/BuscarNodo.txt"&gt;&lt;span style="font-family:trebuchet ms;"&gt;BuscarNodo(var Lista:tipoLista; pos:longint) : tipoLista;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R_QtnREk_1I/AAAAAAAAAP4/cRaeXhJyMsk/s1600-h/ModBuscarN.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184819223631036242" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R_QtnREk_1I/AAAAAAAAAP4/cRaeXhJyMsk/s400/ModBuscarN.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R_Q1FBEk_4I/AAAAAAAAAQQ/mN7ijIvIWy4/s1600-h/AnimarBuscarNodo.GIF"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184827431313538946" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R_Q1FBEk_4I/AAAAAAAAAQQ/mN7ijIvIWy4/s400/AnimarBuscarNodo.GIF" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; Se tiene una lista, en donde cada nodo representa un día de un mes. Buscar el nodo que se corresponde con un día informado se procederá a recorrer la lista tantos nodos como lo indique el número del día conocido, es decir, si el día dado es el primero la función &lt;em&gt;BuscarNodo&lt;/em&gt; retorna el puntero al primer nodo de la lista, si el día dado es el segundo entonces la función retorna el puntero al segundo nodo y así sucesivamente.&lt;br /&gt;La diferencia con el módulo ExisteNodo está dada por el hecho de que en la lista mencionada en el ejemplo anterior no necesitamos guardar el dato del número del día, ya que en la lista existe un nodo por cada día del mes, en cambio cuando no aseguramos encontrar un nodo por cada día de un mes, -según este ejemplo- en estos casos debemos guardar en el nodo el número del día, la función ExisteNodo buscará si el nodo visitado en un momento determinado su campo clave coincide con el valor buscado.&lt;br /&gt;A continuación se presentará una estructura dinámica combinada con otra estructura dinámica. En 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. El campo INFO del nodo en la lista principal deberá contar con un sub-campo de tipo puntero el cual apuntará a la sub-estructura de datos dinámica.&lt;br /&gt;Buscar un sub-nodo requerirá primero buscar un nodo en la lista principal y una vez localizado ese nodo, buscar el sub-nodo en la sub-estructura dinámica que cuelga de ese nodo en la lista principal.&lt;br /&gt;Gráficamente lo podemos representar de la siguiente manera:&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R_QwNREk_2I/AAAAAAAAAQA/XTkRuiiwLeI/s1600-h/EstrListaSub.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184822075489320802" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R_QwNREk_2I/AAAAAAAAAQA/XTkRuiiwLeI/s400/EstrListaSub.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;El siguiente ejemplo representa una estructura estática de punteros a estructuras dinámicas de datos y de esta una sub-estructura también dinámica de datos.&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R_QxSREk_3I/AAAAAAAAAQI/Pji529Wb7Nw/s1600-h/EstrVecLstSubLst.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184823260900294514" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R_QxSREk_3I/AAAAAAAAAQI/Pji529Wb7Nw/s400/EstrVecLstSubLst.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;Un nodo sin el campo Sgte.&lt;br /&gt;Un nodo en que el campo Info es de tipo registro.&lt;br /&gt;Un nodo en que el campo Info es un arreglo.&lt;br /&gt;Un nodo con el campo Info que es un puntero a un tipo registro. ¿Cuál sería la utilidad?&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;CONCLUSIÓN:&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Las variantes que podemos formar con las &lt;strong&gt;estructuras de datos&lt;/strong&gt; aprendidas en la cursada de &lt;em&gt;“Algoritmos y Estructuras de Datos”&lt;/em&gt;, solo dependerán de nuestra &lt;em&gt;imaginación, creatividad, o el ingenio&lt;/em&gt;, para &lt;u&gt;representar&lt;/u&gt; al &lt;strong&gt;mundo real&lt;/strong&gt;.&lt;br /&gt;El uso de una &lt;strong&gt;metodología&lt;/strong&gt; para resolver problemas, como fue analizada en las primeras clases, nos brindará de un cimiento sólido para encarar la solución. Es imprescindible primero &lt;strong&gt;comprender&lt;/strong&gt; el problema, luego de lo cual, elaboraremos una &lt;strong&gt;estrategia&lt;/strong&gt;, en la cual destacaremos las &lt;strong&gt;partes relevantes&lt;/strong&gt;, y por &lt;strong&gt;refinamiento sucesivo&lt;/strong&gt; iremos ampliando nuestro grado de detalles; por lo tanto, siempre iniciaremos nuestra solución &lt;strong&gt;desde lo general hacia lo particular&lt;/strong&gt;. Luego construiremos nuestro &lt;strong&gt;algoritmo&lt;/strong&gt; el cual dará la solución a nuestro problema. Por último, &lt;strong&gt;codificaremos&lt;/strong&gt; el algoritmo con un lenguaje de computadora, para que pueda ser ejecutado por la máquina.&lt;br /&gt;Es importante elaborar una &lt;strong&gt;muestra de datos&lt;/strong&gt; bien pensada para la situación, que contemple todas las posibilidades, incluso las más extremas y de los &lt;strong&gt;resultados que esperaríamos obtener&lt;/strong&gt; para luego compararlo con los resultados conseguidos con la ejecución del programa por la computadora.&lt;br /&gt;Definimos Algoritmo como la concatenación de sentencias de asignaciones internas y/o externas que son regidas por &lt;strong&gt;estructuras de control de programa&lt;/strong&gt; –&lt;em&gt;concatenación, selección y repetición&lt;/em&gt;-, que determinan el orden de ejecución de esas sentencias. Por lo tanto, la solución no solo correcta, sino, óptima dependerá mucho de las estructuras de control seleccionadas, es decir, debemos plantearnos que tipo de estructura de control debemos utilizar, en el caso de repetición, un ciclo mientras o hasta o exacto; en una selección una selección simple o múltiple, ciclos anidadas o en secuencia, decisiones anidadas o en secuencia.&lt;br /&gt;El uso adecuado de las estructuras elegidas, tanto para los datos como para el control de programa harán que nuestro algoritmo sea más sencillo, simple, compacto, más rápido para ejecutar, y esto no es poca cosa.&lt;br /&gt;Encontrar alternativas de solución para un mismo problema nos va a permitir seleccionar la más adecuada, oportuna, en otras palabras, la solución óptima. El que encontremos diferentes alternativas, no implica que no existan otras. Lo importante es obtener un abanico de posibilidades y decidir cual elegir y no quedarnos con la primera solución encontrada.&lt;br /&gt;&lt;/span&gt;&lt;a title="" style="mso-footnote-id: ftn1" href="http://www.blogger.com/post-create.g?blogID=5100408444678612840#_ftnref1" name="_ftn1"&gt;&lt;span style="font-family:trebuchet ms;"&gt;[1]&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt; Debo aclarar que en Turbo Pascal esto no es tan así, en realidad, se sigue apuntando a la misma región de memoria y por otro lado, en ese lugar sigue almacenada la misma información anterior al dispose.&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="ABAJO"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;a href="http://pascalgo.blogspot.com/2008/03/una-metodologa-de-resolucin-de.html"&gt;Inicio&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Anterior:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/04/c-lase-11-estructura-de-datos-arreglos.html"&gt;Arreglos&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=5100408444678612840&amp;amp;postID=2274809819481449612#ARRIBA"&gt;Arriba&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#00ff00;"&gt;Enviar comentarios y sugerencias a: &lt;/span&gt;&lt;a href="mailto:mayas2012@gmail.com"&gt;Lic. Hugo Cuello&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100408444678612840-2274809819481449612?l=pascalgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pascalgo.blogspot.com/feeds/2274809819481449612/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5100408444678612840&amp;postID=2274809819481449612' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/2274809819481449612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/2274809819481449612'/><link rel='alternate' type='text/html' href='http://pascalgo.blogspot.com/2008/04/clase-12-punteros-y-estructuras.html' title='Punteros y Estructuras Dinámicas Lineales: Pilas, Colas y Listas'/><author><name>Lic. Hugo Cuello</name><uri>http://www.blogger.com/profile/00801409318639239421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_ISF8DP9N9hg/R_QVeBEk_oI/AAAAAAAAAOQ/LIMxDT0mjGA/s72-c/MapaMem.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5100408444678612840.post-2362743735220737638</id><published>2008-04-01T23:03:00.000-07:00</published><updated>2009-03-11T18:12:25.485-07:00</updated><title type='text'>Arreglos</title><content type='html'>&lt;p&gt;&lt;a name="ARRIBA"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=5100408444678612840&amp;amp;postID=2362743735220737638#ABAJO"&gt;Abajo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;a name="_Toc70612883"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;a name="arreglos"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;CLASE 11:&lt;/strong&gt; &lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;em&gt;Estructura de Datos Arreglos.&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;/span&gt;&lt;a name="_Toc70612882"&gt;&lt;strong&gt;&lt;span style="font-family:trebuchet ms;font-size:180%;"&gt;Estructuras de datos estáticas&lt;/span&gt;&lt;/strong&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;span style="font-size:180%;"&gt;ARREGLOS&lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Los arreglos son estructuras de datos &lt;strong&gt;homogéneas&lt;/strong&gt;, es decir, todas sus componentes son del mismo tipo. Como una estructura de datos estática su espacio debe definirse en tiempo de compilación.&lt;br /&gt;&lt;strong&gt;¿Por qué utilizar este tipo de estructura de datos?&lt;/strong&gt;. Supongamos la siguiente situación; se requiere tener en memoria interna y en forma &lt;strong&gt;simultánea&lt;/strong&gt; los datos de los Apellidos, Nombres de 10 alumnos. Mantener todos estos datos al mismo tiempo en la memoria interna requerirá de 10 variables, pero cada una de ellas con un nombre diferente, p.e. ApeNom1, ApeNom2, ..., ApeNom10. Notamos que esta forma de notación haría muy compleja la tarea de programar, imaginemos ingresar estos datos, emitirlos, procesarlos y si en vez de 10 fueran 100 ó 1000 o más, &lt;strong&gt;¡mucho más complicado!&lt;/strong&gt;. Entonces, bajo estas situaciones, cuando contemos con una colección de datos todas del mismo tipo emplearemos los arreglos.&lt;br /&gt;Podemos decir, entonces que los arreglos son colecciones o disposiciones de datos homogéneas ubicadas en la memoria interna y de manera &lt;strong&gt;continua&lt;/strong&gt; la cual se le asigna un &lt;strong&gt;nombre único o genérico&lt;/strong&gt; que hace referencia a esa región de memoria reservada en tiempo de compilación. Ahora bien, para poder referirnos a un elemento o componente se utiliza un &lt;strong&gt;subíndice&lt;/strong&gt;, siendo la notación formada por el nombre genérico seguido del subíndice encerrado entre corchetes. Por ejemplo, si tomamos el caso anterior, el nombre genérico podría ser &lt;em&gt;ApeNom&lt;/em&gt; y el subíndice podría ser &lt;em&gt;i&lt;/em&gt;; por lo tanto, para indicar un elemento del arreglo lo escribiríamos como se indica a continuación &lt;strong&gt;&lt;em&gt;ApeNom[i]&lt;/em&gt;&lt;/strong&gt;. De esta manera al tener que emitir por ejemplo cada uno de los nombres de los alumnos, basta con variar el valor del subíndice para hacer referencia a cada elemento del arreglo.&lt;br /&gt;Podríamos representar este concepto de manera gráfica:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R_Ml-REk_cI/AAAAAAAAAMw/JZtrCfQMEbg/s1600-h/ArrayEjMem.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184529347698294210" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R_Ml-REk_cI/AAAAAAAAAMw/JZtrCfQMEbg/s400/ArrayEjMem.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ApeNom[i] en donde 1 MENOR= i MENOR= 10&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;El gráfico está indicando varias cosas; el nombre genérico &lt;em&gt;ApeNom&lt;/em&gt; , la cantidad de elementos 10, cantidad de dimensiones 1, tipo del índice valores enteros, intervalo de valores del índice &lt;em&gt;[1; 10]&lt;/em&gt;, contenido de cada elemento de tipo cadena, por otro lado se nota que la variable &lt;em&gt;ApeNom&lt;/em&gt; se encuentra ubicada en la dirección 1000 y que su tamaño es de 21 b. x 10 = 210 bytes. El área de memoria reservada para la variable ApeNom va desde 1000 a 1000 + 210 – 1, es decir de 1000 a 1209.&lt;br /&gt;Si queremos averiguar el tamaño &lt;strong&gt;físico&lt;/strong&gt; de un arreglo, esto se puede determinar con la función &lt;em&gt;SizeOf(obj)&lt;/em&gt;, en donde &lt;em&gt;obj&lt;/em&gt; indicará el tipo arreglo o la variable de ese tipo arreglo. La función retorna un longint indicando la cantidad de byte de ese objeto. Si queremos calcular el espacio ocupado por la variable &lt;em&gt;ApeNom&lt;/em&gt;, lo estableceríamos de la siguiente manera, &lt;em&gt;SizeOf(ApeNom)&lt;/em&gt;, y si ApeNom fue definido de tipo &lt;em&gt;VecAlu&lt;/em&gt; como un arreglo con 10 componentes cada una de las cuales sería una cadena de 20 caracteres, lo estableceríamos de la siguiente manera, SizeOf(VecAlu). Por lo tanto, &lt;em&gt;SizeOf(ApeNom) = SizeOf(VecAlu) = 210&lt;/em&gt;.&lt;br /&gt;Por otro lado, si lo que queremos es averiguar cuantas componentes tiene un arreglo, esto se establecería como el tamaño físico del arreglo dividido por el tamaño de una de sus componentes, es decir, &lt;em&gt;SizeOf(ApeNom) div SizeOf(ApeNom[1]) = 210 div 21 = 10&lt;/em&gt;.&lt;br /&gt;Si utilizamos un subíndice para que haga referencia a un elemento del arreglo, estará indicando una dirección de memoria dentro de ese intervalo, siempre y cuando el valor del subíndice esté comprendido entre 1 y 10. Así, p.e. si i = 1 la dirección del primer elemento del arreglo coincide con la dirección de la variable &lt;em&gt;ApeNom&lt;/em&gt;, es decir, &lt;em&gt;dApeNom = dApenom[1]&lt;/em&gt;, en donde la letra d indica dirección, si i = 2, la dirección de inicio del segundo elemento es 1021, en cambio si &lt;em&gt;i = 3&lt;/em&gt;, la dirección de inicio del tercer elemento es 1042 y así sucesivamente. Por lo tanto, notamos que un incremento de 1 en el subíndice en realidad es un incremento en 21 bytes, es decir, un incremento de acuerdo al tamaño de cada componente del arreglo.&lt;br /&gt;&lt;strong&gt;¿Qué sucederá si el subíndice adoptara un valor inferior o superior a 1 ó 10 respectivamente?&lt;/strong&gt; La respuesta es obvia, estaríamos invadiendo una zona de memoria desconocida, por lo tanto, los efectos que se podrían producir serían impredecibles, algunos de los cuales podrían ser, cambiar los valores a otras variables que estuvieran contiguas a esta región de memoria, que aparecieran caracteres extraños en la pantalla, que se colgara la ejecución del programa, entre otros. Será responsabilidad del programador llevar el control del valor del subíndice. Turbo Pascal brinda de una directiva al compilador &lt;strong&gt;{$R+} y {$R-}&lt;/strong&gt; que permite modificar para que el compilador pueda hacer un control o no, de los valores que tomen las variables y en el caso de los arreglos también el subíndice, para que genere un error cuando sus valores escapen fuera de su intervalo definidos en tiempo de compilación. Bajo estas situaciones se detendrá la ejecución del programa, si la directiva está indicada con signo más. En cambio si la directiva está indicada con signo menos se desactiva esta característica y en caso que una variable o subíndice adopten valores fuera de su intervalo no se generará ninguna advertencia por parte del compilador y la ejecución del programa continuará como si nada hubiese ocurrido, en estos casos se complementará el valor excedido para que se genere un valor dentro del intervalo aceptado por la declaración del tipo de la variable. Una excepción a esta directiva, es cuando en el código del programa asignamos un valor fuera de los límites que puede soportar una variable, en estos casos, al momento de compilar el programa, el mismo compilador informará que el valor que queremos asignar está fuera de los límites. Por ejemplo, si x es una variable de tipo byte y hacemos x &lt;-- 258 al compilar el programa generará un mensaje de error. En el caso de los índices de un arreglo, si tomamos el ejemplo anterior que es de 1 a 10, si el subíndice adoptara un valor de 15 ó 130 ó 255 no se complementaría ya que el compilador lo determinaría como de tipo byte, pero si tomara un valor negativo o mayor a 255 en estos casos sí lo complementaría, pudiendo generar un valor entre 0 y 255, esto en la situación en que le asignemos estos posibles valores a la variable que será empleada como índice, p.e. si asignamos a la variable x &lt;-- 255 y hacemos que la variable i &lt;-- x + 3, si la variable i estuviera definida como de tipo byte el valor que se asignaría no sería 258 sino que se complementaría y pasaría a contener 2, es decir, el resultado de 258 – 256, luego si hacemos &lt;em&gt;ApeNom[i]&lt;/em&gt; se estaría refiriendo al segundo elemento del arreglo, es decir a Ríos, María. En cambio, si lo que quisiéramos realizar fuera &lt;em&gt;ApeNom[i + 3]&lt;/em&gt;, en este caso el resultado sería 258, no se complementa y por lo tanto, se estaría haciendo referencia al elemento 258 y como notamos, eso está fuera de la región de memoria de ApeNom, en conclusión, se está invadiendo una región de memoria desconocida y como consecuencia se podría tener los problemas anteriormente indicados. La directiva al compilador &lt;strong&gt;{$R±}&lt;/strong&gt; realiza la verificación de intervalo de valores de los objetos, el símbolo R se refiere a range, y el error informado en tiempo de ejecución es el &lt;strong&gt;Error#201&lt;/strong&gt; &lt;em&gt;Range check error&lt;/em&gt;, Verificación de intervalo. El valor por defecto es &lt;strong&gt;{$R-}&lt;/strong&gt;, vale decir, está desactivada. En el estado &lt;strong&gt;{$R+}&lt;/strong&gt; los arreglos y las expresiones de cadena indexadas &lt;em&gt;cad[i]&lt;/em&gt;, son verificadas dentro de los límites definidos, y todas las asignaciones a variables escalares y de intervalo son también verificadas dentro de los límites definidos. Si la verificación de intervalo falla, la ejecución del programa finaliza y se muestra un mensaje de error. Esta opción se debe utilizar en tiempo de depuración del programa y desactivarla cuando el programa haya sido depurado, de esta manera el programa correrá más rápidamente. Si lo que queremos es controlar en todo el ámbito del programa, entonces la directiva debe ubicarse antes de los módulos, un lugar apropiado sería incluso antes de la cabecera del programa, es decir, antes de la palabra reservada program, o bien inmediatamente a continuación de esta cabecera, como se muestra en los siguientes ejemplos:&lt;br /&gt;&lt;br /&gt;{$R+}&lt;br /&gt;&lt;strong&gt;program&lt;/strong&gt; VerificarIntervalos;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;program&lt;/strong&gt; VerificarIntervalos;&lt;br /&gt;{$R+}&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Otros tipos de advertencias que se podrían generar al compilar un programa que utilice arreglos, son los casos en que nos quedemos sin memoria suficiente; informados por el compilador Turbo Pascal serían los siguientes:&lt;br /&gt;&lt;strong&gt;Error#22&lt;/strong&gt; &lt;em&gt;Structure too large&lt;/em&gt;, Estructura muy grande. Se produce al definir un arreglo en el cual la memoria se ve saturada por el espacio a reservar, es decir, cantidad de elementos por la cantidad de bytes de cada componente, es mayor a 64 Kbytes, que es el espacio máximo para las variables globales, p.e. al definir el siguiente tipo de dato &lt;em&gt;v = &lt;strong&gt;array&lt;/strong&gt;[1..3000] of str22&lt;/em&gt;; se generará dicho error.&lt;br /&gt;&lt;strong&gt;Error#96&lt;/strong&gt; &lt;em&gt;Too many variables&lt;/em&gt;, Demasiadas variables. Se producirá el definir varias estructuras de datos en la cual ninguna de ellas supera el máximo permitido, pero sí la sumatoria de ellas, p.e. &lt;em&gt;v = array[1..2000] of str22; w = array[1..1000] of str22;&lt;/em&gt; lo mismo ocurriría al declarar variables espacios en cada uno de los módulos.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Conclusión:&lt;/strong&gt; al momento de utilizar arreglos, se deben tomar ciertas medidas preventivas. La memoria interna puede verse saturada, el subíndice puede tomar valores fuera del intervalo de valores definidos. Por estos motivos se recomienda realizar una estimación necesaria para la cantidad de memoria a utilizar y asegurarse los valores que adopten los índices, ya que, la responsabilidad será exclusivamente del programador.&lt;br /&gt;&lt;a mame="ARRAY_EN_PASCAL"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a name="arrpascal"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Arreglos en Turbo Pascal&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Para poder emplear arreglos primero debemos definir un identificador de tipo arreglo. En el mismo se indicará la cantidad de dimensiones y por cada dimensión la cantidad de elementos o componentes que tendrá, por último se indicará el tipo de esas componentes.&lt;br /&gt;A continuación se muestra como declarar un tipo arreglo en Turbo Pascal:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;br /&gt;Arreglo = &lt;strong&gt;array&lt;/strong&gt;[&lt;em&gt;dimensión1, dimensión2, ...&lt;/em&gt; ] &lt;strong&gt;of &lt;/strong&gt;tipo;&lt;br /&gt;&lt;br /&gt;En el ejemplo anterior vemos que la palabra reservada &lt;strong&gt;array&lt;/strong&gt; establece el tipo arreglo, dimensión1 establece la primer dimensión del arreglo, dimensión2 la segunda dimensión y así sucesivamente, Turbo Pascal no impone límites en la cantidad de dimensiones, el límite solamente estará impuesto por la cantidad de memoria interna disponible y esto es solo para el segmento de datos cuyo tamaño máximo es de 64Kb. Cada una de las dimensiones de un arreglo establecerá la cantidad de componentes a través de un intervalo &lt;em&gt;valIni..valFin&lt;/em&gt; en donde, &lt;em&gt;valIni&lt;/em&gt; indica el valor inicial y &lt;em&gt;valFin&lt;/em&gt; el valor final, es decir, el intervalo cerrado de valores que podrá contener el subíndice, mientras que tipo establece el &lt;em&gt;tipo&lt;/em&gt; de valores de cada componente del arreglo.&lt;br /&gt;Tratándose si las variables de tipo arreglo se declararon de ámbito global entonces ocupará el segmento de datos y su tamaño máximo es de 64 Kbytes. Pero si la variable fue declarada de ámbito local, es decir dentro de un módulo, la región de memoria es el segmento del stack o pila y el tamaño de la memoria de esta región por defecto Turbo Pascal lo establece en 16384 bytes, aunque su valor máximo se podría llevar a los 64 Kbytes, el resultado sería si el tamaño fuera el valor por defecto sucedería un error en tiempo de ejecución por desbordamiento de la pila, es decir supero la capacidad de almacenamiento. Error 202.&lt;br /&gt;De este ejemplo, se puede inferir que una variable de tipo arreglo insume mucha memoria.&lt;br /&gt;Los valores &lt;em&gt;valIni&lt;/em&gt; y &lt;em&gt;valFin&lt;/em&gt; deben ser de tipo ordinal, vale decir, que pueden ser los enteros, -&lt;strong&gt;pero no el tipo longint o por intervalo de tipo longint&lt;/strong&gt;-, char, boolean, o definidos por el usuario. Solo se podrán consignar valores constantes tanto para valIni como para valFin. Cada dimensión podrá ser de diferentes tipos ordinales, por ejemplo, si un arreglo fue definido con 2 dimensiones, la primer dimensión podría ser valores enteros y la segunda valores char, como se muestra a continuación:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;em&gt;ArrReal = array[1..10, ‘A’..’E’] of real;&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;el tipo definido por el usuario &lt;em&gt;ArrReal&lt;/em&gt; es igual al tipo arreglo con 2 dimensiones, siendo la primer dimensión establecida en el intervalo [1; 10], lo que establece que el subíndice de la primer dimensión sólo podrá tomar valores entre 1 y 10 y la segunda dimensión establecida en el intervalo [‘A’; ‘E’], lo que establece que el subíndice de la segunda dimensión sólo podrá tomar valores entre ‘A’ y ‘E’. La cantidad de elementos del arreglo &lt;em&gt;ArrReal&lt;/em&gt; está establecida en 10 x 5 = 50 elementos ocupando un espacio en la memoria interna cuando se declaren variables de ese tipo de 50 x 6 bytes = 300 bytes.&lt;br /&gt;Los arreglos con una dimensión se denominan &lt;strong&gt;vectores&lt;/strong&gt; y los arreglos con 2 dimensiones se los denominan &lt;strong&gt;matrices&lt;/strong&gt;. A los elementos de un arreglo se los puede &lt;strong&gt;acceder en forma secuencial o bien al azar&lt;/strong&gt;. La manera de recorrer los elementos secuencialmente es con un ciclo que lo recorra desde su valor inicial hasta su valor final o bien dentro de estos valores.&lt;br /&gt;Las componentes de un arreglo se ubican en la memoria en forma lineal, en un arreglo unidireccional la correspondencia es directa, pero &lt;strong&gt;¿cómo será en el caso de un arreglo bidireccional o con más dimensiones?&lt;/strong&gt;. Tomemos el caso de un arreglo de 2 dimensiones de &lt;em&gt;m x n&lt;/em&gt;, es decir, &lt;em&gt;m &lt;/em&gt;filas y &lt;em&gt;n&lt;/em&gt; columnas, la disposición se realizará por filas o bien por columnas, esto lo determinará el propio lenguaje a utilizar. En el caso del Turbo Pascal la disposición de los elementos, la convención elegida es por filas, esto es, primero se ubican en la memoria los primeros n elementos de la primer fila, luego los segundos &lt;em&gt;n&lt;/em&gt; elementos de la segunda fila y así sucesivamente hasta completar los últimos &lt;em&gt;n&lt;/em&gt; elementos de la fila &lt;em&gt;m&lt;/em&gt;. Conociendo esta disposición de los elementos, es fácil poder determinar el lugar de almacenamiento en forma lineal de un &lt;em&gt;elemento[i, j]&lt;/em&gt; aplicando la siguiente expresión:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;em&gt;(i - 1) * n + j (1)&lt;/em&gt; &lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;strong&gt;con:&lt;/strong&gt; (1 MENOR= i MENOR= m) ^ (1 MANOR= j MENOR= n)&lt;br /&gt;&lt;br /&gt;Por ejemplo, si &lt;em&gt;m&lt;/em&gt; = 4 y &lt;em&gt;n&lt;/em&gt; = 5, encontrar la posición del &lt;em&gt;elemento[2, 4]&lt;/em&gt;, aplicando la expresión (1), reemplazando i por 2 y j por 4 obtenemos 9, por lo tanto, el &lt;em&gt;elemento[2, 4]&lt;/em&gt; linealizado se localiza en la posición ordinal 9 a partir de la dirección inicial del arreglo en la memoria interna.&lt;br /&gt;En el ejemplo que se detalla a continuación notamos que el &lt;em&gt;elemento[2, 4] = 22&lt;/em&gt; y en la linealización dada a continuación vemos que en la posición 9 el valor es 22.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R_MmthEk_dI/AAAAAAAAAM4/XdAJsiH_hRE/s1600-h/ArrayMatLin.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184530159447113170" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R_MmthEk_dI/AAAAAAAAAM4/XdAJsiH_hRE/s400/ArrayMatLin.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;Las matrices pueden ser &lt;strong&gt;rectangulares&lt;/strong&gt; o &lt;strong&gt;cuadradas&lt;/strong&gt;. Una matriz rectangular es aquella en la que la cantidad de filas es distinta a la cantidad de columnas es decir, &lt;em&gt;A&lt;sub&gt;nxm&lt;/sub&gt;&lt;/em&gt;, en donde, &lt;em&gt;n ≠ m&lt;/em&gt; y una matriz cuadrada es aquella en la que la cantidad de filas es igual a la cantidad de columnas, es decir, &lt;em&gt;A&lt;sub&gt;nxm&lt;/sub&gt; = A&lt;sub&gt;nxn&lt;/sub&gt;&lt;/em&gt; ya que, &lt;em&gt;n = m&lt;/em&gt;.&lt;br /&gt;Una matriz cuadrada presenta 2 diagonales, una diagonal principal y una diagonal secundaria. Los elementos que se encuentran en la diagonal principal tienen como condición &lt;em&gt;i = j&lt;/em&gt; y los elementos que se encuentran en la diagonal secundaria tienen como condición &lt;em&gt;i + j = n + 1&lt;/em&gt;. &lt;strong&gt;(II)&lt;/strong&gt;&lt;br /&gt;Asignar unos a los elementos de la diagonal principal:&lt;br /&gt;&lt;br /&gt;i &lt;-- 1 ↑ n A[i, i] &lt;-- 1 Asignar 1’s a los elementos de la diagonal secundaria: i &lt;-- 1 ↑ n A[i, n + 1 - i] &lt;-- 1 n + 1 – i se obtiene de despejar j en la expresión &lt;strong&gt;(II)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Los elementos de un arreglo se pueden utilizar de la misma manera que las variables simples para, asignarles un valor en una asignación interna o como una asignación externa de entrada o de salida, comparar su valor, utilizarlas en una expresión, etc.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejemplo:&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R_MnpxEk_eI/AAAAAAAAANA/lLMOzlrmIg4/s1600-h/ArrayEj2.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184531194534231522" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R_MnpxEk_eI/AAAAAAAAANA/lLMOzlrmIg4/s400/ArrayEj2.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejemplos:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;const&lt;/strong&gt;&lt;br /&gt;MIN = 1;&lt;br /&gt;MAX = 10;&lt;br /&gt;ULT_MES = 12;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;br /&gt;str = &lt;strong&gt;string&lt;/strong&gt;[20];&lt;br /&gt;IntVal = 1..ULT_MES;&lt;br /&gt;ArrUno = &lt;strong&gt;array&lt;/strong&gt;[MIN..MAX] &lt;strong&gt;of&lt;/strong&gt; word;&lt;br /&gt;ArrDos = &lt;strong&gt;array&lt;/strong&gt;[1..5,’1’..’5’] &lt;strong&gt;of&lt;/strong&gt; str20;&lt;br /&gt;Arr1 = &lt;strong&gt;array&lt;/strong&gt;[-5..5] &lt;strong&gt;of&lt;/strong&gt; longint;&lt;br /&gt;Arr2 = &lt;strong&gt;array&lt;/strong&gt;[IntVal] &lt;strong&gt;of&lt;/strong&gt; char;&lt;br /&gt;&lt;br /&gt;En todos los ejemplos precedentes el tipo de cada elemento es un tipo simple de dato, pero existe la posibilidad que esos tipos sean de un tipo estructurado de datos. Por lo tanto el tipo de cada componente también podría ser como se indica a continuación:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;br /&gt;str20 = &lt;strong&gt;string&lt;/strong&gt;[20];&lt;br /&gt;Fecha = &lt;strong&gt;record&lt;/strong&gt;&lt;br /&gt;aa : word;&lt;br /&gt;mm,&lt;br /&gt;dd : byte&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;&lt;br /&gt;VCuotas = &lt;strong&gt;array&lt;/strong&gt;[1..12] &lt;strong&gt;of&lt;/strong&gt; real;&lt;br /&gt;RegAlu = &lt;strong&gt;record&lt;/strong&gt;&lt;br /&gt;NroLeg : longint;&lt;br /&gt;ApeNom,&lt;br /&gt;Domic,&lt;br /&gt;Local : str20;&lt;br /&gt;FecNac : Fecha;&lt;br /&gt;EstCiv : char;&lt;br /&gt;Trabaja : boolean;&lt;br /&gt;Cuotas : VCuotas&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;&lt;br /&gt;VecRegAlu = &lt;strong&gt;array&lt;/strong&gt;[1..100] &lt;strong&gt;of&lt;/strong&gt; RegAlu;&lt;br /&gt;VecVec = &lt;strong&gt;array&lt;/strong&gt;[1..10] &lt;strong&gt;of&lt;/strong&gt; &lt;strong&gt;array&lt;/strong&gt;[1..10] &lt;strong&gt;of&lt;/strong&gt; RegAlu;&lt;br /&gt;CjtoByte = &lt;strong&gt;set of&lt;/strong&gt; byte;&lt;br /&gt;VecCjto = &lt;strong&gt;array&lt;/strong&gt;[1..50] &lt;strong&gt;of&lt;/strong&gt; CjtoByte;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;VapeNom : VecRegAlu;&lt;br /&gt;&lt;br /&gt;Al igual que los arreglos con componentes simples, también podremos referirnos a elementos de una estructura arreglo de registro para asignar valores de manera interna o externa de entrada o salida, comparar, emplear dentro de expresiones, etc.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;VapeNom[i].NroLeg &lt;-- 1234 VapeNom[i].FecNac.mm &gt; mes&lt;br /&gt;x &lt;-- x + VapeNom[i].Cuotas[j] &lt;a name="pasparamarr"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Pasaje de parámetros de tipo arreglos&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;De la misma manera que las variables simples, o archivos, o registros, o conjuntos, los arreglos también pueden ser pasados como parámetros a los módulos. Cabe aclarar que los arreglos pueden ser pasados por valor o por referencia, en el primer caso se haría una copia del arreglo en el segmento de la pila, lo que implica que si el arreglo es muy grande podríamos saturar ese espacio con la consecuente situación de error por desbordamiento de la pila, siendo el &lt;strong&gt;Error #202&lt;/strong&gt; &lt;em&gt;Stack overflow error&lt;/em&gt;, Error por desbordamiento de la Pila. Este es un error fatal y ocasionará la terminación de la ejecución del programa inmediatamente. En el segundo caso si el arreglo es pasado por referencia solo se pasa un puntero al arreglo. Por lo tanto, lo aconsejable sería pasar los arreglos siempre por referencia.&lt;br /&gt;A continuación presentamos diversas variantes para pasar como parámetro la variable &lt;em&gt;VapeNom&lt;/em&gt;, por razones de conveniencia en la escritura, se pasará el arreglo por valor.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;SizeOf(RegAlu) = 145 y SizeOf(VapeNom) = 14500&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R_MogxEk_fI/AAAAAAAAANI/BrjN_guyOcg/s1600-h/ArrayParam.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184532139427036658" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R_MogxEk_fI/AAAAAAAAANI/BrjN_guyOcg/s400/ArrayParam.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;La asignación entre vectores es posible siempre y cuando los arreglos sean del mismo tipo. Si ArrUno es un tipo arreglo y Vec1 y Vec2 son ambos de tipo ArrUno, entonces la asignación entre estos dos arreglos es válida, como se indica a continuación: Vec2 &lt;-- Vec1 Esto mismo sería equivalente a realizar: &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R_MplBEk_gI/AAAAAAAAANQ/SqBkqba8L8c/s1600-h/ArrayCpy.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184533311953108482" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R_MplBEk_gI/AAAAAAAAANQ/SqBkqba8L8c/s400/ArrayCpy.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Operaciones con arreglos&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;a name="bussecarr"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Búsqueda secuencial o lineal&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;La búsqueda secuencial en un arreglo consiste en buscar un valor en el arreglo recorriendo los elementos adyacentes, comenzando desde una posición inicial. El proceso finaliza cuando se encuentre una posición en el cual su valor es el buscado o bien cuando se haya alcanzado al último elemento y no apareció el valor buscado. Por lo tanto habrá dos situaciones de salida, una es cuando se encontró el valor y la otra cuando se alcanzó al último elemento en el arreglo sin haberse encontrado el valor. De esto se desprende que si el valor estuviera en la primera posición, un solo acceso al arreglo sería suficiente y en el peor de los casos tendremos que acceder hasta la última posición, así, si un arreglo tuviera &lt;em&gt;n&lt;/em&gt; componentes, la cantidad de accesos promedia sería de &lt;em&gt;n / 2&lt;/em&gt;.&lt;br /&gt;A continuación se presenta el siguiente módulo en el cual se buscará el valor de una clave en un arreglo, retornando el módulo la posición encontrada si el valor clave se encontró en el arreglo, caso contrario un valor cero si no se encontró.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R_MqQBEk_hI/AAAAAAAAANY/EAe5gMmXIeo/s1600-h/ArrayBusLin.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184534050687483410" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R_MqQBEk_hI/AAAAAAAAANY/EAe5gMmXIeo/s400/ArrayBusLin.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;El método de búsqueda secuencial sirve tanto si el arreglo está desordenado como si se encontrara ordenado. No obstante en los casos en que el arreglo estuviera ordenado debería optimizarse el algoritmo para los casos en que habiendo llegado a una posición en el arreglo y siendo que su contenido es mayor al valor buscado, bajo esta situación se debería abandonar la búsqueda, ya que si no se lo encontró hasta esa posición, tampoco se lo encontrará más adelante, por ser todos esos valores mayores al buscado, sabiendo que el arreglo se encontraba ordenado en forma ascendente.&lt;br /&gt;&lt;br /&gt;&lt;a name="bussecopt"&gt;&lt;/a&gt;&lt;br /&gt;A continuación se presenta el módulo de búsqueda secuencial optimizado.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R_MrbREk_iI/AAAAAAAAANg/Xhm9KN3tV_E/s1600-h/ArrayBusLinOpt.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184535343472639522" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R_MrbREk_iI/AAAAAAAAANg/Xhm9KN3tV_E/s400/ArrayBusLinOpt.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;El módulo &lt;em&gt;BusLinOpt&lt;/em&gt; mejora el rendimiento de la búsqueda con respecto al módulo BusLin, ya que en el segundo caso si se encontró un valor mayor al buscado se abandona la búsqueda de los siguientes elementos restantes.&lt;br /&gt;&lt;a name="busbinarr"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Búsqueda binaria&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Pero, &lt;strong&gt;¿será este el mejor método de búsqueda cuando el arreglo se encuentre ordenado, por el valor de la clave a buscar?.&lt;/strong&gt; La respuesta es &lt;strong&gt;¡NO!.&lt;/strong&gt; Una mejor manera de buscar un valor en un arreglo ordenado será aquel que obtiene un punto medio entre sus extremos y es comparado por el valor a buscar, si es, entonces se encontró y se abandona la búsqueda, en cambio si no lo es, caben dos posibilidades, que haya que seguir buscando en una primera mitad o bien en la segunda mitad, en ambos casos el arreglo queda reducido para continuar la búsqueda en la mitad. El método que realiza estas acciones se conoce como método de búsqueda binario o dicotómica. Este método ya fue presentado en el tema de buscar un elemento en un archivo ordenado. Por lo tanto, diremos que conservará básicamente la estructura lógica vista, la única diferencia notable está en que no hace falta bajar el dato ya que se encuentra en la propia memoria interna. A continuación se presenta el módulo de búsqueda binaria o dicotómica en arreglos.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R_MsKBEk_jI/AAAAAAAAANo/p41IExVF5Fw/s1600-h/ArrayBusBin.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184536146631523890" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R_MsKBEk_jI/AAAAAAAAANo/p41IExVF5Fw/s400/ArrayBusBin.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;El método comienza conociendo las posiciones extremas del arreglo, pri y ult, se obtiene el punto medio med y se compara si el valor de esta posición es el valor clave a buscar, si es entonces se abandona el proceso, sino caben 2 alternativas, es menor, entonces se modifica el extremo inferior pri por el de la posición med + 1 caso contrario se modifica el extremo superior ult por el de la posición med – 1, luego de lo cual se obtiene una nueva posición med. Si después de reiteradas búsquedas no aparece el valor el algoritmo finaliza cuando el valor extremo inferior pri se vuelva mayor al valor del extremo superior ult.&lt;br /&gt;Como vemos por cada comparación realizada se reduce a la mitad el conjunto de valores a consultar, por lo tanto, el análisis será de:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;n / 2, n / 4, n / 8; es decir, n / 2&lt;sup&gt;1&lt;/sup&gt;, n / 2&lt;sup&gt;2&lt;/sup&gt;, n / 2&lt;sup&gt;3&lt;/sup&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;El proceso finalizará cuando el tamaño se haga MENOR 1. Por lo tanto, si k es el número mayor de comparaciones n / 2&lt;sup&gt;k&lt;/sup&gt; MENOR 1 establecerá la finalización.&lt;br /&gt;&lt;br /&gt;Si tomamos un conjunto de &lt;em&gt;50000&lt;/em&gt; elementos, la cantidad máxima de comparaciones estará en el orden de &lt;em&gt;log&lt;sub&gt;2&lt;/sub&gt; n = log&lt;sub&gt;2&lt;/sub&gt; 50000 ~16&lt;/em&gt;. Por lo tanto, con &lt;em&gt;k = 16&lt;/em&gt; se abandonará la búsqueda si aún no se encontró el valor de la clave en el arreglo.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Se tiene el siguiente arreglo &lt;em&gt;Arr&lt;/em&gt; con los siguientes elementos:&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R_MtHxEk_kI/AAAAAAAAANw/TvQXrkavG_8/s1600-h/ArrayPos.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184537207488446018" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R_MtHxEk_kI/AAAAAAAAANw/TvQXrkavG_8/s400/ArrayPos.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;y se requiere buscar el valor 35, los pasos a realizar establecerán los siguientes valores para los extremos y los puntos medios:&lt;br /&gt;&lt;br /&gt;pri &lt;-- 1, ult &lt;-- 15, med &lt;-- 8, como el valor de la pos. 8 es 56 y no es igual a 35 la comparación siguiente 56 MENOR 35 es falsa se cambia el extremo superior ult &lt;-- med – 1 y med &lt;-- 4, como el valor de la pos. 4 es 32 y no es igual a 35 la comparación siguiente 32 MENOR 35 es verdadera se cambia el extremo inferior pri &lt;-- med + 1 y med &lt;-- 6, notamos que 43 MENOR 35 es falso se modifica ult &lt;-- med – 1 y med &lt;-- 5, por último vemos que el valor de la pos. 5 35 es igual al valor a buscar que es 35, por lo tanto hemos encontrado el valor clave. Tambien notamos que los extremos en este último caso se hicieron iguales y justamente en esa posición se encontraba el valor a buscar, este sería la última comparación a realizar si el valor no se hubiera encontrado, debido a que en el próximo paso el extremo inferior se volvería mayor al extremo superior, indicando que no debemos seguir procesando la búsqueda. &lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;a name="ordenar"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Ordenamiento de arreglos&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Como fue indicado en párrafos previos un arreglo podrá encontrarse ordenado o no. Si no se encuentra ordenado, a efectos de mejorar el rendimiento de un proceso o por motivos de mostrar los datos ordenados bajo un determinado criterio, hacen de la necesidad de ordenar los arreglos. Existen varios métodos para ordenar arreglos, pero básicamente podríamos dividirlos en 2 clases; los métodos cuadráticos o directos (&lt;em&gt;N&lt;sup&gt;2&lt;/sup&gt;&lt;/em&gt;) y los métodos avanzados o logarítmicos o indirectos &lt;em&gt;(N x log2 N).&lt;/em&gt; &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;En el primer grupo encontramos varios métodos, a saber; &lt;strong&gt;burbuja&lt;/strong&gt; (&lt;em&gt;bubble sort&lt;/em&gt;), selección, inserción. En el segundo grupo encontramos también varios métodos, a saber; shell, quick sort, ordenación por mezcla (&lt;em&gt;merge&lt;/em&gt;). &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Los métodos directos son fáciles de programar pero de ejecución más lenta. En cambio, los métodos indirectos son más complejos en su programación pero más eficientes para su ejecución ya que corren más rápidamente que los directos. No obstante, con pocos elementos en un arreglo, ambos métodos directos o indirectos funcionan muy parejos. &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;A continuación se presentará el método de ordenación por burbujeo optimizado. Este método compara elementos adyacentes, es decir, &lt;em&gt;v[i] y v[i+1]&lt;/em&gt;, cada vez que un elemento de una posición menor sea mayor al adyacente inmediato siguiente se debe realizar un intercambio, por lo tanto, al avanzar desde las posiciones inferiores hacia las posiciones superiores del arreglo, se irá arrastrando el valor mayor hasta alcanzar la última posición, y algunos de los valores menores se irán corriendo hacia las posiciones inferiores. La cantidad de pasadas estará en función de la cantidad de elementos de un arreglo. En el caso de un arreglo con n cantidad de elementos la cantidad de pasadas máximas será de n – 1. Pero este método por ser optimizado tiene la característica de que si en una pasada no se realizó ningún intercambio podemos asegurar que el arreglo ya quedó ordenado y por lo tanto abandonar las restantes pasadas, consiguiendo un ahorro en el tiempo de ejecución. Por cada pasada debemos recorrer cada elemento &lt;em&gt;desde 1 hasta a n – k&lt;/em&gt;, en donde, &lt;em&gt;k&lt;/em&gt; en la primer pasada vale 1, en la segunda pasada vale 2 y así sucesivamente. Al termino de cada pasada se habrá acomodado el elemento más pesado en la última posición de cada pasada. Seguidamente se presenta el algoritmo de ordenación por burbujeo optimizado. &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;img id="BLOGGER_PHOTO_ID_5206746734442131730" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/SEIUkYXZMRI/AAAAAAAAAYQ/Sy94Ib1prO4/s400/ArrayOrd.JPG" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R_Mt8BEk_lI/AAAAAAAAAN4/3bpBb04aAjw/s1600-h/ArrayOrd.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Los métodos directos de ordenación se miden en cuanto a la cantidad de preguntas que deben de realizarse y está en función del valor &lt;em&gt;N&lt;/em&gt;. En el caso de la ordenación por burbuja optimizado, notamos que en la primera pasada la cantidad de comparaciones es de &lt;em&gt;n – 1&lt;/em&gt;, en la segunda pasada de &lt;em&gt;n-2, n-3&lt;/em&gt; en la tercera pasada, hasta llegar a 1 comparación en la última pasada, por lo tanto: &lt;/p&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;em&gt;&lt;span style="font-size:85%;"&gt;1 + 2 + 3 + ... + (n - 3) + (n - 2) + (n - 1) = n · (n - 1) / 2 = (n2 – n) / 2&lt;/span&gt;&lt;/em&gt; &lt;/p&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;El mejor de los casos es que el arreglo se encuentre ordenado, en esta situación solo hará falta una pasada, en cambio, el peor de los casos será que el arreglo se encuentre ordenado invertido, es decir, si queremos ordenarlo en forma ascendente y se encuentra ordenado en forma descendente.&lt;br /&gt;Los métodos vistos en párrafos previos de búsqueda secuencial, búsqueda secuencial optimizada, búsqueda binaria y ordenación por burbujeo, han sido desarrollados para arreglos en la que las componentes son de un valor simple de dato. No obstante, estos mismos métodos con algunas ligeras modificaciones pueden ser aplicados para arreglos cuyas componentes sean de tipo estructurado, lo más común de tipo registro. Bajo esta situación al comparar un elemento con otro modificamos la notación &lt;em&gt;Arr[i]&lt;/em&gt; por &lt;em&gt;Arr[i].cmp&lt;/em&gt; en donde, &lt;em&gt;cmp&lt;/em&gt; es el nombre de una de las componentes del registro, es decir, el nombre de un campo.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;a name="arrparale"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Arreglos paralelos&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Una alternativa a los arreglos de registro son los arreglos paralelos. Se denominan arreglos paralelos debido a que las componentes de un arreglo se corresponden con las componentes de los otros arreglos, es decir, &lt;em&gt;Arr1[i]&lt;/em&gt; se corresponde con &lt;em&gt;Arr2[i], ... Arrn[i]&lt;/em&gt;. Los procesos analizados anteriormente, podrían aplicarse tanto a los arreglos de registros como a los arreglos paralelos. Por ejemplo, si estamos ordenando el arreglo, en el caso de arreglos de registro al intercambiar las componentes &lt;em&gt;Arr[i]&lt;/em&gt; y &lt;em&gt;Arr[i+1]&lt;/em&gt; se intercambian todos los campos de esas componentes, es decir se mueve el registro completo de una y de la otra componente. En el caso de los arreglos paralelos se deben intercambiar todas las posiciones correspondientes de cada uno de ellos, vale decir, &lt;em&gt;Arr1[i]&lt;/em&gt; se intercambia con &lt;em&gt;Arr1[i+1], Arr2[i]&lt;/em&gt; se intercambia con &lt;em&gt;Arr2[i+1], ..., Arrn[i]&lt;/em&gt; se intercambia con &lt;em&gt;Arrn[i+1]&lt;/em&gt;.&lt;br /&gt;&lt;a name="desplazar"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Desplazamiento de elementos en un arreglo&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Un arreglo puede generarse incorporando valores en forma ordenada en el mismo instante en que ocurre el evento. Esta acción implicará realizar un corrimiento de un lugar, de aquellos elementos que ya estuvieran en el arreglo para abrir un lugar al nuevo elemento que se insertará en la posición apropiada para mantener el orden, ya sea ascendente o descendente. La siguiente figura muestra un ejemplo de insertar el valor 43 en un arreglo que ya contiene los siguientes valores:&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R_MuqBEk_mI/AAAAAAAAAOA/zqsLhr_GY1g/s1600-h/ArrayDir.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184538895410593378" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R_MuqBEk_mI/AAAAAAAAAOA/zqsLhr_GY1g/s400/ArrayDir.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Según el modelo presentado el valor 43 deberá ser insertado entre los valores 41 y 49. Para poder llevar a cabo esto, los valores mayores a 41 deberán ser desplazados un lugar hacia la derecha. Al hacerlo debemos tener cuidado de no perder ningún valor en el arreglo, está claro que si moviéramos el valor 49 a la posición siguiente perderíamos el valor 52, por lo tanto el desplazamiento debería realizarse desde el fondo hacia arriba o en esta situación desde la derecha hacia la izquierda, esto es, el valor 94 se movería a la posición 11, luego el valor 87 se movería a la posición 10, y así sucesivamente hasta alcanzar el valor 49 que se movería a la posición 8. Por último insertaríamos el valor 43 en la posición 7. Este proceso debe contemplar todos los casos posibles, es decir, al insertar el primer elemento, al insertar el último elemento que completa el arreglo, al insertar al inicio, al insertar al final o en cualquier otra ubicación, incluso con valores que puedan repetirse, insertar ya dado un juego de valores que se ingresarán ordenados ascendente o descendentemente.&lt;br /&gt;El proceso deberá contemplar entonces todos estos casos. A continuación se presenta el algoritmo correspondiente.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R_MvWxEk_nI/AAAAAAAAAOI/mg9KDsF1B3U/s1600-h/ArrayInsOrd.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184539664209739378" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R_MvWxEk_nI/AAAAAAAAAOI/mg9KDsF1B3U/s400/ArrayInsOrd.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;span style="font-family:trebuchet ms;"&gt;Algoritmo en pseudocódigo&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Proc InsertaEnOrden(v: tvec; elem, card: byte) {&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;(card &gt; 1) ^ (elem MENOR v[card - 1]) {&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;v[card] &lt;-- v[card - 1]&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;card &lt;-- card - 1&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;v[k] &lt;-- elem&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Bloque Principal&lt;/strong&gt; &lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Emitir('Ingrese una cantidad')&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Ingresar(cant)&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;card &lt;-- 0&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;i &lt;-- 1 ↑ cant {&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Emitir('Ingrese item')&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Ingresar(item)&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Si not BusBin(v, item, card) {&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;card &lt;-- card + 1&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;InsertaEnOrden(v, item, card)&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="ABAJO"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Anterior:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/03/conjuntos.html"&gt;Conjuntos&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Siguiente:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/04/clase-12-punteros-y-estructuras.html"&gt;Punteros y Estructuras dinámicas lineales: Pilas, Colas y Listas&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=5100408444678612840&amp;amp;postID=2362743735220737638#ARRIBA"&gt;Arriba&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100408444678612840-2362743735220737638?l=pascalgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pascalgo.blogspot.com/feeds/2362743735220737638/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5100408444678612840&amp;postID=2362743735220737638' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/2362743735220737638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/2362743735220737638'/><link rel='alternate' type='text/html' href='http://pascalgo.blogspot.com/2008/04/c-lase-11-estructura-de-datos-arreglos.html' title='Arreglos'/><author><name>Lic. Hugo Cuello</name><uri>http://www.blogger.com/profile/00801409318639239421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_ISF8DP9N9hg/R_Ml-REk_cI/AAAAAAAAAMw/JZtrCfQMEbg/s72-c/ArrayEjMem.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5100408444678612840.post-7057744435093761500</id><published>2008-03-30T17:51:00.000-07:00</published><updated>2008-04-12T19:31:48.222-07:00</updated><title type='text'>Conjuntos</title><content type='html'>&lt;a name="ARRIBA"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="#ABAJO"&gt;Abajo&lt;/a&gt;&lt;br /&gt;&lt;a name="conjuntos"&gt;&lt;/a&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Clase 10:&lt;/strong&gt; &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;em&gt;Conjuntos&lt;/em&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;ESTRUCTURA DE DATO DE TIPO CONJUNTOS&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Turbo Pascal&lt;/strong&gt; es uno de los pocos lenguajes de computadoras que brinda una cantidad de herramientas para las operaciones entre &lt;strong&gt;conjuntos&lt;/strong&gt;. Dada la importancia que tiene este concepto no solo para la matemática sino también para otras disciplinas, a continuación se tratará este tema.&lt;br /&gt;Un conjunto es una colección de elementos bien definidos. En el caso de Turbo Pascal, esos elementos deben ser todos del mismo tipo y ese tipo debe ser &lt;em&gt;ordinal&lt;/em&gt;. La cantidad máxima de elementos está limitada a 256 y los valores ordinales estarán comprendido en el intervalo 0 a 255. El tipo conjunto permite manipular con un solo nombre una serie de valores o elementos, siendo estos, las componentes de la estructura conjunto. La manera en que Turbo Pascal determina si un elemento pertenece o no al conjunto, es a través de un &lt;strong&gt;enmascaramiento&lt;/strong&gt; a nivel de bit. En principio si un bit está en 0 significa que el elemento no está presente y si un bit está en 1 significa que el elemento sí está presente. Una estructura de tipo conjunto ocupará una cantidad n de bytes, en donde n depende de los valores extremos del tipo base del conjunto. La máxima cantidad de bytes será de 32, ya que 32 x 8 = 256, de esta manera por cada bit se podrá determinar si un elemento de entre 256 máximos estará o no presente en el conjunto. Las siguientes expresiones determinan:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R_A41hEk_QI/AAAAAAAAALQ/b-OjD8udstk/s1600-h/CjtoEspMem.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183705663165234434" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 80px" height="83" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R_A41hEk_QI/AAAAAAAAALQ/b-OjD8udstk/s400/CjtoEspMem.JPG" width="400" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;en donde:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;MIN&lt;/strong&gt; es el valor extremo inferior.&lt;br /&gt;&lt;strong&gt;MAX&lt;/strong&gt; es el valor extremo superior.&lt;br /&gt;&lt;em&gt;x&lt;/em&gt; representa un valor del tipo base &lt;/span&gt;&lt;br /&gt;&lt;a name="repreint"&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Representación interna en una estructura de datos de tipo conjunto&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;A continuación se considera el siguiente caso: &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;un tipo base en el intervalo 0 a 15&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;un conjunto A = {2,5,0,12,8,15,9,11} &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;p align="justify"&gt;&lt;/li&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;MIN&lt;/strong&gt; = 0&lt;br /&gt;&lt;strong&gt;MAX&lt;/strong&gt; = 15 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Cantidad de bytes a usar por la estructura: 15 div 8 – MIN div 8 + 1 = 2&lt;br /&gt;&lt;br /&gt;Número de byte de un valor x= 2: 2 div 8 – 0 div 8 = 0&lt;br /&gt;Número de bit de un valor x=2: 2 mod 8 = 2&lt;br /&gt;&lt;br /&gt;Número de byte de un valor x= 5: 5 div 8 – 0 div 8 = 0&lt;br /&gt;Número de bit de un valor x=5: 5 mod 8 = 5&lt;br /&gt;&lt;br /&gt;Número de byte de un valor x= 0: 0 div 8 – 0 div 8 = 0&lt;br /&gt;Número de bit de un valor x=0: 0 mod 8 = 0&lt;br /&gt;&lt;br /&gt;Número de byte de un valor x=12: 12 div 8 – 0 div 8 = 1&lt;br /&gt;Número de bit de un valor x=12: 12 mod 8 = 4&lt;br /&gt;&lt;br /&gt;Número de byte de un valor x= 8: 8 div 8 – 0 div 8 = 1&lt;br /&gt;Número de bit de un valor x=8: 8 mod 8 = 0&lt;br /&gt;&lt;br /&gt;Número de byte de un valor x=15: 15 div 8 – 0 div 8 = 1&lt;br /&gt;Número de bit de un valor x=15: 15 mod 8 = 7&lt;br /&gt;&lt;br /&gt;Número de byte de un valor x= 9: 9 div 8 – 0 div 8 = 1&lt;br /&gt;Número de bit de un valor x=9: 9 mod 8 = 1&lt;br /&gt;&lt;br /&gt;Número de byte de un valor x=11: 11 div 8 – 0 div 8 = 1&lt;br /&gt;Número de bit de un valor x=11: 11 mod 8 = 3&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R_A5KREk_RI/AAAAAAAAALY/WZvmrK9iVcA/s1600-h/CjtoRepresInt.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183706019647520018" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R_A5KREk_RI/AAAAAAAAALY/WZvmrK9iVcA/s400/CjtoRepresInt.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Un bit en 0, en un número de byte y de bit correspondiente, indica que el número no pertenece al conjunto. En cambio un bit en 1, en un número de byte y de bit correspondiente, indica que el número pertenece al conjunto. De esta manera en la representación gráfica de más arriba está indicando que los elementos 2, 5, 7, 8, 11, 12, 14 y 15 pertenecen al conjunto A.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Diagramas de Venn o esquema de Euler&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Permiten representar de manera gráfica resultados de las operaciones del álgebra de conjuntos.&lt;br /&gt;&lt;a name="operaciones"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Las operaciones básicas entre conjunto son:&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R_A5-BEk_TI/AAAAAAAAALo/PwJPX-Od8I4/s1600-h/CjtoVenn1.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183706908705750322" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R_A5-BEk_TI/AAAAAAAAALo/PwJPX-Od8I4/s400/CjtoVenn1.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R_A6aBEk_UI/AAAAAAAAALw/5bZBi9i1lD0/s1600-h/CjtoVenn2.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183707389742087490" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R_A6aBEk_UI/AAAAAAAAALw/5bZBi9i1lD0/s400/CjtoVenn2.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R_A7LREk_VI/AAAAAAAAAL4/YLgVMxrmdOE/s1600-h/Cjto1.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183708235850644818" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R_A7LREk_VI/AAAAAAAAAL4/YLgVMxrmdOE/s400/Cjto1.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R_A74xEk_WI/AAAAAAAAAMA/MA0_aeQn2TU/s1600-h/Cjto2.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183709017534692706" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R_A74xEk_WI/AAAAAAAAAMA/MA0_aeQn2TU/s400/Cjto2.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R_A8ahEk_XI/AAAAAAAAAMI/jYdq447jZWM/s1600-h/CjtoLeyes.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183709597355277682" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R_A8ahEk_XI/AAAAAAAAAMI/jYdq447jZWM/s400/CjtoLeyes.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;p&gt;&lt;br /&gt;&lt;a name="cjtopascal"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Conjuntos en Turbo Pascal&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;En la sección &lt;strong&gt;type&lt;/strong&gt; primero vamos a definir un tipo conjunto por medio de las palabras reservadas &lt;em&gt;set of&lt;/em&gt; y a continuación el tipo base de cada elemento del conjunto, de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;br /&gt;tCjto = set of &lt;em&gt;tipo_base&lt;/em&gt;;&lt;br /&gt;&lt;br /&gt;El &lt;em&gt;tipo_base&lt;/em&gt; debe ser de tipo &lt;strong&gt;ordinal&lt;/strong&gt;, pero no cualquier ordinal, solamente aquellos cuyos valores ordinales estén comprendidos en &lt;em&gt;(0; 255)&lt;/em&gt;. Por lo tanto, no solo los reales y las cadenas quedan excluidos, sino también el tipo integer, shortint, longint, word. Así que, los tipos definidos por Turbo Pascal han de ser el byte, char, boolean y aquellos definidos por el usuario por enumeración y por intervalo.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ejemplos de tipos bases:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R_L5nxEk_bI/AAAAAAAAAMo/IItnnJGAjkg/s1600-h/CjtotBase.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5184480582639615410" style="WIDTH: 422px; CURSOR: hand; HEIGHT: 144px" height="124" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R_L5nxEk_bI/AAAAAAAAAMo/IItnnJGAjkg/s400/CjtotBase.JPG" width="400" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;type&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Cjto = &lt;strong&gt;set of&lt;/strong&gt; byte;&lt;br /&gt;&lt;br /&gt;Se ha definido un tipo &lt;em&gt;Cjto&lt;/em&gt; que es igual a set of byte, en donde &lt;strong&gt;set of&lt;/strong&gt; establece el tipo conjunto y &lt;em&gt;byte&lt;/em&gt; dice que los elementos son todos del tipo base byte.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;br /&gt;tFelinos = (&lt;em&gt;leon,tigre,gato,lince,jaguar,guepardo,pantera&lt;/em&gt;);&lt;br /&gt;tAlgunFelino = &lt;em&gt;gato..guepardo&lt;/em&gt;;&lt;br /&gt;tFieras = set of tFelinos;&lt;br /&gt;tAlgunaFiera = set of tAlgunFelino;&lt;br /&gt;&lt;br /&gt;Los tipos definidos por el usuario no pueden ser leídos o emitidos por medio de los procedimientos &lt;em&gt;read&lt;/em&gt; o &lt;em&gt;write&lt;/em&gt;, debido a que estos valores no son conocidos por anticipado. Una forma de evitar este inconveniente es utilizar una estructura de selección múltiple, como se indica a continuación:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Case&lt;/strong&gt; random(7) &lt;strong&gt;of&lt;/strong&gt;&lt;br /&gt;0: Felix:= leon;&lt;br /&gt;1: Felix:= tigre;&lt;br /&gt;2: Felix:= gato;&lt;br /&gt;3: Felix:= lince;&lt;br /&gt;4: Felix:= jaguar;&lt;br /&gt;5: Felix:= guepardo;&lt;br /&gt;6: Felix:= pantera&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Case&lt;/strong&gt; Felix &lt;strong&gt;of&lt;/strong&gt;&lt;br /&gt;leon: writeln(‘leon’);&lt;br /&gt;tigre: writeln(‘tigre’);&lt;br /&gt;gato: writeln(‘gato’);&lt;br /&gt;lince: writeln(’lince’);&lt;br /&gt;jaguar: writeln(‘jaguar’);&lt;br /&gt;guepardo: writeln(‘guepardo’);&lt;br /&gt;pantera: writeln(‘pantera’)&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;Cfieras : tFieras;&lt;br /&gt;CalgunaFiera : tAlgunaFiera;&lt;br /&gt;&lt;br /&gt;Los tipos definidos por el usuario por enumeración o por intervalo son ordinales.&lt;br /&gt;&lt;em&gt;tFelinos&lt;/em&gt; es un tipo de dato definido por el usuario, siendo sus elementos valores constantes y no pueden repetirse en otra definición. Cada elemento ocupa una posición ordinal comenzando desde 0 y siguiendo con incremento de 1. Por lo tanto, leon = 0, tigre = 1, gato = 3 y así sucesivamente.&lt;br /&gt;Esto permite entonces establecer una relación leon menor tigre menor gato menor ... menor pantera.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;em&gt;tAlgunFelino&lt;/em&gt; es un tipo también definido por el usuario en la que se establece indicando un valor que indica el extremo inferior y otro valor que indica el extremo superior.&lt;br /&gt;&lt;em&gt;Cfieras&lt;/em&gt; es una variable de tipo &lt;em&gt;tFieras&lt;/em&gt;, por lo tanto, los valores que podrá contener son elementos del tipo base &lt;em&gt;tFelinos&lt;/em&gt;, es decir, &lt;em&gt;leon, tigre, gato&lt;/em&gt;...&lt;br /&gt;&lt;em&gt;CalgunaFiera&lt;/em&gt; es una variable de tipo &lt;em&gt;tAlgunaFiera&lt;/em&gt;, por lo tanto, los valores que podrá contener son elementos del tipo base tAlgunFelino, es decir, &lt;em&gt;gato, lince, jaguar, leopardo&lt;/em&gt;. &lt;/span&gt;&lt;/p&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Las funciones &lt;strong&gt;Succ, Pred, Ord&lt;/strong&gt;, y &lt;strong&gt;Chr&lt;/strong&gt; pueden aplicarse a objetos de tipo &lt;u&gt;ordinal&lt;/u&gt;. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Las constantes de conjuntos se encierran entre corchetes y separadas por coma.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ejemplos&lt;/strong&gt;:&lt;br /&gt;&lt;br /&gt;[3,9..12,5,31,15]&lt;br /&gt;[‘a’..’z’,’A’..’Z’]&lt;br /&gt;[‘+’,’-‘,’*’,’/’]&lt;br /&gt;&lt;br /&gt;También es posible que los elementos estén referidos por expresiones:&lt;br /&gt;[12,a..b,i+2,ord(‘A’)..ord(‘C’),x div 2,ord(cad[k])+2,Pred(b)+5..Succ(b)+5,2*i]&lt;br /&gt;si a=5, b=8, x=52, i=15, k=3 y cad= ‘algoritmos’, entonces los elementos que pertenecen al conjunto son: 12, 5, 6, 7, 8, 17, 65, 66, 67, 26, 105, 12, 13, 14, 30 y con #14.&lt;br /&gt;&lt;br /&gt;Una constante de conjunto especial es el &lt;strong&gt;conjunto vacío&lt;/strong&gt; {} representado por [ ].&lt;br /&gt;El &lt;strong&gt;conjunto un&lt;/strong&gt;iversal &lt;em&gt;U&lt;/em&gt; está formado por todos los elementos del tipo base del conjunto, p.e. si el tipo base es &lt;em&gt;byte&lt;/em&gt;, entonces el &lt;em&gt;U&lt;/em&gt; = [0..255].&lt;br /&gt;Podemos asignarles un nombre a las constantes conjuntos en la sección const:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;const&lt;/strong&gt;&lt;br /&gt;CJTO_VACIO = [];&lt;br /&gt;CJTO_UNIVERSAL = [0..255]; son todos los elementos del tipo base.&lt;br /&gt;OPER_ARIT = [‘+’,’-‘,’*’,’/’]&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Operadores de conjuntos&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;+ para la unión entre conjuntos: A + B&lt;br /&gt;* para la intersección entre conjuntos: A * B&lt;br /&gt;- para la diferencia entre conjuntos: A – B&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Las prioridades son:&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;1º. *&lt;br /&gt;2º. +, -.&lt;br /&gt;&lt;br /&gt;La diferencia simétrica se obtiene de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;(A + B) – (A * B)&lt;/strong&gt; o por&lt;br /&gt;&lt;strong&gt;(A – B) + (B – A)&lt;/strong&gt;&lt;br /&gt;El complemento de A, indicado por &lt;strong&gt;~A&lt;/strong&gt;, es igual al &lt;strong&gt;&lt;em&gt;U&lt;/em&gt; – A&lt;/strong&gt;, es decir:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;~A = U – A&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Turbo Pascal brinda además de los operadores + y – los procedimientos &lt;strong&gt;Include&lt;/strong&gt; y &lt;strong&gt;Exclude&lt;/strong&gt; para incluir o excluir un elemento de un conjunto.&lt;br /&gt;&lt;br /&gt;Include(A,x)&lt;br /&gt;Exclude(A,x)&lt;br /&gt;&lt;br /&gt;Como la unión, la diferencia se refiere entre conjuntos, para incluir o excluir un elemento de un conjunto utilizando los operadores + o – debemos encerrar el elemento a incluir o excluir encerrado entre corchetes, de esta manera, lo estaremos transformando en conjunto, como se muestra a continuación:&lt;br /&gt;&lt;br /&gt;A := A + [x]&lt;br /&gt;A := A – [x]&lt;br /&gt;&lt;br /&gt;Include(A,x) es más eficiente que hacer A:= A + [x]&lt;br /&gt;Exclude(A,x) es más eficiente que hacer A:= A – [x]&lt;br /&gt;&lt;br /&gt;La pertenencia de un elemento en un conjunto se establece de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;x in A&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;el resultado será de tipo boolean si el elemento x pertenece al conjunto A el resultado es true, caso contrario es false.&lt;br /&gt;&lt;br /&gt;La no pertenencia de un elemento en un conjunto se establece de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;not (x in A)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;El resultado de esta evaluación es verdadero si el valor que contenga x está en el conjunto, caso contrario será falso. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejemplo:&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;x:= 4;&lt;br /&gt;A:= [2..7,20,12];&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; x in A &lt;strong&gt;then&lt;/strong&gt;&lt;br /&gt;writeln(‘el valor ‘,x,’ pertenece al conjunto A)&lt;br /&gt;&lt;strong&gt;else&lt;/strong&gt;&lt;br /&gt;writeln(‘el valor ‘,x,’ no pertenece al conjunto A’);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Emite&lt;/strong&gt;: el valor 4 pertenece al conjunto A. &lt;strong&gt;¿por qué?&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Dos conjuntos pueden ser comparados por: =, &lt;&gt;, &gt;=, &lt;=. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejemplos:&lt;/strong&gt; &lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;A = B &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Si A = {7, 3, 9, 12} y B = {9, 3, 12, 7} entonces comparar si A = B es verdadero. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;A &lt;&gt; B&lt;br /&gt;Si A = {5, 2, 8} y B = {5, 2, 8, 6} entonces comparar si A &lt;&gt; B es verdadero.&lt;br /&gt;A &gt;= B es falso si A = {5, 2, 8} y B = {5, 2, 8, 6}&lt;br /&gt;A &lt;= B es verdadero &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Si A = {} y B = {3, 1} &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;A &lt;= B es verdadero &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Para emitir los elementos que pertenecen a un conjunto debemos emplear una variable del tipo base y que recorra cada uno de los valores del conjunto universal y preguntar si pertenece al conjunto, como se muestra a continuación: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;A:= []; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;for&lt;/strong&gt; x:= 1 &lt;strong&gt;to&lt;/strong&gt; 100 &lt;strong&gt;do&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Include(A,2*x); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;for&lt;/strong&gt; x:= 0 &lt;strong&gt;to&lt;/strong&gt; 255 &lt;strong&gt;do&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;if&lt;/strong&gt; x in A &lt;strong&gt;then&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;write(x,’ ‘); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;La cardinalidad de un conjunto, indicado por #, es la cantidad de elementos que contiene. Para averiguar la cardinalidad de un conjunto en Turbo Pascal establecemos un ciclo como en el ejemplo anterior, pero contando con incremento en 1 en una variable cada vez que un elemento pertenece al conjunto, como se muestra a continuación: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;card:= 0; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;for&lt;/strong&gt; x:= 0 &lt;strong&gt;to&lt;/strong&gt; 255 &lt;strong&gt;do&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;if&lt;/strong&gt; x in A &lt;strong&gt;then&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;inc(card); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;writeln(‘#A= ‘,card); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;p&gt;&lt;br /&gt;&lt;a name="cjtobit"&gt;&lt;/a&gt;&lt;br /&gt;Conjuntos a nivel de bit&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Aquellos lenguajes de computadoras que no brinden los beneficios del tipo conjunto podrán efectuarse de una forma alternativa a &lt;strong&gt;nivel de bit&lt;/strong&gt;. Para ello, deberá contener algún operador para el tratamiento de operaciones a nivel de bit. Esos operadores que trabajan con operandos de tipo entero y producen resultados de tipo entero, Turbo Pascal los contiene y son: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Desplazamiento de bit a izquierda: &lt;strong&gt;shl&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Desplazamiento de bit a derecha: &lt;strong&gt;shr&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Operador lógico conjunción: &lt;strong&gt;and&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Operador lógico disyunción: &lt;strong&gt;or&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Operador lógico disyunción exclusivo: &lt;strong&gt;xor&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Operador lógico negación: &lt;strong&gt;not&lt;/strong&gt; -operador unario-. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Las operaciones &lt;strong&gt;i shl j&lt;/strong&gt; y &lt;strong&gt;i shr j&lt;/strong&gt; desplazan el valor de i a la izquierda o a la derecha j bits ingresando por el extremo opuesto ceros. El tipo de resultado es del mismo tipo de i. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;x &lt;-- 01010011 010 10011 000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Si se hace &lt;strong&gt;x &lt;-- x shl 3&lt;/strong&gt; los bits se desplazan de derecha a izquierda, ingresan ceros por el extremo derecho y los bits del extremo izquierdo se van perdiendo, por lo tanto, el resultado de esa operación será que en x su valor ha sido cambiado a: 10011000, es decir, los 3 dígitos de la extrema izquierda se perdieron e ingresaron 3 ceros por la extrema derecha, representado de esta otra manera &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R_A9kxEk_YI/AAAAAAAAAMQ/IgtsGkWfG3M/s1600-h/CjtoOfs.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183710872960564610" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R_A9kxEk_YI/AAAAAAAAAMQ/IgtsGkWfG3M/s400/CjtoOfs.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;Una de las características más destacadas de estos tipos de operaciones a nivel de bit es que se pueden realizar operaciones de multiplicación y división en enteros muy rápidamente cuando la base es 2, el primer operando establece el exponente de dicha base. Si los bits son desplazados j posiciones hacia la izquierda estamos multiplicando y si se desplazan j posiciones hacia la derecha estamos dividiendo. Por ejemplo si a = 2, realizar la siguiente operación &lt;strong&gt;a shl 3&lt;/strong&gt; = 16, ya que a x 2&lt;sup&gt;3&lt;/sup&gt; = 2 x 2&lt;sup&gt;3&lt;/sup&gt; = 2 x 8 = 16. De la misma manera si a = 16, realizar &lt;strong&gt;a shr 3&lt;/strong&gt; = 2, ya que a / 2&lt;sup&gt;3&lt;/sup&gt; = 16 / 2&lt;sup&gt;3&lt;/sup&gt; = 16 / 8 = 2.&lt;br /&gt;Las siguientes operaciones a nivel de bit con los operadores lógicos &lt;strong&gt;and&lt;/strong&gt;, &lt;strong&gt;or&lt;/strong&gt;, &lt;strong&gt;not&lt;/strong&gt; que se indican a continuación es para ilustrar como se opera y el resultado que se obtiene, un valor de 0 = false y un valor de 1 = true. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:trebuchet ms;"&gt;Ejemplos:&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R_A-QREk_ZI/AAAAAAAAAMY/j5lDDwJFCbk/s1600-h/CjtoBit.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183711620284874130" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R_A-QREk_ZI/AAAAAAAAAMY/j5lDDwJFCbk/s400/CjtoBit.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;Operaciones con conjuntos a nivel de bit en donde A y B son variables de tipo word, por lo tanto el elemento más pequeño es 0 y el elemento más grande es 15. El conjunto vacío es poner todos los bits en 0, como se indica a continuación: &lt;strong&gt;VACIO &lt;-- 0&lt;/strong&gt;&lt;br /&gt;El conjunto universal es poner a todos los bits en 1, como se indica a continuación:&lt;br /&gt;&lt;strong&gt;UNIVERSAL &lt;-- $FFFF&lt;/strong&gt; en donde $ indica notación sistema de numeración hexadecimal.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R_A--xEk_aI/AAAAAAAAAMg/6tDqlNtOjlo/s1600-h/CjtoOper.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183712419148791202" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R_A--xEk_aI/AAAAAAAAAMg/6tDqlNtOjlo/s400/CjtoOper.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejemplos:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Unión: C = A or B&lt;/strong&gt;&lt;br /&gt;0110011010011101 A = {0,2,3,4,7,9,10,13,14}&lt;br /&gt;&lt;strong&gt;or&lt;/strong&gt; 1100111011101110 B = {1,2,3,5,6,7,9,10,11,14,15}&lt;br /&gt;1110111011111111 C = {0,1,2,3,4,5,6,7,9,10,11,13,14,15}&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Intersección: C = A and B&lt;br /&gt;&lt;/strong&gt;0110011010011101 A = {0,2,3,4,7,9,10,13,14}&lt;br /&gt;&lt;strong&gt;and&lt;/strong&gt; 1100111011101110 B = {1,2,3,5,6,7,9,10,11,14,15}&lt;br /&gt;0100011010001101 C = {0,2,3,7,9,10,14}&lt;br /&gt;&lt;strong&gt;Diferencia: C = A - B&lt;/strong&gt;&lt;br /&gt;0110011010011101 A = {0,2,3,4,7,9,10,13,14}&lt;br /&gt;&lt;strong&gt;and not&lt;/strong&gt; 1100111011101110 B = {1,2,3,5,6,7,9,10,11,14,15}&lt;br /&gt;Hacemos primero B ß not B B = {0,4,8,12,13}&lt;br /&gt;quedando 0011000100010001 Se complementaron los bits de B, es decir, 0 x 1 y 1 x 0.&lt;br /&gt;por último hacemos el and :&lt;br /&gt;0110011010011101 A = {0,2,3,4,7,9,10,13,14}&lt;br /&gt;&lt;strong&gt;and&lt;/strong&gt; 0011000100010001 B = {0,4,8,12,13}&lt;br /&gt;0010000000010001 C = {0,4,13}&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Diferencia simétrica: C = A xor B&lt;br /&gt;&lt;/strong&gt;0110011010011101 A = {0,2,3,4,7,9,10,13,14}&lt;br /&gt;xor 1100111011101110 B = {1,2,3,5,6,7,9,10,11,14,15}&lt;br /&gt;1010100001110011 C = {0,1,4,5,6,8,11,13,15}&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Complemento: C = U and not A&lt;br /&gt;&lt;/strong&gt;0110011010011101 A = {0,2,3,4,7,9,10,13,14}&lt;br /&gt;&lt;strong&gt;not A&lt;/strong&gt; 1001100101100010 A &lt;-- not A A = {1,5,6,8,11,12,15} 1111111111111111 U = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} and 1001100101100010 not A 1001100101100010 C = {1,5,6,8,11,12,15} &lt;strong&gt;Pertenencia: (A shr x) mod 2 &lt;&gt; 0&lt;/strong&gt;&lt;br /&gt;0110011010011101 A = {0,2,3,4,7,9,10,13,14}&lt;br /&gt;Determinar si x = 4 pertenece al conjunto A. Desplazamos los bits del conjunto A, 4 posiciones hacia la derecha resultando 0000011001101001, notamos que se perdieron los 4 bits de la extrema derecha del conjunto A y se incorporaron 4 ceros por la extrema izquierda. Luego al dividir por 2, nos queda un resto de 1 y como es distinto de 0 decimos que 4 Î A.&lt;br /&gt;&lt;strong&gt;Subconjunto: A and B = A verdadero A Í B&lt;/strong&gt;&lt;br /&gt;0101110010011110 A = {1,2,3,4,7,10,11,12,14}&lt;br /&gt;&lt;strong&gt;and&lt;/strong&gt; 1101111011111110 B = {1,2,3,4,5,6,7,9,10,11,12,14,15}&lt;br /&gt;0101110010011110 C = {1,2,3,4,7,10,11,12,14}&lt;br /&gt;&lt;br /&gt;luego notamos que el conjunto C es igual al conjunto A, por lo tanto decimos que el conjunto A es subconjunto de B.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;strong&gt;Nota&lt;/strong&gt;: ¿Qué sucederá si desplazamos bits, en una variable con signo?&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://pascalgo.blogspot.com/2008/03/una-metodologa-de-resolucin-de.html"&gt;Página inicial &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="ABAJO"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="color:#009900;"&gt;Anterior:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/03/archivos-ii.html"&gt;Archivos II&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Siguiente:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/04/c-lase-11-estructura-de-datos-arreglos.html"&gt;Arreglos&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="#ARRIBA"&gt;Arriba&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100408444678612840-7057744435093761500?l=pascalgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pascalgo.blogspot.com/feeds/7057744435093761500/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5100408444678612840&amp;postID=7057744435093761500' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/7057744435093761500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/7057744435093761500'/><link rel='alternate' type='text/html' href='http://pascalgo.blogspot.com/2008/03/conjuntos.html' title='Conjuntos'/><author><name>Lic. Hugo Cuello</name><uri>http://www.blogger.com/profile/00801409318639239421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_ISF8DP9N9hg/R_A41hEk_QI/AAAAAAAAALQ/b-OjD8udstk/s72-c/CjtoEspMem.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5100408444678612840.post-5411252292307354873</id><published>2008-03-29T19:52:00.000-07:00</published><updated>2008-04-12T19:01:32.019-07:00</updated><title type='text'>Archivos II</title><content type='html'>&lt;a name="ARRIBA"&gt;&lt;/a&gt;&lt;span style="color:#009900;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="#ABAJO"&gt;Abajo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Clase 9:&lt;/strong&gt; &lt;em&gt;Archivos II&lt;/em&gt;&lt;br /&gt;&lt;a name="cortectrl"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:180%;"&gt;Corte de Control&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;El corte de control es un proceso en el cual los registros del archivo se encuentran ordenados por el valor de uno o más campos, denominados campos &lt;strong&gt;clave&lt;/strong&gt; o &lt;strong&gt;llave&lt;/strong&gt;, el ordenamiento puede ser ascendente –lo más común- o descendente. Este tipo de proceso generalmente es utilizado para realizar informes o reportes, en el cual se deba emitir de cada grupo –formado por el mismo valor del campo clave- totales, promedios, máximos o mínimos, etc..&lt;br /&gt;En líneas generales este proceso posee una estructura que es bastante característica y que pasaremos a detallar a continuación.&lt;br /&gt;Cada corte de control establece un &lt;strong&gt;nivel&lt;/strong&gt;, así si existen &lt;strong&gt;n&lt;/strong&gt; cortes de control, habrá n niveles, y cada uno de estos n cortes o niveles están contenidos dentro de un ciclo indefinido, a estos ciclos se le suma uno más, y representa el fin del proceso, siendo este ciclo el de mayor nivel y el más externo, luego en forma anidada se van desarrollando los ciclos internos en un orden que va de mayor nivel de corte hasta llegar al menor nivel de corte. El ciclo de mayor nivel establece el fin del proceso, siendo su condición, el fin del archivo que se está procesando, por medio de una variable de tipo boolean. Las condiciones de los ciclos internos van &lt;strong&gt;arrastrando&lt;/strong&gt; las condiciones de los ciclos anteriores o más externos a la que se le suma la propia condición del ciclo, es decir, la que producirá el corte de control de ese nivel, por lo tanto, cuanto más anidado sea el ciclo, más condiciones contendrá. El ciclo externo contiene una condición, y el ciclo más interno posee n + 1 condiciones. Si un proceso requiere n cortes, entonces la cantidad de ciclos será de &lt;strong&gt;n + 1&lt;/strong&gt;. Además &lt;strong&gt;cada corte de control obliga a que los datos se encuentren ordenados por el valor del campo clave comenzando desde el de mayor nivel hasta el de menor nivel&lt;/strong&gt;, por ejemplo, si se requieren obtener totales de las ventas realizadas por diferentes vendedores, los datos deberían están organizados por el código de vendedor; un segundo ejemplo, si los vendedores realizan sus actuaciones en una zona y el proceso requiere informar además totales por zonas, en este caso los datos deben encontrarse ordenados primero por código de zona y luego por código de vendedor, debido a que es de esperar que primero cambien los vendedores y luego cambien las zonas.&lt;br /&gt;&lt;strong&gt;El corte de control requiere de una lectura anticipada&lt;/strong&gt; y en el caso del lenguaje Pascal será una lectura especial, en la cual, primero se debe determinar que no sea fin de archivo para poder leer un registro. Debido a que las próximas lecturas se realizan en otro punto del programa, la lectura especial va a ser un módulo con tres parámetros, a saber: el archivo, el registro a devolver y el estado de la operación de lectura, de tipo boolean, si es falso indicará que no fue fin de archivo y se leyó un registro, caso contrario, indicará que es fin de archivo. Las próximas lecturas del archivo se realizarán en el ciclo más interno y como última acción.&lt;br /&gt;Antes de ingresar a un ciclo denominamos a esa región del algoritmo &lt;strong&gt;cabecera&lt;/strong&gt;. Al salir de un ciclo, denominamos a esa región del algoritmo &lt;strong&gt;pié&lt;/strong&gt;. Dentro de un ciclo, denominamos a esa región del algoritmo &lt;strong&gt;proceso&lt;/strong&gt;.&lt;br /&gt;En la cabecera generalmente realizamos las siguientes acciones: Inicializar, Emitir títulos y datos. En el pié generalmente realizamos las siguientes acciones: Cálculos, Emitir totales, promedios, máximos o mínimos, tomar alguna decisión. En el proceso generalmente realizamos las siguientes acciones: Cálculos, Emitir líneas de detalle, tomar alguna decisión.&lt;br /&gt;&lt;br /&gt;A continuación se presenta un modelo de algoritmo de Corte de Control en un formato general.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R-8BeBEk_DI/AAAAAAAAAJo/1Xr921lbLNU/s1600-h/CorteControl.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183363311322070066" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R-8BeBEk_DI/AAAAAAAAAJo/1Xr921lbLNU/s400/CorteControl.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R-8E1BEk_EI/AAAAAAAAAJw/9DK6uZsMWGY/s1600-h/LecEsp.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183367004993944642" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R-8E1BEk_EI/AAAAAAAAAJw/9DK6uZsMWGY/s400/LecEsp.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;IMPORTANTE:&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;br /&gt;Es necesario aplicar este módulo cuando un proceso requiera una lectura anticipada. Este método funciona siempre, es decir, aún para aquellos procesos en que no requiera lectura anticipada, pero en este último caso debemos ubicar el módulo en los dos puntos dentro del algoritmo como fuera indicado anteriormente.&lt;br /&gt;&lt;a name="apareo"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Apareo de Archivos:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;El apareo de archivos es un proceso que dependiendo del tipo de organización que tengan estos archivos, el algoritmo adoptará una estructura particular. Este proceso es muy empleado para la &lt;strong&gt;actualización del maestro&lt;/strong&gt; a través del archivo de novedades. Las novedades tendrán que ver con &lt;strong&gt;altas, bajas o modificaciones&lt;/strong&gt; o algunas de ellas solamente. Si ambos archivos poseen una organización secuencial, entonces ambos archivos deben encontrarse ordenados –ascendente o descendente- por medio del valor de una clave en común. El resultado de este proceso será un nuevo archivo de salida con la misma estructura que el maestro a actualizar, siendo este archivo el maestro actualizado. El archivo de novedades tiene la misma estructura que el maestro pero con un campo más, el cual indica el &lt;em&gt;código de movimiento&lt;/em&gt;. Cada archivo trabajará con sus propios registros, es decir, un registro para el archivo maestro viejo, otro para el archivo de maestro nuevo y un registro para el archivo de novedades. Las situaciones de errores por alta existente o bajas o modificaciones inexistentes, se emitirán por medio del dispositivo de la impresora.&lt;br /&gt;Este proceso que genera un nuevo archivo –el maestro actualizado- se denomina &lt;strong&gt;proceso Padre – Hijo.&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;El siguiente diagrama de sistema muestra el proceso Padre – Hijo.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R-8FWREk_FI/AAAAAAAAAJ4/PdnvDOU9Lsg/s1600-h/ApareoDiagrSis.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183367576224595026" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R-8FWREk_FI/AAAAAAAAAJ4/PdnvDOU9Lsg/s400/ApareoDiagrSis.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;A continuación se presentará un modelo de apareo de archivos, con un archivo maestro desactualizado y un archivo de novedades, ambos con organización secuencial, con valores de campos claves sin repetición en cada uno de los archivos y ordenados ambos por el valor de una misma clave.&lt;br /&gt;Al igual que con el Corte de Control, el proceso de &lt;strong&gt;apareo requiere una lectura anticipada y debe ser una lectura especial en el Lenguaje Pascal&lt;/strong&gt;, como fue indicado en el tema de Corte de Control.&lt;br /&gt;Un primer proceso se realizará mientras no haya finalizado ningún archivo y en un segundo proceso, se procesará el archivo que no haya finalizado, hasta agotarlo. Por lo tanto, habrá tres ciclos en secuencia.&lt;br /&gt;Dentro del primer ciclo o proceso se compararán los valores de las claves de ambos archivos, por ejemplo, ¿la clave del maestro es igual a la clave de novedades? o ¿la clave del maestro es mayor a la clave de novedades? y por descarte será que ¿la clave de maestro es menor a la clave de novedades?.&lt;br /&gt;En el primer caso &lt;strong&gt;si la clave del registro maestro es igual a la clave del registro de novedades&lt;/strong&gt; se deberá comparar el código de movimiento, pudiendo ser igual a ‘A’ por alta, o a ‘B’ por baja o a ‘M’ por modificación.&lt;br /&gt;Si el código de &lt;strong&gt;movimiento es igual a ‘A’&lt;/strong&gt; será un &lt;strong&gt;error, por alta existente&lt;/strong&gt;, es decir, el valor de esa clave se encuentra ya en el archivo maestro y el &lt;strong&gt;registro de maestro desactualizado deberá grabarse en el nuevo maestro&lt;/strong&gt; –para no perderlo-.&lt;br /&gt;Si el código de &lt;strong&gt;movimiento es igual a ‘B’&lt;/strong&gt; no es error y no debe grabarse en el nuevo maestro, -de esta manera lo estamos dando de baja al no aparecer en el nuevo maestro-, por lo tanto, no debemos realizar ninguna acción por este caso.&lt;br /&gt;Si el código de &lt;strong&gt;movimiento es igual a ‘M’&lt;/strong&gt; no es error y debemos &lt;strong&gt;mover los campos a modificar indicados por el archivo de novedades al registro del maestro y luego grabarlo en el nuevo maestro.&lt;br /&gt;&lt;/strong&gt;Por último debemos realizar la lectura especial por cada uno de los archivos, es decir, tanto del maestro desactualizado como de novedades.&lt;br /&gt;A continuación se detalla el proceso a realizar si la &lt;strong&gt;clave del registro maestro viejo es mayor a la clave del registro de novedades.&lt;br /&gt;&lt;/strong&gt;En este caso resulta que existe un registro de novedades sin su registro correspondiente en el maestro. Por lo tanto se debe determinar el código de movimiento.&lt;br /&gt;Si el código de &lt;strong&gt;movimiento es igual a ‘A’&lt;/strong&gt; es correcto ya que la clave no existe en el maestro viejo y debe realizarse el alta, para ello se debe &lt;strong&gt;asignar los campos informados por la novedad al registro del maestro nuevo y grabar un nuevo registro en maestro nuevo.&lt;/strong&gt; No asignarlo al registro del maestro viejo, ¿por qué?.&lt;br /&gt;Si el código de &lt;strong&gt;movimiento es igual a ‘B’&lt;/strong&gt; es &lt;strong&gt;error, por baja inexistente&lt;/strong&gt;.&lt;br /&gt;Si el código de &lt;strong&gt;movimiento es igual a ‘M’&lt;/strong&gt; es &lt;strong&gt;error, por modificación inexistente.&lt;br /&gt;&lt;/strong&gt;Por último debemos realizar la lectura especial solo de novedades, -se lee del archivo cuya clave resultó menor, de esta manera aseguramos alcanzar el valor de la otra clave-.&lt;br /&gt;A continuación por decantación se detalla el proceso a realizar si la clave del registro maestro viejo es menor a la clave del registro de novedades.&lt;br /&gt;En este caso resulta que existe un registro de maestro sin su registro correspondiente en el de novedades. Por lo tanto, aquí no se deberá analizar el código de movimiento, ya que no existe. El &lt;strong&gt;registro de maestro viejo se debe grabar en el archivo maestro nuevo&lt;/strong&gt; y se debe realizar la lectura especial solo de maestro viejo, por haber resultado su clave menor a la de novedades-.&lt;br /&gt;Este primer proceso finaliza cuando uno de los archivos finalice, podría darse el caso que finalicen ambos, si los valores de las claves del último registro de cada archivo son iguales.&lt;br /&gt;Debido a que no se garantiza que finalicen ambos archivos en el proceso anterior, habrá que procesar los registros restantes del archivo que no finalizó.&lt;br /&gt;Si es el caso del maestro viejo que no haya finalizado el proceso finalizará cuando se hayan procesados todos los registros restantes de éste archivo. El proceso consistirá en grabar todos los registros pendientes. Debido a que traemos un registro que hemos leído pero no hemos procesado, dentro del ciclo primero grabamos el registro y luego leemos con una lectura especial el próximo registro.&lt;br /&gt;Por otro lado, si es el caso del archivo de novedades el que no haya finalizado el proceso finalizará cuando se hayan procesados todos los registros restantes de éste otro archivo. El proceso consistirá en realizar las mismas acciones vistas en el caso cuando la clave de maestro viejo es mayor a la clave de novedades, solo serán correctos los registros de novedades cuyos códigos de movimientos indiquen ‘A’.&lt;br /&gt;&lt;br /&gt;A continuación se presenta un modelo de algoritmo de Apareo de archivos en un formato general.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-8GAhEk_GI/AAAAAAAAAKA/Bpa9dRgTrso/s1600-h/ApareoDiagrBloq.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183368302074068066" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-8GAhEk_GI/AAAAAAAAAKA/Bpa9dRgTrso/s400/ApareoDiagrBloq.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-8GahEk_HI/AAAAAAAAAKI/OOqKwKAsUP8/s1600-h/ApareoDiagrBloq2.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183368748750666866" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-8GahEk_HI/AAAAAAAAAKI/OOqKwKAsUP8/s400/ApareoDiagrBloq2.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;Éste modelo de apareo de archivos puede ser optimizado si se realizan algunos ligeros cambios. En principio vemos que las acciones &lt;strong&gt;alfa&lt;/strong&gt; y &lt;strong&gt;beta&lt;/strong&gt; se vuelven a reiterar cuando uno de los archivos haya finalizado.&lt;br /&gt;La pregunta es ¿no podrían estas acciones realizarse solamente y en forma completa dentro del primer ciclo?. La respuesta es sí, pero realizando las siguientes modificaciones.&lt;br /&gt;En principio se abandonará el ciclo si &lt;strong&gt;ambos&lt;/strong&gt; archivos finalizaron. El secreto radica en asignar el valor más alto al campo clave del archivo que finalizó, si los archivos están ordenados en forma ascendente, caso contrario se asignará el valor más bajo. Esta técnica se conoce como &lt;strong&gt;HIGH VALUE&lt;/strong&gt; o &lt;strong&gt;LOW VALUE&lt;/strong&gt; en el segundo caso.&lt;br /&gt;La lectura especial podría tener 2 parámetros, el archivo a leer y el registro a devolver.&lt;br /&gt;En caso que haya finalizado el archivo se deberá mover al campo clave el valor más alto, -o el más bajo-, es decir, un valor al cual ningún dato leído podrá alcanzar. Por ejemplo, si el campo clave indicara un código de vendedor de 3 dígitos, el valor más alto sería 1000, ya que ningún dato que se lea alcanzaría a ese valor especial; un segundo ejemplo, podría ser tratándose de fechas con mes y día en un mismo campo clave, el valor más alto sería 1232 &lt;strong&gt;¿por qué?.&lt;/strong&gt;&lt;br /&gt;Las condiciones del ciclo, deberán compararse, los valores de los campos claves con el valor más alto, y para abandonar el ciclo las condiciones podrían ser las siguientes:&lt;br /&gt;&lt;strong&gt;(rMv.cmpClv ¹ HIGH_VALUE) v (rN.cmpClv ¹ HIGH_VALUE)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;HIGH_VALUE&lt;/strong&gt; es una constante con nombre definida en la sección const, p.ej.:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;const&lt;/strong&gt;&lt;br /&gt;HIGH_VALUE = 1000;&lt;br /&gt;&lt;br /&gt;De esta manera los ciclos posteriores dejarían de existir, ya que no se lo requieren. Con estos ligeros cambios el algoritmo solo quedaría con un solo ciclo.&lt;br /&gt;La lectura especial podría presentar el siguiente aspecto:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-8HchEk_II/AAAAAAAAAKQ/XfgFnGL0rCk/s1600-h/LecEspHV.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183369882622033026" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-8HchEk_II/AAAAAAAAAKQ/XfgFnGL0rCk/s400/LecEspHV.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;a name="busbin"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Búsqueda Binaria o Dicotómica:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;La búsqueda binaria es un proceso en el cual los datos deben encontrarse ordenados por el valor de la clave a buscar, generalmente en orden ascendente, pero puede ocurrir que se encuentren ordenados en forma descendente. Nuestro modelo de estudio se considera ordenado en forma ascendente. El proceso consiste en tomar el valor que se encuentre en una posición media entre las posiciones de los extremos, así tratándose de elementos que se encuentran en un archivo, esos valores extremos serían &lt;strong&gt;cero&lt;/strong&gt; y &lt;strong&gt;filesize(f) – 1&lt;/strong&gt;. El punto medio se obtiene de aplicar la siguiente expresión: &lt;/div&gt;&lt;p align="center"&gt;med &lt;-- (pri + ult) div 2; &lt;/p&gt;&lt;div align="justify"&gt;&lt;strong&gt;en donde:&lt;/strong&gt; &lt;em&gt;pri&lt;/em&gt; es el extremo inferior y &lt;em&gt;ult&lt;/em&gt; es el extremo superior. Una vez obtenido el punto medio se accede a esa posición en el archivo y se lee el registro, luego se compara con el valor de la clave a buscar, pudiendo resultar alguna de las siguientes posibilidades: &lt;/div&gt;&lt;div align="justify"&gt;&lt;ol&gt;&lt;li&gt;Que el valor del registro leído sea igual al valor clave a buscar, en ese caso, el proceso de búsqueda finalizará saliendo del ciclo cambiando el estado a una variable boolean e informaremos el dato a retornar, por ejemplo, en qué posición se encontró, o un valor boolean, o el valor de un campo o todo el registro, según lo que convenga al proceso.&lt;/li&gt;&lt;li&gt;Que el valor del registro leído sea menor al valor clave a buscar, en ese caso deberá cambiarse el valor del extremo inferior, de la siguiente manera: &lt;em&gt;pri &lt;-- med + 1&lt;/em&gt;.&lt;/li&gt;&lt;li&gt;Caso contrario, es decir, el valor del registro leído es mayor al valor clave a buscar, en ese caso deberá cambiarse el valor del extremo superior, de la siguiente manera: &lt;em&gt;ult &lt;-- med – 1&lt;/em&gt;. &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p align="justify"&gt;Este método va eliminando, por cada vez que obtenemos un punto medio, una mitad del conjunto de datos que nos va quedando, y habiendo leído el registro de esta posición, su valor no es el de la clave a buscar. Por lo tanto, aquí tenemos del porque este método recibe el nombre de búsqueda binaria o dicotómica. &lt;p&gt;Si la clave no se encuentra, el proceso finalizará cuando el valor del extremo inferior sea mayor al valor del extremo superior, es decir, cuando &lt;em&gt;pri&lt;/em&gt; es mayor a &lt;em&gt;ult&lt;/em&gt;. &lt;p align="justify"&gt;La búsqueda binaria garantiza realizar pocos accesos al disco, si n es el tamaño del archivo, la cantidad de accesos recién se duplica con n&lt;sup&gt;2&lt;/sup&gt;. Por ejemplo, si n = 50000 la cantidad de accesos máximos será de 16. La expresión que determina esto está en función de log&lt;sub&gt;2&lt;/sub&gt;(n). Recordemos entonces que &lt;strong&gt;para poder aplicar este método, el conjunto de datos, deberá encontrarse ordenado por el valor de la clave a buscar&lt;/strong&gt;. A continuación se describe el algoritmo para un caso general de búsqueda binaria. El mismo será una función que recibe como parámetros el archivo y la clave y retorna la posición, si se encontró un valor ³ 0, caso contrario –1. &lt;/li&gt;&lt;/p&gt;&lt;/li&gt;&lt;ol&gt;&lt;/ol&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-8IMxEk_JI/AAAAAAAAAKY/iOaGLJWuxoE/s1600-h/BusBinArc.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183370711550721170" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-8IMxEk_JI/AAAAAAAAAKY/iOaGLJWuxoE/s400/BusBinArc.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;br /&gt;De acuerdo a las necesidades de un proceso, el módulo de búsqueda binaria podrá ser una función si lo que se retorne es un valor simple como una posición del archivo o un estado de verdadero o falso por si se encontró o no la clave, una cadena, un real o cualquier otro valor simple. Pero si lo que hay que devolver fuera una estructura de datos, el módulo a emplear sería un procedimiento.&lt;br /&gt;&lt;a name="bussec"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Búsqueda Lineal o Secuencial:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;La búsqueda secuencial o lineal en archivos &lt;strong&gt;no es aconsejable&lt;/strong&gt;, debido a que la cantidad de accesos a realizar para buscar el valor de una clave, en el peor de los casos será de n accesos, en el mejor de los casos será de 1 acceso y como promedio será de n/2 accesos, para un archivo con n registros.&lt;br /&gt;Para aplicar la búsqueda binaria hemos visto en el tema anterior que el archivo debe encontrarse ordenado por el valor de un campo clave. El costo que tendremos en un archivo desordenado sería entonces tener que ordenarlo.&lt;br /&gt;Podrían existir &lt;strong&gt;casos excepcionales&lt;/strong&gt; en el cual podamos aplicar la búsqueda secuencial a un archivo desordenado, por lo tanto daremos el algoritmo correspondiente, para esta situación.&lt;br /&gt;Buscar el valor de una clave en un archivo desordenado, primero debemos asegurar que el puntero al archivo esté ubicado al comienzo del mismo. Inicializamos el estado de una variable de tipo boolean en falso, y al nombre de la función le asignamos –1 para indicar que aún el valor de la clave no se ha encontrado. El proceso se realizará mientras no se haya encontrado un registro que contenga el valor de la clave a buscar y mientras no sea fin de archivo. Dentro del proceso leemos un registro, luego lo comparamos con el valor de la clave, si es igual lo hemos encontrado, modificamos el estado de una variable de tipo boolean a verdadero y asignamos al nombre de la función la posición del archivo – 1. A continuación presentamos el algoritmo de búsqueda lineal.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R-8IyREk_KI/AAAAAAAAAKg/yhi1fLe6kOk/s1600-h/BusLinArc.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183371355795815586" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R-8IyREk_KI/AAAAAAAAAKg/yhi1fLe6kOk/s400/BusLinArc.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Por último si un archivo se encuentra ordenado en concordancia con el valor de la clave a buscar, como se vio en párrafos anteriores, la búsqueda binaria es la técnica a emplear, pero, se podría emplear la búsqueda secuencial, el único impedimento es que serán necesarios más accesos al disco, ahora bien, si descartamos este hecho real, podríamos decir que el método de búsqueda secuencial visto anteriormente podría ser aplicado, pero sabiendo que el archivo ya se encuentra ordenado, existe una variante más óptima para estos casos. El proceso finalizaría ahora no solamente si se encuentra el valor de la clave a buscar, sino que también &lt;strong&gt;nos detendríamos si el valor leído en una instancia se hiciera mayor al valor de la clave&lt;/strong&gt;, ya que no tendría razón de seguir avanzando en la búsqueda, debido a que todos los valores posteriores también serían mayores. La única razón de mostrar este método consistiría en que posteriormente se verán estructuras de datos en la cual el único acceso posible sería el secuencial y con esta estructura ordenada la búsqueda finalizaría al encontrarse el valor a buscar o bien cuando hayamos alcanzado un valor mayor al buscado. El algoritmo correspondiente de una búsqueda secuencial optimizada en archivos se detalla a continuación, -en realidad jamás utilizaremos este método- ya que la búsqueda binaria sería el método a emplear. Este método se muestra al solo efecto de que más adelante se verán estructuras de datos dinámicas lineales y ordenadas por el valor de una clave, y en estos casos buscar un elemento en estas listas será únicamente secuencial, no existiendo la posibilidad de realizar búsqueda binaria, por lo tanto, será una búsqueda secuencial optimizada, en el sentido que cuando nos topemos con un valor que se hizo mayor al buscado, en ese punto detendremos la búsqueda.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-8JwxEk_LI/AAAAAAAAAKo/mYyXivuwu5o/s1600-h/BusLinOpt.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183372429537639602" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-8JwxEk_LI/AAAAAAAAAKo/mYyXivuwu5o/s400/BusLinOpt.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Recordar:&lt;/strong&gt; Para archivos ordenados el método de búsqueda será el &lt;strong&gt;dicotómico o binario&lt;/strong&gt;, en cambio si existe una relación 1:1, es decir el valor de la clave = dirección &lt;em&gt;–f. biyectiva-&lt;/em&gt; o transformando el valor de la clave en una dirección válida en el archivo sin que se produzcan colisiones, el &lt;strong&gt;direccionamiento directo&lt;/strong&gt; es el que debe emplearse. Si el archivo estuviera desordenado la creación de &lt;strong&gt;archivos auxiliares&lt;/strong&gt; para lograr accesos más rápidos a los datos del archivo es otra de las posibilidades como técnicas a emplear.&lt;br /&gt;El siguiente ejemplo ilustra una situación en la cual el archivo se encuentra desordenado. Suponiendo que este archivo fuera de vendedores conteniendo como campos el código del vendedor (3 dígitos), más otros campos de interés, y sabiendo que vamos a recurrir en forma reiterada a este archivo para buscar el valor de una clave por código de vendedor, los accesos secuenciales serían reiterados y por consecuencia la velocidad de ejecución de este proceso caería por debajo de lo óptimo o deseado. Aplicar el método de búsqueda binario no podríamos realizarlo debido a que el archivo no está ordenado y si bien existe la posibilidad de ordenarlo físicamente, aplicar ese método está fuera de las posibilidades conocidas hasta ahora, &lt;em&gt;es lo que se conoce como&lt;/em&gt; &lt;strong&gt;método por copia&lt;/strong&gt; &lt;em&gt;y se requieren un archivo del mismo tamaño que el original, -ahí va a quedar el archivo definitivo y ordenado-, más un espacio adicional para un archivo temporal de trabajo&lt;/em&gt;. Pero como dijimos anteriormente este método no vamos a emplear. Otro método podría ser indexar el archivo a través del uso de un archivo de índices, pero acá también con los conocimientos logrados hasta ahora no contamos con la información necesaria para lograr este cometido. Otra posibilidad sería en crear un archivo en el cual pueda contener todas las claves posibles. La técnica a emplear en este último caso será de la creación de un archivo cascarón que contenga todas y solo todas las posibles claves. Para el ejemplo previamente indicado este archivo constará de 1000 registros, cuyas direcciones irán de 0 a 999.&lt;br /&gt;Una vez creado el archivo cascarón que reserva los espacios suficientes, se procederá a leer secuencialmente el archivo de datos, por cada registro leído se accede con direccionamiento directo a la posición en el archivo auxiliar indicada por el valor de la clave, y grabamos la referencia o dirección del valor de esa clave en el archivo de datos, y así sucesivamente hasta finalizar el recorrido en el archivo de datos.&lt;br /&gt;valores claves. Por ejemplo si leemos del archivo vendedores el valor clave 349, con este valor nos ubicamos en el archivo auxiliar y grabamos 0, debido a que el primer registro leído se encuentra en esa posición, el segundo registro leído el valor clave es 231, con este valor nos ubicamos en el archivo auxiliar y grabamos 1, debido a que el segundo registro leído se encuentra en esa posición, y así sucesivamente hasta finalizar el archivo cuya posición a grabar será la posición de vendedores menos uno.&lt;br /&gt;A continuación se da un ejemplo de esta situación:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-8LAhEk_MI/AAAAAAAAAKw/27HZvry1-ik/s1600-h/ArcIndEj.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183373799632207042" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-8LAhEk_MI/AAAAAAAAAKw/27HZvry1-ik/s400/ArcIndEj.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;Notar en el auxiliar que la &lt;em&gt;dirección-clave&lt;/em&gt; 349, dice que se encuentra en la referencia 0 en vendedores, que la &lt;em&gt;dirección-clave&lt;/em&gt; 231, dice que se encuentra en la dirección 1 en vendedores y así sucesivamente. Luego en el proceso, al requerir un dato de un vendedor, accedemos con la clave conocida en el auxiliar, a la dirección que coincide con su clave y con el valor que obtenemos de leer ese registro accedemos directamente a vendedores. Por ejemplo si conocemos la clave del vendedor 185 accedemos a esa posición en el auxiliar, leemos el registro y con el valor 10 accedemos a esa posición en vendedores. ¡¡¡Esto es mucho más óptimo que acceder secuencialmente a un archivo desordenado!!! incluso más rápido que acceder en forma dicotómica o binaria. El costo de aplicar este método es que debemos de contar con un espacio adicional en disco para poder crear el archivo cascarón.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;ol&gt;&lt;/ol&gt;&lt;br /&gt;&lt;/sup&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="ABAJO"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Anterior:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/03/clase-8-archivos.html"&gt;Archivos I&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Siguiente:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/03/conjuntos.html"&gt;Conjuntos&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="#ARRIBA"&gt;Arriba&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100408444678612840-5411252292307354873?l=pascalgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pascalgo.blogspot.com/feeds/5411252292307354873/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5100408444678612840&amp;postID=5411252292307354873' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/5411252292307354873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/5411252292307354873'/><link rel='alternate' type='text/html' href='http://pascalgo.blogspot.com/2008/03/archivos-ii.html' title='Archivos II'/><author><name>Lic. Hugo Cuello</name><uri>http://www.blogger.com/profile/00801409318639239421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_ISF8DP9N9hg/R-8BeBEk_DI/AAAAAAAAAJo/1Xr921lbLNU/s72-c/CorteControl.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5100408444678612840.post-9073412467855205436</id><published>2008-03-29T11:57:00.000-07:00</published><updated>2008-04-12T18:32:34.224-07:00</updated><title type='text'>Archivos I</title><content type='html'>&lt;a name="ARRIBA"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="#ABAJO"&gt;Abajo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;CLASE 8:&lt;/strong&gt; &lt;em&gt;Archivos.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:180%;"&gt;Archivos&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;La necesidad de poder &lt;strong&gt;recuperar&lt;/strong&gt; los datos en momentos posteriores a su creación, ya sea, por haberse cortado el suministro de la corriente eléctrica o en distintas corridas del programa o en distintos programas, por un lado, y por otro ante la &lt;strong&gt;imposibilidad de poder contar con todos los datos simultáneamente en la memoria interna&lt;/strong&gt; debido a su limitación de espacio, son dos motivos que hacen de la necesidad de contar con este tipo de estructuras de datos.&lt;br /&gt;El archivo es la única estructura de datos externa, es decir, ubicadas en un dispositivo externo, al cuál se los denomina memoria auxiliar, o memoria secundaria o memoria externa.&lt;br /&gt;La desventaja principal de este tipo de estructura es el tiempo necesario para recuperar un dato, ya que estos tiempos se miden en milisegundos, esto es &lt;em&gt;10&lt;sup&gt;-3&lt;/sup&gt; segundos&lt;/em&gt; en comparación con el tiempo empleado para acceder a una posición en la memoria interna cuya unidad de medida es el nanosegundo, esto es &lt;em&gt;10&lt;sup&gt;-9&lt;/sup&gt; segundos&lt;/em&gt;; &lt;strong&gt;por lo tanto, al momento de requerir un dato desde un archivo, debemos tomar muy en cuenta esta última situación, tratando de minimizar estos tiempos.&lt;/strong&gt;&lt;br /&gt;Las componentes de un archivo se denominan registros, y en la mayoría de las situaciones, estas componentes serán de tipo registro. No obstante, en ciertas situaciones podrán ser de un tipo simple de datos como &lt;em&gt;integer, word, char, boolean, longint o punteros&lt;/em&gt;, como así también de otro tipo estructurado de datos que se verán más adelante.&lt;br /&gt;Un archivo es por lo tanto, una colección de registros que responden a una misma naturaleza, p.e. &lt;span style="font-family:verdana;"&gt;Artículos, Clientes, Proveedores, Empleados, Cuentas Contables, etc..&lt;/span&gt;&lt;br /&gt;&lt;a name="clasiffunc"&gt;&lt;/a&gt;&lt;br /&gt;A continuación se presenta una clasificación de archivos de acuerdo a su función de uso:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Datos:&lt;/strong&gt; &lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;/span&gt;&lt;p align="justify"&gt;&lt;strong&gt;Maestros:&lt;/strong&gt; Son archivos &lt;strong&gt;permanentes&lt;/strong&gt; en el tiempo, es decir, no se eliminan luego de un proceso. Contienen todos los datos necesarios para el desarrollo de las actividades de una organización. Representan al &lt;strong&gt;mundo real&lt;/strong&gt;. Con el transcurrir del tiempo deben ser actualizados. Dependiendo del momento en que se actualizó, da un grado de confiabilidad. Ejemplo de archivos maestros pueden ser, los Clientes, Proveedores, Empleado, Artículos, Cuentas Contables, etc. &lt;p align="justify"&gt;&lt;strong&gt;Novedades o Transacciones:&lt;/strong&gt; Son archivos transitorios, es decir, luego de ser procesados, no tiene sentido mantenerlos, por lo tanto son eliminados. Su cometido es generalmente la actualización de los archivos maestros. La eliminación se podrá realizar inmediatamente o bien luego de un período de tiempo, por ejemplo, después de una segunda actualización al maestro. No siempre existen estos archivos, esto depende del tipo de proceso que se lleve a cabo. Por ejemplo si el proceso es interactivo en tiempo real, esto es, en el momento en que se conoce la novedad se actualiza en el maestro, no existirá un archivo de novedades. También se podrán generar registros por cada novedad que se presente en un proceso en tiempo real &lt;em&gt;interactivo&lt;/em&gt; para control. En cambio, si el proceso es en &lt;em&gt;batch&lt;/em&gt; o por lotes, primero se capturan las novedades durante el transcurso de un tiempo, -un día, una semana, un mes- se los ordena bajo un cierto criterio.&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Históricos:&lt;/strong&gt; Son archivos cuyo uso generalmente son para fines estadísticos, por ejemplo, las ventas realizadas por mes de un año, el seguimiento de ciertos artículos más solicitados, procesos de períodos anteriores, etc..&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Tablas:&lt;/strong&gt; Son archivos de poco volumen, ya sea en cantidad de registros o con respecto a su longitud del mismo. A efectos de ganar velocidad durante el proceso, estos tipos de archivos pueden ser volcados a la memoria interna –RAM- para acelerar el proceso, debido a que acceder a un registro en un archivo la unidad de medida es el &lt;em&gt;milisegundo&lt;/em&gt;, esto es, 10&lt;sup&gt;-3&lt;/sup&gt; seg., en cambio acceder a una ubicación en la memoria interna, la unidad de medida es el &lt;em&gt;nanosegundo&lt;/em&gt;, es decir, 10&lt;sup&gt;-9&lt;/sup&gt; seg., razón por la cual se ve la enorme diferencia existente entre acceder a una u otra fuente. El volcado del archivo se realiza en una pasada secuencial, luego al requerir acceder a un dato se accede en la propia memoria interna. Según los procesos tal vez no sea necesario bajar todos los registros como así también bajar todos los campos del mismo. Por ejemplo un archivo que contenga los códigos de las provincias y un porcentaje que fijan las mismas por las ventas realizadas a esas provincias, un proceso que requiera esos datos, podrían ser volcados a la memoria principal, recorriendo secuencialmente de inicio a fin sobre este archivo, luego cada vez que se requiera averiguar el porcentaje de una provincia se accede a la posición de memoria interna. Más adelante se verá la manera de lograr este cometido con una estructura de datos estática que se estudiará posteriormente. &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Índices:&lt;/strong&gt; Son archivos que contienen 2 ó 3 campos generalmente, un campo denominado clave y un campo denominado referencia o dirección el tercer campo si existe es denominado estado. Estos archivos se encuentran ordenados por el campo clave. Su objetivo es indexar al archivo maestro u otros archivos de datos. Esto permite una búsqueda más eficiente y establece un orden lógico de esos datos. Podrán existir varios archivos de índices para un mismo archivo de datos y c/u. de ellos estará ordenado por el campo clave que corresponda. Para mayor información ver organización indexada. &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Auxiliares:&lt;/strong&gt; Son archivos que crea y elimina el programador y que son necesarios para mejorar la eficiencia de un proceso. Por ejemplo, un archivo de vendedores desordenado y un proceso que requiera acceder a los registros en forma reiterada o en distinto orden al que se grabaron los mismos. Está claro que al buscar un vendedor debemos recorrer el archivo secuencialmente y esto por cada vendedor que requiera el proceso, nada eficiente será el proceso, por lo cual debemos recurrir a alguna técnica que permita optimizar el proceso. Una de las técnicas que podrían emplearse es crear un archivo auxiliar de tal manera que ordene esos registros de alguna manera y permita un mayor acceso a los mismos. Por ejemplo si los vendedores están identificados con un Código de Vendedor de 1 a 999, se crean anticipadamente esos registros, luego al ir leyendo cada vendedor en el archivo original se lo ubica en la posición física en el archivo auxiliar en la posición indicada por el Código del vendedor leído. Posteriormente se realiza el proceso principal pero esta vez, al buscar un vendedor se accede en el auxiliar en la posición indicada por el código del vendedor, al leer el registro su valor indica la posición en el archivo original del vendedor para acceder a esa ubicación y leer los datos del mismo. &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Informes o Reportes:&lt;/strong&gt; Son archivos cuyo destino original era la impresora, pero debido a que ésta ya estaba ocupada por otro proceso, el sistema operativo lo redireccionó hacia otro dispositivo, es decir, un archivo en disco para que posteriormente cuando la impresora sea liberada y la prioridad le sea asignada ese archivo sea volcado a la impresora, una vez que la tarea se llevó a cabo, el mismo sistema operativo elimina ese archivo. La parte del sistema operativo que realiza este cometido es el &lt;strong&gt;S.P.O.O.L.&lt;/strong&gt; (Simultaneous Peripherical Operation On Line), es decir, Operaciones Periféricas simultáneas En Linea, el cual redirecciona las salidas de los procesos a archivos en disco debido a que el destino original, la impresora, estaba ocupada y por ser un recurso no compartido debió ser enviado a otro destino, armando una cola de espera. &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Seguridad:&lt;/strong&gt; Son archivos que se realizaron copias de otros archivos y en caso de pérdida de uno de ellos poder recuperarlos con el otro. Esto se conoce como &lt;em&gt;back-up&lt;/em&gt;. &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Programas:&lt;/strong&gt; &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Fuentes:&lt;/strong&gt; Son los archivos escritos en un lenguaje de computadora y de tipo texto. La extensión de estos archivos se corresponde con el lenguaje utilizado, por ejemplo, &lt;em&gt;.Pas, .C, .Cob, .Bas, .Prg&lt;/em&gt;, etc. Estos archivos son creados utilizando un editor de texto, por ejemplo el Word pero tipo texto, el bloc de notas, no son los más apropiados, otra forma es utilizar el propio editor de texto incorporado en el paquete de software del lenguaje. Así por ejemplo el &lt;strong&gt;Turbo Pascal de Borland&lt;/strong&gt; viene un entorno de trabajo denominado &lt;strong&gt;I.D.E.&lt;/strong&gt; –Medio ambiente de Desarrollo Integrado- en el cual no solo podremos editar nuestro código fuente, sino además compilar, ejecutar, depurar, entre otros aspectos. Además nos facilita la escritura ya que las palabras reservadas se escriben resaltadas al resto de las otras palabras. &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Objetos:&lt;/strong&gt; Son archivos resultado del proceso de compilar el código fuente. El compilador es una aplicación, es decir, un programa ejecutable que toma como parámetro el código fuente y produce como salida un archivo o programa objeto, cuya extensión es &lt;em&gt;.OBJ&lt;/em&gt;, el cual aún no puede ser ejecutado debido a que le faltan las librerías a que hace referencia. Cada lenguaje posee su propio compilador. &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Ejecutables:&lt;/strong&gt; Son archivos resultado del enlace con las librerías para que sean incorporadas al código máquina y pueda correr en forma autosuficiente. El link es una aplicación que toma como parámetro el código objeto y el resultado final es un archivo ejecutable &lt;em&gt;.EXE&lt;/em&gt;. &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Otros:&lt;/strong&gt; &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Documentos:&lt;/strong&gt; Son archivos creados con un procesador de palabra, por ejemplo el Word. &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Imágenes gráficas:&lt;/strong&gt; Presentan diferentes formatos .GIF, .JPG, .BMP, etc. Son creados por software graficadores como el Paint, Corel, Harvard, PhotoShop, etc. &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Audio:&lt;/strong&gt; Archivos de sonido o música con extensiones como ser .MP3, .WAV, .MID, etc. &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Miscelánea:&lt;/strong&gt; Librerías dinámicas .DLL, Sistema .SYS, Dispositivos .DRV, etc..&lt;br /&gt;&lt;a name="clasifleng"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Clasificación de lenguajes:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Los lenguajes de computadoras pueden ser clasificados en cuanto al mayor acercamiento hacia la máquina o hacia el usuario en:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Bajo nivel:&lt;/strong&gt; Son lenguajes que se acercan más a la máquina que al usuario. Cada instrucción se traduce en una única instrucción de máquina, se dice entonces que la relación es 1 a 1; el lenguaje de bajo nivel es el assembler y la aplicación que lo convierte a código máquina se denomina ensamblador. La característica más emblemática es que los programas ejecutables son los más veloces. La desventaja es que es más compleja su programación. La extensión de los archivos de código fuente presentan la extensión .ASM. Por ejemplo sumar un valor a una variable, se escribiría: &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Medio nivel:&lt;/strong&gt; Son lenguajes que se encuentran en un punto intermedio entre los de bajo y alto nivel. Lenguaje como C o Forth entran dentro de esta categoría. La forma en como se escribe el código en algunos casos puede llevarlo a un nivel más bajo o más alto, por ejemplo acumular un valor en una variable podría escribirse en lenguaje C de varias maneras diferentes, pero una de ellas generará un código de máquina más eficiente que las otras. El siguiente ejemplo muestra esto último: sum = sum + 1; sum+= 1 o ++sum o sum++; en los dos últimos casos generará un código más eficiente. &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Alto nivel:&lt;/strong&gt; Los lenguajes de alto nivel se acercan más al usuario que a la máquina y los programas escritos en código fuente se asemejan al lenguaje natural. Estos programas corren más lentos que los de bajo nivel. Una sentencia suele ser convertida a varias instrucciones en código máquina. Lenguajes como Pascal, C, Cobol, Basic, Fortran, Modula, Ada, Prolog entre otros son de alto nivel. Por ejemplo, acumular un valor en una variable sería:&lt;br /&gt;sum := sum + 1&lt;br /&gt;Pascal&lt;br /&gt;inc(sum)&lt;br /&gt;Pascal&lt;br /&gt;add 1 to sum&lt;br /&gt;Cobol&lt;br /&gt;sum = sum + 1&lt;br /&gt;C&lt;br /&gt;sum += 1&lt;br /&gt;C&lt;br /&gt;sum++&lt;br /&gt;C&lt;br /&gt;++sum&lt;br /&gt;C&lt;br /&gt;&lt;br /&gt;Otras clasificaciones de los lenguajes podrían realizarse en cuanto al objetivo en que fueron concebidos, así existen lenguajes de propósito general, como ser el BASIC, PASCAL; otros destinados a la gestión y administración contable como el COBOL, RPG aún otros con fines científicos como el FORTRAN y otros para el desarrollo de soft de base como el C.&lt;br /&gt;&lt;a name="traductores"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Traductores&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Los traductores pueden ser de dos tipos diferentes:&lt;br /&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;ul&gt;&lt;li&gt;Intérpretes &lt;/li&gt;&lt;li&gt;Compiladores &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;p align="justify"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;En el primer caso los lenguajes &lt;strong&gt;intérpretes&lt;/strong&gt;, la ejecución se realiza dentro de un entorno de trabajo del lenguaje, y se ejecuta desde alli, o por medio de una aplicación, es decir un módulo de tiempo de ejecución que toma como parámetro el código fuente, cada sentencia a ejecutar primero debe ser interpretada a su equivalente en código máquina, generalmente una sentencia se divide en varias instrucciones de máquina, luego se ejecuta, esto se repite por cada sentencia que deba ser ejecutada, aún en los casos en que una misma sentencia se ejecute más de una vez deben de realizarse esos pasos; no se genera ningún código objeto en disco. Este tipo de lenguajes es oportuno cuando se está desarrollando la aplicación, en la cual tendremos que ejecutar el programa varias veces para refinarlo en detalles, hasta que quede el definitivo, entonces debido a que no hay tiempo de espera para la compilación total del programa; se hace conveniente en esos momentos; pero no cuando el programa haya quedado terminado de corregir detalles. &lt;strong&gt;El tiempo de ejecución es mayor en un programa interpretado que si fuera compilado&lt;/strong&gt;. La ventaja es que entre cada ejecución del programa en la etapa de depuración no debemos esperar por el proceso de compilación, en la que muchas veces se demora bastante tiempo.&lt;br /&gt;Por otro lado un lenguaje &lt;strong&gt;compilado&lt;/strong&gt; primero se compila todo el código fuente, creándose un código máquina y guardado en un archivo con extensión .OBJ, luego en un segundo proceso se le incorporan las librerías produciendo un código ejecutable y guardado en un archivo con extensión .EXE. En este momento podremos correr o ejecutar la aplicación o programa. El tiempo insumido será mucho menor a un programa interpretado, debido a que el código fuente fue traducido a código máquina con anterioridad y solamente el proceso se centra en ejecutarlo.&lt;br /&gt;Existen lenguajes que son solamente interpretados y otros que son solamente compilados, pero también existen lenguajes que pueden correr con un intérprete y que además puedan ser compilados, una vez que se hayan depurados ciertos errores. Por ejemplo un programa realizado en lenguaje Basic -ciertas versiones- puede ser solo interpretado o si el programador lo desea compilado. Otros como la mayoría de los lenguajes sólo compilado, por ejemplo, COBOL, C, PASCAL, ALGOL, CLIPPER, etc.&lt;br /&gt;&lt;a name="etapas"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Etapas de procesos de los archivos en el tiempo&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;A continuación se presenta otra clasificación de archivos de acuerdo a distintos procesos que podemos realizar:&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;strong&gt;Creación &lt;/strong&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;strong&gt;Actualización: &lt;/strong&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Altas &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Bajas &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Modificaciones &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;strong&gt;Recuperación&lt;/strong&gt;: &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Consultas &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Informes &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;strong&gt;Mantenimiento:&lt;/strong&gt; &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Estructuración &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Organización &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="justify"&gt;&lt;br /&gt;&lt;a name="apertura"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Modo de apertura de archivos&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Entrada&lt;/strong&gt; –Input-&lt;br /&gt;Un archivo abierto como solo de entrada indica que solo se podrá &lt;strong&gt;leer&lt;/strong&gt;, hacer un intento de escritura ocasionará en un error. En el diagrama de flujo el símbolo es el bloque del trapecio invertido, base menor hacia abajo. &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Salida&lt;/strong&gt; –Output-&lt;br /&gt;Un archivo abierto como solo de salida indica que solo se podrá &lt;strong&gt;grabar&lt;/strong&gt;, hacer un intento de lectura ocasionará en un error. En el diagrama de flujo el símbolo es el bloque del trapecio, base mayor hacia abajo. &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Entrada / Salida&lt;/strong&gt; -Input/Output-&lt;br /&gt;Un archivo abierto en el modo de lectura-escritura indica que se podrán realizar ambas operaciones, es decir, leer y/o grabar indistintamente.&lt;br /&gt;&lt;a name="acceso"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Modo de acceso a los registros&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Secuencial:&lt;/strong&gt; Se recorren los registros uno a continuación del otro, es decir, en forma adyacente o contigua. Para alcanzar el registro que ocupa la ubicación &lt;em&gt;n&lt;/em&gt; debemos recorrer todos los registros que lo preceden. El tiempo empleado para accesar un registro n depende del lugar en que se encuentre ubicado el puntero al archivo. &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Al azar:&lt;/strong&gt; El tiempo empleado para accesar un registro &lt;strong&gt;no&lt;/strong&gt; depende del lugar en que se encuentre ubicado el puntero al archivo, debido a que se accede al registro n directamente, vale decir que, el tiempo empleado para acceder a cualquier posición es el mismo desde el lugar en que se encuentre el puntero al archivo.&lt;br /&gt;&lt;br /&gt;Por ejemplo, el control remoto de una TV vía satélite o por cable permite 2 tipos de accesos, uno secuencial, y otro al azar; en el primer caso, si se oprimen las teclas CH+ o CH- permite un acceso secuencial a los canales; por otro lado, si tipeamos un número, -con las teclas numéricas-, cambiamos directamente a ese canal. ¡Imaginarse, por ejemplo, el tiempo empleado de acceder del canal 182 al canal 534 en forma secuencial!.&lt;br /&gt;&lt;a name="organizaciones"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Organizaciones de archivos&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Secuencial:&lt;/strong&gt; La organización secuencial es aquella en la cual los registros solo pueden ser accedidos en forma secuencial. Además la apertura del archivo solo se realiza exclusivamente para entrada o exclusivamente para salida, en el primer caso solo se lo puede leer y en el segundo caso solo se lo puede grabar. Tanto la lectura o grabación se lleva a cabo hacia delante y no se permite retroceder a una posición previa. Los medios de almacenamiento por naturaleza son las cintas magnéticas pero también pueden ser los discos. En esta organización los registros suelen ser sometidos a un ordenamiento establecido. Además los registros podrán estar agrupados, contenidos en un bloque, esta técnica se conoce como &lt;em&gt;factor de bloqueo&lt;/em&gt; en donde se determina un valor n, siendo este valor n la cantidad de registros contenidos en un bloque, esta técnica es utilizada en archivos con acceso secuencial para lograr un menor tiempo de procesamiento cada vez que se acceda al dispositivo externo. Un bloque representa un &lt;em&gt;registro físico&lt;/em&gt;, mientras que los n registros contenidos en él representan &lt;em&gt;n&lt;/em&gt; &lt;em&gt;registros lógicos&lt;/em&gt;. Este tipo de organización es oportuna cuando los registros deban ser leídos en el mismo orden en que fueron grabados y deban ser procesados la mayoría de ellos. &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Indexada:&lt;/strong&gt; La organización indexada presenta básicamente 2 archivos, uno de &lt;strong&gt;datos&lt;/strong&gt; similar a la organización secuencial, es decir, los registros que se incorporan son agregados al final del archivo y normalmente no estarán ordenados físicamente. El otro archivo es el de &lt;strong&gt;índice&lt;/strong&gt; y puede contener 2 ó 3 campos, a saber, un campo que contendrá la clave y que debe formar parte en el archivo de datos, pudiendo ser de cualquier tipo pero el tipo preferido es el de cadenas, debido a que en muchas oportunidades se suelen combinar los valores de dos o más campos por medio de la operación de concatenación. El segundo campo representa la &lt;em&gt;referencia o dirección&lt;/em&gt;, y que indica en donde se encuentra el valor de esa clave en el archivo de datos. Por último en caso de existir el tercer campo establece un &lt;em&gt;estado&lt;/em&gt; para informar si ese registro debe ser tenido en cuenta en los procesos ya que podría habérsele dado de baja, con un valor podría indicar que estará activo o caso contrario estará inactivo, on u off, verdadero o falso, 0 ó 1. En caso en que el registro no debe tomarse en cuenta es debido a que se ha realizado una baja lógica, es decir, el registro sigue ocupando un lugar físico en el medio externo. Las bajas físicas en estos casos se realiza cuando se vayan acumulando varias bajas lógicas, ya que este proceso requiere de un mayor tiempo de proceso.&lt;br /&gt;&lt;br /&gt;A continuación se presentará un ejemplo con valores en el archivo de datos para construir el archivo de índices. El siguiente archivo de datos puede representar datos de Alumnos y a efectos de resumir, solo se mostrará por cada registro el campo NroLeg. &lt;/p&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;strong&gt;Archivo de datos:&lt;/strong&gt; Alumnos.Dat&lt;br /&gt;&lt;strong&gt;valores del campo Nro.Leg. x c/registro.&lt;/strong&gt;&lt;br /&gt;43 27 38 75 12 89 62 31 56 19 94 83 42 5 98&lt;br /&gt;0 1 2 3 4 5 6 7 8 9 10 11 12 13 14&lt;br /&gt;&lt;strong&gt;direcciones físicas de cada registro.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Archivo de índices:&lt;/strong&gt; Alumnos.Idx &lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;br /&gt;Para construir la tabla de índices se comenzará leyendo el primer valor del archivo, luego el siguiente y así sucesivamente, pero si vamos escribiendo en la tabla de más abajo notaremos que debemos insertar por cualquier lugar de la lista que vayamos armando y en el caso de escribirlo sobre papel es casi una tarea imposible; por esta razón vamos a implementar otro esquema gráfico que evitará la situación indicada anteriormente.&lt;br /&gt;En el primer caso tendremos el siguiente problema:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;strong&gt;&lt;span style="font-family:trebuchet ms;"&gt;CLV.......... REF&lt;/span&gt;&lt;/strong&gt; &lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;43, 27.......... 0, 1&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;43.............. 0&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Luego de haber copiado el valor 43 y su referencia 0, al leer el siguiente dato vemos que el valor clave 27 es menor al ingresado previamente, si queremos mantener un orden ascendente deberíamos escribir este valor en una línea previa, pero sin antes borrar el valor 43 y su referencia para luego escribirlos más abajo. Notamos luego que al continuar con los próximos valores esta tarea se vería más complicada, razón por la cual adoptaremos otro criterio gráfico.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;punto de entrada nodo raíz&lt;br /&gt;&lt;/strong&gt;Sí ClvNva menor a ValNodoVisitado&lt;br /&gt;avanzar por rama izquierda sino avanzar por rama derecha&lt;/span&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-6TgBEk-_I/AAAAAAAAAJI/hWx3Xm25hoU/s1600-h/ArbolIndice.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183242399402753010" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-6TgBEk-_I/AAAAAAAAAJI/hWx3Xm25hoU/s400/ArbolIndice.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Nodos hojas son los nodos terminales&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Un nuevo nodo se inserta siempre como nodo hoja o terminal.&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;El gráfico representa un árbol binario, el nodo raíz es el punto de entrada para incorporar un nuevo valor, por lo tanto por cada &lt;strong&gt;valor nuevo&lt;/strong&gt; que ingresa se compara si es &lt;strong&gt;menor&lt;/strong&gt; al &lt;strong&gt;valor del nodo actual&lt;/strong&gt;, si es así se dirige a la &lt;strong&gt;izquierda, caso contrario hacia la derecha&lt;/strong&gt;, en caso de no existir un nodo se crea uno nuevo, siempre como nodo hoja. Si seguimos este criterio, los valores irán ubicándose de la forma en que quedaron arriba. Esta forma depende de cómo se vayan conociendo los valores claves, ya que si esos mismos valores claves estuvieran acomodados de una manera diferente, diferente sería entonces la estructura que adoptaría el árbol.&lt;br /&gt;Ahora vamos a volcar estos valores a nuestra tabla original, para ello debemos saber como se procede a recorrer el árbol, la forma de hacerlo podría ser &lt;strong&gt;in-orden IRD&lt;/strong&gt;&lt;/span&gt;&lt;a title="" style="mso-footnote-id: ftn1" href="http://www.blogger.com/post-create.g?blogID=5100408444678612840#_ftn1" name="_ftnref1"&gt;&lt;span style="font-family:trebuchet ms;"&gt;[1]&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;, en &lt;strong&gt;pre-orden RID&lt;/strong&gt;&lt;sup&gt;1&lt;/sup&gt; o en &lt;strong&gt;post-orden IDR&lt;sup&gt;&lt;/strong&gt;1&lt;/sup&gt;. Vamos a recorrer in-orden. En un árbol binario tenemos un sub-árbol izquierdo y un sub-árbol derecho, así el nodo con valor 27 es el nodo raíz del sub-árbol izquierdo, y el nodo con valor 75 es el nodo raíz del sub-árbol derecho, esta división en sub-árboles se puede continuar con los restantes nodos.&lt;br /&gt;El recorrido se inicia por el nodo raíz, en este momento averiguamos si hay algún nodo hacia la izquierda, si es así descendemos un nivel, nuevamente hacemos lo mismo hasta llegar a un nivel en que no haya nodos a izquierda, entonces tomamos este valor en nodo raíz del sub-árbol y marcamos al nodo como visitado, en el ejemplo este valor es 5. Luego averiguamos si hay nodos a derecha, si es así descendemos un nivel y volvemos a aplicar el mismo criterio indicado anteriormente. En el ejemplo el siguiente valor a tomar es el 12 que se encuentra un nivel más arriba, debido a que no había nodos a derecha del nodo con valor 5. Luego el recorrido es hacia la derecha del nodo con valor 12, y así seguiremos avanzando y retrocediendo. Esta técnica es conocida como &lt;em&gt;back-tracking&lt;/em&gt;.&lt;br /&gt;A continuación se expondrá en el archivo de datos indicado anteriormente otro valor para cada registro, por ejemplo, el Apellido de cada alumno, para simplificar la escritura lo indicamos de la siguiente manera: &lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;br /&gt;valores del campo Nro.Leg. x c/registro&lt;br /&gt;MARTINEZ FERNÁNDEZ GONZALEZ PEREZ SUAREZ ALVAREZ LOPEZ&lt;br /&gt;0 1 2 3 4 5 6&lt;br /&gt;direcciones físicas de cada registro&lt;br /&gt;valores del campo Nro.Leg. x c/registro&lt;br /&gt;SOSA TORRES GARCÍA FERNÁNDEZ JUÁREZ VAZQUEZ BENITEZ RIOS&lt;br /&gt;7 8 9 10 11 12 13 14&lt;br /&gt;direcciones físicas de cada registro&lt;br /&gt;punto de entrada nodo raíz&lt;br /&gt;Sí ClvNva &lt;valornodovisitado&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-6USxEk_AI/AAAAAAAAAJQ/7odXhm9eDrw/s1600-h/ArbolIndice2.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183243271281114114" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-6USxEk_AI/AAAAAAAAAJQ/7odXhm9eDrw/s400/ArbolIndice2.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Nodos hojas son los nodos terminales.&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Un nuevo nodo se inserta siempre como nodo hoja o terminal. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Tabla: NroLeg&lt;/strong&gt; &lt;strong&gt;Tabla: ApeNom&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-6VaxEk_BI/AAAAAAAAAJY/ogXHcSmxBz8/s1600-h/TblIndice.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183244508231695378" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-6VaxEk_BI/AAAAAAAAAJY/ogXHcSmxBz8/s400/TblIndice.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Conocido el valor de una clave, ¿qué método de búsqueda aplicar?. Si el método de búsqueda fuera secuencial comenzaríamos desde el primer valor en la tabla si es el que buscamos detenemos la búsqueda e indicaremos que el valor se encontró, sino puede que sea mayor el valor a buscar en ese caso seguiremos buscando con los próximos valores de la tabla hasta posiblemente encontrarlo o bien detenernos cuando aparezca un valor mayor al que buscamos o bien termine la tabla, en estos casos se informará que el valor no se encontró en la tabla.&lt;br /&gt;Si el valor clave está entonces el siguiente paso será acceder con la referencia indicada en la tabla, al archivo de datos a esa misma posición, para obtener los datos requeridos.&lt;br /&gt;Ahora bien, ¿será este método el secuencial el más adecuado cuando la tabla de índices se encuentra ordenada por la clave a buscar?. La respuesta es &lt;strong&gt;NO&lt;/strong&gt;. Un mejor método es realizar una búsqueda &lt;strong&gt;binaria&lt;/strong&gt;, aquella que parte en forma sucesiva por la mitad entre los valores &lt;em&gt;mínimo&lt;/em&gt; y &lt;em&gt;máximo&lt;/em&gt; de las direcciones de los registros extremos, es decir, en donde posiblemente se pueda encontrar el valor de la clave. Encontrado el punto medio entre los extremos se compara el valor a buscar con el valor de la posición de este punto medio, si se encontró se abandona la búsqueda, informando que se encontró el valor, sino puede suceder que sea mayor o menor, en cualquiera de los casos se acorta la tabla por su mitad, es decir, cambia el valor extremo menor por el de medio + 1 o bien cambia el valor extremo mayor por el de medio – 1, esto se repite hasta encontrar el valor a buscar, si es éste el caso se accede al archivo de datos en la dirección indicada por el campo ref. de la clave encontrada en la tabla de índices, o bien si el valor extremo menor se hizo mayor al valor extremo mayor, se abandona la búsqueda e informa que el valor clave no se encontró en la tabla.&lt;br /&gt;En el árbol si buscamos el valor 31, debemos pasar por los siguientes nodos: 43, 27, 38 y 31.&lt;br /&gt;Un árbol &lt;strong&gt;unialargado&lt;/strong&gt; es aquel árbol en que crece solamente por una de sus ramas, izquierda o derecha para todo nodo.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ejercicios:&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;br /&gt;¿Cuál sería la estructura de un árbol si las claves vienen ordenadas en forma ascendente?.&lt;br /&gt;Idem anterior pero con las claves ordenadas en forma descendentes.&lt;br /&gt;&lt;br /&gt;Las claves en una organización indexada pueden ser primarias o secundarias. Si la clave es primaria identifica unívocamente a un registro y su valor no puede repetirse en la tabla. En cambio si la clave es secundaria, puede que se repita o no.&lt;br /&gt;Ejemplos de claves primarias y secundarias: &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Claves Primarias:&lt;/strong&gt; &lt;em&gt;NroLeg&lt;/em&gt; en el archivo maestro de Empleados, &lt;em&gt;CodArt&lt;/em&gt; en el archivo maestro de Artículos, etc. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Claves Secundarias:&lt;/strong&gt; &lt;em&gt;CodPos&lt;/em&gt; en al archivo maestro de Empleados o Clientes o Proveedores, notamos en este caso que diferentes empleados o clientes o proveedores pueden tener su domicilio bajo un mismo código postal, por lo tanto esta clave secundaria será con duplicación o repetición.&lt;br /&gt;Para un mismo archivo podrán presentarse varias claves candidatas a ser clave primaria, la elección queda más justificada cuanto más compacta sea la misma.&lt;br /&gt;Las claves también pueden ser &lt;strong&gt;simples&lt;/strong&gt; o &lt;strong&gt;compuestas&lt;/strong&gt;. Una clave simple es la que se forma con el valor de un solo campo; mientras que una clave compuesta se forma con la concatenación de dos o más valores de campos.&lt;br /&gt;Los valores de las claves deben formar parte en el archivo de datos. Si la clave es de tipo cadena es mejor, ya que en los casos de una clave compuesta tal vez se requiera concatenar dos valores de campos diferentes. Si uno de los campos no es de tipo cadena, no hay problema, ya que se lo podrá convertir a cadena.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Relativa:&lt;/strong&gt; La organización relativa se denomina así porque las posiciones que ocupan los registros dentro del archivo son direcciones &lt;strong&gt;relativas&lt;/strong&gt; y no &lt;strong&gt;absolutas&lt;/strong&gt;. Debido a que las posiciones de los registros del archivo se comienzan a contar desde el punto de inicio del archivo y no desde el punto de inicio del disco. La organización relativa está considerada como la organización de archivos con mayor velocidad de acceso a los registros generalmente, aunque no siempre será así, dependiendo de los distintos casos que se presenten, como se verá más adelante. Esta organización de archivo junto con la organización secuencial han sido las primeras organizaciones en los inicios de la informática, en este caso precisamente, porque se requería un acceso a los registros que no fuera necesariamente secuencial. En cambio la organización indexada surgió con posterioridad, hoy ampliamente utilizada esta última en las bases de datos. Para poder acceder a un registro n en una organización relativa debemos conocer el valor de una clave debiendo ser de tipo numérico, ya que las direcciones en el archivo son valores numéricas. No existe un archivo de índices como en la organización indexada, solo un archivo de datos. Este tipo de organización requiere la habilidad del programador para manejarlo adecuadamente. Esta habilidad estará emparentada con la experiencia lograda con los años de trabajo en diferentes proyectos que haya realizado en su vida profesional. No obstante, algunos detalles podrán mostrarse.&lt;br /&gt;&lt;br /&gt;Existen dos tipos de direccionamiento en una organización relativa, a saber:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Direccionamiento directo:&lt;/strong&gt; Es cuando se accede una sola vez al archivo a un registro direccionado, siendo ese el registro requerido. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Direccionamiento indirecto:&lt;/strong&gt; Es cuando se accede más de una vez al archivo para localizar o establecer el valor de la clave en una ubicación en el archivo, debido a que ocurrieron colisiones. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;A continuación se darán varios casos de estudio. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Caso 1:&lt;/strong&gt; En una entrevista con un cliente, nos informa llevar el proceso de un archivo de artículos, máximo 100 y la forma de identificar a cada artículo, se combino en numerarlos de 1 a 100. Notamos aquí una &lt;strong&gt;relación 1 a 1&lt;/strong&gt; entre el código del artículo y la dirección que le debe corresponder en el archivo. Así conocida la clave de un artículo, digamos 23 le corresponde la dirección 23 en el archivo. Notamos entonces que el acceso a dicho registro tanto para leer como para grabar lo logramos con un solo acceso. Cuando se presenta esta situación el &lt;strong&gt;direccionamiento&lt;/strong&gt; se denomina &lt;strong&gt;directo&lt;/strong&gt;. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Caso 2:&lt;/strong&gt; La situación con el cliente se presenta semejante al caso anterior pero los códigos de artículos deben ser entre 1001 y 1100. En este caso no podemos decir que conocida una clave con ese valor nos ubicamos en la dirección correspondiente en el archivo, ya que no existirán direcciones en el archivo con ninguno de esos valores claves. Pero no todo está perdido aún. Notamos enseguida que el intervalo de valores es igual a la cantidad de posibles artículos que podemos contar como máximo y que solo están desplazados 1000 posiciones, por lo tanto, si restamos ese valor a cualquier clave que conozcamos solucionamos el problema y obtendremos una dirección válida en el archivo, es decir, una dirección entre 1 y 100. Por ejemplo, si conocemos una clave cuyo valor fuera 1023, le restamos 1000, nos queda la dirección 23, siendo válida esta dirección para acceder en el archivo. Por lo tanto aplicando un cálculo a la clave hemos obtenido una dirección válida en el archivo. La relación 1 a 1 sigue existiendo para este caso, solo debemos realizar un cálculo para obtener una dirección válida en el archivo. El tipo de direccionamiento también es directo, ya que solo se requiere de un acceso para localizar un artículo. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Caso 3:&lt;/strong&gt; La situación con el cliente se presenta semejante a los casos anteriores salvo que los códigos de artículos deben estar comprendidos entre 3427 y 7965. En este caso vemos que al igual del caso 2 con el valor de una clave no podemos ubicarnos en una dirección válida en el archivo, pero además notamos que el intervalo de valores de las claves es mucho mayor a la cantidad de artículos máximos que podemos tener. Por lo tanto esto trae aparejado un nuevo problema, el de las &lt;strong&gt;colisiones &lt;/strong&gt;o &lt;strong&gt;sinónimos&lt;/strong&gt;. Esto se produce cuando dos o más valores claves distintas generan una misma dirección en el archivo. Ahora bien, ¿cómo lograr obtener a partir de un valor clave una dirección válida en el archivo?. La técnica empleada se conoce como función de &lt;em&gt;mapeo&lt;/em&gt;. Una función de mapeo ampliamente utilizada es la del &lt;strong&gt;método del resto&lt;/strong&gt;, que consiste en tomar el valor clave &lt;em&gt;k &lt;/em&gt;por un lado y el tamaño del archivo &lt;span style="font-family:verdana;"&gt;TA&lt;/span&gt; por otro, o bien por un número primo más cercano al tamaño del archivo; se realiza la división en donde k es el dividendo y TA o el número primo el divisor; el cociente entero es la dirección natural d&lt;sub&gt;n&lt;/sub&gt; para acceder al archivo de datos. Si las direcciones en el archivo comenzaran desde uno en adelante, en estos casos se le suma 1 al resto.&lt;br /&gt;Notamos que valores de claves distintas digamos &lt;em&gt;ki&lt;/em&gt;&lt;strong&gt; &lt;/strong&gt;distinto &lt;em&gt;kj&lt;/em&gt; pueden ocasionar una misma dirección natural dn, produciéndose entonces una colisión o sinónimo. Este problema es solucionable existiendo distintos métodos para resolverlo. Uno de ellos sería buscar en los registros adyacentes un lugar libre y una vez localizado ubicar los datos allí, en caso de estar dando un alta. Si llegamos al final del archivo, debemos siguir buscando desde el inicio del mismo. Si lo que deseamos en buscar el valor de una clave primero accedemos a su dirección natural si es el dato que hay allí lo encontramos y listo, sino seguiremos buscando con el método empleado para solucionar colisiones, por ejemplo buscar en los registros adyacentes, así seguiremos hasta encontrarlo o bien detenernos en un punto en donde se asegura que ese valor clave no se encuentra en el archivo. Una solución a esto último sería agregar un campo adicional al registro que indique un estado del registro con un valor de &lt;strong&gt;V &lt;/strong&gt;indicando que el registro está vacante, nunca fue utilizado por alguna clave, &lt;strong&gt;O&lt;/strong&gt; indicando que el registro está ocupado, &lt;strong&gt;S&lt;/strong&gt; indicando que el registro fue suprimido, es decir, se realizó una baja lógica. Al dar de alta si su dirección natural estuviera ocupada, la clave nueva se ubicará en el primer registro que esté como vacante o suprimido y se marca el estado con O de ocupado, siempre y cuando esa clave no estuviera en el archivo, sino sería alta existente. Al dar de baja una clave, si no es la de su dirección natural se seguirá buscando hasta que aparezca en el archivo, en ese caso se marca el estado con S de suprimido, siendo una baja lógica, o bien seguir buscando hasta que se encuentre un registro como vacante o se haya completado la vuelta, en estos casos sería una baja inexistente.&lt;br /&gt;En este último caso el direcionamiento se denomina &lt;strong&gt;indirecto&lt;/strong&gt;, debido a que encontrar una clave podrá necesitar realizar más de un acceso. &lt;/div&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Caso 4:&lt;/strong&gt; La situación con el cliente se presenta semejante a los casos anteriores salvo que los códigos de artículos son ahora alfanuméricos. En este caso vemos que al igual que en los casos 2 y 3 con el valor de una clave no podemos ubicarnos en una dirección válida en el archivo, pero además notamos que la clave no es numérica. ¿Qué podemos hacer en estos casos?. Pues bien debemos convertir la clave alfanumérica en numérica. Una forma de hacerlo sería tomar cada caracter de la clave y convertirla a su correspondiente código ASCII, al que luego le aplicamos una expresión algebraica, el resultado final será un número grande de tal manera que no será con seguridad una dirección válida en el archivo, pero no nos importa tanto esta situación, ya que el siguiente paso será aplicar una función de mapeo y que nos retorne una dirección válida en el archivo, como se mostrara en el caso 3.&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Para utilizar archivos con organización relativa se requiere amplia experiencia, debido a que es la organización de archivos más compleja de todas porque requiere una exigencia por parte del programador en el diseño del archivo, las funciones de mapeo y la resolución de las colisiones.&lt;br /&gt;&lt;a name="archivospascal"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Archivos en Pascal&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;El lenguaje Pascal clasifica a los archivos en:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;Texto &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Binarios con tipo &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Binarios sin tipo &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="justify"&gt;&lt;p&gt;&lt;br /&gt;&lt;a name="texto"&gt;&lt;/a&gt;&lt;br /&gt;Los &lt;strong&gt;archivos de texto&lt;/strong&gt; son exclusivamente de &lt;strong&gt;organización secuencial&lt;/strong&gt;, debido a esto la única forma de accesar los registros es en forma secuencial y pueden ser abiertos de solo lectura o solo escritura, en ambos casos siempre se avanza hacia delante, no existiendo posibilidad de poder retroceder a una componente anterior. La única manera es cerrar el archivo y volver a abrirlo nuevamente.&lt;br /&gt;Un archivo de tipo texto se lo define por medio del identificador text. Este es un archivo cuyas componentes esta estructurado en líneas, cada una de las cuales pueden tener diferentes longitudes. Cada línea está finalizada con una marca de fin de línea formado por la combinación del &lt;strong&gt;código ASCII 13&lt;/strong&gt; retorno de carro y el &lt;strong&gt;código ASCII 10&lt;/strong&gt; avance de línea y la función de Pascal &lt;em&gt;eoln(NL)&lt;/em&gt; retorna un estado de verdadero si se leyó dicha marca. El fin de archivo está establecido por otra marca el &lt;strong&gt;código ASCII 26&lt;/strong&gt; o &lt;strong&gt;CTRL-Z&lt;/strong&gt; y la función de Pascal &lt;em&gt;eof(NL)&lt;/em&gt; retorna un estado de verdadero si se leyó dicha marca.&lt;br /&gt;Los archivos de texto son más lentos que los archivos binarios ya que cada vez que se lea o grabe una componente los datos deberán ser convertidos de texto a binario o inversamente. Por ejemplo si tenemos un valor de tipo integer en la memoria interna al grabar en un archivo de texto se deberá convertir a caracteres 2 y 3; en cambio se se leyeran esos caracteres desde un archivo binario para volcarlo a la memoria interna deberá ser convertido al formato binario. Este proceso lo realiza automáticamente el proceso.&lt;br /&gt;Un archivo de texto se lo puede crear por medio de un programa Pascal o bien con un editor de texto.&lt;br /&gt;Si se tiene un archivo de texto se puede crear un archivo binario, simplemente leyendo del archivo de texto y grabar en el archivo binario.&lt;br /&gt;Las lecturas de los datos desde un archivo de texto se realiza sobre variables del tipo de dato a leer y en forma separada.&lt;br /&gt;La variable definida en la unidad Printer del Pascal lst es una variable de archivo de tipo text, es decir de tipo archivo de texto.&lt;br /&gt;&lt;a name="binarios"&gt;&lt;/a&gt;&lt;br /&gt;Los &lt;strong&gt;archivos binarios&lt;/strong&gt; están estructurados en componentes denominadas &lt;em&gt;registros&lt;/em&gt;. Si bien la forma más común es que las componentes de un archivo sean de tipo registro, hay otros casos, en que cuando cada componente sea un solo valor, hacerlas del mismo tipo de ese único valor, así por ejemplo, una componente podría ser de tipo integer, char, boolean, real, string, si cada componente fuera un solo valor en concordancia con algunos de los tipos indicados.&lt;br /&gt;Se los denominan archivos binarios ya que reflejan la imagen de lo que hay en la memoria interna, es decir, no sufren ningún proceso de convertibilidad. Por ejemplo el valor entero 23 está representado en el archivo de la misma manera como se lo representa en la RAM, a saber como una serie de ceros y unos, que en este caso sería así 00000000 00010111 con 16 dígitos binarios, luego si editamos el archivo en un editor de archivos lo veremos con los caracteres cuyos códigos ASCII concuerdan con el ascii 0 y el ascii 23, vale decir, “↨”, las comillas es para limitar lo que se grabó.&lt;br /&gt;Un archivo de tipo binario se lo define por medio de las palabras reservadas &lt;strong&gt;file of&lt;/strong&gt; seguido de un identificador de &lt;em&gt;tipo&lt;/em&gt;, es decir, &lt;strong&gt;file of&lt;/strong&gt; &lt;em&gt;tipo&lt;/em&gt;.&lt;br /&gt;Un archivo binario solamente puede ser creado por medio de un programa en Pascal.&lt;br /&gt;Si se tiene un archivo binario se lo puede crear como archivo de texto, simplemente leyendo desde el archivo binario y grabando en un archivo de texto.&lt;br /&gt;Los datos a leer en un archivo binario se realizan en forma completa por cada componente.&lt;br /&gt;&lt;br /&gt;A continuación se establece un tipo registro y un tipo archivo binario;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;br /&gt;RegFec = &lt;strong&gt;record&lt;/strong&gt;&lt;br /&gt;aa : longint;&lt;br /&gt;mm,&lt;br /&gt;dd : byte&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;Str20 = &lt;strong&gt;string&lt;/strong&gt;[20];&lt;br /&gt;RegAlu = &lt;strong&gt;record&lt;/strong&gt;&lt;br /&gt;NroLeg : longint;&lt;br /&gt;ApeNom,&lt;br /&gt;Domic,&lt;br /&gt;Local : str20;&lt;br /&gt;EstCiv : char;&lt;br /&gt;Trabaja : boolean;&lt;br /&gt;FecNac : RegFec;&lt;br /&gt;Cuota : real&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;ArcAlu = &lt;strong&gt;file of&lt;/strong&gt; RegAlu;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;Alumnos : ArcAlu;&lt;br /&gt;RAlumno : RegAlu;&lt;br /&gt;&lt;br /&gt;La variable Alumnos representa el nombre lógico &lt;em&gt;NL&lt;/em&gt; del archivo.&lt;br /&gt;&lt;a name="procfuncarc"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Procedimientos y Funciones para archivos&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;En todos los casos indicados más abajo, las siguientes simbologías indican:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;NL:&lt;/strong&gt; Nombre lógico de archivo, es una variable de tipo archivo text, file of o file.&lt;br /&gt;&lt;strong&gt;NF:&lt;/strong&gt; Nombre físico de archivo, es una expresión de tipo cadena que contiene unidad de disco, ruta y nombre del archivo con el formato 8.3, según reglas del D.O.S.. Si se omiten la unidad de disco y la ruta, se toma el valor por defecto, esto es, la unidad y el directorio actualmente activo.&lt;br /&gt;&lt;strong&gt;NR:&lt;/strong&gt; Nombre de registro, es una variable de tipo registro que se corresponde con el tipo de cada componente del archivo asociado. En los casos en que las componentes del archivo sean de algún tipo simple de datos, &lt;em&gt;NR&lt;/em&gt; podrá ser una variable del tipo de dato simple correspondiente con cada componente del archivo.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;assign(NL, NF):&lt;/strong&gt; Asigna o asocia el nombre físico con el nombre lógico, este último es el que se usará posteriormente cada vez que se refiera al archivo. El nombre físico podrá contener además del nombre y extensión, la unidad de disco y la ruta en donde se encuentra o destinará el archivo, si no se lo indica se tomará la unidad y directorio activo.&lt;br /&gt;La impresora es un archivo de texto, por lo tanto se le puede asignar al nombre lógico un nombre físico siendo ese nombre físico LPT1 o LPT2 o LPT3. &lt;/p&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;assign(Alumnos,’Alumnos.Dat’);&lt;br /&gt;assign(Impresora,’LPT1’); en donde; Impresora es una variable de tipo text.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;reset(NL):&lt;/strong&gt; Abre un archivo y ubica al puntero del archivo al comienzo del mismo. El archivo deberá existir, caso contrario generará un error en tiempo de ejecución y se detendrá la ejecución del programa, si no se ha atrapado dicho error por medio de la directiva al compilador {$I+}. Una vez abierto el archivo se podrá leer o grabar si el archivo es binario esto es, &lt;em&gt;file of&lt;/em&gt; o &lt;em&gt;file&lt;/em&gt;; y si la variable de sistema &lt;em&gt;filemode&lt;/em&gt; estuviera con el valor dos; sólo se podrá leer, si estuviera con el valor cero o sólo se podrá grabar si estuviera con el valor uno; en cambio, si el archivo es de tipo text solo se podrá leer. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;reset(Alumnos)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;rewrite(NL):&lt;/strong&gt; Abre un archivo nuevo y si existe lo destruye y lo crea vacío, en ambos casos ubica al puntero al archivo coincidiendo con &lt;em&gt;eof(NL)&lt;/em&gt;, es decir, con la marca de fin de archivo. El tamaño del archivo en este momento es cero. La variable de sistema &lt;em&gt;filemode&lt;/em&gt; no se tomará en cuenta, ya que el modo de apertura para rewrite es siempre lectura y grabación. Un archivo abierto con rewrite primero se deben grabar algunos registros, luego posicionarnos sobre un registro previamente grabado, para luego poder leerlo, esto indica entonces que no hace falta tener que cerrar el archivo y abrirlo con reset para poder leerlo en el mismo proceso, solo basta hacer lo indicado anteriormente. Para un archivo de texto rewrite lo crea solo para grabar. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;rewrite(Alumnos)&lt;br /&gt;&lt;br /&gt;En archivo de texto existe una tercer posibilidad para abrir un archivo para agregar más líneas al mismo. La sentencia que abre un archivo sin destruirlo y que permite agregar más componentes al final del archivo es &lt;em&gt;append(NL)&lt;/em&gt;.&lt;br /&gt;La impresora que es un archivo de salida se puede abrir con rewrite(NL), por ejemplo rewrite(Impresora);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Operaciones de lectura o grabación&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;read(NL, NR):&lt;/strong&gt; Realiza la operación de lectura. El registro a leer es en donde se encuentra el puntero al archivo; “&lt;strong&gt;luego de la lectura, el puntero avanza a la próxima componente&lt;/strong&gt;”. Al leer en un archivo binario se lee la componente completa, no hay posibilidad de leer una parte. La lectura de un registro en un archivo binario se realiza en forma directa desde el dispositivo de almacenamiento. Es decir, cada intento de leer se debe acceder al disco. En cambio en un archivo de texto se lee desde un buffer en la memoria interna, si hay algo para leer, sino, se accede al disco.&lt;br /&gt;Intentar leer en una ubicación fuera del límite del archivo ocasionará en un error de lectura, indicado por el compilador pascal con el número 100. Estamos fuera de los límites del archivo cuando el puntero está más allá del tamaño del archivo, o bien cuando el puntero al archivo haya quedado posicionado antes de la dirección cero, hacer un intento de lectura en estos casos provocará el error anteriormente indicado.&lt;br /&gt;En un archivo de texto readln luego de leer realiza un salto a la próxima línea. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;read(Alumnos, rAlumno); rAlumno es la variable de tipo compatible con cada componente del tipo de archivo binario, no se podrá leer solamente una parte de dicha componente, es decir hacer read(Alumnos, rAlumnos.NroLeg) &lt;strong&gt;está mal&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;write(NL, NR):&lt;/strong&gt; Realiza la operación de grabación. El registro a grabar es en donde se encuentra el puntero al archivo en ese momento; “&lt;strong&gt;luego de la grabación, el puntero avanza a la próxima componente&lt;/strong&gt;”. Al grabar en un archivo binario se graba la componente completa, no hay posibilidad de grabar una parte. La grabación en un archivo binario se realiza en forma directa hacia el dispositivo de almacenamiento. Es decir, por cada intento de grabar se debe acceder al disco. En cambio en un archivo de texto se graba hacia un buffer en la memoria interna, si se &lt;strong&gt;llena&lt;/strong&gt; entonces es enviado al dispositivo externo, o sea, al disco. Si el puntero al archivo se encuentra sobre un registro existente, se actualizará con la información en el momento de realizar la grabación; en cambio si el puntero se encuentra coincidiendo con el fin de archivo, se genera un nuevo registro y el tamaño del archivo se expande una componente más. Ahora bien, ¿qué sucederá si se ubica el puntero al archivo mucho más allá de la marca de fin de archivo, digamos 5 posiciones más y se intenta grabar?. Se generan todos esos registros, solamente el registro que se graba tendrá valores conocidos, pero los registros intermedios contendrán basura, ya que no sabemos qué valores habrá allí, también en estos casos se expande el tamaño del archivo. Por lo tanto ubicar el puntero más allá del tamaño del archivo y grabar luego no generará ningún error en tiempo de ejecución. Pero, ¿qué sucederá si ubicamos el puntero al archivo antes de la primer componente, es decir, antes de la ubicación cero?, intentar grabar producirá un error en tiempo de ejecución.&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;write(Alumnos, rAlumnos); rAlumno es la variable de tipo compatible con cada componente del tipo de archivo binario, no se podrá grabar solamente una parte de dicha componente, es decir hacer write(Alumnos, rAlumnos.NroLeg) &lt;strong&gt;está mal&lt;/strong&gt;.&lt;br /&gt;En un archivo de texto writeln luego de grabar salta al comienzo de la próxima línea.&lt;br /&gt;La impresora es un archivo de texto al cual podremos enviar informacón, el formato es write(NL, exp) o writeln(NL, exp). En el primer caso imprime el resultado de la expresión y permanece en la misma línea, en cambio en el segundo caso luego de imprimir avanza a la próxima línea. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Ejemplos:&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;write(Impresora, a,cad,’Mensaje: ‘,titulo,3.24:8:2);&lt;br /&gt;write(lst,’Como estás ‘,Nom); en donde lst es una variable de tipo text definida en la unidad Printer, al cual debemos indicar en nuestro programa en la sección uses.&lt;br /&gt;writeln(Impresora,’El total es: ‘,totVen:8:2);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Resumiendo:&lt;/strong&gt; hacer &lt;strong&gt;read&lt;/strong&gt; o &lt;strong&gt;write&lt;/strong&gt; cuando el puntero está en una posición menor a cero está mal y generará un error en tiempo de ejecución; por otro lado si el puntero al archivo se encuentra más allá del tamaño del archivo, hacer read está mal, pero hacer write no es error.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;close(NL):&lt;/strong&gt; Cierra el archivo indicado en su argumento. Esta operación deberá realizarse cuando ya no debamos operar más con el archivo. Con los archivos de texto esta acción es muy importante ya que si no cerráramos el archivo perderíamos parte de la información debido a que si el buffer no se llenó, lo que quedó allí no sería enviado al disco. En cambio si cerramos el archivo, close antes de cerrarlo verificaría si hay algo pendiente de enviar desde el buffer, si es así se forzaría primero a enviar lo que hay allí al disco y luego se cerrará el archivo. En un archivo binario al no trabajar con el buffer esta situación no existe, no obstante, es aconsejable cerrar igualmente el archivo.&lt;br /&gt;La impresora como archivo de texto debe ser cerrada, pero no si usamos la variable lst de la unidad printer, ya que la unidad se encarga de cerrarla. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;close(Alumnos);&lt;br /&gt;close(Impresora); &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;eof(NL):&lt;/strong&gt; Es una función que retorna un valor de verdadero si el puntero está en fin de archivo, lo mismo si se encuentra en una posición menor a cero; caso contrario retorna falso. Esta función es común emplearla cuando leemos secuencialmente en un archivo, como condición en la cabecera de un ciclo indefinido, negando el valor retornado.&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;while&lt;/strong&gt; &lt;strong&gt;not&lt;/strong&gt; eof(Alumnos) &lt;strong&gt;do begin&lt;/strong&gt;&lt;br /&gt;read(Alumnos, rAlumno);&lt;br /&gt;...&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;filesize(NL):&lt;/strong&gt; Función que retorna un valor longint que indica el tamaño del archivo en cantidad de registros. &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Ejemplos:&lt;/strong&gt; &lt;/div&gt;&lt;div align="justify"&gt;writeln(fileSize(Alumnos); &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;for&lt;/strong&gt; i:= 1 &lt;strong&gt;to&lt;/strong&gt; fileSize(Alumnos) &lt;strong&gt;do begin&lt;/strong&gt;&lt;br /&gt;read(Alumnos, rAlumno);&lt;br /&gt;...&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;filepos(NL):&lt;/strong&gt; Función que retorna un valor longint que indica la posición en que se encuentra el puntero en el archivo indicado por NL. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;writeln(filePos(Alumnos));&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;seek(NL, dir):&lt;/strong&gt; Ubica al puntero del archivo indicado por NL, en la dirección indicada por dir. El segundo parámetro puede ser una expresión. Se podrá ubicar el puntero dentro o fuera del tamaño del archivo, sin generar ningún error, inclusive antes de la posición cero.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;seek(Alumnos, 3);&lt;br /&gt;seek(Alumnos, fileSize(Alumnos)); la ubicación nueva coincide con eof.&lt;br /&gt;seek(Alumnos, filepos(Alumnos));&lt;br /&gt;seek(Alumnos, fileSize(Alumnos) – 1); la ubicación nueva coincide con el último&lt;br /&gt;registro existente en el archivo.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;truncate(NL):&lt;/strong&gt; Sentencia que trunca o corta el archivo a partir en donde se encuentre el puntero al archivo. Actualiza el tamaño del archivo.&lt;br /&gt;Si tomamos un archivo que contiene 15 registros y cambiamos el puntero al archivo a la ubicación 7, seek(Alumnos, 7); y luego hacemos truncate(Alumnos); se eliminarán todos los registros localizados desde la ubicación 7 hasta la ubicación 14 inclusives, es decir, ahora el tamaño del archivo se comprimió a 7 registros, desde la posición cero hasta la posición seis.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;rename(NL, NVONF):&lt;/strong&gt; Permite renombrar el archivo indicado por NL con otro nuevo nombre físico, la actualización se realiza en el directorio del disco.&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;/div&gt;&lt;div align="justify"&gt;rename(Alumnos, ‘Student.Dat’);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;erase(NL):&lt;/strong&gt; Elimina o borra el archivo indicado por NL, del directorio en el disco. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;erase(Alumnos);&lt;br /&gt;&lt;br /&gt;Archivo binario con 12 registros con direcciones [0; 11]&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-6WlBEk_CI/AAAAAAAAAJg/2z8bddkQKv4/s1600-h/PosPtrArc.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183245783836982306" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-6WlBEk_CI/AAAAAAAAAJg/2z8bddkQKv4/s400/PosPtrArc.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;Si el puntero al archivo está ubicado en la marca de eof, realizar una operación de lectura producirá un error en tiempo de ejecución y se aborta el programa, lo mismo ocurrirá si está más allá de la marca de eof, pero grabar esta bién y se expande el tamaño del archivo una componente más y la marca se reubica después del registro grabado, coincidiendo con el puntero al archivo.&lt;br /&gt;Si el puntero al archivo está ubicado en una dirección más alejada digamos 15 y se graba un nuevo registro, también se graban los registros 12 a 14 pero su contenido será desconocido.&lt;br /&gt;Si el puntero al archivo está ubicado en una dirección menor a 0 realizar una operación de lectura o escritura producirá un error en tiempo de ejecución y se aborta el programa.&lt;br /&gt;La función eof(f) retornará verdadero si el puntero al archivo se encuentra fuera de los límites del archivo, esto es, si está más allá de la marca eof o si se movió el puntero al archivo a una dirección menor a 0.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;[1] IRD significa: Izquierda, Raíz, Derecha. RID significa: Raíz, Izquierda, Derecha. IDR significa: Izquierda, Derecha, raíz.&lt;/span&gt;&lt;/div&gt;&lt;p align="justify"&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="ABAJO"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Anterior:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/03/clase-7-lenguaje-turbo-pascal.html"&gt;Lenguaje Turbo Pascal&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Siguiente:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/03/archivos-ii.html"&gt;Archivos II&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="#ARRIBA"&gt;Arriba&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100408444678612840-9073412467855205436?l=pascalgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pascalgo.blogspot.com/feeds/9073412467855205436/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5100408444678612840&amp;postID=9073412467855205436' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/9073412467855205436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/9073412467855205436'/><link rel='alternate' type='text/html' href='http://pascalgo.blogspot.com/2008/03/clase-8-archivos.html' title='Archivos I'/><author><name>Lic. Hugo Cuello</name><uri>http://www.blogger.com/profile/00801409318639239421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_ISF8DP9N9hg/R-6TgBEk-_I/AAAAAAAAAJI/hWx3Xm25hoU/s72-c/ArbolIndice.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5100408444678612840.post-3265900737561862072</id><published>2008-03-28T20:41:00.000-07:00</published><updated>2008-04-12T17:45:59.497-07:00</updated><title type='text'>Lenguaje Turbo Pascal</title><content type='html'>&lt;a name="ARRIBA"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="#ABAJO"&gt;Abajo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;CLASE 7:&lt;/strong&gt; &lt;em&gt;Lenguaje Turbo Pascal.&lt;/em&gt;&lt;br /&gt;&lt;a name="estrprogpas"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;span style="font-size:180%;"&gt;Estructura de un programa en Turbo Pascal&lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;El lenguaje &lt;em&gt;Pascal&lt;/em&gt; fue creado en la década del 70 por &lt;em&gt;Niklaus Wirth&lt;/em&gt; de Zurich, partiendo de otros lenguajes previamente desarrollados, como el &lt;em&gt;Algol&lt;/em&gt; y el &lt;em&gt;Fortran&lt;/em&gt;. El Pascal fue desarrollado como un lenguaje de propósito general, orientado hacia fines pedagógicos de nivel universitario y para los estudiantes en la carrera de Sistemas. Desde sus origenes fue concebido como un lenguaje con las herramientas necesarias para facilitar la programación estructurada, ya que reúne las estructuras de control de programa de: la sentencia compuesta –&lt;strong&gt;concatenación&lt;/strong&gt;, bloque-, la estructura condicional –&lt;strong&gt;selección&lt;/strong&gt;- y la cíclica –&lt;strong&gt;repetición&lt;/strong&gt;, iteración-. Permite la &lt;strong&gt;programación modular&lt;/strong&gt;, ya que, otorga la posibilidad de crear módulos –&lt;em&gt;procedimientos y funciones&lt;/em&gt;-, logrando dividir un problema en partes menos complejas, partiendo de lo general a lo particular, a su vez, cada una de estas partes puede volver a dividirse, esta tarea se conoce como &lt;em&gt;refinamiento sucesivo&lt;/em&gt;. También es un lenguaje fuertemente tipado, es decir, ante la menor incompatibilidad de tipos generará un error. Es un lenguaje &lt;em&gt;procedural&lt;/em&gt; –&lt;strong&gt;imperativo&lt;/strong&gt;, orientado a órdenes-. Existen ciertas diferencias entre el Pascal standard con el Turbo Pascal, este último incorpora notables diferencias para beneficio al programador, por lo tanto, de aquí en adelante al hablar del Pascal estaremos refiriéndonos al Turbo Pascal de Borland, versión 5 en adelante.&lt;br /&gt;Entre las ventajas adicionales que encontramos están las unidades, herramientas para la programación orientada a objetos, gráficos, etc..&lt;br /&gt;&lt;a name="clasleng"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="font-family:trebuchet ms;"&gt;Los lenguajes de programación se clasifican en:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Lenguaje máquina:&lt;/strong&gt; escritos a nivel de bits, hace que sea una tarea bastante tediosa al programador aunque directamente reconocible por la computadora –cpu-. &lt;p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Lenguajes de bajo nivel:&lt;/strong&gt; –&lt;em&gt;ensambladores&lt;/em&gt;-: En lugar de escribir las ordenes impartidas a la máquina con ceros y unos, se utiliza un lenguaje simbólico, que establece una relación 1 a 1, por lo tanto es extraordinariamente rápida su ejecución, la desventaja es que estos lenguajes están muy comprometidos con la máquina en donde deban ser ejecutados, por lo tanto no son transportables prácticamente a otros equipos, esto hace entonces que cada hardware diferente cuente con un código especialmente escrito para cada equipo. Los lenguajes de bajo nivel, las instrucciones se escriben en códigos alfabéticos conocidos como mnemotécnicos, p.e.: &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Cód. Código&lt;br /&gt;Máq. Mnemotécnico&lt;/strong&gt;&lt;br /&gt;0010 ADD&lt;br /&gt;0001 LOAD&lt;br /&gt;0100 STG&lt;br /&gt;&lt;br /&gt;Luego de escribir un programa en lenguaje assembler, se necesita de un &lt;strong&gt;programa ensamblador&lt;/strong&gt; que lo traduzca a código máquina.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Lenguajes de medio nivel:&lt;/strong&gt; Son lenguajes que se encuentran en un paso intermedio entre los lenguajes de bajo nivel y los lenguajes de alto nivel. Los lenguajes de bajo nivel se encuentran más cerca de la máquina que del programador, en cambio los lenguajes de alto nivel son más cercanos al programador que a la máquina. Los lenguajes de nivel medio por lo tanto están en un punto intermedio entre la máquina y el programador. El lenguaje C es considerado como un lenguaje de nivel medio, ya que posibilita escribir el código de diferentes maneras, el que se elija hará que esté más cerca de la máquina o del programador o inclusive en un punto medio, entre estos dos, p.e.: c = c + 1 o c += 1 o c++, son distintas maneras de hacer lo mismo, aunque el código máquina que genere no sea el mismo, esto determinará que algunas de estar órdenes al traducirse a código máquina sea más óptima que otras, es decir, se ejecutrá más rápidamente. &lt;p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Lenguajes de alto nivel:&lt;/strong&gt; Aquí encontramos muchos de los lenguajes de programación, p.e.: Pascal, Basic, Cobol, Fortran, Algol, Ada, Modula, etc. Esta categoría de lenguajes hace que se encuentren más cercanos al programador que de la máquina. Esto significa que al alejarse más de la máquina requerirá de mayor tiempo de ejecución, pero serán más fáciles de escribir por utilizar palabras similares al lenguaje natural. Los programas escritos en un lenguaje de alto nivel son transportables, es decir, se pueden ejecutar en distintas máquinas, ya que no son tan dependientes del hardware. El código escrito debe ser traducido al lenguaje de máquina y para llevar a cabo esta tarea se utilizan los compiladores o bien los intérpretes. &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Etapas para la generación de código máquina&lt;/strong&gt; &lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Edición del programa, utilizando la consola –teclado, pantalla-, a través de un editor de texto o que genere código ASCII puro, una vez finalizado se graba en disco con un nombre elegido por el programador y de una extensión que dependerá del lenguaje que hayamos seleccionado para escribir nuestro programa, p.e.: Pascal .Pas, Basic .Bas, C .c, Cobol .Cob o .Cbl, dBase o Clipper o Fox .prg, etc.. Este programa recibe el nombre de programa fuente y es muy importante conservarlo, debido a que en caso de necesitar realizar modificaciones, se realizará con el código fuente.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Compilar el programa fuente, -etapa anterior-, utilizando el compilador correspondiente al lenguaje empleado, por lo tanto, el compilador tiene una entrada que es el lenguaje fuente, p.e.:&lt;br /&gt;&lt;br /&gt;Tp MiProg Tp, Compilador Turbo Pascal de Borland&lt;br /&gt;Tc MiProg Tc, Compilador Turbo C de Borland&lt;br /&gt;Cobol MiProg Cobol, Compilador Cobol.&lt;br /&gt;&lt;br /&gt;El archivo generado recibe el nombre de programa objeto y tiene como extensión .obj, -object-. Este programa contiene la traducción del programa fuente, es decir, su código es el de máquina, pero aún no podrá ser ejecutado debido a que habrá que enlazarle las librerías a que hace referencia. &lt;/span&gt;&lt;/div&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Vincular el programa objeto –resultado de la etapa de compilación-, utilizando la aplicación que contiene las librerías que requiera el programa objeto, generalmente con el nombre de Link o similar, p.e.:&lt;br /&gt;&lt;br /&gt;Link MiProg&lt;br /&gt;Blink MiProg&lt;br /&gt;Tlink MiProg &lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Generalmente podrán incorporarse cuantos módulos .obj necesitemos para general un solo programa que ahora sí contendrán los códigos de las librerías que requería el .obj. El resultado del enlzador es un programa ejecutable cuya extención es .exe, p.e.: MiProg.exe, y es este programa autosuficiente de ser ejecutado.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-27gREk-rI/AAAAAAAAAGo/p-SSRwecqtQ/s1600-h/ProgFteObjEje.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183004909186120370" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-27gREk-rI/AAAAAAAAAGo/p-SSRwecqtQ/s400/ProgFteObjEje.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;a name="estrlengpas"&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Un programa en T.Pascal consta de las siguientes partes:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Una cabecera, precedida por una palabra reservada y un identificador, a saber:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Program&lt;/strong&gt; IdProg;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;IdProg tiene como propósito identificar con un nombre apropiado el sentido del programa, es decir, cuál es el proceso que lleva a cabo.&lt;br /&gt;&lt;br /&gt;Un área de definiciones y declaraciones de objetos diversos, cada una representada por medio de una palabra reservada, que establece una sección, en el cuál existe una cierta libertad para el orden, salvo que obligatoriamente debamos escribir alguna sección antes de otra, por motivos de que un identificador antes de poder utilizarlo debe estar previamente definido. Las secciones son las siguientes: &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;uses&lt;/strong&gt;&lt;br /&gt;{lista de Id.de unidades}&lt;br /&gt;&lt;strong&gt;const&lt;/strong&gt;&lt;br /&gt;{lista de Id. constantes}&lt;br /&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;br /&gt;{lista de tipos}&lt;br /&gt;&lt;strong&gt;procedure&lt;/strong&gt;&lt;br /&gt;{Módulo procedimiento}&lt;br /&gt;&lt;strong&gt;function&lt;/strong&gt;&lt;br /&gt;{Módulo función}&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt; {Ubicadas en el Segmento de Datos}&lt;br /&gt;{lista de variables globales}&lt;br /&gt;&lt;br /&gt;y un bloque principal, encerrado entre las palabras reservadas:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;sentencia1;&lt;br /&gt;sentencia2;&lt;br /&gt;.&lt;br /&gt;sentencian&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Una &lt;strong&gt;palabra reservada&lt;/strong&gt; en T.Pascal cumple un propósito específico, por lo tanto nunca debe ser utilizada para que cumpla otro rol. Las palabras que aparecen en negrita en el esquema anterior son palabras reservadas.&lt;br /&gt;Un &lt;strong&gt;identificador&lt;/strong&gt; es una palabra creada por el usuario y sirve para definir nombres de unidades, constantes con nombres, tipos, campos de registros, nombres de procedimientos, funciones y variables.Un identificador jamás puede ser una palabra reservada, por lo dicho en el apartado anterior.&lt;br /&gt;&lt;br /&gt;En la sección &lt;strong&gt;uses&lt;/strong&gt; definimos las unidades que se van a incorporar a nuestro programa. Una unidad es un conjunto de objetos previamente compilados y cuyo código se agrega al código de nuestro programa, solo el programa principal y sus módulos desarrollados deberán ser compilados. Una unidad compilada tiene extensión &lt;strong&gt;.TPU&lt;/strong&gt;, mientras que el archivo de código fuente tiene la misma extensión que el programa .Pas. Los objetos que componen una unidad son los mismos objetos vistos en el esquema previo, vale decir, otras unidades, constantes con nombre, tipos, procedimientos, funciones y variables.&lt;p&gt;&lt;br /&gt;&lt;a name="unidpredef"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Unidades predefinidas&lt;/strong&gt;&lt;p&gt;&lt;br /&gt;El lenguaje T.Pascal proporciona al usuario de unidades las cuales están almacenadas en el archivo &lt;strong&gt;TURBO.TPL&lt;/strong&gt; algunas de las cuales son:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CRT&lt;/strong&gt;, que reúne un conjunto de objetos para la facilidad del teclado y pantalla, entre estos objetos tenemos los siguientes identificadores de procedimiento o funciones: &lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;gotoxy(x,y)&lt;/em&gt; que sirve para ubicar al cursor en las coordenadas x,y siendo (1,1) el ángulo superior izquierdo; (1,80) el ángulo superior derecho; (1,25) el ángulo inferior izquierdo y (80,25) el ángulo inferior derecho. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;delay(n)&lt;/em&gt; realiza una espera de n milisegundos. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;clrscr&lt;/em&gt; limpia la pantalla y ubica al cursor en el ángulo superior izquierdo, es decir en las coordenadas (1,1). &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;clreol&lt;/em&gt; limpia una linea pero desde la columna en donde se encuentre el cursor –puntero de la pantalla- hasta el final de la línea, y dejando al cursor posicionado en la fila y columna en que se encontraba previo a limpiar la línea. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;keypressed&lt;/em&gt; función que realiza una espera hasta que se oprima una tecla, es necesario encerrarla dentro de una estructura cíclica, ya que retorna un valor de tipo boolean. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;textcolor(n)&lt;/em&gt; cambia el color del carácter, n es un valor entre 0 y 15. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;textbackground(n)&lt;/em&gt; cambia el color del fondo del cracter, n es un valor entre 0 y 7. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;readkey&lt;/em&gt; función que lee desde el buffer del teclado un valor, si el buffer está vacío espera a que se presione una tecla, no es necesario terminar con la tecla ENTER. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;window(x1,y1,x2,y2)&lt;/em&gt; crea una ventana, todo aquello que se emita será enviado a esta ventana, la ventana máxima es window(1,1,80,25). &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;sound(n)&lt;/em&gt; emite un sonido, por el speaker, n indica un valor de frecuencia. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;em&gt;nosound&lt;/em&gt; hace que deje de emitirse sonido, se utiliza para deterner a sound. &lt;/div&gt;&lt;p align="justify"&gt;&lt;br /&gt;En lugar de utilizar valores entre 0 y 15 para indicar el color se podrán utilizar las constantes con nombres definidas en esta unidad, p.e.: blue, red, green, white, yellow, black, lightred, etc..&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;PRINTER&lt;/strong&gt; brinda una variable &lt;em&gt;lst&lt;/em&gt; de tipo archivo &lt;em&gt;text&lt;/em&gt; que permite enviar la salida hacia la impresora, además da facilidades para su manejo ya que no es necesario ni abrir ni cerrar ese dispositivo, debido a que lo gestiona la unidad.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;DOS&lt;/strong&gt; otorga un conjunto de objetos de servicios al sistema operativo &lt;strong&gt;D.O.S.&lt;/strong&gt;, entre estos objetos se encuentran los procedimientos:&lt;br /&gt;&lt;em&gt;getdate(aa,mm,dd,ds)&lt;/em&gt; que obtiene la fecha del sistema, cada parámetro es de tipo word y ds indica el día de la semana, 0 para domingo, 1 para lunes, ..., 6 para sábado.&lt;br /&gt;&lt;em&gt;gettime(hh,mm,ss,cs)&lt;/em&gt; que obtiene la hora del sistema, cada parámetro es de tipo word y cs indica centésimas de segundo.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;SYSTEM&lt;/strong&gt; esta unidad siempre estará disponible en nuestros programas y &lt;strong&gt;jamás&lt;/strong&gt; deberá anunciarse en la sección uses, si se hiciera se colgaría el programa. Aquí se encuentran muchos de los objetos que utilizamos en un programa, p.e.: las funciones numéricas, las funciones de cadenas, las sentencias de asignación externas de entrada y salida, es decir, los procedimientos read, readln, write, writeln que veremos más adelante, como todas las sentencias y funciones para manejo de archivos y asignación de memoria.&lt;br /&gt;&lt;a name="unidxusu"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Unidades definidas por el usuario&lt;/strong&gt;&lt;p&gt;&lt;br /&gt;T.Pascal también permite que el usuario desarrolle sus propias unidades; para hacerlo debemos conocer como es su estructura. Una unidad se compone de las siguientes partes:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Unit&lt;/strong&gt; IdUnidad;&lt;br /&gt;&lt;strong&gt;interface&lt;/strong&gt; {Parte pública o visible a otras unidades o programas&lt;br /&gt;que utilicen esta unidad}&lt;br /&gt;&lt;strong&gt;uses&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;const&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;procedure&lt;/strong&gt; {solo la cabecera}&lt;br /&gt;&lt;strong&gt;function&lt;/strong&gt; {solo la cabecera}&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;implementation&lt;/strong&gt; {Parte privada}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;uses&lt;br /&gt;const&lt;br /&gt;type&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;procedure&lt;/strong&gt; {se desarrolla completamente}&lt;br /&gt;{los procedimientos que no aparecen en la sección de interface no serán reconocidos por los programas que enlacen la unidad, solo serán reconocidos por la unidad, es decir son locales y solo serán reconocidos por otras unidades si están definidas dentro de su ámbito}&lt;br /&gt;&lt;strong&gt;function&lt;/strong&gt; {se desarrolla completamente}&lt;br /&gt;{las funciones que no aparecen en la sección de interface no serán reconocidos por los programas que enlacen la unidad, solo serán reconocidos por la unidad, es decir son locales y solo serán reconocidos por otras unidades si están definidas dentro de su ámbito}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;var&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;&lt;/strong&gt;{Inicializar la unidad}&lt;br /&gt;sentencias&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;El nombre que identifica a la unidad debe ser el mismo nombre que demos al archivo. El archivo fuente tiene extensión .Pas y el archivo compilado tiene extensión &lt;strong&gt;.Tpu&lt;/strong&gt;, es decir, Unidad Turbo Pascal. Las unidades se compilan en forma independiente de los programas, por lo tanto, cuando un programa requiere los servicios de una unidad solo se la menciona en la sección uses, enlazando su código al programa.&lt;br /&gt;Las unidades son llamadas también librerías, y los objetos que incluimos deben ser de un tema específico. Por último diremos que las unidades son módulos que acentúan la programación modular y permiten la construcción de grandes programas.&lt;br /&gt;&lt;a name="constantes"&gt;&lt;/a&gt;&lt;br /&gt;En la sección &lt;strong&gt;const&lt;/strong&gt; definimos constantes con nombres y es de uso global en el programa. En vez de utilizar valores constantes en nuestro programa, en ciertas situaciones es conveniente utilizar este tipo de objetos, que por diversas razones lo hace más legible y dinámico a la hora de modificar el programa, p.e. en vez de utilizar la constante 21 del IVA, podríamos definir una constante con nombre denominada IVA y hacerla igual al valor 21, luego en los distintos puntos del programa en donde dicho valor podría aparecer, pondríamos este identificador. Si a futuro debemos realizar un cambio de valor solo iremos al único lugar en donde podemos modificarlo. Por conveniencia utilizamos nombres escrito todo en mayúscula a efectos de darnos cuenta en el momento de leer un listado fuente de que esos identificadores son objetos constantes y no variables. El único lugar en donde podemos cambiar el valor de una constante con nombre es en la sección const. La sintaxis es:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;const&lt;/strong&gt;&lt;br /&gt;IdConst = expresión;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ejemplos:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;const&lt;/strong&gt;&lt;br /&gt;IVA = 21;&lt;br /&gt;MIN = 12;&lt;br /&gt;MAX = MIN * 2 –1;&lt;br /&gt;VAL_ABS = abs(-MAX);&lt;br /&gt;COC = MAX div MIN;&lt;br /&gt;RES = MAX mod MIN;&lt;br /&gt;CAD = ‘esto es una cadena de caracteres’;&lt;br /&gt;LONG = length(cad);&lt;br /&gt;C = #67;&lt;br /&gt;VERDADERO = true;&lt;br /&gt;ENT = trunc(23.74);&lt;br /&gt;CODASCCI = ord(‘A’);&lt;br /&gt;&lt;br /&gt;En la sección &lt;strong&gt;type&lt;/strong&gt; definimos nuevos tipos de datos y es de uso global en el programa. La sintaxis es:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;br /&gt;IdTipo = tipo;&lt;br /&gt;&lt;br /&gt;IdTipo es un identificador válido.&lt;br /&gt;tipo es un identificador o tipo simple o tipo estructurado o tipo string o tipo pointer.&lt;br /&gt;&lt;br /&gt;El lenguaje Pascal es &lt;strong&gt;fuertemente tipado&lt;/strong&gt; -&lt;em&gt;strongly typed&lt;/em&gt;-, esto quiere decir que todas las variables deben estar previamente definidas correspondiendo a un tipo de dato al que pertenecen. Otra clase de lenguajes que verifican el tipo de variables según el valor que se le asigne por primera vez se denominan &lt;strong&gt;auto tipados&lt;/strong&gt; –&lt;em&gt;self typed&lt;/em&gt;- mientras que otros lenguajes podrían permitir que una variable tome valores de distinto tipo durante la ejecución del programa, en este caso se denomina &lt;strong&gt;dinámicamente tipados&lt;/strong&gt; –&lt;em&gt;dinamically typed&lt;/em&gt;-.&lt;br /&gt;Definir a una variable como perteneciente a un tipo de dato, circunscribe al conjunto de valores que puede tener y las operaciones que pueden realizarse.&lt;br /&gt;&lt;a name="tiposdatos"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Los tipos en Pascal se clasifican en:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Tipos simples&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Ordinales&lt;/strong&gt; –&lt;em&gt;predefinidos&lt;/em&gt;-&lt;br /&gt;Integer&lt;br /&gt;ShortInt&lt;br /&gt;LongInt&lt;br /&gt;Byte&lt;br /&gt;Word&lt;br /&gt;Char&lt;br /&gt;Boolean&lt;br /&gt;&lt;strong&gt;Ordinales&lt;/strong&gt; -&lt;em&gt;definidos por el usuario&lt;/em&gt;-&lt;br /&gt;Enumerado&lt;br /&gt;Intervalo&lt;br /&gt;Reales&lt;br /&gt;Real&lt;br /&gt;Single&lt;br /&gt;double&lt;br /&gt;extended&lt;br /&gt;comp&lt;br /&gt;&lt;strong&gt;Tipos String&lt;/strong&gt; –cadena de caracteres-&lt;br /&gt;&lt;strong&gt;String&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;String&lt;/strong&gt;[n]&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Tipos estructurados&lt;br /&gt;Record&lt;br /&gt;File&lt;br /&gt;Set&lt;br /&gt;Array&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Tipos punteros&lt;/strong&gt;&lt;br /&gt;Pointer&lt;br /&gt;^IdTipoBase&lt;br /&gt;&lt;strong&gt;Tipos Procedurales&lt;/strong&gt;&lt;br /&gt;Procedure...&lt;br /&gt;Function...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ejemplos:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;br /&gt;int = integer;&lt;br /&gt;str20 = &lt;strong&gt;string&lt;/strong&gt;[20];&lt;br /&gt;Fecha = &lt;strong&gt;record&lt;/strong&gt;&lt;br /&gt;aa : word;&lt;br /&gt;dd,&lt;br /&gt;mm : byte&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;RegAlu = &lt;strong&gt;record&lt;/strong&gt;&lt;br /&gt;NroLeg : longint;&lt;br /&gt;ApeNom,&lt;br /&gt;Domic,&lt;br /&gt;Local : str20;&lt;br /&gt;FecNac : Fecha;&lt;br /&gt;EstCiv : char&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;; Meses = 1..12;&lt;br /&gt;MesesStr = (Enero, Febrero, Marzo, Abril, Mayo, Junio, Julio, Agosto, Septiembre,&lt;br /&gt;Octubre, Noviembre, Diciembre);&lt;br /&gt;PriSem = Enero..Junio;&lt;br /&gt;SegSem = Julio..Diciembre;&lt;br /&gt;&lt;br /&gt;Meses es de tipo [1; 12]. MesesStr es de tipo por enumeración siendo los nombres de los meses constantes y únicos, es decir, no puede volver a definirse para otro tipo, los valores ordinales son Enero = 0, Febrero = 1, ... PriSem es de tipo [Enero; Junio].&lt;br /&gt;Sobre los tipos ordinales se pueden aplicar las funciones : &lt;em&gt;ord, pred&lt;/em&gt; y&lt;em&gt; succ&lt;/em&gt;. p.e.: ord(Marzo) = 2, Succ(Mayo) = Junio, Pred(Octubre) = Septiembre, ord(false) = 0.&lt;br /&gt;&lt;a name="variables"&gt;&lt;/a&gt;&lt;br /&gt;Las &lt;strong&gt;variables&lt;/strong&gt; son objetos a los que se les pueden asignar valores del mismo tipo en que han sido definidas. La sintaxis es:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;Lista-IdVar : tipo;&lt;br /&gt;&lt;br /&gt;Lista_IdVar es una lista de identificadores válidos separados por comas.&lt;br /&gt;&lt;br /&gt;Aquellas variables definidas fuera del ámbito de un módulo son &lt;strong&gt;variables&lt;/strong&gt; &lt;strong&gt;globales&lt;/strong&gt;. Estas &lt;strong&gt;variables&lt;/strong&gt; son &lt;strong&gt;estáticas&lt;/strong&gt;, debido a que el espacio que ocupen en la memoria estará definido en tiempo de compilación y no se libera hasta que finalice la ejecución del programa. Las variables globales se localizan en el &lt;em&gt;segmento de datos&lt;/em&gt;, que es una región de memoria hasta un máximo de 64Kbytes, en caso de necesitar más espacio, se puede recurrir a un diseño modular, esto hace que aquellas variables que sean propias del módulo ocupen lugar en otra region de memoria que es el &lt;em&gt;segmento del stack o pila&lt;/em&gt;, las variables definidas dentro del ámbito de un módulo se denominan &lt;strong&gt;variables locales&lt;/strong&gt; y existen mientras el control de ejecución del programa esté cedido al módulo, vale decir estas variables como así también los parámetros, se crean cuando se llama o invoca al módulo y son eliminadas cuando se regresa el control al punto desde donde se invocó. Por otro lado si aún fuera necesario incrementar el espacio para variables se podrá utilizar otra región de memoria al &lt;em&gt;área del heap o montículo&lt;/em&gt;, en donde el límite es el resto de la memoria disponible. Pero a diferencia de las variables globales, estas variables ubicadas en el heap se denominan &lt;strong&gt;variables dinámicas&lt;/strong&gt; y se crean o eliminan en tiempo de ejecución, por medio de los procedimientos definidos por Pascal &lt;strong&gt;new&lt;/strong&gt; y &lt;strong&gt;dispose&lt;/strong&gt; respectivamente. Para poder acceder a estas localizaciones es necesario recurrir a las variables de tipo puntero, es decir, variables que contienen una dirección de memoria.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejemplos:&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;a, b, c : real;&lt;br /&gt;i, j : integer;&lt;br /&gt;cad20 : str20; {str20 es un identificador que debió definirse en la sección type}&lt;br /&gt;car : char;&lt;br /&gt;rAlumno : RegAlu {RegAlu debe estar definido previamente en la sección type}&lt;br /&gt;existe : boolean;&lt;br /&gt;NroLeg : longint;&lt;br /&gt;cant, kg : word;&lt;br /&gt;&lt;a name="procedimientos"&gt;&lt;/a&gt;&lt;br /&gt;Los &lt;strong&gt;procedimientos&lt;/strong&gt; son módulos que deben ser invocados para que su código pueda ser ejecutado, ya que, si no se lo invocan están como en un estado de hibernación. La comunicación entre la llamada y el módulo se logra por medio de los parámetros. En el punto de la llamada se denominan &lt;strong&gt;parámetros actuales&lt;/strong&gt;, mientras que en la cabecera del módulo se denominan &lt;strong&gt;parámetros formales&lt;/strong&gt;. Un procedimiento está estructurado en las siguientes partes:&lt;br /&gt;Una cabecera que incluye:&lt;br /&gt;La palabra reservada &lt;strong&gt;procedure&lt;/strong&gt;&lt;br /&gt;El identificador de procedimiento&lt;br /&gt;Una lista de parámetros, que podrán ser pasados por valor o por referencia; en este último caso deberá estar precedido con la palabra reservada &lt;strong&gt;var&lt;/strong&gt;.&lt;br /&gt;Un área de definiciones y declaraciones de objetos locales.&lt;br /&gt;Un cuerpo encerradas entre las palabras reservadas &lt;strong&gt;begin&lt;/strong&gt; y &lt;strong&gt;end&lt;/strong&gt;.&lt;br /&gt;&lt;strong&gt;procedure&lt;/strong&gt; IdProc(lista de parámetros);&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt; {Locales}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;sentencia; ...&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;lista de parámetros es: Identificador, ... : tipo o var Identificador, ... : tipo&lt;br /&gt;&lt;br /&gt;Si el parámetro no está precedido por la palabra reservada var, entonces el parámetro es pasado por valor, esto es, con el valor pasado se hace una copia en otra región de memoria y cualquier cambio que se hiciere, en realidad no afectará al parámetro actual, por estar trabajando con la copia, y no con el valor original. Este tipo de pasaje de parámetros es utilizado cuando el valor se conoce antes de invocar al módulo y deseamos pasar el valor al módulo para que realice algún proceso. Los parámetros pasados por valor son parámetros de entrada y sirve para inicializar al parámetro formal. El objeto que ocupa la misma posición, el parámetro actual, puede ser una expresión, es decir, puede ser una constante, una variable o una expresión propiamente dicha, p.e.:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-28ZBEk-sI/AAAAAAAAAGw/Q6W5-iokbdw/s1600-h/PjeParam.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183005884143696578" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-28ZBEk-sI/AAAAAAAAAGw/Q6W5-iokbdw/s400/PjeParam.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Si el parámetro está precedido por la palabra reservada &lt;strong&gt;var&lt;/strong&gt;, entonces el parámetro es pasado por &lt;strong&gt;referencia&lt;/strong&gt;, esto es, se pasa la dirección del objeto, por lo tanto, este objeto, del parámetro actual, solo debe ser una &lt;strong&gt;variable&lt;/strong&gt;. El parámetro formal recibe la dirección, y al momento en que se le asigne un valor dentro del módulo al parámetro formal, en realidad se lo está asignando al parámetro actual, a través del parámetro formal. Imaginemos que este parámetro formal es una catapulta que envía lo que recibe a un único punto, al punto al que apunta, es decir en donde está ubicada la variable –el parámetro actual-, cuya dirección es la que recibió el parámetro formal. Este tipo de pasaje de parámetros es utilizado cuando conocemos el valor dentro del módulo y queremos dárselo al bloque que lo llamó a través de su parámetro actual o bien conociendo previamente su valor, dentro del módulo invocado quizás sufra alguna modificación y queremos informarlo al bloque que invocó al módulo, por medio de su parámetro actual. Este tipo de parámetros pasados por referencia son parámetros de salida o bien de entrada-salida.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-29ABEk-tI/AAAAAAAAAG4/S98T5Y7qA08/s1600-h/PjeParam2.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183006554158594770" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-29ABEk-tI/AAAAAAAAAG4/S98T5Y7qA08/s400/PjeParam2.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R-594REk-6I/AAAAAAAAAIg/M_L20nuibeQ/s1600-h/PjeParam3.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183218626758769570" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R-594REk-6I/AAAAAAAAAIg/M_L20nuibeQ/s400/PjeParam3.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Las &lt;strong&gt;funciones&lt;/strong&gt; son módulos que deben ser invocados para que su código pueda ser ejecutado, ya que, si no se invocan están como en un estado de hibernación. La comunicación entre la llamada y el módulo se logra por medio de los parámetros. En el punto de la llamada se denominan &lt;strong&gt;parámetros actuales&lt;/strong&gt;, mientras que en la cabecera del módulo se denominan &lt;strong&gt;parámetros formales&lt;/strong&gt;. &lt;br /&gt;&lt;a name="funciones"&gt;&lt;/a&gt;&lt;br /&gt;Una función está estructurada en las siguientes partes:&lt;br /&gt;&lt;br /&gt;Una cabecera que incluye:&lt;br /&gt;La palabra reservada &lt;strong&gt;function&lt;/strong&gt;&lt;br /&gt;El identificador de la función.&lt;br /&gt;Una lista de parámetros, que podrán ser pasados por valor, es lo más habitual o por referencia; en este último caso deberá estar precedido con la palabra reservada &lt;strong&gt;var&lt;/strong&gt;.&lt;br /&gt;El tipo de dato simple que retornará la función.&lt;br /&gt;Un área de definiciones y declaraciones de objetos locales.&lt;br /&gt;Un cuerpo encerradas entre las palabras reservadas &lt;strong&gt;begin&lt;/strong&gt; y &lt;strong&gt;end&lt;/strong&gt;, el cual deberá tener al menos una sentencia de asignación y que asigne al nombre de la función el resultado de una expresión que deberá coincidir con el tipo en que fue definida en su cabecera.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;function&lt;/strong&gt; IdFunc(lista de parámetros) : tipo;&lt;br /&gt;var {Locales}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;sentencia; ...&lt;br /&gt;IdFunc &lt;-- expresión &lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;&lt;br /&gt;lista de parámetros es: Identificador, ... : tipo o var Identificador, ... : tipo&lt;br /&gt;&lt;br /&gt;Si el parámetro no está precedido por la palabra reservada &lt;strong&gt;var&lt;/strong&gt;, entonces el parámetro es pasado por &lt;strong&gt;valor&lt;/strong&gt;, esto es, con el valor pasado se hace una copia en otra región de memoria y cualquier cambio que se hiciere, en realidad no afectará al parámetro actual, por estar trabajando con la copia, y no con el valor original. Este tipo de pasaje de parámetros es utilizado cuando el valor se conoce antes de invocar al módulo y deseamos pasar el valor al módulo para que realice algún proceso. Los parámetros pasados por valor son parámetros de entrada y sirve para inicializar al parámetro formal. El objeto que ocupa la misma posición, el parámetro actual, puede ser una expresión, es decir, puede ser una constante, una variable o una expresión propiamente dicha.&lt;br /&gt;&lt;br /&gt;Si el parámetro está precedido por la palabra reservada var, entonces el parámetro es pasado por &lt;strong&gt;referencia&lt;/strong&gt;, esto es, se pasa la dirección del objeto, por lo tanto, este objeto, del parámetro actual, solo debe ser una variable. El parámetro formal recibe la dirección, y al momento en que se le asigne un valor dentro del módulo al parámetro formal, en realidad se lo está asignando al parámetro actual, a través del parámetro formal. Imaginemos que este parámetro formal es una catapulta que envía lo que recibe a un único punto, al punto al que apunta, es decir en donde está ubicada la variable –el parámetro actual-, cuya dirección es la que recibió el parámetro formal. Este tipo de pasaje de parámetros es utilizado cuando conocemos el valor dentro del módulo y queremos dárselo al bloque que lo llamó a través de su parámetro actual o bien conociendo previamente su valor, dentro del módulo invocado quizás sufra alguna modificación y queremos informarlo al bloque que invocó al módulo, por medio de su parámetro actual. Este tipo de parámetros pasados por referencia son parámetros de salida o bien de entrada-salida.&lt;br /&gt;&lt;a name="asigint"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;La sentencia de asignación&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Presenta el siguiente formato:&lt;br /&gt;&lt;strong&gt;variable := expresión&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Bloque del diagrama de flujo&lt;br /&gt;&lt;strong&gt;variable &lt;-- expresión&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Permite asignar valores a las variables. El lado izquierdo del símbolo := es el objeto que recibe el valor, y debe ser solamente una variable. El lado derecho del mismo símbolo indicado anteriormente, es una expresión y una vez calculado su valor es asignado a la variable que está del lado izquierdo, el cual debe coincidir su tipo con el que ha sido definida la variable, pues en caso de que no coincida, se dará un mensaje de error. La excepción está cuando la variable es de tipo real y la expresión genere un resultado de tipo entero.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejemplos:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;a := 3;&lt;br /&gt;letra := ‘A’;&lt;br /&gt;mes := Enero;&lt;br /&gt;mesStr := ‘Enero’;&lt;br /&gt;mesPos := ord(Enero);&lt;br /&gt;c := 2; x := 30;&lt;br /&gt;EsMayor := (x &gt; y) and (‘A’ &gt; ‘@’);&lt;br /&gt;c := c + 5;&lt;br /&gt;ApeNom := rAlumno.ApeNom;&lt;br /&gt;existe := false;&lt;br /&gt;precio := 281.94;&lt;br /&gt;y := k + sqrt(sqr(a) + sin(x * pi / 180));&lt;br /&gt;&lt;a name="asigextent"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;La asignación externa de entrada&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Presenta el siguiente formato:&lt;br /&gt;&lt;br /&gt;var, ...read(var,...)&lt;br /&gt;readln(var,...)&lt;br /&gt;&lt;br /&gt;Bloque del diagrama de flujo&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R-6CGhEk-7I/AAAAAAAAAIo/_E9B_2GAmiA/s1600-h/AsigExtEnt.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183223269618416562" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R-6CGhEk-7I/AAAAAAAAAIo/_E9B_2GAmiA/s400/AsigExtEnt.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Espera a que se ingrese un valor, siendo el dispositivo por defecto el teclado, por lo tanto, una vez tipeado el valor y luego de oprimir la tecla ENTER, el valor es asignado a la variable que aparece como parámetro del procedimiento read o readln, luego de esto la ejecución continúa su rumbo. Debe existir una correspondencia de tipos entre el valor ingresado y la definición del parámetro en el procedimiento read o readln, ya que si no se corresponden sus tipos ocacionará en un error de compilación. Si bien se aceptan escribir más de una variable, es conveniente escribir una sola y usar readln, para evitar ciertos fenómenos no deseados. Las cadenas y caracteres se ingresan sin encerrarlas entre apóstrofos.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ejemplos:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;readln(NroLeg);&lt;br /&gt;readln(rAlumno.ApeNom);&lt;br /&gt;readln(rAlumno.FecNac.dd);&lt;br /&gt;&lt;a name="asigextsal"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;La asignación externa de salida&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Presenta el siguiente formato:&lt;br /&gt;exp, ...&lt;br /&gt;write(exp, ...)&lt;br /&gt;writeln(exp, ...)&lt;br /&gt;&lt;br /&gt;Bloque del diagrama de flujo&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-6CvBEk-8I/AAAAAAAAAIw/d0iK7bU4zww/s1600-h/AsigExtSal.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183223965403118530" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-6CvBEk-8I/AAAAAAAAAIw/d0iK7bU4zww/s400/AsigExtSal.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Espera a que se emita el valor, siendo el dispositivo por defecto la pantalla, por lo tanto, una vez que se haya emitido luego de esto la ejecución continúa su rumbo. Si la exp es una constante entonces el valor emitido es la propia constante, si exp es una variable entonces se emite su contenido y por último si exp es una expresión propiamente dicha entonces el resultado de evaluar la expresión es lo que se emite. Se puede dar formato a la salida de los valores enteros, escribiendo; writeln(valEnt:m) o write(valEnt:m), en donde m indica la longitud a reservar, p.e.: writeln(mes:2,’-‘,aa:4) en cambio con valores reales la forma es, writeln(valReal:m:n), en donde m indica el espacio a reservar y n la cantidad de dígitos decimales que se van a emitir, la longitud m incluye el punto decimal, p.e. writeln(‘$ ‘,imp:8:2), después de emitir el signo $ seguido de un espacio reserva 8 lugares para emitir el valor, compuesto por 5 dígitos enteros un punto decimal y dos dígitos decimales, si el número tuviera menos dígitos enteros entonces rellena con blancos a izquierda de la parte entera del número y con dígitos ceros a derecha en la parte decimal del número. En cambio, si el número necesita de más espacio igual se emite, pero ya no podrá quedar alineado con respecto a los valores emitidos en esa misma posición, es decir, quedarán corridos o desalineados. También se pueden emitir las cadenas con el siguiente formato, write(cad:m) o writeln(cad:m), si la cadena tiene menos caracteres que m, entonces primero se emiten espacios en blanco y después la cadena, por lo tanto, la alineación se efectúa a derecha. Para realizar un tabulado horizontal, se realiza de esta forma, write(‘ ‘:m), emitiendo m espacios en blanco, p.e. si queremos emitir una cadena y a continuación otro valor pero a partir de una misma posición , hacemos, write(Descrip,’ ‘:22-length(cad),precio:8:2).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejemplos:&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;write( ‘Apellido y Nombre: ‘,ApeNom);&lt;br /&gt;writeln(‘Pre.unit.: ‘,PreUni:8:2,’ Cantidad: ‘,cant:5,’ Total: ‘,cant*PreUni:10:2);&lt;br /&gt;writeln(‘[a; b] = [‘,a,’; ‘,b,’]’);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Estructuras de Control de programas&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a name="estrconcat"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;La sentencia compuesta BEGIN END&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;La sentencia compuesta establece que sus componentes que son sentencias, se ejecuten en el orden en que han sido escritas. Estas sentencias son consideradas como si fueran una sola sentencia; este concepto es vital para aquellos casos en que el ámbito de una estructura de control es una sola sentencia. Las palabras reservadas &lt;strong&gt;begin&lt;/strong&gt; y &lt;strong&gt;end&lt;/strong&gt; encierran las sentencias dentro de la sentencia compuesta y van separadas por punto y coma, antes de un end no es obligatorio su uso, si se escribe entonces la sentencia a ejecutar será la sentencia vacía. La sintaxis es:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-2_zBEk-vI/AAAAAAAAAHI/P3oBIbNhnBM/s1600-h/SentCmp.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183009629355178738" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-2_zBEk-vI/AAAAAAAAAHI/P3oBIbNhnBM/s400/SentCmp.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;begin&lt;/strong&gt; {Bloque}&lt;br /&gt;x := 5;&lt;br /&gt;ObtDatos(rAlumno);&lt;br /&gt;writeln(‘Localidad: ‘,rAlumno.Local);&lt;br /&gt;writeln(‘x: ‘,x:4)&lt;br /&gt;end&lt;strong&gt;.&lt;/strong&gt;&lt;br /&gt;&lt;a name="estrselec"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Sentencias condicionales&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Las sentencias condicionales son las que posibilitan una ruptura en la secuencia de ejecución de las sentencias, posibilitando cambiar de rumbo, es decir, poder seleccionar que acciones ejecutar si se cumple o no una condición. A continuación se presentan las variantes de este tipo de sentencias condicionales:&lt;br /&gt;&lt;a name="selecsimple"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;La sentencia condicional simple IF&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Es la sentencia más habitualmente empleada para realizar bifurcaciones o ramificaciones, ya que, con este tipo de sentencia condicional permite efectuar la más variada forma de uso para estos casos. La sintaxis es:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-3AxBEk-wI/AAAAAAAAAHQ/GnNtXhUW6l0/s1600-h/SentIf.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183010694507068162" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-3AxBEk-wI/AAAAAAAAAHQ/GnNtXhUW6l0/s400/SentIf.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;La expresión debe generar un resultado de tipo boolean. Si la expresión produce un resultado verdadero –true-, entonces se ejecuta la sentencia que sigue a then. Si la expresión produce un resultado de falso –false-, entonces se ejecuta la sentencia que sigue a else. Si la parte else no está presente entonces nada se ejecuta.&lt;br /&gt;Si una sentencia condicional if no tiene la parte else decimos que es una selección simple incompleta y si está presente es una selección simple completa. Un else se corresponde con el último if abierto, este concepto es muy importante debido a que en los casos de if’s anidados, podemos tener una situación de un if completo y dentro de este un if incompleto, ¿a que if le corresponde, entonces el único else?. Evidentemente al if interno, por lo tanto nuestra lógica estaría mal representada. La solución a estos casos obliga a usar un bloque de concatenación, encerrando al if interno, por lo cual la partícula else ahora se referirá al if externo, como era de esperar en nuestra lógica.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-3BcBEk-xI/AAAAAAAAAHY/dmaJELu-nmY/s1600-h/IfEj.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183011433241443090" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-3BcBEk-xI/AAAAAAAAAHY/dmaJELu-nmY/s400/IfEj.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;a name="selecmult"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;La sentencia condicional múltiple CASE&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Una opción a la sentencia condicional simple es la sentencia condicional múltiple. Esta sentencia permite bifurcar por más ramas o caminos, pero presenta ciertas limitaciones con respecto a la condicional simple, ya que, la expresión debe generar un valor de tipo ordinal, por lo tanto, las expresiones reales y de cadena no pueden ser empleadas para las sentencias condicionales múltiples. La sintaxis es:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-6EDBEk-9I/AAAAAAAAAI4/mAPwtoMyXKw/s1600-h/SentCase.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183225408512130002" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-6EDBEk-9I/AAAAAAAAAI4/mAPwtoMyXKw/s400/SentCase.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;La sentencia &lt;strong&gt;case&lt;/strong&gt; consiste en una expresión –selector- su resultado debe ser de tipo ordinal, y una lista de sentencias, cada una de las cuales está precedida por una o más constantes, del mismo tipo de la expresión, denominadas constantes case, o precedida con la palabra reservada &lt;strong&gt;else&lt;/strong&gt;.&lt;br /&gt;El valor ordinal del selector debe estar limitado a [-32768; 32767] y los tipos string, longint y word son inválidos para usarlos como selector.&lt;br /&gt;La sentencia case después de evaluar el resultado de la expresión compara por igual con los valores constantes case en el orden en que han sido escritas, ejecutando la sentencia correspondiente a ese caso si existió una igualdad. En caso contrario y si está presente la partícula else se ejecutará la sentencia que le sigue, sino nada se ejecutará.&lt;br /&gt;Este tipo de sentencia condicional es apta cuando se quiera evaluar una serie de valores ordinales; en lugar de emplear la sentencia condicional simple en forma anidada. Debido a esto, se hace más limpia la codificación a efectos de poder interpretar la lógica de manera más clara. No obstante, debemos tener en cuenta que este tipo de sentencia condicional no puede ser aplicada en todos los casos, es decir, es de aplicación limitada a los tipos ordinales.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ejemplos:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R-6EshEk--I/AAAAAAAAAJA/ZPXCsStn3qY/s1600-h/CaseEj.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183226121476701154" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R-6EshEk--I/AAAAAAAAAJA/ZPXCsStn3qY/s400/CaseEj.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;a 0 name="estrrepet"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Sentencias repetitivas&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Las sentencias repetitivas establecen que ciertas sentencias serán ejecutadas repetidamente. Los ciclos son tan importantes en un proceso computacional que prácticamente no existen procesos que no incluya algún ciclo. Situaciones como escribir 10, 100, 1000 o mas veces un conjunto de sentencias haría improbable la programación, más aún, ¿cuántas veces escribir esas sentencias, si la cantidad de veces a realizarse estaría establecida por alguna condición?. Imposible de no existir los ciclos. A continuación se verán diversas variantes que podemos encontrarnos con este tipo de estructuras de control. Será el buen criterio del programador seleccionar una de estas variantes ante una situación particular.&lt;br /&gt;En todo tipo de ciclos tendremos por lo general sentencias previas al inicio del ciclo, en este punto decimos &lt;strong&gt;preparar&lt;/strong&gt; la situación antes. Entre las acciones más habituales tenemos; emitir títulos y/o datos, inicializar variables. Dentro del ámbito del ciclo denominamos &lt;strong&gt;procesar&lt;/strong&gt; las acciones ubicadas en este segundo punto y por último, al salir del alcance del ciclo tenemos el &lt;strong&gt;terminar&lt;/strong&gt;, que incluye ciertas acciones como ser, emitir resultados, cálculos de promedios, porcentajes, etc..&lt;br /&gt;&lt;br /&gt;Preparar&lt;br /&gt;&lt;strong&gt;Repetir&lt;/strong&gt;&lt;br /&gt;Procesar&lt;br /&gt;&lt;strong&gt;FinRepetir&lt;/strong&gt;&lt;br /&gt;Terminar&lt;br /&gt;&lt;a name="repmientras"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;La sentencia indefinida, pre-condición, 0-X, mientras WHILE&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;La sentencia indefinida establece que la sentencia o bloque de sentencias se ejecutarán si la condiciones pre-establecida en la cabecera de esta estructura es verdadera y en caso de que se haga falsa se abandonará la repetición. La sintaxis es:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R-3FExEk-0I/AAAAAAAAAHw/XyZ7-QIrlUU/s1600-h/SentWhile.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183015431855995714" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R-3FExEk-0I/AAAAAAAAAHw/XyZ7-QIrlUU/s400/SentWhile.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;La expresión que controla la repetición debe ser de tipo boolean. Ésta es evaluada antes que la sentencia contenida sea ejecutada. La sentencia contenida es ejecutada repetidamente mientras la expresión sea verdadera. Si la expresión fuera falsa al inicio entonces nada se ejecuta. Por lo tanto, este tipo de ciclo es un ciclo en la cual la sentencia contenida puede no ejecutarse o bien ser ejecutada x veces, de ahí que también se lo denomine &lt;strong&gt;ciclo 0-x&lt;/strong&gt;. La expresión puede estar controlada por un acumulador, un valor centinela, una señal, una condición de fin de archivo como se verá más adelante, o por condiciones múltiples. Este tipo de estructura se basta por sí misma, esto quiere decir que no depende de la existencia de otras estructuras repetitivas. Aunque como se verá más adelante en ciertas condiciones particulares otra variante cíclica será más óptima para ciertos casos.&lt;br /&gt;Debemos tener sumo cuidado con esta estructura cuando se haya ingresado al ciclo y poder establecer con alguna acción que modifique el resultado de la expresión, a que en algún momento se invierta produciendo un resultado de falso para así poder abandonar el ciclo. El ámbito es de una sola sentencia, más, requiere el uso de un bloque o sentencia compuesta –concatenación-.&lt;br /&gt;En general existirá un conocer primer valor en la instancia de preparar; dentro del ciclo, procesar el valor y como última acción, dentro del ciclo, conocer próximo valor.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Preparar&lt;/strong&gt;&lt;br /&gt;Emitir títulos&lt;br /&gt;Inicializar variables&lt;br /&gt;Conocer primer valor&lt;br /&gt;&lt;strong&gt;while&lt;/strong&gt; expresión &lt;strong&gt;do begin&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Procesar&lt;/strong&gt; valor&lt;br /&gt;Conocer próximo valor&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Terminar&lt;/strong&gt;&lt;br /&gt;Cálculos finales&lt;br /&gt;Emitir resultados finales del procesar &lt;/span&gt;&lt;/div&gt;&lt;p align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejemplos:&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-3GJBEk-1I/AAAAAAAAAH4/RBnu8Lr93-4/s1600-h/WhileEj.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183016604382067538" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-3GJBEk-1I/AAAAAAAAAH4/RBnu8Lr93-4/s400/WhileEj.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;a name="repexacta"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;La sentencia exacta, pre-condición, para FOR&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;La sentencia &lt;strong&gt;for&lt;/strong&gt; hace que la sentencia contenida sea ejecutada repetidamente una cantidad exacta de veces. La sintaxis es:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R-3H1xEk-2I/AAAAAAAAAIA/qs10ibFMPKY/s1600-h/SentFor.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183018472692841314" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R-3H1xEk-2I/AAAAAAAAAIA/qs10ibFMPKY/s400/SentFor.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;En el punto de entrada o cabecera se evalúa el valor inicial y final. Cuando una sentencia for, usa la cláusula to, si el valor inicial es mayor al valor final, la sentencia dentro del ámbito del ciclo no se ejecuta. La variable de control se inicializa con el valor inicial, luego que haya ejecutado la sentencia contenida y de haber determinado que su valor es menor al valor final, la variable de control se incrementa en uno por cada repetición, en cambio, si el valor de la variable de control se hizo igual al valor final, se abandona el ciclo. La cantidad de veces que se repite el ciclo está dado por la siguiente expresión: &lt;/span&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;CantRepAsc = valFin – valIni + 1.&lt;/strong&gt; &lt;/span&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Cuando una sentencia for usa la cláusula downto, si el valor inicial es menor al valor final, la sentencia dentro del ámbito del ciclo no se ejecuta. La variable de control se inicializa con el valor inicial, luego que haya ejecutado la sentencia contenida y de haber determinado que su valor es mayor al valor final, la variable de control se decrementa en uno por cada repetición, en cambio, si el valor de la variable de control se hizo igual al valor final, se abandona el ciclo. La cantidad de veces que se repite el ciclo está dado por la siguiente expresión: &lt;/span&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;CantRepDesc = valIni – valFin + 1.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;La variable de control, como así también, el valor inicial y el valor final deben ser del mismo tipo ordinal.&lt;br /&gt;El valor de la variable de control no debe ser modificada por el programador, pero sí puede ser usada para otro propósito.&lt;br /&gt;Un ciclo for es más óptimo que un ciclo while. No obstante el ciclo for solo podrá se utilizado cuando se sabe de antemano la cantidad de veces en que se debe de ejecutar la sentencia contenida en su ámbito de alcance.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-3I5BEk-3I/AAAAAAAAAII/buVSpbrykVk/s1600-h/SentForMec.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183019628039043954" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-3I5BEk-3I/AAAAAAAAAII/buVSpbrykVk/s400/SentForMec.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;for&lt;/strong&gt; i:= 1 to 5 &lt;strong&gt;do&lt;/strong&gt;&lt;br /&gt;writeln(i);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;for&lt;/strong&gt; i:= 5 downto 1 &lt;strong&gt;do&lt;/strong&gt;&lt;br /&gt;writeln(i);&lt;br /&gt;&lt;br /&gt;write(‘Ingrese un valor inicial: ‘);&lt;br /&gt;readln(vi);&lt;br /&gt;write(‘Ingrese un valor final: ‘);&lt;br /&gt;readln(vf);&lt;br /&gt;&lt;strong&gt;for&lt;/strong&gt; i:= vi to vf &lt;strong&gt;do begin&lt;/strong&gt;&lt;br /&gt;write(‘Ingrese nombre: ‘);&lt;br /&gt;readln(Nom);&lt;br /&gt;writeln(‘¿Cómo estás?, ‘,Nom)&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;&lt;a name="rephasta"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;La sentencia indefinida, post-condición, 1-X, hasta REPEAT UNTIL&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;La sentencia &lt;strong&gt;repeat until&lt;/strong&gt; contiene una expresión que controla la ejecución repetida de una secuencia de sentencias dentro de la sentencia repeat until. La sintaxis es:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-3JyREk-4I/AAAAAAAAAIQ/yb78hhhrUHw/s1600-h/SentRepeat.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183020611586554754" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-3JyREk-4I/AAAAAAAAAIQ/yb78hhhrUHw/s400/SentRepeat.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;La sentencia debe producir un resultado de tipo boolean. Las sentencias entre los símbolos repeat y until son ejecutadas secuencialmente hasta que el resultado de la expresión se torne verdadera. Las sentencias contenidas son ejecutadas al menos una vez, debido a que la expresión es evaluada después de la ejecución de cada secuencia.&lt;br /&gt;Debemos tener sumo cuidado con esta estructura cuando se haya ingresado al ciclo y poder establecer con alguna acción que, modifique el resultado de la expresión, a que en algún momento se invierta produciendo un resultado de verdadero para así poder abandonar el ciclo. El ámbito queda establecido entre los símbolos repeat until, por lo tanto no es necesario el uso de un bloque para contener varias sentencias.&lt;br /&gt;Este tipo de ciclo debe ser utilizado con mesura, solo en aquellos casos en que al menos una vez deben ejecutarse las acciones contenidas en el ciclo, como p.e., en la creación de menú, validación de datos, determinar si un conjunto de datos está ordenado, entre ciertos otros casos. &lt;/span&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejemplos:&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-3KkREk-5I/AAAAAAAAAIY/0avhgr6zNwQ/s1600-h/RepeatEj.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5183021470580013970" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-3KkREk-5I/AAAAAAAAAIY/0avhgr6zNwQ/s400/RepeatEj.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="ABAJO"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Anterior:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/03/clase-6-estructura-de-dato-registro.html"&gt;Cadenas y Registros&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Siguiente:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/03/clase-8-archivos.html"&gt;Archivos I&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="#ARRIBA"&gt;Arriba&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100408444678612840-3265900737561862072?l=pascalgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pascalgo.blogspot.com/feeds/3265900737561862072/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5100408444678612840&amp;postID=3265900737561862072' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/3265900737561862072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/3265900737561862072'/><link rel='alternate' type='text/html' href='http://pascalgo.blogspot.com/2008/03/clase-7-lenguaje-turbo-pascal.html' title='Lenguaje Turbo Pascal'/><author><name>Lic. Hugo Cuello</name><uri>http://www.blogger.com/profile/00801409318639239421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_ISF8DP9N9hg/R-27gREk-rI/AAAAAAAAAGo/p-SSRwecqtQ/s72-c/ProgFteObjEje.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5100408444678612840.post-5024923255865335239</id><published>2008-03-28T18:46:00.000-07:00</published><updated>2008-04-12T17:05:55.585-07:00</updated><title type='text'>Estructura de dato: Registro. Tratamiento de cadenas</title><content type='html'>&lt;a name="ARRIBA"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="#ABAJO"&gt;Abajo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;CLASE 6:&lt;/strong&gt; &lt;em&gt;Estructura de dato: Registro. Tratamiento de cadenas.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:180%;"&gt;Estructuras de datos&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;a name="registro"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;El tipo registro&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;El tipo registro es una estructura de datos cuyas componentes se denominan &lt;strong&gt;campos&lt;/strong&gt;, los cuales entre ellos pueden ser de diferentes tipos, por lo tanto, el tipo registro es una estructura &lt;strong&gt;heterogénea&lt;/strong&gt;. Podemos referirnos a todo el conjunto de datos bajo un solo nombre, esto es, la variable de tipo registro, además podemos referirnos a solo una componente, usando la siguiente notación: &lt;em&gt;NombreRegistro.NombreCampo&lt;/em&gt;, en donde: &lt;em&gt;NombreRegistro&lt;/em&gt; es una variable de tipo registro y &lt;em&gt;NombreCampo&lt;/em&gt; es una de las componentes del registro. El tipo registro es una estructura de datos estática, debido a que el compilador asignará una cantidad de byte en la memoria, del tamaño de la longitud del registro, esto es la sumatoria de las longitudes de cada componente. Para definir un tipo registro se utiliza la palabra reservada record. Los campos del registro se definen dentro de su ámbito, en la sección type, por lo cual, los nombres de los campos serán de uso global, es decir, en cualquier lugar del programa, siempre nos referiremos a un campo con los mismos nombres definidos en la sección type. No así con respecto al nombre del registro que podremos dar distintos nombres según en el lugar del programa en que nos encontremos. &lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;La asignación entre registros es válida siempre y cuando sean del mismo tipo, si regA y regB son de tipo Reg, con campos cmp1, cmp2, ..., cmpn, entonces:&lt;br /&gt;&lt;br /&gt;regB &lt;-- regA, es válida, y es lo mismo que hacer: regB.cmp1 &lt;-- regA.cmp1; regB.cmp2 &lt;-- regA.cmp2; ...; regB.cmpn &lt;-- regA.cmpn. &lt;div align="justify"&gt;&lt;br /&gt;Cada campo de un tipo registro podrá ser de tipo simple o bien de tipo estructurado como es el tipo registro, en estos casos, los subcampos se definen bajo otro apartado record y la notación será, NomReg.NomCmp.NomSubCmp. El caso típico es un campo fecha y los subcampos dia, mes y año. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;strong&gt;rAlumno.FecNac.aa&lt;/strong&gt;, en donde: &lt;em&gt;rAlumno&lt;/em&gt; es una variable de tipo RegAlu, &lt;em&gt;FecNac&lt;/em&gt; es un campo de tipo Fecha y &lt;em&gt;aa&lt;/em&gt; es un subcampo de tipo word. A continuación se presenta una vista gráfica de lo que podría ser un registro de una transacción o novedad de una venta de un vendedor:&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R-2oNxEk-lI/AAAAAAAAAF4/4_5QDSwKSPU/s1600-h/Registro.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182983700637612626" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R-2oNxEk-lI/AAAAAAAAAF4/4_5QDSwKSPU/s400/Registro.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;Tamaño del registro = 16 bytes.&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;a name="pasparamreg"&gt;&lt;/a&gt;&lt;strong&gt;Pasaje de parámetros de tipo registro&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Las variables de tipo registro pueden ser pasadas como parámetros a los módulos por valor o por referencia, tanto el registro completo como una de sus componentes simples o estructuradas. A continuación se lista un programa que muestra el uso del tipo registro:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;strong&gt;Program&lt;/strong&gt; EjemploRegistro;&lt;br /&gt;&lt;strong&gt;Uses&lt;/strong&gt;&lt;br /&gt;Crt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;br /&gt;Str20 = &lt;strong&gt;string&lt;/strong&gt;[20];&lt;br /&gt;Fecha = &lt;strong&gt;record&lt;/strong&gt;&lt;br /&gt;aa : word;&lt;br /&gt;mm,&lt;br /&gt;dd : byte&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;RegAlu = &lt;strong&gt;record&lt;/strong&gt;&lt;br /&gt;NroLeg : longint;&lt;br /&gt;ApeNom,&lt;br /&gt;Domic,&lt;br /&gt;Local : str20;&lt;br /&gt;FecNac : Fecha;&lt;br /&gt;EstCiv : char;&lt;br /&gt;Trabaja : boolean;&lt;br /&gt;NroDoc : longint&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;procedure&lt;/strong&gt; ProcAlum(&lt;strong&gt;var&lt;/strong&gt; rAlu : RegAlu);&lt;br /&gt;&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;writeln(rAlu.NroLeg);&lt;br /&gt;writeln(‘Ing. Apellido y nombre: ‘);&lt;br /&gt;readln(rAlu.ApeNom)&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;procedure&lt;/strong&gt; EmiteAlum(ApeN : str20);&lt;br /&gt;&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;writeln(‘Apellido y Nombre: ‘,ApeN);&lt;br /&gt;delay(2000)&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;rAlumno,&lt;br /&gt;rAlumno2 : RegAlu;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;begin&lt;/strong&gt;&lt;br /&gt;rAlumno.NroLeg := 123456;&lt;br /&gt;writeln(rAlumno.NroLeg);&lt;br /&gt;rAlumno.FecNac.mm := 5;&lt;br /&gt;rAlumno2 := rAlumno;&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; rAlumno.NroLeg = 123456 &lt;strong&gt;then&lt;/strong&gt;&lt;br /&gt;ProcAlum(rAlumno) {Pasa todo el registro}&lt;br /&gt;&lt;strong&gt;Else&lt;/strong&gt;&lt;br /&gt;EmiteAlum(rAlumno.ApeNom) {Pasa solo el campo ApeNom}&lt;br /&gt;&lt;strong&gt;end&lt;/strong&gt;. &lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;a name="cadenas"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Tratamiento de cadenas de caracteres&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Una cadena es una disposición o conjunto de caracteres o símbolos tomados de un alfabeto, que en el caso de las PC, ese alfabeto es el ASCII. Una computadora debe ser capaz no solo de procesar valores numéricos, sino también de procesar datos no numéricos, es en esta categoría en donde entran las cadenas.&lt;br /&gt;El tratamiento de cadenas es bastante habitual, más allá de lo que podemos creer, p.e. al escribir un programa fuente en algún lenguaje de computadora, estamos utilizando cadenas, que posteriormente al compilarlo tomará esas cadenas para analizar si son palabras válidas del lenguaje empleado. Por otro lado, un programa debe poder procesar frases o mensajes, como ser:&lt;br /&gt;‘Ingrese su nombre’, ‘¿Cómo está Ud. ‘ + Nom + ‘?’, entre otras situaciones que se verán a continuación.&lt;br /&gt;La cadena &lt;strong&gt;vacía&lt;/strong&gt; es la cadena con longitud lógica = 0, y se la representa con dos apóstrofos contiguos, p.e.: cad1 &lt;-- ‘’ Un objeto variable se lo declara de tipo cadena por medio de la palabra reservada string que presenta dos formatos de uso: string o string[n], en el primer caso declara una variable con una longitud física de 256 bytes lo que permite almacenar hasta 255 caracteres y en el segundo caso declara una variable con una longitud física de n + 1 bytes lo que permite almacenar hasta n caracteres. El byte adicional está reservado para alamacenar el atributo de la longitud lógica de la cadena. Para el tratamiento de cadenas existen tres operaciones básicas, a saber. &lt;/div&gt;&lt;ul&gt;&lt;li&gt;Longitud de la cadena &lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Concatenación de cadenas &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Sub-cadenas &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div align="justify"&gt;&lt;strong&gt;Longitud de la cadena&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Toda cadena tiene una longitud finita de caracteres, determinar cuál es la cantidad de caracteres que posee una cadena, es conocer su longitud lógica, por lo tanto la entrada es una cadena y su salida es un valor entero, que indica la cantidad de caracteres que contiene en un momento determinado del proceso, ese valor estará entre cero y el máximo permitido en su declaración. La longitud lógica de una cadena es dinámica debido a que podrá cambiar en tiempo de ejecución. Por ejemplo, si cad1 &lt;-- ‘super’, para determinar la longitud lógica hacemos longitud(cad1), que responderá con un valor entero de 5. &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Concatenación de cadenas&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Es la operación que permite unir dos o más cadenas en una sola. La nueva cadena contendrá cada una de las cadenas en el orden en que han sido unidas y su longitud lógica será igual a la suma de c/u. de las longitudes lógicas de esas cadenas. Así p.e. si cad1 &lt;-- ‘super’ y cad2 &lt;-- ‘man’, &lt;strong&gt;cad&lt;/strong&gt; &lt;-- &lt;em&gt;concatenar&lt;/em&gt;(&lt;strong&gt;cad1&lt;/strong&gt;,&lt;strong&gt;cad2&lt;/strong&gt;) = &lt;strong&gt;cad1&lt;/strong&gt; + &lt;strong&gt;cad2&lt;/strong&gt; = ‘&lt;strong&gt;superman’&lt;/strong&gt; cuya longitud lógica es de 8. La operación de concatenación generalmente, no es conmutativa, vale decir que, &lt;strong&gt;cad1 + cad2 &lt;&gt; cad2 + cad1&lt;/strong&gt;, en cambio, si realizamos la siguiente operación &lt;strong&gt;cad1 + ‘’ = ‘’ + cad1&lt;/strong&gt;, notamos que genera la misma cadena resultado, o este otro ejemplo: &lt;strong&gt;‘aa’ + ‘aaaaa’ = ‘aaaaa’ + ‘aa’&lt;/strong&gt;, produce la misma cadena resultado.&lt;br /&gt;Si el resultado de concatenar cadenas resulta una cadena con longitud mayor a lo esperado, en estos casos se trunca o corta la cadena hasta la longitud máxima aceptada, p.e. si cad está definida de tipo str7, realizar cad &lt;-- ‘superman’, truncará en ‘superma’. &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Sub-cadena&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Es la operación que permite obtener una parte de una cadena, sin modificar la cadena original, en realidad se hace una copia. Así p.e., podríamos desarmar la operación de la concatenación. Para ello debemos saber que esta operación requerirá de las siguientes entradas: la cadena, el punto de inicio y la cantidad de caracteres a obtener, contando a partir del punto de inicio y obtendremos como resultado una cadena. Si queremos desarmar el contenido de cad del ejemplo anterior en sus dos partes, procederíamos de la siguiente manera:&lt;br /&gt;&lt;br /&gt;cadUno &lt;-- &lt;em&gt;subCadena&lt;/em&gt;(cad,1,longitud(cad1)) y&lt;br /&gt;cadDos &lt;-- &lt;em&gt;subCadena&lt;/em&gt;(cad,longitud(cad1) + 1,longitud(cad2))&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Nota&lt;/strong&gt;: Las palabras longitud, concatenar y subCadena han sido seleccionadas del lenguaje castellano a efectos de dar claridad a los conceptos indicados anteriormente.&lt;br /&gt;&lt;br /&gt;Una cadena puede ser tratada de dos formas:&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Completa&lt;/strong&gt;, p.e.: cad &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Individual&lt;/strong&gt; –por sus componentes, es decir, por sus caracteres o símbolos-, siendo la notación &lt;em&gt;cad[i]&lt;/em&gt;, en donde el subíndice indica la componente i, cuyo valor debe estar en el intervalo [0; n], si i = 0 entonces hace referencia a la longitud lógica de la cadena. &lt;/li&gt;&lt;/ul&gt;&lt;div align="justify"&gt;Para las operaciones de cadena tratadas en forma completa cualquier cambio que se produzca en la longitud lógica es modificada automáticamente, en cambio, cuando es tratada en forma individual y se produzca una modificación en su longitud es necesario que lo realice el programador, forzando el cambio en la componente cero con el nuevo valor de longitud lógica.&lt;br /&gt;Representación gráfica de una variable cadena en memoria, dado el siguiente tipo de dato y la declaración de variable de ese tipo de dato: &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;type&lt;/strong&gt;&lt;br /&gt;str20 = string[20];&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;br /&gt;cad : str20;&lt;br /&gt;&lt;strong&gt;longitud física&lt;/strong&gt; –estática, no cambia, definida en tiempo de compilación-&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R-2h_xEk-jI/AAAAAAAAAFo/39YZ_pCu2nU/s1600-h/cadena.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182976863049677362" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R-2h_xEk-jI/AAAAAAAAAFo/39YZ_pCu2nU/s400/cadena.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;byte de longitud lógica&lt;/strong&gt; -dinámica, su valor puede cambiar en tiempo de ejecución-.&lt;br /&gt;&lt;br /&gt;Si bien el máximo valor es 255, en realidad no debe ser mayor al valor de la longitud física previamente definido, y no menor que cero, es decir, chr(0) &lt;= cad[0] &lt;= chr(n). El valor que se establezca no ha de ser numérico, sino, ha de ser de tipo caracter. A continuación se presentan distintos valores que contendrá la variable cad definida de tipo cadena de 20 -string[20]-.&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-2v5REk-mI/AAAAAAAAAGA/uKXcBk1CwyM/s1600-h/CadEj.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182992144543316578" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-2v5REk-mI/AAAAAAAAAGA/uKXcBk1CwyM/s400/CadEj.JPG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/span&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Los 3 caracteres de signo de pregunta simbolizan el caracter que se encuentre en esas componentes.&lt;br /&gt;&lt;br /&gt;Una cadena puede ser comparada con otra, utilizando los distintos operadores de relación (&gt;, &lt;, =, &lt;&gt;, &gt;=, &lt;=). Para que una cadena sea igual a otra se deben comparar todos sus caracteres correspondientes, esta tarea la realiza directamente el lenguaje Turbo Pascal. Al igual que los números reales una cadena es no ordinal. Pero, ¿será ordinal si la tratamos individualmente?. Si asignamos a una variable destino una cantidad de símbolos mayor al que puede contener, los caracteres que sobrepasen el límite superior se truncarán, es decir, se pierden todos aquellos caracteres que sobrepasen la cantidad máxima soportada por la variable destino, esto vale cuando la tratamos en forma completa, no así cuando la tratamos en forma individual y si sobrepasamos el límite superior, entonces en estos casos estaremos invadiendo una posición de memoria desconocida, produciendo efectos catastróficos, los cuales podrían llegar a ser, que determinadas variables hayan modificado su valor, aparecer caracteres imprevistos en la pantalla, colgarse el programa, entre otros. &lt;p&gt;&lt;a name="funcprimcad"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;span style="font-family:trebuchet ms;"&gt;Funciones y Procedimientos para el tratamiento de cadenas de caracteres &lt;p&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Chr(x):&lt;/strong&gt; Retorna el caracter correspondiente al código ASCII x enviado. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Ej. car &lt;--char(65), asigna el caracter ‘A’. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ord(car):&lt;/strong&gt; Retorna el código ASCII correspondiente al caracter enviado. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Ej. x &lt;-- ord(‘A’), asigna el valor 65. Es la función inversa de chr(x). Otra forma de obtener la longitud lógica de una cadena es aplicando esta función de la siguiente manera, x &lt;-- ord(cad[0]). Asigna a x un valor entre 0 y 255, el que se encuentre en esa posición. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;UpCase(car):&lt;/strong&gt; Retorna el carácter convertido a mayúscula, si car es alfabético minúscula, sino el mismo caracter. car &lt;-- UpCase(‘a’), asigna ‘A’. car &lt;-- UpCase(‘B’), asigna ‘B’. car &lt;-- upcase(‘+’), asigna ‘+’. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Length(cad):&lt;/strong&gt; Retorna la longitud lógica de la cadena cad enviada. El valor retornado estará entre 0 y 255 como máximo. Length(cad) = ord(cad[0]. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Pos(subCad,cad):&lt;/strong&gt; Retorna cero si la subcadena subCad no se encontró en la cadena cad, sino retorna un valor &gt; 0 indicando que en esa posición se encontro a partir de ahí la subcadena en la cadena.&lt;br /&gt;Ej.: x &lt;--pos(‘ma’,’mi mama me ama’), asigna 4 a x. x &lt;-- (‘abc’,’xyzabrscbaqrbcmds’), asigna cero a x. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Copy(cad,i,x):&lt;/strong&gt; Retorna una cadena armada a partir de la cadena cad desde la posición i, con x caracteres contando a partir de la posición i.&lt;br /&gt;Ej.: cad1 ß copy(‘superman’,3,3), asigna ‘per’ a cad1. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Concat(cad1,cad2,...):&lt;/strong&gt; Retorna una cadena, resultado de unir cada una de las cadenas enviadas en el orden dado. Otra forma de lograr el mismo propósito es utilizando el operador de concatenación ‘+’.&lt;br /&gt;Ej.: cad &lt;-- concat(‘super’,’man’). cad &lt;-- ‘super’ + ‘man’. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;SizeOf(objeto):&lt;/strong&gt; Retorna un valor entero que indica el tamaño físico del objeto enviado que puede ser un tipo o una variable.&lt;br /&gt;Ej.: x &lt;-- sizeof(integer), asigna dos a x. x &lt;-- sizeof(real), asigna 6 a x. x &lt;-- sizeof(cad), asigna 21 a x si cad se definió como string[20]. x &lt;-- sizeof(str20), asigna 21 a x si str20 se definió como string[20]. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Succ(exprOrd):&lt;/strong&gt; Retorna el sucesor de exprOrd que debe ser de tipo ordinal. Salvo el último elemento que no tiene sucesor, en tal caso sería error averiguarlo, todos los demás elementos tienen sucesor. El primer elemento de una lista tiene valor ordinal cero, salvo con los enteros negativos que tendrán valores ordinales negativos.&lt;br /&gt;Ej.: x &lt;-- succ(4), asigna 5 a x. X &lt;-- succ(succ(10)), asigna 12 a x. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Pred(exprOrd):&lt;/strong&gt; Retorna el predecesor de exprOrd que debe ser de tipo ordinal. Salvo el primer elemento que no tiene predecesor, en tal caso sería error averiguarlo, todos los demás elementos tienen predecesor. El primer elemento de una lista tiene valor ordinal cero, salvo con los enteros negativos que tendrán valores ordinales negativos.&lt;br /&gt;Ej.: x &lt;-- pred(4), asigna 3 a x. X &lt;-- pred(pred(9)), asigna 7 a x. Car &lt;-- pred(‘C’), asigna ‘B’ a car. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Delete(cad,i,x):&lt;/strong&gt; Procedimiento que elimina de la cadena cad los caracteres desde la posición i una cantidad x de caracteres contando a partir de la posición i, actualiza la longitud lógica de cad.&lt;br /&gt;Ej.: cad &lt;-- ‘superman’. delete(cad,3,3), cad contiene suman y su longitud lógica es 5, se eliminaron los caracteres ‘p’, ‘e’ y ‘r’. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Insert(subCad,cad,i):&lt;/strong&gt; Procedimiento que inserta la subcadena subCad en la cadena cad a partir de la posición i, actualiza la longitud lógica de cad.&lt;br /&gt;Ej.: insert(‘per’,cad,3), ahora cad volverá a contener ‘superman’ y su longitud lógica volverá a ser de 8. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Str(x,cad):&lt;/strong&gt; Procedimiento que convierte un número x a una cadena, el resultado queda en cad.&lt;br /&gt;Ej.: str(725,cad), asigna a cad la cadena ‘725’ y su longitud lógica pasa a ser de 3. str(3825.425:0:2,cad), asigna a cad la cadena ‘3825.425’, en cambio str(3825.425,cad), asigna a cad la cadena ‘3.8254250’ que no es lo que se pretendería hacer. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Val(cad,x,cod):&lt;/strong&gt; Procedimiento que convierte una cadena cad a un valor numérico, guardando el resultado en x, si la conversión tuvo éxito, en ese caso a cod se asigna cero. Puede ocurrir que no tenga éxito la conversión, en este otro caso se detiene la conversión, en x se asigna cero y en cod se asigna un valor &gt; 0, indicando que en esa posición ocurrió un error, debido a que el caracter encontrado no pudo ser convertido a un dígito o signo + o – o el punto decimal.&lt;br /&gt;Ej.: cad &lt;-- ‘5318’. Val(cad,x,cod), asigna el valor 5318 a x, y a cod el valor 0, en cambio si cad &lt;-- ‘3a92’. Val(cad,x,cod), asigna 0 a x, y a cod el valor 2, ya que, en la posición 2 se encontró un caracter que no pudo ser convertido. &lt;strong&gt;Funciones de tratamiento de cadenas creadas por el usuario&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Al igual que con las funciones numéricas en que el usuario puede crear sus propias funciones, sucede lo mismo con las cadenas de caracteres. A continuación se presentan algunas funciones de cadenas.&lt;br /&gt;&lt;br /&gt;Función que retorna el carácter enviado convertido a minúscula si es alfabético mayúscula, sino el mismo carácter.&lt;/span&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-2wbREk-nI/AAAAAAAAAGI/HmB9tpIbdKw/s1600-h/FuncCad1.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182992728658868850" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-2wbREk-nI/AAAAAAAAAGI/HmB9tpIbdKw/s400/FuncCad1.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Función que retorna invertida una palabra enviada:&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R-2xGhEk-oI/AAAAAAAAAGQ/2Ez4vdEUjKE/s1600-h/FuncEj2.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182993471688211074" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R-2xGhEk-oI/AAAAAAAAAGQ/2Ez4vdEUjKE/s400/FuncEj2.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Una posible aplicación de la función InvPal sería comprobar si una palabra es palíndromo, es decir, capicúa, p.e.: capicua &lt;-- pal = InvPal(pal), habiendo declarado a capicua de tipo boolean, contendrá false si la palabra pal no es capicúa, sino será true. Pero, ¿podría ocurrir que al invertir una cadena, palabra de un lenguaje, la nueva cadena creada sea una palabra que pertenezca a ese mismo lenguaje?. p.e.: palreves &lt;-- invpal(‘lámina’), obviando el tilde, asigna ‘animal’, o esta otra, palreves &lt;-- invpal(‘roma’), asigna ‘amor’. Función que dado un caracter car y un número n, retorna el carácter car repetido n veces, es decir, retorna una cadena de longitud n, en donde cada componente es el caracter car. &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-2yEREk-pI/AAAAAAAAAGY/h4qtp7q9_E8/s1600-h/FuncEj3.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182994532545133202" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-2yEREk-pI/AAAAAAAAAGY/h4qtp7q9_E8/s400/FuncEj3.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;También podría realizarse la siguiente función que retorna espacios en blanco:&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-2yjBEk-qI/AAAAAAAAAGg/RQ6MTWzZ2mQ/s1600-h/FuncEj4.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182995060826110626" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-2yjBEk-qI/AAAAAAAAAGg/RQ6MTWzZ2mQ/s400/FuncEj4.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Una posible aplicación de la función space o replicate podría ser rellenar una variable de cadena con espacios a derecha, a partir de la longitud lógica + 1 hasta el final, p.e.: cad &lt;-- ‘Algoritmos’. cad &lt;-- cad + space(pred(sizeof(cad)) – length(cad)).&lt;/span&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="ABAJO"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Anterior:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/03/clase-5-mdulos.html"&gt;Procedimientos&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Siguiente:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/03/clase-7-lenguaje-turbo-pascal.html"&gt;Lenguaje Turbo Pascal&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="#ARRIBA"&gt;Arriba&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100408444678612840-5024923255865335239?l=pascalgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pascalgo.blogspot.com/feeds/5024923255865335239/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5100408444678612840&amp;postID=5024923255865335239' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/5024923255865335239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/5024923255865335239'/><link rel='alternate' type='text/html' href='http://pascalgo.blogspot.com/2008/03/clase-6-estructura-de-dato-registro.html' title='Estructura de dato: Registro. Tratamiento de cadenas'/><author><name>Lic. Hugo Cuello</name><uri>http://www.blogger.com/profile/00801409318639239421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_ISF8DP9N9hg/R-2oNxEk-lI/AAAAAAAAAF4/4_5QDSwKSPU/s72-c/Registro.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5100408444678612840.post-2349131650132550508</id><published>2008-03-27T17:29:00.000-07:00</published><updated>2008-04-12T16:09:53.523-07:00</updated><title type='text'>Módulos. Procedimientos</title><content type='html'>&lt;a name="ARRIBA"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=5100408444678612840&amp;amp;postID=2349131650132550508#ABAJO"&gt;Abajo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;CLASE 5:&lt;/strong&gt; &lt;em&gt;Módulos. Procedimientos.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:180%;"&gt;Procedimientos &lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Un procedimiento es un módulo que presenta las siguientes partes: &lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Una cabecera&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Un cuerpo &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;La cabecera presenta las siguientes partes: &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;El nombre del procedimiento&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Una lista de parámetros, que podría estar vacía &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;El cuerpo del procedimiento es un bloque, dentro del cual se escriben las sentencias. Un procedimiento lo podemos ver como una caja negra –no nos interesa saber su interior- o como una caja transparente –si nos interesa saber su interior-. Para que un procedimiento pueda ser ejecutado, se deberá &lt;strong&gt;llamarlo o invocarlo&lt;/strong&gt;. Los &lt;strong&gt;parámetros formales&lt;/strong&gt; –aquellos que se definen en la cabecera de la función, pueden ser pasados por &lt;strong&gt;valor&lt;/strong&gt;, en estos casos, se trabaja con una copia del valor pasado desde la invocación, cualquier modificación que se realice en los parámetros formales, no repercute en los &lt;strong&gt;parámetros actuales&lt;/strong&gt; –los indicados en el momento de la invocación- o pueden ser pasados por &lt;strong&gt;referencia&lt;/strong&gt;, también llamados por dirección o como los denomina el Lenguaje Pascal parámetros variables, en estos casos, lo que se envía no es el valor en sí, sino la &lt;strong&gt;dirección&lt;/strong&gt; del objeto, por lo tanto, los &lt;strong&gt;parámetros actuales enviados por referencia solo pueden ser objetos que sean variables&lt;/strong&gt;. Dentro del módulo los parámetros formales enviados por referencia contienen la dirección del parámetro actual correspondiente, cualquier valor asignado al parámetro formal, en realidad está modificando al parámetro actual. Un procedimiento se lo invoca en forma directa, debido a que es una sentencia en sí mismo, como se vió bajo el apartado sentencias simples.&lt;br /&gt;Un procedimiento puede necesitar trabajar con variables internas a su ámbito, en estos casos esas variables definidas dentro del procedimiento son denominadas &lt;strong&gt;variables locales&lt;/strong&gt;. Fuera del procedimiento en que han sido definidas no existen, salvo en los casos en que el procedimiento invoque a un módulo definido dentro de su ámbito, -módulos anidados- allí serán reconocidas. La comunicación entre el módulo que invocó al procedimiento y el procedimiento invocado se establece por medio de los parámetros.&lt;br /&gt;&lt;a name="estr1proc"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Estructura de un procedimiento:&lt;/strong&gt; -definición- &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R-w88BEk-eI/AAAAAAAAAFA/3A7G3H9AM1M/s1600-h/Procedimiento.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182584272974051810" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R-w88BEk-eI/AAAAAAAAAFA/3A7G3H9AM1M/s400/Procedimiento.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-w-kREk-fI/AAAAAAAAAFI/GJp1esV6kVs/s1600-h/ProcCab.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182586063975414258" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-w-kREk-fI/AAAAAAAAAFI/GJp1esV6kVs/s400/ProcCab.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;strong&gt;Llamada o invocación a un procedimiento&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;Ejemplo: &lt;/strong&gt;&lt;/div&gt;&lt;strong&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/strong&gt;&lt;strong&gt;NomProc(lst_par-Actuales) &lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;/strong&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Pasaje de parámetros&lt;/strong&gt;: &lt;a name="pasparam"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;p align="justify"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;Los parámetros a un procedimiento pueden ser pasados por: &lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Valor o contenido &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Referencia o dirección. &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;El &lt;strong&gt;pasaje de parámetros por valor o contenido&lt;/strong&gt;, significa que lo que se está pasando es el valor del objeto enviado que puede ser un valor constante, el contenido de una variable o el resultado de una expresión; el valor recibido por el parámetro formal realiza una copia de ese valor en un área de almacenamiento temporal el &lt;strong&gt;Stack&lt;/strong&gt; o Pila, eliminándose en el momento de abandonar el módulo; cualquier cambio que se produzca sobre ese objeto, el cambio se lo está realizando en la copia, por lo tanto el parámetro actual jamás se verá afectado de esas modificaciones.&lt;br /&gt;En cambio el &lt;strong&gt;pasaje de parámetros por referencia o dirección&lt;/strong&gt;, también llamado &lt;strong&gt;parámetro variable&lt;/strong&gt;, significa que lo que se está pasando es la dirección del objeto enviado, que &lt;strong&gt;sólo podrá ser una variable&lt;/strong&gt;. El parámetro formal correspondiente recibe la dirección de ese objeto y, cualquier valor que se le asigne, en realidad se lo está asignando al parámetro actual correspondiente, por lo tanto, no se trabaja con una copia sino con el propio objeto. La forma de establecer si un parámetro formal debe ser por referencia es indicando antes de la lista de parámetros la palabra reservada &lt;strong&gt;var&lt;/strong&gt;. Todos aquellos parámetros que deban ser pasados por valor, entonces no se debe anteponer esa palabra.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;¿Cuándo pasar parámetros por valor o por referencia?&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Usamos parámetros por valor cuando conocemos previamente el valor de esos parámetros y deseamos pasarlo al módulo para que realice algún tratamiento con esos datos; aún si se cambiara su valor dentro del módulo invocado, no afecta al parámetro actual. En cambio usamos parámetros por referencia cuando el dato se va a conocer en el módulo o sabiendo su valor debemos modificarlo y se requiere saberlo en el ámbito en que fue invocado Los parámetros actuales cuando son pasados por valor pueden ser valores constantes, variables o expresiones. En cambio los parámetros actuales cuando son pasados por referencia solo pueden ser objetos variables. &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ejemplos:&lt;br /&gt;Bloque principal&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;1: a &lt;-- 9 &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;2: Proc1(a,3,sqrt(a)+2.4,b) &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;3: Emitir(a,b) &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;F &lt;/span&gt;&lt;/div&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;4: &lt;strong&gt;Proc1(w,x:integer; y:real; var z:longint)&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;5: h &lt;-- x + y&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;6: w &lt;-- w - 2&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;7: x &lt;-- x + w&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;8: z &lt;-- h * x + 3&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;9: Emitir(h,x,z)&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;R&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;2: &lt;strong&gt;Parámetros actuales:&lt;/strong&gt; los 3 primeros son pasados por valor, por lo tanto pueden ser; variables, constantes, o expresiones, en cambio el 4to. parámetro es pasado por referencia, solo puede ser un objeto variable.&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;4: &lt;strong&gt;w, x, y&lt;/strong&gt; son parámetros formales pasados por valor, mientras que &lt;strong&gt;z&lt;/strong&gt; es un parámetro formal pasado por referencia.&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;5: &lt;strong&gt;h&lt;/strong&gt; es una variable local ¿de qué tipo, entero o real?&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;&lt;strong&gt;Prueba de escritorio&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;&lt;strong&gt;Dirección Llamada&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;d:231 d:1528 valores enviados valores recibidos ...var.loc..... Emite &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;&lt;strong&gt;...&lt;/strong&gt;a......b......................... w... x...y...... z..... ..h &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;...9.. 87. 9, 3, 5.4, d:1528...9... 3..5.4. d:1528... 8.4 ...8.4 10 87&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;..................................7...10............................ 9... 87&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;a name="procdefxusu"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Procedimientos definidos por el usuario:&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Como ya se vió en párrafos previos, un procedimiento está formado por una cabecera que contiene el nombre del procedimiento, eventualmente una lista de parámetros y el cuerpo en donde se indican las acciones a realizar. Siguiendo estos pasos el usuario podrá definir sus propios procedimientos. &lt;/div&gt;&lt;div align="justify"&gt;&lt;a name="varglobloc"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Variables globales y variables locales:&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Las variables globales se definen en tiempo de compilación, reservando el espacio en el &lt;strong&gt;segmento de datos&lt;/strong&gt; -un bloque de memoria cuyo tamaño máximo es de 64K bytes- la cantidad de bytes que corresponda al tipo de esa variable y ese espacio estará reservado hasta la finalización del programa, por lo tanto, estas variables son estáticas. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Las variables locales se definen en tiempo de compilación dentro del ámbito de un módulo –procedimientos o funciones-, pero no se reserva espacio hasta el momento en que el módulo es invocado, en ese instante se crean esas variables y al abandonar el módulo son eliminadas de esa región de memoria temporal. Esa región de memoria es el segmento del Stack o Pila, cuyo tamaño máximo es de 64K bytes. El valor por defecto reservado por el lenguaje Turbo Pascal es de 16384 bytes, pero puede ser ampliado o disminuido por medio de la directiva al compilador de ámbito global escribiéndola dentro del código del programa &lt;strong&gt;{$M Stack Size, heapmin,heapmax}&lt;/strong&gt; o por medio de los comandos de menú del IDE &lt;strong&gt;Option Compiler Memory Sizes&lt;/strong&gt;. Stack Size debe ser un valor entre 1024 y 65536 bytes y que establece el tamaño del segmento del stack, heapmin debe ser un valor en el intervalo 0 655360 bytes y heapmax debe ser un valor en el intervalo heapmin y 655360 bytes y que establece el tamaño del área del heap o montículo, región de memoria en donde se crean o eliminan las variables dinámicas en tiempo de ejecución. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Variables dinámicas:&lt;/strong&gt; &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;Las variables dinámicas se definen en tiempo de ejecución por medio del procedimiento &lt;strong&gt;new&lt;/strong&gt; y son eliminadas por medio del procedimiento &lt;strong&gt;dispose&lt;/strong&gt;. La región de memoria en donde son creadas/eliminadas es en el heap o montículo. Debido a que la cantidad de variables globales que podemos contar en un programa no puede superar el límite de 64Kbytes, bajo estas condiciones estamos en la obligación de utilizar el heap a efectos de poder incrementar el espacio para poder contar con más variables. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Código del programa:&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;El código del programa que incluye al bloque principal y todos los módulos definidos en el programa se ubican en el segmento de código cuyo tamaño máximo es de 64 Kbyte. Si se necesita un mayor tamaño estamos obligados a crear unidades, cada una de las cuales no puede superar el límite de 64 Kbytes. Estas unidades estarán referenciadas en el programa en la sección uses que incorporará el código ya compilado de la unidad a nuestro programa, logrando en consecuencia romper la barrera de los 64 Kbytes para el código del programa. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;De esta manera hemos visto que la memoria total estará dividida en cuatro regiones:&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Segmento de Datos&lt;/strong&gt; –Máximo 64 Kbytes, si se requiere un mayor tamaño utilizar variables dinámicas, esto es en el área del heap-. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Segmento de Código&lt;/strong&gt; –Máximo 64 Kbytes, para ampliar el tamaño utilizar unidades c/u. con un máximo de 64 Kbytes-. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Segmento del Stack o Pila&lt;/strong&gt; –Máximo 64 Kbytes-. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Área del heap o Montículo&lt;/strong&gt; – resto de la memoria disponible- &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Memoria convencional bajo el D.O.S. de 640Kbytes.&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/div&gt;&lt;/span&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R-xAQxEk-gI/AAAAAAAAAFQ/axXuvghxzAU/s1600-h/MemDiv.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182587927991220738" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R-xAQxEk-gI/AAAAAAAAAFQ/axXuvghxzAU/s400/MemDiv.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R-2ZvxEk-hI/AAAAAAAAAFY/sD2VRJGEaeI/s1600-h/ProcEj1.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182967792078748178" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R-2ZvxEk-hI/AAAAAAAAAFY/sD2VRJGEaeI/s400/ProcEj1.JPG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/span&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;El siguiente cuadro muestra los objetos variables globales y los objetos variables locales o parámetros formales en el segmento del Stack –Pila- en el instante de la invocación o llamada al módulo y de su retorno. Observar sus contenidos según los casos. Si el número está precedido por d: entonces indica que es una dirección de memoria. Si el parámetro formal contiene un número precedido por d: entonces en esos casos, el parámetro ha sido pasado por referencia.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-2aXREk-iI/AAAAAAAAAFg/6l0zt9DqkoI/s1600-h/ProcTbl.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182968470683580962" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-2aXREk-iI/AAAAAAAAAFg/6l0zt9DqkoI/s400/ProcTbl.JPG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;* Los parámetros o variables locales sólo existen cuando se invoca al módulo.&lt;br /&gt;--- Indica que las variables globales o locales o los parámetros correspondientes de la columna no existen. &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="ABAJO"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Anterior:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/03/mdulos-funciones-primitivas-y-definidas.html"&gt;Funciones&lt;/a&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Siguiente:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/03/clase-6-estructura-de-dato-registro.html"&gt;Cadenas y Registros.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=5100408444678612840&amp;amp;postID=2349131650132550508#ARRIBA"&gt;Arriba&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100408444678612840-2349131650132550508?l=pascalgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pascalgo.blogspot.com/feeds/2349131650132550508/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5100408444678612840&amp;postID=2349131650132550508' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/2349131650132550508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/2349131650132550508'/><link rel='alternate' type='text/html' href='http://pascalgo.blogspot.com/2008/03/clase-5-mdulos.html' title='Módulos. Procedimientos'/><author><name>Lic. Hugo Cuello</name><uri>http://www.blogger.com/profile/00801409318639239421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_ISF8DP9N9hg/R-w88BEk-eI/AAAAAAAAAFA/3A7G3H9AM1M/s72-c/Procedimiento.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5100408444678612840.post-8072007506741976911</id><published>2008-03-26T20:50:00.000-07:00</published><updated>2008-04-12T15:55:15.443-07:00</updated><title type='text'>Módulos. Funciones: Primitivas y definidas por el usuario.</title><content type='html'>&lt;a name="ARRIBA"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="#ABAJO"&gt;Abajo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;CLASE 4:&lt;/strong&gt; &lt;em&gt;Módulos. Funciones: Primitivas y definidas por el usuario&lt;br /&gt;&lt;/em&gt;&lt;a name="funciones"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:180%;"&gt;Módulos:&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;&lt;span style="font-size:180%;"&gt;Funciones.&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;En la programación modular, los programas se dividen en módulos. Un módulo es una unidad lógica de código e independiente de otros módulos, en el cual es posible analizar, codificar y probar por separado. Cada programa tiene un módulo o bloque principal que actúa como coordinador o controlador, el cual deriva el control a otros módulos. A su vez un módulo –sub-módulo- puede ceder el control temporalmente a otro módulo, el cual una vez finalizado deberá devolver el control al módulo que lo invocó. Ya que, los módulos son independientes unos de otros, una consecuencia de esto sería poder dividir el trabajo a distintos programadores a efectos de acelerar los tiempos. Además a un módulo se lo podrá modificar, sin alterar a otros módulos. Existen dos formatos de módulos, a saber:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Funciones &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Procedimientos&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Funciones: &lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;Una función es un módulo que presenta las siguientes partes:&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;ul&gt;&lt;/span&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Una cabecera &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Un cuerpo &lt;/span&gt;&lt;/li&gt;&lt;p&gt;&lt;span style="font-family:trebuchet ms;"&gt;La cabecera presenta las siguientes partes:&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;ul&gt;&lt;/span&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;El nombre de la función&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Una lista de parámetros, que podría estar vacía&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;El tipo de valor -simple- que devolverá la función&lt;/span&gt;&lt;/li&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;El cuerpo de la función es un bloque, dentro del cual se escriben las sentencias. Deberá existir alguna sentencia que asigne al nombre de la función el resultado de una expresión que debe ser de igual tipo que el valor devuelto por la función. Al finalizar la función, el último valor asignado, será el valor que retorne. Una función la podemos ver como una caja negra –no nos interesa saber su interior- o como una caja transparente –si nos interesa saber su interior-. Para que una función pueda ser ejecutada, se deberá &lt;strong&gt;llamarla o invocarla&lt;/strong&gt;. Generalmente los &lt;strong&gt;parámetros formales&lt;/strong&gt; –aquellos que se definen en la cabecera de la función, son pasados por valor, en estos casos, se trabaja con una copia del valor pasado desde la invocación, cualquier modificación que se realice en los parámetros formales, no altera a los &lt;strong&gt;parámetros actuales&lt;/strong&gt; –los indicados en el momento de la invocación-. Una función se la invoca en forma indirecta, es decir, como perteneciente a una sentencia, como p.e., la asignación interna, o como formando parte de una condición, etc..&lt;br /&gt;Una función puede necesitar trabajar con variables internas a su ámbito, en estos casos esas variables definidas dentro de la función son denominadas &lt;strong&gt;variables locales&lt;/strong&gt;. Fuera de la función en que han sido definidas no existen, salvo en los caos en que la función invoque a un módulo definido dentro de su ámbito, allí serán reconocidas. La comunicación entre el módulo que invocó a la función y la función invocada se establece por medio de los parámetros. Si bien una función puede devolver valores por medio de sus parámetros, por el momento no se emplearán.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Estructura de una función:&lt;/strong&gt; -definición&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;/li&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-sabxEk-bI/AAAAAAAAAEo/QIzTsyHGod4/s1600-h/Funcion.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182264860551215538" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-sabxEk-bI/AAAAAAAAAEo/QIzTsyHGod4/s400/Funcion.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="left"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Llamada o invocación a una función&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Var &lt;-- NomFunc(lst_par_actuales) &lt;p&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Observación:&lt;/strong&gt; Los parámetros en la invocación también suelen llamarse &lt;strong&gt;argumentos&lt;/strong&gt;. En estos casos los parámetros en la cabecera de los módulos se los puede indicar como &lt;strong&gt;parámetros&lt;/strong&gt; a secas. &lt;a name="funcprimnum"&gt;&lt;/a&gt; &lt;p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Funciones primitivas numéricas:&lt;/strong&gt; &lt;p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;A continuación se verán las funciones numéricas predefinidas por el lenguaje Pascal, para nosotros serán cajas negras, debido a que solo sabremos el nombre de la función, los parámetros a pasar, de qué tipo han de ser c/u. de ellos y en que orden deben aparecer el tipo de valor retornado por la función y que tarea realiza la función, pero no sabremos nada acerca de cómo lo realiza. &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Abs(x):tipo_x;&lt;/strong&gt; Retorna el valor absoluto de x, en donde x es cualquier valor de tipo numérico. El valor absoluto de x es x, si x &gt;= 0 o es, –x si x menor a 0, por lo tanto el valor retornado es siempre positivo. &lt;p&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:Trebuchet MS;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Sqrt(x:real):real;&lt;/strong&gt; Retorna la raíz cuadrada de x, en donde, x es &gt;= 0, el tipo de resultado es real.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Sqr(x):tipo_x;&lt;/strong&gt; Retorna el cuadrado de x, es decir, x * x. El tipo de resultado es del mismo tipo que el parámetro x.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Sin(x:real):real;&lt;/strong&gt; Retorna el seno de x. X expresa un ángulo en radianes. Para convertir grados a radianes, si x está expresado en grados, utilizar: &lt;p&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;/span&gt;&lt;div align="center"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;radianes &lt;-- x * PI / 180&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Cos(x:real):real;&lt;/strong&gt; Retorna el coseno de x. X expresa un ángulo en radianes. Para convertir grados a radianes, si x está expresado en grados, utilizar: &lt;/div&gt;&lt;p align="center"&gt;&lt;strong&gt;radianes &lt;-- x * PI / 180&lt;/strong&gt; &lt;/p&gt;&lt;div align="justify"&gt;&lt;strong&gt;ArcTan(x:real):real;&lt;/strong&gt; Retorna el arco tangente o tg-1 de x. El resultado es la medida del ángulo expresado en radianes. Para convertir de radianes a grados, utilizar: &lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;strong&gt;grados &lt;-- arctan(x) * 180 / PI&lt;/strong&gt; &lt;/p&gt;&lt;div align="justify"&gt;&lt;strong&gt;Ln(x:real):real;&lt;/strong&gt; Retorna el logaritmo natural de x, con x &gt; 0. Para obtener el logaritmo de otra base, utilizar: &lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;strong&gt;log10 &lt;-- ln(x) / ln(10); &lt;/strong&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;strong&gt;log4 &lt;-- ln(x) / ln(4) &lt;p&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="justify"&gt;es decir, se divide el ln(x) sobre el ln de la base a pasar.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Exp(x:real):real;&lt;/strong&gt; Retorna el exponencial o antilogaritmo o ln-1 de x. Exp(x) = e**x. Exp(1) = e. Para convertir la base e a otra base, utilizar: expo ß exp(x * ln(b)), es decir, multiplicar el valor de x por el ln de la base b, a pasar, y a este resultado aplicar la función exponencial.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Int(x:real):real;&lt;/strong&gt; Retorna la parte entera de x, es decir, x redondeado hacia cero; el resultado es de tipo real, con la parte decimal cero.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Trunc(x:real):longint;&lt;/strong&gt; Retorna la parte entera de x, es decir, x redondeado hacia cero, pero a diferencia de int, el tipo de resultado es de tipo longint. Ocurrirá un error si el resultado no está dentro del intervalo de un longint.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Round(x:real):longint;&lt;/strong&gt; Retorna la parte entera de x redondeado al entero más cercano, el tipo de resultado es de tipo longint. Ocurrirá un error si el resultado no está dentro del intervalo de un longint.&lt;br /&gt;round(x) = trunc(x+0.5) si x &gt;= 0 y&lt;br /&gt;round(x) = trunc(x-0.5) si x menor a 0&lt;/div&gt;&lt;div align="left"&gt;round (3.29 = 3&lt;/div&gt;&lt;div align="left"&gt;round(5.7) = 6&lt;/div&gt;&lt;div align="left"&gt;round(-451.3) = -451&lt;/div&gt;&lt;div align="left"&gt;round(-2.7) = -3 &lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;strong&gt;Frac(x:real):real;&lt;/strong&gt; Retorna la parte decimal o fraccionaria de x, esto es:&lt;br /&gt;&lt;/div&gt;&lt;div align="left"&gt;frac(x) = x – int(x). Frac(23.79) = 0.79. frac(-12.43) = -0.43.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Odd(x:longint):boolean;&lt;/strong&gt; Retorna true si x es impar o false si x es par.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Pi:real;&lt;/strong&gt; Retorna el número irracional π = 3.1415926535897932385&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Random:real;&lt;/strong&gt; &lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="left"&gt;&lt;/div&gt;&lt;div align="justify"&gt;Random(x:longint):longint: Retorna un número al azar.&lt;br /&gt;Random sin argumento genera un número al azar –en realidad pseudoaleatorio- en el intervalo semicerrado [0; 1).&lt;br /&gt;Random con argumento genera un número al azar en el intervalo [0; x – 1].&lt;br /&gt;Random(6) + 1, generará un valor en el intervalo [1; 6]&lt;br /&gt;Random(b – a + 1) + a, con a &lt;= b, generará un valor en el intervalo [a; b] &lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Randomize &lt;/strong&gt;–Procedimiento-: Los valores generados por random son pseudoaleatorios, debido a que, en distintas ejecuciones se generarán las mismas secuencias de valores. Por esa razón si queremos generar valores aleatorios para que en distintas ejecuciones se generen distintas secuencias de valores, debemos utilizar randomize al comienzo del programa; esto prepara al algoritmo de generación de números aleatorios para que la semilla, -así se denomina al punto inicial para la generación de los valores aleatorios- quede preparada con un valor de arranque, que será distinto en cada nueva ejecución del programa.&lt;p&gt;&lt;br /&gt;&lt;a name="funcdefxusu"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Funciones definidas por el usuario&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Como se vió en párrafos previos, una función está formada por una cabecera que contiene el nombre de la función, eventualmente una lista de parámetros y el tipo de valor devuelto y el cuerpo en donde se indican las acciones a realizar, en donde, al menos una de estas acciones se debe asignar al nombre de la función el resultado de una expresión del mismo tipo definido en la cabecera. Siguiendo estos pasos el usuario podrá definir sus propias funciones. A continuación se desarrollan algunas de estas funciones, de tratamiento numérico.&lt;/span&gt;&lt;/div&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-sb4hEk-cI/AAAAAAAAAEw/8wpXB3vNAaM/s1600-h/Funcion2.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182266453984082370" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-sb4hEk-cI/AAAAAAAAAEw/8wpXB3vNAaM/s400/Funcion2.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Aplicación:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Dados dos valores enteros a y b, encontrar la fracción irreducible de a / b. &lt;align="justify"&gt;&lt;/span&gt;&lt;/div&gt;&lt;p align="justify"&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R-scfREk-dI/AAAAAAAAAE4/shEkKBd4_Ig/s1600-h/InvocarFunc.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182267119704013266" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R-scfREk-dI/AAAAAAAAAE4/shEkKBd4_Ig/s400/InvocarFunc.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="ABAJO"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Anterior:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/03/sentencias-simples-y-estructuradas.html"&gt;Sentencias&lt;/a&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Siguiente:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/03/clase-5-mdulos.html"&gt;Procedimientos&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="#ARRIBA"&gt;Arriba&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100408444678612840-8072007506741976911?l=pascalgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pascalgo.blogspot.com/feeds/8072007506741976911/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5100408444678612840&amp;postID=8072007506741976911' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/8072007506741976911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/8072007506741976911'/><link rel='alternate' type='text/html' href='http://pascalgo.blogspot.com/2008/03/mdulos-funciones-primitivas-y-definidas.html' title='Módulos. Funciones: Primitivas y definidas por el usuario.'/><author><name>Lic. Hugo Cuello</name><uri>http://www.blogger.com/profile/00801409318639239421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_ISF8DP9N9hg/R-sabxEk-bI/AAAAAAAAAEo/QIzTsyHGod4/s72-c/Funcion.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5100408444678612840.post-2920348722094053937</id><published>2008-03-26T12:11:00.000-07:00</published><updated>2008-04-16T18:57:44.596-07:00</updated><title type='text'>Sentencias: Simples y Estructuradas</title><content type='html'>&lt;a name="ARRIBA"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="#ABAJO"&gt;Abajo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;CLASE 3:&lt;/strong&gt; &lt;em&gt;Sentencias: Simples y Estructuradas.&lt;/em&gt;&lt;br /&gt;&lt;a name="sentencias"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:arial;font-size:130%;"&gt;Sentencias:&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Las sentencias son acciones algorítmicas que pueden ser ejecutadas. Hay dos tipos principales de sentencias:&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Sentencias simples &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div align="justify"&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;Sentencias estructuradas&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-qhcBEk-LI/AAAAAAAAACo/pRWvWmZtrV8/s1600-h/sentencias.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182131823939221682" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-qhcBEk-LI/AAAAAAAAACo/pRWvWmZtrV8/s400/sentencias.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;a name="sentsimple"&gt;&lt;/a&gt;&lt;strong&gt;Sentencias simples:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;Una sentencia simple es una sentencia que no contiene a ninguna otra sentencia. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R-qoHREk-MI/AAAAAAAAACw/SATaUHVmY2c/s1600-h/SentSimple.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182139164038330562" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R-qoHREk-MI/AAAAAAAAACw/SATaUHVmY2c/s400/SentSimple.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Sentencia de asignación:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:Trebuchet MS;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;a name="asiginterna"&gt;&lt;/a&gt;&lt;strong&gt;Asignación interna:&lt;/strong&gt; Es utilizada para almacenar valores en variables.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R-q0zhEk-NI/AAAAAAAAAC4/eOgNaHVCN98/s1600-h/SentAsig.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182153118387075282" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R-q0zhEk-NI/AAAAAAAAAC4/eOgNaHVCN98/s400/SentAsig.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;strong&gt;Referencia a variable&lt;/strong&gt; representa una &lt;strong&gt;variable&lt;/strong&gt; e &lt;strong&gt;Identificador de función&lt;/strong&gt; el &lt;strong&gt;nombre de una función&lt;/strong&gt; y &lt;strong&gt;expresión&lt;/strong&gt; representa una &lt;strong&gt;constante&lt;/strong&gt; o una &lt;strong&gt;variable&lt;/strong&gt; o una &lt;strong&gt;expresión propiamente dicha&lt;/strong&gt;. La flecha representa la asignación.&lt;br /&gt;Se evalúa la expresión y el resultado es asignado a la variable o al identificador de la función ubicada en el miembro izquierdo de la asignación. Debe existir una correspondencia de tipos entre, el resultado de la expresión, y el tipo definido para la variable, caso contrario se generará un error de incompatibilidad de tipos. La expresión podrá estar formada por, una constante, una variable o una expresión propiamente dicha, en cambio en el miembro izquierdo de la asignación solo podrá especificarse un objeto variable o el nombre de la función dentro de su propio bloque. Cualquier valor previo que tuviera la variable en la parte izquierda de la asignación es reemplazado por el nuevo valor asignado, por lo tanto, la &lt;strong&gt;asignación es destructiva&lt;/strong&gt;. Cualquier variable situada en la parte derecha de la asignación deberá tener un valor previamente asignado, debido a que deberá leerse su contenido.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ejemplos:&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;a &lt;-- 4; a toma el valor constante entero 4 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;b &lt;-- a; b toma el valor de a &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;b &lt;-- b + 3 b toma el valor de b + 3 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;ApeNom &lt;-- ‘Perez Juan’ ApeNom toma el valor constante de cadena &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;x &lt;-- sqrt(25) ¿de qué tipo definiría a x? &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Car &lt;-- ‘h’ &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Cociente &lt;-- b div a &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Resto &lt;-- b mod a &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;existe &lt;-- true existe y negativo son de tipo boolean. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Negativo &lt;-- x MENOR 0&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;a name="sentproc"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Sentencias de Procedimientos:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;Una sentencia de procedimiento establece la activación del procedimiento indicado. Si la declaración del procedimiento correspondiente contiene una lista de &lt;em&gt;parámetros formales&lt;/em&gt;, -los parámetros listados en la definición- entonces la sentencia de procedimiento debe tener una lista de &lt;em&gt;parámetros actuales&lt;/em&gt;, -en la llamada a la sentencia-. Los parámetros actuales son pasados a los parámetros formales como parte de la llamada o invocación.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-q4XxEk-QI/AAAAAAAAADQ/eIGtJlvsvpk/s1600-h/SentProc.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182157039692216578" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-q4XxEk-QI/AAAAAAAAADQ/eIGtJlvsvpk/s400/SentProc.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;a name="asigextent"&gt;&lt;/a&gt;&lt;strong&gt;Asignación externa de entrada: &lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-rtUBEk-ZI/AAAAAAAAAEY/5dCAbx4cFVs/s1600-h/AsigExtEnt.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182215249383979410" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-rtUBEk-ZI/AAAAAAAAAEY/5dCAbx4cFVs/s400/AsigExtEnt.JPG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;em&gt;Var&lt;/em&gt; deberá ser una variable. El valor asignado a la variable indicada en el bloque se lee desde un dispositivo periférico, siendo el teclado el dispositivo por defecto. El dato a conocer puede ser leído desde otro dispositivo como ser un archivo en disco. En cualquier caso la ejecución del proceso entra en espera, a efecto de que pueda leerse el dato solicitado. Si la entrada es ingresada por teclado, luego de tipear el valor se deberá presionar la tecla ENTER tras lo cual se reanuda la ejecución del proceso con la próxima acción que continúa en la secuencia. Deberá existir coincidencia de tipos entre el valor leído y el tipo de la variable. Una cadena de caracteres o un carácter deberá ser ingresado sin apóstrofos. Si el ingreso es desde un archivo también existe una espera, solo que en estos casos dicha espera es menor, ya que el ingreso del dato se realiza electrónicamente y no requiere de la intervención manual del usuario. Los puntos suspensivos indican que se podrá escribir más de una variable separadas por comas. La ventaja de la asignación externa de entrada con respecto a la asignación interna, es que en distintas ejecuciones del programa podemos ingresar diferentes valores sin modificar el código. &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;a name="asigextsal"&gt;&lt;/a&gt;&lt;strong&gt;Asignación externa de salida:&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R-rtfhEk-aI/AAAAAAAAAEg/XGkXEu0G3pE/s1600-h/AsigExtSal.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182215446952475042" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R-rtfhEk-aI/AAAAAAAAAEg/XGkXEu0G3pE/s400/AsigExtSal.JPG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Exp puede ser una constante, una variable o bien una expresión propiamente dicha. El resultado de la expresión es enviado al dispositivo periférico que corresponda, por defecto la pantalla, otros dispositivos pueden ser archivos en disco, la impresora. Al igual que la asignación externa de entrada, también existe una espera, a efectos de dar tiempo a que se envíen los resultados, una vez que esto suceda, la ejecución del proceso continúa su marcha con la próxima acción de la secuencia. Se podrá enviar un valor constante, el contenido de una variable o bien el resultado de una expresión propiamente dicha. Los diferentes objetos van separados por comas. Si la salida va destinada a la pantalla, impresora o disco; el término empleado es emitir-mostrar, listar y grabar respectivamente. &lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejemplos de sentencias de procedimientos:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Llamada o invocación para que se ejecute&lt;br /&gt;&lt;br /&gt;Imprimir&lt;br /&gt;InterCambio(a, b)&lt;br /&gt;Encontrar(Lista, Nombre, posic)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Estructuras de control de programas&lt;/span&gt;&lt;/strong&gt;&lt;a name="estrctrlprog"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Sentencias estructuradas&lt;/strong&gt;&lt;br /&gt;Las sentencias estructuradas son construcciones compuestas por otras sentencias que son ejecutadas en secuencia, condicionalmente o repetidamente.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-q5KxEk-RI/AAAAAAAAADY/KYeQwhoNDtQ/s1600-h/SentExtr.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182157915865544978" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-q5KxEk-RI/AAAAAAAAADY/KYeQwhoNDtQ/s400/SentExtr.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;a name="sentcomp"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Sentencia compuesta o de concatenación&lt;/strong&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;La sentencia compuesta está constituida por un bloque, el cual es considerado como una unidad lógica de información. Esta estructura de control de programa es muy importante conocer, ya que, guarda una relación muy extrecha con las otras dos estructuras de control de programa: la selección y la repetición, debido a que el alcance de acción es de una sola setnencia, por lo cual si queremos que la lógica de un proceso incluya más de una acción dentro del alcance de la selección y/o la repetición, debemos encerrar estas acciones dentro de un bloque, es decir, la sentencia compuesta o de concatenación.&lt;/div&gt;&lt;div align="justify"&gt;&lt;a name="sentcond"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Sentencia condicional&lt;/span&gt;&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;strong&gt;Selección simple:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-q9GBEk-SI/AAAAAAAAADg/IASLrYw6Yc8/s1600-h/SelecSimple.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182162232307677474" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-q9GBEk-SI/AAAAAAAAADg/IASLrYw6Yc8/s400/SelecSimple.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt;Luego de ejecutar la acción &lt;em&gt;alfa&lt;/em&gt;, en el punto de entrada se evalúa la &lt;em&gt;condición&lt;/em&gt;, si el resultado es verdadero, se ejecuta la acción indicada por la acción &lt;em&gt;beta&lt;/em&gt; –rama izquierda- caso contrario, se ejecuta la acción &lt;em&gt;gamma&lt;/em&gt; –rama derecha- en ambos casos luego en el punto de salida se ejecuta la acción &lt;em&gt;delta&lt;/em&gt;. Si la acción &lt;em&gt;gamma&lt;/em&gt; no está presente –se representa por una línea en diagonal- en ese caso, nada se ejecuta, nos encontramos con una &lt;strong&gt;selección simple incompleta&lt;/strong&gt;, de lo contrario sera una &lt;strong&gt;selección simple completa&lt;/strong&gt;.&lt;br /&gt;Las acciones &lt;em&gt;alfa&lt;/em&gt; y &lt;em&gt;delta&lt;/em&gt; siempre se ejecutan por encontrarse &lt;strong&gt;fuera del alcance o ámbito&lt;/strong&gt; de la estructura de control de programa. En cambio la acción &lt;em&gt;beta&lt;/em&gt; solo se realizará si la condición resulta verdadera y &lt;em&gt;gamma&lt;/em&gt; no se realizará. Por otro lado, solo se ejecutará la acción &lt;em&gt;gamma&lt;/em&gt; si la condición resulta falsa en cuyo caso la acción &lt;em&gt;beta&lt;/em&gt; no se realizará. &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo 1:&lt;/strong&gt; Asumiendo que condición resulta verdadera entonces las acciones que se ejecutan son: alfa, beta y delta. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo 2:&lt;/strong&gt; Asumiendo que condición resulta falsa y gamma es vacía, entonces las acciones que se ejecutan son: alfa y delta. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo 3:&lt;/strong&gt; Asumiendo que condición resulta falsa y gamma no es vacía, entonces las acciones que se ejecutan son: alfa, gamma y delta. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Con este tipo de estructura es posible realizar cualquier grado de complejidad de alternativas o decisiones o selecciones.&lt;br /&gt;Es válido armar alternativas encadenadas o alternativas dentro de alternativas –en estos casos se denominan selecciones anidadas-. &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejemplo de selecciones anidadas y en secuencia:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R-q9xREk-TI/AAAAAAAAADo/gTV_kD4787U/s1600-h/SelecSim1.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182162975337019698" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R-q9xREk-TI/AAAAAAAAADo/gTV_kD4787U/s400/SelecSim1.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;a name="selmult"&gt;&lt;/a&gt;&lt;strong&gt;Selección múltiple:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-rBMxEk-UI/AAAAAAAAADw/r3-cn2tryRU/s1600-h/SelecMult.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182166746318305602" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-rBMxEk-UI/AAAAAAAAADw/r3-cn2tryRU/s400/SelecMult.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Luego de ejecutar la acción &lt;em&gt;alfa&lt;/em&gt; en el punto de entrada se evalúa la &lt;em&gt;expresión ordinal&lt;/em&gt;, el resultado es &lt;strong&gt;comparado por igual&lt;/strong&gt; con cada uno de los valores constantes de izquierda a derecha, en cuanto ocurra la primera igualdad se ingresa por la rama correspondiente y se ejecuta la acción &lt;em&gt;beta&lt;/em&gt; indicada por esa rama, en caso contrario, se ejecuta la acción gamma, en caso de estar presente. En todos los casos en el punto de salida se ejecuta la acción &lt;em&gt;delta&lt;/em&gt;.&lt;br /&gt;Esta estructura de control de programa está &lt;strong&gt;limitada a ciertos procesos&lt;/strong&gt;, debido a que la expresión debe ser de tipo ordinal. Los valores constantes también deben ser del mismo tipo ordinal que el de la expresión.&lt;br /&gt;Cada una de las Ctei puede adoptar la siguiente forma: Cte1,1,Cte1,2,Cte1,3..Cte1,4,...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;&lt;a name="repmientras"&gt;&lt;/a&gt;Repetición pre-condición&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;Repetición 0-X, Mientras o Indefinido:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-rEfBEk-VI/AAAAAAAAAD4/YOXUogMe98Q/s1600-h/Rep0x.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182170358385801554" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-rEfBEk-VI/AAAAAAAAAD4/YOXUogMe98Q/s400/Rep0x.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;Luego de ejecutarse la acción &lt;em&gt;alfa&lt;/em&gt; en el punto de entrada se evalúa la &lt;em&gt;condición&lt;/em&gt;, si el resultado es verdadero se ingresa al ciclo y ejecuta la acción &lt;em&gt;beta&lt;/em&gt;, luego en el punto de salida se vuelve otra vez a la cabecera para ser evaluada nuevamente la condición, en caso que resulte falsa se abandona el ciclo por el punto de salida y a continuación se ejecuta la acción &lt;em&gt;delta&lt;/em&gt;. Puede ocurrir que en el punto de entrada la condición resulte falsa, en ese caso la acción &lt;em&gt;beta&lt;/em&gt; jamás será ejecutada. Hay que asegurar que si se ingresa al ciclo lograr que la condición en algún momento se haga falsa, para poder abandonar la estructura cíclica. La condición podrá estar controlada por un contador, un sumador, un valor centinela, un valor boolean, una situación de fin de archivo, una condición compuesta, entre otras. Con este tipo de ciclo se pueden llevar a cabo cualquier complejidad de situaciones que requieran el uso de una estructura cíclica. Es válido construir estructuras cíclicas anidadas o en secuencia.&lt;br /&gt;&lt;a name="repexacta"&gt;&lt;/a&gt;&lt;strong&gt;Repetición Exacta o Para ascendente:&lt;/strong&gt;&lt;/span&gt; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;p align="center"&gt;&lt;strong&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-rFsBEk-WI/AAAAAAAAAEA/f76HqfNBSS8/s1600-h/RepExacAsc.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182171681235728738" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-rFsBEk-WI/AAAAAAAAAEA/f76HqfNBSS8/s400/RepExacAsc.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;Luego de ejecutarse la acción &lt;em&gt;alfa&lt;/em&gt;, en el punto de entrada, se realizan por la propia estructura de control, las siguientes acciones; si el resultado de la &lt;em&gt;expr.ini.&lt;/em&gt; es &lt;strong&gt;menor o igual&lt;/strong&gt; al resultado de la &lt;em&gt;expr.fin&lt;/em&gt;. entonces el resultado de la &lt;em&gt;expr.ini.&lt;/em&gt; es asignado a &lt;em&gt;var&lt;/em&gt; –variable de control, es una variable contadora del ciclo- y se ingresa al ciclo, ejecutándose la acción &lt;em&gt;beta&lt;/em&gt;. En el punto de salida, se llevan a cabo las siguientes acciones, -también propias de la estructura de control- si la variable de control &lt;em&gt;var&lt;/em&gt; es menor al resultado de la &lt;em&gt;expr.fin.&lt;/em&gt;, entonces &lt;em&gt;var&lt;/em&gt; toma el valor ordinal sucesor del que contiene y se vuelve a ejecutar la acción beta. Se abandona el ciclo una vez que &lt;em&gt;var&lt;/em&gt; haya alcanzado al valor de la &lt;em&gt;expr.fin.&lt;/em&gt; ejecutándose la acción &lt;em&gt;delta&lt;/em&gt;. Por otro lado, estando en el punto de entrada si el valor de la &lt;em&gt;expr.ini.&lt;/em&gt; fuera mayor al valor de la &lt;em&gt;expr.fin.&lt;/em&gt; directamente se busca el punto de salida y se ejecuta la acción &lt;em&gt;delta&lt;/em&gt;. El tipo de &lt;em&gt;var&lt;/em&gt;, la &lt;em&gt;expr.ini.&lt;/em&gt; y la &lt;em&gt;expr.fin.&lt;/em&gt; deben ser todas del mismo tipo ordinal.&lt;br /&gt;Este tipo de ciclo es de uso limitado, ya que solo sirve para valores de tipo ordinal. De todas maneras en ciertos casos es más aconsejable su uso cuando se conozca de antemano, la cantidad de veces que deba ser ejecutado. Una de las ventajas es que no se debe llevar la cuenta del contador, ya que lo gestiona la propia estructura de control.&lt;br /&gt;La cantidad de veces que se repetirán las acciones dentro del ciclo, queda establecida de la siguiente manera:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Cant.Rep.Desc. &lt;-- valor expr.ini. – valor expr.fin. + 1&lt;/strong&gt; &lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Repetición Exacta o Para descendente:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-rJVxEk-XI/AAAAAAAAAEI/6jTVwLFmVDo/s1600-h/RepExacDesc.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182175697030150514" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-rJVxEk-XI/AAAAAAAAAEI/6jTVwLFmVDo/s400/RepExacDesc.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Luego de ejecutarse la acción &lt;em&gt;alfa&lt;/em&gt;, en el punto de entrada, se realizan por la propia estructura de control, las siguientes acciones; si el resultado de la &lt;em&gt;expr.ini.&lt;/em&gt; es mayor o igual al resultado de la &lt;em&gt;expr.fin.&lt;/em&gt; entonces el resultado de la &lt;em&gt;expr.ini.&lt;/em&gt; es asignado a &lt;em&gt;var&lt;/em&gt; –variable de control, es una variable contadora del ciclo- y se ingresa al ciclo, ejecutándose la acción beta. En el punto de salida, se llevan a cabo las siguientes acciones, -también propias de la estructura de control- si la variable de control &lt;em&gt;var&lt;/em&gt; es mayor al resultado de la &lt;em&gt;expr.fin.&lt;/em&gt;, entonces &lt;em&gt;var&lt;/em&gt; toma el valor ordinal predecesor del que contiene y se vuelve a ejecutar la acción &lt;em&gt;beta&lt;/em&gt;. Se abandona el ciclo una vez que var haya alcanzado al valor de la &lt;em&gt;expr.fin.&lt;/em&gt; ejecutándose la acción &lt;em&gt;delta&lt;/em&gt;. Por otro lado, estando en el punto de entrada si el valor de la &lt;em&gt;expr.ini.&lt;/em&gt; fuera menor al valor de la &lt;em&gt;expr.fin.&lt;/em&gt; directamente se busca el punto de salida y se ejecuta la acción &lt;em&gt;delta&lt;/em&gt;. El tipo de &lt;em&gt;var&lt;/em&gt;, la &lt;em&gt;expr.ini.&lt;/em&gt; y la &lt;em&gt;expr.fin.&lt;/em&gt; deben ser todas del mismo tipo ordinal.&lt;br /&gt;Este tipo de ciclo es de uso limitado, ya que solo sirve para valores de tipo ordinal. De todas maneras en ciertos casos es más aconsejable su uso cuando se conozca de antemano, la cantidad de veces que deba ser ejecutado. Una de las ventajas es que no se debe llevar la cuenta del contador, ya que lo gestiona la propia estructura de control.&lt;br /&gt;La cantidad de veces que se repetirán las acciones dentro del ciclo, queda establecida de la siguiente manera:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Cant.Rep.Desc. &lt;-- valor expr.ini. – valor expr.fin. + 1&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Repetición post-condición: &lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;a name="rephasta"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Repetición 1-X o Hasta:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-rJ-xEk-YI/AAAAAAAAAEQ/KXvBQxMi2Eo/s1600-h/Rep1x.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5182176401404787074" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-rJ-xEk-YI/AAAAAAAAAEQ/KXvBQxMi2Eo/s400/Rep1x.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;Luego de ejecutar la acción &lt;em&gt;alfa&lt;/em&gt;, en el punto de entrada se ingresa a la estructura cíclica, ejecutándose la acción &lt;em&gt;beta&lt;/em&gt;, luego en el pié de la estructura se evalúa la &lt;em&gt;condición&lt;/em&gt;, si el resultado es &lt;strong&gt;falso, permanece en el ciclo&lt;/strong&gt;, volviéndose a ejecutar la acción &lt;em&gt;beta&lt;/em&gt;, hasta que la condición cambie de estado, es decir, cuando su resultado se haga &lt;strong&gt;verdadero, abandona el ciclo&lt;/strong&gt; y en el punto de salida se ejecute la acción &lt;em&gt;delta&lt;/em&gt;. La &lt;em&gt;condición&lt;/em&gt; podrá ser lo más compleja que se desee. Este tipo de ciclo requiere un uso específico ya que la acción &lt;em&gt;beta&lt;/em&gt; se podrá ejecutar al menos una vez, por eso a este ciclo también se lo denomina ciclo &lt;strong&gt;1-x&lt;/strong&gt;. Existen casos puntuales para su uso, a saber, creación de menú de opciones, validación de datos, ordenamiento de burbuja optimizado, y otros casos especiales.&lt;br /&gt;&lt;br /&gt;Luego de haber conocido cada una de la estructuras de control de programa, es de esperar que el alumno utilice la mejor herramienta para llevar a cabo el algoritmo. No siempre la forma en que el alumno ve la situación será la mejor de ellas, un cierto grado de experiencia va a afianzar más el criterio a adoptar en cada situación que se presente.&lt;br /&gt;Cuando determinamos que hay que utilizar una estructura repetitiva, luego nos planteamos cuál de ellas es la más adecuada, hay casos por ejemplo que aparentemente en un primer momento creemos que es un ciclo exacto, entonces no dudamos y utilizamos el ciclo exacto, pero luego vemos que en realidad no estamos obligados a alcanzar la cantidad total de repeticiones debido a que existe una segunda condición que nos hará abandonar el ciclo antes de haber alcanzo el final máximo, ahora nos damos cuenta que el ciclo apropiado es un ciclo indefinido con dos condiciones, mientras no hayamos encontrado un valor que estamos buscando y mientras no hayamos alcanzado la cantidad de repeticiones máximas, si el valor no aparece.&lt;br /&gt;En toda estructura de control condicional y repetitiva existen distintos momentos, un momento previo al punto de entrada, un momento durante entre los puntos de entrada y salida y un momento después del punto de salida. Si la estructura es repetitiva indefinida el momento previo es el de preparar acciones previas, inicializar variables, conocer primer dato; el momento durante es el de procesar los datos y conocer próximo dato y el momento después es el de terminar, emitir, cálculos a totales mayores, promedios, porcentajes, grabar, etc.. En cambio en una estructura repetitiva exacta, en el momento previo inicializamos variables pero no conocemos primer dato, sino que en el momento durante, primero conocemos dato y luego procesamos, y en el momento después realizamos las acciones de terminar. Cualquier variable que aparezca en la condición de un ciclo deberá tener un valor previamente asignado en un momento anterior.&lt;br /&gt;Lo mismo puede suceder con las alternativas simples y múltiples para determinar cuál será la estructura condicional más conveniente bajo ciertas circunstancias.&lt;br /&gt;¿Serán ciclos en secuencia, o anidados?. ¿Serán condiciones en secuencia o anidadas?. ¿Serán ciclos dentro de decisiones o decisiones dentro de ciclos?. ¿Las selecciones tendrán acciones por cada una de las ramas o solo en una de ellas?. Estas son tan solo algunas de las preguntas que nos debemos formular al momento de resolver un problema computacional.&lt;br /&gt;Como vemos la forma de combinar estas pocas &lt;strong&gt;estructuras de control de programa&lt;/strong&gt; es lo que nos da una gran diversidad de variantes, el esqueleto que formará nuestro algoritmo. No obstante, la forma esquelética de nuestros algoritmos se determinará en base a otro tipo de estructuras, las &lt;strong&gt;estructuras de datos&lt;/strong&gt;, este será entonces nuestro primer paso, a partir de allí, pensaremos como han de ser las estructuras de control de programa. Finalmente decimos que &lt;strong&gt;las estructuras de control de programa esta determinada por las estructuras de datos&lt;/strong&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="ABAJO"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Anterior:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/03/una-metodologa-de-resolucin-de_25.html"&gt;Metodología II&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Siguiente:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/03/mdulos-funciones-primitivas-y-definidas.html"&gt;Funciones&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="#ARRIBA"&gt;Arriba&lt;/a&gt; &lt;/p&gt;&lt;p align="center"&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100408444678612840-2920348722094053937?l=pascalgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pascalgo.blogspot.com/feeds/2920348722094053937/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5100408444678612840&amp;postID=2920348722094053937' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/2920348722094053937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/2920348722094053937'/><link rel='alternate' type='text/html' href='http://pascalgo.blogspot.com/2008/03/sentencias-simples-y-estructuradas.html' title='Sentencias: Simples y Estructuradas'/><author><name>Lic. Hugo Cuello</name><uri>http://www.blogger.com/profile/00801409318639239421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_ISF8DP9N9hg/R-qhcBEk-LI/AAAAAAAAACo/pRWvWmZtrV8/s72-c/sentencias.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5100408444678612840.post-7803320326407333211</id><published>2008-03-25T15:07:00.000-07:00</published><updated>2008-04-12T14:10:42.137-07:00</updated><title type='text'>Una Metodología de Resolución de Problemas II</title><content type='html'>&lt;a name="ARRIBA"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="#ABAJO"&gt;Abajo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;CLASE 2:&lt;/strong&gt; &lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;em&gt;Una Metodología de resolución de problemas II. &lt;/em&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;em&gt;&lt;span style="font-family:Trebuchet MS;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;em&gt;&lt;span style="font-family:Trebuchet MS;"&gt;&lt;/span&gt;&lt;/em&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:130%;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;div align="justify"&gt;&lt;a name="estrategia"&gt;&lt;/a&gt;&lt;br /&gt;2. Diseñar una ESTRATEGIA:&lt;br /&gt;&lt;br /&gt;Es elaborar un plan de acción global. Una planificación en la cual se establece &lt;strong&gt;qué&lt;/strong&gt; debe hacerse. Es identificar las acciones relevantes. Es ver el bosque antes que el propio árbol. Es mirar de arriba hacia abajo, es decir, de lo general a lo particular. El bosque representa lo general, mientras que el árbol representa lo particular, los &lt;strong&gt;detalles&lt;/strong&gt;. Por lo tanto, &lt;em&gt;“en el nivel de estrategia se deben establecer las acciones más importantes del proceso”&lt;/em&gt;, sin entrar en los detalles para no vernos abrumados por ellos, ya que podemos perder el rumbo, desorientarnos y hacer fracasar nuestro objetivo a resolver. La metodología que va de lo general a lo particular se conoce como &lt;em&gt;diseño descendente&lt;/em&gt; o &lt;em&gt;&lt;strong&gt;TOP – DOWN&lt;/strong&gt;&lt;/em&gt;.&lt;br /&gt;La estrategia será pues un conjunto de &lt;strong&gt;acciones relevantes&lt;/strong&gt; interrelacionadas, dispuestas en un orden lógico, que tendrá como meta alcanzar un objetivo.&lt;br /&gt;El concepto de Sistema es algo complejo de entender. Lo que hacemos para poder asimilarlo es, dividirlo en problemas menores, más fácil de comprender; si aún algunas de estas partes fuera complejo, volvemos a dividir nuevamente, hasta alcanzar un punto en el cual ya no es necesario seguir dividiendo, debido a su evidencia. La solución del Sistema queda definido cuando c/u. de estas partes brinden la solución esperada y queden establecidas las interrelaciones, conectadas por medio de interfases, que posibilitan la comunicación entre ellas.&lt;br /&gt;Divide y vencerás es el axioma de la estrategia.&lt;br /&gt;Si tomamos como Sistema un Automóvil, vemos que este es bastante difícil de comprender. Pues bien, nuestra tarea consiste entonces en dividirlo en subsistemas, los cuales podrían ser: Eléctrico, Mecánico, Frenos, Dirección, Chasis entre otros. Notamos que el Sistema Eléctrico, para nosotros es aún complejo, por lo cual decidimos volver a dividir en los siguientes subsistemas: Batería, Alternador, Bujías, Luces y Cableado. Aún podemos continuar con la Batería en: Bornes,, Nivel del Líquido, etc..&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Sistema AUTOMÓVIL&lt;/strong&gt;&lt;/span&gt; &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;strong&gt;S. ELÉCTRICO&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;strong&gt;S. BATERÍA&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;strong&gt;BORNES&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;strong&gt;NIVEL DEL LÍQUIDO&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;strong&gt;S. ALTERNADOR&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;strong&gt;S. BUJÍAS&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;strong&gt;S. LUCES Y CABLEADO&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;strong&gt;S. MECÁNICO&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;strong&gt;S. FRENOS&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;strong&gt;S. DIRECCIÓN&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;font-size:85%;"&gt;&lt;strong&gt;S. CHASIS-CARROCERÍA&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;El concepto de &lt;em&gt;caja negra&lt;/em&gt;, representa para los científicos una abstracción de detalles, conoce su interfase, sabe lo que realiza, pero no le interesa como lo hace; es este un concepto, muy importante, ya que ayuda a simplificar notablemente la idea de algún tema; lo opuesto es el de &lt;em&gt;caja transparente&lt;/em&gt;, en este caso está representando el poder ver como funcionan las cosas por dentro, los detalles de su mecanismo de acción. Al simple automovilista que solo le interesa manejar su vehículo, ve a este en cada una de sus partes como una caja negra, mientras que el mecánico necesita verlo como una caja transparente. Un televisor es también una caja negra, para el simple usuario que requiere ver un programa televisivo, él sabe qué finalidad cumple dicho aparato, también sabe que requiere de entradas y salidas, digamos alimentación eléctrica, la señal desde la antena o cable o satélite y las salidas del aparato de, imagen y sonido. Por otro lado el técnico en TV verá a ese aparato como a una caja transparente, debido a que requiere poder entender todo su mecanismo interno de funcionamiento para darle solución en caso de algún problema técnico que se presente.&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-l96REk-DI/AAAAAAAAABo/Ec-_5gVWEXM/s1600-h/CajaNyT.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5181811286234953778" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-l96REk-DI/AAAAAAAAABo/Ec-_5gVWEXM/s400/CajaNyT.JPG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;span style="font-family:arial;font-size:130%;"&gt;&lt;a name="algoritmo"&gt;&lt;/a&gt;3. Refinar la estrategia: El ALGORITMO y su prueba :&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Algoritmo:&lt;/strong&gt; Es una secuencia de acciones dadas en un orden lógico que conociendo ciertos &lt;strong&gt;datos&lt;/strong&gt; debemos obtener ciertos &lt;strong&gt;resultados esperados&lt;/strong&gt;. Ciertas acciones deberán ir antes que otras, y en determinados casos ciertas acciones podrán ir antes o después de otras indistintamente. La palabra deriva del nombre del matemático y astrónomo árabe &lt;em&gt;Alkhôwarîzmi&lt;/em&gt;&lt;/span&gt;&lt;a title="" style="mso-footnote-id: ftn1" href="http://www.blogger.com/post-create.g?blogID=5100408444678612840#_ftn1" name="_ftnref1"&gt;&lt;span style="font-family:trebuchet ms;"&gt;[1]&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt; del siglo IX.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Todo algoritmo debe ser: &lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;em&gt;Preciso&lt;/em&gt;, se debe indicar el orden de ejecución en cada paso. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;em&gt;Definido&lt;/em&gt;, cada vez que se lo realice, se deben obtener los mismos resultados. &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;em&gt;Finito&lt;/em&gt;, tiene un número determinado de acciones, debe terminar. &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;div align="justify"&gt;Las 2 herramientas más comúnmente empleadas para diseñar algoritmos son: &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Pseudocódigo:&lt;/strong&gt; utiliza palabras en castellano para indicar las acciones a realizar.&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;strong&gt;Diagramas de estructuras:&lt;/strong&gt; utiliza una representación gráfica, denominados símbolos o bloques que indican las acciones a realizar.&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="center"&gt;&lt;a href="http://bp0.blogger.com/_ISF8DP9N9hg/R-mC9REk-FI/AAAAAAAAAB4/c3AGpvbMwyw/s1600-h/SimbolosDE.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5181816835332700242" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_ISF8DP9N9hg/R-mC9REk-FI/AAAAAAAAAB4/c3AGpvbMwyw/s400/SimbolosDE.JPG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;El diseño del algoritmo se basa en dos etapas una de &lt;em&gt;análisis&lt;/em&gt; y otra de &lt;em&gt;diseño&lt;/em&gt;. En la etapa de análisis se determina &lt;strong&gt;qué&lt;/strong&gt; debe realizar, mientras que en la etapa de diseño se determina &lt;strong&gt;cómo&lt;/strong&gt; lo debe hacer. La realización de un problema complejo se lleva a cabo dividiendo el problema original en sub-problemas de menor complejidad, continuando con estas divisiones hasta alcanzar un nivel en el cual ya no es necesario seguir avanzando. Este método se conoce como &lt;strong&gt;diseño descendente&lt;/strong&gt; o &lt;em&gt;modular&lt;/em&gt;. El proceso de &lt;strong&gt;explotar&lt;/strong&gt; el problema en etapas y expresar cada paso en forma más detallada se denomina &lt;strong&gt;refinamiento sucesivo&lt;/strong&gt;.&lt;br /&gt;Todo programa bien diseñado consta de un &lt;strong&gt;bloque principal&lt;/strong&gt; –es el módulo de nivel más alto- y es el que llama a otros &lt;strong&gt;módulos&lt;/strong&gt; –de nivel más bajo- los cuales pueden llamar a otros módulos. Los algoritmos diseñados de esta forma se dice que tienen un &lt;em&gt;diseño modular&lt;/em&gt;. Cada módulo puede ser realizado, probado, depurado en forma independiente del resto. &lt;/p&gt;&lt;div align="justify"&gt;&lt;strong&gt;Programación estructurada: &lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;a name="progestructurada"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="justify"&gt;La programación estructurada significa escribir un programa de acuerdo a las siguientes reglas: &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;El algoritmo tiene un diseño modular. &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Los módulos son diseñados de modo descendente. &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Cada módulo se codifica utilizando las tres estructuras de control básicas: &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;strong&gt;Concatenación &lt;/strong&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;strong&gt;Selección &lt;/strong&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;strong&gt;Repetición &lt;/strong&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Además la programación estructurada es el conjunto de técnicas que han evolucionado desde los primeros trabajos de &lt;em&gt;Edsgar Dijkstra&lt;/em&gt; y que incorporan: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Recursos abstractos. &lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Diseño descendente. &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Estructuras básicas. &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div align="justify"&gt;El teorema de la programación estructurada establecido en mayo de 1966 por &lt;em&gt;Böhm y Jacopini&lt;/em&gt;, demostró que un &lt;em&gt;programa propio&lt;/em&gt; puede ser escrito utilizando solamente tres tipos de estructuras de control: la &lt;strong&gt;Concatenación&lt;/strong&gt;, la &lt;strong&gt;Selección&lt;/strong&gt; y la &lt;strong&gt;Repetición&lt;/strong&gt;.&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;Un programa se define como propio si cumple las siguientes características: &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Posee un solo punto de entrada y uno de salida. &lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Existen caminos desde la entrada hasta la salida que se pueden seguir y que pasan por todas las partes del programa. &lt;/div&gt;&lt;/li&gt;&lt;li&gt;Todas las acciones son ejecutables y no existen ciclos o iteraciones infinitas. &lt;strong&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;&lt;a name="terminos"&gt;&lt;/a&gt;Terminologías:&lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Palabras reservadas:&lt;/strong&gt; Es un conjunto restringido de palabras creadas por el lenguaje y que son utilizadas por él para cumplir una tarea específica. El programador debe conocer estos nombres y evitar así utilizarlos para otro propósito.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Identificador:&lt;/strong&gt; Son palabras creadas por el programador para poder identificar a diferentes objetos empleados en un algoritmo, como ser constantes con nombres, nombres de variables, de módulos, de programa, de campos, de unidades, de tipos; el cual debe seguir ciertas reglas, a saber: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Debe comenzar con una letra o subrayado, a continuación podrá seguir con letras y/o dígitos y/o subrayado –guión bajo-. &lt;/li&gt;&lt;li&gt;No hay diferencias entre mayúsculas y minúsculas. &lt;/li&gt;&lt;li&gt;Se reconocen los primeros 63 caracteres. Los restantes no serán reconocidos.&lt;br /&gt;&lt;div align="center"&gt;&lt;a href="http://bp1.blogger.com/_ISF8DP9N9hg/R-mIXhEk-GI/AAAAAAAAACA/6_XDAQyEVAM/s1600-h/Identificador.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5181822783862405218" style="CURSOR: hand" alt="" src="http://bp1.blogger.com/_ISF8DP9N9hg/R-mIXhEk-GI/AAAAAAAAACA/6_XDAQyEVAM/s400/Identificador.JPG" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="center"&gt;&lt;a href="http://bp2.blogger.com/_ISF8DP9N9hg/R-mJ9xEk-HI/AAAAAAAAACI/xGbrnQpC8Qc/s1600-h/Identificador2.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5181824540504029298" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_ISF8DP9N9hg/R-mJ9xEk-HI/AAAAAAAAACI/xGbrnQpC8Qc/s400/Identificador2.JPG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div align="justify"&gt;Además el nombre de un identificador debe ser significativo, es decir, representar su contenido, para hacer más claro el entendimiento al leer un algoritmo. El nombre que se elija no debe ser demasiado largo ni muy compacto, sino un punto de equilibrio, p.e.: para asignar el nombre de identificador a una variable que va a contener los nombres de personas, ellos podrían ser: apellidoyNombre, an, apenom, apeNom, Ape_Nom, ApeNom2, APENOM. En el 1ro. notamos que es muy largo, el 2do. es muy compacto, los restantes es una medida equilibrada. De éstos vemos que fueron escritos de diversas formas, en los casos de apenom, apeNom y APENOM hacen referencia a una misma variable –asumiendo que han sido definidas en el mismo bloque, el compilador en estos casos responderá con un mensaje de Identificador duplicado-, debido a que no hay diferencias entre mayúsculas de minúsculas, pero no sucede lo mismo con Ape_Nom o ApeNom2.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Constantes:&lt;/strong&gt; Es un valor que no cambia a lo largo de un algoritmo. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Ejemplos:&lt;/strong&gt; &lt;p&gt;&lt;br /&gt;Constantes enteras: 293, -12, 0, 15981, 3&lt;br /&gt;Constantes reales de punto fijo: 24.92, -2438.7321, 3.0, -4.2, 0.00004.&lt;br /&gt;Constantes reales de punto flotante –notación científica-: 1E6, -3.827E-7.&lt;br /&gt;Constantes booleanas o lógicas: false, true.&lt;br /&gt;Constantes carácter: ‘A’, ‘3’, ‘+’, ‘ ‘.&lt;br /&gt;Constantes de cadena: ‘esto es una cadena de caracteres’, ‘3+2’, ‘’.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Variables:&lt;/strong&gt; Contiene un valor que podrá ser modificado a lo largo de un algoritmo. Debe tener un nombre y ser definida perteneciente a un tipo de datos. Al hacer esto estamos indicando qué valores podrá contener, enteros con o sin signo, reales, booleanos, carácter, cadenas de caracteres –string-, entre otros. Cada variable ocupa un lugar de almacenamiento en la memoria interna de la computadora y de acuerdo al tipo de dato en que ha sido declarada será la cantidad de bytes que reserve.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Expresiones:&lt;/strong&gt; Están formadas por &lt;strong&gt;operandos&lt;/strong&gt; y &lt;strong&gt;operadores&lt;/strong&gt;. Los operandos pueden ser constantes, variables o funciones. Los operadores pueden ser: &lt;/p&gt;&lt;/div&gt;&lt;p align="justify"&gt;&lt;strong&gt;Aritméticos:&lt;/strong&gt; Suma +, Resta -, Multiplicación *, División real /, Cociente entero &lt;strong&gt;div&lt;/strong&gt; y Resto de división entera &lt;strong&gt;mod&lt;/strong&gt;, siendo además div y mod palabras reservadas y requiere que sus operandos sean de tipo entero. Las prioridades de estos operadores son: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;suma y resta como operadores unarios, &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;multiplicación, división, div y mod &lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;suma y la resta como operadores binarios. &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p align="justify"&gt;Para alterar las operaciones de acuerdo a esta prioridad se utilizan paréntesis que poseen la mayor prioridad. A igualdad de prioridades se evalúan las operaciones de izquierda a derecha. El resultado final de una expresión aritmética es un número. El símbolo + también es utilizado para realizar las operaciones entre &lt;strong&gt;cadenas de caracteres&lt;/strong&gt; y es la operación de &lt;strong&gt;concatenación&lt;/strong&gt; y para operaciones entre &lt;strong&gt;conjuntos&lt;/strong&gt;, es la operación de la &lt;strong&gt;Unión&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ejemplos:&lt;/strong&gt; &lt;p align="justify"&gt;2 + 3 * 5 = 17&lt;br /&gt;(2 + 3) * 5 = 25.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Relacionales o comparativos:&lt;/strong&gt; Son los siguientes: Igual =, Mayor &gt;, Menor &lt;, Distinto &lt;&gt;, Mayor o igual &gt;=, Menor o igual &lt;=, Pertenencia &lt;strong&gt;in&lt;/strong&gt;. Todos ellos están en el mismo nivel de prioridad. Son de menor jerarquía que los operadores aritméticos. El resultado final de la expresión es un valor lógico de verdad o falsedad. &lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Ejemplos:&lt;/strong&gt; &lt;/p&gt;&lt;p align="justify"&gt;3 &gt; x es verdad si el valor de x es menor o igual a 3;&lt;br /&gt;x&lt;sup&gt;2&lt;/sup&gt; – 2 &lt;= 2 * z, es falso si el resultado de la expresión aritmética del miembro izquierdo es mayor al resultado de la expresión aritmética del miembro derecho de la expresión relacional.&lt;/p&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Booleanos o lógicos:&lt;/strong&gt; Son los siguientes: &lt;strong&gt;and&lt;/strong&gt; ^, &lt;strong&gt;or&lt;/strong&gt; v, &lt;strong&gt;xor&lt;/strong&gt; v, &lt;strong&gt;not&lt;/strong&gt; ~, todas ellas palabras reservadas. Las prioridades son: 1ro. Not, 2do. And, 3ro. Or , Xor. El resultado de evaluar una expresión boolean es un valor de verdad o falsedad. Se deben encerrar las expresiones relacionales entre paréntesis cuando haya operadores booleanos, debido a las prioridades, ya que el &lt;strong&gt;not&lt;/strong&gt; está al mismo nivel que los operadores unarios, el &lt;strong&gt;and&lt;/strong&gt; al mismo nivel que los aritméticos de la multiplicación, división, cociente entero y resto entero; y el &lt;strong&gt;or&lt;/strong&gt; y &lt;strong&gt;xor&lt;/strong&gt; al mismo nivel que los operadores binarios de suma y resta. &lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Ejemplos:&lt;/strong&gt; &lt;/div&gt;&lt;br /&gt;(3 / x + 1 &gt; h – 2) ^ (a + b &lt; 2 =" sqrt(x)"&gt; t * g)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Inicializar:&lt;/strong&gt; Es asignar un valor inicial a una variable por primera vez.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Acumuladores:&lt;/strong&gt; Los acumuladores pueden ser, contadores y sumadores.&lt;br /&gt;&lt;div align="justify"&gt;&lt;br /&gt;&lt;strong&gt;Contador:&lt;/strong&gt; Es una variable que está en ambos miembros de una asignación interna, a la que se le suma un valor constante. Es necesario haber inicializado en un momento previo a esta variable, ya que va a ser leído su contenido. &lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;br /&gt;Ejemplos:&lt;/strong&gt; &lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;c &lt;-- 0; &lt;/div&gt;&lt;div align="justify"&gt;c &lt;-- c + 1 &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;br /&gt;Sumador:&lt;/strong&gt; Es una variable que está en ambos miembros de una asignación interna a la que se le suma un valor variable. Es necesario haber inicializado en un momento previo a esta variable, ya que va a ser leído su contenido. &lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Ejemplos:&lt;/strong&gt; &lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="justify"&gt;c,s &lt;-- 0; &lt;/div&gt;&lt;div align="justify"&gt;c &lt;-- c + 1; &lt;/div&gt;&lt;div align="justify"&gt;s &lt;-- s + c; &lt;/div&gt;&lt;div align="justify"&gt;c &lt;-- c + 1, &lt;/div&gt;&lt;div align="justify"&gt;s &lt;-- s + c &lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;p align="justify"&gt;&lt;strong&gt;Señales:&lt;/strong&gt; Son variables utilizadas para que nos indiquen si sucedió o no un determinado evento, al cual hemos establecido ciertos valores convenidos para indicar tal o cual situación. Si solo adoptan 2 valores posibles, entonces el tipo de dato más apropiado es el boolean.&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;p align="justify"&gt;Luego de ingresar una lista de valores se solicita informar si se ingresó algún valor negativo. Se procede de la siguiente manera: antes de ingresar algún valor se inicializa una variable, digamos negativo &lt;-- false, luego se ingresan de a uno por vez los valores y por c/u. de ellos se averigua si es MENOR 0, si es así entonces se cambia el valor de negativo &lt;-- true, por último al finalizar el ingreso de todos los valores se determina, si negativo es verdadero, se emite 'hubo algún valor negativo ingresado' o caso contrario este otro cartel 'no se ingresó ningún valor negativo'.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Auxiliar:&lt;/strong&gt; Son variables que nos auxilian en determinados procesos, el caso más típico quizás sea el de intercambiar 2 valores.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;/p&gt;&lt;div align="justify"&gt;&lt;p&gt;Se quieren intercambiar los valores de las variables a y b, realizamos entonces las siguientes acciones: a &lt;-- 4; b &lt;-- 7; aux &lt;-- a; a &lt;-- b, b &lt;-- aux; luego de esto, en la variable a quedó el valor 7 y en la variable b quedó el valor 4. &lt;/p&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Máximos y Mínimos:&lt;/strong&gt; Son variables que utilizamos para guardar el valor de un máximo o mínimo de una lista de valores. Procedemos de la siguiente manera: si el problema es de máximo inicializamos con un valor ficticio que esté por fuera de los posibles valores reales a ingresar en el proceso y que esté por debajo de esos valores reales, de tal manera que aseguremos que al ingresar el primer valor real sea reemplazado por éste, luego los próximos valores que se vayan conociendo podrán reemplazar o no al valor guardado en ese instante en la variable que hemos elegido como máximo, realizando una pregunta si el valor actual ingresado es mayor al valor guardado en la variable máximo. Al terminar el proceso estamos en condiciones de emitir o de realizar cualquier otra acción necesaria con dicha variable. Tratándose de un problema de mínimo presenta características similares, pero inicializando con un valor mayor que cualquier valor real que se ingrese en el proceso y preguntando durante el momento en que se vayan conociendo c/u. de los valores reales si es menor que el valor guardado en la variable elegida para contener el mínimo en el momento actual. Otro método a elegir podría asignarse a la variable máximo o mínimo el primer valor real ingresado, luego se procede de la manera indicada anteriormente, con los restantes datos.&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;strong&gt;&lt;div align="justify"&gt;&lt;br /&gt;Ejemplo:&lt;/strong&gt; &lt;p&gt; &lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;Se ingresan edades de personas, informar la persona con mayor edad. Inicializar MayEdad &lt;-- 0, luego por cada edad conocida se pregunta Edad &gt; MayEdad por verdad se modifica MayEdad &lt;-- Edad, caso contrario no hacemos nada. Al finalizar el ingreso de todas las edades, informamos que la persona de mayor edad tiene MayEdad años. &lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;p&gt; &lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;Temperaturas registradas en alguna región geográfica. &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;br /&gt;Promedios y Porcentajes:&lt;/strong&gt; Son cálculos que debemos realizar en el proceso. &lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;strong&gt;&lt;br /&gt;Ejemplo:&lt;/strong&gt; &lt;p&gt; &lt;p&gt;Se pide los promedios de notas en un examen de Algoritmos, en el cual se saben la cantidad de alumnos y las notas alcanzadas por c/u. de ellos. Se requiere uso de un sumador, el cual vaya sumando las notas de cada alumno, al finalizar de ingresar todas las notas, se obtiene el promedio asignando a Prom &lt;-- SumNotas / N, en donde SumNotas es la suma de todas las notas y N la cantidad de alumnos. &lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; &lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;p&gt;Se solicita obtener los porcentajes de alumnos aprobados y de alumnos reprobados en el mismo examen. Necesitamos un contador de alumnos que aprueban. Este contador se inicializa en cero, luego tras conocer c/u. de las notas de cada alumno y de comparar si es mayor o igual a 4 se sumará uno en dicho contador. Finalmente, al término de todas las notas, se calculan los porcentajes, de la siguiente forma: PorcApr &lt;-- CantApr / N x 100; PorcRepr &lt;-- (N – CantApr) / N x 100.&lt;/p&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;a title="" style="mso-footnote-id: ftn1" href="http://www.blogger.com/post-create.g?blogID=5100408444678612840#_ftnref1" name="_ftn1"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;[1]&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:trebuchet ms;"&gt; Escribió un tratado sobre manipulación de números y ecuaciones titulado Kitab al-jabr w’almugabala&lt;/span&gt;.&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;div align="justify"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="ABAJO"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Anterior:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/03/una-metodologa-de-resolucin-de.html"&gt;Metodología I&lt;/a&gt;&lt;br /&gt;&lt;p align="left"&gt;&lt;span style="color:#009900;"&gt;Siguiente:&lt;/span&gt; &lt;a href="http://pascalgo.blogspot.com/2008/03/sentencias-simples-y-estructuradas.html"&gt;Sentencias&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="#ARRIBA"&gt;Arriba&lt;/a&gt;&lt;/p&gt;&lt;p align="center"&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5100408444678612840-7803320326407333211?l=pascalgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://pascalgo.blogspot.com/feeds/7803320326407333211/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5100408444678612840&amp;postID=7803320326407333211' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/7803320326407333211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5100408444678612840/posts/default/7803320326407333211'/><link rel='alternate' type='text/html' href='http://pascalgo.blogspot.com/2008/03/una-metodologa-de-resolucin-de_25.html' title='Una Metodología de Resolución de Problemas II'/><author><name>Lic. Hugo Cuello</name><uri>http://www.blogger.com/profile/00801409318639239421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_ISF8DP9N9hg/R-l96REk-DI/AAAAAAAAABo/Ec-_5gVWEXM/s72-c/CajaNyT.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5100408444678612840.post-1991782751112359357</id><published>2008-03-24T16:57:00.000-07:00</published><updated>2008-04-13T16:43:05.849-07:00</updated><title type='text'>Una Metodología de Resolución de Problemas I</title><content type='html'>&lt;a name="ARRIBA"&gt;&lt;/a&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;a href="#ABAJO"&gt;Abajo&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;&lt;strong&gt;&lt;span style="font-family:arial;font-size:130%;"&gt;&lt;a name="Metodología"&gt;&lt;/a&gt;Una Metodología de Resolución de Problemas&lt;/span&gt;&lt;/strong&gt;&lt;a title="" style="mso-footnote-id: ftn1" href="http://www.blogger.com/post-create.g?blogID=5100408444678612840#_ftn1" name="_ftnref1"&gt;[1]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;CLASE 1&lt;/strong&gt;: &lt;em&gt;Una Metodología de Resolución de Problemas I&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;COMPRENDER&lt;/strong&gt; el problema. &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Diseñar una &lt;strong&gt;ESTRATEGIA&lt;/strong&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Refinar la estrategia: El &lt;strong&gt;ALGORITMO&lt;/strong&gt; y su prueba.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Codificar&lt;/strong&gt; el algoritmo en un Lenguaje de computadora.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Corregir &lt;strong&gt;errores de compilación&lt;/strong&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Ejecutar&lt;/strong&gt; el PROGRAMA: Con una muestra de datos bien elaborada, que incluya todos los caminos del algoritmo, con valores de datos que incluyan puntos límites, incluso sin ningún dato, valores críticos y no tanto cantidad sino variedad.&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;Depurar &lt;strong&gt;errores de LÓGICA&lt;/strong&gt;: Esto implica volver hacia atrás en las etapas, reacomodar la situación, debido a errores cometidos anteriormente, produciendo un mayor costo a si se hubiese detectado en su momento oportuno.&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;p align="center"&gt;&lt;a href="http://bp3.blogger.com/_ISF8DP9N9hg/R-hNCREk99I/AAAAAAAAAA0/BkMdvebcLK4/s1600-h/Graf1.1.JPG"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;img id="BLOGGER_PHOTO_ID_5181476072627435474" style="CURSOR: hand" alt="" src="http://bp3.blogger.com/_ISF8DP9N9hg/R-hNCREk99I/AAAAAAAAAA0/BkMdvebcLK4/s400/Graf1.1.JPG" border="0" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;En el gráfico I se observa un mayor retroceso en las etapas, debido a errores ocasionados en etapas previas y detectados en etapas posteriores. En cambio en el gráfico II se observa que los errores cometidos se han detectado en la misma etapa en que ocurrieron, es decir al pasar a una próxima etapa no debemos arrastrar errores de etapas previas. Nuestros proyectos deben corresponderse al gráfico II.&lt;br /&gt;&lt;a name="comprender"&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;1. COMPRENDER el problema:&lt;/strong&gt;&lt;br /&gt;&lt;a name="elemental"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;1.1 Problema Elemental:&lt;/strong&gt; Un problema es elemental cuando es sencillo, simple o evidente, para poder comprenderlo. Se destacan las siguientes partes: Datos, Acciones y Resultados. Un problema elemental puede ser de:&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;1.1.a Evaluación:&lt;/strong&gt; Con una ACCIÓN, p.e. un cálculo, obtenemos la solución. Ej.1: Dados los catetos de un triángulo rectángulo, hallar la medida de su hipotenusa. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;br /&gt;1.1.b Decisión:&lt;/strong&gt; Es necesario establecer una pregunta para obtener la alternativa adecuada, la cual podrá resultar en verdadero o falso. Ej.2: Dados 2 valores a y b enteros y distintos, emitir un cartel apropiado que dé a conocer cuál de ellos es mayor.&lt;br /&gt;&lt;strong&gt;&lt;a name="pteprincipal"&gt;&lt;/a&gt;&lt;br /&gt;1.2 Identificar las PARTES PRINCIPALES del problema.&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;&lt;br /&gt;1.2.a ¿Cuáles son los DATOS?, ¿cuántos?, ¿en qué instante se conocen?&lt;br /&gt;1.2.b ¿Cuáles son las ACCIONES a realizar y en qué orden lógico?&lt;br /&gt;1.2.c ¿Cuáles son los RESULTADOS?, ¿cuántos?, ¿en qué instante se forman? &lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Observación:&lt;/strong&gt; El orden de:&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;datos, &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;acciones,&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;resultados &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;obedece a un orden lógico. Este orden puede ser alterado por:&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;datos, &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;resultados, &lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;acciones&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;que obedece a un orden más práctico, ya que los datos y resultados están informados en el enunciado -directa o indirectamente-, mientras que las acciones deben ser establecidas.&lt;a name="tipo"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;1.3 Establecer el concepto de TIPO o CLASE.&lt;/strong&gt; No se deben considerar a los datos y/o resultados como un caso único, particular o singular, sino, mas bien, como pertenecientes a una clase o tipo, es decir, se deben generalizar, pluralizar, para que nuestro algoritmo funcione para ese conjunto de datos. A continuación se presentan los tipos de datos primitivos que maneja generalmente una computadora: &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:trebuchet ms;"&gt;1.3.a Enteros. &lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div align="justify"&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;strong&gt;Con signo:&lt;/strong&gt; Pierde un bit para poder establecer el signo del número. La convención es: se utiliza el bit de la extrema izquierda o sea el de mayor peso; un cero ind
