2024(e)ko maiatzaren 1(a), asteazkena

Azterketa: 2023ko maiatzaren deialdia


2023ko Maiatzaren deialdiko programa: Kromoen bilduma


Ariketari lotutako informazioa:
Datu-fitxategiak sortzeko programak:
  • DatuFitxategiaSortu.pas bezero-programa (bilduma21 unitatearekin, bilduma30 unitatearekin edo bilduma39 unitatearekin batera karpeta berean kokatu, adibidez C:\GurePrograma karpetan)  
  • bilduma21.pas unitatearen iturburu-kodea (DatuFitxategiaSortu.pas bezero-programarekin batera karpeta berean kokatu, adibidez C:\GurePrograma karpetan), edo...  
  • bilduma30.pas unitatearen iturburu-kodea (DatuFitxategiaSortu.pas bezero-programarekin batera karpeta berean kokatu, adibidez C:\GurePrograma karpetan), edo...  
  • bilduma39.pas unitatearen iturburu-kodea (DatuFitxategiaSortu.pas bezero-programarekin batera karpeta berean kokatu, adibidez C:\GurePrograma karpetan)  
Datu-fitxategiak:
  • KROMOAK.DAT datu-fitxategiak 21, 30 edo 39 elementu izan ditzake (bilduma21.pas unitatearekin, bilduma30.pas unitatearekin edo bilduma39.pas unitatearekin sortu bada) 
  • JOKALARIAK.DAT datu-fitxategiak 340 elementu ditu eta bezero-programarekin batera karpeta berean kokatu (adibidez, C:\GurePrograma karpetan)  

2023-05-24_KromoenBilduma.pas programak neurri desberdineko datu-fitxategiak prozesa ditzake, adibidez 21, 30 edo 39 elementuko datu-fitxategiak (gehienez 340 elementu izan ditzake datu-fitxategiak). Ondorioz, programa honetan erabiltzen den arraya zehazteko luzera logikoa adierazten duen aldagaia beharko da, jakinik arrayaren muga 340 elementukoa dela:

   program Kromoak_2023ko_maiatza;

   uses
      crt, sysutils;
   
   const
      iMAX = 340;                  // enuntziatuan 471
      sBIDEA = 'C:\KromoBilduma\';
   
   type
      taiBilduma = array[1..iMAX] of integer;

Hau da bilduma21 izeneko unitatearen interfazea (bilduma30 unitatearen eta bilduma39 unitatearen interfazeak berdinak dira, eta aldea BildumarenFitxategiaSortu prozeduran dago):
(* -------------------------- bilduma21 unitatearen interfazea ------------------ *)

const
   sBIDEA = 'C:\KromoBilduma\';

type
   integer = smallint;     (* INTEGER-entzat 2 byte erabiltzera behartzen da *)
   
   tsKate25  = string[25];
   tsKate199 = string[199];

   trdBalioak = record
                   iDefentsan,
                   iKontrolean,
                   iErasoan,
                   iGuztira: integer;
                end;

   trdKromoa = record
                  iZenbakia : integer;
                  sIzena    : tsKate25;
                  sTokia,
                  sTaldea   : tsKate25;
                  rdBalioak : trdBalioak;
                  iZenbatAle: integer;
               end;

   tfrdBilduma = file of trdKromoa;

   procedure BildumarenFitxategiaSortu(sFitxIzenBilduma: tsKate199);

   procedure BildumarenFitxategiaIkusi(sFitxIzenBilduma: tsKate199);
   
(* ---------------------------- interfazearen amaiera -------------------------- *)


2023ko Maiatzaren deialdiko teoria
  1-A   |   2-A   |   3-A   |   4-A   |   5-A   |   6-A   |   7-D  

Galderei dagozkien programak:

 

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.
 

Azterketa: 2022ko uztailaren deialdia


2022ko Uztailaren deialdiko programa: Biblioteka


