Ejercicio 1 · Fundamentos de Programación I URV 2015
Tema: Disseny del programa principal i resolució integrada de problemes · Del examen Examen Segundo Parcial. Evaluación Continua 2015-2016 (2015)
Enunciado
Ejercicio 1 (5 puntos). Campeonato de F1
La organización del Mundial de Fórmula 1 necesita procesar y almacenar información estadística de sus competidores. Para cada uno de los pilotos participantes se registran los siguientes datos básicos (pudiendo incorporar campos adicionales si resulta oportuno):
Nombre y apellidos
Número identificativo (dorsal)
Fecha de nacimiento (día, mes, año)
Nombre de la escudería
Una tabla con el puesto conseguido en cada uno de los 20 grandes premios disputados. En caso de no finalizar una carrera, constará el valor 0; si no llegó a tomar parte en la prueba, el valor registrado será -1.
Puntos acumulados en total (campo derivado que deberá calcularse).
El baremo de puntuación vigente desde 2010 otorga puntos exclusivamente a los diez primeros clasificados en cada carrera, tal como refleja la tabla adjunta:
Posición
1ª
2ª
3ª
4ª
5ª
6ª
7ª
8ª
9ª
10ª
Puntos
25
18
15
10
8
6
5
3
2
1
Dicha escala se representará internamente como un vector de 10 elementos enteros inicializado con los valores correspondientes:
var
puntos: taula[10] de enter:= {25, 18, 15, 10, 8, 6, 5, 3, 2, 1};
fvar
Consideraciones técnicas: Las cadenas de texto tienen un tamaño máximo de 60 caracteres (MAX_P) y finalizan con el centinela '\0'. No existe la primitiva de impresión de cadenas escriure(cadena), por lo que debe implementarse. Se dispone además del siguiente procedimiento auxiliar ya desarrollado:
acció llegir_cadena (var cl:taula de caràcters, dim:enter, sentinella:caràcter);
a.
Definir las estructuras de datos y tipos necesarios para albergar la información de los pilotos, asumiendo un máximo de 25 inscritos (pudiendo ser inferior).
b.
Especificar la cabecera (perfil del subprograma) encargada de cargar los datos de los pilotos en la estructura diseñada y retornar cuántos participantes se han inscrito en total. Indicar claramente tipo de módulo (acción o función), identificador, parámetros (especificando paso por valor o referencia) y tipo de retorno si procede. (No es necesario codificar su cuerpo).
c.
Definir e implementar en pseudocódigo los siguientes subprogramas:
d.
Diseñar el algoritmo principal que orqueste las llamadas pertinentes para: cargar el censo, mostrar la ficha del campeón y consultar puntos por nombre de participante.

