2025(e)ko otsailaren 18(a), asteartea

Ariketa 32 | Biderkari bat kalkulatzen

ZER DAKIDAN:
Dagoeneko for, do-while eta while agindu errepikakorra erabili ditut. Baina bakoitza edozein egoeratan erabil baiteke?



ZER IKASIKO DUDAN:
Prozesu errepikorraren iterazio kopurua ezaguna denean for agindu errepikakorra erabiliko dut. Aldiz, prozesu errepikorraren iterazio kopurua ezezaguna denean, do-while edo while agindu errepikakorrek erabiliko ditut.


Teklatuaren bitartez N zenbaki osoa eta positiboa irakurriz ondoko biderkariaren emaitza lortu:
Hau da, biderkagaien kopurua ezaguna denez FOR-DO agindua erabili ahal izango da, sarrerako datua 5 denean biderkaria hau delarik:

        (1 - 1/4) * (1 + 1/9) * (1 - 1/16) * (1 + 1/25) * ...
/* Ariketa-32a_Biderkaria_for: iterazio-kopuru ezaguna */

//----------------------------------------------------------------
// iMuga emanda biderkaria lortu:

//     fBiderkaria = (1 - 1/4) * (1 + 1/9) * (1 - 1/16) *  ...
//    iKontagailua ---->   2           3           4
//----------------------------------------------------------------

#include <stdio.h>

int main()
{
    int iMuga, iKontagailua;
    float fZeinua, fBiderkagaia, fBiderkaria;

    do  // mugaren balioa eskatu
    {
        printf("Muga adierazten duen zenbaki osoa eta positiboa eman: ");
        scanf("%d", &iMuga);
    } while (iMuga <= 0);

    printf("\n");

    // hasierako balioak
    fBiderkaria = 1.0;
    fZeinua = 1.0;

    for (iKontagailua = 2; iKontagailua <= iMuga; iKontagailua++)
    {
        fBiderkagaia = 1 - fZeinua / (iKontagailua * iKontagailua);
        fBiderkaria *= fBiderkagaia;

        printf("%3d. itzulian --->    Zeinua=%2.0f    Biderkagaia=%0.4f    Biderkaria=%0.4f\n",
               iKontagailua, fZeinua, fBiderkagaia, fBiderkaria);

        fZeinua *= -1; // zeinua aldatu
    }

    printf("\nBiderkaria = %0.4f\n", fBiderkaria);
    printf("\n");
    printf("=======================\n");
    printf("RETURN sakatu amaitzeko\n");
    printf("=======================\n");

    getchar(); // ENTER teklari itxaron (bufferra garbitzeko)
    getchar(); // edozein tekla sakatu programatik irteteko
    return 0;
}


Bigarren biderkari hau kalkulatzerakoan ez digute ematen biderkagaien kopurua. Horren ordez erabiltzaileak hauta dezake bi biderkarien (bi emaitzen) arteko aldea zein txikia izango den, hots, zenbat eta biderkagai gehiago aintzat hartu biderkaria zehatzagoa da baina gero eta garrantzi txikiago du beste biderkagai berri bat biderkatzeak. Hortaz, biderkagaiak joan biderkatzen jarraian erakusten den baldintza bete arte Abs(rAzkenEmaitza - rAurrekoEmaitza) < rDiferentzia non rDiferentzia teklatuaren bitartez irakurritako zenbaki erreala eta positiboa den, eta rAzkenEmaitza zein rAurrekoEmaitza programan kalkulatutako balioak diren.

Hona hemen batukaria do-while aginduaren bitartez kalkulatzen duen Ariketa-31b_Batukaria_do-while programaren kodea:

/* Ariketa-32b_Biderkaria_do-while: iterazio-kopuru ezezaguna */

//----------------------------------------------------------------
// Bi emaitzen arteko diferentzia emanda fBiderkaria lortu:
//     fBiderkaria = (1 - 1/4) * (1 + 1/9) * (1 - 1/16) *  ...
//    iKontagailua ---->   2           3           4
// Prozesu errepikorraren iterazio kopurua ez da ezagutzen. Hori
// dela eta, ariketa hau ezin daiteke egin for egitura erabiliz.
//----------------------------------------------------------------

#include <stdio.h>
#include <math.h> // fabs() funtziorako

int main()
{
    int iKontagailua;
    float fZeinua, fDiferentzia, fBiderkagaia, fBiderkaria, fAurrekoEmaitza, fAzkenEmaitza;

    do  // bi emaitzen arteko gehienezko diferentzia eskatu
    {
        printf("Eman bi emaitzen arteko diferentzia maximoa (adibidez, 0.003): ");
        scanf("%f", &fDiferentzia);
    } while (fDiferentzia <= 0);

    printf("\n");

    // hasierako balioak
    fBiderkaria = 1.0;
    fZeinua = 1.0;
    iKontagailua = 2;

    // lehen kalkulua begiztatik kanpo
    fBiderkagaia = 1 - fZeinua / (iKontagailua * iKontagailua);
    fBiderkaria *= fBiderkagaia;
    printf("%3d. itzulia  begiztatik kanpo,           Biderkaria=%0.4f\n", iKontagailua, fBiderkaria);

    do  // kalkulua egiten jarraitu diferentziaren irizpidea betetzen den arte
    {
        fAurrekoEmaitza = fBiderkaria;
        fZeinua *= -1; // Zeinua aldatu
        iKontagailua++;
        fBiderkagaia = 1 - fZeinua / (iKontagailua * iKontagailua);
        fBiderkaria *= fBiderkagaia;
        fAzkenEmaitza = fBiderkaria;

        printf("%3d. --->  Zeinua=%2.0f  Biderkagaia=%0.4f  Biderkaria=%0.4f  Diferentzia=%0.4f\n",
               iKontagailua, fZeinua, fBiderkagaia, fBiderkaria, fabs(fAzkenEmaitza - fAurrekoEmaitza));
    } while (fabs(fAzkenEmaitza - fAurrekoEmaitza) >= fDiferentzia);

    printf("\nBiderkaria = %0.4f\n", fBiderkaria);
    printf("\n");
    printf("=======================\n");
    printf("RETURN sakatu amaitzeko\n");
    printf("=======================\n");

    getchar(); // ENTER teklari itxaron (bufferra garbitzeko)
    getchar(); // edozein tekla sakatu programatik irteteko
    return 0;
}

Hona hemen batukaria while aginduaren bitartez kalkulatzen duen Ariketa-31c_Batukaria_while programaren kodea:

/* Ariketa-32c_Biderkaria_while: iterazio-kopuru ezezaguna */

//----------------------------------------------------------------
// Bi emaitzen arteko diferentzia emanda fBiderkaria lortu:
//     fBiderkaria = (1 - 1/4) * (1 + 1/9) * (1 - 1/16) *  ...
//    iKontagailua ---->   2           3           4
// Prozesu errepikorraren iterazio kopurua ez da ezagutzen. Hori
// dela eta, ariketa hau ezin daiteke egin for egitura erabiliz.
//----------------------------------------------------------------

#include <stdio.h>
#include <math.h> // fabs() funtziorako

int main()
{
    int iKontagailua;
    float fZeinua, fDiferentzia, fBiderkagaia, fBiderkaria, fAurrekoEmaitza, fAzkenEmaitza;

    printf("///////////////////////\n\n");

    do // emaitzen arteko gehienezko diferentzia eskatu
    {
        printf("Eman bi emaitzen arteko diferentzia maximoa (adibidez, 0.003): ");
        scanf("%f", &fDiferentzia);
    } while (fDiferentzia <= 0);

    printf("\n");

    // hasierako balioak
    fBiderkaria = 1.0;
    fZeinua = +1.0;
    iKontagailua = 2;

    // lehen kalkulua begiztatik kanpo
    fBiderkagaia = 1 - fZeinua / (iKontagailua * iKontagailua);
    fBiderkaria *= fBiderkagaia;
    printf("%3d. itzulia  begiztatik kanpo,         Batukaria=%7.4f\n", iKontagailua, fBiderkaria);
    fAurrekoEmaitza = fBiderkaria;

    // bigarren kalkulua begiztatik kanpo
    fZeinua = -1.0;
    iKontagailua = 3;
    fBiderkagaia = 1 - fZeinua / (iKontagailua * iKontagailua);
    fBiderkaria *= fBiderkagaia;
    printf("%3d. itzulia  begiztatik kanpo,         Batukaria=%7.4f\n", iKontagailua, fBiderkaria);
    fAzkenEmaitza = fBiderkaria;

    while (fabs(fAzkenEmaitza - fAurrekoEmaitza) > fDiferentzia)
    {
        fAurrekoEmaitza = fBiderkaria;
        fZeinua *= -1; // zeinua aldatu
        iKontagailua++;
        fBiderkagaia = 1 - fZeinua / (iKontagailua * iKontagailua);
        fBiderkaria *= fBiderkagaia;
        fAzkenEmaitza = fBiderkaria;

        printf("%3d. -->  Zeinua=%2.0f  Biderkagaia=%7.4f  Biderkaria=%7.4f  Dif.=%7.4f\n",
               iKontagailua, fZeinua, fBiderkagaia, fBiderkaria, fabs(fAzkenEmaitza - fAurrekoEmaitza));
    }

    printf("\n");
    printf("Biderkaria = %.4f\n", fBiderkaria);
    printf("\n");
    printf("=======================\n");
    printf("RETURN sakatu amaitzeko\n");
    printf("=======================\n");

    getchar(); // ENTER teklari itxaron (bufferra garbitzeko)
    getchar(); // edozein tekla sakatu programatik irteteko
    return 0;
}






  • Ariketa-32a_Biderkaria_for.cbp | main.c
  • Ariketa-32b_Biderkaria_do-while.cbp | main.c
  • Ariketa-32c_Biderkaria_while.cbp | main.c


 

iruzkinik ez:

Argitaratu iruzkina