Bài tập thực hành Chủ đề: Template & Inheritance

pdf 12 trang phuongnguyen 2770
Bạn đang xem tài liệu "Bài tập thực hành Chủ đề: Template & Inheritance", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_tap_thuc_hanh_chu_de_template_inheritance.pdf

Nội dung text: Bài tập thực hành Chủ đề: Template & Inheritance

  1. BÀI T P TH C HÀNH CHO TU N 10, 11, 12 Ch đ : Template & Inheritance Lp 031101 Sinh viên hãy làm tu n t các bài t p sau, c g ng làm h t các bài t p này trong 3 bu i th c t p. 1. To m t console project tr ng trong Microsoft Visual C++ 6.0 cĩ tên PictureConsole . Thao tác nh ư sau: a. Ch n File menu. b. Ch n New c. Ch n Tab Project . d. Ch n Win32 Consolde Application . e. ðt tên project là PictureConsole (gõ trong edit box Project name ) f. Ch n đưng d n đ n th ư m c ch a các t p tin c a project trong edit box Location . g. Click OK. Sau đĩ ch n Radio button An empty project . Cu i cùng click Finish button. 2. Thêm vào project các file (16 files ) ch a ph n cài đt các l p theo b n thi t k d ưi đây (xem hình 1 ). Cn chú ý mt s đim sau: a. Cài đt m i l p trên m t c p file .h và .cpp riêng . Ví d l p CPoint đưc cài trong file Point.h và Point.cpp . b. ð thêm m t file vào project ta làm nh ư sau: i. Ch n Project Add to Project New ii. Sau đĩ ch n lo i file: header file (.h) hay source file (.cpp). iii. ðt tên cho file. T t nh t nên đt tên file trùng v i tên l p (b ch “C” đ u tên l p). c. Khi t o các l p, nên t o các lp c ơ s và lp thành ph n tr ưc, các l p con và lp bao to sau. Trong bài t p này, nên t o các l p theo th t sau: CSize , CPoint , CShape , CRectangle , CSquare , CEllipse , CCircle , CTriangle . d. Trong file .h ch a đnh ngh ĩa l p con/l p bao, cn chú ý #include các file .h ch a đ nh ngh ĩa l p cơ s /l p thành ph n. e. ð hi u rõ các ký hi u trong b n thi t k , hãy đc ph n chú thích bên dưi hình 1. Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 1
  2. Hình 1 Chú thích : • Trong l p CPoint ta cĩ tốn t ép ki u t CPoint POINT. POINT là m t ki u d li u c a Windows API , vì th trong file Point.h ch a đ nh ngh ĩa c a l p CPoint, c n ph i #include file Windows.h : // File: Point.h #ifndef ___POINT_H #define ___POINT_H #include "Size.h" #include class CPoint{ public : int m_nX; int m_nY; CPoint( int x = 0, int y = 0); CSize operator - (const CPoint &pt); operator POINT(); // Tốn t ép ki u khơng cĩ đ i s và khơng cĩ g.tr tr v }; #endif Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 2
  3. • Di n tích hình vuơng = c nh*c nh • Di n tích hình ch nh t = dài*r ng • Di n tích hình trịn = 3.14*R 2, v i R là bán kính. • Di n tích hình e-líp = 3.14*a*b, v i a là chi u dài tr c nh , b là chi u dài tr c l n. • Di n tích tam giác ABC = sqrt(p*(p - a)*(p - b)*(p - c)). Trong đĩ: o a là chi u dài c nh đ i di n đ nh A. o b là chi u dài c nh đ i di n đ nh B. o c là chi u dài c nh đ i di n đ nh C. o p = (a + b + c)/2 • Di n tích hình thang = ( ðáyL n + ðáyNh )*Chi uCao/2 • Di n tích hình bình hành = ðáy*Chi uCao • Bi u t ưng chìa khố cĩ ngh ĩa là thành ph n protected . • Bi u t ưng khĩa cĩ ngh ĩa là thành ph n private . • Khơng cĩ bi u t ưng khố và chìa khĩa cĩ ngh ĩa là thành ph n public . • ð di n t l p B là con l p A, ta dùng ký hi u: A B • ð di n t l p A cĩ thành ph n d li u thu c l p B (A là l p bao), ta ký hi u: A B 3. Thêm vào project 2 file m i: Utilities.h và Utilities.cpp . T m th i 2 file này đ tr ng. Vì Utilities.cpp s ch a đ nh ngh ĩa c a các hàm đưc khai báo trong file Utilities.h , nên c n #include file Utilities.h vào file Utilities.cpp nh ư sau: // File: Utilities.cpp #include "Utilities.h" // 4. Vi t hàm OutClassNames() xu t ra màn hình tên lp ca các hình trong m ng. Sinh viên vi t đ nh ngh ĩa ca hàm này trong file Utilities.cpp và khai báo prototype c a hàm trong file Utilities.h nh ư sau: // File: Utilities.h #ifndef ___UTILITIES_H #define ___UTILITIES_H // N i dung file Utilities.h đưc đ t đây, tr ưc #endif và sau #define void OutClassNames(vector shapes); Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 3
  4. // #endif Do trong khai báo trên cĩ dùng vector , nên c n thêm 2 dịng sau đây vào đu file Utilities.h : // File: Utilities.h #include using namespace std; // 5. Ki m tra s đúng đn c a hàm OutClassNames() bng cách th c hi n nh ư sau: a. Khai báo m t m ng tồn c c dùng đ ch a các hình. M ng này đưc khai báo trong file Utilities.h nh ư sau: // File: Utilities.h // #include using namespace std; // extern vector g_shapes; b. Kh i t o mt t p các hình trong file Utilities.cpp (khơng ph i trong Utilities.h . Gi i thích t i sao?): // Kh i t o g_shapes đã đưc khai báo extern trong Utilities.h vector g_shapes; // Kh i t o các đ i t ưng ví d CRectangle rect1(CPoint(50, 30), 50, 70); CRectangle rect2(CPoint(50, 130), 100, 200); CTriangle tri1(CPoint(600, 10), CPoint(250, 150), CPoint(350, 30)); CEllipse ellip1(CPoint(500, 300), CSize(200, 100)); CCircle cir1(CPoint(300, 300), 200); CSquare square1(CPoint(400, 400), 100); c. Các l p trong ph n kh i t o đ i t ưng trên đây đưc khai báo trong các file Rectangle.h , Triangle.h , Ellipse.h , Square.h , Circle.h . Do v y c n #include các file này vào file Utilities.h (Gi i thích t i sao #include vào Utilities.h ch khơng #include vào Utilities.cpp ?). // File: Utilities.h #include "Rectangle.h" #include "Square.h" #include "Triangle.h" #include "Ellipse.h" #include "Circle.h" d. Vi t hàm InitArrayOfShapes() nh ư sau: // Khai báo trong Utilities.h void InitArrayOfShapes(); // ðnh ngh ĩa trong Utilities.cpp, d ưi ph n kh i t o các đ i t ưng. void InitArrayOfShapes() { g_shapes.push_back(&rect1); g_shapes.push_back(&rect2); g_shapes.push_back(&tri1); Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 4
  5. g_shapes.push_back(&ellip1); g_shapes.push_back(&cir1); g_shapes.push_back(&square1); } e. Thêm file main.cpp vào project, sau đĩ vi t hàm main() trong file main.cpp : // File: Main.cpp #include "Utilities.h" int main() { InitArrayOfShapes(); OutClassNames(g_shapes); return 0; } f. Ch y ch ươ ng trình và ki m tra k t q a. 6. Xem l i source code v a t o. M l i các file .h đ xem các l p đưc khai báo k th a th nào. Hãy đ ý nh ng ph ươ ng th c và nh ng thành ph n đưc k th a t các l p cha trong các l p con. Gi i thích s ho t đ ng c a ch ươ ng trình. Nh ng dịng nào th hi n tính đa x ? Xem l i cách t ch c file c a ch ươ ng trình. 7. Vi t hàm OutAreas() xu t ra màn hình di n tích các hình trong m ng (đt trong file Utilities.h và Utilities.cpp ). Prototype c a hàm nh ư sau: // File: Utilities.h void OutAreas(vector shapes); // 8. Gi hàm OutAreas() trong hàm main() và ch y th đ ki m tra tính đúng đ n c a hàm OutArea() . 9. Vi t hàm OutAreasAndClassNames() xu t đ ng th i tên l p và di n tích các hình. 10. Vi t hàm tìm t ng di n tích c a m t t p hình (đt hàm này trong file Utilities.h và Utilities.cpp ). Tham kh o ví d v hàm này trong bài h c, ph n đa x . Prototype ca hàm: // File: Utilities.h double SumArea(vector shapes); 11. Gi hàm SumArea() trong hàm main() và ch y th đ ki m tra tính đúng đ n. 12. Vi t hàm tìm hình cĩ di n tích nh nh t (đt trong file Utilities.h và Utilities.cpp ) và g i hàm này trong hàm main() đ ki m tra tính đúng đn. Tham kh o ví d trong bài h c, ph n đa x . Prototype: // File: Utilities.h CShape* FindSmallestShape(vector shapes); 13. Vi t hàm tìm lo i c a hình cĩ di n tích nh nh t (đt trong file Utilities.h và Utilities.cpp ). Prototype nh ư sau: // File: Utilities.h #include using namespace std; string KindOfTheSmallest(vector shapes); 14. Vi t hàm s p x p các hình theo th t t đin trên tên l p và theo th t gi m d n di n tích (các hình cùng lo i s đ ng li n nhau và theo th t t đin trên tên l p: các đi t ưng thu c l p CCricle Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 5
  6. nm ph n đ u c a m ng, r i đ n CEllipse , CRectangle , CSquare , Ctriangle . Trong s nh ng hình cùng lo i, hình cĩ di n tích l n h ơn s đ ng tr ưc). // File: Utilities.h void SortClassNameAndArea(vector & shapes); Gi i thích t i sao đ i s c a hàm này l i là tham chi u? 15. Ki m tra l i k t q a c a hàm s p x p v a vi t b ng cách ch y hàm main() sau: // File: Main.cpp #include "Utilities.h" int main() { InitArrayOfShapes(); cout using namespace std; class CShape { public : CShape(CPoint pt); virtual double Area() = 0; virtual string GetClassName() = 0; virtual void Draw(HDC hdc) = 0; protected : CPoint m_ptA; }; #endif Vì ki u d li u HDC (ki u c a đ i s trong hàm Draw() ), là m t ki u d li u c a Windows API , nên dịng l nh #include trong file Point.h (xem chú thích đu tiên câu 2) s đ m bo trình biên d ch khơng báo l i khi g p ki u d li u này trong đon code trên c a file Shape.h (Windows.h đưc #include trong Point.h . Point.h li đưc #include trong Shape.h . Do đĩ Windows.h đưc #include trong Shape.h ). b. ðnh ngh ĩa đè ph ươ ng th c Draw() trong các l p con: CRectangle , CTriangle , CEllipse nh ư sau: i. Lp CRectangle : // File: Rectangle.h Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 6
  7. #ifndef ___RECTANGLE_H #define ___RECTANGLE_H #include "Shape.h" #include "Size.h" class CRectangle: public CShape { public : CRectangle(CPoint ul, int l, int w); void SetSize( int l, int w); virtual double Area(); virtual string GetClassName(); virtual void Draw(HDC hdc); protected : CSize m_szSize; }; #endif // File: Rectangle.cpp void CRectangle::Draw(HDC hdc) { CPoint ptA(m_ptA); CPoint ptB(m_ptA.m_nX + m_szSize.m_nXSize, m_ptA.m_nY); CPoint ptC(m_ptA.m_nX + m_szSize.m_nXSize, m_ptA.m_nY + m_szSize.m_nYSize); CPoint ptD(m_ptA.m_nX, m_ptA.m_nY + m_szSize.m_nYSize); POINT aptRect[4]; aptRect[0] = POINT(ptA); aptRect[1] = POINT(ptB); aptRect[2] = (POINT)ptC; aptRect[3] = (POINT)ptD; ::Polygon(hdc, aptRect, 4); } ii. Lp CTriangle : // File: Triangle.h #ifndef ___TRIANGLE_H #define ___TRIANGLE_H #include "Shape.h" class CTriangle: public CShape { public : CTriangle(CPoint, CPoint, CPoint); virtual double Area(); virtual string GetClassName(); virtual void Draw(HDC hdc); private : CPoint m_ptB; CPoint m_ptC; }; #endif // File: Triangle.cpp void CTriangle::Draw(HDC hdc) { Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 7
  8. POINT aptTriangle[3]; aptTriangle[0] = POINT(m_ptA); aptTriangle[1] = POINT(m_ptB); aptTriangle[2] = (POINT)m_ptC; ::Polygon(hdc, aptTriangle, 3); } iii. Lp CEllipse : // File: Ellipse.h #ifndef ___ELLIPSE_H #define ___ELLIPSE_H #include "Shape.h" #include "Size.h" class CEllipse: public CShape { public : CEllipse(CPoint ptCenter, CSize szAxes); virtual double Area(); virtual string GetClassName(); virtual void Draw(HDC hdc); protected : CSize m_szAxes; }; #endif // File: Ellipse.cpp void CEllipse::Draw(HDC hdc) { int nLeft, nTop, nRight, nBottom; nLeft = m_ptA.m_nX - m_szAxes.m_nXSize/2; nTop = m_ptA.m_nY - m_szAxes.m_nYSize/2; nBottom = m_ptA.m_nY + m_szAxes.m_nYSize/2; nRight = m_ptA.m_nX + m_szAxes.m_nXSize/2; ::Ellipse(hdc, nLeft, nTop, nRight, nBottom); } c. Vi t hàm v m t m ng các hình, hàm này đt trong file Utilities.h và Utilities.cpp : // File: Utilities.h void Draw(vector shapes, HDC hdc); // File: Utilities.cpp void Draw(vector shapes, HDC hdc) { vector ::iterator Iterator; for (Iterator = shapes.begin(); Iterator != shapes.end(); Iterator++) (*Iterator)->Draw(hdc); } d. To m t project m i v i tên PictureWin32 theo các b ưc sau: i. Ch n File New ii. Ch n Tab Project iii. Ch n Win 32Application Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 8
  9. iv. ðt tên cho project là PictureWin32 , ch n đưng d n ch a project và click OK v. Ch n radio A typical “Hello World!” application . vi. Click Finish và OK e. Copy 18 files gm 16 file ch a 8 l p đã mơ t trên, file Utilities.h , file Utilities.cpp vào th ư mc PictureWin32 (th ư m c c a project v a t o trên). f. Add 18 files trên vào project PictureWin32 bng cách ch n menu: Project Add to Project Files , sau đĩ ch n 18 files cn add và click OK. g. #Include file Utilities.h vào file PictureWin32.cpp nh ư sau: // File: PictureWin32.cpp #include "stdafx.h" #include "resource.h" #include “Utilities.h” h. Thêm dịng #include "stdafx.h" vào đu file c a 9 file .cpp va đưc add vào project PictureWin32 (g m 8 file .cpp ch a đ nh ngh ĩa các ph ươ ng th c c a 8 l p và file Utilities.cpp ): // File: Triangle.cpp #include "stdafx.h" // ð đ u file #include "Triangle.h" #include v.v (t ươ ng t cho 8 file cịn l i) i. Sa l i hàm WndProc() trong file PictureWin32.cpp nh ư sau: Cũ: case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: Add any drawing code here RECT rt; GetClientRect(hWnd, &rt); DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER); EndPaint(hWnd, &ps); break; Mi: case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: Add any drawing code here InitArrayOfShapes(); Draw(g_shapes, hdc); EndPaint(hWnd, &ps); break; j. Dch ch ươ ng trình, ch y và quan sát k t qu . Chú ý: to đ các hình nên đ nh ư câu 5.b) đ d quan sát các hình v. 17. Xem l i ch ươ ng trình và các b ưc đã làm câu 16, tr l i các câu h i: a. Gii thích c ơ ch ho t đ ng c a ch ươ ng trình. Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 9
  10. b. Gi i thích t i sao ta khơng đ nh ngh ĩa đè ph ươ ng th c Draw() trong l p CCircle và l p CSquare ? c. Cho bi t tính đa x th hi n nh ng đon ch ươ ng trình nào? 18. To thêm các l p CTrapezium (hình thang), CParallelogram (hình bình hành), k th a t l p CShape . Sau đĩ: a. Thêm các đi t ưng c a các hình này vào m ng các hình. b. Ch y và ki m tra l i hàm xu t di n tích và hàm xu t tên l p. c. Ch y và ki m tra l i hàm tìm t ng di n tích. d. Ch y và ki m tra hàm tìm hình cĩ di n tích nh nh t. e. Ch y và ki m tra l i hàm s p x p. f. Ch y và ki m tra l i hàm Draw() . 19. To class template CGrid và function template BubbleSort . Các template này đưc đ t trong file Template.h . 20. Dùng template CGrid đ t o m t m ng hai chi u các hình, sau đĩ: a. Tìm dịng cĩ t ng di n tích các hình l n nh t. b. Tìm t ng di n tích các hình trong m ng 2 chi u (grid). c. Tìm hình cĩ di n tích l n nh t trong m ng hai chi u các hình. d. Sp x p theo th t t đin trên tên l p và theo th t t ăng d n di n tích cho các hình trong mng 2 chi u. 21. ðon code sau đây t ươ ng ng v i c u trúc các l p đưc mơ t hình 5.6 và 5.7 trong ch ươ ng 5. Hãy gõ li đon code này, ch y th và gi i thích k t q a. #include using namespace std; class CQueue { public : int m_nX, m_nY; CQueue( int x, int y):m_nX(x), m_nY(y){} }; class CCashierQueue : virtual public CQueue { public : CCashierQueue( int x, int y); void Print() { cout<<endl<< "CCashierQueue: x = " << m_nX<< ", y = " <<m_nY; } }; CCashierQueue::CCashierQueue( int x, int y):CQueue(x, y){} class CLunchQueue: virtual public CQueue { public : CLunchQueue( int x, int y):CQueue(x, y){} void Print() { cout<<endl<< "CLunchQueue: x = " << m_nX<< ", y = " <<m_nY; } }; class CLunchCashierQueue: public CCashierQueue, public CLunchQueue { public : Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 10
  11. CLunchCashierQueue( int x, int y):CQueue(x, y), CCashierQueue(x - 1, y + 1), CLunchQueue(x - 2,y + 2){} void Print() { cout<<endl<< "CLunchCashierQueue: x = " << m_nX<< ", y = "<<m_nY; } }; class CTakeoutQueue: public CQueue { public : CTakeoutQueue( int x, int y): CQueue(x, y){} void Print() { cout<<endl<< "CTakeoutQueue: x = " << m_nX<< ", y = " <<m_nY; } }; class CLunchTakeoutCashierQueue: public CLunchCashierQueue, public CTakeoutQueue { public : CLunchTakeoutCashierQueue( int x, int y): CLunchCashierQueue::CQueue(x + 2, y + 2), CLunchCashierQueue(x, y), CTakeoutQueue(x, y){} void Print1() { cout<<endl<< "CLunchTakeoutCashierQueue: x1 = " <<CLunchCashierQueue::m_nX<< ", "<< "y1 = " <<CLunchCashierQueue::m_nY; } void Print2() { cout<<endl<< "CLunchTakeoutCashierQueue: x2 = " <<CTakeoutQueue::m_nX<< ", "<< "y2 = " <<CTakeoutQueue::m_nY; } }; int main(){ CLunchTakeoutCashierQueue obj(5, 6); obj.CCashierQueue::Print(); obj.CLunchQueue::Print(); obj.CTakeoutQueue::Print(); obj.Print1(); obj.Print2(); obj.CLunchCashierQueue::m_nX += 3; obj.CLunchCashierQueue::m_nY += 4; obj.CTakeoutQueue::m_nX -= 3; obj.CTakeoutQueue::m_nY -= 4; cout<<endl; obj.CCashierQueue::Print(); obj.CLunchQueue::Print(); obj.CTakeoutQueue::Print(); obj.Print1(); obj.Print2(); cout<<endl; Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 11
  12. CLunchCashierQueue obj2(20, 30); obj2.Print(); cout<<endl; return 0; } // ðon ch ươ ng trình này s in trên màn hình nh ư sau: CCashierQueue: x = 7, y = 8 CLunchQueue: x = 7, y = 8 CTakeoutQueue: x = 5, y = 6 CLunchTakeoutCashierQueue: x1 = 7, y1 = 8 CLunchTakeoutCashierQueue: x2 = 5, y2 = 6 CCashierQueue: x = 10, y = 12 CLunchQueue: x = 10, y = 12 CTakeoutQueue: x = 2, y = 2 CLunchTakeoutCashierQueue: x1 = 10, y1 = 12 CLunchTakeoutCashierQueue: x2 = 2, y2 = 2 CLunchCashierQueue: x = 20, y = 30 22. Copy các đon code ví d trong ch ươ ng 5, ch y th và gi i thích k t q a. Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 12