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

Ariketa 73 | Kaosa sortzen (array ordenatu bat desordenatzen)

ZER DAKIDAN:
Arrayak eta erregistroak ezagutzen ditut.



ZER IKASIKO DUDAN:
Ordenaturik dagoen erregistroen array batetik abiatuta, dagokion array desordenatu bat lortu informazioa galdu edo nahastu gabe.

  kaosa sortzen  

Erregistroen array bat daukagu. Erregistroak bi eremuz osaturik daude: kate bat eta zenbaki bat. Erregistroen arrayaren datuak konstante diren bi arrayetatik hartzen dira. Erregistroen arrayaren datu-mota:
#define IZENBATIKASLE 12

typedef char tsKate49[50]; // 49 karaktere gehi null mugatzailea
typedef struct
{
    tsKate49 sNor;
    float fNota;
} trdIkasle;
typedef trdIkasle tardIkasleak[IZENBATIKASLE];
asIZENAK array konstantea eta ordenatua da, afNOTAK array konstantea da. Bi array horietaz oinarriturik balioak hartuko ditu ardIkasleak arrayak zein alfabetikoki ordenaturik egongo den ere. ardIkasleak array ordenatuaren elementuak posizioz nahastuz lortuko da emaitza den ardKaotikoak arraya.  

Nahasketa burutzen duen ZerrendaNahastu prozeduran datu-mota berezi pare bat sortuko dugu, trdLaguntzaile erregistroa eta tardLaguntzaile arraya. Programaren gainerako tokietan erabilpenik ez dutenez, datu-mota espezifiko horiek ZerrendaNahastu prozedura barruan sortzen dira:
// datu-mota berri sortzen da, soilik ZerrendaNahastu() delako
// funtzio honetan erabiliko dena: trdLaguntzaile erregistroa
void ZerrendaNahastu(const tardIkasleak ardIkasleak, int iLuzera, tardIkasleak ardKaotikoak)
{
    typedef struct
    {
        trdIkasle rdIkaslea;
        bool boGordeta;
    } trdLaguntzaile;     // erregistro datu-mota berria

    trdLaguntzaile ardLaguntzailea[IZENBATIKASLE];   // erregistro datu-mota berriko arraya
   ...
}

/* Ariketa-73_KaosaSortzenArrayBatean: ordenaturik dagoen erregistroen array batetik 
                                       array desordenatu bat lortu informazioa galdu
                                       edo nahastu gabe. */

//  Hasierako informazioa erregistroen bektore bat da, non izenak eta notak gordetzen
//  diren. Bektorea izenen arabera alfabetikoki sailkaturik dago. Array laguntzaile
//  baten bitartez jatorrizko bektorea desordenatu behar da, hori bai, mantenduz
//  elkarrekin ikaslearen izena eta berari dagokion nota.
 
#include <stdio.h>
#include <string.h>   // strcpy() funtziorako
#include <stdlib.h>   // srand() eta rand() funtzioetarako
#include <time.h>     // time() funtziorako
#include <stdbool.h>  // bool datu-motarako


#define IZENBATIKASLE 12

typedef char tsKate49[50]; // 49 karaktere gehi null mugatzailea
typedef struct
{
    tsKate49 sNor;
    float fNota;
} trdIkasle;
typedef trdIkasle tardIkasleak[IZENBATIKASLE];

const tsKate49 asIZENAK[IZENBATIKASLE] = {
    "AGIRRE ROMERO, UNAI",            // 00
    "ANGULEMA CARAZO, JON ANDER",     // 01
    "BIKARREGI IGLESIAS, JULEN",      // 02
    "CANO RUIZ DE HEREDIA, JULIAN",   // 03
    "CORRAL EGIA, JOSEBA ANDONI",     // 04
    "DIAZ DE ULZURRUN, ROY, LEONOR",  // 05
    "EGIGUREN MARKINEZ, IRUNE",       // 06
    "ERKIAGA ANDONEGI, IKER",         // 07
    "FERNANDEZ FEITO, FELIX",         // 08
    "GARTZIA DE ALZA GIL, KATALIN",   // 19
    "HERRANZ MARTINEZ, REBECA",       // 10
    "IRAGORRI COTANO, MARTIN"         // 11
};

const float afNotaK[IZENBATIKASLE] = {4.6, 3.2, 5.7, 4.8, 5.1, 6.1, 7.3, 7.6, 2.8, 9.2, 2.9, 8.5};


void DatuakBildu(tardIkasleak ardIkasleak, int iLuzera);
void DatuakIkusi(const tardIkasleak ardIkasleak, int iLuzera);
void ZerrendaNahastu(const tardIkasleak ardIkasleak,
                     int iLuzera,
                     tardIkasleak ardKaotikoak);

int main()
{
    tardIkasleak ardIkasleak;
    tardIkasleak ardKaotikoak;
    int iLuzera;

    printf("\n");
    do
    {
        printf("Zenbat ikasle dira? (1 eta %d artean): ", IZENBATIKASLE);
        scanf("%d", &iLuzera);
        fflush(stdin);
    } while (iLuzera < 1 || iLuzera > IZENBATIKASLE);

    DatuakBildu(ardIkasleak, iLuzera);
    printf("\n--Nahastu aurretik----------------------------------------------------------\n");
    DatuakIkusi(ardIkasleak, iLuzera);

    ZerrendaNahastu(ardIkasleak, iLuzera, ardKaotikoak);
    printf("\n--Nahastu ondoren-----------------------------------------------------------\n");
    DatuakIkusi(ardKaotikoak, iLuzera);

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


void DatuakBildu(tardIkasleak ardIkasleak, int iLuzera)
{
    for (int k = 0; k < iLuzera; k++)
    {
        strcpy(ardIkasleak[k].sNor, asIZENAK[k]);
        ardIkasleak[k].fNota = afNotaK[k];
    }
}


void DatuakIkusi(const tardIkasleak ardIkasleak, int iLuzera)
{
    for (int k = 0; k < iLuzera; k++)
    {
        printf("%2d. ikaslea: %-40s%10.1f\n", k+1, ardIkasleak[k].sNor, ardIkasleak[k].fNota);
    }
}


// datu-mota berri sortzen da, soilik ZerrendaNahastu() delako
// funtzio honetan erabiliko dena: trdLaguntzaile erregistroa
void ZerrendaNahastu(const tardIkasleak ardIkasleak, int iLuzera, tardIkasleak ardKaotikoak)
{
    typedef struct
    {
        trdIkasle rdIkaslea;
        bool boGordeta;
    } trdLaguntzaile;     // erregistro datu-mota berria

    trdLaguntzaile ardLaguntzailea[IZENBATIKASLE];   // erregistro datu-mota berriko arraya

    for (int k = 0; k < iLuzera; k++)
    {
        ardLaguntzailea[k].boGordeta = false;
    }

    srand(time(NULL));
    for (int k = 0; k < iLuzera; k++)
    {
        int iZbk;
        do
        {
            iZbk = rand() % iLuzera;
        } while (ardLaguntzailea[iZbk].boGordeta == true);

        ardLaguntzailea[iZbk].boGordeta = true;
        ardLaguntzailea[iZbk].rdIkaslea = ardIkasleak[k];
    }

    for (int k = 0; k < iLuzera; k++)
    {
        ardKaotikoak[k] = ardLaguntzailea[k].rdIkaslea;
    }
}






  • Ariketa-73_KaosaSortzenArrayBatean.cbp | main.c  


 

iruzkinik ez:

Argitaratu iruzkina