2025eko maiatzeko azterketa


  2025/05/15, testa

2025eko Maiatzaren deialdiko teoria

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




  2025/05/15, programa (Industria Teknologiaren Ingeniaritza)

2025eko Maiatzaren deialdiko programa: Zukugintza


Azterketa ariketari lotutako informazioa. Proiektuak bi fitxategi behar ditu eta aldez aurretik sorturik daudela suposatzen da, hauek:

  • 2025_DEPOSITUAK.DAT estrukturen datu-fitxategian 6 deposituen edukien kopuruak gordetzen dira egunez-egun, eta horiekin batera egunaren data
  • ERREZETAK.DAT estrukturen datu-fitxategian ekoiztu daitezken zuku guztien errezetak gordetzen dira (ariketa honetan irabiatze-denbora datuak ez dira erabiltzen), adibiderako ematen den ERREZETAK.DAT datu-fitxategian 9 estruktura gordetzen dira


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 apirilaren 14a

    Deskribapena: Informatika azterketa
                  2024-25 ikasturteko ohiko deialdia
                  Industria Teknologiaren Ingeniaritzako Gradua
                  Bilbo, 2025eko maiatzaren 15a

	Bertsioaren Ezaugarriak:
	              - "2025_DEPOSITUAK.DAT" datu-fitxategia aldez aurretik sortuta dago
	              - "ERREZETAK.DAT" datu-fitxategia aldez aurretik sortuta dago
	              - "ERREZETAK.DAT" elementuen kopurua 30 baino txikiagoa
=======================================================================================*/

#include <stdio.h>
#include <ctype.h>
#include <conio.h>   // getche()
#include <string.h>
#include <stdlib.h>
#define sFITX_DEPOSITUAK "_DEPOSITUAK.DAT"
#define sFITX_ERREZETAK "ERREZETAK.DAT"
#define iLUZ_MAXIMOA 30

/* Deklarazio orokorrak */
struct tstErrezeta
{
    char sZukua[20];  // 19 karaktere gehi null karakterea
    float fAzukrea_Kg;
    float fCBitam_Kg;
    int iDenboraNahaste_s;
    int iDenboraAdizio_s;
};

struct tst6Depositu
{
    char sData[11];   // 10 karaktere gehi null karakterea, adibidez: 2025/05/15
    float fDepZukuPrim_m3;
    float fDepAzukrea_Kg;
    float fDepCBitam_Kg;
    float fDepZukNat_m3;
    float fDepZukGozo_m3;
    float fDepZukBitam_m3;
};

/* Prototipoak */
char cMenua();
void FitxategitikAzkenaIrakurri(const char *sFitxIzenDepos,
                                struct tst6Depositu *st6Dep);
void FitxategitikArrayraIrauli(const char *sFitxIzenErrez,
                               struct tstErrezeta astErrezetak[],
                               int *iLuzArray);
int iErrezetaBilatu(const char *sZukuMota,
                    const struct tstErrezeta astErrezetak[],
                    int iLuzArray);
void Erakutsi6Deposituak(const struct tst6Depositu *st6Dep);
void Estruktura1FitxategianGehitu(const char *sFitxIzenDepos,
                                  const struct tst6Depositu *st6Dep);
void DeposituenHistorikoaIkusi(const char *sFitxIzenDepos); // AZTERKETA IDATZIAN EZ ZEN ESKATU
void ErrezetakIkusi(const char *sFitxIzenErrez);            // AZTERKETA IDATZIAN EZ ZEN ESKATU
int iErrezetakZenbatu(const char *sFitxIzenErrez);          // AZTERKETA IDATZIAN EZ ZEN ESKATU

