Bài t p L p Trình H
ng
i
ng C#
CL C CH NG I: L P VÀ I T NG .............................................................................. 6 A. TÓM T T LÝ THUY T ........................................................................................... 6 1. Khai báo l p ............................................................................................................... 6 2. S d ng các i t ng c a l p .................................................................................... 7 3. T khóa this ................................................................................................................ 7 4. S d ng các t khóa m c truy c p .......................................................................... 8 5. B kh i d ng( constructor) ......................................................................................... 9 6. B sao chép(constructor)............................................................................................. 9 7. Hàm h y b (destructor)............................................................................................. 11 8. S d ng các thành viên t nh static ............................................................................. 12 9. N p ch ng ph ng th c ............................................................................................ 14 10. óng gói d li u thông qua các thu c tính............................................................... 14 B. BÀI T P M U ........................................................................................................ 15 1. Xây d ng l p ............................................................................................................ 15 2. S d ng l p............................................................................................................... 17 3. L p l ng nhau và cách truy xu t................................................................................ 24 4. Ch ng trình khai báo nhi u l p ............................................................................... 26 5. Con tr this ............................................................................................................... 29 6. S d ng con tr this trao i t ng hi n hành nh m t tham s , minh h c s d ng bi n khai báo private............................................................................................................. 31 7. Hàm thi t l p và hàm thi t l p sao chép, hàm sao chép cho l p vector....................... 33 8. S d ng hàm thi t l p sao chép và hàm h y b .......................................................... 36 9. Ki u d li u m ng, các ph ng th c có giá tr tr v , constructor sao chép............... 39 10. S d ng các thành ph n t nh.................................................................................... 42 11. Hàm kh i t o private c m t o th hi n c a i t ng.......................................... 44 12. N p ch ng ph ng th c .......................................................................................... 46 13. Xây d ng m t l p vecto và hi n các phép toán trên vector ...................................... 48 14. Gói ghém d li u thông qua các thu c tính.............................................................. 52 C. CÂU I LÝ THUY T VÀ TR C NGHI M ........................................................ 56 D. BÀI T P T GI I .................................................................................................. 57 E. BÀI T P T NG H P .............................................................................................. 60 CH NG II: N P CH NG TOÁN T TRÊN L P................................................... 62 A. TÓM T T LÝ THUY T ......................................................................................... 62 1. Toán t ..................................................................................................................... 62 2. Ch ngToán t ........................................................................................................... 62 3. Cú pháp n p ch ng toán t ........................................................................................ 62 4. Toán t m t ngôi....................................................................................................... 63 5. Toán t hai ngôi ........................................................................................................ 63 6. H tr ngôn ng .NET khác ...................................................................................... 63
Trang 3
Bài t p L p Trình H
ng
i
ng C#
7. Ph m vi s d ng c a các toán t ............................................................................... 64 8. M t s tr ng h p nên s d ng các toán t n p ch ng .............................................. 64 9. Yêu c u khi s d ng toán t ...................................................................................... 65 10. u và nh c m c a ch ng toán t ...................................................................... 65 B. BÀI T P M U ........................................................................................................ 65 1. Ch ng toán t (+) i v i hai vector.......................................................................... 65 2. Ch ng toán t m t ngôi............................................................................................. 67 3. Xây d ng m t l p sophuc có hai ph n th c (real) và o (imaginary). p ch ng toán t +, và i d u s ph c. ....................................................................................................... 69 4. Xây d ng m t l p phân s v i tên là phanso và a n ng hoá toán t trên l p. Th c hi n các nhi m v sau................................................................................................................. 71 5. Xây d ng m t l p vector và th c hi n các yêu c u sau.............................................. 75 C. BÀI T P T GI I................................................................................................... 79 D. BÀI T P TR C NGHI M, LÝ THUY T.............................................................. 83 CH NG III: K TH A............................................................................................. 86 A. TÓM T T LÝ THUY T ......................................................................................... 86 1. K th a ..................................................................................................................... 86 2. T khoá Base ............................................................................................................ 87 3. T khoá New ............................................................................................................ 87 4. Nghiêm c m k th a ................................................................................................. 87 5. Cách truy xu t Protected ........................................................................................... 87 6. L p tr u t ng:......................................................................................................... 87 7. S khác nhau gi a ph ng th c a hình v i ph ng th c tr u t ng ........................ 88 8. G c c a t t c các l p (L p Object)........................................................................... 88 9. Ki u Boxing và Unxing............................................................................................. 89 10. L p l ng nhau ......................................................................................................... 90 B. BÀI T P M U ........................................................................................................ 90 1. Xây d ng l p d n xu t th a k t l p c s ............................................................... 90 2. M c truy c p Protected......................................................................................... 96 3. Cách truy nh p c a t khóa Internal và Public......................................................... 100 4. L p c s và i t ng thành ph n.......................................................................... 105 5. Nghiêm c m k th a ............................................................................................... 110 C. M T S CÂU H I LÝ THUY T ......................................................................... 112 D. CÂU H I T TR L I ........................................................................................ 113 E. BÀI T P T GI I................................................................................................. 115 CH NG III: A HÌNH THÁI.................................................................................. 118 A. TÓM T T LÝ THUY T ....................................................................................... 118 1. Tính a hình............................................................................................................ 118 2. Ghi è 118 3. L p tr u t ng........................................................................................................ 118 4. S khác nhau gi a ph ng th c a hình v i ph ng th c tr u t ng: .................... 119 5. L p l ng nhau ......................................................................................................... 119 B. BÀI T P M U ...................................................................................................... 119
Trang 4
Bài t p L p Trình H
ng
i
ng C#
C. M T S CÂU H I LÝ THUY T ......................................................................... 128 D. CÂU H I T TR L I ........................................................................................ 129 E. BÀI T P T GI I................................................................................................. 129 CH NG IV: GIAO DI N ........................................................................................ 131 A. TÓM T T LÍ THUY T......................................................................................... 131 1. Khái ni m v giao di n............................................................................................ 131 2. Cài t m t giao di n .............................................................................................. 131 3. Truy xu t ph ng th c c a giao di n ...................................................................... 131 4. Toán t is:............................................................................................................... 131 5. Toán t as ............................................................................................................... 132 6. Th c thi ph quy t giao di n ................................................................................... 132 7. Th c hi n giao di n m t cách t ng minh............................................................... 132 B. BÀI T P M U ...................................................................................................... 132 1. S d ng giao di n ................................................................................................... 132 2. M r ng m t giao di n và s th c thi nhi u giao di n c a m t l p .......................... 134 3. Xây d ng l p th c thi giao di n m t cách t ng minh............................................. 139 C. CÂU H I VÀ TR L I ........................................................................................ 141 D. CÂU H I VÀ BÀI T P T LÀM......................................................................... 142
Trang 5
Bài t p L p Trình H
ng
CH
i
ng C#
NG I: L P VÀ
IT
NG
M c tiêu: Sau khi tìm hi u xong ch ng này ng i h c có th n m sau: Khai báo l p Khai báo và s d ng các i t ng c a l p Con tr this Các thu c tính truy c p Hàm thi t l p Hàm thi t l p sao chép Hàm h y b S d ng các thành viên t nh N p ch ng ph ng th c óng gói d li u thông qua các thu c tính
c các n i dung
A. TÓM T T LÝ THUY T 1. Khai báo l p M t l p bao g m có các thu c tính và ph d ng t khóa Class v i c u trúc sau ây:
ng th c.
khai báo m t l p ta s
[thu c tính] Class
{ Khai báo các thu c tính c a l p Khai báo các ph
ng th c c a l p
} Các thu c tính truy c p g m có các t khóa sau ây (s trình bày chi ti t sau): Public, private, internal, Protected, internal Protected.
ph n
Trong C#, cho phép chúng ta khai báo các Class l ng nhau. Thông th ng khai báo l p l ng nhau khi ng d ng có quy mô l n. Class l ng cho phép s d ng trong n i b Class ch a nó khi nó có t m v c Public. C u trúc khai báo m t Class l ng nh sau: Class Class1 { // khai báo thu c tính // khai báo các ph ng th c Public Class Class2 { // khai báo các thành ph n d li u // khai báo các ph ng th c } } }
Trang 6
Bài t p L p Trình H 2. S d ng các
ng
it
i
ng C#
ng c a l p
s d ng l p ta ph i khai báo i t ng c a l p ó. Khi m t i t ng c a l p c t o ra thì nó có y các thu c tính, ph ng th c c a l p và s d ng thu c tính và ph ng th c c a l p. Các thành ph n c a m t l p ch c s d ng khi có th hi n c a l p, tr tr ng h p trong l p có m t hàm kh i d ng là static. khai báo m t i ng c a l p ta dùng t khóa new và khai báo nó theo c u trúc sau:
it
ng> = new ([các giá tr kh i t o n u có])
n m t ph
ng th c ta thông qua tên bi n
it
ng và toán t
ch m “.”
it
ng>.
ng th c> ([danh sách các
i s n u có])
i v i các l p l ng nhau, truy c p n nh ng thu c tính và ph ng th c c a Class l ng thì khi khai báo c n ch ra l p ch a ng nó. Mu n s d ng bi n c a l p ch a thì các bi n c a l p dùng ch a ph i khai báo là static và ph i khai báo i ng ch a nó. Ví d 1: B n ã khai báo m t l p diem v i y các thu c tính và các ph ng th c (gi s là có ph ng th c hien()), bây gi b n mu n t o m t i tu ng tên là A c a l p này và s d ng ph ng th c hi n m A thì ph i khai báo A la m t bi n i ng nh sau: diem A = new diem (); A.hien(); Ví d 2: nh ngh a l p pheptoan và trong l p này có ch a l p tinhhieu, mu n s d ng i t ng c a l p tinhhieu thì b t bu c b n ph i khai báo ch rõ l p ch a ây là l p pheptoan nh sau: pheptoan.tinhhieu con = new pheptoan.tinhhieu(); sau ó vi c truy xu t n các ph ng th c c a l p thì ti n hành bình th ng nh ng l p trong thì không s d ng c ph ng th c c a l p ch a nó và ch s d ng c thành ph n d li u t nh c a l p ch a mà thôi. 3. T khóa this T khóa this dùng tham chi u n chính b n thân c a i t ng ó. Con tr this là m t con tr n n m ngay bên trong c a m i m t ph ng th c c a l p và b n thân chúng có th tham chi u n các hàm và các bi n khác c a m t i t ng. Con tr this trong C# c ng t ng t nh this trong C++. Có ba cách
s d ng con tr this.
- S d ng This phân bi t rõ gi a các thành viên th hi n và các tham s c a ph ng th c khi ta s d ng bi n th hi n và tên c a tham s trong ph ng th c trùng nhau. Tuy nhiên n u mu n có c s rõ ràng, minh b ch thì có th dùng tên bi n thành viên và tên tham s là khác nhau t u. Ví d : Trong l p pheptoan có bi n thành viên là int y, int y và ph Public int tong(int x, int y) { Trang 7
ng th c
Bài t p L p Trình H
ng
i
ng C#
this.x=x; this.y=y; } Thì bi n x,y c tham chi u b ng t khóa this (this.x; this.y) là truy nh p n các tham s c a ph ng th c tong(), còn hai bi n x và y sau toán t gán l i là các bi n thành viên c a l p. - S d ng this trao khác. Khi ó m t i t
it ng
ng hiên hành nh là m t thông s cho m t hàm hành s ng nhiên s tr thành m t tham s c a ph ng th c.
Ví d : v i hai l p Class1 có ch a ph ng th c thietlapdoituong(), l p Class2 có ch a ph ng th c saochepdoituong() và mu n truy n tham s cho nó là i t ng c a l p Class1 thì s d ng con tr this nh sau: Public void saochepdoituong (Class1 a) { a.thietlapdoituong(this); } Trong ó a là m t i t ng c a l p Class1 mà ta mu n trao tham s u vào c a ph ng th c trong l p th hai. - S d ng this và các t p h p.
thao tác v i các indexer th
4. S d ng các t khóa m c
ng
i nó nh là m t
c s d ng trong b n dãy, indexer
truy c p
Thu c tính truy c p quy t nh kh n ng các ph ng th c c a l p bao g m vi c các ph ng th c c a l p khác có th nhìn th y và s d ng các bi n thành viên hay các ph ng th c bên trong l p ó. - Gi i h n truy c p các thu c tính : truy c p n m t thu c tính( Bi n thành viên) c a i t ng ta s d ng các t khóa sau: + Public : Không có gi i h n, có th truy xu t i n i trong n thân l p khai báo và bên ngoài hay trong n i b kh i assembly. + Private: riêng t ch có ph m vi ho t ng trong l p mà nó khai báo. Các ph ng th c bên ngoài l p không th truy xu t n nó. + Protected: Các thành viên trong l p c khai báo b ng Protected thì ch có các ph ng th c bên trong l p và các l p d n xu t t l p ó m i có th truy c p n nó. + Internal: Các ph ng th c, các bi n thành viên c khai báo b ng t khóa Internal có th c truy c p b i t t c nh ng ph ng th c c a b t c l p nào trong cùng m t kh i h p ng assembly v i l p ó. + Protected internal: Các bi n thành viên c khai báo b ng t khóa này trong m t l p A b t kì có th c truy xu t b i các ph ng th c thu c l p A và các ph ng th c c a l p d n xu t t l p A và b t c l p nào trong cùng m t kh i h p ng v i l p A. - Kh i h p ng Assembly c hi u là m t kh i chia x và dùng l i trong CLR. Kh i h p ng là t p h p các t p tin v t lý c l u tr trong m t th m c bao g m các t p tin tài nguyên. Các thu c tính truy c p c áp ng cho thu c tính, ph ng th c a l p và n thân l p. Khi nh ngh a thu c tính truy c p a l p là internal, Protected ch c nh ngh a trong l p l ng nhau mà thôi. Trang 8
Bài t p L p Trình H
ng
i
ng C#
5. B kh i d ng( constructor) M t i t ng c a l p khi c khai báo thì u c kh i t o các thành ph n cho nó vì trong b n thân c a l p có s n m t ph ng th c làm nhi m v kh i t o các giá tr m c nh c a các thành ph n d li u.Và bên trong c a thân hàm kh i t o này tr ng r ng. Các giá tr m c nh c a c a cá ki u d li u là: Ki u d li u Giá tr m c nh int, long, byte,… 0 bool false char ‘\0’ (null) enum 0 reference null N u mu n hàm thi t l p t o ra s kh i t o giá tr khác v i các giá tr m c nh thì ta ph i t nh ngh a. Tác d ng c a hàm thi t l p chính là vi c kh i t o các giá tr cho bi n i t ng. Constructor c khai báo nh m t ph có giá tr tr v theo c u trúc nh sau:
ng th c trùng tên v i tên l p và không
Class Classname { // constructor c a l p có tên là tenClass Classname ([các tham s n u có]) { //code of constructor } }
Trong m t l p có th có nhi u hàm thi t l p.Có hàm thi t l p không tham s , m t tham s hay nhi u tham s . Khi ó, vi c g i các hàm thi t l p này c n ph i có các tham s kèm theo sao cho phù h p v i t ng hàm ã khai báo. Khi b n g i m t hàm thi t l p thì trình biên d ch s t ng tìm ki m trong t ng s các hàm thi t l p c nh ngh a và tìm ra m t hàm thi t l p phù h p và t ng ng nh t th c thi. N u không tìm th y hàm nào phù h p thì s phát sinh ra l i. Ví d trong l p diem b n nh ngh a m t hàm thi t l p không tham s và m t hàm thi t l p hai tham s mà trong ch ng trình b n l i g i hàm thi t l p và truy n cho nó ch m t tham s thôi thì trình biên d ch s thông báo m t l i do không có m t hàm thi t l p nào thích h p c . 6. B sao chép(constructor) Gi s trong ch ng trình ã có m t i t ng v i các thành ph n d li u ã kh i t o, bây gi b n mong mu n t o ra m t i t ng gi ng h t i t ng c thì hãy ngh t i vi c s d ng constructor. Constructor c s d ng khi nào và nh m m c ích gì? B sao chép cs d ng v i hai m c ích là t o m t i t ng m i t m t i t ng ã có và c dùng nh m t ph ng th c v i m c ích sao chép n i dung c a m t i t ng ã có thay cho n i dung c c a nó.
Trang 9
Bài t p L p Trình H
ng
i
ng C#
V i t cách thi t l p, constructor có nhi m v nh m t hàm thi t l p sao chép nh trong C++. Trong ó quá trình t o i t ng constructor s thi hành hai ho t ng ó là vi c c p phát m t vùng nh cho i t ng m i và sau ó sao chép toàn b m t cách y h t các thành ph n d li u t m t i t ng mu n sao chép vào vùng nh v a cc p phát. Do ó chúng s gi ng nhau v m t hình th c và n t dung nh ng hai th hi n c a l p hoàn toàn khác nhau, s d ng c l p v i nhau. Trong C# không cung c p hàm thi t lâp sao chép nh trong C++ vì th n u mu n s d ng thì ph i t khai báo. M t hàm thi t l p sao chép có tên trùng v i tên c a l p và c khai báo theo c u trúc khai báo constructor nh sau: Public tenlop ( <doituong1>) { gt1 = doituong1.gt1; gt2 = doituong1.gt2; }
ó doituong1 là m t i t ng c a l p ã c khai báo; gt1,gt2 là các thành ph n d li u c a i t ng ã khai báo ó. Khi y, hai câu l nh gt1 = doituong1.gt1và gt2 = doituong1.gt2 chính là vi c sao chép toàn b d li u c a i ng tên là doituong1 và a vào vùng nh c a i t ng m i. Khác v i m c ích “thi t l p sao chép”, khi constructor c dùng v i m c ích nh m t ph ng th c sao chép giá tr c a m t i t ng này cho m t i t ng khác, khi ó thì trong quá trình thi hành ph ng th c ó s ch x y ra m t thao tác duy nh t là thao tác sao chép giá tr c a i t ng c sao chép thay cho d li u c c a i t ng mà thôi vì vùng nh c a i t ng b sao chép ã c c p phát t khi khai báo bi n i t ng ó. Vì ch n thu n là sao chép giá tr nên vi c nh ngh a constructor ki u này không nh t thi t ph i nh ngh a nó trùng tên v i l p mà ch c n nh ngh a nó nh m t ph ng th c thông th ng (ngh a là không nh t thi t ph i có giá tr tr v là i t ng nh v i m c ích s d ng trên). C u trúc khai báo
n gi n nh sau:
Public void saochep ( <doituong1>) { this.gt1 = doituong1.gt1; this.gt2 = doituong1.gt2; }
Vi c s d ng hai constructor này không gi ng nhau. N u b kh i d ng dùng v i m c ích thi t l p sao chép thì s d ng nó gi ng v i khai báo m t bi n i t ng có s d ng t khóa new: ví d nh diem a=new diem (b) t o ra m t bi n i t ng a m i t i t ng b ã có. Còn n u s d ng constructor v i m c ích sao chép thì ta thi hành nh m t ph ng th c c a i t ng ã khai báo và kh i t o tr c ó. Ch ng h n nh i m a(5,9) bây gi mu n t o thành ph n d li u c a a gi ng m b(-34,7) thì g i constructor nh sau: a.saochep(b) mà không có b t c t khóa new nào h t (saochep la tên c a constructor). Trang 10
Bài t p L p Trình H
ng
i
ng C#
7. Hàm h y b (destructor) Tác d ng c a hàm này l i ng c l i so v i constructor. Nó dùng gi i phóng vùng nh ã c p phát cho i t ng khi mà i tu ng không còn c tham chi u n. Hàm h y b là m t hàm không có giá tr tr v có tên trùng tên v i Class nh ng có thêm kí t “~” tr c. Mu n khai báo m t destructor chúng ta khai báo nó v i cú pháp nh sau: Public Classname {
Public Classname() { // code of constructor // các công vi c c n th c hi n } ~ Classname() { // code of descontructor // các công vi c c n th c hi n } }
Tuy nhiên, trong ngôn ng C# thì cú pháp khai báo trên là m t shortcut liên k t n m t ph ng th c k t thúc Finalize c k t v i l p c s , do v y khi vi t ~ Classname() { // Th c hi n m t s công vi c }
Và vi t : Class1.Finalize() { // Th c hi n m t s công vi c base.Finalize(); }
Thì hai cách vi t nh th này s c C# hi u là nh nhau. Trong C# có m t i t ng h tr cho công vi c d n rác m i khi i t ng không còn c tham chi u n là i t ng GC (garbage collector). i t ng này th c hi n công vi c r n rác qua 3 b c nh sau: Tìm ki m nh ng i t ng không còn c tham chi u n a C g ng các ho t ng gi i phóng i t ng không còn c tham chi u Thi hành ph ng th c finalize() h y i t ng Ngoài ra, trong c ch h y b c a C# còn có ph ng th c Dispose là m t ph ng th c i l p hoàn toàn so v i ph ng th c Finalize() c a i t ng GC. Ph ng th c Dispose là cho phép ch ng trình th c hi n các công vi c d n d p hay gi i phóng tài nguyên mong mu n mà không ph i ch cho n khi ph ng th c Finalize() c g i. Khi ó ta không c phép dùng ph ng th c Finalize() trong i Trang 11
Bài t p L p Trình H
ng
i
ng C#
ng mà thay vào ó ta s g i m t ph ng th c t nh c a l p GC (garbage collector) là GC.SuppressFinalize( this). Sau ó ph ng th c Finalize() s d ng g i ph ng th c Dispose() nh sau: Public void Dispose() { // Th c hi n công vi c d n d p // Yêu c u b thu d c GC trong th c hi n k t thúc GC.SuppressFinalize( this ); }
Public override void Finalize() { Dispose(); base.Finalize(); }
Câu l nh using: M c dù ph ng th c r n rác c r ng ph ng th c Dispose() s c nh c. Câu l nh using s mb th i gian s m nh t. S d ng using b ng mu n h y b : using (tên
it
a C# là t ng cung c p nh ng không th chác g i và vi c gi i phóng tài nguyên không th xác o r ng ph ng th c Dispose() s c g i trong ng cách g i câu l nh using và truy n vào tên i
ng c n h y b )
Khi trong l p không khai báo m t destructor nào thì trình biên d ch s g i ti n trình Garbage collector trong ngôn ng C# gi i phóng i t ng này trong b nh . Ph n l n trong ngôn ng C# thì có c ch t ng gom rác m i khi bi n ó không c tham chi u n nên chúng ta không c n quan tâm nhi u n nó nh trong C++. 8. S d ng các thành viên t nh static Thành viên t nh không th hi n gì cho l p v c thu c tính và ph nh là m t thành ph n c a l p.
ng th c mà nó
S d ng t khóa static khai báo m t thành viên t nh. Thành ph n t nh ch s d ng v i l p, ph ng th c, thu c tính, s ki n và constructor nh ng không th s d ng v i nh ng b n dãy, indexer, destructor hay ki u khác v i nh ng l p. S d ng ph
c c
ng th c t nh
M t ph ng th c static có ph m vi ho t ng gi ng nh m t ph c c mà không c n t o ra b t c m t th hi n nào c a l p c . Toàn c c ngh a là toàn c c trong l p. G i m t ph
ng th c toàn ây hi u theo
ng th c static:
V b n ch t thành ph n static là m t thành ph n c a l p không th hi n tr v vì v y không có m t tham chi u this. M t hàm static không th tr c ti p truy xu t n các thành viên không static mà ph i thông qua m t i t ng th hi n c a l p ó nh sau: Tenlop.tenhamtinh ([danh sach tham so neu co]: Ví d diem.hien() là l i g i
n ph
ng thúc t nh có tên là hien() c a l p diem Trang 12
Bài t p L p Trình H S d ng các ph
ng
i
ng th c kh i
ng C# o static
Trong khai báo m t static constructor không có t khóa truy c p. Ph ng th c t nh ch có th truy nh p n thành ph n d li u c ng có tính ch t t nh mà thôi. N u trong khai báo l p có m t hàm static constructor thì hàm này s c g i t c khi b t c m t th hi n nào c a l p c t o ra. Vi c s d ng hàm kh i t o static c n th theo dõi nó c nh trong C++ vì th th
c cân nh c k l ng vì chúng ta không ng gây ra nh ng h u qu khó l ng.
- Kh i t o private constructor: Vi c s d ng m t hàm kh i t o private trong l p s có tác d ng ng n ch n t o ra b t kì m t i t ng nào c a l p. Hàm kh i t o private này m c nhiên, không có tham s gì c và tr ng r ng. Khi ó trong l p s không có hàm kh i t o Public nên s không kh i t o c b t c m t thành viên th hi n nào. Ví d không mu n t o ra b t kì m t i t ng nào c a l p diem thì trong khi ngh a l p ta s nh ngh a thêm m t hàm kh i t o t m v c là private nh sau:
nh
Private diem () { // không làm gì c } S d ng các thu c tính t nh Trong C# không h có m t bi n nào có ph m vi ho t ng toàn c c nh trong m t s ngôn ng l p trình khác ( pascal, C, C++, Visual Basic …) vi c s d ng m t bi n v i m c ích “toàn c c” tr nên là m t u không th . Bi n toàn c c trong các ngôn ng khác c hi u là toàn c c trong ng d ng nh ng i v i C# thì toàn c c theo ngh a hi u c a nó là toàn c c trong m t l p và không có khái ni m toàn c c trong toàn b ch ng trình. N u ta khai báo m t bi n thành viên t nh c a l p thì bi n thành viên t nh này có t m v c ho t ng theo ý ngh a toàn c c ó. Các bi n thành viên t nh có ho t ng tích c c trong vai trò này. L p t nh: M t l p có th c xây d ng là m t l p t nh và ch ch a các thành ph n t nh mà thôi và nó không cho phép t o th hi n c a l p b ng vi c s d ng t khóa new. L p static th ng ct it ng trong Net.Framework khi ch ng trình ho c namespace ch a l p c t i lên.Vi c t o m t static Class gi ng v i vi c t o ra m t l p mà ch ch a m t private constructor. Nh v y là có th ki m tra ch c ch n và m b o nh ng thành viên c a l p này không th c t o ra. Khi nào thì s d ng các thu c tính t nh và khi nào thì s d ng ph
ng th c t nh
+ S d ng ph ng th c t nh khi mu n kh i t o m t giá tr nào ó ngay khi ch ng trình biên d ch mà không c n t o th hi n c a l p hay vi c t o m t thi t l p duy nh t mà m t s chu n b (initializer) không th th c hi n c và ch c n th c hi n m t l n mà thôi. Trong tr ng h p n u ta mu n l p mà sau khi ta nh ngh a không th tao ra m t th hi n nào c a nó thì ta s d ng ph ng th c kh i t o private (bên trong thân ph ng th c tr ng r ng).
Trang 13
Bài t p L p Trình H
ng
i
ng C#
+ S d ng bi n static khi b n mu n t o ra m t bi n có vai trò toàn c c trong l p theo dõi ho t ng c a nó. Ví d nh b n t o ra m t bi n static theo dõi xem th i i m hi n t i có bao nhiêu bi n i t ng c t o ra ch ng h n. Khi ó i cùng v i vi c t o i t ng b n hãy g i ph ng th c ch a thành ph n t nh này thì b n có th theo dõi nh dùng bi n toàn c c trong các ngôn ng l p trình khác. + S d ng l p t nh ch a các ph ng th c mà không liên quan t i m t i ng c bi t. Ch ng h n nh yêu c u t o t p h p ph ng th c không hành ng theo th hi n d li u và không liên quan n m t i t ng c bi t nào. M t static Class không cho phép th a k . 9. N p ch ng ph
ng th c
Ch ng ph ng th c la vi c t o ra nhi u ph ng th c trùng tên v i nhau nh ng nh n các tham s khác nhau hay tr v d li u khác nhau. Vi c phân bi t các hàm này d a vào d u n: + Khác nhau các tham s : khác nhau v s l ng tham s + Khác nhau v ki u d li u c a tham s , ki u d li u tr v c a ph
ng th c.
Khi n p ch ng m t ph ng th c ta ph i thay i kí hi u (d u n) c a ph ng th c, s tham s hay ki u d li u c a tham s ho c có th thay i c v giá tr c a các tham s . Khi ó thì th c ch t không ph i là n p ch ng ph ng th c mà ó là hai ph ng th c khác nhau có cùng tên nh ng khác nhau v ki u giá tr tr v . ó là m t i u c n chú ý khi n p ch ng ph ng th c. Khi g i m t ph ng th c có n p ch ng ph ng th c thì c n chú ý v s tham s , ki u d li u cho phù h p v i t ng ph ng th c n u không thì s phát sinh l i khi biên d ch ch ng trình. 10. óng gói d li u thông qua các thu c tính óng gói d li u v i thu c tính th c ch t là m t quá trình ta l y giá tr cho bi n thành viên và thi t l p giá tr ó cho bi n nó c truy c p thông qua ph ng th c a l p mà không qua i t ng. Trong C# cung c p kh n ng khai báo hàm chung g i là thu c tính cho hàm get và set Public string (tên thu c tính) {
get { // y giá tri thu c tính } set { //Tr v giá tr cùng ki u v i thu c tính ã khai báo} }
+ Ph ng th c get tr v m t i t ng d li u ki u thu c tính, ph ng th c này gi ng ph ng th c a i t ng. + Ph ng th c set: thi t l p giá tr c a thu c tính, có ki u tr v là void . Khi thi t l p m t ph ng th c set ph i dùng t khóa value t ng tr ng cho i c trao và c gi b i thu c tính. L i ích a vi c gói ghém d li u là che gi u thông tin m c dù ng i s d ng v n thao tác v i thu c tính. Vài i m c n chú ý khi nh ngh a m t thu c tính + Ta không khai báo t ng minh các tham s trong th t c set.. Trang 14
Bài t p L p Trình H
ng
i
ng C#
+ Có th ch xây d ng thu c tính ch c ho c ch viêt b ng cách i m t trong hai th t c trên. + N u ta mu n o m t thu c tính có Public c nh ng l i mu n h n ch Protected trong gán thì ph i t o thu c tính ch c Public sau ó t o m t hàm set() v i truy c p Protected bên ngoài thu c tính ó. + C# cho phép b n t o m t thu c tính virtual hay abstract ( xem thêm k th a và a hình) cú pháp nh sau: Public abstract string (tên thu c tính) {
get; set; }
B. BÀI T P M U 1. Xây d ng l p Ví d 1: Xây d ng l p diem v i các thu c tính tung , hoành c a m ó, ph ng th c i t a gi a d ng và âm, ph ng th c di chuy n theo m t giá tr nh p vào t bàn phím, ph ng th c hi n m lên màn hình. a, H
ng d n: + Các thu c tính g m có: int x ; // t a hoành int y ; // t a tung + Các ph ng th c c a l p: nh p thông tin it a ph ng th c move: di chuy n m ph ng th c hien: hi n thông tin lên màn hình b, Bài t p gi i m u: Class diem {
Public int x, y; { x = ox; y = oy; }
Public void nhap() { Console.WriteLine("Nhap toa do cua diem:"); x = int.Parse(Console.ReadLine()); y = int.Parse(Console.ReadLine()); }
Public void move(int dx, int dy) {
Trang 15
Bài t p L p Trình H
ng
i
ng C#
x += dx; y += dy; }
Public void chuyen() { x = -x; y = -y; }
Public void hien() { Console.Write("toa do :("); Console.Write("{0},{1}", x, y); Console.WriteLine(")"); } }
Trong ví d trên, chúng tôi ch ra cách khai báo m t l p thì c n ph i khai báo ng minh các thu c tính (thành ph n d li u), và c các ph ng th c (cái mà m t i ng c a l p có th thi hành). V i m t ph ng th c không có giá tr tr v thì khai báo có t khóa void còn n u có giá tr tr v thì ph i khai báo có giá tr tr v . Ví d 2 Xây d ng l p stack
mô ph ng m t stack bao g m
- Hàm kh i t o s ph n t t i a, - Ph ng th c isEmpty ki m tra xem stack có r ng không - Ph ng th c isFull ki m tra xem stack có y không - Ph ng th c push và pop thêm vào, l y ra m t ph n t a, H ng d n: Các thu c tính c a l p stack g m có: top: mô t ph n t u stack n: s ph n t t i a c a stack Các ph ng th c c a l p g m có: Public stack(): kh i t o giá tr c a stack v i s ph n t t i a Pubic bool empty(): tr v giá tr ki u úng sai khi stack r ng hay không Public bool full(): tr v ki u úng sai khi stack y hay không y Public void push (int x):thêm m t ph n t vào stack Public int pop(): L y ra m t ph n t t stack. ây là hàm vì nó có tr ra giá tr , giá tr chính là ph n t mà ta v a l y ra c t stack. b, Bài t p gi i m u: using System; namespace stack { Class Stack { private int top; private int []s; Public bool empty()
Trang 16
Bài t p L p Trình H
ng
i
ng C#
{
return (top == -1); }
Public bool full() {
return (top >= s.Length); }
Public Stack () { s = new int[20]; top=-1; }
Public void push(int x) { if(!full()) { top=top+1; s[top]=x; } else Console.Write("Stack tran"); }
Public int pop() { if (empty()) { Console.Write("Stack can"); return 0; } else return s[top--]; } }
2. S d ng l p Ví d 1: Xây d ng l p diem nh Bài t p 1 sau ó vi t ch ng trình nh p t a c a i m t bàn phím, di chuy n m t t a , l y t a i x ng, hi n t a c a m lên màn hình a, H ng d n: Thu c tính và ph ng th c c a l p diem gi ng h t Bài t p trên, khi ó mu n xây d ng ch ng trình ta ch vi c s d ng i t ng c a l p mà thôi. Mu n v y ph i khai báo i t ng ki u l p b ng s d mg t khóa new c p phát vùng nh . truy xu t n các ph ng th c c a l p thì ta truy xu t thông qua các i t ng c a l p diem Ch ng h n nh có i t ng c a l p la A mu n truy xu t t i ph thì ta truy nh p nh sau: A.nhap(); b, Gi i m u: Trang 17
ng th c nhap()
Bài t p L p Trình H
ng
i
ng C#
using System; using System.Collections.Generic; using System.Text; namespace vidu1 { Class diem { Public int x, y; Public void move(int dx, int dy) { x += dx; y += dy; } Public void hien() { Console.Write("toa do :("); Console.Write("{0},{1}", x, y); Console.WriteLine(")"); } Public void chuyen() { x = -x; y = -y; } Public void nhap() { Console.WriteLine("Nhap toa do cua diem:"); x = int.Parse(Console.ReadLine()); y = int.Parse(Console.ReadLine()); } } Class tester { static void Main(string[] args) { diem b = new diem(); // bien trong C# luon doc khoi gan gia tri truoc khi su dung b.nhap(); Console.Write("diem b "); b.hien(); Console.WriteLine("toa do doi xung la:"); b.chuyen(); b.hien(); b.move(2, 6); } } }
K t qu sau khi ch y ch
ng trình là
Nhap toa do cua diem: Trang 18
Bài t p L p Trình H
ng
i
ng C#
8 19 diem b toa do : (8,19) toa do doi xung la: toa do(-8,-19) diem b sau khi di chuyen la: toa do (-6,-13)
Ví d 2: Xây d ng ch ng trình nh p tam giác, tính chu vi, di n tích và in ra màn hình ó là lo i tam giác nào: cân, vuông, vuông cân, u hay th ng. a, H ng d n: Trong Bài t p này s nói s qua v m t s thu c tính truy c p c a m t s thành ph n trong l p (chi ti t v ph n này xin các b n tham kh o ph n sau mang tên là s d ng các t khóa ch m c truy c p) - Thu c tính c a l p là dài ba canh c a tam giác Các ph ng th c c a l p: - Ph ng th c nh p thông tin - Ph ng th c hi n thông tin - Ph ng th c ki m tra lo i tam giác - Ph ng th c tính chu vi tam giác - Ph ng th c tính diên tích tam giác ây, vì ph ng th c nh p thông tin và ph ng th c hi n thông tin chúng ta mong mu n s c s d ng trong b t kì hàm nào nên ta xây d ng có thu c tính Public, còn ph ng th c cho bi t lo i tam giác, tính di n tích tam giác và chu vi tam giác thì chúng ta mong mu n có tính ch t b o v và không cho các thành ph n bên ngoài tác ng vào nó thì s xây d ng có thu c tính truy xu t la private. Vì sao v y? Mu n xây d ng có thu c tính truy c p là Public có c không? Câu tr l i là có nh ng không có tính ch t che ch n d li u và m t thành ph n có th làm thay i n nó trong khi tiêu chí x p lo i tam giác, tính di n tích và chu vi tam giác thì i v i tam giác nào c ng gi ng nhau do ó ta xây d ng nó là private. b, Gi i m u: using System; namespace VD2 { Class tamgiac { private int a; private int b; private int c; private int i=0; Public void nhap() { Console.WriteLine("nhap thong so cho tam giac"); a=Convert.ToInt32(Console.ReadLine()); b=Convert.ToInt32(Console.ReadLine()); c=Convert.ToInt32(Console.ReadLine());
Trang 19
Bài t p L p Trình H
ng
i
ng C#
}
Public void hien() { Console.WriteLine("tam giac ma ban vua nhap la:"); Console.WriteLine("do dai ba canh:,{0},{1},{2}",a,b,c); Console.WriteLine("chu vi:{0}",chuvi()); Console.WriteLine("dien tich:{0}",dientich()); i = loaitg(); switch(i) { case 1: Console.WriteLine("la tam giac deu");break; case 2: Console.WriteLine("la tam giac vuong can");break; case 3: Console.WriteLine("la tam giac can");break; case 4: Console.WriteLine("la tam giac vuong");break; case 5: Console.WriteLine("la tam giac thuong");break; } }
private double dientich() {
return 0.25 * Math.Sqrt((a+b+c) * (a+b-c) * (a-b+c) * (b+c-a)); }
private double chuvi() {
return (a + b + c); }
private int loaitg() { if((a==b) || (b==c) || (a==c)) { if (a==b && b==c) return 1; else { if ((a*a==b*b+c*c) || (b*b==a*a+c*c) || (c*c==a*a+b*b)) return 2; else return 3; } } else { if (a*a==b*b+c*c ||b*b==a*a+c*c ||c*c==a*a+b*b) return 4; else return 5;
Trang 20
Bài t p L p Trình H
ng
i
ng C#
} } }
Class tester {
static void Main(string[] args) { tamgiac tg = new tamgiac(); tg.nhap(); tg.hien(); Console.ReadLine(); } } }
c, K t qu sau khi ch y ch
ng trình nh sau:
nhap thong so cho tam giac 3 4 5 tam giac ma ban vua nhap la: do dai ba canh: 3,4,5 chu vi: 12 dien tich:6 la tam giac vuong
Các b n chú ý vào ph n in nghiêng. ó là ph ng th c hien() c a l p nh ng chúng l i có th truy nh p n ph ng th c tính di n tích và ph ng th c hi n c a l p. Nh v y là trong cùng m t l p các ph ng th c cùng c p có th truy xu t l n nhau. Ví d 3: S d ng l p stack trên xây d ng m t ch ong trình chuy n t h 10 sang h 2, hê 8, h 16 b ng cách s d ng phép chia liên ti p. a, H ng d n:
ic s
m
Mu n i m t s t h 10 sang h 2, 8,16 thì ta l y s ó chia liên ti p cho h s mu n i. m i l n chia, c s d thì ta push nó vào stack. Th c hi n ti p cho n khi s d nh h n s chia thì d ng l i và pop l n l t các ph n t trong stack ra ta c k t qu . b, Bài t p gi i m u: using System; using System.Collections.Generic; using System.Text; namespace stack {
Trang 21
Bài t p L p Trình H
ng
i
ng C#
Class Stack {
private int top; private int[] s; Public bool empty() {
return (top == -1); }
Public bool full() {
return (top >= s.Length); }
Public Stack() { s = new int[20]; top = -1; }
Public void push(int x) { if (!full()) { top = top + 1; s[top] = x; } else Console.Write("Stack tran"); } }
Public int pop() { if (empty()) { Console.Write("Stack can"); return 0; } else return s[top--];
Trang 22
Bài t p L p Trình H
ng
i
ng C#
} }
Class tester {
static void Main() {
int n, a, k; Console.Write("Nhap vao so can doi:"); n = int.Parse(Console.ReadLine()); Console.Write("Nhap vao he so can chuyen:"); a = int.Parse(Console.ReadLine()); Stack T = new Stack(); if (a == 2) { while (n != 0) { T.push(n % 2); n = n / 2; } Console.Write("Ket qua chuyen sang he nhi phan:"); while (!T.empty()) { Console.Write("{0}", T.pop()); } } if (a == 8) { while (n != 0) { T.push(n % 8) ; n = n / 8; } Console.Write("Ket qua chuyen sang he bat phan:"); while (!T.empty()) { Console.Write("{0}", T.pop()); } } if (a == 16) { string st = "0123456789ABCDEF"; while (n != 0) { T.push((int)st[n % 16]); n = n / 16; } Console.Write("Ket qua chuyen sang he thap luc phan:"); while (!T.empty()) { Console.Write("{0}",(char)T.pop());
Trang 23
Bài t p L p Trình H
ng
i
ng C#
} } Console.ReadLine(); } } }
c, K t qu sau khi ch y ch
ng trình là:
Nhap vao so can doi: 8 Nhap vao he can doi: 2 Ket qua: 1000 c hai ví d trên có m t ph ng th c Public Stack () ây chính là m t ph ng th c thi t l p c a l p stack nh ng không có tham s . Chính ph ng th c này ã kh i t o cho chúng ta m t stack v i s ph n t t i a là n ( n=20). 3. L p l ng nhau và cách truy xu t Xây d ng m t l p n gi n có s d ng l p l ng nhau. Xây d ng l p tinhtong có ph ng th c nh p, tính t ng. Trong l p có ch a l p nh h n là l p tính hi u c a ba s trong ó m t s là thành ph n d li u c a l p ch a. a, H
ng d n:
Thành ph n d li u c a l p ch a (l p tinhtong) g m : Public int x; Public int y; static int c; khai báo là static l p trong sau này có th s d ng Ph ng th c nhap(), tinhtong() Thành ph n d li u c a l p trong (l p tinhieu) g m int a; int b; Ph ng th c g m nhap(), hieu() tính hi u trong ó có s d ng bi n c c a l S d ng l p tinhieu: Khai báo m t i t ng c a l p tinhhieu thì ph i ch ch a nó n a. Ví d khai báo m t i t ng con c a l p tinhhieu thì ph i tinhtong.tinhhieu con = new tinhtong.tinhhieu(); b, Bài gi i m u: using System; namespace loplongnhau { Class tinhtong // lop chua { Public int x; Public int y; static int c; Public void nhap() { Console.Write("x =");
Trang 24
c
p ch a. rõ c l p khai báo:
Bài t p L p Trình H
ng
i
ng C#
x = Convert.ToInt32(Console.ReadLine()); Console.Write("y ="); y = Convert.ToInt32(Console.ReadLine()); Console.Write("c ="); c = int.Parse(Console.ReadLine()); }
Public double tong() {
return (x + y); }
Public Class tinhhieu // lop long {
int a; int b; Public void nhap() { Console.WriteLine("nhap thong tin cho doi tuong lop ben trong:"); Console.Write("a ="); a = int.Parse(Console.ReadLine()); Console.Write("b ="); b = int.Parse(Console.ReadLine()); }
Public int hieu() {
return (a - b - c); } }
static void Main(string[] args) { Console.WriteLine("khai bao va su dung lop chua:"); tinhtong cha = new tinhtong(); cha.nhap(); // phuogn thuc nay cua lop cha Console.WriteLine("x+y={0}", cha.tong()); Console.WriteLine("khai bao va su dung lop ben trong:"); tinhtong.tinhhieu con = new tinhtong.tinhhieu(); con.nhap(); Console.Write("a-b-c={0}",con.hieu()); Console.ReadKey(); } } }
c, K t qu sau khi ch y ch
ng trình:
Khai bao va su dung lop chua: x =9 y =6 c =3 x+y=15 khai bao va su dung lop con: nhap thong tin cho doi tuong lop con: Trang 25
Bài t p L p Trình H
ng
i
ng C#
a=8 b=6 a - b - c = -1
4. Ch
ng trình khai báo nhi u l p
Xây d ng 2 l p: l p hocsinh bao g m h tên h c sinh, mã s h c sinh, n m sinh c a h c sinh và l p danhsach dùng ch a toàn b h c sinh ã nh p, s p x p th t l i theo n m sinh. a, H ng d n: Các thu c tính c a l p hocsinh: private string mshv; private string hoten; private int namsinh; Các ph ng th c: Ph ng th c nh p thông tin, Ph ng th c hi n thông tin Ph ng th c so sánh n m sinh c a sinh viên tr ra giá tr là 0; 1 hay -1 khi t ng ng v i k t qu b ng, l n h n, nh h n. Các thu c tính c a l p dachsach chính là m t m ng các h c sinh l p hocsinh Ph ng th c g m Nh p: thi hành ph ng th c nhap() cho t ng i t ng ki u hocsinh In danh sách: thi hành ph ng th c hien() cho t ng i t ng ki u hocsinh S p x p danh sách theo th t n m sinh gi m d n b, Bài t p gi i m u: namespace vidu6 { Class Program { Class Hocsinh { private string ms; private string hoten; private int namsinh; Public Hocsinh() { } Public void nhap() { Console.Write("ma so:"); ms = Console.ReadLine(); Console.Write("ho ten:"); hoten = Console.ReadLine(); Console.Write("nam sinh:"); namsinh = int.Parse(Console.ReadLine()); } Public void nhap() { Console.Write("ma so:"); ms = Console.ReadLine(); Console.Write("ho ten:"); hoten = Console.ReadLine();
Trang 26
Bài t p L p Trình H
ng
i
ng C#
Console.Write("nam sinh:"); namsinh = int.Parse(Console.ReadLine()); } {
Public int ssnamsinh(Hocsinh a,Hocsinh b) int k; if (a.namsinh > b.namsinh) k =1; else { if (a.namsinh == b.namsinh) k= 0; else k = -1; } return k;
}
Public void print() { Console.WriteLine("\t{0}\t{1}\t{2}", ms, hoten, namsinh); } }
Class Danhsach {
int n, i; private Hocsinh[] ds; Public Danhsach(int n) { ds = new Hocsinh[n]; }
Public void nhapds() { Console.Write("so hoc sinh = "); n = Convert.ToInt32(Console.ReadLine()); ds = new Hocsinh[n]; for (i = 0; i < ds.Length; i++) ds[i] = new Hocsinh(); for (i = 0; i < n; i++) { Console.WriteLine("hoc sinh thu {0}:", i + 1); ds[i].nhap(); } }
Public void printds() { Console.WriteLine("danh sach hoc sinh ban dau:"); for (i = 0; i < ds.Length; i++) { Console.WriteLine("\t \ t \t "); Console.Write("\t{0}", i + 1); ds[i].print(); } }
Public void sapxep() {
Trang 27
Bài t p L p Trình H
ng
i
ng C#
for (i = 0; i < n; i++) { Hocsinh max = ds[i]; for (i = 0; i < n; i++) { if (max.ssnamsinh(ds[i], ds[i + 1]) == 1) { max= ds[i + 1]; ds[i + 1] = ds[i]; ds[i] = max; } for (i = 0; i < n; i++) ds[i].print(); } } } }
static void Main(string[] args) { Danhsach d = new Danhsach(3); d.nhapds(); d.printds(); Console.WriteLine("danh sach sap sep theo nam sinh:"); d.sapxep(); Console.ReadLine(); } } }
c, K t qu sau khi ch y ch
ng trình:
So hoc sinh = 3 Hoc sinh thu 1: Ma so: hs1 Ho ten: nguyen thi mai huong Nam sinh 1987 Hoc sinh thu 2: Ma so: hs2 Ho ten: nguyen van hai Nam sinh 1986 Hoc sinh thu 3: Ma so: hs3 Ho ten: ta van ngoc Nam sinh 1989 Danh sach hoc sinh ban dau: Mhs ho ten nam sinh hs1 nguyen thi mai huong 1987 hs2 nguyen van hai 1986 hs3 ta van ngoc 1989 Trang 28
Bài t p L p Trình H
ng
i
ng C#
Danh sach sap xep theo nam sinh: hs2 nguyen van hai 1986 hs1 nguyen thi mai huong 1987 hs3 ta van ngoc 1989
5. Con tr this 1. S d ng this
phân bi t tham s ph
ng th c và bi n thành viên c a l p.
Xây d ng l p phu ng trình b c hai n gi n và th c hi n tính nghi m cho ph ng trình ó. Trong ch ng trình có xây d ng hàm thi t l p không tham s và có tham s . S d ng con tr this trong Bài t p phân bi t rõ bi n thành viên c a l p và tham s c a ph ng th c. a, H ng d n: Vì trong Bài t p ch yêu c u xây d ng m t l p n gi n nên thành ph n thu c tính và ph ng th c g m có: Thu c tính: Các h s c a ph ng trình b c hai; - Public double a, b, c; Ph ng th c : - Ph ng th c kh i t o không tham s : Public ptbachai() - Ph ng th c kh i t o ba tham s :Public ptbachai(int a, int b, int c) Vì trong ph ng th c này ta s d ng tham s c a ph ng th c trùng v i bi n thành viên c a l p nên ta ph i s d ng con tr this phân bi t gi a chúng. - Ph ng th c nh p - Ph ng th c hi n ph ng trình - Ph ng th c tính nghi m b, Bài t p gi i m u: using System; namespace vidu4 { Class ptbachai { Public double a, b, c; Public ptbachai() { a = 5; b = 3; c = 8; } Public ptbachai(int a, int b, int c) { this.a = a; this.b = b; this.c = c; } Public void nhap() {
Trang 29
Bài t p L p Trình H
ng
i
ng C#
Console.WriteLine("nhap he so cho PTB2:"); a = Convert.ToInt32(Console.ReadLine()); b = Convert.ToInt32(Console.ReadLine()); c = Convert.ToInt32(Console.ReadLine()); }
private void tinhnghiem() { double x, y; double delta; delta=this.b*this.b-4*this.a*this.c; if (delta < 0) { Console.WriteLine("khong co nghiem"); } else { if (delta == 0) { x = -this.b / 2 *this. a; Console.WriteLine("nghiem kep x = y ={0}",x); } else { x = (-this.b - Math.Sqrt(delta)) / 2 *this.a; y = (-this.b + Math.Sqrt(delta)) / 2 *this.a; Console.WriteLine("PT co hai nghiem phan biet:"); Console.WriteLine("x = {0}; y = {1}", x, y); } } }
Public void hien() { Console.WriteLine("phuong trinh bac hai:"); Console.WriteLine("{0}*x2 + {1}*x + {2}", this.a, this.b, this.c); }
Class tester {
static void Main(string[] args) { ptbachai x = new ptbachai(); x.hien(); x.tinhnghiem(); ptbachai y = new ptbachai(); y.nhap(); y.hien(); y.tinhnghiem(); Console.ReadKey(); } } } }
Trang 30
Bài t p L p Trình H
ng
i
ng C#
Trong ph ng th c kh i t o ba tham s có câu l nh this.a=a thì this.a chính là bi n thành viên c a l p còn a ây l i là tham s c a ph ng th c mà b n nh p vào khi ch y ch ng trình và nó c truy n vào b ng câu l nh gán. Các bi n Public c truy xu t t i m i n i trong ch ng trình. Bi n khai báo b ng t khóa này c hi u nh là bi n công c ng c a l p và có th truy xu t b t kì n u mu n. K t qu sau khi ch y ch ng trình: phuong trinh bac hai: 5*x2 + 3*x + 8 khong co nghiem nhap he so cho PTB2 5 8
6. S d ng con tr this trao d ng bi n khai báo private
it
ng hi n hành nh m t tham s , minh h c s
Xây d ng m t l p nhanvien nh p h tên, ch c v nhân viên, ti n l ng nhân viên, hi n thông tin có liên quan. Xây d ng m t l p dùng tính thu mà nhân viên ph i n p cho nhà n c t ti n l ng ó. (S ti n này hi n th cùng các thông tin liên quan n nhân viên trong ph ng th c hi n th c a l p nhanvien). a, H
ng d n:
Các thành ph n c a l p nhanvien chúng ta v n xây d ng bình th ng nh các ví d t c. Ch khác ch trong ph ng th c hi n có tham chi u t i i t ng c a l p Thue dùng tính thu ph i n p nh sau: Thue.Thuephainop(this) trong ó Thuephainop là ph ng th c tính thu c a Class Thue có i s là i t ng l p nhanvien. b, Bài t p gi i m u: using System; Class Nhanvien { private string hoten; private string chucvu; private decimal tienluong; Public Nhanvien() { } Public Nhanvien(string hoten, string chucvu, decimal tienluong) { Console.WriteLine("Su dung PTTL 3 tham so:"); this.hoten = hoten; this.chucvu = chucvu; this.tienluong = tienluong; }
Trang 31
Bài t p L p Trình H
ng
i
ng C#
Public void nhap() { Console.Write("Ho ten:"); hoten = Console.ReadLine(); Console.Write("Chuc vu:"); chucvu = Console.ReadLine(); Console.Write("Tien luong:"); tienluong = decimal.Parse(Console.ReadLine()); }
Public void dipslayNV() { Console.WriteLine("Ho ten:\t{0}", hoten); Console.WriteLine("Ma chuc vu:\t{0}", chucvu); Console.WriteLine("Tien luong la:\t{0:C}", tienluong); // Trao doi tuong cua lop Thue nhu mot doi so Console.WriteLine("Thue phai nop:\t{0:C} ", Thue.Thuephainop(this)); } // xay dung phuong thuc chi doc gia tri cua doi tuong Public decimal luong { get { return tienluong; } } }
Class Thue {
Public static decimal Thuephainop(Nhanvien E) {
return 0.03m * E.luong; // E.luong: doc gia tri cua truong luong } }
Class MainClass {
static void Main() { Nhanvien E1 = new Nhanvien("Nguyen Tien Quynh Anh","thu ki", 2200000); E1.dipslayNV(); Nhanvien E2 = new Nhanvien(); E2.nhap(); E2.dipslayNV(); Console.ReadKey(); } }
K t qu khi ch y ch
ng trình:
Su dung PTTL 3 tham so: Hien thi thong tin: Trang 32
Bài t p L p Trình H
ng
i
ng C#
Ho ten: Nguyen Tien Quynh Anh Chuc vu: thu ki Tien luong: $2,200,000.00 Thue phai nop: $ 66,000.00 Nhap thong tin: Ho ten: Chu Thi Minh Ha Chuc vu: ke toan Tien luong: 2546000 Hien thi thong tin: Ho ten: Chu Thi Minh Ha Chuc vu: ke toan Tien luong la: $2546000 Thue phai nop: $76,380.00
7. Hàm thi t l p và hàm thi t l p sao chép, hàm sao chép cho l p vector Xây d ng m t l p vector n gi n có s d ng các hàm thi t l p không tham s , m t tham s và hai tham s .Trong l p có s d ng hàm thi t l p sao chép, hàm sao chép cho i t ng c a l p (phân bi t hai cách dùng c a constructor) a, H
ng d n:
Vì vecto là m t i t ng mà các thành ph n d li u không t nh nên ph i khai báo vùng nh dùng ch a các t a là m t m ng m t chi u: float[] v i v i các hàm thi t l p không tham s và m t tham s thì không có gì áng ng i c . Ch có hàm thi t l p hai tham s thì c n chú ý m t chút: Trong hàm thi t l p hai tham s thì m t tham s là s chi u c a vecto còn tham s còn l i là m t m ng m t chi u mà ta s c các ph n t c a m ng vào cho vecto nên ph ng th c này c khai báo nh sau:Public vecto(int size, float[] u) trong ó float [] u chính là m ng có ch a s n các ph n t . V i hàm thi t l p sao chép thì chính là vi c sao chép l i giá tr c a các thành ph n d li u ã có trong m t i t ng cùng l p vecto và a vào vùng nh c a vecto ã c c p phát b nh . Public vecto(int size, float[] u) {
int i; n = size; v = new float[n]; for (i = 0; i < n; i++) { v[i] = u[i]; } }
b, Ch
ng trình m u:
using System; namespace vidu7
Trang 33
Bài t p L p Trình H
ng
i
ng C#
{
Class vecto {
int n = 20; float[] v; Public vecto() {
int i; Console.WriteLine("\t Su dung ham thiet lap khong tham so:"); Console.Write("\t So chieu cua vecto la:"); i = Convert.ToInt32(Console.ReadLine()); n = i; v = new float[n]; Console.WriteLine("\t nhap thong so cho vecto:"); for (i = 0; i < n; i++) { Console.Write("\t toa do thu {0}:", i); Console.Write("\t v[{0}]=", i + 1); v[i] = int.Parse(Console.ReadLine()); } }
Public vecto(int size) {
int i; Console.WriteLine("\t Su dung ham thiet lap mot tham so:"); n = size; v = new float[n]; Console.WriteLine("\t nhap thong so cho vecto:"); for (i = 0; i < n; i++) { Console.Write("\t toa do thu {0}:", i); Console.Write("\t v[{0}]=", i + 1); v[i] = int.Parse(Console.ReadLine()); } } }
Public vecto(int size, float[] u) {
int i; Console.WriteLine("\t Su dung ham thiet lap hai tham so:"); n = size; v = new float[n]; Console.WriteLine("\t tao mot vecto tu mot mang mot chieu:"); for (i = 0; i < n; i++) { v[i] = u[i]; } }
Public vecto(vecto u) {
Trang 34
Bài t p L p Trình H
ng
i
ng C#
int i; Console.WriteLine("\t su dung ham thiet lap sao chep:"); // xin cap phat vung nho co kich thuoc bang voi doi tuong cu v = new float[n = u.n]; // thuc hien gan cac vung nho dong cua doi tuong cu sang doi tuong moi for (i = 0; i < n; i++) { v[i] = u.v[i]; } }
Public void saochep(vecto b) { n = b.n; Console.WriteLine("\t Su dung ham sao chep"); for (int i = 0; i < n; i++) { this.v[i] = b.v[i]; } }
Public void hien() { Console.Write(\t "("); for (int i = 0; i < v.Length; i++) if (i == v.Length - 1) Console.Write("{0}", v[i]); else Console.Write("{0},", v[i]); Console.WriteLine(")"); } Class tester { static void Main(string[] args) { vecto v1 = new vecto(); Console.Write("\t v1:");v1.hien(); vecto v2 = new vecto(4); Console.Write("\t v2:");v2.hien(); float[] a ={ 12, 8, 11, 3, 20 , 85 }; vecto v3 = new vecto(4, a); Console.Write("\t v3:"); v3.hien(); vecto v4 = new vecto(v3); Console.Write("\t v4:"); v4.hien(); if (v3.n==v2.n) v3.saochep(v2); else { Console.WriteLine("\t khong tien hanh sao chep. Gia tri vecto van la:"); } Console.Write("\t v3:"); v3.hien(); Console.ReadLine(); } }
Trang 35
Bài t p L p Trình H
ng
i
ng C#
} }
K t qu sau khi ch y ch
ng trình:
Su dung ham thiet lap khong tham so: So chieu cua vecto la: 2 Nhap thong so cho vecto: v[1]=10 v[1]=89 v1: (10,89) Su dung ham thiet lap m t tham so: Nhap thong so cho vecto: v[1]=4 v[1]=5 v[1]=1 v[1]=23 v2: (4,5,1,23) Su dung ham thiet lap hai tham so: tao mot vecto tu mot mang mot chieu: v3: (12,8,11,3) su dung ham thiet lap sao chep: v4: (12,8,11,3) su dung ham sao chep: v3: (4,5,11,23)
8. S d ng hàm thi t l p sao chép và hàm h y b Xây d ng l p thoigian l y v th i gian hi n hành. Có s d ng ph t o, ph ng th c sao chép và ph ng th c h y b .
ng th c kh i
a, H ng d n: l y c th i gian hi n hành thì ta s d ng hàm now. Các thu c tính c a l p g m ngày, tháng, n m, gi , phút, giây c l y theo th i gian h th ng thông qua hàm System.DateTime.Now Các ph ng th c c a l p g m: - Public dipslay() dùng hi n th thông tin - Public ThoiGian (System.DateTime tg): thi t l p sao chép th i gian t m t i ng ã có - Public ThoiGian( int Date,int Month,int Year,int Hour, int Minute,int Second): PT thi t l p 6 tham s kh i t o giá tr cho bi n i t ng. - Public ThoiGian(int Date,int Year,int Hour,int Second): PT thi t l p 4 tham s kh i t o giá tr cho bi n i t ng. - Public void saochep(ThoiGian TG) dùng sao chép i t ng. - ~ ThoiGian(): là ph ng th c h y b i t ng c a l p.Ph ng th c này s cg it ng b i trình thu gom rác c a C# b, Bài t p gi i m u Trang 36
Bài t p L p Trình H
ng
i
ng C#
namespace saochep { Public Class ThoiGian { private int Nam ; private int Thang = 7; private int Ngay = 30; private int Gio = 5; private int Phut = 19; private int Giay = 23; System.DateTime now = System.DateTime.Now; Public void dipslay() { System.Console.WriteLine("\t Ngay:{0}/{1}/{2}", Ngay, Thang, Nam); System.Console.WriteLine("\t Gio:{0}:{1}:{2}", Gio, Phut, Giay); } Public ThoiGian( System.DateTime tg) // hàm thi t l p sao chép { Nam = tg.Year; Thang = tg.Month; Ngay = tg.Day; Gio = tg.Hour; Phut = tg.Minute; Giay = tg.Second; } Public void saochep(ThoiGian TG) { this.Gio=TG.Gio; this.Phut=TG.Phut; this.Giay=TG.Giay; this.Ngay = TG.Ngay; this.Thang = TG.Thang; this.Nam = TG.Nam; } Public ThoiGian( int Date,int Month,int Year,int Hour, int Minute,int Second) // ham thiet lap 6 tham so { Nam = Year; Thang = Month; Ngay = Date; Gio = Hour; Phut = Minute; Giay = Second; } Public ThoiGian(int Date, int Year, int Hour, int Second) { Nam = Year; Ngay = Date; Gio = Hour;
Trang 37
Bài t p L p Trình H
ng
i
ng C#
Giay = Second; } ~ThoiGian() { Console.WriteLine("\t\t doi tuong da duoc huy"); GC.SuppressFinalize(this); Console.ReadKey(); } }
Public Class Tester {
static void Main() { System.DateTime currentTime = System.DateTime.Now; Console.WriteLine("\t Thoi gian hien hanh la:\t\t"); ThoiGian tghh = new ThoiGian( currentTime ); tghh.dipslay(); Console.WriteLine("\t t1 khoi tao tu ham thiet lap sao chep:\t"); ThoiGian t1 =tghh; t1.dipslay(); Console.WriteLine("\t t2 goi ham thiet lap 6 tham so:\t"); ThoiGian t2 = new ThoiGian(12,12,2007,4,56,39); t2.dipslay(); Console.WriteLine("\t t1 sao chep tu doi tuong t2:\t\t"); t1.saochep(t2); t1.dipslay(); Console.WriteLine("\t t3 goi tu ham thiet lap 4 tham so:\t"); ThoiGian t3 = new ThoiGian(15, 2008, 12, 40); t3.dipslay(); Console.ReadKey(); } } }
K t qu sau khi ch y ch
ng trình:
Thoi gian hien hanh la: Ngay: 8/6/2007 Gio: 2:29:26 T1 khoi tao tu ham thiet lap sao chep: Ngay: 8/6/2007 Gio: 2:29:26 T2 goi tu ham thiet lap 6 tham so: Ngay: 12/12/2007 Gio: 4:56:39 T1 sao chep tu doi tuong t2: Ngay: 12/12/2007 Gio: 4:56:39 T3 goi tu ham thiet lap 4 tham so: Trang 38
Bài t p L p Trình H
ng
i
ng C#
Ngay:15/7/2008 Gio: 12:0:40 doi tuong da duoc huy
Trong ví d trên, hàm h y b i t ng b ng ph ng th c SuppressFinalize c a i t ng GC (Garbage Collector). . Dòng thông báo “doi tuong da duoc huy” xu t hi n ngay sau khi ta gõ m t phím b t kì cho th y ph ng th c h y b ã c goi t ông tr c khi k t thúc ch ng trình và gi i phóng vùng nh cho các i t ng. Trong ph ng th c thi t l p 4 tham s , các tham s không c kh i t o s l y giá tr m c nh c a bi n hay giá tr kh i gán ban u nên có k t qu nh trên. 9. Ki u d li u m ng, các ph
ng th c có giá tr tr v , constructor sao chép
Xây d ng l p Matrix cho các ma tr n các ph ng th c nh p ma tr n t bàn phím, hi n ma tr n ra màn hình, c ng hai ma tr n, tr hai ma tr n, nhân hai ma tr n. a, H
ng d n:
Ma tr n c l u tr các ph n t trong m ng hai chi u nên ph i khai báo m t m ng int[,] l u tr các thành ph n ó. Các ph ng th c thao tác v i ma tr n: - Ph ng th c nh p: s ti n hành nh p các ph n t c a ma tr n theo t ng hàng - Ph ng th c hi n ma tr n lên màn hình - Ph ng th c chuy n v hai ma tr n có giá tr tr v là m t ma tr n. ây ch là vi c i v trí: cv.m[i,j]=this.m[j,i] - Ph ng th c tong(matran b) làm công vi c c ng hai ma tr n: tmp.m[i, j] = this.m[i, j] + b.m[i, j] - Ph ng th c tich(int k:): tính tích c a ma tr n v i m t s - Ph ng th c tich(matran b): tính tích c a hai ma tr n ( ây là ph ng th c ch ng v i ph ng th c tich c a ma tr n v i m t s ) - P ng th c hieu(matran b): tính hi u c a hai ma tr n tính c t ng, hi u, tích c a hai ma tr n thì chúng ph i t ng thích nhau v u ki n c th hai ma tr n cùng có s hàng và s c t thì m i c ng, tr c, ma tr n này ph i có s c t b ng s hàng c a ma tr n kia thi m i th c hi n c phép nhân hai ma tr n. Trong nh ng tr ng h p khác thì sinh l i. Vì v y c n có công vi c ki m tra u ki n t ng thích. Và các ph ng th c này u tr ra giá tr là m t i t ng l p ma tr n b, Bài t p gi i m u: using System; namespace matran { Class Matrix { int i, j; int[,] m;// m mg l u tr ph n t c a ma tr n Public Matrix() { m = new int[10, 20]; }
Trang 39
Bài t p L p Trình H
ng
i
ng C#
Public Matrix(int h, int c) { m = new int[h, c]; }
Public void nhap() {
int i, j; for (i = 0; i < m.GetLength(0); i++) { Console.WriteLine("Nhap cac phan tu cho hang thu {0} :", i + 1); for (j = 0; j < m.GetLength(1); j++) { Console.Write("m[{0},{1}]= ", i, j); m[i, j] = Convert.ToInt32(Console.ReadLine()); } } }
Public void hien() { for (i = 0; i < m.GetLength(0); i++) { for (j = 0; j < m.GetLength(1); j++) Console.Write("\t {0}", m[i, j]); Console.WriteLine(); } }
Public Matrix chuyenvi() { Matrix cv = new Matrix(this.m.GetLength(0), this.m.GetLength(1)); for (i=0;i< this.m.GetLength(0);i++) { for (j=0;j
Public Matrix tong(Matrix b) { Matrix tmp = new Matrix(this.m.GetLength(0), this.m.GetLength(1)); for (i = 0; i < this.m.GetLength(0); i++) { for (j = 0; j < this.m.GetLength(1); j++) tmp.m[i, j] = this.m[i, j] + b.m[i, j]; } return tmp; }
Public Matrix hieu(Matrix b) { Matrix tmp = new Matrix(this.m.GetLength(0), this.m.GetLength(1));
Trang 40
Bài t p L p Trình H
ng
i
ng C#
for (i = 0; i < this.m.GetLength(0); i++) { for (j = 0; j < this.m.GetLength(1); j++) tmp.m[i, j] = this.m[i, j] - b.m[i, j]; } return tmp; }
Public Matrix chuyenvi( Matrix b) { Matrix tmp = new Matrix(this.m.GetLength(1), this.m.GetLength(0)); for (i=0;i
Trang 41
Bài t p L p Trình H
ng
i
ng C#
b.hien(); Console.WriteLine("tich ma tran chuyen vi cua a voi b la:"); { if (a.tuongthichnhan(b) == true) { a=a.tich(b); a.hien(); } else Console.WriteLine("hai ma tran khong tuong thich hang va cot"); } Console.ReadKey(); } } } }
K t qu sau khi ch y ch
ng trình:
nhap ma tran a: m[0,0]=1 m[0,1]=2 m[1,0]=3 m[1,1]=1 ma tran a: 1 2 2 1 nhap ma tran b: m[0,0]=0 m[0,1]=1 m[0,2]=3 m[1,0]=5 m[1,1]=2 m[1,2]=3 ma tran b la: 0 1 3 5 2 3 tich cua ma tran a va b la: 10 5 9 5 5 12 ma tran chuyen vi cua a la; 10 5 5 5 9
12
10. S d ng các thành ph n t nh Xây d ng l p nhanvien qu n lý nhân viên bao g m mã nhân viên, ch c v c a nhân viên và h tên nhân viên. Trong l p s d ng thành ph n t nh nh bi n toàn c c trong ph m vi l p theo dõi khi m t i t ng c t o ra (b ng cách cho bi t s th t c a nhân viên m i ó). Trang 42
Bài t p L p Trình H a, H
ng
i
ng C#
ng d n:
Thành ph n d li u c a l p g m có: Mã nhân viên, ch c v và h tên c a nhân viên là d li u ki u string.
u
theo dõi i ng m i khi m t nhân viên c t o ra thì dùng m t bi n static int demnhanvien có m c truy c p là Public có th truy c p b t c khi nào. Ph
ng th c c a l p bao g m:
Các ph ng th c nh p, hi n, thi t l p thông th ng. Ngoài ra còn có ph ng th c Public static int sttnhanvien() { return ++demnhanvien; } t ng s l ng nhân viên hi n th i. S th t c a nhân viên m c nh chính b ng s ng nhân viên hi n th i. b, Bài t p gi i m u: using System;
Public Class nhanvien {
Public string manv; Public string hoten; Public string chucvu; Public static int demnhanvien; Public nhanvien() // pt thiet lap { }
Public nhanvien(string manv, string chucvu, string hoten) {// ph ng th c thi t l p this.manv= manv; this.chucvu = chucvu; this.hoten = hoten; } Public void nhap() { Console.Write("\t Nhap vao ma cua nhan vien: "); string nvid = Console.ReadLine(); Console.Write("\t Nhap vao chu vu cua nhan vien:"); string cv=Console.ReadLine(); Console.Write("\t Nhap vao ho ten cua nhan vien: "); string name = Console.ReadLine(); hoten = name; manv = nvid; chucvu = cv; } Public void hienthi() { Console.WriteLine("\t Ma nhan vien \t: {0}", this.manv); Console.WriteLine("\t Chuc vu \t: {0}", this.chucvu); Console.WriteLine("\t Ho ten cua nhan vien \t: {0}", this.hoten); Trang 43
Bài t p L p Trình H
ng
i
ng C#
// truy nh p n thành ph n d li u t nh thông qua tên l p Console.WriteLine("\t So thu tu \t: {0}", nhanvien.demnhanvien); }
Public static int sttnhanvien() {
return ++demnhanvien; } }
Class tester {
static void Main() { Console.Write("\t So luong nhan vien hien thoi \t:"); string n = Console.ReadLine(); nhanvien.demnhanvien = Int32.Parse(n); Console.WriteLine("\t tao mot doi tuong:"); nhanvien nv1 = new nhanvien(); nv1.nhap(); // g i ph ng th c t nh thông qua tên l p nhanvien.sttnhanvien(); nv1.hienthi(); Console.WriteLine("\t them mot doi tuong:"); nhanvien nv2 = new nhanvien("gd","giam doc","Nguyen Ngoc Minh"); nhanvien.sttnhanvien(); nv2.hienthi(); Console.ReadKey(); } }
K t qu khi ch y ch
ng trình:
So luong nhan vien hien thoi :445 Tao mot doi tuong: Nhap vao ma cua nhan vien: nvkh Nhap vao chuc vu cua nhan vien: Nhan vien ke hoach Nhap vao ho ten cua nhan vien: Nguyen Van Hai Lam Thong tin ve nhan vien: Ma nhan vien:nvkh Chuc vu :Nhan vien ke hoach Ho ten :Nguyen Van Hai Lam So thu tu :446 Them mot doi tuong: Thong tin ve nhan vien: Ma nhan vien:gd Chuc vu :giam doc Ho ten :Nguyen Ngoc Minh So thu tu
:447
11. Hàm kh i t o private
c m t o th hi n c a Trang 44
it
ng
Bài t p L p Trình H Ch
ng
ng trìnhm u m t ví d
i
ng C# n gi n nh sau:
namespace Static_Class { Public Class vatnuoi { static vatnuoi() { Console.WriteLine("Loi goi nay duoc goi dau tien tu PT khoi tao static"); } private vatnuoi() { } Public static int dem; Public static int Soluong() { return ++dem; } } Class Tesster { static void Main() { // n u c tình khai báo m t i t ng meo // b ng câu l nh này tì có l i khi biên d ch // vì trong l p không có hàm kh i t o Public //vatnuoi cho = new vatnuoi(); // loi vatnuoi.dem = 15; Console.WriteLine("So luong vat nuoi luc dau la:{0}",vatnuoi.dem); Console.WriteLine("Them moi mot con vat nuoi: meo tam the"); Console.WriteLine("So luong vat nuoi hien thoi la:{0}", vatnuoi.Soluong()); Console.ReadLine(); } } }
Trong ch ng trình n u b n c tình khai báo:vatnuoi cho = new vatnuoi(); thì s phát sinh l i nh sau trong quá trình ch y:“Static_Class.vatnuoi.vatnuoi()' is inaccessible due to its protection level”: không t o ra c i t ng l p vatnuoi b i nó có m c b o v . i u này ch ng t r ng chính ph ng th c kh i t o t nh ã ng n c m t o i t ng th hi n c a l p. Do v y ta ch có th truy c p t i các ph ng th c t nh c a l p mà thôi. K t qu khi ch y ch
ng trình:
Loi goi nay duoc goi dau tien tu phuong thuc khoi tao static So luong vat nuoi luc dau la: 15 Them mot con vat nuoi: meo tam the So luong vat nuoi hien thoi la: 16
ch
T k t qu trên cho th y M t ph ng trình biên d ch mà không c n t o
ng th c kh i t o t nh s c g i ngay khi i t ng th hi n nào c a l p.
Trang 45
Bài t p L p Trình H 12. N p ch ng ph
ng
i
ng C#
ng th c
1. Xây d ng l p phanso và thao tác v i l p v i các ph ng th c bao g m: - Ph ng th c kh i t o phân s có t b ng 0 và m u b ng 1 - Ph ng th c kh i t o (int ts, int ms) kh i t o phân s có t s b ng ts và m u s b ng ms - Ph ng th c nh p thông tin cho phân s - Ph ng th c c ng hai phân s - Ph ng th c c ng phân s v i m t s - Ph ng th c tr hai phân s - Ph ng th c tr 1 phân s cho m t s - Ph ng th c in k t qu ra màn hình a, H ng d n: Thu c tính c a l p: int ts,ms: t s và m u s c a phân s Các ph ng th c c a l p: - Kh i t o không tham s : pulic phanso() và gán giá tr c a t =0, m u s =1 - Kh i t o hai tham s : Public phanso(int tu,int mau) - C ng phân s v i phân s - c ng phân s v i m t s - Tr phân s cho phân s - Tr phân s cho m t s - Ph ng th c hi n k t qu lên màn hình Vì trong Bài t p này có nhi u ph ng th c ch ng nhau (s ch ng ph ng th c) nên các b n chú ý cách g i các ph ng th c. b, Bài t p gi i m u: using System; using System.Collections.Generic; using System.Text; namespace phanso { Class phanso { Public int ts; Public int ms; //ham thiet lap ko tham so Public phanso() { ts = 0; ms = 1; } //phuong thuc thiet lap hai tham so Public phanso(int t, int m) { ts = t; ms = m; } Public void nhap() { Console.Write("nhap tu so:"); ts = Convert.ToInt32(Console.ReadLine());
Trang 46
Bài t p L p Trình H
ng
i
ng C#
Console.Write("nhap mau so:"); ms = Convert.ToInt32(Console.ReadLine()); }
private void cong(phanso a,phanso b) { phanso kq = new phanso();
kq.ts = a.ts * b.ms + a.ms * b.ts; kq.ms =a.ms * b.ms; Console.WriteLine("tong cua hai phan so la:{0}/{1}", kq.ts, kq.ms); }
private void cong(phanso a, int c) { phanso kq = new phanso(); kq.ts = a.ts + a.ms * c; kq.ms = a.ms ; Console.WriteLine("{0}/{1}", kq.ts, kq.ms); }
private void hieu(phanso a, phanso b) { phanso kq = new phanso(); kq.ts = a.ts * b.ms - a.ms * b.ts; kq.ms = a.ms * b.ms; Console.WriteLine(":{0}/{1}", kq.ts, kq.ms); }
private void hieu(phanso a, int c) { phanso kq = new phanso(); kq.ts = a.ts - a.ms * c; kq.ms = a.ms; Console.WriteLine("{0}/{1}", kq.ts, kq.ms); }
private void hien(phanso p) { Console.WriteLine("phan so:{0}/{1}",p.ts,p.ms); }
Class tester {
static void Main(string[] args) { Console.WriteLine("goi phuong thuc thiet lap ko tham so:"); phanso R = new phanso(); R.hien(R); phanso P = new phanso(); P.nhap(); P.hien(P); phanso KQ = new phanso(); KQ.cong(R, P); KQ.hieu(Q,P); Console.WriteLine("nhap so c bat ki:"); int c; c = Convert.ToInt32(Console.ReadLine());
Trang 47
Bài t p L p Trình H
ng
i
ng C#
Console.Write("tong cua phan so thu nhat voi c la:"); KQ.cong(P, c); Console.Write("hieu cua phan so thu nhat voi c la:"); KQ.hieu(P, c); Console.Write("tong cua phan so thu hai voi c la:"); KQ.cong(Q, c); Console.ReadKey(); } } } }
K t qu sau khi ch y ch
ng trình là:
goi phuong thuc thiet lap khong tham so: phan so: 0/1 nhap P: tu so = 5 mau so = 6 phan so : 5/6 nhap Q: tu so = 3 mau so = 6 phan so: 3/6 tong cua P & Q la: 48/36 hieu cua P –Q la: -12/36 nhap so c bat ki: 8 tong cua P voi 8 la: 53/6 hieu cua P voi 8 la: -43/6 tich cua Q voi 8 la: 24/6 Trong ví d trên có t i 6 ph ng th c ch ng nhau t ng ôi m t ó là hàm thi t l p không tham s Public phanso() và hàm thi t l p hai tham s Public phanso(int t, int m) dùng kh i t o các giá tr ban u cho bi n i t ng phân s ; hai ph ng th c c ng (gi a hai phân s : private void cong(phanso a,phanso b), gi a phân s v i m t s private void cong(phanso a, int c)) và hai ph ng th c tr (gi a phân s v i m t s private void hieu(phanso a, phanso b), gi a phân s và m t s private void hieu(phanso a, int c)). Các ph ng th c trùng nhau v tên nh ng khác nhau v s l ng tham s , khác nhau v thành ph n d li u c a t ng i s c a ph ng th c. Ngoài ra thì ch ng ph ng th c còn khác nhau v ki u d li u tr v c a ph ng th c n a. T t nhiên là vi c s d ng chúng c n ph i phân bi t rõ t ng ph ng th c d a vào s khác nhau c a t ng ph ng th c. N u không thì s phát sinh l i do trình biên d ch. 13. Xây d ng m t l p vecto và hi n các phép toán trên vector a, H ng d n: Thu c tính: - C n c p phát m t vùng nh Ph ng th c:
ng
l u các thành ph n d li u c a m t vecto.
Trang 48
Bài t p L p Trình H - Ph ng th - Ph ng th - Ph ong th - Ph ng th b, Bài t p gi i m
ng
i
ng C#
c kh i t o c sao chép c tính t ng, hi u, tích hai vecto (chú ý v ph c nh p, hi n vecto u:
ng th c tr ra giá tr )
using System; Class vecto { //Khai bao mang v chua các thành ph n t a c a vector int[] v; //Phuong thuc khoi tao khong tham so Public vecto() { v=new int[10]; } Public vecto(int n)// phuong thuc khoi co tham so khoi tao vecto n chieu { v=new int[n]; } Public double dodai() { return Math.Sqrt(this.tichvohuong(this)); } Public void nhap() { Console.WriteLine("nhap cac thanh phan cua vecto :"); for (int i = 0; i < v.Length; i++) { Console.Write("v[{0}]=", i + 1); v[i] = int.Parse(Console.ReadLine()); } } // Cong hai vecto Public vecto cong(vecto u) { vecto tmp=new vecto(v.Length); if (v.Length == u.v.Length) for (int i = 0; i < v.Length; i++) tmp.v[i] = v[i] + u.v[i]; else Console.WriteLine("Khong thuc hien duoc phep cong vi hai vecto khong cung chieu"); return tmp; } Public vecto hieu(vecto u) { vecto tmp = new vecto(v.Length); if (v.Length == u.v.Length) for (int i = 0; i < v.Length; i++)
Trang 49
Bài t p L p Trình H
ng
i
ng C#
tmp.v[i] = v[i] - u.v[i]; else Console.WriteLine("Khong thuc hien duoc.Hai vecto khong cung chieu"); if (v.Length == u.v.Length) for (int i = 0; i < v.Length; i++) tmp.v[i] = v[i] + u.v[i]; else Console.WriteLine("Khong thuc hien duoc phep cong vi hai vecto khong cung chieu"); return tmp; } Public vecto hieu(vecto u) { vecto tmp = new vecto(v.Length); if (v.Length == u.v.Length) for (int i = 0; i < v.Length; i++) tmp.v[i] = v[i] - u.v[i]; else Console.WriteLine("Khong thuc hien duoc.Hai vecto khong cung chieu"); return tmp; } Public vecto tich(int k) { vecto tmp = new vecto(v.Length); for (int i = 0; i < v.Length; i++) tmp.v[i] = v[i] * k; return tmp; } Public bool vuonggoc(vecto a) { return (this.tichvohuong(a) == 0); } // Tich vo huong hai vecto Public int tichvohuong(vecto u) { int tmp = 0; if (v.Length == u.v.Length) for (int i = 0; i < v.Length; i++) tmp = tmp + v[i] * u.v[i]; else Console.WriteLine("Khong thuc hien duoc.Hai vecto khong cung chieu"); return tmp; } } Public void print(vecto c) { Console.Write("("); for (int i = 0; i < v.Length; i++) if (i == v.Length - 1) Console.Write("{0}", v[i]); else
Trang 50
Bài t p L p Trình H
ng
i
ng C#
Console.Write("{0},",v[i]); Console.WriteLine(")"); } }
Class Tester {
static void Main() { vecto A= new vecto(3); vecto B= new vecto(3); vecto S; int k; A.nhap(); B.nhap(); Console.Write("vecto A"); A.print(A); Console.WriteLine("Do dai = {0}", A.dodai()); Console.Write("vecto B"); B.print(B); Console.WriteLine("Do dai = {0}", B.dodai()); if (A.vuonggoc(B) == true) Console.Write("Hai vec to vuong goc"); else Console.WriteLine("Hai vecto khong vuong goc !"); Console.Write("Tong hai vecto la:"); S = A.cong(B); Console.Write(" S = "); S.print(S); Console.Write("Hieu hai vecto la:"); S = A.hieu(B); Console.Write("S = "); S.print(S); Console.WriteLine("Tich vo huong cua hai vecto: S = {0}", A.tichvohuong(B)); Console.Write("Ban hay nhap vao mot so k ="); k = int.Parse(Console.ReadLine()); Console.Write("Tich cua vecto A voi k la:"); S = A.tich(k); Console.Write("S = "); S.print(S); Console.Write("Tich cua vecto B voi k la:"); S = B.tich(k); Console.Write("S = "); S.print(S); Console.ReadKey(); } }
K t qu sau khi ch y ch
ng trình:
Nhap cac thanh phan cua vecto V[1]=4 V[2]=7 V[3]=6 Vecto A(4,7,6) Trang 51
Bài t p L p Trình H
ng
i
ng C#
Do dai = 10,0498756211209 Nhap cac thanh phan cua vecto V[1]=1 V[2]=0 V[3]=9 Vecto B(1,0,9) Do dai = 9.05538513813742 Hai vecto khong vuong goc Tong cua hai vecto la: S=(5,7,15); Hieu cua hai vecto la: S=(3,7,-3) Tich vo huong cua hai vecto la: S=58 Ban hay nhap vao so k: 3 Tich cua A voi k la: S=(12,21,18) Tich cua B voi k la: S=(3,0,27)
14. Gói ghém d li u thông qua các thu c tính Xây d ng m t thu c tính ten cho l p tentoi và hi n th h tên ra màn hình a, H ng d n: xây d ng m t thu c tính ten ban u ta i khai báo thu c tính h trong l p tentoi b ng t khóa Public trong l p tester có th g i nó ra th c hi n. Khai báo m t thu c tính có tên b t kì(ví d hoten) b ng t khóa private nó ch có th s d ng trong l p tentoi v i m c ích ghi giá tr cho thu c tính ten. S d ng hàm set và get ghi và c giá tr cho thu c tính. b, Bài gi i m u: using System; namespace hoten { Public Class tentoi { Public string ho; private string hoten; Public string ten {
get {
return hoten; }
set { hoten = value; } }
Class tester {
static void Main() { tentoi T = new tentoi();
Trang 52
Bài t p L p Trình H
ng
i
ng C#
T.ten ="Hoa"; T.ho = "Nguyen thi"; Console.WriteLine(" Ten cua toi la {0} {1}",T.ho,T.ten); Console.WriteLine(" Xin chao tat ca cac ban!"); Console.ReadKey(); } } } }
K t qu sau khi ch y ch
ng trình:
Ten cua toi la Nguyen thi Hoa Xin chao tat ca cac ban!
Bài t p 4: Xây d ng m t ch ng trình th c hi n yêu c u sau: - Nh p vào thông tin c a các h c sinh v i s l ng h c sinh tùy ý ng i s d ng. Thông tin c a h c sinh bao g m: H tên, i m toán, i m lí, m hóa. - Hi n th danh sách các sinh viên ph i thi l i. N u không có sinh viên nào thi l i thì a ra thông báo “Không có h c sinh nào ph i thi l i” a, H ng d n: - Theo yêu c u c a Bài t p toán thông tin v h c sinh r t nhi u bao g m h tên, i m toán, m lí, m hóa vì v y hi n th danh sách hoc sinh ra b ng cách truy xu t t i nó t bên ngoài l p thì ta ph i khai báo t khóa truy xu t n các thu c tính có ph m vi ho t ng ngoài l p vì v y s làm ch ng trình s gi m tính rõ ràng, d li u không c b o v vì v y ta c n ph i óng gói d li u tránh c nh ng u trên. Trong Bài t p này ta c n ph i xây d ng 2 l p - Class hocsinh + Khai báo các bi n thành viên g m s(tên), dt( i m toán), dh( m hóa), dl( m lí) ch c s d ng trong l p hocsinh nên nó c khai báo b ng t khóa private. Các d li u này c óng gói. + Ph ng th c nh p, hi n th , hàm óng gói d li u ( m toán, lí, hóa) cl p dshs truy xu t n nên nó c khai báo b ng t khóa Public. - Class dshs + Ph ng th c nh p và hi n th các thông tin cho h c sinh theo danh sách b ng cách g i ph ng th c nh p và hi n th l p h csinh. + Thành ph n d li u: (n: s h c sinh, ds ki u m ng ) c khai báo b ng t khóa private vì nó ch c s d ng trong l p dshs. b, Bài t p gi i m u: using System; Class hocsinh { private string s; private double dt, dl, dh; Public void nhap() {
Trang 53
Bài t p L p Trình H
ng
i
ng C#
Console.Write("Nhap ho ten: "); s = Console.ReadLine(); Console.Write("Diem toan: "); dt = double.Parse(Console.ReadLine()); Console.Write("Diem li: "); dl = double.Parse(Console.ReadLine()); Console.Write("Diem hoa: "); dh = double.Parse(Console.ReadLine()); }
Public void hien() { Console.Write("Thong tin can hien thi\n"); Console.WriteLine("Ho ten:{0}", s); Console.WriteLine("Diem toan:{0}",dt); Console.WriteLine("Diem li:{0}", dl); Console.WriteLine("Diem hoa:{0}", dh); }
Public Double tdl {
set { dl = value; }
get { return dl; } }
Public Double tdt {
set { dt = value; }
get {
return dt; } }
Public Double tdh {
set { dh = value; }
get { return dh; } } }
Class dshs {
private int n; private hocsinh[] ds; Public void nhap() { Console.Write("Nhap so hs="); n = Convert.ToInt32(Console.ReadLine());
Trang 54
Bài t p L p Trình H
ng
i
ng C#
ds = new hocsinh[n]; for (int i = 0; i < n; i++) ds[i] = new hocsinh(); Console.Write("Nhap thong tin cho tung hoc sinh\n"); for (int i = 0; i < n; i++) { Console.WriteLine("Nhap thong tin cho hoc sinh thu {0}", i + 1); ds[i].nhap(); } }
Public void hien() { for (int i = 0; i < n; i++) { if ((ds[i].tdt < 5) || (ds[i].tdl < 5) || (ds[i].tdh < 5)) Console.WriteLine("Danh sach cac hoc sinh thi lai"); ds[i].hien(); if ((ds[i].tdt > 5) & (ds[i].tdl > 5) & (ds[i].tdh > 5)) Console.WriteLine("Khong co hoc sinh nao phai thi lai"); } } }
Class tester {
static void Main() static void Main()
{ {
dshs a = new dshs(); a.nhap(); a.hien(); Console.ReadLine(); } }
K t qu sau khi ch y ch
ng trình:
Nhap so hs=2 Nhap thong tin cho tung hoc sinh Nhap thong tin cho hoc sinh thu 1 Nhap ho ten: Nguyen thi Trang Diem toan: 8 Diem hoa: 9 Diem li: 10 Nhap thong tin cho hoc sinh thu 2 Nhap ho ten: Nguyen hai hau Diem toan:6 Dem hoa: 7 Diem li: 4 Danh sach cac hoc sinh thi lai Ho ten: Nguyen hai hau
Trang 55
Bài t p L p Trình H
ng
i
ng C#
Diem toan: 6 Diem hoa: 7 Diem li: 4
C. CÂU
I LÝ THUY T VÀ TR C NGHI M
Câu 1: S khác nhau gi a khai báo thành ph n d li u Public va không Public là nh th nào? L y ví d minh a. Câu 2: Tham s this
c s d ng nh th nào? Khi nào thì s d ng this?
Cau 3: Trình bày v cách th c s d ng các thành ph n static. Các thành ph n static c s d ng khi nao? Mu n l p không o c th hi n a i t ng thì ph i làm gì? Câu4: Câu nào trong nh ng câu sau úng: a, M t l p luôn luôn có l p cha. b, M t l p luôn có m t ho c nhi u l p con. c, Th hi n c a m t l p c s c ng là th hi n c a m t l p d n xu t. d, Th hi n c a l p d n xu t c ng là th hi n c a l p c s . Câu 5: Câu nào trong nh ng câu sau úng M t l p tr u t ng là: a, M t l p mà t t c th hi n là không xác nh. b, M t l p khong có nh ngh a ph ng th c và các thu c tính. c, M t l p k th a t nhi u l p khác nhau. d, M t l p mà không th có th hi n cho nó. Câu 6: Ch ra câu tr l i úng nh t l i c a các khai báo sau: Class A { Public void nhap(int a, int b) { //nhap a,b } Public int tong(int c); } int nhap( ):A Class main() { } a, Dòng 3 bi l i b, Dòng 7 b l i. c, Dòng 7 và Dòng 9 b l i Câu 7: n ch ng trình sau ây có l i. Hãy tìm ra l i và s a i cho úng: using System; using System.Console; Class VD1 { Public string first; } Trang 56
Bài t p L p Trình H
ng
i
ng C#
Class tester { static void Main(string[] args) { VD1 vd=new VD1(); Write("Nhap vao mot chuoi:"); vd.first=ReadLine(); Write("Chuoi nhap vao: {0}",vd.first); } } H ng d n: - Không có khai báo using System.Console; - Không t n i câu l nh Write, ReadLine c l p Câu 8: Tìm và s a l i trong n ch ng trình sau: using System; Class Tester { static void Main() { Display(); } Public static void Display() { System.Console.WriteLine("Xin chao tat ca moi nguoi"); return 0; } } H ng d n: Sai ph ng th c Public static void Display() Câu 9: Hãy s a l i sai trong n code sau cho úng nhât: using System; Class Class1 { Public static void Getnumber(ref int x, ref int y) { x = 5; y = 7; } Public static void Main() { int a = 0; int b = 0; Getnumber(a,b); System.Console.WriteLine("a={0} \nb={1}", a, b); System.Console.ReadKey(); } } H ng d n: Sai cách truy n tham s cho ph ng th c Getnumber(), c n ph i có hai tham chi u ref.
D. BÀI T P T
GI I Trang 57
Bài t p L p Trình H
ng
i
ng C#
Bài t p 1 :Xây d ng l p hình tròn, thu c tính là bán kính c a hình tròn, các ph th c tính chu vi và di n tích c a hình tròn ó
ng
ng d n: Thành ph n d li u c a l p hình tròn ch g m bán kính hình tròn ó. Ph ng th c: - Public nhap(): nh p bán kính cho hình tròn - Public double chuvi(): tính chu vi hình tròn - Public double hien(): hi n th thông tin v hình tròn (bk, cv, dt) Hai ph ng th c tính chu vi và di n tích là hai ph ng th c có tr ra gi tr . Bài t p 2: Xây d ng l p hình tr v i thu c tính g m bán kính hình tròn, chi u cao hình tr và các ph ng th c thi t l p. Sau ó tính chu vi, di n tích xung quanh, di n tích toàn ph n và th tích c a hình tr ó ng d n: Thành ph n d li u g m có: bán kính hình tròn và chi u cao hình tr Ph ng th c: - nh p th ng tin cho i t ng - hi n th thông tin liên quan t i i t ng - tính chu vi - tính di n tích xung quanh - tính di n tích toàn ph n - tính th tích c a hình tr () Bài t p 3: Xây d ng l p Point cho các i m trong không gian ba chi u (x,y,z). L p ch a m t constructtor m c nh, m t hàm Nagate bi n i m thành i l ng có d u âm, m t hàm Norm dùng tính kho ng cách t mt ig ct a và m t hàm in k t qu lên màn hình. ng d n: Thu c tính: ba thành ph n d li u x, y, z Ph ng th c: - constructor m c nh dùn kh i t o giá tr cho i t ng - Nagate(): bi n i t a c a m - Norm(): tính kho ng cách t i m ó t i g c t a - Nh p thông tin - Hi n th thông tin Bài t p 4: Xây d ng l p dãy s g m mô t các dãy s g m các ph ng th c sau: - ph ng th c nh p dùng nh p thông tin t bàn phím - ph ng th c print dùng hi n th thông tin lên bàn phím - ph ng th c kh i t o dayso(int n) kh i t o m t m ng g m n ph n t Bài t p 5: Vi t ch ng trình nh p vào m t ngày tháng sau ó in lên màn hình. Sau ó xây d ng ch ng trình tính s ngày cách nhau gi a hai m c th i gian c nh p vào t bàn phím H ng d n: Thành ph n d li u g m có int day, int month, int year miêu ngày, tháng, m a i t ng. Ngaoì ra, c n khai báo hai ng h ng s là m ng tháng và m ng ngày theo dõi là tháng nào v i t ng ng bao nhiêu ngày trong tháng ó: unsafe Public string(char *) = (“mot”, “hai”, “ba”, “bon”, “nam”, “su”, “bay”, “tam”, “chin”, “muoi”, “muoi mot”, “muoi hai” ); Trang 58
Bài t p L p Trình H
ng
i
ng C#
ngaythang = new int [] { 31, 28, 31, 30, 31, 30, 31, 31, 30 ,31, 30, 31} Các ph ng th c thi t l p: không tham s , m t tham s , hai tham s hay ba tham s . Trong l p c n xây d ng ph ng th c ki m tra tính h p l c a d li u nh p vào. Ph ng th c nh p và hi n thông tin a i t ng. Trong ph ng th c hi n c n chú ý in rõ là m nhu n hay không: M t n m nhu n n u n m chia h t cho 4 ho c chia h t cho 400, nh ng không chia h t cho 100. Trong n m nhu n thì tháng hai co t i 29 ngày. Bài t p 6:Vi t l p ConvertUtil th c hi n chuy n m t s t h c s 10 sang h c s 2, 8, 16 và c s a b t k . ng d n: Trong Bài t p này b n nh t thi t ph i s d ng stack th c hi n chuy n i. Vi c chuy n i t h c s 10 sang các c s b t kì thông qua phép chia liên ti p gi ng v i Bài t p toán ví d trên. B n hãy tham kh o và t hoàn thi n ý t ng. Bài t p 7: Vi t ch ng trình xây d ng l p Timer v i các hàm thi t l p và các tham s m c nh, thành ph n d li u: hour, minute, second. Các ph ng th c Time(int = 0, int = 0, int = 0) ph ng th c thi t l p v i ba tham s ng m nh dùng kh i t o d li u cho i t ng, Settime() dùng thi t l p d li u cho i t ng, các ph ng th c in gi d i d ng chu n và in gi d ng gi quân i. H ng d n: Thành ph n d li u g m có: hour, minute, second Ph ng th c: - Các ph ng th c kh i o cho i t ng - Ph ng th c ki m tra tính h p l c a d li u nh p vào: 0<= hour <= 24; 0<= minute <= 60; 0<= second <= 60; - Ph ng th c nh p thông tin - Ph ng th c in gi quân ôi: (ví d 16:4:30) - Ph ng th c in gi chu n: (ví d : 4:4:30 PM) Bài t p 8: Xây d ng l p Employee bao g m tên và ch ng minh nhân dân. Ngoài ph ng th c thi t l p, m t copy constructor, m t destructor và còn có ph ng th c nh p, hi n h tên và ch ng minh th lên màn hình. Bài t p 9: Xây d ng l p sophuc th c hi n các phép toán trên s ph c v i các thu c tính ph n th c ph n o và các ph ng th c bao g m - Ph ng th c kh i t o (float pt, float pa) dùng kh i t o các thành ph n cho s ph c v i ph n th c b ng pt, ph n o b ng pa - Ph ng th c kh i t o ph n th c b ng 0, ph n o b ng 0 - Ph ng th c c ng hai s ph c - Ph ng th c tr hai s ph c - Ph ng th c rút g n hai s ph c - Ph ng th c hi n s ph c ra mà hình Bài t p 10: Xây d ng l p hình tr Cyliender d li u g m bán kính chi u cao c a hình tr và ph ng th c tính chu vi, th tích c a hình tr ó. Trong l p ngoài các ph ng th c tính toán còn có các ph ng th c thi t l p và sao chép. a, H ng d n: Các thu c tính c a l p g m: - float bk: bán kính c a hình tròn áy tr Trang 59
Bài t p L p Trình H
ng
i
ng C#
- float cc: chi u cao c a hình tr Các ph ng th c g m có: - Ph ng th c thi t l p kh i t o d li u cho i t ng thu c l p hinhtru này - ph ng th c sao chép i t ng c a l p hình tr - ph ng th c tính chu vi hình tr - ph ng th c tính th tích c a hình tr Bài t p 11: Xây d ng l p ma tr n vuông v i các hàm tính nh th c, ma tr n ngh ch o, ma tr n chuy n v , ph ng th c ma tr n, xu t ma tr n lên màn hình. C ng, tr , nhân hai ma tr n. H ng d n: Ma tr n vuông là m t ng hai chi u có s hàng b ng s c t. nh p thông tin cho ma tr n ta nh p cho t ng ph n t theo hàng. Hi n thông tin ng hi n theo hàng và c t a ma tr n. Áp ng các ki n th c v ma tr n tính nh th c, ma tr n ngh ch o, ma tr n chuy n cho ma tr n, c ng, tr , nhân hai ma tr n. (xem thêm ph n bài t p gi i m u trên v ma tr n) Bài t p 12: Xây d ng l p sinh viên qu n lý h tên, ngày sinh, i m ba môn h c tr nên, a ra s l ng sinh viên c làm án t t nghi p hay thi t t nghi p, bao nhiêu sinh viên không c thi t t nghi p v i các tiêu chu n xét: - làm án n u m trung bình =>7 và không có môn nào d i 5 - thi t t nghi p n u m tb < 7 và không có môn nào d i 5 - thi l i n u có ít nh t m t môn (Xem i ví d trong ph n bài gi m u. nh ngh a thêm trong l p m t ph ng th c ki m tra a ra danh sách sinh viên c làm án, thi t t nghi p hay không c thi t t nghi p)
E. BÀI T P T NG H P Bài t p 1: Cho m t dãy các hình ch nh t. B ng l p trình h ng i t ng, hãy vi t ch ng trình th c hi n các ch c n ng sau: - Nh p vào m t dãy hình ch nh t - Tìm và in ra hình ch nh t có chu vi l n nh t và hình ch nh t có di n tích l n nh t Bài t p 2: Cho m t dãy các i m. Hãy tìm ra tam giác có chu vi nh nh t, tam giác có di n tích l n nh t trong các tam giác c t o ra t dãy i m trên. H
ng d n:
gi i quy t bài toán trên thì ta c n nh ngh a hai l p: l p diem v i các ph ng th c nh p, hi n thông tin, tính dài n th ng ( dài gi a hai i m). L p tamgiac v i m i tam giác có 3 i m chính là i t ng l p i m. nh ngh a các ph ng th c tính chu vi tam giac, ph ng th c tính di n tích tam giác, ph ng th c hi n thông tin. Thi hành các ph ng tính chu vi, di n tích a i t ng tam giác. So sanh chu vi, di n tích a ra tam giác có chu vi nh nh t, di n tích l n nh t. Bài t p 3: B ng ph ng pháp l p trình h ng i t ng, hãy vi t ch ng trình qu n lý nhân s cho m t t dân c (khu ph ), chi ti t v c ngày thang n m sinh, n i sinh và ch hi n t i. a ra thông tin v gia ình có ng i cao tu i nh t hay ng i ít tu i nh t. H ng d n: H ng gi quy t gi ng bài 2: Trang 60
Bài t p L p Trình H
ng
i
ng C#
Gia ình là m t ng các ph n t ki u ng i Khu ph l i là m t ng các i t ng ki u gia ình. Vì v y c n nh ngh a ba l p: it
L p nguoi mô rõ h tên, ngày tháng n m sinh, ng. Các ph ng th c nh p, hi n thông tin.
i sinh, ngh nghi p, ch
c a
L p giadinh mô gia ình này có bao nhiêu ng i, ai cao tu i nh t trong gia ình, ai kém tu i nh t trong gia ình. Nh p thông tin cho gia inh chính là nh p thông tin cho t ng thành viên. Ph ng th c hi n th tóm t t thông tin v gia ình. L p khupho: khu ph có bao nhiêu gia ình, ai là ng i cao tu i nh t trong khu ph , ai là ng i kém tu i nh t. (So sánh ng i cao tu i, kém tu i nh t trong gi a các gia ình a ra k t qu cho khu ph ). Ph ng th c hi n th thông tin. Có th xây d ng thu c tính ch
c cho các thu c tính trong l p nguoi và l p giadinh
Trang 61
Bài t p L p Trình H
CH
ng
i
ng C#
NG II: N P CH NG TOÁN T
TRÊN L P
c tiêu: Sau khi tìm hi u xong ch ng này ng i h c có th n m c các n i dung sau: a ra c các nguyên t c nh ngh a ch ng toán t . So sánh s gi ng và khác nhau gi a vi c xây d ng m t hàm ch ng toán t và hàm thông th ng. Bi t c các yêu c u c n thi t khi s d ng toán t . Ch ng c các hàm toán t tiêu bi u t ng tr ng cho các phép toán( +, - ,= ,!=, = =, []…) Chuy n i ki u ng m nh trong ki u d li u i t ng.
A. TÓM T T LÝ THUY T 1. Toán t Toán t c kí hi u b ng m t bi u t ng dùng th c hi n m t hành ng. Các ki u d li u c b n c a C# nh ki u nguyên h tr r t nhi u các toán t gán, toán t toán h c, toán t logic.. 2. Ch ngToán t Toán t c nh ngh a ch ng b ng cách nh ngh a m t hàm toán t , hàm toán t là các ph ng th c t nh, giá tr tr v c a nó th hi n k t qu c a m t phép toán và nh ng tham s là toán h ng. Khi chúng ta t o m t toán t cho m t l p là chúng ta n p ch ng toán t (overloaded) c ng gi ng nh là chúng ta n p ch ng b t c ph ng th c thành viên nào. Vi c ch ng toán t th c ch t c ng gi ng nh ta xây d ng m t hàm thông th ng và k t qu thu c nh nhau nh ng ch ng toán t giúp ng i l p trình có th s d ng các kí hi u toán h c th ng g p(+ , +, *, / ) , d nh và g n g i h n 3. Cú pháp n p ch ng toán t Hàm toán t bao g m t khóa operator theo sau là kí hi u c a toán t ngh a ch ng. Trong ó t khoá operator là m t b xung ph ng th c. C# cho phép n p ch ng toán t nh sau:
c
nh
Type Operator operator_symbol(parameter_list); Trong ó : - Type là ki u giá tr tr v c a hàm. - parameter_list là danh sách các i s n u có - Operator_symbol là các toán t . Trong C# có các hàm toán t có th n p ch ng và các ph ng th c thay th nh sau: Toán t + * /
Tên ph ng th c thay th Add Subtract Multiply Divide Trang 62
Toán t > < != >=
Tên ph ng th c thay th Compare Compare Compare Compare
Bài t p L p Trình H
ng
i
ng C#
% ^
Mod Xor
<= *=
Compare Multiply
& |
BitwiseAnd Bitwiseor
-= ^=
Subtract Xor
Add
<<=
leftshift
Or
%=
Mod
= <<
Assign leftshift
+= &=
Add BitwiseAnd
>>
Rightshift
|=
Bitwiseor
==
Equals
/=
Divide
-++
Decrement Increment
-
Negate
&& ||
Ví d 1: S d ng n p toán t (+) c ng hai phân s Public static phanso operator +(phanso rhs ,phanso lhs) { //các câu l nh } Gi i thích: rhs là phân s bên ph i, lhs là phân s bên trái. Ví d 2: S d ng n p ch ng toán t (-) m t ngôi i d u cho m t s nh sau: Public static So operator –(So s) { } 4. Toán t m t ngôi Các toán t dùng cho m t i t ng hay tham chi u d các toán t m t ngôi nh : + ( +a ) , - (-a) , ++ (++a) …
n
it
ng trong l p. Ví
5. Toán t hai ngôi Các toán t nh toán t (= =) so sánh gi a hai i t ng. toán t (!=) so sánh không b ng gi a hai i t ng, “<” so sánh nh h n, “>” so sánh l n h n… ây là các toán t ph i có các c p toán h ng hay ta còn g i là toán t hai ngôi.Trong C# còn có toán t ba ngôi. Chú ý: Trong ngôn ng C# không t o c toán t nonstatic, do v y toán t nh phân ph i l y hai toán h ng. 6. H tr ngôn ng .NET khác C# cung c p kh n ng cho phép n p ch ng toán t cho các l p mà chúng ta xây d ng. Trong khi ó các ngôn ng .NET khác không cho phép u này. + m b o l p h tr các ph ng th c thay th cho phép các ngôn ng khác có th g i . làm c u này thì khi n p ch ng toán t nào ó thì ph i xây d ng cho nó m t ph ng th c có ch c n ng t ng t nh toán t ã ch ng. Ví d : Trang 63
Bài t p L p Trình H
ng
i
ng C#
Khi chúng ta n p ch ng toán t (+) thì ph i cung c p m t ph ng th c Add( ) c ng làm ch c n ng c ng hai i t ng. Khi s d ng ch ng toán t (= =) thì nên cung c p thêm ph ng th c Equals() b i i t ng và h ng ch c n ng này n toán t (= =) cho phép l p c a ta a hình và cung c p kh n ng h u ích cho ngôn ng .Net khác. + Toán t so sánh : Có 6 toán t so sánh ng v i 3 c p Gi a các c p này luôn luôn có k t qu i ngh ch nhau: N u toán h ng u tr v giá tr true thì toán h ng kia tr v giá tr false. C# luôn luôn yêu c u b n n p ch ng c hai toán t ó. N u b n n p ch ng toán t "= =" thì ph i n p ch ng toán t "!=" n u không trình biên d ch s báo l i. Có m t h n ch là toán t so sánh ph i tr v ki u bool. và ó c ng là i m khác nhau gi a các toán h ng này và toán h ng s h c. C u trúc c a ph ng th c có ch c n ng t ng t nh toán t so sánh ã ch ng c xây d ng nh sau: Public override bool Equals(object obj) { Console.WriteLine("phuong thuc equals"); if (!(obj is phanso)) { return false; } return this = = (phanso)obj; } Trong ó toán t is dùng ki m trình ki u i t ng lúc ch ng trình ang th c hi n có thích ng v i toán h ng hay không. N u ki m tra th y ki u i t ng thích ng v i toán h ng thì k t qu tr ra là true và ng c l i là false. + Toán t chuy n i : Dùng t khóa implicit và explicit nó có tác d ng chuy n i m t s t ki u có kích th c nh sang kích th c l n và (ng c l i) mà không b m t thông tin. 7. Ph m vi s d ng c a các toán t Ph m trù Nh phân toán h c Th p phân toán h c Nh phân bit Th p phân bit So sánh 8. M t s tr
Toán t +, *, /, -, % +, -, ++, -&, |, ^, <<, >> !, ~, true, false = =,!=,>=,<, <=, >
H n ch Không Không Không Không Ph i n p ch ng theo t ng c p.
ng h p nên s d ng các toán t n p ch ng
1. Trong toán h c, m i i t ng toán h c nh : t a , vector, ma tr n, hàm s … N u b n vi t ch ng trình làm nh ng mô hình toán h c hay v t lý, b n nh t nh s mô t nh ng i t ng này. 2.Nh ng ch ng trình h a s s d ng các i t ng toán h c và to khi tính toán v trí c a trên màn hình. 3. M t l p mô t s l ng ti n. 4. Vi c s lý t hay ch ng trình phân tích v n b n có l p mô t các câu v n, m nh và b n ph i s d ng các toán h ng liên k t các câu l i v i nhau. Trang 64
Bài t p L p Trình H
ng
i
ng C#
9. Yêu c u khi s d ng toán t + nh ngh a nh ng toán t trong ki u d li u giá tr , ki u d li u xây d ng s n. + Cung c p ph ng th c n p ch ng toán t ch bên trong c a l p n i mà nh ng ph ng th c c nh ngh a. + S d ng tên và các kí hi u c mô t trong trong Common Language specification (CLS). T c là ta không c ch ng m t toán t m i + S d ng ch ng toán t trong tr ng h p k t qu tr v rõ ràng. Ví d : Khi ta s d ng toán t “or” ho c “and” gi a m t giá tr th i gian này v i m t th i gian khác thì k t qu tr v s không rõ ràng vì v y trong tr ng h p này ta không nên s d ng ch ng toán t . + N p ch ng toán t có tính ch t i x ng. Ngh a là: Khi dùng toán t ( = = ) thì ph i dùng toán t (!=) Khi dùng toán t ( < ) thì ph i dùng toán t ( > ). Khi dùng toán t ( > = ) thì ph i dùng toán t (<=). + Ph i cung c p các ph ng th c thay th cho toán t c n p ch ng. B i vì h u h t các ngôn ng khác không cho phép ch ng toán t nên khi ta s d ng thêm ph ng th c có ch c n ng t ng t nh toán t giúp cho ch ng trình có th phù h p v i nhi u ngôn ng khác nhau. 10.
u và nh
c
m c a ch ng toán t
u i m: + N p ch ng toán t là m t ph ng th c ng n g n giúp mã ngu n d nhìn h n, d qu n lí,sáng s a h n. + N p ch ng toán t là ng d n cho nh ng i t ng Nh c m: +Ta ph i s d ng n p ch ng toán t m t cách h n ch và phù h p v i các toán t c al p c xây d ng s n, không s d ng toán t quá m i hay quá riêng r . N u s d ng toán t m t cách l m d ng thì s làm ch ng trình nh m l n
B. BÀI T P M U 1. Ch ng toán t (+) a, H
i v i hai vector
ng d n:
- Xây d ng m t vector có ba i là x, y, z (ki u double). s d ng trong l p vector nên ta khai báo b ng thu c tính Public. Vì s d ng thu c tính Public có ph m vi ho t ng trong toàn b ch ng trình. Public x,y,z; - S d ng t khoá this c dùng tham chi u n th hi n hi n hành c a m t i t ng xem là con tr dùng tham chi u n t t c các ph ng th c không có thu c tính t nh trong l p vector. Các ph ng th c khác trong l p có th tham chi u n nh ng ph ng th c khác và các bi n thành viên thông qua t khóa this. - S d ng ch ng toán t (+) c ng hai vector V y ch ng trình c tóm t t nh sau: Struct vector { Public double x,y,z; // bi n thành viên truy c p Public Public vector(double x,double y, double z ) Trang 65
Bài t p L p Trình H
ng
i
ng C#
{ // Dùng t khóa this
t o
it
ng cho m t vector
} Public vector(vector rhs) { } Public override string ToString() { // Dùng hàm ToString chuy n sang xâu } Public static vector operator + (vector lhs, vector rhs) { // Dùng ch ng toán t c ng c ng hai vector // lhs là vector bên trái. // rhs là vector bên ph i. } b, Bài gi i m u: using System; namespace vt { struct Vector { Public double x, y, z; Public Vector(double x, double y, double z) { this.x = x; this.y = y; this.z = z; } Public Vector(Vector rhs) { x = rhs.x; y = rhs.y; z = rhs.z; } Public override string ToString() { return "( " + x + " , " + y + " , " + z + " )"; } Public static Vector operator * (Vector lhs,Vector rhs) { Vector result = new Vector(lhs); result.x *= rhs.x; result.y *= rhs.y; result.z *= rhs.z; return result; } Public static Vector operator +(Vector lhs, Vector rhs) Trang 66
Bài t p L p Trình H
ng
i
ng C#
{ Vector result = new Vector(lhs); result.x += rhs.x; result.y += rhs.y; result.z += rhs.z; return result; } } Public Class tester { static void Main() { Vector vect1, vect2, vect3, vect4; vect1 = new Vector(3.0, 3.0, 1.0); vect2 = new Vector(2.0, -4.0, -4.0); vect3 = vect1 + vect2; vect4 = vect1 + vect2; Console.WriteLine("vect1 = " + vect1.ToString()); Console.WriteLine("vect2 = " + vect2.ToString()); Console.WriteLine("Tong cua vector1 và vector2 la:"); Console.WriteLine("vect3 = " + vect3.ToString()); Console.WriteLine("Tich cua vector1 và vector2 la:"); Console.WriteLine("vect4 = " + vect3.ToString()); Console.ReadLine(); } } } K t qu sau khi th c hi n ch ng trình: vect1 = ( 5, 10, 4) vect2 = ( 3, 6, 9) Tong cua vector1 và vector2 la: vect3 = ( 8, 16, 13) Tich cua vector1 và vector2 la: Vect4 = ( 15, 16, 36)
Nh n xét: T ch ng trình trên ta c n chú ý n vi c xây d ng m t bi n rhs có ki u là m t vector b i vì c ng 2 hay nhi u vector thì ta ph i c ng hai vector tr c sau ó l i c ng ti p v i m t vector sau ( óng vai trò là rhs), c nh th n khi nào h t. T bài toán c ng hai vector này, t ng t ta có th xây d ng m t ch ng trình c ng nhi u vector v i nhau. 2. Ch ng toán t m t ngôi Xây d ng m t l p có tên SO. Cung c p giá tr cho s th nh t và s th hai, sau ó - Dùng ch ng toán t m t ngôi
t ng giá tr c a s th nh t lên 1 v.
Trang 67
Bài t p L p Trình H
ng
i
ng C#
- Dùng ch ng toán t hai ngôi
c ng hai s sau khi t ng s th nh t lên 1
v. a, H
n
ng d n: Xây d ng l p SO bình th ng (t o i t ng cho l p, chuy n thành xâu b ng ph ng th c ToString hi n ra màn hình ,…). t ng giá tr lên hay gi m giá tr c a m t s ta dùng toán t t ng gi m nh : “-“là toán t gi m, “++”là toán t t ng. + Xây d ng m t hàm ch ng toán t (+) t o m t bi n có ki u SO và bi n v a t o ra cho phép truy nh p t i bi n value ch a giá tr c a SO. Nó c khai báo c th nh sau: Public static SO operator +(SO s) { } + Xây d ng hàm ch ng toán t 1 ngôi v i toán t t ng (++) nh sau: Public static SO operator ++(SO s) { } Hàm này có tác d ng cho phép có th t ng giá tr c a bi n lên 1 n v , khi ta g i trong ch ng trình chính Console.WriteLine("Chuyen so thu nhat la: {0}", ++so1) { } Sau ó hàm ch ng toán t m t ngôi s c th c hi n. + Xây d ng hàm ch ng toán t 2 ngôi v i toán t (+) c ng s th nh t v i s th hai: Public static SO operator +(SO so1, SO so2 ) {} + Xây d ng l p Test ch a ch ng trình chính g i các hàm ã xây d ng l p SO ra th c hi n và a k t qu mà bài yêu c u ra màn hình b, Bài gi i m u: using System; namespace motngoi { struct so { int value; Public so(int value) { this.value = value; } Public override string ToString() { return (value.ToString()); } Public static so operator +(so s) { return (new so(-s.value)); } Public static so operator +(so so1, so so2) { return (new so(so1.value + so2.value)); } Trang 68
Bài t p L p Trình H
ng
i
ng C#
Public static so operator ++(so s) { return (new so(s.value + 1)); } } Class Test { Public static void Main() { so so1 = new so(11); Console.WriteLine("So thu nhat la: {0}", so1); so so2 = new so(125); Console.WriteLine("So thu hai la: {0}", so2); Console.WriteLine("Chuyen so thu nhat la: {0}", ++so1); Console.WriteLine("tong hai so sau khi chong toan tu mot ngoi doi voi so thu nhat"); Console.WriteLine("tong: {0}", so1 + so2); Console.ReadLine(); } } } K t qu sau khi th c hi n ch
ng trình:
So thu nhat la: 11 So thu hai la: 125 So thu nhat duoc chuyen thanh la:12 Tong hai so sau khi chong toan tu mot ngoi doi voi so thu nhat Tong :137 Nh n xét: - Trong bài t p này c n chú tr ng n cách ch ng toán t m t ngôi. C n n m c nh ng toán t m t ngôi c a n ng hóa. - Chú ý n dòng l nh sau: Public static so operator +(so s) { return (new so(-s.value)); } 3. Xây d ng m t l p sophuc có hai ph n th c (real) và o (imaginary). toán t +, - và i d u s ph c. a, H
p ch ng
ng d n: + xây d ng m t l p s ph c và th c hi n c ng tr hai s ph c thì ta có th dùng ch ng toán t nh bài t p trên. + Nh ng i d u c a m t s ph c (m t s , m t phân s ) thì làm th nào?. i u này có th th c hi n b ng cách s d ng ch ng toán t (-) i d u. Ch ng toán t “c nh ngh a nh sau: Public static sophuc operator -(sophuc a) Trang 69
Bài t p L p Trình H
ng
i
ng C#
{ sophuc tmp =new sophuc(); tmp.real = - a.real; tmp.imaginary = a.imaginary; return tmp; } g i hàm ch ng toán t “-” ra th c hi n b ng cách g i nó ra th c hi n, vi t dòng l nh trong ch ng trình chính nh sau: Console.WriteLine("{0}",-a); b, Bài gi i m u: using system; namespace sp { Public Class sophuc { private int real; private int imaginary; Public sophuc() : this(0, 0) { //cung cap gia tri ban dau } Public sophuc(int r, int i) { real = r; imaginary = i; } Public override string ToString() { return(System.String.Format("{0} + {1}i", real, imaginary)); } Public static sophuc operator+(sophuc a, sophuc b) { return new sophuc (a.real + b.real, a.imaginary + b.imaginary); } // su dung chong toan tu doi hai so: Public static sophuc operator-(sophuc a, sophuc b) { return new sophuc (a.real - b.real, a.imaginary - b.imaginary); } //Su dung toan tu doi voi mot so Public static sophuc operator -(sophuc a) { sophuc tmp =new sophuc(); tmp.real = - a.real; tmp.imaginary = a.imaginary; return tmp; } } Trang 70
Bài t p L p Trình H
ng
i
ng C#
Class Testsophuc { static void Main() { sophuc a = new sophuc(6, 64); sophuc b = new sophuc(2, 5); Console.WriteLine("So phuc thu nhat a = {0}", a.ToString()); Console.WriteLine("So phuc thu hai la b = {0}", b.ToString()); sophuc tong= a + b; Console.WriteLine("Tong hai so phuc = {0}", tong.ToString()); sophuc hieu = a - b; Console.WriteLine("Hieu hai so phuc la = {0}", hieu.ToString()); //Chuy n d u cho s ph c th nh t. Console.WriteLine("so phuc thu nhat doi dau thanh {0}",-a); Console.ReadLine(); } } }
K t qu sau khi th c hi n ch
ng trình:
So phuc thu nhat a=6 + 64i So phuc thu hai la b=2 + 5i Tong hai so phuc = 8 + 69i Hieu hai so phuc = 4 + 59i So phuc thu nhat doi dau thanh -6 + 64i
Nh n xét: + Trong bài t p này c n chú ý n vi c ch ng toán t (-) i d u cho s ph c còn trong bài t p s 5 thì dùng ch ng toán t (+) t ng thêm giá tr cho m t s . + Ta c ng có s d ng toán t (-) gi m giá tr c a m t s hay( m t phân s , m t s ph c ). i u quan tr ng ta c n ph i bi t c toán t m t ngôi nào c s d ng và c s d ng khi nào là thích h p em l i hi u qu cao. 4. Xây d ng m t l p phân s v i tên là phanso và a n ng hoá toán t trên l p. Th c hi n các nhi m v sau + Hi n th các phân s ban u và phân s sau khi ã s lí trên màn hình. + C ng hai phân s . + C ng m t phân s v i m t s . + So sánh hai phân s và hi n th k t qu trên màn hình. a, H ng d n: Chúng ta xây d ng m t l p phân s nh sau: Public Class phanso { Trang 71
Bài t p L p Trình H
ng
i
ng C#
// Xây d ng m t phân s có t s và m u s Public phanso(int tuso1,int mauso1) //Xây d ng m t phân s ch ch a m t toán h ng. Public phanso(int tuso2) //Chuy n m t s nguyên thành m t phân s có m u là 1 Public static implicit operator phanso(int theInt) //Chuy n m t phân s thành m t s nguyên. Public static explicit operator int(phanso thephanso) // So sánh hai phân s b ng toán t (= =) và (! =). Public static bool operator = =(phanso lhs, phanso rhs) Public static bool operator !=(phanso lhs, phanso rhs) //S d ng ch ng toán t (+): c ng hai phân s Public static phanso operator +(phanso lhs,phanso rhs) } b,Bài gi i m u: using system; namespace lop_phan_so { public class phanso { //Bi n thành viên l u tr t s và m u s private int tuso1; private int mauso1; public phanso(int tuso1,int mauso1) { this.tuso1 = tuso1; this.mauso1 = mauso1; } public phanso(int tuso2) { this.tuso1= tuso2; mauso1 = 1; } public static implicit operator phanso(int theInt) { return new phanso(theInt); } public static explicit operator int(phanso thephanso) { return thephanso.tuso1 / thephanso.mauso1; } public static bool operator = =(phanso lhs, phanso rhs) { if (lhs.tuso1 = = rhs.tuso1 && lhs.mauso1 = = rhs.mauso1) { // Khi hai phân s b ng nhau return true; Trang 72
Bài t p L p Trình H
ng
i
ng C#
} // Khi hai phân s không b ng nhau return false; } public static bool operator !=(phanso lhs, phanso rhs) { Console.WriteLine("su dung toan tu !="); return !(lhs = = rhs); } public override bool Equals(object obj) { Console.WriteLine("phuong thuc equals"); if (!(obj is phanso)) { return false; } return this = = (phanso)obj; } public static phanso operator +(phanso lhs,phanso rhs) { if(lhs.mauso1 = = rhs.mauso1) { Console.WriteLine("-S d ng toán t + v i hai phân s "); return new phanso(lhs.tuso1 + rhs.tuso1,lhs.mauso1); } Console.WriteLine("S d ng toán t +cho m t phân s v i m t s ”); int fist = lhs.tuso1 * rhs.mauso1; int second = rhs.tuso1 * lhs.mauso1; return new phanso(fist+ second, lhs.mauso1 * rhs.mauso1); } public override string ToString() { string s = tuso1.ToString() + "/" + mauso1.ToString(); return s; } public class tester { static void Main() { Console.WriteLine("-Phân s th nh t là:"); phanso ps1=new phanso(2,4); Console.WriteLine("ps1:{0}",ps1.ToString()); Console.WriteLine("-Phân s th hai là:"); phanso ps2 = new phanso(1,4); Trang 73
Bài t p L p Trình H
ng
i
ng C#
Console.WriteLine(" ps2:{0} ",ps2.ToString()); phanso ps3 = ps1 + ps2; Console.WriteLine(" ps1+ps2=ps3 "); Console.WriteLine(" ps2:{0} ",ps2.ToString()); phanso ps3 = ps1 + ps2; Console.WriteLine(" ps1+ps2=ps3 "); Console.WriteLine(" ps3:{0} ",ps3.ToString()); phanso ps4 = ps3 + 5; Console.WriteLine(" ps4=ps3+5:{0}",ps4.ToString()); phanso ps5 = new phanso(2, 4); Console.WriteLine(" phanso(2,4)"); Console.WriteLine("-So sánh ps1 va ps5 "); if (ps5 = = ps1) { Console.WriteLine(" ps5:{0}==ps1:{1}",ps5.ToString(), ps1.ToString()); Console.WriteLine("->Hai phân s này b ng nhau"); } Console.WriteLine("-So sanh ps2 va ps3 "); if (ps2 = = ps3) { Console.WriteLine("->Hai phân s này b ng nhau "); Console.WriteLine("ps2:{0}==ps3:{1}", ps2.ToString(), ps3.ToString()); } Console.WriteLine("ps2:{0}!=ps3:{1}", ps2.ToString(), ps3.ToString()); Console.WriteLine("->Hai phân s này không b ng nhau"); Console.ReadLine(); } } } }
K t qu sau khi th c hi n ch
ng trình:
-Phan so thu nhat la: ps1 = 2/4 - Phan so thu hai la: ps2 = 1/4 - Su dung toan tu + voi hai phan so ps1 + ps2 = ps3 ps3 = 3/4 - Su dung toan tu + voi mot phan so va mot so ps4 = ps3 + 5 ps4 = 23/4 - So sanh ps1 va ps5 Ps5 : 2/4 = = ps1:2/4 à Hai phan so nay bang nhau - So sanh ps2 va ps3 Ps2:1/4 != ps3:3/4 àHai phan so khong bang nhau Trang 74
Bài t p L p Trình H
ng
i
ng C#
Chú ý: + N u nh trong ch ng trình trên ta không dùng ph ng th c Equals thì ch ng trình v n ch y bình th ng mà không báo l i. Nh ng nó l i r t cân thi t vì ph ng th c Equals cung c p m t i t ng cho phép các ngôn ng khác có th g i. + Ta có th nh p giá tr c a phân s ngoài màn hình mà không c p giá tr tr c trong ch ng trình. 5. Xây d ng m t l p vector và th c hi n các yêu c u sau - Ta có th nh p n vector t bàn phím. - Nh p s chi u tùy ý. a ra t ng các vector. a ra hi u các vector. a, H ng d n: - Trong ch ng trình này ngoài l p tester ta i xây d ng l p vector và DSVT , nh p n vector v i s chi u tùy ý thì ta c n khai báo m t bi n t nh n và s d ng t khóa Public khai báo. Bi n n c khai báo nh sau: Public static int n; n là m t bi n t nh b i vì nó có th thay i tùy ý. nh p c s vector tùy ý ta c n ph i khai báo s vector d i d ng m ng trong l p DSVT nh sau: private vector[] ds ng t nh p c s chi u c a các vector m t cách tùy ý ta c ng khai báo s chi u c a vector trong l p vector t ng t nh trên: private int[]a. -Trong l p vector xây d ng các hàm và các ph ng th c Public vector() Public void nhap() Public void hien() Public vector tongvector(vector T) Public vector truvector(vector Tr) Public vector(vector lhs) Public vector coppy Public static vector operator -(vector lhs, vector rhs) Public static vector operator +(vector lhs,vector rhs) - Trong l p DSVT Public void nhap():g i ph ng th c nh p c a l p vector ra th c hi n ds[i].nhap() Public vector tong(): G i hàm coppy() ra th c hi n và s d ng vòng l p for duy t t vector u tiên n các vector cu i cùng và tr chúng l n l t d a theo ph n t (lhs và rhs Public vector tru(): Làm t ng t nh c ng} b, Bài gi i m u: using System; namespace vectorchong { class vector { public static int n; private int[] a; Trang 75
Bài t p L p Trình H
ng
i
ng C#
public vector() { a = new int[n]; } public void nhap() { int i; Console.WriteLine("Phan tu cua vector:"); for (i = 0; i < n; i++) { Console.Write("a[{0}]=",i); a[i] = int.Parse(Console.ReadLine()); } } public void hien() { int i; for (i = 0; i < n; i++) Console.Write("{0}", a[i]); Console.WriteLine(); } public vector tongvector(vector T) { vector tmp = new vector(); int i = 0; for (i = 0; i < n; i++) tmp.a[i] = a[i] + T.a[i]; return tmp; } public vector truvector(vector Tr) { vector tmp = new vector(); int i = 0; for (i = 0; i < n; i++) tmp.a[i] = a[i] - Tr.a[i]; return tmp; } public vector(vector lhs) { int i; for (i = 0; i < n; i++) this.a[i] = lhs.a[i]; } public vector coppy() { int i; vector tmp = new vector(); Trang 76
Bài t p L p Trình H
ng
i
ng C#
for (i = 0; i < n; i++) tmp.a[i] = a[i]; return tmp; } public static vector operator +(vector lhs,vector rhs) { vector tmp = new vector(); int i; for (i = 0; i < n; i++) tmp.a[i] = lhs.a[i] + rhs.a[i]; return tmp; } public static vector operator -(vector lhs, vector rhs) { vector tmp = new vector(); int i; for (i = 0; i < n; i++) tmp.a[i] = lhs.a[i] - rhs.a[i]; return tmp; } } } class DSVT { private int SVT; private vector[] ds; public void nhap() { int i; Console.Write("nhap so chieu cua vector n="); vector.n = int.Parse(Console.ReadLine()); Console.Write("Nhap so vector SVT ="); SVT = int.Parse(Console.ReadLine()); ds = new vector[SVT]; for (i = 0; i < ds.Length; i++) { ds[i] = new vector(); Console.WriteLine("Nhap thong tin cho Vector thu {0}", i + 1); ds[i].nhap(); } } public vector tong() { vector tmp = ds[0].coppy(); int i; for (i = 1; i < SVT; i++) tmp = tmp + ds[i]; Trang 77
Bài t p L p Trình H
ng
i
ng C#
return tmp; } public vector tru() { vector tmp = ds[0].coppy(); int i; for (i = 1; i < SVT; i++) tmp = tmp - ds[i]; return tmp; } } class tester { private int x; static void Main() { DSVT t = new DSVT(); t.nhap(); t.tong(); Console.WriteLine("- Tong cua cac vector da nhap la:"); t.tong().hien(); Console.WriteLine("- Hieu cua cac vector da nhap la:"); t.tru().hien(); Console.ReadLine(); } } } K t qu sau khi th c hi n ch ng trình: Nhap so chieu cua vector n=3 Nhap so vector SVT = 3 Nhap thong tin cho vector thu 1 Phan tu cua vector: a[0] = 2 a[1] = 4 a[2] = 2 Nhap thong tin cho vector thu 2 Phan tu cua vector: a[0] =5 a[1] = 6 a[2] = 2 Nhap thong tin cho vector thu 3 Phan tu cua vector a[0] =1 a[1] =5 a[2] =3 - Tong cua các vector da nhap la: 8 15 7 Trang 78
Bài t p L p Trình H
ng
i
ng C#
- Hieu cua cac vector da nhap la: -4 -7 -3
Nh n xét: - Qua ch ng trình trên ta c n chú ý làm th nào nh p vector có s chi u, s ph n t tùy ý t bàn phím. T ó có th nh p n ma tr n hay m t s ph c,… t bàn phím. - S d ng hàm copy c ng tr nhân các vector ta nh p m t cách n gi n h n. - S d ng hàm ch ng toán t c ng, tr hai vector
C. BÀI T P T
GI I
Câu h i tr c nghi m Câu h i1: Hãy cho bi t nh ngh a nào sau - Ch ng toán t nh ngh a nh là m - Ch ng toán t nh ngh a nh là m - Ch ng toán t nh ngh a nh là m Hãy gi i thích vì sao ch n nh v y.
ây sai t hàm thành ph n. t hàm b n. t ph ng th c.
Câu h i2: Cho o n ch ng trình sau ây: Using system; Class MainClass { Static void main() { Int a = 5 Console.WriteLine(-a); Console.WriteLine(a-1); Console.WriteLine(a-.5); } } Output: -5 (1) -6 (2) -5,5 (3) Hãy cho nh ng tr ng h p sau ây tr ng h p nào úng - Dòng (1), (2), (3) u úng - Dòng (2), (3) là sai. - Dòng (2), (3) là úng. - Dòng (1) úng, dòng (2) và (3) sai. Câu 1: Khi nào ta s d ng toán t chuy n i? Th nào là chuy n i t chuy n i ng m nh. N u không s d ng toán t chuy n i trong tr nêu thì làm i u gì s x y ra? Câu 2: Trong C++ thì hàm ch ng toán t gi ng nh m t hàm b n. V y i u này có úng không? N u úng thì hãy a ra m t ví d c th . Ng gi i thích t i sao Câu 3: Vi c ch ng toán t trong ngôn ng C# có u gì khác so v i ch các ngôn ng khác hay không?N u có, thì s khác bi t ó có u i m gì? Trang 79
ng minh và ng h p v a trong C# thì c l i thì hãy ng toán t
Bài t p L p Trình H
ng
Bài t p Bài t p 1: Cho o n ch ph ng th c ToString
i
ng C#
ng trình sau hãy
a ra k t qu c a ch
ng trình
using System; namespace phuongthuctostring { using System; namespace Wrox.ProCSharp.OOCSharp { class MainEntryPoint { static void Main(string[] args) { Money cash1 = new Money(); cash1.Amount = 40M; Console.WriteLine("cash1.ToString() returns: " + cash1.ToString()); cash1 = new BetterMoney(); cash1.Amount = 40M; Console.WriteLine("cash1.ToString() returns: " + cash1.ToString()); Console.ReadLine(); } } class Money { private decimal amount; public decimal Amount { get { return amount; } set { amount = value; } } } class BetterMoney : Money { public override string ToString() { return "$" + Amount.ToString(); } } } Trang 80
hi u rõ v
Bài t p L p Trình H
ng
i
ng C#
} Bài t p 2: T o ki u d li u Date bi u di n ngày tháng n m. Cài t thu t toán tính m t ngày tr c ho c sau m t ngày xác nh nào ó tính kho ng cách theo ngày gi a hai ngày xác nh, tính th trong tu n c a ngày. S d ng toán t vào ra cho ngày. ng d n: a ra ngày xác nh nào ó có th nh p t bàn phím ho c cung c p giá tr cho nó b ng t khóa new hi n th c th i gian c a m t ngày tr c và sau c a m t ngày xác nh nào ó b ng cách l y ngày xác nh tr i 1 ho c c ng thêm 1 vào ngày hi n t i. làm c u này ta dùng hàm ch ng toán t ng gi m (- -) và (++) m t ngôi. hi n th ngày,tháng, n m d i d ng xâu “ngày / tháng / n m” thì ta ph i dùng ph ng th c ToString(). Bài t p 3: Xây d ng l p bi u di n a th c v i các toán t c ng, tr , nhân, chia và o d u. nh ngh a toán t th c hi n các yêu c u c a bài toán.. ng d n: - Xây d ng m t a th c có d ng f(x) = Ax + By + Cz + D và a th c có d ng f’(x) = A’x + B’y +C’z + D’ = 0. - Cung c p giá tr cho các h ng s cho hai a th c - S d ng ph ng th c ToString t o xâu a th c - S d ng ch ng toán t th c hi n yêu c u c a bài toán. operatorcó m t i o d u a th c. operator+ có hai i c ng hai a th c. operatorcó hai i tr hai a th c. operator* có hai i nhân hai a th c. operator/ có hai i chia hai a th c. Bài t p 4: Xây d ng m t l p bi u di n các vector n chi u v i các toán t c ng, tr , tích có ng hai vector và tích có h ng m t vector v i m t s th c. nh ngh a toán t cho phép truy nh p các thành ph n vector. Bài t p 5: Xây d ng m t l p m r ng c a l p phanso ã xây d ng ph n bài t p m u. Các yêu c u c n b xung thêm: + Nh p phân s t bàn phím + Dùng n p ch ng toán t nhân, chia hai phân s ho c nhân, chia m t phân s v i m t s ho c ng c l i ng d n: nhân, chia hay nhân hai phân s v i nhau ho c nhân chia m t phân s v i m t s ta khai báo ch ng toán t bình th ng t ng t nh i v i c ng ho c tr C th v i toán t (*) : Public static phanso operator *( phanso lhs, phanso rhs ) { Int fistproduct = lhs.tuso1 * rhs.tuso2; Int secondproduct = lhs.mauso1 * rhs.mauso2; Trang 81
Bài t p L p Trình H
ng
i
ng C#
Return new phanso(fistproduct, secondproduct); } Bài t p 6: Xây d ng l p MaTran cho th c hi n các phép toán trên ma tr n, bao g m: - Hàm t o ma MaTran(int sh, int sc) dùng kh i t o m t ma tr n có s hàng là sh và s c t là sc. - Ph ng th c “nhap” nh p ma tr n t bàn phím - Ph ng th c “cong” c ng hai ma tr n - Ph ng th c “hieu” th c hi n phép hi u hai ma tr n - Ph ng th c “doiDau” i d u các ph n t c a ma tr n - Ph ng th c “chuyenVi” chuy n v m t ma tr n - Ph ng th c “tich” nhân hai ma tr n - Ph ng th c “tuongThich” ki m tra xem hay ma tr n có t ng thích v i nhau hay không? ng d n: khai báo m t ma tr n thì khai báo nh sau: Struct MT { int a[sh][sc]; //M ng a ch a các ph n t c a ma tr n. Int n; //C p ma tr n. } th c hi n nh p, c ng hi u, i d u, tích thì xem l i cách gi i c a các bài t p trong bài t p m u . -Mu n i d u các ph n t c a ma tr n ta dùng ch ng toán t (-) nh bài t p 6 (bài t p m u). Bài t p 8: Xây d ng l p SoPhuc m r ng h n bài t p 6(bài t p m u) th c hi n các phép toán v s ph c, bao g m: - Hàm t o SoPhuc(float pt, float pa) kh i t o ph n th c b ng pt và ph n o b ng pa - Hàm t o SoPhuc() kh i t o ph n th c b ng 0 và ph n o b ng 0 - Ph ng th c “chia” th c hi n phép chia hai s ph c - Ph ng th c “nghichDao” tính ngh ch o c a m t s ph c - Ph ng th c “soSanhBang” so sánh xem hai s ph c có bàng nhau hay không? - Ph ng th c “lonHon”, “nhoHon”, … th c hi n phép toán so sánh l n h n, nh h n… - Ph ng th c “nhap” dùng nh p s ph c t bàn phím - Ph ng th c “print” dùng in s ph c ra màn hình. ng d n: + Xem l i bài t p 6(bài t p m u) ta có th xây d ng m t l p s ph c . + Nh p s ph c t bàn phím nh bài t p 9( bài t p m u ) + Chia hai s ph c b ng cách ta chia ph n th c và ph n o riêng nh c ng hai s ph c sau ó c ng l i thì s thu c k t qu . + Nghich o m t s ph c c ng gi ng n ngh ch o m t phân s . + Ta có th so sánh s ph c b ng toán t so sánh (= =) và (!=) nh bài t p 8 trong ph n bài t p m u.
Trang 82
Bài t p L p Trình H
ng
i
ng C#
D. BÀI T P TR C NGHI M, LÝ THUY T Câu 1: Ph ng th c thay th : N u ta không xây d ng ph ng th c thay th cho các toán t c n p ch ng thì ch ng trình có biên d ch hay không. Tr l i: N u ta không xây d ng ph ng th c cho toán t c n p ch ng thì - Ch ng trình s biên d ch n u trong ngôn ng C# và các ngôn ng cho phép ch ng toán t . - Ch ng trình s không biên d ch n u nó s d ng trong ngôn ng l p trình khác không cho phép s d ng ch ng toán t . B i vì: Các ph ng th c có ch c n ng t ng t nh toán t ã ch ng có tác d ng thay th hàm toán t khi s d ng t t c các ngôn ng không nên trong ngôn ng không cho phép s d ng hàm toán t thì v n s d ng c v i các toán t thông qua các ph ng th c. Câu 2: H n ch khi s d ng toán t : Xây d ng m t l p Employee v i các thông tin cán b : H tên, gi i tính, ti n ng, quê quán. V y g i m t ph ng th c gia t ng m c l ng c a nhân viên ta có th s d ng toán t gia t ng (++) trong l p Employee hay không. Tr l i: Ta không th s d ng toán t gia t ng (++) gia t ng m c l ng c a cán b . B i vì bên trong c a l p Employee còn có nhi u thu c tính khác nh h tên, gi i tính…Nên ta không s d ng toán t gia t ng duy nh t m t thu c tính l ng c. Câu 3: Chuy n i ki u Cho các dòng l nh sau: Int a = 3; Uint b = 5; Double c= 9; Long x = a + b; Double y =c + a; Hãy gi i thích khi trình biên d ch g p m t toán h ng. Tr l i: - Xét dòng l nh : x = a + b; Có ngh a là c ng hai s có ki u integer (a và b). Bình th ng k t qu tr ra s là ki u Integer nh ng ch ng trình s ép cho nó tr ra k t qu là ki u long và i u này trong ngôn ng C# cho phép. - Xét dòng l nh : y = c + a; Ta th y trong n p ch ng này có ki u double và ki u Integer, c ng chúng l i và tr ra ki u double. V y chúng ta ph i i a(có giá tr ki u int) sang ki u double sau ó m i c ng v i c(double) Nh v y vi c n p ch ng toán t ây nh m t phiên b n c a toán t nh n hai s double nh hai tham s và trình biên d ch ph i ch c ch n r ng nó có th ép ki u k t qu v m t ki u thích h p n u c n. Câu 4: Cho an ch ng trình sau: Int myInt = 12; Long myLong; mylong = myInt; (1) //Ng m nh myInt = (Int)myLong; (2) // ng minh B n hãy ch n ra m t ph ng án úng nh t trong các ph ng án sau: Trang 83
Bài t p L p Trình H
ng
i
ng C#
a, Cách chuy n i (1) úng. b, Cách cuy n i (2) úng. c, C hai cách u úng. d,C hai cách u úng nh ng ta ph i xây d ng thêm các hàm chuy n i. e, Ch có ph ng án (1) là sai vì nó gây m t thông tin. Tr l i: Ph ng án (d) là úng nh t. Gi i thích : - Gi s khi ta chuy n i m t s nguyên sang m t phân s thì có th chuy n i s nguyên ó có m u là 1. Ví d : a = 12 c chuy n thành 12/1 - Ng c l i khi chuy n i m t phân s sang m t s nguyên thì s làm m t thông tin (vd: 9/4 = 2). Vì v y ta ph i xây d ng m t hàm chuy n i có s d ng t ng ng m nh (implicit) m b o không b m t thông tin. Tr ng h p t ng minh (explicit) không m b o an toàn d li u sau khi chuy n i do ó vi c này s c th c hi n m t cách công khai. Câu 5: Toán t (à) Cho o n ch ng trình sau: Using System { Struct point { Public int x,y; } Class main Class { Unsafe static void main Point pt =new point() Point *pp = &pt; pp à x =123; ppà y=456; Console.WriteLine(“{0} {1}”,pt.x, pt.y); } } Output 12345 (1) 123 456 (2) 123 (3) Hãy ch n m t k t q a úng nh t Tr l i: áp án (2) là úng. Câu 6: Hãy ch ra cách khai báo úng m t hàm ch ng toán t c a l p phân s trong các cách khai báo sau ây: Public static ps operator -(real ps1) (1) Public static ps operator =(real ps1) (2) Public static ps operator = =(ps ps1, ps ps2) (3) Public static ps operator - -(ps ps1,ps ps2) (4) Tr l i: Ta bi t r ng các toán t c nh ngh a ch ng ph i b o toàn s ngôi c a chính toán t ó theo cách hi u thông th ng. Trang 84
Bài t p L p Trình H
ng
i
ng C#
C th : + N u ta ch ng toán t m t ngôi “-(real ps1) “t ng ng v i vi c o d u c a ps1 + N u ta ch ng toán t hai ngôi“-(ps ps1, ps ps2) t ng ng v i vi c ta th c hiên chông toán t tr i v i ps1 và ps. Nh ng không th nh ngh a toán t gán nh (+=, = =,- =,=…) b ng cách ch ng toán t m t ngôi. u ó ch ng t cách khai báo (2) là sai. V y trong các dòng khai báo bài t p này có dòng (1), (2), (3) là úng
Trang 85
Bài t p L p Trình H
ng
i
CH
ng C#
NG III: K TH A
M c tiêu: Sau khi tìm hi u ch ng này ng i c có th n m c các n i dung sau: Cài t c s th a k S d ng các thành ph n c a l p c s nh ngh a l i các hàm thành ph n Truy n thông tin gi a các hàm thi t l p c a l p d n xu t và c s S t ng thích gi a các i t ng c a l p d n xu t và l p c s L p cô l p, l p báo
A. TÓM T T LÝ THUY T 1. K th a Khái ni m: là ti p thu ti p nh n nh ng cái ã
c xây d ng.
N u l p B là l p c k th a t l p A thì toàn b các thành ph n c a l p A c ng có m t trong l p B mà không c n ph i khai báo trong l p B. L p A c g i là l p c s hay l p cha, còn l p B c g i là l p d n xu t hay l p con. K th a có hai lo i: n k th a và a k th a. ch ng này chúng ta ch nghiên c u v n k th a còn a k th a s c th hi n rõ h n ch ng giao di n. Cách khai báo l p d n xu t k th a m t l p c s : Tên l p d n xu t : Tên l p c s . Ví d : L p A k th a l p B thì khai báo nh sau : Class A :B - n k th a là m t l p d n xu t ch c k th a t m t l p c s Ví d khai báo n k th a Class Class1 { Public Class1() { Code of contructor } } Class Class2:Class1 // Khai báo l p Class2 k th a l p Class1 { Public Class2() { Code of contructor } } - a k th a là m i Class c phép k th a nhi u l p c s . Ví d khai báo a k th a Class Class1 { Public Class1() { Code of contructor } Trang 86
Bài t p L p Trình H
ng
i
ng C#
} Interface IClass1 { // member of IClass1 } Class Class2:Class1, IClass1 { Public Class2() { Code of constructor } } 2. T khoá Base S d ng
truy nh p các thành viên c a l p c s t l p d n xu t.
3. T khoá New Khi khai báo ph ng th c trong l p k th a mà có tên trùng v i tên c a ph ng th c(không có t khoá abstract hay virtual) trong l p c s thì ph i s d ng t khoá new che gi u ph ng th c. Ví d : Class diem { Public void nhap() } Class tamgiac:diem { Public new void nhap() } 4. Nghiêm c m k th a M tl p c cho là nghiêm c m các l p khác k th a khi nó c khai báo v i t khoá là sealed ngay tr c t khoá Class. Do v y b t kì l p nào khai báo k th a l p ó u phát sinh l i khi biên d ch. Ví d : Khai báo l p nghiêm c m k th a Sealed Class sinhvien 5. Cách truy xu t Protected B n c n m t l p d n xu t thâm nh p vào các thành ph n c a l p c s . M c dù b n không mu n khai báo các thành ph n c a l p c s ó là chung (Public). Cách t t nh t là dùng cách truy xu t có b o v Protected trong nh ngh a c a l p c s . Chúng u c x lí chung nh bên trong ph m vi l p d n xu t nh ng nó v n c coi là riêng m i n i khác. Cách truy nh p Protected ch m r ng cho l p con. 6. L p tr u t
ng:
Là l p có ít nh t m t ph ng th c tr u t ng. Khi xây d ng l p tr u t ng thì m i thành viên c nh ngh a trong l p tr u t ng u s d ng t khoá abstract. Ph ng th c tr u t ng không có s th c thi. Ph ng th c này ch n gi n t o ra m t tên ph ng th c và kí hi u ph ng th c. Nó không nh ngh a ph n thân, thay vào ó chúng c cài t trong ph ng th c ghi è c a l p d n xu t. Trang 87
Bài t p L p Trình H
ng
i
ng C#
khai báo l p tr u t ng b n s d ng t khoá abstract tr nh cú pháp sau: abstract Class baseClass { // Code of members } 7. S khác nhau gi a ph thay nó
ng th c a hình v i ph
ng th c tr u t
c t khoá Class
ng
Ph ng th c a hình ph n thân c nh ngh a t ng quát, l p d n xu t có th i ph ng th c ó. Ph ng th c tr u t ng ph n thân không c nh ngh a và c cài t trong ph ng th c c a l p d n xu t.
8. G c c a t t c các l p (L p Object) Trong C #, các l p k th a t o thành cây phân c p và l p cao nh t (hay l p c b n nh t) chính là l p Object. B t c ki u d li u nào thì c ng c d n xu t t l p System.Object. L p Object cung c p m t s các ph ng th c dùng cho l p d n xu t có th th c hi n vi c ph quy t. Sau ây là b ng tóm t t các ph ng th c c a l p Object. Ph ng th c Ch c n ng So sánh b ng nhau gi a hai i t ng Equal( ) Cho phép nh ng i ng cung c p riêng nh ng GetHashCode( ) hàm b m cho s d ng t p h p. Cung c p ki u c a i t ng GetType( ) Cung c p chu i th hi n c a i t ng ToString( ) D n d p các tài nguyên Finalize( ) i t ng. MemberwiseClone( ) T o m t b n sao t Ví d minh ho vi c k th a ph
ng th c ToString() c a l p Object
using System; namespace Object { Public Class Object { private int value; Public Object(int val) // { value=val ; } Public virtual string ToString() { return value.ToString(); } } Class tester { static void Main(string[] args) {
Trang 88
Bài t p L p Trình H
ng
i
ng C#
int i = 5; Console.WriteLine("Gia tri cua i:{0}", i.ToString()); Object A = new Object(7); Console.WriteLine("Gia tri cua A:{0}", A.ToString()); Console.ReadLine(); } } }
K t qu sau khi th c hi n ch
ng trình:
Giá tr c a i: 5 Giá tr c a A: 7 9. Ki u Boxing và Unxing Boxing là ti n trình chuy n i m t ki u giá tr thành ki u Object. Nó là ng m nh khi ta cung c p m t giá tr tham chi u n giá tr này và giá tr c chuy n i ng m nh. Ví d : Minh ho Boxing using System; Class Boxing {
Public static void Main() {
int i = 123; Console.WriteLine("The object value:{0}", i); Console.ReadLine(); } }
Unxing : tr k t qu c a m t i t ng v ki u giá tr , ta th c hi n m t minh nó. Ta thi t l p theo 2 b c sau: 1. Ch c ch n r ng i t ng là th hi n c a m t giá tr ã c box 2. Sao chép giá tr t th hi n này thành giá tr c a bi n. Vd: Minh ho boxing và Unxing using System;
Public Class Unxing {
Public static void Main() {
int i = 123; object o=i; int j = (int)o; Console.WriteLine("j :{0}", j); Console.ReadLine(); } }
Trang 89
ng
Bài t p L p Trình H
ng
i
ng C#
10. L p l ng nhau L p c khai báo trong thân c a m t l p c g i là l p n i hay l p l ng, l p kia là l p ngoài. L p l ng có kh n ng truy c p t i các thành viên c a l p ngoài. M t ph ng th c c a l p l ng có th truy xu t n bi n thành viên private c a l p ngoài. n n a l p n i n trong l p ngoài so v i các l p khác, nó có th là thành viên ki u Private c a l p ngoài.L p l ng c khai báo v i t khoá internal tr c t khoá Class. Ví d Public Class A { Internal Class B }
B. BÀI T P M U 1. Xây d ng l p d n xu t th a k t l p c s Bài t p 1: Xây d ng l p có tên là l ng tính l ng cho cán b v i các thông tin sau: H tên, l ng c b n, h s l ng,v i các ph ng th c :Kh i t o không tham s dùng kh i t o l ng c b n là 450, h s l ng là 2,3.Ph ng th c thi t l p 2 tham s dùng kh i t o l ng c b n,h s l ng. Sau ó k th a l p có tên là l ng c xây d ng trên dùng tính l ng m i cho các cán b v i vi c b sung thêm h s ph c p, l ng c tính l i nh sau: ng=l ng c b n*h s l ng*h s ph c p. a, H ng d n: Bài t p toán này c xây d ng g m có 2 i t ng:Class luong và Class luongmoi. Nhìn vào Bài t p toán trên ta th y c hai l p có nh ng thu c tính và ph ng th c gi ng nhau nh : l ng c b n, h s l ng, các ph ng th c kh i t o, tính ng.Theo nh l p trình c u trúc thì b n ph i i xây d ng t t c các thu c tính và ph ng th c cho c hai l p trên. Ng c l i v i l p trình h ng i t ng thì vi c gi i quy t l i n gi n h n. B n ch c n xây d ng m t l p Class luong, còn l p Class luongmoi s k th a l i các thu c tính và ph ng th c gi ng l p Class luong ch không ph i xây d ng l i. Nó ch xây d ng các thu c tính và ph ng th c riêng c a nó mà l p Class luong không có. Class luong //L p c s { Thu c tính: Private string hoten; Private double hesoluong; Private static int luongcoban; u ý: L ng c b n là thu c tính không thay i.V y ta ph i khai báo v i t khoá Static Ph ng th c: Public void nhap () Public luong() // Ph ng th c thi t l p không tham s Public luong(double lcb, float hsl) // Ph ng th c thi t l p 2 tham s Public double tinhluong() Public void hien() Trang 90
Bài t p L p Trình H
ng
i
ng C#
} Class luongmoi //L p d n xu t { Thu c tính: Private double hesophucap; Ph ng th c: Public new void nhap () Public luongmoi() // Ph ng th c thi t l p không tham s Public luongmoi(int lcb,double hsl, double hspc) // Ph ng th c thi t l p các tham s Public new double tinhluong() Public new void hien() } b, Bài gi i m u: using System; Class luong { private string hoten; private double hesoluong; private static int luongcoban; Public void nhap() { Console.Write("Nhap ho ten:") ; hoten=Console.ReadLine(); Console.Write("He so luong:"); hesoluong=double.Parse(Console.ReadLine()); } Public luong () { luongcoban=450; hesoluong=2.34; } Public luong (double lcb,float hsl) { luongcoban=lcb ; hesoluong =hsl ; } Public void hien() { Console.WriteLine("Ho ten :{0}",hoten); Console.WriteLine("He so luong:{0}",hesoluong ); } Public double tinhluong() { return luongcoban*hesoluong ; } }
Class luongmoi:luong {
Trang 91
Bài t p L p Trình H
ng
i
ng C#
private double hesophucap; Public luongmoi():base() //
i ph ng th c thi t l p không tham s al pc s
{ hesophucap=0.4; }
Public luongmoi(int lcb,float hsl,double hspc):base(lcb,hsl) {
//
i ph ng th c thi t l p 2 tham s al pc s
hesophucap = hspc; }
Public new void nhap() { base.nhap(); Console.Write("He so phu cap:"); hesophucap =double.Parse(Console.ReadLine()); }
Public new void hien() { base.hien(); Console.WriteLine("He so phu cap= {0}", hesophucap); }
Public new double tinhluong() {
return base.tinhluong()*hesophucap ; } }
Class tester {
static void Main() { luongmoi A = new luongmoi(); A.nhap(); A.hien(); Console.WriteLine("Luong moi:{0}", A.tinhluong()); Console.ReadLine(); } }
K t qu sau khi th c hi n ch H H H L
ng trình:
tên : Nguy n V n A s l ng : 3.6 s ph c p : 4.3 ng m i : 6 966
K t lu n: M c ích xây d ng Bài t p toán trên là giúp b n bi t cách xây d ng l p d n xu t k th a t m t l p s , cách g i hàm thi t l p, ph ng th c c a l p c s thông qua t khoá Base. Và tr l i m t s câu h i sau: Khi nào thì xây d ng m t l p k th a t l p khác ? Và m c ích c a vi c k th a ? Trang 92
Bài t p L p Trình H
ng
i
ng C#
-M tl p c k th a t l p khác khi m t l p ó có các thu c tính và ph ng th c gi ng v i m t l p nào ó ã c xây d ng. - M c ích c a vi c k th a giúp chúng ta không ph i i xây d ng nh ng gì ã có.Do v y b n ã ti t ki m th i gian vi t mã c t và s d ng tài nguyên có hi u qu . nn a u ó còn giúp cho ch ng trình sáng s a, và tránh c các l i khi l p trình. Bài t p 2 Xây d ng ph ng trình b c hai sau ó k th a gi i ph ng trình trùng ph ng a, H ng d n: Ta th y ph ng trình trùng ph ng là tr ng h p c bi t c a ph ng trình b c hai. Bài t p toán gi i ph ng trình b c hai là m t Bài t p toán ph bi n và u c l p trình r t nhi u trong các ngôn ng . V y trên c s c a ph ng trình b c hai chúng ta có th k th a l i l p trình gi i ph ng trình trùng ph ng. Bài t p toán c chia làm hai i t ng Ptbachai và pttp Các ph ng th c và thu c tính c a ph ng trình b c hai Class ptbachai { Protected double a,b,c; Public void nhap() Public double delta() Public void giai(out double x1,out double x2,out bool kt) Public void hien() } Class pttp:ptbachai { Public new void hien() } b, Bài gi i m u: using System; Class ptb2 {
Protected double a,b,c; Public void nhap() { Console.Write (" Nhap vao he so a =" ); a =double.Parse(Console.ReadLine()); Console.Write(" Nhap vao he so b =" ); b = double.Parse(Console.ReadLine()); Console.Write(" Nhap vao he so c =" ); c = double.Parse(Console.ReadLine()); }
Public double delta() {
return (b*b-4*a*c); }
Public void giai(out double x1,out double x2,out bool kt) { kt = true;
Trang 93
Bài t p L p Trình H
ng
i
ng C#
if (delta() < 0) { kt = false; x1 = x2 = 0; } else { if (delta() == 0) x1 = x2 = -b / (2 * a); else { x1 = (-b + Math.Sqrt(delta())) / (2 * a); x2 = (-b - Math.Sqrt(delta())) / (2 * a); } } } Public void hien() { double x1, x2; bool kt; giai(out x1,out x2,out kt); if (kt == false) Console.WriteLine("Phuong trinh vo nghiem"); else if (x1 == x2) Console.WriteLine("Phuong trinh co nghiem kepx1=x2={0}", x1); else { Console.WriteLine("Phuong trinh co 2 nghiem phan biet"); Console.WriteLine("x1={0}", x1); Console.WriteLine("x2={0}", x2); } } } Class pttp:ptb2 { Public new void hien() { double x1, x2; bool kt; base.giai(out x1,out x2,out kt); if (kt==false ) Console.Write("Phuong trinh vo nghiem"); else { if ((x1 == x2 & x1 < 0)) Console.Write("Phuong trinh vo nghiem"); if((x1 == x2 & x1==0)|| (x1 == 0 & x2 < 0)) Console.Write("Phuong trinh co 1 nghiem y1={0}",x1); if ((x1 == x2 & x1 > 0)) { Console.WriteLine("Phuong trinh co 2 nghiem y1,y2"); Console.WriteLine("y1={0}", Math.Sqrt(x1)); Console.WriteLine("y2={0}", -Math.Sqrt(x1)); } if (x1 == 0 & x2 > 0)
Trang 94
Bài t p L p Trình H
ng
i
ng C#
{ Console.WriteLine("Phuong trinh co 3 nghiem "); Console.WriteLine("y1={0}", x1); Console.WriteLine("y2={0}", -Math.Sqrt(x2)); Console.WriteLine("y3={0}", Math.Sqrt(x2)); } if (x1 < 0 & x2 == 0) Console.WriteLine("Phuong trinh co 1 nghiem y1= {0}",x2); if (x1 > 0 & x2 == 0) { Console.WriteLine("Phuong trinh co 3 nghiem"); Console.WriteLine("y1={0}", x2); Console.WriteLine("y2={0}", -Math.Sqrt(x1)); Console.WriteLine("y3={0}", Math.Sqrt(x1)); } if (x1 < 0 & x2 > 0) Console.WriteLine("Phuong trinh co 2 nghiem"); if (x1 > 0 & x2 < 0) { Console.WriteLine("Phuong trinh co 2 nghiem"); Console.WriteLine("y1={0}", -Math.Sqrt(x1)); Console.WriteLine("y2={0}", Math.Sqrt(x1)); } if (x1 > 0 & x2 > 0 & x1!= x2 ) { Console.WriteLine("Phuong trinh co 4 nghiem phan biet"); Console.WriteLine("y1={0}", -Math.Sqrt(x1)); Console.WriteLine("y2={0}", Math.Sqrt(x1)); Console.WriteLine("y3={0}", -Math.Sqrt(x2)); Console.WriteLine("y4={0}", Math.Sqrt(x2)); } } } } Class tester { static void Main() { pttp D = new pttp(); D.nhap(); D.hien(); Console.ReadLine(); } }
K t qu sau khi ch y ch
ng trình:
Nh p vào h s a =3 Nh p vào h s b =2 Nh p vào h s c =1 Trang 95
Bài t p L p Trình H Ph
ng
i
ng C#
ng trình vô nghi m
2. M c
truy c p Protected
Bài t p 1: Xây d ng l p hình vuông, tính di n tích cho l p ó. Dùng k thu t th a k tính th tích cho m t hình l p ph ng. a, H ng d n: Bài t p toán g m có 2 i t ng: Hình vuông và hình l p ph ng. Ta th y hình l p ph ng là tr ng h p c bi t c a hình vuông, do v y nó không nh ng k th a các ph ng th c và g i hàm thi t l p c a l p c s mà nó còn th a k c thu c tính c a l p c s . Thông th ng thu c tính c khai báo là Private, t c là thu c tính riêng t c a l p và không cho phép các l p khác truy c p. Nh v y l p hình l p ph ng mu n k th a c thu c tính c a l p hình vuông thì ta ph i khai báo thu c tính trong l p hình vuông là thu c tính Protected. Các thu c tính và ph ng th c c a hình vuông Class hinhvuong // L p c s { Protected float a; Public hinhvuong() Public hinhvuong(float x) Public void nhap() Public void hien() Public float dientich() } Các thu c tính và ph ng th c c a hình l p ph ng. Class hinhlp // L p d n xu t { Public hinhlp() Public hinhlp(float x) Public void hien() Public float thetich() } b, Bài t p gi i m u: using System; Class hinhvuong {
Protected float a; Public hinhvuong() { a = 2; }
Public hinhvuong(float x) { a = x; }
Public void nhap() { Console.Write("Nhap canh cua hinh vuong:"); a=float.Parse(Console.ReadLine());
Trang 96
Bài t p L p Trình H
ng
i
ng C#
}
Public float dientich() {
return a*a; }
Public void hien() { Console.WriteLine("Thong tin can hien thi"); Console.WriteLine("Canh hinh vuong = {0}",a); Console.WriteLine ("Dien tich cua hinh vuong= {0}",dientich()); } }
Class hinhlp :hinhvuong {
Public hinhlp(): base() {}
Public hinhlp(float x): base(x) {}
Public float thetich() {
return base.dientich() * a; }
Public new void hien() { base.hien(); Console.WriteLine("The tich cua hinhlp={0}", thetich()); } }
Class tester {
static void Main() { hinhlp B = new hinhlp (); B.nhap(); B.hien(); Console.ReadKey(); } }
K t qu sau khi ch y ch
ng trình:
Nh p c nh c a hình vuông: 5 Thông tin hi n th C nh hình vuông = 5 Di n tích hình vuông = 25 Th tích hình l p ph ng = 125
u ý: Nhi u khi b n c không chú ý n ki u d n xu t Protected. M c dù l p hình l p ph ng có thu c tính gi ng v i l p hình vuông nh ng các b n l i cho r ng nó Trang 97
Bài t p L p Trình H
ng
i
ng C#
là thu c tính Private không truy xu t l p ph ng i u này là không c n thi t.
c. Do ó l i xây d ng thu c tính cho l p hình
Bài t p 2: Xây d ng l p Stack v i các thu c tính và ph ng th c c n thi t. Sau ó k th a chuy n m t s nguyên d ng b t kì sang h m c s 2,8 a, H ng d n: Bài t p toán g m có 2 i t ng: Stack và i s Bài t p toán này c xây d ng nh m c ng c thêm cho b n c v cách xây d ng l p k th a, và thu n ti n khi s d ng tính k th a. Ta s d ng c ch pop và push c a Stack chuy n i. M i khi ta l y s c n chuy n chia l n l t cho h c n i thì ta l n t push s d c a t ng phép chia vào Stack. Sau khi th c hi n chia xong thì ta pop các s d trong Stack ra. Vi c push và pop th c hi n theo c ch vào tr c ra sau.Nh v y ta s c k t qu c a vi c chuy n i. Các thu c tính và ph ng th c c a l p Stack Class Stack //L p c s { Private int top; int [] s; Public stack() Public Stack(int n) Public bool full() // Ki m tra Stack y Public bool empty() // Ki m tra Stack tr ng Public void push(int x) Public void pop() } Class Doiso:Stack //L p d n xu t { Private int a,n; //a là h c n i, n là s c n i Public void nhap() Public void doi() Public void hien() } b, Bài t p gi i m u: using System; namespace stack { Class Stack { private int top; private int []s; Public bool empty() { return (top == -1); } Public bool full() { return (top >= s.Length); } Public Stack ()
Trang 98
Bài t p L p Trình H
ng
i
ng C#
{ s = new int[20]; top=-1; }
Public void push(int x) { if(!full()) { top=top+1; s[top]=x; } else Console.Write("Stack tran"); }
Public int pop() { if(empty()) { Console.Write("Stack can"); return 0; } else return s[top--]; } }
Class doiso : Stack {
private int a, n; Public void nhap() { Console.Write("Nhap vao so can doi:"); n = Convert.ToInt32 (Console.ReadLine()); Console.Write("Nhap vao he can doi:"); a = Convert.ToInt32(Console.ReadLine()); }
Public void doi() {
int du; while (n != 0) { du = n % a; push(d ); n = n / a; } }
Public void hien() { while (!empty()) { Console.Write("{0}", pop()); }
Trang 99
Bài t p L p Trình H
ng
i
ng C#
} }
Class tester {
static void Main() { doiso d = new doiso(); d.nhap(); d.doi(); d.hien(); Console.ReadKey(); } } }
K t qu sau khi ch y ch
ng trình:
Nh p vào s c n i: 8 Nh p vào h c n i: 2 K t qu chuy n i: 1000
3. Cách truy nh p c a t khóa Internal và Public ch ng l p và i t ng chúng ta th ng truy xu t các thu c tính và ph ng th c v i hai t khóa là Private và Public. T khóa Internal c ng nh c n nh ng nó ít c s d ng, v y t khóa này c dùng làm gì và khi nào thì c n dùng n nó. làm sáng t t khóa này chúng ta i xây d ng ch ng trình cài t d i ây. Trong ngôn ng C#, chúng ta th y có các th vi n s n có nh : using System, using System.text….Các th vi n này c xây d ng s n và chúng ta ch vi c khai báo s d ng.Trên th c t chúng ta có th xây d ng các l p sau ó óng gói nh các th vi n có s n trên. i u này c th hi n rõ trong ph n k th a. Ví d : B n có l p c s A, L p B k th a các ph ng th c c a A, L p C c ng có nhu c u k th a và s d ng các ph ng th c c a A. Nh v y hai ch ng trình khác nhau, cùng là l p A nh ng chúng ta u ph i xây d ng nó c hai ch ng trình. V n t ra ây là b n xây d ng m t l p c s A và có th g i nó ra s d ng b t c ch ng trình nào ó k th a nó mà không ph i xây d ng l i l p c s ó. Cách xây d ng m t l p và óng gói thành th vi n c 1. Vào Microsoft visual studio 2005à vào File ch n New ch n Projectà ch n Class Library nh hình v nh n OK
Trang 100
Bài t p L p Trình H
ng
i
ng C#
c 2. Xây d ng l p c s A, l u ý là l p này không xây d ng hàm main. L p này có tên Class Library1. c 3. Sau khi xây d ng xong b c 2, ta ti n hành óng gói t o th vi n.Cách óng gói th c hi n nh sau:Vào Build ch n Build Class Library1. Nh v y là b n ã t o ra m t t p Class Library1.dll trong debug c a th m c bin c a Class Library1. c 4: ng kí t p Class Library1.dll nh m t t p c a Windown b ng cách: - T o m t ch ng trình m i vào project ch n Add Reference.... xu t hi n h p tho i nh hình sau:
Ch n ng d n n t p ClassLibrary1.dll v a t o sau ó nh n OK. c 5: Khai báo th vi n v a t o trong project ch a l p d n xu t. Ví d : Khai báo th vi n ClassLibrary1 Using system ClassLibrary1 Trang 101
Bài t p L p Trình H
ng
i
ng C#
Sau khi khai báo xong b n ch vi c k th a l i l p c s ó bình th Bài t p 1: Ví d minh h a s d ng v i t khóa Public Xây d ng l p C s A using System;
Public Class ClassA {
internal int x; Public ClassA() { x = 2; }
Public ClassA(int x) { this.x = x; }
Public void nhap() { Console.Write("Nhap vao gia tri cua x="); x = int.Parse(Console.ReadLine()); }
Public void hien() { Console.WriteLine("Thong tin can hien thi"); Console.WriteLine("Gia tri cua x={0}", x); } }
Xây d ng l p B k th a t l p c s A using System; using ClassLibrary1; Class ClassB:ClassA { internal int y; Public ClassB(): base() { y = 5; } Public ClassB(int x, int y): base(x) { this.y= y; } Public new void nhap() { base.nhap(); Console.Write("Nhap gia tri cua y="); y = int.Parse(Console.ReadLine());
Trang 102
ng.
Bài t p L p Trình H
ng
i
ng C#
}
Public new void hien() { base.hien(); Console.WriteLine("Gia tri cua y={0}", y); Console.WriteLine("Tong x + y = {0}", tong()); }
Public int tong() {
return x + y ; } } }
Class tester {
static void Main(string[] args) {
ClassB D = new ClassB(); D.nhap(); D.hien(); Console.ReadLine(); } }
u ý: L p B mu n truy xu t hay k th a các thành viên c a l p A thì L p A ph i xây d ng là l p có t khóa truy c p là Public. Vì ta xây d ng ch ng trình trên nó là hai kh i Asembli khác nhau. B n c ng có th s d ng th vi n l p A cho b t c l p d n xu t nào c n k th a nó. N u ta thay i t khóa Public c a ClassA là Internal thì ch ng trinh s báo l i vì t khóa Internal ch cho phép truy xu t trong kh i Accsembly. Bài t p 2: Ví d v cách truy c p c a t khóa Internal using System; namespace BTle { internal Class ClassA { internal int x; Public ClassA() { x = 3; } Public ClassA(int x) { this.x = x; } } } Class ClassB:ClassA {
Trang 103
Bài t p L p Trình H
ng
i
ng C#
int y; Public ClassC(): base() { y = 6; }
Public ClassC(int x, int y): base(x) { this.y = y; }
Public new void nhap() { base.nhap(); Console.Write("Nhap gia tri cua y="); y = int.Parse(Console.ReadLine()); }
Public new void hien() { base.hien(); Console.WriteLine("Gia tri cua y={0}", y); Console.WriteLine("Tong x + y = {0}", tong()); }
Public int tong() {
return x + y ; } }
Class tester {
static void Main(string[] args) {
ClassBD = new ClassB(); D.nhap(); D.hien(); Console.ReadLine(); } }
K t qu ch
ng trình
Nh p vào giá tr c a x=5 Nh p vào giá tr c a y=4 Thông tin c n hi n th Giá tr c a x=5 Giá tr c a y=4 T ng x+y=9
u ý: Trong l p trình các b n ch c n quan tâm n cách truy nh p và c m c a 3 t khóa truy c p sau: private,Public, Protected. Còn l i các t khóa khác ch c n tham kh o bi t v cách th c truy c p c a nó. Trang 104
Bài t p L p Trình H 4. L p c s và
it
ng
i
ng C#
ng thành ph n
L p c s A th ng c x lí gi ng nh m t thành ph n ki u i t ng c a l p d n xu t B. Nh ng ta có th thay vi c dùng A là l p c s c a B b ng cách khai báo m t thành ph n ki u A trong l p B. Bài t p 1: Xây d ng l p Stack v i các thu c tính và ph ng th c c n thi t. Sau ó dùng l p Stack ó ki m tra m t xâu kí t nh p vào t bàn phím g m các kí t “(” và “)”.K t qu ki m tra: Xâu h p l “((( )))” Xâu không h p l “((( ))”. a, H ng d n: Bài t p toán có 2 i t ng Class stack, Class KTchuoi. Bài t p toán này chúng ta không xây d ng k th a l p Stack nh Bài t p trên mà chúng ta s xây d ng trong l p KTchuoi có m t thành ph n ki u Stack. Vi c xây d ng i t ng ki u thành ph n c a m t l p c ng gi ng nh k th a ta có th truy nh p c các thu c tính và ph ng th c c a l p là i t ng thành ph n ó.Và làm rõ i u này chúng ta tham kh o ch ng trình m u d i. Các ph ng th c và thu c tính c a l p Stack xây d ng t ng t nh Bài t p 3 Các ph ng th c và thu c tính c a l p KTchuoi Class KTchuoi { Stack a=new Stack(); Public bool kiemtra(string s) } b, Bài t p gi i m u: using System; Class stack { int top; int[] p; Public stack(int n) { p=new int[n]; top = -1; } Public stack() { p=new int[20]; top = -1; } Public bool isempty() { if (top == -1) return true; else return false; } Public bool full() { if (top == p.Length)
Trang 105
Bài t p L p Trình H
ng
i
ng C#
return true; else
return false; }
Public void push(int a) { if (full() == true) Console.Write("stack day !"); else p[++top] = a; }
Public int pop() { if (isempty()) return 0; else return p[top--]; }
Public void hien() { while (!isempty()) { Console.Write("{0}",pop()); } } }
Class KTchuoi { stack a = new stack();
Public bool kiemtra(string s) {
int t; for (int i = 0; i < s.Length; i++) { if (s[i] == '(') a.push(Convert.ToInt32(s[i])); if (s[i] == ')') if (a.isempty()) return false; else t=a.pop(); } if (a.isempty()) return true; else return false; } }
Class Tester {
static void Main() { string f; Console.Write("Ban nhap vao mot chuoi :"); f = Console.ReadLine(); KTchuoi a = new KTchuoi();
Trang 106
Bài t p L p Trình H
ng
i
ng C#
if (a.kiemtra(f) == true) Console.Write("Chuoi hop le !"); else Console.Write("Chuoi khong hop le !"); Console.ReadKey(); } }
K t qu sau khi ch y ch
ng trình:
Ban nhap vao mot chuoi: (((()) Chuoi khong hop le !
u ý: Hai cách s d ng k th a và khai báo là i t ng thành ph n c a l p u gi ng nhau là có th k th a các thu c tính và ph ng th c c a l p ã có. Nh ng không ph i Bài t p toán nào c ng có th s d ng c c hai cách trên, mà tu theo yêu c u mà ta có th ch n ph ng pháp phù h p. Bài t p 2: a) Cho l p ‘HocVien’ c khai báo nh sau: Class HocVien{ //l p mô t m t h c viên private String mahv; //mã hi u c a h c viên private String hoTen; //h tên c a h c viên private int namSinh; //n m sinh c a h c viên Hãy xây d ng cho l p HocVien trên các ph ng th c sau: - Ph ng th c t o d ng v i 2 tham s xâu và 1 tham s th c, ph ng th c này l n t l y các giá tr truy n vào c a tham s gán cho các thu c tính mahv, hoTen, namSinh. - Ph ng th c ‘print’ in ra màn hình thông tin c a h c viên theo nh d ng: ‘mahv, hoTen, namSinh’. - Ph ng th c ‘compare’ th c hi n so sánh hai h c viên, k t qu tr v m t trong các giá tr {-1, 0, 1} l n l t t ng ng v i các tr ng h p: h c viên th nh t có tu i nh , b ng, l n h n h c viên th hai. b) Cho l p ‘DanhSach’ c khai báo nh sau: Class DanhSach{ //l p bi u di n cho m t danh sách các h c viên private HocVien ds[]; //m ng l u danh sách h c viên Public DanhSach(int n){ //ph ng th c t o d ng kh i t o m t m ng g m n ph n t ds=new HocVien[n]; Hãy xây d ng cho l p ‘DanhSach’ trên các ph ng th c sau: + Ph ng th c ‘printList’ in danh sách h c viên ra màn hình, m i h c viên trên m t dòng. +P ng th c ‘sortList’ s p x p danh sách h c viên theo th t t ng d n c a m sinh. a.H ng d n gi i Bài t p toán bao g m có 2 i t ng là H c viên và Danh sách. L p Danh sách th c ch t là m t m ng các i t ng h c viên. Nh v y Bài t p toán này chúng ta s d ng k th a thì r t khó gi i quy t, vì v y ta nên xây d ng l p Danh sách có m t i Trang 107
Bài t p L p Trình H
ng
i
ng C#
ng thành ph n là H c viên. Các thu c tính và ph ã th y r t rõ bài. b.Ch ng trình m u
ng th c c a hai l p này các b n
using System; Class Hocvien { private string mshv; private string hoten; private int namsinh; Public Hocvien() { } Public void nhap() { Console.Write("masv:"); mshv = Console.ReadLine(); Console.Write("hoten:"); hoten = Console.ReadLine(); Console.Write("namsinh:"); namsinh = int.Parse(Console.ReadLine()); } Public void print() { Console.WriteLine("\t{0}\t{1}\t{2}",mshv,hoten,namsinh); } Public int compare(Hocvien a,Hocvien b) { int k; if (a.namsinh < b.namsinh) k =-1; else { if (a.namsinh == b.namsinh) k= 0; else k = 1; } return k; } } Class Danhsach { private int n; private Hocvien[] ds; Public Danhsach(int n) { ds = new Hocvien[n]; } Public void nhapds() { Console.Write("nhap so hoc vien:"); n = int.Parse(Console.ReadLine()); ds = new Hocvien[n]; for (int i = 0; i < ds.Length; i++)
Trang 108
Bài t p L p Trình H
ng
i
ng C#
ds[i] = new Hocvien(); for (int i = 0; i < n; i++) { Console.WriteLine(" Hoc vien thu{0}", i + 1); ds[i].nhap(); } }
Public void printlist() { Console.WriteLine("Danh sach cac hoc vien la"); Console.WriteLine("\tstt\tmshv\thoten\t\tnamsinh"); (int i = 0; i < ds.Length; i++) { Console.Write("\t{0}", i + 1); ds[i].print(); } }
Public void sortList() { for (int i = 0; i < ds.Length-1; ++i) { Hocvien min = ds[i]; for (int j = i+1; j < ds.Length; ++j) { if (min.compare(ds[i], ds[j]) == 1) { min = ds[i]; ds[i] = ds[j]; ds[j] = min; } else { min = ds[i]; } } } for (int i = 0; i < n; i++) ds[i].print(); } }
Class tester {
static void Main(string[] args) { Danhsach d = new Danhsach(3); d.nhapds(); d.printlist(); Console.WriteLine("Danh sach sau khi sap sep theo nam sinhla:\n"); d.sortList(); Console.ReadLine();
Trang 109
Bài t p L p Trình H
ng
i
ng C#
} }
K t qu sau khi ch y ch
ng trình:
Danh sách các h c viên STT Mahv H tên 1 sv01 Nguy n H ng Chanh 2 sv02 Nguy n Th Lan 3 sv03 Tr n Th L ng 4 sv04 Ph ng Mai Danh sách sau khi s p x p Nguy n Th Lan 1984 Ph ng Mai 1985 Nguy n H ng Chanh 1987 Tr n Th L ng 1987
N msinh 1987 1984 1987 1985
5. Nghiêm c m k th a Bài t p 1: Xây d ng m t l p h c sinh bao g m các thu c tính: h tên, lí, ph ng th c nh p, hi n. L p h c sinh c khai báo là l p nghiêm c ó xây d ng m t l p sinh viên k th a các thu c tính và ph ng th c c ngoài ra l p sinh viên còn có thêm thu c tính m hoá. Hãy th c hi trên và xem ch ng trình s x y ra u gì?
i m toán, m m k th a. Sau a l p h c sinh, n ch ng trình
a, H ng d n: Ta th y l p h c sinh là l p nghiêm c m k th a v y ta ph i khai báo t khoá Sealed tr c t khoá Class nh sau: Sealed Class hocsinh { Private string hoten; Private float dtoan, dli; Public void nhap() Public void hien() } Class sinhvien:hocsinh { Private float dhoa; Public void nhap() Public void hien() } b, Bài t p gi i m u: using System; sealed Class hocsinh { private string hoten;
Trang 110
Bài t p L p Trình H
ng
i
ng C#
private float dtoan,dli; Public void nhap() { Console.Write("Nhap ho ten hoc sinh: "); hoten=Console.ReadLine(); Console.Write("Diem toan: "); dtoan=float.Parse(Console.ReadLine()); Console.Write("Diem li: "); dli=float.Parse(Console.ReadLine()); }
Public void hien() { Console.WriteLine("Thong tin can hien thi"); Console.WriteLine("Ho ten :{0}",hoten ); Console.WriteLine("Diem toan: {0}",dtoan ); Console.WriteLine("Diem li: {0}",dli ); } }
Class sinhvien:hocsinh {
private float dhoa; Public new void nhap() { base.nhap(); Console.Write("Nhap diem hoa:"); dhoa=float.Parse(Console.ReadLine()); }
Public new void hien() { base.hien(); Console.WriteLine("Diem hoa: {0}",dhoa ); } }
Class tester {
static void Main(string[] args) { sinhvien a = new sinhvien(); a.nhap(); a.hien(); Console.ReadLine(); } }
K t qu sau khi ch y ch ng trình: Ch ng trình a ra dòng thông báo l i: “Cannot derive from sealed type hocsinh” K t lu n: L p sinhvien không th k th a các thu c tính và ph ng th c t l p Sinh viên.B i vì l p h c sinh c b o v c m k th a b ng t khoá Sealed. Trang 111
Bài t p L p Trình H
C. M T S
ng
i
ng C#
CÂU H I LÝ THUY T
Câu 1: Có ph i khi t o m t l p thì ph i k th a t m t l p nào không? Tr l i: Không nh t thi t nh v y, tuy nhiên trong C#, thì t t c các l p ct o i u ph i d n xu t t l p Object. Cho dù chúng có c khai báo ng minh hay không. Do ó Object là l p g c c a t t c các l p
c xây d ng trong C#. M t i u thú v là các
ki u d li u giá tr nh ki u nguyên, th c, ký t c ng
c d n xu t t Object
Câu 2: L p l ng bên trong m t l p là nh th ? Tr l i: L p l ng bên trong m t l p hay còn g i là l p n i
c khai báo v i t
khóa internal, ch a bên trong ph m vi c a m t l p. L p n i có th truy c p thành viên private c a l p mà nó ch a bên trong. Câu 3: Ch ng trình sau ây có l i, hãy s a l i biên d ch và ch y ch nào gây ra l i và nguyên nhân gây l i. Class A {
private int x; Public A() { x=2; }
Public A(int x) { this.x=x; } }
Class B:A {
private int y; Public B():base() { y=3; }
Public B(int x,int y):base(x) { this.y=y; }
Public int tong() {
return x + y; } }
Class teater {
static void Main(string[] args) { B h = new B(2,3);
Trang 112
c các
ng trình.L nh
Bài t p L p Trình H
ng
i
ng C#
Console.WriteLine("Gia tri cua tong:{0}", h.tong()); Console.ReadLine(); } }
Tr l i 5: Ch ng trình trên khi biên d ch có 1 l i “.A.x is inaccessible due to its protection level”. Câu l nh gây ra l i là: return x + y; Nguyên nhân gây ra l i: L p B k th a thu c tính x c a l p A. Mà ta th y thu c tính x c a l p A là private nên nó ch c s d ng trong l p và không cho phép l p khác k th a. Cách s a: L p B mu n k th a thu c tính x c a l p A thì trong l p A ta xây d ng thu c tính x là Protected. K t qu ch ng trình: Giá tr c a t ng=5
D. CÂU H I T
TR L I
Câu 1: Khi khai báo ph ng th c trong l p k th a mà có tên trùng v i tên c a ph ng th c trong l p c s thì: a. Ph i s d ng t khoá new che gi u ph ng th c. b. Không c n thi t ph i s d ng t khoá new c. Thay i b ng cách khai báo tham s s d ng c a ph ng th c. Câu 2: L p cô l p là gì? Có th khai báo Protected cho các thành viên c a nó c không? Câu 3: L p Object cung c p nh ng ph k th a s d ng.
ng th c nào mà các l p khác th
ng xuyên
Câu 4: Th nào là boxing và unboxing? Hãy cho bi t hai ví d v quá trình này? Câu 5: nh ngh a nào sau ây nh ngh a rõ l p tr u t ng h p l Class A { abstract void unfinished() {} } Class B { abstract void unfinished(); } abstract Class C { abstract void unfinished(); } Public Class abstract D { abstract void unfinished(); }
Trang 113
Bài t p L p Trình H
ng
i
ng C#
Câu 6: Ch ng trình sau ây có l i, hãy s a l i biên d ch và ch y ch ng trình.L nh nào gây ra l i và nguyên nhân gây l i. using System; abstract Public Class Dongvat { Protected string name; Public abstract void Who(); Public Dongvat(string name) { this.name=name ; } } Class cho:Dongvat { private string color; Public cho(string name,string color):base(name) { this.color=color ;} { Console.WriteLine ("Toi la con cho {0} mau {1}",name ,color ); } } Class meo:Dongvat { private int trongluong; Public meo(string name,int trongluong):base(name) { this.trongluong=trongluong ; } Public override void Who() { Console.WriteLine ("Toi la con meo{0}nang{1}",name,trongluong); } } Class tester { static void Main(string[] args) { Dongvat[] ds = new Dongvat[3]; ds[0] = new cho("John", "vang"); ds[1] = new meo("Muop", 2); ds[2] = new Dongvat("Noname"); for (int i = 0; i < 3; i++) { ds[i].Who(); } Console.ReadLine(); Trang 114
Bài t p L p Trình H
ng
i
ng C#
} } }
E. BÀI T P T
GI I
Bài t p 1: Xây d ng l p Stack v i các thao tác c n thi t. T Stack i m t s nguyên d ng n sang h m 16. ng d n Bài t p toán g m có 2 i t ng: Stack và i s Các thu c tính và ph ng th c c a l p Stack Class Stack //L p c s { Private int top; int [] s; Public stack() Public Stack(int n) Public bool full() // Ki m tra Stack y Public bool empty() // Ki m tra Stack tr ng Public void push(int x) Public void pop() }
ó hãy d n xu t t l p
Class Doiso //L p d n xu t { Private int a,n; //a là h c n i, n là s c n i Public void nhap() Public void doi() Public void hien() } u ý: Bài t p toán này yêu c u ch cho phép nh p h c n i là 16. Còn l i các giá tr khác không cho phép nh p. V y b n ph i kh ng ch các giá tr c a h s a sao cho tho mãn bài. Bài t p 2 : Xây d ng l p hình tròn v i các ph ng th c c n thi t.Sau ó k th a tính th tích hình c u. ng d n: Bài t p toán g m hai i t ng Class hinhtron, Class hinhcau Class hinhtron { Private float r; Public hinhtron() Public hinhtron(float x) Public void nhap() Public void hien() Public float dientich() } Class hinhcau { Public float thetich() Trang 115
Bài t p L p Trình H
ng
i
ng C#
} u ý: Công th c tính th tích hình c u V=(4*Π*r3)/3 Bài t p 3: Vi t ch ng trình qu n lí nhân s và tính l ng cho nhân viên trong công ty. 1.Qu n lí thông tin nhân viên (H tên, ngày sinh, a ch ) 2. Tính l ng cho nhân viên. Bi t trong công ty có ba lo i nhân viên và cách tính ng nh sau: Nhân viên s n xu t: s s n ph m*20 000 Nhân viên công nh t: s ngày công*50 000 Nhân viên qu n lí : h s l ng * l ng c b n. ng d n: Bài t p toán c chia thành 5 i t ng: Class nhanvien, Class NVSX, Class NVCN, Class NVQL, Class DSNV. Các thu c tính và ph ng th c c a Class Nhanvien + H tên, a ch , ngày sinh + Nhap(), xuat(), tinhluong() Các thu c tinh và ph ng th c c a Class NVSX + K th a thu c tính c a Class nhanvien + sosanpham + Ph ng th c Nhap(), xuat(), tinhluong(). Các thu c tính và ph ng th c c a Class NVCN +K th a thu c tính c a Class nhanvien + songaycong + Ph ng th c Nhap(), xuat(), tinhluong() Các thu c tính và ph ng th c c a Class NVQL +K th a thu c tính c a Class nhanvien + hesoluong, luongcoban + Ph ng th c Nhap(), xuat(), tinhluong() Các thu c tính và ph ng th c c a Class DSNV + soluongnv, Nhan vien*[] ds + Ph ng th c: Nhap ds(), xuat ds(), xuatluong() u ý: Bài t p toán này các l p u có ph ng th c tính l ng, xong m i l p có cách tính l ng là khác nhau. Do v y ta nên xây d ng ph ng th c tính l ng l p c s (Class nhanvien) là ph ng th c o, sau ó các l p d n xu t ta k th a l i b ng cách ghi è ph ng th c ó.. Bài t p 4: Xây d ng l p “MaTranVuong” b ng cách k th a t l p “MaTran” c xây d ng và b xung thêm các ph ng th c sau: - “getDeterminant” tr v nh th c c a ma tr n. - “duongCheoChinh” tính t ng các ph n t trên ng chéo chính - “duongCheoPhu” tính t ng các ph n t trên ng chéo ph - “duongCheoChinhK” tính t ng các ph n t trên ng chéo chính th k - “duongCheoPhuK” tính t ng các ph n t trên ng chéo ph th k Bài t p 5: Xây d ng các l p sau: + L p NG I g m: - Các thu c tính char hoten; int ns; - Các ph ng th c Trang 116
Bài t p L p Trình H
ng
i
ng C#
Hai hàm kh i t o,Ph ng th c in() + L p MÔNH C g m: - Các thu c tính: Char mon; // Tên môn h c. int st; // s ti t - Các ph ng th c Hai hàm kh i t o,Ph ng th c in() +L p GIÁOVIÊN - Các thu c tính K th a t l p ng i Thêm m t s thu c tính Char bomon ; // B môn công tác MÔNH C mh; // Môn h c ang d y - Các ph ng th c Hai hàm kh i t o ,ph ng th c int() a ra thông tin v giáo viên (h tên, n m sinh, b môn, môn d y,s ti t c a môn h c ang d y ó). G i ý: Trong l p GIÁOVIÊN có th g i 2 ph ng th c in() + GIÁOVIÊN.in() // c xây d ng trong l p GIÁOVIÊN + NG I.in() // Th a k t l p ng i. Bài t p 6: Vi t ng d ng n gi n ph c v cho h c sinh ph thông ki m tra ki n th c v hình h c (trong không gian R2), sau ây là yêu c u v ng d ng: - Cho phép tính kho ng cách gi a hai m - Cho phép tính dài c a m t n th ng - Cho phép ki m tra s giao nhau c a hai n th ng - Cho phép ki m tra v trí t ng i c a hai ng tròn - Cho phép ki m tra m t m n m trên, trong hay bên ngoài ng tròn. - Cho phép tính di n tích, chu vi c a hình tròn. - Cho phép tính di n tích, chu vi c a tam giác. - Cho phép ki m tra m t m n m trên, trong hay ngoài tam giác. - Tính di n tích, chu vi, ki m tra s giao nhau c a hình ch nh t. Tính di n tích, chu vi, ki m tra s giao nhau c a hình vuông. Bài t p 7: Vi t ch ng trình tính giá i n c a m t c n h : Ph ng th c thi t l p 2 tham s dung kh i t o giá n(=750 vnd) và s n ã dùng. Ph ng th c nh p cho t ng l p Ph ng th c hi n cho t ng l p Sau ó k th a l p c s tính ti n n m i cho h p v i vi c n u s n dùng quá 100 s n thì giá i n k t s 100 tr i là 1000 vnd. Còn n u s n s d ng l n h n 50 và nh h n 100 thì giá i n là 800, S di n s d ng nh h n 50 thì giá i n là 750.
Trang 117
Bài t p L p Trình H
ng
i
ng C#
CH
NG III: A HÌNH THÁI
M c tiêu: Sau khi tìm hi u ch ng này ng i c có th n m c các n i dung sau: Cài t c l p tr u t ng S d ng các thành ph n c a l p c s tr u t ng nh ngh a l i các hàm thành ph n o Truy n thông tin gi a các hàm thi t l p c a l p d n xu t và c s Phân bi t các t khóa new, virtual, override… L p tr u t ng, l p cô l p, l p báo
A. TÓM T T LÝ THUY T 1. Tính a hình Bao g m nh ng
c
m sau
+ Nó c hi u nh là kh n ng s d ng nhi u hình th c c a m t th c th mà không c n quan tâm n t ng chi ti t c th . + Ph ng th c là a hình có t khoá Virtual tr c và ph ng th c này ph i c ghi è l p d n xu t. + Cho phép cài t ph ng th c c a l p d n xu t trong khi thi hành Ví d :Khai báo ph ng th c a hình Public virtual float dientich() 2. Ghi è Ghi è ph ng th c khi có nhu c u cho phép ng i l p trình thay i hay m r ng các thành viên (ph ng th c) cùng tên c a l p c s trong l p d n xu t thì b n s d ng t khoá override. Ví d : Class hinh { Public virtual float dientich() } Class hinhcn:hinh { Public override float dientich() // ph ng th c ghi è } 3. L p tr u t
ng
Là l p có ít nh t m t ph ng th c tr u t ng. Khi xây d ng l p tr u t ng thì m i thành viên c nh ngh a trong l p tr u t ng u s d ng t khoá abstract. Ph ng th c tr u t ng không có s th c thi. Ph ng th c này ch n gi n t o ra m t tên ph ng th c và kí hi u ph ng th c. Nó không nh ngh a ph n thân, thay vào ó chúng c cài t trong ph ng th c ghi è c a l p d n xu t. khai báo l p tr u t ng b n s d ng t khoá abstract tr c t khoá Class nh cú pháp sau: abstract Class baseClass { // Code of members } Trang 118
Bài t p L p Trình H
ng
4. S khác nhau gi a ph thay nó
i
ng C#
ng th c a hình v i ph
ng th c tr u t
ng:
Ph ng th c a hình ph n thân c nh ngh a t ng quát, l p d n xu t có th i ph ng th c ó. Ph ng th c tr u t ng ph n thân không c nh ngh a và c cài t trong ph ng th c c a l p d n xu t.
5. L p l ng nhau L p c khai báo trong thân c a m t l p c g i là l p n i hay l p l ng, l p kia là l p ngoài. L p l ng có kh n ng truy c p t i các thành viên c a l p ngoài. M t ph ng th c c a l p l ng có th truy xu t n bi n thành viên private c a l p ngoài. n n a l p n i n trong l p ngoài so v i các l p khác, nó có th là thành viên ki u Private c a l p ngoài.L p l ng c khai báo v i t khoá internal tr c t khoá Class. Ví d Public Class A { Internal Class B }
B. BÀI T P M U Bài t p 1: Xây d ng m t l p hình, k th a l p hình ó tính di n tích cho các hình: Hình tròn, hình ch nh t.. a, H ng d n: Bài t p toán này g m có 3 i t ng: Class Hinh, Class hinhtron, Class hinhcn. Ta th y: hình ch nh t, hình tròn… u có chung m t ph ng th c là tính di n tích. Nh ng cách tính di n tích c a m i hình l i không gi ng nhau, m i m t hình nó cách tính riêng. M t ph ng th c mà có nhi u th hi n khác nhau c coi là ph ng th c a hình. Nh v y ph ng th c tính di n tích c coi là ph ng th c a hình. Ta xây d ng m t l p c s Class Hình có ph ng th c tính di n tích, t c l p Class Hình ch xây d ng làm th nào tính di n tích. Cách th c tính nh th nào thì tu thu c vào hai l p d n xu t Class hinhtron và Class hinhcn có th k th a l i b ng cách ghi è. Các ph ng th c và thu c tính c a l p Class hinh Class hinh { //Ph ng th c tính di n tích c khai báo là ph ng th c a hình Public virtual float getArea() } Các thu c tính và ph ng th c c a Class hinhtron Class hinhtron { Private float r; Public hinhtron(float r) Public override float getArea() //Ph ng th c ghi è } Các thu c tính và ph ng th c c a l p Class hinhcn Class hinhcn { Private float cd,cr; Trang 119
Bài t p L p Trình H
ng
i
ng C#
Public hinhcn(float cd,float cr) Public override float getArea() //ph
ng th c ghi è
} b, Bài t p gi i m u: using System; Class hinh { Public virtual double getArea() { return getArea(); } } Class hinhtron:hinh { private float r; Public hinhtron(float r) { this.r=r; } Public override double getArea() { return r*r*3.14; } } Class hinhcn:hinh { private float cd,cr; Public hinhcn(float cd,float cr) { this.cd =cd; this.cr =cr; } Public override double getArea() { return cd*cr; } } Class tester { static void Main(string[] args) { hinh H = new hinh(); hinhcn hcn = new hinhcn(2,3); hinhtron ht = new hinhtron(3); H = ht; Console.WriteLine("Dien tich hinh tron= {0}", H.getArea()); H = hcn; Console.WriteLine ("Dien tich hinh chu nhat= {0}", H.getArea()); Console.ReadLine(); }
Trang 120
Bài t p L p Trình H
ng
i
ng C#
}
K t qu sau khi ch y ch
ng trình:
Di n tích hình tròn = 28.26 Di n tích hình ch nh t= 6
K t lu n: Khi k th a m t ph ng th c a hình ta ph i ghi è b ng t khoá override. Bài t p toán trên ng i l p trình s d ng ph ng th c thi t l p l y d li u u vào. B n c có th nâng c p ch ng trình v i các ph ng th c nh p, hi n có th tính toán v i b t kì m i d li u nh p. Bài t p 2: M t cái chu ng g m 10 cái l ng dùng nh t mèo ho c chó (m i l ng ch nh t nhi u nh t m t con).Vi t ch ng trình qu n lí vi c nh t mèo ho c chó trong các l ng. a, H ng d n: Ta xây d ng các l p mèo và chó d n xu t t l p ng v t. Do v y, khi c n qu n lí thêm vi c nh t con gà ch ng h n ch c n b sung vào ch ng trình l p con gà mà ch ng trình v n ho t ng bình th ng mà không c n ph i s a i. V i Bài t p toán này chúng ta s xây d ng l p ng v t có tính a hình sau ó k th a xây d ng l p chó, mèo. N u Bài t p toán này không xây d ng a hình thì ph i gi i quy t nh th nào? Ta th y l p chó, mèo u thu c l p ng v t nh ng chúng không có c m gì gi ng nhau có th k th a cho nhau.Vì v y chúng ta c n xây d ng m t l p chung cho hai loài này là l p ng v t. Bài t p toán g m có 3 i t ng: Class Dongvat, Class cho, Class meo Class Dongvat { Private int vt; Private string ten; Public virtual void nhap(int v) Public virtual void hien() } Class cho:Dongvat { Public override void nhap(int v) Public override void hien() } Class meo:Dongvat { Public override void nhap(int v) Public override void hien() } b, Bài t p gi i m u: using System; namespace chomeo { Class Dongvat {
Trang 121
Bài t p L p Trình H
ng
i
ng C#
private int vt; private string ten; Public virtual void nhap(int v) { vt=v; Console.WriteLine ("Vi tri cua chuong: {0}",vt); Console.Write ("Nhap vao ten dong vat:"); ten=Console.ReadLine(); }
Public virtual void hien() { Console.WriteLine("Vi tri cua chuong:{0}",vt); Console.WriteLine("Ten dong vat:{0}",ten ); } }
Class cho:Dongvat {
Public override void nhap(int v) { Console.WriteLine("\nNhap thong tin cho con cho"); base.nhap(v); }
Public override void hien() { Console.WriteLine("Day la con cho"); base.hien(); } }
Class Meo:Dongvat {
Public override void nhap(int v) { Console.WriteLine("\nNhap thong tin cho con meo"); base.nhap(v); }
Public override void hien() { Console.WriteLine("Day la con meo"); base.hien(); } }
Class tester {
static void Main(string[] args) { Dongvat[] ds = new Dongvat[20]; int i; for (i = 0; i < ds.Length; ++i) ds[i] = null; ConsoleKeyInfo kt;
Trang 122
Bài t p L p Trình H
ng
i
ng C#
i=0; do { Console.Write ("Chuong thu {0} ban nuoi cho(c)hay meo(m): ",i); kt = Console.ReadKey(); switch (char.ToUpper(kt.KeyChar)) { case 'C': ds[i] = new cho(); ds[i].nhap(i); break; case 'M': ds[i] = new Meo(); ds[i].nhap(i); break; } i++; } while ((int)kt.KeyChar != 13 && i < 20); int vt; Console.Write("Nhap vao vi tri chuong can kiem tra"); vt = int.Parse(Console.ReadLine()); if (ds[vt] == null) Console.WriteLine("Chuong nay khong nuoi con gi"); else ds[vt].hien(); Console.ReadKey(); } } }
K t qu sau khi ch y ch
ng trình:
Chu ng th 0 b n nuôi gì chó(c) hay mèo(m):c Nh p thông tin cho chó V trí c a chu ng là: 0 Nh p vào tên ng v t: Nic Chu ng th 1 b n nuôi gì chó(c)hay mèo(m): m Nh p thông tin cho mèo V trí chu ng là: 1 Nh p vào tên ng v t: M p Nh p vào v trí chu ng c n ki m tra: 1 ây là con mèo V trí chu ng là: 1 Tên ng v t: M p
Bài t p 3: Ta th y l p chó mèo ph ng th c mang tính a hình.
c xây d ng Bài t p 2 k th a l p ng v t có các b n c có th phân bi t c gi a ph ng th c a Trang 123
Bài t p L p Trình H
ng
i
ng C#
hình v i ph ng th c tr u t ng, chúng ta xây d ng l i Bài t p toán trên theo ki u l p tr u t ng a, H ng d n: Ta th y khi qu n lí vi c nh t chó mèo, ta có m t m ng các chu ng. Và các chu ng ó c dùng nh t ng v t, và chúng ta không quan tâm xem chu ng nh t con v t gì. Vi c nh t con v t gì là do m i chu ng. Bài t p toán t ra là qu n lí chó mèo, t 2 loài này ta th y chúng u có chung m t ngu n g c là ng v t. ng v t mang tính ch t chung, không th hi n rõ là con v t gì. Vì th ta xây d ng l p ng v t là l p c s tr u t ng c a hai con v t trên. Các thu c tính và ph ng th c c a i t ng chó, mèo xây d ng gi ng Bài t p 2 ph n tính a hình.Nh ng ch khác l p ng v t: Public abstract Class Dongvat { Protected int vt; Protected string ten; Public abstract void nhap(int v); Public abstract void hien(); } b, Bài t p gi i m u: using System; using System.Collections.Generic; using System.Text; namespace truu_tuong { Public abstract Class Dongvat { Protected int vt; Protected string ten; Public abstract void nhap(int v); Public abstract void hien(); } Class cho:Dongvat { Public override void nhap(int v) { vt=v; Console.WriteLine ("\nNhap thong tin cho con cho"); Console.WriteLine ("Vi tri cua chuong:{0}",vt); Console.Write("Nhap ten cua con cho:"); ten=Console.ReadLine(); } Public override void hien() { Console.WriteLine("Day la chuong nuoi cho"); Console.WriteLine("Vi tri cua chuong:{0}",vt); Console.WriteLine("Ten cua con cho :{0}",ten ); }
Trang 124
Bài t p L p Trình H
ng
i
ng C#
}
Class meo:Dongvat {
Public override void nhap(int v) { vt=v; Console.WriteLine ("\nNhap thong tin cho con meo"); Console.WriteLine ("Vi tri cua chuong:{0}",vt); Console.Write("Nhap ten cua con meo:"); ten=Console.ReadLine(); }
Public override void hien() { Console.WriteLine("Day la chuong nuoi meo"); Console.WriteLine("Vi tri cua chuong:{0}",vt); Console.WriteLine("Ten cua con meo :{0}",ten ); } }
Class tester {
static void Main(string[] args) { Dongvat[] ds = new Dongvat[20]; int i; for (i = 0; i < ds.Length; ++i) ds[i] = null; ConsoleKeyInfo kt; i = 0; do { Console.Write("Chuong thu {0} ban nuoi cho(c)hay meo(m): ", i); kt = Console.ReadKey(); switch (char.ToUpper(kt.KeyChar)) { case 'C': ds[i] = new cho(); ds[i].nhap(i); break; case 'M': ds[i] = new meo(); ds[i].nhap(i); break; } i++; } while ((int)kt.KeyChar != 13 && i < 20); int vt; Console.Write("Nhap vao vi tri chuong can kiem tra"); vt = int.Parse(Console.ReadLine()); if (ds[vt] == null) Console.WriteLine("Chuong nay khong nuoi con gi");
Trang 125
Bài t p L p Trình H
ng
i
ng C#
else ds[vt].hien(); Console.ReadKey(); } } }
K t qu sau khi ch y ch ng trình: Gi ng Bài t p trên Bài t p 4: Xây d ng l p hình ch nh t v i các thu c tính và ph ng th c c n thi t. Sau ó xây d ng l p hình h p bên trong l p hình ch nh t và tính th tích cho hình h p ó. a, H ng d n: Khi gi i quy t m t Bài t p toán b n mong mu n m t l p d n xu t có th truy xu t n các thành ph n thu c tính c a l p c s . Thông th ng b n s k th a b ng cách khai báo thu c tính c a l p c s là Protected. Nh ng Bài t p toán này b n không c n ph i làm i u ó mà v n truy nh p c thu c tính Private c a l p c s . Chúng ta s xây d ng m t l p c s , thay vì xây d ng l p d n xu t ta s xây d ng m t l p l ng bên trong c a l p c s trên. Và l p này c ng s tr thành m t i t ng thành ph n c a l p ngoài. Bài t p toán g m có 2 i t ng Class hinhcn, Class hinhhop C u trúc xây d ng l p l ng c a Bài t p toán này nh sau: Class hinhcn { Private int cdai, crong; Public hinhcn() Public hinhcn(int cd, int cr) Public void nhap() Public int dientich() Public void hien() Internal Class hinhhop { Private int cao; Public hinhhop() Public hinhhop(int cd, int cr, int c) Public void nhap(hinhcn f) Public int thetich(hinhcn f) Public void hien(hinhcn f) } } b, Bài t p gi i m u: using System; namespace loplong { Class hinhcn { private int cdai,crong; Public hinhcn() {
Trang 126
Bài t p L p Trình H
ng
i
ng C#
cdai=5; crong=3; }
Public hinhcn(int cd, int cr) { cdai = cd; crong = cr; }
Public void nhap() { Console.Write("nhap chieu dai:"); cdai=int.Parse(Console.ReadLine()); Console.Write("Nhap chieu rong:"); crong=int.Parse(Console.ReadLine()); }
Public int dientich() {
return cdai*crong ; }
Public void hien() { Console.WriteLine("Thong tin can hien thi"); Console.WriteLine("Chieu dai={0}",cdai ); Console.WriteLine("Chieu rong={0}",crong); Console.WriteLine("Dien tich hinh cn ={0}",dientich()); }
internal Class hinhhop {
int cao; Public hinhhop() { cao=4; }
Public hinhhop(int cd,int cr,int c) { cao = c; }
Public int thetich(hinhcn f) {
return f.dientich()*cao; }
Public void nhap(hinhcn f) { f.nhap(); Console.Write("Nhap chieu cao="); cao = int.Parse(Console.ReadLine()); }
Public void hien(hinhcn f) { f.hien(); Console.WriteLine("The tich hinh hop:{0}", thetich(f));
Trang 127
Bài t p L p Trình H
ng
i
ng C#
} } }
Class tester {
static void Main(string[] args) { hinhcn f = new hinhcn(); hinhcn.hinhhop A = new hinhcn.hinhhop(); A.nhap(f); A.hien(f); Console.ReadLine(); } } }
c, K t qu ch y ch
ng trình
Nh p chi u dài: 10 Nh p chi u r ng: 7 Nh p chi u cao: 5 Thông tin hi n th Chi u dài = 10 Chi u r ng =7 Di n tích hình ch nh t = 70 Th tích hình h p =350
K t lu n Vi c xây d ng l p l ng có u i m là có th truy xu t các thành viên private c a l p ngoài.Tuy nhiên n u có nhi u l p c xây d ng l ng nhau thì ch ng trình r t r i, b n c s khó hi u h n.Bài t p toán này ch lên xây d ng khi có ít l p, n u Bài t p toán có nhi u l p thì chúng ta lên xây d ng m t l p c s sau ó k th a xây d ng các l p khác. Khi xây d ng l p l ng bên trong c n chú ý khai báo t khoá Internal tr c t khoá Class.
C. M T S
CÂU H I LÝ THUY T
Câu 1: Có c n thi t ph i ch l p d n xu t hay không?
nh t khóa override trong ph
ng th c ph quy t c a
Tr l i: Có, chúng ta ph i khai báo rõ ràng t khóa override v i ph quy t ph
ng th c ph
ng th c o (c a l p c s ) bên trong l p d n xu t.
Câu 2: L p tr u t ng là th nào? Có th t o i t ng cho l p tr u t ng hay không? Tr l i: L p tr u ng không có s th c thi, các ph ng th c c a nó c t o ra ch là hình th c, t c là ch có khai báo, do v y ph n nh ngh a b t bu c ph i c th c hi n
các l p d n xu t t l p tr u t
ng này. Do ch là l p tr u
Trang 128
ng, không có s
Bài t p L p Trình H
ng
i
ng C#
th c thi nên chúng ta không th t o th hi n hay t o
it
ng cho l p tr u t
ng này.
Câu 3: Có ph i khi t o m t l p thì ph i k th a t m t l p nào không? Tr l i: Không nh t thi t nh v y, tuy nhiên trong C#, thì t t c các l p ct o i u ph i d n xu t t l p Object. Cho dù chúng có c khai báo ng minh hay không. Do ó Object là l p g c c a t t c các l p
c xây d ng trong C#. M t i u thú v là các
ki u d li u giá tr nh ki u nguyên, th c, ký t c ng
D. CÂU H I T
c d n xu t t Object
TR L I
Câu 1: Theo b n ph ng th c a hình và ph ng th c tr u t ng : a. Cùng là m t ph ng th c o. b. Là ph ng th c o có ý ngh a s d ng gi ng nhau nh ng cách xây d ng hai ph ng th c l i khác nhau. c. Hai ph ng th c này th c ch t là m t ph ng th c Câu 2: M t ph ng th c o trong l p c s có nh t thi t ph i c ph quy t trong l p d n xu t hay không? Câu 3: L p tr u
ng có c n thi t ph i xây d ng hay không? Hãy cho m t ví d v
m t l p tr u ng cho m t s l p. Câu 4: Phân bi t m c ích s d ng c a các t khoá sau: new, virtual, override.
E. BÀI T P T
GI I
Bài t p 1: a) Xây d ng l p tr u t ng “Hinh” nh sau: abstract Class Hinh {
abstract Public float getArea(); }
b) Xây d ng l p “HinhVuong”, “HinhTron”, “HinhTamGiac”, “HinhBinhHanh”, “HinhThoi”… b ng cách k t l p Hinh và ghi è ph ng th c getArea tính di n tích c a các hình t ng ng. ng d n Bài t p toán g m có 6 i t ng: Class Hinh, Class HinhVuong, Class HinhTron, Class HinhBinhHanh, Class Hinhthoi Các thu c tính và ph ng th c c a các l p: abstract Public Class Hinh { abstract Public float getArea(); } Class Hinhvuong:Hinh { float canh; Public Hinhvuong() Public Hinhvuong(foat a) Public override float getArea() Public void nhap() Public void hien() Trang 129
Bài t p L p Trình H
ng
i
ng C#
} Class Hinhtron:Hinh { private float r; Public Hinhtron() Public Hinhtron(float r) Public override float getArea () } Class Hinhtamgiac:Hinh { private float cao,day Public Hinhtamgiac() Public Hinhtamgiac(float cao, float day) Public override float getArea() } Class Hinhbinhhanh:Hinh { private float a,b // a,b là 2 ng chéo c a hình bình hành Public Hinhbinhhanh() Public Hinhbinhhanh(float a, float b) Public override float getArea() } Class HinhThoi:Hinh { private float a,b // a,b là 2 ng chéo c a hình thoi Public HinhThoi() Public HinhThoi(float a, float b) Public override float getArea() } u ý: Các công th c tính di n tích c a các hình Tamgiac=1/2(day*cao) Hinhbinhhanh=a*b // a,b là 2 ng chéo Hinhthoi=1/2(a*b)
Trang 130
Bài t p L p Trình H
ng
i
CH
ng C#
NG IV: GIAO DI N
M c ích: Sau khi nghiên c u ch ng này ng i h c n m — Hi u th nào là m t giao di n. — Cách th c xây d ng và truy c p m t giao di n — S th c thi nhi u giao di n c a m t l p — S khác nhau gi a giao di n và l p tr u t ng
c các n i dung sau:
A. TÓM T T LÍ THUY T 1. Khái ni m v giao di n Giao di n là t p các hàm khai báo s n mà không cài t. Các l p th c thi giao di n có nhi m v cài t các hàm này. M c ích c a vi c cài t giao di n: Cho phép m t l p d n xu t có th k th a th c thi nhi u giao di n. u này ã kh c ph c c h n ch c a l p tr u t ng là m t l p d n xu t ch có th th c thi m t l p tr u t ng. 2. Cài
t m t giao di n
Cú pháp nh ngh a m t giao di n nh sau: [thu c tính] [b sung truy c p] interface [: danh sách c s ] { } Ví d : Xây d ng m t giao di n có tên là Hinh và giao di n này có hai ph ng th c c và ghi i t ng. Interface Hinh { Void read(); Void write(); } M r ng giao di n: Chúng ta m r ng m t giao di n ã có b ng cách thêm các ph ng th c, các thành viên hay b sung cách làm vi c cho các thành viên. Th c thi nhi u giao di n: Trong ngôn ng C# cho phép chúng ta th c thi nhi u h n m t giao di n. Ví d : L p Document có th th c thi c hai giao di n Istorable và Icompressible. Ta xây d ng nh sau: Public Class Document:Istorable, Icompressible 3. Truy xu t ph
ng th c c a giao di n
Chúng ta có th truy c p nh ng thành viên c a giao di n nh th các thành viên c a l p. Ví d : L p Hình vuông th c thi giao di n có tên là Hinh ví d trên. Nh v y l p Hình vuông có th truy c p 2 thành viên read() và write() c a giao di n Hinh. Hinhvuong H=new Hinhvuong(); H.read(); H.write(); 4. Toán t is: Trang 131
Bài t p L p Trình H
ng
i
ng C#
Dùng ki m tra m t i t ng xem nó có h tr giao di n hay không. Cú pháp c a toán t is: is 5. Toán t as Toán t as k t h p toán t is và phép gán b ng cách u tiên ki m tra h p l phép gán r i sau ó phép gán c th c hi n. N u không h p l thì toán t as tr v giá tr Null.S d ng toán t as lo i b vi c x lí các ngo i l . Cú pháp c a toán t as: as 6. Th c thi ph quy t giao di n Khi th c thi m t l p chúng ta có th t do ánh d u b t kì hay t t c các ph th c th c thi giao di n nh m t ph ng th c o. Ví d : Ph quy t ph ng th c read() c a giao di n Hinh Public virtual void Read() 7. Th c hi n giao di n m t cách t
ng
ng minh
M t l p có th cài t nhi u giao di n nên có th x y ra tr ng h p ng v tên khi hai giao di n có cùng m t tên hàm. gi i quy t xung t này ta khai báo cài t m t cách t ng minh h n. Khi ó ta ph i thêm tên giao di n vào tr c tên ph ng th c. L a ch n các ph ng th c ph i bày c a giao di n Ng i thi t k có thêm thu n l i khi m t giao di n c thi công trong su t quá trình y s thi công t ng minh không c th hi n phía Client.Gi s nh i ng Document thi công giao di n Istorable nh ng chúng ta không mu n các ph ng th c Read() và Write() c a giao di n Istorable c xem nh là Public trong l p Document. Chúng ta có th s d ng ph n th c hi n t ng minh ch c r ng chúng không s n có trong su t quá trình phân b . Thành viên n:Ngôn ng C# có m t kh n ng m i là, các thành viên c a giao di n có th c n i.
B. BÀI T P M U 1. S d ng giao di n Các b n có th tham kh o ch
ng trình sau
hi u rõ v giao di n và cách s d ng nó.
using System; // khai báo giao di n interface IStorable interface IStorable { void Read(); void Write(object obj); int Status { get; set; } } // th c thi ph ng th c Write Public void Write( object o) Public void Write( object o) { Console.WriteLine("Impleting the Write Method for IStorable");
Trang 132
Bài t p L p Trình H
ng
i
ng C#
} // t o m t l p th c thi giao di n IStorable Public Class Document : IStorable Public Class Document : IStorable { Public Document( string s) { Console.WriteLine("Creating document with: {0}", s); } // th c thi ph ng th c Read() Public void Read() { Console.WriteLine("Implement the Read Method for IStorable"); } // th c thi ph ng th c Write Public void Write( object o) Public void Write( object o) { Console.WriteLine("Impleting the Write Method for IStorable"); } // th c thi thu c tính Public int Status Public int Status {
get {
return status; }
set { status = value; } }
private int status = 0; }
Public Class Tester {
static void Main() { // truy c p ph ng th c trong i t ng Document Document doc = new Document("Test Document"); doc.Status = -1; doc.Read(); Console.WriteLine("Document Status: {0}", doc.Status); // gán cho m t giao di n và s d ng giao di n IStorable isDoc = (IStorable)doc; isDoc.Status = 0; isDoc.Read(); Console.WriteLine("IStorable Status: {0}", isDoc.Status); Console.ReadKey(); } }
Trang 133
Bài t p L p Trình H
ng
K t qu sau khi ch y ch
i
ng C#
ng trình:
Creating document with: Test Document Implement the Read Method for Istorable Document Status : -1 Implement the Read Method for Istorable Istorable Status : -1 2. M r ng m t giao di n và s th c thi nhi u giao di n c a m t l p Bài t p 1: Xây d ng giao di n nhân viên bao g m hai ph ng th c: Nh p và hi n th thông tin c a cán b . Ta có th xây d ng thêm m t giao di n nhân viên m i m r ng t giao di n nhân viên. Giao di n nhân viên m i này xây ph ng th c cách tính l ng cho m i lo i nhân viên. Hãy xây d ng l p nhân viên s n xu t th c thi hai giao di n trên. Bi t cách tính l ng nhân viên nh sau: L ng=Hsl*L ng c b n a, H ng d n: ch ng 3 chúng ta ã bi t n s k th a c a m t l p d n xu t, xong nó ch k th a c t m t l p c s . Nh Bài t p toán này chúng ta không th xây d ng Class Nhanviensx k th a t hai l p là Nhanvien và Nhanvienmoi. M c ích chúng ta mu n l p Class Nhanviensx k th a và th c thi c hai Nhanvien và Nhanvienmoi, do ó chúng ta ph i xây chúng là hai giao di n. Bài t p toán bao g m có hai giao di n và m t l p th c thi giao di n: Interface Nhân viên, Interface Nhân viên m i, Class Nhân viên sx Các ph ng th c và thu c tính interface Nhanvien { void nhap(); void hien(); } interface Nhanvienmoi:Nhanvien // M r ng giao di n Nhân viên { double luong(); } Class Nhanviensx:Nhanvien,Nhanvienmoi // Th c thi hai giao di n { private string ten; private static int lcb; private double hsl; Public Nhanviensx() Public virtual void nhap() Public virtual void hien() Public virtual double luong() } b, Bài t p gi i m u: using System; interface Nhanvien { void nhap();
Trang 134
Bài t p L p Trình H
ng
i
ng C#
void hien(); }
interface Nhanvienmoi:Nhanvien { double luong(); }
Class Nhanviensx:Nhanvien,Nhanvienmoi {
private string ten; private static int lcb; private double hsl; Public Nhanviensx() { hsl = 2.5; lcb=450; }
Public Nhanviensx(int hsl) { this.hsl=hsl ; }
Public virtual void nhap() { Console.Write("Nhap vao ho ten:"); ten=Console.ReadLine(); Console.Write("Nhap vao he so luong:"); hsl=float.Parse(Console.ReadLine()); }
Public virtual void hien() { Console.WriteLine("Thong tin can hien thi"); Console.WriteLine("Ho ten nhan vien:{0}",ten ); Console.WriteLine("He so luong:{0}",hsl ); }
Public virtual double luong() {
return hsl*lcb ; } }
Class tester {
static void Main(string[] args) { Nhanviensx A = new Nhanviensx(); A.nhap(); A.hien(); Console.WriteLine("Luong cua nhan vien nay la:{0}", A.luong()); Console.ReadLine(); } }
K t qu sau khi ch y ch
ng trình: Trang 135
Bài t p L p Trình H
ng
i
ng C#
Nh p vào h tên: Nguy n V n A Nh p vào h s l ng: 5 Thông tin c n hi n th H tên nhân viên: Nguy n V n A H s l ng: 5 ng c a nhân viên này là: 2250
Bài t p 2: a) Xây d ng l p “DaySo” mô t m t dãy s , g m các ph ng th c sau: - Ph ng th c “nhap” dùng nh p dãy s t bàn phím - Ph ng th c “print” dùng in dãy s ra màn hình - Hàm t o DaySo(int n) dùng kh i t o m t m ng g m n ph n t b) Xây d ng giao di n Sort nh sau: interface Sort { Public void Sort(); } c) Xây d ng các l p “QuickSort”, “SelectionSort”, “InsertSort” b ng cách k th a t l p DaySo và tri n khai giao di n Sort th c hi p vi c s p x p: n i b t, ch n tr c ti p, chèn tr c ti p a, H ng d n: Gi s b n mu n thi t k ph ng th c s p x p chung s p x p các ph n t . Ph n t ây có th là m ng các i t ng nh dãy s , ma tr n, l p hoc viên. Các i ng này có th c s p x p b ng các thu t toán khác nhau. V y b n c n xác nh m t ph ng th c s p x p chung nh m th c hi n s p x p các i t ng. Cách th c s p x p các i t ng nh th nào do t ng thu t toán t quy t nh.Ta th y Bài t p toán v a yêu c u k th a v a th c thi giao di n. ây chính là ti n b c a s d ng giao di n so v i l p tr u t ng. Các i t ng c a Bài t p toán b n c có th xác nh th y rõ ngay ph n bài. Các thu c tính và các ph ng th c Class dayso { Public int[] a; Protected int n; Public dayso() Public dayso(int n) Public void nhap() Public void print() } Interface sort { Void sapxep(); } Class quicksort:dayso, sort { Public void sapxep() } Trang 136
Bài t p L p Trình H
ng
i
ng C#
Class selectsort:dayso,sort { Public void sapxep() } Class inserttionsort:dayso,sort { Public void sapxep() } u ý: L p dayso có 2 thu c tính là n và m ng a hai thu c tính này nó c các l p d n xu t k th a và g i ra th c thi. Do v y hai thu c tính này ph i c khai báo là Public. b, Bài t p gi i m u: using System; Class dayso { Public int[] a;
Protected int n; Public dayso() { a = new int[5]; }
Public dayso(int n) { a = new int[n]; }
Public void nhap() { Console.Write("Nhap vao so phan tu cua day so:"); n = int.Parse(Console.ReadLine()); Console.WriteLine("Nhap vao thong tin cua day so:"); for (int i = 0; i < n; i++) { Console.Write("a[{0}]=", i); a[i] = int.Parse(Console.ReadLine());
} }
Public void print() { for (int i = 0; i < n; i++) Console.Write("{0}\t",a[i]); Console.WriteLine(); } }
interface sort {
void sapxep(); }
Trang 137
Bài t p L p Trình H
ng
i
ng C#
Class quicksort:dayso,sort {
Public void sapxep() {
int i, j,x,tmp; x=a[(n)/2]; i = n-1; j = n; do { while (a[i] < x) i++; while (a[j] > x) j--; if (i <= j) { tmp = a[i]; a[i] = a[j]; a[j] = tmp; i++; j--; } } while (i < j); } }
Class selectsort:dayso,sort {
Public void sapxep() {
int min,tmp,j; for (int i = 0; i < n - 1; i++) { min=i; for (j = i + 1; j < n; j++) if (a[j] < a[min]) min = j; tmp = a[min]; a[min] = a[i]; a[i] = tmp; } } }
Class inserttionsort:dayso,sort {
Public void sapxep() {
int i,pos,k; for (i = 0; i < n; i++) { k = a[i]; pos = i-1; while ( pos >=0 && a[pos] > k) { a[pos + 1] = a[pos]; pos--; }
Trang 138
Bài t p L p Trình H
ng
i
ng C#
a[pos + 1] = k; } } }
Class Tester {
static void Main() { //sort a = new quicksort(); //selectsort a = new selectsort(); inserttionsort a = new inserttionsort(); a.nhap(); Console.Clear(); Console.WriteLine("Day truoc khi sap xep :"); a.print(); Console.WriteLine("Day sau khi sap xep :"); a.sapxep(); a.print(); Console.ReadKey(); } }
K t qu sau khi ch y ch
ng trình:
Dãy tr c khi s p x p: 2 5 3 2 Dãy sau khi s p x p: 2 2 3 5
u ý: Ta có th ph quy t t t c các ph ng th c c a giao di n trong l p th c thi c ng có th ch ph quy t m t vài ho c không ph quy t m t ph ng th c nào. 3. Xây d ng l p th c thi giao di n m t cách t
ng minh
Ví d : Xây d ng l p Document, th c thi hai giao di n Italk, Istorable . Giao di n Italk có ph ng th c Read() và Italk. Giao di n Istorable có ph ng th c Read() và Write(). a, H ng d n: Bài t p toán g m có :1 l p Class Document, và 2 giao di n Italk, Istorable. Ta th y l p Document th c thi hai giao di n, và c hai giao di n trên u có ph ng th c Read (). V y làm th nào máy tính c ng nh b n c có th bi t r ng l p Document thi hành ph ng th c Read() là c a giao di n nào. gi i quy t v n này b ng cách th c hi n giao di n m t cách t ng minh. Xây d ng các giao di n và l p Interface Istorable { Void Read(); Void Write(); } Interface Italk { Void Read(); Trang 139
Bài t p L p Trình H
ng
i
ng C#
Void Italk(); } Class Document:Italk, Istorable { Public Document(string s) void Istorable.Read() // Cài t ph ng th c Read() c a Istorable Public void Write() Puclic void Italk() Void Italk.Read() // Cài t ph ng th c Read() c a ITalk } u ý: Chúng ta ph i ép ki u thành giao di n g i Ph ng th c Read() c a Istorable và Italk. Th c thi giao di n m t cách t ng minh cho ph ng th c Read() b ng cách g i c tên c a giao di n. b, Bài t p gi i m u: using System; namespace bt { interface Istorable { void Read(); void Write(); } interface ITalk { void ITalk(); void Read(); } Class Document:Istorable,ITalk { Public Document(string s) { Console.WriteLine("Tao van ban {0}",s); } void Istorable.Read() { Console.WriteLine("Thuc thi Istorable.Read()"); } Public void Write() { Console.WriteLine("Thuc thi Istorable.Write()"); } void ITalk.Read() { Console.WriteLine("Thuc thi ITalk.Read()"); } Public void ITalk() { Console.WriteLine("Thuc thi ITalk.ITalk"); } }
Trang 140
Bài t p L p Trình H
ng
i
ng C#
Class tester {
static void Main(string[] args) { Document thedoc = new Document("Bai tap C#"); Istorable isdoc = thedoc as Istorable; if (isdoc != null) { isdoc.Read(); } ITalk itdoc = thedoc as ITalk; if (itdoc != null) { itdoc.Read(); } thedoc.Write(); thedoc.ITalk(); Console.ReadLine(); } } }
K t qu sau khi ch y ch
ng trình:
T o v n b n Bài t p C# Th c thi Istorable.Read() Th c thi Italk.Read() Th c thi Istorable.Write() Th c thi Italk.ITalk
C. CÂU H I VÀ TR L I Câu 1: So sánh gi a l p và giao di n? Tr l i 1: Giao di n khác v i l p m t s i m sau: giao di n không cung c p b t c s th c thi mã ngu n nào c . i u này s c th c hi n t i các l p th c thi giao di n. M t giao di n a ra ch nói r ng có cung c p m t s s xác nh n ng d n cho nh ng i u gì ó x y ra và không i vào chi ti t. M t i u khác n a là t t c các thành viên c a giao di n c gi s là Public ng m nh. N u chúng ta c thay i thu c tính truy c p c a thành viên trong giao di n thì s nh n c l i. Giao di n ch ch a nh ng ph ng th c, thu c tính, s ki n, ch m c. Và không ch a d li u thành viên, b kh i d ng, và b h y. Chúng c ng không ch a b t c thành viên static nào c . Câu 2: S khác nhau gi a giao di n và l p tr u t ng? Tr l i 2: S khác nhau b n là s k th a. M t l p có th k th a nhi u giao di n cùng m t lúc, nh ng không th k th a nhi u h n m t l p tr u t ng. Câu 3: Các l p th c thi giao di n s ph i làm gì? Tr l i 3: Các l p th c thi giao di n ph i cung c p các ph n th c thi chi ti t cho các ph ng th c, thu c tính, ch m c, s ki n c khai báo trong giao di n. Câu 4: Có bao nhiêu cách g i m t ph ng th c c khai báo trong giao di n? Tr l i 4: Có 4 cách g i ph ng th c c khai báo trong giao di n: Trang 141
Bài t p L p Trình H
ng
i
ng C#
- Thông qua l p c s tham chi u n i t ng c a l p d n xu t - Thông qua m t giao di n t o t l p c s tham chi u n i t ng d n xu t - Thông qua m t i ng d n xu t - Thông qua giao di n t o t i t ng d n xu t Câu 5: Các thành viên c a giao di n có th có nh ng thu c tính truy c p nào? Tr l i 5: M c nh các thành viên c a giao di n là Public. Vì m c tiêu c a giao di n là xây d ng cho các l p khác s d ng. N u chúng ta thay i thu c tính này nh là internal, Protected hay private thì s gây ra l i. Câu 6: Chúng ta có th t o th hi n c a giao di n m t cách tr c ti p c không? Tr l i 6: Không th t o th hi n c a giao di n tr c ti p b ng khai báo new c. Chúng ta ch có th t o th hi n giao di n thông qua m t phép gán v i i t ng th c thi giao di n.
D. CÂU H I VÀ BÀI T P T
LÀM
Câu h i: Câu 1: Toán t is c dùng làm gì trong giao di n? Câu 2: Toán t as có l i n toán t is v m t nào khi c s d ng li n quan n giao di n ? Câu 3: Giao di n là ki u d li u tham chi u hay ki u giá tr ? Câu 4: Khi th c thi giao di n v i c u trúc. Thì truy c p các thành viên c a giao di n thông qua i t ng hay thông qua tham chi u giao di n là t t nh t? Câu 5: S giao di n có th c k th a cho m t l p? Câu 6: Vi c th c thi giao di n ng minh là th c thi nh th nào? Trong tr ng h p nào thì c n th c hi n t ng minh? Bài t p t p: Bài t p 1. Trong giao di n sau sai âu? Public interface House { @Deprecated void open(); void openFrontDoor(); void openBackDoor(); } Bài t p 2. Hoàn thành ch ng trình sau: interface Closable { void close(); } Class File implements Closable { @Override Public void close() { //... close this file... } } Trang 142
Bài t p L p Trình H
ng
i
ng C#
i u gì s x y ra? B n có th gi i thích t i sao? Bài t p 3: Hãy vi t m t giao di n khai báo m t thu c tính ID ch a chu i giá tr . Vi t m t l pEmployee th c thi giao di n ó. Bài t p 4: o n mã ngu n sau ây có l i hãy s l i và hãy cho bi t t i sao có l i này. Sau khi s a l i hãy vi t m t l p Circle th c thi giao di n này? Public interface osi { long with; long height; double area(); int side(); } Bài t p 5: Ch ng trình sau ây có l i hãy s a l i, biên d ch và ch y l i ch ng trình. Hãy gi i thích t i sao c ng trình l i l i. using system; interface Ipoint { int x { get; set; } int y { get; set; } } Class MyPoint { private int myX; private int myY; Public MyPoint(int x,int y) { myX=x; myY=y; } Public int x { get { return myX ;} set { myX=value ;} } Public int y {
get {return myY;} set Trang 143
Bài t p L p Trình H
ng
i
ng C#
{myY=value ;} } }
Class tester {
private static void printpoint(Ipoint p) { Console.WriteLine("x={0},y={1}", p.x, p.y); }
static void Main() { MyPoint p = new MyPoint(2, 3); Console.Write("My point "); printpoint(p); Ipoint p2 = new Ipoint(); printpoint(p2); Console.ReadLine(); } }
Bài t p 6: Trong các cách khai báo sau cách khai báo giao di n nào là úng. Cách khai báo nào sai thì hãy s a l i cho úng. interface A { void print () {}; } interface B { void print(); } abstract interface C { print(); } abstract interface D { abstract void print() {} } Bài t p 7: Xây d ng m t giao di n IDisplay có khai báo thu c tính Name ki u chu i. Hãy vi t hai l p Dog và Cat th c thi giao di n IDisplay, cho bi t thu c tính Name là tên c a i ng.
Trang 144