2023(e)ko maiatzaren 4(a), osteguna

Azterketa: 2022ko uztailaren deialdiko programa (derrigorrezkoak)


Ezaguna denez, Azterketa: 2022ko uztailaren deialdia izenburuko artikuluan azterkari buruzko informazio guzti-guztia dago, berridatz dezagun uztaileko programa baina soilik derrigorrezko aginduak idatziz. Ez dugu esan nahi gainerako aginduak soberan daudenik, baizik jarraian idatziko ditugunak berebiziko garrantzia dutela eta falta direnak horien menpekoak direla nolabait.
Uztaileko programa osoa 2022-06-29_Liburutegia_BaztertuEtaErreserbakKendu.pas fitxategian jasota dago eta honek liburuak.pas izeneko unitate bat erabiltzen du.

Uztaileko programa berezia 2022-06-29_Liburutegia_DerrigorrezkoAginduak.pas fitxategian jasota dago eta bertan nabarmendu dira ezinbestekoak diren aginduak. Windows sistema batean programa hau exekutatzean, LIBURUAK.DAT eta ERRESERBAK.DAT bi datu-fitxategiak C:\Dev-Pas karpetan kokatu behar dira derrigorrez. Uztaileko programa bereziaren kodea jarraian ikusi, non letra larrietan jarri diren aginduak garrantzitsuenak diren azpiprograma bakoitzean:
{ Hitz larrietan idatzi diren aginduak funtsezkoenak dira azpiprograma    }
{ bakoitzean, agindu horien inguruan dabiltzate gainerako agindu guztiak. }
{ Windows sistema batean programa hau exekutatzean, ERRESERBAK.DAT eta    }
{ LIBURUAK.DAT bi datu-fitxategiak C:\Dev-Pas karpetan kokatu behar dira. }

program Liburutegia_DerrigorrezkoAginduak_BaztertuEtaErreserbakKendu;

uses
   crt, sysutils;

const
   iERRESERBA_MAX = 100;

type
   tsKate10 = string[10];
   tsKate15 = string[15];
   tsKate55 = string[55];
   tsKate199 = string[199];
   trdLiburu = record
                  sLiburuKodea: tsKate15;
                  sIzenburua: tsKate55;
                  sMaileguanNori: tsKate15;
                  iAldizMaileguan: integer;
                  sKokapena: tsKate10;
                  sAzkenMaileguData: tsKate10;
               end;
   tfrdLiburutegiFitxategia = file of trdLiburu;
   trdErreserba = record
                     sLiburuKodea: tsKate15;
                     sErabiltzaileZbk: tsKate15;
                     sTelefonoa: tsKate10;
                     sEskariData: tsKate10;
                  end;
   tardErreserbak = array[1..iERRESERBA_MAX] of trdErreserba;
   tfrdErreserbenFitxategia = file of trdErreserba;


(* HELBURUA: Fitxategi mugatu batetik abiatu eta bere informazioa array      *)
(*           batera igaro.                                                   *)
(* ALGORITMOA: Fitxategia oso-osorik ibili eta arraya elikatuz joan.         *)
(* PARAMETROAK: Sarrerako parametro bakarra (fitxategiaren izena)            *)
(*              Irteerako bi parametro (arraya eta bere luzera).             *)
procedure FitxategitikArrayraIrauli(sFitxIzenErreserbak: tsKate199;
                                      var ardErreserbak: tardErreserbak;
                                            var iLuzera: integer);
var
   f_E: tfrdErreserbenFitxategia;
begin
   iLuzera := 0;
   assign(f_E, sFitxIzenErreserbak);
   reset(f_E);
   while not eof(f_E) do
   begin
      iLuzera := iLuzera + 1;
      READ(f_E, ardErreserbak[iLuzera]);    (* FITXATEGITIK IRAKURRI *)
   end;
   close(f_E);
end;


(* HELBURUA: Array batetik abiatuz bere informazioa fitxategi batean gorde.  *)
(* ALGORITMOA: Arraya oso-osorik ibili eta fitxategia elikatuz joan.         *)
(* PARAMETROAK: Sarrerako hiru parametro (arraya eta bere luzera, eta        *)
(*                                        helburuko fitxategiaren izena).    *)
procedure ArraytikFitxategiraIrauli(const ardErreserbak: tardErreserbak;
                                                iLuzera: integer;
                                    sFitxIzenErreserbak: tsKate199);
