P_97_E_4-Gestion+de+lista+de+vuelos

=__**Gestión de una lista de vuelos**__=

> Realizar un programa que permita gestionar la información > referente a los vuelos diarios que parten desde un aeropuerto.

> La información se almacena en un array con un máximo 12 registros. > Cada registro contiene la siguiente información sobre el vuelo correspondiente:

>> a) Número de vuelo.(No tiene porqué‚ coincidir con el índice del array) >> b) Destino >> c) Hora de partida: >>> Que, a su vez, tiene dos componentes: >>> c.1) Hora: 0 .. 23 >>> c.2) Minutos: 0 .. 59 >> d) Número de plazas libres

> El programa debe permitir realizar las siguientes operaciones

>> 1. Añadir información de un vuelo >> 2. Mostrar información de un vuelo >> 3. Cambio de horario de un vuelo >> 4. Cambio de las plazas libres de un vuelo >> 5. Borrar la información de un vuelo >> 6. Mostrar todos los vuelos >> 0. Salir

>> **Nota**: Supondremos que el usuario siempre introduce valores correctos

code format="pascal" PROGRAM P_97_E_4 ; USES Crt ; CONST iMAX_VUELOS = 12 ; TYPE tsCadDestino = String [20] ; tsCad2      = String [2] ; trgHorario = RECORD sHora, sMinutos : tsCad2; END ;

trgVuelo = RECORD iNumVuelo    : Integer ; sDestino     : tsCadDestino ; rgHoraSalida : trgHorario ; iPlazasLibres : Integer ; END ;

targInformacion = ARRAY [1..iMAX_VUELOS] OF trgVuelo ;

FUNCTION fncLeerOpcion : Char ; VAR cOpcion : Char ; BEGIN WriteLn ('********* MENU DE OPCIONES *********') ; WriteLn ('1.- Añadir un nuevo vuelo') ; WriteLn ('2.- Mostrar información de un vuelo') ; WriteLn ('3.- Modificar horario de salida de vuelo') ; WriteLn ('4.- Eliminar información de un vuelo') ; WriteLn ('5.- Mostrar información de todos los vuelos'); WriteLn ('0.- Terminar') ; WriteLn ;

Write (' Pulsa la tecla de la opción: ') ; REPEAT cOpcion := ReadKey UNTIL ('0' <= cOpcion) AND (cOpcion <= '3') ;

WriteLn (cOpcion) ; WriteLn ;

fncLeerOpcion := cOpcion ; END ;

PROCEDURE LeerVuelo (VAR rgVuelo : trgVuelo) ; BEGIN WITH rgVuelo, rgHoraSalida DO     BEGIN Write  ('  Número de vuelo: ') ; Readln (iNumVuelo) ; Write  ('Destino del vuelo: ') ; Readln (sDestino) ; Writeln ('  Hora de salida: ') ; Write  ('         Hora(hh): ') ; Readln (sHora) ; Write  ('      Minutos(mm): ') ; Readln (sMinutos) ; Write  ('    Plazas libres: ') ; Readln (iPlazasLibres) ; Writeln ; END END ;

PROCEDURE MostrarVuelo (CONST rgVuelo : trgVuelo) ; BEGIN WITH rgVuelo, rgHoraSalida DO     BEGIN Writeln ('Número de vuelo: ', iNumVuelo) ; Writeln ('       Destino: ', sDestino) ; Writeln (' Hora de salida') ; Writeln ('          Hora: ', sHora) ; Writeln ('       Minutos: ', sMinutos) ; Writeln (' Plazas libres: ', iPlazasLibres) ; Writeln END ; END ;

FUNCTION fniBuscarVuelo (iNumVueloBusc : Integer ;                          CONST argInformacion : targInformacion ;                                iCantVuelos : Integer) : Integer ; VAR i           : Integer ; boEncontrado : Boolean ; BEGIN boEncontrado := FALSE ; i := 1 ;

WHILE NOT boEncontrado AND (i <= iCantVuelos ) DO     IF argInformacion [i].iNumVuelo = iNumVueloBusc THEN boEncontrado := TRUE ELSE i := i + 1 ;

IF boEncontrado THEN fniBuscarVuelo := i  ELSE fniBuscarVuelo := 0 END ;

PROCEDURE AniadirInfoVueloRepetido (VAR argInformacion  : targInformacion ;               VAR iCantidadVuelos : Integer) ; BEGIN IF iCantidadVuelos = iMAX_VUELOS  THEN Writeln ('Error: No se pueden añadir más vuelos') ELSE BEGIN iCantidadVuelos := iCantidadVuelos + 1 ;

LeerVuelo (argInformacion[iCantidadVuelos]) ; END ; END ;

PROCEDURE AniadirInfoVuelo (VAR argInformacion : targInformacion;               VAR iCantidadVuelos    : Integer) ; VAR rgNuevoVuelo: trgVuelo ; iPosic : Integer ; BEGIN IF iCantidadVuelos = iMAX_VUELOS  THEN Writeln ('Error: No se pueden añadir más vuelos') ELSE BEGIN LeerVuelo (rgNuevoVuelo) ; iPosic := fniBuscarVuelo (rgNuevoVuelo.iNumVuelo,                                argInformacion, iCantidadVuelos) ; IF iPosic <> 0 THEN BEGIN iCantidadVuelos := iCantidadVuelos + 1 ; argInformacion [iCantidadVuelos] := rgNuevoVuelo ; END ELSE Writeln ('Ya hay vuelo: ', rgNuevoVuelo.iNumVuelo) END ; END;

