Bài tập Kỹ thuật lập trình - Lập trình hướng đối tượng - Đại học BK - ĐHQG TP Hồ Chí Minh
Mục tiêu của bài tập này:
• Hiểu rõ các khái niệm căn bản của hướng đối tượng.
• Có thể tạo một lớp (class) và dùng lớp đó bằng cách tạo đối tượng từ lớp và gọi
phương thức của đối tượng.
• Biết cách thiết kế lớp đơn giản để giải quyết bài toán.
• Hiểu và sử dụng tính thừa kế
• Hiểu được sơ đồ lớp cơ bản
• Biết về tính đa hình (polymorphism)
• Hiểu rõ các khái niệm căn bản của hướng đối tượng.
• Có thể tạo một lớp (class) và dùng lớp đó bằng cách tạo đối tượng từ lớp và gọi
phương thức của đối tượng.
• Biết cách thiết kế lớp đơn giản để giải quyết bài toán.
• Hiểu và sử dụng tính thừa kế
• Hiểu được sơ đồ lớp cơ bản
• Biết về tính đa hình (polymorphism)
Bạn đang xem tài liệu "Bài tập Kỹ thuật lập trình - Lập trình hướng đối tượng - Đại học BK - ĐHQG TP Hồ Chí Minh", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.
File đính kèm:
- bai_tap_ky_thuat_lap_trinh_lap_trinh_huong_doi_tuong_dai_hoc.pdf
Nội dung text: Bài tập Kỹ thuật lập trình - Lập trình hướng đối tượng - Đại học BK - ĐHQG TP Hồ Chí Minh
- KỸ THUẬT LẬP TRÌNH Nội dung về Lập trình hướng đối tượng private: int m_value; public: A(): m_value(123){ cout << "In A(), value = " << m_value << endl; } A(const A& ob): m_value(ob.m_value){ cout << "In A(const A& ob), value = " << m_value << endl; } A(int value): m_value(value){ cout << "In A(int value), value = " << m_value << endl; } ~A(){ cout << "In ~A(), value = " << m_value << endl; } }; int main(){ A ob1; A *ptr1 = new A(246); { A ob2(456); A ob3(ob1); } delete ptr1; A ob4(789); A ob5 = 357; return 0; }; END PROGRAM Hướng dẫn: 1) Copy chương trình, biên dịch và chạy. Lưy ý, để phải được cả những kết quả sau khi chương trình kết thúc. 2) Chỉnh sửa từng bước theo các yêu cầu; sau đó, biên dịch, chạy nếu được, giải thích kết quả. Câu 2: Cho chương trình sau đây, nằm giữa “BEGIN PROGRAM” và “END PROGRAM”. a) Hãy điền vào //(1) các dòng để khởi động giá trị m_value trong lớp X, Y, và Z với các giá trị của thông số vx, vy, và vz tương ứng. b) Hãy điền vào //(2) dòng lệnh để xuất 3 giá trị m_value (có 3 giá trị có tên m_value) trong đối tượng “obj” ra màn hình, theo định dạng: vx, vy, vz. BEGIN PROGRAM class X{ public: int m_value; }; TRANG 2
- KỸ THUẬT LẬP TRÌNH Nội dung về Lập trình hướng đối tượng cout using namespace std; class X{ public: /*(1)*/ void display(){ cout << "Type of \"this\" object is: Class X" << endl; } }; class Y: public X{ public: void display(){ cout << "Type of \"this\" object is: Class Y" << endl; } }; class Z: public Y{ public: TRANG 4
- KỸ THUẬT LẬP TRÌNH Nội dung về Lập trình hướng đối tượng Hướng dẫn: 1) Copy chương trình, biên dịch và chạy. 2) Gọi phương thức không thông qua con trỏ: phép gán đối tượng của lớp con con vào đối tượng của lớp cha (như dòng: x2 = y2; x3 = z3;) là cho phép. Vì đối tượng của lớp con chứa trong đó đối tượng có kiểu lớp cha. Nhưng ngược lại thì không được. 3) Gọi phương thức thông qua con trỏ: con trỏ đến đối tượng lớp cha luôn luôn gán được cho con trỏ đến đối tượng của lớp cha, như dòng: X *px2 = new Y(); X *px3 = new Z();. Phép gán này có ý nghĩa trong tính đa hình – xem kết quả của chương trình, sự khác nhau ở câu a) và b). Câu 5: Cho chương trình sau đây, nằm giữa “BEGIN PROGRAM” và “END PROGRAM”. a) Thêm vào lớp Y là lớp con của lớp X. Định nghĩa lại (override) phương thức display trong X, sao cho bên ngoài lớp Y vẫn gọi được – như dòng: “y.display();“ trong hàm main b) Thêm vào lớp Z là lớp con của lớp Y. Định nghĩa lại (override) phương thức display thừa kế được từ lớp Y, sao cho bên ngoài lớp Z không thể dùng phương thức display được nữa – như dòng: “z.display();“ trong hàm main. Sinh viên phải thực hiện bằng 2 cách khác nhau: BEGIN PROGRAM #include using namespace std; class X{ public: /*(1)*/ void display(){ cout << "Type of \"this\" object is: Class X" << endl; } }; int main(){ X x; Y y; Z z; x.display(); //OK y.display(); //OK z.display(); //Error during compilation return 0; }; END PROGRAM TRANG 6
- KỸ THUẬT LẬP TRÌNH Nội dung về Lập trình hướng đối tượng • Dòng 14 và 15: Lớp Date phải hỗ trợ nhập ngày bằng toán tử chèn , chỉ được sử dụng các thư viện sau: , (hoặc ). (a) Nếu dùng : chỉ được dùng hai hàm strlen và strcpy. (b) Nếu dùng : tự hiện thực lại hàm có chức năng như strlen và dùng hàm memcpy thay cho strcpy. Lớp MyString phải hỗ trợ những phương thức, hàm khởi tạo, hàm huỷ, và các toán tử để người dùng nó có thể thực hiện đoạn chương trình sau: Các dòng lệnh trong đó được giải thích như sau: TRANG 8
- KỸ THUẬT LẬP TRÌNH Nội dung về Lập trình hướng đối tượng (b) Viết chương trình chính (main) để tạo ra các đối tượng và tính toán với các đối tượng nay nhằm kiểm tra bản hiện thực của mình. Cũng có nghĩa là làm “test-case” cho hiện thực của hình. Hướng dẫn: Thuộc tính và phương thức của hai lớp “Point2D” và “Vector2D” được thiết kế theo gợi ý như sau. Kết quả thiết kế có thể xem Hình 1. Hình 1: Thiết kế cho kiểu Point2D và Vector2D. TRANG 10
- KỸ THUẬT LẬP TRÌNH Nội dung về Lập trình hướng đối tượng học, nếu tích vô hướng bằng 0, nghĩa là hai véc-tơ vuông góc (còn gọi trực giao). Do đó, để kiểm tra hai véc-tơ có vuông góc, thì tính tích vô hướng và kiểm tra với 0. Hàm này rất hữu ích để kiểm tra xem một hình có là hình chữ nhật hay hình vuông (ở Câu 9). • Phương thức “ortho”: kiểm tra xem hai véc-tơ có vuông góc, dùng phương thức “dot” đã nói trên. • Sinh viên nên bổ sung hai phương thức dot và ortho có tính static, chúng nhận hai véc-tơ đầu vào. (d) Các toán tử liên quan đến điểm và véc-tơ: Trong môn học Hình học giải tích (bậc trung học) cho biết, có các phép toán sau đây liên quan đến điểm và véc-tơ: • [Điểm A] + [véc-tơ V] à cho ra [điểm B]: dời A theo véc-tơ V ta được B (tịnh tiến) • [Điểm A] – [Điểm B] à cho ra [véc-tơ V]: véc-tơ V đi từ B (đầu véc-tơ) đến A (ngọn véc-tơ); lưu ý: không phải từ A đến B. Phép trừ có nghĩa là trừ các toạ độ với nhau. • [Số thực F] * [véc-tơ V] à cho ra [véc-tơ T]: nhân số thực F với từng thành phần x và y của véc-tơ (co/giản véc-tơ V để được T). Toán tử này phải được bổ sung như một toán tử không phải thành viên của lớp Vector2D; vì toán hạng bên phải là F không phải kiểu Vector2D. • [véc-tơ V] * [Số thực F] à cho ra [véc-tơ T]: Tương tự như trên, toán hạng bên trái có kiểu Vector2D; do đó, có thể đưa toán tử này như là thành viên của lớp Vector2D. • [Véc-tơ V1] + [Véc-tơ V2] à cho ra [véc-tơ T], theo quy tắc cộng véc-tơ; nghĩa là, cộng các thành phần x và y của các véc-tơ với nhau. • Phép trừ véc-tơ là tương tự phép toán +. Câu 9: (Câu này sử dụng kết quả của Câu 6) Giả sử các bạn cần phát triển một chương trình liên quan đến vẽ các đối tượng hình học 2D và 3D. Ngoài hai loại đối tượng cơ bản đó là điểm và véc-tơ trong không gian 2 chiều (3D xét sau), chương trình cần xử lý với các đối tượng khác như Đa giác, Tam giác, Tứ giác, Hình chữ nhật, và Hình vuông. Bài tập này bỏ qua các đối tượng như tứ giác và các hình tứ giác khác dẫn ra từ nó, để cho đơn giản hơn. Yêu cầu: TRANG 12
- KỸ THUẬT LẬP TRÌNH Nội dung về Lập trình hướng đối tượng trả về 0. Giải thuật kiểm tra tính lồi, các sinh viên có thể tham khảo bài trả lời của “Jason S” trong link ở footnote 1. (d) Định nghĩa phương thức addVertex trong các lớp như Triangle, Rectangle, và Square, và đổi luôn tính khả kiến của nó từ public sang private – nhằm che không cho bên ngoài gọi addVertex trên các đối tượng kiểu Triangle, Rectangle, và Square được. Xem phần hướng dẫn sau. Hình 2: Thiết kế cho các đối tượng hình học 2D cơ bản. Lớp Point2D và Vector2D có chi tiết ở Hình 1. Một số chú giải cho Hình 2: • Dấu +: cho biết các phương thức hay thuộc tính có tính public. • Mũi tên to: cho biết sự thừa kế. Ví dụ: lớp Square thừa kế lớp Rectangle; đọc là “Square is-a Rectangle”. 1 convex-nonconvex TRANG 14
- KỸ THUẬT LẬP TRÌNH Nội dung về Lập trình hướng đối tượng • Theo Hình 2: các lớp sau đều thừa kế phương thức addVertex (có tính public) từ lớp TwoDShape; đó là các lớp: Polygon, Triangle, Rectangle, và Square. Với lớp Polygon là hợp lý; vì, addVertex giúp cho người lập trình thêm từng đỉnh vào đ a giác (có nhiều đỉnh). Tuy vậy, với các lớp còn lại Triangle (có đúng 3 đỉnh), Rectangle và Square phải có đúng 4 đỉnh. Do đó, addVertex thừa kế được và cho bên ngoài dùng được là một vấn đề với các lớp này. Các lớp Triangle, Rectangle, và Square phải che hàm này đi – không để bên ngoài dùng được. Bằng cách nào? o Định nghĩa là hàm này (override), nhưng đổi luôn tính khả kiến của nó từ public sang private. Có nghĩa là đặt hàm addVertex được định nghĩa lại đó tại vị trí mà private có ảnh hưởng. o Bản thân hàm định nghĩa lại này có thể để trống (empty), hoặc gọi lại addVertex của lớp TwoDShape. TRANG 16