2025(e)ko martxoaren 28(a), ostirala

Ariketa 59 | Izenak eta kalifikazioak

ZER DAKIDAN:
Arrayak eta kateak ezagutzen ditut.



ZER IKASIKO DUDAN:
Kateen array baten ariketa bat egingo dut.

Kateak gordetzen dituen array batekin lan egingo da. Kate bakoitzean letrak eta zifrak daude, izena eta kalifikazioa.

Ikasleen kopurua programaren hasieran irakurriko da. Hauek dira ikasle jakin baten datua den karaktere-katearen ezaugarriak:

  • Datuaren luzera maximoa 25+1 karaktere
  • Datuan izena eta nota daude
  • Notak hiru zifra ditu (unitatea eta 2 dezimal)
  • Notaren zifrak horrela datoz kokatuta katean:
    • Unitatea katearen lehen karakterea da
    • Hamartarrak katearen azken bi karaktereak dira
    • Notarik txikiena 0.0 da
    • notarik handiena 9.999 da
  • Letrak katearen erdian daude, zifren artean

Zenbat ikasle diren teklatuaren bitartez harturik, datuak eman, notak eskuratu eta nota guztien batezbesteko aritmetiko eta desbideratze estandarra kalkulatu. Adibidez:

        7Eleonor45 ------> 7.45
        6Peru21    ------> 6.21
        8Amagoia35 ------> 8.35
        9Izaro00   ------> 9.00
        Batezbestekoa: (+7.45 +6.21 +8.35 +9.00)/4 = 7.753
        Desbideratze estandarra: 1.047

Datuen arraya banatu izenen eta noten arrayak lortuz. Ikasle baten izena teklatuz emanik izenen arrayan bilatu. Izenen arraya alfabetikoki ordenatu eta ondorioz, orden bera aplikatu noten arrayari.


/* Ariketa-59_IzenakEtaKalifikazioak: zenbait kate emanik bakoitzan dauden zifrak
                                      banatu eta eragiketa aritmetiko bat burutu. */
/*
   Kateak gordetzen dituen array batekin lan egingo da. Kate bakoitzean
   letrak eta zifrak daude, izena eta kalifikazioa.

   Ikasleen kopurua programaren hasieran irakurriko da. Hauek dira
   ikasle jakin baten datua den karaktere-katearen ezaugarriak:

     - Datuaren luzera maximoa 25+1 karaktere
     - Datuan izena, deitura eta nota daude
     - Notak hiru zifra ditu (unitatea eta 2 dezimal)
     - Notaren zifrak horrela datoz kokatuta katean:
         * Unitatea katearen lehen karakterea da
         * Hamartarrak katearen azken bi karaktereak dira
     - Letrak katearen erdian daude, zifren artean

   Zenbat ikasle diren teklatuaren bitartez harturik, datuak eman, notak
   eskuratu eta nota guztien batezbestekoa eta desbideratze estandarra
   kalkulatu. Adibidez:

        7Eleonor45 ------> 7.45
        6Peru21    ------> 6.21
        8Amagoia35 ------> 8.35
        9Izaro00   ------> 9.00

        Batezbestekoa: (+7.45 +6.21 +8.35 +9.00)/4 = 7.753
        Desbideratze estandarra: 1.047

    Datuen arraya banatu izenen eta noten arrayak lortuz.
    Ikasle baten izena teklatuz emanik izenen arrayan bilatu.
    Izenen arraya alfabetikoki ordenatu eta ondorioz, orden bera aplikatu
    noten arrayari.

*/

#include <stdio.h>
#include <string.h>    // strcpy(), strcmp() eta strlen() funtzioetarako
#include <stdlib.h>    // atof() funtziorako
#include <math.h>   // pow() funtziorako

#define BEHEMUGA 0
#define GOIMUGA 39
#define MAX_KATEA 26

typedef char tKate25[MAX_KATEA];
typedef tKate25 tasZerrenda[GOIMUGA];
typedef float tafNotak[GOIMUGA];

// Array bat bete datuak teklatuz emanik
void KateenArrayaBete(tasZerrenda asDatuak,
                      int* iLuzera);
// Array baten edukia pantailaratzeko funtzioa
void KateenArrayaErakutsi(const tasZerrenda asDatuak,
                          int iLuzera);
// Beste array baten edukia pantailaratzeko funtzioa
void NotenArrayaErakutsi(const tafNotak afNotak,
                         int iLuzera);
// Ikaslearen nota lortzeko funtzioa
float IkasleBatenNotaLortu(const tKate25 sIkaslearenDatuak);
// Batezbestekoa kalkulatzeko funtzioa
float BatezbestekoaKalkulatu(const tasZerrenda asDatuak,
                             int iLuzera);
// Desbideratze estandarra kalkulatzeko funtzioa
float DesbideratzeaKalkulatu(const tasZerrenda asDatuak,
                             int iLuzera,
                             float fBatezbestekoa);
// Izenen eta noten arrayak sortu
void IzenenEtaNotenArrayakLortu(const tasZerrenda asDatuak,
                                int iLuzera,
                                tasZerrenda asIzenak,
                                tafNotak afNotak);
