You are on page 1of 196

GBOR DNES

FISKOLA

PREZENTCI
A C++ nyelv (146)
Vezettanr: goston Gyrgy
2004/2005
5. szemeszter

192 lap

Tantrgy: A C++ nyelv Kdszm: 146


1. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A vezettanr:

goston Gyrgy
tel: (1) 436-6556
e-mail: agoston@gdf-ri.hu
A GDF hivatalos honlapja:
www.gdf.hu

Tantrgy: A C++ nyelv Kdszm: 146


2. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Segdanyagok
Tantrgyi tmutat, tanknyv, prezentci, videofilm (2 kazetta: a
C nyelv s a C++ nyelv), pldaprogramok (a gyakorlatok s a videofilm anyaga) fjlban.
Kvetelmny: egy ktelez zrthelyi.
Jegy megszerzse: vizsgn vlaszthat nehzsg program rsa
(mdostsa) vagy otthon elksztett feladat bemutatsa.
A prezentci felptse:
1. A C nyelv
2. A C++ nyelv

Tantrgy: A C++ nyelv Kdszm: 146


3. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Bevezets
A C nyelv rvid trtnete
1969: UNIX opercis rendszer, Bell Laboratories
1970-74: Dennis Ritchie megtervezi a C nyelvet, s a UNIX-ot trjk 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 program
nincs gphez s opercis rendszerhez ktve.
1980-as vek vge: n az n. objektum-orientlt szemllet npszersge, megjelennek a C nyelv OO kiterjesztsei: C++,
Objective C.

Tantrgy: A C++ nyelv Kdszm: 146


4. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Nhny C fejleszti
krnyezet

Tantrgy: A C++ nyelv Kdszm: 146


5. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A C elnyei

ANSI C, UNIX C, Turbo C

Szabvnyos, ezrt hordozhat program rhat vele;


Npszersge miatt minden gpre s rendszerre ltezik 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 rugalmassg szerencss tvzett nyjtja, de a rugalmassgbl addan knny vele ttekinthetetlen, mdosthatatlan, rejtlyes hibktl hemzseg
programot rni!

Tantrgy: A C++ nyelv Kdszm: 146


6. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

jsghirdetsek, 1999.

Elektronikus hirdets (2000. nyr, www.vbuster.hu)

Tantrgy: A C++ nyelv Kdszm: 146


7. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A C program alapszerkezete
/* C alapprogram */
#include <stdio.h>
int main(void)
{
printf("Hell vilg!\n");
return 0;
}

Tantrgy: A C++ nyelv Kdszm: 146


8. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Szkzk s res sorok szabadon elhelyezhetk, gy tagolhat 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;
}

Tantrgy: A C++ nyelv Kdszm: 146


9. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Az alapvet vltoztpusok
(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";

Tantrgy: A C++ nyelv Kdszm: 146


10. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Azonostk, vltozdeklarci
Minden vltozt hasznlat eltt deklarlni kell! A deklarci alakja:
tpus nv;
vagy
tpus 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 klnbz vltoz */

Tantrgy: A C++ nyelv Kdszm: 146


11. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Kifejezsek
Aritmetikai opertorok
Alapmveletek: + - * /
Ritka lehetsg magas
Negci: szint nyelvben! A ki Maradkos oszts: %
lp bitek elvesznek, a
msik oldalrl 0 jn be,
Plda: 11%4 3
azaz 2 hatvnyaival tu Bitenknti eltolsok: >> <<
dunk szorozni, illetve
Pl: 7<<2 28
lekerektve osztani.
35>>1 17
Plda sszetett aritm. kifejezsre: (-a+b)*(a%(c-12))

Tantrgy: A C++ nyelv Kdszm: 146


12. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Logikai opertorok
rtkk 1 vagy 0 (igaz vagy hamis), elgazsok s ciklusok feltteleiben hasznlatosak.
logikai tagads: !
Pl: !10 !01
egyenlsgvizsglat: == !=
Pl: 26==261 (igaz)
27!=270 (hamis)
relcik: < > <= >=
Pl: 5>8 0 (hamis)
2<=2 1 (igaz)

logikai s, vagy: && ||


Pl: 1&&0 0 (hamis)
1||0 1 (igaz)
rvidzr: x||y++ -nl ha
x<>0 y nem lptetdik!!!
plda sszetett logikai kifejezsre:
(a>b)||((a==b)&&(c>d))

Tantrgy: A C++ nyelv Kdszm: 146


13. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

rtkad opertorok
A C-ben az rtkads is opertor, azaz kifejezsen bell
hasznlhat!
Az rtkadsok - mint kifejezsek - ltalban a vltoz j
rtkt adjk vissza. Plda: a=(b+5) kifejezs rtke b+5
lesz, s mellesleg az a vltoz 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 */

Tantrgy: A C++ nyelv Kdszm: 146


14. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

rtkmdosts:
+= -= *= /= %= >>= <<=
Pl. a+=4 ugyanaz, mint a=a+4
c*=2 ugyanaz, mint c=c*2 , csak a kd gyorsabb lesz.
Nvels, cskkents: ++ -Pl. a++ hatsra az a rtke 1-gyel n.
Kt vltozat: a++ illetve ++a. A klnbsg: a mindenkppen
n eggyel, de a++ az a eredeti, ++a pedig az j rtkt jelenti!
A "--" hasonl mdon cskkenti a vltoz rtkt.
Pldul int a=5; utn:
b=a++ a-bl 6 lesz, b-bl 5 (postfixes alak)
b=++a mindkett 6 lesz (prefixes alak)
A C nyelv tmr, 1-1 utastssal egyszerre tbb
dolgot vgezhetnk el!

Tantrgy: A C++ nyelv Kdszm: 146


15. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Egyb opertorok
* & (lsd majd a mutatknl)
Bitenknti s, vagy, kizr vagy, negls: & | ^ ~
Pl. 6&3 2
6=110
3=011
6|3 7
& 010
6^3 5
| 111
~6 -7
^ 101

2
7
5
~ 11111001 -7

Feltteles opertor:
f ? b : c rtke ha f igaz (<>0), akkor b, klnben c
Plda: a<b ? b : a rtke a s b nagyobbika
Felsorols opertor (vesszopertor): ,
kif1,kif2 hatsra kif1, majd kif2 kirtkeldik, az eredmny
kif2 lesz. Plda: (c=5),(c+1) eredmnye 6.
Plda: int x=6; x=(x=6,x==6); utn x=1 lesz!

Tantrgy: A C++ nyelv Kdszm: 146


16. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Precedencia
sszetett kifejezseknl a szmolsi sorrendet hatrozza meg,
zrjelezssel fellbrlhat.
Cskken sorrendben az opertorok precedencija:
1. !,++,--,- (negci, 2s komplemens), ~ (bitenknti negci, 1s komplemens), * (pointer), & (cmkpzs)
2. *,/,% (szorzs, oszts, maradkkpzs)
3. +,4. <<,>> (bitlptets)
5. <,<=,>,>=

Tantrgy: A C++ nyelv Kdszm: 146


17. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

6. ==,!=
7. & (bitenknti s - AND)
8. ^ (bitenknti kizr vagy - XOR)
9. | (bitenknti vagy - OR)
10. && (logikai s)

11. || (logikai vagy)


12. ?: (feltteles op.)
13. =,+=,-= stb.
14. , (vesszopertor)

Az egy sorban szerepl mveletek precedencija azonos.


Az azonos precedencij mveletek ltalban balrl jobbra
csoportostdnak, pl. a-b-c ugyanaz, mint (a-b)-c.
KIVTEL az 1., 12., 13. osztly, amelyeken bell a csoportosts jobbrl balra trtnik, pl. a=b=0 ugyanaz, mint a=(b=0).
Nem hiba, ha az egyrtelmsg kedvrt felesleges zrjeleket runk a kifejezsbe, pl. (a>b) || ((a==b) && (c>d)).

Tantrgy: A C++ nyelv Kdszm: 146


18. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

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:
A {} zrjelpr hasonl a Pascal
{
BEGIN..END-jhez, de a } eltti
deklarcik;
utols utastst is ;-vel le kell zrutastsok;
ni, a } utn viszont nem kell a ; !
}

Tantrgy: A C++ nyelv Kdszm: 146


19. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Feltteles utasts
Alakjai:
if(felttel) utasts;
if(felttel) ut1; else ut2;
Megjegyzsek:
Pascalban TILOS!
A felttel ktelezen zrjelben van.
Az utasts tbbnyire sszetett utasts, ilyenkor nem kell utna a ;
Plda: a s b nvekv sorrendbe rendezse
if(a>b)
A blokk belsejben ideig{
lenes vltozt deklarlunk!
int t;
t=b; b=a; a=t;
}

Tantrgy: A C++ nyelv Kdszm: 146


20. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Plda: Mennyi lesz x rtke?


int x=2;
if(x=3) x+=1;

GYAKORI HIBA!
Az = s ==
mst jelent!

int x=2;
if(x==3) x+=1;
A megolds: els esetben x=4, a msodiknl x=2.

Tantrgy: A C++ nyelv Kdszm: 146


21. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Ciklusok

Mindhrom esetben
kilps, ha a felttel
Alakja: while(felttel) utasts;
HAMIS!
Elltesztel ciklus.
Plda: faktorilis kiszmolsa (f n!):
While-ciklus

{ int f,i,n;
f=1;i=2;n=5;
while(i<=n) f*=i++; }
Do-ciklus
Alakja: do utasts; while(felttel);
Htultesztel ciklus, a ciklusmag legalbb egyszer vgrehajtdik. Ms nyelvek UNTIL ciklusaival ellenttben akkor r vget, ha felttel hamis!

Tantrgy: A C++ nyelv Kdszm: 146


22. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

For-ciklus
Alakja: for(kezdrtk;felttel;nvels) utasts;
Ugyanaz, mint:
kezdrtk;
while(felttel)
{ utasts;
nvels;
}

Vgtelen ciklusok:

for(;;) utasts;
while(1) utasts;
do utasts; while(1);

Plda: ciklus m-tl n-ig: for(i=m; i<=n; ++i) utasts;


Plda: faktorilis kiszmtsa for ciklussal (f n!)
{ int f,i,n;
f=1;n=5;
for(i=2; i<=n; ++i) f*=i;
}

Tantrgy: A C++ nyelv Kdszm: 146


23. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Tbb irny elgazs


Alakja:
switch(kif)
{
case eset1: utastsok1;
case eset2: utastsok2;
(...)
default: utastsok;
}
ahol kif egy egsz kifejezs.
A megfelel eset - case - vgrehajtsa utn a program
vgrehajtja a kvetkez eset(ek)et is! Megolds: break.

