Download as pdf or txt
Download as pdf or txt
You are on page 1of 37

Translated from English to Vietnamese - www.onlinedoctranslator.

com

HaQT Lập trình hướng đối tượng

Lab 4. Bài tập OOP


Viết chương trình hay
Cách duy nhất để học lập trình là chương trình, chương trình và chương trình. Học lập trình
cũng giống như học đạp xe, bơi lội hay bất kỳ môn thể thao nào khác. Bạn không thể học
bằng cách xem hoặc đọc sách. Bắt đầu lập trình ngay lập tức. Mặt khác, để cải thiện khả năng
lập trình của mình, bạn cần đọc nhiều sách và nghiên cứu cách lập chương trình thạc sĩ.

Thật dễ dàng để viết các chương trình hoạt động. Việc viết các chương trình không chỉ hoạt động
mà còn dễ bảo trì và dễ hiểu đối với người khác sẽ khó hơn nhiều – tôi gọi đây là những chương
trình tốt. Trong thế giới thực, việc viết chương trình không có ý nghĩa gì. Bạn phải viết chương
trình tốt để người khác có thể hiểu và duy trì chương trình của bạn.
Đặc biệt chú ý đến:

1.Phong cách mã hóa:

• Đọc quy ước mã Java: ”Hướng dẫn về phong cách Java của Google” hoặc “Quy ước
mã Java - Oracle”.
• Tuân thủ các Quy ước đặt tên Java cho các biến, phương thức và lớp một cách
NGHIÊM TÚC. Sử dụng CamelCase cho tên. Tên biến và phương thức bắt đầu bằng
chữ thường, trong khi tên lớp bắt đầu bằng chữ hoa. Sử dụng danh từ cho các biến (ví
dụ: bán kính) và tên lớp (ví dụ: Vòng tròn). Sử dụng động từ cho các phương thức (ví
dụ: getArea(), isEmpty()).

• Sử dụng tên có ý nghĩa: Không sử dụng các tên như a, b, c, d, x, x1, x2 và


x1688 - chúng vô nghĩa. Tránh các tên có một bảng chữ cái như i, j, k. Chúng
rất dễ gõ, nhưng thường vô nghĩa. Chỉ sử dụng tên có một bảng chữ cái khi ý
nghĩa của chúng rõ ràng, ví dụ: x, y, z cho tọa độ và i cho chỉ mục mảng. Sử
dụng các tên có ý nghĩa như row và col (thay vì x và y, i và j, x1 và x2),
numStudents (không phải n), maxGrade, size (không phải n) và giới hạn trên
(không phải n). Phân biệt danh từ số ít và số nhiều (ví dụ: sử dụng books cho
một dãy sách và book cho từng mục).
• Sử dụng kiểu thụt lề và mã hóa nhất quán. Nhiều IDE (như Eclipse/NetBeans) có
thể định dạng lại mã nguồn của bạn chỉ bằng một cú nhấp chuột.

2.Tài liệu chương trình:Bình luận! Bình luận! và hơn thế nữa Bình luận để giải thích
mã của bạn cho người khác và cho chính bạn ba ngày sau.

3. Các vấn đề trong hướng dẫn này chắc chắn KHÔNG mang tính thách thức. Có
sẵn hàng chục nghìn bài toán thử thách – được sử dụng trong đào tạo cho các
cuộc thi lập trình khác nhau (chẳng hạn như Cuộc thi lập trình đại học quốc tế
(ICPC), Olympic tin học quốc tế (IOI)).

1
HaQT Lập trình hướng đối tượng

1 bài tập trên lớp


1.1 Giới thiệu về Lớp và Phiên bản bằng Ví dụ - Lớp Vòng tròn

Bài tập đầu tiên này sẽ hướng dẫn bạn tất cả các khái niệm cơ bản về OOP.

Một lớp có tên là vòng tròn được thiết kế như thể hiện trong sơ đồ lớp sau. Nó chứa:

• Hai biến thể hiện riêng tư:bán kính(thuộc loạigấp đôi) Vàmàu sắc(thuộc loại Sợi
dây), với giá trị mặc định là 1.0 và "đỏ", tương ứng.

• Haiquá tảinhà xây dựng - amặc địnhhàm tạo không có đối số và một hàm tạo lấy
mộtgấp đôilập luận chobán kính.

• Hai phương pháp công cộng:getRadius()VàgetArea(), tương ứng trả về bán kính và diện
tích của trường hợp này.

Mã nguồn của Circle.java như sau:

1 /∗∗
∗Các mô hình lớp Ci có hình tròn có bán kính và màu sắc. ∗/
3
công cộng icclassVòng tròn{ // Lưu dưới dạng ” Cirle . java”
5
// riêng tư ví dụ var iable e , không thể truy cập được từ bên ngoài bán cái này lớp học
7 riêng tư gấp đôi kính;
riêng tư Sợi dây màu sắc;
9
// nhà xây dựng (quá tải)
11 /∗∗
∗ Xây dựng một phiên bản Circle với giá trị mặc định cho bán kính và màu sắc
13 ∗/
công cộng Vòng tròn( ){ // 1 st ( de f au lt ) cons tructor

2
HaQT Lập trình hướng đối tượng

15 bán kính =1.0;


màu sắc =" màu đỏ";
17 }

19 /∗∗
∗ Xây dựng một phiên bản Circle với bán kính và màu mặc định cho trước
21 ∗/
công cộng Vòng tròn(gấp đôir){ // Nhược điểm thứ 2
23 bán kính =r;
màu sắc =" màu đỏ";
25 }

27 /∗∗
∗Trả về bán kính ∗/
29
ic công cộng đôilấy bán kính( ) {
31 trở lạibán kính;
}
33
/∗∗
35 ∗Trả về diện tích của Circlei ns tance này ∗/

37 ic công cộng đôilấy diện tích( ){


trở lạibán kính∗bán kính∗Toán học.số Pi;
39 }
}

Biên dịch "Circle.java". Bạn có thể điều hành lớp Circle không? Tại sao?

• Lớp Vòng tròn này không cóchủ yếu()phương pháp. Do đó, nó không thể được chạy trực tiếp. Lớp Vòng
tròn này là một "khối xây dựng" và được dùng để sử dụng trong một chương trình khác.

Chúng ta hãy viết mộtchương trình kiểm tragọi điệnVòng tròn kiểm tra (trong một tệp nguồn khác có tên
TestCircle.java) sử dụng lớp Circle, như sau:

/∗∗
2 ∗Trình điều khiển thử nghiệm cho Ci rcleclass ∗/

4 công cộng icclassTes tCi rc le{ // Lưu dưới dạng ” Tes tCi rc le . java”
khoảng trống tĩnh công cộngchủ yếu(Sợi dây[ ]lập luận){
6 // Khai báo một thực thể của Ci rcleclassgọicircle 1 . // Xây dựng thể hiện
Circle1 bằng cách gọi hàm tạo "mặc định" // để đặt bán kính và màu của
số 8 nó thành giá trị mặc định.
vòng tròn ci 1=mớiVòng tròn( ) ;
10 // Gọi các phương thức công khai trên vòng tròn 1, thông qua toán tử dấu chấm. Hệ
thống.ngoài.in(“Hình tròn có bán kính là”
12 + vòng tròn 1.lấy bán kính( ) +” và diện tích của ”+vòng tròn 1.lấy diện tích( ) ) ; //
Hình tròn có bán kính là 1,0 và diện tích là 3,141592653589793

3
HaQT Lập trình hướng đối tượng

14
// Khai báo một thực thể của classcirclegọicirc le 2 . // Xây dựng thể hiện
16 Circle2 bằng cách gọi hàm tạo thứ hai // với bán kính đã cho và de f au
ltcolor .
18 vòng tròn 2=mớiVòng tròn( 2 . 0 ) ;
// Gọi các phương thức công khai trên vòng tròn thứ 2, thông qua toán tử dấu
20 chấm. Hệ thống.ngoài.in(“Hình tròn có bán kính là”
+ vòng tròn 2.lấy bán kính( ) +” và diện tích của ”+vòng tròn 2.lấy diện tích( ) ) ; //
22 Hình tròn có bán kính 2,0 và diện tích 12,566370614359172
}
24 }

Bây giờ, hãy chạy TestCircle và nghiên cứu kết quả.

Các khái niệm OOP cơ bản hơn


