]> git.llucax.com Git - z.facultad/75.41/abo.git/commitdiff
Import inicial después del "/var incident". :(
authorLeandro Lucarella <llucax@gmail.com>
Sun, 23 Mar 2003 07:10:16 +0000 (07:10 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Sun, 23 Mar 2003 07:10:16 +0000 (07:10 +0000)
17 files changed:
DESCRIPCION.TXT [new file with mode: 0644]
TP2-1C-2000.rtf [new file with mode: 0644]
ab.pas [new file with mode: 0644]
abo_ab.pas [new file with mode: 0644]
abo_util.pas [new file with mode: 0644]
cmd_abo.pas [new file with mode: 0644]
cmd_tbl.pas [new file with mode: 0644]
gral.pas [new file with mode: 0644]
ldc.pas [new file with mode: 0644]
log.txt [new file with mode: 0644]
pila_c.pas [new file with mode: 0644]
prog_grl.pas [new file with mode: 0644]
programa.pas [new file with mode: 0644]
salida.txt [new file with mode: 0644]
tabla.pas [new file with mode: 0644]
test.pas [new file with mode: 0644]
turbo.dsk [new file with mode: 0644]

diff --git a/DESCRIPCION.TXT b/DESCRIPCION.TXT
new file mode 100644 (file)
index 0000000..f6a2af1
--- /dev/null
@@ -0,0 +1,69 @@
+\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
diff --git a/TP2-1C-2000.rtf b/TP2-1C-2000.rtf
new file mode 100644 (file)
index 0000000..defed04
--- /dev/null
@@ -0,0 +1,155 @@
+{\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
diff --git a/ab.pas b/ab.pas
new file mode 100644 (file)
index 0000000..0f08b9f
--- /dev/null
+++ b/ab.pas
@@ -0,0 +1,195 @@
+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
diff --git a/abo_ab.pas b/abo_ab.pas
new file mode 100644 (file)
index 0000000..96788ee
--- /dev/null
@@ -0,0 +1,325 @@
+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
diff --git a/abo_util.pas b/abo_util.pas
new file mode 100644 (file)
index 0000000..1d32a42
--- /dev/null
@@ -0,0 +1,61 @@
+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
diff --git a/cmd_abo.pas b/cmd_abo.pas
new file mode 100644 (file)
index 0000000..8dfb2fa
--- /dev/null
@@ -0,0 +1,61 @@
+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
diff --git a/cmd_tbl.pas b/cmd_tbl.pas
new file mode 100644 (file)
index 0000000..7e8b91a
--- /dev/null
@@ -0,0 +1,69 @@
+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
diff --git a/gral.pas b/gral.pas
new file mode 100644 (file)
index 0000000..301bab0
--- /dev/null
+++ b/gral.pas
@@ -0,0 +1,51 @@
+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
diff --git a/ldc.pas b/ldc.pas
new file mode 100644 (file)
index 0000000..f3fc655
--- /dev/null
+++ b/ldc.pas
@@ -0,0 +1,373 @@
+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
diff --git a/log.txt b/log.txt
new file mode 100644 (file)
index 0000000..ec20ba9
--- /dev/null
+++ b/log.txt
@@ -0,0 +1,62 @@
+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
diff --git a/pila_c.pas b/pila_c.pas
new file mode 100644 (file)
index 0000000..04e5002
--- /dev/null
@@ -0,0 +1,226 @@
+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
diff --git a/prog_grl.pas b/prog_grl.pas
new file mode 100644 (file)
index 0000000..532486e
--- /dev/null
@@ -0,0 +1,475 @@
+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
diff --git a/programa.pas b/programa.pas
new file mode 100644 (file)
index 0000000..54c0fc3
--- /dev/null
@@ -0,0 +1,419 @@
+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
diff --git a/salida.txt b/salida.txt
new file mode 100644 (file)
index 0000000..741c96f
--- /dev/null
@@ -0,0 +1,198 @@
+\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
diff --git a/tabla.pas b/tabla.pas
new file mode 100644 (file)
index 0000000..f88be52
--- /dev/null
+++ b/tabla.pas
@@ -0,0 +1,262 @@
+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
diff --git a/test.pas b/test.pas
new file mode 100644 (file)
index 0000000..b541eb2
--- /dev/null
+++ b/test.pas
@@ -0,0 +1,172 @@
+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
diff --git a/turbo.dsk b/turbo.dsk
new file mode 100644 (file)
index 0000000..0a14c87
Binary files /dev/null and b/turbo.dsk differ