Prog 1 Jegyzet

Embed Size (px)

Citation preview

  • 8/8/2019 Prog 1 Jegyzet

    1/106

    1

    Budapesti Mszaki s Gazdasgtudomnyi Egyetem

    Elektronikus Eszkzk Tanszke

    Pohl Lszl

    A programozs alapjai(szerkesztetlen vltozat, hinyos pldaanyaggal)

    Budapest, 2010

  • 8/8/2019 Prog 1 Jegyzet

    2/106

    2

    Pohl Lszl, 2010

    Minden jog fenntartva

    Az elektronikus knyv, abban a formban, ahogy van, szabadon terjeszthet. Rszletei csak abban az esetbenjelentethetk meg az eredeti knyvtl kln, ha az idzett rszletrl egyrtelmen kiderl, hogy idzet, smegfelel formban szerepel hivatkozs erre a mre.

  • 8/8/2019 Prog 1 Jegyzet

    3/106

    3

    Tartalom

    I.RSZALAPOZS..............................................................................................................................................8

    1.Aprogramozs...................................................................................................................................................8

    1.1Aszmtgpfelptse...............................................................................................................................8

    1.2Aprogramozsalapjai.................................................................................................................................8

    2.Azalgoritmusokmegadsa..............................................................................................................................10

    Teafzrobot..................................................................................................................................................10

    Gondolkodjunkegytt!....................................................................................................................................12

    3.Egyszer algoritmusokskdolsukCnyelven..............................................................................................12

    1. feladat:......................................................................................................................................................12

    2.feladat.........................................................................................................................................................13

    3.feladat.........................................................................................................................................................14

    Msodikmegolds......................................................................................................................................15

    Gondolkodjunkegytt!....................................................................................................................................16

    Oldjamegegyedl!.........................................................................................................................................17

    Azintegrltfejlesztkrnyezet....................................................................................................................17

    Programltrehozsa...................................................................................................................................17

    Fordts,futtats,hibakeress....................................................................................................................18

    4.Hogymkdikafordt?.................................................................................................................................20

    5.ACprogramokfelptse................................................................................................................................20

    5.1Aszintaxislersa......................................................................................................................................20

    5.2EgyegyszerCprogramelemei.................................................................................................................21

    6.Tpusok,vltozk,konstansok,mveletek......................................................................................................24

    6.1Msodfokegyenletgykei.......................................................................................................................24

    6.2tlag..........................................................................................................................................................25

    6.3Fordtva......................................................................................................................................................25

    Gondolkozzunkegytt!....................................................................................................................................26

    Oldjamegegyedl!.........................................................................................................................................27

    7.ACutastsai...................................................................................................................................................28

    Gondolkozzunkegytt!....................................................................................................................................32

    Oldjamegegyedl!.........................................................................................................................................32

    8.Egyszer fggvnyek.......................................................................................................................................32

  • 8/8/2019 Prog 1 Jegyzet

    4/106

    4

    Gondolkozzunkegytt!...................................................................................................................................34

    Oldjamegegyedl!.........................................................................................................................................34

    II. RSZ:ISMERKEDSACNYELVVEL...............................................................................................................35

    9.Tmbk...........................................................................................................................................................35

    Gondolkozzunkegytt!...................................................................................................................................36Oldjamegegyedl!.........................................................................................................................................36

    10.Szmbrzolssazegyszer adattpusok..................................................................................................37

    10.1.Szmbrzols.......................................................................................................................................37

    10.2.Calaptpusok.........................................................................................................................................38

    Gondolkozzunkegytt!...................................................................................................................................39

    Oldjamegegyedl!.........................................................................................................................................39

    11.Bitmveletek.................................................................................................................................................39

    Gondolkozzunkegytt!...................................................................................................................................40

    Oldjamegegyedl!.........................................................................................................................................40

    12.Bemenetskimenet,ASCII...........................................................................................................................41

    12.1AkarakterekASCIIkdja.........................................................................................................................41

    12.2getchar/putchar,gets/puts,fgets..........................................................................................................42

    12.3printfsscanf.........................................................................................................................................43

    Gondolkozzunkegytt!...................................................................................................................................44

    Oldjamegegyedl!.........................................................................................................................................44

    13.Aszmtgpekfelptsrlsmkdsrl.............................................................................................44

    14.sszetettsszrmaztatottadattpusok,tpusdefinci...............................................................................47

    14.1sszetettsszrmaztatotttpusok........................................................................................................47

    14.2Sajttpusltrehozsaatpusdefinci...............................................................................................48

    Gondolkozzunkegytt!...................................................................................................................................48

    Oldjamegegyedl!.........................................................................................................................................48

    15.Opertorok...................................................................................................................................................49

    15.1Logikairtkeksegszszmok............................................................................................................49

    15.2ACnyelvopertorai................................................................................................................................49

    Gondolkozzunkegytt!...................................................................................................................................52

    Oldjamegegyedl!.........................................................................................................................................52

    16.Pointerek......................................................................................................................................................53

    16.1Aszmtgpmemrija........................................................................................................................53

    16.

    2

    A

    pointer

    ................................................................................................................................................

    53

    16.3Pointeraritmetika....................................................................................................................................54

  • 8/8/2019 Prog 1 Jegyzet

    5/106

    5

    Gondolkozzunkegytt!....................................................................................................................................54

    Oldjamegegyedl!.........................................................................................................................................54

    17.rtkscmszerintiparamtertads;tmbk,pointereksfggvnyek..................................................55

    17.1Paramtertads.....................................................................................................................................55

    17.2Tmbktadsafggvnynek................................................................................................................5617.3Tmbspointerjra................................................................................................................................57

    17.4Pointertmb.............................................................................................................................................57

    Gondolkozzunkegytt!....................................................................................................................................58

    Oldjamegegyedl!.........................................................................................................................................58

    18.Dinamikusmemriakezels...........................................................................................................................58

    18.1sizeof........................................................................................................................................................59

    18.2Tbbdimenzisdinamikustmb..............................................................................................................59

    18.3Alefoglaltmemriabvtse...................................................................................................................60

    Gondolkozzunkegytt!....................................................................................................................................61

    Oldjamegegyedl!.........................................................................................................................................61

    19.Sztringek........................................................................................................................................................61

    19.1Knyvtrisztringfggvnyek...................................................................................................................61

    19.2Algoritmusok...........................................................................................................................................63

    Gondolkozzunkegytt!....................................................................................................................................64

    Oldjamegegyedl!.........................................................................................................................................64

    20.Aprogramozsmenete.................................................................................................................................64

    20.1Programstruktratervezse....................................................................................................................65

    20.2Algoritmusmegadsa..............................................................................................................................65

    21.sszetettebbCprogramokkellkei...............................................................................................................66

    21.1Tbbmodulblllprogramok...............................................................................................................66

    21.2ACprogramokltalnosfelptse........................................................................................................67

    21.3Lthatsg,trolsiosztlyok.................................................................................................................67

    Gondolkozzunkegytt!....................................................................................................................................68

    Oldjamegegyedl!.........................................................................................................................................68

    22.Aparancssor..................................................................................................................................................69

    Gondolkozzunkegytt!....................................................................................................................................69

    Oldjamegegyedl!.........................................................................................................................................69

    23.Fjlkezels......................................................................................................................................................70

    23.1

    Binris

    fjlok

    ............................................................................................................................................

    70

    23.2Szvegesfjlok........................................................................................................................................71

  • 8/8/2019 Prog 1 Jegyzet

    6/106

    6

    23.3Szvegesfjloksbinrisfjloksszevetse..........................................................................................73

    23.4Szabvnyosbemenetskimenet............................................................................................................73

    Gondolkozzunkegytt!...................................................................................................................................73

    Oldjamegegyedl!.........................................................................................................................................73

    III.RSZ:HALADPROGRAMOZS..................................................................................................................7424.Dinamikusnhivatkozadatszerkezetek1.lncoltlistk.........................................................................74

    24.1Egyszerlncoltlista..............................................................................................................................74

    14.2Lncoltlistastrzsval,fggvnyekkel,beszrssal..............................................................................75

    24.3Ktirnybanlncoltlista........................................................................................................................76

    24.3Fsslista................................................................................................................................................77

    Gondolkozzunkegytt!...................................................................................................................................77

    Oldjamegegyedl!.........................................................................................................................................77

    25.llapotgp(vgesautomata).......................................................................................................................78

    25.1Kommentszr........................................................................................................................................78

    Gondolkozzunkegytt!...................................................................................................................................79

    Oldjamegegyedl!.........................................................................................................................................79

    26.Rekurzi........................................................................................................................................................79

    26.1Averemadatszerkezet............................................................................................................................79

    26.2Fggvnyhvs........................................................................................................................................80

    26.3Rekurzi..................................................................................................................................................81

    Gondolkozzunkegytt!...................................................................................................................................82

    Oldjamegegyedl!.........................................................................................................................................82

    27.Dinamikusnhivatkozadatszerkezetek2.fk.........................................................................................83

    27.1Binrisfa.................................................................................................................................................83

    27.2Rendezettfarendezfa,kiegyenslyozottsgskiegyenslyozatlansg............................................84

    27.3Afabejrstpusai..................................................................................................................................85

    27.4Tbbgfk...........................................................................................................................................85

    27.5Ktplda.................................................................................................................................................85

    Gondolkozzunkegytt!...................................................................................................................................86

    Oldjamegegyedl!.........................................................................................................................................86

    28.Fggvnypointer...........................................................................................................................................86

    Gondolkozzunkegytt!...................................................................................................................................87

    Oldjamegegyedl!.........................................................................................................................................87

    29.

    Keress

    tmbben

    ..........................................................................................................................................

    88

    Gondolkozzunkegytt!...................................................................................................................................88

  • 8/8/2019 Prog 1 Jegyzet

    7/106

    7

    Oldjamegegyedl!.........................................................................................................................................88

    30.Rendezs........................................................................................................................................................89

    30.1Buborkalgoritmus.................................................................................................................................89

    30.2Kzvetlenkivlasztsosrendezs............................................................................................................90

    30.3Sllyesztrendezs..................................................................................................................................9030.4Kzvetlenbeszrrendezs.....................................................................................................................91

    30.5Shellrendezs..........................................................................................................................................91

    30.6Gyorsrendezs.........................................................................................................................................92

    30.7Szabvnyosknyvtrigyorsrendezfggvny:aqsort...........................................................................92

    30.8Lncoltlistarendezsegyorsrendezalgoritmussal...............................................................................93

    Gondolkozzunkegytt!....................................................................................................................................93

    Oldjamegegyedl!.........................................................................................................................................93

    31.Preprocesszor................................................................................................................................................94

    Gondolkozzunkegytt!....................................................................................................................................95

    Oldjamegegyedl!.........................................................................................................................................95

    32.Bitmezk,union.............................................................................................................................................95

    32.1Struktrabitmezi...................................................................................................................................95

    32.2Union.......................................................................................................................................................95

    Gondolkozzunkegytt!....................................................................................................................................96

    Oldjamegegyedl!.........................................................................................................................................96

    33.Vltozparamterlistjfggvnyek............................................................................................................97

    Gondolkozzunkegytt!....................................................................................................................................97

    Oldjamegegyedl!.........................................................................................................................................97

    34.HasznosfggvnyekaCben.........................................................................................................................98

    Gondolkozzunkegytt!....................................................................................................................................98

    Oldjamegegyedl!.........................................................................................................................................98

    35.Programozsirdekessgek..........................................................................................................................99

    35.1Programozstbbszlon........................................................................................................................99

    Trgymutat......................................................................................................................................................101

  • 8/8/2019 Prog 1 Jegyzet

    8/106

    8

    I. RSZ ALAPOZS1.Aprogramozs

    1.1

    A

    szmtgp

    felptse

    A szmtgpek f rszegysgei a processzor, a memria s a perifrik. A memria ltalnos trol, mely utastsokat sadatokat tartalmaz. A processzor beolvassa a memribl azutastsokat s az adatokat, az utastsok alapjn mveleteketvgez, a mveletek eredmnyt pedig visszarja a memriba,valamint vezrli a perifrikat: adatokat kld szmukra s ada-tokat olvas be onnan.

    A memria olyan, mint egy nagyon hossz tblzat, melynekminden celljban egy szm van, ami csak 0 vagy 1 lehet:

    0 1 1 1 0 0 1 0 0 0 1 0 0 1 1Azrt csak 0 s 1, mert a szmtgpekkettes szmrendszert

    hasznlnak, s a kettes szmrendszerben csak ez a kt szmjegyvan. Azrt kettes szmrendszert hasznlnak, s nem pl. tzest,mert gy egy kapcsol elg a szm trolshoz: ha a kapcsol bevan kapcsolva, az 1, ha ki van kapcsolva, az 0. Tzes szmrend-szerben tz klnbz llapotot kellene megklnbztetni, amisokkal nehezebb, mint kett. Sokkal egyszer bb megllaptani,hogy egy lmpa vilgt-e vagy sem, mint azt, hogy milyen ersenvilgt egy tzfokozat skln.

    A kettes (azaz binris) szmrendszer szmjegyeit angolulbinary digitnek, rviden bitnek nevezzk.

    Ahhoz, hogy a memrit hatkonyan lehessen hasznlni, a benne trolt informcikhoz tetszleges sorrendben hozz kell,hogy tudjunk frni (a msik lehetsg a sorban egyms utnlenne). Az informcik tetszleges sorrend elrse a memri-

    ban (Random Access Memory RAM) gy valsthat meglegegyszer bben, ha minden bitrl tudjuk, hanyadik a memriakezdettl szmtva, s ez alapjn hivatkozunk r.

    Egy bit nagyon kevs informcit trol, ezrt a szmtgpektervezi gy dntttek, hogy nem engedik meg minden bit cmz-st, hanem csak bitcsoportokt, amit bjtnak neveznk, mert gyegyszer bb az ramkrk felptse. A szmtgpekben tehtgy vlasztjuk ki a neknk kell adatot vagy utastst, hogymegmondjuk, hanyadik bjt a memria kezdettl szmtva. Ezt asorszmot memriacmnek nevezzk.

    Egy bjt mrett gy vlasztottk meg, hogy egy karakter(azaz bet, szmjegy, rsjegy, stb.) belefrjen. Sokfle bjtmre-tet hasznltak: 6, 7, 8, 9 bites bjtok is lteztek. Ezek kzl ma-napsg a 8 bites bjt szinte egyeduralkod. A knyvben ismerte-tett C nyelv szabvnya elrja, hogy csak olyan rendszerbenhasznlhat a C nyelv, ahol egy bjt legalbb 8 bites, azonbanfutnak C programok pl. 9 bites bjtokat hasznl rendszerekbenis, ezt ksbb se feledjk!

    Egy nyolcbites bjt a kvetkez szmokat trolhatja:00000000=0, 00000001=1, 00000010=2, 00000011=3,00000100=4, 00000101=5, , 11111111=255. Azaz sszesen256 fle rtknk van (28), 0-tl 255-ig. A bjtunkat azonbanrtelmezhetjk mskpp is, pldul ha azt mondjuk, hogy az els

    bit nem szmjegy, hanem el jel: ha 0, akkor pozitv szm, ha 1,akkor negatv szm. gy azonban csak 7 bitnk marad a szmra,azaz 0-tl 127-ig tudunk szmot trolni az eljelen kvli rszen.Ha 0255 kztti szmnak tekintjk a bjtot, akkor eljel nl-

    kli egsz szmrl beszlnk, ha pedig -127 s +127 kzttiszmnak, akkor eljeles egsz szmrl. A valsgban ltalbanettl eltr az eljeles szmok trolsa, -128 s +127 kztti rt-kek vannak az el jeles bjtban, mert nem szksges 0, s anegatv szmok nem csak az eljelben klnbznek. Az egszek,s a tbbi tpus szmbrzolsi krdseivel ks bb rszletesenfoglalkozunk. Most elg annyit tudnunk, hogy a szmtgpmindent bjtokban trol, legyen az egsz szm, vals szm vagyszveg.

    A processzor bekapcsols utn beolvassa a memria elejnlv utastst. Ez ltalban egy ugr utasts, amely azt mondjameg, hogy hol tallja a kvetkez utastst a memriban, amitvgre kell hajtania.

    A szmtgp elemi utastsai nagyon egyszerek azrt, hogyaz ket megvalst ramkrk minl egyszer bbek, s ezltalminl gyorsabbak lehessenek. Ha bonyolultabb utastst akarunkadni a szmtgpnek, azt elemi utastsokbl ptjk fel. Elemi

    utasts az az utasts, amit a szmtgp processzora kzvetle-nl vgrehajt, teht mr nem bontjuk kisebb utastsokra.

    Ktfle elemi utasts ltezik: ugr utasts s nem ugr utas-ts. A nem ugr utastsokat a processzor sorban egyms utn,azaz szekvencilisan hajtja vgre. A nem ugr utastsok pl. azelemi matematikai mveletek: sszeads, kivons, szorzs, osz-ts, maradkkpzs, negls (=ellenttes eljelre alakts). Van-nak sszehasonlt utastsok (, egyenl, nem egyenl, stb.),logikai utastsok (S, VAGY, NEM), adatmozgat utastsok,

    bitmveletek, stb.A processzor az adatokat beolvassa a memribl, vgrehajt-

    ja rajtuk az utasts(ok) ltal elrt mveletet, majd az eredmnytvisszarja a memriba.

    Mivel a memriban csak egsz szmokat tudunk trolni, az

    elemi utastsokat is szmknt troljuk: minden utastshoz tarto-zik egy szm, ez az utasts gpi kd ja. Egy utasts ltalbantbb bjt hosszsg.

    A processzor tud adatokat fogadni a perifrikrl, s tud ada-tot kldeni a perifriknak.

    A perifrik kzl szmunkra mindssze hrom lesz lnye-ges: a billentyzet, a kperny s a httrtr. A kpernyre nemfogunk rajzolni, csak szveget runk ki.

    1.2Aprogramozsalapjai

    Az 1.1 pontban bepillantottunk a szmtgpek felptsneks mkdsnek alapjaiba, alacsony szint dolgokkal foglalkoz-

    tunk. Az 1. fejezet htralv rszben ellenkez irnybl kzel-tnk, s sok fontos alapfogalmat fogunk ttekinteni.

    Defincik Az albbi defincikat megjegyezni nem kell. Arravalk, hogy ha bizonytalanok vagyunk valamiben, visszalapo-zunk.

    Programozs: szmtgp-algoritmusok s adatszerkezetekmegtervezse s megvalstsuk valamely programozsi nyelven.

    Algoritmus: Valamely problma megoldsra alkalmas v-ges szm cselekvssor, amelyet vges szm alkalommal me-chanikusan megismtelve a problma megoldst kapjuk.

    Adatszerkezet: az adatelemek egy olyan vges halmaza,amelyben az adatelemek kztt szerkezeti sszefggsek vannak.Az adatelem az a legkisebb adategysg, amelyre hivatkozni lehet.

    Programozsi nyelv: a szmtstechnikban hasznlt olyan,az ember ltal olvashat s rtelmezhet utastsok sorozata,amivel kzvetlenl, vagy kzvetve (pldul: gpi kdra fordts

    Memria Processzor Perifrik

  • 8/8/2019 Prog 1 Jegyzet

    9/106

    9

    utn) kzlhetjk a szmtgppel egy adott feladat elvgzsnekmdjt.

    Magyarzatok Az algoritmus defincijban ktszer is szere- pel a vges sz. A cselekvsek szmnak vgesnek kell lennie,mert vgtelen utastst nem tudunk lerni. Vges szm ismtls:ez ltalban egyet jelent, de ha tbbszr ismtlnk, akkor is vgessokszor, klnben id ben vgtelen ideig tartana a mvelet. Me-

    chanikus: azt jelenti, hogy gondolkods nlkl, vagyis egy gp isvgre tudja hajtani.Adatszerkezet esetben szerkezeti sszefggs pl. hogy egy

    szvegben a betket sorban, egyms mellett troljuk.A programozsi nyelv az ember szmra ttekinthet form-

    ban trtn programrst tesz lehetv, ebbl a fordtprogramkszt a gp szmra rthet gpi kdot.

    Mint ltjuk, az algoritmus egy ltalnos fogalom, nem kt-dik a szmtgpekhez. Pldul, ha vesznk egy lapra szereltknyvespolcot, ltalban van a dobozban egy paprlap, rajtabrkkal, melyek az sszeszerels folyamatt, azaz az sszeszere-ls algoritmust mutatjk.

    A szmtgpprogramok adatokat (informcikat) kezelnek,dolgoznak fel. A legegyszer bb (valamire hasznlhat) programis kezel adatokat. Ha ki akarjuk rni a szmokat 1-tl 10-ig, akkor

    tudnunk kell, ppen mennyinl tartunk, ez adat. Ha csak ki aka-runk rni egy szveget, mr ott is adatot kezelnk, mert a szvegmaga is adat. ltalban a programok komoly mennyisg adatotkezelnek. Akkor lesz hatkony a program mkdse, ha az ada-tokat olyan mdon troljuk, ahogy az a legkedvezbb, azaz meg-felel adatszerkezete(ke)t vlasztunk.

    Program = algoritmus + adatszerkezet.Kdols: az algoritmus s az adatszerkezet megvalstsa va-

    lamely programnyelven.

    A programozs alapjainak elsajttsa a kvetkez dol-gokat jelenti:

    Megismernk sok fontos alapvet algoritmust, pldulilyen a prmkeress, kivlaszts, keressek, rendezsek,

    adatszerkezet-kezelsi algoritmusok, szvegfeldolgo-zs, rekurzv algoritmusok, vges automata.

    Megismernk nhny adatszerkezetet, pldul tmb,struktra, fjl, lncolt listk, fk.

    Megtanulunk kdolni szabvnyos C nyelven. Megismerjk a szmtgpek mkdsnek alapjait.

    A C nyelv sok korszer programnyelv alapja. Sok ms nyelv-hez kpest kevs nyelvi elembl pl fel, ezrt viszonylag kny-ny megtanulni. Hatkony strukturlt programok rst teszilehetv. Tkletesen alkalmas arra, hogy segtsgvel megtanul-

    juk az algoritmusok s adatszerkezetek gyakorlati megvalstst.

    A C nyelvet az 1970-es vekben fejlesztettk ki, amikor a

    kperny

    nem volt a szmtgpek nlklzhetetlen rsze. Aszabvnyos C nyelv fggvnyknyvtra csak olyan megjelentfggvnyeket tartalmaz, amelyek szveges nyomtatn is mkd-nek. C-ben nem tudunk rajzolni, de mg a kpernyn pozcionlnisem, csak kls, nem szabvnyos fggvnyknyvtrak segtsg-vel, melyek nem kpezik a tananyag rszt. Felmerlhet a krds,hogy mirt nem egy korszer, ablakoz grafikt tmogat prog-ramnyelvet tanulunk? Azrt, mert ez csak eltereln a figyelmn-ket a lnyegrl: az algoritmusokrl s az adatszerkezetekrl. Nefeledjk:

    programozs != kdols

    Azaz a programozs nem egyenl a kdolssal. (A C nyelv-ben a nem egyenlt !=-knt rjuk, mert nincs thzott egyenlsg- jel a billentyzeten.) Aki tud kdolni C-ben vagy ms nyelven,mg nem tud programozni. Az fog tudni j programokat kszte-ni, aki biztos alaptudssal rendelkezik.

    Ahogy emltettk, a C nyelv nagy elnye, hogy sok program-nyelv alapja (pl. Java, C#, de pl. a php is sokat tvett belle), tehtaz itt megszerzett tudst jl lehet hasznlni a ksbbiekben.

    Eredetileg a UNIX opercis rendszer elksztshez fejlesz-tettk ki, a f cl a hatkonysg, a minl tmrebben megrhat programkd volt. Mivel nem oktatsi clra fejlesztettk ki, nemvolt cl az, hogy a nyelv egyes rszeit egymsra plve lehessenelsajttani. Tbbszr lesz olyan az anyagban, hogy elszr vala-mit nem magyarzunk meg, egyszeren csak elfogadjuk, hogy ezgy van, s ksbb ltjuk majd, hogy mirt.

    A programozs menete

    Specifikci: a program feladatnak, bemeneti s kimenetiadatainak megadsa. Ebben a knyvben sok ilyet tallunk: amegoldand feladatok szvege specifikci. (Pl. rjon C progra-mot, amely)

    Tervezs: a feladat, azaz a specifikci ismeretben vlaszt- juk ki a programnyelvet (senki sem szerkesztene weblapot C-ben), az algoritmusokat s az adatszerkezeteket.

    Kdols: A kivlasztott nyelven megvalstjuk a megterve-zett algoritmusokat s adatszerkezeteket. Ez rszben egyszerretrtnik a tervezssel, azaz bizonyos algoritmikus ill. adatszerke-zeti krdsekben a kdols kzben dntnk.

    Tesztels, hibajavts: Senki sem r hibtlan kdot, azazmindig van mit javtani. A hibknak kt csoportja van: szintakti-kai (formai) s szemantikai (tartalmi) hibk.

    Szintaktikai hiba a formai szablyok megsrtse. Valamitrosszul gpelnk, lemarad egy zrjel, stb. Br a kezd progra-moznak sok bosszssgot okoznak a szintaktikai hibk, ezekkelknny elbnni, mert a fordtprogram jelzi, hol tallhatk.

    Szemantikai hiba esetn a fordtprogram nem tall hibt,mert a program formailag j, csak nem azt csinlja, amit szeret-

    nnk, hanem azt, amire utastottuk. Szemantikai hibra j plda akzismert vicc:

    - Doktor r, krem, herljen ki engem!- Egszen biztos benne, hogy ezt akarja?- Igen!- Ksz van. De most mr rulja el, mirt akarta?- Tudja, zsid lnyt szeretnk felesgl venni, s krte, hogy

    herltessem ki magam.- Vletlenl nem krlmetlst mondott a menyasszonya?- , de igen. Ez a pontos kifejezs!Itt teht a pciens szintaktikailag helyes algoritmust adott a

    doktornak, aki pontosan vgrehajtotta, amire utastst kapott, csaka pciens nem ezt szerette volna.

    Egy program esetben nagyon fontos, hogy kiszrjk a sze-mantikai hibkat, mieltt azt valaki lesben hasznln. Ha nemteszteljk megfelelen, nem is fogunk tudni arrl, hogy hibs.

    Specifikci

    Tervezs

    Algoritmusvlasztsa

    Adatszerkezetekmegvlasztsa

    Nyelvmegvlasztsa

    Kdols

    Tesztels,hibajavts

    Dokumentcielksztse

  • 8/8/2019 Prog 1 Jegyzet

    10/106

    10

    A dokumentls clja, hogy segtsk a program megrtst.Szlhat a felhasznlnak (hasznlati utasts), s szlhat a fejlesz-tnek. A fejleszti dokumentci tartalmazza az adatszerkezeteks algoritmusok, fjlformtumok lerst, valamint a tesztelsnlhasznlt adatokat. Legfontosabb eleme a program megjegyzsek-kel elltott forrskdja.

    2.Azalgoritmusokmegadsa

    Algoritmusok megadsra a programtervezs illetve doku-mentls sorn van szksg. Alapveten kt mdon adhatunkmeg algoritmusokat: szvegesen s grafikusan. Kt-kt megadsimdrl ejtnk pr szt.

    Szveges megads: pszeudokd, programkd.

    Grafikus megads: folyamatbra, struktogram.A programkd s a pszeudokd hasonlt egymsra, errehamarosan tbb pldt is ltunk. F klnbsg, hogy a program-kd megrtshez ismerni kell az adott nyelv szablyait, mg a

    pszeudokd igyekszik minden programoz szmra rthet lenni.A pszeudokd vonatkozsban nincsenek ktelez szabvnyok.

    A folyamatbra s a struktogram viszonya hasonl a pszeudokd s a programkd viszonyhoz olyan rtelemben,hogy a struktogram rtelmezse s elksztse ignyel nmi

    programozi tapasztalatot, mg a folyamatbra mindenki szmrarthet. A folyamatbra htrnya, hogy nagyon knny veleolyan algoritmust alkotni, ami nem alakthat kzvetlenl struk-turlt programkdd, mg a struktogrammal lert algoritmusokmindig strukturltak.

    Teafzrobot

    Nzznk meg egy pldt egy feladat algoritmizlsra! Vanegy robotunk, akit szeretnnk arra utastani, hogy fzzn tet.Hogyan utastjuk a feladatra?

    1. vltozat:

    Fzz tet!

    Ha van olyan utastsa, hogy Fzz tet!, akkor semmiegyb teendnk nincs, mint kiadni ezt az utastst. Ha nincs ilyenutasts, akkor meg kell magyarznunk neki, mit is vrunk el tle.

    2. vltozat:

    Fzztet!parancs:Tltsvizetakannba!Kapcsoldbeatzhelyet!Teddrakannt!Amgnemforr

    Vrjegypercet!Dobdbeleateatojst!Veddleatzrl!Hakellcukor

    Teddbele!Egybknt

    HakellmzTeddbele!

    Tltsdcsszbe!VGE.

    Ez a teafzs algoritmusnak pszeudokdja. Amit beljebbkezdnk, az a kvl kezdd rszhez tartozik (azaz egy blokkbanvannak). Ebben a pszeudokdban megjelenik a strukturltprogramozs mindhromalkoteleme:

    Ahol egy oszlopban kezddnek az egymst kvetutastsok, az a szekvencia.

    Az amg kezdet utastsblokk egy ciklus, msnven iterci. A ciklus magjban lv utastsvagy utastsok addig ismtldnek, amg az amgutn ll felttel igaz

    Feltteles elgazs a ha kezdet utastsblokk.

    Ha a ha utni llts igaz, akkor vgrehajtdik afelttel magjban lv utasts vagy utastsok. Afeltteles elgazsnak lehet (de nem ktelez) egy

  • 8/8/2019 Prog 1 Jegyzet

    11/106

    11

    egybknt ga is, ami akkor hajtdik vgre, ha aha utni llts hamis.

    A fenti algoritmust folyamatbrval is megadhatjuk:

    A folyamatbrn jl ltszik a ciklus s az elgazs kztti k-lnbsg: ciklus esetn visszaugrunk, elgazsnl pedig elrehaladunk.

    Knnyen tudunk a folyamatbrba olyan nyilakat, azaz ugr-

    sokat rajzolni, amelyeket a pszeudokdban, a tanult strukturltelemekkel nem tudnnk megvalstani. Prbljuk ki!

    Megnztk a formt, beszljnk a tartalomrl! Ha vgignziaz algoritmust, valsznleg felvetdik nben, hogy nem n nemgy fzne tet. Mirt nem filtert hasznlunk? Mirt a kannbatesszk a cukrot vagy a mzet s nem a csszbe? Stb. A specifi-kci nem rgztette ezeket a rszleteket. Egszen pontosansemmit sem rgztett, csak azt, hogy a robot fzzn tet. Ezalapjn akr minden zests elhagyhat lett volna, vagy tovbbi-akkal lehetne kiegszteni. Az algoritmus kszt je hozta meg adntseket gy, ahogy neki tetszett.

    ltalban is elmondhat, hogy a programoz dnt rengetegalgoritmikus krdsben, a specifikci ltalban nem ad vlaszt

    minden krdsre. Szksg esetn konzultlhatunk is a megbz-val, hogy mik az elvrsai.

    Tovbbi problma, hogy mirt ezekre a rszekre bontottuk?Ez a felbonts akkor j, ha a robot ismeri az sszes benne szerep-l utastst. Ha nem ismeri, tovbb kell bontanunk az algoritmustegszen addig, amg olyan utastsokhoz nem rnk, amit a robotis ismer. A robot ltal ismert utastsokat elemi utastsoknaknevezzk, ezekbl lehet bonyolultabb programokat kszteni.

    Tegyk fel, hogy a robotunk nem ismeri a 2. vltozat utast-sainak egy rszt! Ha ezeket felbontjuk, akkor az algoritmus

    ttekinthetetlenn vlik, tl hossz lesz. Mgis muszj felbontaniaz utastsokat, klnben a robot nem fogja rteni, mit akarunktle. Van erre is megolds: a 2. vltozatot gy hagyjuk, s a bennetallhat sszetett utastsok sztbontst kln brzoljuk.Pldul a Tlts vizet a kannba! gy nzhet ki:

    Tltsvizetakannba!parancs:Menjacsaphoz!Teddalakannt!Nyisdmegacsapot!Amgnincstele

    Vrjegymsodpercet!Zrdelacsapot!

    VGE.

    Ennek a klnvlasztsnak ms elnye is van: ha tbbszr isszksg van ugyanarra a funkcira, akkor mindig csak a nevtkell lernunk, a robot mr tudni fogja, hogy mit kell tennie. Avaldi strukturlt programok nagyon fontos tulajdonsga, hogygy klnvlaszthatk a funkcik. Az angol function kifejezsfunkciknt is fordthat, azonban a magyar nyelvben a fggvnyvltozata terjedt el. Hasznlatos mg az eljrs1, vagy szubrutinelnevezs is. A C nyelv a fggvny kifejezst hasznlja, s ltnifogjuk, hogy a matematikai fggvnyek is valban megadhatkilyen formban.

    Nem biztos, hogy azonnal esznkbe jut, de a fenti algoritmustelemezve gondot jelenthet, ha pl. nincs vz, vagy, mondjuk, nemlehet megnyitni a csapot. Egy program rsa sorn fel kell kszl-ni a vratlan helyzetekre, s a problmkat kezelni kell. Ezt hi-bakezelsnek, vagy kivtelkezelsnek nevezzk. A fenti esetben

    pl. a kvetkezkppen jrhatunk el:

    Tltsvizetakannba!parancs:Menjacsaphoz!Teddalakannt!Hamegnyithatacsap

    Nyisdmegacsapot!Egybknt

    Monddelafnknekaproblmt!Fejezdbeaprogramot!

    AmgnincsteleHavanvz

    Vrjegy

    msodpercet!

    EgybkntMonddelafnknekaproblmt!Fejezdbeaprogramot!

    Zrdelacsapot!VGE.

    A folyamatbra ksztshez szksges ismeretekkel, vala-mint a struktogrammal a 20. fejezetben foglalkozunk.

    1Azeljrs(procedure)kifejezstolyanesetbenhasznljk,hanincs

    visszatrsirtk.EzaCbenavoidtpusfggvny.

    Tltsvizetakannba!

    Kapcsoldbeatzhelyt!

    Teddrakannt!

    Kellmg

    melegteni?

    START

    Vrjegypercet!

    Dobdbeleateatojst!

    Veddleatzrl!

    Cukorkell?Teddbele!

    Tltsdcsszbe!

    STOP

    I

    N

    I

    N

    Mzkell?

    Teddbele!

    N

    I

  • 8/8/2019 Prog 1 Jegyzet

    12/106

    12

    Gondolkodjunkegytt!

    G2.1 Adjunk algoritmust a robotunknak rntottaksztshez!brzoljuk az algoritmust folyamatbrval is! Vlasszunk egyutastst, amelyet kln funkciknt (fggvnyknt) tovbbon-tunk! Egsztsk ki az algoritmust hibakezelssel!

    G2.2 A kalauz nem tudja kezelni a jegyeket a vonaton, mert aneki adott utastsok sszekeveredtek. Segtsen neki, s rja bea pszeudokd soraiba a magfelel utasts bet jelt! Mindensorba csak egy bet kerlhet, s minden bet csak egyszerhasznlhat. Minden bett fel kell hasznlnia!

    a)Hanincsbrletb)Lyukaszd!c)VGE.d)Szlljtakvetkez kocsiba!e)Amgvankezeletlenutasf)Krdajegyetvagyabrletet!g)Adjptdjcsekket!h)Hanemrtaszerelvnyvgre

    i)Havanjegyj)Amgnemraszerelvnyvgrek)Menjakvetkez utashoz!l)Egybknt

    ____________

    __________________

    ____________

    ____________

    __________________

    G2.3 Rajzolja fl a kvetkez algoritmus folyamatbrjt!

    G2.4 A kvetkez folyamatbra alapjn rja fl az algoritmuspszeudokdjt!

    stb.

    3.Egyszer algoritmusokskdolsukCnyelven

    1.feladat:

    rjuk ki a szmokat a kpernyre 1-tl 10-ig!

    A megolds algoritmusa a kvetkezkpp nzhet ki:

    Szmkirprogram:Jegyezdmeg,hogyazaktulisszmunk1!Amgaszmkisebbvagyegyenl,mint10

    rdkiaszmot!Nveldmegaszmoteggyel!

    VGE.

    Ez gy jnak tnik, de ha a robotunk vgrehajtan, nem aztkapnnk, amit szeretnnk:

    Eredmny: 12345678910Azaz kifelejtettk a szkzt a szmok kzl. Programrsnl

    a legaprbb rszletekre is figyelni kell, mert imperatv progra-mozsi nyelvet hasznlunk, azaz a szmtgp azt, s csak azthajtja vgre, amire utastjuk, s pontosan gy, ahogy erreutastjuk.

    Vannak deklaratv nyelvek is, ahol csak azt kell megmondani, mitszeretnnk, a hogyanrl a program dnt. Ezek a nyelvek nem hasznlha-tk ltalnosan, csak specilis feladatokra.

    A kiegsztett algoritmus a kvetkez:

    Szmkirprogram2:Jegyezdmeg,hogyazaktulisszmunk1! (1)Amgaszmkisebbvagyegyenl,mint10 (2)

    rdkiaszmot! (3)rjkiegyszkzt! (4)

    Nveldmegaszmoteggyel! (5)VGE.

    Figyeljk meg, hogy ez az algoritmus az utoljra kirt 10-esutn is tesz egy szkzt. Ez ltalban nem problma. Ha mgis,mdostani kell az algoritmust.

    Egsztse ki a programot gy, hogy az utoljra kirt szm utnmr ne rjon szkzt!

    Gyakori, hogy az algoritmus-megadsnl, az els program-vltozathoz hasonlan, nem jelezzk azokat a magtl rtetdlpseket, amelyeket egybknt a programkdba belerunk.

    A szmkir algoritmusban van egy szm, aminek kezdetbenegy az rtke, s folyamatosan vltozik, a ciklus minden lps-

    ben eggyel n. Az olyan adatot, amelyet meg lehet vltoztatni,vltoznak nevettk. Az olyan adatot, amelynek rtke nemvltoztathat meg, konstansnak nevezzk. A fenti pldbankonstans az 1 s a 10. Az adat olyan informci, melyet a szm-tgp trol. Az informci a valsg lekpezse.

    A fenti algoritmus Pascal nyelven gy nz ki:

    program szamkiiro (input,output);var

    szam : integer; (a)begin

    a := 1; (1)while i

  • 8/8/2019 Prog 1 Jegyzet

    13/106

    13

    Ugyanez C nyelven:

    #include int main(void){

    int i; (a)i = 1; (1)while( i

  • 8/8/2019 Prog 1 Jegyzet

    14/106

    14

    2.

    #include int main(void){

    int i = 1;while( i

  • 8/8/2019 Prog 1 Jegyzet

    15/106

    15

    A zrjelben ll kt felttel kz az && opertor kerlt, en-nek neve logikai S kapcsolat. Az S mvelet eredmnye akkorIGAZ, ha mindkt felttel IGAZ, brmelyik is HAMIS, az ered-mny HAMIS.

    A kt megismert logikai mvelet igazsgtblja a kvetkez:

    A !A

    HAMIS IGAZ

    IGAZ HAMIS

    A B A&&B

    HAMIS HAMIS HAMIS

    IGAZ HAMIS HAMIS

    HAMIS IGAZ HAMIS

    IGAZ IGAZ IGAZ

    A szam1%oszto==0 && szam2%oszto==0 kifejezstszban gy mondhatjuk: szam1 oszthat osztval, s szam2 isoszthat osztval. A htkznapi beszdben eztmondhatnnk: szam1 s szam2 is oszthat oszt-

    val, azonban ha programot runk, nem rhatjuk gy:szam1 && szam2%oszto==0!

    A C nyelvben sszesen hrom logikai mvelet van: a NEM,valamint S mellett a harmadik a logikai VAGY kapcsolat. Alogikai VAGY kapcsolatot C-ben || opertor jelli. Ez kt fgg-leges vonal, mely magyar billentyzeten a W+Alt Gr kombinci-val rhet el (gyakran gy brzoljk: ). Ennek igazsgtblja akvetkez:

    A B A||B

    HAMIS HAMIS HAMIS

    IGAZ HAMIS IGAZ

    HAMIS IGAZ IGAZ

    IGAZ IGAZ IGAZ

    A VAGY kapcsolat akkor ad igazat, ha brmelyik, de akrmindkt llts igaz. Csak akkor hamis, ha mindkt llts hamis.Figyelem, a htkznapi letben mskpp hasznl-

    juk a vagy szt, pl. almt vagy krtt fogokenni: ez azt jelenti, hogy vagy egyiket, vagy msi-kat, de nem mindkettt. A logikai VAGY kapcso-lat viszont mindkettt is megengedi. A szmts-technika azt a vagy kapcsolatot, amikor a kt lltsbl pontosanegy IGAZ, akkor IGAZ az eredmny, KIZR VAGY kapcso-latnak nevezi. A C nyelvben nincs ilyen logikai mvelet, detallkozni fogunk vele a bitmveleteknl.

    A VAGY mvelet felrhat S s NEM mveletek segtsg-vel, az S pedig felrhat VAGY s NEM mveletek segts-gvel. Ezek a De Morgan azonossgok:A||B !( !(A) && !(B) ),A&&B !( !(A) || !(B) ).Igazolja igazsgtbla felrsval!

    A while ciklus felttelt gy is rhattuk volna:while( szam1%oszto!=0 || szam2%oszto!=0 )Gondolja t, mirt!

    A C-ben a mveleti jelek s a vltozk kz szabad szkzttenni, de ez nem ktelez. Az a cl, hogy a programkd minl

    jobban rthet legyen az ember szmra, a fordtprogram gy is-

    gy is megrti. A C nyelv a szkzt, tabultort, jsor jelet(ENTER), s ms, kevsb hasznlt nem lthat karaktereketegyformn kezeli: brmelyikbl brmennyi rhat oda, ahov

    rhat egy. Ezeket a karaktereket sszefoglal nven whitespacekaraktereknek nevezzk. Ennek rtelmben az if utasts blokkjagy is rhat pl.: {oszto=szam1;}. Azrt rtuk gy, ahogy,hogy jobban hasonltson a pszeudokdra.

    Javthatjuk az algoritmus hatkonysgt, ha elszr megnz-zk, hogy a kisebbik szm lehet-e a LNKO, s ha nem, a vizs-glatot a kisebbik szm feltl folytatjuk. (A LNKO osztja akisebbik szmnak is, azaz lehet szm, szm/2, szm/3,szm/4,, s legrosszabb esetben szm/szm=1.) Dolgozza ta fenti algoritmust ennek figyelembevtelvel, s ksztse el akdot C nyelven!

    LNKO1programmrtartalmazottnmimegfontolst:fellrllefelindultunkel.Lehetneennlbutbbmdszerreliskeresni a LNKOt. Induljunk 1tl, s menjnk a kisebbik szmigegyesvel!Mindenlpsbenellenrizzk,hogymindktszmkzsosztjrlvanesz,sha igen,jegyezzkmegazosztt!Akisebbikszmelrsekorazutoljramegjegyzettoszta LNKO. rja meg az algoritmus pszeudokdjt s C nyelvmegvalstst!

    A while s if utastsok esetben, ha az utasts magja egyet-len utastst tartalmaz, a kapcsos zrjel elhagyhat, emiatt afenti program rvidebben is rhat:

    #include int main(void){

    int szam1,szam2,oszto;printf("Adj meg 2 poz. egeszt: ");scanf("%d%d",&szam1,&szam2);if(szam1

  • 8/8/2019 Prog 1 Jegyzet

    16/106

    16

    2mrcsakazegyiknekosztja

    10 15 2 23

    3 csak az egyiknekosztja

    10 15 2 34

    4 nem osztja egyikneksem

    10 15 2 45

    5mindkettnekosztja

    102 153 210 5

    5>2, ami a kisebbikszm

    2 3 10kirjuk

    5

    A fenti algoritmus pszeudokdja a kvetkez lesz:

    LNKO2program:lnko=1,oszt=2Krjbektpozitvegszszmot!Haamsodikkisebb,mintazels

    Cserldfelaktszmot!Amgazels szmnagyobbvagyegyenl azosztval

    AmgmindktszmoszthatosztvalMindktszmotoszdelosztval!

    lnko

    t

    szorozd

    meg

    osztval!

    Nveldosztteggyel!rdkiosztt!

    VGE.

    Az algoritmus C nyelven:

    #include int main(void){

    int szam1, szam2, oszto=2, lnko=1;printf("Adj meg 2 poz. egeszt: ");scanf("%d%d",&szam1,&szam2);if(szam1>szam2){ /* csere jn */

    int temp=szam1;szam1 = szam2;szam2 = temp;

    }while( szam1>=oszto ){

    while(szam1%oszto==0&& szam2%oszto==0){szam1 = szam1 / oszto;szam2 = szam2 / oszto;lnko = lnko * oszto;

    }oszto = oszto + 1;

    }printf("LNKO = %d",lnko);return 0;

    }

    A C kdban /* s */ kz rhatunk megjegyzseket. Ezekkel afordt nem foglalkozik, neknk viszont segt a kd megrts-

    ben. A * opertor a szorzs.A fenti kdban jdonsg a csere algoritmusa is:

    Cserealgoritmusa:Teddideiglenesvltozbaazegyikcserlend rtket!Amsikrtketteddazegyikhelyre!Azideiglenesvltozbamentettrtketteddamsikba!

    VGE.

    Pldul:szm1 szm2 temp

    Kezdetben 30 20 ?temp=szm1 30 20 30szm1=szm2 20 20 30

    szm2=temp 20 30 30

    Ha ismerjk kt szm legnagyobb kzs osztjt, hogy hat-rozzuk meg a legkisebb kzs tbbszrsket?2

    Gondolkodjunkegytt!

    G3.1 rjon algoritmust, amely 100 s 200 kztt kirja az sz-szes 3-mal oszthat szmot! rja fel az ehhez tartoz C nyelvkdot! (Nem kell teljes programot rnia!)

    G3.2 rja fel a kvetkez mveletek igazsgtbljt! Elhagyha-t a zrjel?

    a) A && B && Cb) A || B || Cc) A && (B || C)d) (A && B) || C

    G3.3 rja fel a kvetkez mveletek igazsgtbljt! Melyik aKIZR VAGY mvelet?

    a) (A || (!B)) && ((!A) || B)

    b) (A && (!B)) || ((!A) && B)c) !((!A) && (!B))d) !((!A) || (!B))

    G3.4 rjon algoritmust pszeudokdban, amely kirja egy pozi-tv egsz szm prmtnyezs felbontst! rja le az algoritmusC nyelv megvalstst is!Pldul 30 prmtnyezs felbontsa:30|215|3

    5|51|

    G3.5 rja le az sszeads algoritmusnak pszeudokdjt! (Nem

    kell C kd.)Pl.:

    123+348

    ----471

    G3.6 A kvetkez pszeudokd egy szm faktorilist szmol-n ki, de van benne egy hiba. Javtsa ki a hibt! (Pl. 5 faktori-lisa: 1*2*3*4*5=120.)

    Faktorilisprogram:Szorzlegyen1,Eredmnylegyen1!Krjbeegypozitvegszszmot!

    AmgszorznemnagyobbaszmnlSzorozdmegEredmnytaSzorzval!

    rdkiazEredmnyt!VGE.

    G3.7 Adja meg azt az algoritmust pszeudokdban, amelymegszmolja, hogy egy pozitv egsz szmnak hny valdiosztja van! (Valdi oszt: 1-en s nmagn kvl az sszesoszt.) rja le az algoritmust megvalst C nyelv kdrszle-tet!

    2LKKT=(Szam1*Szam2/LNKO).Szmbrzolsiokokblclszer amve

    letetLKKT=(Szam1/LNKO)*Szam2formbanrni.

  • 8/8/2019 Prog 1 Jegyzet

    17/106

    17

    G3.8 rjon kdrszletet C nyelven, amely kirja, hogy egypozitv egsz szm prm-e, vagy sem! A megoldsban felhasz-nlhatja a G3.6 feladat megoldst is!

    G3.9 rjon algoritmust a legkisebb kzs tbbszrs meghat-rozsra

    a) brute-force mdon!b) prmtnyezs felbonts segtsgvel!

    Oldjamegegyedl!

    Azintegrltfejlesztkrnyezet

    A knyelmes s gyors munka rdekben programfejlesztsrelehetsg szerint olyan szoftvereket hasznlunk, mely egybept-ve tartalmazza a programkd szerkesztsre alkalmas szveg-szerkesztt, a programmodulokbl gpi kdot ltrehoz fordtt(compiler), a gpi kd modulokbl futtathat programot ltrehozlinkert, s a programhibk feldertst megknnyt debuggerrendszert. Az ilyen rendszereket integrlt fejlesztkrnyezetnek(Integrated Development Environment IDE) nevezzk.

    A knyvben tallhat pldk kiprblshoz brmilyen Cfordt hasznlhat, nem ktelez a bemutatott programokkaldolgozni.

    A Microsoft Visual C++ 2003 fejlesztkrnyezettel ismerke-dnk meg rviden. A MS Visual C++ fordt Express Editionnev, cskkentett kpessg vltozata ingyenesen letlthet aMicrosoft honlapjrl, s a vele kszlt programok tetszlegesclra felhasznlhatk. Az Express Edition tartalmazza a szmunk-ra szksges funkcikat, hasznlata nagyon hasonl a 2003-asvltozathoz.

    Programltrehozsa

    VC++ 2003-at elindtva a kvetkez ablak fogad:

    Ltre kell hozni a program projektjt. Ehhez kattintsunk a Fi-le men New/Project parancsra!

    Ne hasznljuk a New ikont! Ez egy txt fjlt hoz ltre,amivel nem tudunk mit kezdeni, mert nem rsze a

    projektnek. Ha vletlenl mgis egy ilyen ablakbakezdtk rni a programit, ne essnk ktsgbe, hanemmentsk el a fjlt (c vagy cpp kiterjesztssel! teht pl.valami.c), csukjuk be, majd a kvetkezkben lertakszerint hozzuk ltre a projektet. Ha ez megvan, a jobboldali Solution Explorerben a Source Files mapprakattintsunk jobb egrgombbal! Ezutn Add/AddExisting Item vlasszuk ki az elmentett c vagy cpp

    fjlt!

    A kvetkez dialgusablakokat kell helyesen belltani. Fi-gyelem, knny elrontani!

    Figyeljnk, hogy Win32 Console Projectet indtsunk, s amsodik dialgusablakban ne a Finishre kattintsunk, hanem azApplication Settings flre! Ha jlcsinltuk, akkor a jobb oldali brhozhasonlan, az IDE jobb oldaln tallha-t Solution Explorer mindegyik mapp-

    ja res lesz. Most

    jobb klikk a Solution ExplorerSource Files mappjn

    Add New Item Vlasszuk a C++ File-t, s adjunk

    neki nevet. Ha c kiterjesztst runk(valami.c), akkor a fordt nem C++fjlnak fogja kezelni.

  • 8/8/2019 Prog 1 Jegyzet

    18/106

    18

    Fordts,futtats,hibakeress

    Miutn begpeltk a C nyelv programot, abbl futtathat programot kell kszteni (Microsoft opercis rendszerek alattezek .exe kiterjesztsek). A C nyelvben a programok gyakran tbbforrsfjlbl llnak, az is elfordulhat, hogy ezeket a modulokat ms-msember kszti. A C nyelv gy tmogatja a csoportmunkt. Emiatt a felp-ts miatt a futtathat llomny ltrehozsa kt lpsbl ll:

    1. Fordts: ekkor minden egyes .c (vagy .cpp) fjlbl egy leford-tott object fjl jn ltre (ltalban .obj kiterjesztssel).

    2. Szerkeszts (linkels): az object fjlokat, s a rendszerfggv-nyeket tartalmaz .lib fjlokbl a programban hasznlt fggv-nyeket egybeszerkeszti, s ezzel ltrehozza a futtathat progra-mot.

    Lehetsg van arra is, hogy tbb object fjlbl mi magunk hozzunkltre fggvnyknyvtrat, vagyis .lib fjlt, ezzel a krdssel azonbanebben a jegyzetben nem foglalkozunk.

    A fordtssal sszefgg parancsok a Build menben, illetveaz eszkztron is megtallhatk (ha a Build eszkztr be vankapcsolva).

    Compile: lefordtja a .cpp fjlt, obj. fjlt hoz belle ltre. Build Solution/Buildproba2: lefordtja azokat a forrs-

    fjlokat, melyek mdosultak a legutbbi fordts ta,majd a linker ltrehozza az .exe-t. Egy Solutionn belltbb program/library is lehet, a Build Solution az sszeset le-

    fordtja, a Build proba2 csak a kivlasztott proba2 projektet. Mikizrlag egyprogramos Solutiont hasznlunk, teht a fentiekkzl brmelyiket hasznlhatjuk.

    Rebuild Solution/Rebuildproba2: a forrsfjlokat akkor is jra-fordtja, ha nem mdosultak a legutbbi fordts ta.

    Amennyiben nem rjuk t a belltsokban, a fordts a prog-ramot tartalmaz mappa alknyvtrban jn ltre. Az alknyvtrneve a fordts mdjtl fgg. A fels eszkztron vlaszthatunkDebug s Release kzl, de magunk is ltrehozhatunk fordtsi

    profilt. Debug: minden optimalizci ki van kapcsolva, a kdba

    kerlnek olyan rszek, melyek lehetv teszik a hibake-resst (trspontok beptse, soronknti futtats stb.).Emiatt ez gy kapott exe nagy s lass lesz.

    Release: a vglegesnek sznt vltozat, optimalizcival(gyorsabb programot kapunk) s a debuggolst segtkdok nlkl: release llsban nem tudunk debuggolni,csak ha megvltoztatjuk a konfigurcit, de akkor mrinkbb a debug mdot hasznljuk.

    Ha bepillantunk a Debug s Release mappkba fordts utn,az .obj s az .exe fjlokon kvl szmos egyebet is tallunk itt.Ezekre a fjlokra a ksbb nem lesz szksgnk, teht nyugodtantrlhetk. Ha jrafordtjuk a programot, ismt ltrejnnek.

    A konfigurcikhoz tartoz belltsokat a Project menProperties pontjban llthatjuk be, de ugyanez a dialgusablakelhvhat a Solution Explorerben a program nevn jobb egr-gombot nyomva, s a Propertiest vlasztva (Figyelem! Ne aSolutionn, hanem a program nevn kattintsunk, klnben msProperties ablak jn el!). Itt teljesen tszabhatjuk a belltsokat,

    akr olyannyira, hogy Release zemmdban legyen olyan, mintalaprtelmezs szerint Debug mdban, s fordtva

    Fordtsi hibk

    Amennyiben a programunk szintaktikai hibt tartalmazott, te-ht valamit rosszul rtunk, esetleg lefelejtettnk egy zrjeletvagy pontosvesszt, az erre vonatkoz hibazenetek a kpernyaljn jelennek meg. A hibazenetre kattintva a kurzor arra a sorraugrik, ahol a hibt elkvettk a fordt szerint, de elfordulhat,hogy a hiba az elz sorban volt, pl. ott hagytuk le a pontosvesz-

    sz

    t. Ha tbb hibt tall a fordt, akkor mindig fllr

    l lefelhaladjunk ezek kijavtsban, mert gyakran elfordul, hogy alejjebb lert hibk nem is hibk, hanem csak egy elbb lv hibakvetkeztben mondja azt a fordt. Ilyen pldul akkor fordulel, ha lehagyunk egy zrjelet.Szemantikai hibk

    A kvetkez lersban olyan informcik is tallhatk, me-lyekhez most mg nem rendelkeznk elg ismerettel, de ha ta-

    pasztaltabbak lesznk, rdemes lesz visszalapozni.Ha sikerlt lefordtani a programot, az mg nem jelenti azt,

    hogy helyesen is mkdik. Vannak olyan esetek, amikor a prog-ram szintaktikailag helyes, teht le lehet fordtani, de a fordttall olyan gyans rszeket, ahol hiba lehet. Ilyen esetekbenfigyelmeztetst (warning) r ki. A warningokat is nzzk t, s

    csak akkor hagyjuk figyelmen kvl, ha biztosak vagyunk benne,hogy j, amit rtunk.

    A kezd programoznak gyakran a szintaktikai hibk kijav-tsa is nehz feladat, de k is r fognak jnni, hogy a szemantikaihibk (bugok) feldertse sokkal nehezebb, hiszen itt nem llrendelkezsre a fordt segtsge, nem mondja meg, hogy itt s ittvan a hiba, hanem a rendellenes mkdsbl neknk kell rjn-nnk, hogy baj van. A fejlesztkrnyezet azonban nem hagyilyen esetekben sem eszkzk nlkl.

    Helyezznktrspontot a programba! A trspont azt jelen-ti, hogy a program fut normlisan a trspontig, s ott megll.Ekkor meg tudjuk nzni a vltozk aktulis rtkt, s soronknttovbb tudjuk futtatni a programot (vagy normlisan is tovbbfuttathatjuk). Trspontot legegyszer bben gy helyezhetnk a

    programba, ha a programkd melletti szrke (VC) svon kattin-tunk bal egrgombbal. Ekkor egy piros ptty jelenik meg a sormellett.

    Start s Start Without Debugging: A Debug menben ezzel akt paranccsal indthatjuk a programot. Az elst vlasztva a

    program megll az els trspontnl, a msodikat vlasztva nemveszi figyelembe egyik trspontot sem! Viszont ha a Start-otvlasztjuk, a program ablaka becsukdik a futs vgn, nemltjuk, mit rt ki a programunk, mg Start Without Debuggingesetn nem csukdik be az ablak.

    Visual C++ esetn a trspontnl azt is megadhatjuk, hogy ne mindiglljon meg ott a program, hanem csak valahanyadik odars alkalmval,vagy pedig valamifle felttel teljeslse esetn (pl. egy vltoz rtkevalamennyi). Ezek bellthatak a trspontra jobb egrgombbal kattint-va, a Breakpoint Properties menpontot vlasztva.

    A hibakeress megkezdse utn (pl. ha a program megll egytrspontnl) alul megjelennek a debug ablakok, ahol megnz-hetjks kvethetjka vltozk rtkt. Ezek kzl az Autos a

  • 8/8/2019 Prog 1 Jegyzet

    19/106

    19

    rendszer ltal nknyesen kivlasztott vltozkat mutatja, aLocals az adott fggvnyben definilt sszes vltozt, a Watch1

    pedig az ltalunk megadott vltozkat. Ezen kvl, ha az egeretvalamelyik vltoz fl visszk, egy buborkban megjelenik avltoz rtke.

    A jobb als ablak Call Stack fle mg nagyon hasznos szmunkra,mert ennek segtsgvel tudhatjuk meg, mely fggvny hvta meg azaktulis fggvnyt, azt melyik hvta, stb.

    Nem csak vltozk, hanem kifejezsek is berhatk a Watch

    ablakba, pldul t[23], *yp vagy a+b is.Ha egy pointerrel adott tmb elemeit szeretnnk ltni, a debugger a

    +-ra kattintva csak a tmb els elemt rja ki. Ha pl. t a tmb neve, rjukbe a Watch ablakba, hogy t,100! Ekkor a tmb 100 elemt fogja kirni.

    Trspont helyett a Run to Cursor (Futtats a Kurzorig) pa-rancsot is hasznlhatjuk adott helyen trtn megllsra.

    Ha megllt a program, tbbflekppen is tovbblptethetjk.A soronknti lptetsre kt lehetsg is van:

    Step Over: vgrehajt egy sornyi programot. Ha a sorbanfggvnyhvs trtnik, a fggvnyt is vgrehajtja.

    Step Into: elkezd vgrehajtani egy sor programot. Ha asorban fggvnyhvs trtnik, beugrik a fggvnybe, s akvetkez Step Over vagy Step Into utastsokkal a fgg-vnyen bell lpegethetnk.

    Step Out: vgrehajtja az adott fggvnyt, s visszaugrik ahvs helyre

    A programok szlltsa

    A Debug s a Release mappt minden szvfjdalom nlkl t-rlhetjk. Ha kell az exe, akkor azt azrt elbb msoljuk t vala-hova. Amikor legkzelebb jrafordtjuk a programunkat, ezekautomatikusan ismt ltrejnnek.

    A projekt fknyvtrbl a .cpp s .h fjlokra van szks-gnk. Ha a tbbit letrljk, akkor legkzelebb ismt ltre kellhoznunk a konzol alkalmazs projektet a korbban bemutatottakszerint, majd a projekthez hozz kell adnunk a .cpp s .h fjlokat.

    Ha teht haza akarjuk kldeni napi munknkat, akkor clsze-r elszr letrlni a Debug s Release mappt, majd a marad-

    kot becsomagolni (Total Commanderrel Alt+F5), s ezt csatolni alevlhez. Ha nagyon szks a svszlessgnk, akkor csak a .cpps .h fjlokat tmrtsk!

    L3.1 Gpelje be (ne copy-paste!), fordtsa le s futtassa azalbbi C programot! Mi trtnik, ha kezetes betket r? A

    printf kezdet sort msolja be egyms utn tbbszr, s futtas-sa jra a programot! Mi trtnik? s ha kitrli a sztringbl a \nkarakterprt?#include int main(void){

    printf("Udv, programozo!\n");return 0;

    }

    L3.2 rjon C programot, amely kirja a szmokat 1-tl 20-igegyesvel! (Vagy mdostja az elz programot, vagy j pro-

    jektet hoz ltre. Ha az elz projekthez ad egy msik C fjlt, akkorfigyeljen arra, hogy egy projektben csak egy darab main fggvnylehet, ezrt amelyiket most nem hasznlja, nevezze t msra!) Prbl-

    ja ki az IDE hibakeres szolgltatsait! Helyezzen be trspon-tot, s lpsenknti futtatssal figyelje a vltoz rtkt!

    L3.3 A kvetkez

    program rjnak billenty

    zetr

    l hinyzotta pontosvessz. Segtsen neki, s tegye be a hinyz ;-ket!Hasznlja a fordtprogramot a hinyz pontosvesszk megta-llshoz! (Most hasznlhat copy-paste-t.)

    #include int main(void){

    int szam1, szam2, oszto=2, lnko=1printf("Adj meg 2 poz. egeszt: ")scanf("%d%d",&szam1,&szam2)if(szam1>szam2){

    int temp=szam1szam1 = szam2szam2 = temp

    }

    while( szam1>=oszto ){while(szam1%oszto==0

    && szam2%oszto==0){szam1 = szam1 / osztoszam2 = szam2 / osztolnko = lnko * oszto

    }oszto = oszto + 1

    }printf("LNKO = %d",lnko)return 0

    }

    L3.4 A C programokban a szkzk, tabultorok s az jsor(ENTER) karakterek azonos jelentsek (ezeket whitespacekaraktereknek nevezzk). Kivtel: a # kezdet sorok, valamintaz "" kztti szvegek belseje: ezeket nem szabad ENTER-rel darabolni. A mveleti jelek s rsjelek eltt s mgtt lehetwhitespace karakter, de szorosan egyms mell is rhatk.

    Az L3.3-as feladatban tallhat programba tegyen be illet-ve trljn whitespace karaktereket gy, hogy a programmkdkpes maradjon!

    1.3.5 A javtott 1.3.3-as program mkdst kvessedebuggerrel!

    1.3.6 rjon programot C nyelven, amely bekr a felhasznltlegy pozitv egsz szmot, s kirja az sszes osztjt!

  • 8/8/2019 Prog 1 Jegyzet

    20/106

    20

    4.Hogymkdikafordt?

    Az elfeldolgoz (preprocesszor) a kd takartst (megjegy-zsek, felesleges szkzk trlse, stb.) s a # kezdet sorokfeldolgozst vgzi, konstansokat s makrkat helyettest.

    A fordt a C nyelven megrt kdbl a szmtgp szmraemszthet gpi kdot kszt, melyet trgykd, n. object fjlbament. A gpi kd olyan elemi utastsokbl ll sorozat, amelymr kellen kicsi, egyszer mveleteket tartalmaz ahhoz, hogyazt a szmtgp processzora fel tudja dolgozni. Bellthat, hogyassembly nyelv eredmnyt is produkljon. Az assembly nyelv agpi kd emberek szmra jobban fogyaszthat vltozata; az

    assembly kdban a processzor minden utastshoz rendelnek egy jl megjegyezhet nevet (pl. mov=adatmozgats,add=sszeads).

    Egy projekt tbb .c fjt is tartalmazhat, mindegyikbl ltrejnegy-egy object fjl. A linker ezeket egyesti, tovbb hozzszer-keszti a szabvnyos fggvnyek (pl. printf) gpi kdjt. gy ltre-

    jn a futtathat llomny (Windowsban exe).

    5.ACprogramokfelptse

    Ebben a fejezetben elszr megismerkednk a nhny szinta-xisler mdszerrel. Ezt kveten vgignzzk a legnagyobbkzs oszts programunk mdostott vltozatt, s megbeszljkazokat a rszeket, amelyeket eddig mg nem.

    5.1AszintaxislersaEgy programozsi nyelv formai szablyainak lersra tbb-

    fle megadsi mdszer ltezik. Szveges megadsra a legelterjed-tebb lernyelv a Backus-Naur Form (BNF), illetve ennek to-vbbfejlesztett vltozata az Extended BNF(EBNF), grafikusmegadsra pedig a szintaxis grf.

    BNF (BackusNaur Form):

    Elemei: ::= kifejezs

    o : ::=-tl balra nemterminlis (fel-bonthat)

    Kifejezs:o Egy vagy tbb (terminlis vagy nemterminlis)szimblum

    o Egymsutnisg: tbb, szkzzel elvlasztottszimblum

    o Vlaszts (valamelyik a felsorolsbl ll az adotthelyen): |

    Pl.: ::= | ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" |

    "9"

    EBNF (Extended BNF)

    C-szerbb lers, tbb nyelvi elem.

    szm = szmjegy , {szmjegy};szmjegy = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";

    Szintaxis diagram

    A BNF/EBNF ltvnyosabb verzija, irnytott grffal rjukle a nyelvet.

    kezdet, vg: terminlis szimblum: nemterminlis szimblum:

    A nem terminlis szimblum tovbb bonthat, a terminlisnem.

    szmjegyszm:

    0123456789

    szmjegy:

    Elfeldolgoznincs fjl kimenete

    Fordt.obj ill. .o fjlok (asm)

    Linkerfuttathat llomny (.exe)

    szimblum

    szimblum

  • 8/8/2019 Prog 1 Jegyzet

    21/106

    21

    5.2EgyegyszerCprogramelemei

    A msodik fejezetben beszltnk arrl, hogy a programokatclszer kisebb, ttekinthet rszekre darabolni, s egyes rszeketkln megvalstani. Ez mr az egyszer programokban is gyvan. A legnagyobb kzs oszts programunk esetn adja magt,hogy a szmtst rdemes klnvlasztani. Ezt a vltozatot fogjukttekinteni.

    Elszr lssuk a pszeudokdot!

    LNKO2/sztszedettprogram:Krjbektpozitvegszszmot!Szmtsdkialnkot!rdkiosztt!

    VGE.

    A program gy jval egyszer bb lett: a felhasznlval valkommunikci lett a f feladata, a szmts egyetlen utastsraredukldott.

    legnagyobbfggvny:bemenet:ktpozitvegszkimenet:egypozitvegsz

    lnko=1,oszt=2Haamsodikkisebb,mintazels

    Cserldfelaktszmot!Amgazels szmnagyobbvagyegyenl azosztval

    AmgmindktszmoszthatosztvalMindktszmotoszdelosztval!lnkotszorozdmegosztval!

    Nveldosztteggyel!Addvisszaosztt!

    VGE.

    A fggvny viszont nem kommunikl a felhasznlval. (Ez

    a legtbb fggvny esetn igaz!) Elvgzi a legnagyobb kzsoszt kiszmtst, s a kiszmtott rtket visszaadja a hvnak.Most lssuk a programot magt!

    /*************************************************** //LNKO program ****************************************************/#include /***************************************/

    int legnagyobb(); // deklarciint legnagyobb(int,int); // prototpus

    // csak az egyik kell

    /***************************************/

    int main(void){ // definci/***************************************/

    int szam1,szam2,x;

    printf("Adj meg 2 poz. egeszt: ");scanf("%d%d",&szam1,&szam2);

    x=legnagyobb(szam1,szam2);

    printf("*********");printf("\nLNKO = %d\n*********\n",x);return 0;

    }

    /**************************************/int legnagyobb(int szam1, int szam2){/* A legnagyobb kzs osztt szmolja */// definci/**************************************/

    int oszto=2,lnko=1;if(szam1>szam2){ // csere jn

    int temp=szam1;szam1 = szam2;szam2 = temp;

    }while( szam1>=oszto ){

    while(szam1%oszto==0&& szam2%oszto==0){szam1 = szam1 / oszto;szam2 = szam2 / oszto;lnko = lnko * oszto;

    }oszto = oszto + 1;

    }return lnko;

    }

    A program futsnak eredmnye, ha a felhasznl 30-at s20-at ad meg:

    Adj meg 2 poz. egeszt: 30 20*********LNKO = 10*********

    A forrskd magyarzata

    MegjegyzsekA C nyelv kt megjegyzstpust tmogat./* */ megjegyzsek: Ez a tpus tbbsoros is lehet. Kezdett a

    /* jelzi, innentl kezdve brmit runk, azt a fordt nem veszifigyelembe egszen a */ karakterprig. A /* */ pr rnzsrehasonlt a zrjelezshez, viszont nem az, mert

    nem gyazhategybe kt megjegyzs.Zrjelezsnl megtehetjk, hogy ezt rjuk: y=(a+b*(c+d)*2,

    a megjegyzsnl viszont /* X /* Y */ Z */ : itt Z /* mr nem rszea megjegyzsnek! Azaz mindig az els */ a megjegyzs vge.

    Ez akkor kellemetlen, ha szeretnnk a kd egy rszt megjegyzsbedugni, mondjuk hibakeressi clbl, s van megjegyzs ebben a rszben.A dolgot orvosolhatjuk a // megjegyzsek alkalmazsval.

    // megjegyzsek: a sor vgig tartanak. A C++ nyelvbl ut-lag kerlt t a C-be, ezrt a rgebbi szabvny szerint mkdfordtprogramok nem tmogatjk. Ahogy a pldaprogrammsodik sorban ltszik, benne lehet a /**/ megjegyzs belsej-

    ben.

    #include A # kezdet sorok az elfeldolgoz

    szmra adnak utastst. A #include azt kri, hogy azelfeldolgoz szrja be a programkd szvegbe, ennek a sornaka helyre, a kztt megadott nev fjlt. Jelen esetben azstdio.h fjl beszrst krjk. Ha a fjl nevt kztt adjukmeg, akkor a fordt ezt a fjlt azokban a mappkban keresi,amelyek be vannak lltva a szmra.

    Visual C++ 2003 esetn, alaprtelmezett belltsokkal trtn telep-tskor pl. a

    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\

    mappa ilyen. Itt megtalljuk az stdio.h fjlt is. Az elre belltott includemappk sort kibvthetjk, tovbbi mappkat adhatunk hozz. VisualC++-ban a Solution Explorerben jobb klikk a projekten Properties C/C++General Additional Include Directories listt tudjuk bvteni.

  • 8/8/2019 Prog 1 Jegyzet

    22/106

    22

    Ha nem egy rendszer fejlcfjlt szeretnnk beszerkeszteni,hanem sajtot, amelyet a programunkkal egytt trolunk, aztidzjelek kztt kell megadnunk, gy: #include "sajat.h"

    stdio.h: A STandarD Input and Output rvidtse, teht nemstdi. A .h kiterjeszts fejlcllomnyok (header fjlok)fggvnyek prototpusait s konstansokat tartalmaznak. Azstdio.h a C nyelv azon szabvnyos fggvnyeinek prototpusttartalmazza, melyek az adatok beolvasst s kirst vgzik. A

    kperny

    re rs s billenty

    zetr

    l olvass mellett ide tartozik afjlkezels is, errl ksbb lesz sz.A C nyelv szabvnyos fggvnyknyvtra adott tma kr

    csoportostva kerltek klnbz fejlcllomnyokba. Gyakranfogjuk hasznlni az stdlib.h-t, ami a Standard Library rvidtse,s sokfle fggvnyt tartalmaz, pl. memriakezelst,

    processzkezelst, stb. A math.h a matematikai fggvnyekettartalmazza, pl. gykvons, szgfggvnyek, stb., a string.hszvegkezelssel, a time.h idkezelssel foglalkozik, s gy to-vbb.

    Tpus A knnyebb feldolgozhatsg rdekben az azonosjelleg adatokat egyformn kezeljk, s tpust rendelnk hozz-juk. A szmtgp memrijban minden adat bitek sorozata. Egyadat tpusa azt jelenti, hogy az adatot ler bitek/bjtok sorozatt

    hogyan kell rtelmezni. Minden tpusra meghatrozott, hogymely mveletek rtelmezhetk r s mi az rtkkszletk.

    A C-ben az adatok tpusait a kvetkez csoportokba osztjuk: egyszer tpusok

    o egsz tpusok (tbbfle eljeles s eljel nlkli)o vals tpusok (tbbfle pontossggal)o karaktero felsorols

    szrmaztatott tpusoko mutato tmbo struktrao unio bitmez

    Azonostk A vltozk, konstansok, fggvnyek, foglaltszavak (kulcsszavak) nevei azonostk. A C nyelvben az azonos-tk

    az angol ABC kis- s nagybetibl, szmokbl s alhzs karakterekbl (_)

    llhatnak, szkz vagy ms karakter nem lehet bennk, s ma-gyar magnhangzkat sem hasznlhatunk. Szmmal nem kez-ddhetnek. A C nyelv rzkeny a betmretre (case sensitive),ezrt pl. a nev, Nev, NEV, nEv azonostk klnbzek. Foglaltsz neve nem adhat ms azonostnak,

    Pl. nem j vltoznevek:

    int int, while, llat, 4ever;

    Pl. j vltoznevek:int a, Macska, NEM, x81, _baba, ___, nagy_ember;

    Pl. j, de kerlend vltoznevek:int o, l, While;

    Azrt nem gpi kdban programozunk, mert rteni akarjuk aprogramot. Az azonostk megvlasztsnl is ezt kell szem eltttartani, ezrt nem javasoltak a fenti azonostk. Az 0 a nullval,az l az 1-gyel tveszthet ssze knnyen, a While hasonlt egyfoglalt szra. (Termszetesen nem csak a While, hanem a tbbi

    foglalt szra hasonlt azonost is kerlend

    . Pl. nem tl olvas-hat ez a kd: while(While

  • 8/8/2019 Prog 1 Jegyzet

    23/106

    23

    ben ugyanis a 0 jelenti a HAMIS-at, azaz a rosszat, mg az oper-cis rendszernek akkor adunk vissza 0-t, ha a program hibtlanul

    befejezdtt.

    A vltozdefinciszintaxis diagramja:

    A trolsi osztly (pl. static) s a tpusminst (pl. const)megadsa nem ktelez, ezekrl a 20. fejezetben lesz majd sz.Az eddigi pldkban s a tovbbiakban az egyszerstett vltoz-defincit hasznljuk:

    int oszto=2,lnko=1;

    Tpus: intVltoz azonost: a, b, cInicializl kifejezs: =0

    A listban a vltozk sorrendje tetszleges. Egy a lnyeg: avltoz legyen definilva, mieltt elszr hasznljuk.

    A C99 eltti szabvnyokban vltozt definilni csak a blokkelejn lehet, azaz a { utn llhatnak vltozdefincik, melyek

    ms utastsokkal nem szakthatk meg. pl.:{

    int a;a=0; /* Vltozdefincik kztt nem

    lehet ms utasts! */int b=0,c;...

    Ez a kd a C99 eltti szabvnyok szerint hibs, az a=0; csak adefincikat kvetheti. A C++ nyelv azonban ezt megengedi, sks bb a C99 szabvny is tvette. Ha kdunknak fordulni kellrgi szabvnyt tmogat fordtval is, ezt a megoldst kerljk!

    Kifejezs minden, aminek rtke van (konstans, vltoz,sszetett kifejezs, fggvnyhvs).

    Opertor: mveleti utasts, mveleti jel. A C-ben sok ilyenvan, pl. +, -, *, /, %, &&, ||,

  • 8/8/2019 Prog 1 Jegyzet

    24/106

    24

    6.Tpusok,vltozk,konstansok,mveletek

    Az elz fejezetekben nhny egyszer, egsz szmokathasznl algoritmussal tallkoztunk. Most megismerkednk a Cnyelv nhny jabb elemvel:

    a vals szmok trolsra szolgl double tpussal, a for ciklussal s nhny j opertorral, azaz mveleti jellel.

    6.1Msodfokegyenletgykei

    Matematikbl tudjuk, hogy az 0 egyenletgykeit az , kplet adja. Az egyenletnekakkor van vals gyke, ha a ngyzetgykjel alatt ll diszkrimi-nns nemnegatv. rjunk programot, amely bekri a hrom para-mter (a,b,c) rtkt, s kirja a gykket, ha lteznek!

    Az algoritmus pszeudokdja a kvetkez lesz:

    MsodfokegyenletprogramKrdbeahromparamtert!Szmoldkiadiszkriminnst!Haadiszkriminnsnemnegatv

    Szmoldkiaktgyktamegoldkplettel!rdkiaktgykt!

    Egybkntrjkihibazenetet!

    VGE.

    Az algoritmus kdja C nyelven:

    #include #include

    int main(void){double a,b,c,diszkr,x1,x2;

    printf("Masodfoku egyenlet gyokeinek"" szamitasa.\n\na = ");

    scanf("%lg",&a);printf("b = ");scanf("%lg",&b);printf("c = ");scanf("%lg",&c);

    diszkr = b*b - 4*a*c;

    if( diszkr >= 0.0 ){

    x1 = (-b + sqrt(diszkr)) / (2*a);x2 = (-b - sqrt(diszkr)) / (2*a);printf("\nA gyokok:\n\n"

    "x1 = %g\nx2 = %g\n",x1,x2);}else{

    printf("Az egyenletnek nincsenek"" valos gyokei.\n");

    }return 0;

    }

    A program futsnak eredmnye:

    Masodfoku egyenlet gyokeinek szamitasa.a = 1

    b = 6c = 5

    A gyokok:

    x1 = -1x2 = -5

    MagyarzatA programban ki kell szmtanunk a diszkrimi-nns ngyzetgykt. Ehhez az sqrt fggvnyt hasznljuk, mely-nek prototpusa a math.h fejlcllomnyban tallhat, ezrt ezt is

    beszerkesztjk. Mindegy, hogy a beszerkesztsnl az stdio.h,vagy a math.h van-e elbb.

    A program sszes vltozja double tpus lesz. A vals sz-mokat a szmtgp lebeg pontos formtumban trolja, ezrt adouble-t lebegpontos tpusnak is nevezik. A klnbz adatt-

    pusok szmtgpes megvalstsval a 10. fejezetben foglalko-zunk, most csak rviden: a lebeg pont a tizedes pontra utal, amitaz angolszsz orszgokban (s a szmtstechnikban) a tizedes-vessz helyett hasznlnak. Tzes szmrendszerben pldul a 842-t8.42*102-knt, a 0.0456-ot 4.56*10-2-knt adhatjuk meg lebeg-

    pontosan: a tizedespont az els rtkes szmjegy utn kerlt, saz egszet tz megfelel hatvnyval szorozzuk. A szmtgp

    kettes szmrendszert hasznl, ott termszetesen kettes szmrend-szerben trtnik a szorzs.

    A double tpus beolvassa s kirsa az int-hez hasonlan ascanf s printf fggvnyekkel trtnik, % utn megadva a megfe-lel tpusazonostt. A double tpus az egyetlen olyan tpus a C-

    ben, ahol a scanf s a printf eltr tpusazonostt hasznl: ascanf %lg-t, a printf %g-t. Ha valaki bizonyta-lan, rjon mindkt helyre %lg-t, mert ezt a ford-tk el szoktk fogadni, br nem szabvnyos,fordtva viszont, azaz a scanf-be %g-t rva hib-san fog mkdni a program!

    A diszkriminns szmtsnl figyeljk meg, hogy a ngyzet-re emelst szorzssal valstjuk meg. A ngyzet s a kb szm-tst mindig szorzssal vgezzk! Egyb (akr nem egsz)

    hatvnyok szmtsra a math.h-ban tallhat pow fggvnymegfelel.A matematikai kpletekben a szorzst gyakran nem szoktuk

    jellni, a programban azonban ktelez!Figyeljk meg, hogy a programban b*b-4*a*c szerepel, vagy-

    is nem kellett zrjeleznnk gy: b*b-(4*a*c), azaz a C, a mate-matikhoz hasonlan, csak az azonos erssg, azaz azonosprecedencij mveleteket rtkeli ki balrl jobbra. A szorzsprecedencija nagyobb, mint a kivons, ezrt elbb rtkel-dik ki a szorzs eredmnye, aztn a kivons. Ha ez nem felelmeg, zrjelezznk!

    A hasznlt mveletek sorrendje precedencia szerint (a leger-sebb fent):

    + s mint eljel

    *, / s % szorzs s oszts jelleg

    m

    velet +, - mint sszeads jelleg mvelet , = relcis mveletek ==, != relcis mveletek && logikai S || logikai VAGY = rtkads

    A diszkr = b*b - 4*a*c mvelet esetn teht a sorrend:1. b*b2. 4*a3. (4*a)*c4. (b*b)-((4*a)*c)5. diszkr=((b*b)-((4*a)*c))

    A pldaprogramban csak oda kerlt zrjel, ahov kell. Ha

    programot r, s bizonytalan, nyugodtan hasznljon zrjelet!Szvegek kt sorban. A knyv kthasbos szedse miattnem frtek el a hossz szvegek egy sorban. A C nyelv lehetv

  • 8/8/2019 Prog 1 Jegyzet

    25/106

    25

    teszi, hogy az idzjelbe rt szvegeket, azaz a sztring konstan-sokat tbb rszre, gy akr tbb sorba osszuk gy, hogy a kt(vagy tbb) rszszveg mindegyikt "-ek kz zrjuk, s a rszekkz csak whitespace karaktereket (szkz, jsor, stb.) runk.Ezeket a szvegeket az elfeldolgoz automatikusan sszefzi.

    KonstansokEddigi programjainkban is szmos esetben tall-koztunk konstansokkal. A szvegkonstansok (sztring konstan-

    sok) megadsa idz

    jelek kztt trtnik. Pl. "Hello World!\n".A karakterek trolsra alkalmas char adattpusrl mg nem beszl-tnk. A sztring karakterek sorozata, melynek vgt egy specilis karakterjelzi. A karakterek sorban egyms mellett helyezkednek el a memriban,azaz tmbben. Errl ks bb szlunk rszletesebben. A karakter kons-tansokat aposztrfok kztt adjuk meg: 'A', '@', stb. A specilis karakte-rek megadsa a \ segtsgvel trtnik, gy pl. '\n', '\'', '\\', stb. Ezek egykarakternek szmtanak. Csak ezeknl fordulhat el, hogy az aposztrfokkz egynl tbb karaktert runk, de itt is csak azrt, mert ezek egynekszmtanak. FIGYELEM! A sztring konstanst s a karakter konstanstne keverjk ssze, mert br rnzsre mindssze annyi a klnbsg,hogy idzjelek vagy aposztrfok kztt vannak, egszen mshogy kezeliezeket a C fordt! Teht pl. az "A" s az 'A' nem helyettesthet egyms-sal!

    Az int tpus egsz konstansok rsmdjban nincs semmimeglep: szmjegyek sorozata, melyet el jel egszthet ki. Pl-

    dul: -5, 0, 1686, stb.Az egsz szmokat megadhatjuk nyolcas s tizenhatos szmrendszer-ben. Ha a konstanst nyolcas (oktlis) szmrendszerben adjuk meg, 0-val kell kezdeni, pl. 012 (= tz), 050 (= negyven), stb. Tizenhatos (hexa-decimlis) szmrendszerben megadott konstans kezdete 0x vagy 0X.Pldul: 0x21 (= harminchrom), 0X10 (= tizenhat). 0xa2 (= szzhatvan-kett).

    A double tpus lebegpontos konstansoka szmjegyekenkvl vagy pontot, vagy e vagy E bett tartalmaznak. Pldul: 1.2,-4.0, 3e2, -4.1E-002, 91.4e+1, stb. Az e s E jelentse azonos, tzhatvnyval val szorzst jelent, azaz pl. 3e2 jelentse 300.0, -4.1E-002 jelentse -0.041, 91.4e+1 jelentse 914.0. Az e ill. Eutn csak egsz szm llhat. Double konstans pl. a 431. (ponttal avgn) s a .23 (ami 0.23-at jelent) is.

    Vigyzzunk a hasznlat sorn! Mennyi double x=3/4?

    x-be 0.0 kerl

    Mert 3 is s 4 is egsz, s elszr a hnyadosukat szmolja ki aszmtgp. Az egsz oszts eredmnye egsz szm, amit aszmtgp nem kerekt, hanem levgja a trt rszt, azaz 0.75helyett 0 van az = jobb oldaln.

    A szmts akkor fog 0.75-os eredmnyt adni, ha a kt rtkkzl legalbb egy lebeg pontos, azaz pl. x=3.0/4.0, vagyx=3.0/4, stb.

    A jelensg nem csak a konstansokat, hanem a vltozkat isrinti. Pldul int a=3,b=4; double d=a/b; Itt ugyangy 0.0-tkapunk. A megolds ekkor az, hogy explicit (kzvetlen) t-puskonverzit alkalmazunk, vagyis legalbb az egyik egszvltoz el odarjuk zrjelben, hogy double. Pl.:x=(double)a/b;, vagy x=a/(double)b; A tpuskonverzi

    precedencija magasabb, mint az oszts, ezrt nem szksgesgy zrjelezni: ((double)a)/b. A zrjelbe rt tpusnevet egytttpuskonverzis opertornak nevezzk.

    6.2tlag

    rjunk programot, amely elre ismeretlen mennyisg valsszmokat kr a felhasznltl, s kirja a szmok tlagt! A

    szmsorozat vgt a 0.0 rtk jelzi.

    N darab szm tlagt gy szmoljuk ki:

    .Azaz sszeadjuk a szmokat s elosztjuk az sszeget a darab-

    szmmal.A megolds algoritmusa:

    tlagprogramJegyezdmeg,hogyadarabszmsazsszegnulla!Krjafelhasznltlegyszmot!

    AmgaszmnemnullaNveldsszegetaszmmal!Nvelddarabszmoteggyel!Krjafelhasznltlegyszmot!

    Haadarabszmnagyobbnullnlrdkiazsszegsadarabszmhnyadost!

    Egybkntrdki,hogynincstlag!

    VGE.

    Mint ltjuk, nincs szksg arra, hogy az sszes szmot kln-kln megjegyezzk, elg az sszegket.

    A program C nyelven:

    #include

    int main(void){double szam, osszeg=0.0;int N=0;

    printf("Adj egy szamot (vege:0): ");scanf("%lg",&szam);while(szam != 0.0){

    osszeg += szam;N++;printf("Adj egy szamot (vege:0): ");scanf("%lg",&szam);

    }

    if(N>0)printf("Atlag: %g\n",osszeg/N);else printf("Nincs atlag.");return 0;

    }

    Miutn megnzte a megoldst, prblja meg nllan megrnia programot! Ugye, hogy nem is olyan egyszer?

    j opertorokA while ciklusban kt j opertorral tallko-zunk: a +=-vel s a ++-szal. Ezek a rvidebb kd rst segtik.

    Az osszeg += szam; jelentse: osszeg = osszeg + szam;,vagyis az osszegvltozban tallhat rtket nvelem megszam-mal. Minden alapmveletre ltezik ilyen opertor: +=, -=, *=, /=,%=.

    Az N++; jelentseN = N + 1;, vagyis Nrtkt nveli egy-gyel. A ++ opertor csak egszeken definilt, valsakon nem(fordtprogramtl fgg, hogy valson mkdik-e). Ez a sortermszetesen gy is rhat: N += 1;. Ha Nrtkt eggyel csk-kenteni akarjuk, N--;-t rhatunk. A ++-t inkremens, a ---tdekremens opertornak is nevezzk.

    Nzze t a korbbi pldkat, s cserlje ki az j opertorokra argieket, ahol lehet!

    6.3Fordtva

    rjuk ki az sszes olyan hromjegy szmot, amely ellrlhtra ugyanaz, mint htulrl elre! Pldul: 121, 707, 444, stb.

  • 8/8/2019 Prog 1 Jegyzet

    26/106

    26

    Ezeknek a szmoknak a formtuma ABA. Mivel hrom jegyszmokrl van sz, A rtke nem lehet nulla, 1-tl 9-ig mehet. Brtke 0-9-ig mehet.

    Ktfle algoritmus tlett vetjk fel:1. Brute-force mdszer: 100-tl 999-ig megynk egy

    ciklusban, s minden szmrl eldntjk, hogy meg-felel-e az elvrsoknak. Az egyes szmjegyeket amaradkkpzs s az oszts opertorokkal nyerhet-

    jk ki: ha i a ciklusvltoznk, akkor i/100 adja azels szmjegyet (egsz oszts eredmnye egsz,nincs kerekts, csonkols trtnik, gy pl.199/100==1), i%10 pedig az utols szmjegyet ad-

    ja. Az algoritmus pszeudokdjnak s C nyelvmegvalstsnak elksztst az olvasra bzzuk.

    2. Kt egymsba gyazott ciklust hasznlunk, ahol Brtkt adja a bels, A rtkt a kls.

    A msodik algoritmus pszeudokdja a kvetkez lehet:

    FordtvaprogramLegyenA=1!AmgAkisebb10nl

    LegyenB=0!AmgBkisebb10nl

    rdkiABAt!NveldBteggyel!

    NveldAteggyel!VGE.

    A program C nyelven:

    #include

    int main(void){int A,B;A=1;while(A

  • 8/8/2019 Prog 1 Jegyzet

    27/106

    27

    a jegyek sszegvel is.)

    G6.4 rjon olyan algoritmust, amely egy vals szm els kttizedesjegyt egy egsz tpus vltozba teszi. gyeljen arra,hogy a vals szm negatv is lehet, a kinyert kt tizedesjegyviszont nemnegatv alak legyen! Pldul be: 123.456, ki: 45.Be: -0.0987, ki: 9. Be: 3.0, ki: 0.

    G6.5 rjon C programot, amely folyamatosan kr a felhaszn-ltl vals szmokat egsz addig, amg az 0.0-t nem ad! rja kia felhasznl ltal adott rtkek kzl a legnagyobbat! A leg-nagyobb meghatrozsakor ne vegye figyelembe az utoljramegadott 0.0-t!

    Tipp: az els szmot kln kell beolvasni, mert ez lesz a maximumottrol vltoz kezdeti rtke. A maximumot trol vltoznak tiloshasra tssel kezdrtket adni legyen mondjuk -1.0e100, mert annlgyis biztos nagyobb lesz a maximum mdszerrel, mert mi van akkor,ha a felhasznl csak ennl kisebb rtket ad meg? Ez slyos elvi hiba,mindig igazi rtkkel inicializljunk!

    Oldjamegegyedl!

    L6.1 rjon C programot, amely kirja a tblra a 12x12-esszorztblt! A tbla gy kezddik:1 2 3 4

    1 1 2 3 4 2 2 4 6 8 3 3 6 9 12 4 4 8 12 16

    L6.2 rjon C programot, amely bekr a felhasznltl egyegsz szmot, s kirja, hogy a szm tkletes-e! Tkletesszm az, amely megegyezik osztinak sszegvel, az osztkkz rtve 1-et, de a szmot magt nem. Pldul28=1+2+4+7+14.

    Ha nllan nem megy, segtsgl az algoritmus:

    TkletesszmokprogramAzsszeglegyennulla,aszmllmegegy!Krjbeegyegszszmot!Amgaszmllnemnagyobb,mintaszmfele

    HaaszmllaszmosztjaAddszmlltazsszeghez!

    Nveldszmllteggyel!Haaszmegyezikazsszeggel

    rdki,hogytkletes!Egybknt

    rdki,hogynemtkletes!

    VGE.

    L6.3 rjon C programot, amely bekr a felhasznltl kt valsszmot, s kirja, hogy bartsgosak-e! Kt szm bartsgo