c nyelv es programozas kinyomtatva debrecen
TRANSCRIPT
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
1/267
C_Programozas 2008/6/2 17:13 page 5 #1
TARTALOM
Elsz 11
1. Bevezets 13
2. Memriavltozk 23
2.1. Vltoznv (azonost) 24
2.2. Vltozcm 24
2.3. Vltoztpusok 24
2.4. A vltoz rtke 252.5. Vltozdefinils 26
2.6. A scanf, printf, fscanf s fprintf fggvnyek 27
2.7. Kitztt feladatok 36
3. Utastsok 38
3.1. Kifejezs-utasts 38
3.2. sszetett utasts 38
3.3. Dntsi utastsok 39
3.3.1. Az if utasts 39
3.3.1.1. Logikai opertorok 423.3.2. A switch utasts 43
3.3.3. Kitztt feladatok 45
3.4. Ciklusutastsok 47
3.4.1. A while ciklus (ell tesztels ciklus) 48
3.4.2. A do while ciklus (htul tesztels ciklus) 50
3.4.3. A for ciklus (ismert lpsszm ciklus) 52
3.5. Ugr utastsok 55
3.5.1. A break utasts 55
3.5.2. A continue utasts 563.5.3. A goto utasts 57
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
2/267
C_Programozas 2008/6/2 17:13 page 6 #2
6 TARTALOM
3.5.4. A return utasts 57
3.6. Megoldott feladatok 58
3.7. Elemi algoritmusok sszefoglalsa 623.7.1. sszeg- s szorzatszmts 62
3.7.2. Adott tulajdonsg elemek megszmolsa 63
3.7.3. tlagszmts 63
3.7.4. Adott tulajdonsg elem ltezsnek ellenrzse 64
3.7.5. Adott tulajdonsg elem megkeresse 64
3.7.6. Legnagyobb s legkisebb elem rtknekmeghatrozsa 65
3.7.7. Legnagyobb s legkisebb elem pozcijnakmeghatrozsa 66
3.7.8. Legnagyobb kzs oszt meghatrozsa 663.7.9. Legkisebb kzs tbbszrs meghatrozsa 67
3.7.10. Egy szm tkrzse 67
3.8. Kitztt feladatok 68
4. Kifejezsek 74
4.1. A kifejezsek jobb (Rvalue) s bal (Lvalue) rtke 76
4.2. Konstansok 77
4.2.1. Egsz tpus konstansok 77
4.2.1.1. Az egsz konstansok tpusai 77
4.2.2. Vals tpus konstansok 78
4.2.3. Karakter tpus konstansok 78
4.2.4. Karakterlnc tpus konstansok 80
4.2.5. Szimbolikus konstansok 80
4.3. Opertorok 81
4.3.1. Aritmetikai opertorok 81
4.3.2. sszehasonltsi opertorok 81
4.3.3. Logikai opertorok 82
4.3.4. Bitenknti opertorok 83
4.3.5. rtkads-opertor 85
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
3/267
C_Programozas 2008/6/2 17:13 page 7 #3
TARTALOM 7
4.3.6. sszetett opertorok 85
4.3.7. Vesszopertor 85
4.3.8. Feltteles opertor 864.3.9. A sizeof opertor 87
4.3.10. A Cast opertor (explicit tpuskonverzi) 87
4.4. Megoldott feladatok 88
4.5. Kitztt feladatok 91
5. Pointerek (mutatk) 92
5.1. Mveletek pointerekkel 95
5.1.1. rtkads 95
5.1.2. sszehasonlts 95
5.1.3. + / 96
5.1.4. Pointerek klnbsge 97
6. Tmbk 99
6.1. Egydimenzis tmbk 99
6.1.1. Inicializls definilskor 100
6.1.2. Kapcsolat a tmbk s pointerek kztt 101
6.1.2.1. Buborkos rendezs 102
6.1.2.2. Minimum-kivlasztsos rendezs 104
6.1.2.3. Sztvlogats 1056.1.2.4. sszefsls 107
6.1.2.5. Kitztt feladatok 108
6.2. Karakterlncok (stringek) 110
6.2.1. Karakterlncok beolvassa/kirsa 112
6.2.1.1. A scanf/printf fggvnyek 112
6.2.1.2. A gets/puts fggvnyek 112
6.2.1.3. A fgets/fputs fggvnyek 113
6.2.2. Karakterlnc-kezel fggvnyek 113
6.2.2.1. Az strlen fggvny 114
6.2.2.2. Az strcpy fggvny 114
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
4/267
C_Programozas 2008/6/2 17:13 page 8 #4
8 TARTALOM
6.2.2.3. Az strcat fggvny 115
6.2.2.4. Az strcmp fggvny 115
6.2.2.5. Az strstr fggvny 1156.2.2.6. Az strchr fggvny 115
6.2.2.7. Az sscanf/sprintf fggvnyek 116
6.2.2.8. Megoldott feladatok 117
6.2.2.9. Kitztt feladatok 121
6.3. Ktdimenzis tmbk 123
6.3.1. Ktdimenzis tmbk inicializlsa definilsukkor 124
6.3.2. Szimmetrik s szablyossgok egy n nmretmtrixban 127
6.4. Tbbdimenzis tmbk 128
6.5. Megoldott feladatok 128
6.6. Kitztt feladatok 131
7. Dinamikus helyfoglals 136
8. A felhasznl ltal definilt tpusok 142
8.1. A typedef mdost jelz 142
8.2. A struct tpus 142
8.2.1. A struct-pointerek 147
8.2.2. Bitmezk 148
8.3. A union tpus 150
8.4. Kitztt feladatok 153
8.5. A felsorols tpus (enum) 155
9. Fggvnyek 158
9.1. Cm szerinti paramtertads 162
9.2. Paramtertads a STACK-en keresztl 166
9.3. Globlis s loklis vltozk 168
9.4. Programtervezs kicsiben 171
9.5. Fggvnypointerek 1779.6. Fggvny paramterknt val tadsa fggvnynek 178
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
5/267
C_Programozas 2008/6/2 17:13 page 9 #5
TARTALOM 9
9.7. Vltoz paramterszm fggvnyek 179
9.8. Parancssor-argumentumok (a main paramterei) 183
9.9. Rekurzv fggvnyek 1859.10. Kitztt feladatok 188
10. Makrk 194
10.1. Kitztt feladatok 198
11. llomnykezels (Input/Output mveletek) 199
11.1. llomnykezel fggvnyek 201
11.2. A scanf/fscanf, illetve printf/fprintf fggvnyek 208
11.2.1. A scanf fggvny 208
11.2.1.1. A %n formzkarakter 20911.2.1.2. A scanset hasznlata 209
11.2.2. A printf fggvny 212
11.3. Megoldott feladatok 215
11.4. Alacsony szint llomnykezels 221
12. tfog kp a C nyelvrl 224
12.1. Strukturlt programozs 224
12.1.1. Feltteles fordts 225
12.2. Modulris programozs 228
12.2.1. Modulok, blokkok 229
12.3. Definci s deklarci 230
12.4. A vltozk osztlyozsa 231
12.5. A C nyelv adattpusai fellnzetbl 236
12.6. Egy sszetett feladat 237
A. Fggelk. Rekurzi egyszeren s rdekesen 245
B. Fggelk. Az adatok bels brzolsa a szmtgpmemrijban 261
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
6/267
C_Programozas 2008/6/2 17:13 page 10 #6
10 TARTALOM
Szakirodalom 271
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
7/267
C_Programozas 2008/6/2 17:13 page 11 #7
ELSZ
A knyvet, amelyet kezben tart az olvas, tanknyvnek szntam.Gondolom, eredmnyesen fogjk hasznlni mind az egyetemi hallgatk,mind a kzpiskols dikok. St remlem, tanrkollgim is tallnak bennetleteket, amelyeket hasznlni tudnak majd bizonyos tmk oktatsakor.
A knyv megrsakor tbbre trekedtem, mint egyszeren bemutatnia C nyelvet (az ANSI standardnak megfelelen), a clom az volt, hogyprogramozni tantsak. Az els fejezettel igyekszem tfog kpet nyjtania programozsrl mint szmtgpes feladatmegoldsrl. A kvetkez fe-
jezetek fokozatosan vezetik be az olvast a programozs vilgba s tbb-kevsb egymsra plnek. Igyekeztem nem hivatkozni olyasmire, ami mgnem kerlt bemutatsra. Pldul mr a msodik fejezetben a billen-tyzetrl val olvasssal s a monitorra val rssal prhuzamosan tr-gyalom dihjban a szveges llomnykezelst. Az utols fejezet clja olyanhelyzetbe juttatni az olvast, hogy mintegy fellnzetbl lsson bizonyostmakrket.
Azrt, hogy a knyv ne tnjn szraznak, sok fogalmat megoldottfeladatokon keresztl vezetek be. A fogalmak elmlytst ugyancsakmegoldott feladatok ltal valstom meg. A legtbb feladat esetben igyek-szem elszr rvezetni az olvast a megoldsra, s csak azutn kzlma forrskdot. A C programokat gyakran "magyarzat" illetve "tanuls-gok" nev rszek kvetik, amelyek ltalban implementcis szempontokra
hvja fel a figyelmet. Minden fejezet vgn kitztt feladatok tallhatk.Tizenhat ves oktati tapasztalatomat igyekeztem bepteni eknyvbe. Arra trekedtem, hogy gazdagon legyen illusztrlva szemlltetbrkkal. Egyes fejezetek (pldul a rekurzi) oktatshoz sajtos mdsz-ereket javasolok. Dikjaim eredmnyei azt mutatjk, hogy ezen mdszerekhatkonyan alkalmazhatk. Tbb kollgm is kiprblta ket, szp ered-mnnyel.
Bzom benne hogy, a kedves olvas gy tallja majd, hogy gyakorlatias,rdekes, hasznos s eredeti tanknyvet tart a kezben.
Ksznet a lektornak, a mszaki szerkesztknek s a kiadnak.
A szerz
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
8/267
C_Programozas 2008/6/2 17:13 page 12 #8
12 ELSZ
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
9/267
C_Programozas 2008/6/2 17:13 page 13 #9
1. FEJEZET
BEVEZETS
A szmtgpes feladatmegoldskommunikcitfelttelez. Ehhez min-denekeltt a kvetkezkre van szksg:
1. Egy nyelvre, amely ltal kzlni tudom a szmtgppel, mit sz-eretnk, hogy elvgezzen.
2. A gp gondolkodsmdjhoz igazodni, azaz gpi szinten elmag-yarzni, hogy mi a teendje.
Milyen nyelvet rt a szmtgp? A gpi kdot. Ennek a gpnyelvnek
az bcje a 0 s 1 szmjegyekbl ll. Elvileg milyen lehetsgek volnnaka kommunikcira?
A gp megtanul magyarul. Ez kizrt dolog, klnben nem gp vol-na, hanem ember.
Elsajttjuk mi a gpi kdnyelvet. Ez termszetesen lehetsges az els szmtgpek gy voltak programozva , de rendkvlfraszt. Gondoljunk bele, nehz olyan nyelven beszlni, ame-lynek bcje csupn kt betbl ll.
Mivel az ember knyelmes lny, ms megoldsokat keresett. gyszletett meg a fordt (kompiltor) gondolata: rni egy olyan szoftvert(programot), amely fordt gpi kdra.
A legknyelmesebb az lenne, ha ltezne fordt magyarrl gpi k-
dra. Egyelre ilyen fordtt nem rtak. A megolds egy programozsi nyelv ltrehozsa volt. Olyan prim-
itv nyelvrl van sz, amely kzelebb ll az emberhez, mint a gpikd, megfogalmazhatk benne a gpnek sznt utastsok, s a jelen-legi eszkzeinkkel kpesek vagyunk olyan fordtt rni, amely fordtaz illet nyelvrl gpi kdra.
Attl fggen, hogy mennyire van kzel az illet nyelv az emberinyelvhez, s mennyire van tvol a gpi nyelvtl, megklnbztetnkmagas,kzepes salacsony szintprogramozsi nyelveket.
A C kzepes szint programozsi nyelv.A mellkelt 1.1. bra szemlletesen mutatja be mindezt. A krdjel azt
a szakadkot szemllteti, amelyet t kell hidalnia valakinek, ha programozszeretne lenni:
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
10/267
C_Programozas 2008/6/2 17:13 page 14 #10
14 1. BEVEZETS
1.1. bra.Nyelvhierarchia
1.2. bra.Kommunikci az ember s a szmtgp kztt
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
11/267
C_Programozas 2008/6/2 17:13 page 15 #11
1. BEVEZETS 15
meg kell tanulnia egy programozsi nyelvet, meg kell tanulnia programoznia szmtgpet az illet nyelven.
Ebben a hasznos s egyben rdekfeszt trekvsben szeretne segtsgetnyjtani a knyv, amelyet az olvas a kezben tart.E knyvben a C nyelvnek fleg az ANSI szabvny szerinti vltozatt
mutatjuk be. Miutn az 1970-es vekben Dennis Ritchie s Brian Kering-han ltrehoztk a C nyelvet, a nyelv klnbz vltozatai kezdtek meg-
jelenni. Szksgess vlt teht a szabvnyostsa. Ez lehetv teszi olyanprogramok rst, amelyeket brmely modern fordt felismer. Ezt nevezikhordozhatsgnak.
Hogyan trtnik fizikailag a kapcsolatteremts a szmtgp feladat-megold rszvel? Ezt mutatja be az 1.2. bra.
A programozPC (personal computer) irny kommunikci l-talban a billentyzeten, a fordtott irny pedig a monitoron vagy a ny-
omtatn keresztl trtnik.A szmtgpbe (PC) bejuttatott adatok a bels memriban kerl-nek trolsra. Neumann Jnostl errefel mind a feladat adatai, mind a fe-ladatot megold program itt troldnak el. Ezt nevezzk a trolt programelvnek, amely fordulpontot jelentett a szmtstechnika trtnetben.
A program vgrehajtsa abbl ll, hogy a mikroprocesszor egyenkntkiolvassa a memribl a program utastsait s elvgzi ket. A mikropro-cesszor az elrt mvelethez szksges adatokat a bels memribl veszi,s az eredmnyeket ugyanitt trolja el. Ezrt ktirny a kommunikci amikroprocesszor s a bels memria kztt.
A lefordtott C program ngy, logikailag klnbz memriaterletethasznl, mindegyiknek meglvn a maga szerepe. Ezek egyike a program
kdjt (az utastsokat) tartalmazza, a msik hrom pedig az adatokat,amelyekkel a program dolgozik. Ksbb ltni fogjuk, mitl fgg, hogy bi-
stack
heap
adatszegmens
a program kdja
1.3. bra.Egy C program elvi memriatrkpe
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
12/267
C_Programozas 2008/6/2 17:13 page 16 #12
16 1. BEVEZETS
Kzponti egysg, Monitor, Billentyzet, Egr.
Mikroprocesszor.
Alaplap.
Belsmemria (RAM).
Merevlemez.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
13/267
C_Programozas 2008/6/2 17:13 page 17 #13
1. BEVEZETS 17
zonyos adatok melyik memriaterleten (adatszegmens, stack, heap) kerl-nek eltrolsra. Fgg a fordttl, a programozsi krnyezettl s a mikro-
processzor tpustl, hogyan nz ki pontosan a programunk ltal hasznltmemriaterlet trkpe. Az 1.3. bra elvileg mutatja be C programunkata szmtgp memrijban.
Mivel a bels memria tartalma trldik a szmtgp kikapcsolsakor,kialaktottk a httrtrakat (kls memrik). Ide ki lehet menteni ada-tokat, majd pedig vissza lehet tlteni ket. A httrtrakon az adatokllomnyokba (file) vannak rendezve.
Hogyan kell megoldani egy feladatot szmtgppel?
Hat lpst klnthetnk el. A jobb megrts kedvrt egy jl ismertfeladaton keresztl mutatjuk be a lpseket.
1.1. feladat. rjunk programot, amely egy msodfok egyenlet valsegytthatibl kiindulva (a,b,c), kirja a gykeit (x1, x2).
1. lps. A feladat elemzse. A feladat elemzsekor az albbikrdsekre keressk a vlaszt:
1. Mi adott a feladatban? Ezek lesznek abemen adatok,jelen esetbenaz a, b, cegytthatk.
2. Mit kell kiszmtani vagy elvgezni? Ezeket nevezzk ered-mnyeknek. A msodfok egyenlet megoldsnak eredmnyei azx1, x2 gykk.
3. Melyik az a szmtgp szintjn megfogalmazott mveletsor, ame-lyet ha vgrehajt, lpsrl lpsre elvezeti a bemen adatoktl a
megoldshoz? Ezt nevezzk a feladat megoldsi algoritmusnak.Ennek meghatrozsa jelenti lnyegben a feladat megoldst. Eza legfontosabb s egyben legnehezebb lps.
Az algoritmusok kt kitntetett mvelete a bemen adatokbeolvassa,illetve az eredmnyek kirsa. Honnan trtnik a bemen adatok be-olvassa, illetve hova rdnak ki az eredmnyek? A beolvass ltalbana billentyzetrl vagy egy llomnybl, a kirs a kpernyre vagy egyllomnyba trtnik.
Egy lehetsges forgatknyve annak, ahogy a szmtgp megoldja afeladatot, a kvetkez:
Beolvassaa billentyzetrl azt, ami adott a feladatban, a megoldsi
algoritmusnak megfelelenfeldolgozzaezeket az adatokat, skirjaaz ered-mnyeket a kpernyre.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
14/267
C_Programozas 2008/6/2 17:13 page 18 #14
18 1. BEVEZETS
1.4. bra.A msodfok egyenlet megoldsi algoritmusnak logikai smja
Az algoritmusokat logikai smk vagy pszeudokdnyelv segtsgvelszoks brzolni. Az albbiakban megtekinthet a fenti feladatot megoldalgoritmus logikai smval s pszeudokdnyelven felvzolva, illetve Cnyelvre trva. Nem fznk magyarzatot hozzjuk, hiszen clunk velkegyszeren annyi, hogy megfoghatbb tegyk a trgyalt fogalmakat. En-nek ellenre csak nyer az olvas, ha megprblja magtl megrteni ket.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
15/267
C_Programozas 2008/6/2 17:13 page 19 #15
1. BEVEZETS 19
Algoritmusok tulajdonsgai
Teljessg: Az algoritmusnak minden olyan lpst tartalmaznia kell,ami a feladathoz szksges. Egyrtelmsg: A feladatot egyrtelmen kell megoldani, azaz nem
lehetnek ktrtelm rszei. Vgessg: Az algoritmusnak vges sok lpsben be kell fejezdnie,
a lpsek szma s a vgrehajts ideje egyarnt vges. ltalnos rvnysg: Egy algoritmus a feladatok egsz osztlyt
kpes megoldani brmilyen bemen adatokra. Determinizmus: Ez azt jelenti, hogy az algoritmus minden lpse
elre ismert, s minden mveletet elre ismert mvelet kvet.
algoritmus msodfok egyenlet(a, b, c)Pszeudokd
beolvas a, b, cha a = 0
akkor ha b = 0akkor ha c = 0
akkor kir "Vgtelen sok megolds"klnben kir "Nincs megolds"
vge ha
klnben kir - c / bvge ha
klnben
d b2 - 4acha d < 0
akkor kir "Nincs vals megolds"klnben
x1 (-b +d) / 2ax2 (-b -d) / 2akir x1,x2
vge ha
vge ha
vge algoritmus
# include C nyelvu program
# include main(){
double a, b, c, d, x1, x2;scanf("%lf%lf%lf", &a, &b, &c);if (a == 0)
if (b == 0)if (c == 0) printf("Vegtelen sok megoldas");
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
16/267
C_Programozas 2008/6/2 17:13 page 20 #16
20 1. BEVEZETS
else printf("Nincs megoldas");else printf("%lf", - c / b);
else
{d = b * b - 4 * a * c;if (d < 0) printf("Nincs valos megoldas");else
{x1 = (- b + sqrt(d)) / (2 * a);x2 = (- b - sqrt(d)) / (2 * a);printf("%lf, %lf", x1, x2);
}}
return 0;}
Ha rendelkezsre ll az algoritmus, milyen tovbbi lpsekre van szk-sg ahhoz, hogy a szmtgp ltal vgrehajthat programhoz jussunk?
2. lps. Kdols. Az algoritmus trsa C nyelvre. Eredmnye aprogram (kd), amely utastja a szmtgpet az algoritmusban elrtmveletek elvgzsre.
3. lps. Szerkeszts (Editls). A C program megszerkesztse egymegfelel (ltalban a C programozsi krnyezetbe beptett) szvegsz-erkesztvel. Eredmnye a forrskdnak nevezett llomny.
4. lps. Fordts (Kompills). A forrskd lefordtsa gpi kdra.Eredmnye a trgykd.
5. lps. sszeszerkeszts (Linkeditls). Eredmnye a futtathat kd(a gp kpes vgrehajtani).
6. lps. Futtats (Run). A gp vgrehajtja a program utastsaibanelrt mveleteket, megoldva ezltal a kvnt feladatot.
1.5. bra.12. lps (fejben/papron)
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
17/267
C_Programozas 2008/6/2 17:13 page 21 #17
1. BEVEZETS 21
1.6. bra.
36. lps (szmtgpen)
Fordts
sszeszerkeszts
sFuttats
KdolssEditls
Dev-C programozsi krnyezet.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
18/267
C_Programozas 2008/6/2 17:13 page 22 #18
22 1. BEVEZETS
Futtatsi ikon
Fordts
ssszeszerkeszts
KdolssEditls
Fordts
A Visual Studio C programozsi krnyezete.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
19/267
C_Programozas 2008/6/2 17:13 page 23 #19
2. FEJEZET
MEMRIAVLTOZK
Hova kerlnek a feladat bemen adatai a beolvass nyomn? Amemriba, pontosabban az gynevezett memriavltozkba. Ugyancsakvltozkban troljuk a feladat eredmnyeit s rszeredmnyeit is.
A memrit gy kell elkpzelni, mint sorszmozott memriarekeszekegymsutnjt. Minden rekeszbe nyolc bitnek nevezett binris szm-
jegy (0 vagy 1) kerl trolsra. Mivel 8 bit 1 byte-ot alkot, a rekeszekszma megadja a memria kapacitst byte-ban. Egy rekesz cmt a sorsz-
ma fejezi ki. A memriavltozk szmra egyms utni memriarekeszekfoglaldnak le. Az els rekesz cme szmt a vltoz cmnek. Egy vltozmrete annyi byte, ahny memriarekesz van lefoglalva szmra.
Tekintsk egyelre a vltozk kvetkez ngy jellemzjt: nv, cm,tpus s rtk.
Memria0 000000001 000000002 00000000. 00000000. 00000000
. 000000001000 00000000
cm 1001 001001001002 000111011003 00000000
. 00000000
. 00000000
. 00000000
2.1. bra.Vltoz a memriban
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
20/267
C_Programozas 2008/6/2 17:13 page 24 #20
24 2. MEMRIAVLTOZK
2.1. Vltoznv (azonost)
Egy vltoznv az angol bc kis- s nagybetit, az alhzsjelt,valamint szmjegyeket tartalmazhat, de nem kezddhet szmjeggyel. A Cnyelv CASE-rzkeny, ami azt jelenti, hogy klnbsget tesz kis- s nagy-bet kztt: mas, Mas, MAS, ms-ms vltoznevek. Ez a meghatrozsrvnyes minden azonostra a C nyelvben, nemcsak a vltoznevekre.Ajnlatos beszdes azonostkat vlasztani, vagyis olyanokat, ame-lyeknek a jelentse sugalmazza, hogy mire, milyen cllal fogjuk hasznlni.St hasznos lehet szoksokat kialaktani. Pldul az s vltozban mindigsszeget troljunk, az i-ben szmllt. . .
2.2. Vltozcm
Az&opertor segtsgvel hivatkozhatunk egy vltoz cmre. Pldul&masa mas nev vltoz cmt jelenti.
2.3. Vltoztpusok
A vltoz tpusa hatrozza meg a mrett, valamint azt, hogy milyenrtktartomnybl trolhat rtkeket. Ksbb ltni fogjuk, hogy a tpusmagba foglalja az illet adattal elvgezhet mveleteket is.
Alaptpusok:
char, int : egsz szmok trolsra,float, double : vals szmok trolsra,void : semmilyen/brmilyen tpus (lsd ksbb).
Megjegyzs. Nem minden vals szm trolhat el pontosan aszmtgp memrijban. Ez logikus, hiszen egyes vals szmok vgte-len tizedes szmjegyet tartalmaznak, amit lehetetlen brzolni a mahasznlatos szmtgpeken.
Az alaptpusokbl gynevezett tpusmdostkkal tovbbi tpusoknyerhetk.
Tpusmdostk:signed, unsigned, short, long.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
21/267
C_Programozas 2008/6/2 17:13 page 25 #21
2.4. A VLTOZ RTKE 25
A 2.1. tblzat sszefoglalja a leggyakrabban hasznlt egyszer tpu-sokat, megadva a mretket bitben, s a hozzjuk kapcsold rtktar-
tomnyt. Amennyiben hinyzik az alaptpus, implicitint
-nek tekintend.Pldul a shortvaljban short int-et jelent.
2.1. tblzat.A C nyelv leggyakrabban hasznlt egyszer tpusai
Tpus Mret rtktartomny
char 8 128 .. 127unsigned char 8 0 .. 255short 16 32768 .. 32767unsigned short 16 0 .. 65535int 16 32768 .. 32767int 32 2147483648 .. 2147483647unsigned int 16 0 .. 65535unsigned int 32 0 .. 4294967295long 32 2147483648 .. 2147483647unsigned long 32 0 .. 4294967295float 32 3.41038 .. 3.41038double 64 1.710308 .. 1.710308long double 80 3.4104932 .. 1.1104932
A fenti tblzatba foglalt rtkek csak ltalban rvnyesek, hiszen atpusmretek fgghetnek a fordttl. Az ANSI standard csak az albbiakatrja el:
1=sizeof(char) sizeof(short) sizeof(int) sizeof(long)sizeof(float) sizeof(double)A sizeofopertor egy tpus mrett adja meg byte-ban. (4.3.9. alfe-
jezet)
2.4. A vltoz rtke
A vltoz rtke a benne eltrolt rtk. Ezen rtk a programfuts alattvltozhat (ezrt is nevezik vltoznak). A mindennapi letben ltalban 10-es szmrendszerben dolgozunk, ami azt jelenti, hogy 10 szmjegyet (0, 1,
2, . . . 9) hasznlunk. Ezzel szemben a szmtgp csak 2 szmjegyet ismer,a 2-es szmrendszer szmjegyeit, a 0-t s az 1-et. Mindennek dacra, a mi
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
22/267
C_Programozas 2008/6/2 17:13 page 26 #22
26 2. MEMRIAVLTOZK
knyelmnkrt, 10-es szmrendszerben rtekezik a felhasznlval. Ez vis-zont azt jelenti, hogy a billentyzetrl begpelt adatokat a szmtgpnek
elszr t kell alaktania, s csak azutn kerlhet sor a trolsukra. Azta binris alakot, amelyben az adatok eltrolsra kerlnek a memriban,bels brzolsnak nevezzk. Anlkl, hogy rszleteznnk, megemltjk,hogy az egsz szmok bels brzolst fixpontos, a vals szmokt pediglebegpontos (angolulfloating) brzolsnak nevezik (lsd a B. fggelket).
2.5. Vltozdefinils
Hogyan kzljk a szmtgppel, hogy hozzon ltre a memribanegy vltozt? Az illet vltoz definilsa ltal. Egy vltoz definilsakormeg kell adnunk a vltoz nevt, tpust (ez hatrozza meg a mrett), s
adhatunk egy kezdrtket is (ez nem ktelez). Ha egy vltoznak nemadunk rtket a definilsakor, akkor bizonyos esetekben (programozsikrnyezettl fggen) automatikusan 0-val inicializldik, mskor viszontgynevezett memriaszemetet fog tartalmazni.
A vltozdefinils szintaxisa: [= ];
A szgletes zrjelek azt jelzik, hogy a kezdrtkads nem ktelez.Pldk:
int a;float b1, b2;long i, j = 1, k;unsigned char c = 65;long double x, y = 3.14;
Az algoritmusok kapcsn kt kitntetett mveletrl beszltnk: a be-men adatokbeolvassrls az eredmnyekkirsrl. Hogyan utasthata szmtgp egy C programbl ezen mveletek lebonyoltsra? A billen-tyzetrl val olvassra, illetve a monitorra val rsra pldul a scanfs printf fggvnyek ltal. Szveges llomny(bl/ba) val olvass/rsesetn hasznlhatjuk az fscanfs fprintf fggvnyeket.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
23/267
C_Programozas 2008/6/2 17:13 page 27 #23
2.6. A SCANF, PRINTF, FSCANF S FPRINTF FGGVNYEK 27
2.6. A scanf, printf, fscanfs fprintf fggvnyek1
Lssunk mindenekeltt egy konkrt pldt az emltett fggvnyekhasznlatra.
2.1. feladat. rjunk programot, amely beolvas a billentyzetrl/llo-mnybl egy egsz szmot, majd kirja a kpernyre/llomnyba.
C nyelven
#include main(){
int a;scanf("%d", &a);
printf("A szm:%d", a);return 0;
}
C nyelven
#include main(){
FILE * f;FILE * g;
int a;f = fopen("be.txt", "r");g = fopen("ki.txt", "w");fscanf(f, "%d", &a);fprintf(g, "A szm:%d", a);fclose(f); fclose(g);return 0;
}
Magyarzat, tanulsgok: A program keretrl,
#include main(){
...return 0;
}
1 Nem ll szndkunkban itt, most a teljessg ignyvel bemutatni ezeket a fg-gvnyeket. Csak annyit szeretnnk elmondani, amennyire szksgnk lesz ah-hoz, hogy hasznlni tudjuk a knyv els felben szerepl feladatokban. Az l-lomnykezelssel foglalkoz fejezetben (11.2. alfejezet) jra visszatrnk rjuk. Haaz olvas teljes kpet szeretne kapni rluk, forduljon a Help-hez vagy a knyvszet
azon kteteihez, amelyek teljes lerst adnak a C nyelvrl.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
24/267
C_Programozas 2008/6/2 17:13 page 28 #24
28 2. MEMRIAVLTOZK
egyelre csak annyit, hogy az #include programsort a scanf, printf, fscanf s
fprintffggvnyek hasznlata teszi szksgess, a main() {...return 0;}ffggvny minden C program rsze. Egy
program vgrehajtsa alapveten amainfggvny utastsainak vgre-hajtst jelenti. Az opercis rendszer, a program futtatsakor, enneka fggvnynek adja t a vezrlst s ettl is kapja vissza ( return 0;).Termszetesen a mainfggvny meghvhat ms fggvnyeket, tadvas visszakapva a vezrlst. Ezek lehetnek knyvtri fggvnyek (jelenprogramjainkban azfopen,fclose, scanf, fscanf, printf, fprintf)vagy sajt fggvnyek (9. fejezet). Minden kapcsoszrjelpr kz zrt programrszt blokknak
neveznk. Vegyk szre, hogy a vltozk definilsra a blokkok ele-jnkerl sor. Lesznek pldk, amelyekben helytakarkossgi okokbl
csak a main fggvny blokkjnak tartalmt fogjuk megrni. Az els program a billentyzetrl olvas s a monitorra r. A msodikprogramban viszont a beolvass a be.txt nev llomnybl trtnik, akirs pedig a ki.txtnev llomnyba.
Az llomny(bl/ba) val olvass/rs esetn szksges az llomnytezt megelzen megnyitni (fopen), majd a vgn bezrni (fclose).
A bemeneti llomnyt (be.txt) olvassra (r read) nyitjuk meg, akimenetit (ki.txt) pedig rsra (w write).
A bemeneti llomnynak lteznie kell a program futtatstmegelzen, s tartalmaznia kell a bemen adatokat, a kimeneti llomnytviszont a program fogja ltrehozni, a megadott nv alatt, s ebbe rja azeredmnyeket.
Az f s g, FILE * tpus vltozkat llomnymutatknak nevez-zk, s ezek ltal jelezzk azfscanf,illetvefprintffggvnyeknek, hogymelyik llomnybl olvassanak, illetve melyikbe rjanak. A FILE * tpusegypointer tpus, amelyet ksbb fogunk bemutatni.
Vegyk szre, hogy a scanf, illetve fscanf s a printf, illetvefprintf fggvnyek csak abban klnbznek, hogy az utbbiakban sze-repel az llomnymutat.
Az llomnymutat definilsnak szintaxisa:FILE * ;
Az llomny megnyitsnak szintaxisa: = fopen("",
"");
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
25/267
C_Programozas 2008/6/2 17:13 page 29 #25
2.6. A SCANF, PRINTF, FSCANF S FPRINTF FGGVNYEK 29
Az llomny bezrsnak szintaxisa:fclose();
Ascanf
,printf
,fscanf
sfprintf
fggvnyek szintaxisai:scanf("", );fscanf(, "",
);printf("", );fprintf(, "",
);Emltettk, hogy a beolvasott adatok bizonyos talakulsokon men-
nek t, mieltt eltrolsra kerlnnek a megfelel vltozkban. Ha azt azalakot, amelyben begpeljk az adatokat a billentyzetrl, vagy amelybena bemeneti llomnyban vannak, kls brzolsnaknevezzk, akkor be-olvasskor t kell trni kls brzolsrlbels brzolsra, kirskor pedig
fordtva, belsrl klsre. Mivel az talaktsok tpus-fggek, tjkoztat-nunk kell fggvnyeinket arrl, hogy tekintettel a vltozk (scanf/fscanfesetben), illetve a kifejezsek (printf/fprintf esetben) tpusra, mi-lyen talaktsra van szksg. Ezt a szerepet a formzsorok % karakter-rel bevezetett gynevezett formzkarakterei tltik be. Pldul a scanf(fscanf) beolvassa a billentyzetrl begpelt (az llomnyban tallhat)adatokat, a megfelel formzkarakter ltal megjellt mdon talaktjaket, majd bels brzolsukat eltrolja a vltozlistban megjellt vl-tozcmekre. A scanf (fscanf) formzsora gyakran csak formzkarak-tereket tartalmaz.
A printf(fprintf) a formzsorban tallhat nem formz karak-tereket egy az egyben kirja a kpernyre (llomnyba), a %-kal bevezetett
formzkarakterek helyre pedig berja a kifejezslista megfelel kife-jezsnek az rtkt (miutn talaktotta a formzkarakterrel megadottmdon bels brzolsbl kls brzolsba).
A leggyakrabban hasznlt formzkaraktereket a 2.2. tblzat tartal-mazza.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
26/267
C_Programozas 2008/6/2 17:13 page 30 #26
30 2. MEMRIAVLTOZK
2.2. tblzat.
Tpus Formzkarakter
char cint dvagy i (10-es szmrendszerben)
o(8-as szmrendszerben)x,X(16-os szmrendszerben)
unsigned int ushort int hdvagy hiunsigned short int hulong int ldvagy liunsigned long int lufloat fdouble lflong double Lfkarakterlnc spointer p
Az albbi pldk bemutatjk a formzsor formzkarakterei,valamint ascanfvltozcm listja, illetve a printfkifejezs listja kzt-ti kapcsolatot:
long a;float b;double c;long double d;
scanf("%ld%f%lf%Lf", &a, &b, &c, &d);
printf("a=%ld\nb=%f\nc=%lf\nd=%Lf\n", a, b, c, d);
Kvetkezzen egy plda az o, x s Xformzkarakterek hasznlatra.A printf("%d, %o, %x, %X ", 10, 10, 10, 10); utasts nyomn
a kpernyn a kvetkez jelenik meg: 10, 12, a, A.Megjegyzs. A tzes szmrendszerbeli 10-es nyolcas szmrendszerben
(oktl) 12, tizenhatos szmrendszerben (hexa) pedig avagy A.Ha tbb adatot szeretnnk beolvasni ugyanazzal a scanf-fel, akkor
ezeket fehr karakterekkel (white-space-nek nevezzk, pldul, a SPACE,
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
27/267
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
28/267
C_Programozas 2008/6/2 17:13 page 32 #28
32 2. MEMRIAVLTOZK
#include main(){
float x1, x2;printf("rd be az elso szmot:");scanf("%f", &x1);printf("rd be a msodik szmot:");scanf("%f", &x2);printf("A kt szm:%5.2f s %5.2f\n", x1, x2);printf("A kt szm sszege:%5.2f", x1+x2);return 0;
}
Megjegyzs. Biztosan feltnt, hogy a printf formzsorban a %karaktert nem kzvetlenl kvette az f (float) formzkarakter. Igen,megadhat, hny pozcin kerljenek kirsra az rtkek, s vals szmok
esetn az is, hogy ebbl hny legyen a tizedesrsznek fenntartva (ennekhinyban implicit 6 tizedes pontossggal trtnik a vals szmok kirsa).gy is mondhatnnk, formzhat a megjelents mdja. A fenti pldbant pozcin trtnik a kirs, amibl kett a tizedesrsz. Ez azt jelen-ti, hogy az egszrsznek ugyancsak kt pozci marad, hiszen egy poz-cit a tizedespont fog elfoglalni. Ha az egszrsz tbb szmjegy, mintahny pozcin krjk a kiratst, akkor figyelmen kvl marad a krtpozciszm, hogy az informci ne srljn. Ellenkez esetben az resenmaradt pozcik szkz karakterrel ptoldnak ki. Ha a tizedes szmje-gyek szma tbb, mint a szmukra fenntartott pozciszm, akkor a pluszszmjegyek lemaradnak, s kerekts trtnik. Kevesebb tizedes szmjegyesetn nullkkal egsztdik ki a tizedesrsz.
Plda:
printf("%5.2f", x) megjelentsha x rtke: 13.47 1 3 . 4 7ha x rtke: 1352.4712 1 3 5 2 . 4 7ha x rtke: 3.4777 3 . 4 8ha x rtke: .5 0 . 5 0ha x rtke: 0. 0 . 0 0
2.3. feladat. rjunk programot, amely beolvas a billentyzetrl ktegsz szmot, majd kirja a kpernyre az sszegket, klnbsgket,szorzatukat, hnyadosukat, valamint osztsi maradkukat (felttelezzk,hogy a msodik szm klnbzik nulltl).
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
29/267
C_Programozas 2008/6/2 17:13 page 33 #29
2.6. A SCANF, PRINTF, FSCANF S FPRINTF FGGVNYEK 33
#include main()
{int a, b, osszeg, kulonbseg, szorzat, hanyados, maradek;printf("rd be a kt szmot:");scanf("%d%d", &a, &b);osszeg = a + b;kulonbseg = a - b:szorzat = a * b;hanyados = a / b;maradek = a % b;printf("sszeg: %4d\nKlnbsg: %4d\nSzorzat: %7d\n
Hnyados: %4d\nMaradk: %4d", osszeg, kulonbseg, szorzat,hanyados, maradek);
return 0;}
Megjegyzs. Egsz szmok kirsakor is megadhat a mezszlessg,azaz, hogy hny pozcin kerljenek kirsra. Ugyanaz a megjegyzsrvnyes rjuk, mint amit a vals szmok egszrsznl tettnk.
Plda:
printf("%5ld", x) megjelents
ha x rtke: 12947 1 2 9 4 7ha x rtke: 135294712 1 3 5 2 9 4 7ha x rtke: 77 7 7
Megjegyzsek a programban hasznlt opertorokkal (mveletjelekkel)
kapcsolatban.1. A +, -, * opertorok a matematikban megszokott mdon viselked-nek. A / opertor esetben, ha mindkt operandus egsz, akkor egszoszts trtnik, ha viszont valamelyik vals, akkor vals oszts. A % azegsz oszts maradkt adja meg, ezrt operandusai csak egszek lehetnek.Pldk:
7 / 2 37.0 / 2.0 3.57.0 / 2 3.57 / 2.0 3.57 % 2 1
2. Az = jelet rtkads-opertornak nevezzk.
Az rtkads szintaxisa: = ;
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
30/267
C_Programozas 2008/6/2 17:13 page 34 #30
34 2. MEMRIAVLTOZK
Hatsra a vltoz (bal oldal) felveszi a kifejezs (jobb oldal) rtkt.Pldk:
double x = 1, y = 2, z = 3, w;w = ( x + y ) * (z - 1);
A w vltoz rtke 6lesz.3. Klnbz lehetsgek egy vltoz rtknek eggyel val nvelsre,
illetve cskkentsre:int a = 7;a = a + 1 ; a += 1; a++; ++a;a = a - 1 ; a -= 1; a--; --a;
4. Mi a klnbsg az a++, illetve ++a inkrementlsok kztt?Plda:
int a = 1, b, c = 2, d;d = c++; /* A d rtke 2, a c rtke pedig 3 lesz */
b = ++a; /* Mind a b, mind az a vltozk rtke 2 lesz */Az els utasts rtelmben a szmtgp elszr hasznlja a vltozrtkt a kifejezs kirtkelsben, s csak azutn nveli, a msodik es-etben pedig fordtva: elszr nveli s azutn hasznlja.Termszetesen ugyanez igaz a -- opertor esetben is.
5. A vltoz rtknek nvelse egy adott rtkkel:i n t a = 7 , b = 3 ;a = a + b ; a += b;a = a - b ; a -= b;
6. Kombinlt opertorok hasznlatnak szintaxisa:=+;
+= ;
Ms kombinlt aritmetikai opertorok: +=, -=, *+, /=, %=.7. A \n-nel jellt karaktert a printf, illetve a fprintf formz-
sorban jsor (newline) karakternek nevezik, ugyanis j sorba lpteti akpernyn vagy a kimeneti llomnyban a kurzort.
2.4. feladat. Adott 4 egsz szm (4 elem szmsorozat) a szamok.beszveges llomnyban. Szmtsuk ki az sszegket, s rjuk ki a szamok.kiszveges llomnyba.
Megjegyzs. Els ltsra gy tnhet, hogy szksgnk lesz ngy vl-tozra a ngy szm eltrolsa vgett. Az albbi megoldsbl kiderl, hogyelg egy vltozt hasznlni erre a clra. A mellkelt bra szemllteti az
tletet. Ezen megkzelts elnye, hogy a vltozk szma nem fgg a be-olvasott szmok szmtl.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
31/267
C_Programozas 2008/6/2 17:13 page 35 #31
2.6. A SCANF, PRINTF, FSCANF S FPRINTF FGGVNYEK 35
#include main()
{ FILE *f1, *f2;int x, s = 0;f1 = fopen("szamok.be", "r");f2 = fopen("szamok.ki", "w");fscanf(f1, "%d", &x); s += x;fscanf(f1, "%d", &x); s += x;fscanf(f1, "%d", &x); s += x;fscanf(f1, "%d", &x); s += x;fprintf(f2, "Az sszeg:%d", s);fclose(f1); fclose(f2);return 0;
}
Tanulsg: Egy szmsorozatot gyakran elemenknt dolgozunk fel.
2.5. feladat. rjunk programot, amely beolvas a billentyzetrl egyngyjegy termszetes szmot, s kirja a szmjegyei sszegt a kpernyre.
tlet: Az n % 10 kifejezs az n utols szmjegytadja meg, az n /=10; utasts pedig levgja (elosztja n-et 10-el) az n utols szmjegyt. Amellkelt tblzat nyomon kveti, hogyan vltozik az n s a p vltozkrtke a program vgrehajtsa alatt.
#include main(){
int n, p = 1;
printf("rd be a szmot:");scanf("%d", &n);/*
4-szer fogom megismtelni a kvetkezokt muveletet:p-t megszorzom n utols szmjegyvel,majd levgom n utols szmjegyt.
*/p *= n % 10; n /= 10;p *= n % 10; n /= 10;p *= n % 10; n /= 10;p *= n % 10; n /= 10;printf("A szorzat:%d", p);return 0;
}
Plda: ha a beolvasottszm 2541
n p2541 1254 125 42 200 40
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
32/267
C_Programozas 2008/6/2 17:13 page 36 #32
36 2. MEMRIAVLTOZK
Tanulsgok: Egy termszetes szmot gyakran szmjegyenknt dolgozunk fel.
Azn
rtk 10-el val osztsi maradknak ellltsa nem jr egyttaz nvltoz rtknek megvltozsval. (St n-nek a 10-el val os-ztsi hnyadosnak az ellltsa sem mdostja n-t) Amint meg-figyelhettk, n-nek 10-el val elosztst az n = n/10; utastsvalstja meg (ami ekvivalens az n/=10; alakkal), amely hatsraa szmtgp elszr ellltja az n/10 rtket, majd ezzel fellrjaaz nvltoz rtkt.
Egy C program tartalmazhat magyarz szvegeket, gynevezettkom-mentrokat (/* ... */). Ezeket a fordt figyelmen kvl hagyja. Cljukknnyebben rthetv tenni a forrskdot. Az olyan programok esetben,amelyeket hossz idn keresztl hasznlunk, elengedhetetlen a megfelelkommentrok hasznlata.
2.7. Kitztt feladatok
1. rjunk programot, amely beolvas kt vals szmot kt vltozba,kicserli a vltozk tartalmt, majd pedig kirja a szmokat fordtott sor-rendben. Prbljuk megoldani a feladatot gy is, hogy ne hasznljunkharmadik vltozt a cserhez.
2. rjunk programot, amely beolvas egy tszmjegy termszetes sz-mot egy egsz vltozba, ellltja a fordtottjt egy msik vltozban,majd kirja a kt szmot egyms al a kpernyre.
3. rjunk programot, amely beolvas ngy, hromszmjegy ter-mszetes szmot, s kirja a szmjegyeik sszegnek tlagt.4. rjunk programot, amely kiszmtja egy adott sugar gmb, illetve
adott sugar s magassg egyenes henger s kp felsznt s trfogatt.Az eredmnyeket tblzatos formban jelentsk meg.
5. rjunk programot, amely kiszmolja s kirja egy gpkocsi fktvol-sgt a sebessg s az tviszonyok fggvnyben. A felttelezett lassuls
a) norml ton: 4,4 m/s2,b) vizes ton: 3,4 m/s2,c) vizes, nylks ton: 2,4 m/s2.A reakciid: 1 msodperc.A gpkocsi kezdsebessge bemeneti adat.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
33/267
C_Programozas 2008/6/2 17:13 page 37 #33
2.7. KITZTT FELADATOK 37
6. rjunk programot, amely beolvassa egy derkszg hromszg egyikszgnek rtkt fokokban, az tfogt cm-ben, s kirja a hromszg be-
foginak hosszt s a hromszg kr rhat kr terlett s kerlett.7. Olvassuk be a kpernyrl egy pisktatart mreteit tmrjt smagassgt , valamint a rteend krm vastagsgt cm-ben. Szmoljukki, mennyi krmre van szksg a torta bevonshoz, ha 5%-os rhagyssaldolgozunk (gyerekek is vannak a csaldban. . . ) !
8. Adott kt pont, As B a skban a koordintik ltal. Hatrozzukmeg:
a) az AB szakasz hosszt
|AB|=
(xA xB)2 + (yA yB)2,b) az AB szakasz kzppontjnak koordintit
xM= (xA+xB) /2yM= (yA+yB) /2,
c) az AB egyenes irnytnyezjt
md= yA yBxA xB ,
d) egyMpont tvolsgt az AB egyenestl
tvolsg(M, d) =|a xM+b yM+ c|
a2 +b2,
ahola, b, ca degyenes egyenletnek egytthati (aX+ bY+ c= 0).Tovbb kt ponton tmen egyenes egyenlete:(XxA)(yAyB) =(Y yA)(xA xB).e) Adott egy hromszg. Hatrozzuk meg a hromszg kerlett sterlett a cscspontjainak koordinti alapjn.
SABC=
p (p a) (p b) (p c),ahol a, b, caz oldalhosszak, p pedig a flkerlet.
Megjegyzs. A feladatokat oldjuk meg az albbi esetekben:
bemenet kimenet
billentyzet monitorbillentyzet llomny
llomny monitorllomny llomny
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
34/267
C_Programozas 2008/6/2 17:13 page 38 #34
3. FEJEZET
UTASTSOK
Az utastsok utastjk a szmtgpet a feladat megoldsi algorit-musban elrt mveletek elvgzsre. A kvetkezkben bemutatjuk a Cnyelv utastskszlett.
3.1. Kifejezs-utasts
Szintaxisa:;
A leggyakrabban hasznlt kifejezs-utasts az rtkads. Egy fg-gvnyhvs is kifejezs-utasts. Eddigi programjainkban kizrlag ilyenutastsok szerepeltek. me hat plda kifejezs-utastsra:
printf("rd be a kt szmot:");scanf("%d%d", &a, &b);osszeg = a + b;a + b ; /* br szintaktikailag helyes, rtelmetlen */p *= n % 1 0 ;n /= 10;
Egy specilis kifejezs-utasts azres utasts:;
ltalban olyan helyen hasznljuk, ahol a szintaxis utastst kvetel,de neknk nem ll szndkunkban oda utastst rni (pldul olyan ciklu-sokban, amelyeknek hinyzik amagjuk 3.4. alfejezet).
3.2. sszetett utasts
Ha szeretnnk tbb egyms utn kvetkez utastst egyetlen sszetettutastsknt kezelni, akkor ssze kell fognunk ket egy kapcsoszrjelprral({ }). sszetett utastsok kpezsre akkor lehet szksg, amikor a szin-taxis egyetlen utastst kr, de mi tbb utastst szeretnnk odarni. Mivel
egy kapcsoszrjelpr kz zrt rsz blokkot kpez, az elz fejezetben
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
35/267
C_Programozas 2008/6/2 17:13 page 39 #35
3.3. DNTSI UTASTSOK 39
tett megjegyzssel sszhangban, minden sszetett utasts elejn definil-hatunk vltozkat. Ezek viszont loklisak lesznek az illet blokkra nzve,
ami azt jelenti, hogy csakis a blokk keretn bell hasznlhatk.
3.3. Dntsi utastsok
3.3.1. Az ifutasts
Akkor hasznljuk, amikor egy felttel igaz vagy hamis volttl fggen,ms-ms mveletet kell elvgezni. (Mintha kt "forgatknyvnk" lenne:az egyik arra az esetre, ha a felttel igaz, a msik pedig arra, ha hamis.)Olyan helyzet is elfordulhat, amikor, amennyiben igaz a felttel, el kellvgezni egy bizonyos mveletet, klnben nem. Az albbi brk logikai
smval, pszeudokdban s C nyelven mutatjk be a dntsutastst.A dnts felttele gyakran sszehasonltst foglal magba. Az sszeha-
sonltsi opertorok a kvetkezk: =,==(egyenlsgvizsglat),!=(klnbzsgvizsglat).
3.1. bra.Azifutasts logikai smja. F felttel (logikai kifejezs); U1, U2 utastsok; i igaz; h hamis
Pszeudokd
ha akkor [klnben ]
vge ha
C nyelven
if ();
[else ;]
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
36/267
C_Programozas 2008/6/2 17:13 page 40 #36
40 3. UTASTSOK
Lssuk, hogyan hasznlhatk a dntsi utastsok feladatokmegoldsban.
3.1. feladat. rjunk programot, amely beolvas a billentyzetrl kt ter-mszetes szmot,a-t sb -t, majd kirja ket nvekv sorrendben.
1. megolds
Pszeudokd
beolvas a, bha a > b
akkor kir b, aklnben kir a, b
vge ha
C nyelven
int a, b;scanf("%d%d", &a, &b);if ( a > b ) printf("%d %d", b, a);else printf("%d %d", a, b);
2. megolds
Pszeudokd
beolvas a, b
ha a > bakkorv
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
37/267
C_Programozas 2008/6/2 17:13 page 41 #37
3.3. DNTSI UTASTSOK 41
Megjegyzs. Az els megoldsban egyszeren kirtuk a kt vltozrtkt a krt sorrendben, mg a msodik megolds fel is cserli a kt vl-
toz rtkt. gy ebben a krt sorrendben llnak rendelkezsre az esetlegestovbbi feldolgozsok sorn.
3.2. feladat. Az input.c bemeneti llomnyban adott hrom valsszm, rjuk ki ket nvekv sorrendben azoutput.ckimeneti llomnyba.
tlet: sszehasonltgatjuk a vltozkat kettnknt az brn bemuta-tott stratgia szerint, s ahol szksges (az sszehasonltott vltozk rtkeinincsenek nvekv sorrendben), kicserljk a tartalmukat.
a b c
1 23
FILE *f, *g;float a, b, c, v;f = fopen("input.c", "r");g = fopen("output.c", "w");
fscanf(f, "%f%f%f", &a, &b, &c);if ( a > b ) { v = a ; a = b ; b = v ; }if ( b > c ) { v = b ; b = c ; c = v ; }if ( a > b ) { v = a ; a = b ; b = v ; }fprintf(b, "%f %f %f", a, b, c);fclose(f);fclose(g);
3.3. feladat. Olvassunk be ngy egsz szmot a billentyzetrl. El-lenrizzk, van-e kzttk pros szm, s rjunk ki egy megfelel zeneteta kpernyre.
1. megolds
int a, b, c, d;scanf("%d%d%d%d", &a, &b, &c, &d);if (a%2 == 0) printf( "Van kzttk pros." );else if (b%2 == 0) printf("Van kzttk pros.");
else if (c%2 == 0) printf("Van kzttk pros.");else if (d%2 == 0) printf("Van kzttk pros.");
else printf("Nincs kzttk pros.");
Mieltt adnnk egy elegnsabb megoldst is a fenti feladatra, is-merkedjnk meg a logikai opertorokkal.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
38/267
C_Programozas 2008/6/2 17:13 page 42 #38
42 3. UTASTSOK
3.3.1.1. Logikai opertorok
logikai s: && ( and ) kt operanduslogikai vagy: || ( or ) kt operanduslogikai tagads: ! ( not ) egy operandus
Azandmvelet eredmnye akkor igaz, ha mindkt operandusa igaz,klnben hamis.
Azormvelet eredmnye akkor igaz, ha legalbb az egyik operan-dusa igaz, klnben hamis.
Anot mvelet eredmnye igaz/hamis, attl fggen, hogy operan-dusa hamis/igaz.
2. megolds
int a, b, c, d;scanf("%d%d%d%d", &a, &b, &c, &d);if (a%2 == 0 || b%2 == 0 || c%2 == 0 || d%2 == 0)
printf( "Van kzttk pros." );else printf("Nincs kzttk pros.");
C-ben nincs logikai tpus. Minden 0-tl klnbz rtknek igaz a logikai rtke, a 0-nak
pedig hamis. Ezrt kifejezbb, ha a ( == 0) alak helyett a(!) alakot hasznljuk. Hasonlkppen (!= 0)helyett rjunk egyszeren()-t.
3. megoldsint a, b, c, d;scanf("%d%d%d%d", &a, &b, &c, &d);if (!(a%2) || !(b%2) || !(c%2) || !(d%2))
printf( "Van kzttk pros." );else printf("Nincs kzttk pros.");
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
39/267
C_Programozas 2008/6/2 17:13 page 43 #39
3.3. DNTSI UTASTSOK 43
3.3.2. A switchutasts
Az if utasts esetben kt "forgatknyvnk" van arra az es-hetsgekre, hogy egy logikai felttel igaz vagy hamis. Nha arra van szk-sg, hogy a szmtgp aszerint vlasszon tbb "forgatknyv" kzl, hogyegy gynevezett szelektor-kifejezs milyen rtket vesz fel. Ilyen esetbenlehet clszer switch utastst hasznlni.
Az albbi feladat rvezet a switchutasts gyakorlati rtkre.
3.4. feladat. rjunk programot, amely beolvas egy, az [1, 5] interval-lumhoz tartoz termszetes szmot, s kirja a neki megfelel minstst:1 elgtelen, 2 elgsges, 3 kzepes, 4 j, 5 jeles.
1. megolds(egymsba gyazott ifutastsokkal)
int jegy;scanf("%d", &jegy);if(jegy == 1) printf("Elgtelen");
else if(jegy == 2) printf("Elgsges");else if(jegy == 3) printf("Kzepes");
else if(jegy == 4) printf("J");else if(jegy == 5) printf("Jeles");
else printf("Tves beolvass");
A switchutasts szintaxisa:switch(< szelektor >)
{case : ; [ break; ]
case : ; [ break; ]...case : ; [ break; ][default ;]
}Megjegyzsek:
a szelektor brmilyen egsz tpus kifejezs lehet, a case-konstansok (k1, k2, . . . , kn) egszkonstansok, a break utasts (opcionlis) befejezi a switch utastst (3.5.1. alfe-
jezet).Lssuk, hogyan mkdik a switchutasts.
Kirtkeldik a szelektor-kifejezs.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
40/267
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
41/267
C_Programozas 2008/6/2 17:13 page 45 #41
3.3. DNTSI UTASTSOK 45
case 4 : printf("*");case 3 : printf("*");case 2 : printf("*");
case 1 : printf("*");}
3.3.3. Kitztt feladatok
Megjegyzs. Mivel a vals szmok nem mindig trolhatk pontosana szmtgp memrijban, ezrt a velk vgzett mveletek alkalm-val szmtsi hibk addhatnak. Ebbl kifolylag kt vals szm egyen-lsgnek vizsglatakor azA = Balak helyett hasznljuk|A-B| < alakot,ahol a pontossg, amellyel dolgozunk. Pldul = 0.0001 esetn azsszehasonlts hrom tizedes pontossggal fog trtnni.
1. Rajzoljuk fel logikai smkkal az albbi programrszleteket!a) if( F1 )
if( F2 ) U2 ;else U1 ;
b) if( F1 ){if( F2 ) U2 ;}else U1 ;
2. rjunk programot, amely beolvas ngy vals szmot, s megszmol-ja, hny negatv !
3. rjunk programot, amely beolvas egy ngyjegy termszetes szmot,s sszeadja kln a pros, illetve pratlan szmjegyeit!
4. rjunk programot, amely beolvas ngy tjegy termszetes szmot,megszmolja, melyikben tallhat tbb 5-s szmjegy, s kir egy megfelelzenetet! (Hasznljunklongvltozt a szmok eltrolsra.)
5. rjunk programot, amely beolvas egy ngyjegy termszetes szmot,s kiszmtja a prmszmjegyeinek szmtani kzept!
6. rjunk programot, amely beolvas ngy vals szmot, s rendezi ketcskken sorrendbe az albbi stratgik szerint:
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
42/267
C_Programozas 2008/6/2 17:13 page 46 #42
46 3. UTASTSOK
a b c d
13 26 5 4
a b c d
1 2 34 5
6
7. rjunk programot, amely a koordintival megadott P1, P2, P3 pon-tokrl eldnti, hogy egy egyenesen tallhatk-e! A kollinearits felttele:
x1 y1 1x2 y2 1x3 y3 1
= 0.
8. rjunk programot, amely egy, a cscspontjainak koordintivalmegadott hromszgrl eldnti, hogy egyenl szr-e!
9. Olvassuk be egy hromszg 3 oldalt cm-ben (egy oldal legtbb255 cm lehet)! Amennyiben szerkeszthet e hrom adatbl hromszg,szmtsuk ki a terlett!
10. Adott kt szakasz (AB, CD) a vgpontjaik koordinti ltal.Dntsk el, hogy metszik-e egymst, s ha igen, llaptsuk meg, melyikpontban!
tlet: A metszs felttele, hogy ne legyenek prhuzamosak, s az A,illetve B pontok legyenek a CD egyenes klnbz oldalain, valamint a C,
illetve D pontok az AB egyenes ms-ms oldaln. Kt pont akkor van egyegyenes klnbz oldalain, ha koordintikat behelyettestve az egyenesegyenletbe, ellenkez eljel rtkeket adnak.
11. Olvassunk be egy karaktert! rjuk ki az ASCII kdjt, a kvetkezs az elz karaktert az ASCII tblban, valamint azt, hogy a beolvasottkarakter nagybet-e vagy nem!
12. Olvassunk be egy karaktert, majd rjuk ki, hogy nagybet, kisbet,szm, specilis karakter vagy egyb!
13. Olvassunk be egy dtumot: v, h, nap. rjuk ki, hogy ez a dtumaz v hnyadik napja!
tlet: Helyezzk egy break nlkli switch tastsba a hnapokat, ezekfordtott sorrendje szerint.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
43/267
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
44/267
C_Programozas 2008/6/2 17:13 page 48 #44
48 3. UTASTSOK
3.2. bra. A whileciklus logikai smja. F felttel (logikai kifejezs); M ciklusmag; i igaz; h hamis
3.4.1. A whileciklus (ell tesztels ciklus)
Pszeudokd
amg vgezd
vge amg
C nyelven
while ()< utasts >;
Hogyan hajtdik vgre? Amg igaz a felttel, ismteld a magot!Rszletezve: kirtkeldik a felttel : ha igaz (Fi), vgrehajtdik a ciklusmag (M), jra kirtkeldik a felttel: ha igaz (Fi), ismt vgrehajtdik a
ciklusmag (M),...
jra kirtkeldik a felttel: ha hamis (Fh), befejezdik a ciklusu-
tasts.Tmren:Fi M Fi M Fi M . . . Fi M Fh (3.1)
Megjegyzsek: Ha azFfelttel mr kezdetben hamis, akkor az Mmag egyszer sem
hajtdik vgre. Ha a mag tbb utastsbl ll, C nyelven ssze kell fogni ket egyetlen
sszetett utastss. A mag vgrehajtsnak hatssal kell lennie a felttelre, klnben a
ciklus vgtelen ciklus.Plda vgtelen ciklusra:
k = 0 ; i = 0 ;
while (i
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
45/267
C_Programozas 2008/6/2 17:13 page 49 #45
3.4. CIKLUSUTASTSOK 49
/* attl, hogy k-t nveljk, i sosem lesz 10-nlnagyobb */
3.6. feladat. rjunk programot, amely egsz szmokat olvas be a bil-lentyzetrl nulla vgjelig, s kirja az sszegket a kpernyre.
Az sszegszmts technikja:1. definilunk egy vltozt (legyen s), amelyben az sszeget fogjuk
kpezni, s rtekt nullra lltjuk,2. sorra olvassuk be a szmokat (pldul egy x vltozba), s min-
deniket kzvetlenl a beolvass utn hozzadjuk az s sszeghez(s += x;).
Teht egyetlen vltozt hasznlunk, az x-et, s mindenik szmot ebbeolvassuk be. Mivel a kvetkez szmot rolvassuk az elzre, minden be-olvass utn a beolvasott rtket gymond t kell menteni s-be: (s += x).
Az albbi okfejts logikusan prbl rvezetni arra, miknt oldhat megezen feladat egy whileciklus segtsgvel.Mit kell csinlnia a szmtgpnek, miutn ltrehozta az s, illetve x
vltozkat? A szmtgpnek vgre kell hajtania az albbi mveleteket:
Is=0 Bex Tx!=0 Sx Bex Tx!=0 Sx Bex Tx!=0 Sx . . . Bex Tx==0 Kis, (3.2)
ahol:Is=0= inicializljuk az s vltozt 0-val,Bex = beolvasunk egy szmot az x vltozba,Tx!=0 = teszteljk (ellenrizzk) az x rtkt, hogy 0-tl klnbz-e,Tx==0 = teszteljk (ellenrizzk) az x rtkt, hogy 0-val egyenl-e,
Sx = hozzadjuk s-hezx-et: s += x,Kis = kirjuk az s rtkt.Mi lesz a ciklusfelttel? Mitl fgg, hogy kell-e folytatdnia az is-
mtlsnek vagy sem? Az x tesztelstl!Teht:
FTxA (3.1) megllapts alapjn a ciklus magvt kt tesztels kztti
utasts/utastsok kpezik.Teht:
MSx BexElvgezve a (3.2)-es mveletsorban a fenti helyettestseket, a
kvetkezt kapjuk:
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
46/267
C_Programozas 2008/6/2 17:13 page 50 #46
50 3. UTASTSOK
Figyelembe vve mindezt, me a feladat megoldsa logikai smval sC nyelven:
C nyelven
int s = 0, x;scanf("%d", &x);
while(x){
s += x;scanf("%d", &x);
}printf("S=%d",s);
3.4.2. A do whileciklus (htul tesztels ciklus)
3.3. bra.A do whilecikulus logikai smja. F felttel (logikai kifejezs); M ciklusmag; i igaz; h hamis
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
47/267
C_Programozas 2008/6/2 17:13 page 51 #47
3.4. CIKLUSUTASTSOK 51
Pszeudokd
vgezd
amg
C nyelven
do
;while ();
Hogyan hajtdik vgre? Ismteld a magot, amg igaz a felttel!Rszletezve: vgrehajtdik a ciklusmag (M), kirtkeldik a felttel: ha igaz (Fi), ismt vgrehajtdik a ciklus-
mag (M), jra kirtkeldik a felttel: ha igaz (Fi), ismt vgrehajtdik a
ciklusmag (M),
... jra kirtkeldik a felttel: ha hamis (Fh), befejezdik a ciklusu-
tasts.Tmren:
M Fi M Fi M Fi . . . Fi M Fh (3.3)
Megjegyzs. A mag egyszer mindenkpp vgrehajtdik! Klnbzik a Pascalrepeat untilciklustl, hiszen a ciklusbl val
kilps akrcsak a whileciklus esetben hamisgon trtnik.
3.7. feladat. Szmokat olvasunk be 1-tl 5-ig 0 vgjelig. rjuk ki, hogy
minden egyes szmnak, mint jegynek, milyen minsts felel meg!int jegy;do
{scanf("%d", &jegy);switch(jegy){
case 1 : printf("Elgtelen"); break;case 2 : printf("Elgsges"); break;case 3 : printf("Kzepes"); break;case 4 : printf("J"); break;case 5 : printf("Jeles"); break;
}
while (jegy != 0);}
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
48/267
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
49/267
C_Programozas 2008/6/2 17:13 page 53 #49
3.4. CIKLUSUTASTSOK 53
C nyelven, while ciklussalint n, k, i, x;
scanf("%d", &n);k = 0;i = 1;while (i
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
50/267
C_Programozas 2008/6/2 17:13 page 54 #50
54 3. UTASTSOK
i = 1;while ( i
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
51/267
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
52/267
C_Programozas 2008/6/2 17:13 page 56 #52
56 3. UTASTSOK
if (!x) break;if ( x < 0 ) { k 1 + + ; s + = x ; }else { k2 ++; p *= x;}
}if (k2) printf ("%d ", p);else printf("Nincs pozitv szm.");if (k1) printf ("%f", s / k1);else printf("Nincs negatv szm.");
Tanulsg: Ha az elvgzend mveletsor Fi M Fi M Fi M . . . Fi M Fhalak, akkor whileciklust clszer hasznlni.
Ha M Fi M Fi M Fi. . . Fi M Fh alak mveletsorra van szksgnk,akkor a do-while ciklus a kzenfekv. Mi a helyzet a kvetkez t-pus mveletsor esetn: M1FiM2M1FiM2M1Fi. . . FiM2M1Fh ? Br meg-valsthat while vagy do-while ciklusokkal is, knyelmesebb az albbiszerkezet:
vgtele-ciklusM1ha F akkor kiugrsvge haM2
vge vgtele-ciklus
3.5.2. A continueutasts
Acontinuehatsra awhile, illetvedo whileciklusok esetn megsza-kad a ciklusmag vgrehajtsa, s a ciklusfelttel kirtkelsvel folytatdik.
Teht nem ugrik ki a ciklusbl, csupn az aktulis tjrsbl.A for ciklus esetn flbehagyja a ciklusmag aktulis tjrst, vgre-
hajtja a < kif3 > kifejezs-utastst, majd a < kif2 > logikai kifejezsnekmint felttelnek a kirtkelsvel folytatja a ciklust.
3.11. feladat. Adott n termszetes szm. Szmtsuk ki a 0-tl kln-bz szmok szorzatt.
int n, x, i, p = 1, k = 0;scanf("%d", &n);for ( i = 1; i
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
53/267
C_Programozas 2008/6/2 17:13 page 57 #53
3.5. UGR UTASTSOK 57
}if (k) printf ("%d ", p);else printf("Nincs nem nulla szm.");
3.5.3. A gotoutasts
Szintaxis:goto ;
Egy C program (egy adott fggvnyen bell; lsd 9. Fejezet) brmelyutastsa megcmkzhet, s egy goto utastssal oda lehet ugrani, hogyaz illet utastssal folytatdjon a program vgrehajtsa.
A cmkzs szintaxisa:: ;
Agotoutasts ltalban kerlend, mert hasznlata tkzik a struk-
turlt programozs alapelvvel, s ttekinthetetlenn teszi a programot.Mgis bizonyos esetekben (pldul tbbszrsen egymsba gyazott
ciklusokbl val kilpsre) elnys lehet a hasznlata.
3.12. feladat. Keressk meg 100 s 1000 kztt a legkisebb pthago-raszi szmhrmast.
for(a=100; a
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
54/267
C_Programozas 2008/6/2 17:13 page 58 #54
58 3. UTASTSOK
int i;for ( i = 0; i < 10; printf ("%d ", i++));
A fenti programrszlet kirja a szmjegyeket 0-tl 9-ig.
3.6. Megoldott feladatok
(A programkdokat krlvev keretek bal oldaln szemlletesen br-zoltuk az algoritmusok ciklusvzt.)
1. rjunk programot, amely beolvas kt termszetes szmot, s kirjaaz els szm szmjegyeinek az sszegt s a msodik szm szmjegyeineka szorzatt.
A program kt egyms utni ciklust tartalmaz, teht ciklusvza azalbbi mdon brzolhat:
int x, y, s = 0, p = 1;scanf("%d", &x);while (x){
s + = x % 1 0 ;x /= 10 ;
}scanf("%d", &y);while (y){
p *= y % 10 ;y /= 10 ;
}
printf("S=%d\nP=%d", s, p);
2. rjunk programot, amely vletlenszeren generl egsz szmokat a[-20, 20] intervallumbl, amg eltallja a nullt, majd rjuk ki a generltprmek sszegt.
Megjegyzs. A rand() fggvny vletlenszeren generl egy ter-mszetes szmot a [0, RAND_MAX) intervallumbl. A feladat megoldsakt egymsba gyazott ciklust felttelez.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
55/267
C_Programozas 2008/6/2 17:13 page 59 #55
3.6. MEGOLDOTT FELADATOK 59
int x, s = 0, prim, i;srand(time(0)); /
* inicializlja a
vletlenszm genertort */for( x = rand() % 41 - 20; x; x = rand() % 41 - 20){
if (x < 0) x = -x;if (!x || x==1) prim = 0;else
{prim = 1;for(i = 2; i 1 egsz szm akkor prm, ha nincsosztja a 2,3,...,[sqrt(x)] halmazban.
Tanulsg:A vletlenszm-generls felttelezi a# include ,illetve az srand(time(0)); programsorokat.
3. rjunk programot, amely generlja s kirja az albbi szmsorozatelsntagjt:
1, 1, 2, 2, 1, 2, 3, 3, 3, 1, 2, 3, 4, 4, 4, 4, . . .
int i, j, n, k = 0;
scanf("%d", &n);for( i = 1; i
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
56/267
C_Programozas 2008/6/2 17:13 page 60 #56
60 3. UTASTSOK
Magyarzat: Csoportostjuk a szmsorozat elemeit: azi-edik csoport-ban az els i termszetes szmot kveti (i 1)-szer az i rtk.
A kls ciklus csoportrl-csoportra lpeget vgtelen ciklus.Az els bels ciklus ellltja az 1, 2, . . . , irszsorozatot.A msodik bels ciklus kir (i 1)darab i szmot.A k vltoz szmolja a kirt rtkeket. Ha kelrin-et a gotoutasts
segtsgvel befejezzk a szmgenerlst.4. rjunk programot, amely beolvasntermszetes szmot, s addig
csomagolja mindeniket nmagba, mg egyszmjegyek lesznek. rjukki az gy kapott csomagokat. Csomagolson azt rtjk, hogy a szmothelyettestjk a szmjegyeinek sszegvel.
Ciklusvza:
Top Down mdszer: fokozatosan finomtjuk a megoldst.
int i, n, x, s;scanf("%d", &n);for( i=1; i 10){
* Szmtsuk ki s-ben xszmjegyeinek sszegt. *x = s ;
}
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
57/267
C_Programozas 2008/6/2 17:13 page 61 #57
3.6. MEGOLDOTT FELADATOK 61
/* Szmtsuk ki s-ben xszmjegyeinek sszegt. */
s = 0 ;while (x > 0){
s += x % 10;x /= 10;
}
A megolds egy programban:
C nyelven
int i, n, x, s;scanf("%d", &n);
for( i = 1; i 10){
s = 0;while (x > 0)
{s += x % 10;x /= 10;
}x = s;
}printf("A csomag:%d\n",x);
}
5. rjunk programot amely ellltja a 0, 1, 1, 2, 3, 5, 8, 13 . . . gy-nevezett Fibonacci szmsorozatot. (f0 = 0, f1 = 1, fn = fn1 + fn2, han> 1).
tlet: Hasznlunk hrom vltozt:ue- az utols eltti ellltott Fibonacci szm. (kezdetben 0)u- az utols ellltott Fibonacci szm. (kezdetben 1)uj- a kvetkez Fibonacci szm. (uj= u + ue)Minden lpsben frisstjk az u s ue vltozk rtkeit (ue = u, az
utolsbl lesz utols eltti; u = uj, az jonnan ellltottbl utols lesz)
int u, ue, uj, i, n;
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
58/267
C_Programozas 2008/6/2 17:13 page 62 #58
62 3. UTASTSOK
scanf("%d", &n);ue = 0; printf("0 "); // a nulladik Fibonacci szmu = 1; printf("1 "); // az elso Fibonacci szm
for(i=2; 1
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
59/267
C_Programozas 2008/6/2 17:13 page 63 #59
3.7. ELEMI ALGORITMUSOK SSZEFOGLALSA 63
sszeg = sszeg + szmvge minden
kir sszegvge algoritmus
Egy termszetes szm szmjegyeinek szorzata:Algoritmus szmjegyekszorzata
szorzat = 1beolvas szmamg szm > 0 vgezd
szorzat = szorzat * (szm MOD 10)szm = szm DIV 10
vge amg
kir szorzatvge algoritmus
3.7.2. Adott tulajdonsg elemek megszmolsa
Egynelem vals szmsorozat egsz rtk elemeinek megszmolsa:Algoritmus egszszmlls
szmll = 0beolvas nminden i = 1,n vgezd
beolvas szmha szm = [szm] akkor
szmll = szmll + 1vge ha
vge minden
kir szmllvge algoritmus
3.7.3. tlagszmts
Nulla vgjel szmsorozat pros elemeinek tlaga:Algoritmus prosoktlaga
szmll = 0sszeg = 0beolvas szmamg szm 0 vgezd
ha szm MOD 2 = 0 akkor
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
60/267
C_Programozas 2008/6/2 17:13 page 64 #60
64 3. UTASTSOK
sszeg = sszeg + szmszmll = szmll + 1
vge habeolvas szm
vge amgha szmll > 0 akkor
kir sszeg/szmllklnben
kir "Nincs pros szm."vge algoritmus
3.7.4. Adott tulajdonsg elem ltezsnek ellenrzse
Ellenrizzk, hogy van-e teljes ngyzet egy n elem szmsorozatban!
tlet:A kvetkezkppen ellenrizzk, hogy teljes ngyzet-e egy szm:indulva nulltl, addig lpegetnk teljes ngyzetrl teljes ngyzetre, mgvagy eltalljuk, vagy tlpjk az illet szmot.
Algoritmus ngyzetellenorzskm = 0beolvas nminden i = 1,n vgezd
beolvas szmj = 0amg j * j < szm vgezd
j = j + 1vge amg
ha j * j = szm akkorkm = 1
vge ha
vge minden
ha km = 0 akkorkir "Nincs teljes ngyzet."
klnben
kir "Van teljes ngyzet."vge algoritmus
3.7.5. Adott tulajdonsg elem megkeresse
Nulla vgjel szmsorozatban keressnk meg egy adott szmot!
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
61/267
C_Programozas 2008/6/2 17:13 page 65 #61
3.7. ELEMI ALGORITMUSOK SSZEFOGLALSA 65
Algoritmus keress1beolvas keresettbeolvas szmsorszm = 1amg szm 0 s szm keresett vgezd
beolvas szmsorszm = sorszm + 1
vge amg
ha szm 0 akkorkir sorszm
klnben
kir "A ", keresett, " nem tallhat meg."vge ha
vge algoritmus
Megjegyzs. Ha tbbszr is elfordul a keresett szm a szmsorozat-ban, akkor az els elforduls helyt adja meg. Ha valamennyi elfordulshelyt ki szeretnnk ratni, akkor az algoritmus a kvetkez:
Algoritmus keress2beolvas keresettbeolvas szmsorszm = 0amg szm 0 vgezd
beolvas szmsorszm = sorszm + 1ha szm = keresett akkor
kir sorszm
vge ha
vge amg
ha sorszm = 0 akkorkir "A ", keresett, " nem tallhat meg."
vge ha
vge algoritmus
3.7.6. Legnagyobb s legkisebb elem rtknek meghatrozsa
Egynelem szmsorozat maximumnak meghatrozsa.tlet: Kijellm maximumnak az els szmot, majd valahnyszor
rkezik egy nagyobb rtk, frisstem a max vltoz tartalmt.Algoritmus legnagyobbrtk
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
62/267
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
63/267
C_Programozas 2008/6/2 17:13 page 67 #63
3.7. ELEMI ALGORITMUSOK SSZEFOGLALSA 67
ha szm1 > szm2 akkorszm1 = szm1 - szm2
klnben
szm2 = szm2 - szm1vge ha
vge amg
kir szm1vge algoritmus
3.7.9. Legkisebb kzs tbbszrs meghatrozsa
Kpeznk kt sszeget, az sszeg1-et szm1 rtkekbl, az sszeg2pedig szm2 rtkekbl. Addig adjuk hozz a kisebb sszeghez jra sjra a megfelel szmot, amg a kt sszeg egyenl nem lesz. Ez az rtk
lesz a kt szm lkkt-je. (Szemlltetsl: a legkisebb kzs tbbszrs aza legkisebb rtk, amilyen magas plet gy szm1, mint szm2 mrettglkbl felpthet; amg a kt plet nem egyforma a kisebbikre tesznkegy megfelel tglt)
Algoritmus LegKisebbKzsTbbszrsbeolvas szm1, szm2sszeg1 = szm1sszeg2 = szm2amg sszeg1 sszeg2 vgezd
ha sszeg1 < sszeg2 akkorsszeg1 = sszeg1 + szm1
klnben
sszeg2 = sszeg2 + szm2vge ha
vge amg
kir sszeg1vge algoritmus
3.7.10. Egy szm tkrzse
Tekintjk a szm szmjegyeit fordtott sorrendben s felptnkbellk egy j szmot, a tkrszmot.
Algoritmus Tkrzsbeolvas szmtkrszm = 0
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
64/267
C_Programozas 2008/6/2 17:13 page 68 #64
68 3. UTASTSOK
amg szm > 0 vgezdtkrszm = tkrszm * 10 + (szm MOD 10)szm = szm DIV 10
vge amg
kir tkrszmvge algoritmus
3.8. Kitztt feladatok
1. Generljuk a kvetkez szmsorozatok esetben az elsn elemet,s egy msik megoldssal a sorozatn-edik elemt:
a) 1, 2, 3, 4, 5, . . .b) 1, 3, 5, 7, .. .
c) 0, 2, 4, 6, 8, . . .d) 2, 3, 5, 7, 11, 13, 17, 19, ...e) 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, . . .f) 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, . . .g) 1, 2, 1, 3, 2, 1, 4, 3, 2, 1, ...h) 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, ...i) 2, 3, 3, 4, 4, 4, 5, 5, 5, 5, ...
j) 0, 1, 2, 1, 2, 2, 3, 2, 3, 3, 3, 4, 3, 4, 4, 4, 4, 5, . . .k) 1, 1, 2, 2, 1, 2, 3, 3, 3, 1, 2, 3, 4, 4, 4, 4, . . .2. Szmtsuk ki a kvetkez kifejezsek rtkt:a) E1 = 1 + 2 + 3 +. . .+n
b) E2 =1 + 2 3 + 4 5 + 6 +. . .+ (1)n
nc) E3 = 1 2 + 3 4 + 5 6 +. . .+ (2n 1) 2nd) E4 = 1/(1 + 2) 2/(2 + 3) 3/(3 + 4) . . . n/[n+ (n+ 1)]e) E5 =2 + 3 5 + 7 11 + 13 17 + 19 . . . (n-edik tag)f) E6 =1/1 + ( 1 2)/(1+2) (1 2 3)/( 1 + 2 + 3 ) + . . . + (1)n(1
2 3 . . . n)/(1 + 2 + 3 +. . .+n)g) E7 = 1+2+34+567+89101112+1314 . . . (n-szer)h) E9 = 1/2 + 4/3 + 9/5 + 16/7 + 25/11 + 36/13 +. . . (n-edik tag)3. Egy szmsorozat elemein vgezzk el az albbi feladatokat:sszeg-, tlag-, szorzatszmts, szmoljuk meg a prosok, illetve
pratlanok szmt, ellenrizzk, hogy tartalmaz-e teljes ngyzetet, llapt-suk meg a minimum rtkt, az els minimum pozcijt, az utols min-
imum pozcijt, szmtsuk ki a prosok mdijt, a pratlanok maxi-mumt, a prmek szmt!
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
65/267
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
66/267
C_Programozas 2008/6/2 17:13 page 70 #66
70 3. UTASTSOK
11. brzoljuk a kpernyn azF(x) = (sinx)/xfggvnyt a [-2, 2]intervallumon gy, hogy a fgglegesen futxtengely mentn a megfelel
koordintj pontokba egy * karaktert helyeznk! Rajzoljuk ki az xtengelyt is!12. Olvassuk be egy sakkfigura (vezr, kirly, bstya, fut, huszr,
gyalog) aktulis koordintit a sakktbln! rjunk programot, amely kirjaa sakkfigura ltal tmadhat mezket!
13. rjunk programot, amely for ciklussal szmtja ki az mn rtkt,ahol az m egy vals szm, az n egsz tpus!
14. rjuk ki azokat az 500-nl kisebb, legalbb ktjegy prosszmokat, amelyekben a tzesek helyn pratlan szm ll!
15. Adott egy kr a skban kzppontjnak s sugarnak koordintiltal. rjunk programot, amely megszmllja, hogy hny darab egsz ko-ordintkkal jellemezhet koordintapont esik a krn bellre!
16. Olvassunk be tanulmnyi tlagokat, s hatrozzuk meg a megfelelminstseket: kitn [9,5010], jeles [99,50), j [89), kzepes [78),elgsges [4,507), elgtelen [14,50).
Megjegyzs. A 1720 feladatokban hasznljuk ki a scanf s printffggvnyek formz karakterei nyjtotta lehetsgeket.
17. Olvassunk be decimlis szmokat nulla vgjelig, s alaktsuk ok-tliss (8-as szmrendszer) ket!
18. Olvassunk be decimlis szmokat nulla vgjelig, s alaktsuk hex-adecimliss ket !
19. Olvassunk be hexadecimlis szmokat nulla vgjelig, s alaktsukdecimliss ket !
20. Olvassunk be oktlis szmokat nulla vgjelig, s alaktsuk dec-
imliss ket!21. Olvassunk be binris szmokat nulla vgjelig, s alaktsuk dec-
imliss ket!22. Olvassunk be 1000-nl kisebb decimlis szmokat nulla vgjelig,
s alaktsuk binriss ket!23. Olvassunk be termszetes szmokat a billentyzetrl, s szmoljuk
ki az tlagukat! A szmsor vgt kt egyms utni 0 jelezze!24. rjunk programot, amely beolvas 20 vals szmot, s megllaptja
a leghosszabb szigoran nvekv sszefgg rszsorozat sszegt!25. rjunk programot, amely beolvasnegsz szmot, s kirja a szom-
szdos szmok klnbsgt!
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
67/267
C_Programozas 2008/6/2 17:13 page 71 #67
3.8. KITZTT FELADATOK 71
26. Adott egy termszetes szm. Hatrozzuk meg a szm szm-jegyeinek szorzatt, sszegt, tlagt, a legkisebbet, a legnagyobbat,
valamint a pros, a pratlan s a prmszmjegyek szmt.27. Oldjuk meg a 42. feladatot ndarab egsz szm esetben!28. Oldjuk meg a 42. feladatotndarab vletlenszeren generlt egsz
szmra a (200, 3000) intervallumbl !29. Adott egy termszetes szm, kpezzk a fordtott szmot!30. Hny olyan hromjegy egsz szm van, amely prm, s amelynek
a fordtottja is prm?31. Adott egy termszetes szm, kpezzk azt a szmot, amelyet gy
kapunk, hogy felcserljk az els s utols szmjegyeit.32. Hny olyan hromjegy egsz szm van, amely prm s a belle
az elbbi mdon kpzett szm is prm?33. Adott egy n elem szmsorozat. Szmoljuk meg, hogy a 2-es
szmrendszerbeli alakjaikban szmonknt s sszesen hny 1-es s hny 0van!34. Olvassunk be pozitv egsz szmokat hexadecimlis alakban 0 vg-
jelig, s llaptsuk meg a szmsorozat rendezettsgt (egyenl elemekblll-e, nvekv, cskken vagy rendezetlen)! A nvekv, illetve a cskkenrendezettsgnl az egyenl szmokat is megengedjk. Ha a sorozatrlmenet kzben kiderl, hogy rendezetlen, fejezzk be a bevitelt!
35. rjuk ki az 1 m-nl kisebb trfogat, 10 cm-enknt nvekv sugargmbk trfogatt!
36. rjuk ki az angol bc sszes nagybetjt nvekv, majd cskkensorrendben!
37. Olvassunk be egy dtumot: v, h, nap! rjuk ki, hogy ez a dtum
az v hnyadik napja!38. Rajzoljunk adott mret X-eket a kpernyre! A mreteket a
rajzols eltt olvassuk be, s amikor 0 mretet olvastunk, a program befe-jezdik.
39. Tegynk a kperny kzepre egy jelet, majd fel, le, balra, jobbranyilak segtsgvel mozgassuk a kpernyn! A jelet a kpernyrl ne en-gedjk kimenni, s az kezdetben hzzon maga utn vonalat! Az gomb hatsra, ha eddig volt vonalhzs, ne legyen, ha nem volt, legyen,-re a program fejezdjn be.
40. rjunk programot, amely 0 vgjelig olvas be szmokat! A bevittszmot csak akkor fogadjuk el, ha az elz szmtl val eltrs (a kt szm
klnbsge abszolt rtkben) annak 20%-nl nem nagyobb.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
68/267
C_Programozas 2008/6/2 17:13 page 72 #68
72 3. UTASTSOK
41. Generljunk vletlenszm-genertorral hromjegy szmokat,amg olyat tallunk el, amelynek szmjegyei cskken sorrendben vannak!
rjuk ki sorszmozva a generlt szmokat!42. Generljunk vletlenszm-genertorral szmokat az int tar-tomnybl, amg olyat tallunk el, amelynek szmjegyei tet alakot r-nak le (egy pontig nvekednek, majd cskkennek)! rjuk ki sorszmozva agenerlt szmokat!
43. Adott egy ncscspont sokszg a cscsai (az ra jrsnak sor-rendjben) koordinti ltal. rjuk ki a sokszg terlett!
Spoligon=12
ni=1
xi yixi+1 yi+1 ,
ahol jells szerint a kpzeletbeli n+1 -edik pont koordinti:(x1, x2).
44. Adott n esetn hatrozzuk meg az n-nl nagyobb legkisebb prmrtkt.45. Hatrozzuk meg az n1 s n2 termszetes szmok kz es iker-
prmeket. (ps qiker-prmek, ha prmek, s p q= 2,amennyibenp > q)46. Szmtsuk ki egy szemly kort napokban kifejezve. (Adott a
szletsi dtuma s az aktulis dtum)47. Adott n s m termszetes szmok. rjuk ki az albbi szmsorozat
negymsutnni elemt, az m-edik elemmel kezdden.1, 2, 3, 2, 5, 2, 3, 7, 2, 4, 3, 2, 5, 11, 2, 3, 4, 6, 13, ...(Minden sszetett szmot helyettestnk a sajt osztival)48. Adott n s m termszetes szmok. rjuk ki az albbi szmsorozat
negymsutni elemt, az m-edik elemmel kezdden.
1, 2, 3, 4, 2, 5, 6, 2, 3, 7, 8, 2, 9, 3, 10, 2, 5, 11, ...(Minden sszetett szm utn beszrjuk a prm osztival)49. Adott n s m termszetes szmok. rjuk ki azt az n n mret
mtrixot, amelynek elemei (soronknti bejrs szerint) azonosak az albbiszmsorozatn2egymsutni elemvel, azm-edik elemmel kezdden.
1, 2, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3, 2, 3, 3, 3, 2, ...(Minden prm szmot 2-essel s minden sszetett szmot 3-assal
helyettestettnk)50. Adott n s m termszetes szmok. rjuk ki azt az n n mret
mtrixot, amelynek elemei (soronknti bejrs szerint) azonosak az albbiszmsorozat els n2egymsutni elemvel.
1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, ...
(Minden szmot helyettestettnk a szmjegyeivel)
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
69/267
C_Programozas 2008/6/2 17:13 page 73 #69
3.8. KITZTT FELADATOK 73
51. Adott n s m termszetes szmok. rjuk ki azt az n n mretmtrixot, amelynek elemei (soronknti bejrs szerint) azonosak az albbi
szmsorozatn2egymsutni elemvel, az m-edik elemmel kezdden.1, 2, 3, 4, 2, 5, 6, 2, 3, 7, 8, 2, 4, 9, 3, 10, 2, 5, 11, ...(Minden sszetett szm utn beszrtuk a sajt osztit)52. Adott n termszetes szm p1, p2,dots,pn szmrendszerekbe-
li brzolsa. Hatrozzuk meg a legnagyobb szmot, illetve a szmoksszegtqalap szmrendszerben.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
70/267
C_Programozas 2008/6/2 17:13 page 74 #70
4. FEJEZET
KIFEJEZSEK
Egy kifejezsopertorokat soperandusokat tartalmaz. Egy opertorazt rja el, hogy milyen mveletet kell elvgezni a megfelel operandu-sokon. A mveletek vgrehajtsnak a sorrendjt az opertorokprioritsa(elsbbsge, precedencija) adja meg. Azonos priorits opertorok esetnltalban balrl jobbra hajtdnak vgre a mveletek, de lteznek olyanopertorok is, amelyek esetben jobbrl balra. Az implicit sorrendet felllehet brlni akrcsak a matematikban zrjelezssel (csak kerek zr-
jelek hasznlhatk).A 4.1. tblzat a C nyelv opertorait tartalmazza prioritsuk szerint
cskken sorrendben. Egyesekkel mr tallkoztunk, msokkal ebben a fe-jezetben ismerkednk meg, a tbbivel pedig ksbbi fejezetekben.
4.1. tblzat.Prioritstblzat
Opertorok Sorrend azonos
priorits esetn
( ) [] -> . balrl jobbra! ++ -- - (tpus) * & sizeof jobbrl balra* / % balrl jobbra
+ - balrl jobbra> balrl jobbra< < = > > = balrl jobbra==!= balrl jobbra& balrl jobbra balrl jobbra| balrl jobbra&& balrl jobbra|| balrl jobbra?: jobbrl balra= += -= *= /= %= = &= |= = jobbrl balra, balrl jobbra
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
71/267
C_Programozas 2008/6/2 17:13 page 75 #71
4. KIFEJEZSEK 75
Alapelvnek szmt, hogy a kt operandus opertorok operandusainakazonos tpusaknak kell lennik ahhoz, hogy a mvelet vgrehajtdjon. Ez
a tpus lesz az eredmny tpusa is. s ha nem azonosak? Implicit tpuskon-verzira kerl sor valamelyiknl, vagy ppensggel mindkettnl, az albbiszablyok szerint:
1. Aritmetikai konverzia) Els lps: minden rvid tpus (char, short) int tpusv
konvertldik.b) Msodik lps: a kisebb rtktartomny tpus igazodik a
nagyobb rtktartomnyhoz.
int => unsigned => long => unsigned long => float =>double => long double
Figyelem! A signed char int tpusv konvertlsakor eljel-
kiterjeszts trtnik.Pldul, ha egy char vltoz (amely ltalban signed) rtke -2(11111110), akkor miutn tpusa inttpuss konvertldott, a bel-s brzolsa (1111111111111110), az rtke pedig ugyancsak -2lesz (feltteleztk, hogy azint tps 2 byte-on van trolva).
2. rtkadsesetn mindig a jobb oldal igazodik a bal oldalhoz.Figyelem! Ha a jobb oldal nagyobb rtktartomny tpus, akkor az
rtkads informcivesztssel jrhat.Plda:
i n t a = 1 , b = 2 ;char c1, c2 = 15;float f = 1;double d = 3.14;
Mi lesz az albbi kifejezs tpusa, ht a c1 vltoz rtke?
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
72/267
C_Programozas 2008/6/2 17:13 page 76 #72
76 4. KIFEJEZSEK
Teht a kifejezs tpusa charlesz, a c1 rtke pedig 64.
4.1. A kifejezsek jobb (Rvalue) s bal (Lvalue) rtke
Egy = ; hozzrendels esetn a vltoznak acmvel dolgozunk, a -nek viszont az rtkvel. A vltozcmre eltroljuk a kifejezs rtkt. Teht egy hozzrendels bal oldalncsakis olyan kifejezs jelenhet meg, amely egy konkrt memriacmen ltezobjektumra vonatkozik. Az ilyen kifejezsre azt mondjuk, hogy van balrtke. Ilyen kifejezsek a vltozk. Azon kifejezsekrl, amelyek egy hoz-zrendelsnek csakis a jobb oldaln szerepelhetnek, azt mondjuk, hogycsakjobb rtkkvan. A vltozknak pldul van bal rtkk is (a cmk)s jobb rtkk is (az rtkk).
Plda:i n t a = 1 , b = 2 , c = 3 ;a = a + b ; /* Helyes, mert aza vltoznak van bal rtke */a + b = a ; /* Helytelen, mert aza + bkifejezsnek nincs bal
rtke */c = a ; /* Helyes, mert a c vltoznak van bal rtke */
Az a + b kifejezsnek azrt nincs bal rtke, mert nem olyan objek-tum, ahova el lehetne trolni az rtkads jobb oldaln lv a vltoz
rtkt. Teht nem szerepelhet egy rtkads bal oldaln, a jobb oldalnviszont igen.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
73/267
C_Programozas 2008/6/2 17:13 page 77 #73
4.2. KONSTANSOK 77
A kifejezsekben szerepl operandusok alapveten vltozk, konstan-sok (llandk) s fggvnyek lehetnek. A vltozkrl mr beszltnk, a
fggvnyekrl ksbb lesz sz, kvetkezzenek ht a konstansok.
4.2. Konstansok
Ahogy erre a nevk is utal, a konstansok rtke a vltozkkal ellen-ttben nem vltoztathat meg a program futsa kzben.
4.2.1. Egsz tpus konstansok
Az egsz tpus konstansok megjelenhetnek programjainkban 10-es(decimlis), 8-as (oktl) vagy 16-os (hexadecimlis) szmrendszerben.
Pldk:0, 7, 19, 25432 (10-es szmrendszerben)0, 013, 0257 (8-as szmrendszerben)0x1a ,0x234, 0XAB2F(16-os szmrendszerben)
Mivel 65 nyolcas (oktl) szmrendszerben 101, tizenhatos (hexa) szm-rendszerben pedig 41, az albbi egsz konstansok azonosak:
65 0101 0X41Teht azzal jelezzk, hogy egy konstans nyolcas, illetve tizenhatos
szmrendszerben van, hogy 0-t, illetve 0x-et vagy 0X-et runk elje.Megjegyzs. Nincs negatv egsz konstans a C-ben. A negatv szmok
a (mnusz) opertornak eljelknt val alkalmazsval kpezhetk.
Pldul az int x = -1;
definciban a mnuszjel opertor, az 1
-espedig egsz konstans.
4.2.1.1. Az egsz konstansok tpusai
Minden egsz konstans, amely belefr azinttartomnyba,inttpus.Amelyek nem frnek bele az int tartomnyba, de belefrnek az unsignedinttartomnyba, azok unsigned inttpusak. Amelyek nem frnek beleaz unsigned int tartomnyba, de belefrnek a long int tartomnyba,azok long int tpusak. Az ennl is nagyobbak nyilvn unsigned longinttpusak.
A fenti szably szerinti implicit tpus fellbrlhat explicit mdon,
gynevezetttpusszuffixekkel. A szuffixek jelentse:
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
74/267
C_Programozas 2008/6/2 17:13 page 78 #74
78 4. KIFEJEZSEK
uvagy U unsigned intlvagy L long intulvagy UL unsigned long int
Plda:1 - int tpus 1-es1U - unsigned int tpus 1-es1L - long int tpus 1-es1UL - unsigned long int tpus 1-es
4.2.2. Vals tpus konstansok
Minden vals konstans implicit double tpus, de ez fellbrlhatexplicit mdonF (float), illetve L (long) szuffixekkel.
Pldk:3.14, -17.65, 1., 1.0, 0.1, .1, -0.025e-1,-12.6E2(doublekonstansok)-1.F(floatkonstans)0.01E+5L(long doublekonstans)Megjegyzs. A 0.01E+5Lrtke 0.01 * 105 = 1000.0L.
4.2.3. Karakter tpus konstansok
Klnbz mdokon hivatkozhatunk a karakter tpus konstan-sokra is.
1. A megjelenthet karakterekre gy hivatkozunk, hogy aposztrfokkz rjuk: A, a, 0, 9, !, +,
2. Mind a 256 karakterre lehet hivatkozni az ASCII kdja1
ltal akvetkezkppen: \ooo, vagy \xhh, ahol ooo s hh a karakterASCII kdja nyolcas, illetve tizenhatos szmrendszerben.
3. Nhny fontosabb nem megjelenthet karakterre gynevezett es-cape szekvencik ltal is hivatkozhatunk:
1 A karakterkszlet karakterei sorszmozva vannak 0-tl 255-ig (ASCII karak-tertbla). Ezt a tblzatbeli sorszmot nevezzk a karakterek ASCII kdjnak.Hasznos megjegyezni nhny gyakran hasznlt karakter kdjt.
Pldul:0..9 - 48..57
A..Z - 65..90a..z - 97..122
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
75/267
C_Programozas 2008/6/2 17:13 page 79 #75
4.2. KONSTANSOK 79
\a BEL cseng\b BS visszalps\f FF lapdobs\n LF j sor (soremels)\r CR kocsi vissza\t HT / TAB vzszintes tabultor\v VT fggleges tabultor\\ \ backslash\ aposztrf\" " idzjel\ ? ? krdjel
Megjegyzsek: Az ENTER letsekor gyakran kt karakter tovbbtdik a
memriba, a CR s az LF. Ezek visszhangja a kpernyn a kurzor jsorba ugrsa.
A karakter tpus konstansok a C-ben egsz tpusak. Pldul az Akarakter bels brzolsa (amennyiben azinttpus 2 bjton van trol-va): 0000000001000001. Teht sizeof(A) = sizeof(int).A karakterek beolvassra a billentyzetrl hrom sajtos fggvny
ltezik.Plda:
char c1, c2, c3;c1 = getchar(); /* pufferelt beolvass kpernyvisszhanggal;
ENTER-t vr */c2 = getche();/* direkt a memriba olvas kpernyvisszhang-
gal; nem vr ENTER-t */c3 = getch(); /* direkt a memriba olvas kpernyvisszhang
nlkl; nem vr ENTER-t */Csak a getchar()ANSI standard.A getche() s getch() hasznlata ignyli az #include
programsort.A pufferelt, illetve direkt olvass rszletes lersa vgett lsd a 11.1. s
11.2. alfejezeteket.Karakterolvass llomnybl.
Plda:char c;
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
76/267
C_Programozas 2008/6/2 17:13 page 80 #76
80 4. KIFEJEZSEK
c = fgetc(fp);/* fp llomnymutat */Karakterrs kpernyre/llomnyba.
Plda:char c = A;putchar(c);fputc(c, fp);/* fp llomnymutat */
Karakterolvass/rs nyilvn lebonyolthat a scanf/printf, illetve afscanf/fprintffggvnyek segtsgvel is, hasznlva a %c formzkarak-tert (rszletek vgett lsd a 11.2. alfejezetet).
4.2.4. Karakterlnc tpus konstansok
A karakterlnc tpus konstansok idzjelek kztt jelennek megprogramjainkban. Pldul a scanf formzsoraknt vagy az fopen fg-
gvny paramtereiknt karakterlnc tpus konstansokat hasznltunk.Rszletesebben a karakterlncokkal foglalkoz fejezetben beszlnk rluk.Plda:
"Alma", "He\s strong", "kt\nsor", "a + b", "%d%d"Megjegyzsek:
"a"nem azonosa-val, ugyanis az els egyelem karakterlnc, amsodik pedig karakter.
A hossz karakterlnc tpus konstansok tbb sorba trdelhetk a \karakter segtsgvel:
"kt sorba trt hossz\karakterlnc konstans"
Az egyms utn elhelyezked karakterlnckonstansokat egyesti a
fordt:"a ketto" "egy lesz"
4.2.5. Szimbolikus konstansok
A szimbolikus konstansok hasznlata ttekinthetbb teszi a pro-gramot, s megknnyti az utlagos vltoztatst. A constmdost jelzv-el (tpusminstvel), a #define direktvval, illetve az enum tpus segt-sgvel hozhatk ltre. Az enumtpus az sszetett tpusok keretn bell, a#definedirektva pedig a makrkkal foglalkoz fejezetben kerl rszletesbemutatsra.
A const
tpusminst egy vltozdefinilst konstansdefinilssalakt. Az gy ltrejtt konstans azonban nem igazi konstans, hanem
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
77/267
C_Programozas 2008/6/2 17:13 page 81 #77
4.3. OPERTOROK 81
rsvdett tett vltoz. Helyfoglals trtnik szmra a memriban,akr a vltozk esetben, st pointeren keresztl (teht indirekt mdon)
meg is vltoztathat az rtke (5. fejezet).Az albbi plda bemutatja a consts a #definehasznlatnak md-jt.
Plda:const float PI = 3.14;#define PI 3.14
Megjegyzs. A szimbolikus konstansok nevt nagybetkkel szoks rni.Nhny elre definilt szimbolikus konstans: RAND_MAX, CHAR_MAX,
CHAR_MIN, INT_MAX, INT_MIN, UINT_MAX, LONG_MAX, LONG_MIN,ULONG_MAX
Hasznlatuk ignyli az #include programsort.rtkeik vgett lsd a Help-et.
4.3. Opertorok
Az opertorok lehetnek egy, kt vagy hrom operandusak.
4.3.1. Aritmetikai opertorok
+ sszeads- kivons* szorzs/ oszts% osztsi maradk
A +, illetve - opertorok eljelknt is szerepelhetnek mint egyoperan-dus opertorok.
4.3.2. sszehasonltsi opertorok
==,!=, , =
Mivel a C-ben nincs logikai tpus, ezrt ha egy sszehasonlts ered-mnye igaz, akkor az sszehasonltsnak mint kifejezsnek az rtke egyinttpus 1-es (igaz), ellenkez esetben inttpus 0-s (hamis).
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
78/267
C_Programozas 2008/6/2 17:13 page 82 #78
82 4. KIFEJEZSEK
Pldul az 1 == 0kifejezsnek az rtke 0, mert hamis. Viszont a 13> 10kifejezsnek az rtke 1, ugyanis igaz.
4.3.3. Logikai opertorok
! tagads (1 operandus)&& logikai s (2 operandus)|| logikai vagy (2 operandus)
Az albbi pldk esetben vegyk figyelembe a C nyelv azon jel-legzetessgt, hogy minden nem nulla rtk logikai rtke igaz, a nullalogikai rtke pedig hamis:
Kifejezs Logikai rtke
!5 0!!5 1!0 15 && 6 10 && 13 00 || 13 10 || 0 02 || 3 1!(1 = = 1) 07 == 8 || 8 == 7 07 == 7 && 8 == 8 1
De Morgan-kpletek:! ( a & & b ) ! a | | ! b,
illetve
! ( a || b ) ! a &&!b.Megjegyzs. Figyelem! Egy logikai kifejezs kirtkelse csak addig
folytatdik, amg az eredmny egyrtelmv vlik. Ebbl problma add-hat, ha nem vagyunk figyelmesek.
Pldul az (a && b++) kifejezs kirtkelsekor, ha az artke0, akkora kifejezs rtke automatikusan 0 lesz, s nem kerl sor a bnvelsre.
-
7/22/2019 C Nyelv Es Programozas Kinyomtatva Debrecen
79/267
C_Programozas 2008/6/2 17:13 page 83 #79
4.3. OPERTOROK 83
4.3.4. Bitenknti opertorok (csak egsz tpus opertorokraalkalmazhatk)
Az operandus/operandusok bels brzolsnak bitjein kerl vgreha-jtsra az operandus ltal elrt mvelet.
bitenknti balra/jobbra lptets (2 operandus)& bitenkntis(2 operandus)| bitenkntivagy(2 operandus) bitenkntikizr vagy(2 operandus) bitenkntitagads(1 operandus)Akizr vagyakkor igaz, ha az operandusok (a megfelel bitek) kln-
bz logikai rtkek.A kvetkez tblzat pldkon keresztl, szemlletesen mutatja be,
miknt mkdnek a bitenknti opertorok.
Pldk:unsigned char a=1, b=3;
Kifejezs Bels brzols rtk
a 00000001 1b 00000011 3a > 1 00000000 0a