2025(e)ko otsailaren 24(a), astelehena

Ariketa 40 | Fibonacci-ren zenbakiak azpiprogramaz

ZER DAKIDAN:
Fibonacci matematikariaren sekuentza ezagutzen dut, lehen zenbakia 0 da eta bigarrena 1 da, hurrengoak lortzeko aurreko bi zenbakien batura egin behar da.



ZER IKASIKO DUDAN:
Fibonacci sekuentziako zenbakiak lortzen ikasiko dut baina funtzioak erabiliz.





Leonardo Pisano (Pisa, Italia, 1170-1250), Leonardo Bonacci, Leonardo Fibonacci edo Fibonacci moduan ezaguna, Italiar matematikaria izan zen, Erdi Aroko ezagunetarikoa. Ezaguna da batez ere bi aurkikuntzengatik:

  • Hindu-arabiar zenbaki sistema Europan sartu zuen eta berau erabiltzeko bideak jarri zituen XIII. mendeko "Liber Abaci" liburuaren bitartez
  • Fibonacciren zenbakiak deskribatu zituen liburu berean, nahiz eta berak ez zituen aurkitu baizik eta adibide moduan jarri
Leonardo Pisano, Fibonacci, ezagutzeko hemen duzu artikulu bat Fibonacci, el matemático que se puso a contar conejos y descubrió la secuencia divina.


Fibonacciren sekuentziako lehen zenbakia 0 da, Fibonacci-ren bigarren zenbakia 1 da, eta hirugarren zenbakia lortzeko aurreko biak batuko dira, horregatik Fibonacciren hirugarren zenbakia 1 da, laugarren zenbakia 2 izango da, bosgarrena 3, ... 

Beraz, Fibonacciren sekuentzia honako hau da:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, ...


Ondorengoa da Fibonacciren segidaren adierazpen orokorra:

{\displaystyle F_{n}={\begin{cases}0&n=0{\mbox{ bada}}\\1&n=1{\mbox{ bada}}\\F_{n-1}+F_{n-2}&n>1{\mbox{ bada}}\\\end{cases}}}


Fibonacciren zenbakiak grafikoki adieraztean honako blokeen sorta eta espirala lortzen dira:




Fibonacciren sekuentziako bi zenbaki hartuz eta zatiketa eginez, urrezko zenbakia edo jainkozko proportzioa edo urrezko proportzioa edo zerutiar zenbakia lortzen da:

Fibonacciren sekuentzia sarritan agertzen da naturan. Izan ere, naturan hazkundea gertatzen denean Fibonacciren sekuentziaren arabera ematen da:

     

     

     

    





Eskatzen den programa (bi funtzio)

Programa bakarra izan arren programak bi zati izango ditu. Lehen zatian emaitzik itzultzen ez duen funtzio bati dei egingo zaio eta programaren bigarren zatian zenbaki bat itzultzen duen funtzio bati dei egingo zaio.

Hau garrantzitsua da

Ez ahaztu, edozein ariketa programatzerakoan beti main() funtzio nagusitik hasiko garela, eta main() funtzio nagusia bukatzean jarraituko dugula azpiprograma guztien kodea idazten. Horregatik, bi adibide hauetan main() funtzio nagusiak ematen dira eta eskatzen da garatzea bakoitzari dagokion azpiprograma.



Lehen zatia. Fibonacciren sekuentzia osatuko duten zenbakien iZenbat kopurua teklatuz irakurri programa nagusian eta funtzio batek ondoko taularen pantailaraketa egin dezala FOR-DO egitura bat erabiliz, funtzioaren izena FibonaccirenSekuentziaPantailaratu() izan daiteke.

Hona hemen kodifikazioa non programa nagusia ematen den eta funtzioa falta den:

/* Ariketa-40a_FibonacciAzpiprogramaz: ezer itzultzen ez duen funtzioa. */

// Zenbaki osoekin lan eginez, FibonaccirenSekuentziaPantailaratu() funtzioak lan
// bat burutzen du (pantailaraketa) baina ez dio ezer itzultzen programa nagusiari. 

#include <stdio.h>

#define ZENBAKIKOPURUMAX 23 // Fibonacci zenbakien gehienezko kopurua

// Fibonacci sekuentzia pantailaratzeko funtzioa
void FibonaccirenSekuentziaPantailaratu(int iZenbat)
{
    // funtzioaren kodea hemen
}


