c++eavazlat-1
TRANSCRIPT
-
7/26/2019 C++eavazlat-1
1/196
GBOR DNES
FISKOLA
PREZENTCI
A C++ nyelv (146)
Vezettanr: goston Gyrgy
2004/2005 192 lap5. szemeszter
-
7/26/2019 C++eavazlat-1
2/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 1461. oldal
A vezettanr:
goston Gyrgytel: (1) 436-6556
e-mail: [email protected]
A GDF hivatalos honlapja:www.gdf.hu
-
7/26/2019 C++eavazlat-1
3/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 1462. oldal
SegdanyagokTantrgyi tmutat, tanknyv, prezentci, videofilm (2 kazetta: a
C nyelv s a C++ nyelv), pldaprogramok (a gyakorlatok s a vide-ofilm anyaga) fjlban.
Kvetelmny: egy ktelezzrthelyi.
Jegy megszerzse: vizsgn vlaszthat nehzsg program rsa(mdostsa) vagyotthon elksztett feladat bemutatsa.
A prezentci felptse:
1. A C nyelv2. A C++ nyelv
-
7/26/2019 C++eavazlat-1
4/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 1463. oldal
BevezetsA C nyelv rvid trtnete
1969: UNIX opercis rendszer, Bell Laboratories 1970-74: Dennis Ritchie megtervezi a C nyelvet, s a UNIX-ot t-
rjk C-re (
BCPL 1963, B nyelv 1970).
1978, 1988: Kernighan&Ritchie: The C Programming Language Azta a C npszer, hordozhat nyelv. Az ANSI C szabvnynak
(1989) minden modern C fordt megfelel, gy a C programnincs gphez s opercis rendszerhez ktve.
1980-as vek vge: naz n. objektum-orientlt szemllet np-szersge, megjelennek a C nyelv OO kiterjesztsei: C++,Objective C.
-
7/26/2019 C++eavazlat-1
5/196
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 1464. oldal
Informatikai RendszerekIntzete
Nhny C fejlesztikrnyezet
-
7/26/2019 C++eavazlat-1
6/196
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 1465. oldal
Informatikai RendszerekIntzete
A C elnyei ANSI C, UNIX C, Turbo C
Szabvnyos, ezrt hordozhat program rhat vele;
Npszer
sge miatt minden gpre s rendszerre l-tezik C-fordt (ez sok ms j nyelvre nem igaz); Tmogatja a modulris programozst, s gy a nagy
programok csapatmunkban val ellltst; A tiszta, fegyelmezett programozsi stlus s a ru-
galmassg szerencss tvzett nyjtja, de a ru-galmassgbl addan knny vele ttekinthetet-
len, mdosthatatlan, rejtlyes hibktl hemzsegprogramot rni!
-
7/26/2019 C++eavazlat-1
7/196
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 1466. oldal
Informatikai RendszerekIntzete
jsghirdetsek, 1999.
Elektronikus hirdets (2000. nyr,www.vbuster.hu)
-
7/26/2019 C++eavazlat-1
8/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 1467. oldal
A C program alapszerkezete
/* C alapprogram */
#include
int main(void){printf("Hell vilg!\n");
return 0;}
-
7/26/2019 C++eavazlat-1
9/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 1468. oldal
Szkzk s res sorok szabadon elhelyezhetk, gy ta-golhat a programszveg.
A kulcsszavak ktelezen kisbetsek!
Az utastsok vgn ;szerepel. Megjegyzsek /*s */kz rhatk, akr tbb sorban is. A fprogram szerkezete:
int main(void){vltozdeklarcik;
utastsok;
return 0;}
-
7/26/2019 C++eavazlat-1
10/196
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 1469. oldal
Informatikai RendszerekIntzete
Az alapvetvltoztpusok(rvid ttekints)
egsz:int i,j,k;
i=1; j=-5;lebegpontos:float f,g;
f=1.234;g=-4e4;karakter:char c,d;
c='A'; d='\n';pointer (mutat):
int *p;p=&i;string:
char s[21];char *t;t="Szveg";
-
7/26/2019 C++eavazlat-1
11/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14610. oldal
Azonostk, vltozdeklarci Minden vltozt hasznlat eltt deklarlni kell! A dekla-
rci alakja:tpus nv;
vagytpus nv1, nv2, nv3
;Plda: int a,b,c; Kezdrtk is:int a,b,c=0; A vltoznv bett, szmot s "_"-t tartalmazhat, nem
kezddhet szmmal. Plda: char _hosszu2valtozo; A kis- s nagybetk klnbznek, pldul:
float mas, MAS, Mas, mAs; /* 4 klnbzvltoz */
-
7/26/2019 C++eavazlat-1
12/196
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14611. oldal
Informatikai RendszerekIntzete
KifejezsekAritmetikai opertorok
Alapmveletek: + - * / Negci: - Maradkos oszts: %
Plda: 11%4 3 Bitenknti eltolsok: >>
-
7/26/2019 C++eavazlat-1
13/196
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14612. oldal
Informatikai RendszerekIntzete
Logikai opertorokrtkk 1 vagy 0 (igaz vagy hamis), elgazsok s ciklu-sok feltteleiben hasznlatosak.
logikai tagads: !Pl:!10 !01
egyenlsgvizsglat:==!=Pl: 26==261 (igaz)27!=270 (hamis)
relcik:< > =Pl: 5>8 0 (hamis)
2b)||((a==b)&&(c>d))
-
7/26/2019 C++eavazlat-1
14/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14613. oldal
rtkad opertorokA C-ben az rtkads is opertor, azaz kifejezsen bellhasznlhat!
Az rtkadsok - mint kifejezsek - ltalban a vltoz jrtkt adjk vissza. Plda: a=(b+5)kifejezs rtkeb+5lesz, s mellesleg az avltoz is ennyi lesz.
rtkads: =Pl: a=5; b=077; c=0xff; /* dec,okt,hex */
sszetettebb plda:a=((b=2)+3); /* b=2, a=5 */a=b=c=8; /* tbbszrs rtkads */
-
7/26/2019 C++eavazlat-1
15/196
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14614. oldal
Informatikai RendszerekIntzete
rtkmdosts:+= -= *= /= %= >>=
-
7/26/2019 C++eavazlat-1
16/196
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14615. oldal
Informatikai RendszerekIntzete
Egyb opertorok * &(lsd majd a mutatknl) Bitenknti s, vagy, kizr vagy, negls: & | ^ ~
Pl. 6&3 26|3 76^3 5~6 -7
Feltteles opertor:f ? b : c
rtke ha figaz (0), akkorb, klnben cPlda: a
-
7/26/2019 C++eavazlat-1
17/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14616. oldal
Precedenciasszetett kifejezseknl a szmolsi sorrendet hatrozza meg,
zrjelezssel fellbrlhat.
Cskkensorrendben az opertorok precedencija:
1. !,++,--,- (negci, 2s komplemens), ~ (bitenknti neg-ci, 1s komplemens), *(pointer), & (cmkpzs)
2. *,/,% (szorzs, oszts, maradkkpzs)3.+,-4. (bitlptets)
5.=
-
7/26/2019 C++eavazlat-1
18/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14617. oldal
6. ==,!= 11. ||(logikai vagy)7. &(bitenknti s - AND) 12. ?:(feltteles op.)8. ^ (bitenknti kizr vagy - XOR) 13. =,+=,-= stb.
9. |(bitenknti vagy - OR) 14. ,(vessz
opertor)10. &&(logikai s)
Az egy sorban szereplmveletek precedencija azonos.
Az azonos precedencij mveletek ltalban balrl jobbracsoportostdnak, pl. a-b-cugyanaz, mint (a-b)-c.KIVTELaz 1., 12., 13. osztly, amelyeken bell a csoportos-ts jobbrl balra trtnik, pl. a=b=0ugyanaz, mint a=(b=0).
Nem hiba, ha az egyrtelmsg kedvrt felesleges zrjele-ket runk a kifejezsbe, pl. (a>b) || ((a==b) && (c>d)).
-
7/26/2019 C++eavazlat-1
19/196
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14618. oldal
Informatikai RendszerekIntzete
Utastsok Kifejezs utasts
Pl. c+6;is szablyos utasts, br semmi hatsa nincs.Az rtkads is kifejezs, gy szablyos utasts, pl. a=c+6;
res utasts: ;(gyakran hasznljk ciklusok belsejben)
sszetett utasts (blokk)Alakja:
{
deklarcik;utastsok;
}
A {} zrjelpr hasonl a Pascal
BEGIN..END-jhez, de a } el
ttiutols utastst is ;-vel le kell zr-ni, a }utn viszont nem kell a ; !
-
7/26/2019 C++eavazlat-1
20/196
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14619. oldal
Informatikai RendszerekIntzete
Feltteles utastsAlakjai: if(felttel) utasts;
if(felttel) ut1; else ut2;
Megjegyzsek:A felttelktelezen zrjelben van.Az utasts tbbnyire sszetett utasts, ilyen-kor nem kell utna a ;
Plda: asbnvekvsorrendbe rendezse
if(a>b)
{ int t;t=b; b=a; a=t;
}
Pascalban TILOS!
A blokk belsejben ideig-
lenes vltozt deklarlunk!
-
7/26/2019 C++eavazlat-1
21/196
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14620. oldal
Informatikai RendszerekIntzete
Plda: Mennyi lesz x rtke?
int x=2;
if(x=3) x+=1;
int x=2;
if(x==3) x+=1;
GYAKORI HIBA!Az = s ==
mst jelent!
A megolds: elsesetben x=4, a msodiknl x=2.
-
7/26/2019 C++eavazlat-1
22/196
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14621. oldal
Informatikai RendszerekIntzete
CiklusokWhile-ciklus
Alakja: while(felttel) utasts;
Mindhrom esetbenkilps, ha a felttel
HAMIS!
Elltesztelciklus.Plda: faktorilis kiszmolsa (f n!):
{ int f,i,n;
f=1;i=2;n=5;while(i
-
7/26/2019 C++eavazlat-1
23/196
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14622. oldal
Informatikai RendszerekIntzete
For-ciklusAlakja: for(kezdrtk;felttel;nvels) utasts;Ugyanaz, mint:
kezdrtk;while(felttel){utasts;nvels;
}Plda: ciklus m-tl n-ig: for(i=m; i
-
7/26/2019 C++eavazlat-1
24/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14623. oldal
Tbb irny elgazsAlakja:
switch(kif)
{case eset1: utastsok1;case eset2: utastsok2;
(...)default: utastsok;}
ahol kifegy egsz kifejezs.
A megfelel eset - case - vgrehajtsa utn a programvgrehajtja a kvetkezeset(ek)et is!Megolds:break.
-
7/26/2019 C++eavazlat-1
25/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14624. oldal
Plda: Mennyi lesz x rtke?
int x=5;
switch(x){case 5: x=6;case 8: x=7;
default: x=8; *}
A megolds: a *-gal jellt sor ltezsekor x=8,ha ez a sor nincs: x=7.
f R T t Kd 146
-
7/26/2019 C++eavazlat-1
26/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14625. oldal
Plda: jtkprogram billentykezelsnek vzlataswitch(gomb){
case 'b':/* balra mozgats utastsai jnnek */break;case 'j':/* jobbra */
break;case 't':
/* tz */break;}
T t A C l Kd 146I f tik i R d k
-
7/26/2019 C++eavazlat-1
27/196
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14626. oldal
Informatikai RendszerekIntzete
Egyb utastsok (VEZRLSTAD UTASTSOK)Break
Formja:break; Ciklus s switch-elgazs belsejbl kiugrik, a
program a ciklus/elgazs utni elsutastssal folytatdik.Continue
Formja: continue;Ciklus belsejbl a vgre ugrik, a program fu-tsa a ciklusfelttel szerint folytatdik.
Goto
Formja: goto cmke;A program futsa a "cmke:" cmkvel megje-llt sortl folytatdik. Nem lehet goto-val blokkba kvlrl beugrani!
Felhasznlsa pl: ahol tbb egymsba gyazott ciklusbl szeretnnkkilpni. Minden program megrhat gotonlkl is. A Goto utasts astrukturlt programozs filozfijval ellenttes. Assemblyben s argi BASIC nyelvben termszetes a hasznlata.
Informatikai Rends erek Tantrgy: A C++ n el Kdszm: 146
-
7/26/2019 C++eavazlat-1
28/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14627. oldal
TpusokA C szigoran tpusos nyelv: minden vltoz tpust deklarlni
kell.Ilyenkor kezdrtk is megadhat. Plda: int i,j=1,k=2;
Egsz tpusok
1. signed(eljeles: -32768..32767, Borland C-ben default)2. unsigned(0..65535), illetve short, int, long
Pl. unsigned long l;
sizeofopertor: az adott tpus mrett adja meg (byte)sizeof(short)
-
7/26/2019 C++eavazlat-1
29/196
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14628. oldal
Informatikai RendszerekIntzete
NINCS TLCSORDULS-ELLENRZS!Pl. az int i=32767+1; hatsra irtke -32768 lesz (feltve,hogy sizeof(int)=2).
Lebegpontos tpusok1. float2. double3. long double
sizeof(float)
-
7/26/2019 C++eavazlat-1
30/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14629. oldal
Logikai tpusA C az egsz tpust hasznlja logikai rtkek trolsra.0 - hamis, minden ms - igaz.
Pl.if(1) x=5; az x=5 mindig vgrehajtdikb=(a!=a+1); b rtke 1 lesz
Karakter tpus
Automatikusan egssz konvertldik.Pl. 'A'ugyanaz, mint 65(ASCII kd).
char c='0'; int i=c+5; szablyos rtkads
Eljeles s el
jel nlkli vltozat:signed char -128..127
unsigned char 0..255Az alaprtelmezs fordtnknt vltoz!
Tantrgy: A C++ nyelv Kdszm: 146Informatikai Rendszerek
-
7/26/2019 C++eavazlat-1
31/196
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14630. oldal
Informatikai RendszerekIntzete
Felsorolsi tpusDefinilsa: enum nv {elem1,elem2,...};Itt a }utn kell a pontosvessz!
Az "enum nv"-vel egy j tpust hoztunk ltre.Ilyen tpus vltozk deklarlsa: enum nvv1,v2,v3;
A felsorolt szimblumok egszknt kezelhetk:elem1=0, elem2=1 stb.
Plda:
enum munkanapok {hetfo,kedd,szerda,csutortok,
htf(kezetes) nem lehet!
pentek};enum munkanapok a,b;
Informatikai Rendszerek Tantrgy: A C++ nyelv Kdszm: 146
-
7/26/2019 C++eavazlat-1
32/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C nyelv Kdszm: 14631. oldal
a=kedd; b=a+2;
b csutortok (avagy 3) lesz
Informatikai Rendszerek Tantrgy:A C++ nyelv Kdszm: 146
-
7/26/2019 C++eavazlat-1
33/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
gy y32. oldal
TmbkPl. int a[20];20 elemegsz tmb: a[0],a[1],..,a[19]
A tmb mrete nem lehet vltoz!Egydimenzis tmbk inicializlsa:
float f[]={1.0,3.14,2.71};
A tmb mrett ilyenkor magtl tudja.Tbbdimenzis tmb:
char c[4][3][2];
c[0][1][2]='A';Az elemek trolsa soronknt trtnik. Nincs indexha-tr-ellenrzs!
Tantrgy:A C++ nyelv Kdszm: 146Informatikai Rendszerek
-
7/26/2019 C++eavazlat-1
34/196
Gbor Dnes Fiskola
gy y33. oldalIntzete
StruktrkA struktra ms nyelvek rekordfogalmnak felel meg.
j struktra defini-lsa:
struct nv
{ tpus1nv1;tpus2nv2;
Plda:
struct szemely{char nev[25];int kor,labmeret;
};
Ilyen tpus vltozk deklarlsa:struct szemely en;en.labmeret=45;
...};
Informatikai Rendszerek Tantrgy:A C++ nyelv Kdszm: 146
-
7/26/2019 C++eavazlat-1
35/196
Gbor Dnes FiskolaIntzete 34. oldal
UniTbbfle tpust kpes trolni. Formailag a struktrhoz ha-sonl, de a mezk ugyanazon a memriahelyen troldnak!
Plda:
union un{
int i;char s[2];};union un a;
a.i=0x7978;Az a.irtkadssal egytt a.s="xy"lesz!Az uni a ms nyelvekben ltezvarins rekordok ptlsa.
Informatikai Rendszerek Tantrgy:A C++ nyelv Kdszm: 146
-
7/26/2019 C++eavazlat-1
36/196
Gbor Dnes FiskolaIntzete 35. oldal
Tpusdefincitypedef int suly; a suly egsz tpus leszsuly s1,s2; s1,s2 egsz vltozk
typedef struct{ char nev[25];int kor,labmeret;
} szemely; (A vgre kell az j nv!)szemely en; (Nem kell a structkulcssz!)
typedef enum {ferfi, no} nem;
nem jancsi=ferfi;nem juliska=no;
Tmb definilsa: typedef char irszam[4];
Tantrgy:A C++ nyelv Kdszm: 14636 ld l
Informatikai Rendszerek
-
7/26/2019 C++eavazlat-1
37/196
Gbor Dnes Fiskola36. oldalIntzete
Mutatk (pointerek)A mutatk memriacmeket trol-nak!
Minden tpushoz tartozik egy muta-t tpus, amely az adott tpus vl-tozk cmeit kpes trolni.
Plda:
int *p;pegy egsz vltoz cmt tartalmazhatja, "egy
egszre mutat". Aptpusa "int *".
*p apltal mutatott rtk (a fenti pldban egy egsz)
&a az a vltoz cme (& cmkpzopertor)
Tantrgy:A C++ nyelv Kdszm: 14637 ld l
Informatikai RendszerekI t t
-
7/26/2019 C++eavazlat-1
38/196
Gbor Dnes Fiskola37. oldalIntzete
Plda: main()
{ char a,b;
char *p; /* karakterre mutat */a='a'; p=&a; b=*p+1; }
Vgrehajtsa utnbrtke 'b'lesz.
Plda: vltoz trsa (pointer+explicit tpuskonverzi):
int x=10; *(int*)&x=20; /* x=20 lesz! */
Elssorban nem a konkrt memriacm a fontos, amelyremutatnak. A mutatkat vltozkra pozcionlhatjuk,
ezltal mveleteket vgezhetnk!
A pointerekkel bnjunk vatosan, mert programunk elszllhat!
Tantrgy:A C++ nyelv Kdszm: 14638 oldal
Informatikai RendszerekI t t
-
7/26/2019 C++eavazlat-1
39/196
Gbor Dnes Fiskola38. oldalIntzete
Tmbk s mutatk kapcsolataint a[20];
Lefoglaldik 20*sizeof(int)byte a memriban s amint pointer ennek az elejre mutat. Ezrt pl. *as a[0]ugyanazt jelenti:
*a *(a+1) *(a+2)a[0] a[1] a[2]
a a+1 a+2 a+3
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14639 oldal
-
7/26/2019 C++eavazlat-1
40/196
Gbor Dnes FiskolaIntzete 39. oldal
Pointer-aritmetikaA pointerhez hozzadhat egy k egsz, az eredmnyolyan pointer, amely k-val "arrbb" mutat a memriban
(lsd elzbra).Plda:
int a[5]={10,20,30,40,50};int *p=a;p+=4; --p;
Eredmnye:p
aza
tmba[3]
elemre mutat (*p=40
).Figyelem! Az amint pointer hasznlhat, de nem mdo-sthat, pl. ++ahibt eredmnyezne!
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14640 oldal
-
7/26/2019 C++eavazlat-1
41/196
Gbor Dnes FiskolaIntzete 40. oldal
StringekString: karaktertmb, 0 rtkbjttal ('\0')lezrva
('\0' != '0').
Pl. char s[]="Szveg";egy 7 elemtmb lesz,s[0]='S', s[6]='\0'
Vigyzat! A fenti s-sel s="j szveg"; hibt adna,
mert az s-et mint mutattakarn trni!Plda: az albbi program kirja: Hello Hello#include #include
int main(void){ char s[10]; char *str="Hello";strcpy(s,str); printf("%s %s\n",s,str);return 0; }
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14641 oldal
-
7/26/2019 C++eavazlat-1
42/196
Gbor Dnes FiskolaIntzete 41. oldal
FggvnyekMs nyelvekhez hasonlan a fggvnyek paramterezhetk.
A fggvnydefinci ltalnos alakja:tpusnv(tp1par1, ...){vltozdeklarcik
;utastsok;}
tpus: a visszatrsi rtk tpusanv: az j fggvny nevetpipari: az i. formlis paramter tpusa s neve
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14642. oldal
-
7/26/2019 C++eavazlat-1
43/196
Gbor Dnes FiskolaIntzete 42. oldal
Figyelem! Ha a fggvnynek nincs paramtere, akkor is ki kelltenni a neve utn a () -t, defincikor is, hvskor is (defincikora zrjelek kz voidis rhat)! Pldul: clrscr();
A fggvny trzsben return valami; utastssal adhatjukvissza a valamirtket.
Plda: string hossznak kiszmtsa fggvnnyel:
int hossz(char *szoveg){int h=0;char *p;
for(p=szoveg;*p!='\0';++p) ++h;return h;
}
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14643. oldal
-
7/26/2019 C++eavazlat-1
44/196
Gbor Dnes FiskolaIntzete 3 o da
Hvsa:int main(void){
char s[]="Bann";int l=hossz(s);}
Ekkor lrtke 5 lesz.A fggvny rtkt nem ktelezfelhasznlni.
Vagy: return nem ad vissza rtket.
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14644. oldal
-
7/26/2019 C++eavazlat-1
45/196
Gbor Dnes Fiskola
EljrsokC eljrs: olyan fggvny, amelynek nincs visszatrsi r-tke. Ennek kezelsre "res" tpus: void.
void nv(paramterek)
{
...
}
Az eljrsban nincs szksg returnutastsra. Ha mgis
hasznljuk, akkor nincs paramtere.
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14645. oldal
-
7/26/2019 C++eavazlat-1
46/196
Gbor Dnes Fiskola
Specilis fggvny amain. rtke intvagy void, egysze-resetben nincs paramtere. Ez a fggvny a fprogramfuttatsakor indul el. Ha lefutott, akkor a program is vgetr. A
mainrtkt az opercis rendszernek adja vissza.
Deklarci s definci
Deklar: megadja a fv. rtknek s paramtereinek tpust
Fggvny-definci: megadja, hogy a fv. mit csinljon
Az eddigi pldkban mindkettszerepelt. Csak deklarciis lehetsges, pl: int hossz(char*);
Puszta deklarci utn is mr hvhat a fggvny. A dekla-rci haszna: modularitsnl.
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14646. oldal
-
7/26/2019 C++eavazlat-1
47/196
Gbor Dnes Fiskola
Loklis s globlis vltozkA {}zrjelprok (ld. fggvnyek ill. sszetett utastsok)ltal hatrolt programrsz: blokk.
A blokkok egymsba gyazhatk, kivtel: fggvnyen be-ll nem lehet jabb fggvny defincija!
Kvetkezmny: amainfggvnyen kvlkell a tbbi fgg-vnyt definilni.
Minden blokk elejn deklarlhatk vltozk:
a blokkbl kilpve megsznnek, rtkk elvsz,csak a blokkon bell lehet hivatkozni rjuk.
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14647. oldal
-
7/26/2019 C++eavazlat-1
48/196
Gbor Dnes Fiskola
A vltozk trolsi osztlya: auto, register, static, extern.auto- loklis vltozk deklarcija, ez az alaprtelmezs. A vl-
tozk kezdrtke hatrozatlan.
Plda: auto int a;int b;
register - a vltozt a CPU regiszterben szeretnnk trolni. A
program futsi teljestmnye nvelhet. Az osztly-nv hasznlata ajnlsa fordtnak. E vltozkra nemhasznlhat a & cmkpzopertor.
Plda:register int c;
extern - globlis vltozk deklarcija. Az adott programblokkrszre rja le a vltozk tpust. Plda: extern int d;
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14648. oldal
-
7/26/2019 C++eavazlat-1
49/196
Gbor Dnes Fiskola
static-a statikusnak deklarlt vltozk szintn csak a blokkonbell ltszanak, de rtkk megrzdik.
Plda:int szamlalo(void){ static int i=0;++i;return i; }
A plda fggvnye minden hvskor eggyel nagyobb r-tket ad vissza (pl. int a; utn a=szamlalo(); -ttbbszr kiadva a=1,2,3...lesz). Az i=0 inicializlscsak egyszer hajtdik vgre!
Az sszes fggvnyen kvl is deklarlhatk vltozk,ezek a modulon bell mindenhol lthatk.
Gb D Fi k l
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14649. oldal
-
7/26/2019 C++eavazlat-1
50/196
Gbor Dnes Fiskola
A paramtertads rszleteiHvskor a formlis paramterekbe bemsoldnak az ak-tulis paramterek rtkei, majd a fggvnytrzs - a form-
lis paramtereket hasznlva - vgrehajtdik. Az aktulisparamtereket a fggvny nem mdostja (rtk szerintitads)!
Plda: void duplaz(int i){i*=2;
}
Ekkor int a=6; duplaz(a);hatsra artke 6 marad!
Gb D Fi k l
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14650. oldal
-
7/26/2019 C++eavazlat-1
51/196
Gbor Dnes Fiskola
Mkdmegolds mutatkkal:void duplaz(int *i){
*i *= 2;}
Hvsa: int a=6; duplaz(&a); /* a=12 */
Tmbk tadsa paramterknt (cm szerint ad t)
A tmbvltoz valjban pointer, gy pl. ha a fggvny ka-raktertmbt vr, akkor a formlis paramter tpusakntchar *ss char s[]is adhat (a mret nem kell).
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14651. oldal
-
7/26/2019 C++eavazlat-1
52/196
Gbor Dnes Fiskola
Adatbevitel s kivitelA szkebb rtelemben vett C nyelv nem tartalmaz ki- s
bemeneti m
veleteket. Az n. standard knyvtrakban ta-llhatk ilyen fggvnyek. A standard knyvtrak haszn-latt kzlnnk kell a C fordtval: a knyvtr fggvnyeitdeklarl fjlt be kell olvasnunk; erre j a #includedirek-
tva.
Pldul a standard I/O fggvnyek hasznlathoz az
#include sort kell forrsprogramunk elejn elhelyezni.
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14652. oldal
Informatikai RendszerekIntzete
-
7/26/2019 C++eavazlat-1
53/196
Gbor Dnes Fiskola
A be- s kimenet az n. standard inputra s standardoutputra trtnik: alapesetben a billentyzet s a kper-ny, azonban tirnythatk.
Formzott kimenetaprintffggvnnyel valsthat meg.Plda:
int i=6;printf("Eredmny: %d\n",i);
Az escape szekvencik listja:
\a - hangjelzs, \b - backspace, \f - lapdobs, \n - jsor,\r - kocsivissza, \t - vzsz. tabultor, \v - fgg. tabultor,\ - aposztrf, \ - idzjel, \\ - backslash, \? - krdjel,
\ooo - oktlis szm, \xhh - hh hexa szm, \0 - null karakter
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14653. oldal
-
7/26/2019 C++eavazlat-1
54/196
Gbor Dnes Fiskola
Aprintftulajdonsgai: Tetszleges argumentumszm fggvny,
az elsparamtere string, benne norml karakterek %-kal kezddformtumspecifikcik,
a tovbbi paramterek a kirand adatok, mindegyiknek
megfelel egy formtumspecifikci.
A formtumspecifikcik szma s tpusa meg kell felel-jen a tovbbi paramtereknek, a C sz nlkl elfogadja ahibs megadst is!
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14654. oldal
-
7/26/2019 C++eavazlat-1
55/196
Gbor Dnes Fiskola
A megadhat formtumok:%d- eljeles egsz%i- eljeles egsz
%o- eljeltelen oktlis egsz%x,X- hexadecimlis egsz%u- eljeltelen egsz%c- karakter%s- string (char *)%f- double%e,E- double, exponencilis alakban
%g,G- double, mretfggalakban%p- pointer%%- a "%" karakter
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14655. oldal
-
7/26/2019 C++eavazlat-1
56/196
Gbor Dnes Fiskola
A %s a betkz rhat mg:mnuszjel a balra igaztshozpluszjel az eljel kiratshoz
kirsi minimlis mez
szlessget megad szmpontossgot megad szm (az elzszmtl ponttalelvlasztva, alaprtelmezse 6)
hvagy lbet, ha short/ long szmot akarunk kiratni
Pldk a 4 s a 3.14159265358979 kiratsra:
%d 4 %f 3.141593
%5d
4 %e
3.141593e00%+5d +4 %10f 3.141593
%8.3f +3.142
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14656. oldal
-
7/26/2019 C++eavazlat-1
57/196
Formzott bemeneta scanffggvnnyel oldhat meg:int i;scanf("%d",&i);
A scanf az stdin szabvnyos adatfolyambl olvas be,amely nha nem res. Kirtse: fflush(stdin);
Tetszleges argumentumszm fggvny,az elsparamtere string, benneszkz, jsor, tab: nem veszi figyelembenorml karakterek: a bemeneten betszerint megje-
lennek%-kal kezddformtumspecifikci
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14657. oldal
-
7/26/2019 C++eavazlat-1
58/196
A tovbbi paramterek a vltozk cmei (mutatk), aho-va az adatokat beolvassuk, mindegyiknek megfelel egyformtumspecifikci.
A formtumspecifikcik szma s tpusa meg kell felel-jen a tovbbi paramtereknek, a C sz nlkl elfogadja ahibs megadst is!
A megadhat formtumok:
%d- eljeles decimlis egsz%o- eljeltelen oktlis egsz
%x,X- hexadecimlis egsz
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14658. oldal
-
7/26/2019 C++eavazlat-1
59/196
%u- eljeltelen egsz%c- karakter%s- string (char *)%f,e,g- lebegpontos szm%p- pointer[...] [^...]- illeszkedsi halmaz/ellentte (char*)
A %s a betkz rhat mg hvagy lbet, ha short vagylong szmot akarunk beolvasni.
A scanffggvny visszatrsi rtke a sikeresen beolvasottadatok szma. Ez hibakezelsre felhasznlhat. Ha egy ada-tot nem tud beolvasni, az stdin-ben marad (fflush!).
Varici:sscanf stringbl olvas be vltozkba
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14659. oldal
-
7/26/2019 C++eavazlat-1
60/196
Plda: eleinte gyakori hiba a scanfhasznlatakor:#include
main()
{ char szoveg[10];int szam;printf("Krek egy egsz szmot: ");scanf("%d",szam);
printf("Krek egy rvid szveget: ");scanf("%s",szoveg);printf("A bert szm: %d, a szveg: %s.",
szam,szoveg); }
Hibazenetet nem kapunk, a program mgsem mkdikjl. A hibs sor helyesen: scanf("%d",&szam);
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14660. oldal
-
7/26/2019 C++eavazlat-1
61/196
Karakter be- s kiviteleint getchar(void);
Egy karaktert olvas a standard inputrl, hiba vagy az input vge
esetn EOFkaraktert ad.Az EOFelre definilt szimblum, hibas fjlvg jelzsre hasznljk, a Turbo C++ -ban rtke -1.
int putchar(char c);
A ckaraktert kirja a standard outputra. Visszatrsi rtke ackarakter, vagy hiba esetn EOF.
Egyb I/O fggvnyek(nem mind ANSI C)
Billentyzet:kbhit, getch, getche, ungetch(max. 1-et!)Kperny: gotoxy, wherex, wherey, window, clrscr
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14661. oldal
Informatikai RendszerekIntzete
-
7/26/2019 C++eavazlat-1
62/196
Plda: beolvasunk szvegeket, Enterre nagybetsen kir-juk
#include
void main(void){int c;
printf("Krek egy szveget, Ctrl+Z=vge : ");while((c=getchar()),c!=EOF){if(c>='a' && c
-
7/26/2019 C++eavazlat-1
63/196
}
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14663. oldal
-
7/26/2019 C++eavazlat-1
64/196
String be- s kivitelechar *gets(char *s);
Enterrel ("\n") lezrt karaktersorozatot olvas be a stan-
dard inputbl az sstringbe, Enter nlkl. Visszatrsi r-tke az s, vagy hiba illetve az input vge esetnNULL. ANULLelre definilt szimblum, egy specilis mutatrtk,
hibajelzsre hasznljk, a Turbo C++ -ban rtke 0.int puts(char *s);
Kirja a standard outputra az sstringet s egy jsor karak-tert. Visszatrsi rtke hiba esetn EOF, klnben az utol-
jra kikldtt karakter (tbbnyire "\n").
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14664. oldal
-
7/26/2019 C++eavazlat-1
65/196
Plda: bekrnk egy nevet s kirjuk, hibakezelssel#include#include
#includemain(){char nev[10];
clrscr();printf("Hogy hvnak? ");if(*gets(nev)=='\0')
printf("Nincs nv!\n\a");else printf("Szia, %s! ""\n(%d betu)",nev,strlen(nev));
}
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14665. oldal
-
7/26/2019 C++eavazlat-1
66/196
FjlkezelsEgy httrtron tallhat fjl kezelshez elszr meg kellnyitni. Egyszerre tbb fjl is kezelhet, ezrt azonostanikell tudni ket. Ehhez elre definilt a FILEtpus. A fjlok-ra majd FILE *pointerekkel hivatkozunk.
Fjl megnyitsaFILE *fopen(char *nev,char *mod);
neva megnyitand fjl neve, szksg esetn elrsi t-vonallal
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14666. oldal
-
7/26/2019 C++eavazlat-1
67/196
moda megnyitsi md, a kvetkezlehet:"r" - csak olvassra megnyits"w" - csak rsra (ha nem ltezik, ltrehozza)
"a" - hozzrs"r+" - olvass s rs (csak ha ltezik)"w+" - olvass s rs
"a+" - olvass s hozzrsMindegyik md stringjben szerepelhet mg "b" illetve"t"aszerint, hogy binris vagy szveges a fjl.
A visszatrsi rtk a megnyitott fjlt azonost FILE *pointer vagy hiba esetnNULL.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14667. oldal
-
7/26/2019 C++eavazlat-1
68/196
Fjl lezrsaint fclose(FILE *f);hiba esetn EOF-ot ad visz-
sza
Az eddigi ki- s bemeneti fggvnyek fjlkezelmegfele-
li:
int fprintf(FILE *f, char *s, ...);int fscanf(FILE *f, char *s, ...);int getc(FILE *f);
int putc(int c, FILE *f);char *fgets(char *s, int n, FILE *f);int fputs(char *s, FILE *f);
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14668. oldal
Informatikai RendszerekIntzete
-
7/26/2019 C++eavazlat-1
69/196
Specilis fjlok (FILE * tpusak, de nem lemezes fjlok,elre definilva vannak s nem kell ket megnyitni):
stdin - standard input (billentyzet)
stdout - standard output (kperny)stderr - standard hibacsatorna (kperny)stdaux - standard auxiliary device (COM1)
stdprn - standard printer (LPT1)Plda: az albbiakban mindkt sor eredmnye ugyanaz
printf("Szia!\n");
fprintf(stdout,"Szia!\n");A be- s kimenetek tirnytsa DOS-ban:progfjl, prog>>fjl, progfjl2, prog1|prog2
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14669. oldal
Informatikai RendszerekIntzete
-
7/26/2019 C++eavazlat-1
70/196
Binris fjlok kezelse (olvass, rs, pozicionls s po-zci lekrdezse):
int fread(void *p, int size, int n, FILE *f);
tetszleges adatot olvas a fjlblpaz a cm, ahova az adatot be akarjuk olvasni
A void * specilis pointer tpus: brmilyen pointert r-hatunk a helybe. sizeegy adat mrete
Plda: tmb feltltse fjlbl
#include
main(){ int t[10];FILE *f=fopen("be.dat","rb");fread(t,sizeof(int),10,f); }
naz adatok szma faz olvasand fjl
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14670. oldal
-
7/26/2019 C++eavazlat-1
71/196
int fwrite(void *p, int size, int n, FILE *f); tetszleges adatot r a fjlbapaz a cm, ahonnan az adatot ki akarjuk rni
sizeegy adat mrete naz adatok szma fa fjl, amelybe runk
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14671. oldal
-
7/26/2019 C++eavazlat-1
72/196
int fseek(FILE *f, long off, int honnan); az ffjlban az aktulis pozcit az off-adik byte-ra llt-
ja
honnanmondja meg, hogy mely pozcihoz kpest, ez akvetkezhrom elre definilt szimblum lehet:
SEEK_SET- a fjl eleje
SEEK_CUR- az eddigi pozciSEEK_END- a fjl vge.
visszatrsi rtke siker esetn 0, nem 0 ha hiba trtnt
Vgl long ftell(FILE *f);az aktulis pozcit adja vissza, vagy -1-et, ha hiba trtnt
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14672. oldal
-
7/26/2019 C++eavazlat-1
73/196
Plda: egy struktrt fjlba (id.txt) runk#include
struct str
{ int i; char ch; };int main(void){ FILE *stream;
struct str s;if((stream=fopen("id.txt","wb"))==NULL){ fprintf(stderr,"Hiba!\n\a");return 1; }
s.i = 0; s.ch = 'A';fwrite(&s, sizeof(s), 1, stream);fclose(stream);return 0; }
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14673. oldal
Informatikai RendszerekIntzete
-
7/26/2019 C++eavazlat-1
74/196
A main fggvny paramtereiA C programon bell amain fggvnynek kitntetett sze-repe van, mert kijelli a program belpsi pontjt.
Amain fggvnynek tbb paramtere lehet. Legegysze-rbb alakjai:main(); vagyvoid main(void);
Teljes alakja:
int main(int argc,char *argv[],char *envp[]);
A paramterek nevei tetszlege-sen megvltoztathatk, azonbanclszer a lenti szabvnyos el-
nevezseket hasznlni.
az MS-DOS alatti fordtk tbbsgnl
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14674. oldal
Informatikai RendszerekIntzete
-
7/26/2019 C++eavazlat-1
75/196
ahol: argca paramterek szma+1 (azaz rtke legalbb 1) argvstringek tmbje:
argv[0]a program neve teljes elrsi ttal (mindig ltezik)
argv[1]..argv[argc-1] a program indtsakor a pa-rancssorban kiadott paramterek (elvlasz-ts a szkzk mentn; vgkn "\0")
argv[argc]egyNULLpointer env szintn stringek tmbje, benne az n. krnyezeti
vltozk rtkei (comspec, path, prompt stb.).
Amain fggvny visszatrsi rtke (pl. return 0;) aDOS errorlevelvltozjval krdezhetle.A legrvidebb C program (semmit nem csinl):main(){}
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14675. oldal
-
7/26/2019 C++eavazlat-1
76/196
Plda: parancssori paramtertvtel: a paramtersorbanmegadott fjl tartalmt kiratjuk
Hvsa pl:C:\>kiiro level.txt (Enter)
#include int main(int argc, char *argv[]){
FILE *f; int c;if(argc!=2){fprintf(stderr, "A program egy fjl"
"nevet vr paramterknt!\n\a");return 1;
}
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14676. oldal
-
7/26/2019 C++eavazlat-1
77/196
f=fopen(argv[1],"rt");if(f==NULL){fprintf(stderr,"A %s fjlt nem sike"
"rlt megnyitni!\n\a",argv[1]);return 1;
}while(c=getc(f),c!=EOF) putchar(c);fclose(f);return 0;
}
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14677. oldal
-
7/26/2019 C++eavazlat-1
78/196
ModularitsEgy program tbb fordtsi egysgbl (modulbl) llhat.Ezek kln-kln lefordthatk, de mg nem futtathatk. Alefordtott egysgeket ssze kell szerkeszteni ("linkelni"),gy ll ela futtathat program.
Egy (rsz)program lefordthatsgnak felttelei:
szintaktikailag helyes legyen
valamennyi felhasznlt fggvny deklarlva legyen(nem kell definilni!)
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14678. oldal
Informatikai RendszerekIntzete
-
7/26/2019 C++eavazlat-1
79/196
A rszprogramok kln fordthatsgnak el
nyei: nagy program rszeit tbb programoz ksztheti, egy-
mstl fggetlenl
ltalnos haszn fggvnyeket rhatunk egy modulba,s tbb klnbzprogramban is felhasznlhatjuk ket(pl. maguk a C standard knyvtrai is ilyen kln leford-tott fggvnygyjtemnyek - .OBJ, .LIB)
Forrsszveg (.C) [elfeldolgoz (preprocesszor)belsfordt] trgykd (.OBJ) linker (.OBJ, .LIB)
futtathat llomny (.COM, .EXE)
Az elfeldolgoznak szl parancsok #-tel kezddnek.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14679. oldal
-
7/26/2019 C++eavazlat-1
80/196
A standard knyvtrak pldja:Mit jelent az #include ?
Az stdio.hegy C nyelvASCII fjl, amelyben az I/O fgg-
vnyek deklarcii vannak felsorolva. A #includeegy n.direktva, amely beolvassa a megadott fjlt a forrsprog-ramunkba gy, mintha azt mi rtuk volna oda.
A azt jelzi, hogy a fjlt a rendszer standardinclude fjljai kztt keresse (az elre megadott knyvt-rakban), "fjlnv"esetn a mi fjljainkat hasznln.
gy programunkban deklarlva lesznek a megfelel fgg-vnyek, a program lefordthat.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14680. oldal
-
7/26/2019 C++eavazlat-1
81/196
Sajt moduljainkhoz is clszer
egy n. fejlcfjlt kszte-ni, amelyik csak a ms modulok ltal hasznlt fggvnyekdeklarciit tartalmazza.
A C programfjlok szoksos kiterjesztse: ".c"a defincikat tartalmaz fjlnl ".h"a fejlcfjlnl
Tbb program sszeszerkesztse
IDE-bl PROJECT-tel: Project - Open Project, forrsfj-
lok megadsa stb. A vgn ne felejtsk el: Close Pro-ject!parancssorbl: C:\>bcc prog1.c prog2.c
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14681. oldal
-
7/26/2019 C++eavazlat-1
82/196
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14682. oldal
Informatikai RendszerekIntzete
szoks szerint NAGYBETVEL
-
7/26/2019 C++eavazlat-1
83/196
A #definedirektva hasznlata konstansdefinils(pl. #define PI 3.1415927) egyszerhelyettests(pl. #define AND &&)
feltteles fordts:#ifdef...
#endif vdekezs include-fjl tbbszri beolvassa ellen:
#ifndef __NEV_H#define __NEV_H/* a tnyleges tartalom */
#endif
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14683. oldal
-
7/26/2019 C++eavazlat-1
84/196
makrdefinils:pl. #define MAX(a,b) ((a)>(b) ? (a) : (b))
Fordts sorn a makrban definilt utastssor forrs-
kd szinten helyettestdik be a forrsprogram adotthelyre.
Plda: az=MAX(x,y);
sor kifejtse:z=((x)>(y) ? (x) : (y));
Mindegyik esetben az #include...egy soros, a \jel se-gtsgvel fzhetnk tbb sort egybe.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14684. oldal
-
7/26/2019 C++eavazlat-1
85/196
Biztonsgosabb fjlkezelsA C fjlkezelknyvtri fggvnyei sikertelen vgrehajts ese-tn - pl. nem ltez fjlt akarunk olvassra megnyitni - a hibt
valamilyen specilis visszatrsi rtkkel vagy paramterreljelzi (pl.NULL-pointer). Ha ezt nem kezeljk le, a program hibaesetn sz nlkl tovbbfut, de persze nem mkdik helyesen.Ha el akarjuk kerlni, hogy minden egyes fjlkezel mvelet
utn feltteles elgazssal ellenrizzk, hogy volt-e hiba, akkorhasznos lehet egy olyan modult rni, amelyben minden fjlkeze-l fggvny gy van megrva, hogy meghvja az eredeti fgg-vnyt s hiba esetn hibazenettel lell. Ezt a modult hasznl-hatjuk aztn a programjainkban a standard fggvnyek helyett.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14685. oldal
-
7/26/2019 C++eavazlat-1
86/196
Dinamikus memriahasznlatHelyfoglals a heap-ben
void *malloc(meret);
A mret bjtban rtend. Visszatrsi rtke az j lefoglalt blokkramutat pointer, vagyNULL, ha nincs elegendhely, vagy a mretneknullt adtunk.
Lefoglalt hely felszabadtsa
void free(void *blokknev);
Egyb fggvnyek
allocmem, coreleft, freemem, calloc, realloc,farmalloc, farfree, far...
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14686. oldal
Plda: dinamikus memriahasznlatra -cal
-
7/26/2019 C++eavazlat-1
87/196
malloc#include #include
#include #include
int main(void)
{ char *str;
if ((str = (char *) malloc(10)) == NULL){ printf("Nincs elg memria!\a\n");
exit(1); }
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14687. oldal
-
7/26/2019 C++eavazlat-1
88/196
strcpy(str,"Hello");printf("A szveg: %s\n",str);free(str);
return 0;}
A program a kvetkezt rja ki:
A szveg: Hello
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14688. oldal
Hasonl plda calloc-cal (ugyanazt rja ki):
-
7/26/2019 C++eavazlat-1
89/196
#include #include
#include int main(void){ char *str = NULL;
str = (char *) calloc(10, sizeof(char));strcpy(str, "Hello");printf("A szveg: %s\n",str);free(str);
return 0; }
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14689. oldal
-
7/26/2019 C++eavazlat-1
90/196
Vltoz argumentumszm fggvnyekIlyen pl. aprintf- tetszleges szm paramterrel hvha-t.
Sajtvltoz argumentumszm fggvnyeket is kszthe-tnk, a kvetkezmakrk segtsgvel (az stdarg.h-ban):
va_start()va_arg()va_end()
A ltrehozand vltoz tpusa: va_list()
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14690. oldal
Plda: vltoz argumentumszm fggvny, a tanknyvbl
-
7/26/2019 C++eavazlat-1
91/196
#include#include
void vfg(char *format,...){ va_list ap;int d;char c,*s;
va_start(ap,format);while(*format)
switch(*format++){ case 's':
s=va_arg(ap,char*);printf("string %s\n",s);
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14691. oldal
Informatikai RendszerekIntzete
break;'d' A ki j
-
7/26/2019 C++eavazlat-1
92/196
case 'd':d=va_arg(ap,int);
printf("int %d\n",d);break;case 'c':c=va_arg(ap,char);
printf("char %c\n",c);
A program kirja:char Aint 1int 25
stringValami szvegint 1int 2int 3
string Ngystring tbreak; }va_end(ap); }
void main(void)
{ vfg("cdds",'A',1,25,"Valami szveg");vfg("dddss",1,2,3,"Ngy","t");}
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14692. oldal
Plda: a beolvasott szmrl eldntjk, hogy prm-e, hibsd t t b l t i t ljk
-
7/26/2019 C++eavazlat-1
93/196
adat esetn a beolvasst megismteljk
#include
#includemain(){
long szam,i,oszto=0;clrscr();do{ printf("Krek egy pozitv egsz szmot: ");
fflush(stdin);}
while((scanf("%ld",&szam)!=1)||(szam
-
7/26/2019 C++eavazlat-1
94/196
if(szam%i==0){oszto=i;
break;}
printf("A(z) %ld%s prm!\n",szam,(oszto ? " nem" : ""));
if(oszto) printf("Legkisebb osztja: %ld\n",
oszto);}
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14694. oldal
Plda: a legnagyobb kzs oszt (lnko) kiszmtsaPl lnko(80 100)=20
-
7/26/2019 C++eavazlat-1
95/196
Pl. lnko(80,100)=20
#include
#include
int Lnko(int,int); /* fv. deklarci */
main(){int x,y;
clrscr();printf("Krek kt szmot vesszvel ""elvlasztva: ");
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14695. oldal
if(scanf("%d %d" &x &y)!=2)
-
7/26/2019 C++eavazlat-1
96/196
if(scanf("%d,%d",&x,&y)!=2)printf("Hiba!\a"); elseprintf("lnko(%d,%d)=%d",x,y,Lnko(x,y));
}
int Lnko(int u, int v) /* fv. definci */{ int r;if(u
-
7/26/2019 C++eavazlat-1
97/196
A program kirja: Hello Hello Hello
#include
void mystrcpy1(char*,char*);void mystrcpy2(char*,char*);
main(){char *szoveg1,szoveg2[10],szoveg3[10];
szoveg1="Hello";mystrcpy1(szoveg2,szoveg1);mystrcpy2(szoveg3,szoveg1);
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14697. oldal
Informatikai RendszerekIntzete
printf("%s %s %s\n",szoveg1,szoveg2,szoveg3);
-
7/26/2019 C++eavazlat-1
98/196
szoveg3);}
void mystrcpy1(char *d,char *s){ int i=0;while(s[i]!='\0') { d[i]=s[i];++i; }d[i]=s[i]; }
void mystrcpy2(char *d, char *s){ while((*d++=*s++)); }
A !='\0' elhagyhat, mert a C-ben a 0 ha-mis, minden ms igaz. gy a szvegmso-
ls a megfelelhelyen r vget!
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 14698. oldal
Informatikai RendszerekIntzete
Plda: beolvasunk egy (tbbsoros) szveget s kirjuk,hny karaktert s hny sort tartalmaz
-
7/26/2019 C++eavazlat-1
99/196
hny karaktert s hny sort tartalmaz
#include
main(){int karakter=0,sor=1,c;
A cvltoz inttpus, mgis
karakterknt hasznljuk!
printf("Krek egy szveget, Ctrl+Z=vge: ");
while((c=getchar())!=EOF) {++karakter;if(c=='\n') ++sor;}
printf("%d karakter, %d sor.\n",karakter,sor);}
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 14699. oldal
Plda: biztonsgosabb fjlkezels
-
7/26/2019 C++eavazlat-1
100/196
Az "estdio.h"fjl tartalma:
#ifndef __ESTDIO_H#define __ESTDIO_H#include
FILE *efopen(char *nev, char *mod);int efclose(FILE *fp);/* stb.: egyb stdio-fggvnyek deklarcii */
#endif
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146100. oldal
Az "estdio.c"fjl tartalma:
#i l d dlib h /* i h k ll */
-
7/26/2019 C++eavazlat-1
101/196
#include /* az exit-hez kell */#include "estdio.h"
FILE *efopen(char *nev, char *mod){FILE *fp;
fp=fopen(nev, mod);if(fp!=NULL) return fp;fprintf(stderr,"Nem sikerlt megnyitni "
"a %s fjlt!", nev);exit(1);
}
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146101. oldal
int efclose(FILE *fp){
-
7/26/2019 C++eavazlat-1
102/196
{if(fclose(fp)==0) return 0;fprintf(stderr,"Nem sikerlt lezrni a "
"fjlt!");exit(1);}
/* stb: egyb stdio-fggvnyek j defincii */
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 146102. oldal
Informatikai RendszerekIntzete
A Borland C++ (DOS) hasznlata
-
7/26/2019 C++eavazlat-1
103/196
A Borland C++ (DOS) hasznlataAz IDE hasznlata megegyezik a Turbo Pascalval.
ltalnos mveletek
ltezfjl megnyitsa: F3 (default = *.cpp!)project ltrehozsa / megnyitsa: Project - Open project
A vgn ne felejtsk el bezrni: Project - Close projecthelyrzkeny Help: Ctrl+F1 (a kurzor a sz alatt lljon)kilps a programbl: Alt+X
A program fordtskor nha lefagy, mentsnk gyakran (F2-vel)!
Ablakmveletekvlts: Alt+1, Alt+2 stb., vagy F6. Bezrs: Alt+F3mozgats: Ctrl+F5,
, befejezs Enterre
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 146103. oldal
Informatikai RendszerekIntzete
mretezs: Ctrl+F5, Shift+
, befejezs Enterre
Program futtatsa
-
7/26/2019 C++eavazlat-1
104/196
Program futtatsa
fordts: F9 A kijellt ablak a forrsfjlt tartalmaz legyen!
futtats: Ctrl+F9 (ha szksges, jrafordtja!)kimeneti kperny: Alt+F5, ablakban: Alt+W s O
Nyomkvets
lpsenknti futtats: F7 (fv-ekbe belp), F8 (nem lp be)A kijellt ablak a forrsfjlt tartalmaz legyen!futtats a kurzorig: F4trspont be / ki: Ctrl+F8 (lpkeds Ctrl+F9)vltoz nyomkvetse: Ctrl+F7, nv bersa, Entertovbbi mveletek a Watch ablakban: Insert, Delete
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146104. oldal
A C++ NYELV
-
7/26/2019 C++eavazlat-1
105/196
A C++ NYELVBevezets
A C++ nyelv kialakulsa:
Objektumorientlt (OO) programozsi szemllet; OO progra-mozsi nyelvek (Simula-67, Smalltalk).
Az OO nyelvek lassak voltak. A 80-as vekben clul tztkki a C nyelv OO bvtst, a hatkonysg megtartsa mellett.
Bjarne Stroustrup a 80-as vek kzepn megalkotta a C++
nyelvet.(A C nyelv egy msik OO bvtse: Objective C.)
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146105. oldal
A C++ fellrl kompatibilis a C-vel, minden szablyos Cprogram egyben szablyos C++ program is, amely
-
7/26/2019 C++eavazlat-1
106/196
p g gy y p g , yugyanazt csinlja (ez csak 99,9%-ig igaz, de a 0,1% el-lenplda elg mesterklten adhat meg).
Teht a C++ :C nyelv+ objektumorientltsg
+ nhny "szintaktikai cukor" A C++ elnyei:C elnyeiaz OO programozs tmogatsval nagy programok
knnyebben rhatkminden gpre van C++-fordt
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146106. oldal
szles krben hasznljk s sok feladatcsoporthozksztettek C++-ban felhasznlhat programknyv-
-
7/26/2019 C++eavazlat-1
107/196
p g ytrakat, gy a programoznak nem kell mindig aklyhtl elindulnia.
A WWW trhdtsval jrt a Java nyelv robbansszerelterjedse, amellyel a WWW-oldalakon nemcsak stati-kus szveget s kpeket jelenthetnk meg, hanem br-mit, amit egy programozsi nyelv megenged (jtkok,animcik, adatbzis-kezels stb.). A Java nyelv a C++-bl szrmazik, annak leegyszerstse s "letiszttsa".
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146107. oldal
A C++ nyelv j lehetsgei
-
7/26/2019 C++eavazlat-1
108/196
A C++ nyelv j lehetsgeiNmelyik bvts az 1989-es ANSI C-szabvnyba isbelekerlt; ezeket a mai C (nem C++)-fordtk is isme-rik. A tovbbiakban ezekre a bvtsekre "ANSI C" je-llssel utalunk.
Megjegyzsek a C++ programszvegben
//jellel kezddnek s a sor vgig tartanak.A rgi /* ... */alak megjegyzsek is hasznlhatk.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146108. oldal
A // elnye, hogy a megjegyzst nem felejtjk el avgn bezrni.
-
7/26/2019 C++eavazlat-1
109/196
g
rdekessg: mesterklt ellenplda a C s C++ kztti
kompatibilitsra:
i=i//*megjegyzs*/2;
C-ben "i=i/2;" -t jelent, mg C++-ban "i=i;" -t!
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146109. oldal
j tpusmdost kulcsszavak
Konstans vltoz megadsa: const (ANSI C)
-
7/26/2019 C++eavazlat-1
110/196
Konstans vltoz megadsa: const(ANSI C)
int i=3; i=i+4; // rendbendeconst int i=3; i=i+4; // fordtsi hi-
ba!
Hasonlan const float f, const char *sstb.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146110. oldal
Volatile vltoz (ANSI C)
-
7/26/2019 C++eavazlat-1
111/196
volatile int i;
Azt jelenti, hogy az i vltozt nemcsak a program,hanem kls hats (pl. megszakts) is megvltoztat-hatja. Ezt az informcit a fordt optimalizlja hasz-
nlja fel; mi nem foglalkozunk vele.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146111. oldal
Hatskr-opertor: "::"
i t
-
7/26/2019 C++eavazlat-1
112/196
int n;void main() {
int n;n=4; }
A fenti programban egy globlis s egy loklis negsz vl-toz szerepel. Ez szablyos; az n=4rtkads a loklisn-re rvnyes, a loklis vltoz "elfedi" az azonos nevglo-blist.
s ha mi mgis a globlis n-et akarjuk hasznlni?
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146112. oldal
A C++-ban a ::-t a vltoz el rva a globlis vltoztkapjuk:
-
7/26/2019 C++eavazlat-1
113/196
int n;
void main(){int n;
::n=4; // a globlis n lesz 4}
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146113. oldal
Az iostreamknyvtr
Ki t b t C b tdi k t f
-
7/26/2019 C++eavazlat-1
114/196
Kimenet-bemenet: a C-ben a stdio knyvtr scanf,printf fggvnycsaldot hasznlhattuk. Emlkeztetknt
az iegsz szm kirsa soremelssel:
printf("%d\n", i);
Htrny: a kirand illetve beolvasand vltozknak meg-felel tpusokat neknk kellett a formtumszvegbe %-
jellel megadni. Ha nem a megfelel szm vagy tpus
formtumot adtuk meg, a program akr el is szllhatott.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146114. oldal
C++-ban a bartsgosabb iostream knyvtr is hasznl-
hat.(A program elejn #i l d szksges )
-
7/26/2019 C++eavazlat-1
115/196
(A program elejn #include szksges.)
A standard kimenet neve: coutA standard bemenet neve: cin
Kirs (i, jvltozk):cout j ;
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146115. oldal
A relcijelek mint nyilak irnynak logikja: az adat-ramls irnya.
-
7/26/2019 C++eavazlat-1
116/196
Fontos! Az j lehetsgek sosem jelentik azt, hogy a
rgi C-megoldsok nem hasznlhatk (legfeljebb nemclszera hasznlatuk)! A ki-bemenet programozs-ra teht a stdioknyvtr a C++-ban is rendelkezsre
ll, akr egy programon bell az iostream-mel ke-verve is.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146116. oldal
Szabadabb vltozdeklarcik
A vltozknak deklarcikor rgtn kezdrtk is adhat (ANSI C):
-
7/26/2019 C++eavazlat-1
117/196
A vltozknak deklarcikor rgtn kezdrtk is adhat (ANSI C):
float r=4.51;
A deklarcik nem csak blokk elejn helyezkedhetnek el:{int i;cin >> i;int j=i*i; //!!!cout
-
7/26/2019 C++eavazlat-1
118/196
typedef enum {...} etype;etype e; /* 'e' etype tpus vltoz */
vagyenum etype {...};enum etype e;
C++-ban gy is lehet:enum etype {...};etype e;
Struktrk definilsa hasonlan:struct styp { ... };styp s;
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146118. oldal
Dinamikus memriakezels
Emlkeztet: tmb mrete nem lehet vltoz
-
7/26/2019 C++eavazlat-1
119/196
Emlkeztet: tmb mrete nem lehet vltoz.
int a=5;
char t[a]; // hibs!
Dinamikusan lefoglalt memria: newopertor
int a=5;char *t=new char[a]; // helyes
ltalban: new tipus egy 'tipus' tpus objektumnak
helyet foglal a memriban s egy erre mutat pointert(vagyis az objektum cmt) adja vissza rtkl.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146119. oldal
A new tipus[meret] ugyanezt csinlja, csakmeretda-
rab objektumnak foglal helyet a memriban.Az gy "kzileg" lefoglalt memriaterleteket kzileg is
-
7/26/2019 C++eavazlat-1
120/196
Az gy, kzileg lefoglalt memriaterleteket kzileg iskell felszabadtani, amikor mr nincs rjuk szksgnk.
Erre j a delete(tmb esetn a delete[]) opertor.
{int i;// i-t hasznljuk...
} // a blokk vgn i lete vget r, a me-
// mriaterlete automatikusan felszabadul
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146120. oldal
Ugyanez dinamikusan:
{int *ip;
-
7/26/2019 C++eavazlat-1
121/196
int ip;ip=new int;
... // *ip-t hasznljukdelete ip; // mi magunk szabadtjuk fel// a memrit
}
Tmbbel:{int *ip; int n=15;ip=new int[n];
...delete[] ip; }
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146121. oldal
Referencia tpus vltozk
Emlkeztet(a prezentci elejrl):
-
7/26/2019 C++eavazlat-1
122/196
e tet (a p e e tc e ej )
void duplaz(int i){i*=2;
}
Ekkor int i=6; duplaz(a); hatsra artke 6 marad!
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146122. oldal
Mkdmegolds mutatkkal:
void duplaz(int *i){
-
7/26/2019 C++eavazlat-1
123/196
*i *= 2;
}Hvsa pl. int a=6; duplaz(&a);
Termszetesebb megolds referencia tpus vltozval:
void duplaz(int& i){i*=2;
}(Hasonl a Pascal cm szerinti paramtertadshoz.)
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146123. oldal
Alaprtelmezett paramterek
A fggvnyek fejben felsorolt paramtereknek konstansl t l t dh t k H k h l t l
-
7/26/2019 C++eavazlat-1
124/196
alaprtelmezst adhatunk. Hvskor - ha az alaprtelmezsmegfelel- a paramtert nem kell megadnunk. Pldul:
int novel(int mit, int mennyivel=1){return mit+mennyivel;
}
Hvsa: novel(6,3) 9, novel(6) 7
Ha egy paramternek alaprtelmezst adunk, akkor az sz-
szes utna kvetkezvel is ezt kell tennnk.Rossz: void fv(int a, int b=1, char c);
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146124. oldal
Fggvnytlterhels (overloading)
Pldul
-
7/26/2019 C++eavazlat-1
125/196
void fv(int a, char b);
void fv(char *s);Ez C-ben hiba, mert az fvfggvnyt kt klnbzmdonadtuk meg. C++-ban ez szablyos.
fv(5,'q'); // az elsdefincit hasznlja// a fordtprogram
fv("abc"); // a msodikat hasznlja
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146125. oldal
Objektum-orientlt programozs C++-ban Procedurlis programozs: a program eljrsokbl, fggvnyek-
-
7/26/2019 C++eavazlat-1
126/196
bl ll; ezek "mellesleg" adatokat vrnak paramterknt s adato-kat adnak eredmnyl.
Objektum-orientlt programozs: a program adatokbl, objektu-mokbl ll; ezeken "mellesleg" mveleteket lehet vgezni.
Mindkt szemlletben adatok s mveletek vannak, csak a hang-sly mshova helyezdik.
Rgztett, "ktblba vsett" feladatot mindkt mdon kb. ugyan-olyan knnyen lehet megoldani.
Az OO elnye a feladat megvltoztatsakor jelenik meg: a feladatkis mdostst a megold program kis mdostsval kvetni le-het (folytonossg).
Objektumok
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146126. oldal
Mi az aut?
A mszaki szakember szempontjbl: egy csom alkat-rsz
-
7/26/2019 C++eavazlat-1
127/196
rsz.
A vezetszempontjbl: olyan eszkz, amellyel menni le-het: a gzpedllal gyorsthatunk, a fkkel lassthatunk, akormnnyal kormnyozhatunk.
Nagy elnye az autnak, hogy a vezetnek nem kell tiszt-ban lennie az aut mkdsvel.
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 146127. oldal
Informatikai RendszerekIntzete
gzt_ad()Mveletek sebessg()
hely x()Bels llapot
-
7/26/2019 C++eavazlat-1
128/196
A bels llapotot csak a megadott mveleteken keresztlmdosthatjuk, illetve csak azokon keresztl tudhatjukmeg az aut belsllapott.
fkez()
balra()jobbra()
hely_x()hely_y()
irny_x()irny_y()
Belsllapot
motortengelykapcsol
Az bra az autk osztlyt jelkpezi; ennek megfelel
au-tpldnyok ltezhetnek.Egy anevaut felgyorstsa 80 km/h-ra:
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146128. oldal
Auto a;while(a.sebesseg()
-
7/26/2019 C++eavazlat-1
129/196
_
A fenti rvid programot az is meg tudja rni, aki nemismeri azAutoosztly megvalstst.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146129. oldal
OsztlyokA C struktrkhoz hasonl szintaxissal adhatk meg a
-
7/26/2019 C++eavazlat-1
130/196
gC++ osztlyok.
struct rek // rek tpus{int a;float f;
};rek r; // r egy rek tpus vltoz
r.a=3;
-
7/26/2019 C++eavazlat-1
131/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146131. oldal
A rek struktrnak valban pontosan megfelelrecosz-
tly:class rec { // rec tpus
bli
-
7/26/2019 C++eavazlat-1
132/196
public:
int a;float f;};
Apublic:utn felsorolt vltozk "publikusak", azaz egyrec tpus objektum as fmezjt szabadon felhasznl-hatom. Apublic: prja aprivate:. Aprivate: utn
kvetkez adatok nem hozzfrhetek (az eddig megis-mert mdokon). Az osztlydefinciban aprivate: azalaprtelmezs, ezrt kellett apublic:kulcsszt kirnunk.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146132. oldal
class cl
{int a;
public:
-
7/26/2019 C++eavazlat-1
133/196
public:
int b;private:int c;
};
cl v;v.a=1; v.b=2; v.c=3;Csak a kzpsrtkads szablyos, a tbbi hibt ad!
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 146133. oldal
Informatikai RendszerekIntzete
Egyszerplda: ember-osztly s kt ember-objektum.
#include class ember{
Kovacs.kor=43;Szabo.nev="Szab Jnos";S b k 25
-
7/26/2019 C++eavazlat-1
134/196
{
public:char *nev;int kor;
};
void main(){ember Kovacs, Szabo;Kovacs.nev="Kovcs Ilona";
Szabo.kor=25;
cout
-
7/26/2019 C++eavazlat-1
135/196
(n. metdusokat) is megadhatunk.
class ember {public:
char *nev;
int kor;void kiir();};void ember::kiir()
{
cout
-
7/26/2019 C++eavazlat-1
136/196
meg.
A metdus (fggvny) tnyleges megvalstsakor aneve el rjuk az osztlynevet s egy "::"-ot. A metdus megvalstsban az osztly vltozira sza-
badon hivatkozhatunk. A metdust objektum.metodus(param...) alakban
hvjuk meg.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146136. oldal
A metdusok a privt adattagokra is hivatkozhatnak!
Pl. Aut osztly:class Auto {public:
if(seb>120) seb=120;}
-
7/26/2019 C++eavazlat-1
137/196
public:void gazt_ad();void fekez();float sebesseg();
private:float seb;
};void Auto::gazt_ad(){
seb=seb+5;
}void Auto::fekez(){seb=seb-10;if(seb
-
7/26/2019 C++eavazlat-1
138/196
Pl.Auto a; a.seb=50;szablytalan. Ez a valsgban is
gy van; a sebessget nem llthatjuk tetszs szerint. Tehtaz adattagok privtknt val definilsval utnozhatjuk avalsg ktttsgeit.
Megjegyzs: a gzads elg egyszeren lett megvalstva;a valdi aut nem egyenletesen gyorsul. A modellt lehetfinomtani, mikzben azAutoosztly hasznlja ugyanazt
ltja (ti. a gzt s a fket).
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146138. oldal
KonstruktorokAuto a;t
-
7/26/2019 C++eavazlat-1
139/196
cout
-
7/26/2019 C++eavazlat-1
140/196
;}...
Auto a(30); // egy j "a" aut,// 30 km/h sebessggel
Megjegyzs: a fggvnytlterhels lehetsge itt is fenn-ll, teht egy osztlyhoz tbb, klnbzparamterezskonstruktor is tartozhat.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146140. oldal
DestruktorA konstruktor "ellentte", az objektum megsemmislse-kor hvdik meg automatikusan Clja a "rendraks"
-
7/26/2019 C++eavazlat-1
141/196
kor hvdik meg automatikusan. Clja a rendraks .
A destruktormetdus neve: egy ~jel utn az osztly neve.Paramtere nincs.Pl.
Auto::~Auto(){seb=0;
}
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146141. oldal
Objektumok dinamikus helyfoglalsaUgyanolyan, mint az elre definilt tpusoknl (new, delete).
-
7/26/2019 C++eavazlat-1
142/196
Auto *ap;ap=new auto(10);ap->gaz();cout sebesseg();delete ap;
A -> opertort osztlyra (vagy struktrra) mutat pointe-
reknl hasznljuk. Jelentse: a->bugyanaz, mint (*a).b
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146142. oldal
rkl
dsAz OO programnyelvek ereje akkor mutatkozik meg, ami-kor egy mr megoldott feladathoz hasonlt kell megoldani
-
7/26/2019 C++eavazlat-1
143/196
kor egy mr megoldott feladathoz hasonlt kell megoldani.
Az OO programozs tmogatja a meglvkd jrafelhasz-nlst (vagyis hogy ugyanazt a kdot ne kelljen tbbszrmegrnunk).A "hasonlsg" egy gyakori esete a specializci.
Plda: Kutya osztly"Definci": A kutynak ngy lba van s ugat.
Valjban ezt gy rtjk, hogy a kutya olyan emls (eset-leg ragadoz), amelynek ngy lba van s ugat. Ezrt azemls ltalnos tulajdonsgait kln nem soroljuk fel.
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 146143. oldal
Informatikai RendszerekIntzete
Emls
()
mretsly
Osztlynv
Adattagok
brzolsa:
-
7/26/2019 C++eavazlat-1
144/196
megy()
eszik()
Kutya
ugat()
harap()
lbszmhanger
g
Metdusok
rkls
A kutya osztly do-bozban nem rjuk kikln az emls jel-lemzit; azok meg-
ltt az rkldstjelznyl fejezi ki.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146144. oldal
A C++ definci:
class Emlos {public:
-
7/26/2019 C++eavazlat-1
145/196
Emlos(float mer, float su);float merete();float sulya();void megy();
void eszik();private:float meret;float suly;
};
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146145. oldal
class Kutya : public Emlos
{public:Kutya(float mer, float su, float hang);void ugat();
-
7/26/2019 C++eavazlat-1
146/196
void ugat();
void harap(Emlos& em);float hangereje();private:
float hangero;
};...Kutya bodri(0.7, 12, 5);
bodri.eszik();bodri.ugat();
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146146. oldal
A "class Kutya : public Emlos" sor jelentse: a
Kutyaosztly az Emlos tulajdonsgait s metdusaitrkli. Apublickulcssz jelentse itt: az osztly ada-tainak s metdusainak hozzfrsi jogai megmarad-
-
7/26/2019 C++eavazlat-1
147/196
tainak s metdusainak hozzfrsi jogai megmarad-
nak (apublic publicmarad a kutya osztlyban is).
Lehetett volna emlsosztly nlkl is definilni a ku-
tyt, az sszes adatt s metdust egy osztlydefin-ciban megadva. A mi megoldsunk elnyei:
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146147. oldal
Ha definilni akarunk egyMacskaosztlyt is, akkor nem
kell a semmibl indulunk; az Emlososztlybl kiindulvaelg a csak a macskra jellemz dolgokkal foglalkoz-nunk.
-
7/26/2019 C++eavazlat-1
148/196
Ha tovbbi (emls) llatfajokat definilunk hasonlan,majd esznkbe jut egy j tulajdonsg, amely mindenemlsre rvnyes, akkor elg az Emlososztlyt mdos-tani; a vltozs az rklsen keresztl minden fajt rin-teni fog.
Ksbb ltni fogjuk, hogy ahol a programban Emlos t-pus adatot vrunk, oda nemcsak emls, hanem kutya-
s macskapldnyokat is behelyettesthetnk.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146148. oldal
Vdett (protected) adatokAz osztlypublic tagjai (adatai s metdusai) minden-honnan hozzfrhetk.
-
7/26/2019 C++eavazlat-1
149/196
honnan hozzfrhetk.
Az osztlyprivate tagjait csak az osztly metdusai r-hetik el.Az rkls egy sajtos kapcsolat kt osztly kzt, pldula Kutya kzelebb ll az Emlos-hz, mint egy ms, "vad-idegen" osztlyhoz. Az Emlos privt tagjait mg a Kutyasem ltja! Aprotectedtagokhoz csak az osztly s annakleszrmazottai frhetnek hozz.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146149. oldal
Plda:
class A {public:
void metodus();
class B : public A {public:
void met();
-
7/26/2019 C++eavazlat-1
150/196
protected:int adat1;int get_adat2();
private:
int adat2;};int get_adat2(){ return adat2; }
};void B::met(){cout
-
7/26/2019 C++eavazlat-1
151/196
senki, csak azAosztly metdusai.
Teht a hozzfrsi jogosultsgok:
osztly-
metdusban
leszrm.
metdusban
mshol
public X X Xprotected X Xprivate X
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146151. oldal
Polimorfizmus
Hizlaljunk fel egy emlst legalbb 50 kilra!
void hizlal(Emlos& e)
-
7/26/2019 C++eavazlat-1
152/196
void hizlal(Emlos& e){while( e.sulya()
-
7/26/2019 C++eavazlat-1
153/196
ltalban nem emlskkel, hanem konkrt kutykkal smacskkkal foglalkozunk. (Vagy - hizlalsrl lvn sz -disznkkal.) Teht kellenek a
void hizlal(Kutya& e)void hizlal(Macska& e)void hizlal(Diszno& e) stb.
fggvnyek.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146153. oldal
Szerencsre nem kell minden faj osztlyra kln definil-
ni a fggvnyt. A C++-ban ugyanis egyA&tpus vltozbanem csakA osztly objektumokat helyettesthetnk be,hanem tetszlegesA-bl szrmaz osztlyt is. Hasonl-
-
7/26/2019 C++eavazlat-1
154/196
kppen egyA *pointer mutathatA-bl leszrmaz objek-tumra is.
Plda:
Emlos *ep;ep=new Kutya(0.5, 10, 3);ep->megy();
delete ep;
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 146154. oldal
Informatikai RendszerekIntzete
Metdusok felldefinilsaAz rkls sorn nem csak j adat- s metdus-tagokatvehetnk fel, hanem a meglvmetdusokat is felldefini-
-
7/26/2019 C++eavazlat-1
155/196
lhatjuk. void Emlos::eszik(){ suly += 1; }
class Elefant : public
Emlos { ...void eszik();... };
void Elefant::eszik(){ suly += 10; }
Pldul:
class Emlos {...void eszik();...
};
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146155. oldal
Krds: Mennyit hzik Trombi?
void zabal(Emlos *em){
-
7/26/2019 C++eavazlat-1
156/196
em->eszik();em->eszik();em->eszik();
}Elefant trombi;zabal(&trombi);
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146156. oldal
Jzan sszel szmolva 30 kilt. A C++ azonban a
zabal() fggvnyben az Emlos osztly eredeti defi-ncijt veszi figyelembe, ezrt Trombi csak 3 kilt h-zik. Ahhoz, hogy mindig az adott aktulis osztlynak
-
7/26/2019 C++eavazlat-1
157/196
megfelel definci aktivizldjon, a metdust virtu-lisnak kell deklarlni:
class Emlos {...virtual void eszik();...
};
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146157. oldal
gy mdostva mr a vrakozsunknak megfelelen mk-
dik a program. klszably: minden olyan metdus dekla-rcija el rjuk ki a virtualkulcsszt, amelyet vrhatana leszrmazott osztlyokban fell fogunk definilni.
-
7/26/2019 C++eavazlat-1
158/196
Megjegyzs: a C++ a C nyelv OO bvtse. Az eleve objek-tum-orientltra tervezett "tiszta" OO nyelvek-ben a virtulissg az alaprtelmezs, gy eztnem kell kln kulcsszval jelezni:
void Elefant::eszik(){
suly += 10;
}
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146158. oldal
Az elefnt tzszer annyit eszik, mint az tlag emls. Ezt gy
is kifejezhetjk, hogy az Emlosevmetdust az elefnttaltzszer hajtatjuk vgre:
void Elefant::eszik() {
-
7/26/2019 C++eavazlat-1
159/196
int i;for(i=1; i
-
7/26/2019 C++eavazlat-1
160/196
public:Emlos(float mer, float su);...
};
class Kutya : public Emlos{public:
Kutya(float mer, float su, float hang);... };
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146160. oldal
A kutya konstruktora ugyanazt csinlja, mint az emls s
mg valamit. Az emlssel kzs rszt kr lenne mg egy-szer lerni. A konstruktor defincijakor megadhat, hogyaz sosztly konstruktora hogyan aktivizldjon:
-
7/26/2019 C++eavazlat-1
161/196
Emlos::Emlos(float mer, float su){meret=mer;suly=su;
}Kutya::Kutya(float mer, float su,
float hang) : Emlos(mer, su)
{ hangero=hang; }
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146161. oldal
A thispointer
A metdusdefincikban hasznlhatjuk a this vlto-zt, amely mindig az aktulis objektumra mutat. Val-
-
7/26/2019 C++eavazlat-1
162/196
jban implicit mdon gyakran felhasznljuk:adattag=ertek;
ugyanaz, mint
this->adattag=ertek;
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146162. oldal
Tbbszrs rkldsrklssel nemcsak egy osztlyt bvthetnk, finomtha-tunk, hanem tbb osztly tulajdonsgait is egyesthetjk.
-
7/26/2019 C++eavazlat-1
163/196
class Auto{public:
void gazt_ad();void fekez();float sebesseg();
protected:
float seb; };
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146163. oldal
class Raktar {
public:void bepakol(Aru& a);void kipakol();int hely();
-
7/26/2019 C++eavazlat-1
164/196
protected:...
};class Teherauto:public Auto, public Raktar { };Teherauto ifa; Aru a;ifa.bepakol(a);
ifa.gazt_ad();
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146164. oldal
A Windows programozsa Borland C++ -ban
Esemnyvezrelt programok
Ha emberi nyelven elmondjuk, hogy mit csinl egy
-
7/26/2019 C++eavazlat-1
165/196
program, ilyen mondatokat hasznlunk:
"Ha megnyomom a gombot, akkor ez trtnik."
"Ha elhzom az egeret, az trtnik.""Ha kivlasztom a menbl X-et, amaz trtnik."
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146165. oldal
A hagyomnyos programokban a programoz dntt-te el, hogy hol s milyen mdon kr adatokat a fel-hasznltl. Ennek elnye a nagyobb szabadsg, ht-
-
7/26/2019 C++eavazlat-1
166/196
y gy g,rnya viszont, hogy gyakran a program irnytja ahasznljt, nem pedig fordtva. Msrszt szinte min-den program ms megoldst hasznl az adatbevitelre,
gy a felhasznlnak nehezebb a dolga.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146166. oldal
Az esemnyvezrelt rendszerekben, mint amilyen a Win-
dows, a rendszer maga megoldja, hogy a felhasznl be-avatkozsainak - az esemnyeknek - hatsra a megfelelprogramrsz lefusson. A program lelke az esemnyciklus,amelynek vza gy nzhet ki:
-
7/26/2019 C++eavazlat-1
167/196
Esemeny e;while(1) {
e=kovetkezo_esemeny();
dolgozd_fel(e);}
Mivel ez a ciklus a rendszer rsze, a programjainkban nem
kell kln megrni.
-
7/26/2019 C++eavazlat-1
168/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146168. oldal
Mirt objektumorientlt?
Az ablakoz rendszerek egyik nagy elnye az egys-gessg. Minden program hasonlan nz ki s hason-lan kezelhet. Pldul minden programablak moz-
-
7/26/2019 C++eavazlat-1
169/196
gathat, tmretezhet. Ez arra emlkeztethet, minthalenne egy mozgathat, mretezhet osztly, s akonkrt programok ezt hasznlnk fel, ezt tltenk
meg tartalommal.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146169. oldal
A Windowsban nemcsak a fprogramok ablakok, ha-
nem a nyomgombok, menelemek, inputsorok is!
"A nyomgomb olyan ablak, amely egrkattintsra
-
7/26/2019 C++eavazlat-1
170/196
csinl valamit.""A fablak olyan ablak, amelynek kerete van s moz-gathat." stb.
A rendszer elemei gy egy hatalmas osztlyhierarchitalkotnak.
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 146170. oldal
Informatikai RendszerekIntzete
Egy msik hierarchia az ablakok kzt szemmel is lt-
hat: egy ablak jabb ablakokat tartalmazhat. Az ablak"szlje" a benn lev"gyerekablakoknak".
-
7/26/2019 C++eavazlat-1
171/196
Pldul a Borland C++ fejleszt i krnyezete:
A gyerekablak sosem "lg ki" a szlterletbl.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146171. oldal
Minimlis OWL program (egy res ablakot jelent meg):
#include
-
7/26/2019 C++eavazlat-1
172/196
int OwlMain(int argc, char *argv[]){TApplication app("OWL miniprogram");return app.Run();
}
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146172. oldal
main fggvny helyett az OwlMain a program f fgg-
vnye Egy Windows program elindtsa nem egyszer, sok
mindent be kell lltani. Ezeket a TApplicationosztly
-
7/26/2019 C++eavazlat-1
173/196
"tudja"; neknk csak ltre kell hozni egy ilyen tpus ob-jektumot, s meghvni a Run()metdust. A TApplication hasznlathoz szksg van az include-fjlra. A TApplication konstruktornak paramterknt meg-
adhat (nem ktelez) egy string; ez lesz az ablak fejl-cre cmknt rva.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146173. oldal
Hogyan tovbb?
A TApplicationosztly nmagban csak egy keret;kzvetlen felhasznlsval csak a fentihez hasonl"res" programok kszthetk. Valjban a
-
7/26/2019 C++eavazlat-1
174/196
TApplication tele van olyan virtulis metdusokkal,amelyek nem csinlnak semmit. rtelmes programotgy rhatunk, ha a TApplication-bl rkltetnk
egy osztlyt, amelyben a megfelel metdusokat fe-lldefiniljuk.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146174. oldal
Bevezetplda: a semmittevprogram bonyolultabb,
de tovbbfejleszthetvltozata.
#include
#i l d l\f i h
-
7/26/2019 C++eavazlat-1
175/196
#include class SajatApp : public TApplication {
public:SajatApp();void InitMainWindow();
};
-
7/26/2019 C++eavazlat-1
176/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete Tantrgy:A C++ nyelv Kdszm: 146176. oldal
Definiltunk egy j osztlyt (SajatApp). Az
InitMainWindow() akkor hajtdik vgre, amikor aprogram f ablakt ltre kell hozni. Ezt mi felldefi-niltuk; a f ablak egy keretes ablak (TframeWin-
d ) A TF Wi d k t kt k l
-
7/26/2019 C++eavazlat-1
177/196
dow). A TFrameWindow konstruktornak els para-mtere egy szlablakra mutat pointer; azrtNULL,mert a fablakunk nem egy msik ablak rsze.
A SajatApp konstruktora semmit nem csinl, csakmeghvja az sosztly konstruktort.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete Tantrgy:A C++ nyelv Kdszm: 146177. oldal
Furcsa lehet, hogy olyan metdust definilunk
(InitMainWindow()), amelyre aztn sehol sem hi-vatkozunk. Persze: a TApplication-bl rkltRun()metdus az, amely valjban meghvja az
I itM i Wi d () t
-
7/26/2019 C++eavazlat-1
178/196
InitMainWindow()-t.Az els pldnk azrt nem csinlt semmit, mert aTApplicationcsak egy res keretprogramot adott.
A mostani azrt, mert a TFrameWindowmint fablakszintn csak egy semmit nem csinl alaprtelme-zs. A kvetkezpld-ban egy sajt ablakosztlyt de-
finilunk, amely mr reagl az egrgombnyomsra.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete Tantrgy:A C++ nyelv Kdszm: 146178. oldal
#include #include
class SajatWin : public TWindow {public:
SajatWin(TWindow *szulo=NULL);protected:
-
7/26/2019 C++eavazlat-1
179/196
protected:void EvLButtonDown(UINT u, TPoint& p);
DECLARE_RESPONSE_TABLE(SajatWin);};DEFINE_RESPONSE_TABLE1(SajatWin, TWindow)EV_WM_LBUTTONDOWN,
END_RESPONSE_TABLE;
Gbor Dnes Fiskola
Informatikai RendszerekIntzete Tantrgy:A C++ nyelv Kdszm: 146179. oldal
void SajatWin::EvLButtonDown(UINT u,TPoint& p){MessageBox("Megnyomtad a bal egrgombot.",
"Cm", MB_OK);}
SajatWin::SajatWin(TWindow *szulo)
-
7/26/2019 C++eavazlat-1
180/196
SajatWin::SajatWin(TWindow *szulo){ Init(szulo, 0, 0); }
class SajatApp : public TApplication {public:
SajatApp();void InitMainWindow();
};
Gbor Dnes Fiskola
Informatikai RendszerekIntzete Tantrgy:A C++ nyelv Kdszm: 146180. oldal
SajatApp::SajatApp() : TApplication(){ }
void SajatApp::InitMainWindow(){SetMainWindow(new TFrameWindow(NULL,"Itt a program neve" new SajatWin));
-
7/26/2019 C++eavazlat-1
181/196
Itt a program neve , new SajatWin));}
int OwlMain(int argc, char *argv[]){SajatApp app;return app.Run();
}
Gbor Dnes Fiskola
Informatikai RendszerekIntzete Tantrgy:A C++ nyelv Kdszm: 146181. oldal
A program a bal egr lenyomsra kir egy zenetet.
A SajatApposztly annyit vltozott, hogy a benneltrehozott TFrameWindow konstruktorban egy
harmadik paramtert is megadtunk Ez a paramter
-
7/26/2019 C++eavazlat-1
182/196
harmadik paramtert is megadtunk. Ez a paramteregy TWindow-ra (vagy leszrmazottjra) mutat po-inter, itt egy j, SajatWin osztly objektumot ad-
tunk meg. gy a fkeretablak tnyleges tartalma ez aSajatWinobjektum lesz.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete Tantrgy:A C++ nyelv Kdszm: 146182. oldal
Esemnykezel ablakok osztlydefincijban szksg
van a DECLARE_RESPONSE_TABLE(AblNv); deklarci-ra.
ADEFINE RESPONSE TABLE1(SajatWin TWindow)
-
7/26/2019 C++eavazlat-1
183/196
DEFINE_RESPONSE_TABLE1(SajatWin, TWindow)EV_WM_LBUTTONDOWN,END_RESPONSE_TABLE;
jelentse: a SajatWinaz osztlynv, a TWindowaz sosz-tly, az EV_WM_LBUTTONDOWN a kezelend esemny neve(az t lekezel virtulis fggvny neve pedigEvLButtonDown).
Gbor Dnes Fiskola
Informatikai RendszerekIntzete Tantrgy:A C++ nyelv Kdszm: 146183. oldal
A Resource WorkshopEgy programnak jl elklntheten kt rsze van: egy bel-s mveletvgz rsz, amelynek felptse nem rdekli afelhasznlt, s a felhasznli fellet, amelyen keresztl aprogram hasznlja megadja a kvnsgait s ahol az
-
7/26/2019 C++eavazlat-1
184/196
program hasznlja megadja a kvnsgait, s ahol azeredmny megjelenik.
A felhasznli fellet elksztse nagy mrtkben automa-tizlhat. A Resource Workshop (Erforrs Mhely) segt-sgvel szinte megrajzoljuk a felletet, a programszveg-ben nem kell a megjelentend mezk elhelyezkedsvelfoglalkoznunk; csak egy azonostval hivatkozunk aWorkshopban ltrehozott felletre.
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 146184. oldal
Informatikai RendszerekIntzete
-
7/26/2019 C++eavazlat-1
185/196
Gbor Dnes Fiskola
Informatikai RendszerekIntzete Tantrgy:A C++ nyelv Kdszm: 146185. oldal
Egy program ltrehozsnak lpsei:
Az alap keretprogram megrsa (ez az OwlMainfggvnyt s - a mi esetnkben - a SajatApp
osztlyt jelenti)
-
7/26/2019 C++eavazlat-1
186/196
osztlyt jelenti).
A felhasznli fellet elksztse a Resource
Workshoppal. Az esemnykezels megrsa.
Gbor Dnes Fiskola
Informatikai RendszerekIntzete Tantrgy:A C++ nyelv
Kdszm: 146186. oldal
Plda: sebessg tszmtsa km/h s mph kztt.
Az alap keretprogram:class SajatApp : public TApplication {
public:SajatApp();
-
7/26/2019 C++eavazlat-1
187/196
SajatApp();void InitMainWindow();
};
SajatApp::SajatApp() : TApplication(){}
Gbor Dnes Fiskola
Informatikai RendszerekIntzete Tantrgy:A C++ nyelv
Kdszm: 146187. oldal
void SajatApp::InitMainWindow(){SetMainWindow(new TFrameWindow(NULL,"Sebessg-tszmt",new SajatDialog(0, DIALOGUS)));
}
-
7/26/2019 C++eavazlat-1
188/196
}
int OwlMain(int argc, char *argv[]){SajatApp app;return app.Run();
}
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146188. oldal
Az egyetlen jdonsg a fablak; egy SajatDialogosztly ablak. Ezt az osztlyt ksbb hozzuk ltre, ahozz tartoz felletet pedig a Resource Workshoppalksztjk el. A DIALOGUS paramter egy azonost,
-
7/26/2019 C++eavazlat-1
189/196
ksztjk el. A DIALOGUS paramter egy azonost,amellyel a RW-ban ltrehozott felletet jelljk meg.
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 146189. oldal
Informatikai RendszerekIntzete
A felhasznli fellet elksztse a Resource Workshoppal:
-
7/26/2019 C++eavazlat-1
190/196
Gbor Dnes Fiskola
Tantrgy:A C++ nyelv Kdszm: 146190. oldal
Informatikai RendszerekIntzete
A programunk fellete egy dialgusablak lesz, benne kt
inputsorral s kt gombbal; a fels
sorban a sebessgkm/h szerint jelenik meg, az alsban mph szerint, a ktgomb pedig a ktirny konverzit vgzi el:
-
7/26/2019 C++eavazlat-1
191/196
A resource magyarul erforrst jelent. A Windowsban er-forrsnak nevezik a menket, a dialgusablakokat selemeiket, a kpeket, ikonokat stb. Ahhoz, hogy a prog-
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146191. oldal
ramban hasznlni tudjuk az erforrsokat, hivatkozni kell
tudnunk rjuk. A RW-ban minden er
forrshoz egy egszszm illetve egy azzal megegyezrtkkonstansszimb-lum rendelhet.
A mi programunkban az erforrsok s szimblumaik:Di l bl k DIALOGUS
-
7/26/2019 C++eavazlat-1
192/196
p gDialgusablak - DIALOGUSKm/h inputja - KMH_EDIT
Km/h gombja - KMH_CONVMph inputja -MPH_EDITMph gombja -MPH_CONV
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146192. oldal
A RW generl egy .rh kiterjeszts fejlcfjlt, amelyben
ezeket a konstansokat definilja. Ezt clszer
a progra-munkban #include-dal beolvasni.
Az esemnykezels megrsa.
#include "atvalt.rh"
-
7/26/2019 C++eavazlat-1
193/196
#
class SajatDialog : public TDialog {
public:SajatDialog(TWindow *par, int resid)
: TDialog(par, resid)
Gbor Dnes Fiskola
Informatikai RendszerekIntzete
Tantrgy:A C++ nyelv Kdszm: 146193. oldal
{
mph=new TEdit(this, MPH_EDIT);kmh=new TEdit(this, KMH_EDIT);}