2025(e)ko apirilaren 3(a), osteguna

Ariketa 70 | Estrukturen bektore bat lortu

ZER DAKIDAN:
Arrayak eta estrukturak ezagutzen ditut.



ZER IKASIKO DUDAN:
Kateen array batetik abiatuta, estrukturen array bat lortuko dut programa honetan.

Laborategiko gela batean, gehienez, 25 ikasle izango dira. Ikasleen datuak bektore batean biltzen dira, adibidez irudiko hurrengo 5 ikasleren datuak. Bektorearen elementuak kateak izanik bertan izena eta zenbaki bat daude koma batez banaturik. Jatorrizko kateak moztuz, beste array bat lortu behar da, 5 elementukoa ere, baina array berriaren elementuak estrukturak izango dira:
Horretarako, ezinbestekoa da datu-motak era egokian definitzea. Ondoko irudian erakusten da programatzaile batek egindako datu-mota definizioa:


Eta hauek dira aldagai garrantzitsuenak, kateen arraya eta estrukturen arraya:

/* Ariketa-70_EstrukturenBektoreBatLortu: kateen array batetik estrukturen array batera */

#include <stdio.h>
#include <string.h>   // strcspn(), strchr(), strcpy(), strncpy() eta strcmp() funtzioetarako
#include <stdlib.h>   // srand() eta rand() funtzioterako
#include <time.h>     // time() funtziorako
#include <ctype.h>    // toupper() funtziorako
#include <conio.h>    // getche() funtziorako
#include <math.h>     // fabs() funtziorako

#define IKASLE_KOP_MAX 25
#define KATEEN_LUZ_MAX 31

struct tstElementu
{
    char sNor[31];
    float fNota;
};

void DatuakSartu(char asZerrenda_1[IKASLE_KOP_MAX][KATEEN_LUZ_MAX],
                  int *iLuzera);

void DatuakIkusi(const char asZerrenda_1[IKASLE_KOP_MAX][KATEEN_LUZ_MAX],
                   int iLuzera);

int iElementuaBilatu(const char asZerrenda_1[IKASLE_KOP_MAX][KATEEN_LUZ_MAX],
                            int iLuzera,
                     const char sGakoDatuOsoa[31]);

void IzenaZenbakiaBanatu( char *sDatua,
                          char sIzena[31],
                         float *fZbk);

void BektoreBerriaSortu(              char asZerrenda_1[IKASLE_KOP_MAX][KATEEN_LUZ_MAX],
                        struct tstElementu astZerrenda_2[IKASLE_KOP_MAX],
                                       int iLuzera);

void BektoreBerriaIkusi(const struct tstElementu astZerrenda_2[IKASLE_KOP_MAX],
                                             int iLuzera);

int iIkasleaIzenezBilatu(const struct tstElementu astZerrenda_2[IKASLE_KOP_MAX],
                                              int iLuzera,
                                       const char sGakoa[31]);

int iIkasleaNotazBilatu(const struct tstElementu astZerrenda_2[IKASLE_KOP_MAX],
                                             int iLuzera,
                                           float fGakoa);


