From 5c62174742a48692b173c5fca160e6c7a1889559 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Sun, 23 Mar 2003 07:10:16 +0000 Subject: [PATCH 1/1] =?utf8?q?Import=20inicial=20despu=C3=A9s=20del=20"/va?= =?utf8?q?r=20incident".=20:(?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- DESCRIPCION.TXT | 69 +++++++ TP2-1C-2000.rtf | 155 ++++++++++++++++ ab.pas | 195 ++++++++++++++++++++ abo_ab.pas | 325 +++++++++++++++++++++++++++++++++ abo_util.pas | 61 +++++++ cmd_abo.pas | 61 +++++++ cmd_tbl.pas | 69 +++++++ gral.pas | 51 ++++++ ldc.pas | 373 +++++++++++++++++++++++++++++++++++++ log.txt | 62 +++++++ pila_c.pas | 226 +++++++++++++++++++++++ prog_grl.pas | 475 ++++++++++++++++++++++++++++++++++++++++++++++++ programa.pas | 419 ++++++++++++++++++++++++++++++++++++++++++ salida.txt | 198 ++++++++++++++++++++ tabla.pas | 262 ++++++++++++++++++++++++++ test.pas | 172 ++++++++++++++++++ turbo.dsk | Bin 0 -> 1828 bytes 17 files changed, 3173 insertions(+) create mode 100644 DESCRIPCION.TXT create mode 100644 TP2-1C-2000.rtf create mode 100644 ab.pas create mode 100644 abo_ab.pas create mode 100644 abo_util.pas create mode 100644 cmd_abo.pas create mode 100644 cmd_tbl.pas create mode 100644 gral.pas create mode 100644 ldc.pas create mode 100644 log.txt create mode 100644 pila_c.pas create mode 100644 prog_grl.pas create mode 100644 programa.pas create mode 100644 salida.txt create mode 100644 tabla.pas create mode 100644 test.pas create mode 100644 turbo.dsk diff --git a/DESCRIPCION.TXT b/DESCRIPCION.TXT new file mode 100644 index 0000000..f6a2af1 --- /dev/null +++ b/DESCRIPCION.TXT @@ -0,0 +1,69 @@ + + +Descripcion de los Archivos: +=========== == === ======== + +Programa Principal del TP. +-------- --------- --- -- + PROGRAMA.EXE Ejecutable. + PROGRAMA.PAS Codigo fuente. + +Programa para generar archivos de comando de TABLA. +-------- ---- ------- -------- -- ------- -- ----- + CMD_TBL.EXE Ejecutable. + CMD_TBL.PAS Codigo fuente. + +Programa para generar archivos de comando de ABO. +-------- ---- ------- -------- -- ------- -- ----- + CMD_ABO.EXE Ejecutable. + CMD_ABO.PAS Codigo fuente. + +Archivos de Prueba. +-------- -- ------ + TABLA.CMD Archivo de Comandos de TABLA de Prueba. + ABO.CMD Archivo de Comandos de ABO de Prueba. + SALIDA.TXT Resultados de la ejecución del programa con TABLA.CMD y ABO.CMD. + TEST.EXE Programa para probar la funcionalidad de las primitivas del ABO. + TEST.PAS Codigo fuente de este programa. + LOG.TXT Resultados de la ejecucion de TEST.EXE + +Unidad General para la TDA TABLA. +------ ------- ---- -- --------- + GRAL.PAS Codigo fuente. + GRAL.TPU Unidad compilada. + +Unidad con la TDA de Lista Doblemente Enlazada. +------ --- -- --- -- ----- ---------- -------- + LDC.PAS Codigo fuente. + LDC.TPU Unidad compilada. + +Unidad con la TDA de Pila implementada con Cursores. +------ --- -- --- -- ---- ------------ --- -------- + PILA_C.PAS Codigo fuente. + PILA_C.TPU Unidad compilada. + +Unidad con Funciones, Procedimientos y Tipos Generales para trabajar con archivos de comandos. +------ --- --------- -------------- - ----- --------- ---- -------- --- -------- -- -------- + PROG_GRL.PAS Codigo fuente. + PROG_GRL.TPU Unidad compilada. + +Unidad con la TDA TABLA. +------ --- -- --- ----- + TABLA.PAS Codigo fuente. + TABLA.TPU Unidad compilada. + +Unidad con la TDA AB (arbol binario). +------ --- -- --- -- + AB.PAS Codigo fuente. + AB.TPU Unidad compilada. + +Unidad con la TDA ABO_AB (arbol binario ordenado, implementado con AB). +------ --- -- --- ------ + ABO_AB.PAS Codigo fuente. + ABO_AB.TPU Unidad compilada. + +Unidad con el procedimiento BUSCAR POR RANGO para el ABO. +------ --- -- ------------- ------ --- ----- ---- -- --- + ABO_UTIL.PAS Codigo fuente. + ABO_UTIL.TPU Unidad compilada. + diff --git a/TP2-1C-2000.rtf b/TP2-1C-2000.rtf new file mode 100644 index 0000000..defed04 --- /dev/null +++ b/TP2-1C-2000.rtf @@ -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;} +{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f5\fswiss\fcharset0\fprq2{\*\panose 00000000000000000000}Helvetica;} +{\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;} +{\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;} +{\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;} +{\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);} +{\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;} +{\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; +\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; +\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 +\additive Default Paragraph Font;}{\s15\ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 \snext15 Standard;}{ +\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 +\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 +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 +\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 +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 +\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 +\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 +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;}{ +\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 +\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 +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;}{ +\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 +\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 +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;}{\* +\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;}{\* +\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 +\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 +\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 +\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 +\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 +\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 +\'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 +\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 +\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 +\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 +\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 +\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 +\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 +\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 +{\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 +\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 +\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 } +{\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 +\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 +\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 +{\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}} +{\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} +{\edmins34}{\nofpages1}{\nofwords315}{\nofchars1797}{\*\company HOSPITAL GARRAHAN}{\nofcharsws0}{\vern8249}}\margl1134\margr1134\margt2268\margb964 +\widowctrl\ftnbj\aenddoc\hyphhotz425\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale114\viewzk2\nolnhtadjtbl \fet0\sectd +\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 +\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 +\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 +\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 +\s19\qc \li0\ri0\keepn\nowidctlpar\intbl\faauto\adjustright\rin0\lin0 \b\i\f1\fs24\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\fs20 Trabajo Practico 2 +\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 +\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 +\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 +\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 +\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 +\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 +\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 +\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 +\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 +\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 +}\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 +\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 +\clcbpat8\cltxlrtb\clftsWidth3\clwWidth1418 \cellx8476\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\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 Nota \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 \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\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 \clcbpat8\cltxlrtb\clftsWidth3\clwWidth1418 \cellx8476\clvertalt +\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 +\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 +\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 +\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 +\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 +}\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 +\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 +\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 +\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 +\f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 { +\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 )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\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 +\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: +\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 +\par \tab \tab DNI\tab \tab : string[8]; (CLAVE DEL ABO) +\par \tab \tab Nombre\tab : string[40]; +\par \tab End; +\par }\pard\plain \s28\qj \fi720\li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \f11\fs22\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {Se pide: +\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 +Implementar el TDA AB, (en una unit el tipo y primitivas) con punteros. +\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 +TDA AB. +\par {\listtext\pard\plain\s15 \f11\fs22 \hich\af11\dbch\af0\loch\f11 3.\tab}Desarrollar un procedimiento }{\b\fs22 abstracto}{\fs22 + 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 +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. +\par {\listtext\pard\plain\s15 \f11\fs22 \hich\af11\dbch\af0\loch\f11 4.\tab}Generar un programa que: +\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 +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. +\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. +\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 +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.) +\par }\pard \s15\qj \li1134\ri0\nowidctlpar\faauto\adjustright\rin0\lin1134\itap0 {\fs22 Los comandos posibles y sus par\'e1metros son los siguientes: +\par \tab +\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 +\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 +\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 +\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 +\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 +\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 +\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 +\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 +\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 +\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 +\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 +\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 +\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 +\s15\qc \li0\ri0\nowidctlpar\intbl\faauto\adjustright\rin0\lin0 \f11\fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {IO\cell Insertar Ordenado\cell \cell \cell -\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\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 \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\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\brdrs\brdrw5\brsp40\brdrcf1 +\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 +\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 +\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 +\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 +\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 +\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 \cell \cell -\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\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 \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\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\brdrs\brdrw5\brsp40\brdrcf1 +\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 \cell * +\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 +\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 +\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 +\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 +\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 +\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 +\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 +\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 +\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 +\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 +\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 +\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 +\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 +\ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 {\f11\cgrid0 +\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 +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). +\par {\listtext\pard\plain\s15 \f11\fs22 \hich\af11\dbch\af0\loch\f11 e.\tab}Luego listar IN-ORDEN el ABO completo. +\par }\pard\plain \ql \li0\ri0\nowidctlpar\faauto\adjustright\rin0\lin0\itap0 \fs20\lang3082\langfe3082\cgrid\langnp3082\langfenp3082 {\fs22 +\par +\par }} \ No newline at end of file diff --git a/ab.pas b/ab.pas new file mode 100644 index 0000000..0f08b9f --- /dev/null +++ b/ab.pas @@ -0,0 +1,195 @@ +unit AB; + +{ + IMPLEMENTACION : ARBOLES BINARIOS + ALMACENAMIENTO : PUNTEROS + +} +interface + +{ usa las funciones generales de TDAs } +uses GRAL; + +{ tipos propios del arbol binario } +type + AB_MOVIMIENTO = ( AB_raiz, AB_izquierda, AB_derecha, AB_padre ); + + AB_PUNTERO = ^AB_NODO; + + AB_NODO = record + Elem : T_REGISTRO; + Izquierda, + Derecha : AB_PUNTERO; + end; + + AB_ARBOL = record + Raiz, + Corriente: AB_PUNTERO; + END; + +PROCEDURE AB_crear( VAR a: AB_ARBOL ); +FUNCTION AB_vacio( a: AB_ARBOL): boolean; +PROCEDURE AB_elem_cte( a: AB_ARBOL; VAR e: T_REGISTRO); +PROCEDURE AB_modif_cte( VAR a: AB_ARBOL; e: T_REGISTRO); +PROCEDURE AB_mover_cte( VAR a: AB_ARBOL; m: AB_MOVIMIENTO; VAR error: boolean ); +PROCEDURE AB_borrar_sub( VAR a: AB_ARBOL; m: AB_MOVIMIENTO ); +PROCEDURE AB_insertar( VAR a: AB_ARBOL; m: AB_MOVIMIENTO; e: T_REGISTRO; VAR error: boolean ); +PROCEDURE AB_vaciar( VAR a: AB_ARBOL ); +PROCEDURE AB_copiar( a: AB_ARBOL; VAR b: AB_ARBOL ); + +implementation + + +{ Estas son los dos procedimientos principales de la aplicación } + +PROCEDURE AB_crear( VAR a: AB_ARBOL ); + begin + a.Raiz := nil; + a.Corriente := nil; + end; + +FUNCTION AB_vacio( a: AB_ARBOL): BOOLEAN; + begin + AB_vacio := ( a.Raiz = nil); + end; + +PROCEDURE AB_elem_cte( a: AB_ARBOL; VAR e: T_REGISTRO); + begin + e := a.Corriente^.Elem; + end; + +PROCEDURE AB_modif_cte( VAR a: AB_ARBOL; e: T_REGISTRO); + begin + a.Corriente^.Elem := e; + end; + +PROCEDURE AB_mover_cte( VAR a: AB_ARBOL; m: AB_MOVIMIENTO; VAR error: BOOLEAN ); + FUNCTION buscar_padre( p: AB_PUNTERO; h: AB_PUNTERO ) : AB_PUNTERO; + var + ret : AB_PUNTERO; + begin + ret := NIL; + if ( p^.Izquierda = h ) or ( p^.Derecha = h ) then + ret := p; + if ( ret = nil ) and ( p^.Izquierda <> nil ) then + ret := buscar_padre( p^.Izquierda, h ); + if ( ret = nil ) and ( p^.Derecha <> nil ) then + ret := buscar_padre( p^.Derecha, h ); + buscar_padre := ret; + end; + begin + error := false; + case m of + ab_raiz: + A.Corriente := a.Raiz; + AB_izquierda: + if a.Corriente^.Izquierda = nil then + error := true + else + a.Corriente := A.Corriente^.Izquierda; + AB_derecha: + if a.Corriente^.Derecha = nil then + error := true + else + a.Corriente := A.Corriente^.Derecha; + AB_padre: + if a.Corriente = A.Raiz then + error := true + else + a.Corriente := buscar_padre( a.Raiz, a.Corriente ); + end; +end; + +PROCEDURE AB_borrar_sub( VAR a: AB_ARBOL; m: AB_MOVIMIENTO ); + PROCEDURE liberar_subarbol( VAR p : AB_PUNTERO ); + begin + if p <> nil then begin + liberar_subarbol( p^.Izquierda ); + liberar_subarbol( p^.Derecha ); + dispose( p ); + p := nil; + end; + end; + begin + case m of + AB_izquierda: + liberar_subarbol( a.Corriente^.Izquierda ); + AB_derecha: + liberar_subarbol( a.Corriente^.Derecha ); + end; + end; + +PROCEDURE AB_insertar( VAR a: AB_ARBOL; m: AB_MOVIMIENTO; e: T_REGISTRO; VAR error: BOOLEAN ); + var + p : AB_PUNTERO; + begin + error := false; + new( p ); + p^.Izquierda := nil; + p^.Derecha := nil; + p^.Elem := e; + case m of + AB_raiz: + if a.Raiz = nil then + a.Raiz := p + else + error := true; + AB_izquierda: + if a.Corriente^.Izquierda = nil then + a.Corriente^.Izquierda := p + else + error := true; + AB_derecha: + if a.Corriente^.Derecha = nil then + a.Corriente^.Derecha := p + else + error := true; + AB_padre: + error := true + end; + + if error = false then + a.Corriente := p + else + dispose( p ); + +end; + +PROCEDURE AB_vaciar( VAR a: AB_ARBOL ); + PROCEDURE liberar_subarbol( VAR p : AB_PUNTERO ); + begin + if p <> nil then begin + liberar_subarbol( p^.Izquierda ); + liberar_subarbol( p^.Derecha ); { ARREGLADO, decía p^.Izquierda } + DISPOSE ( p ); + p := nil; + end; + end; + begin + liberar_subarbol( a.Raiz ); + a.Corriente := nil; + end; + +PROCEDURE AB_copiar( a : AB_ARBOL; VAR b : AB_ARBOL ); + PROCEDURE copiar_subarbol( o : AB_PUNTERO; VAR d : AB_PUNTERO ); + begin + if o <> nil then begin + { tengo que copiar el nodo y llamar a la copia de los hijos } + { el procedimiento va modificando el d como viene por referencia } + new( d ); + d^.Elem := o^.Elem; + d^.Izquierda := nil; + d^.Derecha := nil; + copiar_subarbol( o^.Izquierda, d^.Izquierda ); + copiar_subarbol( o^.Derecha , d^.Derecha ); + end; + end; + begin + { tenemos que vaciar primero el arbol b (destino) } + AB_vaciar( b ); + { ahora copiamos todo el arbol origen } + copiar_subarbol( a.Raiz, b.Raiz ); + a.Corriente := a.Raiz; + end; + +end. \ No newline at end of file diff --git a/abo_ab.pas b/abo_ab.pas new file mode 100644 index 0000000..96788ee --- /dev/null +++ b/abo_ab.pas @@ -0,0 +1,325 @@ +unit ABO_AB; + +interface + + uses + AB, GRAL; + + type + ABO_ARBOL = record + arbol: AB_ARBOL; + end; + + ABO_MOVIMIENTO = ( ABO_raiz, ABO_izquierda, ABO_derecha, ABO_padre ); + + { Crea e inicializa el arbol } + PROCEDURE ABO_crear( VAR a: ABO_ARBOL ); + { PRE: Arbol no creado } + { POS: Arbol creado y vacio } + + { Se fija si el arbol esta vacio } + FUNCTION ABO_vacio( a: ABO_ARBOL): BOOLEAN; + { PRE: Arbol creado } + { POS: Devuelve true si el arbol esta vacio, false si no lo esta } + + { Devuelve el elemento corriente } + PROCEDURE ABO_elem_cte( a: ABO_ARBOL; VAR e: T_REGISTRO); + { PRE: Arbol creado y no vacio } + { POS: en e esta almacenado el elemento corriente } + + { Modifica el elemento corriente } + PROCEDURE ABO_modif_cte( VAR a: ABO_ARBOL; e: T_REGISTRO; VAR error: boolean ); + { PRE: Arbol creado y no vacio } + { POS: Si la clave del elemento modificado ya estaba en el arbol (sin contar el + elemento a modificar), devuelve error = true y no modifica el arbol. + Si no estaba en el arbol, error es false y se modifica el elemento corriente } + + { Moueve el elemento corriente } + PROCEDURE ABO_mover_cte( VAR a: ABO_ARBOL; m: ABO_MOVIMIENTO; VAR error: BOOLEAN ); + { PRE: Arbol creado y no vacio } + { POS: ABO_raiz: el corriente es el elemento raiz, error es false } + { ABO_padre: si el corriente es el elemento raiz, error es true y el corriente no cambia } + { ABO_izquierda: si el corriente no tiene un elemento a izquierda, error es true y el corriente no cambia } + { si el corriente tiene un elemento a izquierda, error es false y el corriente cambia } + { ABO_derecha: si el corriente no tiene un elemento a derecha, error es true y el corriente no cambia } + { si el corriente tiene un elemento a derecha, error es false y el corriente cambia } + + { Borra el elemento corriente } + PROCEDURE ABO_borrar_cte( VAR a: ABO_ARBOL ); + { PRE: Arbol creado y no vacio } + { POS: el elemento corriente fue borrado y el corriente nuevo es la raiz } + + { Inserta el elemento e en el arbol } + PROCEDURE ABO_insertar( VAR a: ABO_ARBOL; e: T_REGISTRO; VAR error: BOOLEAN ); + { PRE: Arbol creado } + { POS: si la clave del elemento e no estaba en el arbol, el registro e se inserto y error es false, + si la clave del elemento estaba en el arbol, el registro no se inserto y error es true } + + { Vacia el arbol } + PROCEDURE ABO_vaciar( VAR a: ABO_ARBOL ); + { PRE: Arbol creado } + { POS: El arbol esta vacio } + + { Copia el arbol a en el b } + PROCEDURE ABO_copiar( a: ABO_ARBOL; VAR b: ABO_ARBOL ); + { PRE: Arbol a creado y no vacio, arbol b creado } + { POS: el arbol b es una copia del arbol a } + + { Busca el elemento con la clave c en el arbol } + PROCEDURE ABO_buscar( var a: ABO_ARBOL; c: T_CLAVE; VAR error: boolean ); + { PRE: Arbol creado y no vacio } + { POS: si habia un elemento con la clave c en el arbol, error es false y el elemento corriente es el de clave c + si no habia un elemento con la clave c en el arbol, error es true y el elemento corriente no cambia } + + +implementation +{-----------------------------------} +{ Funciones "privadas" de la unidad } +{-----------------------------------} + +{ Convierte un movimiento del ABO a uno del AB, para mantener los tipos abstractos } +FUNCTION movABO2AB( m: ABO_MOVIMIENTO ): AB_MOVIMIENTO; + + begin + case ( m ) OF + ABO_raiz: begin + movABO2AB := AB_raiz; + end; + ABO_izquierda: begin + movABO2AB := AB_izquierda; + end; + ABO_derecha: begin + movABO2AB := AB_derecha; + end; + ABO_padre: begin + movABO2AB := AB_padre; + end; + end; + end; + + +{-----------------------------------} +{ Funciones "públicas" de la unidad } +{-----------------------------------} + +PROCEDURE ABO_crear( VAR a: ABO_ARBOL ); + + begin + AB_crear( a.arbol ); + end; { Procedimiento o Función } + + + FUNCTION ABO_vacio( a: ABO_ARBOL ): BOOLEAN; + + begin + ABO_vacio := AB_vacio( a.arbol ); + end; { Procedimiento o Función } + + +PROCEDURE ABO_elem_cte( a: ABO_ARBOL; VAR e: T_REGISTRO ); + + begin + AB_elem_cte( a.arbol, e ); + end; { Procedimiento o Función } + +{ error es true si se modifica a una clave que ya existia } +PROCEDURE ABO_modif_cte( VAR a: ABO_ARBOL; e: T_REGISTRO; VAR error: boolean ); + var + r: T_REGISTRO; + er: boolean; + + begin + ABO_elem_cte( a, r ); + if ( T_GRAL_Devolver_Clave_Elem( r ) = T_GRAL_Devolver_Clave_Elem( e ) ) then { si la clave no cambia } + AB_modif_cte( a.arbol, e ) { se modifica con la primitiva de AB } + else begin { Si la clave cambia ... } + ABO_borrar_cte( a ); { Borra el corriente } + ABO_insertar( a, e, error ); { Inserta el nuevo elemento } + end; + end; { Procedimiento o Función } + + +PROCEDURE ABO_mover_cte( VAR a: ABO_ARBOL; m: ABO_MOVIMIENTO; VAR error: BOOLEAN ); + + begin + AB_mover_cte( a.arbol, movABO2AB( m ), error ); + end; { Procedimiento o Función } + + +PROCEDURE ABO_borrar_cte( VAR a: ABO_ARBOL ); + PROCEDURE insertar_rama_de_ABO_a_ABO( VAR origen: ABO_ARBOL; VAR destino: ABO_ARBOL ); + var + r: T_REGISTRO; + er: boolean; + begin + ABO_elem_cte( origen, r ); + ABO_insertar( destino, r, er ); { No debe haber error porque no hay ninguno repetido } + ABO_mover_cte( origen, ABO_izquierda, er ); + if ( not er ) then begin + insertar_rama_de_ABO_a_ABO( origen, destino ); + ABO_mover_cte( origen, ABO_padre, er ); + end; + ABO_mover_cte( origen, ABO_derecha, er ); + if ( not er ) then begin + insertar_rama_de_ABO_a_ABO( origen, destino ); + ABO_mover_cte( origen, ABO_padre, er ); + end; + end; + + var + abo: ABO_ARBOL; + er: boolean; + ro, + rn: T_REGISTRO; + m: AB_MOVIMIENTO; + + begin + AB_elem_cte( a.arbol, ro ); { obtengo el elemento corriente } + ABO_crear( abo ); {} + AB_mover_cte( a.arbol, AB_izquierda, er ); {} + if ( not er ) then begin {} + insertar_rama_de_ABO_a_ABO( a, abo ); {} + AB_mover_cte( a.arbol, AB_padre, er ); { Copia todos los registros de las subramas } + end; { del registro a borrar en un nuevo ABO } + AB_mover_cte( a.arbol, AB_derecha, er ); { para luego insertarlos en el lugar del } + if ( not er ) then begin { registro borrado } + insertar_rama_de_ABO_a_ABO( a, abo ); {} + AB_mover_cte( a.arbol, AB_padre, er ); {} + end; {} + { En este punto tengo todos los registros de la subrama en mi nuevo ABO } + AB_mover_cte( a.arbol, AB_padre, er ); + if ( er ) then { es la raiz } + AB_vaciar( a.arbol ) { se vacia el arbol entero } + else begin { no es la raiz } + AB_mover_cte( a.arbol, AB_izquierda, er ); { Ahora se fija si la subrama a borrar es la de } + { la derecha o la de la izquierda (prueba la izquierda) } + if ( er ) then { No hay un elemento a la izquierda } + m := AB_derecha { Indica que hay que borrar la de la derecha } + else begin { Hay un elemento a la izquierda } + AB_elem_cte( a.arbol, rn ); { Extrae el elemento para compararlo con el que hay que borrar } + if ( T_GRAL_Devolver_Clave_Elem( ro ) = T_GRAL_Devolver_Clave_Elem( rn ) ) then { si es la misma } + m := AB_izquierda { Son iguales las claves entonces hay que borrar el de la izquierda } + else + m := AB_derecha; { Son distintas las claves entonces hay que borrar el de la derecha } + AB_mover_cte( a.arbol, AB_padre, er ); + end; + AB_borrar_sub( a.arbol, m ); + end; + { En este punto tengo borrada la rama con el elemento a borrar, } + { solo queda insertar los elementos del ABO creado } + if ( not ABO_vacio( abo ) ) then begin { Si no esta vacio } + ABO_mover_cte( abo, ABO_raiz, er ); { Mueve el corriente a la raiz } + insertar_rama_de_ABO_a_ABO( abo, a ); { Inserta la subrama almacenada en ABO en el arbol original } + end; + ABO_mover_cte( a, ABO_raiz, er ); { deja el corriente en la raiz } + end; { Procedimiento o Función } + + +PROCEDURE ABO_insertar( VAR a: ABO_ARBOL; e: T_REGISTRO; VAR error: BOOLEAN ); + FUNCTION buscar_lugar_desde_elem_cte( VAR a: ABO_ARBOL; e: T_REGISTRO ): AB_MOVIMIENTO; + var + r: T_REGISTRO; + er: boolean; + + begin + { devuelve AB_raiz si el elemento ya existe en el arbol + devuelve AB_izquierda si hay que insertarlo a izquiera del corriente + devuelve AB_derecha si hay que insertarlo a derecha del corriente } + AB_elem_cte( a.arbol, r ); + if ( T_GRAL_Devolver_Clave_Elem( e ) = T_GRAL_Devolver_Clave_Elem( r ) ) then + buscar_lugar_desde_elem_cte := AB_raiz + else + if ( T_GRAL_Devolver_Clave_Elem( e ) < T_GRAL_Devolver_Clave_Elem( r ) ) then begin + AB_mover_cte( a.arbol, AB_izquierda, er ); + if ( not er ) then + buscar_lugar_desde_elem_cte := buscar_lugar_desde_elem_cte( a, e ) + else + buscar_lugar_desde_elem_cte := AB_izquierda; + end + else begin + AB_mover_cte( a.arbol, AB_derecha, er ); + if ( not er ) then + buscar_lugar_desde_elem_cte := buscar_lugar_desde_elem_cte( a, e ) + else + buscar_lugar_desde_elem_cte := AB_derecha; + end; + end; + + var + r: T_REGISTRO; + m: AB_MOVIMIENTO; + co, + ct: T_CLAVE; + + begin + error := false; + if ( AB_vacio( a.arbol ) ) then + AB_insertar( a.arbol, AB_raiz, e, error ) + else begin + AB_mover_cte( a.arbol, AB_raiz, error ); + m := buscar_lugar_desde_elem_cte( a, e ); + if ( m <> AB_raiz ) then + AB_insertar( a.arbol, m, e, error ) + else + error := true; + end; + end; { Procedimiento o Función } + + +PROCEDURE ABO_vaciar( VAR a: ABO_ARBOL ); + + begin + AB_vaciar( a.arbol ); + end; { Procedimiento o Función } + + +PROCEDURE ABO_copiar( a: ABO_ARBOL; VAR b: ABO_ARBOL ); + + begin + AB_copiar( a.arbol, b.arbol ); + end; { Procedimiento o Función } + + +PROCEDURE ABO_buscar( var a: ABO_ARBOL; c: T_CLAVE; VAR error: boolean ); + { baja un nivel por el camino correcto y compara: } + { c1 = c2 : Termina, error es false porque fue encontrada } + { c1 > c2 : Se mueve a la derecha y llama al procedimiento recursivamente } + { c1 < c2 : Se mueve a la izquierda y llama al procedimiento recursivamente } + { Si hay movimiento y este da error, quiere decir que la clave no fue encontrada} + { (se llego a una hoja, o "semihoja"). De esta forma devuelve error como true } + PROCEDURE buscar( var a: ABO_ARBOL; c: T_CLAVE; VAR error: boolean ); + var + e: T_REGISTRO; + co: T_CLAVE; + begin + AB_elem_cte( a.arbol, e ); + co := T_GRAL_Devolver_Clave_Elem( e ); + if ( c = co ) then + error := false + else begin + if ( c < co ) then + AB_mover_cte( a.arbol, AB_izquierda, error ) + else + AB_mover_cte( a.arbol, AB_derecha, error ); + if ( not error ) then + buscar( a, c, error ); + end; + end; + + var + r: T_REGISTRO; + + begin + AB_elem_cte( a.arbol, r ); { Guarda el elemento corriente por si no se encuentra el buscado } + AB_mover_cte( a.arbol, AB_raiz, error ); { Se mueve a la raiz } + if ( not error ) then begin { Si no hubo error (no debería haberlo) ... } + buscar( a, c, error ); { Comienza la busqueda } + if ( error ) then begin { Si no se encontro la clave buscada ... } + { Buscamos la clave original (nunca deberia devolver error = true porque sabemos que existe } + ABO_buscar( a, T_GRAL_Devolver_Clave_Elem( r ), error ); + error := true; { Volvemos a poner error en true porque no se habia encontrado } + end; { la clave deseada } + end; + end; { Procedimiento o Función } + +end. \ No newline at end of file diff --git a/abo_util.pas b/abo_util.pas new file mode 100644 index 0000000..1d32a42 --- /dev/null +++ b/abo_util.pas @@ -0,0 +1,61 @@ +unit ABO_UTIL; + +interface + + uses + GRAL, PILA_C, ABO_AB; + + PROCEDURE ABO_UTIL_buscar_por_rango( var a: ABO_ARBOL; desde, hasta: T_CLAVE; var p: T_PILAC ); + +implementation + + {----------------------------------------------------------------------------} + {- Procedimiento: busca un rango de claves y las inserta en una pila, + {- quedando la mayor clave 'arriba' de la pila. + {----------------------------------------------------------------------------} + + PROCEDURE ABO_UTIL_buscar_por_rango( var a: ABO_ARBOL; desde, hasta: T_CLAVE; var p: T_PILAC ); + PROCEDURE buscar_rango_inorder_insertando( var a: ABO_ARBOL; desde, hasta: T_CLAVE; var p: T_PILAC ); + var + er: boolean; + c: T_CLAVE; + r: T_REGISTRO; + + begin + ABO_elem_cte( a, r ); + c := T_GRAL_Devolver_Clave_Elem( r ); + { Proceso el subarbol izquierdo si la clave del elemento actual } + { es mayor o igual que la clave 'desde' } + if ( desde <= c ) then begin + ABO_mover_cte( a, ABO_izquierda, er ); + if ( not er ) then begin + buscar_rango_inorder_insertando( a, desde, hasta, p ); + ABO_mover_cte( a, ABO_padre, er ); + end; + { Inserto en la pila el elemento corriente si la clave del elemento } + { actual también es menor o igual que la clave 'hasta' } + if ( hasta >= c ) then + PILAC_poner( p, r ); + end; + { Proceso el subarbol derecho si la clave del elemento actual } + { es menor o igual que la clave 'hasta' } + if ( hasta >= c ) then begin + ABO_mover_cte( a, ABO_derecha, er ); + if ( not er ) then begin + buscar_rango_inorder_insertando( a, desde, hasta, p ); + ABO_mover_cte( a, ABO_padre, er ); + end; + end; + end; + + var + er: boolean; + + begin + PILAC_vaciar( p ); { Vacia la pila } + ABO_mover_cte( a, ABO_raiz, er ); { Mueve el corriente a la raiz } + if ( not er ) then + buscar_rango_inorder_insertando( a, desde, hasta, p ); { Comienza a buscar } + end; + +end. \ No newline at end of file diff --git a/cmd_abo.pas b/cmd_abo.pas new file mode 100644 index 0000000..8dfb2fa --- /dev/null +++ b/cmd_abo.pas @@ -0,0 +1,61 @@ +program GeneradorDeArchivosDeComandos; +{ + Programa para generar archivos de comandos +} + +uses + PROG_GRL, DOS; + +var + fSal: T_ARCHIVO_COMANDOS_ABO; + c: T_COMANDO_ABO; + dir: dirstr; + fname: namestr; + ext: extstr; + +begin + mensajeDeEntrada( 'Programa para crear archivos de comandos de ABO.' ); + if paramcount < 1 then begin + fsplit( paramstr( 0 ), dir, fname, ext ); + writeln; + writeln; + writeln( 'ERROR: numero de parametros incorrectos.' ); + writeln; + writeln( 'Modo de uso:' ); + writeln( ' ', fname, ' archivo_entrada' ); + writeln; + exit; { -------------------------------------> SALE DEL PROGRAMA!!!!!!!!!! } + end; + if ( not existeArchivo( paramstr( 1 ) ) ) then + writeln( 'Escribiendo en el "', paramstr( 1 ), '".' ) + else + writeln( 'Sobrescribiendo en el archivo "', paramstr( 1 ), '".' ); + assign( fSal, paramstr( 1 ) ); + rewrite( fSal ); + while true do begin { Repite hasta que el comando sea nulo } + writeln; + writeln; + writeln( 'INGRESO DE UN NUEVO REGISTRO DE ABO' ); + writeln( '======= == == ===== ======== == ===' ); + writeln; + write( 'Comando (IO, BC, BO, MO, LI, : sale): ' ); + readln( c.comando ); + if ( c.comando = '' ) then + exit; { ----------------------------------> SALE DEL PROGRAMA!!!!!!!!!! } + write( 'DNI: ' ); + readln( c.dni ); + if ( c.dni = '' ) then + c.dni := '*'; + write( 'Nombre: ' ); + readln( c.nombre ); + if ( c.nombre = '' ) then + c.nombre := '*'; + write( fSal, c ); + end; + close( fSal ); + writeln; + writeln( 'Se escribio correctamente el archivo "', paramstr( 1 ), '".' ); + writeln( 'FIN DEL PROGRAMA' ); + writeln; +end. + diff --git a/cmd_tbl.pas b/cmd_tbl.pas new file mode 100644 index 0000000..7e8b91a --- /dev/null +++ b/cmd_tbl.pas @@ -0,0 +1,69 @@ +program GeneradorDeArchivosDeComandos; +{ + Programa para generar archivos de comandos +} + +uses + PROG_GRL, DOS; + +var + fSal: T_ARCHIVO_COMANDOS_TABLA; + c: T_COMANDO_TABLA; + dir: dirstr; + fname: namestr; + ext: extstr; + +begin + mensajeDeEntrada( 'Programa para crear archivos de comandos de TABLA.' ); + if paramcount < 1 then begin + fsplit( paramstr( 0 ), dir, fname, ext ); + writeln; + writeln; + writeln( 'ERROR: numero de parametros incorrectos.' ); + writeln; + writeln( 'Modo de uso:' ); + writeln( ' ', fname, ' archivo_entrada' ); + writeln; + exit; { -------------------------------------> SALE DEL PROGRAMA!!!!!!!!!! } + end; + if ( not existeArchivo( paramstr( 1 ) ) ) then + writeln( 'Escribiendo en el "', paramstr( 1 ), '".' ) + else + writeln( 'Sobrescribiendo en el archivo "', paramstr( 1 ), '".' ); + assign( fSal, paramstr( 1 ) ); + rewrite( fSal ); + while true do begin { Repite hasta que el comando sea nulo } + writeln; + writeln; + writeln( 'INGRESO DE UN NUEVO REGISTRO DE TABLA' ); + writeln( '======= == == ===== ======== == =====' ); + writeln; + write( 'Comando (IN, IO, OR, BC, BR, LS, LC, BO, MO, LI, : sale): ' ); + readln( c.comando ); + if ( c.comando = '' ) then + exit; { ----------> SALE DEL PROGRAMA!!!!!!!!!! } + write( 'DNI: ' ); + readln( c.dni ); + if ( c.dni = '' ) then + c.dni := '*'; + write( 'Nombre: ' ); + readln( c.nombre ); + if ( c.nombre = '' ) then + c.nombre := '*'; + write( 'Movimiento (P, U, A, S): ' ); + readln( c.movimiento ); + if ( c.movimiento = '' ) then + c.movimiento := '*'; + write( 'DNI_hasta: ' ); + readln( c.dni_hasta ); + if ( c.dni_hasta = '' ) then + c.dni_hasta := '*'; + write( fSal, c ); + end; + close( fSal ); + writeln; + writeln( 'Se escribio correctamente el archivo "', paramstr( 1 ), '".' ); + writeln( 'FIN DEL PROGRAMA' ); + writeln; +end. + diff --git a/gral.pas b/gral.pas new file mode 100644 index 0000000..301bab0 --- /dev/null +++ b/gral.pas @@ -0,0 +1,51 @@ +unit GRAL; +{ funciones y datos y tipo generales de los TDA de almacenamiento } + +interface + +{ aca se define el famoso tipo_elem } +type + T_GRAL_DNI = string[8]; + T_GRAL_Persona = record + dni : T_GRAL_DNI; + nombre : String[40]; + end; + + T_CLAVE = T_GRAL_DNI; + T_REGISTRO = T_GRAL_Persona; + +{ esta funcion devuelve la clave de un elemento almacenado } +{ PRE : ninguna } +{ POST: devuelve la clave de un elemento E } +function T_GRAL_Devolver_Clave_Elem( r: T_REGISTRO): T_CLAVE; + +{ este procedimiento se usa en recorridos e imprime los datos del elemento } +{ PRE : ninguna } +{ POST: se imprimieron los datos } +procedure T_GRAL_Procesar_Elem_Recorrido ( var r: T_REGISTRO); + +{ compara dos elementos completos para ver si cumplen con el criterio o no } +FUNCTION T_GRAL_Comparar_Elementos( a: T_REGISTRO; b: T_REGISTRO ): boolean; + +implementation + +{ esta funcion devuelve la clave de un elemento almacenado } +function T_GRAL_Devolver_Clave_Elem( r: T_REGISTRO): T_CLAVE; +begin + T_GRAL_Devolver_Clave_Elem := r.dni; +end; + +{ este procedimiento se usa en recorridos e imprime los datos del elemento } +procedure T_GRAL_Procesar_Elem_Recorrido( var r: T_REGISTRO); +BEGIN + +END; + +{ compara dos elementos completos para ver si cumplen con el criterio o no } +FUNCTION T_GRAL_Comparar_elementos( a: T_REGISTRO; b: T_REGISTRO ): boolean; +BEGIN + T_GRAL_Comparar_Elementos := ( a.dni = b.dni ); +END; + + +end. diff --git a/ldc.pas b/ldc.pas new file mode 100644 index 0000000..f3fc655 --- /dev/null +++ b/ldc.pas @@ -0,0 +1,373 @@ +unit LDC; + +{ + IMPLEMENTACION : LISTAS DOBLES + ALMACENAMIENTO : CURSORES + +} + +{ ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular } +interface + +{ usa las funciones generales de TDAs } +uses GRAL; + +{ maximo tamano del cursor } +const LDC_MAX_CURSOR = 100; + +{ tipos propios de la lista para definir el cursor } +TYPE + LDC_puntero = integer; + +const + LDC_nulo : LDC_puntero = 0; + +type + + LDC_nodo = RECORD + Elem : T_REGISTRO; + Sig : LDC_puntero; + Ant : LDC_puntero; + END; + + + { ahora le toca definir el cursor } + LDC_Almac = record + almacenamiento : array [ 1 .. LDC_MAX_CURSOR ] of LDC_Nodo; + siguientes : array [ 1 .. LDC_MAX_CURSOR ] of LDC_Puntero; + { anteriores : array [ 1 .. LDC_MAX_CURSOR ] of LDC_Puntero; PREGUNTAR SI ES NECESARIO } + primero_dispo : LDC_Puntero; + end; + + + LDC_LDC = RECORD + almac : LDC_Almac; + primero: LDC_puntero; + corriente : LDC_puntero; + END; + + LDC_movimiento = ( LDC_primero, LDC_siguiente, LDC_anterior ); + + +{ ========= } +{ INTERFASE } + + +PROCEDURE LDC_Inicializar( VAR l: LDC_LDC ); +FUNCTION LDC_vacio( l: LDC_LDC): BOOLEAN; +FUNCTION LDC_lleno( l: LDC_LDC): BOOLEAN; +PROCEDURE LDC_elem_cte( l: LDC_LDC; VAR r: T_REGISTRO); +PROCEDURE LDC_modif_cte( VAR l: LDC_LDC; r: T_REGISTRO); +PROCEDURE LDC_mover_cte( VAR l: LDC_LDC; m: LDC_movimiento; VAR error: BOOLEAN ); +PROCEDURE LDC_borrar_cte( VAR l: LDC_LDC ); +PROCEDURE LDC_insertar( VAR l: LDC_LDC; m: LDC_movimiento; r: T_REGISTRO ); +PROCEDURE LDC_vaciar( VAR l: LDC_LDC ); +PROCEDURE LDC_copiar( a: LDC_LDC; VAR b: LDC_LDC ); + +implementation + +{ CURSORES DE ESTA IMPLEMENTACION } +{ ========================================================================== } +{ inicializar el almacenamiento } +{ PRE : 'almac' no esta inicializado } +{ POST: 'almac' esta inicializado y vacio } +procedure LDC_Almac_Inicializar( VAR almac : LDC_Almac ); +var i : LDC_Puntero; +begin + almac.primero_dispo := 1; + for i := 1 to LDC_MAX_CURSOR - 1 do + begin + almac.siguientes[i] := i + 1; + end; +{ for i := 1 to LDC_CURSOR_MAX - 1 do + begin + almac.anteriores[i + 1] := i; PREGUNTAR !!!!!! + end;} + almac.siguientes[LDC_MAX_CURSOR] := LDC_Nulo; + {almac.anteriores[1] := LDC_Nulo;} +end; + +{ ========================================================================== } +{ saber si hay lugar para reservar un nuevo elemento en el almacenamiento } +{ PRE : 'almac' esta inicializado } +{ POST: si hay lugar en 'almac' para un nuevo elemento, + entonces retorna TRUE y sino FALSE } +function LDC_Almac_HayLugar( almac : LDC_Almac ): boolean; +begin + LDC_Almac_HayLugar := ( almac.primero_dispo <> LDC_Nulo ); +end; + +{ ========================================================================== } +{ el pedido de un nuevo elemento al almacenamiento } +{ PRE : 'almac' esta inicializado } +{ POST: si hay lugar en 'almac' para un nuevo elemento, + entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento + sino 'puntero' tiene el valor TTDA_Nulo } +procedure LDC_Almac_Reservar( VAR almac : LDC_Almac; VAR puntero : LDC_Puntero ); +begin + if not LDC_Almac_HayLugar( almac ) then + puntero := LDC_Nulo + else begin + puntero := almac.primero_dispo; + almac.primero_dispo := almac.siguientes[ puntero ]; + end; +end; + +{ ========================================================================== } +{ liberar un elemento del almacenamiento } +{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento } +{ POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo } +procedure LDC_Almac_Liberar( VAR almac : LDC_Almac; VAR puntero : LDC_Puntero ); +begin + almac.siguientes[ puntero ] := almac.primero_dispo; + almac.primero_dispo := puntero; + puntero := LDC_Nulo; +end; + +{ ========================================================================== } +{ acceder al elemento del almacenamiento apuntado por un puntero } +{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento } +{ POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' } +procedure LDC_Almac_Acceder( almac : LDC_Almac; puntero : LDC_Puntero; VAR elemento : LDC_Nodo ); +begin + elemento := almac.almacenamiento[ puntero ]; +end; + +{ ========================================================================== } +{ modificar el elemento del almacenamiento apuntado por un puntero } +{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento } +{ POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' } +procedure LDC_Almac_Modificar( VAR almac : LDC_Almac; puntero : LDC_Puntero; elemento : LDC_Nodo ); +begin + almac.almacenamiento[ puntero ] := elemento; +end; + + + +{ Estas son los dos procedimientos principales de la aplicacion } + +PROCEDURE LDC_Inicializar( VAR l: LDC_LDC ); +BEGIN + LDC_Almac_Inicializar( l.almac ); + l.primero := LDC_Nulo; + l.corriente := LDC_Nulo; +END; + +FUNCTION LDC_vacio( l: LDC_LDC): BOOLEAN; +BEGIN + LDC_vacio := ( l.Primero = LDC_Nulo); +END; + +FUNCTION LDC_lleno( l: LDC_LDC): BOOLEAN; +BEGIN + LDC_lleno := not LDC_Almac_HayLugar( l.almac ); +END; + +PROCEDURE LDC_elem_cte( l: LDC_LDC; VAR r: T_REGISTRO); +var n : LDC_Nodo; +BEGIN + { accedo al almacenamiento por el nodo corriente } + LDC_Almac_Acceder( l.almac, l.Corriente, n ); + + { y se lo asigno al parametro } + r := n.Elem; +END; + +PROCEDURE LDC_modif_cte( VAR l: LDC_LDC; r: T_REGISTRO); +var n : LDC_Nodo; +BEGIN + { accedo al almacenamiento por el nodo corriente } + LDC_Almac_Acceder( l.almac, l.Corriente, n ); + + { y la asigno al parametro } + n.Elem := r; + + { y modifico el almacenamiento } + LDC_Almac_Modificar( l.almac, l.Corriente, n ); +END; + +PROCEDURE LDC_mover_cte( VAR l: LDC_LDC; m: LDC_movimiento; VAR error: BOOLEAN ); +VAR n : LDC_Nodo; +BEGIN + error := FALSE; + CASE m OF + LDC_primero: + l.Corriente := l.Primero; + LDC_siguiente: begin + { accedo al almacenamiento por el nodo corriente } + LDC_Almac_Acceder( l.almac, l.Corriente, n ); + + IF ( n.Sig = LDC_Nulo ) THEN + error := TRUE + ELSE + l.corriente := n.sig; + end; + LDC_anterior: begin + { accedo al almacenamiento por el nodo corriente } + LDC_Almac_Acceder( l.almac, l.Corriente, n ); + + IF ( n.ant = LDC_Nulo ) THEN + error := TRUE + ELSE + l.corriente := n.ant; + end; + END; +END; + +PROCEDURE LDC_borrar_cte( VAR l: LDC_LDC ); +VAR nc : LDC_Nodo; { Nodo Corriente } + nac : LDC_Nodo; { Nodo Anterior al Corriente } + npc: LDC_Nodo; { Nodo Posterior al Corriente } + tmpp: LDC_Puntero; +BEGIN + if l.corriente = l.primero then begin + LDC_Almac_Acceder( l.almac, l.primero, nc ); + l.primero := nc.Sig; + LDC_Almac_Liberar( l.almac, l.corriente ); + l.corriente := l.primero; + if ( l.primero <> LDC_Nulo ) then begin { SI NO ERA EL UNICO ELEMENTO } + LDC_Almac_Acceder( l.almac, l.primero, nc ); {--------------} + nc.Ant := LDC_Nulo; {-------------------------- PREGUNTAR } + LDC_Almac_Modificar( l.almac, l.primero, nc); {-------------} + end; + end + else begin + LDC_Almac_Acceder( l.almac, l.corriente, nc ); + LDC_Almac_Acceder( l.almac, nc.Ant, nac ); + nac.Sig := nc.Sig; + LDC_Almac_Modificar( l.almac, nc.Ant, nac ); + if ( nc.Sig <> LDC_Nulo ) then begin + LDC_Almac_Acceder( l.almac, nc.Sig, npc ); + npc.Ant := nc.Ant; + LDC_Almac_Modificar( l.almac, nc.Sig, npc ); + end; + LDC_Almac_Liberar( l.almac, l.corriente ); + if ( nc.Ant <> LDC_Nulo ) then + l.corriente := nc.Ant + else + l.corriente := nc.Sig; + end; +END; + +PROCEDURE LDC_insertar( VAR l: LDC_LDC; m: LDC_movimiento; r: T_REGISTRO ); +VAR + p : LDC_puntero; + n : LDC_Nodo; + na: LDC_Nodo; + ns: LDC_Nodo; + np: LDC_Puntero; +BEGIN + { n.Ant := LDC_Nulo; { AGREGADO } + LDC_Almac_Reservar( l.almac, np ); + n.Elem := r; + CASE m OF + LDC_primero: begin + n.Sig := LDC_Nulo; + n.Ant := LDC_Nulo; + if ( l.primero <> LDC_Nulo ) then begin { NO ESTA VACIO EL ALMACENAMIENTO } + LDC_Almac_Acceder( l.almac, l.primero, na ); + na.Ant := np; + LDC_Almac_Modificar( l.almac, l.primero, na ); + n.Sig := l.primero; + end; + LDC_Almac_Modificar( l.almac, np, n ); + l.primero := np; + end; + LDC_siguiente: begin + n.Ant := LDC_Nulo; + n.Sig := LDC_Nulo; + if ( l.primero <> LDC_Nulo ) then begin { NO ESTA VACIO EL ALMACENAMIENTO } + LDC_Almac_Acceder( l.almac, l.corriente, na ); + n.Ant := l.corriente; + n.Sig := na.Sig; + na.Sig := np; + LDC_Almac_Modificar( l.almac, l.corriente, na ); + end + else + l.primero := np; + if ( n.Sig <> LDC_Nulo ) then begin + LDC_Almac_Acceder( l.almac, n.Sig, ns ); + ns.Ant := np; + LDC_Almac_Modificar( l.almac, n.Sig, ns ); + end; + LDC_Almac_Modificar( l.almac, np, n ); + end; + LDC_anterior: begin + n.Ant := LDC_Nulo; + n.Sig := LDC_Nulo; + if ( l.primero <> LDC_Nulo ) then begin { NO ESTA VACIO EL ALMACENAMIENTO } + LDC_Almac_Acceder( l.almac, l.corriente, ns ); + n.Sig := l.corriente; + n.Ant := ns.Ant; + ns.Ant := np; + LDC_Almac_Modificar( l.almac, l.corriente, ns ); + end + else + l.primero := np; + if ( n.Ant <> LDC_Nulo ) then begin + LDC_Almac_Acceder( l.almac, n.Ant, na ); + na.Sig := np; + LDC_Almac_Modificar( l.almac, n.Ant, na ); + end + else { Si el Anterior es nulo, entonces estoy insertando atras del primero } + l.primero := np; + LDC_Almac_Modificar( l.almac, np, n ); + end; + END; { case m of } + l.Corriente := np; +END; + +PROCEDURE LDC_vaciar( VAR l: LDC_LDC ); +VAR np : LDC_Puntero; + n : LDC_Nodo; + +BEGIN + np := l.primero; + while( np <> LDC_Nulo ) do begin + LDC_Almac_Acceder( l.almac, np, n ); + LDC_Almac_Liberar( l.almac, np ); + np := n.sig; + end; + l.primero := LDC_Nulo; + l.corriente := LDC_Nulo; +END; + +{ pre: 'a' y 'b' estan creadas y 'b' esta vacia } +{ POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero } +PROCEDURE LDC_copiar( a : LDC_LDC; VAR b : LDC_LDC ); +VAR np : LDC_Puntero; + n : LDC_Nodo; + mp : LDC_Puntero; + m : LDC_Nodo; + ms : LDC_Puntero; + ma : LDC_Puntero; + +BEGIN + if ( a.primero = LDC_Nulo ) then exit; + np := a.primero; + LDC_Almac_Acceder( a.almac, np, n ); + LDC_Almac_Reservar( b.almac, mp ); + b.primero := mp; + b.corriente := mp; + m.elem := n.elem; + m.Ant := LDC_Nulo; + + while ( n.sig <> LDC_Nulo ) do begin + + LDC_Almac_Reservar( b.almac, ms ); + m.sig := ms; + LDC_Almac_Modificar( b.almac, mp, m ); + + np := n.sig; + LDC_Almac_Acceder( a.almac, np, n ); + + m.Ant := mp; { n.Ant; } + mp := ms; + m.elem := n.elem; + + end; + m.sig := LDC_Nulo; + LDC_Almac_Modificar( b.almac, mp, m ); +END; + +end. diff --git a/log.txt b/log.txt new file mode 100644 index 0000000..ec20ba9 --- /dev/null +++ b/log.txt @@ -0,0 +1,62 @@ +VACIO +Hubo un error, clave ya existente +DNI: 00000001 | Nombre: Luca +DNI: 00000001 | Nombre: Luca +DNI: 00000002 | Nombre: LucaXX +DNI: 00000005 | Nombre: LucaX +DNI: 00000012 | Nombre: LucaXXXX +DNI: 00000015 | Nombre: LucaXXX +DNI: 00000032 | Nombre: LucaXX +DNI: 00000105 | Nombre: LucaX +DNI: 00000115 | Nombre: LucaXXX +DNI: 00000205 | Nombre: LucaX +DNI: 00000215 | Nombre: LucaXXX +DNI: 00000412 | Nombre: LucaXXXX +DNI: 00001012 | Nombre: LucaXXXX +DNI: 00010002 | Nombre: LucaXX +NO VACIO +DNI: 00000215 | Nombre: LucaXXX +DNI: 00000205 | Nombre: LucaX +DNI: 00001012 | Nombre: LucaXXXX +DNI: 00000115 | Nombre: LucaXXX +DNI: 00010002 | Nombre: LucaXX +DNI: 00000105 | Nombre: LucaX +DNI: 00000032 | Nombre: LucaXX +despues de borrar '00000002' +DNI: 00000001 | Nombre: Luca +DNI: 00000005 | Nombre: LucaX +DNI: 00000012 | Nombre: LucaXXXX +DNI: 00000015 | Nombre: LucaXXX +DNI: 00000032 | Nombre: LucaXX +DNI: 00000105 | Nombre: LucaX +DNI: 00000115 | Nombre: LucaXXX +DNI: 00000205 | Nombre: LucaX +DNI: 00000215 | Nombre: LucaXXX +DNI: 00000412 | Nombre: LucaXXXX +DNI: 00001012 | Nombre: LucaXXXX +DNI: 00010002 | Nombre: LucaXX +DNI: 00010002 | Nombre: LucaXX +DNI: 00000002 | Nombre: NUEVO +DNI: 00000002 | Nombre: NUEVO +despues de modificar '00100002' +DNI: 00000001 | Nombre: Luca +DNI: 00000002 | Nombre: NUEVO +DNI: 00000005 | Nombre: LucaX +DNI: 00000012 | Nombre: LucaXXXX +DNI: 00000015 | Nombre: LucaXXX +DNI: 00000032 | Nombre: LucaXX +DNI: 00000105 | Nombre: LucaX +DNI: 00000115 | Nombre: LucaXXX +DNI: 00000205 | Nombre: LucaX +DNI: 00000215 | Nombre: LucaXXX +DNI: 00000412 | Nombre: LucaXXXX +DNI: 00001012 | Nombre: LucaXXXX +Mostrando resultados de busqueda desde '00000012' hasta ' 00000412' +DNI: 00000412 | Nombre: LucaXXXX +DNI: 00000215 | Nombre: LucaXXX +DNI: 00000205 | Nombre: LucaX +DNI: 00000115 | Nombre: LucaXXX +DNI: 00000105 | Nombre: LucaX +DNI: 00000032 | Nombre: LucaXX +DNI: 00000015 | Nombre: LucaXXX +DNI: 00000012 | Nombre: LucaXXXX diff --git a/pila_c.pas b/pila_c.pas new file mode 100644 index 0000000..04e5002 --- /dev/null +++ b/pila_c.pas @@ -0,0 +1,226 @@ +unit PILA_C; +{ + + IMPLEMENTACION : pilas + + ALMACENAMIENTO : CURSORES +} + + + +{ ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular } + +interface + +{ usa las funciones generales de TDAs } +uses + GRAL; + +{ maximo tamano del cursor } +const + PILAC_MAX_CURSOR = 100; + +{ tipos propios de la lista para definir el cursor } +TYPE + PILAC_puntero = integer; + +const + PILAC_nulo : PILAC_puntero = 0; + +type + PILAC_nodo = RECORD + Elem : T_REGISTRO; + Sig : PILAC_puntero; + END; + + { ahora le toca definir el cursor } + PILAC_Almac = record + almacenamiento : array [ 1 .. PILAC_MAX_CURSOR ] of PILAC_Nodo; + siguientes : array [ 1 .. PILAC_MAX_CURSOR ] of PILAC_Puntero; + primero_dispo : PILAC_puntero; + end; + + T_PILAC = RECORD + almac : PILAC_Almac; + primero: PILAC_puntero; + END; + +{ ========= } + +{ INTERFASE } + +PROCEDURE PILAC_Inicializar( VAR l: T_PILAC ); +FUNCTION PILAC_vacio( l: T_PILAC): BOOLEAN; +FUNCTION PILAC_lleno( l: T_PILAC): BOOLEAN; +PROCEDURE PILAC_poner( VAR l: T_PILAC; VAR e: T_REGISTRO ); +PROCEDURE PILAC_sacar( VAR l: T_PILAC; VAR e: T_REGISTRO); +PROCEDURE PILAC_vaciar( VAR l: T_PILAC ); +PROCEDURE PILAC_copiar( a: T_PILAC; VAR b: T_PILAC ); + + +implementation + +{ CURSORES DE ESTA IMPLEMENTACION } +{ ========================================================================== } +{ inicializar el almacenamiento } +{ PRE : 'almac' no esta inicializado } +{ POST: 'almac' esta inicializado y vacio } + +procedure PILAC_Almac_Inicializar( VAR almac : PILAC_Almac ); + var + i : PILAC_Puntero; + + begin + almac.primero_dispo := 1; + for i := 1 to PILAC_MAX_CURSOR - 1 do + begin + almac.siguientes[i] := i + 1; + end; + almac.siguientes[PILAC_MAX_CURSOR] := PILAC_Nulo; + end; + +{ ========================================================================== } +{ saber si hay lugar para reservar un nuevo elemento en el almacenamiento } +{ PRE : 'almac' esta inicializado } +{ POST: si hay lugar en 'almac' para un nuevo elemento, + entonces retorna TRUE y sino FALSE } +function PILAC_Almac_HayLugar( almac : PILAC_Almac ): boolean; + begin + PILAC_Almac_HayLugar := not ( almac.primero_dispo = PILAC_Nulo ); + end; + +{ ========================================================================== } +{ el pedido de un nuevo elemento al almacenamiento } +{ PRE : 'almac' esta inicializado } +{ POST: si hay lugar en 'almac' para un nuevo elemento, + entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento + sino 'puntero' tiene el valor TTDA_Nulo } +procedure PILAC_Almac_Reservar( VAR almac : PILAC_Almac; VAR puntero : PILAC_Puntero ); + begin + if not PILAC_Almac_HayLugar( almac ) + then + puntero := PILAC_Nulo + else begin + puntero := almac.primero_dispo; + almac.primero_dispo := almac.siguientes[ puntero ]; + end; + end; + +{ ========================================================================== } +{ liberar un elemento del almacenamiento } +{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento } +{ POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo } +procedure PILAC_Almac_Liberar( VAR almac : PILAC_Almac; VAR puntero : PILAC_Puntero ); + begin + almac.siguientes[ puntero ] := almac.primero_dispo; + almac.primero_dispo := puntero; + puntero := PILAC_Nulo; + end; + +{ ========================================================================== } +{ acceder al elemento del almacenamiento apuntado por un puntero } +{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento } +{ POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' } +procedure PILAC_Almac_Acceder( almac : PilaC_Almac; puntero : PILAC_Puntero; VAR elemento : PILAC_Nodo ); + begin + elemento := almac.almacenamiento[ puntero ]; + end; + +{ ========================================================================== } +{ modificar el elemento del almacenamiento apuntado por un puntero } +{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento } +{ POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' } +procedure PILAC_Almac_Modificar( VAR almac : PILAC_Almac; puntero : PILAC_Puntero; elemento : PILAC_Nodo ); + begin + almac.almacenamiento[ puntero ] := elemento; + end; + +{ Estas son los dos procedimientos principales de la aplicación } +PROCEDURE PILAC_Inicializar ( VAR l: T_PILAC ); + BEGIN + PILAC_Almac_Inicializar( l.almac ); + l.primero := PILAC_Nulo; + END; + +FUNCTION PILAC_vacio( l: T_PILAC): BOOLEAN; + BEGIN + PILAC_vacio := ( l.Primero = PILAC_Nulo); + END; + +FUNCTION PILAC_lleno( l: T_PILAC): BOOLEAN; + BEGIN + PILAC_lleno := not PILAC_Almac_HayLugar( l.almac ); + END; + +PROCEDURE PILAC_poner ( VAR l: T_PILAC; var e: T_REGISTRO); + VAR + n : PILAC_Nodo; + np: PILAC_Puntero; + + BEGIN + n.Elem := e; + n.sig := l.primero; + PILAC_Almac_Reservar( l.almac, np ); + PILAC_Almac_Modificar( l.almac, np, n ); + l.primero := np; + END; + +{ pre: no esta vacia } +PROCEDURE PILAC_sacar ( VAR l: T_PILAC; VAR e: T_REGISTRO); + VAR + n : PILAC_Nodo; + tmp : PILAC_Nodo; + tmpp: PILAC_Puntero; + + BEGIN + PILAC_Almac_Acceder( l.almac, l.primero, n ); + PILAC_Almac_Liberar( l.almac, l.primero ); + l.primero := n.Sig; + { y se lo asigno al parametro } + e := n.Elem; + END; + +PROCEDURE PILAC_vaciar ( VAR l: T_PILAC ); + VAR + np : PILAC_Puntero; + n : PILAC_Nodo; + + BEGIN + np := l.primero; + while( np <> PILAC_Nulo ) do begin + PILAC_Almac_Acceder( l.almac, np, n ); + PILAC_Almac_Liberar( l.almac, np ); + np := n.sig; + end; + l.primero := PILAC_Nulo; + END; + +{ pre: 'a' y 'b' estan creadas y 'b' esta vacia } +{ POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero } +PROCEDURE PILAC_copiar ( a : T_PILAC; VAR b : T_PILAC ); + VAR + np, mp, tmpp : PILAC_Puntero; + n,m : PILAC_Nodo; + + BEGIN + if a.primero = PILAC_Nulo then exit; + np := a.primero; + PILAC_Almac_Acceder( a.almac, np, n ); + PILAC_Almac_Reservar( b.almac, mp ); + b.primero := mp; + m.elem := n.elem; + while( n.sig <> PILAC_Nulo ) do begin + PILAC_Almac_Reservar( b.almac, tmpp ); + m.sig := tmpp; + PILAC_Almac_Modificar( b.almac, mp, m ); + np := n.sig; + PILAC_Almac_Acceder( a.almac, np, n ); + mp := tmpp; + m.elem := n.elem; + end; + m.sig := PILAC_Nulo; + PILAC_Almac_Modificar( b.almac, mp, m ); + END; + +end. + diff --git a/prog_grl.pas b/prog_grl.pas new file mode 100644 index 0000000..532486e --- /dev/null +++ b/prog_grl.pas @@ -0,0 +1,475 @@ +unit PROG_GRL; + +{ + Unidad General para utilizar con los programas que utilicen el archivo de comandos + Tambien incluye algunas funciones y procedimientos utiles para la manipulacion de datos. +} + +interface + + uses + GRAL, DOS, CRT, TABLA, ABO_AB, ABO_UTIL, PILA_C; + + type + T_COMANDO_TABLA = record + Comando: string[2]; + DNI: string[8]; + Nombre: string[40]; + Movimiento: string[1]; + DNI_hasta: string[8]; + end; + T_COMANDO_ABO = record + Comando: string[2]; + DNI: string[8]; + Nombre: string[40]; + end; + ID_COMANDO = ( INS, IO, ORDEN, BC, BR, LS, LC, BO, MO, LI, DESC ); + + T_ARCHIVO_COMANDOS_TABLA = file of T_COMANDO_TABLA; + + T_ARCHIVO_COMANDOS_ABO = file of T_COMANDO_ABO; + + {----------------------------------------------------------------------------} + {- Procedimiento: Muestra un mensaje de bienvenida al programa + {----------------------------------------------------------------------------} + procedure mensajeDeEntrada( descripcion: String ); + + {----------------------------------------------------------------------------} + {- Funcion: verifica si existe un archivo. + {----------------------------------------------------------------------------} + function existeArchivo( nombre: String ): boolean; + + {----------------------------------------------------------------------------} + {- Procedimiento: Procesa los parametros de la ejecucion del programa + {----------------------------------------------------------------------------} + procedure procesarParametros( var archivoEntradaTabla: T_ARCHIVO_COMANDOS_TABLA; + var archivoEntradaABO: T_ARCHIVO_COMANDOS_ABO; + var archivoSalida: text; var error: boolean ); + + {----------------------------------------------------------------------------} + {- Procedimiento: Muestra un mensaje de error y la sintaxis del programa. + {----------------------------------------------------------------------------} + procedure errorParametros; + + {----------------------------------------------------------------------------} + {- Procedimiento: Muestra mensaje introductorio en archivo de salida + {----------------------------------------------------------------------------} + procedure intro( var f: text ); + + {----------------------------------------------------------------------------} + {- Procedimiento: Muestra mensaje introductorio en archivo de salida + {----------------------------------------------------------------------------} + procedure introTabla( var f: text ); + + {----------------------------------------------------------------------------} + {- Procedimiento: Muestra mensaje introductorio en archivo de salida + {----------------------------------------------------------------------------} + procedure introABO( var f: text ); + + {----------------------------------------------------------------------------} + {- Funcion: Convierte un dato del tipo T_MOVIM en un string + {----------------------------------------------------------------------------} + function movimToStr( m: T_MOVIM): string; + + {----------------------------------------------------------------------------} + {- Funcion: Convierte un dato del tipo ID_COMANDO en un string + {----------------------------------------------------------------------------} + function comandoToStr( c: ID_COMANDO ): string; + + {----------------------------------------------------------------------------} + {- Funcion: Convierte un string en un dato del tipo ID_COMANDO + {----------------------------------------------------------------------------} + function strToComando( s: string ): ID_COMANDO; + + {----------------------------------------------------------------------------} + {- Funcion: Convierte un string en un dato del tipo T_MOVIM + {----------------------------------------------------------------------------} + function strToMovim( s: string; var error: boolean ): T_MOVIM; + + {----------------------------------------------------------------------------} + {- Procedimiento: Agrega el texto de un comando a ejecutar en el archivo de salida + {----------------------------------------------------------------------------} + procedure agregaComandoTBL( var f: text; c: T_COMANDO_TABLA ); + + {----------------------------------------------------------------------------} + {- Procedimiento: Agrega el texto de un comando a ejecutar en el archivo de salida + {----------------------------------------------------------------------------} + procedure agregaComandoABO( var f: text; c: T_COMANDO_ABO ); + + {----------------------------------------------------------------------------} + {- Procedimiento: Agrega mensaje de error en el archivo de salida + {----------------------------------------------------------------------------} + procedure agregaError( var f: text; cmd, msg: string ); + + {----------------------------------------------------------------------------} + {- Procedimiento: Agrega mensaje de error en el archivo de salida + {----------------------------------------------------------------------------} + procedure agregaRegistro( var f: text; cmd: string; r: T_REGISTRO ); + + {----------------------------------------------------------------------------} + {- Procedimiento: Agrega mensaje de error en el archivo de salida + {----------------------------------------------------------------------------} + procedure mostrarPila( var f: text; var p: T_PILAC ); + + +implementation + + {----------------------------------------------------------------------------} + {- Procedimiento: Muestra un mensaje de bienvenida al programa + {----------------------------------------------------------------------------} + procedure mensajeDeEntrada( descripcion: String ); + + begin + writeln; + writeln( 'ALGORITMOS Y PROGRAMACION II - Trabajo Practico n. 2' ); + writeln( 'GRUPO 22 - Primer Cuatrimestre 2000' ); + writeln; + writeln( descripcion ); + writeln; + end; + + {-- Fin del Procedimiento --} + + {----------------------------------------------------------------------------} + {- Funcion: verifica si existe un archivo. + {----------------------------------------------------------------------------} + + function existeArchivo( nombre: String ): boolean; + + { funcion extrida de la ayuda del Turbo Pascal 7 } + + var + arch: text; + + begin + {$I-} + Assign( arch, nombre ); + FileMode := 0; { Solo lectura } + Reset( arch ); + Close( arch ); + {$I+} + ExisteArchivo := (IOResult = 0) and (nombre <> ''); + end; + + {-- Fin de la Funcion ExisteArchivo --} + + {----------------------------------------------------------------------------} + {- Procedimiento: Procesa los parametros de la ejecucion del programa + {----------------------------------------------------------------------------} + + procedure procesarParametros( var archivoEntradaTabla: T_ARCHIVO_COMANDOS_TABLA; + var archivoEntradaABO: T_ARCHIVO_COMANDOS_ABO; + var archivoSalida: text; var error: boolean ); + + begin + if ( paramcount = 3 ) then begin + if ( existeArchivo( paramstr( 1 ) ) and existeArchivo( paramstr( 2 ) ) ) then begin + assign( archivoEntradaTabla, paramstr( 1 ) ); + reset( archivoEntradaTabla ); + assign( archivoEntradaABO, paramstr( 2 ) ); + reset( archivoEntradaABO ); + assign( archivoSalida, paramstr( 3 ) ); + rewrite( archivoSalida ); + error := false; + end + else + error := true; + end + else + error := true; + end; + + {-- Fin del Procedimiento procesarParametros --} + + {----------------------------------------------------------------------------} + {- Procedimiento: Muestra un mensaje de error y la sintaxis del programa. + {----------------------------------------------------------------------------} + + procedure errorParametros; + + var + dir: dirstr; + fname: namestr; + ext: extstr; + + begin + fsplit( paramstr( 0 ), dir, fname, ext ); + writeln; + writeln; + writeln( 'ERROR: No se pudieron abrir los archivos o numero de parametros incorrectos.' ); + writeln( ' Verifique que el archivo de comandos exista y que el archivo de salida no.' ); + writeln( ' Ademas asegurese de que tenga permiso de escritura en la unidad que desee' ); + writeln( ' guardar el archivo de salida.' ); + writeln; + writeln( 'Modo de uso:' ); + writeln( ' ', fname, ' archivo_comandos_tabla archivo_comandos_abo archivo_salida' ); + writeln; + end; + + {-- Fin del Procedimiento errorParametros --} + + {----------------------------------------------------------------------------} + {- Procedimiento: Muestra mensaje introductorio en archivo de salida + {----------------------------------------------------------------------------} + + procedure intro( var f: text ); + + begin + writeln( f ); + writeln( f ); + writeln( f, 'Archivo de Comandos de Tabla: ', ParamStr( 1 ) ); + writeln( f, 'Archivo de Comandos de ABO : ', ParamStr( 2 ) ); + writeln( f, 'Archivo de Informacion : ', ParamStr( 3 ) ); + writeln( f ); + end; + + {-- Fin del Procedimiento --} + + {----------------------------------------------------------------------------} + {- Procedimiento: Muestra mensaje introductorio en archivo de salida + {----------------------------------------------------------------------------} + + procedure introTabla( var f: text ); + + begin + writeln( f ); + writeln( f ); + writeln( f, 'PROCESO DE ARCHIVO DE COMANDOS DE TABLA' ); + writeln( f, '======= == ======= == ======== == =====' ); + writeln( f ); + writeln( f ); + end; + + {-- Fin del Procedimiento --} + + {----------------------------------------------------------------------------} + {- Procedimiento: Muestra mensaje introductorio en archivo de salida + {----------------------------------------------------------------------------} + + procedure introABO( var f: text ); + + begin + writeln( f ); + writeln( f ); + writeln( f, 'PROCESO DE ARCHIVO DE COMANDOS DEL ABO' ); + writeln( f, '======= == ======= == ======== === ===' ); + writeln( f ); + writeln( f ); + end; + + {-- Fin del Procedimiento --} + + {----------------------------------------------------------------------------} + {- Funcion: Convierte un dato del tipo T_MOVIM en un string + {----------------------------------------------------------------------------} + + function movimToStr( m: T_MOVIM): string; + + begin + case ( m ) of + T_MOVIM_primero: + movimToStr := 'P'; + T_MOVIM_ultimo: + movimToStr := 'U'; + T_MOVIM_anterior: + movimToStr := 'A'; + T_MOVIM_siguiente: + movimToStr := 'S'; + end; + end; + + {-- Fin del Procedimiento --} + + {----------------------------------------------------------------------------} + {- Funcion: Convierte un dato del tipo ID_COMANDO en un string + {----------------------------------------------------------------------------} + + function comandoToStr( c: ID_COMANDO ): string; + + begin + case ( c ) of + INS: + comandoToStr := 'IN'; + IO: + comandoToStr := 'IO'; + ORDEN: + comandoToStr := 'OR'; + BC: + comandoToStr := 'BC'; + BR: + comandoToStr := 'BR'; + LS: + comandoToStr := 'LS'; + LC: + comandoToStr := 'LC'; + BO: + comandoToStr := 'BO'; + MO: + comandoToStr := 'MO'; + LI: + comandoToStr := 'LI'; + else + comandoToStr := 'DE'; + end; + end; + + {-- Fin del Procedimiento --} + + {----------------------------------------------------------------------------} + {- Funcion: Convierte un string en un dato del tipo ID_COMANDO + {----------------------------------------------------------------------------} + + function strToComando( s: string ): ID_COMANDO; + + begin + if ( ( s = 'IN' ) or ( s = 'in' ) or ( s = 'In' ) or ( s = 'iN' ) ) then + strToComando := INS + else if ( ( s = 'IO' ) or ( s = 'io' ) or ( s = 'Io' ) or ( s = 'iO' ) ) then + strToComando := IO + else if ( ( s = 'OR' ) or ( s = 'or' ) or ( s = 'Or' ) or ( s = 'oR' ) ) then + strToComando := ORDEN + else if ( ( s = 'BC' ) or ( s = 'bc' ) or ( s = 'Bc' ) or ( s = 'bC' ) ) then + strToComando := BC + else if ( ( s = 'BR' ) or ( s = 'br' ) or ( s = 'Br' ) or ( s = 'bR' ) ) then + strToComando := BR + else if ( ( s = 'LS' ) or ( s = 'ls' ) or ( s = 'Ls' ) or ( s = 'lS' ) ) then + strToComando := LS + else if ( ( s = 'LC' ) or ( s = 'lc' ) or ( s = 'Lc' ) or ( s = 'lC' ) ) then + strToComando := LC + else if ( ( s = 'BO' ) or ( s = 'bo' ) or ( s = 'bO' ) or ( s = 'Bo' ) ) then + strToComando := BO + else if ( ( s = 'MO' ) or ( s = 'mo' ) or ( s = 'mO' ) or ( s = 'Mo' ) ) then + strToComando := MO + else if ( ( s = 'LI' ) or ( s = 'li' ) or ( s = 'Li' ) or ( s = 'lI' ) ) then + strToComando := LI + else + strToComando := DESC; + end; + + {-- Fin del Procedimiento --} + + {----------------------------------------------------------------------------} + {- Funcion: Convierte un string en un dato del tipo ID_COMANDO + {----------------------------------------------------------------------------} + + {----------------------------------------------------------------------------} + {- Funcion: Convierte un string en un dato del tipo T_MOVIM + {----------------------------------------------------------------------------} + + function strToMovim( s: string; var error: boolean ): T_MOVIM; + + begin + error := false; + if ( ( s = 'P' ) or ( s = 'p' ) ) then + strToMovim := T_MOVIM_primero + else if ( ( s = 'U' ) or ( s = 'u' ) ) then + strToMovim := T_MOVIM_ultimo + else if ( ( s = 'A' ) or ( s = 'a' ) ) then + strToMovim := T_MOVIM_anterior + else if ( ( s = 'S' ) or ( s = 's' ) ) then + strToMovim := T_MOVIM_siguiente + else begin + strToMovim := T_MOVIM_primero; + error := true; + end; + end; + + {-- Fin del Procedimiento --} + + {----------------------------------------------------------------------------} + {- Procedimiento: Agrega el texto de un comando a ejecutar en el archivo de salida + {----------------------------------------------------------------------------} + + procedure agregaComandoTBL( var f: text; c: T_COMANDO_TABLA ); + + var + err: boolean; + m: string; + + begin + writeln( f ); + write( f, '>>> ', comandoToStr( strToComando( c.comando ) ) ); { Para que aparezca en mayusculas } + write( f, ' ; ', c.dni ); + write( f, ' ; ', c.nombre ); + m := movimToStr( strToMovim( c.Movimiento, err ) ); + if ( err ) then begin + if ( c.movimiento = '*' ) then + m := 'Desconocido' + else + m := 'Ninguno'; + end; + write( f, ' ; ', m ); { Para que aparezca en mayusculas } + write( f, ' ; ', c.dni_hasta ); + writeln( f ); + end; + + {-- Fin del Procedimiento --} + + {----------------------------------------------------------------------------} + {- Procedimiento: Agrega el texto de un comando a ejecutar en el archivo de salida + {----------------------------------------------------------------------------} + + procedure agregaComandoABO( var f: text; c: T_COMANDO_ABO ); + + var + err: boolean; + m: string; + + begin + writeln( f ); + write( f, '>>> ', comandoToStr( strToComando( c.comando ) ) ); { Para que aparezca en mayusculas } + write( f, ' ; ', c.dni ); + write( f, ' ; ', c.nombre ); + writeln( f ); + end; + + {-- Fin del Procedimiento --} + + + {----------------------------------------------------------------------------} + {- Procedimiento: Agrega mensaje de error en el archivo de salida + {----------------------------------------------------------------------------} + + procedure agregaError( var f: text; cmd, msg: string ); + + begin + writeln( f, ' * ' + cmd + ' ERROR: ' + msg ); + end; + + {-- Fin del Procedimiento --} + + + {----------------------------------------------------------------------------} + {- Procedimiento: Agrega mensaje de error en el archivo de salida + {----------------------------------------------------------------------------} + + procedure agregaRegistro( var f: text; cmd: string; r: T_REGISTRO ); + + var + s1, s2: string; + + begin + s1 := ' @ ' + cmd + '> REGISTRO: Clave = '; + s2 := ' | Nombre = ' + r.nombre; + writeln( f, s1, r.dni, s2 ); + end; + + {-- Fin del Procedimiento --} + + + {----------------------------------------------------------------------------} + {- Procedimiento: Muestra el contenido de una pila (vaciandola) + {----------------------------------------------------------------------------} + procedure mostrarPila( var f: text; var p: T_PILAC ); + + var + r: T_REGISTRO; + + begin + while ( not PILAC_vacio( p ) ) do begin + PILAC_sacar( p, r ); + agregaRegistro( f, 'PILAC', r ); + end; + end; + +end. \ No newline at end of file diff --git a/programa.pas b/programa.pas new file mode 100644 index 0000000..54c0fc3 --- /dev/null +++ b/programa.pas @@ -0,0 +1,419 @@ +program TrabajoPracticoII; + +{ + ALGORITMOS Y PROGRAMACIÓN II + ========== = ============ == + + TRABAJO PRÁCTICO NÚMERO 2 + ~~~~~~~ ~~~~~~~~ ~~~~~~ ~ + + Catedra: Carolo + ======= + + 1er Cuatrimestre 2000 + --- ------------ ---- + + Grupo: 22 + ===== + +NOTA: Como se manejan tipos de datos que pueden ser estructuras muy grandes, a veces + se pasan variables a los procedimientos por referencia (con 'var') sin ser esto + necesario, pero de esta manera se evita copiar grandes estructuras varias veces + (en especial en algunos procedimientos recursivos). +} + +{$M 65520, 0, 655360} { evita errores de Stack Overflow } + + uses + PROG_GRL, GRAL, TABLA, PILA_C, ABO_AB, ABO_UTIL; + + + {----------------------------------------------------------------------------} + {- Procedimiento: Procesa archivo de comandos de tabla + {----------------------------------------------------------------------------} + procedure procesarComandosTabla( var fo: text; var fi: T_ARCHIVO_COMANDOS_TABLA; + var t: T_TABLA ); + + var + m: T_MOVIM; + c: T_COMANDO_TABLA; + cmd: ID_COMANDO; + r: T_REGISTRO; + p: T_PILAC; + err: boolean; + dni: T_CLAVE; + + begin + { Lectura de datos hasta EOF } + introTabla( fo ); + while ( not eof( fi ) ) do begin + read( fi, c ); + cmd := strToComando( c.comando ); + agregaComandoTbl( fo, c ); + + { Ejecuta segun tipo comando } + case ( cmd ) of + + { Insersion } + INS: begin + r.dni := c.dni; + r.nombre:= c.nombre; + if ( T_TABLA_Llena( t ) ) then + agregaError( fo, comandoToStr( cmd ), 'Tabla Llena!' ) + else begin + m := strToMovim( c.Movimiento, err ); + if ( err ) then + agregaError( fo, comandoToStr( cmd ), 'Movimiento NO valido ("' + movimToStr( m ) + '")!' ) + else begin + T_TABLA_Insertar( t, m, r ); + agregaRegistro( fo, comandoToStr( cmd ), r ); + end; + end; + end; + + { Insersion Ordenada } + IO: begin + r.dni := c.dni; + r.nombre:= c.nombre; + if ( T_TABLA_Llena( t ) ) then + agregaError( fo, comandoToStr( cmd ), 'Tabla Llena!' ) + else if ( not T_TABLA_Ordenada( t ) ) then + agregaError( fo, comandoToStr( cmd ), 'Tabla Desordenada!' ) + else begin + T_TABLA_Insertar_Ord( t, r ); + agregaRegistro( fo, comandoToStr( cmd ), r ); + end; + end; + + { Ordenar } + ORDEN: begin + if ( T_TABLA_Vacia( t ) ) then + agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' ) + else + T_TABLA_Ordenar( t ); + end; + + { Buscar Clave } + BC: begin + if ( T_TABLA_Vacia( t ) ) then + agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' ) + else if ( not T_TABLA_Ordenada( t ) ) then + agregaError( fo, comandoToStr( cmd ), 'Tabla Desordenada!' ) + else begin + T_TABLA_Buscar_Clave( t, r.dni, err ); + if ( err ) then + agregaError( fo, comandoToStr( cmd ), 'No se encontro la clave "' + c.dni + '"!' ) + else begin + T_TABLA_Elem_Cte( t, r ); + agregaRegistro( fo, comandoToStr( cmd ), r ); + end; + end; + end; + + { Buscar Rango } + BR: begin + r.dni := c.dni; + dni := c.dni_hasta; + if ( T_TABLA_Vacia( t ) ) then + agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' ) + else if ( not T_TABLA_Ordenada( t ) ) then + agregaError( fo, comandoToStr( cmd ), 'Tabla Desordenada!' ) + else begin + T_TABLA_Buscar_por_Rango( t, r.dni, dni, p, err ); + if ( err ) then + agregaError( fo, comandoToStr( cmd ), + 'No se encontro ninguna clave "' + c.dni + '-' + c.dni_hasta + '"!' ) + else begin + while ( not PILAC_vacio( p ) ) do begin + PILAC_sacar( p, r ); + agregaRegistro( fo, comandoToStr( cmd ), r ); + end; + end; + end; + end; + + { Listar Tabla } + LS: begin + if ( T_TABLA_Vacia( t ) ) then + agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' ) + else begin + T_TABLA_Mover_Cte( t, T_MOVIM_primero, err ); + err:= false; + while ( not err ) do begin + T_TABLA_Elem_Cte( t, r ); + agregaRegistro( fo, comandoToStr( cmd ), r ); + T_TABLA_Mover_Cte( t, T_MOVIM_siguiente, err ); + end; + end; + end; + + { Listar Corriente } + LC: begin + if ( T_TABLA_Vacia( t ) ) then + agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' ) + else begin + T_TABLA_Elem_Cte( t, r ); + agregaRegistro( fo, comandoToStr( cmd ), r ); + end; + end; + + { Borrar Corriente } + BO: begin + if ( T_TABLA_Vacia( t ) ) then + agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' ) + else begin + T_TABLA_Elem_Cte( t, r ); + T_TABLA_Borrar_Cte( t ); + agregaRegistro( fo, comandoToStr( cmd ), r ); + end; + end; + + { Modificar Corriente } + MO: begin + r.dni := c.dni; + if ( T_TABLA_Vacia( t ) ) then + agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' ) + else begin + T_TABLA_Elem_Cte( t, r ); + agregaRegistro( fo, comandoToStr( cmd ), r ); + r.nombre:= c.nombre; + T_TABLA_Modif_Cte( t, r ); + agregaRegistro( fo, comandoToStr( cmd ), r ); + end; + end; + + { Limpiar Tabla } + LI: + T_TABLA_Limpiar( t ); + + { Comando Desconocido } + else + agregaError( fo, comandoToStr( cmd ), 'Comando Desconocido!' ) + + end; { case ( cmd ) of } + end; { while ( not eof( fEnt ) ) do begin } + end; + {------------------------------------------------------------------} + { FIN DEL PROCEDIMIENTO DE PROCESO DE ARCHIVO DE COMANDOS DE TABLA } + {------------------------------------------------------------------} + + + {----------------------------------------------------------------------------} + {- Procedimiento: Procesa archivo de comandos de ABO + {----------------------------------------------------------------------------} + procedure procesarComandosABO( var fo: text; var fi: T_ARCHIVO_COMANDOS_ABO; + var a: ABO_ARBOL ); + + var + c: T_COMANDO_ABO; + cmd: ID_COMANDO; + r: T_REGISTRO; + p: T_PILAC; + er: boolean; + + begin + introABO( fo ); + { Lectura de datos hasta EOF } + while ( not eof( fi ) ) do begin + read( fi, c ); + cmd := strToComando( c.comando ); + agregaComandoABO( fo, c ); + + { Ejecuta segun tipo comando } + case ( cmd ) of + + { Insersion Ordenada } + IO: begin + r.dni := c.dni; + r.nombre:= c.nombre; + ABO_insertar( a, r, er ); + if ( er ) then + agregaError( fo, comandoToStr( cmd ), 'Ya exite la clave!' ) + else + agregaRegistro( fo, comandoToStr( cmd ), r ); + end; + + { Buscar Clave (si el dni es '*' entonces lista el elemento corriente } + BC: begin + if ( ABO_vacio( a ) ) then + agregaError( fo, comandoToStr( cmd ), 'Arbol Vacio!' ) + else begin + er := false; + if ( c.dni <> '*' ) then + ABO_buscar( a, c.dni, er ); + if ( er ) then + agregaError( fo, comandoToStr( cmd ), 'No se encontro la clave "' + c.dni + '"!' ) + else begin + ABO_elem_cte( a, r ); + agregaRegistro( fo, comandoToStr( cmd ), r ); + end; + end; + end; + + { Borrar Corriente } + BO: begin + if ( ABO_vacio( a ) ) then + agregaError( fo, comandoToStr( cmd ), 'Arbol Vacio!' ) + else begin + ABO_elem_cte( a, r ); + ABO_borrar_cte( a ); + agregaRegistro( fo, comandoToStr( cmd ), r ); + end; + end; + + { Modificar Corriente } + MO: begin + if ( ABO_vacio( a ) ) then + agregaError( fo, comandoToStr( cmd ), 'Arbol Vacio!' ) + else begin + ABO_elem_cte( a, r ); + agregaRegistro( fo, comandoToStr( cmd ), r ); + r.dni := c.dni; + r.nombre := c.nombre; + ABO_modif_cte( a, r, er ); + if ( er ) then + agregaError( fo, comandoToStr( cmd ), 'Ya exite la clave!' ) + else + agregaRegistro( fo, comandoToStr( cmd ), r ); + end; + end; + + { Limpiar ABO } + LI: + ABO_vaciar( a ); + + { Comando Desconocido } + else + agregaError( fo, comandoToStr( cmd ), 'Comando Desconocido!' ) + + end; { case ( cmd ) of } + end; { while ( not eof( fEnt ) ) do begin } + end; + {------------------------------------------------------------------} + { FIN DEL PROCEDIMIENTO DE PROCESO DE ARCHIVO DE COMANDOS DEL ABO } + {------------------------------------------------------------------} + + + {----------------------------------------------------------------------------} + {- Procedimiento: Lista el arbol de forma ordenada (IN-ORDER). + {----------------------------------------------------------------------------} + + PROCEDURE listarABOInOrder( var f: text; var a: ABO_ARBOL ); + PROCEDURE listar_rec( var a: ABO_ARBOL ); + var + er: boolean; + c: T_CLAVE; + r: T_REGISTRO; + + begin + { Proceso el subarbol izquierdo } + ABO_mover_cte( a, ABO_izquierda, er ); + if ( not er ) then begin + listar_rec( a ); + ABO_mover_cte( a, ABO_padre, er ); + end; + { Imprimo el elemento actual } + ABO_elem_cte( a, r ); + agregaRegistro( f, 'ABO', r ); + { Proceso el subarbol derecho } + ABO_mover_cte( a, ABO_derecha, er ); + if ( not er ) then begin + listar_rec( a ); + ABO_mover_cte( a, ABO_padre, er ); + end; + end; + + var + er: boolean; + + begin + writeln( f ); + writeln( f, 'Listando el arbol IN-ORDER...' ); + writeln( f ); + ABO_mover_cte( a, ABO_raiz, er ); + if ( not er ) then + listar_rec( a ); + end; + {------------------------------------------------------------------} + { FIN DEL PROCEDIMIENTO PARA LISTAR EL ABO IN-ORDER } + {------------------------------------------------------------------} + + +var + tbl: T_TABLA; + p: T_PILAC; + fEntT: T_ARCHIVO_COMANDOS_TABLA; + fEntA: T_ARCHIVO_COMANDOS_ABO; + fSal: text; + id: ID_COMANDO; + m: T_MOVIM; + c: T_COMANDO_TABLA; + r: T_REGISTRO; + err: boolean; + er: boolean; + cmd: ID_COMANDO; + valerr: integer; + s: string; + dni: T_CLAVE; + abo: ABO_ARBOL; + +begin + mensajeDeEntrada( 'Programa principal.' ); + procesarParametros( fEntT, fEntA, fSal, err ); + if ( err ) then begin + errorParametros; + exit; { ----------------------------------> SALE DEL PROGRAMA!!!! } + end;{} + { Inicializacion de TADs } + T_TABLA_Crear( tbl ); + PILAC_Inicializar( p ); + ABO_crear( abo ); + { PROCESO DEL ARCHIVO DE COMANDOS DE LA TABLA PARA } + { CREAR LOS ELEMENTO DE ESTA } + procesarComandosTabla( fSal, fEntT, tbl ); + { AHORA SE INGRESAN LOS DATOS DE LA TABLA A EL ABO } + { (Puntos A y B de la parte 4) } + writeln( fSal ); + writeln( fSal, 'Procesando los datos de la tabla en un ABO...' ); + writeln( fSal ); + if ( not T_TABLA_vacia( tbl ) ) then begin + { Recorro la tabla agregando los elemento al ABO } + T_TABLA_mover_cte( tbl, T_MOVIM_primero, err ); + while ( not err ) do begin + T_TABLA_elem_cte( tbl, r ); + ABO_insertar( abo, r, er ); + if ( er ) then + agregaError( fSal, 'ABO_insertar', 'El elemento ya existe en el ABO' ); + T_TABLA_mover_cte( tbl, T_MOVIM_siguiente, err ); + end; + { Busco por rango y listo la pila devuelta } + ABO_UTIL_buscar_por_rango( abo, '00000001', '99999999', p ); + mostrarPila( fSal, p ); + end + else + agregaError( fSal, 'T_TABLA', 'Tabla vacia' ); + { AHORA PROCESA EL ARCHIVO DE COMANDOS DEL ABO } + { (Punto C de la parte 4) } + procesarComandosABO( fSal, fEntA, abo ); + { AHORA SE LLAMA AL PROCEDIMIENTO BUSCAR_POR_RANGO } + { Punto D de la parte 4 } + if ( not ABO_vacio( abo ) ) then begin + ABO_UTIL_buscar_por_rango( abo, '10000000', '30000000', p ); + writeln( fSal ); + writeln( fSal, 'Listando los resultados de la busqueda (desde 10000000 hasta 30000000) ...' ); + writeln( fSal ); + mostrarPila( fSal, p ); + end + else + agregaError( fSal, 'ABO', 'ABO vacio. No se puede buscar por rango.' ); + { POR ULTIMO LISTAMOS EL ARBOL DE FORMA ORDENADA (IN_ORDER) } + { Punto E de la parte 4 } + listarABOInOrder( fSal, abo ); + { FINALIZA LOS ARCHIVOS Y CIERRA EL PROGRAMA CON UN MENSAJE } + close( fSal ); + close( fEntT ); + close( fEntA ); + writeln( 'Archivos "', paramstr( 1 ), '" y "', paramstr( 2 ), '" procesados con exito.' ); + writeln( 'Puede ver la salida y/o errores en el archivo ', paramstr( 3 ) ); + writeln( 'FIN DEL PROGRAMA' ); +end. \ No newline at end of file diff --git a/salida.txt b/salida.txt new file mode 100644 index 0000000..741c96f --- /dev/null +++ b/salida.txt @@ -0,0 +1,198 @@ + + +PROCESO DE ARCHIVO DE COMANDOS DE TABLA +======= == ======= == ======== == ===== + + + +>>> IN ; 23456789 ; TITO ; P ; * + @ IN> REGISTRO: Clave = 23456789 | Nombre = TITO + +>>> IN ; 28193047 ; RAULITO ; S ; * + @ IN> REGISTRO: Clave = 28193047 | Nombre = RAULITO + +>>> IN ; 27215947 ; lUCA ; S ; * + @ IN> REGISTRO: Clave = 27215947 | Nombre = lUCA + +>>> IN ; 33991100 ; LUCA ; S ; * + @ IN> REGISTRO: Clave = 33991100 | Nombre = LUCA + +>>> IN ; 20102938 ; SUSI ; S ; * + @ IN> REGISTRO: Clave = 20102938 | Nombre = SUSI + +>>> IN ; 48039201 ; LITA ; S ; * + @ IN> REGISTRO: Clave = 48039201 | Nombre = LITA + +>>> IN ; 33091321 ; SELMA ; S ; * + @ IN> REGISTRO: Clave = 33091321 | Nombre = SELMA + +>>> IN ; 99112233 ; PATY ; S ; * + @ IN> REGISTRO: Clave = 99112233 | Nombre = PATY + +>>> IN ; 00230031 ; MONTY ; S ; * + @ IN> REGISTRO: Clave = 00230031 | Nombre = MONTY + +>>> IN ; 76428991 ; APU ; S ; * + @ IN> REGISTRO: Clave = 76428991 | Nombre = APU + +>>> OR ; * ; * ; Desconocido ; * + +Procesando los datos de la tabla en un ABO... + + @ PILAC> REGISTRO: Clave = 99112233 | Nombre = PATY + @ PILAC> REGISTRO: Clave = 76428991 | Nombre = APU + @ PILAC> REGISTRO: Clave = 48039201 | Nombre = LITA + @ PILAC> REGISTRO: Clave = 33991100 | Nombre = LUCA + @ PILAC> REGISTRO: Clave = 33091321 | Nombre = SELMA + @ PILAC> REGISTRO: Clave = 28193047 | Nombre = RAULITO + @ PILAC> REGISTRO: Clave = 27215947 | Nombre = lUCA + @ PILAC> REGISTRO: Clave = 23456789 | Nombre = TITO + @ PILAC> REGISTRO: Clave = 20102938 | Nombre = SUSI + @ PILAC> REGISTRO: Clave = 00230031 | Nombre = MONTY + + +PROCESO DE ARCHIVO DE COMANDOS DEL ABO +======= == ======= == ======== === === + + + +>>> IO ; 22334423 ; PRUEBA + @ IO> REGISTRO: Clave = 22334423 | Nombre = PRUEBA + +>>> IO ; 33441122 ; OTRA + @ IO> REGISTRO: Clave = 33441122 | Nombre = OTRA + +>>> IN ; 27830120 ; MAS PRUEBAS + * IN ERROR: Comando Desconocido! + +>>> BC ; 22334423 ; * + @ BC> REGISTRO: Clave = 22334423 | Nombre = PRUEBA + +>>> BO ; * ; * + @ BO> REGISTRO: Clave = 22334423 | Nombre = PRUEBA + +>>> LI ; * ; * + +>>> IO ; 09876541 ; NOMBRE1 + @ IO> REGISTRO: Clave = 09876541 | Nombre = NOMBRE1 + +>>> IO ; 00203010 ; NOMBRE2 + @ IO> REGISTRO: Clave = 00203010 | Nombre = NOMBRE2 + +>>> IO ; 22334455 ; NOMBRE3 + @ IO> REGISTRO: Clave = 22334455 | Nombre = NOMBRE3 + +>>> IO ; 11223344 ; NOMBRE4 + @ IO> REGISTRO: Clave = 11223344 | Nombre = NOMBRE4 + +>>> IO ; 99887766 ; NOMBRE5 + @ IO> REGISTRO: Clave = 99887766 | Nombre = NOMBRE5 + +>>> IO ; 33442211 ; NOMBRE6 + @ IO> REGISTRO: Clave = 33442211 | Nombre = NOMBRE6 + +>>> IO ; 87492910 ; NOMBRE7 + @ IO> REGISTRO: Clave = 87492910 | Nombre = NOMBRE7 + +>>> IO ; 12332211 ; NOMBRE8 + @ IO> REGISTRO: Clave = 12332211 | Nombre = NOMBRE8 + +>>> IO ; 1829300 ; NOMBRE9 + @ IO> REGISTRO: Clave = 1829300 | Nombre = NOMBRE9 + +>>> IO ; 30494847 ; NOMBRE10 + @ IO> REGISTRO: Clave = 30494847 | Nombre = NOMBRE10 + +>>> IO ; 23431234 ; NOMBRE11 + @ IO> REGISTRO: Clave = 23431234 | Nombre = NOMBRE11 + +>>> IO ; 87312344 ; NOMBRE12 + @ IO> REGISTRO: Clave = 87312344 | Nombre = NOMBRE12 + +>>> IO ; 33441122 ; NOMBRE13 + @ IO> REGISTRO: Clave = 33441122 | Nombre = NOMBRE13 + +>>> IO ; 21029384 ; NOMBRE13 + @ IO> REGISTRO: Clave = 21029384 | Nombre = NOMBRE13 + +>>> IO ; 19203948 ; NOMBRE15 + @ IO> REGISTRO: Clave = 19203948 | Nombre = NOMBRE15 + +>>> IO ; 16239812 ; NOMBRE16 + @ IO> REGISTRO: Clave = 16239812 | Nombre = NOMBRE16 + +>>> IO ; 00000001 ; NOMBRE17 + @ IO> REGISTRO: Clave = 00000001 | Nombre = NOMBRE17 + +>>> IO ; 99999999 ; NOMBRE18 + @ IO> REGISTRO: Clave = 99999999 | Nombre = NOMBRE18 + +>>> IO ; 01928374 ; NOMBRE19 + @ IO> REGISTRO: Clave = 01928374 | Nombre = NOMBRE19 + +>>> IO ; 39489102 ; NOMBRE20 + @ IO> REGISTRO: Clave = 39489102 | Nombre = NOMBRE20 + +>>> IO ; 99999999 ; NOMBRE REPETIDO + * IO ERROR: Ya exite la clave! + +>>> IO ; 88373123 ; NOMBRE21 + @ IO> REGISTRO: Clave = 88373123 | Nombre = NOMBRE21 + +>>> IO ; 65471029 ; NOMBRE22 + @ IO> REGISTRO: Clave = 65471029 | Nombre = NOMBRE22 + +>>> BC ; 00000001 ; * + @ BC> REGISTRO: Clave = 00000001 | Nombre = NOMBRE17 + +>>> MO ; 22330129 ; MODIFICADO + @ MO> REGISTRO: Clave = 00000001 | Nombre = NOMBRE17 + @ MO> REGISTRO: Clave = 22330129 | Nombre = MODIFICADO + +>>> BC ; 99999999 ; * + @ BC> REGISTRO: Clave = 99999999 | Nombre = NOMBRE18 + +>>> MO ; 99999998 ; OTRO MODIFICADO + @ MO> REGISTRO: Clave = 99999999 | Nombre = NOMBRE18 + @ MO> REGISTRO: Clave = 99999998 | Nombre = OTRO MODIFICADO + +>>> IO ; 99999999 ; AHORA SI! + @ IO> REGISTRO: Clave = 99999999 | Nombre = AHORA SI! + +Listando los resultados de la busqueda (desde 10000000 hasta 30000000) ... + + @ PILAC> REGISTRO: Clave = 23431234 | Nombre = NOMBRE11 + @ PILAC> REGISTRO: Clave = 22334455 | Nombre = NOMBRE3 + @ PILAC> REGISTRO: Clave = 22330129 | Nombre = MODIFICADO + @ PILAC> REGISTRO: Clave = 21029384 | Nombre = NOMBRE13 + @ PILAC> REGISTRO: Clave = 19203948 | Nombre = NOMBRE15 + @ PILAC> REGISTRO: Clave = 1829300 | Nombre = NOMBRE9 + @ PILAC> REGISTRO: Clave = 16239812 | Nombre = NOMBRE16 + @ PILAC> REGISTRO: Clave = 12332211 | Nombre = NOMBRE8 + @ PILAC> REGISTRO: Clave = 11223344 | Nombre = NOMBRE4 + +Listando el arbol IN-ORDER... + + @ ABO> REGISTRO: Clave = 00203010 | Nombre = NOMBRE2 + @ ABO> REGISTRO: Clave = 01928374 | Nombre = NOMBRE19 + @ ABO> REGISTRO: Clave = 09876541 | Nombre = NOMBRE1 + @ ABO> REGISTRO: Clave = 11223344 | Nombre = NOMBRE4 + @ ABO> REGISTRO: Clave = 12332211 | Nombre = NOMBRE8 + @ ABO> REGISTRO: Clave = 16239812 | Nombre = NOMBRE16 + @ ABO> REGISTRO: Clave = 1829300 | Nombre = NOMBRE9 + @ ABO> REGISTRO: Clave = 19203948 | Nombre = NOMBRE15 + @ ABO> REGISTRO: Clave = 21029384 | Nombre = NOMBRE13 + @ ABO> REGISTRO: Clave = 22330129 | Nombre = MODIFICADO + @ ABO> REGISTRO: Clave = 22334455 | Nombre = NOMBRE3 + @ ABO> REGISTRO: Clave = 23431234 | Nombre = NOMBRE11 + @ ABO> REGISTRO: Clave = 30494847 | Nombre = NOMBRE10 + @ ABO> REGISTRO: Clave = 33441122 | Nombre = NOMBRE13 + @ ABO> REGISTRO: Clave = 33442211 | Nombre = NOMBRE6 + @ ABO> REGISTRO: Clave = 39489102 | Nombre = NOMBRE20 + @ ABO> REGISTRO: Clave = 65471029 | Nombre = NOMBRE22 + @ ABO> REGISTRO: Clave = 87312344 | Nombre = NOMBRE12 + @ ABO> REGISTRO: Clave = 87492910 | Nombre = NOMBRE7 + @ ABO> REGISTRO: Clave = 88373123 | Nombre = NOMBRE21 + @ ABO> REGISTRO: Clave = 99887766 | Nombre = NOMBRE5 + @ ABO> REGISTRO: Clave = 99999998 | Nombre = OTRO MODIFICADO + @ ABO> REGISTRO: Clave = 99999999 | Nombre = AHORA SI! diff --git a/tabla.pas b/tabla.pas new file mode 100644 index 0000000..f88be52 --- /dev/null +++ b/tabla.pas @@ -0,0 +1,262 @@ +unit TABLA; + +{ + IMPLEMENTACION : TABLA + ALMACENAMIENTO : LISTA DOBLE CON CURSORES + +} + +interface + +{ usa las funciones generales de TDAs } +uses + GRAL, LDC, PILA_C; + +{ tipos propios de la tabla } +type + T_TABLA = record + datos: LDC_LDC; + ordenada: boolean; + end; + + T_MOVIM = ( T_MOVIM_primero, T_MOVIM_ultimo, T_MOVIM_siguiente, T_MOVIM_anterior ); + + +{ ========= } +{ INTERFASE } + +PROCEDURE T_TABLA_Crear( VAR t: T_TABLA ); +{ PRE : T nunca fue creada. + POST: T creada y vacía.} +FUNCTION T_TABLA_Vacia( t: T_TABLA): BOOLEAN; +{ PRE : T creada. + POST: Si T tiene elementos, entonces es FALSE, sino es TRUE.} +FUNCTION T_TABLA_Llena( t: T_TABLA): BOOLEAN; +{ PRE : T creada. + POST: Si T tiene lugar para insertar nuevos elementos, entonces es FALSE, sino es TRUE.} +FUNCTION T_TABLA_Ordenada( t: T_TABLA): BOOLEAN; +{ PRE : T no vacía. + POST: Si T está ordenada, entonces es verdadero, sino es falso.} +PROCEDURE T_TABLA_Elem_Cte( t: T_TABLA; VAR r: T_REGISTRO); +{ PRE : T no vacía. + POST: R contiene el registro corriente.} +PROCEDURE T_TABLA_Mover_Cte( VAR t: T_TABLA; m: T_MOVIM; VAR error: BOOLEAN ); +{ PRE : T no vacía. + POST: + Si M = primero, el nuevo corriente es el primer registro y error es falso. + Si M = ultimo, el nuevo corriente es el último registro y error es falso. + Si M = siguiente, el nuevo corriente es el siguiente registro del actual corriente y error es falso. + Si el corriente era el ultimo registro, entonces error es verdadero y el corriente sigue siendo el + ultimo registro. + Si M = anterior, el nuevo corriente es el anterior registro del actual corriente y error es falso. Si el corriente era + el primer registro, entonces error es verdadero y el corriente sigue siendo el primer registro.} +PROCEDURE T_TABLA_Insertar( VAR t: T_TABLA; m: T_MOVIM; r: T_REGISTRO ); +{ PRE : T no llena. + POST: + Si M = primero, R se agregó, es el primer registro y el nuevo corriente. + Si M = ultimo, R se agregó, es el último registro y el nuevo corriente. + Si M = siguiente, R se agregó, es el siguiente registro del corriente, y es el nuevo corriente + Si M = anterior, R se agregó, es el anterior registro del corriente, y es el nuevo corriente.} +Procedure T_TABLA_Insertar_Ord( var t: T_TABLA ; var r: T_REGISTRO); +{ PRE : T no llena y ordenada. + POST: El regitro r se insertó en la tabla t de tal manera que esta continúa ordenada y r es el nuevo corriente. + Si ya existía un registro con la misma clave que r, se inserta después que este.} +PROCEDURE T_TABLA_Limpiar( VAR t: T_TABLA ); +{ PRE : T creada. + POST: T vacía.} +PROCEDURE T_TABLA_Borrar_Cte( VAR t: T_TABLA ); +{ PRE : T no vacía. + POST: Se elimino el registro corriente. El nuevo registro corriente es el siguiente del borrado, + si el borrado era el ultimo, entonces el nuevo corriente es el primero.} +PROCEDURE T_TABLA_Modif_Cte( VAR t: T_TABLA; r: T_REGISTRO); +{ PRE : T no vacía. + POST: El contenido del actual corriente fue actualizado con R. Si T estaba ordenada y no se modificaron los datos + de la clave del corriente, entonces T sigue ordenada. Si T estaba ordenada y se modificaron los datos de la clave + del corriente, entonces si la nueva clave rompe el orden de T, T no está más ordenada.} +PROCEDURE T_TABLA_Ordenar( VAR t: T_TABLA ); +{ PRE : T no vacía. + POST: T se encuentra ordenada por la clave de sus registros.} +PROCEDURE T_TABLA_Buscar_Clave( VAR t: T_TABLA; c: T_CLAVE; var error: boolean ); +{ PRE : T no vacía y ordenada. + POST: Si C es una clave que existe en T, entonces el nuevo corriente es el registro con clave C y error es falso, + si no error es verdadero y el corriente es el elemento más cercano al buscado cuya clave es mayor que c.} +PROCEDURE T_TABLA_Buscar_Por_Rango( VAR t: T_TABLA; desde, hasta: T_CLAVE; var p: T_PILAC; var error: boolean ); +{ 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. + POST: Tengo todos los registros cuyas claves se encuetran entre los valores desde y hasta almacendados en la pila p, + si encuontró como mínimo una clave. El valor de error es false. + Si no encontró ninguna clave, entonces p sigue vacía y error es true.} + +implementation + +PROCEDURE T_TABLA_Crear( VAR t: T_TABLA ); + begin + LDC_Inicializar( t.datos ); + t.ordenada := true; + end; + +FUNCTION T_TABLA_Vacia( t: T_TABLA): BOOLEAN; + begin + T_TABLA_Vacia := LDC_vacio( t.datos ); + end; + +FUNCTION T_TABLA_Llena( t: T_TABLA): BOOLEAN; + begin + T_TABLA_Llena := LDC_lleno( t.datos ); + end; + +FUNCTION T_TABLA_Ordenada( t: T_TABLA): BOOLEAN; + begin + T_TABLA_Ordenada := t.ordenada; + end; + +PROCEDURE T_TABLA_Elem_Cte( t: T_TABLA; VAR r: T_REGISTRO); + begin + LDC_elem_cte( t.datos, r ); + end; + +PROCEDURE T_TABLA_Mover_Cte( VAR t: T_TABLA; m: T_MOVIM; VAR error: BOOLEAN ); + var mov: LDC_movimiento; + begin + error := false; + if ( m <> T_MOVIM_ultimo ) then begin + case m of + T_MOVIM_primero: + mov := LDC_primero; + T_MOVIM_siguiente: + mov := LDC_siguiente; + T_MOVIM_anterior: + mov := LDC_anterior; + end; + LDC_mover_cte( t.datos, mov, error ); + end + else begin + while ( not error ) do + LDC_mover_cte( t.datos, LDC_siguiente, error ); + error := false; + end; + end; + +PROCEDURE T_TABLA_Insertar( VAR t: T_TABLA; m: T_MOVIM; r: T_REGISTRO ); + var mov : LDC_movimiento; + error: boolean; + begin + if ( m <> T_MOVIM_ultimo ) then begin + case m of + T_MOVIM_primero: + mov := LDC_primero; + T_MOVIM_siguiente: + mov := LDC_siguiente; + T_MOVIM_anterior: + mov := LDC_anterior; + end; + LDC_insertar( t.datos, mov, r ); + end + else begin + if ( not T_TABLA_Vacia( t ) ) then + T_TABLA_Mover_Cte( t, T_MOVIM_ultimo, error); + LDC_insertar( t.datos, LDC_siguiente, r ); + end; + t.ordenada := false; + end; + +PROCEDURE T_TABLA_Insertar_Ord( var t: T_TABLA ; var r: T_REGISTRO); + var + err: boolean; + reg: T_REGISTRO; + + begin + T_TABLA_Buscar_Clave( t, r.dni, err ); {me queda el corriente en el posterior mas cercano} + T_TABLA_Elem_Cte( t, reg ); + if ( reg.dni > r.dni ) then + T_TABLA_Insertar( t, T_MOVIM_anterior, r ) + else + T_TABLA_Insertar( t, T_MOVIM_siguiente, r ); + t.ordenada:= true + end; + +PROCEDURE T_TABLA_Limpiar( VAR t: T_TABLA ); + begin + LDC_vaciar( t.datos ); + t.ordenada := true; + end; + +PROCEDURE T_TABLA_Borrar_Cte( VAR t: T_TABLA ); + begin + LDC_borrar_cte( t.datos ); + end; + +PROCEDURE T_TABLA_Modif_Cte( VAR t: T_TABLA; r: T_REGISTRO); + var + tmp: T_REGISTRO; + begin + T_TABLA_Elem_Cte( t, tmp ); + if ( r.dni <> tmp.dni ) then + t.ordenada := false; + LDC_modif_cte( t.datos, r ); + end; + +PROCEDURE T_TABLA_Ordenar( VAR t: T_TABLA ); + var + tmp: T_TABLA; + r: T_REGISTRO; + err: boolean; + actual: T_CLAVE; + + begin + T_TABLA_Elem_Cte( t, r ); + actual := r.dni; + err := false; + T_TABLA_Crear( tmp ); + LDC_copiar( t.datos, tmp.datos ); + T_TABLA_Limpiar( t ); + T_TABLA_Elem_cte( tmp, r ); + T_TABLA_Insertar( t, T_MOVIM_primero, r ); + T_TABLA_Mover_Cte( tmp, T_MOVIM_siguiente, err ); + while ( not err ) do begin + T_TABLA_Elem_cte(tmp, r); + T_TABLA_Insertar_Ord(t, r); + T_TABLA_Mover_Cte( tmp, T_MOVIM_siguiente, err ); + end; + T_TABLA_Buscar_Clave( t, actual, err ); + t.ordenada:= true; + end; + +PROCEDURE T_TABLA_Buscar_Clave( VAR t: T_TABLA; c: T_CLAVE; var error: boolean ); + var + r: T_REGISTRO; + + begin + error:= false; + T_TABLA_Mover_Cte( t, T_MOVIM_primero, error ); + T_TABLA_Elem_Cte( t, r ); + while ( ( r.dni < c ) and not error ) do begin + T_TABLA_Mover_Cte( t, T_MOVIM_siguiente, error ); + T_TABLA_Elem_Cte( t, r ); + end; + if ( r.dni <> c ) then + error := true; + end; + +PROCEDURE T_TABLA_Buscar_Por_Rango( VAR t: T_TABLA; desde, hasta: T_CLAVE; var p: T_PILAC; var error: boolean ); + var + err: boolean; + r: T_REGISTRO; + + begin + error:= true; + T_TABLA_Buscar_Clave( t, desde, err ); + T_TABLA_Elem_Cte( t, r ); + if ( r.DNI <= hasta ) then begin + PILAC_poner( p, r ); + T_TABLA_Mover_Cte( t, T_MOVIM_siguiente, err ); + T_TABLA_Elem_Cte( t, r ); + while ( ( r.DNI <= hasta ) and not err ) do begin + PILAC_poner( p, r ); + T_TABLA_Mover_Cte( t, T_MOVIM_siguiente, err ); + T_TABLA_Elem_Cte( t, r ); + end; + error := false; + end; + end; + +end. \ No newline at end of file diff --git a/test.pas b/test.pas new file mode 100644 index 0000000..b541eb2 --- /dev/null +++ b/test.pas @@ -0,0 +1,172 @@ +program test; + + uses + ABO_AB, GRAL, ABO_UTIL, PILA_C; + +{ recorrer todos los nodos del arbol procesando todos los elementos } +{ ORDEN de recorrido: como el contenedor ya esta ordenado se recorre en el orden definido para el orden } +PROCEDURE APL_ABO_recorrer_rec( a: ABO_arbol; var f: text ); + PROCEDURE recorrer_rec( a: ABO_arbol ); + VAR + error: boolean; + e: T_REGISTRO; + BEGIN + { proceso el subarbol izquierdo } + ABO_mover_cte( a, ABO_izquierda, error ); + IF not error + THEN BEGIN + recorrer_rec( a); + ABO_mover_cte( a, ABO_padre, error ); + END; + { proceso el nodo corriente } + ABO_elem_cte( a, e); + writeln( f, 'DNI: ' + e.dni + ' | Nombre: ' + e.nombre ); + { proceso el subarbol izquierdo } + ABO_mover_cte( a, ABO_derecha, error ); + IF not error + THEN BEGIN + recorrer_rec( a); +{ ABO_mover_cte( a, ABO_padre, error ); no hace falta } + END; + END; +VAR + error: boolean; +BEGIN + { me voy a la raiz y desde allí proceso todo } + ABO_mover_cte( a, ABO_raiz, error ); + recorrer_rec( a ); +END; + + + var + abo: ABO_ARBOL; + r1: T_REGISTRO; + r2: T_REGISTRO; + e: boolean; + f: text; + p: T_PILAC; + + begin + assign( f, 'log.txt' ); + rewrite( f ); +{CREAR} + ABO_crear( abo ); +{VACIO} + if ABO_vacio( abo ) then + writeln( f, 'VACIO' ); + r1.dni := '00000001'; + r1.nombre := 'Luca'; +{INSERTAR} + ABO_insertar( abo, r1, e ); + ABO_insertar( abo, r1, e ); + if ( e ) then + writeln( f, 'Hubo un error, clave ya existente' ) + else + writeln( f, 'TODO OK (anda mal el programa)' ); + ABO_elem_cte( abo, r2 ); + writeln( f, 'DNI: ' + r2.dni + ' | Nombre: ' + r2.nombre ); + r2.dni := '00000005'; + r2.nombre := 'LucaX'; + ABO_insertar( abo, r2, e ); + r2.dni := '00000002'; + r2.nombre := 'LucaXX'; + ABO_insertar( abo, r2, e ); + r2.dni := '00000015'; + r2.nombre := 'LucaXXX'; + ABO_insertar( abo, r2, e ); + r2.dni := '00000012'; + r2.nombre := 'LucaXXXX'; + ABO_insertar( abo, r2, e ); + r2.dni := '00000105'; + r2.nombre := 'LucaX'; + ABO_insertar( abo, r2, e ); + r2.dni := '00010002'; + r2.nombre := 'LucaXX'; + ABO_insertar( abo, r2, e ); + r2.dni := '00000115'; + r2.nombre := 'LucaXXX'; + ABO_insertar( abo, r2, e ); + r2.dni := '00001012'; + r2.nombre := 'LucaXXXX'; + ABO_insertar( abo, r2, e ); + r2.dni := '00000205'; + r2.nombre := 'LucaX'; + ABO_insertar( abo, r2, e ); + r2.dni := '00000032'; + r2.nombre := 'LucaXX'; + ABO_insertar( abo, r2, e ); + r2.dni := '00000215'; + r2.nombre := 'LucaXXX'; + ABO_insertar( abo, r2, e ); + r2.dni := '00000412'; + r2.nombre := 'LucaXXXX'; + ABO_insertar( abo, r2, e ); + APL_ABO_recorrer_rec( abo , f ); + if not ABO_vacio( abo ) then + writeln( f, 'NO VACIO' ); +{MOVER: padre} + ABO_mover_cte( abo, ABO_padre, e ); + ABO_elem_cte( abo, r1 ); + writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre ); + ABO_mover_cte( abo, ABO_padre, e ); + ABO_elem_cte( abo, r1 ); + writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre ); + ABO_mover_cte( abo, ABO_padre, e ); + ABO_elem_cte( abo, r1 ); + writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre ); + ABO_mover_cte( abo, ABO_padre, e ); + ABO_elem_cte( abo, r1 ); + writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre ); + ABO_mover_cte( abo, ABO_padre, e ); + ABO_elem_cte( abo, r1 ); + writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre ); + ABO_mover_cte( abo, ABO_padre, e ); + ABO_elem_cte( abo, r1 ); + writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre ); +{MOVER: izquierda} + ABO_mover_cte( abo, ABO_izquierda, e ); + if not e then + ABO_elem_cte( abo, r1 ) + else + writeln( f, 'ERROR AL MOVER' ); + writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre ); + { YA ANDA EL BUSCAR!!!!!! } +{BUSCAR} + ABO_buscar( abo, '00000002', e ); + if e then writeln( f, 'ERROR: buscar!!!' ); +{BORRAR} + ABO_borrar_cte( abo ); + writeln( f, 'despues de borrar ''00000002''' ); + APL_ABO_recorrer_rec( abo , f ); + ABO_buscar( abo, '00010002', e ); + if e then writeln( f, 'ERROR: buscar!!!' ); +{ELEM_CTE} + ABO_elem_cte( abo, r2 ); + writeln( f, 'DNI: ' + r2.dni + ' | Nombre: ' + r2.nombre ); + r2.dni := '00000002'; + r2.nombre := 'NUEVO'; + ABO_modif_cte( abo, r2, e ); + if e then writeln( f, 'ERROR: modif_cte!!!' ); + ABO_elem_cte( abo, r1 ); + writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre ); +{MOVER: raiz} + ABO_mover_cte( abo, ABO_raiz, e ); +{MOVER: derecha} + ABO_mover_cte( abo, ABO_derecha, e ); + if e then writeln( f, 'ERROR: mover_derecha!!!' ); + ABO_mover_cte( abo, ABO_izquierda, e ); + if e then writeln( f, 'ERROR: mover_izquierda!!!' ); + ABO_elem_cte( abo, r1 ); + writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre ); + writeln( f, 'despues de modificar ''00100002''' ); + APL_ABO_recorrer_rec( abo , f ); +{BUSCAR POR RANGO} + PILAC_inicializar( p ); + ABO_UTIL_buscar_por_rango( abo,'00000012', '00000412', p ); + writeln( f, 'Mostrando resultados de busqueda desde ''00000012'' hasta '' 00000412''' ); + while ( not PILAC_vacio( p ) ) do begin + PILAC_sacar( p, r1 ); + writeln( f, 'DNI: ' + r1.dni + ' | Nombre: ' + r1.nombre ); + end; + close( f ); + end. \ No newline at end of file diff --git a/turbo.dsk b/turbo.dsk new file mode 100644 index 0000000000000000000000000000000000000000..0a14c8761f4c32ed6d362162c0ed10c35f909435 GIT binary patch literal 1828 zcmb7FOKTHR6#j0eY0_BRMk#^|Gi_5JQ=MuM3e|-(lO_#Jnqe~Clq(_W1QS}CkW3cc z^iLFAbX9Pv8~Ybr`U_kL3W5u_f`Vc^la~)@?sSGTGxwhJoqOKnbXt{$Y?a%)<$XC_ zZSQ%FrkttoSFaYhrbj$uW37il~E5?Gc&hxoqx?mhV;2F)>HXSX^H8WeV zb4MxeSSh(FH=}r$0t}+V)N$zK^y|#>f{dNyt5bxQ7pCkm!T_T7ZJ{=<>8hm_86F~z z96=N@Bx`GCAH=YTIRf1kgEYNR8lLqQSMWZ_S=`ZdQ|q6lAc|BFpSYPe`j96`UW@g?r?DL)6iC6nPywSBxUWzP z?0oH>$PxZ`nZdn4r@{?xvAZRGIa4e3MnZs~{TVrM?+8^7MbV^xE^+RZM&tIU z;&*+N?&tJhnxOW-q_?W&J*!ba@Y+RM&(dI+H1-?qsyj`~EK$tpv|7~zFI{g{h?^sd b41RkrY0`Y5;St%ax4lN|5E)%JyQKOzxOB;* literal 0 HcmV?d00001 -- 2.43.0