2025(e)ko maiatzaren 29(a), osteguna

2025-06-27ko ekaineko azterketa (Antol. eta Ingur.)


  2025/06/27, testa

2025eko Ekainaren deialdiko teoria

  1-A   |   2-B   |   3-D   |   4-B   |   5-D   |   6-B   |   7-D  


Galderei dagozkien programak:



  2025/06/27, programa (Antolakuntza eta Ingurugiroa)

2025eko Ekainaren deialdiko programa: Gorputz-Masaren Indizea


Azterketa ariketari lotutako informazioa. Proiektuak informazioa gordetzen duten bi datu-motako fitxategiak behar ditu:

  • Batetik, Gorputz-Masaren Indizea adierazteko kategorien fitxategia. Adibidez GMI-8_Kategoriak.dat estrukturen datu-fitxategia, non hainbat kategorien ezaugarriak gordetzen diren: kategoriaren izena, kategoriaren mugak eta osasuna hobetzeko gomendioa
  • Bestetik, enpresa bateko langileen datuak biltzen dituen fitxategia, 5 eremuko estrukturen fitxategia da. Adibidez Langileak.dat estrukturen datu-fitxategia


Hona hemen main.c fitxategiaren kodea, non lehenik liburutegien sartzeak eta konstanteen deklarazioak egiten diren (include zuzentarauari esker eta define zuzentarauari esker, hurrenez hurren), gero estrukturen datu-motak definitzen dira, ondoren funtzioen prototipoak idazten dira eta jarraian main() funtzioa eta gainerako funtzioak garatzen dira:

/*=========================================================================================
    Data: 2025eko ekainaren 5a

    Deskribapena: Informatika azterketa
                  2024-25 ikasturteko ohiko deialdia
                  Bilbo, 2025eko ekainaren 27a

       Graduak: - Industria Antolakuntzaren Ingeniaritzako Gradua
                - Ingurumen Ingeniaritzako Gradua

	Bertsioaren Ezaugarriak:
                - "GMI-8_kategoriak.dat" datu-fitxategia aldez aurretik sortuta dago
                - "Fundizio_langileak.dat" datu-fitxategia aldez aurretik sortuta dago
===========================================================================================*/

#include <stdio.h>
#include <conio.h>   // getche()
#include <string.h>

#define TRUE  1
#define FALSE 0

//Estruktura, datu-mota orokorrak---------------------------------------------------
struct tstHeina
{
    float fBehemuga;
    float fGoimuga;
};
struct tstKategoria
{
    char sKategoriaIzena[30];
    struct tstHeina stHeina;
    char sGomendioa[128];
};
struct tstLangilea
{
    char sIdentif[20];
    float fMasa;
    float fAltuera;
    float fGMI;
    char sKategoria[30];
};


//Prototipoak-----------------------------------------------------------------------
char cMenua();
int iFitxategirikBada(const char *sFitxIzen);
void FitxategiArrayKategoriak(const char *sFitxIzenKategoriak,
                              struct tstKategoria astKategoriak[],
                              int *iZenbatKategoria);
void ArrayKategoriakErakutsi(const struct tstKategoria astKategoriak[],
                             int iZenbatKategoria);
void KategoriaBatErakutsi(const struct tstKategoria *stKategoriaBat, int iKont);
void LangileBatenDatuakJaso(struct tstLangilea *stLangileBat);
void LangileBatFitxategiraGehitu(const char *sFitxIzenLangileak,
                                 const struct tstLangilea *stLangileBat);
void GMI_KategoriakKalkulatu(const char *sFitxIzenLangileak,
                             const struct tstKategoria astKategoriak[],
                             int iZenbatKategoria);
int GMI_PosizioaLortu(float fGMI_indizea,
                      const struct tstKategoria astKategoriak[],
                      int iZenbatKategoria);
int iBilatu(const char *sFitxIzenLangileak,
            const char *sIdentifikadorea,
            struct tstLangilea *stLangilea);
float fKiloakIrabazi(const struct tstLangilea *stLangileBat,
                     float fGoikoIndizea);
float fKiloakGaldu(const struct tstLangilea *stLangileBat,
                   float fBehekoIndizea);
void GMI_KategoriakGarbitu(const char *sFitxIzenLangileak);
void Mezua(const char *sKategorienIzena, int iZenbatKategoria);
void LangileBatErakutsi(const struct tstLangilea *stLangileBat,
                        int iKont);
void Langileak_FitxategiaIkusi(const char *sFitxIzenLangileak);


