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

Ariketa 43 | Menu bat azpiprogramaz (char)

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 cAukeraHautatu() funtzioan irakurtzen den karaktere bat izango da.







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


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


cAukeraHautatu() funtzioan irakurritako A edo a karakterea main() funtzio nagusira helduko da eta funtzio nagusian DiagonalkiPantailaratu() funtzioak sarreratzat behar duen karakterea irakurriko da (funtzio horrek datu bakar bat behar du, alfabeto larriaren letra bat). Lehen aukera hau amaitzeko, DiagonalkiPantailaratu() funtzioak jarraian erakusten den mezua emateko gai da:




cAukeraHautatu() funtzioan irakurritako B edo b karakterea main() funtzio nagusira helduko da eta funtzio nagusian TaulaPantailaratu() funtzioak sarreratzat behar duen zenbaki osoa irakurriko da (funtzio horrek datu bakar bat behar du, 0 eta 9 arteko zenbaki osoa). Bigarren aukera hau bukatzeko, TaulaPantailaratu() funtzioak jarraian erakusten den mezua emateko gai da:




cAukeraHautatu() funtzioan irakurritako C edo c karakterea main() funtzio nagusira helduko da eta funtzio nagusian dbErroKuboaKalkulatu() funtzioaren sarrera den zenbaki erreala irakurriko da (funtzio horrek datu bakar bat behar du, zenbaki erreala eta positiboa). dbErroKuboaKalkulatu() funtzioaren deia egin ondoren, main() funtzio nagusian jarraian erakusten den mezuaren bezalakoak agertuko dira:




cAukeraHautatu() funtzioan irakurritako D edo d karakterea main() funtzio nagusira helduko da eta funtzio nagusian boFibonaccikoaDa() funtzioaren sarrera den zenbaki osoa irakurriko da (funtzio horrek datu bakar bat behar du, 3 eta 17000 arteko zenbaki osoa). boFibonaccikoaDa() funtzioaren deia egin ondoren, main() funtzio nagusiari balio boolear itzuliko dio eta balio boolear (FALSE ala TRUE) eta horren arabera programak honelako mezuak erakutsiko ditu:






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

#include <stdio.h>
#include <stdlib.h>    // system() funtziorako
#include <conio.h>     // getche() funtziorako
#include <ctype.h>     // toupper() funtziorako
#include <math.h>      // fabs() funtziorako


char cAukeraHautatu(void);
void DiagonalkiPantailaratu(char);
void TaulaPantailaratu(int);
double dbErroKuboaKalkulatu(double);
int iFibonaccikoaDa(int);


int main()
{
    char cAukera, cLetra;
    int iZbk;
    double dbZbk, dbKuboa;

    do
    {
        system("cls");  // pantaila garbitu
        cAukera = cAukeraHautatu();

        printf("\n\n");
        switch (cAukera)
        {
            case 'A':
                do
                {
                    printf("A eta Z arteko letra bat eman: ");
                    scanf("%c", &cLetra);
                    cLetra = toupper(cLetra);
                } while (cLetra < 'A' || cLetra > 'Z');
                DiagonalkiPantailaratu(cLetra);
                break;
            case 'B':
                do
                {
                    printf("0 eta 9 arteko zenbaki osoa eman: ");
                    scanf("%d", &iZbk);

                } while (iZbk < 0 || iZbk > 9);
                TaulaPantailaratu(iZbk);
                break;
            case 'C':
                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 'D':
                do
                {
                    printf("3 eta 6000 arteko zenbaki osoa eman: ");
                    scanf("%d", &iZbk);
                } while (iZbk < 3 || iZbk > 6000);
                if (iFibonaccikoaDa(iZbk) == 0)
                    printf("Ez, %d ez da Fibonacciren sekuentziakoa\n\n", iZbk);
                else
                    printf("Bai, %d Fibonacciren sekuentziakoa da\n\n", iZbk);
                break;
            case 'I':
                printf("\nPrograma amaitzera doa...\n");
                break;
        }

        // getchar();   // soberan 79 lerrokoa getche() bada 
                        // derrigorrezkoa 79 lerrokoa getchar() bada
        if (cAukera != 'I')
        {
            printf("Emaitzak ikusi ahal izateko itxaroten... ");
            getche();  // itxaroteko
        }
    } while (cAukera != 'I');

    return 0;
}


char cAukeraHautatu()
{
    char cHautapena;

    printf("==========================Menua==========================\n");
    printf("  A   Alfabeto zatia diagonalki\n");
    printf("  B   Biderkatzeko taula marraztu\n");
    printf("  C   Zenbaki baten erro kuboa Newton-Raphson bitartez\n");
    printf("  D   Zenbaki bat Fibonacciren sekuentziakoa da?\n");
    printf("\n");
    printf("  I   Programatik irten\n");
    printf("=========================================================\n");
    printf("                                Zure aukera: ");

    do
    {
        cHautapena = getche();
        cHautapena = toupper(cHautapena);

        if ((cHautapena < 'A' || cHautapena > 'D') && cHautapena != 'I')
        {
            printf("\n\aAukera ez da ondo hautatu. Berriro aukeratu: ");
        }
    } while ((cHautapena < 'A' || cHautapena > 'D') && cHautapena != 'I');

    return cHautapena;
}


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)
{
    const double fEpsilon = 0.000000001;
    double dbKuboa = dbZbk / 3.0; // Lehendabiziko hurbilketa
    double dbAurrekoa;

    do
    {
        dbAurrekoa = dbKuboa;
        dbKuboa = (dbZbk / (dbAurrekoa * dbAurrekoa) + 2 * dbAurrekoa) / 3;
        dbKuboa = dbAurrekoa - (dbAurrekoa * dbAurrekoa * dbAurrekoa - dbZbk) / (3 * dbAurrekoa * dbAurrekoa);
    } while (fabs(dbKuboa - dbAurrekoa) > fEpsilon);

    return dbKuboa;
}


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

    while (iFibo3 < iZbk)
    {
        iFibo1 = iFibo2;
        iFibo2 = iFibo3;
        iFibo3 = iFibo1 + iFibo2;
        printf("\tiFibo3 = %4d \t\t (%4d == %d) = %d\n", iFibo3, iFibo3, iZbk, iFibo3 == iZbk);
    }
    // C lengoaian zero gezurra da eta, ondorioz, zero ez dena egia da
    return (iFibo3 == iZbk);
}





Gure programak egiterakoan, ondoko lau gomendio hauek jarraitu:

  1. Programaren exekuzioa geldiarazteko, hots, pantaila jakin batean itxaroteko getche() funtzioa aplikatu. Beraz, getchar() ez egin ezta getch().
  2. Karaktereak teklatuz irakurtzeko betiko scanf() funtzioa erabili. Beraz, getchar() ez egin ezta getche() edo getch().
  3. Karaktereak pantailan idazteko betiko printf() funtzioa erabili. Beraz, putchar() ez egin.
  4. Bufferra beti garbitu. Horretarako, scanf() guztien ostean fflush(stdin) egin.

Lau gomendio horiek kontutan izanik, goiko Ariketa-43b_MenuaAzpiprogramaz.cbp proiektua honelaxe geratzen da: Ariketa-43c_MenuaAzpiprogramaz.cbp proiektua.

 

iruzkinik ez:

Argitaratu iruzkina