PROGRAM ZatitzailePropioak ; USES Crt, SysUtils ; CONST MAX_ZATITZAILEAK = 50 ; MAX_ELEMENTUAK = 100 ; TYPE DM_Zatitzaileak = ARRAY [1..MAX_ZATITZAILEAK] OF Integer ; DM_Kate75 = String [75] ; DM_Fitxa = RECORD Zenbakia : Integer ; Deskonposaketa : DM_Zatitzaileak ; ZatitzaileKopurua : Integer ; Mota : DM_Kate75 ; END ; DM_ArrayMota = ARRAY [1.. MAX_ELEMENTUAK] OF DM_Fitxa ; DM_Fitxategi = FILE OF DM_Fitxa ; { azterketan prozedura hau ez zen eskatu } PROCEDURE FitxategiBatSortu ; VAR F : DM_Fitxategi ; Elem : DM_Fitxa ; Erantzuna : Char ; sFitxIzen : DM_Kate75 ; BEGIN Write ('Sortuko den fitxategiaren izena eman (adibidez: osoak.dat): ') ; ReadLn (sFitxIzen) ; sFitxIzen := 'C:\' + sFitxIzen ; Assign (F, sFitxIzen) ; Rewrite (F) ; REPEAT REPEAT Write ('Zenbaki osoa eta positiboa eman: ') ; ReadLn (Elem.Zenbakia) ; UNTIL Elem.Zenbakia > 0 ; Elem.ZatitzaileKopurua := 0 ; Elem.Mota := '' ; Write (f, Elem) ; REPEAT Write ('Zenbaki gehiagorik (B/E)? ') ; ReadLn (Erantzuna) ; Erantzuna := UpCase (Erantzuna) ; UNTIL (Erantzuna='B') OR (Erantzuna='E') ; UNTIL Erantzuna = 'E' ; Close (F) ; END ; PROCEDURE FitxaBatErakutsi (CONST Fitxa : DM_Fitxa) ; VAR Indizea : Byte ; BEGIN WITH Fitxa DO BEGIN WriteLn ('Zenbakia: ', Zenbakia) ; IF Mota <> '' THEN WriteLn ('Mota: ', Mota) ; IF ZatitzaileKopurua <> 0 THEN BEGIN WriteLn ('Zatitzaileak:') ; FOR Indizea:=1 TO ZatitzaileKopurua DO IF Deskonposaketa[Indizea] <> 0 THEN Write (Deskonposaketa[Indizea]:8) ; Writeln ; END ; WriteLn ; END ; END ; PROCEDURE FitxategiBatIkusi (FitxIzen : DM_Kate75) ; VAR F : DM_Fitxategi ; Elem : DM_Fitxa ; Itxoin : Char ; BEGIN WriteLn (FitxIzen, ' fitxategiaren hasiera ----------------------------') ; Assign (F, FitxIzen) ; Reset (F) ; WHILE Not EOF(F) DO BEGIN Read (F, Elem) ; WriteLn (Filepos(F), '. elementua___________________________________') ; FitxaBatErakutsi (Elem) ; Itxoin := ReadKey ; END ; Close (F) ; WriteLn (FitxIzen, ' fitxategiaren amaiera ----------------------------') ; Itxoin := ReadKey ; END ; PROCEDURE ZatitzaileakLortu (ZbkOso : Integer; VAR Bektore : DM_Zatitzaileak; VAR Luzera : Integer) ; VAR Indizea, Kont : Integer ; BEGIN Kont := 0 ; Indizea := 0 ; REPEAT { Jarraitu } Kont := Kont + 1 ; IF ZbkOso MOD Kont = 0 THEN BEGIN Indizea := Indizea + 1 ; Bektore[Indizea] := Kont ; END ; UNTIL (Kont = ZbkOso-1) OR { ZbkOso baino txikiagoak direnean } (Indizea = MAX_ZATITZAILEAK) OR { arraya bete gabe dagoenean } (ZbkOso = 1) ; { ZbkOso 1 izatean kasu berezia da } Luzera := Indizea ; END ; FUNCTION ZenbakiaSailkatu (ZbkOso : Integer; CONST Bektore : DM_Zatitzaileak; Luzera : Integer) : DM_Kate75 ; VAR Metatua, Indizea : Integer ; BEGIN Metatua := 0 ; FOR Indizea := 1 TO Luzera DO Metatua := Metatua + Bektore[Indizea] ; IF Metatua < ZbkOso THEN ZenbakiaSailkatu := 'Eskasa' ; IF Metatua = ZbkOso THEN ZenbakiaSailkatu := 'Perfektua' ; IF Metatua > ZbkOso THEN ZenbakiaSailkatu := 'Ugaria' ; END ; PROCEDURE ElementuaAldatu (VAR Fitxa : DM_Fitxa) ; BEGIN ZatitzaileakLortu (Fitxa.Zenbakia, Fitxa.Deskonposaketa, Fitxa.ZatitzaileKopurua) ; Fitxa.Mota := ZenbakiaSailkatu (Fitxa.Zenbakia, Fitxa.Deskonposaketa, Fitxa.ZatitzaileKopurua) ; END ; PROCEDURE FitxategiBatSailkatu (FitxIzen : DM_Kate75) ; VAR F : DM_Fitxategi ; Elem : DM_Fitxa ; BEGIN Assign (F, FitxIzen) ; Reset (F) ; WHILE Not EOF(F) DO BEGIN Read (F, Elem) ; ElementuaAldatu (Elem) ; Seek (F, FilePos(F)-1) ; Write (F, Elem) ; END ; Close (F) ; END ; PROCEDURE FitxategitikArrayra ( FitxIzen : DM_Kate75; VAR Zerrenda : DM_ArrayMota ; VAR iKopurua : Integer); VAR F : DM_Fitxategi ; BEGIN Assign (F, FitxIzen); Reset (F); iKopurua := 0 ; WHILE NOT EOF(F) DO BEGIN iKopurua := iKopurua + 1; Read (F, Zerrenda[iKopurua]); END; Close (F); END; PROCEDURE FitxategiBatAntolatu (FitxIzen : DM_Kate75) ; VAR F : DM_Fitxategi ; Indizea : Integer ; Zerrenda : DM_ArrayMota ; iKopurua : Integer ; BEGIN FitxategitikArrayra (FitxIzen, Zerrenda, iKopurua); Assign (F, FitxIzen); Rewrite (F); FOR Indizea := 1 TO MAX_ZATITZAILEAK DO IF Zerrenda[Indizea].Mota = 'Eskasa' THEN Write (F, Zerrenda[Indizea]) ; FOR Indizea := 1 TO MAX_ZATITZAILEAK DO IF Zerrenda[Indizea].Mota = 'Perfektua' THEN Write (F, Zerrenda[Indizea]) ; FOR Indizea := 1 TO MAX_ZATITZAILEAK DO IF Zerrenda[Indizea].Mota = 'Ugaria' THEN Write (F, Zerrenda[Indizea]) ; Close (F) END ; { FitxategiBatAntolatu } FUNCTION UgariBikoitiTxikiena (FitxIzen : DM_Kate75) : Integer ; VAR F : DM_Fitxategi ; Elem : DM_Fitxa ; Txikiena : Integer ; UgarienHasieran : Boolean ; BEGIN Assign (F, FitxIzen) ; Reset (F) ; UgarienHasieran := FALSE ; WHILE (Not EOF(F)) AND (Not UgarienHasieran) DO BEGIN Read (F, Elem) ; IF (Elem.Zenbakia MOD 2 = 0) AND (Elem.Mota = 'Ugaria') THEN BEGIN UgarienHasieran := TRUE ; Txikiena := Elem.Zenbakia ; END ; END ; IF UgarienHasieran THEN { Ugariak fitxategian badaude } WHILE Not EOF(F) DO { bikoiti bat aurkitu denez } BEGIN { txikiena ote den aztertu } Read (F, Elem) ; IF (Elem.Zenbakia MOD 2 = 0) AND (Elem.Zenbakia < Txikiena) THEN Txikiena := Elem.Zenbakia ; END ELSE { Ugaria den zenbakirik ez dagoenean } Txikiena := -1 ; Close (F) ; UgariBikoitiTxikiena := Txikiena ; END ; VAR sFitxIzen : DM_Kate75 ; Txikiena : Integer ; Itxoin : Char ; BEGIN {---------Programa Nagusia---------} // FitxategiBatSortu ; { azterketan prozedura hau ez zen eskatu } WriteLn ('Zenbaki osoak fitxategi batean gorderik daude') ; Write ('Eman fitxategiaren izena (adibidez: osoak.dat): ') ; ReadLn (sFitxIzen) ; sFitxIzen := 'C:\' + sFitxIzen ; WriteLn ; IF FileExists (sFitxIzen) THEN BEGIN FitxategiBatIkusi (sFitxIzen) ; ClrScr ; FitxategiBatSailkatu (sFitxIzen) ; Writeln (sFitxIzen, ' fitxategia SAILKATU ondoren =============='); FitxategiBatIkusi (sFitxIzen) ; ClrScr ; FitxategiBatAntolatu (sFitxIzen) ; Writeln (sFitxIzen, ' fitxategia ANTOLATU ondoren =============='); FitxategiBatIkusi (sFitxIzen) ; ClrScr ; Txikiena := UgariBikoitiTxikiena (sFitxIzen) ; IF Txikiena = - 1 THEN WriteLn (sFitxIzen, ' fitxategian Ugaria den zenbakirik ez dago') ELSE WriteLn (sFitxIzen, ' fitxategian Ugaria eta Bikoitia den zenbakirik', ' txikiena: ', Txikiena) ; END ELSE WriteLn (sFitxIzen, ' izena duen fitxategirik ez da') ; Writeln ; Itxoin := ReadKey ; END.