Kovacs Hernyak c# Programozasi Tankonyv 2005 312 Oldal

Embed Size (px)

Citation preview

A C# programozsi nyelv a felsoktatsban Programozs tanknyv

Dr. Kovcs Emd Hernyk Zoltn Radvnyi Tibor Kirly Roland

1/312

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

2/312

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

3/312

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

4/312

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

5/312

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

6/312

Programozs tanknyv

I. Fejezet

Trtneti ttekint

Hernyk Zoltn

7/312

A szmtstechnika trtnetnek egyik fontos fejezete a programozsi nyelvek kialakulsa, trtnete, fejldse. A fejlds sorn a programozsi nyelvek szintaktikja vltozott meg, elsegtve a programozsi hibk minl korbban (lehetleg fordtsi idben) trtn felfedezst. Egy igazn j programozsi nyelven nagyon sok hibafajta eleve el sem kvethet, msok knnyen elkerlhetek. Egy j programozsi nyelv sokfle jellemzvel rendelkezik. Emeljnk ki nhnyat ezek kzl: - knnyen elsajtthat alapelvekkel rendelkezik, - knnyen ttekinthet forrskd, - knnyen mdosthat, bvthet a forrskd, - nehz hibt elkvetni kdols kzben, - knnyen dokumentlhat a kd. A programozsi nyelveket genercikba lehet sorolni a fejlds bizonyos szakaszait figyelembe vve:

Els genercis programozsi nyelvek:

GPI KD

A szmtgpek a NEUMANN elveknek megfelelen a vgrehajtand programutastsokat a memriban troljk. A memria ma mr alapveten byte szervezs, egyetlen nagy mret byte-sorozatnak tekinthet. Minden byte egy egsz szmot jellhet, 0..255 rtktartomnybl. Ebbl az kvetkezik, hogy a mikroprocesszor alapveten az utastsokat is szmoknak tekinti. A gpi kd programozsi nyelvben az utastsokat szmkdok jellik. Amennyiben az utastsnak vannak paramterei, gy azokat is szmknt kell megadni. A gpi kdban ltez fogalom a regiszter, amely a mikroprocesszoron belli trlrekeszt jell. Egy ilyen rekesz tartalma egy egsz szm lehet. A regisztereknek kttt nevk van, pl. AX, BX, CX, DX. A 32 bites processzorokon a regiszterek nevei felvettk az E eltagot (Extended AX regiszter EAX). Arnylag kevs regiszter ll rendelkezsre (kevesebb mint 20 darab), s tbbnek specilis feladat volt, ezrt nem lehetett akrmilyen clra felhasznlni. Kt szm sszeadst az albbi mdon kell vgrehajtani: 1. Olvassuk be az els szmot az EAX regiszterbe a memribl. 2. Az EAX regiszterhez adjuk hozz a msodik szmot. 3. Az eredmnyt (az EAX regiszter j rtkt) troljuk a memria egy msik pontjn.

1. bra Az utastsokat szmkdok jellik. Ezek a szmok 0..255 kztti egsz szmok. A szmkdokat leggyakrabban hexadecimlis formban adjk meg. A bal oldali oszlopban a memriacmeket adjuk meg (0044F02B,) ahol az adott gpi kd utastst troljuk. A gpi kd utastsok a msodik oszlopban vannak (a 8B45F4

8/312

szmsorozat egyetlen gpi kd utastst (8B), valamint a paramtereit jelli: honnan kell beolvasni az rtket az EAX regiszterbe (45,F4)). A fentieken is ltszik, hogy a gpi kd programozsi nyelv nehzkes, nehezen tanulhat. A ksz program nehezen megrthet, nem ttekinthet. Sok ms htrnya mellett kln kiemelend, hogy a gpi kd programokat alkot utastsok csak az adott mikroprocesszor szmra rthetek. Vagyis ms processzor esetn az utastskdok is msok. Nemcsak szmkdjukban klnbznek, hanem esetleg kevesebb vagy tbb utasts van, illetve ms-ms a paramterezse a hasonl feladat utastsoknak. Ha egy gpi kdban programoz szmra egy msik processzorra kellett programot rni, elszr mg el kellett sajttania a klnbsgeket. Nyilvn az alapelvek maradtak, de az utastsok klnbzsge sok nehzsget okozott. A programoz szemszgbl a gpi kdban trtn programozs nagyon lass folyamat. Aprlkosan lehet csak a programot felpteni. Az utastsok nagyon alacsony szintek voltak, egy egyszer sszeads mvelet is - mint lttuk a fenti pldn hrom utastsbl llt. Egy nagyobb rendszer elksztse olyan idignyes feladat lenne, hogy inkbb csak rvidebb, egyszer programokat ksztettek benne a programozk. Elnyei persze akadnak ennek a nyelvnek is: a gpi kd utastsok segtsgvel maximalizlhatjuk a programunk futsi sebessgt, vagy memria-kihasznltsgt (vagy mindkettt egyszerre), hiszen megktsek nlkl felhasznlhatjuk a mikroprocesszor minden lehetsgt, s szabadon hasznlhatjuk a memrit is.

Msodik genercis programozsi nyelvek:

ASSEMBLY

A gpi kd programozsi nyelv htrnyai miatt j nyelvet kellett kifejleszteni. Az ASSEMBLY nyelv els kzeltsben a megrthet gpi kd nyelve. Az utastsok szmkdjait nhny bets (2-3-4 bets) n. mnemonikokkal helyettestettk. Egy ilyen mnemonik (emlkeztet szcska) a gpi kd utasts jelentstartalmra utalt. Pldul a memria-tartalom beolvassa egy regiszterbe (bemozgats) az angol MOVE=mozgatni sz alapjn a MOV mnemonikot kapta. A kt szm sszeadsa az angol ADD=sszeadni mnemonikot kapta. Az 1. brn a harmadik oszlopban szerepelnek a gpi kd utastsok assembly nyelv megfeleli. A MOV utasts nnmagban nem lefordthat gpi kdra, hiszen azt is meg kell adni, hogy melyik memria-cm tartalmt kell betlteni melyik regiszterbe. Az utasts egyik lehetsges formja MOV EAX,. Ennek mr egyrtelmen megfelel egy gpi kd utastskd (mov eax = 8B), a memriacmet pedig a tovbbi szmkdok rjk le. Ennek megfelelen az assembly nyelv egy adott mikroprocesszor adott gpi kdjhoz kszlt el. Ezrt az assembly nyelv is processzor-fgg, de ezen a szinten jabb fogalmak jelentek meg:

9/312

Forrskd: az assembly nyelv programot a CPU nem kpes kzvetlenl megrteni s vgrehajtani. Az assembly nyelv programot egy szveges file-ban kell megrni (forrskd), majd le kell fordtani gpi kd, n. trgyprogramra (object code). Fordts: az a folyamat, amely kzben a forrskdot egy fordtprogram (compiler) gpi kd utastsok sorozatra transzformlja. Az assembly nyelv esetn ezt a fordtprogramot ASSEMBLER-nek neveztk. Az assembler vgigolvasta a forrskdot sorrl-sorra, e kzben generlta a gpi kd utastssorozatot - a mnemonikok alapjn ellltotta a megfelel gpi kd utasts szmkdjt. Az assembler nem bonyolult program, hiszen a fordts egyszer szablyok szerint mkdik. Az ASSEMBLER a forrskd feldolgozsa kzben egyszer ellenrzseket is elvgez. Amennyiben valamely mnemonikot nem ismeri fel (pl. a programoz elgpelte), akkor a fordtsi folyamat lell, az assembler hibazenettel jelzi a hiba okt s helyt a forrskdban. A forrskdban az olyan jelleg hibkat, melyek slyossga folytn a fordts nem fejezhet be fordtsi idben trtn hibnak nevezzk. Ennek oka ltalban a nyelv szablyai (szintaktikja) elleni vtsg, ezrt ezt szintaktikai hibnak is nevezzk. Az assembly nyelv programok forrskdja olvashatbb, mint a gpi kd, illetve knnyebben mdosthat. Az assembler a program szintaktikai helyessgt ellenrzi le, emiatt az els eszkznek is tekinthetjk, amelyet a programozk munkjnak segtsre (is) alkottak. A fordts ellenkez mvelete a de-compiling. Ennek sorn a gpi kd programvltozatbl a programoz megprblta visszalltani annak assembly nyelv eredetijt. Erre sokszor azrt volt szksg, mert az eredeti forrskd elveszett, de a programon mgis mdostani kellett. A gpi kd programok mdosthatsgnak nehzsgt jelzi, hogy az assembly-programozk mr nem voltak hajlandk kzvetlenl a gpi kdot mdostani, inkbb helyrelltottk az assembly forrskdot, abban elvgeztk a mdostsokat, majd jra lefordtottk (generltk) a gpi kd programot. Ez a mvelet persze nmi vesztesggel jrt hiszen a tnyleges eredeti assembly forrskdban tbbek kztt megjegyzsek is lehettek. Ezek a megjegyzsek a gpi kd vltozatba nem kerltek bele, ezrt visszalltani sem lehet ket. Ami viszont nagyon fontos lps a fordtprogramok megjelensvel megjelent az igny ezek intelligencijnak fejldsre!