PROCEDURE MostrarInfoVuelo (CONST argInformacion : targInformacion;                     iCantidadVuelos    : Integer) ; VAR iNumVueloBusc, iPosic : Integer ; BEGIN Write ('Nº vuelo a consultar: '); Readln (iNumVueloBusc) ; Writeln ;

iPosic := fniBuscarVuelo (iNumVueloBusc,                               argInformacion,                               iCantidadVuelos) ;

IF iPosic <> 0 THEN MostrarVuelo (argInformacion [iPosic]) ELSE Writeln ('No existe el vuelo: ', iNumVueloBusc) ; END;

PROCEDURE ModificarHorarioVuelo (CONST argInfor : targInformacion;                           iCantVuelos : integer) ; VAR iNumVueloModif, iPosic : Integer ; BEGIN Write ('Nº vuelo a modificar: '); Readln (iNumVueloModif) ;

iPosic := fniBuscarVuelo (iNumVueloModif,                               argInfor, iCantVuelos) ; IF iPosic <> 0 THEN BEGIN MostrarVuelo (argInfor [iPosic]) ; WITH argInfor [iPosic].rgHoraSalida DO        BEGIN Writeln (' Nueva Hora de salida') ; Write  ('            Hora(hh): ') ; ReadLn (sHora) ; Write  ('         Minutos(mm): ') ; ReadLn (sMinutos) ; END ; END ELSE Writeln ('No existe el vuelo: ', iNumVueloModif) ; END;

PROCEDURE ModificarPlazaLibres (VAR argInfor   : targInformacion ;                          iCantVuelos : Integer) ; VAR iVuelo, iPosic, iPlazasReservar: Integer ; BEGIN Write ('Nº vuelo a modificar: '); Readln (iVuelo) ; iPosic := fniBuscarVuelo (iVuelo, argInfor, iCantVuelos) ; IF iPosic <> 0 THEN BEGIN MostrarVuelo (argInfor [iPosic]) ; WITH argInfor [iPosic] DO        BEGIN Writeln ('Hay ', iPlazasLibres, '¿cuántas reservas?:'); ReadLn (iPlazasReservar) ; IF iPlazasReservar > iPlazasLibres THEN BEGIN iPlazasReservar := iPlazasLibres ; Writeln ('Solo se reservan: ', iPlazasLibres) ; END ; iPlazasLibres := iPlazasLibres - iPlazasReservar ; END ; END ELSE Writeln ('No existe el vuelo: ', iVuelo) ; END;

PROCEDURE BorrarVuelo (VAR argInfor : targInformacion;                VAR iCantVuelos : Integer ;                     iPosicion  : Integer) ; VAR i : Integer ; BEGIN

FOR i := iPosicion + 1 TO iCantVuelos DO       argInfor[i - 1] := argInfor [i] ;

iCantVuelos := iCantVuelos - 1 ; END ;

PROCEDURE EliminarUnVuelo (VAR argInfor : targInformacion ;                     VAR iCantVuelos : Integer) ; VAR iVuelo, iPosic : Integer ; cResp : Char ; BEGIN Write ('Nº vuelo a elimninar: '); Readln (iVuelo) ;

iPosic := fniBuscarVuelo (iVuelo,                               argInfor, iCantVuelos) ; IF iPosic <> 0 THEN BEGIN MostrarVuelo (argInfor [iPosic]) ;

Write ('¿Eliminar este vuelo? (S/N): ') ; Readln (cResp) ;

IF UpCase (cResp) = 'S' THEN BorrarVuelo (argInfor, iCantVuelos, iPosic) ; END ELSE Writeln ('No existe el vuelo: ', iVuelo) ; END;

PROCEDURE ListarLosVuelos (CONST argInformacion : targInformacion ;                       iCantVuelos    : Integer) ; VAR i : Integer ; cEspera : Char ; BEGIN Writeln (' La información de todos los vuelos es:') ;

FOR i := 1 TO iCantVuelos DO      BEGIN MostrarVuelo (argInformacion [i]) ;

cEspera := Readkey END ; Writeln ('-'); END ;

VAR argInfor    : targInformacion ; iCantVuelos : Integer ; cOpcion     : Char ;

BEGIN { Programa principal - }

iCantVuelos := 0 ; REPEAT cOpcion := fncLeerOpcion; CASE cOpcion OF      '1': AniadirInfoVuelo (argInfor, iCantVuelos) ; '2': MostrarInfoVuelo (argInfor, iCantVuelos) ; '3': ModificarHorarioVuelo (argInfor, iCantVuelos); '4': ModificarPlazaLibres (argInfor, iCantVuelos); '5': EliminarUnVuelo (argInfor, iCantVuelos); '6': ListarLosVuelos (argInfor, iCantVuelos) END ;

IF cOpcion <> '0' THEN cEspera := ReadKey ; UNTIL cOpcion = '0' ;

Writeln ; Writeln ('Pulsa una tecla para finalizar') ; cEspera := ReadKey ; END. { FIN DE P_97_e_4.PAS } code