/* Funtzio nagusia */
int main()
{
    char cAukera1, cAukera2;
    char sData[11];                 // 10 karaktere gehi null karakterea, adibidez: 2025/05/15
    char sZukuMota[20];             // 19 karaktere gehi null karakterea
    char sFitxIzenDeposituak[100];  // 99 karaktere gehi null karakterea
    struct tst6Depositu st6Deposituak;
    struct tstErrezeta astErrezetak[iLUZ_MAXIMOA];
    int iZenbatErrezeta;
    int iLuz, iErrezetaPos;
    float fEkozZukua_m3;

    /* 1. urratsa */
    printf("\n Sartu data uuuu/hh/ee formatoan: ");
    fflush(stdin);
    gets(sData);
    printf("\n sData: '%s'", sData);

    strcpy(sFitxIzenDeposituak, sData);
    sFitxIzenDeposituak[4] = '\0';
    printf("\n sFitxIzenDeposituak: '%s'", sFitxIzenDeposituak);

    strcat(sFitxIzenDeposituak, sFITX_DEPOSITUAK);
    printf("\n sFitxIzenDeposituak: '%s'\n", sFitxIzenDeposituak);

    DeposituenHistorikoaIkusi(sFitxIzenDeposituak);            // AZTERKETA IDATZIAN EZ ZEN ESKATU
    printf("\nAurrera egiteko edozein tekla sakatu...\n\n" );
    getche();  // Itxaroteko

    /* 2. urratsa */
    FitxategitikAzkenaIrakurri(sFitxIzenDeposituak, &st6Deposituak);
    printf("\nAurrera egiteko edozein tekla sakatu...\n\n" );
    getche();  // Itxaroteko

    strcpy(st6Deposituak.sData, sData);   // Beste balioak atzokoak izanik, gaurko data ezarri

    ErrezetakIkusi(sFITX_ERREZETAK);                           // AZTERKETA IDATZIAN EZ ZEN ESKATU
    iZenbatErrezeta = iErrezetakZenbatu(sFITX_ERREZETAK);      // AZTERKETA IDATZIAN EZ ZEN ESKATU
    printf("\n    Guztira %d errezeta eta arrayaren iLUZ_MAXIMOA=%d\n\n", iZenbatErrezeta, iLUZ_MAXIMOA);

    /* 3. urratsa, suposatzen da  iLUZ_MAXIMOA > iZenbatErrezeta */
    FitxategitikArrayraIrauli(sFITX_ERREZETAK, astErrezetak, &iLuz);

    printf("Aurrera egiteko edozein tekla sakatu...\n\n" );
    getche();  // Itxaroteko

    /* 4. urratsa */
    do
    {
        cAukera1 = cMenua();

        switch (cAukera1)
        {
            case 'A': // Lehengaien hornidura
                st6Deposituak.fDepZukuPrim_m3 = 30.0;
                st6Deposituak.fDepCBitam_Kg = 50000.0;
                st6Deposituak.fDepAzukrea_Kg = 50000.0;
            break;  // A

            case 'B':  // Lotea ontziratzea
                printf("\n");
                printf("\n  Ontziratutako zuku mota");
                printf("\n  -----------------------");
                printf("\n  N  NATURALA");
                printf("\n  G  GOZOA");
                printf("\n  B  BITAMINATUA");
                printf("\n\t   Erabaki: ");
                fflush(stdin);
                scanf("%c", &cAukera2);
                cAukera2 = toupper(cAukera2);
                switch(cAukera2)
                {
                    case 'N': st6Deposituak.fDepZukNat_m3 = 0.0;
                              break;
                    case 'G': st6Deposituak.fDepZukGozo_m3 = 0.0;
                              break;
                    case 'B': st6Deposituak.fDepZukBitam_m3 = 0.0;
                              break;
                    default:  printf("\a");
                }
            break; // B

            case 'C':  // Prozesatutako lote berria
                printf("\n");
                printf("\n  Prozesatutako zuku mota: ");
                printf("\n  --------------------------------------------");
                printf("\n     NATURAL_1       NATURAL_2       NATURAL_3");
                printf("\n        GOZO_1          GOZO_2          GOZO_3");
                printf("\n  BITAMINATU_1    BITAMINATU_2    BITAMINATU_3");
                printf("\n  --------------------------------------------");
                printf("\n\t Erabaki: ");
                fflush(stdin);
                scanf("%s", sZukuMota);
                strupr(sZukuMota);
                iErrezetaPos = iErrezetaBilatu(sZukuMota, astErrezetak, iLuz);
                if (iErrezetaPos != -1)
                {
                    do
                    {
                        printf("  Ekoitzitako zuku-kantitatea (< %.1f m3): ", st6Deposituak.fDepZukuPrim_m3);
                        scanf("%f", &fEkozZukua_m3);
                    } while (fEkozZukua_m3 > st6Deposituak.fDepZukuPrim_m3 || fEkozZukua_m3 < 0.0);

                    st6Deposituak.fDepZukuPrim_m3 = st6Deposituak.fDepZukuPrim_m3 - fEkozZukua_m3;
                    st6Deposituak.fDepAzukrea_Kg = st6Deposituak.fDepAzukrea_Kg - ((fEkozZukua_m3 / 0.1)*astErrezetak[iErrezetaPos].fAzukrea_Kg);
                    st6Deposituak.fDepCBitam_Kg = st6Deposituak.fDepCBitam_Kg - ((fEkozZukua_m3 / 0.1)*astErrezetak[iErrezetaPos].fCBitam_Kg);

                    switch(sZukuMota[0])
                    {
                        case 'N': st6Deposituak.fDepZukNat_m3 = st6Deposituak.fDepZukNat_m3 + fEkozZukua_m3;
                                  break;
                        case 'G': st6Deposituak.fDepZukGozo_m3 = st6Deposituak.fDepZukGozo_m3 + fEkozZukua_m3;
                                  break;
                        case 'B': st6Deposituak.fDepZukBitam_m3 = st6Deposituak.fDepZukBitam_m3 + fEkozZukua_m3;
                                  break;
                    }
                }
                else printf("\nErrorea: Ez da aurkitu '%s' zukuaren izen hori.", sZukuMota);
            break;  // C

            case 'D':
                printf("\n");
                Erakutsi6Deposituak(&st6Deposituak);
            break;  // D

            case 'E':
                printf("\n\nPROGRAMAREN AMAIERA\n");
                Estruktura1FitxategianGehitu(sFitxIzenDeposituak, &st6Deposituak);
                printf("\nHau da '%s' fitxategiaren edukia:", sFitxIzenDeposituak);
                DeposituenHistorikoaIkusi(sFitxIzenDeposituak);         // AZTERKETA IDATZIAN EZ ZEN ESKATU
            break;  // E
        }
    } while (cAukera1 != 'E');

    return 0;
}

