strukturalt programozas c#
Embed Size (px)
TRANSCRIPT
Ksztette: Subecz Zoltn, Szolnoki Fiskola, http://suzo.uw.hu, [email protected]
Strukturlt programozsC# Console mdban
Hzi feladat:Nhny pldhoz folyamatbrt s algoritmust - pszeudokdot kszteni.Tbbhz pszeudokdot s kevesebbhez folyamatbrt.TartalomjegyzkBevezets21. Alapok42. Tmbk213. Nhny kiegszt plda294. Karakter tpus355. Karakterlncok ( Stringek )386. Metdusok, Eljrsok, fggvnyek457. ArrayList List ( lista )548. Struktra ( Rekord, Struct )579. Fjlkezels5910. Kivtelkezels6511.Lpsenknti futtats-Nyomkvets7012. Egyb71
Ajnlott irodalom:
- James Foxall: Tanuljuk meg a Visual C# 2008 hasznlatt 24 ra alattKiskapu KiadA Fiskola knyvtrban s a Jegyzetboltban is megtallhat.
http://csharptk.ektf.hu
Reiter Istvn: C#:http://people.inf.elte.hu/reiter_i/sharp.htmlhttp://devportal.hu/content/CSharpjegyzet.aspx
Ills Zoltn knyve:Google: ills zoltn c# filetype:pdfhttp://compalg.inf.elte.hu/~tony/Informatikai-Konyvtar/09-Programozas%20C-sharp%20nyelven/Programozas-Csharp-nyelven-Konyv.pdf
C# mesteri szinten 21 nap alatt.rarInterneten tbb helyrl letlthet. => Googlepl.http://eduzso.freeiz.com/files/masodik_ev/I/prog1-2/C%20mesteri%20szinten%2021%20nap%20alatt/
http://dragon.ektf.hu/ebooks/ => Magasszint Programozsi Nyelvek I. Feladatgyjtemny
Chuck Sphar-Stephen Randy Davis: C# 2008Tantusz Knyvek sorozat, Panem Kiad
http://hu.wikipedia.org/wiki/C_Sharp_programoz%C3%A1si_nyelvhttp://csharp.lap.huhttp://nyelvek.inf.elte.hu/leirasok/Csharp/index.phpBevezets
Sok fajta programozsi nyelv van. Ilyen nyelv az SQL is, amit mr megismertek. Vannak specilis cl programozsi nyelvek, amelyeket egy rszterletre fejlesztettek ki, s vannak ltalnos cl programozsi nyelvek. http://hu.wikipedia.org/wiki/Programoz%C3%A1si_nyelvhttp://hu.wikipedia.org/wiki/Programoz%C3%A1si_nyelvek_kateg%C3%B3ri%C3%A1k_szerinthttp://wiki.prog.hu/wiki/Programoz%C3%A1si_nyelvhttp://wiki.prog.hu/wiki/Programoz%C3%A1si_nyelvek_list%C3%A1jahttp://wiki.hup.hu/index.php/Programoz%C3%A1si_nyelvhttp://programozas.lap.hu
A C# korszer, modern a Microsoft ltal kifejlesztett programozsi nyelv. A C# napjaink egyik kedvelt programozsi nyelve. A Windows programozshoz fejlesztettk ki. Mivel a teljes Windows programozsra alkalmas, ezrt ilyen nagy mret. Nhny msik npszer nyelv:Pascal nyelv: http://hu.wikipedia.org/wiki/Pascalhttp://pascal.lap.hu/Egy ingyenes Pascal fejleszt s fordt:www.freepascal.org
C++ nyelv: http://hu.wikipedia.org/wiki/C%2B%2Bhttp://cplusplus.lap.hu/Egy ingyenes C++ fejleszt s fordt:Dev C++: http://www.bloodshed.net/devcpp.html
A C# nem egybl a processzor szmra azonnal futtathat natv kdot fordt, hanem egy gynevezett kztes kdot a .NET keretrendszer szmra.(Teht hasonlan mkdik, mint a Java )
A C# (a Visual Basic mellett) a .NET keretrendszer egyik f programozsi nyelve.
A .NET az XP-ben mg nincs alapbl benne, de a Vistban mr benne van. A C# teleptsekor automatikusan felteszi a .NET keretrendszert XP-nl is. De ha egy msik gpen szeretnnk futtatni programunkat, amelyiken XP van, akkor a .NET keretrendszert eltte fel kell telepteni. Az .NET ingyenesen letlthet a www.microsoft.com honlaprl.A .NET keretrendszernek is van tbb verzija.Keresbe berva: .net framework => megadja a pontos letltsi helyet.
.net framework 3.0 => Windows XP SP2 kell hozz.net framework 4.0 => Windows XP SP3 kell hozz
A .NET keretrendszerben is benne van a C# fordt. (C# compiler) (csc.exe). gy a programjaink fordtst a Visual Studio fejlesztkrnyezet nlkl is meg tudnnk oldani. ( Lsd. 1. fejezet: Alapok vge )gy az 500Mb felteleptse helyett (Visual Studio) elg lenne a 3Mb ( .NET ) felteleptse is.A grafikus programok ksztst is meg tudnnk oldani a Visual Studio fejlesztkrnyezet nlkl is.De mivel a grafikus programok ksztshez nagyon hasznos a grafikus fejleszt krnyezet, ezrt otthonra is teleptsk fel az ingyenes C# fejleszt krnyezetet:http://www.microsoft.com/visualstudio/en-us/products/2008-editions/expressInnen elg csak a Visual C# 2008 Express Edition t feltelepteni.
http://hu.wikipedia.org/wiki/C_Sharp_programoz%C3%A1si_nyelvoldalrl:
C#
A C# a Microsoft ltal a .NET keretrendszer rszeknt kifejlesztett objektumorientlt programozsi nyelv. A nyelv alapjul a C++ s a Java szolglt. A C#-ot gy terveztk, hogy meglegyen az egyensly a fejleszt nyelvi szabadsga s a gyors alkalmazsfejleszts lehetsge kztt.
A C# nagyon hasonlt a Java nyelvhez, de knnyebb a hasznlata.
A C# az a programozsi nyelv, ami a legkzvetlenebb mdon tkrzi az alatta mkd, minden .NET programot futtat .NET keretrendszert, valamint ersen fgg is attl: nincsen nem menedzselt, natv mdban fut C# program. A primitv adattpusai objektumok, a .NET tpusok megfeleli. Szemtgyjtst hasznl, valamint az absztrakciinak tbbsge (osztlyok, interfszek, delegltak, kivtelek) a .NET futtatrendszert hasznlja kzvetlen mdon.
A C-hez hasonlan a kis- s nagybetk itt is klnbznek, teht ValtozoNev s a valtozonev kt klnbz dolgot jelent majd.(ez a pascalosok szmra lehet majd zavar, de meg lehet szokni)
1. Alapok
Bevezets: A C# futtatst, fordtst 2 mdon tehetjk meg:a, A C# fejleszt krnyezettel.b, A fejlesztkrnyezet nlkli csc.exe-vel Mivel a .NET keretrendszerben is benne van a C# fordt. (C# compiler) (csc.exe). Ezrt a programjaink fordtst a C# fejlesztkrnyezet nlkl is meg tudnnk oldani.A Visual Studio C# fejlesztkrnyezetet nem is kellene hozz feltelepteni csak a .NET keretrendszert.Aki akarja, vlaszthatja a fordtsnak ezt a mdjt rn is.( 1. fejezet vgn megnzzk.)a, A C# fejleszt krnyezettel:C# indtsa utn:File men/ New Project / Console ApplicationAdjunk nevet a projectnek, elrsi utat, majd kattintsunk az OK gombra
VAGY: File men/ New Project / Console Application utn:File men => Save All => Knyvtr kivlasztsa
Ez, vagy ehhez hasonl jelenik meg a szerkeszti ablakban:
using System;using System.Collections.Generic;using System.Linq;using System.Text;
namespace ConsoleApplication1{ class Program { static void Main(string[] args) { } }}
Ebbl elszr sok minden elhagyhat, de benne is maradhat minden.
1/1. pldaLegegyszerbb fut C# program:
class proba { static void Main() {
} }
class: osztly megadsa ( majd az Objektumorientlt Programozs, OOP tantrgyban lesz rszletesen. )nevet kell adni az osztlynak, itt probaOsztlydeklarci megadsa. Publikus, azaz brmely ms projekt szabadon hasznlhatja az osztlyt.
void: eljrs ( az OOP-ben metdusnak hvjk )static: az OOP-hez ( class, osztly ) kapcsold fogalom. Majd ott megnzzk.
{}: rszek sszefogsa, csoportosts
Main(): a program f eljrsa ( metdusa ).Ez a program belpsi pontja, ahol a program vgrehajtsa megkezddik.
Futtats: Debug men/Start Debuging, vagy F5, vagy Start Debuging ikon az eszkztron.
fut - nem r ki semmit - visszaugrik a szerkeszt kpernyre.
1/2. Pldarassuk ki a kpernyre, hogy Hello, s vrjon billentyletsre.
class proba2 { static void Main() { System.Console.WriteLine("Hello"); System.Console.ReadLine(); } }
System egy elre definilt nvtr ( namespace )Nvtr: OOP-ben lesz rla szA rendszer ltal tartalmazott utastsokat itt trolja.Console: A System nvtr egy osztlya, amit a Console Alkalmazsoknl (Console Applications ) az Inpu/Outputra hasznlunk.A Console egy rendszerobjektum, ami egy parancssort jelkpez. A Console objektum WriteLine metdusnak meghvsa a paramterknt tadott szveget kirja a parancssorba.
WriteLine: A Console osztly eljrsa ( metdusa ), a paramterknt tadott szveget kirja a parancssorba.+ soremels!ReadLine: hasonlan: egy sor szveget olvas be a billentyzetrl.itt hasznlata: Enter letsre vr.A System.Console.ReadLine(); utasts nlkl: kirn a szveget a kpernyre, de visszaugrana a szerkeszt kpernyre.
Ha a program elejre kirjuk, hogy using System;, akkor az utastsok el nem kell kirni, hogy System.:
using System; class proba2 { static void Main() { Console.WriteLine("hello"); Console.ReadLine(); } }
1/3. Plda rjuk ki egyms al 3 sorba: Hello1, Hello2, Hello3
using System; class proba2 {static void Main() { Console.WriteLine("Hello1\nHello2\nHello3"); Console.ReadLine(); }}
Az egyszersg miatt a Main()-en kvli rszt nem rom ki.
1/4. PldaVegynk fel 2 egsz vltozt: b=5,a=3rassuk ki 5 sorba: Hello1,a-vltoz,Hello2,b-vltoz,Hello3
static void Main() { int b=5,a=3;// A tisztn OOP nyelvekben (mint a C# s a Java), minden objektum// adattagok + metdusok// Egy egyszer vltoz is.// Ha itt berjuk, hogy a.akkor egybl mutatja a metdusait. Console.WriteLine("Hello1\n"+a+"\nHello2\n"+b+"\nHello3"); Console.ReadLine(); }
1/5.pldarassuk ki 10-szer egyms al, hogy Hello, majd Enter lets utn kpernytrls, majd rassuk ki 1-tl 15-ig az egszeket egyms al.
static void Main() { int a; for(a=1;aa= 7 b=3 (2 sorban)Console.WriteLine("a= {0}\nb= {1}",a,b);// mint az elzConsole.WriteLine(a/b); // -> 2Console.WriteLine((double) a/b); // -> 2,333333333333333
double c;c = 7;Console.WriteLine(c/b); //-> 2,333333333333333
c = a / b; Console.WriteLine(c); //-> 2Console.WriteLine((double) c); //-> 2
c = (double) a / b;Console.WriteLine(c); //-> 2,333333333333333
Console.ReadLine(); }
1/13.pldaSzmtsuk ki 1-tl 25-ig a szmok tlagt, s rassuk ki.
static void Main() { int a,osszeg = 0; for (a = 1; a Kosarlabda.zip => jatekos.txt fjl tartalmt rassa ki a kpernyre- Az elz pldban a fjl soraiban az adatok tabultorral vannak tagolva. (Ez Jegyzettmbben is lthat!)Olvassa be az adatokat egy tmbbe. (Sztring tpus tmb) (Split-el darabolni)A tmbnek annyi sora legyen, mint amennyi adatsor van a fjlban. ( Ezt programmal szmoltassa meg elszr)Majd szmtsa ki a magassgok tlagt, s rassa ki az tlagot.
10. Kivtelkezels
A C# nyelv a futsidej hibk kiszrsre alkalmas eszkzt is tartalmaz, mely eszkzsegtsgvel a programjainkba hibakezel (kivtel kezel) kdrszleteket pthetnk.A kivtel kezel eljrsok lnyege, hogy elkerljk a futs kzbeni hibk esetn felbukkanhibazeneteket, s megvdjk programjainkat a vratlan lellstl.
A try s a catch
A try parancs segtsgvel a programok egyes rszeihez hibakezel rutinokat rendelhetnk,melyek hiba esetn az ltalunk megrt hibakezel eljrsokat hajtjk vgre, s ami nagyonfontos, megakadlyozzk a program lellst.A catch segtsgvel azokat a kivteleket kaphatjuk el, melyek a try blokkban keletkeznek. Itthatrozhatjuk meg, hogy milyen rutinok fussanak le s hogyan kezeljk a felmerl hibkat.
Kivtelkezels nlkl a program a hiba helyn megszakad.
Kivtelkezels:A program futsa nem szakad meg hibs mkds esetn, hanem egy msik programrszlet hajtdik vgre.
10.1 Pldausing System;class elso{ static void Main() { try { Console.WriteLine("Hello1"); int[] tomb1 = new int[10]; tomb1[15] = 3;// A 10 elem tmb 15. elemre hivatkozunk Console.WriteLine("Hello2"); } catch (Exception e) { Console.WriteLine("hiba: " + e.Message); } finally { Console.WriteLine("Hello3"); Console.ReadKey(); } }}A kvetkezt rja ki:Hello1hiba: Index was outside the bounds of the arrayHello3
A finally blokkban elhelyezett kd mindig lefut, fggetlenl az eltte keletkezett hibktl.(kivve ha a program vgzetes hibval ll le.)Az elz programban ez is j:---------------------- catch (Exception) { Console.WriteLine("hiba: "); }----------------------
Ilyenkor a kirs:
Hello1hiba: Hello3
vagy (Exception) nlkl:
---------------------------------- catch { Console.WriteLine("hiba: "); }----------------------------------A kirats ugyanaz.
A catch blokkban definilt hibakezel rsz lefut, vagyis a kpernyn megjelenik a hibazenet.Abban az esetben, ha nem hasznljuk a hibakezel eljrsokat, a programunk lell, s ahiba kezelst a .NET vagy az opercis rendszer veszi t. Ebbl a pldbl is jl lthatmilyen nagy szksg lehet a kivtelkezelre, ha jl mkd programokat akarunk rni.Fokozottan rvnyes ez azokra a programokra, ahol a felhasznl adatokat visz be.A kvetkez programban erre lthatunk pldt. Amennyiben az inputrl nem megfeleladatok rkeznek, mkdsbe lp a kivtel-kezels, a catch blokkban elkapjuk a hibt skirjuk az okt a kpernyre.
10.2 Plda
using System;class Program{ static void Main() { try { Console.WriteLine("Adj meg egy egszet!"); int i = Convert.ToInt32(Console.ReadLine()); } catch (Exception e) { Console.WriteLine(e.Message); } Console.ReadLine(); }}
Ha a beolvassnl nem egsz szmot adunk meg, hanem pl. egy szveget, akkor a kvetkez hibazenetet kapjuk:Input string was not in a correct format.
10.2/B PldaMint az elz plda, de addig olvassuk be az adatot, amg nem egsz jn.Ha egsz jn, akkor rjuk ki a ktszerest.
class Program{ static void Main() { bool ujra = true; Console.WriteLine("Adj meg egy egszet!"); while (ujra) { try { int i = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("A szm ktszerese: "+2 * i); ujra = false; } catch (Exception e) { Console.WriteLine("Nem egszet adtl meg! Prblkozz jra!"); } } Console.ReadLine(); }}
Az elz pldban a try blokkban elfordul brmely hiba esetn ugyanaz a hibazenet jelenik meg a kpernyn.A catch blokkban lehetsgnk van a klnbz okok miatt keletkezett hibksztvlasztsra, a hiba tpusnak meghatrozsra.
A System nvtrben rengeteg kivtel tpust definiltak. A fontosabbakat az albbitblzatban foglaltuk ssze:
Kivtel neve Lersa
MemberAccesException Tagfggvny hozzfrsi hiba
ArgumentException Hibs tagfggvny-paramter
ArgumentNullException Null rtk tagfggvny paramter
ArithmeticException Matematikai mvelet-hiba
ArrayTypeMismatchException Tmbtpus hibja (rtk trolskor)
DivideByZeroException Nullval val oszts
FormatException Hibs paramter-formtum
IndexOutOfRangeException Tmb tl, vagy alulindexelse
InvalidCastException rvnytelen tpus talakts
NotFiniteNumberException A keletkezet rtk nem vges (hibs szmalak)
NullReferenceException Null rtkre val hivatkozs
NotSupportedException Nem tmogatott tagfggvny
OutOfMemoryException Elfogyott a memria
OverflowException Tlcsorduls (checked esetn)
StackOverflowException Verem tlcsorduls
TypeInitializationException Hibs tpus bellts (static konstruktornl)
10.3 Plda
A Matematikai mvelet-hibra egy plda:
using System;class Program{ static void Main() { int a = 0; double c; try { c = 10 / a + 30; } catch (ArithmeticException ar) { Console.WriteLine("Aritmetikai hiba : "+ar); Console.ReadLine(); }
}}
0-val val osztsra egybknt egy hibazenet ablak jelenik meg.
Kivtelek feldobsa - throw
A C# nyelv lehetsget ad a sajt magunk ltal definilt kivtelek hasznlatra is. A kivtelekdobsa a throw kulcsszval trtnik.Nemcsak a keretrendszer lthatja azt, hogy a normlis utasts vgrehajtst nem tudja folytatni, ezrt kivtelt generl, s ezzel adja t a vezrlst, hanem maga a programoz is. Hogy a programoz mikor ltja szksgesnek a kivtel generlst, az r van bzva.
10.4 Plda
using System;class Program{ static void Main() { Console.WriteLine("Adj meg egy nem negatv szmot!"); double i=Convert.ToDouble(Console.ReadLine()); try {
if (i>=0) Console.WriteLine("A szm gyke= "+Math.Sqrt(i)); else throw new Exception(); // ha i=0) Console.WriteLine("A szm gyke= "+Math.Sqrt(i)); else throw new Exception("Hibs szmot rtl be."); // ha i Windows => => Locals: minden loklis vltozt mutat=> Watch: egyesvel meg lehet adni vltozkat
Trspontok elhelyezse.Debug men => Toggle BreakpointA kurzor helynl elhelyez egy trspontot.A trspontoknl megll a program vgrehajtsa.
12. Egyb
Halmaz HashSet
using System.Collections.Generic;
static void Main(string[] args) { HashSet szamok = new HashSet(); Console.WriteLine(szamok.Count); szamok.Add(5); Console.WriteLine(szamok.Count); szamok.Add(5); Console.WriteLine(szamok.Count); szamok.Add(7); szamok.Add(9); Console.WriteLine(szamok.Count); foreach (int i in szamok) { Console.Write(" {0}", i); } Console.WriteLine(); int a = 7; if (szamok.Contains(a)) Console.WriteLine("Benne van."); else Console.WriteLine("Nincs benne."); szamok.Remove(5); Console.WriteLine(szamok.Count);
// Vannak halmaz mveletek: // Unio: szamok.UnionWith // Metszet: szamok.IntersectWith // Tmbb letet konvertlni: // int[] tomb = hash.ToArray()
// s sok egyb mvelet. Console.ReadLine(); }
Queue Sor
Sorba => => Sorbl
FIFO modell: First In First OutAmit elszr betettnk a sorba, azt tudjuk onnan kivenni.Fbb mveletek:Enqueue A sorba betesz egy rtketDequeue Sorbl kivesz egy rtket.
using System;using System.Collections;class Program{ static void Main() { Queue sor = new Queue(); sor.Enqueue("Hello1"); sor.Enqueue("Szia"); sor.Enqueue(153); foreach (object o in sor) Console.WriteLine(o); Console.WriteLine("\nA sor elemeinek a szma= " + sor.Count); sor.Dequeue(); foreach (object o in sor) Console.WriteLine(o); Console.WriteLine("\nA sor elemeinek a szma= " + sor.Count); Console.ReadLine(); }}
Kirja: Hello1Szia153.Szia153
Valban az elsnek betett elemet trlte ki.
Felsorols tpus - Enum
A felsorolt tpus olyan adatszerkezet, amely meghatrozott rtkek nvvel elltott halmazt kpviseli. Felsorolt tpust az enum kulcssz segtsgvel deklarlunk, a Main()-en kvl.
A felsorols minden tagjnak megfeleltethetnk egy egsz (numerikus) rtket. Ha mst nem adunk meg, akkor alaprtelmezs szerint a szmozs nulltl kezddik s deklarci szerinti sorrendben (rtsd: balrl jobbra) eggyel nvekszik.
class Program { enum szinek { piros, kk, zld, srga }; enum betuk { a = 'a', b = 'b' }; enum jszinek { piros = 4, kk = 7, zld = 8, srga = 12 }; static public void Main() { szinek sajatszin = szinek.zld; Console.WriteLine(sajatszin+" "+(int)sajatszin+"\n"); // kirja a sznt //ciklus a szneken trtn vgighaladsra for (jszinek i = jszinek.piros; i