You are on page 1of 75

Ban học tập đoàn khoa CNPM

Chuỗi Training cuối học kì II năm học 2019 - 2020

Ban học tập Our Phone Email / Group


Khoa Công Nghệ Phần Mềm 0932 470 201 Bht.cnpm.uit@gmail.com
Trường ĐH Công Nghệ Thông 0366 27 27 03 fb.com/groups/bht.cnpm.uit/
Tin
Lập Trình Hướng Đối Tượng - OOP
Thời gian: 10h – 11h30 ngày 14/7

Địa điểm: Giảng đường 3

Trainer: Phạm Võ Di Thiên - KTPM2019


Phạm Nguyễn Minh Thắng - KTPM2019
Link đề thi
Nội dung

1. Lý thuyết
2. Bài tập vận dụng
1. Lý Thuyết
1. Constructor

Các phương thức thiết lập ( Constructors ): có nhiệm vụ


thiết lập các thông tin ban đầu của các đối tượng thuộc về lớp
đối tượng khi đối tượng được khai báo.
1. Constructor
Phân biệt các loại Constructor :
Phương thức thiết lập mặc định ( Default Constructors ): là
phương thức thiết lập các thông tin ban đầu cho đối tượng về lớp
bằng những giá trị mặc định ( do người lập trình quyết định ).

PhanSo: : PhanSo()
{
tu = 0;
mau = 1;
}
1. Constructor
Phương thức thiết lập sao chép ( Copy Constructors ) : là
phương thức nhận tham số đầu vào là 1 đối tượng cùng thuộc lớp .
Thông tin ban đầu của đối tượng sẽ giống hoàn toàn thông tin đối
tượng tham số đầu vào .
PhanSo: : PhanSo( const PhanSo& a )
{
tu = a.tu;
mau = a.mau;
}
1. Constructor
Phương thức thiết lập nhận tham số đầu vào ( Paremeterired
Constructors): Là thiết lập thông tin ban đầu cho các đối tượng
thông qua các tham số đầu vào. Constructor nhận tham số đầu vào
có thể sử dụng để ép kiểu.
PhanSo :: PhanSo(int a, int b) PhanSo :: PhanSo(int a)
{ {
tu = a; tu = a;
mau = b; mau = 1;
}
}
1. Constructor

Ứng dụng

Phanso::Phanso(int a = 1, int b = 1) Phanso a(4, 5), c;


{ c = a + 5;
tu = a; // c = a + Phanso(5)
mau = b;
}
1. Destructor
Các phương thức phá hủy ( Destructor ) : có nhiệm vụ thu hồi lại
các tài nguyên cấp phát cho đối tượng khi đối tượng hết phạm vi hoạt
động. Chỉ có 1 phương thức phá hủy trong 1 lớp.
Đoạn code sau có sai không ?

class PhanSo
void main() {
{
PhanSo a, b(3, 4), c(2, 5);
private: a = b + c;
int tu, mau; a = b + 3;
a = 5 + c;
public:
}
PhanSo (int tu=0, int mau=1);
PhanSo operator +(PhanSo);
};
Câu trả lời

Sai dòng a = 5 + c vì chưa có phương thức


cộng số nguyên với phân số trả về phân số.

Cách sửa lỗi :


friend PhanSo operator+(int , PhanSo ) ;
2. Phân biệt private, protected, public.

• Private : chỉ có thể truy cập được bởi chính class chứa nó.
• Protected : chỉ có thể truy cập được bởi chính class chứa
nó và các lớp kế thừa nó.
• Public : có thể truy cập từ bất kì đâu.

Private Protected Public


3. Hàm bạn, lớp bạn.
Hàm bạn (Friend Function): không thuộc lớp nhưng vẫn có
quyền truy cập vào thành phần private, protected.

class MyInt { int Get(MyInt a)


private: {
int Data = 1; return a.Data;
}
public:
friend int Get( MyInt );
};
3. Hàm bạn, lớp bạn.
Lớp bạn (Friend Class): là lớp có thể truy cập các thành
phần private, protected của lớp xem nó là bạn.
class A {
public: class MyInt {
… private:
int Data;
int getMyInt(MyInt n)
public:
{ friend class A;
return n.Data; };
}
};
4. Khái niệm về overload và override.

