2025eko ekaineko azterketa


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




 



iruzkinik ez:

Argitaratu iruzkina