You are on page 1of 7

LENGUAJES DE PROGRAMACIN

Trabajo Prctico - Junio de 2015

INSTRUCCIONES
El trabajo prctico debe realizarse de manera individual. No debe realizarse
en grupo. Se penalizar cualquier uso compartido de las soluciones propuestas y de los cdigos programados.
El trabajo debe entregarse a travs del curso virtual de la asignatura en la
plataforma Alf.
La fecha lmite de entrega es el da 16 de abril.
El alumno debe entregar un fichero comprimido, en formato zip o tar, que
contenga:
Una memoria en la cual explique la solucin a los ejercicios, incluyendo los listados documentados del cdigo C++ desarrollado. Este
documento deber estar en formato pdf.
Los ficheros del cdigo fuente C++ solucin a los ejercicios.
No deben entregarse ficheros ejecutables.
El nombre del fichero comprimido debe ser la concatenacin del nombre y
apellidos del alumno. Por ejemplo, LuisaGomezMartin.zip

LENGUAJES DE PROGRAMACIN

CRITERIOS DE EVALUACIN
Para que el trabajo pueda ser corregido, es imprescindible que el alumno
entregue dentro del plazo establecido un fichero comprimido que contenga
la memoria en formato pdf y el cdigo fuente C++ de los ejercicios que haya
realizado.
El trabajo se compone de 4 ejercicios, cada uno de los cuales se valorar
sobre 2.5 puntos.
Para aprobar el trabajo es necesario que la suma de las puntuaciones obtenidas en los ejercicios sea mayor o igual que 5.
Si el cdigo solucin de un ejercicio tiene errores de compilacin o no tiene
la funcionalidad pedida, dicho ejercicio se valorar con cero puntos.
Si el cdigo solucin de un ejercicio compila sin errores y tiene la funcionalidad pedida, la puntuacin en dicho ejercicio ser al menos de 2 puntos.
Se valorar positivamente la eficiencia y la adecuada documentacin del
cdigo, as como la presentacin y calidad de las explicaciones proporcionadas en la memoria.

Dpto. de Informtica y Automtica, UNED

TRABAJO PRCTICO - JUNIO DE 2015

EJERCICIO 1
Uno de los primeros generadores combinados de nmeros pseudoaleatorios fue
el propuesto por Wichmann y Hill en 1982. El generador de Wichmann-Hill emplea
los siguientes tres generadores lineales congruenciales para obtener tres nmeros
enteros {xi , yi , zi }:

xi = (171 xi1 )

mod 30269

yi = (172 yi1 )

mod 30307

zi = (170 zi1 )

mod 30323

de los cuales se obtiene un nmero pseudoaleatorio ui en el intervalo (0, 1):


ui =

 x
yi
zi 
i
+
+
30269 30307 30323

mod 1

donde i = 1, 2, . . .

La semilla de este generador son tres nmeros enteros, {x0 , y0 , z0 }, que deben
estar comprendidos entre 1 y 30000.
Escriba un programa en C++ que realice las acciones siguientes:
1. Solicitar al usuario que introduzca por consola la semilla del generador.
2. Comprobar que estos tres nmeros estn comprendidos entre 1 y 30000.
Si no lo estn, el programa vuelve a solicitar por consola los nmeros al
usuario.
3. Empleando el algoritmo de Wichmann-Hill, obtener 100 nmeros pseudoaleatorios e ir almacenndolos en un array de 100 componentes.
4. Mostrar en la consola el contenido del array. Los nmeros debern mostrarse en formato fijo, con 5 dgitos detrs del punto decimal.
5. Almacenar los nmeros, en el formato anteriormente indicado y formando
una nica columna (es decir, un nmero por fila), en un fichero de texto
llamado random.txt.
6. Terminar.

Dpto. de Informtica y Automtica, UNED

LENGUAJES DE PROGRAMACIN

EJERCICIO 2
Escriba un programa en C++ que, a partir de una secuencia de 2 N nmeros
pseudoaleatorios, obtenga N = 45 posiciones aleatorias uniformemente distribuidas sobre una superficie plana rectangular de longitud L = 30 mm y altura
A = 2 mm. Para ello, el programa debe realizar las acciones siguientes:
1. El nmero de posiciones N, as como la longitud (L) y altura (A) de la
superficie, son constantes del programa: N = 45, L = 30, A = 2.
2. Abrir para lectura un fichero de texto llamado random.txt, en el cual hay
escrita una columna de nmeros pseudoaleatorios. Estos nmeros pueden
ser los obtenidos de ejecutar el programa del ejercicio anterior o cualquier
otra secuencia de nmeros pseudoaleatorios.
3. Almacenar el contenido completo del fichero en un vector de double llamado randomNums.
4. Si el vector contiene menos de 2 N componentes, mostrar un mensaje de
error y terminar.
5. Operar de la forma siguiente los primeros 2N nmeros del vector. Por cada
pareja de nmeros, {u2i , u2i+1 }, calcular una posicin aleatoria {xi , yi } de la
forma siguiente:

xi = L u2i
yi = A u2i+1
donde i = 0, . . . , N 1.
6. Almacenar las posiciones en un fichero de texto llamado posiciones.txt. Debern almacenarse en dos columnas: en la primera las posiciones xi y en la
segunda las correspondientes posiciones yi . Debern expresarse en formato
fijo, con 3 dgitos detrs del punto decimal.
7. Terminar.

Dpto. de Informtica y Automtica, UNED

TRABAJO PRCTICO - JUNIO DE 2015

EJERCICIO 3
Considrense N = 45 crculos de radio r = 0.5 mm distribuidos aleatoriamente
sobre una superficie rectangular de L = 30 mm de longitud y A = 2 mm de altura.
Los crculos que se encuentran sobre la superficie se agrupan en conjuntos de la
manera siguiente:
Cada crculo debe pertenecer a un nico conjunto.
Dos crculos entre los cuales existe solapamiento deben estar en el mismo
conjunto. Se considera que existe solapamiento entre dos crculos si la distancia entre sus centros es menor o igual que 2 r.
Escriba un programa en C++ que cumpla las especificaciones siguientes:
El nmero de crculos (N) y su dimetro (2 r) deben ser constantes del
programa.
El programa debe leer las posiciones de los centros de los N crculos de
un fichero de texto llamado posiciones.txt, que contiene dos columnas de
nmeros reales expresados en formato fijo, con 3 dgitos detrs del punto
decimal. Los nmeros de la primera columna son la coordenada x del centro
del crculo y los de la segunda columna la correspondiente coordenada y.
Este fichero podra ser, por ejemplo, el obtenido al ejecutar el programa
escrito en el ejercicio anterior.
Si el fichero posiciones.txt contiene menos de 2 N nmeros, el programa
debe mostrar un mensaje de error y terminar.
El programa debe agrupar los crculos en conjuntos.
Cada conjunto est compuesto por uno o ms crculos. El programa debe
escribir en un fichero de texto llamado nElemConj.txt el nmero de crculos de que consta cada conjunto. Los nmeros se escribirn formando una
columna. El orden de escritura de los nmeros es irrelevante.
Puede usar en el programa las estructuras de datos que estime convenientes.
La figura mostrada a continuacin es un ejemplo que pretende ilustrar la clasificacin de los crculos en conjuntos. Por simplicidad en este ejemplo se consideran

Dpto. de Informtica y Automtica, UNED

LENGUAJES DE PROGRAMACIN

C7

C6
C3

C1
C13

C2

C11

C12

C4
C9

C10

C15
C8
C14

C5

Figura 1.1: Los crculos mostrados en esta figura se clasifican en 5 conjuntos: {C7 },
{C2 , C11 , C9 , C15 }, {C6 , C1 , C13 , C4 , C10 }, {C3 , C12 }, {C8 , C14 , C5 }

slo N = 15 crculos. Los crculos se han etiquetado C1 , . . . , C15 con el propsito


de facilitar referirse a ellos al indicar los crculos pertenecientes a cada conjunto.
Dados los conjuntos del ejemplo mostrado en la Figura 1.1, la salida del programa
debera ser los nmeros siguientes escritos en cualquier orden en una columna:
1, 4, 5, 2, 3.

Dpto. de Informtica y Automtica, UNED

TRABAJO PRCTICO - JUNIO DE 2015

EJERCICIO 4
Escriba un programa en C++ que calcule la frecuencia con la que aparece cada
nmero de un determinado conjunto de nmeros naturales.
Por ejemplo, dado el conjunto {2, 1, 1, 2, 4, 1, 1, 1}, el programa debe obtener que
la frecuencia del nmero 1 es 5/8 (cinco de los ocho nmeros tienen valor 1),
la frecuencia del nmero 2 es 2/8 (dos de los ocho nmeros tienen valor 2) y la
frecuencia del nmero 4 es 1/8 (uno de los ocho nmeros tiene valor 4).
El conjunto de nmeros naturales se encuentra almacenado en un fichero de texto
llamado nElemConj.txt. Los nmeros estn escritos formando una nica columna.
El programa debe leer el contenido del fichero, calcular la frecuencia de cada
nmero natural, mostrar el resultado en la consola y terminar.
El resultado debe mostrarse en dos columnas: en la primera los nmeros, ordenados crecientemente, y en la segunda su frecuencia, expresada como fraccin. En
el ejemplo anterior, la salida del programa debera ser:
1
2
4

5/8
2/8
1/8

Dpto. de Informtica y Automtica, UNED