2023(e)ko apirilaren 24(a), astelehena

13. astea | kaosa sortzen (fitxategi ordenatu bat desordenatzen)

  kaosa sortzen  




Ariketa honen algoritmoa 11. astean ikusitako kaosa sortzen (array ordenatu bat desordenatzen) ariketan programatu zen berbera da. Orduan informazioa erregistroen array batean zegoen, eta orain erregistroen fitxategi batean.




Erregistroen fitxategi bat daukagu. Erregistroak hiru eremuz osaturik daude: kate bat, zenbaki oso bat eta zenbaki erreal bat. Erregistroen fitxategiaren datu batzuk konstante array batetik hartzen dira. Honako hau da erregistroen fitxategiaren datu-mota:


const
iKOPURUMAX = 15;
type
tsKate49 = string[49];
trdFitxa = record
sIzenDeiturak: tsKate49;
byDeialdia: byte; (* osoa, txikia eta positiboa *)
rNota: real;
end ;
tfrdFitxategi = file of trdFitxa ;




asIZENAK array konstantea da eta horretaz oinarriturik balioak hartuko ditu fitxategiak. Datuen asIZENAK array konstantea alfabetikoki ordenaturik dagoenez, fitxategia ordenaturik egongo da ere. Fitxategia desordenatzeko ardIkasleak eta ardKaotikoak array laguntzaileak erabiliko dira.  




Fitxategiaren edukia ardIkasleak arrayra igaro ondoren, nahasketa burutzen da ardKaotikoak arraya lortzeko. Behin ardKaotikoak arraya daukagula, bere edukia berriro fitxategian gordetzen da. Arrayaren nahasketa ZerrendaNahastu izeneko prozeduran burutzen da eta horretarako datu-mota berezi pare bat sortuko dugu, trdLaguntzaile erregistroa eta tardLaguntzaile arraya. Programaren gainerako tokietan erabilpenik ez dutenez, datu-mota espezifiko horiek ZerrendaNahastu prozedura barruan sortzen dira:


{ bi datu-mota berri sortzen dira, soilik prozedura honetan erabiliko direnak }
procedure ZerrendaNahastu(const ardIkasleak: tardIkasleak;
iLuzera: integer;
var ardKaotikoak: tardIkasleak);
type
trdLaguntzaile = record
rdIkaslea: trdFitxa;
boGordeta: boolean;
end;
tardLaguntzaile = array[1..iKOPURUMAX] of trdLaguntzaile;
var
ardLaguntzailea: tardLaguntzaile;
...




Fitxategi ordenatu bat desordenatzen duen programa hau izan daiteke:


program KaosaSortzenFitxategiBatean;
uses
crt;
const
iZENBATIKASLE = 12;
type
tsKate49 = string[49];
tasIzenenZerrenda = array[1..iZENBATIKASLE] of tsKate49;
tarNotenZerrenda = array[1..iZENBATIKASLE] of real;
const
asIZENAK: tasIzenenZerrenda = ('AGIRRE ROMERO, UNAI', // 01
'ANGULEMA CARAZO, JON ANDER', // 02
'BIKARREGI IGLESIAS, JULEN', // 03
'CANO RUIZ DE HEREDIA, JULIAN', // 04
'CORRAL EGIA, JOSEBA ANDONI', // 05
'DIAZ DE ULZURRUN, ROY, LEONOR', // 06
'EGIGUREN MARKINEZ, IRUNE', // 07
'ERKIAGA ANDONEGI, IKER', // 08
'FERNANDEZ FEITO, FELIX', // 09
'GARTZIA DE ALZA GIL, KATALIN', // 10
'HERRANZ MARTINEZ, REBECA', // 11
'IRAGORRI COTANO, MARTIN'); // 12
const
arNOTAK: tarNotenZerrenda = (4.6, // 01
3.2, // 02
5.7, // 03
4.8, // 04
5.1, // 05
6.1, // 06
7.3, // 07
7.6, // 08
2.8, // 09
9.2, // 10
2.9, // 11
8.5); // 12
type
trdIkasle = record
sNor: tsKate49;
rNota: real;
end;
tardIkasleak = array[1..iZENBATIKASLE] of trdIkasle;

tsKateLuze = string[199];
tfrdFitxategi = file of trdIkasle;

{ ikasleen izenak eta notak array konstanteetan daude }
procedure FitxategiaSortuEtaBete(sFitxIzen: tsKateLuze; iLuzera: integer);
var
f: tfrdFitxategi;
rdIkasleBat: trdIkasle;
k: integer;
begin
assign(f, sFitxIzen);
rewrite(f);

for k:=1 to iLuzera do
begin
rdIkasleBat.sNor := asIZENAK[k];
rdIkasleBat.rNota := arNOTAK[k];
write(f, rdIkasleBat);
end;

close(f);
end;

{ fitxategiaren edukia pantailaratu }
procedure FitxategiaIkusi(sFitxIzen: tsKateLuze);
var
f: tfrdFitxategi;
rdIkasleBat: trdIkasle;
begin
assign(f, sFitxIzen);
reset(f);

while not eof(f) do
begin
read(f, rdIkasleBat);
writeln(rdIkasleBat.sNor:57, rdIkasleBat.rNota:15:1);
end;

close(f);
end;

