Download - C# nyelvi áttekintő
C# nyelvi áttekintő
A „Programozás C# nyelven (Illés Zoltán)” könyv 2008-as kiadásának nyomdokain…
Az alábbi diákon felvetődő számok, a könyvbeli oldalszám(oka)t jelölik.
Változók/állandók definiálása char ch; int egy, tizenegy; const float g=9.81; // valós konstans g=2.3; // !! HIBA const int min = 0; // egész konstans
Változók inicializálása char s = ’a’; int []a = {1,2,3}; char[]b = „Egy”;
Változók / állandók (32-34)
char (2 byte -> unikód ábrázolás) char c = ’a’;
string fontosabb operátorok: +, +=, @
[] a string indexelése: pl. "szia"[1] = z // read-only. @”C:\programok\alma.txt” -> érzékeny karakterek
fontosabb függvények… később Érdekesség:
string s = „vmi” + a; // a integer (a –ra a ToString meghívódik ilyenkor)
Elemi típusok (34-39)
int (4 byte) long (8), short (2), sbyte, float (4), double (8),
decimal (16) u előjel: unsigned, nem előjeles uint, ulong,
ushort, byte void (fv. visszatérő paramétere) bool (1 byte)
true/false http://msdn.microsoft.com/en-us/library/s1
ax56ch(v=vs.110)
Elemi típusok (34-39)
newint[]a;a = new int(); // egy egész számára elegendő hely foglalása = new int[5]; // 5 egész szám !, ++, --
a = ++b -> // hatása: b=b+1; a=b; // b=3 akkor b=4 és a = 4
a = b++ -> // hatása: a=b; b=b+1; // b = 3 akkor b=4 és a =3
Egy operandusú operátorok (45-46)
(típus) kifejezés // típuskényszerítés (cast)int a = (int)9.81F;Console.WriteLine(a); // 9 Másik lehetőség a konvertálásraint a = int.Parse("1"); // a = 1int b = Convert.ToInt32("1"); // b = 1
Egy operandusú operátorok (45-46)
A Convert használható minden gyakori típus átkonvertálásához.
Létezik Convert.ToInt32() … Convert.ToFloat() CTS = Common Type System CTS Boolean, Int16, Int32, Int64, Float,
Double, String, Decimal, Byte, Char
Convert.ToCTSTípusnév
*, /, % (maradékképzés) +, - i is int // i az int típusból van-e létrehozvavar a = 16;
if (a is int) {Console.WriteLine("Szám!");
}
if (a is String) {Console.WriteLine("Szöveg!");
}i as int // két operandusú típuskényszerítés (csak referenciákra és nullablekre)
Két operandusú operátorok (46-52)
Három operandusú e1 ? e2 : e3
Két operandusú értékadó operátorok: +=, -=, *=
Továbbiak: http://
msdn.microsoft.com/en-us/library/6a71f45d
Egyéb operátorok (52 - 56)
int[]numbers; // vektordefiníciónumbers = new int[10]; numbers = new int[20];// automatikus szemétgyűjtés Kézzel inicializált tömb:int[] n = {3,4,5,6};int[] n = new int[]{3,4,5,6};int[]n = new int[4]{3,4,5,6}; Logikai vektor automatikus elemei: false, Referencia vektor-é : null Továbbá: Multidimenziós vektor, Vektorok vektora,…
Adattípusok, Tömbök (57-61)
struct név{<hozzáférés,alap privát> típus mezőnevek;<hozzáférés,alap privát> függvénydefiníció;} Hozzáférési szintek: private, public, internal
(assemblyn belül érhető el)
Adattípusok, Struktúrák (62-66)
Fontos megjegyezni:1. Nem lehet struktúrából származtatni2. Nem lehet a mezőket deklaráláskor inicializálni3. Van beépített, default konstruktor (paraméter
nélkül) de az sem inicializálja a mezőket. (saját kell)
4. Bár érték típusú a struktúra, ha saját konstruktorral szeretnénk inicializálni, azért a new operátorral kell létrehozni. Bár ekkor is a vermen (stack) fog tárolódni.
Adattípusok, Struktúrák (62-66)
struct Pont {public int x;public int y;
}
Pont p; // OKp.x = 5;p.y = 6;
Struktúra példa
struct Pont {private int x;private int y;
public Pont(int a, int b) {x = a;y = b;}
}
Pont p(2,3); // HIBÁS, bár C++-ban jó lenne.Pont p = new Pont(2, 3); // OK, de így a stacken jön létre
Struktúra példa (2)
Kifejezés utasítás kifejezés;
Létezik a kifejezés nélküli ; utasítás, és értelme is van, például végtelen ciklus írása:
for(;;){ // végtelen ciklus }
Utasítások, kifejezések (67)
Alapvetően:if(kifejezés){ utasítás; }if(kifejezés){ utasítás; } else { utasítás; } Többirányú elágazás:switch(kifejezés<string|int>){
case érték1: utasítás1; <break|goto|return>;case érték2: utasítás2; <break|goto|return>;
..default: utasítás; <break|goto|return>;
}
Elágazás utasítás (68-69)
Minden elágazás végére kötelező (nem úgy mint C/C++-ban) a befejező utasítás (break|goto|return) ahol aktuálisan valamilyen utasításokat is közlünk a címke után.
Elágazás utasítás (2)
Ha mégis több címkéhez szeretnénk valamilyen aktivitást rendelni, például így tehetjük meg:
switch (1) { case 1: case 2: MessageBox.Show("1"); MessageBox.Show("1 és 2"); break; default: break;}
Elágazás utasítás (3)
While (elöl tesztelős)while(kifejezés igaz){ utasítás; }while(true) {…} // végtelen ciklus Do (hátul tesztelős)do{…}while(kifejezés igaz){utasítás;}do{…}while(false){utasítás} // biztosan egyszer lefut Forfor(int i =0; i <5; i++){ utasítás1;..} Foreachforeach(azonosító in vektor){ utasítás; }
Ciklusok (70-75)
break;A legbelső while, do, for utasítást hagyja abba (vagy switchet). continue;Folytatja..int i = 1;while(true){
i++;if(i<10) continue; // következő ciklusmag
if(i==11) break; // Ciklus végeConsole.WriteLine(i);
} goto címke; NEM AJÁNLOTT, de létezik.
Ugró utasítások (75-82)
Könyvtárak használatausing névtér_vagy_osztály vagyusing(objektum){utasítások;} Disposable objektumokhoz, pl
StreamReader/StreamWriter A kivételkezeléshez is kapcsolódik
(később…)
Egyéb utasítások (75-82)
Érték szerinti paraméter átadás (83) static int maxfv(int a, int b) { return a > b ? a : b; } int c = maxfv(1, 2); MessageBox.Show(c.ToString()); // out: 2
Függvények
Rekurzív függvény példa:static int factor(int a) { return ((a <= 1) ? 1 : a * factor(a - 1));} Érdemes meggondolni hogy milyen
adattípussal számolunk/adunk vissza Ez a függvény hamar túllépi az int
megengedhető tartományát (exponenciális)!
Függvények
Referencia szerinti paraméter átadás (ref) (84. o.) void csere(ref int x, ref int y) { int t = x; x = y; y = t; } int a = 2, b = 3;csere(ref a, ref b); // fontos a ref kulcsszó!MessageBox.Show("{0}, {1}", a, b); // out: 3, 2
Függvények
Függvény eredmény paramétere (out) (85)void csere(out int x, out int y) { int t = x; x = y; y = t; } int a = 2, b = 3;csere(ref a, ref b);MessageBox.Show("{0}, {1}", a, b);
Függvények
Függvény eredmény paramétere (out) (85)void osszead(int x, int y, out int osszeg) { osszeg = x + y;} int a = 2, b = 3, c = 0;osszead(a, b, out c); MessageBox.Show("{0} ", c); // 5
Függvények
Tömbök paraméterben (86)void csere(int []cserelendo) { int t = cserelendo[0]; cserelendo[0] = cserelendo[1]; cserelendo[1] = t;} int[] cserelj = {2, 3};csere(cserelj);MessageBox.Show("{0}, {1}", cserelj[0], cserelj[1]); // 3, 2
Függvények
Változó számú paraméter átadása (89-91)void csere(params int[] list) { int t = list[0]; list[0] = list[1]; list[1] = t;} Fog-e látszani a csere a hívó fél számára?
Függvények
Változó számú paraméter átadása Ekkor „rendes” paramétert is megadhatunk,
de szigorúan csak a változó számú paraméter definiálása előtt.
void rendez(int n, params int[] miket) void rendez(params int[] miket, int n) // hiba
Függvények
Függvények túlterhelése (91-92) Cél: Ugyanazt a funckiót ne kelljen máshogy
elnevezni, csak mert más típusokra szeretnénk végrehajtani.
double maximum(double x, double y) int maximum(int x, int y)
Függvények
Osztályok definiálásaclass Pont {
private int x; // adattagokprivate int y;
public Pont() { // konstruktor}
public Pont(int a, int b) { // felüldefiniált konstruktorx = a;y = b;
}}
Osztályok (102)
Tulajdonságokclass Pont {
private int x;public int y;
public int X {get {
return x;}set {
x = value;}
}….}
Osztályok / tulajdonságok (118)
class Pont {private int x; // automat. letrejon, nem is kellpublic int y;
public int X { get; set; } // automatikus tulajdonság
public Pont() { }
public Pont(int a, int b) {x = a;y = b;}
}
Osztályok / tulajdonságok (118)
Alapvetően (a Törtek érettségi feladathoz) int sz1 = 0; // számláló változótry{
sz1 = int.Parse(Console.ReadLine());}catch (Exception){
Console.WriteLine("Hiba a beolvasás közben!");}
Kivétel kezelés (146-153)
Ha tudjuk a konkrét hiba típusát.try{
sz1 = int.Parse(Console.ReadLine());}catch (FormatException){
Console.WriteLine("A megadott érték felismerhetetlen számként!");}catch (OverflowException){
Console.WriteLine("A megadott érték túl nagy/kicsi!");}catch (Exception) { // biztos ami biztos
Console.WriteLine("Ismeretlen hiba!");}
Kivételkezelés (146-153)
int sz1 = 0;try{
sz1 = int.Parse(Console.ReadLine());}catch (Exception){
Console.WriteLine("Ismeretlen hiba!");}finally {
Console.WriteLine("Ez a blokk biztosan lefut!");}
Kivételkezelés (146-153)
checked/unchecked – miért van rá szükség?int a = Int32.MaxValue; // az intek maximum értéketry{
a += 1;}catch (OverflowException){
Console.WriteLine("'a' értéke túl nagy!"); // nem váltódik ki}finally {
Console.WriteLine("a: {0}", a); // -2. 147. 483. 647}
Kivételkezelés (146-153)
int a = Int32.MaxValue; // maximum értéktry{
checked{
a += 1;}
}catch (OverflowException){
Console.WriteLine("'a' értéke túl nagy!"); // kiváltódik!}finally {
Console.WriteLine("a: {0}", a); // marad Int32.MaxValue}
Kivételkezelés (146-153)
Length – a karakterlánc hossza CompareTo(string) – ha az eredmény 0, akkor azonos Equals(string) – eredmény boolean IndexOf(string) – eredmény egy index v. -1 Insert(int,string) – a második paraméterül kapott
szöveget beszúrja az elsőbe, az adott indextől Fontos: Ezek nem módosítják az eredeti
karakterláncot, max. visszatérési értékbe adják az újat.
Ha mégis ez a cél: StringBuilder.
Fontosabb String függvények
Math.Sin(x), Math… // a következők elé mind kell a Math. Cos(x), Tan(x), Exp(x), Log(x), Sqrt(x),
Abs(x), Round(x), Ceiling(x), Floor(x), Pow(x,y)
Konstansok Math.PI Math.E
Fontosabb fv.-ek a Math névtérben
String http://
msdn.microsoft.com/en-us/library/system.string.aspx Math http
://msdn.microsoft.com/en-us/library/system.math(v=vs.110).aspx
További függvények…
Illés Zoltán.: Programozás C# nyelvenJOS, 2008, Második, átdolgozott kiadás
Internetes: http://www.jos.hu (érettségi feladatok) http://msdn.microsoft .com
Teljes C# referencia http://msdn.microsoft.com/en-us/library/618a
yhy6(v=vs.110)
Felhasznált irodalom