//Funtzio nagusia-------------------------------------------------------------------
int main()
{
    char sKategorienIzena[20];
    char sFitxIzenKategoriak[100];
    char sFitxIzenLangileak[100];
    char cAukera;
    struct tstKategoria astKategoriak[10];
    int iZenbatKategoria;
    struct tstLangilea stLangileBat;
    char sIdentifikadorea[20];
    int iPosizioa;
    struct tstLangilea stLangilea;
    float fKiloak;
    float fGoikoIndizea;
    float fBehekoIndizea;

    printf(" Kategorien fitxategiaren izena (adibidez, 'GMI-8'): ");
    gets(sKategorienIzena);
    strcpy(sFitxIzenKategoriak, sKategorienIzena);
    strcat(sFitxIzenKategoriak, "_kategoriak.dat");
    printf(" Langileen fitxategiaren izena (adibidez, 'Fundizio'): ");
    gets(sFitxIzenLangileak);
    strcat(sFitxIzenLangileak, "_langileak.dat");

    if (iFitxategirikBada(sFitxIzenKategoriak) && iFitxategirikBada(sFitxIzenLangileak))
    {
        FitxategiArrayKategoriak(sFitxIzenKategoriak, astKategoriak, &iZenbatKategoria);
        do
        {
            cAukera = cMenua();
            switch (cAukera)
            {
                case '1':   LangileBatenDatuakJaso(&stLangileBat);
                            LangileBatFitxategiraGehitu(sFitxIzenLangileak, &stLangileBat);
                            break;
                case '2':   GMI_KategoriakKalkulatu(sFitxIzenLangileak, astKategoriak, iZenbatKategoria);
                            break;
                case '3':   printf("\n Langilearen identifikadorea (025-Xabier adibidez): ");
                            gets(sIdentifikadorea);
                            if (iBilatu(sFitxIzenLangileak, sIdentifikadorea, &stLangilea) == FALSE)
                                printf("\n '%s' identifikadoreko langilerik ez dago!!!\a\n", sIdentifikadorea);
                            else
                            {
                                iPosizioa = GMI_PosizioaLortu(stLangilea.fGMI, astKategoriak, iZenbatKategoria);
                                printf("\n %s-(r)entzat gomendioa:", sIdentifikadorea);
                                printf("\n |%s|", astKategoriak[iPosizioa].sGomendioa);
                                printf("\n |%s|", astKategoriak[iPosizioa].sKategoriaIzena);
                                printf("\n |%c| da kategoriaren hasiera: ", astKategoriak[iPosizioa].sKategoriaIzena[0]);
                                if (astKategoriak[iPosizioa].sKategoriaIzena[0] == 'A')
                                {
                                    printf("ARGALA!");
                                    fGoikoIndizea = astKategoriak[iPosizioa].stHeina.fGoimuga;
                                    fKiloak = fKiloakIrabazi(&stLangilea, fGoikoIndizea);
                                    printf("\n %.2f Kg irabaziz zure GMI '%s' izango da\n", fKiloak, astKategoriak[iPosizioa+1].sKategoriaIzena);
                                }
                                else if (astKategoriak[iPosizioa].sKategoriaIzena[0] == '0' ||
                                         astKategoriak[iPosizioa].sKategoriaIzena[0] == 'I')
                                {
                                    printf("LODIA!");
                                    fBehekoIndizea = astKategoriak[iPosizioa].stHeina.fBehemuga;
                                    fKiloak = fKiloakGaldu(&stLangilea, fBehekoIndizea);
                                    printf("\n %.2f Kg galduz zure GMI '%s' izango da\n", fKiloak, astKategoriak[iPosizioa-1].sKategoriaIzena);
                                }
                                else
                                    printf("MASA NORMALA!");
                            }
                            break;
                case '4':   Langileak_FitxategiaIkusi(sFitxIzenLangileak);
                            break;
                case '5':   GMI_KategoriakGarbitu(sFitxIzenLangileak);
                            break;
                case '6':   Mezua(sKategorienIzena, iZenbatKategoria);
                            ArrayKategoriakErakutsi(astKategoriak, iZenbatKategoria);
                            break;
                case '0':   printf("\nProgramaren amaiera!");
                            break;
                default:    printf("\n\aERROREA! aukera hori desegokia da\n");
            }
        } while (cAukera!='0');
    }
    else
    {
        if (iFitxategirikBada(sFitxIzenKategoriak)==FALSE)
            printf("\nERROREA! '%s' izeneko fitxategirik ez dago!", sFitxIzenKategoriak);
        if (iFitxategirikBada(sFitxIzenLangileak)==FALSE)
            printf("\nERROREA! '%s' izeneko fitxategirik ez dago!", sFitxIzenLangileak);
    }

    printf("\n\n");
    return 0;
}

//Funtzioak-------------------------------------------------------------------------
char cMenua()
{
    char cAukera;

    printf("\n   =============================================================");
    printf("\n   |                     PROGRAMAREN MENUA                     |");
    printf("\n   =============================================================");
    printf("\n   |  1. Langile berri baten datuak gehitu                     |");
    printf("\n   |  2. Langile guztientzat kategoriak kalkulatu              |");
    printf("\n   |  3. Langile baten kategoria hobetzeko gomendioa erakutsi  |");
    printf("\n   |  4. Langile guztien datuak pantailaratu                   |");
    printf("\n   |  5. Langile guztientzat kategoriak garbitu                |");
    printf("\n   |  6. Kategoriak ikusi                                      |");
    printf("\n   |  0. Irten                                                 |");
    printf("\n   =============================================================\n");
    printf("\t Zure aukera: ");
    cAukera = getche();
	printf("\n");

    return (cAukera);
}

int iFitxategirikBada(const char *sFitxIzen)
{
    FILE *erakFitx;
    int boBaiBada;

    erakFitx=fopen(sFitxIzen,"rb");

    if (erakFitx!=NULL)
    {
        boBaiBada=TRUE;
        fclose(erakFitx);
    }
    else
        boBaiBada=FALSE;

    return boBaiBada;
}


