1 program TrabajoPracticoII;
\r
4 ALGORITMOS Y PROGRAMACIÓN II
\r
5 ========== = ============ ==
\r
7 TRABAJO PRÁCTICO NÚMERO 2
\r
8 ~~~~~~~ ~~~~~~~~ ~~~~~~ ~
\r
13 1er Cuatrimestre 2000
\r
14 --- ------------ ----
\r
19 NOTA: Como se manejan tipos de datos que pueden ser estructuras muy grandes, a veces
\r
20 se pasan variables a los procedimientos por referencia (con 'var') sin ser esto
\r
21 necesario, pero de esta manera se evita copiar grandes estructuras varias veces
\r
22 (en especial en algunos procedimientos recursivos).
\r
25 {$M 65520, 0, 655360} { evita errores de Stack Overflow }
\r
28 PROG_GRL, GRAL, TABLA, PILA_C, ABO_AB, ABO_UTIL;
\r
31 {----------------------------------------------------------------------------}
\r
32 {- Procedimiento: Procesa archivo de comandos de tabla
\r
33 {----------------------------------------------------------------------------}
\r
34 procedure procesarComandosTabla( var fo: text; var fi: T_ARCHIVO_COMANDOS_TABLA;
\r
47 { Lectura de datos hasta EOF }
\r
49 while ( not eof( fi ) ) do begin
\r
51 cmd := strToComando( c.comando );
\r
52 agregaComandoTbl( fo, c );
\r
54 { Ejecuta segun tipo comando }
\r
60 r.nombre:= c.nombre;
\r
61 if ( T_TABLA_Llena( t ) ) then
\r
62 agregaError( fo, comandoToStr( cmd ), 'Tabla Llena!' )
\r
64 m := strToMovim( c.Movimiento, err );
\r
66 agregaError( fo, comandoToStr( cmd ), 'Movimiento NO valido ("' + movimToStr( m ) + '")!' )
\r
68 T_TABLA_Insertar( t, m, r );
\r
69 agregaRegistro( fo, comandoToStr( cmd ), r );
\r
74 { Insersion Ordenada }
\r
77 r.nombre:= c.nombre;
\r
78 if ( T_TABLA_Llena( t ) ) then
\r
79 agregaError( fo, comandoToStr( cmd ), 'Tabla Llena!' )
\r
80 else if ( not T_TABLA_Ordenada( t ) ) then
\r
81 agregaError( fo, comandoToStr( cmd ), 'Tabla Desordenada!' )
\r
83 T_TABLA_Insertar_Ord( t, r );
\r
84 agregaRegistro( fo, comandoToStr( cmd ), r );
\r
90 if ( T_TABLA_Vacia( t ) ) then
\r
91 agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )
\r
93 T_TABLA_Ordenar( t );
\r
98 if ( T_TABLA_Vacia( t ) ) then
\r
99 agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )
\r
100 else if ( not T_TABLA_Ordenada( t ) ) then
\r
101 agregaError( fo, comandoToStr( cmd ), 'Tabla Desordenada!' )
\r
103 T_TABLA_Buscar_Clave( t, r.dni, err );
\r
105 agregaError( fo, comandoToStr( cmd ), 'No se encontro la clave "' + c.dni + '"!' )
\r
107 T_TABLA_Elem_Cte( t, r );
\r
108 agregaRegistro( fo, comandoToStr( cmd ), r );
\r
116 dni := c.dni_hasta;
\r
117 if ( T_TABLA_Vacia( t ) ) then
\r
118 agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )
\r
119 else if ( not T_TABLA_Ordenada( t ) ) then
\r
120 agregaError( fo, comandoToStr( cmd ), 'Tabla Desordenada!' )
\r
122 T_TABLA_Buscar_por_Rango( t, r.dni, dni, p, err );
\r
124 agregaError( fo, comandoToStr( cmd ),
\r
125 'No se encontro ninguna clave "' + c.dni + '-' + c.dni_hasta + '"!' )
\r
127 while ( not PILAC_vacio( p ) ) do begin
\r
128 PILAC_sacar( p, r );
\r
129 agregaRegistro( fo, comandoToStr( cmd ), r );
\r
137 if ( T_TABLA_Vacia( t ) ) then
\r
138 agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )
\r
140 T_TABLA_Mover_Cte( t, T_MOVIM_primero, err );
\r
142 while ( not err ) do begin
\r
143 T_TABLA_Elem_Cte( t, r );
\r
144 agregaRegistro( fo, comandoToStr( cmd ), r );
\r
145 T_TABLA_Mover_Cte( t, T_MOVIM_siguiente, err );
\r
150 { Listar Corriente }
\r
152 if ( T_TABLA_Vacia( t ) ) then
\r
153 agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )
\r
155 T_TABLA_Elem_Cte( t, r );
\r
156 agregaRegistro( fo, comandoToStr( cmd ), r );
\r
160 { Borrar Corriente }
\r
162 if ( T_TABLA_Vacia( t ) ) then
\r
163 agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )
\r
165 T_TABLA_Elem_Cte( t, r );
\r
166 T_TABLA_Borrar_Cte( t );
\r
167 agregaRegistro( fo, comandoToStr( cmd ), r );
\r
171 { Modificar Corriente }
\r
174 if ( T_TABLA_Vacia( t ) ) then
\r
175 agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )
\r
177 T_TABLA_Elem_Cte( t, r );
\r
178 agregaRegistro( fo, comandoToStr( cmd ), r );
\r
179 r.nombre:= c.nombre;
\r
180 T_TABLA_Modif_Cte( t, r );
\r
181 agregaRegistro( fo, comandoToStr( cmd ), r );
\r
187 T_TABLA_Limpiar( t );
\r
189 { Comando Desconocido }
\r
191 agregaError( fo, comandoToStr( cmd ), 'Comando Desconocido!' )
\r
193 end; { case ( cmd ) of }
\r
194 end; { while ( not eof( fEnt ) ) do begin }
\r
196 {------------------------------------------------------------------}
\r
197 { FIN DEL PROCEDIMIENTO DE PROCESO DE ARCHIVO DE COMANDOS DE TABLA }
\r
198 {------------------------------------------------------------------}
\r
201 {----------------------------------------------------------------------------}
\r
202 {- Procedimiento: Procesa archivo de comandos de ABO
\r
203 {----------------------------------------------------------------------------}
\r
204 procedure procesarComandosABO( var fo: text; var fi: T_ARCHIVO_COMANDOS_ABO;
\r
205 var a: ABO_ARBOL );
\r
216 { Lectura de datos hasta EOF }
\r
217 while ( not eof( fi ) ) do begin
\r
219 cmd := strToComando( c.comando );
\r
220 agregaComandoABO( fo, c );
\r
222 { Ejecuta segun tipo comando }
\r
225 { Insersion Ordenada }
\r
228 r.nombre:= c.nombre;
\r
229 ABO_insertar( a, r, er );
\r
231 agregaError( fo, comandoToStr( cmd ), 'Ya exite la clave!' )
\r
233 agregaRegistro( fo, comandoToStr( cmd ), r );
\r
236 { Buscar Clave (si el dni es '*' entonces lista el elemento corriente }
\r
238 if ( ABO_vacio( a ) ) then
\r
239 agregaError( fo, comandoToStr( cmd ), 'Arbol Vacio!' )
\r
242 if ( c.dni <> '*' ) then
\r
243 ABO_buscar( a, c.dni, er );
\r
245 agregaError( fo, comandoToStr( cmd ), 'No se encontro la clave "' + c.dni + '"!' )
\r
247 ABO_elem_cte( a, r );
\r
248 agregaRegistro( fo, comandoToStr( cmd ), r );
\r
253 { Borrar Corriente }
\r
255 if ( ABO_vacio( a ) ) then
\r
256 agregaError( fo, comandoToStr( cmd ), 'Arbol Vacio!' )
\r
258 ABO_elem_cte( a, r );
\r
259 ABO_borrar_cte( a );
\r
260 agregaRegistro( fo, comandoToStr( cmd ), r );
\r
264 { Modificar Corriente }
\r
266 if ( ABO_vacio( a ) ) then
\r
267 agregaError( fo, comandoToStr( cmd ), 'Arbol Vacio!' )
\r
269 ABO_elem_cte( a, r );
\r
270 agregaRegistro( fo, comandoToStr( cmd ), r );
\r
272 r.nombre := c.nombre;
\r
273 ABO_modif_cte( a, r, er );
\r
275 agregaError( fo, comandoToStr( cmd ), 'Ya exite la clave!' )
\r
277 agregaRegistro( fo, comandoToStr( cmd ), r );
\r
285 { Comando Desconocido }
\r
287 agregaError( fo, comandoToStr( cmd ), 'Comando Desconocido!' )
\r
289 end; { case ( cmd ) of }
\r
290 end; { while ( not eof( fEnt ) ) do begin }
\r
292 {------------------------------------------------------------------}
\r
293 { FIN DEL PROCEDIMIENTO DE PROCESO DE ARCHIVO DE COMANDOS DEL ABO }
\r
294 {------------------------------------------------------------------}
\r
297 {----------------------------------------------------------------------------}
\r
298 {- Procedimiento: Lista el arbol de forma ordenada (IN-ORDER).
\r
299 {----------------------------------------------------------------------------}
\r
301 PROCEDURE listarABOInOrder( var f: text; var a: ABO_ARBOL );
\r
302 PROCEDURE listar_rec( var a: ABO_ARBOL );
\r
309 { Proceso el subarbol izquierdo }
\r
310 ABO_mover_cte( a, ABO_izquierda, er );
\r
311 if ( not er ) then begin
\r
313 ABO_mover_cte( a, ABO_padre, er );
\r
315 { Imprimo el elemento actual }
\r
316 ABO_elem_cte( a, r );
\r
317 agregaRegistro( f, 'ABO', r );
\r
318 { Proceso el subarbol derecho }
\r
319 ABO_mover_cte( a, ABO_derecha, er );
\r
320 if ( not er ) then begin
\r
322 ABO_mover_cte( a, ABO_padre, er );
\r
331 writeln( f, 'Listando el arbol IN-ORDER...' );
\r
333 ABO_mover_cte( a, ABO_raiz, er );
\r
337 {------------------------------------------------------------------}
\r
338 { FIN DEL PROCEDIMIENTO PARA LISTAR EL ABO IN-ORDER }
\r
339 {------------------------------------------------------------------}
\r
345 fEntT: T_ARCHIVO_COMANDOS_TABLA;
\r
346 fEntA: T_ARCHIVO_COMANDOS_ABO;
\r
350 c: T_COMANDO_TABLA;
\r
361 mensajeDeEntrada( 'Programa principal.' );
\r
362 procesarParametros( fEntT, fEntA, fSal, err );
\r
363 if ( err ) then begin
\r
365 exit; { ----------------------------------> SALE DEL PROGRAMA!!!! }
\r
367 { Inicializacion de TADs }
\r
368 T_TABLA_Crear( tbl );
\r
369 PILAC_Inicializar( p );
\r
371 { PROCESO DEL ARCHIVO DE COMANDOS DE LA TABLA PARA }
\r
372 { CREAR LOS ELEMENTO DE ESTA }
\r
373 procesarComandosTabla( fSal, fEntT, tbl );
\r
374 { AHORA SE INGRESAN LOS DATOS DE LA TABLA A EL ABO }
\r
375 { (Puntos A y B de la parte 4) }
\r
377 writeln( fSal, 'Procesando los datos de la tabla en un ABO...' );
\r
379 if ( not T_TABLA_vacia( tbl ) ) then begin
\r
380 { Recorro la tabla agregando los elemento al ABO }
\r
381 T_TABLA_mover_cte( tbl, T_MOVIM_primero, err );
\r
382 while ( not err ) do begin
\r
383 T_TABLA_elem_cte( tbl, r );
\r
384 ABO_insertar( abo, r, er );
\r
386 agregaError( fSal, 'ABO_insertar', 'El elemento ya existe en el ABO' );
\r
387 T_TABLA_mover_cte( tbl, T_MOVIM_siguiente, err );
\r
389 { Busco por rango y listo la pila devuelta }
\r
390 ABO_UTIL_buscar_por_rango( abo, '00000001', '99999999', p );
\r
391 mostrarPila( fSal, p );
\r
394 agregaError( fSal, 'T_TABLA', 'Tabla vacia' );
\r
395 { AHORA PROCESA EL ARCHIVO DE COMANDOS DEL ABO }
\r
396 { (Punto C de la parte 4) }
\r
397 procesarComandosABO( fSal, fEntA, abo );
\r
398 { AHORA SE LLAMA AL PROCEDIMIENTO BUSCAR_POR_RANGO }
\r
399 { Punto D de la parte 4 }
\r
400 if ( not ABO_vacio( abo ) ) then begin
\r
401 ABO_UTIL_buscar_por_rango( abo, '10000000', '30000000', p );
\r
403 writeln( fSal, 'Listando los resultados de la busqueda (desde 10000000 hasta 30000000) ...' );
\r
405 mostrarPila( fSal, p );
\r
408 agregaError( fSal, 'ABO', 'ABO vacio. No se puede buscar por rango.' );
\r
409 { POR ULTIMO LISTAMOS EL ARBOL DE FORMA ORDENADA (IN_ORDER) }
\r
410 { Punto E de la parte 4 }
\r
411 listarABOInOrder( fSal, abo );
\r
412 { FINALIZA LOS ARCHIVOS Y CIERRA EL PROGRAMA CON UN MENSAJE }
\r
416 writeln( 'Archivos "', paramstr( 1 ), '" y "', paramstr( 2 ), '" procesados con exito.' );
\r
417 writeln( 'Puede ver la salida y/o errores en el archivo ', paramstr( 3 ) );
\r
418 writeln( 'FIN DEL PROGRAMA' );
\r