/* Menua bistaratzen du eta aukera zuzena bueltatzen du. */
char cMenua()
{
    char cAuk;

    printf("\n\n  Onartzen diren operazioak");
    printf("\n  -------------------------");
    printf("\n  A  Lehengaien hornidura");
    printf("\n  B  Zuku-depositu bat ontziratzea");
    printf("\n  C  Zuku-lote berria egina");
    printf("\n  D  Erakutsi deposituen edukia");
    printf("\n  E  Irten");
    do
    {
        printf("\n\tZure aukera? ");
        cAuk = getche();
        cAuk = toupper(cAuk);
        if (cAuk < 'A' || cAuk > 'E')
          printf("\a");
    } while (cAuk < 'A' || cAuk > 'E');

    return cAuk;
}

void FitxategitikAzkenaIrakurri(const char *sFitxIzenDepos,
                                struct tst6Depositu *st6Dep)
{
    struct tst6Depositu stAzkenEguna;
    FILE *pFitx;

    pFitx = fopen(sFitxIzenDepos, "rb");
    if (pFitx != NULL)
    {
        fseek(pFitx, (-1)*(long)sizeof(stAzkenEguna), SEEK_END);
        fread(&stAzkenEguna, sizeof(stAzkenEguna), 1, pFitx);
            Erakutsi6Deposituak(&stAzkenEguna);
        fclose(pFitx);
        *st6Dep = stAzkenEguna;
    }
    else
        printf("\nErrorea FitxategitikAzkenaIrakurri() funtzioan fitxategia irekitzean...\n");
}

/* Lehendik dagoen errezeten fitxategiaren edukia erakutsi. Azterketan ez zen eskatu. */
void ErrezetakIkusi(const char *sFitxIzenErrez)
{
    FILE *pFitx;
    struct tstErrezeta stErrezeta;

    pFitx = fopen(sFitxIzenErrez, "rb");
    if (pFitx != NULL)
    {
        printf("\n\n ===================================");
        while (fread(&stErrezeta, sizeof(stErrezeta), 1, pFitx) == 1)
        {
            printf("\n      Zukuaren mota: %s", stErrezeta.sZukua);
            printf("\n            Azukrea: %.1f Kg", stErrezeta.fAzukrea_Kg);
            printf("\n         C bitamina: %.1f Kg", stErrezeta.fCBitam_Kg);
            printf("\n    Denbora nahaste: %d s", stErrezeta.iDenboraNahaste_s);
            printf("\n     Denbora adizio: %d s", stErrezeta.iDenboraAdizio_s);
            printf("\n");
        }
        fclose(pFitx);
    }
    else
        printf("\nErrorea ErrezetakIkusi() funtzioan fitxategia irekitzean...\n");
}