void FitxategiArrayKategoriak(const char *sFitxIzenKategoriak,
                              struct tstKategoria astKategoriak[],
                              int *iZenbatKategoria)
{
    FILE *fbKategFitx;
    struct tstKategoria stKategoriaBat;

    fbKategFitx = fopen(sFitxIzenKategoriak,"rb");

    *iZenbatKategoria = -1;
    while (fread(&stKategoriaBat, sizeof(stKategoriaBat), 1, fbKategFitx)==1)
    {
        (*iZenbatKategoria)++;
        astKategoriak[*iZenbatKategoria] = stKategoriaBat;
    }
    (*iZenbatKategoria)++;
    fclose(fbKategFitx);
}


/* Langile baten datuak lortu. */
void LangileBatenDatuakJaso(struct tstLangilea *stLangileBat)
{
    printf("\n   Langilearen identifikadorea eman: ");
    gets(stLangileBat->sIdentif);
    fflush(stdin);
    printf("         Langilearen masa (Kg) eman: ");
    scanf("%f", &stLangileBat->fMasa);
    printf("       Langilearen altuera (m) eman: ");
    scanf("%f", &stLangileBat->fAltuera);
    fflush(stdin);
    stLangileBat->fGMI = stLangileBat->fMasa / (stLangileBat->fAltuera*stLangileBat->fAltuera);
    strcpy(stLangileBat->sKategoria, "");
}


void LangileBatFitxategiraGehitu(const char *sFitxIzenLangileak,
                                 const struct tstLangilea *stLangileBat)
{
    FILE *fbLangileFitx;

    fbLangileFitx = fopen(sFitxIzenLangileak,"r+b");
    fseek(fbLangileFitx, 0L, SEEK_END);
    fwrite(stLangileBat, sizeof(struct tstLangilea), 1, fbLangileFitx);

    fclose(fbLangileFitx);
}


void GMI_KategoriakKalkulatu(const char *sFitxIzenLangileak,
                             const struct tstKategoria astKategoriak[],
                             int iZenbatKategoria)
{
    FILE *fbLangileFitx;
    struct tstLangilea stLangileBat;
    int iPosizioa;

    fbLangileFitx = fopen(sFitxIzenLangileak,"r+b");

    while (fread(&stLangileBat, sizeof(stLangileBat), 1, fbLangileFitx)!=0)
    {
        iPosizioa = GMI_PosizioaLortu(stLangileBat.fGMI, astKategoriak, iZenbatKategoria);
        printf("\niPosizioa = %d          Kategoriaren izena: [___%s___]", iPosizioa, astKategoriak[iPosizioa].sKategoriaIzena);
        printf("\nAurrera egiteko edozein tekla sakatu...\n" );
        getche();  // Itxaroteko
        strcpy(stLangileBat.sKategoria, astKategoriak[iPosizioa].sKategoriaIzena);
        fseek(fbLangileFitx, -1*(long)sizeof(stLangileBat), SEEK_CUR);
        fwrite(&stLangileBat, sizeof(stLangileBat), 1, fbLangileFitx);
        fseek(fbLangileFitx, 0L, SEEK_CUR);   // Fitxategiko erakuslea eguneratu
    }

    fclose(fbLangileFitx);
}


int GMI_PosizioaLortu(float fGMI_indizea,
                      const struct tstKategoria astKategoriak[],
                      int iZenbatKategoria)
{
    int k = 0;

    do
    {
        printf("\nPosizioa lortzeko:    k=%d    fGMI=%5.2f    fBehe=%5.2f    fGoi=%5.2f",
                                        k,
                                        fGMI_indizea,
                                        astKategoriak[k].stHeina.fBehemuga,
                                        astKategoriak[k].stHeina.fGoimuga);
      k = k + 1;
    } while (fGMI_indizea >= astKategoriak[k].stHeina.fBehemuga &&
             k < iZenbatKategoria);

    return k-1;
}


int iBilatu(const char *sFitxIzenLangileak,
            const char *sIdentifikadorea,
            struct tstLangilea *stLangilea)
{
    FILE *fbLangileFitx;
    struct tstLangilea stLangileBat;

    fbLangileFitx = fopen(sFitxIzenLangileak,"rb");

    while (fread(&stLangileBat, sizeof(stLangileBat), 1, fbLangileFitx)==1)
    {
        if (strcmp(stLangileBat.sIdentif, sIdentifikadorea)==0)
        {
            fclose(fbLangileFitx);
            *stLangilea = stLangileBat;
            return TRUE;
        }
    }

    fclose(fbLangileFitx);
    return FALSE;
}


float fKiloakIrabazi(const struct tstLangilea *stLangileBat,
                     float fGoikoIndizea)
{
    float fHelburukoMasa;
    float fAkenKiloak;

    fHelburukoMasa = fGoikoIndizea*stLangileBat->fAltuera*stLangileBat->fAltuera;
    printf("\n (fKiloakIrabazi)   fHelburukoMasa=%.2f Kg     LangileMasa=%.2f Kg",
           fHelburukoMasa,
           stLangileBat->fMasa);
    fAkenKiloak = fHelburukoMasa - stLangileBat->fMasa;  // balio positiboa

    return fAkenKiloak;
}


float fKiloakGaldu(const struct tstLangilea *stLangileBat,
                   float fBehekoIndizea)
{
    float fHelburukoMasa;
    float fAkenKiloak;

    fHelburukoMasa = fBehekoIndizea*stLangileBat->fAltuera*stLangileBat->fAltuera;
    printf("\n (fKiloakGaldu)   fHelburukoMasa=%.2f Kg       LangileMasa=%.2f Kg",
           fHelburukoMasa,
           stLangileBat->fMasa);
    fAkenKiloak = stLangileBat->fMasa - fHelburukoMasa;  // balio positiboa

    return fAkenKiloak;
}


