]> git.llucax.com Git - z.facultad/75.41/abo.git/blob - programa.pas
Se expanden keywords del svn.
[z.facultad/75.41/abo.git] / programa.pas
1 program TrabajoPracticoII;\r
2 \r
3 {\r
4          ALGORITMOS Y PROGRAMACIÓN II\r
5          ========== = ============ ==\r
6 \r
7          TRABAJO PRÁCTICO NÚMERO 2\r
8          ~~~~~~~ ~~~~~~~~ ~~~~~~ ~\r
9 \r
10          Catedra: Carolo\r
11          =======\r
12 \r
13          1er Cuatrimestre 2000\r
14          --- ------------ ----\r
15 \r
16          Grupo: 22\r
17          =====\r
18 \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
23 }\r
24 \r
25 {$M 65520, 0, 655360} { evita errores de Stack Overflow }\r
26 \r
27  uses\r
28    PROG_GRL, GRAL, TABLA, PILA_C, ABO_AB, ABO_UTIL;\r
29 \r
30 \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
35                                      var t: T_TABLA );\r
36 \r
37       var\r
38          m:   T_MOVIM;\r
39          c:   T_COMANDO_TABLA;\r
40          cmd: ID_COMANDO;\r
41          r:   T_REGISTRO;\r
42          p:   T_PILAC;\r
43          err: boolean;\r
44          dni: T_CLAVE;\r
45 \r
46       begin\r
47          { Lectura de datos hasta EOF }\r
48          introTabla( fo );\r
49          while ( not eof( fi ) ) do begin\r
50            read( fi, c );\r
51            cmd := strToComando(  c.comando );\r
52            agregaComandoTbl( fo, c );\r
53 \r
54            { Ejecuta segun tipo comando }\r
55            case ( cmd ) of\r
56 \r
57              { Insersion }\r
58              INS: begin\r
59                   r.dni := c.dni;\r
60                   r.nombre:= c.nombre;\r
61                   if ( T_TABLA_Llena( t ) ) then\r
62                     agregaError( fo, comandoToStr( cmd ), 'Tabla Llena!' )\r
63                   else begin\r
64                      m := strToMovim( c.Movimiento, err );\r
65                      if ( err ) then\r
66                         agregaError( fo, comandoToStr( cmd ), 'Movimiento NO valido ("' + movimToStr( m ) + '")!' )\r
67                      else begin\r
68                         T_TABLA_Insertar( t, m, r );\r
69                         agregaRegistro( fo, comandoToStr( cmd ), r );\r
70                      end;\r
71                end;\r
72              end;\r
73 \r
74              { Insersion Ordenada }\r
75              IO: begin\r
76                   r.dni := c.dni;\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
82                   else begin\r
83                      T_TABLA_Insertar_Ord( t, r );\r
84                      agregaRegistro( fo, comandoToStr( cmd ), r );\r
85                   end;\r
86              end;\r
87 \r
88              { Ordenar }\r
89              ORDEN: begin\r
90                if ( T_TABLA_Vacia( t ) ) then\r
91                   agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )\r
92                else\r
93                  T_TABLA_Ordenar( t );\r
94              end;\r
95 \r
96              { Buscar Clave }\r
97              BC:  begin\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
102                else begin\r
103                   T_TABLA_Buscar_Clave( t, r.dni, err );\r
104                   if ( err ) then\r
105                      agregaError( fo, comandoToStr( cmd ), 'No se encontro la clave "' + c.dni + '"!' )\r
106                   else begin\r
107                      T_TABLA_Elem_Cte( t, r );\r
108                      agregaRegistro( fo, comandoToStr( cmd ), r );\r
109                   end;\r
110                end;\r
111              end;\r
112 \r
113              { Buscar Rango }\r
114              BR: begin\r
115                   r.dni := c.dni;\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
121                   else begin\r
122                      T_TABLA_Buscar_por_Rango( t, r.dni, dni, p, err );\r
123                      if ( err ) then\r
124                         agregaError( fo, comandoToStr( cmd ),\r
125                                      'No se encontro ninguna clave "' + c.dni + '-' + c.dni_hasta + '"!' )\r
126                      else begin\r
127                         while ( not PILAC_vacio( p ) ) do begin\r
128                             PILAC_sacar( p, r );\r
129                             agregaRegistro( fo, comandoToStr( cmd ), r );\r
130                             end;\r
131                      end;\r
132                   end;\r
133              end;\r
134 \r
135              { Listar Tabla }\r
136              LS: begin\r
137                if ( T_TABLA_Vacia( t ) ) then\r
138                   agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )\r
139                else begin\r
140                   T_TABLA_Mover_Cte( t, T_MOVIM_primero, err );\r
141                   err:= false;\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
146                   end;\r
147                end;\r
148              end;\r
149 \r
150              { Listar Corriente }\r
151              LC: begin\r
152                if ( T_TABLA_Vacia( t ) ) then\r
153                   agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )\r
154                else begin\r
155                   T_TABLA_Elem_Cte( t, r );\r
156                   agregaRegistro( fo, comandoToStr( cmd ), r );\r
157                end;\r
158              end;\r
159 \r
160              { Borrar Corriente }\r
161              BO: begin\r
162                if ( T_TABLA_Vacia( t ) ) then\r
163                   agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )\r
164                else begin\r
165                   T_TABLA_Elem_Cte( t, r );\r
166                   T_TABLA_Borrar_Cte( t );\r
167                   agregaRegistro( fo, comandoToStr( cmd ), r );\r
168                end;\r
169              end;\r
170 \r
171              { Modificar Corriente }\r
172              MO: begin\r
173                   r.dni := c.dni;\r
174                   if ( T_TABLA_Vacia( t ) ) then\r
175                      agregaError( fo, comandoToStr( cmd ), 'Tabla Vacia!' )\r
176                   else begin\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
182                   end;\r
183              end;\r
184 \r
185              { Limpiar Tabla }\r
186              LI:\r
187                T_TABLA_Limpiar( t );\r
188 \r
189              { Comando Desconocido }\r
190              else\r
191                agregaError( fo, comandoToStr( cmd ), 'Comando Desconocido!' )\r
192 \r
193            end; { case ( cmd ) of }\r
194          end; { while ( not eof( fEnt ) ) do begin }\r
195       end;\r
196     {------------------------------------------------------------------}\r
197     { FIN DEL PROCEDIMIENTO DE PROCESO DE ARCHIVO DE COMANDOS DE TABLA }\r
198     {------------------------------------------------------------------}\r
199 \r
200 \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
206 \r
207       var\r
208          c:   T_COMANDO_ABO;\r
209          cmd: ID_COMANDO;\r
210          r:   T_REGISTRO;\r
211          p:   T_PILAC;\r
212          er:  boolean;\r
213 \r
214       begin\r
215          introABO( fo );\r
216          { Lectura de datos hasta EOF }\r
217          while ( not eof( fi ) ) do begin\r
218            read( fi, c );\r
219            cmd := strToComando(  c.comando );\r
220            agregaComandoABO( fo, c );\r
221 \r
222            { Ejecuta segun tipo comando }\r
223            case ( cmd ) of\r
224 \r
225              { Insersion Ordenada }\r
226              IO: begin\r
227                   r.dni := c.dni;\r
228                   r.nombre:= c.nombre;\r
229                   ABO_insertar( a, r, er );\r
230                   if ( er ) then\r
231                      agregaError( fo, comandoToStr( cmd ), 'Ya exite la clave!' )\r
232                   else\r
233                      agregaRegistro( fo, comandoToStr( cmd ), r );\r
234              end;\r
235 \r
236              { Buscar Clave (si el dni es '*' entonces lista el elemento corriente }\r
237              BC:  begin\r
238                if ( ABO_vacio( a ) ) then\r
239                   agregaError( fo, comandoToStr( cmd ), 'Arbol Vacio!' )\r
240                else begin\r
241                   er := false;\r
242                   if ( c.dni <> '*' ) then\r
243                      ABO_buscar( a, c.dni, er );\r
244                   if ( er ) then\r
245                      agregaError( fo, comandoToStr( cmd ), 'No se encontro la clave "' + c.dni + '"!' )\r
246                   else begin\r
247                      ABO_elem_cte( a, r );\r
248                      agregaRegistro( fo, comandoToStr( cmd ), r );\r
249                   end;\r
250                end;\r
251              end;\r
252 \r
253              { Borrar Corriente }\r
254              BO: begin\r
255                if ( ABO_vacio( a ) ) then\r
256                   agregaError( fo, comandoToStr( cmd ), 'Arbol Vacio!' )\r
257                else begin\r
258                   ABO_elem_cte( a, r );\r
259                   ABO_borrar_cte( a );\r
260                   agregaRegistro( fo, comandoToStr( cmd ), r );\r
261                end;\r
262              end;\r
263 \r
264              { Modificar Corriente }\r
265              MO: begin\r
266                   if ( ABO_vacio( a ) ) then\r
267                      agregaError( fo, comandoToStr( cmd ), 'Arbol Vacio!' )\r
268                   else begin\r
269                      ABO_elem_cte( a, r );\r
270                      agregaRegistro( fo, comandoToStr( cmd ), r );\r
271                      r.dni := c.dni;\r
272                      r.nombre := c.nombre;\r
273                      ABO_modif_cte( a, r, er );\r
274                      if ( er ) then\r
275                         agregaError( fo, comandoToStr( cmd ), 'Ya exite la clave!' )\r
276                      else\r
277                         agregaRegistro( fo, comandoToStr( cmd ), r );\r
278                   end;\r
279              end;\r
280 \r
281              { Limpiar ABO }\r
282              LI:\r
283                ABO_vaciar( a );\r
284 \r
285              { Comando Desconocido }\r
286              else\r
287                agregaError( fo, comandoToStr( cmd ), 'Comando Desconocido!' )\r
288 \r
289            end; { case ( cmd ) of }\r
290          end; { while ( not eof( fEnt ) ) do begin }\r
291       end;\r
292     {------------------------------------------------------------------}\r
293     { FIN DEL PROCEDIMIENTO DE PROCESO DE ARCHIVO DE COMANDOS DEL ABO  }\r
294     {------------------------------------------------------------------}\r
295 \r
296 \r
297     {----------------------------------------------------------------------------}\r
298     {- Procedimiento: Lista el arbol de forma ordenada (IN-ORDER).\r
299     {----------------------------------------------------------------------------}\r
300 \r
301     PROCEDURE listarABOInOrder( var f: text; var a: ABO_ARBOL );\r
302       PROCEDURE listar_rec( var a: ABO_ARBOL );\r
303        var\r
304          er: boolean;\r
305          c:  T_CLAVE;\r
306          r:  T_REGISTRO;\r
307 \r
308        begin\r
309          { Proceso el subarbol izquierdo }\r
310          ABO_mover_cte( a, ABO_izquierda, er );\r
311          if ( not er ) then begin\r
312             listar_rec( a );\r
313             ABO_mover_cte( a, ABO_padre, er );\r
314          end;\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
321             listar_rec( a );\r
322             ABO_mover_cte( a, ABO_padre, er );\r
323          end;\r
324        end;\r
325 \r
326      var\r
327       er: boolean;\r
328 \r
329      begin\r
330       writeln( f );\r
331       writeln( f, 'Listando el arbol IN-ORDER...' );\r
332       writeln( f );\r
333       ABO_mover_cte( a, ABO_raiz, er );\r
334       if ( not er ) then\r
335          listar_rec( a );\r
336      end;\r
337     {------------------------------------------------------------------}\r
338     { FIN DEL PROCEDIMIENTO PARA LISTAR EL ABO IN-ORDER                }\r
339     {------------------------------------------------------------------}\r
340 \r
341 \r
342 var\r
343    tbl: T_TABLA;\r
344    p: T_PILAC;\r
345    fEntT: T_ARCHIVO_COMANDOS_TABLA;\r
346    fEntA: T_ARCHIVO_COMANDOS_ABO;\r
347    fSal: text;\r
348    id: ID_COMANDO;\r
349    m: T_MOVIM;\r
350    c: T_COMANDO_TABLA;\r
351    r: T_REGISTRO;\r
352    err: boolean;\r
353    er:  boolean;\r
354    cmd: ID_COMANDO;\r
355    valerr: integer;\r
356    s: string;\r
357    dni: T_CLAVE;\r
358    abo: ABO_ARBOL;\r
359 \r
360 begin\r
361    mensajeDeEntrada( 'Programa principal.' );\r
362    procesarParametros( fEntT, fEntA, fSal, err );\r
363    if ( err ) then begin\r
364       errorParametros;\r
365       exit; { ----------------------------------> SALE DEL PROGRAMA!!!! }\r
366       end;{}\r
367    { Inicializacion de TADs }\r
368    T_TABLA_Crear( tbl );\r
369    PILAC_Inicializar( p );\r
370    ABO_crear( abo );\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
376    writeln( fSal );\r
377    writeln( fSal, 'Procesando los datos de la tabla en un ABO...' );\r
378    writeln( fSal );\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
385          if ( er ) then\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
388       end;\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
392       end\r
393    else\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
402       writeln( fSal );\r
403       writeln( fSal, 'Listando los resultados de la busqueda (desde 10000000 hasta 30000000) ...' );\r
404       writeln( fSal );\r
405       mostrarPila( fSal, p );\r
406       end\r
407    else\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
413    close( fSal );\r
414    close( fEntT );\r
415    close( fEntA );\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
419 end.