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

Azterketak


Ohiko deialdia:

Ez-ohiko deialdia:



2025-06-20ko ekaineko azterketa (Indust. Teknol.)


  2025/06/20, testa

2025eko Ekainaren deialdiko teoria

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




  2025/06/20, programa (Industria Teknologiaren Ingeniaritza)

2025eko Ekainaren deialdiko programa: Kable bobinak


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

  • Batetik, eskaeren fitxategia. Adibidez uuuu_ESKAERAK.DAT estrukturen datu-fitxategia, non hainbat eskaeren ezaugarriak gordetzen diren, bobinaren materiala eta bobinaren luzera besteak beste. Bobinari dagokion biltegiko kodea falta da eta hori lortzea da programaren zioa
  • Bestetik, biltegiko hiru fitxategiak. Aldez aurretik sortuak dira eta haien izenak ALUMINIOA.DAT, BURDINA.DAT eta KOBREA.DAT dira
  • Enuntziatuan ez da eskatzen, baina ematen den proiektuaren bertsio honetan SALDUTAKOAK.DAT izeneko fitxategia sortzen da ere


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 1a

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

	Bertsioaren Ezaugarriak:
                - "ESKAERAK.dat" datu-fitxategia aldez aurretik sortuta dagoen
                  egiaztatu beharko da bere prozesaketa burutu ahal izateko
                - "ALUMINIOA.dat", "BURDINA.dat" eta "KOBREA.dat" biltegiko
                  datu-fitxategiak aldez aurretik sortuta daudela jakina da
=======================================================================================*/

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

#define sFITX_ALUM "ALUMINIOA.DAT"
#define sFITX_BURD "BURDINA.DAT"
#define sFITX_KOBR "KOBREA.DAT"
#define sFITX_SALD "SALDUTAKOAK.DAT"   // Azterketan ez zen eskatu
#define iLUZERAMAX 1000   // Biltegian sar daitezken bobinen kopuru handiena, 10x10x10=1000

//Estrukturak, datu-mota orokorrak--------------------------------------------------
struct tstEskaera
{
    char sEskaeraIdent[50];   // 49 karaktere gehi null karakterea
    char cMateriala;
    float fMetroak;
    char sBiltegiKodea[20];   // 19 karaktere gehi null karakterea
};
struct tstBobina
{
    char sBobinarenKodea[20]; // 19 karaktere gehi null karakterea
    int aiKokapena[3];        // 10x10x10=1000 bobina gehienez
    float fLuzera;
};

//Prototipoak-----------------------------------------------------------------------
int EskaerarikBadaEtaBadu(const char *sFitxIzenEskaera);
void SaldutakoBobinenFitxategiaSortu(void);   // Azterketan ez zen eskatu
void EskaerakProzesatu(const char *sFitxIzenEskaera);   // Bitarteko array baten laguntzaz
void BobinaLuzeagoakEskuratu(float fMetroak,
                             const char *sBiltegiFitx,
                             struct tstBobina astLuzeagoak[],
                             int *iBobinaLuzeagoKop);
void BobinaLuzeagoakErakutsi(const struct tstBobina astLuzeagoak[],
                             int iBobinaLuzeagoKop);
int SaldukoDenBobinaLortu(const struct tstBobina astLuzeagoak[],
                          int iBobinaLuzeagoKop);
void BobinaBatBiltegitikKendu(const char *sBiltegiFitx,   // Fitxategi lagungarri batez
                              const char *sBobinaKodea);
void BobinaBatBiltegitikAtera(const char *sBiltegiFitx,   // Array lagungarri batez
                              const char *sBobinaKodea);
void EskaeraBatErakutsi(const struct tstEskaera *stEskaeraBat);
void EskaerenTaulaIkusi(const char *sFitxIzenEskaera);
void BiltegikoTaulaIkusi(const char *sFitxIzenBiltegiZatia);
void BobinaBatSalduta(const struct tstBobina *stSaldutakoBobina);


//Funtzio nagusia-------------------------------------------------------------------
int main()
{
    char sData[11];
    char sFitxIzenEskaera[100];
    int iEskaeraKop;

    printf("Data eman uuuu/hh/ee formatuan: ");  // 1. URRATSA
    gets(sData);
    sData[4] = '\0';
    strcpy(sFitxIzenEskaera, sData);
    strcat(sFitxIzenEskaera, "_ESKAERAK.DAT");
    //printf("Eskaeren fitxategia: |%s|", sFitxIzenEskaera);

    iEskaeraKop = EskaerarikBadaEtaBadu(sFitxIzenEskaera);  // 2. URRATSA
    if (iEskaeraKop < 1)   // 1. URRATSA
    {
        if (iEskaeraKop == -1)
            printf("\n'%s' datu-fitxategirik ez dago, agur!!!\n\n", sFitxIzenEskaera);
        if (iEskaeraKop == 0)
            printf("\n'%s' datu-fitxategia hutsik dago, agur!!!\n\n", sFitxIzenEskaera);
    }
    else
    {
        SaldutakoBobinenFitxategiaSortu();     // Azterketan ez zen eskatu
        BiltegikoTaulaIkusi(sFITX_ALUM);
        BiltegikoTaulaIkusi(sFITX_BURD);
        BiltegikoTaulaIkusi(sFITX_KOBR);
        EskaerenTaulaIkusi(sFitxIzenEskaera);
        printf("\n'%s' datu-fitxategia prozesatzera doa\n", sFitxIzenEskaera);
        printf("\nAurrera egiteko edozein tekla sakatu...\n" );
        getche();  // Itxaroteko

        EskaerakProzesatu(sFitxIzenEskaera);   // 3. URRATSA

        system("cls");
        EskaerenTaulaIkusi(sFitxIzenEskaera);  // 4. URRATSA
        BiltegikoTaulaIkusi(sFITX_ALUM);
        BiltegikoTaulaIkusi(sFITX_BURD);
        BiltegikoTaulaIkusi(sFITX_KOBR);
        BiltegikoTaulaIkusi(sFITX_SALD);       // Azterketan ez zen eskatu

        printf("\n\nAmaitzeko edozein tekla sakatu...\n" );
        getche();  // Itxaroteko
    }

    return 0;
}


int EskaerarikBadaEtaBadu(const char *sFitxIzenEskaera)
{
    FILE *fbEskaFitx;
    int iZenbatElementu;

    fbEskaFitx = fopen(sFitxIzenEskaera, "rb");

    if (fbEskaFitx!=NULL)
    {
        fseek(fbEskaFitx, 0, SEEK_END);
        iZenbatElementu = ftell(fbEskaFitx)/(long)sizeof(struct tstEskaera);
        fclose(fbEskaFitx);
    }
    else
        iZenbatElementu = -1;

    return iZenbatElementu;
}


void SaldutakoBobinenFitxategiaSortu(void)   // Azterketan ez zen eskatu
{
     FILE *fbSaldFitx;

    fbSaldFitx = fopen(sFITX_SALD, "wb");    // Fitxategi bitarra sortu eta irten
    fclose(fbSaldFitx);
}


void EskaerakProzesatu(const char *sFitxIzenEskaera)
{
    FILE *fbEskaFitx;
    struct tstEskaera stEskaeraBat;
    struct tstBobina astLuzeagoak[1000];
    int iBobinaLuzeagoKop;
    char sBiltegiFitx[100];
    int iZenbatEskaera;
    int iMinimoarenPos;

    fbEskaFitx = fopen(sFitxIzenEskaera, "r+b");

    fseek(fbEskaFitx, 0, SEEK_END);
    iZenbatEskaera = ftell(fbEskaFitx)/(long)sizeof(stEskaeraBat);
    fseek(fbEskaFitx, 0, SEEK_SET);

    while (fread(&stEskaeraBat, sizeof(stEskaeraBat), 1, fbEskaFitx)!=0)
    {
        system("cls");
        printf("\n%ld/%d", ftell(fbEskaFitx)/(long)sizeof(stEskaeraBat), iZenbatEskaera);
        printf("\n=========================================================================");
        printf("\n'%s' eskaera zerbitzatzen...", stEskaeraBat.sEskaeraIdent);
        printf("\nMateriala = %c", stEskaeraBat.cMateriala);
        printf("\nMetroak = %.2f\n", stEskaeraBat.fMetroak);
        switch (stEskaeraBat.cMateriala)
        {
            case 'A': strcpy(sBiltegiFitx, sFITX_ALUM);
                      break;
            case 'B': strcpy(sBiltegiFitx, sFITX_BURD);
                      break;
            case 'K': strcpy(sBiltegiFitx, sFITX_KOBR);
                      break;
        }
        BobinaLuzeagoakEskuratu(stEskaeraBat.fMetroak, sBiltegiFitx, astLuzeagoak, &iBobinaLuzeagoKop);
        //printf("\niBobinaLuzeagoKop = %d    Eskatutakoa %.3f m\n", iBobinaLuzeagoKop, stEskaeraBat.fMetroak);
        //BobinaLuzeagoakErakutsi(astLuzeagoak, iBobinaLuzeagoKop);
        printf("=========================================================================");

        if (iBobinaLuzeagoKop > 0)
        {
            iMinimoarenPos = SaldukoDenBobinaLortu(astLuzeagoak, iBobinaLuzeagoKop);
            /*
            printf("\n//////////////////////////////////////////////////////////////");
            printf("\n           Biltegi-kodea: |%s|", astLuzeagoak[iMinimoarenPos].sBobinarenKodea);
            printf("\n                Kokapena: (%d,%d,%d)", astLuzeagoak[iMinimoarenPos].aiKokapena[0],
                                                             astLuzeagoak[iMinimoarenPos].aiKokapena[1],
                                                             astLuzeagoak[iMinimoarenPos].aiKokapena[2]);
            printf("\n              Luzera (m): %.1f m", astLuzeagoak[iMinimoarenPos].fLuzera);
            printf("\n//////////////////////////////////////////////////////////////");
            */
            // 3-b eta 3-c
            strcpy(stEskaeraBat.sBiltegiKodea, astLuzeagoak[iMinimoarenPos].sBobinarenKodea);
            fseek(fbEskaFitx, (-1)*(long)sizeof(stEskaeraBat), SEEK_CUR);   // Bat atzera
            fwrite(&stEskaeraBat, sizeof(stEskaeraBat), 1, fbEskaFitx);
            fseek(fbEskaFitx, 0, SEEK_CUR);   // Fitxategiko erakuslea eguneratu
            //BobinaBatBiltegitikKendu(sBiltegiFitx, astLuzeagoak[iMinimoarenPos].sBobinarenKodea);
            BobinaBatBiltegitikAtera(sBiltegiFitx, astLuzeagoak[iMinimoarenPos].sBobinarenKodea);
            BobinaBatSalduta(&astLuzeagoak[iMinimoarenPos]);
        }
        else
        {
            // 3-a
            printf("\n    ESKAERA HAU EZIN DA ZERBITZATU, EGITEKE GERATUKO DA.");
            strcpy(stEskaeraBat.sBiltegiKodea, "ESKAERA-EGITEKE");
            fseek(fbEskaFitx, (-1)*(long)sizeof(stEskaeraBat), SEEK_CUR);   // Bat atzera
            fwrite(&stEskaeraBat, sizeof(stEskaeraBat), 1, fbEskaFitx);
            fseek(fbEskaFitx, 0, SEEK_CUR);   // Fitxategiko erakuslea eguneratu
        }
        printf("\n=========================================================================");
        printf("\nAurrera egiteko edozein tekla sakatu...\n" );
        getche();  // Itxaroteko
        printf("\n\n");
    }
    fclose(fbEskaFitx);
}