void GMI_KategoriakGarbitu(const char *sFitxIzenLangileak)
{
    FILE *fbLangileFitx;
    struct tstLangilea stLangileBat;

    fbLangileFitx = fopen(sFitxIzenLangileak, "r+b");

    while (fread(&stLangileBat, sizeof(stLangileBat), 1, fbLangileFitx)==1)
    {
        strcpy(stLangileBat.sKategoria, "");
        fseek(fbLangileFitx, -1*(long)sizeof(stLangileBat), SEEK_CUR);
        fwrite(&stLangileBat, sizeof(stLangileBat), 1, fbLangileFitx);
        fseek(fbLangileFitx, 0L, SEEK_CUR);   // Fitxategiko erakuslea eguneratu
    }

    fclose(fbLangileFitx);
}


/* Langileen fitxategia erakutsi. */
void Langileak_FitxategiaIkusi(const char *sFitxIzenLangileak)
{
    FILE *fbLangileFitx;
    struct tstLangilea stLangileBat;
    int iKont;

    fbLangileFitx = fopen(sFitxIzenLangileak, "rb");

    iKont = 1;
    printf("\n===============================================================================");
    printf("\n%20s%11s%10s%10s%21s\n", "Langilea (NAN)", "Masa(Kg)", "Alt.(m)", "G-M Ind", "Kategoriaren izena");
    printf("      --------------   --------   -------   -------   ------------------\n");
    while (fread(&stLangileBat, sizeof(stLangileBat), 1, fbLangileFitx)==1)
    {
        LangileBatErakutsi(&stLangileBat, iKont);
        iKont++;
    }
    printf("===============================================================================\n");

    fclose(fbLangileFitx);
}


/* Langileen baten datuak pantailaratu. */
void LangileBatErakutsi(const struct tstLangilea *stLangileBat, int iKont)
{
    printf("%4d", iKont);
    printf("     %-11s", stLangileBat->sIdentif);
    printf("%11.2f%10.2f%10.2f", stLangileBat->fMasa,
                                 stLangileBat->fAltuera,
                                 stLangileBat->fGMI);
    printf("   %s\n", stLangileBat->sKategoria);
}


void Mezua(const char *sKategorienIzena, int iZenbatKategoria)
{
    printf("\n///////////////////////////////////////////////////////////////////////////////");
    printf("\n|                '%s' kategorien sortan %d tarte daude                      |", sKategorienIzena, iZenbatKategoria);
    printf("\n///////////////////////////////////////////////////////////////////////////////");
    printf("\n|     Kategoria                   Heina                  Gomendioa            |");
    printf("\n---------------------------   -------------   ---------------------------------\n");
}


void ArrayKategoriakErakutsi(const struct tstKategoria astKategoriak[],
                             int iZenbatKategoria)
{
    int iKont;

    for (iKont=0; iKont<iZenbatKategoria; iKont++)
    {
        KategoriaBatErakutsi(&astKategoriak[iKont], iKont);
    }
    printf("///////////////////////////////////////////////////////////////////////////////\n");
}


void KategoriaBatErakutsi(const struct tstKategoria *stKategoriaBat, int iKont)
{
    char sGomendioZatia[128];

    printf("|%3d", iKont);
    printf("  %-24s", stKategoriaBat->sKategoriaIzena);
    printf("%5.2f - %5.2f", stKategoriaBat->stHeina.fBehemuga,
                              stKategoriaBat->stHeina.fGoimuga);
    strcpy(sGomendioZatia, stKategoriaBat->sGomendioa);
    if (strlen(sGomendioZatia) > 30)
    {
        sGomendioZatia[28] = '.';
        sGomendioZatia[29] = '.';
        sGomendioZatia[30] = '.';
        sGomendioZatia[31] = ' ';
        sGomendioZatia[32] = '|';
        sGomendioZatia[33] = '\0';
    }
    else
    {
        for (int i=strlen(sGomendioZatia); i<33; i++)
            sGomendioZatia[i] = ' ';
        sGomendioZatia[32] = '|';
        sGomendioZatia[33] = '\0';
    }
    printf("   %-30s\n", sGomendioZatia);
}


GMI indizearen balioak mailakatu egiten dira obesitatearen arabera, eta jakina denez honek lotura estua dauka osasunarekin.

Enpresa bateko langileen obesitate-ikerketa egin nahi da, horretarako obesitatearen kategoria desberdinak fitxategi batean definiturik daude (adibidez, GMI-8_Kategoriak.dat izeneko fitxategian). Fitxategiaren elementuak estrukturak dira eta bakoitzak kategoria baten informazioa gordetzen du. Kategorien fitxategiaren oinarria den tstKategoria estruktura honela definiturik dago:

struct tstHeina
{
    float fBehemuga;
    float fGoimuga;
};
struct tstKategoria
{
    char sKategoriaIzena[30];  // Kategoriaren izena
    struct tstHeina stHeina;   // Kategoria jakin batetarako GMI indizearen mugak
    char sGomendioa[128];      // Osasuna hobetzeko kategoria honi dagokion gomendioa
};

Kategorien fitxategia ordenaturik dago stHeina eremuak duen behe mugaren arabera. Kategorien kopurua ez da finkoa (beraz, fitxategiaren elementuen kopurua ez da finkoa), erabilitako mailaketaren arabera kategorien kopurua aldakorra izan daitekeelako (goiko adibidean elementuak 8 dira). Jakina da kategorien kopurua gehien-gehienez 10 izango dela.

