1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Môn lập trình hướng Đối tượng bài tập thực hành 2 bài tập 1 xây dựng lớp Điểm2

25 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 25
Dung lượng 814,38 KB

Nội dung

• 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 1

TRƯỜ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 2

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 3

MỤ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 4

DANH 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 5

NỘ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 6

Nộ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 7

Diem() : 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 8

Kế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 9

Bà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 10

Hì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 11

int 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 12

void 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 13

Kế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 14

Ta 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 15

Bà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 17

int 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 18

void 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 19

Kế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

Ngày đăng: 09/12/2024, 15:40