ZER DAKIDAN: Arrayak ezagutzen ditut. ZER IKASIKO DUDAN: Kateen array baten eta zenbaki errealen array baten ariketa bat programatuko dut. Ariketa hau hobeto programatzen da laster ikusiko den erregistroen (edo struct datu-mota) array bat erabiliz. |
Array batean ikasleen izenak ditugu eta beste array batean ikasleen notak gorderik daude. asIzenak arraya karaktere-kateak biltegitzen ditu, eta arNotak arrayak zenbaki errealak jasoko ditu.
Array biren arteko lotura posizioetan datza, hau da, array baten lehen posizioko informazioa elkarturik dago beste arrrayaren lehen posizioko informazioarekin, eta horrela posizio guztiekin. Noski, luzera efektiboa bera delako, array bientzat lan egiten duen iLuzera aldagai bakarra erabiliko dugu.
Adibidez:
|
iLuzera=3
|
|
/* Ariketa-64_BiArrayParalelo: bi array sortuko dira, bat izenekin teklatua erabiliz eta bestea auzaz lortiriko zenbaki errealez osaturik. */ // Suspendituen notak inkrementatu, ikasle baten izena bilatu eta nota berri bat gorde. // Ariketa hau erregistroen array baten kasuaren sarrera-adibidea izan daiteke. #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 #define MAXIMOA 30+1 // 30 karaktere gehi null mugatzailea typedef char tsKatea[MAXIMOA]; typedef float tafNotak[GOIMUGA]; typedef tsKatea tasIzenak[GOIMUGA]; void IzenakLortu(tasIzenak asIzenak, int *iLuzera); void NotakLortu(tafNotak afNotak, int iLuzera); void IzenakIkusi(const tasIzenak asIzenak, int iLuzera); void NotakIkusi(const tafNotak afNotak, int iLuzera); void NotakInkrementatu(tafNotak afNotak, int iLuzera); int fniIkasleaBilatu(const tasIzenak asIzenak, int iLuzera, const char *sGakoa); int main() { tafNotak afNotak; tasIzenak asIzenak; int iLuzera; char sGakoa[MAXIMOA]; int iPosizioa; IzenakLortu(asIzenak, &iLuzera); IzenakIkusi(asIzenak, iLuzera); NotakLortu(afNotak, iLuzera); NotakIkusi(afNotak, iLuzera); printf("Suspendituak inkrementatzen...\n"); NotakInkrementatu(afNotak, iLuzera); NotakIkusi(afNotak, iLuzera); printf("Ikasle baten nota aldatu\n"); printf("Ikaslearen izena eman: "); scanf("%s", sGakoa); iPosizioa = fniIkasleaBilatu(asIzenak, iLuzera, sGakoa); if (iPosizioa == -1) printf("'%s' izena duen ikaslerik ez dago\n", sGakoa); else { printf("Nota berria eman: "); scanf("%f", &afNotak[iPosizioa]); printf("\n'%s' ikaslearen nota aldatu ondoren\n", sGakoa); NotakIkusi(afNotak, iLuzera); } return 0; } void IzenakLortu(tasIzenak asIzenak, int *iLuzera) { int iKont; do { printf("Zenbat ikasle dira? "); scanf("%d", iLuzera); } while (*iLuzera <= BEHEMUGA || *iLuzera > GOIMUGA); printf("\nIzenen arrayan %d datu gordetzen\n", *iLuzera); for (iKont = BEHEMUGA; iKont < *iLuzera; iKont++) { printf("Eman %d. izena: ", iKont); scanf("%s", asIzenak[iKont]); } } void NotakLortu(tafNotak afNotak, int iLuzera) { int iKont; printf("Noten arrayan %d datu gordetzen\n", iLuzera); srand(time(NULL)); // ausazko zenbakiak sortzeko for (iKont = BEHEMUGA; iKont <= iLuzera; iKont++) afNotak[iKont] = (rand() / (float)RAND_MAX) * 10; // 0.0 eta 9.999 arteko balioak } void IzenakIkusi(const tasIzenak asIzenak, int iLuzera) { int iKont; printf("\nIzenen arrayaren edukia:\n"); for (iKont = BEHEMUGA; iKont < iLuzera; iKont++) printf("%2d. ikaslea = %s\n", iKont, asIzenak[iKont]); printf("\n"); } 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"); } 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 tasIzenak asIzenak, int iLuzera, const char *sGakoa) { int iKont; for (iKont = BEHEMUGA; iKont < iLuzera; iKont++) if (strcmp(asIzenak[iKont], sGakoa) == 0) return iKont; return -1; // Ikaslerik ez bada aurkitzen }
iruzkinik ez:
Argitaratu iruzkina