Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Bevezetés a programozásba INF-501 A C programnyelv Informatikai Intézet Kógelmann Gábor.

Hasonló előadás


Az előadások a következő témára: "Bevezetés a programozásba INF-501 A C programnyelv Informatikai Intézet Kógelmann Gábor."— Előadás másolata:

1 Bevezetés a programozásba INF-501 A C programnyelv Informatikai Intézet Kógelmann Gábor

2 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor 1. A C programnyelv története B-nyelv, Ken Tompson, AT&T Bell Laboratories, UNIX operációs rendszer, DEC PDP-7 gép. B-nyelv  C-nyelv, Dennis Ritchie, (PDP-11) Brian Kernighan – Dennis Ritchie The C Programming Language (K&R, 1978.) ANSI-C szabvány, Jellemzői: Általános célú programnyelv; Hordozható (portabilis); Gépközeli (processzor-közeli); Elsősorban rendszerprogramok írására.

3 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Az újabb fejlesztések már csak C++ nyelven. Bjarne Stroustrup, AT&T Ismertebb C (C++) fordítóprogram gyártók: Microsoft (6.0) Watcom (Code Warrior) Borland Turbo C 2.0 (TC) Turbo C++ Borland C (BC, Ezt fogjuk használni!) Borland C (Ez a legutolsó, 2007.) Integrated Development Environment (IDE) General Public License (GNU-licensz) alatti ingyenes fordítóprogramok és fejlesztőkörnyezetek: DEV-C++ CodeBlocks, stb.

4 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor 2. A programnyelv alapelemei 2.1 A C nyelv jelkészlete A program írására használhatók (IR-23.o.). A szöveg-konstansokban használhatók (ASCII). 2.2 Az azonosítóképzés szabályai Kötött hossz; Az első karakter betű (angol ABC!), vagy _ jel; A további pozíciókon lehetnek számok is; A kis és NAGYBETŰ különböző !! Elnevezés konvenciók; Az ANSI C kulcsszavai (IR-25.o.); Az egyes implementációk kötött kulcsszavai.

5 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor 2.3 A programok írásmódja, a C programok szerkezete Egy vagy több forrásfájl.c (.cpp) kiterjesztéssel. Általában fejléc (header) fájlok is.h kiterjesztéssel. A legegyszerűbb C program: int main(void) { } Kevésbé „szabványosan” : ( int main(){} ) A main() függvénynév kötelező. Az utasításokat, függvényhívásokat ; zárja. Egy „bonyolultabb” program: #include int main(void) { printf("Az első programom."); return 0; /* Vissza az op.rendszerhez */ }

6 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Megjegyzés a programban: /* Megjegyzés */ // Megjegyzés A függvényen belüli sorrend: deklarációk definíciók végrehajtható utasítások Futtatható program előállítása (DOS, Windows): fordítás: forrás program  object modul.c .obj szerkesztés: object modul  futtatható program.obj,.lib .exe,.com,.dll Támogatott a moduláris programozás Borland – IDE (.prj fájl)

7 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor 3. Változók, konstansok, szimbólikus konstansok 3.1 Adattípusok a C nyelvben Egyszerű (skalár) típusok egész jellegű (integer) lebegőpontos (real) sorszámozott(enumerated ) mutató (pointer) Összetett típusok tömb (array) struktúra (structure) unió(union) Típuselőírást jelentő kulcsszavak char, int, float, double, union, struct, enum, void

8 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Típusmódosító kulcsszavak short- int long- int, double signed - char, int unsigned- char, int near - ( * pointer, csak DOS esetén) far - ( * pointer, csak DOS esetén) Típusminősítő kulcsszavak volatile const Az adattárolást szabályozó kulcsszavak auto, static, extern A változók deklárálásakor, illetve definiálásakor a kulcsszavak kombinációja adható meg.

9 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Az adattípusok jellemzői 16 bites környezetben (IR-45.o.) Adattípus Méret (bájt) Pontosság (jegy) Értéktartomány char, signed char ÷ 127 unsigned char 10 ÷ 255 int, short int ÷ unsigned int, unsigned short 20 ÷ long int, long ÷ unsigned long 40 ÷ float 47±3.4E-38 ÷ ±3.4E+38 double 815±1.7E-308 ÷ ±1.7E+308 long double 1019±3.4E-4932 ÷ ±1.1E+4932

