char etiketadun mezuak erakusten. Erakutsi mezu guztiak
char etiketadun mezuak erakusten. Erakutsi mezu guztiak

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

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:








 

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. 







 

11. Ariketa: bi letren arteko distantzia

ZER DAKIDAN:
Funtzio batek sarreraren bat hartzen du eta emaitza bakar bat itzultzen du. Dagoeneko zenbakien funtzio estandarrak erabili ditut.



ZER IKASIKO DUDAN:
CHAR datu-mota, eta CHAR datu-motarekin lotutako funtzio estandar batzuk:
  • upcase eta lowercase
  • chr eta ord
  • pred eta succ
  • readkey
Bide batez, hainbat zenbakiren artean minimoa zein den zehazten ikasiko dut.


A eta Z arteko letra maiuskula bat gure erreferentzia da. Prozesu errepikakor bat hasi eta teklatuaren bitartez letra bat irakurri, ereferentziaren eta irakurriko letraren arteko distantzia (zenbaki bat) kalkulatu balio minimoa gordez. Prozesu errepikakorretik irteteko erreferentzia den letra teklatuz irakurri. Programa amaitu aurretik pantailaratu letrarik hurbilena eta bere distantzia erreferentziarekiko.

Algoritmoa:
  1. Erreferentzia teklatutik irakurri, cErreferentzia aldagaiari balioa eman (jakinik letra maiuskula bat izan beharko dela)
  2. Hasieraketak. Bi izan daitezke, alde batetik distantzia minimoa gordeko duen iMinimoa zenbaki osoa (minimoa bilatzen ari garelako hasieran kopurua handi bat jarri beharko da); bigarren hasieraketa letrarik hurbilena gordetzeko cHurbilena aldagaia izango da, baina aurreko aldagaiarekin lotuta dagoenez bere hasieraketa ez da derrigorrezkoa
  3. Begiztaren iterazio bakoitzeko: cLetra aldagaiari balioa teklatuz eman, eta erreferentziarekiko iDistantzia aldagaiari distantzia kalkulatu ord funtzio estandarra aplikatuz, iDistantzia aldagaiaren balioa eta iMinimoa aldagaiaren balioa alderatu erabakiak hartzeko (emaitzak zehazteko, hots, minimoak zehazteko)
  4. Prozesu errepikakorretik irten cErreferentzia aldagaiaren balioa eta cLetra aldagaiaren balioa bat bera denean, baina kontuz, irtetean haien arteko diztantzia 0 izango da eta horrek minimoaren kalkuluarengan eragina du
  5. cLetra aldagaiaren balioa eta iMinimoa aldagaiaren balioa pantailaratu



ESKATZEN DEN PROGRAMA

Programa honek goiko algoritmoa aplikatzen du:

{ Erreferentzia bat emanik, letra sorta bateko letrarik hurbilena. }
program Ariketa_11 ;
uses
  crt ;
var
  cErreferentzia, cLetra, cItxoin, cHurbilena : char ;
  iDistantzia, iMinimoa : integer ;
begin
    clrscr ;
    repeat
       write('Erreferentzia izango den A..Z alfabetoko letra eman: ') ;
       readln(cErreferentzia) ;
    until (cErreferentzia >= 'A') and (cErreferentzia <= 'Z') ;
 
    writeln ;
    writeln('Orain prozesu errepikakor batean sartuko gara, begizta edo itzuli bakoitzean') ;
    writeln('letra majuskula bat sartuz eta erreferentziarekiko distantzia kalkulatuz.') ;
    writeln ;
 
    iMinimoa := ord('Z') - ord('A') + 1 ;   (* alfabetoaren maximoa baino 1 gehiago *)
    cHurbilena := cErreferentzia ;          (* hasieraketa hau ez da derrigorrezkoa *)
    repeat
       repeat
          write('A..Z alfabetoko letra eman (bukatzeko ', cErreferentzia, ' eman): ' ) ;
          readln(cLetra) ;
       until (cLetra >= 'A') and (cLetra <= 'Z') ;
 
       if cLetra <> cErreferentzia then
       begin
          iDistantzia := abs(ord(cErreferentzia) - ord (cLetra)) ;
          writeln(cLetra, ' eta ', cErreferentzia, ' arteko aldea ', iDistantzia, ' da') ;
          writeln ;
          if iDistantzia < iMinimoa then
          begin
             cHurbilena := cLetra ;
             iMinimoa := iDistantzia ;
          end ;
       end ;
    until cLetra = cErreferentzia ;
 
    writeln('Letrarik hurbilena: ', cHurbilena) ;
    writeln(cHurbilena, ' eta ', cErreferentzia, ' arteko aldea ', iMinimoa, ' da') ;
 
    cItxoin := readkey ;
    write(cItxoin) ;
end.