// Ikaslea bilatzeko funtzioa
int fniIkasleaBilatu(const tKate25 sIkaslea,
                     const tasZerrenda asIzenak,
                     int iLuzera);
// Ikaslearen izena alfabetikoki sailkatu eta nota dagokion posizioan kokatu
void IzenenEtaNotenArrayakSailkatu(tasZerrenda asIzenak,
                                   tafNotak afNotak,
                                   int iLuzera);
// Paraleloak diren bi arrayen edukia pantailaratzeko funtzioa
void BiArrayakErakutsi(const tasZerrenda asIzenak,
                       const tafNotak afNotak,
                       int iLuzera);


int main()
{
    tasZerrenda asDatuak, asIzenak;
    tafNotak afNotak;
    int iLuzera;
    char sIkaslea[MAX_KATEA];
    int iIkasleaNon;
    float fBatezbestekoa;
    float fDesbideratzeEstandarra;

    // Array bete eta erakutsi
    KateenArrayaBete(asDatuak, &iLuzera);
    KateenArrayaErakutsi(asDatuak, iLuzera);

    fBatezbestekoa = BatezbestekoaKalkulatu(asDatuak, iLuzera);
    printf("Batezbestekoa = %.3f\n", fBatezbestekoa);
    fDesbideratzeEstandarra = DesbideratzeaKalkulatu(asDatuak, iLuzera, fBatezbestekoa);
    printf("Desbideratze estandarra = %.3f\n", fDesbideratzeEstandarra);

    // Izenen eta noten arrayak lortu eta erakutsi
    IzenenEtaNotenArrayakLortu(asDatuak, iLuzera, asIzenak, afNotak);
    printf("Datuak bi zerrendetan banaturik:\n");
    KateenArrayaErakutsi(asIzenak, iLuzera);
    NotenArrayaErakutsi(afNotak, iLuzera);

    printf("Bilatu nahi duzun ikaslearen izena eman: ");
    fgets(sIkaslea, MAX_KATEA, stdin);
    sIkaslea[strlen(sIkaslea)-1] = '\0'; // azkenaurreko posizioan dagoen lerro-berri karakterea kendu

    iIkasleaNon = fniIkasleaBilatu(sIkaslea, asIzenak, iLuzera);

    if (iIkasleaNon == 0)
    {
        printf("\"%s\" izeneko ikaslerik ez dago\n", sIkaslea);
    }
    else
    {
        afNotak[iIkasleaNon] = fBatezbestekoa;
        printf("Ikaslearen berritutako nota: %.2f\n", afNotak[iIkasleaNon]);
    }

    // Arrayak sailkatu eta erakutsi
    IzenenEtaNotenArrayakSailkatu(asIzenak, afNotak, iLuzera);
    printf("Ikasleen zerrenda izenez sailkaturik:\n");
    BiArrayakErakutsi(asIzenak, afNotak, iLuzera);

    return 0;
}

// Array bat betetzeko funtzioa
void KateenArrayaBete(tasZerrenda asDatuak, int* iLuzera)
{
    int iKont;

    do
    {
        printf("Arrayak zenbat elementu izango ditu? ");
        scanf("%d", iLuzera);
        fflush(stdin);
    } while (*iLuzera < BEHEMUGA || *iLuzera > GOIMUGA);

    for (iKont = BEHEMUGA; iKont < *iLuzera; iKont++)
    {
        do
        {
            printf("'7Joseba43' itxurako %d. elementua eman: ", iKont);
            fgets(asDatuak[iKont], MAX_KATEA, stdin);
            asDatuak[iKont][strlen(asDatuak[iKont])-1] = '\0'; // azkenaurreko posizioan dagoen lerro-berri karakterea kendu
            // printf("\n------asDatuak[iKont]=|%s|\n------asDatuak[iKont][0]=|%c|\n------asDatuak[iKont][azkena]=|%c|------\n", asDatuak[iKont], asDatuak[iKont][0], asDatuak[iKont][strlen(asDatuak[iKont])-1]);
            if (asDatuak[iKont][0] < '0' || asDatuak[iKont][0] > '9')
                printf("Notaren unitatea falta da\n");
            if (asDatuak[iKont][strlen(asDatuak[iKont])-2] < '0' || asDatuak[iKont][strlen(asDatuak[iKont])-2] > '9')
                printf("Notaren hamarrekoa falta da\n");
            if (asDatuak[iKont][strlen(asDatuak[iKont])-1] < '0' || asDatuak[iKont][strlen(asDatuak[iKont])-1] > '9')
                printf("Notaren ehunekoa falta da\n");
        } while ((asDatuak[iKont][0] < '0' || asDatuak[iKont][0] > '9') ||
                 (asDatuak[iKont][strlen(asDatuak[iKont])-2] < '0' || asDatuak[iKont][strlen(asDatuak[iKont])-2] > '9') ||
                 (asDatuak[iKont][strlen(asDatuak[iKont])-1] < '0' || asDatuak[iKont][strlen(asDatuak[iKont])-1] > '9'));
    }
}


