Tải bản đầy đủ (.doc) (19 trang)

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)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (455.63 KB, 19 trang )

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
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.
Trong C, việc sử dụng con trỏ để lưu xâu kí tự là rất phức tạp, dễ gây lỗi
khiến nhiều người cho rằng nó làm việc không bằng xâu kí tự trong Pascal.
Trong C++, các hàm thư viện khai báo trong thư viện string.h cũng cho
phép chúng ta sử dụngcách thức cũ của C nhưng có nhiều bất tiện khi
sử dụng theo cách này:
• Chúng ta phải chủ động kiểm soát bộ nhớ cấp phát chi chuỗi
kí tự. Nói chung, chúng ta phải rất am hiểu về kĩ thuật cấp phát bộ nhớ
và sử dụng con trỏ thì mới có thể sử dụng được cách này mà tránh được
các lỗi kĩ thuật. Chúng ta không thể thực hiện được các phép toán
gán giá trị hoặc các phép toán như phép cộng chuỗi, các phép so sánh
hơn (>), kém (<)
• Nếu dùng kĩ thuật cấp phát động thì phải quản lí việc cấp phát bộ
nhớ khi xâu mở rộng hoặc hủy bộ nhớ khi xâu kết thúc để tránh việc cạn
bộ nhớ khi có nhiều chương trình cùng chạy.
Thư viện chuẩn STL trong C++ cung cấp cho chúng ta một kiểu string giúp
chúng ta tránh hoàn toàn các phiển phức ở trên.
1.Cách sử dụng lớp String
File tiêu đề
• Các hãng sản xuất cài đặt lớp String theo nhiều cách hơi khác nhau. File
tiêu đề cài đặt lớp String trong Borland là CSTRING.H. Với các trình biên dịch
khác, tên File tiêu đề có thể khác nhau. Các File này có thể là BSTRING.H hoặc
STRNG và một vài tên khác. Chúng ta nên thay thế 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
*
, tới các kí tự riêng và tới một dãy liên tiếp các kí tự.
• Các toán tử << và >> đựoc chồng cho vào /ra. Toán tử chồng [ ] cho
phép chúng ta truy nhập một kí tự riêng lẻ trong một đối tượng string nếu biết vị
trí của nó. Toán tử “= “ làm việc như mong đợi, gán một đối tượng string tới
một đối tượng string khác và toán tử “+” noois 2 đối tượng string lại
2.Các hàm thành viên của lớp này
2.1.Hàm length( ) và phép lấy chỉ số [ ]
Để duyệt từng ký tự của chuỗi: nếu s là biến kiểu string thì s[i] là ký tự thứ i
của s với 0 ≤ i <s.length( )
2.2. Hàm chèn xâu(insert)
Chèn thêm ký tự hay chuỗi vào một vị trí nào đó của chuỗi str cho trước. Có
nhiều cách dùng phương thức này:
11
str.insert(int pos, char* s): chèn s (mảng ký tự kết thúc ‘\0’) vào vị trí
pos của str;
str.insert(int pos, string s): chèn chuỗi s (kiểu string) vào vị trí pos của
chuỗi str;
Ví dụ:
//inserting into a string
#include<iostream>
#include(string>
#include<stdlib.h>
Using name space std;

Int main ()
{
String str=”day la xau thu “;
String istr =”them”
Str.insert(8,istr);
Cout<<str<<end;
Getchar ();
}
2.3. Hàm xóa xâu(erase)
Phương thức str.erase(int pos, int n) xóa n ký tự của chuỗi str kể từ vị trí
pos; nếu không quy định giá trị n thì tất cả các ký tự của str từ vị trí pos trở đi sẽ
bị xóa.
Ví dụ
// inserting into a string
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int main ()
{
string str="day cung la xau thu";
str.erase(0, 3); // " cung la xau thu"
cout << str << endl;
str.erase(6, 2);
cout << str << endl; // " cung xau thu"
getchar();
}
2.4.Hàm thay thế xâu kí tự(replace)
12
Hàm thay thế xâu kí tự replace( ) thay thế một đoạn con trong chuỗi str cho

