TRABAJO PRÁCTICO: ASIGNATURA: COMPUTACIÓN II CÓDIGO

Anuncio
324 – T. P.
Lapso 2016-1
1/8
UNIVERSIDAD NACIONAL ABIERTA
VICERRECTORADO ACADÉMICO
ÁREA INGENIERÍA
TRABAJO PRÁCTICO:
ASIGNATURA: COMPUTACIÓN II
CÓDIGO: 324
FECHA DE ENTREGA DE LAS ESPECIFICACIONES AL
ESTUDIANTE: A partir de la primera semana de aplicación de
pruebas, a través del asesor de la asignatura en su centro local
FECHA DE DEVOLUCIÓN DEL INFORME POR EL ESTUDIANTE:
Adjunto a la Prueba Integral
NOMBRE DEL ESTUDIANTE:
CÉDULA DE IDENTIDAD:
CORREO ELECTRÓNICO:
TELEFONO:
CENTRO LOCAL:
CARRERA: 236
NÚMERO DE ORIGINALES:
FIRMA DEL ESTUDIANTE:
LAPSO: 2016-1
UTILICE ESTA MISMA PÁGINA COMO CARÁTULA DE SU TRABAJO
RESULTADOS DE CORRECCIÓN:
OBJ N°
5
6
7
0:NL 1:L
Especialista: María E. Mazzei
Ingeniería de Sistemas
Evaluador. Sandra Sánchez
324 – T. P.
Lapso 2016-1
2/8
ESPECIFICACIONES DEL TRABAJO PRÁCTICO
Este trabajo se basará en el Objetivo No. 5 del Módulo II y los
objetivos 6 y 7 correspondientes al Módulo III. En él se evidenciará
las habilidades y destrezas adquiridas por el estudiante, al momento
de implementar algoritmos para la resolución de problemas
empleando la estructura de Grafos, así como algoritmos de
ordenación y búsqueda en Lenguajes de Programación.
Objetivo 5
Una empresa dedicada a la distribución, mantenimiento y surtido de
máquinas expendedoras de café, debe realizar recorridos
frecuentes a efecto de cumplir sus labores en las máquinas
dispuestas en diferentes puntos de una región urbana. Para ello
debe hacer un recorrido tal que partiendo de la sede principal, debe
pasar por todos los lugares en donde están instaladas dichas
máquinas.
En vista de los gastos de gasolina, repuestos y otros factores
incidentes en el funcionamiento de los vehículos, se requiere hacer
un estudio de las rutas. Para ello usted deberá simular una región
con M máquinas distribuidas en diferentes puntos y generar una
red de vías que las conecte y determinar la mejor ruta a seguir.
Sobre la base de la situación presentada, se pide elaborar un
programa en lenguaje de programación C++ (o Dev C++) que
realice lo siguiente:
a- Lea un valor m > 20, que represente el número de máquinas
distribuidas en la región, y construya los arcos correspondientes
a la red de ubicación de dichas máquinas empleando números
aleatorios. También debe asignar las longitudes de cada trayecto
entre cada par de máquinas que estén comunicadas por una vía,
empleando números aleatorios entre 1 y 100, (ver explicación
sobre los números aleatorios al final).
b- Imprima la matriz de Adyacencia que corresponde a la red
generada. Se establecerá que la vía entre las máquinas i y j es la
Especialista: María E. Mazzei
Ingeniería de Sistemas
Evaluador. Sandra Sánchez
324 – T. P.
Lapso 2016-1
3/8
misma que la existente entre las máquinas j e i, por lo cual su
distancia será la misma.
c- Determine la ruta de costo mínimo que deberá seguir el vehículo
que efectúa la ruta de mantenimiento y surtido de las máquinas,
de manera que las visite a todas. Para ello se sugiere la
aplicación de un algoritmo el cual se esbozará mas adelante.
d- Imprima la ruta mínima y su costo (en Kms.).
e- Presente en una hoja adjunta a su trabajo un esquema del TAD
grafo con el que Ud. ha trabajado, que incluya las operaciones
que permitieron resolver el problema e incluya otras operaciones
posibles.
Método a emplear
Para obtener la red de costo mínimo que garantice que sean
visitadas todas las máquinas, se debe construir el árbol mínimo
expandido. Un árbol mínimo expandido es una estructura que
contiene todos los vértices o nodos, conectados de manera que el
costo de recorrido es mínimo y además es una forma de detectar si
la red está conectada ya que el grafo original debe ser conexo.
Existen dos algoritmos eficientes que permiten construir esta
estructura que son: el algoritmo de Kruskal y el algoritmo de Prim.
A continuación presentamos el esquema del algoritmo Kruskal en
seudo lenguaje.
Algoritmo Kruskal
1-Ordene todos los arcos en forma no decreciente de acuerdo
a su peso(longitudes en Km)
2-Seleccione el arco con menor costo y verifique si este
forma un ciclo con el árbol expandido que se ha obtenido
hasta el momento. Si no forma un ciclo incluya este
arco, si no descártelo.
3-Repita el paso hasta que haya |V| -1 arcos en el árbol
expandido. (|V| es el número de nodos del grafo)
Especialista: María E. Mazzei
Ingeniería de Sistemas
Evaluador. Sandra Sánchez
324 – T. P.
Lapso 2016-1
4/8
Ud. podrá emplear el algoritmo Prim si así lo desea.
Generación de números aleatorios:
La matriz de Adyacencia debe crearse automáticamente, una vez
solicitado el valor de N, utilizando un proceso de generación de
números aleatorios (NA) para determinar si entre cada par de nodos
i, j existe o no un arco. Un NA es un valor de una variable obtenido
al azar, dicha variable se especifica según una función denominada
función de distribución. En los computadores personales es fácil
simular la generación de números aleatorios, mediante mecanismos
internos de generación de números pseudoaleatorios, que sin ser
aleatorios, aparentan serlo.
En el lenguaje de programación C++ se puede emplear la función
rand, para generar números aleatorios entre 0 y 1. Se sugiere
implementar ésta, como se describe a continuación:
⎧0 si 0 ≤ NA ≤ 0,5
f(NA) = ⎨
⎩1 si 0,5 < NA ≤ 1
De esta manera si se quiere determinar la relación existente entre
los nodos i y j, y obtenemos un valor de f = 0 se deduce que no hay
un arco entre i y j y si el valor de f es 1, se deduce que hay un arco
con sentido desde i hasta j (un solo sentido). Empleando este
proceso para cada par de nodos, se construye la matriz de
Adyacencia. Tome en cuenta que el programa deberá generar
diferentes secuencias en cada grafo que construye. Como el grafo
debe ser conexo, el programa en cuestión deberá detectar cuando
en la generación automática de la matriz de Adyacencia resulte una
columna en la que todos sus elementos sean ceros y corregirla ya
que esto implicaría que la máquina no está conectada con el resto.
Para generar las longitudes de cada arco previamente obtenido por
el proceso anterior, deberá obtener números aleatorios en el
intervalo (0,100), que representarán las distancias en Kilómetros.
2- Objetivo 6
Elabore un programa en PASCAL que realice lo siguiente:
Especialista: María E. Mazzei
Ingeniería de Sistemas
Evaluador. Sandra Sánchez
324 – T. P.
Lapso 2016-1
5/8
• Construya un vector (array) de 100 elementos enteros entre los
valores 0 y 1.000 que representan las claves de registros,
empleando una función aleatoria que permita generar números
aleatorios dentro del intervalo mencionado.
• Ordene el vector empleando el Método de Ordenación por
Montículo (Heapsort).
• Imprima el vector original
método.
y luego el resultante al aplicar el
3- Objetivo 7
Una tabla de Hashing es una estructura de datos a través de la cual
se asigna a cada clave un valor, con el
fin de crear un
procedimiento de búsqueda de alta eficiencia. El primer paso es
crear una función de hashing o de dispersión que transforma la
clave de búsqueda en un índice (ver Figura N°1). Idealmente, las
diferentes claves deben asignarse a diferentes índices. Este ideal
es generalmente más allá de nuestro alcance, así que tenemos que
enfrentar la posibilidad de que dos o más claves diferentes puedan
obtener el mismo índice, en este caso se dice que las claves son
sinónimos. Así, la segunda parte de la búsqueda en una Tabla de
Hash es un proceso de resolución de colisiones que se ocupe de
esta situación. Otro aspecto de igual importancia es el número de
celdas que debe tener la tabla.
La relación entre el número de elementos almacenados, n, y el
número de celdas (slots) de la tabla, m, n/m, recibe el nombre de
factor de carga. Como las listas enlazadas a las que se hace
referencia en las celdas de hash pueden contener un número
arbitrario de elementos, no existe límite en la capacidad de la tabla
hash que utiliza el encadenamiento. Si la función hash empleada no
distribuye bien las claves, el rendimiento de la tabla disminuirá.
Cuando todas las claves se dispersan en una misma celda, ocurre
el peor caso de una tabla de hash. Para una mayor eficacia, el
factor de carga debe ser menor o igual que 0.75.
(Fuente: http://mit.ocw.universia.net/1.00/s02/class-sessions/lecture-31/lecture31.pdf)
Especialista: María E. Mazzei
Ingeniería de Sistemas
Evaluador. Sandra Sánchez
324 – T. P.
Lapso 2016-1
6/8
Figura 1. Tabla de Hashing
Sobre la base de esta información, desarrolle un programa en
lenguaje C++ o Dev C++ que genere en una primera parte M
números aleatorios enteros en el intervalo [1.000, 1.999] y que
inserte estos números o claves en una estructura tipo tabla de
Hashing, semejante a la mostrada en la Figura N°1, con
encadenamiento de sinónimos. En una segunda parte de este
programa se realizará un proceso continuo de lectura de números
de cuatro cifras para hallar las claves solicitadas en la tabla.
Ud. deberá establecer el número de celdas que tendrá la tabla y la
función de hashing.
Instrucciones generales sobre el Trabajo Práctico
El estudiante debe entregar un informe que contenga lo siguiente:
• Listado documentado del programa fuente. En el encabezado de
cada función o sección de programa que lo requiera, debe incluir
un breve comentario del proceso que se realiza o del método
que aplica. Igualmente es conveniente hacerlo en la definición
de las estructuras de datos y variables utilizadas.
• Listado de los resultados.
• CD (Disco Compacto) que contenga el programa fuente y el
programa ejecutable (.exe), debidamente identificado.
Especialista: María E. Mazzei
Ingeniería de Sistemas
Evaluador. Sandra Sánchez
324 – T. P.
Lapso 2016-1
7/8
• Una hoja adjunta que incluya lo solicitado en los objetivos 5 y 7.
• El CD debe estar libre de virus y debe entregarse en un sobre
conjuntamente con el listado de programa y resultados. No use
cinta engomada para adherirlo al informe.
• El trabajo se entregará completo, adjunto a la prueba integral,
con una portada similar a la presentada en las especificaciones
de este trabajo.
Recomendaciones
• Emplee nombres de variables, constantes y funciones alusivos a
lo que representan.
• Utilice un diseño modular para la resolución del problema. Esta
estructura aportará legibilidad y facilidad de comprensión,
además evitará redundancias en los procesos. Evite variables
globales en las funciones. Emplee parámetros en los mismos,
determine cuáles son parámetros valor y cuáles parámetros
variables.
• Desarrolle algoritmos eficientes.
• Elabore funciones de validación de la data y de detección de
errores para evitar interrupciones inesperadas en la ejecución
del trabajo.
• Efectúe varias corridas del programa y verifique los resultados.
Criterio de corrección
Se considera logrado el objetivo si al menos se cumple con lo
siguiente:
9 Entrega del listado documentado del programa, codificado en
C++ o en Dev C++, en forma modular. En el encabezado de
cada función o sección de programa que lo requiera y en la
declaración de las estructuras de datos se incluye un breve
comentario acerca del proceso, método o definición de
estructura, según sea el caso.
Especialista: María E. Mazzei
Ingeniería de Sistemas
Evaluador. Sandra Sánchez
324 – T. P.
Lapso 2016-1
8/8
9 El programa corre sin restricciones. En general cada programa
incluye funciones que realizan o contribuyen a alcanzar lo
solicitado en las especificaciones.
9 Imprime los valores solicitados de acuerdo a cada sección del
trabajo.
9 En el caso del objetivo 5 deberá incluir el TAD grafo y en el
caso del objetivo 7, deberá especificar el número de celdas de
la Tabla de Hashing y la función de Hashing empleada.
FIN DE LAS ESPECIFICACIONES DEL TRABAJO PRÁCTICO
NOTA: Los Trabajos Prácticos son estrictamente individuales y una producción
inédita del estudiante, cualquier indicio que ponga en duda su originalidad, será
motivo para su anulación. Queda a discreción del asesor o profesor corrector,
solicitar una verificación de los objetivos contemplados en el mismo,
únicamente en aquellos casos en los que se vea comprometida la originalidad
de la autoría del presente trabajo práctico.
Especialista: María E. Mazzei
Ingeniería de Sistemas
Evaluador. Sandra Sánchez
Descargar