c nyelv es programozas kinyomtatva debrecen

Upload: emese-suekei

Post on 09-Feb-2018

235 views

Category:

Documents


1 download

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