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

Hasonló előadás


Az előadások a következő témára: "Bevezetés a programozásba"— 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
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, 1989. Jellemzői: Általános célú programnyelv; Hordozható (portabilis); Gépközeli (processzor-közeli); Elsősorban rendszerprogramok írására. Informatikai Intézet - INF Kógelmann Gábor

3 Bevezetés a programozásba
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 (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. Informatikai Intézet - INF Kógelmann Gábor

4 Bevezetés a programozásba
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. Informatikai Intézet - INF Kógelmann Gábor

5 Bevezetés a programozásba
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 <stdio.h> printf("Az első programom."); return 0; /* Vissza az op.rendszerhez */ Informatikai Intézet - INF Kógelmann Gábor

6 Bevezetés a programozásba
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) Informatikai Intézet - INF Kógelmann Gábor

7 Bevezetés a programozásba
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 Informatikai Intézet - INF Kógelmann Gábor

8 Bevezetés a programozásba
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. Informatikai Intézet - INF Kógelmann Gábor

9 Az adattípusok jellemzői 16 bites környezetben (IR-45.o.)
Bevezetés a programozásba 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 1 -128 ÷ 127 unsigned char 0 ÷ 255 int, short int 2 ÷ unsigned int, unsigned short 0 ÷ long int, long 4 ÷ unsigned long 0 ÷ float 7 ±3.4E-38 ÷ ±3.4E+38 double 8 15 ±1.7E-308 ÷ ±1.7E+308 long double 10 19 ±3.4E ÷ ±1.1E+4932 Informatikai Intézet - INF Kógelmann Gábor

10 Bevezetés a programozásba
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 0. 04317, -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 Informatikai Intézet - INF Kógelmann Gábor

11 Bevezetés a programozásba
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ó. Informatikai Intézet - INF Kógelmann Gábor

12 A legfontosabb escape szekvenciák (IR-28.o.)
Bevezetés a programozásba A legfontosabb escape szekvenciák (IR-28.o.) Escape szekvencia Érték Karakter Jelölés Értelmezés \a 0x07 BELL Csengő (sípolás) \b 0x08 BS Back Space, visszalépéses törlés \f 0x0C FF Form Feed, lapdobás \n 0x0A LF, NL Line Feed, soremelés, újsor \r 0x0D CR Carriage Return, kocsi vissza \t 0x09 HT Horizontal 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 Informatikai Intézet - INF Kógelmann Gábor

13 Bevezetés a programozásba
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 Informatikai Intézet - INF Kógelmann Gábor

14 Bevezetés a programozásba
Egyszeres pontosságú lebegőpontos konstansok A konstans érték után F, vagy f. 3.1415F Nagy pontosságú lebegőpontos konstansok A konstans érték után L, vagy l. 3.1415L 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 Informatikai Intézet - INF Kógelmann Gábor

15 Bevezetés a programozásba
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árolási osztály> <módosító(k)> <minősítő(k)> típus változónév < =kezdőérték > <,...>; tárolási osztály: auto, static, extern, register ... : a változónévtől ismételhető Informatikai Intézet - INF Kógelmann Gábor

16 Bevezetés a programozásba
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árolási osztály> <módosító(k)> <minősítő(k)> típus változónév[elemszám_1]<[elemszám_2][...]> < = {érték1, érték2, ...}> <,...>; tárolási osztály: auto, static, extern, register ... : a változónévtől ismételhető Informatikai Intézet - INF Kógelmann Gábor

17 Bevezetés a programozásba
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 Informatikai Intézet - INF Kógelmann Gábor

18 Bevezetés a programozásba
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. Informatikai Intézet - INF Kógelmann Gábor

19 Bevezetés a programozásba
Néhány sztring kezelő függvény: char forras[] = "alma + "; char cel[20]; int hossz; 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! Informatikai Intézet - INF Kógelmann Gábor

20 Bevezetés a programozásba
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; Informatikai Intézet - INF Kógelmann Gábor

21 Bevezetés a programozásba
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é. Informatikai Intézet - INF Kógelmann Gábor

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

23 Bevezetés a programozásba
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! Informatikai Intézet - INF Kógelmann Gábor

24 Bevezetés a programozásba
Példa (IF2.C): Páros-páratlan számok. #include <stdio.h> 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. Informatikai Intézet - INF Kógelmann Gábor

25 Bevezetés a programozásba
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 Informatikai Intézet - INF Kógelmann Gábor

26 Bevezetés a programozásba
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) { } Üres utasítás Utasítás blokk Informatikai Intézet - INF Kógelmann Gábor

27 Bevezetés a programozásba
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ó Informatikai Intézet - INF Kógelmann Gábor

28 Bevezetés a programozásba
Példa (IFCALC.C): Négyműveletes, egyszerű számológép. #include <stdio.h> #include <stdlib.h> 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; Informatikai Intézet - INF Kógelmann Gábor

29 Bevezetés a programozásba
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: <Enter> 32/142 <Enter> Ha osztónak nullát adunk meg, program megszakítás okoz! (Divide by 0) Informatikai Intézet - INF Kógelmann Gábor

30 Bevezetés a programozásba
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ó Informatikai Intézet - INF Kógelmann Gábor