void BobinaLuzeagoakEskuratu(float fErreferentzia_m,
                             const char *sBiltegiFitx,
                             struct tstBobina astLuzeagoak[],
                             int *iBobinaLuzeagoKop)
{
    FILE *fbBiltFitx;
    struct tstBobina stBobinaBat;

    fbBiltFitx = fopen(sBiltegiFitx, "rb");

    *iBobinaLuzeagoKop = -1;
    while (fread(&stBobinaBat, sizeof(stBobinaBat), 1, fbBiltFitx)==1)
    {
        if (stBobinaBat.fLuzera > fErreferentzia_m)
        {
            (*iBobinaLuzeagoKop)++;
            astLuzeagoak[*iBobinaLuzeagoKop] = stBobinaBat;
        }
    }
    (*iBobinaLuzeagoKop)++;
    fclose(fbBiltFitx);
}


void BobinaLuzeagoakErakutsi(const struct tstBobina astLuzeagoak[],
                             int iBobinaLuzeagoKop)
{
    int iKont;

    for (iKont=0; iKont<iBobinaLuzeagoKop; iKont++)
    {
        printf("\n           Biltegi-kodea: |%s|", astLuzeagoak[iKont].sBobinarenKodea);
        printf("\n                Kokapena: (%d,%d,%d)", astLuzeagoak[iKont].aiKokapena[0],
                                                         astLuzeagoak[iKont].aiKokapena[1],
                                                         astLuzeagoak[iKont].aiKokapena[2]);
        printf("\n              Luzera (m): %.1f m", astLuzeagoak[iKont].fLuzera);
        printf("\n");
    }
}


int SaldukoDenBobinaLortu(const struct tstBobina astLuzeagoak[],
                          int iBobinaLuzeagoKop)
{
    float fMinimoa;
    int iMinimoaNon;

    fMinimoa = astLuzeagoak[0].fLuzera;
    iMinimoaNon = 0;
    for (int iKont=1; iKont<iBobinaLuzeagoKop; iKont++)
    {
        if (astLuzeagoak[iKont].fLuzera < fMinimoa)
        {
            fMinimoa = astLuzeagoak[iKont].fLuzera;
            iMinimoaNon = iKont;
        }
    }

    return iMinimoaNon;
}


/* Fitxategi lagungarri bat erabiliz elementu bat fitxategitik kendu */
void BobinaBatBiltegitikKendu(const char *sBiltegiFitx,
                              const char *sBobinaKodea)
{
    FILE *fbBiltFitx;
    FILE *fbLagunFitx;
    struct tstBobina stBobinaBat;
    char sLagungarria[50] = "LAGUNGARRIA.DAT";

    fbBiltFitx = fopen(sBiltegiFitx, "rb");
    fbLagunFitx = fopen(sLagungarria, "wb");

    while (fread(&stBobinaBat, sizeof(stBobinaBat), 1, fbBiltFitx)==1)
    {
        if (strcmp(stBobinaBat.sBobinarenKodea, sBobinaKodea) != 0)
        {
            printf("\n  %s   BOBINA HAU BILTEGIAN MANTENDU (%.2f m)", stBobinaBat.sBobinarenKodea,
                                                                      stBobinaBat.fLuzera);
            fwrite(&stBobinaBat, sizeof(stBobinaBat), 1, fbLagunFitx);
        }
        else
            printf("\n  %s   BOBINA HAU BILTEGITIK KENDU <<<<<<<<<<< (%.2f m)", stBobinaBat.sBobinarenKodea,
                                                                                stBobinaBat.fLuzera);
    }

    fclose(fbBiltFitx);
    fclose(fbLagunFitx);

    remove(sBiltegiFitx);
    rename(sLagungarria, sBiltegiFitx);
}


/* Array lagungarri bat erabiliz elementu bat fitxategitik kendu */
void BobinaBatBiltegitikAtera(const char *sBiltegiFitx,
                              const char *sBobinaKodea)
{
    FILE *fbBiltFitx;
    struct tstBobina stBobinaBat;
    struct tstBobina astLaguna[10*10*10];
    int iLuzera;
    int iKont = 0;

    fbBiltFitx = fopen(sBiltegiFitx, "rb");
    iLuzera = 0;

    fseek(fbBiltFitx, 0L, SEEK_END);
    printf("\n  '%s' fitxategian %ld elementu", sBiltegiFitx, ftell(fbBiltFitx)/(long)sizeof(stBobinaBat));
    printf("\n  Fitxategitik array lagungarrira...");
    fseek(fbBiltFitx, 0L, SEEK_SET);
    while (fread(&stBobinaBat, sizeof(stBobinaBat), 1, fbBiltFitx)==1)
    {
        iKont++;
        printf("\n  %2d", iKont);
        if (strcmp(stBobinaBat.sBobinarenKodea, sBobinaKodea) != 0)
        {
            printf("  %s   BOBINA HAU BILTEGIAN MANTENDU (%.2f m)", stBobinaBat.sBobinarenKodea,
                                                                           stBobinaBat.fLuzera);
            astLaguna[iLuzera] = stBobinaBat;
            iLuzera++;
        }
        else
            printf("  %s   BOBINA HAU BILTEGITIK ATERA <<<<<<<<<< (%.2f m)", stBobinaBat.sBobinarenKodea,
                                                                             stBobinaBat.fLuzera);
    }

    fclose(fbBiltFitx);
    fbBiltFitx = fopen(sBiltegiFitx, "wb");

    printf("\n  Array lagungarrian %d elementu", iLuzera);
    printf("\n  Array lagungarritik fitxategira...");
    for (iKont=0; iKont<iLuzera; iKont++)
    {
        stBobinaBat = astLaguna[iKont];
        fwrite(&stBobinaBat, sizeof(stBobinaBat), 1, fbBiltFitx);
        printf("\n  %2d  %s   BOBINA BILTEGIAN GORDERIK (%.2f m)", iKont+1,
                                                                   stBobinaBat.sBobinarenKodea,
                                                                   stBobinaBat.fLuzera);
    }
    printf("\n  '%s' fitxategian %ld elementu", sBiltegiFitx, ftell(fbBiltFitx)/(long)sizeof(stBobinaBat));

    fclose(fbBiltFitx);
}


void EskaeraBatErakutsi(const struct tstEskaera *stEskaeraBat)
{
    printf("   %-28s", stEskaeraBat->sEskaeraIdent);
    switch (stEskaeraBat->cMateriala)
    {
        case 'A': printf(" ALUMINIOA");
                  break;
        case 'B': printf(" BURDINA  ");
                  break;
        case 'K': printf(" KOBREA   ");
                  break;
    }
    printf("%11.2f", stEskaeraBat->fMetroak);
    printf("      %-16s", stEskaeraBat->sBiltegiKodea);
    printf("\n");
}


void EskaerenTaulaIkusi(const char *sFitxIzenEskaera)
{
    FILE *fbEskaFitx;
    struct tstEskaera stEskaeraBat;
    int iKont = 0;

    fbEskaFitx = fopen(sFitxIzenEskaera, "rb");
    printf("\n =============================================================================");
    printf("\n                                    ESKAERAK");
    printf("\n =============================================================================");
    printf("\n%30s%15s%14s%16s\n", "Eskaera-identifikadorea", "Materiala", "Luzera (m)", "Biltegi-kodea");
    printf("       -----------------------      ---------    ----------   -------------\n");
    while (fread(&stEskaeraBat, sizeof(stEskaeraBat), 1, fbEskaFitx)==1)
    {
        iKont++;
        printf("%4d", iKont);
        EskaeraBatErakutsi(&stEskaeraBat);
    }
    printf(" =============================================================================\n");

    fclose(fbEskaFitx);
}


void BiltegikoTaulaIkusi(const char *sFitxIzenBiltegiZatia)
{
    FILE *fbBiltegiZatiaFitx;
    struct tstBobina stBobinaBat;
    int iKont = 0;

    fbBiltegiZatiaFitx = fopen(sFitxIzenBiltegiZatia, "rb");

    printf("\n =====================================================");
    printf("\n                     %s", sFitxIzenBiltegiZatia);
    printf("\n =====================================================");
    printf("\n%20s%16s%16s\n", "Biltegi-kodea", "Kokapena", "Luzera (m)");
    printf("       -------------        --------      ----------   \n");
    while (fread(&stBobinaBat, sizeof(stBobinaBat), 1, fbBiltegiZatiaFitx) == 1)
    {
        iKont++;
        printf("%4d", iKont);
        printf("   %-15s", stBobinaBat.sBobinarenKodea);
        printf("      (%d,%d,%d)", stBobinaBat.aiKokapena[0],
                                   stBobinaBat.aiKokapena[1],
                                   stBobinaBat.aiKokapena[2]);
        printf("%14.2f", stBobinaBat.fLuzera);
        printf("\n");
    }
    printf(" =====================================================\n");

    fclose(fbBiltegiZatiaFitx);
}


