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

18. Ariketa: zerrendak (I)

ZER DAKIDAN:
Zenbakiak, karaktereak eta kateak lantzeko gai naiz.



ZER IKASIKO DUDAN:
Oinarrizko datu-mota bateko balioak zerrendetan antolatzen eta gordetzen ikasiko dut. Horretarako Array datu-mota funtsezkoa da. Array datu-motako aldagai batek bere elementuak elkar ondoan kokatzen ditu memorian eta elementu bakoitzari erreferentzia egiteko indize bat erabiltzen da.




ESKATZEN DEN PROGRAMA (I) 

Karaktereekin lan eginez, 1 eta 10 arteko karaktereen zerrenda bat lortu nahi da. Baina, zerrendan ez da onartuko karaktere errepikaturik.

Gure programak lehenik zenbat karaktere gordeko dituen galdetuko du. Ondoren karaktereak banan banan teklatuz irakurriko ditu programak. Karaktere bat irakurtzean zerrendan gorde aurretik, konprobatu beharko da lehendik ez dagoela.

Hauxe da ariketaren programa:
{ 18. ariketa: hainbat karakteren zerrenda osatu ondoko baldintzekin: }
{     - Karakteren kopurua 1 eta 10 artekoa izango da                 }
{     - Karakatereak ez dira errepikatuko zerrendan                   }

program Ariketa_18_I ;

const
   BEHEMUGA = 1 ;
   GOIMUGA = 10 ;
type
   tacZerrenda = array[BEHEMUGA..GOIMUGA] of char ;


{ Bilaketa gauzatzeko funtzioan while-DO egitura erabiltzen da }
function fniDatuaZerrendanBilatu(const acLetrak: tacZerrenda; iZenbat: integer; cKarak: char): integer ;
var
   iIndizea : integer ;
   boAurkitua : boolean ;
begin
   iIndizea := BEHEMUGA ;
   boAurkitua := FALSE ;
   while (iIndizea <= iZenbat) and not boAurkitua do
   begin
      if acLetrak[iIndizea] = cKarak then
         boAurkitua := TRUE
      else
         iIndizea := iIndizea + 1 ;
   end ;

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


procedure ZerrendaDatuDesberdinekinBete(var acLetrak: tacZerrenda; iLuzera: integer) ;
var
   iIndizea, iPosizioa: integer ;
   cKarak: char ;
begin
   write('   Eman zerrendaren ', BEHEMUGA, '. datua: ') ;
   readln(acLetrak[BEHEMUGA]) ;           (* Lehen datua beti izango da berria *)
   for iIndizea:=BEHEMUGA+1 to iLuzera do
   begin
      repeat
         write('   Eman zerrendaren ', iIndizea, '. datua: ') ;
         readln(cKarak) ;
         cKarak := upcase(cKarak) ;

         iPosizioa := fniDatuaZerrendanBilatu(acLetrak, iIndizea-1, cKarak) ;

         if iPosizioa <> 0 then
            writeln(cKarak:9, ' balioa ', iPosizioa, '. posizioan dago, beste balio bat aukeratu.')
         else
            acLetrak[iIndizea] := cKarak ;
      until iPosizioa = 0 ;
   end ;
end ;


procedure ZerrendarenEdukiaIkusi(const acLetrak: tacZerrenda; iLuzera: integer) ;
var
   iIndizea: integer ;
begin
   writeln('   Zerrendaren edukia: ') ;
   for iIndizea:=BEHEMUGA to iLuzera do
   begin
      writeln(iIndizea:4, '. karakterea = ', acLetrak[iIndizea]) ;
   end ;
   writeln ;
end ;

{ ---------------------- PROGRAMA NAGUSIA ---------------------- }

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

   writeln ;
   ZerrendaDatuDesberdinekinBete(acLetrak, iLuzera) ;
   
   writeln ;
   ZerrendarenEdukiaIkusi(acLetrak, iLuzera) ;

   readln ;
end.

Programaren balizko exekuzio bat hurrrengo irudian erakusten da:





ESKATZEN DEN PROGRAMA (II) 