Hau izan daiteke GMI-8_Kategoriak.dat kategorien fitxategian biltzen den informazioa:

Munduko Osasun Erakundeak 8 kategoriako Gorputz-Masaren Indizeak erabiltzen ditu.


Enpresako langileen obesitate-ikerketa burutzeko, langileen fitxategia prozesatuko da (adibidez, Langileak.dat izeneko fitxategia). Langileen fitxategiaren elementuak estrukturak dira ere eta tstLangilea estruktura honela definiturik dago:

struct tstLangilea
{
    char sIdentif[20];    // Langilearen identifikadorea
    float fMasa;          // Langilearen masa kilogramoetan
    float fAltuera;       // Langilearen altuera edo garaiera metroetan.
    float fGMI;           // Gorpuz-Masaren Indizea da eta bere balioa lortu ahal izateko fMasa eta rfAltuera aintzat hartuko dira
    char sKategoria[30];  // GMI indizeari dagokion kategoriaren izena, hasieran hutsik
};

Hau izan daiteke Langileak.dat enpresako fitxategian biltzen den informazioa prozesaketa baino lehen:

Langileen fitxategiak 12 elementu ditu hasieran eta sKategoria delako azken eremuan kate hutsa dago.


Programak, hasieran, GMI kategorien fitxategiari dagokion izena eskatu du, eta langileen fitxategiari dagokion izena eskatuko du. Bi fitxategietako bat falta bada, programa amaituko litzateke mezu bat pantailaratuz; bestela, bi fitxategiak badaude, programak aurrera egingo du.

Bi fitxategiak daudela, programaren exekuzioa menu batek gidatuko du. Baina menura sartu aurretik kategorien fitxategiko informazioa array batera irauliko da. Ondoren programaren exekuzioak aurrera egingo du hurrengo menuaren gidaritzapean:

  ============================================================================= 
  |                                  MENUA                                    | 
  ============================================================================= 
  |  1.  Langile berri baten datuak gehitu                                    | 
  |  2.  Langile guztientzat kategoria kalkulatu                              |
  |  3.  Langile baten kategoria hobetzeko gomendioa erakutsi                 |
  |---------------------------------------------------------------------------|
  |  4.  Langile guztien datuak erakutsi  (2025EKO AZTERKETAN EZ ZEN ESKATU)  |  
  |  5.  Kategoriak ikusi                 (2025EKO AZTERKETAN EZ ZEN ESKATU)  |  
|---------------------------------------------------------------------------| | 0. Programatik irten | ============================================================================= Zure aukera hautatu: _

1.  Langile berri baten datuak gehitu

Langile berriaren identifikadorea, masa eta altuera teklatuz eman ondoren, GMI indizea kalkulatzen da eta kate hutsarekin batera, bost datu horiek tstLangilea datu-motako estruktura batean jasotzen dira langileen datu-fitxategiaren amaieran gordetzeko.

Esate baterako, hona hemen hiru datu teklatuz harturik eta beste biak kalkulaturik:

Langileen fitxategian 016-Jare langilea gehitzean, 12 elementu izatetik 13 elementu izatera igaroko da.

2.  Langile guztien kategoria kalkulatu

Langileen fitxategi osoa prozesatzen da bere elementu guztien sKategoria eremuko kate hutsaren ordez, dagokion GMI indizearen sKategoriaIzena eremuko edukia gordez. Horretarako, Langileen fitxategiaz gain kategorien arraya beharko da.

Hona hemen kategorien kalkulua azaltzen duen irudia, non langilearen GMI indizea 27.62 den eta indize horren sKategoriaIzena eremuko edukia lortzeko arrayaren elementuaren 4 posizioa zehazten den:

Langile bakoitzeko bere GMI ezagutzen da, eta dagokion kategoriaren izena kategorien array-tik eskura daiteke.

3.  Langile baten kategoria hobetzeko gomendioa erakutsi

Langilearen identifikadorea teklatuz eman ondoren, bere bilaketa bururu behar da langileen fitxategian. Bilaketaren arabera bi egoera izango dira:

  1. Horrelako identifikadorea duen langilerik ez dago, mezu egoki bat pantailaratu eta menura itzuli.
  2. Horrelako identifikadorea duen langilearentzat dagokion GMI indizearen izena array-tik eskuratu, eta kate horren lehen karakterea aztertu. Kategoriaren lehen karakterea A bada kiloak irabazi beharko ditu, baina kategoriaren lehen karakterea 0 edo I bada kiloak galdu beharko ditu.

Hona hemen kategoria hobetzeko gomendioa azaltzen duen irudia, non 007-Leire langilearen GMI indizea 16.60 den eta indize horren sKategoriaIzena eremuko edukiaren hasiera A denez kiloak irabazi beharko dituen, zehazki 1.07 kilo:

Langilearen identifikadorea dugula, argala ala lodia den jakin behar da bere kategoriaren katea aztertuz. Langilearen kategoriako mugak aintzakotzat harturik helburuko kilo kopurua kalkula daiteke.  

4.  Langile guztien datuak erakutsi

Menuaren aukera hau ez zen azterketan eskatu. Langile guztien datuak pantailaratzeko langileen fitxategia behar da, adibidez:

Ikusten denez 016-Jare langilea fitxategiaren bukaeran gehitu da.

5.  Kategoriak ikusi

