M - 324 Versión 1 Primera Integral Lapso 2007/2 1/5 UNIVERSIDAD NACIONAL ABIERTA VICERRECTORADO ACADÉMICO ÁREA INGENIERÍA MODELO DE RESPUESTA ASIGNATURA: Computación II MOMENTO: Primera Integral FECHA DE APLICACIÓN: 27/10/07; CÓDIGO: 324 VERSIÓN:1 LAPSO 2007-2 MOD. I, UND. 1, OBJ.1 CRITERIO DE DOMINIO 1/1 1- Tipo Abstracto de Datos. El siguiente es un modelo del TAD : a) Se propone el uso de una estructura de arreglo bidimensional de registros(tipo record) y operaciones de búsqueda por dirección (i,j), búsqueda exhaustiva, conteo por tipo, conteo por área, conteo de disponibilidad, determinación de disponibilidad de parcelas, entre otras, como se muestran a continuación: 1- Reservar parcela (i,j) TAD MATRIZ: parcelas 8- Hallar parcelas disponibles en la fila i 2- Búsqueda por dirección (i,j) 3- Búsqueda exhaustiva ( recorrido de toda la matriz) para hallar un área/tipo 7- Hallar vecinos de la parcela (i,j) 4- Conteo de todas las parcelas que tienen una extensión ≤ x 5- ¿Está disponible la dirección (i,j)? 6-Contar parcelas disponibles Figura 1 b) Operación en Pascal: La “operación” a implementar es: ContarParcelasArea ( cuenta las parcelas que tienen un área dada) type cadena = string[12]; parcelas = record area : real; tipo : cadena; ci : cadena; ocupado : boolean; end; {parcela} Ingeniería de Sistemas M - 324 Versión 1 Primera Integral Lapso 2007/2 2/5 solar = array[1..M, 1..N] of parcelas; function ContarParcelasArea(m: solar; a : real): integer; var cont, i,j : integer; begin cont := 0; for i := 1 to 4 do for j := 1 to N do if (m[i,j]. area <= a) then cont := cont + 1; ContarParcelasArea := cont end; Criterio de corrección: Se logra el objetivo si se realiza lo solicitado en las dos secciones. Con respecto a la sección a) deberá describir el TAD apropiado, contemplando al menos las operaciones mencionadas en la descripción de la situación. Para cumplir con lo exigido en la sección b), debe implementarse una operación en Pascal. En este modelo se presentó la operación contar parcelas, según un área dada. MOD. I, UND. 2, OBJ. 2 CRITERIO DE DOMINIO 1/1 2- a- Estructura de datos: La estructura de datos más apropiada es la formada por un arreglo con las direcciones de las pilas correspondientes a las 4 zonas y la pila de casos especiales. Se concibe cada pila como una lista enlazada con empleo de la disciplina LIFO para su manipulación. (Figura 2). 1 2 Zona 001 Zona 002 . . . . 3 Zona 003 4 5 Zona 004 Casos Esp. . . Figura 2 Ingeniería de Sistemas . . . . M - 324 Versión 1 Primera Integral Lapso 2007/2 3/5 b) TAD: El tipo abstracto de datos para este caso es un arreglo de pilas. Entre las operaciones asociadas a este objeto están: Distribuir correspondencia ( inserta elementos en las diferentes pilas), Contar correspondencia en cada pila( cuenta el número de elementos en cada pila), Unir dos o más pilas , Extraer correspondencia( elimina elementos de una pila), Eliminar pila. c) const NUM = 5; type cadena = string[12]; apunt_nodo_pila = ^nodo_pila; nodo_pila = record codigo : cadena; prox_corr: apunt_nodo_pila end; {nodo de la pila} direcc_pilas = array[1..NUM] of apunt_nodo_pila; Procedimiento de distribución de correspondencia procedure DistribuirCorrespondencia(var p:direcc_pilas ); var ch : char; zona : string[4]; i,n : integer; cod : cadena; begin ch := 'S'; while Upcase(ch) = 'S' do begin writeln(' Introduzca zona '); readln(zona); if zona = '0001' then i := 1 else if zona ='0002' then i := 2 else if zona = '0003' then i := 3 else if zona = '0004' then i := 4 else i := 5; writeln(' Introduzca codigo '); Inserta en la pila i readln(cod); (se expone más abajo) Empilar(p, i, cod); writeln(' mas correspondencias? S/N '); readln(ch); end; end; Ingeniería de Sistemas M - 324 Versión 1 Primera Integral Lapso 2007/2 4/5 Nota. En lugar de la secuencia de if-then else, podría convertirse el valor de zona ( cadena de 4 caracteres) a un entero a través de una función. Para usar la estructura de control case, debe definirse un tipo de dato ordinal procedure Empilar (var p: direcc_pilas; i: integer; cod: cadena); var nuevo,aux : apunt_nodo_pila; begin aux := p[i]; nuevo := new(apunt_nodo_pila); nuevo^.codigo := cod; nuevo^.prox_corr := aux; p[i] := nuevo; end; { Empilar } Criterio de corrección: Se logra el objetivo si se realiza lo solicitado en todas las secciones de la pregunta. En esta situación se recomienda el empleo de la estructura de datos tipo vector o arreglo de pilas, cada celda del vector contiene la dirección de la cima de la pila y cada elemento de la pila está enlazado con el siguiente. Se emplea manejo dinámico de la memoria. Es obligatorio presentar una descripción de la estructura de datos a emplear en PASCAL, similar a la mostrada en este modelo. Se admite que se consideren direcciones individuales, en lugar de un vector de direcciones. MOD. II, UND. 3, OBJ. 3 CRITERIO DE DOMINIO 1/1 3- Procedimiento Buscar Hijos procedure Buscar_Hijos(r: apunt_arbol;v : tipo_elem; var sw : boolean); begin if r<>nil then begin Se emplea para if v = r^.elemento then saber si el elemento begin está o no en el árbol sw := true; hijo(r^.izq); hijo(r^.der); Se detalla r := nil; seguidamente end else begin Buscar_Hijos(r^.izq,v,sw); Buscar_Hijos(r^.der,v, sw) Ingeniería de Sistemas M - 324 Versión 1 Primera Integral Lapso 2007/2 5/5 end; end; end; El siguiente procedimiento permite hallar el contenido de los nodos hijos procedure hijo (t: apunt_arbol); begin if t <> nil then writeln(' Sucesor: ',t^.elemento) else writeln(' Sucesor nulo'); end; Criterio de corrección: Se logra el objetivo si se resuelve el problema planteado empleando una estructura de árbol binario, con un procedimiento recursivo de búsqueda de un valor solicitado en el árbol binario de búsqueda y uno que determine el valor de los nodos hijos, aunque el segundo puede formar parte del cuerpo del primero. Se debe contemplar el caso de “hijos nulos”. FIN DEL MODELO DE RESPUESTA Ingeniería de Sistemas