You are on page 1of 312

A C# programozsi nyelv a felsoktatsban

Programozs tanknyv

Dr. Kovcs Emd


Hernyk Zoltn
Radvnyi Tibor
Kirly Roland

1/312
Tartalom
Tartalom ..................................................................................................................................... 2
Trtneti ttekint ...................................................................................................................... 7
Els genercis programozsi nyelvek: GPI KD........................................................... 8
Msodik genercis programozsi nyelvek: ASSEMBLY ................................................. 9
Vltozk az assembly nyelvben ........................................................................................... 10
Vezrlsi szerkezetek az assembly nyelvben ....................................................................... 13
Eljrshvs az assembly nyelvben ...................................................................................... 14
Tbb modulbl ll programok az assembly nyelvben ....................................................... 14
Harmadik genercis programozsi nyelvek: PROCEDURLIS NYELVEK ................ 15
Az els nagyon fontos vltozs az eljrs fogalmnak bevezetse............................... 15
A msik fontos vltozs a vltoz fogalmnak finomodsa: ........................................... 15
A harmadik fontos vltozs a tpusrendszer bvthetsge........................................... 16
A negyedik fontos vltozs a vezrlsi szerkezetek bevezetse ................................... 17
Az tdik fontos vltozs a hardware fggetlensg...................................................... 17
Hrom-s-fl genercis programozsi nyelvek: OBJEKTUM ORIENTLT NYELVEK
18
Negyedik genercis programozsi nyelvek: SPECIALIZLT NYELVEK .................. 18
tdik genercis programozsi nyelvek: MESTERSGES INTELLIGENCIA
NYELVEK 18
A programozsi nyelvek csoportostsa ............................................................................... 18
A programozsi nyelveket ms szempontbl vizsglva egy msik csoportosts fedezhet
fel:......................................................................................................................................... 18
Imperatv (procedurlis) nyelvek: .................................................................................... 18
Applikatv (funkcionlis) nyelvek:................................................................................... 19
Logikai nyelvek:............................................................................................................... 19
Objektum-orientlt nyelvek: ............................................................................................ 19
Futtat rendszerek ................................................................................................................ 19
Bevezets A Microsoft.NET ................................................................................................. 22
Hell Vilg! .......................................................................................................................... 28
Feladatok: ............................................................................................................................. 36
Alap I/O ................................................................................................................................ 37
Az alapvet Input/Output ..................................................................................................... 38
Programozsi feladatok ........................................................................................................ 53
Szelekci alapszint................................................................................................................ 54
A logikai tpus vltoz ....................................................................................................... 55
A feltteles utasts............................................................................................................... 56
Az elgazs........................................................................................................................... 57
Nhny egyszer pldt a szelekci alkalmazsra. ............................................................ 58
Dntsk el egy szmrl, hogy pros-e! ............................................................................ 58
Oldjuk meg az egytthatival adott msodfok egyenletet! ............................................ 59
Megoldsra ajnlott feladatok .............................................................................................. 60
Elrt lpsszm ciklusok....................................................................................................... 61
Feladatok: ............................................................................................................................. 69
Vektorok! .............................................................................................................................. 71
Vektorok kezelse ................................................................................................................ 72
Tmb deklarlsa ............................................................................................................. 72

2/312
A tmb elemeinek elrse ................................................................................................ 73
A tmb elemeinek rendezse, keress a tmbben ............................................................ 74
Vektor feltltse billentyzetrl....................................................................................... 78
Vektor feltltse vletlenszm-genertorral..................................................................... 80
N elem vektorok kezelse................................................................................................... 81
sszegzs ......................................................................................................................... 81
Maximum s minimum kivlasztsa ................................................................................ 82
Eldnts ............................................................................................................................ 83
Kivlogats....................................................................................................................... 84
Dinamikus mret vektorok ................................................................................................. 86
Az ArrayList fbb jellemzi: ........................................................................................... 86
Az ArrayList fbb metdusai:.......................................................................................... 86
Feladatok dinamikus tmbre ............................................................................................ 87
Tbbdimenzis tmbk........................................................................................................ 92
Tovbbi megoldsra ajnlott feladatok ................................................................................ 96
Logikai ciklusok ................................................................................................................... 99
A ciklusok .......................................................................................................................... 100
A while ciklus................................................................................................................. 100
A break ........................................................................................................................... 104
A continue ...................................................................................................................... 105
A do while ciklus............................................................................................................ 105
A foreach ........................................................................................................................ 106
Programozsi feladatok ...................................................................................................... 108
Szelekci emelt szint! ......................................................................................................... 109
Szelekci haladknak ......................................................................................................... 110
Tovbbi megoldsra ajnlott feladatok .............................................................................. 116
Stringek kezelse.................................................................................................................... 117
A string tpus vltoz ....................................................................................................... 118
A string-ek mint vektorok .................................................................................................. 123
Programozsi feladatok ...................................................................................................... 126
Eljrsok alapfokon................................................................................................................ 127
Feladatok: ........................................................................................................................... 133
Fggvnyek rsa.................................................................................................................... 136
Feladatok: ........................................................................................................................... 141
Eljrsok s fggvnyek kzpfokon..................................................................................... 142
Feladatok: ........................................................................................................................... 147
Eljrsok s fggvnyek felsfokon ...................................................................................... 148
WinForm............................................................................................................................. 156
A Windows Formok ........................................................................................................... 157
Hibakezels ........................................................................................................................ 157
A try s a catch ............................................................................................................... 157
A finally blokk ............................................................................................................... 160
Kivtelek feldobsa ........................................................................................................ 161
Checked s unchecked ................................................................................................... 162
Programozsi feladatok ...................................................................................................... 163
j Projekt ksztse............................................................................................................ 164
Feladatok ............................................................................................................................ 170
A lthat komponensek, a kontrollok ................................................................................ 171
Button (Gomb) ................................................................................................................... 171
Label, Linklabel ................................................................................................................. 172

3/312
Textbox............................................................................................................................... 173
CheckBox ........................................................................................................................... 174
GroupBox ........................................................................................................................... 175
MainMenu .......................................................................................................................... 176
RadioButton ....................................................................................................................... 178
ComboBox ......................................................................................................................... 179
ListView ............................................................................................................................. 183
TreeView ............................................................................................................................ 186
TabControl ......................................................................................................................... 189
DateTimePicker komponens .............................................................................................. 191
MonthCalendar komponens ............................................................................................... 194
HorizontalScrollBar s VerticalScrollBar komponensek................................................... 197
Listbox................................................................................................................................ 199
Panel ................................................................................................................................... 200
PictureBox .......................................................................................................................... 201
Timer komponens............................................................................................................... 202
NumericUpDown ............................................................................................................... 203
ProgressBar ........................................................................................................................ 205
TrackBar ellenrzs............................................................................................................ 206
HelpProvider ...................................................................................................................... 207
ImageList............................................................................................................................ 211
RichTextBox ...................................................................................................................... 215
ToolTip............................................................................................................................... 218
ContextMenu...................................................................................................................... 220
NotifyIcon .......................................................................................................................... 222
StatusBar ............................................................................................................................ 223
ToolBar............................................................................................................................... 225
Formok hasznlata, formok tpusai .................................................................................... 228
A rendszer ltal biztostott zenetablakok hasznlata.................................................... 228
Modlis s nem modlis formok .................................................................................... 231
Dialgusok ......................................................................................................................... 234
A fontDialog................................................................................................................... 234
ColorDialog .................................................................................................................... 236
PrintPreviewDialog ........................................................................................................ 237
Fjl megnyitsa s mentse ............................................................................................ 238
MessageBox ................................................................................................................... 238
Feladatok ............................................................................................................................ 239
Tbbszl programozs...................................................................................................... 240
Feladatok ............................................................................................................................ 243
Grafikai alapok! .................................................................................................................. 244
A grafikus szoftver ............................................................................................................. 245
GDI+................................................................................................................................... 247
GDI+ osztly s interfsz a .NET-ben ............................................................................... 247
Nvterek, namespaces .................................................................................................... 247
A System.Drawing nvtr osztlyai s struktri .......................................................... 248
A Graphics osztly ......................................................................................................... 248
A GDI+ jdonsgai ............................................................................................................ 250
Gazdagabb sznkezels s szntmenetek lehetsge..................................................... 250
Antialising tmogats ..................................................................................................... 250
Cardinal Spline-ok.......................................................................................................... 251

4/312
Mtrix transzformcik .................................................................................................. 252
Sklzhat rgik (Scalable Regions)............................................................................ 252
Alpha Blending .............................................................................................................. 252
Sokkfle grafikus fjl formtum tmogatsa (Support for Multiple-Image Formats): .. 253
Nhny vltozs a GDI+ porgramozsban......................................................................... 254
Vonal rajzols GDI+ hasznlatval................................................................................ 254
Metdusok fellbrlsa (Method Overloading) ............................................................ 255
Tbb nincs a grafikus kurzornak aktulis pozicija (Current Position) ....................... 255
Sztvlasztott metdus a rajzolsra (Draw) s a kitltsre (Fill) ................................... 256
Regik ltrehozsa ......................................................................................................... 257
Interpolci s approximci ............................................................................................. 261
Hermit-grbe ...................................................................................................................... 261
Bzier-grbe ....................................................................................................................... 262
de Casteljau-algoritmus.................................................................................................. 262
A Bzier-grbe ellltsa Bernstein-polinommal ......................................................... 263
Bzier-grbe nhny tulajdonsgai ................................................................................ 263
Harmadfo Bzier-grbk.............................................................................................. 264
Kapcsold Bzier-grbk ............................................................................................. 265
Cardinal spline................................................................................................................ 267
Pontranszformcik............................................................................................................ 271
Homogn koordintk ........................................................................................................ 271
ttrs hagyomnyos Descartes koordintkrl homogn koordintkra:.................... 271
Visszatrs homogn koordintkrl Descartes koordintkra: .................................... 271
Ponttranszformcik........................................................................................................... 271
Els plda: ...................................................................................................................... 272
Msodik plda: ............................................................................................................... 273
GDI+ transzformcis metdusai....................................................................................... 274
Eltols:............................................................................................................................ 275
Elforgats az orig krl alfa szggel pozitv irnyba:.................................................. 275
Tkrzs: ........................................................................................................................ 275
Sklzs:......................................................................................................................... 276
Nyrs: ............................................................................................................................ 276
A koordinta rendszer transzformlsa s a Path hasznlata ............................................. 278
Grafikus kontnerek ........................................................................................................... 279
Adatok kezelse!................................................................................................................. 281
Az ADO.NET Adatkezels C#-ban ................................................................................... 282
SQL Server Enterprise Manager Az SQL Server s az MMC ........................................... 282
j elemek ltrehozsa .................................................................................................... 283
MS SQL szerver elrse C#-bl......................................................................................... 288
Bevezets az ADO.NET kapcsoldsi eszkzeihez....................................................... 288
Connection String........................................................................................................... 288
Kapcsolat ltrehozsa s megszntetse ........................................................................ 288
sszetett kapcsolatok (Pooling Connections) ................................................................ 289
Tranzakcik .................................................................................................................... 289
Bellthat kapcsolat tulajdonsgok............................................................................... 289
Kapcsolatok tervezskor a Server Explorer-ben ............................................................ 290
Kapcsolat tervezsi eszkzk Visual Studio-ban........................................................... 290
Kapcsolat ltrehozsa SQL Server-hez ADO.NET hasznlatval ................................. 290
Kapcsolat bontsa........................................................................................................... 291
ADO.NET kapcsolat objektumok ltrehozsa ............................................................... 291

5/312
Kapcsolat ltrehozsa ..................................................................................................... 291
Kapcsolat ltrehozsa SQL Server-hez .......................................................................... 292
SQL Server kapcsolat Server Explorer-ben ................................................................... 292
Kapcsolds SQL Server-hez az alkalmazsunkbl .......................................................... 292
Kapcsolds ltrehozsa vizulis eszkzkkel .............................................................. 292
Server Explorer-bl ........................................................................................................ 292
A DataTable osztly ........................................................................................................... 293
Szrs s rendezs az ADO.NET-ben............................................................................ 293
Szrs s rendezs a DataView objektum segtsgvel ................................................. 295
Az alaprtelmezett nzet ................................................................................................ 296
A RowFilter tulajdonsg ................................................................................................ 296
Rendezs a DataViewban............................................................................................... 296
Trolt eljrsok................................................................................................................... 302
Mi is az a Transact-SQL?............................................................................................... 302
Alapvet programozsi szerkezetek:.............................................................................. 302
Vltozk ......................................................................................................................... 302
Feltteles szerkezetek hasznlata ................................................................................... 303
CASE utastsok............................................................................................................. 304
While ciklusok................................................................................................................ 304
A CONTINUE utasts................................................................................................... 305
A BREAK utasts ......................................................................................................... 305
RETURN utastsok hasznlata ..................................................................................... 305
WAITFOR utastsok hasznlata ................................................................................... 305
RAISERROR utastsok hasznlata............................................................................... 305
KURZOROK hasznlata ................................................................................................ 306
Mint a pldaprogramban is lthat, a vltozk tpusa meg kell, hogy egyezzen a kinyert
sorok oszlopainak tpusval. .............................................................................................. 307
Fggvnyek hasznlata .................................................................................................. 307
Felhasznli fggvnyek ltrehozsa............................................................................. 308
Helyben kifejtett tblartk fggvnyek ...................................................................... 309
Tbbutastsos tblartk fggvnyek ......................................................................... 309
Trolt eljrsok ltrehozsa:........................................................................................... 310
Trolt eljrsok vgrehajtsa:......................................................................................... 311
Kioldk........................................................................................................................... 311

6/312
Programozs tanknyv

I. Fejezet

Trtneti ttekint

Hernyk Zoltn

7/312
A szmtstechnika trtnetnek egyik fontos fejezete a programozsi nyelvek
kialakulsa, trtnete, fejldse. A fejlds sorn a programozsi nyelvek
szintaktikja vltozott meg, elsegtve a programozsi hibk minl korbban
(lehetleg fordtsi idben) trtn felfedezst. Egy igazn j programozsi nyelven
nagyon sok hibafajta eleve el sem kvethet, msok knnyen elkerlhetek.

Egy j programozsi nyelv sokfle jellemzvel rendelkezik. Emeljnk ki nhnyat


ezek kzl:
- knnyen elsajtthat alapelvekkel rendelkezik,
- knnyen ttekinthet forrskd,
- knnyen mdosthat, bvthet a forrskd,
- nehz hibt elkvetni kdols kzben,
- knnyen dokumentlhat a kd.

A programozsi nyelveket genercikba lehet sorolni a fejlds bizonyos szakaszait


figyelembe vve:

Els genercis programozsi nyelvek: GPI KD

A szmtgpek a NEUMANN elveknek megfelelen a vgrehajtand program-


utastsokat a memriban troljk. A memria ma mr alapveten byte szervezs,
egyetlen nagy mret byte-sorozatnak tekinthet. Minden byte egy egsz szmot
jellhet, 0..255 rtktartomnybl. Ebbl az kvetkezik, hogy a mikroprocesszor
alapveten az utastsokat is szmoknak tekinti.

A gpi kd programozsi nyelvben az utastsokat szmkdok jellik. Amennyiben


az utastsnak vannak paramterei, gy azokat is szmknt kell megadni. A gpi
kdban ltez fogalom a regiszter, amely a mikroprocesszoron belli trlrekeszt
jell. Egy ilyen rekesz tartalma egy egsz szm lehet. A regisztereknek kttt nevk
van, pl. AX, BX, CX, DX. A 32 bites processzorokon a regiszterek nevei felvettk az
E eltagot (Extended AX regiszter EAX). Arnylag kevs regiszter ll
rendelkezsre (kevesebb mint 20 darab), s tbbnek specilis feladat volt, ezrt nem
lehetett akrmilyen clra felhasznlni. Kt szm sszeadst az albbi mdon kell
vgrehajtani:

1. Olvassuk be az els szmot az EAX regiszterbe a memribl.


2. Az EAX regiszterhez adjuk hozz a msodik szmot.
3. Az eredmnyt (az EAX regiszter j rtkt) troljuk a memria egy msik pontjn.

1. bra

Az utastsokat szmkdok jellik. Ezek a szmok 0..255 kztti egsz szmok. A


szmkdokat leggyakrabban hexadecimlis formban adjk meg. A bal oldali
oszlopban a memriacmeket adjuk meg (0044F02B,) ahol az adott gpi kd
utastst troljuk. A gpi kd utastsok a msodik oszlopban vannak (a 8B45F4

8/312
szmsorozat egyetlen gpi kd utastst (8B), valamint a paramtereit jelli: honnan
kell beolvasni az rtket az EAX regiszterbe (45,F4)).

A fentieken is ltszik, hogy a gpi kd programozsi nyelv nehzkes, nehezen


tanulhat. A ksz program nehezen megrthet, nem ttekinthet.

Sok ms htrnya mellett kln kiemelend, hogy a gpi kd programokat alkot


utastsok csak az adott mikroprocesszor szmra rthetek. Vagyis ms processzor
esetn az utastskdok is msok. Nemcsak szmkdjukban klnbznek, hanem
esetleg kevesebb vagy tbb utasts van, illetve ms-ms a paramterezse a
hasonl feladat utastsoknak. Ha egy gpi kdban programoz szmra egy msik
processzorra kellett programot rni, elszr mg el kellett sajttania a klnbsgeket.
Nyilvn az alapelvek maradtak, de az utastsok klnbzsge sok nehzsget
okozott.

A programoz szemszgbl a gpi kdban trtn programozs nagyon lass


folyamat. Aprlkosan lehet csak a programot felpteni. Az utastsok nagyon
alacsony szintek voltak, egy egyszer sszeads mvelet is - mint lttuk a fenti
pldn hrom utastsbl llt. Egy nagyobb rendszer elksztse olyan idignyes
feladat lenne, hogy inkbb csak rvidebb, egyszer programokat ksztettek benne a
programozk.

Elnyei persze akadnak ennek a nyelvnek is: a gpi kd utastsok segtsgvel


maximalizlhatjuk a programunk futsi sebessgt, vagy memria-kihasznltsgt
(vagy mindkettt egyszerre), hiszen megktsek nlkl felhasznlhatjuk a
mikroprocesszor minden lehetsgt, s szabadon hasznlhatjuk a memrit is.

Msodik genercis programozsi nyelvek: ASSEMBLY

A gpi kd programozsi nyelv htrnyai miatt j nyelvet kellett kifejleszteni.

Az ASSEMBLY nyelv els kzeltsben a megrthet gpi kd nyelve. Az


utastsok szmkdjait nhny bets (2-3-4 bets) n. mnemonikokkal
helyettestettk. Egy ilyen mnemonik (emlkeztet szcska) a gpi kd utasts
jelentstartalmra utalt. Pldul a memria-tartalom beolvassa egy regiszterbe
(bemozgats) az angol MOVE=mozgatni sz alapjn a MOV mnemonikot kapta. A
kt szm sszeadsa az angol ADD=sszeadni mnemonikot kapta. Az 1. brn a
harmadik oszlopban szerepelnek a gpi kd utastsok assembly nyelv megfeleli.

A MOV utasts nnmagban nem lefordthat gpi kdra, hiszen azt is meg kell
adni, hogy melyik memria-cm tartalmt kell betlteni melyik regiszterbe. Az utasts
egyik lehetsges formja MOV EAX,<memcm>. Ennek mr egyrtelmen megfelel
egy gpi kd utastskd (mov eax = 8B), a memriacmet pedig a tovbbi
szmkdok rjk le.

Ennek megfelelen az assembly nyelv egy adott mikroprocesszor adott gpi


kdjhoz kszlt el. Ezrt az assembly nyelv is processzor-fgg, de ezen a szinten
jabb fogalmak jelentek meg:

9/312
Forrskd: az assembly nyelv programot a CPU nem kpes kzvetlenl megrteni
s vgrehajtani. Az assembly nyelv programot egy szveges file-ban kell megrni
(forrskd), majd le kell fordtani gpi kd, n. trgyprogramra (object code).

Fordts: az a folyamat, amely kzben a forrskdot egy fordtprogram (compiler)


gpi kd utastsok sorozatra transzformlja.

Az assembly nyelv esetn ezt a fordtprogramot ASSEMBLER-nek neveztk. Az


assembler vgigolvasta a forrskdot sorrl-sorra, e kzben generlta a gpi kd
utastssorozatot - a mnemonikok alapjn ellltotta a megfelel gpi kd utasts
szmkdjt. Az assembler nem bonyolult program, hiszen a fordts egyszer
szablyok szerint mkdik.

Az ASSEMBLER a forrskd feldolgozsa kzben egyszer ellenrzseket is


elvgez. Amennyiben valamely mnemonikot nem ismeri fel (pl. a programoz
elgpelte), akkor a fordtsi folyamat lell, az assembler hibazenettel jelzi a hiba
okt s helyt a forrskdban. A forrskdban az olyan jelleg hibkat, melyek
slyossga folytn a fordts nem fejezhet be fordtsi idben trtn hibnak
nevezzk. Ennek oka ltalban a nyelv szablyai (szintaktikja) elleni vtsg, ezrt
ezt szintaktikai hibnak is nevezzk.

Az assembly nyelv programok forrskdja olvashatbb, mint a gpi kd, illetve


knnyebben mdosthat. Az assembler a program szintaktikai helyessgt ellenrzi
le, emiatt az els eszkznek is tekinthetjk, amelyet a programozk munkjnak
segtsre (is) alkottak.

A fordts ellenkez mvelete a de-compiling. Ennek sorn a gpi kd program-


vltozatbl a programoz megprblta visszalltani annak assembly nyelv
eredetijt. Erre sokszor azrt volt szksg, mert az eredeti forrskd elveszett, de a
programon mgis mdostani kellett. A gpi kd programok mdosthatsgnak
nehzsgt jelzi, hogy az assembly-programozk mr nem voltak hajlandk
kzvetlenl a gpi kdot mdostani, inkbb helyrelltottk az assembly forrskdot,
abban elvgeztk a mdostsokat, majd jra lefordtottk (generltk) a gpi kd
programot.

Ez a mvelet persze nmi vesztesggel jrt hiszen a tnyleges eredeti assembly


forrskdban tbbek kztt megjegyzsek is lehettek. Ezek a megjegyzsek a gpi
kd vltozatba nem kerltek bele, ezrt visszalltani sem lehet ket.

Ami viszont nagyon fontos lps a fordtprogramok megjelensvel megjelent


az igny ezek intelligencijnak fejldsre!

Vltozk az assembly nyelvben

Az assembly programokban a memria-cmekre azok sorszmval lehetett


hivatkozni. Egy 128Mb memrival szerelt szmtgpben 128*1024*1024 db

10/312
sorszmot lehet hasznlni, mivel a memria ennyi db byte-ot tartalmaz. A pldban
ezek a sorszmok a [0 .. 134.217.727] intervallumbl kerlnek ki1.

Az assembly programok sokszor tnyleges memriacmeket (sorszmokat)


tartalmaztak szmkonstansok formjban. Ez sok szempontbl nem volt elg
rugalmas:
- A szmok nem hordozzk a jelentsket, nehezen volt kiolvashat a
programbl, hogy a 1034-es memriacmen milyen adat van, mi az ott lv
rtk jelentse.
- A programban e memriacmek sokszor elfordultak. Ezrt a memriacmek
nem voltak knnyen mdosthatak.
- A memriacm alapjn nem dnthet el, hogy az ott trolt adat hny byte-ot
foglal el, ugyanis a memriacm csak a memriabeli kezdcmet jelli.

A helyzet javtsa rdekben a programozk elkezdtek konstansokat hasznlni a


programjaikban. Ezeket a programok elejre sszefoglal jelleggel, tblzat-szer
mdon rtk le:

FIZETES = 1034
ELETKOR = 1038
NYUGDIJAS = 1040

Ezek utn az assembly programokban az ADD EAX,[1034] helyett (ami azt jelentette,
hogy add hozz az [1034] memriacmen tallhat rtket az EAX regiszterben
ppen benne lev rtkhez) azt rhattk, hogy ADD EAX,[FIZETES]. Ez sokkal
olvashatbb forma, msrszt amennyiben a fizets rtkt mgsem az 1034-es
memriacmen kellett trolni (vltozs), akkor egyetlen helyen kellett csak trni a
program eleji tblzatban.

Ez az egyszer s logikus meggondols indtotta el a vltoz fogalmnak fejldst.


A fenti esetben a FIZETES volt az azonost, melyhez a programoz konstans
formjban rendelt hozz memriacmet helyet a memriban.

Mg fejlettebb assembler fordtk esetn a fenti tblzat az albbi formban is


felrhat volt:

FIZETES = 1034
ELETKOR = FIZETES+4
NYUGDIJAS = ELETKOR+2

Ebben az esetben mr kiolvashat volt a tblzatbl, hogy a FIZETES nvvel jellt


memriaterlet 4 byte-os trol hely volt, hiszen ekkora memria-szakasz
fenntartsa utn a kvetkez memriaterlet (ELETKOR elnevezssel) 4 byte-tal
tvolabbi ponton kezddik.

Ez a vltozat azrt is jobb, mert segti, hogy elkerljk kt trolterlet tfedst a


memriban (tlapols). Megakadlyozni nem tudja, hiszen amennyiben a fizets
trolsi ignye 8 byte lenne, akkor a fenti esetben az letkor mg tlgna a fizets

1
128*1024*1024-1

11/312
trlhelynek utols 4 byte-jra. Ennek persze a programoz az oka, aki rosszul rta
fel a tblzatot. Ha azonban a fizets trolsra 2 byte is elg lenne, akkor 2 byte-nyi
felhasznlatlan terlet keletkezne a memriban (ami szintn nem szerencss).

A fenti problmkon tl az assembler azt sem tudta ellenrizni, hogy a trlrekeszt


megfelelen kezeli-e a programoz a ksbbiekben:

MOV EAX, [FIZETES] // EAX 32 bites regiszter, 4 byte


MOV AX, [FIZETES] // AX 16 bites regiszter, 2 byte
MOV AL, [FIZETES] // AL 8 bites regiszter, 1 byte

A fenti utastsok mindegyike elfogadhat az assembly nyelv szintaktikai szablyai


szerint. Az els esetben a megadott memriacmrl 4 byte-nyi adat kerl be az EAX
nev regiszterbe. Msodik esetben csak 2 byte, harmadik esetben csak 1 byte. A
memria-beolvasst ugyanis a fogad regiszter mrete befolysolja. Amennyiben a
fizets 4 byte-on kerl trolsra, gy a msodik s harmadik utasts nagy
valsznsggel hibs, hiszen mirt olvasnnk be a fizetst tartalmaz szmsorozat-
nak csak az egyik felt?

Az ilyen jelleg hibkra azonban az assembler nem tudott figyelmeztetni, mivel


szmra a FIZETES csak egy memriacm volt. A helyes kezelsre a
programoznak kellett gyelnie. Az assembler nem is tudta volna ellenrizni a kdot
ebbl a szempontbl, hiszen nem volt informcija arrl, hogy mit is rt a
programoz fizets alatt.

Ezt a plusz informcit hvjk a programozsi nyelvben tpusnak.

A tpus sok mindent meghatroz. Tbbek kztt meghatrozza az adott rtk trolsi
mrett a memriban. A tpus ismeretben a fenti tblzat felrhat az albbi
formban:

DWORD FIZETES
WORD ELETKOR
BYTE NYUGDIJAS

A fenti tblzat szerint a FIZETES egy dupla-sz (DWORD), aminek helyignye 4


byte. Az ELETKOR egy szimpla sz (WORD), 2 byte helyigny. A NYUGDIJAS egy
byte, aminek helyignye (mint a neve is mutatja) 1 byte.

Amikor az ASSEMBLER-ek mr a fenti tblzatot is kezeltk, akkor mr kpesek


voltak a trterlet-cmeket automatikusan kiosztani. Az els azonost cmhez
kpest a primitv tpusnevek (dword, word, byte, ) trolsi ignyt ismervn
automatikusan nveltk a memriacmeket, s adtak rtket az azonostknak. Ezek
az rtkek tovbbra is memriacmek voltak, de az automatikus kioszts miatt a
memriaterletek tlapolsnak eslye mg kisebbre zsugorodott.

A fenti primitv tpusnevek mg nem jelltk az azonostk tnyleges tpust. A


fordt mindssze a trigny-szksglet kiszmtsra hasznlta fel. A hibs kezels
lehetsgt mg mindig megengedte, vagyis egy 4 byte-os helyigny rtknek mg
mindig szabad volt az egyik felt beolvasni, s dolgozni vele.

12/312
Nem voltak finom tpusnevek. Nem volt char, bool, short int, unsigned short int
tpusok. Ezek mindegyike 1 byte trolsi igny, csak ezen 1 byte-on hordozott
informci jelentsben trnek el. Mivel a jelentst a fordt mg nem kezelte, csak
egy olyan tpusnv volt, amelynek 1 byte volt a trolsi ignye.

Ennek megfelelen ezt mg nem tekinthetjk tnyleges tpusnvnek, mindssze


trolsi-igny nvnek.

A vltoz ms komponenseinek (lettartam, hatskr) kezelse is hinyzott az


assembly nyelvbl, s az assembler programokbl.

Vezrlsi szerkezetek az assembly nyelvben

Az assembly nyelv msik szegnyes tulajdonsga a vezrlsi szerkezetek hinya.


Lnyegben csak az albbi vezrlsi szerkezetek tallhatak meg:

- Szekvencia: a program utastsainak vgrehajtsa a memriabeli sorrend


alapjn trtnik.
- Felttlen vezrlstads (ugr utasts): a program folytatsa egy msik
memriabeli pontra tevdik t, majd attl a ponttl kezdve a vgrehajts jra
szekvencilis.
- Feltteles vezrlstads (feltteles ugr utasts): mint az egyszer ugr
utasts, de az ugrst csak akkor kell vgrehajtani, ha az elrt felttel teljesl.
- Visszatrs az ugr utastst kvet utastsra (azon helyre, ahonnan az
ugrs trtnt).

Ezekbl kellett sszerakni a programot. Egy egyszer elgazst ennek megfelelen


az albbi mdon kellett kdolni:

HA felttel AKKOR felttel


kirtkelse
Ut1
UGRS_HA felttel HAMIS CIMKE1-re
Ut2
UT1
KLNBEN UT2
Ut3
UGRS CIMKE2-re
Ut4
@CIMKE1:
HVGE UT3

folytats UT4

@CIMKE2:

folytats

A fentibl taln sejthet, hogy az assembly nyelv programbl kibogozni, hogy itt
valjban feltteles elgazs trtnt nem egyszer. Hasonl problmkkal jr a

13/312
ciklusok megtervezse s kdolsa is klnsen az egymsba gyazott ciklusok
esete.

Eljrshvs az assembly nyelvben

Az assembly nyelv elvileg ad lehetsget eljrshvsra is az albbi formban:

ELJARASHIVAS kiiras

@kiiras:

VISSZATRS_A_HVST_K VET_UTASTSRA

A kiiras itt valjban cmke (programsort jell nv), de megfelel az eljrsnv


primitv fogalmnak. A nevestett cmkk egy j nvvlasztssal, nagyon sokat
knnytenek a programkd olvashatsgn.

A problma nem is itt rejtzik, hanem hogy az eljrsnak hogyan adunk t


paramtereket? Illetve, ha ez nem eljrs, hanem fggvny, akkor hol kapjuk meg a
visszatrsi rtket? Illetve honnan tudjuk, milyen tpus adattal, rtkkel tr vissza
az adott fggvny?

A fenti krdsekre a vlaszokat maga az assembly nyelv nem tartalmazza.


Paramterek tadsra pldul tbb md is van csakgy mint a fggvnyek
visszatrsi rtknek visszaadsra. Ezeket a lehetsgeket maga a gpi kd
tartalmazza, s az assembly nyelv rtelemszeren tvette.

A programozk szvesen fejlesztettek ltalnos, jra felhasznlhat eljrsokat s


fggvnyeket, melyek segtsgvel a programok fejlesztsi ideje, s a tesztelsi ideje
is alaposan lervidlt. De ezek egymssal val megosztsa a fenti akadlyok miatt
nehzkes volt. Egy msik programoz ltal fejlesztett, nem megfelelen dokumentlt
eljrs felhasznlsa a kdban nha tbb energia felemsztsvel jrt, mint jra
megrni a szban forg eljrst.

Tbb modulbl ll programok az assembly nyelvben

A tbb modulra tagols azrt volt fontos, mert az assembly programok ltalban
nagyon hosszak voltak, msrszt az akkori szmtgpek mg nagyon lassak
voltak. Egy hossz forrskd fordtsa nagyon sok idbe kerlt. Ugyanakkor a
program jelents rsze a fejleszts kzben mr elkszlt, azt a programoz nem
mdostotta mivel a program mr msik pontjn jrt a fejleszts. Ezt a szakaszt
jra s jra lefordtani az assemblerrel felesleges id s energiapocskols volt.

Ezrt bevezettk a tbb modulbl trtn fordtst. Ekkor az assembler a fordtshoz


egy listt kapott, hogy mely forrskd-fileokbl tevdik ssze a project. Az assembler
a forrskd-modulokat egyenknt fordtotta le egy-egy trgykd (object) llomnyba.
Amennyiben a forrskdon nem trtnt mdosts, gy azt az assembler egy gyors
ellenrzssel szrevette, s nem generlta jra a hozz tartoz object kdot. gy

14/312
csak azon forrskdok fordtsa trtnt meg, melyek vltoztak az utols fordts ta.
Miutn az assembler vgzett a forrskdok fordtsval, egy msik, specilis
feladatot vgz program kvetkezett, a szerkeszt program (linker). A linker a sok
apr kis trgykd alapjn ksztette el a mkdkpes programot .

Ez jelentsen meggyorstotta a fordtst egyb htrnyok nlkl. St, a programozk


gy az jra felhasznlhat, ltalnos eljrsaikat kln kis kd-gyjtemnyben
troltk, s jabb project kezdse esetn eleve hozzcsatoltk a project forrskd-
listjhoz.

Ez tovbb erstette a vgyat az ltalnos cl eljrsok rsra, s egyms kztti


megosztsra. De az assembly nyelv ez irny kpessgeinek hinya ebben tovbbra
is komoly gtat jelentett.

A fentiek bizonytjk, hogy az assembly nyelv sok olyan lehetsget rejtett magban,
amely miatt megrdemli a kln genercis sorszmot. Ugyanakkor a nyelvi korltok
gtoltk a programozsi stlus fejldst.

Harmadik genercis programozsi nyelvek: PROCEDURLIS


NYELVEK

Az assembly nyelv hinyossgainak kikszblsre szlettek a harmadik


genercis nyelvek.

Az eljrsorientlt (procedurlis) nyelvek sok szempontbl elvi, szemlletbeli vltst


kveteltek meg az assembly programozktl. A frissen felnvekv programoz
nemzedk, akik nem hordoztak magukban rossz szoksokat s hibs
beidegzdseket azonnal s gyorsan tvettk ezeket a szemlletbeli elrsokat.

Az els nagyon fontos vltozs az eljrs fogalmnak bevezetse.

Az eljrs (s fggvny) nyelvi elemm vlt. Az eljrsoknak neve volt, s rgztett


paramterezse (formlis paramterlista). Ez lerta, hogy az eljrs meghvsa
sorn milyen adatokat, rtkeket kell az eljrs szmra tadni. Ezen tl a nyelv
rgztette az tads mdjt is. Ezzel elhrult az ltalnos cl eljrsok rsnak
legjelentsebb akadlya. Ugyanakkor, hasonl jelents lpsknt a fordtprogram
az eljrs hvsakor ellenrizte, hogy a megadott sszes adatot tadjuk-e az
eljrsnak (aktulis paramterlista). Ez jabb fontos mrfldk a fordtprogram
intelligencijnak fejldsben.

A msik fontos vltozs a vltoz fogalmnak finomodsa:

A vltoznak van:
- Neve (azonostja), ezzel lehet a kdban hivatkozni r.

15/312
- Tpusa (mely meghatrozza a memriabeli helyignyt, s trolsi (kdolsi)
mdjt).
- A tpus ezen tl meghatrozza az adott nev vltozval elvgezhet mveletek
krt is (numerikus tpus vltozval vgezhet az oszts, szorzs, kivons,
sszeads, ), mg logikai tpusval a logikai mveletek (s, vagy, xor, )).
- A kifejezsekben szerepl adatok s vltozk tpusait a fordtprogram elemzi,
sszeveti, s ellenrzi a kifejezs tpushelyessgt.
- A programban lehetetlenn vlt a vltoz trhelynek rszleges kezelse (a vltoz
rtkt reprezentl byte-ok csak egy rsznek kiolvassa, mdostsa). Ezzel is
nagyon sok tipikus programoz hiba kiszrhetv vlt.
- A vltozkat ltalban ktelezen deklarlni kellett. Ennek sorn a programoz
bejelentette a fordtprogram szmra rthet formban, hogy az adott azonost
(vltoznv) alatt mit rt (milyen tpust). A deklarci helye tovbbi informcikat
jelent a fordtprogram szmra meghatrozza a vltoz lettartamt s hatskrt
is.

A vltoz lettartama:
- statikus: a vltoz a program indulsnak pillanattl a futs vgig a vltoz
folyamatosan ltezik, s vltozatlan helyen lesz a memriban.
- dinamikus: a vltoz a program futsa kzben jn ltre s sznik meg (akr
tbbszr is).

A statikus vltozk fontosak az adatok megrzse szempontjbl. A fontos, sokig


szksges adatokat statikus vltozkban troljuk. A dinamikus vltozk a
memriaterlet gazdasgos felhasznlsa szempontjbl fontosak a vltoz csak
addig legyen a memriban, amg fontos. Amint feleslegess vlt megsznik, s a
helyre ksbb ms vltoz kerlhet.

A vltoz hatskre:
- globlis: a program szvegben tbb helyen (tbb eljrsban is) elrhet,
felhasznlhat.
- loklis: a program szvegben a vltoz felhasznlsa helyhez kttt, csak egy
meghatrozott programrszben (krlhatrolt szegmensben) hasznlhat fel.

A globlis vltozk minden esetben statikusak is. A dinamikus vltozk pedig


ltalban loklisak. A dinamikus vltoz ltrehozsa s megsznse ezen loklis
terlethez ktdik amikor a program vgrehajtsa elri ezt a pontot, belp erre a
terletre, akkor a vltoz automatikusan ltrejn. Amikor a program vgrehajtsa
elhagyja ezt a terletet, akkor a vltoz automatikusan megsznik, helye felszabadul
a memriban.

A harmadik fontos vltozs a tpusrendszer bvthetsge

A magas szint programozsi nyelvek eleve adott tpusokkal kszltek. A nyelvi


alaptpusokbl tovbbi (felhasznl ltal definilt) tpusokat lehet kszteni. Ezen
tpusok a meglv tpusok szktsei (felsorols tpus, rsztartomny-tpus), vagy
sszetett algebrai adatszerkezetek is lehetnek (pl. struktrk, vektorok, listk, ).

16/312
A negyedik fontos vltozs a vezrlsi szerkezetek bevezetse

Az assembly nyelv ugrutastsaibl megszervezhet vezrlsi szerkezetek krt


cskkentettk, s rgztettk azokat:
- szekvencia: az utastsokat a forrskdban rgztett sorrendben kell
vgrehajtani.
- szelekci: feltteles elgazs (pl. a ha akkor klnben szerkezetek).
- iterci: adott programrsz ismtlse (elrt lpsszm ciklus, logikai
felttelhez kttt ciklusok, halmaz alap ciklusok, ).

A vezrlsi szerkezetek e formja ttekinthet, egyszer, knnyen olvashat kdot


eredmnyez. Mills bizonytotta, hogy minden algoritmus kdolhat a fenti hrom
vezrlsi szerkezet hasznlatval, gy az ugr utastsok szksgtelenn vltak.

Termszetesen, amikor a fordtprogram a gpi kd vltozatot generlja, akkor a


fenti szerkezeteket ugr utastsok formjban valstja meg hiszen a gpi kdban
csak ezek szerepelnek.

Az tdik fontos vltozs a hardware fggetlensg.

A procedurlis nyelvek mr nem processzor fggek. A fordtprogram ismeri az


adott szmtgp processzornak gpi kdjt s a procedurlis nyelven megrt
magas szint kdot az adott gpi kdra fordtja. Amennyiben a programot ms
platformon is szeretnnk futtatni, gy a magas szint forrskdot az adott
szmtgpre rt fordtprogrammal jra kell fordtani a forrskd brmilyen
vltoztatsa nlkl.

A memriaterlet kiosztst a fordtprogam vgzi a vltoz-deklarcik alapjn. A


program egy adott pontjn mindig egyrtelmen megadhat a vltoz hatskrk
figyelembevtelvel, hogy mely vltozk rhetk el, s melyek nem. A dinamikus
vltozk ltrehozst s megszntetst a fordtprogram ltal generlt kd
automatikusan vgzi. A tpusokhoz tartoz trhely-ignyt a fordtprogram kezeli,
kizrt a memria-tlapols s nem keletkeznek fel nem hasznlt memriaterletek.
Emiatt nagyon sok lehetsges programozsi hiba egyszeren megsznt ltezni.

Fennmaradt azonban egy nagyon fontos problma: a felhasznl ltal definilt


tpusokhoz nem lehet opertorokat definilni, emiatt kifejezsekben nem lehet az j
tpusokat felhasznlni. Vagyis a felhasznli adattpus kevesebbet r, mint a gyri,
eleve ltez elemi tpus. Ezen a szinten a nyelv fejldse nem haladhatja meg ezt a
pontot.

17/312
Hrom-s-fl genercis programozsi nyelvek: OBJEKTUM
ORIENTLT NYELVEK

Az objektum orientlt programozsi nyelvek (OOP nyelv) ezen a ponton jelentenek


fejldst. A felhasznl sokkal egyszerbben s szabadabban ksztheti el a sajt
tpusait. Meglv tpusok tovbbfejlesztsvel (rklds) kevs munkval kszthet
j tpusokat. A sajt tpusaihoz (ltalban) kszthet opertorokat is (melyeknek
jelentst termszetesen le kell programozni). Ezek utn a sajt tpus szinte minden
szempontbl egyenragv vlik a nyelvi alaptpusokkal. A sajt tpusokhoz nem csak
opertorokat rendelhet, hanem megadhat fggvnyeket s eljrsokat is, amelyek az
adott tpus adatokkal vgeznek valamilyen mveletet. Mivel ezen fggvnyek s
opertorok az adott tpushoz tartoznak, a tpus rszeinek tekintendk. Az egy tpusba
sorolt adattrol vltozk (mezk), a hozzjuk tartoz mveletek s opertorok
csoportjt (halmazt) osztlynak nevezzk.

Egy OOP nyelvben teht szintn megtallhatak az eljrsok s fggvnyek, illetve a


paramterek, vltozk. A vezrlsi szerkezetek is a megszokott hrom formra
plnek (szekvencia, szelekci, iterci). Ezrt az OOP nyelvek inkbb csak
szemlletmdban msok (melyik eljrst s fggvnyt hova rjuk meg), mint kdolsi
technikkban. Ezrt az OOP nyelveket nem tekintik kln genercinak.

Negyedik genercis programozsi nyelvek:


SPECIALIZLT NYELVEK

A negyedik genercis nyelvek specilis feladatkrre kszlt nyelvek. Ezen nyelvek


jellemzje, hogy nagyon kevs nyelvi elemmel dolgoznak, s nagyon egyszer,
szinte mondatszeren olvashat utastsok fogalmazhatk meg. Erre j plda az
SQL nyelv, amely elssorban adatbzis-kezelsre van felksztve.

tdik genercis programozsi nyelvek:


MESTERSGES INTELLIGENCIA NYELVEK

A mestersges intelligencia programozsi nyelvekkel elvileg az emberi gondolkods


lersa trtnne meg, gyakorlatilag e nyelvek kutatsa, fejlesztse mg folyamatban
van.

A programozsi nyelvek csoportostsa


A programozsi nyelveket ms szempontbl vizsglva egy msik csoportosts
fedezhet fel:

Imperatv (procedurlis) nyelvek:

18/312
Ezen nyelvek kzs jellemzje, hogy a program fejlesztse rtkad utastsok
megfelel sorrendben trtn kiadsra koncentrldik. Az rtkad utasts
baloldaln egy vltoz ll, a jobb oldaln pedig egy megfelel tpus kifejezs. A
szelekci (elgazs) csak azt a clt szolglja, hogy bizonyos rtkad utastsokat
csak adott esetben kell vgrehajtani. A ciklusok pedig azrt vannak, hogy az
rtkad utastsokat tbbszr is vgrehajthassunk. Az rtkad utastsok sorn
rszeredmnyeket szmolunk ki vgl megkapjuk a keresett vgeredmnyt.

Applikatv (funkcionlis) nyelvek:

A funkcionlis nyelveken a kiszmoland kifejezst adjuk meg, megfelel


mennyisg bemen adattal. A programoz munkja a kifejezs kiszmtsnak
lersra szolgl. A program futsa kzben egyszeren kiszmtja a szban forg
kifejezst.

Egy funkcionlis nyelvben nincs vltoz, ltalban nincs ciklus (helyette rekurzi
van). rtkad utasts sincs, csak fggvny visszatrsi rtknek megadsa
ltezik. A funkcionlis nyelvek tipikus felhasznlsi terletnek a
termszettudomnyos alkalmazsok tekinthetek.

Logikai nyelvek:

Az ilyen jelleg nyelveken tnyeket fogalmazunk meg, s logikai lltsokat runk le.
A program ezen kvl egyetlen logikai kifejezst is tartalmaz, melynek rtkt a
programozsi nyelv a beptett kirtkel algoritmusa segtsgvel, a tnyek s
szablyok figyelembevtelvel meghatroz.

A logikai nyelvek tipikus felhasznlsi terlete a szakrti rendszerek ltrehozshoz


kapcsoldik.

Objektum-orientlt nyelvek:

Az OOP nyelveken a program mkdse egymssal klcsnhatsban ll


objektumok mkdst jelenti. Az objektumok egyms mveleteit aktivljk,
melyeket interface-ek rnak le. Ha egy mvelet nem vgrehajthat, akkor az adott
objektum a hv flnek szabvnyos mdon (kivtelkezels) jelzi a problma pontos
okt.

Futtat rendszerek

A fordt programok ltal generlt trgykdokat a szerkeszt program nti vgleges


formba. Az elkszlt futtathat programot ezen idpont utn az opercis rendszer
kezeli, s futtatja.

19/312
A futtats hromflekppen trtnhet:

Direkt futtats: a generlt kd az adott mikroprocesszor gpi kd utastsait


tartalmazza. Ennek megfelelen az utastssorozatot az opercis rendszer
egyszeren tadja a mikroprocesszornak s megadja a program kezd pontjt. A
processzor e pillanattl kezdve nllan vgrehajtja a kvetkez utastst, kveti az
ugrsi pontokat, rja s olvassa a memria hivatkozott terleteit anlkl, hogy tudn
valjban mit csinl a program az adott ponton. A processzor felttlenl megbzik a
programkdban, vita nlkl engedelmeskedik s vgrehajtja a soron kvetkez
utastst.

Ezen mdszer elnye a maximlis vgrehajtsi sebessg. Ugyanakkor jegyezzk


meg, hogy a gpi kd szintjn nincs tpusfogalom, s szinte lehetetlen eldnteni,
hogy az adott utasts a program feladata szempontjbl helyes-e, szksges-e,
hibs-e.

Mivel a memriban (a nagy byte-halmazban) az adatok terletn is byte-ok


tallhatak, ezrt elvileg elkpzelhet, hogy a program vezrlse egy hibs ugr
utastsnak ksznheten ttr egy ilyen terletre, s az adatokat gpi kd
utastsokknt prblja rtelmezni. Ez persze valsznleg nem fog menni. Vagy
valamely utasts paramterezse lesz rtelmezhetetlen, vagy egy olyan kdot fog
tallni a processzor, amely nem rtelmezhet utastskdnak. Ekkor a processzor
hibs mkds llapotra tr t, amely a szmtgp lellshoz (lefagys) is
vezethet. A mai processzorok mr vdekeznek ez ellen, s ilyen esemny
detektlsakor specilis hibakezel rutinok futtatsra trnek t.

A hiba bekvetkezse ellen vdelmet jelent, hogy a mai programok elszeparlt


terleteken troljk a programkdot, s az adatokat. A hibs ugrutasts emiatt
felfedezhet, hiszen egy adatterlet belsejbe irnyul. A processzor mr ekkor
lelltja a program futst, s ttr a hibakezel llapotra.

Msik vdelmi mechanizmus szerint a kd-terlet nem rhat, csak olvashat. gy a


processzor kpes felfedezni a hibs rtkad utastsokat, melyek egy mvelet
eredmnyekppen kapott rtket egy olyan memriaterletre rn be, ahol
utastskdok vannak. Ez meggtolja a programkd futs kzbeni mdostst
(nmdost kd) amely egy idben igen elterjedt volt. Ma mr e mdszert inkbb
csak a vrusok s egyb krtkony programok hasznljk.

Interpreterrel futtats: a fordtprogram ekkor nem generl kzvetlenl


vgrehajthat gpi kd utastsokat, hanem egy kztes kdot, ahol az eredeti
programozsi nyelv utastsai vannak szmkdokk tfordtva, a paramterei is mr
feldolgozott, egyszerstett formban kdoltak. Ezt a trgykdot egy futtat rendszer
(az interpreter) futs kzben utastsonknt elemzi, s hajtja vgre az elrt
szablyok szerint.

Az interpreteres rendszerekben a futtat rendszer a lefordtott kdot mg vgrehajts


eltt elemzi, szksg esetn az utols pillanatban korriglja, pontostja azt (pl.
vltozhivatkozsok). Ilyen rendszerekben az is megoldhat, hogy a vltozkat nem
kell deklarlni explicit mdon a program szvegben. A futtat rendszer kitallja az

20/312
adott programsorhoz rve, hogy milyen vltozkra van szksge, s pontosan e
pillanatban hozza csak ltre. Ezen kvl az is megoldhat, hogy a vltoz tpusa futs
kzben derljn csak ki, vagy akr menet kzben tbbszr meg is vltozzon. A
futtat rendszer az adott utastshoz rve ellenrzi hogy ott ppen milyen vltozk
szksgesek, ellenrzi hogy azok pillanatnyi tpusa megfelel-e. Ha nem megfelel,
akkor vagy lell hibazenettel, vagy trli a nem megfelel tpus vltozt s ltrehoz
egy megfelel tpust helyette.

Az interpreteres rendszerek sokkal rugalmasabbak. Egy adott utasts vgrehajtsa


eltt ellenrizheti a szksges felttelek teljeslst, st, akr korriglhatja is a
feltteleket, hogy megfeleljenek az utastsnak. Ezen rendszerek futtatsa sokkal
biztonsgosabb. A felgyel interpreter idben lellthatja a fut programot,
amennyiben azt nem tallja megfelelnek.

Az interpreteres rendszerek vitathatatlan htrnya, hogy egyrszt lass a futtats,


msrszt a generlt trgykd az adott programozsi nyelv szintaktikai lenyomatt
hordozza, nem univerzlis. Egy ilyen trgykd-bl az eredeti forrskd ltalban
szinte vesztesg nlkl helyrellthat, mg a vltoznevek s az eljrsnevek is
visszallthatak. Egy adott nyelv interpretere (pl. a BASIC interpreter) nem kpes
futtatni ms interpreteres nyelv fordtprogramja ltal generlt trgykdot.

Virtulis futtats: ez az interpreteres elv mdostst jelenti. A fordt nem direktben


futtathat gpi kd programot generl, hanem egy nem ltez (virtulis) processzor
virtulis gpi kdjra generl programot. Ezen gpi kd eltrhet a jelenlegi gpi
kdtl, sokkal magasabb szint utastsokat tartalmaz, s sokkal tbb tpust ismer.

Ezen nyelv interpreteres futtat rendszere (processzor-szimultor, virtulis gp)


sokkal egyszerbb, hiszen a generlt kd alacsonyabb szint utastsokat tartalmaz,
mint ltalban az interpreteres rendszerekben. A generlt kd mr nem felttlenl
hasonlt, nem felttlenl hordozza az eredeti programozsi nyelv szintaktikai
lenyomatt, belle az eredeti forrskd csak vesztesgesen llthat helyre (br
sokkal kevesebb vesztesg rn, mint a gpi kdbl).

A virtulis futtats elnye, hogy amennyiben egy programozsi nyelv


fordtprogramja kpes e virtulis gpi kd program generlsra, gy a futtatshoz
mr felhasznlhat a ksz futtat rendszer. Valamint ezen a virtulis nyelven
generlt kd ms-ms processzoron is futtathat lesz, amennyiben az adott
processzora is ltezik a futtat rendszer.

A legismertebb ilyen nyelv a JAVA, ahol a futtat rendszert Java Virtual Machine-nak
(JVM-nek) hvjk.

21/312
Programozs tanknyv

II. Fejezet

Bevezets
A Microsoft.NET

Hernyk Zoltn

22/312
A Microsoft.NET-et (tovbbiakban dotNet) sokflekppen lehet definilni. A Microsoft
honlapjn pldul az albbi meghatrozs szerepel: ez egy software technolgik
halmaza, amely informcikat, embereket, rendszereket s eszkzket kapcsol
ssze. Ez az j genercis technolgia a Web szolgltatsokon alapul kis
alkalmazsokon, amelyek kpesek kapcsolatba lpni egymssal csakgy, mint
nagyobb mret alkalmazsokkal az Internet-en keresztl.2

Msik lehetsges meghatrozs szerint a dotNet egy programfejlesztsi krnyezet,


mely szmtalan hasznos szolgltatssal segti a programozk mindennapi munkjt.

Amikor egy programoz egy alkalmazs fejlesztsbe kezd, sok ms dolog mellett
ismernie kell, s figyelembe kell vennie azt a krnyezetet, amelyben az alkalmazsa
futni fog. A krnyezet egyik legfontosabb jellemzje az opercis rendszer. A dotNet
egyfle szemszgbl nzve az opercis rendszert helyettesti elrejtvn, eltakarvn a
tnyleges opercis rendszert a fejleszt ell.

Az opercis rendszert egy programoz teljesen ms szempontbl nzi, mint egy


felhasznl. A felhasznl szmra az opercis rendszer az, amibe be kell
jelentkezni, alknyvtrakat s file-okat kezel, parancsokat lehet rajta keresztl kiadni
akr karakteres felleten, akr egr segtsgvel. Ezzel szemben a programoz az
opercis rendszert elssorban az API szempontjbl nzi: melyek azok a funkcik,
feladatok, amelyeket az opercis rendszer elvgez a program feladatai kzl, s
melyek azok, amelyeket nem.

Az API Application Programming Interface rja le egy adott opercis rendszer


esetn, hogy melyek azok a szolgltatsok, amelyeket az opercis rendszer eleve
tartalmaz, s amelyeket a programoz a fejleszti munka sorn felhasznlhat. Ezen
szolgltatsokat pl. a Windows a rendszer-knyvtraiban megtallhat DLL
(Dynamic Link Library) file-okban trolja. Minden DLL tbb fggvnyt s eljrst
tartalmaz, melyekre hivatkozhatunk a programjainkban is. E fggvnyek s eljrsok
sszessgt nevezzk API-nak.

Egy opercis rendszer API lersban szerepelnek a kvetkez informcik:


- a fggvny melyik DLL-ben van benne,
- mi a fggvny neve,
- mik a paramterei,
- a fggvnynek mi a feladata (mit csinl),
- mik a lehetsges visszatrsi rtkek,
- milyen mdon jelzi a fggvny a hibkat,
stb

A Microsoft-os vilgban az els ilyen API-t az els, ltaluk ellltott opercis


rendszer tartalmazta. Ez volt a DOS. Ez nem tartalmazott tl sok elrhet
szolgltatst lvn a DOS egy egyfelhasznls, egyfeladatos opercis rendszer.

2
http://www.microsoft.com/net/basics/whatis.asp

23/312
DOS-API Win16-API Win32-API dotNet-API

A Win16-API sokkal tbb szolgltatst tartalmazott, lvn hogy az mr grafikus


opercis rendszerrel, a Windows 3.1-el kerlt be a kztudatba. Ez mr nem csak a
grafikus fellet miatt tartalmazott tbb felhasznlhat szolgltatst, hanem mivel ez
egy tbbfeladatos opercis rendszer teljesen j terleteket is megclzott.

A Win32-API a fejlettebb Windows opercis rendszerekben jelent meg, mint pl. a


Windows 95. Ebben javtottak a tbbszl programok kezelsn, s bevezettek
bizonyos jogosultsgi mdszerek kezelst is (s mg szmtalan mst is).

A dotNet ezen szempontbl egy j API-nak tekinthet. Ez olyannyira igaz, hogy egy
dotNet krnyezetben a programoznak semmilyen ms API-t (elvileg) nem kell
ismernie. A dotNet (elvileg) ma mr tbb klnbz opercis rendszeren is kpes
mkdni de a programoznak ezt nem kell felttlenl tudnia hiszen mr nem
hasznlja az adott opercis rendszer API-jt, csak a dotNet-et ltal definilt
fggvnyeket s eljrsokat.

Tekintsk t a Microsoft.NET felptst:

Legals szinten az opercis rendszer tallhat. Mivel egy jl megrt, biztonsgos


opercis rendszer nem engedi meg, hogy a felgyelete alatt fut programok
nllan kezeljk a szmtgp hardware elemeit, ezrt a programok csakis az
opercis rendszeren keresztl kommuniklhatnak egymssal, hasznlhatjk fel az
erforrsokat (hlzat, file-rendszer, memria, ) vagyis az opercis rendszer
API-n keresztl. Ez a rteg egy jl megrt opercis rendszer esetn nem kerlhet
meg.

24/312
A kvetkez szinten van a Common Language Runtime a kzs nyelvi futtat
rendszer. Ez az egyik legrdekesebb rteg. A CLR lnyegben egy processzor-
emultor, ugyanis a dotNet-es programok egy virtulis mikroprocesszor virtulis gpi
kd utastskszletre van fordtva. Ennek futtatst vgzi a CLR. A futtats maga
interpreter mdban trtnik, ugyanakkor a dotNet fejlett futtat rendszere a virtulis
gpi kd utastsokat futs kzben az aktulis szmtgp aktulis
mikroprocesszornak utastskszletre fordtja le, s hajtja vgre.

Az els ilyen elny, hogy a szban forg virtulis gpi kd nyelv tpusos, ezrt a
programkd futtatsa kzben a memria-hozzfrseket ellenrizni lehet gy
meggtolhat a helytelen, hibs viselkeds. Msrszt az utastsok vgrehajtsa
eltt ellenrizni lehet a jogosultsgot is vagyis hogy az adott felhasznl s adott
program esetn szabad-e vgrehajtani az adott utastst pl. hlzati kapcsolatot
ltesteni, vagy file-ba rni. Ugyanakkor meg kell jegyezni, hogy egy JIT Compiler
(JIT=Just In Time) gondoskodik arrl, hogy a vgrehajts megfelel hatkonysggal
trtnjen. Ezrt egy dotNet-es program hatkonysga, futsi sebessge
elhanyagolhatan kisebb, mint a natv kd programok.

A msodik rteg tartalmazza a dotNet API nagyobb rszt. A Base Class Library
tartalmazza azokat a szolgltatsokat, amelyeket egy dotNet-es programoz
felhasznlhat a fejleszts kzben. Lnyeges klnbsg a megelz API-kal
szemben, hogy ez mr nem csak eljrsok s fggvnyek halmaza, hanem
struktrlt, nvterekbe s osztlyokba szervezett a sok ezer hvhat szolgltats. Ez
nem csak ttekinthetbb, de hatkonyabb felhasznlhatsgot jelent egy, az
objektum orientlt programozsban jrtas programoz szmra.

A kvetkez rteg, az ADO.NET s XML a 21. szzadi adatelrsi technolgikat


tartalmazza. Ezen technikk ma mr egyre hangslyosabbak, mivel a mai
alkalmazsok egyre gyakrabban hasznljk fel e professzionlis s szabvnyos
technikkat adatok trolsra, elrsre, mdostsra. A rtegek segtsgvel a
programok a httrtrolkon kpesek adatokat trolni, onnan indulskor azokat
visszaolvasni.

A kvetkez rteg ktfel vlik aszerint hogy az alkalmazs felhasznli fellett


web-es, vagy hagyomnyos interaktv grafikus felleten valstjuk meg. A Windows
Forms tartalmazza azon API kszletet, melyek segtsgvel grafikus fellet ablakos,
interaktv alkalmazsokat kszthetnk. A msik lehetsges vlaszts a WEB-es
fellet, valamilyen browser-ban fut nem kifejezetten interaktv program rsa. Ezek
futtatshoz szksges valamilyen web szerver, a kliens oldalon pedig valamilyen
internetes tallz program, pl. Internet Explorer vagy Mozilla.

A kvetkez rteg a Common Language Specification definilja azokat a


jellemzket, melyeket a klnbz programozsi nyelvek a fejldsk sorn
trtnelmi okokbl klnbz mdon rtelmeztek. Ez a rteg rja le az alaptpusok
mrett, trolsi mdjt - belertve a string-eket - a tmbket. Fontos eltrs pldul,
hogy a C alap nyelvekben a vektorok indexelse mindig 0-val kezddik, mg ms

25/312
nyelvekben ez nem ennyire kttt. A rteg nem kevs vita utn elsimtotta ezeket, a
klnbsgeket.

A CLS rteg fltt helyezkednek el a klnbz programozsi nyelvek s a


fordtprogramjaik. A dotNet igazbl nem kttt egyetlen programozsi nyelvhez
sem. A dotNet nem pl egyetlen nyelvre sem r, gy nyelvfggetlen. Elvileg
brmilyen programozsi nyelven lehet dotNet-es programokat fejleszteni,
amelyekhez ltezik olyan fordtprogram, amely ismeri a CLS kvetelmnyeit, s
kpes a CLR virtulis gpi kdjra fordtani a forrskdot.

A fenti kt kvetelmny betartsnak van egy nagyon rdekes kvetkezmnye:


elvileg lehetsg van arra, hogy egy nagyobb projekt esetn a projekt egyik felt
egyik programozsi nyelven rjuk meg, a msik felt pedig egy msikon. Mivel
mindkt nyelv fordtprogramja a kzs rendszerre fordtja le a sajt forrskdjt
gy a fordts sorn az eredeti forrskd nyelvi klnbsgei eltnnek, s a klnbz
nyelven megrt rszek zkkenmentesen tudnak egymssal kommuniklni.

A Microsoft a C++, illetve a Basic nyelvekhez ksztette el a dotNet-es


fordtprogramot, valamint tervezett egy j nyelvet is, melyet C#-nak (ejtsd sz-sharp)
nevezett el. Az j nyelv sok ms nyelv j tulajdonsgait tvzi, s nem hordozza
magval a kompatibilits megrzsnek terht. Tiszta szintaktikjval nagyon jl
hasznlhat eszkz azok szmra, akik most ismerkedek a dotNet vilgval.

Ugyanakkor nem csak a Microsoft kszt fordtprogramokat erre a krnyezetre.


Egyik legismertebb, nemrgiben csatlakozott nyelv a Delphi.

A fentieken tl van mg egy olyan szolgltatsa a dotNet rendszernek, melynek


jelentsgt nem lehet elgg hangslyozni: automatikus szemtgyjts. Ez a
szolgltats a memria-kezelssel kapcsolatos, s a program ltal lefoglalt, de mr
nem hasznlt memria felszabadtst vgzi. Ezt egy Garbage Collector nev
programrsz vgzi, amely folyamatosan felgyeli a fut programokat. Ennek
tudatban a programoznak csak arra kell gyelni, hogy memrit ignyeljen, ha arra
szksge van. A memria felszabadtsrl nem kell intzkednie, az automatikusan
bekvetkezik.

Ha megprblnnk sszegezni, hogy mirt j dotNet-ben programozni, az albbi


fbb szempontokat hozhatjuk fel:
- az alkalmazs opercis rendszertl fggetlen lesz
- fggetlen lesz az adott szmtgp hardware-tl is, gondolvn itt elssorban a
mikroprocesszorra
- nem kell j programozsi nyelvet megtanulnunk ha mr ismernk valamilyen
nyelvet (valsznleg olyan nyelven is lehet .NET-ben programozni)
- kihasznlhatjuk az automatikus memria-menedzsels szolgltatsait
(Garbage Collector)

26/312
- felhasznlhatjuk a programfejlesztshez az eleve adott Base Class Library
rendkvl szles szolgltats-rendszert, ami radiklisan cskkenti a
fejlesztsi idt

A dotNet keretrendszer (Microsoft.NET Framework) jelenleg ingyenesen letlthet a


Microsoft honlapjrl. A keretrendszer rszt kpezi a BCL, s a CLR rteg, valamint
egy parancssori C# fordt. Ennek megfelelen a dotNet programozsi krnyezet
ingyenesen hozzfrhet minden programozst tanulni vgy szmra. Ami nem
ingyenes, az a programozsi fellet (IDE = Integrated Development Environment
Integrlt Fejleszti Krnyezet). A dotNet-ben a Microsoft ltal fejlesztett ilyen
krnyezetet Microsoft Visual Studio.NET-nek nevezik. Ez nem csak egy sznes
szvegszerkeszt. Rszt kpezi egy 3 CD-t megtlt sg, mely tartalmazza a BCL
lerst, pldkkal illusztrlva. Az IDE nem csak a forrskd gyors ttekintsben
segt a sznekkel trtn kiemelssel (syntax highlight), hanem a program rs
kzben mr folyamatosan elemzi a forrskdot, s azonnal megjelli a hibs sorokat
benne. Krnyezetrzkeny mdon reagl a billentyk letsre, s kiegszti ill.
javtja az ppen begpels alatt ll kulcsszt. Ezen tl a felletbl kilps nlkl
lehet a forrskdot lefordtani, s a generlt programot elindtani. A Studio knyelmes
mdon kezeli a tbb file-bl ll programokat (project), illetve a tbb project-bl ll
programokat is (solution).

27/312
Programozs tanknyv

III. Fejezet

Hell Vilg!

Hernyk Zoltn

28/312
Majd minden programoz ezzel a kedves kis programmal kezdi a programozs-
tanulst: rjunk olyan szmtgpes programot, amely kirja a kpernyre, hogy hell
vilg (angolul: Hello World). Ezen program elhreslt pldaprogram ezzel kezdjk
ht mi is ismerkedsnket ezzel a klns, nha kiss misztikus vilggal.

class Sajat
{
static void Main()
{
System.Console.WriteLine("Hello Vilg");
}
}

A fenti pldaprogramot ksztsk el egy tetszleges editor programmal (akr a


jegyzettmb is megfelel) HelloVilag.CS nven, majd command prompt-bl fordtsuk
le a kis programunkat: csc HelloVilag.cs parancs kiadsa segtsgvel.

A csc.exe a C-Sharp compiler - a merevlemezen a Windows rendszerknyv-


trban, a C:\WINDOWS\Microsoft.NET\Framework\<version> alknyvtrban tall-
hat, ahol a <version> helyben a dotNET Framework verziszmt kell
behelyettesteni (pldul: v1.1.4322). Amennyiben a szmtgp nem ismeri fel a csc
programnevet, gy vagy rjuk ki a teljes nevet, vagy vegyk fel a PATH-ba a fenti
alknyvtrat.

A fenti parancs kiadsa utn ugyanazon alknyvtrban, ahova a program szvegt is


lementettk, elkszl egy HelloVilag.exe futtathat program is. Elindtva e kis
programot, az kirja a kpernyre a kvnt dvzl szveget.

Nos, ezen mdja a programksztsnek nagyon kkorszaki. Nzzk, milyen mdon


kell ezt csinlni a 21. szzadban

Els lpsknt indtsuk el a Microsoft Visual Studio.NET fejleszti krnyezetet, majd


a File/New/Project menpontot vlasszuk ki:

1. bra

A felbukkan prbeszdablak arra kvncsi, milyen tpus program rst kvnjuk


elkezdeni:

29/312
2. bra

A fenti prbeszdablak minden pontja roppant fontos! Els lpsknt a bal fels
rszen hatrozzuk meg, milyen nyelven kvnunk programozni (ez C#).

Msodik lpsknt adjuk meg, milyen tpus programot akarunk fejleszteni ezen a
nyelven. Itt a sok lehetsg kzl egyelre a Console Application-t, a legegyszerbb
mkdsi rendszer programtpust vlasztjuk ki.

Harmadik lpsknt a Location rszben adjuk meg egy (mr ltez) alknyvtr nevt.
Negyedik lpsben vlasszuk ki a kszl program nevt a Name rszben. Mivel e
program tbb forrsszvegbl fog majd llni, ezrt a Studio kln alknyvtrat fog
neki kszteni. Ezen alknyvtr neve a Location s a Name rszbl tevdik ssze, s
a Project will be created rszben ki is van rva, jelen pldban ez a
C:\Programjaim\HelloVilag alknyvtr lesz!

Az OK nyomgombra kattintva rvid idn bell nagyon sok minden trtnik a


httrben. Ezt egy Windows Intz indtsval azonnal tapasztalhatjuk, ha
megtekintjk a fenti alknyvtr tartalmt. Tbb file is generldott ebben az
alknyvtrban. De trjnk vissza a Studio-hoz!

30/312
using System;

namespace HelloVilag
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
/// <summary>
/// The main entry point for the
/// application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: Add code to start
// application here
//
}
}
}

A generlt program nagyon sok sort kitrlhetnnk, s akit zavarnak a programban


lv felesleges programsorok azok tegyk is meg btran (csak ne vgezzenek
flmunkt!).

Mire figyeljnk? A programunk utastsokbl ll. Egyelre jegyezzk meg a


kvetkez fontos szablyt: minden programutastst a Main fggvny belsejbe
kell rni! Sehova mshova! A Main fggvny belsejt a Main utni kezd kapcsos
zrjel s a zr kapcsos zrjel jelzi!

using System;
namespace HelloVilag
{
class Class1
{
static void Main(string[] args)
{
// ...
// ide kell rnunk a program sorait
// ...
}
}
}

Koncentrljunk most a valdi problmra: a programnak ki kell rnia a kpernyre a


Hell Vilg szveget! Vigyk a kurzort a Main fggvny belsejbe, s a hinyz sort
(System.Console.WriteLine("Hello Vilg");) gpeljk be.

31/312
using System;
namespace HelloVilag
{
class Class1
{
static void Main(string[] args)
{
System.Console.WriteLine("Hello Vilg");
}
}
}

A kir utasts neve WriteLine, mely az angol Write=rni, Line=sor szavakbl tevdik
ssze. A szveget a konzolra kell rni (Console=karakteres kperny). Ez egy, a
rendszer (angol: System=rendszer) ltal eleve tartalmazott utasts, ezrt a parancs
teljes neve System.Console.WriteLine. A kirand szveget a parancs utn gmbly
zrjelbe kell rni, s dupla idzjelek kz kell tenni. Az utasts vgt
pontosvesszvel kell lezrni (mint a pont a mondat vgn).
Az elkszlt programot a File/Save All menponttal mentsk le, majd indtsuk el.
Ennek tbb mdja is van. Az els: Debug/Start menpont. Msodik: ssk le az F5
billentyt. A harmadik: kattintsunk az indts gombra, amelyet egy kis hromszg
szimbolizl:

3. bra

Mivel a programindts igen fontos, s srn hasznlt funkci, ezrt javasoljuk, hogy
jegyezzk meg az F5 billentyt!

Mris van egy problmnk: a program elindul, rvid idre felvillan egy fekete szn
kis ablak, esetleg elolvashatjuk a kirst, de csak ha elg gyorsak vagyunk, mert az
ablak azonnal be is csukdik! Mirt? A vlasz: a program egyetlen utastst
tartalmaz: a szveg kirst. Mivel a program ezt mr megtette, ms dolga nincsen,
ezrt gy a futsa be is fejezdik. s ha a program mr nem fut, akkor bezrdik az
ablak!

A megolds is erre fog plni: adjunk mg dolgot a programnak, hogy ne fejezdjn


be azonnal! Els mdszer: utastsuk arra, hogy vrjon valamennyi id elteltre. A
szban forg utasts:

System.Threading.Thread.Sleep(1000);

32/312
Ezen utastsnak zrjelben (paramterknt) ezredmsodpercben kell megadni a
vrakozs idejt. A megadott rtk (1000) ppen 1 msodpercnyi vrakozst jelent.
A Sleep=aludni jelentse konkrtan annyi, hogy a program jelen esetben 1
msodpercre elalszik, e kzben nem trtnik semmi (mg csak nem is lmodik), de
a kvetkez utastst majd csak egy msodperc letelte utn fogja vgrehajtani a
szmtgp!

Lnyeges, hogy hova rjuk ezt a sort! A szably rtelmben a Main fggvny
belsejbe kell rni. De milyen sorrendben?

A programozs tanuls legjobb mdszere a prblkozs! Prbljuk meg a kirs el


berni!

static void Main(string[] args)


{
System.Threading.Thread.Sleep(1000);
System.Console.WriteLine("Hello Vilg");
}

Indtsuk el a programot, s gondolkozzunk el a ltottakon: a kis ablak elbukkan, kis


ideig nem trtnik semmi, majd felvillan a kirs, s azonnal bezrdik az ablak.

Prbljuk meg fordtott sorrendben:

static void Main(string[] args)


{
System.Console.WriteLine("Hello Vilg");
System.Threading.Thread.Sleep(1000);
}

A kirt szveg megjelenik, eltelik egy kis id (1 msodperc), majd bezrdik az ablak.
Mirt?

A szmtgp a program sorait nem akrmilyen sorrendben hajtja vgre. Van egy
nagyon fontos szably: az utastsokat ugyanabban a sorrendben kell vgrehajtani,
amilyen sorrendben a programoz lerta azokat. Ezt azt elvet ksbb pontostjuk, s
elnevezzk szekvencia-elvnek.
Program elindul
(ablak megnylik)

WriteLine vgrehajtsa
(a szveg kirdik a kpernyre)

Sleep vgrehajtsa
(a program vr 1 msodpercet)

Program befejezdik
(az ablak bezrdik)

33/312
Persze felmerl a krds, hogy 1 mp elg-e? Nvelhetjk az idt persze az rtk
tlltsval. De mennyire? Ez a megolds nem elg rugalmas. Nha tbb idt
kellene vrni, nha kevesebbet. Keressnk ms megoldst:

System.Console.ReadLine();

A Sleep-es sort cserljk le a fenti sorra. Prbljuk elindtani a programot. Mit


tapasztalunk? Hogy az ablak nem akar bezrdni! ssk le az Enter billentyt s
ekkor az ablak bezrdik.

Mi trtnt? Az ablak akkor zrdik be, amikor a program futsa befejezdik. Ezek
szerint a program mg futott, azrt nem zrdott be! Mivel most sszesen kt
utastsunk van (a WriteLine, s a ReadLine), melyik utasts miatt nem fejezdtt
be a program? Az nem lehet a WriteLine, mert a szveg mr kirdott a kpernyre,
ez az utasts vgrehajtsa teht mr befejezdtt! Ekkor csak a ReadLine utasts
maradt. Nos, a ReadLine utastst alapveten akkor hasznljuk majd, ha adatot
krnk be a billentyzetrl. Az adatbevitelt az Enter letsvel jelezzk, ezrt a
ReadLine mindaddig nem fejezdik be, amg le nem tjk az Enter-t.

Megjegyzs: a megolds azrt nem tkletes, mert br a ReadLine elltja a


feladatt, de sajnos az Enter letse eltt lehetsgnk van brmilyen szveget
begpelni, s ez elrontja a dolog szpsgt. De egyelre ez a mdszer lesz az, amit
hasznlni fogunk.

Kerljnk kzelebbi kapcsolatba a programmal, s a programozssal! Figyeljk meg


lpsrl lpsre a mkdst! Ehhez ne az F5 billentyvel indtsuk el a programot,
hanem az F11 billentyvel (vagy a Debug/Step into menponttal):

4. bra

A srga (szrke) kiemels a kvetkez vgrehajtand utastst jelli. Kzben


lthatjuk, hogy a program ablaka ltrejtt, de mg egyelre res. ssk le jra az
F11 billentyt! A srga kiemel csk tlpett a Sleep sorra. Ezt azt jelenti, hogy a
WriteLine vgrehajtsra kerlt? Ellenrizzk! A programablakra kattintva lthatjuk,
hogy kirdott a szveg a kpernyre. ssk le jra az F11 billentyt. Egy
msodpercig nem trtnik semmi (a program elalszik), majd jra felbukkan a srga
kiemels a Main fggvny blokkjnak zr kapcsos zrjeln. Ez az utols pillanat,
amikor mg ellenrizhetjk a program kirsait a fekete htter ablakban. jabb F11
letsre a program vgkpp befejezdik, az ablak bezrdik.

34/312
Nagyon gyeljnk, hogy ha mr elkezdtk a programot futtatni lpsenknt, akkor ne
mdostsuk a program szvegt (ez fknt akkor fordul el, ha vletlenl letnk
valamilyen billentyt). Ha ez mgis elfordulna, a Studio nem fogja tudni, mit is
akarunk tle:

5. bra

A szveg fordtsa: A forrskd megvltozsa nem fog jelentkezni a program


futsban, amg azt jra nem indtja. Ha folytatja a futtatst, a forrskd s a fut
program nem fog megegyezni. Ez azt jelenti, hogy ha pl. trjuk a szveget Hell
Vilg!-rl Hell Mindenki-re, s folytatjuk a program futtatst, akkor is mg az
eredeti Hell Vilg fog kirdni. Ennek oka az, hogy amikor elkezdtk a programot
futtatni (az els F11 letsvel), a Studio rgztette az llapotot (a forrskd akkori
tartamt), s a kzben bekvetkezett vltozsokat nem fogja figyelembe venni. Ez
azrt nagy gond, mert mi a forrskdban a mr megvltozott szveget ltjuk, s
esetleg nem rtjk, hogy mirt nem az trtnik, amit ltunk, ha vgrehajtjuk a
kvetkez lpst!

A Restart lenyomsval lellthatjuk a program futtatst, vagy a Continue


lenyomsval dnthetnk gy is, hogy a vltozs ellenre folytatjuk az eredeti
program futtatst.

A program futtatst egybknt brmikor megszakthatjuk a Debug/Stop debugging


menponttal, vagy a Shift-F5 letsvel.

A fenti mdszert fknt akkor hasznljuk, ha a program nem gy mkdik, ahogyan


azt szeretnnk, vagy csak nem rtjk annak mkdst teljes mrtkben. E
mdszert nyomkvetsnek hvjuk (angolul debugging), jelen esetben lpsenknti
programvgrehajtst vgznk. Ksbb jabb mdszerekkel s technikkkal
bvthetjk ez irny tudsunkat.

35/312
Feladatok:

1. Programozsi feladat: rassuk ki a kpernyre a csaldfnk egy rszt, pl. az


albbi formban:
Kis Pl (felesge: Nagy Borbla)
Kis Jzsef
Kis Aladr (felesge: Piros va)
Kis Istvn
Kis Pl

2. Programozsi feladat: rassuk ki a kpernyre az eddig megismert C#


parancsokat, s rvid lersukat, pl. az albbi formban:
*** WriteLine ***
Kir egy szveget a kpernyre.
*** ReadLine ***
Vr egy ENTER letsre.
*** Sleep ***
Vrakozik a megadott idig.

36/312
Programozs tanknyv

IV. Fejezet

Alap I/O

Kirly Roland

37/312
Az alapvet Input/Output

Az alapvet input- output, vagyis a Konzol alkalmazsok ki- s bemenetnek trgyalshoz


elsknt meg kell ismernnk nhny C#-ban hasznlatos vltoz tpust. A vltozk, a
vltoz tpusok ismerete nagyon fontos, brmely programozsi nyelvet szeretnnk
elsajttani, mivel a programban hasznlt adatokat vltozkban s konstansokban tudjuk
trolni. A program ezekkel szmol, s segtsgkkel kommunikl a felhasznlval. A
kommunikci a programozsi nyelvek esetben krlbell azt jelenti, hogy adatokat
olvasunk be a billentyzetrl, s a munka vgeztvel a kapott eredmnyt kirjuk a kpernyre.

Minden vltoznak van neve, vagy ms nven azonostja, tpusa, s tartalma, vagyis
aktulis rtke. Ezeken kvl rendelkezik lettartammal s hatskrrel. Az lettartam azt
jelenti, hogy az adott vltoz a program futsa sorn mikor s meddig, a hatkr azt adja,
hogy a program mely rszeiben hasznlhat. A vltozk nvnek kivlasztsa sorn
gyelnnk kell a nyelv szintaktikai szablyainak betartsra.

Az albbiakban megvizsglunk nhny pldt a helyes s helytelen nvadsokra:

Valtozo
valtozo
Valtoznv
szemely_2_neve
int
alma#fa
10szemely

Az els ngy nvads helyes. Vegyk szre, hogy a valtozo s a Valtozo azonostk kt kln
vltozt jellnek, mivel a C# nyelv rzkeny a kis-nagybetk klnbsgre. Az angol
terminolgia ezt Case- sensitive nyelvnek nevezi.
A negyedik elnevezs helytelen, mivel az int foglalt kulcssz. Az tdik nvben a # karakter
szerepel, ami nem hasznlhat. Az utols elnevezs szmmal kezddik, mely szintn hibs.

A vltozkat a programban bevezetjk, vagyis kzljk a fordt rendszerrel, hogy milyen


nvel milyen tpus vltozt kvnunk hasznlni a programban. Ezt a folyamatot
deklarcinak nevezzk.

valtozo_nev tipus;

38/312
A tpus hatrozza meg a vltoz lehetsges rtkeit, rtktartomnyait, illetve azt, hogy,
milyen mveleteket lehet rtelmezni rajta, s milyen ms tpusokkal kompatibilis, a nvvel
pedig a vltozra hivatkozhatunk. A kompatibilits akkor fontos, mikor az egyik vltozt
rtkl akarjuk adni egy msiknak. Inkompatibilits esetn a .NET fordt hibt jelez.
Ms nyelvektl eltren a C#-ban az kezetes betket is hasznlhatjuk nvadsra.

char kezetes_bet;
int egsz;

A vltozk a memriban troldnak, vagyis minden azonosthoz hozzrendeljk a


memria egy szelett, melyet a rendszer lefoglalva tart a vltoz teljes letciklusa alatt.
(Nhny vltoz tpus esetn, mint a pointerek, valamivel bonyolultabb a helyzet, de a .NET
rendszerben nem kell trdnnk a memria kezelsvel, mivel a .NET felgyeli, lefoglalja s
felszabadtja a memrit.) Vizsgljunk meg nhny, a C# nyelvben hasznlatos, egyszer
tpust!

tpus Mret rtktartomny A tpusban trolhat adatok

byte 1 byte 0 tl 255 ig Eljel nlkli egsz szmok

int 4 byte -2,147,483,648 tl eljeles egsz szmok


2,147,483,647 ig
float 4 byte 45
1.5 10 tl Vals(lebegpontos) szmok
38
3.4 10 ig
double 8 byte 324
5.0 10 tl Vals(lebegpontos) szmok
308
1.7 10 ig
decimal 16 byte 1.0 1028 tl Vals(lebegpontos) szmok
28
7.9 10 ig
bool 1 byte true/false True, false rtkek
char 2 byte U+0000 tl U+ffff ig Unicode karakterek
string - Karakterlncok

A tblzatban felsorolt tpusokkal deklarlhatunk vltozkat. Az albbi plda bemutatja a


deklarci pontos szintaktikjt.

int i;
char c;
string s;

A vltozinkat kezdrtkkel is ellthatjuk. A kezdrtk adsa azrt is fontos, mert az rtk


nlkl hasznlt vltozk kifejezsekben val szerepeltetse esetn a fordt hibt jelez.

39/312
int k=0;
char c=a;
string z=alma;

A kvetkez program bemutatja, hogyan lehet a vltozkat deklarlni, s kezdrtkkel


elltni. A kpernyn nem jelenik meg semmi, mivel kir s beolvas utastsokat nem
hasznlunk. Ezeket a fejezet ksbbi rszeiben trgyaljuk.

namespace deklaracio
{
class valtozok_
{
[STAThread]
static void Main(string[] args)
{
int r=0;
float h,l;
int a=0,b=1,c=0;
int d=a+b;
int k=a+10;

float f;

char ch;
char cr='a';

bool bo=true;
bool ba;

string s1;
string s2="Hello!";
}
}
}

Gyakran elfordul hiba, hogy a deklarci sorn nem adunk nevet vagy tpust a vltoznak,
vagy egyltaln nem deklarljuk, de a programban prblunk hivatkozni r. Ekkor a .NET
fordt a futtatskor hibt jelez. Elfordul, hogy nem megfelel tpus kezd rtkkel ltjuk el
a vltozkat. Ebben az esetben a kvetkez hibazenetek jelenhetnek meg a kpernyn:
- Cannot implicitly convert type 'string' to 'int'
- Cannot implicitly convert type 'int' to 'string'

Azonos vltoznevek esetn is hibazenetet kapunk. Gyakori hiba az is, hogy az osztly,
vagyis a class neve megegyezik valamely vltoz nevvel, esetleg lefoglalt kulcsszt
akarunk alkalmazni a nvadsnl.
Bizonyos esetekben, amikor nem Error, hanem Warning tpus hibazenetet kapunk, a
fordt olyan hibt tall a programunkban, amitl az mg mkdkpes, de hatkonysgt
cskkenti. Ilyen hiba lehet, ha egy vltozt deklarlunk, de nem hasznlunk fel.

40/312
A kvetkez pldban lthatunk nhny rossz deklarcit. (- hogy a programozs sorn ne
kvessnk el hasonl hibkat.)

int a="alma"; az int tpus nem kompatibilis a string konstanssal


string f=2; az s vltozba szmot akarunk elhelyezni
int class=10; a class foglalt sz
int void=10; a void az eljrsoknl hasznlatos cimke

A kvetkez plda megmutatja, hogy a programjaink mely rszeiben deklarlhatunk.

using System;

namespace AlapIO
{
class IO_
{
int a,b;
int d=10;
char c;
bool t,f=false;
string s;
int y = (int)3.0;

[STAThread]
static void Main(string[] args)
{
int l;
string s="ez egy string konstans";
int a = 12;
int b = a + 10;
bool t = true;
bool f = !t;
char c = 'a';
}
}
}

A fenti vltozk (a, b, c, d, t, f) a programunk futsa kzben hasznlhatak, az rtkadsok


utn tartalommal, rtkkel rendelkeznek, melyet a program futsa alatt, vagy a vltozra
vonatkoz kvetkez rtkadsig meg is tartanak. A felhasznl mg mindig nem lthatja
ket, s az rtkket nem tudja mdostani. Ahhoz, hogy lehetv tegyk a program
hasznljnak a vltozk rtknek manipullst, neknk kell a megfelel utastsokat
bepteni a forrskdba. Amennyiben ezt tesszk, gyelnnk kell a programkd
helyessgre.
Az rtkadsnak jl meghatrozott szintaktikja van. Az rtkad utasts bal oldaln a
vltoz azonostja ll, kzpen egyenlsg jel, a jobb oldalon pedig az rtk, vagy
kifejezs, melynek az aktulis rtkt a vltozban trolni szeretnnk.

41/312
int d=2;
c=a+40;
k=(10+4)/2;
int y = (int)3.0;

A helytelenl felrt rtkadst a fordt hibazenettel jelzi.

A pldban az y vltoznak egy vals tpust adunk rtkl, de ebben az esetben az (int)3.0
tpus knyszertssel nem okozunk hibt. Ez egy n.: explicit konverzi. A vltozk egy
rdekes tpusa a literl. Akkor hasznljuk, mikor a programban egy konkrt rtket
szeretnnk szerepeltetni, pl.:

hibauzenet_1 = Helytelen rtkads;


max_Db = 20;

A literlok alaprtelmezs szerint int tpusak, ha egszek, s double, ha valsak.


Amennyiben float tpust szeretnnk kszteni, az rtk utn kell rni az f karaktert, long tpus
esetn az l, illetve ulong esetn az ul karakterprt, stb.

Float_literal = 4.5f;
Long_literal = 4l;

A C# programokban llandkat, vagy ms nven konstansokat is definilhatunk. A


konstansok a program futsa alatt megrzik rtkket, s nem lehet felldefinilni ket, illetve
rtkad utastssal megvltoztatni rtkket. Ms nyelvektl eltren, itt a konstansnak is
van tpusa.

const int a=10;


const string s=string tpus konstans;

A programjainknak fontos rsze a felhasznlval val kommunikci. Adatokat kell krni tle,
vagy kzlnnk kell, mi volt a program futsnak eredmnye. Ahhoz, hogy az adatokat,
vagyis a vltozk tartalmt be tudjuk olvasni vagy meg tudjuk jelenteni a kpernyn, a .NET
rendszerben ignybe vehetjk a C# alapvet I/O szolgltatsait, a System nvtrben
tallhat Console osztly ide tartoz metdusait (fggvnyek s eljrsok).

System.Console.Read();
System.Console.Write();
System.Console.ReadLine();
System.Console.WriteLine();

A Console.Write() s a Console.WriteLine() a kirsra, mg a Console.Read() s a Console.ReadLine() a


beolvassra hasznlhat. A beolvass azt jelenti, hogy az n.: standard input stream rl

42/312
vrunk adatokat. Amennyiben a Read() beolvas utastst hasznljuk, int tpus adatot
kapunk, a ReadLine() metdus esetben viszont stringet. Ez kiderl, ha megnzzk a kt
metdus prototpust.

public static string ReadLine();


public static int Read();

Jl ltszik, hogy a Read() int tpus, a ReadLine() viszont string. Adat beolvassakor
termszetesen nem csak erre a kt tpusra van szksgnk, ezrt az input adatokat
konvertlnunk kell a megfelel konverzis eljrsokkal, melyekre ksbb bvebben kitrnk.
A System hivatkozs elhagyhat a metdusok hvsakor, amennyiben azt a program elejn, a
using bejegyzs utn felvesszk a kvetkez mdon:

using System;

Ezt a mveletet nvtr importlsnak nevezzk s a knyv ksbbi fejezeteiben bvebben


olvashatunk a tmrl.
Mikor eltekintnk a nvtr importlstl, akkor az adott metdus teljes, minstett, vagy q
nevrl beszlnk, ami a fggvny nvtrben elfoglalt helyvel kezddik. Ez a minst
eltag (pl.: System.Console), gy a program brmely rszbl meghvhatjuk az adott
fggvnyt, vagy eljrst. Erre szksg is lehet, mivel a System nvtr is tbb fjlbl (DLL) l,
amelyeket a fordt nem biztos, hogy megtall a hivatkozs nlkl. Ez nem csak a System -re,
hanem valamennyi nvtrre igaz.

Pl.:System.Thread.Threadpool.QueueUserWorkItem();
(a tbbszl programok ksztsnl van jelentsge, ksbb mg visszatrnk r)

Ahhoz, hogy hasznlni tudjuk a Consol metdusait, meg kell vizsglnunk nhny pldt. A
kvetkez program bemutatja a beolvass s a kirs mechanizmust.

using System;

namespace ConsoleApplication7
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
int a=0,b=0;
Console.Write("a erteke : ");
a=Convert.ToInt32(Console.ReadLine());
Console.Write("b erteke : ");
b=Convert.ToInt32(Console.ReadLine());
Console.WriteLine("\n a={0}\n b={1}\n a+b={2}",a,b,a+b);

43/312
Console.ReadLine();
}
}
}

Amennyiben futtatjuk a programot a kpernyn a kvetkez output (kimenet) jelenik meg:

A System.Console.WriteLine() metdussal a standard output - ra, vagyis a kpernyre tudunk rni,


pontosabban a kpernyn megjelen Consol alkalmazs ablakba. A metdusban n.:
formtum string - et, vagy ms nven maszkot alkalmaztunk, hogy a vltozk rtkeit
formzottan, vagyis a szmunkra megfelel alakban tudjuk megjelenteni.
A formtum string tartalmaz konstans rszeket (a=, b=, a+b=) ami vltozatlan formban kerl a
kpernyre. A {0}, {1}, {2} bejegyzseket arra hasznljuk, hogy a formtum string megfelel
pontjaira behelyettestsk a paramterlistban felsorolt vltozk rtkeit: a {0} jelenti a
nulladik, vagyis a sorban az els vltoz helyt, a {1} a msodik vltoz helyt, s gy tovbb.
Amennyiben a {} zrjelek kztt olyan rtket adunk meg, mely nem ltez vltozra
hivatkozik, a program lell.

Console.WriteLine("{1} {3}",i);

A pldban az els s a harmadik vltozra hivatkoztunk (sorrendben a msodik s a


negyedik), de ilyenek nem lteznek, mivel az egyetlen vltoz a kir utastsban az i, mely a
nulladik helyen ll. A helyes hivatkozs teht:

Console.WriteLine("{0}",i);

Ezek a bejegyzsek nem hagyhatak el, mivel csak gy tudjuk a vltozk tartalmt a
kpernyre rni. A sorrendjk sem mindegy. Vegyk szre, hogy a pldaprogramban a
msodik Console.WriteLine() paramter listjban a vltozk fel vannak cserlve, a kirsi
sorrend mgis megfelel, mivel a formtum definilja, a vltozk helyt a kirt szvegben.
(rdekes krds lehet, hogy a {, }, {0} karaktereket hogyan rjuk a kpernyre. A
Console.WriteLine({} {0} = {0},a); nem megfelel. A kedves olvas kiprblhatja a
Console.WriteLine({{0}} = {0},a); utastst)
A formtum maszkjba a kvetkez vezrl karaktereket helyezhetjk el:

44/312
\b Backspace
\* jsor
\t vzszintes tabultor
\\ Fordtott perjel
\ Aposztrf
\ Idzjel
\n Sortrs

Vegyk szre, hogy a programunk megjelenti a trolt rtkeket, s azok sszegt is, de nem
ad lehetsget felhasznlnak a vltozk rtknek a megvltoztatsra.
Ahhoz, hogy tovbb tudjunk lpni, el kell sajttanunk, hogyan kezelhetjk le a felhasznltl
rkez inputot, vagyis a billentyzetrl bevitt adatokat.
A felhasznli input kezelsre lehetsget biztostanak a Console.Read() ,s a
Console.ReadLine() metdusok. Mindkett esetben adatokat olvashatunk be a standard
inputrl, vagyis a billentyzetrl, s ha megtmogatjuk a kt metdust a Convert osztly
konverzis fggvnyeivel, nemcsak int s string tpus adatokat, hanem szm tpus, vagy
logikai rtkeket is beolvashatunk a felhasznltl. A pldaprogramban a Convert.ToInt32()
metdust hasznljuk az input 32-bites int tpuss konvertlsra. Ha a beolvass sorn az
input stream rl hibs adatot kapunk, mely nem konvertlhat, a programunk lell.
Az ilyen jelleg hibkra megolds lehet a kivtelek kezelse, melyrl a ksbbi fejezetekben
szt ejtnk majd.
Nzznk meg a pldt a beolvassra s a konverzira!

using System;

namespace ConsoleApplication7
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
int a=0,b=0;
Console.Write("a erteke : ");
a=Convert.ToInt32(Console.ReadLine());
Console.Write("b erteke : ");
b=Convert.ToInt32(Console.ReadLine());
Console.WriteLine("\n a={0}\n b={1}\n
a+b={2}",a,b,a+b);
Console.ReadLine();
}
}
}

Ebben az alkalmazsban a vltozk a felhasznli inputrl nyernek rtket, gy a beolvasott


adatok vltoztatsval minden lefutsnl ms-ms eredmnyt kapunk. A program vgn a

45/312
Console.ReadLine() utastst arra hasznljuk, hogy a Consol ablak ne tnjn el a
kpernyrl, miutn a program lefutott. Ez fontos a Consol alkalmazsok esetn, mivel ezek
nem esemny vezrelt mkdsek. A programok elindulnak, vgrehajtjk a programoz
ltal definilt utastsokat, majd lellnak, s a kimeneti kpernyt is bezrjk. gy a
felhasznl nem lt szinte semmit az egszbl.
A fentiek ismeretben vegyk sorra, hogy a vltozk milyen mdon kaphatnak rtket!

Egyszer rtkadssal:

A=2;
B=alma;
C=A+B;
E=2*A;

A standard inputrl:

A=Convert.ToInt32(Console.ReadLine());
B=Console.ReadLine();

Kezdrtk adsval:

int D=10;
char c=a

A vltozkba beolvasott rtkeket fel is tudjuk hasznlni, s legtbbszr ez is a clunk. Mirt


is olvasnnk be rtkeket, ha nem kezdnk velk semmit? A kvetkez program kt vltoz
rtkrl eldnti, hogy melyik a nagyobb. Ez a program viszonylag egyszer, s jl
bemutatja a billentyzetrl nyert adatok egsz szmm konvertlst. A Convert osztly
ToInt32() metdusval alaktjuk a beolvasott, itt mg String tpusknt szerepl szmot, majd
azt konvertljuk egsz szmm (int), s adjuk rtkl az a vltoznak. A b vltozval ugyangy
jrunk el. A beolvasst kveten megvizsgljuk, hogy a szmok egyenlk-e, ha ez a felttel
nem teljesl, megnzzk, hogy melyik vltoz rtke a nagyobb, majd az eredmnyt kirjuk a
kpernyre. Nzzk meg a forrskdot!

46/312
using System;

namespace Convert
{
class KN
{

[STAThread]
static void Main(string[] args)
{
int a=0,b=0;
Console.Write("a rtke? = ");
a=Convert.ToInt32(Console.ReadLine());
Console.Write("b rtke? = ");
b=Convert.ToInt32(Console.ReadLine());
if (a==b)
{
Console.WriteLine("{0} s {1} egyenlek",a,b);
}
else
{
if (a>b)
{
Console.WriteLine("{0} a nagyobb mint {1}",a,b);
}
else
{
Console.WriteLine("{0} a nagyobb mint {1}",b,a);
}
}
Console.ReadLine();
}
}
}

Az alkalmazs kimenetre kerek mondat formjban rjuk ki az eredmnyt gy, hogy a kirt
string konstanst konkatenljuk a vltozk rtkvel, gy foglalva mondatba a program
futsnak eredmnyt. Ez gyakori megolds a felhasznlval trtn kommunikci
megvalstsra. Mindenkppen jobb, ha sszefgg szveg formjban beszlgetnk. A
htkznapi kommunikci sorn is jobb, ha kerek mondatokat hasznlunk, hogy jobban
megrtsenek minket.
A program hasznlhatsgt nveli, vagyis felhasznlbart programokat kszthetnk.
Biztosan sokan emlkeznek a kvetkez prbeszdre:
- Mennyi?
- Harminc.
- Mi harminc?
- Mi mennyi?

47/312
Az ilyen s hasonl prbeszdek rthetetlenn teszik a kommunikcit mind a vals letben,
mind a programok vilgban. Az elsben mr egsz jl megtanultuk a trsas rintkezs
formit, tanuljuk meg a msodikban is!

A kirats s beolvass mellett a mveletvgzs is fontos rsze a programoknak. A


mveleteket csoportosthatjuk a kvetkez mdon:
rtkads: a = 2,
matematikai mveletek: z = a + b,
sszehasonltsok: a = = b, a < c,
feltteles mveletek.
A mveleti jelek alapjn hrom kategrit hozhatunk ltre. Unris, binris s ternris
mveletek. Az elnevezsek arra utalnak, hogy a mveletben hny operandus szerepel.

Az aritmetikai rtkadsokat rvid formban is rhatjuk. A kvetkez tblzat bemutatja a


rvidtsek hasznlatt, s azt, hogy a rvidtett formulk mivel egyenrtkek.

rvid forma Hasznlat Jelents


+= x += 2; x = x + 2;
-= x -= 2; x = x 2;
*= x *= 2; x = x * 2;
/= x /= 2; x = x / 2; (egsz oszts)
%= x %= 2; x = x % 2; (maradkos oszts)

Most, hogy elegend tudssal rendelkeznk a Consol I/O parancsairl s a mveletek


hasznlatrl, ksztsnk programot, mely a felhasznltl bekri egy tetszleges kr
sugart, majd kiszmtja annak kerlett s terlett.
A programhoz szksges ismeretek: a kr kerlete: 2r*, s a terlete: r*r*, vagy r2*.
A feladat az, hogy egy vltozba beolvassuk az adott kr sugart, majd a kpernyre rjuk a
krhz tartoz kerletet s a terletet. A kifejezsek kiszmtst elvgezhetjk a kir
utastsban is, csak a megfelel formtum string-et kell elksztennk, s a p rtkt
behelyettestennk a kpletekbe.
Honnan vegyk a p-t? rhatnnk egyszeren azt, hogy 3.14, de ebben az esetben nem
lenne elg pontos a szmtsunk eredmnye. Hasznljuk inkbb a C# math osztlyban
definilt PI konstanst!
Ekkor a program a kvetkez mdon rhat le:

48/312
using System;

namespace ConsoleApplication7
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
int r=0;
Console.WriteLine("kr sugara : ");
r=Convert.ToInt32(Console.ReadLine());
Console.WriteLine("A kr kerlete : {0},
terlete : {1} ",2*r*Math.PI,r*r*Math.PI);
Console.ReadLine();
}
}
}

Vizsgljuk meg, hogyan mkdik a program! Az r vltozban troljuk a billentyzetrl


beolvasott rtket, a kr sugart, majd a Console.WriteLine() metdusban kiszmoljuk a
megadott kifejezs alapjn a kr kerlett s terlett. Az eredmny kirdik a kpernyre, s
a program az enter letse utn befejezi futst.

Az egsz tpus szmokkal mr jl boldogulunk, de sajnos az let nem ilyen egyszer. A


legtbb alkalmazsban szksg van a tpusok kzti konverzira.
A fejezetben mr szltunk a tpusok konverzijrl, s a Convert osztlyrl, de a teljessg
kedvrt vegyk sorra a fontosabb metdusait!
Az albbi felsorols tartalmazza azokat a konvertl metdusokat, melyeket az alapvet I/O
alkalmazsa sorn hasznlni fogunk:

ToBoolean()
ToByte()
ToChar()
ToString()
ToInt32()
ToDateTime()

A ToBoolean() metdus logikai rtkkel tr vissza.

Console.WriteLine("{0}",Convert.ToBoolean(1));
Bool b=Convert.ToBoolean(Console.ReadLine());

Logikai true rtket kapunk eredmnyl. Nullnl false visszatrsi rtket kapnnk.

49/312
A ToByte() metdus byte tpust ad vissza, de ez a fenti kir utastsban nem kvethet
nyomon, mivel a kirt rtk byte tpusban is 1, viszont az rtktartomny megvltozik. Egy
bjtnl nagyobb rtk nem fr el a byte tpusban. Nagyobb szm konvertlsa hibhoz
vezet.

Console.WriteLine("{0}",Convert.ToByte(1));

A ToChar() metdus a karakter ASCII kdjval tr vissza. Ez a metdus jl hasznlhat a


szmrendszerek kzti tvltsok programozsra, mivel a kilences szmrendszertl flfel
trtn konvertlskor a 9-nl nagyobb szmok esetn az ABC nagy betit hasznljuk.

10=A, 11=B,,15=F.

Az tvltskor, ha az adott szmjegy nagyobb, mint 9, talakthatjuk a kvetkez mdon:

Convert.ToChar(szamjegy+55);

A pldban a szmjegy ASCII kdjt toltuk el annyival, hogy az megegyezzen a megfelel


tizenhatos szmrendszerbeli szmjegy ASCII kdjval. A kdot ezutn karakterr
konvertltuk. A kvetkez programrszlet a fent emltett eljrs hasznlatval a 10 szm
helyett egy A bett r a kpernyre.

Console.WriteLine("{0}",Convert.ToChar(10+55));

Amennyiben a ToChar() bemen paramtere a 11+55 lenne, a B bet jelene meg a kpernyn.
A ToString() string-et konvertl a bemen paramterbl.

string s=Convert.ToString(1.23);
Console.WriteLine("{0}",s);

Eredmnye az 1.23 szm string-knt. Konvertls utn 1.23-al nem vgezhetnk aritmetikai
mveletet, mivel string tpust ksztettnk belle, de alkalmas string-ekhez val
hozzfzsre.

A ToInt32() metdust mr hasznltuk az elz programokban, de lljon itt is egy plda a


hasznlatra.

int a=Convert.ToInt32(Console.ReadLine());

50/312
A kdrszletben az int tpus vltozba a billentyzetrl olvasunk be rtket. A
Console.ReadLine() metdust paramterknt tadjuk a Convert.ToInt32() fggvnynek, gy a
beolvasott rtk egsz tpus szmknt (int) kerl a memriba.
Msik lehetsg a konverzira az i=Int32.Parse(Console.ReadLine()); forma hasznlata. A kt
megolds azonos eredmnyt szolgltat.

A felsorols vgre hagytuk a ToDateTime() metdust, mivel a dtum tpussal mg nem


foglalkoztunk.
Elfordulnak programok, ahol a felhasznltl a szletsi dtumt, vagy ppen az aktulis
dtumot szeretnnk megkrdezni. Amennyiben ki akarjuk ratni a kpernyre amit
beolvastunk, nincs szksg konverzira, de ha dtum tpusknt trolt adattal szeretnnk
sszehasonltani azt, vagy adatbzisban trolni, akkor hasznlnunk kell a ToDateTime()
fggvnyt.

Console.WriteLine("dtum :{0}",Convert.ToDateTime("2004/12/21"));

A fenti programrszlet futsnak az eredmnye a kvetkez:

Lthat, hogy a dtum mellett az aktulis id is megjelenik, ami alaprtelmezsknt 0:00:00.


Ebbl kvetkezik, hogy ToDateTime() paramterben megadott string-ben az aktulis idt is
fel tudjuk venni a kvetkez mdon:

Console.WriteLine("datum + id : {0}
",Convert.ToDateTime("2004/12/21 1:10:10"));

Ennek a kdrszletnek az eredmnyeknt a dtum mellett az id is kirdik a kpernyre.


Termszetesen a C# -ban sokkal tbb konverzis metdus ltezik, de a programjaink
megrshoz a felsoroltak elegendek. (Amennyiben a tbbire is kvncsiak vagyunk,
hasznljuk a .NET dinamikus HELP rendszert!)
A pldkban a konvertlst a kir utastssal kombinltuk, hogy az eredmny megjelenjen a
kpernyn, de a metdusokat vltozk rtknek a belltsakor, vagy tpus konverzi
esetn is hasznlhatjuk.
string s=Convert.ToString(1.23);
int k=Convert.ToInt32('1');
k=2+Convert.ToInt32(c);
char c=Convert.ToChar(1);
bool b=Convert.ToBoolean(1);

51/312
Logikai rtk esetn a beolvass a kvetkez mdon oldhat meg:

bool b;
b=Convert.ToBoolean(Console.ReadLine());
Ennl a programrszletnl a true szt kell begpelni a billentyzeten. Ez kicsit eltr a fent
bemutatott bool b=Convert.ToBoolean(1); rtkadstl. A beolvassnl az 1 rtk nem megfelel.
Nem szerencss a logikai rtkek beolvassakor a Read() metdust hasznlni, mivel az int
tpust olvas be.

A standard Input/Output kezelsnek alapjait elsajttottuk. A kvetkez fejezetben a


szelekcival ismerkednk meg. A szelekci, vagyis a feltteles elgazsok tmakrt ez a
fejezet is rintette, de nem mertette ki. A teljes kr megismershez mindenkppen fontos a
kvetkez fejezet tanulmnyozsa.
A szintaktika mellett fontos megemlteni, hogy a programozs folyamata nem a fejleszti
eszkz kd editorban kezddik. Elsknt fel kell vzolni a szletend programok
mkdst, tervezni kell, meg kell keresni a lehetsges matematikai megoldsokat (persze,
csak ha erre szksg van). A tervek lersa sok esetben mr a program vzlatt adja.
(Egyszerbb programok esetn elg, ha a felhasznli ignyeket paprra vetjk .) A
tervezs, elkszts lpsekeit soha nem szabad kihagyni. A megfelelen tgondolt,
megtervezett programok elksztse a ksbbiekben felgyorstja a programozsi folyamatot,
egyszerbb teszi a hibk keresst, javtst.

52/312
Programozsi feladatok

1. rjon programot, mely megkrdezi a felhasznl nevt, majd kszn neki, de gy,
hogy a nevn szltja! (Pl.: Hello Kiss Attila!)
2. Prblja meg talaktani a fejezetben trgyalt, a kr kerlett s terlett
kiszmt programunkat gy, hogy az ne egy kr, hanem egy ngyzet kerlett s
terlett szmtsa ki!
3. Az elz programot mdostsa gy, hogy tglalapok kerlett, terlett is ki tudja
szmtani! (Szksg lesz jabb vltoz bevezetsre.)
4. rjon programot, mely egy hromszg oldalainak hosszt olvassa be a
billentyzetrl, majd megmondja, hogy a hromszg szerkeszthet-e! (A
hromszg szerkeszthet, ha az (a+b>c) s (a+c>b) s (b+c>a) felttel teljesl.)
5. Olvasson be a billentyzetrl egy szmot s mondjuk meg, hogy a szm negatv,
vagy pozitv!
6. Krjen be a billentyzetrl kt szmot, majd rja ki azok sszegt, klnbsgt,
szorzatt s hnyadost a kpernyre!
7. Ksztsen programot, mely logikai true/false rtkeket olvas be a billentyzetrl!
True esetn a kpernyre az IGAZ szt rja ki a program!
8. rjon programot, mely beolvas egy szmprt a billentyzetrl, majd kirja a kt
szm szmtani kzept!

53/312
Programozs tanknyv

V. Fejezet

Szelekci alapszint

Radvnyi Tibor

54/312
A logikai tpus vltoz

A logikai tpus vltoznak kt lehetsges rtke van, a TRUE s a FALSE, vagyis


igaz, vagy hamis. Ezek az rtkek konstansknt is megadhatk:

bool logikai = true;

Kt kompatibilis rtk sszehasonltsnak eredmnye vagy igaz (true) vagy hamis


(false) lesz. Pldul ha Sz vltoz int tpus, akkor az Sz < 4 kifejezs rtke lehet
igaz is s hamis is, attl fggen, hogy mi a vltoz pillanatnyi rtke. Az
sszehasonlts eredmnyt tudjuk trolni egy logikai tpus vltozban.

bool logikai = true;


int sz = 2;
logikai = sz < 4;
Console.WriteLine("{0}",logikai);

Logikai kifejezseket logikai opertorokkal kthetnk ssze. Ezek a tagads, a


logikai s, illetve a logikai vagy opertorok. A C#-ban a mveleteket a kvetkez
kppen jelljk:

Tagads (negci) !
S (konjunkci) &&
VAGY (diszjunkci) ||

Nzzk az opertorok igazsgtblzatt a bemen paramterek klnbz rtkei


mellett za opercik milyen eredmnyt szolgltatnak?

Tagads:
A !A
TRUE FALSE
FALSE TRUE

Teht minden rtket az ellentettjre fordt.

S
A B A && B
TRUE TRUE TRUE
FALSE TRUE FALSE
TRUE FALSE FALSE
FALSE FALSE FALSE

Azaz kizrlag akkor lesz a mvelet eredmnye igaz, ha mindkt paramter rtke
igaz.

VAGY
A B A || B
TRUE TRUE TRUE

55/312
FALSE TRUE TRUE
TRUE FALSE TRUE
FALSE FALSE FALSE

Lthat, hogy akkor hamis a mvelet eredmnye, ha mindkt paramter rtke


hamis.

Egy kifejezs kirtkelsben a zrjelek hatrozzk meg a kirtkels sorrendjt,


ha ez nem dnt, akkor a sorrend: TAGADS, S, VAGY. Egyenrang mveletek
esetn a balrl-jobbra szably lp letbe.

bool logikai = true;


int x = 2, y = 5 ;
logikai = x > 4; // FALSE
logikai = logikai && !(y < 3); // FALSE
logikai = (x < 3) || (x > 4); // TRUE
logikai = (x >= 3) && (x <= 4); // FALSE
logikai = x > 3 && !(y < 6) || x < y; // TRUE

A feltteles utasts

if (logikai kifejezs)
{
igaz rtk esetn vgrehajtand utastsok
}

if (y > 20)
Console.Write("Igaz kifejezs");

Lthat, hogy ha mindssze egy utastst szeretnnk vgrehajtani, akkor a kapcsos


zrjelek elhagyhatak.

Elrhatunk sszetett logikai feltteleket az if tbbszrzsvel, vagy operatorok


segtsgvel.

if (x > 10)
if (y > 20)
Console.Write("Kifejezs igaz, igaz esetn");

A fenti kdrszlet csak akkor rja ki a szveget, ha egyszerre teljesl, hogy x > 10 s
ugyanakkor y > 20 is. Ezt lerhatjuk az s opertor alkalmazsval is:

if (x > 10 && y > 20)

56/312
Console.Write("Kifejezs igaz, igaz esetn ");

Tekintsk az albbi programrszletet:

Console.Write("Krem a karaktert: ");


char c = (char) Console.Read();
if (Char.IsLetter(c))
if (Char.IsLower(c))
Console.WriteLine("A karakter kisbet.");

A billentyzetrl bekrnk egy karaktert. Kt vizsglatot csinlunk, az els if


felttelben megvizsgljuk hogy a kapott karakter bet-e, ha ez teljesl, akkor a
msodik if felttelben vizsgljuk, hogy a karakter kisbet-e. Amennyiben mindkett
felttel teljesl, akkor jelenik meg a szveg a kpernyn. Brmely felttel hamis
llapota esetn a szveg kirsa elmarad.

Az elgazs

if (logikai kifejezs)
{
igaz rtk esetn vgrehajtand utastsok
}
else
{
Hamis rtk esetn vgehajtand utastsok
}

if (y > 20)
Console.Write("Igaz kifejezs");
else
Console.Write("Hamis kifejezs");

Amennyiben a logikai kifejezs rtke hamis, akkor az else utni utastsok kerlnek
vgrehajsra. Itt is rvnyes, hogy tbb utasts megadsa esetn hasznlni kell a
kapcsos zrjeleket.

public static void Main()


{
Console.Write("Krem a karaktert: ");
char c = (char)Console.Read();
if (Char.IsLetter(c))
if (Char.IsLower(c))
Console.WriteLine("a karakter kisbet.");

57/312
else
Console.WriteLine("A karakter nagybet.");
else
Console.WriteLine("A karakter nem bet");
}

Ebben az esetben nem hasznlhatunk a 2 db if utasts helyett logikai opertorral


sszekapcsolt kifejezst, mert a hamis esetet kln kezeljk le.
Ha a bels if utasts logikai kifejezse hamis, akkor a "A karakter nagybets."
szveg jelenik meg. Mg ha a kls if logikai kifejezse hamis, akkor a bert karakter
mr nem is bet, hanem valami ms karakter jelenik meg, pl.: szmjegy. Ekkor a "A
karakter nem bet" szveg fog megjelenni.

Nhny egyszer pldt a szelekci alkalmazsra.

Dntsk el egy szmrl, hogy pros-e!

static void Main(string[] args)


{
int szam;
szam = Int32.Parse(Console.ReadLine());
if (szam % 2 == 0)
Console.WriteLine("A szm pros");
else
Console.WriteLine(" A szm pratlan");
}

A deklarls utn bekrnk a egy szmot. Mivel ez karaktersorozat, gy egsz


szmm kell konvertlni. Az if utasts egyszer logikai felttelt tartalmaz. A % jel a
maradkkpzs opertora, a szam % 2 megadja a szam nev vltoz rtknek
kettes maradkt. Ez pros szm esetn 0, gy ezt vizsgljuk. A logikai egyenlsg
relci opertora a == karakterekkel jelljk. Ne prbljuk meg az rtkads =
jelvel helyettesteni.

58/312
Oldjuk meg az egytthatival adott msodfok egyenletet!

static void Main(string[] args)


{
double a, b, c, d;
double x1, x2;
a = double.Parse(Console.ReadLine());
if (a == 0)
{
Console.WriteLine("gy nem msodfok az egyenlet!");
}
else
{
b = double.Parse(Console.ReadLine());
c = double.Parse(Console.ReadLine());
d = b * b - 4 * a * c;
if (d < 0)
Console.WriteLine("Nincs vals megolds");
else
{
x1 = (-b + Math.Sqrt(d)) / (2 * a);
x2 = (-b + Math.Sqrt(d)) / (2 * a);
Console.WriteLine("X1 = {0} X2 = {1} ",x1,x2);
}
}
Console.ReadLine();
}

59/312
Megoldsra ajnlott feladatok

1.
Egy beolvasott szmrl dntse el a program hogy -30 s 40 kztt van-e!

2.
Kt beolvasott szm kzl rassuk ki a nagyobbikat!

3.
Vizsgljuk meg hogy oszthat-e egy A egsz szm egy B egsz szmmal!

4.
Tetszleges 0 s egymilli kztti egsz szmrl mondja meg a program hogy hny
jegy!

5.
Adott egy tetszleges pont koordintival. Hatrozzuk meg melyik sknegyedben
van!

6.
Rendeztessnk sorba 3 egsz szmot!

7.
Hrom tetszleges, szmrl dntse el a program hogy szmtani sorozatot alkotnak e!

8.
Hrom adott szmrl dntse el a program, hogy lehetnek-e egy hromszg
oldalainak mrszmai.

9.
Olvassunk be ngy szmot s hatrozzuk meg a pronknti minimumok maximumt!

10.
rjunk programot, mely kibarkochbzza, hogy milyen ngyszgre gondoltam
(ngyzet, tglalap, rombusz, stb)!

60/312
Programozs tanknyv

VI. Fejezet

Elrt lpsszm ciklusok


Ismtls a tuds anyja.

Hernyk Zoltn

61/312
Az eddig megrt programok szekvencilis mkdsek voltak. A program
vgrehajtsa elkezddtt a Main fggvny els utastsn, majd haladtunk a
msodikra, harmadikra, stb amg el nem rtk az utols utastst, amikor is a
program mkdse lellt.

Nem minden problma oldhat meg ilyen egyszeren. St, leggyakrabban nem
rhat fel a megolds ilyen egyszer lpsekbl. Vegyk az albbi programozsi
feladatot: rjuk ki az els 5 ngyzetszmot a kpernyre (ngyzetszmnak nevezzk
azokat a szmokat, amelyek valamely ms szm ngyzeteknt elllthatak - ilyen
pl. a 25).

public void Main()


{
Console.WriteLine(1. ngyzetszm = 1);
Console.WriteLine(2. ngyzetszm = 4);
Console.WriteLine(3. ngyzetszm = 9);
Console.WriteLine(4. ngyzetszm = 16);
Console.WriteLine(5. ngyzetszm = 25);
}

A fenti program mg a hagyomnyos szekvencilis mkds betartsval rdott. De


kpzeljk el ugyanezt a programot, ha nem az els 5, de els 50 ngyzetszmot kell
kirni a kpernyre!

Vegyk szre, hogy a program sorai nagyjbl egyformk, kt ponton klnbznek


egymstl: hogy hnyadik ngyzetszmrl van sz, s annak mennyi az rtke. Az
hogy hnyadik ngyzetszmrl van sz az mindig 1-gyel nagyobb az elz rtktl.

Nzzk az albbi pszeud-utastssorozatot:


1. I := 1
// az I vltoz rtke legyen 1
2. rd ki: I,. ngyzetszm = , I*I
3. I := I+1
// az I vltoz rtke nvelve 1-el
4. ugorj jra a 2. sorra

Ennek sorn kirdik a kpernyre az 1. ngyzetszm= 1, majd a 2. ngyzetszm


= 4, 3. ngyzetszm = 9, stb

A fenti kdot nevezhetjk kezdetleges ciklusnak is. A ciklusok olyan


programvezrlsi szerkezetek, ahol a program bizonyos szakaszt (sorait)
tbbszr is vgrehajthatjuk. Ezt a szakaszt ciklus magnak nevezzk.

A fenti pldaprogramban ez a szakasz (a ciklusmag) a 2. s a 3. sorbl ll. A 4. sor


lnyege, hogy visszaugrik a ciklusmag els utastsra, ezzel knyszertve a
szmtgpet a ciklusmag jbli vgrehajtsra.

62/312
Vegyk szre, hogy ez a ciklus vgtelen ciklus lesz, hiszen minden egyes
alkalommal a 4. sor elrsekor visszaugrunk a 2. sorra, gy a program a
vgtelensgig fut. Ez jellemzen helytelen viselkeds, az algoritmusok, s a
programok egyik fontos viselkedsi jellemzje, hogy vges sok lps vgrehajtsa
utn lellnak. Mdostsunk a kdon:
1. I := 1 // az I vltoz
legyen 1
2. Ha az I rtke nagyobb, mint 5, akkor ugorj a 6. sorra
3. rd ki: I,. ngyzetszm = , I*I
4. I := I+1 // az I vltoz rtke
nvelve 1-el
5. ugorj jra a 2. sorra
6. .

A 2. sorba egy felttel kerlt, mely ha teljesl, akkor befejezzk a ciklusmag


vgrehajtst, mivel kilpnk a ciklusbl, a ciklus utni els utastsra ugorva.

Hogy ezen felttel legels alkalommal is kirtkelhet legyen, az 1. sorban belltjuk


az I vltoz rtkt (rtkads). Valamint szintn figyeljk meg a 4. sort. Ezen sor is
nagyon fontos, hiszen az I rtke e nlkl nem rhetn el a kilpshez szksges 6
rtket.

A ciklusoknak teht az albbi fontos jellemzjk van:


Tartalmaznak egy utastsblokkot, amelyet akr tbbszr is vgrehajtanak
(ciklusmag).
Tartalmaznak egy felttelt (vezrl felttel), amely meghatrozza, hogy kell-e
mg ismtelni a ciklusmagot .
A ciklusmag tartalmaz olyan utastst, amelynek segtsgvel elbb-utbb
elrjk azt az llapotot, hogy kilphessnk a ciklusbl.
Tartalmaznak egy kezdrtkadst (a ciklus eltt), amely biztostja, hogy a
ciklus felttele mr legels alkalommal is egyrtelmen kirtkelhet legyen.

A C#-ban a legnpszerbb ciklus a FOR ciklus:

public void Main()


{
int i;
for (i=1;i<=5;i=i+1)
{
Console.WriteLine({0}. ngyzetszm = {1},i,i*i);
}
}

A fenti pldban a for kulcsszval jelljk, hogy ciklus szeretnnk rni. A for kulcssz
utn zrjelben hrom dolgot kell megadni:
kezdrtk belltsa ( i=1 ),
ismtlsi felttel ( i<=5 ),
lptet utasts ( i=i+1 ).

63/312
Formailag a hrom rszt pontosvesszvel kell elvlasztani. A ciklusmagot pedig
kapcsos zrjelek kz kell tenni (utastsblokk). A C# az albbi mdon rtelmezi a
for ciklust:
1. vgrehajtja a kezdrtkadst,
2. kirtkeli a vezrl felttelt, s ha HAMIS, akkor kilp a ciklusbl,
3. vgrehajtja a ciklusmagot,
4. vgrehajtja a lptet utastst,
5. visszaugrik a 2. lpsre.

Ha a vezrl felttel igaz, akkor vgrehajtja a ciklusmag utastsait, ezrt ebben az


esetben a vezrl felttelt a ciklusban marads felttelnek is nevezhetjk.

Msik dolog, amit megfigyelhetnk: a vezrl felttel kirtkelse mr legels


alkalommal is a ciklusmag eltt hajtdik vgre. Ennek megfelelen egy hibs
kezdrtkads eredmnyezheti azt is, hogy a ciklusmag egyetlen egyszer sem
hajtdik vgre. Pldul:

for (i=10;i<=5;i=i+1)
{
Console.WriteLine(i);
}

A for ciklusra jellemz, hogy tartozik hozz egy ciklusvltoz, melyet az esetek
tbbsgben i-vel jellnk, elssorban hagyomnytiszteletbl. Ezen i vltoz
felveszi a kezdrtkt, majd szintn az esetek tbbsgben ezt az rtket minden
ciklusmag lefutsa utn 1-el nveli, amg tl nem lpjk a vgrtket. A for ciklus egy
nagyon gyakori alakja teht felrhat az albbi mdon (cv jelli a ciklusvltozt):

for (cv = kezdrtk, cv <= vgrtk, cv = cv+1) ...

64/312
Ennek megfelelen elre kiszmthat, hogy a ciklusmag hnyszor hajtdik vgre:

for (i=1;i<=10;i++)
{
Console.WriteLine(i);
}

Ezen ciklus magja legels alkalommal az i=1, majd i=2, , i=10 rtkekre hajtdik
vgre, sszesen 10 alkalommal.

Vegyk az albbi programozsi feladatot: krjnk be 3 szmot, s rjuk ki a


kpernyre a 3 szm sszegt. Az els megolds mg nem tartalmaz ciklust:

int a,b,c,ossz;
a = Int32.Parse( Console.ReadLine() );
b = Int32.Parse( Console.ReadLine() );
c = Int32.Parse( Console.ReadLine() );
ossz = a+b+c;
Console.WriteLine(A szmok sszege ={0},ossz);

Ugyanakkor, ha nem 3, hanem 30 szmrl lenne sz, akkor mr clszertlen lenne a


program ezen formja. Kicsit alaktsuk t a fenti programot:

int a,ossz;
ossz = 0;
a = Int32.Parse( Console.ReadLine() );
ossz = ossz+a;
a = Int32.Parse( Console.ReadLine() );
ossz = ossz+a;
a = Int32.Parse( Console.ReadLine() );
ossz = ossz+a;
Console.WriteLine(A szmok sszege ={0},ossz);

A fenti program ugyanazt teszi, mint az elz, de mr ltszik, melyik az


utastscsoport, amelyet 3-szor meg kell ismtelni. Ebbl mr knny ciklust rni:

int i,a,ossz=0;
for(i=1;i<=3;i=i+1)
{
a = Int32.Parse( Console.ReadLine() );
ossz = ossz+a;
}
Console.WriteLine(A szmok sszege ={0},ossz);

Sokszor ez a legnehezebb lps, hogy egy mr meglv szekvencilis szerkezet


programban talljuk meg az ismtelhet lpseket, s alaktsuk t ciklusos
szerkezetv.

65/312
Programozsi feladat: Ksztsk el az els 100 egsz szm sszegt.

int i,ossz=0;
for (i=1; i<=100 ; i=i+1)
{
ossz = ossz + i;
}
Console.WriteLine(Az els 100 egsz szm sszege
={0},ossz);

Jegyezzk meg, hogy a ciklusokban az i=i+1 utasts nagyon gyakori, mint lptet
utasts. Ezt gyakran i++ alakban rjk a programozk. A ++ egy opertor, jelentse
nveld meg 1-gyel az rtkt. A prja a -- opertor, amelynek jelentse: cskkentsd
1-gyel az rtkt.

Msik szrevtelnk, hogy arnylag gyakori, hogy a ciklusmag egyetlen utastsbl


ll csak. Ekkor a C# megengedi, hogy ne tegyk ki a blokk kezdet s blokk vge
jeleket. Ezrt a fenti kis program az albbi mdon is felrhat:

int i,ossz=0;
for (i=1; i<=100 ; i++ )
ossz = ossz + i;
Console.WriteLine(Az els 100 egsz szm sszege
={0},ossz);

Magyarzat: a program minden lpsben hozzad egy szmot az ossz vltozhoz,


amelynek indulskor 0 a kezdrtke. Els lpsben 1-et, majd 2-t, majd 3-t, ,
majd 100-t ad az ossz vltoz aktulis rtkhez, gy lltvn el az els 100 szm
sszegt.

Megjegyzs: a fenti feladat ezen megoldsa, s az alkalmazott mdszer rdekes


tanulsgokat tartalmaz. Ugyanakkor a problma megoldsa az els N ngyzetszm
sszegkpletnek ismeretben egyetlen rtkadssal is megoldhat:

ossz= 100*101 / 2;

Programozsi feladat: Hatrozzuk meg egy szm faktorilisnak rtkt. A szmot


krjk be billentyzetrl.

int szam,i,fakt=1;
szam = Int32.Parse( Console.ReadLine() );
for (i=1; i<=szam ; i++ )
fakt = fakt * i;
Console.WriteLine(A(z) {0} szm faktorilisa = {1},
szam, fakt );

Magyarzat: pl. a 6 faktorilis gy szmolhat ki, hogy 1*2*3*4*5*6. A program a


fakt vltoz rtkt megszorozza elszr 1-el, majd 2-vel, majd 3-al, , vgl
magval a szmmal, gy szmolva ki lpsrl lpsre a vgeredmnyt.

66/312
Megjegyzs: a szam nvelsvel a faktorilis rtke gyorsan n, ezrt csak kis
szmokra (kb. 15-ig) tesztelhetjk csak a fenti programot.

Programozsi feladat: Hatrozzuk meg egy szm pozitv egsz kitevj hatvnyt!
A szmot, s a kitevt krjk be billentyzetrl!

int szam,kitevo,i,ertek=1;
szam = Int32.Parse( Console.ReadLine() );
kitevo = Int32.Parse( Console.ReadLine() );
for (i=1; i<=kitevo ; i++ )
ertek = ertek * szam;
Console.WriteLine(A(z) {0} szm {1}. hatvnya = {2},
szam,kitevo,ertek);

Magyarzat: pl. 4 harmadik hatvnya kiszmolhat gy, hogy 4*4*4. A program a


ertek vltoz rtkt megszorozza annyiszor a szam-al, ahnyszor azt a kitev
elrja.

Programozsi feladat: Hatrozzuk meg egy szm osztinak szmt! A szmot


krjk be billentyzetrl!

int szam,i,db=0;
szam = Int32.Parse( Console.ReadLine() );
for (i=1; i<=szam ; i++ )
if (szam%i==0) db++;
Console.WriteLine(A(z) {0} szm osztinak szma:
{1}.,szam,db);

Magyarzat: a 10 lehetsges oszti az 1..10 tartomnyba esnek. A mdszer lnyege,


hogy sorba prblkozunk a szba jhet szmokkal, mindegyiket ellenrizve, hogy
az osztja-e a szmnak, vagy sem. Az oszthatsgot a % opertorral ellenrizzk.
A % opertor meghatrozza a kt operandusnak osztsi maradkt (pl. a 14%4
rtke 2 lesz, mert 14 osztva 4-gyel 2 osztsi maradkot ad). Amennyiben az osztsi
maradk 0, gy az i maradk nlkl osztja a szam vltoz rtkt, ezrt az i
vltozban lv rtk egy oszt. Minden oszt-tallat esetn nveljk 1-gyel a db
vltoz rtkt.

Programozsi feladat: rassuk ki a kpernyre egy szm sszes tbbszrst,


amelyek nem nagyobbak, mint 100, cskken sorrendben! A szmot krjk be
billentyzetrl!

int szam,i;
szam = Int32.Parse( Console.ReadLine() );
for (i=100; i>=szam ; i-- )
if (i % szam == 0) Console.WriteLine({0} ,i);

Magyarzat: elindulunk 100-tl, visszafele haladunk, minden lpsben cskkentve a


ciklusvltoznk rtkt (i--). Minden lpsben megvizsgljuk, hogy a szban forg i
tbbszrse-e az eredeti szmnak. Ez akkor teljesl, ha a szm maradk nlkl

67/312
osztja az i-t. Valahnyszor tallunk ilyen i rtket, mindannyiszor kirjuk azt a
kpernyre.

Ugyanezen feladat megoldhat hatkonyabban, ha figyelembe vesszk, hogy ezen


szmok egymstl szam tvolsgra vannak:

int szam,i,max;
szam = Int32.Parse( Console.ReadLine() );
max = (100/szam)*szam;
for (i=max; i>=szam ; i=i-szam )
if (i % szam == 0) Console.WriteLine({0} ,i);

Magyarzat: a 100/szam osztsi mvelet, mivel kt egsz szm tpus rtk kztt
kerl vgrehajtsra automatikusan egsz osztsnak minsl. Ha a szam rtke pl.
7, akkor a 100/szam eredmnye 14. Ha ezt visszaszorozzuk a szam-al, akkor
megkapjuk a legnagyobb olyan rtket, amely biztosan tbbszrse a szam-nak, s
nem nagyobb mint 100, s a legnagyobb ilyen tbbszrse a szam-nak, amely nem
nagyobb mint 100 (max). Ez lesz a kiindul rtke a ciklusvltoznak. A tovbbi
tbbszrsket gy kapjuk, hogy a kiindul rtket minden cikluslpsben
cskkentjk szam-al.

68/312
Feladatok:

1. Programozsi feladat: llaptsuk meg egy billentyzetrl bekrt szmrl,


hogy prmszm-e! A prmszmoknak nincs 1 s nmagn kvl ms osztja.

2. Programozsi feladat: llaptsuk meg kt billentyzetrl bekrt szmrl, hogy


mi a legnagyobb kzs osztjuk! A legnagyobb olyan szm, amely mindkt
szmot osztja. Ezen rtket meghatrozhatjuk keresssel (ciklus), vagy az
Euklideszi algoritmussal is.

3. Programozsi feladat: llaptsuk meg kt billentyzetrl bekrt szmrl, hogy


relatv prmek-e! Akkor relatv prmek, ha a legnagyobb kzs osztjuk az 1.

4. Programozsi feladat: lltsuk el egy szm prmtnyezs felbontst! Pl:


360=2*2*2*3*3*5!

5. Programozsi feladat: llaptsuk meg, hogy egy adott intervallumba es


szmok kzl melyik a legnagyobb prmszm! Az intervallum als s fels
hatrnak rtkt krjk be billentyzetrl! Prbljunk keresni id-hatkony
megoldsokat!

6. Programozsi feladat: rjunk olyan programot, amely egy sszegz ciklussal


kiszmolja s kirja az albbi szmtani sorozat els 20 elemnek sszegt:
3,5,7,9,11,stb.! Ellenrizzk le az eredmnyt a szmtani sorozat
sszegkplete segtsgvel!

7. Programozsi feladat: rjunk olyan programot, amely kiszmolja s kirja az


albbi vltoz nvekmny szmtani sorozat els 20 elemnek sszegt:
3,5,8,12,17,23,30,stb.!

8. Programozsi feladat: rjunk olyan programot, amely bekri egy tetszleges


szmtani sorozat els elemt, s a differencit! Ezek utn kirja a kpernyre
a szmtani sorozat els 20 elemt, az elemeket egymstl vesszvel
elvlasztva, egy sorban!

9. Programozsi feladat: rjunk olyan programot, amely bekri egy tetszleges


mrtani sorozat els elemt, s a kvcienst! Ezek utn kirja a kpernyre a
mrtani sorozat els 20 elemt, s az elemek sszegt!

10. Programozsi feladat: Szmoljuk ki s rjuk ki a kpernyre a 2n rtkeit


n=1,2,,10-re!

11. Programozsi feladat: Szmoljuk ki s rjuk ki a kpernyre az an=an-1+2n


sorozat els 10 elemt, ha a1=1!

69/312
12. Programozsi feladat: rjunk olyan programot, amely addig rja ki a
kpernyre a an=2n-2n-1 sorozat elemeit a kpernyre, amg a sorozat
kvetkez elemnek rtke meg nem haladja az 1000-t! A sorozat els eleme:
a1=1!

13. Programozsi feladat: Hatrozzuk meg az els n ngyzetszm sszegt! N


rtkt krjk be billentyzetrl!

14. Programozsi feladat: Hatrozzuk meg egy [a,b] intervallum belsejbe es


ngyzetszmokat (rjuk ki a kpernyre), s azok sszegt! Az a s b rtkt
krjk be billentyzetrl!

15. Programozsi feladat: Szmoljuk ki s rjuk ki a kpernyre a Fibonacci


sorozat els 10 elemt! A sorozat az albbi mdon szmthat ki:
a1 = 1
a2 = 1
an = an-1 + an-2 ha n>2

70/312
Programozs tanknyv

VII. Fejezet

Vektorok!

Radvnyi Tibor

71/312
Vektorok kezelse

A tmb egy sszetett homogn adatstruktra, melynek tetszleges, de elre


meghatrozott szm eleme van. Az elemek tpusa azonos. A tmb lehet egy vagy
tbbdimenzis, a dimenzi szma nem korltozott. Fejezetnkben az egydimenzis
tmbk kezelsvel foglalkozunk, melynek alapjn a tbbdimenzis tmbk kezelse
is elsajtthat.

Tmb deklarlsa
Hasonlan trtnik, mint egy hagyomnyos vltoz, csak a [] jellel kell jelezni, hogy
tmb kvetkezik:
int[] tm;

Ilyenkor a tmbnk mg nem hasznlhat, hiszen a memriban mg nem trtnt


meg a helyfoglals. Ezt a new opertor hasznlatval tehetjk meg.
int[] tm;
tm = new int[5];

vagy egyszeren:
int[] tm = new int[5];

Ezzel ltrehoztunk egy 5 elem, int tpus tmbt. Hasznlhatjuk, feltlthetjk,


mveleteket vgezhetnk vele. A fentiekhez hasonlan tudunk string, vals, stb
tmbt deklarlni:
string[] stm = new string[5]; // 5 elem string tmb
double[] dtm = new double[10]; // 10 elem vals tmb
bool[] btm = new bool[7]; // 7 elem logikai tmb

A tmb elemeire indexeik segtsgvel hivatkozhatunk. Ez mindig 0-tl indul s


egyesvel nvekszik.
tm[0] = 1; tm[1] = 2; tm[2] = 17; tm[3] = 90; tm[4] = 4;
stm[0] = "Els";
btm[0] = true;

Megtehetjk, hogy a tmb deklarcijakor meg adjuk az elemeit, ha van r


lehetsgnk s ismeretnk:

72/312
int[] tm2 = new int[3] {3,4,5};
string[] stm2 = new string[3] {"els","msodik","harmadik"};

Ha az elbbi mdon hasznljuk a tmb deklarcit, azaz rgtn megadjuk a


kezdrtkeket is, akkor a new opertor elhagyhat:
int[] tm3 = {1,2,3};
string[] stm3 = {"aaa","bbb","ccc"};

A tmb elemeinek elrse

A tmb elemein vgiglpkedhetnk egy egyszer for ciklus alkalmazsval, vagy


hasznlhatjuk a foreach ciklust, ha ltalnos fggvnyt szeretnnk rni.

int i;
for (i = 0; i < 5; i++)
{
tm[i] = 1; // alaprtket ad a tm tmb elemeinek
}

for (i = 0; i < tm.Length; i++)


{
tm[i] = 2 * tm[i]; // duplzza a tm tmb elemeit
}

foreach (int s in tm)


{
System.Console.WriteLine(s.ToString()); // kirja a tm tmb
elemeit
}

A length tulajdonsg segtsgvel megkapjuk a tmb mrett, melyet akr ciklusban


is hasznlhatunk paramterknt.

73/312
A tmb elemeinek rendezse, keress a tmbben

A tmb kiratshoz hasznlhatunk egy egyszer metdust:

private static void ShowArray(int[] k)


{
foreach (int j in k)
System.Console.Write(j.ToString()+" ");
System.Console.WriteLine();}

Ennek a segtsgvel vizsgljuk meg az Array osztly lehetsgeit.


A Sort metdus, melynek egy paramtere van, helyben rendezi a paramterknt
kapott tmbt.
Deklarcija:
public static void Sort(Array array);

Hasznlata:
tm[0] = 1; tm[1] = 2; tm[2] = 17; tm[3] = 90; tm[4] = 4;
ShowArray(tm);
Array.Sort(tm);
ShowArray(tm);

Eredmny:
Az els kiratskor:
1 2 17 90 4
A msodik kiratskor:
1 2 4 17 90
Ebben az esetben a teljes tmb rendezsre kerl. Ha a Sort metdus hrom
paramteres vltozatt hasznljuk, akkor a tmb egy rsztmbjt rendezhetjk.

Deklarcija:
public static void Sort(Array array, int index, int length);

74/312
Ekkor az index paramtertl kezdve a length paramterben megadott hosszban
kpzdik egy rszhalmaza a tmb elemeinek, s ez kerl rendezsre.
Hasznlata:
tm[0] = 1; tm[1] = 2; tm[2] = 17; tm[3] = 90; tm[4] = 4;
ShowArray(tm);
Array.Sort(tm,3,2);
ShowArray(tm);

Eredmny:
Az els kiratskor:
1 2 17 90 4
A msodik kiratskor:
1 2 17 4 90
Teht csak a 90 s a 4 cserlt helyet, mert csak az utols kt elem rendezst rjk
el a paramterek (3,2).

A rendezs kvetkez esete, amikor kt tmb paramtert hasznlunk.

Deklarcija:
public static void Sort( Array keys, Array items);

Keys : egy egydimenzis tmb, mely tartalmazza a kulcsokat a rendezshez


Items: elemek, melyek a Keys tmb elemeinek felelnek meg.
A metdus rendezi a keys tmb elemeit, s ennek megfelelen az items tmb
elemeinek sorrendje is vltozik.

75/312
Hasznlata:
A string tmb elemeinek kiratshoz hasznlt metdus:
private static void ShowArrayST(string[] k)
{
foreach (string j in k)
System.Console.Write(j+" ");
System.Console.WriteLine();
}
tm[0] = 1; tm[1] = 34; tm[2] = 17; tm[3] = 90; tm[4] = 4;
string[] stm2 = new string[5] {"els","msodik","harmadik", "negyedik",
"tdik"};
ShowArray(tm);
ShowArrayST(stm2);
Array.Sort(tm,stm2);
ShowArray(tm);
ShowArrayST(stm2);

Eredmny az els kirats utn:


1 34 17 90 4
els msodik harmadik negyedik tdik

Eredmny a msodik kirats utn:


1 4 17 34 90
els tdik harmadik msodik negyedik

Az elz kulcsos rendezshez hasonlan, de csak rszhalmaz rendezsre


hasznlhat az albbi metdus:

Deklarci:
public static void Sort(Array keys, Array items, int index, int
length);

keys: egy egydimenzis kulcsokat tartalmaz tmb


items: egy egydimenzis, a kulcsokhoz tartoz elemeket tartalmaz tmb
index: a rendezend terlet kezdpozcija
length: a rendezend terlet hossza

76/312
Hasznlata:
tm[0] = 1; tm[1] = 34; tm[2] = 17; tm[3] = 90; tm[4] = 4;
string[] stm2 = new string[5] {"els","msodik","harmadik", "negyedik",
"tdik"};
ShowArray(tm);
ShowArrayST(stm2);
Array.Sort(tm,stm2,3,2);
ShowArray(tm);
ShowArrayST(stm2);

Eredmny az els kirats utn:


1 34 17 90 4
els msodik harmadik negyedik tdik

Eredmny a msodik kirats utn:


1 34 17 4 90
els msodik harmadik tdik negyedik

Kvetkezzen nhny alapfeladat, melyenek megoldshoz tmbket hasznlunk.

77/312
Vektor feltltse billentyzetrl

Ebben az egyszer pldban bekrnk 5 db egsz szmot a billentyzetrl. Mivel a


Console.ReadLine() fggvny visszatrsi rtke string, ezrt ezt t kell alaktani a
megfelel formtumra a Convert osztly ToInt32 metdusnak a segtsgvel.
Semmifle ellenrzst nem tartalmaz a kd, gy csak egsz szmok esetn mkdik
jl. Ha szm helyett szveget, pldul almafa runk az adatbekrs helyre, akkor a
program hibazenettel lell.

int[] tm = new int[5];


int i;
for (i=0; i<5; i++)
{
Console.WriteLine("Krem a {0}. szmot",i+1);
tm[i] = Convert.ToInt32(Console.ReadLine());
}
ShowArray(tm);

A futs eredmnye:

Mdostsuk gy a programot, hogy csak olyan rtkeket fogadjon el, melyek mg


eddig nem szerepeltek. Azaz krjnk be a billentyzetrl 5 db klnbz egsz
szmot.

78/312
int[] tm = new int[5];
int i, j;
bool nem_volt = true;
for (i=0; i<5; i++)
{
Console.WriteLine("Krem a {0}. szmot",i+1);
tm[i] = Convert.ToInt32(Console.ReadLine());
nem_volt = true;
j = 0;
for (j = 0; j < i; j++)
if (tm[i] == tm[j])
{
i--;
break;
}
}
ShowArray(tm);

A futs eredmnye:

79/312
Vektor feltltse vletlenszm-genertorral

Nzzk meg az elz feladatot, de most hasznljuk a tmb feltltshez a


vletlenszm-genertort. Ebben az esetben biztostjuk, hogy az rtkek
tpushelyesek legyenek.
A vletlenszm-genertort a Random osztlybl rjk el. Ksztsnk egy rnd nev
pldnyt belle. Hasznlatkor az rnd pldny paramtereknt adjuk meg a fels
hatrt a generland szmnak.

int[] tm = new int[5];


int i, j;
bool nem_volt;
Random rnd = new Random();//Egy pldny a Random osztlybl
for (i=0; i<5; i++)
{
tm[i] = rnd.Next(100);
}
ShowArray(tm);

Oldjuk meg ezt a feladatot is gy, hogy ne engedjk meg az ismtldst a generlt
szmok kztt.
int[] tm = new int[5];
int i, j;
bool nem_volt;
Random rnd = new Random(); //Egy pldny a Random osztlybl
for (i=0; i<5; i++)
{
tm[i] = rnd.Next(100);
nem_volt = true;
j = 0;
for (j = 0; j < i; j++)
if (tm[i] == tm[j])
{
break;
}
}
ShowArray(tm);

80/312
A futs eredmnye:

N elem vektorok kezelse

Egyszer programozsi ttelek alkalmazsa vektorokra

sszegzs
Feladat: Adott egy 10 elem, egsz tpus tmb. Tltsk fel vletlen szmokkal, majd
hatrozzuk meg a szmok sszegt.

Megolds:

int[] tm = new int[10];


int i, sum = 0;
Random rnd = new Random();
for (i=0 ; i<10; i++)
{
tm[i] = rnd.Next(100,200);
Console.Write("{0} ",tm[i]);
}
Console.WriteLine();
for (i=0; i<10; i++)
sum += tm[i];
Console.WriteLine("A szmok sszege: {0}", sum);

Magyarzat:

81/312
Az els sorban deklarlunk egy int tpus elemeket tartalmaz tmbt, melynek a
neve tm. Rgtn le is foglaljuk a memriban 10 elem helyt.
Az i ciklusvltoz, a sum a gyjtvltoz lesz, melyben a tmb elemeinek az
sszegt generljuk. Ezrt ennek 0 kezdrtket kell adni.
Ltrehozunk a Random osztlybl egy rnd nev pldnyt. Ennek a segtsgvel
fogjuk ellltani a vletlen szmokat. Az els for ciklusban feltltjk a tmbt a
vletlen szmokkal.
Az sszegzst a msodik for ciklus vgzi, vgiglpkedve az elemeken, s azok
rtkvel nveli a sum vltoz pillanatnyi rtkt. Majd kiratjuk a vgeredmnyt.

Maximum s minimum kivlasztsa

Feladat: Adott egy 10 elem, egsz szmokat tartalmaz tmb. Tltsk fel vletlen
szmokkal, majd hatrozzuk meg a legnagyobb illetve legkisebb elem rtkt.

Megolds:

int[] tm = new int[10];


int i, max, min;
Random rnd = new Random();
for (i=0 ; i<10; i++)
{
tm[i] = rnd.Next(100,200);
Console.Write("{0} ",tm[i]);
}
Console.WriteLine();
max = tm[0]; min = tm[0];
for (i = 1; i < 10; i++)
{
if (tm[i] > max) max = tm[i];
if (tm[i] < min) min = tm[i];
}
Console.WriteLine("A szmok minimuma: {0}, maximuma: {1}", min, max);

82/312
Magyarzat:
A program eleje hasonl az sszegzsnl ltottakkal. Egy max s egy min vltozt is
deklarlunk. Itt fogjuk megjegyezni az aktulis legnagyobb s legkisebb elemet. A
pldban az elem rtkt jegyezzk meg, de van r lehetsg, hogy a tmbindexet
troljuk el, attl fggen, hogy a feladat mit kvetel meg tlnk.
Az rtkek feltltse utn a kvetkez for ciklussal vgignzzk az elemeket, s ha
tallunk az aktulis szlsrtknl nagyobb illetve kisebb tmbrtket, akkor onnan
kezdve az lesz a max, vagy a min rtke.

Eldnts

Feladat: Feladat: Adott egy 10 elem, egsz szmokat tartalmaz tmb. Tltsk fel
vletlen szmokkal, majd krjnk be egy egsz szmot a billentyzetrl. Dntsk el
hogy a bekrt szm szerepel e a 10 elem tmbben.

Megolds:

int[] tm = new int[10];


int i;
Random rnd = new Random();
for (i=0 ; i<10; i++)
{
tm[i] = rnd.Next(100,200);
Console.Write("{0} ",tm[i]);
}
Console.WriteLine();
int szam = Int32.Parse(Console.ReadLine());
i = 0;
while (i < 10 && szam != tm[i]) i++;
if (i < 10) Console.WriteLine("A szm szerepel a tmbben");
else Console.WriteLine("A szm nem szerepel a tmbben");
Console.ReadLine();

Magyarzat:
A tmb feltltse utn krjnk be egy szmot a billentyzetrl. gyelve a konverzi
szksgessgre. Ehhez itt a Int32.Parse fggvnyt hasznltuk.

83/312
Az eldntshez egy while, elltesztel ciklust hasznlunk sszetett logikai felttellel.
Az els felttel azt ellenrzi, hogy benne vagyunk e mg a tmbben, a msodik,
hogy mg nem talltuk meg a keresett rtket. Mivel logikai S kapcsolat van a kt
felttel kztt, gy a ciklusmag akkor hajtdik vgre, ha mindkt felttel igaz. A
ciklusmagban az i ciklusvltoz rtkt nveljk. Ha brmelyik felttel hamiss vlik,
akkor kilpnk a ciklusbl. gy utna az if felttelel dntjk el a kilps okt, azaz
hogy megtalltuk a szm els elfordulst, vagy elfogyott a tmb. Ennek
megfelelen rjuk ki zenetnket. Figyeljnk oda, hogy az if felttelben nem
alkalmazhatjuk a while felttel msodik rszt, mert ha nincs ilyen tmbelem, akkor
a vizsglatkor mr i = 11 lenne, gy nem ltez tmbelemre hivatkoznnk.

Kivlogats

Feladat: Adott egy 10 elem, egsz szmokat tartalmaz tmb. Tltsk fel vletlen
szmokkal, majd rassuk ki a pros szmokat kzlk.

Megolds:

int[] tm = new int[10];


int i;
Random rnd = new Random();
for (i=0 ; i<10; i++)
{
tm[i] = rnd.Next(100,200);
Console.Write("{0} ",tm[i]);
}
Console.WriteLine();
for (i = 0; i < 10; i++)
if (tm[i] % 2 == 0) Console.WriteLine("{0} ",tm[i]);
Console.ReadLine();

Magyarzat:
A tmb feltltse utn a msodik cikluson bell rjuk a megfelel felttelt az if
szerkezetbe. Ennek teljeslse esetn kirjuk a tmbelemet. A felttel, a prossg

84/312
vizsglata. Ezt az maradkkpzs % opertorval vizsgljuk. Ha a tmbelem 2-vel
osztva 0 maradkot ad, akkor a szm pros. Ebben az esetben kerl kiratsra.

85/312
Dinamikus mret vektorok

Dinamikus elemszm tmbk kezelst valstja meg az ArrayList osztly.


Deklarls:
ArrayList arl = new ArrayList();

Az ArrayList fbb jellemzi:

Capacity: az elemek szmt olvashatjuk illetve rhatjuk el.


Count: az elemek szmt olvashatjuk ki. Csak olvashat tulajdonsg.
Item: A megadott index elemet lehet rni vagy olvasni.

Az ArrayList fbb metdusai:

Add: Hozzad egy objektumot a lista vghez.


BinarySearch: Rendezett listban a binris keress algoritmusval megkeresi az
elemet
Clear: Minden elemet trl a listbl.
CopyTo: tmsolja az ArrayList-t egy egydimenzis tmbbe.
IndexOf: A megadott elem els elfordulsnak indext adja vissza. A lista els
elemnek az indexe a 0.
Insert: Beszr egy elemet az ArrayListbe a megadott indexhez.
Sort: Rendezi az elemeket az ArrayListben.

86/312
Feladatok dinamikus tmbre

Krjnk be szmokat a nulla vgjelig


ArrayList dtm = new ArrayList();
int i = 0, elem;
do
{
elem = Int32.Parse(Console.ReadLine());
if (elem != 0) dtm.Add(elem);
}
while (elem != 0);

Deklarlunk egy dtm nev ArrayList objektumot, s pldnyostsuk is. Az


adatbekrskor a ReadLine() fggvny ltal visszaadott karakterlncot konvertljuk
Int32 tpuss, s a konverzi eredmnyt troljuk az elem nev vltozba.
Amennyiben ez nem nulla rtk, hozzadjuk az ArrayListnkhoz az add metdus
meghvsval. Az adatbekrst mindaddig folytatjuk, mg nullt nem runk be.

A 0 bersa utn az ellenrzs miatt vissza rattuk az ArrayList tartalmt az albbi


fggvny meghvsval:

static void Kiir(ArrayList al)


{
foreach (int a in al)
{
Console.Write("{0} ",a);
}

87/312
Console.WriteLine();
}

Feladat:

Adott a skon koordintival nhny pont. Hatrozzuk meg azt a minimlis sugar
krt, mely magba foglalja az sszes pontot. adjuk meg a kzppontjt s a sugart!

A feladat els felt nzzk most. Hogyan kezeljk a pontokat, s adatait.

class TPont
{
public double x, y;
}

Ezzel ltrehoztunk egy TPont osztlyt, mely a skbeli pont kt koordintjt, mint
adatmezt tartalmazza. Ezen az osztlyon fog alapulni a feladat megoldsa.
Hozzunk ltre egy krt ler osztlyt is. Ehhez a kr kzppontjnak koordintira s
a sugarnak hosszra lesz szksgnk. Hasznljuk fel a mr meglv TPont
osztlyt.

class TKor
{
public TPont kozeppont = new TPont();
public double sugar;
}

A feladatunk megkeresni azt a kt pontot, melyek tvolsga a legnagyobb, s az


ltaluk meghatrozott szakasz, mint tmr fl rajzolt krt adatait meghatrozni.
Ehhez hasznljuk a kvetkez osztlyt, ahol egy vgpontjainak koordintival adott
szakasz fl rajzolt kr adatait tudjuk meghatrozni.

88/312
class TSzakasz_kore : TKor
{
public TPont Kezd = new TPont();
public TPont Veg = new TPont();

public void szakasz_fole_kor()


{
kozeppont.x = (Veg.x + Kezd.x)/2;
kozeppont.y = (Veg.y + Kezd.y)/2;
System.Console.WriteLine("{0} {1}",kozeppont.x,kozeppont.y);
sugar = System.Math.Sqrt((Veg.x-Kezd.x)*(Veg.x-Kezd.x)+
(Veg.y-Kezd.y)*(Veg.y-Kezd.y))/2;
}
}

A kozeppont vltoz a TKor osztlyan lett deklarlva, az rkls miatt ez az osztly


is ltja, s a public lthatsga miatt hasznlhatja is.

Ezek utn minden eszkznk megvan ahhoz, hogy megoldjuk a feladatot. Tekintsk
az albbi deklarcit, mely lehetv teszi tetszleges szm pont felvtelt a skon. Itt
hasznljuk ki a dinamikus ArrayList adta lehetsgeket.

public long pontok_szama = 0;


public System.Collections.ArrayList pontok =
new System.Collections.ArrayList();

A pontok nev ArrayListbe fogjuk trolni a pontok adatait. Ezeket feltlthetjk


billentyzetrl:

89/312
public void pontok_beo()
{
int i = 1;
while (i<=pontok_szama)
{
TPont pont = new TPont();
System.Console.Write("Krem az {0}. pont X koordintjt ... ", i);
pont.x = System.Convert.ToDouble(System.Console.ReadLine());
System.Console.Write("Krem az {0}. pont Y koordintjt ... ", i);
pont.y = System.Convert.ToDouble(System.Console.ReadLine());
pontok.Add(pont);
i++;
}
System.Console.WriteLine("Koordintk beolvasva...");
}

Keressk meg a maximlis tvolsgra lv pontokat a ponthalmazbl. Ehhez lehet


ezt az egyszer metdust hasznlni:
private void max_tav_pontok()
{
double maxtav = 0, tav;
foreach (TPont pont1 in pontok)
{
foreach (TPont pont2 in pontok)
{
tav = System.Math.Sqrt((pont2.x-pont1.x)*(pont2.x-pont1.x)+
(pont2.y-pont1.y)*(pont2.y-pont1.y));
if (maxtav < tav)
{
maxtav = tav;
Kezd.x = pont1.x;
Kezd.y = pont1.y;
Veg.x = pont2.x;
Veg.y = pont2.y;
}
}
}
}

90/312
Ha a fenti metdusokat egy olyan osztlyban hozzuk ltre, melyet a TSzakasz_kore
osztlybl szrmaztattunk, akkor a megoldst mindssze kt metdus meghvsa
szolgltatja:

public void kor_megadasa()


{
max_tav_pontok();
szakasz_fole_kor();
}

Ekkor a Main fggvny tartalma a kvetkez lehet:

System.Console.WriteLine("\n\n Sok pont esete: ");


TSik_pontokat_foglalo_kor sk = new TSik_pontokat_foglalo_kor();
System.Console.WriteLine(" --- Krem a pontok szmt: --- ");
int p_count = System.Convert.ToInt32(System.Console.ReadLine());
sk.pontok_szama = p_count;
sk.pontok_beo();
sk.kor_megadasa();

System.Console.WriteLine("A kr kzppontja O( {0} , {1} )s


sugara: R = {2}",
sk.kozeppont.x, sk.kozeppont.y,sk.sugar);

Ezzel a feladatot megoldottuk.

91/312
Tbbdimenzis tmbk

Sok feladat megoldshoz az egydimenzis tmb struktra mr nem elegend, vagy


tl bonyolultt tenn a kezelst. Ha pldul gyjteni szeretnnk havonknt s azon
bell naponknt a kiadsainkat. A kiadsok szmok, de a napokhoz rendelt indexek
nehzkesek lennnek, mert februr 1-hez a 32-t, jnius 1-hez mr a 152-es index
tartozna. Egyszerbb, ha a kiadsainkat kt indexel azonostjuk. Az egyik jelentheti a
hnapot, a msik a napot. Ha mr az vet is szeretnnk trolni, akkor egy jabb
index bevezetsre van szksgnk.

Nzzk meg egy egyszer pldn keresztl a deklarcit. Tltsnk fel egy 3x3
mtrixot vletlen szmokkal s rassuk ki ket mtrix fromban a kpernyre.

static void Main(string[] args)


{
int[,] tm = new int[3,3];
int i, j ;
Random rnd = new Random();
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
tm[i,j] = rnd.Next(10,20);
Console.Write("{0} ",tm[i,j]);
}
Console.WriteLine();
}
Console.ReadLine();
}

Lthat, hogy a deklarcikor a kt indexet gy jelezzk, hogy egy vesszt tesznk a


zrjelbe, majd a pldnyostskor megadjuk az egyes indexekhez tartoz
elemszmot.
A ktdimenzis tmbt feltlteni elemekkel, illetve kiratni azokat elg kt ciklus, ahol
az egyik ciklusvltoz az egyik indextartomnyt futja vgig, mg a msik ciklusvltoz

92/312
a msik tartomnyt. Ha nem kt, hanem tbbdimenzis tmbt hasznlunk, akkor a
ciklusok szmma ennek megfelelen fog nni.
A pldban lthat, hogy a mtrix forma megtarts rdekben egyszeren a sorok
elemeit egyms mell Write utasts alkalmazsval rattuk ki. A bels ciklus minden
sor kirsrt felels, gy a sorok vgn a soremelsrl gondoskodtunk a WriteLine
utastssal, melynek nem volt paramtere.

A ktdimenzis tmbt feltlthetjk kezdrtkkel, hasonlan az egydimenzis


esethez:

int[,] tm2 = new int[2,2] {{1,2},{3,4}};

Tekintsk a kvetkez feladatot:


Tltsnk fel egy 3x3 mtrixot a billentyzetrl egsz szmokkal. rassuk ki a
szoksos formtumban, majd generljuk a transzponltjt, s ezt is rassuk ki.

A szksges tmb s ciklusvltozk deklarlsa:

int[,] tm = new int[4,4];


int i, j ;

Tltsk fel a mtrixot billentyzetrl egsz szmokkal:


for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
{
Console.Write("Krem a {0}. sor {1}. oszlop elemt: ",i,j);
tm[i,j] = int.Parse(Console.ReadLine());
}

rassuk ki a tmb elemeit mtrix formban:


Console.WriteLine("Az eredeti mtrix: ");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
Console.Write("{0} ",tm[i,j]);
Console.WriteLine();
}

93/312
Ez futs kzben gy nz ki:

Deklarljunk egy tr tmbt a transzponlt mtrix elemeinek. Majd generljuk le az


eredeti tm tmbbl. A transzponlt mtrixot az eredeti mtrix sorainak s
oszlopainak felcserlsvel kapjuk.

int[,] tr = new int[3,3];


for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
tr[i,j] = tm[j,i];

jra ki kell ratni egy tmbt, most a transzponlt mtrixot.

for (i = 0; i < 3; i++)


{
for (j = 0; j < 3; j++)
Console.Write("{0} ",tr[i,j]);
Console.WriteLine();
}

A program futtatst bemutat kperny:

94/312
Vegyk szre, hogy a kt kiratsban csak a tmb neve a klnbz. Feleslegesen
rjuk le ktszer ugyanazt a kdot. Erre jobb megoldst ad az eljrsokrl s
fggvnyekrl szl fejezet.

95/312
Tovbbi megoldsra ajnlott feladatok

1.
Hatrozzuk meg N db pozitv egsz szm harmonikus kzept!

2.
Hatrozzuk meg kt N dimenzis vektor skalris szorzatt, ha adottak a kt vektor
koordinti.

3.
5 km-enknt megmrtk a felszn tengerszint feletti magassgt. (sszesen N mrst
vgeztnk) A mrseket szrazfld felett kezdtk s fejeztk be. Ott van tenger, ahol
a mrs eredmnye 0, msutt >0. Hatrozzuk meg, van-e ezen a tengerszakaszon
sziget!

4.
Az elz feladatbl mondjuk meg
a. Hny szigeten jrtunk?
b. Adjuk meg azt a szigetet, ahol a legmagasabb cscs van!
c. Hatrozzuk meg a tengerszakaszok hosszt!
d. llaptsuk meg hogy van-e kt egyforma szlessg sziget!

5.
Egy nyilvntartsban a szemlyekrl ngy adatot tartanak nyilvn: magassg,
szemszn, hajszn, letkor. Dntsk el, hogy van-e kt olyan szemly, akiket ez a
nyilvntarts nem klnbztet meg.

6.
Hatrozzuk meg N (N>1) termszetes szmnl nem nagyobb, legnagyobb
ngyzetszmot!

7.
lltsunk el 50 vletlen szmot 1 s 500 kztt.

96/312
a. Vlogassuk ki a 100-nl nagyobb pratlan szmokat!
b. Vlogassuk ki a hrommal nem oszthat pros szmokat!
c. Vlogassuk ki a 200-nl nem nagyobb s 300-nl nem kisebb szmok kzl
azokat, melyek a szmjegyeinek sszege ttel oszthat!
d. Vlogassuk ki a 100 s 300 kz es, 3-as szmjegyet tartalmaz szmokat!
e. Keressk meg a legnagyobb 3-mal nem oszthat, de 7-el oszthat szmot!
f. Keressk azt a legkisebb szmot, mely tartalmaz 3-as szmjegyet!

8.
Ksztsnk egy tottipp-sort, vegyk fogyelembe, hogy az 1-es 50%, x 30%, 2-es
20% valsznsggel kvetkezik be.

9.
Az X N elem vektor elemein vgezzk el a kvetkez transzformcit: mindegyik
elemet helyettestsk sajt magnak s szomszdainak slyozott tlagval. A sly
legyen az elem indexe a vektorban.

10.
Egy mennyisg pontos mrst 9 azonos clmszeren egyenknt 100 alkalommal
vgeztk el. Mindegyik mszer az i. adatt azonos pillanatban mrte. Az
eredmnyeket egy sorozatban helyeztk el gy, hogy az els 100 szm az els
mszeren mrt adatot jelenti, ezt a msodik mszeren mrt adatok kvetik, s gy
tovbb. Hatrozzuk meg az sszes mrs tlagt, s szmtsuk ki minden egyes
mrsnl a 9 mszeren mrt rtkek tlagt!

11.
Hatrozzuk meg A(N,N) mtrix fels hromszge elemeinek sszegt!

12.
Adott A(N,N) mtrix. A mtrix fdiagonlisba rjunk olyan rtkeket, hogy a mtrix
minden sorban az elemek sszege 0 legyen!

97/312
13.
Egy osztly tesztlapokat tlttt ki. Minden krdsre 4 lehetsges vlasz volt, s csak
1 j. A vlaszokat egy mtrixban troljuk. Ksztsnk programot, amely
sszehasonltja a vlaszokat a helyessel, majd megmondja, melyik tanul hny j
vlaszt adott. A helyes vlaszokat troljuk egy vektorban.

14.
Egy sznhz pnztrnak nyilvntartsa tartalmazza, hogy egy adott eladsra mely
helyekre keltek mr el jegyek. B(i,j) tmbelem az i. sor j. helyt jelenti a baloldalon,
J(i,,j) ugyanezt a jobboldalon. A tmbelem rtke 1, ha az adott helyre szl jegy mr
elkelt, 0 ha mg szabad. rjunk programot mely keres kt szomszdos szabad helyet
az adott eladsra.

15.
Az A(N,2) mtrixban egy grfot brzoltunk: a mtrix egy sora a grf leit rja le gy,
hogy megadja azoknak a cscsoknak a sorszmt, amelyekre az l illeszkedik.
Hatrozzuk meg a cscsok fokszmt!

16.
rj programot, mely kirja kt szmokat tartalmaz tmb kzs elemeit!

98/312
Programozs tanknyv

VIII. Fejezet

Logikai ciklusok

Kirly Roland

99/312
A ciklusok

A programozs sorn sokszor kerlnk szembe olyan problmval, amikor valamely


utastst, vagy utastsok sorozatt tbbszr kell vgrehajtanunk, s sokszor mg az sem
ismert, hogy az utastsokat hnyszor kell ismtelni.

Kevs szm ismtlsnl megoldhatjuk a problmt olyan mdon is (s ez a rossz


megolds), hogy az utastsokat tbbszr egyms utn lerjuk, de gondoljunk arra az esetre,
mikor egy lpst ezerszer kell vgrehajtani. Ilyen s ehhez hasonl helyzetekben clszer az
iterci hasznlata.

Az ismtlsek megvalstsnak az eszkze a ciklus-utasts, melynek tbb formja ltezik.


Ebben a fejezetben a logikai ciklusokat nzzk t.

A logikai ciklusoknak kt alapvet formja ltezik a C# nyelvben.

Ell tesztel while ciklus


Htul tesztel do while ciklus

A while ciklus

A while ciklus ltalnos formja a kvetkezkppen rhat le:

while (felttel)
{
utasts1;
utasts2;

utastsn;
}

A fenti ciklus a while kulcsszval kezddik, majd a zrjelek kzti rszben a ciklusban
marads felttelt kell megadni. A ciklus magjban lv utastsokat, melyek tetszleges
szmban fordulhatnak el, pontosvesszvel vlasztjuk el egymstl. Innen tudja a fordt,
hogy hol vgzdik az aktulis, s hol kezddik a kvetkez utasts.
A ciklus magjt kapcsos zrjelek { } kz kell tenni, jelezve ezzel a ciklus utastsainak a
kezdett s vgt (egy utasts esetn a zrjelek elhagyhatak, de javasolt a hasznlatuk a

100/312
programok jobb ttekinthetsge rdekben). A kapcsos zrjelek kzti utasts blokkot
ismtli a rendszer mindaddig, amg a felttel igaz, vagyis TRUE rtk.

Folyamatbrval szemlltetve a while ciklus a kvetkez formban rhat le:

A folyamatbra a while ciklus logikai modellje. Az els feldolgozst szimbolizl tglalap


csak akkor szksges, ha a ciklusban hasznlunk ciklus vltozt, esetleg azt a ciklus
bennmaradsi feltteleknt alkalmazzuk. A ciklus felttel rsze tartalmazza a ciklusban
marads felttelt. A msodik feldolgozs blokk tartalmazza a ciklus utastsait, valamint a
ciklus vltozjnak lptetst, termszetesen csak abban az esetben, ha van ciklusvltoz.
Ha megrtjk a folyamatbra s az ltalnos forma mkdsi elvt, akkor azok alapjn
brmilyen while ciklust el tudunk kszteni.

Nzznk meg egy konkrt pldt a while ciklus hasznlatra! A kvetkez ciklus kirja a 0-10
kztti egsz szmokat a konzol kpernyre.

int i=0;
while (i<=10)
{
Console.WriteLine({0},i);
i++;
}

101/312
(Termszetesen a fenti ismtlst megvalsthattuk volna egyszeren for ciklussal is.)
A while-t hasznl megoldsnl gyeljnk arra, hogy a ciklus vltozjt lptetni kell, vagyis
az rtkt minden lefutskor nveljk meg eggyel, mert a for ciklussal ellenttben itt a
rendszer errl nem gondoskodik. (Emlkezznk vissza a for ciklusra! Ott a ciklus vltoz
nvelse automatikus s nem is clszer azt kln utastssal nvelni).
A vltoz lptetsre a kvetkez formult hasznltuk:

i++;

A C tpus nyelvekben, gy a C# -ban is, ez a rvidtett forma megengedett, ekvivalens az


i=i+1; s az i+=1; utastssal. (A IV. fejezetben az aritmetikai mveletekrl s azok
rvidtsrl bvebben olvashattunk.)
gyeljnk arra is, hogy a ciklus vltozjnak mindig adjunk kezd rtket, ellenkez esetben
az ismtlsek szma nem lesz megfelel.
Termszetesen a while ciklust leginkbb a logikai rtkek vizsglatakor hasznljuk, s nem
szmll ciklusknt (arra ott van a for ).
Az elz fejezetekben mr lthattunk nhny pldt a logikai ciklusokra, de ott nem
rszleteztk a mkdsket. A kvetkez plda bemutatja, hogyan lehet tzes
szmrendszerbeli szmokat tvltani kettes szmrendszerbe.
using System;

namespace Atvaltas
{
class atvalt
{
[STAThread]
static void Main(string[] args)
{
int[] t=new int[8];
int k=0;
int szam=8;
int j;
while (szam!=0)
{
t[k]=szam % 2;
szam=szam / 2;
k++;
}

j=k-1;

while (j>=0)
{
Console.Write("{0}",t[j]);
j--;
}
Console.ReadLine();
}
}
}

102/312
Az els while ciklus felttele a (szam!=0), a ciklus szempontjbl azt jelenti, hogy az
ismtlseket addig kell vgezni, mg a szam vltoz rtke nulltl nagyobb. Nulla rtk
esetn a ciklus befejezi futst.

Megfigyelhetjk, hogy ebben a ciklusban nem tudjuk elre megmondani a lefutsok szmt,
mivel az mindig a futs kzben vgrehajtott mveletek eredmnytl fgg (annyi lefuts van,
ahny osztssal elrjk a nulla rtket). A msodik ciklusban, amelyik a kettes
szmrendszerbeli szmjegyeket rja a kpernyre, a ciklus vltoz kezdrtke a k-1. Az
rtkt nem nveljk, hanem cskkentjk, gy a tmbben lv szmjegyeket visszafel rjuk
ki a kpernyre, de csak azokat, melyek az oszts sorn jttek ltre. A tmb tbbi rtkt
nem vizsgljuk, mivel azok a feladat szempontjbl nem rtkes szmjegyek.

0 0 0 1 0 0 0 0

Az tvlts utn a k vltoz rtke 5, mert az tvltand szmjegy a 8, gy az els


ciklusunkban ngy oszts trtnt, s az utols lefutskor mg nveltk a k rtkt eggyel.
Ebbl az kvetkezik, hogy az utols rtkes szmjegy a negyedik indexen, vagyis a k-1
helyen van. (Prbljuk meg trni a fenti programot gy, hogy ne csak a 8-as szmra
mkdjn, hanem a felhasznltl beolvasott tetszleges rtkekre!)

Vegyk sorra, hogy mikor clszer logikai, vagy ms nven feltteles ciklusokat alkalmazni.

Amennyiben nem tudjuk meghatrozni a ciklus ismtlsinek a szmt (futs kzben


dl el).
Ha a lells valamilyen logikai rtket szolgltat kifejezs eredmnytl fgg.
Tbb lellsi felttel egyttes hasznlatakor.
Az elz hrom pont egyttes fennllsa esetn.

Tbb felttel hasznlatakor az egyes kifejezseket, logikai rtkeket clszer S, illetve


VAGY kapcsolatba hozni egymssal. A while ciklus ekkor addig fut, mg a felttel minden
rsze igaz. Ha brmelyik rsz-felttel, vagy a felttelek mindegyike hamiss vlik, akkor az
egsz kifejezs rtke hamis lesz, s az ismtls befejezdik.
Mindig gondoljuk vgig, hogy a felttelek sszekapcsolsra && vagy || opertort
hasznlunk. Vannak olyan problmk, ahol mindkettt hasznlnunk kell egy kifejezsen
bell. gyeljnk a megfelel zrjelezsre.

103/312
Vizsgljuk meg az albbi kt ciklust. Az els j eredmnyt fog szolgltatni, a futsa akkor ll
meg, ha az i rtke elri a tmb elemszmt, vagy ha megtalljuk a nulla elemet. A msodik
ciklus nem biztos, hogy megll.

i=0;
while ( (i<10) && (t[i] != 0) )
{
Console.WriteLine( {0} ,t[i]);
i += 1;
}

i=0;
while ( (i<10) || (t[i] != 0) )
{
Console.WriteLine( {0} ,t[i]);
i += 1;
}

Az S kapcsolat, vagyis az && opertor hasznlatakor gyeljnk a megfelel zrjelezsre


s a precedencia szablyra. A zrjelek elhagysa, vagy rossz helyen trtn alkalmazsa
nehezen szrevehet hibkat eredmnyez.

Az albbi kt formula kzl az els helyes eredmnyt produkl, a msodik viszont hibsat,
mivel abban szndkosan elrontottuk a zrjelezst.

while ( (i<10) && (a!=2))

while ( i<(10 && a)!=2)

A rosszul felrt zrjelek miatt a fordt elszr a (10 && a) rszt rtkeli ki, s ez hibhoz
vezet.

A break
A C# nyelvben a while ciklusbl ki lehet ugrani a break utastssal, amit ltalban egy felttel
teljeslshez ktnk. Az albbi ciklus felttel rszbe a true rtket rtuk, ami azt jelenti,
hogy a felttel mindig igaz, vagyis a ciklus soha nem ll meg. A feltteles elgazsban a d=5
felttel teljeslse esetn a break utasts lltja meg a while ciklust.

d = 0;
While (true)
{
if (d=5)
{
break;
}
d += 1;
}

104/312
A continue

A continue utastssal visszaadjuk a vezrlst a while ciklus felttelre. Ekkor a continue


utni rsz teljesen kimarad az aktulis lefutskor. Ritkn hasznljuk, de mindenkppen meg
kell ismerkednnk vele.

while(i<tomb.Count)
{
int a = Int32.Parse( Console.ReadLine() );
if (a<=0) continue;
i++;
tomb[i]=a;
}

A programrszlet egy tmb elemeinek billentyzetrl val feltltst valstja meg gy, hogy
negatv szmokat nem fogad el. Amennyiben negatv szm rkezik az inputrl, a continue
visszadobja a vezrlst a ciklus elejre.

A do while ciklus

A ciklus utasts kvetkez tpusa a htul tesztel vltozat. Ennek rdekessge az, hogy a
ciklus magja egyszer mindenkppen lefut, mivel a felttel vizsglata a ciklus vgn van.

do
{
Utastsok;
} while (felttel)

A do while ciklust is rdemes felrni folyamatbrval, hogy jobban megrtsk a mkdst.

105/312
A folyamatbrn jl ltszik, hogy a ciklusban marads felttele a ciklus utastsai utn
szerepel, gy egyszer mindenkppen vgrehajtdnak a ciklus magjban definilt utastsok.
Amg a felttel igaz, a ciklus fut, ha hamiss vlik, megll.

A kvetkez plda egy lehetsges megvalstst mutatja meg a htul tesztel do while
ciklusnak.

char c;
Console.WriteLine(Kilps : v);
do
{
c=Console.Read();
Console.Write(a beolvasott vltoz : {0}\n,c);
} while (c!=v);

Az ismtls akkor ll meg, ha a c karakter tpus vltozba a v rtket adja meg a


felhasznl, de egyszer mindenkppen lefut.
Ahogy a fenti plda is mutatja a do while ciklust jl hasznlhat ellenrztt, vagy vgjelig
trtn beolvassra.

A foreach

Van egy specilis ismtls, a foreach, mely kpes a gyjtemnyek, vagy a tmbk
vgigjrsra. Ez azt jelenti, hogy nem szksges ciklusutastst szerveznnk, s nincs
szksg ciklusvltozra sem, mellyel a tmbt, vagy gyjtemnyt indexelnnk. Igaz, hogy ez

106/312
nem logikai ciklus, s az sszetett adat szerkezetekkel mg nem foglalkoztunk, de a
teljessg kedvrt vizsgljuk meg ezt a tpust is! A foreach ltalnos formja a kvetkez:

foreach (adattpus vltoz in tmbnv)


{
Utastsok;
}

Az albbi program rszlet bemutatja, hogyan kell hasznlni a foreach utastst:

Char[] t=new char[] {f,o,r,e,a,c,h};

Foreach (char c in t)
{
Console.Write({0},c);
}

A pldban a foreach sorra veszi a t tmb elemeit. Az aktulis tmb elem a c vltozbl
olvashat ki. Az ismtls az utols elem kirsa utn ll le, vagyis mikor vgigjrta a tmbt.
Termszetesen a fenti program rszletet for, vagy while ciklussal is megvalsthattuk volna,
de a foreach-t pontosan arra talltk ki, hogy ne kelljen figyelni a tmb elemszmt s a
tmb elemeit se kelljen a programoznak indexelnie. Radsul a foreach hasznlatakor nem
fordulhat el, hogy tl, vagy alul indexeljk a gyjtemnyt.
A kvetkez pldban a while ciklussal felrt vltozatot lthatjuk. Ez a program-rszlet tbb
utastsbl ll, szksg van egy ciklusvltozra, melynek az rtkt nvelnnk kell, s a
kezdrtkrl is gondoskodnunk kell.

char[] t=new char[] {f,o,r,e,a,c,h};


i = 0;
while (i< t.length())
{
Console.Write({0},t[i]);
i += 1;
}

A felttel vezrelt ciklusokat a programozs szmos terletn hasznljuk. Fontosak a


szveges informcik kezelsnl, a fjlkezelsnl, s minden olyan problma megoldsnl,
amikor az itercit for ciklussal nem lehet, vagy nem clszer megvalstani.

107/312
Programozsi feladatok

1. rjon programot, mely kirja a kpernyre az els tz egsz szmot visszafel!


2. Alaktsa t az elz programot gy, hogy az csak a pros szmokat rja a
kpernyre!
3. rassa ki a kpernyre az els n egsz szm sszegt!
4. rassa ki a kpernyre az els n egsz ngyzetszmot!
5. rjon programot, mely beolvassa a billentyzetrl egy intervallum kezd s
vgrtkt, majd kirja a kpernyre az intervallumba es egsz szmok kzl
azokat, melyek 3-mal s 5-tel is oszthatak!
6. llaptsa meg a felhasznltl beolvasott szmrl, hogy az prmszm-e!
(Prmszmok azok a szmok, melyek csak nmagukkal s eggyel oszthatak.)
7. Keresse meg az els n darab prmszmot!
8. Ksztsen programot, mely beolvassa a billentyzetrl az egsz szmokat egy
meghatrozott vgjelig. Az ppen beolvasott szmnak rja ki a ngyzett.
9. A felhasznltl beolvasott szmot a program vltsa t kettes szmrendszerbe!
10. Programja olvasson be a billentyzetrl egsz szmokat egy meghatrozott
vgjelig (legyen a vgjel -999999), majd a vgjel beolvassa utn rja ki a
legnagyobbat s a legkisebbet a kapott rtkek kzl.
11. rjon programot, mely kirja az els n db pros szm sszegt a kpernyre!
12. Ksztsen programot, mely beolvas n db szmot a billentyzetrl, majd
meghatrozza a szmok tlagt.

108/312
Programozs tanknyv

IX. Fejezet

Szelekci emelt szint!

Radvnyi Tibor

109/312
Szelekci haladknak

A szelekcinak tbb ga is lehet. Ilyenkor a felttelek kzl legfeljebb egy teljeslhet,


vagyis ha az egyik felttel teljesl, akkor a tbbit mr nem kell vizsglni sem. A
tbbg szelekci folyamatbrja:

Egymsba gyazott if utastsok sorozatval tudjuk megvalstani a fenti


szerkezetet. Ha az els felttel nem teljesl, akkor a msodik felttel kirtkelse
kvetkezik. s gy tovbb. A vgrehajts legfeljebb egy igaz gon fog futni. Az bra
szerint az Utasts-4 akkor kerl vgrehajtsra, ha egyik felttel sem teljeslt.
Az utols else g elhagyhat. Hogyan valstjuk ezt meg C#-ban? Ehhez nzznk
egy egyszer, klasszikus pldt.

Feladat:

Olvassunk be egy nemnegatv egsz szmot, valakinek az letkort, s kortl


fggen rjuk ki a megfelel szveget:
0 - 13 vig : gyerek
14 17 vig : fiatalkor
18 23 vig : ifj
24 59 vig : felntt
60 - : ids

110/312
Megolds:

static void Main(string[] args)


{
int kor;
kor = Int32.Parse(Console.ReadLine());
if (kor < 14) Console.WriteLine("Gyerek");
else
if (kor < 18) Console.WriteLine("Fiatalkor");
else
if (kor < 24) Console.WriteLine("Ifj");
else
if (kor < 60) Console.WriteLine("Felntt");
else Console.WriteLine("Ids");
Console.ReadLine();
}

A tbbg szelekci msik megoldsa a switch utasts.

switch (kifejezs)
{
case konstans1 kifejezs:
utasts1
ugrs
case konstans2 kifejezs:
utasts2
ugrs
case konstansn kifejezs:
utastsn
ugrs
[default:
utasts
ugrs]
}

Kifejezs: egsz tpus, vagy string kifejezs.


Ugrs: Kilp avezrls a case szerkezetbl. Ha elhagyjuk, akkor a belpsi ponttl
szmtva a tovbbi case-eket is feldolgozza.
Default: Ha egyetlen case felttel sem teljesl, akkor a default g kerl vgrehajtsra.

111/312
Egy egyszer felhasznls:

static void Main(string[] args)


{
int k;
Console.Write("Krem vlasszon (1/2/3)");
k = Int32.Parse(Console.ReadLine());
switch (k)
{
case 1:
Console.WriteLine("1-et vlasztotta");
break;
case 2:
Console.WriteLine("2-t vlasztotta");
break;
case 3:
Console.WriteLine("3-at vlasztotta");
break;
default:
Console.WriteLine("nem vlasztott megfelel szmot.");
break;
}
Console.ReadLine();
}

112/312
Ugyanez feladat megoldhat konvertls nlkl, stringek felhasznlsval is:

static void Main(string[] args)


{
string k;
Console.Write("Krem vlasszon (1/2/3)");
k = Console.ReadLine();
switch (k)
{
case "1":
Console.WriteLine("1-et vlasztotta");
break;
case "2":
Console.WriteLine("2-t vlasztotta");
break;
case "3":
Console.WriteLine("3-at vlasztotta");
break;
default:
Console.WriteLine("nem vlasztott megfelel szmot.");
break;
}
Console.ReadLine();
}

113/312
Feladat:

Olvassunk be egy hnap s egy nap sorszmt! rjuk ki ha a beolvasott szmok nem
j intervallumba esnek. A februr legyen 28 napos.

Megolds:

static void Main(string[] args)


{
int ho, nap;
Console.Write("Krem a hnapot:");
ho = int.Parse(Console.ReadLine());
Console.Write("Krem a napot:");
nap = int.Parse(Console.ReadLine());
if ((ho == 1 || ho == 3 || ho == 5 || ho == 7 || ho == 8 || ho == 10
|| ho == 12)
&& (nap > 31 || nap < 1))
Console.WriteLine("A nap legfeljebb 31 lehet");
else
if ((ho == 4 || ho == 6 || ho == 9 || ho == 11) && (nap > 30 || nap <
1))
Console.WriteLine("A nap legfeljebb 30 lehet");
else
if ((ho == 2) && (nap > 28 || nap < 1))
Console.WriteLine("A nap legfeljebb 28 lehet");
else
if (ho < 1 || ho > 12) Console.WriteLine("A hnap csak 1 s 12 kztt
lehet.");
else
Console.WriteLine("Rendben");
Console.ReadLine();
}

Nzzk a lehetsges futsi eredmnyeket. Els, amikor minden rendben, msodik,


amikor a hnap megfelel, de a nap nem helyes, s a harmadik lehetsg amikor a
hnap szma nem j.

114/312
Els eset, amikor minden rendben

Msodik eset, amikor a nap 45, ez nem lehet!

Harmadik eset, amikor a hnap nem lehet 45.

115/312
Tovbbi megoldsra ajnlott feladatok

1.
Olvassa be Zsfi, Kati, Juli szletsi vt. rja ki a neveket udvariassgi sorrendben.
Elszr az idsebbeket.

2.
Olvasson be egy egsz ra rtket. Ksznjn a program a napszaknak
megfelelen. 4 9 J reggelt. 10 17 J napot. 18 21 J estt. 22 3 J jszakt.

3.
Adjon meghrom diszjunkt intervallumot. Eztn olvasson be egy szmot, s rja ki
hogy melyik intervallumba esik.

4.
Olvassunk be egy szmsorozatot, majd szmoljuk meg hogy ezekbl mennyi a
negatv, nulla, pozitv. A negatvokat s a pozitvokat rakjuk t egy msik sorozatba.

5.
Hatrozzuk meg az A(N) vektor elemeinek sszegt gy hogy a pratlan rtk
elemek a (-1) szereskkel szerepeljenek az sszegben.

6.
Egy dobkockval 100-szor dobunk. Adjuk meg hogy ezek kzl hny darab volt
pros, illetve a prosak kzl mennyit kvetett kzvetlenl pratlan szm.

7.
Adott egy A(N) vektor. Szmoljuk meg, hny pozitv rtk van a vektor azon elemei
kztt, amelyek indexe prmszm.

8.
Adott N ember neve, szemlyi szma. Vlogassuk ki a halak csillagkpben szletett
frfiak neveit (februr 21 mrcius 20).

9.
Adott egy termszetes szmokat tartalmaz vektor. Elemei kzl vlogassuk ki
azokat, melyek relatv prmek a 15-hz.

116/312
Programozs tanknyv

X. Fejezet

Stringek kezelse
Kirly Roland

117/312
A string tpus vltoz

A C#-ban, mint minden magas szint nyelvben ltezik a string tpus. Az OOP nyelvekben a
string-ekre osztlyknt tekinthetnk, mivel vannak metdusaik, tulajdonsgaik, s minden
olyan paramterk, mely a tbbi osztlynak, de dolgozni gy tudunk velk, mint az sszes
tbbi programozsi nyelv string tpusval. Hasonlan a tbbi vltozhoz, a string-eket is
deklarlni kell.

string s;
string w;

Adhatunk nekik rtket:

string a = "hello";
string b = "h";
b += "ello";
s="A2347";
s="1234567890";

Kiolvashatjuk, vagy ppen a kpernyre rhatjuk a bennk trolt adatokat:


string w=s;
Console.WriteLine(s);

Figyeljk meg, hogy a fent szerepl rtkadsban (s="1234567890") szmok sorozatt adtuk
rtkl az s string tpusnak. Az s vltozban szerepl rtkkel ebben az esetben nem
szmolhatunk, mert az nem numerikus rtkknt troldik, hanem n.: karakterlnc-
literlknt, gy nem rtelmezhetek r a numerikus tpusoknl hasznlt opertorok.
Igaz, hogy a + mvelet rtelmezhet a string-ekre is, de mkdse eltr a szmoknl
megszokottl. (A fejezet ksbbi tminl kitrnk a + opertor mkdsre.)
Fontos megemlteni, hogy a C alap nyelvekben a \ (backslash) karakter n.: escape
szekvencia. Az s="C:\hello" karakter sorozat hibs eredmnyt szolgltat, ha elrsi tknt
szeretnnk felhasznlni, mivel a \h -nak nincs jelentse, viszont a rendszer megprblja
rtelmezni. Ilyen esetekben vagy s="C:\\hello" vagy s=@"C:\hello" formult hasznljuk! Az
els megoldsban az els \ jel elnyomja a msodik \ jel hatst. A msodik megoldsnl a @
jel gondoskodik arrl, hogy az utna rt string a "C:\hello" formban megmaradjon az
rtkadsnl, vagy a kir utastsokban.

Ha egy string-nek nem adunk rtket, akkor indulskor null rtke van.

118/312
Az res string-et vagy s=""; formban, vagy s=String.Empty formban jelezhetjk.
A relcik hasznlata kisebb megktsekkel a string-eknl is megengedett. Az
sszehasonltsokat elvgezhetjk logikai kifejezsekben, elgazsok s logikai ciklusok
felttel rszben. A string-ek egyes elemeit tudjuk <, vagy > relciba hozni egymssal
s[1]<s[2], a teljes sring-re viszont csak a != s a == relcikat alkalmazhatjuk. Ha mgis
szeretnnk sszehasonltani kt string-et, a kvetkez megoldst hasznlhatjuk:

Str1.CompareTo(str2)

Ezzel a metdussal ssze tudjuk hasonltani kt string rtkt. A kvetkez plda ezt be is
mutatja:

int cmp;
string str1="abc";
string str2="cde";
cmp="szoveg".CompareTo("szoveg");

if ( cmp == 0) {Console.WriteLine("str1 = str2");}


if ( cmp > 0) {Console.WriteLine("str1 < str2");}
if ( cmp < 0) {Console.WriteLine("str1 > str2");}

A kt string egynsge esetn a visszatrsi rtk 0. Ha a kapott rtk kisseb, mint 0, akkor
az str1 ABC sorrendben elbb van az str2 -nl, ha nagyobb, mint 0, akkor str2 van elbb. A
pldban a msodik if felttele teljesl, mivel az abc karaktersor elbb szerepel a
sorrendben, mint a cde.
A strig-eket is hasznlhatjuk konstansknt. Ugyangy definiljuk ket, mint a tbbi tpus
llandit.

const string="string konstans";

Ahogy azt mr emltettk, C# nyelvben a string-ek is rendelkeznek metdusokkal, mint


brmely ms osztly. Ez nmikpp megknnyti a hasznlatukat, mert nem a
programoznak kell gondoskodnia pl.: a szkzk eltvoltsrl, a kis s nagybets
talaktsrl, a keress metdusainak definilsrl, s nem kell kls rutinokhoz
folyamodnia, mint a Pascal nyelv pos(), vagy copy() eljrsainl.

Az Objektum Orientlt megkzelts elnyei jl nyomon kvethetek a string tpus esetben.


Az egysgbezrs lehetv teszi, hogy rendelkezzen sajt metdusokkal. A kvetkez
pldaprogram bemutatja a string-ek hasznlatnak nhny lehetsgt.

119/312
using System;

namespace String_01
{

class Class1
{

[STAThread]
static void Main(string[] args)
{
string s;
s="alma";
Console.WriteLine("{0} - A string elejrl levgtuk az
a karaktereket.",s.TrimStart('a'));
Console.WriteLine("{0} - A string vgrl levgtuk az
a
karaktereket.",s.TrimEnd('a'));
Console.WriteLine("{0} - Nagybetss alaktottuk a
sztringet.",s.ToUpper());
Console.WriteLine("{0} - Kisbetss alaktottuk a
sztringet.",s.ToLower());
Console.ReadLine();
}
}
}

A program futsa a kvetkez:

Az els WriteLine- ban az s string TrimStart() metdust hasznltuk, mely eltvoltja a


szveg elejrl a paramter listjban megadott karakter sszes elfordulst. (Az aaalma
string- bl az lma stringet lltja el.)
A TrimStart(), TrimEnd() s a Trim() metdusuk paramterek nlkl a string elejrl s
vgrl levgjk a szkzket.
A kvetkez metdus a TrimEnd(). Ez a string vgrl vgja el a megadott karaktereket.

A ToUpper() s a ToLower() metdusokkal a kis- s nagybets talaktsrl


gondoskodhatunk.

Vegyk szre, hogy az s=alma utastsnl a string-et macskakrmk () kz tettk, mg


a TrimStart() s TrimEnd() metdusok paramtereit aposztrfok () zrjk kzre, mivel az
els esetben string-et, a msodikban karaktert definiltunk. Gyakori hiba, hogy a kettt

120/312
felcserljk. Ilyenkor a fordt hibt jelez, mivel a karakterek nem kezelhetek stringknt s
fordtva.

A string-bl kimsolhatunk rszeket a Substring() metdussal, melynek paramter listjban


meg kell adni a kezd indexet, ahonnan kezdjk a msolst, s a msoland karakterek
szmt. A kvetkez plda megmutatja a Substring() hasznlatt.

Console.WriteLine("Az eredeti sz= alma, a kiemelt rszlet ={0}


",s.Substring(1,2));

Ha a Substring() csak egy paramtert kap s a paramter rtke bell van a string index
tartomnyn, akkor az adott indextl a string vgig az sszes karaktert kimsoljuk. A
paramterezskor gyeljnk arra, hogy mindig csak akkora indexet adjunk meg, ahny
eleme van a string-nek. Arra is figyelni kell, hogy a string els eleme a 0. index elem, az
utols pedig a karakeszm-1.
A stringek-re a + mveletet is rtelmezhet, de ilyenkor szefzsrl beszlnk. Amennyiben
a fenti pldban szerepl s stringek kz a + opertort rjuk, akkor:

s=alma
s=s+ a fa alatt;

az s tartalma megvltozik, kiegszl a + jel utn rt sring- konstanssal. Az eredmny: alma a


fa alatt. Amennyiben a fenti rtkadsban szerepl vltozt s konstanst felcserljk, s=a
fa alatt+s, eredmnyl az a fa alattalma karaktersort kapjuk. Ez azt jelenti, hogy az adott
string-hez jobbrl s balrl is hozzfzhetnk ms string-eket.

A keress mvelete is szerepel a metdusok kztt. Az IndexOf() fggvny -1 rtket ad


vissza, ha a paramter listjban megadott karakter, vagy karaktersorozat nem szerepel a
string- ben, 0, vagypozitv rtket, ha szerepel. Mivel a stringek 0- tl vannak indexelve,
tallat esetn 0-tl a string hosszig kaphatunk visszatrsi rtket, ami a tallat helyt,
vagyis a kezd indext jelenti a keresett karakternek, vagy karakterlncnak.

A kvetkez plda bemutatja, hogyan hasznlhatjuk az IndexOf() metdust. A program


beolvas egy tetszleges mondatot s az abban keresend szt. Amennyiben a sz szerepel
a mondatban, a kpernyre rja a mondatot, a szt s azt, hogy a sz szerepel-e vagy sem a
mondatban. A C# nyelv kis-nagybet rzkeny (case-sensitive), ezrt a vizsglat eltt a
beolvasott adatokat nagybetss alaktjuk, hogy a tnyleges tartalom alapjn dntsnk.

121/312
namespace string_02
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
string s;
string w;
Console.WriteLine("Gpeljen be egy tetszleges mondatot
: ");
s=Console.ReadLine();
Console.WriteLine("Adja meg a keresend szt : ");
w=Console.ReadLine();
s=s.ToUpper();
w=w.ToUpper();
if (s.IndexOf(w)>-1)
{
Console.WriteLine("A(z) {0} sz szerepel a(z) {1}
mondatban",w,s);
}
else
{
Console.WriteLine("A(z) {0} sz nem a(z) {1}
mondatban");
}
Console.ReadLine();
}
}
}

A program futsnak eredmnye:

A programunk megfelelen mkdik, de az Output-ja nem tkletes, mivel az eredeti


mondatot nagybetsre alaktja, majd ezt a formjt rja vissza a kpernyre, a felhasznl
ltal begpelt kis- nagy betket vegyesen tartalmaz forma helyett.

A problmra tbb megolds is ltezik. Az egyik, hogy az eredeti vltozkat megrizzk,


azok tartalmt segdvltozkban troljuk, amiket talakthatunk nagybetss, mveleteket
vgezhetnk velk, majd a program vgn az eredeti vltozk tartalmt rjuk ki a kpernyre.
(Ezen megolds elksztse a kedves Olvas feladata. Nincs ms dolga, csak kt jabb
vltozt bevezetnie, s ezekben tmsolni az eredeti vltozk tartalmt)

122/312
A string-ek mint vektorok

A stringek kezelhetek vektorknt is. Hivatkozhatunk rjuk elemenknt, mint a karaktereket


tartalmaz tmbkre.

string s=123456789;
for (i=0;i<s.Length;i++)
{
Console.WriteLine("{0}",s[i]);
}

A fenti pldban a string Length tulajdonsgval hivatkoztunk a hosszra, majd a ciklus


magjban mindig az aktulis elemet rattuk ki a kpernyre. A hossz tulajdonsg a string-ben
szerepl karakterek szmt adja vissza. A 0. az els, a length-1. az utols elem indexe.
Amennyiben a for ciklusban egyenlsg is szerepelne (i<=s.Length) a ciklus vgn
hibazenetet kapnnk, mivel az s-nek elfogytak az elemei. Ezt tlindexelsnek nevezzk.
(Gyakori hiba kezd programozknl ne kvessk el!)
Az s string i. eleme, vagyis az aktulis indexelt elem karakter tpus, mivel karakterek
sorozatbl pl fel, vagyis az s[i], a string egy eleme karakter. Ezt a kvetkez pldn
keresztl be is lthatjuk.
Az s=s[1]; rtkad utasts eredmnye a kvetkez hibazenet jelenik meg:

Cannot implicitly convert type 'char' to 'string',

Vagyis a kt tpus nem kompatibilis. Az rtkads akkor vlik helyess, ha az s[1] elemet
konvertljuk string-g.

s=s[1].ToString();

Ennl az rtkadsnl mr nem kapunk hibazenetet. Az rtkads eredmnye az s 1-es


index eleme.

Annak ellenre, hogy a string-ek elemenknt is olvashatak, az ilyen tpus mveletek kell
krltekintst ignyelnek. Az rtkadsoknl inkbb hasznljuk a tpus megfelel beszr
rutinjt.

A string-ekbe n.: rsz string-eket szrhatunk be az Insert() metdus segtsgvel. A


paramter listnak tartalmaznia kell az indexet, ahova szeretnnk beszrni, s a karaktert,
vagy a karakterlncot. A kvetkez plda bemutatja az Insert() metdus hasznlatt.

123/312
s=123456
s=s.Insert(2,"ABCD");

A fenti programrszlet eredmnyeknt az s vltoz tartalma az albbi rtk lesz:

12ABCD3456

A kvetkez plda megmutatja, hogyan tudunk tetszleges szveget a felhasznl ltal


megadott kulcs segtsgvel titkostani. A titkostshoz a XOR (kizr-vagy) opertort
hasznljuk fel. (Amennyiben a titkostott szveget egy vltozban troljuk, a XOR jbli
alkalmazsval a string eredeti llapott kapjuk vissza.) A C# nyelvben a XOR mveletet a ^
karakter jelenti, mkdse megegyezik a matematikai logikbl ismert kizr-vagy
opertorral. (A titkostshoz s a visszafejtshez rdemes fggvnyt kszteni.)

using System;

namespace ConsoleApplication4
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
string s;
int key;
int i;

Console.WriteLine("Gpelje ide a
titkostand szveget : ");
s=Console.ReadLine();

Console.WriteLine("Adja meg a titkosts kulcst (numerikus adat): ");


key=Convert.ToInt32(Console.ReadLine());

for (i=0;i<s.Length;i++)
{
Console.Write((char)(s[i]^key));
}
Console.ReadLine();
}
}
}

A program kimenete a kvetkez kpen lthat:

124/312
A for ciklus kir utastsban a beolvasott szveget alaktjuk t gy, hogy minden karaktert
kizr-vagy kapcsolatba hozzuk a felhasznltl kapott kulccsal. Ez ltal az eredeti
szvegbl egy matematikai ton titkostott szveget kapunk, melyet az eredeti kulcs ismerete
nlkl nem lehet visszalltani. (Termszetesen a titkostott szveg visszafejtse lehetsges,
szmos mdszer ltezik r, pl.: karakter statisztikk, kdfejt algoritmusok, matematikus
ismersk .)
A titkosts eredmnyt az egyszersg kedvrt nem troltuk, csak kirtuk a kpernyre. A
Kir utastsban n.: tpus-knyszertst alkalmaztunk, mivel a XOR eredmnyeknt kapott
rtk nem karakter, hanem numerikus adat.

Console.Write((char)(s[i]^key));

Ezzel a megoldssal rtk el, hogy a kpernyn nem az adott karakter kdja, hanem maga a
karakter lthat.

A string tpus szinte minden komolyabb programban elfordul, klnskppen igaz ez a


fjlkezel programokra. Termszetesen a string-ek hasznlatnak mg rengeteg finomsga
ltezik. Hasznlhatjuk ket szmrendszerek kzti tvltsok eredmnynek trolsra, olyan
nagy szmok sszeadsra, szorzsra, melyekhez nem tallunk megfelel mret
vltozkat.
Sajnos nem minden programozsi nyelv tartalmazza a string tpust, s nagyon kevs olyan
nyelv van, melyben osztlyknt hasznlhatjuk, de ahol megtalljuk (ilyen a C# nyelv), ljnk
vele, mert megknnyti s meggyorstja a programozst.

125/312
Programozsi feladatok

1. rja a kpernyre a kvetkez string konstansokat: c:\alma, c:\\alma!


2. rjon programot, mely megszmolja, hogy az inputknt rkez mondatban hny darab
a bet van!
3. Az elz programot alaktsa t gy, hogy a szmlland bett is a felhasznl adja
meg!
4. Ksztsen karakter statisztikt a felhasznltl beolvasott szveg karaktereirl! A
statisztika tartalmazza az adott karaktert, s azt, hogy hny darab van belle.
5. Az input szvegbl tvoltsa el a szkzket!
6. Olvasson be egy mondatot s egy szt! Mondja meg, hogy a sz szerepel-e a
mondatban!
7. A beolvasott mondatrl dntse el, hogy az visszafel is ugyanazt jelenti-e! (Az Indul
a grg aludni, vagy a Gza kk az g visszafel olvasva is ugyanazt jelenti.)
gyeljen a mondatvgi rsjelekre, mivel azok a mondat elejn nem szerepelnek.
8. Olvasson be egy szmot egy string tpus vltozba, majd alaktsa szm tpuss!
9. Olvasson be egy egyszer, a ngy alap-mveletet tartalmaz kifejezst (1+2,1*2,4-
3,6/2, stb.) a billentyzetrl egy sring tpus vltozba, majd a kifejezs rtkt rja ki
a kpernyre!
10. A beolvasott mondat kisbetit alaktsa nagybetsre, a nagybets karaktereket pedig
kisbetsre!
11. Kt mondatrl dntse el, hogy azonosak-e! Ha a kis s nagybetk klnbznek, a
programnak akkor is megoldst kell adnia!
12. Az inputknt beolvasott szvegben cserlje ki az sszes szkzt a # karakterre,
majd az gy kapott szveget rja ki a kpernyre!
13. llaptsa meg, hogy az input szvegben szerepelnek-e szmok!

126/312
Programozs tanknyv

XI. Fejezet

Eljrsok alapfokon
Oszd meg s szedd szt

Hernyk Zoltn

127/312
Hosszabb programok rsa esetn amennyiben a teljes kdot a Main tartalmazza, a
program ttekinthetetlen lesz.

Mindenkppen javasolt a kd rszekre trdelse. Ennek sorn olyan rszeket


klntnk el, amelyek nmagban rtelmes rszfeladatokat ltnak el. E
rszfeladatoknak jl hangz nevet tallunk ki (pl. bekrs, feltlts, kirs, maximlis
elem megkeresse, listzs, kigyjts, stb.), ezeket a program kln rszn, a Main
fv-tl elklntve rjuk meg.

Az ilyen, nll feladattal s nvvel elltott, elklntett programrszletet eljrsnak


nevezzk.

Az eljrsnak
- a visszatrsi rtk tpusa ktelezen void,
- van neve (azonost),
- lehetnek paramterei,
- van trzse.

Pl:
static void Informci()
{
Console.WriteLine("*******************");
Console.WriteLine("** Plda program **");
Console.WriteLine("Programoz: Kiss Aladr Bla");
Console.WriteLine("Kszlt: 2004.11.23");
}

A fenti pldban az eljrs neve Informci, s sajt utastsblokkja van (a { s }


kztti rsz). Az eljrs (egyelre) static void legyen, s a zrjelpr megadsa
ktelez abban az esetben is, amennyiben nincsenek paramterek.

Amennyiben a program adott pontjn szeretnnk vgre hajtani az eljrsban foglalt


utastssorozatot, gy egyszeren hivatkoznunk kell r a nevvel (eljrs indtsa,
eljrs meghvsa):

static void Main(string[] args)


{
Informci();
}

Ekkor az adott ponton az eljrs vgrehajtsra kerl, majd a vgrehajts visszatr a


hvst kvet utastsra, s folytatdik tovbb a program futsa:

128/312
Termszetesen van r lehetsg, hogy ne csak a Main()-bl hvjunk eljrsokat,
hanem az eljrsokbl is van lehetsg tovbbi eljrsokat hvni:

C#-ban az eljrsok neve azonost, ezrt rvnyes az azonost nvkpzsi


szablya: betvel vagy alhzssal kezddik, betvel, szmjeggyel, alhzs
karakterekkel folytatdhat (de nem tartalmazhat szkzt)! A C#-ban szabad kezetes
karaktereket is hasznlni az eljrs-nevekben, de nem javasolt karakterkszlet s
kdlap fgg forrskdot eredmnyez, e miatt msik gpen msik programoz ltal
nehezen elolvashatv vlik a forrskd.

Hov rjuk az eljrsainkat?

Az Objektum Orientlt programozs elvei szerint a programok ptkvei az


osztlyok. Az osztly (class) mintegy csoportba foglalja az egy tmakrbe,
feladatkrbe tartoz eljrsokat, fggvnyeket, vltozkat. E miatt a program
felptse a kvetkez lehet:

129/312
using System;

namespace Tetszoleges_Nev
{
class PeldaProgram
{
Ms eljrsok ...
static void Main(string[] args)
{
...
}
Tovbbi eljrsok ...
}
}

Az egyb eljrsainkat ugyanabba a csoportba (osztlyba) kell megrni, mint ahol a


Main() fv tallhat. A sorrendjk azonban lnyegtelen, mindegy, hogy a sajt
eljrsainkat a Main() fv eltt, vagy utn rjuk le, illetve rhatjuk ket vegyes
sorrendben is. Az eljrsok egyms kztti sorrendje sem lnyeges. Ami fontos,
hogy kzs osztlyba (class) kerljenek.

A programok eljrsokra tagolsa persze jabb problmkat szl. Az eljrsok nem


ltjk egyms vltozit. Ennek oka a vltozk hatskrnek problmakrben
keresend.

Minden vltoznvhez tartozik egy hatskr. A hatskr megadja, hogy az adott


vltozt a program szvegben mely rszeken lehet ltni (lehet r hivatkozni). A
szably az, hogy a vltozk csak az ket tartalmaz blokk-on bell lthatk, vagyis
a vltozk hatskre az ket tartalmaz blokkra terjed ki.

static void Main(string[] args)


{
int a=0;
Feltoltes();
Console.WriteLine("{0}",a);
}

static void Feltoltes()


{
a=10;
}

A fenti kd hibs, mivel az a vltoz hatskre a Main fggvny belseje, az a


vltozra a Feltoltes() eljrsban nem hivatkozhatunk. Ha mgis megprbljuk,
akkor a C# fordt a The name 'a' does not exist kezdet fordtsi hibazenettel
jelzi ezt neknk.

130/312
Ezt (hibsan) az albbi mdon reaglhatjuk le:

static void Main(string[] args)


{
int a=0;
Feltoltes();
Console.WriteLine("{0}",a);
}

static void Feltoltes()


{
int a=10;
}

Ekkor a Feltoltes() eljrsban is ltrehozunk egy msik, szintn a nev vltozt. Ez


a vltoz sajtja lesz a Feltoltes()-nek, de semmilyen kapcsolatban nem ll a
Main() fggvny-beli a vltozval. A nevek azonossga ellenre ez kt klnbz
vltoz, kt klnbz adatterleten helyezkedik el. Ezrt hiba tesszk bele az a
vltozba a 10 rtket, ezen rtk a Feltoltes() eljrsbeli a vltozba kerl bele,
nem a Main()-beli a vltozba.

Hogyan kell megosztani vltozkat eljrsok kztt?

Mivel a hatskr-szably szigor, s nincs kivtel, ezrt mindaddig, amg az a


vltozt a Main() fggvny blokkjban deklarljuk, addig e vltozt ms eljrsokban
nem rhetjk el. A megolds: ne itt deklarljuk!

class PeldaProgram
{
static int a=0;

static void Main(string[] args)


{
Feltoltes();
Console.WriteLine("{0}",a);
}

static void Feltoltes()


{
a=10;
}
}

Azokat a vltozkat, amelyeket szeretnnk megosztani az eljrsaink kztt, azokat


az eljrsokat sszefog osztly (class) belsejben, de az eljrsokon kvl kell
deklarlni. Mivel az eljrsaink static jelzvel vannak elltva, ezrt a kzttk
megosztott vltozkat is ugyangy static jelzvel kell elltni. Ha ezt elmulasztannk,
akkor a static eljrsok nem ltnk a nem static vltozkat.

131/312
Nzznk egy sszetett feladatot: krjnk be egy tz elem vektor elemeit
billentyzetrl, majd rjuk ki a vektor elemeinek rtkt a kpernyre egy sorban
egyms mell vesszvel elvlasztva, majd szmoljuk ki s rjuk ki a kpernyre a
vektor elemeinek sszegt.

Figyeljk meg, hogy a Main() fggvny nem tartalmaz lnyegben semmilyen kdot,
a tnyleges mveleteket eljrsokba szerveztk, s jl cseng nevet adtunk nekik:

class PeldaProgram
{
static int[] tomb=new int[10];
static int osszeg=0;
//..................................................
static void Main(string[] args)
{
Feltoltes();
Kiiras();
OsszegSzamitas();
Console.WriteLine("A tomb elemek osszege={0}"
,osszeg);
}
//..................................................
static void Feltoltes()
{
for(int i=0;i<tomb.Length;i++)
{
Console.Write("A tomb {0}. eleme=",i);
string strErtek=Console.ReadLine();
tomb[i] = Int32.Parse( strErtek );
}
}
//.................................................
static void Kiiras()
{
Console.Write("A tomb elemei: ");
for(int i=0;i<tomb.Length;i++)
Console.Write("{0}, ",tomb[i]);
Console.WriteLine();
}
//.................................................
static void OsszegSzamitas()
{
osszeg=0;
for(int i=0;i<tomb.Length;i++)
osszeg = osszeg + tomb[i];
}
//..................................................
}

A vltozk kztt meg kellett osztani magt a tmbt, mert azt minden eljrs
hasznlta. Ezen tl meg kellett osztani egy osszeg nev vltozt is, mert ezen
vltoz rtkt az OsszegSzamitas() eljrs szmolja ki, s a Main() fggvny rja ki
a kpernyre.

132/312
Feladatok:

16. Programozsi feladat: Ksztsnk olyan eljrst, amely egy megosztott tmb
elemeit kri be billentyzetrl, de csak pozitv szmokat fogad el!

17. Programozsi feladat: Ksztsnk olyan eljrst, amely egy megosztott tmb
elemeit kri be billentyzetrl, de nem enged meg ismtldst (kt egyenl
rtk elemet nem fogad el)!

18. Programozsi feladat: Ksztsnk olyan eljrst, amely egy megosztott tmb
elemeit generlja 100-900 kztti vletlen szmokkal (a vletlen szm
generlshoz a System.Random osztly pldnyt kell hasznlni)!

19. Programozsi feladat: Ksztsnk olyan eljrst, amely egy megosztott tmb
elemei kzl meghatrozza a legnagyobb elem rtkt, s ezen rtket
berakja egy megosztott max nev vltozba!

20. Programozsi feladat: Ksztsnk olyan eljrst, amely egy megosztott tmb
elemei kzl meghatrozza a legnagyobb elem sorszmt, s ezen rtket
berakja egy megosztott maxI nev vltozba!

21. Programozsi feladat: Ksztsnk olyan eljrst, amely egy feltlttt,


megosztott tmb alapjn meghatrozza, hogy hny klnbz rtk szerepel
a tmbben! Az eredmnyt egy kulonbozo_db nev megosztott vltozba
helyezi el!

22. Programozsi feladat: Ksztsnk olyan eljrst, amely kt megosztott,


feltlttt tmb elemeit mint halmazokat kezeli, s elkszti a kt tmb unijt
egy unio nev szintn megosztott tmbbe! Mekkora legyen ezen unio tmb
mrete?

23. Programozsi feladat: Ksztsnk olyan eljrst, amely kt megosztott,


feltlttt tmb elemeit mint halmazokat kezeli, s elkszti a kt tmb
metszett egy metszet nev szintn megosztott tmbbe! Mekkora legyen
ezen metszet tmb mrete?

24. Programozsi feladat: Ksztsnk olyan eljrst, amely kt megosztott,


feltlttt tmb elemeit mint halmazokat kezeli, s elkszti a kt tmb
klnbsgt egy kulonbseg nev szintn megosztott tmbbe! Mekkora
legyen ezen kulonbseg tmb mrete?

25. Programozsi feladat: Egy svnyen tcsk s szraz foltok vltogatjk


egymst. Egy arra jr stl maximum 4 egyms melletti tcst kpes
tugrani egyszerre. Az svnyt egy tmbben rjuk le, ahol a 0 jelenti a tcst,
az 1 jelenti a szraz foltot. Ksztsnk olyan eljrst, amely egy ilyen tmb

133/312
alapjn meghatrozza, hogy a stl kpes-e tjutni az svny egyik vgbl
a msikba anlkl, hogy tcsba kellene lpnie!

26. Programozsi feladat: Ksztsnk olyan eljrst, amely egy megosztott tmb
elemeit vgigolvasva megadja, hogy a tmb elemei
o a: nvekv sorrendbe vannak-e rendezve,
o b: cskken sorrendbe vannak-e rendezve,
o c: rendezetlenek.

27. Programozsi feladat: Ksztsnk olyan eljrst, amely egy feltlttt tmb
elemeinek ismeretben megadja a leghosszabb olyan szakasz elemszmt,
ahol a tmb elemek nvekv sorrendben vannak!

28. Programozsi feladat: Ksztsnk olyan eljrst, amely egy feltlttt tmb
elemeinek ismeretben megadja azt a legszkebb intervallumot, amelybl a
tmb elemek szrmaznak!

29. Programozsi feladat: Ksztsnk olyan eljrst, amely egy a tmb elemeit
fordtott sorrendbe bemsolja egy b tmbbe!

30. Programozsi feladat: Ksztsnk olyan eljrst, amely egy, egsz


szmokkal feltlttt a tmb elemei kzl azokat, amelyek prosak, bemsolja
egy b tmbbe. A maradk helyeket tltsk fel 0-kal!

31. Programozsi feladat: Ksztsnk olyan eljrst, amely egy a tmb pros
elemeit tmsolja egy b tmb elejre, a maradk elemeket pedig a b tmb
vgre!

32. Programozsi feladat: Ksztsnk olyan eljrst, amely egy a tmb elemeit
1-gyel lejjebb cssztatja! Az a tmb rgi legels eleme legyen most a
legutols (ciklikus cssztats)!

33. Programozsi feladat: Ksztsnk olyan eljrst, amely egy a tmb elemeit
n-nel lejjebb cssztatjk ciklikusan! Az n rtkt szintn egy megosztott
vltozbl vegye ki az eljrs (n=0 esetn az elemek helyben maradnak, n=1
esetn elz feladat)! Ha az n rtke nagyobb, mint a tmb elemszma, akkor
is helyesen mkdjn a program!

34. Programozsi feladat: Ksztsnk olyan eljrst, amely kt egyenl hossz


a s b vektor szorzatt szmtja ki
( szorzat=a[0]*b[0]+a[1]*b[1]++a[n]*b[n] )!

35. Programozsi feladat: Ksztsnk olyan eljrst, amely egy polinom


helyettestsi rtkt szmolja ki. A polinom egytthatit egy a tmb trolja! A
polinom ltalnos alakja a[0]*xn + a[1]*xn-1 + a[2]*xn-2 + + a[n]. Az x rtkt

134/312
az eljrs az x vltozban tallja meg. A szmts gyorstsra hasznljuk fel
a Horner elrendezs adta elnyket!

135/312
Programozs tanknyv

XII. Fejezet

Fggvnyek rsa
Szmold ki s ide vele

Hernyk Zoltn

136/312
A fggvny rokon fogalom az eljrssal egy apr klnbsggel. A fggvny egy
olyan eljrs, amely olyan rszfeladatot old meg, melynek pontosan egy
vgeredmnye is van egy rtk.

Amennyiben az a rszfeladat, hogy egy rtkekkel mr feltlttt tmb eleminek


sszegt kell kiszmtani, a vgeredmny egyetlen szmrtk. Amennyiben ezt
eljrs segtsgvel oldjuk meg, gy a vgeredmnyt egy megosztott vltozba kell
elhelyezni. Ez sokszor nem tl szerencss megolds, mert a fggvny ktdik ezen
megosztott vltoz nevhez. Amennyiben egy msik programba szeretnnk ezt
fggvnyt thelyezni, gy vele egytt kell mozgatni a megosztott vltozt is.

Az ilyen jelleg feladatokat megold alprogramokat fggvnyek formjban rjuk


meg.

Amennyiben fggvnyt akarunk rni, kt fontos dolgot kell szem eltt tartanunk:
- A fggvnyeknl rgzteni kell, hogy milyen tpus rtket adnak majd vissza.
Ezt a fggvny neve eltt kell feltntetni (a void helyett).
- A fggvnyek ezek utn ktelesek minden esetben egy ilyen tpus rtket
vissza is adni! A fggvny visszatrsi rtkt a return kulcssz utn rt
kifejezsben kell feltntetni.
Pl:
static int OsszegSzamitas()
{
int sum=0;
for(int i=0;i<tomb.Length;i++)
sum = sum + tomb[i];
return sum;
}

A fenti rszben e fggvny egy egsz szmot fog visszaadni, ezt jelljk a
tpusnvvel: int. A fggvny sajt vltozt hasznl fel segdvltozknt (sum) a
szmts sorn, majd a fggvny vgn a return sumal jelli, hogy a sum
vltozban szerepl rtket (ami int tpus) adja vissza, mint visszatrsi rtket.

A fggvnyek meghvsa hasonlan trtnik, mint az eljrsok hvsa. Csak mivel a


fggvny vissza is ad egy rtket, ezrt gondoskodni kell rla, hogy ezen rtket a
fggvnyt meghv programrsz fogadja, feldolgozza.

static void Main(string[] args)


{
Feltoltes();
Kiiras();
int osszesen=OsszegSzamitas();
Console.WriteLine("A tomb elemek osszege={0}",osszesen);
}

Itt a meghv ponton az OsszegSzamitas() fggvny ltal visszaadott rtket a


meghv rgtn eltrolja egy osszesen nev vltozba, melybl ksbb ki tudja rni
a kpernyre ezen rtket.

137/312
Ebben a formban a program mr nem kell, hogy megosszon osszeg vltozt,
hiszen az OsszegSzamitas() mr nem ilyen mdon kzli az eredmnyt a Main()
fggvnnyel, hanem egyszeren visszaadja azt.

class PeldaProgram
{
static int[] tomb=new int[10];

//................................................................
static void Main(string[] args)
{
Feltoltes();
Kiiras();
int osszesen=OsszegSzamitas();
Console.WriteLine("A tomb elemek osszege={0}",osszesen);
}

//................................................................
static int OsszegSzamitas()
{
int sum=0;
for(int i=0;i<tomb.Length;i++)
sum = sum + tomb[i];
return sum;
}

//................................................................
}

A 11. fejezetben felsorolt eljrsok legnagyobb rszt t lehet rni fggvnyekre.


Vegyk pldul a maximlis elem rtknek meghatrozst.

static int MaximalisElemErteke()


{
int max=tomb[0];
for(int i=1;i<tomb.Length;i++)
if (tomb[i]>max) max=tomb[i];
return max;
}

E fggvny a megosztott tomb elemei kzl keresi ki a legnagyobb elem rtkt.


Meghvsa az albbi mdon trtnhet meg:

int maxElemErteke = MaximalisElemErteke();


Console.WriteLine("A tomb legnagyobb elemnek
rtke={0}",
maxElemErteke);

Amennyiben azt szeretnnk ellenrzni, hogy egy adott rtk szerepel-e egy
rtkekkel mr feltlttt tmb elemei kztt, akkor az albbi fggvnyt rhatnnk
meg:

138/312
static bool Szerepel_E()
{
for(int i=0;i<tomb.Length;i++)
if (tomb[i]==keresett_elem) return true;
return false;
}

A fenti fggvnyben kihasznljuk azt, hogy a return kulcssz hatsra a fggvny


azonnal megszaktja a futst, s visszatr a hvs helyre. Amennyiben az
egyenlsg teljesl, gy a keresett rtk szerepel a tmbben, ezrt a ciklus tovbbi
futtatsa mr felesleges megvan a keresett vlasz. A return false utastsra mr
csak akkor jut el a fggvny, ha az egyenlsg egyszer sem teljeslt. Ekkor a
krdsre a vlasz a false rtk.

A fenti fggvny meghvsa a kvetkez mdon trtnhet:

bool valasz = Szerepel_E();


if (valasz) Console.WriteLine("Nem szerepel a tmbben");
else Console.WriteLine("Szerepel a tmbben");

Ms mdja, hogy a fggvny visszatrsi rtkt rgtn az if felttelben hasznljuk


fel:

if (Szerepel_E()) Console.WriteLine("Nem szerepel a


tmbben");
else Console.WriteLine("Szerepel
a tmbben");

A fggvnyek ennl bonyolultabb rtkeket is visszaadhatnak:

static int[] Feltoltes()


{
int[] t = new int[10];
for(int i=0;i<t.Length;i++)
{
Console.Write("A tomb {0}. eleme=",i);
string strErtek=Console.ReadLine();
t[i] = Int32.Parse( strErtek );
}
return t;
}

A fenti fggvny ltrehoz egy int-ekbl ll, 10 elem tmbt a memriban, feltlti
elemekkel a billentyzetrl, majd visszaadja a feltlttt tmbt az t meghvnak:

int tomb[] = Feltoltes();

139/312
Amennyiben a feltlttt tmbt egy megosztott vltozba szeretnnk trolni, akkor
azt az albbi mdon kell megoldani:

class PeldaProgram
{
static int[] tomb;

//................................................................
static void Main(string[] args)
{
tomb = Feltoltes();
Kiiras();
...
}
...
}

Ekkor a tomb vltozt elszr csak deklarltuk, megadtuk a tpust. Majd a Main()
fggvny belsejben, a megfelel idpontban meghvjuk a Feltoltes() fggvnyt, s
az ltala elksztett s feltlttt tmbt betesszk a megosztott vltozba.

140/312
Feladatok:

36. Programozsi feladat: Ksztsnk olyan fggvnyt, amely egy tglalap kt


oldalnak ismeretben kiszmtja a tglalap terlett!

37. Programozsi feladat: Ksztsnk olyan fggvnyt, amely meghatrozza kt


szm legnagyobb kzs osztjt!

38. Programozsi feladat: Ksztsnk olyan fggvnyt, amely eldnti egy


szmrl, hogy hny osztja van!

39. Programozsi feladat: Ksztsnk olyan fggvnyt, amely eldnti egy


szmrl, hogy prmszm-e!

40. Programozsi feladat: Ksztsnk olyan fggvnyt, amely megszmolja,


hogy egy adott rtk hnyszor szerepel egy tmbben!

41. Programozsi feladat: Ksztsnk olyan fggvnyt, amely meghatrozza kt


megosztott tmb elemeinek ismeretben a metszetk elemszmt!

42. Programozsi feladat: Ksztsnk olyan fggvnyt, amely meghatrozza kt


megosztott tmb elemeinek ismeretben a klnbsgk elemszmt (hny
olyan elem van a kt tmbben sszesen, amelyik csak az egyik tmbben van
benne)!

43. Programozsi feladat: Ksztsnk olyan fggvnyt, amely meghatrozza egy


tmb elemeinek tlagt!

44. Programozsi feladat: Ksztsnk olyan fggvnyt, amely meghatrozza egy


tmbben hny 3-al oszthat, de 5-el nem oszthat szm van!

141/312
Programozs tanknyv

XIII. Fejezet

Eljrsok s fggvnyek kzpfokon

Hernyk Zoltn

142/312
Amikor eljrst (vagy fggvnyt) runk, az alprogram trzsben sokszor hivatkozunk
ilyen megosztott (kzs) vltozkra. E vltozkban az eljrs a program elz rszei
ltal ellltott adatokat kap meg, vagyis bemen adatokat fogad. Az eljrs ezen
adatok segtsgvel jabb rtkeket llthat el, melyeket elhelyezhet megosztott
vltozkban, ahol a tbbi eljrs megtallhatja ket. gy llt el az eljrs kimen
adatokat.

Bemen adatokat az eljrs azonban nem csak a megosztott vltozkban vehet t,


hanem paramterekben is.

A paramtereket az eljrs fejrszben kell feltntetni. Fel kell sorolni vesszvel


elvlasztva a bemen adatok tpust, s egy azonostt (nevet) kell adni ezen
adatoknak. Ezt a listt formlis paramterlistnak hvjuk.
Pl:

static void Kiiras(int a,int b)


{
Console.WriteLine("A {0}+{1}={2}",a,b,a+b);
}

A fenti pldban ezen eljrs kt bemen rtket vr. Mindkett int tpus, vagyis
egsz szmok. Az eljrs trzsben a paramterekre a formlis paramterlistban
feltntetett azonostkkal (nv) hivatkozhatunk. A fenti eljrs kirja a kt szmot a
kpernyre, majd a kt szm sszegt is.

Amikor ezen eljrst meg akarjuk hvni, akkor ezen eljrsnak a fenti bemen
adatokat t kell adni. A hvs helyn feltntetett paramterlistt (mely az aktulis
bemen adatok rtkt tartalmazza) aktulis paramterlistnak hvjuk. Aktulis
paramterlistban mr sosem runk tpusokat, hanem konkrt rtkeket!

Kiiras(12,15);

A fenti kdrszlet elindtja a Kiiras eljrst, tadvn neki a kt bemen adatot. Az


eljrs elindulsa eltt feltlti a paramtervltozkat az aktulis rtkekkel (a=12,
b=15), majd utna kezddik az eljrstrzs utastsainak vgrehajtsa.

Bizonyos szempontbl nzve a formlis paramterlista egyttal vltoz-


deklarcinak is minsl, hiszen a formlis paramterlistban lnyegben tpusok s
nevek vannak megadva. Az eljrs trzsben ezekre a paramterekre mint adott

143/312
tpus vltozkra hivatkozhatunk. Ezen vltozk kezdrtkkel rendelkeznek, a
kezdrtkeket az aktulis paramterlistban adjuk meg.

Ennek megfelelen az aktulis s a formlis paramterlistra szigor szablyok


vonatkoznak:
- az aktulis paramterlistban pontosan annyi rtket kell felsorolni, amennyit
a formlis paramterlista alapjn az eljrs vr tlnk,
- az aktulis paramterlistban pontosan olyan tpus rtkeket kell rendre
megadni, mint amilyet a formlis paramterlista szerint az adott helyen fel kell
tntetni.

Hibsak az albbiak:
Kiiras(12.5,15); // 12.5 nem int !
Kiiras(12); // tl kevs paramter
Kiiras(12,15,20); // tl sok paramter
Kiiras(Hello,20); // a Hello nem int tpus

Helyesek az albbiak:
Kiiras(12,15);
Kiiras(3*4,15*3-12);
int x=8; Kiiras(x,x+2);

Megllapthatjuk, hogy az aktulis paramterlistban olyan rtket kell rnunk,


amelynek a vgeredmnye jelen esetben int tpus. A hvs helyre rhatunk
szmkonstanst (literl), kifejezst melynek kiszmtsa int-et eredmnyez, illetve
vltozt is (ekkor a vltoz aktulis rtkt adjuk t).

A konstans (literl) s a vltoz is kifejezsnek minsl, csak egyszer kifejezs.


Ezrt ltalnosan azt mondhatjuk, hogy az aktulis paramterlistban olyan
kifejezst kell rnunk, melynek tpusa megfelel a formlis paramterlistban
lert kvetelmnyeknek. Ezt a tpus-megfelelsget a kompatibilis tpusok szablyai
rjk le. Az OO nyelvekben a tpuskompatibilitst is az OO szablyai rjk le. Egyelre
annyit jegyezznk meg, hogy az int kompatibilis a double-val, az int-ek (sbyte,
uint, int, ) kompatibilisek egymssal, csakgy mint a double tpusok is (double,
float), persze ha az aktulis rtk a kvnt tpusban az adott pillanatban elfr.

Pl:
static void Kiiras(double a)
{
Console.WriteLine("A szm fele={0}",a/2);
}

Ezen eljrs egy tetszleges racionlis szmot vr, majd kirja az adott szm felt.

Kiiras(12);

144/312
Ebben az esetben az aktulis paramterlistban nem egy trt, hanem egy egsz
szmot adtunk t. Ez ugyan nem pontosan ugyanolyan tpus, mint amit a formlis
paramterlistban lertunk, de az aktulis rtk (12) konvertlhat (kompatibilis) a
krt tpusra.

int x=12; Kiiras(x);

Ezen plda szerint is az aktulis rtk egy int tpus rtk, de ez elfogadhat, ha a
fogad oldalon akr double-t is kpesek vagyunk fogadni.

Fordtva nem igaz:


static void Kiiras_Egesz(int a)
{
Console.WriteLine("A szm ktszeres={0}",a*2);
}

double z=12.5; Kiiras_Egesz (z);

rtelemszeren a kld oldal (aktulis paramterlista) hiba prbln tadni a 12.5


rtket, a fogad oldal (formlis paramterlista) csak egsz tpus rtket tud
tvenni. Ezrt ezt a paramtertadst a C# fordt nem engedi, mg akkor sem, ha

double z=12; Kiiras_Egesz (z);

Ekkor hiba van a z vltozban olyan rtk, amelyet a fogad oldal akr t is tudna
venni, ez ltalnos esetben nem biztonsgos. A hvs helyre olyan tpus kifejezst

145/312
kell rnunk, amely ennl tbb garancit ad. Ezrt nem engedi meg a C# fordt, hogy
a tpusok ennyire eltrjenek egymstl.

Ennl persze bonyolultabb tpusok is szerepelhetnek a formlis paramterlistban:

static void Kiiras(int[] tomb)


{
Console.Write("A tomb elemei: ");
for(int i=0;i<tomb.Length;i++)
Console.Write("{0}, ",tomb[i]);
Console.WriteLine();
}

A fenti pldban a Kiiras eljrs egy komplett tmbt vr paramterknt. A tmb


elemei int tpus rtkek kell hogy legyenek. A hvs helyre ekkor termszetesen
egy ennek megfelel rtket kell rni:

int[] x = new int[10];


Kiiras( x );

Itt az x vltoz tpusa int[], ami megfelel a fogad oldali elvrsoknak, ezrt a fenti
eljrshvs tpusban megfelel, gy helyes is.

146/312
Feladatok:

45. Programozsi feladatok: ksztsnk olyan fggvnyt, amely kap


paramterknt kt szmot, s visszaadja a kt szm kzl a nagyobbik
rtkt! Amennyiben a kt szm egyenl, gy az els szm rtkt kell
visszaadni!

46. Programozsi feladatok: ksztsnk olyan fggvnyt, amely kap kt int


tmbt paramterknt, mindkt tmbben 3-3 szm van! A tmbk egy-egy
hromszg oldalainak hosszt rjk le! Adjuk vissza a nagyobb kerlet
hromszg kerletnek rtkt!

47. Programozsi feladatok: ksztsnk olyan fggvnyt, amely meghatrozza


egy paramterben megadott, int tpus tmbben a leghosszabb egyenl
elemekbl ll szakasz hosszt!

48. Programozsi feladatok: ksztsnk olyan eljrst, amely egy megosztott


tmbt feltlt vletlen elemekkel egy megadott intervallum elemei kzl gy,
hogy kt egyenl rtk ne forduljon el a tmbben! Az intervallum kezd s
vgrtkeit paramterknt adjuk t!

147/312
Programozs tanknyv

XIV. Fejezet

Eljrsok s fggvnyek felsfokon

Hernyk Zoltn

148/312
Krds: tudunk-e a paramtervltozkon keresztl rtket visszaadni?

Erre sajnos a C#-ban nem egyszer vlaszolni. A helyzet igen bonyolult mindaddig,
amg a referencia tpus vltozkkal alaposan meg nem ismerkednk.

Addig is hasznljuk az albbi szablyokat:


- amennyiben a paramtervltozk tpusa a nyelv alaptpusai (int, double, char,
string, ) kzl valamelyik, gy nem tudunk rtket visszaadni a hvs
helyre,
- ha a paramter tpusa tmb, akkor a tmbelemeken keresztl azonban igen.

Pl.:
static void Kiiras(int a,int b)
{
Console.WriteLine("A {0}+{1}={2}",a,b,a+b);
a = a+b;
}

Ha a fenti eljrst az albbi mdon hvjuk meg


int x=12;
Kiiras(x,20);
Console.WriteLine("A hivas utan az x erteke x={0}",x);

ekkor kirskor az x vltoz rtke mg mindig 12 lesz. Mivel a paramtertads


sorn a hvskori rtk (12) taddik az eljrs a vltozjba mint kezdrtk
(a=12), de utna a hvs helyn szerepl x vltoz, s a fogad oldalon szerepl a
vltoz kztt minden tovbbi kapcsolat megsznik. Ezrt hiba tesznk az a
vltozba az eljrson bell ms rtket (a+b), az nem fogja befolysolni az x
rtkt, marad benne a 12.

A fenti technikt rtk szerinti paramtertadsnak nevezzk. Ekkor az aktulis


paramterlistban feltntetett rtket a fogad oldal tveszi a nlkl, hogy a
kapcsolatot fenntartan. Az rtk egyszeren tmsoldik a fogad oldal vltoziba.

Mint az brn is ltszik, az x aktulis rtke (12) tmsoldik a memria kln


terletn helyet foglal a vltozba. E miatt az a=a+b rtkads eredmnye is ezen
a kln terleten kerl trolsra, s nem zavarja, nem vltoztatja meg az x rtkt.

149/312
Amennyiben azonban a paramtertads-tvtel sorn tmbket adunk t, gy a
helyzet megvltozik:

static void Feltoltes(int[] tomb)


{
tomb[0] = 10;
}

static int[] kisTomb=new int[10];


Feltoltes( kisTomb );
Console.WriteLine(A 0. tombelem={0}, kisTomb[0] );

A hvs helyn szerepl kis tmb mg feltltetlen, amikor tadjuk a Feltoltes


eljrsnak. Az eljrs fogadja a tmbt a tomb vltozban, majd megvltoztatja a
tomb elemeinek rtkt. Ezen vltozs azonban belerdik a kisTomb ltal
reprezentlt tmb-be is, ezrt az eljrs lefutsa utn a kisTomb[0] rtke mr 10
lesz.

Az ilyen jelleg paramtertadst referencia-szerinti tadsnak nevezzk!

A referencia tpus nem jelentkezik kln a vltoz deklarcija sorn mint kln
kulcssz, vagy egyb jelzs, ezrt nehz felismerni. Egyelre fogadjuk el
szablyknt, hogy azok a vltozk lesznek referencia tpusak, amelyek esetn a
new kulcsszt kell hasznlni az rtk megadsakor (pldnyosts).

A referencia-tpus vltozknl dupla memriafelhasznls van. Az elsdleges


terleten ilyenkor mindig egy memriacmet trol a rendszer. Ezen memriacm a
msodlagos memriaterlet helynek kezdcme lesz. Ezen msodlagos
memriaterletet a new hozza ltre.

Az nyelvi alaptpusok (int, double, char, string, ) rtknek kpzsekor nem kell a
new kulcsszt hasznlni

int a = 10;

de a tmbknl igen:

int[] tomb = new int[10];

Az ilyen jelleg vltozkat ltalban az jellemzi, hogy viszonylag nagy memria-


ignyk van. Egy int tpus rtk trolsa csak 4 byte, mg a fenti tmb trolsa 40
byte.

150/312
Az rtk szerinti paramtertads sorn az rtk az tads pillanatban kt
pldnyban ltezik a memriban lemsoldik:

int x=12;
Kiiras(x);

static void Kiiras(int a)


{
...
}

A referencia tpus vltozk esetn azonban nem msoldik le az rtk mg egyszer


a memriban (ami a tmb esetn a tmbelemek lemsolst jelenten), hanem
csak a szban forg trterlet cme (memriacme) addik t. Ekkor a fogad oldal
megkapja a memriaterlet cmt, s ha beler ebbe a memriaterletbe, akkor azt a
kld oldal is szlelni fogja majd:

static void Feltoltes(int[] tomb)


{
tomb[0] = 10;
}

static int[] kisTomb=new int[10];


Feltoltes( kisTomb );

A fenti brn ltszik, hogy a kisTomb vltoznk aktulis rtke tmsoldik a tomb
aktulis rtkbe. Csakhogy a kisTomb rtke egy memriacm, ez az, ami
valjban tmsoldik a tomb vltzba, s nem tnylegesen a tmb elemei.

151/312
Mivel a tomb vltoz is ismerni fogja a tmbelemek tnyleges helyt a memriban,
ezrt amennyiben megvltoztatja azokat, gy a vltoztatsokat a kisTomb-n
keresztl is el tudjuk majd rni, hiszen mindkt esetben ugyanazokra a
tmbelemekre hivatkozunk a memriban.

Ez az oka annak, hogy a tmbelemek rtknek mdostsa a fogad oldalon


maradand nyomot hagy a memriban amikor az eljrs mr befejezte a futst,
az rtkek akkor is hozzfrhetek.

A referencia-szerinti paramtertads is rtk szerinti paramtertads, a vltoz


rtke ilyenkor egy memriacm, mely mint rtk msoldik t a
paramtervltozkba. Az mr ms krds, hogyha a fogad oldal megkapja a terlet
kezdcmt, akkor azt meg is vltoztathatja. Mivel az eredeti vltoz is ugyanezen
terletre hivatkozik, ezrt a vltozsokat a kld oldalon ksbb szlelni, (pl:
kiolvasni) lehet.

Amennyiben a fogad oldalon referencia tpus paramtert fogadunk, gy a kld


oldalon csak olyan kifejezs szerepelhet, melynek vgeredmnye egy referencia:

Feltoltes( new int[20] );

Az elzekben bemutatott kifejezs ltrehoz egy 20 elem int tmbt. A new foglalja
le szmra a memrit, majd visszaadja a terlet kezdcmt. Ezt a kezdcmet
ltalban egy megfelel tpus vltozban troljuk el, de amennyiben erre nincs
szksg, gy a memriacmet trols nlkl tadhatjuk egy eljrsnak
paramterknt.

static int[] Feltoltes(int[] tomb)


{
for(int i=0;i<tomb.Length;)
{
Console.Write("A tomb {0}. eleme=",i);
string strErtek=Console.ReadLine();
int x = Int32.Parse( strErtek );
if (x<0) continue;
tomb[i] = x;
i++;
}
return tomb;
}

Az elzekben bemutatott fggvny paramterknt megkapja egy int tpus tmb


kezdcmt. A tmb elemeit billentyzetrl tlti fel oly mdon, hogy csak pozitv
szmot fogad el. A feltlttt tmb cmt (referencijt) visszaadja.

Mivel a fggvny ugyanazt a memriacmet adja vissza, mint amit megkapott, ennek
nem sok rtelme ltszik. Figyeljk meg azonban a hvs helyt:

int[] ertekek = Feltoltes( new int[40] );

152/312
A hvs helyn a frissen elksztett tmb memriacmt nem troljuk el, hanem
rgtn tadjuk a fggvnyek. A tmb a hvs helyn kszl el, resen (csupa 0-val
inicializlva), a fggvny feltlti ezt a tmbt elemekkel, majd visszaadja az immr
feltlttt tmb cmt.

A fenti megolds azrt szp, mert egy sorban oldja meg a tmb ltrehozst,
feltltst. Amennyiben a Feltoltes() csak egy eljrs lenne, gy az albbi mdon
kellene meghvni:

int[] ertekek = new int[40];


Feltoltes( ertekek );

Amennyiben egy alaptpus paramter-vltozn keresztl szeretnnk rtket


visszaadni, gy azt jellni kell:

static void ParosElemek(int[] tomb, ref int db, ref int osszeg)
{
db=0;
osszeg=0;
for(int i=0;i<tomb.Length;i++)
if (tomb[i] % 2 == 0)
{
db++;
osszeg = osszeg + tomb[i];
}
}

A fenti eljrs kt rtket is elllt a pros tmbelemek szmt, s sszegt. Mivel


ez mr kett darab rtk, ezrt nem rhatjuk meg fggvnyknt. Egy fggvny csak
egy rtket adhat vissza.

Az ilyen jelleg paramtertadst cm szerinti paramtertadsnak nevezzk.


Ekkor a hvs helyn is jellni kell, hogy az tadott vltozban kimen adatokat
vrunk:

int x=0,y=0;
ParosElemek(tomb, ref x, ref y);
Console.WriteLine("A paros elemek db={0},
osszeguk={1}",x,y);

A ref kulcsszval kell jellni, hogy az adott paramterben rtket is vissza


szeretnnk adni. Ugyanakkor a ref kulcssz ennl tbbet jelent a ref
paramterben rtket is adhatunk t az eljrs szmra. Ez a paramter klasszikus
tmen paramter.

Az tmen paramterek egyidben bemen s kimen paramterek. Az eljrsban


ezen paramter rtkt felhasznlhatjuk, s meg is vltoztathatjuk.

153/312
int x,y;
ParosElemek(tomb, ref x, ref y);
Console.WriteLine("A paros elemek db={0},
osszeguk={1}",x,y);

Amennyiben a paramterknt tadott vltozk nem rendelkeznnek rtkkel a hvs


pillanatban (definilatlan vltoz), gy a C# fordt szintaktikai hibt jelez.

Ez a fenti fggvny esetn egybknt rtelmetlen, hiszen a fggvny db s osszeg


paramtervltozinak kezdrtke rdektelen. A problma forrsa az, hogy e
paramterek csak kimen rtkeket hordoznak, bemen rtkk rdektelen. Az ilyen
paramtereket nem a ref, hanem az out kulcsszval kell megjellni!

static void ParosElemek(int[] tomb, out int db, out int osszeg)
{
db=0;
osszeg=0;
for(int i=0;i<tomb.Length;i++)
if (tomb[i] % 2 == 0)
{
db++;
osszeg = osszeg + tomb[i];
}
}

A hvs helyn is:

int dbszam,summa;
ParosElemek(tomb, out dbszam, out summa);

A ref s az out mdostk kztt az egyetlen klnbsg, hogy a hvs helyn


(aktulis paramterlistban) szerepl vltozknak out esetn nem ktelez
kezdrtkknek lennik. Valamint egy out-os paramtervltozt a fordt
kezdrtk nlklinek tekint, s a fggvnyben ktelez rtket adni ezeknek a
paramtervltozknak a fggvny visszatrsi pontja (return) eltt.

A ref esetn a fggvnyhvs eltt a vltozknak ktelez rtket felvenni, s a


fggvnyben nem ktelez azt megvltoztatni.

Aki esetleg keresn, in mdost nincs a C#-ban, ugyanis a paramterek


alaprtelmezsben bemen adatok, vagyis az in mdostt ki sem kell rni.

static void Csere(ref int a, ref int b)


{
int c;
c=a;
a=b;
b=c;
}

154/312
A fenti eljrs a paramtereknt megkapott kt vltoz tartalmt cserli fel. Mivel
ilyenkor rdekes a paramterek aktulis rtke is, ezrt a ref kulcsszt kell
hasznlni.

A fenti eljrs kitnen felhasznlhat egy rendez eljrsban:

static void Rendezes(int[] tomb)


{
for(int i=0;i<tomb.Length-1;i++)
for(int j=i+1;j<tomb.Length;j++)
if (tomb[i]>tomb[j]) Csere(ref tomb[i],ref
tomb[j]);
}

155/312
Programozs tanknyv

XV. Fejezet

WinForm

Radvnyi Tibor
Kirly Roland

156/312
A Windows Formok

Hibakezels

A C# nyelv a futsidej hibk kiszrsre alkalmas eszkzt is tartalmaz, mely eszkz


segtsgvel a programjainkba hibakezel (kivtel kezel) kdrszleteket pthetnk.
A kivtel kezel eljrsok lnyege, hogy elkerljk a futs kzbeni hibk esetn felbukkan
hibazeneteket, s megvdjk programjainkat a vratlan lellstl.

A try s a catch

A try parancs segtsgvel a programok egyes rszeihez hibakezel rutinokat rendelhetnk,


melyek hiba esetn az ltalunk megrt hibakezel eljrsokat hajtjk vgre, s ami nagyon
fontos, megakadlyozzk a program lellst.

A catch segtsgvel azokat a kivteleket kaphatjuk el, melyek a try blokkban keletkeznek. Itt
hatrozhatjuk meg, hogy milyen rutinok fussanak le s hogyan kezeljk a felmerl hibkat.
A catch segtsgvel klnbz hibk egyidej kezelst is megvalsthatjuk, de errl majd
bvebben szlunk a fejezet ksbbi rszeiben. Most nzznk meg egy pldt a try
hasznlatra!

using System;

namespace ConsoleApplication6
{

class Class1
{

[STAThread]
static void Main(string[] args)
{
string s;
int i;
Console.WriteLine("Krem gpeljen be egy tetszleges
mondatot!");
s=Console.ReadLine();
try
{
for (i=0;i<20;i++)
{
Console.WriteLine("Az s string {0}. eleme =
{1}",i,s[i]);
}
}

catch

157/312
{
Console.WriteLine("Hiba a program futsa sorn...");
}

Console.ReadLine();
}
}
}

Amennyiben futtatjuk a fenti programot, s a beolvassnl 20 karakternl rvidebb mondatot


adunk meg, a hibakezel eljrs elindul, mivel a try a catch blokkhoz irnytja a vezrlst. A
catch blokkban definilt hibakezel rsz lefut, vagyis a kpernyn megjelenik a hibazenet.
Abban az esetben, ha nem hasznljuk a hibakezel eljrsokat, a programunk lell, s a
hiba kezelst a .NET vagy az opercis rendszer veszi t. Ebbl a pldbl is jl lthat
milyen nagy szksg lehet a kivtelkezelre, ha jl mkd programokat akarunk rni.
Fokozottan rvnyes ez azokra a programokra, ahol a felhasznl adatokat visz be.
A kvetkez programban erre lthatunk pldt. Amennyiben az inputrl nem megfelel
adatok rkeznek, mkdsbe lp a kivtel-kezels, a catch blokkban elkapjuk a hibt s
kirjuk az okt a kpernyre.

using System;

namespace ConsoleApplication4
{

class Class1
{

[STAThread]
static void Main(string[] args)
{
int i;

try
{
Console.WriteLine("Az i rtke? : ");
i=Convert.ToInt32(Console.ReadLine());
}

catch(Exception e){Console.WriteLine(e.Message);}
Console.ReadLine();

}
}
}

A programban lthat, hogy a try utn kapcsos zrjelek kzt adjuk meg a hibt okozhat
program rszletet. A catch hibakezel rutinjait szintn kapcsos zrjelek kz kell rni, ezzel
jelezve a fordtnak, hogy hol kezddik s vgzdik a hibakezels.

158/312
A fenti pldban a tlindexels s a tpus klnbsgek mellett elfordulhatnak ms hibk is,
melyek a program rsakor rejtve maradnak. Az ilyen jelleg hibkra az elz kd nincs
felksztve, mivel nem definiltuk a lehetsges hibkat. Ez azt jelenti, hogy a try blokkban
elfordul brmely hiba esetn ugyanaz a hibazenet jelenik meg a kpernyn.
A catch blokkban lehetsgnk van a klnbz okok miatt keletkezett hibk
sztvlasztsra, a hiba tpusnak meghatrozsra.
A catch parancs a kivtelt paramterknt is fogadhatja, ahogy a fenti pldban lthattuk. A
paramterknt megadott vltoz System.Exception tpus, melybl kiolvashatjuk a hiba okt,
amit az e.Message rutinnal kapunk meg, s a megfelel hibakezelt indthatjuk el.

catch ( System.Exception e )
{
Console.WriteLine(e.Message);
//hibk kezelse
}

A kpernyn megjelen hibazenet nem nagyon beszdes, illetve gyakran tlsgosan sok,
nehezen rthet informcit tartalmaz. A clunk sem az, hogy a programunk hasznljt
hossz, rtelmezhetetlen zenetekkel terheljk, mert gy nem tesznk tbbet, mint az eredeti
hiba-ablak. Radsul a felhasznl nem is nagyon tudja kezelni a keletkezett hibkat, mg
annak ellenre sem, hogy kirjuk a kpernyre a hiba minden paramtert.
Sokkal jobb megolds, ha megllaptjuk a hiba okt, majd a megfelel hibakezels
aktivizlsval meg is szntetjk azt. (Ekkor mg mindig rrnk kirni a kpernyre, hogy
hiba trtnt, s a javtott hibrt a felhasznl nem is haragszik annyira Taln mg
elismeren blint is)
rhatunk olyan catch blokkokat is, melyek egy bizonyos tpus hiba elfogsra alkalmasak.

int a=0;
double c;

try
{
c = 10 / a + 30;
}

catch (ArithmeticException ar)


{
Console.WriteLine("Aritmetikai hiba : {0}",ar);
}

A catch blokkok sorrendje sem mindegy. A helyes megkzelts az, ha az ltalnos hibk el
helyezzk azokat a hibkat, melyekre mr eleve szmtani lehet a programban, mint pl.: a
fenti matematikai hiba.

159/312
A System nvtrben rengeteg kivtel tpust definiltak. A fontosabbakat az albbi
tblzatban foglaltuk ssze.

Kivtel neve Lersa


MemberAccesException Tagfggvny hozzfrsi hiba
ArgumentException Hibs tagfggvny-paramter
ArgumentNullException Null rtk tagfggvny paramter
ArithmeticException Matematikai mvelet-hiba
ArrayTypeMismatchException Tmbtpus hibja (rtk trolskor)
DivideByZeroException Nullval val oszts
FormatException Hibs paramter-formtum
IndexOutOfRangeException Tmb tl, vagy alulindexelse
InvalidCastException rvnytelen tpus talakts
NotFiniteNumberException A keletkezet rtk nem vges (hibs szmalak)
NullReferenceException Null rtkre val hivatkozs
NotSupportedException Nem tmogatott tagfggvny
OutOfMemoryException Elfogyott a memria
OverflowException Tlcsorduls (checked esetn)
StackOverflowException Verem tlcsorduls
TypeInitializationException Hibs tpus bells (static kontruktornl)

A finally blokk

Sokszor lehet szksg arra is, hogy egy program rszlet hibs s hibtlan mkds esetn
is lefusson. Tipikus plda erre a fjlkezels, ahol a megnyitott fjlt hiba esetn is le kell zrni.
Az ilyen tpus problmkra nyjt megoldst a finally kulcssz.
A finally blokkban elhelyezett kd mindig lefut, fggetlenl az eltte keletkezett hibktl.
(Nem igaz ez arra az esetre, ha a program vgzetes hibval ll le.)
A kvetkez plda bemutatja, hogyan alkalmazhatjuk a nyelv finally kulcsszavt:

int a=0;
double c;

try
{
c=10/a;
}
catch (ArithmeticException ar)
{
Console.WriteLine("Aritmetikai hiba : {0}",ar);
}

160/312
finally
{
Console.WriteLine("A program ezen rsze
mindenkppen lefut");
}

Kivtelek feldobsa

A C# nyelv lehetsget ad a sajt magunk ltal definilt kivtelek hasznlatra is. A kivtelek
dobsa a throw kulcsszval trtnik.

throw (exception);
throw exception;

A program brmely szintjn, brhol dobhatjuk a kivtelt a throw segtsgvel, s egy


tetszleges catch blokkal el is kaphatjuk. Amennyiben nem kapjuk el sehol, az a Main()
fggvny szintjn is megjelenik, vgl az opercis rendszer lekezeli a sajt hibakezel
rutinjval, ami legtbbszr azt jelenti, hogy a programunk lell.
A kvetkez plda bemutatja, hogyan dobhatunk sajt kivtelt.

class Verem
{
public Object Pop()
{
if (vm>0) { vm--; return t[vm]; }
else throw new Exception(res a verem);
}
}

A pldban a verem tetejrl akarunk levenni egy elemet akkor, ha az nem res.
Amennyiben nincs mr elem a veremben, ezt egy kivtel dobsval jelezzk. A kivtel
feldobst a throw vgzi, melynek paramtere egy exception osztly:
Exception(Hibazenet). A kivtel dobsakor a new kulcsszt hasznltuk, mivel a definilt
kivtel is egy osztly, gy pldnyostani kellett. A konstruktor paramtere egy string,
melyben a hibazenetet adhatjuk meg, amit a kivtel elkapsakor kirhatunk. (Ha nem kapjuk
el, az opercis rendszer akkor is kirja egy hibaablakban a hibazenetknt megadott
stringet.)

161/312
Checked s unchecked

A C# nyelv tartalmaz kt tovbbi kulcsszt a kivtelek kezelsre s a hibk javtsra. Az


egyik a checked a msik pedig az unchecked. Amennyiben egy rtkadskor egy vltozba
olyan rtket szeretnnk elhelyezni, mely nem fr el annak rtktartomnyban,
OverflowException hibval lell a programunk. Jobb esetben az ilyen hibkat el tudjuk kapni
a megfelel catch{} blokkal, de az unchecked kulcssz hasznlatval megakadlyozhatjuk a
kivtel keletkezst is, mivel ilyenkor elmarad a hibaellenrzs.

unchecked
{
int a=2000000000000;
}

Az rtkads megtrtnik, a vltozba bekerl a csonktott rtk. (Amekkora mg elfr


benne.)
A checked alkalmazsval pontosan az elbbi folyamat ellenkezjt rjk el. Az ellenrzs
mindenkppen megtrtnik, s kivtel keletkezik a hiba miatt.
A checked s unchecked kulcsszavak nem csak blokknt hasznlhatak: cehecked{},
uncehecked{}, hanem kimondottan egy kifejezs vagy rtkads vizsglatnl is. Ekkor a
kvetkez formban rhatjuk ket:

checked( kifejezs, mvelet, vagy rtkads);


uncehecked(kifejezs, mvelet, vagy rtkads);;

Ebben a formban csak a zrjelek kz rt kifejezsekre, vagy egyb mveletekre


vonatkoznak. Alaprtelmezs szerint a checked llapot rvnyesl a programokban tallhat
minden rtkadsra s mveletre. Csak nagyon indokolt esetekben hasznljuk ki az
unchecked nyjtotta lehetsgeket, mert knnyen okozhatunk vgzetes hibkat a
programokban.
A fentiek ismeretben elmondhatjuk, hogy a hibakezels, a kivtelek kezelse nagyon fontos
s hasznos lehetsg a C# nyelvben. Nlkle nehz lenne elkpzelni hibtlanul mkd
programokat. Igaz, hogy a kivtelkezelst alkalmaz programok sem tkletesek, de taln
nem llnak le vgzetes hibkkal, nem kesertik sem a programoz, sem a felhasznl lett.

162/312
Programozsi feladatok

1. rjon programot, mely egy meghatrozott vgjelig szm prokat olvas be a


billentyzetrl s a szm prok els elemt elosztja a msodikkal, az eredmnyt
pedig kirja a kpernyre! Nullval val oszts esetn a program jelezze a hibt a
felhasznlnak!
2. Ksztsen programot, mely verem kezelst valst meg egy n elem vektorban! A
program a Pop() s a Push() mveletek hibja esetn dobjon kivtelt!
3. Az elz programot mdostsa gy, hogy a kivtelek dobskor a hibazenetek
megjelenjenek a kpernyn!
4. Ksztsen programot, mely egy n elem tmbbe olvas be egsz tpus rtkeket, de
csak pros szmokat fogad el!
5. Mdostsa az elz programot gy, hogy a beolvassnl csak 3-mal s 5-tel oszthat
szmokat fogadjon el!
6. Ksztsen programot, mely a fejezetben felsorolt kivtelek nevt kirja a kpernyre.
A kivtelek nevt egy konstans tmbben trolja!
7. rjon programot, mely szmokat olvas be a billentyzetrl, majd a kpernyre rja a
beolvasott szmok ngyzett! A program csak szmokat fogadjon el inputknt. Nem
szmtpus beolvassakor kivtelekkel kezelje le az elfordul hibkat!
8. Ksztsen programot, mely szmokat olvas be a billentyzetrl egy string tpus
vltozba. A beolvasott szmot alaktsa szm tpuss, majd trolja egy int tpus
vltozban. A beolvass s a konverzi sorn keletkez hibkat kivtelekkel kezelje
le! (Hiba az is, ha a felhasznl a string-ben nem szmokat ad meg. Erre kln hvjuk
fel a figyelmt!)

163/312
j Projekt ksztse

A Windows Application projektek ksztse mr a kezdeti lpsekben eltr a Console


Application tpustl, mivel lnyegesen tbb forrskd s erforrs szksges a
ksztskhz. Az ilyen tpus programoknak rendelkeznik kell egy ablakkal, az ablakot
ler osztllyal, s a forrskddal, ami definilja az elbbiek mkdst. Az alkalmazs f
rsze maga a Form, melyre a tbbi komponenst rakhatjuk. Amikor futtatjuk a programot,
akkor is ez a Form lesz az, ami megjelenik a kpernyn, mint Windows alkalmazs.

Ksztsk el az els Form-mal rendelkez programunkat! Indtsuk el .NET fejleszti eszkzt!


A File men new menpontjban tallhat listbl vlasszuk a new project-et! Ezt
megtehetjk gy is, hogy a Start Page lapon, ami az indtskor megjelenik a szerkeszt
rszben, rkattintunk a new project linkre.

Ekkor elindul a New Project - varzsl, ahol ki kell vlasztanunk azt a programozsi nyelvet,
mellyel dolgozni szeretnnk. Jelljk ki a C# nyelvet! Az ablak jobb oldali rszben meg kell
mondanunk, hogy milyen tpus alkalmazst szeretnnk kszteni. Most ne a megszokott
Console Application tpust vlasszuk, hanem a Windows Applicationt! Hatrozzuk meg a
program nevt, majd azt a knyvtrat, ahova el akarjuk menteni a fjlokat! rdemes kln
knyvtrat kszteni minden programnak, hogy a fjlok ne keveredjenek ssze.

Az jvhagyst kveten a .NET dolgozni kezd. Generlja a programunkhoz szksges


fjlokat, ellltja a Form-ot, a kdszerkesztbe betlti a forrskdot.

164/312
A forrskdot kezdetben nem is lthatjuk, csak a Form fellett a Design ablakban. Itt tudjuk
szerkeszteni, s vezrl elemeket is itt adhatunk hozz. A Form-ra helyezhet
komponenseket a bal oldali, Toolbox felirat, elugr panelen talljuk meg. (A panel a
tbbihez hasonlan fixlhat, de sajnos tl sokat takar a hasznos felletbl. A vezrlk
mkdst ms fejezetek mutatjk be.)

165/312
A .NET ablaknak a jobb oldaln (nem alaprtelmezs szerinti belltsok esetn mshol is
lehet) tallunk egy fggleges panelt, melynek a felirata Class View. A panelre kattintva
tudjuk megmondani a szerkesztnek, hogy mutassa meg a forrskdot. A panel a projekt
elemeit fa struktrba szervezve tartalmazza. Ha itt kivlasztjuk a Form1 cmkt, s dupln
kattintunk r, a szerkesztbe betltdik a Form-hoz tartoz kd.

A program sorait tanulmnyozva rgtn feltnik az, hogy a using rsz kibvlt a kvetkez
hivatkozsokkal:

166/312
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

Az importlt elemek kzt helyet kapott a Windows form-okat ler osztly, a


komponensekhez s a grafikus fellet programozshoz szksges hivatkozsok.
Amennyiben jabb komponenseket adunk a Form-hoz, a lista tovbb bvlhet.

A forrskd tartalmazza a sajt nvtert is, melyet tetszs szerint tnevezhetnk.

namespace WindowsApplication1{}

A nvtrhez tartoz program rszeket kapcsos zrjelei kztt helyezhetjk el. Itt foglal
helyet a Form osztly defincija, konstruktora, destruktora s az inicializlshoz szksges
utastsok.

public class Form1 : System.Windows.Forms.Form


{
private System.ComponentModel.Container components = null;

public Form1()
{
InitializeComponent();
}

protected override void Dispose( bool disposing )


{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows Form Designer generated code

private void InitializeComponent()


{
this.components = new
System.ComponentModel.Container();
this.Size = new System.Drawing.Size(300,300);
this.Text = "Form1";
}
#endregion
}

167/312
A Main() fggvnyt a lista vgn, de mg a Class zrjelein bell definilhatjuk, de ezt a
.NET megteszi helyettnk. A Main() fggvnynek jelenleg az egyetlen utastsa az
Appliaction.Run();, melynek a feladata az alkalmazs elindtsa.

static void Main()


{
Application.Run(new Form1());
}

A Form Designer s a Form1.cs, vagyis a forrskd ablakai kzt vlthatunk, ha rkattintunk


egrrel a kvnt ablak fejlcre. Amennyiben a Form-on, vagy a rhelyezett vezrlk
valamelyiknek a felletn duplt kattintunk, a kdszerkesztbe ugrik a kurzor, de ebben az
esetben az adott elem valamely esemnyt kapjuk. A programozs sorn a kt ablak kzt
folyamatosan vltogatni kell, mivel a Windows Application projektek ksztse a forrskd s
a fellet egyttes szerkesztst ignyli.

A projekt futtatsa az F5 billenty letsekor indul el. A .NET ellenrzi a kd helyessgt,


ezutn elindtja a Programot. (Termszetesen a httrben bonyolult mveletek hajtdnak
vgre, elindul az elfordts, optimalizls, stb.) A Form megjelenik a kpernyn a
szerkeszt ablaka eltt. Ez a Form kln alkalmazsknt fut, rendelkezik sajt memria
terlettel, megjelenik a Windows Task- listjban. Ha lelltjuk, visszakerlnk a
szerkesztbe, s tovbb dolgozhatunk a forrskdon.

A .NET kezeli felletn mg szmos panel tallhat a felsoroltak mellet. A Toolbox felett
foglal helyet a Server Explorer, mely lehetsget nyjt a szmtgp erforrsainak
(adatbzisok, DLL fjlok, klnbz szerverek, service-ek) megtekintsre, tallzsra.

A jobb oldalon talljuk Dinamikus Help rendszert, ami csak abban az esetben mkdik
megfelelen, ha teleptettk a szmtgpnkre az MSDN Library minden CD-jt, vagy
rendelkeznk internet kapcsolattal. A Help rendszert az F1 billentyvel is aktivizlhatjuk.
Prbljuk ki, hogyan mkdik! Gpeljk be a szerkesztbe az int szt, jelljk ki, majd
nyomjuk le az F1-et. Egy j ablak nylik, melyben az int tpusrl megtallhat, sszes
informci szerepelni fog: forrskd pldk, lersok, praktikus dolgok. A Help hasznlata
elengedhetetlen a Windows programok rsakor, mivel a rendelkezsre ll osztlyok s
tagfggvnyek szma olyan hatalmas, hogy senki nem tudja fejben tartani azokat.

Vgl a kperny als rszn kaptak helyet a futtatsi informcikat s az esetleges hibk
okt feltr Output s Debug ablakok, melyeket a Consol Application projekteknl is
megtallhattunk. Ezeket be is zrhatjuk, mivel a kvetkez futtatskor gyis jra
megjelennek.

168/312
A Consol Application projektek ksztse bonyolultabb az eddig tanult alkalmazsoknl.
Nagyobb programozi tudst ignyelnek s felttelezik a magas szint Objektum Orientlt
programozsi ismereteket.

169/312
Feladatok

1. Hozzon ltre egy j, Windows Application projektet!


2. Mentse el a httrtrra az aktulis alkalmazs minden adatt!
3. Keresse meg az alkalmazs mentett adatait, majd tltse vissza azokat!
4. Futtassa az alkalmazst, s vizsglja meg, hogy az Output s a Debug ablakban
milyen zenetek jelennek meg!
5. Prblja meg rtelmezni az zeneteket!
6. A ltrejtt llomnyok kzl keresse meg a form1.cs llomnyt majd nyissa meg azt a
.NET fejleszti eszkzzel!
7. A Help rendszer segtsgvel keresse meg a form-okrl rendelkezsre ll lehet
legtbb informcit.

170/312
A lthat komponensek, a kontrollok

Button (Gomb)

A nyomgomb komponens ltal a felhasznl mveletet hajthat vgre. Pldul


elindthat, vagy megszakthat egy folyamatot.

Properties (Tulajdonsgok)
AllowDrop Engedlyezi, vagy tiltja a drag and drop
funkcit. Alapbelltsban tiltva van.
Anchor Form melyik rszhez igaztson
BackColor Gomb htternek a szne
BackgroundImage Gomb htternek a kpe
ContextMenu Jobbgombos elbukkan men
DialogResult Belltja a gomb visszatrsi rtkt.
Dock Belltja a gomb helyzett a kvetkez
pozikba:
Top fels rszhez
Bottom als rszhez
Left baloldalra
Right jobboldalra
Fill kitlti az egsz Form-ot
Enabled Engedlyezett-e
Font A gombon tallhat szveg bettpusa
ForeColor A gombon tallhat szveg szne
ImageList sszerendels a gomb s az imagelist
kztt.
ImageIndex Az imagelistben megadott kpnek az
indexe
Location A gomb a bal fels saroktl val

171/312
tvolsga x;y formban
Locked Gomb lezrsa
Modifiers A gomb hozzfrsnek a lehetsgei:
public, private, protected, protected
internal, internal
Size A gomb mrete
TabStop Elrhet-e tabultorral
TabIndex A tabultoros lpegets sorrendje
Text Gomb felirata
TextAlign A felirat elhelyezkedse a gombon
Visible Lthat-e

Esemnyek:
Click Gombra kattints
Enter
GotFocus Gomb fkuszba kerlse
Keypress, KeyDown Billenty lenyomsa amg a gomb
fkuszban van
KeyUp Billenty elengedse amg a gomb
fkuszban van
Leave Fkuszbl kikerls
MouseEnter Mutat a gomb fltt helyezkedik el
MouseLeave Mutat elhagyja a gombot
ParentChanged Szl megvltozik

Label, Linklabel

A label szveget jelent meg, amihez a felhasznl nem fr hozz.

172/312
Kzs tulajdonsgok:
Name Nv
AllowDrop Engedlyezi, vagy tiltja a drag and drop
funkcit.
Anchor Form melyik rszhez igaztson
BackColor A cmke htternek a szne
BackgroundImage A cmke htternek a kpe
Enabled Engedlyezett-e
Font A cmkn tallhat szveg bettpusa
ForeColor A szveg szne
ImageList sszerendels a cimke s az imagelist
kztt.
ImageIndex Az imagelistben megadott kp indexe
Location A gombnak a bal fels saroktl mrt
tvolsga x;y formban
Size A cmke mrete
Text A cmke felirata
Visible Lthat-e

Linklabel tulajdonsgai:

ActiveLinkColor Az aktivlt link szne


LinkBehavior A link stlusa amikor a mutat fltte van
LinkColor A link szne
LinkVisibled Volt-e mr megnzve?
VisitedLinkColor Megnzett link szne

Textbox

A textbox egy olyan terletet jell ki, ahol a felhasznl ltalban egysoros szveget
adhat meg, vagy mdosthat.

173/312
Tulajdonsgai:
AutoSize Automatikus mret
Borderstyle A textbox keretnek a stlusa
CharacterCasing A bet mtete
Lower kisbets
Upper nagybets
Normal vegyes
Lines Texboxban tallhat sorok sorszmozva
MaxLength A texboxba rhat szveg maximlis
hossza
Multiline Tbbsoros megjelents
PasswordChar Az textboxban megjelen karakter
(jelszavaknl)
Text Textboxban tallhat szveg

Esemnyek:
Keypress, KeyDown Billenty lenyomsa amg a gomb
fkuszban van
KeyUp Billenty elengedse amg a gomb
fkuszban van
Leave Fkuszbl kikerls
MouseEnter Mutat a gomb fltt helyezkedik el
MouseLeave Mutat elhagyja a gombot

CheckBox

Akkor hasznljuk, amikor egy igaz/hamis, igen/nem vlasztsi lehetsget


szeretnnk adni a felhasznl szmra.

A CheckBoxnak s a RadioButtonnak a funkcija ugyanaz. Mindkett lehetv teszi


a felhasznl szmra, hogy egy listbl vlasszon. De amg a CheckBoxnl a lista
elemeinek kombincijt vlaszthatjuk ki, addig a RadioButtonnl mr csak a lista
egy elemt.
Az Appearance (megjelens) tulajdonsgnl azt llthatjuk be, hogy a CheckBox egy
ltalnos kivlaszt ngyzet legyen vagy egy nyomgomb.
A ThreeState tulajdonsg azt hatrozza meg, hogy a CheckBoxnak kt vagy hrom
llapota legyen. Ha kett akkor a CheckBox aktulis rtkt lekrdezni s belltani a
Checked tulajdonsgnl tudjuk. Ha hrom akkor mindezt a CheckState
tulajdonsgnl tudjuk megtenni.
Megjegyzs: A Checked tulajdonsg 3 llapot CheckBox esetn mindig igaz rtket
ad vissza
A FlatStyle a CheckBox stlust s Megjelenst hatrozza meg. Ha ez
FlatStyle.Systemre van lltva, akkor a felhasznl opercis rendszernek
belltsai hatrozza meg ezt.
Megjegyzs: Mikor a FlatStyle tulajdonsg FlatStyle.Systemre van lltva, akkor
CheckAlign tulajdonsg figyelmen kvl van hagyva, s a
ContentAlignment.MiddleLeft vagy ContentAlignment.MiddleRight igaztst
figyelembe vve jelenik meg. . Ha a CheckAlign tulajdonsg az egyik jobb igaztsra
van lltva akkor ez a vezrl elem gy jelenik meg, hogy a

174/312
ContentAlignment.MiddleRight igaztst hasznlja; klnben pedig a
ContentAlignment.MiddleLeft igazts lltja be.

Plda kd:

// CheckBox ltrehozsa s inicializlsa


CheckBox checkBox1 = new CheckBox();

//CheckBox megjelentse nyomgombknt


checkBox1.Appearance = Appearance.Button;

// A megjelens autmatikus frisstsnek kikapcsols


checkBox1.AutoCheck = false;

// A CheckBox hozzadsa a formhoz.


Controls.Add(checkBox1);

GroupBox

A GroupBox egy terlet kerett hatrozza meg egy vezrl elem csoport krli
felirattal vagy felirat nlkl. Logikailag egysgbe tartoz vezrl elemek
sszefogsra hasznljuk a formon. A GroupBox egy kontner, ami vezrl
csoportokat tud meghatrozni.

A GroupBoxot jellemzen RadioButton csoportok sszefogsra hasznljuk. Ha van


kt GroupBoxunk, mindkettben nhny RadioButton, akkor mindkettben ki tudunk
vlasztani egyet-egyet.
A GroupBoxhoz a Control tulajdonsg Add metdusval tudunk hozzadni
vezrlket.

175/312
Plda kd:

private void InitializeMyGroupBox()


{
//Egy GroupBox s 2 RadioButton ltrehozsa s inicializlsa.
GroupBox groupBox1 = new GroupBox();
RadioButton radioButton1 = new RadioButton();
RadioButton radioButton2 = new RadioButton();

// A GroupBox FlatStyle tulajdonsgnak belltsa.


groupBox1.FlatStyle = FlatStyle.System;

// A RadioButtonshozzadsa a GroupBoxhoz.
groupBox1.Controls.Add(radioButton1);
groupBox1.Controls.Add(radioButton2);

// A GroupBox hozzadsa a formhoz


Controls.Add(groupBox1);
}

MainMenu

A MainMenu egy kontner a form menstruktrjnak szmra. A MainMenu


MenuItem objektumokbl ll ssze melyek egyedi menutastsok a men
struktrban. Minden menitemhez tartozik egy utasts amit vgrehajt az
alkalmazsunkban vagy az al, vagy az s menelemeken. Ahhoz, hogy beillesszk a
MainMenut a formba s az megjelenjen rajta ssze kell egyeztetni a form Menu
tulajdonsgval.

176/312
Azokhoz az alkalmazsokhoz melyek tbb nyelvet tmogatnak lehet hasznlni a
RightToLeft tulajdonsgot, ami a menelem szvegt jobbrl balra jelenti meg, mint
az arab nyelv rsakor.
Egy formhoz lehet kszteni tbb MainMenut is ha tbb menstruktrt szeretnnk
megvalstani. Ha jra akarjuk hasznlni a MinMenut egy specilis
menstruktrban, akkor hasznljuk a CloneMenu metdust, ami egy msolatot
kszt. Amikor ksz van a msolat, akkor el lehet vgezni a megfelel mdostsokat
az j menstruktrn.

177/312
Plda kd:

public void CreateMyMainMenu()


{
//res MainMenu ltrehozsa.
MainMenu mainMenu1 = new MainMenu();

MenuItem menuItem1 = new MenuItem();


MenuItem menuItem2 = new MenuItem();

menuItem1.Text = "File";
menuItem2.Text = "Edit";
// 2 MenuItem hozzadsa a MainMenuhz.
mainMenu1.MenuItems.Add(menuItem1);
mainMenu1.MenuItems.Add(menuItem2);

// A MainMenu beillesztse Form1be.


Menu = mainMenu1;
}

RadioButton

A CheckBox s a RadioButton a funkcija ugyanaz. Mindkett lehetv teszi a


felhasznl szmra, hogy egy listbl vlasszon. De amg a CheckBoxnl a lista
elemeinek kombincijt vlaszthatjuk ki, addig a RadioButtonnl mr csak a lista
egy elemt.

A RadioButton meg tud jelenteni egy szveget, vagy egy kpet, vagy mindkettt.

178/312
Amikor a felhasznl kivlaszt egy RadioButtont egy csoportbl akkor a tbbi
automatikusan resre vltozik. Minden RadioButton ami egy adott kontneren bell
van (mint pl. egy form) egy csoportot alkot. Ha egy formra tbb csoportot akarunk
rakni, akkor minden egyes csoportnak helyezznk el egy kontnert a formon (mint pl.
GroupBox, Panel).
A Checked tulajdonsggal tudjuk lekrdezni s belltani a RadioButton llapott. A
RadioButton gy nzhet ki mint egy nyomgomb, vagy gy mint egy hagyomnyos
RadioButton. Ezt az Appearance tulajdonsg hatrozza meg.

Plda kd:

private void InitializeMyRadioButton()


{
// RadioButton ltrehozsa s inicializlsa.
RadioButton radioButton1 = new RadioButton();

// RadioButton nyomgombknt val megjelentse.


radioButton1.Appearance = Appearance.Button;

// A Click esemny hatsra trtn kinzet frissts


kikapcsols.
radioButton1.AutoCheck = false;

// A RadioButton hozzdsa a formhoz


Controls.Add(radioButton1);
}

ComboBox

A listk nagy helyet foglalnak a formokon, s az ltaluk felknlt elemek nem


bvthetek a felhasznl ltal. Ezen problmk megoldsra hasznlhatjuk a
combobox osztlyt. Ez egyesti a szerkeszt mez (edit) s a lenyl lista
tulajdonsgait. Els pillantsra egy TextBox-ot lthatunk a jobb oldaln egy
nyilacskval.

179/312
Feladata: Adatok legrdl ablakban trtn megjelentse

Megjelens

BackColor a ComboBox httrszne


Cursor a kurzor tpusa, ami megjelenik a
vezrl fltt, amikor az egrkurzort fl
mozgatjuk
DropDownStyle a megjelenst s a mkdst vezrli
Font szveg megjelentsre hasznlt
bettpus
ForeColor eltrszn (pl. betszn)
Text a vezrlben lthat szveg

Viselkeds

AllowDrop meghatrozza, hogy a vezrl fogadhat-


e Fogd-s-vidd rtestseket
ContextMenu helyi men, ami a vezrln jobb
egrgombbal trtn kattintsra jelenik
meg
DrawMode A ComboBox megrajzolsi mdjt
vezrli
DropDownWidth a legrdl ablak szlessge pixelben
Enabled azt jelzi, hogy a ComboBox
engedlyezett, vagy nem
IntegralHeight true, ha a listarszlet csak teljes
elemeket tartalmazhat, klnben false
ItemHeight a ComboBox egy elemnek magassga
pixelben
MaxDropDownItems A legrdl listban egyszerre lthat
bejegyzsek maximlis szma
MaxLength a ComboBox beviteli rszbe rhat
karakterek maximlis szma
Sorted Meghatrozza, hogy a vezrl tartalma

180/312
rendezett vagy sem
TabIndex az elem helyt adja meg a TAB
sorrendben
TabStop megmutatja, hogy az elem
kivlaszthat-e a TAB billenty
hasznlatval
Visible a vezrl lthat vagy nem

Adat

DataSource a listt jelli, ahonnan a vezrl az


elemeit veszi
DisplayMember az adatforrs egy tulajdonsga, mezje,
amit a comboboxban meg kvnunk
jelenteni
Items Collection, a ComboBox elemeit
tartalmazza
Tag Tetszleges clokra hasznlhat egsz
rtk mez

Tervezs

Name A vezrl neve


Locked megmutatja, hogy a vezrl
tmretezhet, tmozgathat-e
Modifiers A vezrl lthatsgi szintjt jelli
Anchor Horgony; a vezrl mely szlei
rgztettek az t tartalmaz kontner
szleihez kpest
Dock megmutatja, hogy a vezrl mely szlei
vannak sszekapcsolva az t tartalmaz
elem szlvel
Location Belltja vagy lekrdezi a vezrl bal
fels sarknak az t tartalmaz elem bal
fels sarktl mrt relatv tvolsgt
SelectedValue Kivlasztott elem rtke

Esemnyek

Click kattintshoz ktd esemny


DoubleClick Dupla kattintshoz kapcsold esemny
DrawItem akkor kvetkezik be, amikor egy
bizonyos elemet vagy terletet meg kell
rajzolni
DropDown azt jelzi, hogy a ComboBox menje
legrdlt
DropDownStyleChanged jelzi, hogy a DropDownStyle tulajdonsg
megvltozott
HelpRequested A felhasznl segtsget kr a vezrlrl
MeasureItem akkor kvetkezik be, amikor egy

181/312
bizonyos elem magassgt ki kell
szmtani
SelectedIndexChanged akkor kvetkezik be, amikor a
ComboBox SelectedIndex tulajdonsga
megvltozik, azaz jabb elem kerl
kijellsre
StyleChanged jelzi, ha megvltozott a vezrl stlusa
SystemColorsChanged bekvetkezik, amikor a rendszersznek
megvltoznak

A kvetkez esemnyek mindegyike egy tulajdonsg megvltozst jelzi:

BackColorChanged httrszn
ContextMenuChanged helyzetrzkeny men
CursorChanged kurzor
DataSourceChanged adatforrs
DisplayMemberChanged megjelentend adattag-forrs
DockChanged igazts
EnabledChanged engedlyezettsgi llapot
FontChanged bettpus
ForeColorChanged eltrszn (betszn)
LocationChanged helyzet (Lsd Location)
ParentChanged szl
SelectedValueChanged kivlasztott rtk
SizeChanged mret
TabIndexChanged tab-sorrendbeli hely
TabStopChanged TAB-bal trtn kivlaszthatsg
belltsa
TextChanged szveg
VisibleChanged vizulis lthatsg

A kritikus tulajdonsg a DropDownStyle lehetsges rtkei:

Simple Szerkeszthet mez, a lista mindig ltszik


DropDown Szerkeszthet mez, a lista lenyithat. (alaprtelmezett)
DropDownList Nem szerkeszthet a mez, a lista lenyithat

A listhoz hasonlan a comboboxban is az Items tulajdonsg trolja a lista elemeit.


Ez a tulajdonsg egy ObjectCollection tpus. gy kezelse a szoksos metdusok
hasznlatval lehetsges.

Count Indexer, az elemek szmt adja vissza


Add j elem felvtele a listhoz
Insert j elem beszrsa a listba
Remove Elem trlse

A felhasznl ltal kivlasztott elemet a SelectedItem tulajdonsgon keresztl rjk


el, ami egy objektumot ad vissza. Ha az indexre van szksgnk, akkor a
SelectedIndex tulajdonsgot hasznljuk.

182/312
Tekintsnk nhny alapmveletet a plda segtsgvel:

A Feltlts gombesemnykezelje egyszer, egsz szmokkal tlti fel a combobox


items tulajdonsgt:

for (int i=0;i<10;i++)


comboBox1.Items.Add(i.ToString());

A Trls gomb mind a Items trolt, mind a text mezt trli:

comboBox1.Items.Clear();
comboBox1.Text="";

Egy egyszer switch szerkezettel mdosthatjuk a stlust a comboboxnak:

switch (comboBox1.DropDownStyle)
{
case ComboBoxStyle.Simple: comboBox1.DropDownStyle =
ComboBoxStyle.DropDown;
button3.Text="DropDown";
break;
case ComboBoxStyle.DropDown: comboBox1.DropDownStyle =
ComboBoxStyle.DropDownList;
button3.Text="DropDownList";
break;
case ComboBoxStyle.DropDownList: comboBox1.DropDownStyle =
ComboBoxStyle.Simple;
button3.Text="Simple";
break;
}

ListView

Ha az elzeknl is kifinomultabb listt szeretnnk hasznlni, akkor erre lehetsget


ad a ListView osztly.
Feladata: elemek gyjtemnynek klnbz nzetekben trtn- megjelentse

Megjelens

BackColor a ListView httrszne


BorderStyle A keret stlusa
CheckBoxes azt mutatja, hogy megjelennek-e CheckBoxok az elemek

183/312
mellett
Cursor a kurzor tpusa, ami megjelenik a vezrl fltt, amikor az
egrkurzort fl mozgatjuk
Font szveg megjelentsre hasznlt bettpus
ForeColor eltrszn (pl. betszn)
FullRowSelect Megmutatja, hogy egy elemen trtn kattints kijelli-e az
elem sszes al-elemt is
GridLines rcsvonalak jelennek meg az elemek s a rszelemek krl.
View az elemek megjelentsi mdja (ikonok, rszletek, lista...)

Viselkeds

Activation meghatroza, hogy milyen tpus mveletre van szksg a


felhasznl rszrl egy elem aktivlshoz
Alignment megmutatja az elemek igaztsi mdjt a ListView-n bell
AllowColumnReorder jelzi, hogy a felhasznl megvltoztathatja-e az oszlopok
sorrendjt
AllowDrop jelzi, hogy a vezrl fogadhat-e Fogd-s-vidd
rtestseket
AutoArrange az ikonok automatikus rendezettsgt jellemzi
ContextMenu helyi men, ami a vezrln jobb egrgombbal trtn
kattintsra jelenik meg
Coulumns A vezrlben megjelen oszlopfejlcek, Collection
Enabled azt jelzi, hogy a combobox engedlyezett, vagy nem
HeaderStyle Oszlopfejlcek stlusa
HideSelection azt jelli, hogy a vezrl kijellt elemn megmarad-e a
kijells, amikor a vezrl elveszti a fkuszt
HoverSelection megmutatja, hogy kijellhet-e egy elem azltal, hogy az
egrkurzort fltte hagyjuk
ImeMode
Items A ListView elemei
LabelEdit megengedi a felhasznlnak, hogy az elemek cmkit
megvltoztassk
LabelWrap azt jelli, hogy a cmke szvege tbb sorra trhet-e
LargeImageList a lista ikonjai Nagy ikonok nzetben
MultiSelect engedlyezi tbb elem egyszerre trtn kijellst
Scrollable Meghatrozza, hogy a vezrlben megjelenhetnek-e
grdtsvok, amennyiben nincs elg hely az ikonok
szmra
SmallImageList a lista ikonjai Kis ikonok nzetben
Sorting elemek rendezsnek mdja
StateImageList a lista alkalmazs ltal meghatrozott llapotokkal
kapcsolatos ImageList-je
TabIndex az elem helyt adja meg a TAB sorrendben
TabStop megmutatja, hogy az elem kivlaszthat-e a TAB billenty
hasznlatval
Visible a vezrl lthat vagy nem

Adat
Tag Teszleges clokra hasznlhat egsz rtk mez

184/312
Tervezs

Name A vezrl neve


Locked megmutatja, hogy a vezr tmretezhet, tmozgathat-e
Modifiers A vezrl lthatsgi szintjt jelli

Anchor Horgony; a vezrl mely szlei rgztettek az t tartalmaz


kontner szleihez kpest
Dock megmutatja, hogy a vezrl mely szlei vannak
sszekapcsolva az t tartalmaz elem szlvel
Location Belltja vagy lekrdezi a vezrl bal fels sarknak az t
tartalmaz elem bal fels sarktl mrt relatv tvolsgt

Esemnyek

Click kattintshoz ktd esemny


ColumnClick oszlopfejlcre trtn kattintshoz ktd esemny
DoubleClick Dupla kattintshoz kapcsold esemny
ItemActivate Elem aktivlsa
ItemDrag akkor kvetkezik be, amikor a felhasznl elkezd
vonszolniegy elemet

AfterLabelEdit elemcmke mdostsa utn kvetkezik be


AfterLabelEdit elemcmke mdostsa eltt jelentkzik
HelpRequested A felhasznl segtsget kr a vezrlrl
ItemCheck egy elem check llapotnak megvltozshoz tartozik
SelectedIndexChanged akkor kvetkezik be, amikor a ComboBox SelectedIndex
tulajdonsga megvltozik, azaz jabb elem kerl
kijellsre
StyleChanged jelzi, ha megvltozott a vezrl stlusa
SystemColorsChanged bekvetkezik, amikor a rendszersznek megvltoznak

A kvetkez esemnyek mindegyike egy tulajdonsg megvltozst jelzik:

BackColorChanged httrszn
ContextMenuChanged helyzetrzkeny men
CursorChanged kurzor
DockChanged igazts
EnabledChanged engedlyezettsgi llapot
FontChanged bettpus
ForeColorChanged eltrszn (betszn)
LocationChanged helyzet (Lsd Location)
ParentChanged szl
SizeChanged mret
TabIndexChanged tab-sorrendbeli hely
TabStopChanged TAB-bal trtn kivlaszthatsg
VisibleChanged vizulis lthatsg

185/312
TreeView

Ez az osztly az elemek hierarchikus rendben trtn megjelenst szolglja.

Feladata: cmkzett elemek hierarchikus gyjtemnynek megjelentse

Megjelens

BackColor a ComboBox httrszne


BorderStyle A keret stlusa
CheckBoxes azt mutatja, hogy megjelennek-e CheckBoxok az elemek mellett
Cursor a kurzor tpusa, ami megjelenik a vezrl fltt, amikor az
egrkurzort fl mozgatjuk
Font szveg megjelentsre hasznlt bettpus
ForeColor eltrszn (pl. betszn)
ItemHeight a TreeView egy elemnek magassga pixelben

Viselkeds

AllowDrop meghatrozza, hogy a vezrl fogadhat-e Fogd-s-vidd


rtestseket
ContextMenu helyi men, ami a vezrln jobb egrgombbal trtn
kattintsra jelenik meg
Enabled azt jelzi, hogy a combobox engedlyezett, vagy nem
FullRowSelect Megmutatja, hogy egy elemen trtn kattints kijelli-e az
elem sszes al-elemt is
HideSelection azt jelli, hogy a vezrl kijellt elemn megmarad-e a
kijells, amikor a vezrl elveszti a fkuszt
HotTracking megmutatja, hogy az elemek hyperlink-stlusv vljanak-e,
amikor az egrmutat fljk r
ImageIndex az alaprtelmezett kpindex a csompontok szmra
ImageList a vezrl ImageList-je, amelybl a csompontokhoz tartoz
kpek szrmaznak

186/312
Indent a gyermekcsompontok behzsa pixelben
LabelEdit megengedi a felhasznlnak, hogy az elemek cmkit
megvltoztassa
Nodes Gykrcsompontok a TreeView-n bell
PathSeparator a csompontok teljes elrsi tvonalnak megadshoz
hasznlt elvlaszt sztring
Scrollable Meghatrozza, hogy a vezrlben megjelenhetnek-e
grdtsvok, amennyiben nincs elg hely az elemek
megjelentse szmra
SelectedImageIndex alaprtelmezett kpindex a kivlasztott csompontok
szmra
ShowLines csompontokat sszekt vonalak megjelentse
ShowPlusMinus plusz/mnusz gombok megjelentse a szlcsompontok
mellett
ShowRootLines vonalak megjelentse a szlcsompontok mellett
Sorted Meghatrozza, hogy a vezrl tartalma rendezett vagy sem
TabIndex az elem helyt adja meg a TAB sorrendben
TabStop megmutatja, hogy az elem kivlaszthat-e a TAB billenty
hasznlatval
Visible a vezrl lthat vagy nem

Adat

Tag: Teszleges clokra hasznlhat egsz rtk mez

Tervezs

Name A vezrl neve


Locked megmutatja, hogy a vezr tmretezhet, tmozgathat-e
Modifiers A vezrl lthatsgi szintjt jelli
Anchor Horgony; a vezrl mely szlei rgztettek az t tartalmaz
kontner szleihez kpest
Dock megmutatja, hogy a vezrl mely szlei vannak sszekapcsolva az
t tartalmaz elem szlvel
Location Belltja vagy lekrdezi a vezrl bal fels sarknak az t
tartalmaz elem bal fels sarktl mrt relatv tvolsgt
Size A vezrl mrete pixelben

Esemnyek

Click kattintshoz ktd esemny


DoubleClick Dupla kattintshoz kapcsold esemny
ItemDrag akkor kvetkezik be, amikor a felhasznl elkezd
vonszolniegy elemet
AfterCheck akkor kvetkezik be, amikor a TreeNode egy
CheckBox-nak rtke megvltozik
AfterCollapse Lista felgrdtse utn kvetkezik be
AfterExpand Lista legrdtse utn kvetkezik be
AfterLabelEdit elemcmke mdostsa utn kvetkezik be
AfterSelect akkor vltdik ki, amikor a kijells megvltozik

187/312
BeforeCheck kivltdik, mieltt a TreeNode CheckBox kijellsre
kerl
BeforeCollapse Lista felgrdtse utn kvetkezik be
BeforeExpand Lista legrdtse utn kvetkezik be
BeforeLabelEdit elemcmke mdostsa eltt jelentkzik
BeforeSelect a TreeNode kijellse eltt vltdik ki
HelpRequested A felhasznl segtsget kr a vezrlrl
StyleChanged jelzi, ha megvltozott a vezrl stlusa
SystemColorsChanged bekvetkezik, amikor a rendszersznek megvltoznak

A kvetkez esemnyek mindegyike egy tulajdonsg megvltozst jelzik:

BackColorChanged httrszn
ContextMenuChanged helyzetrzkeny men
CursorChanged kurzor
DockChanged igazts
EnabledChanged engedlyezettsgi llapot
FontChanged bettpus
ForeColorChanged eltrszn (betszn)
LocationChanged helyzet (Lsd Location)
ParentChanged szl
SizeChanged mret
TabIndexChanged tab-sorrendbeli hely
TabStopChanged TAB-bal trtn kivlaszthatsg
VisibleChanged vizulis lthatsg

188/312
TabControl

Feladata: lapok sszefgg halmazt alkotja

Megjelens

Cursor a kurzor tpusa, ami megjelenik a


vezrl fltt, amikor az egrkurzort fl
mozgatjuk
Font szveg megjelentsre hasznlt
bettpus
ImageList a TabControlhoz

Megjelens

Alignment megmutatja a flek hol helyezkednek el


a TabControlon bell
AllowDrop jelzi, hogy a vezrl fogadhat-e Fogd-
s-vidd rtestseket
Appearance megjelensi belltsok
ContextMenu helyi men, ami a vezrln jobb
egrgombbal trtn kattintsra jelenik
meg
DrawMode A TabControl megrajzolsi mdjt
vezrli
Enabled azt jelzi, hogy a TabControl
engedlyezett, vagy nem
HotTrack megmutatja, hogy a fejlcelemek
vizulisan megvltozzanak-e, amikor az
egrmutat fljk r

189/312
ItemSize Meghatrozza a vezrl al-ablakainak
mrett
MultiLine Meghatrozza, hogy csak egy, vagy
vagy tbb fl is lehet a vezrln bell
Padding meghatrozza, hogy ,mennyi extra hely
legyen a vezrl flei krl
ShowToolTips Meghatrozza, hogy ltszdnak-e a
lapokhoz tartoz ToolTip-ek.
SizeMode az egyes lapok mretezsi mdjt lltja
be
TabIndex az elem helyt adja meg a TAB
sorrendben
TabStop megmutatja, hogy az elem
kivlaszthat-e a TAB billenty
hasznlatval
Visible a vezrl lthat vagy nem

Adat

Tag: Teszleges clokra hasznlhat egsz rtk mez

Tervezs

Name A vezrl neve


DrawGrid megmutatja, hogy a pozcionl rcs
kirajzolsra kerljn-e
GridSize meghatrozza a pozcionl rcs
mrett
Locked megmutatja, hogy a vezr
tmretezhet, tmozgathat-e
Modifiers A vezrl lthatsgi szintjt jelli
SnapToGrid Meghatrozza, hogy a vezrlknek
kapcsoldnia kell-e a pozcionl
rcshoz
Anchor Horgony; a vezrl mely szlei
rgztettek az t tartalmaz kontner
szleihez kpest
Dock megmutatja, hogy a vezrl mely szlei
vannak sszekapcsolva az t tartalmaz
elem szlvel
Location Belltja vagy lekrdezi a vezrl bal
fels sarknak az t tartalmaz elem bal
fels sarktl mrt relatv tvolsgt
Size A vezrl mrete pixelben
TabPages A lapok a TabControlban

Esemnyek

Click kattintshoz ktd esemny


DoubleClick Dupla kattintshoz kapcsold esemny

190/312
DrawItem akkor kvetkezik be, amikoregy
bizonyos elemet vagy terletet meg kell
rajzolni
HelpRequested A felhasznl segtsget kr a vezrlrl
SelectedIndexChanged akkor kvetkezik be, amikor a
ComboBox SelectedIndex tulajdonsga
megvltozik, azaz jabb elem kerl
kijellsre
StyleChanged jelzi, ha megvltozott a vezrl stlusa
SystemColorsChanged bekvetkezik, amikor a rendszersznek
megvltoznak

A kvetkez esemnyek mindegyike egy tulajdonsg megvltozst jelzik:

BackColorChanged httrszn
ContextMenuChanged helyzetrzkeny men
CursorChanged kurzor
DockChanged igazts
EnabledChanged engedlyezettsgi llapot
FontChanged bettpus
LocationChanged helyzet (Lsd Location)
ParentChanged szl
SizeChanged mret
TabIndexChanged tab-sorrendbeli hely
TabStopChanged TAB-bal trtn kivlaszthatsg
VisibleChanged vizulis lthatsg

DateTimePicker komponens

A DateTimePicker komponens segtsgvel egyszeren krhetnk be vagy rhatunk


ki dtumot, idt. Kt rszbl ll: egy szvegbeviteli doboz, mely a dtumot/idt
tartalmazza szveges formban, s egy lenyl naptr, mely megegyezik a
MonthCalendar komponens kinzetvel s hasznlatval.

191/312
A lenyl naptr helyett hasznlhatjuk a komponenst grgetkkel is (a lenyit gomb
helyett fel-le gombok jelennek meg) a ShowUpDown tulajdonsg igazra lltsval.
Bellthatunk kt dtumot (minimum s maximum), melyek hatrt szabhatnak a
bevitelre, ezeknl kisebb vagy nagyobb dtumot nem lehet berni.
A kvnt rtkeket ngyfle formtumban kpes a komponens megjelenteni:
Hossz dtum (v, hnap neve, nap)
Rvid dtum (v, hnap szma, nap)
Id (ra, perc, msodperc)
Egyni (custom)

Tulajdonsgok:

CalendarFont A megjelen naptr bettpusa


CalendarForeColor ~ betszne
CalendarMonthBackground ~ httrszne
CalendarTitleBackColor ~ cmsv httrszn
CalendarTitleForeColor ~ cmsv betszn
CalendarTrailingForeColor ~ megelz s kvet hnap napjainak szne
Checked Ha a ShowCheckBox tulajdonsg rtke true,
ellenrizhet, hogy a felhasznl vlasztott-e rtket
False
CustomFormat Egyni formtum-string dtum s/vagy id kirshoz
DropDownAlign Belltja, hogy a lenyl hnap-naptr a
komponenshez hogyan legyen igaztva
Left vagy Right
Format A komponensben szerepl dtum/id formtuma.
Vlaszthatunk a beptett formtumok kzl vagy
lehet egyedi
Long/Short/Time/Custom
MaxDate A legksbbi berhat dtum
MinDate A legkorbbi berhat dtum
ShowCheckBox Meghatrozza, hogy szerepeljen-e egy jellngyzet
a komponensen. Amg a jellngyzet nincs

192/312
kijellve, addig nem volt rtk kivlasztva.
False
ShowUpDown A lenyl naptr helyett a kivlasztott dtumot/idt
egy fel-le grgetvel vltoztathatjuk (spinner)
False
Value Az aktulis dtum/id

Esemnyek:

CloseUp Bekvetkezik, ha a felhasznl a lenyl naptrbl


kivlasztott egy dtumot
DropDown Bekvetkezik, ha a naptr lenylik
ValueChanged Bekvetkezik, ha a komponens rtke megvltozik

rtk bersa s kiolvassa

A komponensben kivlasztott rtket a Value tulajdonsg tartalmazza.


Alaprtelmezsben ez az rtk az aktulis dtumot/idt tartalmazza. Az rtk
bellthat szerkesztskor vagy futsidben is, pl. a komponenst tartalmaz form
megjelentsekor.
A komponens egy DateTime rtket ad vissza, vagy kaphat.

Tulajdonsgok dtumban:

Year (v), Month (hnap), Day (nap) tulajdonsgok egsz szmokat adnak vissza.
DayOfWeek tulajdonsg a ht egy napjnak nevt adja vissza (Monday, , Sunday)
Tulajdonsgok idben:
Hour (ra), Minute (perc), Second (msodperc) s Millisecond (ezredmsodperc)
tulajdonsgok egsz szmot adnak vissza.

rtkads:

DateTimePicker1.Value = new DateTime(2004, 9, 16);

rtk kiolvassa:

this.lblDatum.Text = DateTimePicker1.Value.ToString();

Egyni formtum-string:

lltsuk a Format tulajdonsgot Custom-ra. A formtum-stringben az albbiak


hasznlhatk:
D Egy vagy ktjegy nap szma
Dd Ktjegy nap. Ha csak egyjegy, kiegszl egy
megelz nullval
Ddd Nap neve hrom bets rvidtssel
Dddd Nap teljes neve
Hh Ktszmjegy ra, 12 rs brzols

193/312
H Egy vagy ktszmjegy ra, 24 rs brzols
HH Ktszmjegy ra, 24 rs brzols
M Egy vagy ktszmjegy perc
Mm Ktjegy perc. Ha csak egyjegy, kiegszl egy
megelz nullval
M Egy vagy ktszmjegy hnap
MM Ktszmjegy hnap, nulls kiegszts
MMM Hnap neve hrom bets rvidtssel
MMMM Hnap teljes neve
S Egy vagy ktszmjegy msodperc
Ss Ktszmjegy msodperc, nulls kiegszts
T Egy bets AM/PM kijelzs (dleltt/dlutn)
Tt Kt bets AM/PM kijelzs
Y Egy szmjegy v (2001 megjelentse: 1)
Yy Kt szmjegy v (2001 megjelentse: 01)
Yyyy Teljes v kirsa (2001 megjelentse: 2001)

A formtum-stringben szerepelhetnek mg sajt jelek, betk, akr szveg is. Ha nem


szerepeltetnk benne a fenti karakterekbl, akkor csak be kell rni. Ha a fenti betk
valamelyikt szeretnnk, akkor kt aposztrf kz kell rni, pl.:hh:mm  11:23
hhdmm  11d23

Angol stlus dtum-formtum:

public void EgyeniDatumFormatum()


{
dateTimePicker1.Format = DateTimePickerFormat.Custom;
dateTimePicker1.CustomFormat = "MMMM dd, yyyy - dddd";
}

A DateTimePicker becsukott llapotban:

MonthCalendar komponens

A MonthCalendar komponens egy grafikus felletet nyjt a felhasznlknak, hogy


lekrdezzk s mdostsk a dtumot. A komponens egy naptrat jelent meg. Egy
rcshl tartalmazza a hnap szmozott napjait, oszloponknt rendezve a ht
napjaihoz (htf-vasrnap). A komponensen kijellhetnk tbb dtumot is
(megadhat szm). Lehet a dtumok kztt lpkedni - hnapos lpsekben - a
komponens cmsvjban szerepl bal vagy jobb nylra kattintva. Ellenttben a
hasonl DateTimePicker komponenssel, ebben a komponensben tbb dtumot is
kijellhetnk.

194/312
A komponens kinzete vltoztathat. Alaprtelmezs szerint az aktulis nap a
naptrban pirossal be van karikzva, s fel van tntetve a rcs alatt is. A rcs mellett
megjelenthetjk a hetek szmait is. Egy tulajdonsg megvltoztatsval akr tbb
naptr is lehet egyms mellett vagy alatt. A ht kezd napja is megvltoztathat:
Angliban a ht vasrnappal kezddik, nlunk htfvel.
Bizonyos dtumokat megjellhetnk flkvr rsmddal, kiemelve ket a tbbi kzl
(fontos dtumok). Ezek lehetnek egyedi dtumok, venknti vagy havi dtumok.

Tulajdonsgok (properties):

AnnuallyBoldedDates Tartalma az venknt elfordul fontos dtumok


DateTime[] tmb
BoldedDates Tartalma az egyedi fontos dtumok
DateTime[] tmb
CalendarDimensions A naptrak szma a komponensen bell (oszlop s
sor)
Alaprtelmezs:
Width=1; Height=1
FirstDayOfWeek A ht kezd napja
Alaprtelmezs: Default, ilyenkor a rendszertl krdezi
le a terleti belltsokat
rtknek adhatjuk neki a ht napjainak nevt angolul
(Monday, )
MaxDate Itt lltjuk be az elrhet legksbbi dtumot a
naptrban
Alaprtelmezs: 9998.12.31.
MaxSelectionCount A naptrban kijellhet napok maximlis szma
Alaprtelmezs: 7
MinDate Itt lltjuk be az elrhet legkorbbi dtumot a
naptrban
Alaprtelmezs: 1753.01.01.
MonthlyBoldedDates Tartalma a havonta elfordul fontos dtumok

195/312
DateTime[] tmb
ScrollChange Ez a vltoz lltja be, hogy a komponens elre s
vissza gombjaival hny hnapot lpjen a naptr
Alaprtelmezs: 0 (a kvetkez/elz hnapra lptet)
SelectionRange A komponensben kijellt napok intervalluma
Alaprtelmezs: mindkt rtk az aktulis dtumot
tartalmazza
ShowToday Belltja, hogy lthat-e az aktulis dtum a
komponens aljn
Alaprtelmezs: True
ShowTodayCircle Belltja, hogy a komponens bekarikzza-e az aktulis
napot a naptrban
Alaprtelmezs: True
ShowWeekNumbers Belltja, hogy a komponensen a napok sorai eltt
ltszik-e a ht sorszma (1-52)
Alaprtelmezs: False
TitleBackColor A komponens cmsvjnak httrszne
Alaprtelmezs: Kk
TitleForeColor A komponens cmsvjn megjelen betk szne
Alaprtelmezs: Fehr
TodayDate Az aktulis dtum
Pl.: 2004.05.06.
TrailingForeColor Belltja a naptrban megjelen elz s kvetkez
hnapbl belg napok sznt
Alaprtelmezs: Szrke

Esemnyek (events)

DateChanged Akkor kvetkezik be, ha megvltozik a kijellt dtumok


intervalluma vagy elz/kvetkez hnapra mozdul a
naptr
DateSelected Akkor kvetkezik be, ha a felhasznl kijell egy vagy
tbb dtumot

Kiemelt dtumok kezelse


Fontosabb dtumokat flkvr bettpussal, kiemelten szerepeltethetnk a
naptrban. Hrom tulajdonsg (BoldedDates, AnnuallyBoldedDates s
MonthlyBoldedDates) trolhatja ezeket az egyedi, havonta vagy vente elfordul
dtumokat. Ezek a tulajdonsgok tartalmaznak egy tmbt, mely DateTime
objektumokbl ll. Hogyan lehet hozzadni vagy elvenni ezek kzl?

Dtum hozzads:

1. Hozzunk ltre DateTime objektumot:

DateTime NyariSzunetKezdete = new DateTime(2004, 7, 1);


DateTime NyariSzunetVege = new DateTime(2004, 9, 13);

196/312
2. A dtum kiemelse a komponenshez (komponens pldnyhoz) hozzadssal:
(Hrom parancs: AddBoldedDate, AddAnnuallyBoldedDate, AddMonthlyBoldedDate)
monthCalendar1.AddBoldedDate(NyariSzunetKezdete);
monthCalendar1.AddBoldedDate(NyariSzunetVege);

vagy
Eszerre tbb fontos dtum ltrehozsa s komponenshez trstsa:
DateTime[] Vakaciok = {NyariSzunetKezdete, NyariSzunetVege};
monthCalendar1.BoldedDates = Vakaciok;

Dtumok visszalltsa (flkvr szeds megszntetse):


monthCalendar1.RemoveBoldedDate(NyariSzunetKezdete);

(Hasznlhat mg a RemoveMonthlyBoldedDate s RemoveAnnuallyBoldedDate


parancs is)
Az sszes kiemelt dtum trlse:
monthCalendar1.RemoveAllBoldedDates();
monthCalendar1.RemoveAllAnnuallyBoldedDates();
monthCalendar1.RemoveAllMonthlyBoldedDates();

HorizontalScrollBar s VerticalScrollBar komponensek

A ScrollBar komponensek segtenek sok elemen t vagy nagy mennyisg


informciban keresni vzszintes vagy fggleges grgetssel.

A ScrollBar komponensek nem ugyanazok, mint az egyb komponensekben


(textbox, stb.) lv, beptett grgetk.
A komponensek Value rtke trolja, hogy hol helyezkedik el a grgetdoboz
(pozcijelz).

197/312
A ScrollBar komponensek a Scroll esemnyt hasznljk a pozcijelz mozgsnak
figyelsre. Ennek a segtsgvel folyamatosan krhet le a komponens Value
rtke, mikzben a pozcijelzt mozgatjuk.

Tulajdonsgok:
LargeChange A grget rtknek vltozsa, amikor a
grgetcsszkn kattint a felhasznl, vagy megnyomja
a PgUp/PgDn gombok valamelyikt
Alap: 10
Maximum A pozcijelz maximlis helye
Alap: 100
Minimum A pozcijelz minimlis helye
Alap: 0
SmallChange A pozcijelz elmozdulsa, amikor a felhasznl az
als-fels vagy bal-jobb gombok valamelyikre kattint,
vagy a nylbillentyket megnyomja
Alap: 1
Value A pozcijelz helye
Alap: 0

Esemnyek:
Scroll Bekvetkezik, ha az llapotjelz elmozdul

A Value rtke egsz szm, mely kezdetben 0, s meghatrozza a pozcijelz


elhelyezkedst a grgetcsszkn. Ha minimlis az rtk, akkor a pozcijelz a
csszka bal szln (vzszintes grget) vagy tetejn (fggleges grget) van; ha
maximlis, akkor jobb szlen ill. alul van. Hasonlan, ha a Value a minimlis s
maximlis rtkek szmtani kzepe, akkor a csszka kzepn van. A Value rtke
csak a Minimum s Maximum ltal megadott intervallumban lehet.
A pozcijelz mozgatsa nemcsak az irnyokra kattintssal lehetsges, hanem a
pozcijelz ms helyre hzsval is trtnhet.

LargeChange
Ha a felhasznl lenyomja a PageUp vagy PageDown gombok valamelyikt, vagy a
grgetsvon kattint a pozcijelz valamelyik oldaln, gy a Value rtk a
LargeChange rtk szerint vltozik.

SmallChange
A nylbillentyk megnyomsakor, vagy a grget irnygombjainak megnyomsakor a
Value rtk a SmallChange rtk szerint vltozik.

198/312
Plda: vzszintes ScrollBar ltrehozsa s formhoz rendelse:

private void InitializeMyScrollBar()


{
// HScrollBar ltrehozsa s alapllapotba lltsa.
HScrollBar hScrollBar1 = new HScrollBar();

// A grgett a form aljhoz igaztjuk.


hScrollBar1.Dock = DockStyle.Bottom;

// A grget hozzadsa a form vezrlihez.


this.Controls.Add(hScrollBar1);
}

Listbox

Egy listablak lehetv teszi a felhasznl ltal megadott adatok kivlasztst a


listbl.

SelectionMode: a ListBox adatait jellheti ki a felhasznl, akr egyszerre tbb


adatot is, a megfelel belltsokkal. Ngy lehetsges bellts ltezik:
- None:
- One: egyszerre egy adatot vlaszthatok ki a ListBoxbl, ha az egrrel a
ListBoxra kattintok vagy kijellhetek a fel-, le-, balra- s jobbra-nyl
billentykkel. A One bellts az alaprtelmezett.
- MultiSimple: itt tbb adatot is kivlaszthatunk egyszerre, ha az egrrel a
ListBox elemeire kattintok illetve ha a Space billentyt nyomva tartjuk.

199/312
- MultiExtended: tbb adatot is kivlaszthatok ha a Shift billentyt nyomva
tartom illetve az egr gomjt lenyomva tartom, s a fentebb emltett
billentykkel le-fl mozgunk.

HorizontalScrollBar: a grgetket adhatjuk meg, ha a HorizontalScrollBar rtke true


akkor ltszanak a grgetk, ha false akkor nem ltszanak, a false az alaprtelmezett
bellts. Ha a ListBox magassga nagyobb vagy egyenl mint a ListBox adatainak
magassga, akkor nem ltszik a grget, hiba true a HorizontalScrollBar rtke.

Panel

Vannak olyan komponensek, amelyek kpesek ms komponensek trolsra. Ilyen


tulajdonsggal rendelkez komponens a Panel. A Panel komponenshez az
elemeket a tervezsi id alatt adjuk hozz (pdul megterveznk egy eszkzsort).
Amikor egy komponenst elhelyeznk a Panelen, akkor ltrejn egy j szl-gyermek
kapcsolat a komponens s a Panel kztt. Ha a tervezsi id alatt valamilyen
mveletet vgznk a Panellel (mozgats, msols, trls stb.),
akkor az rinti a trolt komponenseket is.

A komponensek csoportba foglalshoz elszr adjuk az alkalmazsunk Formjhoz


a Panelt. A Panel komponens kijellse utn a szoksos mdon elhelyezhetjk
benne a komponenseket.

Enadbled:
Ha a Panel Enabled property-je false-ra, inaktvra van lltva akkor a Panel
komponensei is inaktvak lesznek. Ilyenkor a menelem szrke sznnel kerl
kijelzsre s nem vlaszthat ki.

Panel.Enabled=false;

200/312
Pldul ha egy gomb Enabled tulajdonsgt inaktvra lltjuk akkor nem tudunk a
gombra kattintani.

Button.Enabled=false;

BorderStyle:
A Panel BorderSytle property-nl hrom bellts kzl vlaszhatunk:
- None: a Panel nem klnbztethet meg a Formtl, ez az alapbelts (a default)
is.
- FixedSingle: a Panel krl jl lthat keretet kapunk

panel1.BorderStyle = System.Windows.Forms.BoderStyle.FixedSingle;

- Fixed3d: a Panel jl elklnthet a Formtl

panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;

PictureBox

Ha kpeket szeretnnk megjelenteni alkalmazsunk Form-jn, akkor ennek


legegyszerbb mdja a PictureBox komponens hasznlata.
Miutn feltettk a Form-ra a PictureBox komponenst, az Image property-jre kattintva
kivlaszthatunk egy Bmp, Gif, Jpg, Ico, Emf vagy Wmf formtum kpet, melyet
betlthetnk, megjelenthetnk a PictureBox terletn.

Image:

Az Image property-n keresztl rendelhetnk kpet a kontrolhoz, illetve rhetjk el


Image tpusknt. Fontos tudnunk, hogy az gy betlttt kp bekerl a ksztend EXE
llomnyba, gy programunk szlltsakor elegend azt vinni, a kp llomnyt nem
kell.

MyImage = new Bitmap(fileToDisplay);


pictureBox1.Image = (Image) MyImage ;

Sizemode:

A PictureBoxSizeMode tpus Sizemode property-n keresztl szablyozhatjuk, hogy


miknt jelenjen meg a betlttt kp.
A PictureBoxSizeMode felsorolt tpus a kvetkez elemeket tartalmazza:
- AutoSize: a komponens mrete akkora lesz, mint a betlttt kp

pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;

- StretchImage: a kp mrete akkora lesz, mint amekkora a komponens

201/312
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;

- CenterImage: a betlttt kp a komponens terletnek kzepre igazodva jelenik


meg

pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;

- Normal: alaphelyzet, ilyenkor a kp a komponens bal fels sarkhoz lesz igaztva

pictureBox1.SizeMode = PictureBoxSizeMode.Normal;

SizeModeChanged:

Amikor a SizeMode property rtke megvltozik, akkor kerl aktivizlsra a


SizeModeChanged esemny.

ClientSize: A betlttt kp mreteit llthatjuk be, a Size.Width s Size.Height


property-kel adhatjuk meg a kp szlessgt s magassgt.

pictureBox1.ClientSize = New Size(xSize, ySize);

Timer komponens

A timer komponens egy esemnyt idz el rendszeres idkznknt.

Az idtartam az Interval tulajdonsgban van megadva ezredmsodpercben. Ha a


timer engedlyezve van, a Tick esemny minden egyes alkalommal bekvetkezik, ha
eltelt a megadott intervallum. A timer-t elindthatjuk vagy lellthatjuk. Ha
megszaktjuk, visszall alaphelyzetbe. Nincs lehetsg a timer szneteltetsre.

Tulajdonsgok:
(Name) A timer neve
Enabled A timer engedlyezve van-e
Alaprtelmezs: False
Interval Esemnyek idztse ezredmsodpercben megadva
Alaprtelmezs: 100

Esemnyek:
Tick A megadott idintervallum elteltvel kvetkezik be

202/312
Timer kezelse
Lehetsg van a timer lelltsra s elindtsra az albbi kt paranccsal:

timer1.Start();
timer1.Stop();

vagy ms mdon, az Enabled tulajdonsg igazra/hamisra lltsval.


Az idnknt kvnt esemnyeket a Tick esemnybe kell belerni. Itt llhat tbbsornyi
programkd vagy egy egyszer metdushvs is.Pldul egy egyszer ra Label
komponensbl:

private void timer1_Tick(object sender, System.EventArgs e)


{
this.lblOra.Text = "Id:"+
Convert.ToString(System.DateTime.Now.Hour)+
":"+Convert.ToString(System.DateTime.Now.Minute)+
":"+Convert.ToString(System.DateTime.Now.Second);
//egyszerbben, dtummal:
//this.lblOra.Text = Convert.ToString( System.DateTime.Now );

Az Interval hatrai:

A vltoz rtke 1 s 64767 kz eshet, teht a leghosszabb intervallum is alig


hosszabb egy percnl.Nincs garantlva, hogy a megadott intervallum pontosan telik
el. Hogy a pontossgot biztostsuk, a timer-nek idnknt ellenriznie kell a
rendszerrt.A rendszer 18 ratst generl msodpercenknt. gy - mg akkor is,
ha az Interval tulajdonsg ezredmsodpercben szmoland - a leggyorsabb
temezs csak a msodperc 18-ad rsze lehet.

NumericUpDown

Megjegyzs

A NumericUpDown ellenrzs egyetlen numerikus rtket tartalmaz, amely


nvelhet vagy cskkenthet az ellenrzs fel vagy le billentyjre val kattintsval.
A hasznl be is lphet egy rtkbe, de csak akkor, ha a ReadOnly tulajdonsg
igazra van lltva.

203/312
A numerikus kijelz alakthat a DecimalPlaces, Hexadecimal vagy a
ThousandsSeperator tulajdonsgok belltsval. Az ellenrzsben trtn
hexadecimlis rtkek belltsakor, lltsa a Hexadecimal tulajdonsgot true-ra.
ThousandsSeperator bemutatsakor decimlis szmokban, amikor lehetsges,
lltsa be a ThousandsSeperator tulajdonsgot true-ra. Pontosabban meghatrozva
a decimal symbol utn bemutatott szmok mennyisgt lltsa be a DecimalPlaces
tulajdonsgot a decimlis helyek szmhoz.
Rszletezve a megengedett rtkek sort az ellenrzs miatt, lltsa be a Minimum
s Maximum tulajdonsgokat. lltsa be az Increment rtket, hogy meghatrozza a
Value tulajdonsg cskken vagy nvekv rtkt, amikor a felhasznl a fel vagy le
nylra kattint.
Amikor meghvja az UpButton vagy DownButton metdusokat kddal vagy a fel vagy
le gombra kattintssal, az j rtket jvhagyja, s az ellenrzs fellrdik az j
rtk megfelel formtumval. Klnsen, ha UserEdit true-ra van lltva,
ParseEditText-et elzleg meghvja az rtk fellrsa s jvhagysa rdekben.
Az rtket leellenrzi, hogy Minimum s Maximum rtkek kztt legyen, majd
meghvja az UpdateEditText metdust.

A Value tulajdonsg nvelse vagy cskkentse akkor trtnik, amikor rkattintunk a


fel vagy le nyilakra a fel-le ellenrzsnl. A hinyrtk 1.

Kivtel

Kivteles tpus Felttel

ArgumentException A kijellt rtk nem pozitv.

True, a hasznl megvltoztatta a Text tulajdonsgot, msfell false.

Ha a Text tulajdonsg be van lltva, mg a UserEdit tulajdonsg true-ra van lltva,


akkor meghvja az UpdateEditText metdust. Ha a Text tulajdonsg be van lltva,

204/312
mg a UserEdit tulajdonsg false-ra van lltva, akkor a ValidateEditText metdust
hvja meg.

ProgressBar

A Value Displayed belltsa a Windows Forms ProgressBar Control ltal


A NET Framework szmos klnbz mdot nyjt bemutatni egy adott rtket a
ProgressBar Control-on bell. Kzelebb visz a dntshez, mely a kznl lev
feladattl, illetve a megoldand problmtl fgg.

 Kzvetlenl lltsa be a ProgressBar Control rtkt. Ez a megkzelts


hasznos azokhoz a feladatokhoz, ahol ismeri a kimrt adatok egszt, mintha
lemezt olvasna egy adatforrsrl. Radsul, ha az rtket csak egyszer vagy
ktszer kell belltani, ez egy knny mdja a megoldsnak. Vgl, hasznlja
ezt az eljrst, ha szksges cskkenteni a ProgressBar ltal megadott
rtket.

 Nvelje a ProgressBar mutatt egy meghatrozott rtkkel. Ez a megkzelts


hasznos, amikor egy egyszer vgsszeget mutat a Minimum s a Maximum
kztt, gy, mint az eltelt idt, vagy a fjlok szmt, amelyet mr feldolgozott
egy ismert vgsszegbl.

 Nvelje a ProgressBar mutatt egy rtkkel, amely vltozik. Ez a


megkzelts akkor hasznos, amikor a megadott rtket klnbz
sszegekben ki kell cserlni.

A ProgressBar rtknek kzvetlen belltsa

A legkzvetlenebb t a bemutatott rtk belltsra a ProgressBar ltal, az rtk


tulajdonsgnak a belltsa. Ezt megteheti tervezett vagy szoksos idben is.
A ProgressBar rtknek kzvetlen belltsa

205/312
1. lltsa be a ProgressBar ellenrzst Minimum s Maximum rtkre.
2. A kdban, lltsa be az ellenrzs kdjnak tulajdonsgt egy integerre a
Minimum s a Maximum rtkek kztt, amelyet mr megadott.

Ha belltotta az rtk tulajdonsgt a Minimum s a Maximum ltal meghatrozott


hatrokon bell, az ellenrzs kiad egy ArqumentException kivtelt.

A ProgressBar rtknek nvelse egy kijellt intervallum ltal

Ha haladst mutat, amely egy meghatrozott intervallumbl ered, bellthatja az


rtket, aztn meghv egy metdust, amely nveli a ProgressBar Control rtkt az
intervallum ltal. Ez hasznos az idztk s ms szvegknyvek szmra, ahol a
haladst nem az egsz szzalkaknt mrik.

1. lltsa be ProgressBar ellenrzst Minimum s Maximum rtkre.


2. lltsa be az ellenrzs Step tulajdonsgt egy egszre, brzolva ezzel a
ProgressBar bemutatott rtknek nvekedst.
3. Hvja meg a PerformStep metdust, hogy megvltoztassa a bemutatott rtket
a Step tulajdonsgban belltott mennyisgnek megfelelen.

A ProgressBar rtknek nvelse vltoz mennyisggel

Vgl nvelheti a ProgressBar ltal bemutatott rtket gy, hogy minden egyes
nvels pratlan rtk legyen. Ez hasznos, amikor betartja a pratlan mveletek
sorozatnak tvonalt gy, mint klnbz mret fjlok rsakor a merevlemezre
vagy a halads az egsz szzalkaknt val mrsekor.

A ProgressBar nvelse egy dinamikai rtk segtsgvel

1. lltsa be a ProgressBar ellenrzst Minimum s Maximum rtkre.


2. Hvja meg az Increment metdust, annak rdekben, hogy megvltoztassa az
egsz ltal meghatrozott rtket.

TrackBar ellenrzs

A TrackBar egy ablak, amely egy slider-t s tetszleges mrtk jeleket tartalmaz.
Amikor a felhasznl mozgatja a slider-t, akr egeret, akr billentyzetet hasznlva,
a TrackBar zenetekben kzli a vltozst.

A TrackBar akkor hasznos, amikor azt szeretnnk, hogy a felhasznl rangsorolja


dntst egyedi rtk vagy egymst kvet rtkek vlasztsa kztt. Pldul,
hasznlhatja a TrackBar-t megengedve a felhasznlnak a billentyzet ismtlsnek
foknak belltst azltal, hogy a slider-t egy megadott jelhez mozgatja.

A slider egy TrackBar-ban akkor n a meghatrozott mrtkben, amikor a


felhasznl lltja be azt. Az rtkek ebben a sorrendben logical units-knt fordulnak
el. Pldul, ha pontostja, hogy a logical units-nak kell, hogy legyen 0-5 terjed
sorrendje, akkor a slider csak hat pozcit foglalhat el: egy pozci a TrackBar bal
oldaln s egy pozci minden egyes nvekvsre sorrendben. Tipikusan minden
egyes pozcit ezek kzl egy jellel azonost.

206/312
Ltrehozhatunk egy TrackBar-t a CreateWindowEx funkci hasznlatval, pontostva
a TrackBar Class ablak osztlyt. Miutn ltrehoztuk a TrackBar-t, hasznlhatjuk
TrackBar zeneteket belltani s helyrehozni nhny tulajdonsgot. A vltozsok,
amelyeket belltottunk okozott tartalmazzk a Minimum s Maximum pozcik
belltst a slider szmra, jeleket rajzolva, belltva a vlasztsok sorrendjt s
jrapozcionlja a slider-t.

A TrackBar egy kacskaring ellenrzs a ScrollBar ellenrzshez hasonlan.


Alakthatjuk a sorrendet a Minimum tulajdonsg belltsval a sorrend alacsonyabb
vgnek pontostsval s a Maximum tulajdonsgot a sorrend magasabb vgnek
pontostsval.

A LargeChange tulajdonsg definilja a nvekedst hozzadva vagy kivonva a Value


tulajdonsgbl, amikor kvetkezre kattint a slider egyik oldaln. A TrackBar
bemutathat vzszintesen s fgglegesen is.

Hasznlhatjuk ezt az ellenrzst numerikus adat betltsekor a Value tulajdonsgon


keresztl. Bejtszhatjuk ezt az adatot egy ellenrzsben vagy kd hasznlatval.

LargeChange tulajdonsg
Adjon meg vagy lltson be egy rtket hozzadva vagy kivonva a Value
tulajdonsgbl, amikor a scroll boksz nagyobb tvolsgban mozdul el.

Kivteles tpus Felttel


Exception A megjellt rtk kevesebb, mint nulla

Amikor a felhasznl a PAGE UP vagy PAGE DOWN gombokat hasznlja, vagy a


TrackBar-ra kattint a slider egyik oldaln, a Value tulajdonsg a LargeChange
tulajdonsgban belltott rtk szerint vltozik. Figyelembe kell venni a LargeChange
tulajdonsg belltst a magassg vagy a szlessg rtkek szzalkaknt. Ez
megtartja a tvolsgot, hogy a TrackBar megfelelen vltozzon mrethez kpest.

HelpProvider

HelpProvider minden krelme karbantartja a hozzkapcsold komponensek


referenciit. Ahhoz, hogy sszekapcsoljuk a Help fjlt a HelpProvider objektummal,
be kell lltani a HelpNamespace tulajdonsgot. Ekkor meghatrozunk egy tpust,
amit SetHelpNavigator-nak neveznek s hozzadjuk a HelpNavigator rtket a
specifiklt komponenshez. Hozzadhatunk egy kulcsszt a segtsghez a
SetHelpKeyword-el.

Ahhoz, hogy hozzadjunk egy jellegzetes Help stringet a komponenshez, hasznljuk


a SetHelpString metdust. Ez a string ettl kezdden egy pop-up menben fog

207/312
felvillanni, amikor a felhasznl rkattint az F1 billentyre, persze csak akkor, ha a
fkuszt az a komponens birtokolja amelyikrl segtsget akar kapni a felhasznl.
Ha a HelpNamespace nincs mg belltva, akkor a SetHelpString-et kell hsznlnod,
hogy Help szveget adhassunk. Ha mr belltottad a HelpNamespace-t s a Help
string-et, akkor a Help HelpNamespace-ben van s elsbsggel rebdelkezik.

Minta plda
A bemutatand plda demonstrlja, hogy a HelpProvider osztly, hogyan jelenti
meg a context-sensitive segtsget a formon, ami ngy cm mezt tartalmaz. A plda
a SetHelpString-et hasznlja, hogy belltsa a segtsgnyujt ToolTip szveget.
Amikor a context-sensitive Help gombot (vagyis a kis krdjelet a jobb fels
sarokban) hasznljuk s rklikkeljk a Help kurzort a cm mezre, akkor a ToolTip
szveg megjelenti a hozz fztt szveget. Amikor a fkusz valamelyik cm mezn
van s megnyomjuk az F1 billentyt, akkor az mspaint.chm Help fjl kirdik, mert a
HelpNamespace tulajdonsg az mspaint.chm-re van belltva. A HelpProvider.
SetShowHelp metdusa minden cm komponenshez hozz van rendelve, hogy
azonostsa, hogy a Help tartalom elrhet.

using System;
using System.Drawing;
using System.Windows.Forms;

public class Form1 : System.Windows.Forms.Form


{
private System.Windows.Forms.TextBox addressTextBox;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox cityTextBox;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.TextBox stateTextBox;
private System.Windows.Forms.TextBox zipTextBox;
private System.Windows.Forms.HelpProvider helpProvider1;
private System.Windows.Forms.Label helpLabel;

[STAThread]
static void Main()
{
Application.Run(new Form1());
}

public Form1()
{
this.addressTextBox = new System.Windows.Forms.TextBox();
this.helpLabel = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();

208/312
this.cityTextBox = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.stateTextBox = new System.Windows.Forms.TextBox();
this.zipTextBox = new System.Windows.Forms.TextBox();

// Help Label
this.helpLabel.BorderStyle =
System.Windows.Forms.BorderStyle.Fixed3D;
this.helpLabel.Location = new System.Drawing.Point(8, 80);
this.helpLabel.Size = new System.Drawing.Size(272, 72);
this.helpLabel.Text = "Click the Help button in the title bar, then
click a control " +
"to see a Help tooltip for the control. Click on a control and
press F1 to invoke " +
"the Help system with a sample Help file.";

// Address Label
this.label2.Location = new System.Drawing.Point(16, 8);
this.label2.Size = new System.Drawing.Size(100, 16);
this.label2.Text = "Address:";

// Comma Label
this.label3.Location = new System.Drawing.Point(136, 56);
this.label3.Size = new System.Drawing.Size(16, 16);
this.label3.Text = ",";

// Create the HelpProvider.


this.helpProvider1 = new System.Windows.Forms.HelpProvider();

// Tell the HelpProvider what controls to provide help for, and


// what the help string is.
this.helpProvider1.SetShowHelp(this.addressTextBox, true);
this.helpProvider1.SetHelpString(this.addressTextBox, "Enter the
street address in this text box.");

this.helpProvider1.SetShowHelp(this.cityTextBox, true);
this.helpProvider1.SetHelpString(this.cityTextBox, "Enter the city
here.");

this.helpProvider1.SetShowHelp(this.stateTextBox, true);

209/312
this.helpProvider1.SetHelpString(this.stateTextBox, "Enter the
state in this text box.");

this.helpProvider1.SetShowHelp(this.zipTextBox, true);
this.helpProvider1.SetHelpString(this.zipTextBox, "Enter the zip
code here.");

// Set what the Help file will be for the HelpProvider.


this.helpProvider1.HelpNamespace = "mspaint.chm";

// Sets properties for the different address fields.

// Address TextBox
this.addressTextBox.Location = new System.Drawing.Point(16, 24);
this.addressTextBox.Size = new System.Drawing.Size(264, 20);
this.addressTextBox.TabIndex = 0;
this.addressTextBox.Text = "";

// City TextBox
this.cityTextBox.Location = new System.Drawing.Point(16, 48);
this.cityTextBox.Size = new System.Drawing.Size(120, 20);
this.cityTextBox.TabIndex = 3;
this.cityTextBox.Text = "";

// State TextBox
this.stateTextBox.Location = new System.Drawing.Point(152, 48);
this.stateTextBox.MaxLength = 2;
this.stateTextBox.Size = new System.Drawing.Size(32, 20);
this.stateTextBox.TabIndex = 5;
this.stateTextBox.Text = "";

// Zip TextBox
this.zipTextBox.Location = new System.Drawing.Point(192, 48);
this.zipTextBox.Size = new System.Drawing.Size(88, 20);
this.zipTextBox.TabIndex = 6;
this.zipTextBox.Text = "";

// Add the controls to the form.


this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.zipTextBox, this.stateTextBox,
this.label3, this.cityTextBox,

210/312
this.label2, this.helpLabel,
this.addressTextBox});

// Set the form to look like a dialog, and show the HelpButton.
this.FormBorderStyle =
System.Windows.Forms.FormBorderStyle.FixedDialog;
this.HelpButton = true;
this.MaximizeBox = false;
this.MinimizeBox = false;
this.ClientSize = new System.Drawing.Size(292, 160);
this.Text = "Help Provider Demonstration";

}
}

ImageList

Fggvnyeket biztost az Image objektumok gyjtemnynek irnytshoz. Ez az


osztly nem rklhet.

szrevtelek

ImageList-et tipikusan pldul ListView, TreeView, vagy ToolBar-nl szoks


hasznlni. ImageListhez adhatunk bitmaps, ikonokat, vagy meta fjlokat, s a
klnbz komponensek hasznlhatjk azokat, ha ignyk van r.
ImageList hasznl egy fogantyt a kpek listjnak irnytsra. Ez a foganty
Handle mindaddig nem jn ltre, amg bizonyos mveletek, nem hajtdnak vgre,
mint pldul az ImageList feltltse kpekkel.

Plda
A kvetkez plda megmutatja a kijellt kpeket, megvltoztatja, s azutn
megjelenti.

namespace myImageRotator
{
using System;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;

211/312
public class Form1 : System.Windows.Forms.Form
{
protected Container components;
protected ListBox listBox1;
protected Label label2;
protected Label label3;
protected Label label5;
protected PictureBox pictureBox1;
protected Button button1;
protected Button button2;
protected Button button3;
protected Button button4;
protected Panel panel1;
protected ImageList imageList1;
protected Graphics myGraphics;
protected OpenFileDialog openFileDialog1;

private int currentImage = 0;

public Form1()
{
InitializeComponent();
imageList1 = new ImageList () ;
// The default image size is 16 x 16, which sets up a larger
// image size.
imageList1.ImageSize = new Size(255,255);
imageList1.TransparentColor = Color.White;
// Assigns the graphics object to use in the draw options.
myGraphics = Graphics.FromHwnd(panel1.Handle);
}

protected override void Dispose( bool disposing )


{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}

212/312
base.Dispose( disposing );
}

private void InitializeComponent()


{
// kezrtk bellts a listBox1, label2, pictureBox1,
// button2, button3, panel1, openFileDialog1, button4, label1,
// button1, s imageList1-nek.
}

protected void button1_Click (object sender, System.EventArgs e)


{
displayNextImage();
}

protected void button2_Click (object sender, System.EventArgs e)


{
imageList1.Images.RemoveAt(listBox1.SelectedIndex);
listBox1.Items.Remove(listBox1.SelectedIndex);
}

protected void button3_Click (object sender, System.EventArgs e)


{
imageList1.Images.Clear();
}

protected void button4_Click (object sender, System.EventArgs e)


{
openFileDialog1.Multiselect = true ;
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
if (openFileDialog1.FileNames != null)
{
for(int i =0 ; i < openFileDialog1.FileNames.Length ;
i++ )
{
addImage(openFileDialog1.FileNames[i]);
}
}
else
addImage(openFileDialog1.FileName);

213/312
}
}

private void addImage(string imageToLoad)


{
if (imageToLoad != "")
{
imageList1.Images.Add(Image.FromFile(imageToLoad));
listBox1.BeginUpdate();
listBox1.Items.Add(imageToLoad);
listBox1.EndUpdate();
}
}

void displayNextImage()
{
if(imageList1.Images.Empty != true)
{
if(imageList1.Images.Count-1 > currentImage)
{
currentImage++;
}
else
currentImage=0;
panel1.Refresh();
imageList1.Draw(myGraphics,10,10,currentImage);
pictureBox1.Image = imageList1.Images[currentImage];
label3.Text = "Current image is " + currentImage ;
listBox1.SelectedIndex = currentImage;
label5.Text = "Image is " + listBox1.Text ;
}
}

public static void Main(string[] args)


{
Application.Run(new Form1());
}
}
}

214/312
Tulajdonsgok

ColorDepth Belltja a kp lista kpeinek szn


teltettsgt
Contanier Belltja az IContaniert amit a
komponens tartalmaz
Handle Belltja a kp lista objektum bizonyos
fogantyjt
HandleCreated Belltja az rtket ha Win32-es
fogantyt ksztettnk.
Images Itt lehet a kpeket az ImageListhez fzni
ImagesSize Kpmret belltsa
ImageStream Bellthatjuk a fogantyt az
ImageListStreamerhez sszekapcsolva
az aktulis kp listval
Site Belltja az Isitetot a komponenshez
TransparentColor Szinttetszsg belltsa

RichTextBox

Reprezentl egy Windows rich text box komponenst.

szerevtelek:
A RichTextBox komponens megengedi a felhasznlnak, hogy belpjen s
szerkessze a szveget, ami mellett mg tbb, egymstl klnbz formtumot is
engedlyez, mint egy mezei TextBox komponens. A szveget kijellhetjk
kzvetlenl a komponensben, vagy be tlthetjk egy Rich Text Format (RTF) fjlbl,
vagy egy egyszer text fjlbl. A komponensen belli szveg lehet egyszer
karakteres vagy paragraph formtum.

215/312
A RichTextBox komponens ad egy szmot a tulajdonsgairl, amit fel tudsz
hasznlni a komponensen bell, annak brmelyik rszn, a szvegen, hogy
alkalmazhassunk egy formtumot. Ahhoz, hogy megvltoztassuk a szveg
formtumt, elszr ki kell jellni. Csak a kijellt szvegben tudjuk megvltoztatni a
karakter s paragraph formtumot. A SelectionFont tulajdonsg lehetsget biztost
szmunkra, hogy a szveg bold vagy italic legyen. Mg arra is hasznlhatjuk, hogy
meghatrozzuk a mrett vagy a betkpet. SelectionColor tulajdonsggal a szveg
szne llthat be. Gyorslista ksztshez, hasznljuk a SelectionBullet
tulajdonsgot, bellthatjuk a paragraph formtumot a SelectionIndent,
SelectionRightIndent, s SelectionHangingIndent tulajdonsgokkal.
A RichTextBox komponens olyan metdusokat is ad amelyek funkciival tudsz
megnyithatunk vagy menthetnk fjlokat. A LoadFile metdus megengedi, hogy
megfelel RTF vagy ASCII szveget, tartalmaz fjlokat nyissunk meg a
komponensbe. Ezen fell mg olyan fjlokat is meg tudsz nyitni, amiket mr ms
megnyitott velnk egy idben. A SaveFile metdus megengedi, hogy megfelel RTF
vagy ASCII fjl formtumban mentsnk el szvegeket. Hasonl mdon, mint a
LoadFile metdus, a SaveFile metdust is tudjuk arra hasznlni, hogy egy megnyitott
fjlba menthetnk. A RichTextBox komponens olyan lehetsget is ad, hogy
stringeket keressnk a szvegben. A Find metdus is arra is lehetsget biztost,
hogy hasonl stringeket keress a szvegben.
Az is megvalsthat, hogy adatot troljon a memriban.
Ha a komponensen belli szveg tartalmaz egy linket, mondjuk egy web sitera, akkor
hasznlhassuk a DetectUrls tulajdonsgot, hogy megfelelen jelenjen meg a link a
komponens szvegben. Ezutn a LinkClicked eventtel elrhetjk, hogy ez
mkdjn is. A SelectionProtected tulajdonsggal engedlyezhetjk azt, hogy a
szveg a komponensen bell vdve legyen a felhasznlk manipulciival szemben.
Ezzel a levdett szveggel a komponensen bell, hivatkozhatunk a Protected
eventre, amivel kzlhetjk a mezei felhasznlval, hogy ez a szvegrsz szmra
nem mdosthat, ha mdostani akarja.
Alkalmazsokat, amelyeket mr a TextBox komponens is hasznl, knnyen bele
lehet pteni a RichTextBox komponensbe, azonban a RichTextBox komponens nem
tartalmazza a TextBox 64k karakter kapacits limitjt.

Plda:
A bemutatand pldban ksztnk egy RichTextBox komponenst, ami beolvas egy
RTF fjlt, majd megkeresi az els helyet, ahol a "Text" kifelyezs jelen van. Ezutn a
program megvltoztatja a kijellt szvegrsz bet tpust, mrett, sznt, majd
ezekkel a vltoztatsokkal visszamenti az eredeti fjlba. Vgezetl a megoldsban
hozzadja a Form fellethez a RichTextBoxot.

public void CreateMyRichTextBox()


{
RichTextBox richTextBox1 = new RichTextBox();
richTextBox1.Dock = DockStyle.Fill;

richTextBox1.LoadFile("C:\\MyDocument.rtf");
richTextBox1.Find("Text", RichTextBoxFinds.MatchCase);

216/312
richTextBox1.SelectionFont = new Font("Verdana", 12, FontStyle.Bold);
richTextBox1.SelectionColor = Color.Red;

richTextBox1.SaveFile("C:\\MyDocument.rtf",
RichTextBoxStreamType.RichText);

this.Controls.Add(richTextBox1);
}

Nhny fontosabb Tulajdonsg:

Dock Hogy hol helyeszkedjen el a formon bell


AutoSize Automatikusan belltja a komponens
mrett font vltoztats utn
Enabled Meghatrozza, hogy lehet e mdostani
a tartalmt
BackGroundImage Httrkp
BackColor Httr szn
Bounds Nem kliens tartalmnak a mrete
ClientRectangle Annak a tglalapnak a tulajdonsgait
lehet belltani, amit a kliens hasznl
ClientSize A felhasznl ltal hasznlhat terlet
hosszsgt s szlessgt lehet
belltani
ContextMenu Belltja a komponens gyorsindt
menjt
Controls Tartalmazza a komponensen bell
hasznlhat komponenseket
Cursor Az egr mutat kinzete amg a
komponens felett van
HasChildren Belltja a komponenst ha tbb gyermek
szrmazik belle
Height Magassg
Width Szlessg
Left Balrl behzs
Right Jobbrl behzs
Top Fellrl
Bottom Alulrl
Size Mret
Stb.

217/312
ToolTip

Reprezentl egy kis tglalap alak, felbukkan ablakot, ami tmr szvegben kijelzi
annak a dolognak a tulajdonsgt vagy hasznlatt, amire az egrrel
rpozcionlunk.

szrevtelek:

A ToolTip osztly lehetsget ad, hogy segtsnk a felhasznlknak, ha


rpozcionlnak az egrrel egy komponensre. A ToolTip osztlyt tipikusan arra
hasznljk, hogy felhvjk a felhasznlk figyelmt a kontrol hasznlatrl. Pldul,
hozz rendelhetnk egy TextBox komponenshez egy ToolTip szveget, ami
megadhatja a TextBox nevt s tpust, amit oda be lehet rni. sszegezve a
segtsgen fell a ToolTp osztly futskzbeni informciadsra is nagyon jl
hasznlhat. Pldul arra is hasznlhatjuk, hogy kirja a kpernyre a kapcsolat
aktulis sebessgt is vagy az egr fkuszt, mikor a felhasznl azt a PictureBox
felett mozgatja.

A ToolTip osztlyt valamennyi trolban hasznlhatjuk. Ahhoz, hogy specifikljuk egy


kontnert, hasznljuk a ToolTip komponens konstruktort. Hogy egy ToolTip szveg
kirodjon amikor a felhasznl egy komponens fl pozcionl az egrrel, a ToolTip
szvegnek ssze kell lennie kapcsolva a komponenssel egy krelem formjban a
ToolTip osztlyban. A ToolTip szveg a komponens sszekapcsolsra hasznld a
SetToolTip fggvnyt. A SetToolTip fggvny tbb mint egyszer tudja utastani a
klnbz komponenseknek, hogy vltoztassk meg a szvegket, amivel ssze
vannak ktve. Ha azt akarjuk, hogy a szveg ssze legyen ktve a komponenssel,

218/312
hasznljuk a GetToolTip fggvnyt. Ha trlni akarjuk az sszes ToolTip szveget, a
RemoveAll fggvnyt hasznljuk.

Megjegyzs: A ToolTip szveg olyan komponens fl nem rdik ki, ami nincs
engedlyezve.
Plda:
A kvetend plda kszt egy hivatkozst s sszekti azt a Formmal egy beptett
krelemmel. A kd ezutn initalizl ksleltet tulajdonsgokat az AutoPopDelay,
InitialDelay, s ReshowDelay-el.A ShowAlways tulajdonsg igazra lltsval tudjuk
belltani, hogy a ToolTip szvegek mindaddig megjelenjenek, amg a Form fut.
Vgezetl, a pldabeli megolds sszekti a ToolTip szveget kt komponenssel a
Formon, egy Button-al s egy CheckBox-al.

private void Form1_Load(object sender, System.EventArgs e)


{
// Create the ToolTip and associate with the Form container.
ToolTip toolTip1 = new ToolTip();

// Set up the delays for the ToolTip.


toolTip1.AutoPopDelay = 5000;
toolTip1.InitialDelay = 1000;
toolTip1.ReshowDelay = 500;
toolTip1.ShowAlways = true;

toolTip1.SetToolTip(this.button1, "My button1");


toolTip1.SetToolTip(this.checkBox1, "My checkBox1");
}

Tulajdonsgok:

Active Megadja vagy belltja a kijelezend


rtket, amg a Tooltip aktv.
AutomaticDelay Automatikus ksleltets belltsa
AutoPopDelay Itt llthatjuk be azt az idt amg a
szveg jelen legyen, amikor r
pozcionlunk
InitalDelay Az az id amg vr mieltt megjelenik a
szveg
ReshowDelay Annak az idnek a hosszt lehet
belltani, amg vrnia kell a szveg
felvillantsakor, mikor egyik
komponensrl a msikra megynk t
ShowAllways Szvegkijelzs belltsa ha a form nem
aktv
Site ISite Component

219/312
ContextMenu

A ContextMenu-rl ltalban:

A ContextMenu osztly egy ment szolgltat, amit egy kontrol vagy a form fltt az
egr jobb gombjnak lenyomsval rhetnk el. Ezt a ment ltalban arra
hasznljuk, hogy a MainMenu elemeit sszevlogatva, az egyes terletekhez
rendeljk ket, gy segtve a felhasznlt. Pldul a TextBox-hoz rendelhetnk egy
contextment, melynek segtsgvel bellthat a TextBox szvegnek bettpusa
vagy a vglapra msolhatjuk, trlhetjk stb

A ContextMen rszei:

Publikus konstruktor

ContextMenu konstruktor A ContextMenu osztly egy j


pldnyt inicializlja.

Publikus propertik

Container Visszaadja azt az Icontainer-t ami


tartalmazza a komponenst.
MenuItems Visszaadja a MeniItem objektumokat,
amik a menben vannak.
SourceControl Visszaadja , hogy melyik kontrol jelenti
meg a ment.

Publikus metdusok

Equals Eldnti kt objektum pldnyrl, hogy


egyenlk e.

220/312
GetContextMenu Visszaadja a ContextMenu-t, ami
tartalmazza ezt a ment.
GetMainMenu Visszaadja a MainMenu-t, ami
tartalmazza ezt a ment.
GetType Visszadaja az aktulis pldny tpust.

MergeMenu Egyesti egy men MenuItem


objektumait az aktulis menvel.
Show A ment egy megadott pozciban
jelenti meg.
ToString Az objektumot String formra alaktja.

Public esemnyek

Disposed Egy esemnykezelt ad, ami figyeli a


komponens Disposed esemnyt.
Popup Bekvetkezik mieltt a men
megjelentsre kerl.

Protected property-k

DesignMode Egy rtket ad vissza, ami mutatja


,hogy a komponens design mdban van
e.
Events A komponenshez tartoz esemny-
kezelk listjt adja vissza.

Protected metdusok

CloneMenu Paramterknt lemsolja a ment az


aktulis menbe.
Dispose Elengedi a komponens ltal hasznlt
forrsokat.
Finalize Felszabadtja a nem hasznlt
ezkzket forrsokat a garbage
collection eltt.

ContextMenu hozzadsa a Windows Formhoz:

Nyssuk meg a Windows Form Designerben azt a formot amihez hozz akarjuk adni
a ContextMenu-t.

A Toolbox-ban kattintsunk kettt a ContextMenu komponensre, ami ekkor a


komponens tlchoz addik.

221/312
A ContextMenu-t a formhoz vagy kontrollokhoz rendelhetjk a Properties ablakban
az objektumok ContextMenu property-jnek belltsval.

NotifyIcon

NotifyIcon-rl ltalban:

A System tray-en lthat ikonok, mutatjk, milyen programok futnak a httrben.


Ilyenek pldul a klnbz virusrt programok, a hangerszablyz stb Ezeken
az ikonokon keresztl frhetnk ezen programok felhasznli interfszhez. A
NotifyIcon osztly ezt a funkcionalitst knlja a programok szmra. Az Icon
property definilja, hogy milyen ikon jelenjen meg a System tray-en. Azt, hogy milyen
felugr men tartozzon hozz, a ContextMenu property segtsgvel llthajuk be. A
Text tulajdonsg pedig akkor jelenik meg ha az egr mutatjt az ikon fltt
idztetjk.

NotifyIcon rszei:

Public Konstruktor

NotifyIcon Constructor A NotifyIcon sosztly egy j pldnyt


initializlja.

Public Property-k

Container Visszaadja az Icontainer-t ami


tartalmazza a komponenst.
ContextMenu ContextMenu belltsa, lekrdezse.

Icon Ikon bellitsa, lekrdezse.

Text Bellthat vagy lekrdezhet a tooltip


szvege, ami akkor jelenik meg, ha az
egrmutatt a system trayen lv ikon
fl helyezzk.
Visible NotifyIcon lthatsgnak ki- s
bekapcsolsa.

Public Esemnyek

Click Akkor kvetkezik be ha az ikonra


kattintunk a system tray-en.

222/312
Disposed Egy esemnykezelt ad, ami figyeli a
komponens Disposed esemnyt.
DoubleClick Akkor kvetkezik be ha az ikonra
dupln kattintunk a system tray-en.
MouseDown Akkor kvetkezik be ha a system tray-
en az ikon fltt lenyomjuk az egr
gombjt.
MouseMove Akkor kvetkezik be ha a system tray-
en az ikon fltt mozgatjuk az egr
mutatjt.
MouseUp Akkor kvetkezik be ha a system tray-
en az ikon fltt elengedjk az egr
balgomjt, vagy jra megnyomjuk a
jobb gombjt.

StatusBar

StatusBar-rl ltalban:

A StatusBar kontrol StatusBarPanel objektumokat tartalmaz. Ezeken a paneleken


szvegek s/vagy ikonok tallhatak. A StatusBar kontrol tipikusan arra szolgl, hogy
a formon tallhat objektumokrl informcit szolgltasson. A StatusBar-on helyet
kap mg a SizingGrip, amelynek segtsgvel a form mreteit llthatjuk be.

StatusBar rszei:

Public Konstruktor

StatusBar Constructor A StatusBar osztly egy j pldnyt


inicializlja.

223/312
Public Property-k

Name Az objektum neve.

AllowDrop Bellthat, ill. lekrdezhet az rtke


annak, hogy a kontrol elfogadja e az
adatot, amit a felhasznl rdobott.
ContextMenu ContextMenu belltsa, lekrdezse.

Cursor Bellthat, hogy az egrmutat milyen


legyen amikor a ToolBar fel r.
Enabled Ezzel lehet a StatusBar-t ki, be
kapcsolni.
Font Bettipus belltsa.

Location A pozci belltsa.

Panels A StatusBarPanelok collection-ja amiket


a StatusBar tartalmaz.
ShowPanels A panelok ki-, bekapcsolsa a
StatusBar-on.
Size StatusBar mreteinek belltsa.

SizingGrip A SizingGrip ki-, bekapcsolsa


(melynek segtsgvel a form mretei
llthatak)
Text A StatusBar-on lthat szveg

Visible StatusBar lthatsgnak ki-,


bekapcsolsa.

Public Esemnyek

Click Mikor a kontrolra kattintunk.

DragDrop Drag-and-drop esemny


bekvetkezsekor.
PanelClick Amikor valamelyik panelra kattintunk.

224/312
ToolBar

A ToolBar-rl ltalban:

A ToolBar kotrollokat arra hasznljuk, hogy ToolBarButton-okat jelentsnk meg a


kpernyn, amik standard, toggle, illetve drop-down stlus gombok lehetnek. A
gombokra kpeket rakhatunk s klnbz stlusra llithatjuk ket. A ToolBar-t gy

225/312
hasznljuk, mint egy ment. A gombok menpontoknak felelnek meg, csak mindig
szem eltt vannak, gy gyorstva a munkt.

A Toolbar rszei:

Public konstruktor

ToolBar Constructor A ToolBar osztly egy j pldnyt


inicializlja.

Public Property-k

AllowDrop Bellthat, ill. lekrdezhet az rtke


annak, hogy a kontrol elfogadja e az
adatot, amit a felhasznl rdobott.
Appearance A ToolBar kontrol s a gombjai
megjelentsnek belltsa s
lekrdezse.
AutoSize Automatikus mretezs belltsa s
lekrdezse.
BorderStyle Szegly stlusnak belltsa.

Buttons A ToolBar-on megjelen


ToolBarButtonok gyjtemnye.
ButtonSize A ToolBaron lv gombok mretnek
belltsa, lekrdezse.
ContextMenu ContextMenu belltsa, lekrdezse.

Cursor Bellthat, hogy az egrmutat milyen


legyen amikor a ToolBar fel r.
Dock Bellthat, hogy a ToolBar hol
dokkoljon.
Enabled Ezzel lehet a ToolBar-t ki, be kapcsolni.

Font Bettipus belltsa.

ImageList Bellihat, hogy a gombok kpei melyik


ImageList-bl legyenek elrhetek.
Location A ToolBar pozicijnak belltsa.

Name A Toolbar neve.

Size A Toolbar mretnek belltsa.

226/312
Visible Lthat, nem lthat.

Public metdusok

DoDragDrop Drag-and-drop mvelet engedlyezse.

FindForm Visszadja a formot, amin a kontrol rajta


van.

Public esemnyek

ButtonClick Akkor kvetkezik be ha a ToolBaron


egy ToolBarButton-ra kattintunk.
ButtonDropDown Akkor kvetkezik be ha egy drop-down
stlus gombra vagy a nyilra
kattintunk.
DragDrop Drag-and-drop esemny bekvetke-
zsekor.

227/312
Formok hasznlata, formok tpusai

Formok jellemzi:

(Name) A form azonostja, a programon bell hivatkozhatunk a


formra ezzel. Ne felejtsk mdostani a forrskdban is! Nem
automatikus.

static void Main()


{
Application.Run(new frmMain());
}
BackColor Httrszn
BackgroundImage Httrkp, kivlaszthat (jpg, png, bmp ,.)
Font A form s a formon lv kontrollok default fontbelltsa
FormBorderStyle A form keretnek stlusa: default: sizable
None, FixedSingle; Fixed3D; FixedDialog; FixedToolWindow;
SizableToolWindow
Buttons: A formra elhelyezett gombok alaprtelmezett jelentse lehet
AcceptButton;
CancelButton;
HelpButton
Menu MainMenu obj. Neve.
Opacity tltszsg, 100% az tltszatlan, minnl kisebb a %, annl
jobban tlthat a form
ShowInTaskbar Default: true; ha az rtke false, akkor nem jelenik meg a
taskbaron a program.
Size (width, height) A form mrete pixelben
StartPosition A form megjelenskor hol helyezkedjen el:
WindowsDefaultLocation
Manual
CenterScreen
CenterParent
WindowsDefaultBounds (nem ajnlott)
Text A form fejlcben megjelen szveg
WindowState Form llapota
Normal, Minimized, maximized

A rendszer ltal biztostott zenetablakok hasznlata

A MessageBox osztly segtsgvel tudunk egy zenetablakot megjelenteni a


kpernyn. Ez tartalmazhat szveget, nyomgombokat, s kpi szimblumot. Ha
nyomgombokat is tartalmaz, akkor a visszatrsi rtke egy DialogResult osztly
pldnya, melynek a segtsgvel meghatrozhatjuk, hogy a felhasznl mely
nyomgombra val kattintssal zrta az zenetablakot.
Az zenetablak megjelentst a Show metdus vgzi, melynek paramterei
hatrozzk meg a megjelenst.

228/312
A pldban a Show metdusnl kihasznltuk ezeket a paramtereket, de
lehetsgnk van elhagyni is belle. A pldaprogram zenet gombja bemutatja az
alkalmazs mdjt.

A megjelentse:

DialogResult dr = new DialogResult();


dr = MessageBox.Show("ez az zenet jelenik meg az ablakban",
"Ez a form fejlece", MessageBoxButtons.YesNoCancel,
MessageBoxIcon.Question);

Az els sorban ltrehozunk a DialogResult osztlybl egy pldnyt. Ennek a neve


dr. Majd a MessageBox.Show metdushvssal megjelentjk az zenetablakot.
Az els paramtere a megjelentend szveg, string konstans, vagy string tpus
vltoz.
A msodik paramtere szintn string, ez lesz a megjelen form fejlcnek felirata.
A harmadik paramter hatrozza meg, hogy milyen nyomgombok jelenjenek meg a
formon. A MessageBoxButtons egy felsorolt tpus, melynek a lehetsges rtkei:

AbortRetryIgnore
Ok
OKCancel
RetryCancel
YesNo
YesNoCancel

Ezek kzl vlaszthatunk a gombok kivlasztsnl.


A negyedik paramter a kpi szimblumot hatrozza meg. A MessageBoxIcon
segtsgvel az albbi kpecskket vlaszthatjuk:

Asterisk

Error

Exclamation

229/312
Hand

Information

None
Question

Stop

Warning

Ezek utn az zenetablak gy jelenik meg:

Ezutn egy egyszer switch szerkezettel el lehet dnteni, hogy a felhasznl melyik
nyomgombot vlasztotta.

switch (dr)
{
case DialogResult.Yes:
{
MessageBox.Show("YES","fejlc",MessageBoxButtons.OK);
break;
}
case DialogResult.No:
{
MessageBox.Show("NO","fejlc",MessageBoxButtons.OK);
break;
}
case DialogResult.Cancel:
{
MessageBox.Show("CANCEL","fejlc",MessageBoxButtons.OK);
break;
}
}

230/312
Ebben a pldban lthat, hogy a MessageBox-nak lehetsges 3 paramtere is,
azaz elhagyhat az icon meghatrozs.

Modlis s nem modlis formok

A sajt formok megjelentsnl kt lehetsg kztt vlaszthatunk. A Show()


metdus megjelenti a formot, a visible tulajdonsgnak true-ra lltsval. A form
megjelenik, de nem birtokolja a fokuszt kizrlagosan, hanem akr ms form, akr a
hv form jra aktivizlhat. gy ha nem ellenrizzk programbl, akr tbb
ugyanolyan form is megjelenthet. Erre ltunk egy pldt az kvetkez kpen.

231/312
A pldaprogramban a Nem modlis gombra kattintva rhetjk ezt el.

frmKetto frmK = new frmKetto();


frmK.Show();

Pldnyosts utn megjelentjk a formunkat.

Ha a msik lehetsget vlasztjuk, akkor a ShowModal() metdust kell hasznlnunk.


Ekkor a formunk egy dialgus boxknt jelenik meg, amelyik kizrolagosan birtokolja a
fkuszt.

232/312
Nem aktivlhatjuk az t hv formot, vagy ms, a programohoz tartoz, s lthat
formot sem. Ennek a metdusnak van visszatrsi rtke, ami egy DialogResult
pldny. Ennek felhasznlsval kirtkelhetjk, hogy melyik nyomgomb
segtsgvel zrta be az ablakot a felhasznl.

A megjelentsre plda, ha a Modlis gombra kattintunk.

frmKetto frmK = new frmKetto();


frmK.ShowDialog();

Ha szeretnnk hasznlni a kirtkels adta lehetsget is, akkor a megjelen formon


lv gombok tulajdonsgai kzl a DialogResult rtket lltsuk be a neknk
megfelelre, majd a hv helyen a megjelents kr szervezznk egy vizsglatot.

frmKetto frmK = new frmKetto();


DialogResult dr = new DialogResult();
dr = frmK.ShowDialog(this);
if (dr == DialogResult.Cancel)
MessageBox.Show("Mgse gombbal zrtad" ,"fejlc" ,MessageBoxButtons.OK);
else
if (dr == DialogResult.OK)
MessageBox.Show("Rendben gombbal zrtad","fejlc",MessageBoxButtons.OK);

233/312
Dialgusok

A klnbz prbeszd ablakoknak, dialgusoknak fontos szerepe van a Windows alatt fut
programok ksztsnl, mivel segtsgkkel tudunk a felhasznlval kommuniklni,
hibazeneteket generlni, vagy belltsokat, paramtereket krni tle.
A dialgusok megtallhatak a komponens palettn, de el lehet lltani ket dinamikusan,
valamely megfelel osztlybl trtn szrmaztatssal is.

A fontDialog

A FontDialog elindtsa s a fontkszlet kivlasztsa a kvetkez mdon trtnik: a


fontDialog ShowDialog() esemnyvel tudjuk aktivizlni azt a prbeszd panelt, melyen a
felhasznli belltsok elvgezhetek, majd a megfelel komponens fontkszlethez
hozzrendelhetjk a felhasznl vlasztsnak eredmnyt, vagyis a kvnt font tpust.

private void button1_Click(object sender, System.EventArgs e)


{
fontDialog1.ShowDialog();
listBox1.Font=fontDialog1.Font;
}

Az eljrs hatsra a listBox-ban trolt szveg fontja a fontDialog-ban kivlasztott font


tulajdonsgait kapja meg.

Amennyiben programot szeretnnk kszteni a fontDialog komponens kiprblsra,


helyezznk a Form-ra egy listBox-ot, egy fontDialog-ot s egy nyomgombot (button)!

234/312
A listBox Items tulajdonsgnl gpeljnk tetszleges szveget a listBox-ba, a nyomgomb
esemnykezeljbe pedig a fenti programrszletet rjuk! (Csak a fggvnyben lv
utastsokat gpeljk be, mivel a nyomgombhoz tartoz fggvnyt a .NET elhelyezi a
kdban!)

A futtatskor a kvetkez kimenet lthat:

Az C# nyelv vizulis rszben tallhat tbbi dialgus is hasonl mdon mkdik. Az albbi
tblzatban sszefoglaltuk a fontosabbakat.

Sznek kivlasztsa colorDialog

Font megvltoztatsa fontDialog

Nyomtatsi kp printDialog

Fjl megnyitsa openFileDialog

235/312
Fjl mentse saveFileDialog

ColorDialog

Ez a komponens alkalmas a klnbz htterek, felletek sznnek kivlasztsra.


(Termszetesen a kivlasztott sznt vgl neknk kell hozzrendelni az adott komponenshez.)

A kvetkez forrskd megmutatja a colorDialog hasznlatt:

private void button2_Click(object sender, System.EventArgs e)


{
colorDialog1.ShowDialog();
}

Mint lthatjuk, ez a komponens is hasonlan mkdik, mint az elz, a FontDialog, csak mg


az a fontok, ez a sznek kivlasztsra alkalmas. Amennyiben ki akarjuk prblni ezt a
komponenst is, a programunkat az elz plda alapjn ptsk fel!

Az gy megrt program kimenete a kvetkez:

236/312
PrintPreviewDialog

Sokszor elfordul, hogy a programjainkbl nyomtatra szeretnnk kldeni bizonyos adatokat.


Ilyen esetekben a nyomtatsi kpet nem rt megvizsglni, s a felhasznlnak megmutatni a
tnyleges nyomtats eltt.
A nyomtatsi kp megjelentshez a printPreviewDialog komponenst hasznlhatjuk, mely
hasonl pl.: a Word nyomtatsi kp ablakhoz.

A prbeszd ablakot gy aktivizltuk, ahogyan az elzeket:

private void button2_Click(object sender, System.EventArgs e)


{
printPreviewDialog1.ShowDialog();
}

A nyomtats kezelse ignyel mg nhny sornyi forrskdot, de a megrsa nem tartozik


szorosan a fejezethez.

237/312
Fjl megnyitsa s mentse

Az openFileDialog s a saveFileDialog a fjlok megnyitst s kimentst teszik egyszerv,


mivel a Windows-ban megszokott fjltallz ablakokat aktivizljk, s tmogatjk a
fjlkezelshez szksges metdusokkal.
Ez a kt komponens is knnyen hasznlhat. Csak annyi a dolgunk velk, hogy meghvjuk a
showDialog() fggvnyket, majd a kivlasztott fjlt (fjlokat) a megfelel metdusok
segtsgvel elmentjk, vagy ppen betltjk.

MessageBox

Fontos mg megemlteni a MessageBox osztlyt is, melynek metdusaival klnbz


prbeszd paneleket tudunk megjelenteni a kpernyn, segtve ezzel a kommunikcit a
felhasznlval.

A kvetkez forrskd rszlet bemutatja a MsgBox hasznlatt:

MessageBox.Show("zenetablak komponens futs kzben");

238/312
A MesageBox osztly Show() metdusban tudjuk elhelyezni azt az zenetet, amelyet meg
szeretnnk jelenteni. Ha a fenti kdrszletet egy nyomgomb esemnykezeljben helyezzk
el, majd futtatjuk, az albbi kimenethez jutunk:

Feladatok

1. Ksztsnk programot, amely lehetv teszi, hogy egy listBox-ba rt szveg


bettpust s a listBox httrsznt a felhasznl meg tudja vltoztatni. Hasznljuk a
fontDialog s a colorDialog komponenseket!
2. Ksztsnk programot, melyben a Form httrsznt dialgus segtsgvel meg lehet
vltoztatni!
3. Ksztsnk programot, mely a printPreviewDialog ablakot aktivizlja!

239/312
Tbbszl programozs

A tbbszl programozs viszonylag j technika, segtsgvel lehetsg nylik a


processzor hatkonyabb kihasznlsra, tbb processzoros rendszerek
programozsra. A tbb szlat hasznl alkalmazsok fejlesztsnek lehetsge
nem a .NET jtsa, de hatkony tmogatst ad azok ksztshez.

A prhuzamos, vagy tbbszl programok fogalma megtveszt lehet. Egy


processzor esetn nem fejezik be futsukat hamarabb, s a szlak kln kln
sem futnak rvidebb ideig, viszont tbb processzor esetn a futsi id radiklisan
cskkenhet.

Egy processzoros rendszerekben is elnyt jelenthet a tbbszl programok rsa,


futtatsa. Elfordulhat, hogy tbb program, vagy egy program tbb szla fut egy
idben, s mialatt az egyik szl adatokra vr, vagy ppen egy lassabb perifrival,
eszkzzel kommunikl, a tbbi szl hasznlhatja az rtkes processzoridt.
Termszetesen az egyes szlakat valamilyen algoritmus temezi, s azok szeletei
egyms utn futnak s nem egy idben.

A .NET rendszerben akkor is szlkezelst valstunk meg, amikor egyszer


programokat runk. A fut alkalmazsunk is egy programszl, ami egymagban fut,
hasznlja a klnbz erforrsokat s verseng a processzoridrt.

Amennyiben tudatosan hozunk ltre tbbszl programokat gondoskodni kell arrl,


hogy a szlkezel elindtsa s vezrelje a szlakat. A .NET a szlkezelnek tadott
szlakat temezi, s megprblja a szmukat is optimalizlni, nagyban segtve ezzel
a programoz dolgt. A szlakat termszetesen magunk is elindthatjuk, mg a
szmukat is megadhatjuk, de mindenkppen jobb ezt a rendszerre bzni.

(Az kvetkezekben ismertetett programhoz a Microsoft ltal kiadott David S Platt:


Bemutatkozik a Microsoft .NET cm knyvben publiklt Prhuzamos Kdokat
bemutat fejezetbl vettk az alaptletet, majd ezt fejlesztettk tovbb s rtuk t
C# nyelvre, mert taln gy tudjuk a legegyszerbben bemutatni a tbb szl

240/312
programokat. Az emltett knyv olvassa javasolt annak, aki a .NET rendszer
hasznlatt s finomsgait teljes mrtkben meg akarja ismerni!)

A pldaprogram egy listView komponens segtsgvel bemutatja, hogyan futnak


egyms mellett a szlak, a szlakat egy ImageList-ben trolt kpsorozat elemeivel
szimbolizlja. A programban egy idben tbb szl is fut, de a processzor egy idben
csak eggyel foglalkozik, viszont cserlgeti a fut szlakat.
A Piros ikonok az aktv szakaszt mutatjk, a srgk az aktv szakasz utni alv
peridust, a kk ikonok pedig a mg feldolgozsra vr, s a mr nem fut szlakat
szimbolizljk. A programban szerepel egy clfggvny, mely a szlakhoz rendelt
esemnyt hajtja vgre. Az egyszersg kedvrt a program clfggvnye csak a szl
ikonjt s feliratt cserlgeti, ezzel jelezve, hogy egy vals, prhuzamos program
ezen rszben adatfeldolgozs, vagy egyb fontos esemny trtnik.

Az egyszerre fut szlak szmt nem a programoz hatrozza meg, hanem a .NET
keretrendszer az erforrsok fggvnyben.
Indulskor kzljk a programmal a futtatni kvnt szlak szmt, majd tadjuk a
clfggvnyt a System.Threading.ThreadPool.QueueUserWorkItem() metdusnak, mely
feldolgozza ezeket.
A clfggvny mellett adhatunk a metdusnak egy tetszleges objektumot, melyben
paramtereket kzlnk vele, ami tadja ezeket a clfggvnynek.
A pldban az egy mezt tartalmaz Parameterek osztlyt adunk t a paramter
listban, melyben az adott elem sorszmt kzljk a clfggvnnyel.

class Parameterek
{
public int i = 0;
public String s = Szl;
}

A program indulsa utn a Form- ra helyezett nyomgomb indtja el a szlkezelst.


A nyomgomb esemnykezeljben, a FOR ciklusban pldnyostjuk a Parameterek
osztlyt (minden szlhoz egyet):

Parameterek P = new Parameterek();

Hozzadjuk a soron kvetkez elemet a listView komponenshez, belltjuk az elem


ikonjt s feliratt:

241/312
listView1.Items.Add(Convert.ToString(i)+"Szl",2);

rtkl adjuk a ciklus vltozjt az osztly i vltozjnak, ezzel tadva az adott szl
sorszmt a szlkezelnek, s kzvetett ton a clfggvnynek:

P.i=i;

Vgl tadjuk a pldnyt a clfggvnnyel egytt a szlkezelnek, mely gondoskodik


a szl sorsrl. temezi, futtatja, majd lelltja azt.

System.Threading.WaitCallback CF = new
System.Threading.WaitCallback(CelF);
System.Threading.ThreadPool.QueueUserWorkItem(CF ,P);

A clfggvny a kvetkez dolgokat vgzi el, szimullva egy vals program-szl


mkdst:
1. Belltja a szl ikonjt a piros, fut ikonra, (Az ikonokat egy imageList- bl
veszi), azutn trja az ikon feliratt:
listView1.Items[atadot.i].ImageIndex=0;
listView1.Items[atadot.i].Text="Fut szl";
2. A System.Thread.Threading.Sleep(1000) metdussal a szlkezel
vrakoztatja a szlat, majd tlltja a szlhoz tartoz ikont a srga, alv
ikonra, a feliratt pedig Alv szl - ra:
listView1.Items[atadot.i].ImageIndex=1;
listView1.Items[atadot.i].Text="Alv szl";
System.Threading.Thread.Sleep(1000);

3. A szl ismt vrakozik, majd az ikonja az eredetire vlt:


listView1.Items[atadot.i].ImageIndex=2;
listView1.Items[atadot.i].Text="Vge);
System.Threading.Thread.Sleep(1000);

Mivel a szlak ltrehozst ciklusba szerveztk, a program annyi szlat hoz ltre,
mint a ciklus lpsszma, viszont azt, hogy egyszerre hny szl fut, a szlkezel
dnti el.
A listView ablakban ltszik, hogy egyszerre akr hrom, vagy ngy szl is futhat, s
mellettk nhny szl ppen alszik, de lassabb gpeken ezek a szmok
nvekedhetnek.

242/312
Sajnos a tbbszl programozs kzel sem ilyen egyszer. Bonyolultabb
alkalmazsok esetn egy problma mindenkppen felvetdik. A fut szlak nem
hasznljk egy idben ugyanazt az erforrst, vagyis biztonsgosan kell futniuk
egyms mellett. A jl megrt tbbszl programok optimlisan hasznljk fel az
osztott erforrsokat, de csak akkor hasznljuk fel a lehetsgeiket, ha tisztban
vagyunk a hasznlatukban rejl elnykkel, s a lehetsges hibkkal is. A rosszul
megrt prhuzamos mkds programokkal ppen az ellenkezjt rjk el annak,
amit szeretnnk. Nveljk a lpsszmot, a memria foglaltsgt s a programok
hatkonysgt.

Feladatok

1. A fejezetben szerepl forrskdok s azok magyarzata alapjn lltsa el a


trgyalt programot. A grafikus felletnek tartalmaznia kell a kvetkez
komponenseket: listView, imageList - az ikonok rajzval (ezeket a Paint
programmal rajzolja meg), s egy nyomgombot a folyamat elindtshoz.
2. Ksztsen programot, melynek grafikus felletn kt progressBar komponens
kt fut programszl llapott szimbolizlja! A Form-on egy nyomgomb
segtsgvel lehessen elindtani a szimulcit. A progressBar llapota
mutassa az aktulis szl feldolgozottsgt!

243/312
Programozs tanknyv

XVI. Fejezet

Grafikai alapok!

Dr. Kovcs Emd

244/312
A grafikus szoftver

A szmtgpi grafika (Computer Graphics) termszetesen kpekkel foglalkozik.


Feladata a grafikus adatok feldolgozsa amely ngy, nem teljesen elklnl
fterletet lel fel:
Generatv grafikus adatfeldolgozs: kpek s grafikus adatok bevitele, kpek
ellltsa, manipullsa s rajzolsa lersok alapjn. Skbeli s trbeli
objektumok modellezse.
Grafikus kpek trolsa a szmtgpen s adathordozkon kdolt formban.
Kpfeldolgozs: kpek javtsa talaktsa a ksbbi feldolgozs rdekben.
Mintafelismers: Kpekbl meghatrozott informcik kiolvassa, lersok s
adtok ellltsa.

A szmtgpi grafika feladatai

A szmtgpi grafika nmagban nem csak a kpekkel foglalkozik, hanem


szmtalan alkalmazsi terlete van a grafikus adatok feldolgozsnak is. A
kvetkez felsorolsban ksrletet tesznk arra, hogy a szmtgpi grafika
tmakrbe tartoz alkalmazsokat csoportostsuk. A csoportostsnl az volt a
szempontunk, hogy az alkalmazsok milyen feladatcsoportot lelnek fel s a
hasznlt mdszerekben milyen sszefggsek tallhatk.

Mvszet s animci (Art and Animation)


Szmtgppel segtett tervezs s gyrts: Computer Aided Design (CAD),
Computer Aided Manufactoring (CAM)
Bemutat s zleti grafika (Presentation and Business Graphics)
Tudomnyos s mszaki szemlltets s szimulci (Scientific Visualization
and Simulation)
Kpelemzs s feldolgozs (Image analysis and processing)
Grafikus kezel felletek (Graphics User Interfaces, GUI)
Virtulis valsg (Virtual Reality)
Multimdia alkalmazsok (Multimedia Application)
Szmtgpes jtkok (Computer Games)

245/312
A Microsoft Paint programablakja

Jtkra fel!

Egy komputergrafikai program a grafikus hardver szolgltatsait grafikus knyvtrak


segtsgvel ri el. Szmos grafikus knyvtr ltezik, amelyek egy rsze az
opercis rendszerhez kttt, ms rsze fggetlen. A tovbbiakban a C#-hoz
kapcsold Ms-Windows GDI+ lehetsgeit trgyaljuk

246/312
GDI+
A GDI (Graphics Device Interface) biztostja az ablakos felletet hasznl grafikus
alkalmazsoknak az eszkz fggetlen elksztst. Az gy elkszlt programok
pldul kpesek futni klnbz kperny felbontsokban, hasznlni tudnak
klnbz nyomtatkat, legyen az mtrix vagy lzer nyomtat. A GDI rteg
alkalmazsra tekintsk meg a kvetkez brt:

A GDI alkalmazsa

A fenti brn jl lthat hogy a GDI egy olyan rteg, amely biztostja a kapcsolatot a
klnbz hardver eszkzk s az alkalmazsok kztt. Ez a struktra
megszabadtja a programozt a klnbz hardver eszkzk kzvetlen
programozsnak fradsgos munkjtl. A GDI egy program fjl, amit a
szmtgpen trolunk, s az ablak alap (Windows) alkalmazs/krnyezet tlti be a
memriba, amikor egy grafikus output miatt szksg van r. A Windows betlti a
szksges eszkzkezel programot (Device Driver) is, amely elvgzi a grafikus
parancs konvertlst a hardver eszkz szmra rhet formba, feltve, ha erre a
GDI kzvetlenl nem kpes.
Device Context: alapvet eszkz, amely valjban egy olyan bels struktra, amelyet
a Windows arra hasznl, hogy kezelje az output eszkzt.
GDI: C++ osztlyok halmaza, amelyek biztostjk a grafikus adatok eljuttatst a
programokbl a hardverek fel a Device Driver segtsgvel. A .NET rendszer GDI
vltozata a GDI+.
A GDI+ egy j fejldsi pontja a GDI vltozatoknak. A GDI+ szemben a GDI-vel
egy jval magasabb szint programozst tesz lehetv, a programozknak mr nem
kell semmit sem tudniuk a hardver eszkzkrl.
A knyvnknek nem clja tovbbi rszletessggel trgyalni a GDI+ technikai lerst,
csak a benne rejl lehetsgek izgalmasak szmunkra.
Amellett, hogy a GDI+ API (Application Programming Interface) rugalmasabb s
teljesebb mint a GDI, nagyon sok jdonsgot is megvalstottak benne.

GDI+ osztly s interfsz a .NET-ben


Nvterek, namespaces
A Microsoft .NET knyvtrban minden osztlyt nvterekben (namespasce)
csoportostottak. Anamespace nem ms mint az osztlyhoz hasonl kategria.
Pldul a Formokhoz kapcsold osztlyok a Windows.Forms nvtrbe gyaztk
be. Hasonlan a GDI+ osztlyok hat nvtrbe vannak begyazva, amelyeket a
System.Drawing.dll tartalmaz.

247/312
GDI+ Namespaces:
GDI+ a Drawing nvtrben s a Drawing nvtr t alterben van definilva.
System.Drawing,
System.Drawing.Design,
System.Drawing.Printing,
System.Drawing.Imaging,
System.Drawing.Drawing2D,
System.Drawing.Text.

A System.Drawing nvtr osztlyai s struktri


A System.Drawing Namespace biztostja az alapvet GDI+ funkcikat. Olyan
alapvet osztlyokat tartalmaz, mint a Brush, Pen, Graphics, Bitmap, Font stb.. A
Graphics osztly alapvet fontossg a GDI+ban, mivel tartalmazza a megjelent
eszkz (display device) rajzol metdusait. A kvetkez listban felsoroltunk nhny
alapvet System.Drawing osztlyt s struktrt.

Osztlyok s lersuk:

Bitmap, Image Grafikus kpek osztlyai


Brush, Brushes. Ecset pl. az ellipszisek,poligonok kitltsekhez)
Font, FontFamily A szvegek forminak a meghatrozsa (mret,
stlus, tpus stb.)
Graphics A GDI+ grafikus felletnek a megadsa.
Pen A toll definilsa szakaszok (lines) s grbk
(curves) rajzolsra.
SolidBrush Egyszin kitltsi minta definilsa az ecset
szmra.

Sruktrk s lersuk:

Color Szn definilsa


Point, PointF Skbeli pont megadsa x, y egsz s vals
koordintkkal.
Rectangle, RectangleF Tglalap definilsa a bal fels sarok koordintinak
s a szlessg s magassg adatainak a
megadsval.(top, left and width, height).
Size Mret megadsa tglalap alak rgik esetben

A Graphics osztly
A Graphics osztly a legfontosabb a GDI+ osztlyai kzl. Ezen osztly
metdusaival tudunk rajzolni a megjelent eszkznk felletre. A fellet
megadsra kt lehetsgnk addik.

248/312
Vagy rajzoljuk a Form Paint esemnynek segtsgvel, vagy fellrjuk a form
OnPaint() metdust. Az OnPaint metdus paramtere PaintEventArgs tpus lesz.

1. mdszer:
.private void Form1_Paint(object sender,
System.Windows.Forms.PaintEventArgs e)
{
Graphics myGraphics= e.Graphics;
Pen myPen = new Pen(Color.Red, 3);
myGraphics.DrawLine(myPen, 30, 20, 300, 100);
}
2.mdszer:
protected override void OnPaint(System.Windows.Forms.PaintEventArgs pae)
{
Graphics myGraphics = pae.Graphics;
Pen myPen = new Pen(Color.Red, 3);
myGraphics.DrawLine(myPen, 30, 20, 300, 100);
}
A knyvnkhz mellkelt Vide fjlok bemutatjk az albbi rajzol metdusok
hasznlatt.

DrawArc Ellipszis v rajzolsa.


DrawBezier, DrawBeziers Bzier-grbk rajzolsa.
DrawCurve, DrawClosedCurve Nylt s zrt interpoll grbe
rajzolsa.
DrawEllipse Ellipszis rajzolsa.
DrawImage Kp megjelentse.
DrawLine Szakaszrajzol metdus.
DrawPath Grafikus objektum sorozat (Path)
ellltsa.
DrawPie Krcikk rajzolsa.
DrawPolygon Poligon rajzolsa.
DrawRectangle Tglalap kontrjnak a megrajzolsa.
DrawString Szveg kirsa.
FillEllipse Kitlttt ellipszis rajzolsa.
FillPath Path bels terletnek a kitltse.
FillPie Kitlttt krcikk rajzolsa.
FillPolygon Kitlttt poligon rajzolsa.
FillRectangle Kitlttt tglalap rajzolsa.
FillRectangles Tglalapok sorozatnak kitltse.
FillRegion Rgi bels terletnek a kitltse

249/312
A GDI+ jdonsgai
Gazdagabb sznkezels s szntmenetek lehetsge
Gradient Brushes,azaz, lpcszetes szntmenet. Pldul lehetsg van egy
tglalap vagy ellipszis lpcszetes kitltsre:

Gradient brush hatsa


Program rszlet:

private void Form1_Paint(object sender,


System.Windows.Forms.PaintEventArgs e)
{ Graphics g= e.Graphics;
System.Drawing.Drawing2D.LinearGradientBrush myBrush = new
System.Drawing.Drawing2D.LinearGradientBrush(
ClientRectangle,Color.Red,Color.Blue,
System.Drawing.Drawing2D.LinearGradientMode.ForwardDiagonal);
g.FillEllipse(myBrush, 10,10,300,150);
}

Antialising tmogats
A GDI+ lehetsget biztost a szpsghibk javtsa, mint pl. a lpcshats.

Antialiasing hasznlatval s nlkle

250/312
Programrszlet:

private void Form1_Paint(object sender,


System.Windows.Forms.PaintEventArgs e)
{
Graphics myGraphics=e.Graphics;
myGraphics.SmoothingMode = SmoothingMode.AntiAlias;
myGraphics.DrawEllipse(new Pen(Color.Purple,5), 10, 10, 120, 80);
myGraphics.SmoothingMode = SmoothingMode.Default;
myGraphics.DrawEllipse(new Pen(Color.Purple,5), 150, 10, 120, 80);
}

Cardinal Spline-ok
A GDI+-ban lehetsgnk van a DrawCurve s a DrawClosedCurve metdusok
segtsgvel interpoll Cardinal spline-ok ellltsra. A spline-t egy ponttmb
(PointF[] myPoints ={}) segtsgvel tudjuk egyrtelmen meghatrozni. A
ponttmb pontjait kontrollpontoknak, az ltaluk meghatrozott poligont
kontrollpoligonnak nevezzk. A tmrl rszletesen lerst tallunk az Interpolci s
appoximci fejezetben.

7 pontra illeszked nyilt s zrt interpoll grbk

251/312
Mtrix transzformcik
A GDI+-ban szles lehetsgnk van skbeli ponttranszformcik megadsra,
egyms utni vgrehajtsra. A ponttranszformcikat transzformcis mtrixokkal
rhatjuk le, amelyek vgrehajtsi sorrendjt vltoztathatjuk, rugalmasan kezelhetjk.
Elre definilt metdusok kztt vlogathatunk (Translate, Rotate, Scale, Shear)
vagy az ltalnos affinits mtrixt (Matrix object) is megadhatjuk. A tma rszletes
kifejtst a Ponttranszformcik fejezetben talljuk meg.

Sklzhat rgik (Scalable Regions)

Elforgatott s kicsinytett input kp

public void Example_Scale_Rotate(object sender, PaintEventArgs e)


{
Graphics myGraphics=e.Graphics;
Metafile myMetafile = new Metafile("hilbert2.emf");
myGraphics.DrawEllipse(new Pen(Color.Red,1),100,50,2,2);
myGraphics.TranslateTransform(100, 50);
myGraphics.DrawImage(myMetafile, 0, 0);
e.Graphics.RotateTransform(30.0F);
e.Graphics.ScaleTransform(0.7F, 0.7F);
myGraphics.DrawImage(myMetafile,0, 0);
}

Alpha Blending
A GDI+-ban az alfa-csatorna (Alpha Channel) rtknek vltoztatsval lehetv
vlik, hogy klnbz kpek egyms eltt jelenjenek meg, gy keltve olyan rzetet,
mintha pl. egy objektumot ablakvegen keresztl vagy vz alatt ltnnk. Az
tltszsg mrtkt a blending technikban az alfa rtke adja meg. Ez az rtk

252/312
ltalban 0 s 1 kztt van, s kt kp keversnek arnyt hatrozza meg. Ha egy
kp minden pixelhez rendeltek alfa-rtket, akkor beszlnk alfa-csatornrl.
Tekintsnk egy pldt:
private void Form1_Paint(object sender,
System.Windows.Forms.PaintEventArgs e)
{ Graphics myGraphics= e.Graphics;
Bitmap myBitmap = new Bitmap("navaho.jpg");
System.Drawing.TextureBrush myBrush0 = new TextureBrush(myBitmap);
myGraphics.FillEllipse( myBrush0,50,50,300,150);
// nem ltszik t
System.Drawing.SolidBrush myBrush1 = new
SolidBrush(Color.FromArgb(255,0, 0, 255));
myGraphics.FillRectangle(myBrush1,10,50,100,100);
//flig ltszik t
System.Drawing.SolidBrush myBrush2 = new
SolidBrush(Color.FromArgb(128, 0, 0, 255));
myGraphics.FillRectangle(myBrush2,155,50,100,100);
//Szinte teljesen tltszik
System.Drawing.SolidBrush myBrush3 = new
SolidBrush(Color.FromArgb(32, 0, 0, 255));
myGraphics.FillRectangle(myBrush3,300,50,100,100);
}

Nem ltszik t, flig ltszik t, szinte teljesen tltszik a kk ngyzet

Sokkfle grafikus fjl formtum tmogatsa (Support for Multiple-Image


Formats):
GDI+ lehetsget ad raszteres (Image), bittrkpes (Bitmap) s metafile-ok
kezelsre.

A kvetkez formtumokat tmogatja:


Raszteres formtumok:
BMP Bitmap
GIF (Graphics Interchange Format)
JPEG (Joint Photographic Experts Group)
EXIF (Exchangeable Image File)

253/312
PNG (Portable Network Graphics)
TIFF (Tag Image File Format)

Metafile-ok, vektoros file formtumok:


WMF (Windows Metafile), csak megjelenti lehet menteni nem.
EMF (Enhanced Metafile)
EMF+ Bvtett metafile, GDI+ s/vagy GDI rekordokkal

Plda program:
private void Form1_Paint(object sender,
System.Windows.Forms.PaintEventArgs e)
{
Graphics myGraphics = e.Graphics;
Metafile myMetafile = new Metafile("meta_kep.emf");
Bitmap myBitmap = new Bitmap("image_kep.jpg");
myGraphics.DrawImage(myMetafile, 10, 10);
myGraphics.DrawImage(myBitmap, 500, 10);
}

Metafjl s raszteres kp beillesztse

Nhny vltozs a GDI+ porgramozsban


Vonal rajzols GDI+ hasznlatval
Legyen feladatunk, hogy a (30,20) pozcibl a (300,100) pozciba vonalat
rajzolunk. A GDI+-ban csak a Graphics s a Pen objektumokra lesz szksgnk.
Kt lehetsgnk van a rajzolsra. Vagy megrajzoljuk a vonalat a Form Paint
esemnynek segtsgvel, vagy fellrjuk a form OnPaint() metdust. Az OnPaint
metdus paramtere PaintEventArgs tpus lesz.

254/312
Szakasz rajzol eljrsunk meghvja a Garphics osztly DrawLine metdust. A
DrawLine els paramtere a Pen objektum.
Most nzzk meg a kt megvalstst:
1. mdszer:
private void Form1_Paint(object sender,
System.Windows.Forms.PaintEventArgs e)
{
Graphics myGraphics= e.Graphics;
Pen myPen = new Pen(Color.Red, 3);
myGraphics.DrawLine(myPen, 30, 20, 300, 100);
}
2.mdszer:
protected override void OnPaint(System.Windows.Forms.PaintEventArgs pae)
{
Graphics myGraphics = pae.Graphics;
Pen myPen = new Pen(Color.Red, 3);
myGraphics.DrawLine(myPen, 30, 20, 300, 100);
}

Metdusok fellbrlsa (Method Overloading)


Nagyon sok GDI+ metdus fellbrlt, azaz, szmtalan metdus ugyanazon nv
alatt, de klnbz paramter listval. Van olyan methodus, amelynek 12 vltozata
van (System.Drawing.Bitmap) Pldul a DrawLine metdus a kvetkez ngy
formban:
void DrawLine(
Pen pen,
float x1,
float y1,
float x2,
float y2) {}

void DrawLine(
Pen pen,
PointF pt1,
PointF pt2) {}

void DrawLine(
Pen pen,
int x1,
int y1,
int x2,
int y2) {}

void DrawLine(
Pen pen,
Point pt1,
Point pt2) {}

Tbb nincs a grafikus kurzornak aktulis pozicija (Current Position)


Teht nem hasznlhatunk moveto jelleg parancsokat, mert pldul az elz
rszben lttuk, hogy a a DrawLine sszes vltozatban meg kell adni a kezd s a
vg pozcit. Hasonlan Lineto, Linerel, Moverel jelleg utastsok sincsenek.

255/312
Sztvlasztott metdus a rajzolsra (Draw) s a kitltsre (Fill)
GDI+-nak klnbz metdusai vannak pl egy tglalap krvonalnak megrajzolsa
s bels terletnek a kitltsre. A DrawRectangle metdus a Pen objektummal, a
FillRectangle metdus pedig a Brush objektummal hasznlhatjuk.

Tekintsnk egy pldt:

private void myFillexample(PaintEventArgs e)


{ Graphics myGraphics=e.Graphics;
HatchBrush myHatchBrush = new HatchBrush(
HatchStyle.Cross,
Color.FromArgb(255, 0, 255, 0),
Color.FromArgb(255, 0, 0, 255));
myGraphics.FillRectangle(myHatchBrush, 100, 50, 100, 30);
Pen myPen = new Pen(Color.FromArgb(255, 255, 0, 0), 3);
myGraphics.DrawRectangle(myPen, 250, 50, 100, 30);
}

Mintval kitlttt s krvonalval megrajzolt tglalapok

A FillRectangle s DrawRectangle metdusoknak a GDI+ hasznlatakor az els


paramter mellett mg meg kell adnunk a tglalap bal fels sarknak a koordintit,
s a tglalap szlessgt, s hosszsgt (left, top, width s height). Teljesen
hasonlan jrunk el az DrawEllipse s a FillEllipse metdusok hasznlatakor is. Ms
programozsi nyelvek grafikus knyvtraiban szoks az ellipszist kzppontjval,
valamint a kis s nagy tengelyvel megadni: Ellipse(x,y,a,b); ugyanez a GDI+ -ban:

private void Form1_Paint(object sender,


System.Windows.Forms.PaintEventArgs e)
{
Pen blackPen= new Pen(Color.Black, 3);
Pen redPen= new Pen(Color.Red, 1);
//Az ellipszis kzppontja, s tengelyei
float x = 300.0F;
float y = 150.0F;
float a = 200.0F;
float b = 100.0F;
// talakts a GDI+ szerint
float left = x-a;
float top = y-b;
float width = 2*a;
float height = 2*b;
e.Graphics.DrawEllipse(redPen,left,top, width, height);
e.Graphics.DrawLine(blackPen,x,y,x,y-b);

256/312
e.Graphics.DrawLine(blackPen,x,y,x+a,y);
//A feliratok megjelentse
string at = "a";
string bt = "b";
System.Drawing.Font drawFont = new System.Drawing.Font("Arial",
16);
System.Drawing.SolidBrush drawBrush = new
System.Drawing.SolidBrush(System.Drawing.Color.Black);
// A szveg bal fels sarknak a pozcija.
float ax = x+a/2;
float ay = y-22;
e.Graphics.DrawString(at, drawFont, drawBrush, ax, ay);
float bx = x;
float by = y-b/2;
e.Graphics.DrawString(bt, drawFont, drawBrush, bx, by);
}

Ellipszis kt tengelyvel

A Color osztlynak ngy paramtere van. Az utols hrom a szoksos RGB


sszetevk: piros (red), zld (green) s a kk (blue). Az els paramter az Alpha
Blending rtke, amely a rajzol szn s a httr szn keversnek a mrtkt
hatrozza meg, s ezzel transzparenss tehetjk brinkat

Regik ltrehozsa
A GDI+-ban knnyedn formzhatunk rgikat tglalapokbl (Rectangle object) s
grafikus objektumok sorozatbl (GraphicsPath object) Ha teht ellipszisre vagy
kerektett tglalapra, vagy egyb grafikus alakzatra van szksgnk a rgik
ltrehozsnl, akkor ezeket az alakzatokat elszr a GraphicsPath objektum
segtsgvel kell ltrehoznunk, majd tadnunk a Region konstruktornak.
A Region osztly Union s Intersect metdusaival egyesthetnk kt rgit ill.
meghatrozhatjuk a rgik metszett. Emellett Xor, Exclude s Complement
metdusokat is hasznlhatunk.
Tekintsnk egy pldt:

257/312
public void myRegionExamples(PaintEventArgs e)
{
// Az els tglalap ltrehozsa.
Rectangle regionRect = new Rectangle(20, 20, 100, 100);
e.Graphics.DrawRectangle(Pens.Black, regionRect);
// Az ellipszis ltrehozsa GraphicsPath objektumknt.
GraphicsPath path=new GraphicsPath();;
path.AddEllipse(90, 30, 100, 110);
// Az els rgi megkonstrulsa.
Region myregion1=new Region(path);
e.Graphics.DrawPath(new Pen(Color.Black), path);
// Az msodik rgi megkonstrulsa.
Region myRegion2 = new Region(regionRect);
// Hatrozzuk meg a msodik rgi metszett az elsvel!
myRegion2.Intersect(path);
//myRegion2.Union(path);
//myRegion2.Xor(path);
//myRegion2.Exclude(path);
//myRegion2.Complement(path);
// Sznezzk ki a metszetet!
SolidBrush myBrush = new SolidBrush(Color.Blue);
e.Graphics.FillRegion(myBrush, myRegion2);
}
Futsi kpek:

Metszet: myRegion2.Intersect(path);

Az Intersect metdus kt rgi esetn olyan rgit ad, amelynek pontjai mindkt
rgihoz tartoznak (rgik metszete).

Uni: myRegion2.Union(path);

258/312
Az Union metdus kt rgi esetn olyan rgit ad, amelynek pontjai vagy az els
vagy a msodik rgihoz tartoznak (rgik unija).

Kizr vagy: myRegion2.Xor(path);

Az Xor metdus kt rgi esetn olyan rgit ad, amelynek pontjai vagy az els vagy
a msodik rgihoz tartoznak, de nem mindketthz (Kizr vagy).

Klnbsg: myRegion2.Exclude(path);

Az Exculde metdus kt rgi esetn olyan rgit ad, amely az els rgi minden
olyan pontjt tartalmazza, amely nincs benne a msodik rgiban (klnbsg
kpzs).

Komplementer: myRegion2.Complement(path);

259/312
A Complement metdus kt rgi esetn olyan rgit ad, amely a msodik rgi
minden olyan pontjt tartalmazza, amely nincs benne az els rgiban
(komplementer kpzs).

260/312
Interpolci s approximci
Ebben a fejezetben a C# .NET GDI+ ltal nyjtott interpolcis s approximcis
lehetsgek mellett a tma matematikai httert is megvilgtjuk, s ezzel lehetsget
adunk az ltalnostsra.

Hermit-grbe
A harmadfok Hermit-grbe kezd s vgpontjval s a kezd s vgpontban
megadott rintjvel adott. Adott a p0 s p1 pont, valamint a t0 s t1 rint vektor.
Keresnk egy olyan

harmadfok polinommal megadott grbt amelyre

teljesl, ahol a fels pont a derivlt jele.


Ezek alapjn az egyenletrendszer felrsa s megoldsa kvetkezik.

Az egyenletrendszer megoldsa utn

polinom-egytthatkat kapjuk. Ezeket visszahelyettestve s trendezve kapjuk:

Az egyenletben szerepl egytthat polinomokat Hermite-polinomoknak nevezzk,


s a kvetkezkppen jelljk:

Ekkor a grbe felrhat a Hermit-alappolinomok segtsgvel:

.
Az elbbi sszefggst alapjn az Hermit-grbt tekinthetjk gy, mint a
kontrolladatok (a p0 s p1 pont, valamint a t0 s t1) slyozott sszege.
Az egysgesebb szemlletmd miatt felrhatjuk a grbt mtrix alakban is:

261/312
.
Ha a vgpontbeli rintket egyre nagyobb mrtkben nveljk, akkor kialakulhat
hurok a grbn, azaz tmetszheti nmagt.

Bzier-grbe
Keressnk olyan grbt, amely a megadott pontokat kzelti (approximlja) az elre
megadott sorrendben s nem halad t (nem interpollja) rajtuk, vagy legalbbis nem
mindegyeiken.

de Casteljau-algoritmus
Adottak a sk vagy a tr b 0 ,..., b n pontjai s u [0,1] . Ezeket ksbb
kontrollpontoknak, az ltaluk meghatrozott poligont kontrollpoligonnak nevezzk.
Legyen

A msodik egyenlet a jl ismert, hiszen a szakasz osztpont meghatrozsa szolgl.


Most mr elvgezhet a szerkeszts, ahol az gy meghatrozott b 0n (u ) pont a Bzier-
grbe u paramterhez taroz pontja lesz.

paramterhez tartoz Bzier-grbepont szerkesztse de Casteljau-


algoritmussal

262/312
A Bzier-grbe ellltsa Bernstein-polinommal

a Bzier-grbe u paramterhez tartoz pontja, ahol a

a Bernstein polinom. Az sszefggst a


binominlis ttel segtsgvel nyerjk. Lthatjuk, hogy a Hermit-grbhez hasonlan
a kontrolladatok, jelen esetben a kontrollpontok, slyozott sszegrl van sz.

Bzier-grbe nhny tulajdonsgai


A Bzier-grbe a kontrollpontjai affin transzformcijval szemben invarins.
Ez kvetkezik a de Casteljau-fle ellltsbl. Ezen tulajdonsgot
kihasznlva, a grbe affin transzformcija (Pl.:eltols, elforgats, tkrzs,
sklzs, prhuzamos vetts) esetn elg a kontrollpontokra vgrehajtani a
transzformcit, mivel a transzformlt pontok ltal meghatrozott Bzier-grbe
megegyezik az eredeti grbe transzformltjval. De centrlis vettsre nzve
nem invarins.
Ha u [0,1] , akkor a Bezier grbe kontrollpontjainak konvex burkn bell van.

A Bzier-grbe kontrollpontjainak konvex burkn bell marad


A Bzier-grbe az els s utols kontrollponton thalad.

A Bzier-grbe szimmetrikus, azaz a s a pontok


ugyanazt a grbt lltjk el.

Ha akkor a Bzier-grbe kezd- s vgrintje:

.
Teht a kezd s a vgpontban az rintk tart egyenese a kontrollpoligon
oldalai.

263/312
A Bzier-grbe s rinti n = 3 esetn az rintvektorok harmadt felmrve

A grbe globlisan vltoztathat, azaz, ha megvltoztatjuk egy


kontrolpontjnak a helyzett, akkor az egsz grbe alakvltozson megy
keresztl. Bebizonythat a Bernstein-polinomok tulajdonsga alapjn,
i
hogy a b i kontrollpontnak a u = paramterrtknl van legnagyobb
n
hatsa a grbe alakjra. Ez utbbi tulajdonsgot nevezik gy, hogy a
grbe pszeudoloklisan vltoztathat. Teht a Bzier-grbe alakvltozsa
jl prognosztizlhat.
A polinominlis ellltsbl jl lthat, hogy b 0 ,..., b n pontot, azaz n+1
pontot n-edfok grbvel approximl, azaz a kontrollpontok szmnak
nvekedsvel n a poligon fokszma is.

Harmadfo Bzier-grbk
n = 3 esetn a grbe Bernstein-polinom alakja:

A grbe rintje:

Ezutn knnyedn megtallhatjuk az Hermit-grbe s a Bzier-grbe kztti


kapcsolatot. Ha az Hermit-grbe a p0 s p1 pontok, s a t0 s t1 rintkkel van

264/312
meghatrozva, akkor a kezd s vgpontbeli rintknek meg kell egyeznik a Bzier-
grbe rintivel, azaz , tovbb a kezd s vgpontok is
egybeesnek.
Teht az Hermit-gbvel megegyez Bzier-grbe kontrollpontjai:

A harmadfok Bezir-grbk (s termszetesen az Hermit-grbk is) vltozatos kpet


mutathatnak.

Harmadfok Bzier-grbk

Ha a harmadfok Bzier-grbe kontrollpontjait nincsenek egy skban, akkor a Bzier-


grbe trgrbe lesz, azaz nem tallunk olyan skot amelyre a grbe minden pontja
illeszkedne. A hrom kontrollpont esetn a msodfok Bzier-grbe mr egy jl
ismert skgrbe, parabola lesz.

Kapcsold Bzier-grbk
Az elz fejezetben lttuk, hogyan milyen kapcsolat van az Hermit-grbe s a
Bzier-grbe kztt. Ha tbb mint kt pontot szeretnnk sszektni interpoll
grbvel, akkor kzenfekv megolds a kapcsold harmadfok Bzier-grbk
alkalmazsa, amelyek termszetesen Hermit-grbk is lehetnek. Kapcsold
grbevek hasznlata igen gyakori a modellezsben. Ilyen esetekben a
csatlakozsnl megadjuk a folytonossg mrtkt. Ha az s
kt csatlakoz grbe amely ngy ngy kontrollponttal adott: a0,a1,a2,a3
s b0,b1,b2,b3.
A kapcsoldsnl megkvetelhetnk nulladrend C0, elsrend C1, illetve
msodrend C2 folytonossgot. ltalnossgban azt mondhatjuk, hogy kt
csatlakozgrbe kapcsoldsa Cn folytonos, ha az egyik grbe derivltjai a
vgpontjban megegyeznek a msik grbe derivltjaival a kezdpontban, az n.
derivltig bezrlag. A matematikai folytonossg vagy parametrikus folytonossg
mellett ltezik geometriai folytonossg is. Pl. G0 megegyezik C0-lal, s G1 folytonosan
kapcsoldik kt grbe, ha az rintk a kapcsoldsi pontban egy irnyba nznek, de

265/312
a hosszuk nem felttlenl egyezik meg, azaz egyik rint skalrszorosa a msiknak:

A nulladrend folytonossghoz elegend, ha a csatlakozskor keletkez grbe


megrajzolhat anlkl, hogy a ceruznkat felemelnnk. A mi esetnkben ez akkor
teljesl, ha az els grbe vgpontja megegyezik a msodik grbe kezdpontjval,
azaz: s mivel ezen grbepontok megegyeznek a megfelel
kontrollpontokkal, hiszen a Bzier-grbe a vgpontokat interpollja, ezrt a3 = b0 kell,
hogy teljesljn.
Az elsrend, C1 folytonossghoz az rintknek kell megegyeznik, azaz

kell, hogy teljesljn. Ez a kontrollpontokra az (a3 - a2) = (b1 - b0)


felttelt jelenti, azaz, amellett, hogy a kt szegmens kezd- s vgpontja
megegyezik, az a2, a3=b0, b1 pontoknak egy egyenesre kell illeszkednik s az a3
pontnak feleznie kell az a2b1 szakaszt.
A msodrendben folytonos kapcsoldshoz a fenti feltteleken kvl a kvetkeznek

kell teljeslnie: Ez a kontrollpontokra nzve a kvetkezt jelenti:


((a3 - a2) - (a2 - a1)) = ((b2 - b1) - (b1 - b0))
ami geometriai szempontbl azt jelenti, hogy az a1a2 egyenes s a b1b2 egyenes m
metszspontjra teljesl, hogy a2 felezi az a1m szakaszt, b1 pedig felezi az mb2
szakaszt.
A gyakorlatban C2 folytonossg kapcsolat elgsges, pl. animci esetn a mozg
kamera ltal ksztett felvtel akkor lesz valsgh, ha a msodik derivlt is
megegyezik. Gondoljunk arra, hogy az t/id fggvny msodik derivltja a
gyorsulst adja, teht ha a kapcsoldsi pontban megvltozik a gyorsuls, akkor
szaggatott felvtelt kapunk.

266/312
C0, C1 s C2 folytonosan kapcsold Bzier-grbk

Cardinal spline
A cardinal spline egy a kontrollpontokat interpoll, azaz az elre megadott
pontokon adott sorrendben thalad grbe, tulajdonkppen elsrendben folytonosan
csatlakoz harmadfok (kubikus) Hermit-grbk sorozata. Mivel az elz fejezetben
mr kimutattuk a Hermit- s a Bzier-grbe kztti kapcsolatot, ezrt a cardinal
spline megadhatjuk harmadfok C1 folytonosan kapcsold Bzier-grbk
sorozataknt is. Jrjunk el az utbbi mdon!

267/312
3 pontot interpoll C1 folytonosan csatlakoz Bzier-grbk
Az i. Bzier szegmens kezd s vgpontja a szomszdos a pi s pi+1 pontok. A grbe
derivltja egy kzbls pi pontban prhuzamos pi-1 pi+1 egyenessel, azaz

Ne felejtsk el, hogy a harmadrend Bzier-grbe ngy pontjval (ngy vektorral)


adott, pl. ngy kontrollpont, vagy ha Hermit-grbeknt adjuk meg, akkor a kezd s a
vg pont, valamint a kezd s a vgpontban az rintk. Az i. Bzier szegmens kezd
s vgpontja Mivel a grbe rintje:

ezrt minden kontrollpont minden szegmens esetn most mr meghatrozhat. Az


rintk meghatrozsnl hasznlhatunk egy t >= 0 tenzis rtket, amely az rintk
nagysgt befolysolja. Ha t = 0.5 akkor a Catmul-Rom spline-t, ha t = 0 akkor a
kontrollpontokat sszekt poligont kapjuk meg.

268/312
A t tenzis rtk hatsa a grbe alakjra

Zrt grbe estn az rint a kezd s a vgpontban is az


ltalnos kplettel hatrozhat meg.

Zrt grbk klnbz t rtkeknl

269/312
Az elbbi kpeket elllt program rszlet:
private void Form1_Paint(object sender,
System.Windows.Forms.PaintEventArgs e)
{
Pen redPen = new Pen(Color.Red, 4);
Color myColor = new Color();
FillMode myFill=new FillMode();
// Pontok megadsa
PointF point1 = new PointF(100.0F, 350.0F);
PointF point2 = new PointF(250.0F, 150.0F);
PointF point3 = new PointF(430.0F, 170.0F);
PointF point4 = new PointF(550.0F, 400.0F);
PointF[] curvePoints ={
point1,
point2,
point3,
point4,
};
// Kontrolpoligon megrajzolsa:
e.Graphics.DrawLines(redPen, curvePoints);
// Cardinal-spline kirajzolsa vltoz tenzis rtkkel:
for (float i = 0.0F; i <= 2; i+=0.5F)
{ float tension = i*1.0F;
myColor=Color.FromArgb((int)(i*63.0F),(int)(i*63.0F),(int)(i*63.0F)
);
e.Graphics.DrawCurve(new Pen(myColor,2), curvePoints,tension);
// Zrt grbe ellltsa:
e.Graphics.DrawClosedCurve(new Pen(Color.Red,2),
curvePoints,tension,myFill);
}
}
Ahogy a fenti programrszletbl lthattuk, hogy GDI+ segtsgvel lehetsgnk van
cardinal spline ellltsra DrawCurve metdussal. Mivel a GDI+ kihasznlja, hogy
a cardinal spline csatlakoz Bzier-grbkbl ll, ezrt szksg van egy Bzier-
grbt elllt metdusra is. A DrawBezier ngy kontroll pontra illeszt kzelt
grbt, mg a DrawBeziers pedig C0 folytonosan kapcsold Bzier-grbket rajzol.

7 pont esetn a DrawBeziers metdus futsi eredmnye

270/312
Pontranszformcik
A GDI+ .NET-ben skbeli, klcsnsen egyrtelm ponttranszformcikat lehet
knnyedn megvalstani. A ponttranszformcik lersnl homogn
koordintkat hasznlunk, amit az egysges mtrix reprezentci rdekben
tesznk.

Homogn koordintk
A sk pontjait olyan rendezett szmhrmasokkal reprezentljuk, amelyek arnyossg
erejig vannak meghatrozva, s mind a hrom koordinta egyszerre nem lehet
nulla. A definci rtelmezse:
Rendezett szmhrmas: [x1, x2, x3]
Arnyossg: az [x1,x2,x3] ugyanazt a pontot jelli, mint a [x1, x2, x3], ahol
egy 0-tl klnbz vals szm. Pl: [1, -2, 2] ugyanaz a pontot jelli, mint a
[2, -4, 4].
[0, 0, 0] homogn koordintj pont nem ltezik.

ttrs hagyomnyos Descartes koordintkrl homogn koordintkra:


Legyen egy skbeli pont hagyomnyos vals koordintja [x, y], a homogn
koordints alak [x, y, 1] lesz. Teht x1=x, x2=y, x3=1 megfeleltetst hasznltunk.
Mivel a homogn koordintk csak arnyossg erejig vannak meghatrozva, ezrt
most mr szorozhatjuk a koordintkat, egy tetszleges nem nulla szmmal.

Visszatrs homogn koordintkrl Descartes koordintkra:


A GDI+ esetben csak olyan transzformcikat fogunk hasznlni, amely esetekben a
harmadik koordinta egy lesz, ezrt a visszatrsnl egyszeren elhagyjuk.
ltalnosan ha egy pont homogn koordintja [x1, x2, x3], s x3 nem nulla, akkor az
els kt koordintt eloszthatjuk a definciban foglalt arnyossgi tulajdonsg miatt
a harmadik koordintval:
[x1/x3, x2/x3, 1].
Ebben az esetben lthatjuk, hogy valjban az x= x1/x3 s az y= x2/x3 megfeleltetst
hasznltuk. Ha x3= 0 , akkor nincs hagyomnyos vals megfelelje a pontnak, ezzel
az esettel nem foglakozunk, mert az ltalunk hasznlt ponttranszformcik esetben
nem fordul el.

Ponttranszformcik
A homogn koordintk felhasznlsval most mr egyszeren megadhatjuk a
ponttranszformcikat ltalnos alakjt
p= pM
ahol p illetve p a transzformland pont illetve a transzformlt helyvektora, M pedig
a transzformcit megad 33-as mtrix s|M|0.
A fenti mtrixegyenlet kifejtve:

271/312
.
Mivel a GDI+ csak olyan esetekkel foglakozik, amikor a harmadik koordinta 1
marad, ezrt a kvetkez alakra egyszersdik a helyzet:

.
Ha elvgezzk a mtrix szorzst akkor a kvetkez egyenletrendszerhez jutunk:

A kapott egyenletrendszer az ltalnos skbeli affinitst rja le. GDI+ .NET-ben az


ltalnos affinits mtrixnak megadsa:
Matrix myMatrix = new Matrix(m11,m12,m21,m22,m31,m32);

Els plda:
A kvetkez pldban a myMatrix ltal definilt ponttranszformcit a
myMatrix.TransformPoints(myArray) metdussal hajtjuk vgre a myArray
ponttmbn.
private void Form1_Paint(object sender,
System.Windows.Forms.PaintEventArgs e)
{
Pen myPen = new Pen(Color.Blue, 1);
Pen myPen2 = new Pen(Color.Red, 1);
// tglalap pontjai
Point[] myArray =
{ new Point(120, 60),
new Point(220, 60),
new Point(220, 110),
new Point(120, 110),
new Point(120,60)
};
// A kk tglalap a transzformci eltt
e.Graphics.DrawLines(myPen, myArray);
// a forgats szge radinban
double alpha=30*System.Math.PI/180;
Matrix myMatrix = new Matrix((float) Math.Cos(alpha),(float)
Math.Sin(alpha),(float) -Math.Sin(alpha),(float) Math.Cos(alpha),0,0);
//A transzformci vgrehajtsa
myMatrix.TransformPoints(myArray);
//Az elforgatott tglalap megrajzolsa piros tollal
e.Graphics.DrawLines(myPen2, myArray);
}

272/312
Ponttmb transzformcija

Msodik plda:
A kvetkez pldban hrom myMatrix ltal definilt ponttranszformcik szorzatt
lltjuk el a myMatrix.Multiply metdussal, majd a Graphics.Transform
metdussal vgrehajtjuk a transzformcit a Graphics objektumain, egy tglalapot
rint ellipszisen. A Multiply metdus MatrixOrder paramtere hatrozza meg a
mtrix szorzs sorrendjt, amelynek lehetsges rtkei:
Append: az j transzformcit a rgi utn kell vgrehajtani
Prepend: az j transzformcit a rgi eltt kell vgrehajtani

Formlis lersa a transzformcinak

{
Pen myPen = new Pen(Color.Blue, 1);
Pen myPen2 = new Pen(Color.Red, 1);
double alpha=30*Math.PI/180;
// Mtrixok inicializlsa:
// Sklzs.
Matrix myMatrix1 = new Matrix(2.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
// Elforgats 30 fokkal.
Matrix myMatrix2 = new Matrix(
(float)Math.Cos(alpha),(float)Math.Sin(alpha),
(float)-Math.Sin(alpha),(float)Math.Cos(alpha),
0.0f, 0.0f);
// Eltols.

273/312
Matrix myMatrix3 = new Matrix(1.0f, 0.0f, 0.0f, 1.0f, 150.0f,
50.0f);
// Matrix1 s Matrix2 sszeszorzsa.
myMatrix1.Multiply(myMatrix2, MatrixOrder.Append);
// A szorzat mtrix szorzsa Matrix3-mal.
myMatrix1.Multiply(myMatrix3, MatrixOrder.Append);
// rint ellipszis rajzolsa:
e.Graphics.DrawRectangle(myPen, 0, 0, 100, 100);
e.Graphics.DrawEllipse(myPen, 0, 0, 100, 100);
// A szozat transzformci vgrehajtsa a Graphics objektumain:
e.Graphics.Transform = myMatrix1;
// rint ellipszis megrajzolsa a transzformci utn:
e.Graphics.DrawRectangle(myPen2, 0, 0, 100, 100);
e.Graphics.DrawEllipse(myPen, 0, 0, 100, 100);
}

Sklzott, eltolt s elforgatott rint ellipszis

GDI+ transzformcis metdusai


GDI+ kt lehetsget biztost a ponttranszformcik vgrehajtsra. Az els
lehetsg, hogy az ltalnos affinitst megad Matrix osztlyt alkalmazzuk. A msik
lehetsg, hogy hasznljuk a GDI+ transzformcis metdusait.
A Graphics osztly szmtalan metdust biztost a klnbz pontranszformcik
hasznlatra. Ezen metdusok egyms utni vgrehajtsa nem ms, mint a
transzformcik szorzsa, hiszen a transzformcis mtrixokat kell egymsutn
sszeszorozni.
Tekintsk sorban a transzformcis mtrixokat, s az azoknak megfelel Graphics
vagy Drawing2D.Matrix osztlybeli metdusokat.
Az alkalmazott nvterek (Namespace):
using System.Drawing;//Graphics
using System.Drawing.Drawing2D;//Matrix

274/312
Eltols:

Graphics.TranslateTransform(dx,dy);
Matrix myMatrix = new Matrix();
myMatrix.Translate(dx,dy);

Elforgats az orig krl alfa szggel pozitv irnyba:


Az y tengely llsa miatt a szoksos pozitv irnnyal ellenttesen, az ramutat
jrsval megegyez irnyt tekintjk pozitvnak.

Pozitv irny forgats a GDI+ ban.

A forgats mtrixa:

e.Graphics.RotateTransform(alfa);
//az alft fokban kell megadni, s nem radinban
myMatrix.Rotate(alfa);
myMatrix.RotateAt(alfa,centerpont);

Tkrzs:
Koordinta tengelyekre tkrznk. Erre nincs metdus a GDI+-ban, ezrt neknk kell
elkszteni a szksges mtrixokat.
x tengelyre val tkrzsnl minden y koordinta az ellenkezjre vltozik:

275/312
Matrix myMatrix = new Matrix(1,0,0,-1,0,0);

y tengelyre val tkrzsnl minden x koordinta az ellenkezjre vltozik:

Matrix myMatrix = new Matrix(-1,0,0,1,0,0);

Az eltolst s az elforgatst sszefoglalan mozgsnak szoks nevezni, ugyanis


ilyen esetben van olyan skbeli mozgs, amivel az egybevg alakzatok egymssal
fedsbe hozhatak.

Sklzs:
Az x illetve az y tengely mentn 0<sx , illetve 0<sy vals szmokkal trtn sklzs

Graphics.ScaleTransform(sx,sy);
Matrix myMatrix = new Matrix();
myMatrix.Scale(sx,sy)

Ha sx=sy akkor sklzs hasonlsg, azaz,:


kicsinyts ha 0<sx<1
nagyts, ha 1<sx.

Nyrs:
Tekintsnk egy pontonknt fix t egyenest. A nyrs a sk pontjainak a t egyenessel
prhuzamos elcssztatsa, ahol a cssztats mrtke (k) arnyos a t egyenestl
val tvolsggal (d).

276/312
Egy k mrtk nyrs a t pontonknt fix tengellyel prhuzamosan

A GDI+-ban a koordinta tengelyek mentn vett nyrsokkal foglalkozunk. A Shear


metdus kt paramtere kzl rdemes az egyiket nullnak vlasztani, attl fggen,
hogy x vagy y tengely irnyban nyrunk, klnben elre nehezen meghatrozhat
hatst rnk el.
myMatrix.Shear(ShearX,ShearY);

Az x tengely irny ShearX=k mrtk nyrs

Nyrs az x tengely irnyban:

myMatrix.Shear(k,0);

Nyrs az y tengely irnyban:

277/312
myMatrix.Shear(0,k);

A koordinta rendszer transzformlsa s a Path hasznlata


A GDI+-ban lehetsgnk van grafikus objektumok sszefzsre, azaz, path ltrehozsra.
A GraphicsPath objektum lehetsget nyjt a grafikus elemek egyetlen blokknt
val kezelsre. A Garphics osztly DrawPath metdusnak hvsval rajzolhatjuk
meg a GarphicsPath szekvencit, amelynek elemeit felsoroljuk, a felfzshez
szksges metdusokkal:
Szakasz, AddLine, AddLines.
Tglalap, AddRectangle, AddRectangles.
Ellipszis, AddEllipse.
Ellipszis v, AddArc.
Poligon, AddPolygon.
Cardinal spline, AddCurve, AddClosedCurve.
Bzier-grbe, AddBezier, AddBeziers.
Krcikk, AddPie.
Szveg, AddString.
sszefztt grafikus objektumok, AddPath.

Teht a path megrajzolshoz szksgnk van a Graphics, a Pen s a GraphPath


objektumokra. Lssunk egy pldt:
{ Graphics myGraphics= e.Graphics;
GraphicsPath myGraphicsPath = new GraphicsPath();
Point[] myPointArray = {
new Point(40, 10),
new Point(50, 50),
new Point(180, 30)
};
FontFamily myFontFamily = new FontFamily("Times New Roman");
PointF myPointF = new PointF(50, 20);
StringFormat myStringFormat = new StringFormat();
myGraphicsPath.AddArc(0, 0, 30, 20, -60, 230);
//j figura kezdse
myGraphicsPath.StartFigure();
myGraphicsPath.AddCurve(myPointArray);
myGraphicsPath.AddString("Hello!", myFontFamily,
3, 24, myPointF, myStringFormat);
myGraphicsPath.AddPie(190, 0, 30, 20, -60, 230);
myGraphics.DrawPath(new Pen(Color.Green,1), myGraphicsPath);
}

278/312
Nem szksges, hogy a Path objektumai ssze legyenek ktve

Grafikus kontnerek
Garfikus llapotot a Garphics objektumban troljuk. A GDI+ a kontnerek
hasznlatval lehetv teszi, hogy tmenetileg megvltoztassuk egy grafikus
objektum llapott. A BeginContainer s az EndContainer metdusok kztt
brmilyen vltoztatst hajtunk vgre a grafikus objektumon, az nem befolysolja az
objektum kontneren kvli llapott.
A kvetkez pldban klnbz helyekre tesszk ki a tglalapba rt szveget.
Figyeljk meg a vonatkoztatsi pont, az orig eltolst.
private void DrawHello(Graphics myGraphics)
{
GraphicsContainer myContainer;
myContainer = myGraphics.BeginContainer();
Font myFont = new Font("Times New Roman",26);
StringFormat myStringFormat = new StringFormat();
SolidBrush myBrush=new SolidBrush(Color.Gray);
Pen myPen= new Pen(myBrush,2);
myGraphics.DrawRectangle(myPen,0,0,100,50);
myGraphics.DrawString( "Hello!", myFont, myBrush, 0,0, myStringFormat);
myGraphics.EndContainer(myContainer);
}
private void myExampleContainers(PaintEventArgs e)
{ Graphics myGraphics= e.Graphics;
GraphicsContainer myGraphicsContainer;
// j orignk a (100,100) pontba kerl
myGraphics.TranslateTransform(100, 100);
// Hello! kiiratsa az j origba.
DrawHello(myGraphics);
// Hello!-t jbl kirjuk, de elszr eltoljuk x irnyba
myGraphics.TranslateTransform(100, 0, MatrixOrder.Append);
// Forgats -30 fokkal a kontneren bell
myGraphicsContainer = myGraphics.BeginContainer();
myGraphics.RotateTransform(-30);
DrawHello(myGraphics);
myGraphics.EndContainer(myGraphicsContainer);
// Hello!-t jbl kirjuk, de elszr tovbb toljuk x irnyba
myGraphics.TranslateTransform(100, 0, MatrixOrder.Append);
DrawHello(myGraphics);
// Forgats 45 fokkal s sklzs a kontneren bell
myGraphicsContainer = myGraphics.BeginContainer();
myGraphics.ScaleTransform(2, 1.5f);
myGraphics.RotateTransform(45, MatrixOrder.Append);
DrawHello(myGraphics);
myGraphics.EndContainer(myGraphicsContainer);
}

279/312
Plda a kontnerek hasznlatra

280/312
Programozs tanknyv

XVII. Fejezet

Adatok kezelse!
Az ADO.NET

Radvnyi Tibor

281/312
Az ADO.NET
Adatkezels C#-ban

SQL Server Enterprise Manager


Az SQL Server s az MMC
SQL Server Enterprise Manager a f adminisztrcis eszkz a Microsoft SQL
Server 2000-hez, s biztostja az Microsoft Management Console (MMC)t, egy jl
hasznlhat felhasznli felletet, mely a felhasznl szmra lehetv teszi, hogy:
Meghatrozhatunk szervercsoportokat a fut SQL Serveren.
Egyedi szervereket is bejegyezhetnk egy csoportba.
Az sszes bejegyzett SQL server konfigurlsa.
Ltrehozhatunk s adminisztrlhatunk minden SQL Server adatbzisokat,
objektumokat, login-okat, felhasznlkat s engedlyezseket minden
bejegyzett szerverre..
Meghatrozhatunk s elvgezhetnk minden SQL Server adminisztrcis
feladatot minden bejegyzett szerveren.
Szerkeszthetnk s tesztelhetnk SQL utastsokat, Batch-eket, s
szkripteket interaktvan az SQL Query Analyzer segtsgvel.
Segsgl hvhatjuk a sok elre elksztett varzslt az SQL Serverhez.
MMC egy olyan eszkz, mely egy ltalnos felletet biztost klnbz szerver
alkalmazsok menedzselsre egy Microsoft Windows hlzatban. Server
alkalmazsok ltrehoznak egy komponenst, melyet az MMC hasznl, azltal az MMC
felhasznlk egy felhasznli fellet segtsgvel menedzselhetik a server
alkalmazst. SQL Server Enterprise Manager a Microsoft SQL Server 2000 MMC
komponense.
Az SQL Server Enterprise Manager elindtshoz vlasszuk ki az Enterprise
Manager ikont a Microsoft SQL Server programcsoportban. Amelyik gpen Windows
2000 fut, ott ugyangy indthatjuk az SQL Server Enterprise Managert a Felgyeleti
Eszkzkben a Vezrlpultban. Az MMC beillesztsek is a Felgyeleti Eszkzkbl
indthatk. Ehhez nem kell alapbelltsknt engedlyeznnk gyerekablak
nyitsnak lehetsgt. Ez az opci csak az SQL Server Enterprise Manager
hasunlathoz kell.

Megjegyzs Ha bejegyznk egy j SQL szervert a Felgyeleti Eszkzkben, s


utna vagy bezrjuk a Felgyeleti Eszkzket, vagy egy msik szmtgphe
csatakozunk, a szerver mr nem fog ltszani a Felgyeleti Eszkzkben. A
bejegyzett szerver a SQL Server Enterprise Managerben fog ltszdni

282/312
j elemek ltrehozsa

Feltelepts utn, ha elindtjuk az Enterprise Managert, az elnk trul kp hasonl


ms adatbzis menedzsel programokhoz. A bal oldali panel treeview-jt ha
lenyitjuk, lthatjuk a szervercsoportjainkat, azon bell a hozzadott szervereinket.
Az egyes szervereket lenyitva kapjuk meg azok belltsi, lehetsgeit, illetve
jellemzinek lerst. Itt tallhatk az adatbzisok is.
Az egyes elemekre jobb gombot nyomva kapjuk meg azt a pop-up ablakot melybl
kivlaszthatjuk az j alelem ltrehozst vagy tulajdonsgainak belltst.

A Databases/New DataBase-re kattntva ltrehozhatunk egy j adatbzist. Itt meg kell


adnunk annak nevt, s kivlaszthatjuk az adattrols knyvtrt is illetve a
merevlemez szabad s adatmret kezelsnek mdjt is. Megadhatjuk, hogy az
adatbzis szerver hova mentse a napl fjlokat. Ezeknek a mrett maximlhatjuk.
Mikor ltrehoztuk az adatbzist, ltrejn az adatbzis struktra is, mely tartalmazza
Tblkat, Nzeteket, Felhasznlkat, Trolt eljrsokat.
A tbla ltrehozsa gy trtnik mint minden hasonl rendszerben. Megadjuk a
mezneveket, azok tipusait, hoszukat s hogy engedlyezzk-e a NULL rtket.
Ezeken kvl megadhatunk mg az egyes mezkrl lerst, alaprtelmezett rtket,
Formult s karakterkszletet. Megadhatjuk, hogy egy mez egyedi legyen-e. A
kulcsok kivlasztsnl az adott mezn jobb gombot kell nyomnunk s ott a Set
Primary Key opcival elsdleges kulcsnak vlasztjuk az elemet. Bezrskor
menhetjk a tblt s adhatunk neki nevet. Ha a listban lv, mr ltez tblkat
akarjuk szerkeszteni, akkor azt az adott tbln jobb gombot nyomba a Design Table
menpontban tehetjk meg.

283/312
Kapcsolatokat ugyanolyan tipus mezk kzt hozhatunk ltre. Ezt az eszkztron
tallhat Manage Relationshipel tehetjk meg.
Az adatbzis elemei kztt tallhat a Diagram is. Ez arra szolgl, hogy ltbnyosan
szerkeszthessk a tblinkat s a kztk lv kapcsolatot. Amikor ebbl jat hozunk
ltre egy varzsl segt sszelltani a megjelentend tblkat. Bellthatjuk, hogy a
kapcsold tblkatt automatikusan a listba rakja-e. A megjelen tblknl, ha a
mr Access-ben megszokott egyik elemtl a msikig hzzuk lenyomva az egeret,
akkor megjelenik a kapcsolatokat ltrehoz form kitltve a megfelel adatokkal. A
tbln jobb hombra kattintva sok belltsi lehetsget kapunk annak
szerkesztsre, illetve megjelentsre. Pldul, hogy akr csak a kulcsokat lssuk,
vagy csak a tbla neveit. Ez a nagyobb projecteknl, a sok s sokelem tblknl
nyjthat nagy segtsget a tervezsben. A kapcsolatot jelz sszekt szakaszt is
tesreszabhatjuk, feliratozhatjuk.

284/312
Nzzk meg jobbazt azt a formot, ahol a kapcsolatokat lltottuk be. Itt a tblk teljes
testreszabst elvgezhetjk
- A els fl a Table: Itt az egyes tblk ltalnos belltsai vgezhetjk el. Mint
pldul a tbla neve, tulajdonosa, egyedi mezje s a tbla lersa.
- Columns: Itt az egyes mezket szabhatjuk testre. Majdnem minden olyan
belltst elvgezhetnk mint amit a Design table alatt. A table name mell
kattintva kapunk egy ComboBox-ot melybl kivlaszthatjuk, hogy melyik tblt
akarjuk mdostani. A Column name-el pedig az adott mezt vlaszthatjuk ki.
- Relation: A kapcsolatok. Az emltett belltsokon kvl mg be lehet lltani,
hogy hogyan mdosuljon a gyerek tbla trlskor s mdostskor.

285/312
286/312
- Indexes/Keys: Itt hozhatunk ltre j indexeket s a ltezket testre
szabhatjuk. A kivlsztott mezd mellett meg kell adnunk, hogy nvekv vagy
cskken indexet szeretnnk hozzrendelni.

287/312
MS SQL szerver elrse C#-bl
Az ADO.NET hasznlata, SQLConnection osztly a formon dinamikusan, s kevs
programozssal.

Bevezets az ADO.NET kapcsoldsi eszkzeihez


Egy alkalmazs s egy adatbzis kzti adatcserhez elszr egy kapcsolat kell az
adatbzishoz. ADO.NET-ben kapcsoldsokat ltrehozni s kezelni kapcsoldsi
objektumokkal lehet:
SQLConnection egy objektum, mely kezeli az SQL Server-hez a kapcsolatot.
Optimizlva van SQL Server 7.0 vagy jabb verzihoz val hasznlatra, az OLE DB
rteget megkerlve.
OleDbConnection egy objektum, mely kapcsolatot kezeli brmely adattrolhoz,
mely OLE DB-n keresztl elrhet.
OdbcConnection egy objektum, mely kapcsolatot kezel egy adatforrshoz, melyet
vagy kapcsolat stringgel (connection string) vagy ODBC adatforrs nvvel hoztak
ltre.
OracleConnection egy objektum, mely Oracle adatbzisokkal val kapcsolatot
kezeli.

Connection String

Minden kapcsoldsi objektum nagyjbl ugyanazon tagokkal rendelkeznek.


Az elsdleges tulajdonsg egy kapcsolat-objektumnak a ConnectionString, mely egy
string-bl ll. A string-ben mez--rtk prokat tallunk, ez az informci szksges
egy adatbzisba bejelentkezshez, s egy meghatrozott adatbzis elrshez. Egy
tipikus ConnectionString hasonlkppen nz ki:

Provider=SQLOLEDB.1; Data Source=MySQLServer; Initial Catalog=NORTHWIND;


Integrated Security=SSPI

Ez a connetion string rszlet megadja, hogy a kapcsolat a Windows beptett


vdelmt hasznlja (NT hitelests). Egy connection string-ben szerepelhet e helyett
egy felhasznlnv s jelsz, de nem javasolt, mert ezek az rtkek a programban
lesznek eltrolva (fordtskor), ezrt nem biztonsgos.

Kapcsolat ltrehozsa s megszntetse

Kt elsdleges metdus van kapcsolatokhoz: Open s Close. Az Open metdus a


ConnectionString-ben lv informcit hasznlja az adatforrs elrshez s egy
kapcsolat kiptshez. A Close metdus lebontja a kapcsolatot. A kapcsolat

288/312
bontsa lnyeges, mivel a legtbb adatforrs csak korltozott szm kiptett
kapcsolatot enged, s a kiptett kapcsolatok rtkes erforrsokat foglalnak.
Ha adatillesztkkel vagy adatparancsokkal dolgozunk, nem kell llandan
magunknak kipteni s bontani a kapcsolatot. Ha a fenti objektumok egy metdust
hvjuk meg (pl. az adatilleszt Fill vagy Update metdusa), a metdus ellenrzi, hogy
a kapcsolat mr ki van-e ptve. Ha nincs, az illeszt kipti a kapcsolatot, vgrehajtja
a feladatt, majd bontja a kapcsolatot.
A metdusok mint a Fill csak akkor ptik ki s bontjk a kapcsolatot
automatikusan, ha mg nincs kiptve. Ha van kiptett kapcsolat, a metdusok
felhasznljk, de nem bontjk le. Ez lehetsget nyjt adatparancsok flexibilis, sajt
kez kiptsre s bontsra. Ezt hasznlhatjuk, ha tbb adatillesztnk osztozik egy
kapcsolaton. Ebben az esetben nem hatkony, ha minden adatilleszt kln pt ki
s bont kapcsolatot, ha meghvja a Fill metdust. Ehelyett hasznlhatunk egy
kapcsolatot, minden illeszthz meghvhatjuk a Fill metdust, majd vgezetl
bonthatjuk a kapcsolatot.

sszetett kapcsolatok (Pooling Connections)

Az alkalmazsoknak gyakran vannak klnbz felhasznli, akik azonos tpus


adatbzis elrst vgeznek. Pldul, ASP.NET Web alkalmazsokban sok
felhasznl krdezhet le ugyanattl az adatbzistl, hogy ugyanazt az adatot kapjk.
Ezekben az esetekben az alkalmazsok teljestmnye nvelhet, ha az alkalmazs
megosztja, sszeadja (pool) a kapcsolatot az adatforrshoz.
SqlConnection osztly hasznlatakor a kapcsolatok megosztsa automatikusan
kezelve van, de rendelkezsre llnak lehetsgek, hogy a megosztst magunk
kezeljk.

Tranzakcik

A kapcsolat objektumok tmogatjk a tranzakcikat, a BeginTransaction metdussal


egy tranzakci-objektum jn ltre (pl. egy SqlTransaction objektum). A tranzakci
objektum pedig rendelkezik metdusokkal, melyek engedik vgrehajtani vagy
visszavonni a tranzakcit. A tranzakcikat kdban kezeljk.

Bellthat kapcsolat tulajdonsgok

A legtbb alkalmazsban a kapcsolat informcii nem hatrozhatk meg tervezsi


idben. Pldul egy olyan alkalmazsban, melyet tbb vsrl is hasznlni fog, nem
adhatjuk meg a kapcsolatra vonatkoz adatokat tervezskor mint a szerver neve,
stb.
A kapcsolat belltsait ezrt gyakran dinamikus tulajdonsgknt kezeljk. Mivel a
dinamikus tulajdonsgok egy konfigurcis fjlban troldnak (s nem fordtdnak az
alkalmazs binris fjljaiba), tetszlegesen vltoztathatak.
Tipikus mdszer a kapcsolat tulajdonsgainak dinamikus adatokknt val
ltrehozsa. A felhasznlnak ilyenkor valamilyen mdot kell nyjtani (Windows

289/312
Form vagy Web Form), hogy a fontos adatokat meghatrozza, majd frisstse a
konfigurcis fjlt. A .NET Framework-be ptett dinamikus tulajdonsg szerkezet
automatikusan megkapja az rtkeket a konfigurcis fjlbl, amikor a tulajdonsg
kiolvasdik, s frissti a fjlt, ha az rtk vltozik.

Kapcsolatok tervezskor a Server Explorer-ben

A Server Explorer lehetsget ad tervezskor, hogy adatforrsokhoz kapcsolatot


ltrehozzunk. Tallzhatunk a meglv adatforrsok kztt, megjelenthetnk
informcikat a tblkrl, oszlopokrl, s egyb elemekrl, amiket tartalmaz,
ltrehozhatunk s szerkeszthetnk adatbzis elemeket.
Az alkalmazsunk nem kzvetlenl hasznlja az ez ton ltrehozott kapcsolatokat.
ltalban, a tervezs kzben ltrehozott kapcsolat informciit arra hasznljuk, hogy
tulajdonsgokat lltsunk be egy j kapcsolat objektumhoz, amit az alkalmazshoz
adunk.
A tervezsi idbe ltrehozott kapcsolatokrl az informcikat a sajt gpnkn
troljuk, fggetlenl egy meghatrozott projekttl vagy Solution-tl. Ezrt miutn mr
ltrehoztunk egy kapcsolatot tervezskor, az meg fog jelenni a Server Explorer
ablakban amikor egy alkalmazson dolgozunk, mindig lthat lesz a Visual Studio-
ban (mindaddig, amg a szerver elrhet, melyre a kapcsolat mutat).

Kapcsolat tervezsi eszkzk Visual Studio-ban

ltalban nincs szksg kzvetlenl ltrehozni s kezelni kapcsolat objektumokat


Visual Studio-ban. Ha olyan eszkzket hasznlunk, mint a Data Adapter varzsl,
az eszkzk krni fogjk a kapcsolat adatait (azaz a connection string informcikat)
s automatikusan ltrehoznak kapcsolat objektumokat a Form-on vagy
komponensen, amin dolgozunk.
Mindamellett, ha akarjuk, magunk is hozzadhatunk kapcsolat objektumokat a Form-
hoz vagy komponenshez, s bellthatjuk azok tulajdonsgait. Ez hasznos, ha nem
adatillesztkkel dolgozunk, hanem csak adatokat olvasunk ki. Ltrehozhatunk
kapcsolat objektumokat, ha tranzakcikat akarunk hasznlni.

Kapcsolat ltrehozsa SQL Server-hez ADO.NET hasznlatval

A .NET Framework beptett Data Provider for SQL Server (adatszolgltat SQL
szerverhez) SqlConnection objektummal elrst nyjt Microsoft SQL Server 7.0 vagy
jabb vltozathoz.
A Data Provider for SQL Server hasonl formtum kapcsolat stringet tmogat, mint
az OLE DB (ADO) kapcsolat string formtuma.
Az albbi kd szemllteti, hogyan pthetnk ki kapcsolatot egy SQL Server
adatbzishoz:

SqlConnection kapcsolat = new SqlConnection(Data Source=localhost;


Integrated Security=SSPI; Initial Catalog=adattabla);
kapcsolat.Open();

290/312
Kapcsolat bontsa

Javasolt mindig a kapcsolat bontsa, ha befejeztk a hasznlatt. Ehhez a kapcsolat


objektumnak vagy a Close vagy a Dispose metdust kell meghvni. Azok a
kapcsolatok, melyeket nem zrunk be sajt kezleg, nem juthatnak osztott
kapcsolathoz.

ADO.NET kapcsolat objektumok ltrehozsa


Ha adatelrs tervez eszkzket hasznlunk Visual Studio-ban, ltalban nem
szksges magunknak ltrehoznunk a kapcsolat objektumokat a Form-on vagy
komponensen. Azonban nhny esetben alkalmasnak tallhatjuk egy kapcsolat sajt
ltrehozst.
Lehetsgeink:
Az albbi eszkzkbl hasznlhatjuk valamelyiket, mely a feladata rszeknt
kapcsolat objektumot hoz ltre:
Data Adapter Configuration Wizard ez a varzsl informcikat kr a
kapcsolatrl, mely egy adatilleszthz lesz kapcsolva.
Data Form Wizard a varzsl kapcsolat objektumot hoz ltre a Form
rszeknt, melyet konfigurl.
Hzzunk egy tblt, kijellt oszlopokat vagy trolt eljrst a Form-ra a Server
Explorer-bl. Ezen elemek Formra thzsakor ltrejn egy adatilleszt s
egy kapcsolat is.
Hozzunk ltre egy klnll kapcsolatot. Ez a lehetsg ltrehoz egy
kapcsolat objektumot a Form-on vagy komponensen, melynek a tulajdonsgait
magunknak kell belltanunk. Ez a megolds akkor hasznos, ha a kapcsolat
tulajdonsgait futsi idben szndkozzuk belltani, vagy ha egyszeren a
tulajdonsgokat magunk szeretnnk belltani a Properties ablakban.
Hozzunk ltre kapcsolatot kddal.

Kapcsolat ltrehozsa
1. A Toolbox ablak Data csoportjbl hzzunk egy kapcsolat objektumot a Form-ra
vagy komponensre.
2. Vlasszuk ki a kapcsolatot a tervezben s hasznljuk a Properties ablakot a
connection string belltshoz.
3. Bellthatjuk a ConnectionString-et egy egysgknt.
4. Vagy
5. Kln tulajdonsgait llthatjuk (DataSource, Database, UserName, stb.). Ha
kln lltjuk a tulajdonsgokat, a kapcsolat string ltrejn automatikusan.
6. tnevezhetjk a kapcsolat objektumot a Name tulajdonsg vltoztatsval.
7. Ha futsi idben szeretnnk a tulajdonsgokat belltani, az alkalmazs
jrafordtsa nlkl, meg kell hatrozni a kapcsolat tulajdonsgait.

291/312
Kapcsolat ltrehozsa SQL Server-hez

Ha SQL Server-hez kapcsoldunk, hasznljuk a Microsoft OLE DB Provider for SQL


Server eszkzt. Kt mdon kapcsoldhatunk szerverhez:
Vizulisan, tervezsi eszkzkkel hozzunk ltre kapcsolatot.
Programkddal hozzunk ltre a kapcsolatot.

SQL Server kapcsolat Server Explorer-ben

Egyszeren hozhatunk ltre SqlConnection, SqlDataAdapter s SqlCommand


objektumokat gy, hogy a Server Explorerbl a Formra hzzuk ket.
Kapcsolat ltrehozsa:
1. A Server Explorer-ben kattintsunk jobb egrgombbal a Data Connections-re, s
vlasszuk az Add Connection menpontot. Megjelenik a Data Link Properties
prbeszdablak.
2. Az alaprtelmezett elrs a Microsoft OLE DB Provider for SQL Server.
3. Vlasszuk ki egy szerver nevt a lenyl listbl, vagy gpeljk be a szerver
helyt, ahol az elrni kvnt adatbzis tallhat.
4. Az alkalmazsunk vagy az adatbzisunk szksgleteihez mrten vlasszuk ki
vagy a Windows NT Integrated Security-t, vagy adjunk meg felhasznlnevet s
jelszt a bejelentkezshez.
5. Vlasszuk ki az elrni kvnt adatbzist a lenyl listbl.
6. Kattintsunk az OK gombra.

Kapcsolds SQL Server-hez az alkalmazsunkbl

Kapcsolds ltrehozsa vizulis eszkzkkel

A kapcsoldsi eszkzket vagy a Server Explorer-bl vagy a Toolbox ablak Data


csoportjbl hasznlva hozzunk ltre kapcsolatot:

Server Explorer-bl
Hozzunk ltre egy Data Connection-t a Server Explorer-ben az SQL Server-hez a
fentebb lert mdon.
Hzzuk a ltrehozott kapcsolatot a Form-ra. Egy SqlConnection objektum jeleni meg
a komponens-tlcn.

Toolbox-bl
Hzzunk egy SqlConnection objektumot a Form-ra. Egy SqlConnection objektum
jelenik meg a komponens-tlcn, mely nincs belltva.
A Properties ablakban vlasszuk ki a ConnectionString property-t. Vlasszunk ki egy
meglv kapcsolatot a lenyl listbl vagy kattintsunk a New Connection-re, s
lltsuk be a kapcsolatot.

A kapcsolat kiptse utn az adatbzist kezel eljrsokat kell ltrehozni.

292/312
A DataTable osztly
Adatokat nem csak gy kezelhetnk egy DataGrid-ben, hogy azok valsgos
adatbzishoz kapcsoldnak. Lehetsgnk van arra is, hogy egy tetszleges
adatforrst hasznljunk, vagy akr programbl generljunk adatokat, melyeket ezek
utn pp gy kezelhetnk, mintha egy tetszleges tpus adatbzis egy-egy tblja
lenne.
A megolds kulcsa a DataTable osztlyban rejlik. Ezt az osztlyt hasznlhatjuk vals
adattblk kezelshez pp gy, mint a programbl generlt adatainkhoz.

Szrs s rendezs az ADO.NET-ben

Vizsgljuk meg, hogy lehet a memriban, DataSetben trolt adatokat tovbb szrni,
illetve rendezni. Az ADO.NET kt megkzeltst tmogat erre a mveletre:
1. A DataTable Select metdusnak hasznlatt. Ez a metdus szrt s
rendezett adatsorok tmbjvel tr vissza.
2. A DataView objektum filter, find s sort metdusai. Ez az objektum
hozzkapcsolhat az adatmegjelentsre kpes objektumokhoz.

Nzznk egy pldt a szrfelttel felptsre:

OrderDate >= 01.03.1998 AND OrderDate <= 31.03.1998

A tipikus rendezsi kifejezs: a mez neve s a rendezs irnya. Ami a DESC


(cskken) vagy az ASC (nvekv) szavakkal hatrozhat meg.

OrderDate DESC

A kvetkez kd egy plda a DataTable Select metdusnak hasznlatra:

private static void GetRowsByFilter()


{

DataTable customerTable = new DataTable( "Customers" );


customerTable.Columns.Add( "id", typeof(int) );
customerTable.Columns.Add( "name", typeof(string) );

customerTable.Columns[ "id" ].Unique = true;


customerTable.PrimaryKey = new DataColumn[]
{CustomerTable.Columns["id"] };

// Tz sor hozzadsa a tblhoz


for( int id=1; id<=10; id++ )
{
customerTable.Rows.Add(

293/312
new object[] { id, string.Format("customer{0}", id) } );
}
customerTable.AcceptChanges();

// jabb tz sor hozzadsa


for( int id=11; id<=20; id++ )
{
customerTable.Rows.Add(
new object[] { id, string.Format("customer{0}", id) } );
}

string strExpr;
string strSort;

strExpr = "id > 5";


// Cskken sorrend a CompanyName nev mezben.
strSort = "name DESC";

DataRow[] foundRows = customerTable.Select( strExpr, strSort,


DataViewRowState.Added );

PrintRows( foundRows, "filtered rows" );

foundRows = customerTable.Select();
PrintRows( foundRows, "all rows" );
}

private static void PrintRows( DataRow[] rows, string label )


{
Console.WriteLine( "\n{0}", label );
if( rows.Length <= 0 )
{
Console.WriteLine( "no rows found" );
return;
}
foreach( DataRow r in rows )
{
foreach( DataColumn c in r.Table.Columns )
{
Console.Write( "\t {0}", r[c] );
}

294/312
Console.WriteLine();
}
}

Az alapvet problma a DataTable Select metdusval, hogy a szrs


eredmnyeknt kapott adatsorokat egy tmbben adja vissza. Ez nem kthet sem a
DataGridhez sem ms adatmegjelentsre alkalmas objektumhoz kzvetlenl. Erre a
DataView hasznlata ad lehetsget.

Szrs s rendezs a DataView objektum segtsgvel

A DataView objektum lehetv teszi, hogy a DataTable-ban trot adatokhoz


klnbz nzeteket hozzunk ltre. Ezt a lehetsget sokszor hasznljuk ki
adatbzishoz kapcsold programoknl.
A DataView hasznlatval a tblabeli adatokat klnbz rendezsi szempont
szerint, illetve a sorok llapota , vagy kifejezsek lltal meghatrozott szrk szerint
mutathatjuk meg.
Ez abban klnbzik a DataTable Select metdustl, hogy az eredmny sorokat
nem egy tmbben adja vissza, hanem egy dinamikus tblban. Ez a kpessge a
DataView objektumot idelis eszkzz teszi az adatkapcsolatokat kezel programok
szmra.

A DataView objektum helye az ADO.NETben

295/312
Az alaprtelmezett nzet

A DataTable.DefaultView tulajdonsg a DataView objektumot kapcsolja a


DatatTable-hoz. gy itt is hasznlhat a rendezs, szrs s keress a tblban.

A RowFilter tulajdonsg

A DataView.RowFilter tuljdonsga adhatunk meg egy szr felttelt a sorok


megjelentshez a DataViewban. A szrkifejezs felptse: egy oszlopnv,
opertor s egy rtk a szrshez.

LastName = Smith

Rendezs a DataViewban

A rendezshez ltre kell hoznunk egy string kifejezst, melyben megadhatjuk, hogy
mely oszlopok szerint szeretnnk rendezni a sorokat, s milyen irnyban.

Price DESC, Title ASC

Egy tblhoz tbb nzet

296/312
Nzznk egy pldt erre:

using System;
using System.Diagnostics;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Data.SqlClient;

namespace Akadia.DataView
{
public class FilterOrder : System.Windows.Forms.Form
{
....
private SqlConnection cn;
private SqlCommand cmd;
private SqlDataAdapter da;
private DataSet ds;

public FilterOrder()
{
try
{
InitializeComponent();

// Initializing
cn = new SqlConnection("
server=xeon;database=northwind;uid=sa;pwd=manager");
cmd = new SqlCommand("SELECT * FROM orders",cn);
da = new SqlDataAdapter(cmd);
ds = new DataSet();

// Kezd adatok betltse


RetrieveData();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
Console.WriteLine();

297/312
}
}

// Orders Tbla adatai


private void RetrieveData()
{
try
{
da.Fill(ds,"Orders");
DataGrid.DataSource = ds.Tables[0];

// Combobox feltltse a meznevekkel


FillSortCriteria();
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
MessageBox.Show(ex.ToString());
}
}

// Combobox feltltse a meznevekkel


private void FillSortCriteria()
{
try
{
if (cmbSortArg.Items.Count > 0)
{
return;
}
foreach (DataColumn dc in ds.Tables[0].Columns)
{
cmbSortArg.Items.Add(dc.Caption); // Sort Combobox
cmbFields.Items.Add(dc.Caption); // Filter on Column Combobox
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
Console.WriteLine();
}

298/312
}
// Setup Szrfelttel belltsa
private void SetFilter(string strFilterExpression)
{
try
{
ds.Tables[0].DefaultView.RowFilter = strFilterExpression;
// Kiolvassuk a rekordszmot a DataViewban
if (ds.Tables[0].DefaultView.Count > 0)
{
DataGrid.DataSource = ds.Tables[0].DefaultView;
}
else
{
MessageBox.Show("Filter criteria does not meet criteria");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
Console.WriteLine();
}
}

private void btnQuery_Click(object sender, System.EventArgs e)


{
try
{
// Clear DataSet
ds.Clear();

// Clear Filter
ds.Tables[0].DefaultView.RowFilter = "";

// Re-Retrieve Data
RetrieveData();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
Console.WriteLine();

299/312
}
}

// Belltjuk a DataViewban a rendezst


private void btnSort_Click(object sender, System.EventArgs e)
{
try
{
string strSort;

// IF Radiobox "Ascending" is checked, then


// sort ascending ...
if (rbAsc.Checked)
{
strSort = cmbSortArg.Text + " ASC"; // Note space after "
}
// ... else descending
else
{
strSort = cmbSortArg.Text + " DESC"; // Note space after "
}

// rvnyestjk a rendezst
ds.Tables[0].DefaultView.Sort = strSort;
DataGrid.DataSource = ds.Tables[0].DefaultView;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
Console.WriteLine();
}

private void btnFilterTitle_Click(object sender, System.EventArgs e)


{
try
{
SetFilter("CustomerID like '" + txtFilter.Text + "'");
}
catch (Exception ex)

300/312
{
MessageBox.Show(ex.ToString());
Console.WriteLine();
}
}

private void btnGeneralFilter_Click(object sender, System.EventArgs e)


{
try
{
SetFilter(txtGeneralFilter.Text);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
Console.WriteLine();
}

private void btnFilteronColumn_Click(object sender, System.EventArgs e)


{
try
{
SetFilter(cmbFields.Text + " " + txtFilterColumn.Text);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
Console.WriteLine();
}
} ...
[STAThread]
static void Main()
{
Application.Run(new FilterOrder());
}
}
}

301/312
Trolt eljrsok
Trolt eljrsok futtatsa, j trolt eljrsok ksztse, rgztse adatbzisban,
hasznlatba vtelk.

Mi is az a Transact-SQL?

A Transact-SQL a Microsoft SQL megvalstsa, amely programozsi szerkezetekkel


egszti ki a nyelvet. A nevt gyakran rvidtik T-SQL re. A T-SQL segtsgvel,
olyan SQL utastsokat tartalmaz programokat rhatunk, amelyekben a szokvnyos
programozsi szerkezetek is megtallhatk (vltozk, feltteles szerkezetek,
ciklusok, eljrsok s fggvnyek).

Alapvet programozsi szerkezetek:


Vltozk hasznlata
Feltteles szerkezetek hasznlata
Case utastsok hasznlata
While ciklusok hasznlata
Continue utasts
Break utasts
Return utastsok hasznlata
Waitfor utastsok hasznlata
Kurzozok hasznlata
Fggvnyek hasznlata
Felhasznli fggvnyek ltrehozsa

Vltozk
A kvetkez tpusokat hasznlhatjuk:
Tpus Lers
Bigint Egsz rtk 263 s 263 1 kztti tartomnyban
Int Egsz rtk 231 s 231 1 kztti tartomnyban
Smallint Egsz rtk 215 s 215 1 kztti tartomnyban
Tinyint 0 s 255 kztti egsz rtk
Bit 1 vagy 0 trk egsz
Decimal Rgztett pontossg s mret szmrtk 1038 +1
tl
1038 1 ig
Numeric Ugyanaz, mint a decimal
Money Pnzrtk a 263 s 263 1 kztti tartomnyban a
pnzegysg
egy tzezrelknek pontossgval
Smallmoney Pnzrtk a 214748,3648 s 214748,3647 kztti
tartomnyban a pnzegysg egy tzezrelknek
pontossgval
Float Lebegpontos rtk 1,79E+308 s 1,79E+308 kztt
Real Lebegpontos rtk 3,4E+38 s 3,4E+38 kztt

302/312
Datetime Dtum- s idrtk 1753.janur 1. s 9999.december
31. kztt, 3,33 ezredmsodperc pontossggal
Smalldatetime Dtum- s idrtk 1900.janur 1. s 2079, jnius 6.
kztt 1 perc pontossggal
Char Rgztett hosszsg nem Unicode karakterek,
legfeljebb 8000 karakterig
Varchar Vltoz hosszsg nem Unicode karakterek,
legfeljebb 8000 karakterig
Text Vltoz hosszsg nem Unicode karakterek,
legfeljebb 231-1 karakterig
Nchar Rgztett hosszsg Unicode karakterek, legfeljebb
4000 karakterig
Nvarchar Vltoz hosszsg Unicode karakterek, legfeljebb
8000 karakterig
Ntext Vltoz hosszsg Unicode karakterek, legfeljebb 231-
1 karakterig
Binary Rgztett hosszsg binris adat, legfeljebb 8000
bjtig
Varbinary Vltoz hosszsg binris adat, legfeljebb 8000 bjtig
Image Vltoz hosszsg binris adat, legfeljebb 231-1 bjtig
Cursor Hivatkozs kurzorra (sormutatra), vagyis sorok egy
halmazra
Sql_variant Brmilyen SQL SERVER adattpust trolhat, kivve
text, ntext s timestamp tpusakat
Table Sorok halmazt trolja
Timestamp Egyedi binris szm, amely minden sormdostsnl
frissl; egy tblban csak egy timestamp oszlop lehet
Uniqueidentifier Globlisan egyedi azonost (GUID, globally unique
identifier)

A vltozkat a DECLARE utastssal vezetjk be, amelyet a vltoz neve s tpusa


kvet. A vltoz neve el egy kukacjelet @ kell rnunk. Egy sorban tbb vltozt is
bevezethetnk.

declare @MyProductName nvarchar(40), @MyProductID int

A vltozk null kezdrtket kapnak, rtkket a SET utastssal llthatjuk be:

set @MyProductName = Szottyesz


set @MyProductID = 5

Feltteles szerkezetek hasznlata

A feltteles szerkezetek ugyangy mkdnek, mint mr megszoktuk, csak a


szintaktika ms. Az IF utastsok brmilyen szintig egymsba gyazhatak.
Egyszerre tbb utastst is megadhatunk, csak ilyenkor BEGIN END kz kell rnunk
a kvnt utastsokat.

303/312
IF felttel1
BEGIN
Utastsok1
END
ELSE
BEGIN
Utastsok2
END

CASE utastsok

A kvetkez pldban a SELECT utasts eredmnyeknt kapott rtket egy


vltozban troljuk:

DECLARE @State nchar(2)


SET @State = Ma
DECLARE @StateName nvarchar(15)
SELECT @StateName =
CASE @State
WHEN CA THEN California
WHEN MA THEN Massachusetts
WHEN NY THEN New York
END

While ciklusok

Ha egy vagy tbb utasts tbbszri vgrehajtsra van szksgnk, akkor WHILE
ciklusokat hasznlhatunk. A WHILE ciklusok addig futnak, amg a megadott felttel
igaz.
Az utastsforma a kvetkez:

DECLARE @count int


SET @count = 5
WHILE(@count>0)
BEGIN
PRINT count = + CONVERT(nvarchar, @count)
SET @count = @count -1
END

304/312
A CONTINUE utasts

A CONTINUE utastssal azonnal egy WHILE ciklus kvetkez ismtlsre


ugorhatunk, tugorva a ciklusbl mg esetleg htralv kdrszeket. Az utasts
hatsra a vgrehajts visszaugrik a ciklus elejre.

A BREAK utasts

Ha egy WHILE ciklusnak azonnal vget szeretnnk vetni, a BREAK utastst


hasznlhatjuk. Az utasts hatsra a vgrehajts kikerl a ciklusbl, s a program
futsa a ciklus utni utastsokkal folytatdik.

RETURN utastsok hasznlata

A RETURN utastssal egy trolt eljrsbl vagy utastsok egy csoportjbl


lphetnk ki, a RETURN -t kvet egyetlen utasts sem hajtdik vgre. Az
utastssal rtket is visszaadhatunk, de csak ha trolt eljrshoz hasznljuk.

WAITFOR utastsok hasznlata

Elfordulhat, hogy azt szeretnnk, hogy a program megllna, mieltt bizonyos


mveleteket vgrehajtannk, pldul jszaka frisstennk a felhasznli rekordokat.
A WAITFOR utastssal adhatjuk meg, hogy mennyi ideig vrjon a program a tbbi
utasts vgrehajtsa eltt.

Az utasts formja:
WAITFOR [DELAY idtartam | TIME jelenlegi id]

DELAY: vrakozsi idtartam,


TIME: pontos idpont.

Nhny plda:
WAITFOR DELAY 00:00:06 - 6 msodpercig vr
WAITFOR TIME 10:02:15 - 10 ra 2 perc 15 msodperckor folytatja a
vgrehajtst

RAISERROR utastsok hasznlata

A RAISERROR utastssal hibazenetet llthatunk el. ltalban akkor van szksg


erre, ha valamelyik trolt eljrsban hiba kvetkezik be.
Az utasts egyszerstett formja a kvetkez:
RAISERROR ({szm | lers}{, slyossg, llapot})

305/312
Itt a szm a hiba szma, amelynek 50001 s 2147483648 kztt kell lennie, a lers
egy 400 karakternl nem hosszabb zenet, a slyossg a hiba fokozata, ami 0 s 18
kztt lehet, az llapot pedig egy tetszleges rtk 1 s 127 kztt, ami a hiba hvsi
llapott mutatja.

KURZOROK hasznlata

Felmerlhet a krds, hogy mi is az a kurzor, s mire lehet hasznlni. Nos amikor


vgrehajtunk egy SELECT utastst, akkor egyszerre kapunk meg minden sort. Ez
nem mindig megfelel, elfordulhat pldul, hogy egy adott sor visszakapott
oszloprtkei alapjn valamilyen mveletet szeretnnk vgezni. Ehhez egy kurzort
(sormutatt) kell hasznlnunk, amellyel a z adatbzisbl kinyert sorokat egyenknt
dolgozhatjuk fel. A kurzor segtsgvel vgiglpkedhetnk az adott SELECT utasts
ltal visszaadott sorokon.

Kurzor hasznlatakor a kvetkez lpseket kell kvetnnk:


1. Vltozkat vezetnk be a SELECT utasts ltal visszaadott oszloprtkek
trolsra.
2. Bevezetjk a kurzort, megadva a megfelel SELECT utastst.
3. Megnyitjuk a kurzort.
4. Kiolvassuk a sorokat a kurzorbl.
5. Bezrjuk a kurzort.

Egy pldaprogramon keresztl bemutatjuk a kurzorok hasznlatt, mely megmutatja,


hogy hogyan jelenthetjk meg a kurzor segtsgvel a Products tbla ProductID,
ProductName s UnitPrice oszlopait:

Use Northwind

-- 1. lps: a vltozk bevezetse


DECLARE @MyProductID int
DECLARE @MyProductName nvarchar(40)
DECLARE @MyUnitPrice money

-- 2. lps: a kurzor bevezetse


DECLARE ProductCursor CURSOR FOR
SELECT ProductID, ProductName, UnitPrice
FROM Products
WHERE ProductID <= 10

-- 3. lps: a kurzor megnyitsa


OPEN ProductCursor

-- 4. lps: a sorok kiolvassa a kurzorbl


FETCH NEXT FROM ProductCursor

306/312
INTO @MyProduct, @MyProductName, @MyUnitPrice
PRINT @MyProductID = + CONVERT(nvarchar, @MyProductID)
PRINT @MyProductName = + CONVERT(nvarchar, @MyProductName)
PRINT @MyUnitPrice = + CONVERT(nvarchar, @MyUnitPrice)
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM ProductCursor
INTO @MyProductID, @MyProductName, @MyUnitPrice
PRINT @MyProductID = + CONVERT(nvarchar, @MyProductID)
PRINT @MyProductName = + CONVERT(nvarchar, @MyProductName)
PRINT @MyUnitPrice = + CONVERT(nvarchar, @MyUnitPrice)
END

-- 5. lps: a kurzor bezrsa


CLOSE ProductCursor
DEALLOCATE ProductCursor

Mint a pldaprogramban is lthat, a vltozk tpusa meg kell, hogy egyezzen a


kinyert sorok oszlopainak tpusval.
A kurzor bevezetse abbl ll, hogy megadjuk a kurzorhoz rendelend nevet, illetve
a vgrehajtani kvnt SELECT utastst. A SELECT utasts addig nem hajtdik
vgre, amg a kurzort meg nem nyitjuk. A kurzort a DECLARE utasts hasznlatval
vezetjk be.
Mint lthatjuk, a kurzor megnyitsa az OPEN paranccsal trtnik.
Ahhoz hogy a sorokat ki tudjuk olvasni a kurzorbl, a FETCH utastsra van
szksgnk. A kurzorban szmos sor lehet, gy egy WHILE ciklust, s a
@@FETCH_S_TATUS -t kell alkalmaznunk annak megllaptsra, hogy a
ciklusnak mikor kell vget rnie.
A @@FETCH_STATUS fggvny visszatrsi rtkei:
 0: A FETCH utasts sikeresen visszaadott egy sort,
 -1: A FETCH utasts hibzott, vagy a krt sor az eredmnyhalmazon kvlre
esett,
 -2: A lekrt sor hinyzik.

A kurzort a CLOSE utastssal zrhatjuk be, s a DEALLOCATE utastssal a


kurzorra val hivatkozst, mellyel felszabadthatjuk az ltala hasznlt
rendszererforrsokat.

Fggvnyek hasznlata

Az SQL Server szmos fggvnyt bocst a rendelkezsnkre, amelyekkel rtkeket


nyerhetnk ki az adatbzisokbl. Egy tbla sorainak szmt pldul a COUNT ( )
fggvnnyel kaphatjuk meg.

307/312
Fggvnykategrik:
1. sszest fggvnyek: egy tbla egy vagy tbb sora alapjn adnak vissza
informcikat
2. Matematikai fggvnyek: szmtsok vgzsre hasznlatosak
3. Karakterlncfggvnyek: karakterlncokon hajtanak vgre mveleteket
4. Dtum- s idfggvnyek: dtum- s idkezelsi mveleteket hajtanak vgre
5. Rendszerfggvnyek: az SQL Serverrl szolgltatnak informcit
6. Belltsi fggvnyek: a kiszolgl belltsairl adnak informcit
7. Kurzorfggvnyek: a kurzorokrl szolgltatnak informcit
8. Metaadatfggvnyek: az adatbzisrl, illetve annak elemeirl, pldul a tblkrl adnak
informcit
9. Biztonsgi fggvnyek: az adatbzis felhasznlirl s szerepkreirl
nyjtanak informcit
10. Rendszerstatisztikai fggvnyek: statisztikai adatokat adnak vissza az SQL
Serverrl
11. Szveg- s kpfggvnyek: szveg- s kpkezelsi mveleteket hajtanak
vgre

Felhasznli fggvnyek ltrehozsa

Az SQL Serverben sajt, gynevezett felhasznli fggvnyeket is kszthetnk. Egy


ilyen fggvnnyel kiszmthatunk pldul egy kedvezmnyes rat az eredeti r s
egy szorz alapjn. A felhasznli fggvnyek ltrehozsra a CREATE FUNCTION
utasts szolgl, s hrom fajtjuk van:

Skalrfggvnyek A skalrfggvnyek egyetlen rtket adnak vissza, ami brmilyen


tpus lehet, kivve a text, ntext, image, cursor, table s timestamp tpusokat, illetve
a felhasznli adattpusokat.

Helyben kifejtett tblartk fggvnyek A helyben kifejtett (inline) tblartk


fggvnyek table tpus objektumokat adnak vissza. A table objektumok olyanok,
mint egy szablyos adatbzistbla, csak a memriban troldnak. A helyben
kifejtett tblartk fggvnyek egyetlen SELECT utastssal kinyert adatokat adnak
vissza.

Tbbutastsos tblartk fggvnyek A tbbutastsos tblartk fggvnyek


is table tpus objektumokat adnak vissza, de a helyben kifejtet tblartk
fggvnyektl eltren tbb T-SQL utastst tartalmazhatnak.

Plda egy skalrfggvnyre:


-- A DiscountPrice kiszmtja egy termk j rt az eredeti r s a lertkelsi
szorz alapjn

CREATE FUNCTION DiscountPrice (@OriginalPrice money, @Discount float)


RETURNS money
AS
BEGIN
RETURN @OriginalPrice * @Discount

308/312
END

Ha ltrehoztuk a fggvnyt, meghvhatjuk. A skalrfggvnyek meghvsa a


kvetkez:
tulajdonos.fggvnynv

Itt a tulajdonos a fggvnyt ltrehoz adatbzis-felhasznl neve, a fggvnynv


pedig a fggvny neve.

Helyben kifejtett tblartk fggvnyek


A helyben kifejtett (inline) tblartk fggvnyek table tpus objektumokat adnak
vissza, amelyeket egyetlen SELECT utasts tlt fel.Itt nincs BEGIN s END
utastsok kz zrt utastsblokk, a fggvny mindssze egy SELECT utastst
tartalmaz.
Plda egy helyben kifejtett tblartk fggvnyre:
/*Visszaadja a Products tbla azon sorait, amelyek UnitsInStock oszlopban a
paramterknt tadott jrarendelsi szintnl kisebb, vagy azzal egyenl rtk
szerepel. */

CREATE FUNCTION ProductsToBeReordered(@ReorderLevel int)


RETURNS table
AS
(
SELECT * FROM Products
WHERE UnitsInStock <= @REorderLevel
)

A skalrfggvnyektl eltren meghvsukkor nem kell feltntetnnk a


tulajdonost.

SELECT * FROM ProductsToReordered(10)

Tbbutastsos tblartk fggvnyek


Pldaprogram, mely visszaadja a Products tbla azon sorait, amelyek UnitsInStock
oszlopban a paramterknt tadott jrarendelsi szintnl kisebb, vagy azzal
egyenl rtk szerepel, s beszr egy j oszlopot Reorder nven:

CREATE FUNCTION ProductsToBeOrdered2(@ReorderLevel int)


RETURNS @MyProducts table
(
ProductId int,
ProductName nvarchar(40),
UnitsInStock smallint,
Reorder nvarchar(3)

309/312
)
AS
BEGIN
-- sorok kinyerse a Products tblbl s
-- beszrsuk a MyProducts tblba
-- a Reorder oszlop NO ra lltsa
INSERT INTO @MyProducts
SELECT ProductID, ProductName, UnitsInStock, NO
FROM Products;

-- a MyProducts tbla frisstse a Reorder oszlop


-- YES re lltsval, ha a UnitsInStock
-- kisebb, mint a @ReorderLevel, vagy azzal egyenl
UPDATE @MyProducts
SET Reorder = YES
WHERE UnitsInStock <= @ReorderLevel

RETURN
END

Ennek meghvsakor sem kell a tulajdonost feltntetnnk:


SELECT * FROM ProductsToBeReordered2(20);

Az SQL Server lehetv teszi, hogy az adatbzisokban eljrsokat troljunk. A trolt


eljrsok abban klnbznek a felhasznli fggvnyektl, hogy jval tbbfle
adattpust adhatunk vissza.
ltalban akkor ksztnk trolt eljrst, ha olyan feladatot kell elvgeznnk, ami
erteljesen ignybe veszi az adatbzist, vagy ha kzpontostani szeretnnk a
kdokat, hogy az egyes felhasznlknak ne kelljen ugyanarra a feladatra sajt
programokat rniuk. Az intenzv adatbzis-hasznlatra j plda lehet egy banki
alkalmazs, amelynek segtsgvel a szmlkat frisstjk a nap vgn,
kzpontostott kdra pedig akkor lehet szksg, ha a felhasznlk hozzfrst az
adatbzistblkhoz korltozni akarjuk.

Trolt eljrsok ltrehozsa:


Szksgnk lesz egy adatbzisra, pldul ProcedureTest nvvel, s egy tbla
nhny adattal.
CREATE TABLE Table01
(
value1 int,
value2 varchar(10)
)

Trolt eljrs ltrehozshoz a create procedure utastst kell hasznlnunk. Ezt


kveten adhatjuk meg az eljrs nevt, majd az AS utn jhet a T-SQL kd, hogy

310/312
mit is vgezzen el a ltrehozott eljrs. Ltrehozhatunk gynevezett loklis s
globlis ideiglenes eljrsokat is. A loklis csak a sajt kapcsolatban hasznlhat,
azt ms kvlrl ms nem tudja majd hasznlni, ezzel szemben a globlis eljrst
ms kapcsolatbl is hasznlhatjk. Fontos, hogy a loklis vltozatok automatikusan
trldnek a kapcsolat lezrsval, mg a globlisak csak akkor, ha mr minden
kapcsolat lezrsra kerlt.
Loklis ideiglenes eljrs ltrehozshoz az eljrs neve el tegynk egy # karaktert,
a globlisnl pedig ## karaktert.
Termszetesen paramtereket is adhatunk a trolt eljrsnak. Ezt az eljrs neve
utn tehetjk meg egy vesszvel elvlasztott felsorolsban. A paramternv mindig
egy @ jellel kezddik. A nv utn a paramter tpust adhatjuk meg. Ha olyan
paramtert szeretnnk megadni, melyen keresztl rtket is adnnk vissza, akkor a
tpus utn az OUTPUT jelzt kell rnunk.
Na de nzznk egy pldt:

create procedure Procedure01


@a int,
@b int
as
select convert(varchar(20), @a + @b)

Trolt eljrsok vgrehajtsa:


A trolt eljrsok vgrehajtsra az EXECUTE utastst hasznlhatjuk.

execute Procedure01 150, 50

Tbb eljrsnak adhatunk azonos nevet is, ezek kztt gy tudunk klnbsget
tenni, hogy a nv utn pontosvesszvel megadunk egy sorszmot. Ennek ott lesz
elnye, hogy ha trlni akarjuk az eljrsokat a DROP PROCEDURE utastssal,
akkor elegend megadni az eljrs nevt s annak sszes vltozata trlsre kerl.

create procedure Procedure01;2


as
select min(value1) as Minimum value1 , max(value1) as Maximum
value1 from Table01

Futtassuk az imnt ltrehozott eljrst:

execute Procedure01;2

Kioldk
A kioldk (trigger) olyan klnleges trolt eljrs, amelyet az adatbzis-kezel
automatikusan futtat, amikor egy meghatrozott INSERT, UPDATE vagy DELETE

311/312
utastst egy bizonyos adatbzistbln vgrehajtunk. A kioldk igen hasznosak
pldul akkor, ha egy tbla oszloprtkeinek vltozsait szeretnnk ellenrizni.
A kiold egy INSERT, UPDATE vagy DELETE utasts helyett is elindulhat.

A kioldkat a CREATE TRIGGER utastssal hozhatjuk ltre.

A Transact-SQL rl lthattunk egy rvid ismertett. A T-SQL segtsgvel olyan


SQL utastsokat tartalmaz programokat rhatunk, amelyekben a szokvnyos
programozsi szerkezetek is megtallhatk.
Az SQL Server szmos fggvnyt bocst a rendelkezsnkre, amelyekkel rtkeket
nyerhetnk ki az adatbzisokbl.
Az SQL Serverben sajt, gynevezett felhasznli fggvnyeket is kszthetnk.
Az SQL Server azt is lehetv teszi, hogy az adatbzisokban eljrsokat troljunk. A
trolt eljrsok abban klnbznek a felhasznli fggvnyektl, hogy jval tbbfle
adattpust adhatnak vissza. ltalban akkor hasznljuk, ha olyan feladatot kell
elvgeznnk, ami erteljesen ignybe veszi az adatbzist, vagy ha kzpontostani
szeretnnk a kdokat, hogy az egyes felhasznlknak ne kelljen ugyanarra a
feladatra sajt programokat rniuk.

312/312

You might also like