Tải bản đầy đủ (.pdf) (32 trang)

báo cáo lập trình hướng đối tượng

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 (599.97 KB, 32 trang )




TRƯỜNG ĐẠI HỌC CHU VĂN AN
2009
BÁO CÁO LẬP TRÌNH
HƯỚNG ĐỐI TƯỢNG
Nhóm 11 – Đề tài 6

Năm học 2009 - 2010

Nhóm 11 – Đề tài số 6 Trang 2
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
LỜI NÓI ĐẦU
Trước tiên, chúng em xin gửi lời cảm ơn chân thành nhất tới
thầy Ngô Công Thắng – giảng viên đã trực tiếp giảng dạy, chỉ
bảo chúng em trong quá trình học tập, đặc biệt là trong khi
làm đồ án này.
Xin chân thành cảm ơn tới tất cả các sinh viên, học viên
đang học tập và thực hiện đồ án cùng chúng mình đã chia sẻ tài
liệu và góp ý giúp chúng mình hoàn thiện đề án này.
Khi thực hiện đề án, chúng mình có tham khảo và sử dụng bài
viết của nhiều thành viên trên các diễn đàn và bài giảng của
nhiều thày, cô giáo. Chúng em xin phép được sử dụng những bài
viết, bài giảng trên như là một phần của bài thuyết trình mà
chúng em viết. Xin chân thành cảm ơn sự đóng góp của cộng đồng
C việt, của các thành viên trên các diễn đàn.
Đồ án của chúng em được chia thành các phần như sau:
I. Template trong C++.
II. Stander Template Library.


III. Lớp String chuẩn và các hàm thành viên.
Trong quá trình thực hiện đề án, chúng em có nhiều điều
sơ xuất, kính mong thầy thứ lỗi cho chúng em về nhưng sơ xuất
trên và góp ý cho chúng em để chúng em hoàn thiện hơn đề án
của mình.
Thay mặt nhóm, một lần nữa chúng em xin cảm ơn sự dạy dỗ ân
cần của thầy!

Nhóm 11
Chu Đức Công
Lê Văn Hoàn
Nguyễn Văn Vương

Nhóm 11 – Đề tài số 6 Trang 3
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
Mục lục:
Mục lục 3
I. Template trong C++ 4
1. Định nghĩa 4
a. Đặt vấn đề 4
b. Định nghĩa 4
2. Function template 5
3. Class template 6
4. Tổng kết về template 7
II. Stander template library 7
1. Định nghĩa STL 7
2. Thư viện chuẩn các mảng chứa 8
3. Thư viện chuẩn tổng quát 9
4. Thư viện chuẩn các dãy ký tự 9

5. Thư viện chuẩn stream và in/output 10
6. Thư viện chuẩn các số 11
7. Thư viện chuẩn hỗ trợ ngôn ngữ lập trình 11
8. Các thành phần chính của STL 12
III. Lớp string chuẩn và các hàm thành viên 13
A. Khái niệm 13
B. Các hàm thành viên trong thư viện string 14
C. Các phương thức, phép toán, tiện ích của thư viện string 21
a. Các phép toán và phương thức cơ bản 21
b. Chèn, xóa, lấy chuỗi con 24
c. So sánh 26
d. Tìm kiếm và thay thế 27
e. Tách xâu 29
f. Chuyển đổi hàng loạt với transform() 31
g. Một số phương thức khác 32
Tài liệu tham khảo 32








Nhóm 11 – Đề tài số 6 Trang 4
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
I. Template trong C++.
1. Định nghĩa.
a. Đặt vấn đề.

