1. Trang chủ
  2. » Luận Văn - Báo Cáo

BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Tìm hiểu về mẫu hàm (function template), mẫu lớp (class template)

19 644 0

Đ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 19
Dung lượng 191,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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

Trang 1

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

Trang 2

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)

Trang 3

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ó.

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

Trang 4

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

Trang 5

Nhược điểm

hàm cũng phải có mã nguồn thực thi

 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

Trang 6

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:

Public:

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 top; //chỉ số của đỉnh ngăn xếp Public:

longStack(); //hàm tạo

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

Trang 7

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;

Trang 8

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

Trang 9

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

Trang 10

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

Giải thuật sắp xếp:

 Sắp xếp kiểu sủi bọt

Để 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

III) CÁCH SỬ DỤNG LỚP STRING CHUẨN VÀ CÁC HÀM THÀNH

Ngày đăng: 14/04/2015, 09:00

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w