IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNGNỘI DUNG BÀI LÀMBài tập 1: Xây dựng lớp ngày tháng năm bao gồm:• Thuộc tính: iNgay, iThang, iNam• Phương thức: Nhap, Xuat, NgayThangNamTiepTheoYêu cầu: T
Trang 1ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINHTRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TINKHOA CÔNG NGHỆ PHẦN MỀM
MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
BÀI TẬP THỰC HÀNH X
GVHD: Nguyễn Ngọc Quí
Sinh viên thực hiện: Huỳnh Lê Đại Thắng
Tp Hồ Chí Minh, 02/2024
Trang 2IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN
……., ngày…… tháng……năm 2024
Người nhận xét (Ký tên và ghi rõ họ tên)
Trang 3IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
MỤC LỤC
Bài 1 5
Xây dựng lớp Ngày Tháng Năm 5
A) Nhap() 7
B) Xuat() 8
C) NgayThangNamTieptheo() 8
Bài 2 13
Xây dựng lớp phân số 13
A) Nhap() 16
B) Xuat() 17
C) RutGon() 17
D) Tong() 19
E) Hieu() 20
F) Tich() 22
G) Thuong() 22
H) SoSanh() 24
Bài 3 25
Xây dựng lớp số phức 25
A)Nhap() 27
B)Xuat() 27
C)Tong() 28
D)Hieu() 29
E)Tich() 30
F)Thuong 30
Bài 4 33
Xây dựng lớp Giờ Phút Giây 33
A)Nhap() 35
Trang 4IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
B)Xuat() 36C)TinhCongThemMotGiay() 37
Trang 5IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
NỘI DUNG BÀI LÀM
Bài tập 1: Xây dựng lớp ngày tháng năm bao gồm:
• Thuộc tính: iNgay, iThang, iNam
• Phương thức: Nhap(), Xuat(), NgayThangNamTiepTheo()
Yêu cầu: Thực hiện xây dựng lớp, vẽ class diagram và khai báo các thuộctính, phương thức Viết nội dung vào các phương thức đã khai báo Gọi cácphương thức trong hàm main()
Diagram của lớp NgayThangNam:
Hình 1: Diagram của lớp NgayThangNam
Code của lớp NgayThangNam:
cin >> iNgay >> iThang >> iNam ;
while ( iNgay > 29 && iThang == 2 ){
cout << "Nhap lai: " << endl;
cin >> iNgay >> iThang >> iNam ;
}
Trang 6IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
while ( iNgay > 31 || iThang > 12 ){
cout << "Nhap lai: " << endl;
cin >> iNgay >> iThang >> iNam ;
}
while ( iNgay > 28 && iThang == 2 && ( iNam % != || 4 0 ( iNam % 100 == 0 && iNam % 4
== 0 ))){
cout << "Nhap lai: " << endl;
cin >> iNgay >> iThang >> iNam ;
}
while ( iNgay > 30 && ( iThang == 2 || iThang == 4 || iThang == 6 || iThang
== 8 )){
cout << "Nhap lai: " << endl;
cin >> iNgay >> iThang >> iNam ;
}
}
void Xuat(){
cout << setw( 2 ) << setfill( '0' ) << iNgay << "/" << setw( 2 ) <<
setfill( '0' ) << iThang << "/" << iNam << endl;
}
set < int > se = { 1 , 3 , 5 , 7 , 8 , 10 12 , };
if ( iThang != 2 && se find( iThang ) != se end()) {
if ( iNgay == 31 && iThang == 12 ) {
Trang 7IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Nếu ngày lớn hơn 29 (và tháng là 2), yêu cầu nhập lại
+ Vòng lặp thứ hai: Kiểm tra ngày và tháng
Nếu ngày lớn hơn 31 hoặc tháng lớn hơn 12, yêu cầu nhập lại
+ Vòng lặp thứ ba: Kiểm tra ngày trong tháng 2 cho năm nhuận
Nếu ngày lớn hơn 28, tháng là 2 và năm không nhuận (hoặc năm chia hếtcho 100 và chia hết cho 4), yêu cầu nhập lại
+ Vòng lặp thứ tư: Kiểm tra ngày trong các tháng có 30 ngày
Nếu ngày lớn hơn 30 và tháng là 2, 4, 6, hoặc 8, yêu cầu nhập lại
Trang 8IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
+Xuat():
Hình 3: Mô tả hàm xuất+ Hàm Xuat() sử dụng cout để xuất ngày, tháng, năm theo thứ tự
+ Hàm sử dụng setw(2) và setfill('0') để định dạng ngày, tháng có 2 chữ số
- setw(2): Đặt độ rộng của trường xuất là 2 ký tự
- setfill('0'): Ký tự '0' được sử dụng để lấp đầy các khoảng trống nếungày, tháng có 1 chữ số
+NgayThangNamTiepTheo():
- Hàm NgayThangNamTiepTheo() có chức năng tính toán ngày tháng tiếptheo dựa trên ngày tháng hiện tại Hàm sử dụng các biến iNgay, iThang,iNam để biểu diễn ngày, tháng, năm
2 Thuật toán:
Hàm hoạt động dựa trên thuật toán sau:
Xác định trường hợp:
Tháng không phải tháng 2 và các tháng có 31 ngày:
- Ta sẽ sử dụng vector để lưu các tháng có 31 ngày và sử dụng hàmfind để tìm các tháng đó so sánh với iThang
- Nếu ngày bằng 31 và tháng bằng 12, tăng năm, đặt lại ngày vàtháng thành 1
- Nếu ngày bằng 31, tăng tháng và đặt lại ngày thành 1
- Nếu ngày chưa bằng 31, tăng ngày
Trang 9IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Hình 4: Mô tả thuật toán tính Ngày Tháng Năm tiếp theo trong
trường hợp tháng khác 2Tháng 2:
Hình 5: Mô tả thuật toán tính Ngày Tháng Năm tiếp theo trong
trường hợp tháng bằng 2
Trang 10IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
- Nếu ngày bằng 29 và năm nhuận, tăng tháng và đặt lại ngày thành 1
- Nếu ngày bằng 28 và năm nhuận hoặc năm chia hết cho 400, tăng tháng
Hình 6: Mô tả tập hợp set và cách thức hoạt động
Kiểm tra ngày:
So sánh ngày hiện tại với số ngày tối đa trong tháng
Xử lý trường hợp ngày 31 của tháng 12
Trang 11IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Xử lý năm nhuận:
Sử dụng thuật toán kiểm tra năm nhuận:
Hình 7: Các thuật toán kiểm tra năm nhuận
Năm chia hết cho 4 là năm nhuận, trừ các năm chia hết cho 100 nhưngkhông chia hết cho 400
Kiểm tra năm hiện tại có phải năm nhuận hay không
+ Sử dụng toán tử % để kiểm tra chia hết
- Kiểm tra điều kiện theo thứ tự:
Chia hết cho 400: Là năm nhuận
Chia hết cho 100: Không phải năm nhuận
Chia hết cho 4: Là năm nhuận
Nếu không thỏa mãn bất kỳ điều kiện nào, năm đó không phải là nămnhuận
iNgay chưa bằng 31, do đó iNgay được tăng lên 15
Ngày tháng tiếp theo: 15/03/2023
Hình 8.1: Đầu ra của trường hợp ví dụ
Trang 12IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Ngày tháng hiện tại: 31/12/2023
iNgay bằng 31 và iThang bằng 12
Do đó, iNam được tăng lên 2024, iNgay và iThang được đặt lại thành 1.Ngày tháng tiếp theo: 01/01/2024
Hình 8.2: Đầu ra của trường hợp ví dụ
Ngày tháng hiện tại: 28/02/2024
iNgay bằng 28 và iThang bằng 2
Năm 2024 là năm nhuận
Do đó, iNgay được tăng lên 29
Ngày tháng tiếp theo: 29/02/2024
Hình 8.3: Đầu ra của trường hợp ví dụ
- Năm 2023:
Tháng 2 chỉ có 28 ngày
Sau ngày 28/02/2023, ngày tiếp theo là 01/03/2023
Hình 8.4: Đầu ra của trường hợp ví dụ
Bài tập 2: Xây dựng lớp phân số:
• Thuộc tính: iTu, iMau
• Phương thức: Nhap(), Xuat(), RutGon(), Tong(), Hieu(), Tich(), Thuong(),SoSanh()
Trang 13IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Yêu cầu: Thực hiện xây dựng lớp, vẽ class diagram và khai báo cácthuộc tính, phương thức Viết nội dung vào các phương thức đã khaibáo Gọi các phương thức trong hàm main()
Diagram của lớp PhanSo
Code của lớp PhanSo:
#include <bits/stdc++.h>
usingnamespace std;
#define ll long long
int gcd( int a , int b ){
Trang 14IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
void PhanSo:: Nhap (){
cin >> iTu >> iMau ;
}
void PhanSo:: Xuat (){
if( iTu == iMau ) cout << 1 << endl ;
else if( iMau < ) cout << - iTu << << - iMau << endl;
else
cout << iTu << << iMau << endl;
}
void PhanSo:: RutGon (){
int res = gcd( iTu , iMau );
int mc = lcm(this-> iMau a iMau , );
tong iTu = mc / this-> iMau * this-> iTu + mc a / iMau a iTu * ;
tong iTu = this -> iTu * a iTu ;
tong iMau = this -> iMau * a iMau ;
Trang 15IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
int mc = lcm(this-> iMau a iMau , );
hieu iTu = mc / this-> iMau * this-> iTu - mc a / iMau a iTu * ;
thuong iTu = this -> iTu * a iMau ;
thuong iMau = this -> iMau * a iTu ;
thuong RutGon();
return thuong ;
}
bool PhanSo:: SoSanh ( PhanSo a ){
if( this -> iTu / this-> iMau > a iTu a / iMau ){
Trang 16IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Hình 9: Mô tả hàm nhập+Xuat():
Ouput: Xuất ra phân số dưới dạng iTu/iMau đã rút gọn
1 Thuật toán:
Trang 17IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Hàm RutGon() sử dụng thuật toán Euclid để tìm ước số chung lớn nhất(GCD) của tử số và mẫu số của phân số Sau khi tìm được GCD, hàm chia
cả tử số và mẫu số cho GCD để thu được phân số tối giản
Trang 18IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Hình 12.1: Output của ví dụ+Tong():
Hàm Tong() được sử dụng để tính tổng của hai phân số Dưới đây là
mô tả chi tiết cách thức hoạt động của hàm:
Hình 13: Mô tả hàm tính tổng
1 Thuật toán:
Hàm Tong() thực hiện các bước sau:
1 Biến và khởi tạo:
Hàm Tong() nhận một đối tượng PhanSo tên a làm tham số
Khai báo một biến PhanSo mới tên tong để lưu trữ kết quả
Gán giá trị này cho tong.iTu
Trang 19IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
4 Gán mẫu số cho phân số tổng:
Gán giá trị mc (LCM) cho tong.iMau
Hình 14: Mô tả hàm hiệu
Trang 20IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
1 Biến và khởi tạo:
Hàm Hieu() nhận một đối tượng PhanSo tên a làm tham số và khởi tạomột biến PhanSo mới tên hieu để lưu trữ kết quả
4 Gán mẫu số cho phân số hiệu:
Gán giá trị mc (LCM) cho hieu.iMau
Trang 21IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Rút gọn:
Gọi hàm RutGon (giả sử) -> trả về -1/4
Hình 14.1: Ouput của ví dụ+Tich(): được sử dụng để tính tích của hai phân số
PhanSo PhanSo:: Tich ( PhanSo a ){
PhanSo tong ;
tong iTu = this -> iTu * a iTu ;
tong iMau = this -> iMau * a iMau ;
return tong ;
}
Hình 15: Mô tả hàm tính tíchHàm Tich() thực hiện tính tích của hai phân số bằng cách:
- Nhân tử số của hai phân số
- Nhân mẫu số của hai phân số
Giả sử ta có hai phân số 1/2 và 3/4
Hình 16: Mô tả hàm tính thương
Trang 22IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Trả về biến thuong lưu trữ thương của hai phân số
Ví dụ: Giả sử ta có hai phân số 1/2 và 3/4
Trang 23IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
+SoSanh(): được sử dụng để so sánh hai phân số
2 Các bước thực hiện:
- Chuyển đổi thành giá trị thập phân:
- Chia tử số của this (iTu) cho mẫu số của this (iMau)
- Chia tử số của a (a.iTu) cho mẫu số của a (a.iMau)
- So sánh giá trị thập phân:
- So sánh hai giá trị thập phân thu được
Nếu giá trị thập phân của this lớn hơn giá trị thập phân của a, trả vềtrue
Ngược lại, trả về false
Ví dụ: Giả sử ta có hai phân số 1/2 và 3/4
Tính toán:
Giá trị thập phân của 1/2: 0.5
Giá trị thập phân của 3/4: 0.75
So sánh:
Vì 0.5 < 0.75, hàm SoSanh() trả về false
Hình 17.1: Output của ví dụ
Trang 24IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Bài tập 3: Xây dựng lớp số phức bao gồm:
• Thuộc tính: iThuc, iAo
• Phương thức: Nhap(), Xuat(), Tong(), Hieu(), Tich(), Thuong()
Yêu cầu: Thực hiện xây dựng lớp, vẽ class diagram và khai báo cácthuộc tính, phương thức Viết nội dung vào các phương thức đã khaibáo Gọi các phương thức trong hàm main()
Diagram của class SoPhuc:
Code của class SoPhuc:
Trang 25IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
SoPhucHieu(SoPhuc);
SoPhucTich(SoPhuc);
SoPhucThuong(SoPhuc);
};
void SoPhuc:: Nhap (){
cin >> iThuc >> iAo ;
}
void SoPhuc:: Xuat (){
cout << iThuc << (( iAo >= 0 ) ? " + " : " - " ) << abs ( iAo ) << "i" << endl ;
};
SoPhuc SoPhuc:: Tong ( SoPhuc a ){
SoPhuc tong ;
tong iThuc = this -> iThuc + a iThuc ;
tong iAo = this -> iAo + a iAo ;
return tong ;
}
SoPhuc SoPhuc:: Hieu ( SoPhuc a ){
SoPhuc hieu ;
hieu iThuc = this -> iThuc - a iThuc ;
hieu iAo = this -> iAo - a iAo ;
return hieu ;
}
SoPhuc SoPhuc:: Tich ( SoPhuc a ){
SoPhuc tich ;
tich iThuc = this -> iThuc * a iThuc - this -> iAo * a iAo ;
tich iAo = this -> iThuc * a iAo + a iThuc * this -> iAo ;
return tich ;
}
SoPhuc SoPhuc:: Thuong ( SoPhuc a ){
SoPhuc thuong ;
thuong iThuc = ( this -> iThuc * a iThuc + this-> iAo * a iAo ) (pow( a iThuc , 2 ) + pow( a iAo , )); 2
thuong iAo = ( a iThuc * this -> iAo - this -> iThuc * a iAo ) (pow( a iThuc , 2 ) + pow ( a iAo , )); 2
Trang 26IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Hình 19: Mô tả hàm xuất
2 Các bước thực hiện:
Kiểm tra phần ảo:
Nếu phần ảo (iAo) lớn hơn hoặc bằng 0, in "+" trước giá trị tuyệt đối củaphần ảo
Nếu phần ảo (iAo) nhỏ hơn 0, in "-" trước giá trị tuyệt đối của phần ảo
In ra từng phần:
In ra phần thực (iThuc)
In ra ký hiệu "+" hoặc "-" (tùy theo kết quả kiểm tra phần ảo)
In ra giá trị tuyệt đối của phần ảo (abs(iAo))
In ra "i"
Trang 27IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Ví dụ: Giả sử ta có số phức 3 + 4i
Hình 19.1: Output của ví dụ+Tong(): được sử dụng để tính tổng của hai số phức
Hình 20: Mô tả hàm xuấtKhởi tạo:
Hàm khởi tạo một biến SoPhuc mới tên tong để lưu trữ kết quả
Trả về biến tong lưu trữ tổng của hai số phức
Ví dụ: Giả sử ta có hai số phức 3 + 4i và 5 + 6i
Trang 28IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Hình 20.1: Output của ví dụ+Hieu(): được sử dụng để tính hiệu của hai số phức
Hình 21: Mô tả hàm hiệuCác bước thực hiện:
Trả về biến hieu lưu trữ hiệu của hai số phức
Ví dụ: Giả sử ta có hai số phức (3 + 4i) và (5 + 6i)
Trang 29IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Hình 22: Mô tả hàm tíchCác bước thực hiện:
Trang 30IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Hình 23: Mô tả hàm thươngCác bước thực hiện:
Phần ảo:
Tính tích của phần thực (a.iThuc) và phần ảo (this->iAo) của hai số phức,trừ đi tích của phần thực (this->iThuc) và phần ảo (a.iAo) của hai số phức.Chia kết quả này cho bình phương độ lớn của số phức a (pow(a.iThuc,2) +pow(a.iAo,2)) Gán giá trị tính được cho phần ảo (thuong.iAo) của kết quả.Trả về:
Trả về biến thuong lưu trữ kết quả (thương của hai số phức)
Trang 31IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Bài tập 4: Xây dựng lớp giờ phút giây:
• Thuộc tính: iGio, iPhut, iGiay
• Phương thức: Nhap(), Xuat(), TinhCongThemMotGiay()
Yêu cầu: Thực hiện xây dựng lớp, vẽ class diagram và khai báo cácthuộc tính, phương thức Viết nội dung vào các phương thức đã khaibáo Gọi các phương thức trong hàm main()
Diagram của class GioPhutGiay
Code của class GioPhutGiay:
cin >> gio >> phut >> giay ;
while( gio >24 || phut > 59 || giay > 59 ){
Trang 32IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
cout << "Nhap lai: " ;
cin >> gio >> phut >> giay ;
gio = ;
phut = ;
giay =0 ; }
} }
Trang 33IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Nhập dữ liệu:
Sử dụng lệnh cin để nhập giá trị cho ba biến gio, phut, và giay.Kiểm tra dữ liệu:
Sử dụng vòng lặp while để kiểm tra giá trị của ba biến
Nếu giá trị của gio lớn hơn 24, phut lớn hơn 59, hoặc giay lớn hơn 59,thông báo lỗi và yêu cầu nhập lại
Trang 34IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Vòng lặp while sẽ thực hiện vì gio (30) lớn hơn 24
Thông báo lỗi "Nhap lai: " được in ra
Người dùng nhập lại giá trị 23 59 59
Vòng lặp while kết thúc vì dữ liệu nhập vào hợp lệ
Hình 24.1: Output của ví dụ+Xuat(): được sử dụng để xuất giá trị của ba biến gio, phut, giay theo địnhdạng thời gian HH:MM:SS
Giải thích:
Dòng 1: Kiểm tra điều kiện gio < 10
Dòng 2-6: Nếu điều kiện đúng, thực hiện các lệnh để xuất thời gian theođịnh dạng HH:MM:SS với giờ có hai chữ số
setfill('0'): Đặt ký tự chỗ là '0' để thêm 0 vào trước nếu giờ là một chữ số.setw(2): Đặt chiều rộng trường xuất là 2 ký tự
Dòng 7: Xuất ký tự xuống dòng
Ví dụ:
Nhập gio = 9, phut = 30, giay = 15:
Output: 09:30:15 (Giờ có hai chữ số do có sử dụng setw(2) cho gio ngay cảkhi trong điều kiện if)
Hình 25: Output của ví dụ
Trang 35IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
+ TinhCongThemMotGiay(): thực hiện việc tăng thời gian lên mộtgiây
Hình 25: Mô tả hàm cộng thêm 1 giây
Các bước thực hiện:
Kiểm tra giây:
Kiểm tra xem giá trị của giay có nhỏ hơn 59 hay không
Tăng giây:
Nếu giay nhỏ hơn 59, tăng giá trị của giay lên 1 đơn vị (++giay).Kiểm tra phút (nếu cần):
Trang 36IT002 – LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Nếu giay bằng 59 (sau khi tăng), nghĩa là đã chuyển sang phút mới:Kiểm tra xem giá trị của phut có nhỏ hơn 59 hay không
Tăng giờ (nếu cần) hoặc reset về 00:00:00:
Nếu gio nhỏ hơn 23, tăng giá trị của gio lên 1 đơn vị (++gio)
Nếu gio bằng 23 (sau khi tăng), nghĩa là đã chuyển sang ngày mới:Gán giá trị 0 cho cả gio, phut, và giay để reset về thời gian 00:00:00
Ví dụ:
Giả sử thời gian ban đầu là 23:59:59:
Sau khi gọi TinhCongThemMotGiay(), thời gian sẽ trở thành00:00:00
Hình 26.1: Output của ví dụ
Link Drive Code:
https://drive.google.com/drive/folders/1AR8MVRFZRjtW0qkrOdWRV9rz19TwAed9?usp=sharing