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):
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 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.
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
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 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.
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: