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
Trang 1BÁ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
Trang 2MỤ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 ()
Trang 32.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
Trang 4LỜ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
Trang 5NỘ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;
}
Trang 6Giả 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 ;}
Trang 7->Đố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) ;
Trang 8}
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
Trang 9-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
Trang 10II.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)
Trang 11Mộ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