PROGRAM Informatika__Maiatza_2012 ; USES Crt, SysUtils ; CONST MAX_TXIRRINDU = 300 ; BAZTERTUAK = 2 ; { Bataz besteko denboraren kalkuluan baztertuak izango diren txirrindulari azkar eta motelen kopurua } TYPE tsIzena = String [150] ; trgUnea = RECORD iOrduak, iMinutuak, iSegundoak, iEhunenekoak : Integer ; END ; trgTxirrindularia = RECORD iDortsal : Integer ; sTalde : tsIzena ; rgDenboraBanaka : trgUnea ; rgDenboraTalde : trgUnea ; END ; targEtapaEmaitzak = ARRAY [1..MAX_TXIRRINDU] OF trgTxirrindularia ; tfbrgEtapaFitxategi = FILE OF trgTxirrindularia ; FUNCTION fncAukeraIrakurri : Char ; VAR cAukera : Char ; BEGIN WriteLn ('--------- Aukera Menua --------------') ; Writeln ; Writeln ('1. Taldeen bataz besteko denbora kalkulatu') ; Writeln ('2. Banakako klasifikazioa pantailaratu ') ; WriteLn ('0. Bukatu') ; Writeln ; Write (' Aukera zenbakia sakatu: ') ; REPEAT cAukera := ReadKey ; UNTIL ('0' <= cAukera) AND (cAukera <= '2') ; WriteLn (cAukera) ; fncAukeraIrakurri := cAukera ; END ; PROCEDURE TxirrindulariaPantailaratu (CONST rgTxirrindularia : trgTxirrindularia) ; BEGIN WITH rgTxirrindularia DO BEGIN Writeln ('Taldea: ', sTalde) ; Writeln ('Dortsala: ', iDortsal) ; WITH rgDenboraTalde DO Writeln ('Taldeko denbora: ', iOrduak, ':', iMinutuak:2, ':', iSegundoak:2, ':', iEhunenekoak:2) ; WITH rgDenboraBanaka DO Writeln ('Banakako denbora: ', iOrduak, ':', iMinutuak:2, ':', iSegundoak:2, ':', iEhunenekoak:2) ; END ; END ; PROCEDURE BanakakoKlasifikazioaPantailaratu (sFitxIzen : tsIzena) ; VAR fbrgFitx : tfbrgEtapaFitxategi ; rgTxirrindularia : trgTxirrindularia ; cItxaron : Char ; iPosizio : Integer ; BEGIN Assign (fbrgFitx, sFitxIzen) ; Reset (fbrgFitx) ; WriteLn ('Banakako klasifikazioaren zerrenda:') ; Writeln ; iPosizio := 0 ; WHILE NOT EOF (fbrgFitx) DO BEGIN Read (fbrgFitx, rgTxirrindularia) ; iPosizio := iPosizio + 1 ; Writeln ('Posizioa fitxategian: ', iPosizio) ; TxirrindulariaPantailaratu (rgTxirrindularia) ; WriteLn ; cItxaron := ReadKey ; END ; Close (fbrgFitx) ; END ; PROCEDURE FitxategiaZerrendanIrauli (sFitxIzen : tsIzena; VAR argEtapaEmaitzak : targEtapaEmaitzak ; VAR iTxirrinduKop : Integer ) ; VAR fbrgFitx : tfbrgEtapaFitxategi ; rgElem : trgTxirrindularia ; BEGIN Assign (fbrgFitx, sFitxIzen) ; Reset (fbrgFitx) ; iTxirrinduKop := 0 ; WHILE NOT EOF (fbrgFitx) DO BEGIN iTxirrinduKop := iTxirrinduKop + 1 ; Read (fbrgFitx, rgElem) ; argEtapaEmaitzak [iTxirrinduKop] := rgElem ; END ; Close (fbrgFitx) ; END ; FUNCTION fnliEhunenekoakKalkulua (CONST rgUne : trgUnea) : LongInt ; VAR liEhunenekoKop : LongInt ; BEGIN WITH rgUne DO liEhunenekoKop := iOrduak * 60 * 60 * 100 + iMinutuak * 60 * 100 + iSegundoak * 100 + iEhunenekoak ; fnliEhunenekoakKalkulua := liEhunenekoKop END ; PROCEDURE UneaKalkulatu (liEhunenekoKop : LongInt; VAR rgUne : trgUnea) ; VAR liHondarra : LongInt ; BEGIN WITH rgUne DO BEGIN iOrduak := liEhunenekoKop DIV (60 * 60 * 100) ; liHondarra := liEhunenekoKop MOD (60 * 60 * 100) ; iMinutuak := liHondarra DIV (60 * 100) ; liHondarra := liHondarra MOD (60 * 100) ; iSegundoak := liHondarra DIV 100 ; iEhunenekoak := liHondarra MOD 100 ; END ; END ; PROCEDURE ZerrendaElementuEzabatu (VAR argEtapaEmaitzak : targEtapaEmaitzak ; VAR iTxirrinduKop : Integer ; iPosiz : Integer) ; VAR i : Integer ; BEGIN FOR i := iPosiz TO iTxirrinduKop - 1 DO argEtapaEmaitzak[i] := argEtapaEmaitzak[i + 1] ; iTxirrinduKop := iTxirrinduKop - 1 ; END ; PROCEDURE TaldeTxirrindulariAtera (sTaldeIzen : tsIzena ; VAR argEtapaEmaitzak : targEtapaEmaitzak ; VAR iTxirrinduKop : Integer ; VAR argTaldeEmaitzak : targEtapaEmaitzak ; VAR iTaldeKop : Integer) ; VAR i : Integer ; BEGIN iTaldeKop := 0 ; i := 1 ; WHILE i <= iTxirrinduKop DO IF argEtapaEmaitzak[i].sTalde = sTaldeIzen THEN BEGIN iTaldeKop := iTaldeKop + 1 ; argTaldeEmaitzak [iTaldeKop] := argEtapaEmaitzak [i] ; ZerrendaElementuEzabatu (argEtapaEmaitzak, iTxirrinduKop, i) ; END ELSE i := i + 1 ; END ; PROCEDURE BatazBesteKalkulatu (CONST argEtapaEmaitzak : targEtapaEmaitzak ; iTxirrinduKop : Integer ; VAR rgBatazBesteDenbora : trgUnea) ; VAR i : Integer ; liBanakakoDenbora, liDenboraTotala, liBatazBeste : LongInt ; BEGIN IF iTxirrinduKop <= 4 THEN rgBatazBesteDenbora := argEtapaEmaitzak[iTxirrinduKop]. rgDenboraBanaka ELSE BEGIN liDenboraTotala := 0 ; FOR i := 1 + BAZTERTUAK TO iTxirrinduKop - BAZTERTUAK DO BEGIN liBanakakoDenbora := fnliEhunenekoakKalkulua (argEtapaEmaitzak[i]. rgDenboraBanaka) ; liDenboraTotala := liDenboraTotala + liBanakakoDenbora END ; liBatazBeste := Round (liDenboraTotala / (iTxirrinduKop - 2 * BAZTERTUAK)) ; UneaKalkulatu (liBatazBeste, rgBatazBesteDenbora) ; END ; END ; PROCEDURE TaldeBatazBesteEguneratu (CONST rgBatazBesteDenbora : trgUnea ; sTaldeIzen, sFitxIzen : tsIzena) ; VAR fbrgFitx : tfbrgEtapaFitxategi ; rgTxirrindularia : trgTxirrindularia ; BEGIN Assign (fbrgFitx, sFitxIzen) ; Reset (fbrgFitx) ; WHILE NOT EOF (fbrgFitx) DO BEGIN Read (fbrgFitx, rgTxirrindularia) ; IF rgTxirrindularia.sTalde = sTaldeIzen THEN BEGIN rgTxirrindularia. rgDenboraTalde := rgBatazBesteDenbora ; Seek (fbrgFitx, FilePos(fbrgFitx) - 1) ; Write (fbrgFitx, rgTxirrindularia) ; END ; END ; Close (fbrgFitx) ; END ; VAR sFitxIzen, sTaldeIzen : tsIzena ; argEtapaEmaitzak : targEtapaEmaitzak ; iTxirrinduKop : Integer ; argTaldeEmaitzak : targEtapaEmaitzak ; iTaldeKop : Integer ; rgBatazBesteDenbora : trgUnea ; cAukera : Char ; cItxaron : Char ; BEGIN { ---------------- programa nagusia ----------------------------} Write ('Etapako emaitzak dituen fitxategiaren izena (Etapa02): ') ; ReadLn (sFitxIzen) ; sFitxIzen := 'C:\' + sFitxIzen + '.IND' ; // FitxategiarenEdukiaBete (sFitxIzen) ; // FitxategiarenEdukiaErakutsi (sFitxIzen) ; WriteLn ; WriteLn ; IF NOT FileExists (sFitxIzen) THEN Writeln ('ERROREA: Ez da etapako emaitzak dituen ', sFitxIzen, ' fitxategirik existitzen') ELSE REPEAT cAukera := fncAukeraIrakurri ; CASE cAukera OF '1' : BEGIN FitxategiaZerrendanIrauli (sFitxIzen, argEtapaEmaitzak, iTxirrinduKop) ; WHILE iTxirrinduKop > 0 DO BEGIN sTaldeIzen := argEtapaEmaitzak[1].sTalde ; TaldeTxirrindulariAtera (sTaldeIzen, argEtapaEmaitzak, iTxirrinduKop, argTaldeEmaitzak, iTaldeKop) ; BatazBesteKalkulatu (argTaldeEmaitzak, iTaldeKop, rgBatazBesteDenbora) ; TaldeBatazBesteEguneratu (rgBatazBesteDenbora, sTaldeIzen, sFitxIzen) ; END ; Writeln ; Writeln ('Taldeen bataz besteko denborak kalkulaturik daude'); END ; '2' : BanakakoKlasifikazioaPantailaratu (sFitxIzen) ; END ; { CASE } Writeln ; Write ('Jarraitzeko sakatu tekla bat') ; cItxaron := ReadKey ; WriteLn ; UNTIL cAukera = '0' ; Writeln ; ReadLn ; END. { PROGRAMAREN BUKAERA: Informatika__Maiatza_2012 }