OnTap Programming in C#

Embed Size (px)

Citation preview

Programming in C#A. L Thuyt1. Kiu d liu Kiu d liu byte char bool sbyte short ushort int unit float double decimal long ulong S byte 1 2 1 1 2 2 4 4 4 8 8 8 8 M t S nguyn khng du t 0-255 K t Unicode Gi tr logic true/ false S nguyn c du ( t -128 n 127) S nguyn c du gi tr t -32768 n 32767. S nguyn khng du 0 65.535 S nguyn c du 2.147.483.647 v 2.147.483.647 S nguyn khng du 0 4.294.967.295 Kiu du chm ng, gi tr xp x t 3,4E-38 n, 4E+38, vi 7 ch s c ngha.. Kiu du chm ng c chnh xc gp i, gi tr xp x t 1,7E-308 n 1,7E+308, vi 15,16 ch s c ngha. C chnh xc n 28 con s v gi tr thp phn, c dng trong tnh ton ti chnh, kiu ny i hi phi c hu t m hay M theo sau gi tr. Kiu s nguyn c du c gi tr trong khong : -9.223.370.036.854.775.808 n 9.223.372.036.854.775.807 S nguyn khng du t 0 n 0xffffffffffffffff

Vd:khai bo kiu d liu byte a=-1; // khai bo sai byte: 0-255 int a=5; // khai bo ng float b=55.6; double c=100.5; decimal a=3.14M;

Ghi ch: Kiu gi tr logic ch c th nhn c gi tr l true hay false m thi. Mt gi tr nguyn khng th gn vo mt bin kiu logic trong C# v khng c bt c chuyn i ngm nh no. iu ny khc vi C/C++, cho php bin logic c gn gi tr nguyn, khi gi tr nguyn 0 l false v cc gi tr cn li l true 2. K t c bit K t \ \ \\ \0 \a \b \f \n \r \t \v V d: string a = "\\Hello"; kt qu: \Hello string a = "\\Hello\0ABC"; kt qu: \Hello ABC string a = "\\Hello\n ABC"; kt qu: \Hello ABC string a = "\\Hello\n \rABC"; kt qu: \Hello ABC 3. Chuyn i kiu d liu Nhng i tng ca mt kiu d liu ny c th c chuyn sang nhng i tng ca mt kiu d liu khc thng qua c ch chuyn i tng minh hay ngm nh. Chuyn i nhm nh c thc hin mt cch t ng, trnh bin dch s thc hin cng vic ny. Cn chuyn i tng minh din ra khi chng ta gn p mt gi tr cho kiu d liu khc. V d, chng ta c th gn ngm nh mt s kiu short (2 byte) vo mt s kiu int (4 byte) mt cch ngm nh. Sau khi gn hon ton khng mt d liu v bt c gi tr no ca short cng thuc v int short x = 10; int y = x; // chuyn i ngm nh short x; ngha Du nhy n Du nhy kp Du cho \ K t null Alert Khong trng - backspace Sang trang form feed Dng mi u dng 1 khong cch tab ngang Tab dc

int y = 100; x = y;//bo li short x; int y = 500; x = (short)y; // p kiu tng minh, trnh bin dch khng bo li 4. Hng Hng cng l mt bin nhng gi tr ca hng khng thay i Hng c phn thnh ba loi: gi tr hng (literal), biu tng hng (symbolic constants), kiu liu k (enumerations). Gi tr hng: ta c mt cu lnh gn nh sau: x = 100; Biu tng hng: gn mt tn cho mt gi tr hng, to mt biu tng hng dng t kha const v c php sau: = ; const int DoSoi = 100; class Program { static void Main(string[] args) { const int DoSoi = 100; // C const int DoDong = 0; // C System.Console.WriteLine("Do dong cua nuoc {0}", DoDong); System.Console.WriteLine("Do soi cua nuoc {0}", DoSoi); Console.ReadLine(); } } Kt qu: Do dong cua nuoc 0 Do soi cua nuoc 100 Kiu lit k Kiu lit k n gin l tp hp cc tn hng c gi tr khng thay i (thng c gi l danh sch lit k) Vd: const int DoDong = 0; const int DoSoi = 100; const int DoNong = 60; const int DoAm = 40; const int DoNguoi = 20; Thay vo C# cung cp kiu lit k gii quyt vn trn class Program { enum NhietDoNuoc { DoDong = 0, DoNguoi = 20,

