]> git.llucax.com Git - z.facultad/75.41/material.git/blob - tp_ejemplo/tabla.pas
Se expanden keywords del svn.
[z.facultad/75.41/material.git] / tp_ejemplo / tabla.pas
1 unit tabla;\r
2 \r
3 \r
4 \r
5 {\r
6 \r
7         IMPLEMENTACION : TDA_TABLA\r
8 \r
9 \r
10 }\r
11 {\r
12 POR AHORA COMPILA\r
13 }\r
14 \r
15 interface\r
16 \r
17 uses TDA_GRAL, ldoblec, pila_C;\r
18 \r
19 TYPE\r
20 \r
21     T_MOVIM = LSC_movimiento;\r
22 \r
23     T_CLAVE = Tipo_Clave;\r
24 \r
25     T_REGISTRO = Tipo_Elem;\r
26 \r
27     T_TABLA = record\r
28 \r
29             lista : LSC_Lista_Simple_C; {si bien el nombre dice simple, es una lista doble\r
30                                         no lo cambie aun para evitar mas errores}\r
31             ordenada: boolean;\r
32 \r
33     end; {record}\r
34 \r
35 \r
36 \r
37 Procedure T_TABLA_Crear ( var T: T_TABLA);\r
38 \r
39 Function  T_TABLA_Vacia ( T: T_TABLA ) : boolean;\r
40 \r
41 Function  T_TABLA_Llena ( T: T_TABLA ) : boolean;\r
42 \r
43 Function  T_TABLA_Ordenada ( T: T_TABLA ) : boolean;\r
44 \r
45 Procedure T_TABLA_Elem_Cte ( T: T_TABLA ; var R: T_REGISTRO );\r
46 \r
47 Procedure T_TABLA_Mover_Cte ( var T: T_TABLA ; M: T_MOVIM; var error: boolean );\r
48 \r
49 Procedure T_TABLA_Insertar ( var T: T_TABLA ; var R: T_REGISTRO; M: T_MOVIM );\r
50 \r
51 Procedure T_TABLA_Insertar_O ( var T: T_TABLA ; var R: T_REGISTRO);\r
52 \r
53 Procedure T_TABLA_Limpiar ( var T: T_TABLA );\r
54 \r
55 Procedure T_TABLA_Borrar_Cte ( var T: T_TABLA );\r
56 \r
57 Procedure T_TABLA_Modif_Cte ( var T: T_TABLA ; var R: T_REGISTRO );\r
58 \r
59 Procedure T_TABLA_Ordenar ( var T: T_TABLA );\r
60 \r
61 Procedure T_TABLA_Buscar_Clave ( var T: T_TABLA ; C: T_CLAVE; var error :boolean);\r
62 \r
63 PROCEDURE Buscar_por_Rango(var T: T_TABLA; D, H: T_CLAVE; var L: PILAC_Pila);\r
64 \r
65 {-------------------------------------}\r
66 IMPLEMENTATION\r
67 \r
68 \r
69 Procedure T_TABLA_Crear ( var T: T_TABLA);\r
70 {\r
71          PRE   :T nunca fue creada.\r
72          POST: T creada y vac¡a.\r
73 }\r
74 \r
75 BEGIN\r
76 \r
77      LSC_Inicializar ( t.lista );\r
78 \r
79      {una lista vacia esta ordenada}\r
80      t.ordenada := true;\r
81 \r
82 END;\r
83 Function T_TABLA_Vacia ( T: T_TABLA ) : boolean;\r
84 {\r
85         PRE   :T creada.\r
86         POST: Si T tiene elementos, entonces es FALSE, sino es TRUE.\r
87 }\r
88 BEGIN\r
89 \r
90      T_TABLA_Vacia := LSC_vacio( t.lista );\r
91 \r
92 END;\r
93 \r
94 \r
95 Function T_TABLA_Llena ( T: T_TABLA ) : boolean;\r
96 {\r
97          PRE   :T creada.\r
98          POST: Si T tiene lugar para insertar nuevos elementos, entonces es FALSE, sino es TRUE.\r
99 }\r
100 BEGIN\r
101 \r
102      T_TABLA_Llena := LSC_lleno( t.lista );\r
103 \r
104 END;\r
105 \r
106 Function T_TABLA_Ordenada ( T: T_TABLA ) : boolean;\r
107 {\r
108          PRE   :T no vac¡a.\r
109          POST: Si T est  ordenada, entonces es verdadero, sino es falso.\r
110 }\r
111 \r
112 BEGIN\r
113 \r
114      T_TABLA_Ordenada:= t.ordenada;\r
115 \r
116 END;\r
117 \r
118 Procedure T_TABLA_Elem_Cte ( T: T_TABLA ; var R: T_REGISTRO );\r
119 {\r
120           PRE   :T no vac¡a.\r
121           POST: R contiene el registro corriente.\r
122 }\r
123 \r
124 BEGIN\r
125 \r
126      LSC_elem_cte ( t.lista, r);\r
127 \r
128 END;\r
129 \r
130 Procedure T_TABLA_Mover_Cte ( var T: T_TABLA ; M: T_MOVIM; var error: boolean );\r
131 {\r
132           PRE   :T no vac¡a.\r
133           POST: Si M = primero, el nuevo corriente es el primer registro y error es falso.\r
134                 Si M = ultimo, el nuevo corriente es el £ltimo registro y error es falso.\r
135                 Si M = siguiente, el nuevo corriente es el siguiente registro del actual\r
136                 corriente y error es falso. Si el corriente era el £ltimo registro, entonces\r
137                 error es verdadero y el corriente sigue siendo el £ltimo registro.\r
138                 Si M = anterior, el nuevo corriente es el anterior registro del actual\r
139                 corriente y error es falso. Si el corriente era el primer registro, entonces\r
140                 error es verdadero y el corriente sigue siendo el primer registro.\r
141 \r
142                 (Los valores para M son de tipo t_movim)\r
143 }\r
144 \r
145 BEGIN\r
146 \r
147 LSC_mover_cte ( t.lista, m, error );\r
148 \r
149 END;\r
150 \r
151 Procedure T_TABLA_Insertar ( var T: T_TABLA ; var R: T_REGISTRO; M: T_MOVIM );\r
152 {\r
153           PRE   : T no est  llena.\r
154           POST: Si M = primero, R se agreg¢, es el primer registro y el nuevo corriente.\r
155                 Si M = ultimo, R se agreg¢, es el £ltimo registro y el nuevo corriente.\r
156                 Si M = siguiente, R se agreg¢, es el siguiente registro del corriente, y es el nuevo corriente\r
157                 Si M = anterior, R se agreg¢, es el anterior registro del corriente, y es el nuevo corriente.\r
158 \r
159                 Para no complicar mas la implementacion de la lista doble,\r
160                 el insertar al final esta implementado aca\r
161 }\r
162 \r
163 VAR error: boolean;\r
164 \r
165 BEGIN\r
166 \r
167      IF m = LSC_ULTIMO then begin\r
168 \r
169         LSC_mover_cte ( t.lista, m, error );\r
170 \r
171         {insertar al final no es mas que insertar despues de el ultimo:}\r
172         m:= LSC_siguiente\r
173 \r
174         end;\r
175 \r
176      LSC_insertar ( t.lista, m, r);\r
177 \r
178      t.ordenada:= false\r
179 \r
180 END;\r
181 \r
182 Procedure T_TABLA_Insertar_O ( var T: T_TABLA ; var R: T_REGISTRO);\r
183 \r
184 VAR error: boolean;\r
185     e: t_registro;\r
186 \r
187 BEGIN\r
188 \r
189      IF t.ordenada = true then begin\r
190 \r
191         T_TABLA_Buscar_Clave(t, r.dni, error); {no importa si lo encuentra o no}\r
192 \r
193         T_TABLA_Elem_Cte( t, e);\r
194 \r
195         IF e.dni > r.dni then\r
196            T_TABLA_INSERTAR(t, r, lsc_anterior)\r
197         ELSE\r
198            T_TABLA_INSERTAR(t, r, lsc_siguiente);\r
199 {*1*}\r
200 \r
201         t.ordenada:= true {insertar lo deja en false}\r
202      END;\r
203 \r
204 END;\r
205 \r
206 Procedure T_TABLA_Limpiar ( var T: T_TABLA );\r
207 {         PRE   : T creada.\r
208           POST:  T vac¡a.\r
209 }\r
210 \r
211 \r
212 BEGIN\r
213 \r
214      LSC_vaciar (t.lista);\r
215      t.ordenada:= true;\r
216 \r
217 END;\r
218 \r
219 Procedure T_TABLA_Borrar_Cte ( var T: T_TABLA );\r
220 {\r
221           PRE   : T no vac¡a.\r
222           POST:  Se elimin¢ el registro corriente.\r
223           El nuevo registro corriente es el siguiente del borrado, si el borrado\r
224           era el £ltimo, entonces el nuevo corriente es el primero.\r
225 }\r
226 \r
227 BEGIN\r
228 \r
229      LSC_borrar_cte ( t.lista );\r
230 \r
231 END;\r
232 \r
233 Procedure T_TABLA_Modif_Cte ( var T: T_TABLA ; var R: T_REGISTRO );\r
234 {\r
235           PRE   : T no vac¡a.\r
236           POST:  El contenido del actual corriente fue actualizado con R.\r
237           Si T estaba ordenada y no se modificaron los datos de la clave del\r
238           corriente, entonces T sigue ordenada. Si T estaba ordenada y se\r
239           modificaron los datos de la clave del corriente, entonces si la\r
240           nueva clave rompe el orden de T, T no est  m s ordenada.\r
241 }\r
242 VAR e: T_REGISTRO;\r
243 \r
244 BEGIN\r
245 \r
246      T_TABLA_Elem_Cte (t, e);\r
247 \r
248      if Devolver_Clave_Elem( e ) <> Devolver_Clave_Elem( r ) then\r
249         t.ordenada:= false;\r
250 \r
251      LSC_modif_cte (t.lista, r);\r
252 \r
253 END;\r
254 \r
255 Procedure T_TABLA_Ordenar ( var T: T_TABLA );\r
256 {\r
257           PRE   : T no vac¡a.\r
258           POST:  T se encuentra ordenada por la clave de sus registros.\r
259 }\r
260 VAR t_aux: T_TABLA;\r
261 \r
262     e: T_REGISTRO;\r
263 \r
264     error: boolean;\r
265 \r
266 BEGIN\r
267 \r
268       error:= false;\r
269 \r
270       T_TABLA_Crear( t_aux);\r
271 \r
272       LSC_COPIAR(t.lista, t_aux.lista);\r
273 \r
274       T_TABLA_Limpiar(t);\r
275 \r
276 (*      {tengo que mover en corriente al primero porque esta en nulo (0)}\r
277       T_TABLA_Mover_Cte ( t, lsc_primero, error );\r
278 Era un bolazo\r
279 *)\r
280 \r
281       T_TABLA_Elem_cte(t_aux, e);\r
282 \r
283       T_TABLA_Insertar (t, e, lsc_primero);\r
284 \r
285       T_TABLA_Mover_Cte ( t_aux, lsc_siguiente, error );\r
286 \r
287       t.ordenada:= true; {si tiene un solo elemento no veo porque no}\r
288 \r
289       while error <> true do begin\r
290 \r
291           T_TABLA_Elem_cte(t_aux, e);\r
292 \r
293           T_TABLA_Insertar_O (t, e);\r
294 \r
295           T_TABLA_Mover_Cte ( t_aux, lsc_siguiente, error );\r
296 \r
297       end;\r
298 \r
299       t.ordenada:= true;\r
300 \r
301 END;\r
302 \r
303 Procedure T_TABLA_Buscar_Clave ( var T: T_TABLA ; C: T_CLAVE; var error :boolean);\r
304 {\r
305           PRE   : T no vac¡a.\r
306           POST: Si C es una clave que existe en T, entonces el nuevo corriente es el\r
307           registro con clave C y error es falso, sino error es verdadero y\r
308           el corriente es el registro donde termino la busqueda (modificacion\r
309           hecha para facilitar la operacion insertar ordenado).\r
310 }\r
311 VAR e: T_REGISTRO;\r
312 \r
313 BEGIN\r
314 \r
315   error:= false;\r
316 \r
317 {  IF not T_TABLA_Vacia(t) then begin\r
318 }\r
319      T_TABLA_Mover_Cte ( t, lsc_primero, error );\r
320 \r
321      T_TABLA_Elem_cte(t, e);\r
322 \r
323      While (e.DNI < c ) AND not error do begin\r
324 \r
325           T_TABLA_Mover_Cte ( t, lsc_siguiente, error );\r
326 \r
327           T_TABLA_Elem_cte(t, e);\r
328 \r
329      END;\r
330 \r
331      IF e.dni <> c then error := true;\r
332 \r
333 {  END\r
334      ELSE error:= true;\r
335 }\r
336 END;\r
337 \r
338 PROCEDURE Buscar_por_Rango(var T: T_TABLA; D, H: T_CLAVE; var L: PILAC_Pila);\r
339 {\r
340         BUSCA LOS REGISTROS COMPRENDIDOS ENTRE LAS CLAVES D y H\r
341         Y LOS ALMACENA EN LA PILA L.\r
342 }\r
343 VAR\r
344    error: boolean;\r
345    e: T_REGISTRO;\r
346 \r
347 BEGIN\r
348     error:= false;\r
349 \r
350     T_TABLA_Buscar_Clave(t,d,error);\r
351 \r
352 {    if error = false then begin}\r
353 \r
354           T_TABLA_Elem_cte(t, e);\r
355 \r
356           PILAC_poner ( l,e );\r
357 \r
358           T_TABLA_Mover_Cte ( t, lsc_siguiente, error );\r
359 \r
360           T_TABLA_Elem_cte(t, e);\r
361 \r
362 \r
363           While (e.DNI <= h ) AND (error = false) do begin\r
364 \r
365                 PILAC_poner ( l,e );\r
366 \r
367                 T_TABLA_Mover_Cte ( t, lsc_siguiente, error );\r
368 \r
369                 T_TABLA_Elem_cte(t, e);\r
370 \r
371           END; {WHILE}\r
372 \r
373 {    END; {IF}\r
374 \r
375 END;\r
376 \r
377 END.