2024(e)ko apirilaren 8(a), astelehena

25. Ariketa: fitxategiak (I)

ZER DAKIDAN:
Zenbakiak, karaktereak, kateak, zerrendak (arrayak) eta erregistroak lantzeko gai naiz.



ZER IKASIKO DUDAN:
Zer gertatzen da programaren exekuzioa bukatzean? Erabili diren aldagai guztien balioak galtzen direla. Datuak modu iraunkorrean gorde ahal izateko file datu-mota erabili behar da. Ariketa honetan fitxategi berri bat nola sortu ikasiko dut, eta lehendik existitzen den fitxategi bati elementu berriak nola gehitu ikasiko dut.




ESKATZEN DEN PROGRAMA 

Erregistroen fitxategi batekin lan egingo dugu. Fitxategiaren elementuak bi eremuko erregistroak izango dira. Lehen eremua ibilgailuaren matrikula izango da (matrikula guztien letrak BBB dira eta matrikula bakoitzaren  zifrak sekuentzialki doaz 0001etik hasita). Bigarren eremua ibilgailuaren aldiuneko abiadura izango da eta bere balioa auzaz lortuko dugu.

Gure programak fitxategiaren izena eskatuko du eta erabiltzaileak emandako sarrerarekin fitxategiaren existentzia konprobatuko du, ondoko bi bide irekiz:
  1. Fitxategia existitzen bada, bere edukia pantailaratuko da eta elementu berriak gehituko dira fitxategiaren amaieran. Horretarako, zenbat elementu beri gehituko diren eskatzen da eta erregistroak erdi auzaz bete ondoren fitxategian amaieran biltegitzen dira. Bukatzeko, fitxategia berrituaren edukia pantailaratzen da aldiuneko abiadura guztien batezbesteko aritmetikoa kalkulatzen da.
  2. Fitxategia existitzen ez bada, fitxategi berria sortuko da. Horretarako, zenbat elementu gordeko diren eskatzen da eta erregistroak erdi auzaz bete ondoren fitxategian biltegitzen dira. Bukatzeko, fitxategiaren edukia pantailaratzen da aldiuneko abiaduren batezbesteko aritmetikoa kalkulatzen da.
Erregistroaren egitura honako hau da:

1. eremua sMatrikula   8 karaktereko kate bat, kate desberdinak izango dira
  zerrendaren elementu guztientzat
2. eremua rAldiunekoAbiadura   zenbaki erreal bat

Hauxe da ariketaren programa:

{ 25. ariketa: auto bat radar atari azpitik igartzean ondoko datuak   }
{              jaso eta gordetzen dira fitxategi batean:              }

{     - Matrikula, karkatere-kate bat                                 }
{     - Aldi uneko abiadura, zenbaki erreal bat                       }
                       
{  Datuak erdi automatikoki lortuko dira: matrikulen letrak BBB dira  }
{  zifrak sekuentzialki doaz 0001etik hasita, abiaduren balioak auzaz }
{  sortuko dira. Ondorioz, matrikulak desberdinak izango dira.        }
 
{  Fitxategia existitzen ez bada, sortuko da eta datuz bete ondoren   }
{  bere edukia pantailaratuko da eta aldiuneko abiaduren batezbesteko }
{  aritmetikoaa kalkulatuko da. Fitxategia lehendik existitzen bada   }
{  bere uneko edukia pantailaratuko da, gero elementu berriak gehitu  }
{  ondoren berriro erakutsiko dira fitxategiaren eduki berria eta     }
{  abiaduren batezbesteko aritmetikoa.                                }                 

program Ariketa_25;

uses
   sysutils;    { fileExists() funtzioak behar duelako }
   
type
   tsKatea = string[250];          { fitxategiaren izen osoa luzea izan daitekeelako }
    
   tsKateMatrikula = string[8];    { ZZZZ-LLL formatuko matrikula }
              
   trdIbilgailua = record
                      sMatrikula        : tsKateMatrikula;
                      rAldiunekoAbiadura: real;
                   end;
    
   tfrdFitxategia = file of trdIbilgailua;


procedure IbilgailuarenInformazioaJaso(var rdIbilgailua: trdIbilgailua; i: integer);
var
   sMatrikulaZifra: tsKateMatrikula;