// iKopurua (3 eta 24 artekoa) teklatuz irakurri eta Fibonacci zenbakien
// sekuentziaren horrenbeste elementu pantailaratuko dira 0-tik hasita
int main()
{
    int iKopurua;

    printf("\n\n");

    // zenbaki kopurua eskatu eta baieztatu
    do
    {
        printf("Fibonacci zenbakien kopurua eman (3 eta %d artekoa)\n", ZENBAKIKOPURUMAX);
        printf("eta 0-tik hasita Fibonacciren segida erakutsiko da: ");
        scanf("%d", &iKopurua);
    } while (iKopurua < 3 || iKopurua > ZENBAKIKOPURUMAX);

    // Fibonacci sekuentzia pantailaratu
    FibonaccirenSekuentziaPantailaratu(iKopurua);

    printf("\nPrograma bukatu da, irteteko RETURN sakatu\n");
    getchar(); // Return tekla itxaron

    return 0;
}

Programaren lehen zatiko irteera bat hau izan daiteke:




Bigarren zatia. Prozesu errepikakor bat izango da eta bertatik irteteko b edo B erantzun beharko da, bestela programa nagusian iMuga teklatuz irakurriko da eta funtzio batek kalkulatuko du 0-tik hasita zenbat Fibonacciren zenbaki dauden. Horretarako, WHILE-DO egitura bat edo DO_WHILE egitura bat erabiliko da fniFibonacciZenbakienKopuruaKalkulatu() izeneko funtzioan.

Hona hemen fniFibonacciZenbakienKopuruaKalkulatu() funtzioa bi modutan programatuta:

/* Ariketa-40b1_FibonacciAzpiprogramaz */

// Fibonacci zenbakien kopurua kalkulatzeko funtzioa
int FibonacciZenbakienKopuruaKalkulatu(int iMuga)
{
    int iFibo1 = 0, iFibo2 = 1, iFibo3 = iFibo1 + iFibo2;
    int iFiboKopuru;

    if (iMuga == 0)
        iFiboKopuru = 1;  // ez da while barrura sartuko
    else
        iFiboKopuru = 2;  // hasieraketa, while barruan inkrementatuko da

    iFibo1 = 0;
    iFibo2 = 1;
    iFibo3 = iFibo1 + iFibo2;
    while (iFibo3 <= iMuga)
    {
        iFibo1 = iFibo2;
        iFibo2 = iFibo3;
        iFibo3 = iFibo1 + iFibo2;
        iFiboKopuru++;
    }

    return iFiboKopuru;
}
/* Ariketa-40b2_FibonacciAzpiprogramaz */

// Fibonacci zenbakien kopurua kalkulatzeko funtzioa
void FibonacciZenbakienKopuruaKalkulatu(int iMuga, int *iFiboKopuru)
{
    int iFibo1 = 0, iFibo2 = 1, iFibo3 = iFibo1 + iFibo2;

    if (iMuga == 0)
        *iFiboKopuru = 1;  // ez da while barrura sartuko
    else
        *iFiboKopuru = 2;  // hasieraketa, while barruan inkrementatuko da

    iFibo1 = 0;
    iFibo2 = 1;
    iFibo3 = iFibo1 + iFibo2;
    while (iFibo3 <= iMuga)
    {
        iFibo1 = iFibo2;
        iFibo2 = iFibo3;
        iFibo3 = iFibo1 + iFibo2;
        (*iFiboKopuru)++;
    }
}

Programaren bigarren zatiko irteera bat hau izan daiteke:




Goiko bi programa horiek bukatu ondoren, saiatu zaitez bi ariketak programa bakar batean biltzen, hots, funtzionalitate guztiak betetzen dituen Programa Nagusi berria idatzi eta bi azpiprogramen kodea inportatu.







  • Ariketa-40a_FibonacciAzpiprogramaz.cbp | main.c
  • Ariketa-40b1_FibonacciAzpiprogramaz.cbp | main.c
  • Ariketa-40b2_FibonacciAzpiprogramaz.cbp | main.c
  • Ariketa-40c_FibonacciAzpiprogramaz.cbp | main.c       (errekurtsibitatea)


 

iruzkinik ez:

Argitaratu iruzkina