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

Ariketa 65 | Kateen taula

ZER DAKIDAN:
Arrayak ezagutzen ditut.



ZER IKASIKO DUDAN:
Bi dimentsiotako kateen array baten ariketa bat programatuko dut. Ariketa hau hobeto programatzen da laster ikusiko den erregistroen (edo struct datu-mota) array bat erabiliz.

asTaula hiru dimentsiotako taula bat da, kateak gorde ditzakeen asTaula arrayak 40 errenkada eta 3 zutabe ditu. Errenkada bakoitza ikasle bati dagokio: Errenkadaren lehen zutabean izena biltegitzen da, bigarrenean abizena eta hirugarren zutabean ikaslearen nota gordetzen da (hirurak string[19] datu-motakoak).

Taula baten dimentsioak zehazteko, bi indize behar dira: Indize bat lerro baliodunak zehazteko eta beste indize bat baliozko zutabeak adierazteko. Baina, asTaula arraya taula bat izan arren, array horren dimentsio efektiboa zenbaki oso batek adierazten du (hiru zutabeak beti beterik daudelako). Jarraian ematen den irudian, luzera efektiboaren lana errenkadak mugatzea dela ikusten da:

      iLuzeraTaula=5
asTaula
       0  
   1       2  
0    'Laura' 
   'Urioste' 
   '4.8'  
1     'Joseba'  
    'Salazar'  
   '6.333'  
2     'Irina'  
    'Belasko'  
   '5.666'  
3     'Patxi'  
    'Larrabe'  
  '9.1'  
4 'Jordi'
'Coll'
'4.25'
5      
6      
...
     
39      

Eskatzen da:
  • Nota guztien arteko batezbesteko aritmetikoa lortu: 
  • Noten batezbestekoarekin, desbideratze estandarra kalkulatu: 
  • Notarik txikiena eskuratu duen ikaslea nor da? 
  • Notarik handiena eskuratu duen ikaslea nor da? 
  • Aprobatuen array dimentsiobakar hau lortu: 
                iLuzeraAprob=3
    asAprobatuak
0    'Salazar, Joseba' 
1     'Belasko, Irina'  
2     'Larrabe, Patxi'  
3  
4
 
...
 
40  
 

/* Ariketa-65_KateenTaula: kateak gordetzen dituen bi dimentsiotako array sortuko da.
                           Errenkadak 40 izango dira (0tik 39ra) eta zutabeak 3 izango
                           dira (0tik 2ra). Errenkada bakoitzeko, datuak hiru kate
                           izango dira:
                                - 0 posizioko zutabean izena (teklatuz emanik),
                                - 1 posizioko zutabean abizena (teklatuz emanik) eta
                                - 2 posizioko zutabean nota (auzaz lortua)            */

// Taulatik abiatuta, notak bilduko dituen zenbakien arraya eskuratu eta eragiketa aritmetikoak
// burutu. Suspendituen notak inkrementatu. Ikasle baten izena/abizena bilatu eta nota berri bat gorde.
// Suspendituen notak inkrementatu, ikasle baten izena bilatu eta nota berri bat gorde.

#include <stdio.h>
#include <string.h>   // strcmp() funtziorako
#include <stdlib.h>   // srand() eta rand() funtzioetarako
#include <time.h>     // time() funtziorako

#define BEHEMUGA 0
#define GOIMUGA 39

typedef char tsKatea[21];               // 20+1 karaktereko katea (indizea 0tik 20ra)
typedef float tafNotak[GOIMUGA];        // 40 elementuko arraya (indizea 0tik 39ra)
typedef tsKatea tasDatuak[GOIMUGA][3];  // 40x3 elementuko taula (indizeak 0tik 39ra eta 0tik 2ra)


void DatuakLortu(tasDatuak asDatuak, int *iLuzera);
void DatuakIkusi(const tasDatuak asDatuak, int iLuzera);
void NotakLortu(const tasDatuak asDatuak,
                tafNotak afNotak,
                int iLuzera);
float fnfBatezbestekoaKalkulatu(const tafNotak afNotak, int iLuzera);
void NotakIkusi(const tafNotak afNotak, int iLuzera);
void NotakInkrementatu(tafNotak afNotak, int iLuzera);
int fniIkasleaBilatu(const tasDatuak asDatuak,
                     int iLuzera,
                     const tsKatea sGakoIzen,
                     const tsKatea sGakoAbizen);
void DatuenTaulaEguneratu(tasDatuak asDatuak,
                          float fNotaBerria,
                          int iPosizioa);