1.Người xây dựng:Sửa đổi lớp Circle để bao gồm hàm tạo thứ ba nhằm xây dựng
một cá thể Circle với hai đối số - agấp đôivìbán kínhvà mộtSợi dâyvìmàu sắc.

// Hàm tạo thứ 3 để xây dựng một phiên bản mới của Circle với bán kính và màu sắc cho
2 trước công cộngVòng tròn(gấp đôir,chuỗi c){
......
4 }

Sửa đổi chương trình thử nghiệmvòng tròn kiểm trađể xây dựng một thể hiện của Circle bằng cách sử dụng
hàm tạo này.

2.Người nhận:Thêm một getter cho biến màu để truy xuất màu của phiên bản này.

1 // Trình thu thập cho ins tance và ri ab lecolor lấy


công cộngSợi dây màu( ){
3 ......
}

Sửa đổi chương trình thử nghiệm để kiểm tra phương pháp này.

3.công cộng và riêng tư:TRONGvòng tròn kiểm tra,bạn có thể truy cập trực tiếp bán kính biến thể hiện
không (ví dụ:System.out.println(circle1.radius)); hoặc gán một giá trị mới chobán kính(ví dụ, vòng
tròn1.radius=5.0)? Hãy dùng thử và giải thích các thông báo lỗi.

4.Người định cư:Có cần thay đổi giá trị bán kính và màu sắc của phiên bản Vòng tròn sau khi nó được
xây dựng không? Nếu vậy, hãy thêm hai phương thức công khai được gọi là setters để thay đổi bán
kính và màu sắc của phiên bản Circle như sau:

4
HaQT Lập trình hướng đối tượng

1 // Sẽ tốt hơn nếu ic bán kính của tôi và ri ab le


công cộng vô hiệu setRadius(gấp đôibán kính mới) = {
3 bán kính bán kính mới;
}
5
// Se tter fori ns tance và ri ab lecolor
7 ic công cộng vô hiệu setColor(Chuỗi màu mới){
......
9 }

Sửa đổivòng tròn kiểm trađể kiểm tra các phương pháp này, ví dụ:

vòng tròn 4=mớiVòng tròn( ) ; vòng tròn // xây dựng một thể hiện của
2 4.setRadius( 5 . 5 ) ; Circle // thay đổi bán kính
Hệ thống.ngoài.in(“bán kính là:”+vòng tròn 4.lấy bán kính( ) ) ; // In

→ bán kính thông qua getter
4
vòng tròn 4.setColor(" màu xanh lá ") ; // Thay đổi màu sắc
6 Hệ thống.ngoài.in(" Màu là : "+vòng tròn 4.lấy màu( ) ) ; // In

→ màu sắc thông qua getter

số 8//
Bạn không thể thực hiện thao tác sau vì setRadius ( ) trả về void , // không thể in
được
10Hệ thống.ngoài.in(vòng tròn 4.setRadius( 4 . 4 ) ) ;

5.Từ khóa “cái này”:Thay vì sử dụng tên biến nhưr(vìbán kính) Vàc(vì màu sắc) trong các đối
số của phương thức, tốt hơn nên sử dụng tên biếnbán kính(cho bán kính) vàmàu sắc(cho
màu sắc) và sử dụng từ khóa đặc biệt ”cái này” để giải quyết xung đột giữa các biến thể
hiện và đối số của phương thức. Ví dụ,

1 // instance va ri ab le pr i vat
e doublebán kính;
3
/∗∗
5 ∗Xây dựng một phiên bản Circle với bán kính và màu mặc định cho trước ∗/

7 công cộngVòng tròn(gấp đôibán kính) {


cái này.bán kính=bán kính; // ”this.radius” đề cập đến biến thể hiện
9 // ” bán kính ” đề cập đến tham số của phương thức màu
sắc=" màu đỏ";
11 }

13/∗∗
∗Đặt bán kính thành giá trị đã cho

5
HaQT Lập trình hướng đối tượng

15 ∗/
ic công cộng vô hiệusetRadius(gấp đôi bán kính){
17 cái này.bán kính=bán kính; // ”this.radius” đề cập đến biến thể hiện
// ” bán kính ” đề cập đến đối số của phương thức
19 }

Sửa đổi TẤT CẢ các hàm tạo và setters trongVòng trònlớp sử dụng từ khóa ”cái này”.

6.Phương thức toString():Mọi lớp Java được thiết kế tốt đều phải chứa một phương thức công khai
được gọi làtoString()trả về một mô tả của thể hiện (theo kiểu trả về là Sợi dây). CáctoString()
phương thức có thể được gọi một cách rõ ràng (thông quainstanceName.toString()) giống như bất
kỳ phương pháp nào khác; hoặc ngầm thông quaprintln(). Nếu một phiên bản được truyền tới
println(anInstance)phương pháp, sựtoString()phương thức của trường hợp đó sẽ được gọi ngầm.
Ví dụ: bao gồm những điều sau đâytoString()các phương thức cho lớp Circle:

/∗∗
2 ∗Trả về chính −chuỗi mô tả của điều này trong ∗dạng hình tròn [ bán kính = ? ,
màu = ? ] ∗/
4
công cộngChuỗi tới chuỗi( ){
6 trở lại”Vòng tròn [bán kính =”+bán kính+“màu sắc =”+màu sắc+” ] ”;
}

Hãy thử gọitoString()phương thức một cách rõ ràng, giống như bất kỳ phương pháp nào khác:

vòng tròn 5=mớiVòng tròn( 5 . 5 ) ;


2 Hệ thống.ngoài.in(vòng tròn 5.toSt ri ng( ) ) ; // cuộc gọi rõ ràng

toString()được gọi ngầm khi một thể hiện được truyền cho phương thức println(),
ví dụ:

1vòng tròn ci 6=mớiVòng tròn( 6 . 6 ) ;


Hệ thống.ngoài.in(vòng tròn 6.toSt ri ng( ) ) ; // rõ ràng gọi
3Hệ thống.ngoài.in(vòng tròn 6) ; // inln ( ) cuộc gọi toSt ri ng
↪→ ( )ngầm , tương tự như trên
Hệ thống.ngoài.in(”Toán tử '+' cũng gọi tớiSt ri ng ( ) : ”+vòng tròn 6
↪→ ) ; // '+ ' cũng gọi tớiSt ri ng ( )

Sơ đồ lớp cuối cùng của lớp Circle như sau:

6
HaQT Lập trình hướng đối tượng

1.2 Lớp học vòng tròn khác


Một lớp được gọi làVòng tròn,mô hình một vòng tròn có bán kính, được thiết kế như
trong sơ đồ lớp sau. GhiVòng trònlớp học.

Dưới đây là trình điều khiển thử nghiệm để kiểm traVòng trònlớp học.

1 /∗∗
∗Test Driver để kiểm tra Ci rcleclass ∗/
3
công cộng icclassKiểm tra chính {
5
khoảng trống tĩnh công cộng chủ yếu(Sợi dây[ ] lập luận) {
7 // Test Constructor và toSt ri ng ( ) vòng tròn ci
1=mớiVòng tròn( 1 . 1 ) ; Hệ thống.ngoài.in(
9 vòng tròn 1) ; // toSt ri ng ( )
vòng tròn 2=mớiVòng tròn( ) ;// nhà xây dựng mặc định Hệ thống.
11 ngoài.in(vòng tròn 2) ;

7
HaQT Lập trình hướng đối tượng

13 // Test setter và getter vòng tròn 1.


setRadius( 2 . 2 ) ; Hệ thống.ngoài.in(
15 vòng tròn 1) ; // toSt ri ng ( )
Hệ thống.ngoài.in(“bán kính là:”+vòng tròn 1.lấy bán kính( ) ) ;
17
// Kiểm tra getArea ( ) và getCircumference ( ) Hệ
19 thống.ngoài.printf(” diện tích là : %.2 f%n”, Hệ thống.
vòng tròn 1.lấy diện tích
ngoài.printf(” thông số trung bình là: ( ) ) ; %.2 f%n”,vòng tròn 1.

→ lấy chu vi( ) ) ;
21 }
}

Sản lượng dự kiến là:

Cửa sổ lệnh

Hình tròn [ bán = 1 . 1]


