--- /dev/null
+{ 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
--- /dev/null
+{ 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
--- /dev/null
+{ 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
--- /dev/null
+{ 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
--- /dev/null
+{ 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