Menuaren aukera hau ez zen azterketan eskatu. Kategorien datuak pantailaratzeko kategorien fitxategitik abiatuta edo kategorien fitxategitik abiatuta egin daiteke. Edozein kasutan, informazio bera aurkeztuko litzateke pantailan. Adibidez, hau da GMI-6_Kategoriak.dat kategorien fitxategian biltzen den informazioa:

Munduko Osasun Erakundeak ez bezala, irudiko programak 6 kategorietako banaketa erabiltzen du.


Bi datu-fitxategiak aldez aurretik sorturik daudela suposatzen da azterketan, kategorien datu-fitxategia eta langileen datu-fitxategia. Bi fitxategiko bat edo beste falta bada, programa bukatuko da. Hona hemen, kategorien datu-fitxategiak sortzeko erabil daitekeen Kategorien_DatuakLortzen proiektuaren main.c fitxategiaren kodea:

/*=========================================================================================
    Data: 2025eko ekainaren 5a

    Deskribapena: Informatika azterketa
                  2024-25 ikasturteko ohiko deialdia
                  Bilbo, 2025eko ekainaren 27a

       Graduak: - Industria Antolakuntzaren Ingeniaritzako Gradua
                - Ingurumen Ingeniaritzako Gradua

	Bertsioaren Ezaugarriak:
                - "GMI-5" emanda "GMI-5_kategoriak.dat" datu-fitxategia sortuko da
===========================================================================================*/

#include <stdio.h>
#include <conio.h>     // getche()
#include <string.h>    // strcpy() eta strcat()

/* Deklarazio orokorra */
struct tstHeina
{
    float fBehemuga;
    float fGoimuga;
};
struct tstKategoria
{
    char sKategoriaIzena[30];
    struct tstHeina stHeina;
    char sGomendioa[128];
};

/* Prototipoak */
void Kategoriak_FitxategiaSortu(const char *sFitxIzenKategoriak);
void Kategoriak_FitxategiaIkusi(const char *sFitxIzenKategoriak);
void DatuakJaso(struct tstKategoria *stKategoriaBat);
void DatuakErakutsi(const struct tstKategoria *stKategoriaBat);

/* Funtzio nagusia */
int main()
{
    char sFitxIzenKategoriak[100];

    /* Kategorien fitxategia sortu eta ikusi */
    printf("\n Kategorien fitxategiaren izena (adibidez, 'GMI-8'): ");
    gets(sFitxIzenKategoriak);
    strcat(sFitxIzenKategoriak, "_kategoriak.dat");
    //printf(" sFitxIzenKategoriak: '%s'", sFitxIzenKategoriak);

    Kategoriak_FitxategiaSortu(sFitxIzenKategoriak);
    Kategoriak_FitxategiaIkusi(sFitxIzenKategoriak);
    printf("\n Amaitzeko edozein tekla sakatu...\n\n" );
    getche();  // Itxaroteko

    return 0;
}


/* Kategorien kopurua eskatu eta fitxategia sortu ondoren datuz bete. */
void Kategoriak_FitxategiaSortu(const char *sFitxIzen)
{
    FILE *fbErakFitx;
    struct tstKategoria stKategoriaBat;
    int iKont;
    int iZenbatKategoria;

    do
    {
        printf("\nZenbat elementu izango dira (3 eta 8 arteko kopurua): ");
        scanf("%d", &iZenbatKategoria);
        fflush(stdin);
    } while (iZenbatKategoria < 3 || iZenbatKategoria > 8);

    fbErakFitx = fopen(sFitxIzen, "wb");

    for (iKont=0; iKont<iZenbatKategoria; iKont++)
    {
        printf("\n%d. kategoriaren datuak eman:", iKont+1);
        printf("\n----------------------------");
        DatuakJaso(&stKategoriaBat);
        fwrite(&stKategoriaBat, sizeof(stKategoriaBat), 1, fbErakFitx);
    }
    fclose(fbErakFitx);
}