{ fitxategiaren edukia array batera eraman. iLuzera ez da behar ezaguna delako programa nagusian }
procedure FitxategiArray(sFitxIzen: tsKateLuze; var ardIkasleak: tardIkasleak);
var
f: tfrdFitxategi;
rdIkasleBat: trdIkasle;
k: integer;
begin
assign(f, sFitxIzen);
reset(f);

k := 0;
while not eof(f) do
begin
read(f, rdIkasleBat);
k := k + 1;
ardIkasleak[k] := rdIkasleBat;
end;

close(f);
end;

{ arrayaren edukia fitxategian gorde }
procedure ArrayFitxategi(const ardKaotikoak: tardIkasleak; iLuzera: integer; sFitxIzen: tsKateLuze);
var
f: tfrdFitxategi;
rdIkasleBat: trdIkasle;
k: integer;
begin
assign(f, sFitxIzen);
rewrite(f);

for k:=1 to iLuzera do
begin
rdIkasleBat := ardKaotikoak[k];
write(f, rdIkasleBat);
end;

close(f);
end;

{ arrayaren edukia pantailaratu }
procedure DatuakIkusi(const ardIkasleak: tardIkasleak; iLuzera: integer);
var
k: integer;
begin
for k:=1 to iLuzera do
begin
writeln(k:10, ' . ikaslea: ', ardIkasleak[k].sNor:40, ardIkasleak[k].rNota:10:1);
end;
end;

{ bi datu-mota berri sortzen dira, soilik prozedura honetan erabiliko direnak }
procedure ZerrendaNahastu(const ardIkasleak: tardIkasleak;
iLuzera: integer;
var ardKaotikoak: tardIkasleak);
type
trdLaguntzaile = record
rdIkaslea: trdIkasle;
boGordeta: boolean;
end;
tardLaguntzaile = array[1..iZENBATIKASLE] of trdLaguntzaile;
var
ardLaguntzailea: tardLaguntzaile;
k, iZbk: integer;
begin
for k:=1 to iLUZERA do
begin
ardLaguntzailea[k].boGordeta := FALSE;
end;

randomize;
for k:=1 to iLuzera do
begin
repeat
iZbk := random(iLUZERA) + 1;
//writeln('k=', k:2, '----------');
until ardLaguntzailea[iZbk].boGordeta = FALSE;

ardLaguntzailea[iZbk].boGordeta := TRUE;
ardLaguntzailea[iZbk].rdIkaslea := ardIkasleak[k];
end;

for k:=1 to iLUZERA do
begin
ardKaotikoak[k] := ardLaguntzailea[k].rdIkaslea;
end;
end;

{ ---------------------------------- Programa Nagusia ---------------------------------- }
var
sFitxIzen: tsKateLuze;
ardIkasleak: tardIkasleak;
iLuzera: integer;
ardKaotikoak: tardIkasleak;
begin
clrscr;
writeln;
writeln;

repeat
write('Zenbat ikasle dira? (1 eta ', iZENBATIKASLE, ' artean): ');
readln(iLuzera);
until (iLuzera >= 1) and (iLuzera <= iZENBATIKASLE);
writeln;

sFitxIzen := 'C:\Ikasleak.dat';
FitxategiaSortuEtaBete(sFitxIzen, iLuzera);

writeln('===Fitxategi ordenatuaren edukia===============================================');
FitxategiaIkusi(sFitxIzen);
writeln;

FitxategiArray(sFitxIzen, ardIkasleak);

writeln('---Array Laguntzailea Nahastu aurretik-----------------------------------------');
DatuakIkusi(ardIkasleak, iLuzera);
writeln;

ZerrendaNahastu(ardIkasleak, iLuzera, ardKaotikoak);

writeln('---Array Laguntzailea Nahastu ondoren------------------------------------------');
DatuakIkusi(ardKaotikoak, iLuzera);
writeln;

ArrayFitxategi(ardKaotikoak, iLuzera, sFitxIzen);

writeln('===Fitxategi desordenatuaren edukia============================================');
FitxategiaIkusi(sFitxIzen);
writeln;
writeln;

repeat until keypressed;
end.


 

Direktorioak: Non gaude?
