Ariketari lotutako informazioa:
  • 2022-06-29_Biblioteka.pdf (ariketaren enuntziatua)
  • 2022-06-29_Liburutegia_BaztertuEtaErreserbakKendu bezero-programa (unitatearekin batera karpeta berean kokatu, adibidez C:\GurePrograma karpetan)  
  • liburuak.pas unitatearen itrurburu-kodea (bezero-programarekin batera karpeta berean kokatu, adibidez C:\GurePrograma karpetan)  
  • Unitatea-windows.zip (liburuak unitate aurrekonpilatuaren bi fitxategiak eta datuak biltzen dituzten bi datu-fitxategiak). Guztira lau fitxategi, lau fitxategi hauek aurreko iturburu-programei esker lor daitezke:
    • liburuak.ppw eta liburuak.ow fitxategiak (bezero-programarekin batera karpeta berean kokatu, adibidez C:\GurePrograma karpetan)
    • LIBURUAK.DAT eta ERRESERBAK.DAT bi fitxategi hauek C:\Azterketa karpetan kokatu behar dira derrigorrez

Hau da liburu izeneko unitatearen interfazea:
(* -------------------------- liburuak unitatearen interfazea ------------------ *)

type
   tsKate199 = string[199];

procedure LiburutegiarenFitxategiaSortu(sFitxIzenLiburutegia: tsKate199);
procedure LiburutegiarenFitxategiaIkusi(sFitxIzenLiburutegia: tsKate199);
procedure ErreserbenFitxategiaSortu(sFitxIzenErreserbak: tsKate199);
procedure ErreserbenFitxategiaIkusi(sFitxIzenErreserbak: tsKate199);

(* ---------------------------- interfazearen amaiera -------------------------- *)


2022ko Uztailaren deialdiko teoria
  1-B   |   2-B   |   3-C   |   4-D   |   5-C   |   6-B   |   7-D  

Galderei dagozkien programak:

 

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.
 

Azterketa: 2022ko maiatzaren deialdia


2022ko Maiatzaren deialdiko programa: Liburutegia


Ariketari lotutako informazioa:

Hau da datumota izeneko unitatearen kodea:
(* -------------------------- datumota unitatearen kodea ------------------ *)

INTERFACE

const
   iERRESERBA_MAX = 20;        { enuntziatuan 100 }
   sBIDEA = 'C:\Azterketa\';
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;
   
   
IMPLEMENTATION

   (* hutsik *)
   
END.
   
(* ---------------------------- unitatearen amaiera -------------------------- *)


Eta hau da liburu izeneko unitatearen interfazea:
(* -------------------------- liburu unitatearen interfazea ------------------ *)

uses
   datumota, crt;

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;
   
procedure FitxategitikArrayraIrauli(sFitxIzenErreserbak: tsKate199;
                                      var ardErreserbak: tardErreserbak;
                                            var iLuzera: integer);
procedure ArraytikFitxategiraIrauli(const ardErreserbak: tardErreserbak;
                                                iLuzera: integer;
                                    sFitxIzenErreserbak: tsKate199);

procedure ErreserbenArrayaIkusi(const ardErreserbak: tardErreserbak;
                                            iLuzera: integer);
procedure LiburutegiarenFitxategiaSortu(sFitxIzenLiburutegia: tsKate199);
procedure LiburutegiarenFitxategiaIkusi(sFitxIzenLiburutegia: tsKate199);
procedure ErreserbenFitxategiaSortu(sFitxIzenErreserbak: tsKate199);
procedure ErreserbenFitxategiaIkusi(sFitxIzenErreserbak: tsKate199);
   
(* ---------------------------- interfazearen amaiera -------------------------- *)


2022ko Maiatzaren deialdiko teoria
  1-A   |   2-C   |   3-B   |   4-D   |   5-D   |   6-B   |   7-D  

Galderei dagozkien programak:

 

Azterketa: 2021eko uztailaren deialdia

2021eko Uztailaren deialdiko programa: Txertoak