var
   i: integer;
   f_E: tfrdErreserbenFitxategia;
begin
   assign(f_E, sFitxIzenErreserbak);
   rewrite(f_E);
   for i:=1 to iLuzera do
      WRITE(f_E, ardErreserbak[i]);    (* FITXATEGIAN IDATZI *)
   close(f_E);
end;


(* HELBURUA: Menuaren aukerak pantailan idaztea eta hautapen bat irakurtzea. *)
(* PARAMETROAK: Parametrorik ez du behar eta bere irteera karaktere bat da.  *)
function fncAukeraHautatu: char;
var
   cAukera: char;
begin
   writeln(' 1.  Erreserbatutako liburuen informazioa bistaratu');
   writeln(' 2.  Mailegu gutxiko liburuak baztertzera eraman');
   writeln(' 3.  Erabiltzaile berankorren erreserbak kendu');
   writeln(' 0.  Amaitu');
   write('Zure aukera: ');
   READLN(cAukera);                  (* AUKERA TEKLATUAREN BITARTEZ IRAKURRI *)
   fncAukeraHautatu := cAukera;      (* FUNTZIOAK IRTEERAREN BAT IZAN DEZALA *)
end;


(* HELBURUA: Erreserba-fitxategirik ez badago hutsik sortu.                  *)
(* PARAMETROAK: Sarrerako parametro bakarra (fitxategiaren izena).           *)
procedure ErreserbaFitxategiaHutsikSortu(sFitxIzenErreserbak: tsKate199);
var
   f_E: tfrdErreserbenFitxategia;
begin
   if not FileExists(sFitxIzenErreserbak) then
   begin
      assign(f_E, sFitxIzenErreserbak);
      REWRITE(f_E);                    (* ERRESERBEN FITXATEGIA HUTSIK SORTU *)
      close(f_E);
   end;
end;


(* HELBURUA:  Baztertuen fitxategirik ez badago hutsik sortu.                *)
(* PARAMETROAK: Sarrerako parametro bakarra (fitxategiaren izena).           *)
procedure SortuExistitzenEzBada(sFitxIzenBazt: tsKate199);
var
   f_L: tfrdLiburutegiFitxategia;
begin
   if not FileExists(sFitxIzenBazt) then
   begin
      assign(f_L, sFitxIzenBazt);
      REWRITE(f_L);                    (* BAZTERTUEN FITXATEGIA HUTSIK SORTU *)
      close(f_L);
   end;
end;


(* HELBURUA: Fitxategi laguntzaile baten izena asmatzeko funtzioa, fitxategi *)
(*           bitartekaria da eta erabili ondoren ezabatuko da.               *)
(* PARAMETROAK: Parametrorik ez du behar eta bere irteera kate bat da.       *)
function fnsIzenBatAsmatu: tsKate199;
var
   iAuzazkoZenbakia: integer;
   sAuzazkoKatea: tsKate199;
begin
   iAuzazkoZenbakia := random(MAXINT);
   writeln('       iAuzazkoZenbakia = ', iAuzazkoZenbakia);
   str(iAuzazkoZenbakia, sAuzazkoKatea);
   writeln('          sAuzazkoKatea = ', sAuzazkoKatea);
   fnsIzenBatAsmatu := 'LAGUNTZAILEA__' + sAuzazkoKatea + '.DAT';
end;


(* HELBURUA: Liburutegiko fitxategitik elementu batzuk bertatik kendu eta baztertuen *)
(*           fitxategian gorde, elementuak aukeratzeko bi irizpide: liburuaren azken *)
(*           mailegu-data eta liburua eskuragarri izatea.                            *)
(* ALGORITMOA: Fitxategi bat bitan banatu, fitxategi laguntzaile bat erabiliz.       *)
(* PARAMETROAK: Sarrerako hiru parametro (data bat eta bi fitxategien izenak).       *)
procedure LiburuakBaztertu(          sAzkenData: tsKate10;
                           sFitxIzenLiburutegia: tsKate199;
                            sFitxIzenBaztertuak: tsKate199);
var
   f_Liburutegia: tfrdLiburutegiFitxategia;
   f_Baztertuak: tfrdLiburutegiFitxategia;
   f_Laguntzailea: tfrdLiburutegiFitxategia;
   sFitxIzenLaguntzailea: tsKate199;
   rdLiburuBat: trdLiburu; 