/* Lehendik dagoen Deposituen fitxategiaren edukia erakutsi. Azterketan ez zen eskatu. */
void DeposituenHistorikoaIkusi(const char *sFitxIzenDepos)
{
    FILE *pFitx;
    struct tst6Depositu st6Deposituak;

    pFitx = fopen(sFitxIzenDepos, "rb");
    if (pFitx != NULL)
    {
        printf("\n\n ==============================================================================");
        printf("\n       DATA   PRIMARIOA   AZUKREA   C BITAMINA   NATURALA   GOZOA   BITAMINATUA");
        printf("\n ----------   ---------   -------   ----------   --------   -----   -----------");
        while (fread(&st6Deposituak, sizeof(st6Deposituak), 1, pFitx) == 1)
        {
            printf("\n %s        %4.1f   %7.1f      %7.1f       %4.1f    %4.1f          %4.1f",
                   st6Deposituak.sData,
                   st6Deposituak.fDepZukuPrim_m3,
                   st6Deposituak.fDepAzukrea_Kg,
                   st6Deposituak.fDepCBitam_Kg,
                   st6Deposituak.fDepZukNat_m3,
                   st6Deposituak.fDepZukGozo_m3,
                   st6Deposituak.fDepZukBitam_m3);
        }
        printf("\n ==============================================================================\n");
        fclose(pFitx);
    }
    else
        printf("\nErrorea DeposituenHistorikoaIkusi() funtzioan fitxategia irekitzean...\n");
}

/* Arrayara irauli baino lehen egin beharrekoa. Azterketan ez zen eskatu. */
int iErrezetakZenbatu(const char *sFitxIzenErrez)
{
    FILE *pFitx;

    pFitx = fopen(sFitxIzenErrez, "rb");
    fseek(pFitx, 0L, SEEK_END);

    return ftell(pFitx)/sizeof(struct tstErrezeta);
}

/* Array batean irauli errezeten fitxategiaren edukia. */
void FitxategitikArrayraIrauli(const char *sFitxIzenErrez,
                               struct tstErrezeta astErrezetak[],
                               int *iLuzArray)
{
    FILE *pFitx;
    struct tstErrezeta stErrezeta;

    *iLuzArray = 0;
    pFitx = fopen(sFitxIzenErrez, "rb");
    if (pFitx != NULL)
    {
        while (fread(&stErrezeta, sizeof(stErrezeta), 1, pFitx) == 1)
        {
             astErrezetak[*iLuzArray] = stErrezeta;
            (*iLuzArray)++;
        }
        fclose(pFitx);
    }
}

/* Bilatu errezeta arrayan eta itzuli bere posizioa. Ez badago, -1 balioa itzultzen du. */
int iErrezetaBilatu(const char *sZukuMota,
                    const struct tstErrezeta astErrezetak[],
                    int iLuzArray)
{
    int iPos = -1;
    int i = 0;
    char sZukuBat[20];

    while (i < iLuzArray && iPos == -1)
    {
        strcpy(sZukuBat, astErrezetak[i].sZukua);
        strupr(sZukuBat);
        if (strcmp(sZukuBat, sZukuMota) == 0)
            iPos = i;
        i++;
    }
    return iPos;
}

