--- /dev/null
+\r
+\r
+Descripcion de los Archivos:\r
+=========== == === ========\r
+\r
+Programa Principal del TP.\r
+-------- --------- --- --\r
+ PROGRAMA.EXE Ejecutable.\r
+ PROGRAMA.PAS Codigo fuente.\r
+\r
+Programa para generar archivos de comando de TABLA.\r
+-------- ---- ------- -------- -- ------- -- -----\r
+ CMD_TBL.EXE Ejecutable.\r
+ CMD_TBL.PAS Codigo fuente.\r
+\r
+Programa para generar archivos de comando de ABO.\r
+-------- ---- ------- -------- -- ------- -- -----\r
+ CMD_ABO.EXE Ejecutable.\r
+ CMD_ABO.PAS Codigo fuente.\r
+\r
+Archivos de Prueba.\r
+-------- -- ------\r
+ TABLA.CMD Archivo de Comandos de TABLA de Prueba.\r
+ ABO.CMD Archivo de Comandos de ABO de Prueba.\r
+ SALIDA.TXT Resultados de la ejecución del programa con TABLA.CMD y ABO.CMD.\r
+ TEST.EXE Programa para probar la funcionalidad de las primitivas del ABO.\r
+ TEST.PAS Codigo fuente de este programa.\r
+ LOG.TXT Resultados de la ejecucion de TEST.EXE\r
+\r
+Unidad General para la TDA TABLA.\r
+------ ------- ---- -- ---------\r
+ GRAL.PAS Codigo fuente.\r
+ GRAL.TPU Unidad compilada.\r
+\r
+Unidad con la TDA de Lista Doblemente Enlazada.\r
+------ --- -- --- -- ----- ---------- --------\r
+ LDC.PAS Codigo fuente.\r
+ LDC.TPU Unidad compilada.\r
+\r
+Unidad con la TDA de Pila implementada con Cursores.\r
+------ --- -- --- -- ---- ------------ --- --------\r
+ PILA_C.PAS Codigo fuente.\r
+ PILA_C.TPU Unidad compilada.\r
+\r
+Unidad con Funciones, Procedimientos y Tipos Generales para trabajar con archivos de comandos.\r
+------ --- --------- -------------- - ----- --------- ---- -------- --- -------- -- --------\r
+ PROG_GRL.PAS Codigo fuente.\r
+ PROG_GRL.TPU Unidad compilada.\r
+\r
+Unidad con la TDA TABLA.\r
+------ --- -- --- -----\r
+ TABLA.PAS Codigo fuente.\r
+ TABLA.TPU Unidad compilada.\r
+\r
+Unidad con la TDA AB (arbol binario).\r
+------ --- -- --- --\r
+ AB.PAS Codigo fuente.\r
+ AB.TPU Unidad compilada.\r
+\r
+Unidad con la TDA ABO_AB (arbol binario ordenado, implementado con AB).\r
+------ --- -- --- ------\r
+ ABO_AB.PAS Codigo fuente.\r
+ ABO_AB.TPU Unidad compilada.\r
+\r
+Unidad con el procedimiento BUSCAR POR RANGO para el ABO.\r
+------ --- -- ------------- ------ --- ----- ---- -- ---\r
+ ABO_UTIL.PAS Codigo fuente.\r
+ ABO_UTIL.TPU Unidad compilada.\r
+\r
--- /dev/null
+{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang3082\deflangfe3082{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}\r
+{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f5\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Helvetica;}\r
+{\f11\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}MS Sans Serif;}{\f14\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}{\f28\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Arial Rounded MT Bold;}\r
+{\f167\froman\fcharset238\fprq2 Times New Roman CE;}{\f168\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f170\froman\fcharset161\fprq2 Times New Roman Greek;}{\f171\froman\fcharset162\fprq2 Times New Roman Tur;}\r
+{\f172\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f173\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f174\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f175\fswiss\fcharset238\fprq2 Arial CE;}\r
+{\f176\fswiss\fcharset204\fprq2 Arial Cyr;}{\f178\fswiss\fcharset161\fprq2 Arial Greek;}{\f179\fswiss\fcharset162\fprq2 Arial Tur;}{\f180\fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f181\fswiss\fcharset178\fprq2 Arial (Arabic);}\r
+{\f182\fswiss\fcharset186\fprq2 Arial Baltic;}{\f183\fmodern\fcharset238\fprq1 Courier New CE;}{\f184\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f186\fmodern\fcharset161\fprq1 Courier New Greek;}{\f187\fmodern\fcharset162\fprq1 Courier New Tur;}\r
+{\f188\fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f189\fmodern\fcharset178\fprq1 Courier New (Arabic);}{\f190\fmodern\fcharset186\fprq1 Courier New Baltic;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\r
+\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\r
+\red128\green128\blue128;\red192\green192\blue192;\red255\green255\blue255;\red179\green179\blue179;}{\stylesheet{\ql \li0\ri0\widctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \snext0 Normal;}{\*\cs10 \r
+\additive Default Paragraph Font;}{\s15\ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \snext15 Standard;}{\r
+\s16\ql \li0\ri0\sb240\sa120\keepn\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \f5\fs28\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon15 \snext17 Heading;}{\s17\ql \li0\ri0\sa120\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \r
+\f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon15 \snext17 Text body;}{\s18\qc \li0\ri0\sa120\keepn\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \b\f1\fs28\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon15 \snext15 \r
+Heading 1;}{\s19\qc \li0\ri0\sa60\keepn\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \b\i\f1\fs24\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon15 \snext15 Heading 2;}{\s20\qc \li0\ri0\keepn\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \r
+\f1\fs24\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon15 \snext15 Heading 3;}{\s21\qj \fi720\li0\ri0\keepn\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \f11\fs22\ul\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon15 \snext15 \r
+Heading 4;}{\s22\ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon15 \snext22 WW-Texto comentario;}{\s23\ql \li0\ri0\nowidctlpar\r
+\tqc\tx4320\tqr\tx8640\faauto\adjustright\rin0\lin0\itap0 \f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon15 \snext23 Header;}{\s24\ql \li0\ri0\nowidctlpar\tqc\tx4320\tqr\tx8640\faauto\adjustright\rin0\lin0\itap0 \r
+\f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon15 \snext24 Footer;}{\s25\qj \li0\ri0\sb240\keep\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \b\f28\fs24\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon15 \snext26 \r
+Ejercicio;}{\s26\ql \fi1\li720\ri0\sb120\nowidctlpar\faauto\adjustright\rin0\lin720\itap0 \i\f28\fs22\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon15 \snext26 Explicaci\'f3n Ejercicio;}{\r
+\s27\ql \fi-283\li1003\ri0\sb120\nowidctlpar\faauto\adjustright\rin0\lin1003\itap0 \f28\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon26 \snext27 Item Ejercicio;}{\s28\qj \fi720\li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \r
+\f11\fs22\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon15 \snext28 Hanging indent;}{\s29\qj \fi720\li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \i\f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon15 \snext29 \r
+WW-Sangr\'eda 2 de t. independiente;}{\s30\qj \fi1\li1134\ri0\nowidctlpar\faauto\adjustright\rin0\lin1134\itap0 \f11\fs22\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon15 \snext30 WW-Sangr\'eda 3 de t. independiente;}{\r
+\s31\ql \li0\ri0\sa120\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon17 \snext31 Table Contents;}{\s32\qc \li0\ri0\sa120\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \r
+\b\i\f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon31 \snext32 Table Heading;}{\*\cs33 \additive WW-Fuente de p\'e1rrafo predeter.;}{\*\cs34 \additive \fs16 \sbasedon33 WW-Ref. de comentario;}{\*\cs35 \additive \sbasedon33 \r
+Page Number;}{\*\cs36 \additive \scaps\f2\fs20 \sbasedon33 Codigo Pascal;}{\*\cs37 \additive \f14 WW8Num3z0;}{\*\cs38 \additive \f28 WW8Num4z0;}{\*\cs39 \additive \f28 WW8Num5z0;}{\*\cs40 \additive \f28 WW8Num6z0;}{\*\cs41 \additive \f28 WW8Num7z0;}{\*\r
+\cs42 \additive \f28 WW8Num8z0;}{\*\cs43 \additive \f14 WW8Num9z0;}{\*\cs44 \additive \f14 WW8Num10z0;}{\*\cs45 \additive \f28 WW8Num11z0;}{\*\cs46 \additive \f14 WW8Num13z0;}{\*\cs47 \additive \f28 WW8Num14z0;}{\*\cs48 \additive \f14 WW8Num15z0;}{\*\r
+\cs49 \additive \f3 WW8Num16z0;}{\*\cs50 \additive \f2 WW8Num16z1;}{\*\cs51 \additive \f14 WW8Num16z2;}{\*\cs52 \additive \f3 WW8Num16z3;}{\*\cs53 \additive \f2 WW8Num16z4;}{\*\cs54 \additive \f14 WW8Num16z5;}{\*\cs55 \additive \f3 WW8Num16z6;}{\*\cs56 \r
+\additive \f2 WW8Num16z7;}{\*\cs57 \additive \f14 WW8Num16z8;}{\*\cs58 \additive \f3 WW8Num17z0;}{\*\cs59 \additive \f3 WW8Num18z0;}{\*\cs60 \additive \f3 WW8Num19z0;}{\*\cs61 \additive \f3 WW8Num20z0;}{\*\cs62 \additive \f28 WW8Num21z0;}{\*\cs63 \r
+\additive \f14 WW8Num23z0;}{\*\cs64 \additive \f3 WW8Num24z0;}{\*\cs65 \additive \f3 WW8Num26z0;}{\*\cs66 \additive \f28 WW8Num27z0;}{\*\cs67 \additive \f3 WW8NumSt2z0;}{\*\cs68 \additive \f5 WW8NumSt26z0;}{\s69\ql \li0\ri0\widctlpar\r
+\tqc\tx4252\tqr\tx8504\faauto\adjustright\rin0\lin0\itap0 \fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon0 \snext69 header;}{\s70\ql \li0\ri0\widctlpar\tqc\tx4252\tqr\tx8504\faauto\adjustright\rin0\lin0\itap0 \r
+\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \sbasedon0 \snext70 footer;}{\*\cs71 \additive \sbasedon10 page number;}}{\*\listtable{\list\listtemplateid1{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\r
+\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-1080\li1800 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\r
+\'02\'01.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\chbrdr\r
+\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-180\li2520 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \r
+\chshdng0\chcfpat1\chcbpat1 \fi-360\li3240 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \r
+\fi-360\li3960 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-180\li4680 }{\listlevel\levelnfc0\r
+\levelnfcn0\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li5400 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\r
+\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li6120 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow2\levelstartat1\levelspace0\r
+\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-180\li6840 }{\listname WW8Num22;}\listid1}{\list\listtemplateid2{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\r
+\levelstartat0\levelspace0\levelindent0{\leveltext\'01\'b7;}{\levelnumbers;}\f3\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li1080 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0\r
+{\leveltext\'01o;}{\levelnumbers;}\f2\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li1800 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'a7;}{\levelnumbers;}\f14\r
+\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li2520 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'b7;}{\levelnumbers;}\f3\chbrdr\brdrnone\brdrcf1 \r
+\chshdng0\chcfpat1\chcbpat1 \fi-360\li3240 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li3960 }\r
+{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'a7;}{\levelnumbers;}\f14\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li4680 }{\listlevel\levelnfc23\levelnfcn23\r
+\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0{\leveltext\'01\'b7;}{\levelnumbers;}\f3\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li5400 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\r
+\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li6120 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow2\levelstartat1\levelspace0\levelindent0\r
+{\leveltext\'01\'a7;}{\levelnumbers;}\f14\chbrdr\brdrnone\brdrcf1 \chshdng0\chcfpat1\chcbpat1 \fi-360\li6840 }{\listname WW8Num16;}\listid2}}{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}}\r
+{\info{\title 1\'ba TP 1\'ba 2000}{\author RUTH GHIZZARDI}{\keywords 7541 algo 2cuat2000 1par1TP}{\operator Leandro Lucarella}{\creatim\yr2000\mo5\dy22\hr15\min39}{\revtim\yr2000\mo6\dy20\hr16\min25}{\printim\yr2000\mo5\dy22\hr18\min40}{\version4}\r
+{\edmins34}{\nofpages1}{\nofwords315}{\nofchars1797}{\*\company HOSPITAL GARRAHAN}{\nofcharsws0}{\vern8249}}\margl1134\margr1134\margt2268\margb964 \r
+\widowctrl\ftnbj\aenddoc\hyphhotz425\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale114\viewzk2\nolnhtadjtbl \fet0\sectd \r
+\psz1\sbknone\linex0\headery709\footery709\colsx709\sectdefaultcl {\header \trowd \trqc\trleft-30\trftsWidth1 \clvertalt\clbrdrt\brdrs\brdrw20\brsp40\brdrcf15 \clbrdrl\brdrs\brdrw20\brsp40\brdrcf15 \clbrdrb\brdrnone \clbrdrr\brdrnone \r
+\clcbpat18\cltxlrtb\clftsWidth3\clwWidth6237 \cellx6207\clvertalt\clbrdrt\brdrs\brdrw20\brsp40\brdrcf15 \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrs\brdrw20\brsp40\brdrcf15 \clcbpat18\cltxlrtb\clftsWidth3\clwWidth3970 \cellx10177\pard\plain \r
+\s19\qc \li0\ri0\keepn\nowidctlpar\intbl\faauto\adjustright\rin0\lin0 \b\i\f1\fs24\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\fs20 Algoritmos y Programacion II\r
+\par }\pard\plain \s20\qc \li0\ri0\keepn\nowidctlpar\intbl\faauto\adjustright\rin0\lin0 \f1\fs24\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\fs20 Catedra Licenciado Gustavo Carolo\cell }\pard\plain \r
+\s19\qc \li0\ri0\keepn\nowidctlpar\intbl\faauto\adjustright\rin0\lin0 \b\i\f1\fs24\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\fs20 Trabajo Practico 2\r
+\par Arboles}{\fs28\cf8 \cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\faauto\adjustright\rin0\lin0 \fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\fs28\cf8 \trowd \trqc\trleft-30\trftsWidth1 \clvertalt\clbrdrt\brdrs\brdrw20\brsp40\brdrcf15 \clbrdrl\r
+\brdrs\brdrw20\brsp40\brdrcf15 \clbrdrb\brdrnone \clbrdrr\brdrnone \clcbpat18\cltxlrtb\clftsWidth3\clwWidth6237 \cellx6207\clvertalt\clbrdrt\brdrs\brdrw20\brsp40\brdrcf15 \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrs\brdrw20\brsp40\brdrcf15 \r
+\clcbpat18\cltxlrtb\clftsWidth3\clwWidth3970 \cellx10177\row }\trowd \trqc\trleft-30\trftsWidth1 \clvertalt\clbrdrt\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrl\brdrs\brdrw20\brsp40\brdrcf15 \clbrdrb\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrr\brdrnone \r
+\clcbpat8\cltxlrtb\clftsWidth3\clwWidth1985 \cellx1955\clvertalt\clbrdrt\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrr\brdrnone \clcbpat8\cltxlrtb\clftsWidth3\clwWidth5103 \cellx7058\clvertalt\clbrdrt\r
+\brdrnone \clbrdrl\brdrs\brdrw20\brsp40\brdrcf15 \clbrdrb\brdrnone \clbrdrr\brdrs\brdrw20\brsp40\brdrcf15 \clcbpat8\cltxlrtb\clftsWidth3\clwWidth1418 \cellx8476\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\r
+\brdrs\brdrw20\brsp40\brdrcf15 \clcbpat8\cltxlrtb\clftsWidth3\clwWidth1701 \cellx10177\pard\plain \s23\qr \li0\ri0\nowidctlpar\intbl\tqc\tx4320\tqr\tx8640\faauto\adjustright\rin0\lin0 \f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\b\i Grupo\r
+\cell }\pard \s23\ql \li0\ri0\nowidctlpar\intbl\tqc\tx4320\tqr\tx8640\faauto\adjustright\rin0\lin0 {\cell \cell \cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\faauto\adjustright\rin0\lin0 \fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\trowd \r
+\trqc\trleft-30\trftsWidth1 \clvertalt\clbrdrt\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrl\brdrs\brdrw20\brsp40\brdrcf15 \clbrdrb\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrr\brdrnone \clcbpat8\cltxlrtb\clftsWidth3\clwWidth1985 \cellx1955\clvertalt\clbrdrt\r
+\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrr\brdrnone \clcbpat8\cltxlrtb\clftsWidth3\clwWidth5103 \cellx7058\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw20\brsp40\brdrcf15 \clbrdrb\brdrnone \clbrdrr\r
+\brdrs\brdrw20\brsp40\brdrcf15 \clcbpat8\cltxlrtb\clftsWidth3\clwWidth1418 \cellx8476\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrs\brdrw20\brsp40\brdrcf15 \clcbpat8\cltxlrtb\clftsWidth3\clwWidth1701 \cellx10177\row \r
+}\trowd \trqc\trleft-30\trftsWidth1 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw20\brsp40\brdrcf15 \clbrdrb\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrr\brdrnone \clcbpat8\cltxlrtb\clftsWidth3\clwWidth1985 \cellx1955\clvertalt\clbrdrt\brdrnone \clbrdrl\r
+\brdrnone \clbrdrb\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrr\brdrnone \clcbpat8\cltxlrtb\clftsWidth3\clwWidth5103 \cellx7058\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw20\brsp40\brdrcf15 \clbrdrb\brdrnone \clbrdrr\brdrs\brdrw20\brsp40\brdrcf15 \r
+\clcbpat8\cltxlrtb\clftsWidth3\clwWidth1418 \cellx8476\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrs\brdrw20\brsp40\brdrcf15 \clcbpat8\cltxlrtb\clftsWidth3\clwWidth1701 \cellx10177\pard\plain \r
+\s23\qr \li0\ri0\nowidctlpar\intbl\tqc\tx4320\tqr\tx8640\faauto\adjustright\rin0\lin0 \f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\b\i Nota \cell }\pard \s23\ql \li0\ri0\nowidctlpar\intbl\r
+\tqc\tx4320\tqr\tx8640\faauto\adjustright\rin0\lin0 {\cell \cell \cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\faauto\adjustright\rin0\lin0 \fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\trowd \trqc\trleft-30\trftsWidth1 \clvertalt\clbrdrt\r
+\brdrnone \clbrdrl\brdrs\brdrw20\brsp40\brdrcf15 \clbrdrb\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrr\brdrnone \clcbpat8\cltxlrtb\clftsWidth3\clwWidth1985 \cellx1955\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrr\r
+\brdrnone \clcbpat8\cltxlrtb\clftsWidth3\clwWidth5103 \cellx7058\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw20\brsp40\brdrcf15 \clbrdrb\brdrnone \clbrdrr\brdrs\brdrw20\brsp40\brdrcf15 \clcbpat8\cltxlrtb\clftsWidth3\clwWidth1418 \cellx8476\clvertalt\r
+\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrs\brdrw20\brsp40\brdrcf15 \clcbpat8\cltxlrtb\clftsWidth3\clwWidth1701 \cellx10177\row }\trowd \trqc\trleft-30\trftsWidth1 \clvertalt\clbrdrt\brdrnone \clbrdrl\r
+\brdrs\brdrw20\brsp40\brdrcf15 \clbrdrb\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrr\brdrnone \clcbpat8\cltxlrtb\clftsWidth3\clwWidth1985 \cellx1955\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrr\brdrnone \r
+\clcbpat8\cltxlrtb\clftsWidth3\clwWidth5103 \cellx7058\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw20\brsp40\brdrcf15 \clbrdrb\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrr\brdrs\brdrw20\brsp40\brdrcf15 \clcbpat8\cltxlrtb\clftsWidth3\clwWidth1418 \cellx8476\r
+\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrr\brdrs\brdrw20\brsp40\brdrcf15 \clcbpat8\cltxlrtb\clftsWidth3\clwWidth1701 \cellx10177\pard\plain \s23\qr \li0\ri0\nowidctlpar\intbl\r
+\tqc\tx4320\tqr\tx8640\faauto\adjustright\rin0\lin0 \f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\b\i Corrigi\'f3\cell }\pard \s23\ql \li0\ri0\nowidctlpar\intbl\tqc\tx4320\tqr\tx8640\faauto\adjustright\rin0\lin0 {\cell \cell \cell \r
+}\pard\plain \ql \li0\ri0\widctlpar\intbl\faauto\adjustright\rin0\lin0 \fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\trowd \trqc\trleft-30\trftsWidth1 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw20\brsp40\brdrcf15 \clbrdrb\r
+\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrr\brdrnone \clcbpat8\cltxlrtb\clftsWidth3\clwWidth1985 \cellx1955\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrr\brdrnone \clcbpat8\cltxlrtb\clftsWidth3\clwWidth5103 \r
+\cellx7058\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw20\brsp40\brdrcf15 \clbrdrb\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrr\brdrs\brdrw20\brsp40\brdrcf15 \clcbpat8\cltxlrtb\clftsWidth3\clwWidth1418 \cellx8476\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \r
+\clbrdrb\brdrs\brdrw20\brsp40\brdrcf16 \clbrdrr\brdrs\brdrw20\brsp40\brdrcf15 \clcbpat8\cltxlrtb\clftsWidth3\clwWidth1701 \cellx10177\row }\pard\plain \s23\ql \li0\ri0\nowidctlpar\tqc\tx4320\tqr\tx8640\faauto\adjustright\rin0\lin0\itap0 \r
+\f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\r
+\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}\r
+{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\r
+\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \s28\qj \fi720\li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \r
+\f11\fs22\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {Se desea definir e implementar un TDA \'93ABO\'94 Arbol binario Ordenado para lo cual se debera usar un AB Arbol Binario. El registro a almacenar sera de el siguiente:\r
+\par }\pard\plain \s15\qj \li1134\ri0\nowidctlpar\faauto\adjustright\rin0\lin1134\itap0 \f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\f0\fs22 \tab }{\f0\fs22\lang1033\langfe3082\langnp1033 T_ELEM = record\r
+\par \tab \tab DNI\tab \tab : string[8]; (CLAVE DEL ABO)\r
+\par \tab \tab Nombre\tab : string[40];\r
+\par \tab End;\r
+\par }\pard\plain \s28\qj \fi720\li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \f11\fs22\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {Se pide:\r
+\par {\listtext\pard\plain\s15 \f11\fs22 \hich\af11\dbch\af0\loch\f11 1.\tab}}\pard\plain \s15\qj \fi-1080\li1800\ri0\nowidctlpar\tx2268\faauto\ls1\adjustright\rin0\lin1800\itap0 \f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\fs22 \r
+Implementar el TDA AB, (en una unit el tipo y primitivas) con punteros.\r
+\par {\listtext\pard\plain\s15 \f11\fs22 \hich\af11\dbch\af0\loch\f11 2.\tab}Implementar el TDA ABO utilizando el TDA AB. o sea que para implementar las primitivas de ABO se deberan usuar las previamente definidas de AB, ya que este ABO se montara sobre el \r
+TDA AB.\r
+\par {\listtext\pard\plain\s15 \f11\fs22 \hich\af11\dbch\af0\loch\f11 3.\tab}Desarrollar un procedimiento }{\b\fs22 abstracto}{\fs22 \r
+ BUSCAR_POR_RANGO_ABO (NO primitiva!!, sino que debe ser construido con las primitivas de ABO) que dado un ABO y dos claves (desde y hasta) devuelva una pila con los elementos encontrados entre estas dos cla\r
+ves. Tener en cuenta que para esto no debe recorrerse de mas el ABO y que la pila debe quedar de tal forma que el ultimo elemento ingresado sea el de mayor clave y el ante-ultimo el siguiente en orden y asi sucesivamente.\r
+\par {\listtext\pard\plain\s15 \f11\fs22 \hich\af11\dbch\af0\loch\f11 4.\tab}Generar un programa que: \r
+\par {\listtext\pard\plain\s15 \f11\fs22 \hich\af11\dbch\af0\loch\f11 a.\tab}}\pard \s15\qj \fi-360\li1800\ri0\nowidctlpar\tx2268\faauto\ls1\ilvl1\adjustright\rin0\lin1800\itap0 {\fs22 ba\r
+sandose en el TP1 y a partir de dos archivos (uno con los parametros para procesar y el otro con el resultado de la ejecucion de los comandos) genere al menos 10 elementos en la tabla, luego la recorra e inserte cada elemento en el TDA ABO. \r
+\par {\listtext\pard\plain\s15 \f11\fs22 \hich\af11\dbch\af0\loch\f11 b.\tab}Luego pasando como parametro 1 y 99999999 invocar al procedimiento BUSCAR_POR_RANGO_ABO y listar la pila devuelta.\r
+\par {\listtext\pard\plain\s15 \f11\fs22 \hich\af11\dbch\af0\loch\f11 c.\tab}Ejecutar un procedimiento a partir de 2 nombres de archivo como par\'e1metro: un archivo de entrada cuyo contenido son comandos que indican o\r
+peraciones a realizar sobre el TDA ABO y uno de salida para el resultado de las operaciones, (para la prueba deben quedar al menos 20 elementos en el ABO.)\r
+\par }\pard \s15\qj \li1134\ri0\nowidctlpar\faauto\adjustright\rin0\lin1134\itap0 {\fs22 Los comandos posibles y sus par\'e1metros son los siguientes:\r
+\par \tab \r
+\par }\trowd \trqc\trleft-23\trkeep\trftsWidth1 \clvertalt\clbrdrt\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1106 \cellx1083\clvertalt\clbrdrt\r
+\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1990 \cellx3073\clvertalt\clbrdrt\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \r
+\clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth882 \cellx3955\clvertalt\clbrdrt\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \r
+\cltxlrtb\clftsWidth3\clwWidth1371 \cellx5326\clvertalt\clbrdrt\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrs\brdrw5\brsp40\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth1088 \cellx6414\pard \r
+\s15\qc \li0\ri0\nowidctlpar\intbl\faauto\adjustright\rin0\lin0 {\b\fs22 Comando\cell Descripci\'f3n\cell DNI\cell Nombre\cell Salida\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\faauto\adjustright\rin0\lin0 \r
+\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\b\fs22 \trowd \trqc\trleft-23\trkeep\trftsWidth1 \clvertalt\clbrdrt\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \r
+\cltxlrtb\clftsWidth3\clwWidth1106 \cellx1083\clvertalt\clbrdrt\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1990 \cellx3073\clvertalt\clbrdrt\r
+\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth882 \cellx3955\clvertalt\clbrdrt\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \r
+\clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1371 \cellx5326\clvertalt\clbrdrt\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\r
+\brdrs\brdrw5\brsp40\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth1088 \cellx6414\row }\trowd \trqc\trleft-23\trkeep\trftsWidth1 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \r
+\cltxlrtb\clftsWidth3\clwWidth1106 \cellx1083\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1990 \cellx3073\clvertalt\clbrdrt\brdrnone \clbrdrl\r
+\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth882 \cellx3955\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \r
+\cltxlrtb\clftsWidth3\clwWidth1371 \cellx5326\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrs\brdrw5\brsp40\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth1088 \cellx6414\pard\plain \r
+\s15\qc \li0\ri0\nowidctlpar\intbl\faauto\adjustright\rin0\lin0 \f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {IO\cell Insertar Ordenado\cell <DNI>\cell <Nombre>\cell -\cell }\pard\plain \r
+\ql \li0\ri0\widctlpar\intbl\faauto\adjustright\rin0\lin0 \fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\trowd \trqc\trleft-23\trkeep\trftsWidth1 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\r
+\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1106 \cellx1083\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1990 \r
+\cellx3073\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth882 \cellx3955\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\r
+\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1371 \cellx5326\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrs\brdrw5\brsp40\brdrcf1 \r
+\cltxlrtb\clftsWidth3\clwWidth1088 \cellx6414\row }\pard\plain \s15\qc \li0\ri0\nowidctlpar\intbl\faauto\adjustright\rin0\lin0 \f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {BO\cell Borrar corriente\cell *\cell *\cell -\cell }\pard\plain \r
+\ql \li0\ri0\widctlpar\intbl\faauto\adjustright\rin0\lin0 \fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\trowd \trqc\trleft-23\trkeep\trftsWidth1 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\r
+\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1106 \cellx1083\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1990 \r
+\cellx3073\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth882 \cellx3955\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\r
+\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1371 \cellx5326\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrs\brdrw5\brsp40\brdrcf1 \r
+\cltxlrtb\clftsWidth3\clwWidth1088 \cellx6414\row }\pard\plain \s15\qc \li0\ri0\nowidctlpar\intbl\faauto\adjustright\rin0\lin0 \f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {MO \cell Modificar corriente\cell <DNI>\cell <Nombre>\cell -\cell \r
+}\pard\plain \ql \li0\ri0\widctlpar\intbl\faauto\adjustright\rin0\lin0 \fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\trowd \trqc\trleft-23\trkeep\trftsWidth1 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\r
+\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1106 \cellx1083\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1990 \r
+\cellx3073\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth882 \cellx3955\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\r
+\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1371 \cellx5326\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrs\brdrw5\brsp40\brdrcf1 \r
+\cltxlrtb\clftsWidth3\clwWidth1088 \cellx6414\row }\pard\plain \s15\qc \li0\ri0\nowidctlpar\intbl\faauto\adjustright\rin0\lin0 \f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {BC\cell Buscar por Clave y Listar Corriente\cell <DNI>\cell *\r
+\cell Datos de la Clave\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\faauto\adjustright\rin0\lin0 \fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\trowd \trqc\trleft-23\trkeep\trftsWidth1 \clvertalt\clbrdrt\brdrnone \clbrdrl\r
+\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1106 \cellx1083\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \r
+\cltxlrtb\clftsWidth3\clwWidth1990 \cellx3073\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth882 \cellx3955\clvertalt\clbrdrt\brdrnone \clbrdrl\r
+\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1371 \cellx5326\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\r
+\brdrs\brdrw5\brsp40\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth1088 \cellx6414\row }\trowd \trqc\trleft-23\trkeep\trftsWidth1 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \r
+\cltxlrtb\clftsWidth3\clwWidth1106 \cellx1083\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1990 \cellx3073\clvertalt\clbrdrt\brdrnone \clbrdrl\r
+\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth882 \cellx3955\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \r
+\cltxlrtb\clftsWidth3\clwWidth1371 \cellx5326\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrs\brdrw5\brsp40\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth1088 \cellx6414\pard\plain \r
+\s15\qc \li0\ri0\nowidctlpar\intbl\faauto\adjustright\rin0\lin0 \f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {LI\cell Limpiar ABO\cell *\cell *\cell -\cell }\pard\plain \ql \li0\ri0\widctlpar\intbl\faauto\adjustright\rin0\lin0 \r
+\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\trowd \trqc\trleft-23\trkeep\trftsWidth1 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1106 \r
+\cellx1083\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1990 \cellx3073\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\r
+\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth882 \cellx3955\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth1371 \r
+\cellx5326\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrb\brdrs\brdrw5\brsp40\brdrcf1 \clbrdrr\brdrs\brdrw5\brsp40\brdrcf1 \cltxlrtb\clftsWidth3\clwWidth1088 \cellx6414\row }\pard \r
+\ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 {\f11\cgrid0 \r
+\par {\listtext\pard\plain\s15 \f11\fs22 \hich\af11\dbch\af0\loch\f11 d.\tab}}\pard\plain \s15\qj \fi-360\li1800\ri0\nowidctlpar\faauto\ls1\ilvl1\adjustright\rin0\lin1800\itap0 \f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\fs22 \r
+Despues de procesar estos comandos invocar nuevamente al Procedimiento BUSCAR_POR_RANGO_ABO y listar la pila devuelta (no pasar como parametro el minimo y maximo DNI del arbol). \r
+\par {\listtext\pard\plain\s15 \f11\fs22 \hich\af11\dbch\af0\loch\f11 e.\tab}Luego listar IN-ORDEN el ABO completo.\r
+\par }\pard\plain \ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\fs22 \r
+\par \r
+\par }}
\ No newline at end of file
--- /dev/null
+unit AB;\r
+\r
+{\r
+ IMPLEMENTACION : ARBOLES BINARIOS\r
+ ALMACENAMIENTO : PUNTEROS\r
+\r
+}\r
+interface\r
+\r
+{ usa las funciones generales de TDAs }\r
+uses GRAL;\r
+\r
+{ tipos propios del arbol binario }\r
+type\r
+ AB_MOVIMIENTO = ( AB_raiz, AB_izquierda, AB_derecha, AB_padre );\r
+\r
+ AB_PUNTERO = ^AB_NODO;\r
+\r
+ AB_NODO = record\r
+ Elem : T_REGISTRO;\r
+ Izquierda,\r
+ Derecha : AB_PUNTERO;\r
+ end;\r
+\r
+ AB_ARBOL = record\r
+ Raiz,\r
+ Corriente: AB_PUNTERO;\r
+ END;\r
+\r
+PROCEDURE AB_crear( VAR a: AB_ARBOL );\r
+FUNCTION AB_vacio( a: AB_ARBOL): boolean;\r
+PROCEDURE AB_elem_cte( a: AB_ARBOL; VAR e: T_REGISTRO);\r
+PROCEDURE AB_modif_cte( VAR a: AB_ARBOL; e: T_REGISTRO);\r
+PROCEDURE AB_mover_cte( VAR a: AB_ARBOL; m: AB_MOVIMIENTO; VAR error: boolean );\r
+PROCEDURE AB_borrar_sub( VAR a: AB_ARBOL; m: AB_MOVIMIENTO );\r
+PROCEDURE AB_insertar( VAR a: AB_ARBOL; m: AB_MOVIMIENTO; e: T_REGISTRO; VAR error: boolean );\r
+PROCEDURE AB_vaciar( VAR a: AB_ARBOL );\r
+PROCEDURE AB_copiar( a: AB_ARBOL; VAR b: AB_ARBOL );\r
+\r
+implementation\r
+\r
+\r
+{ Estas son los dos procedimientos principales de la aplicación }\r
+\r
+PROCEDURE AB_crear( VAR a: AB_ARBOL );\r
+ begin\r
+ a.Raiz := nil;\r
+ a.Corriente := nil;\r
+ end;\r
+\r
+FUNCTION AB_vacio( a: AB_ARBOL): BOOLEAN;\r
+ begin\r
+ AB_vacio := ( a.Raiz = nil);\r
+ end;\r
+\r
+PROCEDURE AB_elem_cte( a: AB_ARBOL; VAR e: T_REGISTRO);\r
+ begin\r
+ e := a.Corriente^.Elem;\r
+ end;\r
+\r
+PROCEDURE AB_modif_cte( VAR a: AB_ARBOL; e: T_REGISTRO);\r
+ begin\r
+ a.Corriente^.Elem := e;\r
+ end;\r
+\r
+PROCEDURE AB_mover_cte( VAR a: AB_ARBOL; m: AB_MOVIMIENTO; VAR error: BOOLEAN );\r
+ FUNCTION buscar_padre( p: AB_PUNTERO; h: AB_PUNTERO ) : AB_PUNTERO;\r
+ var\r
+ ret : AB_PUNTERO;\r
+ begin\r
+ ret := NIL;\r
+ if ( p^.Izquierda = h ) or ( p^.Derecha = h ) then\r
+ ret := p;\r
+ if ( ret = nil ) and ( p^.Izquierda <> nil ) then\r
+ ret := buscar_padre( p^.Izquierda, h );\r
+ if ( ret = nil ) and ( p^.Derecha <> nil ) then\r
+ ret := buscar_padre( p^.Derecha, h );\r
+ buscar_padre := ret;\r
+ end;\r
+ begin\r
+ error := false;\r
+ case m of\r
+ ab_raiz:\r
+ A.Corriente := a.Raiz;\r
+ AB_izquierda:\r
+ if a.Corriente^.Izquierda = nil then\r
+ error := true\r
+ else\r
+ a.Corriente := A.Corriente^.Izquierda;\r
+ AB_derecha:\r
+ if a.Corriente^.Derecha = nil then\r
+ error := true\r
+ else\r
+ a.Corriente := A.Corriente^.Derecha;\r
+ AB_padre:\r
+ if a.Corriente = A.Raiz then\r
+ error := true\r
+ else\r
+ a.Corriente := buscar_padre( a.Raiz, a.Corriente );\r
+ end;\r
+end;\r
+\r
+PROCEDURE AB_borrar_sub( VAR a: AB_ARBOL; m: AB_MOVIMIENTO );\r
+ PROCEDURE liberar_subarbol( VAR p : AB_PUNTERO );\r
+ begin\r
+ if p <> nil then begin\r
+ liberar_subarbol( p^.Izquierda );\r
+ liberar_subarbol( p^.Derecha );\r
+ dispose( p );\r
+ p := nil;\r
+ end;\r
+ end;\r
+ begin\r
+ case m of\r
+ AB_izquierda:\r
+ liberar_subarbol( a.Corriente^.Izquierda );\r
+ AB_derecha:\r
+ liberar_subarbol( a.Corriente^.Derecha );\r
+ end;\r
+ end;\r
+\r
+PROCEDURE AB_insertar( VAR a: AB_ARBOL; m: AB_MOVIMIENTO; e: T_REGISTRO; VAR error: BOOLEAN );\r
+ var\r
+ p : AB_PUNTERO;\r
+ begin\r
+ error := false;\r
+ new( p );\r
+ p^.Izquierda := nil;\r
+ p^.Derecha := nil;\r
+ p^.Elem := e;\r
+ case m of\r
+ AB_raiz:\r
+ if a.Raiz = nil then\r
+ a.Raiz := p\r
+ else\r
+ error := true;\r
+ AB_izquierda:\r
+ if a.Corriente^.Izquierda = nil then\r
+ a.Corriente^.Izquierda := p\r
+ else\r
+ error := true;\r
+ AB_derecha:\r
+ if a.Corriente^.Derecha = nil then\r
+ a.Corriente^.Derecha := p\r
+ else\r
+ error := true;\r
+ AB_padre:\r
+ error := true\r
+ end;\r
+\r
+ if error = false then\r
+ a.Corriente := p\r
+ else\r
+ dispose( p );\r
+\r
+end;\r
+\r
+PROCEDURE AB_vaciar( VAR a: AB_ARBOL );\r
+ PROCEDURE liberar_subarbol( VAR p : AB_PUNTERO );\r
+ begin\r
+ if p <> nil then begin\r
+ liberar_subarbol( p^.Izquierda );\r
+ liberar_subarbol( p^.Derecha ); { ARREGLADO, decía p^.Izquierda }\r
+ DISPOSE ( p );\r
+ p := nil;\r
+ end;\r
+ end;\r
+ begin\r
+ liberar_subarbol( a.Raiz );\r
+ a.Corriente := nil;\r
+ end;\r
+\r
+PROCEDURE AB_copiar( a : AB_ARBOL; VAR b : AB_ARBOL );\r
+ PROCEDURE copiar_subarbol( o : AB_PUNTERO; VAR d : AB_PUNTERO );\r
+ begin\r
+ if o <> nil then begin\r
+ { tengo que copiar el nodo y llamar a la copia de los hijos }\r
+ { el procedimiento va modificando el d como viene por referencia }\r
+ new( d );\r
+ d^.Elem := o^.Elem;\r
+ d^.Izquierda := nil;\r
+ d^.Derecha := nil;\r
+ copiar_subarbol( o^.Izquierda, d^.Izquierda );\r
+ copiar_subarbol( o^.Derecha , d^.Derecha );\r
+ end;\r
+ end;\r
+ begin\r
+ { tenemos que vaciar primero el arbol b (destino) }\r
+ AB_vaciar( b );\r
+ { ahora copiamos todo el arbol origen }\r
+ copiar_subarbol( a.Raiz, b.Raiz );\r
+ a.Corriente := a.Raiz;\r
+ end;\r
+\r
+end.
\ No newline at end of file
--- /dev/null
+unit ABO_AB;\r
+\r
+interface\r
+\r
+ uses\r
+ AB, GRAL;\r
+\r
+ type\r
+ ABO_ARBOL = record\r
+ arbol: AB_ARBOL;\r
+ end;\r
+\r
+ ABO_MOVIMIENTO = ( ABO_raiz, ABO_izquierda, ABO_derecha, ABO_padre );\r
+\r
+ { Crea e inicializa el arbol }\r
+ PROCEDURE ABO_crear( VAR a: ABO_ARBOL );\r
+ { PRE: Arbol no creado }\r
+ { POS: Arbol creado y vacio }\r
+\r
+ { Se fija si el arbol esta vacio }\r
+ FUNCTION ABO_vacio( a: ABO_ARBOL): BOOLEAN;\r
+ { PRE: Arbol creado }\r
+ { POS: Devuelve true si el arbol esta vacio, false si no lo esta }\r
+\r
+ { Devuelve el elemento corriente }\r
+ PROCEDURE ABO_elem_cte( a: ABO_ARBOL; VAR e: T_REGISTRO);\r
+ { PRE: Arbol creado y no vacio }\r
+ { POS: en e esta almacenado el elemento corriente }\r
+\r
+ { Modifica el elemento corriente }\r
+ PROCEDURE ABO_modif_cte( VAR a: ABO_ARBOL; e: T_REGISTRO; VAR error: boolean );\r
+ { PRE: Arbol creado y no vacio }\r
+ { POS: Si la clave del elemento modificado ya estaba en el arbol (sin contar el\r
+ elemento a modificar), devuelve error = true y no modifica el arbol.\r
+ Si no estaba en el arbol, error es false y se modifica el elemento corriente }\r
+\r
+ { Moueve el elemento corriente }\r
+ PROCEDURE ABO_mover_cte( VAR a: ABO_ARBOL; m: ABO_MOVIMIENTO; VAR error: BOOLEAN );\r
+ { PRE: Arbol creado y no vacio }\r
+ { POS: ABO_raiz: el corriente es el elemento raiz, error es false }\r
+ { ABO_padre: si el corriente es el elemento raiz, error es true y el corriente no cambia }\r
+ { ABO_izquierda: si el corriente no tiene un elemento a izquierda, error es true y el corriente no cambia }\r
+ { si el corriente tiene un elemento a izquierda, error es false y el corriente cambia }\r
+ { ABO_derecha: si el corriente no tiene un elemento a derecha, error es true y el corriente no cambia }\r
+ { si el corriente tiene un elemento a derecha, error es false y el corriente cambia }\r
+\r
+ { Borra el elemento corriente }\r
+ PROCEDURE ABO_borrar_cte( VAR a: ABO_ARBOL );\r
+ { PRE: Arbol creado y no vacio }\r
+ { POS: el elemento corriente fue borrado y el corriente nuevo es la raiz }\r
+\r
+ { Inserta el elemento e en el arbol }\r
+ PROCEDURE ABO_insertar( VAR a: ABO_ARBOL; e: T_REGISTRO; VAR error: BOOLEAN );\r
+ { PRE: Arbol creado }\r
+ { POS: si la clave del elemento e no estaba en el arbol, el registro e se inserto y error es false,\r
+ si la clave del elemento estaba en el arbol, el registro no se inserto y error es true }\r
+\r
+ { Vacia el arbol }\r
+ PROCEDURE ABO_vaciar( VAR a: ABO_ARBOL );\r
+ { PRE: Arbol creado }\r
+ { POS: El arbol esta vacio }\r
+\r
+ { Copia el arbol a en el b }\r
+ PROCEDURE ABO_copiar( a: ABO_ARBOL; VAR b: ABO_ARBOL );\r
+ { PRE: Arbol a creado y no vacio, arbol b creado }\r
+ { POS: el arbol b es una copia del arbol a }\r
+\r
+ { Busca el elemento con la clave c en el arbol }\r
+ PROCEDURE ABO_buscar( var a: ABO_ARBOL; c: T_CLAVE; VAR error: boolean );\r
+ { PRE: Arbol creado y no vacio }\r
+ { POS: si habia un elemento con la clave c en el arbol, error es false y el elemento corriente es el de clave c\r
+ si no habia un elemento con la clave c en el arbol, error es true y el elemento corriente no cambia }\r
+\r
+\r
+implementation\r
+{-----------------------------------}\r
+{ Funciones "privadas" de la unidad }\r
+{-----------------------------------}\r
+\r
+{ Convierte un movimiento del ABO a uno del AB, para mantener los tipos abstractos }\r
+FUNCTION movABO2AB( m: ABO_MOVIMIENTO ): AB_MOVIMIENTO;\r
+\r
+ begin\r
+ case ( m ) OF\r
+ ABO_raiz: begin\r
+ movABO2AB := AB_raiz;\r
+ end;\r
+ ABO_izquierda: begin\r
+ movABO2AB := AB_izquierda;\r
+ end;\r
+ ABO_derecha: begin\r
+ movABO2AB := AB_derecha;\r
+ end;\r
+ ABO_padre: begin\r
+ movABO2AB := AB_padre;\r
+ end;\r
+ end;\r
+ end;\r
+\r
+\r
+{-----------------------------------}\r
+{ Funciones "públicas" de la unidad }\r
+{-----------------------------------}\r
+\r
+PROCEDURE ABO_crear( VAR a: ABO_ARBOL );\r
+\r
+ begin\r
+ AB_crear( a.arbol );\r
+ end; { Procedimiento o Función }\r
+\r
+\r
+ FUNCTION ABO_vacio( a: ABO_ARBOL ): BOOLEAN;\r
+\r
+ begin\r
+ ABO_vacio := AB_vacio( a.arbol );\r
+ end; { Procedimiento o Función }\r
+\r
+\r
+PROCEDURE ABO_elem_cte( a: ABO_ARBOL; VAR e: T_REGISTRO );\r
+\r
+ begin\r
+ AB_elem_cte( a.arbol, e );\r
+ end; { Procedimiento o Función }\r
+\r
+{ error es true si se modifica a una clave que ya existia }\r
+PROCEDURE ABO_modif_cte( VAR a: ABO_ARBOL; e: T_REGISTRO; VAR error: boolean );\r
+ var\r
+ r: T_REGISTRO;\r
+ er: boolean;\r
+\r
+ begin\r
+ ABO_elem_cte( a, r );\r
+ if ( T_GRAL_Devolver_Clave_Elem( r ) = T_GRAL_Devolver_Clave_Elem( e ) ) then { si la clave no cambia }\r
+ AB_modif_cte( a.arbol, e ) { se modifica con la primitiva de AB }\r
+ else begin { Si la clave cambia ... }\r
+ ABO_borrar_cte( a ); { Borra el corriente }\r
+ ABO_insertar( a, e, error ); { Inserta el nuevo elemento }\r
+ end;\r
+ end; { Procedimiento o Función }\r
+\r
+\r
+PROCEDURE ABO_mover_cte( VAR a: ABO_ARBOL; m: ABO_MOVIMIENTO; VAR error: BOOLEAN );\r
+\r
+ begin\r
+ AB_mover_cte( a.arbol, movABO2AB( m ), error );\r
+ end; { Procedimiento o Función }\r
+\r
+\r
+PROCEDURE ABO_borrar_cte( VAR a: ABO_ARBOL );\r
+ PROCEDURE insertar_rama_de_ABO_a_ABO( VAR origen: ABO_ARBOL; VAR destino: ABO_ARBOL );\r
+ var\r
+ r: T_REGISTRO;\r
+ er: boolean;\r
+ begin\r
+ ABO_elem_cte( origen, r );\r
+ ABO_insertar( destino, r, er ); { No debe haber error porque no hay ninguno repetido }\r
+ ABO_mover_cte( origen, ABO_izquierda, er );\r
+ if ( not er ) then begin\r
+ insertar_rama_de_ABO_a_ABO( origen, destino );\r
+ ABO_mover_cte( origen, ABO_padre, er );\r
+ end;\r
+ ABO_mover_cte( origen, ABO_derecha, er );\r
+ if ( not er ) then begin\r
+ insertar_rama_de_ABO_a_ABO( origen, destino );\r
+ ABO_mover_cte( origen, ABO_padre, er );\r
+ end;\r
+ end;\r
+\r
+ var\r
+ abo: ABO_ARBOL;\r
+ er: boolean;\r
+ ro,\r
+ rn: T_REGISTRO;\r
+ m: AB_MOVIMIENTO;\r
+\r
+ begin\r
+ AB_elem_cte( a.arbol, ro ); { obtengo el elemento corriente }\r
+ ABO_crear( abo ); {}\r
+ AB_mover_cte( a.arbol, AB_izquierda, er ); {}\r
+ if ( not er ) then begin {}\r
+ insertar_rama_de_ABO_a_ABO( a, abo ); {}\r
+ AB_mover_cte( a.arbol, AB_padre, er ); { Copia todos los registros de las subramas }\r
+ end; { del registro a borrar en un nuevo ABO }\r
+ AB_mover_cte( a.arbol, AB_derecha, er ); { para luego insertarlos en el lugar del }\r
+ if ( not er ) then begin { registro borrado }\r
+ insertar_rama_de_ABO_a_ABO( a, abo ); {}\r
+ AB_mover_cte( a.arbol, AB_padre, er ); {}\r
+ end; {}\r
+ { En este punto tengo todos los registros de la subrama en mi nuevo ABO }\r
+ AB_mover_cte( a.arbol, AB_padre, er );\r
+ if ( er ) then { es la raiz }\r
+ AB_vaciar( a.arbol ) { se vacia el arbol entero }\r
+ else begin { no es la raiz }\r
+ AB_mover_cte( a.arbol, AB_izquierda, er ); { Ahora se fija si la subrama a borrar es la de }\r
+ { la derecha o la de la izquierda (prueba la izquierda) }\r
+ if ( er ) then { No hay un elemento a la izquierda }\r
+ m := AB_derecha { Indica que hay que borrar la de la derecha }\r
+ else begin { Hay un elemento a la izquierda }\r
+ AB_elem_cte( a.arbol, rn ); { Extrae el elemento para compararlo con el que hay que borrar }\r
+ if ( T_GRAL_Devolver_Clave_Elem( ro ) = T_GRAL_Devolver_Clave_Elem( rn ) ) then { si es la misma }\r
+ m := AB_izquierda { Son iguales las claves entonces hay que borrar el de la izquierda }\r
+ else\r
+ m := AB_derecha; { Son distintas las claves entonces hay que borrar el de la derecha }\r
+ AB_mover_cte( a.arbol, AB_padre, er );\r
+ end;\r
+ AB_borrar_sub( a.arbol, m );\r
+ end;\r
+ { En este punto tengo borrada la rama con el elemento a borrar, }\r
+ { solo queda insertar los elementos del ABO creado }\r
+ if ( not ABO_vacio( abo ) ) then begin { Si no esta vacio }\r
+ ABO_mover_cte( abo, ABO_raiz, er ); { Mueve el corriente a la raiz }\r
+ insertar_rama_de_ABO_a_ABO( abo, a ); { Inserta la subrama almacenada en ABO en el arbol original }\r
+ end;\r
+ ABO_mover_cte( a, ABO_raiz, er ); { deja el corriente en la raiz }\r
+ end; { Procedimiento o Función }\r
+\r
+\r
+PROCEDURE ABO_insertar( VAR a: ABO_ARBOL; e: T_REGISTRO; VAR error: BOOLEAN );\r
+ FUNCTION buscar_lugar_desde_elem_cte( VAR a: ABO_ARBOL; e: T_REGISTRO ): AB_MOVIMIENTO;\r
+ var\r
+ r: T_REGISTRO;\r
+ er: boolean;\r
+\r
+ begin\r
+ { devuelve AB_raiz si el elemento ya existe en el arbol\r
+ devuelve AB_izquierda si hay que insertarlo a izquiera del corriente\r
+ devuelve AB_derecha si hay que insertarlo a derecha del corriente }\r
+ AB_elem_cte( a.arbol, r );\r
+ if ( T_GRAL_Devolver_Clave_Elem( e ) = T_GRAL_Devolver_Clave_Elem( r ) ) then\r
+ buscar_lugar_desde_elem_cte := AB_raiz\r
+ else\r
+ if ( T_GRAL_Devolver_Clave_Elem( e ) < T_GRAL_Devolver_Clave_Elem( r ) ) then begin\r
+ AB_mover_cte( a.arbol, AB_izquierda, er );\r
+ if ( not er ) then\r
+ buscar_lugar_desde_elem_cte := buscar_lugar_desde_elem_cte( a, e )\r
+ else\r
+ buscar_lugar_desde_elem_cte := AB_izquierda;\r
+ end\r
+ else begin\r
+ AB_mover_cte( a.arbol, AB_derecha, er );\r
+ if ( not er ) then\r
+ buscar_lugar_desde_elem_cte := buscar_lugar_desde_elem_cte( a, e )\r
+ else\r
+ buscar_lugar_desde_elem_cte := AB_derecha;\r
+ end;\r
+ end;\r
+\r
+ var\r
+ r: T_REGISTRO;\r
+ m: AB_MOVIMIENTO;\r
+ co,\r
+ ct: T_CLAVE;\r
+\r
+ begin\r
+ error := false;\r
+ if ( AB_vacio( a.arbol ) ) then\r
+ AB_insertar( a.arbol, AB_raiz, e, error )\r
+ else begin\r
+ AB_mover_cte( a.arbol, AB_raiz, error );\r
+ m := buscar_lugar_desde_elem_cte( a, e );\r
+ if ( m <> AB_raiz ) then\r
+ AB_insertar( a.arbol, m, e, error )\r
+ else\r
+ error := true;\r
+ end;\r
+ end; { Procedimiento o Función }\r
+\r
+\r
+PROCEDURE ABO_vaciar( VAR a: ABO_ARBOL );\r
+\r
+ begin\r
+ AB_vaciar( a.arbol );\r
+ end; { Procedimiento o Función }\r
+\r
+\r
+PROCEDURE ABO_copiar( a: ABO_ARBOL; VAR b: ABO_ARBOL );\r
+\r
+ begin\r
+ AB_copiar( a.arbol, b.arbol );\r
+ end; { Procedimiento o Función }\r
+\r
+\r
+PROCEDURE ABO_buscar( var a: ABO_ARBOL; c: T_CLAVE; VAR error: boolean );\r
+ { baja un nivel por el camino correcto y compara: }\r
+ { c1 = c2 : Termina, error es false porque fue encontrada }\r
+ { c1 > c2 : Se mueve a la derecha y llama al procedimiento recursivamente }\r
+ { c1 < c2 : Se mueve a la izquierda y llama al procedimiento recursivamente }\r
+ { Si hay movimiento y este da error, quiere decir que la clave no fue encontrada}\r
+ { (se llego a una hoja, o "semihoja"). De esta forma devuelve error como true }\r
+ PROCEDURE buscar( var a: ABO_ARBOL; c: T_CLAVE; VAR error: boolean );\r
+ var\r
+ e: T_REGISTRO;\r
+ co: T_CLAVE;\r
+ begin\r
+ AB_elem_cte( a.arbol, e );\r
+ co := T_GRAL_Devolver_Clave_Elem( e );\r
+ if ( c = co ) then\r
+ error := false\r
+ else begin\r
+ if ( c < co ) then\r
+ AB_mover_cte( a.arbol, AB_izquierda, error )\r
+ else\r
+ AB_mover_cte( a.arbol, AB_derecha, error );\r
+ if ( not error ) then\r
+ buscar( a, c, error );\r
+ end;\r
+ end;\r
+\r
+ var\r
+ r: T_REGISTRO;\r
+\r
+ begin\r
+ AB_elem_cte( a.arbol, r ); { Guarda el elemento corriente por si no se encuentra el buscado }\r
+ AB_mover_cte( a.arbol, AB_raiz, error ); { Se mueve a la raiz }\r
+ if ( not error ) then begin { Si no hubo error (no debería haberlo) ... }\r
+ buscar( a, c, error ); { Comienza la busqueda }\r
+ if ( error ) then begin { Si no se encontro la clave buscada ... }\r
+ { Buscamos la clave original (nunca deberia devolver error = true porque sabemos que existe }\r
+ ABO_buscar( a, T_GRAL_Devolver_Clave_Elem( r ), error );\r
+ error := true; { Volvemos a poner error en true porque no se habia encontrado }\r
+ end; { la clave deseada }\r
+ end;\r
+ end; { Procedimiento o Función }\r
+\r
+end.
\ No newline at end of file
--- /dev/null
+unit ABO_UTIL;\r
+\r
+interface\r
+\r
+ uses\r
+ GRAL, PILA_C, ABO_AB;\r
+\r
+ PROCEDURE ABO_UTIL_buscar_por_rango( var a: ABO_ARBOL; desde, hasta: T_CLAVE; var p: T_PILAC );\r
+\r
+implementation\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: busca un rango de claves y las inserta en una pila,\r
+ {- quedando la mayor clave 'arriba' de la pila.\r
+ {----------------------------------------------------------------------------}\r
+\r
+ PROCEDURE ABO_UTIL_buscar_por_rango( var a: ABO_ARBOL; desde, hasta: T_CLAVE; var p: T_PILAC );\r
+ PROCEDURE buscar_rango_inorder_insertando( var a: ABO_ARBOL; desde, hasta: T_CLAVE; var p: T_PILAC );\r
+ var\r
+ er: boolean;\r
+ c: T_CLAVE;\r
+ r: T_REGISTRO;\r
+\r
+ begin\r
+ ABO_elem_cte( a, r );\r
+ c := T_GRAL_Devolver_Clave_Elem( r );\r
+ { Proceso el subarbol izquierdo si la clave del elemento actual }\r
+ { es mayor o igual que la clave 'desde' }\r
+ if ( desde <= c ) then begin\r
+ ABO_mover_cte( a, ABO_izquierda, er );\r
+ if ( not er ) then begin\r
+ buscar_rango_inorder_insertando( a, desde, hasta, p );\r
+ ABO_mover_cte( a, ABO_padre, er );\r
+ end;\r
+ { Inserto en la pila el elemento corriente si la clave del elemento }\r
+ { actual también es menor o igual que la clave 'hasta' }\r
+ if ( hasta >= c ) then\r
+ PILAC_poner( p, r );\r
+ end;\r
+ { Proceso el subarbol derecho si la clave del elemento actual }\r
+ { es menor o igual que la clave 'hasta' }\r
+ if ( hasta >= c ) then begin\r
+ ABO_mover_cte( a, ABO_derecha, er );\r
+ if ( not er ) then begin\r
+ buscar_rango_inorder_insertando( a, desde, hasta, p );\r
+ ABO_mover_cte( a, ABO_padre, er );\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ var\r
+ er: boolean;\r
+\r
+ begin\r
+ PILAC_vaciar( p ); { Vacia la pila }\r
+ ABO_mover_cte( a, ABO_raiz, er ); { Mueve el corriente a la raiz }\r
+ if ( not er ) then\r
+ buscar_rango_inorder_insertando( a, desde, hasta, p ); { Comienza a buscar }\r
+ end;\r
+\r
+end.
\ No newline at end of file
--- /dev/null
+program GeneradorDeArchivosDeComandos;\r
+{\r
+ Programa para generar archivos de comandos\r
+}\r
+\r
+uses\r
+ PROG_GRL, DOS;\r
+\r
+var\r
+ fSal: T_ARCHIVO_COMANDOS_ABO;\r
+ c: T_COMANDO_ABO;\r
+ dir: dirstr;\r
+ fname: namestr;\r
+ ext: extstr;\r
+\r
+begin\r
+ mensajeDeEntrada( 'Programa para crear archivos de comandos de ABO.' );\r
+ if paramcount < 1 then begin\r
+ fsplit( paramstr( 0 ), dir, fname, ext );\r
+ writeln;\r
+ writeln;\r
+ writeln( 'ERROR: numero de parametros incorrectos.' );\r
+ writeln;\r
+ writeln( 'Modo de uso:' );\r
+ writeln( ' ', fname, ' archivo_entrada' );\r
+ writeln;\r
+ exit; { -------------------------------------> SALE DEL PROGRAMA!!!!!!!!!! }\r
+ end;\r
+ if ( not existeArchivo( paramstr( 1 ) ) ) then\r
+ writeln( 'Escribiendo en el "', paramstr( 1 ), '".' )\r
+ else\r
+ writeln( 'Sobrescribiendo en el archivo "', paramstr( 1 ), '".' );\r
+ assign( fSal, paramstr( 1 ) );\r
+ rewrite( fSal );\r
+ while true do begin { Repite hasta que el comando sea nulo }\r
+ writeln;\r
+ writeln;\r
+ writeln( 'INGRESO DE UN NUEVO REGISTRO DE ABO' );\r
+ writeln( '======= == == ===== ======== == ===' );\r
+ writeln;\r
+ write( 'Comando (IO, BC, BO, MO, LI, <ENTER>: sale): ' );\r
+ readln( c.comando );\r
+ if ( c.comando = '' ) then\r
+ exit; { ----------------------------------> SALE DEL PROGRAMA!!!!!!!!!! }\r
+ write( 'DNI: ' );\r
+ readln( c.dni );\r
+ if ( c.dni = '' ) then\r
+ c.dni := '*';\r
+ write( 'Nombre: ' );\r
+ readln( c.nombre );\r
+ if ( c.nombre = '' ) then\r
+ c.nombre := '*';\r
+ write( fSal, c );\r
+ end;\r
+ close( fSal );\r
+ writeln;\r
+ writeln( 'Se escribio correctamente el archivo "', paramstr( 1 ), '".' );\r
+ writeln( 'FIN DEL PROGRAMA' );\r
+ writeln;\r
+end.\r
+\r
--- /dev/null
+program GeneradorDeArchivosDeComandos;\r
+{\r
+ Programa para generar archivos de comandos\r
+}\r
+\r
+uses\r
+ PROG_GRL, DOS;\r
+\r
+var\r
+ fSal: T_ARCHIVO_COMANDOS_TABLA;\r
+ c: T_COMANDO_TABLA;\r
+ dir: dirstr;\r
+ fname: namestr;\r
+ ext: extstr;\r
+\r
+begin\r
+ mensajeDeEntrada( 'Programa para crear archivos de comandos de TABLA.' );\r
+ if paramcount < 1 then begin\r
+ fsplit( paramstr( 0 ), dir, fname, ext );\r
+ writeln;\r
+ writeln;\r
+ writeln( 'ERROR: numero de parametros incorrectos.' );\r
+ writeln;\r
+ writeln( 'Modo de uso:' );\r
+ writeln( ' ', fname, ' archivo_entrada' );\r
+ writeln;\r
+ exit; { -------------------------------------> SALE DEL PROGRAMA!!!!!!!!!! }\r
+ end;\r
+ if ( not existeArchivo( paramstr( 1 ) ) ) then\r
+ writeln( 'Escribiendo en el "', paramstr( 1 ), '".' )\r
+ else\r
+ writeln( 'Sobrescribiendo en el archivo "', paramstr( 1 ), '".' );\r
+ assign( fSal, paramstr( 1 ) );\r
+ rewrite( fSal );\r
+ while true do begin { Repite hasta que el comando sea nulo }\r
+ writeln;\r
+ writeln;\r
+ writeln( 'INGRESO DE UN NUEVO REGISTRO DE TABLA' );\r
+ writeln( '======= == == ===== ======== == =====' );\r
+ writeln;\r
+ write( 'Comando (IN, IO, OR, BC, BR, LS, LC, BO, MO, LI, <ENTER>: sale): ' );\r
+ readln( c.comando );\r
+ if ( c.comando = '' ) then\r
+ exit; { ----------> SALE DEL PROGRAMA!!!!!!!!!! }\r
+ write( 'DNI: ' );\r
+ readln( c.dni );\r
+ if ( c.dni = '' ) then\r
+ c.dni := '*';\r
+ write( 'Nombre: ' );\r
+ readln( c.nombre );\r
+ if ( c.nombre = '' ) then\r
+ c.nombre := '*';\r
+ write( 'Movimiento (P, U, A, S): ' );\r
+ readln( c.movimiento );\r
+ if ( c.movimiento = '' ) then\r
+ c.movimiento := '*';\r
+ write( 'DNI_hasta: ' );\r
+ readln( c.dni_hasta );\r
+ if ( c.dni_hasta = '' ) then\r
+ c.dni_hasta := '*';\r
+ write( fSal, c );\r
+ end;\r
+ close( fSal );\r
+ writeln;\r
+ writeln( 'Se escribio correctamente el archivo "', paramstr( 1 ), '".' );\r
+ writeln( 'FIN DEL PROGRAMA' );\r
+ writeln;\r
+end.\r
+\r
--- /dev/null
+unit GRAL;\r
+{ funciones y datos y tipo generales de los TDA de almacenamiento }\r
+\r
+interface\r
+\r
+{ aca se define el famoso tipo_elem }\r
+type\r
+ T_GRAL_DNI = string[8];\r
+ T_GRAL_Persona = record\r
+ dni : T_GRAL_DNI;\r
+ nombre : String[40];\r
+ end;\r
+\r
+ T_CLAVE = T_GRAL_DNI;\r
+ T_REGISTRO = T_GRAL_Persona;\r
+\r
+{ esta funcion devuelve la clave de un elemento almacenado }\r
+{ PRE : ninguna }\r
+{ POST: devuelve la clave de un elemento E }\r
+function T_GRAL_Devolver_Clave_Elem( r: T_REGISTRO): T_CLAVE;\r
+\r
+{ este procedimiento se usa en recorridos e imprime los datos del elemento }\r
+{ PRE : ninguna }\r
+{ POST: se imprimieron los datos }\r
+procedure T_GRAL_Procesar_Elem_Recorrido ( var r: T_REGISTRO);\r
+\r
+{ compara dos elementos completos para ver si cumplen con el criterio o no }\r
+FUNCTION T_GRAL_Comparar_Elementos( a: T_REGISTRO; b: T_REGISTRO ): boolean;\r
+\r
+implementation\r
+\r
+{ esta funcion devuelve la clave de un elemento almacenado }\r
+function T_GRAL_Devolver_Clave_Elem( r: T_REGISTRO): T_CLAVE;\r
+begin\r
+ T_GRAL_Devolver_Clave_Elem := r.dni;\r
+end;\r
+\r
+{ este procedimiento se usa en recorridos e imprime los datos del elemento }\r
+procedure T_GRAL_Procesar_Elem_Recorrido( var r: T_REGISTRO);\r
+BEGIN\r
+ \r
+END;\r
+\r
+{ compara dos elementos completos para ver si cumplen con el criterio o no }\r
+FUNCTION T_GRAL_Comparar_elementos( a: T_REGISTRO; b: T_REGISTRO ): boolean;\r
+BEGIN\r
+ T_GRAL_Comparar_Elementos := ( a.dni = b.dni );\r
+END;\r
+\r
+\r
+end.\r
--- /dev/null
+unit LDC;\r
+\r
+{\r
+ IMPLEMENTACION : LISTAS DOBLES\r
+ ALMACENAMIENTO : CURSORES\r
+\r
+}\r
+\r
+{ ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular }\r
+interface\r
+\r
+{ usa las funciones generales de TDAs }\r
+uses GRAL;\r
+\r
+{ maximo tamano del cursor }\r
+const LDC_MAX_CURSOR = 100;\r
+\r
+{ tipos propios de la lista para definir el cursor }\r
+TYPE\r
+ LDC_puntero = integer;\r
+\r
+const\r
+ LDC_nulo : LDC_puntero = 0;\r
+\r
+type\r
+\r
+ LDC_nodo = RECORD\r
+ Elem : T_REGISTRO;\r
+ Sig : LDC_puntero;\r
+ Ant : LDC_puntero;\r
+ END;\r
+\r
+\r
+ { ahora le toca definir el cursor }\r
+ LDC_Almac = record\r
+ almacenamiento : array [ 1 .. LDC_MAX_CURSOR ] of LDC_Nodo;\r
+ siguientes : array [ 1 .. LDC_MAX_CURSOR ] of LDC_Puntero;\r
+ { anteriores : array [ 1 .. LDC_MAX_CURSOR ] of LDC_Puntero; PREGUNTAR SI ES NECESARIO }\r
+ primero_dispo : LDC_Puntero;\r
+ end;\r
+\r
+\r
+ LDC_LDC = RECORD\r
+ almac : LDC_Almac;\r
+ primero: LDC_puntero;\r
+ corriente : LDC_puntero;\r
+ END;\r
+\r
+ LDC_movimiento = ( LDC_primero, LDC_siguiente, LDC_anterior );\r
+\r
+\r
+{ ========= }\r
+{ INTERFASE }\r
+\r
+\r
+PROCEDURE LDC_Inicializar( VAR l: LDC_LDC );\r
+FUNCTION LDC_vacio( l: LDC_LDC): BOOLEAN;\r
+FUNCTION LDC_lleno( l: LDC_LDC): BOOLEAN;\r
+PROCEDURE LDC_elem_cte( l: LDC_LDC; VAR r: T_REGISTRO);\r
+PROCEDURE LDC_modif_cte( VAR l: LDC_LDC; r: T_REGISTRO);\r
+PROCEDURE LDC_mover_cte( VAR l: LDC_LDC; m: LDC_movimiento; VAR error: BOOLEAN );\r
+PROCEDURE LDC_borrar_cte( VAR l: LDC_LDC );\r
+PROCEDURE LDC_insertar( VAR l: LDC_LDC; m: LDC_movimiento; r: T_REGISTRO );\r
+PROCEDURE LDC_vaciar( VAR l: LDC_LDC );\r
+PROCEDURE LDC_copiar( a: LDC_LDC; VAR b: LDC_LDC );\r
+\r
+implementation\r
+\r
+{ CURSORES DE ESTA IMPLEMENTACION }\r
+{ ========================================================================== }\r
+{ inicializar el almacenamiento }\r
+{ PRE : 'almac' no esta inicializado }\r
+{ POST: 'almac' esta inicializado y vacio }\r
+procedure LDC_Almac_Inicializar( VAR almac : LDC_Almac );\r
+var i : LDC_Puntero;\r
+begin\r
+ almac.primero_dispo := 1;\r
+ for i := 1 to LDC_MAX_CURSOR - 1 do\r
+ begin\r
+ almac.siguientes[i] := i + 1;\r
+ end;\r
+{ for i := 1 to LDC_CURSOR_MAX - 1 do\r
+ begin\r
+ almac.anteriores[i + 1] := i; PREGUNTAR !!!!!!\r
+ end;}\r
+ almac.siguientes[LDC_MAX_CURSOR] := LDC_Nulo;\r
+ {almac.anteriores[1] := LDC_Nulo;}\r
+end;\r
+\r
+{ ========================================================================== }\r
+{ saber si hay lugar para reservar un nuevo elemento en el almacenamiento }\r
+{ PRE : 'almac' esta inicializado }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+ entonces retorna TRUE y sino FALSE }\r
+function LDC_Almac_HayLugar( almac : LDC_Almac ): boolean;\r
+begin\r
+ LDC_Almac_HayLugar := ( almac.primero_dispo <> LDC_Nulo );\r
+end;\r
+\r
+{ ========================================================================== }\r
+{ el pedido de un nuevo elemento al almacenamiento }\r
+{ PRE : 'almac' esta inicializado }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+ entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento\r
+ sino 'puntero' tiene el valor TTDA_Nulo }\r
+procedure LDC_Almac_Reservar( VAR almac : LDC_Almac; VAR puntero : LDC_Puntero );\r
+begin\r
+ if not LDC_Almac_HayLugar( almac ) then\r
+ puntero := LDC_Nulo\r
+ else begin\r
+ puntero := almac.primero_dispo;\r
+ almac.primero_dispo := almac.siguientes[ puntero ];\r
+ end;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{ liberar un elemento del almacenamiento }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r
+{ POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo }\r
+procedure LDC_Almac_Liberar( VAR almac : LDC_Almac; VAR puntero : LDC_Puntero );\r
+begin\r
+ almac.siguientes[ puntero ] := almac.primero_dispo;\r
+ almac.primero_dispo := puntero;\r
+ puntero := LDC_Nulo;\r
+end;\r
+\r
+{ ========================================================================== }\r
+{ acceder al elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r
+{ POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' }\r
+procedure LDC_Almac_Acceder( almac : LDC_Almac; puntero : LDC_Puntero; VAR elemento : LDC_Nodo );\r
+begin\r
+ elemento := almac.almacenamiento[ puntero ];\r
+end;\r
+\r
+{ ========================================================================== }\r
+{ modificar el elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r
+{ POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' }\r
+procedure LDC_Almac_Modificar( VAR almac : LDC_Almac; puntero : LDC_Puntero; elemento : LDC_Nodo );\r
+begin\r
+ almac.almacenamiento[ puntero ] := elemento;\r
+end;\r
+\r
+\r
+\r
+{ Estas son los dos procedimientos principales de la aplicacion }\r
+\r
+PROCEDURE LDC_Inicializar( VAR l: LDC_LDC );\r
+BEGIN\r
+ LDC_Almac_Inicializar( l.almac );\r
+ l.primero := LDC_Nulo;\r
+ l.corriente := LDC_Nulo;\r
+END;\r
+\r
+FUNCTION LDC_vacio( l: LDC_LDC): BOOLEAN;\r
+BEGIN\r
+ LDC_vacio := ( l.Primero = LDC_Nulo);\r
+END;\r
+\r
+FUNCTION LDC_lleno( l: LDC_LDC): BOOLEAN;\r
+BEGIN\r
+ LDC_lleno := not LDC_Almac_HayLugar( l.almac );\r
+END;\r
+\r
+PROCEDURE LDC_elem_cte( l: LDC_LDC; VAR r: T_REGISTRO);\r
+var n : LDC_Nodo;\r
+BEGIN\r
+ { accedo al almacenamiento por el nodo corriente }\r
+ LDC_Almac_Acceder( l.almac, l.Corriente, n );\r
+\r
+ { y se lo asigno al parametro }\r
+ r := n.Elem;\r
+END;\r
+\r
+PROCEDURE LDC_modif_cte( VAR l: LDC_LDC; r: T_REGISTRO);\r
+var n : LDC_Nodo;\r
+BEGIN\r
+ { accedo al almacenamiento por el nodo corriente }\r
+ LDC_Almac_Acceder( l.almac, l.Corriente, n );\r
+\r
+ { y la asigno al parametro }\r
+ n.Elem := r;\r
+\r
+ { y modifico el almacenamiento }\r
+ LDC_Almac_Modificar( l.almac, l.Corriente, n );\r
+END;\r
+\r
+PROCEDURE LDC_mover_cte( VAR l: LDC_LDC; m: LDC_movimiento; VAR error: BOOLEAN );\r
+VAR n : LDC_Nodo;\r
+BEGIN\r
+ error := FALSE;\r
+ CASE m OF\r
+ LDC_primero:\r
+ l.Corriente := l.Primero;\r
+ LDC_siguiente: begin\r
+ { accedo al almacenamiento por el nodo corriente }\r
+ LDC_Almac_Acceder( l.almac, l.Corriente, n );\r
+\r
+ IF ( n.Sig = LDC_Nulo ) THEN\r
+ error := TRUE\r
+ ELSE\r
+ l.corriente := n.sig;\r
+ end;\r
+ LDC_anterior: begin\r
+ { accedo al almacenamiento por el nodo corriente }\r
+ LDC_Almac_Acceder( l.almac, l.Corriente, n );\r
+\r
+ IF ( n.ant = LDC_Nulo ) THEN\r
+ error := TRUE\r
+ ELSE\r
+ l.corriente := n.ant;\r
+ end;\r
+ END;\r
+END;\r
+\r
+PROCEDURE LDC_borrar_cte( VAR l: LDC_LDC );\r
+VAR nc : LDC_Nodo; { Nodo Corriente }\r
+ nac : LDC_Nodo; { Nodo Anterior al Corriente }\r
+ npc: LDC_Nodo; { Nodo Posterior al Corriente }\r
+ tmpp: LDC_Puntero;\r
+BEGIN\r
+ if l.corriente = l.primero then begin\r
+ LDC_Almac_Acceder( l.almac, l.primero, nc );\r
+ l.primero := nc.Sig;\r
+ LDC_Almac_Liberar( l.almac, l.corriente );\r
+ l.corriente := l.primero;\r
+ if ( l.primero <> LDC_Nulo ) then begin { SI NO ERA EL UNICO ELEMENTO }\r
+ LDC_Almac_Acceder( l.almac, l.primero, nc ); {--------------}\r
+ nc.Ant := LDC_Nulo; {-------------------------- PREGUNTAR }\r
+ LDC_Almac_Modificar( l.almac, l.primero, nc); {-------------}\r
+ end;\r
+ end\r
+ else begin\r
+ LDC_Almac_Acceder( l.almac, l.corriente, nc );\r
+ LDC_Almac_Acceder( l.almac, nc.Ant, nac );\r
+ nac.Sig := nc.Sig;\r
+ LDC_Almac_Modificar( l.almac, nc.Ant, nac );\r
+ if ( nc.Sig <> LDC_Nulo ) then begin\r
+ LDC_Almac_Acceder( l.almac, nc.Sig, npc );\r
+ npc.Ant := nc.Ant;\r
+ LDC_Almac_Modificar( l.almac, nc.Sig, npc );\r
+ end;\r
+ LDC_Almac_Liberar( l.almac, l.corriente );\r
+ if ( nc.Ant <> LDC_Nulo ) then\r
+ l.corriente := nc.Ant\r
+ else\r
+ l.corriente := nc.Sig;\r
+ end;\r
+END;\r
+\r
+PROCEDURE LDC_insertar( VAR l: LDC_LDC; m: LDC_movimiento; r: T_REGISTRO );\r
+VAR\r
+ p : LDC_puntero;\r
+ n : LDC_Nodo;\r
+ na: LDC_Nodo;\r
+ ns: LDC_Nodo;\r
+ np: LDC_Puntero;\r
+BEGIN\r
+ { n.Ant := LDC_Nulo; { AGREGADO }\r
+ LDC_Almac_Reservar( l.almac, np );\r
+ n.Elem := r;\r
+ CASE m OF\r
+ LDC_primero: begin\r
+ n.Sig := LDC_Nulo;\r
+ n.Ant := LDC_Nulo;\r
+ if ( l.primero <> LDC_Nulo ) then begin { NO ESTA VACIO EL ALMACENAMIENTO }\r
+ LDC_Almac_Acceder( l.almac, l.primero, na );\r
+ na.Ant := np;\r
+ LDC_Almac_Modificar( l.almac, l.primero, na );\r
+ n.Sig := l.primero;\r
+ end;\r
+ LDC_Almac_Modificar( l.almac, np, n );\r
+ l.primero := np;\r
+ end;\r
+ LDC_siguiente: begin\r
+ n.Ant := LDC_Nulo;\r
+ n.Sig := LDC_Nulo;\r
+ if ( l.primero <> LDC_Nulo ) then begin { NO ESTA VACIO EL ALMACENAMIENTO }\r
+ LDC_Almac_Acceder( l.almac, l.corriente, na );\r
+ n.Ant := l.corriente;\r
+ n.Sig := na.Sig;\r
+ na.Sig := np;\r
+ LDC_Almac_Modificar( l.almac, l.corriente, na );\r
+ end\r
+ else\r
+ l.primero := np;\r
+ if ( n.Sig <> LDC_Nulo ) then begin\r
+ LDC_Almac_Acceder( l.almac, n.Sig, ns );\r
+ ns.Ant := np;\r
+ LDC_Almac_Modificar( l.almac, n.Sig, ns );\r
+ end;\r
+ LDC_Almac_Modificar( l.almac, np, n );\r
+ end;\r
+ LDC_anterior: begin\r
+ n.Ant := LDC_Nulo;\r
+ n.Sig := LDC_Nulo;\r
+ if ( l.primero <> LDC_Nulo ) then begin { NO ESTA VACIO EL ALMACENAMIENTO }\r
+ LDC_Almac_Acceder( l.almac, l.corriente, ns );\r
+ n.Sig := l.corriente;\r
+ n.Ant := ns.Ant;\r
+ ns.Ant := np;\r
+ LDC_Almac_Modificar( l.almac, l.corriente, ns );\r
+ end\r
+ else\r
+ l.primero := np;\r
+ if ( n.Ant <> LDC_Nulo ) then begin\r
+ LDC_Almac_Acceder( l.almac, n.Ant, na );\r
+ na.Sig := np;\r
+ LDC_Almac_Modificar( l.almac, n.Ant, na );\r
+ end\r
+ else { Si el Anterior es nulo, entonces estoy insertando atras del primero }\r
+ l.primero := np;\r
+ LDC_Almac_Modificar( l.almac, np, n );\r
+ end;\r
+ END; { case m of }\r
+ l.Corriente := np;\r
+END;\r
+\r
+PROCEDURE LDC_vaciar( VAR l: LDC_LDC );\r
+VAR np : LDC_Puntero;\r
+ n : LDC_Nodo;\r
+\r
+BEGIN\r
+ np := l.primero;\r
+ while( np <> LDC_Nulo ) do begin\r
+ LDC_Almac_Acceder( l.almac, np, n );\r
+ LDC_Almac_Liberar( l.almac, np );\r
+ np := n.sig;\r
+ end;\r
+ l.primero := LDC_Nulo;\r
+ l.corriente := LDC_Nulo;\r
+END;\r
+\r
+{ pre: 'a' y 'b' estan creadas y 'b' esta vacia }\r
+{ POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero }\r
+PROCEDURE LDC_copiar( a : LDC_LDC; VAR b : LDC_LDC );\r
+VAR np : LDC_Puntero;\r
+ n : LDC_Nodo;\r
+ mp : LDC_Puntero;\r
+ m : LDC_Nodo;\r
+ ms : LDC_Puntero;\r
+ ma : LDC_Puntero;\r
+\r
+BEGIN\r
+ if ( a.primero = LDC_Nulo ) then exit;\r
+ np := a.primero;\r
+ LDC_Almac_Acceder( a.almac, np, n );\r
+ LDC_Almac_Reservar( b.almac, mp );\r
+ b.primero := mp;\r
+ b.corriente := mp;\r
+ m.elem := n.elem;\r
+ m.Ant := LDC_Nulo;\r
+\r
+ while ( n.sig <> LDC_Nulo ) do begin\r
+\r
+ LDC_Almac_Reservar( b.almac, ms );\r
+ m.sig := ms;\r
+ LDC_Almac_Modificar( b.almac, mp, m );\r
+\r
+ np := n.sig;\r
+ LDC_Almac_Acceder( a.almac, np, n );\r
+\r
+ m.Ant := mp; { n.Ant; } \r
+ mp := ms;\r
+ m.elem := n.elem;\r
+\r
+ end;\r
+ m.sig := LDC_Nulo;\r
+ LDC_Almac_Modificar( b.almac, mp, m );\r
+END;\r
+\r
+end.\r
--- /dev/null
+VACIO\r
+Hubo un error, clave ya existente\r
+DNI: 00000001 | Nombre: Luca\r
+DNI: 00000001 | Nombre: Luca\r
+DNI: 00000002 | Nombre: LucaXX\r
+DNI: 00000005 | Nombre: LucaX\r
+DNI: 00000012 | Nombre: LucaXXXX\r
+DNI: 00000015 | Nombre: LucaXXX\r
+DNI: 00000032 | Nombre: LucaXX\r
+DNI: 00000105 | Nombre: LucaX\r
+DNI: 00000115 | Nombre: LucaXXX\r
+DNI: 00000205 | Nombre: LucaX\r
+DNI: 00000215 | Nombre: LucaXXX\r
+DNI: 00000412 | Nombre: LucaXXXX\r
+DNI: 00001012 | Nombre: LucaXXXX\r
+DNI: 00010002 | Nombre: LucaXX\r
+NO VACIO\r
+DNI: 00000215 | Nombre: LucaXXX\r
+DNI: 00000205 | Nombre: LucaX\r
+DNI: 00001012 | Nombre: LucaXXXX\r
+DNI: 00000115 | Nombre: LucaXXX\r
+DNI: 00010002 | Nombre: LucaXX\r
+DNI: 00000105 | Nombre: LucaX\r
+DNI: 00000032 | Nombre: LucaXX\r
+despues de borrar '00000002'\r
+DNI: 00000001 | Nombre: Luca\r
+DNI: 00000005 | Nombre: LucaX\r
+DNI: 00000012 | Nombre: LucaXXXX\r
+DNI: 00000015 | Nombre: LucaXXX\r
+DNI: 00000032 | Nombre: LucaXX\r
+DNI: 00000105 | Nombre: LucaX\r
+DNI: 00000115 | Nombre: LucaXXX\r
+DNI: 00000205 | Nombre: LucaX\r
+DNI: 00000215 | Nombre: LucaXXX\r
+DNI: 00000412 | Nombre: LucaXXXX\r
+DNI: 00001012 | Nombre: LucaXXXX\r
+DNI: 00010002 | Nombre: LucaXX\r
+DNI: 00010002 | Nombre: LucaXX\r
+DNI: 00000002 | Nombre: NUEVO\r
+DNI: 00000002 | Nombre: NUEVO\r
+despues de modificar '00100002'\r
+DNI: 00000001 | Nombre: Luca\r
+DNI: 00000002 | Nombre: NUEVO\r
+DNI: 00000005 | Nombre: LucaX\r
+DNI: 00000012 | Nombre: LucaXXXX\r
+DNI: 00000015 | Nombre: LucaXXX\r
+DNI: 00000032 | Nombre: LucaXX\r
+DNI: 00000105 | Nombre: LucaX\r
+DNI: 00000115 | Nombre: LucaXXX\r
+DNI: 00000205 | Nombre: LucaX\r
+DNI: 00000215 | Nombre: LucaXXX\r
+DNI: 00000412 | Nombre: LucaXXXX\r
+DNI: 00001012 | Nombre: LucaXXXX\r
+Mostrando resultados de busqueda desde '00000012' hasta ' 00000412'\r
+DNI: 00000412 | Nombre: LucaXXXX\r
+DNI: 00000215 | Nombre: LucaXXX\r
+DNI: 00000205 | Nombre: LucaX\r
+DNI: 00000115 | Nombre: LucaXXX\r
+DNI: 00000105 | Nombre: LucaX\r
+DNI: 00000032 | Nombre: LucaXX\r
+DNI: 00000015 | Nombre: LucaXXX\r
+DNI: 00000012 | Nombre: LucaXXXX\r
--- /dev/null
+unit PILA_C;\r
+{\r
+\r
+ IMPLEMENTACION : pilas\r
+\r
+ ALMACENAMIENTO : CURSORES\r
+}\r
+\r
+\r
+\r
+{ ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular }\r
+\r
+interface\r
+\r
+{ usa las funciones generales de TDAs }\r
+uses\r
+ GRAL;\r
+\r
+{ maximo tamano del cursor }\r
+const\r
+ PILAC_MAX_CURSOR = 100;\r
+\r
+{ tipos propios de la lista para definir el cursor }\r
+TYPE\r
+ PILAC_puntero = integer;\r
+\r
+const\r
+ PILAC_nulo : PILAC_puntero = 0;\r
+\r
+type\r
+ PILAC_nodo = RECORD\r
+ Elem : T_REGISTRO;\r
+ Sig : PILAC_puntero;\r
+ END;\r
+\r
+ { ahora le toca definir el cursor }\r
+ PILAC_Almac = record\r
+ almacenamiento : array [ 1 .. PILAC_MAX_CURSOR ] of PILAC_Nodo;\r
+ siguientes : array [ 1 .. PILAC_MAX_CURSOR ] of PILAC_Puntero;\r
+ primero_dispo : PILAC_puntero;\r
+ end;\r
+\r
+ T_PILAC = RECORD\r
+ almac : PILAC_Almac;\r
+ primero: PILAC_puntero;\r
+ END;\r
+\r
+{ ========= }\r
+\r
+{ INTERFASE }\r
+\r
+PROCEDURE PILAC_Inicializar( VAR l: T_PILAC );\r
+FUNCTION PILAC_vacio( l: T_PILAC): BOOLEAN;\r
+FUNCTION PILAC_lleno( l: T_PILAC): BOOLEAN;\r
+PROCEDURE PILAC_poner( VAR l: T_PILAC; VAR e: T_REGISTRO );\r
+PROCEDURE PILAC_sacar( VAR l: T_PILAC; VAR e: T_REGISTRO);\r
+PROCEDURE PILAC_vaciar( VAR l: T_PILAC );\r
+PROCEDURE PILAC_copiar( a: T_PILAC; VAR b: T_PILAC );\r
+\r
+\r
+implementation\r
+\r
+{ CURSORES DE ESTA IMPLEMENTACION }\r
+{ ========================================================================== }\r
+{ inicializar el almacenamiento }\r
+{ PRE : 'almac' no esta inicializado }\r
+{ POST: 'almac' esta inicializado y vacio }\r
+\r
+procedure PILAC_Almac_Inicializar( VAR almac : PILAC_Almac );\r
+ var\r
+ i : PILAC_Puntero;\r
+\r
+ begin\r
+ almac.primero_dispo := 1;\r
+ for i := 1 to PILAC_MAX_CURSOR - 1 do\r
+ begin\r
+ almac.siguientes[i] := i + 1;\r
+ end;\r
+ almac.siguientes[PILAC_MAX_CURSOR] := PILAC_Nulo;\r
+ end;\r
+\r
+{ ========================================================================== }\r
+{ saber si hay lugar para reservar un nuevo elemento en el almacenamiento }\r
+{ PRE : 'almac' esta inicializado }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+ entonces retorna TRUE y sino FALSE }\r
+function PILAC_Almac_HayLugar( almac : PILAC_Almac ): boolean;\r
+ begin\r
+ PILAC_Almac_HayLugar := not ( almac.primero_dispo = PILAC_Nulo );\r
+ end;\r
+\r
+{ ========================================================================== }\r
+{ el pedido de un nuevo elemento al almacenamiento }\r
+{ PRE : 'almac' esta inicializado }\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r
+ entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento\r
+ sino 'puntero' tiene el valor TTDA_Nulo }\r
+procedure PILAC_Almac_Reservar( VAR almac : PILAC_Almac; VAR puntero : PILAC_Puntero );\r
+ begin\r
+ if not PILAC_Almac_HayLugar( almac )\r
+ then\r
+ puntero := PILAC_Nulo\r
+ else begin\r
+ puntero := almac.primero_dispo;\r
+ almac.primero_dispo := almac.siguientes[ puntero ];\r
+ end;\r
+ end;\r
+\r
+{ ========================================================================== }\r
+{ liberar un elemento del almacenamiento }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r
+{ POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo }\r
+procedure PILAC_Almac_Liberar( VAR almac : PILAC_Almac; VAR puntero : PILAC_Puntero );\r
+ begin\r
+ almac.siguientes[ puntero ] := almac.primero_dispo;\r
+ almac.primero_dispo := puntero;\r
+ puntero := PILAC_Nulo;\r
+ end;\r
+\r
+{ ========================================================================== }\r
+{ acceder al elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r
+{ POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' }\r
+procedure PILAC_Almac_Acceder( almac : PilaC_Almac; puntero : PILAC_Puntero; VAR elemento : PILAC_Nodo );\r
+ begin\r
+ elemento := almac.almacenamiento[ puntero ];\r
+ end;\r
+\r
+{ ========================================================================== }\r
+{ modificar el elemento del almacenamiento apuntado por un puntero }\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r
+{ POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' }\r
+procedure PILAC_Almac_Modificar( VAR almac : PILAC_Almac; puntero : PILAC_Puntero; elemento : PILAC_Nodo );\r
+ begin\r
+ almac.almacenamiento[ puntero ] := elemento;\r
+ end;\r
+\r
+{ Estas son los dos procedimientos principales de la aplicación }\r
+PROCEDURE PILAC_Inicializar ( VAR l: T_PILAC );\r
+ BEGIN\r
+ PILAC_Almac_Inicializar( l.almac );\r
+ l.primero := PILAC_Nulo;\r
+ END;\r
+\r
+FUNCTION PILAC_vacio( l: T_PILAC): BOOLEAN;\r
+ BEGIN\r
+ PILAC_vacio := ( l.Primero = PILAC_Nulo);\r
+ END;\r
+\r
+FUNCTION PILAC_lleno( l: T_PILAC): BOOLEAN;\r
+ BEGIN\r
+ PILAC_lleno := not PILAC_Almac_HayLugar( l.almac );\r
+ END;\r
+\r
+PROCEDURE PILAC_poner ( VAR l: T_PILAC; var e: T_REGISTRO);\r
+ VAR\r
+ n : PILAC_Nodo;\r
+ np: PILAC_Puntero;\r
+\r
+ BEGIN\r
+ n.Elem := e;\r
+ n.sig := l.primero;\r
+ PILAC_Almac_Reservar( l.almac, np );\r
+ PILAC_Almac_Modificar( l.almac, np, n );\r
+ l.primero := np;\r
+ END;\r
+\r
+{ pre: no esta vacia }\r
+PROCEDURE PILAC_sacar ( VAR l: T_PILAC; VAR e: T_REGISTRO);\r
+ VAR\r
+ n : PILAC_Nodo;\r
+ tmp : PILAC_Nodo;\r
+ tmpp: PILAC_Puntero;\r
+\r
+ BEGIN\r
+ PILAC_Almac_Acceder( l.almac, l.primero, n );\r
+ PILAC_Almac_Liberar( l.almac, l.primero );\r
+ l.primero := n.Sig;\r
+ { y se lo asigno al parametro }\r
+ e := n.Elem;\r
+ END;\r
+\r
+PROCEDURE PILAC_vaciar ( VAR l: T_PILAC );\r
+ VAR\r
+ np : PILAC_Puntero;\r
+ n : PILAC_Nodo;\r
+\r
+ BEGIN\r
+ np := l.primero;\r
+ while( np <> PILAC_Nulo ) do begin\r
+ PILAC_Almac_Acceder( l.almac, np, n );\r
+ PILAC_Almac_Liberar( l.almac, np );\r
+ np := n.sig;\r
+ end;\r
+ l.primero := PILAC_Nulo;\r
+ END;\r
+\r
+{ pre: 'a' y 'b' estan creadas y 'b' esta vacia }\r
+{ POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero }\r
+PROCEDURE PILAC_copiar ( a : T_PILAC; VAR b : T_PILAC );\r
+ VAR\r
+ np, mp, tmpp : PILAC_Puntero;\r
+ n,m : PILAC_Nodo;\r
+\r
+ BEGIN\r
+ if a.primero = PILAC_Nulo then exit;\r
+ np := a.primero;\r
+ PILAC_Almac_Acceder( a.almac, np, n );\r
+ PILAC_Almac_Reservar( b.almac, mp );\r
+ b.primero := mp;\r
+ m.elem := n.elem;\r
+ while( n.sig <> PILAC_Nulo ) do begin\r
+ PILAC_Almac_Reservar( b.almac, tmpp );\r
+ m.sig := tmpp;\r
+ PILAC_Almac_Modificar( b.almac, mp, m );\r
+ np := n.sig;\r
+ PILAC_Almac_Acceder( a.almac, np, n );\r
+ mp := tmpp;\r
+ m.elem := n.elem;\r
+ end;\r
+ m.sig := PILAC_Nulo;\r
+ PILAC_Almac_Modificar( b.almac, mp, m );\r
+ END;\r
+\r
+end.\r
+\r
--- /dev/null
+unit PROG_GRL;\r
+\r
+{\r
+ Unidad General para utilizar con los programas que utilicen el archivo de comandos\r
+ Tambien incluye algunas funciones y procedimientos utiles para la manipulacion de datos.\r
+}\r
+\r
+interface\r
+\r
+ uses\r
+ GRAL, DOS, CRT, TABLA, ABO_AB, ABO_UTIL, PILA_C;\r
+\r
+ type\r
+ T_COMANDO_TABLA = record\r
+ Comando: string[2];\r
+ DNI: string[8];\r
+ Nombre: string[40];\r
+ Movimiento: string[1];\r
+ DNI_hasta: string[8];\r
+ end;\r
+ T_COMANDO_ABO = record\r
+ Comando: string[2];\r
+ DNI: string[8];\r
+ Nombre: string[40];\r
+ end;\r
+ ID_COMANDO = ( INS, IO, ORDEN, BC, BR, LS, LC, BO, MO, LI, DESC );\r
+\r
+ T_ARCHIVO_COMANDOS_TABLA = file of T_COMANDO_TABLA;\r
+\r
+ T_ARCHIVO_COMANDOS_ABO = file of T_COMANDO_ABO;\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Muestra un mensaje de bienvenida al programa\r
+ {----------------------------------------------------------------------------}\r
+ procedure mensajeDeEntrada( descripcion: String );\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Funcion: verifica si existe un archivo.\r
+ {----------------------------------------------------------------------------}\r
+ function existeArchivo( nombre: String ): boolean;\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Procesa los parametros de la ejecucion del programa\r
+ {----------------------------------------------------------------------------}\r
+ procedure procesarParametros( var archivoEntradaTabla: T_ARCHIVO_COMANDOS_TABLA;\r
+ var archivoEntradaABO: T_ARCHIVO_COMANDOS_ABO;\r
+ var archivoSalida: text; var error: boolean );\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Muestra un mensaje de error y la sintaxis del programa.\r
+ {----------------------------------------------------------------------------}\r
+ procedure errorParametros;\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Muestra mensaje introductorio en archivo de salida\r
+ {----------------------------------------------------------------------------}\r
+ procedure intro( var f: text );\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Muestra mensaje introductorio en archivo de salida\r
+ {----------------------------------------------------------------------------}\r
+ procedure introTabla( var f: text );\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Muestra mensaje introductorio en archivo de salida\r
+ {----------------------------------------------------------------------------}\r
+ procedure introABO( var f: text );\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Funcion: Convierte un dato del tipo T_MOVIM en un string\r
+ {----------------------------------------------------------------------------}\r
+ function movimToStr( m: T_MOVIM): string;\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Funcion: Convierte un dato del tipo ID_COMANDO en un string\r
+ {----------------------------------------------------------------------------}\r
+ function comandoToStr( c: ID_COMANDO ): string;\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Funcion: Convierte un string en un dato del tipo ID_COMANDO\r
+ {----------------------------------------------------------------------------}\r
+ function strToComando( s: string ): ID_COMANDO;\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Funcion: Convierte un string en un dato del tipo T_MOVIM\r
+ {----------------------------------------------------------------------------}\r
+ function strToMovim( s: string; var error: boolean ): T_MOVIM;\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Agrega el texto de un comando a ejecutar en el archivo de salida\r
+ {----------------------------------------------------------------------------}\r
+ procedure agregaComandoTBL( var f: text; c: T_COMANDO_TABLA );\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Agrega el texto de un comando a ejecutar en el archivo de salida\r
+ {----------------------------------------------------------------------------}\r
+ procedure agregaComandoABO( var f: text; c: T_COMANDO_ABO );\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Agrega mensaje de error en el archivo de salida\r
+ {----------------------------------------------------------------------------}\r
+ procedure agregaError( var f: text; cmd, msg: string );\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Agrega mensaje de error en el archivo de salida\r
+ {----------------------------------------------------------------------------}\r
+ procedure agregaRegistro( var f: text; cmd: string; r: T_REGISTRO );\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Agrega mensaje de error en el archivo de salida\r
+ {----------------------------------------------------------------------------}\r
+ procedure mostrarPila( var f: text; var p: T_PILAC );\r
+\r
+\r
+implementation\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Muestra un mensaje de bienvenida al programa\r
+ {----------------------------------------------------------------------------}\r
+ procedure mensajeDeEntrada( descripcion: String );\r
+\r
+ begin\r
+ writeln;\r
+ writeln( 'ALGORITMOS Y PROGRAMACION II - Trabajo Practico n. 2' );\r
+ writeln( 'GRUPO 22 - Primer Cuatrimestre 2000' );\r
+ writeln;\r
+ writeln( descripcion );\r
+ writeln;\r
+ end;\r
+\r
+ {-- Fin del Procedimiento --}\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Funcion: verifica si existe un archivo.\r
+ {----------------------------------------------------------------------------}\r
+\r
+ function existeArchivo( nombre: String ): boolean;\r
+\r
+ { funcion extrida de la ayuda del Turbo Pascal 7 }\r
+\r
+ var\r
+ arch: text;\r
+\r
+ begin\r
+ {$I-}\r
+ Assign( arch, nombre );\r
+ FileMode := 0; { Solo lectura }\r
+ Reset( arch );\r
+ Close( arch );\r
+ {$I+}\r
+ ExisteArchivo := (IOResult = 0) and (nombre <> '');\r
+ end;\r
+\r
+ {-- Fin de la Funcion ExisteArchivo --}\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Procesa los parametros de la ejecucion del programa\r
+ {----------------------------------------------------------------------------}\r
+\r
+ procedure procesarParametros( var archivoEntradaTabla: T_ARCHIVO_COMANDOS_TABLA;\r
+ var archivoEntradaABO: T_ARCHIVO_COMANDOS_ABO;\r
+ var archivoSalida: text; var error: boolean );\r
+\r
+ begin\r
+ if ( paramcount = 3 ) then begin\r
+ if ( existeArchivo( paramstr( 1 ) ) and existeArchivo( paramstr( 2 ) ) ) then begin\r
+ assign( archivoEntradaTabla, paramstr( 1 ) );\r
+ reset( archivoEntradaTabla );\r
+ assign( archivoEntradaABO, paramstr( 2 ) );\r
+ reset( archivoEntradaABO );\r
+ assign( archivoSalida, paramstr( 3 ) );\r
+ rewrite( archivoSalida );\r
+ error := false;\r
+ end\r
+ else\r
+ error := true;\r
+ end\r
+ else\r
+ error := true;\r
+ end;\r
+\r
+ {-- Fin del Procedimiento procesarParametros --}\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Muestra un mensaje de error y la sintaxis del programa.\r
+ {----------------------------------------------------------------------------}\r
+\r
+ procedure errorParametros;\r
+\r
+ var\r
+ dir: dirstr;\r
+ fname: namestr;\r
+ ext: extstr;\r
+\r
+ begin\r
+ fsplit( paramstr( 0 ), dir, fname, ext );\r
+ writeln;\r
+ writeln;\r
+ writeln( 'ERROR: No se pudieron abrir los archivos o numero de parametros incorrectos.' );\r
+ writeln( ' Verifique que el archivo de comandos exista y que el archivo de salida no.' );\r
+ writeln( ' Ademas asegurese de que tenga permiso de escritura en la unidad que desee' );\r
+ writeln( ' guardar el archivo de salida.' );\r
+ writeln;\r
+ writeln( 'Modo de uso:' );\r
+ writeln( ' ', fname, ' archivo_comandos_tabla archivo_comandos_abo archivo_salida' );\r
+ writeln;\r
+ end;\r
+\r
+ {-- Fin del Procedimiento errorParametros --}\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Muestra mensaje introductorio en archivo de salida\r
+ {----------------------------------------------------------------------------}\r
+\r
+ procedure intro( var f: text );\r
+\r
+ begin\r
+ writeln( f );\r
+ writeln( f );\r
+ writeln( f, 'Archivo de Comandos de Tabla: ', ParamStr( 1 ) );\r
+ writeln( f, 'Archivo de Comandos de ABO : ', ParamStr( 2 ) );\r
+ writeln( f, 'Archivo de Informacion : ', ParamStr( 3 ) );\r
+ writeln( f );\r
+ end;\r
+\r
+ {-- Fin del Procedimiento --}\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Muestra mensaje introductorio en archivo de salida\r
+ {----------------------------------------------------------------------------}\r
+\r
+ procedure introTabla( var f: text );\r
+\r
+ begin\r
+ writeln( f );\r
+ writeln( f );\r
+ writeln( f, 'PROCESO DE ARCHIVO DE COMANDOS DE TABLA' );\r
+ writeln( f, '======= == ======= == ======== == =====' );\r
+ writeln( f );\r
+ writeln( f );\r
+ end;\r
+\r
+ {-- Fin del Procedimiento --}\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Muestra mensaje introductorio en archivo de salida\r
+ {----------------------------------------------------------------------------}\r
+\r
+ procedure introABO( var f: text );\r
+\r
+ begin\r
+ writeln( f );\r
+ writeln( f );\r
+ writeln( f, 'PROCESO DE ARCHIVO DE COMANDOS DEL ABO' );\r
+ writeln( f, '======= == ======= == ======== === ===' );\r
+ writeln( f );\r
+ writeln( f );\r
+ end;\r
+\r
+ {-- Fin del Procedimiento --}\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Funcion: Convierte un dato del tipo T_MOVIM en un string\r
+ {----------------------------------------------------------------------------}\r
+\r
+ function movimToStr( m: T_MOVIM): string;\r
+\r
+ begin\r
+ case ( m ) of\r
+ T_MOVIM_primero:\r
+ movimToStr := 'P';\r
+ T_MOVIM_ultimo:\r
+ movimToStr := 'U';\r
+ T_MOVIM_anterior:\r
+ movimToStr := 'A';\r
+ T_MOVIM_siguiente:\r
+ movimToStr := 'S';\r
+ end;\r
+ end;\r
+\r
+ {-- Fin del Procedimiento --}\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Funcion: Convierte un dato del tipo ID_COMANDO en un string\r
+ {----------------------------------------------------------------------------}\r
+\r
+ function comandoToStr( c: ID_COMANDO ): string;\r
+\r
+ begin\r
+ case ( c ) of\r
+ INS:\r
+ comandoToStr := 'IN';\r
+ IO:\r
+ comandoToStr := 'IO';\r
+ ORDEN:\r
+ comandoToStr := 'OR';\r
+ BC:\r
+ comandoToStr := 'BC';\r
+ BR:\r
+ comandoToStr := 'BR';\r
+ LS:\r
+ comandoToStr := 'LS';\r
+ LC:\r
+ comandoToStr := 'LC';\r
+ BO:\r
+ comandoToStr := 'BO';\r
+ MO:\r
+ comandoToStr := 'MO';\r
+ LI:\r
+ comandoToStr := 'LI';\r
+ else\r
+ comandoToStr := 'DE';\r
+ end;\r
+ end;\r
+\r
+ {-- Fin del Procedimiento --}\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Funcion: Convierte un string en un dato del tipo ID_COMANDO\r
+ {----------------------------------------------------------------------------}\r
+\r
+ function strToComando( s: string ): ID_COMANDO;\r
+\r
+ begin\r
+ if ( ( s = 'IN' ) or ( s = 'in' ) or ( s = 'In' ) or ( s = 'iN' ) ) then\r
+ strToComando := INS\r
+ else if ( ( s = 'IO' ) or ( s = 'io' ) or ( s = 'Io' ) or ( s = 'iO' ) ) then\r
+ strToComando := IO\r
+ else if ( ( s = 'OR' ) or ( s = 'or' ) or ( s = 'Or' ) or ( s = 'oR' ) ) then\r
+ strToComando := ORDEN\r
+ else if ( ( s = 'BC' ) or ( s = 'bc' ) or ( s = 'Bc' ) or ( s = 'bC' ) ) then\r
+ strToComando := BC\r
+ else if ( ( s = 'BR' ) or ( s = 'br' ) or ( s = 'Br' ) or ( s = 'bR' ) ) then\r
+ strToComando := BR\r
+ else if ( ( s = 'LS' ) or ( s = 'ls' ) or ( s = 'Ls' ) or ( s = 'lS' ) ) then\r
+ strToComando := LS\r
+ else if ( ( s = 'LC' ) or ( s = 'lc' ) or ( s = 'Lc' ) or ( s = 'lC' ) ) then\r
+ strToComando := LC\r
+ else if ( ( s = 'BO' ) or ( s = 'bo' ) or ( s = 'bO' ) or ( s = 'Bo' ) ) then\r
+ strToComando := BO\r
+ else if ( ( s = 'MO' ) or ( s = 'mo' ) or ( s = 'mO' ) or ( s = 'Mo' ) ) then\r
+ strToComando := MO\r
+ else if ( ( s = 'LI' ) or ( s = 'li' ) or ( s = 'Li' ) or ( s = 'lI' ) ) then\r
+ strToComando := LI\r
+ else\r
+ strToComando := DESC;\r
+ end;\r
+\r
+ {-- Fin del Procedimiento --}\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Funcion: Convierte un string en un dato del tipo ID_COMANDO\r
+ {----------------------------------------------------------------------------}\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Funcion: Convierte un string en un dato del tipo T_MOVIM\r
+ {----------------------------------------------------------------------------}\r
+\r
+ function strToMovim( s: string; var error: boolean ): T_MOVIM;\r
+\r
+ begin\r
+ error := false;\r
+ if ( ( s = 'P' ) or ( s = 'p' ) ) then\r
+ strToMovim := T_MOVIM_primero\r
+ else if ( ( s = 'U' ) or ( s = 'u' ) ) then\r
+ strToMovim := T_MOVIM_ultimo\r
+ else if ( ( s = 'A' ) or ( s = 'a' ) ) then\r
+ strToMovim := T_MOVIM_anterior\r
+ else if ( ( s = 'S' ) or ( s = 's' ) ) then\r
+ strToMovim := T_MOVIM_siguiente\r
+ else begin\r
+ strToMovim := T_MOVIM_primero;\r
+ error := true;\r
+ end;\r
+ end;\r
+\r
+ {-- Fin del Procedimiento --}\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Agrega el texto de un comando a ejecutar en el archivo de salida\r
+ {----------------------------------------------------------------------------}\r
+\r
+ procedure agregaComandoTBL( var f: text; c: T_COMANDO_TABLA );\r
+\r
+ var\r
+ err: boolean;\r
+ m: string;\r
+\r
+ begin\r
+ writeln( f );\r
+ write( f, '>>> ', comandoToStr( strToComando( c.comando ) ) ); { Para que aparezca en mayusculas }\r
+ write( f, ' ; ', c.dni );\r
+ write( f, ' ; ', c.nombre );\r
+ m := movimToStr( strToMovim( c.Movimiento, err ) );\r
+ if ( err ) then begin\r
+ if ( c.movimiento = '*' ) then\r
+ m := 'Desconocido'\r
+ else\r
+ m := 'Ninguno';\r
+ end;\r
+ write( f, ' ; ', m ); { Para que aparezca en mayusculas }\r
+ write( f, ' ; ', c.dni_hasta );\r
+ writeln( f );\r
+ end;\r
+\r
+ {-- Fin del Procedimiento --}\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Agrega el texto de un comando a ejecutar en el archivo de salida\r
+ {----------------------------------------------------------------------------}\r
+\r
+ procedure agregaComandoABO( var f: text; c: T_COMANDO_ABO );\r
+\r
+ var\r
+ err: boolean;\r
+ m: string;\r
+\r
+ begin\r
+ writeln( f );\r
+ write( f, '>>> ', comandoToStr( strToComando( c.comando ) ) ); { Para que aparezca en mayusculas }\r
+ write( f, ' ; ', c.dni );\r
+ write( f, ' ; ', c.nombre );\r
+ writeln( f );\r
+ end;\r
+\r
+ {-- Fin del Procedimiento --}\r
+\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Agrega mensaje de error en el archivo de salida\r
+ {----------------------------------------------------------------------------}\r
+\r
+ procedure agregaError( var f: text; cmd, msg: string );\r
+\r
+ begin\r
+ writeln( f, ' * ' + cmd + ' ERROR: ' + msg );\r
+ end;\r
+\r
+ {-- Fin del Procedimiento --}\r
+\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Agrega mensaje de error en el archivo de salida\r
+ {----------------------------------------------------------------------------}\r
+\r
+ procedure agregaRegistro( var f: text; cmd: string; r: T_REGISTRO );\r
+\r
+ var\r
+ s1, s2: string;\r
+\r
+ begin\r
+ s1 := ' @ ' + cmd + '> REGISTRO: Clave = ';\r
+ s2 := ' | Nombre = ' + r.nombre;\r
+ writeln( f, s1, r.dni, s2 );\r
+ end;\r
+\r
+ {-- Fin del Procedimiento --}\r
+\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Muestra el contenido de una pila (vaciandola)\r
+ {----------------------------------------------------------------------------}\r
+ procedure mostrarPila( var f: text; var p: T_PILAC );\r
+\r
+ var\r
+ r: T_REGISTRO;\r
+\r
+ begin\r
+ while ( not PILAC_vacio( p ) ) do begin\r
+ PILAC_sacar( p, r );\r
+ agregaRegistro( f, 'PILAC', r );\r
+ end;\r
+ end;\r
+\r
+end.
\ No newline at end of file
--- /dev/null
+program TrabajoPracticoII;\r
+\r
+{\r
+ ALGORITMOS Y PROGRAMACIÓN II\r
+ ========== = ============ ==\r
+\r
+ TRABAJO PRÁCTICO NÚMERO 2\r
+ ~~~~~~~ ~~~~~~~~ ~~~~~~ ~\r
+\r
+ Catedra: Carolo\r
+ =======\r
+\r
+ 1er Cuatrimestre 2000\r
+ --- ------------ ----\r
+\r
+ Grupo: 22\r
+ =====\r
+\r
+NOTA: Como se manejan tipos de datos que pueden ser estructuras muy grandes, a veces\r
+ se pasan variables a los procedimientos por referencia (con 'var') sin ser esto\r
+ necesario, pero de esta manera se evita copiar grandes estructuras varias veces\r
+ (en especial en algunos procedimientos recursivos).\r
+}\r
+\r
+{$M 65520, 0, 655360} { evita errores de Stack Overflow }\r
+\r
+ uses\r
+ PROG_GRL, GRAL, TABLA, PILA_C, ABO_AB, ABO_UTIL;\r
+\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Procesa archivo de comandos de tabla\r
+ {----------------------------------------------------------------------------}\r
+ procedure procesarComandosTabla( var fo: text; var fi: T_ARCHIVO_COMANDOS_TABLA;\r
+ var t: T_TABLA );\r
+\r
+ var\r
+ m: T_MOVIM;\r
+ c: T_COMANDO_TABLA;\r
+ cmd: ID_COMANDO;\r
+ r: T_REGISTRO;\r
+ p: T_PILAC;\r
+ err: boolean;\r
+ dni: T_CLAVE;\r
+\r
+ begin\r
+ { Lectura de datos hasta EOF }\r
+ introTabla( fo );\r
+ while ( not eof( fi ) ) do begin\r
+ read( fi, c );\r
+ cmd := strToComando( c.comando );\r
+ agregaComandoTbl( fo, c );\r
+\r
+ { Ejecuta segun tipo comando }\r
+ case ( cmd ) of\r
+\r
+ { Insersion }\r
+ INS: begin\r
+ r.dni := c.dni;\r
+ r.nombre:= c.nombre;\r
+ if ( T_TABLA_Llena( t ) ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'Tabla Llena!' )\r
+ else begin\r
+ m := strToMovim( c.Movimiento, err );\r
+ if ( err ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'Movimiento NO valido ("' + movimToStr( m ) + '")!' )\r
+ else begin\r
+ T_TABLA_Insertar( t, m, r );\r
+ agregaRegistro( fo, comandoToStr( cmd ), r );\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ { Insersion Ordenada }\r
+ IO: begin\r
+ r.dni := c.dni;\r
+ r.nombre:= c.nombre;\r
+ if ( T_TABLA_Llena( t ) ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'Tabla Llena!' )\r
+ else if ( not T_TABLA_Ordenada( t ) ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'Tabla Desordenada!' )\r
+ else begin\r
+ T_TABLA_Insertar_Ord( t, r );\r
+ agregaRegistro( fo, comandoToStr( cmd ), r );\r
+ end;\r
+ end;\r
+\r
+ { Ordenar }\r
+ ORDEN: begin\r
+ if ( T_TABLA_Vacia( t ) ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )\r
+ else\r
+ T_TABLA_Ordenar( t );\r
+ end;\r
+\r
+ { Buscar Clave }\r
+ BC: begin\r
+ if ( T_TABLA_Vacia( t ) ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )\r
+ else if ( not T_TABLA_Ordenada( t ) ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'Tabla Desordenada!' )\r
+ else begin\r
+ T_TABLA_Buscar_Clave( t, r.dni, err );\r
+ if ( err ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'No se encontro la clave "' + c.dni + '"!' )\r
+ else begin\r
+ T_TABLA_Elem_Cte( t, r );\r
+ agregaRegistro( fo, comandoToStr( cmd ), r );\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ { Buscar Rango }\r
+ BR: begin\r
+ r.dni := c.dni;\r
+ dni := c.dni_hasta;\r
+ if ( T_TABLA_Vacia( t ) ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )\r
+ else if ( not T_TABLA_Ordenada( t ) ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'Tabla Desordenada!' )\r
+ else begin\r
+ T_TABLA_Buscar_por_Rango( t, r.dni, dni, p, err );\r
+ if ( err ) then\r
+ agregaError( fo, comandoToStr( cmd ),\r
+ 'No se encontro ninguna clave "' + c.dni + '-' + c.dni_hasta + '"!' )\r
+ else begin\r
+ while ( not PILAC_vacio( p ) ) do begin\r
+ PILAC_sacar( p, r );\r
+ agregaRegistro( fo, comandoToStr( cmd ), r );\r
+ end;\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ { Listar Tabla }\r
+ LS: begin\r
+ if ( T_TABLA_Vacia( t ) ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )\r
+ else begin\r
+ T_TABLA_Mover_Cte( t, T_MOVIM_primero, err );\r
+ err:= false;\r
+ while ( not err ) do begin\r
+ T_TABLA_Elem_Cte( t, r );\r
+ agregaRegistro( fo, comandoToStr( cmd ), r );\r
+ T_TABLA_Mover_Cte( t, T_MOVIM_siguiente, err );\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ { Listar Corriente }\r
+ LC: begin\r
+ if ( T_TABLA_Vacia( t ) ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )\r
+ else begin\r
+ T_TABLA_Elem_Cte( t, r );\r
+ agregaRegistro( fo, comandoToStr( cmd ), r );\r
+ end;\r
+ end;\r
+\r
+ { Borrar Corriente }\r
+ BO: begin\r
+ if ( T_TABLA_Vacia( t ) ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )\r
+ else begin\r
+ T_TABLA_Elem_Cte( t, r );\r
+ T_TABLA_Borrar_Cte( t );\r
+ agregaRegistro( fo, comandoToStr( cmd ), r );\r
+ end;\r
+ end;\r
+\r
+ { Modificar Corriente }\r
+ MO: begin\r
+ r.dni := c.dni;\r
+ if ( T_TABLA_Vacia( t ) ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )\r
+ else begin\r
+ T_TABLA_Elem_Cte( t, r );\r
+ agregaRegistro( fo, comandoToStr( cmd ), r );\r
+ r.nombre:= c.nombre;\r
+ T_TABLA_Modif_Cte( t, r );\r
+ agregaRegistro( fo, comandoToStr( cmd ), r );\r
+ end;\r
+ end;\r
+\r
+ { Limpiar Tabla }\r
+ LI:\r
+ T_TABLA_Limpiar( t );\r
+\r
+ { Comando Desconocido }\r
+ else\r
+ agregaError( fo, comandoToStr( cmd ), 'Comando Desconocido!' )\r
+\r
+ end; { case ( cmd ) of }\r
+ end; { while ( not eof( fEnt ) ) do begin }\r
+ end;\r
+ {------------------------------------------------------------------}\r
+ { FIN DEL PROCEDIMIENTO DE PROCESO DE ARCHIVO DE COMANDOS DE TABLA }\r
+ {------------------------------------------------------------------}\r
+\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Procesa archivo de comandos de ABO\r
+ {----------------------------------------------------------------------------}\r
+ procedure procesarComandosABO( var fo: text; var fi: T_ARCHIVO_COMANDOS_ABO;\r
+ var a: ABO_ARBOL );\r
+\r
+ var\r
+ c: T_COMANDO_ABO;\r
+ cmd: ID_COMANDO;\r
+ r: T_REGISTRO;\r
+ p: T_PILAC;\r
+ er: boolean;\r
+\r
+ begin\r
+ introABO( fo );\r
+ { Lectura de datos hasta EOF }\r
+ while ( not eof( fi ) ) do begin\r
+ read( fi, c );\r
+ cmd := strToComando( c.comando );\r
+ agregaComandoABO( fo, c );\r
+\r
+ { Ejecuta segun tipo comando }\r
+ case ( cmd ) of\r
+\r
+ { Insersion Ordenada }\r
+ IO: begin\r
+ r.dni := c.dni;\r
+ r.nombre:= c.nombre;\r
+ ABO_insertar( a, r, er );\r
+ if ( er ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'Ya exite la clave!' )\r
+ else\r
+ agregaRegistro( fo, comandoToStr( cmd ), r );\r
+ end;\r
+\r
+ { Buscar Clave (si el dni es '*' entonces lista el elemento corriente }\r
+ BC: begin\r
+ if ( ABO_vacio( a ) ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'Arbol Vacio!' )\r
+ else begin\r
+ er := false;\r
+ if ( c.dni <> '*' ) then\r
+ ABO_buscar( a, c.dni, er );\r
+ if ( er ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'No se encontro la clave "' + c.dni + '"!' )\r
+ else begin\r
+ ABO_elem_cte( a, r );\r
+ agregaRegistro( fo, comandoToStr( cmd ), r );\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ { Borrar Corriente }\r
+ BO: begin\r
+ if ( ABO_vacio( a ) ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'Arbol Vacio!' )\r
+ else begin\r
+ ABO_elem_cte( a, r );\r
+ ABO_borrar_cte( a );\r
+ agregaRegistro( fo, comandoToStr( cmd ), r );\r
+ end;\r
+ end;\r
+\r
+ { Modificar Corriente }\r
+ MO: begin\r
+ if ( ABO_vacio( a ) ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'Arbol Vacio!' )\r
+ else begin\r
+ ABO_elem_cte( a, r );\r
+ agregaRegistro( fo, comandoToStr( cmd ), r );\r
+ r.dni := c.dni;\r
+ r.nombre := c.nombre;\r
+ ABO_modif_cte( a, r, er );\r
+ if ( er ) then\r
+ agregaError( fo, comandoToStr( cmd ), 'Ya exite la clave!' )\r
+ else\r
+ agregaRegistro( fo, comandoToStr( cmd ), r );\r
+ end;\r
+ end;\r
+\r
+ { Limpiar ABO }\r
+ LI:\r
+ ABO_vaciar( a );\r
+\r
+ { Comando Desconocido }\r
+ else\r
+ agregaError( fo, comandoToStr( cmd ), 'Comando Desconocido!' )\r
+\r
+ end; { case ( cmd ) of }\r
+ end; { while ( not eof( fEnt ) ) do begin }\r
+ end;\r
+ {------------------------------------------------------------------}\r
+ { FIN DEL PROCEDIMIENTO DE PROCESO DE ARCHIVO DE COMANDOS DEL ABO }\r
+ {------------------------------------------------------------------}\r
+\r
+\r
+ {----------------------------------------------------------------------------}\r
+ {- Procedimiento: Lista el arbol de forma ordenada (IN-ORDER).\r
+ {----------------------------------------------------------------------------}\r
+\r
+ PROCEDURE listarABOInOrder( var f: text; var a: ABO_ARBOL );\r
+ PROCEDURE listar_rec( var a: ABO_ARBOL );\r
+ var\r
+ er: boolean;\r
+ c: T_CLAVE;\r
+ r: T_REGISTRO;\r
+\r
+ begin\r
+ { Proceso el subarbol izquierdo }\r
+ ABO_mover_cte( a, ABO_izquierda, er );\r
+ if ( not er ) then begin\r
+ listar_rec( a );\r
+ ABO_mover_cte( a, ABO_padre, er );\r
+ end;\r
+ { Imprimo el elemento actual }\r
+ ABO_elem_cte( a, r );\r
+ agregaRegistro( f, 'ABO', r );\r
+ { Proceso el subarbol derecho }\r
+ ABO_mover_cte( a, ABO_derecha, er );\r
+ if ( not er ) then begin\r
+ listar_rec( a );\r
+ ABO_mover_cte( a, ABO_padre, er );\r
+ end;\r
+ end;\r
+\r
+ var\r
+ er: boolean;\r
+\r
+ begin\r
+ writeln( f );\r
+ writeln( f, 'Listando el arbol IN-ORDER...' );\r
+ writeln( f );\r
+ ABO_mover_cte( a, ABO_raiz, er );\r
+ if ( not er ) then\r
+ listar_rec( a );\r
+ end;\r
+ {------------------------------------------------------------------}\r
+ { FIN DEL PROCEDIMIENTO PARA LISTAR EL ABO IN-ORDER }\r
+ {------------------------------------------------------------------}\r
+\r
+\r
+var\r
+ tbl: T_TABLA;\r
+ p: T_PILAC;\r
+ fEntT: T_ARCHIVO_COMANDOS_TABLA;\r
+ fEntA: T_ARCHIVO_COMANDOS_ABO;\r
+ fSal: text;\r
+ id: ID_COMANDO;\r
+ m: T_MOVIM;\r
+ c: T_COMANDO_TABLA;\r
+ r: T_REGISTRO;\r
+ err: boolean;\r
+ er: boolean;\r
+ cmd: ID_COMANDO;\r
+ valerr: integer;\r
+ s: string;\r
+ dni: T_CLAVE;\r
+ abo: ABO_ARBOL;\r
+\r
+begin\r
+ mensajeDeEntrada( 'Programa principal.' );\r
+ procesarParametros( fEntT, fEntA, fSal, err );\r
+ if ( err ) then begin\r
+ errorParametros;\r
+ exit; { ----------------------------------> SALE DEL PROGRAMA!!!! }\r
+ end;{}\r
+ { Inicializacion de TADs }\r
+ T_TABLA_Crear( tbl );\r
+ PILAC_Inicializar( p );\r
+ ABO_crear( abo );\r
+ { PROCESO DEL ARCHIVO DE COMANDOS DE LA TABLA PARA }\r
+ { CREAR LOS ELEMENTO DE ESTA }\r
+ procesarComandosTabla( fSal, fEntT, tbl );\r
+ { AHORA SE INGRESAN LOS DATOS DE LA TABLA A EL ABO }\r
+ { (Puntos A y B de la parte 4) }\r
+ writeln( fSal );\r
+ writeln( fSal, 'Procesando los datos de la tabla en un ABO...' );\r
+ writeln( fSal );\r
+ if ( not T_TABLA_vacia( tbl ) ) then begin\r
+ { Recorro la tabla agregando los elemento al ABO }\r
+ T_TABLA_mover_cte( tbl, T_MOVIM_primero, err );\r
+ while ( not err ) do begin\r
+ T_TABLA_elem_cte( tbl, r );\r
+ ABO_insertar( abo, r, er );\r
+ if ( er ) then\r
+ agregaError( fSal, 'ABO_insertar', 'El elemento ya existe en el ABO' );\r
+ T_TABLA_mover_cte( tbl, T_MOVIM_siguiente, err );\r
+ end;\r
+ { Busco por rango y listo la pila devuelta }\r
+ ABO_UTIL_buscar_por_rango( abo, '00000001', '99999999', p );\r
+ mostrarPila( fSal, p );\r
+ end\r
+ else\r
+ agregaError( fSal, 'T_TABLA', 'Tabla vacia' );\r
+ { AHORA PROCESA EL ARCHIVO DE COMANDOS DEL ABO }\r
+ { (Punto C de la parte 4) }\r
+ procesarComandosABO( fSal, fEntA, abo );\r
+ { AHORA SE LLAMA AL PROCEDIMIENTO BUSCAR_POR_RANGO }\r
+ { Punto D de la parte 4 }\r
+ if ( not ABO_vacio( abo ) ) then begin\r
+ ABO_UTIL_buscar_por_rango( abo, '10000000', '30000000', p );\r
+ writeln( fSal );\r
+ writeln( fSal, 'Listando los resultados de la busqueda (desde 10000000 hasta 30000000) ...' );\r
+ writeln( fSal );\r
+ mostrarPila( fSal, p );\r
+ end\r
+ else\r
+ agregaError( fSal, 'ABO', 'ABO vacio. No se puede buscar por rango.' );\r
+ { POR ULTIMO LISTAMOS EL ARBOL DE FORMA ORDENADA (IN_ORDER) }\r
+ { Punto E de la parte 4 }\r
+ listarABOInOrder( fSal, abo );\r
+ { FINALIZA LOS ARCHIVOS Y CIERRA EL PROGRAMA CON UN MENSAJE }\r
+ close( fSal );\r
+ close( fEntT );\r
+ close( fEntA );\r
+ writeln( 'Archivos "', paramstr( 1 ), '" y "', paramstr( 2 ), '" procesados con exito.' );\r
+ writeln( 'Puede ver la salida y/o errores en el archivo ', paramstr( 3 ) );\r
+ writeln( 'FIN DEL PROGRAMA' );\r
+end.
\ No newline at end of file
--- /dev/null
+\r
+\r
+PROCESO DE ARCHIVO DE COMANDOS DE TABLA\r
+======= == ======= == ======== == =====\r
+\r
+\r
+\r
+>>> IN ; 23456789 ; TITO ; P ; *\r
+ @ IN> REGISTRO: Clave = 23456789 | Nombre = TITO\r
+\r
+>>> IN ; 28193047 ; RAULITO ; S ; *\r
+ @ IN> REGISTRO: Clave = 28193047 | Nombre = RAULITO\r
+\r
+>>> IN ; 27215947 ; lUCA ; S ; *\r
+ @ IN> REGISTRO: Clave = 27215947 | Nombre = lUCA\r
+\r
+>>> IN ; 33991100 ; LUCA ; S ; *\r
+ @ IN> REGISTRO: Clave = 33991100 | Nombre = LUCA\r
+\r
+>>> IN ; 20102938 ; SUSI ; S ; *\r
+ @ IN> REGISTRO: Clave = 20102938 | Nombre = SUSI\r
+\r
+>>> IN ; 48039201 ; LITA ; S ; *\r
+ @ IN> REGISTRO: Clave = 48039201 | Nombre = LITA\r
+\r
+>>> IN ; 33091321 ; SELMA ; S ; *\r
+ @ IN> REGISTRO: Clave = 33091321 | Nombre = SELMA\r
+\r
+>>> IN ; 99112233 ; PATY ; S ; *\r
+ @ IN> REGISTRO: Clave = 99112233 | Nombre = PATY\r
+\r
+>>> IN ; 00230031 ; MONTY ; S ; *\r
+ @ IN> REGISTRO: Clave = 00230031 | Nombre = MONTY\r
+\r
+>>> IN ; 76428991 ; APU ; S ; *\r
+ @ IN> REGISTRO: Clave = 76428991 | Nombre = APU\r
+\r
+>>> OR ; * ; * ; Desconocido ; *\r
+\r
+Procesando los datos de la tabla en un ABO...\r
+\r
+ @ PILAC> REGISTRO: Clave = 99112233 | Nombre = PATY\r
+ @ PILAC> REGISTRO: Clave = 76428991 | Nombre = APU\r
+ @ PILAC> REGISTRO: Clave = 48039201 | Nombre = LITA\r
+ @ PILAC> REGISTRO: Clave = 33991100 | Nombre = LUCA\r
+ @ PILAC> REGISTRO: Clave = 33091321 | Nombre = SELMA\r
+ @ PILAC> REGISTRO: Clave = 28193047 | Nombre = RAULITO\r
+ @ PILAC> REGISTRO: Clave = 27215947 | Nombre = lUCA\r
+ @ PILAC> REGISTRO: Clave = 23456789 | Nombre = TITO\r
+ @ PILAC> REGISTRO: Clave = 20102938 | Nombre = SUSI\r
+ @ PILAC> REGISTRO: Clave = 00230031 | Nombre = MONTY\r
+\r
+\r
+PROCESO DE ARCHIVO DE COMANDOS DEL ABO\r
+======= == ======= == ======== === ===\r
+\r
+\r
+\r
+>>> IO ; 22334423 ; PRUEBA\r
+ @ IO> REGISTRO: Clave = 22334423 | Nombre = PRUEBA\r
+\r
+>>> IO ; 33441122 ; OTRA\r
+ @ IO> REGISTRO: Clave = 33441122 | Nombre = OTRA\r
+\r
+>>> IN ; 27830120 ; MAS PRUEBAS\r
+ * IN ERROR: Comando Desconocido!\r
+\r
+>>> BC ; 22334423 ; *\r
+ @ BC> REGISTRO: Clave = 22334423 | Nombre = PRUEBA\r
+\r
+>>> BO ; * ; *\r
+ @ BO> REGISTRO: Clave = 22334423 | Nombre = PRUEBA\r
+\r
+>>> LI ; * ; *\r
+\r
+>>> IO ; 09876541 ; NOMBRE1\r
+ @ IO> REGISTRO: Clave = 09876541 | Nombre = NOMBRE1\r
+\r
+>>> IO ; 00203010 ; NOMBRE2\r
+ @ IO> REGISTRO: Clave = 00203010 | Nombre = NOMBRE2\r
+\r
+>>> IO ; 22334455 ; NOMBRE3\r
+ @ IO> REGISTRO: Clave = 22334455 | Nombre = NOMBRE3\r
+\r
+>>> IO ; 11223344 ; NOMBRE4\r
+ @ IO> REGISTRO: Clave = 11223344 | Nombre = NOMBRE4\r
+\r
+>>> IO ; 99887766 ; NOMBRE5\r
+ @ IO> REGISTRO: Clave = 99887766 | Nombre = NOMBRE5\r
+\r
+>>> IO ; 33442211 ; NOMBRE6\r
+ @ IO> REGISTRO: Clave = 33442211 | Nombre = NOMBRE6\r
+\r
+>>> IO ; 87492910 ; NOMBRE7\r
+ @ IO> REGISTRO: Clave = 87492910 | Nombre = NOMBRE7\r
+\r
+>>> IO ; 12332211 ; NOMBRE8\r
+ @ IO> REGISTRO: Clave = 12332211 | Nombre = NOMBRE8\r
+\r
+>>> IO ; 1829300 ; NOMBRE9\r
+ @ IO> REGISTRO: Clave = 1829300 | Nombre = NOMBRE9\r
+\r
+>>> IO ; 30494847 ; NOMBRE10\r
+ @ IO> REGISTRO: Clave = 30494847 | Nombre = NOMBRE10\r
+\r
+>>> IO ; 23431234 ; NOMBRE11\r
+ @ IO> REGISTRO: Clave = 23431234 | Nombre = NOMBRE11\r
+\r
+>>> IO ; 87312344 ; NOMBRE12\r
+ @ IO> REGISTRO: Clave = 87312344 | Nombre = NOMBRE12\r
+\r
+>>> IO ; 33441122 ; NOMBRE13\r
+ @ IO> REGISTRO: Clave = 33441122 | Nombre = NOMBRE13\r
+\r
+>>> IO ; 21029384 ; NOMBRE13\r
+ @ IO> REGISTRO: Clave = 21029384 | Nombre = NOMBRE13\r
+\r
+>>> IO ; 19203948 ; NOMBRE15\r
+ @ IO> REGISTRO: Clave = 19203948 | Nombre = NOMBRE15\r
+\r
+>>> IO ; 16239812 ; NOMBRE16\r
+ @ IO> REGISTRO: Clave = 16239812 | Nombre = NOMBRE16\r
+\r
+>>> IO ; 00000001 ; NOMBRE17\r
+ @ IO> REGISTRO: Clave = 00000001 | Nombre = NOMBRE17\r
+\r
+>>> IO ; 99999999 ; NOMBRE18\r
+ @ IO> REGISTRO: Clave = 99999999 | Nombre = NOMBRE18\r
+\r
+>>> IO ; 01928374 ; NOMBRE19\r
+ @ IO> REGISTRO: Clave = 01928374 | Nombre = NOMBRE19\r
+\r
+>>> IO ; 39489102 ; NOMBRE20\r
+ @ IO> REGISTRO: Clave = 39489102 | Nombre = NOMBRE20\r
+\r
+>>> IO ; 99999999 ; NOMBRE REPETIDO\r
+ * IO ERROR: Ya exite la clave!\r
+\r
+>>> IO ; 88373123 ; NOMBRE21\r
+ @ IO> REGISTRO: Clave = 88373123 | Nombre = NOMBRE21\r
+\r
+>>> IO ; 65471029 ; NOMBRE22\r
+ @ IO> REGISTRO: Clave = 65471029 | Nombre = NOMBRE22\r
+\r
+>>> BC ; 00000001 ; *\r
+ @ BC> REGISTRO: Clave = 00000001 | Nombre = NOMBRE17\r
+\r
+>>> MO ; 22330129 ; MODIFICADO\r
+ @ MO> REGISTRO: Clave = 00000001 | Nombre = NOMBRE17\r
+ @ MO> REGISTRO: Clave = 22330129 | Nombre = MODIFICADO\r
+\r
+>>> BC ; 99999999 ; *\r
+ @ BC> REGISTRO: Clave = 99999999 | Nombre = NOMBRE18\r
+\r
+>>> MO ; 99999998 ; OTRO MODIFICADO\r
+ @ MO> REGISTRO: Clave = 99999999 | Nombre = NOMBRE18\r
+ @ MO> REGISTRO: Clave = 99999998 | Nombre = OTRO MODIFICADO\r
+\r
+>>> IO ; 99999999 ; AHORA SI!\r
+ @ IO> REGISTRO: Clave = 99999999 | Nombre = AHORA SI!\r
+\r
+Listando los resultados de la busqueda (desde 10000000 hasta 30000000) ...\r
+\r
+ @ PILAC> REGISTRO: Clave = 23431234 | Nombre = NOMBRE11\r
+ @ PILAC> REGISTRO: Clave = 22334455 | Nombre = NOMBRE3\r
+ @ PILAC> REGISTRO: Clave = 22330129 | Nombre = MODIFICADO\r
+ @ PILAC> REGISTRO: Clave = 21029384 | Nombre = NOMBRE13\r
+ @ PILAC> REGISTRO: Clave = 19203948 | Nombre = NOMBRE15\r
+ @ PILAC> REGISTRO: Clave = 1829300 | Nombre = NOMBRE9\r
+ @ PILAC> REGISTRO: Clave = 16239812 | Nombre = NOMBRE16\r
+ @ PILAC> REGISTRO: Clave = 12332211 | Nombre = NOMBRE8\r
+ @ PILAC> REGISTRO: Clave = 11223344 | Nombre = NOMBRE4\r
+\r
+Listando el arbol IN-ORDER...\r
+\r
+ @ ABO> REGISTRO: Clave = 00203010 | Nombre = NOMBRE2\r
+ @ ABO> REGISTRO: Clave = 01928374 | Nombre = NOMBRE19\r
+ @ ABO> REGISTRO: Clave = 09876541 | Nombre = NOMBRE1\r
+ @ ABO> REGISTRO: Clave = 11223344 | Nombre = NOMBRE4\r
+ @ ABO> REGISTRO: Clave = 12332211 | Nombre = NOMBRE8\r
+ @ ABO> REGISTRO: Clave = 16239812 | Nombre = NOMBRE16\r
+ @ ABO> REGISTRO: Clave = 1829300 | Nombre = NOMBRE9\r
+ @ ABO> REGISTRO: Clave = 19203948 | Nombre = NOMBRE15\r
+ @ ABO> REGISTRO: Clave = 21029384 | Nombre = NOMBRE13\r
+ @ ABO> REGISTRO: Clave = 22330129 | Nombre = MODIFICADO\r
+ @ ABO> REGISTRO: Clave = 22334455 | Nombre = NOMBRE3\r
+ @ ABO> REGISTRO: Clave = 23431234 | Nombre = NOMBRE11\r
+ @ ABO> REGISTRO: Clave = 30494847 | Nombre = NOMBRE10\r
+ @ ABO> REGISTRO: Clave = 33441122 | Nombre = NOMBRE13\r
+ @ ABO> REGISTRO: Clave = 33442211 | Nombre = NOMBRE6\r
+ @ ABO> REGISTRO: Clave = 39489102 | Nombre = NOMBRE20\r
+ @ ABO> REGISTRO: Clave = 65471029 | Nombre = NOMBRE22\r
+ @ ABO> REGISTRO: Clave = 87312344 | Nombre = NOMBRE12\r
+ @ ABO> REGISTRO: Clave = 87492910 | Nombre = NOMBRE7\r
+ @ ABO> REGISTRO: Clave = 88373123 | Nombre = NOMBRE21\r
+ @ ABO> REGISTRO: Clave = 99887766 | Nombre = NOMBRE5\r
+ @ ABO> REGISTRO: Clave = 99999998 | Nombre = OTRO MODIFICADO\r
+ @ ABO> REGISTRO: Clave = 99999999 | Nombre = AHORA SI!\r
--- /dev/null
+unit TABLA;\r
+\r
+{\r
+ IMPLEMENTACION : TABLA\r
+ ALMACENAMIENTO : LISTA DOBLE CON CURSORES\r
+\r
+}\r
+\r
+interface\r
+\r
+{ usa las funciones generales de TDAs }\r
+uses\r
+ GRAL, LDC, PILA_C;\r
+\r
+{ tipos propios de la tabla }\r
+type\r
+ T_TABLA = record\r
+ datos: LDC_LDC;\r
+ ordenada: boolean;\r
+ end;\r
+\r
+ T_MOVIM = ( T_MOVIM_primero, T_MOVIM_ultimo, T_MOVIM_siguiente, T_MOVIM_anterior );\r
+\r
+\r
+{ ========= }\r
+{ INTERFASE }\r
+\r
+PROCEDURE T_TABLA_Crear( VAR t: T_TABLA );\r
+{ PRE : T nunca fue creada.\r
+ POST: T creada y vacía.}\r
+FUNCTION T_TABLA_Vacia( t: T_TABLA): BOOLEAN;\r
+{ PRE : T creada.\r
+ POST: Si T tiene elementos, entonces es FALSE, sino es TRUE.}\r
+FUNCTION T_TABLA_Llena( t: T_TABLA): BOOLEAN;\r
+{ PRE : T creada.\r
+ POST: Si T tiene lugar para insertar nuevos elementos, entonces es FALSE, sino es TRUE.}\r
+FUNCTION T_TABLA_Ordenada( t: T_TABLA): BOOLEAN;\r
+{ PRE : T no vacía.\r
+ POST: Si T está ordenada, entonces es verdadero, sino es falso.}\r
+PROCEDURE T_TABLA_Elem_Cte( t: T_TABLA; VAR r: T_REGISTRO);\r
+{ PRE : T no vacía.\r
+ POST: R contiene el registro corriente.}\r
+PROCEDURE T_TABLA_Mover_Cte( VAR t: T_TABLA; m: T_MOVIM; VAR error: BOOLEAN );\r
+{ PRE : T no vacía.\r
+ POST:\r
+ Si M = primero, el nuevo corriente es el primer registro y error es falso.\r
+ Si M = ultimo, el nuevo corriente es el último registro y error es falso.\r
+ Si M = siguiente, el nuevo corriente es el siguiente registro del actual corriente y error es falso.\r
+ Si el corriente era el ultimo registro, entonces error es verdadero y el corriente sigue siendo el\r
+ ultimo registro.\r
+ Si M = anterior, el nuevo corriente es el anterior registro del actual corriente y error es falso. Si el corriente era\r
+ el primer registro, entonces error es verdadero y el corriente sigue siendo el primer registro.}\r
+PROCEDURE T_TABLA_Insertar( VAR t: T_TABLA; m: T_MOVIM; r: T_REGISTRO );\r
+{ PRE : T no llena.\r
+ POST:\r
+ Si M = primero, R se agregó, es el primer registro y el nuevo corriente.\r
+ Si M = ultimo, R se agregó, es el último registro y el nuevo corriente.\r
+ Si M = siguiente, R se agregó, es el siguiente registro del corriente, y es el nuevo corriente \r
+ Si M = anterior, R se agregó, es el anterior registro del corriente, y es el nuevo corriente.}\r
+Procedure T_TABLA_Insertar_Ord( var t: T_TABLA ; var r: T_REGISTRO);\r
+{ PRE : T no llena y ordenada.\r
+ POST: El regitro r se insertó en la tabla t de tal manera que esta continúa ordenada y r es el nuevo corriente.\r
+ Si ya existía un registro con la misma clave que r, se inserta después que este.}\r
+PROCEDURE T_TABLA_Limpiar( VAR t: T_TABLA );\r
+{ PRE : T creada.\r
+ POST: T vacía.}\r
+PROCEDURE T_TABLA_Borrar_Cte( VAR t: T_TABLA );\r
+{ PRE : T no vacía.\r
+ POST: Se elimino el registro corriente. El nuevo registro corriente es el siguiente del borrado,\r
+ si el borrado era el ultimo, entonces el nuevo corriente es el primero.}\r
+PROCEDURE T_TABLA_Modif_Cte( VAR t: T_TABLA; r: T_REGISTRO);\r
+{ PRE : T no vacía.\r
+ POST: El contenido del actual corriente fue actualizado con R. Si T estaba ordenada y no se modificaron los datos\r
+ de la clave del corriente, entonces T sigue ordenada. Si T estaba ordenada y se modificaron los datos de la clave\r
+ del corriente, entonces si la nueva clave rompe el orden de T, T no está más ordenada.}\r
+PROCEDURE T_TABLA_Ordenar( VAR t: T_TABLA );\r
+{ PRE : T no vacía.\r
+ POST: T se encuentra ordenada por la clave de sus registros.}\r
+PROCEDURE T_TABLA_Buscar_Clave( VAR t: T_TABLA; c: T_CLAVE; var error: boolean );\r
+{ PRE : T no vacía y ordenada.\r
+ POST: Si C es una clave que existe en T, entonces el nuevo corriente es el registro con clave C y error es falso,\r
+ si no error es verdadero y el corriente es el elemento más cercano al buscado cuya clave es mayor que c.}\r
+PROCEDURE T_TABLA_Buscar_Por_Rango( VAR t: T_TABLA; desde, hasta: T_CLAVE; var p: T_PILAC; var error: boolean );\r
+{ PRE : T no vacía y ordenada. El valor de la clave desde es menor que el valor de la clave hasta. La pila p está vacía.\r
+ POST: Tengo todos los registros cuyas claves se encuetran entre los valores desde y hasta almacendados en la pila p,\r
+ si encuontró como mínimo una clave. El valor de error es false.\r
+ Si no encontró ninguna clave, entonces p sigue vacía y error es true.}\r
+\r
+implementation\r
+\r
+PROCEDURE T_TABLA_Crear( VAR t: T_TABLA );\r
+ begin\r
+ LDC_Inicializar( t.datos );\r
+ t.ordenada := true;\r
+ end;\r
+\r
+FUNCTION T_TABLA_Vacia( t: T_TABLA): BOOLEAN;\r
+ begin\r
+ T_TABLA_Vacia := LDC_vacio( t.datos );\r
+ end;\r
+\r
+FUNCTION T_TABLA_Llena( t: T_TABLA): BOOLEAN;\r
+ begin\r
+ T_TABLA_Llena := LDC_lleno( t.datos );\r
+ end;\r
+\r
+FUNCTION T_TABLA_Ordenada( t: T_TABLA): BOOLEAN;\r
+ begin\r
+ T_TABLA_Ordenada := t.ordenada;\r
+ end;\r
+\r
+PROCEDURE T_TABLA_Elem_Cte( t: T_TABLA; VAR r: T_REGISTRO);\r
+ begin\r
+ LDC_elem_cte( t.datos, r );\r
+ end;\r
+\r
+PROCEDURE T_TABLA_Mover_Cte( VAR t: T_TABLA; m: T_MOVIM; VAR error: BOOLEAN );\r
+ var mov: LDC_movimiento;\r
+ begin\r
+ error := false;\r
+ if ( m <> T_MOVIM_ultimo ) then begin\r
+ case m of\r
+ T_MOVIM_primero:\r
+ mov := LDC_primero;\r
+ T_MOVIM_siguiente:\r
+ mov := LDC_siguiente;\r
+ T_MOVIM_anterior:\r
+ mov := LDC_anterior;\r
+ end;\r
+ LDC_mover_cte( t.datos, mov, error );\r
+ end\r
+ else begin\r
+ while ( not error ) do\r
+ LDC_mover_cte( t.datos, LDC_siguiente, error );\r
+ error := false;\r
+ end;\r
+ end;\r
+\r
+PROCEDURE T_TABLA_Insertar( VAR t: T_TABLA; m: T_MOVIM; r: T_REGISTRO );\r
+ var mov : LDC_movimiento;\r
+ error: boolean;\r
+ begin\r
+ if ( m <> T_MOVIM_ultimo ) then begin\r
+ case m of\r
+ T_MOVIM_primero:\r
+ mov := LDC_primero;\r
+ T_MOVIM_siguiente:\r
+ mov := LDC_siguiente;\r
+ T_MOVIM_anterior:\r
+ mov := LDC_anterior;\r
+ end;\r
+ LDC_insertar( t.datos, mov, r );\r
+ end\r
+ else begin\r
+ if ( not T_TABLA_Vacia( t ) ) then\r
+ T_TABLA_Mover_Cte( t, T_MOVIM_ultimo, error);\r
+ LDC_insertar( t.datos, LDC_siguiente, r );\r
+ end;\r
+ t.ordenada := false;\r
+ end;\r
+\r
+PROCEDURE T_TABLA_Insertar_Ord( var t: T_TABLA ; var r: T_REGISTRO);\r
+ var\r
+ err: boolean;\r
+ reg: T_REGISTRO;\r
+\r
+ begin\r
+ T_TABLA_Buscar_Clave( t, r.dni, err ); {me queda el corriente en el posterior mas cercano}\r
+ T_TABLA_Elem_Cte( t, reg );\r
+ if ( reg.dni > r.dni ) then\r
+ T_TABLA_Insertar( t, T_MOVIM_anterior, r )\r
+ else\r
+ T_TABLA_Insertar( t, T_MOVIM_siguiente, r );\r
+ t.ordenada:= true\r
+ end;\r
+\r
+PROCEDURE T_TABLA_Limpiar( VAR t: T_TABLA );\r
+ begin\r
+ LDC_vaciar( t.datos );\r
+ t.ordenada := true;\r
+ end;\r
+\r
+PROCEDURE T_TABLA_Borrar_Cte( VAR t: T_TABLA );\r
+ begin\r
+ LDC_borrar_cte( t.datos );\r
+ end;\r
+\r
+PROCEDURE T_TABLA_Modif_Cte( VAR t: T_TABLA; r: T_REGISTRO);\r
+ var\r
+ tmp: T_REGISTRO;\r
+ begin\r
+ T_TABLA_Elem_Cte( t, tmp );\r
+ if ( r.dni <> tmp.dni ) then\r
+ t.ordenada := false;\r
+ LDC_modif_cte( t.datos, r );\r
+ end;\r
+\r
+PROCEDURE T_TABLA_Ordenar( VAR t: T_TABLA );\r
+ var\r
+ tmp: T_TABLA;\r
+ r: T_REGISTRO;\r
+ err: boolean;\r
+ actual: T_CLAVE;\r
+\r
+ begin\r
+ T_TABLA_Elem_Cte( t, r );\r
+ actual := r.dni;\r
+ err := false;\r
+ T_TABLA_Crear( tmp );\r
+ LDC_copiar( t.datos, tmp.datos );\r
+ T_TABLA_Limpiar( t );\r
+ T_TABLA_Elem_cte( tmp, r );\r
+ T_TABLA_Insertar( t, T_MOVIM_primero, r );\r
+ T_TABLA_Mover_Cte( tmp, T_MOVIM_siguiente, err );\r
+ while ( not err ) do begin\r
+ T_TABLA_Elem_cte(tmp, r);\r
+ T_TABLA_Insertar_Ord(t, r);\r
+ T_TABLA_Mover_Cte( tmp, T_MOVIM_siguiente, err );\r
+ end;\r
+ T_TABLA_Buscar_Clave( t, actual, err );\r
+ t.ordenada:= true;\r
+ end;\r
+\r
+PROCEDURE T_TABLA_Buscar_Clave( VAR t: T_TABLA; c: T_CLAVE; var error: boolean );\r
+ var\r
+ r: T_REGISTRO;\r
+\r
+ begin\r
+ error:= false;\r
+ T_TABLA_Mover_Cte( t, T_MOVIM_primero, error );\r
+ T_TABLA_Elem_Cte( t, r );\r
+ while ( ( r.dni < c ) and not error ) do begin\r
+ T_TABLA_Mover_Cte( t, T_MOVIM_siguiente, error );\r
+ T_TABLA_Elem_Cte( t, r );\r
+ end;\r
+ if ( r.dni <> c ) then\r
+ error := true;\r
+ end;\r
+\r
+PROCEDURE T_TABLA_Buscar_Por_Rango( VAR t: T_TABLA; desde, hasta: T_CLAVE; var p: T_PILAC; var error: boolean );\r
+ var\r
+ err: boolean;\r
+ r: T_REGISTRO;\r
+\r
+ begin\r
+ error:= true;\r
+ T_TABLA_Buscar_Clave( t, desde, err );\r
+ T_TABLA_Elem_Cte( t, r );\r
+ if ( r.DNI <= hasta ) then begin\r
+ PILAC_poner( p, r );\r
+ T_TABLA_Mover_Cte( t, T_MOVIM_siguiente, err );\r
+ T_TABLA_Elem_Cte( t, r );\r
+ while ( ( r.DNI <= hasta ) and not err ) do begin\r
+ PILAC_poner( p, r );\r
+ T_TABLA_Mover_Cte( t, T_MOVIM_siguiente, err );\r
+ T_TABLA_Elem_Cte( t, r );\r
+ end;\r
+ error := false;\r
+ end;\r
+ end;\r
+\r
+end.
\ No newline at end of file
--- /dev/null
+program test;\r
+\r
+ uses\r
+ ABO_AB, GRAL, ABO_UTIL, PILA_C;\r
+\r
+{ recorrer todos los nodos del arbol procesando todos los elementos }\r
+{ ORDEN de recorrido: como el contenedor ya esta ordenado se recorre en el orden definido para el orden }\r
+PROCEDURE APL_ABO_recorrer_rec( a: ABO_arbol; var f: text );\r
+ PROCEDURE recorrer_rec( a: ABO_arbol );\r
+ VAR\r
+ error: boolean;\r
+ e: T_REGISTRO;\r
+ BEGIN\r
+ { proceso el subarbol izquierdo }\r
+ ABO_mover_cte( a, ABO_izquierda, error );\r
+ IF not error\r
+ THEN BEGIN\r
+ recorrer_rec( a);\r
+ ABO_mover_cte( a, ABO_padre, error );\r
+ END;\r
+ { proceso el nodo corriente }\r
+ ABO_elem_cte( a, e);\r
+ writeln( f, 'DNI: ' + e.dni + ' | Nombre: ' + e.nombre );\r
+ { proceso el subarbol izquierdo }\r
+ ABO_mover_cte( a, ABO_derecha, error );\r
+ IF not error\r
+ THEN BEGIN\r
+ recorrer_rec( a);\r
+{ ABO_mover_cte( a, ABO_padre, error ); no hace falta }\r
+ END;\r
+ END;\r
+VAR\r
+ error: boolean;\r
+BEGIN\r
+ { me voy a la raiz y desde allí proceso todo }\r
+ ABO_mover_cte( a, ABO_raiz, error );\r
+ recorrer_rec( a );\r
+END;\r
+\r
+\r
+ var\r
+ abo: ABO_ARBOL;\r
+ r1: T_REGISTRO;\r
+ r2: T_REGISTRO;\r
+ e: boolean;\r
+ f: text;\r
+ p: T_PILAC;\r
+\r
+ begin\r
+ assign( f, 'log.txt' );\r
+ rewrite( f );\r
+{CREAR}\r
+ ABO_crear( abo );\r
+{VACIO}\r
+ if ABO_vacio( abo ) then\r
+ writeln( f, 'VACIO' );\r
+ r1.dni := '00000001';\r
+ r1.nombre := 'Luca';\r
+{INSERTAR}\r
+ ABO_insertar( abo, r1, e );\r
+ ABO_insertar( abo, r1, e );\r
+ if ( e ) then\r
+ writeln( f, 'Hubo un error, clave ya existente' )\r
+ else\r
+ writeln( f, 'TODO OK (anda mal el programa)' );\r
+ ABO_elem_cte( abo, r2 );\r
+ writeln( f, 'DNI: ' + r2.dni + ' | Nombre: ' + r2.nombre );\r
+ r2.dni := '00000005';\r
+ r2.nombre := 'LucaX';\r
+ ABO_insertar( abo, r2, e );\r
+ r2.dni := '00000002';\r
+ r2.nombre := 'LucaXX';\r
+ ABO_insertar( abo, r2, e );\r
+ r2.dni := '00000015';\r
+ r2.nombre := 'LucaXXX';\r
+ ABO_insertar( abo, r2, e );\r
+ r2.dni := '00000012';\r
+ r2.nombre := 'LucaXXXX';\r
+ ABO_insertar( abo, r2, e );\r
+ r2.dni := '00000105';\r
+ r2.nombre := 'LucaX';\r
+ ABO_insertar( abo, r2, e );\r
+ r2.dni := '00010002';\r
+ r2.nombre := 'LucaXX';\r
+ ABO_insertar( abo, r2, e );\r
+ r2.dni := '00000115';\r
+ r2.nombre := 'LucaXXX';\r
+ ABO_insertar( abo, r2, e );\r
+ r2.dni := '00001012';\r
+ r2.nombre := 'LucaXXXX';\r
+ ABO_insertar( abo, r2, e );\r
+ r2.dni := '00000205';\r
+ r2.nombre := 'LucaX';\r
+ ABO_insertar( abo, r2, e );\r
+ r2.dni := '00000032';\r
+ r2.nombre := 'LucaXX';\r
+ ABO_insertar( abo, r2, e );\r
+ r2.dni := '00000215';\r
+ r2.nombre := 'LucaXXX';\r
+ ABO_insertar( abo, r2, e );\r
+ r2.dni := '00000412';\r
+ r2.nombre := 'LucaXXXX';\r
+ ABO_insertar( abo, r2, e );\r
+ APL_ABO_recorrer_rec( abo , f );\r
+ if not ABO_vacio( abo ) then\r
+ writeln( f, 'NO VACIO' );\r
+{MOVER: padre}\r
+ ABO_mover_cte( abo, ABO_padre, e );\r
+ ABO_elem_cte( abo, r1 );\r
+ writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre );\r
+ ABO_mover_cte( abo, ABO_padre, e );\r
+ ABO_elem_cte( abo, r1 );\r
+ writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre );\r
+ ABO_mover_cte( abo, ABO_padre, e );\r
+ ABO_elem_cte( abo, r1 );\r
+ writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre );\r
+ ABO_mover_cte( abo, ABO_padre, e );\r
+ ABO_elem_cte( abo, r1 );\r
+ writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre );\r
+ ABO_mover_cte( abo, ABO_padre, e );\r
+ ABO_elem_cte( abo, r1 );\r
+ writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre );\r
+ ABO_mover_cte( abo, ABO_padre, e );\r
+ ABO_elem_cte( abo, r1 );\r
+ writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre );\r
+{MOVER: izquierda}\r
+ ABO_mover_cte( abo, ABO_izquierda, e );\r
+ if not e then\r
+ ABO_elem_cte( abo, r1 )\r
+ else\r
+ writeln( f, 'ERROR AL MOVER' );\r
+ writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre );\r
+ { YA ANDA EL BUSCAR!!!!!! }\r
+{BUSCAR}\r
+ ABO_buscar( abo, '00000002', e );\r
+ if e then writeln( f, 'ERROR: buscar!!!' );\r
+{BORRAR}\r
+ ABO_borrar_cte( abo );\r
+ writeln( f, 'despues de borrar ''00000002''' );\r
+ APL_ABO_recorrer_rec( abo , f );\r
+ ABO_buscar( abo, '00010002', e );\r
+ if e then writeln( f, 'ERROR: buscar!!!' );\r
+{ELEM_CTE}\r
+ ABO_elem_cte( abo, r2 );\r
+ writeln( f, 'DNI: ' + r2.dni + ' | Nombre: ' + r2.nombre );\r
+ r2.dni := '00000002';\r
+ r2.nombre := 'NUEVO';\r
+ ABO_modif_cte( abo, r2, e );\r
+ if e then writeln( f, 'ERROR: modif_cte!!!' );\r
+ ABO_elem_cte( abo, r1 );\r
+ writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre );\r
+{MOVER: raiz}\r
+ ABO_mover_cte( abo, ABO_raiz, e );\r
+{MOVER: derecha}\r
+ ABO_mover_cte( abo, ABO_derecha, e );\r
+ if e then writeln( f, 'ERROR: mover_derecha!!!' );\r
+ ABO_mover_cte( abo, ABO_izquierda, e );\r
+ if e then writeln( f, 'ERROR: mover_izquierda!!!' );\r
+ ABO_elem_cte( abo, r1 );\r
+ writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre );\r
+ writeln( f, 'despues de modificar ''00100002''' );\r
+ APL_ABO_recorrer_rec( abo , f );\r
+{BUSCAR POR RANGO}\r
+ PILAC_inicializar( p );\r
+ ABO_UTIL_buscar_por_rango( abo,'00000012', '00000412', p );\r
+ writeln( f, 'Mostrando resultados de busqueda desde ''00000012'' hasta '' 00000412''' );\r
+ while ( not PILAC_vacio( p ) ) do begin\r
+ PILAC_sacar( p, r1 );\r
+ writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre );\r
+ end;\r
+ close( f );\r
+ end.
\ No newline at end of file