bauer peter c programozas

of 299 /299
C programnyelv 1 1BEVEZETÉS.................................................................................................................... 5 2JELÖLÉSEK..................................................................................................................... 7 3ALAPISMERETEK..........................................................................................................8 3.1Forrásprogram............................................................................................................8 3.2Fordítás...................................................................................................................... 8 3.3Kapcsoló–szerkesztés (link).................................................................................... 12 3.4Futtatás..................................................................................................................... 12 3.5Táblázat készítése.................................................................................................... 13 3.6Bemenet, kimenet.................................................................................................... 21 3.7Tömbök.................................................................................................................... 28 3.8Függvények.............................................................................................................. 31 3.9Prodzsekt................................................................................................................. 35 3.10Karaktertömb és karakterlánc................................................................................ 37 3.11Lokális, globális és belső, külső változók.............................................................. 41 3.12Inicializálás............................................................................................................ 46 4TÍPUSOK ÉS KONSTANSOK...................................................................................... 49 4.1Elválasztó-jel........................................................................................................... 50 4.2Azonosító................................................................................................................. 51 4.3Típusok és konstansok a nyelvben........................................................................... 52 4.3.1Egész típusok és konstansok............................................................................. 55 4.3.2Felsorolás (enum) típus és konstans................................................................. 58 4.3.3Valós típusok és konstans................................................................................. 61 4.3.4Karakter típus és konstans................................................................................ 63 4.4Karakterlánc (string literal):.....................................................................................68 4.5Deklaráció ............................................................................................................... 71 4.5.1Elemi típusdefiníció (typedef).......................................................................... 75 5MŰVELETEK ÉS KIFEJEZÉSEK................................................................................ 77 5.1Aritmetikai műveletek (+, -, *, / és %)..................................................................... 79 5.1.1Multiplikatív operátorok (*, / és %)..................................................................80 5.1.2Additív operátorok (+ és -)............................................................................... 83 5.1.3Matematikai függvények................................................................................... 83 5.2Reláció operátorok ( >, >=, <, <=, == és !=)........................................................... 85 5.3Logikai műveletek ( !, && és ||)...............................................................................86 5.4Implicit típuskonverzió és egész–előléptetés........................................................... 87 5.5Típusmódosító szerkezet......................................................................................... 89 5.6sizeof operátor......................................................................................................... 90 5.7Inkrementálás (++), dekrementálás (--) és mellékhatás........................................... 91 5.8Bit szintű operátorok ( ~, <<, >>, &, ^ és |)............................................................. 92 5.9Feltételes kifejezés ( ? :).......................................................................................... 96 5.10Hozzárendelés operátorok..................................................................................... 98 5.11Hozzárendelési konverzió.................................................................................... 100 5.12Vessző operátor................................................................................................... 101 5.13Műveletek prioritása ........................................................................................... 102 6UTASÍTÁSOK............................................................................................................. 106 6.1Összetett utasítás.................................................................................................... 106 6.2Címkézett utasítás.................................................................................................. 107 6.3Kifejezés utasítás................................................................................................... 107 6.4Szelekciós utasítások............................................................................................. 108 6.5Iterációs utasítások................................................................................................. 111 6.6Ugró utasítások...................................................................................................... 116 Forrás: http://www.doksi.hu

Author: toeroek-zoltan

Post on 21-Dec-2015

75 views

Category:

Documents


9 download

Embed Size (px)

DESCRIPTION

Programozas

