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

Azpiprogramak: Divide et Impera

AzpiprogramakDivide et Impera

Hasierako programa
program AzpiprogramenParametroak_01 ;
uses
   crt;

procedure Gehitu5Gehiago(Zenbaki1: integer; Zenbaki2: integer);
begin
   textcolor(Cyan);
   writeln('    Gehitu5Gehiago BARRUAN, batuketa egin baino LEHEN:  ',
                Zenbaki1:4, Zenbaki2:4);
   Zenbaki1 := Zenbaki1 + 5;
   Zenbaki2 := Zenbaki2 + 5;
   writeln('    Gehitu5Gehiago BARRUAN, batuketa egin ONDOREN:      ',
                Zenbaki1:4, Zenbaki2:4);
   textcolor(LightGray);
end;
  
{------------------------ Programa Nagusia ------------------------}
var
   iKopuru1, iKopuru2: integer;
begin
   iKopuru1 := 10;
   iKopuru2 := 20;
   writeln('PROGRAMA NAGUSIAN Gehitu5Gehiago deitu AURRETIK:        ',
            iKopuru1:4, iKopuru2:4);
   writeln;
    
   Gehitu5Gehiago(iKopuru1, iKopuru2);
    
   writeln;
   writeln('PROGRAMA NAGUSIAN Gehitu5Gehiago deitu ONDOREN:         ',
            iKopuru1:4, iKopuru2:4);
   writeln;
   readln;
end.  
  








Programa bat daukagu Gehitu5Gehiago izeneko prozedurari deia egiten diona, honako hauek ikusi:
  • Gehitu5Gehiago prozedurak bi parametro ditu, biak integer datu-motatakoak
  • Gehitu5Gehiago prozeduraren bi parametroak sarrerakoak dira
  • Gehitu5Gehiago prozedurari deia egiteko sententzia bezala idazten da
  • Gehitu5Gehiago prozedurari deia egitean uneko parametroak komaz banatzen dira
  • Gehitu5Gehiago prozeduraren parametro formalak puntu eta komaz banatzen dira
AzpiprogramenParametroak_01.pas programaren bitartez zer ikasi duzu?


Programa bat daukagu Gehitu5Gehiago prozeduraren parametroak sarrerakoak direla ikusi, honako frogak egin:
  • AzpiprogramenParametroak_02 programa exekutatu eta emaitza aztertu
  • AzpiprogramenParametroak_02 programaren emaitza aztertu aldaketa hauek eginez:
    • iKopuru1 uneko parametroaren balioa 100 izan dadila
    • iKopuru2 uneko parametroaren balioa 200 izan dadila
  • Gehitu5Gehiago prozedura barruko parametroen izenak aldatu:
    • Zenbaki1 parametro formala iKopuru1 izendatu
    • Zenbaki2 parametro formala iKopuru2 izendatu
  • Gehitu5Gehiago prozeduraren deian uneko parametroak elkar trukatu:
    • iKopuru1 uneko parametroaren posizioan iKopuru2 idatzi
    • iKopuru2 uneko parametroaren posizioan iKopuru1 idatzi
  • Gehitu5Gehiago prozeduraren deia aldatu adierazpen matematiko hauek jarriz:
    • Gehitu5Gehiago(iKopuru1 + 10, iKopuru2 + 20) ;
  • Gehitu5Gehiago prozeduraren deia aldatu konstante hauek jarriz:
    • Gehitu5Gehiago(11, 22) ;
AzpiprogramenParametroak_02.pas programaren bitartez zer ikasi duzu?


Gehitu5Gehiago prozeduraren parametroen datu-motak aldatu, honako frogak egin:
  • AzpiprogramenParametroak_03 programaren hasieran parametro guztiak integer dira:
    • iKopuru1 eta iKopuru2 aldagaiak integer bezala erazagutu dira
    • Zenbaki1 eta Zenbaki2 parametro formalak integer dira ere
  • Gehitu5Gehiago prozeduraren parametro formal baten datu-mota aldatu:
    • Zenbaki1 parametro formala integer bezala mantendu
    • Zenbaki2 parametro formala real datu-motara aldatu
    • iKopuru1 eta iKopuru2 uneko parametroak integer bezala mantendu
  • Gehitu5Gehiago prozeduraren deian uneko parametro baten datu-mota aldatu:
    • Zenbaki1 parametro formala integer bezala mantendu
    • Zenbaki2 parametro formala integer bezala berriro jarri
    • iKopuru1 uneko parametroa integer bezala mantendu
    • iKopuru2 uneko parametroari datu-mota aldatu real jarriz
AzpiprogramenParametroak_03.pas programaren bitartez zer ikasi duzu?