DoAm = 40, DoNong = 60, DoSoi = 100, } static void Main(string[] args) { System.Console.WriteLine("Nhiet do dong: {0}", (int)NhietDoNuoc.DoDong); System.Console.WriteLine("Nhiet do nguoi: {0}", (int)NhietDoNuoc.DoNguoi); System.Console.WriteLine("Nhiet do am: {0}", (int)NhietDoNuoc.DoAm); System.Console.WriteLine("Nhiet do nong: {0}", (int)NhietDoNuoc.DoNong); System.Console.WriteLine("Nhiet do soi: {0}", (int)NhietDoNuoc.DoSoi); Console.ReadKey(); } } 5. Cu lnh (statements) Trong C# mt ch dn lp trnh y c gi l cu lnh int x; // mt cu lnh x = 32; // cu lnh khc int y = x; // y cng l mt cu lnh Nhng cu lnh ny s c x l theo th t. C hai loi cu lnh phn nhnh trong C# l : phn nhnh khng c iu kin (unconditional branching statement) v phn nhnh c iu kin (conditional branching statement). Phn nhnh khng c iu kin: c th to ra bng hai cch: gi mt hm v dng t kho phn nhnh khng iu kin using System; class GoiHam { static void Main() { Console.WriteLine( Ham Main chuan bi goi ham Func()... ); Func(); Console.WriteLine( Tro lai ham Main() ); } static void Func() { Console.WriteLine( ---->Toi la ham Func()...); } } T kho phn nhnh khng iu kin: goto, break, continue, return Phn nhnh c iu kin: c to bi cc lnh iu kin. Cc t kha ca cc lnh ny nh : if, else, switch o Cu lnh if...else Ta c c php cu iu kin if... else sau:

if (biu thc iu kin) [else ] Nu cc cu lnh trong thn ca if hay else m ln hn mt lnh th cc lnh ny phi c bao trong mt khi lnh, tc l phi nm trong du khi { }: if (biu thc iu kin) { .... } [else { ... }] Biu thc iu kin ny s dng ton t quan h ln hn (>), cc ton t khc nh nh hn () int[] intArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; foreach (int item in intArray) { Console.Write("{0} ", item);

} Cu lnh nhy break v continue Khi ang thc hin cc lnh trong vng lp, c yu cu nh sau: khng thc hin cc lnh cn li na m thot khi vng lp, hay khng thc hin cc cng vic cn li ca vng lp hin ti m nhy qua vng lp tip theo. p ng yu cu trn C# cung cp hai lnh nhy l break v continue thot khi vng lp. Break khi c s dng s a chng trnh thot khi vng lp v tip tc thc hin cc lnh tip ngay sau vng lp. Continue ngng thc hin cc cng vic cn li ca vng lp hin thi v quay v u vng lp thc hin bc lp tip theo string signal = "0"; // Khi to tn hiu // bt u chu trnh x l tn hiu while (signal != "X") { //nhp tn hiu Console.Write("Nhap vao mot tin hieu: "); signal = Console.ReadLine(); // xut tn hiu hin thi Console.WriteLine("Tin hieu nhan duoc: {0}", signal); // phn x l tn hiu if (signal == "T") { // Tn hiu thot c gi // lu li s kin v thot Console.WriteLine("Ngung xu ly! Thoat\n"); break; } if (signal == "0") { // Tn hiu nhn c bnh thng // Lu li s kin v tip tc Console.WriteLine("Tat ca dieu tot!\n"); continue; } // Thc hin mt s hnh ng no // v tip tc Console.WriteLine("---bip bip bip\n");o

}

6. Ton t (Operations) Ton t gn: Ton t gn hay php gn lm cho ton hng bn tri thay i gi tr bng vi gi tr ca ton hng bn phi. Ton t gn l ton t hai ngi. y l ton t n gin nht thng dng nht v cng d s dng nht. Ton t ton hc: Ngn ng C# cung cp nm ton t ton hc, bao gm bn ton t u cc php ton c bn. Ton t cui cng l ton t chia nguyn ly phn d.