10 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor 3.2 Konstansok, szimbólikus konstansok Egész típusú konstansok: Decimális 2007, -1, 0 Oktális (8-as számrendszerben) 0 – 7, az első jegy mindig , -0126, 010, 0 Hexadecimális (16-os számrendszerben) 0 – 9, a – f, A – F, az első jegy mindig 0X, vagy 0x. 0x6AB, 0x6aB, -0X1, 0x00 Előjel nélküli (unsigned) A konstans érték után U, vagy u. 126u, 010U, 0x1AU

11 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Hosszú típus (long) A konstans érték után L, vagy l. 126L, 010l, 0x1AL Az U, L együtt is használható 126lu, 010uL, 0x1ALU Karakteres konstansok: Egyszeres idézőjelben (apostrophe, aposztróf). A második karakterkészletből. 'a', 'x', 'É' Escape (‘eszkép’) szekvenciák Az első karakter \ (backslash), utána maximum további három. Az aktuális ASCII kódrendszer minden karaktere ezzel a módszerrel megadható.

12 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor A legfontosabb escape szekvenciák (IR-28.o.) Escape szekvencia ÉrtékKarakterJelölésÉrtelmezés \a0x07∙ BELLCsengő (sípolás) \b0x08◘ BSBack Space, visszalépéses törlés \f0x0C♀ FFForm Feed, lapdobás \n0x0A◙ LF, NLLine Feed, soremelés, újsor \r0x0D♪ CRCarriage Return, kocsi vissza \t0x09○ HTHorizontal Tabulate, tabulálás \\0x5C\ Backslash \'0x27' Aposztróf (hiányjel) \"0x22" Dupla aposztróf \ooo ooo = 1-3 oktális számjegy \xhh hh = 1-2 hexadecimális számjegy

13 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Sztring (literál) konstansok: Dupla aposztrófok között! "Ez egy sztring konstans " A sztring végét a memóriában egy '\0' jelzi. Az üres sztring csak a záró nullát tartalmazza. Lebegőpontos konstansok: Egész rész és tizedes törtrész. Tizedespont (kötelező). Hatványkitevő jele (e, E). Hatványkitevő értéke, előjellel. Egyes részek elhagyhatók. Tárolásuk dupla pontosságú formában..1, -2., , e-1

14 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Egyszeres pontosságú lebegőpontos konstansok A konstans érték után F, vagy f F Nagy pontosságú lebegőpontos konstansok A konstans érték után L, vagy l L Szimbólikus konstansok: #define konstans-név helyettesítő szöveg Szokás csupa nagybetűvel elnevezni. #define ALSO 0 #define FELSO 255 #define PI #define HA if

15 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor A const típusminősítő: const int a = 30;// Kezdeti érték a = 20; // Hibás utasítás 3.3 Skalárok és tömbök definiálása, deklarálása Az értéket tároló objektumokat névvel látjuk el, ezek a nyelv változói. Minden változót definiálni, vagy deklarálni kell. Csak a blokk elején, a végrehajtható utasítások előtt lehet elhelyezni. A skalár definíció szintaktikája: típus változónév ; tárolási osztály: auto, static, extern, register... : a változónévtől ismételhető

16 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Példák skalár definícióra: char a; // Karakteres static double B = 12.3; // Lebegőpontos long int c, d = 3, e, f = 15; // Hosszú egész Definiálás; helyfoglalás a memóriában. Deklarálás; nincs helyfoglalás, másik modulban (forrásprogramban) már definiálva (extern). A tömb definíció szintaktikája: típusváltozónév[elemszám_1] ; tárolási osztály: auto, static, extern, register... : a változónévtől ismételhető

17 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Az indexhatárok: 0  elemszám_1-1, 0  elemszám_2-1 Példák tömb definícióra: int vektor[5]; // Vektor char matrix[3][10]; // Mátrix (sor, oszlop) float tomb[2][5][6]; // Három dimenziós tömb A fordítóprogram nem ellenőrzi az indexhatárt! Egy objektum mérete lekérdezhető ( sizeof operátor): int a, b, c, d, vekt[3]; a = sizeof vekt[0]; // a  2 (2 bájt) b = sizeof vekt; // b  6 (3 x 2 bájt) // c  3 (6 / 2) c = sizeof vekt / sizeof vekt[2]; d = sizeof(float); // d  4

