Định nghĩa lớp Test và phương thức main để khởi tạo các đối tượng của lớp trên và in ra màn hình các thuộc tính bằng phương thức get.. Các thuộc tính và phương thức xử lý ở lớp sách sinh
Trang 1TỔNG LIÊN ĐOÀN LAO ĐỘNG VIỆT NAM
TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO CUỐI KỲ
MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Trang 2TỔNG LIÊN ĐOÀN LAO ĐỘNG VIỆT NAM
TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO CUỐI KỲ MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Trang 3LỜI CẢM ƠN
Để hoàn thành bài tiểu luận này, không thể không kể đến sự hướng dẫn của Giảng viên Võ Hoàng Quân đã đứng lớp và hướng dẫn cho sinh viên húng em đi từ cnhững cái cơ bản nhất của môn Lập trình hướng Đối tượng, đồng thời cũng có một phần rất lớn của Thầy Dung Cẩm Quang phụ trách phần thực hành Và giờ chúng em
có thể có đủ kiến thức để hoàn thành bài cáo cáo cuối kỳ này, em xin cảm ơn!
Do đây cũng là lần đầu tiên em làm một bài báo cáo cuối kỳ nên không thể tránh khỏi những sai sót không đáng có, mặc dù em đã hạn chế đến mức tối đa những sai sót
Em rất mong nhận được những góp ý cũng như nhận xét của thầy để bài báo cáo của
em có thể hoàn thiện hơn Cuối cùng em xin chân thành cảm ơn!
Trang 4ĐỒ ÁN ĐƯỢC HOÀN THÀNH
TẠI TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG
Tôi xin cam đoan đây là sản phẩm đồ án của riêng tôi và được sự hướng dẫn của Thầy Võ Hoàng Quân Các nội dung nghiên cứu, kết quả trong đề tài này là trung thực
và chưa công bố dưới bất kỳ hình thức nào trước đây Những số liệu trong các bảng biểu phục vụ cho việc phân tích, nhận xét, đánh giá được chính tác giả thu thập từ các nguồn khác nhau có ghi rõ trong phần tài liệu tham khảo
Ngoài ra, trong đồ án còn sử dụng một số nhận xét, đánh giá cũng như số liệu của các tác giả khác, cơ quan tổ chức khác đều có trích dẫn và chú thích nguồn gốc Nếu phát hiện có bất kỳ sự gian lận nào tôi xin hoàn toàn chịu trách nhiệm
về nội dung đồ án của mình Trường đại học Tôn Đức Thắng không liên quan đến
những vi phạm tác quyền, bản quyền do tôi gây ra trong quá trình thực hiện (nếu có)
TP Hồ Chí Minh, ngày 24 tháng 07 năm 2021
Tác giả (ký tên và ghi rõ họ tên)
Phạm Văn Quốc Vĩnh
Trang 5PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN
Phần xác nhận của GV hướng dẫn
_ _ _ _ _ _ _
Tp Hồ Chí Minh, ngày tháng năm (kí và ghi họ tên)
Phần đánh giá của GV chấm bài
_ _ _ _ _ _ _
Tp Hồ Chí Minh, ngày tháng năm (kí và ghi họ tên)
Trang 6TÓM TẮT
Trong bài báo cáo này có 2 phần, phần 1 sẽ đi tìm hiểu chung về OOP bao gồm những kiến thức cơ bản và một số phần code để minh họa cho phần lý thuyết Phần 2 là câu hỏi lập trình mở, đòi hỏi vận dụng những kiến thức đã học để giải thích các vấn đề của đề bài, vẽ sơ đồ UML cũng như viết code hoàn chỉnh
Trang 7MỤC LỤC
LỜI CẢM ƠN i
PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN iii
TÓM TẮT iv
MỤC LỤC 1
CHƯƠNG 1 – BÀI LÀM PHẦN 1 2
1.1 Câu 1 2
1.2 Câu 2 5
CHƯƠNG 2 – BÀI LÀM PHẦN 2 7
2.1 Câu 1 7
2.2 Câu 2 14
2.3 Câu 3 15
2.4 Câu 4 21
2.5 Câu 5 22
Trang 8CHƯƠNG 1 BÀI LÀM PHẦN 1 –
1.1 Câu 1: Java
a Trình bày quy tắc đặt tên biến trong Java và cho ví dụ cụ thể một số tên biến
b Trình bày 03 trong số các kiểu dữ liệu nguyên thủy (primitive type) có trong Java
c Lập trình giải bài toán theo yêu cầu sau:
● Định nghĩa một lớp Calculator
● Định nghĩa phương thức public static boolean checkPrime(int n) để kiểm tra một số truyền vào có là số nguyên tố hay không? Nếu có thì phương thức n
trả về true, ngược lại trả về false
● Định nghĩa phương thức public static int calSumPrime(int n) để tính tổng
tất cả các số nguyên tố bé hơn hoặc bằng n truyền vào
● Viết phương thức main để kiểm tra lại các phương thức vừa định nghĩa trên
Bài làm
a
Trong Java có các quy tắc đặt tên biến như sau:
- Ký tự bắt đầu của tên biến phải là chữ cái dấu gạch dưới, ( _ ) hoặc ký tự
dola ($) và không bắt đầu bằng số
Ví dụ: name, _name, $name
Các tên biến sai: 5name, @name, #name
- Không được có khoảng trắng giữa các ký tự của biến
Ví dụ: dayOfBirth, day_Of_Birth
Các tên biến sai: day Of Birth
- Không chứa các ký tự đặt biệt trong tên biến như !, @, #, %, &, …
Các tên biến sai: n@me, Count#
- Không đặt tên biến trùng với các keyword của Java
Ví dụ: abstract, for, if, do, while, int, float, boolean, …
Trang 9- Kiểu dữ liệu double: dùng để biểu diễn các số thực, tuy nhiên vùng giá trị
rộng hơn kiểu float Dùng để biểu diễn số thực 64 bit thay vì chỉ 32 bit như kiểu float Mặc định một số thực trong Java sẽ được hiểu là mang kiểu double
- Kiểu dữ liệu boolean: đây là kiểu dữ liệu logic chứa 1 trong 2 giá trị là
‘true’ hoặc ‘false’ Và giá trị mặc định của kiểu boolean khi mới được khởi
tạo là false
Trang 10}
}
Trang 111.2 Câu 2: Lớp và đối tượng
a Định nghĩa lớp SinhVien với các yêu cầu sau:
● Chứa ít nhất 03 thuộc tính bất kỳ (thuộc tính phải phù hợp với đối tượng là sinh viên) với access modifier là private
● Chứa ít nhất 02 phương thức khởi tạo bất kỳ
● Chứa các phương thức get, set cho đối tượng
b Định nghĩa lớp Test và phương thức main để khởi tạo các đối tượng của lớp trên
và in ra màn hình các thuộc tính bằng phương thức get
Bài làm
a
public class SinhVien
{
private String studentID;
private String studentName;
private int birthYear;
Trang 12public int getBirthYear(){
public static void main(String[] args){
SinhVien sinhVien1 = new SinhVien("52000123",
"Nguyen Van A", 2002);
System.out.println("Student ID: " +
System.out.println("Student Name: " +
sinhVien1.getStudentName()); System.out.println("Student Birth Year: " +
sinhVien1.getBirthYear()); }
}
Trang 13CHƯƠNG 2 BÀI LÀM PHẦN 2 –
2.1 Câu 1
Sinh viên viết đặc tả về đề tài Quản lý cửa hàng bán sách Trong đó, một lớp sách
và hai lớp kế thừa từ sách là sách văn học và tạp chí Các thuộc tính và phương thức xử lý ở lớp sách sinh viên tự định nghĩa, trong đó có 01 thuộc tính là giá gốc của sách, ít nhất 02 thuộc tính bất kỳ (phù hợp đối tượng là sách), 02 phương
thức khởi tạo bất kỳ, 01 phương thức abstract dùng để tính giá bán và 02
phương thức xử lý do sinh viên tự định nghĩa thêm (Các phương thức khởi tạo, getter/setter, toString, equals không được tính là phương thức xử lý)
Đối với lớp con sách văn học có ít nhất 02 thuộc tính là Tác giả và Năm xuất bản,
có 02 phương thức khởi tạo, 01 phương thức tính giá bán và 02 phương thức
xử lý khác Phương thức tính bán của sách văn học là giá gốc + 5% thuế Các phương thức xử lý khác do sinh viên tự định nghĩa thêm
Đối với lớp con tạp chí có ít nhất 02 thuộc tính là Ngày xuất bản và Nhà xuất bản, có 02 phương thức khởi tạo, 01 phương thức tính giá bán và 02 phương thức xử lý khác Phương thức tính bán của tạp chí là giá gốc + 10% thuế Các phương thức xử lý khác sinh viên tự định nghĩa thêm
Trong đặc tả phải giải thích: các thuộc tính trong bài là gì, các phương thức trong bài là gì, overload ở đâu, override ở đâu, tính kế thừa/đa hình/trừu tượng ở đâu, …
Bài làm
Theo như đề bài, phải thiết kế 3 lớp, bao gồm 1 lớp Sach là lớp cha (và cũng
là lớp abstract do chứa các phương thức abstract) và 2 lớp con kế thừatừ lớp Sach
là SachVanHoc và TapChi
Giải thích cụ thể các phương thức và thuộc tính của mỗi lớp như sau:
Trang 14* Lớp Sach:
- Thuộc tính:
o protected String tenSach: tên của sách
o protected double giaGoc: giá gốc của sách
o protected int soLuongConLai: số lượng sách còn lại của cửa hàng
- Phương thức:
o Phương thức khởi tạo:
▪ public Sach(): phương thức khởi tạo không có tham số
▪ public Sach(String tenSach, double giaGoc, int
soLuongConLai): phương thức khởi tạo có đầy đủ tham số
*Ở đây ta thấy được tính overloading (nạp chồng phương
thức) (nằm trong tính đa hình ở constructor, có 2 constructor )
đặt tên giống nhau nhưng tham số truyền vào khác nhau
o Phương thức getter và setter:
▪ public String getTenSach(): phương thức get tên sách
▪ public double getGiaGoc(): phương thức get giá gốc
▪ public int getSoLuongConLai(): phương thức get số lượng sách còn lại
▪ public void setTenSach(String tenSach): phương thức set tên sách
▪ public void setGiaGoc(double giaGoc): phương thức set giá gốc của sách
Trang 15▪ public void setSoLuongConLai(int soLuongConLai): phương thức set số lượng sách còn lại
o Phương thức xử lý:
▪ public abstract double tinhGiaBan(): phương thức abstract
dung để tính giá bán, mỗi loại sách có giá tính khác nhau và sẽ
được định nghĩa sau
▪ public abstract double giamGia(): phương thức abstract tính
số tiền giảm giá, mỗi loại sách có cách giảm giá khác nhau và
sẽ được định nghĩa sau
▪ public abstract double soTienPhaiTra(): phương thức
abstract tính tổng số tiền phải trả sau khi đã trừ giảm giá
▪ public boolean kiemTra(): phương thức kiểm tra xem quyển
sách cần tìm còn trong cửa hàng không, nếu số sách còn lại lớn hơn 0 tức còn sách thì trả về true, ngược lại nếu số sách
còn lại bằng 0 tức đã hết sách thì trả về false
o Phương thức toString:
▪ public String toString(): phương thức toString để trả về
chuỗi đại diện của đối tượng (ở đây là Sách) theo định dạng
mình mong muốn
Trang 16*Lớp SachVanHoc (kế thừa từ lớp Sach):
- Thuộc tính:
o private String tacGia: tác giả của sách
o private int namXuatBan: năm xuất bản của sách
- Phương thức:
o Phương thức khởi tạo:
▪ public SachVanHoc(String tenSach, double giaGoc, int
soLuongConLai, String tacGia, int namXuatBan): phương
thức khởi tạo có đầy đủ tham số
▪ public SachVanHoc(String tacGia, int namXuatBan):
phương thức khởi tạo chỉ có 2 tham số truyền vào
*Ở đây ta thấy được tính overloading (nạp chồng phương thức) (nằm trong tính đa hình ở constructor, có 2 constructor )
được đặt tên giống nhau nhưng tham số truyền vào khác nhau
o Phương thức getter và setter:
▪ public String getTacGia(): phương thức get tác giả của sách
▪ public int getNamXuatBan(): phương thức get năm xuất bản của sách
▪ public void setTacGia(String tacGia): phương thức set tác giả của sách
▪ public void setNamXuatBan(int namXuatBan): phương thức set năm xuất bản
Trang 17*Ở class này ta có 2 thuộc tính private sẽ ẩn đi với các lớp khác Muốn truy xuất ta dùng các phương thức public getter
và setter Đây là một ví dụ về tính đóng gói
o Phương thức xử lý:
▪ public double tinhGiaBan(): overriding (ghi đè) lại phương thức abstract tinhGiaBan() ở lớp Sach Được định nghĩa là
trả về giá gốc + 5% thuế
▪ public double giamGia(): overriding (ghi đè) lại phương
thức abstract giamGia() ở lớp Sach Được định nghĩa là nếu
lượng sách trong kho lớn hơn hoặc bằng 20 quyển thì sẽ giảm
giá 5% trên tổng giá bán đã bao gồm thuế
▪ public double soTienPhaiTra(): overriding (ghi đè) lại phương thức abstract soTienPhaiTra() ở lớp Sach Được
định nghĩa trả về số tiền cần thanh toán cuối cùng bao gồm là
tổng giá bán (đã tính thuế) trừ đi giảm giá (nếu có)
*Ta lại thấy tính đa hình ở việc ghi đè phương thức: cùng là
phương thức giống tên nhau nhưng ở mỗi class khác nhau lại
thực hiện chức năng khác nhau
Trang 18*Lớp TapChi (kế thừa từ lớp Sach):
- Thuộc tính:
o private String ngayXuatBan: ngày xuất bản của tạp chí
o private String nhaXuatBan: nhà xuất bản của tạp chí
- Phương thức:
o Phương thức khởi tạo:
▪ public TapChi(String tenSach, double giaGoc, int
soLuongConLai, String ngayXuatBan, String nhaXuatBan): phương thức khởi tạo có đầy đủ tham số
▪ public TapChi(String ngayXuatBan, String nhaXuatBan):
phương thức khởi tạo chỉ có 2 tham số truyền vào
*Ở đây ta thấy được tính overloading (nạp chồng phương
thức) (nằm trong tính đa hình ở constructor, có 2 constructor )
được đặt tên giống nhau nhưng tham số truyền vào khác nhau
o Phương thức getter và setter:
▪ public String getNgayXuatBan(): phương thức get ngày xuất bản của tạp chí
▪ public String getNhaXuatBan(): phương thức get nhà xuất bản của tạp chí
▪ public void setNgayXuatBan(String ngayXuatBan): phương thức set ngày xuất bản của tạp chí
▪ public void setNhaXuatBan(String nhaXuatBan): phương
thức set nhà xuất bản của tạp chí
Trang 19*Ở class này ta có 2 thuộc tính private sẽ ẩn đi với các lớp
khác Muốn truy xuất ta dùng các phương thức public getter
và setter Đây là một ví dụ về tính đóng gói
o Phương thức xử lý:
▪ public double tinhGiaBan(): overriding (ghi đè) l phương ại
thức abstract tinhGiaBan() ở lớp Sach Được định nghĩa là
trả về giá gốc + 10% thuế
▪ public double giamGia(): overriding (ghi đè) lại phương
thức abstract giamGia() ở lớp Sach Được định nghĩalà nếu lượng tạp chí trong kho lớn hơn hoặc bằng 10 quyển thì sẽ giảm giá 2.5% trên tổng giá bán đã bao gồm thuế
▪ public double soTienPhaiTra(): overriding (ghi đè) lại phương thức abstract soTienPhaiTra() ở lớp Sach Được
định nghĩa là trả về số tiền cần thanh toán cuối cùng bao gồm
tổng giá bán (đã tính thuế) trừ đi giảm giá (nếu có)
*Ta lại thấy tính đa hình ở việc ghi đè phương thức cùng là phương thức giống tên nhau nhưng ở mỗi class khác nhau lại
thực hiện chức năng khác nhau
Trang 202.2 Câu 2: Thiết kế sơ đồ lớp UML theo mô tả đề bao gồm cả các thuộc tính và
+ getGiaGoc(): double + getSoLuongConLai: int + setTenSach(tenSach: String): void + setGiaGoc(giaGoc: double): void + setSoLuongConLai(soLuongConLai: int): void
+ double tinhGiaBan() + double giamGia() + double soTienPhaiTra ()
+ getNhaXuatBan(): String + setNgayXuatBan(ngayXuatBan: String): void + setNhaXuatBan(nhaXuatBan: String): void
+ double tinhGiaBan() + double giamGia() + double soTienPhaiTra()
SachVanHoc
- tacGia: String
- namXuatBan: int
+ SachVanHoc(tenSach: String, giaGoc: double,
soLuongConLai: int, tacGia: String, namXuatBan: int)
+ SachVanHoc(tacGia: String, namXuatBan: int)
+ getTacGia(): String
+ getNamXuatBan(): int
+ setTacGia(tacGia: String): void
+ setNamXuatBan(namXuatBan: int): void
+ double tinhGiaBan()
+ double giamGia()
+ double soTienPhaiTra()
Trang 212.3 Câu 3: Cài đặt (code) các lớp như thiết kế ở phần 2.
Bài làm
*Lớp Sach:
public abstract class Sach{
protected String tenSach;
protected double giaGoc;
protected int soLuongConLai;
Trang 22public void setGiaGoc(double giaGoc){
public abstract double tinhGiaBan();
public abstract double giamGia();
public abstract double soTienPhaiTra();
public boolean kiemTra(){
public String toString(){
return "Ten Sach: "+this.tenSach + " - Gia Goc: " + this.giaGoc + " - So Luong Con Lai: "
+ this.soLuongConLai;
}