Tantrgy: A C++ nyelv Kdszm: 146


24. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

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.

Tantrgy: A C++ nyelv Kdszm: 146


25. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Plda: jtkprogram billentykezelsnek vzlata


switch(gomb)
{
case 'b':
/* balra mozgats utastsai jnnek */
break;
case 'j':
/* jobbra */
break;
case 't':
/* tz */
break;
}

Tantrgy: A C++ nyelv Kdszm: 146


26. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Egyb utastsok (VEZRLSTAD UTASTSOK)


Break
Formja: break; Ciklus s switch-elgazs belsejbl kiugrik, a
program a ciklus/elgazs utni els utastssal folytatdik.
Continue
Formja: continue; Ciklus belsejbl a vgre ugrik, a program futsa a ciklusfelttel szerint folytatdik.
Goto
Formja: goto cmke; A program futsa a "cmke:" cmkvel megjellt sortl folytatdik. Nem lehet goto-val blokkba kvlrl beugrani!
Felhasznlsa pl: ahol tbb egymsba gyazott ciklusbl szeretnnk
kilpni. Minden program megrhat goto nlkl is. A Goto utasts a
strukturlt programozs filozfijval ellenttes. Assemblyben s a
rgi BASIC nyelvben termszetes a hasznlata.

Tantrgy: A C++ nyelv Kdszm: 146


27. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Tpusok
A 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;
sizeof opertor: az adott tpus mrett adja meg (byte)
sizeof(short)<=sizeof(int)<=sizeof(long)
pl. Turbo C++ : sizeof(int)2, sizeof(long)4

Tantrgy: A C++ nyelv Kdszm: 146


28. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

NINCS TLCSORDULS-ELLENRZS!
Pl. az int i=32767+1; hatsra i rtke -32768 lesz (feltve,
hogy sizeof(int)=2).
Lebegpontos tpusok
1. float
2. double
3. long double
sizeof(float)<=sizeof(double)<=sizeof(long double)
Automatikus tpuskonverzik
Vegyes tpus kifejezseknl alkalmazza a C fordt.
Pl. 1+5.6 1.0+5.6 6.6
Lnyeg: a "pontatlanabb" konvertldik a "pontosabbra".
Explicit tpuskonverzi: int a; a=sqrt((double)25);
mert a ngyzetgyk fggvny
double tpus szmot vr

Tantrgy: A C++ nyelv Kdszm: 146


29. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Logikai tpus
A C az egsz tpust hasznlja logikai rtkek trolsra.
0 - hamis, minden ms - igaz.
Pl. if(1) x=5; az x=5 mindig vgrehajtdik
b=(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 eljel nlkli vltozat:
signed char -128..127
unsigned char 0..255
Az alaprtelmezs fordtnknt vltoz!

Tantrgy: A C++ nyelv Kdszm: 146


30. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Felsorolsi tpus
Definilsa: enum nv {elem1,elem2,...};
Itt a } utn kell a pontosvessz!
Az "enum nv"-vel egy j tpust hoztunk ltre.
Ilyen tpus vltozk deklarlsa: enum
v1,v2,v3;
A felsorolt szimblumok egszknt kezelhetk:
elem1=0, elem2=1 stb.
Plda:

nv

htf (kezetes) nem lehet!

enum munkanapok {hetfo,kedd,szerda,csutortok,


pentek};
enum munkanapok a,b;

Tantrgy: A C++ nyelv Kdszm: 146


31. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

a=kedd; b=a+2;

b csutortok (avagy 3) lesz

Tantrgy: A C++ nyelv Kdszm: 146


32. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Tmbk
Pl. int a[20];
20 elem egsz 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 indexhatr-ellenrzs!

Tantrgy: A C++ nyelv Kdszm: 146


33. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Struktrk
A struktra ms nyelvek rekordfogalmnak felel meg.
j struktra definilsa:
struct nv
{
tpus1 nv1;
tpus2 nv2;
...
};

Plda:
struct szemely
{
char nev[25];
int kor,labmeret;
};
Ilyen tpus vltozk deklarlsa:
struct szemely en;
en.labmeret=45;

Tantrgy: A C++ nyelv Kdszm: 146


34. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Uni
Tbbfle tpust kpes trolni. Formailag a struktrhoz hasonl, de a mezk ugyanazon a memriahelyen troldnak!
Plda:
union un
{
int i;
char s[2];
};
union un a;
a.i=0x7978;
Az a.i rtkadssal egytt a.s="xy" lesz!
Az uni a ms nyelvekben ltez varins rekordok ptlsa.

Tantrgy: A C++ nyelv Kdszm: 146


35. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Tpusdefinci
typedef int suly; a suly egsz tpus lesz
suly 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 struct kulcssz!)

typedef enum {ferfi, no} nem;


nem jancsi=ferfi;
nem juliska=no;
Tmb definilsa: typedef char irszam[4];

Tantrgy: A C++ nyelv Kdszm: 146


36. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Mutatk (pointerek)
A mutatk memriacmeket trolnak!
Minden tpushoz tartozik egy mutat tpus, amely az adott tpus vltozk cmeit kpes trolni.

Plda:
int *p;
p egy egsz vltoz cmt tartalmazhatja, "egy
egszre mutat". A p tpusa "int *".
*p a p ltal mutatott rtk (a fenti pldban egy egsz)
&a az a vltoz cme (& cmkpz opertor)

Tantrgy: A C++ nyelv Kdszm: 146


37. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Plda:
main()
{ char a,b;
char *p;
/* karakterre mutat */
a='a'; p=&a; b=*p+1; }
Vgrehajtsa utn b rtke 'b' lesz.
Plda: vltoz trsa (pointer+explicit tpuskonverzi):
int x=10; *(int*)&x=20;

/* x=20 lesz! */

Elssorban nem a konkrt memriacm a fontos, amelyre


mutatnak. A mutatkat vltozkra pozcionlhatjuk,
ezltal mveleteket vgezhetnk!
A pointerekkel bnjunk vatosan, mert programunk elszllhat!

Tantrgy: A C++ nyelv Kdszm: 146


38. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Tmbk s mutatk kapcsolata


int a[20];

Lefoglaldik 20*sizeof(int) byte a memriban s a


mint pointer ennek az elejre mutat. Ezrt pl. *a s a[0]
ugyanazt jelenti:
*a
a[0]

*(a+1) *(a+2)
a[1]
a[2]

a+1

a+2

a+3

Tantrgy: A C++ nyelv Kdszm: 146


39. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Pointer-aritmetika
A pointerhez hozzadhat egy k egsz, az eredmny
olyan pointer, amely k-val "arrbb" mutat a memriban
(lsd elz bra).
Plda:
int a[5]={10,20,30,40,50};
int *p=a;
p+=4; --p;
Eredmnye: p az a tmb a[3] elemre mutat (*p=40).
Figyelem! Az a mint pointer hasznlhat, de nem mdosthat, pl. ++a hibt eredmnyezne!

Tantrgy: A C++ nyelv Kdszm: 146


40. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Stringek
String: karaktertmb, 0 rtk bjttal ('\0')lezrva
('\0' != '0').
Pl. char s[]="Szveg"; egy 7 elem tmb lesz,
s[0]='S', s[6]='\0'
Vigyzat! A fenti s-sel s="j szveg"; hibt adna,
mert az s-et mint mutatt akarn trni!
Plda: az albbi program kirja: Hello Hello
#include <stdio.h>
#include <string.h>
int main(void)
{ char s[10]; char *str="Hello";
strcpy(s,str); printf("%s %s\n",s,str);
return 0; }

Tantrgy: A C++ nyelv Kdszm: 146


41. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Fggvnyek
Ms nyelvekhez hasonlan a fggvnyek paramterezhetk.
A fggvnydefinci ltalnos alakja:
tpus nv(tp1 par1, ...)
{
vltozdeklarcik;
utastsok;
}
tpus: a visszatrsi rtk tpusa
nv: az j fggvny neve
tpi pari: az i. formlis paramter tpusa s neve

Tantrgy: A C++ nyelv Kdszm: 146


42. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Figyelem! Ha a fggvnynek nincs paramtere, akkor is ki kell


tenni a neve utn a () -t, defincikor is, hvskor is (defincikor
a zrjelek kz void is rhat)! Pldul: clrscr();
A fggvny trzsben return valami; utastssal adhatjuk
vissza a valami rtket.
Plda: string hossznak kiszmtsa fggvnnyel:
int hossz(char *szoveg)
{
int h=0;
char *p;
for(p=szoveg;*p!='\0';++p) ++h;
return h;
}

Tantrgy: A C++ nyelv Kdszm: 146


43. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Hvsa:
int main(void)
{
char s[]="Bann";
int l=hossz(s);
}
Ekkor l rtke 5 lesz.
A fggvny rtkt nem ktelez felhasznlni.
Vagy: return nem ad vissza rtket.

Tantrgy: A C++ nyelv Kdszm: 146


44. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Eljrsok
C eljrs: olyan fggvny, amelynek nincs visszatrsi rtke. Ennek kezelsre "res" tpus: void.
void nv(paramterek)
{
...
}
Az eljrsban nincs szksg return utastsra. Ha mgis
hasznljuk, akkor nincs paramtere.

Tantrgy: A C++ nyelv Kdszm: 146


45. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Specilis fggvny a main. rtke int vagy void, egyszer esetben nincs paramtere. Ez a fggvny a fprogram
futtatsakor indul el. Ha lefutott, akkor a program is vget
r. A main rtkt 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 mindkett szerepelt. Csak deklarci
is lehetsges, pl: int hossz(char*);
Puszta deklarci utn is mr hvhat a fggvny. A deklarci haszna: modularitsnl.

Tantrgy: A C++ nyelv Kdszm: 146


46. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Loklis s globlis vltozk


A {} zrjelprok (ld. fggvnyek ill. sszetett utastsok)
ltal hatrolt programrsz: blokk.
A blokkok egymsba gyazhatk, kivtel: fggvnyen bell nem lehet jabb fggvny defincija!
Kvetkezmny: a main fggvnyen kvl kell a tbbi fggvnyt definilni.
Minden blokk elejn deklarlhatk vltozk:
a blokkbl kilpve megsznnek, rtkk elvsz,
csak a blokkon bell lehet hivatkozni rjuk.

Tantrgy: A C++ nyelv Kdszm: 146


47. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A vltozk trolsi osztlya: auto, register, static, extern.


