Programozás I. Széchenyi István Egyetem, Gy r 2013. október 3.
Szimbólumok Forráskód részei: szimbólumok (szintaktikai egységek, tokenek) fehér karakterek (összevonás, gyelmen kívül hagyás) Szimbólumok: operátor kulcsszó for, while, int, oat,... nem szabványos kulcsszavak, védett azonosítók (pl. cdecl, stdcall, _ és jellel kezd d k) elválasztó jel azonosító konstans karakterlánc
Azonosítók Változók, függvények, felhasználói adattípusok nevei. Els karakter: kis- vagy nagybet, ill. _ További karakterek: u. a., és számjegyek Nem lehet kulcsszó vagy védett azonosító Kis- és nagybet re érzékenyek Ajánlás: ne kezd djön egy vagy két _ karakterrel Szignikáns karakterek száma Mi lehet a gond? Gipsz Jakab 66_os_ut Men _Manó auto OK meno_mano Meno_Mano sokreszbolosszeteve
Típusok Típuskategóriák: függvény (csak ez eredményez kódot) void (hiány jelzése) skalár egész típusok lebeg pontos típusok felsorolás (enum) mutatók aggregátum tömb struktúra (struct) únió (union)
Típusok Csoportosítás alapja lehet: alaptípusok (void, char, int, float, double) származtatott típusok, típusmódosítókkal short / long (csak egészekhez, nincs aé.) signed (aé.) / unsigned Deklaráció: objektum azonosító típus meghatározása memóriafoglalás? Példák deklarációkra típus t1, t2; /* típus típusú objektumok */ típus fv1(void); /* típus típussal visszatér függvény */ void fv2(típus t); /* típus típusú paramétert fogadó függvény */ /* típus típussal visszatér, és ilyen típusú paramétert fogadó függvény */ típus fv3(típus t); típus tomb[5]; /* 5 elem, típus típusú elemekb l álló tömb */
Típusmódosítók További két típusmódosító (min sít ) const azonosító nem szerepelhet balértékként (csak olvasható változó) bármilyen típussal együtt használható kötelez inicializálni volatile változó értéke prg. végrehajtáson kívüli okból módosulhat (pl. párhuzamos programszál, megszakítás, stb.) Akár egyszerre is használhatóak! Példa a const min sít használatára const double e = 2.71828; const eletertelme = 42; /* const signed int */ Nem módosítható! e = 1234; ++eletertelme;
Egész típusok, konstansok Korábban megismert tulajdonságokon túlmen en... char alaptípus: biztosan 1 bájtos de a karakter konstans típusa int pl. 'xxxx', el jel kiterjesztés alapértelmezetten signed, de átállítható egész típusok ábrázolási korlátai limits.h nincs alul- és túlcsordulás limits.h részletek # dene SCHAR_MIN (-128) # dene UCHAR_MAX 255 # dene SHRT_MAX 32767 # dene INT_MAX 2147483647 # dene ULONG_MAX 18446744073709551615UL
Egész típusok, konstansok Egész konstansok tulajdonságai: megadható decimális, oktális (0... ) és hexadecimális (0x..., 0X... ) alakban (a... f, A... F) nincs el jele egyoperandusos bels ábrázolás int, de megváltoztatható decimális: int, long int, unsigned long int oktális, hexadecimális: int, unsigned int, long int, unsigned long int utótagok, konverzió elkerülésére: u, U (unsigned) l, L (long) Egész típusú változók és konstansok int i = 1; unsigned ui = 8u; int j = 010; /* == 8 */ long li = 16L; int k = 0x2A; /* == 42 */ unsigned long uli = 666Ul;
Felsorolt típus egész értékek sorozatának mnemonikussá tétele (ld. még #dene, const) enum <enum-címke><{enumerátorlista}><azonosítólista>; enum ekocsi {opel, vw, toyota, honda, renault, citroen} kocsi; Az enum-címke tulajdonságai: típus neve: enum ekocsi enum, struct és union által közösen használt névterületén egyedinek kell lennie! Névterület Azonosító csoport, amelyen belül az azonosítóknak egyedieknek kell lenniük.
Felsorolt típus enumerátorlista tulajdonságai: elemei: enumerátorok, enum konstansok normál változók névterületét használják típusuk mindig int értéküket elhagyható konstans kifejezések deniálják értékek 0-tól vagy az utoljára deniált értékt l implicit módon 1-esével n nek enum ekocsi {opel, vw, toyota=10, honda, renault=2*toyota, citroen} kocsi; /* opel == 0, vw == 1, toyota == 10, honda == 11,... */
Felsorolt típus Példák enum nemet {opel, vw=10} deutschekraft; enum nemet szomszedkocsija; /* Kés bb nem lehet több ilyen típusú változót létrehozni */ enum {toyota, honda} rizsraketa; enum {renault, peugeot}; int kocsi; /* int vw; HIBA: azonos névterületen már létezik ilyen azonosító */ int nemet; /* OK */ int it[3]; { /* OK: ebben a hatókörben nincs ilyen nev azonosító */ int vw; } deutschekraft = opel; deutschekraft = renault; /* Pimasz, de OK :) */ szomszedkocsija = 2; /* OK, de nem javasolt */ szomszedkocsija = (enum nemet)2; kocsi = honda; kocsi = peugeot; it[toyota] = vw; /* toyota++; HIBA: enum konstans nem lehet balérték */
Valós típusok, konstansok Típus Méret Számábrázolási határok Pontosság oat 4 bájt ±3, 4 10 38 ±3, 4 10 +38 6-7 dec. jegy double 8 bájt ±1, 7 10 308 ±1, 7 10 +308 15-16 dec. jegy long double 10 bájt ±1, 2 10 4932 ±1, 2 10 +4932 19 dec. jegy Konstansok tulajdonságai: ábrázolási határok oat.h mantisszából elhagyható az egész- vagy a törtrész, de mindkett nem! elhagyható a tizedes pont vagy az exponens (e, E) rész, de mindkett nem! nincs el jele egyoperandusos utótag nélkül a bels ábrázolás double f, F (float) l, L (long double, formátumspecikáció: %Lf) Néhány lebeg pontos konstans -5.,.3, 5.3, -5e4, 5.67E-12, -1.23e-4l, 5.F
Karakterláncok kezelése Karakterlánc konstansok (string literal), kiegészítés: elhelyezés: statikus adatterületen a fehér karakterrel elválasztott karakterlánc konstansokat a fordító egyesíti több sorba is írható, ha \-sel zárjuk a sort (folytatássor) Karakterlánc konstansok printf("régi " "nóta " "másképp: \n"); printf("hosszú az a nap, \ ami programozás nélkül múlik el\n"); Kimenet Régi nóta másképp: Hosszú az a nap, ami programozás nélkül múlik el
Karakterláncok kezelése A függvény visszaadja s karakterlánc méretét strlen() int length(char s[]) { int i = 0; while(s[i]!= '\0') ++i; /* int i; for(i=0; s[i]; i++); */ return i; } s karakterlánc int-té alakítása és visszaadása atoi() int atoi(char s[]) { int i, n=0; for(i=0; s[i]>='0' && s[i]<='9'; ++i) n=10*n+s[i]-'0'; return n; }
Karakterláncok kezelése Ha a c paraméter nagybet, akkor kisbet ssé konvertálva, egyébként változatlanul adja vissza tolower() int lower(int c) { if(c>='a' && c<='z') return(c-'a'+'a'); else return c; } c karakter minden el fordulásának törlése az s karakterláncból void squeeze(char s[], int c) { int i, j; for(i=j=0; s[i]!='\0'; i++) if(s[i]!= c) s[j++] = s[i]; s[j] = '\0'; }
Deklaráció Deníciós deklaráció (deníció) Helyfoglalás az objektumnak, esetleg kezd értékadás. Hatókörön belül csak egy ilyen létezhet. Referencia deklaráció (deklaráció) Nincs helyfoglalás, de tudatja a fordítóval az azonosítót, adattípust, stb. Több is létezhet ugyanarra az objektumra. Kísérleti deníció Minden küls adatdeklaráció, melynek nincs tárolási osztály specikátora és explicit inicializátora. Ha kés bb is felt nik, extern-nek kell tekinteni ( referencia deklaráció). Ha a fordítási egység végéig nem t nik fel, teljes denícióvá válik, tiszta zérus kezd értékkel. Deklarációs pont A deklaráció helye, el tte nem érhet el az objektum.
Deklaráció Példák /* Minden blokkon kívül! */ int i; int i; /* OK, nincs új infó. */ int j; int j=3; /* OK, nincs ellentmondás, most adtuk meg, mire kell inicializálni. */ int k=1; int k=2; /* HIBA, nem lehet többszörösen inicializálni. */
Egyszer típusdeníció (typedef) typedef: a tárolási osztály specikátor helyén szerepel új adattípus specikátor deniálására szöveghelyettesítésnél (#define) komplexebb feladatokra is alkalmas const és volatile alkalmazható rá, de más típusspecikátor nem! typedef használata #include <stdio.h> #define TIPUS long int int main(void) { auto long int li; typedef long int LI; /* unsigned LI j; HIBA */ LI egesz; const LI hosszuegesz = 5l; /* OK */ TIPUS he = 3l; /* OK */ return 0; }