Khi viết chương trình, chúng ta luôn muốn tạo ra một tập
hợp các đối tượng. Các đối tượng này có thể cùng loại hoặc
khác loại.
VD: Mảng, danh sách, hàng đợi, ngăn xếp, đều là tập hợp
các đối tượng được xây dựng theo kiểu lớp chứa. Tức là lớp
được dùng để xây dựng tập hợp các đối tượng.
Với các kiến thức thông thường, chúng ta hoàn toàn có thể
xây dựng những lớp chứa như vậy. Nhưng với mỗi kiểu phần tử,
chúng ta lại phải chỉnh sửa chương trình nguồn. Cách làm thế
này là không thuận tiện.
C++ cho phép chúng ta định nghĩa ra một lớp “tổng quát”,
kiểu của phẩn tử trở thành tham số. Khi cần sử dụng, chúng ta
chỉ cần cung cấp kiểu cụ thể của tham số là có thể tạo ra lớp
mới.
b. Đị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 rất
mạnh nhưng cũng rất phức tạp. Template được cha đẻ của C++
(Bjarne Stroustrup) sáng tạo với mong muốn tạo ra sự chung
nhất giữa các ngôn ngữ lập trình hướng đối tượng chứ không
phải dành riêng cho C++.
Template không phải là các hàm, lớp thông thường, chúng
được complie dựa theo yêu cầu, có nghĩa là code của template
function không được biên dịch (complie) cho đến khi có một thể
hiện (instantiation) của nó được đòi hỏi (sử dụng). Ngay lúc
đó complier tạo ra một hàm cụ thể cho kiểu dữ liệu cụ thể việc
chuyên môn hoá mẫu cho phép ta tạo ra những bản thực thi đặc

Nhóm 11 – Đề tài số 6 Trang 5
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

2009
biệt khi làm việc với một loại dữ liệu xác định nào đó.nó cho
phép ta lựa chọn dữ liệu có tính chọn lọc.
Nếu một chương trình biên dịch C++ vẫn chưa tương thích với
chuẩn template của ANSI-C++ thì sẽ không thể sử dụng được
template.
VD về template:
template <class myType>
myType GetMax (myType a, myType b)
{
return (a>b?a:b);
}
2. Function tempalte.
Function template là các mẫu hàm cho phép tạo các hàm có
thể chấp nhận bất kì kiểu dữ liệu nào làm tham số và trả về
giá trị với kiểu dữ liệu của tham số mà không phải thực hiện
xây dựng nhiều hàm bằng cách định nghĩa chồng hàm với tất cả
các kiểu dữ liệu có thể xuất hiện.
Khai báo Function template có thể sử dụng một trong hai
cách sau:
template <class identifier> function_declaration;
template <typename identifier> function_declaration;
Sự khác biệt duy nhất giữa hai kiểu khai báo mẫu này là
việc sử dụng từ khoá class hay typename, sự khác nhau giữa
chúng là không rõ ràng vì cả hai đều có cùng một ý nghĩa và
đều trả về một kết quả như nhau.
Hàm mẫu được gọi thông qua lời gọi hàm, nội dung của hàm
mẫu cũng giống như các hàm bình thường, chỉ khác một điều là
kiểu dữ liệu được hàm mẫu trả về là kiểu dữ liệu của đối số
nạp vào hàm mẫu. Chúng ta có cấu trúc gọi sau:

function_name <type> (parameters);

Nhóm 11 – Đề tài số 6 Trang 6
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
Tức là chúng ta gọi tên hàm, định kiểu dữ liệu của tham số
và gọi tham số truyền vào hàm giống như các hàm bình thường,
sẵn có của C++.
VD:
// function template
#include <iostream>
using namespace std;
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;
}
Với hàm mẫu trên, chúng ta phân tích như sau: Dòng đầu tiên
chúng ta khai báo một template với kiểu dữ liệu tổng quát là
myType. Dòng lệnh thứ 2, myType là kiểu dữ liệu mà tham số a,b

được nạp vào, đồng thời myType cũng là kiểu dữ liệu trả về của
hàm GetMax.
Có thể hiểu tóm tắt như sau: Lúc đầu hàm mẫu nhận kiểu dữ
liệu tổng quát là myType, khi có tham số nạp vào thì kiểu dữ
liệu của hàm mẫu từ kiểu myType thành kiểu của tham số. Kiể dữ
liệu trả về cũng là kiểu dữ liệu mà tham số mang vào hàm mẫu.
Trong một Function template, có thể chấp nhận nhiều tham số
với nhiều kiểu dữ liệu khác nhau. Điều này cũng có nghĩa là
chúng ta cần cân nhắc cẩn thận kiểu dữ liệu trả về của hàm
mẫu.

