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

9. astea | bilaketa array batean


















Zenbaki osoen array bat osatu eta pantailan erakutsi. Gero, gakoa den zenbaki bat teklatuaren bitartez aukeratu eta zenbaki hori arrayean bilatu. Gakoa den zenbakia aurkituz gero, array barruan dagokion bere indizea pantailaratu. Gakoa den zenbakia aurkitzen ez bada gertaera hori adierazi pantailako mezu baten bitartez.




Ariketa hau ArrayAlgoritmoak_1 [49 minutu 24 segundo] bideo honetan ikus daiteke, hots, array bat nola datuz betetzen den, nola bere edukia pantailaratzen den eta nola burutzen den arrayaren elementu jakin baten bilaketa.




Hona hemen iturburu-programa:

program BilaketaLinealaArrayetan ;
const
BEHEMUGA = 1 ;
GOIMUGA = 40 ;
type
taiZerrenda = array[BEHEMUGA..GOIMUGA] of integer ;


procedure ArrayaIkusi(const aiZenbakiak: taiZerrenda; iLuzera: integer) ;
var
iIndizea: integer ;
begin
writeln('Arrayaren edukia: ') ;
for iIndizea:=BEHEMUGA to iLuzera do
begin
write(aiZenbakiak[iIndizea]: 8) ;
end ;
writeln ;
end ;


procedure ArrayaBete(var aiZenbakiak: taiZerrenda; var iLuzera: integer) ;
var
iKont: integer ;
iZeinua: integer ;
begin
randomize ;
iLuzera := random(GOIMUGA) + 1 ; { iLuzera logikoa aleatorioa }

writeln('Arrayan ', iLuzera, ' datu gordetzen') ;
for iKont:=BEHEMUGA to iLuzera do
begin
if random(2)=0 then { iZeinua aleatorioki lortzen da }
iZeinua := -1
else
iZeinua := 1 ;

{ 0 eta 99 arteko auzazko zenbakia }
aiZenbakiak[iKont] := iZeinua*random(100) ;
end ;
end ;


function fniBilaketaLineala(const aiZenbakiak: taiZerrenda;
iLuzera: integer;
iGakoa: integer): integer ;
var
iIndizea: integer ;
boAurkitua: boolean ;
begin
iIndizea := BEHEMUGA ;
boAurkitua := FALSE ;
WHILE (iIndizea <= iLuzera) AND NOT boAurkitua do
begin
if aiZenbakiak[iIndizea] = iGakoa then
boAurkitua := TRUE
else
iIndizea := iIndizea + 1 ;
end ;

if boAurkitua then
fniBilaketaLineala := iIndizea
else
fniBilaketaLineala := 0 ; { 0 gezurrezko posizioa litzateke }
end ;


var
aiZenbakiak: taiZerrenda ;
iLuzera, iPosizioa, iGakoa: integer ;
cErantzuna: char ;
begin
repeat
writeln('------------------------------------------------------') ;

ArrayaBete(aiZenbakiak, iLuzera) ;
ArrayaIkusi(aiZenbakiak, iLuzera) ;

write('Bilatu nahi den balioa eman: ') ;
readln(iGakoa) ;

iPosizioa := fniBilaketaLineala(aiZenbakiak, iLuzera, iGakoa) ;

if iPosizioa = 0 then
writeln(iGakoa, ' zenbakia ez dago arrayan')
else
writeln(iGakoa, ' balioari dagokion indizea arrayan ', iPosizioa, ' da') ;

writeln ;
repeat
write('Beste array bat sortu eta bilaketa berri bat?(B/E): ') ;
readln(cErantzuna) ;
cErantzuna := upcase(cErantzuna) ;
until (cErantzuna = 'E') or (cErantzuna = 'B') ;
writeln ;
until cErantzuna = 'E' ;

writeln ;
write('Agur') ;
readln ;
end.




Adibide-ariketa honetan aztertu bereziki azpiprogramen parametroak nola pasatu behar diren. Parametro pasatze jardueran, orain arte bakarrik kontzeptu bat hartzen zen aintzakotzat: sarrerako parametroa ala irteerako parametroa. Orain, datu-mota egituratuak behar ditugularik, kontzeptu bera mantentzen da (parametroaren jokamoldea sarrerakoa den ala irteerakoa den) baina beste modu batez egiten da, horren arabera aukerak hiru izango dira:




  • sarrerakoa, ez da ezer idazten parametro aurredefinituan (String, Char, Integer, Real, Boolean)

  • CONST sarrerakoa, parametro egituratuan (Array, Record)

  • VAR irteerakoa, edozein datu-motatan





Ikusi ondoko irudiak:














Hurrengo irudian zenbaki errealen arNotak array bat daukagu, bere luzera efektiboa iLuzera aldagaiak adierazten du eta 5 balio du. Demagun 72.9 balioa bilatu nahi dugula arrayan, hau, balio horren indizea baldin eta arrayan badago.




Bilaketa ezin daiteke FOR baten bitartez egin, horregatik WHILE edo REPEAT kontrol-egituraren bat erabiliko dugu. WHILE erabiliz irudia honela ulertzen da:




Irudia handiago ikusteko bere gainean klik egin




Irudiko lauki gorrian funtzioaren hiru parametroak eta gris kolorean funtzioaren bertako aldagaiak, aldagai laguntzaileak. WHILE-DO kontrol-egituraren baldintza lehendabizi ebaluatu aurretik bi hasierakieta egiten dira: iIndizea=1 eta boAurkitua=FALSE. Horrela ziurtatzen dugu WHILE-DO kontrol-egituraren barrura sartuko garela.  



  1. iterazioan: iIndizea=1 eta boAurkitua=FALSE direlako while barrura sartu eta balioen konparaketa egiten da: arrayaren 1. elementua (22.3) eta bilatzen dugun rGakoa) desberdinak direnez iIndizea=2 eta berriro ebaluatzen da while barrura sartzea ala ez

  2. iterazioan: iIndizea=2 eta boAurkitua=FALSE direlako while barrura sartu eta balioen konparaketa egiten da: arrayaren 2. elementua (17.1) eta bilatzen dugun rGakoa), desberdinak direnez iIndizea=3 eta berriro ebaluatzen da while barrura sartzea ala ez

  3. iterazioan: iIndizea=3 eta boAurkitua=FALSE direlako while barrura sartu eta balioen konparaketa egiten da: arrayaren 3. elementua (72.9) eta bilatzen dugun rGakoa), berdinak direnez iIndizea=3 mantentzen da (emaitza izango dena) eta boAurkitua=TRUE jartzen da, eta oaingoan while aginduaren baldintza berriro ebaluatzen ez da barrura sartuko



 Adibideko 3. iterazioa bukatzean prozesu errepikakorra eteten da boAurkitua=TRUE delako eta IF-THE-ELSE bati esker funtzioak erabakitzen du zer itzuli programa nagusiari:


  • Adibidearen zenbakiekin azpiprogramak 3 itzuliko dio programa nagusiari

  • Beste zenbaki batzuekin, baliteke bilatzen ari garen nota ez egotea arrayan, kasu horretan prozesu errepikakorra eteten da iIndizea=6 izatean, eta funtzioak 0 itzuliko lioke programa nagusiari








Array bateko bilaketaren adibideak hauek izan daitezke. Non arrayaren elementuak elkarrekiko desberdinak izan daitezen, elementu berria arrayan gorde aurretik, elementu berri horri froga bat egiten zaion:





 

iruzkinik ez:

Argitaratu iruzkina