Vltozk az assembly nyelvbenAz assembly programokban a memria-cmekre azok sorszmval lehetett hivatkozni. Egy 128Mb memrival szerelt szmtgpben 128*1024*1024 db

10/312

sorszmot lehet hasznlni, mivel a memria ennyi db byte-ot tartalmaz. A pldban ezek a sorszmok a [0 .. 134.217.727] intervallumbl kerlnek ki1. Az assembly programok sokszor tnyleges memriacmeket (sorszmokat) tartalmaztak szmkonstansok formjban. Ez sok szempontbl nem volt elg rugalmas: - A szmok nem hordozzk a jelentsket, nehezen volt kiolvashat a programbl, hogy a 1034-es memriacmen milyen adat van, mi az ott lv rtk jelentse. - A programban e memriacmek sokszor elfordultak. Ezrt a memriacmek nem voltak knnyen mdosthatak. - A memriacm alapjn nem dnthet el, hogy az ott trolt adat hny byte-ot foglal el, ugyanis a memriacm csak a memriabeli kezdcmet jelli. A helyzet javtsa rdekben a programozk elkezdtek konstansokat hasznlni a programjaikban. Ezeket a programok elejre sszefoglal jelleggel, tblzat-szer mdon rtk le: FIZETES ELETKOR NYUGDIJAS = 1034 = 1038 = 1040

Ezek utn az assembly programokban az ADD EAX,[1034] helyett (ami azt jelentette, hogy add hozz az [1034] memriacmen tallhat rtket az EAX regiszterben ppen benne lev rtkhez) azt rhattk, hogy ADD EAX,[FIZETES]. Ez sokkal olvashatbb forma, msrszt amennyiben a fizets rtkt mgsem az 1034-es memriacmen kellett trolni (vltozs), akkor egyetlen helyen kellett csak trni a program eleji tblzatban. Ez az egyszer s logikus meggondols indtotta el a vltoz fogalmnak fejldst. A fenti esetben a FIZETES volt az azonost, melyhez a programoz konstans formjban rendelt hozz memriacmet helyet a memriban. Mg fejlettebb assembler fordtk esetn a fenti tblzat az albbi formban is felrhat volt: FIZETES ELETKOR NYUGDIJAS = 1034 = FIZETES+4 = ELETKOR+2

Ebben az esetben mr kiolvashat volt a tblzatbl, hogy a FIZETES nvvel jellt memriaterlet 4 byte-os trol hely volt, hiszen ekkora memria-szakasz fenntartsa utn a kvetkez memriaterlet (ELETKOR elnevezssel) 4 byte-tal tvolabbi ponton kezddik. Ez a vltozat azrt is jobb, mert segti, hogy elkerljk kt trolterlet tfedst a memriban (tlapols). Megakadlyozni nem tudja, hiszen amennyiben a fizets trolsi ignye 8 byte lenne, akkor a fenti esetben az letkor mg tlgna a fizets1

128*1024*1024-1

11/312

trlhelynek utols 4 byte-jra. Ennek persze a programoz az oka, aki rosszul rta fel a tblzatot. Ha azonban a fizets trolsra 2 byte is elg lenne, akkor 2 byte-nyi felhasznlatlan terlet keletkezne a memriban (ami szintn nem szerencss). A fenti problmkon tl az assembler azt sem tudta ellenrizni, hogy a trlrekeszt megfelelen kezeli-e a programoz a ksbbiekben:MOV EAX, [FIZETES] MOV AX, [FIZETES] MOV AL, [FIZETES] // EAX 32 bites regiszter, 4 byte // AX 16 bites regiszter, 2 byte // AL 8 bites regiszter, 1 byte

A fenti utastsok mindegyike elfogadhat az assembly nyelv szintaktikai szablyai szerint. Az els esetben a megadott memriacmrl 4 byte-nyi adat kerl be az EAX nev regiszterbe. Msodik esetben csak 2 byte, harmadik esetben csak 1 byte. A memria-beolvasst ugyanis a fogad regiszter mrete befolysolja. Amennyiben a fizets 4 byte-on kerl trolsra, gy a msodik s harmadik utasts nagy valsznsggel hibs, hiszen mirt olvasnnk be a fizetst tartalmaz szmsorozatnak csak az egyik felt? Az ilyen jelleg hibkra azonban az assembler nem tudott figyelmeztetni, mivel szmra a FIZETES csak egy memriacm volt. A helyes kezelsre a programoznak kellett gyelnie. Az assembler nem is tudta volna ellenrizni a kdot ebbl a szempontbl, hiszen nem volt informcija arrl, hogy mit is rt a programoz fizets alatt. Ezt a plusz informcit hvjk a programozsi nyelvben tpusnak. A tpus sok mindent meghatroz. Tbbek kztt meghatrozza az adott rtk trolsi mrett a memriban. A tpus ismeretben a fenti tblzat felrhat az albbi formban: DWORD FIZETES WORD ELETKOR BYTE NYUGDIJAS A fenti tblzat szerint a FIZETES egy dupla-sz (DWORD), aminek helyignye 4 byte. Az ELETKOR egy szimpla sz (WORD), 2 byte helyigny. A NYUGDIJAS egy byte, aminek helyignye (mint a neve is mutatja) 1 byte. Amikor az ASSEMBLER-ek mr a fenti tblzatot is kezeltk, akkor mr kpesek voltak a trterlet-cmeket automatikusan kiosztani. Az els azonost cmhez kpest a primitv tpusnevek (dword, word, byte, ) trolsi ignyt ismervn automatikusan nveltk a memriacmeket, s adtak rtket az azonostknak. Ezek az rtkek tovbbra is memriacmek voltak, de az automatikus kioszts miatt a memriaterletek tlapolsnak eslye mg kisebbre zsugorodott. A fenti primitv tpusnevek mg nem jelltk az azonostk tnyleges tpust. A fordt mindssze a trigny-szksglet kiszmtsra hasznlta fel. A hibs kezels lehetsgt mg mindig megengedte, vagyis egy 4 byte-os helyigny rtknek mg mindig szabad volt az egyik felt beolvasni, s dolgozni vele.

12/312

Nem voltak finom tpusnevek. Nem volt char, bool, short int, unsigned short int tpusok. Ezek mindegyike 1 byte trolsi igny, csak ezen 1 byte-on hordozott informci jelentsben trnek el. Mivel a jelentst a fordt mg nem kezelte, csak egy olyan tpusnv volt, amelynek 1 byte volt a trolsi ignye. Ennek megfelelen ezt mg nem tekinthetjk tnyleges tpusnvnek, mindssze trolsi-igny nvnek. A vltoz ms komponenseinek (lettartam, hatskr) kezelse is hinyzott az assembly nyelvbl, s az assembler programokbl.

Vezrlsi szerkezetek az assembly nyelvbenAz assembly nyelv msik szegnyes tulajdonsga a vezrlsi szerkezetek hinya. Lnyegben csak az albbi vezrlsi szerkezetek tallhatak meg: Szekvencia: a program utastsainak vgrehajtsa a memriabeli sorrend alapjn trtnik. Felttlen vezrlstads (ugr utasts): a program folytatsa egy msik memriabeli pontra tevdik t, majd attl a ponttl kezdve a vgrehajts jra szekvencilis. Feltteles vezrlstads (feltteles ugr utasts): mint az egyszer ugr utasts, de az ugrst csak akkor kell vgrehajtani, ha az elrt felttel teljesl. Visszatrs az ugr utastst kvet utastsra (azon helyre, ahonnan az ugrs trtnt).

