Programozási alapok 2.. Hogyan gyakoroljunk otthon? Visual Studio, MSDNAA Monodevelop (Unity-hez jár) Online fordítók

Slides:



Advertisements
Hasonló előadás
FOL függvényjelekkel Zsebibaba anyja A 2 harmadik hatványa a oszlopában az első blokk Ezek is nevek, de nem in- konstansok Azért, mert összetettek Predikátum:
Advertisements

Bevezetés a C# nyelvbe Az alapok összefoglalása Farkas Csaba.
1 Az önértékelés mint projekt 6. előadás 1 2 Az előadás tartalmi elemei  A projekt fogalma  A projektek elemei  A projekt szervezete  Projektfázisok.
BINARIT TIMESHEET Több, mint munkaidő nyilvántartás Virág Zsolt (BINARIT Informatikai Kft.)„Hogyan legyek milliomos?” konferencia – BKIK ( )
Forrás: Reiter István C_Sharp programozás lépésről lépésre (frissített tartalommal )
John Sheridan BVetMed CVPM DMS MRCVS A Te praxisod, a Te karriered, a Te életed – gond van?
BME VEGYÉSZMÉRNÖKI ÉS BIOMÉRNÖKI KAR
ERASMUS+ DISSZEMINÁCIÓS PLATFORM
Kockázat és megbízhatóság
FELVÉTELI TÁJÉKOZTATÓ
Fájlkezelés.
PL/SQL gyakorlás Kalmár György.
Valószínűségi kísérletek
Adatbázis normalizálás
Alhálózat számítás Osztályok Kezdő Kezdete Vége Alapértelmezett CIDR bitek alhálózati maszk megfelelője A /8 B
Programstruktúrák.
Idegen kulcsok Lokális és globális megszorítások Triggerek
Java kódolási konvenciók
Scilab programozás alapjai
A C++ programozási nyelv
PHP - függvények.
LabVIEW bevezetéstől a feszültség-áram karakterisztikáig Vida Andrea
T.R. Adatbázis-kezelés - Alapfogalmak Adatbázis:
Programozás I. Gyakorlás egydimenziós tömbökkel Többdimenziós tömbök
Triggerek Kalmár György.
C# SZINTAKTIKÁJA Az egyes utasítások végén pontosvessző áll
Lexikális elemző: lex (flex)
Dependency Injection Moq Feladat
Hipotézisvizsgálat.
PHP-SQL adatbáziskezelő parancsai
Visual Studio Code Metrics
Animációk.
Kijelentéslogikai igazság (tautológia):
Nyelvek típusossága.
Adatbázis-kezelés (PL/SQL)
Ez a címdia 1. szövegdoboza
2. Bevezetés A programozásba
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
VB ADATTÍPUSOK.
Adatbevitel, értékadás, típuskonverzió
Unity.
Adatszerkezetek.
Rendszerfejlesztés gyakorlat
Számítógépes Hálózatok
Kóbor Ervin, 10. hét Programozási alapismeretek
IDŐZÍTÉS PROGRAMOZÁSA
Tilk Bence Konzulens: Dr. Horváth Gábor
AVL fák.
Programozás I. 4. gyakorlat.
Szoftverrobotok vs biorobotok Bemutatkozik Albert, a vállalati robot
Informatikai gyakorlatok 11. évfolyam
B M Java Programozás 4. Gy: Java GUI IT A N Tipper, MVC kalkulátor
iOT eszközök által rögzített adatok feldolgozása, megjelenítése
A Microsoft SharePoint testreszabása Online webhely
A távoli asztal, valamint az Endnote használata a távoli asztalon
B M Java Programozás 9. Gy: Java alapok IT A N Adatkezelő 5.rész
Bináris kereső fák Definíció: A bináris kereső fa egy bináris fa,
A Lineáris Keresés Buktatói
További rendező és kereső algoritmusok
Szálszinkronizáció.
A szállítási probléma.
B M Java Programozás 2. Gy: Java alapok IT A N Adatszerkezetek
Idegen kulcsok Lokális és globális megszorítások Triggerek
Műveletek, függvények és tulajdonságaik Mátrix struktúrák:
SQL jogosultság-kezelés
Mintaillesztés Knuth-Morris-Pratt (KMP) algoritmus
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Bevezetés Tematika Számonkérés Irodalom
Java alkalmazások 6. Előadás.
Algoritmusok.
Előadás másolata:

Programozási alapok 2.

Hogyan gyakoroljunk otthon? Visual Studio, MSDNAA Monodevelop (Unity-hez jár) Online fordítók – talán ez a legjobb

Forráskód helye Konzol, a bemenetet „>” után kéri be Új programFordítás+futtatás

Gyakoroljunk együtt!

Visual Studio projektek Egy solution-höz több projekt is tartozhat Startup projekt: amelyik futtatáskor elindul

