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

Azterketa: 2022ko maiatzaren deialdiko programa (derrigorrezkoak)


Ezaguna denez, Azterketa: 2022ko maiatzaren deialdia izenburuko artikuluan azterkari buruzko informazio guzti-guztia dago. Heltzear den uztaileko deialdiari dagokion programa prestatze aldera, berridatz dezagun maiatzeko programa baina soilik derrigorrezko aginduak idatziz (letra larrietan idatzirik ematen diren aginduak). Ez dugu esan nahi gainerako aginduak soberan daudenik, baizik eta letra larrietan idatziko ditugunak berebiziko garrantzia dutela eta besteak horien menpekoak direla nolabait.
Maiatzeko programa osoa 2022-05-23_Liburutegia_MaileguakEtaErreserbak.pas fitxategian jasota dago eta honek bi unitate erabiltzen ditu: datumota.pas izenekoa eta liburu.pas izenekoa.

Maiatzeko programa berezia 2022-05-23_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. Maiatzeko 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_MaileguakEtaErreserbak;

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: Fitxategiko informazioa array batera eramatea. Fitxategitik *)
(*           irakurri beharra dago, horregatik READ larrietan.           *)
(* PARAMETROAK: Sarrerako parametro bat (fitxategiaren izena)            *)
(*              Irteerako bi parametro (arraya eta 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 bateko informazioa fitxategi batera eramatea. Fitxategian idatzi *)
(*           beharra dago, horregatik WRITE larrietan jarri da.                     *)
(* PARAMETROAK: Sarrerako hiru parametro(fitxategiaren izena, arraya eta luzera).   *)
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.  Mailegu-eskaera berri bat gehitzea');
   writeln('2.  Mailegatutako liburu bat itzultzea');
   writeln('3.  Letra batetik hasten diren liburuei buruzko informazioa bistaratzea');
   writeln('0.  Amaitu');
   write('Zure aukera: ');
   READLN(cAukera);                  (* AUKERA TEKLATUAREN BITARTEZ IRAKURRI *)
   fncAukeraHautatu := cAukera;      (* FUNTZIOAK IRTEERAREN BAT IZAN DEZALA *)
end;


(* HELBURUA: Erregistro baten eremuen informazioa pantailaratzea. *)
(* PARAMETROAK: Parametro bakarra eta sarrerakoa.                 *)
procedure LiburuaErakutsi(const rdLiburuBat: trdLiburu);
begin
   WRITELN('Liburuaren kodea: ':32, rdLiburuBat.sLiburuKodea);
   WRITELN('Liburuaren izenburua: ':32, rdLiburuBat.sIzenburua);
   WRITELN('Maileguan duen erabiltzailea: ':32, rdLiburuBat.sMaileguanNori);
   WRITELN('Zenbatetan maileguan: ':32, rdLiburuBat.iAldizMaileguan);
   WRITELN('Kokapena: ':32, rdLiburuBat.sKokapena);
   WRITELN('Azken maileguaren data: ':32, rdLiburuBat.sAzkenMaileguData);
   writeln;
end;


(* HELBURUA: Fitxategi bat osoki arakatu eta letra jakin batez *)
(*           hasten diren liburuen datuak pantailaratzea.      *)
(* ALGORITMOA: Fitxategi bat ibiltzea hasieratik bukaeraraino. *)
(* PARAMETROAK: Bi parametro eta biak sarrerakoak.             *)
procedure LetraBatezHastenDirenLiburuak(     cHasierakoLetra: char;
                                        sFitxIzenLiburutegia: tsKate199);
var
   f_L: tfrdLiburutegiFitxategia;
   rdLiburuBat: trdLiburu;
begin
   assign(f_L, sFitxIzenLiburutegia);
   reset(f_L);
   while not eof(f_L) do
   begin
      READ(f_L, rdLiburuBat);                               (* FITXATEGITIK IRAKURRI *)
      IF cHasierakoLetra = rdLiburuBat.sIzenburua[1] THEN   (* LETREN ALDERAKETA EGIN *)
         LiburuaErakutsi(rdLiburuBat);
   end;
   close(f_L);
end;


(* HELBURUA: Fitxategi bat arakatu eta kode jakin bateko                             *)
(*           elementua bertan dagoen ala ez erabaki.                                 *)
(* ALGORITMOA: Fitxategi batean bilaketa.                                            *)
(* PARAMETROAK: Sarrerako bi parametro (fitxategiaren izena eta gakoa den kodea)     *)
(*              Irteerako bi parametro (elementuaren posizioa eta erregistroa bera). *)
procedure LiburutegianBilatu(         sLiburuGako: tsKate15;
                             sFitxIzenLiburutegia: tsKate199;
                                    var iPosizioa: integer;
                                  var rdLiburuBat: trdLiburu);
var
   f_L: tfrdLiburutegiFitxategia;
   boAurkitua: Boolean;
begin
   assign(f_L, sFitxIzenLiburutegia);
   reset(f_L);
   
   boAurkitua := FALSE;
   while not boAurkitua and not eof(f_L) do
   begin
      READ(f_L, rdLiburuBat);                             (* FITXATEGITIK IRAKURRI *)
      IF rdLiburuBat.sLiburuKodea = sLiburuGako THEN      (* LETREN ALDERAKETA EGIN *)
         boAurkitua := TRUE;
   end;

   IF boAurkitua THEN
      iPosizioa := filepos(f_L) -1         (* POSIZIOA ITZULI *)
   ELSE
      iPosizioa := -1;                     (* POSIZIOA ITZULI *)
      
   close(f_L);
end;


(* HELBURUA: Fitxategi bateko elementu jakin baten informazioa eguneratu. *)
(* ALGORITMOA: Fitxategi baten informazio aldaketa.                       *)
(* PARAMETROAK: Sarrerako hiru parametro (fitxategiaren izena,            *)
(*              elementu berria eta bere posizioa fitxategian).           *)
procedure LiburuaEguneratuLiburutegian(   const rdLiburuBat: trdLiburu;
                                       sFitxIzenLiburutegia: tsKate199;
                                                  iPosizioa: integer);
var
   f_L:  tfrdLiburutegiFitxategia;
begin
   assign(f_L, sFitxIzenLiburutegia);
   reset(f_L);
   SEEK(f_L, iPosizioa);         (* POSIZIO EGOKIAN KOKATU *)
   WRITE(f_L, rdLiburuBat);      (* ETA FITXATEGIAN IDATZI *)
   close(f_L);
end;


(* HELBURUA: Liburu baten mailegua egin behar da. Hau da, liburuaren kodea eta       *)
(*           erabiltzailearen kodea ezagunak direla, liburua bilatu behar da         *)
(*           fitxategian. Horrelako libururik ez badago mezu bat pantailaratu (hau   *)
(*           ez zen azterketako enuntziatuan eskatu). Horrelako libururik bai badago *)
(*           mailegatuta ala libre dagoen aztertu: liburua libre badago, fitxategia  *)
(*           eguneratu; liburua libre ez badago erreserben arrayan elementu berri    *)
(*           bat gehitu.                                                             *)
(* PARAMETROAK: Sarrerako bi parametro (fitxategiaren izena eta gaurko data)         *)
(*              Irteerako bi parametro (arraya eta bere luzera efektiboa).           *)
procedure MaileguEskariBerria(         sGaurkoData: tsKate10;
                              sFitxIzenLiburutegia: tsKate199;
                                 var ardErreserbak: tardErreserbak;
                                       var iLuzera: integer);
var
   sLiburuarenKodea: tsKate15;
   sErabiltzailearenKodea: tsKate15;
   iPosLiburutegian: integer;
   rdLiburuBat : trdLiburu;
begin
   write('Liburu-kodea: ');
   readln(sLiburuarenKodea);
   write('Erabiltzaile-kodea: ');
   readln(sErabiltzailearenKodea);
   LiburutegianBilatu(sLiburuarenKodea, sFitxIzenLiburutegia, iPosLiburutegian, rdLiburuBat);
   if rdLiburuBat.sMaileguanNori = 'INORI' then
   begin    (* LIBURUA ESKURAGARRI DAGO *)
      rdLiburuBat.sMaileguanNori := sErabiltzailearenKodea;
      rdLiburuBat.iAldizMaileguan := rdLiburuBat.iAldizMaileguan + 1;
      rdLiburuBat.sAzkenMaileguData := sGaurkoData;
      LiburuaEguneratuLiburutegian(rdLiburuBat, sFitxIzenLiburutegia, iPosLiburutegian);
   end
   else
   begin    (* LIBURUA MAILEGUAN HARTUTA DAGO *)
      if iLuzera < iERRESERBA_MAX then
      begin
         iLuzera := iLuzera + 1;
         ardErreserbak[iLuzera].sLiburuKodea := sLiburuarenKodea;
         ardErreserbak[iLuzera].sErabiltzaileZbk := sErabiltzailearenKodea;
         ardErreserbak[iLuzera].sEskariData := sGaurkoData;
         write('Telefonoa: ');
         readln(ardErreserbak[iLuzera].sTelefonoa);
      end;
   end; 
end;


(* HELBURUA: Kode jakin bateko elementua arrayan bilatu.                  *)
(* ALGORITMOA: Array batean bilaketa.                                     *)
(* PARAMETROAK: Sarrerako hiru parametro (gakoa den kodea,                *)
(*              arraya eta bere luzera efektiboa).                        *)
function fniErreserbaBilatuArrayean(    sLiburuKodeGako: tsKate15;
                                    const ardErreserbak: tardErreserbak;
                                      iLuzera: integer): integer;
var
   i: integer;
   boAurkitua: Boolean;
begin
   i := 1;
   boAurkitua := FALSE;
   while not boAurkitua and (i <= iLuzera) do
   begin
      IF sLiburuKodeGako = ardErreserbak[i].sLiburuKodea THEN   (* KODEEN ALDERAKETA EGIN *)
         boAurkitua := TRUE
      else
        i := i +1;
   end;
   if boAurkitua then
      fniErreserbaBilatuArrayean := i          (* FUNTZIOAK IRTEERAREN BAT IZAN DEZALA *)
   else
      fniErreserbaBilatuArrayean := -1;        (* FUNTZIOAK IRTEERAREN BAT IZAN DEZALA *)
end;


(* HELBURUA: Posizio jakin bateko elementua arrayatik kendu.              *)
(* ALGORITMOA: Array batetik elementu bat kendu.                          *)
(* PARAMETROAK: Sarrerako parametro bat (posizioa arrayan)                *)
(*              Irteerako bi parametro (arraya eta bere luzera).          *)
procedure ErreserbaZerrendatikEzabatu(var ardErreserbak: tardErreserbak;
                                            var iLuzera: integer;
                                              iPosizioa: integer);
var
i: integer;
begin
   for i := iPosizioa +1 to iLuzera do
       ardErreserbak[i -1] := ardErreserbak[i];
   iLuzera := iLuzera -1;
end;


(* HELBURUA: Maileguan dagoen liburu bat itzuli behar da. Hau da, liburuaren kodea   *)
(*           ezaguna dela, liburua bilatu behar da fitxategian. Horrelako libururik  *)
(*           ez badago mezu bat pantailaratu. Horrelako libururik badago, eskatuta   *)
(*           dagoen aztertu: liburua erreserben arrayan ez badago, ez bada eskatu,   *)
(*           fitxategia eguneratu; liburua erreserben arrayan bai badago, arraytik   *)
(*           ezabatu eta fitxategia eguneratu.                                       *)
(* PARAMETROAK: Sarrerako bi parametro (fitxategiaren izena eta gaurko data)         *)
(*              Irteerako bi parametro (arraya eta bere luzera efektiboa).           *)
procedure MailegatutakoLiburuaItzuli(         sGaurkoData: tsKate10;
                                     sFitxIzenLiburutegia: tsKate199;
                                        var ardErreserbak: tardErreserbak;
                                              var iLuzera: integer);
var
   sLiburuGako: tsKate15;
   iPosLiburutegian: integer; 
   iPosErreserban: integer;
   rdLiburuBat: trdLiburu;
begin
   write('Liburu-kodea: ');
   readln(sLiburuGako);
   LiburutegianBilatu(sLiburuGako, sFitxIzenLiburutegia, iPosLiburutegian, rdLiburuBat);

   iPosErreserban := fniErreserbaBilatuArrayean(rdLiburuBat.sLiburuKodea, ardErreserbak, iLuzera);
   
   if iPosErreserban = -1 then
      rdLiburuBat.sMaileguanNori := 'INORI'    (* INORK EZ DUELAKO ERRESERBATU, LIBURUA GORDETZEKO PRESTATU *)
   else
   begin    (* ERABILTZAILEREN BATEK ERRESERBATURIK DAUKA, HARI MAILEGATU *)
      rdLiburuBat.sMaileguanNori := ardErreserbak[iPosErreserban].sErabiltzaileZbk;
      rdLiburuBat.iAldizMaileguan := rdLiburuBat.iAldizMaileguan +1;
      rdLiburuBat.sAzkenMaileguData := sGaurkoData;
      ErreserbaZerrendatikEzabatu(ardErreserbak, iLuzera, iPosErreserban);
   end;

   LiburuaEguneratuLiburutegian(rdLiburuBat, sFitxIzenLiburutegia, iPosLiburutegian);
end;


var  { ----------------------------------------- Programa Nagusiaren aldagaiak -------------- }
   sFitxIzenLiburutegia: tsKate199;
   sFitxIzenErreserbak: tsKate199;
   ardErreserbak: tardErreserbak;
   iLuzera: integer;
   sGaurkoData: tsKate10;
   cAukera: char;
   cHasierakoLetra: 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) or not fileExists(sFitxIzenErreserbak)  then
      writeln('ERROREA: behar diren bi fitxategietatik bat falta da (ala biak falta dira)')
   else
   begin
      FitxategitikArrayraIrauli(sFitxIzenErreserbak, ardErreserbak, iLuzera);
      write('Gaurko data: ');
      readln(sGaurkoData);
      
      repeat
         cAukera := fncAukeraHautatu;
         writeln;
         case cAukera of
           '1': MaileguEskariBerria(sGaurkoData, sFitxIzenLiburutegia, ardErreserbak, iLuzera);
           '2': MailegatutakoLiburuaItzuli(sGaurkoData, sFitxIzenLiburutegia, ardErreserbak, iLuzera);
           '3': begin
                   write('Letra: ');
                   readln(cHasierakoLetra);
                   cHasierakoLetra := upcase(cHasierakoLetra);
                   LetraBatezHastenDirenLiburuak(cHasierakoLetra, sFitxIzenLiburutegia);
                end;
         end;
         readln;
      until cAukera = '0';
      
      ArraytikFitxategiraIrauli(ardErreserbak, iLuzera, sFitxIzenErreserbak);
   end;

   readln;
end.
 

iruzkinik ez:

Argitaratu iruzkina