Tải bản đầy đủ (.pdf) (186 trang)

Ngon ngu lap trinh c++ full pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.23 MB, 186 trang )

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; ifor(int j=i+1; jif(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; ifor(int j=i+1; jif(*(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



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×