Override là một tính năng cho phép một lớp con cung cấp
một triển khai cụ thể của phương thức đã được cung cấp bởi một
trong các lớp cha của nó.
4. Khái niệm về overload và override.

class Dongvat class Cho : public Dongvat


{ {
protected: public:
string mausac; void Nhap();
};
int sochan;
void Cho::Nhap()
public: {
virtual void Nhap() = 0 ; cin >> mausac >> sochan;
}; };
4. Khái niệm về overload và override.

Overload function (Nạp chồng hàm) : cho phép sử


dụng cùng một tên gọi cho các hàm “giống nhau” (có cùng
mục đích). Nhưng khác nhau về kiểu dữ liệu tham số hoặc số
lượng tham số đầu vào.
4. Khái niệm về overload và override.
class MyInt {
public:
void print(int a) {
cout << "Printing : " << a << endl;
}
void print(int b , double c) {
cout << "Printing : " << b << c << endl;
}
};
4. Khái niệm về overload và override.

Overload operator: cho phép định nghĩa các phép


toán trên kiểu dữ liệu tự định nghĩa.
4. Khái niệm về overload và override.
Ví Dụ

PhanSo a, b, c; PhanSo Cong(const PhanSo& a);


//(a. Cong (b)). Xuat (); Void Xuat();
//c.Nhap(); Void Nhap();

cout << a + b;
cin >> c;
if (a > b) cout << “a lon hon
b”;
4. Khái niệm về overload và override.
PhanSo PhanSo : : operator+ (const PhanSo& a)
{

}
istream& operator>> (istream& is, PhanSo& a)
{
…// Thay thế từ cin bằng is, return is;
}
4. Khái niệm về overload và override.
bool PhanSo : : operator> (const PhanSo & a)
{

//return true hoặc false

}
ostream& operator<< (ostream& os, PhanSo a)
{
…// Thay thế từ cout bằng os, return os;
}
5. Hàm thuẩn ảo.

Hàm thuần ảo là hàm ( hay phương thức thuần ảo ) là


phương thức ảo không có nội dung . hàm thuần ảo được xác
định là một hàm virtual có kết thúc khai báo hàm là “= 0”
Ví dụ: virtual double tinhChuVi () = 0;
5. Lớp trừu tượng.

Lớp cơ sở trừu tượng (Abstract Class): lớp có ít nhất 1


phương thức được khai báo là hàm thuần ảo (pure virtual).

Trong trường hợp lớp cơ sở trừu tượng có tất cả các


phương thức là thuần ảo thì được gọi là interface (giao diện)
5. Lớp trừu tượng.
Ví dụ:
class Xe
{
private:
string ID;
string loai;
double gia_tien;
public:
virtual void Nhap() = 0;
virtual double TinhGiatien() = 0;
};
6. Các đặc điểm quan trọng của OOP
Trừu tượng hóa (Abstraction): Cách nhìn khái quát hóa về
một tập các đối tượng có chung các đặc điểm được quan tâm
(và bỏ qua những chi tiết không cần thiết).

Chó

Động Vật

Mèo
6. Các đặc điểm quan trọng của OOP

Đóng gói (Encapsulation): Nhóm những gì có liên quan với


nhau vào làm một, để sau này có thể dùng một cái tên để gọi
đến.
VD: các hàm/ thủ tục đóng gói các câu lệnh, các đối tượng đóng
gói dữ liệu của chúng và các thủ tục có liên quan.
6. Các đặc điểm quan trọng của OOP
Ví Dụ
class Xe { void Xe::Set(string s, int b)
{
private:
loai = s;
string loai; gia_tien = b;
double gia_tien; };
public: int Xe::Get_giatien()
void Set(string, int); {
int Get_giatien() return gia_tien;
}
};
6. Các đặc điểm quan trọng của OOP
Thừa kế (Inheritance): Cho phép một lớp D có được các
thuộc tính và thao tác của lớp C, như thể các thuộc tính và thao
tác đó đã được định nghĩa tại lớp D.
VD:
Kế Thừa
Con Cha

