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

7. astea | menu bat azpiprogramaz








Bost aukerako menu baten bitartez gidatzen den programa bat daukagu. Aukerak hautatzeko karaktereak erabiltzen dira eta bostetatik aukera batek programa bukarazten du. Hautatutako aukerari esker CASE-OF agindu baten bitartez gidatzen da programaren exekuzioa. Menua aurkezteko eta aukeraren bat hautatzeko lana fncAukeraHautatu funtzio honek egiten du:


Programa nagusia, funtsean, prozesu errepikakor bat da, errepikapenak eteteko eta programatik irteteko I edo i karakterea sartu behar da. Deskriba ditzagun, banan-banan gainerako lau aukerak, eta ikus dezagun ere programaren kodea.


fncAukeraHautatu funtzioan irakurritako A edo a karakterea programa nagusira helduko da eta programa nagusian DiagonalkiPantailaratu prozeduraren sarrrera den karakterea irakurriko da (prozedura horrek datu bakar bat behar du, alfabeto larriaren letra bat). DiagonalkiPantailaratu prozedurak jarraian erakusten den mezua emateko gai da:





fncAukeraHautatu funtzioan irakurritako B edo b karakterea programa nagusira helduko da eta programa nagusian TaulaPantailaratu prozeduraren sarrrera den zenbaki osoa irakurriko da (prozedura horrek datu bakar bat behar du, 0 eta 9 arteko zenbaki osoa). TaulaPantailaratu prozedurak jarraian erakusten den mezua emateko gai da:





fncAukeraHautatu funtzioan irakurritako C edo c karakterea programa nagusira helduko da eta programa nagusian fnrErroKuboaKalkulatu funtzioaren sarrrera den zenbaki erreala irakurriko da (funtzio horrek datu bakar bat behar du, zenbaki erreala eta positiboa). fnrErroKuboaKalkulatu funtzioaren deia egin ondoren, programa nagusian jarraian erakusten den mezuaren bezalakoak agertuko dira:





fncAukeraHautatu funtzioan irakurritako D edo d karakterea programa nagusira helduko da eta programa nagusian fnboFibonaccikoaDa funtzioaren sarrrera den zenbaki erreala irakurriko da (funtzio horrek datu bakar bat behar du, 3 eta 17000 arteko zenbaki osoa). fnboFibonaccikoaDa funtzioaren deia egin ondoren, programa nagusiari balio boolear itzuliko dio eta balio boolear horren arabera programak honelako mezuak erakutsiko ditu:





Hona hemen MenuBatAzpiprogramaz.pas adibidearen iturburu-programa:
program MenuBatAzpiprogramaz ;
uses
   crt ;

function fncAukeraHautatu: char ;
var
   cHautapena: char ;
begin
   writeln('==========================Menua==========================') ;
   writeln('  A   Alfabeto zatia diagonalki') ;
   writeln('  B   Biderkatzeko taula marraztu') ;
   writeln('  C   Zenbaki baten erro kuboa Newton-Raphson bitartez') ;
   writeln('  D   Zenbaki bat Fibonacciren sekuentziakoa da?') ;
   writeln ;
   writeln('  I   Programatik irten') ;
   writeln('=========================================================') ;
   write('                                Zure aukera: ') ;
   
   repeat 
      cHautapena := readkey ;
      cHautapena := upcase(cHautapena) ;
      writeln(cHautapena) ;
      
      if (cHautapena < 'A') or (cHautapena > 'D') and (cHautapena <> 'I') then
      begin
         write('Aukera ez da ondo hautatu. Berriro aukeratu: ') ;   
      end ;   
   until (cHautapena >= 'A') and (cHautapena <= 'D') or (cHautapena = 'I') ;
   
   fncAukeraHautatu := cHautapena ;
end ;


procedure DiagonalkiPantailaratu(cLetra: char) ;
var
   k: char ;
   iNon: integer ;
begin
   writeln('Alfabeto zatia diagonalki pantailaratu:') ;
   
   iNon := 15 ;
   for k:='A' to cLetra do
   begin
      writeln(k:iNon) ;
      iNon := iNon + 1 ;
   end ;
   writeln ; 
end ;


procedure TaulaPantailaratu(iZbk : integer) ;
var
   k: integer ;
