Upload
bator-schneider
View
218
Download
0
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