c programozas kozepiskolasoknak

Author: lajosmol

Post on 04-Jun-2018

224 views

Category:

Documents


3 download

Embed Size (px)

TRANSCRIPT

  • 8/13/2019 c Programozas Kozepiskolasoknak

    1/56

    1

    C programozs kzpiskolsoknak

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    2/56

    2

    1 Tartalomjegyzk1 TARTALOMJEGYZK ...................................................................................................... 1

    2 C PROGRAMOZS KZPISKOLSOKNAK ............................................................. 1

    2.1 AZ ELS CPROGRAM ....................................................................................................... 4

    2.2 MEGJEGYZSEK ................................................................................................................ 42.3 AVLTOZKRL .............................................................................................................. 42.3.1 Felhasznli tpus ................................................................................................... 7

    2.4 KONSTANSOK ................................................................................................................... 72.4.1 A const kulcssz hazsnlatval ............................................................................... 72.4.2 Az elfordtnak szl helyettestssel .................................................................... 7

    2.5 OPERTOROK ................................................................................................................... 72.5.1 Aritmetikai opertorok ............................................................................................ 82.5.2 sszehasonlt s logikai opertorok ..................................................................... 82.5.3 Lptet opertorok .................................................................................................. 82.5.4 Bitmveletek ............................................................................................................ 8

    2.5.5 rtkad opertorok ............................................................................................... 92.5.6 Feltteles opertor .................................................................................................. 92.5.7 Pointer opertorok .................................................................................................. 92.5.8 Tpuskonverzik ..................................................................................................... 10

    2.6 ADATOK BEOLVASSA A BILLENTYZETRL ................................................................. 112.7 ITERCIK ...................................................................................................................... 11

    2.7.1 while ciklus ............................................................................................................ 122.7.2 for ciklus ................................................................................................................ 122.7.3 do-while ciklus ....................................................................................................... 13

    2.8 SZELEKCIK ................................................................................................................... 142.8.1 if utasts ............................................................................................................... 142.8.2 if-else szerkezet ...................................................................................................... 142.8.3 switch utasts ....................................................................................................... 15

    2.9 TMBK ......................................................................................................................... 162.9.1 Egydimenzis tmbk ............................................................................................ 162.9.2 Sztringek ................................................................................................................ 172.9.3 Kett s tbb dimenzis tmbk ............................................................................ 19

    2.10 FELHASZNL LTAL DEFINILT TPUSOK ..................................................................... 202.10.1 Struktrk .............................................................................................................. 202.10.2 Struktrt tartalmaz tmbk ................................................................................ 20

    2.11 FGGVNYEK ................................................................................................................. 212.11.1 Paramtertads ................................................................................................... 212.11.2 Loklis s globlis vltozk ................................................................................... 222.11.3 Automatikus s statikus vltozk ........................................................................... 222.11.4 Register mdost jelz ......................................................................................... 232.11.5 Vektor tadsa fggvnynek .................................................................................. 24

    2.12 MUTATK (POINTEREK)................................................................................................. 242.12.1 Vektorok s mutatk .............................................................................................. 252.12.2 Ktdimenzis tmbk s pointerek ........................................................................ 27

    2.12.2.1 Dinamikus tmb egy vektorban .................................................................... 272.12.2.2 Konstansban megadott tmbmret, dinamikus helyfoglalssal .................... 282.12.2.3 Mutattmb ................................................................................................... 29

    2.12.3 Struktrk s mutatk ............................................................................................ 302.12.4 Dinamikus lista ...................................................................................................... 302.13 FILE KEZELS ................................................................................................................. 33

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    3/56

    3

    2.13.1 File elksztse, lezrsa ..................................................................................... 332.13.2 Szveges llomnyok ............................................................................................. 342.13.3 Binris llomnyok ............................................................................................... 36

    2.14 ASZVEGES KPERNY KEZELSE ................................................................................. 372.14.1 Szveges zemmdban gyakran hasznlt fggvnyek: .......................................... 372.14.2 Kperny mentse s vissztltse .......................................................................... 39

    2.14.3 Nhny karaktert tesztel makr ........................................................................... 402.14.4 Karaktert talakt fggvnyek ............................................................................. 412.14.5 Nhny konverzis fggvny ................................................................................. 41

    2.15 AGRAFIKA PROGRAMOZSA .......................................................................................... 412.15.1 Koordinta-rendszer ............................................................................................. 422.15.2 Grafika indtsa ..................................................................................................... 422.15.3 Gyakran hasznlt fggvnyek ................................................................................ 43

    2.16 MAKRK ........................................................................................................................ 442.16.1 Fggvnyszer makrk .......................................................................................... 44

    3 FELADATGYJTEMNY ............................................................................................... 47

    4 FGGELK .....................................................HIBA! A KNYVJELZ NEM LTEZIK.

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    4/56

    4

    1.1 Az els C program

    Tekintsk a kvetkez egyszer C nyelven rt programot:

    #include

    main(){printf( Els C programom \n);

    }

    A program kimenete az idzjelek kztt szerepl felirat, a kurzor pedig a kvetkez soron ll.

    Nzznk nhny megjegyzst a fenti programmal kapcsolatban:1. A C programozsi nyelv klnbsget tesz a kis s a nagy betk kztt. Minden C

    parancsnak kis betsnek kell lennie

    2. A C program belpsi pontjt amain()

    fggvnyhvs azonostja. Egyelre a fggvnyt argumentumok nlkl hvtuk meg, aksbbiekben ennek rszletezsre mg kitrnk.

    3. A { s } a kezd s a vgpontjt jellik a vgrehajtsi rsznek.4. #include nlkl nem mkdne a printf() fggvny.5. A printf()-ben a kirand szveget dupla idzjelek kz kell tennnk. Vegyk szre azt

    is, hogy a \n karakter nem kerlt kirsra. Teht a printf() kln tartalmazza a kirandszveget s a kirst befolysol vltozkat. Ami a dupla idzjelek kztt megjelenikvltoztats nlkl kirsra kerl, kivtel ez all a \ s % karaktereket kvet jel, vagy a

    jelsorozat. A \n vltoz a fordt szmra azt jelenti, hogy a kvetkez karakter kirsaeltt j sort kell kezdenie

    6. A parancsokat a ; zrja le.1., 2. feladat

    1.2 Megjegyzsek

    A megjegyzseket a programszveg magyarzatainak bersra szoktuk hasznlni.Hibakeresskor is j hasznt vehetjk azonban, ha a program egy rsznek vgrehajtstszeretnnk kihagyni, akkor azt megjegyzs blokkba zrhatjuk.

    /* ez most egy egysoros megjegyzs *//* ez most

    tbb sorosmegjegyzs */

    1.3 A vltozkrl

    A C tpusos programnyelv. Ez azt jelenti, hogy mieltt egy vltozt hasznlni szeretnnkdeklarlnunk, kell azt. Figyeljnk arra, hogy a a fordtprogram a vltoz nevekben isklnbsget tesz a kis s a nagy betk kztt.

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    5/56

    5

    A nvre a kvetkez megktsek rvnyesek:

    csak betket, szmjegyeket s alhzs karaktert tartalmazhat betvel kell kezddnie hossza legfeljebb 32 karakter (implementci fgg)

    A vltoz deklarci szablya C-ben a kvetkez:Tpus nev1,nev2,;Pldul:

    int s;float f,k;

    Egy vltozt kezdrtkkel is ellthatunk.int s=10;

    Nzzk a kvetkez C programot:#include

    main(){

    int sum;

    sum = 500 + 15;printf("500 s 15 sszege %d\n", sum);

    }A programban ltrehoztunk egy egsz tpus vltozt, majd egy sszeget rendeltnk hozz.

    Figyeljk meg a vltoz kiratst! Az idzjelek kztt most tallkozunk elszr a % jellel.Mgtte kell megadnunk, hogy erre a helyre milyen tpus vltoz kerl kirsra. A d bet azegsz tpusra utal. Az idzjel utn kvetkezik a vltoz neve. Ennek rtke kerl majd bersraa szvegbe.

    Az adatoknak a C-ben ngy alaptpusa van: egsz (int), karakter (char), vals (float, double),

    Az alaptpusokat ellthatjuk mdost jelzkkel is, ekkor az rtkkszlet mdosul.

    Pl.int aunsigned1

    Az els esetben az a rtke32768 s 32767 kztt lehet, mg a msodik esetben a b rtke 0 s65535 kztti szm lehet. A signed

    int b

    2

    1Eljel nlkli

    mdost jelz is hasznlhat, de alaprtelmezs szerintminden egsz vltoz ilyen lesz.

    2Eljeles

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    6/56

    6

    A kvetkez tblzatban felsoroltunk nhny tpust, rtkkszletkkel egytt.

    Adattpus rtkkszletMret(byte)

    Pontossg(jegy)

    char -128..127 1unsigned char 0..255 1

    int -32768..32767 2unsigned int 0..65535 2long int -2147483648..2147483647 4unsigned long int 0..4294967295 4float 3.4e-38..3.8e+38 4 6double 1.7e-308..1.7e+308 8 15long double 3.4e-4932..3.4e+4932 10 19

    A printf() fggvnyben a vltozkat csak gy tudjuk kiratni, hogy az idzjelek kztt % jelutn megadjuk a vltoz tpust, a kirs formtumt majd az idzjelek utn vesszkkelelvlasztva flsoroljuk a vltozk neveit. A gyakrabban hasznlt karaktereket a kvetkeztblzatban soroltuk fl.:

    Lehetsg van arra is, hogy meghatrozzuk avltoz rtke ltal elfoglalt mez szlessgt.

    Nzk a kvetkez pldkat

    int v1;printf(%5d,v1);

    A v1 egsz vltoz 5 karakter helyen jelenik meg.

    float f1;printf(%5.2f,f1);

    Az f vals vltozt 5 mezre rja ki 2 tizedes pontossggal.

    int v1,w=10;printf(%*d,w,v1);

    A * jelentse eben az esetben az, hogy a mezszlessget az idzjel utni els vltoz hatrozzameg. Teht a fenti pldban a v1 egsz vltoz 10 szlessg mezre kerl kirsra.

    Ha egy vltoz karakter tpus, akkor rtkt egyszeres idzjelek kztt kell megadnunk.

    char betu;betu=A;

    Egsz tpus vltoznak adhatunk 16-os vagy 8-as szmrendszerbeli rtket is.

    int okt, hex;okt = 0567;hex = 0x2ab4;hex = 0X2AB4;

    Minden vltoz esetn figyeljnk a kezdrtk megadsra. Ha ezt nem tesszk meg, avltoznak akkor is lesz kezdrtke, de biztosan nem olyan, amit mi szerettnk volna adni.

    %d decimlis egsz

    %u eljel nlkli decimlis egsz

    %f lebegpontos

    %c karakter

    %s sztirng vagy karakter tmb

    %e dupla vals

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    7/56

    7

    1.3.1 Felhasznli tpusHa egy tpus neve tl hossz s gyakran hasznlnunk kell a program sorn, akkor rdemes egyszinonimval hivatkozni r: Ennek a mdja:

    typedef tpus tpusnvEgy konkrt pldn keresztl

    typedef unsigned long int egesz;egesz n;

    Nhny tovbbi formzsi lehetsg a printf()-ben:

    3.,4.,5.,6. feladat

    1.4

    Konstansok

    A konstansok megadsnak kt mdjt ismertetjk az albbiakban.

    1.4.1 A const kulcssz hasznlatvalconst int a=30;

    Ebben az esetben vigyzni kell arra, hogy a konstanst inicializljuk is. Hibajelzst ad akvetkez deklarci:

    const int a;

    a=30;Az gy ltrehozott konstansok rtke kzvetlenl nem vltoztathat meg. A konstansok, azonbana memrban troldnak, gy rtkk kzvetetten mutatk hasznlatval mdosthat

    1.4.2 Az elfordtnak szl helyettestsselAz elfordtnak klnbz defincikat, lersokat adhatunk, errl a ksbbikeben mgrszletesen lesz sz. Most egyetlen pldt nzznk a konstansok megadsra

    #define ADO_KULCS 0.25

    Az gy megadott konstansok a program listjnak elejn szerepelnek a #include beillesztsekutn. Szintaktikailag a # a sor els karaktere kell hogy legyen, az ilyen sorokat nem zrhatjukpontosvesszvel, s minden sorban csak egy #define llhat. Mivel ezek a lersok azelfordtnak szlnak, ezrt minden olyan helyen, ahol a programlistban az ADO_KULCSazonost szerepel, az elfordt 0.25 rtket fog berni. Ezrt az gy ltrehozott konstansokrtke mg indirekt mdon sem vltoztathat.

    1.5 Opertorok

    A programok rsa sorn gyakran van szksgnk kifejezsek felptsre, vltznak trtnrtkadsra, szmolsi mveletekre, fggvnyhvsokra. A C nyelvben ezek a kifejezsekoparandusok, fggvnyhvsok s opertorok kombincijbl plnek fel.

    Az opertorokat tbbfle szempont szerint lehet csoportostani.

    Az operandusok szma szerint. (egy, kett, hrom operandus)

    \n j sor

    \t tabultor\r kocsi vissza\f soremels\v fggleges tabultor

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    8/56

    8

    Az opertor tpusa szerint (aritmetikai, logikai, lptet, bitmvelet, rtkad, feltteles) Az opertor helye szerint (prefix, postfix)

    Itt az opertorokat a tpusuk szerint trgyaljuk, de emltst tesznk a msik kt szempontrl is.

    1.5.1 Aritmetikai opertorokA ngy alapmvelet, a szoksos szimblumokkal, valamint a maradkos oszts % jellel. Amvelet az oszts maradkt adja vissza, termszetesen csak egsz tpus vltozk hasznlataesetn alkalmazhat. A msik ngy mvelet mind egsz, mind vals operandusok esetn ismkdik. Vigyzzunk a kvetkezhz hasonl esetekben.

    int a=12,b=5;float f;f=a/b;

    A programrszlet utn az f rtke a 2.000000 vals rtk lesz. Teht az eredmny tpust azoperandusok tpusa dnttte el.

    A mveletek precedencija a matematikban megszokott.1.5.2 sszehasonlt s logikai opertorokFelttelekben s ciklusokban gyakran kell sszehasonltani klnbz rtkeket, ennekelvgzsre a hasonlt opertorokat hasznljuk. Ezek a kvetkezk: ,=,==,!=. Haezekkel kt vltozt vagy kifejezst hasonltunk ssze, akkor az eredmny int tpus lesz, srtke 1, ha a relci igaz, illetve 0, ha hamis.

    A logikai kifejezsekben gyakran sszetett feltteleket is meg kell fogalmazni, erre szolglnak alogikai opertorok. Ezek a kvetkezk: !a tagads mvelete, egyoperandus. &&logikai s, ||logikai vagy mveletek. A mveletek precedencija a tblzatban.

    1.5.3 Lptet opertorokA vltoz rtknek eggyel val nvelsre, vagy cskkentsre szolglnak. Egyoperandusmveletek. Postfix s prefix alakban is rhatk. ++ eggyel nveli, -- eggyel cskkenti a vltozrtkt. Ha egy kifejezsben csak egy vltoz szerepel, akkor mindegy, hogy postfixes, vagy

    prefixes alakjt hasznljuk az opertoroknak. (a++ egyenrtk a ++a-val) Ha azonban egykifejezs kirtkelsben hasznljuk, akkor mr vatosabban kell bnni a kt alakkal.

    int a=4,x,y;x=++a;y=a++;

    A programrszletben az els rtkads eltt az a rtke 1-gyel n 5 lesz, ezt kapja az x vltoz,teht annak rtke is 5 lesz, a msodik rtkadsban az y megkapja a pillanatnyi rtkt az tt,majd az a rtke 1-gyel n, azaz 6 lesz. Az opertorok mind egsz, mind vals opertorokkalmkdnek.

    C-ben nem szoks az a=a+1 rtkads, helyette minden esetben a lptetst hasznljuk.

    1.5.4 BitmveletekA mveletek operandusai csak char, short, ints longtpus eljel nlkli egszek lehetnek.

    A mveletek els csoportja ktoperandus. ~ 1-es komplemens, & bitenknti s, | bitenkntivagy, ^ bitenknti kizr VAGY. Ezeket a mveleteket leggyakrabban maszkolsra, vagy bitek

    trlsre szoktuk hasznlni. A kizr VAGY rdekes tulajdonsga, hogy ha ugyanazt a maszkotktszer alkalmazzuk egy rtkre, akkor visszakapjuk az eredeti rtket.

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    9/56

    9

    A mveletek msik csoportjba a biteltol mveletek tartoznak. > eltolsjobbra. A felszabadul pozcikba 0 kerl, a kilp bitek elvesznek. A mveletek ktoperandusak. a

  • 8/13/2019 c Programozas Kozepiskolasoknak

    10/56

    10

    1.5.8 TpuskonverzikA C-ben ktfajta tpuskonverzi ltezik, az implicit (automatikus) s az explicit. Az els a Cnyelvbe rgztett szablyok szerint trtnik a programoz beavatkozsa nlkl, a msodik pediga tpuskonverzis opertor segtsgvel. Ennek ltalnos alakja:

    (tpusnv) kifejezs

    Az implicit konverzival kapcsolatban elmondhatjuk, hogy ltalban a szkebb operandusinformcivesztesg nlkl konvertldik a szlesebb operandus tpusra.

    int i,j;float f,m;m=i+f;

    Ebben az esetben az i float-ra konvertldik.

    j=i+f;Itt viszont vigyznunk kell, mert adatveszts lp fel, az sszeg trtrsze elveszik.

    Explicit konverzit kell vgrehajtanunk a kvetkez pldban, ha f-be nemcsak az egsz oszts

    hnyadost szeretnnk betenniint a = 12,b = 5;float f;f = (float) a / (float) b;

    A kvetkez tblzatban sszefoglaltuk az emltett mveleteket precedencijuk szerint rendezve.Valamint a kirtkels sorrendjt is megadtuk. A kirtkels sorrendje akkor kerl eltrbe, haegy kifejezsben egyenl precedencij opertorok szerepelnek zrjelezs nlkl

    Opertor Kirtkels sorrendje

    ! ~ - ++ -- & * (tpus) Jobbrl balra

    * / % Balrl jobbra

    + - Balrl jobbra

    > Balrl jobbra

    < >= Balrl jobbra

    == != Balrl jobbra

    & Balrl jobbra

    ^ Balrl jobbra

    | Balrl jobbra

    && Balrl jobbra

    || Balrl jobbra

    ?: Jobbrl balra

    = += -= *= /= %= = &= |= ^= Jobbrl balra

    7.,8.,9. feladat

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    11/56

    11

    1.6 Adatok beolvassa a billentyzetrl

    A formzott adatbeolvasst a scanf fggvny segtsgvel tehetjk meg. A fggvny ltalnosformja a kvetkez:

    scanf(formtum, argumentumlista)A scanf karaktereket olvas a billentyzetrl, majd a formtum alapjn rtelmezi azokat, ha a

    beolvasott karakterek megfelelk, akkor konvertlja ket. Ha az input valamilyen ok miatt nemfelel meg a formtum elrsainak, akkor a scanf befejezi az olvasst, mg akkor is, ha azargumentumlista szerint tovbbi karaktereket is be kellene olvasnia. A scanf fggvnynekvisszatrsi rtke is van. A sikeresen beolvasott adatok szmt adja vissza. Nzznk nhny

    pldt a scanf hasznlatra.

    int a ;char c;

    printf(Krek egy egsz szmot s egy bett);scanf(%d%c,&a,&b)

    A pldbl ltszik, hogy az egyszer adatokat cm szerint kell beolvasni. Az argumentumlistban

    az &a s az &c a vltozk memriabeli cmre utal. A formtumban ugyanazokat a karakterekethasznlhatjuk, mint a printf esetben korbban tettk. Ez a sor egy szmot s egy karaktert olvas

    be egyms utn, nem tesz kzjk semmilyen elvlaszt jelet. Nyilvn, ha egy scanf-fel tbbrtket is akarunk beolvasni, akkor valamilyen hatrolra szksg van.

    int a ;char c;

    printf(Krek egy egsz szmot s egy bett vesszvel elvlasztva);scanf(%d,%c,&a,&b);

    Figyeljk meg a vltoztatst. A formtumban egy vesszt tettnk a msodik % jel el. Ilyenkor a

    scanf beolvassa a vesszt is, de azt nem trolja. Ilyen mdon brmilyen hatrol karaktereketelrhatunk beolvasskor.

    A scanf segtsgvel sztringeket is olvashatunk be. Ebben az esetben nem hasznljuk az &opertort.

    char sz[30];scanf(%s,sz);

    A scanf egy hasznos lehetsge, hogy az adatok szrst is lehetv teszi. Az elbbi deklarciszerinti sz vltoz rtke csak szmjegy, vagy hexadecimlis jegy lehet, akkor azt a kvetkezszrssel valsthatjuk meg:

    scanf(%[0-9a-fA-F],sz)A komplementer halmaz megadsra is van mdunk:

    scanf(%[^0-9],sz)Ezzel a szrssel csak betk kerlhetnek a sztringbe

    10. feladat

    1.7 Itercik

    Mint minden magas szint programozsi nyelvben, a C-ben is vannak olyan utastsok, melyek

    egy feltteltl fggen tbbszr is vgrehajtjk ugyanazt az utastst, vagy utasts blokkot. Akvetkezkben ahol utastst runk helyettesthet utastsblokkal is. Utastsblokk:

    {

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    12/56

    12

    utasts1;utasts2;utastsn;

    }

    1.7.1 while ciklusA while ciklus ltalnos alakja:

    while (kifejezs)Utasts

    A ciklusmag utastsai addig hajtdnak vgre, amg a kifejezs rtke nem nulla. (Ez a logikaiigaznak felel meg, teht, ha a kifejezs egy logikai kifejezs, akkor itt a ciklusba lps feltteltadjuk meg)

    Nzznk egy pldt a while ciklusra. Adjuk ssze 1-tl n-ig a termszetes szmokat!

    #include

    main(){

    long osszeg=0;int i=1,n=2000;

    printf(Az els %d egsz szm sszege: ,n);while (i

  • 8/13/2019 c Programozas Kozepiskolasoknak

    13/56

    13

    main(){

    long osszeg;int i=1,n=2000;

    for (i=1,osszeg=0;i

  • 8/13/2019 c Programozas Kozepiskolasoknak

    14/56

    14

    11., 12., 13. feladat

    1.8 Szelekcik

    A C nyelvben hrom elgazs tpust hasznlhatunk. Az egyg (if szerkezet), a ktg (if-elseszerkezet) s a tbbg (switch szerkezet)

    1.8.1 if utastsAz utasts ltalnos alakja:

    if (kifejezs)utasts

    Itt az utasts csak akkor hajtdik vgre, ha a kifejezs nem nulla. (IGAZ)

    Pldaknt krjnk be egy vals rtket, de csak az ]1,10[ intervallumba es rtket fogadjuk el jrtknek.

    #include

    main(){

    float v;printf(Krek egy vals szmot\n);printf(1 s 10 kztt: );scanf(%f,v);if (v>1 && v< 10)

    printf(J rtk!!);

    }

    1.8.2 if-else szerkezetAz utasts ltalnos alakja:

    if (kifejezs)utasts1

    elseutasts2

    Ha a kifejezs rtke nem nulla (IGAZ), akkor az utasts1 hajtdik vgre, ha pedig nulla(HAMIS) az utasts2.

    Az elz pldnl maradva, ha az rtk rossz, akkor rassuk ezt ki az else gon!

    elseprintf(Az rtk rossz);

    Ezt a kt sort az elz programban az res sor helyre kell beszrni. Vigyzzunk azonban, ebbenaz esetben a J rtk sornak vgn nem llhat; ugyanis ekkor egy else kulcsszval tallkozna afordt, amivel viszont nem kezddhet parancs.

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    15/56

    15

    1.8.3 switch utastsAz utasts tbb irny elgazst tesz lehetv, de csak abban az esetben, ha egy egsz kifejezsrtkt tbb konstanssal kell sszehasonltani. ltalnos alakja:

    switch (kifejezs){

    case konstans1:utasts1;

    case konstans2:utasts2;

    .default:

    utasts;}

    A switch utastssal nagyon tgondoltan kell bnni. ltalnos esetben, ha az egyik case-nl

    tallunk egy belpsi pontot, akkor az utna kvetkez case cimkk utn ll utastsok is vgrefognak hajtdni.Hacsak nem pontosan ez a szndkunk, akkor minden utastst break-kel kellzrni, melynek hatsra a vezrls a switch utni els utastsra kerl. ltalban a defaulteseteket is break-kel szoktuk zrni, mert ez nem felttlenl az egyes esetek vgn ll, brholelhelyezhet a szerkezetben. Ha ugyanazt az utastst akarjuk vgrehajtani tbb konstans rtkesetn is, akkor a konstansokat egymstl:-tal elvlaszva soroljuk fel.

    Nzznk egy rvid pldaprogramot a switch illusztrlsra:

    #include

    main(){

    int menu, n1, n2, t;

    printf("rjon be kt szmot: ");scanf("%d %d", &n1, &n2 );

    printf("\n Vlasszon\n");printf("1=sszeads\n");printf("2=Kivons\n");

    scanf("%d", &menu );switch( menu ) {case 1: t = n1 + n2; break;case 2: t = n1 - n2; break;default: printf("Nem j vlaszts\n");

    }if( menu == 1 )

    printf("%d + %d = %d\n", n1, n2, t );else if( menu == 2 )

    printf("%d - %d = %d\n", n1, n2, t );}

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    16/56

    16

    Figyeljk meg, hogy minden vlaszts utn hasznltuk a break-et. A default utn nemhasznltuk, de ha a switch elejn van, akkor ott is rdemes odafigyelni r.

    14., 15., 16., 17., 18., 20. feladat

    1.9

    TmbkAz eddigiek sorn olyan vltozkat hasznltunk csak, melyek egy rtk trolsra voltakalkalmasak. Gyakran van azonban szksgnk arra, hogy ugyanazzal a vltoznvvel tbbrtkre is tudjunk hivatkozni. Ebben az esetben hasznljuk a tmbket. (Egy osztly mindentanuljhoz hozzrendeljk a magassgt, ilyenkor nyilvn rdemes vltoznvknt az osztlyazonostjt hasznlni, a tanulkra pedig a napl sorszmval)

    1.9.1 Egydimenzis tmbkA deklarci szintaxisa:

    Tpus tmbnv[mret]

    Konkrt pldk:int a[10]char betuk[5]Hivatkozsok a Pascalban is megszokott mdon trtnhetnek:

    betuk[1]=C; a[2]=23;A C-ben a tmb elemeinek sorszmozsa minden esetben 0-tl indul, azaz a fenti pldkbanvigyzni kell, mert nem hivatkozhatunk a[10]-re, mert az mr a tmb 11. eleme lenne.

    A tmbknek mr a ltrehozskor is adhatunk kezdrtket. Ennek szintaxisa a kvetkez lehet:

    int a[5]={1,2,3,4,5}int b[]={2,5,7,8,11,22,33}Az els esetben megmondtuk a tmb mrett s ennyi darab elemet is soroltunk fel, ha tbbelemet adtunk volna meg, akkor a fordt hibajelzssel lell, ha kevesebbet, akkor pedig avltoz trolsi osztlytl3

    A tmb mrett akr futsidben is meg tudjuk mondani. Ha egy program tesztelse sornvltoztatjuk egy tmb mrett (j elemeket vesznk fel a flsorolsba), akkor rdemes adefincis rszben a kvetkez sor beszrni:

    fggen vagy 0, vagy hatrozatlan rtk lesz. A msodik esetbennem adtuk meg az elemek szmt a szgletes zrjelben, csak felsorolssal, ilyenkor a tmb

    pontosan 7 elem lesz.

    #DEFINE MERET (sizeof(b)/sizeof(b[0]))Pldaknt nzzk meg, hogyan lehet egy 10 hosszsg vektor elemeit beolvasni, s sszegezni:

    #include #define SZAM 10

    main(){

    int a[10];int s=0,i;

    3 Lnyegben a vltoz elrhetsgt szablyozza, kicsit hasonl a Pascal globlis s loklis vltozihoz, aksbbiekben mg lesz rla sz.

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    17/56

    17

    for (i=0; i

  • 8/13/2019 c Programozas Kozepiskolasoknak

    18/56

    18

    strchr(sz1,c) Megnzi, hogy az sz1stringben elszr hol fordulel a c karakter

    char c=e, sz1[]=Hello, *ch;ch=strchr(sz1,c);

    printf(%d\n, ch-sz1);

    Eredmnye: 14

    strrchr(sz1,c) Ugyanaz, mint az elz, csakjobbrl indul

    strlwr(sz), strupr(sz) A sztringet kis, illetve nagybets formtumv alaktja

    sz=helloprintf(%s\n,strupr(sz));

    Eredmnye: HELLO

    strncpy(sz1,sz2,n) Az sz1 sztringbe msol sz2-bl n db karaktert;

    sz2=Hello;n=2;strncpy(sz1,sz2,n);sz[2]=\05

    printf(%s\n,sz1);;

    Eredmnye: He

    strncat(sz1,sz2,n) Az sz1 szringhez fz n db-otaz sz2-bl

    sz1=Hello; sz2=World; n=2;strncat(sz1,sz2,n);

    printf(%s\n,sz1);

    Eredmnye: HelloWo

    strrev(sz) Megfordtja a sztringet sz1=Hello;printf(%s\n,strrev(sz))

    Eredmnye:olleH

    strlen(sz) Egy sztring hosszt adja meg n=strlen(sz);

    Ha ezeket a sztring kezel fggvnyeket hasznlni akarjuk,akkor mindenkppen szksg van a#include beszrsra.

    Nzznk egy pldaprogramot arra, hogyan lehet egy sztringet karakterenknt vgigolvasnianlkl, hogy tudnnk a hosszt:

    #include

    main(){

    int sz[]=C programozsi nyelv;int i=0;while (s[i]){

    4Figyeljk meg, hogy az eredmny 1, ugyanis a sorszmozs most is 0-val kezddik. A vltoz deklarcikat isfigyeljk meg!5Figyeljnk fl r, hogy a sztring vgre neknk kell kitennnk a vgt jelz karaktert, klnben nem fog helyesenmkdni!

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    19/56

    19

    printf(\n%c,s[i];i++;

    }}

    21., 22., 23., 24., 25., 26. feladat

    1.9.3 Kett s tbb dimenzis tmbkA C nyelvben is lehetsgnk van kett vagy tbb dimenzis tmbk hasznlatra. Deklarlni akvetkezkppen kell:

    tpus nv [mret1] [mret2] ;Konkrt pldaknt egy vals rtkeket tartalmaz ktdimenzis tmbre:

    float f [5][2];Az els index ebben az esetben a sor index, a msodik pedig az oszlop index. A hivatkozs

    ennek megfelelen:f[1][2]=4.73;Lehetsg van itt is a kezdrtk megadsra:

    int matrix[3][2]={ {1,2}, {3,4}, {5,6}};Nagyon fontos, hogy az indexek itt is minden esetben 0-tl indulnak!

    Egy ktdimenzis tmb tblzatos megjelentse:

    #include #include

    #include

    #define SOR 4#define OSZLOP 3

    main(){

    int a[SOR][OSZLOP];int i,j;

    clrscr();randomize();for (i=0;i

  • 8/13/2019 c Programozas Kozepiskolasoknak

    20/56

    20

    }

    27. feladat

    1.10 Felhasznl ltal definilt tpusok

    Az elz rszben emltett sszetett adattpust tmbknek neveztk, a tmbk minden elemeazonos tpus kell hogy legyen. Gyakran szksgnk van azonban olyan egymssal sszetartozelemek trolsra is, melyek nem azonos tpusak, mgis egy egyedre jellemzk. Ezketleggyakrabban adatbzisokban talljuk meg. Gondoljunk itt egy szemly kereszt svezetknevre, szletsi idejre, alapfizetsre. Ezek klnbz tpus adatok mgis ugyanarra aszemlyre vonatkoznak.

    1.10.1 StruktrkEgy ilyen adattpust valstanak meg a struktrk. Ennek deklarcija ltalnos formban:

    struct nv {

    tpus1 tag1;tpus2 tag2;.}

    A bevezetben emltett konkrtpldban lert struktra:

    struct szemely {char vnev[20];char knev[15];int szev;

    float fizetes;}

    Ha ilyen tpus vltozt akarunk ltrehozni, akkor annak mdja:

    struct szemely sz;Erre a vltozra a nevvel s a struktrn belli tag nevnek megadsval hivatkozhatunk a.(pont) opertor segtsgvel:

    sz.vnev=Kovcs;A struktrt atypedef-fel egytt is hasznlhatjuk. Ilyenkor a struct utni azonost el is maradhat,s csak utna kerl a a tpust azonost nv:

    typedef struct {char vnev[20];char knev[15];int szev;float fizetes;} szemely

    Ebben az estben termszetesen a vltoz tpusnak megadsakor is hinyzik a struct.

    szemely sz;

    1.10.2 Struktrt tartalmaz tmbkHa egy struktra tpus vltozt ltrehoztunk, akkor annak segtsgvel csak egyetlen egyed

    jellemzit tudjuk trolni. Mit tehetnk, ha tbb egyedrl is ugyanazokat a jellemzket szeretnnk

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    21/56

    21

    raktrozni? Kzenfekv megolds olyan tmbk alkalmazsa, melynek minden egyes eleme azadott struktra tpus.

    Az elz pldnl maradva egy vllalatnak maximlisan 20 dolgozjrl a fenti adatokatszeretnnk trolni, akkor a

    szemely sz[20];

    adatszerkezettel dolgozhatunk. Az adatszerkezet egyes elemeire val hivatkozskor a struktras a tmbhivatkozsokat vegyesen alkalmazzuk.

    sz[2].szev=1961;

    28. feladat

    1.11 Fggvnyek

    Fggvnyeket a kvetkez esetekben szoks rni:

    Ha ugyanazt a tevkenysgsorozatot tbbszr is el kell vgeznnk ugyanolyan tpus, dems-ms rtket flvev vltozkkal.

    Ha a programunkat struktrltan, jl olvashatan szeretnnk megrni. Ez nagyon fontos aksbbi mdosthatsg miatt.

    Termszetesen az els kett eset egytt is fennllhat.A fggvny defnci ltalnos alakja:

    visszatrsi_rtk_tpus fvnv (tpus1 vlt1,tpus2 vlt2,){

    a fggvny teste

    return v1;}Konkrt plda egy egyszer fggvnyre:

    int osszeg(int a, int b){

    int s=a+b;return s;

    }Ha egy fggvnynek nincs visszatrsi rtke, akkor a void kulcsszt hasznljuk:

    void fnev(tpus1 vlt1,)

    1.11.1 ParamtertadsA paramtertads a Pascal-hoz hasonlan itt is trtnhet cm szerint s rtk szerint. Az elveszintn ugyanaz. Az rtk szerinti paramtertadsra az imnti fggvny lehet egy plda.Cmszerinti paramtertadsnl azonban mr sokkal jobban oda kell figyelni, mint a Pascalban.

    Pldaknt rjunk egy fggvnyt, mely a paramterben megadott vltozkat flcserli.

    #include #include

    void csere(int *a,int *b){

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    22/56

    22

    int s;s=*a;*a=*b;*b=s;

    }

    main(){

    int k=2;l=4;printf(%d,%d,k,l);csere(&k,&l);

    printf(\n%d,%d,k,l);}

    Nzzk meg figyelmesen a listt! Mr rgtn a fggvny fejben szrevehetnk egy vltozst, a

    *-ot hasznljuk, ezzel a vltoz memriabeli helyn tallhat rtkre utalunk. A msik vltozs afggvnyhvskor figyelhet meg, az C opertort hasznljuk, ezzel jelezzk azt, hogy nem avltoz rtkt, hanem e memriabeli cmt adjuk t. Nyilvn a fggvnyben emiatt kellhasznlnunk a * opertort. Ezek az opertorok a mutatkhoz (pointer) ktdnek, a ksbbiekbenmg lesz rluk sz.

    Vegyk szre azt is, hogy a fggvnynek nincs visszatrsi rtke, annak ellenre, hogy aztadott vltozk rtke megvltozott.

    29., 30., 31. feladat

    1.11.2 Loklis s globlis vltozkA loklis vltozkat csak azok a blokkok6

    A globlis vltozkat minden fggvny ltja, rtkket mdosthatja. Ezeket a vltozkatminden fggvny trzsn kvl kell deklarlni, clszer rgtn a #define utn megtenni ezt.Ajnlott a globlis vltozkat egy tmbben deklarlni, lehetsg van ugyan arra, hogy ktfggvny kztt is deklarljunk vltozt, ebben az esetben viszont az elbb lv fggvny nemltja az alatta lv vltozt, annak ellenre sem, hogy az fggvnyeken kvl lett ltrehozva.

    ltjk, ahol deklarlva lettek, ez all a main semkivtel. Ezek a vltozk a veremben troldnak, teht minden fggvnyhvskor trldik azrtkk.

    1.11.3 Automatikus s statikus vltozkBevezetsknt tanulmnyozzuk a kvetkez programot:#include #include

    void demo(){

    static int sv=0;auto int av=0;

    prtintf("sv= %d, av= %d",sv,av);

    6Nem vletlen a kiemels. Itt valban blokkrl van sz, azaz lehet olyan loklis vltozm is, amit csak egy forciklus vgrehajtsi rsze lt, a fggvny tbbi rsze nem. Ez egy jelents eltrs a C s aPascal loklis vltozikztt.

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    23/56

    23

    ++sv;++av;

    }

    main(){

    char c;int i=0;

    clrscr();while (i

  • 8/13/2019 c Programozas Kozepiskolasoknak

    24/56

    24

    1.11.5 Vektor tadsa fggvnynekA kvetkez plda bemutatja, hogy egy vektort hogyan adhatunk t paramterknt egyfggvnynek. A fggvny az tadott vektor legnagyobb elemvel tr vissza.

    #include #include

    #include int maximum(int a[], int n){

    int i;int max=a[0];

    for (i=1;i

  • 8/13/2019 c Programozas Kozepiskolasoknak

    25/56

    25

    int a=10,b=15, *p;clrscr();

    p=&a;*p+=a+b;

    printf("%d",a);

    p=&b;*p+=a+b;

    printf("%d",b);

    while ((c=getch()) !=13);}A mutatknak nem ez a bvszkeds adja ajelentsgt. Segtsgkkel dinamikusan kezelhetjka memrit, mindig csak annyit hasznlva, amennyire az adatoknak ppen szksge van.

    32. feladat1.12.1 Vektorok s mutatkA C programozsi nyelvben igen szoros kapcsolat van a a vektorok s az egyszeres indirektsg7mutatk kztt. Ez a vektorok trolsi mdjbl ered. A vektorok a memriban sorfolytonosanhelyezkednek el. Ha egy pointert a vektor els elemre irnytunk, akkor a pointer aritmetikaszablyai szerint ehhez 1-et hozzadva a vektor msodik elemt fogjuk megkapni.8

    int *p,a[10];p=&a[0];Ekkor a *p hivatkozs a vektor els elemt fogja jelenteni. Teljesen egyenrtk a kvetkez kt

    hivatkozs:*p=5; a[0]=5;Mivel a kapcsolat ilyen szoros a vektor s a vektor els elemre mutat pointer kztt, ezrt avektoros s a pointeres hivatkozsok felcserlhetk. a fenti deklarcik szerint a vektor i-edikelemre val hivatkozsok:

    a[i], p[i], *(a+i), *(p+i)Az els kett tmbs, a msodik kett pedig pointer tpus hivatkozs. Jl jegyezzk meg teht,hogy az a tmbnv s a p mutat is az elemek sorozatnak els elemt jelenti .

    Pascal programokban, ha szksgnk volt egy vektorra, akkor azt mr vltoz deklarciban

    ltre kellet hoznunk s a mrett is be kellett lltanunk. Ha a vektor elemszma elrheti a 100-atis, de az esetek 99%-ban neknk csak 10 elemre van szksgnk, nem tehettnk mst, minthogy 100 hosszsgra hoztuk ltre a vektort, ezzel jelents memria terletet lefoglaltunk. A Cnyelv programokban nagyon egyszeren ltrehozhatunk dinamikus helyfoglals vektorokat.Ezeknl futsi idben dl el, hogy milyen hosszsgak lesznek, ha a tovbbi feldolgozshoznincs szksg rjuk, akkor az ltaluk lefoglalt memria felszabadthat.

    Nzznk erre egy pldaprogramot. A program megkrdezi, hogy hny elem vektorral kvnunkdolgozni, majd helyet foglal a memriban az elemeknek, vletlen szmokkal feltlti a vektort,kirja az elemeket s sszegket, majd a vgn felszabadtja a lefoglalt memria terletet.

    7

    i nt * *p

    ; p egy olyan mutat, mely egy egszre mutat mutatra mutat. Ktszeres indirektsg.8Mutatk esetn a p++nvels nem eggyel nveli p rtkt, hanem a szomszdos cmre mutat. Azaz, ha amutateredetileg egy char tpus vltozra mutatott, akkor a nvels 1, ha egy int tpusra, akkor a nvels 2, havalamilyen sszetett struktrra, akkor pedig ennl sokkal tbb.

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    26/56

    26

    #include #include #include

    main(){

    char c;

    unsigned int *p,n,i;long int osszeg=0;

    clrscr();randomize;

    printf("Hny adattal akarsz dolgozni: ");scanf("%u",&n);

    /* Helyfoglals a memriban, p az els helyre mutat */p=(unsigned int *) calloc(n,sizeof(unsigned int));if (!p)

    {printf("Nincs elg hely a memriban");return -1;

    }

    for (i=0;i

  • 8/13/2019 c Programozas Kozepiskolasoknak

    27/56

    27

    Figyeljk meg a p-nek trtn rtkadst! A calloc fggvny visszatrsi rtke egy tpus nlklimutat, ezt egy tpuskonverzival t kellet alaktani a p tpusnak megfelel alakra.9

    A programban a pointeres s tmbs hivatkozs vegyesen lett hasznlva, mutatva ezzel a kettteljes egyenrtksgt.

    Mindenesetben meg kell vizsglni, hogy sikeres volt-e a helyfoglals. Ha nincs elg memria, akkor acalloc fggvny NULL (nulla) rtkkel tr vissza, ebben az esetben a return 1 hatsra a

    program kilp a main() fggvnybl s befejezi futst.

    1.12.2 Ktdimenzis tmbk s pointerekTermszetesen ktdimenzis tmbket is lehet dinamikusan kezelni. Erre hrom klnbzmdszert mutatunk be. Mindhrom program csupn annyit csinl, hogy egy mtrixot feltltvletlen szmokkal, majd tblzatos formban megjelenti. A programok utn rvidmagyarzatok is lesznek.

    1.12.2.1Dinamikus tmb egy vektorban#include

    #include #include

    main(){

    char c;int n,m,*p;int i,j;

    clrscr();randomize();

    printf("Sorok szma: ");scanf("%d",&n);

    printf("Oszlopok szma: ");scanf("%d",&m);

    p=(int *) calloc(n*m,sizeof(int));if (!p)

    {printf("Nincs elg memria!");return -1;

    }

    for (i=0;i

  • 8/13/2019 c Programozas Kozepiskolasoknak

    28/56

    28

    while ((c=getch()) !=13);

    }A memriafoglals ebben a programban valban futsi idben trtnik. Ha kzelebbrl isszemgyre vesszk a listt lthat, hogy itt a mtrixot valjban egy vektorban troljuk. Az

    aktulis pozcit pedig ahely=aktulis_sor*oszlopszm+aktulis_oszlop

    formulval hatroztuk meg. Figyeljnk fl itt is a kt fajtahivatkozsra!

    1.12.2.2Konstansban megadott tmbmret, dinamikus helyfoglalssal#include #include #include

    #define N 6#define M 5

    typedef int matrix[N][M];

    main(){

    char c;matrix *p;int i,j;

    clrscr();

    p=(matrix *) calloc(1,sizeof(matrix));if (!p)

    {printf("Nincs elg memria!");return -1;

    }for (i=0;i

  • 8/13/2019 c Programozas Kozepiskolasoknak

    29/56

    29

    mtrixok esetben szoksos. Itt a calloc fggvnyben rdekes mdon csak 1 elem szmra kellhelyet foglalni, ami viszont akkora, mint a tljes mtrix.

    1.12.2.3Mutattmb#include #include

    #include

    #define N 5

    main(){

    char c;

    int *p[N],oszlop[N];int i,j;

    clrscr();

    for (i=0;i

  • 8/13/2019 c Programozas Kozepiskolasoknak

    30/56

    30

    Itt a mtrixot egy mutattmbbel valstottuk meg. A klnlegessg az, hogy a sorok eltrhosszsgak is lehetnek. A mutatknak egyesvel adtunk rtket, azaz a helyfoglals soronknttrtnt. A felszabadtst szintn ciklus segtsgvel kell vgezni.

    33., 34. feladat

    1.12.3 Struktrk s mutatkA korbbiakban mr volt sz a struktrkrl. Pointerekkel hivatkozhatunk a struktrk egyeselemeire is, mint azt a kvetkez pldban lthatjuk.

    struct datum{ int ev,ho,nap};

    struct datum *map;Az gy ltrehozott mutatnak rtket adhatunk, illetve rtkt lekrdezhetjk.

    (*map).ev=2001; (*map).ho=2; (*map).nap=14;Mivel a C-ben elg gyakori a struktrk s a pointerek hasznlata, a fenti hivatkozsoknak van

    egy msik alakja is.map->ev=2001;map->ho=2;map->14;A kt hivatkozs egymssal teljesen egyenrtk, de a C programokban s a szakirodalomban amsodik lnyegesen elterjedtebb.

    1.12.4 Dinamikus listaA lista olyan adtaszerkezet, melynek minden egyes eleme kt jl elklnthet rszbl ll, azadatrszbl s egy mutatbl, mely a listakvetkez elemre mutat. A lista els elemre alistafejjel hivatkozhatunk. A lista utols elemnek mutat mezje pedig NULL rtk.

    A fenti brn a szrke az adatrsz a fekete pedig a mutat rsz.

    A lista szerkezetnek sok elny van egy vektorhoz kpest. Egy listban tnyleg mindig csak annyielem van, amennyire ppen szksgnk van. A szerkezet mdostsa is nagyon egyszer. Ha egyj adatot akarunk felvenni, akkor

    1. megkeressk az j elem helyt2. az aktulis adat mutatjt tmsoljuk az j elem mutatjba3. az aktulis elem mutatjt az j elemre irnytjuk

    Ha egy listbl egy elemet trlni akarunk, akkor a kvetkezkppen jrhatunk el:

    1. megkeressk a trlend elemet2.

    a mutatjt bemsoljuk az eltte lv elem mutatjba

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    31/56

    31

    Nzzk ezt elszr egy egyszer programon keresztl. Elszr ltrehozunk egy struktrt, astruktramutat mezje egy ugyanilyen tpus struktrra hivatkozik, ezt nevezzk nhivatkozstruktrnak.

    #include struct lista {

    int value;struct lista *next;

    };

    main(){

    struct lista n1, n2, n3, n4;struct lista *lista_pointer = &n1;

    n1.value = 100;n1.next = &n2;

    n2.value = 200;n2.next = &n3;n3.value = 300;n3.next = &n4;n4.value = 400;n4.next = 0;

    while( lista_pointer != 0 ) {printf("%d\n", lista_pointer->value);lista_pointer = lista_pointer->next;

    }}Ez mg gy egyltaln nem dinamikus, csak a lista hasznlatt figyelhetjk meg rajta. Vegykszre, hogy az a sok rtkads a listzs eltt, ciklikus folyamat, nyilvn nem rdemes ilyensokszor lerni.

    n1.next = n2.next;n2_3.next = n2.next;n2.next = &n2_3;

    Mi trtnik a listval a fenti rtkadsok hatsra?

    A kvetkez program mr egy dinamikus lista megvalstsra mutat pldt.#include #include #include

    struct data{

    int value;struct data *nxt;

    };

    struct data *head=NULL, *prev, *akt, *next;

    void list()

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    32/56

    32

    {akt=head;while (akt!=NULL)

    {printf("%5d",akt->value);akt=akt->nxt;

    }}

    main(){

    char c;

    int i=0,sv;

    clrscr();randomize();

    printf("Kvetkez szm ");scanf("%d",&sv);

    while (sv>0){

    akt=(struct data *) malloc(sizeof(struct data));if (!akt)

    {printf("Nincs elg memria!");return -1;

    }akt->value=sv;akt->nxt=NULL;

    if (i==0)head=prev=akt;

    else{

    prev->nxt=akt;prev=akt;

    }printf("Kvetkez szm ");scanf("%d",&sv);i++;

    }

    printf("\n");list();

    while ((c=getch()) !=13);}

    A fprogramban lv while ciklussal pozitv szmokat olvasunk be, s ezeket fzzk fl egydinamikus listba. Ltszik, hogy a listban mindig csak a kvetkez elem szmra foglalunk

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    33/56

    33

    helyet a malloc fggvnnyel. A lista feltltse utn meghvott list() fggvny a flvett elemeketlistzza ki.

    35. feladat

    1.13 File kezels

    A C nyelvben az adatllomnyokat tartalmuk alapjn kt csoportra oszthatjuk, szveges sbinris llomnyokra. A szveges llomnyok olvashat informcit tartalmaznak. Sorokblplnek fel, minden sor vgt a CR/LF karakterpr zrja. A binris llomnyok byte-okblfelpl adtahalmazt jelentenek. A szveges llomny minden esetben fldolgozhat, mint

    binris llomny, de ez fordtva mr nem igaz.

    Szveges llomnyokban is lehet szmokat trolni. Ebben az esetben a szmok, mint karakterekfogan troldni. Ha pldul egy ngy jegy szmot szveges llomnyban trolunk, akkor ngy

    byte-nyi helyet foglal el, ha azonban egy binris llomnyba tesszk le, akkor csak 2 byte kell.(Termszetesen csak akkor, ha int tpus volt)

    1.13.1 File elksztse, lezrsaA file kezelshez tartoz fggvnyek az stdio.h deklarcis llomnyban vannak lerva. Mindenfile-hoz hozz kell rendelni egy FILE tpus muatatt, mely a memriban a file jellemziremutat10

    FILE *fp;

    . Ennek formja:

    Ez utn kvetkezhet a file megnyitsa:

    fp=fopen(A:\SZOVEG\NEV.TXTnv,md);Az fp mutat rtke NULL, ha az llomny megnyitsa sikertelen volt. A fizikai file nvbenteljes elrsi tvonalat is megadhatunk, ebben az esetben azonban gyelni kell a \ jelhasznlatra:

    A:\SZOVEG\NEV.TXT helyett A:\\SZOVEG\\NEV.TXT11

    A md paramter azt jelenti, hogy milyen mveleteket akarunk vgezni az llomnnyal.

    Md Lers

    r (+)Ltez file megnyitsa olvassra. File mutat a fileelejre ll.

    w (+)j file megnyitsa rsra. Ltez file esetn annaktartalma elvsz. . File mutat a file elejre ll.

    a (+)File megnyitsa hozzrsra. Nyits utn a filemutatja file vgre ll. Ha a file nem ltezik, akkor azfopen ltrehozza

    Mindegyik md,jellemz kiegszthet egy + paramterrel, ez miden esetben azt jelenti, hogy azllomnyt olvashatjuk s rhatjuk is. A md sztringben szoktuk mg megadni, hogy milyenllomnnyal dolgozunk. t szveges, b binris llomnyt jelent.

    Nzznk egy konkrt pldt, melyben egy szveges llomnyt megnyitunk rsra s olvassra:

    FILE *fp;

    10Logikai file nv11A string konstansokban a \ jel egy formz karaktert vezet be.

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    34/56

    34

    fp=fopen(A:\\SZOVEG\\NEV.TXT,r+t);if (fp==NULL)

    {printf(Sikertelen file nyits!);return 1;

    }A file nyitst gyakra szoktk az if-en bellre helyezni. Ekkor a szintaktikja a kvetkez:

    if (!(fp=fopen(A:\\SZOVEG\\NEV.TXT,r+t))){

    printf(Sikertelen file nyits!);return 1;

    }Ha a file-on elvgeztk a megfelel mveleteket, akkor le kell zrni. Ezt az fclose(fp)fggvnyhvs valstja meg. Amennyiben egy fileban rsi mveleteket is vgeztnk lezrs

    eltt clszer az fflush(fp) fggvnyhvs, ez az tmeneti pufferek tartalmt kirja azllomnyba, ha mg nem trtnt volna meg.

    1.13.2 Szveges llomnyokSzveges llomnyokkal kapcsolatban leggyakrabban alkalmazott fggvnyeket az albbitblzatban foglaljuk ssze. Minden esetben a

    FILE *fp;char ch,string[]=Kirand szveg;char sz[20];defincikat hasznljuk

    Fggvny Lers

    ch=fgetc(fp) Beolvas egy karaktert a file-bl

    fputc(ch,fp) Kir egy karaktert a file-ba

    fgets(sz,strlen(string)+1,fp) Az sz vltozba beolvas egy sztringet

    fputs(string,fp) A string vltoz tartalmt kirja a file-ba

    fscanf(fp,konv,&valt) Hasonl a scanf-hez, eltrs az els paramterben

    fprintf(fp,konv,valt Hasonl a printf-hez, eltrs az els paramterben

    Az albbiakban kt egyszer programot mutatunk be a szveges llomnyok kezelsre:

    #include #include #include

    main(){

    char c;FILE *fp;

    int i;

    clrscr();

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    35/56

    35

    if (!(fp=fopen("A:\\Fileok\\p.txt","wt"))){

    fprintf(stderr,"Nem sikerlt megnyitni az llomnyt");return -1;

    }

    for (i=0;i

  • 8/13/2019 c Programozas Kozepiskolasoknak

    36/56

    36

    while( (c = fgetc(fp)) != EOF )putchar (c);

    fclose (fp);}

    }

    1.13.3 Binris llomnyokA binris llomnyokat byte-onknt vagy blokkonknt kezelhetjk. A byte-onknti kezelshezjl hasznlhat az elz rszben lert fgetc s fputc fggvnypros. A blokkonknti kezelstpedig az fread s az fwrite fggvnyekkel vgezhetjk el.

    Hasznlatukat a kvetkez pldban figyelhetjk meg.

    #include #include #include

    main()

    {char c;FILE *bf;int i[10]={1,2,3,4,5,6,7,8,9,10},counter,sv;

    clrscr();

    if (!(bf=fopen("A:\\fileok\\adat.dat","w+b"))){

    printf("Sikertelen file nyits");return -1;

    }

    fwrite(i,sizeof(int),10,bf);

    rewind(bf);counter=fread(&sv,sizeof(int),1,bf);

    printf("%4d",sv);

    fseek(bf,3*sizeof(int),SEEK_SET); /* A 4. elemre ll */counter=fread(&sv,sizeof(int),1,bf);

    printf("%4d",sv);

    fseek(bf,0*sizeof(int),SEEK_CUR); /* A rkvetkezre ll */counter=fread(&sv,sizeof(int),1,bf);

    printf("%4d",sv);

    fclose(bf);

    while ((c=getch()) !=13);

    }

    Nzzk elszr az fwrite fggvnyt. A fggvny els paramtere a kirand vltoz neve,msodik paramtere az adott struktrhoz tartalmaz blokkmret, harmadik paramter a kirandelemek darabszma, negyedik pedig az llomny mutatja.

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    37/56

    37

    Az fread fggvny hasonlkppen paramterezhet. Eltrs abban van, hogy beolvasskornyilvn a vltoz cmt kell megadni a fggvnynek, a msik hrom paramter ugyanaz.Termszetesen mindkt fggvnynek van visszatrsi rtke is. Mindkettnl a sikeresen kirtilletve beolvasott blokkok szmt adja vissza. Ez az rtk hasznlhat a sikertelen beolvassilletve kirs figyelsre. Ha a fenti programban a counter vltoz rtke nem egyenl eggyel,akkor az azt jelenti, hogy nem sikerlt beolvasni adatot az llomnybl. Ezeknek a vltozknak a

    megadsa nem ktelez, mint a fenti programbl is ltszik az fwrite fggvnyt enlkl hvtukmeg.

    A programban van mg egy jdonsg, az llomnyban val pozcionls. Erre az fseekfggvnyt hasznljuk. Paramterezse: els paramter a file mutat, msodik a blokkmret segy egsz szm szorzata (ennyiedik elemre fogunk llni), harmadik pedig azt mutatja meg, hogymihez viszonytjuk a pozcionlst. SEEK_CUR esetn a pillanatnyi pozcihoz, SEEK_SETesetn pedig a file elejhez. Vigyzzunk azonban ennek az alkalmazsval, a sorszmozs mostis a nulladik elemtl kezddik, ennek a SEEK_SET esetn lehet jelentsge. A pillanatnyi

    pozcival pedig az a helyzet, hogy amikor egy adat beolvassa megtrtnt, akkor a file mutatrgtn eggyel tovbb lp, teht, ha a szomszdos elemre akarunk lpni, akkor termszetesen a

    fseek-ben 0-t kell adnunk a msodik paramter helyn

    12

    36., 37., 38. feladat.

    1.14 A szveges kperny kezelse

    A Turbo C a kpernyt grafikus s szveges zemmdban mkdtethet. Mindkt zemmdbannagyon sok fggvnyt segt vltozatosabb tenni a kpernyt ebben a fejezetben a szvegeszemmd fggvnyeirl lesz sz.

    Ha ezeket a fggvnyeket hasznlni szeretnnk, akkor a program elejn a kvetkez header file-okra lesz szksgnk:

    #include #include #include Valjbana kpernyt kezel fggvnyek az elsben vannak deklarlva, de kpernynsztringekkel s karakterekkel dolgozunk, ezrt szinte mindig szksgnk van a msik kettreis.A sztring kezel fggvnyekrl korbban mr volt sz ezt mg ebben a fejezetben kiegsztjknhny konverzis fggvnnyel s a gyakrabban hasznt karakterkezel fggvnyeket isflsoroljuk.

    1.14.1 Szveges zemmdban gyakran hasznlt fggvnyek:Nv Lers Nv Lers

    cprintf() Formzott kivitel, hasonl aprintf-hez

    clreol() sor trlse az aktulis kurzorpozcitl

    cputs() egy string kivitele akpernyre

    gotoxy() a kperny adott pontjbamozgatja a kurzort

    putch() egy karakter kivitele window() ablak definilsa

    getche()egy karakter beolvassa a

    billentyzetrl s kirsa akpernyre

    textcolor() szveg szne

    clrscr() kperny trlse textbackground httr szne

    12Ilyet nyilvn nem fogunk csinlni, mert automatikus a tovbblps

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    38/56

    38

    Ha a kpernyn egy ablakot hozunk ltre, akkor onnantl kezdve minden koordintt azablakhoz kpesti relatv rtkekkel kell megadnunk. Ha azt akarjuk, hogy az ablak szne mslegyen, mint a krnyezet, akkor a httrszn belltsa utn trlnnk kell a kpernyt.

    Az aktv ablakra vonatkoz informcikat is lekrdezhetjk. Ehhez a rendszer egy a conio.h-bandefinilt struktrt bocst rendelkezsnkre

    struct text_info {unsigned char winleft; /* az ablak bal fels sarka x koord */unsigned char wintop; /* az ablak bal fels sarka y koord */unsigned char winright; /* az ablak jobb als sarka x koord */unsigned char winbottom; /* az abla jobb als sarka y koord */unsigned char attribute; /* a szveg attribtuma szn+httr egytt */unsigned char normattr; /* norml attribtum */unsigned char currmode; /* aktulis md: */unsigned char screenheight; /* a kperny magassga */

    unsigned char screenwidth; /* a kpernyszlessge */unsigned char curx; /* a kurzor aktulis pozcija x koord */unsigned char cury; /* a kurzor aktulis pozcija y koord */

    };Attl, hogy a struktrban karakterekknt vannak ltrehozva az egyes tagok nyugodtanvgezhetnk velk matematikai mveleteket, de az is lehetsges, hogy egy egsz tpusvltozhoz rendeljk hozz a lekrdezett rtkeket Ha ezt a struktrt hasznlatba szeretnnkvenni, akkor szksg van a

    struct text_info info;gettextinfo(&info);

    defincikra is. Ezutn mr minden tovbbi nlkl hasznlhat a

    x=info.screenwidth;

    tpus hivatkozs.

    Nzznk egy plda programot a kperny kezelsre. Az albbi program az aktulis szvegeskperny kzepre rajzol egy 40x20-as ablakot. Ebbe 5 menpontot r ki, s kzlk beolvasegyet. A program futsnak csak akkor van vge, ha tnyleg ltez pontot olvastunk be.

    #include #include #include #include #include

    #define SZ 20#define M 10

    char menu_pontok[5][15]={"Els pont","Msodik pont","Harmadik pont","Negyedikpont","V G E"};

    char cim[]=" M E N P O N T O K ";char ala[]="-----------------------";

    char val[]="Krem vlasszon: ";main()

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    39/56

    39

    {char c;int xj,yj,xb,yb;int i;char valasz;

    struct text_info info;gettextinfo(&info);textbackground(BLACK);clrscr();

    xb=info.screenwidth/2-SZ;yb=info.screenheight/2-M;xj=xb+2*SZ;yj=yb+2*M;

    window(xb,yb,xj,yj);

    textbackground(YELLOW);textcolor(BLUE);clrscr();gotoxy(20-strlen(cim)/2,2);cprintf(cim);gotoxy(20-strlen(cim)/2,3);cputs(ala);

    for (i=0;i'5' || valasz

  • 8/13/2019 c Programozas Kozepiskolasoknak

    40/56

    40

    char puffer[4096];

    int main(void){

    int i;

    clrscr();for (i = 0; i

  • 8/13/2019 c Programozas Kozepiskolasoknak

    41/56

    41

    isgraph nyomtathat karakter, de nemszkz ispunct

    elvlaszt karakter, az sszesnyomtathat karakter a betk,szmok s szkz nlkl.

    jelentse: a makr visszatrsi rtke nem nulla, ha c rtke

    1.14.4 Karaktert talakt fggvnyekFggvny Lers

    toascii ASCII karekterr alakttoupper Az angol kis betket nagy betkk alaktjatolower Az angol nagybetket kis betkk alaktja

    1.14.5 Nhny konverzis fggvnyFggvny pldval Lers

    float f;char *str = "12345.67";f = atof(str);

    Sztringet konvertl t lebegpontos rtkk,sikertelen esetn 0-val tr vissza

    int n;char *str = "12345.67";n = atoi(str);

    Sztringet konvertl t egsz szmm,sikertelen esetn 0-val tr vissza

    long l;char *lstr = "98765432";l = atol(lstr);

    Sztringet konvertl t hossz egsz szmm,sikertelen esetn 0-val tr vissza

    char *string = "87654321", *endptr;unsigned long lnumber;

    lnumber = strtoul(string, &endptr, 10);

    Sztringet egssz alakt, az utols szm aszmrendszer alapszma (2-36), endptr a

    hibra mutatchar *string = "87654321", *endptr;long lnumber;lnumber = strtol(string, &endptr, 10);

    Az elzhz hasonl, csak a visszatrsirtk tpusa ms

    int number = 12345;char string[25];itoa(number, string, 10);

    Egsz szmot sztringg konvertl, utolsjegy az alapszm

    char string[25];long value = 123456789L;ltoa(value,string,10);

    Hossz egszet alakt sztringg

    unsigned long lnumber = 3123456789L;char string[25];ultoa(lnumber,string,10);

    Eljel nlkli hossz egszet alakt sztringg

    39., 40. feladat

    1.15 A grafika programozsa

    A grafikus fggvnycsomagban jl hasznlhat fggvnyek csoportja ll rendelkezsnkreahhoz, hogy egyszerbb pixel grafikus brkat ksztsnk. Valjban minden alakzat, amit akpernyn megjelentnk a putpixel fggvnyre tmaszkodik, de a rajzols megknnytserdekben sok grafikus primitv14

    14Olyan fggvny, mely egy megfelel paramterezssel az adott alakzatot megrajzolja. Ha egy rendszerben sokgrafikus primitv van, akkor az megknnyti a grafika programozst. Grafikus primitv pldul egy kr rajzolsa, de

    ll rendelkezsnkre. (egyenes, kr tglalap, ellipszis, v stb

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    42/56

    42

    rajzolsa) Ha a grafikus fggvnyeket hasznlni akarjuk, akkor be kell emelni graphics.h headerfile-t. Grafika programozsnl gyakran hasznljuk a matematikai fggvnyeket is, ezrtltalban az elejn hozztesszk a programhoz a math.h llomnyt is.

    1.15.1 Koordinta-rendszerMieltt hozzfognnk a grafika programozshoz meg kell ismernnk a rendszer ltal

    alkalmazott grafikus koordinta-rendszert.

    A matematikban alakalmazott koordintarendszer ettl egy kicsit eltr. Szmunkra az lenne atermszetes, ha az orig a kperny kzppontjban lenne, s az y rtkek alulrl flfelnvekednek. Ha ezt a koordintarendszert szeretnnk hasznlni, akkor szksg van egykoordinta tarnszformcira.

    void trafoxy(int *x,int *y){

    *x+=getmaxx() / 2;*y=getmaxy() / 2 - *y;

    }Teht ha a matematikai koordintkkal akarunk dolgozni,akkor szmolskor azokat hasznljuk, majd brzolskor afenti fggvnnyel ttranszformljuk azokat kpernykoordintkk. A fggvny hvsnak mdja:

    trafoxy(&x,&y);

    Ha egy grafikus fggvny szgekkel dolgozik, akkor aztfokokban kell megadni, a matematikban megszokottkrljrs szerint.

    1.15.2 Grafika indtsaMieltt grafikai fggvnyeket hasznlnnk, el kell ksztennk a kpernyt. Ennek mdjtmutatjuk meg az albbiakban.

    #include #include #include

    nem az az olimpiai t karika megrajzolsa. Persze, ha mi magunk runk egy ilyen fggvnyt, akkor arra atovbbiakban, mint egy grafikus primitvre lehet hivatkozni.

    ( 0, 0)

    ( 0, getmaxy( ) ) ( get maxx( ) , get maxy( ) )

    ( get maxx( ) , 0)x

    yVGA moni t orok eset n:

    get maxxx( ) =639get maxy=479

    0

    90

    180

    270

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    43/56

    43

    main(){

    int Gd, Gm, Hiba;

    Gd=DETECT;initgraph(&Gd,&Gm,"c:\\progra~1\\bc\\bgi");

    Hiba=graphresult();if (Hiba){

    cprintf("Grafikus hiba: %s",grapherrormsg(Hiba));exit(1);

    }

    rectangle(100,100,60,40);getch();closegraph();

    }DETECT segtsgvel fldertjk az aktulis monitor jellemzit, majd inicializljuk a grafikt,az idzjelek kztt a BGI file-ok helyt15

    1.15.3 Gyakran hasznlt fggvnyek

    kell megadnunk a programnak, ezen llomnyoksegtik a kperny grafikus zemmdban val kezelst. A graphresult() fggvny jelzi, havalami miatt nem sikerlt az ttrs grafikus mdra. Ha minden rendben volt kvetkezhetnek agrafikai fggvnyhvsok, (itt ezt a rectangle() fggvny jelzi), ha vgeztnk, akkor pedig aclosegraph(); fggvnnyel lezrjuk a grafikt.

    Az albbiakban egy tblzatban soroljuk fl a leggyakrabban hasznlt grafikus fggvnyeket, ateljessg ignye nlkl. (A rendszerben kzel 80 grafikus fggvny van)

    Fggvny Lerssetcolor(c) A rajzols sznt lltja be c 0-15 kztti rtk, vagy szn konstanssetbkcolor(c) A httr sznt lltja be, c ua., mint elbb

    setlinestyle(ls,pt,th)

    ls rtke a vonalstlusra utal:SOLID_LINE, DOTTED_LINE, CENTER_LINE, DASHED_LINE,USERBIT_LINE ebben az esetben kerl rtelmezsre a pt ez egy 16

    bites minta, ezt ismtli a vonalonth a vonalvastagsg, NORM_WIDTH, THICK_WIDTH

    setfillstyle(pt,c)

    A kitltsi mintt adja meg pt-ben, c-ben pedig a sznt.EMPTY_FILL, SOLID_FILL, LINE_FILL, LTSLASH_FILL,

    SLASH_FILL, BKSLASH_FILL, LTBBKSLASH_FILL?HATCH_FILL, XHATCH_FILL,INTERLEAVE_FILL,WIDE_DOT_FILL, CLOSE_DOT_FILL, USER_FILL

    moverel(dx,dy) A garfikus kurzort a dx,dy koordintit dx-szel, dy-nal vltoztatjamoveto(x,y) A grafikus kurzort az (x,y) pontba mozgatjax=getx();y=gety() A grafikus kurzor koordinti

    putpixel(x,y,c) c sznnel rajzol egy kppontotline(x1,y1,x2,y2) A kt pontot egyenessel kti sszelinerel(dx,dy) A dx,dy-nal vltoztatott pontba hz egyenest az aktulis pontbllineto(x,y) Az (x,y) pontba hz egyenest az aktulis pontbl

    15Ne feledkezznk el az tvonal megadsakor a \ helyett \\ hasznlatrl!

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    44/56

    44

    drawpoly(n,poly[])

    Egy poligont rajzol, ha zrt akkor cscspontjainak szma n-1,klnben n, a poly[] vektorban kell flsorolni a cscsok koordintit,x1,y1,x2,y2,sorrendben, zrt sokszg esetn az elskoordintknak egyeznik kell az utolskkal.

    rectangle(x1,y1,x2,y2) Tglalap x1,y1 bal fels, x2,y2 jobb als cscs koordintiarc(x,y,ksz,vsz,r) Krv, kzppontja x,y, sugara r, az vhosszat ksz-t vsz-ig fokokban.

    circle(x,y,r) Kr az elz paramterezssel.ellipse(x,y,ksz,vsz,rx,ry)

    Egy ellipszist, vagy annak egy vt rajzolja, rx szlessgnek, rymagassgnak fele.

    bar(x1,y1,x2,y2) Kitlttt tglalap.

    bar3d(x1,y1,x2,y2,m,t)Hasb 45 fokos axonometriban m a mlysg, ha t!=0, akkor afedlap is festett.

    pieslice(x,y,ksz,vsz,r) Mint az arc, csak ez kitlttt krcikk leszfloodfill(x,y) Kitlt egy ezrt terletet, melynek x,y bels pontja.cleardevice() Trli a grafikus kpernyt.outtext(text) Szveget r a kpernyre az aktulis kurzorpozcitl

    ottextxy(x,y,text) A szveget az x,y koordintj ponttl kezdi.

    settextstyle(f,d,s)

    A szveg stlust llthatjuk be vele. f a karakter stlusaDEFAULT_FONT, TRPLEX_FONT, SMALL_FONT,SANS_SERIF_FONT, GOTHIC_FONTd=0 esetn balrl jobbra, 1 esetn fellrl lefel rs a karakter mrett jelenti, ha 1 akkor 8x8 pixel, 2 esetn 16x16

    pixel

    41., 42., 43., 44., 45., 46. feladat

    1.16 Makrk

    A makrk a fggvny kdjba beptett szvegeket jelentenek a C nyelv esetben. Makrksegtsgvel egyszer, gyakran alkalmazott mveleteket oldhatunk meg fggvnyek megrsanlkl. C nyelvi makrkat a #define direktva16

    Az gy ltrehozott konstansok futsidben mr nem vltoztathatk

    utn adhatunk meg. Ezt a direktvt hasznltukmr korbban konstansok ltrehozsra.

    17

    1.16.1 Fggvnyszer makrk

    . A fordtnak az az elsdolga, hogy a forrsnyelvi llomnyt tadja, az elfeldolgozznak. Az elfeldolgozzfeladata,hogy a #define utn tallt szvegeket behelyettestse a forrsprogram azon rszbe, aholhivatkozs trtnt rjuk. Az elfeldolgozknaklehet, hogy tbbszr is vgig kell menni a listn,mivel a makrk minden tovbbi nlkl egymsba gyazhatk

    A definci ltalnos alakja:

    #define azonost(paramterek) helyettest szvegA makr hvsa:

    azonost(argumentumok);Nznk meg konkrtan nhny fggvnyszer makrt!

    #include #include

    16A fordtnak szl utasts.17A const kulcsszval definiltakrl ez nem mondhat el, ezekkel csak annyit kell tenni, hogy egy rjuk irnytunkegy pointert s ennek az rtkt mdostjuk.

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    45/56

    45

    #define min(a,b) ( (a)>(b)?(b):(a))

    #define abs(x) ( (x)='a') && ((x)

  • 8/13/2019 c Programozas Kozepiskolasoknak

    46/56

    46

    kiir(1);kiir(2);kiir(3);kiir(4);szoveg(Ezt rd ki);szam(i,5d);

    getch();

    }A kiir() makr brmilyen olyan vltoznak kirja az rtket, melynek a neve x-szel kezddik. Anv tovbbi rszt paramterknt kell tadni.

    A szoveg() makr egyszeren kirja az tadott szveget. Figyeljk meg, hogy hvskor nem kella szveget idzjelek kztenni, azt a mveletet a vltoz neve el kitett # vgzi el.

    A szam() makr egy vltoz nevt s rtkt rja ki olyan formtumban, amilyet a msodikparamtere elr.

    47. feladat

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    47/56

    47

    2 Feladatgyjtemny1. feladat

    Az els Cprogramrl lertakat vesd ssze a Pascalban tanultakkal

    2. feladatMi lesz a kvetkez programok outputja:

    #include

    main(){printf( Els sor \n);printf( Msodik sor \n);

    }

    #include

    main(){printf(Els sor);printf(Msodik \n sor \n);

    }

    #include

    main(){printf("Hello...\n..oh my\n...when do i stop?\n");

    }

    3. feladat

    Mi lesz a kvetkez programok outputja:

    #include

    main(){

    int sum, v;

    sum = 10;v = 15;

    printf("%d\t%d\n", sum, v);}

    #include

    main(){

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    48/56

    48

    int v1, v2, sum;

    v1 = 35;v2 = 18;sum = v1 + v2;

    printf("%d s %d sszege %d\n", v1, v2, sum);

    }

    4. feladat.

    Mirt hibsak a kvetkez vltoznevek?

    value$sumexit flag3lotsofmoneychar

    5. feladatNzznk egy pldt az sszes alaptpus vltozra. Mi lesz a kvetkez program outputja?

    #include < stdio.h >

    main(){

    int sum;float money;char betu;

    double dupla;

    sum = 10;money = 2.21;

    betu = 'A';pi = 2.01E6;

    printf("sum = %d\n", sum );printf("money = %f\n", money );printf("bet = %c\n", betu );printf("dupla = %e\n", dupla );

    }

    6. feladat

    rj egy olyan programot, mely egy vals, egy egsz s egy karakter tpus vltozt hoz ltre,kezdrtket nem tartalmaz egyik sem. rasd ki az rtkket!

    7. feladat

    A kvetkez matematikai kifejezseket rd t C kifejezsekk:

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    49/56

    49

    )1(

    )12(73

    +

    =

    yy

    ayx

    )3(43

    15

    32

    137

    +

    +

    +

    =

    x

    x

    y

    yx

    a

    8. feladatAdd meg azt a logikai kifejezst, mely akkor igaz, ha

    x 10-nl nagyobb 2-vel s 3-mal nem oszthat szm y 5 s 5 kz es szm

    9. feladat

    int x , y ;x ^= y;y ^= x;x ^=y;

    Mi lesz a vltozk rtke a kirtkelsek utn?

    10. feladat

    rj programot, mely a billentyzetrl beolvas kt egsz szmot, majd eldnti, hogy a nagyobbosztja-e a kisebbnek. Ha igen kirja, ha nem akkor kirja a hnyadost s az osztsi maradkot. Afeladat megoldsa sorn ne hasznlj elgazst! (Gondolj a feltteles rtkadsra!)

    11. feladat

    rj programot mely kirja az els 20 egsz szmot s ngyzetket. A feladatot oldd megmindhrom tanult ciklus segtsgvel!

    12. feladat

    rj programot, mely kirja a 1-tl 10-ig a szorztblt tblzatos formban! A feladatmegoldshoz tetszleges ciklust hasznlhatsz.

    13. feladat

    rj programot, mely 0-tl 90 fokig 5 fokonknt kirja a szgek szinuszt s cosinuszt. Amegjelents tblzatos formban trtnjen.

    Szg szinusz -coszinuszsorrendben. A megfelel matematikai fggvnyek a sin(f), cos(f). A fggvnyek hasznlathoz a

    program fejlcben szksg lesz a

    #include llomny beillesztsre is.

    14. feladat

    rd be a switch-nl tallhat pldaprogramot. Vizsgld meg, hogy mi trtnik abban az esetben,ha a break elmarad! rd t a kir rszt is switch-esre!

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    50/56

    50

    15. feladat

    rd t az albbi programsorokat switch szerkezetre!

    if( betu == 'X' )s = 0;

    else if ( betu == 'Z' )

    jelzo = 1;else if( betu == 'A' )

    s = 1;else

    printf("Ismeretlen bet -->%c\n", betu );

    16. feladat

    rj programot, mely bekr hrom egsz szmot s eldnti, hogy szerkeszthet-e a szmokbl,mint szakaszhosszakbl hromszg. Ha igen, akkor azt is eldnti, hogy derkszg-e!

    17. feladat

    rj programot, mely bekr hrom vals szmot. Ezeket sorrendben egy msodfok egyenlet a,b,cegytthatiknt rtelmezi. Add is meg az egyenlet megoldsait. A kirsok a kvetkezk kzlkerljenek ki: Nincs gyke, Egy gyke van x=ee.tt, Kt gyke van x1=ee.tt, x2=ee.tt. Itt a tt azt

    jelenti, hogy a gykket kt tizedes pontossggal rassuk ki.

    18. feladat

    rd be a kvetkez programot s magyarzd meg a mkdst!

    #include

    main(){

    int szam,s=0;printf(Krek egy szmot 1 s 10 kztt : );scanf(%d, &szam);

    switch (szam){

    default: printf(Hibs megads: %d\n, szam); break;case 10: s+=10;case 9: s+=9;case 8: s+=8;case 7: s+=7;case 6: s+=6;

    case 5: s+=5;case 4: s+=4;case 3: s+=3;

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    51/56

    51

    case 2: s+=2;case 1: s+=1; printf(Az s rtke: %d\n, s);break;

    }}

    19. feladatKrj be billentyzetrl egy pontszmot, majd mondd meg, hogy ehhez hnyas rdemjegytartozik! Maximlis pontszm 100, 91-100 jeles(5), 81-90 j(4), 66-80 kzepes (3), 50-65elgsges(2), 50 alatt elgtelen(1)!

    20. feladat

    rjunk programot, mely beolvassa egy tanul jegyeit, majd kiszmtja az tlagot. A jegyekettmbben trolja. A beolvassnl csak a j osztlyzatokat fogadja el. (gondolj a scanf-nlmegadhat ellenrzsi lehetsgre) A tantrgyak szma 10. Az tlag kiszmtsa utn adjuk meg

    azt is, hogy az egyes osztlyzatok hnyszor fordultak el!

    21. feladat

    rjunk programot, mely feltlt egy 100 elem vektort 1 s 1000 kz es egsz szmokkal, majda kvetkez feladatokat ltja el:

    kiszmtja az elemek sszegt, tlagt kivlasztja a legnagyobbat s a legkisebbet kirja az elemeket eredeti sorrendben, majd rendezi s gy is megjelenti azokat

    Vletlenszmok kezelshez a kvetkezket kell tudni.

    #include randomize();x=rnd() % nAz utbbi egy vletlenszmot ad a [0,n-1] intervallumban. (A % itt a maradkos osztst jelenti).Ha nem hvjuk meg a randomize() fggvnyt, akkor a Pascal-hoz hasonlan itt is mindigugyanazokat a vletlen szmokat fogjuk eredmnyl kapni.

    22. feladatDobjunk hrom dobkockval 100 000-szer. Minden egyes dobsnl adjuk ssze a hromszmot, majd rjuk ki, hogy melyik sszeg hnyszor fordult el!

    23. feladat

    Modellezzk az ts s a hatos lott hzst!

    24. feladat

    Adjuk meg egy 100 elem 1-100 kztti szmokat sorrendben tartalmaz vektor egypermutcijt!

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    52/56

    52

    25. feladat

    Krjnk be egy szveget s egy karaktert a billentyzetrl, majd adjuk meg, hogy az adottkarakter hnyszor fordul el a szvegben!

    26. feladat

    Krjnk be egy szveget abillentyzetrl s dntsk el, hogy palindroma-e!

    27. feladat

    Tltsnk fl egy 6 sorbl s 10 oszlopbl ll mtrixot 200-nl nem nagyobb vletlenszmokkal. Majd vgezzk el a kvetkez feladatokat:

    Vlasszuk ki minden sorbl a legnagyobb elemet, majd adjuk meg a maximumoktlagt!

    Szmoljuk ki az sszes elem tlagt! Hny olyan eleme van a mtrixnak, melyek az tlagnl kisebbek, illetve nagyobbak?

    28. feladat

    rjunk programot egy a jegyzetben megadott struktra alkalmazsval. A program vletlenszernevekkel tltse fel mind a vezetk, mind a keresztneveket. A szletsi idk 1950 s 1970 kzes vletlenszmok legyenek, a fizetsek pedig essenek 50 000 s 100 000 Ft kz. A feltltsekutn a kvetkez feladatokat vgezzk el:

    Adjuk meg az 1960 s1965 kztt szletetteket! Szmtsuk ki az tlagfizetst s az tlagletkort

    29. feladat

    rjunk fggvnyt, mely paramterknt egy karaktert s egy egsz rtket kap, s ennyi darabot rki egyms utn az tadott karakterbl!

    30. feladat

    rjunk fggvnyt mely paramterknt egy vals(a) s egy pozitv(n) egsz szmot kap.

    Visszatrsi rtke pedig: a

    n

    31. feladat

    rjunk fggvnyt, mely hrom tadott egsz szmot nagysg szerint sorba rendez, a vltozs avisszaadott rtkekben ltszik!

    32. feladat

    Mit fognak kirni a kvetkez programrszletek printf fggvnyei?

    main(){

    char c = 'Q';

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    53/56

    53

    char *char_pointer = &c;printf("%c %c\n", c, *char_pointer);c = '/';

    printf("%c %c\n", c, *char_pointer);*char_pointer = '(';

    printf("%c %c\n", c, *char_pointer);

    }

    main(){

    int i1, i2, *p1, *p2;

    i1 = 5;p1 = &i1;i2 = *p1 / 2 + 10;

    p2 = p1;

    printf("i1 = %d, i2 = %d, *p1 = %d, *p2 = %d\n", i1, i2, *p1, *p2);}

    main(){

    int count = 10, *temp, sum = 0;

    temp = &count;*temp = 20;temp = *temp = count;

    printf("count = %d, *temp = %d, sum = %d\n", count, *temp, sum );}

    33. feladat

    rjunk programot, amely vletlenhosszsg sorozatokat kezel. A sorozat hossza 50 s 200kztt vltozhat. minden sorozat esetn vgezze el a kvetkez feladatokat:

    Feltlti a sorozatot vletlenszer fej/rs rtkekkel (F/I, vagy 0/1) Meghatrozza a fejek s rsok szmt, arnyukat. Meghatrozza a leghosszabb fej illetve rs sorozat hosszt, s ezek arnyait a teljessorozathoz.

    Az adatok mindig csak annyi helyet foglaljanak el a memriban, amennyire ppen szksg van.Legalbb 10 sorozaton vgezzk el a fenti hrom feladatot. Az eredmnyeket trolni nem kell,

    jelentsk meg azokat tblzatszeren!

    34. feladat

    Egy telephelyen gymlcst vsrolnak fel. Minden Eladt a sorszmval azonostanak. Egyelad egy hnap folyamn tbbszr is leadott gymlcst, de a klnbz eladk nem

    ugyanannyiszor. Egy vektorban trolva vannak a havi leadsok szmai. A telephelyen sszesen10 eladt tartanak nyilvn. rjunk programot, mely beolvassa a eladnknt s alkalmanknt a

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    54/56

    54

    leadott gymlcsmennyisgeket (Lehetnek ezek vletlenszmok is 500-100 kztt), majd adjunkvlaszt a kvetkez krdsekre:

    Ki adta le a hnapban sszesen a legtbb s a legkevesebb gymlcst? Ki adta le egyszerre a legtbb gymlcst? Mennyi gymlcst adtak le egyenknt az egyes eladk?

    35. feladat

    rjunk programot, mely egy dinamikus listba emberek adatait viszi fl. Nv, szletsi v,lakcm. Majd valstsuk meg menbl a kvetkez funkcikat:

    egy adat flvitele a listba egy adat trlse a listbl keress nv alapjn (egyedi jellemz) keress szletsi v alapjn (tbb egyforma is lehet, mindet adja meg) teljes lista

    36. feladat

    rjunk programot, amely megszmolja, hogy egy adott szveg hny szbl ll. Vigyzzunk arra,hogy a szkzk szma+1 nem felttlenl a szavak szmt adja vissza, elfordulhat egyszvegen bell tbb szkz is. A szveget egy llomnybl vegyk! Lehet ez pldul egy

    programllomny is.

    37. feladat

    Ksztsnk a 35. feladathoz hasonl programot, az adatokat viszont ebben az estben nemdinamikus listba, hanem egy binris llomnyba kell flvinnnk!

    38. feladat

    Ksztsnk programot, mely bekri egy llomny nevt, ha ltezik ilyen llomny, akkor aztkarakterenknt vgigolvassa s minden karakter nagybets alakjt kirja egy msik llomnyba,melynek a nevt az elsbl gy kapjuk, hogy egy n bett hozzrunk. A kirs utn a nagybets

    llomnyt jelentse is meg a kpernyn!

    39. feladat

    Ksztsnk ablakoz technikt hasznl programot, a kpernytartalmat elment fggvnyeksegtsgvel! Ablakoz technikt figyelhetnk meg pldul a karakteres kpernyn az NC

    program hasznlatakor. Ez azt jelenti, hogy ha egy menblkivlasztunk egy pontot, akkor apontosts rdekben egy almen jelenik meg, mely eltakarja az alatta lv tartalmat, ha ez azablak eltnik, akkor vissza kell tlteni azt a rszt, ami alatta volt.

    40. feladat

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    55/56

    55

    Ksztsnk rajzol programot. A szveges kpernyn a kurzort a kurzormozgat nyilakkallehessen mozgatni, legyen benne egy penup(u) s egy pendown(d) funkci. A nyilak kdja: fel72, jobbra 77, balra 75, le 80. Vigyzzunk ezeknek a beolvassval, ugyanis ezek a billentykketts kddal rendelkeznek, teht a lenyomskor kt rtk kerl a billenytzetpufferbe, az elskd minden esetben 0, a msodik pedig az imnt felsorolt. Az ilyen billentyket gy szoktukfldolgozni, hogy ha az els karakter 0, akkor olvasunk mg egyet a pufferbl. Ezeket az

    olvassokat a getch() fggvnnyel tehetjk meg.

    41. feladat

    rjunk fggvnyt mely grafikus mdban kirajzolja az olimpiai tkarikt. A fggvnyt a krksugarval s a fels sor kzps karikjnak kzppontjval lehessen meghvni!

    42. feladat

    rjunk programot, mely kirajzol egy sakktblt a kpernyre. Legyen md arra, hogy a kitlts

    mintjt vltozatjuk!

    43. feladat

    rjunk programot, mely vektorban trolt szmokat megjelenti kr s oszlop diagramos formbanis. Krdiagram esetn a mennyisgek sszege fele meg 360 foknak. A szomszdos krcikkeknlalkalmazzunk eltr kitltst! Oszlopdiagram esetn a legnagyobb mennyisg tltse kifgglegesen a kperny kt harmad rszt, termszetesen a tbbi mennyisg ehhez kpestarnyos magassg legyen!

    44. feladatrjunk egy olyan programot, mely maximum tdfok polinomokat tud brzolni. Az tdfok

    polinomok ltalnos alakja: 01

    2

    2

    3

    3

    4

    4

    5

    5 axaxaxaxaxa +++++ . A programban a

    megfelel egytthatkat krjk be, illetve a a vltoz intervallumnak als s fels hatrt.Vigyzzunk az brzolskor, hogy az adott intervallumon minden fggvnyrtk frjen el akpernyn!

    45. feladat

    Ksztsnk egy cltblt!

    46. feladat

    Ksztsnk programot, mely a kvetkez paramteres egyenlettel megadott grbt brzolja:

    x=a*sin(n*), y=b*cos(m*)

    A paramter rtke a [0,k] intervallumon vltozzon. Az sszefggsben szerepl vltozkkzl a,b vals a tbbi egsz tpus. Lehetleg kis egszekkel dolgozzunk.

    47. feladatrjunk makrkat a kvetkez funkcikra:

    p://www.doksi.hu

  • 8/13/2019 c Programozas Kozepiskolasoknak

    56/56

    Kt szm kzl adja vissza a nagyobbat. Ha egy karakter nagybet, akkor adja vissza a kisbets megfeleljt. Adja vissza egy szm ngyzett.

    p://www.doksi.hu