Kế Thừa
Tam Giác Cân Tam Giác
6. Các đặc điểm quan trọng của OOP
Lợi ích của kế thừa:
• Kế thừa cho phép xây dựng lớp mới từ lớp đã có
• Cho phép tổ chức các lớp chia sẻ mã chương trình chung, nhờ
vậy có thể dễ dàng sửa chữa, nâng cấp hệ thống.
Class Cũ Class Mẹ

Kế
Thừa

Class Mới Class Con 1 Class Con 2


6. Các đặc điểm quan trọng của OOP

Phạm vi Kiểu kế thừa


truy xuất Public Protected Private

Public Public Protected Private

Protected Protected Protected Private

Private Không kế Không kế Không kế


thừa thừa thừa
6. Các đặc điểm quan trọng của OOP

Kiểu kế thừa
Phạm vi
truy xuất Public Protected Private

Public Public Protected Private

Protected Protected Protected Private

Private Không kế Không kế Không kế


thừa thừa thừa
6. Các đặc điểm quan trọng của OOP

Kiểu kế thừa
Phạm vi
truy xuất Public Protected Private

Public Public Protected Private

Protected Protected Protected Private

Private Không kế Không kế Không kế


thừa thừa thừa
6. Các đặc điểm quan trọng của OOP
Đa hình (Polymorphism): Cơ chế cho phép một tên thao
tác hoặc thuộc tính có thể được định nghĩa tại nhiều lớp và có
thể có nhiều cài đặt khác nhau tại mỗi lớp trong các lớp đó.

Đi (Người)

Chuyển động Bay (Chim)


( Động vật )
Bơi (Cá)
7. Hàm Get/Set trong lớp
• Truy vấn dẫn xuất (Get): lấy giá trị thuộc tính của đối tượng.

int PhanSo : : GetTS() {


return tu;
}
• Cập nhật (Set): dùng để gán giá trị thuộc tính của đối tượng.

void PhanSo : : SetMS (int a){


mau = a ;
}
2. Bài Tập Thiết Kế Class
Câu 2 ( Đề 2018 - 2019)

Đề bài : Xây dựng lớp thời gian ( giờ ,phút ,giây ) với
các toán tử >>, << để nhập xuất và toán tử ++ để
tăng thời gian thêm 1 giây (3 đ)
Câu 2 ( Đề 2018 - 2019)
class Thoigian
{
private:
int gio, phut, giay;
public:
friend istream& operator>>(istream& is, Thoigian&);
friend ostream& operator<<(ostream& os, Thoigian);
Thoigian& operator++();
Thoigian operator++(int);
};
Câu 2 ( Đề 2018 - 2019)
istream& operator>>(istream& is, Thoigian& x)
{
is >> x.gio >> x.phut >> x.giay;
return is;
}
ostream& operator<<(ostream& os, Thoigian x)
{
os << x.gio << " " << x.phut << " " << x.giay;
return os;
}
Câu 2 ( Đề 2018 - 2019)
Thoigian& Thoigian::operator++() {
giay += 1;
if (giay == 60){ Đây là định nghĩa cho
giay = 0; phut += 1; phép toán ++a
if (phut == 60)
{
phut = 0; gio += 1;
if (gio == 24) gio = 0;
}
}
return *this; }
Câu 2 ( Đề 2018 - 2019)
Thoigian Thoigian::operator++(int) {
Thoigian p = *this;
giay += 1; Đây là định nghĩa cho
if (giay == 60) phép toán a++
{
....
}
return p;
}
Câu 2 ( Đề 2017 - 2018)
Câu 2 ( Đề 2017 - 2018)

Hãy định nghĩa lớp cNgay thích hợp để chương trình không bị
lỗi biên dịch và chạy
đúng. Lưu ý rằng không được chỉnh sửa hàm main và sinh viên
cần viết cả các lệnh #include thích hợp
Câu 2 ( Đề 2017 - 2018)
class cNgay {
private:
int dd, mm, yy;
public:
cNgay(int, int, int);
friend istream& operator>>(istream&, cNgay&);
friend ostream& operator<<(ostream&, cNgay);
bool operator<(const cNgay&);
};
Câu 2 ( Đề 2017 - 2018)
cNgay::cNgay(int a = 1, int b = 1, int c = 1)
{
dd = a; mm = b; yy = c;
}
istream& operator>>(istream& is, cNgay& x)
{
is >> x.dd >> x.mm >> x.yy;
return is;
}
Câu 2 ( Đề 2017 - 2018)