Cc php ton s hc c bn (+,-,*,/) Cc php ton s hc n gin nhng rt cn thit bao gm: php cng (+), php tr (-), php nhn (*), php chia (/) nguyn v khng nguyn Php ton chia ly d tm phn d ca php chia nguyn, chng ta s dng ton t chia ly d (%)

Ton t tng v gim Tnh ton v gn tr li Ton t ngha += Cng thm gi tr ton hng bn phi vo gi tr ton hng bn tri -= Ton hng bn tri c tr bt i mt lng bng gi tr ca ton hng bn phi *= Ton hng bn tri c nhn vi mt lng bng gi tr ca ton hng bn phi. /= Ton hng bn tri c chia vi mt lng bng gi tr ca ton hng bn phi. %= Ton hng bn tri c chia ly d vi mt lng bng gi tr ca ton hng bn phi. Ton t tng gim tin t v tng gim hu t Gi s mun kt hp cc php ton nh gia tng gi tr ca mt bin v gn gi tr ca bin cho bin th hai, ta vit nh sau: var1 = var2++; Cu hi c t ra l gn gi tr trc khi cng hay gn gi tr sau khi cng. gii quyt yu cu trn C# cung cp th t thc hin php ton tng/gim vi php ton gn, th t ny c gi l tin t (prefix) hay hu t (postfix) int valueOne = 10; int valueTwo; valueTwo = valueOne++; Console.WriteLine("Thuc hien tang sau: {0}, {1}", valueOne, valueTwo); valueOne = 20; valueTwo = ++valueOne; Console.WriteLine("Thuc hien tang truoc: {0}, {1}", valueOne, valueTwo); Kt qu: Thuc hien tang sau: 11, 10 Thuc hien tang truoc: 21, 21 Ton t quan h Nhng ton t quan h c dng so snh gia hai gi tr, v sau tr v kt qu l mt gi tr logic kiu bool (true hay false) Tn ton t So snh bng K hiu == Biu thc so snh value1 == 100 value1 == 50 Kt qu so snh true false

Khng bng Ln hn Ln hn hay bng Nh hn Nh hn hay bng Ton t logic Tn ton t K hiu and && or not || !

!= > >= < value2 value2 > value1 value2 >= 50 value1 < value2 value2 < value1 value1 < > = is == != AND &

Th t Tri Tri Tri Tri Tri Tri Phi Tri

9 10 11 12 13

Php ton logic Php ton logic iu kin iu kin iu kin Php gn

XOR ^ OR | AND && OR || ?: = *= /= %= += -= = &= ^= |=

Tri

Tri Tri Tri Phi Phi

14

Ton t ba ngi Hu ht cc ton t oi hi c mt ton hng nh ton t (++, --) hay hai ton hng nh (+,-,*,/,...). Tuy nhin, C# cn cung cp thm mt ton t c ba ton hng (?:). Ton t ny c c php s dng nh sau: ? : C th din gii theo ngn ng t nhin th ton t ny c ngha : Nu iu kin ng th lm cng vic th nht, cn ngc li iu kin sai th lm cng vic th hai. int value1; int value2; int maxValue; value1 = 10; value2 = 20; maxValue = value1 > value2 ? value1 : value2; Console.WriteLine("Gia tri thu nhat {0}, gia tri thu hai {1},gia tri lon nhat {2}", value1, value2, maxValue); Kt qu: Gia tri thu nhat 10, gia tri thu hai 20, gia tri lon nhat 20 Bi tp tng hp 1 Bi tp 1: Nhp vo, bin dch v chy chng trnh. Hy cho bit chng trnh lm iu g? class BaiTap3_1 { public static void Main() { int x = 0; for (x = 1; x < 10; x++)

{ System.Console.Write("{0:03}", x); } } } Bi tp 2: Tm li ca chng trnh sau? sa li v bin dch chng trnh. class BaiTap3_2 { public static void Main() { for (int i = 0; i < 10; i++) System.Console.WriteLine("so :{1}", i); } } Bi tp 3: Tm li ca chng trnh sau? sa li v bin dch chng trnh. class BaiTap3_3 { public static void Main() { double myDouble; decimal myDecimal; myDouble = 3.14; myDecimal = 3.14m; Console.WriteLine("My Double: {0}", myDouble); Console.WriteLine("My Decimal: {0}", myDecimal); } } Bi tp4: Tm li ca chng trnh sau? sa li v bin dch chng trnh. class BaiTap3_4 { static void Main() { int value; if (value > 100) ; System.Console.WriteLine("Number is greater than 100"); } } Bi tp 5: Vit chng trnh hin th ra mn hnh 3 kiu sau: * * * * * * * * * * * $$ $$ $$ $$ $$ $ $$$$ $$$ $$ $ * *** ***** ******* ********* ***********

