2025(e)ko otsailaren 22(a), larunbata

Ariketa 38 | Zenbaki Konbinatorioa (sarrera-irteerako parametroa)

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
2. liFaktoriala()funtzioak zenbaki oso baten faktoriala kalkulatzen du.
  • 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
2. liFaktoriala()funtzioak zenbaki oso baten faktoriala kalkulatzen du.
  • liFaktoriala() funtzioak long bat itzultzen du. Parametroak:
    • Sarrerako parametroak: int bat
    • Irteerako parametroak: irteerarik ez dago
3. EmaitzaEskuratu() funtzioak hiru faktorialak kalkulatu eta Zenbaki Konbinatorioa itzultzen du.
  • 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
2. liFaktoriala()funtzioak zenbaki oso baten faktoriala kalkulatzen du.
  • liFaktoriala() funtzioak long bat itzultzen du. Parametroak:
    • Sarrerako parametroak: int bat
    • Irteerako parametroak: irteerarik ez dago
3. EmaitzaKalkulatu() funtzioak hiru faktorialak kalkulatu eta Zenbaki Konbinatorioa itzultzen du.
  • 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:


  • Ariketa-38a_ZenbakiKonbinatorioa.cbp | main.c
  • Ariketa-38b_ZenbakiKonbinatorioa.cbp | main.c
  • Ariketa-38c_ZenbakiKonbinatorioa.cbp | main.c


 

iruzkinik ez:

Argitaratu iruzkina