ostream& operator<<(ostream& os, cNgay x)


{
os << x.dd << x.mm << x.yy;
return os;
}
Câu 2 ( Đề 2017 - 2018)
bool cNgay::operator<(const cNgay& x) {
if (x.yy > yy) return true;
else if (x.yy < yy) return false;
else {
if (x.mm > mm) return true;
else if (x.mm < mm) return false;
else {
if (x.dd > dd) return true;
else if (x.dd <= dd) return false; } } }
Câu 2 ( Đề 2017 - 2018)
class cNgay {
private:
int dd, mm, yy;
public:
cNgay(int, int, int);
friend istream& operator>>(istream&, cNgay&);
friend ostream& operator<<(ostream&, cNgay);
friend bool operator<(const cNgay&, const cNgay&);
};
Câu 2 ( Đề 2017 - 2018)
bool operator<(const cNgay& a, const cNgay& b) {
if (a.yy < b.yy) return true;
else if (a.yy > b.yy) return false;
else {
if (a.mm < b.mm) return true;
else if (a.mm > b.mm) return false;
else {
if (a.dd < b.dd) return true;
else if (a.dd >= b.dd) return false; }}}
Câu 2 ( Đề 2017 - 2018) - HK2

Xây dựng lớp Đa thức bậc n với các toán tử >> ,<< ,+
(3đ)
Câu 2 ( Đề 2017 - 2018) - HK2
class Dathuc {
private:
float* heso;
int bac;
public:
friend istream& operator>>(istream&, Dathuc&);
friend ostream& operator<<(ostream&, Dathuc);
Dathuc operator+(const Dathuc&);
};
Câu 2 ( Đề 2017 - 2018) - HK2
istream& operator>>(istream& is, Dathuc& x) {

- Yêu cầu nhập số bậc của đa thức ( x.bac ) (Lưu ý: nên


cho điều kiện x.bac < 0 )
- Tạo mảng hệ số ( x.heso ) chứa hệ số của các bậc ( có
thể dùng mảng cấp phát động )
- Nhập các hệ số.

return is;
}
Câu 2 ( Đề 2017 - 2018) - HK2
Dathuc Dathuc:: operator+(const Dathuc& x){
- Tạo Dathuc temp để lưu kết quả trả về của hàm.
- Gán bậc và hệ số của đa thức lớn hơn cho bậc và hệ số
của Dathuc temp (temp.bac và temp.heso).
- Gán biến Min bằng số bậc của đa thức nhỏ hơn.
- Tiến hành cộng hệ số của 2 đa thức có cùng số bậc ( thực
hiện vòng lặp chạy từ 0 đến Min )
- Cuối cùng return temp;
}
Câu 2 ( Đề 2017 - 2018) - HK2

ostream& operator<<(ostream& os, Dathuc x)


{
- Thực hiện vòng lặp để xuất kết quả
return os;
}
Định nghĩa phép toán ++ dưới dạng ++a(Prefix) và a++(Postfix)

Class PS (1) -Tăng đối tượng lên giá


{ trị kế tiếp.
Private: - Trả về tham chiếu
chính đối tượng đó.
int Tu,Mau;
Public:
… (2) -Tăng đối tượng lên giá
PS& operator++();//(1) trị kế tiếp
- Trả về giá trị bằng giá
PS operator++(int);//(2) trị đối tượng trước khi tăng
}
Định nghĩa phép toán ++ dưới dạng ++a(Prefix) và a++(Postfix)

PS& operator++();//(1) PS operator++(int);//(2)


(1) trả về một “biến” kiểu phân số, còn (2) chỉ trả về một “giá trị”.
Tại sao lại sử dụng tham chiếu cho (1) ? PS a(1,2), b(3,4);

