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

Ariketa 31 | Batukari 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 S zenbaki osoa eta positiboa irakurriz ondoko batukariaren emaitza lortu:
Argi dagoenez, batugaien kopurua ezaguna denez for agindua erabili ahal izango da, sarrerako datua 7 denean batukaria hau delarik:

    -1/1    +1/4    -1/9    +1/16    -1/25    +1/36    -1/49
/* Ariketa-31a_Batukaria_for: iterazio-kopuru ezaguna */

//-----------------------------------------------------------------------------------
// iMuga emanda batukaria lortu:   fBatukaria = -1/1 +1/4 -1/9 + ... +1/(iMuga*iMuga)
//-----------------------------------------------------------------------------------

#include <stdio.h>

int main()
{
    int iMuga, iKontagailua;
    double fZeinua, fBatugaia, fBatukaria;

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

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

    printf("\n");

    fBatukaria = 0.0; // batukariaren hasierako balioa
    fZeinua = -1.0;   // hasierako zeinua

    // kalkulua burutu iterazio koputu jakin baten bidez
    for (iKontagailua = 1; iKontagailua <= iMuga; iKontagailua++)
    {
        fBatugaia = fZeinua / (iKontagailua * iKontagailua);
        fBatukaria += fBatugaia;

        printf("%3d. itzulian --->    Zeinua=%2.0f    Batugaia=%7.4f    Batukaria=%7.4f\n",
               iKontagailua, fZeinua, fBatugaia, fBatukaria);

        fZeinua *= -1; // Zeinua aldatzea
    }

    printf("\n");
    printf("Batukaria = %.4f\n", fBatukaria);

    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;
}


Batukari hau kalkulatzerakoan ez digute ematen batugaien kopurua. Horren ordez, bi batukarien arteko aldea zein txikia izango den erabiltzaileak hautatuko du, hots, zenbat eta batugai gehiago gehitu batukaria zehatzagoa da, baina beste batugai berri bat gehitzeak gero eta garrantzi txikiago du. Hortaz, baldintza honelako zerbait izango da: batugaiak joan gehitzen ondokoa bete arte fabs(fAzkenEmaitza - fAurrekoEmaitza) < fDiferentzia non fDiferentzia teklatuaren bitartez irakurritako zenbaki erreala eta positiboa den, eta fAzkenEmaitza zein fAurrekoEmaitza programan kalkulatutako balioak diren.
Iterazio jakin batean uneko batukaria fAzkenEmaitza da eta aurreko iterazioan batukaria fAurrekoEmaitza da, balio bien arteko diferentzia txikia izatean (adibidez 0.02) prozesu errepikakorra eten egingo da

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

/* Ariketa-31b_Batukaria_do-while: iterazio-kopuru ezezaguna */

//----------------------------------------------------------------
// Bi emaitzen arteko diferentzia emanda fBatukaria lortu:
//       fBatukaria = -1/1 +1/4 -1/9 +1/16 -1/25 + ...

// 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 rZeinua, fDiferentzia, fBatugaia, fBatukaria, 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
    fBatukaria = 0.0;
    rZeinua = -1.0;
    iKontagailua = 1;
    fBatugaia = rZeinua / (iKontagailua * iKontagailua);
    fBatukaria += fBatugaia;

    printf("%3d. itzulia  begiztatik kanpo,         Batukaria=%7.4f\n", iKontagailua, fBatukaria);

    do // kalkulua egiten jarraitu diferentziaren irizpidea betetzen den arte
    {
        fAurrekoEmaitza = fBatukaria;

        rZeinua *= -1; // Zeinua aldatu
        iKontagailua++;
        fBatugaia = rZeinua / (iKontagailua * iKontagailua);
        fBatukaria += fBatugaia;
        fAzkenEmaitza = fBatukaria;

        printf("%3d. --->  Zeinua=%2.0f  Batugaia=%7.4f  Batukaria=%7.4f  Diferentzia=%7.4f\n",
               iKontagailua, rZeinua, fBatugaia, fBatukaria, fabs(fAzkenEmaitza - fAurrekoEmaitza));
    } while (fabs(fAzkenEmaitza - fAurrekoEmaitza) >= fDiferentzia);

    printf("\n");
    printf("Batukaria = %.4f\n", fBatukaria);
    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-31c_Batukaria_while: iterazio-kopuru ezezaguna */

//----------------------------------------------------------------
// Bi emaitzen arteko diferentzia emanda fBatukaria lortu:
//       fBatukaria = -1/1 +1/4 -1/9 +1/16 -1/25 + ...

// 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, fBatugaia, fBatukaria, 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 balioa
    fBatukaria = 0.0;

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

    // bigarren kalkulua begiztatik kanpo
    fZeinua = +1.0;
    iKontagailua = 2;
    fBatugaia = fZeinua / (iKontagailua * iKontagailua);
    fBatukaria += fBatugaia;
    printf("%3d. itzulia  begiztatik kanpo,         Batukaria=%7.4f\n", iKontagailua, fBatukaria);
    fAzkenEmaitza = fBatukaria;

    while (fabs(fAzkenEmaitza - fAurrekoEmaitza) > fDiferentzia)
    {
        fAurrekoEmaitza = fBatukaria;
        fZeinua *= -1; // Zeinua aldatu
        iKontagailua++;
        fBatugaia = fZeinua / (iKontagailua * iKontagailua);
        fBatukaria += fBatugaia;
        fAzkenEmaitza = fBatukaria;

        printf("%3d. --->  Zeinua=%2.0f  Batugaia=%7.4f  Batukaria=%7.4f  Diferentzia=%7.4f\n",
               iKontagailua, fZeinua, fBatugaia, fBatukaria, fabs(fAzkenEmaitza - fAurrekoEmaitza));
    }

    printf("\n");
    printf("Batukaria = %.4f\n", fBatukaria);
    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-31a_Batukaria_for.cbp | main.c
  • Ariketa-31b_Batukaria_do-while.cbp | main.c
  • Ariketa-31c_Batukaria_while.cbp | main.c


 

iruzkinik ez:

Argitaratu iruzkina