2024(e)ko martxoaren 14(a), osteguna

ARRAY datu-mota

DEFINIZIOA

Array bat bektore bat da. Arrayak dituen elementuak mota berekoak dira eta indize-zerrenda baten bitartez identifikatzen dira, arrayaren elementu kopurua finitua da eta memoriaren gelaxketan biltegitzean hurrenez hurren kokatzen dira.

Array batek ez ditu indizeak aurredefiniturik eta erabiltzaileak erabakiko du hori (sarri askotan arrayaren lehen indizea 1 izaten da).
ESKEMA

DATU-MOTA SORTZEN

Array datu-mota bat deklaratzean, besteak beste, elementuei dagokien datu-mota jarri beharko da, adibidez Real zenbaki errealen array bat izango bada. Lehen elementuaren eta azken elementuaren posizioak izendatzeko indizeak zehaztuko dira.

Demagun array aldagaiak deklaratzeko tarZerrenda izeneko datu-mota sortu nahi dela programa jakin batean, suposa dezagun tarZerrenda datu-motako arrayetan zenbaki errealak gordeko direla eta gehienez 80 zenbaki izango direla. Hau da tarZerrenda datu-mota egituratuari dagokion deklarazioa eta bi aldagai:
...
        type
           tarZerrenda = array[1..80] of real;
        var
           arGela1, arGela2: tarZerrenda;
           iLuzera1, iLuzera2: integer;
...      
Gure nahia bi dimentsiotako bektorea balitz, tabTaula izeneko datu-mota sor daiteke balio boolearrak gorde ahal izateko adibidez. Hau da tabTaula datu-mota egituratuari dagokion deklarazioa eta dagokion aldagai bat:
... 
        type
           tabTaula = array[1..10, 1..5] of boolean;
        var
           abAprobatuak: tabTaula;
           iLerroKopurua, iZutabeKopurua: integer;
...
Gure nahia hiru dimentsiotako bektorea balitz ikusi 10. astea | XYZ aretoaren tenperaturak adibidean tarBolumena datu-mota nola zehazten den.
ERAGIKETAK: IDATZI-IRAKURRI ETA ESLEITU

Array bat ezin daiteke bere osotasunean ez irakurri ez idatzi, horregatik ondoko aginduak okerrak dira:
writeln(arGela1);    { HAU GAIZKI DAGO }
readln(arGela2);     { HAU GAIZKI DAGO }
Aurreko adibidean arrayaren elementua idatz edo irakur daiteke, eta ondorioz ondoko aginduak zuzenak dira:
writeln(arGela1[1]);        { ONDO, ZENBAKI ERREALA PANTAILAN IDATZI }
readln(arGela2[iLuzera2]);  { ONDO, ZENBAKI ERREALA TEKLATUZ IRAKURRI }
Array osoari aplika dakioken eragiketa bakarra esleipena da, ondoko agindu hau zuzena da:
arGela2 := arGela1;  { ONDO, BAINA BIAK tarZerrenda DIRELAKO }
ERAGIKETAK: KONPARAKETAK

Esan den bezala, arrayek onartzen duten eragiketa bakarra asignazioa da. Hori dela eta, ezin daiteke arrayen arteko konparaziorik egin. Labur azalduz:
  • 6 konparatzaileetatik lau hauek ez dute zentzu handirik arrayekin: <, >, <= eta >=
  • 6 konparatzaileetatik beste biek (= eta <>) zentzua izan dezakete arrayekin, baina bi arrayen arteko alderaketa ezin daiteke honela egin:
  if arGela1 = arGela2 then    { HAU GAIZKI DAGO }
  if arGela1 <> arGela2 then   { HAU GAIZKI DAGO }
Bi array arteko konparaketak egiteko, array biren elementuak konparatu beharko dira bikoteka: lehena lehenarekin, bigarrena bigarrenarekin, ...

Adibidez, ikusi nola jakin daitekeen bi array berdinak ote diren.
PARAMETRO IZATEAN JOKAMOLDEA