-

Ezekbl kellett sszerakni a programot. Egy egyszer elgazst ennek megfelelen az albbi mdon kellett kdolni:HA felttel AKKOR kirtkelse Ut1 UGRS_HA felttel HAMIS CIMKE1-re Ut2 UT1 KLNBEN Ut3 UGRS CIMKE2-re Ut4 @CIMKE1: HVGE folytats @CIMKE2: folytats felttel

UT2

UT3 UT4

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

13/312

ciklusok megtervezse s kdolsa is klnsen az egymsba gyazott ciklusok esete.

Eljrshvs az assembly nyelvbenAz assembly nyelv elvileg ad lehetsget eljrshvsra is az albbi formban:ELJARASHIVAS kiiras

@kiiras: VISSZATRS_A_HVST_K

VET_UTASTSRA

A kiiras itt valjban cmke (programsort jell nv), de megfelel az eljrsnv primitv fogalmnak. A nevestett cmkk egy j nvvlasztssal, nagyon sokat knnytenek a programkd olvashatsgn. A problma nem is itt rejtzik, hanem hogy az eljrsnak hogyan adunk t paramtereket? Illetve, ha ez nem eljrs, hanem fggvny, akkor hol kapjuk meg a visszatrsi rtket? Illetve honnan tudjuk, milyen tpus adattal, rtkkel tr vissza az adott fggvny? A fenti krdsekre a vlaszokat maga az assembly nyelv nem tartalmazza. Paramterek tadsra pldul tbb md is van csakgy mint a fggvnyek visszatrsi rtknek visszaadsra. Ezeket a lehetsgeket maga a gpi kd tartalmazza, s az assembly nyelv rtelemszeren tvette. A programozk szvesen fejlesztettek ltalnos, jra felhasznlhat eljrsokat s fggvnyeket, melyek segtsgvel a programok fejlesztsi ideje, s a tesztelsi ideje is alaposan lervidlt. De ezek egymssal val megosztsa a fenti akadlyok miatt nehzkes volt. Egy msik programoz ltal fejlesztett, nem megfelelen dokumentlt eljrs felhasznlsa a kdban nha tbb energia felemsztsvel jrt, mint jra megrni a szban forg eljrst.

Tbb modulbl ll programok az assembly nyelvbenA tbb modulra tagols azrt volt fontos, mert az assembly programok ltalban nagyon hosszak voltak, msrszt az akkori szmtgpek mg nagyon lassak voltak. Egy hossz forrskd fordtsa nagyon sok idbe kerlt. Ugyanakkor a program jelents rsze a fejleszts kzben mr elkszlt, azt a programoz nem mdostotta mivel a program mr msik pontjn jrt a fejleszts. Ezt a szakaszt jra s jra lefordtani az assemblerrel felesleges id s energiapocskols volt. Ezrt bevezettk a tbb modulbl trtn fordtst. Ekkor az assembler a fordtshoz egy listt kapott, hogy mely forrskd-fileokbl tevdik ssze a project. Az assembler a forrskd-modulokat egyenknt fordtotta le egy-egy trgykd (object) llomnyba. Amennyiben a forrskdon nem trtnt mdosts, gy azt az assembler egy gyors ellenrzssel szrevette, s nem generlta jra a hozz tartoz object kdot. gy 14/312

csak azon forrskdok fordtsa trtnt meg, melyek vltoztak az utols fordts ta. Miutn az assembler vgzett a forrskdok fordtsval, egy msik, specilis feladatot vgz program kvetkezett, a szerkeszt program (linker). A linker a sok apr kis trgykd alapjn ksztette el a mkdkpes programot . Ez jelentsen meggyorstotta a fordtst egyb htrnyok nlkl. St, a programozk gy az jra felhasznlhat, ltalnos eljrsaikat kln kis kd-gyjtemnyben troltk, s jabb project kezdse esetn eleve hozzcsatoltk a project forrskdlistjhoz. Ez tovbb erstette a vgyat az ltalnos cl eljrsok rsra, s egyms kztti megosztsra. De az assembly nyelv ez irny kpessgeinek hinya ebben tovbbra is komoly gtat jelentett.

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

Harmadik genercis programozsi nyelvek: NYELVEK

PROCEDURLIS

Az assembly nyelv hinyossgainak kikszblsre szlettek a harmadik genercis nyelvek. Az eljrsorientlt (procedurlis) nyelvek sok szempontbl elvi, szemlletbeli vltst kveteltek meg az assembly programozktl. A frissen felnvekv programoz nemzedk, akik nem hordoztak magukban rossz szoksokat s hibs beidegzdseket azonnal s gyorsan tvettk ezeket a szemlletbeli elrsokat.

Az els nagyon fontos vltozs az eljrs fogalmnak bevezetse.Az eljrs (s fggvny) nyelvi elemm vlt. Az eljrsoknak neve volt, s rgztett paramterezse (formlis paramterlista). Ez lerta, hogy az eljrs meghvsa sorn milyen adatokat, rtkeket kell az eljrs szmra tadni. Ezen tl a nyelv rgztette az tads mdjt is. Ezzel elhrult az ltalnos cl eljrsok rsnak legjelentsebb akadlya. Ugyanakkor, hasonl jelents lpsknt a fordtprogram az eljrs hvsakor ellenrizte, hogy a megadott sszes adatot tadjuk-e az eljrsnak (aktulis paramterlista). Ez jabb fontos mrfldk a fordtprogram intelligencijnak fejldsben.

A msik fontos vltozs a vltoz fogalmnak finomodsa:A vltoznak van: Neve (azonostja), ezzel lehet a kdban hivatkozni r.

15/312

- Tpusa (mely meghatrozza a memriabeli helyignyt, s trolsi (kdolsi) mdjt). - A tpus ezen tl meghatrozza az adott nev vltozval elvgezhet mveletek krt is (numerikus tpus vltozval vgezhet az oszts, szorzs, kivons, sszeads, ), mg logikai tpusval a logikai mveletek (s, vagy, xor, )). - A kifejezsekben szerepl adatok s vltozk tpusait a fordtprogram elemzi, sszeveti, s ellenrzi a kifejezs tpushelyessgt. - A programban lehetetlenn vlt a vltoz trhelynek rszleges kezelse (a vltoz rtkt reprezentl byte-ok csak egy rsznek kiolvassa, mdostsa). Ezzel is nagyon sok tipikus programoz hiba kiszrhetv vlt. - A vltozkat ltalban ktelezen deklarlni kellett. Ennek sorn a programoz bejelentette a fordtprogram szmra rthet formban, hogy az adott azonost (vltoznv) alatt mit rt (milyen tpust). A deklarci helye tovbbi informcikat jelent a fordtprogram szmra meghatrozza a vltoz lettartamt s hatskrt is. A vltoz lettartama: - statikus: a vltoz a program indulsnak pillanattl a futs vgig a vltoz folyamatosan ltezik, s vltozatlan helyen lesz a memriban. - dinamikus: a vltoz a program futsa kzben jn ltre s sznik meg (akr tbbszr is). A statikus vltozk fontosak az adatok megrzse szempontjbl. A fontos, sokig szksges adatokat statikus vltozkban troljuk. A dinamikus vltozk a memriaterlet gazdasgos felhasznlsa szempontjbl fontosak a vltoz csak addig legyen a memriban, amg fontos. Amint feleslegess vlt megsznik, s a helyre ksbb ms vltoz kerlhet.

A vltoz hatskre: - globlis: a program szvegben tbb helyen (tbb eljrsban is) elrhet, felhasznlhat. - loklis: a program szvegben a vltoz felhasznlsa helyhez kttt, csak egy meghatrozott programrszben (krlhatrolt szegmensben) hasznlhat fel. A globlis vltozk minden esetben statikusak is. A dinamikus vltozk pedig ltalban loklisak. A dinamikus vltoz ltrehozsa s megsznse ezen loklis terlethez ktdik amikor a program vgrehajtsa elri ezt a pontot, belp erre a terletre, akkor a vltoz automatikusan ltrejn. Amikor a program vgrehajtsa elhagyja ezt a terletet, akkor a vltoz automatikusan megsznik, helye felszabadul a memriban.