/* Erakutsi deposituaren edukia */
void Erakutsi6Deposituak(const struct tst6Depositu *st6Dep)
{
    printf("\n LEHENGAIEN DEPOSITUAK");
    printf("\n ---------------------------------------");
    printf("\n%25s%15.2f", "ZUKU PRIMARIOA (m3)", st6Dep->fDepZukuPrim_m3);
    printf("\n%25s%15.2f", "AZUKREA (Kg)", st6Dep->fDepAzukrea_Kg);
    printf("\n%25s%15.2f", "C BITAMINA (Kg)", st6Dep->fDepCBitam_Kg);
    printf("\n\n ZUKUEN DEPOSITUAK");
    printf("\n ---------------------------------------");
    printf("\n%25s%15.2f", "ZUKU NATURALA (m3)", st6Dep->fDepZukNat_m3);
    printf("\n%25s%15.2f", "ZUKU GOZOA (m3)", st6Dep->fDepZukGozo_m3);
    printf("\n%25s%15.2f", "ZUKU BITAMINATUA (m3)", st6Dep->fDepZukBitam_m3);
    printf("\n");
}

void Estruktura1FitxategianGehitu(const char *sFitxIzenDepos,
                                  const struct tst6Depositu *st6Dep)
{
    FILE *pFitx;

    pFitx = fopen(sFitxIzenDepos, "ab");
    if (pFitx != NULL)
    {
        fwrite(st6Dep, sizeof(*st6Dep), 1, pFitx);
        fclose(pFitx);
    }
}


Jarraian erakusten da 2025_DEPOSITUAK.DAT datu-fitxategiaren balizko edukia. Ikus daitekeen bezala, 2025_DEPOSITUAK.DAT fitxategiak datuen historikoa gordetzen du, lan eguneko bakoitzeko estruktura bat, estruktura horrek biltzen du menutik irtetean (lanaldia bukatzean) sei deposituek zer daukaten.  

Gaur 2025eko maiatzaren 15a da eta lanaldia hastera doa. 2025_DEPOSITUAK.DAT fitxategiak gordetzen dituen balio historikoak arrosa koloreko lauki barrukoak dira. Atzoko (2025/05/14) lanaldia amaitu zenean sei deposituen edukiak laranja kolorez markaturik daude eta balio horiek berreskuratu beharko dira gaurko (2025/05/15) lanaldirako.

Goiko irudiaren arabera gaur 2025eko maiatzaren 15a da. Atzoko (2025/05/14) lanaldia amaitu zenean sei deposituen edukia laranja kolorez markaturik dago, eta gaurko (2025/05/15) lanaldiaren hasiera balio horietatik abiatu beharko da. Horregatik, menura sartu baino lehen, gaurko lehen zeregina atzoko datuak eskuratzea izango da eta menutik irtetean gaurko azken datuak idatziko dira fitxategian.



Jarraian erakusten da aldez aurretik sorturik dagoen ERREZETAK.DAT datu-fitxategiaren zati bat. Ikus daitekeen bezala, ERREZETAK.DAT fitxategiak 9 elementu ditu eta azken hirurak bistaratzen dira. Ariketan suposa daiteke ERREZETAK.DAT fitxategiaren elementu guztiak arrayan sar daitezkeela:  

ERREZETAK.DAT fitxategiaren estrukturek bost eremu dituzte: zukuaren izena, azukrea eta C bitamina kilogramoetan eta estrukturaren azken bi eremuak segundoetan ematen diren irabiatze denborak dira (ez dira erabiltzen ariketa honetan).



Datu-fitxategiak aldez aurretik sorturik daudela suposatzen da azterketan. Hona hemen, datu-fitxategiak sortzeko erabil daitekeen DatuFitxategiakSortu proiektuaren main.c fitxategiaren kodea. Non 9 errezetako ERREZETAK.DAT fitxategiaren datuak auzaz lortzen diren. Bestalde, erabiltzaileak urte bat teklatuz emanik, auzaz eskuratzen den hilabete jakin bateko 10 egunetan gordetako datuak biltzen dira XXXX_DEPOSITUAK.DAT datu-fitxategian:

/*=========================================================================================
    Data: 2025eko apirilaren 14a

    Deskribapena: Informatika azterketa
                  2024-25 ikasturteko ohiko deialdia
                  Industria Teknologiaren Ingeniaritzako Gradua
                  Bilbo, 2025eko maiatzaren 15a

	Bertsioaren Ezaugarriak:
                - "ERREZETAK.DAT" datu-fitxategia sortuko da
                - "XXXX" urte bat emanda "XXXX_DEPOSITUAK.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()

#define sFITX_ERREZETAK "ERREZETAK.DAT"
#define sFITX_DEPOSITUAK "_DEPOSITUAK.DAT"

/*----------Array konstante batetik zukuen izenak hartu eta fitxategira kargatu------------*/
#define iMAX_IZENAK 20
static char asIzenenZerrenda[][iMAX_IZENAK] =
      { "NATURAL_1",    "NATURAL_2",    "NATURAL_3",      // 0, 1, 2 posizioak
        "GOZO_1",       "GOZO_2",       "GOZO_3",         // 3, 4, 5 posizioak
        "BITAMINATU_1", "BITAMINATU_2", "BITAMINATU_3" }; // 6, 7, 8 posizioak

