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

9. astea | bilaketa sekuentzialaren aplikazio bat


Demagun zenbaki errealak gordetzen dituen array bat bete behar dugula, baina arrayaren datuak ezin direla errepikaturik egon. Hori dela eta, teklatuz irakurritako datu bat arrayean gorde baino lehen datuaren bilaketa egin beharko da dagoeneko arrayean ez dagoela frogatze aldera.

Ariketaren bi bertsio erakutsiko ditugu. Batean bilaketa repeat-until egituraren bitartez gauzatzen da. Bigarrenean berriz, bilaketa egiteko while-do egitura erabiltzen da.


rZbk elementu berria arrayean iIndizea posizioan gorde aurretik, froga hau egiten zaio: arraya arakatu BEHEMUGA eta iIndizea-1 artean rZbk elementua bilatuz. Hona hemen programaren zatirik garrantzitsuenaren kodea:

function fniBilaketaLineala (const arNotak: tarZerrenda;
                                   iZenbat: integer;
                                      rZbk: real): integer ;
var
   k: integer ;
begin
   k := 0 ;                    { 0 gezurrezko posizioa litzateke, ikusi BEHEMUGA = 1 dela }
   repeat
      k := k + 1 ;
   until (arNotak[k] = rZbk) or (k = iZenbat) ;

   if arNotak[k] = rZbk then
      fniBilaketaLineala := k
   else
      fniBilaketaLineala := 0 ;          { 0 gezurrezko posizioa litzateke }
end ;


procedure ArrayaDesberdinekinBete(var arNotak:tarZerrenda; iLuzera:integer) ;
var
   iIndizea, iPosizioa: integer ;
   rZbk: real ;
begin
   write('Eman arrayaren ', BEHEMUGA, '. datua: ') ;
   readln(arNotak[BEHEMUGA]) ;           (* Lehen datua beti izango da berria *)
   for iIndizea:=BEHEMUGA+1 to iLuzera do
   begin
      repeat
         write('Eman arrayaren ', iIndizea, '. datua: ') ;
         readln(rZbk) ;

         iPosizioa := fniBilaketaLineala(arNotak, iIndizea-1, rZbk) ;     { bilaketa burutu }

         if iPosizioa <> 0 then
            writeln(rZbk:0:2, ' balioa ', iPosizioa, '. posizioan dago, beste balio bat aukeratu.')
         else
            arNotak[iIndizea] := rZbk ;
      until iPosizioa = 0 ;
   end ;
end ;
Programa nagusia hau delarik:
{ ---------------------- PROGRAMA NAGUSIA ---------------------- }

var
   arNotak: tarZerrenda ;
   iLuzera: integer ;
begin
   repeat
      write('Zenbat elementu izango dira (', BEHEMUGA, ' eta ', GOIMUGA, ' arteko balioa): ') ;
      readln(iLuzera) ;
   until (iLuzera >= BEHEMUGA) and (iLuzera <= GOIMUGA) ;

   ArrayaDesberdinekinBete(arNotak, iLuzera) ;
   ArrayaIkusi(arNotak, iLuzera) ;

   readln ;
end.
Aipatzekoa da iLuzera programa nagusian irakurtzen dela eta horregatik parametro hori sarrerakoa dela bi prozeduretan, bai ArrayaDesberdinekinBete prozeduran eta bai ArrayaIkusi prozeduran.


Lehen bezala orain ere, rZbk elementu berria arrayean iIndizea posizioan gorde aurretik, froga hau egiten zaio: arraya arakatu BEHEMUGA eta iIndizea-1 artean rZbk elementua bilatuz. Hona hemen programaren zatirik garrantzitsuenaren kodea, non ArrayaDesberdinekinBete prozedura berdina den bertsio bietan:

function fniBilaketaLineala (const arNotak: tarZerrenda;
                                   iZenbat: integer;
                                      rZbk: real): integer ;
var
   iIndizea : integer ;
   boAurkitua : boolean ;
begin
   iIndizea := BEHEMUGA ;
   boAurkitua := FALSE ;
   while (iIndizea <= iZenbat) and not boAurkitua do
   begin
      if arNotak[iIndizea] = rZbk then
         boAurkitua := TRUE
      else
         iIndizea := iIndizea + 1 ;
   end ;

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


procedure ArrayaDesberdinekinBete(var arNotak:tarZerrenda; iLuzera:integer) ;
var
   iIndizea, iPosizioa: integer ;
   rZbk: real ;
begin
   write('Eman arrayaren ', BEHEMUGA, '. datua: ') ;
   readln(arNotak[BEHEMUGA]) ;           (* Lehen datua beti izango da berria *)
   for iIndizea:=BEHEMUGA+1 to iLuzera do
   begin
      repeat
         write('Eman arrayaren ', iIndizea, '. datua: ') ;
         readln(rZbk) ;

         iPosizioa := fniBilaketaLineala(arNotak, iIndizea-1, rZbk) ;     { bilaketa burutu }

         if iPosizioa <> 0 then
            writeln(rZbk:0:2, ' balioa ', iPosizioa, '. posizioan dago, beste balio bat aukeratu.')
         else
            arNotak[iIndizea] := rZbk ;
      until iPosizioa = 0 ;
   end ;
end ;
Programa nagusia ere, berdin-berdina da bertsio bietan:
{ ---------------------- PROGRAMA NAGUSIA ---------------------- }

var
   arNotak: tarZerrenda ;
   iLuzera: integer ;
begin
   repeat
      write('Zenbat elementu izango dira (', BEHEMUGA, ' eta ', GOIMUGA, ' arteko balioa): ') ;
      readln(iLuzera) ;
   until (iLuzera >= BEHEMUGA) and (iLuzera <= GOIMUGA) ;

   ArrayaDesberdinekinBete(arNotak, iLuzera) ;
   ArrayaIkusi(arNotak, iLuzera) ;

   readln ;
end.
 

iruzkinik ez:

Argitaratu iruzkina

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