Aurreko programaren aldaera bat: Karaktereekin lan egin ordez kateekin lan egin daiteke, hots, autoen matrikulak jaso daitezke zerrenda batean matrikula errepikatuak onartu gabe.

Gure programak lehenik zenbat matrikula gordeko dituen galdetuko du. Ondoren matrikulak banan banan teklatuz irakurriko ditu programak. Matrikula bat irakurtzean zerrendan gorde aurretik, konprobatu beharko da lehendik ez dagoela.

Hauxe da programaren aldaerak zerrendarako definituko duen datu-mota:
{ 18. ariketa: hainbat matrikulen zerrenda osatu ondoko baldintzekin: }
{     - Matrikulen kopurua 1 eta 10 artekoa izango da                 }
{     - Matrikulak ez dira errepikatuko zerrendan                     }

program Ariketa_18_II ;

const
   BEHEMUGA = 1 ;
   GOIMUGA = 10 ;
type
   tsMatrikula = string[8] ;
   tasZerrenda = array[BEHEMUGA..GOIMUGA] of tsMatrikula ;
...   







 

2024(e)ko martxoaren 8(a), ostirala

17. Ariketa: karaktere-kateak (II)

ZER DAKIDAN:
Zenbakiak eta karaktereak lantzeko gai naiz.



ZER IKASIKO DUDAN:
Esaldiak prozesatzen, karaktere-kateak prozesatzen, ikasiko dut. Horretarako string datu-mota funtsezkoa da. Karaktere-kate baten edukia lantzen ikasiko dut.




ESKATZEN DEN PROGRAMA

Demagun gure sistema informatikoan gordeko ditugun ibilgailuen matrikulak, 1234-XYZ itxurako kateak direla. Non, lehen 4 karaktereak digituak diren, ondoren - sinboloa datorren, eta, bukatzeko, alfabetoko 3 letra dauden (A-tik Z bitarteko letra larriak).

Gure programan karaktere-kate bat teklatuz irakurriko dugu eta emandako datua matrikula bat ez bada, programak adieraziko digu akatsa non gertatu den zehaztuz. Hauxe da programaren balizko irteera bat:


Ikusten den bezala, aurreko adibidean matrikula teklatuaren bitartez irakurtzean A bokala sartu da, gogoratu zenbait estatutan ez dela bokalik onartzen ibilgailuen matrikuletan.







 

16. Ariketa: karaktere-kateak (I)

ZER DAKIDAN:
Zenbakiak eta karaktereak lantzeko gai naiz.



ZER IKASIKO DUDAN:
Esaldiak prozesatzen (karaktere-kateak prozesatzen) ikasiko dut. Horretarako string datu-mota funtsezkoa da. Karaktere-kateak elkar konparatzen ikasiko dut.




SARRERA

Ibilgailu baten matrikulak formatu asko jarrai ditzake. Esate baterako, hauek dira Europako matrikulen formatuak 2021. urtean:


Ariketa larregi ez konplikatzearren, ibilgailu guztien matrikulak 8 karaktereko kateak izango direla suposatuko dugu. Ondorioz, matrikula bat gordetzen duen karaktere-katearen barne antolaketa honako hau izango dela onartuko dugu:

ZifraZifraZifraZifra
Marratxoa
LetraLetraLetra (*)
1234
-
KZW
(*) letretan bokalik ez da onartzen




ESKATZEN DEN PROGRAMA

Ibilgailu baten matrikula 8 karaktereko kate batean jasotzen da. Bi ibilgailuen matrikulak teklatuz irakurri ondoren, pantailan adierazi zein kate den bestea baino handiagoa. Hauxe da programa:
{     Matrikula bat teklatuz irakurri, beste matrikula bat irakurri   }
{     eta matrikulak elkarrekiko alderatu ondoren informazioa eman.   }

program Ariketa_16 ;
 
const
   iMAX = 8 ;
type
   tsKatea = string[iMAX] ;

var
   sMatrikula1, sMatrikula2 : tsKatea ;