/* Deklarazio orokorrak */
struct tstErrezeta
{
    char sZukua[20];  // 19 karaktere gehi null karakterea
    float fAzukrea_Kg;
    float fCBitami_Kg;
    int iDenboraNahast_s;
    int iDenboraAdizio_s;
};
struct tst6Depositu
{
    char sData[11];   // 10 karaktere gehi null karakterea, adibidez: 2025/05/15
    float fDepZukuPrim_m3;
    float fDepAzukrea_Kg;
    float fDepCBitam_Kg;
    float fDepZukNat_m3;
    float fDepZukGozo_m3;
    float fDepZukBitam_m3;
};

/* Prototipoak */
void ErrezetenFitxategiaSortu(const char *sFitxIzenErrezt);
void ErrezetenFitxategiaIkusi(const char *sFitxIzenErrezt);
void DeposituenFitxategiaSortu(const char *sFitxIzenDepos, const char *sUrtea);
void DeposituenFitxategiaIkusi(const char *sFitxIzenDepos);

/* Funtzio nagusia */
int main()
{
    char sUrtea[5];  // 4 karaktere gehi null karakterea, adibidez: 2025
    char sFitxIzenDeposituak[100];

    /* Errezetak, fitxategia sortu eta ikusi */
    ErrezetenFitxategiaSortu(sFITX_ERREZETAK);
    ErrezetenFitxategiaIkusi(sFITX_ERREZETAK);
    printf("\n Aurrera egiteko edozein tekla sakatu...\n\n" );
    getche();  // Itxaroteko

    /* Deposituak, fitxategia sortu eta ikusi */
    printf("\n Sartu urtea (adibidez, 2025): ");
    fflush(stdin);
    gets(sUrtea);

    strcpy(sFitxIzenDeposituak, sUrtea);
    strcat(sFitxIzenDeposituak, sFITX_DEPOSITUAK);
    printf(" sFitxIzenDeposituak: '%s'", sFitxIzenDeposituak);
    DeposituenFitxategiaSortu(sFitxIzenDeposituak, sUrtea);
    DeposituenFitxategiaIkusi(sFitxIzenDeposituak);
    printf("\n Aurrera egiteko edozein tekla sakatu...\n\n" );
    getche();  // Itxaroteko

    return 0;
}