begin
   assign(f_Liburutegia, sFitxIzenLiburutegia);
   reset(f_Liburutegia);
   
   SortuExistitzenEzBada(sFitxIzenBaztertuak);    
   assign(f_Baztertuak, sFitxIzenBaztertuak);
   reset(f_Baztertuak);
   seek(f_Baztertuak, FileSize(f_Baztertuak));
   
   sFitxIzenLaguntzailea := fnsIzenBatAsmatu; 
   assign(f_Laguntzailea, sFitxIzenLaguntzailea);
   REWRITE(f_Laguntzailea);                            (* FITXATEGI LAGUNTZAILEA SORTU *)
   
   while not eof(f_Liburutegia) do
   begin
      read(f_Liburutegia, rdLiburuBat);
      IF (rdLiburuBat.sAzkenMaileguData <= sAzkenData) AND (rdLiburuBat.sMaileguanNori = 'INORI') THEN
         WRITE(f_Baztertuak, rdLiburuBat)             (* BAZTERTUEN FITXATEGIAN IDATZI *)
      else
         WRITE(f_Laguntzailea, rdLiburuBat);          (* FITXATEGI LAGUNTZAILEAN IDATZI *)
   end;

   close(f_Baztertuak);
   close(f_Liburutegia);
   close(f_Laguntzailea);
   
   (* Informazio eguneratua fitxategi laguntzailean dagoelako, liburutegiko *)
   (* fitxategia ezabatu eta bere izena fitxategi lagunzaileari jarri       *)
   assign(f_Liburutegia, sFitxIzenLiburutegia);
   ERASE(f_Liburutegia);                             (* LIBURUTEGIKO FITXATEGI EZABATU *)
   
   assign(f_Laguntzailea, sFitxIzenLaguntzailea);
   RENAME(f_Laguntzailea, sFitxIzenLiburutegia);     (* FITXATEGI LAGUNTZAILEA BERRIZENDATU *)
end;


(* HELBURUA: Erregistroen array baten eduki guztia pantailaratzea.        *)
(* ALGORITMOA: Array nagusia osoan ibili eta elementu bana eremuka        *)
(*             pantailan idatzi.                                          *)
(* PARAMETROAK: Sarrerako bi parametro (arraya eta bere luzera)           *)
procedure ErreserbakErakutsi(const ardErreserbak: tardErreserbak;
                                         iLuzera: integer); 
var
   k: integer; 
begin
   for k:=1 to iLuzera do 
   begin                                              (* PANTAILAN IDATZI *)
      WRITELN(ardErreserbak[k].sLiburuKodea);
      WRITELN(ardErreserbak[k].sErabiltzaileZbk);
      WRITELN(ardErreserbak[k].sTelefonoa);
      WRITELN(ardErreserbak[k].sEskariData);
      writeln;
   end;
end;


(* HELBURUA: Erabiltzaile jakin baten kodea emanik bere elementuak        *)
(*           arrayatik kendu.                                             *)
(* ALGORITMOA: Array nagusia osoan ibili eta array laguntzaile batek      *)
(*             mantenduko diren elementuak jaso ditzala.                  *)
(* PARAMETROAK: Sarrerako parametro bat (erabiltzailearen kodea)          *)
(*              Sarrera/Irteerako bi parametro (arraya eta bere luzera).  *)
procedure ErabiltzaileBatenErreserbakKendu(var ardErreserbak: tardErreserbak;
                                                 var iLuzera: integer;
                                              sErabiltzailea: tsKate15);
var
   k: integer; 
   ardErabiltzaileOnak: tardErreserbak;
   iIndizea: integer;
begin
   iIndizea := 0;
   FOR k:=1 TO iLuzera DO               (* ERRESERBEN ARRAYA OSORIK IBILI *)
   begin
      IF ardErreserbak[k].sErabiltzaileZbk <> sErabiltzailea THEN
      begin
         iIndizea := iIndizea +1;           (* ARRAY LAGUNTZAILEA ELIKATU *)
         ardErabiltzaileOnak[iIndizea] := ardErreserbak[k];
      end;
   end;
   ardErreserbak := ardErabiltzaileOnak;   (* ERRESERBEN ARRAYA EGUNERATU *)
   iLuzera := iIndizea;                    (* ERRESERBEN ARRAYA EGUNERATU *)
end;


