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