Feladat: Kő papír olló RockPaperScissorsBasic projekt, Program.cs 1. Feladat: írjuk meg a figura beolvasását! 2. Feladat: nézzük meg, ki nyert! 3. Feladat: lehessen kilépni a játékból!

Programkonstrukciók (4): alprogramok A programozó lusta, nem szereti ugyanazt kétszer leírni Alprogram: programrészlet, aminek külön neve van, erre hivatkozva lehet az alprogramot meghívni. Láttunk már ilyet, pl: Console.WriteLine(Mit írjon ki) Ugyanilyen maga a Main program is Átláthatóbb a kód: bonyolult műveletek helyett egyetlen, kifejező sor Lehet paraméterezni is, az alprogram ugyanazt a viselkedést valósítja meg (azaz valamilyen részproblémát old meg) más-más paraméterekkel

Alprogram szintaxis módosítók típus alprogramnév(paraméterek) { Utasítás_1; Utasítás_2; … } Ez most nem érdekes… Visszatérési érték típusa Mint a változók: típus név, típus név… Alprogram „törzse”, a működést megvalósító programkód

Alprogram példák void print(string s) { Console.WriteLine(s); } int add(int a, int b) { return a+b; } void add_2(int a, int b, out int result) { result = a+b; } void: speciális visszatérési érték. Az alprogram valamit csinál, de nem ad vissza „végeredményt” Függvénynek nevezzük az olyan alprogramokat, amelyek valamilyen értéket számolnak ki. A végeredményt a return kulcsszóval jelezzük. lehetnek kimenő (out) paraméterek is, ezeket az alprogram állítja elő így tudunk pl. több értéket visszaadni

Alprogram meghívása print( "Hello World!" ); int i = add(2, 5); i = add(i, 2*i); add_2(3, 42*52, out i); Ekvivalens azzal, mintha az alprogramot bemásolnánk ide, és a paraméterek helyére beírnánk az átadott értékeket Itt az i változó kimenő, azaz a program által számolt érték Ezt az out kulcsszóval kell jeleznünk

Első alprogramom (1. feladat) RockPaperScissorsSubprogram projekt Írjunk alprogramot, ami beolvas egy kő papír olló figurát! Adja vissza, hogy a beolvasott érték érvényes-e és a beolvasott értéket is! static bool readFigure(string message, out string figure) { Console.WriteLine(message); figure = Console.ReadLine(); if ("ko" == figure || "papir" == figure || "ollo" == figure) { return true; } return false; }