Nhóm 11 – Đề tài số 6 Trang 7
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
3. Class template.
Class templates là các mẫu 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 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.
4. Tổng kết về temmplate.
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. Stander Template Library.
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

Nhóm 11 – Đề tài số 6 Trang 8
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
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 chuẩn trong C++ gồm 32 thư viện. Trong đó, ngoại
trừ thư viện String ra thì tất cả các thư viện còn lại là thư
viện mẫu chuẩn. Sau đây là các thư viện chuẩn và miêu tả chung
của chúng:
2. Thư viện chuẩn các mảng chứa.
bitset: Định nghĩa lớp tiêu bản bitset và các hàm hỗ trợ
cho việc hiển thị và điều chỉnh các dãy bit có độ dài cố định.
deque: Định nghĩa lớp tiêu bản deque (hàng) và nhiều tiêu
bản hỗ trợ.
list: Định nghĩa lớp tiêu bản list (danh sách) và nhiều
tiêu bản hỗ trợ.
map: Định nghĩa lớp tiêu bản map và <multimap> và nhiều
tiêu bản hỗ trợ.
queue: Định nghĩa các lớp tiêu bản priority_queue và queue
cùng với nhiều tiêu bản hỗ trợ.
set: Định nghĩa lớp tiêu bản set và nhiều tiêu bản hỗ trợ.
stack: Định nghĩa lớp tiêu bản stack (chồng) và các tiêu
bản hỗ trợ.

Nhóm 11 – Đề tài số 6 Trang 9
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
vector: Định nghĩa lớp tiêu bản vector và nhiều tiêu bản hỗ
trợ.
3. Thư viện chuẩn tổng quát.
algorithm: Định nghĩa nhiều hàm thực thi các thuật toán về
thùng chứa trong Thư viện tiêu bản chuẩn STL.

functional: Định nghĩa các hàm nhằm giúp cho việc xây dựng
các đối tượng hàm trong Thư viện tiêu bản chuẩn (còn có tên là
hàm tử).
iterator: Định nghĩa các biến lặp cơ bản, định nghĩa sẳn
các biến lặp, biến lặp dòng, cũng như là các tiêu bản hỗ trợ.
locale: Định nghĩa các lớp tiêu bản và các hàm mà chưong
trình C++ có thể dùng để tạo đặc tính đóng và điều chỉnh các
yếu tố định dạng và biểu thị của các số, tiền tệ, dữ liệu về
ngày tháng bao gồm hỗ trợ ngôn ngữ quốc tế cho sự phân lớp kí
tự và sự sắp xếp dãy kí tự.
memory: Định nghĩa một lớp, một toán tử và nhiều tiêu bản
nhằm giúp cấp phát và trả về (vùng nhớ) của các đối tượng.
stdexcept: Định nghĩa nhiều lớp chuẩn dùng cho việc báo cáo
các ngoại lệ. Các lớp tạo nên một hệ phân nhánh mà tất cả đều
dẫn xuất từ lớp exception và bao gồm hai kiểu ngoại lệ thông
dụng: lỗi lô-gíc và lỗi trong thời gian thi hành.
utility: Định nghĩa các kiểu, hàm, và toán tử trong Thư
viện tiêu bản chuẩn STL nhằm giúp cho việc xây dựng và quản lý
các cặp đối tưọng. Nó hữu dụng, khi hai đối tượng cần được
hành xử như chúng là một.
4. Thư viện chuẩn các dãy ký tự.
string: Định nghĩa thùng chứa lớp tiêu bản basic_string và
nhiều hỗ trợ cho các tiêu bản.
5. Thư viện chuẩn Streams và input/output.

Nhóm 11 – Đề tài số 6 Trang 10
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
fstream: Định nghĩa các lớp hỗ trợ các phép toán cho dòng
xuất nhập (iostream) trên các chuỗi chứa trong các tập tin bên

