| ZER DAKIDAN: Badakit funtzio bati sarrerako parametroa balioz pasatzen zaiola eta funtzioak return bitartez itzul dezakeela emaitza. ZER IKASIKO DUDAN: Ireerako parametroak erabiltzen ikasiko dut, parametro horiek erreferentziaz pasarazi behar dizkiot funtzioari. |
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.
Ariketa 38 | Zenbaki Konbinatorioa (sarrerako parametroa) blog-artikuluan ikusi dugu liFaktoriala() izeneko funtzioak sarrerako parametro bat behar duela eta behar duen datua balioz pasatzen zaiola. Ikus dezagun orain funtzio bat zeinek bi irteera itzultzen dituen, bi parametroak, noski, erreferentziaz pasatzen dira.
Hau garrantzitsua da
Parametroak erreferentziaz pasatzeak esan nahi du transferitutakoa ez direla balioak, baizik eta balio horiek dituzten aldagaien helbideak, eta, beraz, uneko parametroak alda daitezke. Parametroak erreferentziaz pasatzen dira irteerako parametroak direnean (zehatzago hitz eginez sarrera/irteerako parametroak direnean). |
Hurrengo hiru programetan erreparatu DatuakHartu() izeneko funtzioan, EmaitzaEskuratu() izeneko funtzioan eta EmaitzaKalkulatu() izeneko funtzioan, horiek ulertzea baita blog-artikulu honen helburua.
Azpiprogramen deskribapen laburra eta bere parametroen jokamoldeak:
1. DatuakHartu()funtzioaren barruan bi scanf() egin ondoren irakurritako bi balioak main() funtzio nagusira bidaltzen dira.- DatuakHartu() funtzioak void bat itzultzen du, hots, ez du ezer itzultzen. Parametroak:
- sarrerako parametroak: sarrerarik ez dago
- irteerako parametroak: bi irteera, biak int datu-motakoak
- liFaktoriala() funtzioak long bat itzultzen du. Parametroak:
- Sarrerako parametroak: int bat
- Irteerako parametroak: irteerarik ez dago
Hau da Ariketa-38a_ZenbakiKonbinatorioa.cbp proiektuaren main.c fitxategiaren kodea:
/* Ariketa-38a_ZenbakiKonbinatorioa: parametroak balioz eta
erreferentziaz igarotzen */
// Zenbaki osoekin lan eginez, DatuakHartu() funtzioan bi kopuru
// irakurri ondoren (m eta n), dagozkien zenbaki konbinatorioa
// kalkulatu. Faktorialak lortu fnlFaktoriala() funtzioa erabiliz.
#include <stdio.h>
void DatuakHartu(int *, int *); // funtzioaren prototipoa
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");
DatuakHartu(&iZbk_M, &iZbk_N); // uneko parametroak
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;
}
// Irteerako parametroak
void DatuakHartu(int *iZbk_M, int *iZbk_N) // parametro formalak
{
do
{
printf(" 'm' zenbaki osoa eta positiboa eman: ");
scanf("%d", iZbk_M); // iZbk_M helbidea da, zenbaki baten helbidea da
} while (*iZbk_M < 0); // *iZbk_M zenbakia da, iZbk_M helbideak seinalatutako zenbakia da
do
{
printf(" 'n' zenbaki osoa eman (0 eta %d artekoa): ", *iZbk_M);
scanf("%d", iZbk_N); // iZbk_N helbidea da, zenbaki baten helbidea da
} while ((*iZbk_N < 0) || // *iZbk_N zenbakia da, iZbk_N helbideak seinalatutako zenbakia da
(*iZbk_N > *iZbk_M));
}
// Sarrerako parametroa
long liFaktoriala(int iZenbakia) // parametro formala
{
int iKont; // bertako aldagaia
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);
}
Azpiprogramen deskribapen laburra eta bere parametroen jokamoldeak:
1. DatuakHartu()funtzioaren barruan bi scanf() egin ondoren irakurritako bi balioak main() funtzio nagusira bidaltzen dira.- DatuakHartu() funtzioak void bat itzultzen du, hots, ez du ezer itzultzen. Parametroak:
- sarrerako parametroak: sarrerarik ez dago
- irteerako parametroak: bi irteera, biak int datu-motakoak
- liFaktoriala() funtzioak long bat itzultzen du. Parametroak:
- Sarrerako parametroak: int bat
- Irteerako parametroak: irteerarik ez dago
- EmaitzaEskuratu() funtzioak int bat itzultzen du. Parametroak:
- Sarrerako parametroak: bi sarrera, int datu-motako bi sarrera
- Irteerako parametroak: irteerako parametrorik ez dago.
Hau da Ariketa-38b_ZenbakiKonbinatorioa.cbp proiektuaren main.c fitxategiaren kodea:
/* Ariketa-38b_ZenbakiKonbinatorioa: parametroak balioz eta
erreferentziaz igarotzen */
// Zenbaki osoekin lan eginez, DatuakHartu() funtzioan bi kopuru
// irakurri ondoren (m eta n), dagozkien zenbaki konbinatorioa
// lortu EmaitzaEskuratu() funtzioari esker. EmaitzaEskuratu()
// funtzioak fnlFaktoriala() funtzioari deiak egingo dizkio.
#include <stdio.h>
void DatuakHartu(int *, int *); // funtzioaren prototipoa
long liFaktoriala(int); // funtzioaren prototipoa
int EmaitzaEskuratu(int, int); // funtzioaren prototipoa
int main()
{
int iZbk_M, iZbk_N, iEmaitza;
printf("\n");
printf("\n Zenbaki osoekin lan eginez...\n\n");
DatuakHartu(&iZbk_M, &iZbk_N); // uneko parametroak
iEmaitza = EmaitzaEskuratu(iZbk_M, iZbk_N); // uneko parametroak
printf("\n\n Zenbaki konbinatorioa ZK=%d", iEmaitza);
printf("\n\n");
return 0;
}
// Irteerako parametroak
void DatuakHartu(int *iZbk_M, int *iZbk_N) // parametro formalak
{
do
{
printf(" 'm' zenbaki osoa eta positiboa eman: ");
scanf("%d", iZbk_M); // iZbk_M helbidea da, zenbaki baten helbidea da
} while (*iZbk_M < 0); // *iZbk_M zenbakia da, iZbk_M helbideak seinalatutako zenbakia da
do
{
printf(" 'n' zenbaki osoa eman (0 eta %d artekoa): ", *iZbk_M);
scanf("%d", iZbk_N); // iZbk_N helbidea da, zenbaki baten helbidea da
} while ((*iZbk_N < 0) || // *iZbk_N zenbakia da, iZbk_N helbideak seinalatutako zenbakia da
(*iZbk_N > *iZbk_M));
}
// Sarrerako parametroa
long liFaktoriala(int iZenbakia) // parametro formala
{
int iKont; // bertako aldagaia
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);
}
// Sarrerako parametroak
int EmaitzaEskuratu(int iZbk_M, int iZbk_N) // parametro formalak
{
long liFakt_M, liFakt_N, liFakt_MkenN; // bertako aldagaiak
int iZbk_MkenN, iEmaitza; // bertako aldagaiak
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);
return(iEmaitza);
}
Azpiprogramen deskribapen laburra eta bere parametroen jokamoldeak:
1. DatuakHartu()funtzioaren barruan bi scanf() egin ondoren irakurritako bi balioak main() funtzio nagusira bidaltzen dira.- DatuakHartu() funtzioak void bat itzultzen du, hots, ez du ezer itzultzen. Parametroak:
- sarrerako parametroak: sarrerarik ez dago
- irteerako parametroak: bi irteera, biak int datu-motakoak
- liFaktoriala() funtzioak long bat itzultzen du. Parametroak:
- Sarrerako parametroak: int bat
- Irteerako parametroak: irteerarik ez dago
- EmaitzaKalkulatu() funtzioak void bat itzultzen du (ez du ezer itzultzen). Parametroak:
- Sarrerako parametroak: bi sarrera, int datu-motako bi sarrera
- Irteerako parametroak: irteera bakarra, int datu-motakoa
Hau da Ariketa-38c_ZenbakiKonbinatorioa.cbp proiektuaren main.c fitxategiaren kodea:
/* Ariketa-38c_ZenbakiKonbinatorioa: parametroak balioz eta
erreferentziaz igarotzen */
// Zenbaki osoekin lan eginez, DatuakHartu() funtzioan bi kopuru
// irakurri ondoren (m eta n), dagozkien zenbaki konbinatorioa
// lortu EmaitzaKalkulatu() funtzioari esker. EmaitzaKalkulatu()
// funtzioak fnlFaktoriala() funtzioari deiak egingo dizkio.
#include <stdio.h>
void DatuakHartu(int *, int *); // funtzioaren prototipoa
long liFaktoriala(int); // funtzioaren prototipoa
void EmaitzaKalkulatu(int, int, int *); // funtzioaren prototipoa
int main()
{
int iZbk_M, iZbk_N, iEmaitza;
printf("\n");
printf("\n Zenbaki osoekin lan eginez...\n\n");
DatuakHartu(&iZbk_M, &iZbk_N); // uneko parametroak
EmaitzaKalkulatu(iZbk_M, iZbk_N, &iEmaitza); // uneko parametroak
printf("\n\n Zenbaki konbinatorioa ZK=%d", iEmaitza);
printf("\n\n");
return 0;
}
// Irteerako parametroak
void DatuakHartu(int *iZbk_M, int *iZbk_N) // parametro formalak
{
do
{
printf(" 'm' zenbaki osoa eta positiboa eman: ");
scanf("%d", iZbk_M); // iZbk_M helbidea da, zenbaki baten helbidea da
} while (*iZbk_M < 0); // *iZbk_M zenbakia da, iZbk_M helbideak seinalatutako zenbakia da
do
{
printf(" 'n' zenbaki osoa eman (0 eta %d artekoa): ", *iZbk_M);
scanf("%d", iZbk_N); // iZbk_N helbidea da, zenbaki baten helbidea da
} while ((*iZbk_N < 0) || // *iZbk_N zenbakia da, iZbk_N helbideak seinalatutako zenbakia da
(*iZbk_N > *iZbk_M));
}
// Sarrerako parametroa
long liFaktoriala(int iZenbakia) // parametro formala
{
int iKont; // bertako aldagaia
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);
}
// Sarrerako parametroak eta irteerako parametroa
void EmaitzaKalkulatu(int iZbk_M, int iZbk_N, int *iEmaitza) // parametro formalak
{
long liFakt_M, liFakt_N, liFakt_MkenN; // bertako aldagaiak
int iZbk_MkenN; // bertako aldagaia
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);
}
Ikusi parametroak sarrera/irteerakoak direnean adibide batzuk:
|


iruzkinik ez:
Argitaratu iruzkina