void BobinaBatSalduta(const struct tstBobina *stSaldutakoBobina)
{
    FILE *fbSaldutakoakFitx;

    fbSaldutakoakFitx = fopen(sFITX_SALD, "r+b");

    fseek(fbSaldutakoakFitx, 0, SEEK_END);
    fwrite(stSaldutakoBobina, sizeof(struct tstBobina), 1, fbSaldutakoakFitx);

    fclose(fbSaldutakoakFitx);
}


Programak hasieran urtea eskatuko du 2025 adibidez, eta datu-fitxategiaren 2025_ESKARAK.DAT izena konposatuko du. Bigarren urrats bezala, 2025_ESKARAK.DAT fitxategia badela eta informaziorik baduela egiaztatuko du programak. Izen horretako fitxategirik ez balego edo hutsik balego programa amaituko litzateke, bestela, adibideko 2025_ESKARAK.DAT fitxategia prozesatuko litzateke (programaren 3. urratsa) eta fitxategi guztien edukiak erakutsiko lirateke (programaren 4. urratsa).

Adibideko 2025_ESKAERAK.DAT datu-fitxategiaren balizko edukia jarraian erakusten da. Ikus daitekeen bezala, 2025_ESKAERAK.DAT fitxategiaren elementuak estrukturak dira, eta hasieran laugarren eremua hutsik dago:  

Ariketaren 1. eta 2. urratsetan eskaeren fitxategiari dagokion izena eskatu ondoren, haren existentzia eta elementurik duela egiaztatzen da. Irudian nabarmentzen den bezala biltegi-kodeak falta dira datuetan, hots, 2025_ESKAERAK.DAT fitxategiaren prozesaketa hasi aurretik sBiltegiKodea izeneko eremuan kate hutsak ditugu eskaera-fitxategiaren elementu guztientzat.


Biltegia irudikatzeko hiru fitxategi daude, bana kable-material bakoitzeko. Hirurak aldez aurretik sortuak dira eta haien izenak ALUMINIOA.DAT, BURDINA.DAT eta KOBREA.DAT dira. Estrukturen fitxategiak dira eta oinarrizko estruktura honela definiturik dago:

struct tstBobina
{
    char sBobinarenKodea[21]; // 20 karaktere gehi null karakterea
    int aiKokapena[3];        // 10x10x10=1000 bobina gehienez
    float fLuzera;
};

Eskatutako bobinaren sBiltegiKodea izeneko eremuan hasieran dagoen kate hutsaren ordez sBobinarenKodea izeneko eremuko edukia jarri beharko da proiektuaren 3. urratsean. Horrez gain, biltegiko bobina bat saldu ondoren, bobina hori biltegiko bere fitxategitik ezabatuko da 3. urratsean.



Esan bezala, programaren 1. urratsean eskaera-fitxategiaren izena konposatzen da uuuu/hh/ee formatuko data baten urtean oinarriturik. Adibidez, teklatuz 2025/06/20 irakurriz gero eskaera-fitxategiaren izena 2025_ESKAERAK.DAT izango da.

Ondoren, 2025_ESKAERAK.DAT fitxategiaren existentzia frogatuko da, eta, horrez gain, 2025_ESKAERAK.DAT fitxategiak elementuren baduela egiaztatuko da ere. Ezezkoan, datu-fitxategirik ez dagoelako edo datu-fitxategia izanik hutsak balego, programa amaitutzat emango litzateke 3. eta 4. urratsak bete gabe.

Esan bezala, biltegiko hiru fitxategien (ALUMINIOA.DAT, BURDINA.DAT eta KOBREA.DAT) existentziak ez dira egiaztatu behar, aldez aurretik sorturik direlako ziurtzat jotzen delako.

3. urratseko prozesaketa diharduen bitartean sBiltegiKodea izeneko eremua datuz betetzen joango da. Prozesaketaren ideia bat hartzeko, 3. urratseko prozesaketa diharduen bitartean 2025_ESKAERAK.DAT fitxategiak horrelako edukia izan dezake lehen 9 elementuak prozesatu direnean. Ikusten denez, bi egoera eman daitezke: eskaeraren ezaugarriko bobinarik badago biltegian eta eskaeraren ezaugarriko bobinarik ez dago biltegian:

Ariketaren 3. urratsa eskaera fitxategiaren prozesaketa da, lehen 9 elementuak prozesatu ondorengo emaitza erakusten da goiko irudian. 9 eskaeratatik 4 ezin izan dira bete eta beste 5ak bai.

3. urratseko prozesaketaren bi egoerak desberdintzen dira jarraian, 3a egoera, eskaeraren ezaugarriko bobinarik badago biltegian:

Ariketaren 3. urratsa eskaera fitxategiaren prozesaketa da, eta 3a egoera erakusten da irudi honetan.

Eta 3b egoera, eskaeraren ezaugarriko bobinarik ez dago biltegian:

Ariketaren 3. urratsa eskaera fitxategiaren prozesaketa da, eta 3b egoera erakusten da irudi honetan.

4. urratsa emaitzak pantailaratzearena da. Bi datu-motako fitxategiak daude, batetik eskaeren fitxategia eta bestetik biltegiko hiru fitxategiak:

Ariketaren 4. urratsean fitxategien edukiak pantailaratzen dira. Eskaeren fitxategiak 18 eskaera izan ditu eta 13 bete izan dira, baina 5 eskaera betetzeke geratu dira.

Ariketan eskatzen ez den arren, argigarria da ere saldu diren bobinen datuak pantailaratzea, hona hemen:

Eskaeren fitxategiak 18 eskaera izan ditu, eta bete diren 13 eskaeren bobinak biltegiko zein tokitan aurkitzen diren ikus daiteke irudi honetan.


Datu-fitxategiak aldez aurretik sorturik daudela suposatzen da azterketan. Hona hemen, datu-fitxategiak sortzeko erabil daitekeen DatuFitxategiakSortu proiektuaren main.c fitxategiaren kodea. Non 18 eskaeren 2025_ESKAERAK.DAT fitxategiaren datuak auzaz lortzen diren:

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

    Deskribapena: Informatika azterketa
                  2024-25 ikasturteko ez-ohiko deialdia
                  Industria Teknologiaren Ingeniaritzako Gradua
                  Bilbo, 2025eko ekainaren 20a

	Bertsioaren Ezaugarriak:
                - "2025_ESKAERAK.DAT" datu-fitxategia sortuko da
                - "ALUMINIOA.DAT" datu-fitxategia sortuko da
                - "BURDINA.DAT" datu-fitxategia sortuko da
                - "KOBREA.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_ESKA "2025_ESKAERAK.dat"
#define sFITX_ALUM "ALUMINIOA.dat"
#define sFITX_BURD "BURDINA.dat"
#define sFITX_KOBR "KOBREA.dat"

/*----------Array konstante batetik bezeroen izenak hartu eta fitxategira kargatu------------*/
#define iMAX_IZEN_BEZERO 51
static char asEskaerenZerrenda[][iMAX_IZEN_BEZERO] =
      { "2025-05-15_ElektroBanatu",    //  0 posizioa
        "2025-05-15_GoratuGarabiak",   //  1 posizioa
        "2025-05-16_IgoaIgogailuak",   //  2 posizioa
        "2025-05-28_SirgasBelasko",    //  3 posizioa
        "2025-05-29_Aldaiturrialde",   //  4 posizioa
        "2025-05-29_GoratuGarabiak",   //  5 posizioa
        "2025-05-29_CablesSalazar",    //  6 posizioa
        "2025-05-30_SirgasBelasko",    //  7 posizioa
        "2025-06-02_Aldaiturrialde",   //  8 posizioa
        "2025-06-02_SirgasBelasko",    //  9 posizioa
        "2025-06-11_CablesSalazar",    // 10 posizioa
        "2025-06_11_Aldaiturrialde",   // 11 posizioa
        "2025-06-11_ItsasGarraioak",   // 12 posizioa
        "2025-06-17_IgoaIgogailuak",   // 13 posizioa
        "2025-06-17_NavieraAzzur",     // 14 posizioa
        "2025-05-20_NavieraAzzur",     // 15 posizioa
        "2025-06-20_ElektroBanatu",    // 16 posizioa
        "2025-06-20_IgoaIgogailuak",   // 17 posizioa
      };

/*----------Array konstante batetik bobinen kodeak hartu eta fitxategira kargatu------------*/
#define iMAX_KODE_LUZERA 21
static char asBobinenZerrenda[][iMAX_KODE_LUZERA] =
      { "Aluminioa_8822", //  0 posizioa
        "Aluminioa_7003", //  1 posizioa
        "Aluminioa_7000", //  2 posizioa
        "Aluminioa_1110", //  3 posizioa
        "Aluminioa_6622", //  4 posizioa
        "Aluminioa_9966", //  5 posizioa
        "Aluminioa_8888", //  6 posizioa
        "Aluminioa_0009", //  7 posizioa
        "Aluminioa_2626", //  8 posizioa
        "Aluminioa_1516", //  9 posizioa  10 bobina

        "Burdina_2123",   // 10 posizioa
        "Burdina_3001",   // 11 posizioa
        "Burdina_2423",   // 12 posizioa
        "Burdina_5551",   // 13 posizioa
        "Burdina_3003",   // 14 posizioa
        "Burdina_7200",   // 15 posizioa
        "Burdina_8666",   // 16 posizioa
        "Burdina_2211",   // 17 posizioa
        "Burdina_7701",   // 18 posizioa
        "Burdina_6003",   // 19 posizioa
        "Burdina_4366",   // 20 posizioa
        "Burdina_0071",   // 21 posizioa
        "Burdina_0229",   // 22 posizioa  13 bobina

        "Kobrea_7113",    // 23 posizioa
        "Kobrea_4343",    // 24 posizioa
        "Kobrea_4444",    // 25 posizioa
        "Kobrea_6609",    // 26 posizioa
        "Kobrea_1054",    // 27 posizioa
        "Kobrea_3223",    // 28 posizioa
        "Kobrea_8080",    // 29 posizioa  7 bobina
      };


