2023(e)ko otsailaren 21(a), asteartea

5. astea | zenbaki edo letra sorta baten maximoa

Zenbaki osoen multzo batean zein da zenbakirik handiena?  


Hainbat zenbaki teklatuaren bitartez irakurri eta guztien artean maximoa zehaztu. Hona hemen algoritmoa:











  1. Zenbakien sorta batekin lan egingo dugu, zenbakien kopurua zehaztu

  2. Sortaren lehen zenbakia irakurri

  3. Lehen zenbaki hori maximoa da

  4. Errepikatu zenbakien sorta amaitu arte:


    • Zenbaki berria irakurri

    • Zenbaki berria orain arteko maximoa baino handiagoa bada maximoaren balioa berritu


  5. Maximoa erakutsi






Demagun iZenbakienKopurua kopuru osoa eta positiboa teklatuaren bitartez irakurriko dela, adibidez 5. Prozesu errepikakor batean 5-1=4 itzuli eman eta itzuliak kontrolatzeko k kontagailua erabili, 5-1=4 itzuliak amaitzean maximoaren balioa pantailaratu. Hau da algoritmotik eratorren taula:








































    k        iZbk   
   iMaximoa   
8 8
2 11
11
3 4 11
4 23 23
5 17 23


23




Algoritmotik programara jauzi egitean programazio-lengoaiaren elementuak aintzat hartuko dira eta jarraian baliokidean diren bi programa eskaintzen ditugu. Baliokideak izan arren bigarrena hobea da, lehen programak ez baitu algoritmoa zehatz-mehatz jarraitzen.








ZenbakiSortaBatenMaximoa_1.pas



Programa honek ez du goiko algoritmoa jarraitzen, zenbakiaren irakurketa guztiak prozesu errepikakorraren barruan egiten direlako. Horregatik iMaximoa aldagaiak hasieraketa berezi bat behar du derrigorrez:


{ Maximoaren hasieraketa berezia prozesu errepikakorra baino lehen }

program ZenbakiSortaBatenMaximoa_1 ;

uses
crt ;
var
iZenbakiKopurua, iZbk, iZenbatgarrena, iMaximoa, k : integer ;

begin
clrscr ;
writeln('Zenbaki positibo osoen sorta batean sartutako maximoa zehaztu') ;
writeln('-------------------------------------------------------------') ;
writeln ;

repeat
write('Zenbaki osoen kopuru eman: ') ;
readln(iZenbakiKopurua) ;
until iZenbakiKopurua > 0 ;

iMaximoa := 0 ; { maximoa bilatzen digulako, hasieraketa baliorik txikiena izan dadila; }
{ hori dela eta, iMaximoa 0 delako, lehen itzulian iMaximoa aldatuko da }
for k:=1 to iZenbakiKopurua do
begin
repeat
write(k, '. zenbaki positiboa eman: ') ;
readln(iZbk) ;
until iZbk > 0 ;

if iZbk > iMaximoa then { oraintxe sartutakoa handiagoa denean }
begin
iMaximoa := iZbk ;
iZenbatgarrena := k ;
writeln('Une honetan, iMaximoa=', iMaximoa, ' eta iZenbatgarrena=', iZenbatgarrena) ;
end ;
end ;

writeln ;
writeln('Maximoa ', iMaximoa, ' izan da eta sortako ', iZenbatgarrena, '. izan da') ;

repeat until keypressed ;
end.






ZenbakiSortaBatenMaximoa_2.pas



Goiko algoritmoa jarraituz, zenbakiaren lehen irakurketa prozesu errepikakorra baino lehen egiten delako iMaximoa aldagaiak hasieraketa berezerik ez du behar, iMaximoa hasiera iZbk izango delako:


{ Prozesu errepikakorra baino lehen maximoaren hasieraketa: iMaximoa:=iZbk; }

program ZenbakiSortaBatenMaximoa_2 ;

uses
crt ;
var
iZenbakiKopurua, iZbk, iZenbatgarrena, iMaximoa, k : integer ;

begin
clrscr ;
writeln('Zenbaki positibo osoen sorta batean sartutako maximoa zehaztu') ;
writeln('-------------------------------------------------------------') ;
writeln ;

repeat
write('Zenbaki osoen kopuru eman: ') ;
readln(iZenbakiKopurua) ;
until iZenbakiKopurua > 0 ;

repeat
write('Lehen zenbaki positiboa eman: ') ;
readln(iZbk) ;
until iZbk > 0 ;

iMaximoa := iZbk ; { lehen zenbakia iMaximoa da }
iZenbatgarrena := 1 ; { maximoaren posizioa 1 da }
for k:=2 to iZenbakiKopurua do
begin
repeat
write(k, '. zenbaki positiboa eman: ') ;
readln(iZbk) ;
until iZbk > 0 ;

if iZbk > iMaximoa then { oraintxe sartutakoa handiagoa denean }
begin
iMaximoa := iZbk ;
iZenbatgarrena := k ;
writeln('Une honetan, iMaximoa=', iMaximoa, ' eta iZenbatgarrena=', iZenbatgarrena) ;
end ;
end ;

writeln ;
writeln('Maximoa ', iMaximoa, ' izan da eta sortako ', iZenbatgarrena, '. izan da') ;

repeat until keypressed ;
end.






LetraSortaBatenMinimoa.pas



Zenbakiekin lan egin ordez karakterekin lan egingo bagenu, goiko algoritmoak berdin-berdin balio du. Jarraian ematen den programan ikusi larrien alfabetoko minimoa nola lortzen den:


{ Prozesu errepikakorra baino lehen minimoaren hasieraketa: cMinimoa:=cLetra; }

program LetraSortaBatenMinimoa ;

uses
crt ;
var
iLetraKopurua, iZenbatgarrena, k : integer ;
cLetra, cMinimoa : char ;

begin
clrscr ;
writeln('Larrien alfabetoko letra sorta batean sartutako minimoa zehaztu') ;
writeln('---------------------------------------------------------------') ;
writeln ;

repeat
write('Zenbat letra sartuko duzu? kopuru osoa eta positiboa eman: ') ;
readln(iLetraKopurua) ;
until iLetraKopurua > 0 ;

repeat
write('Lehen letra eman: ') ;
readln(cLetra) ;
cLetra := upcase(cLetra) ;
until (cLetra >= 'A') and (cLetra <= 'Z') ;

cMinimoa := cLetra ; { lehen letra cMinimoa da }
iZenbatgarrena := 1 ; { minimoaren posizioa 1 da }
for k:=2 to iLetraKopurua do
begin
repeat
write(k, '. letra eman: ') ;
readln(cLetra) ;
cLetra := upcase(cLetra) ;
until (cLetra >= 'A') and (cLetra <= 'Z') ;

if cLetra < cMinimoa then { oraintxe sartutakoa txikiagoa denean }
begin
cMinimoa := cLetra ;
iZenbatgarrena := k ;
writeln('Une honetan, cMinimoa=', cMinimoa, ' eta iZenbatgarrena=', iZenbatgarrena) ;
end ;
end ;

writeln ;
writeln('Minimoa ', cMinimoa, ' izan da eta sortako ', iZenbatgarrena, '. izan da') ;

repeat until keypressed ;
end.




Hauxe da programa horren balizko irteera bat:










Programaren aurreko irteeraren taula hauxe da:













































   k       cLetra   
   cMinimoa   
W W
2 K K
3 P K
4 G G
5 H G
6 M G


G



 



iruzkinik ez:

Argitaratu iruzkina