]> git.llucax.com Git - z.facultad/75.41/parcial.git/commitdiff
Import inicial después del "/var incident". :(
authorLeandro Lucarella <llucax@gmail.com>
Sun, 23 Mar 2003 07:10:16 +0000 (07:10 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Sun, 23 Mar 2003 07:10:16 +0000 (07:10 +0000)
a2000-c1-p1-1.pas [new file with mode: 0644]
t_colord_a1.pas [new file with mode: 0644]
t_colord_a2.pas [new file with mode: 0644]
t_colord_b1.pas [new file with mode: 0644]
t_colord_b2.pas [new file with mode: 0644]

diff --git a/a2000-c1-p1-1.pas b/a2000-c1-p1-1.pas
new file mode 100644 (file)
index 0000000..06c6d77
--- /dev/null
@@ -0,0 +1,254 @@
+{ algoritmos y programacion II - Catedra Carolo - PRACTICA }\r\r
+{ PARCIAL 1 1ra Op CUAT 1 2000 }\r\r
+\r\r
+program A2000_C1_P1_1;\r\r
+\r\r
+uses SYSUTILS, CRT,\r\r
+      T_COLORD_B1, T_LSC, TDA_GRAL;\r\r
+\r\r
+type\r\r
+\r\r
+       TClaseComando =( INS, INO, ORD, BUC, BUR, LIA, LID, LIC, BOR, MOV, LIM, MOC );\r\r
+\r\r
+   { registro de entrada }\r\r
+   TComando = record\r\r
+               comando:TClaseComando;\r\r
+               dni:longint;\r\r
+               strDni:string[8];\r\r
+               nombre:string[40];\r\r
+               movimiento: LSC_movimiento;\r\r
+               strMovim: string[2];\r\r
+               dni_hasta:longint;\r\r
+       end;\r\r
+\r\r
+\r\r
+{ este procedimiento lee una linea de texto y la convierte en un comando }\r\r
+{ devuelve TRUE si mapeo correctamente, sino FALSE }\r\r
+function MapearComando( linea: String; VAR c: TComando ): boolean;\r\r
+VAR\r\r
+       strComando: string;\r\r
+       strMovim: string;\r\r
+       strDNI: string;\r\r
+       ok: boolean;\r\r
+BEGIN\r\r
+       ok := true;\r\r
+\r\r
+       { defino que comando es }\r\r
+       strComando := copy( linea, 1,2 );\r\r
+\r\r
+                 if strComando='IN' then c.comando := INS\r\r
+       else if strComando='OR' then c.comando := ORD\r\r
+       else if strComando='LS' then c.comando := LIA\r\r
+       else if strComando='LC' then c.comando := LIC\r\r
+       else if strComando='BO' then c.comando := BOR\r\r
+       else if strComando='MV' then c.comando := MOV\r\r
+       else if strComando='MO' then c.comando := MOC\r\r
+       else if strComando='LI' then c.comando := LIM\r\r
+       else ok := false;\r\r
+\r\r
+       { defino el DNI, nombre y hasta }\r\r
+       strDNI := copy( linea, 3,8 );\r\r
+       IF LeftStr( strDNI, 1 ) <> '*'\r\r
+       THEN c.dni := strToIntDef( strDNI, -1 )\r\r
+       ELSE c.dni := -2;\r\r
+       c.strDni := strDni;\r\r
+\r\r
+       strDNI := copy( linea, 52,8 );\r\r
+       IF LeftStr( strDNI, 1 ) <> '*'\r\r
+       THEN c.dni_hasta := strToIntDef( strDNI, -1 )\r\r
+       ELSE c.dni_hasta := -2;\r\r
+       \r\r
+       IF (c.dni = -1 ) or (c.dni_hasta = -1 ) THEN ok := false;\r\r
+       \r\r
+       IF copy( linea, 11, 1 ) = '*'\r\r
+       THEN c.nombre := '*'\r\r
+       ELSE c.nombre :=  copy( linea, 11, 40 );\r\r
+\r\r
+       { el tipo de movimiento }\r\r
+       strMovim := copy( linea, 51, 1 );\r\r
+       c.strMovim := strMovim;\r\r
+                 if strMovim='P' then c.movimiento := LSC_primero\r\r
+       else if strMovim='S' then c.movimiento := LSC_siguiente\r\r
+       else if strMovim<>'*' then ok := false;\r\r
+\r\r
+       { writeln( 'dat:', c.nombre, ':', c.dni, ':', c.dni_hasta, ':', strMovim, ':', strComando,':' ); }\r\r
+       MapearComando := ok;\r\r
+END;\r\r
+\r\r
+PROCEDURE inicializar( VAR archEnt: text; VAR archSal: text);\r\r
+VAR\r\r
+        nomArchEnt: string;\r\r
+        nomArchSal: string;\r\r
+BEGIN\r\r
+       { busco los nombres de los archivos }\r\r
+       nomArchEnt := ParamStr( 1 );\r\r
+       nomArchSal := ParamStr( 2 );\r\r
+\r\r
+       writeln( 'IN :', nomArchEnt );\r\r
+       writeln( 'OUT:', nomArchSal );\r\r
+\r\r
+       { preparo los archivos }\r\r
+       assign ( archEnt, nomArchEnt );\r\r
+       reset  ( archEnt );\r\r
+       assign ( archSal, nomArchSal );\r\r
+       rewrite( archSal );\r\r
+END;\r\r
+\r\r
+PROCEDURE Ordenar_Lista( VAR l: LSC_Lista; VAR archSal: text );\r\r
+VAR\r\r
+       c: COLAORD_Cola;\r\r
+       e: Tipo_Elem;\r\r
+       error : boolean;\r\r
+BEGIN\r\r
+       { inicializo la cola }\r\r
+       COLAORD_inicializar( c );\r\r
+       \r\r
+       { pongo todos los registros en la cola }\r\r
+       LSC_Mover_cte( l, LSC_primero, error );\r\r
+       writeln('ahora empiezo a sacar de la lista');\r\r
+       WHILE not error\r\r
+       DO BEGIN\r\r
+               LSC_elem_cte( l, e );\r\r
+               COLAORD_poner( c, e, error );\r\r
+               IF error THEN writeln( archSal, 'ERROR ELEMENTO DUPLICADO [', devolver_clave_elem( e ), '] SERA DESCARTADO');\r\r
+               LSC_Mover_cte( l, LSC_siguiente, error );\r\r
+               END;\r\r
+\r\r
+       writeln('ahora empiezo a poner de vuelta en la lista');\r\r
+       { ahora limpio la lista y los pongo de vuelta ordenados }\r\r
+       LSC_vaciar( l );\r\r
+       WHILE not COLAORD_Vacia( c )\r\r
+       DO BEGIN\r\r
+               COLAORD_sacar( c, e );\r\r
+               writeln('saque ', e.dni, ':',e.nombre);\r\r
+               LSC_Insertar( l, LSC_siguiente, e );\r\r
+               END;\r\r
+\r\r
+END;\r\r
+\r\r
+\r\r
+var\r\r
+        { la tabla ppd }\r\r
+    t: LSC_Lista;\r\r
+       \r\r
+        { los archivos }\r\r
+        archEnt: text;\r\r
+        archSal: text;\r\r
+\r\r
+        { temporales }\r\r
+        linea: string;\r\r
+        c: Tcomando;\r\r
+        elem: tipo_elem;\r\r
+        error,\r\r
+        found: boolean;\r\r
+\r\r
+BEGIN\r\r
+       inicializar( archEnt, archSal);\r\r
+       \r\r
+       { creo la tabla donde voy a trabajar }\r\r
+       LSC_Inicializar( t );\r\r
+\r\r
+       { itero por la entrada }\r\r
+       WHILE not eof( archEnt ) DO\r\r
+       BEGIN\r\r
+               { leo la entrada }\r\r
+               readln( archEnt, linea );\r\r
+\r\r
+               IF not MapearComando( linea, c )\r\r
+               THEN BEGIN\r\r
+                       writeln( archSal, 'ERROR MAP [', linea, ']');\r\r
+                       continue;\r\r
+                       END;\r\r
+\r\r
+       \r\r
+       { ahora empiezo con el case de las operaciones }\r\r
+       case c.comando of\r\r
+               MOV:begin { mover corriente }\r\r
+                       writeln( archSal, 'MOV [', c.strMovim, ']' );\r\r
+                       if not LSC_vacia( t )\r\r
+                       then BEGIN\r\r
+            LSC_mover_cte( t, c.movimiento, error );\r\r
+                               IF error THEN writeln( 'MOV ERROR' );\r\r
+                               END\r\r
+                       ELSE\r\r
+                               writeln( 'ERROR: tabla vacia' );\r\r
+                       end;\r\r
+\r\r
+               INS: BEGIN { tengo que insertar }\r\r
+                       str( c.dni:8 , c.strDni );\r\r
+                       writeln( archSal, 'INS [', c.strDni, ':', c.nombre, ':', c.strMovim, ']' );\r\r
+                       IF LSC_llena( t )\r\r
+                       THEN writeln( archSal, 'ERROR tabla llena')\r\r
+                       ELSE BEGIN\r\r
+                               elem.dni := c.dni;\r\r
+                               elem.nombre := c.nombre;\r\r
+                               LSC_insertar( t, c.movimiento, elem );\r\r
+                               END;\r\r
+                       END;\r\r
+               \r\r
+               LIC: begin { listar corriente }\r\r
+         if not LSC_VACIA( t )\r\r
+                       then begin\r\r
+                               LSC_ELEM_CTE( t, elem );\r\r
+                               str( elem.dni:8 , c.strDni );\r\r
+                               writeln( archSal, 'LIC [', c.strDni, ':', elem.nombre,']' );\r\r
+                       end\r\r
+                       else writeln( archSal, 'LIC ERROR vacia');\r\r
+                 end;\r\r
+               \r\r
+               LIA: begin { listar la tabla }\r\r
+                       writeln( archSal, 'LIS ASC');\r\r
+                       if not LSC_VACIA( t )\r\r
+                       then begin\r\r
+                               LSC_MOVER_CTE( t, LSC_primero, error );\r\r
+                               LSC_ELEM_CTE( t, elem );\r\r
+       \r\r
+                               while not error do\r\r
+                               begin\r\r
+                                       str( elem.dni:8 , c.strDni );\r\r
+                                       writeln( archSal, '    [', c.strDni, ':', elem.nombre,']' );\r\r
+                                       LSC_MOVER_CTE( t, LSC_siguiente, error);\r\r
+                                       LSC_ELEM_CTE( t, elem);\r\r
+                               end;\r\r
+                       end;\r\r
+                 end;\r\r
+\r\r
+               ORD: begin { ordenar la tabla }\r\r
+                       writeln( archSal, 'ORD' );\r\r
+         if not LSC_vacia( t )\r\r
+                       then\r\r
+                               { este es la llamada al ejercicio }\r\r
+                               Ordenar_Lista( t, archSal );\r\r
+                       end;\r\r
+\r\r
+               BOR: begin { borrar el corriente }\r\r
+                       writeln( archSal, 'BOR' );\r\r
+                       if not LSC_VACIA( t )\r\r
+                       then\r\r
+                               LSC_BORRAR_CTE( t )\r\r
+                       else writeln( archSal, '    ERROR TABLA VACIA');\r\r
+                       end;\r\r
+               \r\r
+               MOC:begin { modificar el corriente }\r\r
+                       str( c.dni:8 , c.strDni );\r\r
+                       writeln( archSal, 'MOC [', c.strDni, ':', c.nombre, ']' );\r\r
+                       if not LSC_VACIA(t)\r\r
+                       then begin\r\r
+                               elem.dni := c.dni;\r\r
+                               elem.nombre := c.nombre;\r\r
+                               LSC_MODIF_CTE( t, elem );\r\r
+                               end\r\r
+                       else writeln( archSal, '    ERROR TABLA VACIA');\r\r
+                 end;\r\r
+               \r\r
+               LIM:begin { limpiar tabla }\r\r
+                       writeln( archSal, 'LIM' );\r\r
+                       LSC_Vaciar( t );\r\r
+                       end;\r\r
+       end;\r\r
+               END; {WHILE}\r\r
+       \r\r
+       { cierro los archivos }\r\r
+       close( archEnt );\r\r
+       close( archSal );\r\r
+END.
\ No newline at end of file
diff --git a/t_colord_a1.pas b/t_colord_a1.pas
new file mode 100644 (file)
index 0000000..cd2fee2
--- /dev/null
@@ -0,0 +1,263 @@
+{ algoritmos y programacion II - Catedra Carolo - PRACTICA }\r\r
+{ PARCIAL 1 1ra Op CUAT 1 2000 }\r\r
+\r\r
+unit T_COLORD_A1;\r\r
+\r\r
+{\r\r
+       IMPLEMENTACION : cola ordenada (cola de prioridades)\r\r
+       ALMACENAMIENTO : CURSORES\r\r
+       CARACTERISTICAS: poner ordenado\r\r
+       \r\r
+}\r\r
+\r\r
+{ ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular }\r\r
+interface\r\r
+\r\r
+{ usa las funciones generales de TDAs }\r\r
+uses tda_gral;\r\r
+\r\r
+{ maximo tamano del cursor }\r\r
+const COLAORD_MAX_CURSOR = 100;\r\r
+\r\r
+{ tipos propios de la lista para definir el cursor }\r\r
+TYPE\r\r
+       COLAORD_puntero = integer;\r\r
+\r\r
+const\r\r
+   COLAORD_nulo : COLAORD_puntero = 0;\r\r
+\r\r
+type\r\r
+\r\r
+       COLAORD_nodo = RECORD\r\r
+               Elem : Tipo_Elem;\r\r
+               Sig : COLAORD_puntero;\r\r
+       END;\r\r
+\r\r
+\r\r
+   { ahora le toca definir el cursor }\r\r
+   COLAORD_Almac = record\r\r
+      almacenamiento : array [ 1 .. COLAORD_MAX_CURSOR ] of COLAORD_Nodo;\r\r
+      disponibles    : array [ 1 .. COLAORD_MAX_CURSOR ] of COLAORD_Puntero;\r\r
+      primero_dispo  : COLAORD_Puntero;\r\r
+   end;\r\r
+\r\r
+       \r\r
+   COLAORD_Cola = RECORD\r\r
+               almac : COLAORD_Almac;\r\r
+               primero: COLAORD_puntero;\r\r
+       END;\r\r
+\r\r
+\r\r
+{ ========= }\r\r
+{ INTERFASE }\r\r
+\r\r
+\r\r
+PROCEDURE COLAORD_Inicializar ( VAR l: COLAORD_Cola );\r\r
+FUNCTION  COLAORD_vacia( l: COLAORD_Cola): BOOLEAN;\r\r
+FUNCTION  COLAORD_llena( l: COLAORD_Cola): BOOLEAN;\r\r
+\r\r
+PROCEDURE COLAORD_poner ( VAR l: COLAORD_Cola; e: Tipo_Elem; VAR error: boolean);\r\r
+PROCEDURE COLAORD_sacar ( VAR l: COLAORD_Cola; VAR e: Tipo_Elem);\r\r
+PROCEDURE COLAORD_vaciar ( VAR l: COLAORD_Cola );\r\r
+PROCEDURE COLAORD_copiar ( a: COLAORD_Cola; VAR b: COLAORD_Cola );\r\r
+\r\r
+implementation\r\r
+\r\r
+{ CURSORES DE ESTA IMPLEMENTACION }\r\r
+{ ========================================================================== }\r\r
+{  inicializar el almacenamiento }\r\r
+{ PRE : 'almac' no esta inicializado  }\r\r
+{ POST: 'almac' esta inicializado y vacio }\r\r
+procedure COLAORD_Almac_Inicializar( VAR almac : COLAORD_Almac );\r\r
+var i : COLAORD_Puntero;\r\r
+begin\r\r
+   almac.primero_dispo := 1;\r\r
+   for i := 1 to COLAORD_MAX_CURSOR - 1 do\r\r
+   begin\r\r
+      almac.disponibles[i] := i + 1;\r\r
+   end;\r\r
+   almac.disponibles[COLAORD_MAX_CURSOR] := COLAORD_Nulo;\r\r
+end;\r\r
+\r\r
+{ ========================================================================== }\r\r
+{  saber si hay lugar para reservar un nuevo elemento en el almacenamiento }\r\r
+{ PRE : 'almac' esta inicializado  }\r\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r\r
+            entonces retorna TRUE y sino FALSE }\r\r
+function COLAORD_Almac_HayLugar( almac : COLAORD_Almac ): boolean;\r\r
+begin\r\r
+   COLAORD_Almac_HayLugar := almac.primero_dispo <> COLAORD_Nulo;\r\r
+end;\r\r
+\r\r
+{ ========================================================================== }\r\r
+{  el pedido de un nuevo elemento al almacenamiento }\r\r
+{ PRE : 'almac' esta inicializado  }\r\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r\r
+            entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento\r\r
+            sino 'puntero' tiene el valor TTDA_Nulo }\r\r
+procedure COLAORD_Almac_Reservar( VAR almac : COLAORD_Almac; VAR puntero : COLAORD_Puntero );\r\r
+begin\r\r
+   if not COLAORD_Almac_HayLugar( almac )\r\r
+   then\r\r
+      puntero := COLAORD_Nulo\r\r
+   else begin\r\r
+      puntero := almac.primero_dispo;\r\r
+      almac.primero_dispo := almac.disponibles[ puntero ];\r\r
+   end;\r\r
+end;\r\r
+\r\r
+{ ========================================================================== }\r\r
+{  liberar un elemento del almacenamiento }\r\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r\r
+{ POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo }\r\r
+procedure COLAORD_Almac_Liberar( VAR almac : COLAORD_Almac; VAR puntero : COLAORD_Puntero );\r\r
+begin\r\r
+   almac.disponibles[ puntero ] := almac.primero_dispo;\r\r
+   almac.primero_dispo := puntero;\r\r
+   puntero := COLAORD_Nulo;\r\r
+end;\r\r
+\r\r
+{ ========================================================================== }\r\r
+{  acceder al elemento del almacenamiento apuntado por un puntero }\r\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r\r
+{ POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' }\r\r
+procedure COLAORD_Almac_Acceder( almac : COLAORD_Almac; puntero : COLAORD_Puntero; VAR elemento : COLAORD_Nodo );\r\r
+begin\r\r
+   elemento := almac.almacenamiento[ puntero ];\r\r
+end;\r\r
+\r\r
+{ ========================================================================== }\r\r
+{  modificar el elemento del almacenamiento apuntado por un puntero }\r\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r\r
+{ POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' }\r\r
+procedure COLAORD_Almac_Modificar( VAR almac : COLAORD_Almac; puntero : COLAORD_Puntero; elemento : COLAORD_Nodo );\r\r
+begin\r\r
+   almac.almacenamiento[ puntero ] := elemento;\r\r
+end;\r\r
+\r\r
+\r\r
+\r\r
+{ Estas son los dos procedimientos principales de la aplicación }\r\r
+\r\r
+PROCEDURE COLAORD_Inicializar ( VAR l: COLAORD_Cola );\r\r
+BEGIN\r\r
+   COLAORD_Almac_Inicializar( l.almac );\r\r
+   l.primero := COLAORD_Nulo;\r\r
+END;\r\r
+\r\r
+FUNCTION COLAORD_vacia( l: COLAORD_Cola): BOOLEAN;\r\r
+BEGIN\r\r
+       COLAORD_vacia := ( l.Primero = COLAORD_Nulo);\r\r
+END;\r\r
+\r\r
+FUNCTION COLAORD_llena( l: COLAORD_Cola): BOOLEAN;\r\r
+BEGIN\r\r
+       COLAORD_llena := not COLAORD_Almac_HayLugar( l.almac );\r\r
+END;\r\r
+\r\r
+PROCEDURE COLAORD_poner ( VAR l: COLAORD_Cola; e: Tipo_Elem;  VAR error: boolean);\r\r
+VAR\r\r
+   n : COLAORD_Nodo;\r\r
+   np: COLAORD_Puntero;\r\r
+   npa: COLAORD_Puntero;\r\r
+   na : COLAORD_Nodo;\r\r
+   m : COLAORD_Nodo;\r\r
+   mp : COLAORD_Puntero;\r\r
+BEGIN\r\r
+       error := false;\r\r
+       np := l.primero;\r\r
+       npa := COLAORD_nulo;\r\r
+       WHILE ( np <> COLAORD_Nulo ) AND ( not error )\r\r
+       DO BEGIN\r\r
+               COLAORD_Almac_Acceder( l.almac, np, n );\r\r
+               error := devolver_clave_elem( n.elem ) = devolver_clave_elem( e );\r\r
+               \r\r
+               { como el almacenamiento esta ordenado, corto cuando me pase de clave }\r\r
+               IF devolver_clave_elem( n.elem ) > devolver_clave_elem( e ) THEN break;\r\r
+               { cambio los punteros }\r\r
+               npa := np;\r\r
+               np := n.sig;\r\r
+               na := n;\r\r
+               END;\r\r
+\r\r
+       IF not error\r\r
+       THEN BEGIN\r\r
+               { inserto directamente el elemento }    \r\r
+               m.Elem := e;\r\r
+               m.sig := np;\r\r
+               COLAORD_Almac_Reservar( l.almac, mp );\r\r
+               COLAORD_Almac_Modificar( l.almac, mp, m );\r\r
+               \r\r
+               { toco el anterior o el puntero al primero }\r\r
+               IF npa = COLAORD_Nulo\r\r
+               THEN\r\r
+                       { estoy en el primero }\r\r
+                       l.primero := mp\r\r
+               ELSE BEGIN\r\r
+                       { el siguiente ahora es el nuevo }\r\r
+                       na.sig := mp;\r\r
+                       COLAORD_Almac_Modificar( l.almac, npa, na );\r\r
+                       END;\r\r
+               END;    \r\r
+END;\r\r
+\r\r
+{ pre: no esta vacia }\r\r
+PROCEDURE COLAORD_sacar ( VAR l: COLAORD_Cola; VAR e: Tipo_Elem);\r\r
+VAR n : COLAORD_Nodo;\r\r
+    tmp : COLAORD_Nodo;\r\r
+    tmpp: COLAORD_Puntero;\r\r
+BEGIN\r\r
+   COLAORD_Almac_Acceder( l.almac, l.primero, n );\r\r
+   COLAORD_Almac_Liberar( l.almac, l.primero );\r\r
+   l.primero := n.Sig;\r\r
+\r\r
+   { y se lo asigno al parametro }\r\r
+   e := n.Elem;\r\r
+END;\r\r
+\r\r
+PROCEDURE COLAORD_vaciar ( VAR l: COLAORD_Cola );\r\r
+VAR np : COLAORD_Puntero;\r\r
+    n : COLAORD_Nodo;\r\r
+BEGIN\r\r
+   np := l.primero;\r\r
+   while( np <> COLAORD_Nulo ) do begin\r\r
+      COLAORD_Almac_Acceder( l.almac, np, n );\r\r
+      COLAORD_Almac_Liberar( l.almac, np );\r\r
+      np := n.sig;\r\r
+      end;\r\r
+   l.primero := COLAORD_Nulo;\r\r
+END;\r\r
+\r\r
+{ pre: 'a' y 'b' estan creadas y 'b' esta vacia }\r\r
+{ POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero }\r\r
+PROCEDURE COLAORD_copiar ( a : COLAORD_Cola; VAR b : COLAORD_Cola );\r\r
+VAR np, mp, tmpp : COLAORD_Puntero;\r\r
+    n, m : COLAORD_Nodo;\r\r
+BEGIN\r\r
+   if a.primero = COLAORD_Nulo then exit;\r\r
+   np := a.primero;\r\r
+   COLAORD_Almac_Acceder( a.almac, np, n );\r\r
+\r\r
+   COLAORD_Almac_Reservar( b.almac, mp );\r\r
+   b.primero := mp;\r\r
+   m.elem := n.elem;\r\r
+\r\r
+   while( n.sig <> COLAORD_Nulo ) do begin\r\r
+\r\r
+      COLAORD_Almac_Reservar( b.almac, tmpp );\r\r
+      m.sig := tmpp;\r\r
+      COLAORD_Almac_Modificar( b.almac, mp, m );\r\r
+\r\r
+      np := n.sig;\r\r
+      COLAORD_Almac_Acceder( a.almac, np, n );\r\r
+\r\r
+      mp := tmpp;\r\r
+      m.elem := n.elem;\r\r
+\r\r
+      end;\r\r
+   m.sig := COLAORD_Nulo;\r\r
+   COLAORD_Almac_Modificar( b.almac, mp, m );\r\r
+END;\r\r
+\r\r
+end.\r\r
+\r\r
diff --git a/t_colord_a2.pas b/t_colord_a2.pas
new file mode 100644 (file)
index 0000000..1432bfd
--- /dev/null
@@ -0,0 +1,278 @@
+{ algoritmos y programacion II - Catedra Carolo - PRACTICA }\r\r
+{ PARCIAL 1 1ra Op CUAT 1 2000 }\r\r
+\r\r
+unit T_COLORD_A2;\r\r
+\r\r
+{\r\r
+       IMPLEMENTACION : cola ordenada (cola de prioridades)\r\r
+       ALMACENAMIENTO : CURSORES\r\r
+       CARACTERISTICAS: sacar ordenado\r\r
+       \r\r
+}\r\r
+\r\r
+{ ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular }\r\r
+interface\r\r
+\r\r
+{ usa las funciones generales de TDAs }\r\r
+uses tda_gral;\r\r
+\r\r
+{ maximo tamano del cursor }\r\r
+const COLAORD_MAX_CURSOR = 100;\r\r
+\r\r
+{ tipos propios de la lista para definir el cursor }\r\r
+TYPE\r\r
+       COLAORD_puntero = integer;\r\r
+\r\r
+const\r\r
+   COLAORD_nulo : COLAORD_puntero = 0;\r\r
+\r\r
+type\r\r
+\r\r
+       COLAORD_nodo = RECORD\r\r
+               Elem : Tipo_Elem;\r\r
+               Sig : COLAORD_puntero;\r\r
+       END;\r\r
+\r\r
+\r\r
+   { ahora le toca definir el cursor }\r\r
+   COLAORD_Almac = record\r\r
+      almacenamiento : array [ 1 .. COLAORD_MAX_CURSOR ] of COLAORD_Nodo;\r\r
+      disponibles    : array [ 1 .. COLAORD_MAX_CURSOR ] of COLAORD_Puntero;\r\r
+      primero_dispo  : COLAORD_Puntero;\r\r
+   end;\r\r
+\r\r
+       \r\r
+   COLAORD_Cola = RECORD\r\r
+               almac : COLAORD_Almac;\r\r
+               primero: COLAORD_puntero;\r\r
+       END;\r\r
+\r\r
+\r\r
+{ ========= }\r\r
+{ INTERFASE }\r\r
+\r\r
+\r\r
+PROCEDURE COLAORD_Inicializar ( VAR l: COLAORD_Cola );\r\r
+FUNCTION  COLAORD_vacia( l: COLAORD_Cola): BOOLEAN;\r\r
+FUNCTION  COLAORD_llena( l: COLAORD_Cola): BOOLEAN;\r\r
+\r\r
+PROCEDURE COLAORD_poner ( VAR l: COLAORD_Cola; e: Tipo_Elem; VAR error: boolean);\r\r
+PROCEDURE COLAORD_sacar ( VAR l: COLAORD_Cola; VAR e: Tipo_Elem);\r\r
+PROCEDURE COLAORD_vaciar ( VAR l: COLAORD_Cola );\r\r
+PROCEDURE COLAORD_copiar ( a: COLAORD_Cola; VAR b: COLAORD_Cola );\r\r
+\r\r
+implementation\r\r
+\r\r
+{ CURSORES DE ESTA IMPLEMENTACION }\r\r
+{ ========================================================================== }\r\r
+{  inicializar el almacenamiento }\r\r
+{ PRE : 'almac' no esta inicializado  }\r\r
+{ POST: 'almac' esta inicializado y vacio }\r\r
+procedure COLAORD_Almac_Inicializar( VAR almac : COLAORD_Almac );\r\r
+var i : COLAORD_Puntero;\r\r
+begin\r\r
+   almac.primero_dispo := 1;\r\r
+   for i := 1 to COLAORD_MAX_CURSOR - 1 do\r\r
+   begin\r\r
+      almac.disponibles[i] := i + 1;\r\r
+   end;\r\r
+   almac.disponibles[COLAORD_MAX_CURSOR] := COLAORD_Nulo;\r\r
+end;\r\r
+\r\r
+{ ========================================================================== }\r\r
+{  saber si hay lugar para reservar un nuevo elemento en el almacenamiento }\r\r
+{ PRE : 'almac' esta inicializado  }\r\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r\r
+            entonces retorna TRUE y sino FALSE }\r\r
+function COLAORD_Almac_HayLugar( almac : COLAORD_Almac ): boolean;\r\r
+begin\r\r
+   COLAORD_Almac_HayLugar := almac.primero_dispo <> COLAORD_Nulo;\r\r
+end;\r\r
+\r\r
+{ ========================================================================== }\r\r
+{  el pedido de un nuevo elemento al almacenamiento }\r\r
+{ PRE : 'almac' esta inicializado  }\r\r
+{ POST: si hay lugar en 'almac' para un nuevo elemento,\r\r
+            entonces 'puntero' tiene una referencia a un nuevo elemento del almacenamiento\r\r
+            sino 'puntero' tiene el valor TTDA_Nulo }\r\r
+procedure COLAORD_Almac_Reservar( VAR almac : COLAORD_Almac; VAR puntero : COLAORD_Puntero );\r\r
+begin\r\r
+   if not COLAORD_Almac_HayLugar( almac )\r\r
+   then\r\r
+      puntero := COLAORD_Nulo\r\r
+   else begin\r\r
+      puntero := almac.primero_dispo;\r\r
+      almac.primero_dispo := almac.disponibles[ puntero ];\r\r
+   end;\r\r
+end;\r\r
+\r\r
+{ ========================================================================== }\r\r
+{  liberar un elemento del almacenamiento }\r\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r\r
+{ POST: 'almac' libero el nodo apuntado por 'puntero' y 'puntero' vale TTDA_Nulo }\r\r
+procedure COLAORD_Almac_Liberar( VAR almac : COLAORD_Almac; VAR puntero : COLAORD_Puntero );\r\r
+begin\r\r
+   almac.disponibles[ puntero ] := almac.primero_dispo;\r\r
+   almac.primero_dispo := puntero;\r\r
+   puntero := COLAORD_Nulo;\r\r
+end;\r\r
+\r\r
+{ ========================================================================== }\r\r
+{  acceder al elemento del almacenamiento apuntado por un puntero }\r\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento  }\r\r
+{ POST: 'elemento' tiene una copia del elemento apuntado por 'puntero' }\r\r
+procedure COLAORD_Almac_Acceder( almac : COLAORD_Almac; puntero : COLAORD_Puntero; VAR elemento : COLAORD_Nodo );\r\r
+begin\r\r
+   elemento := almac.almacenamiento[ puntero ];\r\r
+end;\r\r
+\r\r
+{ ========================================================================== }\r\r
+{  modificar el elemento del almacenamiento apuntado por un puntero }\r\r
+{ PRE : 'almac' esta inicializado y 'puntero' fue pedido al almacenamiento }\r\r
+{ POST: el elemento de 'almac' apuntado por 'puntero' tiene una copia de 'elemento' }\r\r
+procedure COLAORD_Almac_Modificar( VAR almac : COLAORD_Almac; puntero : COLAORD_Puntero; elemento : COLAORD_Nodo );\r\r
+begin\r\r
+   almac.almacenamiento[ puntero ] := elemento;\r\r
+end;\r\r
+\r\r
+\r\r
+\r\r
+{ Estas son los dos procedimientos principales de la aplicación }\r\r
+\r\r
+PROCEDURE COLAORD_Inicializar ( VAR l: COLAORD_Cola );\r\r
+BEGIN\r\r
+   COLAORD_Almac_Inicializar( l.almac );\r\r
+   l.primero := COLAORD_Nulo;\r\r
+END;\r\r
+\r\r
+FUNCTION COLAORD_vacia( l: COLAORD_Cola): BOOLEAN;\r\r
+BEGIN\r\r
+       COLAORD_vacia := ( l.Primero = COLAORD_Nulo);\r\r
+END;\r\r
+\r\r
+FUNCTION COLAORD_llena( l: COLAORD_Cola): BOOLEAN;\r\r
+BEGIN\r\r
+       COLAORD_llena := not COLAORD_Almac_HayLugar( l.almac );\r\r
+END;\r\r
+\r\r
+PROCEDURE COLAORD_poner ( VAR l: COLAORD_Cola; e: Tipo_Elem;  VAR error: boolean);\r\r
+VAR\r\r
+   n : COLAORD_Nodo;\r\r
+   np: COLAORD_Puntero;\r\r
+   m : COLAORD_Nodo;\r\r
+   mp : COLAORD_Puntero;\r\r
+BEGIN\r\r
+       error := false;\r\r
+       np := l.primero;\r\r
+       WHILE ( np <> COLAORD_Nulo ) AND ( not error )\r\r
+       DO BEGIN\r\r
+               COLAORD_Almac_Acceder( l.almac, np, n );\r\r
+               error := devolver_clave_elem( n.elem ) = devolver_clave_elem( e );\r\r
+               \r\r
+               { cambio los punteros }\r\r
+               np := n.sig;\r\r
+               END;\r\r
+\r\r
+       IF not error\r\r
+       THEN BEGIN\r\r
+               { inserto como en una pila, adelante }  \r\r
+               m.Elem := e;\r\r
+               m.sig := l.primero;\r\r
+               COLAORD_Almac_Reservar( l.almac, mp );\r\r
+               COLAORD_Almac_Modificar( l.almac, mp, m );\r\r
+               \r\r
+               l.primero := mp;\r\r
+               END;\r\r
+END;\r\r
+\r\r
+{ pre: no esta vacia }\r\r
+PROCEDURE COLAORD_sacar ( VAR l: COLAORD_Cola; VAR e: Tipo_Elem);\r\r
+VAR\r\r
+       n,m  : COLAORD_Nodo;\r\r
+       np, mp, ap, amp: COLAORD_Puntero;\r\r
+BEGIN\r\r
+       mp := l.primero;\r\r
+       COLAORD_Almac_Acceder( l.almac, mp, m ); { este es el primer menor }\r\r
+       amp := COLAORD_Nulo;\r\r
+       np := m.sig; { y salto al siguiente para no hacer la comparacion dos veces }\r\r
+       ap := mp;\r\r
+\r\r
+       { busco el menor }\r\r
+       WHILE np <> COLAORD_Nulo\r\r
+       DO BEGIN\r\r
+               COLAORD_Almac_Acceder( l.almac, np, n );\r\r
+               IF devolver_clave_elem( n.elem ) < devolver_clave_elem( m.elem )\r\r
+               THEN BEGIN\r\r
+                       m := n;\r\r
+                       mp := np;\r\r
+                       amp :=  ap;\r\r
+                       END;\r\r
+               \r\r
+               { cambio los punteros }\r\r
+               ap := np;\r\r
+               np := n.sig;\r\r
+               END;\r\r
+\r\r
+       IF l.primero = mp THEN BEGIN\r\r
+               { como estoy tocando el primero el primero es su siguiente }\r\r
+               l.primero := m.sig;\r\r
+               END\r\r
+       ELSE BEGIN\r\r
+               COLAORD_Almac_Acceder( l.almac, amp, n );\r\r
+      n.sig := m.sig;\r\r
+               COLAORD_Almac_Modificar( l.almac, amp, n );\r\r
+               END;\r\r
+\r\r
+       { libero el nodo del menor }\r\r
+       COLAORD_Almac_Liberar( l.almac, mp );\r\r
+\r\r
+   { y se lo asigno al parametro }\r\r
+   e := m.Elem;\r\r
+END;\r\r
+\r\r
+PROCEDURE COLAORD_vaciar ( VAR l: COLAORD_Cola );\r\r
+VAR np : COLAORD_Puntero;\r\r
+    n : COLAORD_Nodo;\r\r
+BEGIN\r\r
+   np := l.primero;\r\r
+   while( np <> COLAORD_Nulo ) do begin\r\r
+      COLAORD_Almac_Acceder( l.almac, np, n );\r\r
+      COLAORD_Almac_Liberar( l.almac, np );\r\r
+      np := n.sig;\r\r
+      end;\r\r
+   l.primero := COLAORD_Nulo;\r\r
+END;\r\r
+\r\r
+{ pre: 'a' y 'b' estan creadas y 'b' esta vacia }\r\r
+{ POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero }\r\r
+PROCEDURE COLAORD_copiar ( a : COLAORD_Cola; VAR b : COLAORD_Cola );\r\r
+VAR np, mp, tmpp : COLAORD_Puntero;\r\r
+    n, m : COLAORD_Nodo;\r\r
+BEGIN\r\r
+   if a.primero = COLAORD_Nulo then exit;\r\r
+   np := a.primero;\r\r
+   COLAORD_Almac_Acceder( a.almac, np, n );\r\r
+\r\r
+   COLAORD_Almac_Reservar( b.almac, mp );\r\r
+   b.primero := mp;\r\r
+   m.elem := n.elem;\r\r
+\r\r
+   while( n.sig <> COLAORD_Nulo ) do begin\r\r
+\r\r
+      COLAORD_Almac_Reservar( b.almac, tmpp );\r\r
+      m.sig := tmpp;\r\r
+      COLAORD_Almac_Modificar( b.almac, mp, m );\r\r
+\r\r
+      np := n.sig;\r\r
+      COLAORD_Almac_Acceder( a.almac, np, n );\r\r
+\r\r
+      mp := tmpp;\r\r
+      m.elem := n.elem;\r\r
+\r\r
+      end;\r\r
+   m.sig := COLAORD_Nulo;\r\r
+   COLAORD_Almac_Modificar( b.almac, mp, m );\r\r
+END;\r\r
+\r\r
+end.\r\r
+\r\r
diff --git a/t_colord_b1.pas b/t_colord_b1.pas
new file mode 100644 (file)
index 0000000..e8dbdb8
--- /dev/null
@@ -0,0 +1,135 @@
+{ algoritmos y programacion II - Catedra Carolo - PRACTICA }\r\r
+{ PARCIAL 1 1ra Op CUAT 1 2000 }\r\r
+\r\r
+unit T_COLORD_B1;\r\r
+\r\r
+{\r\r
+       IMPLEMENTACION : cola ordenada (cola de prioridades)\r\r
+       ALMACENAMIENTO : LISTAS\r\r
+       CARACTERISTICAS: poner ordenado\r\r
+       \r\r
+}\r\r
+\r\r
+{ ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular }\r\r
+interface\r\r
+\r\r
+{ usa las funciones generales de TDAs }\r\r
+uses tda_gral, T_LDC;\r\r
+\r\r
+TYPE\r\r
+\r\r
+   COLAORD_Cola = RECORD\r\r
+               almac : LDC_Lista;\r\r
+       END;\r\r
+\r\r
+\r\r
+{ ========= }\r\r
+{ INTERFASE }\r\r
+\r\r
+\r\r
+PROCEDURE COLAORD_Inicializar ( VAR l: COLAORD_Cola );\r\r
+FUNCTION  COLAORD_vacia( l: COLAORD_Cola): BOOLEAN;\r\r
+FUNCTION  COLAORD_llena( l: COLAORD_Cola): BOOLEAN;\r\r
+\r\r
+PROCEDURE COLAORD_poner ( VAR l: COLAORD_Cola; e: Tipo_Elem; VAR error: boolean);\r\r
+PROCEDURE COLAORD_sacar ( VAR l: COLAORD_Cola; VAR e: Tipo_Elem);\r\r
+PROCEDURE COLAORD_vaciar ( VAR l: COLAORD_Cola );\r\r
+PROCEDURE COLAORD_copiar ( a: COLAORD_Cola; VAR b: COLAORD_Cola );\r\r
+\r\r
+implementation\r\r
+\r\r
+{ Estas son los dos procedimientos principales de la aplicación }\r\r
+\r\r
+PROCEDURE COLAORD_Inicializar ( VAR l: COLAORD_Cola );\r\r
+BEGIN\r\r
+   LDC_Inicializar( l.almac );\r\r
+END;\r\r
+\r\r
+FUNCTION COLAORD_vacia( l: COLAORD_Cola): BOOLEAN;\r\r
+BEGIN\r\r
+       COLAORD_vacia := ( LDC_Vacia( l.almac ));\r\r
+END;\r\r
+\r\r
+FUNCTION COLAORD_llena( l: COLAORD_Cola): BOOLEAN;\r\r
+BEGIN\r\r
+       COLAORD_llena := LDC_llena( l.almac );\r\r
+END;\r\r
+\r\r
+PROCEDURE COLAORD_poner ( VAR l: COLAORD_Cola; e: Tipo_Elem;  VAR error: boolean);\r\r
+VAR\r\r
+       error_mov : boolean;\r\r
+       found : boolean;\r\r
+       rep: Tipo_elem;\r\r
+       cte: Tipo_elem;\r\r
+       ant: Tipo_elem;\r\r
+BEGIN\r\r
+       error := false;\r\r
+       IF LDC_Vacia( l.almac ) THEN\r\r
+               LDC_insertar( l.almac, LDC_primero, e )\r\r
+       ELSE BEGIN\r\r
+               { recorro para ver si esta duplicado y buscar donde insertarlo }\r\r
+               LDC_mover_cte( l.almac, LDC_primero, error_mov );\r\r
+               LDC_elem_cte( l.almac, cte );\r\r
+               IF devolver_clave_elem( cte ) > devolver_clave_elem( e )\r\r
+               THEN LDC_insertar( l.almac, LDC_primero, e )\r\r
+               ELSE IF devolver_clave_elem( cte ) = devolver_clave_elem( e )\r\r
+               THEN error := true\r\r
+               ELSE BEGIN\r\r
+                       ant := cte;\r\r
+                       LDC_mover_cte( l.almac, LDC_siguiente, error_mov );\r\r
+                       WHILE ( not error ) AND ( not error_mov ) DO BEGIN\r\r
+                               LDC_elem_cte( l.almac, cte );\r\r
+                               IF devolver_clave_elem( cte ) > devolver_clave_elem( e )\r\r
+                               THEN error_mov := true\r\r
+                               ELSE IF devolver_clave_elem( cte ) = devolver_clave_elem( e )\r\r
+                               THEN error := true\r\r
+                               ELSE BEGIN\r\r
+                                       LDC_mover_cte( l.almac, LDC_siguiente, error_mov );\r\r
+                                       ant := cte;\r\r
+                                       END;\r\r
+                               END;\r\r
+\r\r
+                       IF not error\r\r
+                       THEN BEGIN\r\r
+                               LDC_mover_cte( l.almac, LDC_primero, error_mov );\r\r
+                               WHILE not error_mov DO BEGIN\r\r
+                                       LDC_elem_cte( l.almac, cte );\r\r
+                                       IF devolver_clave_elem( cte ) = devolver_clave_elem( ant )\r\r
+                                       THEN BEGIN\r\r
+                                               LDC_insertar( l.almac, LDC_siguiente, e );\r\r
+                                               error_mov := true;\r\r
+                                               END\r\r
+                                       ELSE\r\r
+                                               LDC_mover_cte( l.almac, LDC_siguiente, error_mov );\r\r
+                               END;\r\r
+                       END;\r\r
+               END;\r\r
+       END\r\r
+\r\r
+\r\r
+END;\r\r
+\r\r
+{ pre: no esta vacia }\r\r
+PROCEDURE COLAORD_sacar ( VAR l: COLAORD_Cola; VAR e: Tipo_Elem);\r\r
+VAR\r\r
+       error : boolean;\r\r
+BEGIN\r\r
+       LDC_mover_cte( l.almac, LDC_primero, error );\r\r
+       LDC_elem_cte( l.almac, e );\r\r
+       LDC_borrar_cte( l.almac );\r\r
+END;\r\r
+\r\r
+PROCEDURE COLAORD_vaciar ( VAR l: COLAORD_Cola );\r\r
+BEGIN\r\r
+       LDC_Vaciar( l.almac );\r\r
+END;\r\r
+\r\r
+{ pre: 'a' y 'b' estan creadas y 'b' esta vacia }\r\r
+{ POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero }\r\r
+PROCEDURE COLAORD_copiar ( a : COLAORD_Cola; VAR b : COLAORD_Cola );\r\r
+BEGIN\r\r
+       LDC_Copiar( a.almac, b.almac );\r\r
+END;\r\r
+\r\r
+end.\r\r
+\r\r
diff --git a/t_colord_b2.pas b/t_colord_b2.pas
new file mode 100644 (file)
index 0000000..1ffd7d8
--- /dev/null
@@ -0,0 +1,130 @@
+{ algoritmos y programacion II - Catedra Carolo - PRACTICA }\r\r
+{ PARCIAL 1 1ra Op CUAT 1 2000 }\r\r
+\r\r
+unit T_COLORD_B2;\r\r
+\r\r
+{\r\r
+       IMPLEMENTACION : cola ordenada (cola de prioridades)\r\r
+       ALMACENAMIENTO : LISTAS\r\r
+       CARACTERISTICAS: sacar ordenado\r\r
+       \r\r
+}\r\r
+\r\r
+{ ACLARACIONES : implementamos tambien aca los cursores porque son para estos nodos en particular }\r\r
+interface\r\r
+\r\r
+{ usa las funciones generales de TDAs }\r\r
+uses tda_gral, T_LDC;\r\r
+\r\r
+TYPE\r\r
+\r\r
+   COLAORD_Cola = RECORD\r\r
+               almac : LDC_Lista;\r\r
+       END;\r\r
+\r\r
+\r\r
+{ ========= }\r\r
+{ INTERFASE }\r\r
+\r\r
+\r\r
+PROCEDURE COLAORD_Inicializar ( VAR l: COLAORD_Cola );\r\r
+FUNCTION  COLAORD_vacia( l: COLAORD_Cola): BOOLEAN;\r\r
+FUNCTION  COLAORD_llena( l: COLAORD_Cola): BOOLEAN;\r\r
+\r\r
+PROCEDURE COLAORD_poner ( VAR l: COLAORD_Cola; e: Tipo_Elem; VAR error: boolean);\r\r
+PROCEDURE COLAORD_sacar ( VAR l: COLAORD_Cola; VAR e: Tipo_Elem);\r\r
+PROCEDURE COLAORD_vaciar ( VAR l: COLAORD_Cola );\r\r
+PROCEDURE COLAORD_copiar ( a: COLAORD_Cola; VAR b: COLAORD_Cola );\r\r
+\r\r
+implementation\r\r
+\r\r
+{ Estas son los dos procedimientos principales de la aplicación }\r\r
+\r\r
+PROCEDURE COLAORD_Inicializar ( VAR l: COLAORD_Cola );\r\r
+BEGIN\r\r
+   LDC_Inicializar( l.almac );\r\r
+END;\r\r
+\r\r
+FUNCTION COLAORD_vacia( l: COLAORD_Cola): BOOLEAN;\r\r
+BEGIN\r\r
+       COLAORD_vacia := ( LDC_Vacia( l.almac ));\r\r
+END;\r\r
+\r\r
+FUNCTION COLAORD_llena( l: COLAORD_Cola): BOOLEAN;\r\r
+BEGIN\r\r
+       COLAORD_llena := LDC_llena( l.almac );\r\r
+END;\r\r
+\r\r
+PROCEDURE COLAORD_poner ( VAR l: COLAORD_Cola; e: Tipo_Elem;  VAR error: boolean);\r\r
+VAR\r\r
+       error_mov : boolean;\r\r
+       rep: Tipo_elem;\r\r
+BEGIN\r\r
+       error := false;\r\r
+       IF not LDC_Vacia( l.almac ) THEN BEGIN\r\r
+               { recorro para ver si esta duplicado }\r\r
+               LDC_mover_cte( l.almac, LDC_primero, error_mov );\r\r
+               WHILE ( not error ) AND ( not error_mov ) DO BEGIN\r\r
+                       LDC_elem_cte( l.almac, rep );\r\r
+                       error := devolver_clave_elem( rep ) = devolver_clave_elem( e );\r\r
+       \r\r
+                       IF not error THEN\r\r
+                               LDC_mover_cte( l.almac, LDC_siguiente, error_mov );\r\r
+                       END;\r\r
+               END;\r\r
+\r\r
+       IF not error THEN\r\r
+               { si no esta repetido lo inserto }\r\r
+               LDC_insertar( l.almac, LDC_primero, e );\r\r
+END;\r\r
+\r\r
+{ pre: no esta vacia }\r\r
+PROCEDURE COLAORD_sacar ( VAR l: COLAORD_Cola; VAR e: Tipo_Elem);\r\r
+VAR\r\r
+       error : boolean;\r\r
+       menor : Tipo_Elem;\r\r
+       cte : Tipo_Elem;\r\r
+BEGIN\r\r
+       LDC_mover_cte( l.almac, LDC_primero, error );\r\r
+       LDC_elem_cte( l.almac, menor );\r\r
+       LDC_mover_cte( l.almac, LDC_siguiente, error );\r\r
+\r\r
+       { recorro buscando }\r\r
+       WHILE not error DO BEGIN\r\r
+               LDC_elem_cte( l.almac, cte );\r\r
+               IF devolver_clave_elem( cte ) < devolver_clave_elem( menor ) THEN menor := cte;\r\r
+\r\r
+               LDC_mover_cte( l.almac, LDC_siguiente, error );\r\r
+\r\r
+               END;\r\r
+       writeln( 'el menor es ', menor.dni );\r\r
+       \r\r
+       { aqui ya tenemos el ultimo }\r\r
+       LDC_mover_cte( l.almac, LDC_primero, error );\r\r
+       WHILE not error DO BEGIN\r\r
+               LDC_elem_cte( l.almac, cte );\r\r
+               IF devolver_clave_elem( cte ) <> devolver_clave_elem( menor )\r\r
+               THEN LDC_mover_cte( l.almac, LDC_siguiente, error )\r\r
+               ELSE error := true;\r\r
+               writeln( 'siguiendo es ', cte.dni );\r\r
+               END;\r\r
+\r\r
+       LDC_elem_cte( l.almac, e );\r\r
+       writeln( 'borrado es ', e.dni );\r\r
+       LDC_borrar_cte( l.almac );\r\r
+END;\r\r
+\r\r
+PROCEDURE COLAORD_vaciar ( VAR l: COLAORD_Cola );\r\r
+BEGIN\r\r
+       LDC_Vaciar( l.almac );\r\r
+END;\r\r
+\r\r
+{ pre: 'a' y 'b' estan creadas y 'b' esta vacia }\r\r
+{ POST: 'b' tiene una copia de los elementos de 'a' y el corriente esta en el primero }\r\r
+PROCEDURE COLAORD_copiar ( a : COLAORD_Cola; VAR b : COLAORD_Cola );\r\r
+BEGIN\r\r
+       LDC_Copiar( a.almac, b.almac );\r\r
+END;\r\r
+\r\r
+end.\r\r
+\r\r