Első alprogramom: felhasználási példa static void Main(string[] args) { bool newGame = true; Random rnd = new Random(); while (newGame) { Console.Clear(); string playerFigureString; while (!readFigure("Mit mutatsz?", out playerFigureString)) { Console.WriteLine("Ervenyes figurak: ko, papir, ollo"); } //...

Feladat: kő papír olló, alprogram 2. Feladat: írjunk alprogramot, ami a véletlenszerűen generált számból stringet csinál!

Programkonstrukciók (2.5): választás (switch) if (változó == érték_1) { Utasításblokk_1; } else if (változó == érték_2) { Utasításblokk_2; } else if (változó == érték_3) { Utasításblokk_3; } // … else { Egyébként_ág; } switch (változó) { case érték_1: Utasításblokk_1; break; case érték_2: Utasításblokk_2; break; case érték_3: Utasításblokk_3; break; default: Egyébként_ág; }

Programkonstrukciók (2.5): választás (switch) switch (változó) { case érték_1: Utasításblokk_1; break; case érték_2: Utasításblokk_2; break; case érték_3: Utasításblokk_3; break; default: Egyébként_ág; } default (általában) nem kötelező De mindig ajánlott kiírni egy üres default ágat A változó csak elemi típus lehet bool, char, string, int, … break helyett állhat: return (alprogramból visszatérés) goto case érték_i (másik címkére ugrás) (throw – ez most nem érdekes…)

Feladat: kő papír olló, switch 3. Feladat: írjunk switch-case szerkezetet, ami a nyertes alapján kiírja az eredményt! A nyertest a winner függvény adja vissza, egész számként -1: az első játékos nyert (ami most a felhasználó) 0: döntetlen 1: a második játékos nyert (ami most a gépi játékos)

Adatszerkezetek Az algoritmustervezés legfontosabb eszközeinek egyike Sok egyforma (vagy hasonló) dolgot szeretnénk rendezett formában tárolni Rengeteg fajtája van, az optimális választás attól függ, hogy az adatszerkezetben tárolt adatokkal mit szeretnénk kezdeni Felhasználási példák: Gyors keresés telefonkönyv Gyors beszúrás jegyzettömb Sorrendiség ki volt itt előbb? Szomszédsági viszony határos országok Térbeli elrendezés legközelebbi rakétavető

Tömb (1D) Azonos típusú elemek számozott listája Indexek (elemek sorszáma) Tömb elemei Tömb hossza (mérete) 8 Első index (nullától!!!) Tömb (6-os indexű) eleme

Tömb (1D) a programban int[] numbers; tömb létrehozás deklaráció (név létrehozás) numbers ??? int[] numbers = new int[6]; int[] numbers = new int[6] { 2, 1, 5, 4, 2, 7 }; int[] numbers = { 2, 1, 5, 4, 2, 7 }; létrehozás és inicializáció

Tömb (1D) a programban numbers ??? numbers[3] = 9; numbers[6] = 0; 9 // futási idejű hiba!

Tömbök bejárása Nagyon gyakran előjövő feladatok: A tömb minden elemére végezzünk el valami műveletet Keressünk a tömbben Tömb bejárás string[] array = {"alma", "dio", "mogyoro"}; for (int i = 0; i < array.Length; ++i) { Console.WriteLine(array[i]); } foreach: Speciális for ciklus adatszerkezetek bejárására // pontosan ugyanazt csinálja, mint az előző ciklus foreach (string s in array) { Console.WriteLine(s); }

Feladat: Kő papír olló, tömbökkel Hány helyen kell átírni az előző programot, ha más nevet szeretnék a figuráknak? Használjunk tömböket a figuranevek tárolására! Máshol ne forduljon elő a figurák neve static string[] FigureStrings = { "ko", "papir", "ollo" }; static string intToFigure(int i) { if (0 <= i && i < FigureStrings.Length) return figures[i]; return ""; }

Konstansok Motiváció: a kő papír olló programban észben kell tartanunk, hogy melyik indexhez milyen figura tartozott. 1. változat: definiáljunk nekik konstansokat const int ROCK = 0; const int PAPER = 1; const int SCISSORS = 2; A konstansok típussal rendelkező, névvel azonosított értékek (mint a változók), amelyek értéke a program során nem változhat const int ROCK = 0; ROCK = 2; // fordítási hiba! Tipikusan előre beégetett értékeket szoktunk megadni velük

Felsorolási típus Motiváció: a kő papír olló programban észben kell tartanunk, hogy melyik indexhez milyen figura tartozott. 2. (szebb) változat: definiáljunk nekik saját felsorolási típust Emlékeztető: a típus meghatározza többek között, hogy a változók milyen értékeket vehetnek fel enum Figures {ROCK = 0, PAPER, SCISSORS}; A felvehető értékeket mi soroljuk fel, név szerint Számmá tudjuk őket konvertálni, explicit konverzióval int i = (int)Figures.ROCK; // C#: típusnév.érték A felsorolt értékeknek megfelelő számot egyenlőség jel után megadhatjuk Alapból 0-tól kezdődik, egyesével nő

Felsorolási típus: bejárás Összes érték bejárására speciális konstrukció: foreach (Az Enum.GetValues egy tömböt ad vissza a lehetséges értékekkel, ezt járja be a foreach) foreach (int i in Enum.GetValues(typeof(Figures))) { Console.Write(FigureStrings[i] + " "); } foreach (Figures f in Enum.GetValues(typeof(Figures))) { Console.Write(FigureStrings[(int)f] + " "); }

Feladat: kő papír olló, enum Definiáljunk enum típust a figurákhoz Indexeljük ezzel a figurák neveit tartalmazó tömbünket mindenhol a kódban!

Tömb (2D) A[1,3] A[2,1] A[0,0] A[3,5]

Tömb (2D) a programban int[,] twoDimArray = new int[3, 2] { { 7, 2 }, { 1, 4 }, { 5, 9 } }; ahány vessző, annyi+1 dimenziós dimenziók méretei

2D tömb bejárása Összes elem, egyszerre: foreach (int i in twoDimArray) { Console.WriteLine(i); } Dimenziónként: for (int row = 0; row < twoDimArray.GetLength(0); ++row) { for (int col = 0; col < twoDimArray.GetLength(1); ++col) { Console.WriteLine(twoDimArray[row, col]); } HF: mi történik, ha a két for-t megcseréljük?

Kép mint 2D tömb

2D tömb a játékokban

3D tömb a játékokban

Feladat: Pacman alapprogram Pacman solution, Pacman01-2DArray projekt 1. feladat: rajzoljuk a ki a pályát Már tárolva van egy 2D tömbben 2. feladat: pontszámmegjelenítés

Objektum Orientált Programozás Programozási paradigma A legtöbb programban logikailag valamilyen nem elemi típusú „objektumon” dolgozunk Szörny, rakétavető, képernyő, bemeneti fájl … Ezekhez létrehozhatunk saját típus: osztály Attribútumok (tulajdonságok) Objektumokon végezhető műveletek

Osztály, mint „összetett típus” class HiScore { // public: láthatóság kifelé (ld. Később) public string playerName; public int score; public DateTime date; // további adatok, pl. játszott faj stb. } //... Használat: HiScore hiscore = new HiScore(); hiscore.score = 5; hiscore.playerName = "Lajos"; attribútum vagy property hiscore playerName score date 5 Lajos példányosítás …

Osztály, mint típus saját műveletekkel class MyInteger { public MyInteger(int value) { this.value = value; } public void negate() { value = -value; } public void print() { Console.WriteLine(value); } int value; } static void Main(string[] args) { MyInteger m = new MyInteger(5); m.print(); m.negate(); m.print(); } konstruktor metódusok / tagfüggvények

Házi feladat: Legyen Ön is milliomos Tipp: kérdés osztály Kérdés szövege Lehetséges válaszok (4 elemű tömb) Helyes válasz sorszáma A játék menete: Amíg a játékos ki nem lép, kiírunk 1-1 kérdést és a lehetséges válaszokat Bekérjük a játékos tippjét Ha jó a válasz, ugrunk a következő nyereményszintre Különben game over

Pacman V2 Van már Vec2 osztály GameObject osztály class GameObject { public enum GO_Type { WALL, HERO, ENEMY, COIN } public virtual void draw() { //TODO } public GO_Type mType; public Vec2 position = new Vec2(); public Vec2 move = new Vec2(); public int score = 0; }

Player funkciói class GameObject { … public void update() { if (mType == GO_Type.HERO) { if (System.Console.KeyAvailable) { ConsoleKeyInfo keyinfo = System.Console.ReadKey(true); move.setNull(); if (keyinfo.Key == ConsoleKey.LeftArrow) move.x = -1; if (keyinfo.Key == ConsoleKey.RightArrow) move.x = 1; if (keyinfo.Key == ConsoleKey.UpArrow) move.y = -1; if (keyinfo.Key == ConsoleKey.DownArrow) move.y = 1; if (keyinfo.Key == ConsoleKey.Escape) System.Environment.Exit(0); }

Player funkciói II. class GameObject { … public void allowMove() { System.Console.SetCursorPosition(position.x, position.y + 1); System.Console.Write(" "); position = position.add(move); move.setNull(); draw(); } public void cancelMove() { move.setNull(); }

Main loop //draw level … System.Console.SetCursorPosition(0, 0); System.Console.Write("Score: 0");.. következő dia jön ide

while (true){ for (int i = 0; i < cols; ++i) { for (int j = 0; j < rows; ++j) { if(map[j][i] != null) map[j][i].update(); if(map[j][i] == player) { if (!player.move.isNull()) { Vec2 nextPosition = player.position.add(player.move); GameObject obj = map[nextPosition.y][nextPosition.x]; if (obj.mType != GameObject.GO_Type.WALL) { if (obj.mType == GameObject.GO_Type.COIN) { player.score++; map[nextPosition.y][nextPosition.x] = null; drawGUI(); } else if (obj.mType == GameObject.GO_Type.ENEMY) { player = null; drawGUI(); } player.allowMove(); map[player.position.y][player.position.x] = player; } else player.cancelMove(); }

GUI rajzolás class Game { void drawGUI() { if(player == null) { System.Console.SetCursorPosition(0, 0); System.Console.Write("GAME OVER"); System.Threading.Thread.Sleep(3000); System.Environment.Exit(0); } System.Console.SetCursorPosition(0, 0); System.Console.Write("Score: " + player.score); }

Öröklődés Játékobjektum Játékos Fal SárkányVámpír Szörny Specializáció

Öröklődés példa class Vec2 {/*... */}; public class GameObject { public void draw() { /*... */ } public void move() { /*... */ } Vec2 position; int ID; //... } public class Monster : GameObject { // örököltük a metódusokat // örököltük a koordinátát, ID-t stb. }

Absztrakt osztály class Vec2 {/*... */}; public class GameObject { public void draw() { /*... */ } public void move() { /*... */ } Vec2 position; int ID; //... } public class Monster : GameObject { // örököltük a metódusokat // örököltük a koordinátát, ID-t stb. } Hogyan mozog egy „általános” játékobjektum???

Absztrakt osztály class Vec2 {/*... */}; public abstract class GameObject { public abstract void draw(); public abstract void move(); Vec2 position; int ID; //... } public class Monster : GameObject { // felülírjuk az örökölt metódusok viselkedését public override void draw() { /*... */ } public override void move() { /*... */ } // örököltük a koordinátát, ID-t stb. } Nem írunk hozzá törzset, majd a speciális esetek implementálják külön-külön A konkrét, nem absztrakt leszármazottak már definiálják a viselkedést

Pacman V3 Öröklődés Game loop

Pacman modell