18 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Példák kezdeti értékadásra (inicializálás): Skalár int a = 5;float b = 3.45; Vektor Karakteres, numerikus char szo[6] = { 's', 'z', 'ó' }; int x[3] = { 1, 2, 3 }; float y[] = { 1.3, 120., 49.5}; Az elemszám megadás ilyenkor elmaradhat. Sztring char szoveg[] = "Ez egy szöveg."; Az elemszám 14+1=15 a sztring konstanst záró nulla miatt. A sztringek kezelésére könyvtári függvények vannak.

19 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Néhány sztring kezelő függvény: char forras[] = "alma + "; char cel[20]; inthossz; strcpy(cel, forras);// Másolás strcat(cel, "körte" );// Konkatenálás hossz = strlen(cel);// hossz  12 Mátrix Karakteres, numerikus char x[2][3] = {'a','b','c','d','e','f'}; int y[3][2] = { 6, 5, 4, 3, 2, 1 }; Sztring char sztring[][6] = { "körte", "alma" }; Csak a sorok száma hiányozhat!

20 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor 4. A C nyelv utasításai Az ANSI C szabvány hat csoportot definiál: Kifejezés és üres utasítás ( ; ) Összetett utasítás ( { } ) Szelekciós utasítások ( if, else, switch ) Cimkézett utasítások ( case, default, címke ) Iterációs utasítások ( for, while, do ) Vezérlésátadó utasítások ( break, continue, goto, return ) 4.1 Utasítások és blokkok Egy kifejezés utasítás lesz, ha pontosvesszővel zárjuk. x = y + 2; i++; v = z = fv(x, y) + 4;

21 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Az üres utasítás ; do, for, while és if esetén szükség lehet rá. Összetetett utasítás (blokk) { } Mindenhol használható, ahol egy utasítás is állhat. { lokális definíció, deklaráció utasítások } 4.2 A szelekciós (döntési) utasítások A programban bizonyos utasítás(ok) végrehajtását egy kifejezés értékétől tesszük függővé.

22 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Az if utasítás szintaktikája: if(kifejezés) utasítás Példa ( IF1.C ): Az Esc billentyű vizsgálata. #include #define ESC 27 int main(void) { charch; printf("Kérek egy karaktert: "); ch = getch(); if(ch == ESC) printf("\aAz Esc billentyű volt."); }

23 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor A kifejezés igaz, ha értéke nem nulla. Ebben az esetben végrehajtja az utasítást, vagy utasítás blokkot. Az if-else szerkezet szintaktikája: if(kifejezés) utasítás_1 else utasítás_2 A kifejezés hamis, ha értéke nulla. Ez esetben az else utáni utasítást, vagy utasítás blokkot hajtja végre. Az utasítás helyén legalább egy üres utasításnak ( ; ) kell állnia!

24 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Példa ( IF2.C ): Páros-páratlan számok. #include int main(void) { int n; printf("Kérek egy egész számot: "); scanf("%d", &n); if(n % 2 == 0) printf("\nA szám páros."); else printf("\nA szám páratlan."); } Az n % 2 maradékos osztás végez.

25 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Az if utasítások egymásba is ágyazhatók: if(kifejezés_1) if(kifejezés_2) utasítás_1 else utasítás_2 Az elképzelésünk és a valóság néha nem egyezik… A helyes működés elérésére több lehetőség is kínálkozik. Ezt akartuk Ez lett

26 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor A lehetséges megoldások: a.) if(kifejezés_1) if(kifejezés_2) utasítás_1 else ; else utasítás_2 b.) if(kifejezés_1) { if(kifejezés_2) utasítás_1 } else utasítás_2 Üres utasítás Üres utasítás Utasítás blokk Utasítás blokk

27 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Az if-else szerkezet helyett használható a feltételes operátor: ? : kifejezés_1 ? Kifejezés_2 : kifejezés_3; [ ha igaz ] [ ha hamis ] x = a < b ? a : b; Az else if szerkezet szintaktikája: if(kifejezés_1) utasítás_1 else if(kifejezés_2) utasítás_2 else if(kifejezés_3) utasítás_3 < else utasítás_4 > Az igaz kifejezés_n utasítását végrehajtja. Elhagyható