/* Kategoria baten datuak lortu. */
void DatuakJaso(struct tstKategoria *stKategoriaBat)
{
    char cAukera;

    do
    {
        printf("\n   1. Argaltasun Larria");
        printf("\n   2. Argaltasun Ertaina");
        printf("\n   3. Argaltasun Txikia");
        printf("\n   4. Masa Normala");
        printf("\n   5. 0 Motako Obesitatea");
        printf("\n   6. I Motako Obesitatea");
        printf("\n   7. II Motako Obesitatea");
        printf("\n   8. III Motako Obesitatea");
        printf("\n   9. Kategoria berri baten izena");
        printf("\n      Kategoriaren zenbakia aukeratu: ");
        scanf("%c", &cAukera);
        fflush(stdin);
    } while (cAukera < '1' || cAukera > '9');

    switch (cAukera)
    {
        case '1': strcpy(stKategoriaBat->sKategoriaIzena, "Argaltasun Larria");
                  break;
        case '2': strcpy(stKategoriaBat->sKategoriaIzena, "Argaltasun Ertaina");
                  break;
        case '3': strcpy(stKategoriaBat->sKategoriaIzena, "Argaltasun Txikia");
                  break;
        case '4': strcpy(stKategoriaBat->sKategoriaIzena, "Masa Normala");
                  break;
        case '5': strcpy(stKategoriaBat->sKategoriaIzena, "0 Motako Obesitatea");
                  break;
        case '6': strcpy(stKategoriaBat->sKategoriaIzena, "I Motako Obesitatea");
                  break;
        case '7': strcpy(stKategoriaBat->sKategoriaIzena, "II Motako Obesitatea");
                  break;
        case '8': strcpy(stKategoriaBat->sKategoriaIzena, "III Motako Obesitatea");
                  break;
        case '9': printf("\nKategoria berriaren izena idatzi: ");
                  gets(stKategoriaBat->sKategoriaIzena);
                  fflush(stdin);
    }

    printf("\nKategoriak duen heinaren behemuga eman: ");
    scanf("%f", &stKategoriaBat->stHeina.fBehemuga);
    fflush(stdin);
    printf("Kategoriak duen heinaren goimuga eman:  ");
    scanf("%f", &stKategoriaBat->stHeina.fGoimuga);
    fflush(stdin);

    switch (cAukera)
    {
        case '1': strcpy(stKategoriaBat->sGomendioa, "Dietista-nutrizionista baten laguntza behar duzu");
                  break;
        case '2': strcpy(stKategoriaBat->sGomendioa, "Sarriago jan beharra daukazu eta dieta aldatu");
                  break;
        case '3': strcpy(stKategoriaBat->sGomendioa, "Sarriago jan behar duzu");
                  break;
        case '4': strcpy(stKategoriaBat->sGomendioa, "Ohiturak mantendu");
                  break;
        case '5': strcpy(stKategoriaBat->sGomendioa, "Gutxiago jan");
                  break;
        case '6': strcpy(stKategoriaBat->sGomendioa, "Gutxiago jan eta ariketa gehiago egin");
                  break;
        case '7': strcpy(stKategoriaBat->sGomendioa, "Gutxiago jan eta egunero ariketa egin");
                  break;
        case '8': strcpy(stKategoriaBat->sGomendioa, "Zure medikuaren eta dietistaren laguntza behar duzu");
                  break;
        case '9': printf("\nKategoria berriaren gomendioa idatzi: ");
                  gets(stKategoriaBat->sGomendioa);
    }
}


/* Kategorien fitxategia erakutsi. */
void Kategoriak_FitxategiaIkusi(const char *sFitxIzen)
{
    FILE *fbErakFitx;
    struct tstKategoria stKategoriaBat;

    fbErakFitx = fopen(sFitxIzen, "rb");

    printf("\n =============================================================");
    while (fread(&stKategoriaBat, sizeof(stKategoriaBat), 1, fbErakFitx)==1)
    {
        DatuakErakutsi(&stKategoriaBat);
    }
    printf(" =============================================================\n");

    fclose(fbErakFitx);
}


/* Kategorien baten datuak pantailaratu. */
void DatuakErakutsi(const struct tstKategoria *stKategoriaBat)
{
    printf("\n%30s%16s%16s\n", "Kategoriaren izena", "Behemuga", "Goimuga");
    printf("            ------------------        --------         -------\n");
    printf("%30s", stKategoriaBat->sKategoriaIzena);
    printf("%16.2f%16.2f", stKategoriaBat->stHeina.fBehemuga,
                            stKategoriaBat->stHeina.fGoimuga);
    printf("\n Gomendioa: %s\n", stKategoriaBat->sGomendioa);
}


ESan bezala, bi datu-fitxategiak (kategorien fitxategia eta langileen fitxategia) aldez aurretik sorturik daudela suposatzen da azterketan. Bi fitxategiko bat edo beste falta bada, programa bukatuko da. Hona hemen, langileen datu-fitxategiak sortzeko erabil daitekeen Langileen_DatuakLortzen proiektuaren main.c fitxategiaren kodea:

/*=========================================================================================
    Data: 2025eko ekainaren 5a

    Deskribapena: Informatika azterketa
                  2024-25 ikasturteko ohiko deialdia
                  Bilbo, 2025eko ekainaren 27a

       Graduak: - Industria Antolakuntzaren Ingeniaritzako Gradua
                - Ingurumen Ingeniaritzako Gradua

	Bertsioaren Ezaugarriak:
                - "Fundizio" emanda "Fundizio_langileak.dat" datu-fitxategia sortuko da
===========================================================================================*/

#include <stdio.h>
#include <conio.h>     // getche()
#include <string.h>    // strcpy() eta strcat()
#include <time.h>      // time()
#include <stdlib.h>    // rand() eta srand()

/* Deklarazio orokorra */
struct tstLangilea
{
    char sIdentif[20];
    float fMasa;
    float fAltuera;
    float fGMI;
    char sKategoria[30];
};
struct tstDatua
{
    char sIzenNAN[20];
    float fKiloak;
    float fMetroak;
};


/* Prototipoak */
void Langileak_FitxategiaSortu(const char *sFitxIzenLangileak);
void Langileak_FitxategiaIkusi(const char *sFitxIzenLangileak);
void DatuakJaso(struct tstLangilea *stLangileBat);
void DatuakErakutsi(const struct tstLangilea *stLangileBat, int iKont);

/* Funtzio nagusia */
int main()
{
    char sFitxIzenLangileak[100];

    /* Langileen fitxategia sortu eta ikusi */
    printf("\n Langileen fitxategiaren izena (adibidez, 'Fundizio'): ");
    gets(sFitxIzenLangileak);
    strcat(sFitxIzenLangileak, "_langileak.dat");
    //printf(" sFitxIzenLangileak: '%s'", sFitxIzenLangileak);

    Langileak_FitxategiaSortu(sFitxIzenLangileak);
    Langileak_FitxategiaIkusi(sFitxIzenLangileak);
    printf("\n Amaitzeko edozein tekla sakatu...\n\n" );
    getche();  // Itxaroteko

    return 0;
}


