{-----------------------------------------------------------------------------Programa: Mayo-2015 -------------------------------------------------------------------------------} PROGRAM ConcursoCocineros ; USES Crt, SysUtils ; TYPE tsCadCortas = STRING [9] ; tsCadLargas = STRING [25] ; PROCEDURE MostrarInscritos (sNomFich: tsCadLargas); VAR fbrgFich : tfbrgFichInscritos; rgUnCocinero : trgCocinero ; BEGIN Assign (fbrgFich, sNomFich) ; Reset (fbrgFich) ; trgCocinero = RECORD iInscripcion sNombre, sApellidos iEdad sTelefono rCalificacion END ; tfbrgFichInscritos = FILE OF : : : : : WHILE NOT EOF (fbrgFich) DO BEGIN Read (fbrgFich, rgUnCocinero) ; MostrarCocinero (rgUnCocinero) ; Writeln ; END ; Close (fbrgFich) ; END ; Integer ; tsCadLargas ; Integer ; tsCadCortas ; Real ; PROCEDURE EdadMenorMediaMayor (sNomFich: tsCadLargas ; VAR iMenor : Integer ; VAR rMedia : Real ; VAR iMayor : Integer) ; VAR fbrgFich : tfbrgFichInscritos; rgUnCocinero : trgCocinero ; rSuma : Real ; BEGIN iMenor := MAXiNT ; iMayor := - 1 ; rSuma := 0 ; trgCocinero ; tarPuntuacionJuez = ARRAY [1..9] OF Real ; trgEvaluacion = RECORD iCod_Juez, iInscripcion : Integer ; arPuntuaciones : tarPuntuacionJuez ; END ; tfbrgFichEvaluacionesTotales = FILE OF trgEvaluacion ; Assign (fbrgFich, sNomFich) ; Reset (fbrgFich) ; FUNCTION fncLeerOpcion : Char ; VAR cOpcion : Char ; BEGIN Writeln ('1. Mostrar el contenido de fichero de inscripcione') ; Mostrar las edades Mayor, Menor y Media de los participantes') ; Writeln ('2. Writeln ('3. Calcular la Puntuación obtenida por todos los participantes') ; WriteLn ('4. Mostrar los ganadores del concurso') ; Writeln ('0. Finalizar') ; REPEAT cOpcion := ReadKey ; UNTIL ('0' <= cOpcion) AND (cOpcion <= '4') ; Writeln (cOpcion) ; WHILE NOT EOF (fbrgFich) DO BEGIN Read (fbrgFich, rgUnCocinero) ; WITH rgUnCocinero DO BEGIN IF iEdad < iMenor THEN iMenor := iEdad ; IF iEdad > iMayor THEN iMayor := iEdad ; rSuma := rSuma + iEdad ; END ; END ; fncLeerOpcion := cOpcion ; END ; rMedia := rSuma / FileSize (fbrgFich) ; PROCEDURE MostrarCocinero (CONST rgUnCocinero : trgCocinero) ; BEGIN WITH rgUnCocinero DO BEGIN Writeln ('Cod. Inscripcion: ', iInscripcion) ; Writeln ('Apels, Nombre: ', sApellidos, ', ', sNombre) ; Writeln (' Edad: ', iEdad) ; Writeln (' Telefono: ', sTelefono) ; Writeln (' Puntuacion: ', rCalificacion) ; END ; END ; Close (fbrgFich) ; END ; FUNCTION fnrPuntosCocineroJuez (CONST arEvaluacionJuez: tarPuntuacionJuez) : Real; VAR i : Integer ; rSumaPuntos : Real ; BEGIN rSumaPuntos := 0 ; FOR i := 1 TO 9 DO rSumaPuntos := rSumaPuntos + arEvaluacionJuez[i] ; fnrPuntosCocineroJuez := END ; Curso 2014/2015 Mayo de 2015 1 Curso 2014/2015 rSumaPuntos / 9 ; { Para obtener la media 0 a 10} Mayo de 2015 2 BEGIN Assign (fbrgFich, sNomFichEvaluaciones) ; Reset (fbrgFich) ; FUNCTION fnrPuntosTotalesCocinero (iInscripcionBuscada : Integer; sNomFichEvaluaciones: tsCadLargas) : Real ; VAR rPuntos : Real ; fbrgFich : tfbrgFichEvaluacionesTotales; rgEvalJuez : trgEvaluacion ; iNumJueces : Integer ; BEGIN Assign (fbrgFich, sNomFichEvaluaciones) ; Reset (fbrgFich) ; rPuntosMaximos := - 1 ; WHILE NOT EOF (fbrgFich) DO BEGIN Read (fbrgFich, rgUnCocinero) ; WITH rgUnCocinero DO BEGIN IF (rInf <= iEdad) AND (iEdad < rSup) THEN IF rPuntosMaximos < rCalificacion THEN BEGIN rPuntosMaximos := rCalificacion ; rgMejorCocinero := rgUnCocinero END ; END ; END ; iNumJueces := 0 ; rPuntos := 0 ; WHILE NOT EOF (fbrgFich) DO BEGIN Read (fbrgFich, rgEvalJuez) ; IF rgEvalJuez.iInscripcion = iInscripcionBuscada THEN BEGIN iNumJueces := iNumJueces + 1 ; ; rPuntos := rPuntos + fnrPuntosCocineroJuez (rgEvalJuez.arPuntuaciones); END ; END ; Close (fbrgFich) ; fnrPuntosTotalesCocinero := END ; { rInf ≤ iEdad < rSup } Close (fbrgFich) ; END ; VAR {------------------ Variables del Programa Principal -------------} sNonFichInscritos, sNomFichEvaluaciones : tsCadLargas ; boExistenFicheros : Boolean ; cOpcion, cEspera : Char ; iMenor, iMayor : Integer ; rMedia : Real ; rgMejorCocinero : trgCocinero ; rPuntos / iNumJueces ; PROCEDURE PuntuarTodosCocineros (sNonFichInscritos, sNomFichEvaluaciones : tsCadLargas) ; VAR fbrgFich : tfbrgFichInscritos; rgUnCocinero : trgCocinero ; rPuntos : Real ; BEGIN Assign (fbrgFich, sNonFichInscritos) ; Reset (fbrgFich) ; BEGIN {----------------- Programa Principal -----------------------} Write ('Escribe el nombre del fichero de Inscritos: ') ; ReadLn (sNonFichInscritos) ; Write ('.....nombre del fichero de la evaluaciones: ') ; ReadLn (sNomFichEvaluaciones) ; WHILE NOT EOF (fbrgFich) DO BEGIN Read (fbrgFich, rgUnCocinero) ; boExistenFicheros := TRUE ; IF NOT FileExists (sNonFichInscritos) THEN BEGIN Writeln ('ERROR: no existe el fichero ', sNonFichInscritos) ; boExistenFicheros := FALSE ; END ; rPuntos := fnrPuntosTotalesCocinero (rgUnCocinero.iInscripcion, sNomFichEvaluaciones) ; rgUnCocinero.rCalificacion := rPuntos ; IF Seek (fbrgFich, FilePos (fbrgFich) - 1); Write (fbrgFich, rgUnCocinero) ; END ; Close (fbrgFich) ; END ; IF PROCEDURE MejorPuntuacionRango (sNomFichEvaluaciones : tsCadLargas; rInf, rSup : Real; VAR rgMejorCocinero :trgCocinero) ; VAR fbrgFich : tfbrgFichInscritos; rgUnCocinero : trgCocinero ; rPuntosMaximos : Real ; Curso 2014/2015 Mayo de 2015 3 NOT FileExists (sNomFichEvaluaciones) THEN BEGIN Writeln ('ERROR: no existe el fichero ', sNomFichEvaluaciones) ; boExistenFicheros := FALSE ; END ; boExistenFicheros THEN REPEAT cOpcion := fncLeerOpcion ; CASE cOpcion OF '1' : BEGIN Writeln ('Listado de información de cocineros inscritos') ; MostrarInscritos (sNonFichInscritos) ; END ; Curso 2014/2015 Mayo de 2015 4 '2' : BEGIN EdadMenorMediaMayor (sNonFichInscritos, iMenor, rMedia, iMayor); Writeln ('Edad menor: ', iMenor) ; Writeln (' media: ', rMedia:0:2) ; Writeln (' superior: ', iMayor) ; END ; '3' : PuntuarTodosCocineros (sNonFichInscritos, sNomFichEvaluaciones) ; '4' : BEGIN EdadMenorMediaMayor (sNonFichInscritos, iMenor, rMedia, iMayor) ; MejorPuntuacionRango (sNomFichEvaluaciones, iMenor, rMedia, rgMejorCocinero) ; {=======================================================================} { Mostrar los ganadores, de otra forma } {=======================================================================} VAR {------------------ Variables del Programa Principal -------------} ... rgMejorCocineroJoven : trgCocinero ; rgMejorCocinerVeterano : trgCocinero ; BEGIN {----------------- Programa Principal -----------------------} ... WriteLn ('Cocinero ganador de entre los jóvenes', ' (entre ', iMenor, ' y ', rMedia:0:1 , ' )') ; MostrarCocinero (rgMejorCocinero) ; Writeln ; '4' : BEGIN EdadMenorMediaMayor (sNonFichInscritos, iMenor, rMedia, iMayor) ; MejorPuntuacionRango (sNomFichEvaluaciones, iMenor, rMedia, rgMejorJoven) ; { Se pone iMayor + 1 para que tenga en cuenta también el valor iMayor } { pues el rango que va a tener en cuenta en el procedure es: rInf ≤ iEdad < rSup } WriteLn ('Cocinero ganador de entre los jóvenes', ' (entre ', iMenor, ' y ', rMedia:0:1 , ' )') ; MostrarCocinero (rgMejorJoven) ; Writeln ; MejorPuntuacionRango (sNomFichEvaluaciones, rMedia, iMayor + 1, rgMejorCocinero) ; WriteLn ('Cocinero ganador de entre los veteranos', ' (entre ', rMedia:0:1, ' y ', iMayor + 1, ' )') ; MostrarCocinero (rgMejorCocinero) ; { Se poner iMayor + 1 para que tenga en cuenta también el valor iMayor } { pues el rango que va a tener en cuenta en el procedure es: rInf ≤ iEdad < rSup } MejorPuntuacionRango (sNomFichEvaluaciones, rMedia, iMayor + 1, rgMejorVeterano) ; { Se pone iMayor + 1 para que tenga en cuenta también el valor iMayor } MejorPuntuacionRango (sNomFichEvaluaciones, iMenor, iMayor + 1, rgMejorCocinero) ; WriteLn ('Cocinero ganador de entre los veteranos', ' (entre ', rMedia:0:1, ' y ', iMayor, ' )') ; MostrarCocinero (rgMejorVeterano) ; WriteLn ('Cocinero ganador absoluto del concurso') ; MostrarCocinero (rgMejorCocinero) ; END ; WriteLn ('Cocinero ganador absoluto del concurso') ; IF rMejorJoven.rCalificacion > rMejorVeterano.rCalificacion THEN MostrarCocinero (rgMejorJoven) ; ELSE MostrarCocinero (rgMejorVeterano) ; END ; END ; IF cOpcion <> '0' THEN cEspera := ReadKey ; UNTIL cOpcion = '0' ; Writeln ; Write ('Pulsa una tecla para finalizar') ; cEspera := ReadKey ; END . Curso 2014/2015 Mayo de 2015 5 Curso 2014/2015 Mayo de 2015 6