ZER DAKIDAN: Orain arte datu-mota xeheak erabili ditut, adibidez: int, long, char, float, e.a. ZER IKASIKO DUDAN: array datu-mota sorta bat da eta horregatik datu-mota egituratua esaten zaio. Array bat datuz beteko dut teklatua erabiliz eta ikasiko dut ere arrayaren informazioa pantailaratzen. |
Zenbaki errealen afNotak izeneko array-aldagi batekin lan egingo dugu. Suposa dezagun bektorearen luzera maximoa LUZERA_MAX=20 dela eta bektore horrek zenbaki errealak gordetzen dituela. Adibidez, une jakin batean 4 elementu dituen afNotak array horren edukia hau izan daiteke:
afNotak
6.127
|
7.68
|
2.72
| 9.841
| |||
0
|
1
|
2
|
3
|
4
|
...
|
19
|
4
|
Hasierako programan erabiltzaileak teklatuz adieraziko du bektorean gordeko diren elementuen kopurua; adibidean iZenbatIkasle aldagaiaren balioa 4 da. Programa nagusian ondoko funtzioak deituko dira: NotakSartu() eta NotakIkusi().
Jarraian programa beraren bi bertsio eskaintzen dira. Lehen bertsioa da ikasi beharko dela, bigarren bertsioaren garrantzia memoriako posizioi seinalatzen duen erakuslea erabiltzean datza.
Hona hemen Ariketa-44a_ArrayaBeteErakutsi.cbp proiektuaren kodifikazioa non NotakSartu() funtzioaren bi parametroen jokamoldea desberdina den, fNotak[] arrayak balioak hartzen ditu funtzio barruan eta irteerakoa da, iZenbatIkasle arrayaren luzera efektiboa ezaguna da modulu deitzailean eta sarrerakoa da NotakSartu() funtzioan.
Bestalde, NotakIkusi() funtzioaren bi parametroen jokamoldea berdina da, biak ezagunak direlako modulu deitzailean biak izango dira sarrerakoak NotakIkusi() funtzioan:
/* Ariketa-44a_ArrayaBeteErakutsi: arraya bete eta erakutsi */ // Errealekin lan eginez. Array bat datuz bete funtzio batean // eta arrayaren edukia pantailaratu arraya bera erabiliz. #include <stdio.h> #define IKASLE_MIN 1 // gutxienez ikasle bat #define LUZERA_MAX 20 // ikasle kopuru maximoa void NotakSartu(float[], int); void NotakIkusi(const float[], int); int main() { float afNotak[LUZERA_MAX]; int iZenbatIkasle; printf("\n"); printf("\n\t Zerrenda betetzen zenbaki errealez"); printf("\n\t ----------------------------------\n"); do { printf("\n\t Zenbat nota sartuko dira? (gehienez %d): ", LUZERA_MAX); scanf("%d", &iZenbatIkasle); if ((iZenbatIkasle < IKASLE_MIN) || (iZenbatIkasle > LUZERA_MAX)) printf("\t\a Kopuru desegokia, errepikatu!!! (datua %d eta %d artekoa)", IKASLE_MIN, LUZERA_MAX); } while ((iZenbatIkasle < IKASLE_MIN) || (iZenbatIkasle > LUZERA_MAX)); printf("\n\t Lehen %d ikasleren notak eman, 0.0 eta 10.0 arteko balioak \n", iZenbatIkasle); NotakSartu(afNotak, iZenbatIkasle); NotakIkusi(afNotak, iZenbatIkasle); printf("\n"); return 0; } void NotakSartu(float afNotak[], int iZenbatIkasle) // lehen parametroa irterakoa da { // bigarren parametroa sarrerakoa da int iKont; for (iKont=0; iKont<iZenbatIkasle; iKont++) { do { printf("\t %d. ikaslearen nota eman: ", iKont+1); scanf("%f", &afNotak[iKont]); if ((afNotak[iKont] >= 0.0) && (afNotak[iKont] <= 10.0)) printf("\t Sartutakoa --> %f\n", afNotak[iKont]); else printf("\t\a Nota 0.0 eta 10.0 artekoa!\n"); } while ((afNotak[iKont] < 0.0) || (afNotak[iKont] > 10.0)); } } void NotakIkusi(const float afNotak[], int iZenbatIkasle) // bi parametroak sarrerakoak { int iKont; // afNotak[3] = 3.33; // babestuta dago printf("\n"); printf("\t Posizioa Ikaslea Nota\n"); printf("\t -------- ------- ----\n"); for (iKont=0; iKont<iZenbatIkasle; iKont++) { printf("\t %9d %11d %11.2f\n", iKont, iKont+1, afNotak[iKont]); } }
Hona hemen Ariketa-44b_ArrayaBeteErakutsi.cbp proiektuaren kodifikazioa non fNotak[] arraya ez da funtzioetara pasatzen, bere ordez float bati seinalatzen dion erakuslea pasatzen da, float hori fNotak[] arrayaren lehen elementuaren helbidea izango da, hots, afNotak aldagaia.
12. jarduera (III) | Erakusleak eta funtzioak gaia ikustean honetaz gehiago sakonduko da.
Hau da, afNotak[] arrayaren helbidea eta afNotak[0] elementuaren helbidea bera da eta array aldagaiaren afNotak identifikadoreak adierazten du helbide hori. Ikusi ere, p_fNota erakusleak seinalatzen duen erakutsia *p_fNota dela:
/* Ariketa-44b_ArrayaBeteErakutsi: arraya bete eta erakutsi */ // Errealekin lan eginez. Array bat datuz bete funtzio batean // eta arrayaren edukia pantailaratu erakusle bat erabiliz. #include <stdio.h> #define IKASLE_MIN 1 #define LUZERA_MAX 15 // ikasle kopuru maximoa void NotakSartu(float *, int); void NotakIkusi(const float *, int); int main() { float afNotak[LUZERA_MAX]; int iZenbatIkasle; printf("\n"); printf("\n\t Zerrenda betetzen zenbaki errealez"); printf("\n\t ----------------------------------\n"); do { printf("\n\t Zenbat nota sartuko dira? (gehienez %d): ", LUZERA_MAX); scanf("%d", &iZenbatIkasle); if ((iZenbatIkasle < IKASLE_MIN) || (iZenbatIkasle > LUZERA_MAX)) printf("\t\a Kopuru desegokia, errepikatu!!! (datua %d eta %d artekoa)", IKASLE_MIN, LUZERA_MAX); } while ((iZenbatIkasle < IKASLE_MIN) || (iZenbatIkasle > LUZERA_MAX)); printf("\n\t Lehen %d ikasleren notak eman, 0.0 eta 10.0 arteko balioak \n", iZenbatIkasle); NotakSartu(afNotak, iZenbatIkasle); NotakIkusi(afNotak, iZenbatIkasle); printf("\n"); return 0; } void NotakSartu(float *p_fNota, int iZenbatIkasle) // lehen parametroa irteerakoa da { // bigarren parametroa sarrerakoa da int iKont; for (iKont=0; iKont < iZenbatIkasle; iKont++) { do { printf("\t %d. ikaslearen nota eman: ", iKont+1); scanf("%f", (p_fNota + iKont)); if ((*(p_fNota + iKont) >= 0.0) && (*(p_fNota + iKont) <= 10.0)) printf("\t Sartutakoa --> %f\n", *(p_fNota + iKont)); else printf("\t\a Nota 0.0 eta 10.0 artekoa!\n"); } while ((*(p_fNota + iKont) < 0.0) || (*(p_fNota + iKont) > 10.0)); } } void NotakIkusi(const float *p_fNota, int iZenbatIkasle) // bi parametroak sarrerakoak { int iKont; // afNotak[3] = 3.33; // babestuta dago printf("\n"); printf("\t Posizioa Ikaslea Nota\n"); printf("\t -------- ------- ----\n"); for (iKont=0; iKont < iZenbatIkasle; iKont++) { printf("\t %9d %11d %11.2f\n", iKont, iKont+1, *(p_fNota + iKont)); } }
Erakusle kontzeptuaren azalpen laburra:
void NotakIkusi(const float *p_fNota, int iZenbatIkasle) funtzioaren deklarazioan bi parametro ditugu:
void NotakIkusi(const float *p_fNota, int iZenbatIkasle) funtzioaren kodean ondoko hauek aurkituko bagenitu horrela ulertu beharko lirateke:
|
Esan bezala, lehen bertsioa ikastea ezinbestekoa da, bigarren bertsioa ulertzea besterik ez da eskatzen:
|
iruzkinik ez:
Argitaratu iruzkina