/* Deklarazio orokorrak */
struct tstEskaera
{
    char sEskaeraIdent[50];   // 49 karaktere gehi null karakterea
    char cMateriala;
    float fMetroak;
    char sBiltegiKodea[20];   // 19 karaktere gehi null karakterea
};
struct tstBobina
{
    char sBobinarenKodea[20]; // 19 karaktere gehi null karakterea
    int aiKokapena[3];        // 10x10x10=1000 bobina gehienez
    float fLuzera;
};

/* Prototipoak */
void EskaerenFitxategiaSortu(void);
void EskaerenFitxategiaIkusi(void);
void BiltegikoFitxategiakSortu(void);
void BiltegikoFitxategiakIkusi(void);

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

    /* Eskaeren fitxategia sortu eta ikusi */
    EskaerenFitxategiaSortu();
    EskaerenFitxategiaIkusi();
    printf("\n Aurrera egiteko edozein tekla sakatu...\n\n" );
    getche();  // Itxaroteko

    /* Biltegiko fitxategiak sortu eta ikusi */
    BiltegikoFitxategiakSortu();
    BiltegikoFitxategiakIkusi();
    printf("\n Aurrera egiteko edozein tekla sakatu...\n\n" );
    getche();  // Itxaroteko

    return 0;
}


/* 16 eskaeren fitxategia sortu. */
void EskaerenFitxategiaSortu(void)
{
    FILE *fbEskaFitx;
    char *sModua = "wb"; // Fitxategi bitarra sortu
    struct tstEskaera stEskaeraBat;
    int iMetala;  // 0 aluminioa, 1 burdina eta 2 kobrea

    srand(time(NULL));
    fbEskaFitx = fopen(sFITX_ESKA, sModua);

    for (int i=0; i<18; i++)
    {
        strcpy(stEskaeraBat.sEskaeraIdent, asEskaerenZerrenda[i]);
        iMetala = rand() % 3;
        switch (iMetala)
        {
            case 0: stEskaeraBat.cMateriala = 'A';
                    break;
            case 1: stEskaeraBat.cMateriala = 'B';
                    break;
            case 2: stEskaeraBat.cMateriala = 'K';
                    break;
        }
        stEskaeraBat.fMetroak = (float)rand()/RAND_MAX * (50.0-30.0) + 30.0;
        if (i==0) stEskaeraBat.fMetroak = 30;
        if (i==1 || i==3) stEskaeraBat.fMetroak = 49+0.2*i;
        strcpy(stEskaeraBat.sBiltegiKodea, "");

        fwrite(&stEskaeraBat, sizeof(stEskaeraBat), 1, fbEskaFitx);
    } // for

    fclose(fbEskaFitx);
};


/* 16 eskaeren fitxategiaren edukia erakutsi. */
void EskaerenFitxategiaIkusi(void)
{
    FILE *fbEskaFitx;
    struct tstEskaera stEskaeraBat;

    fbEskaFitx = fopen(sFITX_ESKA, "rb");

    printf("\n ==============================================================");
    printf("\n                        18 ESKAERA");
    while (fread(&stEskaeraBat, sizeof(stEskaeraBat), 1, fbEskaFitx) == 1)
    {
        printf("\n %2ld -------------------------------------------------------- %2ld",
                ftell(fbEskaFitx)/(long)sizeof(stEskaeraBat),
                ftell(fbEskaFitx)/(long)sizeof(stEskaeraBat));
        printf("\n      Eskaera-identifikadorea: %s", stEskaeraBat.sEskaeraIdent);
        switch (stEskaeraBat.cMateriala)
        {
            case 'A': printf("\n                    Materiala: ALUMINIOA");
                      break;
            case 'B': printf("\n                    Materiala: BURDINA");
                      break;
            case 'K': printf("\n                    Materiala: KOBREA");
                      break;
        }
        printf("\n                   Luzera (m): %.1f m", stEskaeraBat.fMetroak);
        printf("\n                Biltegi-kodea: |%s|", stEskaeraBat.sBiltegiKodea);
    }
    printf("\n ==============================================================\n");

    fclose(fbEskaFitx);
}


/* Biltegiko 3 fitxategiak sortu. */
void BiltegikoFitxategiakSortu(void)
{
    FILE *fbAlumFitx;
    FILE *fbBurdFitx;
    FILE *fbKobrFitx;
    char *sModua = "wb"; // Fitxategi bitarra sortu
    struct tstBobina stBobinaBat;

    srand(time(NULL));
    fbAlumFitx = fopen(sFITX_ALUM, sModua);
    fbBurdFitx = fopen(sFITX_BURD, sModua);
    fbKobrFitx = fopen(sFITX_KOBR, sModua);

    // Biltegia hutsik
    for (int iKont=0; iKont<3; iKont++)
    {
        stBobinaBat.aiKokapena[iKont] = 0;
    } // for

    // lehen 10 elementuak aluminiozkoak
    for (int i=0; i<=9; i++)
    {
        strcpy(stBobinaBat.sBobinarenKodea, asBobinenZerrenda[i]);
        stBobinaBat.aiKokapena[0] = i;
        stBobinaBat.fLuzera = (float)rand()/RAND_MAX * (50.0-30.0) + 30.0;

        fwrite(&stBobinaBat, sizeof(stBobinaBat), 1, fbAlumFitx);
    } // for

    // hurrengo 10 elementuak burdinezkoak
    for (int i=0; i<=9; i++)
    {
        strcpy(stBobinaBat.sBobinarenKodea, asBobinenZerrenda[i+10]);
        stBobinaBat.aiKokapena[0] = i;
        stBobinaBat.aiKokapena[1] = 1;
        stBobinaBat.fLuzera = (float)rand()/RAND_MAX * (50.0-30.0) + 30.0;

        fwrite(&stBobinaBat, sizeof(stBobinaBat), 1, fbBurdFitx);
    } // for

    // hurrengo 3 elementuak burdinezkoak
    for (int i=0; i<3; i++)
    {
        strcpy(stBobinaBat.sBobinarenKodea, asBobinenZerrenda[i+20]);
        stBobinaBat.aiKokapena[0] = i;
        stBobinaBat.aiKokapena[1] = 2;
        stBobinaBat.fLuzera = (float)rand()/RAND_MAX * (50.0-30.0) + 30.0;

        fwrite(&stBobinaBat, sizeof(stBobinaBat), 1, fbBurdFitx);
    } // for

    // hurrengo 7 elementuak kobrezkoak
    for (int i=0; i<=6; i++)
    {
        strcpy(stBobinaBat.sBobinarenKodea, asBobinenZerrenda[i+23]);
        stBobinaBat.aiKokapena[0] = i+3;
        stBobinaBat.aiKokapena[1] = 2;
        stBobinaBat.fLuzera = (float)rand()/RAND_MAX * (50.0-30.0) + 30.0;

        fwrite(&stBobinaBat, sizeof(stBobinaBat), 1, fbKobrFitx);
    } // for

    fclose(fbAlumFitx);
    fclose(fbBurdFitx);
    fclose(fbKobrFitx);
};


/* Biltegiko 4 fitxategien edukia erakutsi. */
void BiltegikoFitxategiakIkusi(void)
{
    FILE *fbAlumFitx;
    FILE *fbBurdFitx;
    FILE *fbKobrFitx;
    char *sModua = "rb"; // Fitxategi bitarra irakurketarako ireki
    struct tstBobina stBobinaBat;

    fbAlumFitx = fopen(sFITX_ALUM, sModua);
    fbBurdFitx = fopen(sFITX_BURD, sModua);
    fbKobrFitx = fopen(sFITX_KOBR, sModua);

    printf("\n ===================================================");
    printf("\n              ALUMINIOZKO 10 BOBINA");
    while (fread(&stBobinaBat, sizeof(stBobinaBat), 1, fbAlumFitx) == 1)
    {
        printf("\n %2ld --------------------------------------------- %2ld",
                ftell(fbAlumFitx)/(long)sizeof(stBobinaBat),
                ftell(fbAlumFitx)/(long)sizeof(stBobinaBat));
        printf("\n           Biltegi-kodea: |%s|", stBobinaBat.sBobinarenKodea);
        printf("\n                Kokapena: (%d,%d,%d)", stBobinaBat.aiKokapena[0],
                                                         stBobinaBat.aiKokapena[1],
                                                         stBobinaBat.aiKokapena[2]);
        printf("\n              Luzera (m): %.1f m", stBobinaBat.fLuzera);
    }
    printf("\n ===================================================\n");

    printf("\n");
    printf("\n ===================================================");
    printf("\n               BURDINEZKO 13 BOBINA");
    while (fread(&stBobinaBat, sizeof(stBobinaBat), 1, fbBurdFitx) == 1)
    {
        printf("\n %2ld --------------------------------------------- %2ld",
                ftell(fbBurdFitx)/(long)sizeof(stBobinaBat),
                ftell(fbBurdFitx)/(long)sizeof(stBobinaBat));
        printf("\n           Biltegi-kodea: |%s|", stBobinaBat.sBobinarenKodea);
        printf("\n                Kokapena: (%d,%d,%d)", stBobinaBat.aiKokapena[0],
                                                         stBobinaBat.aiKokapena[1],
                                                         stBobinaBat.aiKokapena[2]);
        printf("\n              Luzera (m): %.1f m", stBobinaBat.fLuzera);
    }
    printf("\n ===================================================\n");

    printf("\n");
    printf("\n ===================================================");
    printf("\n                 KOBREZKO 7 BOBINA");
    while (fread(&stBobinaBat, sizeof(stBobinaBat), 1, fbKobrFitx) == 1)
    {
        printf("\n %2ld --------------------------------------------- %2ld",
                ftell(fbKobrFitx)/(long)sizeof(stBobinaBat),
                ftell(fbKobrFitx)/(long)sizeof(stBobinaBat));
        printf("\n           Biltegi-kodea: |%s|", stBobinaBat.sBobinarenKodea);
        printf("\n                Kokapena: (%d,%d,%d)", stBobinaBat.aiKokapena[0],
                                                         stBobinaBat.aiKokapena[1],
                                                         stBobinaBat.aiKokapena[2]);
        printf("\n              Luzera (m): %.1f m", stBobinaBat.fLuzera);
    }
    printf("\n ===================================================\n");

    fclose(fbAlumFitx);
    fclose(fbBurdFitx);
    fclose(fbKobrFitx);
}




 