ngoài.
ios: Định nghĩa nhiều kiểu và hàm cơ bản cho các xử lý của
các dòng xuất nhập. Tiêu đề này thưòng bao gồm nhiều tiêu đề
dòng xuất nhập khác mà ít khi được khai báo qua lệnh #include
trực tiếp.
iostream: Định nghĩa các đối tượng để đọc và viết ra các
dòng tiêu chuẩn (standard stream). Đây thường là tiêu đề duy
nhất cần phải bao gồm để tiến hành xuất và nhập (dữ liệu) từ
C++.
iosfwd: Khai báo trước các tham chiếu cho nhiều tiêu bản để
dùng suốt quá trình xuất nhập dòng. Tấr cả các tiêu bản như
vậy được định nghĩa trong các tập tin tiêu đề chuẩn khác. Chỉ
xử dụng tập tin tiêu đề này khi cần có một trong số các khai
báo của nó, nhưng không phải là định nghĩa của nó.
iomanip: Định nghĩa nhiều phép điều chỉnh mà nó lấy vào một
đối số.
istream: Định nghĩa lớp tiêu bản basic_istream, tiêu bản
này làm trung gian cho các sự chèn vào và lấy ra (dữ liệu).
Tiêu đề cũng định nghĩa một bộ điều chỉnh. Tập tin tiêu đề này
thường được sử dụng bởi các tiêu đề về dòng xuất nhập khác, nó
hiếm khi được bao gồm trực tiếp trong mã nguồn của người lập
trình.
ostream: Định nghĩa lớp tiêu bản basic_ostream, tiêu bản
này làm trung gian cho các sự chèn (dữ liệu) vào cho các dòng
xuất nhập. Tiêu đề cũng định nghĩa một bộ điều chỉnh. Tập tin
tiêu đề này thường được sử dụng bởi các tiêu đề về dòng xuất
nhập khác, nó hiếm khi được bao gồm trực tiếp trong mã nguồn
của người lập trình.
sstream: Định nghĩa nhiều lớp tiêu bản mà nó hổ trợ các
phép toán của dòng xuất nhập trên các chuỗi (dữ liệu) chứa


Nhóm 11 – Đề tài số 6 Trang 11
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
trong một đối tượng mảng đã dược cấp phát vùng nhớ. Những
chuỗi này rất dể chuyển đổi để tạo thành các đối tượng của lớp
tiêu bản basic_string.
streambuf: Bao gồm tiêu đề chuẩn cho các dòng xuất nhập của
<streambuf> dùng để định nghĩa lớp tiêu bản basic_streambuf.
Lớp này là cơ sở cho phép toán của các lớp của dòng xuất nhập.
Tiều đề này thường được bao gồm sẵn trong các tiêu bản về dòng
xuất nhập khác, nó hiếm khi được bao gồm trực tiếp trong mã
nguồn của người lập trình.
6. Thư viện chuẩn các số.
complex: Định nghĩa lớp tiêu bản complex và hỗ trợ nhiều
tiêu bản.
numeric: Định nghĩa các hàm tiêu bản thùng chứa nhằm tiến
hành các thuật toán cung cấp cho việc xử lí số.
valarray: Định nghĩa lớp tiêu bản valarray hỗ trợ các lớp
tiêu bản và các hàm.
7. Thư viện chuẩn hỗ trợ ngôn ngữ lập trình.
exception: Định nghĩa nhiều kiểu và hàm liên hệ tới việc xử
lý các ngoại lệ. Việc xử lí ngoại lệ được dùng trong tình
huống mà máy tính có thể phục hồi từ các lỗi. Nó cung ứng ý
nghĩa cho việc trả về quyền điều khiển cho chương trình.
limits: Định nghĩa các lớp tiêu bản numeric_limits và lo về
việc biểu thị thứ tự của các điểm động và việc làm tròn.
new: Định nghĩa nhiều kiểu và hàm mà nó điều khiển việc cấp
phát cũng như trả về (bộ nhớ) của kho dự trữ dưới sự kiểm soát
của chương trình. Nó cũng định nghĩa các thành phần cho việc

báo cáo về quản lý của kho dự trữ.
typeinfo: Hỗ trợ cho nhận dạng kiểu động.
8. Các thành phần chính của STL gồm:

Nhóm 11 – Đề tài số 6 Trang 12
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
A. Container: Các cấu trúc dữ liệu template.
B. Interator: Giống con trỏ, dùng để truy cập các phần
tử dữ liệu của các container.
C. Algorithm: Các thuật toán để thao tác dữ liệu, tìm
kiếm, sắp xếp,
Trong Container của STL lại gồm có 3 loại như sau:
D. Sequence container – container chuỗi:
 Các cấu trúc dữ liệu tuyến tính (vector, danh sách
liên kết).
 first-class container.
 vector, deque, list.
E. Associative container – container liên kết:
 Các cấu trúc phi tuyến, có thể tìm phần tử nhanh
chóng.
 first-class container
 các cặp khóa/giá trị
 set, multiset, map, multimap
F. Container adapter – các bộ tương thích container
stack, queue, priority_queue.
Các hàm thành viên mọi container đều có:
o Default constructor, copy constructor, destructor
o empty
o max_size, size

o = < <= > >= == !=
o swap
Các hàm thành viên của first-class container:
o begin, end
o rbegin, rend
o erase, clear

Nhóm 11 – Đề tài số 6 Trang 13
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
III. Lớp string chuẩn và các hàm thành
viên.
A. Khái niệm.
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ụng
cá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.
Các khai báo cần có để sử dụng string.
#include <string>
using std::string;
using namespace std;
B. Các hàm thành viên trong thư viện string.
 Hàm Copy():
Cú pháp: copy (ptr,n,pos)

Nhóm 11 – Đề tài số 6 Trang 14
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
Ý nghĩa: copy n kí tự từ đối tượng của nó, bắt đầu từ vị
trí pos tới chuỗi char*ptr.
Chức năng: hàm copy cho phép copy một đối tượng string sang
một chuỗi char*.
 Hàm insert():
Cú pháp: insert (pos,ptr)
Ý nghĩa: chèn chuỗi char*ptr vào đối tượng của nó, bắt đầu
tại vị trí pos.
Chức năng: 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:
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 str;
str.insert (int pos, int n, int ch): chèn n lần kí tự ch
vào vị trí pos của str;
ví dụ:

#include <iostream>
#include <string>
using namespace std;

int main()
{
string str1 ( "String handling C++ style." ) ;
string str2 ( "STL Power" ) ;
cout << "Initial strings:\n" ;
cout << "str1: " << str1 << endl;
cout << "str2: " << str2 << "\n\n" ;
// demonstrate insert()
cout << "Insert str2 into str1:\n" ;
str1. insert ( 6, str2 ) ;

Nhóm 11 – Đề tài số 6 Trang 15
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
cout << str1 << "\n\n" ;
return 0 ;
}
 Hàm erase():
Cú pháp: erase(int pos,int n)
Chức năng: xóa n kí tự khỏi đối tượng của nó, bắt đầu tại
vị trí pos.
Nếu không qui định giá trị của n thì tất cả các kí tự của
str kể từ vị trí pos trở đi sẽ bị xóa.
Ví dụ:
#include <iostream>
#include <string>

using namespace std;
int main ()
{
string str1 ( "String handling C++ style." ) ;
string str2 ( "STL Power" ) ;
cout << "Initial strings:\n" ;
cout << "str1: " << str1 << endl;
cout << "str2: " << str2 << "\n\n" ;
// demonstrate erase()
cout << "Remove 9 characters from str1:\n" ;
str1.erase ( 6, 9 ) ;
cout << str1 << "\n\n" ;
return 0 ;
}
 Hàm replace():
Cú pháp: replace(pos,nptr)
Chức năng: xóa n kí tự khỏi đối tượng của nó, bắt đầu tại
vị trí pos và thay thế chúng bằng chuỗi char*ptr.
 Hàm find():
Cú pháp: find (ptr,pos)

