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:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{ 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:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{ 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:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{ 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