(* HELBURUA: Erreserben arraytik elementu batzuk kendu behar dira. Kendu  *)
(*           beharreko elementu bat identifikatzeko data aztertu behar da *)
(*           liburutegi-fitxategian, liburutegiko elementu horri dagokion *)
(*           erabiltzaile-kodea hartu behar da, kode horiekin bat datozen *)
(*           erreserba guztiak kentzeko erreseben arraytik.               *)
(* ALGORITMOA: Liburutegi-fitxategia osoki ibili eta elementu bakoitzaren *)
(*             data aztertuz erreserba-arraya eguneratu baldin badagokio. *)
(* PARAMETROAK: Sarrerako bi parametro (data eta fitategiaren izena)      *)
(*              Sarrera/Irteerako bi parametro (arraya eta bere luzera).  *)
procedure ErabiltzaileBerankorrenErreserbakKendu(           sAzkenData: tsKate10;
                                                  sFitxIzenLiburutegia: tsKate199;
                                                     var ardErreserbak: tardErreserbak;
                                                 var iLuzeraErreserbak: integer);
var
   f_Liburutegia: tfrdLiburutegiFitxategia;
   rdLiburuBat: trdLiburu;
begin
   assign(f_Liburutegia, sFitxIzenLiburutegia);
   reset(f_Liburutegia);
   
   while not eof(f_Liburutegia) do
   begin
      READ(f_Liburutegia, rdLiburuBat);           (* FITXATEGITIK IRAKURRI ETA  *)
                                                  (* ALDERAKETA KONBINATUA EGIN *)
      IF (rdLiburuBat.sAzkenMaileguData <= sAzkenData) AND (rdLiburuBat.sMaileguanNori <> 'INORI') THEN
      begin
         writeln(rdLiburuBat.sMaileguanNori:12, ' kodea duen erabiltzailearen erreserbak ezabatzen...');
         ErabiltzaileBatenErreserbakKendu(ardErreserbak, iLuzeraErreserbak, rdLiburuBat.sMaileguanNori);
      end;
   end;
   
   close(f_Liburutegia);
end;


var  { ---------------------- Programa Nagusiaren aldagaiak ---------------------- }
   sFitxIzenLiburutegia: tsKate199;
   sFitxIzenErreserbak: tsKate199;
   sFitxIzenBaztertuak: tsKate199;
   ardErreserbak: tardErreserbak;
   iLuzeraErreserbak: integer;
   sAzkenData: tsKate10;
   cAukera: char;

begin { ---------------------------- Programa Nagusia ---------------------------- }
   write('Liburutegiaren fitxategi-izena eman (LIBURUAK.DAT adibidez): ');
   readln(sFitxIzenLiburutegia);
   write('Erreserben fitxategi-izena eman (ERRESERBAK.DAT adibidez): ');
   readln(sFitxIzenErreserbak);
      
   if not FileExists(sFitxIzenLiburutegia) then
      writeln('ERROREA: beharrezkoa den liburutegiaren fitxategia falta da!')
   else
   begin
      if not FileExists(sFitxIzenErreserbak) then
         ErreserbaFitxategiaHutsikSortu(sFitxIzenErreserbak);
         
      FitxategitikArrayraIrauli(sFitxIzenErreserbak, ardErreserbak, iLuzeraErreserbak);
      
      repeat
         cAukera := fncAukeraHautatu;
         writeln;
         case cAukera of
            '1' : begin
                     ErreserbakErakutsi(ardErreserbak, iLuzeraErreserbak);
                  end;
            '2' : begin
                     write('Liburuak baztertzeko aaaa/mm/dd data eman (adibidez, 2021/02/27): ');
                     readln(sAzkenData);
                     write('Baztertuen fitxategiaren izena eman (BAZTERTUAK.DAT adibidez): ');
                     readln(sFitxIzenBaztertuak);
                     LiburuakBaztertu(sAzkenData, sFitxIzenLiburutegia, sFitxIzenBaztertuak);
                  end;  
            '3' : begin
                     write('Liburuak itzuliak izateko azken data eman (adibidez, 2022/04/14): ');
                     readln(sAzkenData);
                     ErabiltzaileBerankorrenErreserbakKendu(sAzkenData, sFitxIzenLiburutegia, ardErreserbak, iLuzeraErreserbak);
                  end;                                                  
         end;
         readln; 
      until cAukera = '0';
      
      ArraytikFitxategiraIrauli(ardErreserbak, iLuzeraErreserbak, sFitxIzenErreserbak);
   end;

   readLn; 
end.
 

iruzkinik ez:

Argitaratu iruzkina