Nhóm 11 – Đề tài số 6 Trang 16
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
Ý nghĩa: tìm kiếm một mẫu, tạo ra từ chuỗi char*ptr, trong
đối tượng của nó, bắt đầu từ vị trí pos và trả về vị trí của
kí tự đầu tiên tìm được.
Chức năng: 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 phương thức này như là:

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, pos = 0):tìm s (mảng kí tự kết thúc „/0‟)
kể từ vị trí pos đến cuối chuỗi.
str.find (string& s, pos = 0): tìm chuỗi s kể từ vị trí pos
đến cuối chuỗi.
Lưu ý: Nếu không quy định giá trị pos thì hiểu mặc nhiên là
0, nếu tìm thấy 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ụ:
#include <iostream>
#include <string>
using namespace std;
int main ()
{
int i;
string s1 = "this is a test." ;
string s2;
i = s1.find ( "is" ) ;
if ( i!=string::npos ) {
cout << "Match found at " << i << endl;
cout << "Remaining string is:\n" ;
s2.assign ( s1, i, s1.size ()) ;
cout << s2;
}
cout << "\n\n" ;
return 0 ;
}

Nhóm 11 – Đề tài số 6 Trang 17

BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
 Hàm find_first_of():
Cú pháp: find_first_of (ptr,pos)
Chức năng: rất hữu ích khi muốn tìm kiếm một kí tự trong
một đối tượng string nhưng không chắc chắn muốn tìm kí tự nào,
nghĩa là tìm kiếm bất kì kí tự nào trong một số các kí tự.
 Hàm substr():
Cú pháp: substr (pos, n)
Chức năng: trích ra một 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 (chú ý kí tự đầu tiên của
chuỗi ở vị trí 0).
Ví dụ:
#include<iostream>
#include<string>
using namespace std;
void main()
{
string s1("Don told Estelle he would get ring"); //chuoi C
cout<<"s1="<<s1<<endl;
s1.insert(26,"not"); //chèn not truoc get
cout<<"s1="<<s1<<endl;
s1.remove(26,4); //xóa not
cout<<"s1="<<s1<<endl;
s1.replace(9,7,"Pam",0,3); //thay the "Estelle" bang "Pam"
cout<<"s1="<<s1<<endl;
int loc1=s1.find("Pam"); //tim Pam
cout<<"Pam o vi tri:"<<loc1<<endl; //tim ki tu trang dau tien sau
loc1

int loc2=s1.find_fist_of("\t\n",loc1); //tao chuoi"Pam"
string s2=s1.substr(loc1,loc2-loc1);
cout<<"hi,"<<s2<<endl;
}
 Hàm compare():

Nhóm 11 – Đề tài số 6 Trang 18
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
Cú pháp: compare (str,pos,n)
Chức năng: 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.
 Nếu giá trị trả về <0:chuỗi hiện tại đứng sau đối số str
theo thứ tự alphabe.
 Nếu giá trị trả về = 0: chuỗi hiện tại bằng str
 Nếu giá trị trả về > 0: chuỗi hiện tại đứng trước str theo
thứ tự alphabe.
 Hàm c_str():
Cú pháp: const char*c_str( ) const;
Chức năng: 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ảng char
chứa các kí tự từ đối tượng string, cộng với các 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 đó.
 Hàm strcat():
Cú pháp: strcat (chuỗi 1,chuỗi 2)
Chức năng: hàm này sẽ copy xâu chuỗi 2 vào đuôi xâu chuỗi
1.

Lưu ý: không được viết str1 =str1 + str2
 Hàm strlen():
Cú pháp: int strlen(const char*s)
Chức năng: là hàm xác định độ dài một chuỗi nhập từ bàn
phím.
Ví dụ:

Nhóm 11 – Đề tài số 6 Trang 19
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
#include<iostream>
#include<string>
#define do_dai_xau 40
using namespace std;
void main()
{
char str1[do_dai_xau]="to be or not to be.";
char str2[do_dai_xau]="ngon ngu C++.";
if(do_dai_xau>strlen(str1)+strlen(str2))
cout<<endl<<strcat(str1,str2)<<endl;
else
cout<<"\n khong du bo nho.";
}
 Hàm strcpy():
Cú pháp: strcpy(string1,string2);
Chức năng: hàm này sẽ copy xâu string2 lên xâu string1,
string2 có thể là một mảng, con trỏ hay một hằng xâu kí tự.
 Hàm strchr():
Cú pháp: char*strchr(const char*str,int c);
Chức năng: để trích một chuỗi con của một chuỗi kí tự bắt

