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

Ariketa 43 | Menu bat azpiprogramaz (int)

ZER DAKIDAN:
switch baldintzazko egitura ikasi nuen aukera anitzak antolatzeko (Ariketa 18 | Aukera anitzen arteko hautapena adibidea eta Ariketa 36 | Hainbat aukeren menu bat adibidea gogoratzen ditut).



ZER IKASIKO DUDAN:
Menu bat programatuko dut funtzioak erabiliz, erabiltzaileak gogoko duen hautapena iAukeraHautatu() funtzioan irakurtzen den karaktere bat izango da.







Lau aukera dituen menu batek gidatuko du programa. Aukerak hautatzeko zenbaki osoak erabiltzen dira eta lau aukeretatik batek programa bukarazten du. Hautatutako aukerari esker switch agindu baten bitartez programaren exekuzioa gidatzen da (Ariketa 18 | Aukera anitzen arteko hautapena gogoratu). Menua pantailan aurkezteko lana eta erabiltzailearen aukeraren bat hautatzeko lana iAukeraHautatu() izeneko funtzioak egiten du:

iAukeraHautatu() funtzioaren lana: Menua aurkeztu eta aukera hautatu

Lehenik idatzi behar dugun main() funtzio nagusia, funtsean, prozesu errepikakor bat da, errepikapenak eteteko eta programatik irteteko 0 balioa sartu behar da. Deskriba ditzagun, banan-banan gainerako hiru aukerak, eta ikus dezagun ere programa osoaren kodea.


iAukeraHautatu() funtzioan irakurritako 1 balioa main() funtzio nagusira helduko da eta funtzio nagusian DiagonalkiPantailaratu() funtzioak sarreratzat behar duen zenbaki osoa irakurriko da (funtzio horrek datu bakar bat behar du, 3 eta 17000 arteko zenbaki oso bat). Lehen aukera hau amaitzeko, DiagonalkiPantailaratu() funtzioak jarraian erakusten den mezua emateko gai da:

Laranjaz main() funtziokoa eta urdinez iFibonaccikoaDa() funtziokoa



iAukeraHautatu() funtzioan irakurritako 2 balioa main() funtzio nagusira helduko da, ondoren, dbErroKuboaKalkulatu() funtzioak sarreratzat behar duen zenbaki erreala irakurriko da main() funtzio nagusian eta bere kuboaren balioa erakutsiko da ere. Emaitza lortzen duen dbErroKuboaKalkulatu() funtzioak pantailan erakusten duena urdinez markatu da jarraian erakusten den irudian:

Laranjaz main() funtziokoa eta urdinez fKosinuaKalkulatu() funtziokoa



iAukeraHautatu() funtzioan irakurritako 3 balioa main() funtzio nagusira helduko da, ondoren, fKosinuaKalkulatu() funtzioak sarreratzat behar duen zenbaki erreala irakurriko da main() funtzio nagusian eta bere kuboaren balioa erakutsiko da ere. Emaitza lortzen duen fKosinuaKalkulatu() funtzioak pantailan erakusten duena urdinez markatu da jarraian erakusten den irudian:

Laranjaz main() funtziokoa eta urdinez dbErroKuboaKalkulatu() funtziokoa





Hona hemen Ariketa-43a_MenuaAzpiprogramaz.cbp proiektuaren iturburu-programa:
/* Ariketa-43a_MenuaAzpiprogramaz: menuaren aukeratzailea int datu-motakoa */

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

#define EPSILON_1 0.0005     // bost hamarmilaren
#define EPSILON_2 0.0000001  // miloiaren bat

int iAukeraHautatu(void);
double dbErroKuboaKalkulatu(double);
int iFibonaccikoaDa(int);
float fBerreketa(float fOinarria, int iAldiak);
long liFaktoriala(int iMuga);
float fKosinuaKalkulatu(float fX);


int main()
{
    int iAukera;
    int iZbk;
    double dbZbk, dbKuboa;
    float fAng, fX, fKosinua;

    do
    {
        system("cls");  // pantaila garbitu
        iAukera = iAukeraHautatu();

        printf("\n");
        switch (iAukera)
        {
            case 1:
                do
                {
                    printf("3 eta 17000 arteko zenbaki osoa eman: ");
                    scanf("%d", &iZbk);
                } while (iZbk < 3 || iZbk > 17000);
                if (iFibonaccikoaDa(iZbk) == 1)
                    printf("%d Fibonacciren sekuentziakoa da\n\n", iZbk);
                else
                    printf("%d ez da Fibonacciren sekuentziakoa\n\n", iZbk);
                break;
            case 2:
                do
                {
                    printf("Zenbaki erreala eta positiboa eman: ");
                    scanf("%lf", &dbZbk);
                } while (dbZbk < 0.0);
                dbKuboa = dbErroKuboaKalkulatu(dbZbk);
                printf("%0.5f-ren erro kuboa: %0.5f\n\n", dbZbk, dbKuboa);
                break;
            case 3:
                printf("1. koadranteko angelu baten kosinua kalkulatu %.4f prezisioarekin\n\n", EPSILON_1);

                do
                {
                    printf("1. koadranteko angelua graduetan: ");
                    scanf("%f", &fAng);
                } while (fAng < 0.0 || fAng >= 90.0);

                fX = fAng * 2 * M_PI / 360; // graduak radianetara bihurtu
                printf("Angelua radianetan: %8.5f\n", fX);

                fKosinua = fKosinuaKalkulatu(fX);

                printf("\n");
                printf("Gure programaz lortutako kosinua[%.3f gradu] -----> %7.5f\n", fAng, fKosinua);
                printf("cos() funtzioak ematen duena cos(%.3f gradu) -----> %7.5f\n", fAng, cos(fX));
                printf("\n");
                break;
            case 0:
                printf("Programa amaitzera doa. Edozein tekla sakatu.\n");
                break;
        }

        getchar(); // bufferrean jarritako return karakterea hartzen du
        if (iAukera != 0)
        {
            printf("Emaitzak ikusi ahal izateko itxaroten, aurrera egiteko INTRO sakatu... ");
            getchar();  // itxaroteko
        }
    } while (iAukera != 0);

    return 0;
}