// Array baten edukia pantailaratzeko funtzioa
void KateenArrayaErakutsi(const tasZerrenda asDatuak, int iLuzera)
{
    int iKont;

    for (iKont = BEHEMUGA; iKont < iLuzera; iKont++)
        printf(" %d. elementua: |%s|\n", iKont, asDatuak[iKont]);
}


// Beste array baten edukia pantailaratzeko funtzioa
void NotenArrayaErakutsi(const tafNotak afNotak, int iLuzera)
{
    int iKont;

    for (iKont = BEHEMUGA; iKont < iLuzera; iKont++)
        printf(" %d. elementua: |%.2f|\n", iKont, afNotak[iKont]);
}


// Ikaslearen nota lortzeko funtzioa
float IkasleBatenNotaLortu(const tKate25 sIkaslearenDatuak)
{
    char sNota[6];
    snprintf(sNota, sizeof(sNota), "%c.%c%c", sIkaslearenDatuak[0],
             sIkaslearenDatuak[strlen(sIkaslearenDatuak)-2],
             sIkaslearenDatuak[strlen(sIkaslearenDatuak)-1]);

    return atof(sNota);
}


// Batezbestekoa kalkulatzeko funtzioa
float BatezbestekoaKalkulatu(const tasZerrenda asDatuak, int iLuzera)
{
    float fMetagailu = 0.0;
    int iKont;

    for (iKont = BEHEMUGA; iKont < iLuzera; iKont++)
    {
        fMetagailu += IkasleBatenNotaLortu(asDatuak[iKont]);
    }

    return fMetagailu / iLuzera;
}


// Desbideratze estandarra kalkulatzeko funtzioa
float DesbideratzeaKalkulatu(const tasZerrenda asDatuak,
                             int iLuzera,
                             float fBatezbestekoa)
{
    float fMetagailu = 0.0;
    int iKont;

    for (iKont = BEHEMUGA; iKont < iLuzera; iKont++)
    {
        fMetagailu += pow((IkasleBatenNotaLortu(asDatuak[iKont]) - fBatezbestekoa), 2);
    }
    fMetagailu = fMetagailu / iLuzera;
    return pow(fMetagailu, 0.5);
}


// Izenen eta noten arrayak sortu
void IzenenEtaNotenArrayakLortu(const tasZerrenda asDatuak,
                                int iLuzera,
                                tasZerrenda asIzenak,
                                tafNotak afNotak)
{
    int iKont;

    for (iKont = BEHEMUGA; iKont < iLuzera; iKont++)
    {
        afNotak[iKont] = IkasleBatenNotaLortu(asDatuak[iKont]);
        strcpy(asIzenak[iKont], asDatuak[iKont] + 1);
        asIzenak[iKont][strlen(asIzenak[iKont]) - 2] = '\0';  // Azken bi karaktereak kendu
    }
}


// Ikaslea bilatzeko funtzioa
int fniIkasleaBilatu(const tKate25 sIkaslea,
                     const tasZerrenda asIzenak,
                     int iLuzera)
{
    int iKont;

    for (iKont = BEHEMUGA; iKont < iLuzera; iKont++)
    {
        if (strcmp(asIzenak[iKont], sIkaslea) == 0)
        return iKont;
    }
    return 0;
}


// Ikaslearen izena alfabetikoki sailkatu eta nota dagokion posizioan kokatu
void IzenenEtaNotenArrayakSailkatu(tasZerrenda asIzenak, tafNotak afNotak, int iLuzera)
{
    int k, j;
    char sIzenTxikiena[MAX_KATEA];
    float rLaguntzailea;
    int iTxikienaNon;

    for (k = BEHEMUGA; k < iLuzera-1; k++)
    {
        strcpy(sIzenTxikiena, asIzenak[k]);
        iTxikienaNon = k;
        for (j = k + 1; j < iLuzera; j++)
        {
            if (strcmp(asIzenak[j], sIzenTxikiena) < 0)
            {
                strcpy(sIzenTxikiena, asIzenak[j]);
                iTxikienaNon = j;
            }
        }

        // izena aldatu
        strcpy(asIzenak[iTxikienaNon], asIzenak[k]);
        strcpy(asIzenak[k], sIzenTxikiena);

        // nota aldatu
        rLaguntzailea = afNotak[iTxikienaNon];
        afNotak[iTxikienaNon] = afNotak[k];
        afNotak[k] = rLaguntzailea;
    }
}


// Paraleloak diren bi arrayen edukia pantailaratzeko funtzioa
void BiArrayakErakutsi(const tasZerrenda asIzenak,
                       const tafNotak afNotak,
                       int iLuzera)
{
    int iKont;

    for (iKont = BEHEMUGA; iKont < iLuzera; iKont++)
        printf(" %d. elementua: |%.2f| |%s|\n", iKont, afNotak[iKont], asIzenak[iKont]);
}






  • Ariketa-59_IzenakEtaKalifikazioak.cbp | main.c  


 

iruzkinik ez:

Argitaratu iruzkina