đầu từ một kí tự được chỉ định trong chuỗi cho đến hết chuỗi.
Ghi chú:
Nếu kí tự chỉ định không có trong chuỗi thì kết quả trả về
là NULL.
Nếu kết quả trả về của hàm là một con trỏ, con trỏ này
trong chuỗi str và chỉ đến kí tự c đầu tiên được tìm thấy.
 Hàm strstr():
Cú pháp: strstr(string1, string2)
Chức năng: tìm kiếm xâu kí tự string2 trong string1. Kết
quả trả lại sẽ là một con trỏ, trỏ tới vị trí của xâu kí tự
str2 trong str1.

Nhóm 11 – Đề tài số 6 Trang 20
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
VD: pFound=strstr(str1,str2);
Kết quả trả lại cũng là kiểu con trỏ. Nếu không tìm thấy,
nó sẽ có giá trị là NULL, NULL là hằng con trỏ đã được định
nghĩa trước, tương đương với giá trị là 0 cho con trỏ.
Ví dụ:
#include<iostream>
#include<string>
using namespace std;
void main()
{
char str1[]="day la mot xau ki tu.";
char str2[]="ki tu.";
char str3[]="Ki tu.";
if (strstr(str1,str2)==NULL)
cout<<"\n khong tim thay.";

else
cout<<"\n xau ki tu:"<<str2<<"\n da tim thay trong xau:"<<str1;
if (strstr(str1,str3)==NULL)
cout<<"\n khong tim thay.";
else
cout<<"\n xau ki tu:"<<str2<<"\n da tim thay trong xau:"<<str1;
}
 Hàm strcmp():
Cú pháp: strcmp(str1,str2)
Chức năng: so sánh hai xâu kí tự, các kí tự của hai xâu
được so sánh từng cặp một từ trái qua phải theo giá trị của
bảng mã ASCII.
Lưu ý:
Nếu hai xâu có độ dài khác nhau song số kí tự giống nhau
đến độ dài xâu ngắn nhất thì xâu có độ dài ngắn hơn được coi
là bé hơn.
“FILENAME” < “FILENAME A” ; cho giá trị TRUE
“FINENAME” < “FILENAME” ; cho giá trị là FALSE

Nhóm 11 – Đề tài số 6 Trang 21
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
Hai xâu kí tự bằng nhau nếu như cả về nội dung lẫn độ dài
của chúng là giống nhau.
“FILENAME” = = “FILENAME”; cho giá trị TRUE
Hai chuỗi str1 và str2 được so sánh với nhau, kết quả trả
về là một số nguyên:
o Nếu kết quả là số âm thì chuỗi str1 < str2.
o Nếu kết quả là 0 thì hai chuỗi str1 và str2 bằng nhau.
o Nếu kết quả là số dương thì chuỗi str1 > str2.

 Hàm length():
Cú pháp: #include<iostream>
size_type length() const;
Chức năng: trả về chiều dài của chuỗi
Ví dụ:
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string stringA = "C++";
string stringB = "Is Cool";
cout << "Length of stringA = " << stringA.length () << endl;
cout << "Length of stringB = " << stringB.length () << endl;
return 0 ;
}
C. Các phương thức, phép toán tiện ích của
string.
Kiểu string của thư viện STL hỗ trợ các phương thức và phép
toán tiện ích sau đây:
a. Các phép toán và phương thức cơ bản.
Các toán tử +, += được sử dụng để ghép hai chuỗi cũng như
gán một kí tự vào chuỗi.

Nhóm 11 – Đề tài số 6 Trang 22
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
Các phép so sánh theo thứ tự từ điển: ==(bằng nhau),
!=(khác nhau), >(lớn hơn), >=(lớn hơn hay bằng), <(nhỏ hơn),
<=(nhỏ hơn hay bằng);

