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

28. Ariketa: fitxategiak (IV)

ZER DAKIDAN:
Zenbakiak, karaktereak, kateak, arrayak, erregistroak eta fitxategiak lantzeko gai naiz. Fitxategiak prozesatzeko algoritmoekin jarrai dezagun atal honetan.



ZER IKASIKO DUDAN:
Erregistroen fitxategi batean, ondoko algoritmoak programatzen ikasiko dut array laguntzaile batean oinarriturik:
  • Fitxategiaren erdiko posizio batean elementu berri bat tartekatu
  • Fitxategitik elementu bat edo batzuk kendu
  • Fitxategia sailkatu elementuen eremu baten edo batzuren arabera ordenatuz
Inolako laguntzailerik gabeko algoritmoak aurreko 27. Ariketa: fitxategiak (III) atalean ikasi ditut, eta fitxategi laguntzaile batean oinarritutako algoritmoak hurrengo 29. Ariketa: fitxategiak (V) atalean ikasiko ditut.




ESKATZEN DEN PROGRAMA 

Erregistroen fitxategi batekin lan egingo dugu eta algoritmo batzuk aplikatuko dizkiogu fitxategiari. Fitxategiaren elementuak hiru eremuko erregistroak izango dira. Lehen eremua ibilgailuaren matrikula izango da (matrikula guztien letrak BPK edo KHS izango dira auzaz hautaturik, eta matrikulen 4 zifrak programak aukeratuko ditu ere (programak zainduko du ibilgailuen matrikulak ez direla errepikatzen fitxategian). Bigarren eremua ibilgailuaren mota adierazteko karaktere bat izango da eta auzaz esluratuko du programak. Hirugarren eremua aldiuneko abiadura izango da eta bere balio erreala auzaz lortuko dugu ere.

Erregistroaren egitura honako hau da:

1. eremua sMatrikula   8 karaktereko kate bat, 'ZZZZ LLL' formatuko kate
  desberdinak izango dira fitxategiaren elementu guztientzat
2. eremua cIbilgailuMota   karaktere bat
3. eremua rAldiunekoAbiadura   zenbaki erreal bat

Gure programak fitxategiaren izena eskatuko du (Bolidoak.dat adibidez) hainbat elementuren informazioa gordeko du. Fitxategiari ondoko hiru lan hauek aplikatuko zaizkio array laguntzaile bati esker (gogoratu Ariketa 27: fitxategiak (III) aurreko atala):
  1. Elementu berri baten datuak teklatuz jaso eta fitxategiaren posizio jakin batean txertatuko da, honela:
      - Array laguntzailea: ardLaguntzailea
      - Non txertatu: iPosizioa
      - Algoritmoa: FOR batekin hasi eta WHILE batekin bukatu
  2. Ibilgailuen mota bat aukeratu eta mota horretako ibilgailu guztiak fitxategitik kendu, honela:
      - Array laguntzailea: ardLaguntzailea
      - Non txertatu: iPosizioa
      - Algoritmoa: WHILE bat eta bere barnean IF batekin
  3. Fitxategiaren edukia sailkatu mota-matrikula bikotearen arabera (array laguntzailea: ardLaguntzailea)
Hauxe da ariketaren programa:

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

{     - Matrikula, karkatere-kate bat                                 }
{     - Ibilgailu mota, karaktere bat                                 } 
{     - Aldi uneko abiadura, zenbaki erreal bat                       }
                       
{  Datuak erdi automatikoki lortuko dira auzazko balioak sortuz.      }
{  Matrikula bereko autoak ez direlako onartzen, matrikula jakin bat  }
{  sortzean, fitxategian berria izango dela frogatu beharra dago.     } 

{  Fitxategia existitzen ez bada, sortuko da eta datuz bete ondoren   }
{  bere edukia pantailaratuko da. Fitxategia lehendik existitzen bada }
{  duen edukia pantailaratuko da.                                     }

{  Fitxategia lortuta, hiru eragiketa egingo dira:                    }
{     1. Fitxategiaren erdiko posizio jakin batean elementu berri bat }
{        tartekatu                                                    }
{     2. Fitxategitik elementu batzuk kendu                           }                       
{     3. Fitxategia sailkatu elementuen eremu baten edo batzuren      }
{        arabera ordenatuz                                            }

{  Egitura laguntzailearen datu-mota: array                           }                   

program Ariketa_28 ;

uses
   SysUtils;    { fileexists() funtzioak behar duelako }
   
const
   //sBIDEA = 'C:\Radarrak\';                              (* Windows *)
   sBIDEA = '/Users/jesusromouriarte/Desktop/Radarrak/';   (* Mac *)
   BEHEMUGA = 1 ;
   GOIMUGA = 300 ;
   
type
   tsKatea = string[250];           { Fitxategiaren izen osoa luzea izan daitekeelako }
   
   tsKateMatrikula = string[8] ;    { ZZZZ LLL formatuko matrikula }
              
   tsKateZifrak = string[4] ;       { Matrikularen ZZZZ zatirako }
   
   trdIbilgailua = record
                      sMatrikula        : tsKateMatrikula ;
                      cIbilgailuMota    : char ;
                      rAldiunekoAbiadura: real ;
                   end ;
    
   tfrdFitxategia = file of trdIbilgailua ;
   tardZerrenda = array[BEHEMUGA..GOIMUGA] of trdIbilgailua ;
   

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


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

   writeln('Matrikula     Mota':47, 'Abiadura':14) ;
   writeln('---------     ----':47, '--------':14) ;
   
   { Datuak kudeatu for bitartez} 
   while not eof(f) do  
   begin
      read(f,rdDatua) ;    
      write(filepos(f):10, '. elementua: ') ;
      IbilgailuarenInformazioaErakutsi(rdDatua) ;
   end ;

   close(f) ;     { Fitxategia itxi }
end ;


procedure IbilgailuarenInformazioaJaso(var rdIbilgailua: trdIbilgailua) ;
var
   iAusazkoa, iKont: integer ;
   sMatrikula, sMatrikulaZifra: tsKateMatrikula ;
begin
   sMatrikula := '' ;
   for iKont:=1 to 4 do
   begin
      iAusazkoa := random(10) ;
      Str(iAusazkoa, sMatrikulaZifra) ;
      sMatrikula := sMatrikula + sMatrikulaZifra ;        
   end ;

   iAusazkoa := random(2) ;
   case iAusazkoa of
      0: rdIbilgailua.sMatrikula := sMatrikula + ' KHS' ;
      1: rdIbilgailua.sMatrikula := sMatrikula + ' BPK' ;
   end ;

   iAusazkoa := random(4) ;
   case iAusazkoa of
      0: rdIbilgailua.cIbilgailuMota := 'A' ;
      1: rdIbilgailua.cIbilgailuMota := 'B' ;
      2: rdIbilgailua.cIbilgailuMota := 'C' ;
      3: rdIbilgailua.cIbilgailuMota := 'D' ;
   end ;

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


procedure FitxategiaSortuEtaLehenElementuaGorde(sFitxIzen: tsKatea; const rdIbilgailua: trdIbilgailua) ;
var
   f: tfrdFitxategia ;
begin
   assign(f, sFitxIzen) ;
   rewrite(f) ;              { Fitxategia sortu }
   write(f, rdIbilgailua) ;  { Lehen elementua gorde } 
   close(f) ;                { Fitxategia itxi }
end ;


procedure FitxategianElementuBatGehitu(sFitxIzen: tsKatea; const rdIbilgailua: trdIbilgailua) ;
var
   f: tfrdFitxategia ;
begin
   assign(f, sFitxIzen) ;
   reset(f) ;               { Fitxategia ireki baina barrukoa ez borratu!!! }    
   seek(f, filesize(f)) ;   { Fitxategiaren bukaeran kokatu }
   write(f, rdIbilgailua) ; { Fitxategian idatzi eta hurrengo elementura pasa }
   close(f) ;               { Fitxategia itxi }
end ;
   
   
{ Bilaketa gauzatzeko funtzioan while-DO egitura erabiltzen da }
function fniMatrikulaFitxategianBilatu(sFitxIzen: tsKatea; sMatrik: tsKateMatrikula): integer ;
var
   f: tfrdFitxategia ;
   rdDatua: trdIbilgailua ;
   boAurkitua: boolean ;
begin
   assign(f, sFitxIzen) ;
   reset(f) ;    { Fitxategia ireki baina barrukoa ez borratu!!! }

   boAurkitua := FALSE ;
   while not eof(f) and not boAurkitua do  
   begin
      read(f,rdDatua) ;    { Irakurri eta hurrengora pasa }    
      if rdDatua.sMatrikula = sMatrik then
         boAurkitua := TRUE
   end ;
   
   if boAurkitua then
     fniMatrikulaFitxategianBilatu := filepos(F) - 1
   else
     fniMatrikulaFitxategianBilatu := -1 ;     { -1 gezurrezko posizioa litzateke }

   close(f) ;     { Fitxategia itxi }
end ;


procedure FitxategiaSortuEtaDatuDesberdinezBete(sFitxIzen: tsKatea) ;
var
   rdIbilgailua: trdIbilgailua ; 
   iZenbat, iIndizea, iPosizioa: integer ;
begin
   repeat
      write('Zenbat elementu izango ditu fitxategiak (', BEHEMUGA, ' eta ', GOIMUGA, ' artekoa): ') ;
      readln(iZenbat) ;
   until (iZenbat >= 1) and (iZenbat <= GOIMUGA) ;
   writeln ;
   
   randomize ;
   IbilgailuarenInformazioaJaso(rdIbilgailua) ;
   FitxategiaSortuEtaLehenElementuaGorde(sFitxIzen, rdIbilgailua) ;   { Lehen matrikula beti izango da berria }
    
   for iIndizea:=2 to iZenbat do
   begin
      repeat
         IbilgailuarenInformazioaJaso(rdIbilgailua) ;
         iPosizioa :=  fniMatrikulaFitxategianBilatu(sFitxIzen, rdIbilgailua.sMatrikula) ;
      
         if iPosizioa <> -1 then
         begin
            writeln('''', rdIbilgailua.sMatrikula, ''' matrikula fitxategiaren ', iPosizioa, '. posizioan dago!!!') ;
            writeln('Aurrera egiteko RETURN sakatu!') ;
            readln ;
         end   
         else
            FitxategianElementuBatGehitu(sFitxIzen, rdIbilgailua) ;   { Matrikula berria da }   
      until iPosizioa = -1 ;
   end ;
end ;


function fnbo4ZifraDira(sMatrikulaZifrak: tsKateZifrak): boolean ;
var
   k: integer ;
   boBai4ZifraDira: boolean ;
begin
   boBai4ZifraDira := TRUE ;
   for k:=1 to 4 do
   begin
      if (sMatrikulaZifrak[k] <'0') or (sMatrikulaZifrak[k] > '9') then
      begin
         writeln(k, '. posizioko ''', sMatrikulaZifrak[k], ''' karakterea ez da zifra bat, 4 zifrak errepikatu.') ;
         boBai4ZifraDira := FALSE ;
      end ;
   end ;
   fnbo4ZifraDira := boBai4ZifraDira ;
end ;


procedure MatrikulaZehaztu(var sMatrikulaBat: tsKateMatrikula) ;
var
   sMatrikulaZifrak: tsKateZifrak ;
   cHautapena: char ;
begin
   repeat
      write('Matrikularen ZZZZ lau zifrak eman: ') ;
      readln(sMatrikulaZifrak) ;
   until fnbo4ZifraDira(sMatrikulaZifrak) ;
   
   writeln('Matrikularen letrak ''BPK'' edo ''KHS'' direnez, bat hautatu:') ;
   writeln('   ''BPK'' bada 1 aukeratu') ;
   writeln('   ''KHS'' bada 2 aukeratu') ;
   repeat
      write('Zure hautapena aukeratu -----> ') ;
      readln(cHautapena) ;
   until (cHautapena = '1') or (cHautapena = '2') ; 
   
   if cHautapena = '1' then  
      sMatrikulaBat := sMatrikulaZifrak + ' BPK'
   else
      sMatrikulaBat := sMatrikulaZifrak + ' KHS' ;
end ;


procedure IbilgailuarenInformazioaTeklatuz(sFitxIzen: tsKatea; var rdIbilgailua: trdIbilgailua) ;
var
   sMatrikulaBat: tsKateMatrikula ;
   iPosizioa: integer ;
begin
   repeat
      writeln('Ibilgailuaren ''ZZZZ LLL'' formatuko matrikula zehaztu.') ;
      MatrikulaZehaztu(sMatrikulaBat) ; 
      iPosizioa := fniMatrikulaFitxategianBilatu(sFitxIzen, sMatrikulaBat) ;
      if iPosizioa <> -1 then
         writeln('''', sMatrikulaBat, ''' matrikula fixategian dago eta ezin da errepikatu!!!') ;
   until iPosizioa = -1 ;
   rdIbilgailua.sMatrikula := sMatrikulaBat ;
   
   repeat 
      write('''', sMatrikulaBat, ''' matrikuladun ibilgailua zein motatakoa da? (A, B, C edo D) ') ;
      readln(rdIbilgailua.cIbilgailuMota) ;
      rdIbilgailua.cIbilgailuMota := upcase(rdIbilgailua.cIbilgailuMota) ;
   until (rdIbilgailua.cIbilgailuMota >= 'A') and (rdIbilgailua.cIbilgailuMota <= 'D') ;
   
   repeat 
      write('''', sMatrikulaBat, ''' matrikuladun ibilgailuaren abiadura (50.0 eta 179.9 artekoa): ') ;
      readln(rdIbilgailua.rAldiunekoAbiadura) ;
   until (rdIbilgailua.rAldiunekoAbiadura >= 50.0) and (rdIbilgailua.rAldiunekoAbiadura < 180.0) ;
end ;   


function fniFitxategiarenElementuKopurua(sFitxIzen: tsKatea): integer ;
var
   f: tfrdFitxategia ; 
begin
   assign(f, sFitxIzen) ;
   reset(f) ;                                           { Fitxategia ireki }    
   fniFitxategiarenElementuKopurua := filesize(f) ;     { Elementuen kopurua }    
   close(f) ;                                           { Fitxategia itxi }
end ;


procedure arraytikFitxategira(const ardLaguntzailea: tardZerrenda ; iLuzera: integer; sFitxIzen: tsKatea) ; 
var
   f: tfrdFitxategia ;
   iKont: integer ;
begin 
   assign(f, sFitxIzen) ;
   rewrite(f) ;                           { Fitxategia ireki, eta existitzekotan bere edukia borratu } 
   
   for iKont:=BEHEMUGA to iLuzera do
   begin
      write(f, ardLaguntzailea[iKont]) ;  { Elementu osoa fitxategian gorde }   
   end ;   
     
   close(f) ;                             { Fitxategia itxi }   
end ;


procedure FitxategianElementuBatTxertatu(sFitxIzen: tsKatea; const rdIbilgailua: trdIbilgailua; iPosizioa: integer) ;
var
   f: tfrdFitxategia ;
   rdDatua: trdIbilgailua ;
   ardLaguntzailea: tardZerrenda ;
   iKont, iLuzera: integer ;
begin
   assign(f, sFitxIzen) ;
   reset(f) ;                                     { Fitxategia ireki } 
   
   if iPosizioa = 1 then                          { iPosizioa = 1 denerako }
   begin
      iKont := BEHEMUGA ;
      ardLaguntzailea[iKont] := rdIbilgailua ;    { Elementu osoa zerrendan gorde }   
   end
   else
   begin
      for iKont:=BEHEMUGA to iPosizioa-1 do
      begin
         read(f, rdDatua) ;                       { Fitxategitik elementu osoa irakurri }
         ardLaguntzailea[iKont] := rdDatua ;      { Elementu osoa zerrendan gorde }
      end ;   
   
      iKont := iKont + 1 ;
      ardLaguntzailea[iKont] := rdIbilgailua ;    { iPosizioa tokiko elementua gorde }
   end ;
      
   while not eof(f) do
   begin
      read(f, rdDatua) ;                          { Fitxategitik elementu osoa irakurri }
      iKont := iKont + 1 ;
      ardLaguntzailea[iKont] := rdDatua ;         { Elementu osoa zerrendan gorde }
   end ;
   iLuzera := iKont ;
     
   close(f) ;                                     { Fitxategia itxi }
   
   arraytikFitxategira(ardLaguntzailea, iLuzera, sFitxIzen) ;   
end ;


procedure FitxategianElementuakKendu(sFitxIzen: tsKatea; cMota: char) ;
var
   f: tfrdFitxategia ;
   rdDatua: trdIbilgailua ;
   ardLaguntzailea: tardZerrenda ;
   iLuzera: integer ;
begin
   assign(f, sFitxIzen) ;
   reset(f) ;                                   { Fitxategia ireki } 
   
   iLuzera := 0 ;
   while not eof(f) do
   begin
      read(f, rdDatua) ;                        { Fitxategitik elementu osoa irakurri }
      if rdDatua.cIbilgailuMota <> cMota then
      begin
         iLuzera := iLuzera + 1 ;
         ardLaguntzailea[iLuzera] := rdDatua ;  { Elementu osoa zerrendan gorde }
      end ;
   end ;   
     
   close(f) ;                                   { Fitxategia itxi }
   
   arraytikFitxategira(ardLaguntzailea, iLuzera, sFitxIzen) ;   
end ;


procedure ZerrendaMotazMatrikulazSailkatu(var ardZerrenda_MotMat: tardZerrenda; N: integer) ;
var
   Pos, j, k: integer ;
   rdMinimoa: trdIbilgailua ;
begin
   for k:=1 to N-1 do         (* N-1 zergatia hau da:    alde desordenatuan *)
   begin                      (* elementu bakarra dagoenean bera da minimoa *)
      rdMinimoa := ardZerrenda_MotMat[k] ;
      Pos := k ;
      for j:=k+1 to N do                        (* ordenatu gabekoen artean *)
      begin
         if (rdMinimoa.cIbilgailuMota > ardZerrenda_MotMat[j].cIbilgailuMota) or     (* minimo nagusia aurkitu   *)
            ((rdMinimoa.cIbilgailuMota = ardZerrenda_MotMat[j].cIbilgailuMota) and   (* eta berdina denean beste *)
             (rdMinimoa.sMatrikula > ardZerrenda_MotMat[j].sMatrikula)) then         (* bigarren minimoa aurkitu *)
         begin                                                                    
            rdMinimoa := ardZerrenda_MotMat[j] ;
            Pos := j ;
         end ;
      end ;                                                (* k posizioan txikiena jarri  *)
      ardZerrenda_MotMat[Pos] := ardZerrenda_MotMat[k] ;   (* txikiena rdMinimoa da eta Pos posizioan dago *)
      ardZerrenda_MotMat[k] := rdMinimoa ;                 (* k posiziokoa libratu ondoren bere edukia Pos *)
   end ;                                                   (* posizioan gordez k posizioan rdMinimoa jarri *)
end ;


procedure Fitxategitikarrayra(sFitxIzen: tsKatea; var ardLaguntzailea: tardZerrenda; var iLuzera: integer) ;
var
   f: tfrdFitxategia ;
   rdDatua: trdIbilgailua ;
begin
   assign(f, sFitxIzen) ;
   reset(f) ;                                 { Fitxategia ireki } 
   
   iLuzera := 0 ;
   while not eof(f) do
   begin
      read(f, rdDatua) ;                      { Fitxategitik elementua hartu }
      iLuzera := iLuzera + 1 ;
      ardLaguntzailea[iLuzera] := rdDatua ;   { Elementua zerrendan gorde }
   end ;    
     
   close(f) ;                                 { Fitxategia itxi }   
end ;


procedure FitxategiaMotazMatrikulazSailkatu(sFitxIzen: tsKatea) ;
var
   ardLaguntzailea: tardZerrenda ;
   iLuzera: integer ;
begin
   Fitxategitikarrayra(sFitxIzen, ardLaguntzailea, iLuzera) ;
   ZerrendaMotazMatrikulazSailkatu(ardLaguntzailea, iLuzera) ;
   arraytikFitxategira(ardLaguntzailea, iLuzera, sFitxIzen) ;   
end ;


(* ---------------------- PROGRAMA NAGUSIA ---------------------- *)

var
   sFitxIzen: tsKatea ;
   iPosizioa, iZenbat: integer ;
   rdIbilgailua: trdIbilgailua ;
   cMota: char ;
begin
   writeln ;
   writeln ;
   writeln ;   

   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:') ;
      FitxategiarenEdukiaIkusi(sFitxIzen) ;
   end
   else
   begin
      writeln(sFitxIzen, ' fitxategirik ez dago.') ;
      writeln('Oraintxe sortuko dugu.') ;
      FitxategiaSortuEtaDatuDesberdinezBete(sFitxIzen) ;      
      writeln('Sortutako fitxategiaren edukia:') ; 
      FitxategiarenEdukiaIkusi(sFitxIzen) ;     
   end ;

   writeln ;
   iZenbat := fniFitxategiarenElementuKopurua(sFitxIzen) ;
   
   if iZenbat = GOIMUGA then
      writeln('Fitxategiaren elementuen kopurua ', GOIMUGA, ' da eta ezin da elementu berririk txertatu.')
   else
   begin   
      writeln('Txertatu nahi den elementu berriaren datuak jasoko dira jarraian...') ;
      IbilgailuarenInformazioaTeklatuz(sFitxIzen, rdIbilgailua) ;
   
      repeat 
         write('''', rdIbilgailua.sMatrikula, ''' zein posiziotan geratuko da txertaturik? (1 eta ', iZenbat + 1, ' artekoa): ') ;
         readln(iPosizioa) ;
      until (iPosizioa >= 1) and (iPosizioa <= iZenbat + 1) ;      
   
      FitxategianElementuBatTxertatu(sFitxIzen, rdIbilgailua, iPosizioa) ;
      writeln ;
      writeln('Fitxategia elementu berriarekin ', iPosizioa, '. posizioan:') ; 
      FitxategiarenEdukiaIkusi(sFitxIzen) ;       
   end ;
   
   writeln ;
   writeln('Mota bateko ibilgailu guztiak kenduko dira fitxategitik...') ;
   repeat 
      write('Zein motatakoa ibilgailuak kenduko dira? (A, B, C edo D) ') ;
      readln(cMota) ;
      cMota := upcase(cMota) ;
   until (cMota >= 'A') and (cMota <= 'D') ;
   
   FitxategianElementuakKendu(sFitxIzen, cMota) ;
   writeln ;
   writeln('Fitxategia ''', cMota, ''' motako elementurik gabe:') ; 
   FitxategiarenEdukiaIkusi(sFitxIzen) ;
      
   writeln ;
   writeln('Ibilgailuak motaz eta matrikulaz sailkatzen...') ;
   writeln('Aurrera egiteko RETURN sakatu!') ;
   readln ;
   FitxategiaMotazMatrikulazSailkatu(sFitxIzen) ;
   writeln('Fitxategia ''', cMota, ''' motako elementurik gabe eta motaz-matrikulaz sailkatuta:') ; 
   FitxategiarenEdukiaIkusi(sFitxIzen) ;
   
   writeln ;
   write('RETURN sakatu programa bukatzeko') ;
   writeln ;
   readln ;
end.

Programaren balizko exekuzio bat hurrrengo bi irudien artean erakusten da:



 

27. Ariketa: fitxategiak (III)

ZER DAKIDAN:
Zenbakiak, karaktereak, kateak, arrayak, erregistroak eta fitxategiak lantzeko gai naiz.
Erregistroen fitxategi batean ondoko operazioak nola egin badakit:
  • Fitxategiaren existentzia konprobatu fileexits funtzioaren bitartez
  • Fitxategiaren bukaera konprobatu eof funtzioaren bitartez
  • Fitxategiaren erakuslea dagoen posizioa konprobatu filepos funtzioaren bitartez
  • Fitxategiaren erakuslea dagoen posiziotik aldatu seek prozeduraren bitartez
  • Fitxategiaren elementuen kopurua konprobatu filesize funtzioaren bitartez
  • Fitxategia moztu truncate prozeduraren bitartez
  • Fitxategia diskotik ezabatu erase prozeduraren bitartez
  • Fitxategia berrizendatu diskoan rename prozeduraren bitartez
Algoritmoak ikas ditzagun atal honetan.



ZER IKASIKO DUDAN:
Erregistroen fitxategi batean, ondoko algoritmoak programatzen ikasiko dut ez array laguntzaile, ez fitxategi laguntzailerik gabe:
  • Fitxategi osoa prozesatu
  • Bilaketa fitxategian
  • Elementu berriak fitxategira gehitu
  • Fitxategiaren elementu baten balioren bat aldatu
Array laguntzaile batean oinarritutako algoritmoak hurrengo 28. ariketa: fitxategiak (IV) atalean ikasiko ditut.




ESKATZEN DEN PROGRAMA 

Erregistroen fitxategi batekin lan egingo dugu eta algoritmo batzuk aplikatuko dizkiogu fitxategiari. Fitxategiaren elementuak hiru eremuko erregistroak izango dira. Lehen eremua ibilgailuaren matrikula izango da (matrikula guztien letrak BPK edo KHS izango dira auzaz hautaturik,  eta matrikulen 4 zifrak programak aukeratuko ditu ere (programak zainduko du ibilgailuen matrikulak ez direla errepikatzen fitxategian). Bigarren eremua ibilgailuaren mota adierazteko karaktere bat izango da eta auzaz esluratuko du programak. Hirugarren eremua aldiuneko abiadura izango da eta bere balio erreala auzaz lortuko dugu ere.

Erregistroaren egitura honako hau da:

1. eremua sMatrikula   8 karaktereko kate bat, 'ZZZZ LLL' formatuko kate
  desberdinak izango dira fitxategiaren elementu guztientzat
2. eremua cIbilgailuMota   karaktere bat
3. eremua rAldiunekoAbiadura   zenbaki erreal bat

Gure programak fitxategiaren izena eskatuko du (Kamioak.dat adibidez) eta erabiltzaileak emandako sarrerarekin fitxategiaren existentzia konprobatuko du, ondoko bi bide irekiz:
  1. Kamioak.dat fitxategia existitzen bada, bere edukia pantailaratuko da
  2. Kamioak.dat fitxategia existitzen ez bada, fitxategi berria sortuko da 25. Ariketa: fitxategiak (I) programan bezalaxe, baina oraingoan matrikulak ez dira sekuentzialak izango. Ondoren, sortu berri den fitxategiaren edukia pantailaratuko da
Bide batetik zein bestetik igaroz Kamioak.dat fitxategiak hainbat elementuren informazioa gordeko du eta elementu bati bere abiaduraren balioa aldatuko zaio. Horretarako, teklatuz eman beharreko matrikula bat eskatuko da eta matrikula horren bilaketari fitxategian ekingo zaio. Emandako matrikulako ibilgailurik aurkitzen bada fitxategian bere abiadura inkrementatuko da %10ean.

Hauxe da ariketaren programa:

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

{     - Matrikula, karkatere-kate bat                                 }
{     - Ibilgailu mota, karaktere bat                                 } 
{     - Aldi uneko abiadura, zenbaki erreal bat                       }
                       
{  Datuak erdi automatikoki lortuko dira auzazko balioak sortuz.      }
{  Matrikula bereko autoak ez direlako onartzen, matrikula jakin bat  }
{  sortzean, fitxategian berria izango dela frogatu beharra dago.     } 

{  Fitxategia existitzen ez bada, sortuko da eta datuz bete ondoren   }
{  bere edukia pantailaratuko da. Fitxategia lehendik existitzen bada }
{  duen edukia pantailaratuko da.                                     }

{  Fitxategia lortuta, matrikula jakin bateko ibilgailuari dagokion   }
{  abiadura aldatuko zaio (bere %10a inkrementatuz).                  }                   

program Ariketa_27 ;

uses
   sysutils;    { fileExists() funtzioak behar duelako }
   
const
   //sBIDEA = 'C:\Radarrak\';                              (* Windows *)
   sBIDEA = '/Users/jesusromouriarte/Desktop/Radarrak/';   (* Mac *)

type
   tsKatea = string[250];           { Fitxategiaren izen osoa luzea izan daitekeelako }
   
   tsKateMatrikula = string[8] ;    { ZZZZ LLL formatuko matrikula }
   
   tsKateZifrak = string[4] ;       { Matrikularen ZZZZ zatirako }
              
   trdIbilgailua = record
                      sMatrikula        : tsKateMatrikula ;
                      cIbilgailuMota    : char ;
                      rAldiunekoAbiadura: real ;
                   end ;
    
   tfrdFitxategia = file of trdIbilgailua ;


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


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

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

   close(f) ;     { Fitxategia itxi }
end ;


procedure IbilgailuarenInformazioaJaso(var rdIbilgailua: trdIbilgailua) ;
var
   iAusazkoa, iKont: integer ;
   sMatrikula, sMatrikulaZifra: tsKateMatrikula ;
begin
   sMatrikula := '' ;
   for iKont:=1 to 4 do
   begin
      iAusazkoa := random(10) ;
      Str(iAusazkoa, sMatrikulaZifra) ;
      sMatrikula := sMatrikula + sMatrikulaZifra ;        
   end ;

   iAusazkoa := random(2) ;
   case iAusazkoa of
      0: rdIbilgailua.sMatrikula := sMatrikula + ' KHS' ;
      1: rdIbilgailua.sMatrikula := sMatrikula + ' BPK' ;
   end ;

   iAusazkoa := random(4) ;
   case iAusazkoa of
      0: rdIbilgailua.cIbilgailuMota := 'A' ;
      1: rdIbilgailua.cIbilgailuMota := 'B' ;
      2: rdIbilgailua.cIbilgailuMota := 'C' ;
      3: rdIbilgailua.cIbilgailuMota := 'D' ;
   end ;

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


procedure FitxategiaSortuEtaLehenElementuaGorde(sFitxIzen: tsKatea; const rdIbilgailua: trdIbilgailua) ;
var
   f: tfrdFitxategia ;
begin
   assign(f, sFitxIzen) ;
   rewrite(f) ;              { Fitxategia sortu }
   write(f, rdIbilgailua) ;  { Lehen elementua gorde } 
   close(f) ;                { Fitxategia itxi }
end ;


procedure FitxategianElementuBatGehitu(sFitxIzen: tsKatea; const rdIbilgailua: trdIbilgailua) ;
var
   f: tfrdFitxategia ;
begin
   assign(f, sFitxIzen) ;
   reset(f) ;               { Fitxategia ireki baina barrukoa ez borratu!!! }    
   seek(f, fileSize(f)) ;   { Fitxategiaren bukaeran kokatu }
   write(f, rdIbilgailua) ; { Fitxategian idatzi eta hurrengo elementura pasa }
   close(f) ;               { Fitxategia itxi }
end ;
   
   
{ Bilaketa gauzatzeko funtzioan while-DO egitura erabiltzen da }
function fniMatrikulaFitxategianBilatu(sFitxIzen: tsKatea; sMatrik: tsKateMatrikula): integer ;
var
   f: tfrdFitxategia ;
   rdDatua: trdIbilgailua ;
   boAurkitua: boolean ;
begin
   assign(f, sFitxIzen) ;
   reset(f) ;    { Fitxategia ireki baina barrukoa ez borratu!!! }

   boAurkitua := FALSE ;
   while not eof(f) and not boAurkitua do  
   begin
      read(f,rdDatua) ;    { Irakurri eta hurrengora pasa }    
      if rdDatua.sMatrikula = sMatrik then
         boAurkitua := TRUE
   end ;
   
   if boAurkitua then
     fniMatrikulaFitxategianBilatu := filePos(F) - 1
   else
     fniMatrikulaFitxategianBilatu := -1 ;     { -1 gezurrezko posizioa litzateke }

   close(f) ;     { Fitxategia itxi }
end ;


procedure FitxategiaSortuEtaDatuDesberdinezBete(sFitxIzen: tsKatea) ;
var
   rdIbilgailua: trdIbilgailua ; 
   iZenbat, iIndizea, iPosizioa: integer ;
begin
   repeat
      write('Zenbat elementu izango ditu fitxategiak (adibidez 250): ') ;
      readln(iZenbat) ;
   until iZenbat > 0;
   writeln ;
   
   randomize ;
   IbilgailuarenInformazioaJaso(rdIbilgailua) ;
   FitxategiaSortuEtaLehenElementuaGorde(sFitxIzen, rdIbilgailua) ;   { Lehen matrikula beti izango da berria }
    
   for iIndizea:=2 to iZenbat do
   begin
      repeat
         IbilgailuarenInformazioaJaso(rdIbilgailua) ;
         iPosizioa :=  fniMatrikulaFitxategianBilatu(sFitxIzen, rdIbilgailua.sMatrikula) ;
      
         if iPosizioa <> -1 then
         begin
            writeln('''', rdIbilgailua.sMatrikula, ''' matrikula fitxategiaren ', iPosizioa, '. posizioan dago!!!') ;
            writeln('Aurrera egiteko RETURN sakatu!') ;
            readln ;
         end   
         else
            FitxategianElementuBatGehitu(sFitxIzen, rdIbilgailua) ;   { Matrikula berria da }   
      until iPosizioa = -1 ;
   end ;
end ;


procedure FitxategianElementuBatAldatu(sFitxIzen: tsKatea; iPosizioa: integer) ;
var
   f: tfrdFitxategia ;
   rdIbilgailua: trdIbilgailua ;
   rAbiadura: real ; 
begin
   assign(f, sFitxIzen) ;
   reset(f) ;               { Fitxategia ireki baina barrukoa ez borratu!!! }    
   seek(f, iPosizioa) ;     { Fitxategiko elementuaren gainean kokatu }
   read(f, rdIbilgailua) ;  { Fitxategitik elementu osoa irakurri }
   
   rAbiadura := 1.1 * rdIbilgailua.rAldiunekoAbiadura ;    { %10a inkrementatu }
   rdIbilgailua.rAldiunekoAbiadura := rAbiadura ;          { elementua berriztu }
   
   seek(f, iPosizioa) ;     { Fitxategiko elementuaren gainean kokatu }
   write(f, rdIbilgailua) ; { Fitxategian  elementu osoa idatzi }
     
   close(f) ;               { Fitxategia itxi }
end ;


function fnbo4ZifraDira(sMatrikulaZifrak: tsKateZifrak): boolean ;
var
   k: integer ;
   boBai4ZifraDira: boolean ;
begin
   boBai4ZifraDira := TRUE ;
   for k:=1 to 4 do
   begin
      if (sMatrikulaZifrak[k] <'0') or (sMatrikulaZifrak[k] > '9') then
      begin
         writeln(k, '. posizioko ''', sMatrikulaZifrak[k], ''' karakterea ez da zifra bat, 4 zifrak errepikatu.') ;
         boBai4ZifraDira := FALSE ;
      end ;
   end ;
   fnbo4ZifraDira := boBai4ZifraDira ;
end ;


procedure MatrikulaZehaztu(var sMatrikulaBat: tsKateMatrikula) ;
var
   sMatrikulaZifrak: tsKateZifrak ;
   cHautapena: char ;
begin
   repeat
      write('Matrikularen ZZZZ lau zifrak eman: ') ;
      readln(sMatrikulaZifrak) ;
   until fnbo4ZifraDira(sMatrikulaZifrak) ;
   
   writeln('Matrikularen letrak ''BPK'' edo ''KHS'' direnez, bat hautatu:') ;
   writeln('   ''BPK'' bada 1 aukeratu') ;
   writeln('   ''KHS'' bada 2 aukeratu') ;
   repeat
      write('Zure hautapena aukeratu -----> ') ;
      readln(cHautapena) ;
   until (cHautapena = '1') or (cHautapena = '2') ; 
   
   if cHautapena = '1' then  
      sMatrikulaBat := sMatrikulaZifrak + ' BPK'
   else
      sMatrikulaBat := sMatrikulaZifrak + ' KHS' ;
end ;

(* ---------------------- PROGRAMA NAGUSIA ---------------------- *)

var
   sFitxIzen: tsKatea ;
   sMatrikulaBat: tsKateMatrikula ;
   iPosizioa: integer ;
begin
   writeln ;
   writeln ;
   writeln ;   

   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:') ;
      FitxategiarenEdukiaIkusi(sFitxIzen) ;
   end
   else
   begin
      writeln(sFitxIzen, ' fitxategirik ez dago.') ;
      writeln('Oraintxe sortuko dugu.') ;
      FitxategiaSortuEtaDatuDesberdinezBete(sFitxIzen) ;      
      writeln('Sortutako fitxategiaren edukia:') ; 
      FitxategiarenEdukiaIkusi(sFitxIzen) ;     
   end ;

   writeln ;
   writeln('Abiadura aldatu nahi zaion ibilgailuaren ''ZZZZ LLL'' formatuko matrikula zehaztu.') ;
   MatrikulaZehaztu(sMatrikulaBat) ;   
   writeln('''', sMatrikulaBat, ''' matrikuladun ibilgailuari abiadura inkrementatu.') ;
      
   iPosizioa := fniMatrikulaFitxategianBilatu(sFitxIzen, sMatrikulaBat) ;
   if iPosizioa = -1 then
      writeln('''', sMatrikulaBat, ''' matrikula ez da aurkitzen fixategian!!!')    
   else
   begin
      FitxategianElementuBatAldatu(sFitxIzen, iPosizioa) ;
      writeln ;
      writeln('Aldatutako fitxategiaren edukia:') ; 
      FitxategiarenEdukiaIkusi(sFitxIzen) ;   
   end ;
      
   writeln ;
   write('RETURN sakatu programa bukatzeko') ;
   writeln ;
   readln ;
end.

Programaren balizko exekuzio bat hurrrengo irudian erakusten da:


 

26. Ariketa: fitxategiak (II)

ZER DAKIDAN:
Zenbakiak, karaktereak, kateak, arrayak, erregistroak eta fitxategiak lantzeko gai naiz.



ZER IKASIKO DUDAN:
Datuak modu iraunkorrean gorde ahal izateko file datu-motako fitxategi bat prozesatzen dakit. Ariketa honetan fitxategi batetik abiatuta fitxategi berriak nola sortu ikasiko dut.




ESKATZEN DEN PROGRAMA 

Erregistroen fitxategi batzuekin lan egingo dugu. Lau fitxategien 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.

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

Gure programak fitxategiaren izena eskatuko du (Autoak.dat adibidez) eta erabiltzaileak emandako sarrerarekin fitxategiaren existentzia konprobatuko du, ondoko bi bide irekiz:
  1. Autoak.dat fitxategia existitzen bada, bere edukia pantailaratuko da eta elementu berriak gehituko dira fitxategiaren amaieran 25. Ariketa: fitxategiak (I) programan bezala. Ondoren, hiru fitxategi berri sortuko dira:
    • Batezbesteko aritmetikoaren abiadura berdintsuak duten elementuak Autoak_B.dat izeneko fitxategiak bilduko ditu
    • Batezbesteko aritmetikoa baino handiago abiadura duten elementuak Autoak_H.dat izeneko fitxategiak bilduko ditu
    • Batezbesteko aritmetikoa baino txikiago abiadura duten elementuak Autoak_T.dat izeneko fitxategiak bilduko ditu
  2. Autoak.dat fitxategia existitzen ez bada, fitxategi berria sortuko da 25. Ariketa: fitxategiak (I) programan bezala. Ondoren, hiru fitxategi berri sortuko dira:
    • Batezbesteko aritmetikoaren abiadura berdintsuak duten elementuak Autoak_B.dat izeneko fitxategiak bilduko ditu
    • Batezbesteko aritmetikoa baino handiago abiadura duten elementuak Autoak_H.dat izeneko fitxategiak bilduko ditu
    • Batezbesteko aritmetikoa baino txikiago abiadura duten elementuak Autoak_T.dat izeneko fitxategiak bilduko ditu
Hauxe da ariketaren programa:
{ 26. 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.                                }                 

{  Ibilgailuen aldiuneko abiaduren batezbesteko aritmetikoa kalkulatu }
{  ondoren, hiru fitxategi berri lortuko dira:                        }

{    1. Batezbestekoaren "bezalako" abiadura dutenen elementuena      }
{    2. Batezbestekoa baino abiadura handiago dutenen elementuena     }
{    3. Batezbestekoa baino abiadura txikiago dutenen elementuena     }

program Ariketa__26;

uses
   sysutils;    { fileExists() funtzioak behar duelako }
   
const
   //sBIDEA = 'C:\Radarrak\';                              (* Windows *)
   sBIDEA = '/Users/jesusromouriarte/Desktop/Radarrak/';   (* Mac *)   
    
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(sIzenFitxOsoa: tsKatea);
var
   fOsoa: tfrdFitxategia;
   rdDatua: trdIbilgailua;
begin
   assign(fOsoa, sIzenFitxOsoa);
   reset(fOsoa);    { Fitxategia ireki baina barrukoa ez borratu!!! }

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

   close(fOsoa);     { Fitxategia itxi }
end;


procedure FitxategiaSortuEtaDatuzBete(sIzenFitxOsoa: tsKatea);
var
   fOsoa: tfrdFitxategia;
   rdDatua: trdIbilgailua; 
   iZenbat, i: integer;
begin
   assign(fOsoa, sIzenFitxOsoa);
   rewrite(fOsoa);  { 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(fOsoa, rdDatua);  { Fitxategian idatzi eta hurrengo elementura pasa }
   end;

   close(fOsoa);      { Fitxategia itxi }
end;


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

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

   
procedure FitxategiariDatuakGehitu(sIzenFitxOsoa: tsKatea);
var
   fOsoa: tfrdFitxategia;
   rdDatua: trdIbilgailua; 
   iZenbat, i: integer;
   sMatrik, sMatrikulaZifra: tsKateMatrikula;
   iMatrikulaZifra: integer ;
begin
   sMatrik := fnsFitxategiarenAzkenElementukoMatrikulaLortu(sIzenFitxOsoa);
   sMatrikulaZifra := Copy(sMatrik, 1, 4);
   Val(sMatrikulaZifra, iMatrikulaZifra);
   
   assign(fOsoa, sIzenFitxOsoa);
   reset(fOsoa);                        { Fitxategia ireki baina barrukoa ez borratu!!! }
   seek(fOsoa, fileSize(fOsoa));        { 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(fOsoa, rdDatua);   { Fitxategian idatzi eta hurrengo elementura pasa }
   end;

   close(fOsoa);      { Fitxategia itxi }
end;


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

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


procedure HiruFitxategienIzenakEraiki(    sIzenFitxOsoa: tsKatea;
                                      var sIzenFitxBerdin, 
                                          sIzenFitxHandi, 
                                          sIzenFitxTxiki: tsKatea);
var
   iBanatzileaNon: integer;
   cBanatzailea: char;
   sIzenLuzapen, sIzena, sLuzapena: tsKatea;
begin
   //sBIDEA := 'C:\Radarrak\';                                (* Windows *)
   //cBanatzailea := '\';                                     (* Windows *)
   //sBIDEA := '/Users/jesusromouriarte/Desktop/Radarrak/';   (* Mac *)
   cBanatzailea := '/';                                       (* Mac *)
   sIzenLuzapen := sIzenFitxOsoa;  
   repeat
      //writeln('|||>', sIzenLuzapen, '<|||');
      iBanatzileaNon := Pos(cBanatzailea, sIzenLuzapen);
      Delete(sIzenLuzapen, 1, iBanatzileaNon);
      //writeln('===>', sIzenLuzapen, '<===');   
   until iBanatzileaNon = 0;
   
   cBanatzailea := '.';
   iBanatzileaNon := Pos(cBanatzailea, sIzenLuzapen);
   if iBanatzileaNon <> 0 then
   begin
      sIzena := Copy(sIzenLuzapen, 1, iBanatzileaNon-1);
      sLuzapena := Copy(sIzenLuzapen, iBanatzileaNon+1, Length(sIzenLuzapen)-iBanatzileaNon);
      //writeln('Izena======>', sIzena, '<===');
      //writeln('Luzapena===>', sLuzapena, '<==='); 
      sIzenFitxBerdin := sBIDEA + sIzena + '_B.' + sLuzapena;
      sIzenFitxHandi := sBIDEA + sIzena + '_H.' + sLuzapena;
      sIzenFitxTxiki := sBIDEA + sIzena + '_T.' + sLuzapena ;
   end   
   else
   begin
      sIzena := sIzenLuzapen;
      //writeln('Izena======>', sIzena, '<===');
      sIzenFitxBerdin := sBIDEA + sIzena + '_B';
      sIzenFitxHandi := sBIDEA + sIzena + '_H';
      sIzenFitxTxiki := sBIDEA + sIzena + '_T';
   end;     
   //writeln('sIzenFitxTxiki===>', sIzenFitxTxiki, '<===');   
end ;

                                             
procedure HiruFitxategiakLortu(sIzenFitxOsoa, sIzenFitxBerdin, sIzenFitxHandi, sIzenFitxTxiki: tsKatea; rBBA: real);
var
   fOsoa, fBerdin, fHandi, fTxiki: tfrdFitxategia;
   rdDatua: trdIbilgailua;
   rDoitasuna: real;
begin
   assign(fOsoa, sIzenFitxOsoa);
   assign(fBerdin, sIzenFitxBerdin);
   assign(fHandi, sIzenFitxHandi);
   assign(fTxiki, sIzenFitxTxiki);
   reset(fOsoa);      { Fitxategia ireki baina barrukoa ez borratu!!! }
   rewrite(fBerdin);  { Fitxategia sortu, eta existitzekotan bere edukia borratu }
   rewrite(fHandi);   { Fitxategia sortu, eta existitzekotan bere edukia borratu }
   rewrite(fTxiki);   { Fitxategia sortu, eta existitzekotan bere edukia borratu }
   
   rDoitasuna := (rBBA * 5) / 100;   (* doitasuna BBAren %5a *)
   while not eof(fOsoa) do  
   begin
      read(fOsoa,rdDatua); { Irakurri eta hurrengora pasa }
      
      if abs(rdDatua.rAldiunekoAbiadura - rBBA) < rDoitasuna then
         write(fBerdin,rdDatua)
      else
         if rdDatua.rAldiunekoAbiadura > rBBA then
            write(fHandi,rdDatua)
         else      
            write(fTxiki,rdDatua)
   end;
         
   close(fOsoa);       { Fitxategia itxi }
   close(fBerdin);     { Fitxategia itxi }
   close(fTxiki);      { Fitxategia itxi }
   close(fHandi);      { Fitxategia itxi }
end ;

(* =====================- PROGRAMA NAGUSIA =====================- *)
    
var
   sIzenFitxOsoa, sIzenFitxBerdin, sIzenFitxHandi, sIzenFitxTxiki: tsKatea;
   rAbiadurenBBA: real;
begin
   writeln;
   writeln;
   writeln;   

   writeln('Ibilgailuen informazioa gordeko duen fitxategiaren izena eman ezazu.');
   write('Adibidez, ''Autoak.dat'' izena: ');
   readln(sIzenFitxOsoa); 
   sIzenFitxOsoa := sBIDEA + sIzenFitxOsoa;
   writeln;
   
   if fileExists(sIzenFitxOsoa) then     { Konprobatu ea existitzen den ala ez }
   begin
      writeln(sIzenFitxOsoa, ' fitxategia existitzen da.');
      writeln('Hona hemen bere edukia:');
      FitxategiarenEdukiaErakutsi(sIzenFitxOsoa);
      rAbiadurenBBA := fnrBatezbestekoAbiaduraKalkulatu(sIzenFitxOsoa);
      writeln('Aldiuneko abiaduren batezbesteko aritmetikoa: ', rAbiadurenBBA:0:2, ' Km/h');
      writeln;
      
      writeln('Elementu berriak gehituko dira:');
      FitxategiariDatuakGehitu(sIzenFitxOsoa);
      FitxategiarenEdukiaErakutsi(sIzenFitxOsoa);
      rAbiadurenBBA := fnrBatezbestekoAbiaduraKalkulatu(sIzenFitxOsoa);
      writeln('Aldiuneko abiaduren batezbesteko aritmetikoa: ', rAbiadurenBBA:0:2, ' Km/h');
      writeln;
      
      HiruFitxategienIzenakEraiki(sIzenFitxOsoa, sIzenFitxBerdin, sIzenFitxHandi, sIzenFitxTxiki);
      HiruFitxategiakLortu(sIzenFitxOsoa, sIzenFitxBerdin, sIzenFitxHandi, sIzenFitxTxiki, rAbiadurenBBA);
      writeln('BBAren berdineko fitxategiaren edukia:');
      FitxategiarenEdukiaErakutsi(sIzenFitxBerdin);
      writeln('BBA baino handiagoko fitxategiaren edukia:');
      FitxategiarenEdukiaErakutsi(sIzenFitxHandi);
      writeln('BBA baino txikiagoko fitxategiaren edukia:');
      FitxategiarenEdukiaErakutsi(sIzenFitxTxiki);
   end
   else
   begin
      writeln(sIzenFitxOsoa, ' fitxategirik ez dago.');
      writeln('Oraintxe sortuko dugu.');
      FitxategiaSortuEtaDatuzBete(sIzenFitxOsoa);      
      writeln('Sortutako fitxategiaren edukia:');
      FitxategiarenEdukiaErakutsi(sIzenFitxOsoa);
      rAbiadurenBBA := fnrBatezbestekoAbiaduraKalkulatu(sIzenFitxOsoa);
      writeln('Aldiuneko abiaduren batezbesteko aritmetikoa: ', rAbiadurenBBA:0:2, ' Km/h');
      writeln;
      
      HiruFitxategienIzenakEraiki(sIzenFitxOsoa, sIzenFitxBerdin, sIzenFitxHandi, sIzenFitxTxiki);
      HiruFitxategiakLortu(sIzenFitxOsoa, sIzenFitxBerdin, sIzenFitxHandi, sIzenFitxTxiki, rAbiadurenBBA);
      writeln('BBAren berdineko fitxategiaren edukia:');
      FitxategiarenEdukiaErakutsi(sIzenFitxBerdin);
      writeln('BBA baino handiagoko fitxategiaren edukia:');
      FitxategiarenEdukiaErakutsi(sIzenFitxHandi);
      writeln('BBA baino txikiagoko fitxategiaren edukia:');
      FitxategiarenEdukiaErakutsi(sIzenFitxTxiki);      
   end;

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

Programaren balizko hiru exekuzio hurrrengo irudietan erakusten dira:





Programaren aurreko hiru exekuzioetan sortu diren hamabi fitxategien ezaugarriak ikus daitezke. Azpimarratzen dugu fitxategien elementu bakoitzak 20 byte hartzen dituela diskoan, irudi honetan ikus daitekeen bezala:


 

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:



 

24. Ariketa: erregistroak (III)

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



ZER IKASIKO DUDAN:
Erregistroen array batean ondoko operazioak nola egiten diren ikasiko dut:
  • Array datu-motako aldagai bateko elementuak erregistroak izanik, elementu guztiak desberdinak direla kontrolatu (18. Ariketa: zerrendak (I) gogoratu)
  • Array datu-motako aldagai bateko elementuak erregistroak izanik, beste array bat lortu eremu baten arabera sailkaturik
  • Array datu-motako aldagai bateko elementuak erregistroak izanik, beste array bat lortu bi eremuren arabera sailkaturik
Bestalde, arrayekin bezala, FUNCTION erako azpiprograma batek ez du Record datu-motako egitura bat itzuliko. Horregatik, erregistro bat emaitza izan behar bada beti PROCEDURE erako azpiprogramaz prozesatuko dugu.




ESKATZEN DEN PROGRAMA 

Erregistroekin lan eginez, 1 eta 30 arteko erregistroen sorta bat zerrenda batean gorde nahi da. Erregistro bakoitzak ibilgailu baten datuak bilduko ditu.

Gure programak lehenik zenbat erregistro gordeko dituen galdetuko du eta prozesu errepikakor batean sartuko da. Gero, prozesu errepikakor barruan, erregistro bakoitzaren eremuentzat balioak auzaz aukeratu (sMatrikula eremuetako balioak ez direla errepikatzen konprobatuko da) eta erregistroa bete ondoren zerrendan gordeko da.

Erregistroaren egitura honako hau da:

1. eremua sMatrikula   8 karaktereko kate bat, 'ZZZZ LLL' formatuko kate
  desberdinak izango dira zerrendaren elementu guztientzat
2. eremua cIbilgailuMota   karaktere bat
3. eremua rAldiunekoAbiadura   zenbaki erreal bat

Hauxe da ariketaren programa:

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

{     - Matrikula, karkatere-kate bat                                 }
{     - Ibilgailu mota, karaktere bat                                 } 
{     - Aldi uneko abiadura, zenbaki erreal bat                       }
                       
{  Datuak erdi automatikoki lortuko dira auzazko balioak sortuz.      }
{  Matrikula bereko autoak ez direlako onartzen, matrikula jakin bat  }
{  sortzean zerrendan berria izango dela frogatu beharra dago.        } 
{  ardZerrenda lehen zerrendatik abiatuta beste hiru zerrenda lortuko }
{  dira:                                                              }                   

{     - ardZerrenda_Mat matrikulen arabera sailkaturiko zerrenda      }
{     - ardZerrenda_Abi abiaduren arabera sailkaturiko zerrenda       }
{     - ardZerrenda_MotMat ibilgailu motaren arabera sailkaturiko     }
{       zerrenda eta mota berekoen elementuak matrikulaz sailkaturik  }

program Ariketa_24 ;

const
   BEHEMUGA = 1 ;
   GOIMUGA = 30 ;
   
type
    tsKateMatrikula = string[8] ;    { ZZZZ-LLL formatuko matrikula }
              
    trdIbilgailua = record
                       sMatrikula         : tsKateMatrikula ;
                       cIbilgailuMota     : char ;
                       rAldiunekoAbiadura : real ;
                    end ;
    
    tardZerrenda = array[BEHEMUGA..GOIMUGA] of trdIbilgailua ;


procedure IbilgailuarenDatuakJaso(var rdIbilgailua: trdIbilgailua) ;
var
   iZenbat, iAusazkoa, iKont, k : integer ;
   sMatrikula, sMatrikulaZifra : tsKateMatrikula ;
begin
   iZenbat := 15 + random(16) ;    
   for iKont:=1 to iZenbat do
   begin
      sMatrikula := '' ;
      for k:=1 to 4 do
      begin
         iAusazkoa := random(10) ;
         Str(iAusazkoa, sMatrikulaZifra) ;
         sMatrikula := sMatrikula + sMatrikulaZifra ;        
      end ;

      iAusazkoa := random(5) ;
      case iAusazkoa of
         0: rdIbilgailua.sMatrikula := sMatrikula + ' KHS' ;
         1: rdIbilgailua.sMatrikula := sMatrikula + ' BPK' ;
         2: rdIbilgailua.sMatrikula := sMatrikula + ' KKK' ;
         3: rdIbilgailua.sMatrikula := sMatrikula + ' XYZ' ;
         4: rdIbilgailua.sMatrikula := sMatrikula + ' KGB' ;
      end ;

      iAusazkoa := random(4) ;
      case iAusazkoa of
         0: rdIbilgailua.cIbilgailuMota := 'A' ;
         1: rdIbilgailua.cIbilgailuMota := 'B' ;
         2: rdIbilgailua.cIbilgailuMota := 'C' ;
         3: rdIbilgailua.cIbilgailuMota := 'D' ;
      end ;

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


{ Bilaketa gauzatzeko funtzioan while-DO egitura erabiltzen da }
function fniMatrikulaZerrendanBilatu(const ardZerrenda: tardZerrenda; iZenbat: integer; sMatrik: tsKateMatrikula): integer ;
var
   iIndizea : integer ;
   boAurkitua : boolean ;
begin
   iIndizea := BEHEMUGA ;
   boAurkitua := FALSE ;
   while (iIndizea <= iZenbat) and not boAurkitua do
   begin
      if ardZerrenda[iIndizea].sMatrikula = sMatrik then
         boAurkitua := TRUE
      else
         iIndizea := iIndizea + 1 ;
   end ;

   if boAurkitua = TRUE then
     fniMatrikulaZerrendanBilatu := iIndizea
   else
     fniMatrikulaZerrendanBilatu := 0 ;          { 0 gezurrezko posizioa litzateke }
end ;


procedure ZerrendaDatuDesberdinezBete(var ardZerrenda: tardZerrenda; iLuzera: integer) ;
var
   iIndizea, iPosizioa : integer ;
   rdIbilgailua : trdIbilgailua ;
begin 
   randomize ; 
   IbilgailuarenDatuakJaso(rdIbilgailua) ;
   ardZerrenda[BEHEMUGA] := rdIbilgailua ;   { Lehen matrikula beti izango da berria }
   
   for iIndizea:=BEHEMUGA+1 to iLuzera do
   begin
      repeat
         IbilgailuarenDatuakJaso(rdIbilgailua) ;
         iPosizioa :=  fniMatrikulaZerrendanBilatu(ardZerrenda, iIndizea-1, rdIbilgailua.sMatrikula) ;
      
         if iPosizioa <> 0 then
            writeln(iIndizea:6, '. ibilgailurako: ''', rdIbilgailua.sMatrikula, ''' matrikula ', iPosizioa, '. posizioan dago!!!')
         else
            ardZerrenda[iIndizea] := rdIbilgailua ;
      until iPosizioa = 0 ;
   end ;
end ;


(* Parametro bat irteerakoa den bitartean bestea sarrerakoa *)
(* da. Horregatik   arraya erreferentziaz pasatzen da baina *)
(* aldatzen ez den N iLuzera logikoari dagokion osoa balioz *)
procedure ZerrendaMatrikulazSailkatu(var ardZerrenda_Mat: tardZerrenda; N: integer) ;
var
   Pos, j, k : integer ;
   rdMinimoa : trdIbilgailua ;
begin
   for k:=1 to N-1 do         (* N-1 zergatia hau da:    alde desordenatuan *)
   begin                      (* elementu bakarra dagoenean bera da minimoa *)
      rdMinimoa := ardZerrenda_Mat[k] ;
      Pos := k ;
      for j:=k+1 to N do                        (* ordenatu gabekoen artean *)
      begin
         if rdMinimoa.sMatrikula > ardZerrenda_Mat[j].sMatrikula then   (* minimoa aurkitu *)
         begin
            rdMinimoa := ardZerrenda_Mat[j] ;
            Pos := j ;
         end ;
      end ;                                            (* k posizioan txikiena jarri  *)
        ardZerrenda_Mat[Pos] := ardZerrenda_Mat[k] ;   (* txikiena rdMinimoa da eta Pos posizioan dago *)
        ardZerrenda_Mat[k] := rdMinimoa ;              (* k posiziokoa libratu ondoren bere edukia Pos *)
   end;                                                (* posizioan gordez k posizioan rdMinimoa jarri *)
end ;


(* Parametro bat irteerakoa den bitartean bestea sarrerakoa *)
(* da. Horregatik arraya erreferentziaz pasatzen da baina   *)
(* aldatzen ez den N iLuzera logikoari dagokion osoa balioz *)
procedure ZerrendaAbiadurazSailkatu(var ardZerrenda_Abi: tardZerrenda; N: integer) ;
var
   Pos, j, k : integer ;
   rdMaximoa : trdIbilgailua ;
begin
   for k:=1 to N-1 do         (* N-1 zergatia hau da:    alde desordenatuan *)
   begin                      (* elementu bakarra dagoenean bera da minimoa *)
      rdMaximoa := ardZerrenda_Abi[k] ;
      Pos := k ;
      for j:=k+1 to N do                        (* ordenatu gabekoen artean *)
      begin
         if rdMaximoa.rAldiunekoAbiadura < ardZerrenda_Abi[j].rAldiunekoAbiadura then   (* maximoa aurkitu *)
         begin
            rdMaximoa := ardZerrenda_Abi[j] ;
            Pos := j ;
         end ;
      end ;                                          (* k posizioan handiena jarri  *)
      ardZerrenda_Abi[Pos] := ardZerrenda_Abi[k] ;   (* handiena rdMaximoa da eta Pos posizioan dago *)
      ardZerrenda_Abi[k] := rdMaximoa ;              (* k posiziokoa libratu ondoren bere edukia Pos *)
   end;                                              (* posizioan gordez k posizioan rdMaximoa jarri *)
end ;


(* Parametro bat irteerakoa den bitartean bestea sarrerakoa *)
(* da. Horregatik arraya erreferentziaz pasatzen da baina   *)
(* aldatzen ez den N iLuzera logikoari dagokion osoa balioz *)
procedure ZerrendaMotazMatrikulazSailkatu(var ardZerrenda_MotMat: tardZerrenda; N: integer) ;
var
   Pos, j, k : integer ;
   rdMinimoa : trdIbilgailua ;
begin
   for k:=1 to N-1 do         (* N-1 zergatia hau da:    alde desordenatuan *)
   begin                      (* elementu bakarra dagoenean bera da minimoa *)
      rdMinimoa := ardZerrenda_MotMat[k] ;
      Pos := k ;
      for j:=k+1 to N do                        (* ordenatu gabekoen artean *)
      begin
         if (rdMinimoa.cIbilgailuMota > ardZerrenda_MotMat[j].cIbilgailuMota) or     (* minimo nagusia aurkitu   *)
            ((rdMinimoa.cIbilgailuMota = ardZerrenda_MotMat[j].cIbilgailuMota) and   (* eta berdina denean beste *)
             (rdMinimoa.sMatrikula > ardZerrenda_MotMat[j].sMatrikula)) then         (* bigarren minimoa aurkitu *)
         begin                                                                    
            rdMinimoa := ardZerrenda_MotMat[j] ;
            Pos := j ;
         end ;
      end ;                                                (* k posizioan txikiena jarri  *)
      ardZerrenda_MotMat[Pos] := ardZerrenda_MotMat[k] ;   (* txikiena rdMinimoa da eta Pos posizioan dago *)
      ardZerrenda_MotMat[k] := rdMinimoa ;                 (* k posiziokoa libratu ondoren bere edukia Pos *)
   end;                                                    (* posizioan gordez k posizioan rdMinimoa jarri *)
end ;


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


procedure ZerrendaIkusi(const ardZerrenda: tardZerrenda; iLuzera: integer) ;
var
   k : integer ;
   rdIbilgailua : trdIbilgailua ;
begin  
   writeln('Matrikula     Mota':28, 'Abiadura':14) ;
   writeln('---------     ----':28, '--------':14) ;
   for k:=BEHEMUGA to iLuzera do
   begin
      write(k:4) ;
      rdIbilgailua := ardZerrenda[k] ;
      IbilgailuarenDatuakErakutsi(rdIbilgailua) ;
   end ;
end ;

(* ---------------------- PROGRAMA NAGUSIA ---------------------- *)
    
var
   ardZerrenda, ardZerrenda_Mat, ardZerrenda_Abi, ardZerrenda_MotMat: tardZerrenda ;
   iLuzera: integer ;
begin
   writeln ;
   writeln ;
   writeln ;
   
   repeat
      write('Zenbat elementu izango dira (', BEHEMUGA, ' eta ', GOIMUGA, ' arteko balioa): ') ;
      readln(iLuzera) ;
   until (iLuzera >= BEHEMUGA) and (iLuzera <= GOIMUGA) ;
   writeln ;
   
   writeln('IBILGAILUEN DATUAK ESKURATZEN (ardZerrenda)') ;
   ZerrendaDatuDesberdinezBete(ardZerrenda, iLuzera) ;
   writeln ;
   
   writeln('IBILGAILUEN DATUAK ERAKUSTEN (ardZerrenda)') ;
   ZerrendaIkusi(ardZerrenda, iLuzera) ;
   writeln ;
   
   ardZerrenda_Mat := ardZerrenda ;
   writeln('IBILGAILUEN DATUAK MATRIKULAZ SAILKATZEN...') ;   
   ZerrendaMatrikulazSailkatu(ardZerrenda_Mat, iLuzera) ;

   writeln('IBILGAILUEN DATUAK ERAKUSTEN (ardZerrenda_Mat)') ;
   ZerrendaIkusi(ardZerrenda_Mat, iLuzera) ;
   writeln ;

   ardZerrenda_Abi := ardZerrenda ;
   writeln('IBILGAILUEN DATUAK ABIADURAZ SAILKATZEN...') ;   
   ZerrendaAbiadurazSailkatu(ardZerrenda_Abi, iLuzera) ;
   
   writeln('IBILGAILUEN DATUAK ERAKUSTEN (ardZerrenda_Abi)') ;
   ZerrendaIkusi(ardZerrenda_Abi, iLuzera) ;
   writeln ;
      
   ardZerrenda_MotMat := ardZerrenda ;
   writeln('IBILGAILUEN DATUAK MOTAZ ETA MATRIKULAZ SAILKATZEN...') ;   
   ZerrendaMotazMatrikulazSailkatu(ardZerrenda_MotMat, iLuzera) ;

   writeln('IBILGAILUEN DATUAK ERAKUSTEN (ardZerrenda_MotMat)') ;
   ZerrendaIkusi(ardZerrenda_MotMat, iLuzera) ;
   writeln ; 
      
   readln ;
end.

Programaren balizko exekuzio bat hurrrengo irudietan erakusten da:

ardZerrenda arrayaren 500 elementuak eskuratu dira eta horietarik lehen 20ak pantailaratu dira

Matrikulen araberako sailkapena: ardZerrenda arrayatik abiatuta ardZerrenda_Mat array ordenatua lortu da

Abiaduren araberako sailkapena: ardZerrenda arrayatik abiatuta ardZerrenda_Abi array ordenatua lortu da

Sailkapenaren eremu nagusia cIbilgailuMota eta sMatrikula sailkapenaren bigarren mailako eremua: ardZerrenda arrayatik abiatuta ardZerrenda_MotMat array ordenatua lortu da

 

23. Ariketa: erregistroak (II)

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



ZER IKASIKO DUDAN:
Oinarrizko datu-mota desberdinak egitura bakar batean gordetzeko Record datu-mota beharrezkoa da. Oinarrizko datu-mota bereko hainbat elementu gordetzeko Array datu-mota aproposa da. Ikas dezagun orain erregistroen zerrendekin lan egiten.




ESKATZEN DEN PROGRAMA 

Erregistroekin lan eginez, 1 eta 10 arteko erregistroen sorta bat zerrenda batean gorde nahi da. Erregistro bakoitzak ibilgailu baten datuak bilduko ditu.

Gure programak lehenik zenbat erregistro gordeko dituen galdetuko du eta prozesu errepikakor batean sartuko da. Gero, prozesu errepikakor barruan, erregistro bakoitzaren eremuentzat balioak auzaz aukeratu eta erregistroa bete ondoren zerrendan gordeko da.

Erregistroaren egitura honako hau da:

1. eremua sMatrikula   'ZZZZ-LLL' formatuko 8 karakteredun kate bat
2. eremua cIbilgailuMota   karaktere bat
3. eremua rdDataUnea   2 eremuko erregistroa (eremu bakoitza 3 osoen array bat)
4. eremua rAldiunekoAbiadura   zenbaki erreal bat

Hauxe da ariketaren programa:

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

{     - Matrikula, karkatere-kate bat                                 }
{     - Ibilgailu mota, karaktere bat                                 }
{     - Data, 3 zenbakien array bat (posizioak: Urtea, Hilea, Eguna)  }
{     - Unea, 3 zenbakien array bat (posizioak: Orduak, Minutuak,     } 
{                                                        Segundoak)   }  
{     - Aldi uneko abiadura, zenbaki erreal bat                       }
                       
{  Datuak erdi automatikoki lortuko dira auzazko balioak sortuz. Auto }
{  bakoitzeko erregistro bat bete ondoren, array batean gordeko da.   }                   

program Ariketa_23 ;

const
   BEHEMUGA = 1 ;
   GOIMUGA = 10 ;
   
type
    tsKateMatrikula = string[8] ;    { ZZZZ-LLL formatuko matrikula }

    taiData = array[1..3] of integer ;  { Urtea, Hilea, Eguna }
    
    taiUnea = array[1..3] of integer ;  { Orduak, Minutuak, Segundoak }
    
    trdNoiz = record
                  Eguna : taiData ;
                  Ordua : taiUnea ;
              end ;
              
    trdIbilgailua = record
                       sMatrikula         : tsKateMatrikula ;
                       cIbilgailuMota     : char ;
                       rdDataUnea         : trdNoiz ;
                       rAldiunekoAbiadura : real ;
                    end ;
    
    tardZerrenda = array[BEHEMUGA..GOIMUGA] of trdIbilgailua ;


procedure IbilgailuarenDatuakJaso(var rdIbilgailua: trdIbilgailua) ;
var
   iZenbat, iAusazkoa, iKont, k : integer ;
   sMatrikula, sMatrikulaZifra : tsKateMatrikula ;
begin
   iZenbat := 15 + random(16) ;    
   for iKont:=1 to iZenbat do
   begin
      sMatrikula := '' ;
      for k:=1 to 4 do
      begin
         iAusazkoa := random(10) ;
         Str(iAusazkoa, sMatrikulaZifra) ;
         sMatrikula := sMatrikula + sMatrikulaZifra ;        
      end ;

      iAusazkoa := random(5) ;
      case iAusazkoa of
         0: rdIbilgailua.sMatrikula := sMatrikula + ' KHS' ;
         1: rdIbilgailua.sMatrikula := sMatrikula + ' BPK' ;
         2: rdIbilgailua.sMatrikula := sMatrikula + ' KKK' ;
         3: rdIbilgailua.sMatrikula := sMatrikula + ' XYZ' ;
         4: rdIbilgailua.sMatrikula := sMatrikula + ' KGB' ;
      end ;

      iAusazkoa := random(4) ;
      case iAusazkoa of
         0: rdIbilgailua.cIbilgailuMota := 'A' ;
         1: rdIbilgailua.cIbilgailuMota := 'B' ;
         2: rdIbilgailua.cIbilgailuMota := 'C' ;
         3: rdIbilgailua.cIbilgailuMota := 'D' ;
      end ;

      rdIbilgailua.rdDataUnea.Eguna[1] := 2021 ;              (* 2021-01-01 eta 2021-12-28 artean *)  
      rdIbilgailua.rdDataUnea.Eguna[2] := 1 + random(12) ;
      rdIbilgailua.rdDataUnea.Eguna[3] := 1 + random(27) ;

      rdIbilgailua.rdDataUnea.Ordua[1] := 13 ;                (* 13:05:00 eta 13:15:59 artean *)
      rdIbilgailua.rdDataUnea.Ordua[2] := 5 + random(11) ;
      rdIbilgailua.rdDataUnea.Ordua[3] := random(60) ;

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


procedure ZerrendaBete(var ardZerrenda: tardZerrenda; iLuzera: integer) ;
var
   k : integer ;
   rdIbilgailua : trdIbilgailua ;
begin  
   randomize ; 
   for k:=BEHEMUGA to iLuzera do
   begin
      writeln(k:4, '. ibilgailuaren datuak eskuratzen...') ;
      IbilgailuarenDatuakJaso(rdIbilgailua) ;
      ardZerrenda[k] := rdIbilgailua ;
   end ;
end ;


procedure IbilgailuarenDatuakErakutsi(const rdIbilgailua: trdIbilgailua) ;
begin
   writeln('Matrikula     Mota':24, 'Data':16, 'Ordua':16, 'Abiadura':14) ;
   writeln('---------     ----':24, '----------':16, '----------':16, '--------':14) ;
   write(rdIbilgailua.sMatrikula:15) ;
   write(rdIbilgailua.cIbilgailuMota:9) ;
   
   write(rdIbilgailua.rdDataUnea.Eguna[1]:10, '-') ;
   if rdIbilgailua.rdDataUnea.Eguna[2] >= 10 then
      write(rdIbilgailua.rdDataUnea.Eguna[2]:2, '-')
   else
      write('0', rdIbilgailua.rdDataUnea.Eguna[2], '-') ;   
   if rdIbilgailua.rdDataUnea.Eguna[3] >= 10 then
      write(rdIbilgailua.rdDataUnea.Eguna[3]:2)
   else
      write('0', rdIbilgailua.rdDataUnea.Eguna[3]) ;
   
   write(rdIbilgailua.rdDataUnea.Ordua[1]:10, ':') ; 
   if rdIbilgailua.rdDataUnea.Ordua[2] >= 10 then
      write(rdIbilgailua.rdDataUnea.Ordua[2]:2, ':')
   else
      write('0', rdIbilgailua.rdDataUnea.Ordua[2], ':') ;
   if rdIbilgailua.rdDataUnea.Ordua[3] >= 10 then
      write(rdIbilgailua.rdDataUnea.Ordua[3]:2)
   else
      write('0', rdIbilgailua.rdDataUnea.Ordua[3]) ;
      
   write(rdIbilgailua.rAldiunekoAbiadura:14:2) ;      
   writeln ;
   writeln ;
end ;


procedure ZerrendaIkusi(const ardZerrenda: tardZerrenda; iLuzera: integer) ;
var
   k : integer ;
   rdIbilgailua : trdIbilgailua ;
begin  
   for k:=BEHEMUGA to iLuzera do
   begin
      writeln(k:4, '. ibilgailuaren datuak:') ;
      rdIbilgailua := ardZerrenda[k] ;
      IbilgailuarenDatuakErakutsi(rdIbilgailua) ;
   end ;
end ;

(* ---------------------- PROGRAMA NAGUSIA ---------------------- *)
    
var
   ardZerrenda: tardZerrenda ;
   iLuzera: integer ;
begin
   writeln ;
   writeln ;
   writeln ;
   
   repeat
      write('   Zenbat elementu izango dira (', BEHEMUGA, ' eta ', GOIMUGA, ' arteko balioa): ') ;
      readln(iLuzera) ;
   until (iLuzera >= BEHEMUGA) and (iLuzera <= GOIMUGA) ;

   writeln ;
   ZerrendaBete(ardZerrenda, iLuzera) ;
   
   writeln ;
   ZerrendaIkusi(ardZerrenda, iLuzera) ;

   readln ;
end.

Programaren balizko exekuzio bat hurrrengo irudian erakusten da:


 

22. Ariketa: erregistroak (I)

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



ZER IKASIKO DUDAN:
Oinarrizko datu-mota desberdinak egitura bakar batean antolatzen eta gordetzen ikasiko dut, horretarako Record datu-mota funtsezkoa da. Erregistro batek hainbat eremu izango ditu, adibidez: demagun rdFitxa aldagaia erregistro bat dela eta bere eremu baten identifikadorea iAdina dela, eremu horren erreferentzia egiteko ondoko hau idatzi beharko da rdFitxa.iAdina non puntua lokailu berezia den.




ESKATZEN DEN PROGRAMA 

Erregistro baten eremuak datuz bete eta erregistroaren edukia pantailaratzea. Ariketaren erregistroak ibilgailu baten datuak bilduko ditu.

Erregistroaren egitura honako hau da:

1. eremua sMatrikula   'ZZZZ-LLL' formatuko 8 karakteredun kate bat
2. eremua cIbilgailuMota   karaktere bat
3. eremua rdDataUnea   2 eremuko erregistroa (eremu bakoitza 3 osoen array bat)
4. eremua rAldiunekoAbiadura   zenbaki erreal bat

Hauxe da ariketaren programa:

{ 22. ariketa: auto bat radar atari azpitik igartzean ondoko datuak   }
{              jaso eta gordetzen dira erregistro aldagai batean:     }

{     - Matrikula, karkatere-kate bat                                 }
{     - Ibilgailu mota, karaktere bat                                 }
{     - Data, 3 zenbakien array bat (posizioak: Urtea, Hilea, Eguna)  }
{     - Unea, 3 zenbakien array bat (posizioak: Orduak, Minutuak,     } 
{                                                        Segundoak)   }  
{     - Aldi uneko abiadura, zenbaki erreal bat                       }
                       
{  Datuak erdi automatikoki lortuko dira auzazko balioak aukeratuz.   }                   

program Ariketa_22 ;
   
type
    tsKateMatrikula = string[8] ;    { ZZZZ-LLL formatuko matrikula }

    taiData = array[1..3] of integer ;  { Urtea, Hilea, Eguna }
    
    taiUnea = array[1..3] of integer ;  { Orduak, Minutuak, Segundoak }
    
    trdNoiz = record
                  Eguna : taiData ;
                  Ordua : taiUnea ;
              end ;
              
    trdIbilgailua = record
                       sMatrikula         : tsKateMatrikula ;
                       cIbilgailuMota     : char ;
                       rdDataUnea         : trdNoiz ;
                       rAldiunekoAbiadura : real ;
                    end ;


procedure IbilgailuarenDatuakJaso(var rdIbilgailua: trdIbilgailua) ;
var
   iZenbat, iAusazkoa, iKont, k : integer ;
   sMatrikula, sMatrikulaZifra : tsKateMatrikula ;
begin
   randomize ;
   iZenbat := 15 + random(16) ;    
   for iKont:=1 to iZenbat do
   begin
      sMatrikula := '' ;
      for k:=1 to 4 do
      begin
         iAusazkoa := random(10) ;
         Str(iAusazkoa, sMatrikulaZifra) ;
         sMatrikula := sMatrikula + sMatrikulaZifra ;        
      end ;

      iAusazkoa := random(5) ;
      case iAusazkoa of
         0: rdIbilgailua.sMatrikula := sMatrikula + ' KHS' ;
         1: rdIbilgailua.sMatrikula := sMatrikula + ' BPK' ;
         2: rdIbilgailua.sMatrikula := sMatrikula + ' KKK' ;
         3: rdIbilgailua.sMatrikula := sMatrikula + ' XYZ' ;
         4: rdIbilgailua.sMatrikula := sMatrikula + ' KGB' ;
      end ;

      iAusazkoa := random(4) ;
      case iAusazkoa of
         0: rdIbilgailua.cIbilgailuMota := 'A' ;
         1: rdIbilgailua.cIbilgailuMota := 'B' ;
         2: rdIbilgailua.cIbilgailuMota := 'C' ;
         3: rdIbilgailua.cIbilgailuMota := 'D' ;
      end ;

      rdIbilgailua.rdDataUnea.Eguna[1] := 2021 ;              (* 2021-01-01 eta 2021-12-28 artean *)  
      rdIbilgailua.rdDataUnea.Eguna[2] := 1 + random(12) ;
      rdIbilgailua.rdDataUnea.Eguna[3] := 1 + random(27) ;

      rdIbilgailua.rdDataUnea.Ordua[1] := 13 ;                (* 13:05:00 eta 13:15:59 artean *)
      rdIbilgailua.rdDataUnea.Ordua[2] := 5 + random(11) ;
      rdIbilgailua.rdDataUnea.Ordua[3] := random(60) ;

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


procedure IbilgailuarenDatuakErakutsi(const rdIbilgailua: trdIbilgailua) ;
begin
   writeln('Matrikula: ':20, rdIbilgailua.sMatrikula) ;
   
   writeln('Mota: ':20, rdIbilgailua.cIbilgailuMota) ;
   
   write('Data: ':20) ; 
   write(rdIbilgailua.rdDataUnea.Eguna[1], '-') ;
   if rdIbilgailua.rdDataUnea.Eguna[2] >= 10 then
      write(rdIbilgailua.rdDataUnea.Eguna[2], '-')
   else
      write('0', rdIbilgailua.rdDataUnea.Eguna[2], '-') ;   
   if rdIbilgailua.rdDataUnea.Eguna[3] >= 10 then
      writeln(rdIbilgailua.rdDataUnea.Eguna[3])
   else
      writeln('0', rdIbilgailua.rdDataUnea.Eguna[3]) ;
   
   write('Ordua: ':20) ;  
   write(rdIbilgailua.rdDataUnea.Ordua[1], ':') ; 
   if rdIbilgailua.rdDataUnea.Ordua[2] >= 10 then
      write(rdIbilgailua.rdDataUnea.Ordua[2], ':')
   else
      write('0', rdIbilgailua.rdDataUnea.Ordua[2], ':') ;
   if rdIbilgailua.rdDataUnea.Ordua[3] >= 10 then
      writeln(rdIbilgailua.rdDataUnea.Ordua[3])
   else
      writeln('0', rdIbilgailua.rdDataUnea.Ordua[3]) ;
      
   writeln('Abiadura: ':20, rdIbilgailua.rAldiunekoAbiadura:6:2) ;      
end ;

(* ---------------------- PROGRAMA NAGUSIA ---------------------- *)
    
var
   rdIbilgailua: trdIbilgailua ;
begin
   writeln ;
   writeln ;
   writeln ;
   
   writeln('    Ibilgailuaren datuak eskuratzen... ') ;
   IbilgailuarenDatuakJaso(rdIbilgailua) ;   
   writeln ;
   writeln ;
   
   writeln('    Hona hemen ibilgailuaren datuak:') ;
   IbilgailuarenDatuakErakutsi(rdIbilgailua) ;   
   writeln ;
   writeln ;
      
   readln ;
end.

Programaren balizko exekuzio bat hurrrengo irudian erakusten da:

Erregistroa itzultzen duen funtziorik ez dugu programatuko, gauza bera gertatzen da arrayekin (21. Ariketa: zerrendak (IV))