begin
   Str(i, sMatrikulaZifra) ;
   if i < 10 then
      sMatrikulaZifra := '000' + sMatrikulaZifra;
   if (i >= 10) and (i < 100) then
      sMatrikulaZifra := '00' + sMatrikulaZifra;
   if i >= 100 then
      sMatrikulaZifra := '0' + sMatrikulaZifra;
   rdIbilgailua.sMatrikula := sMatrikulaZifra + ' BBB';

   rdIbilgailua.rAldiunekoAbiadura := 50 + 130*random;   (* 50.0 eta 179.99 artean *)
end;


procedure IbilgailuarenInformazioaErakutsi(const rdIbilgailua: trdIbilgailua);
begin
   write(rdIbilgailua.sMatrikula:15); 
   write(rdIbilgailua.rAldiunekoAbiadura:14:2);      
   writeln;
end;


procedure FitxategiarenEdukiaErakutsi(sFitxIzen: tsKatea);
var
   fFitxategia: tfrdFitxategia;
   rdDatua: trdIbilgailua;
begin
   assign(fFitxategia, sFitxIzen);
   reset(fFitxategia);    {Fitxategia ireki baina barrukoa ez borratu!!!}

   writeln('Matrikula':38, 'Abiadura':14);
   writeln('---------':38, '--------':14);
   
   {Datuak kudeatu for bitartez}
   while not eof(fFitxategia) do  
   begin
      read(fFitxategia,rdDatua); {Irakurri eta hurrengora pasa}
      write(filePos(fFitxategia):10, '. elementua: ');
      IbilgailuarenInformazioaErakutsi(rdDatua);
   end;

   close(fFitxategia);     {Fitxategia itxi}
end;


procedure FitxategiaSortuEtaDatuzBete(sFitxIzen: tsKatea);
var
   fFitxategia: tfrdFitxategia;
   rdDatua: trdIbilgailua; 
   iZenbat, i: integer;
begin
   assign(fFitxategia, sFitxIzen);
   rewrite(fFitxategia);  {Fitxategia sortu, eta existitzekotan bere edukia borratu}

   write('Zenbat elementu izango ditu fitxategiak (adibidez 15): ');
   readln(iZenbat);
   
   randomize;
   for i:=1 to iZenbat do
   begin
      IbilgailuarenInformazioaJaso(rdDatua, i);
      write(fFitxategia, rdDatua); {fitxategian idatzi eta hurrengo elementura pasa}
   end;

   close(fFitxategia);      {fitxategia itxi}
end;


function fnsFitxategiarenAzkenElementukoMatrikulaLortu(sFitxIzen: tsKatea): tsKateMatrikula;
var
   fFitxategia: tfrdFitxategia;
   rdDatua: trdIbilgailua;
begin
   assign(fFitxategia, sFitxIzen);
   reset(fFitxategia);    {Fitxategia ireki baina barrukoa ez borratu!!!}

   seek(fFitxategia, fileSize(fFitxategia)-1);  {Fitxategiaren azken elementuaren gainean kokatu}
   read(fFitxategia, rdDatua);
   
   fnsFitxategiarenAzkenElementukoMatrikulaLortu := rdDatua.sMatrikula;
   
   close(fFitxategia);      {fitxategia itxi}
end ;

   
procedure FitxategiariDatuakGehitu(sFitxIzen: tsKatea);
var
   fFitxategia: tfrdFitxategia;
   rdDatua: trdIbilgailua; 
   iZenbat, i: integer;
   sMatrik, sMatrikulaZifra: tsKateMatrikula;
   iMatrikulaZifra: integer ;
