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

Ariketa 71 | Estrukturen bi bektore nahastu bektore bakar batean

ZER DAKIDAN:
Arrayak eta erregistroak ezagutzen ditut.



ZER IKASIKO DUDAN:
Kateen bi arrayetatik abiatuta, erregistroen array bat lortuko dut.


Erregistroen bi bektore nahastu bakarra lortuz

Laborategiko gelan, gehienez, 25 ikasle izango dira. Ikasleen datuak bi bektoretan biltzen dira, bektore bat lehen azterketari dagokio eta beste bektorea bigarren azterketari dagokio.

Bektoreen elementuak kateak dira, eta bertan izena eta zenbaki bat daude / batez banaturik aurkitzen direlarik, zenbakien kopuru maximoa 9.9 izango eta minimoa 0.0 izango da.

Datuak teklatuaren bitartez ematen dira eta ikasleen posizioak bektoretan zaindu behar dira berdinak izan daitezan, hurrengo adibidean erakusten den bezala: Josu ikaslea lehena da abiapuntuko array bietan.

asAzterketa1 eta asAzterketa2 abiapuntuko bektoreak dira eta ardAzterketak bektorea da lortu behar dena. Hona hemen datuen adibide bat:

asAzterketa1
‘Josu/6.1’
‘Ane/7.6’
‘Mikel/2.7’
1
2
3
asAzterketa2
‘Josu/6.9’
‘Ane/5.4’
‘Mikel/6.3’
1
2
3
iLuzera
3

ardAzterketak
‘Josu’
‘Josu’
‘Ane’
‘Ane’
‘Mikel’
‘Mikel’
6.1
6.9
7.6
5.4
2.7
6.3
1
2
3
4
5
6
iZenbat
6


Helburuko ardAzterketak bektorea lortu ondoren zenbait operazio egingo dira. Honako hauek adibidez:
  1. ardAzterketak arrayarekin lan eginez, ikasgelako ikasle baten izena eman (Ane adibidez) eta kalifikazioa orokorra erakutsi (bere noten batezbesteko aritmetikoa)
  2. ardAzterketak arrayarekin lan eginez, lehen azterketako kalifikazioetatik lortzen den batezbesteko aritmetikoa kalkulatu
  3. ardAzterketak arrayarekin lan eginez, bigarren azterketako kalifikazioetatik lortzen den batezbesteko aritmetikoa kalkulatu
  4. ardAzterketak arrayarekin lan eginez, nork lortu du notarik onena eta zein azterketan gertatu da
  5. ardAzterketak arrayarekin lan eginez, ikasgelako ikasle baten izena eman (Ane adibidez) eta aurkitzen bada bere kalifikazioak aldatu
  6. ardAzterketak arrayarekin lan eginez, ikasgelako ikasle baten izena eman (Ane adibidez) eta aurkitzen bada arraytik ezabatu
  7. ardAzterketak arrayarekin lan eginez, ikasle aprobatuen zerrenda erakutsi pantailan (ikasle bat aprobatuko du bere nota biren batezbesteko artrmetikoa 5.0 edo handiagoa bada)
  8. ardAzterketak arrayarekin lan eginez, arraya ordenatu/sailkatu ikasleen izenen arabera
  9. ardAzterketak arrayarekin lan eginez, ...


/* Ariketa-71_ErregistroenBiBektoreNahastu: erregistroen bi array bakar batean batu */

//  Hasierako informazioa kateen bektore pare bat da eta dagokien erregistroen bektorea
//  lortu nahi da. Hasierako informazioan izen bat eta zenbaki erreal bat biltzen duen
//  katea jasotzen da bi bektoretan, non izenak bi bektoretan errepikatzen diren.

#include <stdio.h>
#include <string.h>   // strchr(), strcpy(), strncpy() eta strcspn() funtzioetarako
#include <stdlib.h>   // srand(), rand() eta atof() funtzioetarako
#include <time.h>     // time() funtziorako

#define BEHEMUGA 0
#define GOIMUGA 25
#define LUZERAMAX 39+1

typedef char tKate39[LUZERAMAX];
typedef tKate39 tasAzterketaBat[GOIMUGA];
typedef struct
{
    tKate39 sIzena;
    float fNota;
} trdIkaslea;
typedef trdIkaslea tardAzterketak[2*GOIMUGA];


void BiKontrolenDatuakJaso(tasAzterketaBat asAzterketa1,
                           tasAzterketaBat asAzterketa2,
                           int *iLuzera);
void KontrolBatenDatuakIkusi(const tasAzterketaBat asAzterketa, int iLuzera);
void Nahastu(tasAzterketaBat asAzterketa1,
             tasAzterketaBat asAzterketa2,
             int iLuzera,
             tardAzterketak ardAzterketak,
             int *iZenbat);
void IkasleBatErakutsi(const trdIkaslea *rdIkasleBat);
void KontrolBirenDatuakIkusi(const tardAzterketak ardAzterketak, int iZenbat);