2025-05-15eko maiatzeko azterketa (Indust. Teknol.)


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




 



2025(e)ko maiatzaren 17(a), larunbata

3. kontrola



  2024/05/22, programa 

2024ko Maiatzaren deialdiko programa: Jatetxea


Azterketa ariketari lotutako informazioa. Proiektuan bost fitxategietan banaturik dago:

  • DatuMotak.h liburutegi-fitxategian estrukturen datu-motak definitzen dira eta konstanteen balioak finkatzen dira
  • Prototipoak.h liburutegi-fitxategi honetan funtzioen goiburu guztiak biltzen dira
  • main.c programa nagusia da eta bere kodeak ariketaren logika jasotzen du
  • DatuFitxategiakSortu.c fitxategian biltzen diren funtzioek datu-fitxategiak sortzeko balio dute
  • IkaslearenKodea.c ikasleak garatuko dituen funtzioen kodea fitxategi honetan bilduko da
Irudian erakusten da nola agertzen diren 5 fitxategi horiek Code::Blocks ingurunean. Alde batetik iturburu-kodearen
3 fitxategiak eta beste aldetik 2 liburutegi-fitxategiak (irudia handiago ikusteko bere gainean klik egin)

Bi datu-fitxategi behar dira: Mahaiak.dat eta MenuakEgunezEgun.dat. Biak estrukturak gordetzen dituzten fitxategien izenak izango dira:

  1. Lehen datu-fitxategiaren izena (Mahaiak.dat) teklatuz ematen da eta dagokion estruktura struct tstMahaia izango da
  2. Bigarren datu-fitxategiaren izena (MenuakEgunezEgun.dat) konstante bat da eta dagokion estruktura struct tstMenua izango da

Hau da 2024-05-22_Jatetxea proiektuaren porgrama gidatzeko erabiliko den menua:

 ============================================================================= 
 |                                  MENUA                                    | 
 ============================================================================= 
 |  1.  Erakutsi jatetxeko mahaien egoera                                    | 
 |  2.  Pantailaratu gaurko (ASTEAZKEN) menuak                               |
 |  3.  Mahaia erreserbatu                                                   |
 |---------------------------------------------------------------------------|
 |  4.  Erreserba ezeztatu                (2024KO AZTERKETAN EZ ZEN ESKATU)  |
 |---------------------------------------------------------------------------|
 |  5.  Jatekoa eskatu                                                       |
 |  6.  Kontua eskatu                                                        |
 |---------------------------------------------------------------------------| 
 |  7.  Gaurko kutxa osoa erakutsi        (2024KO AZTERKETAN EZ ZEN ESKATU)  | 
| 8. ... (2024KO AZTERKETAN EZ ZEN ESKATU) |
| 9. ... (2024KO AZTERKETAN EZ ZEN ESKATU) |
|---------------------------------------------------------------------------| | 0. Programatik irten | ============================================================================= Zure aukera hautatu: _

Goian ikusten denez, menuak hamar aukera ditu. Urdinez idazten direnak ez ziren azterketan eskatu. Deskriba ditzagun labur-labur aukera bakoitzaren helburua.

  1. aukera:   Mahaien fitxategitik abiatuta, hamar mahaien egoera pantailaratzen da
  2. aukera:   Kartaren arraytik abiatuta astegun baten menuak pantailaratzen dira
  3. aukera:   Mahaien fitxategitik abiatuta, erreserba bat burutzen da
  4. aukera:   Mahaien fitxategitik abiatuta, erreserba bat ezeztatzen da
  5. aukera:   Mahaien fitxategitik eta kartaren arraytik abiatuta, mahai baten mandatua egiten da
  6. aukera:   Mahaien fitxategitik eta irabazien arraytik abiatuta, mahai bateko kontua ordaintzen da
  7. aukera:   Eguneko irabazien arraytik abiatuta, hamar mahaietan gaur jaso diren euroak erakusten dira
  8. aukera:   ... (galdera berri bat, adibidez media bat kalkulatu)
  9. aukera:   ... (galdera berri bat, adibidez bezero bat bilatu)
  10. aukera:   Menua amaitu eta programatik irten (fitxategi bat sortu eta elikatu)

Azken aukeran, programatik irtetekoan, irabazien arrayaren informazioarekin eta sAsteguna aldagaiak duen katearekin Irabaziak_[sAsteguna].dat zenbaki errealen fitxategia sortu eta datuz betetzen da.



DatuMotak.h liburutegian konstanteak definitzen dira #define klausulari esker, eta, ondoren, behar diren bi estrukturen datu-motak definitzen dira ere. Gero, proiektuaren beste fitxategietan (main.c fitxategian, DatuFitxategiakSortu.c fitxategian eta IkaslearenKodea.c fitxategian) derrigorrezkoa izango da liburutegi honen #include egitea. 

Hona hemen DatuMotak.h liburutegian jasotzen dena:

/*====================================================================
    Programatzailea: Jesus Romo Uriarte

    Data: 2025eko apirilaren 14a

    Deskribapena: Informatika azterketa
                  2023-24 ikasturteko ohiko deialdia
                  Bilbo, 2024ko maiatzaren 22a

	Ezaugarriak:  Programak erabiltzen dituen datu-egituren eta
	              konstanteen definizioak biltzen dira hemen
=====================================================================*/

#define TRUE                      1
#define FALSE                     0
#define iMAHAIEN_MAX             10
#define iAULKI_KOP_MAX            6
#define iAULKI_KOP_MIN            2
#define iMENUEN_MAX               5
#define iZAZPI_EGUN               7
#define iFITX_IZEN_MAX          150
#define iDATU_IZEN_MAX          100
#define iASTEGUNAREN_LUZERA      15
#define MENUEN_FITX_IZEN        "MenuakEgunezEgun.dat"

/*----------------Programaren datu-moten deklarazioa----------------*/

//Estrukturen deklarazio orokorra

struct tstMahaia
{
    int iMahaiZbk;
    int iAulkiKop;
    int boLibre;
    char sErreserbaIzena[iDATU_IZEN_MAX];
    int iMahaikideKop;
};

struct tstMenua
{
    char sIzen[iDATU_IZEN_MAX];
    float fPrezioa;
    char sEguna[iASTEGUNAREN_LUZERA];
};


Programaren funtzioei dagozkien prototipo guztiak liburutegi honetan jasoko dira. Gero, proiektuaren beste fitxategietan (main.c fitxategian, DatuFitxategiakSortu.c fitxategian eta IkaslearenKodea.c fitxategian) derrigorrezkoa izango da liburutegi honen #include egitea. 

Hona hemen Prototipoak.h liburutegian jasotzen dena:

/*====================================================================
    Programatzailea: Jesus Romo Uriarte

    Data: 2025eko apirilaren 14a

    Deskribapena: Informatika azterketa
                  2023-24 ikasturteko ohiko deialdia
                  Bilbo, 2024ko maiatzaren 22a

	Ezaugarriak:  Programak erabiltzen dituen funtzio guztien
	              prototipoak biltzen dira hemen
=====================================================================*/

/*----------Funtzioen prototipoak-------------*/

int iFitxategirikBada(const char *sMahaienFitxIzen);

int iEgunaTxartoEmanda(const char sAsteguna[]);

int iMahaienFitxategianDatuakKargatu(const char sMahaienFitxIzen[]);

int iMenuenFitxategianDatuakKargatu(const char sMenuenFitxIzen[]);

void MenuakFitxategitikArrayra(const char *sMahaienFitxIzen,
                               struct tstMenua astMenuak[],
                               int *iLuz,
                               const char *sAsteEguna);

char cMenuarenAukeraHautatu(const char sAsteguna[]);

void MahaiBatErakutsi(const struct tstMahaia *stMahai);

void MahaiakErakutsi(const char *sMahaienFitxIzen);

void EgunekoMenuakPantailaratu(const struct tstMenua astMenuak[],
                               int iLuzM);

void MahaiaErreserbatu(const char* sFitxIzenMahaiak,
                       const char* sBezeroIzena,
                       int iMahaikideak);

void ErreserbaAldatu(const char *sMahaienFitxIzen,
                     int iMahaiZbk,
                     const char *sIzen,
                     int iZenbatMahaikide);

int iMahaikideKopuruaLortu(const char *sMahaienFitxIzen,
                           int iMahaiZbk);

void IrabaziakFitxategiBateanGorde1(const float afGaurkoIrabaziak[],   // 10 idazketa
                                    const char *sIrabazienFitxIzen);

void IrabaziakFitxategiBateanGorde2(const float afGaurkoIrabaziak[],   // idazketa bakarra
                                    const char *sIrabazienFitxIzen);

void MahaiaLibratu(const char *sMahaienFitxIzen,
                   int iMahaiZbk);

void IrabazienFitxategiaPantailaratu(const char *sIrabazienFitxIzen);

/*------------"Prototipoak.h" liburutegi-fitxategiaren amaiera------------*/


main.c fitxategian programaren logika nagusia kodetzen da, hona hemen bere kodea:  

/*======================================================================================
    Programatzailea: Jesus Romo Uriarte

    Data: 2025eko apirilaren 14a

    Deskribapena: Informatika azterketa
                  2023-24 ikasturteko ohiko deialdia
                  Bilbo, 2024ko maiatzaren 22a

	Bertsioaren Ezaugarriak:
	              - Datu-motak eta konstanteak "DatuMotak.h" liburutegian definitu dira
	              - Funtzioen goiburuak "Prototipoak.h" liburutegian definitu dira
	              - Mahaien fitxategia sortzeko kodea eta menuen fitxategia sortzeko
	                kodea "DatuFitxategiakSortu.c" fitxategian idatzi dira
=======================================================================================*/