Gure programetan sarritan egiten dugu hau, baina zer balio jarriko dugu sBIDEA kostantean:



   write(Fitxategiaren izena eman (LIBURUAK adibidez): ');
readln(sFitxIzenLiburutegia);
sFitxIzenLiburutegia := sBIDEA + sFitxIzenLiburutegia + '.DAT';


Beste modu batez galdeturik: datu-fitxategia non sortzen da?




  • HemenGaude direktorio bat sortu ordenadorearen edozein tokitan (mahaigainean adibidez), bere barnean HemenGorde direktorio bat sortu

  • HanGorde direktorio bat sortu C:\Dev-Pas direktorioan














Datu-fitxategia non sortzen da? galderari erantzuteko programa bat erakusten da beherago. Zenbakiak gordetzen dituen FitxategiakEtaDirektorioak programa deskriba dezagun urratsez urrats:




  • Hasieran uneko direktorioa erakusten da pantailan GetCurrentDirectory funtzioari esker
  • Ondoren, datu-fitxategiaren sIzena izena teklatuaren bitartez emango du erabiltzaileaak 

  • Datu-fitxaregiaren izen osoa eraikitzen da aurretik bidea jarriz eta ostean gehiagarri bat eta luzapena jarriz, bidearen aukerak hauek dira:


    1.   ''

    2.   'HemenGorde\'

    3.   GetCurrentDir + ''\''

    4.   'HanGorde\'

    5.   '\Dev-Pas\HanGorde\'

    6.   'C:\Dev-Pas\HanGorde\'

    7.   'E:\Dev-Pas\HanGorde\'

    8.   'E:\'


  • Datu-fitxategiaren izen osoa finkaturik bere existentzia aztertzen du programak, eta horren arabera bi bide irekitzen dira:
    • Datu-fitxategia ez bada existitzen sortu eta elementuak biltegitzen dira
    • Datu-fitxategia existitzen bada elementu berriak gehitzen dira bukaeran 



Iturburu-programa konpilatu ondoren FitxategiakEtaDirektorioak.exe programa exekutagarria lortuko dugu eta egikaratzeko bi modu daude: Dev-Pas programazio-ingurune barrutik eta Dev-Pas programazio-ingurunetik kanpo.










Dev-Pas programazio-ingurunetik kanpo



Iturburu-programa konpilatuz FitxategiakEtaDirektorioak.exe programa exekutagarria lortu ondoren, Dev-Pas ingurunetik irten HemenGaude direktoriora joateko eta FitxategiakEtaDirektorioak.exe gainean klik egiteko.








Uneko direktorioa HemenGaude delarik, datu-fitxategiarentzat bide desberdinak aukeratu eta emaitza hauek ikertu:



























































Bidea Datu-fitxategia non sortzen da
1 '' datu-fitxategia HemenGaude direktorioan
2 'HemenGorde\' datu-fitxategia HemenGorde direktorioan
3 GetCurrentDir + '\' datu-fitxategia HemenGaude direktorioan
4 'HanGorde\' exekuzio-denborako errorea
5 '\Dev-Pas\HanGorde\' datu-fitxategia HanGorde direktorioan
6 'C:\Dev-Pas\HanGorde\' datu-fitxategia HanGorde direktorioan
7 'E:\Dev-Pas\HanGorde\' errorea E: unitatean dauden direktorioen arabera
8 'E:\' E: unitatearen erroan (E: unitatean diskorik badago)












Dev-Pas programazio-ingurune barrutik

FitxategiakEtaDirektorioak.pas iturburu-programa konpilatu eta Dev-Pas programazio-ingurunearen menuko Run project aukera hautatu programa exekutatzeko.






Kasu honetan uneko direktorioa C:\Dev-Pas dela jakinik, datu-fitxategiarentzat bide desberdinak aukeratu eta emaitza hauek ikertu:



























































Bidea Datu-fitxategia non sortzen da
1 '' datu-fitxategia C:\Dev-Pas direktorioan
2 'HemenGorde\' exekuzio-denborako errorea
3 GetCurrentDir + '\' datu-fitxategia C:\Dev-Pas direktorioan
4 'HanGorde\' datu-fitxategia C:\Dev-Pas\HanGorde direktorioan
5 '\Dev-Pas\HanGorde\' datu-fitxategia C:\Dev-Pas\HanGorde direktorioan
6 'C:\Dev-Pas\HanGorde\' datu-fitxategia C:\Dev-Pas\HanGorde direktorioan
7 'E:\Dev-Pas\HanGorde\' errorea E: unitatean dauden direktorioen arabera
8 'E:\' E: unitatearen erroan (E: unitatean diskorik badago)











FitxategiakEtaDirektorioak.pas iturburu-programa





program FitxategiakEtaDirektorioak;

uses
sysutils; (* GetCurrentDir eta FileExists funtzioek behar dutelako *)

type
tfFitxategia = file of integer;
tsKatea = string[199];


procedure FitxategiaIkusi(sFitxIzen: tsKatea);
var
f: tfFitxategia;
iElementua: integer;
begin
{ uztartu }
assign(f, sFitxIzen);
reset(f);

writeln('"', sFitxIzen, '" fitxategiak ', filesize(f), ' elementu ditu, bere edukia:');
while not eof(f) do
begin
read(f, iElementua);
writeln(iElementua:5);
end;
writeln('.....................................................................');
writeln;
{ itxi }
close(f);
end;


procedure FitxategiaSortuEtaBete(sFitxIzen: tsKatea);
var
f: tfFitxategia;
iElementua, i, kopurua: integer;
begin
{ uztartu }
assign(f, sFitxIzen);
rewrite(f);

write('Zenbat elementu nahi dituzu "', sFitxIzen, '" fitxategian? ');
readln(kopurua);

randomize; { random-aren hazia hasieratu }
for i:=1 to kopurua do
begin
iElementua:=random(10); { 0 eta 9 arteko zenbakia }
write(f,iElementua); { fitxategian idatzi eta hurrengo elementura pasa }
end;
{ itxi }
close(f);
end;


procedure FitxategiariElementuakGehitu(sFitxIzen: tsKatea);
var
f: tfFitxategia;
iElementua: integer;
cErantz: char;
begin
{ uztartu }
assign(f, sFitxIzen);
reset(f);
seek(f, filesize(f));
repeat
write('"', sFitxIzen, '" fitxategian gordetzeko zenbaki bat eman: ');
readln(iElementua);
write(f, iElementua);
write('Datu gehiagorik gorde nahi duzu? (B/E): ');
readln(cErantz);
cErantz := upcase(cErantz);
until cErantz <> 'B';
{ itxi }
close(f);
end;


{============================PROGRAMA NAGUSIA============================}

var
sIzena: tsKatea;
cAukera: char;

begin
writeln;
writeln;
writeln('Uneko direktorioa: ', GetCurrentDir);
writeln;

writeln('Lanerako fitxategiaren izena eman ezazu (luzapenik gabe)...');
write('Adibidez, "Datuak" izena: ');
readln(sIzena);

writeln;

writeln;
repeat
writeln(' "', sIzena, '" fitxategiaren bidea aukeratu:');
writeln(' 1. ""');;
writeln(' 2. "HemenGorde\"');
writeln(' 3. GetCurrentDir + "\"');
writeln(' 4. "HanGorde\"');
writeln(' 5. "\Dev-Pas\HanGorde\"');
writeln(' 6. "C:\Dev-Pas\HanGorde\"');
writeln(' 7. "E:\Dev-Pas\HanGorde\"');
writeln(' 8. "E:\"');
writeln;
write('Exekuzio-denborako errorea gerta daitekeen arren, bide bat aukeratu: ');
readln(cAukera);
until (cAukera >= '1') and (cAukera <= '8');

case cAukera of
'1': sIzena := '' + sIzena + '_aukera-' + cAukera + '.DAT';
//'1': sIzena := sIzena + '_aukera-' + cAukera + '.DAT';
'2': sIzena := 'HemenGorde\' + sIzena + '_aukera-' + cAukera + '.DAT';
'3': sIzena := GetCurrentDir + '\' + sIzena + '_aukera-' + cAukera + '.DAT';
'4': sIzena := 'HanGorde\' + sIzena + '_aukera-' + cAukera + '.DAT';
'5': sIzena := '\Dev-Pas\HanGorde\' + sIzena + '_aukera-' + cAukera + '.DAT';
'6': sIzena := 'C:\Dev-Pas\HanGorde\' + sIzena + '_aukera-' + cAukera + '.DAT';
'7': sIzena := 'E:\Dev-Pas\HanGorde\' + sIzena + '_aukera-' + cAukera + '.DAT';
'8': sIzena := 'E:\' + sIzena + '_aukera-' + cAukera + '.DAT';
end;

writeln;

if fileexists(sIzena) then
begin
writeln('"', sIzena, '" fitxategia existitzen da, lan egin dezagun.');
writeln;
FitxategiaIkusi(sIzena);
FitxategiariElementuakGehitu(sIzena);
FitxategiaIkusi(sIzena);
end
else
begin
writeln('"', sIzena, '" fitxategia ez da existitzen, sortuko dugu.');
writeln;
FitxategiaSortuEtaBete(sIzena);
FitxategiaIkusi(sIzena);
end;

writeln;
write('RETURN sakatu programa bukatzeko');
readln;
end.


 

13. astea | fitxategi beraren edukia modu desberdinez pantailaratzen
























Demagun erregistroen fitxategi bat sortu dugula. Fitxategiaren elementu bakoitza erregistro bat da, eta erregistroak bi eremu ditu: lehena Integer datu-motakoa eta bigarrena Real datu-motakoa.

     trdIntReal = RECORD
Lehena : integer ;
Bigarrena: real ;
END ;

Demagun sortutako fitxategiaren izena Zenbakiak.dat dela eta bere edukia datu-mota desberdineko fitxategien bitartez pantailaratzea nahi dugula. Eduki bera pantailaratzeko lau fitxategiren datu-motak erabiliko dira.




1




Zenbakiak.dat fitxategiaren edukia pantailaratzeko erabiliko dugun datu-mota DM_rdIntReal da, hots, sorrerako datu-mota berbera. Ondorioz, pantailaratuko den informazioa "jatorrizkoa" izango da. Adibidean:


1. eremuan 163 balioa eta 2. eremuan 1.1295338E+001 balioa.




2




Zenbakiak.dat fitxategiaren edukia pantailaratzeko erabiliko dugun datu-mota DM_rdRealInt da, jatorrizkoaren antzekoa baina eremuen datu-motak elkar trukaturik (lehena Real datu-motakoa eta bigarrena Integer datu-motakoa):

     trdRealInt = RECORD
Lehena : real ;
Bigarrena: integer ;
END ;

Ondorioz, nahiz eta Zenbakiak.dat fitxategiaren edukia ez den aldatu, pantailaratuko den informazioa bestelakoa izango da. Adibidean:


1. eremuan 9.7150463E+302 balioa eta 2. eremuan 1076270902 balioa.




3




Zenbakiak.dat fitxategiaren edukia pantailaratzeko erabiliko dugun FILE datu-mota DM_fbyBytak da, hots, fitxategian BYTE datu-motako informazioa dagoela interpretatzen duen fitxategia. Horregatik, Zenbakiak.dat fitxategiaren edukia hainbat byten sorta delakoan, byte guztiak banan-banan pantailaratuko dira.






4




Zenbakiak.dat fitxategiaren edukia pantailaratzeko erabiliko dugun FILE datu-mota DM_fcKaraktereak da, hots, fitxategian CHAR datu-motako informazioa dagoela interpretatzen duen fitxategia. Horregatik, Zenbakiak.dat fitxategiaren edukia hainbat karakteren sorta delakoan, karaktere guztiak banan-banan pantailaratuko dira; bide batez, karaktere bakoitzaren ordinala ere erakusten da (3 urratseko informazio bera da).











{-----------------------------------------------------------------
Erregistroak gordetzen dituen Zenbakiak.dat fitxategia sortu eta
datu-mota desberdineko fitxategien bitartez atzitu.
-----------------------------------------------------------------}

program Fitxategi_integerrealbytechar;

type
tsKate99 = string[99];

trdIntReal = record
Lehena : integer;
Bigarrena: real;
end;

tfrdIntReal = file of trdIntReal;

trdRealInt = record
Lehena : real;
Bigarrena: integer;
end;

tfrdRealInt = file of trdRealInt;

tfbyBytak = file of byte;

tfcKaraktereak = file of char;


procedure INTEGER_REAL_FitxategiaSortu(sFitxIzen: tsKate99);
var
f: tfrdIntReal;
rdZenbakiak: trdIntReal;
k, iZenbat: integer;
begin
assign(f, sFitxIzen);
rewrite(f);

write('Zenbat elementu nahi dituzu (2 elementu adibidez): ');
readln(iZenbat);

randomize;
for k:=1 to iZenbat do
begin
rdZenbakiak.Lehena := random(256); (* byte baten balioak *)
rdZenbakiak.Bigarrena := random*100; (* 0.0 eta 0.999 artekoa *)
write(f, rdZenbakiak);
end;

close(f);
end;


procedure INTEGER_REAL_FitxategiaIkusi(sFitxIzen: tsKate99);
var
f: tfrdIntReal;
rdZenbakiak: trdIntReal;
begin
assign(f, sFitxIzen);
reset(f);

while not eof(f) do
begin
read(f, rdZenbakiak);
writeln('1. eremua = ', rdZenbakiak.Lehena:3, '2. eremua =':30, rdZenbakiak.Bigarrena:15);
end;

close(f);
end;


procedure REAL_INTEGER_FitxategiaIkusi(sFitxIzen: tsKate99);
var
f: tfrdRealInt;
rdZenbakiak: trdRealInt;
begin
assign(f, sFitxIzen);
reset(f);

while not eof(f) do
begin
read(f, rdZenbakiak);
writeln('1. eremua =', rdZenbakiak.Lehena:15, '2. eremua = ':20, rdZenbakiak.Bigarrena:2);
end;

close(f);
end;


procedure CHAR_FitxategiaIkusi(sFitxIzen: tsKate99);
var
f: tfcKaraktereak;
cKarakterea: char;
k: integer;
begin
assign(f, sFitxIzen);
reset(f);

k:= 0;
while not eof(f) do
begin
read(f, cKarakterea);
k := k + 1;
writeln(k:3, '. elementua = |', cKarakterea, '| ', Ord(cKarakterea):3);
end;

close(f);
end;


procedure BYTE_FitxategiaIkusi(sFitxIzen: tsKate99);
var
f: tfbyBytak;
byByte: byte;
k: integer;
begin
assign(f, sFitxIzen);
reset(f);

k:= 0;
while not eof(f) do
begin
read(f, byByte);
k := k + 1;
writeln(k:3, '. elementua = ', byByte:3);
end;

close(f);
end;


var {---------------------- Programa Nagusiko aldagaiak ---------------}
sFitxIzen: tsKate99;


begin {--------------------------- Programa Nagusia -------------------}

{
sFitxIzen := 'C:\Datuak\Zenbakiak.dat';
writeln('Fitxategi bitarraren izena: ', sFitxIzen);
}

sFitxIzen := 'Zenbakiak.dat';
writeln('Fitxategi bitarraren izena: ', sFitxIzen);

writeln;
writeln('sizeof(tsKate99) = ', sizeof(tsKate99):3, ' byte');
writeln('sizeof(integer) = ', sizeof(integer):3, ' byte');
writeln('sizeof(real) = ', sizeof(real):3, ' byte');
writeln('sizeof(byte) = ', sizeof(byte):3, ' byte');
writeln('sizeof(char) = ', sizeof(char):3, ' byte');
writeln('sizeof(trdIntReal) = ', sizeof(trdIntReal):3, ' byte');
writeln('sizeof(trdRealInt) = ', sizeof(trdRealInt):3, ' byte');
writeln;
writeln('RETURN sakatu aurrera egiteko!');
readln;

INTEGER_REAL_FitxategiaSortu(sFitxIzen); { Lehen eremua integer }
writeln; { Bigarren eremua real }

writeln('Zenbakiak.dat fitxategiaren edukia integer-real bezala azterturik:');
writeln('------------------------------------------------------------');
INTEGER_REAL_FitxategiaIkusi(sFitxIzen);
writeln('------------------------------------------------------------');
writeln;

writeln('Zenbakiak.dat fitxategi bera real-integer bezala azterturik:');
writeln('------------------------------------------------------------');
REAL_INTEGER_FitxategiaIkusi(sFitxIzen);
writeln('------------------------------------------------------------');
writeln;

writeln('Zenbakiak.dat fitxategi bera BYTE bezala azterturik:');
writeln('------------------------------------------------------------');
BYTE_FitxategiaIkusi(sFitxIzen);
writeln('------------------------------------------------------------');
writeln;

writeln('Zenbakiak.dat fitxategi bera CHAR bezala azterturik:');
writeln('------------------------------------------------------------');
CHAR_FitxategiaIkusi(sFitxIzen);
writeln('------------------------------------------------------------');
writeln;

writeln;
writeln ('Programa amaitzeko RETURN tekla sakatu');
readln;

end. { PROGRAMAREN BUKAERA }



 

2023(e)ko apirilaren 23(a), igandea

13. astea | bi fitxategi nahastu


















Ezaguna den ariketa hau fitxategiak erabiliz egin!








Erregistroen bi bektore fitxategi nahastu








Laborategiko gelan, gehienez, 25 ikasle izango dira. Ikasleen datuak bi arrayetan biltzen dira, array bat lehen azterketari dagokio eta beste arraya bigarren azterketari dagokio.





Arrayaren elementuak kateak dira, eta bertan izena eta zenbaki bat / batez banaturik daude, zenbakien kopuru maximoa 9.9 izango eta minimoa 0.0 izango da.





Datuak teklatuaren bitartez ematen dira eta ikasleen posizioak arrayetan zaindu behar dira berdinak izan daitezan, hurrengo adibidean erakusten den bezala. asAzterketa1 eta asAzterketa2 abiapuntuko arrayak dira eta ardAzterketak arraya lortu behar dena. Hona hemen datuen adibide bat:








asAzterketa1





‘Josu/6.1’


‘Ane/7.6’


‘Mikel/2.7’


1


2


3






asAzterketa2





‘Josu/6.9’


‘Ane/5.4’


‘Mikel/6.3’


1


2


3






iLuzera




3












ardAzterketak






‘Josu’


‘Josu’


‘Ane’


‘Ane’


‘Mikel’


‘Mikel’


6.1


6.9


7.6


5.4


2.7


6.3


1


2


3


4


5


6






iZenbat




6









Datu zerrenda bat array batean gorde daiteke, edo bestela fitxategi batean ere gorde daiteke. Ondoko ariketa egin dezagun: bi fitxategietatik abiatuta aurreko biak nahastuz fitxategi bakarra lortu.



Hona hemen, proposatutako ariketaren hasiera:




program ErregistroenBiFitxategiNahastenEMATEKOA;

type
tsKate30 = string[30];
tsKate250 = string[250];
tfsAgendaZahar = file of tsKate30;

procedure DatuakSartu(sFitxIzen1, sFitxIzen2: tsKate250);
var
f1, f2: tfsAgendaZahar;
iZenbatElementu: integer;
sDatua: tsKate30;
sIzena: tsKate30;
sZenbakiUnitate: tsKate30;
sZenbakiHamarreko: tsKate30;
iZenbakiUnitate: integer;
iZenbakiHamarreko: integer;
n: integer;
begin
assign(f1, sFitxIzen1);
rewrite(f1);
assign(f2, sFitxIzen2);
rewrite(f2);

repeat
write('Zenbat elementu gordeko dira bi fitxategietan? ');
readln(iZenbatElementu);
until iZenbatElementu > 0;

for n:=1 to iZenbatElementu do
begin
write(n, '. lagunaren izena eman: ');
readln(sIzena);

iZenbakiUnitate := random(10); (* 0 eta 9 artean *)
Str(iZenbakiUnitate, sZenbakiUnitate);
iZenbakiHamarreko := random(10); (* 0 eta 9 artean *)
Str(iZenbakiHamarreko, sZenbakiHamarreko);

sDatua := sIzena + '/' + sZenbakiUnitate + '.' + sZenbakiHamarreko;
write(f1, sDatua); (* Fitxategi batean idatzi *)

iZenbakiUnitate := random(10); (* 0 eta 9 artean *)
Str(iZenbakiUnitate, sZenbakiUnitate);
iZenbakiHamarreko := random(10); (* 0 eta 9 artean *)
Str(iZenbakiHamarreko, sZenbakiHamarreko);

sDatua := sIzena + '/' + sZenbakiUnitate + '.' + sZenbakiHamarreko;
write(f2, sDatua); (* Fitxategi batean idatzi *)
end;

close(f1); (* Fitxategiak itxi *)
close(f2);
end;


procedure DatuakIkusi(sFitxIzen: tsKate250);
var
f: tfsAgendaZahar;
sDatua: tsKate30;
begin
assign(f, sFitxIzen);
reset(f);

while not eof(f) do
begin
read(f, sDatua);
writeln(FilePos(f)-1, '. posizioko datua: ', sDatua);
end;

close(f); (* Fitxategia itxi *)
writeln;
end;


{ ============================================================== }


var
sAgendaIzen1, sAgendaIzen2: tsKate250;

begin
write('1. agenda fitxategiaren izena eman: ');
readln(sAgendaIzen1);

write('2. agenda fitxategiaren izena eman: ');
readln(sAgendaIzen2);

DatuakSartu(sAgendaIzen1, sAgendaIzen2);
writeln;

writeln('1. agendaren datuak: ');
DatuakIkusi(sAgendaIzen1);
writeln;

writeln('2. agendaren datuak: ');
DatuakIkusi(sAgendaIzen2);
writeln;

{ hemen idatzi ariketan eskatzen dena }

writeln('Programa amaitzera doa');
readln;
end.












Ariketen iturburu programak























Array datu-mota erabiliz


Fitxategien bitartez




 

13. astea | fitxategi bat bitan banatu


















Aurreko 13. astea | bi fitxategi nahastu ariketaren aurkakoa dela esan genezake!









Zenbakien fitxategi bateko datuak banatu






Demagun abiapuntuko fitxategiak zenbaki osoak dituela, eta datuak sailkatzeko baldintza zenbakia bakoitia/bikoitia izatea dela. Horren arabera progamak banaketa hau egingo du: zenbaki bakoitak fitxategi batera eta zenbaki bikoitiak beste fitxategi batera.








Abiapuntuko fitxategia ez da existitzen horregatik berria sortzen da





Abiapuntuko fitxategia existitzean datuak gehitzen dira



Hasierako fitxategiaren izena erabiltzaileak erabakiko du, goiko irudietan sartzen den izena Zenbakiak da eta programak C:\Datuak\Zenbakiak.DAT osatzen du. Ariketaren emaitza diren bi fitxategien izenak ez ditu erabiltzaileak hautatzen, emaitza diren fitxategiak hauek izango dira:


  • C:\Datuak\Bakoitiak.DAT

  • C:\Datuak\Bikoitiak.DAT   (0 zenbakia bikoititzak hartu)




Hona hemen, proposatutako ariketaren emaitza:

 








program FitxategiBatBitanBanatzen;

uses
sysutils;

type
tfFitxategia = file of integer;
tsKatea199 = string[199];


procedure FitxategiaIkusi(sFitxIzen: tsKatea199);
var
f: tfFitxategia;
iElementua: integer;
begin
{ uztartu }
assign(f, sFitxIzen);
reset(f);

writeln(sFitxIzen, ' fitxategiak ', filesize(f), ' elementu ditu, bere edukia:');
while not eof(f) do
begin
read(f, iElementua);
write(iElementua:5);
end;
writeln;
{ itxi }
close(f);
end;


procedure FitxategiaBete(sFitxIzen: tsKatea199);
var
f: tfFitxategia;
iElementua, k, iKopurua: integer;
begin
{ uztartu }
assign(f, sFitxIzen);
rewrite(f);

write('Zenbat elementu nahi dituzu ', sFitxIzen, ' fitxategian? ');
readln(iKopurua);

randomize; { Random-aren hazia hasieratu }
for k:=1 to iKopurua do
begin
iElementua:=random(10); { 0 eta 9 arteko zenbakia }
write(f,iElementua); { fitxategian idatzi eta hurrengo elementura pasa }
end;
{ itxi }
close(f);
end;


procedure FitxategiariElementuakGehitu(sFitxIzen: tsKatea199);
var
f: tfFitxategia;
iElementua: integer;
cErantz: char;
begin
{uztartu}
assign(f, sFitxIzen);
reset(f);
seek(f, filesize(f));
repeat
write(sFitxIzen, ' fitxategian gordetzeko zenbaki bat eman: ');
readln(iElementua);
write(f, iElementua);
write('Datu gehiagorik gorde nahi duzu?(B/E): ');
readln(cErantz);
cErantz := Upcase(cErantz);
until cErantz <> 'B';
{ itxi }
close(f);
end;


procedure FitxategiaBanatu(sFitxIzen, sFitxIzen1, sFitxIzen2: tsKatea199);
var
f, f1, f2: tfFitxategia;
iElementua: integer;
begin
{ uztartu }
assign(f, sFitxIzen);
reset(f);
assign(f1, sFitxIzen1);
rewrite(f1);
assign(f2, sFitxIzen2);
rewrite(f2);

while not eof(f) do
begin
read(f, iElementua);
if iElementua mod 2 <> 0 then
write(f1, iElementua)
else
write(f2, iElementua);
end;

{ itxi }
close(f);
close(f1);
close(f2);
end;


{===================PROGRAMA NAGUSIA=====================}

var
sIzena, sIzen1, sIzen2: tsKatea199;

begin
writeln('Zenbakiak gordeko dituen fitxategiaren izena ''Zenbakiak'' izan daiteke');
write('Fitxategiaren izena: ');
readln(sIzena);
sIzena := 'C:\' + sIzena + '.DAT';

if fileexists(sIzena) then
begin
FitxategiaIkusi(sIzena);
FitxategiariElementuakGehitu(sIzena);
FitxategiaIkusi(sIzena);
end
else
begin
FitxategiaBete(sIzena);
FitxategiaIkusi(sIzena);
end;

sIzen1 := 'C:\' + 'Bakoitiak' + '.DAT';
sIzen2 := 'C:\' + 'Bikoitiak' + '.DAT';
writeln('Datuak banatzean ', sIzen1, ' eta ', sIzen2, ' fitxategietan gordeko dira');

FitxategiaBanatu(sIzena, sIzen1, sIzen2);
FitxategiaIkusi(sIzen1);
FitxategiaIkusi(sIzen2);

writeln;
write('RETURN sakatu programa bukatzeko');
readln;
end.


 

Azken hiru asteak (13., 14. eta 15.)




Ikastaroaren azken txanpan gaude eta trena gainera datorkigu.



Hona hemen laburpena:



































Astea

Gaia

Data

Zer
13.

Fitxategiak


2023/04/24


(T)

13.


(Azp3) arrayak, erregistroak eta fitxategiak



2023/04/24


(M)

13.


(Azp1) arrayak, erregistroak eta fitxategiak




(M)

13.


(Azp2) arrayak, erregistroak eta fitxategiak




(M)

13.



(Azp3) fitxategiak, 11:30-13:30 [P0B9I]



2023/04/27


(t)

13.


Fitxategiak



2023/04/28


(T)

14.


 (Azp1) fitxategiak



2023/05/02


(L)

14.


 (Azp2) fitxategiak



2023/05/03


(L)

14.


Denetarik, 11:30-13:30 [P0A6A]



2023/05/04


(t)

14.


Fitxategiak



2023/05/05


(T)

15.

Fitxategiak eta test ariketak


2023/05/08


(T)

15.

(Azp3) proiektuari lotutako froga


2023/05/08


(M)

15.

(Azp1) proiektuari lotutako froga


2023/05/09


(M)

15.

(Azp2) proiektuari lotutako froga


2023/05/10


(M)

15.

Denetarik, 11:30-13:30 [P0A6A]


2023/05/11


(t)

15.

Azterketak eta test ariketak


2023/05/12


(T)

-


Azterketa, maiatzeko deialdia



2023/05/24


-

-


Azterketa, uztaileko deialdia



2023/06/30


-


(L) Laborategia                          (M) Mintegia                          (T) Teoria                          (t) Tutoretza






Ez dadila hau gertatu:





 

13. ASTEA | ikasgelan egindakoa

 13. astea (2023/04/24, tutoretza eta 2023/04/28) ikasgelan egin dena




2023/04/24







  • FILE datu-mota artikulutik abiatuta kontzeptu hauek zeharka berrikusi ditugu:


    • OINARRIZKO ERAGIKETAK:


      • read

      • write


    • LAN EGITEKO BALIABIDEAK:


      • assign  

      • rewrite  

      • reset  

      • close  

      • fileexists  

      • seek  

      • filepos  

      • filesize  

      • eof  


    • PARAMETRO IZATEAN JOKAMOLDEA

    • FITXATEGIEN GAINEKO ERAGIKETAK:


      • Fitxategia sortu

      • Fitxategiaren existentzia

      • Fitxategi osoa prozesatu

      • Bilaketa fitxategian

      • Elementu bat fitxategiari gehitu

      • Fitxategiaren datu baten aldaketa

      • Fitxategian elementu bat txertatu (F → A → F)    [aste honetako laborategien egingo dugu] 

      • Fitxategitik elementu bat kendu (F → A → F)      [aste honetako laborategien egingo dugu] 

      • Fitxategitik elementuak kendu (F → A → F)       [aste honetako laborategien egingo dugu] 

      • Fitxategi bat ordenatu (F → A → F)        [aste honetako laborategien egingo dugu] 



  • 13. astea | fitxategi bat bitan banatu ariketa       [aste honetako laborategien egingo dugu] 













2023/04/27 (tutoretza P0B9I laborategian 11:30etan)



  • Batez ere Azp-3 ikasleentzat zuzendurik dago 14. asteko praktika galduko dutelako, baina tutoretza bezala planteaturik dagoelako edozein ikasle etor daiteke. Hau egin dugu:


    1. Bilaketa, elementu baten sLiburuKodea teklatuz eman eta bilatu dugu funtzio bati esker, funtzioak bilatu nahi den elementuaren posizioa itzultzen du

    2. Ezabaketa, posizio jakin bateko elementua fitxategitik kentzeko array laguntzaile bat edo beste fitxategi laguntzaile bat beharko da (posizioa aurreko bilaketaren emaitza izan daiteke edo hurrengo urratseko teklatuaren bitartez egindako irakurketa)

    3. Posizioa, elementu baten posizioa fitxategian teklatuz eman eta fitxategiaren posizio horretan elementu berri bat txertatu

    4. Txertaketa, fitxategiaren posizio jakin batean elementu berri bat sartzeko array laguntzaile bat edo beste fitxategi laguntzaile bat beharko da
















2023/04/28



  • Azken hiru asteak (13, 14 eta 15) artikuluaren bitartez azken hiru asteen planifikazioa ikusi dugu. Datorren astelehenean azterketa idatziaren testak ikusteko eguna zen baina jaia denez, ostegunean tutoretza bat antolatu dut P0A8A ikasgelan 11:30etatik aurrera




  • FILE datu-mota artikulutik abiatuta kontzeptu hauek zeharka berrikusi ditugu:


    • OINARRIZKO ERAGIKETAK:


      • read (prozedura)

      • write (prozedura)


    • LAN EGITEKO BALIABIDEAK:


      • assign (prozedura)

      • rewrite (prozedura)

      • reset (prozedura)

      • close (prozedura)

      • fileexists (funtzio, programa nagusian)

      • seek (prozedura)

      • filepos (funtzio)

      • filesize (funtzio)

      • eof (funtzio)

      • truncate (prozedura, fitxategia mozteko)

      • erase (prozedura, fitxategia ezabatzeko)

      • rename (prozedura, fitxategia berrizendatzeko)



    • TRUNCATE, RENAME ETA ERASE ADIBIDE BANA:


      1. Moztu, fitxategiaren erdiko poszion kokatu eta hortik aurrerako elementuak ezabatu

      2. Posizioa, elementu baten posizioa fitxategian teklatuz eman eta fitxategiaren posizio horretan elementu berri bat txertatu (edo elementua ezabatu) fitxategi laguntzaile bat erabiliz




  • PARAMETRO IZATEAN JOKAMOLDEA (berriro)

  • FITXATEGIEN GAINEKO ERAGIKETAK: (berriro)


    • Fitxategia sortu

    • Fitxategiaren existentzia

    • Fitxategi osoa prozesatu

    • Bilaketa fitxategian

    • Elementu bat fitxategiari gehitu

    • Fitxategiaren datu baten aldaketa

    • Fitxategian elementu bat txertatu (F → A → F)     

    • Fitxategitik elementu bat kendu (F → A → F)    

    • Fitxategitik elementu batzuk kendu (F → A → F)    

    • Fitxategi bat ordenatu (F → A → F)  



  • 13. astea | fitxategi beraren edukia modu desberdinez pantailaratzen artikulua

  • Direktorioak: Non gaude? artikulua aipatu eta laborategian sakonago azalduko dugu