begin
   writeln(iZbk,' zenbakiaren biderkatzeko taula:') ;
   for k:=1 to 10 do
   begin
      writeln(k:35, ' x ', iZbk, ' = ', k*iZbk:2) ;
   end ;
   writeln ; 
end ;


function fnrErroKuboaKalkulatu(rZbk: real): real ;
var
   rEpsilon, rKuboa, rAurrekoa : real ;
begin
   rEpsilon := 0.000000001 ;
   rKuboa := rZbk / 3.0 ;   (* lehendabiziko hurbilketa *)

   repeat
      rAurrekoa := rKuboa ;
      rKuboa := (rZbk / (rAurrekoa*rAurrekoa) + 2*rAurrekoa) / 3 ;
      rKuboa := rAurrekoa - (rAurrekoa*rAurrekoa*rAurrekoa - rZbk) / (3*rAurrekoa*rAurrekoa) ;
      //writeln('rAurrekoa =':14, rAurrekoa:22:16, 'rKuboa =':20, rKuboa:22:16) ;
   until abs(rKuboa - rAurrekoa) <= rEpsilon ;
    
   fnrErroKuboaKalkulatu := rKuboa ;
end ;


function fnboFibonaccikoaDa(iZbk: integer): boolean ;
var
   iFibo1, iFibo2, iFibo3: integer ;
begin
   iFibo1 := 0 ;
   iFibo2 := 1 ;
   iFibo3 := iFibo1 + iFibo2 ;
   while iFibo3 < iZbk do
   begin
      iFibo1 := iFibo2 ;
      iFibo2 := iFibo3 ;
      iFibo3 := iFibo1 + iFibo2 ;
      writeln('iFibo3 = ':20, iFibo3) ;
   end ;
   
   if iFibo3 = iZbk then
      fnboFibonaccikoaDa := TRUE
   else
      fnboFibonaccikoaDa := FALSE ;
end ;


{ ----------------------PROGRAMA NAGUSIA---------------------- }
var
   cAukera, cItxoin, cLetra: char ;
   iZbk: integer ;
   rZbk, rKuboa: real ;
begin
   repeat
      clrscr ;
      cAukera := fncAukeraHautatu ;

      writeln ;
      case cAukera of
         'A' : begin
                  repeat
                     write('A eta Z arteko letra bat eman: ') ;
                     readln(cLetra) ;
                     cLetra := upcase(cLetra) ;
                  until (cLetra >= 'A') and (cLetra <= 'Z') ;
                  DiagonalkiPantailaratu(cLetra) ;
               end ;
         'B' : begin
                  repeat
                     write('0 eta 9 arteko zenbaki osoa eman: ') ;
                     readln(iZbk) ;
                  until (iZbk >= 0) and (iZbk <= 9) ;
                  TaulaPantailaratu(iZbk) ;
               end ;
         'C' : begin
                  repeat
                     write('Zenbaki erreala eta positiboa eman: ') ;
                     readln(rZbk) ;
                  until rZbk >= 0.0 ;
                  rKuboa := fnrErroKuboaKalkulatu(rZbk) ;
                  writeln(rZbk:0:5 , '-ren erro kuboa: ', rKuboa:0:5) ; 
               end ;    
         'D' : begin
                  repeat
                     write('3 eta 17000 arteko zenbaki osoa eman: ') ;
                     readln(iZbk) ;
                  until (iZbk >= 3) and (iZbk <= 17000) ;
                  if fnboFibonaccikoaDa(iZbk) then
                     writeln(iZbk , ' Fibonacciren sekuentziakoa da') 
                  else
                     writeln(iZbk , ' ez da Fibonacciren sekuentziakoa')    
               end ;               
         'I' : begin             
                  writeln('Programa amaitzera doa. Edozein tekla sakatu.') ;
               end ;    
      end ;

      cItxoin := readkey ;         (* emaitzak ikusi ahal izateko itxaron *)
      writeln(cItxoin) ;           (* konpilazio abisua kentzeko *)
   until cAukera='I' ;
end.
 
 

iruzkinik ez:

Argitaratu iruzkina

Iruzkinen bat idazteko Google-ko kontu bat behar duzu. Iruzkin guztien moderazio-ardura blogeko administratzaileari dagokio.