INTRODUCCIÓN A LA PROGRAMACIÓN 1. CURSO 1999/2000 EXAMEN FINAL. 12/2/2000. TEORÍA APELLIDOS NOMBRE EJERCICIO 1 Se dice que una matriz A es ortogonal si el producto matricial de la matriz A por su traspuesta At es la matriz identidad I. Es decir la matriz A es ortogonal si se cumple que A•At = I. Complete en LEA una posible implementación de la función esOrtogonal con el siguiente prototipo. func esOrtogonal( ent m: TMatriz) dev (ortogonal: logico) Recuerde que: Si B es la Matriz traspuesta de A se cumple que aij= bji (1≤ i,j ≤ n) Si I es la Matriz identidad, se cumple que aij= 0 para i≠j y aij= 1 para i=j Notas: 1. Considere solo matrices cuadradas. 2. No se admiten estructuras repetitivas anidadas 3. En cada línea en blanco solo se admite: 1) una llamada a función 2) una única instrucción 3) una parte de una instrucción 4) dejarla vacía 4. No podrá definir ninguna función ni procedimiento adicional, pero si utilizar las que a continuación se indican, sin necesidad de escribir su implementación. const DIM: 10 tipos TVector: tabla[DIM] de entero TMatriz: tabla[DIM,DIM] de entero proc producto(ent m1, m2: Tmatriz; sal mp: TMatriz) Pre:{m1 y m2 son cuadradas} Pos:{mp es el producto matricial de m1 y m2} proc obtenerFila(ent f: entero, m: Tmatriz; sal v: TVector) Pre:{f ≤ DIM } Pos:{Devuelve en v el contenido de la fila número f} proc obtenerColumna(ent c: entero, m: Tmatriz; sal v: TVector) Pre:{c ≤ DIM } Pos:{Devuelve en v el contenido de la columna número c} func esTriangularInferior(ent m: TMatriz) dev (b: logico) Pre:{cierto} Pos:{Devuelve cierto si todos los elementos que están por debajo de la diagonal principal son cero} func esTriangularSuperior(ent m: TMatriz) dev (b: logico) Pre:{cierto} Pos:{Devuelve cierto si todos los elementos que están por encima de la diagonal principal son cero} proc sustituirFila(ent f: entero, v: TVector; ent/sal m: TMatriz) Pre:{f ≤ DIM} Pos:{Sustituye los valores de la fila f de la Matriz m, con el contenido de v} proc sustituirColumna(ent c: entero, v: TVector; ent/sal m: TMatriz) Pre:{c ≤ DIM} Pos:{Sustituye los valores de la columna c de la Matriz m, con el contenido de v} proc obtenerDiagonalP(ent m: Tmatriz; sal v: TVector) Pre:{cierto} Pos:{Devuelve en v los valores de la diagonal principal de la Matriz m} proc copiarTMatriz (ent m: Tmatriz; sal s: TMatriz) Pre:{cierto} Pos:{Devuelve en s una copia de los valores de la Matriz m} func esOrtogonal( ent m: TMatriz) dev (ortogonal: logico) var mt, mp: TMatriz prin ................................. ................................. ................................. fin proc obtenerTraspuesta(................................) var ................................. i: entero prin desde ........................... ................................. ................................. fdesde fin func ................................. var i: entero ................................. prin ................................. ................................. ................................. mientras ................................. ................................. ................................. ................................. ................................. fmientras ................................. fin Valoración: 1/3 de la nota total APELLIDOS NOMBRE EJERCICIO 2 El método de ordenación por selección genera varias tablas intermedias antes de alcanzar su objetivo. Estamos interesados en las tablas cuyos valores son una permutación de la tabla original, es decir, aquellas tablas generadas por el algoritmo que contienen exactamente los mismos valores que la tabla original con el mismo número de apariciones, aunque en posiciones distintas algunos de ellos. a) Escriba su DNI en la primera fila (t1) de la siguiente tabla. A continuación, muestre los resultados de las tablas intermedias generadas por el algoritmo que se menciona arriba, suponiendo que el criterio de ordenación es ascendente. (Si no tiene DNI consulte con el profesor) t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 b) Sean las siguientes definiciones cons M: 8 tipos TablaE: tabla[M] de entero TablaS: tabla[M+1] de entero Calcule el resultado s de aplicar la función F a las tablas t y r, donde t es la última tabla que se obtiene en el apartado a), es decir, el DNI ordenado; r es otra tabla cuyos elementos son los dígitos de su fecha de nacimiento, en formato ddmmaaaa; y s es la tabla que se obtiene tras la ejecución de F, que ha de satisfacer la poscondición indicada. func F(t,r:TablaE) dev (s:TablaS) Pre: {∀i : 1 ≤ i < M ⋅ t i ≤ t i + 1 } [] [ ] Pos: {∀i : 1 ≤ i ≤ M + 1 ⋅ (s[i ] = Nj : 1 ≤ j ≤ M ⋅ (∀k : 0 < k < i ⋅ t [k ] < r [ j ]∧ ∀k : i ≤ k ≤ M ⋅ r [ j ] ≤ t [k ]))} Escriba en la siguiente tabla r su fecha de nacimiento (ponga ceros a la izquierda en el día y el mes si es necesario). Escriba en la siguiente tabla s el resultado de F. c) Teniendo en cuenta que no se puede utilizar la instrucción desde para implementar F y utilizando como variables locales de control de los bucles las mismas que aparecen ligadas a los cuantificadores, indique cuáles serían las condiciones o guardas que aparecerían en las estructuras iterativas y selectivas del algoritmo. Valoración: 1/3 de la nota total (a: 25%, b: 50%, c: 25%) APELLIDOS NOMBRE EJERCICIO 3 En una competición de salto de trampolín cada saltador hace tres saltos con diferentes grados de dificultad. Cinco jueces valoran cada salto de 0 a 10 puntos. La puntuación de cada salto se obtiene quitando las puntuaciones más alta y más baja y sumando las restantes. La puntuación total de cada saltador al final del concurso se obtiene sumando las puntuaciones de cada salto multiplicadas por su grado de dificultad. Los datos de la competición se han grabado en un fichero de registros de tipo Tregsalto denominado “Campeonato.dat” que contiene la información de cada salto. Los campos de Tregsalto son los siguientes: Dificultad: real /* Dificultad del salto */ Puntjueces: tabla con 5 valores reales /* Puntuación de cada juez */ Nombre: cadena /* Nombre y apellidos de cada saltador */ Se pide diseñar en LEA las estructuras de datos, variables y un procedimiento (denominado imprimir_listado) que procese la información anterior y produzca por pantalla un listado de puntuaciones ordenado por puntuación total, con la siguiente cabecera: NOMBRE SALTO1 SALTO2 SALTO3 TOTAL DEL CONCURSO Para ello sólo habrá de escribirse el código de este procedimiento y el prototipo de TODAS las funciones y procedimientos que se deban invocar para una correcta resolución del problema. NOTAS Se deberán tener en cuenta los siguientes condicionantes: 1. Se supone que en el fichero de entrada están situadas primero todas las puntuaciones del primer salto para todos los saltadores, después las de los segundos saltos y a continuación las de los terceros saltos. El orden de salto se conserva, es decir, el primer saltador de la primera tanda, es el primero en la segunda y en la tercera y así sucesivamente. 2. Se supone igualmente que no hay más de 500 saltadores y el número exacto se leerá de teclado al comienzo de la ejecución del procedimiento. 3. Sólo se pide el código del procedimiento imprimir_listado, no así del resto de las funciones o procedimientos de los que sólo se indicará el prototipo con los parámetros. 4. Se deben indicar todas las funciones y procedimientos aunque no sean invocadas desde el procedimiento imprimir_listado. Es decir, funciones o procedimientos que sean invocados desde otra función o procedimiento. 5. La solución se escribirá en la siguiente página rellenando en cada línea una sola definición, sentencia o invocación cons N : 500 tipos: ______________________ prin abrir (“Campeonato.dat”,ent,fich) ________________________ leer n ________________________ ___________________ Tregsalto : reg mientras No fdf (fich) dificultad: real leer (r, fich) puntjueces:_______________________________ ___________________ nombre: cadena ___________________ si cont <= n: freg __________________________ Tregtabla: reg __________________________ nombre : cadena | n< cont Y cont <=2 *n: ______________________ __________________________ ______________________ | otras: freg __________________________ Ttablareg : tabla_________________________ fsi proc imprimir_listado() fmientras var cerrar(fich) n,cont:entero ________________________ r: Tregsalto ________________________ fich: fichero de Tregsalto ________________________ ______________________ fin proc ___________________________(___________________________________________________) proc ___________________________(___________________________________________________) proc ___________________________(___________________________________________________) func calcular_puntuacion (___________________________________) dev (____________________) func __________________(___________________________________) dev (____________________) func __________________(___________________________________) dev (____________________) Valoración: 1/3 de la nota total