Professional Documents
Culture Documents
A C# Programozasi Nyelv A Felsioktatasban PDF
A C# Programozasi Nyelv A Felsioktatasban PDF
Programozs tanknyv
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.
1. bra
8/312
szmsorozat egyetlen gpi kd utastst (8B), valamint a paramtereit jelli: honnan
kell beolvasni az rtket az EAX regiszterbe (45,F4)).
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.
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).
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.
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.
FIZETES = 1034
ELETKOR = FIZETES+4
NYUGDIJAS = ELETKOR+2
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 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
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.
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.
ELJARASHIVAS kiiras
@kiiras:
VISSZATRS_A_HVST_K VET_UTASTSRA
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.
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 .
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.
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 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.
16/312
A negyedik fontos vltozs a vezrlsi szerkezetek bevezetse
17/312
Hrom-s-fl genercis programozsi nyelvek: OBJEKTUM
ORIENTLT 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.
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.
Objektum-orientlt nyelvek:
Futtat rendszerek
19/312
A futtats hromflekppen trtnhet:
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.
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
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.
2
http://www.microsoft.com/net/basics/whatis.asp
23/312
DOS-API Win16-API Win32-API dotNet-API
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.
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.
25/312
nyelvekben ez nem ennyire kttt. A rteg nem kevs vita utn elsimtotta ezeket, a
klnbsgeket.
26/312
- felhasznlhatjuk a programfejlesztshez az eleve adott Base Class Library
rendkvl szles szolgltats-rendszert, ami radiklisan cskkenti a
fejlesztsi idt
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");
}
}
1. bra
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!
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
//
}
}
}
using System;
namespace HelloVilag
{
class Class1
{
static void Main(string[] args)
{
// ...
// ide kell rnunk a program sorait
// ...
}
}
}
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!
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 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();
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.
4. bra
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
35/312
Feladatok:
36/312
Programozs tanknyv
IV. Fejezet
Alap I/O
Kirly Roland
37/312
Az alapvet Input/Output
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.
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.
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;
int i;
char c;
string s;
39/312
int k=0;
char c=a;
string z=alma;
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.)
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';
}
}
}
41/312
int d=2;
c=a+40;
k=(10+4)/2;
int y = (int)3.0;
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.:
Float_literal = 4.5f;
Long_literal = 4l;
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();
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.
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;
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();
}
}
}
Console.WriteLine("{1} {3}",i);
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();
}
}
}
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
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!
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();
}
}
}
ToBoolean()
ToByte()
ToChar()
ToString()
ToInt32()
ToDateTime()
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));
10=A, 11=B,,15=F.
Convert.ToChar(szamjegy+55);
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.
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.
Console.WriteLine("dtum :{0}",Convert.ToDateTime("2004/12/21"));
Console.WriteLine("datum + id : {0}
",Convert.ToDateTime("2004/12/21 1:10:10"));
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.
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
Tagads (negci) !
S (konjunkci) &&
VAGY (diszjunkci) ||
Tagads:
A !A
TRUE FALSE
FALSE TRUE
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
A feltteles utasts
if (logikai kifejezs)
{
igaz rtk esetn vgrehajtand utastsok
}
if (y > 20)
Console.Write("Igaz kifejezs");
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:
56/312
Console.Write("Kifejezs igaz, igaz esetn ");
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.
57/312
else
Console.WriteLine("A karakter nagybet.");
else
Console.WriteLine("A karakter nem bet");
}
58/312
Oldjuk meg az egytthatival adott msodfok egyenletet!
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
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).
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 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.
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):
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.
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);
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);
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);
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.
int i,ossz=0;
for (i=1; i<=100 ; i++ )
ossz = ossz + i;
Console.WriteLine(Az els 100 egsz szm sszege
={0},ossz);
ossz= 100*101 / 2;
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 );
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);
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);
int szam,i;
szam = Int32.Parse( Console.ReadLine() );
for (i=100; i>=szam ; i-- )
if (i % szam == 0) Console.WriteLine({0} ,i);
67/312
osztja az i-t. Valahnyszor tallunk ilyen i rtket, mindannyiszor kirjuk azt a
kpernyre.
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:
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!
70/312
Programozs tanknyv
VII. Fejezet
Vektorok!
Radvnyi Tibor
71/312
Vektorok kezelse
Tmb deklarlsa
Hasonlan trtnik, mint egy hagyomnyos vltoz, csak a [] jellel kell jelezni, hogy
tmb kvetkezik:
int[] tm;
vagy egyszeren:
int[] tm = new int[5];
72/312
int[] tm2 = new int[3] {3,4,5};
string[] stm2 = new string[3] {"els","msodik","harmadik"};
int i;
for (i = 0; i < 5; i++)
{
tm[i] = 1; // alaprtket ad a tm tmb elemeinek
}
73/312
A tmb elemeinek rendezse, keress a tmbben
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).
Deklarcija:
public static void Sort( Array keys, Array items);
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);
Deklarci:
public static void Sort(Array keys, Array items, int index, int
length);
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);
77/312
Vektor feltltse billentyzetrl
A futs eredmnye:
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
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:
sszegzs
Feladat: Adott egy 10 elem, egsz tpus tmb. Tltsk fel vletlen szmokkal, majd
hatrozzuk meg a szmok sszegt.
Megolds:
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.
Feladat: Adott egy 10 elem, egsz szmokat tartalmaz tmb. Tltsk fel vletlen
szmokkal, majd hatrozzuk meg a legnagyobb illetve legkisebb elem rtkt.
Megolds:
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:
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:
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
86/312
Feladatok dinamikus tmbre
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!
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;
}
88/312
class TSzakasz_kore : TKor
{
public TPont Kezd = new TPont();
public TPont Veg = new TPont();
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.
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...");
}
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:
91/312
Tbbdimenzis tmbk
Nzzk meg egy egyszer pldn keresztl a deklarcit. Tltsnk fel egy 3x3
mtrixot vletlen szmokkal s rassuk ki ket mtrix fromban a kpernyre.
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.
93/312
Ez futs kzben gy nz ki:
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 while ciklus
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.
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++;
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
Vegyk sorra, hogy mikor clszer logikai, vagy ms nven feltteles ciklusokat alkalmazni.
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 albbi kt formula kzl az els helyes eredmnyt produkl, a msodik viszont hibsat,
mivel abban szndkosan elrontottuk a zrjelezst.
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
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)
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);
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 (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.
107/312
Programozsi feladatok
108/312
Programozs tanknyv
IX. Fejezet
Radvnyi Tibor
109/312
Szelekci haladknak
Feladat:
110/312
Megolds:
switch (kifejezs)
{
case konstans1 kifejezs:
utasts1
ugrs
case konstans2 kifejezs:
utasts2
ugrs
case konstansn kifejezs:
utastsn
ugrs
[default:
utasts
ugrs]
}
111/312
Egy egyszer felhasznls:
112/312
Ugyanez feladat megoldhat konvertls nlkl, stringek felhasznlsval is:
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:
114/312
Els eset, amikor minden rendben
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;
string a = "hello";
string b = "h";
b += "ello";
s="A2347";
s="1234567890";
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");
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.
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();
}
}
}
120/312
felcserljk. Ilyenkor a fordt hibt jelez, mivel a karakterek nem kezelhetek stringknt s
fordtva.
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;
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();
}
}
}
122/312
A string-ek mint vektorok
string s=123456789;
for (i=0;i<s.Length;i++)
{
Console.WriteLine("{0}",s[i]);
}
Vagyis a kt tpus nem kompatibilis. Az rtkads akkor vlik helyess, ha az s[1] elemet
konvertljuk string-g.
s=s[1].ToString();
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.
123/312
s=123456
s=s.Insert(2,"ABCD");
12ABCD3456
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();
for (i=0;i<s.Length;i++)
{
Console.Write((char)(s[i]^key));
}
Console.ReadLine();
}
}
}
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.
125/312
Programozsi feladatok
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.
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");
}
128/312
Termszetesen van r lehetsg, hogy ne csak a Main()-bl hvjunk eljrsokat,
hanem az eljrsokbl is van lehetsg tovbbi eljrsokat hvni:
129/312
using System;
namespace Tetszoleges_Nev
{
class PeldaProgram
{
Ms eljrsok ...
static void Main(string[] args)
{
...
}
Tovbbi eljrsok ...
}
}
130/312
Ezt (hibsan) az albbi mdon reaglhatjuk le:
class PeldaProgram
{
static int a=0;
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!
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!
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!
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 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.
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;
}
//................................................................
}
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 fggvny ltrehoz egy int-ekbl ll, 10 elem tmbt a memriban, feltlti
elemekkel a billentyzetrl, majd visszaadja a feltlttt tmbt az t meghvnak:
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:
141/312
Programozs tanknyv
XIII. Fejezet
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.
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);
143/312
tpus vltozkra hivatkozhatunk. Ezen vltozk kezdrtkkel rendelkeznek, a
kezdrtkeket az aktulis paramterlistban adjuk meg.
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);
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.
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.
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.
Itt az x vltoz tpusa int[], ami megfelel a fogad oldali elvrsoknak, ezrt a fenti
eljrshvs tpusban megfelel, gy helyes is.
146/312
Feladatok:
147/312
Programozs tanknyv
XIV. Fejezet
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.
Pl.:
static void Kiiras(int a,int b)
{
Console.WriteLine("A {0}+{1}={2}",a,b,a+b);
a = a+b;
}
149/312
Amennyiben azonban a paramtertads-tvtel sorn tmbket adunk t, gy a
helyzet megvltozik:
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).
Az nyelvi alaptpusok (int, double, char, string, ) rtknek kpzsekor nem kell a
new kulcsszt hasznlni
int a = 10;
de a tmbknl igen:
150/312
Az rtk szerinti paramtertads sorn az rtk az tads pillanatban kt
pldnyban ltezik a memriban lemsoldik:
int x=12;
Kiiras(x);
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.
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.
Mivel a fggvny ugyanazt a memriacmet adja vissza, mint amit megkapott, ennek
nem sok rtelme ltszik. Figyeljk meg azonban a hvs helyt:
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:
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];
}
}
int x=0,y=0;
ParosElemek(tomb, ref x, ref y);
Console.WriteLine("A paros elemek db={0},
osszeguk={1}",x,y);
153/312
int x,y;
ParosElemek(tomb, ref x, ref y);
Console.WriteLine("A paros elemek db={0},
osszeguk={1}",x,y);
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];
}
}
int dbszam,summa;
ParosElemek(tomb, out dbszam, out summa);
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.
155/312
Programozs tanknyv
XV. Fejezet
WinForm
Radvnyi Tibor
Kirly Roland
156/312
A Windows Formok
Hibakezels
A try s a catch
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();
}
}
}
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;
}
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.
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;
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
unchecked
{
int a=2000000000000;
}
162/312
Programozsi feladatok
163/312
j Projekt ksztse
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.
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;
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 Form1()
{
InitializeComponent();
}
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.
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
170/312
A lthat komponensek, a kontrollok
Button (Gomb)
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
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:
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
174/312
ContentAlignment.MiddleRight igaztst hasznlja; klnben pedig a
ContentAlignment.MiddleLeft igazts lltja be.
Plda kd:
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.
175/312
Plda kd:
// A RadioButtonshozzadsa a GroupBoxhoz.
groupBox1.Controls.Add(radioButton1);
groupBox1.Controls.Add(radioButton2);
MainMenu
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:
menuItem1.Text = "File";
menuItem2.Text = "Edit";
// 2 MenuItem hozzadsa a MainMenuhz.
mainMenu1.MenuItems.Add(menuItem1);
mainMenu1.MenuItems.Add(menuItem2);
RadioButton
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:
ComboBox
179/312
Feladata: Adatok legrdl ablakban trtn megjelentse
Megjelens
Viselkeds
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
Tervezs
Esemnyek
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
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
182/312
Tekintsnk nhny alapmveletet a plda segtsgvel:
comboBox1.Items.Clear();
comboBox1.Text="";
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
Megjelens
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
Adat
Tag Teszleges clokra hasznlhat egsz rtk mez
184/312
Tervezs
Esemnyek
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
Megjelens
Viselkeds
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
Tervezs
Esemnyek
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
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
Megjelens
Megjelens
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
Tervezs
Esemnyek
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
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
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:
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:
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:
rtk kiolvassa:
this.lblDatum.Text = DateTimePicker1.Value.ToString();
Egyni formtum-string:
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)
MonthCalendar komponens
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):
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)
Dtum hozzads:
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;
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
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:
Listbox
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.
Panel
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;
panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
PictureBox
Image:
Sizemode:
pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;
201/312
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;
pictureBox1.SizeMode = PictureBoxSizeMode.Normal;
SizeModeChanged:
Timer komponens
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();
Az Interval hatrai:
NumericUpDown
Megjegyzs
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.
Kivtel
204/312
mg a UserEdit tulajdonsg false-ra van lltva, akkor a ValidateEditText metdust
hvja meg.
ProgressBar
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.
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.
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.
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.
LargeChange tulajdonsg
Adjon meg vagy lltson be egy rtket hozzadva vagy kivonva a Value
tulajdonsgbl, amikor a scroll boksz nagyobb tvolsgban mozdul el.
HelpProvider
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;
[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 = ",";
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.");
// 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 = "";
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
szrevtelek
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;
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);
}
212/312
base.Dispose( disposing );
}
213/312
}
}
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 ;
}
}
214/312
Tulajdonsgok
RichTextBox
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.
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);
}
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:
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.
Tulajdonsgok:
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
Publikus propertik
Publikus metdusok
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.
Public esemnyek
Protected property-k
Protected metdusok
Nyssuk meg a Windows Form Designerben azt a formot amihez hozz akarjuk adni
a ContextMenu-t.
221/312
A ContextMenu-t a formhoz vagy kontrollokhoz rendelhetjk a Properties ablakban
az objektumok ContextMenu property-jnek belltsval.
NotifyIcon
NotifyIcon-rl ltalban:
NotifyIcon rszei:
Public Konstruktor
Public Property-k
Public Esemnyek
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:
StatusBar rszei:
Public Konstruktor
223/312
Public Property-k
Public Esemnyek
224/312
ToolBar
A ToolBar-rl ltalban:
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
Public Property-k
226/312
Visible Lthat, nem lthat.
Public metdusok
Public esemnyek
227/312
Formok hasznlata, formok tpusai
Formok jellemzi:
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:
AbortRetryIgnore
Ok
OKCancel
RetryCancel
YesNo
YesNoCancel
Asterisk
Error
Exclamation
229/312
Hand
Information
None
Question
Stop
Warning
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.
231/312
A pldaprogramban a Nem modlis gombra kattintva rhetjk ezt el.
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.
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
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!)
Az C# nyelv vizulis rszben tallhat tbbi dialgus is hasonl mdon mkdik. Az albbi
tblzatban sszefoglaltuk a fontosabbakat.
Nyomtatsi kp printDialog
235/312
Fjl mentse saveFileDialog
ColorDialog
236/312
PrintPreviewDialog
237/312
Fjl megnyitsa s mentse
MessageBox
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
239/312
Tbbszl programozs
240/312
programokat. Az emltett knyv olvassa javasolt annak, aki a .NET rendszer
hasznlatt s finomsgait teljes mrtkben meg akarja ismerni!)
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;
}
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;
System.Threading.WaitCallback CF = new
System.Threading.WaitCallback(CelF);
System.Threading.ThreadPool.QueueUserWorkItem(CF ,P);
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
243/312
Programozs tanknyv
XVI. Fejezet
Grafikai alapok!
244/312
A grafikus szoftver
245/312
A Microsoft Paint programablakja
Jtkra fel!
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.
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.
Osztlyok s lersuk:
Sruktrk s lersuk:
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.
249/312
A GDI+ jdonsgai
Gazdagabb sznkezels s szntmenetek lehetsge
Gradient Brushes,azaz, lpcszetes szntmenet. Pldul lehetsg van egy
tglalap vagy ellipszis lpcszetes kitltsre:
Antialising tmogats
A GDI+ lehetsget biztost a szpsghibk javtsa, mint pl. a lpcshats.
250/312
Programrszlet:
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.
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.
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);
}
253/312
PNG (Portable Network Graphics)
TIFF (Tag Image File Format)
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);
}
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);
}
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) {}
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.
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
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).
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
.
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
262/312
A Bzier-grbe ellltsa Bernstein-polinommal
.
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
Harmadfo Bzier-grbk
n = 3 esetn a grbe Bernstein-polinom alakja:
A grbe rintje:
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:
Harmadfok Bzier-grbk
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:
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
268/312
A t tenzis rtk hatsa a grbe alakjra
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.
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.
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:
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
{
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);
}
274/312
Eltols:
Graphics.TranslateTransform(dx,dy);
Matrix myMatrix = new Matrix();
myMatrix.Translate(dx,dy);
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);
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)
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
myMatrix.Shear(k,0);
277/312
myMatrix.Shear(0,k);
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
282/312
j elemek ltrehozsa
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.
Connection String
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.
Tranzakcik
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.
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:
290/312
Kapcsolat bontsa
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
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.
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.
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.
OrderDate DESC
293/312
new object[] { id, string.Format("customer{0}", id) } );
}
customerTable.AcceptChanges();
string strExpr;
string strSort;
foundRows = customerTable.Select();
PrintRows( foundRows, "all rows" );
}
294/312
Console.WriteLine();
}
}
295/312
Az alaprtelmezett nzet
A RowFilter tulajdonsg
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.
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();
297/312
}
}
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();
}
}
// Clear Filter
ds.Tables[0].DefaultView.RowFilter = "";
// Re-Retrieve Data
RetrieveData();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
Console.WriteLine();
299/312
}
}
// rvnyestjk a rendezst
ds.Tables[0].DefaultView.Sort = strSort;
DataGrid.DataSource = ds.Tables[0].DefaultView;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
Console.WriteLine();
}
300/312
{
MessageBox.Show(ex.ToString());
Console.WriteLine();
}
}
301/312
Trolt eljrsok
Trolt eljrsok futtatsa, j trolt eljrsok ksztse, rgztse adatbzisban,
hasznlatba vtelk.
Mi is az a Transact-SQL?
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)
303/312
IF felttel1
BEGIN
Utastsok1
END
ELSE
BEGIN
Utastsok2
END
CASE utastsok
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:
304/312
A CONTINUE utasts
A BREAK utasts
Az utasts formja:
WAITFOR [DELAY idtartam | TIME jelenlegi id]
Nhny plda:
WAITFOR DELAY 00:00:06 - 6 msodpercig vr
WAITFOR TIME 10:02:15 - 10 ra 2 perc 15 msodperckor folytatja a
vgrehajtst
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
Use Northwind
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
Fggvnyek hasznlata
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
308/312
END
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;
RETURN
END
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:
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.
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.
312/312