Phương thức 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( );
Phép gán (=) dùng để gán biến kiểu string bằng một chuỗi,
hoặc bằng string khác, chẳng hạn: string s=”ABCDEF”; hay
s1=s2; mà không cần copy xâu. Những constructor thường sử dụng
nhất:
string();
string(const char *str);
string(const string & str);
Có thể dùng toán tử << với cout để xuất một chuỗi ra màn
hình hoặc dùng toán tử >> với cin để nhập một chuỗi ký tự đến
khi gặp một khoảng trống thì dừng.
char st[]=“ABCDEF”;
string s;
s=“XYZ”;
cout << s << endl;
s=st;
cout << s.length() << “ : ” << s << endl;
Một vấn đề thường nảy sinh trong các ứng dụng có sử dụng C-
string: một C-String chưa khởi tạo cần được gán NULL. Tuy
nhiên, rất nhiều hàm thư viện của C-String sẽ gặp sự cố trong
thời gian chạy khi gặp đối tượng C-String là NULL. Chẳng hạn,
lệnh sau được một số trình biên dịch chấp nhận, nhưng với
nhiều hiện thực khác của thư viện C-string, thì gặp lỗi trong
thời gian chạy:
char* x = NULL;
cout << strlen(x);
String không gặp vấn đề này, ta hoàn toàn có thể cho một
xâu là rỗng mà không gặp bất cứ lỗi nào:


Nhóm 11 – Đề tài số 6 Trang 23
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
string s="";
String thực chất là một vector<char> có bổ sung thêm
một số phương thức và thuộc tính, do đó, nó có toàn bộ các
tính chất của 1 vector, vd hàm size(), push_back(), toán tử
Phưong thức
Mô tả
v.size()
Số lượng phần tử
v.empty()
Trả về 1 nếu chuỗi rỗng, 0 nếu ngược lại
v.max_size()
Trả về số lượng phần tử tối đa đã được cấp phát
v1==v2
Trả về 1 nếu 2 chuỗi bằng nhau
v1!=v2
Trả về 1 nếu 2 chuỗi khác nhau
v.begin()
Trả về iterator đầu tiên của chuỗi
v.end()
Trả về iterator lặp cuối cùng của chuỗi
v.front()
Trả về tham chiếu đến phần tử đầu tiên của
chuỗi
v.back()
Trả về tham chiếu đến phần tử cuối cùng của
chuỗi

v1.swap(v2)
Hoán đổi 2 chuỗi với nhau (giống việc hoán đổi
giá trị của 2 biến)
Ví dụ:
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
int main()
{
string s = "Hello string"; // Khai báo biến kiểu string
cout << "Noi dung string: " << s << endl; // In nôi dung string ra màn hinh
cout << "Chieu dai cua string: " << s.size() << endl;
// Chiều dài
cout << "Ky tu 0: " << s[0] << endl; // In ký tự đầu tiên của xâu
cout << "Ky tu 1: " << s[1] << endl; // In ký tự thứ 2
cout << "Ky tu 2: " << s[2] << endl; // In ký tự thứ 3
getchar();
return 0;
}
Nhập một string: istream& getline(istream& in, string& str,
char delimiter = „\n‟);

Nhóm 11 – Đề tài số 6 Trang 24
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
Đọc 1 dòng văn bản từ đối tượng nhập (istream) in (có thể
là file hay đối tượng chuẩn cin) từng ký tự đến khi ký tự
delimiter được nhập vào (mặc định là \n) (thường được dùng
thay cho cin >> khi nhập chuỗi có ký tự space). Có thể dùng

kết hợp với toán tử >>.
Ví dụ:
// getline with strings
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
short age;
cout << "Please enter full name and age"<< endl;
getline( cin, str) >> age;
cout << "Thank you " << str << "!\n";
return 0;
}
b. Các phương thức chèn, xóa, lấy chuỗi con:
Phương thức 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).
//get substring
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
int main()
{
string s="ConCho chay qua rao";
cout << s.substr(2,4) << endl;
// cout << new string(str.begin()+2, str.begin()+2+4);

getchar();
return 0;
}

Nhóm 11 – Đề tài số 6 Trang 25
BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
2009
Phương thức 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:
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;
str.insert(int pos, int n, int ch);//chèn n lần ký tự ch
vào vị trí pos của chuỗi str;
Ví dụ:
// inserting into a string
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
int main()
{
string str="day la xau thu";
string istr = "them";
str.insert(8, istr);
cout << str << endl;
getchar();
return 0;

}
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ụ:
// erase from a string
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
int main(
{
string str="day cung la xau thu";
str.erase(0, 3); // " cung la xau thu"

×