trước (đoạn con kể từ một vị trí pos và đếm tới nchar ký tự ký tự về phía cuối
chuỗi) bởi một chuỗi s nào đó, hoặc bởi n ký tự ch nào đó. Có nhiều cách dùng,
thứ tự tham số như sau:
str.replace(int pos, int nchar, char *s);
str.replace(int pos, int nchar, string s);
str.replace(int pos, int nchar, int n, int ch);
Ví dụ:
// inserting into a string
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int main ()
{
string str="con cho la con cho con. Con meo ko phai la con cho";
str.replace(4, 3, "CHO"); // "con CHO la con cho con. Con meo ko phai
la con cho";
cout << str << endl;
getchar();
}
2.5.Hàm lấy xâu con(string)
Ví dụ
// inserting into a string
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int main ()
{
string str="ConCho chay qua rao";

string str2 = string(str.begin()+0, str.begin()+3); // "Con"
cout << str2 << endl;
str2 = string(str.begin()+7, str.begin()+11); // "chay"
cout << str2 << endl;
getchar();
13
2.6.Hàm tìm kiếm xuôi(Find)
Hàm tìm kiếm xuôi find( ) tìm kiếm xem một ký tự hay một chuỗi nào đó
có xuất hiện trong một chuỗi str cho trước hay không. Có nhiều cách dùng hàm
này:
str.find(int ch, int pos = 0): tìm ký tự ch kể từ vị trí pos đến cuối chuỗi
str
str.find(char *s, int pos = 0): tìm s (mảng ký tự kết thúc ‘\0’) kể từ vị trí
pos đến cuối
str.find(string& s, int pos = 0): tìm chuỗi s kể từ vị trí pos đến cuối
chuỗi.
Nếu không quy định 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 <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int main ()
{
string str="ConCho chay qua rao";
cout << str.find("chay") << endl; // 7
cout << (int)str.find("Chay") << endl; // -1
getchar();

2.7.Hàm tìm kiếm ngược(rFind)
// inserting into a string
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int main ()
{
string str="ConCho chay qua chay qua rao";
cout << str.find("chay") << endl; // 7
cout << (int)str.rfind("chay") << endl; // 16
14
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ó ,bắt đầu từ vị trí pos tới chuỗichar*ptr
2.10.Hàm thành viên c_str()
Hàm thành viên c_str() chuyển một đối tượng string sang một chuỗi
char*.Nghĩa là nó trả về một con trỏ trỏ tới một mảngchar chứa các kí tự từ đối
tượng string,cộng với ký tự kết thúc’\0’.Con trỏ trả về từ c_str() là const,bởi vậy
chúng ta không thể thay đổi bất kì cái gì trong mảng char đó,nó chỉ để đọc
2.11.Hàm thành viên comprase()
Hầu hết các lệnh trong chương trình đều 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ề <0 Chuỗi hiện tại đứng sau đối số str theo thứ tự alphabe
Giá trị trả về =0 Chuỗi hiện tại bằng str
Giá trị trả về >0 Chuỗi hiện tại đứng trước str theo thứ tự alphabe
Vhương trình so sánh tên với từng phần tử cuả mảng.Nếu tên mới lớn hơn phần
tử mảng,phần tử tiếp theo được kiểm tra.Nếu không,tên mới được chèn vào tại
vị trí đó trong mảng và tất cả cá đối tượng string từ điểm đó trở lên được di
chuyể để có thể chèn vào tên mới.
2.1.2.Một số phương pháp khác
append( ), find_first_not_of( ), find_last_not_of( ), swap( ), c_str( ).
15
B_CHƯƠNG TRÌNH
#include <iostream>
#include <string>
using namespace std;
//tao lop doi tuong ngan xep
template< class Type, int m >
class Stack
{
private:
int h;
Type p[m];
public:
Stack();
~Stack();
void push(Type);
Type pop();
Type top();

int empty();
int full();
};
// chuong trinh chinh
int main()
{
string str;
cout<<"CHUONG TRINH CAI DAT LOP DOI TUONG
NGAN XEP\n";
cout<<"Giang vien huong dan : NGÔ CÔNG THẮNG\n”;
cout<<”Nhom sinh vien thuc hien:\n”;
cout<<"\tNguyen Thi Huyen\n";
cout<<"\tNguyen Thi Thu Quynh\n";
cout<<"\tPhan Thi Chuong\n";
cout<<"\tDuong Thi Thanh Thuy\n";
cout<<"Ban hay nhap vao mot cau van: ";
getline(cin,str);
string ptr = str;
ptr += ' ';
string tmpstr = "";
Stack<string, 50> s;
16
// tach cac tu va dua vao stack
for(int i = 0; i< ptr.length(); i++)
{
tmpstr += ptr[i];
if(ptr[i] == ' ')
{
s.push(tmpstr);
tmpstr = "";

}
}
// lay cac tu trong stack va viet ra man hinh
cout<<endl;
cout<<"Cau van sau khi tach la\n";
while(!s.empty())
cout<<s.pop();
cout << endl;
return 0;
}
//dinh nghia cac ham thanh vien cua lop stack
template< class Type, int m >
Stack< Type, m >::Stack()
{
h = -1;
}
//
template< class Type, int m >
Stack< Type, m >::~Stack()
{
delete[] p;
}
//
template< class Type, int m >
void Stack< Type, m >::push(Type a)
{
p[ ++h ] = a;
}
//
template< class Type, int m >

Type Stack< Type, m >::pop()
17
{
return p[ h ];
}
//
template< class Type, int m>
Type Stack< Type, m >::top()
{
return p[h];
}
//
template< class Type, int m >
int Stack< Type, m >::full()
{
If (h= =m-1) return 1;
Else return 0;
}
//
template< class Type , int m>
int Stack< Type, m >::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



• =9765
• k_template.html

mau-ham-va-khuon-mau-lop.177389.html

19

×