PROGRAM Informatika_2013ko_maiatzaren_azterketa ; USES Crt, SysUtils ; CONST iMAX_TXARTELAK = 5000 ; TYPE DM_sKateLabur = String [13] ; DM_sKateLuze = String [23] ; DM_rgTxartela = RECORD iTxartelZenbakia : LongInt ; sNA : DM_sKateLabur ; sData, sSarreraOrdua, sIrteeraOrdua : DM_sKateLabur ; boIrtenDa : Boolean ; END ; DM_argTxartelenZerrenda = ARRAY [1..iMAX_TXARTELAK] OF DM_rgTxartela ; DM_frgTxartelenFitxategia = FILE OF DM_rgTxartela ; PROCEDURE SortuEzBadago (sFitxategiIzen : DM_sKateLuze) ; VAR frgFitxategi : DM_frgTxartelenFitxategia ; BEGIN IF NOT FileExists (sFitxategiIzen) THEN BEGIN Assign (frgFitxategi, sFitxategiIzen) ; ReWrite (frgFitxategi) ; Close (frgFitxategi) ; END ; END ; FUNCTION fncAukeraIrakurri : Char ; VAR cAukera : Char ; BEGIN ClrScr ; Writeln ; Writeln ('====================== Menuaren aukerak ==================') ; Writeln (' 1. Eraikinera SARRERA berri bat GEHITU') ; Writeln (' 2. Pertsona bat eraikinetik IRTEN dela GRABATU') ; Writeln (' 3. Fitxategia TRINKOTU') ; Writeln (' 4. Fitxategian txartel bat BILATU') ; Writeln (' 5. Eraikinaren barruan daudenen datuak ERAKUTSI') ; Writeln (' 0. Amaitu') ; Writeln ; Write (' Aukeraren zenbakia hautatu: ') ; REPEAT cAukera := ReadKey ; UNTIL ('0' <= cAukera) AND (cAukera <= '5') ; Writeln (cAukera) ; fncAukeraIrakurri := cAukera ; END ; PROCEDURE TxartelarenDatuakIrakurri (VAR rgTxartela : DM_rgTxartela) ; BEGIN WITH rgTxartela DO BEGIN Write (' Txartelaren zenbakia: ') ; ReadLn (iTxartelZenbakia) ; Write (' NA: ') ; ReadLn (sNA) ; Write (' Data (2013/06/22): ') ; ReadLn (sData) ; Write ('Sarreraren ordua (13:30:59): ') ; ReadLn (sSarreraOrdua) ; sIrteeraOrdua := '' ; boIrtenDa := FALSE ; END ; END ; PROCEDURE TxartelarenDatuakErakutsi (CONST rgTxartela : DM_rgTxartela) ; BEGIN WITH rgTxartela DO BEGIN WriteLn ('Txartel zenbakia: ', iTxartelZenbakia) ; WriteLn (' NA: ', sNA) ; WriteLn (' Data: ', sData) ; WriteLn ('Sarreraren ordua: ', sSarreraOrdua) ; WriteLn (' Irteearen ordua: ', sIrteeraOrdua) ; END ; END ; PROCEDURE SarreraAintzatHartu (CONST rgSarreraDatuak : DM_rgTxartela ; sFitxategiIzen : DM_sKateLuze) ; VAR rgTxartela, rgLaguntzaileDatuak : DM_rgTxartela ; frgFitxategi : DM_frgTxartelenFitxategia ; boIrtendakoTxartelaAurkiturik : Boolean ; BEGIN Assign (frgFitxategi, sFitxategiIzen) ; Reset (frgFitxategi) ; boIrtendakoTxartelaAurkiturik := FALSE ; WHILE NOT EOF (frgFitxategi) AND NOT boIrtendakoTxartelaAurkiturik DO BEGIN Read (frgFitxategi, rgTxartela) ; IF rgTxartela.boIrtenDa = TRUE THEN boIrtendakoTxartelaAurkiturik:= TRUE ; END ; rgLaguntzaileDatuak :=rgSarreraDatuak ; IF boIrtendakoTxartelaAurkiturik THEN BEGIN Seek (frgFitxategi, FilePos(frgFitxategi) - 1) ; Write (frgFitxategi, rgLaguntzaileDatuak) ; END ELSE Write (frgFitxategi, rgLaguntzaileDatuak) ; { OHARRA: zilegia da ere honako hau egitea Write (frgFitxategi, rgSarreraDatuak) ; } Close (frgFitxategi) ; END ; PROCEDURE IrteeraGrabatu (iIrtendakoarenTxartelZenbakia : LongInt ; sIrteeraOrdua : DM_sKateLabur ; sFitxategiIzen : DM_sKateLuze) ; VAR rgTxartela : DM_rgTxartela ; frgFitxategi : DM_frgTxartelenFitxategia ; boIrtendakoTxartelaAurkiturik : Boolean ; BEGIN Assign (frgFitxategi, sFitxategiIzen) ; Reset (frgFitxategi) ; boIrtendakoTxartelaAurkiturik := FALSE ; WHILE NOT EOF (frgFitxategi) AND NOT boIrtendakoTxartelaAurkiturik DO BEGIN Read (frgFitxategi, rgTxartela) ; IF (rgTxartela.iTxartelZenbakia = iIrtendakoarenTxartelZenbakia) AND (rgTxartela.boIrtenDa = FALSE) THEN BEGIN boIrtendakoTxartelaAurkiturik := TRUE ; rgTxartela.sIrteeraOrdua := sIrteeraOrdua ; rgTxartela.boIrtenDa := TRUE ; Seek (frgFitxategi, FilePos(frgFitxategi) - 1) ; Write (frgFitxategi, rgTxartela) ; Writeln ('--------- Irteera grabatuta txartelean ---------') ; END ; END ; IF NOT boIrtendakoTxartelaAurkiturik THEN Writeln ('ERROREA: zenbaki horretako txartelik ez da aurkitu: ', iIrtendakoarenTxartelZenbakia); Close (frgFitxategi) ; END ; PROCEDURE BarruanDaudenenTxartelakZerrendara ( sFitxategiIzen : DM_sKateLuze ; VAR argZerrenda : DM_argTxartelenZerrenda ; VAR iLuzera : Integer) ; VAR rgTxartela : DM_rgTxartela ; frgFitxategi : DM_frgTxartelenFitxategia ; BEGIN Assign (frgFitxategi, sFitxategiIzen) ; Reset (frgFitxategi) ; iLuzera := 0 ; WHILE NOT EOF (frgFitxategi) DO BEGIN Read (frgFitxategi, rgTxartela) ; IF rgTxartela.boIrtenDa = FALSE THEN BEGIN iLuzera := iLuzera + 1 ; argZerrenda [iLuzera] := rgTxartela ; END ; END ; Close (frgFitxategi) ; END ; PROCEDURE ZerrendakoTxartelakFitxategira (CONST argZerrenda : DM_argTxartelenZerrenda ; iLuzera : Integer ; sFitxategiIzen : DM_sKateLuze) ; VAR rgLaguntzaileDatuak : DM_rgTxartela ; frgFitxategi : DM_frgTxartelenFitxategia ; i : Integer ; BEGIN Assign (frgFitxategi, sFitxategiIzen) ; ReWrite (frgFitxategi) ; FOR i := 1 TO iLuzera DO BEGIN rgLaguntzaileDatuak := argZerrenda [i] ; Write (frgFitxategi, rgLaguntzaileDatuak) ; { OHARRA: hau ere onargarria da Write (frgFitxategi, argZerrenda [i]) ; } END ; Close (frgFitxategi) ; END ; PROCEDURE FitxategiaTrinkotu (sFitxategiIzen: DM_sKateLuze) ; VAR argZerrenda : DM_argTxartelenZerrenda ; iLuzera : Integer ; BEGIN BarruanDaudenenTxartelakZerrendara (sFitxategiIzen, argZerrenda, iLuzera) ; ZerrendakoTxartelakFitxategira (argZerrenda, iLuzera, sFitxategiIzen) ; END ; PROCEDURE TxartelaBilatuEtaErakutsi (iBilatzenDenTxartelZenbakia : LongInt ; sFitxategiIzen : DM_sKateLuze) ; VAR rgTxartela : DM_rgTxartela ; frgFitxategi : DM_frgTxartelenFitxategia ; boAurkitua : Boolean ; BEGIN Assign (frgFitxategi, sFitxategiIzen) ; Reset (frgFitxategi) ; boAurkitua := FALSE ; WHILE NOT EOF (frgFitxategi) DO BEGIN Read (frgFitxategi, rgTxartela) ; IF rgTxartela.iTxartelZenbakia = iBilatzenDenTxartelZenbakia THEN BEGIN boAurkitua := TRUE ; Writeln ('Txartelaren datuak: ') ; Writeln ; TxartelarenDatuakErakutsi (rgTxartela) ; IF rgTxartela.boIrtenDa = FALSE THEN WriteLn ('Pertsona hau eraikinaren BARRUAN dago') ELSE WriteLn ('Pertsona hau eraikinatik KANPO dago') END ; END ; IF NOT boAurkitua THEN Writeln (iBilatzenDenTxartelZenbakia, ' zenbakidun txartelik ez da aurkitu') ; Close (frgFitxategi) ; END ; PROCEDURE BarruanDaudenenTxartelakErakutsi (sFitxategiIzen : DM_sKateLuze) ; VAR rgTxartela : DM_rgTxartela ; frgFitxategi : DM_frgTxartelenFitxategia ; cItxaron : Char ; BEGIN Assign (frgFitxategi, sFitxategiIzen) ; Reset (frgFitxategi) ; WHILE NOT EOF (frgFitxategi) DO BEGIN Read (frgFitxategi, rgTxartela) ; IF rgTxartela.boIrtenDa = FALSE THEN BEGIN TxartelarenDatuakErakutsi (rgTxartela) ; cItxaron := ReadKey ; WriteLn (cItxaron) ; END ; END ; Close (frgFitxategi) ; END ; {--------------- Programa Nagusiko aldagaiak ---------------------} VAR cAukera, cItxaron : Char ; sFitxategiIzen : DM_sKateLuze ; rgSarreraDatuak : DM_rgTxartela ; iTxartelZenbakia : LongInt ; sUnekoOrdua : DM_sKateLabur ; BEGIN {------------------- Programa Nagusia -------------------------} Write ('Eraikinari dagokion fitxategiaren izena eman: ') ; ReadLn (sFitxategiIzen) ; SortuEzBadago (sFitxategiIzen) ; REPEAT cAukera := fncAukeraIrakurri ; CASE cAukera OF '1' : BEGIN TxartelarenDatuakIrakurri (rgSarreraDatuak) ; SarreraAintzatHartu (rgSarreraDatuak, sFitxategiIzen) ; Writeln ; Writeln ('--------- Txartel berri bat gehituta ---------') ; Writeln ; END ; '2' : BEGIN Write ('Txartelaren zenbakia eman: ') ; ReadLn (iTxartelZenbakia) ; Write (' Uneko ordua: ') ; ReadLn (sUnekoOrdua) ; IrteeraGrabatu (iTxartelZenbakia, sUnekoOrdua, sFitxategiIzen) ; END ; '3' : BEGIN FitxategiaTrinkotu (sFitxategiIzen) ; Writeln ; Writeln ('--------- Fitxategia trinkotuta ---------') ; END ; '4' : BEGIN Write ('Txartelaren zenbakia eman: ') ; ReadLn (iTxartelZenbakia) ; TxartelaBilatuEtaErakutsi (iTxartelZenbakia, sFitxategiIzen) ; END ; '5' : BEGIN Writeln ; Writeln ('Eraikin barruko txartelen datuak:') ; Writeln ; Writeln ('-------------------------------------------') ; BarruanDaudenenTxartelakErakutsi (sFitxategiIzen) ; Writeln ('-------------------------------------------') ; END ; END ; IF cAukera <> '0' THEN BEGIN cItxaron := ReadKey ; WriteLn (cItxaron) ; END ; UNTIL cAukera = '0' ; Writeln ; ReadLn ; END .