c++eavazlat-1

Upload: akarki77

Post on 01-Mar-2018

217 views

Category:

Documents


0 download

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