2024(e)ko otsailaren 24(a), larunbata

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

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