Ariketari lotutako informazioa:
  • 2021-06-30_Txertoak.pdf (ariketaren enuntziatua)
  • Programaren balizko emaitza txerto.pas unitatea eta Txertoak_azterketakoa.pas bezero-programa). Bi fitxategi horiek karpeta berean kokatu eta konpilatu:
    • txerto unitatea konpilatzean ondoko bi hauek lortuko dira:
      • txerto.ppw fitxategia eta... 
      • txerto.ow fitxategia
    • Txertoak_azterketakoa.pas bezero-programa konpilatzean eta linkatzean hau lortuko da:
      • Txertoak_azterketakoa.exe fitxategi exekutagarria

Hau da txerto izeneko unitatearen interfazea:

(* ---------------------------- txerto unitatearen interfazea -------------------- *)

   const
      iLUZERA = 72 ;        (* ikasle kopuru maximoa *)
      
   type
      integer = longint ;   (* INTEGER-entzat 4 byte erabiltzera behartzen da *)
      real    = double ;    (* REAL-entzat 8 byte erabiltzera behartzen da    *)
         
      tsKateIzena = string[200] ;
      tsKate49    = string[49] ;
      tsKate9     = string[9] ;
      tsKate5     = string[5] ;
      tsKate2     = string[2] ;
  
      trdHitzorduBat = record
                          iEguna: integer ;
                          sOrdua: tsKate5 ;
                          sLekua: tsKate5 ;
                       end ; 
      trdIkasleBatKomunikatu = record
                                         sNAN: tskate9 ;    (* 123456789Z *)
                                         sNor: tsKate49 ;   (* IZA GARAI, MARTIN *)
                                   sTelefonoa: tskate9 ;    (* 123456789 *)
                                  rdHitzordua: trdHitzorduBat ;
                               end ;
      tfrdKomunikazioak = file of trdIkasleBatKomunikatu ;
      
      trdIkasleBatTxertatu = record
                                            sNAN: tskate9 ;    (* 123456789Z *)
                                            sNor: tsKate49 ;   (* IZA GARAI, MARTIN *)                            
                                     rdHitzordua: trdHitzorduBat ;
                                     boTxertatua: boolean ;
                                sMatrilulaAldatu: tskate9 ;    (* uuuuhhee *)
                             end ;
      tfrdTxertaketa = file of trdIkasleBatTxertatu ;

   procedure TxertaketaFitxategiaSortu(sFitxIzenT: tsKateIzena; sFitxIzenK: tsKateIzena) ;
   procedure IkasleBatenTxertoarenDatuakErakutsi(const rdIkaslea: trdIkasleBatTxertatu) ;
   procedure TxertaketaFitxategiaIkusi(sFitxIzenT: tsKateIzena) ;
   procedure TxertaketaFitxategiaHasieratu(sFitxIzenT: tsKateIzena) ;
   
   procedure KomunikazioFitxategiaSortu(sFitxIzenK: tsKateIzena) ;
   procedure KomunikazioHitzorduaOsatu(sFitxIzenK: tsKateIzena) ;
   procedure IkasleBatenKomunikazioaErakutsi(const rdIkaslea: trdIkasleBatKomunikatu) ;
   procedure KomunikazioFitxategiaIkusi(sFitxIzenK: tsKateIzena) ;
   procedure KomunikazioFitxategiaHasieratu(sFitxIzenK: tsKateIzena) ;
   
(* ---------------------------- interfazearen amaiera -------------------------- *)


2021eko Uztailaren deialdiko teoria
  1-B   |   2-B-C-D   |   3-B   |   4-A   |   5-C-D   |   6-A   |   7  

Galderei dagozkien programak:

 

Azterketa: 2019ko uztailaren deialdia

2019ko Uztailaren deialdiko programa: Urrutiko botazioak


Ariketari lotutako informazioa:


2019ko Uztailaren deialdiko teoria
  1-C   |   2-C   |   3-C   |   4-D   |   5-A-C   |   6-C   |   7-A