Informática – 3/Junio/2014 Publicar 1 Informática – 3/Junio/2014

Anuncio
 PROGRAM FormulaStudent ;
USES
Crt, SysUtils ;
CONST
MAX_EQUIPOS
= 150 ;
PENALIZACION_SG = 5
; { Tiempo en segundos }
TYPE
tsCadNombres = String [30] ;
PROCEDURE ConvertirMilisegundosATiempo (iTiempoMilisegundos : Integer ;
VAR
rgTiempo : trgTiempos) ;
VAR
iRestoMilisegundos: Integer ;
BEGIN
WITH rgTiempo DO
BEGIN
iMinutos
:= iTiempoMilisegundos DIV 60000 ;
iRestoMilisegundos := iTiempoMilisegundos MOD 60000 ;
iSegundos
:= iRestoMilisegundos DIV 1000 ;
iMilesimas
:= iRestoMilisegundos MOD 1000 ;
END ;
END ;
trgSensores
= RECORD
iIDSensor, iTiempo : Integer ;
END ;
trgTiempos = RECORD
iMinutos, iSegundos, iMilesimas : Integer ;
END ;
PROCEDURE CalcularTiempoSensores (CONST argDatosSensores : targDatosSensores ;
VAR rgTiempoPrueba
: trgTiempos) ;
VAR
iMilisegundosEmpleados : Integer ;
BEGIN
iMilisegundosEmpleados := Abs (argDatosSensores[2].iTiempo argDatosSensores[1].iTiempo) ;
targDatosSensores = ARRAY [1..2] OF trgSensores ;
trgPruebas = RECORD
sNombreEquipo
rgTiempoProv
iPenalizaciones
rgTiempoTotal
END ;
:
:
:
:
tsCadNombres ;
trgTiempos ;
Integer ;
trgTiempos ;
ConvertirMilisegundosATiempo (iMilisegundosEmpleados, rgTiempoPrueba) ;
END ;
PROCEDURE LeerDatosPrueba (VAR rgPruebaEquipo : trgPruebas) ;
VAR
argDatosSensores
: targDatosSensores ;
iMilisegundosEmpleados : Integer ;
BEGIN
WITH rgPruebaEquipo DO
BEGIN
Write ('
Nombre del equipo: ') ;
ReadLN (sNombreEquipo) ;
targListaEquiposPrueba = ARRAY [1..MAX_EQUIPOS] OF trgPruebas ;
tfbrgFichDatosPrueba = FILE OF trgPruebas ;
FUNCTION fncLeerOpcion : Char ;
VAR
cOpcion : Char ;
BEGIN
ClrScr ;
Writeln ('---------- Menu de opciones ----------') ;
Writeln (' 1
Añadir prueba de equipo') ;
Writeln (' 2
Guardar los datos a fichero historicos') ;
Writeln (' 3
Calcular el mejor tiempo en el fichero de historicos') ;
Writeln (' 0
Salir del programa') ;
Writeln ;
Write
('
Pulsa el numero de la opcion: ');
REPEAT
cOpcion := ReadKey ;
UNTIL ('0' <= cOpcion) AND (cOpcion <= '5') ;
Writeln (cOpcion) ;
LeerDatosSensores (argDatosSensores) ;
Writeln ('....... leidos los tiempos de la prueba') ;
CalcularTiempoSensores (argDatosSensores, rgTiempoProv) ;
Write ('Numero de conos tirados (penalizaciones): ') ;
ReadLn (iPenalizaciones) ;
iMilisegundosEmpleados := fniConvertirTiempoAMilisegundos (rgTiempoProv) ;
iMilisegundosEmpleados := iMilisegundosEmpleados +
PENALIZACION_SG * 1000 * iPenalizaciones ;
fncLeerOpcion := cOpcion ;
END ;
ConvertirMilisegundosATiempo (iMilisegundosEmpleados, rgTiempoTotal) ;
END ;
PROCEDURE LeerDatosSensores (VAR argDatosSensores : targDatosSensores) ;
BEGIN
{ ----------- NO era necesario codificarlo -------------- }
END ;
END ;
FUNCTION fniConvertirTiempoAMilisegundos (CONST rgTiempo : trgTiempos) : Integer ;
VAR
iTiempoMilisegundo : Integer ;
BEGIN
WITH rgTiempo DO
iTiempoMilisegundo := iMinutos * 60 * 1000 + iSegundos * 1000 + iMilesimas ;
fniConvertirTiempoAMilisegundos := iTiempoMilisegundo ;
END ;
Informática – 3/Junio/2014 Publicar 1 PROCEDURE CrearSiNoExiste (sNomFich : tsCadNombres) ;
VAR
fbrgFich : tfbrgFichDatosPrueba ;
BEGIN
IF NOT FileExists (sNomFich) THEN
BEGIN
Assign (fbrgFich,sNomFich) ;
Rewrite (fbrgFich) ;
Close (fbrgFich) ;
END ;
END ;
Informática – 3/Junio/2014 Publicar 2 PROCEDURE AniadirListaAlFichero (CONST argListaPruebas : targListaEquiposPrueba ;
iLongPruebas
: Integer ;
sNomFich
: tsCadNombres) ;
VAR
fbrgFich : tfbrgFichDatosPrueba ;
i
: Integer ;
BEGIN
Assign (fbrgFich, sNomFich) ;
Reset (fbrgFich) ;
Seek (fbrgFich, FileSize (fbrgFich)) ;
BEGIN
Assign (fbrgFich, sNomFich) ;
fniPruebasEnElFichero := FileSize (fbrgFich) ;
Close (fbrgFich) ;
END ;
VAR {---------------------- Variables del programa principal ------------}
argListaPruebas : targListaEquiposPrueba ;
iLongPruebas
: Integer ;
rgPruebaEquipo
: trgPruebas ;
sNomFich
: tsCadNombres ;
copcion, cEspera : Char ;
BEGIN {--------------------------- Programa Principal -------------------}
iLongPruebas := 0 ;
FOR i := 1 TO iLongPruebas DO
Write (fbrgFich, argListaPruebas[i]) ;
Close (fbrgFich) ;
END ;
PROCEDURE BuscarMejorTiempo (sNomFich : tsCadNombres ; VAR rgMejorEquipo : trgPruebas);
VAR
fbrgFich
: tfbrgFichDatosPrueba ;
rgPruebaEquipo : trgPruebas ;
iMilisegundosPrueba, iMilisegundosMejor : Integer ;
BEGIN
Assign (fbrgFich, sNomFich) ;
Reset (fbrgFich) ;
iMilisegundosMejor := MAXINT ;
WHILE NOT EOF (fbrgFich) DO
BEGIN
Read (fbrgFich, rgPruebaEquipo) ;
iMilisegundosPrueba := fniConvertirTiempoAMilisegundos
(rgPruebaEquipo.rgTiempoTotal) ;
IF iMilisegundosPrueba <= iMilisegundosMejor THEN
BEGIN
rgMejorEquipo
:= rgPruebaEquipo ;
iMilisegundosMejor := fniConvertirTiempoAMilisegundos
(rgMejorEquipo.rgTiempoTotal) ;
END ;
END ;
Close (fbrgFich) ;
END ;
PROCEDURE MostrarDatosPrueba (CONST rgPruebaEquipo : trgPruebas) ;
BEGIN
WITH rgPruebaEquipo DO
BEGIN
WriteLn (' Nombre del equipo: ', sNombreEquipo) ;
Write
('Tiempo provisional: ') ;
Writeln (rgTiempoProv.iMinutos, ':', rgTiempoProv.iSegundos, ',',
rgTiempoProv.iMilesimas);
WriteLn ('
CASE cOpcion OF
'1' : IF iLongPruebas < MAX_EQUIPOS THEN
BEGIN
iLongPruebas := iLongPruebas + 1 ;
LeerDatosPrueba (argListaPruebas [iLongPruebas]) ;
END
ELSE
BEGIN
Writeln ('ERROR: hay ', iLongPruebas,' no se admiten mas pruebas');
Writeln (' Primero guarda las pruebas en el fichero historicos ');
Writeln (' ... y vuelve a ejecutar la opcion 1') ;
END ;
'2' : BEGIN
Write ('Nombre del fichero de pruebas de Formula Student: ') ;
ReadLn (sNomFich) ;
CrearSiNoExiste (sNomFich) ;
AniadirListaAlFichero (argListaPruebas, iLongPruebas, sNomFich) ;
iLongPruebas := 0 ;
END ; { Caso '2'}
'3' : BEGIN
Write ('Nombre del fichero de pruebas de Formula Student: ') ;
ReadLn (sNomFich) ;
IF NOT FileExists (sNomFich) THEN
Write ('ERROR: No existe el fichero: ', sNomFich)
ELSE IF fniPruebasEnElFichero (sNomFich) = 0 THEN
Writeln ('ERROR: ningun equipo ha realizado la prueba')
ELSE
BEGIN
BuscarMejorTiempo (sNomFich, rgPruebaEquipo) ;
Writeln ('Equipo que ha realizado la prueba en menor tiempo es:');
MostrarDatosPrueba (rgPruebaEquipo) ;
END ;
END ; { Caso '3'}
END ; { CASE }
Penalizaciones: ', iPenalizaciones) ;
Write
('
Tiempo Total: ') ;
Writeln (rgTiempoTotal.iMinutos, ':', rgTiempoTotal.iSegundos, ',',
rgTiempoTotal.iMilesimas);
END ;
IF cOpcion <> '0' THEN
cEspera := ReadKey ;
END ;
UNTIL cOpcion = '0' ;
FUNCTION fniPruebasEnElFichero (sNomFich : tsCadNombres) : Integer ;
VAR
fbrgFich : tfbrgFichDatosPrueba ;
Informática – 3/Junio/2014 REPEAT
cOpcion := fncLeerOpcion ;
Publicar Writeln ('Pulsar una tecla para terminar') ;
cEspera := ReadKey ;
END.
3 Informática – 3/Junio/2014 Publicar 4 {------------------------------------- Otra version ---------------------------}
PROCEDURE BuscarMejorTiempo (sNomFich : tsCadNombres ; VAR rgMejorEquipo : trgPruebas);
VAR
fbrgFich
: tfbrgFichDatosPrueba ;
rgPruebaEquipo : trgPruebas ;
iMilisegundosPrueba, iMilisegundosMejor : Integer ;
BEGIN
Assign (fbrgFich, sNomFich) ;
Reset (fbrgFich) ;
IF NOT EOF (fbrgFich) THEN
BEGIN
Read (fbrgFich, rgMejorEquipo) ;
iMilisegundosMejor := fniConvertirTiempoAMilisegundos
(rgMejorEquipo.rgTiempoTotal) ;
WHILE NOT EOF (fbrgFich) DO
BEGIN
Read (fbrgFich, rgPruebaEquipo) ;
iMilisegundosPrueba := fniConvertirTiempoAMilisegundos
(rgPruebaEquipo.rgTiempoTotal) ;
IF iMilisegundosPrueba < iMilisegundosMejor THEN
BEGIN
rgMejorEquipo
:= rgPruebaEquipo ;
iMilisegundosMejor := fniConvertirTiempoAMilisegundos
(rgMejorEquipo.rgTiempoTotal) ;
END ;
END ;
END ;
Close (fbrgFich) ;
END ;
Informática – 3/Junio/2014 Publicar 5 
Descargar