#include <stdio.h>
#include <stdlib.h>  // system() funtzioarako
#include <string.h>
#include <conio.h>   // getch() eta getche()
#include "DatuMotak.h"
#include "Prototipoak.h"

/*------------- Funtzioen prototipoak "Prototipoak.h" liburutegian -------------*/

/*------- Funtzio nagusia -------------*/
int main()
{
    char sMahaienFitxIzen[iFITX_IZEN_MAX];
    char sAsteguna[iASTEGUNAREN_LUZERA];
    char sIrabazienFitxIzen[iFITX_IZEN_MAX];
    char sBezeroIzen[iFITX_IZEN_MAX];
    char cAukera;
    struct tstMenua astKarta[iZAZPI_EGUN];
    int iErrorea;
    int iKartarenLuzera;
    int iZenbatMahaikide;
    int iMahaiZbk;
    int iMenuaKartan;
    float afGaurkoIrabaziak[iMAHAIEN_MAX] = {0.0};  // 0tik 9ra, posizio guztietan 0.0 euro

    printf("\n   -------------------------------------------------------------------");
    printf("\n   -------- Jatetxe bateko ERRESERBAK eta MANDATUAK kudeatzen --------");
    printf("\n   -------------------------------------------------------------------\n");

    printf("\n\n Jatetxeko mahaien datuak gordetzen dituen\n fitxategiaren izen laburra eman (Mahaiak): ");
    gets(sMahaienFitxIzen);
    strcat(sMahaienFitxIzen, ".dat");

    // Mahaien fitxategia lehendik existitzen bada, bere informazioa mantendu
    if (iFitxategirikBada(sMahaienFitxIzen) == FALSE)
    {
        printf("\n\a ERROREA! '%s' fitxategia ez da existitzen oraintxe sortu da!\n", sMahaienFitxIzen);
        iErrorea = iMahaienFitxategianDatuakKargatu(sMahaienFitxIzen);
        if (iErrorea != 0)
            return iErrorea;
    }

    do
    {
        printf(" Gaurko asteko eguna? (Astelehen, Astearte, ... Igande): ");
        gets(sAsteguna);
        strupr(sAsteguna);
        if (iEgunaTxartoEmanda(sAsteguna) == TRUE)
            printf("\a");
    } while (iEgunaTxartoEmanda(sAsteguna) == TRUE);

    // Menuen fitxategia beti berria sortuko da
    iErrorea = iMenuenFitxategianDatuakKargatu(MENUEN_FITX_IZEN);
    if (iErrorea != 0)
        return iErrorea;
    MenuakFitxategitikArrayra(MENUEN_FITX_IZEN, astKarta, &iKartarenLuzera, sAsteguna);

    do
    {
        cAukera = cMenuarenAukeraHautatu(sAsteguna);
        printf("\n");
        switch (cAukera)
        {
            case '1': //printf("\n   1 - Erakutsi jatetxeko mahaien egoera");
                        MahaiakErakutsi(sMahaienFitxIzen);
                        break;
            case '2': //printf("\n   2 - Pantailaratu gaurko (%s) menuak", sAsteguna);
                        EgunekoMenuakPantailaratu(astKarta, iKartarenLuzera);
                        break;
            case '3': //printf("\n   3 - Mahaia erreserbatu";
                        MahaiakErakutsi(sMahaienFitxIzen);
                        printf(" Erreserba egiten...\n   Bezeroaren izena sartu: ");
                        gets(sBezeroIzen);
                        fflush(stdin);
                        printf(" Mahaikiden kopurua sartu: ");
                        scanf("%d", &iZenbatMahaikide);
                        fflush(stdin);
                        MahaiaErreserbatu(sMahaienFitxIzen, sBezeroIzen, iZenbatMahaikide);
                        break;
            case '4': //printf("\n   4 - Erreserba ezeztatu);
                      //hemen idatzi "ErreserbaEzeztatu()" funtzioaren deia
                        printf(" Mahaien fitxategitik abiatuta, erreserba bat ezeztatzen da\n");
                        break;
            case '5': //printf("\n   5 - Jatekoa eskatu");
                        do
                        {
                            printf(" Jatekoa eskatzen... Mahai-zenbakia (1..%d): ", iMAHAIEN_MAX);
                            scanf("%d",&iMahaiZbk);
                            fflush(stdin);
                        } while (iMahaiZbk < 1 || iMahaiZbk > iMAHAIEN_MAX);
                        iZenbatMahaikide = iMahaikideKopuruaLortu(sMahaienFitxIzen,iMahaiZbk);
                        printf(" Egin beharreko eskaera-kopurua: %d\n",iZenbatMahaikide);
                        for (int i=1; i<=iZenbatMahaikide; i++)
                        {
                            EgunekoMenuakPantailaratu(astKarta, iKartarenLuzera);
                            do
                            {
                                printf(" %d. mahaikidearen menua aukeratu (1 eta %d artekoa): ", i, iKartarenLuzera);
                                scanf("%d", &iMenuaKartan);
                                fflush(stdin);
                            } while (iMenuaKartan < 1 || iMenuaKartan > iKartarenLuzera);
                        afGaurkoIrabaziak[iMahaiZbk-1] = afGaurkoIrabaziak[iMahaiZbk-1] + astKarta[iMenuaKartan-1].fPrezioa;
                        printf(" Batura egin ondoren, %d. mahaiaren kontua %.2f Eurotakoa izango da\n", iMahaiZbk, afGaurkoIrabaziak[iMahaiZbk-1]);
                        }
                        break;
            case '6': //printf("\n   6 - Kontua eskatu eta ordaindu");
                        do
                        {
                            printf(" Kontua eskatzen... Mahai-zenbakia (1..%d): ", iMAHAIEN_MAX);
                            scanf("%d",&iMahaiZbk);
                            fflush(stdin);
                        } while (iMahaiZbk < 1 || iMahaiZbk > iMAHAIEN_MAX);
                        printf(" %d. mahaiak %.2f Euro ordaindu behar ditu\n", iMahaiZbk, afGaurkoIrabaziak[iMahaiZbk-1]);
                        printf(" %d. mahaia libratzen...\n", iMahaiZbk);
                        if (afGaurkoIrabaziak[iMahaiZbk-1] != 0)
                            MahaiaLibratu(sMahaienFitxIzen, iMahaiZbk);
                        else
                        {
                            printf(" %d. mahaia ezin daiteke bihurtu eskuragarri, dagoeneko libre\n", iMahaiZbk);
                            printf(" dagoelako edo bezeroek oraindik ez dutelako kontua ordaindu\n");
                        }
                        break;
            case '7': //printf("\n   7 - Gaurko kutxa osoa erakutsi");
                      //hemen idatzi "KontuakPantailaratu()" funtzioaren deia
                        printf(" Irabazien arraytik abiatuta, hamar mahaietan\n gaur jaso diren euroak erakusten dira\n");
                        break;
            case '8': //printf("\n   8 - Zeregin berri bat");
                        printf(" 8. aukerako zeregina\n");
                        break;
            case '9': //printf("\n   9 - Zeregin berri bat");
                        printf(" 9. aukerako zeregina\n");
                        break;
            case '0': //printf("\n   0 - Irabaziak eguneratu eta programatik irten");
                        strcpy(sIrabazienFitxIzen, "Irabaziak_");
                        strcat(sIrabazienFitxIzen, sAsteguna);
                        strcat(sIrabazienFitxIzen, ".dat");
                        IrabaziakFitxategiBateanGorde1(afGaurkoIrabaziak, sIrabazienFitxIzen);
                        IrabazienFitxategiaPantailaratu(sIrabazienFitxIzen);
                        IrabaziakFitxategiBateanGorde2(afGaurkoIrabaziak, sIrabazienFitxIzen);
                        IrabazienFitxategiaPantailaratu(sIrabazienFitxIzen);
                        printf("\n Programaren amaiera\n");
                        break;
        }
        if (cAukera != '0')
        {
            printf("\n Aurrera egiteko edozein tekla sakatu... ");
            getche();  // itxaroteko
        }
    } while (cAukera!='0');

    return 0;
}

/*--------- Mahaien fitxategia existitzen den konprobaketa ------------*/
int iFitxategirikBada(const char *sMahaienFitxIzen)
{
    FILE *fbErakMahaiak;
    int iBaiBada;

    fbErakMahaiak = fopen(sMahaienFitxIzen, "rb");

    if (fbErakMahaiak == NULL)
        iBaiBada = FALSE;  // 0
    else
    {
        fclose(fbErakMahaiak);
        iBaiBada = TRUE;   // 1
    }
    return iBaiBada;
}

/*----------------iEgunaTxartoEmanda------------------*/
int iEgunaTxartoEmanda(const char sAsteguna[])
{
   int iErantzuna;

   iErantzuna = TRUE;

   if (strcmp(sAsteguna, "ASTELEHEN") == 0)
   {
       iErantzuna = FALSE;
       return iErantzuna;
   }
   if (strcmp(sAsteguna, "ASTEARTE") == 0)
   {
       iErantzuna = FALSE;
       return iErantzuna;
   }
   if (strcmp(sAsteguna, "ASTEAZKEN") == 0)
   {
       iErantzuna = FALSE;
       return iErantzuna;
   }
   if (strcmp(sAsteguna, "OSTEGUN") == 0)
   {
       iErantzuna = FALSE;
       return iErantzuna;
   }
   if (strcmp(sAsteguna, "OSTIRAL") == 0)
   {
       iErantzuna = FALSE;
       return iErantzuna;
   }
   if (strcmp(sAsteguna, "LARUNBAT") == 0)
   {
       iErantzuna = FALSE;
       return iErantzuna;
   }
   if (strcmp(sAsteguna, "IGANDE") == 0)
   {
       iErantzuna = FALSE;
       return iErantzuna;
   }
   return iErantzuna;
}

