IT002 - LAP TRINH HUONG BOI TUQNG getGiaTien f return giaTien; e - Sự kế thừa là một mức cao hơn của trừu tượng hóa, cung cấp một cơ chế gom chung các lớp có liên quan với nhau thành mộ
Trang 1DAI HOC QUOC GIA THANH PHO HO CHi MINH TRUONG DAI HOC CONG NGHE: THONG TIN KHOA CONG NGHE PHAN MEM
⁄Z
MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG BÀI TẬP THỤC HÀNH NHÓM CUỐI MÔN GVHD: Nguyễn Ngọc Quí
Sinh viên thực hiện:
- _ Nguyễn Trần Hoài Bảo - 23520130
- Tran Gia Bao - 23520139
- Nguyễn TrọngAnh - 23520068
Trang 2IT002 - LAP TRINH HUONG BOI TUQNG
NHAN XET CUA GIAO VIEN HUONG DAN
se _ ngay thang ndm 2024
Người nhận xét (Ký tên và ghi rõ hỌ tên)
2|Page
Trang 3IT002 - LAP TRINH HUONG BOI TUQNG
MUC LUC Ndi dung bai lam
Trang 4IT002 - LAP TRINH HUONG BOI TUQNG
thái nội bộ,
phương thức thực hiện nhiệm vụ nội
bộ
Thuộc tính và phương thức cần sử dụng bởi lớp con Ví dụ: thuộc tính lưu trữ thông tin chung cho lớp con, phương thức thực hiện nhiệm vụ chung cho lớp con
Thuộc tính và phương thức cần sử dụng bởi bên ngoài
Bảo mật thông tin, hạn chế việc truy xuất từ bên ngoài
Tái sử dụng
và cải tiến các phương thức từ lớp cha bởi lớp con,
Cho phép truy cập từ bất kỳ nơi nào trong
4|Page
Trang 5IT002 - LAP TRINH HUONG BOI TUQNG
Ví dụ: thuộc | chương tính lưu trữ | trình
thông tin cần truy cập từ bên ngoài, phương thức cung cấp chức năng cho lớp khác sử dụng
cout << "Gia tien xe BMW: " << bmw.giaTien;
Microsoft Visual Studio Debu:
Trang 6IT002 - LAP TRINH HUONG BOI TUQNG
getGiaTien() f return giaTien;
e - Sự kế thừa là một mức cao hơn của trừu tượng hóa, cung cấp một cơ chế gom chung các lớp có liên quan với nhau thành một mức khái quát hóa đặc trưng cho toàn bộ các lớp nói trên
Lợi ích của kế thừa:
e - Tái sử dụng mã: Kế thừa giúp giảm thiểu sự lặp lại trong code bằng cách cho phép các lớp con sử dụng lại các thuộc tính và phương thức đã được định nghĩa trong lớp cha Điều này giúp tiết kiệm thời gian và công sức cho lập trình viên, đồng thời giảm thiểu lỗi trong code
e - Tính phân cấp: Kế thừa giúp tạo ra cấu trúc phân cấp giữa các lớp, thể hiện mối quan hệ is-a (là một loại của) giữa các lớp Điều này giúp tổ chức code một cách logic và dễ hiểu hơn
¢ Tinh linh hoạt: Kế thừa giúp mở rộng chức năng của các lớp hiện có một cách dễ dàng bằng cách tạo ra các lớp con mới Điều này giúp code thích ứng tốt hơn với những thay đổi về yêu cầu
Tính đa hình: Kế thừa là nền tẳng cho đa hình trong OOP, cho phép các đối tượng của các lớp con phản hồi theo những cách khác nhau đối với cùng một phương thức
Trang 7IT002 - LAP TRINH HUONG BOI TUQNG
Ví dụ về lợi ích của kế thừa
Giải thích về ví dụ minh họa:
e - Tái sử dụng mã nguồn: Khi lớp Coder kế thừa từ lớp Nhanvien, nó sẽ thừa hưởng tất cả các thành phần public và protected của lớp Nhanvien, bao gồm cả constructor Điều này giúp tránh việc lặp lại việc viết mã cho các thành phân mà Coder cũng cần sử dụng
e Mởrộng chức năng: Lớp Coder có thể mở rộng hoặc mở rộng lại các thành phần của lớp Nhanvien Trong trường hợp này, lớp Coder thêm một thành phần mới là NgonNguYeuThich, mà một nhân viên của loại này sẽ có một ngôn ngữ lập trình mà họ ưa thích Bằng cách này, chúng ta có thể mở rộng tính năng của lớp Nhanvien mà không cần phải thay đổi lớp gốc
12 Câu2
a) Hãy cho biết kết quả xuất ra màn hình khi thực thi đoạn chương trình trên Giải thích ngắn gọn tại sao có kết quả đó
Constructing A Constructing B Destructing B Destructing A
Giải thích cho hiện tượng này cần chia phần két qua thanh 2 phan la contructor
và detructor
Contructor:
Trong C++, khi thực hiện thừa kế một lớp dẫn xuất từ lớp cơ sở, tạo một contructor cho lớp dẫn xuất thì lớp cơ sở sẽ được khởi tạo trước sau đó mới khởi tạo lớp dẫn xuất Điều đó giống như việc phải tạo ra một đối tượng cơ sở sau đó thêm những tính năng riêng biệt của lớp dẫn xuất Đảm bảo đối tượng lớp cơ sở được xây dựng hoàn toàn trước khi trình tạo lớp con có thể truy cập các thành viên của nó
Constructing A Constructing B
Ví dụ: Hãy tưởng tượng việc xây dựng một ngôi nhà (lớp con) trên nền móng (lớp cơ sở) Bạn sẽ không bắt đầu xây dựng các bức tường (chức năng của lớp con) trước khi nền móng (lớp cơ sở) hoàn thành
Detructor:
Trang 8IT002 - LAP TRINH HUONG BOI TUQNG
Bản chất của detructor là dọn dẹp các tài nguyên mà đối tượng này trong quá trình được dùng, thứ tự hủy này được cho là sẽ giúp việc “dọn dẹp” này diễn ra suôn sẻ và cho phép lớp dẫn xuất dọn sạch mọi tài nguyên cụ thể cho việc triển khai nó trước khi các hàm hủy của lớp cơ sở được gọi
Ví dụ: Khi muốn phá một ngôi nhà (lớp con) trên nên móng là lớp cơ sỞ, ta sẽ phải phá hủy ngôi nhà trước khi tiến hành phá đi nền móng của ngôi nhà đó b) Cho biét đoạn chương trình trên khi biên dịch có lỗi xảy ra hay không? Nếu có lỗi, hãy chỉ ra các lỗi đó và sửa lỗi để chương trình có thể thực thi được Chương trình trên có 3 lỗi sau:
- _ Đối tượng của lớp A được khai báo mà không có giá trị khởi tạo:
o_ Trong hàm main, đối tượng a của lớp A được khai báo nhưng không
có giá trị khởi tạo
o_ Để khắc phục, chúng ta cần khởi tạo a với một giá trị nào đó mang kiểu int ví du“ Aa(27);”
- Khong thé truy cap bién thanh vién private trong ham static f:
o_ Trong hàm f, chúng ta cố gắng truy cập vào biến thành viên x, nhưng nó không thể truy cập trực tiếp vì f là một hàm static trong lớp A
o_ Để truy cập x, ta cần tạo một đối tượng của lớp A trong hàm f và sau đó sử dụng biến x của lớp A đó
- _ Không thể truy cập biến thành viên private trong hàm f2:
o_ Trong hàm f2, cũng không thể truy cập trực tiếp vào biến thành viên x vì x là private
o_ Để truy cập x, chúng ta cần sử dụng hàm thành viên f2 thông qua một đối tượng của lớp A
- Stra lai:
8|Page
Trang 9IT002 - LAP TRINH HUONG BOI TUQNG
f2C) ‡{
return x :
main() { a(10);
ESL GVE return 0;
13 Câu 3
Header SinhVien
Trang 10IT002 - LAP TRINH HUONG BOI TUQNG
SinhVien
~SinhVien Nhap();
XetTotNghiep TinhDiemTrungBinh XuatThongTin
::XuatThongTin(} if
"Ma so sinh vi MaSoSinhVien
"Ho va ’ HoVaTen std::endl;
"Dia chi DiaChi std::endl;
ga TongSoTinChi << std: :endL;
7 DiemTrungBinh std: :endL;
TotNghiep ? tot nghiep" "Chua tot
10| Page
Trang 11IT002 - LAP TRINH HUONG BOI TUQNG
Header DaiHoc
Trang 12IT002 - LAP TRINH HUONG BOI TUQNG
Header CaoDang
12|Page
Trang 13IT002 - LAP TRINH HUONG BOI TUQNG
Main.cpp
Trang 14IT002 - LAP TRINH HUONG BOI TUQNG
14|Page
Trang 15IT002 - LAP TRINH HUONG BOI TUQNG
Phân tích để ta thấy được sinh viên Đại Học và sinh viên Cao Đẳng có các thuộc tính giống nhau là: mã số sinh viên, họ tên, địa chỉ, tổng số tín chỉ, điểm trung bình Vậy nên ta sẽ xây dựng lớp cơ sở SinhVien gồm những thuộc tính này Lớp dẫn xuất DaiHoc sẽ có thêm tên luận văn, điểm luận văn
Lớp dẫn xuất CaoDag sẽ có thêm điểm thi tốt nghiệp
Từ class diagram ta thấy được mô hình kế thừa trong bài này
Trang 16IT002 - LAP TRINH HUONG BOI TUQNG
© Sau khi nhập, xét xem trong numSinhVien có bao nhiêu sinh vien tốt nghiệp, không tốt nghiệp
e© _ Xuất thôn tin
Source code: [Google Drive|De1-Bai3
2.1 Câu I1: Trinh bày vé contructor, detructor
- Phương thức thiết lập (Constructor) và các dạng phương thức thiết lập;
- Phương thức huỷ bỏ (Destructor) trong lập trình hướng đối tượng
- Constructor mac dinh:
+ Là Constructor không có đối số Nó được gọi khi một đối tượng được tạo
mà không cung cấp bất kỳ đối số nào
+ Đối với constructor mặc định, nếu ta không cung cấp bất kỳ constructor nào, C++ sẽ tự sinh constructor mặc định là một phương thức rỗng
Ví dụ về constructor mặc định
- Constru
ctor cé
đối số:X + Là
Constructor
có tham số đầu vào để khởi tạo các thuộc tính của đối tượng
16|Page
Trang 17IT002 - LAP TRINH HUONG BOI TUQNG
Ví dụ về
Constructor
có đối số
- _ Copy Constructor là một loại constructor đặc biệt trong C++ được sử dụng
để tạo một đối tượng mới như là một bản sao của một đối tượng đã tồn tại Nó được gọi khi:
+ Đây là phương thức thiết lập có tham số là tham chiếu đến đối tượng thuộc chính lớp này
+ Một đối tượng được khởi tạo từ một đối tượng khác cùng loại
+ Một đối tượng được truyền vào hàm bằng giá trị
+ Một đối tượng được trả về từ một hàm bằng giá trị
Trang 18IT002 - LAP TRINH HUONG BOI TUQNG
Destructor trong class Person 2.2 Câu 2
a) Xây dựng class CDate
- Khai bao thuộc tính iDay, iMonth, iYear
- Khai bao constructor copy để tạo ra một sao mới của đối tượng CDate dùng cho mục đích thao tác mà không ảnh hưởng đến đối tượng CDate ban đầu
b) Operator >> và <<
- _ Hàm operator>> (toán tử nhập): Đây là hàm dùng để nhập dữ liệu từ một đối tượng istream Trong trường hợp này, nó sẽ nhập ba giá trị day, month, year của đối tượng CDate từ đầu vào
- _ Hàm operator<< (toán tử xuất): Dây là hàm dùng để xuất dữ liệu từ một đối tượng của lớp NgayThangNam ra một đối tượng ostream Trong
18|Page
Trang 19IT002 - LAP TRINH HUONG BOI TUQNG
trường hợp này, nó sẽ xuất ba giá trị day, month, year của đối tượng CDate
ra đầu ra, thường là cùng một dòng và được ngăn cách bằng dấu /
c) Xây dựng operator+ và operator-
- _ Hàm trả về số ngày trong tháng:
+ Dùng để xử lí năm nhuận với tháng 2 có 29 ngày trong tháng và phân biệt tháng có 30 ngày với tháng có 31 ngày
+ Điều kiện để kiểm tra năm nhuận:
* y%4==0: Năm phải chia hết cho 4
« - (y% 100!=0 || y % 400 == 0): Năm không chia hết cho 100 trừ khi nó cũng chia hết cho 400
+ Các tháng 4, 6, 9 và 11 luôn có 30 ngày Còn các tháng 1, 3, 5, 7, 8, 10, 12 đều có 31 ngày
Trang 20IT002 - LAP TRINH HUONG BOI TUQNG
+ Tiếp tục dùng if để kiểm tra xem tháng có vượt quá 12 hay không, nếu
có ta cần tăng năm lên và đặt giá trị tháng về lại tháng 1
- - ketQua.month ; giảm giá trị tháng đi 1
« - if(ketQua.month <= 0): Nếu tháng hiện tại nhỏ hơn hoặc bằng 0: ketQua.month = 12; đặt tháng về tháng 12
- _ ketQua.year ; giảm giá trị year đi 1
Trang 21IT002 - LAP TRINH HUONG BOI TUQNG
d) Ham Main
- _ Tạo đối tượng CDate và dùng operator >> để nhập ngày thang nam muốn thao tác vào chương trình
- _ Nhập vào n ngày muốn dùng để cộng trừ /
- Dung operator + dé tinh két qua khi cOng n ngay vao ngày đã nhập rồi in két qua
- Ding operator -X để tính kết quả khi trừ n ngày vào ngày đã nhập rồi in kết quả
e) Kết quả chạy chương trình
Trang 22IT002 - LAP TRINH HUONG BOI TUQNG
f) Source code: code
Câu 3: Xây dựng quản lý bài báo khoa học
Sơ đồ lớp:
BaiBao.h
22|Page
Trang 23IT002 - LAP TRINH HUONG BOI TUQNG
X
BaiBao.cpp
Trang 24IT002 - LAP TRINH HUONG BOI TUQNG
24|Page
Trang 25IT002 - LAP TRINH HUONG BOI TUQNG
Trang 26IT002 - LAP TRINH HUONG BOI TUQNG
DeTai.h
26|Page
Trang 27IT002 - LAP TRINH HUONG BOI TUQNG
GiangVien.h
Trang 28IT002 - LAP TRINH HUONG BOI TUQNG
Main.cpp
28|Page
Trang 29IT002 - LAP TRINH HUONG BOI TUQNG
Khi khởi động
Trang 30IT002 - LAP TRINH HUONG BOI TUQNG
30|Page
Trang 31IT002 - LAP TRINH HUONG BOI TUQNG
Source code: [GITHUB]DE18-BAI3
Trang 32IT002 - LAP TRINH HUONG BOI TUQNG
TAI LIEU THAM KHAO
32|Page