Gehitu5Gehiago prozeduraren parametro bat irteerakoa izanik, honako frogak egin:
  • Gehitu5Gehiago prozedura hasierakoa da eta lehen bezala:
    • Zenbaki1 parametro formala integer izanik sarrerakoa da
    • Zenbaki2 parametro formala integer izanik sarrerakoa da
  • Programa exekutatu Gehitu5Gehiago prozeduraren deia hasierako hau delarik:
    • Gehitu5Gehiago(iKopuru1, iKopuru2) ;
  • Programa exekutatu Gehitu5Gehiago prozeduraren deia aldatu adierazpen matematiko hauek jarriz:
    • Gehitu5Gehiago(iKopuru1 + 10, iKopuru2 + 20) ;
  • Aldaketa, Gehitu5Gehiago prozeduraren parametro formal baten datu-mota aldatu:
    • iKopuru1 eta iKopuru2 uneko parametroak integer dira
    • Zenbaki1 parametro formala integer bezala mantendu
    • Zenbaki2 parametro formala real datu-motara aldatu
    • Gehitu5Gehiago prozedura berriarekin, programa exekutatu deiak hauek direla:
      • Gehitu5Gehiago(iKopuru1, iKopuru2) ;
      • Gehitu5Gehiago(iKopuru1 + 10, iKopuru2) ;
      • Gehitu5Gehiago(iKopuru1, iKopuru2 + 20) ;
    • Gehitu5Gehiago hasierako egoera berreskuratu (parametro bat sarrerakoa eta bestea irteerakoa) eta prozeduraren deia aldatu konstante hauek jarriz:
      • Gehitu5Gehiago(11, 22) ;
    AzpiprogramenParametroak_04.pas programaren bitartez zer ikasi duzu?


    iKopuru1 eta iKopuru2 aldagaiak non erazagutzen diren garrantzitsua da:
    • Gehitu5Gehiago prozedura barruko lehen esleipena aldatu hau idatziz:
      • iKopuru1 := Zenbaki1 + 5 ;
      • Ikusi iKopuru1 eta iKopuru2 aldagaiak prozedura baino lehenago erazaguturik daudela
    • Gehitu5Gehiago prozedura barruko esleipen berria mantenduz, iKopuru1 eta iKopuru2 aldagaiak tokiz aldatu:
      • iKopuru1 := Zenbaki1 + 5 ;
      • iKopuru1 eta iKopuru2 aldagaiak prozedura eta gero erazagutu
    AzpiprogramenParametroak_05.pas programaren bitartez zer ikasi duzu?


    Gehitu5Gehiago prozeduraren barruan aldagai laguntzaileak sortuko ditugu, egiteko daukagun asmoa hauxe da urratsez-urrats:
    1. iLaguntzaile1 izeneko aldagaia sortu integer bezala
    2. iLaguntzaile1 izeneko aldagaiari hasieraketarik ez egin eta...
    3. ...iLaguntzaile1 aldagaiaren balioa pantailaratu prozedura barruan
    Gehitu5Gehiago prozeduraren bertako aldagaiak iker ditzagun:
    • Aurrekoa egin bi aldagai laguntzaile sortuz:
      • var iLaguntzaile1, iLaguntzaile2 : integer ;
      • iLaguntzaile1 eta iLaguntzaile2 aldagaiei hasieraketarik ez egin eta...
      • writeln('    iLaguntzaile1 = ', iLaguntzaile1, '      iLaguntzaile2 = ', iLaguntzaile2) ;
    • Aurrekoa errepikatu bi aldagai laguntzaileen sorreran ordena trukatuz:
      • var iLaguntzaile2, iLaguntzaile1 : integer ;
      • iLaguntzaile1 eta iLaguntzaile2 aldagaiei hasieraketarik ez egin eta...
      • writeln('    iLaguntzaile1 = ', iLaguntzaile1, '      iLaguntzaile2 = ', iLaguntzaile2) ;
    • Programa nagusian lan eginez iKopuru1 eta iKopuru2 aldagaien balioak pantailaratu
    • Programa nagusian lan eginez iLaguntzaile1 eta iLaguntzaile2 aldagaien balioak pantailaratu
      AzpiprogramenParametroak_06.pas programaren bitartez zer ikasi duzu?


      Programa bat daukagu fniBatuBiEtaGehitu5Gehiago izeneko funtzioari deitzen diona, honako hauek ikusi:
      • fniBatuBiEtaGehitu5Gehiago funtzioak bi parametro ditu, biak integer datu-motatakoak
      • fniBatuBiEtaGehitu5Gehiago funtzioaren bi parametroak sarrerakoak dira.
      • fniBatuBiEtaGehitu5Gehiago funtzioak irteera bakarra du eta integer datu-motatakoa da
      • fniBatuBiEtaGehitu5Gehiago funtzioari deia egitean esleipen bat idatziko da
      • fniBatuBiEtaGehitu5Gehiago funtzioaren deia adierazpen aritmetiko batean ager daiteke
      • fniBatuBiEtaGehitu5Gehiago funtzioaren deia beste azpiprograma baten uneko parametroa izan daiteke
      • fniBatuBiEtaGehitu5Gehiago funtzioak emaitza itzuliko dio programa nagusiari, emaitza den balio hori itzultzeko fniBatuBiEtaGehitu5Gehiago etiketa erabiliko du
      AzpiprogramenParametroak_07.pas programaren bitartez zer ikasi duzu?


      iZenbaki zenbaki baten faktoriala kalkulatzen duen funtzioak eragiketa hau egin behar du eta horretarako FOR-DO egitura bat erabil daiteke:
      • iZenbaki! = 1 * 2 * 3 * ... (iZenbaki - 1) * iZenbaki
        program FaktorialaKalkulatzen ;
        
        function fnliFaktoriala(iZbk:integer) : longint ;
        var
           k : integer ;
           liMetatua : longint ;
        begin
           liMetatua := 1 ;
           for k:=1 to iZbk do
           begin
              liMetatua := liMetatua*k ;
              WriteLn(k, ' ---> ', liMetatua) ;
           end ;
           fnliFaktoriala := liMetatua ;
        end ;
        
        var
          liEmaitza : longint ;
          iDatua : integer ;
        begin
           repeat
              write('Eman zenbaki osoa: ') ;
              readln(iDatua) ;
           until iDatua > 0 ;
           liEmaitza := fnliFaktoriala(iDatua) ;
           writeln(iDatua, '! = ', liEmaitza) ;
           readln ;
        end.

        Programa horretan fnliFaktoriala() funtzioari dei bakar bat egiten zaio,  programa nagusian liEmaitza aldagaiari balioa ematen zaio baino lehenago iDatua aldagaiaren balioa teklatuaren bitartez irakurri dugu. fnliFaktoriala() funtzioaren kodifikazioan FOR-DO egitura bat behar dugu eta hura kontrolatzeko k aldagaia behar dugu, faktoriala kalkulatzen duen liMetatua aldagaia beharko dugu ere.

        fnliFaktoriala() funtzioak programa nagusiari emaitza itzultzeko fnliFaktoriala etiketa erabili behar da derrigorrez, bestela liMetatua aldagaiak faktorialaren balioa gordeko du baina programa nagusiari ez zaio inolaz ere helduko.


        AzpiprogramenParametroak_08.pas programaren bitartez zer ikasi duzu?






        Gehitu5Gehiago prozedurari deituko diogu Gehitu5Gehiago prozeduraren barrutik:
        • Gehitu5Gehiago prozedura barruko esleipenak mantendu baina IF-THEN bat gehitu, honelaxe:
          • Zenbaki1 := Zenbaki1 + 5 ;
          • if Zenbaki1 <= 25 then Gehitu5Gehiago(Zenbaki1, Zenbaki2) ;
          • Zenbaki2 := Zenbaki2 + 5 ;
        • Aurrekoa errepikatu baina Zenbaki1 parametro formala irteerakoa izanik:
          • procedure Gehitu5Gehiago (var Zenbaki1: integer; Zenbaki2: integer) ;
        • Aurrekoa errepikatu IF-THEN egitura kenduz eta dei errekurtsiboa mantenduz:
          • Zenbaki1 := Zenbaki1 + 5 ;
          • Gehitu5Gehiago(Zenbaki1, Zenbaki2) ;
          • Zenbaki2 := Zenbaki2 + 5 ;

          AzpiprogramenParametroak_09.pas programaren bitartez zer ikasi duzu?






          iZenbaki zenbaki baten faktoriala kalkulatzen duen funtzio errekurtsiboa erakusten da jarraian. Faktorialaren kalkulu errekurtsiboa algoritmo honetan oinarritzen da:
          • iZenbaki! = iZenbaki * (iZenbaki - 1)!
            program FaktorialErrekurtsiboa ;
            
            function fnliFaktoriala(iZbk:integer) : longint  ;
            begin
               writeln('Dei errekurtsiboa baino lehen ---> ', iZbk) ;   
               if iZbk = 1 then
                  fnliFaktoriala := 1
               else
                  fnliFaktoriala := iZbk * fnliFaktoriala(iZbk - 1) ;
               writeln ('Dei errekurtsiboa eta gero ------> ', iZbk) ;   
            end ;
            
            var
              liEmaitza : longint ;
              iDatua : integer ;
            
            begin
               repeat
                  write('Eman zenbaki osoa: ') ;
                  readln(iDatua) ;
               until iDatua > 0 ;
               liEmaitza := fnliFaktoriala(iDatua) ;
               writeln(iDatua, '! = ', liEmaitza) ;
               readln ;
            end.


            AzpiprogramenParametroak_10.pas programaren bitartez zer ikasi duzu? Azalpenak eta irudiak ikusteko Errekurtsibitatea zertan den izeneko blog-artikulua irakurri.


             

            iruzkinik ez:

            Argitaratu iruzkina

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