Műszaki informatika 3. Ea: CPA A C nyelvű Programozás Alapjai B I v: T 2014.02.15 M A N 1/155
2/155
Témakörök A C nyelv jellemzői A C nyelvű program szerkezete A C nyelv elemei Algoritmusok C nyelven Feladat ötletek Ellenőrző kérdések 3/155
A C nyelv története Dennis MacAlistair Ritchie és Brian Kernighan AT&T, Bell Laboratories, 1972 rendszerprogramozás, de magas szintű nyelven 1973: a UNIX átírása C-re 4/155
A C nyelv története 5/155
A C nyelv története 6/155
A C nyelv története Dennis MacAlistair Ritchie és Brian Kernighan AT&T, Bell Laboratories, 1972 rendszerprogramozás, de magas szintű nyelven 1973: a UNIX átírása C-re 1978: K&R C Kvázi szabvány Széleskörű használat után: 1983: szabvány előkészítése 1989: ANSI C (X3.159-1989) A továbbiakban "C nyelv" alatt mindig "ANSI C" értendő 7/155
A C nyelv jellemzői Általános célú Viszonylag alacsony szintű Alapobjektumok: karakterek, számok, címek Nincsenek összetett objektumokat kezelő utasítások Általában kicsi és hatékony célprogram Törekvés a hordozhatóságra Számos implementáció Széleskörű használat Gazdag függvénykönyvtár választék Magas szintű programnyelvek C nyelv olvasható assembly Gépi nyelvek (assembly) 8/155
Témakörök A C nyelv jellemzői A C nyelvű program szerkezete A C nyelv elemei Algoritmusok C nyelven Feladat ötletek Ellenőrző kérdések 9/155
A C nyelvű program szerkezete Egy C program egy vagy több modulból áll. A modulok valamelyikének tartalmaznia kell egy main nevű függvényt. Ez lesz a program belépési pontja, vagyis ez kezd el végrehajtódni. Modul: 10/155 Minden modul külön file. A modulok önállóan lefordíthatók, úgynevezett tárgykóddá. A tárgykódú modulokat az összeszerkesztő (linker) állítja össze egy programmá. (A linker általában egyben van a fordítóval, és kapcsolókkal szabályozható, hogy csak tárgykódot készítsen, vagy végezze el az összeszerkesztést is, vagy csak összeszerkesztést készítsen.)
Ismétlés # include <stdio.h> void main ( ) { printf ( Helló Világ! \n ); } Szövegszerkesztő (editor) 11/155 Fordítóprogram Könyvtári modul 1CF7 B00C 37DA 4107 FAC4 660D 00F1 300BD 1FF0 35BB 337DD 239C 410F 396A C44D 006A 410F 396D 5CF3 B00A 3CDA 4107 FAC4 660D 00F1 300BD CCD4 BAF0 337DD 239C 33F5 0B6A Tárgykódú modul A tárgykódú modulokhoz hozzávesszük a könyvtári modulokat A linker összeszerkeszti Linker 10011110 11000011 10101100 10111000 00101100 10010010 10010000 01111011 A végeredmény a futtatható (exe) program
A C nyelvű program szerkezete 2. Egy modulos program esetén is van dolga az összeszerkesztőnek, hiszen a modulunkban használt könyvtári függvények (a C nyelvhez adott előre megírt függvények, pl. printf()) egy vagy több tárgykódú modulban vannak elhelyezve. Egy modul tartalmazhat: 12/155 A fordítónak szóló utasításokat (pl. #include <stdio.h>) Deklarációkat, definíciókat (változó, típus, stb.) Függvényeket (pl. void main() { } ) Megjegyzéseket
A C nyelvű program szerkezete 3. A C program szokásos szerkezete: direktívák globális deklarációk és definíciók void main() { lokális deklarációk utasítások // Megjegyzés } A minimális (működő) C program: void main( ) 13/155 { }
Az első program # include <stdio.h> void main ( ) { printf ( Helló Világ! \n ); } Könyvtári modul hívás Sorvégjel Függvény Sortörés 14/155
A programkészítés menete # include <stdio.h> void main ( ) { printf ( Helló Világ! \n ); } Prg1.c Fordítóprogram 1FF0 35BB 337DD 239C 410F 396A C44D 006A stdio.h printf Prg1.obj Linker Szövegszerkesztő (editor) 15/155 410F 396D 5CF3 B00A 3CDA 4107 FAC4 660D stdio.h 10011110 11000011 10101100 10111000 00101100 10010010 10010000 01111011 Prg1.exe
Standard könyvtári modulok Alapszabály: C programban csak deklarált azonosítók használhatók! A standard függvények deklarációját standard könyvtári modulok (header fájlok) tartalmazzák. Az #include un. direktíva a forrásszövegbe beszúrja a megadott fájlt: A standard input-output függvények és konstansok deklarációinak beillesztése: #include <stdio.h> Matematikai függvények deklarációi: #include <math.h> Saját függvények deklarációi #include "fuggvenyeim.h" 16/155
Témakörök A C nyelv jellemzői A C nyelvű program szerkezete A C nyelv elemei Algoritmusok C nyelven Feladat ötletek Ellenőrző kérdések 17/155
A C nyelv elemei Szintaktikai egységek Változók, elemi adattípusok Egyszerű ki- és beviteli utasítások Operátorok Elágazás utasítások Ciklus utasítások Függvények Tömbök Mutatók 18/155
Szintaktikai egységek Azonosítók Betűk, számjegyek és _ (aláhúzás) Nem kezdődhet számjeggyel Maximális hossza függ a C nyelv verziótól, de minimum 8 karakter Nem lehet a nyelv kulcsszava Kis-nagybetű érzékeny! Case sensitive! Kulcsszavak Fenntartott szavak, kisbetűsek. 19/155
Szintaktikai egységek 2. Operátorok Egy- két- és három operandusú. Széles választék (Később részletezem!) Egyéb elválasztók Utasításvég: ; (pontosvessző) Blokkhatárok: { } Megjegyzés /* Karaktersorozat */ Nem skatulyázhatók egymásba! // Karaktersorozat 20/155
A C nyelv elemei Szintaktikai egységek Változók, elemi adattípusok Egyszerű ki- és beviteli utasítások Operátorok Elágazás utasítások Ciklus utasítások Függvények Tömbök Mutatók 21/155
Változó A programokban az adatok változók formájában jelennek meg változókban tároljuk az adatokat. A változó névvel ellátott tároló hely a számítógép memóriájában. A változó értéke ezen tároló hely pillanatnyi értéke. A változó jellemzői: Neve azonosító kell legyen Típusa memóriaméret Értéke memóriatartalom Címe tárbeli kezdőcím 22/155
Specialitások A karakter típus teljesen egyenértékű az egésszel, csak megjelenítésükben különböznek. (Lehet például két karaktert osztani egymással.) Nincs külön logikai típus. Az egészeket használja logikai értékként. A 0 értéket hamisnak tekinti, az ettől eltérő egész értéket igaznak. A relációk eredménye pedig 0 ha hamis, és 1 ha igaz. Nincs szöveges típus. A szövegek tárolására karakter tömböket használ. 23/155
Egész (integrális) típusok Típusnév char short(int) int long(int) Hossz 1 bájt 1 bájt (legalább) 2 bájt (legalább) 4 bájt Egész konstansok: Decimális: 123, -35 Oktális: 045 (tehát nullával kezdődik) Hexadecimális: 0x4A (tehát 0x-el kezdődik) 24/155
Egész (integrális) típusok 2. Megjegyzések: A nyelv csak azt írja elő, hogy short <= int és int <= long Mindegyik elé alkalmazható a signed (előjeles) - a char kivételével ez az alapértelmezés unsigned (előjel nélküli) Pl. short a; Értelmezési tartomány: -128.. 127 unsigned short a; Ért. tart: 0.. 255 A char előjelessége gépfüggő! 25/155
Lebegőpontos típusok Típusnév Pontosság Hossz float kis pontosságú 4 bájt double dupla pontosságú 8 bájt long double nagy pontosságú 16 bájt Valós konstansok: Tizedespontos alak: 12.34, 0.4534 Tudományos alak: 26/155 2.345e5, 0.56E-2 (azaz 234500.0, 0.0056) Alapértelmezés szerint duplapontosságú egy valós konstans, de elő lehet írni kispontosságot is a szám után tett f vagy F betűvel (45.6F).
Void A void egy speciális típus, ami két helyen használható: Mutatók típusaként megadva jelzi, hogy még nem ismert a típus. Függvények visszatérési értékének típusaként megadva jelzi, hogy nincs visszatérési érték. 27/155
Deklaráció (bevezetés, kihirdetés) A C nyelvben minden változót kötelező deklarálni! Szintaktikája: Változó: típus azonosító[,azonosító]; Pl. int a, b, c; unsigned int ertek=0; Tömb: típus azonosító[elemek száma]; Pl. int szamok[10]; Az indexelés 0-tól indul! 28/155 Deklarálás! Inicializálás!
Példa 1. Három szám összege # include <stdio.h> void main ( ) { } int a, b, c; int sum; a=1; b=2; c=3; sum =a+b+c; printf ("Összeg: a+b+c = %d\n", sum); Összeg: a+b+c = 6 stdio.h - könyvtári modul Benne: printf() függvény definíciója. Decimális egész formátum 29/155
Kiírás C nyelven (1.) Logikája: printf("helló VILÁG!"); "Szöveg konstans" Formátum printf("összeg: a+b+c = %d", sum); "Szöveg konstans" változó 30/155 elválasztó
Kiírás C nyelven (2.) Formátum printf("összeg: a+b+c = %d\n", sum); "Szöveg konstans" változó elválasztó Sortörés 31/155
Példa 2. Kör területe # include <stdio.h> void main ( ) { } float r, terulet; const float PI=3.14159; r=2.2; terulet = r*r*pi; Tizedes tört formátum: 6 helyen, 2 tizedessel printf ("Az r = %6.2f sugarú kör területe:%10.2f\n", r, terulet); Az r = 2.20 sugarú kör területe: 15.21 32/155
Példa 3. int char # include <stdio.h> void main ( ) { } char kar= A ; char egesz=55; printf ( Karakterek: %c és %c\n,kar, egesz); printf ( Egészek: %d és %d\n,kar, egesz); Karakterek: A és 7 Egészek: 65 és 55 Karakter formátum 33/155
Példa 4. - Túlcsordulás Tárolás 1 bájton, # include <stdio.h> ért. tart: 0.. 255 void main ( ) { unsigned char a, b, s; a=100; b=100; s = a+b; printf("a=%4d, b=%4d, s=%4d\n", a, b, s); a=200; b=200; s = a+b; printf("a=%4d, b=%4d, s=%4d\n", a, b, s); } a= 100, b= 100, c= 200 a= 200, b= 200, c= 144 34/155
Leolvasási sorrend 32 64 128 Kitérő 200 10 =? 2 200 100 50 25 12 6 3 1 0 35/155 0 0 0 1 0 0 1 1 200 10 =11001000 2 11001000 + 11001000 110010000 16 8 4 2 1 1 0 0 1 0 0 0 0 128+16 = 144
Elnevezett konstans deklarálása A C nyelvben nincs külön lehetőség elnevezett konstansok létrehozására. Lehet viszont használni egy olyan fordítónak szóló utasítást, amely hasonló szerepkört tölt be. #define VALAMI 45 Ennek hatására a fordító mindenhova, ahol a forrásprogramban ezután meglátja a VALAMI szót, behelyettesíti a 45-öt. 36/155
Típus deklaráció Új típusok létrehozására szolgál, szintaktikája: typedef típusleírás típusnév; Pl.: typedef int egesz; Létrejött egy egesz nevű új típus, ami teljesen azonos az int típussal. 37/155
A C nyelv elemei Szintaktikai egységek Változók, elemi adattípusok Egyszerű ki- és beviteli utasítások Operátorok Elágazás utasítások Ciklus utasítások Függvények Tömbök Mutatók 38/155
Egyszerű output printf( ) %[-] [n[.m]] [l] x formátum long v. double Balra igazít Helyek, tizedesek 39/155
Egyszerű output A formátum fajtái: c karakter d előjeles egész u előjelnélküli egész o oktális x hexadecimális f tizedes tört e exponenciális s sztring Csak előjel nélküli egészek esetén (unsigned) 40/155
Egyszerű output ESC karakterek: \n új sor \f lapdobás \r kocsi-vissza \t vízszintes tabulálás \v függőleges tabulálás \b backspace \ \ \\ \ \a alarm (cseng) \0 a 0 kódú karakter, ami nincs 41/155
Egyszerű input scanf ( ) A standard inputról végez formázott bevitelt Ugyanazok a formátum elírások, mint a printf-nél A scanf függvénynek a változó címét kell átadnunk, ahová tennie kell a beolvasott értéket a konverzió után a %d és a %f formátummal történ beolvasás esetén! 42/155
Példa 5. Egész, valós, szöveg beolvasás # include <stdio.h> void main ( ) { } int i; float x; char name [50]; scanf ("%d %f %s", &i, &x, name); printf("i=%d, x=%8.2f, name=%s\n", i, x, name); 14 3.5 BitMan i=14, x= 3.50, name: BitMan 43/155
Példa 6. Kör sugara # include <stdio.h> void main ( ) { float r, terulet; const float PI=3.14159; printf("kérem a kör sugarát: "); scanf ("%f", &r); terulet = r*r*pi; printf ("Az r= %6.2f sugarú kör területe:%10.2f \n", r, terulet); } Kérem a kör sugarát: 3.6 Az r= 3.60 sugarú kör területe: 40.72 44/155
Haladó input-output c = getchar(); putchar(c); gets(str); puts(str); Beolvas egy karaktert (c); Kiír egy karaktert Beolvas egy sztringet (str); Előtte deklaráció: char str[20]; Kiír egy sztringet 45/155
A C nyelv elemei Szintaktikai egységek Változók, elemi adattípusok Egyszerű ki- és beviteli utasítások Operátorok Elágazás utasítások Ciklus utasítások Függvények Tömbök Mutatók 46/155
A C nyelv operátorai Aritmetikai operátorok: 47/155 + összeadás - kivonás * szorzás / osztás % modulo = maradék ++ inkrementálás -- dekrementálás Pl. Int a=9, b=2, c, d; c= a/b; d=a%b; Csak egész jellegű változók esetén! a/b= 4 a%b= 1
++, -- operátorok a = a+1 a++ vagy ++a a = a -1 a-- vagy -- a A műveleti sorrend miatt van különbség a kétféle írásmód között: Pl.1: Pl.2: a = 10; a = 10; b = ++a; b = a++; b b= = 11 lesz b b= =10 lesz a a= =11 lesz a a= =11 lesz 48/155
Relációs operátorok < kisebb <= kisebb v. egyenlő > nagyobb >= nagyobb v. egyenlő!= nem egyenlő == egyenlő 49/155
Logikai operátorok &&! AND OR NOT Alt Gr + W Pl.: # include <stdio.h> void main (){ int a=2, b=10, c; if (a<5 && b>5) c=3; else c=8; printf ("Eredmeny: %d \n", c); } Eredmény= 3 50/155
Specialitások a = 2, b = 10, c=a+b; x - = 10; x = x 10; a = b = c*2; # include <stdio.h> void main (){ int a=2, b=10, c=(a<b?a:b); printf ("Eredmény= %d \n", c); } void main(){ 9 / 4 = 2 float a,b; a=9.99; b=4.55; printf("%d / %d = %d\n", (int) a, (int) b, (int) a / (int) b); } 51/155 Eredmény= 2
Specialitások 2. A C nyelv az egészeket használja logikai értékként. A 0 értéket hamisnak tekinti, az ettől eltérő egész értéket igaznak. Pl.: a=1&&3; a=1 a=0&&3; a=0 a=0 3; a=1 a=!5; a=0 A relációk eredménye 0 ha hamis, és 1 ha igaz. Pl.: x=3>1; x=1 x=3<1; x=0 52/155
A C nyelv elemei Szintaktikai egységek Változók, elemi adattípusok Egyszerű ki- és beviteli utasítások Operátorok Elágazás utasítások Ciklus utasítások Függvények Tömbök Mutatók 53/155
Az elágazás utasítások A döntési pontokban végrehajtott utasítások: A döntés kimenetelétől függően a folyamat vagy az egyik, vagy a másik irányban folytatódik. A döntési pont egy feltételt (logikai kifejezés) tartalmaz, melynek igaz vagy hamis eredménye alapján ágaztatjuk el a folyamatot. Feltételes művelet: if utasítás Kétágú elágazás: if else szerkezet Többágú elágazás: switch case szerkezet 54/155
Az if utasítás Egyágú elágazás, a program feltételes elágaztatására szolgál. if (kifejezés) utasítás; vagy: if (kifejezés) { utasítások; } Pl.: Ha a kisebb mint b, felcseréljük a tartalmukat: if (a < b) { t = a; a = b; b = t; } 55/155
Az if else szerkezet if (kifejezés) { igaz ág utasításai; } else { hamis ág utasításai; } Pl.: if (a < b) { x = a; } else { x = b; } Ugyanez feltételes kifejezéssel: x = (a < b? a : b); 56/155
If példa #include <stdio.h> void main() { int a1, a2, a3; printf("kérem az első számot: "); scanf("%d", &a1); printf("kérem a második számot: "); scanf("%d", &a2); printf("kérem a harmadik számot: "); scanf("%d", &a3); 57/155
If példa (folyt) if (a1 > a2 && a1 > a3) } 58/155 else { } printf("a legnagyobb: %d\n", a1); if (a2 > a3) printf("a legnagyobb: %d\n", a2); else printf("a legnagyobb: %d\n", a3); Kérem az első számot: 8 Kérem az első számot: 13 Kérem az első számot: 5 A legnagyobb: 13
A switch case szerkezet # include <stdio.h> void main (){ char k; k = getchar( ); switch(k) { } 59/155 case 'A': printf("alma"); break; case 'B': printf("banán"); break; case 'C': printf("citrom"); break; default : printf ("Érvénytelen parancs!"); } Beolvas 1 karaktert Nem kötelező! Kilép az utasításból C Citrom
A C nyelv elemei Szintaktikai egységek Változók, elemi adattípusok Egyszerű ki- és beviteli utasítások Operátorok Elágazás utasítások Ciklus utasítások Függvények Tömbök Mutatók 60/155
Ciklusszervezés Egy vagy több művelet ismétlését nevezzük ciklusnak. Az ismétlődés addig tart, amíg ezt valamilyen feltétel teljesülése meg nem állítja. Három ciklusképző utasítás van a C-ben: while elöltesztelő for taxatív (számláló) do while hátultesztelő 61/155
while ciklus: while (kifejezés) { ciklusmag } Amíg (a kifejezés igaz) { végrehajtja a ciklusmag utasításait } 62/155
while példa 1. #include <stdio.h> void main ( ){ int a, sum; a=1, sum=0; while (a<=10) { sum=sum+a; a++; } printf ("Az összeg 1-től 10-ig: %d", sum); } Az összeg 1-től 10-ig: 55 63/155
while példa 2. #include <stdio.h> void main ( ) { int a, sum; a=10, sum=0; while (a) { sum=sum+a; a --; } Amíg A értéke nem nulla printf ("Az összeg 1-től 10-ig: %d", sum); } Az összeg 1-től 10-ig: 55 64/155
for ciklus: for (1.kifejezés; 2.kifejezés; 3.kifejezés) { ciklus törzs } int i, s; for (i=1, s=0; i<=10; i++) { s=s+i; } for (i=1, s=0; i<=10; s=s+i,i++){ } for (i=1, s=0; i<=10; s=s+i,i++); 65/155
for példa 1. #include <stdio.h> void main ( ){ int i, s; s = 0; for (i=1; i<=10; i++) { s=s+i; } printf ("Az összeg 1-től 10-ig: %d", s); } Az összeg 1-től 10-ig: 55 66/155
for példa 2. #include <stdio.h> void main ( ){ int i, s; for (i=1, s=0; i<=10; s=s+i,i++); printf ("Az összeg 1-töl 10-ig: %d", s); } Az összeg 1-től 10-ig: 55 67/155
for példa 3. #include <stdio.h> 68/155 void main() { int szam, j; long szorzat; printf( A program egy megadott szám faktoriálisát számolja ki.\n ); } printf( Kérek egy számot: ); scanf( %d, &szam); szorzat = 1; for (j=1; j<=szam; j++) szorzat *= j; printf( %d!=%ld\n, szam, szorzat);
do - while ciklus Mivel hátul tesztelő ciklus, egyszer mindenképpen lefut! do { ciklus törzs } while (kifejezés); 69/155
do while példa #include <stdio.h> void main ( ){ int tipp, szam, kesz; szam=57; kesz=1; do { printf("kérem a tippet: "); scanf ("%d", &tipp); } if (tipp < szam) printf ("A tipp kisebb a számtól!\n"); if (tipp == szam) {kesz=0; printf ("Eltaláltad!");} if (tipp > szam) printf ("A tipp nagyobb a számtól!\n"); } while (kesz); 70/155 Kérem a tippet: 49 A tipp kisebb a számtól! Kérem a tippet: 63 A tipp nagyobb a számtól! Kérem a tippet: 57 Eltaláltad!
do while példa v2. #include <stdio.h> #include <stdlib.h> #include <time.h> int main ( ){ Véletlen szám: 0.. 32767 között int tipp, szam, kesz=1; srand(time(null)); szam=rand(); szam=rand()/327; do { printf("kérem a tippet: "); scanf ("%d", &tipp); if (tipp < szam) printf ("A tipp kisebb a számtól!\n"); if (tipp == szam) {kesz=0; printf ("Eltaláltad!");} if (tipp > szam) printf ("A tipp nagyobb a számtól!\n"); } while (kesz); return 0; } 71/155
A C nyelv elemei Szintaktikai egységek Változók, elemi adattípusok Egyszerű ki- és beviteli utasítások Operátorok Elágazás utasítások Ciklus utasítások Függvények Tömbök Mutatók 72/155
Függvények Jellegzetességek a C nyelvben: A függvények és eljárások szintaktikája nem különbözik, azaz csak függvények léteznek, a void visszatérési érték típussal jelezzük, ha nem akarunk visszaadni értéket. Nem lehet definiálni függvényt egy másik függvény belsejében. Bármelyik függvény meghívhatja bármelyik függvényt, még saját magát is (rekurzív hívás), vagy akár a main függvényt is. A program belépési pontja a main függvény. Visszatérési érték és paraméter nem lehet tömb, struktúra, union, lehet viszont ezekre mutató mutató. 73/155
Függvények 2. Szintaktika: típus fgvnev(paraméterek) { utasítások; return visszatérő_érték; } Pl.: double dszhterulet(double x, double y) { return x*y/2; } 74/155
Függvények 3. Paraméterátadás: Csak értékszerinti paraméterátadás létezik, tehát paraméterek csak akkor tudnak eredményt visszaadni, ha mutatót használunk (referencia típus nincs). Szintaktikája: 75/155 típus név(típus param1, típus param2, ) Nem lehetséges az azonos típusú paraméterek összevonása, mint más nyelvekben: típus név(típus param1, param2) //hibás!! A paraméter nélküli függvények esetén is ki kell tenni a zárójeleket: típus név()
Függvények 4. A függvény meghívása: A void függvények csak önálló utasításként hívhatók meg. Az egyéb visszatérési értékű függvények meghívhatók önálló utasításként is, és kifejezés belsejében is. Szintaktikája: 76/155 fgvnev(kif1, kif2, ); Ahol kif1, kif2, stb. kifejezések az aktuális paraméterek. Mivel az aktuális paraméterek értékei adódnak át rendre a formális paramétereknek (param1=kif1, param2=kif2, ), ezért ezek típusa olyan kell legyen, hogy az értékátadás megtörténhessen (automatikus típuskonverziók!).
Függvények 5. (példa) # include <stdio.h> double dszhterulet(double x, double y) { return x*y/2; } void main (){ int a=3, b=5; double t; t= dszhterulet(a,b); } printf ("Terület = %6.2f\n", t); Terület = 7.50 Formális paraméterek Aktuális paraméterek 77/155
Függvények 6. (példa) Készítsen egy függvényt, amely kap egy egész számot és visszaadja a szám faktoriálisát. long fakt(int a) { long szorzat; int j; for (j=1; j<=a; j++) szorzat *= j; return szorzat; } 78/155
Függvények 7. (példa) Készítsen egy függvényt, amely három oldalhosszúságról megállapítja, alkothatnak-e háromszöget! int alkothate(double a, double b, double c) { if (a+b<=c a+c<=b b+c<=a) return 0; return 1; } 79/155
Függvények 8. (példa) Készítsen egy függvényt, amely kiír egy egész számot! Olyan függvény, amely nem ad vissza paramétert (eljárás), ezért visszatérő értéke: void. #include<stdio.h> void kiir(int a); int main() { kiir(10); } void kiir(int x) { printf( %d,x); } 80/155 //Deklarálás //A függvény hívása //Definiálás
Néhány hasznos függvény int abs(int x); long labs(long x); doube fabs(double x); double floor(double x); double ceil(double x); double pow(double x, double y); x y double sqrt(double x); x abszolút értéke Lefelé kerekít egészre Fölfelé kerekít egészre x négyzetgyöke Egy hasznos konstans: PI <math.h> M_PI 81/155
A C nyelv elemei Szintaktikai egységek Változók, elemi adattípusok Egyszerű ki- és beviteli utasítások Operátorok Elágazás utasítások Ciklus utasítások Függvények Tömbök Mutatók 82/155
Tömbök A tömb: Azonos tulajdonságú elemek halmaza. Statikus: meg kell adni az elemek számát. Tömbelemek típusa: Elemi (egyszerű) tíusok, Összetett, A felhasználó által deklarált. Tömb definiálása: int A [10]; 83/155 Típus Azonosító Elemszám A tömb indexe: 0-tól elemszám-1-ig megy A[0] A[9]
Tömbök 2. A tömb bármely elemére a tömb nevével, és az index megadásával hivatkozhatunk. Az index tetszőleges egész jellegű: (fixpontos) kifejezés! int tomb [10]; egydimenziós tömb: vektor. Kétdimenziós tömb: int tomb[10][20]; A kétdimenziós tömb a mátrix, az első méret a sorok (10), a második az oszlopok (20) száma. Több (n) dimenziós tömb általános definíciója: típus név [dim1] [dim2] [dimn]; 84/155
Tömbök 3. Mivel a változók definiálásakor helyfoglalás történik, a tömbindexek mindegyikének fordítási időben ismertnek kell lenni!!! Bármilyen tömb esetében az elemek folyamatosan helyezkednek el a memóriában. Kétdimenziós tömbök esetében az első sor elemei után következnek a második sor elemei, stb. int t [2] [3]; // Ennek a tömbnek 6 eleme van: 2*3 85/155 t [0] [0] t [0] [1] t [0] [2] t [1] [0] t [1] [1] t[1] [2] A fordító csak akkor ellenőrzi, hogy átléptük-e a maximális indexet, ha konstansként adtuk meg, futtatás közben nincs ellenőrzés!
Tömbök 4. Deklarálás: int tomb [10 ] = { 1,2,3,4,5,6,7,8,9,10 }; vagy: int tomb [ ] = { 1,2,3,4,5,6,7,8,9,10 }; int tomb [2] [5] = { 1,2,3,4,5,6,7,8,9,10 }; Itt a mátrix első sorában az elemek: 1 2 3 4 5 A második sorában pedig: 6 7 8 9 10 int tomb[ ] [4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} }; int tomb[ ] [4] = {1,2,3,4,5,6,7,8,9,10,11,12 }; 86/155
Tömb példa 1. #include <stdio.h> #define meret 5 main() { double tomb[meret]; double atlag = 0; int i; for (i=0; i<meret; i++) { printf("\n tomb[%d] = ", i); scanf("%lf", &tomb[i]); atlag += tomb[i]; } 87/155
Tömb példa 1. (folyt.) } atlag = atlag/meret; printf("\n Az átlag: %lf\n\n", atlag); for (i=0; i<meret; i++) printf("%d. elem \t %lf \t eltérés: %lf\n", i, tomb[i], atlag-tomb[i]); 88/155
Tömb példa 1. Futtatás tomb[0] = 12 tomb[1] = 25 tomb[2] = 65 tomb[3] = 43 tomb[4] = 32 Az átlag: 35.400000 0. elem 12.00000 eltérés: 23.400000 1. elem 25.00000 eltérés: 10.400000 2. elem 65.00000 eltérés: -29.600000 3. elem 43.00000 eltérés: -7.600000 4. elem 32.00000 eltérés: 3.400000 89/155
Tömb példa 2. #include <stdio.h> N, és N elemű A[ ] tömb main() { beolvasása, elemek int A[20]; kiíratása int i, n; printf("\nelemek száma? (max 20!) = "); scanf("%d", &n); for (i=0; i<n; i++){ printf("\n Elem[%d] = ", i); scanf("%d", &A[i]); } for (i=0; i<n; i++) printf("%d. elem \t %d \t \n", i, A[i]); } 90/155
Karaktertömbök, sztringek Mivel szöveges adattípus nincs, ezért a szövegeket karakter tömbökben tárolhatjuk. Azt, hogy a tömb meddig van feltöltve azt egy végére berakott nulla kódú karakter jelzi ( \0 ). Azok a függvények, amelyek karaktertömbökön végeznek műveleteket, a záró karakterből tudják meddig tart a szöveg. char str0[4] = { 'a','b','c','d' }; 91/155 Ez nem sztring, csak egy karakteres tömb, mert nincs záró 0! printf( A szöveg: %s\n, str0); Ha a záró karaktert nem adjuk meg a printf függvény egészen addig írja ki a memória tartalmát, amíg egy záró karaktert nem talál.
Karaktertömbök, sztringek 2. Ha nem aposztrófokat, hanem idézőjeleket használunk, akkor a fordító megpróbál sztringet létrehozni, azaz a záró 0 értéket elhelyezni az utolsó karakter után: char str1[4] = "abcd"; nem tud, ezért ez nem sztring! char str2[5] = "abcd"; elfér a záró 0, ezért ez sztring! char str3[ ] = "abcd"; elfér a záró 0, ezért ez sztring! char * str4[ ] = "abcd"; Így is megadható a sztring! 92/155
Sztring példa #include <stdio.h> typedef char str[21]; main(){ } int i; 93/155 str A[10]; strcpy(a[0], "BitMan"); strcpy(a[1], "SuperMan"); strcpy(a[2], "BatMan"); for (i=0; i<3; i++) puts(a[i]); BitMan SuperMan BatMan str max. 20 karakter hosszú sztring típus A 10 elemű str típusú sztring tömb strcpy értékadás sztringnek puts sztring kiírása
Sztring példa 2. #include <stdio.h> typedef char nev[20]; main(){ int i=0, kesz=1, n; nev benev, A[10]; gets sztring beolvasása strlen sztring hossza do { printf("kérem a nevet: "); gets(benev); if (strlen(benev)) { strcpy(a[i], benev); i++; } else kesz=0; } while (kesz); n=i; for (i=0; i<n; i++) puts(a[i]); } Feladat: Nevek beolvasása üres Enter lenyomásáig. 94/155
Sztringkezelő függvények #include <stdio.h> main(){ int d; char str1[ ]="retek", str2[ ]="alma"; d= strcmp(str1, str2); printf ("Eredmény = %d \n", d); } strcmp ABC sorrend str1 < str2 d= -1 str1 = str2 d= 0 str1 > str2 d= 1 Eredmény = 1 95/155
Sztringkezelő függvények 2. #include <stdio.h> main(){ char str1[ ]="alma", str2[ ]="mag"; strcat(str1, str2); printf ("Eredmény = %s \n", str1); } strcat str2 hozzáfűzése str1-hez Eredmény = almamag 96/155
Sztringkezelő függvények 3. #include <stdio.h> main(){ int d=0; char *k, *m; char str1[ ]="almahej", str2[ ]="he"; k=&str1[0]; m= strstr(str1, str2); if (m==null) printf ("Eredmeny = NULL"); else { } } 97/155 d=m-k; printf ("Eredmeny = %d \n", d); Mutatók: következő fejezet! strstr str2 keresése str1-ben. m: a megtalált pozíció mutatója, vagy NULL Eredmény = 4
Sztringkezelés #include <stdio.h> void megfordit(char * s){ char * p=s; while(*p++); for(p-=2;p>s;p--,s++){char c=*p;*p=*s;*s=c;} } main(){ char s[ ]="almamag"; megfordit(s); puts(s); } 98/155 Feladat: Sztring tartalmának megfordítása. Mutatók: következő fejezet! gamamla
A C nyelv elemei Szintaktikai egységek Változók, elemi adattípusok Egyszerű ki- és beviteli utasítások Operátorok Elágazás utasítások Ciklus utasítások Függvények Tömbök Mutatók 99/155
Mutatók A mutató olyan változó, amely értéke egy memóriacím. Léteznek operátorok, amelyekkel a mutató által mutatott memóriaterületen levő adatot lehet elérni. A mutatónak ugyanolyan fontos adata a típusa, mint egy közönséges változónak. A mutató típusa a mutatott terület típusát jelenti. Mutató deklarációja: típus *változónév; Pl.: int *m; 100/155
Mutatók 2. Értékadás mutatónak: Egy meglévő területünk címét adjuk értékül a mutatónak: int a; //definiálunk egy változót (lefoglalódik neki egy memóriaterület, de értéke még nincs!) int *m; //definiálunk egy mutatót (lefoglalódik neki egy memóriaterület, értéke még nincs, azaz nem mutat sehova!) m=&a; //értéket adunk a mutatónak, értéke az a címe lesz ( & címképző operátor) 101/155
Mutatók 3. Hivatkozás a mutatott területre: A mutatott területre a mutató segítségével is tudunk hivatkozni. Erre szolgál az indirekciós operátor. Pl.: int a = 10; int *m; m=&a; printf( Az a változó értéke: %d, *m); *m=*m+1; printf( Az a változó értéke: %d, a); 102/155 Az a változó értéke: 10 Az a változó értéke: 11
Mutatók 4. Hivatkozás a mutatott területre: Nagyon veszélyes hibát eredményezhet, ha olyan mutató esetén használjuk az indirekciós operátort, amely még nem kapott értéket, azaz nem mutat sehová. A lenti két utasítással egy véletlenszerű memóriaterület tartalmát írtuk át. int *m; *m=34; 103/155
Mutatók 5. Mutató-matek: A mutatókhoz hozzá lehet adni egy egész számot, vagy ki lehet vonni egy egész számot belőle. Pl.: int a[10]; int *b; int c; b=&a[0]; c=*b; c=*(b+4); b=b+2; c=*b; b most az a[0]-ra mutat c változó a[0] értékét veszi fel c változó a[4] értékét veszi fel b most az a[2]-re mutat c változó a[2] értékét veszi fel 104/155
Témakörök A C nyelv jellemzői A C nyelvű program szerkezete A C nyelv elemei Algoritmusok C nyelven Feladat ötletek Ellenőrző kérdések 105/155
Algoritmusok C nyelven Összegzés Megszámlálás Kiválasztás Kiválasztásos rendezés 106/155
Összegzés Be kell olvasni N-darab számot, és meg kell határozni a beolvasott számsorozat összegét. Megoldás: Egy változó értékét beállítjuk 0-ra (kinullázzuk) Ciklus segítségével végigmegyünk a sorozat elemein, és a kinullázott változóhoz rendre hozzáadjuk a sorozat aktuális elemét. Az eredmény az eredetileg kinullázott változó aktuális értéke. 107/155
Összegzés #include <stdio.h> main() { int A[20]; int i, n; printf("\nelemek száma? (max 20!) = "); scanf("%d", &n); for (i=0; i<n; i++){ printf("\n Elem[%d] = ", i); scanf("%d", &A[i]); } int s=0; for (i=0; i<n; i++) s=s+a[i]; printf("\n Az elemek összege = %d", s); } 108/155
Algoritmusok C nyelven Összegzés Megszámlálás Kiválasztás Kiválasztásos rendezés 109/155
Megszámlálás Feladat: Adott egy tömb, határozzuk meg, hogy egy adott feltételnek hány elem felel meg. Megoldás: Kinullázok egy változót. Ciklus segítségével végigmegyek a tömb elemein. Megvizsgálom őket, és ha a tömbelem a feltételnek megfelel, a kinullázott változóhoz hozzáadok egyet. Az eredmény az eredetileg kinullázott változó aktuális értéke. Konkrét feladat: Határozzuk meg, hogy az N-elemű A tömb elemei közül hánynak az értéke kisebb mint 25. Az eredményt írassuk ki. 110/155
Megszámlálás #include <stdio.h> main() { int A[20]; int i, n; printf("\nelemek száma? (max 20!) = "); scanf("%d", &n); for (i=0; i<n; i++){ printf("\n Elem[%d] = ", i); scanf("%d", &A[i]); } int db=0; for (i=0; i<n; i++) if (A[i] < 25) db=db+1; printf("\n A megfelelő (< 25) elemek száma = %d", db); } 111/155
Algoritmusok C nyelven Összegzés Megszámlálás Kiválasztás Kiválasztásos rendezés 112/155
Kiválasztás (min, max keresés) Feladat: Adott egy tömb, határozzuk meg a legkisebb (legnagyobb) elemét. 113/155 Megoldás: Egy változóba (MIN) berakom a tömb első elemének az értékét. Ezután a 2. elemtől kezdve egy ciklussal végignézem a tömb elemeit, és ha a vizsgált elem kisebb a MINértékénél, akkor berakom az értékét a MIN-változóba. Így a MIN-értéke az addig megvizsgált elemek közül mindig a legkisebbet tartalmazza. Eredmény: a MIN változó értéke. Konkrét feladat: Adott egy N-elemű A-tömb. Határozzuk meg a legkisebb elemét.
Kiválasztás #include <stdio.h> main() { int A[20]; int i, n; printf("\nelemek száma? (max 20!) = "); scanf("%d", &n); for (i=0; i<n; i++){ printf("\n Elem[%d] = ", i); scanf("%d", &A[i]); } int min=a[0]; for (i=1; i<n; i++) if (A[i] < min) min=a[i]; printf("\n A megfelelő (legkisebb) elem = %d", min); } 114/155
Algoritmusok C nyelven Összegzés Megszámlálás Kiválasztás Kiválasztásos rendezés 115/155
Kiválasztásos rendezés Feladat: Adott egy tömb, rendezzük az elemeit növekvő (vagy csökkenő) sorrendbe. Módszer: Keressük ki a legkisebb elemet, és tegyük azt a tömb első helyére. Lépjünk egy hellyel odébb (második elem), és keressük ki a maradék elemek közül a legkisebbet. Tegyük ezt a második helyre. Lépjünk eggyel odébb, 116/155
Kiválasztásos rendezés #include <stdio.h> main() { int A[20]; int i, n, j, c; printf("\nelemek száma? (max 20!) = "); scanf("%d", &n); for (i=0; i<n; i++){ printf("\n Elem[%d] = ", i); scanf("%d", &A[i]); } for (i=0; i<n-1; i++) for (j=i+1; j<n; j++) if (A[j] < A[i]) {c = A[i]; A[i]= A[j]; A[j]= c;} for (i=0; i<n; i++) printf("%d. elem \t %d \t \n", i, A[i]); } 117/155
118/155 Gratulálok! Ön átvette a tananyagot!
Témakörök A C nyelv jellemzői A C nyelvű program szerkezete A C nyelv elemei Algoritmusok C nyelven Feladat ötletek Ellenőrző kérdések 119/155
Feladat ötletek Olvassa be N-értékét, és határozza meg 0 és N között a számok összegét. Olvassa be N és M-értékét, és határozza meg N és M között a számok összegét. Olvasson be N egész számot egy tömbbe, és határozza meg a páros számok darabszámát. Olvasson be N egész számot egy tömbbe, és határozza meg, hány szám esik 10 és 20 közé. Olvasson be N egész számot egy tömbbe, számítsa ki, és helyezze el a számok 20%-át egy másik tömbbe. 120/155
Feladat ötletek Olvasson be N egész számot egy tömbbe, és írja ki beolvasási sorrendben, és fordított sorrendben (visszafelé) is a számokat. Olvasson be N egész számot egy tömbbe, és olvasson be külön egy egész számot. Határozza meg, és írassa ki az egész számtól legkevésbé eltérő tömbelemet. Olvasson be két egyforma elemszámú egész tömbbe számokat, és írassa ki rendre az elempárok szorzatát. (1.elem*1.elem, ) 121/155
Feladat ötletek Olvasson be két egyforma elemszámú egész tömbbe számokat. Rendezze az első tömböt növekvő, a másodikat csökkenő sorrendbe, aztán írassa ki mindkét tömb elemeit. Pistike csigát gyűjt. Készítsen olyan programot, melyben beolvassa egy tömbbe az összegyűjtött csigák súlyát, meghatározza, és kiírja a csigák átlagsúlyát, valamint a legkönnyebb és legnehezebb csiga súlyát. 122/155
123/155
Feladatosz ötletosz Los denevérosz példosz: Beolvasszosz denevérosz névosz tömbosz. Beolvasszosz denevérosz repülosz dzsípíesszosz koordinátosz mászik tömbosz. Programosz alkotosz: 124/155 Számítosz távolszágosz függvényosz (denevérosz repülosz légvonalosz!) Kiírosz denevérosz névosz, repülosz távolszágosz. Kiírosz statisztikosz: Átlagosz távolszágosz, Minimálosz távolszágosz lusztaszágosz névosz, Maximálosz távolszágosz rekorderosz névosz, Endosz programosz. Lajosz Bélosz x,y 0,0 x,y
Műszaki informatika Ellenőrző kérdések 125/155
Ellenőrző kérdések 1. 1. Melyik szimbólumot használjuk a kommenthez? A: <!-- B: // C: # D:!! 2. Melyik kulcsszóval illesztjük be a könyvtári modulokat? A: #read <fájl> B: #get <fájl> C: #include <fájl> D: #pre <fájl> 126/155
Ellenőrző kérdések 2. 3. Melyik szimbólummal jelezzük a blokkhatárokat? A: [utasítások ] B: (utasítások ) C: <utasítások > D: {utasítások } 4. Melyik könyvtári modulban van a printf() függvény? A: stdlib.h B: stdio.h C: stdlib.c D: stdio.c 127/155
Ellenőrző kérdések 3. 5. Melyik a kakukktojás? A: > B: < C: >= D: = 6. Melyik szimbólummal kell mutatót deklarálni? A: & B: @ C: * D: $ 7. Hány bájton tárolódik a Pistike sztring? 8. Melyik ciklus utasítás nem használható a C nyelvben? A: For B: While C: Do while D: Repeat until 128/155
Ellenőrző kérdések 4. 9. Melyik nem C típus? A: float B: real C: int D: boolean 10. Melyik operátort használjuk összehasonlításra? A: := B: = C: equal D: == 11. Mennyi a!(1 &&!(0 1)) kifejezés értéke? 12. Hányszor fut le garantáltan a do while ciklus? A: 0 B: 1 C: Végtelenszer D: Feltételtől függ 129/155
Ellenőrző kérdések 5. 13. Mennyi lesz x-értéke a ciklusból kilépve? for(x=0; x<10; x++) { } x= 14. Melyik függvény hívás helyes? A: fgv; B: fgv x,y; C: fgv(); D: int fgv(); 15. Melyik a helyes tömb deklaráció? A: int tomb[10]; B: int tomb; C: int tomb{10}; D: int tomb(10); 16. Egy 15 elemű tömb esetén mennyi az utolsó elem indexe? 130/155
Ellenőrző kérdések 6. 17. Változó deklarációhoz melyik könyvtári modult 131/155 kell használni? A: stdio.h B: math.h C: stdlib.h D: Egyiket sem 18. Melyik kifejezés egyenértékű a!(a < b) kifejezéssel? A: a < b B: a = b C: a > b D: a>= b 19. Mennyi lesz az értéke az a változónak az alábbi programrészlet végrehajtása után? int a, b = 0; a=++b; a*=b++; a=
Ellenőrző kérdések 7. 20. A C nyelvű programban milyen szimbólumok jelzik az alábbiakat? A: Utasítások vége B: Blokkhatárok C: Megjegyzések D: Tömb elemszám E: Kiírási formátum F: ESC karakter 21. Melyik szimbólum képzi egy változó címét? A: & B: @ C: * D: $ 132/155
Ellenőrző kérdések 8. 22. Mennyi lesz az értéke az A és a B változónak A= B= 133/155 az alábbi programrészlet végrehajtása után? A=2; B=++A; 23. Melyik nem lehet változó azonosítója az alábbiak közül? A: Double D: szamok G: Pici%Maci B: #inc E: ertek H: 97_es_adatok C: ide-oda F: do I: Bony&Clide
Ellenőrző kérdések 9. 24. Az int *jack; utasítás A: deklarálja, hogy jack int típusú változó. B: deklarálja, hogy jack int típusú mutató. C: definiálja, hogy jack int típusú változó. D: definiálja, hogy jack int típusú mutató. 25. Melyik utasítást kell alkalmazni egy egész szám kiírására? A: printf ("Eredmény: %e\n", eredm); B: printf ("Eredmény: %d\n", eredm); C: printf ("Eredmény: %f\n", eredm); D: printf ("Eredmény: %c\n", eredm); 134/155
Ellenőrző kérdések 10. 26. Mennyi legyen az a változó értéke, hogy a ciklus 5-ször fusson le? a= ; while (a) { sum=sum+a; a --; } 27. Jelölje meg a szintaktikailag helyes utasításokat! A: for (i=1; i<=10; i++) { s=s+i; } B: for (i:=1, i<=10, i++) { s=s+i; } C: for (i=1, s=0; i<=10; s=s+i,i++); D: for (i=1; s=0; i<=10; s=s+i;i++){ } 135/155
Ellenőrző kérdések 11. 28. Tegye megfelelő sorrendbe a C program sorait! A: main() B: } C: direktívák D: { E: utasítások 29. A C nyelvben a short típus 256 féle egész értéket vehet fel. Milyen tartományban használható az a változó az alábbi deklarációk esetén: A: short a; B: unsigned short a; 136/155
Ellenőrző kérdések 12. 30. Kövesse az alábbi programrészlet működését, 137/155 írja le az egyes lépésekben a változók kiírt értékét! int x=0, y=1, z=x+y; while (z<=5) { if (x<5) {z=x+z; x++;} else {z=y+z; y++;} printf ("\nx= %d y= %d z=%d",x,y,z); } 1. kiírás: 2. kiírás: 3. kiírás: 4. kiírás: 5. kiírás: x y z
Ellenőrző kérdések 13. 31. Igaz vagy Hamis az állítás? A C nyelvben a CHAR típus lehet karakter és egész típus is. A számítógép közvetlenül a C nyelvű utasításokat hajtja végre. 138/155 A C nyelvben az and operátort &&-al jelöljük. A float, a double és a short lebegőpontos adattípusok a C nyelvben. A C programozási nyelv kis-nagybetű érzékeny. A %d dupla pontosságú lebegőpontos formátum. A while(12) printf("*"); utasítás végtelen ciklust eredményez. Az a= ++b--; utasítás nem hibás, de semmi értelme!
Ellenőrző kérdések 14. 32. Melyik függvény deklaráció helyes? A: int funct(); B: int funct(int x) {return x=x+1;} C: void funct(int) { printf( "Hello")}; D: void funct(x) { printf( "Hello"); }; 33. Mit ír ki az alábbi programrészlet? int x=1, y, z=(x=28, y=x+3); printf("%d", z); z= 34. Mennyi lesz b értéke? int a = 19, b = 13; 139/155 if (b = a) b = 9; b=
Ellenőrző kérdések 15. 35. Mit ír ki az alábbi programrészlet? int a = 0; if (a = 0) printf("0"); else printf("nem 0"); A: 0 B: nem 0 36. Mit ír ki az alábbi programrészlet? printf("%d", 2<3); A: 2<3 B: 0 C: 1 D: Hibás utasítás! 37. Helyes-e az alábbi változódefiníció? int double=1; A: Igen B: Nem 38. Mennyi 14 % 3 értéke? 140/155
Ellenőrző kérdések 16. 39. Mit ír ki a következő program részlet? int x=0; switch(x) { case 1: printf("egy" ); case 0: printf("nulla" ); case 2: printf("kettő" ); } A: Egy B: Nulla C: Kettő D: NullaKettő 40. Mit ír ki az alábbi programrészlet? int a; printf("%d", a); A: 0 B: a C: Véletlen értéket 141/155
Ellenőrző kérdések 17. 41. Van különbség az a=b++; és az a=++b; 142/155 kifejezések között? A: Nincs B: Az a-ra nézve igen, a b-re nézve nem. C: A b-re nézve igen, az a-ra nézve nem. D: Igen, mindkét változóra nézve. 42. Mennyi lesz az értéke az i változónak az alábbi programrészlet végrehajtása után? i = 1; i *= 5; i += 3; i=
Ellenőrző kérdések 18. 43. Melyik kifejezés helyes a 143/155 ha i nem nulla feltétel megfogalmazására? A: if (i =!0) B: if (i == 0) C: if (i!= 0) D: if (i NOT= 0) 44. Helyes az if( a > 0 ) then b= 5; utasítás? A: Nem B: Igen 45. Mennyi lesz az értéke a b változónak az alábbi programrészlet végrehajtása után? a, b = 1; if (a = 1) b = 3; if (a = 2) b = 5; b=
Ellenőrző kérdések 19. 46. Mit ír ki az alábbi programrészlet? int a=2, b=6, c=2; if (a < b < c) printf("növekvő"); else printf("csökkenő"); A: Növekvő B: Csökkenő C: Hibaüzenetet, az (a < b < c) kifejezés hibás! 47. Mi az eredménye az alábbi programrészletnek? int a, b = 1; a=a++ + ++b; a*=b++; A: a=6, b=2; B: a=8, b=3; C: a=10, b=3; D: Hibaüzenetet, az a=a++ + ++b; utasítás hibás! 144/155
Ellenőrző kérdések 20. 48. Mi az eredménye az alábbi kódrészletnek? int a = 7, b = 5, c = 3; c += ++a - b++; printf("%d", c); c= 49. Mennyi lesz b értéke? int a = 19, b = 13; if (b == a) b = 9; b= 50. Mennyi lesz b értéke? int a = 19, b = 13; 145/155 if (b = a) b += a; b=
Ellenőrző kérdések 21. 51. Javítsa ki a hibákat az alábbi programban! #include <stdio.h> #DEFINE MAXELEM 10 int main(void) { int ertekek[maxelem]; int min; int i; 146/155 52. Írja le, hogy mit csinál a kijavított program! for (i = 0; i < MAXELEM;) scanf("%d",&ertekek[i++]); min = ertekek(0); For (i=1; i<maxelem; i++) if ertekek[i] < min then min = ertekek[i]; printf('min értéke: %d\n', min); return 0 }
Ellenőrző kérdések 22. 53. Javítsa ki a hibákat az alábbi programban! 147/155 #include <stdio.h> main() { int max. int i; int ertekek[10]; for (i=0; i<10; i++) scanf('%d',ertekek+i); max = ertekek(0); for (i=l i<10; i++) if (ertekek[i] > max) max = ertekek[i]; } 54. Írja le, hogy mit csinál a kijavított program!
Ellenőrző kérdések 23. 55. Javítsa ki a hibákat az alábbi programban! } 148/155 #include <stdio.h> main () { int darab = 10; int ertekek(10); Double atlag; for (i = 0; i < 10;) ertekek[i++] = 3*i+1; atlag = 0; for (i=0; i<10; i++) atlag += ertekek[i]; atlag = atlag / darab; printf('átlag értéke: %d\n',atlag); 56. Írja le, hogy mit csinál a kijavított program!
Ellenőrző kérdések 24. 57. Mi lesz a t tömb tartalma az alábbi utasítások végrehajtása után? int j,k; int t[7]; for (j=0; j<7; j++) t[j] = j; k = 6; for (j=0; j < k; j++,k--) t[j] = t[k]; t= 58. Hányszor fut le az 57. kérdésben szereplő ciklusutasítás magja? A: háromszor B: négyszer C: ötször D: hatszor 149/155
Ellenőrző kérdések 25. 59. Írja át az alábbi ciklusutasítást a while utasítás használatával: 150/155 for ( j=0, k=6; j < k; ) t[j++] = t[k--]; 60. Mennyi lesz z értéke az alábbi programrészlet végrehajtása után? int z=1; int i; for (i = 1; i < 5; i++) z += i; z= 61. Helyes az állítás? A balérték csak értékadó operátor bal oldalán állhat. A: Igen B: Nem
Ellenőrző kérdések 26. 62. Az alábbi programrészletet a fordító hibátlannak találja, de hibásan fut. Mi a hiba? int i; double tomb[10]; for (i=0; i <= 10; ) tomb[i++] = 0; 63. Írja át az alábbi kifejezést if utasítás használatával: i = j < 0? j : j; 64. Írja át az alábbi ciklusutasítást a while utasítás használatával: for (j=0; j < 10; j++ ) t[j] = j; 151/155
Ellenőrző kérdések 27. 65. Mennyi lesz z értéke az alábbi programrészlet végrehajtása után? int z=1; int i; for (i = 1; i < 8; i += 2) z *= i; z= 66. Írja be a megadott kockákba az alábbi programrészlet hatására kiírt szöveget! int tomb[10]; int j = 3; tomb[j] = 7.3; printf ("\ntomb[%d]=%d\n",j,tomb[j]); 152/155
Ellenőrző kérdések 28. 67. Kövesse az alábbi programrészlet működését, 153/155 írja le az egyes lépésekben a változók kiírt értékét! int x=0, y=1, z=x+y; while (z<=5) { } if (z%2!=0) {z=y+z; y++;} else {z=x+z; x++;} printf ("\nx= %d y= %d z=%d",x,y,z); 1. kiírás: 2. kiírás: 3. kiírás: 4. kiírás: 5. kiírás: x y z
Felhasznált irodalom Knuth, D.E: A számítógép-programozás művészete 1-3, Műszaki Könyvkiadó, Budapest, 1987-88. Brian W. Kernighan Dennis M. Ritchie: A C programozási nyelv, Műszaki Könyvkiadó, 1988 Wirth, N: Algoritmusok + Adatstruktúrák = Programok, Műszaki Könyvkiadó, Budapest, 1982 Benkő László Benkő Tiborné Tóth Bertalan: Programozzunk C nyelven, Computerbooks, 2008 Elek Tibor: A C programozási nyelv, elektronikus jegyzet Ficsor Lajos: Bevezetés a C programozási nyelvbe, elektronikus jegyzet 154/155
VÉGE V É G E 155/155