int main()
{
    char asZerrenda_1[IKASLE_KOP_MAX][KATEEN_LUZ_MAX];
    struct tstElementu astZerrenda_2[IKASLE_KOP_MAX];  // gehienez 25 ikasle, indizeak 0-tik 24-ra
    int iLuzera, iNon;
    char sGakoa[KATEEN_LUZ_MAX];
    float fGakoa;

    DatuakSartu(asZerrenda_1, &iLuzera);
    printf("\n");
    DatuakIkusi(asZerrenda_1, iLuzera);

    printf("Ikaslearen datuak eman (adibidez 'Jokin,+1.38')\nelementu horren posizioa zehazteko: ");
    gets(sGakoa);

    iNon = iElementuaBilatu(asZerrenda_1, iLuzera, sGakoa);

    if (iNon == -1)
        printf("'%s' elementu hori ez dago gelan\n", sGakoa);
    else
        printf("'%s' elementuaren posizioa gelan %d da\n", sGakoa, iNon);

    printf("\n\n");

    BektoreBerriaSortu(asZerrenda_1, astZerrenda_2, iLuzera);
    BektoreBerriaIkusi(astZerrenda_2, iLuzera);

    printf("Ikaslearen izena eman (adibidez 'Jokin')\nbere posizioa zehazteko: ");
    gets(sGakoa);

    iNon = iIkasleaIzenezBilatu(astZerrenda_2, iLuzera, sGakoa);

    if (iNon == -1)
        printf("'%s' izeneko ikaslerik ez dago gelan\n", sGakoa);
    else
        printf("'%s' ikaslearen posizioa gelan %d da\n", sGakoa, iNon);

    printf("Ikaslearen nota eman bere posizioa zehazteko: ");
    scanf("%f", &fGakoa);

    iNon = iIkasleaNotazBilatu(astZerrenda_2, iLuzera, fGakoa);

    if (iNon == -1)
        printf("%.2f nota duen ikaslerik ez dago gelan\n", fGakoa);
    else
        printf("%.2f nota duen ikaslearen posizioa gelan %d da\n", fGakoa, iNon);

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


void DatuakSartu(char asZerrenda_1[IKASLE_KOP_MAX][KATEEN_LUZ_MAX],
                  int *iLuzera)
{
    int iKont = 0;
    char cErantz;
    char sIzena[KATEEN_LUZ_MAX];
    char sZeinua[2] = "";
    char sZbk[5] = "";

    srand(time(NULL));

    cErantz = 'B';
    while (iKont < IKASLE_KOP_MAX && cErantz == 'B')
    {
        strcpy(asZerrenda_1[iKont], "");
        printf("\n\nasZerrenda_1[%d]=|%s|  (hasieran hutisk)", iKont, asZerrenda_1[iKont]);
        printf("\n%d posizioko ikaslearen izena eman (adibidez, Danel): ", iKont);
        gets(sIzena);
        strcat(asZerrenda_1[iKont], sIzena);
        strcat(asZerrenda_1[iKont], ",");
        printf("asZerrenda_1[%d]=|%s|        (izena,)", iKont, asZerrenda_1[iKont]);

        if (rand() % 2 == 0)
            sZeinua[0] = '-';
        else
            sZeinua[0] = '+';
        strcat(asZerrenda_1[iKont], sZeinua);
        printf("\nasZerrenda_1[%d]=|%s|       (izena,+)izena,-)", iKont, asZerrenda_1[iKont]);

        srand(time(NULL));
        sZbk[0] = (char)(rand()%10 + (int)'0');
        sZbk[1] = '.';
        sZbk[2] = (char)(rand()%10 + (int)'0');
        sZbk[3] = (char)(rand()%10 + (int)'0');
        // printf("\nsZbk=|%s|\n\n", sZbk);
        strcat(asZerrenda_1[iKont], sZbk);
        printf("\nasZerrenda_1[%d]=|%s|   (izena,+1.23)\n", iKont, asZerrenda_1[iKont]);

        iKont++;

        do
        {
            printf("Ikasle gehiagorik? (B/E): ");
            cErantz = getche();
            cErantz = toupper(cErantz);
            if (cErantz != 'B' && cErantz != 'E')
                printf("\n'B' ala 'E'\n");
        } while (cErantz != 'B' && cErantz != 'E');
    }
    *iLuzera = iKont;
}


void DatuakIkusi(const char asZerrenda_1[IKASLE_KOP_MAX][KATEEN_LUZ_MAX],
                        int iLuzera)
{
    printf("\nEdukiak:\n");
    for (int i = 0; i < iLuzera; i++)
    {
        printf("%2d. ikaslea: %s\n", i + 1, asZerrenda_1[i]);
    }
}


int iElementuaBilatu(const char asZerrenda_1[IKASLE_KOP_MAX][KATEEN_LUZ_MAX],
                            int iLuzera,
                     const char sGakoDatuOsoa[])
{
    for (int iKont = 0; iKont < iLuzera; iKont++)
    {
        if (strcmp(asZerrenda_1[iKont], sGakoDatuOsoa) == 0)
            return iKont;
    }
    return -1;  // aurkitzen ez denean
}


void IzenaZenbakiaBanatu( char *sDatua,
                          char sIzena[31],
                         float *fZbk)
{
    char *KomaErak;
    char sLaguntzaile[KATEEN_LUZ_MAX];

    printf("--------------------------------------------------\n");
    printf("               ---sDatua=|%s|---\n", sDatua);
    KomaErak = strchr(sDatua, ',');
    printf("\n             ---KomaErak=|%s|---\n", KomaErak);
    printf("\n    ___(helbidea) sDatua=%li___", (long)sDatua);
    printf("\n  ___(helbidea) KomaErak=%li___", (long)KomaErak);
    printf("\n    ___KomaErak - sDatua=%li (karaktere kopurua)___\n", (long)(KomaErak - sDatua));
    if (KomaErak != NULL)
    {
        strncpy(sIzena, sDatua, KomaErak - sDatua);
        sIzena[KomaErak - sDatua] = '\0';
        printf("\n               ---sIzena=|%s|---\n", sIzena);
        printf("\n             ---KomaErak=|%s|---", KomaErak);
        printf("\n           ---KomaErak+1=|%s|---", KomaErak+1);
        printf("\n           ---KomaErak-1=|%s|---", KomaErak-1);
        strcpy(sLaguntzaile, KomaErak + 1);
        *fZbk = atof(sLaguntzaile);
    }
    printf("\n--------------------------------------------------\n\n");
}


void BektoreBerriaSortu(              char asZerrenda_1[IKASLE_KOP_MAX][KATEEN_LUZ_MAX],
                        struct tstElementu astZerrenda_2[IKASLE_KOP_MAX],
                                       int iLuzera)
{
    for (int i = 0; i < iLuzera; i++)
    {
        IzenaZenbakiaBanatu(asZerrenda_1[i], astZerrenda_2[i].sNor, &astZerrenda_2[i].fNota);
    }
}


void BektoreBerriaIkusi(const struct tstElementu astZerrenda_2[IKASLE_KOP_MAX],
                                             int iLuzera)
{
    for (int i = 0; i < iLuzera; i++)
    {
        printf("%2d. ikaslea:\n", i + 1);
        printf("Izena = %s\n", astZerrenda_2[i].sNor);
        printf("Nota = %.2f\n\n", astZerrenda_2[i].fNota);
    }
}


int iIkasleaIzenezBilatu(const struct tstElementu astZerrenda_2[IKASLE_KOP_MAX],
                                              int iLuzera,
                                       const char sGakoa[31])
{
    for (int iKont = 0; iKont < iLuzera; iKont++)
    {
        if (strcmp(astZerrenda_2[iKont].sNor, sGakoa) == 0)
            return iKont;
    }
    return -1;  // aurkitzen ez denean
}


int iIkasleaNotazBilatu(const struct tstElementu astZerrenda_2[IKASLE_KOP_MAX],
                                             int iLuzera,
                                           float fGakoa)
{
    #define DOITASUNA 0.0001
    int iKont;

    for (iKont = 0; iKont < iLuzera; iKont++)
    {
        if (fabs(astZerrenda_2[iKont].fNota - fGakoa) < DOITASUNA)
            return iKont;
    }
    return -1;  // aurkitzen ez denean
}






  • Ariketa-70_EstrukturenBektoreBatLortu.cbp | main.c  


 

iruzkinik ez:

Argitaratu iruzkina