/* 9 errezetako fitxategia sortu. */
void ErrezetenFitxategiaSortu(const char *sFitxIzenErrezt)
{
    FILE *fbErakFitx;
    char *sModua = "wb"; // Fitxategi bitarra sortu
    struct tstErrezeta stErrezetaBat;

    srand(time(NULL));
    fbErakFitx = fopen(sFitxIzenErrezt, sModua);

    for (int i=0; i<9; i++)
    {
        strcpy(stErrezetaBat.sZukua, asIzenenZerrenda[i]);
        if (i >= 0 && i <= 2)   // Zuko naturalak
        {
            stErrezetaBat.fAzukrea_Kg = (float)rand()/RAND_MAX * (70.0-10.0) + 10.0;
            //                      0.0 eta 1.0 artekoa | 0.0 eta 60.0 artekoa | 70.0 eta 10.0 artekoa
            stErrezetaBat.fCBitami_Kg = 0.0;
            stErrezetaBat.iDenboraNahast_s = rand() % (720 - 120 + 1) + 120;
            //                                      1 eta 600 artekoa | 121 eta 720 artekoa
            stErrezetaBat.iDenboraAdizio_s = rand() % (720 - 120 + 1) + 120;
            //                                      1 eta 600 artekoa | 121 eta 720 artekoa
        }
        if (i >= 3 && i <= 5)   // Zuko gozoak
        {
            stErrezetaBat.fAzukrea_Kg = (float)rand()/RAND_MAX * (120.0-50.0) + 50.0;
            //                      0.0 eta 1.0 artekoa | 0.0 eta 70.0 artekoa | 120.0 eta 50.0 artekoa
            stErrezetaBat.fCBitami_Kg = 0.0;
            stErrezetaBat.iDenboraNahast_s = rand() % (1200 - 200 + 1) + 200;
            //                                      1 eta 1000 artekoa | 201 eta 1200 artekoa
            stErrezetaBat.iDenboraAdizio_s = rand() % (1200 - 200 + 1) + 200;
            //                                      1 eta 1000 artekoa | 201 eta 1200 artekoa
        }
        if (i >= 6 && i <= 8)   // Zuko bitaminatuak
        {
            stErrezetaBat.fAzukrea_Kg = (float)rand()/RAND_MAX * (90.0-50.0) + 50.0;
            //                      0.0 eta 1.0 artekoa | 0.0 eta 40.0 artekoa | 50.0 eta 50.0 artekoa
            stErrezetaBat.fCBitami_Kg = (float)rand()/RAND_MAX * (200.0-120.0) + 120.0;
            //                      0.0 eta 1.0 artekoa | 0.0 eta 80.0 artekoa | 200.0 eta 120.0 artekoa
            stErrezetaBat.iDenboraNahast_s = rand() % (960 - 360 + 1) + 360;
            //                                      1 eta 600 artekoa | 361 eta 960 artekoa
            stErrezetaBat.iDenboraAdizio_s = rand() % (960 - 360 + 1) + 120;
            //                                      1 eta 600 artekoa | 361 eta 960 artekoa
        }

        fwrite(&stErrezetaBat, sizeof(stErrezetaBat), 1, fbErakFitx);
   } // for

   fclose(fbErakFitx);
};

/* 9 errezeten fitxategiaren edukia erakutsi. */
void ErrezetenFitxategiaIkusi(const char *sFitxIzenErrezt)
{
    FILE *fbErakFitx;
    struct tstErrezeta stErrezeta;

    fbErakFitx = fopen(sFitxIzenErrezt, "rb");

    printf("\n =====================================");
    printf("\n              9 ERREZETA");
    while (fread(&stErrezeta, sizeof(stErrezeta), 1, fbErakFitx) == 1)
    {
        printf("\n %ld --------------------------------- %ld",
                ftell(fbErakFitx)/sizeof(stErrezeta),
                ftell(fbErakFitx)/sizeof(stErrezeta));
        printf("\n      Zukuaren mota: %s", stErrezeta.sZukua);
        printf("\n            Azukrea: %.1f Kg", stErrezeta.fAzukrea_Kg);
        printf("\n         C bitamina: %.1f Kg", stErrezeta.fCBitami_Kg);
        printf("\n    Denbora nahaste: %d s", stErrezeta.iDenboraNahast_s);
        printf("\n     Denbora adizio: %d s", stErrezeta.iDenboraAdizio_s);
    }
    printf("\n =====================================\n");

    fclose(fbErakFitx);
}

