Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 19 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
19
Dung lượng
191,5 KB
Nội dung
BÀI TẬP LỚN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Giảng viên hướng dẫn : Ngô Công Thắng Nhóm thực hiện : Nguyễn Thị Huyền Phan Thị Chương Nguyễn Thị Thu Quỳnh Dương Thị Thanh Thuý Lớp : THC_K52 Đề tài : Tìm hiểu về mẫu hàm (function template), mẫu lớp (class template): Ý nghĩa và cú pháp cài đặt. Trình bày sơ lược về thư viện STL. Cách sử dụng lớp string chuẩn và các hàm thành viên của lớp này. Viết chương trình cài đặt lớp đối tượng ngăn xếp sao cho có thể tạo các đối tượng ngăn xếp chứa các kiểu dữ liệu khác nhau, có thể thực hiện các thao tác như đưa một phần tử vào ngăn xếp (push), lấy một phần tử khỏi ngăn xếp (pop), lấy giá trị của phần tử đỉnh ngăn xếp nhưng không lấy phần tử đó ra khỏi ngăn xếp (top), kiểm tra ngăn xếp có rỗng không (empty). Nhập vào một câu văn (sử dụng lớp string chuẩn), tách các từ theo thứ tự từ trái qua phải rồi đẩy vào ngăn xếp,lấy các từ trong ngăn xếp đưa ra màn hình. 1 Nội dung A) LÝ THUYẾT I. KHUÔN MẪU ( template ) trong C++ 1) Định nghĩa 2) Khuôn mẫu hàm(Function template) 3) Khuôn mẫu lớp (Class template) 4 . Một số Template có sẵn 5. Tổng kết về Template II) SƠ LƯỢC VỀ THƯ VIỆN STL 1,Định nghĩa STL. 2. Thư viện chuẩn các mảng chứa. 3. Thư viện chuẩn tổng quát. 4. Thư viện chuẩn các dãy ký tự. 5. Thư viện chuẩn Streams và input/output. 6. Thư viện chuẩn các số 8. Các thành phần chính của STL gồm: 7. Thư viện chuẩn hỗ trợ ngôn ngữ lập trình. III) CÁCH SỬ DỤNG LỚP STRING CHUẨN VÀ CÁC HÀM THÀNH VIÊN CỦA LỚP NÀY. 1.Cách sử dụng lớp String 2.Các hàm thành viên của lớp này B_CHƯƠNG TRÌNH PHÂN CÔNG CÔNG VIỆC: Tìm hiểu về khuôn mẫu hàm(HUYỀN). Tìm hiểu về khuôn mẫu lớp(THUÝ). Tìm hiểu thư viện STL(QUỲNH). Tìm hiểu về lớp string chuẩn và các hàm thành viên(CHƯƠNG). Tìm hiểu chương trình (Cả nhóm) 2 A) LÝ THUYẾT I. KHUÔN MẪU ( template ) trong C++ 1) Định nghĩa Template là một tính năng chỉ có trong C++, nó được giới thiệu bởi tổ chức đo lường chuẩn của Mỹ (ANSI) Template (khuôn mẫu) là một cơ chế thay thế mã cho phép tạo các cấu trúc mà không phải chỉ rõ kiểu dữ liệu. Từ khoá template được dùng trong C++ để báo cho trình biên dịch rằng đoạn mã theo sau sẽ thao tác một hoặc nhiều kiểu dữ liệu chưa xác định. Từ khoá template được theo sau bởi một cặp ngoặc nhọn chứa tên của các kiểu dữ liệu tuỳ ý được cung cấp. template <typename T> template <typename T, typename U> lệnh template chỉ có hiệu quả đối với khai báo ngay sau nó. • Một VD về template: template <class myType> myType GetMax (myType a, myType b) { return (a>b?a:b); } Hai loại khuôn mẫu cơ bản: * Function template – khuôn mẫu hàm cho phép định nghĩa các hàm tổng quát dùng đến các kiểu dữ liệu tuỳ ý. * Class template – khuôn mẫu lớp cho phép định nghĩa các lớp tổng quát dùng đến các kiểu dữ liệu tuỳ ý. 2) Khuôn mẫu hàm(Function template) Mẫu hàm là những hàm có những chức năng đặc biệt , có thể hoạt động chung với các loại. Điều này cho phép tạo ra một mẫu có những chức năng và những tính năng có thể được điều chỉnh để phù hợp với nhiều hơn một loại hoặc các lớp học mà không có sự lặp đi lặp lại toàn bộ mã số cho từng loại. Trong C / C + + mẫu hàm có thể được tạo ra bằng cách sử dụng các “tham số mẫu”.Tham số mẫu là một loại đặc biệt của tham số,nó có thể được sử dụng để truyền vào một đối số: Giống như các hàm thông thường các tham số có thể được sử dụng để truyền giá trị cho một hàm, các tham số mẫu cũng cho phép truyền các kiểu tới 1 hàm Các mẫu hàm có thể sử dụng các tham số này nếu chúng là bất cứ một kiểu thông thường nào khác 3 a. Khai báo Khai báo mẫu của nó có thể là một trong hai kiểu sau: Các định dạng cho các mẫu hàm với kiểu tham số là: template <class identifier> function_declaration template <typename identifier> function_declaration b. Cú pháp cài đặt mẫu hàm Chúng ta sẽ xác định cú pháp cài đặt mẫu hàm thông qua ví dụ sau: Ví dụ hàm trị tuyệt đối template<class T> T abs(T n) { Return ((n<0)? –n : n; } Đây là toàn bộ cú pháp một mẫu hàm Dòng đầu tiên bắt đầu với từ khóa template và theo sau là định nghĩa hàm.Từ khóa template báo cho trình biên dịch biết là chúng ta đang định nghĩa một mẫu hàm.Tư khóa class trong 2 dấu < > cũng có thể gọi là type bởi vì chung ta có thể định nghĩa các kiểu dữ liệu của riêng chúng ta nên thật sự không có gì phân biệt giữa các kiểu và các lớp.Biến theo sau từ khóa class( là T trong ví dụ trên) được gọi là đối số mẫu c. Ý Nghĩa Ưu điểm • Tiết kiệm được mã nguồn -> dễ bao quát, dễ kiểm soát lỗi nâng cao hiệu quả lập trình • Đảm bảo được tính chặt chẽ về kiểm tra mạnh trong ngôn ngữ lập trình • Tính mở, nâng cao giá trị sử dụng lại của phần mềm : thuật toán viết một lần sử dụng vô số lần • Đảm bảo hiệu suất tương đương như viết tách từng hàm riêng biệt • Cho phép xây dựng các thư viện chuẩn rất mạnh ( các thuật toán thông • dụng như sao chép, tìm kiếm, sắp xếp, lựa chọn 4 Nhược điểm • Nếu muốn đảm bảo tính mở hoàn toàn thì người sử dụng khuôn mẫu hàm cũng phải có mã nguồn thực thi - Mã nguồn thực thi cần được đặt trong header file - Khó bảo vệ chất xám • Việc theo dõi, tìm lỗi trình biên dịch nhiều khi gặp khó khăn Lỗi nhiều khi nằm ở mã sử dụng, nhưng lại được báo trong mã định nghĩa khuôn mẫu hàm • Định nghĩa và sử dụng không đúng cách có thể dẫn tới gia tăng lớn về mã đích, bởi số lượng hàm khuôn mẫu có thể được tạo ra quá nhiều không cần thiết Ví dụ: // mẫu hàm #include <iostream.h> template <class T> T GetMax (T a, T b) { T result; result = (a>b)? a : b; return (result); } int main () { int i=5, j=6, k; long l=10, m=5, n; k=GetMax<int>(i,j); n=GetMax<long>(l,m); cout << k << endl; cout << n << endl; return 0; } 3) Khuôn mẫu lớp (Class template) 3.1.Khái niệm Có thể sử dụng template để xây dựng một khuôn hình lớp trong đó kiểu thuộc tính được xem như là các đối.Bằng cách đó ta có thể tạo ra một họ các lớp giống nhau về bản chất xử lý,nhưng khác nhau về kiểu dữ liệu. Khuôn hình lớp là những lớp được xây dựng trong đó các thành phần dữ liệu hoặc các hàm thành phần của lớp sử dụng các kiểu dữ liệu trừu tượng.Khi chương trình có nhu cầu sử dụng lớp với những kiểu dữ liệu cụ thể thì chương trình dịch sẽ tự động biên dịch những thể hiện thích hợp nhất. 5 Ta chỉ phải viết định nghĩa các khuôn hình lớp một lần rồi sau đó có thể áp dụng chúng với các kiều dữ liệu khác nhau để được các lớp thể hiện khác nhau 3.2.Ý nghĩa : + Giả sử cần tạo một lớp Stack lưu trữ dữ liệu kiểu int như sau: Class stack { Private: Int st[MAX]; //mảng số nguyên Int top; //chỉ số của đỉnh ngăn xếp Public: Stack(); //hàm tạo Void push(int var);//có đối số kiểu int Int pop(); //trả về kiểu int }; + Lớp stack này chỉ có thể lưu trữ dữ liệu kiểu int. Nếu bây giờ chúng ta muốn lưu trữ dữ liệu kiểu float thì chúng ta cần định nghĩa lại lớp hoàn toàn mới: Class longstack { Private: long st[MAX]; //mảng số nguyên long top; //chỉ số của đỉnh ngăn xếp Public: longStack(); //hàm tạo Void push(long var); //có đối số kiểu long long pop(); //trả về kiểu long }; Bởi vậy, nếu chúng ta có thể viết một lớp mà có thể làm việc được với tất cả các kiểu dữ liệu cơ bản thì sẽ tốt hơn rất nhiều. Và các mẫu lớp cho phép chúng ta làm điều đó. Mẫu lớp thường được sử dụng cho các lớp lưu trữ dữ liệu(các container).Ví dụ ngăn xếp(stack) là một ví dụ về lớp lưu trữ. Các hàm Push, Pop hoàn toàn xử lí giống nhau. Nhưng lại có Stack kiểu int, Stack kiểu char hoặc cả Stack kiểu class do bạn định nghĩa ra. Do đó nếu viết cho mỗi kiểu dữ liệu 1 Stack thì quá mất thời gian. Do đó mởi sử dụng mẫu lớp Như vậy có thể nói rằng sử dụng mẫu lớp mang lại ý nghĩa rất to lớn .Chỉ cần viết một một mô tả lớp mà có thể làm việc được với tất cả các dữ liệu cơ bản Khuôn hình lớp giúp chúng ta có thể tạo ra các lớp mà không cần định nghĩa cho kiểu dữ liệu của lớp tại thời điểm khai báo lớp. Chúng ta cũng có thể sử dụng 6 class templates để xây dựng các lớp giống nhau về bản chất xử lý nhưng khác nhau về kiểu dữ liệu. Chúng ta có thể khai báo mẫu lớp như sau: template <class myType> class C { //Khai báo các thành phần của lớp C } + Khi cần sử dụng mẫu lớp này ta chỉ việc gọi tên mẫu lớp với kiểu dữ liệu cần dùng. VD: C <int> i(a,b); + Dưới đây là một số mẫu lớp thường được dùng: template <class T>; //Kiểu phổ biến với một tham số kiểu. template <class T, class U>; //Hai tham số kiểu. template <class T, int N> //Một tham số kiểu, một tham số giá trị. template <class T = char> //Với một giá trị ngầm định. template <int TFunc (int)> //Hàm là một tham số cho template 3.3.Khai báo Các đối ứng với các kiểu dữ liệu được khai báo như sau: template<class T1,class T2,… ,class Tm> Chú ý + Khuôn hình lớp trong đó có sử dụng các đối T1,T2,…,Tm phải được viết ngay sau dòng khai báo nói trên. + Các đối T1,T2,…,Tm là đối của chỉ khuôn hình lớp này. 3.4. Tham số khuôn hình + Tham số kiểu đại diện cho một kiểu dữ liệu trừu tượng.Một khuôn hình lớp có thể sử dụng được nhiều tham số kiểu + Tham số biểu thức :đối với khuôn hình lớp được tham số biểu thức sử dụng để tạo ra những lớp thể hiện linh động hơn.Giá trị truyền cho tham số biểu thức phải là các hằng số.Ta có thể khai báo một số tùy ý các tham số biểu thức trong danh sách các tham số của khuôn hình hàm.Các tham số này có thể xuất hiện ở bất cứ nơi nào trong định nghĩa của khuôn hình lớp.Khi sản sinh một lớp có các tham số biểu thức,các tham số thực tế tương ứng phải là các biểu thức hằng phù hợp với kiểu dữ liệu đã khai báo trong danh sách các tham số hình thức của khuôn hình lớp 3.5.Cách sử dụng khuôn hình lớp + Các mẫu lớp thường được dùng cho các lớp lưu trữ dữ liệu(các container) + Dùng khuôn hình lớp để tạo một các đối tượng với các kiểu dữ liệu bất kỳ,bằng các câu lệnh khai báo,new,hàm tạo. Ví dụ có thể tạo ra các đối tượng List với kiểu dữ liệu bất kỳ như sau: List <int > x(20); List <Myclass> u(30); + Sử dụng các phương thức để xử lý các đối tượng tạo ra Ví dụ dùng phương thức chỉ số và phép gán: x[3] =7; 7 u[10]=m;//m là một đối tượng kiểu List 4 . Một số Template có sẵn -CArray : template class dùng để tạo ra mảng với các phần tử có kiểu tuỳ ý. CArray cung cấp các mảng tương tự như mảng trong C nhưng với CArray bạn có thể tăng hoặc giảm số lượng các phần tử khi cần thiết. Chỉ số của mảng (array index) luôn bắt đầu từ 0. Các truy suất CArray cũng tương tự như array trong C. -CList : template class dùng để tạo ra list với các phần tử có kiểu tuỳ ý. CList cung cấp các danh sách liên kết đôi đã được sắp xếp. -CMap : template class dùng để tạo ra "map" với các phần tử có key và kiểu tuỳ ý. Giá trị key là duy nhất trong một "map". Dùng CMap bạn có thể coi nó như một cuốn tự điển dể tra cứu 1 cách dễ dàng các phần tử. -TypedPtrArray : template class for type-safe arrays of pointers. -TypedPtrList : template class for type-safe lists of pointers. - TypedPtrMap : template class for type-safe maps with pointers. Ba template class cuối cũng tương tự như 3 template class trước, chỉ khác chữ "pointer" ;) 5. Tổng kết về Template Template trong C++ giúp chúng ta xây dựng lên những hàm, lớp tổng quát. Điều đó có nghĩa là trình biên dịch sẽ tự sinh ra các hàm, lớp khác nhau dựa trên khuôn mẫu sẵn có mà không phải viết nhiều lớp, hàm hoặc viết lại. II) SƠ LƯỢC VỀ THƯ VIỆN STL 1. Định nghĩa STL. Trong C++, Thư viện chuẩn hay Thư viện tiêu chuẩn là một tập hợp của các lớp và các hàm được viết trong phần ngôn ngữ cốt lõi. Thư viện chuẩn này cung cấp nhiều thùng chứa tổng quát, các hàm để làm tiện ích và điều chỉnh cho các thùng chứa, các đối tượng hàm, các dãy kí tự tổng quát và các dòng dữ liệu (bao gồm I/O tương tác và tập tin), hỗ trợ một số tính năng ngôn ngữ, và nhiều hàm thông dụng cho các thao tác như là tìm căn bậc hai. Chuẩn C++ cũng bao gồm cả Thư viện chuẩn C. Nhiều chức năng của thư viện chuẩn C++ là các khai báo trong không gian tên std. Tác giả đầu tiên của STL là Alexander Stepanov, mục đích của ông là xây dựng một cách thể hiện tư tưởng lập trình tổng quát. Các khái niệm trong STL được phát triển độc lập với C++. Do đó, ban đầu, STL không phải là một thư viện C++, mà nó đã được chuyển đổi thành thư viện C++. Nhiều tư tưởng dẫn đến sự phát triển của STL đã được cài đặt phần nào trong Scheme, Ada, và C. Thư viện STL cung cấp sẵn những lớp phổ biến được thiết lập cho C/C+ + . Đặc điểm thư viện STL này là được hỗ trợ trên các trình biên dịch ở cả hai môi trường WINDOWS lẫn UNIX. Vì vậy nên khi sử dụng thư viện này trong xử lý thuận tiện cho việc chia sẽ mã nguồn với cộng đồng phát triển. 8 2.Các thực thể STL chứa vài loại thực thể. Trong đó có ba loại quan trọng nhất là các : containers, iterators,algorithms. a.Container Container (thùng chứa) là khái niệm chỉ các đối tượng lưu trữ các đối tượng (giá trị) khác. Đối tượng container sẽ cung cấp các phương thức để truy cập các thành phần (element) của nó. Cụ thể hơn, tất cả các container đều chứa các bộ lặp (iterator) để cho phép duyệt qua toàn bộ các element của container. Các container được phân loại theo tính chất thứ tự của các element, bao gồm các loại sau: - Forward container - Reversible container - Random Access container Một số container hay được sử dụng nhất gồm vector (tương tự như mảng), vector là Random access container (người dùng có thể truy cập trực tiếp bất cứ phần tử nào trên vector). Có các loại container • Container tuần tự: Lưu trữ một tập hợp các phần tử mà có thể hình dung như một đường thẳng như các nhà trên một phố.Mỗi phần tử liên kết với một tử khác bằng vị trí của nó theo đường thẳng.Mỗi phần tử trừ phần tử cuối cùng đều có một phần tử xác định đứng trước hoặc sau nó • Container liên kết Là một loại container không tuần tự,thay vào đó nó sử dụng các khóa đẻ truy nhập dữ liệu.Các khóa điển hình là các số và các chuỗi ,được sử dụng tự động bởi container để sắp xếp các phần tử lưu trữ theo một trật tự nhất định.Nó giống như một quển từ điển Tiếng Anh mà ở đó chúng ta có thể truy nhập dữ liệu bằng cách tra các từ đã được sắp xếp theo thứ tự alphabe. b)Interator(Con trỏ) Các con trỏ(integrator) la các thực thể giống như các con trỏ được sử dụng để truy nhập các mục dữ liệu trong một container. Nó thường được sử dụng để di chuyển liên tiếp từ phần tử này sang phần tử kia Giống như một con trỏ trỏ tới một phần tử mảng, một vài kiểu integrator có thể lưu trữ vị trí của một phần tử conteraner cụ thể. Trong STL một interator biểu diễn bằng một đối tượng của một lớp integrator Các integrator khác nhau phải được dùng với các kiểu container khác nhau. Có 3 lớp integrator chính: integrator tiến(forward interator), interator 2 chiều(bidirectional interator), và interator truy nhập ngẫu nhiên( rondom- access interator) Thư viện STL cung cấp 5 kiểu khác nhau của interoters.Input iterators interoters(có thể lựa chọn sử dụng chỉ để đọc vào một chuỗi các giá trị).Output interroters (có thể lựa chọn sử dụng chỉ để viết ra một chuỗi các giá trị),Forward 9 Interoters(Lựa chọn để đọc vào ,viết ra và rời forward)Bidirectional Interoters(lựa chọn giống như Forward nhưng ngoài ra có thể rời lùi lại) Random acess Interoters(Có thể tự do rời bất kì một số thao tác tại bước đó) c) algorithms(Giải thuật) Giải thuật trong STL: STL cung cấp các thuật toán cơ bản nhằm mục đích giúp bạn không phải code lại những giải thuật quá cơ bản như (sắp xếp, thay thế, tìm kiếm ). Các công cụ này không những giúp bạn rút ngắn thời gian lập trình mà còn cả thời gian gỡ rối khi thuật toán cơ bản được cài đặt không chính xác Giải thuật tìm kiếm: • Tìm kiếm tuyến tính: bắt đầu so sánh từ phần tử đầu tiên rồi cứ như vậy tìm tuần tự theo danh sách cho đến khi tìm ra mục dữ liệu cho trước hoặc đạt đến cuối danh sách • Tìm kiếm nhị phân • • Tìm kiếm sử dụng mảng băm Giải thuật sắp xếp: • Sắp xếp bằng chọn lựa đơn giản • Sắp xếp kiểu sủi bọt • Sắp xếp kiểu chèn • Heapsort Để khai báo sử dụng STL algorithm, các bạn phải inlucde file header algorithm #include <algorithm> Do thư viện <algorithm> gồm rất nhiều hàm khác nhau, người ta phân thành các nhóm hàm sau: - Nhóm các hàm không thay đổi giá trị của container - Nhóm các hàm thay đổi giá trị của container - Nhóm các hàm sắp xếp - Nhóm các hàm trên danh sách được sắp xếp - Nhóm các hàm trộn - Nhóm các làm trên heap - Nhóm các hàm tìm min/max 10 [...]... liên quan đến việc tìm ra một vị trí trong mảng để chèn vào một tên mới .Hàm comprase(str,pos,n) so sánh một dãy n kí tự trong đối tượng của nó,bắt đầu từ vị trí pos,với đối tượng string trong đối số của nó.Giá trị trả về cho biết hai đối tượng string được sắp xếp theo thứ tự alphabe như thế nào Giá trị trả về ::empty() { If(h= =-1) return 1; Else return 0; } 18 TÀI LIỆU THAM KHẢO • Bài giảng: Ngôn ngữ lập trình C ++ và lập trình hướng đối tượng Thầy : Ngô Công Thắng • Ngôn ngữ lập trình C ++ và cấu trúc dư liệu Tác giả :Pham Van At • http://www.cppreference.com/wiki/stl/stack/start • http://www.mediafire.com/?zljygydnyyz • http://www.uitstudent.com/forum/showthread.php?p=9765... getchar(); 2.8 .Hàm substr(int pos, int nchar) Trích ra chuỗi con của một chuỗi cho trước Ví dụ str.substr(2,4) trả về chuỗi con gồm 4 ký tự của chuỗi str kể từ ký tự ở vị trí thứ 2 (ký tự đầu tiên của chuỗi ở vị trí 0) 2.9 .Hàm thành viên coppy() Hàm thành viên copy() cho phép copy một đối tượng string (hoặc một phần của nó)tới một chuỗi char*.Đặc biệt hơn,copy(ptr,n,pos)copy n kí tự từ đối tượng của nó... các File tiêu đề cho thích hợp với từng trình biên dịch cụ thể • Lớp string có nhiều hàm tạo cho phép chúng ta có thể tạo các đối tựong theo nhiều cách khác nhau Chúng có thể được khởi tạo với chiều dài bằng 0( hàm tạo mặc định), tới các đối tượng string khác, tới các chuỗi char *( chuỗi C thong thừờng), tới một dãy liên tiếp các kí tự ở bất kì vị trí nào trong đối tựong string hoặc một chuỗi char*,... giá trị pos thì hiểu mặc nhiên là 0; nếu tìm có thì phương thức trả về vị trí xuất hiện đầu tiên, ngược lại trả về giá trị -1 Ví dụ: // inserting into a string #include #include #include using namespace std; int main () { string str="ConCho chay qua rao"; cout . VIỆC: Tìm hiểu về khuôn mẫu hàm( HUYỀN). Tìm hiểu về khuôn mẫu lớp( THUÝ). Tìm hiểu thư viện STL(QUỲNH). Tìm hiểu về lớp string chuẩn và các hàm thành viên(CHƯƠNG). Tìm hiểu chương trình (Cả nhóm) 2 A). Tìm hiểu về mẫu hàm (function template), mẫu lớp (class template): Ý nghĩa và cú pháp cài đặt. Trình bày sơ lược về thư viện STL. Cách sử dụng lớp string chuẩn và các hàm thành viên của lớp. ngữ lập trình. III) CÁCH SỬ DỤNG LỚP STRING CHUẨN VÀ CÁC HÀM THÀNH VIÊN CỦA LỚP NÀY. 1.Cách sử dụng lớp String 2.Các hàm thành viên của lớp này B_CHƯƠNG TRÌNH PHÂN CÔNG CÔNG VIỆC: Tìm hiểu về