begin
   sMatrik := fnsFitxategiarenAzkenElementukoMatrikulaLortu(sFitxIzen);
   sMatrikulaZifra := Copy(sMatrik, 1, 4);
   Val(sMatrikulaZifra, iMatrikulaZifra);
   
   assign(fFitxategia, sFitxIzen);
   reset(fFitxategia);                        {Fitxategia ireki baina barrukoa ez borratu!!!}
   seek(fFitxategia, fileSize(fFitxategia));  {Fitxategiaren bukaeran kokatu}
   
   write('Zenbat elementu gehituko dira fitxategira (adibidez 7): ');
   readln(iZenbat);
   
   for i:=iMatrikulaZifra+1 to iMatrikulaZifra+iZenbat do
   begin
      IbilgailuarenInformazioaJaso(rdDatua, i);
      write(fFitxategia, rdDatua);   {fitxategian idatzi eta hurrengo elementura pasa}
   end;

   close(fFitxategia);      {fitxategia itxi}
end;


function fnrBatezbestekoAbiaduraKalkulatu(sFitxIzen : tsKatea) : real;
var
   fFitxategia: tfrdFitxategia;
   rdDatua: trdIbilgailua;
   rMetatua: real;
begin
   assign(fFitxategia, sFitxIzen);
   reset(fFitxategia);    {Fitxategia ireki baina barrukoa ez borratu!!!}

   rMetatua := 0.0;
   while not eof(fFitxategia) do  
   begin
      read(fFitxategia,rdDatua); {Irakurri eta hurrengora pasa}
      rMetatua := rMetatua + rdDatua.rAldiunekoAbiadura;
   end;
   
   fnrBatezbestekoAbiaduraKalkulatu := rMetatua / fileSize(fFitxategia);
      
   close(fFitxategia);      {fitxategia itxi}
end ;

(* ---------------------- PROGRAMA NAGUSIA ---------------------- *)
    
var
   sFitxIzen: tsKatea;
   sBidea: tsKatea;
   rAbiadurenBBA: real;
begin
   writeln;
   writeln;
   writeln;
   
   //sBidea := 'C:\Radarrak\';                              (* Windows *)
   sBidea := '/Users/jesusromouriarte/Desktop/Radarrak/';   (* Mac *)   

   writeln('Ibilgailuen informazioa gordeko duen fitxategiaren izena eman ezazu.');
   write('Adibidez, ''Autoak.dat'' izena: ');
   readln(sFitxIzen); 
   sFitxIzen := sBidea + sFitxIzen;
   writeln;
   
   if fileExists(sFitxIzen) then     {konprobatu ea existitzen den ala ez}
   begin
      writeln(sFitxIzen, ' fitxategia existitzen da.');
      writeln('Hona hemen bere edukia:');
      FitxategiarenEdukiaErakutsi(sFitxIzen);
      rAbiadurenBBA := fnrBatezbestekoAbiaduraKalkulatu(sFitxIzen);
      writeln('Aldiuneko abiaduren batezbesteko aritmetikoa: ', rAbiadurenBBA:0:2, ' Km/h');
      writeln;
      
      writeln('Elementu berriak gehituko dira:');
      FitxategiariDatuakGehitu(sFitxIzen);
      FitxategiarenEdukiaErakutsi(sFitxIzen);
      rAbiadurenBBA := fnrBatezbestekoAbiaduraKalkulatu(sFitxIzen);
      writeln('Aldiuneko abiaduren batezbesteko aritmetikoa: ', rAbiadurenBBA:0:2, ' Km/h');
   end
   else
   begin
      writeln(sFitxIzen, ' fitxategirik ez dago.');
      writeln('Oraintxe sortuko dugu.');
      FitxategiaSortuEtaDatuzBete(sFitxIzen);      
      writeln('Sortutako fitxategiaren edukia:');
      FitxategiarenEdukiaErakutsi(sFitxIzen);
      rAbiadurenBBA := fnrBatezbestekoAbiaduraKalkulatu(sFitxIzen);
      writeln('Aldiuneko abiaduren batezbesteko aritmetikoa: ', rAbiadurenBBA:0:2, ' Km/h');
   end;

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

Programaren balizko bi exekuzio hurrrengo irudietan erakusten dira, aurreneko exekuzioan Autoak.dat fitxategia sortzen da lehen aldiz eta bigarren exekuzioan Autoak.dat izena berriro ematean 5 elementu gehitzen dira:



 

iruzkinik ez:

Argitaratu iruzkina

Iruzkinen bat idazteko Google-ko kontu bat behar duzu. Iruzkin guztien moderazio-ardura blogeko administratzaileari dagokio.