eman ta zabal zazu Universidad del país vasco Euskal herriko Informática Curso 2013 / 2014 unibertsitatea Bilbao, 5 de Julio de 2014 Tiempo: 2 h Se desea realizar un programa que gestione los datos del conocido Concurso de Puentes de Palillos de Helados de la ETSI de Bilbao. Dicha competición consiste en una prueba de carga de los puentes concursantes. Se van añadiendo las piezas de carga de manera que para cada incremento el puente debe resistir sin derrumbarse durante un mínimo de 10 segundos. El estado de los cuatro participantes se recoge cada cierto tiempo, en intervalos superiores a 10 segundosi y se registra en un archivo cuyo nombre podría ser C:\Concurso.DAT donde se guardan los datos de las 4 maquetas de puente participantes en el concurso. D 12:00:40 3 1 2 FALSE 0 B C 12:00:40 12:00:40 2 3 2 3 0 4 FALSE FALSE 1 2 Tanda 1 A 12:00:40 4 0 0 FALSE 3 C 12:00:55 3 1 0 FALSE 4 B A 12:00:55 12:00:55 2 3 2 4 0 0 FALSE FALSE 5 6 Tanda 2 D 12:00:55 3 2 0 FALSE 7 ... ... ... ... 8 Tanda 3 Cada una de las maquetas está supervisada por un sistema de visión artificial que consiste en una cámara y el software de procesamiento de la imagen, de manera que en un momento dado cada cámara envía los siguientes datos al programa de registro: i IdentificadorPuente: Char Instante (hora, minuto, segundo): string de la forma hh:mm:ss CantidadPiezaGrande, CantidadPiezaMediana, CantidadPiezaPequeña: array de Integer o Una pieza grande pesa 10 Kg o Una pieza mediana pesa 5 Kg o Una pieza pequeña pesa 1 Kg Derrumbado: Boolean El dato de 10 segundos no interviene en nuestro ejercicio El programa de registro tiene como única misión recoger los datos proporcionados por los 4 sistemas de visión artificial y guardar dichos datos en el archivo C:\Concurso.DAT que podría tener el siguiente aspecto: C:\Concurso.DAT D B C 12:00:40 12:00:40 12:00:40 3 1 2 2 3 2 3 0 4 FALSE FALSE FALSE 0 1 2 Tanda 1 A 12:00:40 4 0 0 FALSE 3 C 12:00:55 3 1 0 FALSE 4 B A 12:00:55 12:00:55 2 3 2 4 0 0 FALSE FALSE 5 6 Tanda 2 D 12:00:55 3 2 0 FALSE 7 ... ... ... ... Tanda 3 En el ejemplo se observa que se han guardado los datos de dos muestras o tandas, el tiempo transcurrido entre la primera muestra y la segunda muestra ha sido de 15 segundos. A pesar de que la toma de muestras está sincronizada para los cuatro puentes, el orden de llegada de los datos desde los sistemas de visión puede diferir de una tanda a otra. También se aprecia que algún concursante no ha incrementado la carga de una tanda a otra, por ejemplo el puente B continúa con los 37 kilos del instante inicial, igualmente el puente A continúa con sus 40 kilos iniciales. Y por último, se ve que ninguno de los cuatro puentes se ha derrumbado. La maqueta vencedora será la que aguante la mayor carga corregidaii que es el producto de la masa soportada por el puente multiplicada por el coeficiente C del propio puente: Carga corregida = C * Masa soportada Donde el coeficiente C de cada puente, depende de la longitud y el peso del puente, según la fórmula: C = LongitudPuente2 / PesoPuente Las características de los cuatro puentes concursantes están recogidas en un archivo cuyo nombre podría ser C:\Coeficientes.DAT siendo sus elementos registros de la forma: IdentificadorPuente: Char LongitudPuente: Real PesoPuente: Real El aspecto del fichero podría ser el mostrado a continuación: C:\Coeficientes.DAT A B C 1.2 1.0 1.3 3.6 5.0 4.1 0 1 2 D 0.9 3.3 3 Programa El programa, en primer lugar preguntará por el nombre del fichero de datos (por ejemplo Concurso) y compondrá el nombre completo (C:\Concurso.DAT para ese ejemplo). A continuación, se repetirá la misma operación para obtener el nombre del fichero con las características físicas de los puentes, resultando C:\Coeficientes.DAT por ejemplo. Si alguno de los dos ficheros no existiera el programa finalizaría. Por el contrario, si los dos ficheros existieran se realizarán las siguientes tres acciones y se terminaría la ejecución del programa. 1. Para la primera y última tanda de la competición, calcular y mostrar en pantalla los instantes en segundos. Mostrar también en el formato HH:MM:SS el tiempo transcurrido desde el comienzo hasta el final de la competición. Por ejemplo, en el siguiente esquema el instante inicial sería 12 x 3600 + 40 = 43240 segundos, el instante final sería 13 x 3600 + 40 x 60 + 10 = 49210 segundos, y la duración del concurso sería 01:39:30. ii La carga corregida es el producto de la masa soportada por el puente multiplicada por el coeficiente C del propio puente. En consecuencia, a un puente le puede corresponder una mayor carga que a otro puente a pesar de soportar el primero menos kilos que el segundo. Por ejemplo, supongamos que el primer puente tiene las siguientes características 1,2 metros y 3,6 Kg que le aportan el coeficiente C1=1,22/3,6 es decir C1=0,4. Y para el segundo puente (de 1,0 metros y 5,0 Kg) se tiene un coeficiente C2=12/5 es decir C2=0,2. Esto supone que la carga corregida de cada puente sería: CargaCorregida1 = C1*Kilos1 CargaCorregida1 = 0,4*Kilos1 CargaCorregida2 = C2*Kilos2 CargaCorregida2 = 0,2*Kilos2 Por tanto, para que las cargas de ambos puentes sean equivalentes al primer puente le basta con soportar la mitad de los kilos que tendrá que sobrellevar el segundo puente: CargaCorregida1 = CargaCorregida2 0,4*Kilos1 = 0,2*Kilos2 Kilos1 = 0,2/0,4*Kilos2 Kilos1 = 0,5*Kilos2 C:\Concurso.DAT D 12:00:40 3 1 2 FALSE 0 B C 12:00:40 12:00:40 2 3 2 3 0 4 FALSE FALSE 1 2 Tanda 1 A 12:00:40 4 0 0 FALSE 3 … … … … … ... D 13:40:10 9 0 1 FALSE 36 C B 13:40:10 13:40:10 8 6 0 9 8 7 TRUE FALSE 37 38 Tanda 10 A 13:40:10 8 3 5 TRUE 39 Para calcular los segundos de un instante se codificará un subprograma denominado fnliCadenaSegundos que reciba una cadena de caracteres de la forma HH:MM:SS y devuelva ese instante en segundos. En el cálculo de la duración del concurso se codificará un subprograma denominado fnsSegundosCadena que reciba un tiempo en segundos y devuelva la correspondiente cadena de caracteres de la forma HH:MM:SS. 2. Calcular y mostrar en pantalla la carga corregida que soportan los puentes que se encuentren derrumbados en una tanda dada. Introducir el número de la tanda por teclado, comprobar que se corresponde con alguna de las tandas del concurso, y presentar en pantalla el sumatorio de las cargas corregidas correspondientes a los puentes derrumbados. Esta segunda acción se realizará sin volcar la información del fichero C:\Concurso.DAT a ningún array. 3. Calcular y mostrar en pantalla la masa en kilos que soporta el conjunto de los 4 puentes en un instante dado por teclado. Los datos de entrada serán números enteros y se controlará su rango (horas entre 0 y 23, minutos y segundos entre 0 y 59), se codificará un subprograma denominado fnliLeerInstante que devuelva el instante en segundos. Por ejemplo y recurriendo al siguiente esquema, donde se muestran las tres primeras tandas así como la última tanda, instantes válidos serían 12:00:40, 12:00:44, 12:00:55, 13:03:03, 13:05:11, 13:20:59 y 13:40:10 pero no se aceptarían ni el instante 12:00:00 ni el 13:44:44 porque no se corresponden con el intervalo de tiempo durante el que se celebró el concurso. C:\Concurso.DAT D 12:00:40 3 1 2 FALSE 0 B C 12:00:40 12:00:40 2 3 2 3 0 4 FALSE FALSE 1 2 Tanda 1 D 13:05:11 3 3 2 FALSE 9 B 13:05:11 2 3 2 FALSE 10 Tanda 3 C 13:05:11 3 1 4 FALSE 11 A 12:00:40 4 0 0 FALSE 3 … … … … … … C 12:00:55 3 1 0 FALSE 4 D 13:40:10 9 0 1 FALSE 36 B A 12:00:55 12:00:55 2 3 2 4 0 0 FALSE FALSE 5 6 Tanda 2 C B 13:40:10 13:40:10 8 6 0 9 8 7 TRUE FALSE 37 38 Tanda 10 D 12:00:55 3 2 0 FALSE 7 A 13:05:11 4 2 0 FALSE 8 Tanda 3 A 13:40:10 8 3 5 TRUE 39 Una vez comprobado que el instante leído es válido, dicho instante de consulta podría coincidir con el instante de una tanda o podría ser un instante comprendido entre dos tandas adyacentes. Se distinguen dos situaciones: 3.1. Continuando con el ejemplo del mismo esquema, si el instante dado coincide con una tanda (instantes 12:00:40, 12:00:55, 13:05:11 ó 13:40:10), se calculará la masa en kilos del conjunto de los 4 puentes en ese instante (o tanda) mostrando el resultado en la pantalla. 3.2. Por el contario, si el instante dado estuviera entre dos tandas (por ejemplo el instante 13:00:00 que se encuentra a caballo entre las tandas 2 y 3), sólo se mostraría un mensaje en pantalla. Se pide realizar, al menos, los siguientes subprogramas (procedimientos o funciones): Subprograma fnliCadenaSegundos, que recibe una cadena de caracteres con el formato HH:MM:SS y devuelve ese instante en segundos Subprograma fnsSegundosCadena, que recibe un tiempo en segundos y devuelve la correspondiente cadena de caracteres en el formato HH:MM:SS Subprograma fnliLeerInstante que lee desde teclado el valor de un instante, hora, minuto y segundos, (asegurándose de que los valores están dentro de los rangos correctos) y retorna el valor de ese instante en segundos Subprograma CalcularCoeficienteDeUnPuente, que recibe el nombre del fichero de coeficientes y el identificador de un puente y retorna el valor del coeficiente que corresponde a dicho puente Subprograma BuscarPosicionInstante, que recibe el nombre del fichero del concurso y un instante (en formato HH:MM:SS) y retorna la primera posición del fichero en que aparece dicho instante (será el comienzo de los datos de la tanda correspondiente a dicho instante) o retorna -1 si no lo encuentra Subprograma ObtenerNumeroDeTandasdelConcurso, que recibe el nombre del fichero del concurso y retorna el número de tandas que contiene el fichero o o o El examen final vale 7 puntos de la nota de la asignatura de Informática Para aprobar la asignatura es obligatoria la obtención del 50% de la nota del examen final La puntuación de este programa es el 70% de la nota del examen final Procedimientos y funciones utilizados a lo largo del curso (además de ReadLn y WriteLn): FUNCTION ABS ( Numero : Integer | Real ) : Integer | Real ; FUNCTION SQR ( Numero : Integer | Real ) : Integer | Real ; FUNCTION SQRT ( Numero : Integer | Real ) : Real ; FUNCTION SQRT ( Numero : Integer | Real ) : Real ; FUNCTION EXP ( Numero : Real ) : Real ; FUNCTION LN ( Numero : Real ) : Real ; FUNCTION SIN ( Angulo : Real ) : Real ; FUNCTION COS ( Angulo : Real ) : Real ; FUNCTION ARCTAN ( Tangente : Real ) : Real ; FUNCTION ROUND ( Numero : Real ) : Integer ; FUNCTION TRUNC ( Numero : Real ) : Integer ; FUNCTION FRAC ( Numero : Real ) : Real ; FUNCTION INT ( Numero : Real ) : Real ; FUNCTION CHR ( Numero : Integer ) : Char ; FUNCTION ORD ( Variable_Ordinal : Tipo_Ordinal ) : Integer ; FUNCTION PRED ( Variable_Ordinal : Tipo_Ordinal ) : Tipo_Ordinal ; FUNCTION SUCC ( Variable_Ordinal : Tipo_Ordinal ) : Tipo_Ordinal ; PROCEDURE DEC (VAR Variable_Ordinal : Tipo_Ordinal [ , Numero : Integer ) ; PROCEDURE INC (VAR Variable_Ordinal : Tipo_Ordinal [ , Numero : Integer ) ; FUNCTION UPCASE FUNCTION LOWERCASE ( Variable : Char | STRING ) : Char | STRING ; ( Variable : Char | STRING ) : Char | STRING ; FUNCTION READKEY : Char ; PROCEDURE RANDOMIZE ; FUNCTION RANDOM ( Numero : Integer ) : Integer ; FUNCTION RANDOM : Real ; PROCEDURE CLRSCR ; FUNCTION SIZEOF ( Tipo_Variable FUNCTION LENGTH ( Cadena : STRING ) : Byte ; | Identificador_Variable ) : Integer ; FUNCTION COPY FUNCTION CONCAT ( Cadena : STRING [ ; Cadena : STRING ] ) : STRING ; FUNCTION POS ( Cadena: STRING ; PosicionInicial, Cantidad : Byte ) : STRING ; ( CadenaABuscar, CadenaDondeBuscar : STRING ) : Byte ; PROCEDURE DELETE ( VAR Cadena : STRING; PosicionInicial, Cantidad : Byte ) ; PROCEDURE INSERT ( Cadena: STRING ; VAR Cadena: STRING; Posicion : Byte ) ; PROCEDURE STR ( Numero : Integer | Real [ : Formato ]; VAR Cadena : STRING ) ; PROCEDURE VAL ( Cadena : STRING ; VAR Numero : Integer | Real ; VAR Error: Integer ) ; FUNCTION FILEEXISTS ( Nombre: STRING ) : Boolean ; PROCEDURE ASSIGN ( VAR Fichero_Logico : TipoFichero ; Nombre: STRING ) ; PROCEDURE RESET ( VAR Fichero_Logico : TipoFichero ) ; PROCEDURE REWRITE ( VAR Fichero_Logico : TipoFichero ) ; PROCEDURE CLOSE ( VAR Fichero_Logico : TipoFichero ) ; PROCEDURE WRITE ( [ VAR Fichero_Logico : TipoFichero ] [; VAR Variable : TipoBaseFich ] …[ ; VAR Variable : TipoBaseFich ] ); PROCEDURE READ ( [ VAR Fichero_Logico : TipoFichero ] [; VAR Variable : TipoBaseFich ] …[ ; VAR Variable : TipoBaseFich ] ); ( VAR Fichero_Logico : TipoFichero ) : Boolean ; FUNCTION EOF FUNCTION FILESIZE ( VAR Fichero_Logico : TipoFichero ) : Integer ; FUNCTION FILEPOS ( VAR Fichero_Logico : TipoFichero ) : Integer ; PROCEDURE SEEK ( VAR Fichero_Logico : TipoFichero ; Posicion : Integer ) ; PROCEDURE ERASE ( VAR Fichero_Logico : TipoFichero ) ; PROCEDURE TRUNCATE ( VAR Fichero_Logico : TipoFichero ) ; PROCEDURE RENAME ( VAR Fichero_Logico : TipoFichero ; NuevoNombre : STRING ) ;