auto - loklis vltozk deklarcija, ez az alaprtelmezs. A vltozk kezdrtke hatrozatlan.
Plda: auto int a;
int b;
register - a vltozt a CPU regiszterben szeretnnk trolni. A
program futsi teljestmnye nvelhet. Az osztlynv hasznlata ajnls a fordtnak. E vltozkra nem
hasznlhat a & cmkpz opertor.
Plda: register int c;
extern - globlis vltozk deklarcija. Az adott programblokk
rszre rja le a vltozk tpust. Plda: extern int d;

Tantrgy: A C++ nyelv Kdszm: 146


48. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

static - a statikusnak deklarlt vltozk szintn csak a blokkon


bell ltszanak, de rtkk megrzdik.
Plda:
int szamlalo(void)
{ static int i=0;
++i;
return i; }
A plda fggvnye minden hvskor eggyel nagyobb rtket ad vissza (pl. int a; utn a=szamlalo(); -t
tbbszr kiadva a=1,2,3...lesz). Az i=0 inicializls
csak egyszer hajtdik vgre!
Az sszes fggvnyen kvl is deklarlhatk vltozk,
ezek a modulon bell mindenhol lthatk.

Tantrgy: A C++ nyelv Kdszm: 146


49. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A paramtertads rszletei
Hvskor a formlis paramterekbe bemsoldnak az aktulis paramterek rtkei, majd a fggvnytrzs - a formlis paramtereket hasznlva - vgrehajtdik. Az aktulis
paramtereket a fggvny nem mdostja (rtk szerinti
tads)!
Plda:
void duplaz(int i)
{
i*=2;
}
Ekkor int a=6; duplaz(a); hatsra a rtke 6 marad!

Tantrgy: A C++ nyelv Kdszm: 146


50. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Mkd megolds mutatkkal:


void duplaz(int *i)
{
*i *= 2;
}
Hvsa: int a=6; duplaz(&a);
Tmbk tadsa paramterknt

/* a=12 */
(cm szerint ad t)

A tmbvltoz valjban pointer, gy pl. ha a fggvny karaktertmbt vr, akkor a formlis paramter tpusaknt
char *s s char s[] is adhat (a mret nem kell).

Tantrgy: A C++ nyelv Kdszm: 146


51. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Adatbevitel s kivitel
A szkebb rtelemben vett C nyelv nem tartalmaz ki- s
bemeneti mveleteket. Az n. standard knyvtrakban tallhatk ilyen fggvnyek. A standard knyvtrak hasznlatt kzlnnk kell a C fordtval: a knyvtr fggvnyeit
deklarl fjlt be kell olvasnunk; erre j a #include direktva.
Pldul a standard I/O fggvnyek hasznlathoz az
#include <stdio.h>
sort kell forrsprogramunk elejn elhelyezni.

Tantrgy: A C++ nyelv Kdszm: 146


52. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A be- s kimenet az n. standard inputra s standard


outputra trtnik: alapesetben a billentyzet s a kperny, azonban tirnythatk.
Formzott kimenet a printf fggvnnyel 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

Tantrgy: A C++ nyelv Kdszm: 146


53. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A printf tulajdonsgai:
Tetszleges argumentumszm fggvny,
az els paramtere string, benne
norml karakterek
%-kal kezdd formtumspecifikcik,
a tovbbi paramterek a kirand adatok, mindegyiknek
megfelel egy formtumspecifikci.
A formtumspecifikcik szma s tpusa meg kell feleljen a tovbbi paramtereknek, a C sz nlkl elfogadja a
hibs megadst is!

Tantrgy: A C++ nyelv Kdszm: 146


54. oldal

Informatikai Rendszerek
Intzete
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, mretfgg alakban
%p - pointer
%% - a "%" karakter

Tantrgy: A C++ nyelv Kdszm: 146


55. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A % s a bet kz rhat mg:


mnuszjel a balra igaztshoz
pluszjel az eljel kiratshoz
kirsi minimlis mezszlessget megad szm
pontossgot megad szm (az elz szmtl ponttal
elvlasztva, alaprtelmezse 6)
h vagy l bet, ha short/ long szmot akarunk kiratni
Pldk a 4 s a 3.14159265358979 kiratsra:
%d
4
%5d
%+5d

4
+4

%f
%e
%10f
%8.3f

3.141593
3.141593e00
3.141593
+3.142

Tantrgy: A C++ nyelv Kdszm: 146


56. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Formzott bemenet a scanf fggvnnyel 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 els paramtere string, benne
szkz, jsor, tab: nem veszi figyelembe
norml karakterek: a bemeneten bet szerint megjelennek
%-kal kezdd formtumspecifikci

Tantrgy: A C++ nyelv Kdszm: 146


57. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A tovbbi paramterek a vltozk cmei (mutatk), ahova az adatokat beolvassuk, mindegyiknek megfelel egy
formtumspecifikci.
A formtumspecifikcik szma s tpusa meg kell feleljen a tovbbi paramtereknek, a C sz nlkl elfogadja a
hibs megadst is!
A megadhat formtumok:
%d - eljeles decimlis egsz
%o - eljeltelen oktlis egsz
%x,X - hexadecimlis egsz

Tantrgy: A C++ nyelv Kdszm: 146


58. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

%u - eljeltelen egsz
%c - karakter
%s - string (char *)
%f,e,g - lebegpontos szm
%p - pointer
[...] [^...] - illeszkedsi halmaz/ellentte (char*)
A % s a bet kz rhat mg h vagy l bet, ha short vagy
long szmot akarunk beolvasni.
A scanf fggvny visszatrsi rtke a sikeresen beolvasott
adatok szma. Ez hibakezelsre felhasznlhat. Ha egy adatot nem tud beolvasni, az stdin-ben marad (fflush!).
Varici: sscanf stringbl olvas be vltozkba

Tantrgy: A C++ nyelv Kdszm: 146


59. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Plda: eleinte gyakori hiba a scanf hasznlatakor:


#include<stdio.h>
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 mkdik


jl. A hibs sor helyesen: scanf("%d",&szam);

Tantrgy: A C++ nyelv Kdszm: 146


60. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Karakter be- s kivitele


int getchar(void);
Egy karaktert olvas a standard inputrl, hiba vagy az input vge
esetn EOF karaktert ad. Az EOF elre definilt szimblum, hiba
s fjlvg jelzsre hasznljk, a Turbo C++ -ban rtke -1.

int putchar(char c);


A c karaktert kirja a standard outputra. Visszatrsi rtke a
c karakter, 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

Tantrgy: A C++ nyelv Kdszm: 146


61. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Plda: beolvasunk szvegeket, Enterre nagybetsen kirjuk


#include <stdio.h>
void main(void)
{
int c;
printf("Krek egy szveget, Ctrl+Z=vge : ");

while((c=getchar()),c!=EOF)
{
if(c>='a' && c<='z')
c+='A'-'a';
vesszopertor, az utols (2.)
putchar(c);
tag eredmnyt kapja
}
meg a while

Tantrgy: A C++ nyelv Kdszm: 146


62. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Tantrgy: A C++ nyelv Kdszm: 146


63. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

String be- s kivitele


char *gets(char *s);
Enterrel ("\n") lezrt karaktersorozatot olvas be a standard inputbl az s stringbe, Enter nlkl. Visszatrsi rtke az s, vagy hiba illetve az input vge esetn NULL. A
NULL elre definilt szimblum, egy specilis mutatrtk,
hibajelzsre hasznljk, a Turbo C++ -ban rtke 0.
int puts(char *s);
Kirja a standard outputra az s stringet s egy jsor karaktert. Visszatrsi rtke hiba esetn EOF, klnben az utoljra kikldtt karakter (tbbnyire "\n").

Tantrgy: A C++ nyelv Kdszm: 146


64. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Plda: bekrnk egy nevet s kirjuk, hibakezelssel


#include<stdio.h>
#include<conio.h>
#include<string.h>
main()
{
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));
}

Tantrgy: A C++ nyelv Kdszm: 146


65. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Fjlkezels
Egy httrtron tallhat fjl kezelshez elszr meg kell
nyitni. Egyszerre tbb fjl is kezelhet, ezrt azonostani
kell tudni ket. Ehhez elre definilt a FILE tpus. A fjlokra majd FILE * pointerekkel hivatkozunk.
Fjl megnyitsa
FILE *fopen(char *nev,char *mod);
nev a megnyitand fjl neve, szksg esetn elrsi tvonallal

Tantrgy: A C++ nyelv Kdszm: 146


66. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

mod a megnyitsi md, a kvetkez lehet:


"r"
"w"
"a"
"r+"
"w+"
"a+"

- csak olvassra megnyits


- csak rsra (ha nem ltezik, ltrehozza)
- hozzrs
- olvass s rs (csak ha ltezik)
- olvass s rs
- olvass s hozzrs

Mindegyik 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 esetn NULL.

Tantrgy: A C++ nyelv Kdszm: 146


67. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Fjl lezrsa
int fclose(FILE *f); hiba esetn EOF-ot ad viszsza
Az eddigi ki- s bemeneti fggvnyek fjlkezel megfeleli:
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);

Tantrgy: A C++ nyelv Kdszm: 146


68. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Specilis fjlok (FILE * tpusak, de nem lemezes fjlok,


elre definilva vannak s nem kell ket megnyitni):
stdin
stdout
stderr
stdaux
stdprn

- standard input (billentyzet)


- standard output (kperny)
- standard hibacsatorna (kperny)
- standard auxiliary device (COM1)
- standard printer (LPT1)

Plda: az albbiakban mindkt sor eredmnye ugyanaz


printf("Szia!\n");
fprintf(stdout,"Szia!\n");
A be- s kimenetek tirnytsa DOS-ban: prog<fjl,
prog>fjl, prog>>fjl, prog<fjl1>fjl2, prog1|prog2

Tantrgy: A C++ nyelv Kdszm: 146


69. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Binris fjlok kezelse (olvass, rs, pozicionls s pozci lekrdezse):


int fread(void *p, int size, int n, FILE *f);
tetszleges adatot olvas a fjlbl
p az a cm, ahova az adatot be akarjuk olvasni
A void * specilis pointer tpus: brmilyen pointert rhatunk a helybe.
Plda: tmb feltltse fjlbl
size egy adat mrete #include<stdio.h>
main()
n az adatok szma
{ int t[10];
f az olvasand fjl
FILE *f=fopen("be.dat","rb");
fread(t,sizeof(int),10,f); }

Tantrgy: A C++ nyelv Kdszm: 146


70. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

int fwrite(void *p, int size, int n, FILE *f);

tetszleges adatot r a fjlba


p az a cm, ahonnan az adatot ki akarjuk rni
size egy adat mrete
n az adatok szma
f a fjl, amelybe runk

Tantrgy: A C++ nyelv Kdszm: 146


71. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

int fseek(FILE *f, long off, int honnan);


