Práctica 4. Estructuras de datos Programación. Ingeniería de Telecomunicaciones Ejercicio 1.

Anuncio
Práctica 4. Estructuras de datos
Programación. Ingeniería de Telecomunicaciones
(Programa de prácticas alternativas)
Ejercicio 1.
Para hallar el número de diputados asignados a cada partido según la ley D'Hont, se
emplea el siguiente algoritmo: si N es el número total de diputados que se asignan en
una circunscripción, se dividen los votos obtenidos por cada partido entre la sucesión de
números comprendidos entre 1 y N. De entre todos los cocientes hallados, se escogen
los N mayores y se adjudica un diputado a cada partido al que le corresponda cada uno
de esos cocientes. En caso de que los cocientes sean iguales, los diputados se asignarán
a los partidos más votados (no se considera el caso de que dos partidos obtengan el
mismo número de votos). Por ejemplo, si en una circunscripción en la que se disputan 6
diputados y los resultados electorales fuesen los de la tabla
Nombre Partido
Partido1
Partido2
Partido3
Votos
100 (1)
50 (3)
25
Votos/2
50 (2)
25 (6)
12.5
Votos/3
33.33 (4)
16.66
8.33
Votos/4
25 (5)
12.5
6.25
Votos/5
20
10
5
Votos/6
16.66
8.33
4.16
entonces, corresponderían 4 diputados al Partido1, 2 al Partido2 y ninguno al
Partido3. En la tabla aparece remarcado en paréntesis el orden con el que son asignados
los diputados a cada partido.
Se pide escribir un programa Pascal que implemente la ley de D'Hont. Este programa
deberá solicitar al usuario el número de diputados a repartir, el número de partidos y los
votos conseguidos por cada partido. Los votos de cada partido serán almacenados en un
vector de registros ordenado de mayor a menor según el número de votos (tipo de dato
tpVotosPartidos). A continuación se especifican las constantes y tipos disponibles:
const
maxPartidos = 15; {número máximo de partidos}
maxDiputados = 100; {número máximo de diputados}
type
tpDiputados = 1.. maxDiputados;
tpResultadoPartido = record
nombre : string [10];
votos : real
end;
tpVotosPartidos = array [1..maxPartidos] of tpResultadoPartido;
tpResultadosElectorales = record
numeroPartidos : 1..maxPartidos;
votosPartidos : tpVotosPartidos
end;
Como parte del programa debe escribirse un procedimiento d_hont que reciba como
argumento los resultados electorales y el número de diputados a repartir. El
procedimiento deberá escribir por pantalla, tras un rótulo adecuado, una línea por cada
partido indicando el nombre del partido y el número de diputados conseguidos. A
continuación se especifica la cabecera del procedimiento:
procedure dhont(resultados :tpResultadosElectorales; diputados: tpDiputados );
Ejercicio 2.
Un videojuego tiene una bola que se mueve por una matriz de nxm casillas, numeradas
de 1..n filas x 1..m columnas. La matriz está formada por casillas en blanco
(representada por una carácter blanco, ‘ ‘) por las que se puede mover la pelota y
casillas obstáculo (representada por una carácter X, ‘X’) en las que rebota la bola, los
bordes de la matriz también hacen rebotar la bola.
El movimiento de la bola sólo se realiza según alguna de las direcciones cardinales, E,
SE, S, SO, O, NO, N, NE, manteniendo dicha dirección de movimiento hasta encontrar
un obstáculo o el borde.
Cuando el movimiento de la bola se ve interrumpido por un obstáculo (‘X’) o el borde,
ésta avanza en la siguiente dirección posible a la que llevaba, teniendo en cuenta el
orden de las direcciones cardinales tal como se han declarado anteriormente. Se supone
que siempre podrá salir en alguna dirección. Por ejemplo, si lleva dirección N, cambiará
a dirección NE, y si lleva dirección NE, cambiará de dirección tomando la primera de
la secuencia, es decir dirección E.
Se pide escribir un programa Pascal que solicite al usuario la casilla inicial en la que se
encuentra la bola, la dirección en la que iniciará su movimiento y el número de
movimientos que se desean realizar. El programa deberá escribir por pantalla la
secuencia de situaciones consecuencia de estos movimientos (una situación está
definida por la casilla en la que se encuentra la bola y la dirección actual de
movimiento). Por ejemplo, si la bola se encuentra inicialmente en la casilla (2, 3) y se
mueve en dirección SE, la secuencia de situaciones resultantes de la ejecución de 10
movimientos sería la mostrada en la siguiente figura.
m columnas
1
2
3
4
5
1
2
n filas
3
4
5
X
X
X
X
NO N NE
O
E
SO SE
S
Ejemplo para 10 llamadas al procedimiento SiguienteSituación
Situaciones: <(2, 3), SE>, <(3, 4), SE>, <(4, 4), S>, <(5, 4), S>,
<(5, 3), O>, <(4, 2), NO>, <(3, 1), NO>, <(2, 1), N>, <(1, 1), N>,
<(1, 2), E>, <(1, 3), E> <(1, 4), E> <(1, 5), E> <(2, 5), S>
A continuación se especifican las constantes y tipos de datos disponibles:
const
maxFilas = 5;
maxColumnas = 5;
type
tpDireccionCardinal = (E, SE, S, SO, O, NO, N, NE);
tpTablero = array [1.. maxFilas, 1..maxColumnas] of boolean;
tpSituacion = record
x, y : integer;
dir : tpDireccionCardinal;
end;
Como parte del programa deben escribirse los siguientes procedimientos:
procedure crearTablero(var t: tpTablero);
{Post el tablero t está inicializado con una configuración de casillas en
blanco o con obstáculos especificada por el usuario a través de teclado}
procedure siguienteSituacion(var s: tpSituacion; t: tpTablero);
{Pre Una situación s que indica la posición de la bola en el tablero así como
la dirección en la que se llegó a esa posición; y el tablero t}
{Post La situación s tal que representa la siguiente situación de la bola
(nuevas posición y dirección)}
Importante: La entrega de los ejercicios de esta práctica será durante la sesión de
laboratorio de la práctica 5 (25 de Noviembre -grupos de martes B- , y 28 de
noviembre -grupos de viernes A-) .
Descargar