- Vì trả về một biến nên có thể thực hiện lệnh : ++a = b; a++=b;
- Thực thi nhanh hơn.
- Một số đối tượng không thể sao chép như istream, ostream,…
- (1) trả về lvalue, (2) trả về rvalue (tham khảo).
Định nghĩa phép toán <<,>>
friend istream& operator >>(istream& is, PS &a);
friend ostream& operator <<(istream& os, PS a);
Vì không thể sao chép nên các đối tượng này cần trả về tham
chiếu để “cin”, “cout” liên tục.
VD: cin >> a >> b >> c;
is a b c PS a(1,2), b(3,4),c(5,6);
is

is
is
Định nghĩa phép toán <<,>>

PS operator++(int);//(1)
friend ostream& operator <<(istream& os, PS& a);//(2)
Trong một số trường hợp ở (2), tham chiếu đến đối tượng a sẽ
bị lỗi.
PS a(1,2);
VD: cout << a++;
- Bản chất của tham chiếu là sử dụng con trỏ.
- Do (1) trả về “giá trị”, không phải “biến”, mà “giá trị” thì không
có ô nhớ, do đó không thể tham chiếu được =>(2) lỗi.
Câu 3 đề thi các năm:
HK1_2018_2019:
• Trung tâm thể hình MTK của thị xã Dĩ An đã được khai trương và bắt đầu
đón nhận khách hàng.
• Mỗi khách hàng tham gia CLB của trung tâm có thể tùy chọn một trong 3
gói dịch vụ khác nhau là Premium (nâng cao), Basic (cơ bản), Non-member
(không thanh viên). Đây là phương thức mà trung tâm tiền hành để từng loại
đối tượng khách hàng
• Các dịch vụ khác: Yoga, Aerobic, Boxing, múa bụng, body combat.. dịch vụ
xông hơi và hỗ trợ từ huấn luyện viên cả nhân (PT) cũng sẽ được cung cấp.
• Mỗi khách hàng khi đăng kí sẽ phải điền thông tin họ tên và số CMND và
lựa chọn gói dịch vụ cũng như thời gian muốn sử dụng dịch vụ đó (theo
tháng).
HK1_2018_2019

Premium Basic Non-member


Phí cơ bản 1000 500 200
Chi phí lớp học Miễn phí 100/ lớp Không có
DỊch vụ xông hơi Miễn phí Không có Không có
Hỗ trợ PT Miễn phí 100 200

Lưu ý: Miễn phí: Khách hàng không chi trả thêm tiền khi đăng
kí tính năng này

Không có: Khách hàng sẽ không được cung cấp tính năng này
HK1_2018_2019

1. Xây dựng sơ đồ phân lớp kế thừa. (1 đ)

2. Cài đặt các lớp thích hợp. (2 đ)

3. Quản lý việc nhập xuất danh sách khách hàng. (1 d)

4. Trung tâm cần thông tin của những khách hàng đã chi tiêu nhiều nhất để
tiếnhành tư vấn gói dịch vụ thích hợp cho họ. Hãy viết phương thức thực
hiện chức năng này (1 đ)
HK1_2018_2019
HK2_2018_2019
Mô hình đặc điểm tính cách Big Five do trong 5 nét tính cách của con người:
- Sẵn sàng trải nghiệm (O). Tự chủ tận tâm (C).
- Hướng ngoại (E). Hòa đồng (A).
- Bất ổn cảm xúc (N)
Bài kiểm tra tâm lý theo Big Five Model có kết quả tương tự như sau: 093-C74-E31-A96-
N5. Các chữ cái đại diện cho mỗi nét tính cách, và những con số đại diện cho tỷ lệ %
những người ghi được điểm thấp hơn bạn so với từng nét tính cách.
Nhà tuyển dụng có thể phát hiện và tuyển chọn những nhân sự phù hợp với các vị trí
công việc, giúp nhà tuyển dụng lường trước được những nguy cơ có thể xảy đến đối
với một nhân sự của mình.
Trong đó có các trường hợp (tính cách) có nguy cơ cao mà nhà tuyển dụng tổ chức/
doanh nghiệp cần lưu ý.
Trên 70: chỉ số cao.
Dưới 30: chỉ số thấp.
Ngoài ra không xác định.
HK2_2018_2019
• 1. Nhập vào thông tin kết quả đánh giá tâm lý của một người. (1đ)
• 2. Nhập vào kết quả đánh giá tâm lý của n người trong danh sách. (0.5d)
• 3. Hãy cho biết những người có nguy cơ cao mà nhà tuyển dụng tổ chức/
doanh nghiệp cần lưu ý
• 4. Chọn một người trong danh sách và cho biết các thông tin về tính cách
của người đó
• Vi dụ: Một người có đánh giá tâm lý Big Five như sau: O70-C30-E60-A96-
N10
70 Sắn sàng trải nghiệm (0) Người có điểm cao ở yếu tố này thường là người thích
những ý tưởng mới, …
30 Tự chủ tận tâm (C) Người có điểm thấp ở yếu tố này thường dễ bỏ cuộc, khả năng chiu
áp lực, …
60 Hòa đồng dễ chịu (A) Người có điểm cao ở yếu tố này thường thân thiện, cời mở,…
96 …
10 …
HK2_2018_2019
HK1_2017_2018