A harmadik fontos vltozs a tpusrendszer bvthetsgeA magas szint programozsi nyelvek eleve adott tpusokkal kszltek. A nyelvi alaptpusokbl tovbbi (felhasznl ltal definilt) tpusokat lehet kszteni. Ezen tpusok a meglv tpusok szktsei (felsorols tpus, rsztartomny-tpus), vagy sszetett algebrai adatszerkezetek is lehetnek (pl. struktrk, vektorok, listk, ).

16/312

A negyedik fontos vltozs a vezrlsi szerkezetek bevezetseAz assembly nyelv ugrutastsaibl megszervezhet vezrlsi szerkezetek krt cskkentettk, s rgztettk azokat: - szekvencia: az utastsokat a forrskdban rgztett sorrendben kell vgrehajtani. - szelekci: feltteles elgazs (pl. a ha akkor klnben szerkezetek). - iterci: adott programrsz ismtlse (elrt lpsszm ciklus, logikai felttelhez kttt ciklusok, halmaz alap ciklusok, ). A vezrlsi szerkezetek e formja ttekinthet, egyszer, knnyen olvashat kdot eredmnyez. Mills bizonytotta, hogy minden algoritmus kdolhat a fenti hrom vezrlsi szerkezet hasznlatval, gy az ugr utastsok szksgtelenn vltak. Termszetesen, amikor a fordtprogram a gpi kd vltozatot generlja, akkor a fenti szerkezeteket ugr utastsok formjban valstja meg hiszen a gpi kdban csak ezek szerepelnek.

Az tdik fontos vltozs a hardware fggetlensg.A procedurlis nyelvek mr nem processzor fggek. A fordtprogram ismeri az adott szmtgp processzornak gpi kdjt s a procedurlis nyelven megrt magas szint kdot az adott gpi kdra fordtja. Amennyiben a programot ms platformon is szeretnnk futtatni, gy a magas szint forrskdot az adott szmtgpre rt fordtprogrammal jra kell fordtani a forrskd brmilyen vltoztatsa nlkl.

A memriaterlet kiosztst a fordtprogam vgzi a vltoz-deklarcik alapjn. A program egy adott pontjn mindig egyrtelmen megadhat a vltoz hatskrk figyelembevtelvel, hogy mely vltozk rhetk el, s melyek nem. A dinamikus vltozk ltrehozst s megszntetst a fordtprogram ltal generlt kd automatikusan vgzi. A tpusokhoz tartoz trhely-ignyt a fordtprogram kezeli, kizrt a memria-tlapols s nem keletkeznek fel nem hasznlt memriaterletek. Emiatt nagyon sok lehetsges programozsi hiba egyszeren megsznt ltezni. Fennmaradt azonban egy nagyon fontos problma: a felhasznl ltal definilt tpusokhoz nem lehet opertorokat definilni, emiatt kifejezsekben nem lehet az j tpusokat felhasznlni. Vagyis a felhasznli adattpus kevesebbet r, mint a gyri, eleve ltez elemi tpus. Ezen a szinten a nyelv fejldse nem haladhatja meg ezt a pontot.

17/312

Hrom-s-fl genercis programozsi nyelvek: ORIENTLT NYELVEK

OBJEKTUM

Az objektum orientlt programozsi nyelvek (OOP nyelv) ezen a ponton jelentenek fejldst. A felhasznl sokkal egyszerbben s szabadabban ksztheti el a sajt tpusait. Meglv tpusok tovbbfejlesztsvel (rklds) kevs munkval kszthet j tpusokat. A sajt tpusaihoz (ltalban) kszthet opertorokat is (melyeknek jelentst termszetesen le kell programozni). Ezek utn a sajt tpus szinte minden szempontbl egyenragv vlik a nyelvi alaptpusokkal. A sajt tpusokhoz nem csak opertorokat rendelhet, hanem megadhat fggvnyeket s eljrsokat is, amelyek az adott tpus adatokkal vgeznek valamilyen mveletet. Mivel ezen fggvnyek s opertorok az adott tpushoz tartoznak, a tpus rszeinek tekintendk. Az egy tpusba sorolt adattrol vltozk (mezk), a hozzjuk tartoz mveletek s opertorok csoportjt (halmazt) osztlynak nevezzk. Egy OOP nyelvben teht szintn megtallhatak az eljrsok s fggvnyek, illetve a paramterek, vltozk. A vezrlsi szerkezetek is a megszokott hrom formra plnek (szekvencia, szelekci, iterci). Ezrt az OOP nyelvek inkbb csak szemlletmdban msok (melyik eljrst s fggvnyt hova rjuk meg), mint kdolsi technikkban. Ezrt az OOP nyelveket nem tekintik kln genercinak.

Negyedik genercis programozsi nyelvek: SPECIALIZLT NYELVEKA negyedik genercis nyelvek specilis feladatkrre kszlt nyelvek. Ezen nyelvek jellemzje, hogy nagyon kevs nyelvi elemmel dolgoznak, s nagyon egyszer, szinte mondatszeren olvashat utastsok fogalmazhatk meg. Erre j plda az SQL nyelv, amely elssorban adatbzis-kezelsre van felksztve.

tdik genercis programozsi nyelvek: MESTERSGES INTELLIGENCIA NYELVEKA mestersges intelligencia programozsi nyelvekkel elvileg az emberi gondolkods lersa trtnne meg, gyakorlatilag e nyelvek kutatsa, fejlesztse mg folyamatban van.

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

Imperatv (procedurlis) nyelvek:

18/312

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

Applikatv (funkcionlis) nyelvek:A funkcionlis nyelveken a kiszmoland kifejezst adjuk meg, megfelel mennyisg bemen adattal. A programoz munkja a kifejezs kiszmtsnak lersra szolgl. A program futsa kzben egyszeren kiszmtja a szban forg kifejezst. Egy funkcionlis nyelvben nincs vltoz, ltalban nincs ciklus (helyette rekurzi van). rtkad utasts sincs, csak fggvny visszatrsi rtknek megadsa ltezik. A funkcionlis nyelvek tipikus felhasznlsi terletnek a termszettudomnyos alkalmazsok tekinthetek.

Logikai nyelvek:Az ilyen jelleg nyelveken tnyeket fogalmazunk meg, s logikai lltsokat runk le. A program ezen kvl egyetlen logikai kifejezst is tartalmaz, melynek rtkt a programozsi nyelv a beptett kirtkel algoritmusa segtsgvel, a tnyek s szablyok figyelembevtelvel meghatroz. A logikai nyelvek tipikus felhasznlsi terlete a szakrti rendszerek ltrehozshoz kapcsoldik.

Objektum-orientlt nyelvek:Az OOP nyelveken a program mkdse egymssal klcsnhatsban ll objektumok mkdst jelenti. Az objektumok egyms mveleteit aktivljk, melyeket interface-ek rnak le. Ha egy mvelet nem vgrehajthat, akkor az adott objektum a hv flnek szabvnyos mdon (kivtelkezels) jelzi a problma pontos okt.

Futtat rendszerekA fordt programok ltal generlt trgykdokat a szerkeszt program nti vgleges formba. Az elkszlt futtathat programot ezen idpont utn az opercis rendszer kezeli, s futtatja.

19/312

A futtats hromflekppen trtnhet: Direkt futtats: a generlt kd az adott mikroprocesszor gpi kd utastsait tartalmazza. Ennek megfelelen az utastssorozatot az opercis rendszer egyszeren tadja a mikroprocesszornak s megadja a program kezd pontjt. A processzor e pillanattl kezdve nllan vgrehajtja a kvetkez utastst, kveti az ugrsi pontokat, rja s olvassa a memria hivatkozott terleteit anlkl, hogy tudn valjban mit csinl a program az adott ponton. A processzor felttlenl megbzik a programkdban, vita nlkl engedelmeskedik s vgrehajtja a soron kvetkez utastst. Ezen mdszer elnye a maximlis vgrehajtsi sebessg. Ugyanakkor jegyezzk meg, hogy a gpi kd szintjn nincs tpusfogalom, s szinte lehetetlen eldnteni, hogy az adott utasts a program feladata szempontjbl helyes-e, szksges-e, hibs-e. Mivel a memriban (a nagy byte-halmazban) az adatok terletn is byte-ok tallhatak, ezrt elvileg elkpzelhet, hogy a program vezrlse egy hibs ugr utastsnak ksznheten ttr egy ilyen terletre, s az adatokat gpi kd utastsokknt prblja rtelmezni. Ez persze valsznleg nem fog menni. Vagy valamely utasts paramterezse lesz rtelmezhetetlen, vagy egy olyan kdot fog tallni a processzor, amely nem rtelmezhet utastskdnak. Ekkor a processzor hibs mkds llapotra tr t, amely a szmtgp lellshoz (lefagys) is vezethet. A mai processzorok mr vdekeznek ez ellen, s ilyen esemny detektlsakor specilis hibakezel rutinok futtatsra trnek t. A hiba bekvetkezse ellen vdelmet jelent, hogy a mai programok elszeparlt terleteken troljk a programkdot, s az adatokat. A hibs ugrutasts emiatt felfedezhet, hiszen egy adatterlet belsejbe irnyul. A processzor mr ekkor lelltja a program futst, s ttr a hibakezel llapotra. Msik vdelmi mechanizmus szerint a kd-terlet nem rhat, csak olvashat. gy a processzor kpes felfedezni a hibs rtkad utastsokat, melyek egy mvelet eredmnyekppen kapott rtket egy olyan memriaterletre rn be, ahol utastskdok vannak. Ez meggtolja a programkd futs kzbeni mdostst (nmdost kd) amely egy idben igen elterjedt volt. Ma mr e mdszert inkbb csak a vrusok s egyb krtkony programok hasznljk.

