2023(e)ko apirilaren 4(a), asteartea

RECORD datu-mota


























DEFINIZIOA


RECORD edo erregistro datu-mota, ataletan antolatzen den datu-mota egituratua da. Erregistro batek dituen elementuak eremuak deitzen dira eta eremuen datu-mota desberdinak izan daitezke elkarrekiko, erregistroaren elementu kopurua finitua da eta eremu bakoitzaren atzipena identifikadore baten bitartez gauzatzen da.

ESKEMA






DATU-MOTA SORTZEN



Erregistro datu-mota bat deklaratzean, eremuak izendatzeko identifikadorea erabaki behar da eta eremu bakoitza zein datu-motatakoa izango den.



Eskeman erakusten den rdIkaslea delako aldagaia lortzeko, aurretik deklarazio hau egin beharko da:





...
        type
trdIkasle = record
sIzena: string[39] ;
rNota: real ;
sHelbidea: string[99] ;
byAdina: byte ;
end ;
var
rdIkaslea: trdIkasle ;
rdIrakaslea: trdIkasle ;
...




Ondorioz rdIkaslea eta rdIrakaslea bi aldagaiak datu-mota bera daukate oinarrian eta biak bat datoz goi-goian erakutsi den eskemarekin.



Erregistro aldagai batean datuak gordetzeko, aldagaiaren identifikadorea eta eremuaren identifikadorea idatzi behar dira horien artean lokailu bat jarri beharra dago. Pascal lengoaiak identifikadore biren arteko elkarketa gauzatzeko puntu bat darabil, horrelaxe:



writeln(rdIkaslea.sIzena) ;

readln(rdIkaslea.rNota) ;

Puntua ken daiteke WITH klausula erabiltzen bada, aurreko aginduak honelaxe idatziko lirateke:


with rdIkaslea do

begin
       writeln(sIzena) ;
       readln(rNota) ;

end ;

ERAGIKETAK: IDATZI-IRAKURRI ETA ESLEIPENA



Erregistro bat ezin daiteke ez irakurri ez idatzi, horregatik ondoko aginduak okerrak dira:


writeln(rdIkaslea) ;     { HAU GAIZKI DAGO }

readln(rdIrakaslea) ;    { HAU GAIZKI DAGO }

Aurreko adibidearen erregistroaren eremuak idatz edo irakur daiteke, eta ondorioz agindu hauek zuzenak dira:


writeln(rdIkaslea.sIzena) ;

readln(rdIkaslea.rNota) ;

Erregistro bati aplika dakioken eragiketa bakarra esleipena da, ondoko agindu hau zuzena da:



rdIkaslea := rdIrakaslea ;


ERAGIKETAK: KONPARAKETAK



Esan den bezala, erregistroek onartzen duten eragiketa bakarra asignazioa da. Hori dela eta, ezin daiteke erregistroen arteko konparaziorik egin. Labur azalduz:


  • 6 konparatzaileetatik lau hauek ez dute zentzu handirik erregistroekin: <, >, <= eta >=



  • 6 konparatzaileetatik beste biek (= eta <>) zentzua izan dezakete erregistroekin baina bi erregistroen arteko alderaketa ezin daiteke honela egin:




if rdIkasle1 = rdIkasle2 then   { HAU GAIZKI DAGO }

if rdIkasle1 <> rdIkasle2 then  { HAU GAIZKI DAGO }


Horregatik erregistro bik informazio berdina gordetzen dutela frogatzeko eremuka lan egingo da. Konparaketa helburu horrekin, ErregistroBiBerdinakOteDiren izeneko adibidean, funtzio boolear bat garatu da.



ERREGISTROAK ETA ARRAYAK



Sarritan erregistroak eta arrayak elkarrekin konbinatzen dira. Esate baterako, jarraian erregistroen array bat deklaratzen da: 





...
        type
trdIkasle = record
sIzena: string[39] ;
rNota: real ;
end ;
tardTalde = array[1..80] of trdIkasle ;
var
ardIkasgela: tardTalde ;
iLuzera: integer ;
Indize: integer ;
...




Datuak sartu eta eskema bat eginez:







Datuak sartu ondoren, ikusi nola eskuratuko genukeen irudiko P hori. Honelaxe zehaztuko genuke:


  • ardIkasGela arraytik abiatuta

  • Indize aldagaiak 2 balioa duelarik, arrayaren bigarren elementu hau ardIkasGela[2]erregistro bat da...

  • eta sIzena eremua hartzean, hots, ardIkasGela[2].sIzena string bat da...

  • eta string horren bere lehen karakterea eskuratzeko ardIkasGela[2].sIzena[1]erabiliko dugu


ARRAYAK ERREGISTROETAN



Erregistro baten eremu bat array bat izan daiteke. Esate baterako, jarraian array bat daukan erregistro bat deklaratzen da:





...
        type
tasKateak = array [1..3] of string[39] ;
trdIkasle = record
asIzenDeiturak: tasKateak ;
rNota: real ;
end ;
var
rdIkaslea: trdIkasle ;
...




Datuak sartu eta eskema bat eginez:









Datuak sartu ondoren, ikusi nola eskuratuko genukeen irudiko M hori. Honelaxe zehaztuko genuke:


  • rdIkaslea erregistrorik abiatuta

  • rdIkaslea.asIzenDeiturak array bat da eta...

  • bere hirugarren elementua rdIkaslea.asIzenDeiturak[3]izanik, badakigu string bat dela

  • eta bere lehen karakterea eskuratzeko rdIkaslea.asIzenDeiturak[3][1]erabiliko dugu