28 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Példa ( IFCALC.C ): Négyműveletes, egyszerű számológép. #include int main(void) { double a, b, e; char op; printf("Kérem az elvégzendő műveletet: "); scanf("%lf %c %lf", &a, &op, &b); if(op == '+') e = a + b; else if(op == '-') e = a - b;

29 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor else if(op == '*') e = a * b; else if(op == '/') e = a / b; else { printf("Hibás művelet!\n"); exit(-1);// Kilépés a programból } printf("%.2lf %c %.2lf = %.3lf\n", a, op, b, e); } Példa a művelet beírására: /142 Ha osztónak nullát adunk meg, program megszakítás okoz! (Divide by 0)

30 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor A switch utasítás szintaktikája: switch(kifejezés) { case konstans kifejezés_1: utasítás_1 case konstans kifejezés_2: utasítás_2 < default: utasítás_3 > } A kifejezés kiértékelése során kapott értéket hasonlítja a konstans kifejezés_n értékhez, ahol igaz, belép. Az utasítás végrehajtás megszakítható: break, return A kifejezések csak egész jellegűek lehetnek. A konstans értékeknek egyedinek kell lenniük. Elhagyható

31 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Példa ( SWCALC.C ): Négyműveletes számológép switch-el megoldva. (részlet).... switch(op) { case '+': e = a + b; break; case '-': e = a - b; break; case '*': e = a * b; break; case '/': e = a / b; break;

32 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor default: printf("Hibás művelet!\n"); return -1; }// a switch lezárása.... Példa ( SWITCH1.C ): Igen-Nem válasz vizsgálata. #include int main(void) { char valasz; printf("A válasz [I/N]? "); valasz = getchar();

33 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor switch(valasz) { case 'i': case 'I': printf("A válasz IGEN.\n"); break; case 'n': case 'N': printf("A válasz NEM.\n"); break; default: printf("Hibás válasz!\n"); } Példa ( SWITCH2.C ): 0-7 faktoriális kiszámítása. (0! = 1)

34 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor #include int main(void) { int num, fakt = 1; printf("Kérek egy egész számot (0-7): "); scanf("%d", &num); switch(num) { default: printf("Hibás szám: %d\n", num); break; case 7:fakt = fakt * 7;... case 2:fakt = fakt * 2; case 1: case 0: printf("%d! = %d\n", num, fakt); }

35 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Példa: Egyjegyű int (0-9) konvertálása char típusra. (részlet) a.) switch-case (bonyolult) int a; char b; switch(a) { case 0: b = '0'; break;.... case 9: b = '9'; break; } b.) Gondolkodva valahogy így … b = a + 48; vagy b = a + 0x30;

36 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor 4.3 Ciklusszervező (iterációs) utasítások A programban bizonyos utasításainak ismételt végrehajtása, egy feltétel teljesüléséig. A while utasítás szintaktikája (előltesztelő): while(kifejezés) utasítás Példa: Az első 100 pozitív szám összege (részlet). int i = 1; int osszeg = 0; while(i <= 100) { osszeg = osszeg + i; i = i + 1; }

37 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Végtelen ciklus: while(1) Kilépés: break - el {... } Veszélyek: while(a == b)while(a = b) Hiba!{......} while(a == b + c) helyett while(b + c == a) float x = 1.0; while(x != x + 1) Elvileg végtelen ciklus! x = x * 2.0; printf("A ciklus vége x = %e\n", x); Kilépés: x = 1.84e19 -nél (BC)

38 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor A for utasítás szintaktikája (előltesztelő): for(kifejezés_1; kifejezés_2; kifejezés_3) utasítás A kifejezés_1 mindig végrehajtódik. A ciklusmag csak akkor, és addig hajtódik végre, ha a kifejezés_2 igaz (nem nulla). A kifejezés_3 a ciklusmag után kerül sorra. Bármelyik kifejezés elmaradhat, csak a pontosvesszőket kötelező megadni. Végtelen ciklus: for(;;) Kilépés: break - el {... }

39 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Tipikusan így használjuk: for(i=0; i

40 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor a.) osszeg = 0; for(i=1; i<=100; i++) osszeg = osszeg + i; b.) for(osszeg=0, i=1; i<=100; i++) osszeg = osszeg + i; c.) for(osszeg=0, i=1; i<=100; osszeg = osszeg + i, i++); d.) for(osszeg=0, i=1; i<=100; osszeg = osszeg + i++); e.) for(osszeg=0, i=1; i<101; osszeg += i++); Vessző Pontosvessző