Interpreterrel futtats: a fordtprogram ekkor nem generl kzvetlenl vgrehajthat gpi kd utastsokat, hanem egy kztes kdot, ahol az eredeti programozsi nyelv utastsai vannak szmkdokk tfordtva, a paramterei is mr feldolgozott, egyszerstett formban kdoltak. Ezt a trgykdot egy futtat rendszer (az interpreter) futs kzben utastsonknt elemzi, s hajtja vgre az elrt szablyok szerint. Az interpreteres rendszerekben a futtat rendszer a lefordtott kdot mg vgrehajts eltt elemzi, szksg esetn az utols pillanatban korriglja, pontostja azt (pl. vltozhivatkozsok). Ilyen rendszerekben az is megoldhat, hogy a vltozkat nem kell deklarlni explicit mdon a program szvegben. A futtat rendszer kitallja az

20/312

adott programsorhoz rve, hogy milyen vltozkra van szksge, s pontosan e pillanatban hozza csak ltre. Ezen kvl az is megoldhat, hogy a vltoz tpusa futs kzben derljn csak ki, vagy akr menet kzben tbbszr meg is vltozzon. A futtat rendszer az adott utastshoz rve ellenrzi hogy ott ppen milyen vltozk szksgesek, ellenrzi hogy azok pillanatnyi tpusa megfelel-e. Ha nem megfelel, akkor vagy lell hibazenettel, vagy trli a nem megfelel tpus vltozt s ltrehoz egy megfelel tpust helyette. Az interpreteres rendszerek sokkal rugalmasabbak. Egy adott utasts vgrehajtsa eltt ellenrizheti a szksges felttelek teljeslst, st, akr korriglhatja is a feltteleket, hogy megfeleljenek az utastsnak. Ezen rendszerek futtatsa sokkal biztonsgosabb. A felgyel interpreter idben lellthatja a fut programot, amennyiben azt nem tallja megfelelnek. Az interpreteres rendszerek vitathatatlan htrnya, hogy egyrszt lass a futtats, msrszt a generlt trgykd az adott programozsi nyelv szintaktikai lenyomatt hordozza, nem univerzlis. Egy ilyen trgykd-bl az eredeti forrskd ltalban szinte vesztesg nlkl helyrellthat, mg a vltoznevek s az eljrsnevek is visszallthatak. Egy adott nyelv interpretere (pl. a BASIC interpreter) nem kpes futtatni ms interpreteres nyelv fordtprogramja ltal generlt trgykdot.

Virtulis futtats: ez az interpreteres elv mdostst jelenti. A fordt nem direktben futtathat gpi kd programot generl, hanem egy nem ltez (virtulis) processzor virtulis gpi kdjra generl programot. Ezen gpi kd eltrhet a jelenlegi gpi kdtl, sokkal magasabb szint utastsokat tartalmaz, s sokkal tbb tpust ismer. Ezen nyelv interpreteres futtat rendszere (processzor-szimultor, virtulis gp) sokkal egyszerbb, hiszen a generlt kd alacsonyabb szint utastsokat tartalmaz, mint ltalban az interpreteres rendszerekben. A generlt kd mr nem felttlenl hasonlt, nem felttlenl hordozza az eredeti programozsi nyelv szintaktikai lenyomatt, belle az eredeti forrskd csak vesztesgesen llthat helyre (br sokkal kevesebb vesztesg rn, mint a gpi kdbl). A virtulis futtats elnye, hogy amennyiben egy programozsi nyelv fordtprogramja kpes e virtulis gpi kd program generlsra, gy a futtatshoz mr felhasznlhat a ksz futtat rendszer. Valamint ezen a virtulis nyelven generlt kd ms-ms processzoron is futtathat lesz, amennyiben az adott processzora is ltezik a futtat rendszer. A legismertebb ilyen nyelv a JAVA, ahol a futtat rendszert Java Virtual Machine-nak (JVM-nek) hvjk.

21/312

Programozs tanknyv

II. Fejezet

Bevezets A Microsoft.NETHernyk Zoltn

22/312

A Microsoft.NET-et (tovbbiakban dotNet) sokflekppen lehet definilni. A Microsoft honlapjn pldul az albbi meghatrozs szerepel: ez egy software technolgik halmaza, amely informcikat, embereket, rendszereket s eszkzket kapcsol ssze. Ez az j genercis technolgia a Web szolgltatsokon alapul kis alkalmazsokon, amelyek kpesek kapcsolatba lpni egymssal csakgy, mint nagyobb mret alkalmazsokkal az Internet-en keresztl.2 Msik lehetsges meghatrozs szerint a dotNet egy programfejlesztsi krnyezet, mely szmtalan hasznos szolgltatssal segti a programozk mindennapi munkjt.

Amikor egy programoz egy alkalmazs fejlesztsbe kezd, sok ms dolog mellett ismernie kell, s figyelembe kell vennie azt a krnyezetet, amelyben az alkalmazsa futni fog. A krnyezet egyik legfontosabb jellemzje az opercis rendszer. A dotNet egyfle szemszgbl nzve az opercis rendszert helyettesti elrejtvn, eltakarvn a tnyleges opercis rendszert a fejleszt ell. Az opercis rendszert egy programoz teljesen ms szempontbl nzi, mint egy felhasznl. A felhasznl szmra az opercis rendszer az, amibe be kell jelentkezni, alknyvtrakat s file-okat kezel, parancsokat lehet rajta keresztl kiadni akr karakteres felleten, akr egr segtsgvel. Ezzel szemben a programoz az opercis rendszert elssorban az API szempontjbl nzi: melyek azok a funkcik, feladatok, amelyeket az opercis rendszer elvgez a program feladatai kzl, s melyek azok, amelyeket nem. Az API Application Programming Interface rja le egy adott opercis rendszer esetn, hogy melyek azok a szolgltatsok, amelyeket az opercis rendszer eleve tartalmaz, s amelyeket a programoz a fejleszti munka sorn felhasznlhat. Ezen szolgltatsokat pl. a Windows a rendszer-knyvtraiban megtallhat DLL (Dynamic Link Library) file-okban trolja. Minden DLL tbb fggvnyt s eljrst tartalmaz, melyekre hivatkozhatunk a programjainkban is. E fggvnyek s eljrsok sszessgt nevezzk API-nak. Egy opercis rendszer API lersban szerepelnek a kvetkez informcik: - a fggvny melyik DLL-ben van benne, - mi a fggvny neve, - mik a paramterei, - a fggvnynek mi a feladata (mit csinl), - mik a lehetsges visszatrsi rtkek, - milyen mdon jelzi a fggvny a hibkat, stb A Microsoft-os vilgban az els ilyen API-t az els, ltaluk ellltott opercis rendszer tartalmazta. Ez volt a DOS. Ez nem tartalmazott tl sok elrhet szolgltatst lvn a DOS egy egyfelhasznls, egyfeladatos opercis rendszer.2

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

23/312