/* Deposituen fitxategia sortu. */
void DeposituenFitxategiaSortu(const char *sFitxIzenDepos, const char *sUrtea)
{
    FILE *fbErakFitx;
    struct tst6Depositu st6Deposituak;
    char sHilea[3];  // 2 karaktere gehi null karakterea, adibidez: 05
    char sEguna[3];  // 2 karaktere gehi null karakterea, adibidez: 07
    char sData[11];  //10 karaktere gehi null karakterea, adibidez: 2025/05/07
    int iHileBetea;

    fbErakFitx = fopen(sFitxIzenDepos, "wb");

    srand(time(NULL));
    iHileBetea = rand() % 12 + 1;  // 1 eta 12 artekoa
    sprintf(sHilea, "%02d", iHileBetea);
    //printf("\n sHilea: '%s'", sHilea);

    for (int iKont=5; iKont<15; iKont++)
    {
        sprintf(sEguna, "%02d", iKont);
        strcpy(sData, sUrtea);
        strcat(sData, "/");
        strcat(sData, sHilea);
        strcat(sData, "/");
        strcat(sData, sEguna);
        //printf("\n  sData: '%s'", sData);
        strcpy(st6Deposituak.sData, sData);

        st6Deposituak.fDepZukuPrim_m3 = (float)rand()/RAND_MAX * 30.0;
                                     //  0.0 eta 1.0 artekoa | 0.0 eta 30.0 artekoa
        st6Deposituak.fDepAzukrea_Kg = (float)rand()/RAND_MAX * (50000.0 - 20000.0) + 20000.0;
                        //  0.0 eta 1.0 artekoa | 0.0 eta 30000.0 artekoa | 300000.0 eta 50000.0 artekoa
        st6Deposituak.fDepCBitam_Kg = (float)rand()/RAND_MAX * (50000.0 - 20000.0) + 20000.0;
                        //  0.0 eta 1.0 artekoa | 0.0 eta 30000.0 artekoa | 300000.0 eta 50000.0 artekoa
        st6Deposituak.fDepZukNat_m3 = (float)rand()/RAND_MAX * 30.0;
                                     //  0.0 eta 1.0 artekoa | 0.0 eta 30.0 artekoa
        st6Deposituak.fDepZukGozo_m3 = (float)rand()/RAND_MAX * 30.0;
                                     //  0.0 eta 1.0 artekoa | 0.0 eta 30.0 artekoa
        st6Deposituak.fDepZukBitam_m3 = (float)rand()/RAND_MAX * 30.0;
                                     //  0.0 eta 1.0 artekoa | 0.0 eta 30.0 artekoa
        if (iKont == 6 || iKont == 7 || iKont == 13)
        {
            st6Deposituak.fDepZukBitam_m3 = 0.0;
            if (30.0 - st6Deposituak.fDepZukNat_m3 - st6Deposituak.fDepZukGozo_m3 > 0.0)
                st6Deposituak.fDepZukuPrim_m3 = 30.0 - st6Deposituak.fDepZukNat_m3 - st6Deposituak.fDepZukGozo_m3;
            else
                st6Deposituak.fDepZukuPrim_m3 = 0.0;
        }
        if (iKont == 10)
        {
            st6Deposituak.fDepZukGozo_m3 = 0.0;
            st6Deposituak.fDepZukBitam_m3 = 0.0;
            st6Deposituak.fDepZukuPrim_m3 = 30.0 - st6Deposituak.fDepZukNat_m3;
        }
        if (iKont == 5 || iKont == 8 || iKont == 12)
        {
            st6Deposituak.fDepZukuPrim_m3 = 30.0;
            st6Deposituak.fDepAzukrea_Kg = 50000.0;
            st6Deposituak.fDepCBitam_Kg = 50000.0;
            st6Deposituak.fDepZukNat_m3 = 0.0;
            st6Deposituak.fDepZukGozo_m3 = 0.0;
            st6Deposituak.fDepZukBitam_m3 = 0.0;
        }

        fwrite(&st6Deposituak, sizeof(st6Deposituak), 1, fbErakFitx);
    }

    fclose(fbErakFitx);
}

/* Deposiuoen fitxategiaren edukia erakutsi. */
void DeposituenFitxategiaIkusi(const char *sFitxIzenDepos)
{
    FILE *fbErakFitx;
    struct tst6Depositu st6Deposituak;

    fbErakFitx = fopen(sFitxIzenDepos, "rb");

    printf("\n\n ==============================================================================");
    printf("\n       DATA   PRIMARIOA   AZUKREA   C BITAMINA   NATURALA   GOZOA   BITAMINATUA");
    printf("\n ----------   ---------   -------   ----------   --------   -----   -----------");
    while (fread(&st6Deposituak, sizeof(st6Deposituak), 1, fbErakFitx) == 1)
    {
        printf("\n %s        %4.1f   %7.1f      %7.1f       %4.1f    %4.1f          %4.1f",
                st6Deposituak.sData,
                st6Deposituak.fDepZukuPrim_m3,
                st6Deposituak.fDepAzukrea_Kg,
                st6Deposituak.fDepCBitam_Kg,
                st6Deposituak.fDepZukNat_m3,
                st6Deposituak.fDepZukGozo_m3,
                st6Deposituak.fDepZukBitam_m3);
    }
    printf("\n ==============================================================================\n");

    fclose(fbErakFitx);
}




 



iruzkinik ez:

Argitaratu iruzkina