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
asAzterketa2
iLuzera
ardAzterketak
iZenbat
Helburuko ardAzterketak bektorea lortu ondoren zenbait operazio egingo dira. Honako hauek adibidez:
|
/* 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]); } }
iruzkinik ez:
Argitaratu iruzkina