DOS-API Win16-API Win32-API dotNet-API A Win16-API sokkal tbb szolgltatst tartalmazott, lvn hogy az mr grafikus opercis rendszerrel, a Windows 3.1-el kerlt be a kztudatba. Ez mr nem csak a grafikus fellet miatt tartalmazott tbb felhasznlhat szolgltatst, hanem mivel ez egy tbbfeladatos opercis rendszer teljesen j terleteket is megclzott. A Win32-API a fejlettebb Windows opercis rendszerekben jelent meg, mint pl. a Windows 95. Ebben javtottak a tbbszl programok kezelsn, s bevezettek bizonyos jogosultsgi mdszerek kezelst is (s mg szmtalan mst is). A dotNet ezen szempontbl egy j API-nak tekinthet. Ez olyannyira igaz, hogy egy dotNet krnyezetben a programoznak semmilyen ms API-t (elvileg) nem kell ismernie. A dotNet (elvileg) ma mr tbb klnbz opercis rendszeren is kpes mkdni de a programoznak ezt nem kell felttlenl tudnia hiszen mr nem hasznlja az adott opercis rendszer API-jt, csak a dotNet-et ltal definilt fggvnyeket s eljrsokat. Tekintsk t a Microsoft.NET felptst:

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

24/312

A kvetkez szinten van a Common Language Runtime a kzs nyelvi futtat rendszer. Ez az egyik legrdekesebb rteg. A CLR lnyegben egy processzoremultor, ugyanis a dotNet-es programok egy virtulis mikroprocesszor virtulis gpi kd utastskszletre van fordtva. Ennek futtatst vgzi a CLR. A futtats maga interpreter mdban trtnik, ugyanakkor a dotNet fejlett futtat rendszere a virtulis gpi kd utastsokat futs kzben az aktulis szmtgp aktulis mikroprocesszornak utastskszletre fordtja le, s hajtja vgre. Az els ilyen elny, hogy a szban forg virtulis gpi kd nyelv tpusos, ezrt a programkd futtatsa kzben a memria-hozzfrseket ellenrizni lehet gy meggtolhat a helytelen, hibs viselkeds. Msrszt az utastsok vgrehajtsa eltt ellenrizni lehet a jogosultsgot is vagyis hogy az adott felhasznl s adott program esetn szabad-e vgrehajtani az adott utastst pl. hlzati kapcsolatot ltesteni, vagy file-ba rni. Ugyanakkor meg kell jegyezni, hogy egy JIT Compiler (JIT=Just In Time) gondoskodik arrl, hogy a vgrehajts megfelel hatkonysggal trtnjen. Ezrt egy dotNet-es program hatkonysga, futsi sebessge elhanyagolhatan kisebb, mint a natv kd programok. A msodik rteg tartalmazza a dotNet API nagyobb rszt. A Base Class Library tartalmazza azokat a szolgltatsokat, amelyeket egy dotNet-es programoz felhasznlhat a fejleszts kzben. Lnyeges klnbsg a megelz API-kal szemben, hogy ez mr nem csak eljrsok s fggvnyek halmaza, hanem struktrlt, nvterekbe s osztlyokba szervezett a sok ezer hvhat szolgltats. Ez nem csak ttekinthetbb, de hatkonyabb felhasznlhatsgot jelent egy, az objektum orientlt programozsban jrtas programoz szmra. A kvetkez rteg, az ADO.NET s XML a 21. szzadi adatelrsi technolgikat tartalmazza. Ezen technikk ma mr egyre hangslyosabbak, mivel a mai alkalmazsok egyre gyakrabban hasznljk fel e professzionlis s szabvnyos technikkat adatok trolsra, elrsre, mdostsra. A rtegek segtsgvel a programok a httrtrolkon kpesek adatokat trolni, onnan indulskor azokat visszaolvasni. A kvetkez rteg ktfel vlik aszerint hogy az alkalmazs felhasznli fellett web-es, vagy hagyomnyos interaktv grafikus felleten valstjuk meg. A Windows Forms tartalmazza azon API kszletet, melyek segtsgvel grafikus fellet ablakos, interaktv alkalmazsokat kszthetnk. A msik lehetsges vlaszts a WEB-es fellet, valamilyen browser-ban fut nem kifejezetten interaktv program rsa. Ezek futtatshoz szksges valamilyen web szerver, a kliens oldalon pedig valamilyen internetes tallz program, pl. Internet Explorer vagy Mozilla. A kvetkez rteg a Common Language Specification definilja azokat a jellemzket, melyeket a klnbz programozsi nyelvek a fejldsk sorn trtnelmi okokbl klnbz mdon rtelmeztek. Ez a rteg rja le az alaptpusok mrett, trolsi mdjt - belertve a string-eket - a tmbket. Fontos eltrs pldul, hogy a C alap nyelvekben a vektorok indexelse mindig 0-val kezddik, mg ms

25/312

nyelvekben ez nem ennyire kttt. A rteg nem kevs vita utn elsimtotta ezeket, a klnbsgeket. A CLS rteg fltt helyezkednek el a klnbz programozsi nyelvek s a fordtprogramjaik. A dotNet igazbl nem kttt egyetlen programozsi nyelvhez sem. A dotNet nem pl egyetlen nyelvre sem r, gy nyelvfggetlen. Elvileg brmilyen programozsi nyelven lehet dotNet-es programokat fejleszteni, amelyekhez ltezik olyan fordtprogram, amely ismeri a CLS kvetelmnyeit, s kpes a CLR virtulis gpi kdjra fordtani a forrskdot. A fenti kt kvetelmny betartsnak van egy nagyon rdekes kvetkezmnye: elvileg lehetsg van arra, hogy egy nagyobb projekt esetn a projekt egyik felt egyik programozsi nyelven rjuk meg, a msik felt pedig egy msikon. Mivel mindkt nyelv fordtprogramja a kzs rendszerre fordtja le a sajt forrskdjt gy a fordts sorn az eredeti forrskd nyelvi klnbsgei eltnnek, s a klnbz nyelven megrt rszek zkkenmentesen tudnak egymssal kommuniklni. A Microsoft a C++, illetve a Basic nyelvekhez ksztette el a dotNet-es fordtprogramot, valamint tervezett egy j nyelvet is, melyet C#-nak (ejtsd sz-sharp) nevezett el. Az j nyelv sok ms nyelv j tulajdonsgait tvzi, s nem hordozza magval a kompatibilits megrzsnek terht. Tiszta szintaktikjval nagyon jl hasznlhat eszkz azok szmra, akik most ismerkedek a dotNet vilgval. Ugyanakkor nem csak a Microsoft kszt fordtprogramokat erre a krnyezetre. Egyik legismertebb, nemrgiben csatlakozott nyelv a Delphi. A fentieken tl van mg egy olyan szolgltatsa a dotNet rendszernek, melynek jelentsgt nem lehet elgg hangslyozni: automatikus szemtgyjts. Ez a szolgltats a memria-kezelssel kapcsolatos, s a program ltal lefoglalt, de mr nem hasznlt memria felszabadtst vgzi. Ezt egy Garbage Collector nev programrsz vgzi, amely folyamatosan felgyeli a fut programokat. Ennek tudatban a programoznak csak arra kell gyelni, hogy memrit ignyeljen, ha arra szksge van. A memria felszabadtsrl nem kell intzkednie, az automatikusan bekvetkezik. Ha megprblnnk sszegezni, hogy mirt j dotNet-ben programozni, az albbi fbb szempontokat hozhatjuk fel: - az alkalmazs opercis rendszertl fggetlen lesz - fggetlen lesz az adott szmtgp hardware-tl is, gondolvn itt elssorban a mikroprocesszorra - nem kell j programozsi nyelvet megtanulnunk ha mr ismernk valamilyen nyelvet (valsznleg olyan nyelven is lehet .NET-ben programozni) - kihasznlhatjuk az automatikus memria-menedzsels szolgltatsait (Garbage Collector)

26/312

-

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

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

27/312

Programozs tanknyv

III. Fejezet

Hell Vilg!

Hernyk Zoltn

28/312

Majd minden programoz ezzel a kedves kis programmal kezdi a programozstanulst: rjunk olyan szmtgpes programot, amely kirja a kpernyre, hogy hell vilg (angolul: Hello World). Ezen program elhreslt pldaprogram ezzel kezdjk ht mi is ismerkedsnket ezzel a klns, nha kiss misztikus vilggal.class Sajat { static void Main() { System.Console.WriteLine("Hello Vilg"); } }

