PROGRAM Oposiziogileak ; CONST iMAX_OPOSIZIOGILE = 20000 ; TYPE DM_sKateLabur = String [9] ; DM_sKateLuze = String [25] ; DM_rgOposiziogile = RECORD sNAN, sEskatutakoLanpostua : DM_sKateLabur ; iAntzinatasuna : Integer ; { hilabeteak } rAzterketaNota, rPuntuaketa : Real ; boLanpostuaEsleituta : Boolean ; END ; DM_argOposiziogileenZerrenda = ARRAY [1..iMAX_OPOSIZIOGILE] OF DM_rgOposiziogile ; DM_fbrgOposiziogileenFitxategia = FILE OF DM_rgOposiziogile ; DM_rgLanpostua = RECORD sLanpostuZenbakia : DM_sKateLabur ; sDeskribapena : DM_sKateLuze ; sOposiziogileNANa : DM_sKateLabur ; END ; DM_fbrgLanpostuenFitxategia = FILE OF DM_rgLanpostua ; PROCEDURE AzkenPuntuaketaKalkulatu (VAR rgOposiziogile : DM_rgOposiziogile) ; VAR rAntzinatasunPuntuaketa : Real ; BEGIN WITH rgOposiziogile DO BEGIN rAntzinatasunPuntuaketa := (iAntzinatasuna DIV 3) * 0.5 ; IF rAntzinatasunPuntuaketa > 5 THEN rAntzinatasunPuntuaketa := 5 ; rPuntuaketa := rAzterketaNota + rAntzinatasunPuntuaketa ; IF rPuntuaketa > 10 THEN rPuntuaketa := 10 ; END ; END ; PROCEDURE FitxategitikZerrendera ( sFitxIzen : DM_sKateLuze; VAR argOposiziogileenZerrenda : DM_argOposiziogileenZerrenda ; VAR iZerrendaLuzera : Integer) ; VAR fbrgOposiziogileak : DM_fbrgOposiziogileenFitxategia ; BEGIN iZerrendaLuzera := 0 ; Assign (fbrgOposiziogileak, sFitxIzen) ; Reset (fbrgOposiziogileak) ; WHILE NOT EOF (fbrgOposiziogileak) DO BEGIN iZerrendaLuzera := iZerrendaLuzera + 1 ; Read (fbrgOposiziogileak, argOposiziogileenZerrenda[iZerrendaLuzera]) ; AzkenPuntuaketaKalkulatu (argOposiziogileenZerrenda[iZerrendaLuzera]) ; END ; Close (fbrgOposiziogileak) ; END ; FUNCTION fnboBietatikLehenaHoberena (CONST rgOposiziogileBat, rgOposiziogileBi : DM_rgOposiziogile) : Boolean ; VAR boLehenaHoberena : Boolean ; BEGIN boLehenaHoberena := TRUE ; IF rgOposiziogileBat.rPuntuaketa < rgOposiziogileBi.rPuntuaketa THEN boLehenaHoberena := FALSE ELSE IF rgOposiziogileBat.rPuntuaketa = rgOposiziogileBi.rPuntuaketa THEN IF rgOposiziogileBat.iAntzinatasuna < rgOposiziogileBi.iAntzinatasuna THEN boLehenaHoberena := FALSE ; fnboBietatikLehenaHoberena := boLehenaHoberena ; END ; FUNCTION fniOposiziogileaLanposturakoBilatu ( sEsleitzekoLanpostuZenbakia : DM_sKateLabur ; CONST argOposiziogileenZerrenda : DM_argOposiziogileenZerrenda ; iZerrendaLuzera : Integer) : Integer ; VAR iUnekoPosizioa, iOnenarenPosizioa : Integer ; boNorbaitAurkiturik : Boolean ; BEGIN boNorbaitAurkiturik := FALSE ; iOnenarenPosizioa := 0 ; iUnekoPosizioa := 1 ; { Lanpostua eskatu duen lehen oposiziogilea bilatu } WHILE NOT boNorbaitAurkiturik AND (iUnekoPosizioa <= iZerrendaLuzera) DO IF argOposiziogileenZerrenda[iUnekoPosizioa].sEskatutakoLanpostua = sEsleitzekoLanpostuZenbakia THEN BEGIN boNorbaitAurkiturik := TRUE ; iOnenarenPosizioa := iUnekoPosizioa END ELSE iUnekoPosizioa := iUnekoPosizioa + 1 ; IF boNorbaitAurkiturik THEN BEGIN { Oposiziogilerik aurkitu bada, hori da hasierako "onena". Ondoren bilaketarekin jarraitu beti "onena" zehaztuz zerrenda amaitu arte } FOR iUnekoPosizioa := iOnenarenPosizioa + 1 TO iZerrendaLuzera DO IF argOposiziogileenZerrenda[iUnekoPosizioa].sEskatutakoLanpostua = SEsleitzekoLanpostuZenbakia THEN IF NOT fnboBietatikLehenaHoberena (argOposiziogileenZerrenda[iOnenarenPosizioa], argOposiziogileenZerrenda[iUnekoPosizioa]) THEN iOnenarenPosizioa:= iUnekoPosizioa; END ; fniOposiziogileaLanposturakoBilatu := iOnenarenPosizioa ; END ; PROCEDURE ZerrendarenElementuaEzabatu (VAR argOposiziogileenZerrenda : DM_argOposiziogileenZerrenda ; VAR iZerrendaLuzera : Integer ; iPosizioa : Integer) ; VAR i : Integer ; BEGIN FOR i := iPosizioa + 1 TO iZerrendaLuzera DO argOposiziogileenZerrenda [i - 1] := argOposiziogileenZerrenda [i] ; iZerrendaLuzera := iZerrendaLuzera - 1 ; END ; PROCEDURE OposiziogilearenGainerakoEskaerakEzabatu ( sEzabatzekoNANa : DM_sKateLabur ; VAR argOposiziogileenZerrenda : DM_argOposiziogileenZerrenda ; VAR iZerrendaLuzera : Integer) ; VAR i : Integer ; BEGIN FOR i := iZerrendaLuzera DOWNTO 1 DO WITH argOposiziogileenZerrenda[i] DO IF (sNAN = sEzabatzekoNANa) AND (boLanpostuaEsleituta = FALSE) THEN ZerrendarenElementuaEzabatu (argOposiziogileenZerrenda, iZerrendaLuzera, i) ; END ; PROCEDURE LanpostuakEsleitu ( sFitxIzen : DM_sKateLuze; VAR argOposiziogileenZerrenda : DM_argOposiziogileenZerrenda ; VAR iZerrendaLuzera : Integer) ; VAR fbrgLanpostuak : DM_fbrgLanpostuenFitxategia ; rgLanpostuBat : DM_rgLanpostua ; iOposiziogilearenPosizioa : Integer ; BEGIN Assign (fbrgLanpostuak, sFitxIzen) ; Reset (fbrgLanpostuak) ; WHILE NOT EOF (fbrgLanpostuak) DO BEGIN Read (fbrgLanpostuak, rgLanpostuBat) ; iOposiziogilearenPosizioa := fniOposiziogileaLanposturakoBilatu (rgLanpostuBat.SLanpostuZenbakia, argOposiziogileenZerrenda, iZerrendaLuzera) ; IF iOposiziogilearenPosizioa <> 0 THEN BEGIN rgLanpostuBat.sOposiziogileNANa := argOposiziogileenZerrenda[iOposiziogilearenPosizioa].sNAN ; Seek (fbrgLanpostuak, FilePos (fbrgLanpostuak) - 1) ; Write (fbrgLanpostuak, rgLanpostuBat) ; argOposiziogileenZerrenda[iOposiziogilearenPosizioa].boLanpostuaEsleituta := TRUE ; OposiziogilearenGainerakoEskaerakEzabatu (argOposiziogileenZerrenda[iOposiziogilearenPosizioa].sNAN, argOposiziogileenZerrenda, iZerrendaLuzera) ; END ; END ; Close (fbrgLanpostuak) ; END ; PROCEDURE LanpostudunOposiziogileakFitxategira (CONST argOposiziogileenZerrenda : DM_argOposiziogileenZerrenda ; iZerrendaLuzera : Integer ; sFitxIzen : DM_sKateLuze) ; VAR fbrgOposiziogileak : DM_fbrgOposiziogileenFitxategia ; rgOposiziogileBat : DM_rgOposiziogile ; i : Integer ; BEGIN Assign (fbrgOposiziogileak, sFitxIzen) ; Rewrite (fbrgOposiziogileak) ; FOR i := 1 TO iZerrendaLuzera DO IF argOposiziogileenZerrenda[i].boLanpostuaEsleituta THEN BEGIN rgOposiziogileBat := argOposiziogileenZerrenda[i] ; Write (fbrgOposiziogileak, rgOposiziogileBat) ; END ; Close (fbrgOposiziogileak) ; END ; {----------------- programa nagusiko aldagaiak ----------} VAR sLanpostuenFitxIzena, sLanpostuenFitxIzenOsatua, sOposiziogileenFitxIzena, sOposiziogileenFitxIzenOsatua : DM_sKateLuze; argOposiziogileenZerrenda : DM_argOposiziogileenZerrenda ; iZerrendaLuzera : Integer ; BEGIN {------------------ programa nagusia --------------} Writeln ; Writeln ; Write ('Lanpostuen fitxategiaren izena eman: ') ; ReadLn (sLanpostuenFitxIzena) ; sLanpostuenFitxIzenOsatua := sLanpostuenFitxIzena + '.DAT' ; Writeln ; Write ('Oposiziogileen fitxategiaren izena eman: ') ; ReadLn (sOposiziogileenFitxIzena) ; sOposiziogileenFitxIzenOsatua := sOposiziogileenFitxIzena + '.LEH' ; FitxategitikZerrendera (sOposiziogileenFitxIzenOsatua, argOposiziogileenZerrenda, iZerrendaLuzera) ; LanpostuakEsleitu (sLanpostuenFitxIzenOsatua, argOposiziogileenZerrenda, iZerrendaLuzera) ; sOposiziogileenFitxIzenOsatua := sOposiziogileenFitxIzena + '.AZK' ; LanpostudunOposiziogileakFitxategira (argOposiziogileenZerrenda, iZerrendaLuzera, sOposiziogileenFitxIzenOsatua) ; Writeln ; Writeln ('Esleituriko lanpostuen fitxategia osatu da') ; Writeln ; Writeln ; Write ('RETURN sakatu programa bukatzeko...') ; Readln ; END .