az f fjlban az aktulis pozcit az off-adik byte-ra lltja
honnan mondja meg, hogy mely pozcihoz kpest, ez a
kvetkez hrom elre definilt szimblum lehet:
SEEK_SET - a fjl eleje
SEEK_CUR - az eddigi pozci
SEEK_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

Tantrgy: A C++ nyelv Kdszm: 146


72. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Plda: egy struktrt fjlba (id.txt) runk


#include <stdio.h>
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; }

Tantrgy: A C++ nyelv Kdszm: 146


73. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A main fggvny paramterei


A C programon bell a main fggvnynek kitntetett szerepe van, mert kijelli a program belpsi pontjt.
A main fggvnynek tbb paramtere lehet. Legegyszerbb alakjai: main(); vagy void main(void);
A paramterek nevei tetszlegeTeljes alakja:
sen megvltoztathatk, azonban
clszer a lenti szabvnyos elnevezseket hasznlni.
int main(int argc,char *argv[],char *envp[]);
az MS-DOS alatti fordtk tbbsgnl

Tantrgy: A C++ nyelv Kdszm: 146


74. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

ahol:
argc a paramterek szma+1 (azaz rtke legalbb 1)
argv stringek tmbje:
argv[0] a program neve teljes elrsi ttal (mindig ltezik)
argv[1]..argv[argc-1] a program indtsakor a parancssorban kiadott paramterek (elvlaszts a szkzk mentn; vgkn "\0")
argv[argc] egy NULL pointer
env szintn stringek tmbje, benne az n. krnyezeti
vltozk rtkei (comspec, path, prompt stb.).
A main fggvny visszatrsi rtke (pl. return 0;) a
DOS errorlevel vltozjval krdezhet le.
A legrvidebb C program (semmit nem csinl): main() {}

Tantrgy: A C++ nyelv Kdszm: 146


75. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Plda: parancssori paramtertvtel: a paramtersorban


megadott fjl tartalmt kiratjuk
Hvsa pl: C:\>kiiro level.txt

(Enter)

#include <stdio.h>
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;
}

Tantrgy: A C++ nyelv Kdszm: 146


76. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

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;

Tantrgy: A C++ nyelv Kdszm: 146


77. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Modularits
Egy program tbb fordtsi egysgbl (modulbl) llhat.
Ezek kln-kln lefordthatk, de mg nem futtathatk. A
lefordtott egysgeket ssze kell szerkeszteni ("linkelni"),
gy ll el a futtathat program.
Egy (rsz)program lefordthatsgnak felttelei:
szintaktikailag helyes legyen
valamennyi felhasznlt fggvny deklarlva legyen
(nem kell definilni!)

Tantrgy: A C++ nyelv Kdszm: 146


78. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A rszprogramok kln fordthatsgnak elnyei:


nagy program rszeit tbb programoz ksztheti, egymstl fggetlenl
ltalnos haszn fggvnyeket rhatunk egy modulba,
s tbb klnbz programban is felhasznlhatjuk ket
(pl. maguk a C standard knyvtrai is ilyen kln lefordtott fggvnygyjtemnyek - .OBJ, .LIB)
Forrsszveg (.C) [elfeldolgoz (preprocesszor)
bels fordt] trgykd (.OBJ) linker (.OBJ, .LIB)
futtathat llomny (.COM, .EXE)
Az elfeldolgoznak szl parancsok #-tel kezddnek.

Tantrgy: A C++ nyelv Kdszm: 146


79. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A standard knyvtrak pldja:


Mit jelent az #include <stdio.h> ?
Az stdio.h egy C nyelv ASCII fjl, amelyben az I/O fggvnyek deklarcii vannak felsorolva. A #include egy n.
direktva, amely beolvassa a megadott fjlt a forrsprogramunkba gy, mintha azt mi rtuk volna oda.
A <fjlnv> azt jelzi, hogy a fjlt a rendszer standard
include fjljai kztt keresse (az elre megadott knyvtrakban), "fjlnv" esetn a mi fjljainkat hasznln.
gy programunkban deklarlva lesznek a megfelel fggvnyek, a program lefordthat.

Tantrgy: A C++ nyelv Kdszm: 146


80. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Sajt moduljainkhoz is clszer egy n. fejlcfjlt kszteni, amelyik csak a ms modulok ltal hasznlt fggvnyek
deklarciit tartalmazza.
A C programfjlok szoksos kiterjesztse:
".c" a defincikat tartalmaz fjlnl
".h" a fejlcfjlnl
Tbb program sszeszerkesztse
IDE-bl PROJECT-tel: Project - Open Project, forrsfjlok megadsa stb. A vgn ne felejtsk el: Close Project!
parancssorbl: C:\>bcc prog1.c prog2.c

Tantrgy: A C++ nyelv Kdszm: 146


81. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Tantrgy: A C++ nyelv Kdszm: 146


82. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A #define direktva hasznlata

szoks szerint NAGYBETVEL

konstansdefinils (pl. #define PI 3.1415927)


egyszer helyettests (pl. #define AND &&)
feltteles fordts:
#ifdef
...
#endif
vdekezs include-fjl tbbszri beolvassa ellen:
#ifndef __NEV_H
#define __NEV_H
/* a tnyleges tartalom */
#endif

Tantrgy: A C++ nyelv Kdszm: 146


83. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

makrdefinils:
pl. #define MAX(a,b) ((a)>(b) ? (a) : (b))
Fordts sorn a makrban definilt utastssor forrskd szinten helyettestdik be a forrsprogram adott
helyre.
Plda: a
z=MAX(x,y);
sor kifejtse:
z=((x)>(y) ? (x) : (y));
Mindegyik esetben az #include... egy soros, a \ jel segtsgvel fzhetnk tbb sort egybe.

Tantrgy: A C++ nyelv Kdszm: 146


84. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Biztonsgosabb fjlkezels
A C fjlkezel knyvtri fggvnyei sikertelen vgrehajts esetn - pl. nem ltez fjlt akarunk olvassra megnyitni - a hibt
valamilyen specilis visszatrsi rtkkel vagy paramterrel
jelzi (pl. NULL-pointer). Ha ezt nem kezeljk le, a program hiba
esetn 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, akkor
hasznos lehet egy olyan modult rni, amelyben minden fjlkezel fggvny gy van megrva, hogy meghvja az eredeti fggvnyt s hiba esetn hibazenettel lell. Ezt a modult hasznlhatjuk aztn a programjainkban a standard fggvnyek helyett.

Tantrgy: A C++ nyelv Kdszm: 146


85. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Dinamikus memriahasznlat
Helyfoglals a heap-ben
void *malloc(meret);
A mret bjtban rtend. Visszatrsi rtke az j lefoglalt blokkra
mutat pointer, vagy NULL, ha nincs elegend hely, vagy a mretnek
nullt adtunk.
Lefoglalt hely felszabadtsa
void free(void *blokknev);
Egyb fggvnyek
allocmem, coreleft, freemem, calloc, realloc,
farmalloc, farfree, far...

Tantrgy: A C++ nyelv Kdszm: 146


86. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Plda: dinamikus memriahasznlatra malloc-cal


#include
#include
#include
#include

<stdio.h>
<string.h>
<alloc.h>
<process.h>

int main(void)
{
char *str;
if ((str = (char *) malloc(10)) == NULL)
{ printf("Nincs elg memria!\a\n");
exit(1); }

Tantrgy: A C++ nyelv Kdszm: 146


87. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

strcpy(str,"Hello");
printf("A szveg: %s\n",str);
free(str);
return 0;

A program a kvetkezt rja ki:


A szveg: Hello

Tantrgy: A C++ nyelv Kdszm: 146


88. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Hasonl plda calloc-cal (ugyanazt rja ki):


#include <stdio.h>
#include <alloc.h>
#include <string.h>
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; }

Tantrgy: A C++ nyelv Kdszm: 146


89. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Vltoz argumentumszm fggvnyek


Ilyen pl. a printf - tetszleges szm paramterrel hvhat.
Sajt vltoz argumentumszm fggvnyeket is kszthetnk, a kvetkez makrk segtsgvel (az stdarg.h-ban):
va_start()
va_arg()
va_end()
A ltrehozand vltoz tpusa: va_list()

Tantrgy: A C++ nyelv Kdszm: 146


90. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Plda: vltoz argumentumszm fggvny, a tanknyvbl


#include<stdarg.h>
#include<stdio.h>
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);

Tantrgy: A C++ nyelv Kdszm: 146


91. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

break;
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);
break; }
va_end(ap); }

A program kirja:
char A
int 1
int 25
string Valami szveg
int 1
int 2
int 3
string Ngy
string t

void main(void)
{ vfg("cdds",'A',1,25,"Valami szveg");
vfg("dddss",1,2,3,"Ngy","t");
}

Tantrgy: A C++ nyelv Kdszm: 146


92. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Plda: a beolvasott szmrl eldntjk, hogy prm-e, hibs


adat esetn a beolvasst megismteljk
#include<stdio.h>
#include<conio.h>
main()
{
long szam,i,oszto=0;
clrscr();
do
{ printf("Krek egy pozitv egsz szmot: ");

fflush(stdin);

}
while((scanf("%ld",&szam)!=1)||(szam<1));

Tantrgy: A C++ nyelv Kdszm: 146


93. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

for(i=2;i<=szam/2;i++)
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);

Tantrgy: A C++ nyelv Kdszm: 146


94. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Plda: a legnagyobb kzs oszt (lnko) kiszmtsa


Pl. lnko(80,100)=20
#include<stdio.h>
#include<conio.h>
int Lnko(int,int);

/* fv. deklarci */

