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

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.






Lehen bertsioa  (REPEAT-UNTIL)




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.








Bigarren bertsioa  (WHILE-DO)




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