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; } }
iruzkinik ez:
Argitaratu iruzkina