/*------ Egun bateko menuak fitxategitik arrayra iraultzea------*/
void MenuakFitxategitikArrayra(const char *sMenuenFitxIzen,
                               struct tstMenua astMenuak[],
                               int *iLuz,
                               const char *sAsteEguna)
{
    FILE *fbErakMenuak;
    struct tstMenua stMenuBat;

    *iLuz = 0;
    fbErakMenuak = fopen(sMenuenFitxIzen, "rb");
    while (fread(&stMenuBat, sizeof(stMenuBat), 1, fbErakMenuak) == 1)
    {
        if (strcmp(stMenuBat.sEguna, sAsteEguna) == 0)
        {
            astMenuak[*iLuz] = stMenuBat;
            *iLuz = *iLuz + 1;
        }
    }
    fclose(fbErakMenuak);
}

/*---------Menua------------*/
char cMenuarenAukeraHautatu(const char sAsteguna[])
{
    char cAukera;

    system("cls");
    printf("\n  ===================MENUA===================");
    printf("\n    1 - Erakutsi jatetxeko mahaien egoera");
    printf("\n    2 - Pantailaratu gaurko (%s) menuak", sAsteguna);
    printf("\n    3 - Mahaia erreserbatu");
    printf("\n    4 - ... Erreserba ezeztatu");
    printf("\n    5 - Jatekoa eskatu");
    printf("\n    6 - Kontua eskatu eta ordaindu");
    printf("\n    7 - ... Gaurko kutxa osoa erakutsi");
    printf("\n    8 - ... Zeregin berri bat");
    printf("\n    9 - ... Zeregin berri bat");
    printf("\n    0 - Programatik irten");
    printf("\n  ===========================================\n");

    do
    {
       printf("\n          Zure aukera hautatu: ");
       cAukera = getche();
       if (cAukera < '0' || cAukera > '9')
          printf("\a");
    } while (cAukera < '0' || cAukera > '9');

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

/*-------Mahai estruktura erakutsi---------------*/
void MahaiBatErakutsi(const struct tstMahaia *stMahaiBat)
{
    printf("%10d", stMahaiBat->iMahaiZbk);
    printf("%12d", stMahaiBat->iAulkiKop);
    printf("%16d", stMahaiBat->iMahaikideKop);
    if (stMahaiBat->boLibre)
        printf("     Libre\n");
    else
        printf("     Erreserbatuta: %s\n", stMahaiBat->sErreserbaIzena);
}

/*--------Jatetxe estruktura erakutsi ---------*/
void MahaiakErakutsi(const char *sMahaienFitxIzen)
{
    FILE *fbErakMahaiak;
    struct tstMahaia stMahaiBat;

    fbErakMahaiak = fopen(sMahaienFitxIzen, "rb");
    printf("  --------------------------------------------------------------------\n");
    printf("%10s%12s%16s%22s\n","MAHAIA","AULKIAK","MAHAIKIDEAK","ESKURAGARRITASUNA" );
    printf("  --------------------------------------------------------------------\n");
    while (fread(&stMahaiBat, sizeof(stMahaiBat), 1, fbErakMahaiak) == 1)
        MahaiBatErakutsi(&stMahaiBat);
    printf("  --------------------------------------------------------------------\n");
    fclose(fbErakMahaiak);
}

/*----------Menuak erakutsi-------------*/
void EgunekoMenuakPantailaratu(const struct tstMenua astMenuak[],
                               int iLuzMenuZerrenda)
{
    int i;

    printf(" ----------------------------------------------------------------------\n");
    printf("%13s%20s%19s%16s\n", "MENU ZBK.", "MENUA", "PREZIOA", "EGUNA");
    printf(" ----------------------------------------------------------------------");

    for (i=0; i<iLuzMenuZerrenda; i++)
        printf("\n %8d%24s%14.2f euro %15s", i + 1, astMenuak[i].sIzen, astMenuak[i].fPrezioa, astMenuak[i].sEguna);
    printf("\n ----------------------------------------------------------------------\n");
}

/*----------Mahai informazioa aldatu-------------*/
void ErreserbaAldatu(const char *sMahaienFitxIzen,
                     int iMahaiZbk,
                     const char *sIzen,
                     int iZenbatMahaikide)
{
    FILE *fbErakMahaiak;
    struct tstMahaia stMahaiBat;

    fbErakMahaiak = fopen(sMahaienFitxIzen, "r+b");

    fseek(fbErakMahaiak, (iMahaiZbk-1)*(long)sizeof(stMahaiBat), SEEK_SET);
    fread(&stMahaiBat, sizeof(stMahaiBat), 1, fbErakMahaiak);

    stMahaiBat.boLibre = 0;
    strcpy(stMahaiBat.sErreserbaIzena, sIzen);
    stMahaiBat.iMahaikideKop = iZenbatMahaikide;

    fseek(fbErakMahaiak, (iMahaiZbk-1)*(long)sizeof(stMahaiBat), SEEK_SET);
    fwrite(&stMahaiBat, sizeof(stMahaiBat), 1, fbErakMahaiak);

    fclose(fbErakMahaiak);
}

/*----- Mahaikide zenbakia lortu-----------*/
int iMahaikideKopuruaLortu(const char *sMahaienFitxIzen,
                           int iMahaiZbk)
{
    FILE *fbErakMahaiak;
    struct tstMahaia stMahaiBat;

    fbErakMahaiak = fopen(sMahaienFitxIzen, "rb");

    fseek(fbErakMahaiak, (iMahaiZbk-1)*(long)sizeof(stMahaiBat), SEEK_SET);
    fread(&stMahaiBat, sizeof(stMahaiBat), 1, fbErakMahaiak);

    fclose(fbErakMahaiak);

    return stMahaiBat.iMahaikideKop;
}

/*-----------Irabaziak fitxategira irauli, 10 idazketak banan-banan eginez-----------*/
void IrabaziakFitxategiBateanGorde1(const float afGaurkoIrabaziak[],
                                    const char *sIrabazienFitxIzen)
{
    FILE *fbErakKutxa;

    fbErakKutxa = fopen(sIrabazienFitxIzen, "wb");
    for (int iKont=0; iKont<iMAHAIEN_MAX; iKont++)
    {
        fwrite(&afGaurkoIrabaziak[iKont], sizeof(float), 1, fbErakKutxa);
    }
    fclose(fbErakKutxa);
    printf(" 10 idazketa...\n");
}

/*-----------Irabaziak fitxategira irauli, 10 zenbakiak idazketa bakarrean hartuz-----------*/
void IrabaziakFitxategiBateanGorde2(const float afGaurkoIrabaziak[],
                                    const char *sIrabazienFitxIzen)
{
    FILE *fbErakKutxa;

    fbErakKutxa = fopen(sIrabazienFitxIzen, "wb");
    fwrite(afGaurkoIrabaziak, sizeof(afGaurkoIrabaziak[0]), iMAHAIEN_MAX, fbErakKutxa);
    fclose(fbErakKutxa);
    printf("\n Idazketa bakarra...\n");
}

/*-----------Mahaia eskuragarri ipini-----------*/
void MahaiaLibratu(const char *sMahaienFitxIzen,
                   int iMahaiZbk)
{
    FILE *fbErakMahaiak;
    struct tstMahaia stMahaiBat;

    fbErakMahaiak = fopen(sMahaienFitxIzen, "r+b");

    fseek(fbErakMahaiak, (iMahaiZbk-1)*(long)sizeof(stMahaiBat), SEEK_SET);
    fread(&stMahaiBat, sizeof(stMahaiBat), 1, fbErakMahaiak);

    stMahaiBat.boLibre = 1;
    strcpy(stMahaiBat.sErreserbaIzena, "");
    stMahaiBat.iMahaikideKop = 0;

    fseek(fbErakMahaiak, (iMahaiZbk-1)*(long)sizeof(stMahaiBat), SEEK_SET);
    fwrite(&stMahaiBat, sizeof(stMahaiBat), 1, fbErakMahaiak);

    fclose(fbErakMahaiak);
}

/*-----------Irabaziak, float diren 10 elementuko fitxategi bat-----------*/
void IrabazienFitxategiaPantailaratu(const char *sIrabazienFitxIzen)
{
    FILE *fbErakEuroak;
    float fEuroak;
    int iMahaiZenbakia = 0;

    fbErakEuroak = fopen(sIrabazienFitxIzen, "rb");

    printf(" -----------------------------------------------------------\n");
    printf("              GAURKO IRABAZIAK (EUROAK)\n");
    printf(" -----------------------------------------------------------\n");
    printf("  '%s' fitxategiaren edukia:", sIrabazienFitxIzen);
    while (fread(&fEuroak, sizeof(float), 1, fbErakEuroak) == 1)
    {
        iMahaiZenbakia++;
        printf("\n    %2d zenbakiko mahaian %8.2f euro irabazi dira", iMahaiZenbakia, fEuroak);
    }
    printf("\n -----------------------------------------------------------\n");
    fclose(fbErakEuroak);
}

/*------------Mahai bat erreserbatu mahaikide kopuru jakin batentzat--------------*/
void MahaiaErreserbatu(const char* sFitxIzenMahaiak, const char* sBezeroIzena, int iMahaikideak)
{
    FILE *f;
    struct tstMahaia rdMahaiBat;
    int iAulkiKopurua = iMahaikideak;
    int boMahaiaErreserbatua = FALSE;

    f = fopen(sFitxIzenMahaiak, "r+b");

    do
    {
        printf(" sBezeroIzena = %s, iMahaikideak = %d, iAulkiKopurua = %d\n",
               sBezeroIzena, iMahaikideak, iAulkiKopurua);

        fseek(f, 0L, SEEK_SET);  // fitxategia hasierara
        while (fread(&rdMahaiBat, sizeof(struct tstMahaia), 1, f) == 1 && !boMahaiaErreserbatua)
        {
            if (rdMahaiBat.iAulkiKop == iAulkiKopurua && rdMahaiBat.boLibre)
            {
                rdMahaiBat.boLibre = FALSE;
                strcpy(rdMahaiBat.sErreserbaIzena, sBezeroIzena);
                rdMahaiBat.iMahaikideKop = iMahaikideak;

                fseek(f, (-1)*(long)sizeof(struct tstMahaia), SEEK_CUR); // posizio egokira
                fwrite(&rdMahaiBat, sizeof(struct tstMahaia), 1, f);

                printf(" Erreserba gauzatu da, mahai zenbakia: %d\n", rdMahaiBat.iMahaiZbk);
                boMahaiaErreserbatua = TRUE;
            }
        }
        iAulkiKopurua++;
    } while (iAulkiKopurua <= iAULKI_KOP_MAX && !boMahaiaErreserbatua);

    if (!boMahaiaErreserbatua)
        printf(" Eskatutako mahaikide kopururako tokirik ez dago.\n");

    fclose(f);
}


Jarraian ikus daitekeen bezala, datu-fitxategiak sortzeko funtzioak DatuFitxategiakSortu.c barnean garatu dira:  

/*====================================================================
    Programatzailea: Jesus Romo Uriarte

    Data: 2025eko apirilaren 14a

    Deskribapena: Informatika azterketa
                  2023-24 ikasturteko ohiko deialdia
                  Bilbo, 2024ko maiatzaren 22a

	Ezaugarriak:  Fitxategiak sortzeko funtzioak garatzen dira
=====================================================================*/

/*-------------------------------------------------------------------
    Mahaien eta menuen datu-fitxategiekin lan egiteko funtzioen
    garapenak biltzen dira fitxategi honetan.

    - Mahaien fitxategi bitarra sortu datuak kargatuz
    - Menuen fitxategi bitarra sortu datuak kargatuz
---------------------------------------------------------------------*/

#include <stdio.h>
#include <stdlib.h>  // rand() eta srand()
#include <string.h>  // strcpy()
#include <time.h>    // time()
#include "DatuMotak.h"
#include "Prototipoak.h"

/*------------- Funtzioen prototipoak "Prototipoak.h" liburutegian -------------*/

/*----------Array konstante batetik mahaien datuak hartu eta fitxategira kargatu------------*/
    #define iMAX_IZENAK 23

    static char asIzenenZerrenda[][iDATU_IZEN_MAX] =
                     { "Luisa",  "Eva",   "Janire", "Itsaso", "Jon",     //  5+
                       "Leire",  "Gorka", "Koldo",  "Iesus",  "Andoni",  // 10+
                       "Helene", "Pedro", "Anne",   "Ainhoa", "Kepa",    // 15+
                       "Juan",   "Gemma", "Marina", "Carmen", "Mario",   // 20+
                       "Belen",  "Nuria", "Carlos"                       // 23
                     };

int iMahaienFitxategianDatuakKargatu(const char sMahaienFitxIzen[])
{
   FILE *fbErakFitx;
   char *sModua = "wb"; // Fitxategi bitarra sortu
   struct tstMahaia stMahaia;

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

   for (int i=0; i<iMAHAIEN_MAX; i++)
   {
       stMahaia.iMahaiZbk = i + 1;

       /* Aulkiak 2 eta 6 artean auzaz */
       stMahaia.iAulkiKop = (rand() % (iAULKI_KOP_MAX - iAULKI_KOP_MIN + 1)) + iAULKI_KOP_MIN;

       if (rand() % 2 == 0)
       {
          stMahaia.boLibre = TRUE;
          strcpy(stMahaia.sErreserbaIzena, "");
          stMahaia.iMahaikideKop = 0;
       }
       else
       {
          stMahaia.boLibre = FALSE;
          strcpy(stMahaia.sErreserbaIzena, asIzenenZerrenda[rand() % iMAX_IZENAK]);
          stMahaia.iMahaikideKop = rand() % (stMahaia.iAulkiKop) + 1;
       }

       if (fwrite (&stMahaia, sizeof(struct tstMahaia), 1, fbErakFitx) != 1)
       {
           printf("\n\a ERROREA: Ezin izan da idatzi fitxategiaren bukaeran\n");
           return -11;
       }

   } // for

   fclose(fbErakFitx);
   return 0;
};

/*----------Array konstante batetik menuen datuak hartu eta fitxategira kargatu------------*/
   #define iMENUEN_LUZERA 41

   static struct tstMenua astMenuenZerrenda[] =
                    {
                      {"Menu  1" , 18.00 , "ASTELEHEN"} ,       // 1
                      {"Menu  1" , 20.50 , "OSTEGUN"} ,         // 2
                      {"Menu  2" , 22.5 , "ASTELEHEN"} ,
                      {"Menu  3" , 18.00 , "ASTEARTE"} ,
                      {"Menu  4" , 22.75 , "ASTEAZKEN"} ,
                      {"Menu  5" , 50.0 , "OSTEGUN"} ,
                      {"Menu  5" , 22.75 , "ASTEARTE"} ,
                      {"Menu  6" , 23.00 , "ASTEAZKEN"} ,
                      {"Menu  7" , 20.00 , "ASTEAZKEN"} ,
                      {"Menu  8" , 45.0 , "OSTIRAL"} ,          // 10
                      {"Menu  9" , 19.50 , "OSTIRAL"} ,         // 11
                      {"Menu 10" , 21.50 , "OSTIRAL"} ,         // 12
                      {"Menu 11" , 23.50 , "ASTELEHEN"} ,
                      {"Menu 11" , 23.50 , "LARUNBAT"} ,
                      {"Menu 11" , 23.50 , "IGANDE"} ,
                      {"Menu 12" , 18.95 , "OSTEGUN"} ,
                      {"Menu 12" , 18.95 , "LARUNBAT"} ,
                      {"Menu 12" , 18.95 , "IGANDE"} ,
                      {"Begano 1" , 18.00 ,  "ASTELEHEN"} ,
                      {"Begano 1" , 20.00 ,  "ASTEAZKEN"} ,     // 20
                      {"Begano 2" , 21.00 , "ASTELEHEN"} ,      // 21
                      {"Begano 2" , 19.00 ,  "ASTEARTE"} ,      // 22
                      {"Begano 3" , 22.00 , "ASTEARTE"} ,
                      {"Begano 3" , 18.0 , "OSTEGUN"} ,
                      {"Begano 3" , 19.0 , "OSTIRAL"} ,
                      {"Begano 3" , 19.0 , "LARUNBAT"} ,
                      {"Begano 3" , 19.0 , "IGANDE"} ,
                      {"Begano 4" , 24.0 , "OSTIRAL"} ,
                      {"Begano 4" , 24.0 , "LARUNBAT"} ,
                      {"Begano 4" , 24.0 , "IGANDE"} ,          // 30
                      {"Begetariano 1" , 19.0 , "ASTELEHEN"} ,  // 31
                      {"Begetariano 1" , 21.75 , "ASTEAZKEN"} , // 32
                      {"Begetariano 1" , 21.75 , "LARUNBAT"} ,
                      {"Begetariano 1" , 21.75 , "IGANDE"} ,
                      {"Begetariano 2" , 19.25 , "ASTEARTE"} ,
                      {"Begetariano 2" , 19.25 , "LARUNBAT"} ,
                      {"Begetariano 2" , 19.25 , "IGANDE"} ,
                      {"Piszitariano" , 35.25 , "OSTEGUN"} ,
                      {"Piszitariano" , 35.25 , "OSTIRAL"} ,
                      {"Piszitariano" , 35.25 , "LARUNBAT"} ,   // 40
                      {"Piszitariano" , 35.25 , "IGANDE"}       // 41
                    };


int iMenuenFitxategianDatuakKargatu(const char sMenuenFitxIzen[])
{
   FILE *fbstKarta;
   char *sModua = "wb"; // Fitxategi bitarra sortu
   int i;

   fbstKarta = fopen(sMenuenFitxIzen, sModua);

   for (i=0; i<iMENUEN_LUZERA; i++)
   {
       /* Programa honetan konprobazio hau ez da guztiz beharrezkoa */
       if (fwrite (&astMenuenZerrenda[i], sizeof(struct tstMenua), 1, fbstKarta) != 1)
       {
          printf("\n\a ERROREA: Ezin izan zaio gehitu fitxategiari elementua\n");
          return -21;
       }
   }  // for

   fclose(fbstKarta);
   return 0;
}


Ikasleak idatzi beharko duen gehiena fitxategi honetan jasoko du:  

/*====================================================================
    Ikaslearen izena-abizena: _______________________

	Lanak   Zure kode gehiena hemen idatziko duzu. Esate baterako,
	-----   demagun 10 mahaietan lortu diren euroak pantailaratu
	        nahi direla: 7. aukerako KontuakPantailaratu() funtzioa.

	Urratsak   Hiru fitxategitan idatzi beharko duzu:
    --------
	              - "main.c" fitxategian 7. aukera editatu KontuakPantailaratu()
	                         funtzioaren deia egiteko
	              - "Prototipoak.h" liburutegian KontuakPantailaratu() funtzioaren
	                                goiburua idatzi
	              - "IkaslearenKodea.c" fitxategi honetan KontuakPantailaratu()
	                                    funtzioa garatu
=====================================================================*/

#include <stdio.h>
#include "DatuMotak.h"
#include "Prototipoak.h"

/*-----4. aukera-------Mahaia baten erreserba ezeztatu-------------------*/
// Idatzi hemen "ErreserbaEzeztatu()" funtzioaren kodea


/*-----7. aukera-------Mahaien uneko irabaziak pantailaratu--------------*/
// Idatzi hemen "KontuakPantailaratu()" funtzioaren kodea


/*-----8. aukera-------Zeregin berria, adibidez media bat kalkulatu------*/
// Idatzi hemen media kalkulatzen duen funtzioaren kodea


/*-----9. aukera-------Zeregin berria, adibidez bilaketa bat egin--------*/
// Idatzi hemen bilaketa burutzen duen funtzioaren kodea


/*---------------"IkaslearenKodea.c" fitxategiaren amaiera---------------*/


  Proiektuaren baliabideak 





  Proiektuaren fitxategiak eta Code::Blocks ingurunea 

Proiektuak behar dituen 5 fitxategi horiek Code::Blocks ingurune grafikoan nola agertzen diren jakiteko, ikusi blogeko 3. kontroleko proiektua izena duen orrialdea.