13
TRƯỜNG ĐẠI HỌC CHU VĂN AN 2009 BÁO CÁO LP TRÌNH HƯỚNG ĐỐI TƯỢNG Nhóm 11 Đề tài 6 Năm học 2009 - 2010

Báo cáo C++

Embed Size (px)

DESCRIPTION

Báo cáo bài tập lớn môn C++

Citation preview

Page 1: Báo cáo C++

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

Page 2: Báo cáo C++

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

1. Định nghĩa template. 2. Function template. 3. Class template. 4. Tổng kết về template.

II. Stander Template Library.

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ố. 7. Thư viện hỗ trợ ngôn ngữ lập trình. 8. Các thành phần chính của STL.

III. Lớp String chuẩn và các hàm thành viên.

Chào các bạn!

Nhóm 11

Chu Đức Công

Lê Văn Hoàn

Nguyễn Văn Vương

Page 3: Báo cáo C++

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

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

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.

Page 4: Báo cáo C++

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

BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 2009

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);

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:

Page 5: Báo cáo C++

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

BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 2009

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

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:

Page 6: Báo cáo C++

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

BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 2009

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.

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:

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

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ự

Page 7: Báo cáo C++

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

BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 2009

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

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

Page 8: Báo cáo C++

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

BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 2009

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.

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

Page 9: Báo cáo C++

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

BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 2009

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

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

Page 10: Báo cáo C++

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

BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 2009

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:

Container: Các cấu trúc dữ liệu template.

Interator: Giống con trỏ, dùng để truy cập các phần tử

dữ liệu của các container.

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:

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

Page 11: Báo cáo C++

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

BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 2009

first-class container.

vector, deque, list.

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

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

III. Lớp string chuẩn và các hàm thành viên.

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

Page 12: Báo cáo C++

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

BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 2009

#include <string.h>

using std::string; // using namespace std;

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.

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

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

Page 13: Báo cáo C++

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

BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 2009

string();

string(const char *str);

string(const string & str);

s1=s2; mà không cần copy xâu. Những constructor thường sử dụng

nhất:

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.