TRANSCRIPT

  • C programnyelv 1

    1BEVEZETS....................................................................................................................52JELLSEK.....................................................................................................................73ALAPISMERETEK..........................................................................................................8

    3.1Forrsprogram............................................................................................................83.2Fordts...................................................................................................................... 83.3Kapcsolszerkeszts (link).................................................................................... 123.4Futtats.....................................................................................................................123.5Tblzat ksztse.................................................................................................... 133.6Bemenet, kimenet.................................................................................................... 213.7Tmbk....................................................................................................................283.8Fggvnyek..............................................................................................................313.9Prodzsekt................................................................................................................. 353.10Karaktertmb s karakterlnc................................................................................ 373.11Loklis, globlis s bels, kls vltozk..............................................................413.12Inicializls............................................................................................................ 46

    4TPUSOK S KONSTANSOK......................................................................................494.1Elvlaszt-jel........................................................................................................... 504.2Azonost.................................................................................................................514.3Tpusok s konstansok a nyelvben...........................................................................52

    4.3.1Egsz tpusok s konstansok.............................................................................554.3.2Felsorols (enum) tpus s konstans................................................................. 584.3.3Vals tpusok s konstans................................................................................. 614.3.4Karakter tpus s konstans................................................................................ 63

    4.4Karakterlnc (string literal):.....................................................................................684.5Deklarci ...............................................................................................................71

    4.5.1Elemi tpusdefinci (typedef).......................................................................... 755MVELETEK S KIFEJEZSEK................................................................................77

    5.1Aritmetikai mveletek (+, -, *, / s %).....................................................................795.1.1Multiplikatv opertorok (*, / s %)..................................................................805.1.2Additv opertorok (+ s -)............................................................................... 835.1.3Matematikai fggvnyek...................................................................................83

    5.2Relci opertorok ( >, >=,

  • 2 TARTALOMJEGYZK S ELSZ

    7ELFELDOLGOZ (PREPROCESSOR).................................................................. 1197.1res (null) direktva...............................................................................................1207.2#include direktva.................................................................................................. 1217.3Egyszer #define makr........................................................................................ 1217.4Elredefinilt makrk............................................................................................ 1237.5#undef direktva..................................................................................................... 1237.6Paramteres #define direktva................................................................................1247.7Karaktervizsgl fggvnyek (makrk).................................................................1257.8Feltteles fordts...................................................................................................128

    7.8.1A defined opertor.......................................................................................... 1307.8.2Az #ifdef s az #ifndef direktvk...................................................................130

    7.9#line sorvezrl direktva...................................................................................... 1307.10error direktva.................................................................................................... 1317.11pragma direktvk.............................................................................................. 132

    8OBJEKTUMOK S FGGVNYEK......................................................................... 1338.1Objektumok attribtumai....................................................................................... 133

    8.1.1Trolsi osztlyok...........................................................................................1348.1.1.1Automatikus (auto, register) trolsi osztly........................................... 1348.1.1.2Statikus (static, extern) trolsi osztly................................................... 137

    8.1.2lettartam (lifetime, duration)........................................................................ 1408.1.2.1Statikus (static vagy extern) lettartam....................................................1408.1.2.2Loklis (auto vagy register) lettartam.................................................... 1418.1.2.3Dinamikus lettartam............................................................................... 141

    8.1.3Hatskr (scope) s lthatsg (visibility)......................................................1418.1.3.1Blokk (loklis, bels) hatskr................................................................ 1428.1.3.2Fggvny hatskr................................................................................... 1428.1.3.3Fggvny prototpus hatskr..................................................................1428.1.3.4Fjl (globlis, kls) hatskr..................................................................1438.1.3.5Lthatsg................................................................................................1438.1.3.6Nvterlet (name space).......................................................................... 144

    8.1.4Kapcsolds (linkage).................................................................................... 1448.2Fggvnyek............................................................................................................145

    8.2.1Fggvnydefinci.......................................................................................... 1468.2.1.1Trolsi osztly........................................................................................1488.2.1.2A visszatrsi rtk tpusa........................................................................1498.2.1.3Formlis paramterdeklarcik................................................................1498.2.1.4A fggvny teste...................................................................................... 151

    8.2.2Fggvny prototpusok................................................................................... 1528.2.3Fggvnyek hvsa s paramterkonverzik.................................................. 1558.2.4Nem szabvnyos mdostk, hvsi konvenci.............................................. 1578.2.5Rekurzv fggvnyhvs..................................................................................159

    9MUTATK.................................................................................................................. 1619.1Mutatdeklarcik................................................................................................. 161

    9.1.1Cm opertor (&)............................................................................................ 1629.1.2Indirekci opertor (*)....................................................................................1639.1.3void mutat..................................................................................................... 1649.1.4Statikus s loklis cmek.................................................................................1649.1.5Mutatdeklartorok.........................................................................................1659.1.6Konstans mutat............................................................................................. 166

    9.2Mutatk s fggvnyparamterek.......................................................................... 167

    Forrs: http://www.doksi.hu

  • C programnyelv 3

    9.3Tmbk s mutatk............................................................................................... 1689.3.1Index opertor.................................................................................................1699.3.2Tmbdeklartor s nem teljes tpus tmb..................................................... 172

    9.4Mutataritmetika s konverzi.............................................................................. 1739.4.1sszeads, kivons, inkrementls s dekrementls.....................................1749.4.2Relcik.......................................................................................................... 1759.4.3Feltteles kifejezs..........................................................................................1759.4.4Konverzi....................................................................................................... 176

    9.5Karaktermutatk.................................................................................................... 1789.5.1Karakterlnc kezel fggvnyek.....................................................................1789.5.2Vltoz paramterlista.................................................................................... 184

    9.6Mutattmbk........................................................................................................1869.7Tbbdimenzis tmbk......................................................................................... 187

    9.7.1Vletlenszm genertor...................................................................................1909.7.2Dinamikus memriakezels............................................................................ 192

    9.8Tmbk, mint fggvnyparamterek..................................................................... 1969.9Parancssori paramterek........................................................................................ 198

    9.9.1Programbefejezs............................................................................................2029.10Fggvny (kd) mutatk......................................................................................203

    9.10.1atexit fggvny..............................................................................................2069.10.2Tpusnv....................................................................................................... 208

    9.11Tpusdefinci (typedef)...................................................................................... 2099.12Ellenrztt bemenet............................................................................................. 211

    10STRUKTRK S UNIK......................................................................................21610.1Struktradeklarci .............................................................................................217

    10.1.1Tpusdefinci............................................................................................... 21910.2Struktratag deklarcik...................................................................................... 22010.3Struktrk inicializlsa.......................................................................................22210.4Struktratagok elrse..........................................................................................22310.5Struktrk s fggvnyek.....................................................................................22710.6nhivatkoz struktrk s dinamikus adatszerkezetek .......................................23410.7Struktra trillesztse...........................................................................................24010.8UNIK................................................................................................................ 242

    10.8.1Unideklarcik............................................................................................24310.9Bitmezk (bit fields)............................................................................................ 24510.10Balrtk jobbrtk...........................................................................................24710.11Nvterletek.......................................................................................................248

    11MAGAS SZINT BEMENET, KIMENET...............................................................25111.1Folyamok megnyitsa.......................................................................................... 25111.2Folyamok pufferezse..........................................................................................25211.3Pozcionls a folyamokban................................................................................ 25511.4Bemeneti mveletek ............................................................................................25711.5Kimeneti mveletek............................................................................................. 25911.6Folyamok lezrsa............................................................................................... 26011.7Hibakezels..........................................................................................................26011.8Elre definilt folyamok...................................................................................... 264

    11.8.1Bemenet az stdin-rl..................................................................................... 26611.8.2Kimenet az stdout-ra.....................................................................................270

    11.9Egyb fggvnyek................................................................................................27812IRODALOMJEGYZK............................................................................................. 280

    Forrs: http://www.doksi.hu

  • 4 TARTALOMJEGYZK S ELSZ

    13FGGELK............................................................................................................... 28113.1CHDEL.C............................................................................................................ 28113.2EGYESIT.C.........................................................................................................28113.3HEXA.C...............................................................................................................28213.4IKSZ.C.................................................................................................................28313.5INDEXEU.C........................................................................................................28413.6JANI.C................................................................................................................. 28513.7KOZEPRE.C........................................................................................................28513.8LAPOZ.C.............................................................................................................28613.9NEVREND.C.......................................................................................................28713.10PELDA18X.C....................................................................................................28813.11PELDA18Y.C....................................................................................................28913.12PELDA28X.C....................................................................................................29113.13PLUSSZ.C......................................................................................................... 29313.14ROTL.C............................................................................................................. 29313.15STRMAKRO.C................................................................................................. 29313.16STRMIN.C........................................................................................................ 29413.17STRRV.C...........................................................................................................29513.18STRSTRXT.C....................................................................................................29613.19TOBBOSZL.C................................................................................................... 29713.20XPLUSZOR.C................................................................................................... 297

    Kedves Kollegina, Kollga!

    A jegyzetet nnek ksztettem azrt, hogy referencia anyaga legyen aProgramozs trgyhoz.

    Szeretnm a segtsgt ignybe venni abbl a clbl, hogy a jegyzet mi-nl pontosabb, megbzhatbb legyen. pp ezrt arra krem, ha az olvasssorn valamilyen magyartalansgba, nem elgsges magyarzatba vagyuram bocs' hibba tkzne, jelezze vissza nekem!

    Tnykedst elre megksznm.

    Gyr, 2004. jlius Bauer Pter

    (B609) Tel.: (96) 503400/3254 e-mail: [email protected]

    Forrs: http://www.doksi.hu

  • C programnyelv 5

    1 BEVEZETS A Szchenyi Istvn Egyetem klnfle informatika szakjai s szakir-

    nyai C programnyelvi jegyzetignyt hivatott kielgteni ez a dokumen-tum. Az olvasrl felttelezi, hogy tisztban van a szmtstechnikai alap-fogalmakkal [1]. Alapos strukturlt programozsi ismereteket szerzett, sjratos az alapvet algoritmikus elemekben [2]. Jratos mr egy program-nyelvben s fejleszt krnyezetben. Magyarn ismer, s kezel ilyen fogal-makat, mint:

    Adatok, adattpusok s adatstruktrk.

    Konstansok, vltozk s azonostk.

    Vezrlsi szerkezetek: szekvencia, szelekci s iterci. Utastsok.

    Tmbk s sztringek (karakterlncok).

    Programszerkezeti elemek: eljrsok, fggvnyek, blokkok s prog-rammodulok.

    Lncolt adatszerkezetek: listk s fk.

    Elemi bemeneti s kimeneti eszkzk, fjlok stb.

    A C nyelvet tervezje, DennisRitchie, a Bell Laboratriumbanfejlesztette ki az 1970es vekvgn [4], s a UNIX opercisrendszer programnyelvneksznta. Ezt a vltozatot jelli azbrn a K&R. A C nyelv ezt k-veten praktikussga miatt sz-les krben elterjedt. Sokan k-sztettek sokfle C fordtt sajt,vagy krnyezetk ignyeinekmegfelelen. A soksznsgbenamerikai nemzeti szabvnnyal(ANSI) teremtettek rendet az1980as vek vgn [5]. Az

    ANSI C szabvnyt aztn Eurpban (ISO) is elfogadtk nhny vvel k-sbb. Az brbl ltszik, hogy az ANSI C bvtette a K&R C halmazt. Tovbbi trtneti ttekintshez a [4] s az [5] bevezet rszeit ajnl-

    juk!

    fordt

    ANSI C

    K & R

    Forrs: http://www.doksi.hu

  • 6 BEVEZETS S ALAPISMERETEK

    Az brn a legbvebb C halmaz a fordt. Ha valamikor is valami-lyen gondunk lenne azzal, hogy egy konkrt C utasts, mdost stb.megfelele az ANSI C szabvnynak, akkor fordts eltt kapcsoljuk be azintegrlt programfejleszt rendszer egy menpontjval az ANSI C kom-patibilis fordtst!

    A C ltalnos cl programnyelv, mely tmrsgrl, hatkonysgrl,gazdasgossgrl s portabilitsrl (hordozhatsgrl) ismert. Nemtartalmaz tl sok vezrlsi szerkezetet. Bsges viszont az opertorkszle-te, s tbb adattpus meglte jellemzi. Jl hasznlhat teht mszakitu-domnyos, vagy akr adatfeldolgozsi problmk megoldsra.

    A C elg alacsony szint hardver kzeli programnyelv is egyben,hisz tervezje a UNIX opercis rendszert e nyelv segtsgvel ksztetteel nhny szz gpi kd utasts felhasznlsval. A C programok gyak-ran ugyanolyan gyorsak, mint az ASSEMBLER nyelven kszltek, de j-val knnyebben olvashatk s tarthatk karban.

    Jegyzetnkben nem kvnunk elmerlni konkrt integrlt programfej-leszt rendszerek, opercis rendszerek s processzorok rszleteinek tag-lalsban. Teljes ltalnossgban azonban mg sem clszer a dolgokrlbeszlni, mert akkor ilyeneket kne mondani, mint:

    Kpezzk az opercis rendszernek megfelel vgrehajthat fjlt!

    Futtassuk a vgrehajthat fjlt az opercis rendszerben!

    Ehelyett rgztsk azt, hogy fogalmainkkal az IBM PC kompatibilis sze-mlyi szmtgpek terletn maradunk! Erre a gpcsaldra is rengetegcg ksztett C fordtt (compiler). Itt llapodjunk meg kt f gyrtnl: aBorlandnl s a Microsoftnl! Az integrlt programfejleszt keretrendszerlegyen menvel irnythat, s ne parancssori paramterknt megadott kap-csolkkal kelljen vezrelni a fordtt s a kapcsolszerkesztt (linker).

    Az opercis rendszer szmunkra jobbra csak olyan szempontbl rde-kes, hogy legyen karakteres szabvnyos bemenete (standard input), s l-tezzen karakteres szabvny kimenete (standard output), valamint szabv-nyos hibakimenete (standard error output). A szabvny bemenet alaprtel-mezs szerint a billentyzet, a kimenetek viszont a karakteres zemmdkpernyre, vagy a karakteres konzol ablakba dolgoznak. A karaktereskperny, vagy konzol ablak felbontsa termszetesen vltoztathat, demi minden pldnl felttelezzk a 25 sorszor 80 oszlopot! A szabvnykimeneteken a mindenkori aktulis pozcit kurzor jelzi.

    Forrs: http://www.doksi.hu

  • C programnyelv 7

    2 JELLSEK Figyelem felkelts. Valamely kvetkeztets levonsa az eddigiek-

    bl. Esetleg: merre tallhatk tovbbi rszletek a krdses tmval kap-csolatban.

    Lexiklis ismeretek taglalsa. Valamely folyamat pontosabb rszle-tei. Egy fogalom preczebb defincija.

    Valamilyen arnylag knnyedn elkvethet, de nehezen lokalizl-hat hiba.

    Egy alapvet, gy nevezett kl szably. Forrsprogramok s kperny tartalmak szvege. Valamilyen konkrtummal helyettestend szintaktikai egysg. Kulcssz vagy valamilyen azonost. A fogalom els elfordulsnak jellsre szolgl.

    A megoldand feladatokat gy jelltk. Ha a feladat lersnak vgn{nv.C} fjlazonost ll, akkor a FGGELKben ugyanezen fejezetc-men megtallhat egy megolds programlista is.

    Forrs: http://www.doksi.hu

  • 8 BEVEZETS S ALAPISMERETEK

    3 ALAPISMERETEK

    3.1 ForrsprogramEls kzeltsben induljunk ki abbl, hogy a C program (a forrsprog-

    ram) fjlazonostjban C kiterjesztssel rendelkez, ASCII kd szveg-fjl, mely elllthat, ill. mdosthat

    akrmilyen ASCII kd szvegszerkesztvel, vagy

    a programfejleszt rendszer beptett szvegszerkesztjvel.

    Az ASCII kd szvegfjl sorokbl ll. Egy sorban a szveg sorbelikaraktereinek ASCII kdjai kvetkeznek rendre az egyms utni bjtok-ban. A sorhoz vgl mg kt, a soremelst ler bjt tartozik, melyekbenegy soremels (Line Feed 10) s egy kocsi vissza (Carriage Return 13)vezrl karakter van.

    Vigyzni kell ASCII kd szvegfjlban a decimlisan 31 rtkbjt hasznlatval, mert ez fjlvg jelzs a legtbb opercis rendszerben!

    Ksztsk el els C programunkat, s mentsk el PELDA1.C nven! /* PELDA1.C */ #include void main(void){ printf(Ez egy C program!\n); }

    Fordtsuk le a programot, szerkesszk meg a vgrehajthat fjlt, s fut-tassuk le!

    A mindenki ltal gyantott vgeredmny az a kpernyn, hogy megjele-nik a szveg, s a kvetkez sor elejn villog a kurzor: Ez egy C program! _

    3.2 FordtsA fordt sikeres esetben a forrsprogrambl egy vele azonos nev

    (OBJ kiterjeszts) trgymodult llt el,

    PELDA1.C fordt PELDA1.OBJ1. bra: Fordts

    s zeneteket jelentet meg tbbek kzt a hibkrl. A hibazenetek leg-albb ktszintek:

    (fatlis) hibazenetek s

    Forrs: http://www.doksi.hu

  • C programnyelv 9

    figyelmeztet zenetek.

    A (fatlis) hibkat, melyek jobbra szintaktikai jellegek, mindig ki-javtja a programoz, mert korrekcijuk nlkl nem kszti el a trgymo-dult a fordt. A figyelmeztet zenetekkel azonban, melyek sok esetben alegslyosabb problmkat jelzik, nem szokott trdni, mert a fordt ltre-hozza a trgymodult, ha csak figyelmeztet zenetekkel zrul a fordts.

    A PELDA1.C programunk els sora megjegyzs (comment). A meg-jegyzs rsszablya ltszik a sorbl, azaz:

    /* karakter prral kezddik s

    */ karakter prral vgzdik.

    A megjegyzs tbb forrssoron t is tarthat, minden sorba is rhat egy,st akr egy soron bell tbb is megadhat a szintaktikai egysgek kztt.

    Egyetlen tilos dolog van: a megjegyzsek nem gyazhatk egyms-ba! /* Ez a befoglal megjegyzs eleje. /* Itt a begyazott megjegyzs. */

    Ez meg a befoglal megjegyzs vge. */ Vegyk szre, hogy brmely hibs program rgtn hibtlann vlik,

    ha /*ot tesznk az elejre, s a zr */t elfelejtjk megadni a tovbbiforrsszvegben!

    A fordtt egybeptettk egy specilis elfeldolgozval (preprocessor),mely az igazi fordts eltt

    elhagyja a forrsszvegbl a megjegyzseket,

    vgrehajtja a neki szl direktvkat, s

    ezeket is elhagyja a forrsszvegbl.

    PELDA1.C elfeldolgoz

    fordt

    PELDA1.OBJ

    2. bra: Fordts pontosabban

    Az elfeldolgoz direktvk egy sorban helyezkednek el, s #tel kez-ddnek. Pontosabban # kell, legyen a sor els nem fehr karaktere.

    Fehr karakterek a szkz, a soremels, a lapdobs karakter, a vz-szintes s a fggleges tabultor karakter. Meg kell emlteni, hogy a meg-jegyzs is fehr karakternek minsl. A fehr karakterek szolglhatnak

    Forrs: http://www.doksi.hu

  • 10 BEVEZETS S ALAPISMERETEK

    szintaktikai egysgek elvlasztsra, de a felesleges fehr karaktereket el-veti a fordt.

    A PELDA1.C programunk msodik sora egy #include direktva, mely-nek hatsra az elfeldolgoz megkeresi s betlti a paramter szvegfjlta forrsszvegbe, s elhagyja belle ezt a direktvt.

    A pillanatnyilag betltend szvegfjl, az stdio.h, H kiterjeszts. Azilyen kiterjeszts szvegfjlokat C krnyezetben fejfjloknak (header)nevezik. A fejfjl egy tmval kapcsolatos adattpusok, konstansok defin-ciit s a vonatkoz fggvnyek jellemzit tartalmazza.

    Fedezzk fel, hogy az stdio a standard input output rvidtsblszrmazik, s gy lnyegben a szabvny kimenetet s bemenetet kapcsol-tuk programunkhoz.

    Nem volt mg sz arrl, hogy a paramter fjlazonost jelek k-ztt ll! A jel pr tjkoztatja az elfeldolgozt, hogy milyen knyvt-rakban keresse a szvegfjlt. A programfejleszt rendszer menpontjaikzt van egy, melynek segtsgvel megadhatk a fejfjlok (include fj-lok) keressi tjai. alak paramter hatsra az #includedirektva csak a programfejleszt rendszerben elrt utakon keresi a fjlt,s sehol msutt.

    PELDA1.C programunk harmadik s negyedik sora a main (f) fgg-vny defincija. A fggvnydefinci szintaktikai alakja:

    tpus fggvnynv(formlisparamterlista) { fggvnytest }

    A visszatrsi rtk tpusa void, mely kulcssz ppen azt jelzi, hogya fggvnynek nincs visszaadott rtke.

    A fggvnynv main. C krnyezetben a main az indt program.

    A formlisparamterlista mindig ()ben van. Pillanatnyilag itt is avoid kulcssz lthat, ami e helyt azt rgzti, hogy nincs formlisparamter.

    A fggvnytestet mindig {}ben, gy nevezett blokk zrjelek-ben, kell elhelyezni.

    A { nyitja, a } zrja a blokkot (BEGIN s END). A { } prok ssze-tartoznak. A } mindig a forrsszvegben t megelz {t zrja.

    A forrsprogram tbb forrsmodulban (forrsfjlban) is elhelyezhe-t. Vgrehajthat program ltrehozshoz azonban valamelyik forrsmo-dulnak tartalmaznia kell a maint. Az indt program a vgrehajthat

    Forrs: http://www.doksi.hu

  • C programnyelv 11

    program belpsi pontja is egyben. Ez az a hely, ahova a memriba tr-tnt betlts utn tadja a vezrlst az opercis rendszer.

    Az indt programnak termszetesen a vgrehajthat program iga-zi indtsa eltt el kell ltnia nhny ms feladatot is, s a programoz l-tal rt mainbeli fggvnytest csak ezutn kvetkezik. A gyrtk az indtprogramot rendszerint trgymodul (OBJ) alakjban szoktk rendelkezsrebocstani.

    A PELDA1.C programban a main fggvny teste egyetlen fggvnyh-vs. A fggvnyhvs szintaktikja:

    fggvnynv(aktulisparamterlista)

    A fggvnynv a printf, mely fggvny az aktulis paramtertmegjelenteti a szabvny kimeneten.

    A ()ben ll aktulisparamterlista egytag, s momentn egykarakterlnc konstans.

    A karakterlnc konstans rsszablya ltszik: idzjelek kz zrtkaraktersorozat. A karakterlnc konstanst a memriban meg kpzeljkgy el, hogy a fordt a szveg karaktereinek ASCII kdjait rendre elhe-lyezi egymst kvet bjtokban, majd vgl egy tiszta zrustartalm (min-den bitje zrus) bjttal jelzi a karakterlnc vgt!

    A pldabeli karakterlnc konstans vgn azonban van egy kis fur-csasg: a \n!

    Ha valaki ttanulmnyozza az ASCII kdtblt, akkor lthatja, hogy alehetsges 256 kdpozci nem mindegyikhez tartozik karakterkp. Em-ltsk csak meg a szkz (32) alatti kdpozcikat, ahol az gy nevezettvezrl karakterek is elhelyezkednek! Valahogyan azt is biztostania kell aprogramnyelvnek, hogy ezek a karakterek, ill. a karakterkp nlkli kd-pozcik is megadhatk legyenek. A C programnyelvben erre a clra azgynevezett escape szekvencia (escape jelsorozat) szolgl.

    Remlhetleg vilgoss vlt az elz okfejtsbl, hogy az escapeszekvencia helyfoglalsa a memriban egyetlen bjt!

    Az escape szekvencia \ jellel kezddik, s ezutn egy karakter kvet-kezik. A teljessg ignye nlkl felsorolunk itt nhnyat!

    Escape szekvencia Jelents\b visszatrls (back space)\n soremels vagy j sor (line feed)\r kocsi vissza (carriage return)\t vzszintes tabultor (horizontal tab)

    Forrs: http://www.doksi.hu

  • 12 BEVEZETS S ALAPISMERETEK

    \ egyetlen karakter\\ egyetlen \ karakter\0 karakterlnc zr bjt, melynek

    minden bitje zrus\ooo az ok oktlis szmok

    Vegyk szre, hogy ha idzjelet kvnunk a karakterlnc konstans-ba rni, akkor azt csak \ mdon tehetjk meg! Ugyanez a helyzet az esca-pe szekvencia kezdkaraktervel, mert az meg csak megkettzve kpezegy karaktert! Lssuk mg be, hogy a \ooo alakkal az ASCII kdtbla br-mely karaktere lerhat! Pldul a \012 azonos a \nnel, vagy a \060 a 0szmjegy karakter.

    A printf fggvnyhvs utn ll ; utastsvg jelzs. PELDA1.C programunk utols fehr foltja a printf, mely egyike

    a szabvnyos bemenet s kimenet fggvnyeinek.

    3.3 Kapcsolszerkeszts (link)A gyrtk a szabvny bemenet, kimenet s ms tmacsoportok fggv-

    nyeinek trgykdjt statikus knyvtrakban (LIB kiterjeszts fjlokban)helyezik el. Nevezik ezeket a knyvtrakat futsidej knyvtraknak (runtime libraries), vagy szabvny knyvtraknak (standard libraries) is. Aknyvtrfjlokbl a szksges trgykdot a kapcsolszerkeszt msoljahozz a vgrehajthat fjlhoz. Lssuk brn is a szerkesztst!

    PELDA1.OBJindt program

    (OBJ)knyvtrak (LIB)

    kapcsolszerkeszt PELDA1.EXE

    3. bra: Kapcsolszerkeszts

    A programfejleszt keretrendszerben a sikeres mkdshez bizo-nyosan be kell lltani a statikus knyvtrfjlok (library) keressi tjait.Azt is meg kell adni termszetesen, hogy hova kerljenek a fordts s akapcsolszerkeszts sorn keletkez kimeneti fjlok.

    3.4 FuttatsA vgrehajthat fjl a parancssorbl azonostjnak begpelsvel indt-

    hat. Valsznleg a programfejleszt rendszer menjben is van egypont, mellyel az aktulis vgrehajthat fjl futtathat.

    Tbbnyire ltezik a hrom lpst (fordts, kapcsolszerkeszts s fut-tats) egyms utn megvalst egyetlen menpont is.

    Forrs: http://www.doksi.hu

  • C programnyelv 13

    Ha programunk kimenete nem lthat a kpernyn, akkor egy msikmenpont segtsgvel t kell vltani a felhasznli kpernyre (user scre-en), vagy aktuliss kell tenni a futtatott vgrehajthat fjl programabla-kt.

    3.5 Tblzat ksztseKsztsk el a kvetkez forinteur tszmtsi tblzatot! Egy eur

    pillanatnyilag legyen 244 forint 50 fillr!

    Adatstruktra:

    A vltozk a vals tpus euronkvl, mind egszek. also lesz a tar-tomny als hatra, felso a tarto-

    mny fels rtke, lepes a lpskz, s ft a ciklusvltoz. Algoritmus:

    Deklarljuk a vltozkat!

    Elltjuk ket az eurotl eltekintve kezdrtkkel.

    Megjelentetjk a tblzat fejlc sort s az alhzst.

    Mkdtetjk a ciklust, mg ft

  • 14 BEVEZETS S ALAPISMERETEK

    Elbb a deklarcis utastsok jnnek a blokkbeli vltozkra. A Cszigor szintaktikj nyelv:

    elzetes deklarci nlkl nem hasznlhatk benne a vltozk, s

    kivtel nlkl deklarlni kell minden hasznlatos vltozt!

    Aztn a vgrehajthat utastsok kvetkeznek.

    A blokkszerkezet deklarcis s vgrehajthat rszre bontsa a Cben szigor szintaktikai szably, azaz egyetlen vgrehajthat utasts semkeveredhet a deklarcis utastsok kz, ill. a vgrehajthat utastsokkztt nem helyezkedhet el deklarcis utasts. Termszetesen a vgre-hajthat utastsok kz begyazott (bels) blokkban a szably jra kez-ddik.

    Vegyk szre a pldaprogramunk vgn elhelyezked begyazottvagy bels blokkot! Figyeljk meg a main kt els sorban, hogy a dekla-rcis utasts szintaktikja:

    tpus azonostlista;Az azonostlista azonostk sorozata egymstl vesszvel elvlasztva. Megfigyelhet mg, hogy az azonostk kpzshez az angol bc

    beti hasznlhatk fel!

    Foglalkozzunk kicsit a tpusokkal! Az int (integer) 16, vagy 32 bites, alaprtelmezs szerint eljeles (sig-

    ned), fixpontos belsbrzols egsz tpus. Vegyk, mondjuk, a 16 bitesesetet! A legnagyobb, mg brzolhat pozitv egsz binrisan s decim-lisan:

    0111 1111 1111 11112 = 215 1 = 32767

    A negatv rtkek kettes komplemens alakjban troltak. A legkisebb,mg brzolhat rtk gy:

    1000 0000 0000 00002 = 215 = 32768

    Eljeltelen (unsigned) esetben nincsenek negatv rtkek. A szmbrzo-lsi hatrok zrus s

    1111 1111 1111 11112 = 216 1 = 65535

    kzttiek.

    Az elzk 32 bites esetre ugyanilyen knnyedn levezethetek!

    Forrs: http://www.doksi.hu

  • C programnyelv 15

    A float (floating point) 4 bjtos, lebegpontos belsbrzols vals t-pus, ahol a mantissza s eljele 3 bjtot, s a karakterisztika eljelvel egybjtot foglal el. Az brzolsi hatrok: 3.4*10-38 3.4*10+38. Ez a man-tissza mret 6 7 decimlis jegy pontossgot tesz lehetv.

    Nhny programfejleszt rendszer a lebegpontos knyvtrakat(LIB) csak akkor kapcsolja be a kapcsolszerkeszt ltal keressnek al-vethet knyvtrak kz, ha a programban egyltaln igny jelentkezikvalamilyen lebegpontos brzols, vagy mvelet elvgeztetsre.

    A PELDA2.C vgrehajthat rsznek els ngy utastsa rtkads. Ki kell azonban hangslyozni, hogy a Cben nincs rtkad utas-

    ts, csak hozzrendels opertor, s a hozzrendelsekbl azrt lesz utas-ts, mert ;t rtunk utnuk.

    A hozzrendelsre rgtn visszatrnk! Vegyk szre elbb azegsz konstans rsszablyt! Elhagyhat eljellel kezddik, s ilyenkorpozitv, s ezutn az egsz szm jegyei kvetkeznek.

    A fejlc sort s az alhzst egyetlen printf fggvnyhvssal valstot-tuk meg. Ltszik, hogy a tblzat oszlopait 9 karakter szlessgre vlasz-tottuk.

    Figyeljk meg, hogy a pontos pozcionlst segtend a fejlc sorts az alhzst a printfben kt egyms al rt karakterlnc konstanskntadtuk meg!

    A C fordt a csak fehr karakterekkel elvlasztott karakterlnckonstansokat egyesti egyetlen karakterlnc konstanss, s gy a pldabeliprintfnek vgl is egyetlen paramtere van.

    A PELDA2.Cben az elltesztel ciklusutasts kvetkezik, melynekszintaktikja:

    while(kifejezs) utasts A kifejezs aritmetikai, azaz szmrtk. Az elltesztel ciklusutasts ha-tsra lpsenknt a kvetkez trtnik:

    1. Kirtkeli a fordt a kifejezst. Ha hamis (zrus), akkor vge a cik-lusnak, s a while-t kvet utasts jn a programban.

    2. Ha a kifejezs igaz (nem zrus), akkor az utasts vgrehajtsa, saztn jbl az 1. pont kvetkezik.

    Vilgos, hogy a kifejezs rtknek valahogyan vltoznia kell azutastsban, klnben a ciklusnak soha sincs vge. Az utasts llhat tbbutastsbl is, csak {}be kell tenni ket. A {}ben ll tbb utastst

    Forrs: http://www.doksi.hu

  • 16 BEVEZETS S ALAPISMERETEK

    sszetett utastsnak nevezik. Az sszetett utasts szintaktikailag egyet-len utastsnak minsl.

    A PELDA2.Cben a while kifejezse relci. A relcijelek a szokso-sak: kisebb (=). A relci kt lehetsges rtke: az igaz s a hamis logikai rtk. ACben azonban nincsen logikai adattpus, gy az igaz az 1 egsz rtk, sa zrus a hamis.

    A pldabeli bels blokk els s utols utastsa hozzrendels, melynekszintaktikai alakja:

    objektum = kifejezs A hozzrendels opertor (mveleti jel) bal oldaln valami olyan objek-tumnak kell llnia, ami rtket kpes felvenni. A szaknyelv ezt mdost-hat balrtknek nevezi. Pldnkban az sszes hozzrendels bal oldalnegy vltoz azonostja ll. Az = jobb oldaln meghatrozhat rtk ki-fejezsnek (jobbrtknek) kell helyet foglalnia. A hozzrendels hatsra akifejezs rtke - esetlegesen az objektum tpusra trtnt konverzi utn -fellrja az objektum rtkt. Az egsz konstrukci rtke az objektumj rtke, s tpusa az objektum tpusa. A legutbbi mondat azt clozza, hogy ha a hozzrendels kifejezs

    rsze, akkor ez az rtk s tpus vesz rszt a kifejezs tovbbi kirtkel-sben.

    A begyazott blokkbeli kt hozzrendels kifejezse aritmetikai. Az arit-metikai mveleti jelek a szoksosak: sszeads (+), kivons (), szorzs(*) s az oszts (/).

    Vegyk szre, hogy az eddigi printf fggvnyhvsainknak egyetlenkarakterlnc konstans paramtere volt, mely vltozatlan tartalommal je-lent meg a karakteres kpernyn! A bels blokkbeli printfben viszonthrom aktulis paramter van: egy karakterlnc konstans, egy int s egyfloat. A gond ugye az, hogy az int s a float paramter rtkt megjelen-tets eltt karakterlncc kne konvertlni, hisz binris bjtok kpernyrevitelnek semmifle rtelme nincs!

    A printf els karakterlnc paramtere

    karakterekbl s

    formtumspecifikci kbl

    ll. A karakterek vltozatlanul jelennek meg a kpernyn, a formtumspe-cifikcik viszont meghatrozzk, hogy a printf tovbbi paramtereinek

    Forrs: http://www.doksi.hu

  • C programnyelv 17

    rtkeit milyen mdon kell karakterlncc alaktani, s aztn ezt hogyankell megjelentetni.

    A formtumspecifikci % jellel indul s tpuskarakterrel zrul. A for-mtumspecifikcik s a printf tovbbi paramterei balrl jobbra haladvarendre sszetartoznak. St ugyanannyi formtumspecifikci lehet csak,mint ahny tovbbi paramter van.

    Felsorolunk nhny tpuskaraktert a kvetkez tblzatban:

    Tpuskarakter A hozztartozparamter tpusa

    Megjelents

    d egsz tpus decimlis egszkntf lebegpontos tizedes trt alakjbanc egy karakter karakterknts karakterlnc karakterlncknt

    A formtumspecifikci pontosabb alakja:%tpuskarakter

    A be ttel az elhagyhatsgot hivatott jelezni. A szlessg annak ameznek a karakteres szlessgt rgzti, amiben a karakterlncc konver-tlt rtket alaprtelmezs szerint jobbra igaztva, s balrl szkzfeltl-tssel kell megjelentetni. Ha a szlessget elhagyjuk a formtumspecifi-kcibl, akkor az adat a szksges szlessgben jelenik meg. Maradjunkannyiban pillanatnyilag, hogy a pontossg lebegpontos esetben a tizedesjegyek szmt hatrozza meg!

    Lssuk be, hogy a "%9d|%9.2f\n" karakterlnc konstansbl a %9d s a %9.2f formtumspecifikcik, mg a | s a \n sima karakterek!Vegyk szre, hogy a nagy pozcionlgats helyett tblzatunk fejlcsornak s alhzsnak megjelentetst gy is rhattuk volna: printf("%9s|%9s\n---------+---------\n",

    "Forint", "Eur"); Foglalkoznunk kell mg egy kicsit a mveletekkel! Vannak

    egyoperandusos (opertor operandus) s

    ktoperandusos (operandus opertor operandus)mveletek. Az egyoperandusos opertorokkal kevs problma van. Azeredmny tpusa tbbnyire egyezik az operandus tpusval, s az rtke azoperandus rtkn vgrehajtva az opertort. Pldul: vltoz. Az ered-mny tpusa a vltoz tpusa, s az eredmny rtke a vltoz rtknek 1szerese.

    Forrs: http://www.doksi.hu

  • 18 BEVEZETS S ALAPISMERETEK

    Problmk a ktoperandusos mveleteknl jelentkezhetnek, s ha-nyagoljuk el a tovbbiakban az eredmny rtkt! Ha ktoperandusos m-veletnl a kt operandus tpusa azonos, akkor az eredmny tpusa is a k-zs tpus lesz. Ha a kt operandus tpusa eltr, akkor a fordt a rvidebb,pontatlanabb operandus rtkt a hosszabb, pontosabb operandus tpusrakonvertlja, s csak ezutn vgzi el a mveletet. Az eredmny tpusa ter-mszetesen a hosszabb, pontosabb tpus. A ft/244.5 osztsban a ftegsz tpus s a 244.5 konstans lebegpontos. A mvelet elvgzseeltt a ft rtkt lebegpontoss alaktja a fordt, s csak ezutn hajtjavgre az osztst. Az eredmny teht ugyancsak lebegpontos lesz. Eztimplicit tpuskonverzinak nevezik.

    Vegyk szre kzben a vals konstans rsszablyt is! Elhagyhateljellel kezddik, amikor is pozitv, s aztn az egsz rsz jegyei jnnek.Aztn egy tizedespont utn a trt rsz szmjegyei kvetkeznek.

    A problma a ms nyelv programoz szmra egszek osztsnljelentkezik, hisz egszek osztsnak eredmnye is egsz, s nincs semmi-fle maradkmegrzs, lebegpontos talakts!

    Ttelezzk fel, hogy 50 fillrrel cskkent az eur rfolyama! Alakt-suk csak t az euro=ft/244.5 hozzrendelst euro=ft/244re, srgtn lthatjuk, hogy az eredmnyekben sehol sincs trt rsz!

    Felvetdik a krds, hogyan lehetne ilyenkor a helyes rtket meg-hatrozni? A vlasz: explicit tpusmdosts segtsgvel, melynek szin-taktikai alakja:

    (tpus)kifejezsHatsra a kifejezs rtkt tpus tpusv alaktja a fordt. A konkrtesetben az oszts legalbb egyik operandust floatt kne mdostani, sugye akkor a ktoperandusos mveletekre megismert szably szerint amsik operandus rtkt is azz alaktan a fordt a mvelet tnyleges el-vgzse eltt, azaz: euro = (float)ft / 244;Megoldand feladatok:Ksztsen programot, mely a kperny 21 sorszor 21 oszlopos terletn

    a csillag karakter felhasznlsval megjelentet:

    Egy keresztet a 11. sor s 11. oszlop feltltsvel! {PLUSSZ.C}

    A ftlt (bal fels sarokbl a jobb alsba ment)!

    A mellktlt (a msik tlt)!

    Forrs: http://www.doksi.hu

  • C programnyelv 19

    Egyszerre mindkt tlt, azaz egy X-et! {IKSZ.C}

    A forinteur tszmtsi tblzatot elkszt PELDA2.C megold-sunkkal az a baj, hogy tl sok vltozt hasznlunk. Knnyen belthat-juk, hogy az fttl eltekintve a tbbi vltoz nem is az, hisz a program fu-tsa alatt nem vltoztatja meg egyik sem az rtkt!

    Ksztsnk PELDA3.C nven egy jobb megoldst! /* PELDA3.C: Forint-eur tszmtsi tblzat */#include void main(void){int ft; printf("%9s|%9s\n---------+---------\n",

    "Forint", "Eur");for(ft=100; ft

  • 20 BEVEZETS S ALAPISMERETEK

    A PELDA3.C ugyan sokat rvidlt, de ezzel a megoldssal meg aza problma, hogy tele van varzskonstansokkal. Ha megvltoztatnnk t-szmtsi tblzatunkban a tartomny als, ill. fels hatrt, mdostannka lpskzt, vagy az eur rfolyamot, akkor ennek megfelelen t kellenernunk varzskonstansainkat is. Az ilyen trogats 8 soros programnlknnyen, s remlhetleg hibamentesen megvalsthat. Belthat azon-ban, hogy nagymret, esetleg tbb forrsfjlbl ll szoftver esetben,amikor is a varzskonstansok rengeteg helyen elfordulhatnak, ez amdszer megbzhatatlan, vagy legalbb is nagyon hibagyans.

    A C a problma megoldsra a szimbolikus konstansok, vagy ms meg-nevezssel: egyszer makrk, hasznlatt javasolja. A metdus a kvetke-z:

    1. Definilni kell a benne hasznlatos szimbolikus llandkat egy he-lyen, egyszer, a forrsfjl elejn.

    2. Aztn a programban vgig a konstansok helyett szisztematikusan aszimbolikus konstansokat kell hasznlni.

    A vltoztats is nagyon egyszerv vlik gy:

    a megvltozott konstans rtkt egy helyen t kell rni, s

    a tbbi felhasznlsa automatikusan mdosul a kvetkez fordts-nl.

    A szimbolikus lland a#define azonost helyettestszveg

    elfeldolgoz direktvval definilhat. A szimbolikus lland tulajdon-kppen az azonost a direktva helytl a forrsszveg vgig van r-vnyben. Az elfeldolgoz kihagyja a direktvt a forrsszvegbl, majdvgigmegy rajta, s az azonost minden elfordulst helyettestszveg-re cserli.

    Lssuk a medvt!/* PELDA4.C: Forint-eur tszmtsi tblzat */#include #define ALSO 100 /* A tartomny als hatra */#define FELSO 1000 /* A tartomny fels rtke */#define LEPES 100 /* A lpskz */#define ARFOLYAM 244.5 /* Ft/eur rfolyam */void main(void){int ft; printf( "%9s|%9s\n---------+---------\n",

    "Forint", "Eur");for(ft=ALSO; ft

  • C programnyelv 21

    Szoks mg klnsen tbb forrsmodulos esetben a #define direk-tvkat (s mg ms dolgokat) kln fejfjlban elhelyezni, s aztn ezt min-den forrsfjl elejn #include direktvval bekapcsolni.

    Ksztsk csak el ezt a varicit is! /* BEGEND.H: Fejfjl az tszmtsi tblhoz */#include #define ALSO 100 /* A tartomny als hatra */#define FELSO 1000 /* A tartomny fels rtke */#define LEPES 100 /* A lpskz */#define ARFOLYAM 244.5 /* Ft/eur rfolyam */#define begin { /* {} helyett begin-end! */#define end }#define then /* if utastsban then! */#define LACI for /* Kulcsszavak tdefinilsa

    nem javasolt! *//* PELDA5.C: Forint-eur tszmtsi tblzat */#include "BEGEND.H"void main(void) beginint ft; printf("%9s|%9s\n---------+---------\n",

    "Forint", "Eur");LACI(ft=ALSO; ft

  • 22 BEVEZETS S ALAPISMERETEK

    fggvny. Ezt aztn balrl zrus feltltssel intt tpusmdostja, svisszaadja a hvnak.

    Azt, ahogyan az elbb a getchart lertuk, fggvny prototpusnaknevezik. A fggvny prototpus teljes formai informcit szolgltat aszubrutinrl, azaz rgzti:

    a fggvny visszatrsi rtknek tpust,

    a fggvny nevt,

    paramtereinek szmt, sorrendjt s tpust.

    A getchar fjl vgn, vagy hiba esetn EOFot szolgltat. Az EOF az STDIO.H fejfjlban definilt szimbolikus lland:#define EOF (1)Tekintsk csak meg az STDIO.H fejfjlban! Nzegets kzben vegykazt is szre, hogy a fejfjl tele van fggvny prototpusokkal.

    Mr csak az a krds maradt, hogy mi a fjlvg a szabvny bemene-ten, ha az a billentyzet? Egy opercis rendszertl fgg billentykombi-nci: Ctrl+Z vagy Ctrl+D.

    A paramter karaktert kiviszi a szabvny kimenet aktulis pozcijra az

    int putchar(int k);s sikeres esetben vissza is adja ezt az rtket. A hibt pp az jelzi, ha aputchar szolgltatta rtk eltr ktl.

    Ksztsnk programot, ami a szabvny bemenetet tmsolja a szabvnykimenetre! /* PELDA6.C: Bemenet msolsa a kimenetre */#include void main(void){int k;printf("Bemenet msolsa a kimenetre:\n"

    "Gpeljen Ctrl+Z-ig sorokat!\n\n");k=getchar();while(k!=EOF){

    if(k!=putchar(k))printf("Hiba a kimeneten!\n");

    k=getchar(); } }Fogalmazzuk meg minimlis elvrsainkat egy programmal szemben!

    A szoftver indulsakor jelezze ki, hogy mit csinl!

    Forrs: http://www.doksi.hu

  • C programnyelv 23

    Ha valamilyen eredmnyt kzl, akkor azt lssa el tjkoztat szveg-gel, mrtkegysggel stb.!

    Ha valamit bekr, akkor tjkoztasson rla, hogy mit kell megadni, mi-lyen egysgben stb.!

    A bemenet ellenrzend! A hibs adat helyett a hiba okt esetleg kije-lezve azonnal krjen jat a program!

    A = relcijelekrl mr sz volt! A Cben != a nem egyenlopertor s == az egyenl mveleti jel. Az == s a != radsul a tbbi re-lcinl eggyel alacsonyabb prioritsi szinten foglal helyet. Kifejezs kir-tkelse kzben elbb a magasabb priorits mveletet vgzi el a fordt,s csak aztn kvetkezik az alacsonyabb.

    Vigyzat! Az egyenl relcit az egyms utn rt, kt egyenlsg jeljelzi. Az egyetlen egyenlsg jel a hozzrendels opertor!

    A ktirny szelekci szintaktikai alakja: if(kifejezs) utasts1

    Az elhagyhatsgot most is a jelzi. Ha a kifejezs igaz (nem zrus), ak-kor utasts1 vgrehajtsa kvetkezik. Ha a kifejezs hamis (zrus) s vanelse rsz, akkor az utasts2 kvetkezik. Mindkt utasts sszetett utas-ts is lehet.

    A PELDA6.C megoldsunk tlzottan nem C z. Cben programunkutols 5 sort gy kne megrni: while((k=getchar())!=EOF)if(k!=putchar(k))

    printf("Hiba a kimeneten!\n");A while kifejezse egy nem egyenl relci, melynek bal oldali ope-

    randusa egy kln zrjelben ll hozzrendels. Elbb a hozzrendelsjobb oldalt kell kirtkelni. Lssuk csak sorban a kirtkels lpseit!

    1. Meghvja a getchar fggvnyt a fordt. 2. A visszakapott rtkkel fellrja k vltoz rtkt.

    3. A getchartl kapott rtket hasonltja EOFhoz. A kifejezsbl a hozzrendels krli kln zrjel nem hagyhat el,

    mert a hozzrendels alacsonyabb priorits mvelet a relcinl. Hamgis elhagynnk, akkor a kirtkels sorn a fordt:

    1. Meghvn elbb a getchar fggvnyt.

    Forrs: http://www.doksi.hu

  • 24 BEVEZETS S ALAPISMERETEK

    2. A visszatrsi rtket hasonltan EOFhoz. Teht kapna egy logi-kai igaz (1), vagy hamis (0) rtket!

    3. A k vltoz felvenn ezt az 1, vagy 0 rtket.

    Figyeljk meg a PELDA6.C futtatsakor, hogy a getchar a beme-netrl olvasott karaktereket az opercis rendszer billentyzet pufferblkapja! Emlkezznk csak vissza! A parancssorban a begpelt szvegetszerkeszthetjk mindaddig, mg Entert nem nyomunk. A billentyzetpufferben lev karakterek teht csak akkor llnak a getchar rendelkezs-re, ha a felhasznl lettte az Enter billentyt.

    Ksztsnk programot, mely fjlvgig leszmllja, hogy hny

    numerikus karakter,

    fehr karakter,

    ms egyb karakter s

    sszesen hny karakter

    rkezett a szabvny bemenetrl!

    Megoldsunkban az sszes vltoz egsz tpus. k tartalmazza a beolva-sott karaktert. A num, a feher s az egyeb szmllk. Az algoritmus:

    Deklarljuk a vltozkat, s az sszes szmllt lssuk el zrus kez-drtkkel!

    Jelentessk meg a program cmt, s tjkoztassunk a hasznlatrl!

    Mkdtessk addig a ciklust, mg EOF nem rkezik a bemenetrl!

    A ciklusmagban hromirny szelekci segtsgvel el kell gazni ahrom kategria fel, s ott meg kell nvelni eggyel a megfelelszmllt!

    A ciklus befejezdse utn megjelentetendk a szmllk rtkeimegfelel tjkoztat szvegekkel, s az is, hogy sszesen hny ka-rakter rkezett a bemenetrl!

    /* PELDA7.C: A bemenet karaktereinek leszmllsa kategrinknt */

    #include void main(void){short k, num, feher, egyeb;num=feher=egyeb=0;printf("Bemeneti karakterek leszmllsa\n"

    "kategrinknt EOF-ig, vagy Ctrl+Z-ig.\n");while((k=getchar())!=EOF)

    Forrs: http://www.doksi.hu

  • C programnyelv 25

    if(k>='0'&&k

  • 26 BEVEZETS S ALAPISMERETEK

    A fordt jobbrl balra halad, azaz kirtkeli a kifejezst, s vissza-fel jvet berja az eredmnyt a balrtkekbe.

    A konstrukci hatsra a fordt gyorsabb kdot is hoz ltre. Ugyan-is a

    c=kifejezs;b=kifejezs;a=kifejezs;

    rsmdnl hromszor kell kirtkelni ugyanazt a kifejezst. Cben a tbbg (N) szelekcira az egyik kdolsi lehetsg:

    if(kifejezs1)utasts1else if(kifejezs2)utasts2else if(kifejezs3)utasts3/* . . . */else utastsN

    Ha valamelyik if kifejezse igaz (nem zrus) a konstrukciban, akkor avele azonos sorszm utasts vgrehajtsa kvetkezik, majd a konstruk-cit kvet utasts jn. Ha minden kifejezs hamis (zrus), akkor viszontutastsN hajtand vgre. Fedezzk fel a karakter konstans rsszablyt: aposztrfok kztt

    karakter, vagy escape szekvencia.

    A karakter konstans belsbrzolsa int, gy az ASCII kd egsz r-tknek is minsl kifejezsekben.

    A PELDA7.Cbl lthat, hogy a logikai s mveletet && jelli, sa logikai vagy opertor a ||.

    A ktoperandusos logikai opertorok prioritsa alacsonyabb a rel-ciknl, s az && magasabb priorits, mint a ||. Ha a ktoperandusos lo-gikai mvelet eredmnye eldl a bal oldali operandus kirtkelsvel, ak-kor a C bele sem kezd a msik operandus rtkelsbe. Az s mveleteredmnye eldlt, ha a bal oldali operandus hamis. A vagy pedig akkorksz, ha az els operandus igaz.

    A Cben van inkrementls (++) s dekrementls () egsz rtkekre.Mindkt mvelet egyoperandusos, teht nagyon magas priorits. A ++operandusa rtkt eggyel nveli meg, s a pedig eggyel cskkenti,azaz:

    ++vltoz vltoz=vltoz+1--vltoz vltoz=vltoz1

    Forrs: http://www.doksi.hu

  • C programnyelv 27

    A problmk ott kezddnek azonban, hogy mindkt mvelet ltezikeltag (prefix) s uttag (postfix) opertorknt is!

    Foglalkozzunk csak a ++ opertorral! A ++vltoz s a vltoz++hatsra a vltoz rtke eggyel mindenkpp megnvekedik. Kifejezs r-szeknt eltag opertor esetn azonban a vltoz j rtke vesz rszt a to-vbbi kirtkelsben, mg uttag mveletnl a vltoz eredeti rtke sz-mt be. Feltve, hogy a s b egsz tpus vltozk, s b rtke 6: a = ++b; /* a=7 s b=7 */a = b++; /* a=7 s b=8 */ Figyeljnk fel r, hogy a PELDA7.C utols printf utastsban

    hosszmdostk llnak a d tpuskarakterek eltt a formtumspecifikcik-ban! Ltszik, hogy a h jelzi a printfnek, hogy a formtumspecifikci-hoz tartoz aktulis paramter short tpus (2 bjtos), ill. l tudatja vele,hogy a hozztartoz aktulis paramter long (4 bjtos). A megfelel hosszmdostk megadsa a formtumspecifikcik-

    ban elengedhetetlen, hisz nem mindegy, hogy a fggvny a verem kvet-kez hny bjtjt tekinti a formtumspecifikcihoz tartoznak!

    Vegyk azt is szre, hogy a tpusokhoz a mezszlessggel is felk-szltnk: a maximlis pozitv short rtk bizonyosan elfr 5 pozcin, slong pedig 10en! Lthat mg, hogy arra is vigyztunk, hogy a hrom maximlis

    short rtk sszege rszeredmnyknt se csonkuljon! Ezrt az explicitlongg mdosts a printf utols paramterben:(long)num+feher+egyebMegoldand feladatok:

    Ksztsen programokat a PELDA4.C alapjn a kvetkezkppen:

    A forint 1000-tl 100ig cskkenjen 100asval!

    Az eur nvekedjk 1tl 10ig egyesvel!

    A forint 100tl 2000ig nvekedjen 100asval! Az eredmnyt akpernyn fejlccl elltva kt oszlop prban oszlopfolytonosan ha-ladva kell megjelentetni. A bal oldali oszlop pr 100zal, a jobb ol-dali viszont 1100zal kezddjk!

    A feladat maradjon ugyanaz, mint az elbb, de a megjelentets le-gyen sorfolytonos. A bal oldali oszlop pr kezddjk 100zal, ajobb oldali viszont 200zal, s mindegyik oszlop prban 200 legyena lpskz!

    Forrs: http://www.doksi.hu

  • 28 BEVEZETS S ALAPISMERETEK

    Maradva a sorfolytonos megjelentetsnl, krjk be elbb a kijel-zend oszlop prok szmt ellenrztt inputtal! Az oszlop prokszma 1, 2, 3 vagy 4 lehet. A mg kijelzend fels rtk ennek meg-felelen 1000, 2000, 3000 vagy 4000. Az eredmny a kpernynfejlccl elltva az elrt szm oszlop prban jelenjen meg gy,hogy 100 tovbbra is a lpskz! {TOBBOSZL.C}

    A forint 100tl 10000ig nvekedjen 100asval! A lista nem fut-hat el a kpernyrl, azaz fejlccl elltva lapozhatan kell megje-lentetni! Ez azt jelenti, hogy elszr kiratjuk a lista egy kpernylapnyi darabjt, majd vrunk egy gombnyomsra. A gomb letse-kor produkljuk a lista kvetkez lapjt, s jbl vrunk egy gomb-nyomsra, s gy tovbb. {LAPOZ.C}

    Legyen ugyanaz a feladat, mint az elz pontban, de a lista a kper-nyn fejlccl elltva nem csak elre, hanem elrehtra lapozhat-an jelenjen meg!

    Ksztsen programokat, melyek a szabvny bemenetet EOFig olvas-sk, s kzben megllaptjk, hogy:

    Hny sor volt a bemeneten? A bemenet karakterei kzt a \neketkell leszmllni. Az utols sor persze lehet, hogy nem \nnel vg-zdik, hanem EOFfal.

    Hny sz volt a bemeneten? A sz nem fehr karakterekbl ll. Aszavakat viszont egymstl fehr karakterek vlasztjk el. Az utolssz lehet, hogy nem fehr karakterrel zrul, hanem EOFfal.

    3.7 TmbkKsztsnk programot, mely a szabvny bemenetet olvassa EOF-ig!

    Megllaptand s kijelzend, hogy hny A, B, C stb. karakter rkezett! Akis s nagybetk kztt nem tesznk klnbsget! A betkn kvli tb-bi karaktert tekintsk egy kategrinak, s ezek darabszmt is jelezzk ki!

    Megoldsunkban az elvalaszto karakteres vltoz, a k, a tobbi s a betuviszont egsz tpus. A k tartalmazza a beolvasott karaktert, s ciklusvl-tozi funkcikat is ellt. A tobbi s a betu szmllk. A betu annyi ele-m tmb, mint ahny bet az angol bcben van. A tobbi a betkn k-vli tbbi karakter szmllja. Az elvalaszto karakteres vltozra azrtvan szksg, mert az eredmny csak kt oszlop pros listaknt kzlhetegy kpernyn. Az algoritmus:

    Forrs: http://www.doksi.hu

  • C programnyelv 29

    Deklarljuk a vltozkat, s a tmbt! A szmllk nullzandk!Az elvalaszto induljon szkz kezdrtkkel!

    Jelentessk meg a program cmt, s tjkoztassunk a hasznlatrl!

    Mkdtessk addig a ciklust, mg EOF nem rkezik a bemenetrl!

    A ciklusmagban hromirny szelekcival el kell gazni hrom ka-tegria fel: nagybet, kisbet s ms karakter. Megnvelendeggyel termszetesen a megfelel szmll!

    A ciklus befejezdse utn kt oszlop pros tblzatban megjelente-tendk a betszmllk rtkei, s vgl egy kln sorban a tbbikarakter kategria szmllja!

    /* PELDA8.C: Betszmlls a bemeneten */#include #define BETUK 26 /* Az angol bc betszma */void main(void){char elvalaszto; /* Listelvlaszt karakter. */int k, /* Bemeneti kar. s ciklusvltoz. */

    tobbi, /* Nem betk szmllja. */betu[BETUK]; /* Betszmllk. */

    tobbi=0; /* Kezdrtk ads. */for(k=0; k='A'&&k='a'&&k

  • 30 BEVEZETS S ALAPISMERETEK

    A legtbb programfejleszt rendszerben az unsigned char alaprtelme-zsknt is bellthat karakter tpus.

    A PELDA8.Cbl kitnen ltszik, hogy a tmb defincija tpus tmbazonost[mret];

    alak. Pontosabban a deklarcis utasts azonostlistja nem csak egy-szer vltozk azonostibl llhat, hanem tmbazonost[mret] konst-rukcik is lehetnek kztk. A tmbdefinciban a mret pozitv, egsz r-tk lland kifejezs, s a tmb elemszmt hatrozza meg.

    lland kifejezs az, aminek fordtsi idben kiszmthat az rt-ke.

    A tmb egy elemnek helyfoglalsa tpustl fgg. Az egsz tmb a me-mriban sszesen

    sizeof(tmbazonost) mret*sizeof(tpus) bjtot ignyel. Pldul 16 bites intet felttelezve a sizeof(betu) 26*si-zeof(int) pontosan 52.

    A magas priorits, egyoperandusos sizeof opertor megadja a m-gtte zrjelben ll objektum, vagy tpus ltal elfoglalt bjtok szmt.

    A tmb egy elemre val hivatkozst indexes vltoznak is nevezik sszintaktikailag a kvetkez:

    tmbazonost[index]ahol az index nem negatv rtk egsz kifejezs

    0

  • C programnyelv 31

    jelentetjk meg, azaz rendre 65t, 66ot, 67et stb. ratunk ki karaktere-sen, teht At, Bt, Ct stb. ltunk majd.

    Lssuk mg be, hogy az elvalaszto vltoz rtke szkz s sor-emels karakter kzt vltakozik, s gy kt betdarab pr kpes megjelen-ni egy sorban. Teht az elvalaszto vltoz segtsgvel produkljuk a ktoszlop pros eredmnylistt.

    Listzni csak azt rdemes, ami valamilyen informcit hordoz!

    Teht a zrus darabszm betk kijelzse teljesen felesleges! Magyarna for ciklusbeli printfet gy kne mdostani:

    if(betu[k]>0) printf("%4c|%5d%c", k+'A',betu[k], elvalaszto);

    Megoldand feladatok:Fokozza gy a PELDA8.Cben megoldott feladatot, hogy megszmll-

    ja a magyar kezetes kis s nagybetket is!

    Ksztsen programot, mely a szabvny bemenetet EOFig olvassa!Szmllja meg s jelezze ki, hogy hny 0, 1, 2 stb. karakter rkezik! Anem numerikus karaktereket tekintse egy kategrinak, s ezek szmt iskzlje!

    3.8 FggvnyekA fggvnyeket tbbflekppen csoportosthatnnk, de a legpraktiku-

    sabb gy, hogy:

    Vannak elre megrtak. Knyvtrakban (.LIB), vagy trgymodulok-ban (.OBJ) tallhatk, s a kapcsol-szerkeszt kapcsolja be ket avgrehajthat fjlba. Pldul: a printf, a getchar, a putchar, vagy amain stb. Minden vgrehajthat programban kell lennie egy fgg-vnynek, az indt programnak (a main-nek), mely az egsz prog-ram belpsi pontjt kpezi.

    Mi rjuk ket. Forrsfjlokban helyezkednek el, s kdjukat a fordtgenerlja.

    A nyelv kzponti eleme a fggvny. A ms programozsi nyelvekbenszoksos eljrs (procedure) itt explicit mdon nem ltezik, mert a C szel-lemben az egy olyan fggvny, aminek nincs visszaadott rtke:

    void eljrs();Jelezzk ki egy tblzatban az 1001 s 1010 kztti egsz szmok k-

    bt!

    Forrs: http://www.doksi.hu

  • 32 BEVEZETS S ALAPISMERETEK

    /* PELDA9.C: Kbtblzat */#include #define TOL 1001 /* A tartomny kezdete. */#define IG 1010 /* A tartomny vge. */long kob(int); /* Fggvny prototpus. */void main(void){int i; printf(" Szm|%11s\n-----+-----------\n", "Kbe");for(i=TOL; i

  • C programnyelv 33

    Cben az egsz tpusok terletn nincs sem tlcsorduls, sem alul-csorduls! Pontosabban ami tlcsordul, vagy alulcsordul, az mindenflezenet nlkl elveszik.

    A fggvnyhvs truhzza a vezrlst a hv fggvnybl a hvottbagy, hogy az aktulis paramtereket is tadja ha vannak rtk szerint.A vezrlst a fggvnytest els vgrehajthat utastsa kapja meg. voidvisszatrs fggvny blokkjban aztn a vgrehajts addig folytatdik,mg kifejezs nlkli return utasts nem kvetkezik, vagy a fggvnyblokkjt zr }-re nem kerl a vezrls. Ezutn a hvsi ponttl folytat-dik a vgrehajts.

    Vegyk szre, hogy a return utasts szintaktikjban az elhagyhatkifejezs a paramter nlkli returnt kvnta jellni!

    Belthat, hogy a fggvny prototpusnak mindig meg kell elznie a h-vst a forrsszvegben. A fordt gy tisztban van a hvs helyn a fgg-vny paramtereinek szmval, sorrendjvel s tpusval, ill. ismeri afggvny visszatrsi rtknek tpust is.

    A fordt a prototpus ismeretben implicit tpuskonverzit is vgrehajtaz aktulis paramter rtkn a fggvnynek trtn tads eltt, ha az ak-tulis paramter tpusa eltr.

    Ha nincs prototpus, akkor nincs implicit konverzi, s csak a cso-da tudja, hogy mi trtnik az tadott nem megfelel tpus rtkkel. Pl-dul a kob(3.0) hvs eredmnye zrus, ami remlhetleg kellen szem-llteti a prototpus megadsnak szksgessgt.

    Ha nincs prototpus, akkor a fordt azt felttelezi (teht olyan hv-si kdot generl), hogy a fggvnynek az alaprtelmezs miatt int vissza-adott rtke van. Ez ugyebr elgg rdekes eredmnyre vezet void, vagylebegpontos visszatrs fggvnyek esetben.

    A nem int visszaadott rtk fggvnyt legalbb deklarni kell ahv fggvnyben!

    A fggvnydeklarci bemutatshoz trjuk a PELDA9.Ct:/* PELDA9.C: Kbtblzat */#include #define TOL 1001 /* A tartomny kezdete. */#define IG 1010 /* A tartomny vge. */void main(void){int i; long kob(); /* Fggvnydeklarci. */printf(" Szm|%11s\n-----+-----------\n", "Kbe");for(i=TOL; i

  • 34 BEVEZETS S ALAPISMERETEK

    long kob(int a){ /* Fggvnydefinci. */return (long)a*a*a; } Vegyk szre rgtn, hogy deklarcis utastsunk szintaktikja is-

    mt mdosult! Az azonostlista nem csak egyszer vltozk azonosti-bl s tmbazonost[mret] konstrukcikbl llhat, hanem tartalmazhat

    fggvnynv()alakzatokat is.

    Termszetesen a teljes fggvny prototpus is berhat a deklrcis uta-stsba, long kob(int); /* Fggvnydeklarci. */de ilyenkor a fggvny prototpus csak ebben a blokkban lesz rvnyben.

    Lssuk be, hogy az utbbi mdszer nem ajnlhat olyan tbb fgg-vnydefincibl ll forrsfjlra, ahol a krdses fggvnyt tbb helyrlis meghvjk! Sokkal egyszerbb a forrsszveg elejn megadni egyszer aprototpust, mint minden t hv fggvnyben kln deklarlni a fgg-vnyt.

    A fggvny defincija prototpusnak is minsl, ha megelzi a for-rsszvegben a fggvnyhvst. /* PELDA9.C: Kbtblzat */#include #define TOL 1001 /* A tartomny kezdete. */#define IG 1010 /* A tartomny vge. */long kob(int a){ /* Fggvnydefinci. */return (long)a*a*a; }

    void main(void){int i; printf(" Szm|%11s\n-----+-----------\n", "Kbe");for(i=TOL; i

  • C programnyelv 35

    Ebben a fejezetben csak az rtk szerinti hvsrl szltunk, vagyisamikor a formlis paramterek rtkt kapja meg a meghvott fggvny.Van termszetesen nv (cm) szerinti hvs is a Cben, de ezt most mgnem trgyaljuk!

    3.9 ProdzsektHa a vgrehajthat program forrsszvegt tmnknt, vagy funkcin-

    knt klnkln forrsfjlokban kvnjuk elhelyezni, akkor Cs prog-ramfejleszt rendszerekben ennek semmifle akadly sincs. Be kell azon-ban tartani a kvetkez szablyokat:

    Egy s csak egy forrsmodulban szerepelnie kell az indt program-nak (main).

    Prodzsektfjl t kell kszteni, melyben felsorolandk a program tel-jes szvegt alkot forrsfjlok.

    Szedjk szt kt forrsmodulra: FOPROG.Cre s FUGGV.Cre, aPELDA9.C programunkat! /* FOPROG.C: Kbtblzat */#include #define TOL 1001 /* A tartomny kezdete. */#define IG 1010 /* A tartomny vge. */long kob(int); /* Fggvny prototpus. */void main(void){int i; printf(" Szm|%11s\n-----+-----------\n", "Kbe");for(i=TOL; i

  • 36 BEVEZETS S ALAPISMERETEK

    ms forrsfjlokat is nyitogatnnk meg klnfle ablakokban, a program-fejleszt rendszer az aktulis prodzsekt bezrsig nem ezek fordtsval,szerkesztsvel, vagy futtatsval foglalkozik.

    Lssuk a prodzsekt fordtst s kapcsolszerkesztst!

    FOPROG.CFUGGV.C

    fordts

    FOPROG.OBJFUGGV.OBJ

    4. bra: A PRODZSI prodzsekt fordtsa

    FOPROG.OBJFUGGV.OBJ

    indt program(OBJ)

    knyvtrak (LIB)

    kapcsolszerkeszts PRODZSI.EXE

    5. bra: A PRODZSI prodzsekt kapcsolszerkesztse

    Fedezzk fel, hogy a vgrehajthat fjl a prodzsekt nevt kapjameg!

    A prodzsektet alkot fjlok kztt implicit fggsg van. Ez azt je-lenti, hogy a prodzsekt futtatsakor csak akkor trtnik meg a trgymodulalakjban is rendelkezsre ll forrsfjl fordtsa, ha a forrsfjl utolsmdostsnak ideje (dtuma s idpontja) ksbbi, mint a vonatkoztrgymodul. A kapcsolszerkeszts vgrehajtshoz az szksges, hogya trgymodulok, ill. a knyvtrak valamelyiknek ideje ksbbi legyen avgrehajthat fjlnl. Az implicit fggsg fennll a forrsfjl s a bele#include direktvval bekapcsolt fjlok kztt is. A trgymodult akkor isjra kell fordtani, ha valamelyik forrsfjlba behozott fjl ideje ksbbi atrgymodulnl.

    Bizonyos programfejleszt rendszereknl elfordulhat, hogy azimplicit fggsgi mechanizmust gy kell kln aktivlni (menpont), ill.hogy a forrsfjlok, s a beljk behozott fjlok kzti fggsget explicitmdon kell biztostani.

    Forrs: http://www.doksi.hu

  • C programnyelv 37

    stdio.hPRODZSI.EXE

    foprog.objfuggv.objindt prog.knyvtrak

    foprog.cfuggv.c

    6. bra: Implicit fggsg a PRODZSI prodzsektnl

    A prodzsektfjlban a forrsmodulokon kvl megadhatk trgymo-dulok (OBJ) s knyvtrak (LIB) fjlazonosti is. A kapcsolszerkesz-t a trgymodulokat beszerkeszti a vgrehajthat fjlba. A knyvtrakbanpedig fggvnyek trgykdjait fogja keresni.

    A prodzsektfjlban tulajdonkppen a gyri indt program s a szabvnyknyvtrak is kicserlhetek, de ennek pontos megvalstsa mrigazn a programfejleszt rendszertl fgg.

    3.10 Karaktertmb s karakterlncA karaktertmbk defincija a Tmbk fejezetben ismertetettek sze-

    rint: char tmbazonost[mret];

    Az egsz tmb helyfoglalsa: mret*sizeof(char) mret

    bjt. A tmbindexels ebben az esetben is zrustl indul s mret1igtart.

    A Cben nincs kln karakterlnc (sztring) adattpus. A karakter-lncokat a fordtnak s a programoznak karaktertmbkben kell elhe-lyeznie. A karakterlnc vgt az t tartalmaz tmbben egy zrusrtkbjttal (\0) kell jelezni. Pldul a Karakterlnc karakterlncot gy kellletrolni a tomb karaktertmbben: tomb K a r a k t e r l n c \0

    0 1 2 3 4 5 6 7 8 9 10 11 12 Vegyk szre, hogy a karakterlnc els jele a tomb[0]ban, a mso-

    dik a tomb[1]ben, s a legutols a tomb[11]ben helyezkedik el, s az eztkvet tomb[12] tartalmazza a lnczr zrust! Figyeljnk fel arra is, hogy a karakterlnc hossza (12) megegyezik a

    lezr \0 karaktert magba foglal tmbelem indexvel!

    Fedezzk mg rgtn fel, hogy a zrus egsz konstans (0) s alnczr \0 karakter rtke ugyanaz: zrus int tpusban! Hiszen a karak-ter konstans belsbrzolsa int.

    Forrs: http://www.doksi.hu

  • 38 BEVEZETS S ALAPISMERETEK

    A Cben nincs kln karakterlnc adattpus, s ebbl kvetkezlegnem lteznek olyan sztring mveletek sem, mint a karakterlncok

    egyestse,

    sszehasonltsa,

    hozzrendelse stb.

    Ezeket a mveleteket bjtrlbjtra haladva kell kdolni, vagy fggvnytkell rni rjuk, mint ahogyan azt a kvetkez pldban bemutatjuk.

    Ksztsen programot, mely neveket olvas a szabvny bemenetrl EOFig vagy res sorig! Megllaptand egy fordtsi idben megadott nvrl,hogy hnyszor fordult el a bemeneten! A feladat megoldshoz kszten-d

    Egy int strcmp(char s1[], char s2[]) fggvny, mely sszehasonlt-ja kt karakterlnc paramtert! Ha egyeznek, zrust ad vissza. Haaz els htrbb van a nvsorban (nagyobb), akkor pozitv, egyb-knt meg negatv rtket szolgltat.

    Egy int getline(char s[], int n) fggvny, mely behoz a szabvnybemenetrl egy sort! A sor karaktereit rendre elhelyezi az s karak-tertmbben. A befejez soremels karaktert nem viszi t a tmbbe,hanem helyette lnczr \0t r a karakterlnc vgre. A getlinemsodik paramtere az s karaktertmb mretnl eggyel kisebbegsz rtk, azaz a lnczr zrus nlkl legfeljebb n karaktert trola tmbben a fggvny. A getline visszatrsi rtke az s tmbbenvgl is elhelyezett karakterlnc hossza.

    /* PELDA10.C: Nvszmlls */#include #define NEV "Jani" /* A szmllt nv. */#define MAX 29 /* A bemeneti sor maximlis mrete.

    Most egyben a leghosszabb nv is. */int getline(char s[],int n); /* Fggvny prototpusok. */int strcmp(char s1[], char s2[]);void main(void){int db; /* Nvszmll. */char s[MAX+1]; /* Az aktulis nv. */db=0; /* A szmll nullzsa. */printf("A(z) %s nv leszmllsa a bemeneten.\nAdjon\

    meg soronknt egy nevet!\nProgramvg: res sor.\n",NEV);/* Sorok olvassa res sorig a bemenetrl: */while(getline(s,MAX)>0)

    /* Ha a sor pp a NEV: */if(strcmp(s,NEV)==0) ++db;

    /* Az eredmny kzlse: */printf("A nevek kzt %d darab %s volt.\n",db,NEV); }

    Forrs: http://www.doksi.hu

  • C programnyelv 39

    int strcmp(char s1[], char s2[]){int i;for(i=0; s1[i]!=0&&s1[i]==s2[i]; ++i);return(s1[i]-s2[i]);}

    int getline(char s[],int n){int c,i;for(i=0;i

  • 40 BEVEZETS S ALAPISMERETEK

    #include , s trljk ki a forrsszvegbl az strcmp prototpust s defincijt!Vgl prbljuk ki!

    Feltve, hogy s1 s s2 karaktertmbk, lssuk be, hogy C program-ban, ugyan szintaktikailag nem helytelen, semmi rtelme sincs az ilyenkdolsnak, hogy: s1==s2, s1!=s2, s1>=s2, s1>s2, s10)sort a kvetkezrewhile(getline(s,4)>0), s a program indtsa utn gpeljk be a JenJaniJojJani

    Forrs: http://www.doksi.hu

  • C programnyelv 41

    sorokat!

    Az els kt problma az opercis rendszer viselkedse miatt van, s je-lenleg sajnos nem tudunk rajta segteni. A msodik gondhoz mg azt ishozz kell fznnk, hogy fjlvget a billentyzet szabvny bemeneten agetlinenak csak res sor megadsval tudunk elidzni.

    A harmadik problma viszont knnyedn orvosolhat, csak ki kell ol-vasni a bemeneti puffert vgig a getlinebl val visszatrs eltt. Teht: int getline(char s[],int n){

    int c,i;for(i=0;i

  • 42 BEVEZETS S ALAPISMERETEK

    Mindkt i vltoz loklis a sajt fggvnyblokkjra.

    A loklis vltoz hatskre az a blokk, amiben definiltk.

    A loklis vltoz lettartama az az id, mg sajt fggvnyblokkjaaktv, azaz benne van a vezrls.

    Teht a kt i vltoznak a nvegyezsen tl nincs semmi kze sem egy-mshoz.

    A vltoz hatskre az a programterlet, ahol rvnyesen hivat-kozni lehet r, el lehet rni. Nevezik ezt ezrt rvnyessgi tartomnynakis.

    A loklis vltoz hatskre az a blokk, s annak minden begya-zott blokkja, amiben definiltk. A blokkon bellisge miatt a loklis vl-tozt bels vltoznak is nevezik.

    A vltoz lettartama az az idszak, amg memrit foglal.

    A loklis vltoz akkor jn ltre (rendszerint a veremben), amikora vezrls bejut az t definil blokkba. Ha a vezrls kikerl onnt, ak-kor a memriafoglalsa megsznik, helye felszabadul (a veremmutathelyrejn).

    A fggvnyekben, gy a mainben is, definilt vltozk mind loklisakarra a fggvnyre, amelyben deklarltk ket. Csak az adott fggvnyenbell lehet hozzjuk frni. Ez a loklis hatskr. Futsi idben a fgg-vnybe val belpskor jnnek ltre, s kilpskor meg is semmislnek.Ez a loklis lettartam. A loklis vltoz kezdrtke ebbl kvetkezlegszemt. Pontosabban az a bitkombinci, ami azokban a memriabj-tokban volt, amit most ltrejvetelekor a rendszer rendelkezsre bocs-tott. Teht a bels vltoznak nincs alaprtelmezett kezdrtke. Az alap-rtelmezett kezdrtket implicit kezdrtknek is szoktk nevezni.

    Mi dnti el, hogy a bels vltoz melyik blokkra lesz loklis?Nyilvnvalan az, hogy az t definil deklarcis utastst melyik blokkelejn helyezik el.

    Tisztzzuk valamennyire a vltoz deklarcija s defincija kz-ti klnbsget! Mindkt deklarcis utastsban megadjk a vltoz n-hny tulajdonsgt, de memriafoglalsra csak definci esetn kerl sor.

    A loklis vltoz az elzekben ismertetetteken kvl auto trol-si osztly is.

    Egsztsk ki jbl a deklarcis utasts szintaktikjt! azonostlista;

    Forrs: http://www.doksi.hu

  • C programnyelv 43

    A trolsiosztly a kvetkez kulcsszavak egyike lehet: auto, register,static, vagy extern. E fejezet keretben nem foglalkozunk a register s astatic trolsi osztllyal! A szintaktikt betartva most felrhat, hogy auto i;, ami az auto signed int tpus, i azonostj vltoz defincija. Hogyan lehet auto trolsi osztly a loklis vltoz? Nyilvn

    gy, hogy a loklis helyzet deklarcis utastsban az auto trolsi osz-tly alaprtelmezs. Az auto kulcssz kirsa ezekben az utastsokbanteljesen felesleges.

    Foglaljuk ssze a loklis vltozval, vagy ms nven bels vltozval,kapcsolatos ismereteinket!

    Neve: Brmilyen azonost.Tpusa: Valamilyen tpus.Hatskre: Az a blokk, ahol definiltk.lettartama: Amg a blokk aktv, azaz a vezr-

    ls benne van. Alaprtelmezett trolsi osztlya: autoAlaprtelmezett kezdrtke: Nincs.Deklarcis utastsnak helye: Annak a blokknak a deklarcis

    rsze, ahol a vltozt hasznlni k-vnjuk.

    Memriafoglals: Futsi idben, tbbnyire a verem-ben.

    Meg kell emlteni, hogy a fggvnyek formlis paramterei is lok-lis vltozknak minslnek, de

    deklarcijuk a fggvnydefinci fej rszben s nem a blokkjbanhelyezkedik el, s

    rtkk az aktulis paramter rtke.

    Az elfeldolgozson tesett forrsmodult fordtsi egysgnek neve-zik. A fordtsi egysg fggvnydefincikbl s kls deklarcikbl ll.Kls deklarci alatt a minden fggvny testn kvli deklarcit rt-jk. Az gy definilt vltozt kls vltoznak, vagy globlis vltoznaknevezik. Az ilyen vltoz:

    Hatskre a fordtsi egysgben a deklarcis utastsnak pozci-jtl az n. deklarcis ponttl indul, s a modul vgig tart. Ezta hatskrt fjl hatskrnek, vagy globlis hatskrnek nevezik.

    Forrs: http://www.doksi.hu

  • 44 BEVEZETS S ALAPISMERETEK

    lettartama a program teljes futsi ideje. A memria hozzrendelsmr fordtsi idben megtrtnik. Rendszerint az elsdleges adatte-rleten helyezkedik el, s biztos, hogy nem a veremben. Ez a stati-kus lettartam.

    Alaprtelmezett (implicit) kezdrtke: minden bitje zrus. Ez azaritmetikai tpusoknl zrus. Karaktertmb esetben ez az res ka-rakterlnc, hisz rgtn a lnczr nullval indul.

    Alaprtelmezett trolsi osztlya extern.

    Bnjunk csnjn az extern kulcssz explicit hasznlatval, mertdeklarcis utastsban val megadsa ppen azt jelenti, hogy az utastsnem definci, hanem csak deklarci! Ms fordtsi egysgben definiltkls vltozt kell ebben a forrsmodulban gy deklarlni a r val hivat-kozs eltt.

    /* Forrsmodul 1 */extern int i;extern char t[];/* . . . */

    /* Forrsmodul 2 */int i;char t[10];/* . . . */

    7. bra: extern deklarci

    Prodzsektnk lljon e kt forrsmodulbl! Az int tpus i vltozt s a tkaraktertmbt Forrsmodul 2ben definiltk. Itt trtnt teht meg ahelyfoglalsuk. Ezek a vltozk Forrsmodul 1ben csak akkor rhetkel, ha a rjuk trtn hivatkozs eltt extern kulcsszval deklarljk ket. Vegyk szre, hogy a Forrsmodul 1 elejn elhelyezett deklarcis

    utastsok egyrszt globlis szinten vannak, msrszt valban csak dekla-rcik, hisz a tmb deklarcijban mret sincs!

    Persze azt, hogy a tmb mekkora, valahonnt a Forrsmodul 1benis tudni kell!

    rjuk t gy a PELDA10.Ct, hogy a beolvasott sor trolsra hasznla-tos tmbt globliss tesszk, majd nevezzk t PELDA11.Cre! /* PELDA11.C: Nvszmlls */#include #define NEV "Jani" /* A szmllt nv. */#define MAX 29 /* A bemeneti sor maximlis mrete.

    Most egyben a leghosszabb nv is. */int getline(void); /* A fggvny prototpusok. */int strcmp(char s2[]);void main(void){

    Forrs: http://www.doksi.hu

  • C programnyelv 45

    int db; /* Nvszmll. */db=0; /* A szmll nullzsa. */printf("A(z) %s nv leszmllsa a bemeneten.\nAdjon\

    meg soronknt egy nevet!\nProgramvg: res sor.\n",NEV);/* Sorok olvassa res sorig a bemenetrl: */while(getline()>0)

    /* Ha a sor pp a NEV: */if(strcmp(NEV)==0) ++db;

    /* Az eredmny kzlse: */printf("A nevek kzt %d darab %s volt.\n",db,NEV); }

    char s[MAX+1]; /* Az aktulis nv */int strcmp(char s2[]){int i;for(i=0; s[i]!=0&&s[i]==s2[i]; ++i);return(s[i]-s2[i]);}

    int getline(void){int c,i;for(i=0;i

  • 46 BEVEZETS S ALAPISMERETEK

    Summzzuk a globlis vltozval, vagy ms nven kls vltozval,kapcsolatos ismereteinket!

    Neve: Brmilyen azonost.Tpusa: Valamilyen tpus.Hatskre: Globlis, vagy fjl. A deklarcis

    ponttl a forrsmodul vgig tart.lettartama: Statikus. A program teljes futsi

    ideje alatt l. Alaprtelmezett trolsi osztlya: externAlaprtelmezett kezdrtke: Minden bitje zrus.Deklarcis utastsnak helye: A forrsmodul minden fggvny-

    defincijn kvl. Memriafoglals: Fordtsi idben, vagy legalbb is

    az indt program kezddse eltt.

    3.12 InicializlsAz inicializls kezdrtk adst jelent a deklarciban, azaz az inicia-

    liztorok kezdrtkkel ltjk el az objektumokat (vltozkat, tmbketstb.).

    A statikus lettartam objektumok egyszer a program indulsakor inici-alizlhatk. Implicit (alaprtelmezett) kezdrtkk tiszta zrus, ami:

    Zrus az aritmetikai tpusoknl.

    res karakterlnc karaktertmb esetn.

    A loklis lettartam objektumok inicializlsa minden ltrejvetelk-kor megvalsul, de nincs implicit kezdrtkk, azaz szemt van ben-nk.

    Mdostsuk jra a deklarcis utasts szintaktikjt vltozkra s tm-bkre!

    tpus azonost; tpus tmbazonost[];

    , ahol az inicializtorlista inicializtorok egymstl vesszvel elvlasztottsorozata, s a tpus a thelyettesti.

    A vltozkat egyszeren egy kifejezssel inicializlhatjuk, mely kifeje-zs opcionlisan {}-be is tehet. Az objektum kezdeti rtke a kifejezsrtke lesz. Ugyanolyan korltozsok vannak a tpusra, s ugyanazok akonverzik valsulnak meg, mint a hozzrendels opertornl. Magyarnaz inicializtor hozzrendels-kifejezs. Pldul:

    Forrs: http://www.doksi.hu

  • C programnyelv 47

    char y = z, k; /* y z rtk, s a knak meg *//* nincs kezdrtke. */

    int a = 10000; /* a 10000 kezdrtk. */ C-ben a statikus lettartam vltozk inicializtora csak konstans kifeje-

    zs lehet, ill. csak ilyen kifejezsek lehetnek tmbk inicializtorlistj-ban. A loklis objektumok inicializtoraknt viszont brmilyen leglis ki-fejezs megengedett, mely hozzrendels kompatibilis rtkk rtkelhetki a vltoz tpusra. define N 20int n = N*2; /* Statikus objektum inicializtora

    csak konstans kifejezs lehet. *//* . . . */void fv(int par){int i = N/par; /* A loklis objektum viszont

    brmilyen leglis kifejezs. . . . */ } Emlkezznk vissza, hogy globlis vltozk csak egyszer kapnak

    kezdrtket: a program indulsakor. A loklis objektumok viszont mind-annyiszor, valahnyszor blokkjuk aktvv vlik.

    A szvegben hasznlatos objektum fogalom nem objektumorien-tlt rtelm, hanem egy azonosthat memria terletet takar, mely kons-tans vagy vltoz rtk(ek)et tartalmaz. Minden objektumnak van azono-stja (neve) s adattpusa. Az adattpus rgzti az objektumnak

    lefoglaland memria mennyisgt s

    a benne trolt informci belsbrzolsi formjt.

    Tmbk esetn az inicializtorlista elemeinek szma nem haladhatjameg az inicializland elemek szmt! float tomb[3] = {0., 1., 2., 3.}; /* HIBS: tbb

    inicializtor van, mint tmbelem. */Ha az inicializtorlista kevesebb elem, mint az inicializland objektu-

    mok szma, akkor a maradk objektumok a statikus lettartam implicitkezdrtk ads szablyai szerint kapnak rtket, azaz nullzdnak: float tmb[3] = {0., 1.}; /* tmb[0]==0.0, tmb[1]==1.0 s

    tmb[2]==0.0. */Az inicializland objektum lehet ismeretlen mret is, ha az inicializ-

    torlistbl megllapthat a nagysg. Pldul: int itmb[] = { 1, 2, 3}; /* Az itmb hrom elem lesz. */char nev[] = Lali, /* A lezr \0 karakter */csaladnev[] = Kiss; /* miatt 5 elemek a tmbk.*/

    Megoldand feladatok:

    Forrs: http://www.doksi.hu

  • 48 BEVEZETS S ALAPISMERETEK

    rja t az eddig elksztett PELDAn.Cket, s a megoldott feladatokprogramjait gy, hogy a vltozk kezdrtket mindig inicializlssalkapjanak!

    Forrs: http://www.doksi.hu

  • C programnyelv 49

    4 TPUSOK S KONSTANSOK A fordt a forrskdot szintaktikai egysgekre, vagy ms elnevezssel

    szimblumokra, s fehr karakterekre trdeli. A tbb egymst kvet fe-hr karakterbl csak egyet tart meg. Ebbl kvetkezleg:

    Egyetlen C utasts akr szimblumonknt klnkln sorba rha-t.

    Egy sorban azonban tbb C utasts is megadhat.

    Pontosan hat szimblum (int i ; float f ;) lesz a kvetkezkbl: inti;

    float f ;vagyint i; float f; A karakter, vagy karakterlnc konstansokban elfordul, akrhny

    fehr karaktert vltozatlanul hagyja azonban a fordt.

    Emltettk mr, hogy a programnyelv szimblumokbl (token) ll. Mostismertetjk a szimblum defincijt mdostott BackusNaur, metanyel-vi lerssal:

    szimblum (token):opertorkulcsszelvlaszt-jelazonostkonstanskarakterlnc (string literal) Az rtelmezs nagyon egyszer: a felsorolt hat fogalom mindegyike

    szimblum.

    Az opertorokkal nem ebben a szakaszban foglalkozunk, hanem a M-VELETEK S KIFEJEZSEKben!

    A kulcsszavak:

    auto double int structbreak else long switchcase enum register typedefchar extern return unionconst float short unsignedcontinue for signed void

    Forrs: http://www.doksi.hu

  • 50 TPUSOK S KONSTANSOK

    default goto sizeof volatiledo if static whileVannak ezeken kvl mg nem szabvnyos kulcsszavak s ms vdett

    azonostk, de ezek mindig megtudhatk a programfejleszt rendszer se-gtsgbl!

    Ilyenekre kell gondolni, mint a cdecl, a pascal, az stdcall, vagyegykt alhzs karakterrel kezddkre, mint pldul az __STDC__ stb. ANSI C kompatibilis fordtst elrva mindig kiderthet, hogy az

    illet fordt mely kulcsszavai, opertorai, vagy elvlasztjelei nemszabvnyosak.

    4.1 Elvlaszt-jelA szintaktikai egysgeket (a szimblumokat) egymstl legalbb egy fe-

    hr karakterrel el kell vlasztani. Nincs szksg azonban az elvlaszt fe-hr karakterre, ha a kt nyelvi egysg kz a szintaktikai szablyok szerintegybknt is valamilyen elvlaszt-jelet kell rni. Az opertorok is elv-lasztjelnek minslnek kifejezsekben.

    elvlaszt-jel: (a kvetkezk egyike!)[ ] ( ) { } * , : = ; #

    Nzzk meg nhny elvlasztjel funkcijt!

    Az utastst zr pontosvessz minden pldban benne van.

    A kerek zrjeleknek csoportost funkcija van kifejezsekben. Van,amikor a szintaktika rsze. Fggvnyhvsnl az aktulis paramtereket,fggvnydeklarciban s definciban a formlis paramtereket ebbe kelltenni. d = c*(a+b);if(d==z) ++x;fv(akt, par);void fv2(int n);A szgletes zrjelek tmbk deklarcijban s indexel opertorknt

    hasznlatosak. char kar, lanc[] = Sztan s Pan.;kar = lanc[3];A kapcsos zrjelekbe tett tbb utasts szintaktikailag egyetlen utasts-

    nak minsl. A dolgot sszetett utastsnak, blokknak nevezzk.

    Az sszetett utasts (blokk) zr kapcsos zrjele utn tilos pontos-vesszt tenni! if(a

  • C programnyelv 51

    a=2; z=b+6; };A csillag elvlaszt-jelnek tbbfle szerepe van a nyelvben. Eddig csak

    a szorzs opertor funkcijt ismerjk! a = 3.14*b;Az egyenlsg jel hozzrendels opertor, s deklarcis utastsban el-

    vlasztja a vltozt az inicializtortl, vagy inicializtorlisttl. char tomb[5] = {0, 1, 2, 3, 4};int x=5, b, c=4;b = x+c;A ketts kereszt elfeldolgoz (preprocessor) direktva kezdete. A sor-

    beli els nem fehr karakternek kell annak lennie. include define TRUE 1define FALSE 0

    4.2 Azonostazonost:

    nem-szmjegyazonost nem-szmjegyazonost szmjegy

    nem-szmjegy: (a kvetkezk egyike!)a ... z A ... Z _

    szmjegy: (a kvetkezk egyike!)0 1 2 3 4 5 6 7 8 9

    Az azonost vltozknak, fggvnyeknek, felhasznl definilta adatt-pusoknak stb. adott, a kvetkez pontokban pontostott nv:

    Kisbetvel, nagybetvel vagy alhzs (_) karakterrel kteles kez-ddni.

    A tovbbi karakterek lehetnek szmjegyek is.

    Az azonost nem lehet kulcssz vagy valamilyen elredefinilt, v-dett azonost.

    Az azonostk kis- s nagybet rzkenyek, azaz az Osszeg, azosszeg vagy az osszeG hrom klnbz azonost.

    Kerlni kell a kt s az egy alhzs karakterrel kezdd nevekhasznlatt is!

    Az azonostk els, mondjuk, 31 karaktere szignifikns. Ez azt je-lenti, hogy hosszabb nevek is hasznlhatk, de az els 31 karakte-rkben nem klnbz azonostk ugyanannak minslnek.

    Forrs: http://www.doksi.hu

  • 52 TPUSOK S KONSTANSOK

    Az, hogy az azonost els hny karaktere szignifikns, a fordttlfgg. Msrszt a programfejleszt rendszerben egy s ezen rtk kzttvltoztathat is!

    Bizonyos kls kapcsolds azonostkra, melyeket a kapcsolszerkeszt illeszt, eltr megszortsok lehetnek rvnyben. Pldul keve-sebb karakterbl llhatnak, vagy nem kis s nagybet rzkenyek stb.

    Megoldand feladat:A felsorolt pldaazonostk kzl az els hrom hibs. Magyarzza

    meg, hogy mi a problma velk!

    6os_villamos

    Moszer Aranka

    Nagy_Jnos

    Nagy_Jani

    puffer

    4.3 Tpusok s konstansok a nyelvbenA nyelvben sszesen ngy tpuskategria van:

    A fggvny a nyelv kdgenerl egysge. Az sszes tbbi kategriacsak memrit foglal az adatoknak.

    A void tpus tbbnyire valaminek a meg nem ltt jelzi. Pldulnincs paramtere s visszaadott rtke a void main(void) fggvny-nek.

    Skalr az aritmetikai tpus, mely tovbb bonthat fixpontos egsz slebegpontos vals brzols tpusokra. Ilyen a felsorols (enum)tpus s a mutat is.

    Aggregtum a tmb, a struktra s az uni.

    A mutatkkal, a struktrkkal s az unikkal ksbbi szakaszokbanfoglalkozunk!

    A tpusokat gy is csoportosthatnnk, hogy vannak

    alaptpusok s

    szrmaztatott tpusok

    Az alaptpusok a void, a char, az int, a float s a double. A szrmaztatspedig a short, a long, a signed s az unsigned n. tpusmdostkkal tr-

    Forrs: http://www.doksi.hu

  • C programnyelv 53

    tnhet. A short s a long, valamint a signed s az unsigned egymst ki-zr mdost prok, de a kt pr egyazon alaptpusra egyszerre is alkal-mazhat, azaz ltezik

    unsigned long int vagy

    signed short int stb. A signed s az unsigned mdost azonban csak egsz tpusokra (char sint) alkalmazhat, lebegpontos vals s a void alaptpusra nem.

    A szrmaztatott tpusokba mindig belertendk az ilyen tpus rtkkelvisszatr fggvnyek, az ilyen tpust paramterknt fogad fggvnyek,a tmbk stb. Ha programunkban valamilyen azonostt hasznlni kv-nunk, akkor elbb deklarlni (definilni) kell. A deklarci teremti meg akapcsolatot az azonost s az objektum kztt, s rgzti legalbb az ob-jektum adattpust. A szrmaztatott tpust is szoks egyszeren tpusnaknevezni.

    Kszpnzre vltva az elz bekezdsben mondottakat: ha a tpus vala-milyen nem void adattpus, akkor a deklarcik kvetkezkpp szemll-tethetk:tpus t, t1, t2; /* Hrom tpus tpus objektum. */tpus f(void); /* Tpus tpus rtket visszaad,

    paramter nlkli fggvny. */void fv(tpus i); /*Tpus tpus paramtert fogad

    eljrs. */tpus tt[10]; /* 10 elem, tpus tpus tmb. Az

    elemek rendre: tt[0], ..., tt[9]. */ Felttlenl emltst kell tennnk mg kt, definciban hasznlhat

    mdostrl, melyek alaposan megvltoztatjk a deklarlt objektum tulaj-donsgait. E kulcsszavakat minstk megnevezssel is illetik.

    A const nem mdosthat objektumot definil, azaz meggtolja a hozz-rendelst az objektumhoz, s az olyan mellkhatsokat, mint az inkremen-tls, dekrementls stb. Magyarn: nem engedi meg az azonost elrstbalrtkknt. A const a deklarci elejn brmilyen alaptpussal, aggreg-tum tpussal stb. llhat, de tilos tbbtteles deklarci els vesszje utnkirni: float f = 4.5, const cf = 5.6; /* HIBS. */ Ha a const objektum nem lehet balrtk, akkor hogyan lehet valami-

    lyen rtkkel elltni?

    Forrs: http://www.doksi.hu

  • 54 TPUSOK S KONSTANSOK

    A const tpus objektum rtkkel val elltsnak egyetlen mdjaaz inicializls. Teht az ilyen objektum defincijban ktelez neki kez-drtket adni, mert ez ksbb mr nem tehet meg. Pldul: const float pi = 3.1415926; const max2int = 32767; Az el nem rt alaptpus miatt a deklarci specifiktorknt egyedl

    ll const tulajdonkppen const int, s ezrt a max2int is az. E deklarci-k utn botor dolgok a kvetkez utastsok: pi = 3.; /* Szintaktikai hiba. */ int i = max2int++; /* Szintaktikai hiba. */ A volatile sz jelentse elprolg, illkony, llhatatlan. Mdostknt

    azt jelzi, hogy az illet vltoz rtke program vgrehajtson kvli okblis megvltozhat.

    Mi lehet a program vgrehajtsn kvli ok? Pldul megszakts,B/K port, konkurensen fut vgrehajtsi szl stb.

    A volatile kulcssz deklarcin belli elhelyezsnek szablyaiegyeznek a constival. A fordt az ilyen vltozt nem helyezheti el re-giszterben, ill. az ilyen objektumot is tartalmaz kifejezs kirtkelse so-rn nem indulhat ki abbl, hogy az rtk kzben nem vltozik meg. Sz-val az ilyen vltoz minden hivatkozshoz elrsi kdot kell generlniaakkor is, ha az ltszlag hatstalannak tnik. Pldul:volatile ticks; /* volatile int a tpus. */void interrupt timer(void) {++ticks;}void varj(int ennyit){ticks =0;while( ticks < ennyit ); } /* Ne tegyen semmit. */ A while-beli felttel kirtkelsekor a ciklus minden temben tl-

    teni kell ticks rtkt.

    Lttuk, hogy egy objektumot egsz lettartamra volatilel tehe-tnk deklarcival, de explicit tpusmdost szerkezet