main()
{
int x,y;
clrscr();
printf("Krek kt szmot vesszvel "
"elvlasztva: ");

Tantrgy: A C++ nyelv Kdszm: 146


95. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

if(scanf("%d,%d",&x,&y)!=2)
printf("Hiba!\a"); else
printf("lnko(%d,%d)=%d",x,y,Lnko(x,y));

int Lnko(int u, int v) /* fv. definci */


{ int r;
if(u<0) u=-u;
if(v<0) v=-v;
if(u<v) { r=v; v=u; u=r; }
r=u%v;
while(r!=0) { u=v; v=r; r=u%v; }
return v; }

Tantrgy: A C++ nyelv Kdszm: 146


96. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Plda: sajt stringmsol eljrs ktflekppen


A program kirja: Hello Hello Hello
#include<stdio.h>
void mystrcpy1(char*,char*);
void mystrcpy2(char*,char*);
main()
{
char *szoveg1,szoveg2[10],szoveg3[10];
szoveg1="Hello";
mystrcpy1(szoveg2,szoveg1);
mystrcpy2(szoveg3,szoveg1);

Tantrgy: A C++ nyelv Kdszm: 146


97. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

printf("%s %s %s\n",szoveg1,szoveg2,
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 hamis, minden ms igaz. gy a szvegmsols a megfelel helyen r vget!

Tantrgy: A C++ nyelv Kdszm: 146


98. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Plda: beolvasunk egy (tbbsoros) szveget s kirjuk,


hny karaktert s hny sort tartalmaz
#include <stdio.h>
A c vltoz int tpus, mgis
main()
karakterknt hasznljuk!
{
int karakter=0,sor=1,c;
printf("Krek egy szveget, Ctrl+Z=vge: ");
while((c=getchar())!=EOF) {
++karakter;
if(c=='\n') ++sor;
}
printf("%d karakter, %d sor.\n",karakter,sor);
}

Tantrgy: A C++ nyelv Kdszm: 146


99. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Plda: biztonsgosabb fjlkezels


Az "estdio.h" fjl tartalma:
#ifndef __ESTDIO_H
#define __ESTDIO_H
#include <stdio.h>
FILE *efopen(char *nev, char *mod);
int efclose(FILE *fp);
/* stb.: egyb stdio-fggvnyek deklarcii */

#endif

Tantrgy: A C++ nyelv Kdszm: 146


100. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Az "estdio.c" fjl tartalma:


#include <stdlib.h>
#include "estdio.h"

/* az exit-hez kell */

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);
}

Tantrgy: A C++ nyelv Kdszm: 146


101. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

int efclose(FILE *fp)


{
if(fclose(fp)==0) return 0;
fprintf(stderr,"Nem sikerlt lezrni a "
"fjlt!");
exit(1);
}
/* stb: egyb stdio-fggvnyek j defincii */

Tantrgy: A C++ nyelv Kdszm: 146


102. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A Borland C++ (DOS) hasznlata


Az IDE hasznlata megegyezik a Turbo Pascalval.
ltalnos mveletek
ltez fjl megnyitsa: F3 (default = *.cpp !)
project ltrehozsa / megnyitsa: Project - Open project
A vgn ne felejtsk el bezrni:
Project - Close project
helyrzkeny Help:
Ctrl+F1 (a kurzor a sz alatt lljon)
kilps a programbl:
Alt+X
A program fordtskor nha lefagy, mentsnk gyakran (F2-vel)!
Ablakmveletek
vlts:
mozgats:

Alt+1, Alt+2 stb., vagy F6. Bezrs: Alt+F3


Ctrl+F5, , befejezs Enterre

Tantrgy: A C++ nyelv Kdszm: 146


103. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

mretezs: Ctrl+F5, Shift+ , befejezs Enterre


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:
F4
trspont be / ki:
Ctrl+F8 (lpkeds Ctrl+F9)
vltoz nyomkvetse:
Ctrl+F7, nv bersa, Enter
tovbbi mveletek a Watch ablakban: Insert, Delete

Tantrgy: A C++ nyelv Kdszm: 146


104. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A C++ NYELV
Bevezets
A C++ nyelv kialakulsa:
Objektumorientlt (OO) programozsi szemllet; OO programozsi nyelvek (Simula-67, Smalltalk).
Az OO nyelvek lassak voltak. A 80-as vekben clul tztk
ki 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.)

Tantrgy: A C++ nyelv Kdszm: 146


105. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A C++ fellrl kompatibilis a C-vel, minden szablyos C

program egyben szablyos C++ program is, amely


ugyanazt csinlja (ez csak 99,9%-ig igaz, de a 0,1% ellenplda elg mesterklten adhat meg).
Teht a C++ :
C nyelv
+ objektumorientltsg
+ nhny "szintaktikai cukor"
A C++ elnyei:
C elnyei
az OO programozs tmogatsval nagy programok
knnyebben rhatk
minden gpre van C++-fordt

Tantrgy: A C++ nyelv Kdszm: 146


106. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

szles krben hasznljk s sok feladatcsoporthoz


ksztettek C++-ban felhasznlhat programknyvtrakat, gy a programoznak nem kell mindig a
klyhtl elindulnia.
A WWW trhdtsval jrt a Java nyelv robbansszer
elterjedse, amellyel a WWW-oldalakon nemcsak statikus szveget s kpeket jelenthetnk meg, hanem brmit, amit egy programozsi nyelv megenged (jtkok,
animcik, adatbzis-kezels stb.). A Java nyelv a C++bl szrmazik, annak leegyszerstse s "letiszttsa".

Tantrgy: A C++ nyelv Kdszm: 146


107. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A C++ nyelv j lehetsgei


Nmelyik bvts az 1989-es ANSI C-szabvnyba is
belekerlt; ezeket a mai C (nem C++)-fordtk is ismerik. A tovbbiakban ezekre a bvtsekre "ANSI C" jellssel utalunk.
Megjegyzsek a C++ programszvegben
// jellel kezddnek s a sor vgig tartanak.
A rgi /* ... */ alak megjegyzsek is hasznlhatk.

Tantrgy: A C++ nyelv Kdszm: 146


108. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A // elnye, hogy a megjegyzst nem felejtjk el a


vgn bezrni.
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!

Tantrgy: A C++ nyelv Kdszm: 146


109. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

j tpusmdost kulcsszavak
Konstans vltoz megadsa: const (ANSI C)
int i=3; i=i+4; // rendben
de
const int i=3; i=i+4; // fordtsi hiba!
Hasonlan const float f, const char *s stb.

Tantrgy: A C++ nyelv Kdszm: 146


110. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Volatile vltoz (ANSI C)


volatile int i;
Azt jelenti, hogy az i vltozt nemcsak a program,
hanem kls hats (pl. megszakts) is megvltoztathatja. Ezt az informcit a fordt optimalizlja hasznlja fel; mi nem foglalkozunk vele.

Tantrgy: A C++ nyelv Kdszm: 146


111. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Hatskr-opertor: "::"
int n;
void main() {
int n;
n=4; }
A fenti programban egy globlis s egy loklis n egsz vltoz szerepel. Ez szablyos; az n=4 rtkads a loklis nre rvnyes, a loklis vltoz "elfedi" az azonos nev globlist.
s ha mi mgis a globlis n-et akarjuk hasznlni?

Tantrgy: A C++ nyelv Kdszm: 146


112. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A C++-ban a ::-t a vltoz el rva a globlis vltozt


kapjuk:
int n;
void main()
{
int n;
::n=4;
// a globlis n lesz 4
}

Tantrgy: A C++ nyelv Kdszm: 146


113. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Az iostream knyvtr
Kimenet-bemenet: a C-ben a stdio knyvtr scanf,
printf fggvnycsaldot hasznlhattuk. Emlkeztetknt
az i egsz szm kirsa soremelssel:
printf("%d\n", i);
Htrny: a kirand illetve beolvasand vltozknak megfelel tpusokat neknk kellett a formtumszvegbe %jellel megadni. Ha nem a megfelel szm vagy tpus
formtumot adtuk meg, a program akr el is szllhatott.

Tantrgy: A C++ nyelv Kdszm: 146


114. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

C++-ban a bartsgosabb iostream knyvtr is hasznlhat.


(A program elejn #include <iostream.h> szksges.)
A standard kimenet neve: cout
A standard bemenet neve: cin
Kirs (i, j vltozk):
cout << i << "," << j << "\n";
i, j beolvassa:
cin >> i >> j ;

Tantrgy: A C++ nyelv Kdszm: 146


115. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A relcijelek mint nyilak irnynak logikja: az adatramls irnya.


Fontos! Az j lehetsgek sosem jelentik azt, hogy a
rgi C-megoldsok nem hasznlhatk (legfeljebb nem
clszer a hasznlatuk)! A ki-bemenet programozsra teht a stdio knyvtr a C++-ban is rendelkezsre
ll, akr egy programon bell az iostream-mel keverve is.

Tantrgy: A C++ nyelv Kdszm: 146


116. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Szabadabb vltozdeklarcik
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 << i << " ngyzete " << j << "\n";
}
A megjellt sor C-ben hibt adna, mert a j vltozt a blokk elejn kellene deklarlni, nem a cin... sor utn.

Tantrgy: A C++ nyelv Kdszm: 146


117. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Tpusdeklarcik (felsorols, struktra)


C-ben:
typedef enum {...} etype;
etype e;
/* 'e' etype tpus vltoz */
vagy
enum etype {...};
enum etype e;
C++-ban gy is lehet:
enum etype {...};
etype e;
Struktrk definilsa hasonlan:
struct styp { ... };
styp s;

Tantrgy: A C++ nyelv Kdszm: 146


118. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Dinamikus memriakezels
Emlkeztet: tmb mrete nem lehet vltoz.
int a=5;
char t[a];

// hibs!

Dinamikusan lefoglalt memria: new opertor


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.

Tantrgy: A C++ nyelv Kdszm: 146


119. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A new tipus[meret] ugyanezt csinlja, csak meret darab objektumnak foglal helyet a memriban.
Az gy, "kzileg" lefoglalt memriaterleteket kzileg is
kell 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

Tantrgy: A C++ nyelv Kdszm: 146


120. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Ugyanez dinamikusan:
{
int *ip;
ip=new int;
...
delete ip;

// *ip-t hasznljuk
// mi magunk szabadtjuk fel
// a memrit

Tmbbel:
{
int *ip; int n=15;
ip=new int[n];
...
delete[] ip; }

Tantrgy: A C++ nyelv Kdszm: 146


121. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Referencia tpus vltozk


Emlkeztet (a prezentci elejrl):
void duplaz(int i)
{
i*=2;
}
Ekkor int i=6; duplaz(a); hatsra a rtke 6 marad!

Tantrgy: A C++ nyelv Kdszm: 146


122. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Mkd megolds mutatkkal:


void duplaz(int *i)
{
*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.)

Tantrgy: A C++ nyelv Kdszm: 146


123. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Alaprtelmezett paramterek
A fggvnyek fejben felsorolt paramtereknek konstans
alaprtelmezst adhatunk. Hvskor - ha az alaprtelmezs
megfelel - 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 szszes utna kvetkezvel is ezt kell tennnk.
Rossz: void fv(int a, int b=1, char c);

Tantrgy: A C++ nyelv Kdszm: 146


124. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Fggvnytlterhels (overloading)
Pldul
void fv(int a, char b);
void fv(char *s);
Ez C-ben hiba, mert az fv fggvnyt kt klnbz mdon
adtuk meg. C++-ban ez szablyos.
fv(5,'q'); // az els defincit hasznlja
// a fordtprogram
fv("abc"); // a msodikat hasznlja

Tantrgy: A C++ nyelv Kdszm: 146


125. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Objektum-orientlt programozs C++-ban


Procedurlis programozs: a program eljrsokbl, fggvnyekbl ll; ezek "mellesleg" adatokat vrnak paramterknt s adatokat adnak eredmnyl.
Objektum-orientlt programozs: a program adatokbl, objektumokbl ll; ezeken "mellesleg" mveleteket lehet vgezni.
Mindkt szemlletben adatok s mveletek vannak, csak a hangsly mshova helyezdik.
Rgztett, "ktblba vsett" feladatot mindkt mdon kb. ugyanolyan knnyen lehet megoldani.
Az OO elnye a feladat megvltoztatsakor jelenik meg: a feladat
kis mdostst a megold program kis mdostsval kvetni lehet (folytonossg).

Objektumok

Tantrgy: A C++ nyelv Kdszm: 146


126. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Mi az aut?
A mszaki szakember szempontjbl: egy csom alkatrsz.
A vezet szempontjbl: olyan eszkz, amellyel menni lehet: a gzpedllal gyorsthatunk, a fkkel lassthatunk, a
kormnnyal kormnyozhatunk.
Nagy elnye az autnak, hogy a vezetnek nem kell tisztban lennie az aut mkdsvel.

Tantrgy: A C++ nyelv Kdszm: 146


127. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Mveletek

gzt_ad()
fkez()
balra()
jobbra()

sebessg()
hely_x()
Bels llapot
hely_y()
irny_x()
motor
irny_y()
tengelykapcsol

A bels llapotot csak a megadott mveleteken keresztl


mdosthatjuk, illetve csak azokon keresztl tudhatjuk
meg az aut bels llapott.
Az bra az autk osztlyt jelkpezi; ennek megfelel autpldnyok ltezhetnek.

Egy a nev aut felgyorstsa 80 km/h-ra:

Tantrgy: A C++ nyelv Kdszm: 146


128. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Auto a;
while(a.sebesseg()<80) a.gazt_ad();
A fenti rvid programot az is meg tudja rni, aki nem
ismeri az Auto osztly megvalstst.

Tantrgy: A C++ nyelv Kdszm: 146


129. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Osztlyok
A C struktrkhoz hasonl szintaxissal adhatk meg a
C++ osztlyok.
struct rek
{
int a;
float f;
};
rek r;
r.a=3;

// rek tpus

// r egy rek tpus vltoz

Tantrgy: A C++ nyelv Kdszm: 146


130. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Ugyangy:
class rec {
int a;
float f;
};
rec p;

// rec tpus

// p egy rec tpus vltoz

A fenti rek s rec tpus majdnem ugyanolyan. A klnbsg:


p.a=3; hibs, mert a rec osztly a s f vltozjhoz nem
frhetnk hozz! (Akkor mire jk? Ksbb megltjuk.)

Tantrgy: A C++ nyelv Kdszm: 146


131. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A rek struktrnak valban pontosan megfelel rec osztly:


class rec {
// rec tpus
public:
int a;
float f;
};
A public: utn felsorolt vltozk "publikusak", azaz egy
rec tpus objektum a s f mezjt szabadon felhasznlhatom. A public: prja a private:. A private: utn
kvetkez adatok nem hozzfrhetek (az eddig megismert mdokon). Az osztlydefinciban a private: az
alaprtelmezs, ezrt kellett a public: kulcsszt kirnunk.

Tantrgy: A C++ nyelv Kdszm: 146


132. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

class cl
{
int a;
public:
int b;
private:
int c;
};
cl v;
v.a=1; v.b=2; v.c=3;
Csak a kzps rtkads szablyos, a tbbi hibt ad!

Tantrgy: A C++ nyelv Kdszm: 146


133. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Egyszer plda: ember-osztly s kt ember-objektum.


#include <iostream.h>
class ember
{
public:
char *nev;
int kor;
};
void main()
{
ember Kovacs, Szabo;

Kovacs.nev="Kovcs Ilona";

Kovacs.kor=43;
Szabo.nev="Szab Jnos";
Szabo.kor=25;
cout << "Kovacs neve: "
<< Kovacs.nev
<< ", kora: " <<
Kovacs.kor << "\n";
cout << "Szabo neve: "
<< Szabo.nev
<< ", kora: " <<
Szabo.kor << "\n"; }

A program a kvetkezket rja ki:


Kovacs neve: Kovcs Ilona, kora: 43
Szabo neve: Szab Jnos, kora: 25

Tantrgy: A C++ nyelv Kdszm: 146


134. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Metdusok
Az osztlyban nemcsak adatokat, hanem fggvnyeket
(n. metdusokat) is megadhatunk.
class ember {
public:
char *nev;
int kor;
void kiir();
};
void ember::kiir()
{

cout << "Neve: " << nev <<


", kora: " << kor << "\n";
}
...
ember e;
e.nev="Laci";
e.kor=31;
e.kiir();

Tantrgy: A C++ nyelv Kdszm: 146


135. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Megjegyzsek:
Az osztlydefinciban a fggvnynek csak a fejt adtuk
meg.
A metdus (fggvny) tnyleges megvalstsakor a
neve el rjuk az osztlynevet s egy "::"-ot.
A metdus megvalstsban az osztly vltozira szabadon hivatkozhatunk.
A metdust objektum.metodus(param...) alakban
hvjuk meg.

Tantrgy: A C++ nyelv Kdszm: 146


136. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A metdusok a privt adattagokra is hivatkozhatnak!


Pl. Aut osztly:
class Auto {
public:
void gazt_ad();
void fekez();
float sebesseg();
private:
float seb;
};
void Auto::gazt_ad()
{
seb=seb+5;

if(seb>120) seb=120;
}
void Auto::fekez()
{
seb=seb-10;
if(seb<0) seb=0;
}
float Auto::sebesseg()
{
return seb;
}

Tantrgy: A C++ nyelv Kdszm: 146


137. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Magyarzat: csak a gazt_ad s a fekez metdusokkal


mdosthatjuk az aut sebessgt.
Pl. Auto a; a.seb=50; szablytalan. Ez a valsgban is
gy van; a sebessget nem llthatjuk tetszs szerint. Teht
az adattagok privtknt val definilsval utnozhatjuk a
valsg ktttsgeit.
Megjegyzs: a gzads elg egyszeren lett megvalstva;
a valdi aut nem egyenletesen gyorsul. A modellt lehet
finomtani, mikzben az Auto osztly hasznlja ugyanazt
ltja (ti. a gzt s a fket).

Tantrgy: A C++ nyelv Kdszm: 146


138. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Konstruktorok
Auto a;
cout << a.sebesseg();
A fenti sor vletlenszer eredmnyt fog kirni, mivel a
sebessg nincs inicializlva.
Az osztlynak adhat egy specilis metdus, az n.
konstruktor; ennek neve megegyezik az osztly nevvel, visszatrsi rtke nincs, s az objektum ltrejttekor automatikusan vgrehajtdik.

Tantrgy: A C++ nyelv Kdszm: 146


139. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Pl.
Auto::Auto(float kezdoseb)
{
seb=kezdoseb;
}
...
Auto a(30);
// egy j "a" aut,
// 30 km/h sebessggel
Megjegyzs: a fggvnytlterhels lehetsge itt is fennll, teht egy osztlyhoz tbb, klnbz
paramterezs konstruktor is tartozhat.

Tantrgy: A C++ nyelv Kdszm: 146


140. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Destruktor
A konstruktor "ellentte", az objektum megsemmislsekor hvdik meg automatikusan. Clja a "rendraks".
A destruktormetdus neve: egy ~ jel utn az osztly neve.
Paramtere nincs.
Pl.
Auto::~Auto()
{
seb=0;
}

Tantrgy: A C++ nyelv Kdszm: 146


141. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Objektumok dinamikus helyfoglalsa


Ugyanolyan, mint az elre definilt tpusoknl (new, delete).

Auto *ap;
ap=new auto(10);
ap->gaz();
cout << ap->sebesseg();
delete ap;
A -> opertort osztlyra (vagy struktrra) mutat pointereknl hasznljuk. Jelentse: a->b ugyanaz, mint (*a).b

Tantrgy: A C++ nyelv Kdszm: 146


142. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

rklds
Az OO programnyelvek ereje akkor mutatkozik meg, amikor egy mr megoldott feladathoz hasonlt kell megoldani.
Az OO programozs tmogatja a meglv kd jrafelhasznlst (vagyis hogy ugyanazt a kdot ne kelljen tbbszr
megrnunk).
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 (esetleg ragadoz), amelynek ngy lba van s ugat. Ezrt az
emls ltalnos tulajdonsgait kln nem soroljuk fel.

Tantrgy: A C++ nyelv Kdszm: 146


143. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

brzolsa:
A kutya osztly dobozban nem rjuk ki
kln az emls jellemzit; azok megltt az rkldst
jelz nyl fejezi ki.

Emls
mret
sly
megy()
eszik()

Osztlynv
Adattagok
Metdusok

Kutya
lbszm
hanger
ugat()
harap()

rkls

Tantrgy: A C++ nyelv Kdszm: 146


144. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A C++ definci:
class Emlos {
public:
Emlos(float mer, float su);
float merete();
float sulya();
void megy();
void eszik();
private:
float meret;
float suly;
};

Tantrgy: A C++ nyelv Kdszm: 146


145. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

class Kutya : public Emlos


{
public:
Kutya(float mer, float su, float hang);
void ugat();
void harap(Emlos& em);
float hangereje();
private:
float hangero;
};
...
Kutya bodri(0.7, 12, 5);
bodri.eszik();
bodri.ugat();

Tantrgy: A C++ nyelv Kdszm: 146


146. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A "class Kutya : public Emlos" sor jelentse: a


Kutya osztly az Emlos tulajdonsgait s metdusait
rkli. A public kulcssz jelentse itt: az osztly adatainak s metdusainak hozzfrsi jogai megmaradnak (a public public marad a kutya osztlyban is).
Lehetett volna emlsosztly nlkl is definilni a kutyt, az sszes adatt s metdust egy osztlydefinciban megadva. A mi megoldsunk elnyei:

Tantrgy: A C++ nyelv Kdszm: 146


147. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Ha definilni akarunk egy Macska osztlyt is, akkor nem


kell a semmibl indulunk; az Emlos osztlybl kiindulva
elg a csak a macskra jellemz dolgokkal foglalkoznunk.
Ha tovbbi (emls) llatfajokat definilunk hasonlan,
majd esznkbe jut egy j tulajdonsg, amely minden
emlsre rvnyes, akkor elg az Emlos osztlyt mdostani; a vltozs az rklsen keresztl minden fajt rinteni fog.
Ksbb ltni fogjuk, hogy ahol a programban Emlos tpus adatot vrunk, oda nemcsak emls, hanem kutyas macskapldnyokat is behelyettesthetnk.

Tantrgy: A C++ nyelv Kdszm: 146


148. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Vdett (protected) adatok


Az osztly public tagjai (adatai s metdusai) mindenhonnan hozzfrhetk.
Az osztly private tagjait csak az osztly metdusai rhetik el.
Az rkls egy sajtos kapcsolat kt osztly kzt, pldul
a Kutya kzelebb ll az Emlos-hz, mint egy ms, "vadidegen" osztlyhoz. Az Emlos privt tagjait mg a Kutya
sem ltja! A protected tagokhoz csak az osztly s annak
leszrmazottai frhetnek hozz.

Tantrgy: A C++ nyelv Kdszm: 146


149. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Plda:
class A {
public:
void metodus();
protected:
int adat1;
int get_adat2();
private:
int adat2;
};
int get_adat2()
{ return adat2; }

class B : public A {
public:
void met();
};
void B::met()
{
cout << adat1; // szablyos
cout << adat2; // ROSSZ!
cout << get_adat2(); // j
}
A obj;
cout << obj.adat1; // ROSSZ!

Tantrgy: A C++ nyelv Kdszm: 146


150. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Megjegyzs: az adat2-t mirt rejtettk el, ha a


get_adat2() metdussal aztn gyis hozzfrhetnk? Pl. azrt, mert rni viszont nem tudja adat2-t
senki, csak az A osztly metdusai.
Teht a hozzfrsi jogosultsgok:

public
protected
private

osztlyleszrm.
mshol
metdusban metdusban
X
X
X
X
X
X

Tantrgy: A C++ nyelv Kdszm: 146


151. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Polimorfizmus
Hizlaljunk fel egy emlst legalbb 50 kilra!
void hizlal(Emlos& e)
{
while( e.sulya()<50 )
e.eszik();
}
Emlos eml(1,30);
hizlal(eml);
cout << eml.sulya();

Tantrgy: A C++ nyelv Kdszm: 146


152. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A paramter azrt Emlos& tpus, nem pedig sima Emlos,


mert utbbi esetben a fggvny nem az ltalunk tadott
paramterrel, hanem annak msolatval dolgozna.
ltalban nem emlskkel, hanem konkrt kutykkal s
macskkkal foglalkozunk. (Vagy - hizlalsrl lvn sz disznkkal.) Teht kellenek a
void hizlal(Kutya& e)
void hizlal(Macska& e)
void hizlal(Diszno& e) stb.
fggvnyek.

Tantrgy: A C++ nyelv Kdszm: 146


153. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Szerencsre nem kell minden faj osztlyra kln definilni a fggvnyt. A C++-ban ugyanis egy A& tpus vltozba
nem csak A osztly objektumokat helyettesthetnk be,
hanem tetszleges A-bl szrmaz osztlyt is. Hasonlkppen egy A * pointer mutathat A-bl leszrmaz objektumra is.
Plda:
Emlos *ep;
ep=new Kutya(0.5, 10, 3);
ep->megy();
delete ep;

Tantrgy: A C++ nyelv Kdszm: 146


154. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Metdusok felldefinilsa
Az rkls sorn nem csak j adat- s metdus-tagokat
vehetnk fel, hanem a meglv metdusokat is felldefinilhatjuk.
void Emlos::eszik()
Pldul:
{ suly += 1; }
class Elefant : public
class Emlos {
Emlos { ...
...
void eszik();
void eszik();
... };
...
void Elefant::eszik()
};
{ suly += 10; }

Tantrgy: A C++ nyelv Kdszm: 146


155. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Krds: Mennyit hzik Trombi?


void zabal(Emlos *em)
{
em->eszik();
em->eszik();
em->eszik();
}
Elefant trombi;
zabal(&trombi);

Tantrgy: A C++ nyelv Kdszm: 146


156. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Jzan sszel szmolva 30 kilt. A C++ azonban a


zabal() fggvnyben az Emlos osztly eredeti defincijt veszi figyelembe, ezrt Trombi csak 3 kilt hzik. Ahhoz, hogy mindig az adott aktulis osztlynak
megfelel definci aktivizldjon, a metdust virtulisnak kell deklarlni:
class Emlos {
...
virtual void eszik();
...
};

Tantrgy: A C++ nyelv Kdszm: 146


157. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

gy mdostva mr a vrakozsunknak megfelelen mkdik a program. klszably: minden olyan metdus deklarcija el rjuk ki a virtual kulcsszt, amelyet vrhatan
a leszrmazott osztlyokban fell fogunk definilni.
Megjegyzs: a C++ a C nyelv OO bvtse. Az eleve objektum-orientltra tervezett "tiszta" OO nyelvekben a virtulissg az alaprtelmezs, gy ezt
nem kell kln kulcsszval jelezni:
void Elefant::eszik()
{
suly += 10;
}

Tantrgy: A C++ nyelv Kdszm: 146


158. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Az elefnt tzszer annyit eszik, mint az tlag emls. Ezt gy

is kifejezhetjk, hogy az Emlos ev metdust az elefnttal


tzszer hajtatjuk vgre:
void Elefant::eszik() {
int i;
for(i=1; i<=10; ++i) Emlos::eszik();
}

Az Emlos:: eltt fejezi ki, hogy nem az ppen most definilt elefntmetdust hvjuk, hanem az sosztly evmetdust. Gyakori, hogy felldefinilskor nem rjuk jra a teljes
metdust, hanem az sosztly metdust meghvjuk, s mg
valamit csinlunk.

Tantrgy: A C++ nyelv Kdszm: 146


159. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Konstruktorok rkldse
class Emlos
{
public:
Emlos(float mer, float su);
...
};
class Kutya : public Emlos
{
public:
Kutya(float mer, float su, float hang);
... };

Tantrgy: A C++ nyelv Kdszm: 146


160. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A kutya konstruktora ugyanazt csinlja, mint az emls s


mg valamit. Az emlssel kzs rszt kr lenne mg egyszer lerni. A konstruktor defincijakor megadhat, hogy
az sosztly konstruktora hogyan aktivizldjon:
Emlos::Emlos(float mer, float su)
{
meret=mer;
suly=su;
}
Kutya::Kutya(float mer, float su,
float hang) : Emlos(mer, su)
{ hangero=hang; }

Tantrgy: A C++ nyelv Kdszm: 146


161. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A this pointer
A metdusdefincikban hasznlhatjuk a this vltozt, amely mindig az aktulis objektumra mutat. Valjban implicit mdon gyakran felhasznljuk:
adattag=ertek;
ugyanaz, mint
this->adattag=ertek;

Tantrgy: A C++ nyelv Kdszm: 146


162. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Tbbszrs rklds
rklssel nemcsak egy osztlyt bvthetnk, finomthatunk, hanem tbb osztly tulajdonsgait is egyesthetjk.
class Auto
{
public:
void gazt_ad();
void fekez();
float sebesseg();
protected:
float seb; };

Tantrgy: A C++ nyelv Kdszm: 146


163. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

class Raktar {
public:
void bepakol(Aru& a);
void kipakol();
int hely();
protected:
...
};
class Teherauto:
public Auto, public Raktar { };
Teherauto ifa; Aru a;
ifa.bepakol(a);
ifa.gazt_ad();

Tantrgy: A C++ nyelv Kdszm: 146


164. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A Windows programozsa Borland C++ -ban


Esemnyvezrelt programok
Ha emberi nyelven elmondjuk, hogy mit csinl egy
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."

Tantrgy: A C++ nyelv Kdszm: 146


165. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A hagyomnyos programokban a programoz dnttte el, hogy hol s milyen mdon kr adatokat a felhasznltl. Ennek elnye a nagyobb szabadsg, htrnya viszont, hogy gyakran a program irnytja a
hasznljt, nem pedig fordtva. Msrszt szinte minden program ms megoldst hasznl az adatbevitelre,
gy a felhasznlnak nehezebb a dolga.

Tantrgy: A C++ nyelv Kdszm: 146


166. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Az esemnyvezrelt rendszerekben, mint amilyen a Windows, a rendszer maga megoldja, hogy a felhasznl beavatkozsainak - az esemnyeknek - hatsra a megfelel
programrsz lefusson. A program lelke az esemnyciklus,
amelynek vza gy nzhet ki:
Esemeny e;
while(1) {
e=kovetkezo_esemeny();
dolgozd_fel(e);
}
Mivel ez a ciklus a rendszer rsze, a programjainkban nem
kell kln megrni.

Tantrgy: A C++ nyelv Kdszm: 146


167. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A Windows programozsa
A Windows rendszer programozk szmra nyjt egy
knyvtrat, amely pl. C nyelven is elrhet. Ez azonban elg alacsony szint; egy res ablakot megjelent minimlis Windows program 2-3 kpernyoldal.
Ezrt erre a knyvtrra magasabb szint, knyelmesebb knyvtrakat ptettek. Az egyik ilyen a Borland
OWL-je (Object Window Library), amely C++ nyelven
hasznlhat s ersen objektumorientlt.

Tantrgy: A C++ nyelv Kdszm: 146


168. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Mirt objektumorientlt?
Az ablakoz rendszerek egyik nagy elnye az egysgessg. Minden program hasonlan nz ki s hasonlan kezelhet. Pldul minden programablak mozgathat, tmretezhet. Ez arra emlkeztethet, mintha
lenne egy mozgathat, mretezhet osztly, s a
konkrt programok ezt hasznlnk fel, ezt tltenk
meg tartalommal.

Tantrgy: A C++ nyelv Kdszm: 146


169. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A Windowsban nemcsak a fprogramok ablakok, hanem a nyomgombok, menelemek, inputsorok is!


"A nyomgomb olyan ablak, amely egrkattintsra
csinl valamit."
"A fablak olyan ablak, amelynek kerete van s mozgathat." stb.
A rendszer elemei gy egy hatalmas osztlyhierarchit
alkotnak.

Tantrgy: A C++ nyelv Kdszm: 146


170. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Egy msik hierarchia az ablakok kzt szemmel is lthat: egy ablak jabb ablakokat tartalmazhat. Az ablak
"szlje" a benn lev "gyerekablakoknak".
Pldul a Borland C++ fejleszti krnyezete:

A gyerekablak sosem "lg ki" a szl terletbl.

Tantrgy: A C++ nyelv Kdszm: 146


171. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Minimlis OWL program (egy res ablakot jelent meg):


#include <owl\applicat.h>
int OwlMain(int argc, char *argv[])
{
TApplication app("OWL miniprogram");
return app.Run();
}

Tantrgy: A C++ nyelv Kdszm: 146


172. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

main fggvny helyett az OwlMain a program f fggvnye


Egy Windows program elindtsa nem egyszer, sok
mindent be kell lltani. Ezeket a TApplication osztly
"tudja"; neknk csak ltre kell hozni egy ilyen tpus objektumot, s meghvni a Run() metdust.
A TApplication hasznlathoz szksg van az
<owl\applicat.h> include-fjlra.
A TApplication konstruktornak paramterknt megadhat (nem ktelez) egy string; ez lesz az ablak fejlcre cmknt rva.

Tantrgy: A C++ nyelv Kdszm: 146


173. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Hogyan tovbb?
A TApplication osztly nmagban csak egy keret;
kzvetlen felhasznlsval csak a fentihez hasonl
"res"
programok
kszthetk.
Valjban
a
TApplication tele van olyan virtulis metdusokkal,
amelyek nem csinlnak semmit. rtelmes programot
gy rhatunk, ha a TApplication-bl rkltetnk
egy osztlyt, amelyben a megfelel metdusokat felldefiniljuk.

Tantrgy: A C++ nyelv Kdszm: 146


174. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Bevezet plda: a semmittev program bonyolultabb,


de tovbbfejleszthet vltozata.
#include <owl\applicat.h>
#include <owl\framewin.h>
class SajatApp : public TApplication {
public:
SajatApp();
void InitMainWindow();
};

Tantrgy: A C++ nyelv Kdszm: 146


175. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

SajatApp::SajatApp() : TApplication() {}
void SajatApp::InitMainWindow()
{
SetMainWindow(new TFrameWindow(NULL,
"Itt a program neve"));
}
int OwlMain(int argc, char *argv[])
{
SajatApp app;
return app.Run();
}

Tantrgy: A C++ nyelv Kdszm: 146


176. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Definiltunk egy j osztlyt (SajatApp). Az


InitMainWindow() akkor hajtdik vgre, amikor a
program f ablakt ltre kell hozni. Ezt mi felldefiniltuk; a f ablak egy keretes ablak (TframeWindow). A TFrameWindow konstruktornak els paramtere egy szlablakra mutat pointer; azrt NULL,
mert a f ablakunk nem egy msik ablak rsze.
A SajatApp konstruktora semmit nem csinl, csak
meghvja az sosztly konstruktort.

Tantrgy: A C++ nyelv Kdszm: 146


177. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Furcsa lehet, hogy olyan metdust definilunk


(InitMainWindow()), amelyre aztn sehol sem hivatkozunk. Persze: a TApplication-bl rklt
Run()metdus az, amely valjban meghvja az
InitMainWindow()-t.
Az els pldnk azrt nem csinlt semmit, mert a
TApplication csak egy res keretprogramot adott.
A mostani azrt, mert a TFrameWindow mint f ablak
szintn csak egy semmit nem csinl alaprtelmezs. A kvetkez pld-ban egy sajt ablakosztlyt definilunk, amely mr reagl az egrgombnyomsra.

Tantrgy: A C++ nyelv Kdszm: 146


178. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

#include <owl\applicat.h>
#include <owl\framewin.h>
class SajatWin : public TWindow {
public:
SajatWin(TWindow *szulo=NULL);
protected:
void EvLButtonDown(UINT u, TPoint& p);
DECLARE_RESPONSE_TABLE(SajatWin);
};
DEFINE_RESPONSE_TABLE1(SajatWin, TWindow)
EV_WM_LBUTTONDOWN,
END_RESPONSE_TABLE;

Tantrgy: A C++ nyelv Kdszm: 146


179. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

void SajatWin::EvLButtonDown(UINT u,TPoint& p)


{
MessageBox("Megnyomtad a bal egrgombot.",
"Cm", MB_OK);
}
SajatWin::SajatWin(TWindow *szulo)
{ Init(szulo, 0, 0); }
class SajatApp : public TApplication {
public:
SajatApp();
void InitMainWindow();
};

Tantrgy: A C++ nyelv Kdszm: 146


180. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

SajatApp::SajatApp() : TApplication()
{ }
void SajatApp::InitMainWindow()
{
SetMainWindow(new TFrameWindow(NULL,
"Itt a program neve", new SajatWin));
}
int OwlMain(int argc, char *argv[])
{
SajatApp app;
return app.Run();
}

Tantrgy: A C++ nyelv Kdszm: 146


181. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A program a bal egr lenyomsra kir egy zenetet.


A SajatApp osztly annyit vltozott, hogy a benne
ltrehozott TFrameWindow konstruktorban egy
harmadik paramtert is megadtunk. Ez a paramter
egy TWindow-ra (vagy leszrmazottjra) mutat pointer, itt egy j, SajatWin osztly objektumot adtunk meg. gy a f keretablak tnyleges tartalma ez a
SajatWin objektum lesz.

Tantrgy: A C++ nyelv Kdszm: 146


182. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Esemnykezel ablakok osztlydefincijban szksg


van a DECLARE_RESPONSE_TABLE(AblNv); deklarcira.
A

DEFINE_RESPONSE_TABLE1(SajatWin, TWindow)
EV_WM_LBUTTONDOWN,
END_RESPONSE_TABLE;

jelentse: a SajatWin az osztlynv, a TWindow az sosztly, az EV_WM_LBUTTONDOWN a kezelend esemny neve


(az t lekezel virtulis fggvny neve pedig
EvLButtonDown).

Tantrgy: A C++ nyelv Kdszm: 146


183. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A Resource Workshop
Egy programnak jl elklntheten kt rsze van: egy bels mveletvgz rsz, amelynek felptse nem rdekli a
felhasznlt, s a felhasznli fellet, amelyen keresztl a
program hasznlja megadja a kvnsgait, s ahol az
eredmny megjelenik.
A felhasznli fellet elksztse nagy mrtkben automatizlhat. A Resource Workshop (Erforrs Mhely) segtsgvel szinte megrajzoljuk a felletet, a programszvegben nem kell a megjelentend mezk elhelyezkedsvel
foglalkoznunk; csak egy azonostval hivatkozunk a
Workshopban ltrehozott felletre.

Tantrgy: A C++ nyelv Kdszm: 146


184. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Tantrgy: A C++ nyelv Kdszm: 146


185. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Egy program ltrehozsnak lpsei:


Az alap keretprogram megrsa (ez az OwlMain
fggvnyt s - a mi esetnkben - a SajatApp
osztlyt jelenti).
A felhasznli fellet elksztse a Resource
Workshoppal.
Az esemnykezels megrsa.

Tantrgy: A C++ nyelv Kdszm: 146


186. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Plda: sebessg tszmtsa km/h s mph kztt.


Az alap keretprogram:
class SajatApp : public TApplication {
public:
SajatApp();
void InitMainWindow();
};
SajatApp::SajatApp() : TApplication()
{
}

Tantrgy: A C++ nyelv Kdszm: 146


187. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

void SajatApp::InitMainWindow()
{
SetMainWindow(
new TFrameWindow(
NULL,"Sebessg-tszmt",
new SajatDialog(0, DIALOGUS)));
}
int OwlMain(int argc, char *argv[])
{
SajatApp app;
return app.Run();
}

Tantrgy: A C++ nyelv Kdszm: 146


188. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

Az egyetlen jdonsg a fablak; egy SajatDialog


osztly ablak. Ezt az osztlyt ksbb hozzuk ltre, a
hozz tartoz felletet pedig a Resource Workshoppal
ksztjk el. A DIALOGUS paramter egy azonost,
amellyel a RW-ban ltrehozott felletet jelljk meg.

Tantrgy: A C++ nyelv Kdszm: 146


189. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A felhasznli fellet elksztse a Resource Workshoppal:

Tantrgy: A C++ nyelv Kdszm: 146


190. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A programunk fellete egy dialgusablak lesz, benne kt


inputsorral s kt gombbal; a fels sorban a sebessg
km/h szerint jelenik meg, az alsban mph szerint, a kt
gomb pedig a ktirny konverzit vgzi el:

A resource magyarul erforrst jelent. A Windowsban erforrsnak nevezik a menket, a dialgusablakokat s


elemeiket, a kpeket, ikonokat stb. Ahhoz, hogy a prog-

Tantrgy: A C++ nyelv Kdszm: 146


191. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

ramban hasznlni tudjuk az erforrsokat, hivatkozni kell


tudnunk rjuk. A RW-ban minden erforrshoz egy egsz
szm illetve egy azzal megegyez rtk konstansszimblum rendelhet.
A mi programunkban az erforrsok s szimblumaik:
Dialgusablak - DIALOGUS
Km/h inputja - KMH_EDIT
Km/h gombja - KMH_CONV
Mph inputja - MPH_EDIT
Mph gombja - MPH_CONV

Tantrgy: A C++ nyelv Kdszm: 146


192. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

A RW generl egy .rh kiterjeszts fejlcfjlt, amelyben


ezeket a konstansokat definilja. Ezt clszer a programunkban #include-dal beolvasni.
Az esemnykezels megrsa.
#include "atvalt.rh"
class SajatDialog : public TDialog {
public:
SajatDialog(TWindow *par, int resid)
: TDialog(par, resid)

Tantrgy: A C++ nyelv Kdszm: 146


193. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

{
mph=new TEdit(this, MPH_EDIT);
kmh=new TEdit(this, KMH_EDIT);
}
protected:
TEdit *mph,*kmh;
void KmhConv();
void MphConv();
};

DECLARE_RESPONSE_TABLE(SajatDialog);

Tantrgy: A C++ nyelv Kdszm: 146


194. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

DEFINE_RESPONSE_TABLE1(SajatDialog, TDialog)
EV_COMMAND(KMH_CONV, KmhConv),
EV_COMMAND(MPH_CONV, MphConv),
END_RESPONSE_TABLE;
void SajatDialog::KmhConv()
{
char s[11];
kmh->GetLine(s, 10, 0);
float m=atof(s); sprintf(s, "%f", m/1.609);
mph->Clear(); mph->Insert(s);
}

Tantrgy: A C++ nyelv Kdszm: 146


195. oldal

Informatikai Rendszerek
Intzete
Gbor Dnes Fiskola

void SajatDialog::MphConv()
{
char s[11];
mph->GetLine(s, 10, 0);
float m=atof(s); sprintf(s, "%f", m*1.609);
kmh->Clear(); kmh->Insert(s);
}

Kt esemny rdekes szmunkra: a kt nyomgomb


aktivizlsa. Ezek megnyomsakor az egyik inputsor
tartalmt tszmols utn betesszk a msik inputsorba.
VGE

You might also like