int main()
{
    tasAzterketaBat asAzterketa1, asAzterketa2;
    tardAzterketak ardAzterketak;
    int iLuzera, iZenbat;

    printf("\n\n");
    BiKontrolenDatuakJaso(asAzterketa1, asAzterketa2, &iLuzera);

    printf("\n---1. kontolaren informazioa------------------------------\n");
    KontrolBatenDatuakIkusi(asAzterketa1, iLuzera);

    printf("\n---2. kontolaren informazioa------------------------------\n");
    KontrolBatenDatuakIkusi(asAzterketa2, iLuzera);

    Nahastu(asAzterketa1, asAzterketa2, iLuzera, ardAzterketak, &iZenbat);

    printf("\n---Bi kontrolen informazioa-------------------------------\n");
    KontrolBirenDatuakIkusi(ardAzterketak, iZenbat);

    printf("\n=====================================================\n");
    printf("               RETURN sakatu amaitzeko               \n");
    printf("=====================================================\n");
    getchar();

    return 0;
}


void BiKontrolenDatuakJaso(tasAzterketaBat asAzterketa1,
                           tasAzterketaBat asAzterketa2,
                           int *iLuzera)
{
    int n, iUnitatea, iHamarrekoa;
    char sUnitatea[3], sHamarrekoa[3], sIzena[LUZERAMAX], sNor[LUZERAMAX];

    do
    {
        printf("Ikasleen kopurua eman (%d eta %d artekoa, biak barne): ", BEHEMUGA, GOIMUGA);
        scanf("%d", iLuzera);
        fflush(stdin);
    } while (*iLuzera <= BEHEMUGA || *iLuzera > GOIMUGA);

    srand(time(NULL));

    for (n = BEHEMUGA; n < *iLuzera; n++)
    {
        printf("%d. ikaslearen izena eman: ", n);
        fgets(sIzena, LUZERAMAX, stdin);
        sIzena[strcspn(sIzena, "\n")] = 0;  // lerro-berri karakterea kendu

        iUnitatea = rand() % 10;
        iHamarrekoa = rand() % 10;
        snprintf(sUnitatea, sizeof(sUnitatea), "%d", iUnitatea);
        snprintf(sHamarrekoa, sizeof(sHamarrekoa), "%d", iHamarrekoa);
        snprintf(sNor, sizeof(sNor), "%s/%s.%s", sIzena, sUnitatea, sHamarrekoa);
        strcpy(asAzterketa1[n], sNor);

        iUnitatea = rand() % 10;
        iHamarrekoa = rand() % 10;
        snprintf(sUnitatea, sizeof(sUnitatea), "%d", iUnitatea);
        snprintf(sHamarrekoa, sizeof(sHamarrekoa), "%d", iHamarrekoa);
        snprintf(sNor, sizeof(sNor), "%s/%s.%s", sIzena, sUnitatea, sHamarrekoa);
        strcpy(asAzterketa2[n], sNor);
    }
}


void KontrolBatenDatuakIkusi(const tasAzterketaBat asAzterketa, int iLuzera)
{
    for (int n = BEHEMUGA; n < iLuzera; n++)
    {
        printf("%d. ikaslea: %s\n", n, asAzterketa[n]);
    }
}


void Nahastu(tasAzterketaBat asAzterketa1,
             tasAzterketaBat asAzterketa2,
             int iLuzera,
             tardAzterketak ardAzterketak,
             int *iZenbat)
{
    int n;
    char sIzena[LUZERAMAX], sNota[5];
    float fNota;

    *iZenbat = 0;
    for (n = BEHEMUGA; n < iLuzera; n++)
    {
        char *sNorZer = asAzterketa1[n];   // ikaslearen izena gehi / gehi ikaslearen nota
        char *pos = strchr(sNorZer, '/');  // informazioaren / banatzailea seinalatzen duen erakuslea

        // printf("\n ----sNorZer_1=|%s|  ", sNorZer);
        if (pos != NULL)
        {
            strncpy(sIzena, sNorZer, pos - sNorZer);
            sIzena[pos - sNorZer] = '\0';
            snprintf(sNota, sizeof(sNota), "%s", pos + 1);
            sscanf(sNota, "%f", &fNota);
            strcpy(ardAzterketak[*iZenbat].sIzena, sIzena);
            ardAzterketak[*iZenbat].fNota = fNota;
            (*iZenbat)++;
        }
        sNorZer = asAzterketa2[n];
        // printf("  sNorZer_2=|%s|----", sNorZer);
        pos = strchr(sNorZer, '/');
        if (pos != NULL)
        {
            snprintf(sNota, sizeof(sNota), "%s", pos + 1);
            sscanf(sNota, "%f", &fNota);
            strcpy(ardAzterketak[*iZenbat].sIzena, sIzena);
            ardAzterketak[*iZenbat].fNota = fNota;
            (*iZenbat)++;
        }
    }
    // printf("\n");
}


void IkasleBatErakutsi(const trdIkaslea *rdIkasleBat)
{
    printf("%15s %5.1f\n", rdIkasleBat->sIzena, rdIkasleBat->fNota);
}


void KontrolBirenDatuakIkusi(const tardAzterketak ardAzterketak, int iZenbat)
{
    for (int n = BEHEMUGA; n < iZenbat; n++)
    {
        printf("%d. ikaslea: ", n);
        IkasleBatErakutsi(&ardAzterketak[n]);
    }
}






  • Ariketa-71_ErregistroenBiBektoreNahastu.cbp | main.c  


 

iruzkinik ez:

Argitaratu iruzkina