41 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor A do-while utasítás szintaktikája (hátultesztelő): do utasítás while(kifejezés); Végtelen ciklus: do Kilépés: break - el... while(1); Példa: Az első 100 pozitív szám összege (részlet). osszeg = 0; i = 100; do { osszeg = osszeg + i; i--; } while(i>0);

42 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor 4.4 A vezérlésátadó utasítások A break és a return utasítás szintaktikája: break;// Kilép a ciklusból return;// Visszatér a hívó függvényhez Példa: Ha i eléri a harmincat, kilép a ciklusból. for(i=0 ;; i++) { if(i == 30) break;// vagy, return;... } // break; esetén itt folytatódik a program. // return; esetén ide már nem jut el... A break gyakori használata nem célszerű!

43 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor A continue utasítás szintaktikája: continue;// Az iteráció folytatása Példa: A hárommal osztható számok kihagyása az összegzésből. for(osszeg=0, i=1; i<101; i++) { if((i % 3) == 0) continue; osszeg += i; } A ciklusfej kiértékelésével folytatódik a program. A continue gyakori használata nem javasolt!

44 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor A goto utasítás szintaktikája: goto cimke; // Vezérlés átadás a cimkére... cimke: A strukturált programozás alapelvei szerint tilos használni! Csökkenti a program olvashatóságát. Ennek ellenére a gyakorlatban előfordulhat olyan eset, amikor használatával egyszerűbbé válik a program. A cimkének a függvényen belül kell lennie.