* ** *** ****

a)

b)

c)

Bi tp 6: Vit chng trnh hin ra trn mn hnh. 1 232 34543 4567654 567898765 67890109876 7890123210987 890123454321098 90123456765432109 0123456789876543210 Bi tp 7: Vit chng trnh in k t s (0..9) v k t ch (a..z) vi mi k t tng ng ca tng k t V d: 0 : 48 1 : 49 .... 7. nh ngha lp nh ngha mt kiu d liu mi hay mt lp u tin phi khai bo ri sau mi nh ngha cc thuc tnh v phng thc ca kiu d liu . Khai bo mt lp bng cch s dng t kho class. C php y ca khai bo mt lp nh sau: [Thuc tnh] [B sung truy cp] class [: Lp c s] { } 8. Thuc tnh truy cp Thuc tnh truy cp quyt nh kh nng cc phng thc ca lp bao gm vic cc phng thc ca lp khc c th nhn thy v s dng cc bin thnh vin hay nhng phng thc bn trong lp. Thuc tnh public Gii hn truy cp Khng hn ch. Nhng thnh vin c nh du public c th c

private protected internal protected internal

dng bi bt k cc phng thc ca lp bao gm nhng lp khc. Thnh vin trong mt lp A c nh du l private th ch c truy cp bi cc phng thc ca lp A. Thnh vin trong lp A c nh du l protected th ch c cc phng thc bn trong lp A v nhng phng thc dn xut t lp A truy cp. Thnh vin trong lp A c nh du l internal th c truy cp bi nhng phng thc ca bt c lp no trong cng khi hp ng vi A. Thnh vin trong lp A c nh du l protected internal c truy cp bi cc phng thc ca lp A, cc phng thc ca lp dn xut ca A, v bt c lp no trong cng khi hp ng ca A.

9. Tham s ca phng thc void Method(int param1, button param2) { //... } 10. To i tng =new () 11. T kha this T kha this c dng tham chiu n th hin hin hnh ca mt i tng Tham chiu this ny c s dng thng xuyn theo ba cch: S dng khi cc bin thnh vin b che lp bi tham s a vo, nh trng hp sau: public void SetYear(int Nam) { this.Nam = Nam; } S dng tham chiu this truyn i tng hin hnh vo mt tham s ca mt phng thc ca i tng khc: public void Method1(OtherClass otherObject) { // S dng tham chiu this truyn tham s l bn // thn i tng ang thc hin. otherObject.SetObject(this); } Cch th ba s dng tham chiu this l mng ch mc (indexer), 12. Truyn tham s

Ngn ng C# a ra mt b sung tham s l ref cho php truyn cc i tng gi tr vo trong phng thc theo kiu tham chiu. V tham s b sung out trong trng hp mun truyn di dng tham chiu m khng cn phi khi to gi tr ban u cho tham s truyn. Ngoi ra ngn ng C# cn h tr b sung params cho php phng thc chp nhn nhiu s lng cc tham s Truyn tham chiu Nhng phng thc ch c th tr v duy nht mt gi tr, mc d gi tr ny c th l mt tp hp cc gi tr. Nu chng ta mun phng thc tr v nhiu hn mt gi tr th cch thc hin l to cc tham s di hnh thc tham chiu public class Time { public void DisplayCurrentTime() { Console.WriteLine("{0}/{1}/{2}/ {3}:{4}:{5}", Date, Month, Year, Hour, Minute, Second); } public int GetHour() { return Hour; } public void GetTime(int h, int m, int s) { h = Hour; m = Minute; s = Second; } public Time(System.DateTime dt) { Year = dt.Year; Month = dt.Month; Date = dt.Day; Hour = dt.Hour; Minute = dt.Minute; Second = dt.Second; } private int Year; private int Month; private int Date; private int Hour; private int Minute; private int Second; } public class Program { static void Main() {

System.DateTime currentTime = System.DateTime.Now; Time t = new Time(currentTime); t.DisplayCurrentTime(); int theHour = 0; int theMinute = 0; int theSecond = 0; t.GetTime(theHour, theMinute, theSecond); System.Console.WriteLine("Current time: {0}:{1}:{2}", theHour, theMinute, theSecond); } } Kt qu: 8/6/2002 14:15:20 Current time: 0:0:0 thc hin nh mc ch ca chng ta l ly cc gi tr ca Hour, Minute, Second th phng thc GetTime() c ba tham s c truyn di dng tham chiu. Ta thc hin nh sau, u tin, thm l thm khai bo ref vo trc cc tham s trong phng thc GetTime(): public void GetTime(ref int h, ref int m, ref int s) { h = Hour; m = Minute; s = Second; } iu thay i th hai l b sung cch gi hm GetTime truyn cc tham s di dng tham chiu nh sau: t.GetTime( ref theHour, ref theMinute, ref theSecond); Truyn tham chiu vi bin cha khi to Ngn ng C# bt buc phi thc hin mt php gn cho bin trc khi s dng. Do nu chng ta khng khi to bin theHour, theMinute, v bin theSecond trc khi truyn nh tham s vo phng thc GetTime() th trnh bin dch s bo li int theHour; int theMinute; int theSecond; t.GetTime( ref int theHour, ref int theMinute, ref int theSecond); kt qu: Use of unassigned local variable theHour Use of unassigned local variable theMinute Use of unassigned local variable theSecond m rng cho yu cu trong trng hp ny ngn ng C# cung cp thm mt b sung tham chiu l out. Ta c mt s thay i cho phng thc GetTime() nh sau: public void GetTime(out int h, out int m, out int s) { h = Hour; m = Minute;

