2023(e)ko martxoaren 17(a), ostirala

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 bati 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:


  • Prozesaketa, arrayaren elementu guztiei prozesu jakin bat aplikatu. Ikus 01_Prozesaketa.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 03_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 04_Maximoa.pas programan ikus daitekeen bezala. Algoritmo honen hitzezko azalpena bideo honetan ikus daiteke



  • Txertaketa, arrayaren iNon posizio ezagun batean elementu berri bat txertatu. Ikus 05_Txertaketa.pas programa. Txertaketa algoritmoaren irudia eta azalpena hemen aztertu



  • Ezabaketa, arrayaren iNon posizio ezagun batean dagoen elementua ezabatu. Ikus 06_Ezabaketa.pas programa. Ezabaketa algoritmoaren irudia eta azalpena hemen aztertu



  • HURRENGOA ERRAZAGOA  Hainbat ezabaketa jarraian array berean, adibidez ikus 06b_HainbatEzabaketa.pas programa non zenbaki txikiko elementuak arraytik kentzen diren, lan hori burutzeko elementuak banan-banan ezabatzen dira



  • 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 06a_HainbatEzabaketa.pas programa non zenbaki txikiak diren elementuak kentzeko arNotaHandiak array laguntzaile bat erabiltzen den



  • HAU EZ  Sailkatzea edo ordenatzea, arrayaren elementuak irizpide baten arabera sailkatu/ordenatu, hemen azalpena eta gogoratu minimoaren posizioa nola zehazten den. Ikus 07_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, 08a_BilaketaBitarra.pas programa, non arrayaren edukia teklatuz eman behar den. Ikus ere 08b_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