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.
iruzkinik ez:
Argitaratu iruzkina