int iAukeraHautatu()
{
    int iHautapena;

    printf("============================Menua=============================\n");
    printf("  1   Zenbaki bat Fibonacci-ren sekuentziakoa da\n");
    printf("  2   Zenbaki baten erro kuboa Newton-Raphson bitartez\n");
    printf("  3   Lehen koadranteko angelu baten kosinua Taylor bitartez\n");
    printf("\n");
    printf("  0   Programatik irten\n");
    printf("==============================================================\n");
    printf("                                Zure aukera: ");

    do
    {
        scanf("%d", &iHautapena);
        if (iHautapena < 0 || iHautapena > 3)
        {
            printf("Aukera ez da ondo hautatu. Berriro aukeratu: ");
        }
    } while (iHautapena < 0 || iHautapena > 3);

    return iHautapena;
}


void DiagonalkiPantailaratu(char cLetra)
{
    printf("Alfabeto zatia diagonalki pantailaratu:\n");

    int iNon = 15;
    for (char k = 'A'; k <= cLetra; k++)
    {
        printf("%*c\n", iNon, k);
        iNon++;
    }
    printf("\n");
}


void TaulaPantailaratu(int iZbk)
{
    printf("%d zenbakiaren biderkatzeko taula:\n", iZbk);
    for (int k = 1; k <= 10; k++)
    {
        printf("%35d x %d = %2d\n", k, iZbk, k * iZbk);
    }
    printf("\n");
}


double dbErroKuboaKalkulatu(double dbZbk)
{
    double dbKuboa = dbZbk / 3.0; // Lehendabiziko hurbilketa
    double dbAurrekoa;
    int iIterazioa = 1;

    do
    {
        dbAurrekoa = dbKuboa;
        dbKuboa = (dbZbk / (dbAurrekoa * dbAurrekoa) + 2 * dbAurrekoa) / 3;
        dbKuboa = dbAurrekoa - (dbAurrekoa * dbAurrekoa * dbAurrekoa - dbZbk) / (3 * dbAurrekoa * dbAurrekoa);
        printf("%d. iterazioan...   kuboa = %.9lf  eta  errorea = %.9lf\n", iIterazioa, dbKuboa, fabs(dbKuboa - dbAurrekoa));
        iIterazioa++;
    } while (fabs(dbKuboa - dbAurrekoa) > EPSILON_2);

    return dbKuboa;
}


int iFibonaccikoaDa(int iZbk)
{
    int iFibo1 = 0;
    int iFibo2 = 1;
    int iFibo3 = iFibo1 + iFibo2;

    while (iFibo3 < iZbk)
    {
        iFibo1 = iFibo2;
        iFibo2 = iFibo3;
        iFibo3 = iFibo1 + iFibo2;
        printf("iFibo3 = %8d\n", iFibo3);
    }

    if (iFibo3 == iZbk)
        return 1;
    else
        return 0;
}


float fBerreketa(float fOinarria, int iAldiak)
{
    float fMetagailua = 1.0;
    int i;

    for (i = 0; i < iAldiak; i++)
    {
        fMetagailua *= fOinarria;
    }
    return fMetagailua;
}


long liFaktoriala(int iMuga)
{
    long liMetagailua = 1;
    int i;

    for (i = 1; i <= iMuga; i++)
    {
        liMetagailua *= i;
    }
    return liMetagailua;
}


float fKosinuaKalkulatu(float fX)
{
    int iKont = 0;
    float fKosinua = 0.0;
    float rBatugai = 1.0;
    long int liFaktoreak;
    float fBerredura;
    float fZeinua;

    while (fabs(rBatugai) > EPSILON_1)
    {
        fKosinua += rBatugai;
        iKont += 2;

        liFaktoreak = liFaktoriala(iKont);
        fBerredura = fBerreketa(fX, iKont);
        fZeinua = fBerreketa(-1, iKont / 2);

        rBatugai = fZeinua * fBerredura / liFaktoreak;
        printf("%d. iterazioan ==>  kosinua: %8.5f | batugaia: %8.5f | aldea: %8.5f\n", iKont/2, fKosinua, rBatugai, fabs(fabs(rBatugai) - EPSILON_1));
    }
    return fKosinua;
}
 
 

iruzkinik ez:

Argitaratu iruzkina