H C VI N CƠNG NGH B U CHÍNH VI N THƠNG
NGƠN NG
L P TRÌNH C++
(Dùng cho sinh viên h đào t o đ i h c t xa)
L u hành n i b
HÀ N I - 2006
NGƠN NG
L P TRÌNH C++
PGS.TS. Tr n ình Qu
KS. Nguy n M nh Hùng
L p trình nâng cao v i C++
L p trình h
ng đ i t
ng v i C++
2
GI I THI U
C++ là ngơn ng l p trình h ng đ i t ng đ c m r ng t ngơn ng C. Do v y, C++ có u
đi m là k th a đ c các đi m m nh truy n th ng c a ngôn ng C nh uy n chuy n, t ng thích
v i các thi t b ph n c ng. Hi n nay, C++ là m t ngôn ng l p trình ph bi n, đ c gi ng d y t i
các tr ng đ i h c trong n c và trên th gi i và đ c bi t đ c s d ng r ng rãi cho nhu c u phát
tri n c a công nghi p ph n m m hi n nay. Tài li u này không nh ng nh m gi i thi u cho sinh
viên ngơn ng l p trình C++, mà cịn mong mu n qua đó sinh viên có th hi u đ c t t ng c a
ph ng pháp l p trình h ng đ i t ng nói chung. N i dung c a tài li u bao g m hai ph n chính:
•
Ph n th nh t là l p trình nâng cao v i C++, bao g m l p trình C++ v i con tr và m ng,
các ki u d li u có c u trúc cùng các thao tác vào ra trên t p.
•
Ph n th hai là l p trình h ng đ i t ng v i C++, bao g m các đ nh ngh a và các thao
tác trên l p đ i t ng, tính k th a và t ng ng b i trong C++, cách s d ng m t s l p
c b n trong th vi n C++.
N i dung tài li u đ
Ch
c t ch c thành 7 ch
ng:
ng 1: Gi i thi u t ng quan v các ph
ng pháp l p trình
Trình bày các ph ng pháp l p trình tuy n tính, l p trình c u trúc và đ c bi t, làm quen
v i các khái ni m trong l p trình h ng đ i t ng.
Ch
ng 2: Con tr và m ng
Trình bày cách khai báo và s d ng các ki u con tr và m ng trong ngôn ng C++.
Ch
ng 3: Ki u d li u có c u trúc
Trình bày cách bi u di n và cài đ t m t s ki u c u trúc d li u tr u t ng trong C++. Sau
đó, trình bày cách áp d ng các ki u d li u này trong các ng d ng c th .
Ch
ng 4: Vào ra trên t p
Trình bày các thao tác đ c, ghi d li u trên các t p tin khác nhau: t p tin v n b n và t p tin
nh phân. Trình bày các cách truy nh p t p tin tr c ti p.
Ch
ng 5: L p đ i t
ng
Trình bày các khái ni m m đ u cho l p trình h ng đ i t ng trong C++, bao g m cách
khai báo và s d ng l p, các thu c tính c a l p; cách kh i t o và hu b đ i t ng, các
quy t c truy nh p đ n các thành ph n c a l p.
Ch
ng 6: Tính k th a và t
ng ng b i
Trình bày cách th c k th a gi a các l p trong C++, các nguyên t c truy nh p trong k
th a, đ nh ngh a n p ch ng các ph ng th c và tính đa hình trong l p trình h ng đ i
t ng v i C++.
Ch
ng 7: M t s l p quan tr ng
Trình bày cách s d ng m t s l p có s n trong th vi n chu n c a C++, bao g m các l p:
l p t p h p, l p chu i, l p ng n x p, l p hàng đ i và l p danh sách liên k t.
đ c đ c cu n sách này, sinh viên ph i quen bi t các khái ni m c b n v l p trình, có m t s
k n ng l p trình v i ngôn ng C ho c C++. Cu n sách này c ng có th dùng tài li u tham kh o
cho nh ng sinh viên mu n tìm hi u các k thu t l p trình nâng cao và l p trình h ng đ i t ng
3
v i C++. Cu n sách này có kèm theo m t đ a ch
l y làm minh ho và các bài t p trong cu n sách.
ng trình ch a tồn b các ch
ng trình đ
c
M c dù các tác gi đã có nhi u c g ng trong vi c biên so n tài li u này, song khơng th tránh
kh i nh ng thi u sót. R t mong nh n đ c nh ng ý ki n đóng góp quý báu t các sinh viên và các
b n đ ng nghi p.
4
Ch
ng 1: Gi i thi u v các ph
ng pháp l p trình
CH
NG 1
GI I THI U V CÁC PH
N i dung c a ch
ng này t p trung trình bày các ph
•
Ph
ng pháp l p trình tuy n tính
•
Ph
ng pháp l p trình h
ng c u trúc
•
Ph
ng pháp l p trình h
ng đ i t
NG PHÁP L P TRÌNH
ng pháp l p trình:
ng.
1.1 L P TRÌNH TUY N TÍNH
c tr ng c b n c a l p trình tuy n tính là t duy theo l i tu n t . Ch ng trình s đ c th c
hi n theo th t t đ u đ n cu i, l nh này k ti p l nh kia cho đ n khi k t thúc ch ng trình.
c tr ng
L p trình tuy n tính có hai đ c tr ng:
•
•
n gi n: ch
ng trình đ
c ti n hành đ n gi n theo l i tu n t , không ph c t p.
n lu ng: ch có m t lu ng cơng vi c duy nh t, và các công vi c đ
trong lu ng đó.
c th c hi n tu n t
Tính ch t
•
u đi m: Do tính đ n gi n, l p trình tuy n tính đ
gi n và có u đi m d hi u.
•
Nh c đi m: V i các ng d ng ph c t p, ng
gi i quy t.
c ng d ng cho các ch
ng trình đ n
i ta khơng th dùng l p trình tuy n tính đ
Ngày nay, l p trình tuy n tính ch t n t i trong ph m vi các modul nh nh t c a các ph ng pháp
l p trình khác. Ví d trong m t ch ng trình con c a l p trình c u trúc, các l nh c ng đ c th c
hi n theo tu n t t đ u đ n cu i ch ng trình con.
1.2 L P TRÌNH H
1.2.1
NG C U TRÚC
c tr ng c a l p trình h
ng c u trúc
Trong l p trình h ng c u trúc, ch ng trình chính đ c chia nh thành các ch ng trình con và
m i ch ng trình con th c hi n m t công vi c xác đ nh. Ch ng trình chính s g i đ n ch ng
trình con theo m t gi i thu t, ho c m t c u trúc đ c xác đ nh trong ch ng trình chính.
Các ngơn ng l p trình c u trúc ph bi n là Pascal, C và C++. Riêng C++ ngồi vi c có đ c tr ng
c a l p trình c u trúc do k th a t C, cịn có đ c tr ng c a l p trình h ng đ i t ng. Cho nên
C++ còn đ c g i là ngơn ng l p trình n a c u trúc, n a h ng đ i t ng.
c tr ng
c tr ng c b n nh t c a l p trình c u trúc th hi n
m i quan h :
5
Ch
ng 1: Gi i thi u v các ph
Ch
ng pháp l p trình
ng trình = C u trúc d li u + Gi i thu t
Trong đó:
•
C u trúc d li u là cách t ch c d li u cho vi c x lý b i m t hay nhi u ch
nào đó.
•
Gi i thu t là m t quy trình đ th c hi n m t cơng vi c xác đ nh
Trong ch
ng trình
ng trình, gi i thu t có quan h ph thu c vào c u trúc d li u:
•
M t c u trúc d li u ch phù h p v i m t s h n ch các gi i thu t.
•
N u thay đ i c u trúc d li u thì ph i thay đ i gi i thu t cho phù h p.
•
M t gi i thu t th
ng ph i đi kèm v i m t c u trúc d li u nh t đ nh.
Tính ch t
ng trình con có th đ
•
M i ch
•
Các ch ng trình con có th đ c g i đ n đ th c hi n theo m t th t b t kì, tu thu c
vào gi i thu t trong ch ng trình chính mà khơng ph thu c vào th t khai báo c a các
ch ng trình con.
•
Các ngơn ng l p trình c u trúc cung c p m t s c u trúc l nh đi u khi n ch
c g i th c hi n nhi u l n trong m t ch
ng trình chính.
ng trình.
u đi m
•
Ch
•
T duy gi i thu t rõ ràng.
ng trình sáng s a, d hi u, d theo dõi.
c đi m
Nh
•
L p trình c u trúc khơng h tr m nh vi c s d ng l i mã ngu n: Gi i thu t luôn ph
thu c ch t ch vào c u trúc d li u, do đó, khi thay đ i c u trúc d li u, ph i thay đ i gi i
thu t, ngh a là ph i vi t l i ch ng trình.
•
Khơng phù h p v i các ph n m m l n: t duy c u trúc v i các gi i thu t ch phù h p v i
các bài toán nh , n m trong ph m vi m t modul c a ch ng trình. V i d án ph n m m
l n, l p trình c u trúc t ra không hi u qu trong vi c gi i quy t m i quan h v mô gi a
các modul c a ph n m m.
V nđ
V n đ c b n c a l p trình c u trúc là b ng cách nào đ phân chia ch ng trình chính thành các
ch ng trình con cho phù h p v i yêu c u, ch c n ng và m c đích c a m i bài tốn. Thơng
th ng, đ phân rã bài tốn trong l p trình c u trúc, ng i ta s d ng ph ng pháp thi t k trên
xu ng (top-down).
1.2.2 Ph
ng pháp thi t k trên xu ng (top-down)
Ph ng pháp thi t k top-down ti p c n bài toán theo h ng t trên xu ng d i, t t ng qúat đ n
chi ti t. Theo đó, m t bài tốn đ c chia thành các bài toán con nh h n. M i bài toán con l i
đ c chia nh ti p, n u có th , thành các bài tốn con nh h n n a. Q trình này cịn đ c g i là
quá trình làm m n d n. Quá trình này s d ng l i khi các bài tốn con khơng c n chia nh thêm
6
Ch
ng 1: Gi i thi u v các ph
ng pháp l p trình
n a. Ngh a là khi m i bài tốn con đ u có th gi i quy t b ng m t ch
thu t đ n gi n.
ng trình con v i m t gi i
Ví d , s d ng ph ng pháp top-down đ gi i quy t bài toán xây m t c n nhà m i. Chúng ta có
th phân rã bài tốn theo các b c nh sau:
•
m c th nh t, chia bài toán xây nhà thành các bài toán nh h n nh làm móng, đ c t,
đ tr n, xây t ng, l p mái.
•
m c th hai, phân rã các công vi c m c th nh t nh vi c làm móng nhà có th phân
rã ti p thành các cơng vi c đào móng, gia c n n, làm khung s t, đ bê tong; công vi c đ
c t đ c ph n rã thành …
•
m c th ba, phân rã các cơng vi c c a m c th hai nh vi c đào móng có th phân chia
ti p thành các cơng vi c nh đo đ c, c m m c, ch ng dây, đào và ki m tra móng. Vi c gia
c n n đ c phân rã thành …
Quá trình phân rã có th d ng m c này, b i vì các cơng vi c con thu đ c nh đo đ c, c m
m c, ch ng dây, đào… có th th c hi n đ c ngay, khơng c n chia nh thêm n a.
L u ý:
•
Cùng s d ng ph ng pháp top-down v i cùng m t bài tốn, nh ng có th cho ra nhi u
k t qu khác nhau. Nguyên nhân là do s khác nhau trong tiêu chí đ phân rã m t bài tốn
thành các bài tốn con.
Ví d , v n áp d ng ph ng pháp top-down đ gi i quy t bài toán xây nhà, nh ng n u s d ng
m t cách khác đ phân chia bài tốn, ta có th thu đ c k t qu khác bi t so v i ph ng pháp ban
đ u:
•
m c th nh t, chia bài tốn xây nhà thành các bài toán nh h n nh làm ph n g , làm
ph n s t, làm ph n bê tơng và làm ph n g ch.
•
m c th hai, phân rã các công vi c m c th nh t là làm ph n g có th chia thành các
công vi c nh x g , gia công g , t o khung, l p vào nhà. Vi c làm s t có th chia nh
thành…
Rõ ràng, v i cách làm m n th này, ta s thu đ
hi n ph n trên.
1.3 L P TRÌNH H
1.3.1 L p trình h
Trong l p trình h
NG
ng đ i t
ng đ i t
IT
c m t k t qu khác h n v i cách th c đã th c
NG
ng
ng:
ng trình là các đ i t
ng và sau đó tr u t
ng hố đ i
•
Ng i ta coi các th c th trong ch
t ng thành l p đ i t ng.
•
D li u đ c t ch c thành các thu c tính c a l p. Ngu i ta ng n ch n vi c thay đ i tu
ti n d li u trong ch ng trình b ng các cách gi i h n truy nh p nh ch cho phép truy
nh p d li u thông qua đ i t ng, thông qua các ph ng th c mà đ i t ng đ c cung
c p…
•
Quan h gi a các đ i t ng là quan h ngang hàng ho c quan h k th a: N u l p B k
th a t l p A thì A đ c g i là l p c s và B đ c g i là l p d n xu t.
7
Ch
ng 1: Gi i thi u v các ph
ng pháp l p trình
Ngơn ng l p trình h ng đ i t ng ph bi n hi n nay là Java, C++, C#...M c dù C++ c ng có
nh ng đ c tr ng c b n c a l p trình h ng đ i t ng nh ng v n khơng ph i là ngơn ng l p
trình thu n h ng đ i t ng.
c tr ng
L p trình h
ng đ i t
ng có hai đ c tr ng c b n:
•
óng gói d li u: d li u luôn đ c t ch c thành các thu c tính c a l p đ i t
truy nh p đ n d li u ph i thông qua các ph ng th c c a đ i t ng l p.
•
S d ng l i mã ngu n: vi c s d ng l i mã ngu n đ c th hi n thông qua c ch k
th a. C ch này cho phép các l p đ i t ng có th k th a t các l p đ i t ng khác. Khi
đó, trong các l p d n xu t, có th s d ng các ph ng th c (mã ngu n) c a các l p c s
mà không c n ph i đ nh ngh a l i.
ng. Vi c
u đi m
L p trình h
ng đ i t
ng có m t s
u đi m n i b t:
•
Khơng cịn nguy c d li u b thay đ i t do trong ch ng trình. Vì d li u đã đ c đóng
gói vào các đ i t ng. N u mu n truy nh p vào d li u ph i thông qua các ph ng th c
đ c cho phép c a đ i t ng.
•
Khi thay đ i c u trúc d li u c a m t đ i t ng, không c n thay đ i mã ngu n c a các đ i
t ng khác, mà ch c n thay đ i m t s thành ph n c a đ i t ng d n xu t. i u này h n
ch s nh h ng x u c a vi c thay đ i d li u đ n các đ i t ng khác trong ch ng
trình.
•
Có th s d ng l i mã ngu n, ti t ki m tài nguyên, chi phí th i gian. Vì ngun t c k
th a cho phép các l p d n xu t s d ng các ph ng th c t l p c s nh nh ng ph ng
th c c a chính nó, mà khơng c n thi t ph i đ nh ngh a l i.
•
Phù h p v i các d án ph n m m l n, ph c t p.
1.3.2 M t s khái ni m c b n
Trong m c này, chúng ta s làm quen v i m t s khái ni m c b n trong l p trình h
t ng. Bao g m:
•
Khái ni m đ i t
•
Khái ni m đóng gói d li u (encapsulation)
•
Khái ni m k th a (inheritance)
•
Khái ni m đa hình (polymorphism)
it
ng đ i
ng (object)
ng (Object)
Trong l p trình h ng đ i t ng, đ i t ng đ c coi là đ n v c b n nh nh t. Các d di u và
cách x lí ch là thành ph n c a đ i t ng mà không đ c coi là th c th . M t đ i t ng ch a các
d li u c a riêng nó, đ ng th i có các ph ng th c (hành đ ng) thao tác trên các d li u đó:
it
8
ng = d li u + ph
ng th c
Ch
ng 1: Gi i thi u v các ph
ng pháp l p trình
L p (Class)
Khi có nhi u đ i t ng gi ng nhau v m t d li u và ph
và g i chung là l p:
•
•
L p là s tr u t
it
ng hoá c a đ i t
ng th c, chúng đ
c nhóm l i v i nhau
ng
ng là m t th hi n c a l p.
óng gói d li u (Encapsulation)
•
Các d li u đ
riêng.
c đóng gói vào trong đ i t
•
Khơng th truy nh p đ n d li u m t cách t do nh l p trình c u trúc
•
Mu n truy nh p đ n các d li u đã đ c b o v , ph i thông qua các đ i t ng, ngh a là
ph i s d ng các ph ng th c mà đ i t ng cung c p m i có th truy nh p đ n d li u
c a đ i t ng đó.
ng. M i d li u có m t ph m vi truy nh p
Tuy nhiên, vì C++ ch là ngơn ng l p trình n a đ i t ng, cho nên C++ v n cho phép đ nh ngh a
các bi n d li u và các hàm t do, đây là k t qu k th a t ngôn ng C, m t ngôn ng l p trình
thu n c u trúc.
K th a (Inheritance)
Tính k th a c a l p trình h ng đ i t ng cho phép m t l p có th k
t i. Khi đó, l p m i có th s d ng d li u và ph ng th c c a các l
Ngoài ra, l p d n xu t cịn có th b sung thêm m t s d li u và ph
th a là khi thay đ i d li u c a m t l p, ch c n thay đ i các ph ng th
mà không c n thay đ i trong các l p d n xu t.
th a t m t s l p đã t n
p c s nh là c a mình.
ng th c. u đi m c a k
c trong ph m vi l p c s
a hình (Polymorphsim)
a hình là khái ni m ln đi kèm v i k th a. Do tính k th a, m t l p có th s d ng l i các
ph ng th c c a l p khác. Tuy nhiên, n u c n thi t, l p d n xu t c ng có th đ nh ngh a l i m t
s ph ng th c c a l p c s . ó là s n p ch ng ph ng th c trong k th a. Nh s n p ch ng
ph ng th c này, ta ch c n g i tên ph ng th c b n p ch ng t đ i t ng mà khơng c n quan
tâm đó là đ i t ng c a l p nào. Ch ng trình s t đ ng ki m tra xem đ i t ng là thu c ki u
l p c s hay thu c l p d n xu t, sau đó s g i ph ng th c t ng ng v i l p đó. ó là tính đa
hình.
1.3.3 L p trình h
ng đ i t
ng trong C++
Vì C++ là m t ngơn ng l p trình đ c m r ng t m t ngôn ng l p trình c u trúc C nên C++
đ c xem là ngơn ng l p trình n a h ng đ i t ng, n a h ng c u trúc.
Nh ng đ c tr ng h
ng đ i t
ng c a C++
•
Cho phép đ nh ngh a l p đ i t
•
Cho phép đóng gói d li u vào các l p đ i t ng. Cho phép đ nh ngh a ph m vi truy nh p
d li u c a l p b ng các t khoá ph m vi: public, protected, private.
ng.
9
Ch
ng 1: Gi i thi u v các ph
ng pháp l p trình
•
Cho phép k th a l p v i các ki u k th a khác nhau tu vào t khố d n xu t.
•
Cho phép l p d n xu t s d ng các ph
•
Cho phép đ nh ngh a ch ng ph
Nh ng h n ch h
ng đ i t
ng th c c a l p c s (trong ph m vi quy đ nh).
ng th c trong l p d n xu t.
ng c a C++
Nh ng h n ch này là do C++ đ
c phát tri n t m t ngôn ng l p trình thu n c u trúc C.
•
Cho phép đ nh ngh a và s d ng các bi n d li u t do.
•
Cho phép đ nh ngh a và s d ng các hàm t do.
•
Ngay c khi d li u đ c đóng gói vào l p, d li u v n có th truy nh p tr c ti p nh d
li u t do b i các hàm b n, l p b n (friend) trong C++.
T NG K T CH
NG 1
Ch ng 1 đã trình bày t ng quan v các ph ng pháp l p trình hi n nay. N i dung t p trung vào
ba ph ng pháp l p trình có liên quan tr c ti p đ n ngôn ng l p trình C++:
•
L p trình tuy n tính
•
L p trình h
ng c u trúc
•
L p trình h
ng đ i t
ng.
C++ là ngơn ng l p trình đ c m r ng t ngơn ng l p trình c u trúc C. Do đó, C++ v a có
nh ng đ c tr ng c a l p trình c u trúc, v a có nh ng đ c tr ng c a l p trình h ng đ i t ng.
10
Ch
ng 2: Con tr và m ng
CH
NG 2
CON TR
VÀ M NG
N i dung c a ch ng này t p trung trình bày các v n đ c b n liên quan đ n các thao tác trên
ki u d li u con tr và m ng trong C++:
•
Khái ni m con tr , cách khai báo và s d ng con tr .
•
M i quan h gi a con tr và m ng
•
Con tr hàm
•
C p phát b nh cho con tr
2.1 KHÁI NI M CON TR
2.1.1 Khai báo con tr
Con tr là m t bi n đ c bi t ch a đ a ch c a m t bi n khác. Con tr có cùng ki u d li u v i ki u
d li u c a bi n mà nó tr t i. Cú pháp khai báo m t con tr nh sau:
li u> *<Tên con tr >;
Trong đó:
•
Ki u d li u: Có th là các ki u d li u c b n c a C++, ho c là ki u d li u có c u trúc,
ho c là ki u đ i t ng do ng i dùng t đ nh ngh a.
•
Tên con tr : Tuân theo qui t c đ t tên bi n c a C++:
-
Ch đ
c b t đ u b ng m t kí t (ch ), ho c d u g ch d
-
B t đ u t kí t th hai, có th có ki u kí t s .
-
Khơng có d u tr ng (space bar) trong tên bi n.
-
Có phân bi t ch hoa và ch th
-
Không gi i h n đ dài tên bi n.
i “_”.
ng.
Ví d , đ khai báo m t bi n con tr có ki u là int và tên là pointerInt, ta vi t nh sau:
int *pointerInt;
L
•
Có th vi t d u con tr “*” ngay sau ki u d li u, ngh a là hai cách khai báo sau là t
đ ng:
ng
int *pointerInt;
int* pointerInt;
•
Các cách khai báo con tr nh sau là sai cú pháp:
*int pointerInt;
// Khai báo sai con tr
int pointerInt*;
// Khai báo sai con tr
2.1.2 S d ng con tr
Con tr đ
c s d ng theo hai cách:
11
Ch
ng 2: Con tr và m ng
•
Dùng con tr đ l u đ a ch c a bi n đ thao tác
•
L y giá tr c a bi n do con tr tr đ n đ thao tác
Dùng con tr đ l u đ a ch c a bi n
B n thân con tr s đ
phép gán nh sau:
c tr vào đ a ch c a m t bi n có cùng ki u d li u v i nó. Cú pháp c a
<Tên con tr > = &<tên bi n>;
L
•
Trong phép tốn này, tên con tr khơng có d u “*”.
Ví d :
int x, *px;
px = &x;
s cho con tr px có ki u int tr vào đ a ch c a bi n x có ki u nguyên. Phép toán &<Tên bi n>
s cho đ a ch c a bi n t ng ng.
L y giá tr c a bi n do con tr tr đ n
Phép l y giá tr c a bi n do con tr tr đ n đ
c th c hi n b ng cách g i tên:
*<Tên con tr >;
L uý
•
Trong phép tốn này, ph i có d u con tr “*”. N u khơng có d u con tr , s tr thành
phép l y đ a ch c a bi n do con tr tr t i.
Ví d :
int x = 12, y, *px;
px = &y;
*px = x;
Quá trình di n ra nh sau:
int x = 12, y, *px;
x = 12
y=0
px
px = &y;
x = 12
y=0
px
px = x;
x = 12
y=x =12
px
null
con tr px v n tr t i đ a ch bi n y và giá tr c a bi n y s là 12.
Phép gán gi a các con tr
Các con tr cùng ki u có th gán cho nhau thông qua phép gán và l y đ a ch con tr :
1> =
2>;
L uý
•
12
Trong phép gán gi a các con tr , b t bu c ph i dùng phép l y đ a ch c a bi n do con tr
tr t i (khơng có d u “*” trong tên con tr ) mà không đ c dùng phép l y giá tr c a
bi n do con tr tr t i.
Ch
ng 2: Con tr và m ng
•
Hai con tr ph i cùng ki u. Trong tr ng h p hai con tr khác ki u, ph i s d ng các
ph ng th c ép ki u t ng t nh trong phép gán các bi n thông th ng có ki u khác
nhau.
Ví d :
int x = 12, *px, *py;
px = &x;
py = px;
py
null
px
py
null
px
py
int x = 12, *px, *py;
x = 12
px
px = &x;
x = 12
py = px;
x = 12
null
con tr py c ng tr vào đ a ch c a bi n x nh con tr px. Khi đó *py c ng có giá tr 12 gi ng nh
*px và là giá tr c a bi n x.
Ch
Ch
ng trình 2.1 minh ho vi c dùng con tr gi a các bi n c a m t ch
ng trình C++.
ng trình 2.1
#include <stdio.h>
#include <conio.h>
void main(void){
int x = 12, *px, *py;
cout << ”x = ” << x << endl;
px = &x;
// Con tr
px tr
t i đ a ch
c a x
cout << ”px = &x, *px = ” << *px << endl;
*px = *px + 20;
// N i dung c a px là 32
cout << ”*px = *px+20, x = ” << x << endl;
// Cho py tr
*py += 15;
// N i dung c a py là 47
cout << ”py = px, *py +=15, x =
t i ch
mà px tr : đ a ch
py = px;
c a x
” << x << endl;
}
Trong ch ng trình 2.1, ban đ u bi n x có giá tr 12. Sau đó, con tr px tr vào đ a ch c a bi n x
nên con tr px c ng có giá tr 12. Ti p theo, ta t ng giá tr c a con tr px thêm 20, giá tr c a con
tr px là 32. Vì px đang tr đ n đ a ch c a x nên x c ng có giá tr là 32. Sau đó, ta cho con tr py
tr đ n v trí mà px đang tr t i (đ a ch c a bi n x) nên py c ng có giá tr 32. Cu i cùng, ta t ng
giá tr c a con tr py thêm 15, py s có giá tr 37. Vì py c ng đang tr đ n đ a ch c a x nên x
c ng có giá tr 37. Do đó, ví d 2.1 s in ra k t qu nh sau:
13
Ch
ng 2: Con tr và m ng
x = 12
px = &x, *px = 12
*px = *px + 20, x = 32
py = px, *py += 15, x = 37
2.2 CON TR
VÀ M NG
2.2.1 Con tr và m ng m t chi u
M ng m t chi u
Trong C++, tên m t m ng đ c coi là m t ki u con tr h ng, đ c đ nh v t i m t vùng nh xác
đ nh và đ a ch c a tên m ng trùng v i đ a ch c a ph n t đ u tiên c a m ng.
Ví d khai báo:
int A[5];
thì đ a ch c a m ng A (c ng vi t là A) s trùng v i đ a ch ph n t đ u tiên c a m ng A (là
&A[0]) ngh a là:
A = &A[0];
Quan h gi a con tr và m ng
Vì tên c a m ng đ
ki u.
c coi nh m t con tr h ng, nên nó có th đ
c gán cho m t con tr có cùng
Ví d khai báo:
int A[5] = {5, 10, 15, 20, 25};
int *pa = A;
int A[5] = {5, 10, 15, 20, 25};
A
A[0]=5
A[1]=10 A[2]=15 A[3]=20 A[4]= 25
int *pa = A;
A
A[0]=5
A[1]=10 A[2]=15 A[3]=20 A[4]= 25
pa
thì con tr pa s tr đ n m ng A, t c là tr đ n đ a ch c a ph n t A[0], cho nên hai khai báo sau
là t ng đ ng:
pa = A;
pa = &A[0];
V i khai báo này, thì đ a ch tr t i c a con tr pa là đ a ch c a ph n t A[0] và giá tr c a con tr
pa là giá tr c a ph n t A[0], t c là *pa = 5;
Phép toán trên con tr và m ng
Khi m t con tr tr đ n m ng, thì các phép toán t ng hay gi m trên con tr s t
d ch chuy n trên m ng.
Ví d khai báo:
int A[5] = {5, 10, 15, 20, 25};
14
ng ng v i phép
Ch
ng 2: Con tr và m ng
int *pa = &A[2];
thì con tr pa s tr đ n đ a ch c a ph n t A[2] và giá tr c a pa là: *pa = A[2] = 15.
Khi đó, phép toán:
pa = pa + 1;
s đ a con tr pa tr đ n đ a ch c a ph n t ti p theo c a m ng A, đó là đ a ch c a A[3]. Sau đó,
phép tốn:
pa = pa – 2;
s đ a con tr pa tr đ n đ a ch c a ph n t A[1].
int A[5] = {5, 10, 15, 20, 25};
A
A[0]=5
A[1]=10 A[2]=15 A[3]=20 A[4]= 25
int *pa = &A[2];
A
A[0]=5
A[1]=10 A[2]=15 A[3]=20 A[4]= 25
A[0]=5
A[1]=10 A[2]=15 A[3]=20 A[4]= 25
A[0]=5
A[1]=10 A[2]=15 A[3]=20 A[4]= 25
pa
A
pa = pa + 1;
pa
A
pa = pa - 2;
pa
L u ý:
•
Hai phép tốn pa++ và *pa++ có tác d ng hồn tồn khác nhau trên m ng, pa++ là thao
tác trên con tr , t c là trên b nh , nó s đ a con tr pa tr đ n đ a ch c a ph n t ti p
theo c a m ng. *pa++ là phép tốn trên giá tr , nó t ng giá tr hi n t i c a ph n t m ng
lên m t đ n v .
Ví d :
int A[5] = {5, 10, 15, 20, 25};
int *pa = &A[2];
thì pa++ là t
ng đ
nh ng *pa++ l i t
ng v i pa = &A[3] và *pa = 20.
ng đ
ng v i pa = &A[2] và *pa = 15+1 = 16, A[2] = 16.
15
Ch
ng 2: Con tr và m ng
int A[5] = {5, 10, 15, 20, 25};
A
A[0]=5
A[1]=10 A[2]=15 A[3]=20 A[4]= 25
int *pa = &A[2];
A
A[0]=5
A[1]=10 A[2]=15 A[3]=20 A[4]= 25
A[0]=5
A[1]=10 A[2]=15 A[3]=20 A[4]= 25
A[0]=5
A[1]=10 A[2]=16 A[3]=20 A[4]= 25
pa
A
pa ++;
pa
A
Nh ng *pa ++;
pa
•
Trong tr
ng h p:
int A[5] = {5, 10, 15, 20, 25};
int *pa = &A[4];
thì phép toán pa++ s đ a con tr pa tr đ n m t đ a ch không xác đ nh. Lí do là A[4] là
ph n t cu i c a m ng A, nên pa++ s tr đ n đ a ch ngay sau đ a ch c a A[4], đ a ch
này n m ngoài vùng ch s c a m ng A nên không xác đ nh. T ng t v i tr ng h p
pa=&A[0], phép toán pa-- c ng đ a pa tr đ n m t đ a ch không xác đ nh.
int A[5] = {5, 10, 15, 20, 25};
A
A[0]=5
A[1]=10 A[2]=15 A[3]=20 A[4]= 25
int *pa = &A[2];
A
A[0]=5
A[1]=10 A[2]=15 A[3]=20 A[4]= 25
A[0]=5
A[1]=10 A[2]=15 A[3]=20 A[4]= 25
A[0]=5
A[1]=10 A[2]=15 A[3]=20 A[4]= 25
A[0]=5
A[1]=10 A[2]=15 A[3]=20 A[4]= 25
pa
A
pa ++;
null
pa
A
pa = &A[0];
pa
pa --;
null
A
pa
•
Vì m ng A là con tr h ng, cho nên không th th c hi n các phép tốn trên A mà ch có
th th c hi n trên các con tr tr đ n A: các phép toán pa++ ho c pa--là h p l , nh ng các
phép tốn A++ ho c A--là khơng h p l .
Ch ng trình 2.2a minh ho vi c cài đ t m t th t c s p x p các ph n t c a m t m ng theo cách
thông th ng.
16
Ch
Ch
ng 2: Con tr và m ng
ng trình 2.2a
void SortArray(int A[], int n){
int temp;
for(int i=0; i
for(int j=i+1; j
if(A[i] > A[j]){
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
Ch ng trình 2.2b cài đ t m t th t c t
toàn gi ng nhau.
Ch
ng t b ng con tr . Hai th t c này có ch c n ng hồn
ng trình 2.2b
void SortArray(int *A, int n){
int temp;
for(int i=0; i
for(int j=i+1; j
if(*(A+i) > *(A+j)){
temp = *(A+i);
*(A+i) = *(A+j);
*(A+j) = temp;
}
}
Trong ch ng trình 2.2b, thay vì dùng m t m ng, ta dùng m t con tr đ tr đ n m ng c n s p
x p. Khi đó, ta có th dùng các thao tác trên con tr thay vì các thao tác trên các ph n t m ng.
2.2.2 Con tr và m ng nhi u chi u
Con tr và m ng nhi u chi u
M t câu h i đ t ra là n u m t ma tr n m t chi u thì t
nhi u chi u thì t ng đ ng v i con tr nh th nào?
ng đ
ng v i m t con tr , v y m t m ng
Xét ví d :
int A[3][3] = {
{5, 10, 15},
{20, 25, 30},
{35, 40, 45}
};
17
Ch
ng 2: Con tr và m ng
Khi đó, đ a ch c a ma tr n A chính là đ a ch c a hàng đ u tiên c a ma tr n A, và c ng là đ a ch
c a ph n t đ u tiên c a hàng đ u tiên c a ma tr n A:
•
a ch c a ma tr n A:
A = A[0] = *(A+0) = &A[0][0];
•
a ch c a hàng th nh t:
A[1] = *(A+1) = &A[1][0];
•
a ch c a hàng th i:
A[i] = *(A+i) = &A[i][0];
•
a ch ph n t
&A[i][j] = (*(A+i)) + j;
•
Giá tr ph n t
A[i][j] = *((*(A+i)) + j);
Nh v y, m t m ng hai chi u có th thay th b ng m t m ng m t chi u các con tr cùng ki u:
int A[3][3];
có th thay th b ng:
int (*A)[3];
Con tr tr t i con tr
Vì m t m ng hai chi u int A[3][3] có th thay th b ng m t m ng các con tr int (*A)[3]. H n
n a, m t m ng int A[3] l i có th thay th b ng m t con tr int *A. Do v y, m t m ng hai chi u
có th thay th b ng m t m ng các con tr , ho c m t con tr tr đ n con tr . Ngh a là các cách
vi t sau là t ng đ ng:
int A[3][3];
int (*A)[3];
int **A;
2.3 CON TR
HÀM
M c dù hàm không ph i là m t bi n c th nên khơng có m t đ a ch xác đ nh. Nh ng trong khi
ch y, m i m t hàm trong C++ c ng có m t vùng nh xác đ nh, do v y, C++ cho phép dùng con
tr đ tr đ n hàm. Con tr hàm đ c dùng đ truy n tham s có d ng hàm.
Khai báo con tr hàm
Con tr hàm đ c khai báo t ng t nh khai báo nguyên m u hàm thông th ng trong C++,
ngo i tr vi c có thêm kí hi u con tr “*” tr c tên hàm. Cú pháp khai báo con tr hàm nh sau:
li u tr
v > (*<Tên hàm>)([<Các tham s >]);
Trong đó:
•
Ki u d li u tr v : là các ki u d li u thơng th
t đ nh ngh a.
•
Tên hàm: tên do ng
•
Các tham s : có th có ho c khơng (ph n trong d u “[]” là tu ch n). N u có nhi u tham
s , m i tham s đ c phân cách nhau b i d u ph y.
ng c a C++ ho c ki u do ng
i dùng t đ nh ngh a, tuân th theo quy t c đ t tên bi n trong C++.
Ví d khai báo:
int (*Calcul)(int a, int b);
là khai báo m t con tr hàm, tên là Calcul, có ki u int và có hai tham s c ng là ki u int.
L u ý:
18
i dùng
Ch
ng 2: Con tr và m ng
•
D u “()” bao b c tên hàm là c n thi t đ ch ra r ng ta đang khai báo m t con tr hàm.
N u khơng có d u ngo c đ n này, trình biên d ch s hi u r ng ta đang khai báo m t hàm
thông th ng và có giá tr tr v là m t con tr .
Ví d , hai khai báo sau là khác nhau hoàn toàn:
// Khai báo m t con tr
hàm
int (*Calcul)(int a, int b);
// Khai báo m t hàm tr
v
ki u con tr
int *Calcul(int a, int b);
S d ng con tr hàm
Con tr hàm đ c dùng khi c n g i m t hàm nh là tham s c a m t hàm khác. Khi đó, m t hàm
đ c g i ph i có khn m u gi ng v i con tr hàm đã đ c khai báo.
Ví d , v i khai báo:
int (*Calcul)(int a, int b);
thì có th g i các hàm có hai tham s ki u int và tr v c ng ki u int nh sau:
int add(int a, int b);
int sub(int a, int b);
nh ng không đ
c g i các hàm khác ki u tham s ho c ki u tr v nh sau:
int add(float a, int b);
int add(int a);
char* sub(char* a, char* b);
Ch
Ch
ng trình 2.3 minh ho vi c khai báo và s d ng con tr hàm.
ng trình 2.3
#include <ctype.h>
#include <string>
// Hàm có s
d ng con tr
hàm nh
tham s
void Display(char[] str, int (*Xtype)(int c)){
int index = 0;
while(str[index] != ‘\0’){
cout << (*Xtype)(str[index]); // S
d ng con tr
hàm
index ++;
}
return;
}
// Hàm main, dùng l i g i hàm đ n con tr
hàm
void main(){
char input[500];
cout << “Enter the string: ”;
cin >> input;
19