2023(e)ko otsailaren 24(a), ostirala

6. astea | zenbaki konbinatorioa (prozedura)




















zenbaki konbinatorioa, kopuru osoa da eta hura lortzeko m eta n zenbaki osoak eta positiboak ezagutu behar dira. Jakinik ere, zenbaki negatiboen faktoriala definiturik ez dagoelako datuek baldintza hau betetzen dutela:   m >= n.



Ikusita daukagun ondoko programa honek ZenbakiKonbinatorioaMonolitikoa.pas zenbaki konbinatorioa kalkulatzen du, baina aintzat hartu beharra dago programak inolako barne antolaketarik ez duelako faktorialaren kalkulua hiru aldiz egiten duela:





Aurreko programaren beste bertsio bat ondoko irudian erakusten da, non programa nagusian datuak irakurri eta gero EmaitzaKalkulatu()izeneko prozedurari deia egiten zaion. Prozedura horren barruan hiru faktorialak kalkulatuko dira:





Aurrekoa ikusita, prozeduraren barruan faktorialak kalkulatzen duen programa egizu. Beraz, ZenbakiKonbinatorioaProzeduraz.PAS programa idatz ezazu, hauek izanik hiru azpiprogramen deskribapenak eta definizioak.




1. DatuakHartu()prozedura barruan bi ReadLn() egin ondoren irakurritako bi balioak programa nagusira bidaltzen dira. Hauxe litzateke DatuakHartu()prozeduraren definizioa:


  • DatuakHartu() prozedura,


    • sarrera: sarrerarik ez dago

    • irteera: bi irteera, biak Integer datu-motakoak


2. EmaitzaKalkulatu()prozedura barruan hiru aldiz kalkulatzen da faktoriala, horregatik programa hori beste modu batez plantea daiteke: faktoriala lortzeko gai den funtzio bat erabili eta funtzioari hiru dei egin. Hauxe litzateke EmaitzaKalkulatu()prozeduraren definizioa:



  • EmaitzaKalkulatu() prozedura,


    • sarrera: bi sarrera, Integer datu-motako bi sarrera

    • irteera: irteera bakarra, LongInt datu-motakoa


3. fniFaktoriala()funtzioak zenbaki oso baten faktoriala kalkulatu eta itzultzen du. Hauxe litzateke fniFaktoriala() funtzioaren definizioa:



  • fniFaktoriala() funtzioa,


    • sarrera: Integer bat

    • irteera: LongInt bat






Hona hemen ZenbakiKonbinatorioaAzpiprogramaz.pas programa non datuak prozedura batean irakurtzen diren:




program ZenbakiKonbinatorioa_Azpiprogramaz ;

procedure DatuakHartu(var iZbkM, iZbkN: integer) ;
begin
repeat
write('m zenbaki osoa eta positiboa eman: ') ;
readln(iZbkM) ;
write('n zenbaki osoa (non n <= m ): ') ;
readln(iZbkN) ;
until (iZbkN >= 0) AND (iZbkM >= iZbkN) ;
end ;


function fnliFaktoriala(iZbk: integer): longint ;
var
iKontagailua: integer ;
liMetagailua: longint ;
begin
liMetagailua := 1 ;
for iKontagailua:=1 to iZbk do
liMetagailua := liMetagailua * iKontagailua ;

fnliFaktoriala := liMetagailua ;
end ;



procedure EmaitzaKalkulatu(iZbkM, iZbkN: integer; var iEmaitza: integer) ;
var
iZbkM_N: integer ;
liFaktM, liFaktN, liFaktM_N: longint ;
begin
liFaktM := fnliFaktoriala(iZbkM) ;
liFaktN := fnliFaktoriala(iZbkN) ;

iZbkM_N := iZbkM - iZbkN ;
liFaktM_N := fnliFaktoriala(iZbkM_N) ;

iEmaitza := liFaktM div (liFaktN * liFaktM_N) ;
end ;


{ ----------PROGRAMA NAGUSIA---------- }
var
iZbkM, iZbkN, iEmaitza: integer ;
begin
DatuakHartu(iZbkM, iZbkN) ;
EmaitzaKalkulatu(iZbkM, iZbkN, iEmaitza) ;
write('Zenbaki konbinatorioa ---> ', iZbkM, '! div (', iZbkN,'! * ', iZbkM-iZbkN,'!)') ;
write(' = ', iEmaitza) ;
readln ;
end.





iruzkinik ez:

Argitaratu iruzkina