C# tanfolyam I. A.Net keretrendszer, programozási technikák és alapismeretek
.Net keretrendszer I. A.Net keretrendszer ötlete visszanyúlik egészen a Windows 2000 idejéig. Mikor is rájöttek, hogy az új kernel alapú operációsrendszerekben érdemesebb lenne egy dinamikus futtatókörnyezetet kialakítani, az addigi belső feldolgozás helyett. Az ötlet nem volt egyedi, a Java programozási nyelv már régen alkalmazta a technológiát.
.Net keretrendszer II. A rendszer létrejöttével leegyszerűsödtek addig igen komplikált funkciók: Frissítés Az új.net alapú rendszer frissítéséhez nem kell a rendszermagban módosítani. Fordítás Mikor egy programot fordít a rendszer, nem kell a futtatókörnyezetet is a programba fordítani (mint pl.: Borland Delphi esetén) hiszen az a gépen van.
.Net keretrendszer III. Így a.net keretrendszerbe fejlesztett program bármilyen rendszeren képes futni, ahol a keretrendszer telepítve van Ezzel elérhető a platform függetlenség Hiszen a program nem végleges kódot, hanem úgynevezett köztes kódot tartalmaz, mely már ellenőrzött, szintaktikailag elfogadott, és a keretrendszer tudja fordítani a program elindításakor. A keretrendszer pedig akár több operációs rendszeren is működhet.
Köztes nyelv I. Köztes nyelvnek nevezzük azt a kódot, ami a mi általunk begépelt programkódból keletkezik a Visual Studio fordítása után. IL, CIL, MSIL Intermediate Language Common Intermediate Language Microsoft Intermediate Language
Köztes nyelv II. Tehát elkészült alkalmazásaink még önmagukban (a keretrendszer nélkül) nem futtathatók. A keretrendszer pedig ezt a köztes kódot fordítja natív kódra, mely már a processzor nyelve (Assembly) melyet az operációs rendszer futtat a gépen A Keretrendszer fordítója: Common Language Runtime Execution Engine
Programfordítási folyamat I. C# fordítóprogram.net futtatókörnyezet A.NET keretrendszerre C# nyelven megírt forráskód A forráskód lefordítása után előállt köztes (IL) kód Amennyiben az elkészült programot x86 processzoron futtatjuk, az alábbi natív gépi kód készül el, majd fut le
Programfordítási folyamat II. Természetesen mivel a programunk nem végleges kódot tartalmaz a felhasználó gépének a feladata előállítani a natív futtatható kódot. Ez természetesen több energiát igényel és időveszteség is felléphet indítás közben, azonban a fordító megjegyzi, hogy melyik részek lettek lefordítva a kódból, így ha újra arra a részre van szükség, azt már nem kell újra lefordítani.
Programfordítási folyamat III. A fordítót JIT-nek hívuk (Just In Time) Compiler, hiszen a program futása közben fordítja a kódot. Természetesen a JIT Compiler ereje az Objektum Orientált Programozásban (OOP) rejlik.
Programozási technikák Programozási technikák
Programozási technikák I. Alapvetően 2 fajta programozási technikát különböztetünk meg: Monolitikus programozás Moduláris programozás Strukturált/Procedurális programozás Objektum Orientált Programozás
Monolitikus Programozás Ez a technika manapság még a script nyelvekben fordul elő. Line by Line programozásnak is nevezzük. Lényege, hogy valójában a parancsokat egymás után felsoroljuk. Egy életbeli példa: Csap kinyit Mosogat Csap elzár
Moduláris Programozás A programozás a kezdetektől fogva hatalmas kódot eredményezett, azonban az ember képtelen hatalmas kódot áttekinteni, pláne módosítani, javítani. A moduláris programozás ebben segít, hiszen a programkódot nem egybe kezeljük, hanem modulonként (egy-egy modul, egy-egy funkcionális rész), így könnyet átlátható marad a program. A program továbbra is monolitikus.
Strukturált/Procedurális Programozás Strukturált programozás alatt azt értjük, mikor a programot, már nem egyszerű parancsok sokaságára építjük, hanem az elvégzendő feladatokat csoportosítjuk és funkciókba szervezzük, majd ezeket a funkciókat hívjuk meg egymás után. Valójában sok kicsi alprogramunk lesz, melyek egymástól nagyjából függetlenül futhatnak. Előnye, hogy a kód átláthatóbb lesz, könnyen végigvezethető, és könnyebben fejleszthető.
Objektum Orientált Programozás Jelenleg a legelterjedtebb programozási technika. Ezt a technikát alkalmazva a kód egyszerre marad áttekinthető, fejleszthető, újrahasznosítható, ugyanakkor programozó független. OOP esetén már objektumokról beszélünk, melyek különféle kapcsolatokban állhatnak egymással. A C#-ban is legtöbbször ezt fogjuk alkalmazni.
Programozási alapismeretek A programozás alapjai
Alapfogalmak I. Szintaktika Az a séma, melyet az adott programozási nyelv előír számunkra. Ezt a sémát kell követnünk ahhoz, hogy hibátlanul tudjuk futtatni a programunkat. Szintaktikai hiba: ha eltérünk ettől a sémától, pl.: for helyett fro-t írunk. Szemantika Az a séma, melyet a matematika és logika szab meg. Szemantikailag hibás program például egy végtelenségig futó program, vagy egy 0-val való osztás.
Konstans: Alapfogalmak II. Olyan érték, mely a program futásához elengedhetetlen, de megváltoztatni a program futása alatt nem lehet. Változó: Olyan érték, mely a program futása alatt megváltozhat, ha a programban mi utasítást adunk rá.
Tömb (vektor): Alapfogalmak III. Adatszerkezet, melyben összetartozó, vagy legalább egyforma típusú elemek tárolhatók: Mátrix 1 2 3 4 5 6 7 8 9 10 Többdimenziós tömb 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Elágazás Alapfogalmak IV. Olyan programrész, ahol a program futása szétágazik két, vagy több ágra. Iszik, vagy vezet Egyszerre mindig csak egy ágon folytathatja a program a futását
Ciklus Alapfogalmak V. Olyan programrész, amely egy bizonyos feltétel teljesüléséig ciklikusan lefut. Addig szárítom a hajam, amíg meg nem szárad Addig mosogatok, míg el nem mostam az összes edényt A ciklus feltételét nagyon figyelmesen kell megírni, mivel ha a feltétel sosem teljesülhet, pl.: 1>2, akkor a program végtelen ciklusba kerül.
Algoritmus Program megtervezése
Algoritmus Olyan leíró nyelv, mely egy programot tud modellezni. Az algoritmus célja, hogy egy programnyelv független programunk legyen, melyet a megtervezés és leírás után akármelyik programnyelvbe lehet implementálni. Hasznos lehet, nagyobb projektek megtervezéséhez, illetve akkor, ha nekünk csak egy ötletünk van egy programra, de a célnyelvben nem tudjuk magunktól megírni azt.
Algoritmus típusok Alapvetően 3 féle algoritmusról beszélhetünk: Szöveges (Pseudo-kód) Folyamatábrás Struktogrammos Mindhárom algoritmus alkalmas egy program megtervezésére. A legtöbbek által ismert a folyamatábrás, ám a szöveges áll a legközelebb a programozáshoz.
Pseudo-kód I. A Pseudo-kód, egy programozás közeli algoritmus típus. Előnye ugyan az mint a hátránya, hogy szöveges, és valójában, ahogy mondjuk, úgy írjuk technológia, vagyis mindenki a saját nyelvén írja le
Pseudo-kód II. Első példa: a, b : egész be a be b ha a<b akkor ki b-a különben ki a-b Második példa: a, i : egész be a i:=0 ha a>0 akkor ciklus amíg i<a ki i i:=i+1; ciklus vége elágazás vége
Folyamatábra I. Egy merőben vizuális algoritmizáló lehetőség. Ábrákkal szimbolizálja az egyes egységeket a programban. Előnye, hogy könnyű szerkeszteni. Hátránya, hogy bonyolult program esetén hatalmas ábrát igényel.
Folyamatábra II. Első példa: Második példa:
Struktogram I. Egy blokkosított kinézetű algoritmus. Egyetlen nagy négyzetbe írjuk meg az egész programot Előnye, hogy könnyen áttekinthető elkészültekor. Hátránya, hogy ha bővíteni kell a kódot, már igen nehézkesen férünk el benne.
Feladat - Algoritmus Készítsünk algoritmust egy olyan programra, amely bekér két számot és a két szám között lévő összes szám négyzetét kiírja!
Visual C# A nyelv megismerése
A Visual C# kialakulása 2002-ben jelent meg A C++ és Java nyelvek alapjaira épült A.Net keretrendszer egyik fejlesztési környezete Mára az egyik legdinamikusabban fejlődő.net nyelvek közé tartozik, és elsődleges célja a programozás leegyszerűsítése, funkcióvesztés nélkül.
Nyelvi alapok A C# alapvetően egy Objektum orientált C alapú nyelv, melyet a Microsoft fejleszt. A C nyelvhez hasonlóan itt is az elsődleges alapszabály, hogy minden egyes parancs lezárásaként ; -t kell rakni. Amennyiben elmarad nem fordul le a program, mivel nem értelmezhető az.
Operátorok I. A következő operátorok használatosak C#-ban Értékadás <változó> = <érték> Érték tesztelés Egyenlő-e <változó> == <érték> Nem egyenlő-e <változó>!= <érték> Kisebb-e, nagyobb-e <változó> < <érték>, <változó> > <érték> Kisebb, vagy egyenlő, nagyobb, vagy egyenlő <változó> <= <érték>, <változó> >= <érték>
Operátorok II. Mindezek mellett sok egyszerűsítés is adott a nyelvben: Algoritmusban láthattuk, hogyan kell értéket növelni, vagy csökkenteni (c:=c+1, c:=c-1) c++; c--; Ha nem eggyel szeretnénk a változó értékét növelni, vagy csökkenteni (c:=c+5, c:=c-5) c+=5, c-=5 Ugyan így a többi matematikai alapművelet is elvégezhető c*=3, c/=2
Operátorok III. Természetesen logikai műveletekhez is tartoznak logikai operátorok: És kapcsolat: && a jelölése Vagy kapcsolat: a jelölése Not jelölése:!
Típusok Ahogy már láthattuk Pseudo-kódban minden változónak meg van adva, hogy milyen értéket képviselhet. Mivel a C# szigorúan típusos nyelv, így itt kötelezően be kell tartani a típusdeklarációkat, így pl.: egy szám értéket tároló változó nem képes egy szöveges típust eltárolni.
Típusok C#-ban A primitív típusok: Karakter tárolására alkalmas primitív típus char Szöveg tárolására alkalmas primitív típus string Egész szám tárolására alkalmas primitív típus byte (2 8 ) 0-255 int (2 32 ) - ~-2000000000-~2000000000 Nagy szám tárolására: long (2 64 ) Tizedes tört tárolására alkalmas primitív típus float (7 számjegyes tizedes törtig) Nagyobb pontosság esetén: double (15-16 számjegyes tizedes törtig)
Konstans és változó Mivel szigorúan típusos nyelv, így minden egyes használatban lévő tárolót előre definiálni kell: Konstans deklaráció: const int konstans = 0; Szabványosan: const <típus> <név> = érték; Változó deklaráció: int i; Szabványosan: <típus> <név>; Opcionálisan azonnal adható a változónak érték is: int i = 5;
Tömb és mátrix Tömböt és mátrixot C# környezetben a következőképpen tudunk deklarálni: Tömb deklarálása: <típus>[] <név> = new <típus>[<tömbméret>]; int[] tomb = new int[20]; Mátrix deklarálása: 2 dimenziós tömb: int[,] tomb = new int[20,10]; 3 dimenziós tömb: int[,,] tomb = new int[20,10,30];
Jelölések Mint a legtöbb programnyelvben itt is, kötelezően jelölni kell az egyes típusok értékeit, különben összeolvadna a programkóddal értelmezhetetlenné téve azt. Szöveg (string) jelölése: szöveg Karakter (char) jelölése: c Lebegőpontos (float) jelölése: 3.7F Mivel az F jelzi, hogy a pontosság nem double
Kommentezés Lehetőségünk van a programban elhelyezni magyarázatokat, kommenteket. Egy sor kommentezése: //Ez egy sornyi komment Több sor kommentezése: /*Ez egy többsoros komment*/
Típus konverziók I. A szigorú típusossághoz az is hozzájárul, hogy két típus között nem egyértelmű a konverzió pl.: string a = 23 ; int b = a; Ez így hibás, hiszen string anyagot akarunk int változóba tölteni
Típus konverziók II. Így minden típusváltáskor (kivéve kompatibilis váltáskor pl.: int->float) konvertálni kell az értéket! A konverzió több féleképpen is történhet, jelenleg nekünk a legjobb megoldás a Convert osztály használata lesz. Pl.: Convert.ToInt32( 23 );
Visual C# Ismerkedés a fejlesztőkörnyezettel
A Visual C# fejlesztő környezete A C# alapvetően egy ingyenesen fejleszthető nyelv A fejlesztő eszköze a Microsoft Visual C# Express http://www.microsoft.com/visualstudio/enus/products/2010-editions/visual-csharp-express Természetesen a Microsoft Visual Studio (a.net összes nyelvének fejlesztőkörnyezete) is alkalmas C# fejlesztésre, sőt nagyon komoly programok esetén javasolt is használata, a különböző plusz funkciók miatt, de a Visual Studio nem ingyenes.
Visual C# első indításkor
Kinézeti elemzés Természetesen itt is csak úgy mint a legtöbb Windows-os rendszerben a menün keresztül fogunk mindent elérni. Azonban multi ablakos kialakítást tapasztalhatunk a sok funkció miatt.
Kinézeti beállítások Első feladatunk, melyre ugyan jelenleg még nincs nagy szükségünk, de későbbiekben nélkülözhetetlen lesz, hogy a View Other Windows Properties Window-t kapcsoljuk be. Minden más jelenleg megfelel a fejlesztés megkezdéséhez.
Visual C# Programozás megkezdése
Első program elkezdése I. Mikor C#-ban fejlesztünk, 2 fontos fogalommal találjuk magunkat szembe, melyet a Microsoft fejlesztői kényelmi, csoportos ferjlesztési szempontokat figyelembe hoztak létre: Solution Project
Project Solution vs. Project I. Olyan részegység, mely egy bizonyos feladatot lát el egy programon belül. Például ilyen lehet a megjelenítésért felelős részegység, a háttérmunkákért felelős, stb.
Solution Solution vs. Project II. Olyan egybefoglaló egység, mely alá több project tartozhat Valójában a moduláris programozás egy modern kivetülése, miszerint minden programozó megkap egy kisebb project-et a teljes programból, melyeket a végén egy nagy Solution-ben tudunk egyesíteni
Első program elkezdése II. Mikor egy programot kezdünk el kialakítani, akkor kezdünk egy új Solution-t, majd ezt tudjuk szépen bővíteni akár külön projectekkel is. Mintha elkezdenénk fejleszteni a Microsoft Office programcsomagot, majd az egyes részei, Word, Excel, PowerPoint egy-egy project lenne benne.
Első program elkezdése II. Természetesen egy Solution csak akkor indulhat el, ha minimum egy Project szerepel benne, így nekünk is New Project menüvel kell kezdjük programunk fejlesztését. Mikor kiválasztjuk ezt a menüt (File New Project ) felugrik egy ablak mely a Project, Solution beállításait végzi el.
New Project ablak Itt kiválaszthatjuk, hogy milyen programot szeretnénk fejleszteni. Itt megadhatjuk programunk nevét. Ez lesz a Project és Solution neve is.
Feladat I. Hozzunk létre egy FirstProgram nevű Solutiont és egyben Project-et is, mely egy Console Application legyen. Figyeljük meg, hogy mit hozott létre a program. Solution Explorerben Alap programkódban Fájl szinten
Alapból létrehozott kód Automatikusan legenerált programkód, mely elengedhetetlen a program futásához. Automatikusan betöltött.net részegységek, melyek elengedhetetlenek a program működéséhez. (későbbiekben mi is fogjuk módosítani)
A Console használata I. A Console alapú programozás esetén, a programnak a régi Pascal-os időkből ismeretes kinézete lesz, így tehát Console Application esetén kizárólag egy Console áll rendelkezésünkre, hogy tartsuk a felhasználóval a kapcsolatot. Kisebb, nem kifejezettem felhasználói program megírásához hasznos lehet.
A Console használata II. A Console-ban alapvetően két dolgot tudunk megtenni beolvasni és kiírni: Beolvasni tudunk a felhasználótól adatokat Kiírni pedig eredményeket, vagy felszólításokat. Minden Console műveletet a Console objektummal tudunk elérni Beolvasás: Console.ReadLine(); Kiíratás: Console.WriteLine( Szöveg );
Feladat II. Az előzőek alapján készítsük el első programunkat C#-ban! Írassuk ki Console-ban, hogy Helló Világ! ; Futtassuk a programot! Mit tapasztalunk? Megoldás: A Console egészen addig fut, amíg végrehajtandó feladat maradt, vagy felhasználói interakcióra várunk. Így a kód végére szúrjunk be egy Console.ReadKey();-t
Feladat III. Módosítsuk a programot úgy, hogy azt írja ki, hogy kérek egy számot, majd ugyan azt a számot írjuk vissza a képernyőre! Tipp: Minden beolvasott anyag, alapvetően string.
Feladat IV. Újra módosítsuk a programot úgy, hogy a visszaadott érték ne a szám legyen, hanem annak a négyzete (mint az algoritmusos feladatban) Tipp: A négyzet kiszámolására több eszközünk is van: szám*szám Math.Pow(szám,hatvány);
Elágazások I. Hasznuk ugyan az mint algoritmusokban. Pl.: if(a<b) { Console.WriteLine( A b nagyobb! ); } else { Console.WriteLine( Az a nagyobb! ); }
Feladat V. Készítsünk programot, mely ha páros számot kap, akkor a négyzetét, ha páratlan számot, a köbét adja vissza! Tipp: Maradékos osztást a % jel segítségével tudunk végeztetni pl.: 5%3=2
Elágazások II. A többszörös elágazás egy speciális elágazás, mely több opciót szolgáltat: Pl.: int a = 10; switch(a) { case 1: Console.WriteLine( egy ); break; case 10: Console.WriteLine( tíz ); break; default: Console.WriteLine( nem tudom ); break; }
Feladat VI. Készítsünk programot, mely bekér egy jegyet és visszaadja a magyar iskolarendszerben használt szöveges értéket! 1 elégtelen 2 elégséges 3 közepes 4 jó 5 jeles
Ciklusok A ciklusok ugyan úgy iterálásra szolgálnak C#- ban is, mint algoritmusban. Azonban a ciklusoknak is több típusa létezik: Elöl tesztelős ciklus Hátul tesztelős ciklus Számlálós ciklus Bejáró ciklus (speciális)
Elöl tesztelős ciklus (WHILE) Az elöl tesztelős ciklus működése úgy zajlik, hogy előbb megnézi, hogy igaz-e a feltétel amit adtunk neki, majd ha igen, akkor belép a ciklusmagba. Ezt egészen addig csinálja, amíg teljesül a feltétel. Pl.: int i = 0; while(i<10) { i++; } Console.WriteLine(i);
Hátul tesztelős ciklus (DO WHILE) Működése hasonló az elöl tesztelős ciklushoz, mindössze a vizsgálat helye különbözik, ugyanis a hátul tesztelős ciklus először lefut majd ellenőrzi, hogy igaz-e még a feltétel. Pl: int i = 0; do { i++; Console.WriteLine(i); } while(i<10);
Számlálós ciklus (FOR) A számlálós ciklus működése is hasonló a while ciklushoz, azonban ebben az esetben a ciklusváltozót maga a ciklus vezeti. Pl.: for(int i = 0;i < 10;i++) { Console.WriteLine(i); }
Bejáró ciklus (FOREACH) A bejáró ciklus egy speciális ciklus, mivel nem minden programozási nyelvben található meg, illetve a használata sem egységes a nyelvekben. Használni csak és kizárólag olyan adatszerkezeteken tudjuk, amelyek bejárhatók, mint pl.: egy tömb. Pl.: foreach(int elem in tömb) { Console.WriteLine(elem); }
Feladat VII. Készítsünk programot amely bekér 5 számot egymás után, és kiírja a számok összegét és szorzatát.
Feladat VIII. Készítsünk programot, mely bekér egy számot, majd annyi nevet és jegyet kér be, amennyit beírtunk. Ezeket letárolja és kiírja a képernyőre az átlagot, illetve kiírja a képernyőre a legjobb és a legrosszabb jegy tulajdonosát.