A fenti pldaprogramot ksztsk el egy tetszleges editor programmal (akr a jegyzettmb is megfelel) HelloVilag.CS nven, majd command prompt-bl fordtsuk le a kis programunkat: csc HelloVilag.cs parancs kiadsa segtsgvel. A csc.exe a C-Sharp compiler - a merevlemezen a Windows rendszerknyvtrban, a C:\WINDOWS\Microsoft.NET\Framework\ alknyvtrban tallhat, ahol a helyben a dotNET Framework verziszmt kell behelyettesteni (pldul: v1.1.4322). Amennyiben a szmtgp nem ismeri fel a csc programnevet, gy vagy rjuk ki a teljes nevet, vagy vegyk fel a PATH-ba a fenti alknyvtrat. A fenti parancs kiadsa utn ugyanazon alknyvtrban, ahova a program szvegt is lementettk, elkszl egy HelloVilag.exe futtathat program is. Elindtva e kis programot, az kirja a kpernyre a kvnt dvzl szveget. Nos, ezen mdja a programksztsnek nagyon kkorszaki. Nzzk, milyen mdon kell ezt csinlni a 21. szzadban Els lpsknt indtsuk el a Microsoft Visual Studio.NET fejleszti krnyezetet, majd a File/New/Project menpontot vlasszuk ki:

1. bra A felbukkan prbeszdablak arra kvncsi, milyen tpus program rst kvnjuk elkezdeni:

29/312

