2024(e)ko apirilaren 4(a), osteguna

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 osoari 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

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