| ZER DAKIDAN: Erakusle kontzeptua menperatzen dut. ZER IKASIKO DUDAN: Funtzio bati array bat pasatzearen ordez, arrayaren erakuslea pasarazi ahal zaiola ikasiko dut. |
Array bat funtzioari pasatu beharrean erakusle bat pasatu
Jarraian ematen den programan fNotak[] arraya ez da funtzioen parametroa, bere ordez float bati seinalatzen dion erakuslea pasatzen da, float hori fNotak[] arrayaren lehen elementuaren helbidea izango da, hots, afNotak aldagaia.
Hona hemen funtzioen prototipoak eta funtzioei dagozkien deiak:
void NotakSartu(float *, int *); // erreal bat eta oso bat, biak irteerakoak void NotakIkusi(const float *, int); // erreal bat eta oso bat, biak sarrerakoak
NotakSartu(afNotak, &iZenbatIkasle); // aldagai-erakuslea eta helbidea (irteerak) NotakIkusi(afNotak, iZenbatIkasle); // konstante-erakuslea eta balioa (sarrerak)
NotakSartu() funtziora eta NotakIkusi() funtziora erakusleak pasatzen dira.
/* 12c1-Erakusleak-Arrayak: arraya erakusle bezala funtzioetan */
// Errealekin lan eginez. Array bat datuz bete funtzio batean
// eta arrayaren edukia pantailaratu erakusle bat erabiliz.
#include <stdio.h>
#include <stdlib.h>
#include <time.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 auzaz betetzen zenbaki errealez");
printf("\n\t ----------------------------------------\n");
NotakSartu(afNotak, &iZenbatIkasle);
NotakIkusi(afNotak, iZenbatIkasle);
printf("\n");
return 0;
}
void NotakSartu(float *p_fNota, int *iZenbatIkasle) // lehen parametroa irterakoa da
{ // bigarren parametroa irteerakoa da
int iKont;
float fKalifikazioa;
srand(time(NULL));
*iZenbatIkasle = rand() % (LUZERA_MAX - IKASLE_MIN + 1) + IKASLE_MIN; // 1 eta 15 arteko balioa
printf("\n\t *iZenbatIkasle = %d", *iZenbatIkasle);
printf("\n");
for (iKont=0; iKont < *iZenbatIkasle; iKont++)
{
fKalifikazioa = ((float)rand()/(float)(RAND_MAX)) * (10.0 - 0.0);
// printf("\n\t %2d. ikaslearen nota: %.2f", iKont+1, fKalifikazioa);
*(p_fNota + iKont) = fKalifikazioa;
}
}
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 biren areko kenketa
Jarraian ematen den adibidean programan strchr() funtzioaren adibide bat ematen da, ikusi nola IzenaZenbakiaBanatu() funtzioari sDatua eta sIzena arrayen erakusleak pasatzen zaizkion parametro bezala. Ikusi ere, arrayen helbideen artean kenketaren eragiketa aritmetikoa egin daitekeela kate baten luzera lortze aldera.
Adibide honen gakoa dago strchr() funtzioak itzultzen duen emaitzan, hots, strchr() funtzioak itzultzen helbidearen erakuslean: NULL karakterea aurkitzen ez badu eta karakterearen helbidea baldin eta aurkitzen badu.
/* 12c2-Erakusleak-Arrayak.cbp */
// strchr(katea, karak) funtzioak karak karakterea bilatzen du kate katean.
// Aurkitzen badu, karakterearen lehen agerpenaren erakuslea itzultzen du.
// Ez badu aurkitzen null erakuslea itzultzen du. Bilatutako karkaterearen
// posizioa zehazteko helbideen arteko kenketa egingo da.
#include <stdio.h>
#include <stdlib.h> // atof() funtziorako
#include <string.h> // strchr(), strlen(), strcpy() eta strncpy() funtzioetarako
#include <conio.h> // getch() eta getche() funtzioetarako
#define MAXIMOA 21 // katea mugatzeko konstantea,
// 20 karaktere + null mugatzailea
void IzenaZenbakiaBanatu(char *sDatua, char *sIzena, float *fZbk);
int main()
{
char sKatea[MAXIMOA] = "Kaixo mundua!"; // 13 letra + null mugatzailea
char cKarakterea;
char *erakuslea;
printf("\n");
printf("\n Luzera=%d sKatea=|%s|", (int)strlen(sKatea), sKatea);
printf("\n");
printf("\n Bilatu nahi den karaktere eman (adibidez: a edo u edo k): ");
cKarakterea = getche();
erakuslea = strchr(sKatea, cKarakterea);
printf("\n Bilaketaren emaitza: ||%s||", erakuslea);
if (erakuslea != NULL)
printf("\n Bilaketaren posizioa: |%d|", (int)(erakuslea - sKatea));
printf("\n\n Edozein tekla sakatu adibidearekin jarraitzeko... ");
getch();
char sDatua[MAXIMOA] = "Ana#7.25"; // 8 karaktere + null mugatzaile
char sIzena[MAXIMOA];
float fZbk;
printf("\n");
printf("\n Luzera=%d sDatua=|%s|\n", (int)strlen(sDatua), sDatua);
IzenaZenbakiaBanatu(sDatua, sIzena, &fZbk);
printf("\n sIzena=||%s|| (fZbk+1.11)=%.2f", sIzena, fZbk+1.11);
printf("\n\n Edozein tekla sakatu exekuzioa amaitzeko...\n\n");
return 0;
}
void IzenaZenbakiaBanatu(char *sDatua, char *sIzena, float *fZbk)
{
char *TraolaErak;
char sLaguntzaile[MAXIMOA];
printf("\n ---sDatua=|%s|---", sDatua);
TraolaErak = strchr(sDatua, '#');
printf("\n ---TraolaErak=|%s|---", TraolaErak);
printf("\n ___(helbidea) sDatua=%li___", (long)sDatua);
printf("\n ___(helbidea) TraolaErak=%li___", (long)TraolaErak);
printf("\n ___TraolaErak-sDatua=%li (karaktere kopurua)___\n", (long)(TraolaErak - sDatua));
if (TraolaErak != NULL)
{
strncpy(sIzena, sDatua, TraolaErak - sDatua);
sIzena[TraolaErak - sDatua] = '\0';
printf("\n ---sIzena=|%s|---\n", sIzena);
printf("\n ---TraolaErak=|%s|---", TraolaErak);
printf("\n ---TraolaErak+1=|%s|---", TraolaErak+1);
printf("\n ---TraolaErak-1=|%s|---\n", TraolaErak-1);
strcpy(sLaguntzaile, TraolaErak + 1);
*fZbk = atof(sLaguntzaile);
}
}

iruzkinik ez:
Argitaratu iruzkina