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-) .