45 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Példa: Két egymásba ágyazott ciklusból kell kilépni, egy feltétel teljesülése esetén. for(...) {... if(hiba) { printf("Hiba van a programban!\n"); goto hibaVolt; } hibaVolt:

46 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Az előző feladat, most goto nélkül megoldva. hibaJel = 0; for(...) { for(...) {... if(hiba) { printf("Hiba van a programban!\n"); hibaJel = 1; break; } if(hibaJel == 1)// vagy, if(hibaJel) break; }

47 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor 5. Függvények a C nyelvben Bizonyos részfeladatok, illetve gyakran ismétlődő utasítások végrehajtására a programban függvényeket készítünk. 5.1 Függvények definíciója, deklarációja, prototípusa A saját függvényeket mindig definiálni kell, és csak egyszer fordulhat elő a forrásprogramban. Ha a függvény definíció megelőzi a függvény hívás helyét, akkor egyben deklarációnak, illetve prototípusnak is minősül. Ezért szokás a main függvényt a forrásprogram végére helyezni. Az include fájlok tartalmazzák a könyvtári függvények prototípusát is.

48 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor A függvény definíció szintaktikája: függvénynév( ) {// A függvény törzse utasítás(ok) ;> } A típus helyén a változóknál megismert típuselőírások lehetnek. Ebben az esetben a return kifejezés; utasítás kötelező, és a kifejezés értékének a visszatérési típusra konvertálható típusúnak kell lennie. Amennyiben a típus void, azaz nincs visszatérési értéke a függvénynek, akkor csak üres return; lehet, vagy el is maradhat.

49 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor A függvény deklaráció szintaktikája: függvénynév( ); A fordítóprogramnak szolgáltat információt a helyes függvény alak ellenőrzésére. A függvény prototípus szintaktikája: függvénynév( ); Az ANSI C vezette be. A fordítóprogramnak szolgáltat információt a helyes függvény alak ellenőrzésére. Itt a paraméterlistát is meg kell adni, ha a függvény tartalmaz paramétert. A deklarációt, vagy a prototípust a definíció, illetve a hívás előtt kell elhelyezni a forrásprogramban. Pontosvessző

50 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor 5.2 Az argumentum, a paraméter és a visszatérési érték A függvény meghívásakor argumentumokat adunk át, a meghívott függvénynek. (Amennyiben szükséges.) Az argumentumok és paraméterek típusának, sorrendjének, darabszámának meg kell egyeznie. Lehetőség van kevesebb argumentummal is meghívni a függvényt, ekkor azonban a prototípusban az elhagyható paramétereket három ponttal jelölni kell. A listában a paramétereket vesszővel kell elválasztani. Példa: A könyvtári printf() függvény. int printf(const char *format,...); A visszatérő érték a kiírt bájtok száma. A skalár argumentum átmásolódik a paraméterbe. Tömb esetén a tömb kezdőcíme kerül a paraméterbe.

51 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Ha elmarad a prototípusban a visszatérő érték típusa, akkor a fordító int típust feltételez! (Hibalehetőség.) 5.3 Összefoglaló példa a függvények használatára Két érték közül a kisebb kiválasztása, és visszaadása a hívónak. int smin(int a, int b);// A prototípus int main(void)// A főprogram { int x = 8, y = 3, z; z = smin(x, y);// A függvény hívás printf("A kisebb érték: %d\n", z); } A printf() a következő is lehetne: printf("A kisebb érték: %d\n", smin(x, y)); Elmaradhat

52 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor int smin(int a, int b)// A definíció { if(a < b) return a; else return b; } A következő is lehetne: return a < b ? a : b; Az stdlib.h include fájlban függvényszerű makróutasításként van definiálva (min és max): #define min(a, b) (((a) < (b)) ? (a) : (b)) #define max(a, b) (((a) > (b)) ? (a) : (b))

53 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor 6. Operátorok és kifejezések Kifejezés: Vagy egyetlen operandusból, vagy operandusok és műveleti jelek (operátorok) kombinációjából áll. Az operandus lehet: Konstans érték Változó Függvényhívás Összetett kifejezés zárójellel, vagy anélkül. Az operandusok száma szerint: Egyoperandusú operátorok (unary) op operandus, vagy operandus op alakban [prefix alak] [postfix alak] -a, sizeof a, a++

54 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Kétoperandusú operátorok (binary) operandus1 op operandus2 a + b, a << 2, a += b Háromoperandusú (egy van) a < 0 ? -a : a 6.1 Aritmetikai, relációs és logikai operátorok Aritmetikai operátorok: + - * / % (maradékképzés, moduló operátor) - (előjel, egyoperandusú) ++ (inkrementálás, léptető operátor) -- (dekrementálás, léptető operátor)

55 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Az osztás maradékának meghatározása: inta = 16, b, e; b = a / 12; e = a - (b * 12);// e = 4 Vagy egyszerűbben: e = a % 12;// e = 4 A léptető operátor posztfix, illetve prefix helyzetben: int n = 5, x; x = n++;// x = 5, n = 6 n = 5; x = ++n;// x = 6, n = 6 Érdekesség: int a = 1, b = 2, e; e = a+++++b;// Hibás! e = a b;// Jó printf("%d %d %d", a, b, e); //  2 3 4

56 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor int a = 1, b = 2, e; e = a++-++b;// Ez viszont jó printf("%d %d %d", a, b, e); //  Relációs (összehasonlító) operátorok: >= == != A hasonlítás eredménye int típusú, és értéke 1 igaz esetén, illetve 0 nem igaz esetén. int a = 1, b = 2; if(a < b)...//  igaz (1) Logikai operátorok: && || ! Ha egy változó nem igaz értékére akarunk rákérdezni: if(ok == 0)...// vagy if(!ok)...

57 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Példa a relációs és logikai operátorok használatára: Szökőév eldöntése. Szökőév van, ha az évszám néggyel osztható, de nem osztható százzal, kivéve a négyszázzal osztható éveket. int ev;... if((ev%4 == 0 && ev%100 != 0) || ev%400 == 0) printf("Szökőév van..."); else printf("Nincs szökőév..."); 6.2 Az értékadó kifejezés, és a típuskonverzió Példák értékadó kifejezésekre: int a, b; b = (a + 2) / ; b = 5 * (a = 12) - 3;

58 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor a = b = -56; a = -2, b = a + 25; a = a + 4;// vagy a += 4;// Összetett értékadás a = a * (b + 1);// vagy a *= b + 1;// Összetett értékadás Az összetett értékadás általánosan: kifejezés1 op= kifejezés2 Az op helyén a következő operátorok állhatnak: + - * / % > & | ^ (Az öt utóbbi bitművelet!)

59 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Értékadás feltételes operátorral: kifejezés1 ? kifejezés2 : kifejezés3 Példa: számérték hexadecimális számjeggyé konvertálása. char ch; int n;... ch = n >= 0 && n <= 9 ? ' 0 ' + n : ' A ' + n - 10; Típuskonverzió: Automatikus típuskonverzió (implicit) Általánosan igaz, hogy a szűkebb operandus adatvesztés nélkül konvertálható a szélesebbe.

60 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Lebegőpontos számok: float  double  long double Egész jellegű típusok: char  short int  int  long int long int  float... Aritmetikai konverzió: Kétoperandusú műveletek esetén az eredményt a szélesebb (pontosabb) típusba konvertálja. Példa: int a = 9, b = 2; float e; e = a / b;// e = 4 !! e = a / 2;// e = 4 !! e = a / 2.0// e = 4.5

61 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Kikényszerített típuskonverzió (explicit) Típuskonverzió operátor (cast) : (típusnév) kifejezés Gyakran használjuk könyvtári függvények helyes argumentum-típussal történő meghívásakor. Példa: int a; a = sqrt((double) 56); implicit explicitkonverzió ( A prototípus: double sqrt(double szám); ) int a = 9; float e; e = (float) a / 2; // e = 4.5 e = (float) (a / 2);// e = 4 !! e = a / (float) 2;// e = 4.5

62 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor 6.3 Bitműveletek Alkalmazható: char, short int, int, long int típusok esetén Bitenkénti logikai műveletek: OperátorMűvelet ~ 1-es komplemens | bitenkénti VAGY (OR) művelet & bitenkénti ÉS (AND) művelet ^ bitenkénti KIZÁRÓ VAGY (XOR) művelet Igazságtáblázat: a b a & b a | b a ^ b ~a

63 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Általában a hardver elemek programozásánál használatos. Bitek beállítása, törlése. Maszkolás. char típus esetén a bitek számozása: Maszkbit értékek (példa) Sz ámozás (BITMUV.C) ~ Egyes komplemens: a = 0x00; a = ~a; //  FF | Bitenkénti VAGY (bitek egybe állítása): a = 0x0E; a = a | 0x81;//  8F, (0x81 a maszk)

64 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor & Bitenkénti ÉS (bitek törlése): a = 0x8E; a = a & 0x77; //  06 ^ Bitenkénti KIZÁRÓ VAGY (titkosítás): a = 0x8E; a = a ^ 0x77; //  F9 (Titkos szöveg) a = a ^ 0x77; //  8E (Nyílt szöveg) ^ Bitenkénti KIZÁRÓ VAGY (értékcsere): a = 12; b = 69; //  a = 69, b = 12 a = a ^ b; b = b ^ a; a = a ^ b;

65 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor << Bitek balra tolása (left shift): a = 8; a = a << 4; //  128 >> Bitek jobbra tolása (right shift): a = 128; a = a >> 3; //  16 Példa: Kék háttér, és piros előtér szín beállítása (Borland C). textattr((BLUE << 4) + RED); << 4 A kék eltolása 4 bittel Az eltolás után A piros hozzáadása Az eredmény ( 0x14)

66 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor 6.4 Precedencia, asszociativitás, rövidzár Precedencia: Elsőbbségi szabály, kiértékelési sorrend. Asszociativitás: A kiértékelés iránya azonos szint esetén. OperátorAsszociativitás () []. ->  ! ~ & * (típus) sizeof  * / %  + -  >  >=  == !=  & 

67 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Rövidzár (short circuit): char a = 1, b = 2, c; c = a || b++;// b=2, c=1 !! c = b++ || a;// De most b=3, c=1 OperátorAsszociativitás ^  |  &&  ||  ?:  = += -= *= /= %= >= &= |= ^= , 

68 Bevezetés a programozásba Informatikai Intézet - INF-501 Kógelmann Gábor Irodalomjegyzék 1. Benkő Tiborné és társai: Programozzunk C nyelven ComputerBooks Budapest, B. W. Kernighan, D. M. Ritchie: A C programozási nyelv Műszaki könyvkiadó Budapest, Pető Ádám: ABC programozási nyelvkönyv SZÁMALK kiadó Budapest, Benkő Tiborné, Dr. Poppe András: Együtt könnyebb a programozás ( C ) ComputerBooks Budapest, 2004.


Letölteni ppt "Bevezetés a programozásba INF-501 A C programnyelv Informatikai Intézet Kógelmann Gábor."

Hasonló előadás


Google Hirdetések