Clìịii trách ỉỉlìiệm xiiủì bdiì Biên tập Trììììì bày bìa PGS.TS... Khái n iệ m về ẩốì tưỢng được dùng riêng cho một thực th ể riêng biệt hoặc cho một lớp của nhiều thực thể... Cuôn sác
Trang 2T S DƯƠNG TỬ CƯỜNG
NGÔN NGỮ LỘP TRÌNH C++
£)AỈ H Ọ C Q U O C G i A HA ÌMỌl ĨRUNG TÀM THÕNG ĨIN ĨHƯ VIÉN
NHÀ X U Ấ T BẢN KH O A HỌC VÀ K Ỹ THUẬTt •
HÀ NÔI
Trang 3Clìịii trách ỉỉlìiệm xiiủì bdiì
Biên tập
Trììììì bày bìa
PGS.TS Tô Đ á n g Hải ThS Vũ T h ị M in h L u ậ n
H ư ơ n g L a n
NHÀ XUẤT BẢN KHOA HỌC VÀ KỸ THUẬT
70 - Trần Hưng Đạo, Hà Nội
In 1000 bản, khổ 14,5 X 20,5 cm lại Xí nghiệp in NXB Lý hiạn chính Irị
G iấy phép xuất bán số: 150-191, cấp ngày 4/2/2005
In xong và nộp lưu chicu th á n g 10 năin 2003
Trang 4LỜI N Ó I Đ Ầ U
Ti'ong nliững nảni 1980, ngôn ngữ c đã k h ả n g định đưỢc vị trí quan trọng trong các ngôn ngữ lập trìn h có cấu trúc bởi tín h
đa n ă ng của nìình Một chương trìn h đưỢc thiết kô^ tr ê n ngôn ngữ c thường p h á i huy dưỢc nhiều tác d ụ n g khó có thể hội t ụ ở các ngôn ngữ lặỊ) trìn h khác Tuy vậy khi độ phức tạp của các bài toán cần giai quyôt trôn thực tê ngày càng tà n g thì ngôn ngử
c cũng đã bộc lộ n h ữ n g điểm yêUj n h ấ t là khi clược sử d ụ n g cho các dự án lốn Đố khác phục những h ạ n chê còn tồn tại tro n g
ngôn ngữ c nói riêng và của các ngôn ngữ lập tr ìn h có cấu trúc
nói chung, các nhà thiôt k ế p h ầ n mềm đả p h á t triể n một ý tưỏng inoi Các ý tương này, mặc dù được x u ấ t hiện từ n h ữ n g n á m
1970 n h ư n g chỉ dược sử dụng inột cách rộng rãi để xây dựng phán mềm vào n h ữ n g n ă m 1980 Điểm m âu chôt để xây d ự n g lén ý tương này là khả n ă n g th iế t k ế n h ữ n g p h ầ n mềm m a n g nlìừng đặc tính của thô^ giới thực bên ngoài Kỹ t h u ậ t lập t r ì n h dựa trê n ý iưởng mới này có tên “Kỹ t h u ậ t lập tr ìn h hưống đố*i iưỢng” (Object - O riented - P ro g ram in g OOP) và trê n kỹ t h u ậ t
rnới n à y n h iề u trìn h b iê n dịch đã dược t h i ế t kô^ n h ư S m a llta lk ,
C ' \ V.V
Lập trìn h định hưống đôi tượng đưỢc p h á t triể n từ ngôn xigữ lập tr ìn h có cấu trúc n h ư n g th a y vì xoay q u a n h chức n ă n g của nhiộnì vụ đưỢc đ ặ t ra, OOP lại đ ặ t trọng tâ m của m ình vào việc
xử lý các dữ liệu để thực hiện các chức n ă n g đó Trong lập t r ì n h
đ ịn h hưống đôi tưỢng, k h á i niệm về object (đôl tưỢng) trở t h à n h
Trang 5một khái niệm trọng tâ m và h ầ u n h ư mọi công việc tro n g ĩiìột chương trìn h đều đưỢc tiến h à n h tr ê n các đôl tưỢng này
Các t h à n h p h ầ n của một OOP bao gồm: đối tưỢng, thuộc tín h , tác động (phương thức) giao diệu và k h ả n à n g n h ìn Ihấy của các đôi tượng Mọi đốĩ tưỢng được th iế t lập trong O OP đều là các câu trúc độc lập bao gồm dữ liệu và các tác động m à đôi
tư ợ ng có thể thực hiện t r ê n các dữ liệu đó Khái n iệ m về ẩốì
tưỢng được dùng riêng cho một thực th ể riêng biệt hoặc cho một lớp của nhiều thực thể Một đổi tưỢng chỉ có th ể thực hiện các tác động đưỢc định nghĩa bên trong nó qua các th ô n g điệp dược gửi đên chính b ả n t h â n đôi tưỢng n à y và điều cần lưu ý là chỉ có
c h ín h đôl tượng này mới có th ể thực hiện các tác động đó Qua
th ô n g điệp này đôi tượng sẽ n h ậ n dưỢc các nhiệm vụ đòi hỏi nó
p h ả i thực hiện N hư vậy, một đôì tưỢng có th ể xem n h ư là một đại lượng mà ở đó hội tụ n h ữ n g đặc điểm sau: có tên, có tr ạ n g
th á i, có các tác động mà đôi tượng có th ể thực hiện và k h ả nán-g
ẩ n đôi vối các đôi tượng khác
Ngôn ngữ là một trong các ngôn ngữ lập t r ì n h được xây
d ự n g từ các ý tưởng mới này và có th ể xem là một đại diộn điển h ìn h cho phương p há p lập tr ìn h mới: lập t r ì n h hướng đôi tưỢng Vói ngôn ngữ này, ta có th ể là m quen với một sô" kh á i
n iệ m mới trong kỹ t h u ậ t lập tr ìn h liên q u a n dến t h ế giới thực:
t í n h đóng góp (encapsulation), tín h th ừ a k ế (inheritance) và tính tương ứng bội (polymorphism) Các đặc tín h không có trong ngôn
n g ữ lập trìn h tru y ề n thông đã làm cho có th ể p h á t huy h ế t tác d ụ n g của m ình khi th iê t k ế các dự á n lốn n h ư n g củng dem lại nhiều khó k h ă n cho các b ạ n mới b ắ t đầu yới % Đã làm
q u e n với thì có th ể n h ậ n th ấ y r ằ n g một chương t r ì n h được viế t trê n ngôn ngữ này sẽ h ế t sức súc tích, rõ rà n g và đặc biệt là
Trang 6ớ nìộl c h ừ n g mự c nà o đó SG cho p h é p Ị>hát t r i ể n nó t h e o m ộ t s u y
Iighì hcl sức lự nhiên
Sự p h á t t n ổ n của đã trải qua nhiều chặng dưòiìg vối nlìiổu Ị)hiên b a n khác nhau Tài liộu nàv sử dụng phiên b ả n của hàng Borland - Borland c 3.1 để gíới thiệu về ngôn ngữ Đây
là tììn h biên dịch mà theo chúng tôi r ấ t tiện lợi cho việc n g h iê n cứu cùng n hư thiôt kô các p h ầ n mềm Cuôn sách này được biên soạiì dựa trên n h iế u tài liệu khác n h a u và trê n kinh nghiệm của cliíiih tác giả khi làm việc vói Khác vối nội dung của một sô"
tài liộu khác, cuôn sách này được biên soạn đê bạn đọc có thê
làm việc ngav với C++ mà không cần p h ả i biết về ngôn n gữ c
Nội dưng của cuốn sách được chia làm 2 p h ầ n bao gồm 11 chường
P h ầ n I: C++ - Lập trinh cơ bản, bao gồm 6 chương;
Chương I: Các khái niệm cơ bản về C++
Chương II: Các hàm và các dòng n h ậ p xuất
Chương III: Các phép toán và câu lệnh điều khiển
Chương IV: Bộ tien xử lý
Chương V: Biến con trỏ, biến t h a m chiếu và hàm
Chvỉơng VI: Các kiểu dữ liệu phức tạp
Phần II: L ậ p trình hướìig đối tượng, bao gồm 5 chương:
Chương VII: Lớp và đốì tưỢng
Chương IIX: Tính t h ừ a kê
Chương IX: Định nghĩa chồng các h à m và to á n tử
Chương X: Tính tương ứng bội
Chương XI: T h ư viện các dòng n h ậ p x u ấ t
Trang 7Ngôn ngữ lập trìn h c là một ngôn ngữ lập trìn h khó và c^' lại còn phức tạp hơn ngôn ngữ c vì vậy đòi hỏi ở c h ú n g ta một
t i n h th ầ n chịu khó tìm tòi, h a m hiểu biết T u v vậy, m ột khi bạn
đã n ắ m chắc được ngôn ngữ này, c h ú n g tô i,tin tưởng rằ n g , trong
ta y bạn, sẽ trở t h à n h một công cụ h ế t sức đắc lực và vô cùng tiệ n lợi giúp b ạ n giải quyết các bài to á n kỹ t h u ậ t phức tạ p mà trước đó bạn đã phải v ấ t vả khi giải q u y ế t t r ê n ngôn ngữ c và
các ngôn ngữ khác Chúc các bạn th à n h công.
6
Trang 8Phần I
C++
LẬP TRÌNH Cơ BẢN■
Chương I
CÁC KHÁI N I ỆM C ơ B Ả N VỂ C + +
1.1 CÁC KÝ HIỆU
Các ký hiộu cơ b ả n bao gồm n h ữ n g ký tự được phép sử d ụ n g trơng ngôn ngữ n h ư các chữ cái, sô" và tổ hỢp các ký tự khác C++
sử dụng một sô"ký t ự sau:
- 52 chữ cái in thưòng, in hoa và ký tự gạch nốì:
a, b, c, z, A, B, c, z và _
- Các chữ sô";
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
- Các ký tự đặc b iệ t đưỢc d ù n g riê n g trong ngôn ngữ:
7
Trang 9- Một sô" ký tự khác n hư d ấ u cách (ký tự trắng), d ấ u xuông
h à n g và dấu canh theo cột
Các từ khoá trong C++ được d ù n g để v iế t và xây d ự n g các
câu lệnh của chương trình C ũng giôVig n h ư c, các từ khoá n à y
luôn được viết bằ n g chữ thưòng và kh ô n g được d ù n g cho các mục
đích khác n h ư đ ặ t tên cho biến, cho h à m v.v
Có th ể liệt kê một sô" từ khoá được sử d ụ n g tro n g C++:
cortst
1.2 HẰNG
Các thông tin m à giá trị không th ể t h a y đổi tro n g chướng
t r ì n h được gọi là hằng Các h ằ n g trong C++ được chia làm một sô" loại sau:
H ằ n g sô hoc: Các h ằ n g này có giá trị b ằ n g giá trị của các
£Ô" m à nó biểu diễn H ằn g sô" học lại được chia là m hai loại
8
Trang 10• Hằng sò nguyên: Loại h ằ ng sô này có thể được biểu diỗn
dưới d ạ ng cơ sô^ 10, cơ sô" 8 và cơ sô' 16
Các hằng cơ sô' 10 có ihể là số’ dương hoặc âm c ẩ n lưu ý là
k iông dược dùng sô^ 0 n hư là cliữ số^ dầu tiên của h ằ n g số^
n J^uyôn
Ví dụ
+ 14 - H ằ n g sô'n guyên dương có giá trị là 14;
-12 ' H ằ n g sô" nguyên âm có giá trị là âm 12;
012 - Không phải là h ằ n g sô" nguvên
Các hằ n g sô' n g u y ê n cơ sô" 8 là các h ằ n g không có dấu và đưỢc biểu diễn b ằ n g các chữ sô" trong hệ đếm cơ số’ 8 - các sô" từ 0 đến 7 Chữ đ ầ u tiê n trong các h à n g kiểu này ph ả i là chữ số’ 0 Đây chính là n g u y ê n n h â n chữ sô" 0 không được sử dụng n h ư chữ sô^ đầu tiên của h ằ n g cơ sô" 10
Ví dụ:
014 • H ằ n g cơ sô" 8 vổi giá trị là 12 (cơ sô" 10)
0114 - H ằ n g cơ sô" 8 vỏi giá trị 76 (cơ số' 10)
Các h ằ n g sô" n g u y ê n cơ sô" 16 được viết không có dấu và luôn đưỢc b ắ t đầu bơi o x hoặc Ox Trong hệ đếm cơ sô" 16 ngoài các
c h ữ sô" từ 0 đến 9 người ta còn sử dụng các chữ cái từ A đến F để
b iể u thị các sô' từ 10 đến 15
Ví dụ:
o x c hoặc Oxc - H ằ n g cơ sô" 16 có giá trị 12 (cơ sô" 10)
OXFF hoặc Oxff - H ằ n g cơ sô" 16 có giá trị 255 (cơ sô" 10)
• H ằ n g s ố thực: Là một loại h ằ n g chỉ được được viết dưới
9
Trang 11d ạ ng cơ số 10 Một h ằ n g sô^ thực có th ể dược biểu diỄa dưói dạng th ậ p p h â n hay dưới d ạ n g khoa học
Ví dụ:
12.0 - H ằng số* thực dương có giá trị là \2.0
-12.5 - H ằng sô" thực âm có giá trị là -12.15
1.2E1 hoặc 1.2el - H ằn g sô" thực với giá trị 12
n h á y đơn, ví dụ 'A', 'B', T Mỗi kỷ tự có giá trị b ằ n g m ã ASCII của nó Ví dụ mã của ‘A' là 65 và '0' là 48
H ằ n g k i ê u c h u ỗ i là một dãy ký tự đưỢc viết tr o n g d ấ u
n h á y kép, ví dụ: "this is a string" là một h ằ n g kiểu chuỗi Đôl vối
h ằ n g kiểu chuỗi cần lưu ý:
• Độ dài của h ằ n g kiểu chuỗi là không h ạ n c h ế và có th ể không chứa ký tự nào
• T rình biên dịch sẽ tự động đưa thêm một byte có giá trị
b ằ n g 0 (NULL) vào sa u chuỗi tro n g quá t r ì n h biên dịch
Để p h â n biệt vói ký tự '0', byte n à y được viết dưỏi d ạ n g '\0 ' Byte n à y đưỢc xem n h ư dấu hiệu k ế t th ú c c ủa chuỗi,
• Nêu d ù n g m ả n g một chiều để lưu t r ữ h ằ n g kiểu chuỗi thì sô" p h ầ n tử của m ả n g ph ả i lớn hơn sô" ký tự của chuỗi
là một đơn vị (để chứa byte NULL)
Các ký tự dùng riêng (ký tự kh ô n g in ra được) có th ể được
sử d ụ n g n hư nh ữ n g ký tự bình thư ờng n h ư n g khi viết c húng
ph ả i th ê m ký tự \ ở trước C h ẳ n g h ạ n khi chỉ đưòng dẫn n h ư một h ằ n g kiểu chuỗi, th a y cho " C :\b o rla n d c \b g i" ta ph ả i viết
" C : \ \ b o r l a n d c \ \ b g i "
10
Trang 12(V) một sô ký tự thuộc dạng không in ra dược (có giá trị ASCII từ 0 đôn 31) n h ư n g trìỉih biên dịch có th ể n h ậ n biêt được (‘h ú n g Ihôn^^ q u a một cặp ký tự (dưỢc viết b ắ t dầu b ằ ng ký tự \) Các ký tự này thường dược dùng dể điổu khiển m àn hình hoặc máy 111 Báng 1.1 mô tả một sô'ký tự thường hay được sử dụng:
Bảng I ỉ
T á c d ụ n g M ò t ả
t r o n g c
M ả
ASCII
Ký h i ệ u
B>'te tr ắ n g \ 0 0 NULL (null byte)
1 Ù1 \ b 8 BS (Backspace)
Vổ đ ầ u dòng \ r 13 CR (Carier R eturn)
C a n h cột \ t 9 T (Horizontal Tab)
Xuông dòng \ n 10 NL (New line)
S a n g tra n g \ f 12 FF ( Form feed)
'l'ín hiệu chuông \ a 7 bel (Bell)
1.3 BIẾN
Biên là một đại lượng thuộc một kiểu n h ấ t định (sô" nguyên,
sô thực v.v ) m à giá trị có th ể th a y đổi trong quá tr ìn h thực
h iệ n chương trình Mục đích của biến là dùng để lưu trữ dữ liệu
và việc sử d ụ n g biến được thực hiện th ô n g qua tê n của nó Khi
đ ặ t tên cho biến cần p h ả i đảm bảo các qui tắc sau:
• Tên bao gồm một dãy các chữ cái, sô" và ph ả i b ắ t đầu
11
Trang 13b ằ n g chư cái Không sử d ụ n g các ký tự đặc biệt để đặt tên cho biến kể cả dấu cách
• Tên của biến không được t r ù n g với các từ khoá
• Có sự p h â n biệt giữa chữ thường và chữ hoa k hi đ ặ t tên cho biến
1.4 CÁ C LOẠI DỮ LIỆU VÀ CÁCH KHAI BÁO
T ấ t cả các biến trong ngôn ngữ c và C++ đều ph ả i được
k h á i báo trước khi sử dụng Thông qua việc k h a i báo n à y trìn h biê n dịch xác định kích thước của biến (cấp p h á t bộ nhớ để lưu
t r ữ giá trị của biến trong bộ nhố)
Khai báo biến đưỢc thực hiện qua cú p há p sau:
K i ê u b i ê n T ê n b i ê n ;
Dưới đây sẽ chỉ ra một sô" từ khoá được d à n h cho việc kh a i báo biến, kích thước của biến và k h o ả n g giá trị có th ể được lưu
t r ữ tro n g biến khi k h a i báo b ằ ng các từ khoá n à y (đôl với các loại
m á y sử dụng 16 bit dữ liệu):
Bảng 1.2
K i ể u K í c h t h ư ớ c (b it) G i á t r i •
c h a r 8 [-126 - 125]
u n s ig n e d char 8 [0 ^ 255]
in t 16 -32768 - +32767]
u n s ig n e d int 16 [0 - 65535]
long in t 32 -2e9 -í- +2e9
float 32 [-lOe-37 ^ 10e37
double 64 í-lOe-307 - lOe 3071
12
Trang 14Trong các kiôu biôn này;
c h a r dừỢc dùng khai báo cho dữ liệu kiếu ký tự;
i n t - dữ Hệu kiểu sô" nguyên:
f l o a t - dử liệu kiểu sô" thực;
d o u b l e - dữ liệu kiểu số’ thực với độ chính xác gấp đôi;
u n s i g n e d - dữ liệu k h ô n g d ấ u (chỉ d ù n g cho c h a r và int);
l o n g - Dữ liệu có độ dài lớn hơn gâ^p hai lần (dùng cho in t
và float)
Các biến có thể được kh a i báo trê n cùng một dòng (ví d ụ in t
intx, y;
float z;
int a;
v ể vị tr í k h a i báo các biến, trong khi ngôn ngữ c đòi hỏi việc kh a i báo các biên ph ả i đưỢc thực hiện ở trước p h ạ m vi m à chúng được sử d ụ n g (thông thường khi b ắ t đầu định n g h ĩa h à m ) thì việc k h a i báo biến trong C++ chỉ cần dược thực hiệ n trưóc khi các biến n à y được sử dụng
1.5 MẢNG
M ảng là tậ p hỢp các biến có cùng kiểu được p h â n bô" lien tục trong bộ nhố Khi sử dụng m ả n g cũng cần phải lưu ý:
• M ản g phải được đ ặ t tên trưóc khi sử dụng N g u y ên tắc
đ ặ t tê n của m ả n g giông n h ư biến;
• Mỗi p h ầ n tử của m ả n g được xem là một biến;
• M ả n g ph ả i được kh a i báo trước khi sử dụng
13