2 kính Hình tròn = 1 . 0]
[ bán kính Hình = 2 . 2]
4 tròn [ bán kính bán
kính là : 2,2 diện
6 tích là : 15,21 chu vi là : 13,82

1.3 Lớp hình chữ nhật


Một lớp có tên là Rectangle, mô hình hóa một hình chữ nhật có chiều dài và chiều rộng (theotrôi nổi
), được thiết kế như thể hiện trong sơ đồ lớp sau. Viết lớp Hình chữ nhật.

Dưới đây là trình điều khiển thử nghiệm để kiểm tra lớp Hình chữ nhật:

số 8
HaQT Lập trình hướng đối tượng

/∗∗
2 ∗Test Driver để kiểm tra lớp Rectangle ∗/

4 công cộng icclassKiểm tra chính{

6 khoảng trống tĩnh công cộngchủ yếu(Sợi dây[ ]lập luận){


// Cấu trúc kiểm thử và toSt ri ng ( )
số 8 // Bạn cần thêm ' f ' hoặc 'F ' vào afloatliteral Hình chữ nhật r ec tang l
e1=mớiHình chữ nhật( 1 . 2f, 3,4f) ; Hệ thống.ngoài.in(r ec t ng l e1) ;
10 // toSt ri ng ( )
Hình chữ nhật r ec tang l e2=mớiHình chữ nhật( ) ; // nhà xây dựng mặc định Hệ
12 thống.ngoài.in(r ec t ng l e2) ;

14 // Kiểm tra setters và getters r ec tang l


e1.tập hợp độ dài( 5 . 6f) ; r ec tang l e1.
16 setWidth( 7 . 8f) ; Hệ thống.ngoài.in(r ec t
ng l e1) ; // toSt ri ng ( )
18 Hệ thống.ngoài.in(” chiều dài là: ”+r ec t ng l e1.lấy chiều dài( ) ) ; Hệ thống.
ngoài.in(”chiều rộng là:”+r ec tang l e1.lấy chiều rộng( ) ) ;
20
// Kiểm tra getArea ( ) và getPerimeter ( ) Hệ
22 thống.ngoài.printf(” diện tích là : %.2 f%n”, Hệ rec tang l e1.lấy diện tích( ) ) ;
thống.ngoài.printf(”chu vi là:%.2 f%n”, r ec tang l e1.lấy chu vi( ) ) ;
24 }
}

Sản lượng dự kiến là:

Cửa sổ lệnh

1 Hình chữ nhật [chiều dài= 1 . 2, chiều rộng = 3. 4 ]


Hình chữ nhật [chiều dài= 1 . 0, chiều rộng = 1. 0]
3 Hình chữ nhật [chiều dài= 5 . 6, chiều rộng = 7. số 8 ]
chiều dài là : 5,6
5 chiều rộng là : 7,8
khu vực là : 43,68
7 chu vi là: 26,80

1.4 Lớp nhân viên


Một lớp có tên Nhân viên, mô hình hóa một nhân viên có ID, tên và mức lương, được
thiết kế như thể hiện trong sơ đồ lớp sau. phương pháptăng lương (phần trăm)tăng
lương theo tỷ lệ nhất định. Viết lớp Nhân viên.

9
HaQT Lập trình hướng đối tượng

Dưới đây là trình điều khiển thử nghiệm để kiểm tra lớp Nhân viên:

1 /∗∗
∗ Bài kiểm tra tài xế ĐẾN Bài kiểm tra Người lao động lớp học
3 ∗/
công cộng lớp họcKiểm tra chính {
5
công cộng khoảng trống tĩnh chủ yếu(Sợi dây[ ] lập luận) {
7 // Bài kiểm tra người xây dựng và toSt đổ chuông ( )
Nhân viên nhân viên1=mớiNgười lao động(số 8 ,“Peter”,“Tân”, 2500); Hệ thống.
9 ngoài.in(nhân viên1) ; // toSt ri ng ( ) ;

11 // Kiểm tra Set và Getters nhân viên1.


se tSa la ry(999); Hệ thống.ngoài.in(e1
13 ) ; Hệ thống.ngoài.in(" nhận dạng //Hệ toSt ri ng ( ) ;
thống.ngoài.in(" tên đầu tiên Hệlàthống
: "+nhân viên1.lấy ID( ) ) ;
15 .ngoài.in(" họ là : "+nhân viên1.lấyFirstName( ) ) ; là : "+
nhân viên1.lấy tên cuối cùng( ) ) ;
17 Hệ thống.ngoài.in(” lương là : ”+nhân viên1.nhận lương( ) ) ;

19 Hệ thống.ngoài.in("tên là : "+nhân viên1.lấy tên( ) ) ;


Hệ thống.ngoài.in(”Tiền lương hàng năm:”+nhân viên1.nhận đượcLương hàng năm( )

→ ) ;//Phương pháp kiểm tra
21
// Kiểm tra tăng Sa lary ( )
23 Hệ thống.ngoài.in(nhân viên1.tăng lương(10) ) ; Hệ thống.
ngoài.in(nhân viên1) ;
25 }

10
HaQT Lập trình hướng đối tượng

Dự kiến ra là:

Cửa sổ lệnh

Nhân viên [ id = 8 , tên = Peter Tan , lương = 2500]


2 Nhân viên [ id = 8 , tên = Peter Tan , lương = 999]
mã số là: 8
4 tên đầu tiên là : Peter
họ là : Tân
6 lương: tên là: 999
Peter lương hàng Tân
số 8năm 1098 là: 11988

10Nhân viên [ id = 8 , tên = Peter Tan , lương = 1098]

1.5 Lớp InvoiceItem


Một lớp có tên InvoiceItem, mô hình hóa một mục của hóa đơn, có ID, mô tả, số lượng
và đơn giá, được thiết kế như thể hiện trong sơ đồ lớp sau. Viết lớp InvoiceItem.

Dưới đây là trình điều khiển thử nghiệm để kiểm tra lớp InvoiceItem:

11
HaQT Lập trình hướng đối tượng

/∗∗
2 ∗Trình điều khiển kiểm tra để kiểm tra lớp InvoiceItem ∗/

4 công cộng icclassKiểm tra chính{

6 khoảng trống tĩnh công cộngchủ yếu(Sợi dây[ ]lập luận){


// Kiểm tra cấu trúc và toSt ri ng ( )
số 8 Mục hóa đơn inv1=mớiHóa đơnMặt hàng(”A101”,“Bút đỏ”, 888 , 0 . 08); Hệ thống.ngoài.
in(inv1) ; // toSt ri ng ( ) ;
10
// Kiểm tra Set và Getters inv1.
12 bộQty(999); inv1.setUni tPr i ce( 0 .
99 ) ; Hệ thống.ngoài.in(inv1) ;
14 // toSt ri ng ( ) ;
Hệ thống.ngoài.in(” id là: ”+inv1.lấy ID( ) ) ; Hệ thống.ngoài.in(”
16 desc là: ”+inv1.nhận đượcDesc( ) ) ; Hệ thống.ngoài.in(”số lượng
là:”+inv1.nhận được số lượng( ) ) ;
18 Hệ thống.ngoài.in(” un i tpr i ce là : ”+inv1.getUni tPr đá( ) ) ;

20 // Kiểm tra getTotal ( )


Hệ thống.ngoài.in(“Tổng cộng:”+inv1.lấy tổng cộng( ) ) ;
22 }
}

Sản lượng dự kiến là:

Cửa sổ lệnh

1 InvoiceItem [ id = A101 , desc = Pen Red , qty = 888 , un i tPr i ce = 0 . 0 8 ]


InvoiceItem [ id = A101 , desc = Pen Red , qty = 999 , un i tPr i ce = 0 . 9 9] id là:
3 A101
mô tả là : Cái bút Màu đỏ
5 là : 999
số lượng

un i tpr i ce là : 0,99
7 Tổng số là : 989.01

1.6 Lớp tài khoản


Một lớp có tên Tài khoản, mô hình hóa tài khoản ngân hàng của khách hàng, được thiết kế như
thể hiện trong sơ đồ lớp sau. Các phương thức ghi có(số tiền) và ghi nợ(số tiền) cộng hoặc trừ
số tiền đã cho vào số dư. phương pháptransferTo(tài khoản khác, số tiền)chuyển cái đã chosố
lượngtừ Tài khoản này đến tài khoản đã chotài khoản khác. Viết lớp Tài khoản.

12
HaQT Lập trình hướng đối tượng

Dưới đây là trình điều khiển thử nghiệm để kiểm tra lớp Tài khoản:

1 /∗∗
∗ Bài kiểm tra tài xế ĐẾN Bài kiểm tra Tài khoản lớp học
3 ∗/
công cộng lớp họcKiểm tra chính {
5
công cộng khoảng trống tĩnh chủ yếu(Sợi dây[ ] lập luận) {
7 // Bài kiểm tra người xây dựng và toSt đổ chuông ( )
Tài khoản tài khoản1=mớiTài khoản(”A101”,“Tân Ah Teck”, 88); Hệ thống.
9 ngoài.in(tài khoản1) ; // toSt ri ng ( ) ;
Tài khoản tài khoản2=mớiTài khoản(”A102”,“Kumar”) ;// số dư bị lỗi Hệ thống.ngoài.in(tài
11 khoản2) ;

13 // Trình kiểm tra


Hệ thống.ngoài.in("NHẬN DẠNG : "+tài khoản1.lấy ID( ) ) ; Hệ thống.ngoài.
15 in("Tên : "+tài khoản1.lấy tên( ) ) ; Hệ thống.ngoài.in("Sự cân bằng : "+tài
khoản1.lấy số dư( ) ) ;
17
// Kiểm tra tín dụng ( ) và ghi nợ ( ) tài
19 khoản1.tín dụng(100); Hệ thống.ngoài.
in(tài khoản1) ; tài khoản1.ghi nợ(50);
21 Hệ thống.ngoài.in(tài khoản1) ; tài
khoản1.ghi nợ(500);
23 // lỗi debi t ( ) Hệ
thống.ngoài.in(tài khoản1) ;
25
// Truyền kiểm tra ( )
27 tài khoản1.chuyển tới(tài khoản2, 100); Hệ // toSt ri ng ( )
thống.ngoài.in(tài khoản1) ; Hệ thống.ngoài.in(
29 tài khoản2) ;

13
HaQT Lập trình hướng đối tượng

}
}
31

Sản lượng dự kiến là:

Cửa sổ lệnh

1Tài khoản [ id = A101 , tên = Tan Ah Teck ,THĂNG BẰNG= 88]


Tài khoản [ id = A102 , tên = Kumar ,THĂNG BẰNG= 0] ID:
3 A101
Tên : Tan Ah Teck Số
5 dư : 88
Tài khoản [ id = A101 , tên = Tan Ah Teck ,THĂNG BẰNG= 188]
7Tài khoản [ id = A101 , tên = Tan Ah Teck ,THĂNG BẰNG= 138]

Số tiền vượt quáTHĂNG BẰNG


9Tài khoản [ id = A101 , tên = Tan Ah Teck ,THĂNG BẰNG= 138]
Tài khoản [ id = A101 , tên = Tan Ah Teck ,THĂNG BẰNG= 38]
11Tài khoản [ id = A102 , tên = Kumar ,THĂNG BẰNG= 100]

1.7 Lớp MyComplex


Một lớp có tên MyComplex, mô hình hóa một số phức với phần thực và phần ảo, được thiết
kế như thể hiện trong sơ đồ lớp.

Nó chứa:

14
HaQT Lập trình hướng đối tượng

• Hai biến thể hiện có tênthực tế(gấp đôi) Vàhình ảnh(gấp đôi) lần lượt lưu trữ phần
thực và phần ảo của số phức.

• Hàm tạo tạo một phiên bản MyComplex với các giá trị thực và ảo đã cho.

• Một hàm tạo mặc định tạo MyComplex ở mức 0.0 + 0.0Tôi.

• Getters và setters cho các biến thể hiệnthực tếVàhình ảnh.

• Một phương phápđặt giá trị()để thiết lập giá trị của số phức.

• MỘTtoString()nó trả về ”(x+ừ)" Ở đâuxVàylần lượt là phần thực và phần ảo.

• phương pháplà thật()VàisImaginary()điều đó trả vềĐÚNG VẬYnếu số phức này là số thực


hoặc số ảo tương ứng.

gợi ý

1 trở lại(hình ảnh== 0);

• Một phương phápbằng (thực kép, hình ảnh kép)điều đó trả vềĐÚNG VẬYnếu số phức
này bằng số phức đã cho (thực, hình ảnh).

gợi ý

trở lại(cái này.thực tế==thực tế&&cái này.hình ảnh==hình ảnh) ;

• Quá tảibằng(MyComplex khác)điều đó trả vềĐÚNG VẬYnếu số phức này bằng với
phiên bản MyComplex đã cho khác.

gợi ý

trở lại(cái này.thực tế==khác.thực tế&&cái này.hình ảnh==khác.hình ảnh) ;

• Một phương phápkích cỡ()trả về độ lớn của số phức này.

15
HaQT Lập trình hướng đối tượng

kích cỡ(x+ừ) =Toán học.mét vuông(x∗x+y∗y)

• phương phápaddInto(MyComplex bên phải)cộng và trừ phiên bản MyComplex đã cho


(được gọi là bên phải) vào phiên bản này và trả về phiên bản này.

(Một+bi) + (c+di) = (Một+c) + (b+d)Tôi

gợi ý

trả lại cái này; // trả về ” cái này ” theo ý kiến

• phương phápaddNew(MyComplex bên phải)bổ sung phiên bản này với phiên bản MyComplex
đã cho được gọi là right và trả về một phiên bản MyComplex mới chứa kết quả.

gợi ý

// xây dựng một thực thể mới và trả về thực thể đã xây dựng
2 trả lại mớiMyComplex( . . , . . . ) ;

Bạn được yêu cầu:

1. Viết lớp MyComplex.

2. Viết trình điều khiển kiểm tra để kiểm tra tất cả các phương thức công khai được xác định trong lớp.

3. Viết một ứng dụng có tên MyComplexApp sử dụng lớp MyComplex. Ứng dụng sẽ
nhắc người dùng về hai số phức, in giá trị của chúng, kiểm tra số thực, số ảo và
bằng, đồng thời thực hiện tất cả các phép tính số học.

16
HaQT Lập trình hướng đối tượng

Cửa sổ lệnh

1 Nhập số phức 1 (thực tếvà phần ảo ): 1.1 2.2


Nhập số phức 2 (thực tếvà phần ảo ): 3.3 4.4
3
Số 1 là : ( 1 . 1 + 2.2 i )
5 (1 . 1 + 2.2 i ) KHÔNG thuần túythực tếcon số
( 1 . 1 + 2.2 i ) KHÔNG phải là số ảo thuần túy
7
Số 2 là : ( 3 . 3 + 4,4 i )
9 (3 . 3 + 4.4 i ) KHÔNG thuần túythực tếcon số
( 3 . 3 + 4.4 i ) KHÔNG phải là số ảo thuần túy
11
(1.1 + 2.2 tôi ) là KHÔNG tương đương với ( 3 . 3 + 4.4 tôi )
13(1 . 1 + 2.2 tôi ) + ( 3 . 3 + 4,4 tôi ) = ( 4 . 4 + 6.6000000000000005 tôi )

Thử
Một thiết kế hoàn chỉnh (thêm) của lớp MyComplex được hiển thị bên dưới:

• phương pháplý lẽ()trả về đối số của số phức này tính bằng radian (gấp đôi).

17
HaQT Lập trình hướng đối tượng

arg(x + yi ) = Toán . atan2 (y , x) ( tính bằng radian )

Ghi chú:Thư viện Math có hai phương pháp tiếp tuyến cung,Math.atan (gấp đôi)Và
Math.atan2(gấp đôi, gấp đôi). Chúng tôi thường sử dụngMath.atan2(y, x)thay vì
Math.atan(y/x)để tránh chia cho số 0. Đọc tài liệu về lớp Toán trong gói java.lang.

• phương phápthêm vào()được đổi tênthêm vào(). Cũng đã thêmtrừ()VàtrừNew().

• phương phápnhân (MyComplex bên phải)Vàchia (MyComplex bên phải)nhân và chia


phiên bản này với phiên bản MyComplex đã cho, đồng thời giữ kết quả trong phiên
bản này và trả về phiên bản này.

( a + bi )∗ (c + di ) = ( ac − bd) + ( ad + bc ) i
2 ( a + bi ) / ( c + di ) = [ ( a + bi )∗ (c − di ) ] / ( c∗c + d∗d)

• Một phương thức liên hợp() hoạt động trên thể hiện này và trả về thể hiện này
chứa liên hợp phức.

1 liên hợp (x + yi ) = x − yi

Hãy lưu ý rằng có một số sai sót trong thiết kế của lớp này, lớp này được giới thiệu chỉ nhằm
mục đích giảng dạy:

• So sánhđôiTRONGbình đẳng()sử dụng ”==” có thể tạo ra kết quả không mong muốn.
Ví dụ: (2.2 + 4.4) == 6.6 trả về sai. Người ta thường xác định một ngưỡng nhỏ gọi là
EPSILON (đặt ở khoảng 10−số 8) để so sánh các số dấu phẩy động.

• phương phápthêm mới(),trừNew()tạo ra các trường hợp mới, trong khithêm vào(),
trừ(),nhân(),chia()Vàliên hợp()sửa đổi trường hợp này. Có sự thiếu nhất quán trong
thiết kế (được giới thiệu với mục đích giảng dạy).

Cũng lưu ý rằng các phương pháp nhưthêm vào()trả về một phiên bản của MyComplex. Do đó, bạn
có thể đặt kết quả bên trong mộtSystem.out.println()(trong đó ngầm gọitoString()). Bạn cũng có thể
xâu chuỗi các hoạt động, ví dụ:complex1.add(complex2).add(complex3)(giống như
(complex1.add(complex2)).add(complex3)), hoặccomplex1.add(complex2).subtract(complex3).

18
HaQT Lập trình hướng đối tượng

1.8 Lớp MyPolynomial

Một lớp có tên MyPolynomial, mô hình các đa thức bậc n (xem phương trình), được thiết kế
như thể hiện trong sơ đồ lớp.

cNxN+cn−1xn−1+· · ·+c1x+c0.
Nó chứa:
• Một hàm tạo MyPolynomial(coeffs:gấp đôi...) cần một số lượng biến đổi gấp đôi để
khởi tạo mảng coeffs, trong đó đối số đầu tiên tương ứng vớic0.

• Ba dấu chấm được gọi là varargs (số lượng đối số thay đổi), đây là một tính năng mới được giới
thiệu trong JDK 1.5. Nó chấp nhận một mảng hoặc một chuỗi các đối số được phân tách bằng dấu
phẩy. Trình biên dịch sẽ tự động đóng gói các đối số được phân tách bằng dấu phẩy vào một
mảng. Ba dấu chấm chỉ có thể được sử dụng cho đối số cuối cùng của phương thức.

gợi ý

công cộng icclassĐa thức của tôi{


2 pr i vat e double[ ]cà phê;

4 công cộngĐa thức của tôi(gấp đôi. . .cà phê){ // biến thể
cái này.cà phê=cà phê; // các biến thể được phản ánh dưới dạng mảng
6 }
......
số 8 }

10 //Chương trình kiểm tra


// Có thể gọi với số lượng đối số khác nhau
12 MyPolynomial đa thức1=mớiĐa thức của tôi( 1 . 1 , 2 . 2 , 3 . 3 ) ;
MyPolynomial đa thức1=mớiĐa thức của tôi( 1 . 1 , 2 . 2 , 3 . 3 , 4 . 4 , 5 . 5 )

→ ;
14
// Cũng có thể gọi bằng mảng

19
HaQT Lập trình hướng đối tượng

16 gấp đôi[ ]cà phê={1 . 2, 3. 4, 5. 6, 7,8} MyPolynomial đa thức2=mớiĐa


thức của tôi(cà phê) ;

• Một phương phápgetDegree()trả về bậc của đa thức này.

• Một phương pháptoString()cái đó trả về”cNxN+cn−1xn−1+· · ·+c1x+c0.”.

• Một phương phápđánh giá(gấp đôi x)tính giá trị đa thức của biểu thức đã chox, bằng
cách thay thế đã choxvào biểu thức đa thức.

• phương phápthêm vào()Vànhân()nó cộng và nhân đa thức này với một thể hiện
MyPolynomial đã cho khác và trả về thể hiện này chứa kết quả.

Viết lớp MyPolynomial. Đồng thời viết một trình điều khiển thử nghiệm (được gọi là TestMyPolynomial) để kiểm tra tất cả các
phương thức công khai được xác định trong lớp.

Câu hỏi: Bạn có cần giữ bậc của đa thức làm biến thể hiện trong lớp MyPolynomial
trong Java không? Còn C/C++ thì sao? Tại sao?

20
HaQT Lập trình hướng đối tượng

2 bài tập về bố cục


2.1 Giới thiệu về Thành phần OOP theo ví dụ - Lớp Tác giả và Sách

Bài tập đầu tiên này sẽ hướng dẫn bạn tất cả các khái niệm liên quan đến Thành phần OOP.

Một lớp có tên là Tác giả (như được hiển thị trong sơ đồ lớp) được thiết kế để mô hình hóa tác giả của một cuốn sách.
Nó chứa:

• Ba biến thể hiện riêng tư:tên(Sợi dây),e-mail(Sợi dây), Vàgiới tính(ký tựcủa 'm'
hoặc 'f');

• Một hàm tạo để khởi tạo tên, email và giới tính với các giá trị đã cho;

công cộngTác giả(Tên chuỗi,chuỗi email,ký tựgiới tính){. . . . . .}

(Không có hàm tạo mặc định cho Tác giả vì không có giá trị mặc định cho tên, email và
giới tính.)

• getters/setters công cộng:getName(),lấyEmail(),setEmail(), VàgetGender(); (Không có bộ cài đặt

nào cho tên và giới tính vì những thuộc tính này không thể thay đổi được.)

• MỘTtoString()phương thức trả về ”Tác giả[name = ?, email = ?, giới tính = ?]”, ví dụ: ”Tác
giả[name = Tan Ah Teck, email = ahTeck@somewhere.com , giới tính = m]”.

Viết lớp Tác giả. Đồng thời viết trình điều khiển thử nghiệm có tên TestAuthor để kiểm tra tất cả các phương thức
công khai, ví dụ:

21
HaQT Lập trình hướng đối tượng

Tác giả ahTeck=mớiTác giả(“Tân Ah Teck”,”ahteck@nowhere . com”,'tôi') ;//



→ Kiểm tra nhược điểm
2Hệ thống.ngoài.in(ahTeck) ; // Test toSt ri ng ( )
ahTeck.bộEmail(”paulTan@nowhere . com”) ; // Trình thiết lập thử nghiệm
4Hệ thống.ngoài.in("tên là : "+ahTeck.lấy tên( ) ) ; // Bộ lấy mẫu kiểm tra //
Hệ thống.ngoài.in(" eamil là: "+ahTeck.nhận đượcEmail( ) ) ; Bộ lấy mẫu kiểm tra
6Hệ thống.ngoài.in(“giới tính là:”+ahTeck.lấy giới tính( ) ) ;// Trình kiểm tra

Một lớp có tên Sách được thiết kế (như thể hiện trong sơ đồ lớp) để mô hình hóa một cuốn sách được viết bởi
một tác giả. Nó chứa:

• Bốn biến thể hiện riêng tư:tên(Sợi dây),tác giả(của lớp Tác giả bạn vừa tạo, giả sử
rằng một cuốn sách có một và chỉ một tác giả),giá (gấp đôi), Và số lượng(int);

• Hai hàm tạo:

công cộngSách(Tên chuỗi,tác giả tác giả,gấp đôigiá ){


2 ......
}
4

22
HaQT Lập trình hướng đối tượng

công cộngSách(Tên chuỗi,tác giả tác giả,gấp đôigiá,tôi khôngsố lượng){


6 ......
}

• phương pháp công cộnggetName(),getAuthor(),getPrice(),setPrice(),getQty(),setQty().

• MỘTtoString()sẽ trả về ”Sách[tên = ?, Tác giả[tên = ?, email = ?, giới tính = ?], giá
= ?, qty = ?”. Bạn nên sử dụng lại của Tác giảtoString().

Viết lớp Sách (sử dụng lớp Tác giả được viết trước đó). Đồng thời viết một trình điều khiển thử
nghiệm có tên TestBook để kiểm tra tất cả các phương thức công khai trong lớp Book. Hãy lưu ý
rằng bạn phải tạo một phiên bản của Tác giả trước khi có thể tạo một phiên bản của Sách. Ví dụ,

// Xây dựng ý tưởng tác giả


2 Tác giả ahTeck=mớiTác giả(“Tân Ah Teck”,”ahteck@nowhere . com”,'tôi') ;
Hệ thống.ngoài.in(ahTeck) ; // Thông báo của tác giả ( )
4
Sách giảSách=mớiSách("Java cho người giả",ahTeck, 19,95 , 99) ; // Bài kiểm tra

→ Trình xây dựng sách
6Hệ thống.ngoài.in(sách giả) ; // Điểm nổi bật của Sách kiểm tra ( )

//Kiểm tra Getters và Setters


số 8

sách giả.se tPr đá( 29 . 95 ) ;


10sách giả.bộQty(28) ;

Hệ thống.ngoài.in("tên là : "+sách giả.lấy tên( ) ) ;


12Hệ thống.ngoài.in(" giá là : "+sách giả.nhận được giá trị( ) ) ;

Hệ thống.ngoài.in(”số lượng là:”+sách giả.nhận được số lượng( ) ) ;


14Hệ thống.ngoài.in(“Tác giả là:”+sách giả.lấy tác giả( ) ) ; // Tác giả
↪→ toSt ri ng ( )
Hệ thống.ngoài.in(”Tên tác giả là:”+sách giả.lấy tác giả( ) .lấy tên( ) ) ;
16Hệ thống.ngoài.in(”Email của tác giả là:”+sách giả.lấy tác giả( ) .nhận đượcEmail

↪→ ());

18//Sử dụng ẩn danh của Tác giả để xây dựng một cuốn sách
Đặt cuốn sách khác=mớiSách("thêm Java",
20mớiTác giả(“Paul Tân”,”paul@ở đâu đó . com”,'tôi') , 29. 95) ;

Hệ thống.ngoài.in(Một cuốn sách khác) ; // toSt ri ng ( )

Hãy lưu ý rằng cả hai lớp Sách và Tác giả đều có một biến được gọi là tên. Tuy nhiên, nó có
thể được phân biệt thông qua thể hiện tham chiếu. Đối với phiên bản Sách có nội dung là
aBook, aBook.name đề cập đến tên của cuốn sách; trong khi đối với phiên bản của Tác giả,
hãy nói anAuthor, anAuthor.name đề cập đến tên của tác giả. Không cần (và không nên)
gọi các biếnTên sáchVàtên tác giả.

Thử

23
HaQT Lập trình hướng đối tượng

1. In tên và email của tác giả từ phiên bản Sách. (Gợi ý:


aBook.getAuthor().getName(),aBook.getAuthor().getEmail()).

2. Giới thiệu các phương pháp mới gọi làgetAuthorName(),getAuthorEmail(),


getAuthorGender()trong lớp Sách để trả về tên, email và giới tính của tác giả cuốn
sách. Ví dụ,

1 công cộngChuỗi lấy Tên tác giả( ){


trở lạitác giả.lấy tên( ) ; // không thể sử dụng tác giả. tên như tên là

→ pr i vat e trong lớp Tác giả
3 }

2.2 (Nâng cao) Lại lớp tác giả và lớp sách - Mảng đối tượng dưới dạng biến
thể hiện

Trong bài tập trước, một cuốn sách được viết bởi một và chỉ một tác giả. Trên thực tế, một cuốn sách có
thể được viết bởi một hoặc nhiều tác giả. Sửa đổi lớp Sách để hỗ trợ một hoặc nhiều tác giả bằng cách
thay đổi biến thể hiện của tác giả thành một mảng Tác giả.

Ghi chú

• Các hàm tạo lấy một mảng Tác giả (tức là Tác giả []), thay vì một phiên bản Tác giả.
Trong thiết kế này, khi phiên bản Sách là hàm tạo, bạn không thể thêm hoặc xóa tác
giả.

24
HaQT Lập trình hướng đối tượng

• CáctoString()phương thức sẽ trả về ”Sách[tên = ?, tác giả = Tác giả[tên = ?, email


= ?, giới tính = ?], ......, giá = ?, qty = ?]”.

Bạn được yêu cầu:

1. Viết mã cho lớp Sách. Bạn sẽ sử dụng lại lớp Tác giả được viết trước đó.

2. Viết trình điều khiển kiểm tra (gọi là TestBook) để kiểm tra lớp Sách.

Thử

// Khai báo và cấp phát mảng Tác giả


2Tác giả[ ]tác giả=mớiTác giả[ 2 ] ;
tác giả[ 0 ] =mớiTác giả(“Tân Ah Teck”,”AhTeck@ở đâu đó. com”, 'tôi') ;
4tác giả[ 1 ] =mớiTác giả(“Paul Tân”,”Paul@nowhere . com”,'tôi') ;

6//Kê khai và phân bổ sổ sách


Sách javaDummy=mớiSách("Java cho người giả",tác giả, 19,99 , 99) ;
số 8Hệ thống.ngoài.in(javaDummy) ; // toSt ri ng ( )

2.3 Lớp học tác giả và sách - Đến lượt bạn


Một lớp có tên là Tác giả, mô hình hóa một tác giả của một cuốn sách, được thiết kế như thể hiện
trong sơ đồ lớp. Một lớp có tên Sách, mô hình hóa một cuốn sách được viết bởi MỘT tác giả và tạo
một thể hiện của Tác giả làm biến thể hiện của nó, cũng được hiển thị. Viết các lớp Tác giả và Sách.

25
HaQT Lập trình hướng đối tượng

Dưới đây là trình điều khiển thử nghiệm:

/∗∗
2 ∗ Bài kiểm tra tài xế lớp học
∗/
4 công cộng lớp họcKiểm tra chính {

6 khoảng trống tĩnh công cộngchủ yếu(Sợi dây[ ]lập luận){

số 8 // Lớp tác giả kiểm tra


tác giả tác giả1=mớiTác giả(“Tân Ah Teck”,”ahteck@nowhere . com”) ; Hệ thống.ngoài.in
10 (tác giả1) ;

12 tác giả1.bộEmail(”ahteck@ở đâu đó . com”) ; Hệ thống.


ngoài.in(tác giả1) ;
14 Hệ thống.ngoài.in("tên là : "+tác giả1.lấy tên( ) ) ; Hệ thống.ngoài.in(
“email là:”+tác giả1.nhận đượcEmail( ) ) ;
16
// Lớp Sách kiểm tra
18 Sách sách1=mớiSách(”12345”,“Java dành cho người ngu”,a1, số 8 . 8, 88); Hệ thống.
ngoài.in(cuốn sách 1) ;
20
cuốn sách 1.se tPr đá( 9 . 9 ) ;

26
HaQT Lập trình hướng đối tượng

22 cuốn sách 1.bộQty(99); Hệ thống.


ngoài.in(cuốn sách 1) ;
24 Hệ thống.ngoài.in(” isbn là: ”+cuốn sách 1.lấy tên( ) ) ; Hệ thống.ngoài.in(
"tên là : "+cuốn sách 1.lấy tên( ) ) ; Hệ thống.ngoài.in(" giá là : "+cuốn
26 sách 1.nhận được giá trị( ) ) ; Hệ thống.ngoài.in(”số lượng là:”+cuốn sách
1.nhận được số lượng( ) ) ; Hệ thống.ngoài.in(“tác giả là:”+cuốn sách 1.
28 lấy tác giả( ) ) ; // Tác giả

→ toSt ri ng ( )
Hệ thống.ngoài.in(" Tên tác giả : "+cuốn sách 1.lấy Tên tác giả( ) ) ; Hệ thống.ngoài.in(”
30 Tên tác giả:”+cuốn sách 1.lấy tác giả( ) .lấy tên( ) ) ; Hệ thống.ngoài.in(”email của tác giả:”
+cuốn sách 1.lấy tác giả( ) .nhận đượcEmail( ) ) ;
32 }
}

Sản lượng dự kiến là:

Cửa sổ lệnh

1Tác giả [tên = Tan Ah Teck, email = ahteck@nowhere. com]


Tác giả [ tên = Tan Ah Teck, email = ahteck@somewhere. com]
3Tên là: Tan Ah Teck

email là: ahteck@somewhere. com


5Sách [ isbn = 12345 ,name = Javavìđồ ngốc , Tác giả [ tên = Tan Ah Teck ,

email = ahteck@somewhere. com] , giá = 8 . 8 , số lượng = 88]


Sách [ isbn = 12345 , tên = Javavìđồ ngốc , Tác giả [ tên = Tan Ah Teck ,
email = ahteck@somewhere. com] , giá = 9 . 9 , số lượng = 99]
7 isbn là : Java vì đồ giả
tên là : Java vì đồ giả
9 giá là : 9,9
số lượng là: 99
11tác giả là: Tác giả [ tên = Tan Ah Teck, email = ahteck@somewhere. com]
Tên tác giả: Tan Ah Teck
13Tên tác giả: Tan Ah Teck

email của tác giả: ahteck@somewhere. com

2.4 Lớp Khách hàng và Hóa đơn


Một lớp có tên là Khách hàng, mô hình hóa một khách hàng trong một giao dịch, được thiết kế như
thể hiện trong sơ đồ lớp. Một lớp có tên là Hóa đơn, mô hình hóa đơn cho một khách hàng cụ thể và
tạo một phiên bản của Khách hàng làm biến phiên bản của nó, cũng được hiển thị. Viết các lớp
Khách hàng và Hóa đơn.

27
HaQT Lập trình hướng đối tượng

Dưới đây là trình điều khiển thử nghiệm:

/∗∗
2 ∗ Bài kiểm tra tài xế lớp học
∗/
4 công cộng lớp họcKiểm tra chính {
công cộng khoảng trống tĩnh chủ yếu(Sợi dây[ ] lập luận) {
6
// Kiểm tra lớp Khách hàng
số 8 Khách hàng khách hàng1=mớiKhách hàng(88 ,“Tân Ah Teck”, 10); Hệ thống.
ngoài.in(khách hàng1) ; // Mục tiêu của khách hàng ( )

28
HaQT Lập trình hướng đối tượng

10
khách hàng1.bộGiảm giá(số 8) ; Hệ
12 thống.ngoài.in(khách hàng1) ;
Hệ thống.ngoài.in(” id là: ”+khách hàng1.lấy ID( ) ) ; Hệ thống.ngoài.in("tên là : "+
14 khách hàng1.lấy tên( ) ) ; Hệ thống.ngoài.in(” ý tôi là: ”+khách hàng1.được giảm giá
());
16
// Kiểm tra lớp Invo i ce
18 Invo i ce i nvo i ce1=mớiHóa đơn(101 ,c1, 888 .8) ; Hệ thống.
ngoài.in(inv1) ;
20
tôi đến với tôi ce1.bộSố lượng( 999 . 9 ) ; Hệ
22 thống.ngoài.in(tôi đến với tôi ce1) ;
Hệ thống.ngoài.in(” id là: ”+tôi đến với tôi ce1.lấy ID( ) ) ;
24 Hệ thống.ngoài.in(”khách hàng là:”+tôi gọi ic e1.lấy khách hàng( ) ) ; //

→ Sự cố gắng của khách hàng ( )
Hệ thống.ngoài.in(”số tiền là:”+tôi đến với tôi ce1.nhận được số tiền( ) ) ; Hệ thống.ngoài.in(”
26 id của khách hàng là:”+tôi gọi ic e1.lấyID khách hàng( ) ) ; Hệ thống.ngoài.in(”tên khách
hàng là:”+tôi đến với tôi ce1.lấy tên khách hàng

→ ());
28 Hệ thống.ngoài.in(”số tiền của khách hàng là:”+tôi đến với tôi ce1.

→ nhận đượcKhách hàngGiảm giá( ) ) ;
Hệ thống.ngoài.printf(”số tiền sau khi giảm giá là : %.2 f%n”,inv1.

→ nhận được số tiền sau khi giảm giá( ) ) ;
30 }
}

Sản lượng dự kiến là:

Cửa sổ lệnh

1Tan Ah Teck (88) (10%)


Tân A Teck (88) (8%)
3 id là: 88
Tên là: Tan Ah Teck di
5 scount là: 8
Hóa đơn [ id = 101 , khách hàng = Tan Ah Teck (88) (8%) , số tiền = 888 . số 8 ]
7Hóa đơn [ id = 101 , khách hàng = Tan Ah Teck (88) (8%) , số tiền = 999 . 9]

mã số là: 101
9khách hàng là: Tan Ah Teck (88) (8%)
số tiền là: 999,9
11 khách hàng mã số là: 88
Tên khách hàng là: Tan Ah Teck Mức chiết
13 khấu của khách hàng là: 8 số tiền sau khi
giảm giá là: 919.91

29
HaQT Lập trình hướng đối tượng

2.5 Lớp Khách hàng và Tài khoản

Lớp Khách hàng mô hình hóa một khách hàng được thiết kế như thể hiện trong sơ đồ lớp. Viết mã cho lớp
Khách hàng và trình điều khiển thử nghiệm để kiểm tra tất cả các phương thức công khai.

Lớp Tài khoản mô hình hóa một tài khoản ngân hàng, thiết kế như thể hiện trong sơ đồ lớp, tạo một cá thể
Khách hàng (được viết trước đó) làm thành viên của nó. Viết mã cho lớp Tài khoản và trình điều khiển thử
nghiệm để kiểm tra tất cả các phương thức công khai.

30
HaQT Lập trình hướng đối tượng

2.6 Lớp MyPoint


Một lớp có tên MyPoint, mô hình hóa một điểm 2D với tọa độ x và y, được thiết kế như thể
hiện trong sơ đồ lớp.

Nó chứa:

• Hai biến thể hiệnx(int) Vày(int).

• Một hàm tạo mặc định (hoặc "không có đối số" hoặc "không có đối số") xây dựng một điểm tại vị
trí mặc định của (0,0).

• Một hàm tạo quá tải xây dựng một điểm có tọa độ x và y cho trước.

• Getter và setter cho các biến thể hiệnxVày.

• Một phương thức setXY() để thiết lập cả haixVày.

• Một phương thức getXY() trả vềxVàytrong mảng int 2 phần tử.

• MỘTtoString()phương thức trả về mô tả chuỗi của phiên bản ở định dạng ”(x, y)”.

• Một phương pháp được gọi làkhoảng cách(int x, int y)trả về khoảng cách từ điểm này đến
điểm khác tại điểm đã cho (x, y) tọa độ, ví dụ:

điểm MyPoint1=mớiQuan điểm của tôi(3 , 4) ;


2 Hệ thống.ngoài.in(Điểm 1.khoảng cách(5 , 6) ) ;

31
HaQT Lập trình hướng đối tượng

• Khoảng cách quá tải (MyPoint another) trả về khoảng cách từ điểm này đến phiên bản
MyPoint đã cho (được gọi là điểm khác), ví dụ:

1điểm MyPoint1=mớiQuan điểm của tôi(3 , 4) ;


điểm MyPoint2=mớiQuan điểm của tôi(5 , 6) ;
3Hệ thống.ngoài.in(Điểm 1.khoảng cách(điểm2) ) ;

• Một phương thức khoảng cách () bị quá tải khác trả về khoảng cách từ điểm này đến điểm gốc
(0,0), ví dụ:

điểm MyPoint1=mớiQuan điểm của tôi(3 , 4) ;


2 Hệ thống.ngoài.in(Điểm 1.khoảng cách( ) ) ;

Bạn được yêu cầu:


1. Viết mã cho lớp MyPoint. Đồng thời viết một chương trình thử nghiệm (được gọi là TestMyPoint) để kiểm tra tất
cả các phương thức được xác định trong lớp.

gợi ý

1 //Khoảng cách phương thức nạp chồng ( )


// Phiên bản này lấy hai số nguyên làm đối số công cộng
3 gấp đôi khoảng cách(tôi tôi không y){
tôi không xDi ff = khôngx, cái này.x−x
5 tôi không yDi ff = ;......
trở lại Toán học.mét vuông(xDi ff∗xDi ff + yDi ff∗yDi ff) ;
7 }

9//Phiên bản này lấy phiên bản MyPoint làm đối số


công cộng gấp đôi khoảng cách(MyPoint khác){ cái này.
11 tôi không xDi ff= x−khác.x;
.......
13 }

// Chương trình thử nghiệm để kiểm tra tất cả các nhược điểm và phương pháp công khai
2 điểm MyPoint1=mớiQuan điểm của tôi( ) ; // Kiểm tra cấu trúc // Kiểm
Hệ thống.ngoài.in(Điểm 1) ; tra theo hướng dẫn ( )
4
// Trình cài đặt thử nghiệm
6 Điểm 1.setX(số 8) ;

32
HaQT Lập trình hướng đối tượng

Điểm 1.setY(6);
số 8
// Bộ lấy mẫu thử
10Hệ thống.ngoài.in(”xi:”+Điểm 1.getX( ) ) ;
Hệ thống.ngoài.in(” ừ : ”+Điểm 1.nhận được Y( ) ) ; p1.tậpXY
12 (3, 0); // Tập kiểm traXY ( ) Hệ
thống.ngoài.in(Điểm 1.getXY( ) [ 0 ] ) ; // Bài kiểm tra lấyXY ( )
14Hệ thống.ngoài.in(Điểm 1.getXY( ) [ 1 ] ) ;

Hệ thống.ngoài.in(Điểm 1) ;
16
điểm MyPoint2=mớiQuan điểm của tôi(0 , 4) ; // Kiểm tra một nhược điểm khác
18 Hệ thống.ngoài.in(điểm2) ;

20 // Kiểm tra khoảng cách các phương thức nạp chồng ( ) Hệ


thống.ngoài.in(Điểm 1.khoảng cách(điểm2) ) ; // cái mà phiên bản ?
22Hệ thống.ngoài.in(điểm2.khoảng cách(Điểm 1) ) ; // cái mà phiên bản ?
Hệ thống.ngoài.in(Điểm 1.khoảng cách(5 , 6) ) ; // cái mà phiên bản ?
24Hệ thống.ngoài.in(Điểm 1.khoảng cách( ) ) ; // cái mà phiên bản ?

2. Viết chương trình phân bổ 10 điểm trong mảng MyPoint và khởi tạo là (1,1),(2,2)
, . . . ,(10,10).

gợi ý
Bạn cần phân bổ mảng cũng như từng phiên bản trong số 10 phiên bản MyPoint. Nói cách
khác, bạn cần phát hành 11 cái mới, 1 cái cho mảng và 10 cái cho phiên bản MyPoint.

Quan điểm của tôi[ ]điểm=mớiQuan điểm của tôi[ 1 0 ] ;


1 // Khai báo và cấp phát một

→ mảng MyPoint
vì(tôi khôngTôi= 0 ;Tôi<điểm.chiều dài; Tôi++ ){
3 điểm[Tôi] =mớiQuan điểm của tôi( . . ) ; // Phân bổ từng phiên bản MyPoint
}
5 // sử dụng vòng lặp để in tất cả các điểm

Ghi chú
Point là một thực thể chung mà JDK chắc chắn đã cung cấp cho tất cả các phiên bản.

2.7 Lớp MyLine và MyPoint


Một lớp có tên MyLine, mô hình hóa một đường có điểm bắt đầu tại (x1, y1) và điểm kết thúc tại (x2, y2),
được thiết kế như thể hiện trong sơ đồ lớp. Lớp MyLine sử dụng hai phiên bản MyPoint (được viết trong
bài tập trước) làm điểm bắt đầu và điểm kết thúc. Viết lớp MyLine. Đồng thời viết trình điều khiển thử
nghiệm để kiểm tra tất cả các phương thức công khai trong lớp MyLine.

33
HaQT Lập trình hướng đối tượng

2.8 Lớp MyCircle và MyPoint


Một lớp có tên MyCircle, mô hình một vòng tròn có tâm và bán kính, được thiết kế như thể hiện
trong sơ đồ lớp. Lớp MyCircle sử dụng một phiên bản MyPoint (được viết trong bài tập trước)
làm trung tâm của nó.

34
HaQT Lập trình hướng đối tượng

Lớp học có chứa:


• Hai biến thể hiện riêng tư:trung tâm(một phiên bản của MyPoint) vàbán kính(int).
• Một hàm tạo xây dựng một đường tròn có tâm (x, y) và bán kính cho trước.
• Một hàm tạo quá tải xây dựng MyCircle lấy phiên bản MyPoint làm tâm và bán
kính.

• Một hàm tạo mặc định xây dựng một đường tròn có tâm tại (0,0) và bán kính bằng 1.
• Nhiều getters và setters khác nhau.

• MỘTtoString()phương thức trả về mô tả chuỗi của phiên bản này ở định dạng
”MyCircle[radius = r, center = (x, y)]”. Bạn sẽ sử dụng lạitoString()của MyPoint.

• getArea()VàlấyChu vi()các phương thức trả về diện tích và chu vi của hình tròn này
theogấp đôi.

• MỘTkhoảng cách(MyCircle khác)phương thức trả về khoảng cách của các tâm từ phiên
bản này và phiên bản MyCircle đã cho. Bạn nên sử dụng MyPoint'skhoảng cách() phương
pháp tính khoảng cách này.

Viết lớp MyCircle. Đồng thời viết một trình điều khiển thử nghiệm (được gọi là TestMyCircle) để kiểm tra tất cả các phương thức công
khai được xác định trong lớp.

gợi ý

// Hàm tạo
2 công cộngvòng tròn của tôi(tôi khôngx,tôi khôngy,tôi khôngbán kính){
// Cần xây dựng cấu hình MyPoint cho các trung tâm khác nhau trung tâm=mớiQuan
4 điểm của tôi(x,y) ; cái này.bán kính=bán kính;

6 }
công cộngvòng tròn của tôi(Trung tâm MyPoint,tôi khôngbán kính){
số 8 // Một instance của MyPoint đã được người gọi xây dựng; chỉ cần gán . cái
này.trung tâm=trung tâm; . . . . . .
10
}
12 công cộngvòng tròn của tôi( ){
trung tâm=mớiQuan điểm của tôi( . . . . ) ; // nhược điểm của cấu trúc MyPoint
14 cái này.bán kính= . . . . . .
}
16
// Trả về tọa độ x của tâm của MyCircle này công khaigetCenterX( )
18 {
trở lạitrung tâm.getX( ) ; // không thể sử dụng center.x và x là riêng tư trong MyPoint
20 }

22//Trả về khoảng cách tâm của MyCircle này và MyCircle khác


ic công cộng đôikhoảng cách(MyCircle khác){

35
HaQT Lập trình hướng đối tượng

24 trở lạitrung tâm.khoảng cách(khác.trung tâm) ;// sử dụng khoảng cách ( ) của MyPoint
}

2.9 Lớp MyTriangle và MyPoint


Một lớp có tên MyTriangle, mô hình một hình tam giác có 3 đỉnh, được thiết kế như thể
hiện trong sơ đồ lớp. Lớp MyTriangle sử dụng ba phiên bản MyPoint (được tạo trong bài
tập trước) làm ba đỉnh.

Nó chứa:

• Ba biến thể hiện riêng tưv1, v2, v3 (phiên bản MyPoint), cho ba đỉnh.

• Một hàm tạo xây dựng MyTriangle với ba bộ tọa độ,v1 = (x1, y1), v2 = (x2, y2),v3 =
(x3, y3).

• Một hàm tạo quá tải xây dựng MyTriangle dựa trên ba phiên bản của My-Point.

• MỘTtoString()phương thức trả về một chuỗi mô tả của phiên bản ở định dạng
”MyTriangle[v1 = (x1, y1), v2 = (x2, y2), v3 = (x3, y3)]”.

• MỘTgetPerimeter()phương thức trả về độ dài của chu vi tronggấp đôi. Bạn nên
sử dụngkhoảng cách()phương pháp MyPoint để tính chu vi.

• Một phương phápprintType(), in ra "đều" nếu cả ba cạnh đều bằng nhau, "cân" nếu
bất kỳ hai trong ba cạnh nào bằng nhau, hoặc "scalene" nếu ba cạnh khác nhau.

Viết lớp MyTriangle. Đồng thời viết một trình điều khiển thử nghiệm (được gọi là TestMyTriangle) để kiểm tra tất cả các
phương thức công khai được xác định trong lớp.

36
HaQT Lập trình hướng đối tượng

2.10 Lớp MyRectangle và MyPoint


Thiết kế một lớp MyRectangle bao gồm hai phiên bản MyPoint ở góc trên bên trái và
góc dưới cùng bên phải. Vẽ sơ đồ lớp, viết mã và viết trình điều khiển kiểm tra.

37

You might also like