| ZER DAKIDAN: Badakit funtzio estandarrak izan daitezkeela eta norberak programatutako funtzioak izan daitezkeela. Badakit ere funtzioa eta programa nagusia elkar komunikatzeko parametroak erabiltzen direla. ZER IKASIKO DUDAN: liFaktoriala() funtzioari esker Zenbaki Konbinatorioa kalkulatuz sarrerako parametroak erabiltzen ikasiko dut eta horrez gain, ikusiko dut ere funtzio batek balio bat itzuli behar duenean return bitartez egin dezakeela. |
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.
Hau garrantzitsua da
Parametroak balioz pasatzeak esan nahi du uneko parametroak dagozkien parametro formaletan kopiatzen direla, ekintza hori automatikoki egiten da, eta, beraz, ez dira aldatzen uneko parametroak. Parametroak balioz pasatzen dira sarrerako parametroak direnean. |
Ondoko programa honek, m eta n irakurri ondoren, hiru faktorialen ZK zenbaki konbinatorioa kalkulatzen du, baina faktorialaren kalkulua leku bakar batean egiten du liFaktoriala() izeneko funtzioan hain zuzen ere:
/* Ariketa-38_ZenbakiKonbinatorioa: parametroak balioz igarotzen */
// Zenbaki osoekin lan eginez, main() funtzio nagusian bi kopuru
// irakurri ondoren (m eta n), dagozkien zenbaki konbinatorioa
// kalkulatu. Faktorialak lortu fnlFaktoriala() funtzioa erabiliz.
#include <stdio.h>
long liFaktoriala(int); // funtzioaren prototipoa
int main()
{
int iZbk_M, iZbk_N, iZbk_MkenN, iEmaitza;
long liFakt_M, liFakt_N, liFakt_MkenN;
printf("\n");
printf("\n Zenbaki osoekin lan eginez...\n\n");
do
{
printf(" 'm' zenbaki osoa eta positiboa eman: ");
scanf("%d", &iZbk_M);
} while (iZbk_M < 0);
do
{
printf(" 'n' zenbaki osoa eman (0 eta %d artekoa): ", iZbk_M);
scanf("%d", &iZbk_N);
} while ((iZbk_N < 0) || (iZbk_N > iZbk_M));
liFakt_M = liFaktoriala(iZbk_M); // uneko parametroak
printf("\n\t %d!=%ld", iZbk_M, liFakt_M);
liFakt_N = liFaktoriala(iZbk_N); // uneko parametroak
printf("\n\t %d!=%ld", iZbk_N, liFakt_N);
iZbk_MkenN = iZbk_M - iZbk_N;
liFakt_MkenN = liFaktoriala(iZbk_MkenN); // uneko parametroak
printf("\n\t %d!=%ld", iZbk_MkenN, liFakt_MkenN);
iEmaitza = liFakt_M / (liFakt_N * liFakt_MkenN);
printf("\n\n Zenbaki konbinatorioa ZK=%d", iEmaitza);
printf("\n\n");
return 0;
}
// Sarrerako parametroa
long liFaktoriala(int iZenbakia) // parametro formala
{
int iKont;
long liMetagailua; // faktorialaren emaitza izango dena
printf("\n\t %d! kalkulatzen...", iZenbakia);
liMetagailua = 1;
for (iKont = 1; iKont <= iZenbakia; iKont++)
{
liMetagailua = liMetagailua * iKont;
}
return(liMetagailua);
}
Aurreko programan liFaktoriala() izeneko funtzioari deia egiten dio hiru aldiz, enuntziatuaren m!, n! eta (m-n)! kalkulatzeko hurrenez hurren. Funtzio horrek programa nagusiko datu bat jasotzen du eta dagokion faktoriala kalkulatu ondoren programa nagusiari itzultzen dio.
Funtzioa osatzean hiru elementu kontutan izan beharko dira:
- Funtzioaren prototipoa programaren hasieran idatzi behar dela, horiek dira parametro formalak
- Funtzioaren kodea programaren edozein tokitan jar daitekeela, ohitura da gorengoko posizioan main() funtzioa idaztea
- Funtzioaren deiak egiterakoan uneko parametroak bat etorriko dira parametro formalekin


iruzkinik ez:
Argitaratu iruzkina