C lengoaian erabiltzen diren datu-motak hurrengo taulan ematen dira. Ikastaro honetan garatuko diren programetarako ez ditugu denak beharko, ezinbestekoak hauek dira: char karaktereak gordetzeko, int eta long kopuru osoak gordetzeko eta float zenbaki errealekin lan egiteko.
Datu-mota | Memoria | Heina | Ikasi |
---|---|---|---|
char | 1 byte | [-128..+127] | BAI |
signed char | 1 byte | [-128..+127] | EZ |
unsigned char | 1 byte | [0..+255] | EZ |
wchar_t | 2 — 4 byte | EZ | |
int | 2 byte 4 byte |
[-32768..+32767] [-2147483648..+2147483647] |
BAI |
signed int | 4 byte | [-2147483648..+2147483647] | EZ |
unsigned int | 4 byte | [0..+4294967295] | EZ |
short int | 2 byte | [-32768..+32767] | EZ |
signed short int | 2 byte | [-32768..+32767] | EZ |
unsigned short int | 2 byte | [0..+65535] | EZ |
long | 4 byte | [-2147483648..+2147483647] | BAI |
long int | 4 byte | [-2147483648..+2147483647] | EZ |
signed long int | 4 byte | [-2147483648..+2147483647] | EZ |
unsigned long int | 4 byte | [0..+4294967295] | EZ |
float | 4 byte | [-3.4e+38, -3.4e-38], 0.0, [+3.4e-38, +3.4e+38] |
BAI |
double | 8 byte | [-1.7e+308, -1.7e-308], 0.0, [+1.7e-308, +1.7e+308] |
BAI |
long double | 16 byte | [-3.4e-4932, -1.1e+4932], 0.0, [+3.4e-4932, +1.1e+4932] |
EZ |
Erabiltzailearen datu-mota programadoreak sortzen duen datu-mota berria izango da, datu-mota bereziak sortzeko typedef atala dago. Sortu den programarako baliagarria izango da soilik datu-mota berri hori eta, noski, lengoaiak aurredefinituriko dituen datu-motak oinarritzat izango ditu. Edozein programazio lengoaiak aurredefinituriko dituen datu-motak bi zatiz osatuak agertzen direla aipatu genuen ere:
- Aurrez determinaturiko memorian biltegitzeko sistema
- Datu-mota horrentzat egokiak diren eragiketak
Galletak egitean, lehenik orea prestatzen da. Hasieran orea uniformea eta jarraitua da, baina gero galleta desberdinen formak ematen zaizkio. Ordenagailuaren memoria gelaxkaz osaturik dago eta, orea bezala, gelaxkak talde desberdinetan multzoka daitezke datu desberdinak gorde ahal izateko. |
|
Prest dagoen oreari molde egokiak aplikatuz forma desberdineko galletak lor daitezke. Modu berean, ordenagailuaren memorian zenbaki oso bat gordetzeko molde aproposa erabiliko dugu (int datu-mota, noski). typedef klausularen bitartez datu-mota bereziak (molde edo txantiloi bereziak) diseina daiteze gure programak behar dituen datuak memorian gorde ahal izateko. |
|
Programaren typedef atalean datu-mota bereziak diseinatu ondoren, programan aldagaiak deklaratzean memoria-erreserbak egiten dira. Ondoko irudian ondo desberdintzen dira kontzeptu biak: Batetik, datu-mota (moldea edo txantiloia), eta bestetik aldagaia (berezko itxura duen memoriaren zati bat). |
|
Programaren exekuzioan aldagaiei balioak ematen zaizkio. Horretarako, aldagai jakin bati dagokion memoriako posizioan dagoen datuari, aplikatu ahalko zaizkion operazioak datu-motarenak izango dira. Adibidez: zenbaki osoa bada / eta % onartzen dira, baina && edo || operadoreak ez dira onartuko. |
|
Programa amaitzean, aldagai guztiek beraien balioak izango dituzte eta helburu ditugun emaitzak aldagai jakin batzuetan egongo dira. Programaren emaitza diren balio horiek, memoriatik aterako ditugu pantailan idazteko edo/eta fitxategiren batean biltegitzeko. |
C lengoaian programatzailearen datu-motak zehazteko typedef hitz erreserbatuaren bitartez egiten da. Demagun programa batean askotan erabali behar dela short unsigned int datu-mota zenbaki osoen aldagaiak sortzeko, honela egin beharko litzateke:
/* 13a_ProgramatzailearenDatuMotak */ // "short unsigned int" datu-motarako inolako aliasik sortu gabe #include <stdio.h> int main() { short unsigned int Zbk; short unsigned int Doblea; printf("\nDatua eman: "); scanf("%hd", &Zbk); Doblea = Zbk*2; printf("%hd datuaren doblea %hd da\n", Zbk, Doblea); printf("short unsigned int: %d byte\n", (int)sizeof(Zbk)); return 0; }
Goiko irudiaren eskema jarraituz, short unsigned int hiru hitz horientzat alias bat sor daiteke typedef hitz erreserbatuaren bitartez. Aurreko programaren baliokidea den hurrengo kodean, erreparatu typedef short unsigned int tUSHORT; lerroan non tUSHORT datu-mota berria sortzen den:
/* 13b_ProgramatzailearenDatuMotak */ // "short unsigned int" datu-motarako tUSHORT aliasia sortuta #include <stdio.h> typedef short unsigned int tUSHORT; int main() { tUSHORT Zbk; // short unsigned int datu-motako aldagaia tUSHORT Doblea; // short unsigned int datu-motako aldagaia printf("\nDatua eman: "); scanf("%hd", &Zbk); Doblea = Zbk*2; printf("%hd datuaren doblea %hd da\n", Zbk, Doblea); printf("tUSHORT: %d byte\n", (int)sizeof(tUSHORT)); return 0; }
Ariketa-45a_ArrayaAleatoriokiBete programa gogoratu, non BektoreaAleatoriokiBete() funtzioak array bat auzaz betetze duen eta BektoreaIkusi() funtzioak bere edukia erakusten duen. Oraingo honetan, typedef float tafBektorea[LUZMAX]; lerroaren bitartez tafBektorea datu-mota berria definituko da, adibide honetan datu-mota berri horrek array aldagaiak sortzeko balioko du:
/* 13_ProgramatzailearenDatuMotak: arraya aleatorioki bete eta erakutsi */ // Errealen array bat. Array bat datuz auzaz bete funtzio batean // eta ondoren arrayaren edukia pantailaratu arraya bera erabiliz. // tafBektorea etiketaz ezagutuko da arrayaren datu-mota sorberria. #include <stdio.h> #include <stdlib.h> // rand() eta srand() funtzioetarako #include <time.h> // time() funtzioarako #define BEHEMUGA 0.0 #define GOIMUGA 99.9 #define LUZMAX 20 // 20 elementu gehienez: 0. posiziotik 19. posizionarino typedef float tafBektorea[LUZMAX]; // tafBektorea datu-mota berri bat da void BektoreaAleatoriokiBete(tafBektorea afBektorea, int *); void BektoreaIkusi(const tafBektorea afBektorea, int); int main() { tafBektorea afBektorea; int iLuzera; printf("\n"); printf("\n\t Arrayaren luzera efektiboa eta bere balioak auzaz harturik"); printf("\n\t ----------------------------------------------------------\n"); BektoreaAleatoriokiBete(afBektorea, &iLuzera); printf("\n\t Arrayaren %d elementuak %d elementu gorde ondoren: \n", LUZMAX, iLuzera); BektoreaIkusi(afBektorea, LUZMAX); printf("\n\t Arrayaren %d elementuak: \n", iLuzera); BektoreaIkusi(afBektorea, iLuzera); printf("\n"); return 0; } void BektoreaAleatoriokiBete(tafBektorea afBektorea, int *iLuzera) // bi parametroak irterakoak dira { int iKont; srand((unsigned int)time(NULL)); // srand() zenbaki aleatorioak berriro hasiarazteko, srand()-ek hazia behar duenez, // time(NULL) funtzioak igarotako segundoak itzultzen ditu 1970-01-01 datatik hasita printf("\n\t Auzaz:"); *iLuzera = (rand() % (LUZMAX - 1)) + 1 ; // gutxienez elementu bat arrayan eta posizio handiena 19 da, beraz printf("\n\t *iLuzera=%d (1 eta %d artekoa)", *iLuzera, LUZMAX-1); // 0 eta 18 arteko balioari +1 gehitu (balioak 1 eta 19 artekoak) for (iKont=0; iKont < *iLuzera; iKont++) { afBektorea[iKont] = ((float)rand()/(float)(RAND_MAX)) * (GOIMUGA-BEHEMUGA); // 0.0 eta 0.999 artekoa bider (GOIMUGA-BEHEMUGA) printf("\n %15.2f (0.0 eta %.2f artekoa)", afBektorea[iKont], GOIMUGA-BEHEMUGA); // emaitza: 0.0 eta 99.9 artekoa } printf("\n"); } void BektoreaIkusi(const tafBektorea afBektorea, int iLuzera) // bi parametroak sarrerakoak { int iKont; // afBektorea[3] = 3.33; // babestuta dago printf("\n"); printf("\t Posizioa Balioa\n"); printf("\t -------- ------\n"); for (iKont=0; iKont < iLuzera; iKont++) { printf("\t %9d %13.2f\n", iKont, afBektorea[iKont]); } }
Programa baterako datu-mota berri bat sortzeko typedef hitz erreserbatua erabili behar da. Adibide honetan tafBektorea array datu-mota sortu da :
|
iruzkinik ez:
Argitaratu iruzkina