Solución
Según los criterios oficiales de corrección
a. Definir las estructuras de datos y tipos necesarios para albergar la información de los pilotos, asumiendo un máximo de 25 inscritos (pudiendo ser inferior).
Solución: ```pseudocode constants MAX_P ← 60; MAX_PREMIS ← 20; MAX_PILOTS ← 25; fconst tipus t_cadena: taula[MAX_P] de caràcters; registre t_data és dia, mes, any: enter; fregistre registre t_pilot és nom: t_cadena; dorsal: enter; data_naixement: t_data; equip: t_cadena; posicions: taula[MAX_PREMIS] de enter; punts_totals: enter; fregistre t_garrella: taula[MAX_PILOTS] de t_pilot; ftipus ```
b. Especificar la cabecera (perfil del subprograma) encargada de cargar los datos de los pilotos en la estructura diseñada y retornar cuántos participantes se han inscrito en total.
Solución: ```pseudocode funció llegir_pilots (var graella: t_garrella, capacitat: enter, max_long: enter) retorna enter; ```
c.a. Procedimiento que determine y actualice la puntuación acumulada de cada piloto en el campeonato.
Solución: ```pseudocode acció calcular_tots_punts (var pilots: t_garrella, n_pilots: enter, barem: taula[10] de enter) és var i, cursa, p, suma: enter; fvar inici per (i ← 0; i < n_pilots; i ← i + 1) fer suma ← 0; per (cursa ← 0; cursa < MAX_PREMIS; cursa ← cursa + 1) fer p ← pilots[i].posicions[cursa]; si (p >= 1) i (p <= 10) llavors suma ← suma + barem[p - 1]; fsi fper pilots[i].punts_totals ← suma; fper facció ```
c.b. Función o acción que identifique al corredor vencedor del campeonato.
Solución: ```pseudocode funció cercar_guanyador (pilots: t_garrella, n_pilots: enter) retorna enter és var idx, idx_millor: enter; fvar inici idx_millor ← 0; per (idx ← 1; idx < n_pilots; idx ← idx + 1) fer si (pilots[idx].punts_totals > pilots[idx_millor].punts_totals) llavors idx_millor ← idx; fsi fper retorna (idx_millor); ffunció ```
c.c. Módulo que, a partir del nombre de un piloto, retorne su cómputo total de puntos, o bien devuelva -1 si el corredor no se encuentra en el registro.
Solución: ```pseudocode funció son_cadenes_iguals (cad1: t_cadena, cad2: t_cadena) retorna booleà és var k: enter; iguals: booleà; fvar inici k ← 0; mentre (cad1[k] ≠ '\0') i (cad2[k] ≠ '\0') i (cad1[k] = cad2[k]) fer k ← k + 1; fmentre retorna (cad1[k] = cad2[k]); ffunció funció consultar_punts_pilot (pilots: t_garrella, n_pilots: enter, nom_cercat: t_cadena) retorna enter és var pos: enter; trobat: booleà; fvar inici pos ← 0; trobat ← fals; mentre (pos < n_pilots) i (no trobat) fer si son_cadenes_iguals(pilots[pos].nom, nom_cercat) llavors trobat ← cert; sino pos ← pos + 1; fsi fmentre si (trobat) llavors retorna (pilots[pos].punts_totals); sino retorna (-1); fsi ffunció ```
d. Diseñar el algoritmo principal que orqueste las llamadas pertinentes para: cargar el censo, mostrar la ficha del campeón y consultar puntos por nombre de participante.
Solución: ```pseudocode acció mostrar_cadena (cad: t_cadena) és var k: enter; fvar inici k ← 0; mentre (cad[k] ≠ '\0') fer escriure(cad[k]); k ← k + 1; fmentre facció acció mostrar_guanyador (p: t_pilot) és inici escriure("Piloto: "); mostrar_cadena(p.nom); escriure(" (", p.data_naixement.dia, "/", p.data_naixement.mes, "/", p.data_naixement.any, ")"); escriure("\nNúmero: ", p.dorsal); escriure("\nEscudería: "); mostrar_cadena(p.equip); escriure("\nPuntuación: ", p.punts_totals, "\n"); facció Algorisme gestio_campeonat és var taula_punts: taula[10] de enter := {25, 18, 15, 10, 8, 6, 5, 3, 2, 1}; llista_pilots: t_garrella; total_pilots, pos_campio, punts_resultat: enter; nom_a_buscar: t_cadena; fvar inici total_pilots ← llegir_pilots(llista_pilots, MAX_PILOTS, MAX_P); calcular_tots_punts(llista_pilots, total_pilots, taula_punts); pos_campio ← cercar_guanyador(llista_pilots, total_pilots); mostrar_guanyador(llista_pilots[pos_campio]); llegir_cadena(nom_a_buscar, MAX_P, '.'); punts_resultat ← consultar_punts_pilot(llista_pilots, total_pilots, nom_a_buscar); mostrar_cadena(nom_a_buscar); si (punts_resultat = -1) llavors escriure(" - El piloto no existe\n"); sino escriure(" - ", punts_resultat, " puntos\n"); fsi falgorisme ```
La explicación paso a paso, hecha con IA, es Premium. Premium
Resuélvelo aquí mismo: corrección automática, pistas y solución paso a paso.
‹ Ejercicio 2 - Disseny del programa principal i re… · 2015 · Ejercicio 2 · 2015 ›