ERREGISTROAK ERREGISTROETAN



Erregistro baten eremu bat beste erregistro bat izan daiteke. Esate baterako, ikusi jarraian nola deklaratzen den DM_rdLangile erregistroa bere barnean DM_rdData erregistroa daukana:





...
        type
DM_rdData = record
iUrtea: integer ;
byHilea: byte ;
byEguna: byte ;
end ;
DM_rdLangile = record
sIzena : string[39] ;
cKategoria : char ;
rdJaioteguna : DM_rdData ;
rdAintzinatasuna: DM_rdData ;
end ;
var
rdMekanikoa: DM_rdLangile ;
...




Datu-motaren eskema bat eginez:






rdMekanikoa aldagaian datuak sartzeko bi bide ditugu. Puntu konektorea birritan erabili edo bestela WITH klausula erabili. Ondoko esleipenak zuzenak dira eta edozein modutan irudian erakusten den emaitza lortuko dugu:





Puntu lokailua birritan erabiliz:





...
        rdMekanikoa.sIzena := 'Alain' ;
rdMekanikoa.cKategoria := 'B' ;
rdMekanikoa.rdJaioteguna.iUrtea := 1975 ;
rdMekanikoa.rdJaioteguna.byHilea := 11 ;
rdMekanikoa.rdJaioteguna.byEguna := 27 ;
rdMekanikoa.rdAintzinatasuna.iUrtea := 1997 ;
rdMekanikoa.rdAintzinatasuna.byHilea := 10 ;
rdMekanikoa.rdAintzinatasuna.byEguna := 30 ;
...




WITH klausularen bitartez aurreneko rdMekanikoa. zatia ken daiteke:





...
        with rdMekanikoa do
begin
sIzena := 'Alain' ;
cKategoria := 'B' ;
rdJaioteguna.iUrtea := 1975 ;
rdJaioteguna.byHilea := 11 ;
rdJaioteguna.byEguna := 27 ;
rdAintzinatasuna.iUrtea := 1997 ;
rdAintzinatasuna.byHilea := 10 ;
rdAintzinatasuna.byEguna := 30 ;
end ;
...





WITH klausulak onartzen du bigarren puntua kentzea. Datu-motaren definizioaren arabera WITH klausula erabiltzean kontuz ibili behar da; esate baterako, aurreko adibidean ezinezkoa zaigu puntu konektorea kentzea rdAintzinatasuna identifikadorearekin lan egitean:





...
        with rdMekanikoa, rdJaioteguna do
begin
sIzena := 'Alain' ;
cKategoria := 'B' ;
iUrtea := 1975 ;
byHilea := 11 ;
byEguna := 27 ;
rdAintzinatasuna.iUrtea := 1997 ;
rdAintzinatasuna.byHilea := 10 ;
rdAintzinatasuna.byEguna := 30 ;
end ;
...





WITH klausulak ebaluatu behar dituen erregistroak aldatuz (rdMekanikoa eta rdAintzinatasuna idazten badira) puntuak horrela jarri beharko lirateke:





...
        with rdMekanikoa, rdAintzinatasuna do
begin
sIzena := 'Alain' ;
cKategoria := 'B' ;
rdJaioteguna.iUrtea := 1975 ;
rdJaioteguna.byHilea := 11 ;
rdJaioteguna.byEguna := 27 ;
iUrtea := 1997 ;
byHilea := 10 ;
byEguna := 30 ;
end ;
...



Erregistro batek beste erregistro bat duenaren adibibide hau aztertu: ErregistroakErregistroetan_WITH.pas


PARAMETRO IZATEAN JOKAMOLDEA



Erregistro bat datu-mota egituratua delako, beti erreferentziaz pasatuko dugu azpiprogrametara. Horregatik, azpiprograma batean honela agertuko da jokamoldearen arabera:


  • Irteerakoa denean parametro formalak VAR marka izango du aurrean

  • Sarrerakoa denean parametro formalak CONST marka izango du aurrean


Gogoratu arrayek modu beretsuan jokatzen zutela.
ERREGISTRO BAT ITZULTZEN DUEN AZPIPROGRAMA: FUNTZIOA EDO PROZEDURA



Demagun erregistro baten eremuak azpiprograma baten barruan datuz betetzen direla eta azpiprogramak erregistroa programa nagusira itzuli egiten duela. Zer azpiprograma mota erabiliko dugu, funtzioa ala prozedura? Deiak hauek lirateke:


ErregistroaBete(rdIkaslea) ;          { prozedura BAI }
rdIkaslea := fnrdErregistoaBete ;     {
funtzioa EZ }

Prozesaketa batean erregistro bat aldatzeko, ez dugu funtziorik erabiliko. Erregistro bat azpiprograma baten bitartez prozesatzean aldatuko bada, beti prozedura erabiliko dugu. Gogoratu galdera bera arrayekin berdin erantzuten zela. Egoera biak hemen adierazten dira: Datu-mota eta azpiprogramak
ADIBIDEAK



Hona hemen erregistroen zenbait programa:

















INTEGER REAL BOOLEAN CHAR STRING ARRAY RECORD FILE



 



iruzkinik ez:

Argitaratu iruzkina