Công ty quản lý ca sỹ XYZ cần quản lý các thông tin để tính


lương cho các ca sỹ thuộc công ty. Giả sử công ty XYZ chia các
ca sỹ thành 2 nhóm: ca sỹ “chưa” nổi tiếng và ca sỹ nổi tiếng.
Thông tin chung của cả 2 nhóm bao gồm:
- Họ tên ca sỹ.
- Số năm làm việc cho công ty.
- Số đĩa đã bán được.
- Số buổi trình diễn đã tham gia.
- Ngoài ra, ca sỹ nổi tiếng được mời tham gia nhiều Gameshow
nên còn có thêm thông tin: số gameshow tham gia.
HK1_2017_2018

Công ty quy định cách tính và trả lương cho ca sỹ như


sau:
- Với ca sỹ “chưa” nổi tiếng: Lương = 3.000.000 +
500.000 * số năm làm việc + 1.000 * số đĩa bán được
+ 200.000 * số buổi trình diễn.
- Với ca sỹ nổi tiếng: Lương = 5.000.000 + 500.000 * số
năm làm việc + 1.200 * số đĩa bán được + 500.000 *
số buổi trình diễn + 500.000 * số Gameshow.
- 1. Nhập danh sách ca sĩ (lưu trữ trong một mảng duy nhất) (1 đ)
- 2. Tìm ca sĩ có lương cao nhất trong công ty. Nếu có nhiều ca sĩ có cùng mức
lương cao nhất, chỉ cần trả về 1 ca sĩ trong số đó
HK1_2017_2018
HK2_2017_2018

Nhóm máu người cha


A B AB O
Nhóm A A,O A,B,AB,O A,B,AB A,O Dự đoán
máu khả
người năng
B A,B,AB,O B,O A,B,AB B,O
mẹ nhóm
máu
AB A,B,AB A,B,AB A,B,AB A,B người
O A,O B,O A,B O con
HK2_2017_2018

Bảng khả năng tương thích hồng cầu


Người Người cho
nhận O- O+ A- A+ B- B+ AB- AB+
O- X
O+ X X
A- X X
A+ X X X X
B- X X
B+ X X X X
AB- X X X X
AB+ X X X X X X X X
HK2_2017_2018

• 1. Nhập danh sách các nhóm máu của một lớp người
• 2. Cho một bộ 3 nhóm máu của ba người: ba, mẹ, con. Kiểm
tra và đưa kết quả xem có phù hợp quy luật duy truyền
không?
• 3. Chọn một người X trong danh sách, liệt kê tất cả những
người có thể cho máu người này
HK2_2017_2018
Ban học tập đoàn khoa CNPM
Chuỗi Training cuối học kì II năm học 2019 - 2020

HẾT
Cảm ơn các bạn đã theo dõi
Chúc các bạn có kết quả thi thật
tốt !

Ban học tập Our Phone Email / Group


Khoa Công Nghệ Phần Mềm 0932 470 201 Bht.cnpm.uit@gmail.com
Trường ĐH Công Nghệ Thông 0366 27 27 03 fb.com/groups/bht.cnpm.uit/
Tin

You might also like