Array bat datu-mota egituratua delako beti erreferentziaz pasatuko dugu azpiprogrametara (adibidez, irudi hau ikusi). Horregatik, azpiprograma baten parametro formalean arraya honela agertuko da bere jokamoldearen arabera:
  • Irteerakoa denean VAR marka izango du aurrean
  • Sarrerakoa denean CONST marka izango du aurrean
Baina gehietan, array datu-motako aldagaiarekin batera derrigorrezkoa zaigu bigarren aldagai bat, zenbaki oso bat izanik arrayaren luzera efektiboa zehazten duena. Zenbaki oso hori datu-mota sinplea delako horrela pasatuko dugu azpiprogrametara:
  • Erreferentziaz pasatuko dugu irteerakoa denean, horregatik VAR marka izango du aurrean
  • Balioz pasatuko dugu sarrerakoa denean, zenbaki osoa sarrerakoa denean parametro formalari ez zaio aurrean ezer jartzen
Array datu-motako parametro bat beti izango da VAR edo CONST markekin. Ikusiko denez erregistroen parametroek berdin jokatzen dute, hots, arrayetan eta erregistroetan parametroak VAR edo CONST izango dira (irteerako parametroa izatean VAR eta sarrerakoa izatean CONST).
ARRAY BAT ITZULTZEN DUEN AZPIPROGRAMA: FUNTZIO EDO PROZEDURA

Orokorrean array batekin lan egiteko bi aldagai behar izaten ditugu. Batetik, array datu-motako aldagaia eta bestetik bere luzera efektiboa definitzen duen Integer datu-motako aldagaia. Adibidez, hau izan daiteke azpiprogramaren balizko dei bat:
ZerrendaIzenezBete(asIzenak, iZenbat);
Beste batzuetan array-aren luzera finkoa da, eta kasu horretan zalantza izan dezakegu: funtzio edo prozedura bat erabiliko dugu? Bi azpiprogramen deiak hauek lirateke:
ZerrendaIzenezBete(asIzenak);          { prozedura BAI }
asIzenak := fnasZerrendaIzenezBete;    {
funtzioa EZ }
Prozesaketa batean array bat aldatzeko ez dugu funtziorik erabiliko, array bat azpiprograma baten bitartez prozesatzean aldatzeko beti prozedura erabiliko dugu. Ikusiko denez galdera bera erregistroekin berdin erantzuten da. Egoera biak hemen adierazten dira: Datu-motak eta azpiprogramak.
LAN EGITEKO BALIABIDEAK