s = Second; } v cch gi mi phng thc GetTime() trong Main(): t.GetTime( out theHour, out theMinute, out theSecond);S dng 3 cch truyn

public class Time { public void DisplayCurrentTime() { Console.WriteLine("{0}/{1}/{2}/ {3}:{4}:{5}", Date, Month, Year, Hour, Minute, Second); } public int GetHour() { return Hour; } public void GetTime(int hr, out int min, ref int sec) { // Nu s giy truyn vo >30 th tng s Minute v Second = 0 if (sec >= 30) { Minute++; Second = 0; } Hour = hr; // thit lp gi tr hr c truyn vo // Tr v gi tr mi cho min v sec min = Minute; sec = Second; hr = Hour; min = Minute; sec = Second; } public Time(System.DateTime dt) { Year = dt.Year; Month = dt.Month; Date = dt.Day; Hour = dt.Hour; Minute = dt.Minute; Second = dt.Second; } private int Year; private int Month; private int Date; private int Hour;

private int Minute; private int Second;

}public class Program { static void Main() { System.DateTime currentTime = System.DateTime.Now; Time t = new Time(currentTime); t.DisplayCurrentTime(); int theHour = 3; int theMinute; int theSecond = 20; t.SetTime(theHour, out theMinute, ref theSecond); Console.WriteLine("The Minute is now: {0} and {1} seconds ", theMinute, theSecond); theSecond = 45; t.SetTime(theHour, out theMinute, ref theSecond); Console.WriteLine("The Minute is now: {0} and {1} seconds", theMinute, theSecond); Console.ReadKey(); } } Np chng phng thc (overloading) Thng thng khi xy dng cc lp, ta c mong mun l to ra nhiu hm c cng tn, ta c th xy dng nhiu cc phng thc cng tn nhng nhn cc tham s khc nhau. Chc nng ny c gi l np chng phng thc (Overload) void myMethod(int p1); void myMethod(int p1, int p2); void myMethod(int p1, string p2); ng gi d liu vi thnh phn thuc tnh Phng thc ly d liu (getter method) v phng thc thit lp d liu (setter method). public int A { get { return a; } set { a = value; } } private int a;

Thuc tnh ch c public static readonly int Year; Bi tp: Bi tp 1: Xy dng mt lp ng trn lu gi bn knh v tm ca ng trn. To cc phng thc tnh chu vi, din tch ca ng trn. Bi tp 2: Thm thuc tnh BanKinh vo lp c to ra t bi tp 1. Bi tp 3: To ra mt lp lu tr gi tr nguyn tn myNumber. To thuc tnh cho thnh vin ny. Khi s c lu tr th nhn cho 100. V khi s c truy cp th chia cho 100. Bi tp 7: Vit lp gii phng trnh bc hai. Lp ny c cc thuc tnh a, b, c v nghim x1, x2. Hy xy dng theo hng i tng lp trn. Lp cho php bn ngoi xem c cc nghim ca phng trnh v cho php thit lp hay xem cc gi tr a, b, c.

13. K tha a hnh Trong lp trnh hng i tng, k tha l cch to lp mi t cc lp c nh ngha t trc. Cc lp mi, gi l lp con hay lp dn xut, tha hng cc thuc tnh v hnh vi ca cc lp ngun gc, c gi l cc lp cha hay lp c s. Mc ch ca vic ny l ti s dng m chng trnh c sn m khng phi sa i hoc ch phi sa t class A { public void methodA() { Console.WriteLine("Day la Class A"); } } class B : A { public void methodB() { Console.WriteLine("Day la Class B"); } } class Tester { public static void Main() { B b = new B(); b.methodA(); b.methodB(); } } 14. a hnh

Tnh a hnh c th hin trong lp trnh hng i tng rt c bit. Ngi lp trnh c th nh ngha mt thuc tnh (chng hn thng qua tn ca cc phng thc) cho mt lot cc i tng gn nhau nhng khi thi hnh th dng cng mt tn gi m s thi hnh ca mi i tng s t ng xy ra tng ng theo tng i tng khng b nhm ln. Th d: khi nh ngha hai i tng "hinh_vuong" v "hinh_tron" th c mt phng thc chung l "chu_vi". Khi gi phng thc ny th nu i tng l "hinh_vuong" n s tnh theo cng thc khc vi khi i tng l "hinh_tron" class hinh { public hinh() {} public virtual void chuvi() { } } class hinhvuong : hinh { int a, cv; public hinhvuong(int a) { cv = 0; this.a = a; } public override void chuvi() { base.chuvi(); cv = a * 4; Console.WriteLine("Chu vi hinh vuong voi canh {0} la {1} ", a, cv); } } class hinhtron : hinh { double bk, cv; double pi = 3.14; public hinhtron(double bk) { this.bk = bk; cv = 0; } public override void chuvi() { base.chuvi(); cv = 2 * pi * bk; Console.WriteLine("Chu vi hinh tron voi ban kinh {0} la {1} ", bk, cv); }

} class Tester { public static void Main() { hinhvuong hv = new hinhvuong(5); hv.chuvi(); hinhtron ht = new hinhtron(5); ht.chuvi(); Console.ReadKey(); } }

15. X l ngoi l (Exception) Cu lnh throw pht tn hiu mt s khng bnh thng trong mt lp ca ngn ng C#, chng ta pht sinh mt ngoi l. lm c iu ny, chng ta s dng t kha throw. Dng lnh sau to ra mt th hin mi ca System.Exception v sau throw n: throw new System.Exception(); Cu lnh catch Trong C#, mt trnh x l ngoi l hay mt on chng trnh x l cc ngoi l c gi l mt khi catch v c to ra vi t kha catch. try { int a = 5; int b = 0; int c = a / b; } catch () { } Cc lp ngoi l Tn ngoi l MethodAccessException ArgumentException ArgumentNullException M t Li truy cp, do truy cp n Li tham s i mc i mc Null, phng thc c truyn i mc null khng c chp nhn

ArithmeticException ArrayTypeMismatchException DivideByZeroException FormatException IndexOutOfRangeException InvalidCastException MulticastNotSupportedException NotFiniteNumberException NotSupportedException NullReferenceException OutOfMemoryException OverflowException StackOverflowException TypeInitializationException

Li lin quan n cc php ton Kiu mng khng hp, khi c lu tr kiu khng thch hp vo mng Li chia zero nh dng khng chnh xc mt i mc no Ch s truy cp mng khng hp l, dng nh hn ch s nh nht hay ln hn ch s ln nht ca mng Php gn khng hp l Multicast khng c h tr, do vic kt hp hai delegate khng ng Khng phi s hu hn, s khng hp l Phng thc khng h tr, khi gi mt phng thc khng tn ti bn trong lp. Tham chiu null khng hp l. Out of memory Li trn php ton Trn stack Kiu khi to sai, khi b khi dng tnh c li.