begin
   writeln ;
   writeln ;
   writeln ;
   writeln ;
   
   writeln('   Bi matrikula artean, zein da handiena?') ;
   writeln ;
     
   write('      Lehen matrikula idatzi: ') ;
   readln(sMatrikula1) ;
     
   write('   Bigarren matrikula idatzi: ') ;
   readln(sMatrikula2) ;
   writeln ;
     
   if sMatrikula1 < sMatrikula2 then
      writeln('   ''', sMatrikula1, ''' txikiagoa da ', '''', sMatrikula2, ''' baino') ;

   if sMatrikula1 > sMatrikula2 then
      writeln('   ''', sMatrikula1, ''' handiagoa da ', '''', sMatrikula2, ''' baino') ;

   if sMatrikula1 = sMatrikula2 then
      writeln('   ''', sMatrikula1, ''' eta ', '''', sMatrikula2, ''' berdinak dira') ;

  writeln ;
  readln ;
end.

Eta hauek dira programaren balizko bost irteera:






Aurreko adibideetan ikusten da matrikulak teklatuaren bitartez irakurtzean bokalak sartu direla, zenbait estatutan ez da bokalik onartzen ibilgailuen matrikuletan.







 

2024(e)ko otsailaren 28(a), asteazkena

15. Ariketa: azpiprogramak (III)

ZER DAKIDAN:
Ariketa bati dagokion kodifikazioa programa monolitiko batean idazteko gai naiz eta programa moduluetan zatitzeko gai naiz.



ZER IKASIKO DUDAN:
Programa bat zatitzen ikasiko dut moduluak sortuz, modulu horiek azpiprogramak deitzen dira eta bi motatakoak izan daitezke: funtzioak edo prozedurak. Ikas dezagun noiz erabili funtzioa eta noiz prozedura.




ESKATZEN DEN PROGRAMA

Zirkunzentro: Poligono batera zirkunskribatua dagoen zirkunferentziaren zentroa. Poligonoa triangelua bada, hiru erdibitzaileek elkar ebakitzen duten puntua da zirkunzentroa.

Triangeluaren zirkunzentroa eta zirkunferentzia zirkunskribatua

Triangeluaren zirkunzentroa non kokatzen den triangeluak dituen angeluen araberakoa da. Horrela, triangelu angeluzuzena bada zirkunzentroa triangeluaren hipotenusaren gainean kokatzen da, baina angelu kamutsa badu zirkunzentroa triangelutik kanpo geratzen da eta triangeluaren barruan angelu zorrotzak baditu.

Zirkunzentroaren kokapena triangeluarekiko

   TRIANGELUAREN HIRU ERPINAK:
  • A puntua eta B puntua segmentu horizontal batean daude    
  • A puntua eta B puntua ez dira bat
  • C puntua ez dago AB segmentu horizontalean
  • AC segmentua ez da bertikala
  • BC segmentua ez da bertikala

Goiko baldintzak betetzen dituzten triangeluaren hiru erpinen rAx, rAy, rBx, rBy, rCx eta rCy koordenatuak datutzat emanik, zirkunferentzia zirkunskribatuaren rR erradioa kalkulatu ondoko formula erabiliz:
Non a, b eta c triangeluaren aldeak diren eta S azalera den

Horregatik, triangeluaren rA, rB eta rC aldeen luzerak eta rS azalera kalkulatu behar dira. Aldeak lortzeko pitagoras aplikatuko dugu funtzio baten bitartez, eta S azalera eskuratzeko ondoko formula barneratzen duen funtzioa idatziko dugu:

S = 1/2(rAx·rBy + rBx·rCy + rCx·rAy - rCx·rBy - rBx·rAy - rAx·rCy)

Zirkunferentziaren erradioa zehaztu ondoren, zirkunferentziaren Z zentroa kalkulatuko dugu, hots, rZx eta rZy koordenatuak kalkulatuko ditugu. Horretarako, komenigarria izango da 3. astea | triangeluaren azalera ariketa birpasatzea, non zuzen bat adierazteko malda-desplazamendua bikotea erabiltzen den. Dagokigun ariketa honetan AC eta BC segmentuen maldak eta desplazamenduak eskuratzen dira, eta horiei esker AC eta BC segmentu biren ebakidura (rZx, rZy) puntuaren koordenatuak kalkulatzen dira.
Irudiko P puntua, ariketa honetan bilatzen den Z zentroa litzateke

Zirkunferentziaren erradioa eta zentroa ezagunak direla, frogatzerik dago zirkunferentzia horrek triangelua zirkunskribatzen duen, horretarako hiru erpinek zirkunferentziaren formula bete beharko dute. Hauxe da ariketaren programa nagusia eta azpiprogramen goiburuak:
{ 15. ariketa: A, B eta C erpinez triangelua definitu (6 koordenatu). }

{     AB aldea horizontala izango da eta ABC triangeluari dagokion    }
{     zirkunferentzia zirkunskribatuaren R erradioa kalkulatu.        }
{     ABC triangeluari dagokion zirkunferentzia zirkunskribatuaren Z  }
{     zentroaren bi koordenatuak Zx eta Zy kalkulatu.                 }

{     Datuak hiru erpinen koordenatuak dira eta prozedura batean      }
{     hartzen dira, adibidez: (0.0, 0.0), (4.0, 0.0) eta (2.0, 2.0)   }
      
program Ariketa__15 ;

{ Eskatzen diren azpiprogramak hemen idatzi:           }

{   - ErpinakEskuratu                  prozedura (irteerako 6 parametro)    }
{   - fnrAldeaLortu                     funtzioa (sarrerako 4 parametro)    }
{   - fnrAzaleraLortu                   funtzioa (sarrerako 6 parametro)    }
{   - fnrErradioaLortu                  funtzioa (sarrerako 4 parametro)    }
{   - fnrZuzenarenMalda                 funtzioa (sarrerako 4 parametro)    }
{   - SegmentuarenErdia                prozedura (sarrerako 4 parametro,    }
{                                                 irteerako 2 parametro)    }
{   - ZentroaKalkulatu                 prozedura (sarrerako 4 parametro,    }
{                                                 irteerako 2 parametro)    }
{   - fnboErpinaZirkunferentzianDago    funtzioa (sarrerako 5 parametro)    }

{ ---------------------------Programaren Nagusia--------------------------- }    
                             
var
   rAx, rAy, rBx, rBy, rCx, rCy, rZx, rZy : real ;        { koordenatuak }
   rErdiaACx, rErdiaACy, rErdiaBCx, rErdiaBCy  : real ;   { koordenatuak }
   rA, rB, rC, rR : real ;                                { distantziak }
   rS : real ;                                            { azalera }
   rMaldaAC, rPerpendikularraAC : real ;                  { maldak }
   rMaldaBC, rPerpendikularraBC : real ;                  { maldak }
   rDesplazamendu1 : real ;                               { distantzia }
   rDesplazamendu2 : real ;                               { distantzia }
begin
   writeln ;
   writeln ;
   writeln ;
   writeln ;
   
   { triangeluaren hiru erpinak irakurri }
   ErpinakEskuratu(rAx, rAy, rBx, rBy, rCx, rCy) ;
   
   writeln ; 
   
   { triangeluaren hiru aldeak lortu }
   rA := fnrAldeaLortu(rBx, rBy, rCx, rCy) ;   { BC segmentuaren luzera lortu }
   rB := fnrAldeaLortu(rAx, rAy, rCx, rCy) ;   { AC segmentuaren luzera lortu }
   rC := fnrAldeaLortu(rAx, rAy, rBx, rBy) ;   { AB segmentuaren luzera lortu }
      
   writeln('   BC aldea, rA = ', rA:0:2, ' m') ;   { BC aldearen luzera erakutsi }
   writeln('   AC aldea, rB = ', rB:0:2, ' m') ;   { AC aldearen luzera erakutsi }
   writeln('   AB aldea, rC = ', rC:0:2, ' m') ;   { AB aldearen luzera erakutsi }
   
   { triangeluaren azalera kalkulatu erpinak ezagunak izatean }
   rS := fnrAzaleraLortu(rAx, rAy, rBx, rBy, rCx, rCy) ;
    
   writeln('   rS azal. = ', rS:0:3, ' m^2') ;
   writeln ;
   
   { erradioa kalkulatzeko formula: (rA·rB·rC)/(4·rS) }
   rR := fnrErradioaLortu(rA, rB, rC, rS) ; 

   writeln('   rR erra. = ', rR:0:3, ' m') ;
   writeln ;   
   
   { AC perpendikularraren malda } 
   rMaldaAC := fnrZuzenarenMalda(rAx, rAy, rCx, rCy) ;
   writeln('   AC malda = ', rMaldaAC:0:2) ;
   rPerpendikularraAC := -(1/rMaldaAC) ;
   writeln('   AC perp. = ', rPerpendikularraAC:0:2) ;
   
   { AC perpendikularren zuzenak duen desplazamendua } 
   SegmentuarenErdia(rAx, rAy, rCx, rCy, rErdiaACx, rErdiaACy) ;                 
   writeln('   AC erdia = (', rErdiaACx:0:2, ', ', rErdiaACy:0:2, ')') ;     
   rDesplazamendu1 := rErdiaACy + rErdiaACx/rMaldaAC ;
   writeln('   Desplaz1 = ', rDesplazamendu1:0:2, ' m') ;
   writeln ;

   { BC perpendikularraren malda }
   rMaldaBC := fnrZuzenarenMalda(rBx, rBy, rCx, rCy) ;
   writeln('   BC malda = ', rMaldaBC:0:2) ;
   rPerpendikularraBC := -(1/rMaldaBC) ;
   writeln('   BC perp. = ', rPerpendikularraBC:0:2) ;
   
   { BC perpendikularren zuzenak duen desplazamendua }
   SegmentuarenErdia(rBx, rBy, rCx, rCy, rErdiaBCx, rErdiaBCy) ;       
   writeln('   BC erdia = (', rErdiaBCx:0:2, ', ', rErdiaBCy:0:2, ')') ;
   rDesplazamendu2 := rErdiaBCy + rErdiaBCx/rMaldaBC ;
   writeln('   Desplaz2 = ', rDesplazamendu2:0:2, ' m') ;
   writeln ;   
   
   { Zentroa bi zuzen perpendikularren arteko ebakidura izango da } 
   { Zuzen z1:   m1 = rPerpendikularraAC | d1 = rDesplazamendu1   }
   { Zuzen z2:   m2 = rPerpendikularraBC | d2 = rDesplazamendu2   }

   { Zuzen z1:   rZy = m1·rZx + d1      }
   { Zuzen z2:   rZy = m2·rZx + d2      }
   
   { m1·rZx + d1 = m2·rZx + d2  ==>  rZx = (d1 - d2) / (-m1 + m2)          }
   {         rZy = m1·rZx + d1  ==>  rZy = m1·(d1 - d2) / (-m1 + m2) + d1  }
   
   { rZx = (d1 - d2) / (-m1 + m2)       }
   { rZy = (m2·d1 - m1·d2) / (-m1 + m2) }
   
   ZentroaKalkulatu(rPerpendikularraAC, rPerpendikularraBC, rDesplazamendu1, rDesplazamendu2, rZx, rZy) ;
  
   writeln('   Z zentr. = (', rZx:0:2, ', ', rZy:0:2, ')') ;
   writeln ;
   writeln ;
        
   writeln('   (x - rZx)^2 + (y - rZy)^2 - rR^2  <  0.000001') ;
   
   if fnboErpinaZirkunferentzianDago(rZx, rZy, rR, rAx, rAy) then
      writeln('   (', rAx:0:2, ', ', rAy:0:2, ') erpina zirkunferentzian dago')
   else
      writeln('   Errorea A erpinean') ;
   if fnboErpinaZirkunferentzianDago(rZx, rZy, rR, rBx, rBy) then
      writeln('   (', rBx:0:2, ', ', rBy:0:2, ') erpina zirkunferentzian dago')
   else
      writeln('   Errorea B erpinean') ;
   if fnboErpinaZirkunferentzianDago(rZx, rZy, rR, rCx, rCy) then
      writeln('   (', rCx:0:2, ', ', rCy:0:2, ') erpina zirkunferentzian dago')
   else
      writeln('   Errorea C erpinean') ;
         
   writeln ;
   readln ;
end.            { Programaren amaiera }

Programaren balizko exekuzio bat hurrrengo irudian erakusten da:






  •  Emaitza laster... 

 

14. Ariketa: azpiprogramak (II)

ZER DAKIDAN:
Menu bat programa batean nola egiten den badakit.



ZER IKASIKO DUDAN:
Menu bat funtzio batean kodetu eta programa nagusitik deiak egiten ikasiko dut.


Ariketa hauek gogora ekarri eta ariketa guztiak programa bakar batean bildu:

Programa berria modulutan antolatzeko funtzioak eta prozedurak erabili. Programa berriaren exekuzioa gidatzeko menu honetaz baliatu:
   ====================================Menua====================================
     A  Mendi baten altuera emanik zeruertzaren distantzia lortu
     B  Dado bat 5 aldiz jaurti ondoren balio minimoa eta maximoa pantailaratu
     C  Koordenatuak formatuz aldatu: Hirurogeitatarretik dezimalera
     D  Koordenatuak formatuz aldatu: Dezimaletik hirurogeitatarrera
      
     I  Programatik irten
   =============================================================================

Baina, menu horren aukeraren hautapena funtzio batean egin dadila. Hau da, programa nagusian fncMenua funzioari deia egingo zaio, eta fncMenua funtzio barruan aukeren deskribapenak erakutsi ondoren, erabiltzailaren hautapena teklatuz jasoko da eta balio hori funtzioak programa nagusiari itzuliko dio.

Programa nagusiak itxura hau izango du:
      begin
        repeat
           cAukera := fncMenua ;

           case cAukera of
              'A': begin
                      (* A  Mendi baten altuera eman eta zeruertzaren distantzia lortu *)
                   end ;
              'B': begin
                      (* B  Dado bat 5 aldiz jaurti ondoren balio minimoa eta maximoa pantailaratu *)
                   end ;
              'C': begin
                      (* C  Koordenatuak formatuz aldatu: Hirurogeitatarretik dezimalera *)
                   end ;
              'D': begin
                      (* D  Koordenatuak formatuz aldatu: Dezimaletik hirurogeitatarrera *)
                   end ;
           end ;

           if cAukera <> 'I' then
           begin
              cItxaron := readkey ;
              writeln(cItxaron) ;
           end ;

           clrscr ;
        until cAukera = 'I' ;
      end.

Hona hemen programaren balizko exekuzio bat:








 

13. Ariketa: azpiprogramak (I)




Leonardo Pisano (Pisa, Italia, 1170-1250), Leonardo Bonacci, Leonardo Fibonacci edo Fibonacci moduan ezaguna, Italiar matematikaria izan zen, Erdi Aroko ezagunetarikoa. Ezaguna da batez ere bi aurkikuntzengatik:

  • Hindu-arabiar zenbaki sistema Europan sartu zuen eta berau erabiltzeko bideak jarri zituen XIII. mendeko "Liber Abaci" liburuaren bitartez
  • Fibonacciren zenbakiak deskribatu zituen liburu berean, nahiz eta berak ez zituen aurkitu baizik eta adibide moduan jarri
Leonardo Pisano, Fibonacci, ezagutzeko hemen duzu artikulu bat Fibonacci, el matemático que se puso a contar conejos y descubrió la secuencia divina.


Fibonacciren sekuentziako lehen zenbakia 0 da, Fibonacci-ren bigarren zenbakia 1 da, eta hirugarren zenbakia lortzeko aurreko biak batuko dira, horregatik Fibonacciren hirugarren zenbakia 1 da, laugarren zenbakia 2 izango da, bosgarrena 3, ... 
Beraz, Fibonacciren sekuentzia honako hau da:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...

Fibonacciren zenbakiak grafikoki adieraztean honako blokeen sorta eta espirala lortzen dira:




Fibonacciren sekuentziako bi zenbaki hartuz eta zatiketa eginez, urrezko zenbakia edo jainkozko proportzioa edo urrezko proportzioa edo zerutiar zenbakia lortzen da:

Fibonacciren sekuentzia sarritan agertzen da naturan. Izan ere, naturan hazkundea gertatzen denean Fibonacciren sekuentziaren arabera ematen da:

     

     

     







Eskatzen den programa (prozedura bat eta funtzio bat)

Programa bakarra izan arren programak bi zati izango ditu. Lehen zatian prozedura bati dei egingo zaio eta programaren bigarren zatian funtzio bati dei egingo zaio.

Programaren prozedura eta programaren funtzioa jarraian deskribatzen dira eta bakoitzaren kode gehiena ematen da. Ikaslearen lana da kodeak bukatzea eta programaren emaitzak ulertzea.



Lehen zatia. Fibonacciren sekuentzia osatuko duten zenbakien iZenbat kopurua teklatuz irakurri programa nagusian eta prozedura batek ondoko taularen pantailaraketa egin dezala FOR-DO egitura bat erabiliz, FibonaccirenSekuentziaPantailaratu izeneko prozeduraren barruan errepikatzen den prozesua hau delarik:
   procedure FibonaccirenSekuentziaPantailaratu(iZenbat: integer) ;

      ...
   
   begin { prozeduraren kodea hemen hasten da }

      ...
      
      for k:=3 to iZenbat do
      begin
         iFibo3 := iFibo1 + iFibo2 ;
         iIndizea := iIndizea + 1 ;
         writeln(iIndizea:15, iFibo3:15, 1.0*iFibo3/iFibo2:25:7) ;
      
         iFibo1 := iFibo2 ;
         iFibo2 := iFibo3 ;
      end ; 

      ...
      
   end ; { prozeduraren kodea hemen amaitzen da }      

Programaren lehen zatiko irteera bat hau izan daiteke:




Bigarren zatia. Prozesu errepikakor bat izango da eta bertatik irteteko b edo B erantzun beharko da, bestela programa nagusian iMuga teklatuz irakurriko da eta funtzio batek kalkulatuko du 0-tik hasita zenbat Fibonacciren zenbaki dauden. Horretarako, WHILE-DO egitura bat erabiliko da, funtzio barruko prozesu errepikakorra hauxe da, non funtzioak itzuli behar duen emaitza iFiboKopuru den eta arrazoi horregatik balio hori kanporatu behar du fniFibonacciZenbakienKopuruaKalkulatu izeneko funtzioak:
   function fniFibonacciZenbakienKopuruaKalkulatu(iMuga: integer): integer ;

      ...
   
   begin { funtzioaren kodea hemen hasten da }

      ...
      
      iFibo1 := 0 ;
      iFibo2 := 1 ;
      iFibo3 := iFibo1 + iFibo2 ;

      while iFibo3 <= iMuga do
      begin
         iFibo1 := iFibo2 ;
         iFibo2 := iFibo3 ;
         iFibo3 := iFibo1 + iFibo2 ;
         iFiboKopuru := iFiboKopuru + 1 ;
      end ;
   
      fniFibonacciZenbakienKopuruaKalkulatu := iFiboKopuru ;
   end ; { funtzioaren kodea hemen amaitzen da }

Programaren bigarren zatiko irteera bat hau izan daiteke:







 

12. Ariketa: hainbat aukeren menu bat

ZER DAKIDAN:
CASE-OF baldintzazko egitura ikasi nuen aukera anitzak antolatzeko.



ZER IKASIKO DUDAN:
Menu bat programa batean nola egiten den ikasiko dut, erabiltzaileak gogoko duen hautapena CHAR datu-motako aldagai batean irakurriko dut. Bide batez clrscr prozedura ikasiko dut ere.


6. Ariketa: aukera anitzen arteko hautapena artikulua gogora ekarriz, programaren fluxua bideratzeko CASE-OF agindua erabilten da aukerak hiru edo gehiago direnean.

Jarraian erakusten den menua programa nagusian kokaturik dago, baina jakin ezazu hori horrela ez dela egingo behin azpiprogramen kontzeptua gureganatuko dugunetik aurrera.

Algoritmoa:
  1. Programa osoa prozesu errepikakor bat da, eta errepikapenak mozteko menuaren aukera egokia hautatu behar da (adibidean A balioa)
  2. Begiztaren iterazio bakoitzeko, pantaila garbitu clrscr prozeduraren bitartez eta bost aukeren deskribapenak erakutsi
  3. Begiztaren iterazio bakoitzeko, CHAR datu-motako cAukera aldagaiari balioa teklatuz eman era kontrolatuan (teklatuaren karaktere bat irakurtzeko readkey funtzioa oso egokia da)
  4. Irakurri den karaktere horren arabera CASE-OF egiturak kudeatuko du programaren fluxoa eta aukera horri dagozkion kalkuluak burutuko dira
  5. Begiztaren iterazio bakoitzeko, programaren exekuzioa gelditu readkey funtzioaren bitartez tekla bat sakatu arte, horrela kalkuluen emaitzak ikusi ahal izango dira
clrscr prozedura estandarra eta readkey funtzio estandarra erabili ahal izateko, beharrezkoa da crt unitatea dekalaratzea uses blokean.



ESKATZEN DEN PROGRAMA

Programa honek goiko algoritmoa aplikatzen du:

{ Aukera modu kontrolatuan irakurtzen delako case-OF aginduak ez du else kasurik behar }
program Ariketa_12 ;
uses
   crt ;   (* clrscr prozedura eta readkey funtzioa erabiltzeko *)
var
   cAukera, cItxoin : char ;
   rEragigai1, rEragigai2 : real ;
begin
   repeat
      clrscr ;
      writeln ('============Menua============') ;
      writeln ('  +   Batura lortzeko') ;
      writeln ('  -   Kendura lortzeko') ;
      writeln ('  *   Biderkadura lortzeko') ;
      writeln ('  /   Zatiketa burutzeko') ;
      writeln ('  A   Programa amaitu') ;
      writeln ('=============================') ;
      repeat
         write ('          Zure aukera: ') ;
         cAukera := readkey ;
         cAukera := upcase(cAukera) ;
         writeln (cAukera) ;    (* readkey funtzioak ez du irakurritako tekla erakusten *)
      until (cAukera ='+') or (cAukera ='-') or (cAukera ='*') or (cAukera ='X') or (cAukera ='/') or (cAukera ='A') ;
      writeln ;
      case cAukera of
         '+' : begin
                  write ('Zenbaki errealekin lan eginez, lehenengo batugaiaren balioa eman: ') ;
                  readln (rEragigai1) ;
                  write ('Zenbaki errealekin lan eginez, bigarren batugigaiaren balioa eman: ') ;
                  readln (rEragigai2) ;
                  writeln (rEragigai1:0:2, ' + ', rEragigai2:0:2, ' = ', rEragigai1+rEragigai2:0:2) ;
               end ;
         '-' : begin
                  write ('Zenbaki errealekin lan eginez, kenkizunaaren balioa eman: ') ;
                  readln (rEragigai1) ;
                  write ('Zenbaki errealekin lan eginez, kentzailearen balioa eman: ') ;
                  readln (rEragigai2) ;
                  writeln (rEragigai1:0:2, ' - ', rEragigai2:0:2, ' = ', rEragigai1-rEragigai2:0:2) ;
               end ;
         '*','X' : begin
                      write ('Zenbaki errealekin lan eginez, lehenengo biderkagaiaren balioa eman: ') ;
                      readln (rEragigai1) ;
                      write ('Zenbaki errealekin lan eginez, bigarren biderkagaiaren balioa eman: ') ;
                      readln (rEragigai2) ;
                      writeln (rEragigai1:0:2, ' * ', rEragigai2:0:2, ' = ', rEragigai1*rEragigai2:0:2) ;
                   end ;
         '/' : begin
                  write ('Zenbaki errealekin lan eginez, zatikizunaren balioa eman: ') ;
                  readln (rEragigai1) ;
                  repeat
                     write ('Zenbaki errealekin lan eginez, zatitzailearen balioa eman: ') ;
                     readln (rEragigai2) ;
                  until rEragigai2 <> 0.0 ;
                  writeln (rEragigai1:0:2, ' / ', rEragigai2:0:2, ' = ', rEragigai1/rEragigai2:0:2) ;
               end ;
         'A' : begin
                  writeln ('Programatik irtetera goaz!') ;
               end
      end ;
 
      cItxoin := readkey ;         (* emaitzak ikusi ahal izateko itxaron *)
      writeln(cItxoin) ;           (* konpilazio abisua kentzeko *)
   until cAukera='A' ;
end.