int main()
{
    tafNotak afNotak;
    tasDatuak asDatuak;
    int iLuzera;
    tsKatea sGakoIzen;
    tsKatea sGakoAbizen;
    int iPosizioa;
    float fBBA;


    DatuakLortu(asDatuak, &iLuzera);
    DatuakIkusi(asDatuak, iLuzera);

    NotakLortu(asDatuak, afNotak, iLuzera);
    NotakIkusi(afNotak, iLuzera);

    printf("Suspendituak inkrementatzen...\n");
    NotakInkrementatu(afNotak, iLuzera);
    NotakIkusi(afNotak, iLuzera);
    fBBA = fnfBatezbestekoaKalkulatu(afNotak, iLuzera);
    printf("Nota guztien media: %.3f\n\n", fBBA);

    printf("Ikasle baten nota aldatu\n");
    printf("Ikaslearen izena eman: ");
    scanf("%s", sGakoIzen);
    printf("Ikaslearen abizena eman: ");
    scanf("%s", sGakoAbizen);

    iPosizioa = fniIkasleaBilatu(asDatuak, iLuzera, sGakoIzen, sGakoAbizen);

    if (iPosizioa == -1)
        printf("'%s %s' ikaslerik ez dago\n", sGakoIzen, sGakoAbizen);
    else
    {
        printf("Nota berria eman: ");
        scanf("%f", &afNotak[iPosizioa]);
        printf("\n'%s %s' ikaslearen nota aldatu ondoren\n", sGakoIzen, sGakoAbizen);
        NotakIkusi(afNotak, iLuzera);
        DatuenTaulaEguneratu(asDatuak, afNotak[iPosizioa], iPosizioa);
        printf("\nTaula '%s %s' ikaslearen nota aldatu ondoren\n", sGakoIzen, sGakoAbizen);
        DatuakIkusi(asDatuak, iLuzera);
    }

    return 0;
}


void DatuakLortu(tasDatuak asDatuak, int *iLuzera)
{
    int iKont;
    float fNotaBat;
    tsKatea sNotaBat;

    do
    {
        printf("Zenbat ikasle dira? ");
        scanf("%d", iLuzera);
        fflush(stdin);
    } while (*iLuzera <= BEHEMUGA || *iLuzera > GOIMUGA);

    printf("\nDatuen arrayan %d posizio gordetzen...\n\n", *iLuzera);
    srand(time(NULL));  // ausazko zenbakiak sortzeko
    for (iKont = BEHEMUGA; iKont < *iLuzera; iKont++)
    {
        printf("Eman %02d posizioko izena: ", iKont);
        gets(asDatuak[iKont][0]);
        printf("Eman %02d posizioko abizena: ", iKont);
        gets(asDatuak[iKont][1]);
        fNotaBat = (rand() / (float)RAND_MAX) * 10;  // 0.0 eta 9.999 arteko balioak
        sprintf(sNotaBat, "%.4f", fNotaBat);
        strcpy(asDatuak[iKont][2], sNotaBat);
        printf("%02d posizioko ikaslearen nota: %s\n", iKont, asDatuak[iKont][2]);
    }
    printf("\n");
}


void DatuakIkusi(const tasDatuak asDatuak, int iLuzera)
{
    int iKont;

    printf("\nDatuen arrayaren edukia:\n");
    for (iKont = BEHEMUGA; iKont < iLuzera; iKont++)
        printf("%2d posizioko ikaslea = %s, %s --- %s\n", iKont, asDatuak[iKont][0], asDatuak[iKont][1], asDatuak[iKont][2]);
    printf("\n");
}


void NotakLortu(const tasDatuak asDatuak, tafNotak afNotak, int iLuzera)
{
    int iKont;

    printf("Noten arrayan %d datu gordetzen...\n", iLuzera);
    for (iKont = BEHEMUGA; iKont <= iLuzera; iKont++)
        afNotak[iKont] = atof(asDatuak[iKont][2]);  // 0.0 eta 9.999 arteko balio erreala
}


void NotakIkusi(const tafNotak afNotak, int iLuzera)
{
    int iKont;

    printf("Noten arrayaren edukia:\n");
    for (iKont = BEHEMUGA; iKont < iLuzera; iKont++)
        printf("%2d. nota = %.3f\n", iKont, afNotak[iKont]);
    printf("\n");
}


float fnfBatezbestekoaKalkulatu(const tafNotak afNotak, int iLuzera)
{
    int iKont;
    float rMetatua = 0.0;

    for (iKont = BEHEMUGA; iKont <= iLuzera; iKont++)
        rMetatua += afNotak[iKont];

    return rMetatua / iLuzera;
}


void NotakInkrementatu(tafNotak afNotak, int iLuzera)
{
    int iKont;

    for (iKont = BEHEMUGA; iKont < iLuzera; iKont++)
        if (afNotak[iKont] < 5.0)
            afNotak[iKont] += 1.0;
    printf("\n");
}


int fniIkasleaBilatu(const tasDatuak asDatuak, int iLuzera, const tsKatea sGakoIzen, const tsKatea sGakoAbizen)
{
    int iKont;

    for (iKont = BEHEMUGA; iKont < iLuzera; iKont++)
        if ((strcmp(asDatuak[iKont][0], sGakoIzen) == 0) &&
            (strcmp(asDatuak[iKont][1], sGakoAbizen) == 0))
            return iKont;

    return -1;  // Ikaslerik ez bada aurkitzen
}


void DatuenTaulaEguneratu(tasDatuak asDatuak, float fNotaBerria, int iPosizioa)
{
    sprintf(asDatuak[iPosizioa][2], "%.4f", fNotaBerria);
}






  • Ariketa-65_KateenTaula.cbp | main.c  


 

iruzkinik ez:

Argitaratu iruzkina