• Phương thức: Diem, Diemint Hoanh, int Tung, Diemconst Diem &x, Xuat, GetTungDo, GetHoanhDo, SetTungDo, SetHoanhDo, TinhTien Yêu cầu: Thực hiện xây dựng lớp, vẽ class diagram và khai bá
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA 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 2
GVHD: Nguyễn Ngọc Quí Sinh viên thực hiện: Thái Bình Dương – 23520356
Tp Hồ Chí Minh, 04/2024
Trang 2NHẬ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 3MỤC LỤC
Bài tập 1: Xây dựng lớp điểm 5
Bài tập 2: Xây dựng lớp tam giác 9
Bài tập 3: Xây dựng lớp đa giác 15
Bài tập 4: Xây dựng lớp thí sinh 21
Trang 4DANH MỤC HÌNH ẢNH
Hình 1.1: Mô hình lớp của lớp Diem 5
Hình 1.2: Kết quả xuất ra sau khi nhập hoành độ và tung độ của một điểm 8
Hình 1.3: Kết quả đầy đủ của chương trình sau khi nhập điểm tịnh tiến 8
Hình 1.4: Kết quả chạy thử khác của chương trình Bài tập 1 8
Hình 2.1: Mô hình lớp của lớp TamGiac 9
Hình 2.2: Mô hình lớp của lớp Diem được điều chỉnh 10
Hình 2.3: Xuất ra màn hình sau khi nhập toạ độ 3 đỉnh A, B, C 13
Hình 2.4: Xuất ra màn hình toạ độ đỉnh A, B, C sau khi tịnh tiến 13
Hình 2.5: Xuất ra màn hình toạ độ đỉnh A, B, C sau khi phóng to 13
Hình 2.6: Xuất ra màn hình toạ độ ba đỉnh A, B, C sau khi thu nhỏ 13
Hình 2.7: Xuất ra màn hình toạ độ ba đỉnh A, B, C sau khi thực hiện phép quay 13
Hình 2.8: Kết quả chạy thử đầy đủ chương trình của Bài tập 2 14
Hình 2.9: Các kết quả chạy thử khác của chương trình Bài tập 2 14
Hình 3.1: Mô hình lớp của lớp DaGiac 15
Hình 3.2: Kết quả xuất ra khi nhập toạ độ của một đa giác có 4 đỉnh 19
Hình 3.3: Xuất màn hình toạ độ các đỉnh của đa giác sau khi tịnh tiến 19
Hình 3.4: Xuất màn hình toạ độ các đỉnh của đa giác sau khi phóng to 19
Hình 3.5: Xuất màn hình toạ độ các đỉnh của đa giác sau khi thu nhỏ 19
Hình 3.6: Xuất màn hình toạ độ các đỉnh của đa giác sau khi thực hiện phép quay 19
Hình 3.7: Kết quả chạy thử đầy đủ chương trình của Bài tập 3 20
Hình 3.8: Các kết quả chạy thử khác của Bài tập 3 20
Hình 4.1: Mô hình lớp của lop ThiSinh 21
Hình 4.2: Nhập vào số lượng thí sinh cần nhập và thông tin từng thí sinh 23
Hình 4.3: Kết quả chạy thử đầy đủ của Bài tập 4 24
Hình 4.4: Kết quả chạy thử của Bài tập 4 khi nhập số lượng thí sinh là 0 24
Hình 4.5: Kết quả chạy thử của Bài tập 4 khi không có thí sinh nào lớn hơn 15 25
Hình 4.6: Các kết quả chạy thử khác của Bài tập 4 25
Trang 5NỘI DUNG BÀI LÀM Bài tập 1: Xây dựng lớp điểm2
• Thuộc tính: iHoanh, iTung
• Phương thức: Diem(), Diem(int Hoanh, int Tung), Diem(const Diem &x), Xuat(), GetTungDo(), GetHoanhDo(), SetTungDo(), SetHoanhDo(), TinhTien()
Yêu cầu: Thực hiện xây dựng lớp, vẽ class diagram và khai báo các thuộc tính, phương thức Viết nội dung vào các phương thức đã khai báo Gọi các phương thức trong hàm main()
Hình 1.1: Mô hình lớp của lớp Diem
Trang 6Nội dung của các phương thức đã khai báo
• Diem(): Constructor mặc định
• Diem(int Hoanh, int Tung), Diem(const Diem &x): Các Constructor gán giá trị
Ở đây Constructor sẽ nhận giá trị Hoanh, Tung hoặc sẽ được truyền tham chiếu một biến có thuộc lớp Diem khác Giá trị sau khi được nhập hoặc truyền tham chiếu sẽ được lần lượt gán vào hai biến iHoanh và iTung
• Xuat(): Xuất hoành độ và tung độ của điểm
• GetTungDo(), GetHoanhDo(): Chỉ xuất ra hoành độ hoặc tung độ của điểm
• SetTungDo(), SetHoanhDo(): Hàm gán giá trị tung độ hoặc hoành độ được nhập vào điểm
• TinhTien(): Thực hiện phép tịnh tiến điểm Toạ độ của điểm sau khi tịnh tiến là toạ độ ban đầu cộng với giá trị tịnh tiến
▪ VD: Điểm A(2,3) sau khi tịnh tiến lên (2,5) sẽ có toạ độ là A’(4,6)
Trang 7Diem() : iHoanh(0), iTung(0) {}
Diem( int Hoanh, int Tung) : iHoanh(Hoanh), iTung(Tung) {}
Diem( const Diem &x) : iHoanh(x.iHoanh), iTung(x.iTung) {}
void Xuat() {
cout << "Hoanh do: " << iHoanh << "\n" ;
cout << "Tung do: " << iTung << "\n" ;
int tung, hoanh, ttTung, ttHoanh;
cout << "Nhap hoanh do va tung do: " ;
cin >> hoanh >> tung;
//Set gia tri tung va hoanh do roi xuat ra
p1.SetTungDo(tung);
p1.SetHoanhDo(hoanh);
p1.Xuat();
//Tinh tien
cout << "Nhap so diem tinh tien cua tung do va hoanh do: " ;
cin >> ttHoanh >> ttTung;
p1.TinhTien(ttHoanh,ttTung);
//In ket qua sau khi tinh tien
cout << "Hoanh do cua diem sau khi di chuyen: " <<
Trang 8Kết quả chạy thử
Khi nhập lần lượt hoành độ và tung độ của một điểm, cách nhau bởi dấu cách, ví dụ như
điểm có toạ độ (8;4) ở hình 1.3.1 dưới đây, ta sẽ được kết quả như sau:
Hình 1.2: Kết quả xuất ra sau khi nhập hoành độ và tung độ của một điểm
Tiếp tục nhập số điểm tịnh tiến của tung độ và hoành độ, giả sử là 6 và -4, ta sẽ được kết quả như sau:
Hình 1.3: Kết quả đầy đủ của chương trình sau khi nhập điểm tịnh tiến
Thử với các trường hợp khác, ta sẽ được kết quả như sau:
Hình 1.4: Kết quả chạy thử khác của chương trình Bài tập 1
Trang 9Bài tập 2: Xây dựng lớp tam giác
• Thuộc tính: Đỉnh A, B, C
• Phương thức: Nhap(), Xuat(), TinhTien, PhongTo(), ThuNho(), Quay()
Yêu cầu: Thực hiện xây dựng lớp, vẽ class diagram và khai báo các thuộc tính, phương thức Viết nội dung vào các phương thức đã khai báo Gọi các phương thức trong hàm main()
Hình 2.1: Mô hình lớp của lớp TamGiac
Ý tưởng bài làm: xây dựng thêm lớp Diem chứa toạ độ của các đỉnh
Ở Bài tập 2 và bài tiếp theo là Bài tập 3, do yêu cầu phải xuất ra màn hình các điểm là toạ độ gồm hoành độ và tung độ, nên kiểu dữ liệu cho đỉnh sẽ phải giống như là kiểu dữ liệu Diem như ở bài tập 1, do đó chúng ta cần phải xây dựng thêm lớp Diem
Hình 2.2 sau đây là mô hình lớp Diem có cấu trúc tương đồng với Bài tập 1, nhưng đã
được điều chỉnh lại để phù hợp với nhu cầu giải quyết bài toán
Trang 10Hình 2.2: Mô hình lớp của lớp Diem được điều chỉnh phục vụ cho việc xây dựng lớp TamGiac
Nội dung của các phương thức đã khai báo:
• Nhap(): Nhập từ bàn phím lần lượt hoành độ và tung độ của 3 đỉnh A, B, C
• Xuat(): Xuất ra màn hình toạ độ toạ độ đỉnh A, B, C dưới dạng A(x y , 1; 1)
B(x y2; 2), C(x y3; 3)
• TinhTien(): Thực hiện phép tịnh tiến điểm Toạ độ của điểm sau khi tịnh tiến là
toạ độ ban đầu cộng với giá trị tịnh tiến
• PhongTo(): Phóng to tam giác bằng cách lấy hệ số nhân lần lượt với hoành độ và
tung độ của mỗi điểm
• ThuNho(): Thu nhỏ tam giác bằng cách lấy hệ số chia lần lượt với hoành độ và
tung độ của mỗi điểm
• Quay(): Thực hiện phép quay tam giác bằng cách nhân lượng giác
▪ Giả sử có một điểm M có toạ độ (x y , muốn thực hiện phép quay và di 1; 1)
chuyển điểm qua toạ độ (x y2; 2), ta có công thức như sau:
, trong đó φ là góc quay được tính theo đơn vị độ
▪ Do trong C++ hai hàm sin và cos sử dụng đơn vị rad, nên ta phải có khai
báo thêm biến pi và chuyển đổi từ góc độ sang rad
Trang 11int iHoanh, iTung;
Diem() : iHoanh(0), iTung(0) {}
Diem( int Hoanh, int Tung) : iHoanh(Hoanh), iTung(Tung) {}
Diem( const Diem &x) : iHoanh(x.iHoanh), iTung(x.iTung) {}
cout << "Nhap toa do dinh A: " ;
cin >> dinhA.iHoanh >> dinhA.iTung;
cout << "Nhap toa do dinh B: " ;
cin >> dinhB.iHoanh >> dinhB.iTung;
cout << "Nhap toa do dinh C: " ;
cin >> dinhC.iHoanh >> dinhC.iTung;
Trang 12void Quay( float goc){
float theta = goc * pi / 180.0;
int iHoanhA = dinhA.iHoanh, iTungA = dinhA.iTung;
int iHoanhB = dinhB.iHoanh, iTungB = dinhB.iTung;
int iHoanhC = dinhC.iHoanh, iTungC = dinhC.iTung;
dinhA.iHoanh = iHoanhA * cos(theta) - iTungA * sin(theta); dinhA.iTung = iHoanhA * sin(theta) + iTungA * cos(theta); dinhB.iHoanh = iHoanhB * cos(theta) - iTungB * sin(theta); dinhB.iTung = iHoanhB * sin(theta) + iTungB * cos(theta); dinhC.iHoanh = iHoanhC * cos(theta) - iTungC * sin(theta); dinhC.iTung = iHoanhC * sin(theta) + iTungC * cos(theta); }
//Tinh tien cac dinh roi xuat ra
cout << "Nhap so diem tinh tien cua tung do va hoanh do: " ;
cin >> dx >> dy;
ABC.TinhTien(dx, dy);
cout << "Toa do cac dinh cua tam giac ABC sau khi tinh tien la: " ; ABC.Xuat();
//Phong to tam giac roi xuat ra
cout << "Nhap he so phong to: " ;
cin >> heSo;
cout << "Toa do cac dinh cua tam giac ABC sau khi phong to la: " ;
ABC.PhongTo(heSo);
ABC.Xuat();
//Thu nho tam giac roi xuat ra
cout << "Nhap he so thu nho: " ;
cin >> heSo;
cout << "Toa do cac dinh cua tam giac ABC sau khi thu nho la: " ;
ABC.ThuNho(heSo);
ABC.Xuat();
//Quay tam giac roi xuat ra
cout << "Nhap goc quay: " ;
Trang 13Kết quả chạy thử
Giả sử khi nhập toạ độ ba đỉnh là A(1;4), B(2;1), C(3;6), ta được kết quả như sau:
Hình 2.3: Xuất ra màn hình sau khi nhập toạ độ 3 đỉnh A, B, C
Tiếp tục nhập toạ độ tịnh tiến, ví dụ ở đây là 5 và -1, ta được kết quả như sau:
Hình 2.4: Xuất ra màn hình toạ độ đỉnh A, B, C sau khi tịnh tiến
Nhập tiếp hệ số phóng to, ở đây giả sử nhập hệ số phóng to là 2, ta được kết quả xuất ra
màn hình như sau:
Hình 2.5: Xuất ra màn hình toạ độ đỉnh A, B, C sau khi phóng to
Nhập tiếp hệ số thu nhỏ, ở đây giả sử nhập hệ số thu nhỏ là 1, tức là không thu nhỏ, ta
thu được kết quả xuất ra màn hình như sau:
Hình 2.6: Xuất ra màn hình toạ độ ba đỉnh A, B, C sau khi thu nhỏ
Cuối cùng là nhập góc quay, giả sử là nhập góc quay thu nhỏ là 180 độ, kết quả ta được
như sau:
Hình 2.7: Xuất ra màn hình toạ độ ba đỉnh A, B, C sau khi thực hiện phép quay
Trong mã nguồn, do sử dụng hàm atan() ở dòng code thứ 4, điều này đã dẫn đến việc là
kết quả bị trả về là một số vô tỉ có kiểu dữ liệu là float, và khi một số có kiểu dữ liệu int thực hiện các phép tính với một số float, khiến kết quả sau khi quay sẽ đưa về dạng phần nguyên
Trang 14Ta có kết quả chạy thử đầy đủ như sau:
Hình 2.8: Kết quả chạy thử đầy đủ chương trình của Bài tập 2
Dưới đây là một số kết quả chạy thử khác của chương trình:
Hình 2.9: Các kết quả chạy thử khác của chương trình Bài tập 2
Trang 15Bài tập 3: Xây dựng lớp đa giác
• Thuộc tính: n (số đỉnh đa giác), Diem *Dinh
• Phương thức: Nhap(), Xuat(), TinhTien, PhongTo(), ThuNho(), Quay()
Yêu cầu: Thực hiện xây dựng lớp, vẽ class diagram và khai báo các thuộc tính, phương thức Viết nội dung vào các phương thức đã khai báo Gọi các phương thức trong hàm main()
Hình 3.1: Mô hình lớp của lớp DaGiac
Xây dựng thêm lớp Diem chứa toạ độ của các đỉnh
Tương tự như ở Bài tập 2, ở Bài tập 3 chúng ta sẽ xây dựng lớp Diem để ghi toạ độ của
các đỉnh (mô hình lớp của lớp Diem đã được mô tả trước đó ở hình 2.2)
Nội dung các phương thức đã khai báo
Về cơ bản, nội dung các phương thức đã khai báo ở Bài tập 3 có nhiều điểm tương đồng với Bài tập 2
• Nhap(): Nhập từ bàn phím n đỉnh đa giác và lần lượt sau đó là hoành độ và tung
độ của từng đỉnh, cách nhau bởi dấu cách
• Xuat(): Xuất ra màn hình toạ độ toạ độ đỉnh của đa giác dưới dạng ( )x y;
• TinhTien(): Thực hiện phép tịnh tiến điểm Toạ độ của điểm sau khi tịnh tiến là toạ độ ban đầu cộng với giá trị tịnh tiến
• PhongTo(): Phóng to tam giác bằng cách lấy hệ số nhân lần lượt với hoành độ và tung độ của mỗi điểm
• ThuNho(): Thu nhỏ tam giác bằng cách lấy hệ số chia lần lượt với hoành độ và tung độ của mỗi điểm
Trang 16• Quay(): Thực hiện phép quay tam giác bằng cách nhân lượng giác
▪ Giả sử có một điểm M có toạ độ (x y , muốn thực hiện phép quay và di 1; 1)
chuyển điểm qua toạ độ (x y2; 2), ta có công thức như sau:
, trong đó φ là góc quay được tính theo đơn vị độ
▪ Do trong C++ hai hàm sin và cos sử dụng đơn vị rad, nên ta phải có khai báo thêm biến pi và chuyển đổi từ góc độ sang rad
Trang 17int iHoanh, iTung;
Diem() : iHoanh(0), iTung(0) {}
Diem( int Hoanh, int Tung) : iHoanh(Hoanh), iTung(Tung) {}
Diem( const Diem &x) : iHoanh(x.iHoanh), iTung(x.iTung) {}
cout << "Nhap toa do cua tung dinh: " ;
for ( int i = 0; i < n; i++)
cin >> Dinh[i].iHoanh >> Dinh[i].iTung;
}
void Xuat() {
for ( int i = 0; i < n; i++)
cout << "(" << Dinh[i].iHoanh << ";" << Dinh[i].iTung
<< ") " ;
cout << "\n" ;
}
void TinhTien( int dx, int dy) {
for ( int i = 0; i < n; i++) {
Dinh[i].iHoanh += dx;
Dinh[i].iTung += dy;
}
}
void PhongTo( int heSo) {
for ( int i = 0; i < n; i++) {
Dinh[i].iHoanh *= heSo;
Dinh[i].iTung *= heSo;
}
}
void ThuNho( int heSo) {
for ( int i = 0; i < n; i++) {
Dinh[i].iHoanh /= heSo;
Dinh[i].iTung /= heSo;
}
}
Trang 18void Quay( float goc){
float theta = goc * pi / 180.0;
for ( int i = 0; i < n; i++) {
int x = Dinh[i].iHoanh;
int y = Dinh[i].iTung;
Dinh[i].iHoanh = x * cos(theta) - y * sin(theta);
Dinh[i].iTung = x * sin(theta) + y * cos(theta);
//Nhap so dinh va nhap toa do cac dinh, xuat toa do cac dinh
cout << "Nhap so dinh: " ;
//Tinh tien cac dinh roi xuat ra
cout << "Nhap so diem tinh tien cua tung do va hoanh do: " ;
cin >> dx >> dy;
daGiac.TinhTien(dx, dy);
cout << "Toa do cac dinh cua da giac sau khi tinh tien la: " ;
daGiac.Xuat();
//Phong to tam giac roi xuat ra
cout << "Nhap he so phong to: " ;
cin >> heSo;
cout << "Toa do cac dinh cua da giac sau khi phong to la: " ;
daGiac.PhongTo(heSo);
daGiac.Xuat();
//Thu nho tam giac roi xuat ra
cout << "Nhap he so thu nho: " ;
cin >> heSo;
cout << "Toa do cac dinh cua da giac sau khi thu nho la: " ;
daGiac.ThuNho(heSo);
daGiac.Xuat();
//Quay tam giac roi xuat ra
cout << "Nhap goc quay: " ;
Trang 19Kết quả chạy thử
Giả sử chúng ta nhập một đa giác gồm 4 đỉnh có toạ độ (2;1), (3;1), (-1;2), (0;0), ta sẽ được kết quả như sau:
Hình 3.2: Kết quả xuất ra khi nhập toạ độ của một đa giác có 4 đỉnh
Tiếp tục nhập toạ độ tịnh tiến, ví dụ ở đây là 5 và -1, ta được kết quả như sau:
Hình 3.3: Xuất ra màn hình toạ độ các đỉnh của đa giác sau khi tịnh tiến
Nhập tiếp hệ số phóng to, ở đây giả sử nhập hệ số phóng to là 1, ta được kết quả xuất ra màn hình như sau:
Hình 3.4: Xuất ra màn hình toạ độ các đỉnh của đa giác sau khi phóng to
Nhập tiếp hệ số thu nhỏ, ở đây giả sử nhập hệ số thu nhỏ là 2, ta thu được kết quả xuất
ra màn hình như sau:
Hình 3.5: Xuất ra màn hình toạ độ các đỉnh của đa giác sau khi thu nhỏ
Cuối cùng là nhập góc quay, giả sử là nhập góc quay thu nhỏ là 90 độ, kết quả ta được như sau:
Hình 3.6: Xuất ra màn hình toạ độ các đỉnh của đa giác sau khi thực hiện phép quay
Tương tự như ở Bài tập 2, việc sử dụng hàm atan() đã dẫn đến việc là kết quả bị trả về
là một số vô tỉ có kiểu dữ liệu là float, và khi một số có kiểu dữ liệu int thực hiện các phép tính với một số float, khiến kết quả sau khi quay sẽ đưa về dạng phần nguyên