2024(e)ko martxoaren 18(a), astelehena

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

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