Arrayekin lan egiteko ez dago aurredefinituriko funtzio eta prozedurarik, horregatik algoritmo espezifikoak programatu eta erabili behar dira. Hona hemen ikasi behar diren algoritmoak:
  • Osorik prozesatu, arrayaren elementu guztiei prozesu jakin bat aplikatu. Ikus 01_OsorikProzesatu.pas programa
  • Bilaketa sekuentziala edo Bilaketa lineala, rGakoa balio bat emanik arrayan ote dagoen aztertu behar da eta emaitza rGakoa balioaren posizioa izango da, rGakoa balioaren lehen agerpena bilatzen delako ezin daiteke FOR-DO egitura erabili, horren ordez WHILE-DO edo REPEAT-UNTIL egiturak erabiliko dira (ikus bakoitzaren adibide bat 02a_BilaketaLineala.pas programan WHILE-DO bitartez lortu da emaitza eta 02b_BilaketaLineala.pas programan REPEAT-UNTIL bitartez). Bilaketa sekuentzialaren nondik norakoak hemen azaltzen dira eta bere aplikazio bat hemen
  • Minimoa, arrayaren baliorik txikienaren posizioa zehaztu. Minimoaren posizioa zehazten duen algoritmoa Prozesaketa mota bat da 03a_Minimoa.pas programan ikus daitekeen bezala. Algoritmo honen hitzezko azalpena bideo honetan ikus daiteke.

    Maximoa, arrayaren baliorik handienaren posizioa zehaztu. Maximoaren posizioa zehazten duen algoritmoa Prozesaketa mota bat da 03b_Maximoa.pas programan ikus daitekeen bezala. Algoritmo honen hitzezko azalpena bideo honetan ikus daiteke

  • Gehiketa bat, arrayaren bukaeran elementu berri bat jarri baldin eta arraya beterik ez badago. Ikusi algoritmoa 04_Gehiketa.pas programa-adibidean
  • Txertaketa bat, arrayaren iNon posizio ezagun batean elementu berri bat txertatu. Ikus 05_Txertaketa.pas programa. Txertaketa algoritmoaren irudia eta azalpena hemen aztertu
  • Hainbat txertaketa, posizio bat emanik hainbat elementu jarraian txertatu nahi direnean ez dugu Txertaketa algoritmoa aplikatuko. Izan ere, lan hori benetan bi zatitan egindako prozesaketa bat da. Horregatik, arazo horri Prozesaketa algoritmoa dagokio. Ikus 07a_HainbatTxertaketa.pas programa non elementu berriak txertatzeko bi array laguntzaile erabiltzen diren

    HAU ZAILAGOA DA  Array laguntzailerik gabeko txertaketak. Hainbat txertaketa jarraian array berean, adibidez ikus 07b_HainbatTxertaketa.pas programa, non zenbat nota berri sartuko diren eskatzen den eta zein posiziotan joan diren eskatzen den, lan hori burutzeko elementuak banan-banan txertatzen dira

  • Ezabaketa bat, arrayaren iNon posizio ezagun batean dagoen elementua ezabatu. Ikus 06_Ezabaketa.pas programa. Ezabaketa algoritmoaren irudia eta azalpena hemen aztertu
  • Hainbat ezabaketa, baldintza bat betetzen dituzten elementuak ezabatu nahi direnean ez dugu Ezabaketa algoritmoa aplikatuko. Izan ere, lan hori benetan prozesaketa bat da eta ez ezabaketa bat. Horregatik, arazo horri Prozesaketa algoritmoa dagokio. Ikus 08a_HainbatEzabaketa.pas programa non zenbaki txikiak diren elementuak kentzeko arNotaHandiak array laguntzaile bat erabiltzen den

    HAU ZAILAGOA DA  Array laguntzailerik gabeko ezabaketak. Hainbat ezabaketa jarraian array berean, adibidez ikus 08b_HainbatEzabaketa.pas programa non zenbaki txikiko elementuak arraytik kentzen diren, lan hori burutzeko elementuak banan-banan ezabatzen dira

  • HAU EZ  Sailkatzea edo ordenatzea, arrayaren elementuak irizpide baten arabera sailkatu/ordenatu, hemen azalpena eta gogoratu minimoaren posizioa nola zehazten den. Ikus 09_Sailkatzea.pas programa
  • HAU EZ  Bilaketa bitarra, arrayaren elementuak sailkaturik/ordenaturik daudelarik sGakoa balio bat emanik arrayan ote dagoen aztertu behar da eta emaitza sGakoa balioaren posizioa izango da. Ikusi, adibidez, 10a_BilaketaBitarra.pas programa, non arrayaren edukia teklatuz eman behar den. Ikus ere 10b_BilaketaBitarra.pas programa, non arrayaren edukia konstantea den. Bilaketa bitarraren nondik norakoak hemen azaltzen dira
ARRAY KONSTANTEAK

Array datu-mota bat deklaratzen ikasi dugu, baina ez dugu ikusi nola deklaratzen den array konstante bat. Hona hemen dimentsio bakarreko array konstantea:
         program ZerrendaHasieratu;
         type
            taiZerrenda = array[1..3] of integer;
         const
            aiZERRENDA : taiZerrenda = (1, 2, 3);
         ...

Eta hemen bi dimentsiotako array konstantea:
         program TaulaHasieratu;
         type
            taiTaula = array[1..4, 1..3] of integer;
         const
            aiTAULA : taiTaula = ((11, 12, 13),
                                  (21, 22, 23),
                                  (31, 32, 33),
                                  (41, 42, 43));
         ...
aiZERRENDA eta aiTAULA array konstanteak ZerrendaEtaTaulaHasieratu.pas programan erabiltzean, haien edukiak pantailaratzean hau agertuko litzateke:

TERMINOLOGIA

ADIBIDEAK

Hona hemen arrayen 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.