Oop Exercise

  • June 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Oop Exercise as PDF for free.

More details

  • Words: 48,241
  • Pages: 142
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

Related Documents

Oop Exercise
June 2020 16
Oop
November 2019 35
Introduction Oop
November 2019 33
Oop Programs
June 2020 5
Upgrading Oop
June 2020 8
Exercise
May 2020 22