Informatikai rendszerek Fejlesztés C# nyelven Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
1. Gyakorlat – Algoritmusok elmélet, változók, programozás Milyen módon kéne a géppel megértetni a szándékunkat, hogy kéne kinéznie egy közös nyelvnek? Ezen a közös nyelven milyen szerkezeteket kell használnunk a folyamat leírására? A számítógépnek utasításokat algoritmusok formájában meghatározni, hogy mit csinál majd a futó program.
adhatunk,
ezek
felépítése
fogja
Szükség lehet még a program futása közben néhány értéket tárolni, vagy módosítani, erre a memóriából változókat foglalunk le, majd írjuk és olvassuk, reagálunk a különböző értékekre az algoritmus futása során. Tipikusan a legtöbb programozó első alkalmazása a ’Hello World’ című, mindössze egy minimális programszerkezetet, és egy kiíró függvényt tartalmaz. Írjuk meg, futtassuk le! 1. 2. 3. 4. 5. 6. 7. 8.
//HelloWorld.cs public class Hello1 { public static void Main() { System.Console.WriteLine("Hello World!"); } }
Vegyük észre az egyes elemek színezését. A világoskék szavak például módosító szerepet játszanak, az utánuk álló megnevezett dolgok tulajdonságait jelölik, úgy mint public, vagyis a deklarált elem kívülről is elérhető, vagy void, vagyis a deklarált elem nem ad vissza értéket. A kék szöveg az előre megadott információt jelöl, feldolgozandó szöveget, ami nem dinamikus. Itt azt a szöveget, hogy "Hello World!". Ahogy később haladunk, ezeket egyre kevésbé fogjuk használni, mivel legtöbbször felhasználótól kapott bemenetre szeretnénk reagálni. Van még zöld színnel is szöveg, ezeket a fordító figyelmen kívül hagyja, ezek leginkább a fejlesztőnek, a programkód jövendő olvasgatójának szóló, vagy épp dokumentációs célokat szolgáló megjegyzések. (Lehetőség van C#-ban a program lefordításakor bizonyos módon formázott megjegyzések alapján teljes dokumentációt generáltatni.) A program szerkezete a tagolás által megfigyelhető, egymásnak alárendelt részletek léteznek, itt egy public class Hello1 alá tartozik egy public static void Main() függvény, amint láthatjuk {} keretezéssel, ami blokkba foglalja a programrészeket. Fontos még megjegyezni, hogy míg az egyes területek meghatározása után a blokkot kezdjük el {}, addig az utasítások után minden esetben ; karaktert használunk, ezzel zárunk le egy-egy konkrét utasítást.
O l d a l 2 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
Nézzünk egy egyszerűbb problémát: szeretném egy kosárba rakni az almáimat. Az egyik kosárban van 5, a másik kosárban van 15. Egy lehetséges megoldás: 1. using System; // előre megírt kódokat using (használ) kulcsszóval importálunk 2. 3. namespace Hello_World 4. { 5. class Program // minden amit írsz osztályokon belül jön létre 6. { 7. static void Main(string[] args) // a Main függvény az alkalmazás belépési pontja 8. { 9. // megjegyzés /* megjegyzés */ 10. int gyumolcs1_kosar1, gyumolcs1_kosar2; // egész tÃpusok deklarálása 11. const double pi = 3.14; // konstansok deklarálása 12. string gyumolcs1_nev = "alma"; // szöveg 13. byte gyumolcs2_kosar1, gyumolcs2_kosar2; // kis szám 255-ig 14. 15. gyumolcs1_kosar1 = 5; // elsÅ‘ kosár tartalma 16. gyumolcs1_kosar2 = 15; // második kosár tartalma 17. gyumolcs1_kosar1 += gyumolcs1_kosar2; // kosar2 tartalmának megfelelÅ‘ mennyiségű almà ¡t teszünk az 1.be 18. Console.WriteLine("összesen {0}db" + gyumolcs1_nev +" van.", gyumolcs1_kosar1); 19. Console.ReadLine(); // várjunk egy enterre hogy ne csak egy villanás legyen a program 20. } 21. } 22. }
A fejezethez kapcsolódó alaputasítások // megjegyzés /* megjegyzés */ ; // üres utasítás { } // blokk kezdet és vég int a1, a2, a3; // egész típusok deklarálása long b1=12, b2=13; // nagyobb számokra char c = 'a'; // karakterek bool x = true, y = false; // logikai változók double g = 123.456; // valós számokra const double pi = 3.14; // konstansok deklarálása string alma = "körte"; // szöveg byte by = 255; // kis szám 255-ig a1 a1 a1 a2 a2 a1
= 12; // értékadó utasítás = a1 + b; a1 += b; // inkrementálás -= b; // csökkentés, a1 = a1 - b = a1++; a2 = a1--; // a2 = a2 + a1 és utána a1++ = ++a1; a2 = --a1; // a1++ és utána a2 = a2 + a1 /= 1; a1 *= 1; a1 %= 1; // % maradék képzés
Console.WriteLine("alma \a alma"); // \a = hangjelzés Console.WriteLine("alma" + "alma"); // összefűzés Console.WriteLine(a1 + a2); // két változó összeadás vagy összefűzése Console.WriteLine(a2); // változó kiíratása Console.WriteLine("alma {0} alma {1} alma", x, y); // paraméteres kiíratás
Írj programot, amely tárol a memóriában két valós értéket és kiírja az összegüket, különbségüket, hányadosukat, szorzatukat! Az értékek kiíratásánál használj paraméteres kiírató függvényt!
O l d a l 3 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
2. Gyakorlat – Adatok beolvasása, műveletek változókkal Nem túl érdekes egy olyan program, ami nem reagál semmire, és a kimenete mindig ugyanaz. Hogyan tudunk információt közölni a számítógéppel, amit az algoritmusokban felhasználhatunk? A gyakorlaton a következő témákat érintjük:
parancssoron keresztüli adatbekérés Math osztály fontosabb függvényei típus átváltások véletlen szám generálás
Szeretnék írni egy egyszerű játékot, legyen ez egy számkitaláló. Gondolunk egy számra 1 és 5 között, a számítógépünk pedig megpróbálja ezt kitalálni. Ha eltalálta, egy ponttal jutalmazzuk. Egy lehetséges megoldás: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
using System; namespace Guess_simple { class Program { static void Main(string[] args) { int score = 0; // Random guessmachine = new Random(1011);
Console.WriteLine("Add meg a neved!"); string player_name = Console.ReadLine(); // ĂŠrtĂŠkadĂĄs billentyĹązetrĹ‘l (enterig) // while(true) // { Console.WriteLine("Gondolj egy szĂĄmra, {0}. Ha megvan, Ăźss ENTERt.", player_name); 17. Console.ReadLine(); 18. 19. Random guessmachine = new Random(1011); // kĂŠrĂźnk egy Random tĂpusĂş osztĂĄlyt, ami a 'tippelĹ‘nk' lesz 20. 21. int guess = guessmachine.Next(0,5) + 1; // ennek az osztĂĄlynak a .Next fĂźggvĂŠnye a paramĂŠterek alapjĂĄn ad egy szĂĄmot 22. Console.WriteLine("A tippem {0}. Ha talĂĄlt, Ărj be egy pontot!", guess); // vĂŠletlen szĂĄm generĂĄlĂĄsa 23. score += Convert.ToInt32(Console.ReadLine()); // a ReadLine() egy string típust ad 24. Console.WriteLine("{0}, eddig {1} szĂĄmodat talĂĄltam ki.", player_name, score); 25. // } 26. } 27. } 28. }
A fenti programban a 10, 14, 15, 25 sorok előtti // megakadályozza, hogy a fordító ezeket a sorokat is feldolgozza, vagyis a lefordult programban nem lesznek benne. Ezzel olyan részleteket hagyok ki, amiket később részletesebben tárgyalunk, vagy olyan részt, ami nem teljesen egyértelmű.
O l d a l 4 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
Itt: próbáljuk ki a tippelőnket úgy, hogy a while(true) { és a lezáró } részek közötti kódot többször egymás alá másoljuk. Elég repretív munka, de így a gép nem csak egy kört játszik a program egy futásánál. Ezt egyszerűsíthetjük egy ciklussal, amikről később lesz szó, ha egyszerűen levesszük a sor eleji // jeleket a while(true)(amíg(igaz)) és a hozzá tartozó { } jelek elől. Mivel a pontszámot a program legelején egyszer bevezettük (int score = 0;), az alkalmankénti növeléssel a program futása során az értéke megmarad. Nem így csináltuk viszont a Random guessmachine = new Random(1011); osztály esetében, amit mindig újrakérünk, ugyanazzal a ’maggal’ (a Random osztály pszeudorandom-generátor, vagyis az általunk paraméternek megadott szám segítségével egy előre meghatározott sort állít elő), a programunk állandóan a pszeudorandom sor első eleméből csinálja a véletlen számot, így minden alkalommal ugyanarra az egy számra fog tippelni. Javítás: a pszeudorandom halmazt csak a program legelején, egyszer kérjük. (a Random guessmachine = new Random(1011); részt helyezzük a ciklus fölé) A fejezethez kapcsolódó alaputasítások Console.ReadLine(); // várakozás alma = Console.ReadLine(); // értékadás billentíűzetről a1 = Convert.ToInt32(b1); alma = Convert.ToString(b2); // konvertálás g = (double)a1; // típus kényszerítés (konvertálásra is jó) g g g g g g g
= = = = = = =
Math.Sqrt(a1); // gyökfüggvény Math.Pow(a1,0.5); // hatványfüggvény Math.Sin(a1); g = Math.Exp(a1); // e az x-ediken Math.Log(a1); // ln Math.Round(g,0); // 0 tizedesjegyre Math.Abs(a1); Math.PI; // a pi valós értéke
Random veletlen2 = new Random(123); // mindíg ugyanaz a sorrend, ha számot írunk bele Console.WriteLine(veletlen1.Next(12,22)); // véletlen szám generálása
Írj programot, amely bekér két egész számot és kiírja azok összegét, különbségét, hányadosát, szorzatát!
Írj programot, amely bekér egy valós számot, majd egésszé konvertálja és az így kapott értéket kivonja az eredeti szám kerekített értékéből. Milyen eredményt várunk?
Írj programot, amely 100 és 200 közötti véletlenszerű számokat generál!
O l d a l 5 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
3. Gyakorlat – Vezérlési szerkezet Egy-egy programírás során mindig merül fel olyan igény, hogy szeretnénk egy utasítás blokkot többször végrehajtatni a számítógéppel vagy a bemenet függvényében más és más utasítás blokkokat futtatni. Például a felhasználótól addig kérünk be számokat, amíg az összes bekért szám összege kisebb, mint 10. A fent említett két problémára kínálnak megoldást a ciklusok és a feltételes elágazások. A gyakorlaton a következő témákat érintjük:
logikai műveletek feltétel vizsgálatok o if-else szerkezet o egymásba ágyazott feltételek o switch szerkezet ciklusok o for ciklus o elöl és hátul tesztelő ciklusok goto kulcsszó.
Az előző fejezetben olyan programot írtunk, amelyben gondoltunk egy számra, majd a számítógép megpróbálta kitalálni azt. Most írjuk meg ennek fordítottját, azaz a számítógép generáljon 0 és 100 között egy egész számot, majd adjon lehetőséget, hogy kitaláljuk azt. A tippelés után a program megmondja, hogy a tipp nagyobb/kisebb a generált értéknél (ekkor új tipp következik) vagy eltalálta a felhasználó (ekkor kilép a programból). Amennyiben a felhasználó kisebbet tippelt kiírjuk képernyőre, hogy a tipp kisebb a gondolt számnál és a ciklus elejére ugrunk (az első feltétel teljesül). Ha a felhasználó tippjére nem igaz, hogy kisebb a gondolt számnál (az első feltétel nem teljesül), akkor megvizsgáljuk, hogy nagyobb-e annál. Amennyiben nagyobb a tipp a gondolt számnál kiírjuk a képernyőre, hogy nagyobbat tippelt a felhasználó és a ciklus elejére ugrunk (a második feltétel teljesül). Amennyiben se nem nagyobb se nem kisebb a tipp a gondolt számnál, akkor csak egyenlő lehet vele, azaz a játékos kitalálta a számot. Ekkor kiírjuk a képernyőre, hogy a felhasználó kitalálta a számot, majd kilépünk a ciklusból, ezzel a program befejezi a futását. A probléma megoldása (a teljes projekt: SzamKitalalo.sln): 1. using System; 2. 3. namespace SzamKitalalo 4. { 5. class Program 6. { 7. static void Main(string[] args) 8. { 9. int tip; //tĂĄrolĂł a tippeknek 10. Random r = new Random(); //elkĂŠszĂtjĂźk a randomgenerĂĄtorunkat 11. 12. int number = (int)Math.Round(r.NextDouble() * 100 + 1);
O l d a l 6 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014 13.
//GenerĂĄlunk egy 0 ĂŠs 1 kĂśzĂśtti valĂłs szĂĄmot majd megszorozzuk 100-zal,
14.
//hozzĂĄadunk 1-et. A kapott ĂŠrtĂŠket kerekĂtjĂźk ĂŠs egĂŠsz ĂŠrtĂŠkre konvertĂĄljuk. 15. bool win = false; //a ciklus folytatĂĄsĂĄnak feltĂŠtele 16. 17. while(!win) { 18. Console.WriteLine("\nKerem a kovetkezo tippet!"); 19. tip = Convert.ToInt32(Console.ReadLine()); //kĂŠrjĂźk a felhasznĂĄlĂł Ăşjabb tippjĂŠt ĂŠs egĂŠsz szĂĄmmĂĄ konvertĂĄljuk 20. 21. if (tip < number) //az elsĹ‘ feltĂŠtel, megnĂŠzzĂźk, hogy kisebbe a tippĂźnk a gondolt szĂĄmnĂĄl 22. { 23. Console.WriteLine("A tipped kisebb a gondolt szamnal!"); 24. } 25. else //ha nem teljesĂźl az elsĹ‘ feltĂŠtel 26. { 27. if (tip > number) //a mĂĄsodik feltĂŠtel, megnĂŠzzĂźk, hogy a tipp nagyobb e a go ndolt szĂĄmnĂĄl 28. { 29. Console.WriteLine("A tipped nagyobb a gondolt szamnal!"); 30. } 31. else 32. { 33. //ha egyik feltĂŠtel sem teljesĂźl, akkor kitalĂĄltuk a szĂĄmot. 34. Console.WriteLine("Kitalatad a szamaot!"); 35. win = true; //a vĂĄltozĂł ĂĄllĂtĂĄsĂĄval a ciklus nem fut le tĂśbbszĂśr 36. } 37. } 38. } 39. Console.Read(); 40. } 41. } 42. }
A fejezethez kapcsolódó alaputasítások x = a1 > b1; // nagyobb? (a logikai értéket beletöltjük x-be, ahol x bool típusú) x = a1 >= b1; // nagyobb, vagy egyenlő? x = a1 == b1; // egyenlő-e? (FONTOS! == értéket hasonlít össze, = típust) x = a1 != b1; // nem egyenlő? x = alma is string; // igaz, ha alma string típusú x = !x; // negáció z = x && y; // igaz, ha x és y is igaz z = x || y; // igaz, ha x vagy y is igaz a = b > 12 ? b1 : 2; // ha b>12, akkor a=b1, ha nem, akkor a=2 Console.Clear(); // konzol ablak letörlése if (x % 2 == 0 && y == 1 || g == ”f”) // elágazás használata – összetett feltétel {} // ha több parancs követi, akkor blokkban kell megadni else if (x < 0) a = b; // ha egy parancs követi, nem kell blokkba helyezni az egyetlen utasítást (átláthatóság miatt érdemes kitennia blokkokat jelző {} jeleket
O l d a l 7 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014 else Console.WriteLine("YYY”); //az else után már nincs feltétel switch (a) // elágazás, ide kell írni a változó nevét ()-be { case 1: b=”egy”; break; // case után a változó értéke áll case 2: // ha nincs brake, akkor ugyanazt csinálja, mint a 3. sor case 3: b=”kettő”; break; // minden case után kell break default: // ha egyik sem egyezik, nem kötelező megadni Console.WriteLine("Hiba”); break; } for (a = 10; a < 20 && !talalt; a++) // ciklus, adott számú ismétlésre { break; //a ciklusból való kilépéshez continue; //vagy „continue;” a ciklus fej címzéséhez } while (i < 10 && b == 1) {} // elől vizsgálós ciklus do {} while (i <= Math.Abs(kitevo)); // hátul vizsgálós ciklus goto kulso; // ugró utasítás kulso: // címke, ahova ugrik
Írj programot, amely generál 100 darab véletlen számot 0 és 100 között és megadja, hogy hány darab kisebb mint 10! A program jelenítse meg a számokat egy sorban szóközzel elválasztva! Írj programot, amely generál 100 darab véletlen számot és kiszámolja azok összegét, átlagát és megadja a legnagyobb és legkisebb értékű elemet! Írj programot, amely szabályos dobókocka kockadobásokat szimulál és addig dob, amíg 6-ost nem sikerül. Minden kockadobás értékét írja ki a program! Írj programot, amely bekér egy pozitív egész számot (ellenőrizni kell, hogy a kapott szám tényleg pozitív-e), majd eldönti a kapott számról, hogy prímszám-e!
O l d a l 8 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
4. Gyakorlat – Tömbök kezelése, kivételkezelés Megtanultuk, hogy hogyan tudunk egy-egy változót deklarálni, hogyan tudjuk ezeket a változókat meghatározott, vagy akár bekért értékekkel feltölteni. Ezeket a bekéréseket a vezérlési szerkezetekkel sokszorosítani tudjuk, így akár egyfajta adathalmazt is feltölthetünk vele. Mi lenne, ha egy számtani sort akarnánk bevinni a memóriába? Vagy esetleg egy térképen lévő objektumok helyeit (koordinátáit) listába rendezni? És mi történik, ha a felhasználótól számot kérünk, de csak egy ’alma’ szöveget kapunk? A gyakorlaton a következő témákat érintjük:
tömbök (deklaráció, értékadás) tömbök feltöltése ciklussal tömbök bejárása, módosítása, kiírása ciklussal többdimenziós tömbök felhasználói bevitel típusátváltásának hibakezelése
A probléma a következő: adott egy hatszög a csúcsainak koordinátáival. Ezt a felhasználónak a parancssoron keresztül kell begépelnie. Ha számokat ad meg, tároljuk azokat koordinátákként egy helyen, ha nem, figyelmeztessük, és kérjük ismételt bevitelre. Végül, ha üres elemet kapunk, fejezzük be a beolvasást, és számoljuk ki a hatszög területét a következő képlettel: 𝑛−1
1 𝐴 = |∑(𝑥𝑖 𝑦𝑖+1 − 𝑥𝑖+1 𝑦𝑖 )| 2 𝑖=0
xn, yn = x0 , y0 (zárt polygon) Egy lehetséges megoldás, először a pontok beolvasására: (az adatmodell 10-szögre készült)
Hivatkozáskor a tömbnek mindkét indexét meg kell adnunk: tomb[1,1] a 2. sor 2. elemét szolgáltatja. A deklarációban szereplő int[,] jelöli, hogy egy kétdimenziós egészeket tartalmazó tömböt kérek, a new int[2,10] pedig, hogy példányosítani szeretnék egy 2x10 méretű, kétdimenziós, egészekből álló tömböt. A következő oldalon ezt a tömböt feltöltjük, és lekezeljük a felhasználói bevitel hibáit.
O l d a l 9 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43.
// Polygon_array.cs using System; namespace Triangle_array { class Program { static void Main(string[] args) { string response="_"; int counter=0; int current_point=0; int[,] vertices = new int[2,7]; // sokszög pontjait, plusz n.pont=0.pont tart. halmaz //vertices = null; nincs itt semmi látnivaló Console.WriteLine("Add meg a sokszöged koordinátáit:"); while (!(response == "") && counter < 12) { current_point = (int)((counter) / 2); read: // goto cÃmke használatával könnyedén visszadobjuk a felhasználót Console.WriteLine("{0}. pont {1}. koordináta:", current_point + 1, counter % 2+1); / / indexelés 0-val kezdÅ‘dik, 0. elem az 1. response = Console.ReadLine(); // beolvasok if (response == "") // ha üresen entert ütünk, kilépünk a ciklusból { Console.WriteLine("MegszakÃtottad a bevitelt."); break; } try //az átváltáskor hiba lép fel ha nem számot adunk, kezeljük le { vertices[counter % 2, current_point] = Convert.ToInt32(response); } catch(Exception e) // most csak általános hibát kezelünk, ide elég ennyi { Console.WriteLine("Hibás adat: {0}. Csak számot adj meg!", response); goto read; // visszaugrunk a bekéréshez, nincs érvényes koordinátánk } if (counter % 2 == 1) { Console.WriteLine("A {0}. pont koordinátái: {1}, {2}", curr ent_point+1, vertices[0, current_point], vertices[1, current_point]); } counter++; } Console.ReadLine(); } } }
A fenti kóddal sikeresen feltöltöttük a tömböt, már csak a számítást kell elvégeznünk, hogy megkapjuk a területet. Ehhez a következő anyagtól kezdve majd függvényeket is használhatunk, egyelőre azonban egyszerűen megírjuk, ahogy tudjuk: (a következő kódot írhatjuk az előző 40. sora elé) 1. 2. 3. 4. 5. 6. 7. 8.
vertices[0, 6] = vertices[0, 0]; vertices[1, 6] = vertices[1, 0]; // xn, yn = x0, y0 -> zárjuk a polygont float area=0; // a területet összeadásokkal adjuk meg, érdemes 0-val kezdeni for (int i = 0; i < vertices.GetLength(1)-1; i++) // GetLength(1) a 2. dimenzió hosszát adja (0tól index) { // sum[x(i)*y(i+1)-x(i+1)y(i)] egészen n-1 ig, ezért legyen i<elemszám, vagy i<=elemszám-1 area += vertices[0, i] * vertices[1, i+1] - vertices[0, i + 1] * vertices[1, i]; } area= Math.Abs(area); // abszolutérték
O l d a l 10 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014 9. area /= 2; // 1/2 szorzó 10. Console.WriteLine("A hatszög területe: {0}", area);
A fejezethez kapcsolódó alaputasítások // tömb megadási módok int[] a = new int[] { 1, 2, 3, 4, 5 }; int[] b = new int[5] { 1, 2, 3, 4, 5 }; int[] c = { 1, 2, 3, 4, 5 }; int[] d = new int[5]; d[0] = 0; d[1] = 0; int[,] e = new int[2,3] {{1, 2, 3}, {4, 5, 6}}; // több dimenziós tömbök for (int i2 = 0; i2 < d.Length; i2++) // tömb feltöltése, ha minden elemen végigmegy d[i2] = i2 + 1; foreach (int elem1 in a) // minden elemen végigmegy Console.WriteLine(elem1); c = null; // tömb elemeinek lenullázása // lekérdezzük a tömb egyes dimenzióinak méretét int[,] e = new int[2,3] hossz = e.GetLength(0); // = 2, tehát nem az összes elemet hossz = e.GetLength(1); // = 3, tehát nem az összes elemet try {} // kivételkezelés catch (FormatException) {} catch (IOException) {} finally {}
Módosítsd a fenti programot, hét illetve tetszőleges n-szög területszámítására! Írj programot, amely feltölt véletlen számokkal egy 100 elemű tömböt, majd kiírja az elemek átlagát, szórását, a tömb legkisebb és legnagyobb értékű elemét! Írj programot, amely bekér 5 számot, majd kiírja azokat növekvő és csökkenő sorrendben (buborék elv)!
O l d a l 11 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
5. Gyakorlat – Függvények Kisebb programok is hamar átláthatatlanná válhatnak, így azok továbbfejlesztése nehézkessé válik. Egy rosszul strukturált programban nehéz változtatásokat véghezvinni, nehéz észrevenni a szemantikai hibákat, valamint hátráltatja más felhasználók bevonását is a fejlesztésbe. Az átláthatóság javítására egy jó megoldás, ha saját függvényeket valósítunk meg. A gyakorlaton a következő témákat érintjük:
Függvény deklarálása függvény kifejtése meghívása visszatérési érték megadása módosítószók változók hatóköre Struktúrák
Szeretnénk eldönteni két kúpról, hogy melyiknek a nagyobb a felszíne. Mindkét kúpnak adott a magassága és alapkörének a sugara. A kúp felszínét a következő képlettel számolhatjuk ki:
A program futása során kétszer kell számolnunk felszínt, mielőtt el tudnánk dönteni azt, hogy a két test közül melyiknek nagyobb a felszíne. Ha az eddig tanultak alapján valósítanánk meg a programot, akkor kétszer is be kellene gépelnünk a fent használt képletet. Ez több hibázási lehetőséget vet fel, hosszabb kódot eredményez, illetve nehezebben lehet módosítani a már megírt programon. Ezért a megvalósításnak úgy állunk neki, hogy írunk egy függvényt, amelynek két paramétere van. Az egyik a kúp magassága, másik az alapkörének a sugara. Ha a függvény meghívjuk az említett paraméterekkel, visszatérési értékében az adott kúp felszínét fogjuk megkapni. Ha implementáltuk a függvényt az összehasonlítás könnyen elvégezhető feltételes elágazás segítségével. A program megvalósítása (a teljes projekt: ConeSurfaceArea.sln): 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
using using using using using
System; System.Collections.Generic; System.Linq; System.Text; System.Threading.Tasks;
namespace ConeSurfaceArea { class Program { /** * TerĂźletszĂĄmolĂł fĂźggvĂŠny. * ParamĂŠterek: (double) alapkĂśr sugara, (double) test magassĂĄga * VisszatĂŠrĂŠsi ĂŠrtĂŠk: a test felszĂnĂŠnek terĂźlete
O l d a l 12 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014 15. 16. 17. 18.
*/ static double coneSurfaceArea(double radius, double height) { double area = Math.PI * Math.Pow(radius, 2) + Math.PI * radius * Math.Sqrt(Math.Pow(radiu s, 2) + Math.Pow(height, 2)); 19. return area; 20. } 21. static void Main(string[] args) 22. { 23. //adatok bekĂŠrĂŠse a felhasznĂĄlĂłtĂłl 24. Console.WriteLine("Elso test"); 25. Console.Write("R1 = "); 26. double r1 = Convert.ToInt32(Console.ReadLine()); 27. Console.Write("M1 = "); 28. double m1 = Convert.ToInt32(Console.ReadLine()); 29. 30. Console.WriteLine("Masodik test"); 31. Console.Write("R2 = "); 32. double r2 = Convert.ToInt32(Console.ReadLine()); 33. Console.Write("RM2 = "); 34. double m2 = Convert.ToInt32(Console.ReadLine()); 35. 36. if (coneSurfaceArea(r1, m1) > coneSurfaceArea(r2, m2)) //egy feltĂŠtelen belĂźl kĂŠtszer hasznĂĄljuk a megĂrt fĂźggvĂŠnyt 37. { 38. Console.WriteLine("Az elso nagyobb a masodiknal."); 39. } 40. else 41. { 42. if (coneSurfaceArea(r1, m1) < coneSurfaceArea(r2, m2)) 43. { 44. Console.WriteLine("A masodik angyobb az elsonel!"); 45. } 46. else 47. { 48. Console.WriteLine("A ket felszin egyenlo!"); 49. } 50. } 51. Console.ReadLine(); 52. } 53. } 54. }
A fejezethez kapcsolódó alaputasítások static int osszead(int x, int y) // ezek csak formális paraméterek {return x + y;} //ezt adja vissza, mint függvény static void var() // ha nincs visszatérési érték, akkor a void kulcsszót használjuk { Console.ReadLine(); } static void tomb(int[] x) {} // tömb is átadható paraméterként static void refer(ref int x) {} // az eredeti változót érjük el, új néven a függvényen belülről static void kimeno(int x, out int y); // kimenő paraméter // példa a függvények használatára static void Main(string[] args)
O l d a l 13 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014 { int a = 1, b = 2; // deklarálá, értékadás int[] d = new int[5]; // deklarálás, értékadás int c = osszead(a, b); // „függvény” használata var(); // paraméter nélküli eljárás használata, meghívása tomb(d); // egy paraméteres eljárás használata, meghívása referencia(ref a); // itt is jelezni kel, hogy referencia kimeno(a, out b); // itt is jelezni kell, hogy kimenő } //Leggyakrabban használt módosítószók: override static public private protected
Írj függvényt, amelynek paramétere két valós szám, visszatérési értéke a két szám összege! Írj függvényt, amely radiánban adott értéket fokra vált! Írj függvényt, amely megadja egy radiánban adott szög szinuszát!
O l d a l 14 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
6. Gyakorlat – Gyakorlás a zárthelyire 7. Gyakorlat – Első zárthelyi dolgozat
O l d a l 15 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
8. Gyakorlat – Egyszerű felhasználói felület, dialógusablakok A legtöbb egyszerű felhasználó számára a parancssor idegen, ehelyett a programok a saját ablakukban futnak, gombokat, szövegdobozokat, képeket tartalmaznak, felugró üzeneteket jelenítenek meg. Ismerjük meg a Windows Form alkalmazásokat! A gyakorlaton a következő témákat érintjük:
Windows Forms alkalmazás létrehozása felhasználói interaktivitás kezelése kommunikáció a felhasználóval, dialógusablakok dialógusablakok visszatérési értékei objektumok tulajdonságainak manipulálása
A probléma a következő: a kezemet a nyaki verőérhez szorítva érzem a pulzusom. Azonban nem szeretnék mindenre odafigyelni, vagy kiesni a ritmusból, nem akarok órát nézegetni, hogy megtudjam mennyi a percenkénti pulzusszámom. Írjunk egy alkalmazást, amin egy vezérlőt, vagy egy billentyűt nyomkodva a program a ritmus alapján meghatározza a pulzust. Ha az érték nagyjából stabil, egy felugró ablakban írjuk ki a mért értéket. Egy primitívebb megoldás:
Szükséges: Timer objektum, alapértelmezetten letiltva, indítása az első számlálással történik Label objektum, a mérések kijelzésére, esetleges hibakeresésre
O l d a l 16 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
Parancsgombok, a felhasználói bevitel megvalósításához Az egyes elemek tulajdonságait a mellékletben (a dokumentum végén) lehet olvasni. (ezeket a tulajdonságokat tervező nézetben a Properties fülön megadhatjuk, ezt a kódot generálja a Visual Studio, itt csak szemléltetés céljából szükséges) A következő programkód meglehetősen primitív, demonstrációs célú, nagyon sok ponton lehet optimalizálni a számítást, akár szűréssel, szekvenciálással (csak az utolsó x másodpercben mért eredményeket vesszük számításba, vagy azokat súlyozzuk inkább), stb. A program: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43.
using System; using System.Windows.Forms; namespace BPM_counter { public partial class Form1 : Form { public int beats = 0; // hány taktus történt eddig public float ticks = 0.5f; // szeretnénk tudni mennyi ideje mérünk public float bpm_value = 0; // az osztályon belül publikus adattagok, bármelyik további függvény // az osztályból hozzáfér ezekhez a változókhoz public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if(!timer1.Enabled) // ha még nem kezdtük el a számolást, kezdjük { timer1.Enabled = true; // ez lesz a számlálónk timer2.Enabled = true; // ez lesz a frissÃtÅ‘nk (használható a gomb is) } beats++; // számolnunk kell a leütéseket } private void timer1_Tick(object sender, EventArgs e) { ticks+=0.1f; //tized másodpercenként ketyeg az idÅ‘ } private void button2_Click(object sender, EventArgs e) { timer1.Enabled = false; timer2.Enabled = false; ticks = 0; beats = 0; label1.Text = "0"; // minden mérést alaphelyzetbe állÃt } private void timer2_Tick(object sender, EventArgs e) { // a másik timer-t nem szeretnénk leterhelni a konvertálásokkal, Ãgy azokat inkább itt végezzük label_ticks.Text = Convert.ToString(ticks); label_bpm_counter.Text = Convert.ToString(beats); bpm_value = beats * (60 / ticks); // az eddigi leütések és eltelt idÅ‘ alapján BPM sz ámÃtás if (Convert.ToDouble(label1.Text) - 2 < bpm_value && Convert.ToDouble(label1.Text) + 2 > bpm_value && ticks>5)
O l d a l 17 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57.
{ //ha két beat határon belül maradt az előző óta az érték, if(progressBar1.Value==progressBar1.Maximum) {// és a folyamatjelző betöltött, akkor végeztünk timer1.Enabled = false; timer2.Enabled = false; MessageBox.Show("Stabil érték: " + label1.Text, "Kész", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } // ha nem töltött még be, töltsünk! else progressBar1.Value++; } else progressBar1.Value=0; // ha az eltérés megnő, stabilizáljuk előről label1.Text = Convert.ToString(bpm_value); } } }
A fejezethez kapcsolódó alaputasítások button1_Click(sender,e); // másik vezérlő esemény-függvényének meghívása // dialógus ablak használata DialogResult result; result = MessageBox.Show("Kilép?", "Fejléc", // üzenet, fejléc MessageBoxButtons.YesNo, MessageBoxIcon.Question); // gombok, ikon if (result == DialogResult.Yes) Application.Exit(); // vizsgálat private void label1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) Application.Exit(); } new Form2().ShowDialog(); // másik form használata, Form2 mutatása Close(); // Form2-ből önkikapcsolás Application.Exit(); // Kilépés public static string a; // Form1-ben deklarálni az osztályban Form1.a = textBox1.Text; // Form2-ben értéket adni public struct s { public static int i; } // Form1-ben struktúra az osztályban s.i = 2; // Form2-ben értéket adni
Írj programot, amely tartalmaz egy ablakot egy gombbal. A gomb felirata legyen egy szám, amely egyenlő a gombon történt kattintások számával! Írj programot, amely tartalmaz egy ablakot egy „Kilépés” feliratú gombbal. A gomb megnyomására egy felugró ablakban keljen megerősíteni a kilépési szándékunkat! Írj programot, amely egy ablakot tartalmaz egy címkével (Label). Amennyiben az egeret a címke fölé húzzuk, változzon meg a színe! Írj összeadó programot, amely tartalmaz egy ablakot, két szövegmezőt, egy gombot és egy címkét. A gomb lenyomására a két szövegmezőbe írt valós érték összegét írja ki a címkére! Fontos ellenőrizni a felhasználó által beírt adatokat: amennyiben nem megfelelő adat kerül a szövegmezőbe (pl: szöveg), akkor a label felirata „Hibás adat!” legyen. Módosítsd a példaprogramot úgy, hogy csak az utolsó 10 másodpercet vegye figyelembe számításnál.
O l d a l 18 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
9. Gyakorlat – Rajzeszközök, speciális dialógus ablakok Az előző fejezetben megismerkedtünk a legfontosabb komponensekkel, amelyekből felépíthetjük saját grafikus felhasználói felületünket. A C#-ban rengeteg ilyen építőelem található, de gyakran merül fel az igény, hogy saját elemeket rajzoljunk az adott felületre. Gondoljunk például egy Tetris játékra. A menü elemeit, valamint a pontok és egyéb adatok megjelenítését rábízhatjuk a már előre definiált gombokra és címkékre, viszont a játéktér elemeit jó lenne, ha mi magunk rajzolhatnánk meg. Ehhez tekintsük át a C# rajzeszközeit! A gyakorlaton a következő témákat érintjük:
Graphics objektum színek kezelése egyszerű objektumok kirajzolása (kör, tégalalp, sokszögek…) képek a programban várakoztatás
Szeretnénk egy labda pattogását ábrázolni, amely az alkalmazás ablakán belül marad. Amint a labda eléri az ablak szélét, visszapattan és megváltoztatja a sebességét. A program megvalósítása: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
using using using using using using using using using
System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Linq; System.Text; System.Threading.Tasks; System.Windows.Forms;
namespace PoppingBall { public partial class Form1 : Form { private float x = 0; //kezdeti ĂŠrtĂŠkek beĂĄllĂtĂĄsa private float y = 0; private float speedx = 10; private float speedy = 0; private int radius = 15; Random r = new Random(); public Form1() { InitializeComponent(); x = this.Width / 2 - radius; //kĂśzĂŠpre ĂĄllĂtjuk a golyĂłt y = this.Height / 2 - radius; Random r = new Random(); speedx = (float)r.NextDouble() * 6 - 3; //kezdĹ‘ x ĂŠs y irĂĄnyĂş sebessĂŠgek speedy = (float)r.NextDouble() * 6 - 3; radius = 15; // kĂśr sugara timer1.Interval = 1; // a timer bekpcsolĂĄsa ĂŠs a tick beĂĄllĂtĂĄsa timer1.Enabled = true; }
O l d a l 19 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014 35. 36. 37. 38. 39. 40.
private void timer1_Tick(object sender, EventArgs e) { //ez a blokk fut le minden tick-nĂŠl, azaz 10 miliszekundumonkĂŠnt x += speedx; //ĂşjraszĂĄmoljuk a golyĂł helyĂŠt, a sebessĂŠg fĂźggvĂŠnyĂŠben y += speedy; if (x > this.Width - 2 * radius || x < 0) //ellenĹrizzĂźk, hogy a pĂĄlyĂĄn vane mĂŠg (x,y irĂĄny kĂźlĂśn) 41. { 42. speedx *= -1; 43. } 44. if (y > this.Height - 2 * radius || y < 0) 45. { 46. speedy *= -1; 47. } 48. Invalidate(); 49. } 50. 51. private void Form1_Paint(object sender, PaintEventArgs e) 52. { 53. Graphics g = this.CreateGraphics(); //Ăşjrarajzoljuk a 54. //formot minden tick utĂĄn Ăgy mindig az aktuĂĄlis helyĂŠt lĂĄtjuk a golyĂłnak 55. g.Clear(Color.White); //fehĂŠrre festjĂźk az egĂŠsz ablakor, hogy ne lĂĄtszĂłdjon a golyĂ ł elĹzĹ helyzete 56. Pen p = new Pen(Color.Black, 5); //ĂĄtĂĄllĂtjuk az ecset szĂnĂŠt 57. g.DrawEllipse(p, x,y, radius*2, radius*2); //kirajzoljuk a golyĂłt az Ăşj pozĂciĂłba 58. } 59. 60. } 61. }
A fejezethez kapcsolódó alaputasítások Graphics g = CreateGraphics(); // grafika létrehozása Color c = Color.FromArgb(szinR, szinG, szinB) // szín definiálása Pen p = new Pen(Color.Blue, 2); // toll létrehozása Point po = new Point(30, 60); // pont létrehozása Size s = new Size(50, 80); // méret létrehozása Rectangle t = new Rectangle(po, s); // téglalap létrehozása g.DrawRectangle(p, t); // a g grafika megrajzolása, p tollal, t téglalapot g.DrawLine(p,x1,y1,x2,y2); g.FillRectangle(Brushes.Red, t); // kitöltött t téglalap rajzolása pirossal g.FillEllipse(Brushes.Green, t); // kitöltött t befoglaló méretű ellipszis rajzolása SolidBrush b = new SolidBrush(c); // RGB színek label1.Font = new Font("Calibri", 8, FontStyle.Bold); // font megadása FontDialog fdg = new FontDialog(); // font dialógus objektum létrehozása fdg.ShowDialog(); // mutatás label1.Font = fdg.Font; // értékadás ColorDialog clg = new ColorDialog(); // font dialógus objektum létrehozása clg.ShowDialog(); // mutatás label1.ForeColor = clg.Color; // értékadás Image kep = new Bitmap(@"c:\001.jpg"); // kép deklarálása pictureBox1.Image = kep; // pictureBox értékadá
O l d a l 20 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014 System.Threading.Thread.Sleep(1000); // várakozás Application.DoEvents();
Írj programot, amely tartalmaz egy ablakot rajta egy gombbal. A program rajzoljon ki egy téglalapot, egy háromszöget és egy kört. A gomb megnyomására random színekkel töltse ki az említett síkidomokat! Írj programot, mely egy formon lévő label-nek a szín tulajdonságait állítja. A színbeállítást egy nyomógomb segítségével kezdeményezze. A színeket a szokásos windows beállító ablak segítségével lehessen kiválasztani. Egy további label-be jelenítsük meg a kiválaszott szín adatait is.
O l d a l 21 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
10.
Gyakorlat – Munka szöveges fájlokkal
Adatokat nem csak a memóriában tárolhatunk. Az alkalmazásunk bezárásával a hozzátartozó memória is elveszik, így használnunk kell a lemez tárolókapacitását, ha szeretnénk programfutások között értékeket tárolni (képeket, táblázatokat, szövegeket). A gyakorlaton a következő témákat érintjük:
fájl megnyitás, mentés dialógusablakok fájl megnyitása, lezárása StreamWriter, StreamReader (adatfolyamok) fájlból kiolvasás fájlba írás
Probléma: notepad.exe törölve lett a gépünkről, nincs internet, és szeretnénk szöveget szerkeszteni. Megoldás egyértelmű: írjuk meg a sajátunkat! Egy lehetséges megvalósítás:
Az egyes elemek tulajdonságait a mellékletben (a dokumentum végén) lehet olvasni.
O l d a l 22 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
Az alkalmazás ismét több irányba bővíthető (szakaszonként betűtípus kezelése, mentése, beolvasása, kereső, csere megvalósítása, stb.) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55.
using using using using
System; System.Text; System.Windows.Forms; System.IO;
namespace Notepad_Sharp { public partial class Form1 : Form { public string currentFile = ""; public bool fileModified = false; // kilépéskor megvizsgáljuk változtattunk-e public bool openingFile = false; // auto-mentés ne történjen a megnyitás közepén public bool saveFile(string filePath, bool save_As) { saveFileStart: try { if(save_As || filePath == "") { // ha mentés másként opciót választ, kérdezzük meg hová SaveFileDialog file = new SaveFileDialog(); file.Title = "Mentés másként..."; // fejléc file.Filter = "TXT fileok (*.txt)|*.txt"; file.ShowDialog(); // mutatás filePath = file.FileName; // az érték begyűjtése if (filePath == "") return false; this.Text = "Notepad# - " + filePath; } StreamWriter sw = new StreamWriter(filePath); sw.Write(richTextBox1.Text); // fájlba Ãrjuk a rtB tartalmát sw.Close(); // érdemes minden használat után lezárni a folyamot, feloldani a file -t fileModified = false; // épp most mentettünk return true; // hiba nélkül végeztünk } // ha sikertelen a mentés: catch(Exception e) { DialogResult popUp = MessageBox.Show("Kritikus hiba történt mentés közben: " + e, "Hiba történt!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); if (popUp == DialogResult.Retry) goto saveFileStart; return false; } } public bool openFile(string filePath) { openFileStart: try { openingFile = true; OpenFileDialog file = new OpenFileDialog(); file.Title = "Megnyitás"; // fejléc file.Filter = "TXT fileok (*.txt)|*.txt"; file.ShowDialog(); // mutatás filePath = file.FileName; // az érték begyűjtése if (filePath == "") return false; StreamReader sw = new StreamReader(filePath); richTextBox1.Text = sw.ReadToEnd(); // kiolvassuk
O l d a l 23 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014 56. 57. 58. 59. 60. 61. 62. 63. 64.
sw.Close(); openingFile = false; // lezártuk a streamet this.Text = "Notepad# - " + filePath; fileModified = false; // épp most nyitottuk meg return true; } // ha sikertelen a megnyitás: catch (Exception e) { DialogResult popUp = MessageBox.Show("Kritikus hiba történt megnyitás közben: " + e,
65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88.
"Hiba történt!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error); if (popUp == DialogResult.Retry) goto openFileStart; openingFile = false; // a stream létre sem jött return false; } } public Form1() { InitializeComponent(); } private void hosszúSzavakTördeléseToolStripMenuItem_Click(object sender, EventArgs e) { richTextBox1.WordWrap = !richTextBox1.WordWrap; hosszúSzavakTördeléseToolStripMenuItem.Checked = richTextBox1.WordWrap; } private void súgóToolStripMenuItem1_Click(object sender, EventArgs e) { System.Diagnostics.Process.Start("http://lmgtfy.com/?q=notepad+help"); } private void névjegyToolStripMenuItem_Click(object sender, EventArgs e) { MessageBox.Show("A világ legkirályabb jegyzettömbje, <xy> által, Neked!", "Notepad# v0.1", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } private void richTextBox1_TextChanged(object sender, EventArgs e) { if (automatikusMentésToolStripMenuItem.Checked && !openingFile) saveFile(currentFile, fa
lse); 89. else fileModified = true; // nem kell követni a módosÃtást ha állandóan mentünk 90. } 91. private void fontDialog1_Apply(object sender, EventArgs e) 92. { 93. richTextBox1.Font = fontDialog1.Font; 94. } 95. private void újToolStripMenuItem_Click(object sender, EventArgs e) 96. { 97. Application.Restart(); 98. } 99. private void mentésToolStripMenuItem_Click(object sender, EventArgs e) 100. { 101. saveFile(currentFile, false); 102. } 103. private void mentésMáskéntToolStripMenuItem_Click(object sender, EventArgs e) 104. { 105. saveFile(currentFile, true); 106. } 107. private void Form1_Load(object sender, EventArgs e) 108. { // amikor megnyitjuk az alkalmazást, feldolgozzuk az indÃtási paramétereket (HA kapunk) 109. if (Environment.GetCommandLineArgs().Length > 1) currentFile = Environment.GetComm andLineArgs()[1]; 110. if (currentFile != "") 111. { 112. openFile(currentFile);
O l d a l 24 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014 113. this.Text = "Notepad# - " + currentFile; 114. } 115. } // Ãgy az alkalmazásunkat beállÃthatjuk akár alapértelmezettnek egyes fájlok megnyitásához 116. private void megnyitásToolStripMenuItem_Click(object sender, EventArgs e) 117. { 118. openFile(currentFile); 119. } 120. private void Form1_FormClosing(object sender, FormClosingEventArgs e) 121. { 122. // Determine if text has changed in the textbox by comparing to original text. 123. if (fileModified) 124. { 125. // Display a MsgBox asking the user to save changes or abort. 126. DialogResult confirm = MessageBox.Show("Szeretnéd menteni a módosÃtásokat?", "Kilépés", 127. MessageBoxButtons.YesNoCancel); 128. if (confirm == DialogResult.Yes) saveFile(currentFile, false); 129. if (confirm == DialogResult.Cancel) e.Cancel = true; 130. } 131. } 132. private void betűtÃpusToolStripMenuItem_Click(object sender, EventArgs e) 133. { 134. if(fontDialog1.ShowDialog() == DialogResult.OK) 135. fontDialog1_Apply(this.betűtÃpusToolStripMenuItem, new System.EventArgs()); 136. } 137. } 138. }
A kód elején rögtön definiálva vannak a globális változóim, és két függvényem, egy a megnyitásra, egy a mentésre. Ezek paraméterezése jelentősen megkönnyíti a függvények újrafelhasználását, a fájlkezelés módjának bármikor egyszerű módosítását. A hibakezelést normális programban így nem szabad megvalósítani, kiszámíthatatlan működést okozhat. Egyenként le kell kezelnünk az esetlegesen számításba jövő hibákat, azokat akár a felhasználó beavatkozása nélkül megoldani, végső esetben felhasználói beavatkozást kérhetünk, vagy hibaüzenettel kilépünk az eljárásból. A fejezethez kapcsolódó alaputasítások using System.IO; OpenFileDialog file = new OpenFileDialog(); // megnyitási dialógusablak SaveFileDialog file = new SaveFileDialog(); // mentési dialógusablak file.InitialDirectory = @"C:\temp\"; // kezdőkönyvtár megadás file.InitialDirectory = Application.StartupPath; // a program futási könyvtára file.Title = "Megnyitás"; // fejléc file.Filter = "CSV fileok (*.csv)|*.csv"; file.ShowDialog(); // mutatás string path = file.FileName; // az érték begyűjtése string filenev = @"c:\"; // elérési út megadása StreamWriter sw = new StreamWriter(filenev); // fájl író létrehozása sw.WriteLine(); // írás fájlba StreamReader sr = new StreamReader(filenev); // fájl olvasó létrehozás sr.ReadLine(); // írás fájlba while (!sr.EndOfStream) ; // amíg véget nem ér a fájl sw.Close();// fájl bezárása
O l d a l 25 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
Írj programot, amely beolvassa a „text.txt” fájl tartalmát, majd eltávolítja belőle a szóközöket. Az így kapott karakterláncot jelenítsd meg szövegmezőben (TextArea)! Írj programot, amely generál 100 véletlen egész számot 1 és 100 között, majd a generált értékeket kiírja egy fájlba, valamint egy szövegmezőben megjeleníti azokat! A „szamok.txt” szöveges fájl minden sora egy számot tartalmaz (csak magát a számot minden más szemét nélkül). Olvasd be a fájlból ezeket az értékeket és egy szövegmezőbe írd ki a számok összegét!
O l d a l 26 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
11.
Gyakorlat – Bináris fájlok használata
Szeretnénk asztali alkalmazásunkhoz mentési funkciót biztosítani úgy, hogy azt a felhasználó ne manipulálhassa. Erre szükség lehet, ha el szeretnénk tárolni egy tetrisz játékban a legtöbb összegyűjtött pont értékét (könnyen belátható, hogy erre az előző fejezetben alkalmazott szöveges tárolás nem a legjobb megoldás). A gyakorlaton a következő témákat érintjük:
bináris fájlok áttekintése bináris fájlok megnyitása bináris fájlok szerkesztése, bezárása bináris fájlokból adatok kinyerése
A szöveges fájlokon kívül léteznek még bináris fájlok. Ezekben nem szöveget, hanem valamilyen adatfolyamot tárolunk. A fő különbség a két típus között, hogy míg szöveges fájlból könnyen tudunk információt kinyerni, addig bináris fájlok esetében tudnunk kell azok szerkezetét, azaz azt, hogy miként következnek egymás után az értelmes adatok. A fejezetben megismerjük ezeknek a fájloknak a használatának módjával. Hasonlóan a szöveges fájlokhoz, bináris fájlokat is olvashatunk, írhatunk, és meglévő fájlhoz hozzáfűzhetünk adatot. Fontos, hogy a fájl megnyitása és módosítása után lezárjuk az adatfolyamot, így más programok felhasználhatják a fájlt, miután befejeztük vele a munkát, továbbá így elkerülhetjük az esetleges adatvesztéseket is. Az NSA szeretné biztonságosan tárolni azoknak a városoknak a GPS koordinátáit, amelyekben ügynökeik rejtőznek. Mivel a terroristák kifejlesztettek egy robosztus szövegszerkesztő programot (lásd előző fejezet), más tárolási módhoz kellett folyamodniuk, annak érdekében, hogy ügynökeik ne lepleződjenek le. A megoldást a következő bináris struktúrában látják: Elemszám Típus Funkció 1 double Az első ügynök első GPS koordinátája 2 int32 Töltelék adat, bármilyen egész érték lehet 3 double Az első ügynök második GPS koordinátája 4 double A második ügynök első GPS koordinátája A program induláskor írja ki, hogy hány ügynök van a fájlban és írja ki azok GPS koordinátáit. Ezután adjon lehetőséget újabb elemek felvitelére. Megvalósítás: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
using using using using using using
System; System.Collections.Generic; System.IO; System.Linq; System.Text; System.Threading.Tasks;
namespace NSA { class Program {
O l d a l 27 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52.
static void Main(string[] args) { FileStream fs; //file rendszer lĂŠtrehozĂĄsa if (File.Exists("data.bin")) { fs = File.Open("data.bin", FileMode.Open); // ha lĂŠtezik megnyitjuk, beolvassuk az Ă źgynĂśkĂśk adatait BinaryReader br = new BinaryReader(fs); int num = 0; while (br.BaseStream.Position != br.BaseStream.Length) { num++; Console.WriteLine(); try { Console.Write("Num. " + num + " " + br.ReadDouble()); //elsĹ‘ koordinĂĄta beo lvasĂĄsa br.ReadInt32(); //nem ĂŠrdekes, hogy mit tartalmazĂł int32 Console.Write(" - " + br.ReadDouble()); //mĂĄsodik koordinĂĄta beolvasĂĄsa } catch (Exception e) { Console.WriteLine(e.GetBaseException()); } } Console.WriteLine(); Console.Write(" " + num + " ugynok adatai..."); fs.Close(); //file lezĂĄrĂĄsa FONTOS! } else { Console.WriteLine("Nincs mĂŠg letrehozva adatbazis!"); fs = File.Create("data.bin"); //ha nem lĂŠtezik lĂŠtrahozzuk a fĂĄjlt fs.Close(); //fĂĄjl lezĂĄrĂĄsa a lĂŠtrehzĂĄs utĂĄn. Ez is FONTOS! } try {
fs = File.Open("data.bin", FileMode.Append); //megnyutjuk a fĂĄjlt hozzĂĄfĹązĂŠsre BinaryWriter bw = new BinaryWriter(fs); //ĂrĂł adatfolyamot hozunk lĂŠtre int temp = Convert.ToInt32(0); //helyĂśrzĹ‘ int32 while (true) { //folyamatosan kĂŠrĂźnka felhasznĂĄlĂłtĂłl adatokat, amĂg 0,0 koordinĂĄtĂĄt nem ad meg. 53. Console.WriteLine(); 54. Console.WriteLine("Elso koordinata: "); 55. double p1 = Convert.ToDouble(Console.ReadLine()); 56. Console.WriteLine("Masodik koordinata: "); 57. double p2 = Convert.ToDouble(Console.ReadLine()); 58. 59. if (p1 == 0 && p2 == 0) 60. { 61. break; //nincs tĂśbb adat, kilpĂźnk a programbĂłl 62. } 63. bw.Write(p1); //sorban beleĂrunka fĂĄjlba 64. bw.Write(temp); 65. bw.Write(p2); 66. } 67. bw.Close(); 68. } 69. catch (Exception e)
O l d a l 28 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014 70. 71. 72. 73. 74. 75. 76. }
{ Console.WriteLine(e.GetBaseException()); //kezeljĂźk az esetleges IO kivĂŠteleket } Console.ReadLine(); } }
A fejezethez kapcsolódó alaputasítások //bináris fájlok FileStream fs; //file rendszer létrehozása if (File.Exists("data.bin")) // ha létezik megnyitjuk fs = File.Open("data.bin", FileMode.Open); else fs = File.Create("data.bin"); //ha nem létezik létrahozzuk BinaryWriter bw = new BinaryWriter(fs); ; //író BinaryReader br = new BinaryReader(fs); //olvasó fs.Seek(0, SeekOrigin.Begin); //elejére állunk bw.Write("alma"); //az első rekord bw.Write("1234"); //a második rekord string a = br.ReadString(); //alma string b = br.ReadString(); //1234 fs.Close(); //file lezárása while (fs.Position < fs.Length) // eof
Írj programot, amely bináris fájlba ír 100 arab 0 és 100 közé eső random számot, majd onnan visszaolvassa azokat és szövegdobozban megjeleníti azokat.
O l d a l 29 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
12.
Gyakorlat – Ismétlés
13.
Gyakorlat – Zárhelyi
14.
Gyakorlat – Pót zárthelyi
O l d a l 30 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
Informatikai rendszerek Melléklet 1. Gyakorlat – Algoritmusok elmélet, változók, programozás 2. Gyakorlat – Adatok beolvasása, műveletek változókkal 3. Gyakorlat – Tömbök kezelése, kivételkezelés 4. Gyakorlat – Függvények 5. Gyakorlat – Gyakorlás a zárthelyire 6. Gyakorlat – Első zárthelyi dolgozat 7. Gyakorlat – Egyszerű felhasználói felület, dialógusablakok 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
// // button1 // this.button1.Font = new System.Drawing.Font("Century Gothic", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238))); this.button1.Location = new System.Drawing.Point(96, 130); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 78); this.button1.TabIndex = 0; this.button1.Text = "Beat"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // timer1 // this.timer1.Tick += new System.EventHandler(this.timer1_Tick); // // label1 // this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label1.Font = new System.Drawing.Font("Century Gothic", 48F, System.Drawing.FontStyle.Regular, S ystem.Drawing.GraphicsUnit.Point, ((byte)(238))); this.label1.Location = new System.Drawing.Point(67, 27); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(140, 78); this.label1.TabIndex = 1; this.label1.Text = "0"; this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
O l d a l 31 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88.
// // progressBar1 // this.progressBar1.Location = new System.Drawing.Point(12, 226); this.progressBar1.Maximum = 10; this.progressBar1.Name = "progressBar1"; this.progressBar1.Size = new System.Drawing.Size(260, 23); this.progressBar1.TabIndex = 2; // // label_bpm_counter // this.label_bpm_counter.AutoSize = true; this.label_bpm_counter.Location = new System.Drawing.Point(172, 182); this.label_bpm_counter.Name = "label_bpm_counter"; this.label_bpm_counter.Size = new System.Drawing.Size(13, 13); this.label_bpm_counter.TabIndex = 3; this.label_bpm_counter.Text = "0"; // // label_ticks // this.label_ticks.AutoSize = true; this.label_ticks.Location = new System.Drawing.Point(172, 195); this.label_ticks.Name = "label_ticks"; this.label_ticks.Size = new System.Drawing.Size(13, 13); this.label_ticks.TabIndex = 4; this.label_ticks.Text = "0"; // // button2 // this.button2.Location = new System.Drawing.Point(96, 198); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(75, 23); this.button2.TabIndex = 5; this.button2.Text = "Alaphelyzet"; this.button2.UseVisualStyleBackColor = true; this.button2.Click += new System.EventHandler(this.button2_Click); // // timer2 // this.timer2.Interval = 1000; this.timer2.Tick += new System.EventHandler(this.timer2_Tick); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(284, 261); this.Controls.Add(this.button2); this.Controls.Add(this.label_ticks); this.Controls.Add(this.label_bpm_counter); this.Controls.Add(this.progressBar1); this.Controls.Add(this.label1); this.Controls.Add(this.button1); this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "Form1"; this.ShowIcon = false; this.Text = "BPM számláló"; this.ResumeLayout(false); this.PerformLayout();
O l d a l 32 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014
8. Gyakorlat – Rajzeszközök, speciális dialógus ablakok 9. Gyakorlat – Munka szöveges fájlokkal
1. System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourc eManager(typeof(Form1)); 2. this.menuStrip1 = new System.Windows.Forms.MenuStrip(); 3. this.fájlToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 4. this.újToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 5. this.megnyitásToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 6. this.automatikusMentésToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 7. this.mentésToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 8. this.mentésMáskéntToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 9. this.kilépésToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 10. this.szerkesztésToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 11. this.mégMitNemToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 12. this.formátumToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 13. this.hosszúSzavakTördeléseToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 14. this.betűtÃpusToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 15. this.nézetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 16. this.állapotsorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 17. this.súgóToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 18. this.súgóToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); 19. this.sToolStripMenuItem = new System.Windows.Forms.ToolStripSeparator(); 20. this.névjegyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
O l d a l 33 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78.
this.richTextBox1 = new System.Windows.Forms.RichTextBox(); this.fontDialog1 = new System.Windows.Forms.FontDialog(); this.menuStrip1.SuspendLayout(); this.SuspendLayout(); // // menuStrip1 // this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.fájlToolStripMenuItem, this.szerkesztésToolStripMenuItem, this.formátumToolStripMenuItem, this.nézetToolStripMenuItem, this.súgóToolStripMenuItem}); this.menuStrip1.Location = new System.Drawing.Point(0, 0); this.menuStrip1.Name = "menuStrip1"; this.menuStrip1.Size = new System.Drawing.Size(579, 24); this.menuStrip1.TabIndex = 1; this.menuStrip1.Text = "menuStrip1"; // // fájlToolStripMenuItem // this.fájlToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.újToolStripMenuItem, this.megnyitásToolStripMenuItem, this.automatikusMentésToolStripMenuItem, this.mentésToolStripMenuItem, this.mentésMáskéntToolStripMenuItem, this.kilépésToolStripMenuItem}); this.fájlToolStripMenuItem.Name = "fájlToolStripMenuItem"; this.fájlToolStripMenuItem.Size = new System.Drawing.Size(37, 20); this.fájlToolStripMenuItem.Text = "Fájl"; // // újToolStripMenuItem // this.újToolStripMenuItem.Name = "újToolStripMenuItem"; this.újToolStripMenuItem.Size = new System.Drawing.Size(184, 22); this.újToolStripMenuItem.Text = "Új"; this.újToolStripMenuItem.Click += new System.EventHandler(this.újToolStripMenuItem_Click); // // megnyitásToolStripMenuItem // this.megnyitásToolStripMenuItem.Name = "megnyitásToolStripMenuItem"; this.megnyitásToolStripMenuItem.Size = new System.Drawing.Size(184, 22); this.megnyitásToolStripMenuItem.Text = "Megnyitás"; this.megnyitásToolStripMenuItem.Click += new System.EventHandler(this.megnyitásToolStripMenuItem_Cl ick); // // automatikusMentésToolStripMenuItem // this.automatikusMentésToolStripMenuItem.Name = "automatikusMentésToolStripMenuItem"; this.automatikusMentésToolStripMenuItem.Size = new System.Drawing.Size(184, 22); this.automatikusMentésToolStripMenuItem.Text = "Automatikus mentés"; // // mentésToolStripMenuItem // this.mentésToolStripMenuItem.Name = "mentésToolStripMenuItem"; this.mentésToolStripMenuItem.Size = new System.Drawing.Size(184, 22); this.mentésToolStripMenuItem.Text = "Mentés"; this.mentésToolStripMenuItem.Click += new System.EventHandler(this.mentésToolStripMenuItem_Click);
79. //
O l d a l 34 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95.
// mentésMáskéntToolStripMenuItem // this.mentésMáskéntToolStripMenuItem.Name = "mentésMáskéntToolStripMenuItem"; this.mentésMáskéntToolStripMenuItem.Size = new System.Drawing.Size(184, 22); this.mentésMáskéntToolStripMenuItem.Text = "Mentés másként..."; this.mentésMáskéntToolStripMenuItem.Click += new System.EventHandler(this.mentésMáskéntToolStri pMenuItem_Click); // // kilépésToolStripMenuItem // this.kilépésToolStripMenuItem.Name = "kilépésToolStripMenuItem"; this.kilépésToolStripMenuItem.Size = new System.Drawing.Size(184, 22); this.kilépésToolStripMenuItem.Text = "Kilépés"; // // szerkesztésToolStripMenuItem // this.szerkesztésToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
96. this.mégMitNemToolStripMenuItem}); 97. this.szerkesztésToolStripMenuItem.Name = "szerkesztésToolStripMenuItem"; 98. this.szerkesztésToolStripMenuItem.Size = new System.Drawing.Size(77, 20); 99. this.szerkesztésToolStripMenuItem.Text = "Szerkesztés"; 100. // 101. // mégMitNemToolStripMenuItem 102. // 103. this.mégMitNemToolStripMenuItem.Enabled = false; 104. this.mégMitNemToolStripMenuItem.Name = "mégMitNemToolStripMenuItem"; 105. this.mégMitNemToolStripMenuItem.Size = new System.Drawing.Size(146, 22); 106. this.mégMitNemToolStripMenuItem.Text = "Még mit nem"; 107. // 108. // formátumToolStripMenuItem 109. // 110. this.formátumToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[ ] { 111. this.hosszúSzavakTördeléseToolStripMenuItem, 112. this.betűtÃpusToolStripMenuItem}); 113. this.formátumToolStripMenuItem.Name = "formátumToolStripMenuItem"; 114. this.formátumToolStripMenuItem.Size = new System.Drawing.Size(75, 20); 115. this.formátumToolStripMenuItem.Text = "Formátum"; 116. // 117. // hosszúSzavakTördeléseToolStripMenuItem 118. // 119. this.hosszúSzavakTördeléseToolStripMenuItem.Checked = true; 120. this.hosszúSzavakTördeléseToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Ch ecked; 121. this.hosszúSzavakTördeléseToolStripMenuItem.Name = "hosszúSzavakTördeléseToolStripMenuIt em"; 122. this.hosszúSzavakTördeléseToolStripMenuItem.Size = new System.Drawing.Size(195, 22); 123. this.hosszúSzavakTördeléseToolStripMenuItem.Text = "Hosszú sorok tördelése"; 124. this.hosszúSzavakTördeléseToolStripMenuItem.Click += new System.EventHandler(this.hosszúSz avakTördeléseToolStripMenuItem_Click); 125. // 126. // betűtÃpusToolStripMenuItem 127. // 128. this.betűtÃpusToolStripMenuItem.Name = "betűtÃpusToolStripMenuItem"; 129. this.betűtÃpusToolStripMenuItem.Size = new System.Drawing.Size(195, 22); 130. this.betűtÃpusToolStripMenuItem.Text = "BetűtÃpus"; 131. this.betűtÃpusToolStripMenuItem.Click += new System.EventHandler(this.betűtÃpusToolStripMenuItem_Click); 132. // 133. // nézetToolStripMenuItem
O l d a l 35 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014 134. 135.
// this.nézetToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150.
this.állapotsorToolStripMenuItem}); this.nézetToolStripMenuItem.Name = "nézetToolStripMenuItem"; this.nézetToolStripMenuItem.Size = new System.Drawing.Size(49, 20); this.nézetToolStripMenuItem.Text = "Nézet"; // // állapotsorToolStripMenuItem // this.állapotsorToolStripMenuItem.Enabled = false; this.állapotsorToolStripMenuItem.Name = "állapotsorToolStripMenuItem"; this.állapotsorToolStripMenuItem.Size = new System.Drawing.Size(128, 22); this.állapotsorToolStripMenuItem.Text = "Õllapotsor"; // // súgóToolStripMenuItem // this.súgóToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
151. this.súgóToolStripMenuItem1, 152. this.sToolStripMenuItem, 153. this.névjegyToolStripMenuItem}); 154. this.súgóToolStripMenuItem.Name = "súgóToolStripMenuItem"; 155. this.súgóToolStripMenuItem.Size = new System.Drawing.Size(46, 20); 156. this.súgóToolStripMenuItem.Text = "Súgó"; 157. // 158. // súgóToolStripMenuItem1 159. // 160. this.súgóToolStripMenuItem1.Name = "súgóToolStripMenuItem1"; 161. this.súgóToolStripMenuItem1.Size = new System.Drawing.Size(177, 22); 162. this.súgóToolStripMenuItem1.Text = "Súgó megjelenÃtése"; 163. this.súgóToolStripMenuItem1.Click += new System.EventHandler(this.súgóToolStripMenuItem1_C lick); 164. // 165. // sToolStripMenuItem 166. // 167. this.sToolStripMenuItem.Name = "sToolStripMenuItem"; 168. this.sToolStripMenuItem.Size = new System.Drawing.Size(174, 6); 169. // 170. // névjegyToolStripMenuItem 171. // 172. this.névjegyToolStripMenuItem.Name = "névjegyToolStripMenuItem"; 173. this.névjegyToolStripMenuItem.Size = new System.Drawing.Size(177, 22); 174. this.névjegyToolStripMenuItem.Text = "Névjegy"; 175. this.névjegyToolStripMenuItem.Click += new System.EventHandler(this.névjegyToolStripMenuItem _Click); 176. // 177. // richTextBox1 178. // 179. this.richTextBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.Anchor Styles.Top | System.Windows.Forms.AnchorStyles.Bottom) 180. | System.Windows.Forms.AnchorStyles.Left) 181. | System.Windows.Forms.AnchorStyles.Right))); 182. this.richTextBox1.BorderStyle = System.Windows.Forms.BorderStyle.None; 183. this.richTextBox1.Location = new System.Drawing.Point(0, 23); 184. this.richTextBox1.Name = "richTextBox1"; 185. this.richTextBox1.Size = new System.Drawing.Size(579, 326); 186. this.richTextBox1.TabIndex = 2; 187. this.richTextBox1.Text = ""; 188. this.richTextBox1.TextChanged += new System.EventHandler(this.richTextBox1_TextChanged); 189. //
O l d a l 36 | 37
Informatikai rendszerek 2013-14/2 Dr. Fekete Róbert Tamás példái alapján Vida Patrik Gábor, Ferencz Krisztián 2014 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205.
// fontDialog1 // this.fontDialog1.Apply += new System.EventHandler(this.fontDialog1_Apply); // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(579, 349); this.Controls.Add(this.richTextBox1); this.Controls.Add(this.menuStrip1); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MainMenuStrip = this.menuStrip1; this.Name = "Form1"; this.Text = "Nodepad#"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
206. 207. 208. 209. 210.
this.Load += new System.EventHandler(this.Form1_Load); this.menuStrip1.ResumeLayout(false); this.menuStrip1.PerformLayout(); this.ResumeLayout(false); this.PerformLayout();
10.
Gyakorlat – Bináris fájlok használata
11.
Gyakorlat – Ismétlés
12.
Gyakorlat – Zárhelyi
13.
Gyakorlat – Pót zárthelyi
O l d a l 37 | 37