BÁO CÁO BÀI TẬP LỚN
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG VỚI C++
Đề tài 6: 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.
GV: Ngô Công Thắng
Nhóm SV thực hiện (nhóm VIII):
Vũ Thị Thùy Linh
Trịnh Thúy Ngân
Nguyễn Hoài Thu
Nguyễn Thị Tuyến
MỤC LỤC
A.LÝ THUYẾT
I. Tìm hiểu về mẫu hàm(function template), mẫu lớp(class template)
1. Khuôn mẫu
2. Mẫu hàm (function template)
2.1 Ý nghĩa.
2.2.Khả năng áp dụng khuôn mẫu hàm.
2.3 Nạp chồng khuôn mẫu hàm.
2.4 Tham số khuôn mẫu hàm.
3. Mẫu lớp(class template)
3.1 Ý nghĩa.
3.2 Cú pháp cài đặt .
3.3 Sử dụng mẫu lớp.
3.4 Tham số của mẫu lớp.
II.SƠ LƯỢC VỀ THƯ VIỆN STL ( STANDARD TEMPLATE
LIBRARY)
1. Một Containers.
2. Các giải thuật(algorithms) .
3. Các iterators .
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 chuẩn
1.1 Khái niệm .
1.2 Khai báo biến.
1.3 Khởi tạo biến xâu.
1.4 Vào ra .
2. Các hàm thành viên của lớp string chuẩn
2.1. Hàm Copy( ).
2.2. Hàm insert ( ).
2.3. Hàm erase( ).
2.4. Hàm replace( ).
2.5. Hàm find( ).
2.6. Hàm find_first_of ( ).
2.7. Hàm substr ( ).
2.8. Hàm compare ( ).
2.9. Hàm c_str ().
2.10. Hàm strcat ().
2.11. Hàm strlen().
2.12. Hàm strcpy ().
2.13. Hàm strchr ().
2.14. Hàm strstr().
2.15. Hàm strcmp().
2.16. Hàm length().
B. CHƯƠNG TRÌNH
TÀI LIỆU THAM KHẢO
LỜI MỞ ĐẦU
Ngôn ngữ C được coi là ngôn ngữ vạn năng và được sử dụng rộng rãi để
giải quyết các bài toán khoa học kỹ thuật. Ngôn ngữ C cũng là một công cụ
mạnh cho phép xây dựng các chương trình hệ thống như hệ điều hành
UNIX, các công cụ tiện ích khác.
Trên cơ sở ngôn ngữ C người ta tiến hành xây dựng một phiên bản hướng
đối tượng gọi là C++ nhằm thừa kế các điểm mạnh vốn có của C kết hợp với
sự những ưu điểm của lập trình hướng đối tượng. Bởi vậy C++ đang ngày
càng phổ biến. Việc học và nghiên cứu về C++ là cần thiết đối với các sinh
viên tin học phần mềm.
Không nằm ngoài xu thế đó, các sinh viên tin học trường ĐH Nông
Nghiệp Hà Nội cũng được tiếp xúc với môn học này. Tuy nhiên do lượng
thời gian hạn hẹp nên không thể tìm hiểu sâu về các vấn đề trên lớp học.
Dưới đây nhóm chúng em xin trình bày nội dung đề 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”.
Trong đó:
Tìm hiểu về khuôn mẫu hàm(Thu).
Tìm hiểu về khuôn mẫu lớp(Linh).
Tìm hiểu thư viện STL(Ngân).
Tìm hiểu về lớp string chuẩn và các hàm thành viên(Tuyến).
Tìm hiểu chương trình (Cả nhóm)
Do những hiểu biết còn hạn chế, nhóm chúng em không tránh khỏi
những sai sót, rất mong thày giáo và các bạn góp ý.
Nhóm chúng em xin chân thành cảm ơn.
NỘI DUNG
A.LÝ THUYẾT
I.Tìm hiểu về mẫu hàm(function template), mẫu lớp(class template)
1. Khuôn mẫu
- Định nghĩa: Khuôn mẫu (Template) 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ừ khóa 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 tùy ý được cung cấp.
Template<typename T>
- Chú ý: Một lệnh template chỉ có hiệu quả đối với khai báo ngay sau
nó.
- Hai loại khuôn mẫu cơ bản:
+Mẫu hàm(function template): cho phép sử dụng cùng một tên duy
nhất để thực hiện các công việc khác nhau.
+Mẫu lớp(class template): Cho phép ta chỉ cần 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.
2. Mẫu hàm (function template)
2.1 Ý nghĩa
-Mẫu hàm là dạng khuôn mẫu đơn giản nhất cho phép ta định nghĩa các
hàm dùng đến các kiểu dữ liệu tùy ý.
-Như ta đã biết, định nghĩa chồng hàm cho phép sử dụng một tên duy
nhất cho nhiều hàm thực hiện các công việc khác nhau. Khái niệm mãu
hàm cũng cho phép sử dụng cùng một tên duy nhất để thực hiện các công
việc khác nhau, tuy nhiên so với định nghĩa chồng hàm, nó có phần mạnh
hơn và chặt chẽ hơn; mạnh hơn vì chỉ cần viết định nghĩa mẫu hàm một
lần, rồi sau đó chương trình biên dịch làm cho nó thích ứng với ca kiểu
dữ liệu khác nhau; chặt chẽ hơn vì dựa theo khuôn hình hàm, tất cả các
hàm thể hiện được sinh ra bởi trình biên dịch sẽ tương ứng với cùng một
định nghĩa và như vậy sẽ có cùng một giải thuật
- Giả thiết rằng chúng ta cần viết một hàm max đưa ra giá trị lớn nhất
trong hai gái trị có cùng kiểu. Ta có thể viết một định nghĩa như thế đối
với kiểu int như sau:
Int max(int a,int b)
{
If (a>b) return a;
Else return b;
}
Giả sử phải viết lại định nghĩa hàm max() cho kiểu double, float, char,
char*…
float max(float a,float b)
{
If (a>b) return a;
Else return b;
}
Nếu tiếp tục như vậy, sẽ có khuynh hướng phải viết rất nhiều định
nghĩa hàm tương tự nhau; chỉ có kiểu dữ liệu các tham số là thay đổi.
Giải pháp là tạo một mãu hàm duy nhât:
#include<iostream.h>
Template<class T> T max(T a,T b)
{
If (a>b) return a ;
Else return b ;
}
So sánh với hàm thông thường ta chỉ thấy có dòng đầu tiên bị thay đổi :
Template<class T> T max (T a, T b)
Trong đó :
Template<class T> xác định rằng đó là một khuôn hình với một tham
số kiểu T ;
Phần còn lại : T max (T a, T b) -> max() slà một hàm với hai tham số hình
thức kiểu T và có giá trị trẻ và cũng là kiểu T.
=> Ưu điểm của mẫu hà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òa được tính chặt chẽ và kiểm tra kiểu mạnh trông 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 có thể sử dụng nhiều lần.
-Đảm bảo hiệu suất tương đương như viết tách thành 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…)
2.2.Khả năng áp dụng khuôn mẫu hàm
Khả năng áp dụng một khuôn mẫu hàm là vô tận,nhưng không phải áp
dụng được cho tất cả các đối số khuôn mẫu
Ví Dụ : Điều kiện ràng buộc đối với kiểu dữ liệu có thể áp dụng trong
khuôn mấu hàm max là phải có phép so sánh lớn hơn(>) :
template <class T>
inline T max(T a,T b) { return (a.b) ? a :b ;}
->Đối với các kiểu dữ liệu mới,muốn áp dụng được thì cần phải nạp chồng
toán tử so sánh >
Tuy nhiên,khả năng áp dụng được chưa chắc đã có ý nghĩa
Ví Dụ : Xác định chuỗi ký tự đứng sau trong hai chuỗi cho trước theo vần
ABC
char city1[ ] = « Ha Nôi«, city2[ ] = » Hai Phong»;
char* city = max(city1,city2); //???
//max<char*>(char*,char*)
2.3 Nạp chồng khuôn mẫu hàm
Một mẫu hàm có thể được nạp chồng bằng hàm cùng tên…
char* max(char* a,char* b) {if (strcmp(a,b)) }
void f() {
char c = max(‘H’,’K’); max<char>(char,char)
char city1[ ] = « Ha Noi« , city2[ ] = « Hai Phong« ;
char* city = max(city1,city2) ; //max(char*,char*)
…}
…hoặc bằng một mẫu hàm cùng tên (khác số lượng các tham số hoặc kiểu
của ít nhất một tham số). ví dụ:
template <class T> T max(T a,T b,T c) { }
template <class T> T max(T* a,int n) { }
nhưng không được thế này :
template <class X> X max(X a,X b) {…}
2.5 Tham số khuôn mẫu hàm
Tham số khuôn mẫu hàm có thể là một kiêu cơ bản hoặc một kiểu dấn
xuất,nhưng không thể là một biến hoặc một hằng số:
template <class T> max(T a,T b) { } // OK
template <int N> max(int* a) { } // error
Một khuôn mẫu hàm có thể có hơn một tham số kiểu :
Template <class A, class B> void swap(A& a, B& b) {
A t = a;
a = b;
b = t;
}
Void f() {
double a = 2.0 ;
int b = 3 ;
swap(a,b) ;
swap(b,a) ;
}
Thông thường tham số khuôn mẫu xuất hiện ít nhất một lần là kiểu hoặc
kiểu dẫn xuất trực tiếp của các tham biến:
template <class X> void f1(X a, int b) {…}
template <class X> void f2(X* b) {…}
template <class X,class Y> void f3(Y& a, X b) {…}
3. Mẫu lớp(class template)
3.1 Ý nghĩa
-Bình thường để tạo một lớp point ta định nghĩa:
Class point
{
Int x, y;
public:
point (int a=0, int b=0 );
Void display();
//…………
};
Ở đây ta định nghĩa lớp các điểm có tọa độ nguyên. Nếu muốn tọa độ
điểm có kiểu khác (float, double, long ) ta phải định nghĩa một lớp khác
bằng cách thay thế, trong định nghĩa lớp point từ khóa int bằng từ khóa
tương ứng vớ kiểu dữ liệu mong muốn.
Để tránh sự trùng lặp như trên trong một chương trình, chương trình dịch
C++ cho phép định nghĩa một khuôn hình lớp và sau đó áp dụng khuôn hình
lớp này với các kiểu dữ liệu khác nhau để thu được các lớp thể hiện như
mong muốn.
=> Ưu điểm của mẫu lớp:
-Cho phép xây dựng các lớp tổng quát. Trình biên dịch có thể sinh ra
nhiều lớp khác nhau dựa trên cùng một khuôn mẫu. Chúng ta không cần viết
lại một lớp nào đó.
VD: Nếu chúng ta có một template cho lớp List, trình biên dịch có thể
giúp chúng ta tạo ra hai lớp List<int> và List<person> một cách nhanh
chóng.
3.2 Cú pháp cài đặt
a. Khai báo
-Khai báo một mẫu lớp cũng tương tự với mẫu hàm
template <class T1, class T2, …, class Tn>
b. Cách xây dựng khuôn hình
-Người ta phân biệt hai trường hợp
+ Khi hàm thành phần được định nghĩa bên trong định nghĩa lớp:
template <class T> class point
{
T x; T y;
public:
point (T a=0 ; T b=0)
{
x=a ; y=b ;
}
…
}
+ Khi hàm thành phần được định nghĩa bên ngoài định nghĩa lớp, lúc đó
cần phải nhắc đi nhác lại : template <class T> trước khi định nghĩa hàm, còn
tên của mẫu hàm được viết như là point<T>
VD: dòng tiêu đề đầy đủ cho hàm thành phần display() của khuôn hình
hàm point như sau:
template <class T> void point<T>::display
3.3 Sử dụng mẫu lớp
-Khi một mẫu lớp đã được định nghĩa, ta có thể khai báo:
Name_templateclass <kieu du lieu> tendoituong ;
VD : point <int> a ;
->khai báo đối tượng a có hai thành phần tọa độ kiểu nguyên. Lúc này
point<int > có vai trò như một kiểu dữ liệu của lớp.
-Trong trường hợp cần phải truyền các tham số cho các hàm thiết lập, ta làm
bình thường :
point <int> a(3,5)
=>Tổng kết : Mẫu lớp chưa phải là một lớp. Chỉ khi chung ta cung cấp tham
số kiểu cho lớp template chúng ta mới có một thể hiện của lớp template đó ;
khi đó chúng ta mới có một lớp được đối xử như một lớp thông thường.
3.4 Tham số của mẫu lớp (class template)
- Một mẫu lớp có thể có số lượng tham số tùy ý.
-Các tham số đó được chia thành hai nhóm:
+Tham số về kiểu: được mở đầu bằng từ khóa class, nó có thể nhận một kiểu
bất kỳ
+Tham số giá trị trông giống như tham số của hàm nhưng bị hạn chế là
không thể nhận kiểu dữ liệu dấu phảy động (float, double… ).
Tham số giá trị cũng có thể nhận giá trị ngầm định.
II.SƠ LƯỢC VỀ THƯ VIỆN STL ( STANDARD TEMPLATE
LIBRARY)
-STL là một thư viện template cho C++ được phát triển vào năm 1992 với
mong muốn có được nhũng cấu trúc dữ liệu, cũng như giải thuật tổng quát
nhất nhưng không làm mất đi tính hiệu quả. Thư viện này được đưa vào
danh sách các thư viện chuẩn của C++ theo tiêu chuẩn ANSI/ISO với tên
gọi Standard Template Library (STL).
-STL đã được nhiều hang tổ chức, hang phần mềm mở rộng và phát triển;
trong đó đáng kể nhất phải kể đến phiên bản SGI-STL của Silicon Graphics
và STL Port ( hiện đã được tích hợp trong Borland C++ Builder 6).
-Đặ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.
-STL chứa vài loại thực thể, trong đó có ba loại quan trọng nhất là:
+ Containers
+ Algorithms
+ Iterators
1. Một Containers là: một cách lưu trữ dữ liệu được tổ chức trong bộ nhớ.
Ví dụ như ngăn xếp (Stack) và danh sách liên kết (Linked list). Một loại
côngtenơ khác, mảng, cũng rất thông dụng và được đưa vào C++ (cũng như
hầu hết các ngôn ngữ lập trình khác).Các Containers STL chia làm 2 loại:
+Containers tuần tự, Containers liên kết. STL còn có nhiều loại
Containers khác nữa mà rất hữu ích. Các Containers STL được cài đặt bằng
các lớp mẫu để chúng có thể lưu trữ với nhiều loại dữ liệu khác nhau.
1.1 Côngtenơ (Containers) tuần tự:
-Một côngtenơ tuần tự (sequencial container) 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 phần tử khác bằng vị trí của nó theo đưòng
thẳng. Mỗi phần tử xác định đứng trước và đứng sau nó. một mảng C++ là
một ví dụ về một côngtenơ tuần tự.
1.2Côngtenơ (Containers) liên kết:
-Một côngtenơ liên kết là một côngtenơ không tuần tự, thay vào đó sử dụng
các khoá để truy nhập dữ liệu. Các khoá, điển hình là các số hoặc các chuỗi,
được sử dụng tự động bởi côngtenơ để 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 quyển từ điển tiếng Anh mà ở đó
chúng ta có thể truy nhập dữ liệu bằng chách tra các từ đã được sắp xếp theo
thứ tự alphabe.
-Có hai loại côngtenơ liên kết trong STL:
+Ánh xạ (map)
+Tập hợp (set)
Một ánh xạ liên kết một khoá ( từ mà chúng ta muốn tra) với một giá trị
(ví dụ như định nghĩa của từ).Giá trị có thể là bất kỳ loại đối tượng nào.
Một tập hợp (set) tương tự như một ánh xạ (map) nhưng nó chỉ lưu trữ
các khoá, không có các giá trị liên kết. Nó giống như một danh sách các từ
không được định nghĩa.
*Chú ý: Không cần xác định kích thước cho côngtennơ. Các côngtenơ tự
chúng quan tâm tới tất cảc việc cấp phát bộ nhớ.
2. Các giải thuật(algorithms) là: các thủ tục gắn với các containers để xử lý
dữ liệu của chúng theo nhiều cách khác nhau. Ví dụ, có các giải thuật sắp
xếp, sao chép, tìm kiếm và trộn dữ liệu. Trong STL, các giải thuật được biểu
diễn bằng các hàm mẫu (template function).
- Các hàm này không phải là các hàm thành viên của các lớp
containers(containers classes).Chúng là các hàm đứng một mình .Trên thực
tế, một đặc điểm nổi bật của STL là các giải thuật của nó rất chung. Chúng
không chỉ được nối với các containers mà còn có thể sử dụng với các mảng
C++ thông thường và các containers do người sử dụng tạo ra.
3. Các iterators là một dạng khái quát hóa của khái niệm con trỏ. Chúng
trỏ tới các phần tử trong một containers. Chúng ta có thể tăng một iterators
như tăng một con trỏ để nó trỏ lần lượt tới từng phần tử trong một
containers.
- Các iterators là phần chủ yếu của STL bởi vì chúng nối các giải thuật với
các containers. Có thể coi chúng như một phiên bản phần mền của các dây
cáp, giống như dây cáp nối máy tính với các thiết bị ngoại vi. Các iterator
cũng nối các thành phần khác với nhau.
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 chuẩn
1.1 Khái niệm
-Là một dãy ký tự có kí tự cuối cùng là kí tự rỗng. Ký tự rỗng có trị số là 0
và viết là ‘\0’
-Được C++ lưu trữ như một mảng kí tự, nó cho phép truy nhập vào từng ký
tự của xâu như truy nhập vào từng phần tử mảng. Tuy nhiên trong một số
trường hợp C++ xem xâu ký tự như những kiểu dữ liệu cơ bản. Ví dụ, có thể
nhập vào và đưa ra biến xâu bằng lệnh cout và cin.
1.2 Khai báo biến
- Cú pháp khai báo biến:
Char ten_bien_xau[max+1] ;
Trong đó max cho dưới dạng hằng hoặc biểu thức hằng.
Biến xâu có thể chứa các xâu ký tự có độ dài khác nhau.
1.3 Khởi tạo biến xâu
-Khởi tạo như biến mảng :
char str[6]={‘d’,’h’,’n’,’n’,’1’,’\0’} ;
-Khởi tạo bằng hằng xâu :
char str[6] = « dhnn1« ;
+Hằng xâu là một dãy ký tự đặt giữa hai dấu ngoặc kép. Khi viết hằng xâu ta
không viết ký tự này sẽ được trình biên dịch thêm vào. Hằng xâu rỗng là
hằng xâu không có ký tự nào « « ;
Khi khởi tạo cho biến xâu bằng hằng xâu thì số ký tự cực đại của biến xâu
phải lớn hơn số ký tự của hằng xâu ít nhất là 1, vì trình biên dịch sẽ đưa
thêm vào biến xâu một kí tự rỗng
Khi khởi tạo biến xâu ta cũng có thể không cần xác định số ký tự cực đại,
khi đó trình biên dịch sẽ xác địn số ký tự cực đại bằng số ký tự của hằng xâu
+1
1.4 Vào ra
- Có thể dùng lệnh cout và cin.
VD : char str[11] ;
cin>>str ; cout <<str ;
* Khi dùng cin để nhập vào xâu kí tự thì không nhập được các xâu có
khoảng cách vì khi gặp khoảng trắng cin sẽ kết thúc. Để khắc phục nhược
điểm ta dùng hàm thành viên của cin là get để lấy vào các xâu có cả khoảng
cách :
Cin.get(bienxau,kich thuoc) ;
VD: cin.get(char,sizeof(str));
Các lệnh cin sau khi kết thúc vẫn để kí tự ‘\n’ tring bộ đệm bàn phím. Trong
khi đó ký tự ‘\n’ làm hàm thành viên cin.get() kết thúc, bởi vậy trước hàm
thành viên cin.get() sẽ không lấy được kí tự nào. Để khắc phục nhược điểm
này, ta dùng hàm thành viên cin.ignore() để hủy các ký tự ‘\n’ trước khi
dùng cin.get()
VD:
cin>>a; cin.igore;
cin.get(str,11);
2. Các hàm thành viên của lớp string chuẩn
-C++ có một thư việc hàm làm việc với xâu ký tự là string.lib. Muốn sử
dụng các hàm này ta phải khai báo sử dụng:
#include<string.h>
2.1. Hàm Copy( )
- Cú pháp : copy (ptr ,n,pos)
Tức là 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*.
2.2. Hàm insert ( )
-Cú pháp: insert (pos,ptr)
Tức là: 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;
2.3. 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.
2.4. 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.
2.5. Hàm find( )
-Cú pháp: find (ptr,pos)
Tức là : 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 qui đị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.
2.6. 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ự.
2.7. 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).
2.8. Hàm compare ( )
-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
2.9. 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 đó.
2.10. 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
2.11. 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
2.12. 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ự.
2.13. 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.
2.14. 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.
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ỏ.
2.15. 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
+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.
Nếu kết quả là số âm thì chuỗi str1 < str2
Nếu kết quả là 0 thì hai chuỗi str1 và str2 bằng nhau
Nếu kết quả là số dương thì chuỗi str1 > str2
2.16. 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
B. CHƯƠNG TRÌNH
#include <iostream.h>
#include <string>
#include <conio.h>
//tao lop doi tuong ngan xep chua kieu du lieu khac nhau
template< class T, int m >
//khai bao lop stack
class Stack
{
private:
T a[m];
int t;
public:
Stack();
~Stack();
void push(T);
T pop();
T top();
int empty();
int full();
};
// ============CHUONG TRINH CHINH================
int main()
{
string str;
cout<<"====CHUONG TRINH CAI DAT LOP DOI TUONG NGAN
XEP====\n";
cout<<endl;
cout<<"Giang vien huong dan : Ngo Cong Thang\n";
cout<<endl;
cout<<"Nhom SV thuc hien : Nhom VII-THC52\n";
cout<<" Vu Thi Thuy Linh\n";
cout<<" Trinh Thuy Ngan\n";
cout<<" Nguyen Thi Hoai Thu\n";
cout<<" Nguyen Thi Tuyen\n";
cout<<endl;
int clrscr();
cout<<"Ban hay nhap vao mot cau van: \n";
getline(cin,str);
string str1 = str;
str1 += ' ';
string str2 = "";
Stack<string, 100> s;
// tach cac tu va dua vao stack
for(int i = 0; i< str1.length(); i++)
{
str2 += str1[i];
if(str1[i] == ' ')
{
s.push(str2);
str2 = "";
}
}
// lay cac tu trong stack va viet ra man hinh
cout<<endl;
cout<<"============================================\n";
cout<<endl;
cout<<"Cau van sau khi tach cac tu tu trai qua phai, day vao ngan xep\n";
cout<<"Va lay cac tu tu ngan xep dua ra man hinh la: \n";
cout<<endl;
while(!s.empty())
cout<<s.pop();
cout << endl;
return 0;
}
//dinh nghia cac ham thanh vien cua lop stack
//========ham tao khong doi so
template< class T, int m >
Stack< T, m >::Stack()
{
t=-1;
}
//=========Ham huy
template< class T, int m >
Stack< T, m >::~Stack()
{
delete[] a;
}
//Ham push (dua mot phan tu vao ngan xep)
template< class T, int m >
void Stack< T, m >::push(T b)
{
a[ ++t ] = b;
}
//Ham pop (lay mot phan tu ra khoi ngan xep)
template< class T, int m>
T Stack< T, m >::pop()
{
return a[ t ];
}
//Ham top (lay gia tri phan tu dinh ngan xep)
template< class T, int m >
T Stack< T, m >::top()
{
return a[t];
}
//ham full (kiem tra ngan xep da day chua)
template< class T, int m >
int Stack< T, m >::full()
{
return t + 1 == m;
}
//ham empty (kiem tra ngan xep co trong khong)
template< class T, int m >
int Stack< T, m >::empty()
{
if ( t== -1 ) return 1;
else
return 0;
}
TÀI LIỆU THAM KHẢO
1. 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.
2. Giáo trình C++ & lập trình hướng đối tượng.
Tác giả: GS Phạm Văn Ất
Lê Trường Thông
NXB Hồng Đức
3. Lập trình hướng đối tượng với C++
Tác giả: Nguyễn Thị Thanh Thủy
NXB khoa học và kỹ thuật
4. Các website:
/> /> /> />Library-(STL)