Irudian zenbaki errealen arNotak array bat daukagu, bere luzera efektiboa iLuzera aldagaiak adierazten du eta 5 balio du. Demagun 2 posizioan dagoen 17.1 balioa arraytik kendu nahi dugula, hots, arrayaren bigarren elementua ezabatu nahi dugula. Azkenean, noski, iLuzera aldagaiaren edukia 4 izango da.
Irudia handiago ikusteko bere gainean klik egin
Programa nagusiak hiru parametro pasatzen dizkio funtzioari, lehenengo biak sarrera/irteerakoak eta azkena sarrerakoa. FOR-TO-DO kontrol-egiturari esker hiru iterazi emango dira adibide honetan:
- iterazioan: iIndizea=2 delako 17.1 datua zapalduta geratuko da, izan ere arNotak[2] posizioan arNotak[3] balioa kopiatzen delako eta 72.9 datua bikoiztuta geratzen da
- iterazioan: iIndizea=3 delako 72.9 datua zapalduta geratuko da, izan ere arNotak[3] posizioan arNotak[4] balioa kopiatzen delako eta 56.8 datua bikoiztuta geratzen da
- iterazioan: iIndizea=4 delako 56.8 datua zapalduta geratuko da, izan ere arNotak[4] posizioan arNotak[5] balioa kopiatzen delako eta 66.6 datua bikoiztuta geratzen da
Adibide honetan 3. iterazioarekin bukatzen da prozesu errepikakorra, eta ezabaketa benetan gauzatzeko arrayaren luzera dekrementatu beharra dago: arrayaren luzera efektiboa 4 izan dadila, horregatik iLuzera:=4 jarri behar da (bigarren parametroa irteerakoa izatearen arrazoia hauxe da).
Array batean elementu bat nola ezabatzen den ulertuz gero, erraza da ulertzea array batean elementu berri bat nola txertatzen den (ikusi 10. astea | txertaketa array batean irudia eta azalpena).
Eta arrayaren elementu bat baino gehiago ezabatu behar baditugu?
Arrayaren elementu bat baino gehiago ezabatu behar baditugu bi aukera ditugu:
- Goiko algoritmoa hainbat aldiz errepikatzea (06a_HainbatEzabaketa.pas programa).
- Array laguntzaile bat erabiltzea (06b_HainbatEzabaketa.pas programa).
Adibidez, balio txikiak array batetik kendu:
{ 06a_HainbatEzabaketa.pas }
procedure ElementuBatEzabatu(var arNotak : tarZerrenda;
var iLuzera : integer;
iIndizea : integer) ;
var
j : integer ;
begin
for j:=iIndizea to iLuzera-1 do
begin
arNotak[j] := arNotak[j+1] ;
end ;
iLuzera := iLuzera - 1 ;
end ;
{ Elementu guztiak banan-banan aztertu eta zenbakiren bat txikia bada ezabatu. }
procedure Ezabaketak(var arNotak : tarZerrenda;
var iLuzera : integer;
rMuga : real) ;
var
k : integer ;
begin
k := 1 ;
while k <= iLuzera do { zergatik FOR-TO-DO bat gaizki dago? }
begin
if arNotak[k] < rMuga then
ElementuBatEzabatu(arNotak, iLuzera, k)
else k := k + 1 ;
end ;
end ;
Adibidez, balio handiak array baterik kendu:
{ 06b_HainbatEzabaketa.pas }
{ Array laguntzaile batean zenbaki handiak gorde eta amaitzean array }
{ laguntzailearen informazio hori emaitza izango den parametrora eraman. }
{ Benetan algoritmo hay ez da ezabaketa bat, prozesaketa bat baino. }
procedure ArrayarenTxikiakEzabatu(var arNotak : tarZerrenda;
var iLuzera : integer;
rErreferentzia : real) ;
var
iIndizea, k : integer ;
arNotaHandiak : tarZerrenda;
begin
k := 0 ;
for iIndizea:=BEHEMUGA to iLuzera do
begin
if arNotak[iIndizea] > rErreferentzia then
begin
k := k + 1 ;
arNotaHandiak[k] := arNotak[iIndizea] ;
end ;
end ;
(* Array berritua kanporatu, bere balioak eta luzera berria *)
arNotak := arNotaHandiak ;
iLuzera := k ;
end ;
Eta ezabaketa bat baino gehiago egin behar denean? Datua ez da ezabatuko den posizioa baizik balioen ezaugarri bat. Ikusi 10. astea | hainbat ezabaketa array batean artikulua.
iruzkinik ez:
Argitaratu iruzkina