31 Bevezetés a programozásba
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; case '*': e = a * b; case '/': e = a / b; Informatikai Intézet - INF Kógelmann Gábor

32 Bevezetés a programozásba
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 <stdio.h> int main(void) { char valasz; printf("A válasz [I/N]? "); valasz = getchar(); Informatikai Intézet - INF Kógelmann Gábor

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

34 Bevezetés a programozásba
#include <stdio.h> 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); } Informatikai Intézet - INF Kógelmann Gábor

35 Bevezetés a programozásba
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; Informatikai Intézet - INF Kógelmann Gábor

36 Bevezetés a programozásba
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; } Informatikai Intézet - INF Kógelmann Gábor

37 Bevezetés a programozásba
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) Informatikai Intézet - INF Kógelmann Gábor

38 Bevezetés a programozásba
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 { . . . } Informatikai Intézet - INF Kógelmann Gábor

39 Bevezetés a programozásba
Tipikusan így használjuk: for(i=0; i<n; i++) { . . . } Ez is egy lehetséges formátum: for(i=0; i<n;) i = i + 1; Példa: Az első 100 pozitív szám összege (részlet). Több megoldást is láthatnak, melyek teljesen egyenértéküek. Informatikai Intézet - INF Kógelmann Gábor

40 Bevezetés a programozásba
a.) osszeg = 0; for(i=1; i<=100; i++) osszeg = osszeg + i; b.) for(osszeg=0, i=1; i<=100; 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ő Informatikai Intézet - INF Kógelmann Gábor

41 Bevezetés a programozásba
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); Informatikai Intézet - INF Kógelmann Gábor

42 Bevezetés a programozásba
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ű! Informatikai Intézet - INF Kógelmann Gábor

43 Bevezetés a programozásba
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! Informatikai Intézet - INF Kógelmann Gábor

44 Bevezetés a programozásba
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. Informatikai Intézet - INF Kógelmann Gábor

45 Bevezetés a programozásba
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: Informatikai Intézet - INF Kógelmann Gábor

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

47 Bevezetés a programozásba
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. Informatikai Intézet - INF Kógelmann Gábor

48 Bevezetés a programozásba
A függvény definíció szintaktikája: <típus> függvénynév(<paraméterlista>) { // A függvény törzse <lokális definíciók, deklarációk> utasítás(ok) <return <kifejezés>;> } 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. Informatikai Intézet - INF Kógelmann Gábor

49 Bevezetés a programozásba
A függvény deklaráció szintaktikája: <típus> 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: <típus> függvénynév(<paraméterlista>); Az ANSI C vezette be. 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ő Informatikai Intézet - INF Kógelmann Gábor

50 Bevezetés a programozásba
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. Informatikai Intézet - INF Kógelmann Gábor

51 Bevezetés a programozásba
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 Informatikai Intézet - INF Kógelmann Gábor

52 Bevezetés a programozásba
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)) Informatikai Intézet - INF Kógelmann Gábor

53 Bevezetés a programozásba
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++ Informatikai Intézet - INF Kógelmann Gábor

54 Bevezetés a programozásba
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) Informatikai Intézet - INF Kógelmann Gábor

55 Bevezetés a programozásba
Az osztás maradékának meghatározása: int a = 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 Informatikai Intézet - INF Kógelmann Gábor

56 Bevezetés a programozásba
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) . . . Informatikai Intézet - INF Kógelmann Gábor

57 Bevezetés a programozásba
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; Informatikai Intézet - INF Kógelmann Gábor

58 Bevezetés a programozásba
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!) Informatikai Intézet - INF Kógelmann Gábor

59 Bevezetés a programozásba
Értékadás feltételes operátorral: kifejezés1 ? kifejezés2 : kifejezés3 Példa: 0 -15 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. Informatikai Intézet - INF Kógelmann Gábor

60 Bevezetés a programozásba
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 Informatikai Intézet - INF Kógelmann Gábor

61 Bevezetés a programozásba
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 explicit konverzió ( 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 Informatikai Intézet - INF Kógelmann Gábor

62 Bevezetés a programozásba
6.3 Bitműveletek Alkalmazható: char, short int, int, long int típusok esetén Bitenkénti logikai műveletek: Operátor Mű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 Informatikai Intézet - INF Kógelmann Gábor

63 Bevezetés a programozásba
Á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) Informatikai Intézet - INF Kógelmann Gábor

64 Bevezetés a programozásba
& Bitenkénti ÉS (bitek törlése): a = 0x8E; a = a & 0x77; //  06 ^ Bitenkénti KIZÁRÓ VAGY (titkosítás): 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; Informatikai Intézet - INF Kógelmann Gábor

65 Bevezetés a programozásba
<< 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) Informatikai Intézet - INF Kógelmann Gábor

66 Bevezetés a programozásba
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átor Asszociativitás () [] . -> ! ~ & * (típus) sizeof * / % + - << >> < <= > >= == != & Informatikai Intézet - INF Kógelmann Gábor

67 Bevezetés a programozásba
Operátor Asszociativitás ^ | && || ?: = += -= *= /= %= <<= >>= &= |= ^= , 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 Informatikai Intézet - INF Kógelmann Gábor

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


Letölteni ppt "Bevezetés a programozásba"

Hasonló előadás


Google Hirdetések