PROGRAM Julio_2011 ; USES Crt, SysUtils ; PROCEDURE CrearArrayEstadisticas ( sNomFichRadar: tsCadNombres ; VAR aiEstadisticas: taiDatosEstadisticas) ; VAR cIndice : Char ; tfbrgFichRadar : tfbrgFicherosRadares ; rgVehiculo : targDatosVehiculo ; BEGIN FOR cIndice := 'A' TO 'D' DO aiEstadisticas [cIndice] := 0 ; TYPE tsCadNombres = String [20] ; tsCadMatriculas = String [10] ; trgInstantes = RECORD iHoras, iMinutos, iSegundos : Integer ; END ; targDatosVehiculo = RECORD sMatricula cCategoriaV rgInstante rVelocidad END ; : : : : Assign (tfbrgFichRadar, sNomFichRadar) ; Reset (tfbrgFichRadar) ; WHILE NOT EOF (tfbrgFichRadar) DO BEGIN Read (tfbrgFichRadar, rgVehiculo) ; tsCadMatriculas ; Char ; trgInstantes ; Real ; cIndice := rgVehiculo.cCategoriaV ; tfbrgFicherosRadares = FILE OF targDatosVehiculo ; aiEstadisticas [cIndice] := aiEstadisticas [cIndice] + 1 ; END ; Close (tfbrgFichRadar) ; END ; targDatosInfractor = RECORD sMatricula : tsCadMatriculas ; rgInstante : trgInstantes ; rVelocidad : Real ; END ; PROCEDURE MostarEstadisticas (CONST aiEstadisticas : taiDatosEstadisticas) ; VAR cIndice : Char ; BEGIN Writeln ; Writeln ('Numero de vehiculos de cada Categoria') ; Writeln ; tfbrgFicherosInfractores = FILE OF targDatosInfractor ; taiDatosEstadisticas = ARRAY ['A'..'D'] OF Integer ; VAR cOpcion, cEspera sNomFichEntrada, rDistanciaTramo, aiEstadisticas : FOR cIndice := 'A' TO 'D' DO Write ('Modelo ':9, cIndice) ; Writeln ; : Char ; sNomFichSalida, sNomFichInfractores : tsCadNombres ; rVelocidadLimite : Real ; taiDatosEstadisticas ; FOR cIndice := 'A' TO 'D' DO Write (aiEstadisticas [cIndice]:10) ; Writeln ; END ; FUNCTION fncLeerOpcion : Char ; VAR cOpcion : Char ; BEGIN ClrScr ; Writeln ('========== Menu de opciones ==========') ; Writeln (' 1 Estadisticas') ; Writeln (' 2 Cálculo de infractores') ; Writeln (' 3 Mostar infracciones') ; Writeln ; Writeln (' 0 Salir del programa') ; Writeln ; Write (' Pulsa el numero de la opcion: ') ; FUNCTION fnrPasarASegundos (CONST rgInstante : trgInstantes) : Real ; BEGIN WITH rgInstante DO fnrPasarASegundos := iHoras * 3600.0 + iMinutos * 60.0 + iSegundos ; END ; PROCEDURE BusquedaInstanteSalidaTramo (sMatriculaBuscar : tsCadMatriculas ; CONST rgInstanteEntrada : trgInstantes ; sNomFichSalida : tsCadNombres ; VAR rgInstanteSalida : trgInstantes ; VAR boSalidaTramo : Boolean) ; VAR tfbrgFichSalida : tfbrgFicherosRadares ; rgVehiculo : targDatosVehiculo ; sSegundosInstanteEntrada : Real ; BEGIN boSalidaTramo := FALSE ; REPEAT cOpcion := ReadKey ; UNTIL ('0' <= cOpcion) AND (cOpcion <= '3') ; Writeln (cOpcion) ; fncLeerOpcion := cOpcion ; END ; Assign (tfbrgFichSalida, sNomFichSalida) ; Reset (tfbrgFichSalida) ; Informática Julio-2011 1 Informática Julio-2011 2 IF boSalidaTramo THEN { Si se han encontrado datos de la salida } BEGIN rVelocidadMedia := fnrCalculoVelocidadMedia (rgVehiculoEntrada.rgInstante, rgInstanteSalida, rDistanciaTramo) ; sSegundosInstanteEntrada := fnrPasarASegundos (rgInstanteEntrada) ; WHILE NOT boSalidaTramo AND NOT EOF (tfbrgFichSalida) DO BEGIN Read (tfbrgFichSalida, rgVehiculo) ; WITH rgVehiculo DO IF (sMatricula = sMatriculaBuscar) AND (sSegundosInstanteEntrada < fnrPasarASegundos (rgInstante)) THEN BEGIN boSalidaTramo := TRUE ; rgInstanteSalida := rgInstante END ; END ; Close END ; IF rVelocidadMedia > rVelocidadLimite THEN BEGIN rgVehiculoInfractor.sMatricula := rgVehiculoEntrada.sMatricula ; rgVehiculoInfractor.rgInstante := rgVehiculoEntrada.rgInstante ; rgVehiculoInfractor.rVelocidad := rVelocidadMedia ; Write (tfbrgFichInfractores, rgVehiculoInfractor) ; END ; END ; (tfbrgFichSalida) ; END ; Close (tfbrgFichInfractores) ; FUNCTION fnrCalculoVelocidadMedia (CONST rgInstanteEntrada, rgInstanteSalida : trgInstantes ; rDistancia : Real) : Real ; VAR rsegundosEntrada, rSegundosSalida : Real ; BEGIN rSegundosEntrada := fnrPasarASegundos (rgInstanteEntrada) ; rSegundosSalida := fnrPasarASegundos (rgInstanteSalida) ; Close (tfbrgFichRadarEntrada) ; END ; PROCEDURE MostrarFicheroInfracciones (sNomFichInfractores : tsCadNombres) ; VAR tfbrgFichInfractores : tfbrgFicherosInfractores ; rgVehiculoInfractor : targDatosInfractor ; BEGIN Assign (tfbrgFichInfractores, sNomFichInfractores) ; Reset (tfbrgFichInfractores) ; { Velocidad media en Km / Hora } fnrCalculoVelocidadMedia := rDistancia /(rSegundosSalida - rSegundosEntrada) * 3600.0 ; END ; Writeln ('----- Listado de infracciones -----') ; Writeln ; Writeln ('Matricula': 12, 'Hora':10 , 'Velocidad media KM/H') ; PROCEDURE CrearFicheroInfracciones (sNomFichEntrada, sNomFichSalida, sNomFichInfractores : tsCadNombres ; rDistanciaTramo, rVelocidadLimite : Real) ; VAR tfbrgFichRadarEntrada : tfbrgFicherosRadares ; rgVehiculoEntrada : targDatosVehiculo ; tfbrgFichInfractores rgVehiculoInfractor : tfbrgFicherosInfractores ; : targDatosInfractor ; rVelocidadMedia rgInstanteSalida boSalidaTramo : Real ; : trgInstantes ; : Boolean ; WHILE NOT EOF (tfbrgFichInfractores) DO BEGIN Read (tfbrgFichInfractores, rgVehiculoInfractor) ; WITH rgVehiculoInfractor, rgInstante DO WriteLn (sMatricula: 10, iHoras:4, ':', iMinutos:2, ':', iSegundos:2, rVelocidad:14:2) ; END ; Writeln ('-------------- Fin del listado -------------------') ; Close (tfbrgFichInfractores) ; END ; BEGIN Assign (tfbrgFichRadarEntrada, sNomFichEntrada) ; Reset (tfbrgFichRadarEntrada) ; BEGIN { ---------------- Programa Principal ----------------} Write ('Nombre del fichero del Radar de Entrada: ') ; ReadLn (sNomFichEntrada) ; Write (' fichero del Radar de Salida: ') ; ReadLn (sNomFichSalida) ; Assign (tfbrgFichInfractores, sNomFichInfractores) ; ReWrite (tfbrgFichInfractores) ; WHILE NOT EOF (tfbrgFichRadarEntrada) DO BEGIN Read (tfbrgFichRadarEntrada, rgVehiculoEntrada) ; Writeln ; Write ('Distancia en Km del tramo a controlar: ') ; ReadLn (rDistanciaTramo) ; Write ('Limite de velocidad media en el tramo: ') ; ReadLn (rVelocidadLimite) ; BusquedaInstanteSalidaTramo (rgVehiculoEntrada.sMatricula, rgVehiculoEntrada.rgInstante, sNomFichSalida, rgInstanteSalida, boSalidaTramo) ; Informática Julio-2011 3 Informática Julio-2011 4 REPEAT cOpcion := fncLeerOpcion ; CASE cOpcion OF '1' : BEGIN CrearArrayEstadisticas (sNomFichEntrada, aiEstadisticas) ; MostarEstadisticas (aiEstadisticas) ; END ; '2' : BEGIN sNomFichInfractores := sNomFichEntrada ; sNomFichInfractores [1] := 'I' ; Write ('Nombre del fichero del Radar de Infractores: ') ; Writeln (sNomFichInfractores) ; CrearFicheroInfracciones (sNomFichEntrada, sNomFichSalida, sNomFichInfractores, rDistanciaTramo, rVelocidadLimite) END ; '3' : BEGIN Write ('Escribe el nombre del fichero de Infractores: ') ; ReadLn (sNomFichInfractores) ; IF FileExists (sNomFichInfractores) THEN MostrarFicheroInfracciones (sNomFichInfractores) ELSE Writeln ('ERROR: No existe el fichero ', sNomFichInfractores) ; END ; END ; { CASE } IF cOpcion BEGIN Writeln cEspera END ; UNTIL cOpcion = <> '0' THEN ; := ReadKey ; '0' ; Writeln ; WriteLn ('Pulsa RETURN para terminar') ; ReadLn ; END. { PROGRAMAREN BUKAERA - FIN del PROGRAMA } Informática Julio-2011 5