Professional Documents
Culture Documents
OOP2024 JavaExercises Lab4 OOP-ClassesAnhObjects - En.vi
OOP2024 JavaExercises Lab4 OOP-ClassesAnhObjects - En.vi
com
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:
• Đọ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()).
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
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.
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
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 ∗/
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 }
// 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.
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
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 ∗/
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:
toString()được gọi ngầm khi một thể hiện được truyền cho phương thức println(),
ví dụ:
6
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 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
Cửa sổ lệnh
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 ∗/
Cửa sổ lệnh
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 ( ) ;
10
HaQT Lập trình hướng đối tượng
Dự kiến ra là:
Cửa sổ lệnh
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 ∗/
Cửa sổ lệnh
un i tpr i ce là : 0,99
7 Tổng số là : 989.01
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
HaQT Lập trình hướng đối tượng
}
}
31
Cửa sổ lệnh
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.
• Một phương phápđặt giá trị()để thiết lập giá trị của số phức.
gợi ý
• 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 ý
• 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 ý
15
HaQT Lập trình hướng đối tượng
gợi ý
• 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( . . , . . . ) ;
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
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
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.
( 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
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 ý
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 }
19
HaQT Lập trình hướng đối tượng
• 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
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;
(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.)
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
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);
22
HaQT Lập trình hướng đối tượng
• 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ụ,
↪→ ());
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ã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
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
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ử
25
HaQT Lập trình hướng đối tượng
/∗∗
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 {
26
HaQT Lập trình hướng đối tượng
Cửa sổ lệnh
27
HaQT Lập trình hướng đối tượng
/∗∗
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 }
}
Cửa sổ lệnh
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
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
Nó chứa:
• 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.
• 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ụ:
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ụ:
• 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ụ:
gợi ý
// 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) ;
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.
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.
33
HaQT Lập trình hướng đối tượng
34
HaQT Lập trình hướng đối tượng
• 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 }
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
}
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
37