Informática - Informatica

Anuncio
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 ) ;
Descargar