2. bra A fenti prbeszdablak minden pontja roppant fontos! Els lpsknt a bal fels rszen hatrozzuk meg, milyen nyelven kvnunk programozni (ez C#). Msodik lpsknt adjuk meg, milyen tpus programot akarunk fejleszteni ezen a nyelven. Itt a sok lehetsg kzl egyelre a Console Application-t, a legegyszerbb mkdsi rendszer programtpust vlasztjuk ki. Harmadik lpsknt a Location rszben adjuk meg egy (mr ltez) alknyvtr nevt. Negyedik lpsben vlasszuk ki a kszl program nevt a Name rszben. Mivel e program tbb forrsszvegbl fog majd llni, ezrt a Studio kln alknyvtrat fog neki kszteni. Ezen alknyvtr neve a Location s a Name rszbl tevdik ssze, s a Project will be created rszben ki is van rva, jelen pldban ez a C:\Programjaim\HelloVilag alknyvtr lesz! Az OK nyomgombra kattintva rvid idn bell nagyon sok minden trtnik a httrben. Ezt egy Windows Intz indtsval azonnal tapasztalhatjuk, ha megtekintjk a fenti alknyvtr tartalmt. Tbb file is generldott ebben az alknyvtrban. De trjnk vissza a Studio-hoz!

30/312

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

A generlt program nagyon sok sort kitrlhetnnk, s akit zavarnak a programban lv felesleges programsorok azok tegyk is meg btran (csak ne vgezzenek flmunkt!). Mire figyeljnk? A programunk utastsokbl ll. Egyelre jegyezzk meg a kvetkez fontos szablyt: minden programutastst a Main fggvny belsejbe kell rni! Sehova mshova! A Main fggvny belsejt a Main utni kezd kapcsos zrjel s a zr kapcsos zrjel jelzi!

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

Koncentrljunk most a valdi problmra: a programnak ki kell rnia a kpernyre a Hell Vilg szveget! Vigyk a kurzort a Main fggvny belsejbe, s a hinyz sort (System.Console.WriteLine("Hello Vilg");) gpeljk be.

31/312

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

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

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

Mris van egy problmnk: a program elindul, rvid idre felvillan egy fekete szn kis ablak, esetleg elolvashatjuk a kirst, de csak ha elg gyorsak vagyunk, mert az ablak azonnal be is csukdik! Mirt? A vlasz: a program egyetlen utastst tartalmaz: a szveg kirst. Mivel a program ezt mr megtette, ms dolga nincsen, ezrt gy a futsa be is fejezdik. s ha a program mr nem fut, akkor bezrdik az ablak! A megolds is erre fog plni: adjunk mg dolgot a programnak, hogy ne fejezdjn be azonnal! Els mdszer: utastsuk arra, hogy vrjon valamennyi id elteltre. A szban forg utasts:System.Threading.Thread.Sleep(1000);

32/312

Ezen utastsnak zrjelben (paramterknt) ezredmsodpercben kell megadni a vrakozs idejt. A megadott rtk (1000) ppen 1 msodpercnyi vrakozst jelent. A Sleep=aludni jelentse konkrtan annyi, hogy a program jelen esetben 1 msodpercre elalszik, e kzben nem trtnik semmi (mg csak nem is lmodik), de a kvetkez utastst majd csak egy msodperc letelte utn fogja vgrehajtani a szmtgp! Lnyeges, hogy hova rjuk ezt a sort! A szably rtelmben a Main fggvny belsejbe kell rni. De milyen sorrendben? A programozs tanuls legjobb mdszere a prblkozs! Prbljuk meg a kirs el berni!static void Main(string[] args) { System.Threading.Thread.Sleep(1000); System.Console.WriteLine("Hello Vilg"); }

Indtsuk el a programot, s gondolkozzunk el a ltottakon: a kis ablak elbukkan, kis ideig nem trtnik semmi, majd felvillan a kirs, s azonnal bezrdik az ablak. Prbljuk meg fordtott sorrendben:static void Main(string[] args) { System.Console.WriteLine("Hello Vilg"); System.Threading.Thread.Sleep(1000); }

A kirt szveg megjelenik, eltelik egy kis id (1 msodperc), majd bezrdik az ablak. Mirt? A szmtgp a program sorait nem akrmilyen sorrendben hajtja vgre. Van egy nagyon fontos szably: az utastsokat ugyanabban a sorrendben kell vgrehajtani, amilyen sorrendben a programoz lerta azokat. Ezt azt elvet ksbb pontostjuk, s elnevezzk szekvencia-elvnek. Program elindul (ablak megnylik) WriteLine vgrehajtsa (a szveg kirdik a kpernyre) Sleep vgrehajtsa (a program vr 1 msodpercet) Program befejezdik (az ablak bezrdik)

33/312

Persze felmerl a krds, hogy 1 mp elg-e? Nvelhetjk az idt persze az rtk tlltsval. De mennyire? Ez a megolds nem elg rugalmas. Nha tbb idt kellene vrni, nha kevesebbet. Keressnk ms megoldst:System.Console.ReadLine();

A Sleep-es sort cserljk le a fenti sorra. Prbljuk elindtani a programot. Mit tapasztalunk? Hogy az ablak nem akar bezrdni! ssk le az Enter billentyt s ekkor az ablak bezrdik. Mi trtnt? Az ablak akkor zrdik be, amikor a program futsa befejezdik. Ezek szerint a program mg futott, azrt nem zrdott be! Mivel most sszesen kt utastsunk van (a WriteLine, s a ReadLine), melyik utasts miatt nem fejezdtt be a program? Az nem lehet a WriteLine, mert a szveg mr kirdott a kpernyre, ez az utasts vgrehajtsa teht mr befejezdtt! Ekkor csak a ReadLine utasts maradt. Nos, a ReadLine utastst alapveten akkor hasznljuk majd, ha adatot krnk be a billentyzetrl. Az adatbevitelt az Enter letsvel jelezzk, ezrt a ReadLine mindaddig nem fejezdik be, amg le nem tjk az Enter-t. Megjegyzs: a megolds azrt nem tkletes, mert br a ReadLine elltja a feladatt, de sajnos az Enter letse eltt lehetsgnk van brmilyen szveget begpelni, s ez elrontja a dolog szpsgt. De egyelre ez a mdszer lesz az, amit hasznlni fogunk. Kerljnk kzelebbi kapcsolatba a programmal, s a programozssal! Figyeljk meg lpsrl lpsre a mkdst! Ehhez ne az F5 billentyvel indtsuk el a programot, hanem az F11 billentyvel (vagy a Debug/Step into menponttal):

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

34/312

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

5. bra A szveg fordtsa: A forrskd megvltozsa nem fog jelentkezni a program futsban, amg azt jra nem indtja. Ha folytatja a futtatst, a forrskd s a fut program nem fog megegyezni. Ez azt jelenti, hogy ha pl. trjuk a szveget Hell Vilg!-rl Hell Mindenki-re, s folytatjuk a program futtatst, akkor is mg az eredeti Hell Vilg fog kirdni. Ennek oka az, hogy amikor elkezdtk a programot futtatni (az els F11 letsvel), a Studio rgztette az llapotot (a forrskd akkori tartamt), s a kzben bekvetkezett vltozsokat nem fogja figyelembe venni. Ez azrt nagy gond, mert mi a forrskdban a mr megvltozott szveget ltjuk, s esetleg nem rtjk, hogy mirt nem az trtnik, amit ltunk, ha vgrehajtjuk a kvetkez lpst! A Restart lenyomsval lellthatjuk a program futtatst, vagy a Continue lenyomsval dnthetnk gy is, hogy a vltozs ellenre folytatjuk az eredeti program futtatst. A program futtatst egybknt brmikor megszakthatjuk a Debug/Stop debugging menponttal, vagy a Shift-F5 letsvel. A fenti mdszert fknt akkor hasznljuk, ha a program nem gy mkdik, ahogyan azt szeretnnk, vagy csak nem rtjk annak mkdst teljes mrtkben. E mdszert nyomkvetsnek hvjuk (angolul debugging), jelen esetben lpsenknti programvgrehajtst vgznk. Ksbb jabb mdszerekkel s technikkkal bvthetjk ez irny tudsunkat.

35/312

Feladatok:1. Programozsi feladat: rassuk ki a kpernyre a csaldfnk egy rszt, pl. az albbi formban: Kis Pl (felesge: Nagy Borbla) Kis Jzsef Kis Aladr (felesge: Piros va) Kis Istvn Kis Pl 2. Programozsi feladat: rassuk ki a kpernyre az eddig megismert C# parancsokat, s rvid lersukat, pl. az albbi formban: *** WriteLine *** Kir egy szveget a kpernyre. *** ReadLine *** Vr egy ENTER letsre. *** Sleep *** Vrakozik a megadott idig.

36/312

Programozs tanknyv

IV. Fejezet

Alap I/OKirly Roland

37/312

Az alapvet Input/OutputAz alapvet input- output, vagyis a Konzol alkalmazsok ki- s bemenetnek trgyalshoz elsknt meg kell ismernnk nhny C#-ban hasznlatos vltoz tpust. A vltozk, a vltoz tpusok ismerete nagyon fontos, brmely programozsi nyelvet szeretnnk elsajttani, mivel a programban hasznlt adatokat vltozkban s konstansokban tudjuk trolni. A program ezekkel szmol, s segtsgkkel kommunikl a felhasznlval. A kommunikci a programozsi nyelvek esetben krlbell azt jelenti, hogy adatokat olvasunk be a billentyzetrl, s a munka vgeztvel a kapott eredmnyt kirjuk a kpernyre. Minden vltoznak van neve, vagy ms nven azonostja, tpusa, s tartalma, vagyis aktulis rtke. Ezeken kvl rendelkezik lettartammal s hatskrrel. Az lettartam azt jelenti, hogy az adott vltoz a program futsa sorn mikor s meddig, a hatkr azt adja, hogy a program mely rszeiben hasznlhat. A vltozk nvnek kivlasztsa sorn gyelnnk kell a nyelv szintaktikai szablyainak betartsra. Az albbiakban megvizsglunk nhny pldt a helyes s helytelen nvadsokra:Valtozo valtozo Valtoznv szemely_2_neve int alma#fa 10szemely

Az els ngy nvads helyes. Vegyk szre, hogy a valtozo s a Valtozo azonostk kt kln vltozt jellnek, mivel a C# nyelv rzkeny a kis-nagybetk klnbsgre. Az angol terminolgia ezt Case- sensitive nyelvnek nevezi. A negyedik elnevezs helytelen, mivel az int foglalt kulcssz. Az tdik nvben a # karakter szerepel, ami nem hasznlhat. Az utols elnevezs szmmal kezddik, mely szintn hibs. A vltozkat a programban bevezetjk, vagyis kzljk a fordt rendszerrel, hogy milyen nvel milyen tpus vltozt kvnunk hasznlni a programban. Ezt a folyamatot deklarcinak nevezzk.valtozo_nev tipus;

38/312

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

A vltozk a memriban troldnak, vagyis minden azonosthoz hozzrendeljk a memria egy szelett, melyet a rendszer lefoglalva tart a vltoz teljes letciklusa alatt. (Nhny vltoz tpus esetn, mint a pointerek, valamivel bonyolultabb a helyzet, de a .NET rendszerben nem kell trdnnk a memria kezelsvel, mivel a .NET felgyeli, lefoglalja s felszabadtja a memrit.) Vizsgljunk meg nhny, a C# nyelvben hasznlatos, egyszer tpust!tpus byte int Mret 1 byte 4 byte rtktartomny 0 tl 255 ig -2,147,483,648 2,147,483,647 ig float 4 byte 1.5 10 3.4 10 double 8 byte45

A tpusban trolhat adatok Eljel nlkli egsz szmok tl eljeles egsz szmok

tl Vals(lebegpontos) szmok ig tl Vals(lebegpontos) szmok

38

5.0 10 1.7 10

324

308

ig tl Vals(lebegpontos) szmok ig True, false rtkek Unicode karakterek Karakterlncok

decimal

16 byte 1.0 1028 7.9 1028

bool char string

1 byte 2 byte -

true/false U+0000 tl U+ffff ig

A tblzatban felsorolt tpusokkal deklarlhatunk vltozkat. Az albbi plda bemutatja a deklarci pontos szintaktikjt.int i; char c; string s;

A vltozinkat kezdrtkkel is ellthatjuk. A kezdrtk adsa azrt is fontos, mert az rtk nlkl hasznlt vltozk kifejezsekben val szerepeltetse esetn a fordt hibt jelez.

39/312

int k=0; char c=a; string z=alma;

A kvetkez program bemutatja, hogyan lehet a vltozkat deklarlni, s kezdrtkkel elltni. A kpernyn nem jelenik meg semmi, mivel kir s beolvas utastsokat nem hasznlunk. Ezeket a fejezet ksbbi rszeiben trgyaljuk.namespace deklaracio { class valtozok_ { [STAThread] static void Main(string[] args) { int r=0; float h,l; int a=0,b=1,c=0; int d=a+b; int k=a+10; float f; char ch; char cr='a'; bool bo=true; bool ba; string s1; string s2="Hello!"; } } }

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

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

40/312

A kvetkez pldban lthatunk nhny rossz deklarcit. (- hogy a programozs sorn ne kvessnk el hasonl hibkat.)int a="alma"; az int tpus nem kompatibilis a string konstanssal string f=2; az s vltozba szmot akarunk elhelyezni int class=10; a class foglalt sz int void=10; a void az eljrsoknl hasznlatos cimke

A kvetkez plda megmutatja, hogy a programjaink mely rszeiben deklarlhatunk.using System; namespace AlapIO { class IO_ { int a,b; int d=10; char c; bool t,f=false; string s; int y = (int)3.0; [STAThread] static void Main(string[] args) { int l; string s="ez egy string konstans"; int a = 12; int b = a + 10; bool t = true; bool f = !t; char c = 'a'; } } }

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

41/312

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

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

hibauzenet_1 = Helytelen rtkads; max_Db = 20;

A literlok alaprtelmezs szerint int tpusak, ha egszek, s double, ha valsak. Amennyiben float tpust szeretnnk kszteni, az rtk utn kell rni az f karaktert, long tpus esetn az l, illetve ulong esetn az ul karakterprt, stb.Float_literal = 4.5f; Long_literal = 4l;

A C# programokban llandkat, vagy ms nven konstansokat is definilhatunk. A konstansok a program futsa alatt megrzik rtkket, s nem lehet felldefinilni ket, illetve rtkad utastssal megvltoztatni rtkket. Ms nyelvektl eltren, itt a konstansnak is van tpusa.

const int a=10; const string s=string tpus konstans;

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

A Console.Write() s a Console.WriteLine() a kirsra, mg a Console.Read() s a Console.ReadLine() a beolvassra hasznlhat. A beolvass azt jelenti, hogy az n.: standard input stream rl

42/312

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

public static string ReadLine(); public static int Read();

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

bejegyzs utn felvesszk a kvetkez mdon:

using System;

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

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

Ahhoz, hogy hasznlni tudjuk a Consol metdusait, meg kell vizsglnunk nhny pldt. A kvetkez program bemutatja a beolvass s a kirs mechanizmust.using System; namespace ConsoleApplication7 { class Cl