/* Langileen kopurua eskatu eta fitxategia sortu ondoren datuz bete. */
void Langileak_FitxategiaSortu(const char *sFitxIzen)
{
    FILE *fbErakFitx;
    struct tstLangilea stLangileBat;
    int iKont;
    int iZenbatLangile;
    int iLehenLangilerenIndizea;

    static struct tstDatua astLangileenZerrenda[] =
                    {
                      {"001-Luisa"    , 55.06 , 1.65} ,   // 1
                      {"002-Eva"      , 40.50 , 1.72} ,   // 2
                      {"003-Carlos"   , 60.52 , 1.85} ,
                      {"004-Janire"   , 70.70 , 1.60} ,
                      {"005-Itsaso"   , 57.75 , 1.71} ,
                      {"006-Jon"      , 90.02 , 1.65} ,
                      {"007-Leire"    , 45.75 , 1.66} ,
                      {"008-Gorka"    , 99.73 , 1.62} ,
                      {"009-Koldo"    , 87.99 , 1.59} ,
                      {"010-Gemma"    , 76.70 , 1.55} ,   // 10
                      {"011-Manuela"  , 45.01 , 1.61} ,   // 11
                      {"012-Andoni"   , 68.50 , 1.90} ,   // 12
                      {"013-Helene"   , 37.50 , 1.78} ,   // 13
                      {"014-Pedro"    , 70.56 , 1.73} ,
                      {"015-Anne"     , 60.51 , 1.65} ,
                      {"016-Ainoa"    , 39.50 , 1.64} ,
                      {"017-Kepa"     , 69.95 , 1.61} ,
                      {"018-Teresa"   , 88.95 , 1.58} ,
                      {"019-Silvia"   , 60.95 , 1.75} ,
                      {"020-Juan"     , 55.11 , 1.77} ,   // 20
                      {"021-Marina"   , 56.05 , 1.67} ,   // 21
                      {"022-Julen"    , 80.07 , 1.84} ,   // 22
                      {"023-Mario"    , 95.80 , 1.54} ,
                      {"024-Miren"    , 41.01 , 1.69} ,
                      {"025-Xabier"   , 59.59 , 1.95} ,
                      {"026-Iker"     , 68.01 , 1.78} ,
                      {"027-Nuria"    , 55.21 , 1.76} ,
                      {"028-Belen"    , 64.99 , 1.58} ,
                      {"029-Martin"   , 80.08 , 1.66} ,
                      {"030-Patxi"    , 79.01 , 1.84}     // 30
                    };

    srand(time(NULL));
    iZenbatLangile = (rand() % (20 - 10 + 1)) + 10;    // 20 eta 10 arteko kopurua
    iLehenLangilerenIndizea = rand() % (30 - iZenbatLangile + 1);    // hortik hasita jarraian

    fbErakFitx = fopen(sFitxIzen, "wb");

    //printf("\n         iZenbatLangile = %d", iZenbatLangile);
    //printf("\niLehenLangilerenIndizea = %d", iLehenLangilerenIndizea);

    for (iKont=iLehenLangilerenIndizea; iKont<iLehenLangilerenIndizea+iZenbatLangile; iKont++)
    {
        //printf("\n%d. Langilearen datuak hartzen:", iKont);
        strcpy(stLangileBat.sIdentif, astLangileenZerrenda[iKont].sIzenNAN);
        stLangileBat.fMasa = astLangileenZerrenda[iKont].fKiloak;
        stLangileBat.fAltuera = astLangileenZerrenda[iKont].fMetroak;
        stLangileBat.fGMI = stLangileBat.fMasa / (stLangileBat.fAltuera*stLangileBat.fAltuera);
        strcpy(stLangileBat.sKategoria, "");

        fwrite(&stLangileBat, sizeof(stLangileBat), 1, fbErakFitx);
    }
    fclose(fbErakFitx);
}


/* Langileen fitxategia erakutsi. */
void Langileak_FitxategiaIkusi(const char *sFitxIzen)
{
    FILE *fbErakFitx;
    struct tstLangilea stLangileBat;
    int iKont;

    fbErakFitx = fopen(sFitxIzen, "rb");

    iKont = 1;
    printf("\n =====================================================================");
    printf("\n%21s%12s%11s%11s%13s\n", "Langilea (NAN)", "Masa(Kg)", "Alt.(m)", "  GMI", "Kategoria");
    printf("       --------------    --------    -------    -------    ---------\n");
    while (fread(&stLangileBat, sizeof(stLangileBat), 1, fbErakFitx)==1)
    {
        DatuakErakutsi(&stLangileBat, iKont);
        iKont++;
    }
    printf(" =====================================================================\n");

    fclose(fbErakFitx);
}


/* Langileen baten datuak pantailaratu. */
void DatuakErakutsi(const struct tstLangilea *stLangileBat, int iKont)
{

    printf("%5d", iKont);
    printf("    %-12s", stLangileBat->sIdentif);
    printf("%12.2f%11.2f%11.2f", stLangileBat->fMasa,
                                 stLangileBat->fAltuera,
                                 stLangileBat->fGMI);
    printf("    |%s|\n", stLangileBat->sKategoria);
}




 



iruzkinik ez:

Argitaratu iruzkina