C h ư ơ n g 1. M ở
đầ u
C h ư ơ n g n à y g ió i th iệ u n h ữ n g p h ầ n c ơ b ả n c ủ a m ộ t c h ư ơ n g trìn h C + + . C h ú n g ta sử d ụ n g
n h ữ n g v í dụ đ ơ n g iả n đ ế trìn h b à y cấ u trú c các ch ư ơ n g trìn h C + + v à cách th ứ c b iê n d ị ch
ch ú n g . C ác k h ái n iệ m c ơ b ả n n h ư là h ằ n g , b iế n , v à v iệ c lư u trữ ch ú n g tro n g b ộ n h ớ c ũ n g
sẽ đ ư ợ c th á o lu ậ n tro n g c h ư ơ n g này. S au đ â y là m ộ t đ ặ c tả sơ b ộ v ề kh ái n iệ m lậ p trìn h .
L ậ p tr ìn h
M á y tín h số là m ộ t c ô n g cụ đ ể g iả i q u y ế t h à n g lo ạ t các b à i t o á n lớ n. M ộ t lờ i g iả i c h o m ộ t
b à i to á n n ào đ ó đ ư ợ c g ọ i là m ộ t g iả i t h u ậ t (a lg o rith m ); n ó m ô tá m ộ t ch u ồ i các b ư ớ c cầ n
th ự c h iệ n đ ế g iả i q u y ế t b ài to án . M ộ t v í dụ đ ơ n g iả n ch o m ộ t b à i to á n v ả m ộ t g iả i th u ậ t có
th ể là:
B à i t o á n : s ắ p x ế p m ộ t d an h sách các số th e o th ứ tự tă n g dầ n.
G iả i th u ậ t:G iả sử d a n h sách đ ã ch o là listl ; tạ o ra m ộ t d an h s ách rỗ n g , list2,
đ ể lư u d an h sách đ ã sắ p xế p. L ặ p đ i lặ p lạ i cô n g v iệ c , tìm số n h ỏ n h ấ t tro n g
listl, x ó a n ó k h ỏ i listl, v à th ê m v à o p h ầ n tử k ế tiế p tro n g danh sá c h list2, cho
đ ế n k h i lỉ stl là rỗ ng.
G iả i th u ậ t đ ư ợ c d iễ n giả i b ằ n g các th u ậ t n g ữ trừ u tư ợ n g m a n g tín h c h ấ
n g ữ th ậ t sự đ ư ợ c h iể u b ở i m á y tín h là n g ô n n g ữ m áy . C h ư ơ n g trìn h đ ư
n g ô n n g ữ m á y đ ư ợ c g ọ i là có th ể th ự c th i. M ộ t ch ư ơ n g trìn h đ ư ợ c v iế
n g ô n n g ừ n ào k h á c th ì trư ớ c h ế t cầ n đ ư ợ c d ị c h san g n g ô n n g ữ m á y đ ể
h iế u v à th ự c th i nó.
t dề h iể u . N g ô n
ợ c d iễ n đ ạ t b ằ n g
t bằ ng bấ t kỳ m ộ t
m á y tín h có th ể
N g ô n n g ữ m á y cự c k ỳ k h ó h iể u đ ố i v ớ i lậ p trìn h v iê n v ì th ế h ọ k h ô n g th ể sử d ụ n g
trự c tiế p n g ô n n g ữ m á y đ ế v iế t c h ư ơ n g trìn h . M ộ t sự trừ u tư ợ n g k h ác là n g ô n n g ữ
a s s e m b ly . N ó c u n g cấ p n h ữ n g tê n dỗ n h ớ ch o các lệ n h v à m ộ t k ý h iệ u dễ h iế u h ơ n cho
d ữ liệ u . B ộ d ị c h đ ư ợ c g ọ i là a s s e m b l e r c h u y ể n n g ô n n g ữ a sse m b ly sang n g ô n n g ừ m áy.
N g a y c ả n h ữ n g n g ô n n g ữ assem b ly c ũ n g k h ó sử dụ n g . N h ữ n g n g ô n n g ữ cấ p cao
n h ư C + + cu n g cấ p các k ý h iệ u th u ậ n tiệ n h o n n h iề u ch o v iệ c th i h à n h các g iả i th u ậ t.
C h ú n g g iú p ch o các lậ p trìn h v iê n k h ô n g p h ả i n g h ĩ n h iề u v ề các th u ậ t n g ữ cấ p th ấ p , v à
g iú p h ọ chỉ tậ p tru n g v à o g iả i th u ậ t. T r ì n h b iê n d ị c h (co m p ile r) sè đ ả m n h iệ m v iệ c d ị c h
c h ư ơ n g trìn h v iế t b ằ n g n g ô n n g ữ cấ p cao san g n g ô n n g ữ assem b ly . M ã assem b ly đ ư ợ c
tạ o ra b ở i trìn h b iê n d ị c h sau đ ó sẽ đ ư ợ c tậ p h ợ p lạ i đ ế ch o ra m ộ t ch ư ơ n g trìn h có th ể
th ự c thi.
Chư ơ ng 1: Mở đầ u
1
1 .1 . M ộ t c h ư o n g t r ì n h C + + đ o n g i ả n
D a n h s ách 1.1 trìn h b ày ch ư ơ n g trìn h C + + đ ầ u tiên . C h ư ơ n g trìn h n à y k h i
c h ạ y sẽ x u ấ t ra th ô n g đ iệ p Hello World.
D a n h s á c h 1.1
1 #inđude <iostream.h>
2 int main (void)
3 {
c o u t « "Hello World'll";
4
5 1 _________ __ _________
C h ú g iả i
1
H à n g n à y sử d ụ n g chỉ th ị tiề n x ử lý #include đ ể c h èn v ào n ộ i d u n g củ a tậ p
tin h e a d e r iosteam .h tro n g ch ư ơ n g trìn h , iostrcamli là tậ p tin h e a d e r ch u ẩ n
c ủ a C + + v à ch ứ a đ ự n g các đ ị n h n g h ĩ a ch o x u ấ t v à nhậ p.
2
H à n g n à y đ ị n h n g h ĩ a m ộ t h à m đ ư ợ c g ọ i là main. H àm có th ế k h ô n g có
h a y có n h iề u th a m số (p ara m e te rs); các th a m số n ày lu ô n x u ấ t h iệ n sau
tê n h àm , g iữ a m ộ t cặ p d ấ u n g o ặ c. V iệ c x u ấ t h iệ n c ủ a từ void ở g iữ a dấ u
n |o ặ c ch i đ ị n h rằ n g h à m main k h ô n g có th a m số . H à m có th ể có k i ể u t r ả
v ề ; k iể u trả v ề lu ôn x u ấ t h iệ n trư ớ c tê n h àm . K iế u trả v ề ch o h à m m ain là
int (ví dụ : m ộ t số n g u y ên ). T ấ t c ả các ch ư ơ n g trìn h C + + p h ả i có m ộ t h àm
main d u y n h ấ t.V iệ c th ự c th i c h ư ơ n g trìn h lu ô n b ắ t đ ầ u từ h à m main.
3
D ấ u n g o ặ c n h ọ n b ắ t đ ầ u th â n củ a h à m mam.
4
H à n g n ày là m ộ t c â u l ệ n h (statem en t). M ộ t lệ n h là m ộ t sự tín h toán đ ế
ch o ra m ộ t g iá trị . K e t th ú c m ộ t lệ n h th ì lu ô n lu ô n đ ư ợ c đ á n h d ấ u b ằ n g
dấ u c h ấ m p h ẩ y (;). C âu lệ n h n à y x u ấ t ra c h u ỗ i "Hello World®" đ ế g ở i đ ế n
d ò n g x u ấ t co u t C huồ i là m ộ t d ã y các k ý tự đ ư ợ c đ ặ t tro n g cặ p n h á y kép.
K ý tự cu ố i c ù n g tro n g c h u ồ i n à y (\n) là m ộ t k ý tự x u ố n g h à n g (n ew lin e).
D ò n g là m ộ t đ ố i tư ợ n g đ ư ợ c d ù n g đ ế th ự c h iệ n các x u ấ t h o ặ c n h ậ p , cout
là d ò n g x u ấ t c h u ấ n tro n g C + + (x u ấ t ch u ấ n th ư ờ n g đ ư ợ c h iể u là m à n h ìn h
m á y tín h ). K ý tự « là to á n tử x u ấ t, nó x e m d ò n g x u ấ t n h ư là to á n h ạ n g
trái v à x e m b iể u thứ c n h ư là to á n h ạ n g p h ả i, v à tạ o n ên g iá trị c ủ a b iế u
th ứ c đ ư ợ c gở i đ ế n d ò n g x u ấ t. T ro n g trư ờ n g h ợ p n ày , k ế t q u ả là ch u ồ i
"Hello Worlđ\n" đ ư ợ c g ở i đ ế n d ò n g cout, làm ch o n ó đ ư ợ c h iế n th ị trên
m à n h ìn h m á y tính.
5
D ấ u n g o ặ c đ ó n g k ế t th ú c th â n h à m main.
1 .2 . B i ê n d ị c h m ộ t c h ư ơ n g t r ì n h C + +
B ả n g 1.1 trìn h b à y ch ư ơ
tro n g m ô i trư ờ n g U N IX
(in p u t) củ a n g ư ờ i d ù n g
th ố n g . D ấ u n h ắ c ở h à n g
Chư ơ ng 1: Mở đầ u
n g trìn h tro n g
th ô n g th ư ờ n g .
v à p h ầ n in th ư
lệ n h U N IX x u ấ
d a n h sách 1.1 đ ư ợ c b iê n d ị c h v à c h ạ y
P h ầ n in đ ậ m đ ư ợ c x em n h ư là đ ầ u v ào
ờ n g đ ư ợ c x e m n h ư là đ áp ứ n g c ủ a h ệ
t h iệ n n h ư là k ý tự dollar($ ).
2
B ả n g 1 .1
1
2
3
4
$ c c hello.cc
$ a.out
Hello World
$
C h ú g iả i
1
L ệ n h đ ể triệ u g ọ i bộ d ị c h A T & T c ủ a c + + tro n g m ôi trư ờ n g U N IX là c c .
Đ ố i số ch o lệ n h n ày (hello.cc) là tê n củ a tậ p tin c h ứ a đ ự n g c h ư ơ n g trìn h .
T h eo q u i đ ị n h th ì tê n tậ p tin có p h ầ n m ở rộ n g là .c, . c , h o ặ c là .cc. (P h ầ n
m ở rộ n g n à y có th ể là k h ác n h a u đ ố i v ớ i n h ữ n g h ệ đ iề u h à n h k h ác n h au )
2
K e t q u ả c ủ a sự b iê n d ị c h là m ộ t tậ p tin có th ế th ự c th i m ặ c đ ị n h là a.out.
Đ ế c h ạ y ch ư ơ n g trìn h , c h ú n g ta s ử d ụ n g a.out n h ư là lệ nh.
3
Đ â y là k ế t q u ả đ ư ợ c cu n g cấ p b ở i c h ư ơ n g trìn h .
4
D ấ u nhắ c ừ ở
th i c ủ a nó.
v ề h ệ th ố n g chỉ đ ị n h rằ n g ch ư ơ n g trìn h đã h o à n tấ t sự
th ự c
L ệ n h cc ch ấ p n h ậ n các p h ầ n tù y chọ n. M ồ i tù y ch ọ n x u ấ t h iệ n n h ư name,
tro n g đó name là tê n cù a tù y ch ọ n (th ư ờ n ệ là m ộ t k ỷ tự đơ n). M ộ t v ài tù y
c h ọ n y ê u cầ u có đ ố i số . V í dụ tù y c h ọ n x u ấ t (-o) ch o p h é p chỉ đ ị n h rõ tậ p tin
có th ế đ ư ợ c c u n g cấ p bở i trìn h b iê n d ị c h th a y v ì là aout. B ả n g 1.2 m in h h ọ a
v iệ c sử d ụ n g tù y ch ọ n n ày b ằ n g c á c h ch ỉ đ ị n h rõ hello n h ư là tê n củ a tậ p tin có
th ể th ự c thi.
B ả n g 1 .2
1
2
3
4
$ c c heflo.cc -o heDo
$ heBo
Hello World
$
M ặ c dù lệ n h th ự c sự có th ế k h ác p h ụ th u ộ c v à o trìn h b iên d ị ch , m ộ t th ủ
tụ c b iê n d ị c h tư ơ n g tự có th ế đ ư ợ c d ù n g d ư ớ i m ô i trư ờ n g M S -D O S . T rìn h
b iê n d ị c h C + + d ự a trên W in d o w s d â n g tặ n ẹ m ộ t m ô i trư ờ n g th â n th iệ n v ớ i
n g ư ờ i d ù n g m à v iệ c b iê n d ị c h rấ t đ ơ n g iả n b ằ n g các h ch ọ n lệ nh từ m e n u . Q u i
đ ị n h tê n d ư ớ i M S -D O S v à W in d o w s là tê n củ a tậ p tin n g u ồ n C + + p h ả i có
p h ầ n m ở rộ n g là .cpp.
1 .3 . V i ê• c b i ê n d i• c h C + + d i ễ n r a n h ư
th ế
nào
B iê n d ị c h m ộ t c h ư ơ n g trìn h C + + liên q u a n đ ế n m ộ t số b ư ớ c (h ầ u h ế t các b ư ớ c
là tro n g su ố t v ớ i n g ư ờ i dùng):
•
Đ ầ u tiê n , b ộ t i ề n x ử l ý C + + x e m q u a m ã tro n g c h ư ơ n g trìn h v à th ự c h iệ n
các ch ỉ th ị đ ư ợ c chỉ đ ị n h b ở i các chỉ th ị tiề n x ử lý (ví dụ , #include). K et
qu ả là m ộ t m ã ch ư ơ n g trìn h đ ã sử a đ ố i m à k h ô n g cò n ch ứ a b ấ t k ỳ m ộ t chi
th ị tiề n x ử lý n ào cả .
Chư ơ ng 1: Mở đầ u
3
•
S au đ ó , t r ì n h b i ê n d ị c h C + + d ị c h các m ã củ a ch ư ơ n g trìn h . T rìn h b i ê n
d ị c h có th ế là m ộ t trìn h b iê n d ị ch C + + th ậ t sự p h á t ra m ã a ss e m b ly h ay
m ã m áy , h o ặ c chỉ là trìn h c h u y ể n đ ổ i d ị c h m ã san g c . Ớ trư ờ n g h ọ p th ứ
h ai, m ã c sau k h i đ ư ợ c d ị c h ra sè tạ o th à n h m ã assem b ly h a y m ã m á y
th ô n g q u a trìn h b iê n d ị ch c . T ro n g c ả hai trư ờ n g hợ p , đ ầ u ra có th ể
k h ô n g h o à n c h ỉ n h v ì c h ư ơ n g trìn h th a m k h ả o tớ i cá c th ủ tụ c tro n g th ư
v iệ n c ò n c h ư a đ ư ợ c đ ị n h n g h ĩ a n h ư m ộ t p h ầ n củ a ch ư ơ n g trìn h . V í dụ
D a n h sách 1.1 th am ch iế u tớ i to á n tò « m à th ự c sự đ ư ợ c đ ị n h n g h ĩ a
tro n g m ộ t th ư v iệ n 1 0 riê n g b iệ t.
•
C u ố i cù n g , t r ì n h l i ê n k ế t h o à n tấ t m ã đ ố i tư ợ n g b ằ n g cách liê n k ế t nó vớ i
m ã đ ố i tư ợ n g c ủ a b ấ t k ỳ các m o d u le th ư v iệ n m à ch ư ơ n g trìn h đ ã th a m
k h ả o tớ i. K et q u ả cuố i c ù n g là m ộ t tậ p tin th ự c thi.
H ìn h 1.1
b iê n d ị c h
đ ơ n (n h ư
r a n g a y lậ
H ì n h 1 .1
m in h h ọ a các b ư ớ c trê n c h o cả h ai trìn h c h u y ế n đ ố i C + + v à trìn h
C + + . T h ự c tế th ì tấ t cả các b ư ớ c trê n đ ư ợ c triệ u g ọ i b ở i m ộ t lệ n h
là C Q v à n g ư ờ i d ù n g th ậ m ch í sẽ k h ô n g th ấ y các tậ p tin đ ư ợ c p h á t
p tứ c.
V i ệ c b iê n d ị c h C + +
c++
C++
TRANSLATOR
Program
17
►
C++
Program
_J7
c
►
c
►
Code
COMPILER
►
V
C++
NATIVE
COMPILER
1 .4 . B i ế n
B iế n là m ộ t tê n tư ợ n g trư n g ch o m ộ t v ù n g n h ớ m à d ữ liệ u có th ế đ ư ợ c lư u trữ
trên đ ó h a y là đ ư ợ c s ử d ụ n g lạ i. C ác b iế n đ ư ợ c sử d ụ n g đ ế g iữ các giá tri d ữ
liệ u v ì th ế m à c h ú n g có th ế đ ư ợ c d ù n g tro n g n h iề u tín h to án k h á c n h au tro n g
m ộ t c h ư ơ n g trìn h . T ấ t cả các b iế n có h ai th u ộ c tín h q u a n trọ ng:
•
đ ư ợ c th iế t lậ p k h i các b iế n đ ư ợ c đ ị n h n g h ĩ a (ví dụ n h ư : in teg er,
real, ch ara c te r). M ộ t k h i đ ã đ ư ợ c đ ị n h n g h ĩ a , k iể u củ a m ộ t b iế n C + +
k h ô n g th ể đ ư ợ c ch u y ể n đổ i.
K iế u
Chư ơ ng 1: Mở đầ u
4
•
có th ể đ ư ợ c c h u y ế n đ ố i b ằ n g c á c h g án m ộ t giá trị m ớ i ch o b iế n .
L o ạ i g iá trị củ a b iế n có th ể n h ậ n p h ụ th u ộ c v à o k iể u củ a nó. V í dụ , m ộ t
b iế n số n g u y ê n chỉ có th ể g iữ các g iá trị n g u y ê n (c h ắ n g h ạ n , 2, 100, -12).
G iá t r ị
D an h sách 1.2 m in h h ọ a sử d ụ n g m ộ t v à i b iế n đ o n giả n.
D a n h s á c h 1 .2
#mdude <iostream.h>
int main (void)
{
int
woikDays;
float workHoure, payRate, weeklyPay;
2
3
4
5
woikDays=5;
workHours _ 7.5;
payRate=38.55;
weeklyPay= woikDays * workHours * payRate;
cout« "Weekly Pay= " « w eeklyPay« V ;
6
7
8
9
10
11
C h ú g iả i
4
H à n g n à y đ ị n h n g h ĩ a m ộ t b iế n int (k iế u số n g u y ê n ) tên là workDays, b iế n
n à y đ ạ i d iệ n ch o số n g à y làm v iệ c tro n g tu ầ n . T h eo n h ư lu ậ t ch u n g , trư ớ c
tiê n m ộ t b iế n đ ư ợ c đ ị n h n g h ĩ a b à n g các h chi đ ị n h k i ể u c ủ a n ó , th e o sau
đ ó là tên b iế n v à cuố i c ù n g là đ ư ợ c k ế t th ú c b ở i dấ u ch ấ m
phấ y.
5
H à n g n à y đ ị n h n g h ĩ a b a b iế n float (k iế u số th ự c) lầ n lư ợ t th a y ch o số g iờ
là m v iệ c tro n g n g ày , số tiề n p h ả i trả h à n g g iờ , v à số tiề n p h ả i trả h à n g
tu ầ n . N h ư ch ú n g ta th ấ y ở h à n g n ày , n h iề u b iế n c ủ a cù n g k iế u có th ế đ ị n h
n g h ĩ a m ộ t lư ợ t q u a v iệ c d ù n g dấ u p h ấ y đ ế n g ă n các h chúng.
6
H à n g n à y là m ộ t câu lệ n h gán. N ó g án g iá trị 5 ch o b iế n workDays. V ì thế ,
sau k h i câu lệ n h n ày đ ư ợ c th ự c th i, workDays b iể u th ị g iá trị 5.
7
H à n g n à y g án g iá ứ ị 7.5 tớ i b iế n workHours.
8
H à n g n à y g án g iá trị 38.55 tớ i b iế n payRate.
9
H à n g n à y tín h to án số tiề n p h ả i trá h à n g tu ầ n từ các b iế n workDays,
workHours, v à payRate (* là to á n tử n h ân ). G iá trị k ế t q u ả đ ư ợ c lư u v ào
b iế n weeklyPay.
10-12
C ác h à n g n à y x u ấ t b a m ụ c tu ầ n tự là: ch u ồ i "Weekly Pay = ", g iá trị
củ a b iế n weeklyPay, v à m ộ t k ý tự x u ố n g dòng.
K h i ch ạ y , ch ư ơ n g trìn h sẽ ch o k ế t q u ả n h ư
sau:
Weekly Pay = 1445.625
K hi m ộ
ch o đ ế n k h i
trị k h ô n g đ ư
ch o m ộ t b iế
Chư ơ ng 1: Mở đầ u
t b iế n đư ợ c đ ị n h n g h ĩ a , g iá trị c ủ a nó k h ô n g đ ư ợ c đ ị n h n g h ĩ a
n ó đ ư ợ c gán ch o m ộ t g iá trị th ậ t sự . V í dụ , weeklyPay có m ộ t giá
ợ c đ ị n h n g h ĩ a ch o đ ế n k h i h à n g 9 đ ư ợ c t h ự c thi. V iệ c g án g iá trị
n ở lầ n đầ u tiê n đ ư ợ c g ọ i là k h ỏ i t ạ o . V iệ c chắ c c h ắ n rằ n g m ộ t
5
b iế n đ ư ợ c k h ở i tạ o tm ớ c k h i 11Ó đ ư ợ c sử
to á n n ào là rấ t q u a n trọ ng.
M ộ t b iế n có th ế
x e m n h ư là m ộ t th ó i
b iế n trư ớ c k h i nó đ ư
d an h sách 1.2 m à có
h ai ch ư ơ n g trìn h là tư
d ụ n g tro n g b ấ t k ỳ
c ô n g v iệ c tín h
đư ợ c đ ị n h n g h ĩ a v à k h ở i tạ o cù n g lú c. Đ iề u n à y đ ư ợ c
q u en lậ p trìn h tố t b ở i v ì n ó g ià n h trư ớ c k h ả n ă n g sử d ụ n g
ợ c k h ở i tạ o. D a n h sách 1.3 là m ộ t p h iên b ả n sử a lạ i củ a
sử d ụ n g k ỹ th u ậ t n ày . T ro n g m ọ i m ụ c đ ích k h ác n h au thì
ơ n g tư ơ n g .
D a n h s á c h 1 .3
1
#include <iostream.h>
2
3
4
5
int main (void)
{
int
woricDays=5;
float workHours=7.5;
float payRate=38.55;
float weeklyPay=woikDays*workHours* payRate;
6
7
8
9
10
cout« "Weekly Pay=";
cout« weeklyPay;
c o u t« \n ';
11
1 .5 . X u ấ t / n h ậ p đ ơ n g i ả n
C á c h c h u n g n h ấ t m à m ộ t c h ư ơ n g trìn h g ia o tiế p v ớ i th ế g iớ i b ê n n g o à i là
th ô n g q u a các th a o tác x u ấ t n h ậ p h ư ớ n g k ý tự đ ơ n giả n . C + + c u n g cấ p hai
to á n tử h ữ u d ụ n g ch o m ụ c đ íc h n à y là » ch o n h ậ p v à « cho x u ấ t. C h ú n g ta
đ ã th ấ y v í dụ c ủ a v iệ c sử d ụ n g to á n tử x u ấ t « rồ i. D an h sách 1.4 sê m in h
h ọ a th ê m ch o v iệ c sử d ụ n g to á n tử n h ậ p » .
D a n h s á c h 1 .4
1
#inelude <iostream.h>
2
3
4
5
int main (void)
{
int
woricDays=5;
float workHours=7.5;
float payRate,weeklyPay,
6
7
8
cout« "What is the hourly pay rate?
cin»payR ate;
9
weeklyPay= workDays * woricHours * payRate;
cout« "Weekly Pay=
cout« weeklyPay;
c o u t« W ;
10
11
12
13
Chư ơ ng 1: Mở đầ u
6
C h ú g iả i
7
H à n g n à y x u ấ t ra lờ i n h ắ c n h ở
n h ậ p củ a n g ư ờ i dùng.
8
H à n g n à y đ ọ c g iá trị n h ậ p đ ư ợ c g õ b ở i n g ư ờ i d ù n g v à sao c h é p g iá trị n à y
tó i b iế n payRatc. T o án tử n h ậ p » lấ y m ộ t d ò n g n h ậ p n h ư là to á n h ạ n g trái
(cán là d ò n g n h ậ p ch u ấ n c ủ a C + + m à tư ơ n g ứ n g v ớ i dữ liệ u đ ư ợ c n h ậ p
v à o từ b à n p h ím ) v à m ộ t b iế n (m à d ừ liệ u n h ậ p đ ư ợ c sao ch ép tớ i) n h ư là
to á n h ạ n g p h ả i.
9-13
W hat is the hourly pay rate? đ ể
tìm d ữ
liệ u
P h ầ n c ò n lạ i củ a c h ư ơ n g trìn h là n h ư trư ớ c.
K hi ch ạ y , c h ư ơ n g trìn h sè x u ấ t ra m à n h ìn h n h ư
d ù n g đ ư ợ c in đậ m );
sau (d ữ
liệ u n h ậ p c ủ a n g ư ờ i
What Lsthe hourly pay rate? 33.55
Weekly Pay = 1258.125
C ả h ai « v à » trả v ề to á n h ạ n g trái n h ư
n h iề u th a o tác n h ậ p h ay n h iề u th a o tác x u ấ t đ ư
Đ iề u n à y đ ư ợ c m in h h ọ a tro n g d a n h sách 1.5
cả số g iờ làm v iệ c m ỗ i n g ày v à số tiề n p h ả i trả
là k ế t q u á củ a ch ú n g , ch o p h ép
ợ c k ế t h ọ p tro n g m ộ t câu lệ nh.
v ớ i trư ờ n g hợ p ch o p h é p n h ậ p
m ỗ i giờ .
D a n h s á c h 1 .5
//include <iostream.h>
2
3
4
5
int m ain (void)
{
int
wotfcDays=5;
float workHouK, payRate, weeklyPay;
6
7
cout« "What are the work hours and the hourly pay rate?
cin » workHours » payRate;
weeklyPay= workDays * workHours * payRate;
8
cout« "Weekly Pay=" « weeklyPay « V ;
9
10 j ______________ ___ _________ ___ ______________
C h ú g iả i
7
H à n g n à y đ ọ c h ai g iá trị n h ậ p đ ư ợ c nliậ p
tư ơ n g ứ n g c h ú n g tớ i h ai b iế n workHours v à
tá c h b iệ t b ở i m ộ t k h ô n g g ia n trố n g (c h ắ n g
trắ n g h a y là các k ý tự tab ). C âu lệ n h n à y tư ơ
v ào từ n g ư ờ i d ù n g v à ch ép
payRale. H ai g iá trị cầ n đ ư ợ c
h ạ n , m ộ t h ay là n h iề u k h o ả n
n g đ ư ơ n g vớ i:
(cin » workHours)» payRale;
V ì k ế t q u ả củ a » là to á n h ạ n g trái, (c in » w o rk H o u rs) đị n h g iá ch o cin m à
sau đ ó đ ư ợ c sử dụ n g n h ư là to á n h ạ n g trái ch o to á n tử » k ế tiế p .
Chư ơ ng 1: Mở đầ u
7
9
H à n g xiày là k ế t quả c ủ a v iệ c k ế t h ợ p từ h à n g 10 đ ế n h àn g 12 tro n g danli
sách 1.4. N ó x u ấ t "Weekly Pay = ", th e o sau đ ó là g iá trị c ủ a b iế n
weeklyPay, v à c u ố i c ù n g là m ộ t k ý tự x u ố n g dò n g . C âu lệ n h n à y tư ơ n g
đ ư ơ n g vớ i:
((cout«
'Weekly Pay= " ) « weeklyPay)« Vi';
V ì k ế t q u ả củ a « là to á n h ạ n g trái, (cout« "Weekly Pay = ") đ ị n h g iá cho
cout m à sau đ ó đ ư ợ c sử d ụ n g n h ư là to á n h ạ n g trái củ a to án tử « k é tiế p .
K h i ch ạ y , ch ư ơ n g trìn h sẽ h iể n th ị n h ư
sau:
What are the work hours and the houriy pay rate? 75 33.55
Weekly Pay = 1258.125
1 .6 . C h ú t h í c h
C h ú th íc h th ư ờ n g là m ộ t đ o ạ n v ă n b ả n . N ó đ ư ợ c d ù n g đ ế g iả i th íc h m ộ t vài
k h ía c ạ n h c ủ a c h ư ơ n g trình. T rìn h b iê n d ị c h bở q u a h o à n to àn các ch ú th ích
tro n g ch ư ơ n g trìn h . T u y n h iê n các ch ú th íc h n à y là có ý n g h ĩ a v à đ ô i k h i là rấ t
q u a n trọ n g đ ố i v ớ i n g ư ờ i đ ọ c (n g ư ờ i x e m các m ã ch ư ơ n g trìn h có sẵ n ) v à
n g ư ờ i p h á t triể n p h ầ n m ề m . C + + c u n g cấ p h ai loạ i ch ú thích:
•
N h ữ n g g ì sau // (cho đ ế n k h i k ế t th ú c h à n g m à nó x u ấ t h iệ n ) đ ư ợ c x e m
n h ư là m ộ t ch ú thích.
•
N h ữ n g g ì đ ó n g n g o ặ c tro n g cặ p dấ u ỉ * v à */ đ ư ợ c x em n h ư
th ích .
D an h sách 1.6 m in h h ọ a v iệ c sử
là m ộ t ch ú
d ụ n g c ả hai h ìn h th ứ c này.
D a n h s á c h 1 .6
#inđude <iostream.h>
2 /* Chuong trinh nay tinh toan tong so tien phai tea hang tuan cho mot cong nhan đua tren tong so gio
3
4
5
6
7
8
9
lam viec va so tien phai tra moi gió. */
int main (void)
{
int
workDays=5;
//songay lam viec trongtuan
float workHours=7.5;
// so gio lam viec trong ngay
float payRate=33.50;
// so tien phai tra moi gio
float weeklyPay,
//tong so tien phai tra moi tuan
10
weeklyPay= workDays * workHours * payRate;
cout << "Weekly Pay - " « weeklyPay << V ;
11
12
13
}
C ác ch ú th íc h n ên đ ư ợ c sử d ụ n g đ ế tă n g cư ờ n g (k h ô n g p h ả i g â y trở n g ạ i)
v iệ c đ ọ c m ộ t ch ư ơ n g trình. M ộ t v ài đ iế m sau n ê n đ ư ợ c ch ú ý:
Chư ơ ng 1: Mở đầ u
8
•
C h ú th íc h n ê n dễ đọ c v à dỗ h iế u h ơ n sự g iả i th ícli th ô n g q u a m ã ch ư ơ n g
trìn h . T h à là k h ô n g có ch ú th íc h n à o cò n h ơ n có m ộ t chú th íc h p h ứ c tạ p
d ễ g â y lầ m lẫ n m ộ t c á c h k h ô n g c ầ n th iế t.
•
S ử d ụ n g q u á n h iề u ch ú th íc h có th ế d ẫ n đ ế n k h ó đọ c. M ộ t c h ư ơ n g trìn h
c h ứ a q u á n h iề u chú th íc h làm b ạ n k h ó có th ể th ấ y m ã th ì k h ô n g th ể n ào
đ ư ợ c x e m n h ư là m ộ t c h ư ơ n g trìn h dỗ đ ọ c v à dỗ hiế u.
•
V iệ c sử d ụ n g các tên m ô tả có ý n g h ĩ a ch o các b iế n v à các th ự c th ế k h ác
tro n g ch ư ơ n g trình, v à n h ữ n g ch ỗ th ụ t v à o c ủ a m ã có th ế là m g iả m đi
v iệ c sử d ụ n g ch ú th íc h m ộ t các h đ á n g k ế , v à c ũ n g g i ú p ch o lậ p trìn h v iê n
dỗ đ ọ c v à k iế m soát c h ư ơ n g trìn h .
1 .7 . B ộ
nhớ
M á y tín h sử d ụ n g b ộ n h ớ tru y x u ấ t n g ấ u n h iê n (R A M ) đ ể lư u trữ m ã ch ư ơ n g
trìn h th ự c th i v à d ữ liệ u m à ch ư ơ n g trìn h th ự c h iệ n . B ộ n h ớ n à y có th ể đ ư ợ c
x e m n h ư là m ộ t ch u ồ i tu ầ n tự các b i t n h ị p h â n (0 h o ặ c 1). T h ô n g th ư ờ n g , b ộ
n h ớ đ ư ợ c ch ia th à n h n h ữ n g n h ó m 8 b it liê n tiế p (g ọ i là b y t e ) . C ác b y te đ ư ợ c
đ ị n h v ị liê n tụ c. V ì th ế m ồ i b y te có th ế đ ư ợ c ch ỉ đ ị n h d uv n h ấ t b ở i đ ị a c h ỉ
(x em H ìn h 1.2).
H ì n h 1 .2
C á c b it v à c á c b y te tr o n g b ộ
nhóByte Address
1211
1212
1213
▼
1214
1215
1216
Byte
Byte
Byte
Byte
Byte
Byte
1
1
0
1
0
0
0
1217
Byte
1
Ẳ
Bit
T rìn h b iê n d ị c h C + + p h á t ra m ã có th ể th ự c th i m à sắ p x ế p cá c th ự c th ể
d ữ liệ u tớ i các v ị trí b ộ nhớ . V í dụ , đ ị n h n g h ĩ a b i ế n
int salary=65000;
làm ch o trìn h b iê n dị ch cấ p p h á t m ộ t v à i b y te c h o b iế n salary. So b y te cầ n
đ ư ợ c cấ p p h á t v à p h ư ơ n g th ứ c đ ư ợ c sử d ụ n g c h o v iệ c b iế u d iễ n n h ị p h â n củ a
số n g u y ê n p h ụ th u ộ c vào sự th i h à n h cụ th ể c ủ a C + + . T rìn h b iê n d ị c h sử
d ụ n g đ ị a chỉ c ủ a b y te đầ u tiê n củ a b iế n salary đ ư ợ c cấ p p h át đế th a m k h ả o tớ i
nó. V iệ c g án trê n làm ch o g iá trị 6 5 0 0 0 đ ư ợ c lư u trữ n h ư là m ộ t số n g u y ên
b ù h ai tro n g h ai b y te đ ư ợ c cấ p p h á t (x e m H ìn h 1.3).
H ìn h
1 .3
B iể u d iễ n c ủ a m ộ t s ố
Chư ơ ng 1: Mở đầ u
n g u y ên tr o n g b ộ
n h ó'.
9
1211
1212
1213
1214
Byte
Byte
Byte
10110011
1215
10110011
1216
Byte
1217
Byte
salary
m ộ t số
nguyên 2 byte ở đị a chỉ 1214
T ro n g k h i v iệ c biế u d iễ n n h ị p h â n c h ín h x ác củ a m ộ t h ạ n g m ụ c d ữ liệ u là
ít k h i đ ư ợ c các lậ p trìn h v iê n q u an tâ m tớ i th ì v iệ c tố c h ứ c c h u n g c ủ a b ộ n h ớ
v à sử d ụ n g các đ ị a chỉ đ ế th a m k h ả o tớ i các h ạ n g m ụ c dừ liệ u là rấ t q u an
trọ n g .
1 .8 . S ố
nguyên
có th ể đ ư ợ c đ ị n h n g h ĩ a là k iể u short, int, h ay
n h au là số int sử d ụ n g n h iề u h ơ n h o ặ c ít n h ấ t b ằ n g so b y te n h ư
v à m ộ t số long sử d ụ n g n h iề u h ơ n h o ặ c ít n h ấ t c ù n g số b y tc v ớ
dụ , trê n m á y tín h cá n h ân thì m ộ t so short sử d ụ n g 2 b y te , m ộ
b y tc , v à m ộ t số long là 4 b y te.
B iế n s ố
nguyên
long . C h ỉ k h ác
là m ộ t so short,
i m ộ t so int. V í
t sổ int cũ n g 2
short age=20;
int
salary=65000;
long price=4500000;
M ặ c đ ị n h , m ộ t b iế n số n g u y ê n đ ư ợ c g iả sử là có d ấ u (ch ắ n g h ạ n , có m ộ t
sự b iế u d iễ n d ấ u đ ể m à n ó có th ể b iế u d iễ n các g iá trị d ư ơ n g cũ n g n h ư là các
g iá trị âm ). T u y n h iê n , m ộ t sổ n g u y ê n có th ể đ ư ợ c đ ị n h n g h ĩ a là k h ô n g có dấ u
b ằ n g c á c h sử d ụ n g tò k h ó a unsigned tro n g đ ị n h n g h ĩ a củ a nó. T ừ k h ó a signed
c ũ n g đ ư ợ c ch o p h é p n h ư n g h ơ i d ư th ừ a.
unsigned short age=20;
unsigned int
salary=65000;
unsigned long price=4500000;
S ố n g u y ê n (ví d ụ , 1984) lu ô n lu ô n đ ư ợ c g iả
sử là k iể u int,trừ k h i có m ộ t
h ậ u tố L h o ặ c 1 th ì n ó đ ư ợ c h iể u là k iể u long. M ộ t số n g u y ên cũ n g có th ể đ ư ợ c
đ ặ c tả sử d ụ n g h ậ u tố là u h o ặ c u., v í dụ :
1984L
1 .9 . S ố
19841
1984U
1984u
1984LU
1984ul
th ư c
B i ế n số t h ự c có th ể đư ợ c đ ị n h n g h ĩ a là k iể u float h a y double. K i ể u d o u b le sử
d ụ n g n h iề u b y te h ơ n v à v ì th ế ch o m iề n lớ n h ơ n v à ch ín h x ác h ơ n đ ể b iể u
d iễ n các số th ự c. V í dụ , trê n các m á y tín h c á n h â n m ộ t so float sử d ụ n g 4 b y te
v à m ộ t so double sử d ụ n g 8 b y te.
Chư ơ ng 1: Mở đầ u
10
float interestRate=0.06;
double
p i=3.141592654;
S ố t h ự c (v í d ụ , 0.06) luôn lu ô n đ ư ợ c g iả sử là k iể u double, trừ p h i có m ộ t h ậ u
tố F h a y f th ì nó đ ư ợ c h iể u là k iế u float, h o ặ c m ộ t h ậ u tố L h a y 1 th ì n ó đ ư ợ c
h iể u là k iể u long double. K iể u long double sử d ụ n g n h iề u b y te hom k iể u double
ch o đ ộ c h ín h x á c tố t hơ n (ví dụ , 10 b y te trê n các m á y P C ). V í dụ :
0.06F
0.06f3.141592654L
3.1415926541
C ác số th ự c c ũ n g có th ế đ ư ợ c b iế u d iễ n th e o c á c h k ý hiệ u h ó a k h o a họ c.
V í dụ , 0 .0 0 2 1 6 4 có th ế đ ư ợ c v iế t th e o các h k ỷ h iệ u h ó a k h o a h ọ c n h ư sau:
2.164E-3
or
2.164e-3
K ý tự E (h a y e) th a y cho số mũ
th ô n g d ị c h n h ư sau:
(ex p o n e n t). C á c h k ý h iệ u h ó a k h o a h ọ c đ ư ợ c
2.164E-3= 2.164 X 10r3 = 0.002164
l.lO .K ý tự
k ý t ự đ ư ợ c đ ị n h n g h ĩ a là k iể u char. M ộ t b iế n k ý tự ch iế m m ộ t b y te đ ơ n
đ ế lư u g iữ mã ch o k ỷ tự . M ã n à y là m ộ t g iá trị số v à p h ụ th u ộ c hệ thong mã
ký tự đ a n g đ ư ợ c d ù n g (n g h ĩ a là p h ụ th u ộ c m áy ). H ệ th ố n g c h u n g n h ấ t là
A S C II (A m e ric a n S tan d ard C o d e fo r In fo rm a tio n In terc h an g e). V í dụ , k ý tự A
có m ã A S C II là 65, v à ký tự a có m ã A S C II là 97.
B iế n
char ch = 'A ';
G iố n g n h ư số n g u y ên , b iế n k ỷ tự có th ế đ ư ợ c chì đ ị n h là có d ấ u h o ặ c
k h ô n g dấ u . M ặ c đ ị n h (tro n g h ầ u h ế t các h ệ th ố n g ) char n g h ĩ a là signed char.
T u y n h iê n , trê n v à i h ệ th ố n g th ì nó có n g h ĩ a là uns igned char. B iế n k ỷ tự có dấ u
có th ế g iữ g iá trị số tro n g m iề n g iá trị từ -1 2 8 tớ i 127. B iế n k ý tự k h ô n g dấ u
có th ể g iữ g iá trị số tro n g m iề n g iá trị từ 0 tớ 2 5 5 . K e t q u ả là, c ả hai th ư ờ n g
đ ư ợ c d ù n g đ ể b iể u d iễ n các số n g u y ê n n h ỏ tro n g ch ư ơ n g trình (v à có th ế đ ư ợ c
đ á n h d ấ u các g iá trị số n h ư là số n g u y ên ):
signed char
unsigned char
offset= -8 8 ;
row =2, column=26;
K ý t ự đ ư ợ c v iế t b ằ n g cá c h đ ó n g d ấ u k ý tự g iữ a cặ p n h áy đ ơ n (ví d ụ , 'A').
C ác k ý tự m à k h ô n g thể in ra đ ư ợ c b iể u d iễ n b ằ n g v iệ c sử d ụ n g các m ã
escap e . V í dụ :
'\n'
V
Chư ơ ng 1: Mở đầ u
// x u ố n g h àn g m ớ i
// p h ím x u ố n g d ò n g
'\t'
'\v '
'\b '
// p h ím tab n g an g
// p h ím tab dọ c
/ / p h í m lùi
C ác d ấ u n h á y đ ơ n , n h áy đ ô i v à k ý tự
h iệ u escape:
'V'
'V"
'\Y
g ạ ch c h éo n g ư ợ c cũ n g có th ể sử
dụ ng ký
// tríc h dẫ n đ ơ n (')
// tríc h dẫ n đ ô i (")
// d ấ u v ạ ch c h éo n g ư ợ c (\)
K ý tự cũ n g có th ể đ ư ợ c chỉ đ ị n h rõ sử d ụ n g g iá trị m ã số c ủ a ch ú n g . M ã
e s c a p e tố n g q u át \ooo (n g h ĩ a là, 3 k ý tự số cơ số 8 th e o sau m ộ t d ấ u g ạ c h ch éo
n g ư ợ c ) đ ư ợ c sử d ụ n g cho m ụ c đ íc h này. V í dụ (g iả sử A S C II):
'\1 2 '
M I'
M O I'
'\0'
// h à n g m ớ i (m ã th ậ p p h â n = 1 0 )
// tab n g an g (m ã th ậ p p h â n = 9)
// 'A ' (m ã th ậ p p h â n = 65)
// rồ n g (m ã th ậ p p h â n = 0)
l.ll.C h u S ỉ
C h u ồ i là m ộ t d ã y liê n tiế p các k ý tự đ ư ợ c k ế t th ú c
c h u ỗ i đ ư ợ c đ ị n h n g h ĩ a k iể u char* (n g h ĩ a là, co n trỏ
ch ỉ là m ộ t v ị trí tro n g bộ n h ớ . (C ác co n trỏ sẽ đ ư ợ c
V ì th ế b iế n ch u ỗ i c h ứ a đ ự n g đ ị a c h ỉ c ủ a k ý tự đ ầ
x e m x é t đ ị n h n g h ĩa :
b ằ n g m ộ t k ý tự n u ll. B i ế n
k ý tự ). C o n trỏ đ o n g iả n
th ả o lu ậ n tro n g ch ư ơ n g 5).
u tiê n tro n g ch u ồ i. V í dụ ,
char * s t r = "HELLO";
H ìn h 1.4 m in h h ọ a b iế n c h u ồ i v à c h u ồ i "HELLO" có th ể x u ấ t h iệ n n h ư
tro n g b ộ nhớ .
H ì n h 1 .4
C h u ỗ i v à b iế n c h u ỗ i t r o n g b ộ
1207
1208
1209
1212
1210
1211
ị
th ế nào
nhó'
1212
1213
1214
1215
1216
1217
'H'
' E'
' L'
' L'
'O'
•V0'
1218
str
C h u ỗ i đ ư ợ c v iế t b ằ n g các h đ ó n g n g o ặ c các k ý tự c ủ a n ó b ên tro n g cặ p
d ấ u n h á y k ép (ví dụ , "HELLO"). T rìn h b iê n d ị c h lu ô n lu ô n th ê m v à o m ộ t k ý tự
n u ll tớ i m ộ t h ằ n g chuồ i đ ể đ á n h dấ u đ iế m k ế t th ú c. C ác ký tự c h u ồ i có th ế
đ ư ợ c đ ặ c tả sử d ụ n g b ấ t k ỳ k ý h iệ u n ào d ù n g đ ế đ ặ c tả các ký tự . V í dụ :
"Name\tAddress'íTelephone''
"ASCÍI character65: \101"
Chư ơ ng 1: Mở đầ u
//các từ phân cách
//'A 'đuọ cđặ ctả như '10r
12
C h u ỗ i d ài có th ế nớ i rộ n g q u a k h ỏ i m ộ t h à n g đ ơ n , tro n g trư ờ n g h ợ p n ày
th ì m ồ i h à n g trư ớ c p h ả i đ ư ợ c k ế t th ú c b ằ n g m ộ t d ấ u v ạ c h chéo n g ư ợ c. V í dụ :
"Example to show \
the use of backslash for \
writing a long string"
D ấ u \ tro n g n g ữ c ả n h này có n g h ĩ a là p h ầ n cò n lạ i c ủ a ch u ỗ i đ ư ợ c tiế p tụ c
trê n h à n g k ế tiế p . C h u ỗ i trê n tư ơ n g đ ư ơ n g v ó i c h u ỗ i đ ư ợ c v iế t trê n h à n g đ ơ n
n h ư sau:
"Example to show the use of backslash for writing a long string"
M ộ t lồ i lậ p trìn h ch u n g th ư ờ n g x ả y
m ộ t ch u ỗ i k ý tự đ ơ n (ví d ụ , "A") v ớ i m ộ t
k h ô n g tư ơ n g đ ư ơ n g . C h u ỗ i k ý tự đ ơ n g ồ
k ý tự \ơ ),tro n g k h i k ý tự đ ơ n g ồ m c h ỉ m ộ
ra là lậ p trìn h v iê n th ư ờ n g n h ầ m lẫ n
k ý tự đ ơ n (ví dụ , 'Ả '). H ai đ iề u n à y là
m 2 b y te (k ý tự 'A' đ ư ợ c th e o sau là
t b y te d u y nhấ t.
C h u ồ i n g ắ n n h ấ t có th ế có là ch u ồ i rỗ n g ("") ch ỉ ch ứ a ký tự null.
1 . 1 2 .T ê n
N g ô n n g ữ lậ p trìn h sử d ụ n g tê n đ ề th a m k h ả o tớ i các th ự c thế k h ác n h a u d ù n g
đ ể tạ o ra ch ư ơ n g trìn h . C h ú n g ta c ũ n g đ ã th ấ y các v í dụ củ a m ộ t loạ i các tên
(n g h ĩ a là tên b iế n ) n h ư thế . C ác lo ạ i k h á c gồ m : tê n hàm , tê n k iế u , v à tên
m a cro .
S ử d ụ n g tê n rấ t tiệ n lợ i ch o v iệ c lậ p trìn h , n ó ch o p h ép lậ p trìn h v iê n tổ
c h ứ c d ữ liệ u th e o c á c h th ứ c m à c o n n g ư ờ i có th ể h iể u đư ợ c. T ê n k h ô n g đ ư ợ c
đ ư a v à o m ã có th ể thự c th i đ ư ợ c tạ o ra b ở i trìn h b iê n dị ch. V í dụ , m ộ t b iế n
temperature cu ố i c ù n g trở th à n h m ộ t v à i b y te b ộ n h ớ m à đ ư ợ c th a m k h ả o tớ i
b ở i các m ã có th ế th ự c thi th ô n g q u a đ ị a chỉ củ a n ó (k h ô n g th ô n g q u a tê n củ a
nó).
C + + áp đ ặ t n h ữ n g luậ t sau đ ế x â y d ự n g các tê n h ợ p lệ (cũ n g đ ư ợ c g ọ i là
các đ ị n h d a n h ) . M ộ t tên c h ứ a m ộ t h a y n h iề u k ý tự , m ồ i ký tự có th ể là m ộ t
c h ữ cái (n g h ĩ a là, 'A '-'Z ' v à 'a'-'z'), m ộ t số (n g h ĩ a là, '0 '-'9 '), h o ặ c m ộ t k ý tự
g ạ ch d ư ớ i
n g o ạ i trừ k ý tự đ ầ u tiê n k h ô n g th ề là m ộ t số . C ác k ý tự v iế t
h o a v à v iế t th ư ờ n g là k h ác n h a u .V í dụ :
salary
salaiy2
Zsalary
_salary
Salary
Chư ơ ng 1: Mở đầ u
//đị nh danh họ p lệ
// đị nh danh họ p lệ
//đị nh danh không họ p lệ (bắ t đàu vớ i mộ t số )
// đị nh danh họ p lệ
// họ p lệ nhung khác vói salary
13
c + + k liô n g có g iớ i h ạ n số k ý tự c ủ a m ộ t đ ị n h d an h . T u y n h iê n , h ầ u h ế t
th i cô n g lạ i áp đ ặ t sự giớ i h ạ n n à y n h ư n g th ư ờ n g đủ lớ n đế k h ô n g g â y b ậ n
tâ m ch o các lậ p trìn h v iê n (ví dụ 25 5 k ý tự ).
M ộ t số từ đ ư ợ c g iữ b ở i c + + ch o m ộ t số m ụ c đ íc h riên g v à k h ô n g th ế
đ ư ợ c d ù n g c h o các đ ị n h d an h . N h ữ n g từ n à y đ ư ợ c g ọ i là t ừ k h ó a (k ey w o rd )
v à đ ư ợ c tổ n g k ế t tro n g b ả n g 1.3:
B ả n g 1.3
C á c từ
khóa c+ + .
asm
continue
float
new
signed
try
auto
default
for
operator
sizeof
typedef
break
delete
friend
private
static
union
case
do
goto
protected
struct
unsigned
catch
double
if
public
switch
virtual
char
else
inline
register
template
void
class
enum
int
return
this
volatile
const
extern
long
short
throw
while
B à i tậ p c u ố i c h ư ơ n g 1
1.1
V iế t ch ư ơ n g trìn h ch o p h ép n h ậ p v ào m ộ t số đo n h iệ t đ ộ theo đ ộ F a h re n h e it
v à x u ấ t ra n h iệ t đ ộ tư ơ n g đ ư ơ n g cú a n ó th e o độ C elsiu s, sứ d ụ n g c ô n g th ứ c
ch u y ế n đổ i:
° C = - ( ° F - 32)
9
B iê n d ị c h v à c h ạ y ch ư ơ n g trìn h . V iệ c th ự c h iệ n củ a n ó g iố n g n h ư th ế này:
Nhiet do theo do Fahrenheit: 41
41 do Fahrenheit= 5 do Celsius
1.2
H à n g n à o tro n g các h àn g sau b iế u d iễ n v iệ c đ ị n h n g h ĩ a b iế n là k h ô n g h ợ p lệ ?
int n = -1 0 0 ;
unsigned in ti—-100;
signed in t=2.9;
lo n g m = 2 ,p = 4 ;
mt 2k;
double x = 2 * m ;
flo a ty = y * 2 ;
unsigned double z =0.0;
double d = 0.67F ;
float Í-0 .5 2 L ;
signed char=-1786;
charc = '$ '+ 2 ;
sign char h = M i l ';
Chư ơ ng 1: Mở đầ u
14
char *name = "Peter Pan'';
unsigned char *num = "276811";
1.3
C ác đ ị n h d an h n ào sau đ ây là k h ô n g h ợ p lệ ?
identifier
scvcn_l 1
_uniqụ e_
gross-incomc
gross$income
2by2
default
avcragc_wcight_of_a_largc_pizza
variable
object-oriented
1.4
Đ ị n h n g h ĩ a các b iế n đ ể biế u d iễ n các m ụ c sau đâ y:
•
T u ổ i c ủ a m ộ t ngư ờ i.
•
T h u n h ậ p c ủ a m ộ t n h â n v iên .
•
S ố từ tro n g m ộ t từ điể n.
•
M ộ t k ý tự
•
M ộ t th ô n g đ iệ p ch ú c m ừ n g .
Chư ơ ng 1: Mở đầ u
alp h ab et.
15
C h ư ơ n g 2 . B iể u t h ứ c
C h ư ơ n g n à y g iớ i th iệ u c á c to á n tử x â y d ự n g sẵ n c h o v iệ c so ạ n th ả o c á c b iể u
th ứ c . M ộ t b iể u th ứ c là b ấ t k ỳ sự tín h to á n n à o m à ch o ra m ộ t g iá trị .
K h i th ả o lu ậ n v ề các b iể u th ứ c , c h ú n g ta th ư ờ n g sử d ụ n g th u ậ t n g ữ ư ớ c
lư ợ n g . V í d ụ , c h ú n g ta n ó i rằ n g m ộ t b iể u th ứ c ư ớ c lư ợ n g m ộ t g iá trị n à o đ ó .
T h ư ờ n g th ì g iá trị sau c ù n g ch ỉ là lỵ d o c h o v iệ c ư ớ c lư ợ n g b iế u th ứ c . T u y
n h iê n , tro n g m ộ t v à i trư ờ n g h ợ p , b iể u th ứ c c ũ n g c ó th ế ch o các k ế t q u ả p h ụ .
C á c k ế t q u ả n à y là sự th a y đ ố i lâu dài tro n g trạ n g th á i củ a c h ư ơ n g trìn h .
T ro n g trư ờ n g h ợ p n à y , các b iế u th ứ c c++ th ì k h á c v ớ i c á c b iế u th ứ c to á n h ọ c.
C + + c u n g c ấ p c á c to á n tử ch o v iệ c so ạ n th ả o các b iể u th ứ c to á n h ọ c ,
q u a n h ệ , lu ậ n lý , trê n b it, v à đ iề u k iệ n . N ó c ũ n g c u n g c ấ p các to á n tử ch o ra
c á c k ế t q u ả p h ụ h ữ u d ụ n g n h ư là g á n , tă n g , v à g iả m . C h ú n g ta sẽ x e m x é t lầ n
lư ợ t từ n g lo ạ i to á n tử . C h ú n g ta c ũ n g sẽ th ả o lu ậ n v ề c á c lu ậ t ư u tiê n m à ả n h
h ư ở n g đ ế n th ứ tự ư ớ c lư ợ n g c ủ a c á c to á n tử tro n g m ộ t b iế u th ứ c c ó n h iề u
to á n tứ .
2 .1 . T o á n t ử
c++
to á n h o c
c u n g c ấ p 5 to á n tử
to á n h ọ c c ơ
b ả n . C h ú n g đ ư ợ c tổ n g k ế t tro n g B ả n g
2 . 1.
B ả n g 2 .1
C á c toá n tử
T o án tử
+
to á n h ọ c.
T ên
Cộ ng
Ví dụ
1 2 + 4 .9 //c h o 16.9
T rừ
3 .9 8 - 4
/ / c h o -0.02
*
N h ân
2 * 3 .4
//c h o 6.8
/
C hia
9 / 2 .0
//c h o 4.5
%
L ấ y phầ n dư
-
13% 3
//c h o i
N g o ạ i trừ to á n tử lấ y p h ầ n d ư (% ) th ì tấ t c ả c á c to á n tử to á n h ọ c c ó th ế
c h ấ p n h ậ n p h a trộ n các to á n h ạ n g số n g u y ê n v à to á n h ạ n g số th ự c . T h ô n g
th ư ờ n g , n ế u cả h a i to á n h ạ n g là số n g u y ê n sau đ ó k ế t q u ả sẽ là m ộ t số
Chư ơ ng 2: Biể u thứ c
17
n g u y ê n . T u y n h iê n , m ộ t h o ặ c cả h ai to á n h ạ n g là số th ự c th ì sau đ ó k ế t q u ả sẽ
là m ộ t số th ự c (re a l h a y d o u b le ).
K h i c ả h a i to á n h ạ n g c ủ a to á n tử c h ia là số n g u y ê n thì sau đ ó p h é p c h ia
đ ư ợ c th ự c h iệ n n h ư là m ộ t p h é p c h ia số n g u y ê n v à k h ô n g p h ả i là p h é p c h ia
th ô n g th ư ờ n g m à c h ú n g ta s ử d ụ n g . P h é p c h ia số n g u y ê n lu ô n c h o k ế t q u ả
n g u y ê n (c ó n g h ĩ a là lu ô n đ ư ợ c là m trò n ). V í dụ :
9 /2
-9 /2
//đ ư ợ c 4 , không phả i là 4.5!
//đ ư ợ c -5, kh ôn g ph ả i là -4!
C á c p h é p c h ia số n g u y ê n k h ô n g x á c đ ị n h th ư ờ n g là các lỗ i lậ p trìn h
c h u n « . Đ ế th u đ ư ợ c m ộ t p h é p c h ia số th ự c k h i c ả h a i to á n h ạ n g là số n g u y ê n ,
b ạ n c ầ n ép m ộ t tro n g h ai số n g u y ê n v ề số th ự c:
int
int
co st= 10 0 ;
v olu m e= 80 ;
doub le
un itP rice= cost / (double) volu m e;
//đ ư ợ c 1.25
T o á n tử lấ y p h ầ n d ư (% ) y ê u c ầ u cả h a i to á n h ạ n g là số n g u y ê n . N ó trả v ề
p h ầ n d ư c ò n lạ i c ủ a p h é p ch ia. V í dụ 13%3 đ ư ợ c tín h to á n b ằ n g c á c h c h ia số
n g u y ê n 13 đi 3 đ ế đ ư ợ c 4 v à p h ầ n d ư là 1; v ì th ế k ế t q u ả là 1.
C ó th ế có trư ờ n g h ợ p m ộ t k ế t q u ả c ủ a m ộ t p h é p to á n to á n h ọ c q u á lớ n đ ế
lư u trữ tro n g m ộ t b iế n n ào đ ó . T rư ờ n g h ợ p n à y đ ư ợ c g ọ i là t r à n . H ậ u q u ả c ủ a
trà n là p h ụ th u ộ c v à o m á y v ì th ế n ó k h ô n g đ ư ợ c đ ị n h n g h ĩ a .V í dụ :
u â sig n e d c h a r
k=10*92;
//tràn : 92 0 > 2 5 5
C h ia m ộ t số c h o 0 là h o à n to à n k h ô n g đ ú n g lu ậ t. K e t q u ả c ủ a p h é p c h ia
n à y là m ộ t lỗ i ru n -tim e g ọ i là lỗ i division-by-zero th ư ờ n g là m ch o c h ư ơ n g
trìn h k ế t th ú c .
2 .2 . T o á n t ử
q u an hệ
c++ c u n g
c ấ p 6 to á n tử q u a n h ệ đ ể so sá n h c á c số . C ác to á n tử n à y đ ư ợ c tố n g
k ế t tro n g B ả n g 2 .2 . C ác to á n từ q u a n h ệ ư ớ c lư ợ n g v ề 1 (th a y c h o k ế t q u ả
đ ú n g ) h o ặ c 0 (th a y c h o k ế t q u ả sai).
B ả n g 2 .2
C á c toá n tử
T o án tử
=
quan hệ .
T ên
So sán h b ăn g
Ví du
5 = 5
//c h o i
Ị=
So sán h k h ô n g b ă n g
5 != 5
<
So sán h h ỏ h ơ n
5 < 5 .5
So sán h h ỏ h ơ n h o ặ c b ăn g
5<=5
So sán h lớ n hơ n
5 > 5 .5
So sán h lớ n hơ n h o ặ c b ăn g
6 .3 > = 5 / / c h o i
<=
>
>=
Chư ơ ng 2: Biể u thứ c
//c h o O
//c h o i
//c h o i
// ch o 0
18
C h ú ý rằ n g c á c to á n tử <= v à >= c h ỉ đ ư ợ c h ỗ trợ tro n g h ìn h tliứ c h iể n th ị .
N ó i riê n g cả h a i =< v à => đ ề u k h ô n g h ợ p lệ v à k h ô n g m a n g ý n g h ĩ a g ì cả .
C á c to á n h ạ n g c ủ a m ộ t to á n tử q u a n h ệ p h ả i ư ớ c lư ợ n g v ề m ộ t số . C á c k ý
tự là c á c to á n h ạ n g h ợ p lệ v ì c h ú n g đ ư ợ c đ ạ i d iệ n b ở i các g iá trị số . V í d ụ (g iả
sử m ã A S C II):
'A '< F
//đ ư ọ c 1 (giố ng n h ư là 65 < 7 0 )
C á c to á n tử q u a n hệ k h ô n g n ê n đ ư ợ c d ù n g đ ế so s á n h c h u ồ i b ở i v ì đ iề u
n à y sẽ d ẫ n đ ế n các đị a chỉ c ủ a c h u ồ i đ ư ợ c so sá n h c h ứ k h ô n g p h ả i là n ộ i d u n g
c h u ồ i. V í d ụ , b iế u th ứ c
"HELLO" <"BYE"
là m c h o đ ị a ch ỉ c ủ a c h u ồ i "HELLO" đ ư ợ c so sá n h v ớ i đ ị a chi c ủ a c h u ỗ i "BYE".
V ì c á c đ ị a c h ỉ n à y đ ư ợ c x á c đ ị n h b ở i trìn h b iê n d ị c h , k ế t q u ả c ó th ế là 0 h o ặ c
có th ể là 1, c h o n ê n c h ú n g ta có th ế n ó i k ế t q u ả
là k h ô n g đ ư ợ c đ ị n h n g h ĩ a .
C + + c u n g cấ p các th ư
ch u ồ i.
2 .3 . T o á n t ử
v iệ n h à m
(v í d ụ , strcmp) đ ể
th ự c h iệ n
so sá n h
lu ậ n lý
C + + c u n g cấ p b a to á n tử lu ậ n lý c h o v iệ c k ế t n ố i các b iế u th ứ c lu ậ n lý. C ác
to á n tử n à y đ ư ợ c tổ n g k ế t tro n g B ả n g 2.3. G iố n g n h ư c á c to á n tử q u a n h ệ , các
to á n tử lu ậ n lý ư ớ c lư ợ n g tớ i 0 h o ặ c 1.
B ả n g 2 .3
C á c toá n tử
lu ậ n lý .
T o án tử
Ị
&&
II
T ên
Phủ
đ ị n h lu ậ n lý
V í du
1(5 — 5)
// đ ư ợ c 0
V à lu ậ n lý
5 < 6 && 6 < 6
// đ ư ợ c 0
H o ặ c lu ậ n lý
5 < 6 II 6 < 5
// đư ợ c 1
Phủ đị nh luậ n lỷ là m ộ t to á n tử đ ơ n h ạ n g c h ỉ p h ủ đ ị n h g iá trị lu ậ n lý to á n
h ạ n g đ o n c ủ a n ó . N e u to á n h ạ n g c ủ a n ó k h ô n g là 0 th ì đ ư ợ c 0, v à n ế u n ó là
k h ô n g th ì đ ư ợ c 1.
V à lu ậ n lý ch o k ế t q u ả 0 n ế u m ộ t h a y cả h a i to á n h ạ n g c ủ a n ó ư ớ c lư ợ n g
tớ i 0. N g ư ợ c lạ i, n ó ch o k ế t q u ả 1. H o ặ c lu ậ n lý c h o k ế t q u a 0 n ế u c ả h a i to á n
h ạ n g c ủ a n ó ư ớ c lư ợ n g tớ i 0. N g ư ợ c lạ i, n ó c h o k ế t q u ả 1.
C h ú ý rằ n g ở đ â y c h ú n g ta n ó i c á c to á n h ạ n g là 0 v à k h ác 0. N ó i c h u n g ,
b ấ t k ỳ g iá trị k h ô n g là 0 n à o có th ể đ ư ợ c d ù n g đ ế đ ạ i d iệ n ch o đ ú n g (tru e ),
tro n g k h i ch i có g iá trị 0 là đ ạ i d iệ n c h o sai (fa lse ). T u y n h iê n , tấ t cả c á c h à n g
sau đ â y là các b iể u th ứ c lu ậ n lý h ọ p lệ :
Chư ơ ng 2: Biể u thứ c
19
!20
10 & & 5
1 0 II 5.5
10& & 0
//đ ư ợ c O
//đ u ợ c l
//đ u ọ c 1
//đ ư ợ c O
C + + k h ô n g c ó k iể u b o o le a n x â y d ự n g sẵ n . V ì lẽ đ ó m à ta có th ế s ử
k iế u in t c h o m ụ c đ íc h n ày . V í dụ :
int
sorted= 0 ;
int
balanced = 1;
2 .4 . T o á n t ử
//false
// true
t r ê n b it
C + + c u n g c ấ p 6 to á n tử trê n b it đ e đ iề u k h iể n các b it riên g lẻ
lư ợ n g số n g u y ê n . C h ú n g đ ư ợ c tố n g k ế t tro n g B ả n g 2.4 .
B ả n g 2 .4
C á c toá n tử
T o án tử
dụ ng
tro n g m ộ t số
t r ê n b it.
~
T ên
Ph ủ đ ị n h b it
&
V à b it
A
H o ặ c ex clu siv e b it
«
D ị ch trái b it
w
»
D ị ch phả i b it
N 0 1 1 '» 2
H oặ c b it
V í du
~ \0 1 1 '
//đuocMÚS
w & \0 2 7
//đ ư ợ c W
W IN 0 2 7
// đ ư ơ c \02>T
W
// đ ư ợ c ‘\036’
A \0 2 7
« 2
//đ ư ơ c ‘\044’
//đ ư o c ’\002'
C á c to á n tử trê n b it m o n g đ ợ i c á c to á n h ạ n g c ủ a c h ú n g là c á c số n g u y ê n
v à x e m c h ú n g n h ư là m ộ t c h u ồ i c á c b it. Phủ đị nh bit là m ộ t to á n tử đ o n h ạ n g
th ự c h iệ n đ ả o c á c b it tro n g to á n h ạ n g c ủ a n ó . Và bit so sá n h c á c b it tư ơ n g ứ n g
c ủ a các to á n h ạ n g củ a nó v à c h o k ế t q u ả là 1 k h i cả h a i b it là 1, n g ư ợ c lạ i là 0.
Hoặ c bit so sá n h các b it tư ơ n g ứ n g c ủ a c á c to á n h ạ n g c ủ a nó v à c h o k ế t q u ả là
0 k h i c ả h a i b it là 0, n g ư ợ c lạ i là 1. XOR bit so sá n h c á c b it tư ơ n g ứ n g c ủ a
các to á n h ạ n g c ủ a n ó v à c h o k ế t q u ả 0 k h i c ả h a i b it là 1 h o ặ c c ả h ai b it là 0,
n g ư ợ c lạ i là 1.
C ả h a i to á n tử dị ch trái bit v à dị ch phả i bit lấ y m ộ t ch u ỗ i b it là m to á n
h ạ n g trá i c ủ a c h ú n g v à m ộ t số n g u y ê n d ư ơ n g n là m to á n h ạ n g p h ả i. T o á n tử
d ị c h trá i c h o k ế t q u ả là m ộ t c h u ỗ i b it sa u k h i th ự c h iệ n d ị c h n b it tro n g c h u ồ i
b it c ủ a to á n h ạ n g trá i v ề p h ía trái. T o á n tử d ị c h p h ả i c h o k ế t q u ả là m ộ t c h u ỗ i
b it sau k h i th ự c h iệ n d ị c h n b it tro n g c h u ỗ i b it c ủ a to á n h ạ n g trá i v ề p h ía p h ả i.
C á c b it trố n g sau k h i d ị ch đ ư ợ c đ ặ t tớ i 0.
B ả n g 2 .5 m in h h ọ a c h u ỗ i c á c b it ch o c á c to á n h ạ n g v í dụ v à k ế t q u ả tro n g
B ả n g 2.4. Đ ế trá n h lo lắ n g v ề b it d ấ u (đ iề u n à y p h ụ th u ộ c v à o m á y ) th ư ờ n g
th ì k h a i b á o c h u ồ i b it n h ư là m ộ t số k h ô n g d ấ u :
unsigned c h a r x = l\01 ĩ ;
unsigned c h a r y =*'027;
Chư ơ ng 2: Biể u thứ c
20
B ả n g 2.5
C á c b ít đ ư ọ c tín h to á n n h ư
V í dụ
th ế
nào.
G iá t r i c ơ số 8
C h u ỗ i b it
X
011
0
0
0
0
1
0
0
1
y
027
0
0
0
I
0
1
1
1
~x
366
1
1
1
1
0
1
1
0
x & y
001
0
0
0
0
0
0
0
1
X y
037
0
0
0
I
1
1
1
1
x Ay
036
0
0
0
1
1
1
1
0
x « 2
044
0
0
1
0
0
1
0
0
x » 2
002
0
0
0
0
0
0
1
0
2 .5 . T o á n t ử
tă n g /g iả m
C á c to á n tử tăng mộ t (+ + ) v à giả m mộ t (--) c u n g c ấ p c á c tiệ n lợ i tư ơ n g ứ n g
ch o v iệ c c ộ n g th ê m 1 v ào m ộ t b iế n số h a y trừ đ i 1 từ m ộ t b iế n số . C á c to á n tử
n à y đ ư ợ c tổ n g k ế t tro n g B ả n g 2 .6 . C á c v í dụ g iả sử đ ã đ ị n h n g h ĩ a b iế n sau :
int
B ả n g 2 .6
k=5;
C á c toá n tử
T o án tử
t ă n g v à g iả m .
++
T ên
T ă n g m ộ t (tiê n tô )
-H -k + 1 0
V í du
++
T ă n g m ộ t (h ậ u tô )
k + + + 10
//đ ư ơ c 15
—
G iả m m ộ t (tiên tô )
-k + 1 0
//đư ơ c 14
—
G iả m m ộ t (h ậ u tô )
k -+ 1 0
//đ ư ợ c 15
//đ ư ơ c 16
C ả h ai to á n tử có th ể đ ư ợ c sử d ụ n g th e o h ìn h th ứ c ti ề n tố h a y h ậ u tố là
h o à n to à n k h á c n h a u . K hi đ ư ợ c sử d ụ n g th e o h ìn h th ứ c tiề n tố th ì to á n tò
đ ư ợ c áp d ụ n g trư ớ c v à k ế t q u ả sau đ ó đ ư ợ c sử d ụ n g tro n g b iể u th ứ c. K h i
đ ư ợ c sử d ụ n g th e o h ìn h th ứ c h ậ u tố th ì b iể u th ứ c đ ư ợ c ư ớ c lư ợ n g trư ớ c v à sau
đ ó to á n tô đ ư ợ c áp dụ ng.
C ả h a i to á n tử c ó th ế đ ư ợ c áp d ụ n g c h o b iế n n g u y ê n c ũ n g n h ư là b iế n
th ự c m ặ c d ù tro n g th ự c tế th ì c á c b iế n th ự c h iế m k h i đ ư ợ c d ù n g th e o h ìn h
th ứ c n ày .
2 .6 . T o á n t ử
k h ở i t aể o
T o á n tử k h ở i tạ o đ ư ợ c sử d ụ n g đ ể lư u trữ m ộ t b iế n . T o á n h ạ n g trá i n ê n là m ộ t
g iá trị trá i v à to á n h ạ n g p h ả i c ó th ế là m ộ t b iế u th ứ c b ấ t kỳ . B iể u th ứ c đ ư ợ c
ư ớ c lư ợ n g v à k ế t q u ả đ ư ợ c lư u trữ tro n g v ị trí đ ư ợ c c h i đ ị n h b ở i g iá trị trái.
G i á t r ị t r á i là b ấ t k ỳ
th ứ gì c h i đ ị n h r õ v ị trí b ộ n h ớ lư u trừ m ộ t g iá trị .
C h ỉ m ộ t lo ạ i c ủ a g iá trị trá i m à c h ú n g ta đ ư ợ c b iế t c h o đ ế n th ờ i đ iế m n à y là
Chư ơ ng 2: Biể u thứ c
21
b iế n . C á c lo ạ i k h á c củ a g iá trị trá i (d ự a trê n c o n trỏ
th ả o lu ậ n sau .
v à th a m c h iế u ) sẽ đ ư ợ c
T o á n tử k h ở i tạ o có m ộ t số b iế n th ế th u đ ư ợ c b ằ n g cách k ế t n ố i n ó v ớ i
c á c to á n tử to á n h ọ c v à các to á n tử trê n b it. C h ú n g đ ư ợ c tố n g k ế t tro n g B ả n g
2.7 . C á c v í d ụ g iả sử rằ n g n là m ộ t b iế n số n g u y ê n .
B ả n g 2 .7
C á c toá n tử
T o án tử
=
Ví du
T ư ơ n g đ ư ơ n g vói
n=25
+=
*_
n -= 2 5
n = n -2 5
11 * = 2 5
n=n*25
/=
n /= 2 5
n = n /2 5
%=
n% =25
n=n% 25
&=
n& =0xF2F2
n=n& Q xF2F2
n = n +25
n+=25
Ạ =
« =
» =
đư
đư
số
b iể
k h ỏ i tạ o .
nỊ =0xF2F2
n = n |Q x F 2 F 2
n A=0xF2F2
n«=4
n»=4
n = n AQxF2F2
n=n«4
n=n»4
P h é p to á n k h ở i tạ o c h ín h n ó là m ộ t b iể u th ứ c m à g iá trị c ủ a n ó là g iá trị
ợ c lư u tro n g to á n h ạ n g trá i c ủ a n ó . V ì th ế m ộ t p h é p to á n k h ở i tạ o c ó th ế
ợ c sử d ụ n g n h ư là to án h ạ n g p h ả i c ủ a m ộ t p h é p to á n k h ở i tạ o k h á c . B ấ t k ỳ
lư ợ n g k h ở i tạ o n à o có th ề đ ư ợ c k ế t n ố i th e o c á c h n à y đế h ìn h th à n h m ộ t
u th ứ c . V í dụ :
in tm ,ạ p ;
m =n=p=100;
//nghĩa là: n = (m = (p = 100));
m = (n = p = 1 0 0 )+ 2 ; // nghĩa là: m = (n = (p = 100))+2;
V iệ c n à y có th ể ứ n g d ụ n g tư ơ n g tự
m =100;
m -H =n=p=10;
2 .7 . T o á n t ử
T oán tứ
ch o c á c h ìn h th ứ ck h ở i tạ o k h ác. V í dụ :
//n g h ĩ a là:m = m + (n = p = 1 0 );
đ iề u k iệ n
đ iề u k iệ n y ê u cầ u 3 to á n h ạ n g . H ìn h th ứ c c hu n g cú a n ó là:
toán hạ ng 1 ? toán hạ ng 2 : toán hạ ng 3
T o á n h ạ n g đ ầ u tiê n đ ư ợ c ư ớ c lư ợ n g v à đ ư ợ c x e m n h ư là m ộ t đ iề u k iệ n . N e u
k ế t q u ả k h ô n g là 0 th ì to án h ạ n g 2 đ ư ợ c ư ớ c lư ợ n g v à g iá trị c ủ a n ó là k ế t q u ả
sau c ù n g . N g ư ợ c lạ i, to á n h ạ n g 3 đ ư ợ c ư ớ c lư ợ n g v à g iá trị c ủ a n ó là k ế t q u ả
sau cù n g . V í dụ :
Chư ơ ng 2: Biể u thứ c
22
i n t m — l , n —2;
in tm in = (m < n ?m :n );
// min nhậ n giá trị 1
C h ú ý rằ n g tro n g các to á n h ạ n g th ứ 2 v à to á n h ạ n g th ứ 3 c ủ a to á n tử điề u
k iệ n th ì ch ỉ có m ộ t to á n h ạ n g đ ư ợ c th ự c h iệ n . Đ iề u n à y là q u an trọ n g k h i m ộ t
h o ặ c c ả h a i c h ứ a hiệ u ứ n g p h ụ (n g h ĩ a là , v iệ c ư ớ c lư ợ n g c ủ a c h ú n g là m
c h u y ể n đ ổ i g iá trị c ủ a b iế n ). V í d ụ , v ớ i m = l v à n=2 th ì tro n g
int m in = (m < n ? nrrH -: n-H-);
m đ ư ợ c tă n g lê n b ở i vì m-H- đ ư ợ c ư ớ c lư ợ n g n h ư n g n k h ô n g tă n g v ì n-Hk h ô n g đ ư ợ c ư ớ c lư ợ n g .
B ở i v ì c h ín h p h é p to á n đ iề u k iệ n c ũ n g là m ộ t b iể u th ứ c n ê n n ó c ó th ể
đ ư ợ c sử d ụ n g n h ư m ộ t to á n h ạ n g củ a p h é p to á n đ iề u k iệ n k h á c , có n g h ĩ a là
c á c b iế u th ứ c điề u k iệ n có th ế đ ư ợ c lồ n g n h a u . V í dụ :
in tm = l,n = 2 ,p = 3 ;
in tm in = (m < n ? (m < p ? m :p )
:(n < p ? n :p ));
2 .8 . T o á n t ử
phẩ y
N h iề u b iể u th ứ c c ó th ế đ ư ợ c k ế t n ố i v à o c ù n g m ộ t b iể u th ứ c sử d ụ n g to á n tử
p h ẩ y . T o á n tử p h ấ y y ê u c ầ u 2 to á n h ạ n g . Đ ầ u tiê n n ó ư ớ c lư ợ n g to á n h ạ n g trái
sau đ ó là to á n h ạ n g p h ả i, v à trả v ề g iá trị c ủ a to á n h ạ n g p h ả i n h ư là k ế t q u ả
sau cù n g . V í dụ :
in tm = l,n = 2 ,m in ;
int m C o u n t= 0 , n C o u n t= 0 ;
//...
min= (m < n ? mCount-H-, m : nCount++, n);
Ớ đ â y k h i m n h ỏ h o n n, m C ount-H - đ ư ợ c ư ớ c lư ợ n g v à g iá trị c ủ a m đ ư ợ c lư u
ừ o n g m in. N g ư ợ c lạ i, nCount-H - đ ư ợ c ư ớ c lư ợ n g v à g iá trị c ủ a n đ ư ợ c lư u
tro n g m in.
2 .9 . T o á n t ử
lấ y k íc h t h ư ớ c
C + + c u n g c ấ p to á n tử h ữ u d ụ n g , sizeof, đ ể tín h to á n k íc h th ư ớ c c ủ a b ấ t k ỳ
h ạ n g m ụ c d ữ liệ u h a y k iể u d ữ liệ u n à o . N ó y ê u c ầ u m ộ t to án h ạ n g d u y n h ấ t có
th ế là tê n k iể u (v í d ụ , int) h a y m ộ t b iế u th ứ c (v í d ụ , 100) v à trả v ề k íc h th ư ớ c
c ủ a n h ữ n g th ự c th ể đ ã ch ỉ đ ị n h th e o b y te . K e t q u ả h o à n to à n p h ụ th u ộ c v à o
m á y . D a n h sá c h 2.1 m in h h ọ a v iệ c sử d ụ n g to á n từ s iz e o f ch o c á c k iể u c ó sẵ n
m à c h ú n g ta đ ã g ặ p c h o đ ế n th ờ i đ iể m n ày .
Chư ơ ng 2: Biể u thứ c
23
D a n h s á c h 2.1
#indude <iostneamii>
int main (void)
{
2
3
4
5
c o u t« " c h a r s iz e = " « s iz e o f(c h a r)« " b y te s \n " ;
c o u t « " c h a r * s iz e = " « sizeoflchar* )« " bytes'-n";
c o u t« "short s iz e = " « sizeof(short)« " bytes\n";
c o u t« "int s iz e = " « sizeof(int)« " bytes\n";
c o u t« "long siz e = " « sizeofflong)« " bytes\n";
c o u t« "float siz e = " « sizeof(float)« " bytes\n";
c o u t« "double s iz e = " « sizeoffdou ble)« " bytes\n";
6
7
8
9
10
11
c o u t« " 1.55 siz e = " « sizeof( 1.55) « " bytes\n";
c o u t« " 1.55L s iz e = " « sizeof( 1.5 5 L )« " bytes\n";
c o u t« "H E L L O s iz e = " « sizeof("H E L L O ")« " bytes\n";
12
13
14
i _____________________________________________________
K h i c h ạ y , c h ư ơ n g trìn h sẽ c h o k ế t q u ả sa u (trê n m á y tín h c á n h â n ):
ch ar s iz e = 1 bytes
char* s iz e = 2 bytes
short s iz e = 2 bytes
int s iz e = 2 bytes
long s iz e = 4 bytes
float s iz e = 4 b y te s
doub le s iz e = 8 bytes
1.55 s iz e = 8 bytes
1.55L size = 1 0 bytes
H E L L O s iz e = 6 bytes
2 .1 0 .Đ Ô ư u t i ê n c ủ a c á c t o á n t ử
T h ứ tự m à các to á n tử đ ư ợ c ư ớ c lư ợ n g tro n g m ộ t b iế u th ứ c là rấ t q u a n trọ n g
v à đ ư ợ c x á c đ ị n h th e o các lu ậ t ư u tiên . C á c lu ậ t n à y c h ia các to á n tử C + + ra
th à n h m ộ t số m ứ c đ ộ ư u tiê n (x e m B ả n g 2 .8 ). C á c to án tử ở m ứ c c a o h ơ n sẽ
c ó đ ộ ư u tiê n c a o h ơ n các to á n tử c ó đ ộ ư u tiê n th ấ p h ơ n .
B ả n g 2 .8
Độ
ư u t iê n c ủ a c á c to á n tử .
Mứ c
C ao nhât
T oán tử
1+
n
++
->
Ị
*
&
-> *
*
+
«
<
=
&
Chư ơ ng 2: Biể u thứ c
*
/
»
<=
Ị =
%
>
>=
new
d elete
s iz e o f
0
L oai
Thứ
Đ ơ n hạ ng
C à hai
tư
N hị hạ ng
T rá i tớ i p h ả i
Đ ơ n hạ ng
P h ả i tớ i trá i
N hị hạ ng
T rá i tớ i p h ả i
N hị hạ ng
T rá i tớ i p h ả i
N hị hạ ng
T rá i tớ i p h ả i
N hị hạ ng
T rá i tớ i p h ả i
N hị hạ ng
T rá i tớ i p h ả i
N hị hạ ng
T rá i tớ i p h ả i
N hị hạ ng
T rá i tớ i p h ả i
A
1
&&
II
? ;
N hị hạ ng
P h ả i tớ i trá i
N hị hạ ng
T rá i tớ i p h ả i
=
Thấ p nhấ t
N hị hạ ng
+=
-=
*=
/=
/s=
%=
&=
1=
«=
»=
?
T rá i tớ i p h ả i
N hị hạ ng
T rá i tớ i p h ả i
N hị hạ ng
T rá i tớ i p h ả i
N hị hạ ng
T rá i tớ i p h ả i
T am hạ ng
T rá i tớ i p h ả i
V í d ụ , tro n g b iể u th ứ c
a= b+ c*d
c * d đ ư ợ c ư ớ c lư ợ n g trư ớ c b ở i v ì to á n tử * có đ ộ ư u tiê n cao h ơ n to á n từ + v à
= . S au đ ó k ế t q u ả đ ư ợ c c ộ n g tớ i b b ở i v ì to á n tử + c ó đ ộ ư u tiê n c a o h ơ n to á n
tử = , v à sau đ ó = đ ư ợ c ư ớ c lư ợ n g . C ác lu ậ t ư u tiê n có th ế đ ư ợ c c h o q u y ề n
c a o h ơ n th ô n g q u a v iệ c s ử d ụ n g các d ấ u n g o ặ c . V í d ụ , v iế t lạ i b iế u th ứ c trê n
n h ư sau
a = (b + c )* d
sẽ là m ch o to á n tử + đ ư ợ c ư ớ c lư ợ n g trư ớ c to á n tử
*.
C á c to á n tử v ớ i c ù n g m ứ c đ ộ ư u ti ê n đ ư ợ c ư ớ c lư ợ n g th e o th ứ tự
ư ớ c lư ợ n g tro n g c ộ t cu ố i c ù n g tro n g B ả n g 2.8. V í d ụ , tro n g b iể u th ứ c
đư ợ c
a=b+=c
th ứ tự ư ớ c lư ợ n g là từ
đ ó là a = b .
p h ả i sa n g trá i, v ì th ế b + = c đ ư ợ c ư ớ c lư ợ n g trư ớ c v à k ế
2 . 1 1 .C h u y ể n k iể u đ ơ n g iả n
M ộ t g iá trị th u ộ c v ề n h ữ n g k iể u x â y d ự n g sẵ n m à c h ú n g ta b iế t đ ế n th ờ i đ iế m
n à y đ ề u có th ể đ ư ợ c c h u y ể n v ề b ấ t k ỳ m ộ t k iế u n à o k h ác. V í dụ :
(int) 3.14
// chuyệ n 3.14 san g int đ ể đ ư ọ c 3
(long) 3.14
/ / c h ự /ệ n 3.14 sang long đ ể Ã iạ c 3L
(double) 2
// chuyên 2 sang doub le đ ê đ u ọ c 2.0
(char) 122
// chuyên 122 sang ch ar có m ã là 122
(unsigned short) 3.14 // đ ư ợ c 3 n h ư là m ộ t unsig ned short
N h ư đ ã đ ư ợ c trìn h b à y tro n g c á c v í d ụ , c á c đ ị n h d a n h k iế u x â y d ụ n g sẵ n
có th ể đ ư ợ c sử d ụ n g n h ư c á c t o á n t ử k i ế u . C á c to á n tò k iể u là đ ơ n h ạ n g
(n g h ĩ a là c h ỉ c ó m ộ t to á n h ạ n g ) v à x u ấ t h iệ n b ê n tr o n g c á c d ấ u n g o ặ c v ề b ê n
trái to á n h ạ n g c ủ a c h ú n g . Đ iê u n à y đ ư ợ c g ọ i là c h u y ể n k iể u tư ờ n g m in h .
K h i tê n k iể u c h ỉ là m ộ t từ th ì c ó th ế đ ặ t d ấ u n g o ặ c x u n g q u a n h to á n h ạ n g :
int(3.14)
Chư ơ ng 2: Biể u thứ c
//n h ư là :(in t)3 .1 4
25
T ro n g m ộ t v à i trư ờ n g h ợ p , C + + c ũ n g th ự c h iệ n c h u y ể n k i ể u k h ô n g
t ư ờ n g m i n h . Đ iề u n à y x ả y r a k h i c á c g iá trị c ủ a c á c k iể u k h ác n h a u đ ư ợ c trộ n
lẫ n tro n g m ộ t b iế u th ứ c. V í dụ :
doub le
int
i= i+ d ;
d = 1;
1 = 1 0 .5 ;
/ / d n h ậ n l .o
// i n h ậ n 10
//n g h ĩ a là: i= in t(d o u b le (i)+ d )
T ro n g v í d ụ c u ố i , i + d b a o h à m các k iể u k h ô n g h ọ p n h a u , v ì th ế trư ớ c tiê n i
đ ư ợ c c h u y ể n th à n h d o u b le (thăng cấ p) v à sau đ ó đ ư ợ c c ộ n g v à o d. K e t q u ả là
double k h ô n g h ợ p k iế u vớ i i trê n p h ía trá i c ủ a p h é p g á n , v ì th ế n ó đ ư ợ c c h u y ể n
th à n h int {hạ cấ p ) trư ớ c k h i đ ư ợ c g á n ch o i.
L u ậ t trê n đ ạ i d iệ n ch o m ộ t v à i trư ờ n g h ợ p c h u n g đ ơ n g iả n đ ể c h u y ế n
k iể u . C á c trư ờ n g h ợ p p h ứ c tạ p h ơ n sẽ đ ư ợ c trìn h b à y ở p h ầ n sau c ủ a g iá o
trìn h sau k h i c h ú n g ta th ả o lu ậ n các k iể u d ữ liệ u k h ác.
B à i tậ p c u ố i c h ư ơ n g 2
2.1
2 .2
V iế t c á c b iể u th ứ c sau đây:
•
K iế m tra m ộ t số n là c h ằ n h a y k h ô n g .
•
K iế m tra m ộ t k ý tự c là m ộ t số h a y k h ô n g .
•
K iế m tra m ộ t k ý tự c là m ộ t m ẫ u tự h a y k h ô n g .
•
T h ự c h iệ n k iế m tra: n là lẽ v à d ư ơ n g h o ặ c n c h ẵ n v à âm .
•
Đ ặ t lạ i k b it c ủ a m ộ t sổ n g u y ê n n tớ i 0.
•
Đ ặ t k b it c ủ a m ộ t số n g u y ê n « t ớ i 1.
•
C h o g iá trị tu y ệ t đố i c ủ a m ộ t số n.
•
C h o số k ý tự tro n g m ộ t c h u ồ i s đ ư ợ c k ế t th ú c b ở i k ý tự n ull.
T h ê m c á c d ấ u n g o ặ c p h ụ v à o các b iế u th ứ c sa u đ ể h iể n th ị rõ rà n g th ứ
to á n tô đ ư ợ c ư ớ c lư ợ ng:
tự
các
(n <= p + q & & n >= p - q II n = 0)
(+ + n * q -/-H p -q )
( n |p & q Ap < < 2 + q )
( p < q ? n < p ? q * n - 2 : q / n + l :q -n )
2.3
C h o b iế t g iá trị c ủ a m ồ i b iế n sau đ â y sau k h i k h ở i tạ o nó:
double
long
chàr
char
2 .4
d = 2 * int(3.14);
k = 3.14 - 3;
c = 'a '+ 2 ;
c =lp'+'Á '-'a';
V iế t m ộ t c h ư ơ n g trìn h ch o p h é p n h ậ p v à o m ộ t số
g iá trị c ủ a n m ũ 2 v à 2 m ũ n.
Chư ơ ng 2: Biể u thứ c
nguyên
d ư ơ n g n v à x u ấ t ra
26
2.5
V iế t m ộ t c h ư ơ n g trìn h cho p h é p n h ậ p b a số v à x u ấ t ra th ô n g đ iệ p Sorted n ế u
c á c số là tă n g d ầ n v à x u ấ t ra N ot sorted tro n g trư ờ n g h ợ p n g ư ợ c lạ i.
Chư ơ ng 2: Biể u thứ c
27
Chư ơ ng 3. Lệ nh
C hư ơ ng này giớ i thiệ u các hình thứ c khác nhau củ a các câu lệ nh C++ để soạ n
thả o chư ơ ng trình. Các lệ nh trình bày việ c xây dự ng các khố i ở mứ c độ thấ p
nhấ t củ a m ộ t chư ơ ng trình. N ói chung m ồ i lệ nh trình bày m ộ t bư ớ c tính toán
có m ộ t tác độ ng chính yế u. B ên cạ nh đó cũ n g có thế
có các tác độ nẸ phụ
khác. Các lệ nh là hữ u dụ ng vì tác dụ ng chính yế u m à nó gây ra, sự kế t nố i củ a
các lệ nh cho phép chư ơ ng trình phụ c vụ m ộ t m ụ c đích cụ thể (ví dụ , sắ p xế p
m ộ t danh sách các tên).
M ộ t chư ơ ng trình đang chạ y dành toàn bộ thờ i gian đế thự c thi các câu
lệ nh. T hứ tự m à các câu lệ nh đư ợ c thự c hiệ n đư ợ c gọ i là dòng điề u khiế n
(flow control). Thuậ t ngữ này phả n ánh việ c các câu lệ nh đang thự c thi hiệ n
thờ i có sự điề u khiể n cúa CPU, khi CPU hoàn thành sẽ đư ợ c chuyể n giao tớ i
m ộ t lệ nh khác. Đặ c trư ng dòng điề u khiể n trong m ộ t chư ơ ng trình là tuầ n tự ,
lệ nh này đế n lệ nh kế , như ng có thế chuyể n hư ớ ng tớ i đư ờ nẹ dầ n khác bở i các
lệ nh rẽ nhánh. D òng điề u khiế n là m ộ t sự xem xét trọ ng yể u bở i vì nó quyế t
đị nh lệ nh nào đư ợ c thự c thi và lệ nh nào không đư ợ c thự c thi trong quá trình
chạ y, vì thế làm ả nh hư ở ng đế n kế t quả toàn bộ củ achư ơ ng trình.
G iố ng nhiề u ngôn ngữ thủ tụ c khác, C ++ cung cấ p nhữ ng hình thứ c khác
nhau cho các mụ c đích khác nhau. Các lệ nh khai báo đư ợ c sử dụ ng cho đị nh
nghĩ a các biế n. Các lệ nh như gán đư ợ c sử dụ ng cho c ác tính toán đạ i số đơ n
giả n. Các lệ nh rẽ nhánh đư ợ c sử dụ ng để chỉ đị nh đư ờ ng dẫ n củ a việ c thự c thi
phụ thuộ c vào kế t quả củ a m ộ t điề u kiệ n luậ n lý. Các lệ nh lặ p đư ợ c sử dụ ng
đế chỉ đị nh các tính toán cầ n đư ợ c lặ p cho tớ i khi m ộ t điề u kiệ n luậ n lý nào
đó đư ợ c thỏ a. Các lệ nh điề u khiế n đư ợ c sử dụ ng đế làm chuyế n đư ờ ng dầ n
thự c thi tớ i m ộ t đư ờ ng dầ n khác củ a chư ơ ng trình. C húng ta sẽ lầ n lư ợ t thả o
luậ n tấ t cả nhữ ng vấ n đề này.
Chư ơ ng 3: Lệ nh
30
3.1. Lệ nh đon và lệ nh phứ c
Lệ nh đơ n là m ộ t sự tíirh toán đư ợ c kế t thúc bằ ng dấ u chấ m phấ y. Các đị nh
nghĩ a biế n và các biể u thứ c đư ợ c kế t thúc bằ ng dấ u chấ m phấ y như trong ví
dụ sau:
int
i;
++i;
doubled= 10.5;
d+5;
//lệ nhkhai báo
// lệ nh này có mộ t tác độ ng chính yế u
//lệ nhkhai báo
// lệ nh không hũu đụ ng
V í dụ cuố i trình bày m ộ t lệ nh không hữ u dụ ng bở i vì nó không có tác độ ng
chính yế u (d đư ợ c cộ ng vớ i 5 v à kế t quả bị vứ t bỏ ).
Lệ nh đơ n giả n nhấ t là lệ nh rồ ng chỉ gồ m dấ u chấ m phấ y m à thôi.
//lệ nh rỗ ng
M ặ c dầ u lệ nh rỗ ng không có tác độ ng chính yế u như ng nó có m ộ t vài
việ c dùng xác thậ t.
N hiề u lệ nh đơ n có thề kế t nố i lạ i thành m ộ t lệ nh phứ c bằ ng cách rào
chúng bên trong các dấ u ngoặ c xoắ n. Ví dụ :
{int min, i = 10,j=20;
m ,n=(i<j?i:j);
cout«m ỉ n<<W ;
}
Bờ i vì m ộ t lệ nh phứ c có thế chứ a các đị nh
phạ m vi cho chúng, nó cũ n g đư ợ c gọ i mộ t khố
đư ợ c giớ i hạ n bên trong khố i trự c tiế p chứ a nó.
sẽ đư ợ c m ô tả chi tiế t hơ n lchi chúng ta thả o luậ
3.2.
nghĩ a biế n và đị nh nghĩ a
i. Phạ m vi củ a m ộ t biế n
Các khố i và các luậ t phạ
nvề hàm trong chư ơ ng kế
mộ t
C++
m vi
.
Lệ nh if
Đôi khi chúng ta m uố n làm cho sự thự c thi m ộ t lệ nh phụ thuộ c vào m ộ t điề u
kiệ n nào đó cầ n đư ợ c thỏ a. Lệ nh if cung cấ p cách đế thự c hiệ n công việ c này,
hình thứ c chung củ a lệ nh này là:
if (biêu thứ c)
lệ nh;
Trư ớ c tiên biể u thứ c đư ợ c ư ớ c lư ợ ng. N ế u kế t quả khác 0 (đúng) thì sau đó
lệ nh đư ợ c thự c thi. N gư ợ c lạ i, không làm gì cả .
V í dụ , khi chia hai giá trị chúng ta m uố n kiể m tra rằ ng m ẫ u số có khác 0
hay không.
if(count!=0)
Chư ơ ng 3: Lệ nh
31
average —sum / count;
Đ ế làm cho nhiề u lệ nh phụ thuộ c trên cùng điề u kiệ n chúng ta có thể sử
dụ ng lệ nh phứ c:
if(balance>0) {
interest - balance * creditRate;
balance + = interest;
}
M ộ t hình thứ c khác củ a lệ nh if cho phép chúng ta chọ n m ộ t trong hai
lệ nh: m ộ t lệ nh đư ợ c thự c thi nế u như điề u kiệ n đư ợ c thỏ a và lệ nh còn lạ i
đư ợ c thự c hiệ n nế u như điề u kiệ n không thỏ a. H ình thứ c này đư ợ c gọ i là lệ nh
if-else v à có hình thứ c chung là:
if {biể u thứ c)
lệ nh 1;
else
lệ nh 2;
Trư ớ c tiên biể u thứ c đư ợ c ư ớ c lư ợ ng. N eu kế t quả khác 0 thì lệ nh 1 đư ợ c
thự c thi. N gư ợ c lạ i, lệ nh 2 đư ợ c thự c thi.
V í dụ :
if(b alan ce> 0 ) {
interest—balance * creditRate;
balance + = interest;
} else {
interest= balance * debitRate;
balance+=interest;
}
Trong cả hai phầ n có sự giố ng nhau ở lệ nh balance H
- = interest vì thế toàn bộ câu
lệ nh có thế viế t lạ i như sau:
if(b a la n c e> 0)
interest—balance * creditRate;
else
interest= balance * debitRate;
balance+ = interest;
H oặ c đơ n giả n hơ n bằ ng việ c sử dụ ng biế u thứ c điề u kiệ n:
interest= balance * (balance > 0 ? creditRate: debitRate);
balance -t= interest;
H oặ c chỉ là:
balance + = balance * (balance > 0 ? creditR ate: debitRate);
Các lệ nh i f có thế đư ợ c lồ ng nhau bằ ng cách đế cho mộ t lệ nh if xuấ t hiệ n
bên trong m ộ t lệ nh if khác. V í dụ :
Chư ơ ng 3: Lệ nh
32
if(calIH our> 6) {
if (callDuration <= 5)
charge= callDuration * tarrifl;
else
charge= 5 * tarrifl + (callDuration - 5) * tarrif2;
} else
charge=flatFee;
M ộ t hình thứ c đư ợ c sử dụ ng thư ờ ng xuyên củ a nhữ ng lệ nh if lồ ng nhau
liên quan đế n phầ n else gồ m có m ộ t lệ nh if-else khác. Ví dụ :
if(ch >='()'&& ch <= 9')
kind=đỉ git;
clsc {
if (ch >= 'A' && ch <= 'Z)
kind= upperLetter,
clsc {
if(ch >= 'a' && ch <= 'f)
kind = lowerLetter,
else
k in d = special;
}
>
Đ e cho dễ đọ c có thể sử dụ ng hình thứ c sau:
if (ch >= '0' && ch <= V)
kind=digit;
else if (ch >= 'A' && ch <= Z )
kind= capitalLetter,
else if (ch >= 'a && ch<= V)
kind = smallLetter,
else
kind= special;
3.3. Lênh switch
Lệ nh switch cung cap phư ơ ng thứ c lự a chọ n giữ a m ộ t tậ p các khả năng dự a
trên giá trị củ a biế u thứ c. H ình thứ c chung củ a câu lệ nh switch là:
switch (biể ụ thứ c) {
caschằ ng ¡:
các lệ nh;
case hằ ng
các lệ nh',
default:
các lệ nh',
}
Biể u thứ c (gọ i là thẻ switch) đư ợ c ư ớ c lư ợ ng trư ớ c tiên và kế t quả đư ợ c so
sánh vớ i mồ i hằ ng số (gọ i là các nhãn) theo thứ tự chúng xuấ t hiệ n cho đế n
khi m ộ t so khớ p đư ợ c tìm thấ y. Lệ nh ngay sau khi so khớ p đư ợ c thự c hiệ n
Chư ơ ng 3: Lệ nh
33
sau đó. Chú ý số nhiề u: m ỗ i case có thế đư ợ c theo sau bở i không hay nhiề
lệ nh (không chỉ là m ộ t lệ nh). V iệ c thự c thi tiế p tụ c cho tớ i khi hoặ c là bắ t gặ
m ộ t lệ nh hrcak hoặ c tấ t cả các lệ nh xen vào đế n cuố i lệ nh sw itch đư ợ c thự
hiệ n.Trư ờ ng hợ p default ở cuố i cùng là m ộ t tùy chọ n và đư ợ c thự c hiệ n nế
như tấ t cả các case trư ớ c đó không đư ợ c so khớ p.
u
p
c
u
V í dụ , chúng ta phả i phân tích cú pháp m ộ t phép toán toán họ c nhị hạ ng
thành ba thành phầ n củ a nó và phả i lư u trừ chúng vào các biế n operator,
operandi, v à opcrand2. Lệ nh switch sau thự c hiệ n phép toán và lư u trữ kế t quả
vào result
switch (operator) {
case
result= operandl + operand2;
break;
case
result= operand 1- operand2;
break;
case
result= operand 1 * operand2;
break;
case'A
result= operand 1/ operand2;
break;
default: cout«"unknownoperator " « o p e ra to r« V ;
break;
}
N hư đã đư ợ c minh họ a trong ví dụ , chúng ta cầ n thiế t chèn m ộ t lệ nh
break ở cuố i mồ i case. Lệ nh break ngắ t câu lệ nh sw itch bằ ng cách nhả y đế n
điế m kế t thúc củ a lệ nh này. V í dụ , nế u chúng ta m ở rộ ng lệ nh trên đế cho
phép X cũ n g có thế đư ợ c sử dụ ng như là toán tử nhân, chúng ta sẽ có:
switch (operator) {
case
result= operandl + operand2;
break;
c a s e r e s u l t = operand 1- operand2;
break;
case hi’:
case
result= operand 1 * operand2;
break;
case 7 :
result= operandl / operand2;
default:
break;
c o u t« "unknownoperator "«operator« V i';
break;
}
Bở i vì case 'x' không có lệ nh break nên khi case này đư ợ c thỏ a thì sự thự c thi
tiế p tụ c thự c hiệ n các lệ nh trong case kế tiế p và phép nhân đư ợ c thi hành.
C húng ta có thể quan sát rằ ng bấ t kỳ lệ nh sw itch nào cũ n g có thể đư ợ c
viế t như nhiề u câu lệ nh if-else. V í dụ , lệ nh trên có thế đư ợ c viế t như sau:
Chư ơ ng 3: Lệ nh
34
if (operator —- '+1)
result= operand 1+operand2;
else if (operator = -1)
result= operand 1 - operand2 ;
else if (operator= bc' IIoperator — '*')
result= operand 1 * operand2;
else if (operator= 7)
result= operand 1/ operand2;
else
cout« "unknown operator " « ch « V;
ngư ờ i ta có thế cho rang phiên bả n switch là rõ ràng hơ n trong trư ờ ng họ p
này. Tiế p cậ n if-else nên đư ợ c dành riêng cho tình huố ng mà trong đó switch
không thề làm đư ợ c công việ c (ví dụ , khi các điề u kiệ n là phứ c tạ p không thể
đơ n giả n thành các đẳ ng thứ c toán họ c hay khi các nhãn cho các case không
là các hằ ng số ).
3.4. Lênh while
Lệ nh while (cũ n g đư ợ c gọ i là vòng lặ p while) cung cấ p phư ơ ng thứ c lặ p mộ t
lệ nh cho tớ i khi m ộ t điề u kiệ n đư ợ c thỏ a. H ình thứ c chung củ a lệ nh lặ p là:
while (biể u thứ c)
lệ nh;
Biể u thứ c (cũ n g đư ợ c gọ i là đ iề u k iệ n lặ p ) đư ợ c ư ớ c lư ợ ng tr ư ớ c tiên. N ế u
kế t quả khác 0 thì sau đó lệ nh (cũ n g đư ợ c gọ i là th â n vòng lặ p) đư ợ c thự c
hiệ n và toàn bộ quá trình đư ợ c lặ p lạ i. N gư ợ c lạ i, vòng lặ p đư ợ c kế t thúc.
V í dụ , chúng ta muố n tính tổ ng củ a tấ t cả các số nguyên từ
này có thể đư ợ c diễ n giả i như sau:
1 tớ i n. Đ iề u
i=l;
sum=0;
while (i<=n){
sum+=i;
H-+;
}
Trư ờ ng họ p n là 5, Bả ng 3.1 cung cấ p bả ng phát họ avòng lặ p bằ ng cách
liệ t kê các giá trị củ a các biế n có liên quan v à điề u kiệ n lặ p.
Bả ng 3.1
v é t củ a vòng lặ p while.________________________________
Vòng lặ p
sum -H= i++
i
n
i <= n
Mộ t
1
1
1
5
'ì
Hai
L
5
1
3
Ba
3
1
5
6
Bôn
4
1
10
5
Năm
5
5
1
15
Sáu
6
0
5
Chư ơ ng 3: Lệ nh
35
Đ ôi khi chúng ta có thế gặ p vòng lặ p w hile có thân rỗ ng (nghĩ a là m ộ t
câu lệ nh null). V í dụ vòng lặ p sau đặ t n tớ i thừ a số lẻ lớ n nhấ t củ a nó.
w hile(n% 2= 0& & n/= 2)
;
Ớ
đây điề u kiệ n lặ p cung cấ p tấ t cả các tính toán cầ n thiế t vì thế không thậ t sự
cầ n m ộ t thân cho vòng lặ p. Đ iề u kiệ n vòng lặ p không nhữ ng kiế m tra n là
chằ n hay không m à nó còn chia n cho 2 và chắ c chắ n rằ ng vòng lặ p sẽ dừ ng.
3.5. Lênh do - while
Lệ nh do (cũ n g đư ợ c gọ i là vòng lặ p do) thì tư ơ ng tự như lệ nh while ngoạ i trừ
thân củ a nó đư ợ c thự c thi trư ớ c tiên và sau đó điề u kiệ n vòng lặ p m ớ i đư ợ c
kiế m tra. H ình thứ c chung củ a lệ nh do là:
do
lệ nh'
while (biể u thứ c)',
Lệ nh đư ợ c thự c thi trư ớ c tiên và sau đó biế u thứ c đư ợ c ư ớ c lư ợ ng. N eu kế t
quả củ a biế u thứ c khác 0 thì sau đó toàn bộ quá trìn h đư ợ c lặ p lạ i. N gư ợ c lạ i
thì vòng lặ p kế t thúc.
V òng lặ p do ít đư ợ c sử dụ ng thư ờ ng xuyên hơ n vòng lặ p w hile. N ó hữ u
dụ ng trong nhữ ng trư ờ ng hợ p khi chúng ta cầ n thân vòng lặ p thự c hiệ n ít nhấ t
m ộ t lầ n m à không quan tâm đế n điề u kiệ n lặ p. V í dụ , giả sử chúng ta m uố n
thự c hiệ n lặ p đi lặ p lạ i công việ c đọ c m ộ t giá trị v à in bình phư ơ ng củ a nó, và
dừ ng khi giá trị là 0. Đ iề u này có thể đư ợ c diễ n giái trong vòng lặ p sau đây:
do {
c in » n ;
c o u t« n * n « \r í;
} while (n!=0);
K hông giố ng như vòng lặ p w hile, vòng lặ p do ít khi đư ợ c sử dụ ng trong
nhữ ng tình huố ng m à nó có m ộ t thân rồ ng. M ặ c dù vòng lặ p do vớ i thân rồ ng
có thể là tư ơ ng đư ơ ng vớ i m ộ t vòng lặ p w hile tư ơ ng tự như ng vòng lặ p w hile
thì luôn dễ đọ c hơ n.
3.6. Lênh for
•
Lệ nh for (cũ n g đư ợ c gọ i là vòng lặ p for) thì tư ơ ng tự như vòng lặ p w hile
như ng có hai thành phầ n thêm vào: m ộ t biế u thứ c đư ợ c ư ớ c lư ợ ng chỉ m ộ t lầ n
trư ớ c hế t và m ộ t biể u thứ c đư ợ c ư ớ c lư ợ ng mồ i lầ n ở cuố i mỗ i lầ n lặ p. Hình
thứ c tổ ng quát củ a lệ nh for là:
Chư ơ ng 3: Lệ nh
36
for (biể u thứ c ¡; biể u thúc 2, biể u thứ cì)
lệ nh',
Biể u thứ c Ị (thư ờ ng đư ợ c gọ i là biể u thứ c khở i tạ o) đư ợ c ư ớ c lư ợ ng trư ớ c
tiên. M ồ i vòng lặ p biể u thứ c2 đư ợ c ư ớ c lư ợ ng. N ế u kế t quả không là 0 (đúng)
thì sau đó lệ nh đư ợ c thự c thi v à biể u thứ c3 đư ợ c ư ớ c lư ợ ng. N gư ợ c lạ i, vòng
lặ p kế t thúc. V òng lặ p for tổ ng quát thì tư ơ ng đư ơ ng vớ i vòng lặ p w hile sau:
biể u thứ cJ,
while (biể u thứ c 2 ) {
ỉ ệ nh;
biêu thứ c 3;
}
V òng lặ p for thư ờ ng đư ợ c sử dụ ng trong các trư ờ ng hợ p m à có m ộ t biế n
đư ợ c tăng hay giả m ở mồ i lầ n lặ p. V í dụ , vòng lặ p for sau tính toán tổ ng củ a
tấ t cả các số nguyên từ 1 tớ i n.
sum=0;
for(i= l;i<=n;++i)
sum+=i;
Đ iề u này đư ợ c ư a chuộ ng hơ n phiên bả n củ a vòng lặ p w hile m à chúng ta thấ y
trư ớ c đó. Trong ví dụ này i thư ờ ng đư ợ c gọ i là b iế n lặ p.
C ++ cho phép biể u thứ c đầ u tiên trong vòng lặ p for là m ộ t đị nh nghĩ a
biế n. V í dụ trong vòng lặ p trên thì i có thế đư ợ c đị nh nghĩ a bên trong vòng
lặ p:
for(inti= l;i<=n;+-H)
sum+=i;
Trái vớ i sự xuấ t hiệ n, phạ m vi củ a i không ở trong thân củ a vòng lặ p mà là
chính vòng lặ p. X ét trên phạ m vi thi ở trên tư ơ ng đư ơ ng vớ i:
inti;
for(i=l;i<=n;-Hi)
sum+=i;
B ấ t kỳ biế u thứ c nào trong 3 biể u thứ c củ a vòng lặ p for có thể rồ ng. Ví
dụ , xóa biế u thứ c đầ u và biế u thứ c cuố i cho chúng ta dạ ng giố ng như vòng
lặ p while:
for(;i!=0;)
// tư ong đư ơ ng vói: while (i!=0)
something;
//
something
X óa tấ t cả các biể u thứ c cho chúng ta m ộ t vòng lặ p vô hạ n. Đ iề u kiệ n củ a
vòng lặ p này đư ợ c giả sử luôn luôn là đúng.
for (;;)
// vòng lặ p vô hạ n
something;
Chư ơ ng 3: Lệ nh
37
Trư ờ ng hợ p vòng lặ p vớ i nhiề u biế n lặ p thì hiế m dủ ng. Trong nhữ ng
trư ờ ng h ọ p như thế , toán tử phẩ y (,) đư ợ c sử dụ ng đế phân cách các biế u thứ c
củ a chúng:
for (i=0, j =0; i + j < n; -Hi, ++j)
something;
Bở i vì các vòng lặ p là các lệ nh nên chúng có thể xuấ t hiệ n bên trong các
vòng lặ p khác. N ói các khác, các vòng lặ p có thể lồ ng nhau. V í dụ ,
for (int i = 1; i <= 3; ++i)
for (intj = 1; j < = 3; -H-j)
cout < < 'C « i < < 7 « j «
")\n";
cho tích so củ a tậ p hợ p {1,2,3} vớ i chính nó, kế t quả như sau:
ị ]’1)
?ĩ
2,1
Ẹị)
23)
3,1)
§
(3 3 )
3.7. Lệ nh continue
Lệ nh continue dừ ng lầ n lặ p hiệ n tạ i cùa m ộ t vòng lặ p và nhả y tớ i lầ n lặ p ké
tiế p. N ó áp dụ ng tứ c thì cho vòng lặ p gầ n vớ i lệ nh continue. Sử dụ ng lệ nh
continue bên ngoài vòng lặ p là lồ i.
Trong vòng lặ p w hile và vòng lặ p do-w hile, vòng lặ p kế tiế p m ở đầ u từ
điề u kiệ n lặ p. Trong vòng lặ p for, làn lặ p kế tiế p khở i đầ u từ biể u thứ c thứ ba
củ a vòng lặ p. V í dụ , mộ t vòng lặ p thự c hiệ n đọ c m ộ t số , xử lý nó như ng bỏ
qua nhữ ng số âm, và dừ ng khi số là 0, có thể diễ n giả i như sau:
do {
cin»num ;
if (num < 0) continue;
/ / x ử l ý s ô ở đ â y ...
} while (num !=0);
Đ iề u này tư ơ ng đư ơ ng vớ i:
do {
cin»num ;
if(num>=0) {
/ / x ử i ý s ổ ờ đ â y ...
}
} while (num !=0);
Chư ơ ng 3: Lệ nh
38
M ộ t biế n thế củ a vòng lặ p này đế đọ c chính xác m ộ t số
tớ i khi số đó là 0) có thế đư ợ c diễ n giả i như sau:
n lầ n (hơ n là cho
f o r ( i = 0;i< n ;+ -H ) {
cin»num ;
if(num<0) continue;
//xử lýsố ở đây...
//làm cho nhả y tói:-Hi
}
Khi lệ nh continue xuấ t hiệ n bên trong vòng
dụ ng trự c tiế p lên vòng lặ p gầ n nó chứ không
ngoài. V í dụ , trong m ộ t tậ p các vòng lặ p đư ợ
continue áp dụ ng cho vòng lặ p for và không áp dụ
lặ p đư ợ c lồ ng vào thì nó áp
áp dụ ng cho vòng lặ p bên
c lồ ng nhau sau đây, lệ nh
ng cho vòng lặ p while:
while (more) {
f o r ( i = 0;i< n ;-H -i) {
cin»num ;
if(num<0) continue;
// process num here...
//làm cho nhả y tói:++i
}
//etc...
>
3.8. Lênh break
•
Lệ nh break có thế xuấ t hiệ n bên trong vòng lặ p (w hile, do, hay for) hoặ c m ộ t
lệ nh switch. N ó gây ra bư ớ c nhả y ra bên ngoài nhữ ng lệ nh này v à vì thế kế t
thúc chúng. G iố ng như lệ nh continue, lệ nh break chỉ áp dụ ng cho vòng lặ p
hoặ c lệ nh sw itch gầ n nó. Sử dụ ng lệ nh break bên ngoài vòng lặ p hay lệ nh
switch là lồ i.
V í dụ , chúng ta đọ c vào m ộ t m ậ t khấ u ngư ờ i dùng như ng không cho
phép m ộ t số hữ u hạ n lầ n thử :
for (i=0; i < attempts; ++i) {
c o u t« "Please enter your password:
d n » password;
if(Veriiy(password)) //kiem tra mậ t khẩ u đúng hay sai
break;
// Ihoát khỏ i vòng lặ p
cout « "Incorrect!\n";
}
Ỡ
đây chúng ta phả i giá sử rằ ng có m ộ t hàm đư ợ c gọ i Verify để kiể m tra m ộ t
m ậ t khẩ u và trả về true nế u như m ậ t khấ u đúng và ngư ợ c lạ i là false.
C húng ta có thế viế t lạ i vòng lặ p mà không cầ n lệ nh break bằ ng cách sử
dụ ng m ộ t biế n luậ n lý đư ợ c thêm vào (verified) và thêm nó vào điề u kiệ n vòng
lặ p:
verified=0;
for (i=0; i < attempts && !verified; ++i) {
Chư ơ ng 3: Lệ nh
39
c o u t« "Please enter your password:
c i n » password;
verified= Verifylpassword));
if(!verified)
cout<< "Incorrect!\n";
}
N gư ờ i ta cho rang phiên bả n củ a break thì đơ n giả nhơ n nên thư ờ ng đư ợ c ư a
chuộ ng hơ n.
3.9. Lệ nh goto
Lệ nh goto cung cấ p mứ c thấ p nhấ t cho việ c nhả y. N ó có hình thứ c chung là:
goto nhãn',
trong đó nhãn là m ộ t đị nh danh đư ợ c dùtiẸ đế đánh dấ u đích cầ n nhả y tớ i.
N hãn cầ n đư ợ c theo sau bở i m ộ t dấ u hai chấ m (:) v à xuấ t hiệ n trư ớ c m ộ t lệ nh
bên trong hàm như chính lệ nh goto.
V í dụ , vai trò củ a lệ nh break trong vòng lặ p for trong phầ n trư ớ c có thế
viế t lạ i bở i m ộ t lệ nh goto.
for (i=0; i < attempts; -Hi) {
cout«"Pleâseenteryourpassword:
c i n » password;
if (Veriíỳ (passwoixi)) // check password for correctness
goto out;
// drop out of the loop
cout << "Incorrect!\n";
}
out:
//etc...
Bở i vì lệ nh goto cung cấ p m ộ t hình thứ c nhả y tự do không có cấ u trúc
(không giố ng như lệ nh break và continue) nên dỗ làm gãy đố chư ơ ng trình.
Phầ n lớ n các lậ p trình viên ngày nay tránh sử dụ ng nó đế làm cho chư ơ ng
trình rõ ràng. Tuy nhiên, goto có m ộ t vài (dù cho hiế m ) sử dụ ng chính đáng.
V ì sự phứ c tạ p củ a nhữ ng trư ờ ng hợ p như thế m à việ c cung cấ p nhữ ng ví dụ
đư ợ c trình bày ở nhữ ng phầ n sau.
3.10.Lệ nh return
Lệ nh return cho phép mộ t hàm trả về m ộ t giá trị cho thành phầ n gọ i nó. N ó có
hình thứ c tổ ng quát:
return biể u thứ c',
Chư ơ ng 3: Lệ nh
40
trong đó biể u thứ c chỉ rõ giá trị đư ợ c trả về bở i hàm. K iể u củ a giá tr ị xiày nên
hợ p vớ i kiể u củ a hàm. Trư ờ ng hợ p kiế u trả về củ a hàm là void, biể u thứ c nên
rong:
return;
H àm m à đư ợ c chúng ta thả o luậ n đế n thờ i điế m này chỉ có hàm main,
kiế u trả về củ a nó là kiể u int. G iá trị trả về củ ahàm main là nhữ ng gì mà
chư ơ ng trình trả về cho hệ điề u hành khi nó hoàn tấ t việ c thự c thi. Chắ ng hạ n
dư ớ i U N IX qui ư ớ c là trả về 0 từ hàm main khi chư ơ ng trình thự c thi không
có lỗ i. N gư ợ c lạ i, m ộ t mã lỗ i khác 0 đư ợ c trả về . Ví dụ :
int main (void)
{
cout« "Hello World'n";
return 0;
}
K hi m ộ t
không trả về
về thự c sự sẽ
bấ t cứ giá trị
đó).
hàm có giá trị trả về không là void (như trong ví dụ trên), nế u
m ộ t giá trị sẽ m ang lạ i m ộ t cả nh báo rình
t
biên dị ch. Giá trị trả
không đư ợ c đị nh nghĩ a trong trư ờ ng họ p này (nghĩ a là, nó sẽ là
nào đư ợ c giữ trong vị trí bộ nhớ tư ơ ng ứ ng cùa nó tạ i thờ i điế m
Bài tậ p cuố i chư ong 3
3.1
V iế t chư ơ ng trình nhậ p vào chiề u cao (theo centim et) và trọ ng lư ợ ng (theo
kilogram ) củ a m ộ t ngư ờ i và xuấ t m ộ t trong nhữ ng thông điệ p: underweight,
normal, hoặ c overweight, sử dụ ng điề u kiệ n:
U nderw eight:
N orm al:
O verw eight:
3.2
w eight < height/2.5
height/2.5 <= w eight <= height/2.3
height/2.3 < w eight
G iả sử rằ ng n là 20, đoạ n m ã sau sẽ xuấ t ra cái gì khi nó đư ợ c thự c thi?
if(n>=0)
if(n< 10)
cout« "n is small'n";
else
cout« "n is negative\n";
3.3
V iế t chư ơ ng trình nhậ p m ộ t ngày theo đị nh dạ ng dd/mm/yy và xuấ t nó theo
đị nh dạ ng month dd,year. Ví dụ , 25/12/61 trở thành:
Thang muoi hai 25,1961
3.4
V iế t chư ơ ng trình nhậ p vào m ộ t giá trị số nguyên, kiế m tra nó là dư ơ ng hay
không v à xuấ t ra giai thừ a củ a nó, sử dụ ng công thứ c:
Chư ơ ng 3: Lệ nh
41
giaithua (0) = 1
giaithua (n) = n X giaithua (n-1)
3.5
V iế t chư ơ ng trình nhậ p vào m ộ t số cơ số 8 và xuấ t ra số thậ p phân tư ơ ng
đư ơ ng. V í dụ sau m inh họ a các công việ c thự c hiệ n củ a chư ơ ng trình theo
m ong đợ i:
N hap vao so bat phan: 214
BatPhan(2 14) = ThapPhan( 140)
3.6
V iế t chư ơ ng trình cung cấ p m ộ t bả ng cử u chư ơ ng đom giả n củ a đị nh dạ ng sau
cho các số nguyên từ 1 tớ i 9:
1x 1= 1
1 x2 =2
9x9=81
Chư ơ ng 3: Lệ nh
42
C h ư ơ n g 4. H àm
C h ư ơ n g n à y m ô tả n h ữ n g h à m d o n g ư ờ i d ù n g đ ị n h n g h ĩ a n h ư là m ộ t tro n g
n h ữ n g k h ố i c h ư ơ n g trìn h C + + . H à m c u n g c ấ p m ộ t p h ư ơ n g th ứ c đ ế đ ó n g g ó i
q u á trìn h tín h to á n m ộ t c á c h d ễ d à n g đ ế đ ư ợ c sử d ụ n g k h i cầ n . Đ ị n h n g h ĩ a
h à m g ồ m h a i p h ầ n : g ia o d iệ n v à th â n .
P h ầ n g i a o d i ệ n h à m ( c ũ n g đ ư ợ c g ọ i là k h a i b á o h à m )
đ ư ợ c sử
dụ ng như
đ ặ c tả h à m c ó t h ể
th ế n ào . N ó g ồ m b a p h ầ n :
•
T ê n h à m . Đ â y c h ỉ là m ộ t đ ị n h d a n h d u y n h ấ t.
•
C á c t h a m số
c ủ a h à m . Đ â y là m ộ t tậ p c ủ a k h ô n g h a y n h iề u đ ị n h d a n h
đ ã đ ị n h k iể u đ ư ợ c sử d ụ n g đ ế tru y ề n cá c g iá tr ị tớ i v à từ h àm .
•
K iể u tr ả
về
c ủ a h à m . K i ể u trả v ề
c ủ a h à m đ ặ c tả
c h o k iể u c ủ a g iá trị m à
h à m trả v ề . H à m k h ô n g trả v ề b ấ t k ỳ k iế u n à o th ì n ê n trả v ề k iể u void.
P h ầ n t h â n h à m ch ứ a đ ự n g c á c b ư ớ c tín h to á n (c á c lệ n h ).
S ử d ụ n g m ộ t h à m liê n q u a n đ ế n v iệ c g ọ i n ó . M ộ t lò i g ọ i h à m
h à m , th e o sa u là c ặ p d ấ u n g o ặ c đ o n ‘0 ’, b ê n tro n g c ặ p d ấ u n g o ặ
m ộ t h a y n h iề u đ ố i số đ ư ợ c tá c h b iệ t n h a u b ằ n g d ấ u p h ẩ y , s ố c á c
k h ớ p v ớ i số c á c th a m số c ủ a h à m . M ồ i đ ố i số là m ộ t b iể u th ứ c m à
p h ả i k h ớ p v ớ i k iể u c ủ a th a m số tư ơ n g ứ n g tro n g k h a i b á o hàm .
K h i lờ i g ọ i h à m đ ư ợ c th ự c th i, c á c đ ố i số
g ồ m c ó tê n
c là k h ô n g ,
đ ố i số p h á i
k iể u c ủ a n ó
đ ư ợ c ư ớ c lư ợ n g trư ớ c tiê n v à
c ác g iá trị k ế t q u ả c ủ a c h ú n g đ ư ợ c g á n tớ i c á c th a m số tư ơ n g ứ n g . S a u đ ó
th â n h à m đ ư ợ c th ự c h iệ n . C u ố i c ù n g g iá trị trả v ề c ủ a h à m đ ư ợ c tru y ề n tớ i
th à n h p h ầ n g ọ i h à m .
V ì m ộ t lờ i g ọ i tớ i m ộ t h à m m à k iể u tr ả v ề k h ô n g là v o id sẽ m a n g lạ i m ộ t
g iá trị tr ả v ề n ê n lờ i gọ i là m ộ t b iể u th ứ c v à có th ề đ ư ợ c s ử d ụ n ẹ tro n g cá c
b iể u th ứ c k h ác . N g ư ợ c lạ i m ộ t lờ i g ọ i tớ i m ộ t h à m m à k iề u tr ả v ề c ủ a n ó là
v o id th ì lờ i g ọ i là m ộ t lệ nh.
Chư ơ ng 4: Hàm
45
4 .1 . H à m đ o n g iả n
D a n h s á c h 4 .1 trìn h b à y đ ị n h n g h ĩ a c ủ a m ộ t h à m đ o n g iả n đ ể
tín h lũ y th ừ a
c ủ a m ộ t số n g u y ê n .
D a n h s á c h A A ______________________________
1
2
3
int Power (int base, unsigned int exponent)
4
5
6
7
for (int i = 0 ; i < exponent; ++i)
result *= base;
return result;
{
int
result= 1;
C h ú g iả i
1
D ò n g n à y đ ị n h n g h ĩ a g ia o d iệ n h àm . N ó b ắ t đ ầ u v ớ i k iể u trả v ề c ủ a h à m
(là in t tro n g trư ờ n g h ợ p n à y ). K e tiế p là tê n h à m , th eo sau là d a n h sách
các th a m so. Power có h a i th a m so (base v à exponent) th u ộ c k iể u int v à
unsigned int tư ơ n g ứ n g . C h ú ý là cú p h á p ch o c á c th a m số là tư ơ n g tự n h ư
cú p h á p c h o đ ị n h n g h ĩ a b iế n : đ ị n h d a n h k iể u đ ư ợ c th eo sau b ở i tê n th a m
số . T u y n h iê n , k h ô n g th ể th e o sa u đ ị n h d a n h k iể u v ớ i n h iề u th a m số p h â n
cách bở i dấ u phẩ y:
int Power (int base, exponent)
//Sai!
2
D ấ u n g o ặ c n à y đ án h d ấ u đ iể m b ắ t đ ầ u c ủ a th â n h àm .
3
D ò n g n à y là đ ị n h n g h ĩ a m ộ t b i ế n c ụ c b ộ .
4-5 V ò n g lặ p fo r n à y tă n g c a so base lên lũ y th ừ a c ủ a exponent v à lim trừ
kế t
q u ả v à o tro n g result.
6
H à n g n à y trả result về n h ư
7
là k ế t q u ả c ủ a h àm .
D ấ u n g o ặ c n à y đ án h d ấ u đ iể m k ế t th ú c c ủ a th â n hàm .
D a n h sá c h 4 .2 m in h h ọ a h à m đ ư ợ c g ọ i n h ư th ế n ào . T ác đ ộ n g c ủ a lờ i g ọ i
h à m n à y là đ ầ u tiê n các g iá trị 2 v à 8 tư ơ n g ứ n g đ ư ợ c gán c h o các th a m số
base v a exponent, v à sau đó th â n h à m đ ư ợ c ư ớ c lư ợ n g .
D a n h s á c h 4 .2
1
#include <iostreamh>
2
3
4
main (void)
{
cout« " 2 A8 = " «
Power(2,8)« V ;
5 U ________________________________
K h i c h ạ y c h ư ơ n g trìn h n à y x u ấ t ra k ế t q u ả sau:
2 A8=2 56
Chư ơ ng 4: Hàm
46
N ó i c h u n g , m ộ t h àm p h ả i đ ư ợ c k lia i b á o trư ớ c k h i s ử
đụ ng nó. K h a i b á o
h à m (fu n c tio n d e c la ra tio n ) đ ơ n g iả n g ồ m c ó m ẫ u b a n đ ầ u c ủ
n g u y ê n m ẫ u h à m (fu n c tio n p ro to ty p e ) ch ỉ đ ị n h tê n h à m , các k iế
k iể u tr ả v ề . H à n g 2 tro n g D a n h s á c h 4 .3 trìn h b à y h à m Power c ó
b á o n h ư th ế n à o ch o c h ư ơ n g trìn h trê n . N h ư n g m ộ t h à m c ũ n g
k h a i b á o m à k h ô n g c ầ n tê n c á c th a m số c ủ a n ó ,
a hàm
u th a m
th ể đ ư ợ
có th ể
g ọ i là
số , v à
c khai
đ ư ợ c
int Power (int, unsigned int);
tu y n h iê n c h ú n g ta k h ô n g n ê n là m đ iề u đ ó tr ừ
p h i v a i trò củ a c á c th a m số là rõ
ràn g .
D a n h s á c h 4 .3
1
#include <iostream.h>
2
int Power (int base, unsigned int exponent);
3
4
5
6
main (void)
{
cout« "2 A 8 = " « Power(2,8)« V ;
}
7
8
9
int Power (int base, unsigned int exponent)
{
int resu lt= l;
10
for (int i = 0 ; i < exponent; ++i)
result *= base;
return result;
11
12
//khai bao ham
13
B ở i v ì m ộ t đ ị n h n g h ĩ a h à m c h ứ a đ ự n g m ộ t n g u y ê n m ẫ u (p ro to ty p e ) n ê n
n ó c ũ n g đ ư ợ c x e m n h ư là m ộ t k h a i b á o . V ì th ế n ế u đ ị n h n g h ĩ a c ủ a m ộ t h à m
x u ấ t h iệ n trư ớ c k h i sử d ụ n g n ó th ì k h ô n g c ầ n k h a i b á o th ê m v à o . T u y n h iê n
v iệ c s ử d ụ n g cá c n g u y ê n m ầ u h à m là k h u y ế n k h íc h c h o m ọ i trư ờ n g h ọ p . T ậ p
h ợ p c ủ a n h iề u h à m v à o m ộ t tậ p tin h e a d e r riê n g b iệ t ch o p h é p n h ữ n g lậ p trìn h
v iê n k h á c tr u y x u ấ t n h a n h c h ó n g tớ i c á c h à m m à k h ô n g c ầ n p h ả i đ ọ c to à n b ộ
c á c đ ị n h n g h ĩ a c ủ a ch ú n g .
4 .2 . T h a m s ố
C ++ hỗ
v à đ ố i số
trợ
h a i k iể u th a m số : g iá trị v à th a m c h iế u . T h a m s ố g i á t r ị n h ậ n m ộ t
sao c h é p g iá trị c ủ a đ ố i số đ ư ợ c tru y ề n tớ i n ó . K e t q u ả là, n ế u h à m c ó b ấ t k ỳ
c h u y ế n đ ố i n à o tớ i th a m số th ì v ẫ n k h ô n g tá c đ ộ n g đ ế n đ ố i số . V í d ụ , tro n g
#include <iostrearah>
void Foo (int num)
{
num =0;
Chư ơ ng 4: Hàm
47
co u t«
"num - " «
num «
V;
}
int mam (void)
{
in tx = 1 0 ;
Foo(x);
cout << "x = " «
return 0;
X
« V;
}
th ì th a m số d u y n h ấ t củ a h à m Foo là m ộ t th a m số g iá trị . Đ en
đ ư ợ c th ự c th i th ì nu m đ ư ợ c s ử đ ụ n g n h ư là m ộ t b iế n c ụ c b ộ
K h i h à m đ ư ợ c g ọ i v à X đ ư ợ c tru y ề n tớ i n ó , nu m n h ậ n m ộ t sao
X. K et quả
là m ặ c d ù num đ ư ợ c đ ặ t v ề 0
b ở ih à m n h ư n g
đ ộ n g lê n X. C h ư ơ n g trìn h ch o k ế t q u ả n h ư sau :
lú c m à h à m n à y
b ê n tro n g h à m .
c h é p g iá trị c ủ a
v ẫ n k h ô n g có g ì tác
num =0;
x=1 0;
T rá i lạ i, t h a m s ố
t h a m c h i ế u n h ậ n các đ ố i số
đ ư ợ c tru y ề n tớ i n ó v à là m
trự c tiế p trê n đ ố i số đó . B ấ t k ỳ c h u y ể n đ ố i n à o đ ư ợ c tạ o ra b ở i h à m tớ i th a m
số th a m c h iế u đ ề u tá c đ ộ n g trự c tiế p lê n đ ố i số .
B ê n tro n g n g ữ
c ả n h c ủ a c á c lờ i g ọ i h à m , h a i k iể u tru y ề n đ ố i số tư ơ n g ứ n g
đ ư ợ c g ọ i là t r u y ề n - b ằ n g - g i á t r ị v à t r u y ề n - b ằ n g - t h a m c b iế u . T h ậ t là h o à n
to à n h ợ p lệ c h o m ộ t h à m tr u y ề n -b ằ n g -g iá trị đ ố i v ớ i m ộ t v à i th a m số v à
tru y ề n -b ằ n g -th a m ch iế u ch o m ộ t v à i th a m số k h á c . T ro n g th ự c tế th ì tru y ề n b ằ n g -g iá tr ị th ư ờ n g đ ư ợ c s ử d ụ n g n h iề u h ơ n .
4 .3 . P h ạ • m v i c ụ • c b ộ • v à t o à n c ụ • c
M ọ i th ứ
đ ư ợ c đ ị n h n g h ĩ a ở m ứ c p h ạ m v i c h ư ơ n g trìn h (n g h ĩ a là b ê n n g o à i cá c
h à m v à c á c lớ p ) đ ư ợ c h iế u là có m ộ t p h ạ m v i t o à n c ụ c ^global s c o p e ). C á c
h à m v í d ụ m à c h ú n g ta đ ã th ấ y c h o đ ế n th ò i đ iế m n à y đ ề u có m ộ t p h ạ m v i
to à n c ụ c. C á c b iế n c ũ n g có th ề đ ị n h n g h ĩ a ở p h ạ m v i to à n cụ c:
intyear= 1994;
int M ax (int, int);
int main (void)
{
//biế ntoàncụ c
// hàm toàn cụ c
// hàm toàn cụ c
II...
}
C á c b iế n to à n cụ c k h ô n g đ ư ợ c k h ở i tạ o , sẽ đ ư ợ c k h ở i tạ o tự
V ì c á c đ ầ u v à o to à n c ụ c là có th ể
th ấ y đ ư ợ c ở
đ ộ n g là 0.
m ứ c c h ư ơ n g trìn h n ê n
c h ú n g c ũ n g p h ả i là d u y n h ấ t ở m ứ c c h ư ơ n g trìn h . Đ iề u n à y n g h ĩ a là c ù n g các
b iế n h o ặ c h à m to à n cụ c c ó th ế k h ô n g đ ư ợ c đ ị n h n g h ĩ a n h iề u h ơ n m ộ t lầ n ở
Chư ơ ng 4: Hàm
48
m ứ c to à n c ụ c. (T u y n liiê n c h ú n g ta sẽ th ấ y sau n à y m ộ t tê n h à m có th ế đ ư ợ c
sử d ụ n g lạ i). T h ô n g th ư ờ n g các b iế n h a y h à m to à n c ụ c có th ế đ ư ợ c tru y x u ấ t
từ m ọ i n ơ i tro n g c h ư ơ n g trìn h .
M ồ i k h ố i tro n g m ộ t c h ư ơ n g trìn h đ ị n h n g h ĩ a m ộ t p h ạ m v i c ụ c b ộ . T h ậ t
v ậ y , th â n c ủ a m ộ t h à m trìn h b à y m ộ t p h ạ m v i c ụ c b ộ . C ác th a m số c ủ a m ộ t
h à m có c ù n g p h ạ m v i n h ư là th â n h àm . C á c b iế n đ ư ợ c đ ị n h n g h ĩ a ở b ê n tro n g
m ộ t p h ạ m v i c ụ c b ộ có th ể n h ìn th ấ y tớ i ch ỉ p h ạ m v i đ ó . D o đ ó m ộ t b iế n ch ỉ
c ầ n là d u y n h ấ t ở tro n g p h ạ m v i c ủ a c h ín h n ó . C á c p h ạ m v i c ụ c b ộ cí th ế lồ n g
n h a u , tro n g trư ờ n g h ợ p n à y các p h ạ m v i b ê n tro n g c h ồ n g lên c á c p h ạ m v i b ê n
n g o à i. V í d ụ tro n g
intxyz;
//xyz là toàn cụ c
v o id F o o (in tx y z )
{
//x y z là c ụ c b ộ c h o t h â n c ủ a F o o
.
"
if(x y z> 0 ) {
double xyz:
//xyz là cụ c bộ cho khố i này
//...
}
>
c ó b a p h ạ m v i riê n g b iệ t, m ỗ i p h ạ m v i c h ứ a đ ự n g m ộ t xyz riê n g .
T h ô n g th ư ờ n g , th ờ i g ia n s ố n g c ủ a m ộ t b iế n b ị g iớ i h ạ n b ở i p h ạ m v i c ủ a
n ó . V ì th ế , v í d ụ cá c b iế n to à n c ụ c tồ n tạ i s u ố t th ờ i g ia n th ự c h iệ n c h ư ơ n g
trìn h tro n g k h i c á c b iế n c ụ c b ộ đ ư ợ c tạ o ra k h i p h ạ m v i c ủ a c h ú n g b ắ t đ ầ u v à
m ấ t đ i k h i p h ạ m v i c ủ a c h ú n g k ế t th ú c . K h ô n g g ia n b ộ n h ớ c h o cá c b iế n to à n
c ụ c đ ư ợ c d à n h riê n g trư ớ c k h i s ự th ự c h iệ n c ủ a c h ư ơ n g trin h b ắ t đ ầ u n h ư n g
n g ư ợ c lạ i k h ô n g g ia n b ộ n h ớ c h o c á c b iế n c ụ c b ộ đ ư ợ c cấ p p h á t ở th ờ i đ iế m
th ự c h iệ n c h ư ơ n g trìn h .
4 .4 . T o á n t ử
phạ m vi
B ở i v ì p h ạ m v i cụ c b ộ
ghi c h ồ n g lê n p h ạ m v i to à n c ụ c n ê n m ộ t b iế n c ụ c b ộ
có
c ù n g tê n v ớ i b iế n to à n cụ c là m c h o b iế n to à n cụ c k h ô n g th ế tru y x u ấ t đ ư ợ c tớ i
p h ạ m v i c ụ c b ộ . V í d ụ , tro n g
interior,
void Error (int error)
{
II...
}
b iế n to à n c ụ c error là k h ô n g th ể tru y x u ấ t đ ư ợ c b ê n tro n g h à m E ư or b ở i v ì n ó
đ ư ợ c g h i c h ồ n g b ở i th a m so error c ụ c b ộ .
V ấ n đ ề n à y đ ư ợ c g iả i q u y ế t n h ờ v à o s ử d ụ n g to á n tử
( ::) ,to á n tử n à y lấ y đ ầ u v à o to à n c ụ c n h ư là đ ố i số :
Chư ơ ng 4: Hàm
phạ m vi đơ n hạ ng
49
int error,
void Error (int error)
{
II...
if ("error !=0)
//...
// tham khả o tói error toàn cụ c
}
4 .5 . B iế n t ự
độ ng
B ở i v ì th ờ i g ia n s ố n g củ a m ộ t b iế n c ụ c b ộ là c ó g iớ i h ạ n v à đ ư ợ c x á c đ ị n h
h o à n to à n tự đ ộ n g n ê n n h ữ n g b iế n n à y c ũ n g đ ư ợ c g ọ i là t ự đ ộ n g . B ộ x á c đ ị n h
lớ p lư u trừ auto c ó th ế đ ư ợ c d ù n g đ ế c h ỉ đ ị n h rõ rà n g m ộ t b iế n c ụ c b ộ là tự
đ ộ n g . V í dụ :
void Foo (void)
{
auto int xyz;
//...
}
Đ iề u n à y ít k h i đ ư ợ c sử
độ ng.
//như là: intxyz;
d ụ n g b ở i v ì tấ t c ả
c á c b iế n c ụ c b ộ
m ặ c đ ị n h là tự
4 .6 . B iế n t h a n h g h i
N h ư đ ư ợ c đ ề c ậ p trư ớ c đ ó , n ó i c h u n g c á c b iế n b iể u th ị các v ị trí b ộ n h ớ n ơ i
m à g iá trị c ủ a b iế n đ ư ợ c lư u tr ừ tớ i. K h i m ã c h ư ơ n g trìn h th a m k h ả o tớ i m ộ t
b iế n (v í d ụ , tro n g m ộ t b iế u th ứ c ), trìn h b iê n d ị c h p h á t ra c á c m ã m á y tru y x u ấ t
tớ i v ị trí b ộ n h ớ đ ư ợ c b iế u th ị b ở i c ác b iế n . Đ ố i v ớ i c á c b iế n d ù n g th ư ờ n g
x u y ê n (v í d ụ n h ư các b iế n v ò n g lặ p ), h iệ u x u ấ t c h ư ơ n g trìn h c ó th ể th u đ ư ợ c
b ằ n g c á c h g iữ b iế n tro n g m ộ t th a n h g h i, b ằ n g c á c h n à y có th ể trá n h đ ư ợ c tru y
x u ấ t b ộ n h ớ tớ i b iế n đ ó.
B ộ lư u tr ữ thanh ghi c ó th ế đ ư ợ c s ử d ụ n g đ ể ch i đ ị n h ch o trìn h b iê n d ị c h
b iế n có th ế đ ư ợ c lư u trữ tro n g m ộ t th a n h g h i n ế u c ó th ể . V í dụ :
for (register int i = 0 ; i < n; ++i)
sum + = i;
Ớ
đ â y m ồ i v ò n g lặ p i đ ư ợ c s ử d ụ n g b a lầ n : m ộ t lầ n k h i n ó đ ư ợ c so sá n h v ớ i n,
m ộ t lầ n k h i n ó đ ư ợ c c ộ n g v à o sum, v à m ộ t lầ n k h i n ó đ ư ợ c tă n g . V ì th ế v iệ c
g iữ b iế n i tro n g th a n h gh i tro n g s u ố t v ò n g lặ p fo r là có ý n g h ĩ a tro n g v iệ c c ả i
th iệ n h iệ u s u ấ t c h ư ơ n g trìn h .
C h ú ý rằ n g thanh ghi c h ỉ là m ộ t g ọ i ý ch o trìn h b iê n d ị c h , v à tro n g m ộ t v à i
trư ờ n g h ọ p trìn h b iê n d ị c h c ó th ế c h ọ n k h ô n g s ử
Chư ơ ng 4: Hàm
d ụ n g th a n h g h i k h i n ó đ ư ợ c
50
y ê u c ầ u là m đ iề u đ ó . M ộ t lý đ o đ ế lý g iả i là b ấ t k ỳ m á y tín h n à o c ũ n g có m ộ t
số h ữ u h ạ n cá c th a n h gh i v à n ó c ó th ế ở
đ a n g đ ư ợ c sử d ụ n g .
tro n g trư ờ n g h ọ p tấ t c ả cá c th a n h g hi
T h ậ m c h í k h i lậ p trìn h v iê n k h ô n g k h a i b á o th a n h g h i, n h iề u trìn h b iê n
d ị c h tố i ư u cố g ắ n g th ự c h iệ n m ộ t d ự đ o á n th ô n g m in h v à sử d ụ n g c á c th a n h
g h i m à c h ú n g m u ố n đ ể cả i th iệ n h iệ u s u ấ t c ủ a c h ư ơ n g trìn h .
Ý tư ở n g s ử d ụ n g k h ai b á o th a n h g h i th ư ờ n g đ ư ợ c đ ề x u ấ t s a u c ù n g ; n g h ĩ a
là sau k h i v iế t m ã c h ư ơ n g trìn h h o à n tấ t lậ p trìn h v iê n c ó th ể x e m lạ i m ã v à
c h è n c á c k h a i b á o th a n h g h i v à o n h ữ n g n ơ i c ầ n th iế t.
4 .7 . H à m n ộ i t u y ế n
G iả
sử
m ộ t c h ư ơ n g trìn h th ư ờ n g x u y ê n y ê u c ầ u tìm g iá trị tu y ệ t đ ố i c ủ a m ộ t
số c á c số n g u y ê n . C h o m ộ t g iá trị đ ư ợ c b iế u th ị b ở i n, đ iề u n à y có th ể đ ư ợ c
g iả i th íc h n h ư sau :
(n > 0 ? n :-n )
T u y n h iê n , th a y v ì tá i tạ o b iế u th ứ c n à y tạ i n h iề u v ị trí k h á c n h a u tro n g
c h ư ơ n g trìn h , tố t h ơ n h ế t là n ê n đ ị n h n g h ĩ a n ó tro n g m ộ t h à m n h ư
sau :
intA bs(intn)
{
re tu m n > 0 ? n :-n ;
}
P h iê n b ả n h à m c ó m ộ t số
c á c th u ậ n lợ i. T h ứ
n h ấ t, n ó là m c h o c h ư ơ n g
trìn h dỗ đ ọ c. T h ứ h a i, n ó c ó th ế đ ư ợ c s ử d ụ n g lạ i. V à th ứ b a , n ó trá n h đ ư ợ c
h iệ u ứ n g p h ụ k h ô n g m o n g m u ố n k h i đ ố i số c h ín h n ó là m ộ t b iể u th ứ c c ó các
h iệ u ứ n g p h ụ .
T u y n h iê n , b ấ t lợ i c ủ a p h iê n b ả n h à m là v iệ c s ử d ụ n g th ư ờ n g x u y ê n có
th ế d ầ n tớ i sự b ấ t lợ i về h iệ u s u ấ t đ á n g k ể v ì c á c tố n p h í d à n h ch o v iệ c g ọ i
h à m . V í d ụ , n ế u h à m Abs đ ư ợ c s ử d ụ n g tro n g m ộ t v ò n g lặ p đ ư ợ c lặ p đ i lặ p lạ i
m ộ t n g à n lầ n th ì sau đ ó n ó sẽ có m ộ t tá c đ ộ n g trê n h iệ u su ấ t. T ổ n p h í có th ể
đ ư ợ c trá n h b ằ n g c á c h đ ị n h n g h ĩ a h à m A bs n h ư là h à m nộ i tuyế n (inline);
inlineint A bs(intn)
{
re tu m n > 0 ? n :-n ;
}
H iệ u q u ả c ủ a v iệ c sử
d ụ n g h à m n ộ i tu y ế n là k h i h à m A bs đ ư ợ c g ọ i, trìn h
b iê n d ị c h th a y v ì p h á t ra m ã đ ế g ọ i h à m Abs th ì m ở rộ n g v à th a y th ế th â n c ủ a
h à m A bs v à o n ơ i g ọ i. T ro n g k h i v ề b ả n c h ấ t th ì c ù n g tín h to á n đ ư ợ c th ự c h iệ n
n h ư n g k h ô n g có liê n q u an đ ế n lờ i g ọ i h à m v ì th ế m à k h ô n g có c ấ p p h á t stac k .
Chư ơ ng 4: Hàm
51
B ở i v ì c á c lờ i g ọ i tớ i h à m n ộ i tu y ế n đ ư ợ c m ở
xông n ên k h ô n g c ó v ế t c ủ a
c h ín h h à m đ ư ợ c đ ư a v à o tro n g m ã đ ã b iê n d ị c h . V ì th ế , n ế u m ộ t h à m đ ư ợ c
đ ị n h n g h ĩ a n ộ i tu y ế n ở tro n g m ộ t tậ p tin th ì n ó k h ô n g sằ n d ù n g c h o c á c tậ p tin
k h á c . D o đ ó , c á c h à m n ộ i tu y ế n th ư ờ n g đ ư ợ c đ ặ t v à o tro n g c á c tậ p tin h e a d e r
đ ế m à c h ú n g c ó th ể đ ư ợ c c h ia sẻ .
G iố n g n h ư t ò k h ó a register, inline là m ộ t
h iệ n . N ó i c h u n g , v iệ c sứ d ụ n g in lin e n ê n c ó h ạ
đ ư ợ c s ử d ụ n g th ư ờ n g x u ỵ ê n m à th ô i. V iệ c s ử
p h ứ c tạ p q u á th ì c h ắ c ch ắ n b ị b ỏ q u a b ở i trìn h
g ợ i ý c h o trìn h b iê n d ị c h th ự c
n c h ế ch ì ch o cá c h à m đ ơ n g iả n
d ụ n g in lin e ch o c á c h à m d à i v à
b iê n d ị c h .
4 .8 . Đ ệ q u i
M ộ t h à m g ọ i c h ín h n ó đ ư ợ c g ọ i là đ ệ
q u i. Đ ệ
q u i là m ộ t k ỹ
th u ậ t lậ p trìn h
tổ n g q u á t c ó th ể ứ n g d ụ n g ch o cá c b à i to á n m à c ó th ể đ ị n h n g h ĩ a th e o th u ậ t
n g ữ c ủ a c h ín h c h ú n g . C h ắ n g h ạ n b à i to á n g ia i th ừ a đ ư ợ c đ ị n h n g h ĩ a n h ư sau :
• G ia i th ừ a c ủ a 0 là 1.
•
G ia i th ừ a c ủ a m ộ t số « là n lầ n g ia i th ừ a c ủ a 77-1.
H à n g th ứ h a i rõ rà n g ch o b iế t g ia i th ừ a đ ư ợ c đ ị n h n g h ĩ a th e o th u ậ t n g ữ
c h ín h n ó v à v ì th ế c ó th ế đ ư ợ c b iể u d iễ n n h ư m ộ t h à m đ ệ qui:
củ a
int Factorial (unsigned int n)
{
return n = 0 ? 1 : n * Factorial(n-1);
}
C h o n b ằ n g 3, B ả n g 4.1 c u n g cấ p v ế t c ủ a cá c lờ i g ọ i Factorial. C á c k h u n g
sta c k ch o các lờ i g ọ i n à y x u ấ t h iệ n tu ầ n tự từ n g c á i m ộ t trê n ru n tim e sta ck .
B ả n g 4 .1
vế t
t h ự c t h i c ủ a F a c t o r ia l(3 ) .
C all
n
n * F a c t o r ia l( n - l)
R e tu r n s
Thứ nhât
0
3 * Factorial(2)
Thứ hai
3
Ảo
0
2 * F a c to ria l 1)
6
2
Thứ ba
Thứ tư
\
0
1 * Factorial(O)
0
1
11 =
0
1
1
M ộ t h à m đ ệ q u i p h ả i có ít n h ấ t m ộ t đ i ề u k i ệ n d ừ n g c ó th ể đ ư ợ c th ỏ a .
N g ư ợ c lạ i, h à m sẽ g ọ i c h ín h n ó v ô h ạ n đ ị n h c h o tớ i k h i tràn stac k . V í d ụ h à m
F a c to ria l c ó đ iề u k iệ n d ừ n g là n = 0. (C h ú ý đ ố i v ớ i trư ờ n g h ợ p n là số
th ì đ iề u k iệ n sẽ k h ô n g b ao g iờ th ỏ a v à Factorial sẽ th ấ t b ạ i).
Chư ơ ng 4: Hàm
âm
52
4 .9 . Đ ố i s ố
m ă• c đ in
• h
Đ ố i số
m ặ c đ ị n h là m ộ t th u ậ n lợ i lậ p trìn h đ ể
đ ị n h c á c g iá trị đ ố i số
v iệ c b á o c á o lỗ i:
ch o tấ t c ả
các th a m số
bỏ
bớ t đi gánh nặ ng phả i chỉ
hàm . V í dụ , xem x ét hàm cho
void Error (char *message, int severity=0);
Ớ
đ â y th ì severity có m ộ t đ ố i số m ặ c đ ị n h là 0; v ì th ế c ả h a i lòi g ọ i sa u đ ề u h ợ p
lệ :
Error("Division by zero", 3);// severity đậ t tớ i 3
EiTOiC'Round off error”);
// seventy đặ t tớ i 0
N h ư là lờ i g ọ i h à m đ ầ u tiê n m in h h ọ a , m ộ t đ ố i số
c h ồ n g b ằ n g c á c h c h ỉ đ ị n h rõ rà n g m ộ t đ ố i số .
m ặ c đ ị n h có th ể
đư ợ c ghi
C á c đ ố i số m ặ c đ ị n h là th íc h h ợ p c h o cá c trư ờ n g h ợ p m à tro n g đ ó các
th a m số n à o đ ó c ủ a h à m (h o ặ c tấ t c ả ) th ư ờ n g x u y ê n lấ y c ù n g g iá trị . V í d ụ
tro n g h à m Error, s e v e rity 0 lỗ i th ì p h ố b iế n h ơ n là n h ữ n g trư ờ n g h ợ p k h á c v à
v ì th ế là m ộ t ứ n g c ử v iê n tố t c h o đ ố i số m ặ c đ ị n h . M ộ t c á c h d ù n g c á c đ ố i số ít
p h ù h ợ p có th ế là:
int Power (int base, unsigned int exponent =1);
B ở i v ì 1 (h o ặ c b ấ t k ỳ g iá tr ị n à o k h á c ) th ì k h ô n g c h ắ c x ả y r a th ư ờ n g x u y ê n
tro n g tìn h h u ố n g n ày .
Đ ế trá n h m ơ h ồ , tấ t c ả đ ổ i số m ặ c đ ị n h p h ả i là c á c đ ố i số
th ế k h a i b á o sau là k h ô n g th e o lu ậ t:
th e o đ u ô i. V ì
void Error (char *message= "Bomb", int severity); // Trái qui tắ c
M ộ t đ ố i số m ặ c đ ị n h k h ô n g n h ấ t th iế t là m ộ t h ằ n g . C á c b iể u th ứ c tù y ý có
th ế đ ư ợ c s ử d ụ n g m iễ n là c á c b iế n đ ư ợ c d ù n g tro n g các b iế u th ứ c là c ó sẵ n
c h o p h ạ m v i đ ị n h n g h ĩ a h à m (v í d ụ , c á c b iế n to à n cụ c).
Q u i ư ớ c đ ư ợ c c h ấ p n h ậ n d à n h c h o c á c đ ố i số m ặ c đ ị n h là ch ỉ đ ị n h c h ú n g
tro n g các k h a i b á o h à m c h ứ k h ô n g ở tro n g đ ị n h n g h ĩ a h à m .
r
r
K h i m ộ t c h ư ơ n g trìn h đ ư ợ c th ự c th i d ư ớ i m ộ t h ệ đ iề u h à n h (n h ư là D O S h a y
U N IX ) n ó c ó th ể n h ậ n k h ô n g h a y n h iề u đ ố i số từ d ò n g lệ n h . C á c đ ố i số n à y
x u ấ t h iệ n sau tê n c h ư ơ n g trìn h c ó th ể th ự c th i v à đ ư ợ c p h â n c á c h b ở i cá c
k h o ả n g trắ n g . B ở i v ì c h ú n g x u ấ t h iệ n trê n c ù n g h à n g n ơ i m à cá c lệ n h c ủ a h ệ
đ iề u h à n h p h á t ra n ê n c h ú n g đ ư ợ c g ọ i là c á c đ ố i s ố h à n g lệ n h .
Chư ơ ng 4: Hàm
53
V í d ụ n h ư x e m x é t m ộ t c h ư ơ n g trìn h đ ư ợ c đ ặ t tê n là sum đ ế in r a tổ n g c ủ a
tậ p h ọ p c á c số đ ư ợ c c u n g c ấ p tớ i n ó n h ư là c á c đ ố i số h à n g lệ n h . H ộ p th o ạ i
4.1 m in h h ọ a h a i số đ ư ợ c tru y ề n n h ư là cá c đ ố i số tớ i h à m su m n h ư th ế n à o ($
là d ấ u n h ắ c U N IX ).
H ộ p t h o ạ i 4.1
’ 1 $ s u m 1 0 .4 12.5
2
3
22.9
$____________
C á c đ ố i số h à n g lệ n h đ ư ợ c tạ o r a s ẵ n c h o m ộ t c h ư ơ n g trìn h C + + th ô n g
q u a h à m m a in . C ó h a i các h đ ị n h n g h ĩ a m ộ t h à m m a in :
intmain(void);
int main (int argc, coast char* argvQ);
C á c h sau đ ư ợ c s ử d ụ n g k h i c h ư ơ n g trìn h đ ư ợ c
số h à n g lệ n h . T h a m số đ ầ u , argc, b iế u th ị số c á c
trìn h (b a o g ồ m cả tê n c ủ a c h ín h c h ư ơ n g trìn h ).
m ả n g c ủ a c á c h ằ n g c h u ồ i đ ạ i d iệ n c h o c á c đ ố i
tro n g h ộ p th o ạ i 4 .1 , c h ú n g ta có:
aigc
is
3
argv[0]
is
"sum"
arg v [lj
is
"10.4"
argv[2]
is
"12.5"
d ự tín h đ ể c h ấ p n h ậ n c á c đ ố i
đ ố i số đ ư ợ c tru y ề n tớ i c h ư ơ n g
T h a m số th ứ h a i, argv, là m ộ t
số . V í d ụ từ h à n g lệ n h đ ã ch o
D a n h s á c h 4 .4 m in h h ọ a m ộ t th i c ô n g đ ơ n g iả n c h o c h ư ơ n g trìn h tín h tổ n g
sum. C á c c h u ỗ i đ ư ợ c c h u y ế n đ ố i sa n g số
n g h ĩ a tro n g th ư v iệ n stdlibii
th ự c s ử
d ụ n g h à m atof đ ư ợ c đ ị n h
D a n h s á c h 4 .4
1
2
#inđude <iostnsamii>
# in đ u d e <stdlib.h>
3 int m ain (int aigc, const chai' *argvQ)
4 {
double s u m = 0 ;
5
f o r ( in ti= l ; i < a r g c ; - B ĩ )
6
su m + = atoffargv[T]);
7
8
c o u t« su m < < V ;
retu rn 0;
9
10 J __________________________
Chư ơ ng 4: Hàm
54
B à i tậ p c u ố i c h ư o n g 4
4.1
V iế t c h ư ơ n g trìn h tro n g b à i tậ p 1.1 v à 3.1 s ử
4 .2
C h ú n g ta có đ ị n h n g h ĩ a c ủ a h à m Swap sau
d ụ n g h àm .
void Swap (int X, int y)
{
in tte m p = x ;
x=y,
y = te m p ;
}
c h o b iế t g iá tr ị c ủ a X v à y sau k h i g ọ i h àm :
x=10;
y=20;
Swap(x,y);
4 .3
C h ư ơ n g trìn h sau x u ấ t ra k ế t q u ả g ì k h i đ ư ợ c th ự c th i?
#include <iostreamií>
char * str= "global";
void Print (char *str)
{
c o u t « s t r « V i ';
{
char *str="local";
c o irt« s tr« W ;
c o u t« ::s tr< < V ;
}
c o u t « s t r « V i ';
}
int m ain (void)
{
Print(Tarameter”);
return 0;
}
4 .4
V ie t h à m x u ấ t r a ta t c ả các số n g u y ê n tố từ
2 đ ế n n (n là số n g u y ê n d ư ơ n g );
void Primes (unsigned int n);
M ộ t sổ là số n g u y ê n tố n ế u n h ư n ó c h ỉ c h ia h ế t c h o c h ín h n ó v à 1.
4 .5
Đ ị n h n g h ĩ a m ộ t b á n g liệ t k ê g ọ i là M onth c h o tấ t c ả c á c th á n g tro n g n ă m v à sử
d ụ n g n ó đ ề đ ị n h n g h ĩ a m ộ t h à m n h ậ n m ộ t th á n g n h ư là m ộ t đ ố i số v à tr ả v ề
n ó n h ư là m ộ t h ằ n g ch u ồ i.
4 .6
Đ ị n h n g h ĩ a m ộ t h à m in lin e IsAlpha, h à m tr ả v ề k h á c 0 k h i th a m số
m ộ t k ý tự v à tr ả v ề 0 tro n g cá c trư ờ n g h ợ p k h á c .
Chư ơ ng 4: Hàm
c ủ a n ó là
55
4 .7
Đ ị n h n g h ĩ a m ộ t p h iê n b ả n đ ệ
ch ư ơ n g này.
q u i c ủ a h à m Pow er đ ã đ ư ợ c trìn h b à y tro n g
4 .8
V iế t m ộ t h à m tr ả v ề tổ n g c ủ a m ộ t d a n h s á c h c á c g iá tr ị th ự c
double Sum (int a double v a l...);
ừ o n g đ ó n b iể u th ị số lư ợ n g c á c g iá trị tro n g d a n h sách .
Chư ơ ng 4: Hàm
56
r
C h ư ơ n g 5.
M ả n g , c o n tr ỏ , th a m c h iê u
C h ư ơ n g n à y g iớ i th iệ u về m ả n g , c o n trỏ , các k iể u d ừ liệ u th am c h iế u v à m in h
h ọ a c á c h d ù n g ch ú n g đê đ ị n h n g h ĩ a các b iế n.
M ả n g (a rray ) g ồ m m ộ t tậ p các đố i tư ợ n g (đ ư ợ c g ọ i là c á c p h ầ n tử ) tấ t
c ả ch ú n g có cù n g k iể u v à đ ư ợ c sắ p x ế p liê n tiế p tro n g b ộ nhớ . N ó i ch u n g chỉ
có m ả n g là có tê n đạ i diệ n c h ứ k h ô n g p h ả i là các p h ầ n tử củ a nó. M ồ i p h ầ n tò
đ ư ợ c x ác đ ị n h b ở i m ộ t c h ỉ số b iể u th ị v ị trí c ủ a p h ầ n tử trong m ả ng, s ố lư ợ n g
p h ầ n tử tro n g m ả n g đư ợ c gọ i là k í c h t h ư ó ’c c ủ a m ả ng. K ích th ư ớ c c ủ a m ả n g
là cố đ ị n h v à p h ả i đư ợ c x á c đ ị n h trư ớ c; n ó k h ô n g th ể th a y đố i tro n g su ố t q u á
trìn h th ự c h iệ n ch ư ơ n g trình.
M ả n g đ ạ i d iệ n ch o d ữ liệ u h ồ n h ợ p g ồ m n h iề u h ạ n g m ụ c riê n g lẻ tư ơ n g
tự . V í dụ : d a n h sách các tên , b ả n g các th à n h p h ố trê n th ế giớ i c ù n g v ớ i n h iệ t
độ h iệ n tạ i c ủ a các chúng, h o ặ c các g ia o dị ch h à n g th á n g củ a m ộ t tà i k h o ả n
n g â n h àng.
C o n tr õ (p o in te r) đ o n g iả n là đ ị a chỉ c ủ a m ộ t đ ố i tư ợ n g tro n g b ộ nhớ .
T h ô n g th ư ờ n g , các đ ố i tư ợ n g có th ể đ ư ợ c tru y x u ấ t tro n g hai cách: trự c tiế p
b ở i tê n đ ạ i d iệ n h o ặ c gián tiế p th ô n g q u a co n trỏ . C ác b iế n co n trỏ đ ư ợ c đ ị n h
n g h ĩ a trỏ tớ i các đố i tư ợ n g c ủ a m ộ t k iể u cụ th ế sao ch o khi co n ừ ỏ h ủ y thì
v ù n g n h ớ m à đ ố i tư ợ n g ch iế m g iữ đ ư ợ c th u hồ i.
C ác c o n trỏ th ư ờ n g đ ư ợ c d ù n g cho v iệ c tạ o ra các đ ố i t ư ợ n g đ ộ n g tro n g
th ờ i g ian th ự c th i ch ư ơ n g trình. K h ô n g g iố n g n h ư các đố i tư ợ n g b ìn h th ư ờ n g
(to à n cụ c v à cụ c b ộ ) đư ợ c cấ p p h á t lư u trừ trê n ru n tim e stack, m ộ t đ ố i tư ợ n g
đ ộ n g đ ư ợ c cấ p p h á t vùn g n h ớ từ v ù n g lư u trữ k h ác đ ư ợ c gọ i là h e a p . C ác đố i
tư ợ n g k h ô n g tu â n th e o các lu ậ t p h ạ m vi th ô n g th ư ờ n g . P h ạ m vi c ủ a ch ú n g
đ ư ợ c đ iề u k h iể n rõ ràn g b ở i lậ p trìn h viên.
T h a m c h iế u (referen c e) cu n g cấ p m ộ t tê n tư ợ n g trư n g k h ác gọ i là b iệ t
h iệ u (alias) c h o m ộ t đố i tư ợ n g . T ru y x u ấ t m ộ t đố i tư ợ n g th ô n g q u a m ộ t th a m
ch iế u g iố n g n h ư là tru y x u ấ t th ô n g q u a tê n gố c củ a nó. T h am ch iế u n â n g cao
tín h h ữ u d ụ n g c ủ a các co n trỏ v à sự tiệ n lợ i c ủ a v iệ c tru y x u ấ t trự c tiế p các
đ ố i tư ợ n g . C h ú n g đ ư ợ c sử d ụ n g đ ế h ồ trợ cá c k iế u gọ i th ô n g q u a th a m ch iế u
c ủ a các th a m số h à m đặ c b iệ t k h i các đ ố i tư ợ n g lớ n đ ư ợ c tru y ề n tó i hàm .
Chapter 5: Mả ng, con trỏ , và tham chiế u
59
5 .1 . M ả n g ( A r r a y )
B iế n m ả n g đ ư ợ c đ ị n h n g h ĩ a b ằ n g c á c h đ ặ c tả k íc h th ư ớ c m ả n g v à k iể u các
p h ầ n tử c ủ a nó. V í dụ m ộ t m ả n g b iể u d iễ n 10 th ư ớ c đ o chiề u cao (m ỗ i p h ầ n
tử là m ộ t số n g u y ê n ) có th ể đ ư ợ c đ ị n h n g h ĩ a n h ư sau :
intheights[10];
M ồ i p h ầ n tử tro n g m ả n g có th ế đ ư ợ c tru y x u ấ t th ô n g q u a chi số m ả ng. P h ầ n
tử đ ầ u tiê n c ủ a m ả n g luôn có c h ỉ số 0. V ì th ế , hcights[0] v à heights[9Ị b iể u th ị
tư ơ n g ứ n g ch o p h ầ n tử đầ u v à p h ầ n tử c u ố i c ủ a m ả n g hdghts. M ồ i p h ầ n tử củ a
m ả n g hàghts có th ể đư ợ c x e m n h ư là m ộ t b iế n số n g u y ê n . V ì thế , v í dụ đ ế đ ặ t
p h ầ n tử th ứ b a tớ i g iá trị 177 c h ú n g ta có th ể viế t:
heights[2] = 177;
V iệ c cố g ắ n g tru y xu ấ t m ộ t p h ầ n tử m ả n g k h ô n g tồ n tạ i (v í dụ , heights[-l]
h o ặ c heights[10]) d ẫ n tớ i lỗ i th ự c th i rấ t n g h iê m trọ n g (đư ợ c gọ i là lỗ i ‘v ư ợ t
n g o ài b iê n ’).
V iệ c x ử lý m ả n g th ư ờ n g liên q u an đ ế n m ộ t v ò n g lặ p d u y ệ t q u a các p h ầ n
tử m ả n g lầ n lư ợ t từ n g p h ầ n tử m ộ t. D a n h sách 5.1 m in h họ a đ iề u n à y b ằ n g
v iệ c sử d ụ n g m ộ t h à m n h ậ n v à o m ộ t m ả n g các số n g u y ên v à trả v ề g iá trị
tru n g b ìn h củ a các p h ầ n tử tro n g m ả ng.
D a n h s á c h 5 .1
1
const int size = 3;
2
3
4
double Average (int nums[size])
{
double average=0;
for (register i =0; i < size; ++i)
average -H=nums[i];
return average/size;
_L
G iố n g n h ư các b iế n k h ác, m ộ t m ả n g có th ế có m ộ t b ộ k h ỏ i t ạ o . C ác dấ u
n g o ặ c n h ọ n đ ư ợ c sử dụ ng đ ế đặ c tả d a n h sách các g iá trị khở i tạ o đ ư ợ c p h â n
các h b ở i dấ u p h ấ y c h o các p h ầ n tử m ả n g . V í dụ ,
intnum s[3]= {5,10,15};
k h ở i tạ o b a p h ầ n tử củ a m ả n g nums tư ơ n g ứ n g tớ i 5, 10, v à 15. K h i số g iá trị
tro n g b ộ k h ở i tạ o n h ỏ hơ n số p h ầ n tử th ì các p h ầ n tử c ò n lạ i đ ư ợ c k h ở i tạ o tớ i
0:
int nums[3] = {5,10};
// nums[2] khỏ i tạ o tói 0
Chapter 5: Mả ng, con trỏ , và tham chiế u
60
K lii b ộ k h ở i tạ o đư ợ c sử d ụ n g h o à n tấ t th ì k íc h c ỡ m ả n g trở th à n h dư
th ừ a b ở i v ì số các p h ầ n tử là ấ n tro n g b ộ k h ở i tạ o. V ì th ế đị nh n g h ĩ a đ ầ u tiê n
c ủ a nums có th ế v iế t tư ơ n g đ ư ơ n g n h ư sau:
intnums[] = {5,10,15};
//khôngcầ n khai báo tuờ ng minh
// kích cỡ củ a mang
M ộ t tìn h h u ố n g khác m à k íc h c ỡ có th ế đ ư ợ c b ỏ q u a đố i v ớ i m ả n g th a m
số hàm . V í dụ , h à m Average ở trê n có th ể đ ư ợ c cả i tiế n b ằ n g các h v iế t lạ i nó
sao ch o k íc h c ỡ m ả n g nums k h ô n g cố đ ị n h tớ i m ộ t h ằ n g m à đ ư ợ c ch ỉ đ ị n h
b à n g m ộ t th a m số th ê m v ào . D an h sách 5.2 m in h h ọ a đ iề u này.
D a n h s á c h 5 .2
1
2
3
double Average (int numsQ, int size)
{
double average=0;
for (register i =0; i < size; ++i)
4
average += nums[i];
5
6
return average/size;
7 J _________________________
M ộ t ch u ỗ i C + + c h ỉ là m ộ t m ả n g các k ý tự . V í dụ ,
char S t r 0 = "HELLO";
đ ị n h n g h ĩ a ch u ồ i sfr là m ộ t m ả n g c ủ a 6 k ý tự : n ăm c h ữ cá i v à m ộ t k ý tự
K ý tự k ế t th ú c n u ll đ ư ợ c c h èn v à o b ở i trìn h b iê n dị ch. T rái lạ i,
nu ll.
char strQ = {Tí, 'E', U, U, 'O'};
đ ị n h n g h ĩ a str là m ả n g củ a 5 k ý tự .
K íc h c ỡ c ủ a m ả n g có th ể đ ư ợ c tín h m ộ t cá c h d ễ d àng n h ờ v à o to à n tử
sizeof. V í dụ , v ớ i m ả n g ar đ ã ch o m à k iể u p h ầ n tử củ a n ó là Type th ì k íc h cỡ
c ủ a ar là:
sizeof(ar) / sizeof(Type)
5 .2 . M ả n g đ a c h iề u
M ả n g có th ể có h ơ n m ộ t ch iề u (n g h ĩ a là, h ai, b a, h o ặ c cao h ơ n .V iệ c tố chứ c
m ả n g tro n g b ộ n h ớ th ì cũ n g tư ơ n g tự k h ô n g có gì th a y đổ i (m ộ t ch u ồ i liên
tiế p các p h ầ n tử ) n h ư n g cá c h tổ ch ứ c m à lậ p trìn h v iê n có th ế lĩ n h h ộ i đ ư ợ c
th ì lạ i k hác. V í dụ ch ú n g ta m u ố n b iế u d iễ n n h iệ t độ tru n g b ìn h th e o từ n g m ù a
ch o b a th à n h p h ố c h ín h c ủ a ú c (x e m B ả n g 5.1).
Chapter 5: Mả ng, con trỏ , và tham chiế u
61
B ả n g 5 .1
N h iệ t đ ộ
tr u n g b ìn h th e o m ù a .
Mùa xuân
26
24
28
Sydney
M elbourne
Brisbane
M ùa hè
34
32
38
M ùa thu
22
19
25
Mùa đông
17
13
20
Đ iề u n à y có th ể đ ư ợ c biể u d iễ n b ằ n g m ộ t m ả n g h ai ch iề u m à m ồ i p h ầ n tò
m ả n g là m ộ t số nguyên:
int
seasonTemp[3][4];
C á c h tổ c h ứ c m ả n g này tro n g b ộ n h ớ n h ư là 12 p h ầ n tử số n g u y ê n liê n tiế p
nh au . T u y n h iê n , lậ p trìn h v iê n có th ế tư ở n g tư ợ n g n ó n h ư là m ộ t m ả n g g ồ m
b a h à n g v ớ i m ỗ i h à n g có b ố n p h ầ n tử số n g u y ê n (x e m H ìn h 5.1).
H ì n h 5 .1
C á c h tồ
ch ứ c sea so n T em p tr o n g b ộ
26 1 34 1 22
17
24 I 32 I 19
h à n g đầ u
n h ỏ '.
13
28 I 38 I 25
h à n g hai
20
hàng ba
N h ư trư ớ c, các p hầ n tử đ ư ợ c tru y x u ấ t th ô n g q u a chỉ số m ả n g . M ộ t ch ỉ số
riê n g b iệ t đ ư ợ c cầ n cho m ỗ i m ả ng. V í dụ , n h iệ t đ ộ m ù a hè tru n g b ìn h củ a
th à n h p h ố S y d n e y (h àn g đầ u tiê n cộ t th ứ h ai) đ ư ợ c cho b ở i seasonTemp[0][l].
M ả n g có th ế
n h au :
đ ư ợ c k h ở i tạ o b ằ n g c á c h sử
dụ ng m ộ t bộ
k h ỏ i tạ o lồ n g
int seasonTemp[3][4] = {
{26,34.22,17},
{24,32,19,13},
{28,38,25,20}
};
B ở i vì đ iề u n à y án h x ạ tớ i m ả n g m ộ t ch iề u g ồ m 12 p h ầ n tử tro n g b ộ n h ớ n ê n
nó tư ơ n g đ ư ơ n g vớ i:
int seasonTemp[3][4] = {
26,34,22,17,24,32,19,13,28,38,25,20
};
B ộ k h ở i tạ o lồ n g n h au đ ư ợ c ư a c h u ộ n g h ơ n b ở i vì n ó linh h o ạ t v à dồ h iế u
hơ n. V í dụ , n ó có th ế khở i tạ o chỉ p h ầ n tử đ ầ u tiê n c ủ a m ồ i h à n g v à p h ầ n còn
lạ i m ặ c đ ị n h là 0:
intseasonTemp[3][4] = {{26}, {24}, {28}};
C h ú n g ta cũ n g có th ế bỏ qua ch iề u đ ầ u tiên v à đ ể c h o n ó đ ư ợ c d ẫ n x u ấ t từ
k h ở i tạ o:
bộ
int seasonTemp[j[4] = {
{26,34,22,17},
{24,32,19,13),
Chapter 5: Mả ng, con trỏ , và tham chiế u
62
{28,38,25,20}
};
X ử lý m ả n g n h iề u ch iề u th ì tư ơ n g tự n h ư là m ả n g m ộ t ch iề u n h ư n g p h ả i
x ử lý các v ò n g lặ p lồ ng n h a u th a y v ì v ò n ậ lặ p đ o n . D an h sách 5.3 m in h h ọ a
đ iề u n à y b ằ n g các h trìn h b à y m ộ t h à m đ ể tìm n h iệ t đ ộ cao n h ấ t tro n g m ả n g
seasonTemp.
D a n h s á c h 5 .3
2
1
coast introws
const int columns
3
int seasonTemp[rows][columas] = {
{26,34,22,17},
{24,32,19,13},
{28,38,25,20}
4
5
6
7
8
9
10
11
12
13
14
15
16
=3;
=4;
};
int HighestTemp (int temp[nows][columns])
{
int
highest=0;
for (register i =0; i < rows; -Hi)
for (registerj = 0; j < columns; ++j)
if (temp[i][j] > highest)
highest=temp[i][j];
return highest;
i ______________________________
5 .3 . C o n tr ỏ
C o n trỏ đ o n g iả n c h ỉ là đị a chỉ c ủ a m ộ t v ị trí b ộ n h ớ v à cư ng cấ p c á c h g iá n
tiế p đ ế tru y x u ấ t d ữ liệ u tro n g b ộ n h ớ . B iế n co n trỏ đ ư ợ c đị nh n g h ĩ a đ ể “trỏ
tớ i” d ữ liệ u th u ộ c k iể u dữ liệ u cụ thể . V í dụ ,
int
char
*ptrl;
*ptr2;
//trỏ tớ i mộ t int
// tó tớ i mộ t char
Giá trị củ a m ộ t biế n c o n trỏ là đ ị a ch ỉ m à n ó trỏ tớ i. V í dụ , v ớ i các đ ị n h
n g h ĩ a đ ã có v à
ÚTt
num;
c h ú n g ta có th ể v iế t:
ptrl =#
K ý h iệ u & là to á n tử l ấ y đ ị a c h ỉ ; nó n h ậ n m ộ t b iế n n h ư là m ộ t đ ố i số v à
trả v ề đ ị a ch ỉ b ộ n h ớ củ a b iế n đó. T á c đ ộ n g c ủ a v iệ c g án trên là đ ị a chỉ củ a
Chapter 5: Mả ng, con trỏ , và tham chiế u
63
num đ ư ợ c k h ở i tạ o tớ i ptrl. V ì th ế , ch ú n g ta n ó i rằ n g ptrl trỏ tớ i num. H ình 5.2
m in h h ọ a sơ lư ợ c đ iề u này.
H ì n h 5 .2
M ộ t co n trỏ
số
n g u y ê n đ o n g iả n .
num
ptrl
V ớ i ptrl trỏ tớ i num th ì b iế u th ứ c * p trl n h ậ n g iá trị c ủ a b iế n ptrl trỏ tớ i v à
v ì th ế n ó tư ơ n g đ ư ơ n g vớ i num. K ý h iệ u * là to á n tử l ấ y g i á t r ị ; n ó n h ậ n con
trỏ n h ư m ộ t đ ố i số v à trả v ề n ộ i d u n g c ủ a vị trí m à c o n trỏ ữ ỏ tớ i.
T h ô n g th ư ờ n g th ì kiế u
tớ i. T u y n h iê n , m ộ t con trỏ
th ậ t th u ậ n tiệ n đ ế đ ị n h n g h ĩ a
k h ác n h a u h a y là các k iể u d ữ
C o n trỏ có th ể đ ư ợ c
ép
co n trỏ p h ả i k h ớ p v ớ
k iế u void* sẽ h ợ p v ớ
các c o n trỏ có th ể tr ổ
liệ u gố c k h ô n g đ ư ợ c
i k iế u d ữ liệ u m à đ ư ợ c trỏ
i tấ t cả các kiế u. Đ iề u n à y
đ ế n d ữ liệ u c ủ a n h ữ n g k iể u
b iế t.
(c h u y ể n k iể u ) th à n h m ộ t k iể u khác. V í dụ ,
ptr2=(char*)ptrl;
c h u y ế n co n trỏ ptrl th àn h c o n trỏ chai' trư ớ c k h i g án n ó tớ i con trỏ ptr2.
K h ô n g q u an tâ m đ ế n k iể u c ủ a n ó th ì c o n trỏ có th ể đ ư ợ c g án tớ i g iá trị
n u ll (g ọ i là c o n trỏ n u ll). C o n trở n u ll đ ư ợ c sử d ụ n g đ ể khở i tạ o ch o các con
ừ ỏ v à tạ o ra đ iể m k ế t thúc ch o các cấ u trú c d ự a trê n co n trỏ (ví dụ , d a n h sách
liê n kế t).
5 .4 . B ộ
nhớ
độ ng
N g o à i v ù n g n h ớ sta c k củ a c h ư ơ n g trìn h (th àn h p h ầ n đ ư ợ c sử d ụ n g đ ế lư u trữ
các b iế n to à n cụ c v à các k h u n g sta c k ch o các lờ i g ọ i h àm ), m ộ t v ù n g b ộ n h ớ
k h á c g ọ i là h e a p đ ư ợ c c u n g cap. H e a p đ ư ợ c sử d ụ n g cho v iệ c cấ p p h á t đ ộ n g
các k h ố i b ộ n h ớ tro n g thờ i g ia n th ự c th i c h ư ơ n g trìn h . V ì the h e a p cũ n g đ ư ợ c
g ọ i là b ộ n h ớ đ ộ n g (d y n am ic m e m o ry ). V ù n g n h ớ sta c k c ủ a ch ư ơ n g trìn h
cũ n g đ ư ợ c g ọ i là b ộ
n h ó ’ t ĩ n h (static m e m o ry ).
C ó h a i to á n tử đ ư ợ c sử d ụ n g ch o v iệ c cấ p p h á t v à thu hồ i các k h ố i b ộ n h ớ
trên h eap. T o án tử new n h ậ n m ộ t k iế u n h ư là m ộ t đ ố i số v à đư ợ c cấ p p h á t m ộ t
klioi bộ n h ớ ch o m ộ t đố i tư ợ n g c ủ a k iể u đó. N ó trả v ề m ộ t con trỏ tớ i klioi đ ã
đ ư ợ c cấ p p h át. V í dụ ,
int *ptr= new int;
char *str= new char[ 10];
cấ p p h á t tư ơ n g ứ n g m ộ t k h ố i ch o lư u trữ
ch o lư u trữ m ộ t m ả n g 10 k ý tự .
Chapter 5: Mả ng, con trỏ , và tham chiế u
m ộ t số n g u y ê n v à m ộ t k h ố i đ ủ
lớ n
64
B ộ nliớ đ ư ợ c cấ p p h át từ h e a p k h ô n g tu â n th e o lu ậ t p h ạ m v i n h ư các b iế n
th ô n g th ư ờ n g . V í dụ , trong
void Foo (void)
{
char *str=new char[10];
II...
}
k h i Foo trả v ề các b iế n cụ c b ộ str đ ư ợ c thu h ồ i n h ư n g các khố i b ộ n h ớ đ ư ợ c trỏ
tớ i b ờ i str th ì k h ô n g . C ác k h ố i b ộ n h ớ v ẫ n cò n ch o đ ế n khi c h ú n g đ ư ợ c giả i
p h ó n g rõ rà n g b ở i các lậ p trìn h viên.
T o á n tử delete đ ư ợ c sử d ụ n g đ ể g iả i p h ó n g các k h ố i bộ n h ớ đ ã đ ư ợ c cấ p
p h á t b ở i new. N ó n h ậ n m ộ t co n trỏ n h ư là đ ố i số v à giả i p h ó n g k h ố i b ộ n h ớ
m à nó trỏ tó i. V í dụ :
delete ptr,
delete [] str,
//xóamộ tđố ituọ ng
// xóa mộ t mả ng các đố i tuợ ng
C h ú ý rằ n g k h i khố i n h ớ đ ư ợ c x ó a là m ộ t m ả n g th ì m ộ t cặ p dấ u I] p h ả i
đ ư ợ c c h èn v ào đ ế chỉ đ ị n h c ô n g v iệ c n ày . S ự q u a n trọ n g sẽ đ ư ợ c g iả i th ích
sau đ ó khi c h ú n g ta thả o lu ậ n v ề lớ p.
T o á n tử delete n ên đư ợ c áp d ụ n g tớ i co n trỏ m à trỏ
đ ố i tư ợ n g đ ư ợ c cấ p p h át đ ộ n g (ví dụ , m ộ t b iế n trê n
n g h iê m trọ n g có th ể x ả y ra. H o à n to à n v ô h ạ i k h i áp
k h ô n g là con ừ ỏ .
C ác đ ố i tư ợ n g độ n g đ ư ợ c sử d ụ n g đ ể tạ o ra d ữ liệ
h à m tạ o ra ch ú n g . D anh sách 5.4 m in h h ọ a đ iề u n à y
h à m n h ậ n m ộ t th a m sổ chuỗ i v à trả v ề bả n sao c ủ a m ộ
tớ i b ấ t c ứ th ứ gì v ì m ộ t
stack), m ộ t lỗ i th ự c th i
d ụ n g delete tó i m ộ t b iế n
u k éo dài tớ i k h i lờ i gọ i
b ằ n g các h sử d ụ n g m ộ t
t chuỗ i.
D a n h s á c h 5 .4
#include <string.h>
char* CopyOf (coast char *str)
{
char *copy= new charfstrlen(str) +1 ];
2
3
4
strcpy(copy, str);
return copy,
5
6
7
}______________________________
C h ú g iả i
1
Đ â y là tậ p tin h e a d e r c h u ồ i ch u ẩ n k h ai b á o các d ạ n g h à m ch o th a o tác
ừ ê n chuồ i.
4
H à m strlcn (đ ư ợ c khai b á o tro n g th ư v iệ n string.h) đ ế m các k ý tự tro n g đố i
số ch u ồ i củ a n ó cho đ ế n (n h ư n g k h ô n g v ư ợ t q u á) k ý tự n u ll sau cù n g . B ở i
vì k ý tự n u ll k h ô n g đ ư ợ c tín h v à o tro n g v iệ c đ ế m n ê n ch ú n g ta cộ n g th ê m
1 tớ i tổ n g v à cấ p p h át m ộ t m ả n g k ý tự c ủ a k íc h th ư ớ c đó.
Chapter 5: Mả ng, con trỏ , và tham chiế u
65
5
H à m strcpy (đ ư ợ c k h ai b áo tro n g th ư v iệ n string.il) sao chép đ ố i số th ứ hai
đ ế n đ ố i số th ứ n h ấ t c ủ a n ó th e o từ n g k ý tự m ộ t b a o g ồ m lu ô n c ả k ý tự
n u ll sau cùng.
V ì tà i n g u y ê n b ộ n h ớ là có g iớ i h ạ n n ê n rấ t có th ể b ộ nhớ đ ộ n g có th ế bị
cạ n k iệ t tro n g th ờ i gian th ự c th i c h ư ơ n g trìn h , đ ặ c b iệ t là khi n h iề u k h ố i lớ n
đ ư ợ c cấ p p h á t v à k h ô n g có giả i p h ó n g . T o á n tò new k h ô n g th ế cấ p p h á t m ộ t
k h ố i có k íc h th ư ớ c đư ợ c y êu cầ u th ì n ó trả v ề 0. C h ín h lậ p trìn h v iê n p h ả i
ch ị u trá c h n h iệ m g iả i q u y ế t n h ữ n g v ấ n đ ề n ày . C ơ chế điề u k h iể n n g o ạ i lệ củ a
C + + c u n g cấ p m ộ t các h th ứ c th ự c tế g iả i q u y ế t n h ữ n g v ấ n đề n h ư thế .
5 .5 . T ín h to á n c o n tr ỏ
T ro n g C + + ch ú n g ta có th ế th ự c h iệ n cộ n g h a y trừ số n g u y ê n trên co n trỏ .
Đ iề u n à y th ư ờ n g x u y ên đ ư ợ c sử d ụ n g b ở i các lậ p trìn h v iê n đ ư ợ c gọ i là các
tín h to á n c o n trỏ . T ín h to á n co n trở th ì k h ô n g g iố n g n h ư là tín h to á n số
n g u y ê n b ở i v ì k ế t q u ả phụ th u ộ c v ào k íc h th ư ớ c củ a đố i tư ợ n g đ ư ợ c trỏ tớ i.
V í dụ , m ộ t k iể u int đ ư ợ c b iể u d iễ n b ở i 4 b y te. B â y g iờ chúng ta có
char *str="HE LL O";
int nunisQ = {10,20,30,40};
int *ptr=&nums[0];
// tó tớ i phầ n tử đầ u tiên
Str-M- tă n g str lê n m ộ t ch ar (n g h ĩ a là 1 b y te ) sao cho n ó trỏ tớ i k ỷ tự th ứ h ai củ a
ch u ỗ i "HELLO" n h ư n g ng ư ợ c lạ i ptr-H- tă n g ptr lên m ộ t int (n g h ĩ a là 4 b y te s)
sao cho n ó trỏ tớ i p h ầ n tử th ứ h ai c ủ a nums. H ìn h 5.3 m in h h ọ a sơ lư ợ c điề u
này.
T ín h to á n c o n tr ỏ .
H E L L 0 \0
str
. ow .
H ì n h 5 .3
10
30
40
_£Ỉ L
ptr+
str++
V ì th ế , các p h ầ n tư c ủ a ch u ỗ i "HELLO" có th ể đ ư ợ c th am k h ả o tớ i n h ư
*str, * (s tr+ 1), *(str+2), v ân g v â n g . T ư ơ n g tự , các p h ầ n tử củ a nums có th ế đ ư ợ c
th a m k h ả o tớ i n h ư *ptr, * (p tr+ 1), *(ptr+ 2 ), v à *(ptr+3).
M ộ t h ìn h th ứ c khác c ủ a tín h to á n con trỏ đ ư ợ c ch o p hép tro n g C + + liên
q u a n đ ế n trừ h ai c o n trỏ c ủ a c ù n g k iể u . V í dụ :
int *ptrl = &nums[l];
int*ptr2=&nums[3];
intn=ptr2-ptrl;
//nừ ủ tìiành2
Chapter 5: Mả ng, con trỏ , và tham chiế u
66
T ín h to á n co n trỏ cầ n k h é o léo k h i x ử lý các p h ầ n tử c ủ a m ả ng. D a n h
sách 5.5 trìn h b à y v í dụ m ộ t h à m sao c h ép c h u ồ i tư ơ n g tự n h ư h à m đ ị n h n g h ĩ a
sẵ n strcpy.
D a n h s á c h 5 .5
1
2
3
4
void CopyString (char *dest, char *src)
{
while (*dest++= *src++) ;
}
C h ú g iả i
3
Đ iề u k iệ n c ủ a v ò n g lặ p n à y g án n ộ i d u n g c ủ a c h u ỗ i src ch o n ộ i d u n g củ a
c h u ỗ i dest v à sau đó tă n g c ả h ai con trỏ . Đ iề u k iệ n n à y trở th à n h 0 k h i k ý
tự n u ll k ế t th ú c c ủ a chuồ i src đ ư ợ c c h ép tớ i ch u ồ i dest
M ộ t b iế n m ả n g (n h ư nums) c h ín h n ó là đ ị a c h ỉ c ủ a p h ầ n từ đầ u tiê n c ủ a m ả n g
m à n ó đ ạ i diệ n. V ì thế các p h ầ n tử c ủ a m ả n g nums c ũ n g có th ể đ ư ợ c th a m
k h ả o tớ i b ằ n g các h sử dụ n g tín h to á n c o n trở trê n nums, n g h ĩ a là numsỊ Ị ] tư ơ n g
đ ư ơ n g v ớ i *(nums + Ị ). K hác n h a u g iữ a nums v à ptr ở ch ồ niuns là m ộ t h ằ n g vì
th ế n ó k h ô n g th ể đ ư ợ c tạ o ra đ ế trỏ tớ i b ấ t c ứ th ứ gì n ữ a tro n g k h i ptr là m ộ t
b iế n v à có th ể đ ư ợ c tạ o ra đ ế trỏ tớ i các số n g u y ê n b ấ t kỳ .
D a n h sách 5.6 trìn h b à y h à m HighestTemp (đ ã đ ư ợ c trìn h b à y trư ớ c đó
tro n g D anh sách 5.3) có th ể đ ư ợ c cả i tiế n n h ư th ế n ào b ằ n g c á c h sử d ụ n g tínli
to á n co n trỏ .
D a n h s á c h 5 .6
1
3
int HighestTemp (const int *temp, const int rows, coast int columns)
{
int highest=0;
4
5
6
7
8
9
for (register i =0; i < rows; ++i)
for (registerj = 0; j < columns; -Hj)
if (*(temp+ i * columns + j) > highest)
highest= *(temp+ i * columns + j);
return highest;
1________ ____________________________________
2
C h ú g iả i
1
T h a y v ì tru y ề n m ộ t m ả n g tớ i h àm , c h ú n g ta tru y ề n m ộ t co n trỏ int v à hai
th a m số th ê m v à o đặ c tả k íc h cỡ c ủ a m ả ng. T h eo các h này th ì h à m k h ô n g
bị h ạ n ch ế tớ i m ộ t kích th ư ớ c m ả n g cụ thế .
6
B iế u th ứ c *(temp + i * columns + j ) tư ơ n g đ ư ơ n g v ớ i temp[i][j] tro n g p h iê n
b ả n h à m trư ớ c.
Chapter 5: Mả ng, con trỏ , và tham chiế u
67
H à m HighestTemp có th ế đ ư ợ c đ ơ n g iả n h ó a h ơ n nữ a b ằ n g c á c h x e m temp
n h ư là m ộ t m ả n g m ộ t chiề u củ a row * column số n g u y ên . Đ iề u n à y đ ư ợ c trìn h
b à y tro n g D a n h sách 5.7.
D a n h s á c h 5 .7
1
2
int HighestTemp (coast int *temp, coast int rows, coast int columns)
{
3
int
4
5
for (register i = 0 ; i < rows * columas; ++i)
if (*(tem p+ i) > highest)
highest= *(temp+ i);
return highest;
6
7
highest= 0 ;
8 J ______________________________________________
5 .6 . C o n tr ỏ
hàm
C h ú n g ta có th ế lấ y đ ị a ch ỉ m ộ t h à m v à lư u v à o tro n g m ộ t co n trỏ
đ ó c o n trỏ có th ế đ ư ợ c sử d ụ n g đ ế gọ i g iá n tiế p h àm . V í dụ ,
h àm . Sau
int (*CompareXcoast char*, coast char*);
đ ị n h n g h ĩ a m ộ t co n trỏ h à m tê n là Compare có th ể g i ữ đ ị a chỉ c ủ a b ấ t k ỳ h àm
nào n h ậ n h ai co n trỏ k ý tự h ằ n g n h ư là các đ ố i số v à trả v ề m ộ t số n g u y ên . V í
dụ h à m th ư v iệ n so sánh ch u ồ i stra n p th ự c h iệ n n h ư thế . V ì thế :
C om pare= &strcmp;
// Compare ừ ỏ tói h àm strcmp
T o á n tử & k h ô n g cầ n th iế t v à có th ế b ổ qua:
C om pare= strcmp;
//Com pare trò tói hàm strcmp
M ộ t lự a c h ọ n k h á c là con trở có th ể đ ư ợ c đ ị n h n g h ĩ a v à khở i tạ o m ộ t lầ n:
int (*CompareXcoast char*, coast char*)= strcmp;
K h i đ ị a chỉ h à m đư ợ c g á n tớ i co n trỏ h à m th ì h ai kiể u p h ả i k h ớ p vớ i
nhau. Đ ị n h n g h ĩ a trê n là h ọ p lệ b ở i v ì h à m strcmp c ó m ộ t n g u y ê n m ầ u h àm
k h ớ p v ớ i hàm .
int strcmp(const char*, coast char*);
V ớ i đ ị n h n g h ĩ a trên củ a Compare th ì h à m strcmp h o ặ c có th ế đ ư ợ c g ọ i trự c
tiế p h o ặ c có th ể đ ư ợ c gọ i g iá n tiế p th ô n g q u a Compare. B a lờ i gọ i h àm sau là
tư ơ n g đ ư ơ n g :
strcmp("Tom", 'Tim ");
(*Com pareX'Tom V Tim ");
Compare("Tom", "Tim");
// gọ i trự c tiế p
//gọ i gian tiế p
// gọ i gián tiep (ngắ n gọ n)
C á c h sử d ụ n g ch u n g c ủ a c o n trỏ h à m là tru y ề n n ó n h ư m ộ t đ ố i số tớ i m ộ t
h à m k h ác; b ở i v ì th ô n g th ư ờ n g các h à m sau y ê u cầ u các p h iê n b ả n k h ác n h au
c ủ a h à m trư ớ c tro n g các tìn h h u ố n g k h á c nh au . M ộ t ví dụ đỗ h iể u là h à m tìm
Chapter 5: Mả ng, con trỏ , và tham chiế u
68
k iế m nhị p h â n th ô n g qua m ộ t m ả n g sắ p x ế p các chuỗ i. H à m n ày có th ế sử
d ụ n g m ộ t h àm so sán h (n h ư là strcmp) đ ể so sán h c h u ỗ i tìm k iế m n g ư ợ c lạ i
ch u ồ i c ủ a m àng. Đ iề u n ày có th ể k h ô n g th íc h h ợ p đ ố i vớ i tấ t c ả các trư ờ n g
h ợ p . V í dụ , h à m strcmp là p h â n b iệ t c h ữ h o a h a y c h ữ th ư ờ ng. N e u c h ú n g ta
th ự c h iệ n tìm k iế m theo cá c h k h ô n g p h â n b iệ t d ạ n g c h ữ sau đ ó m ộ t h à m so
sánh k h ác sẽ đ ư ợ c cầ n.
N h ư đ ư ợ c trìn h bày tro n g D a n h sách 5.8 b ằ n g c á c h để ch o h à m so sánh
m ộ t th a m số c ủ a h à m tìm k iế m , c h ú n g ta có th ế làm ch o h àm tìm k iế m độ c
lậ p v ớ i h à m so sánh.
D a n h s á c h 5 .8
1
2
int BinSearch (char *item, char *tableQ, int ạ
int (*CompareXconst char*, coast char*))
3
{
in tb o t= 0 ;
in t to p = n - 1;
intm id,cm p;
4
5
6
while (bot<= top) {
m id = (b o t+ to p )/2 ;
7
8
9
if ((cm p = Compare(item,table[mid]))
10
return mid;
11
eLseif(cm p<0)
to p = m id - l;
else
b o t= m id + l;
12
13
14
15
}
16
17
retum -1;
0)
//tr a v e c h is o h a n g g m u c
/ / gioi hạ n tim kiern toi nua thap hon
//gioi han tim kiem toi nua cao hon
(1
.
//khong tim thay
C h ú g iả i
1
T ìm k iế m nhị p h â n là m ộ t g iả i th u ậ t n ổ i tiế n g đ ể tìm k iế m th ô n g q u a m ộ t
d a n h sách các h ạ n g m ụ c đ ã đ ư ợ c sắ p xế p. D a n h sách tìm k iế m đ ư ợ c b iể u
d iễ n bở i table - m ộ t m ả n g các ch u ồ i có k íc h th ư ớ c a H ạ ng m ụ c tìm k iế m
đ ư ợ c b iế u th ị b ở i item.
2
Compare là c o n trỏ h àm đ ư ợ c sử d ụ n g đ ể so sán h item v ớ i các p h ầ n tử
m ả ng.
7
Ớ
củ a
m ồ i v ò n g lặ p, v iệ c tìm k iế m đ ư ợ c g iả m đi p h â n nữ a. Đ iề u n à y đ ư ợ c
lặ p lạ i ch o tớ i k h i hai đ ầ u tìm k iế m giao n h au (đ ư ợ c biể u th ị b ở i bot v à
top) h o ặ c ch o tớ i khi m ộ t so k h ớ p đ ư ợ c tìm thấ y.
9
H ạ n g m ụ c đ ư ợ c so sán h v ớ i m ụ c ở g iữ a c ủ a m ả ng.
10
N e u item k h ớ p v ớ i h ạ n g m ụ c g iữ a th ì trả v ề chi m ụ c củ a p h ầ n sau.
11
N eu item n h ỏ h o n h ạ ng m ụ c g iữ a th ì sau đ ó tìm k iế m đ ư ợ c g iớ i h ạ n tớ i
n ữ a th ấ p h ơ n c ủ a m ả ng.
14
N e u item lớ n h ơ n h ạ n g m ụ c g iữ a th ì sau đ ó tìm k iế m đ ư ợ c g iớ i h ạ n tớ i
n ữ a cao h ơ n củ a m áng..
Chapter 5: Mả ng, con trỏ , và tham chiế u
69
16
T rả v ề -1 đ ế chỉ đị nh rằ n g k h ô n g có m ộ t h ạ n g m ụ c so khớ p.
V í dụ sau trìn h b ày h àm BinScarch có th ể đ ư ợ c gọ i v ớ i strcmp đ ư ợ c tru y ề n
n h ư h à m so sán h n h ư thế nào:
char*cities[] = {"Boston", "London", "Sydney", ’Tokyo"};
cout« BinSearehfSydney", cities, 4, strcm p)« Vi';
Đ iề u n à y sẽ x u ấ t ra 2 n h ư đ ư ợ c m o n g đ ợ i.
5 .7 . T h a m c h iế u
M ộ t th a m ch iế u (referen c e) là m ộ t b iệ t h iệ u (alias) ch o m ộ t đ ố i tư ợ n g . K ý
h iệ u đ ư ợ c d ù n g ch o đị nh n g h ĩ a th a m c h iế u th ì tư ơ n g tự v ớ i k ý h iệ u d ù n g cho
c o n trỏ n g o ạ i trừ & đư ợ c sử d ụ n g th a y vì *. V í dụ ,
double num l =3.14;
double & num 2= n u m l;
// num2 là m ộ t tham chiêu tói num 1
đ ị n h n g h ĩ a num2 n h ư là m ộ t th a m ch iế u tớ i num l. Sau đị nh n g h ĩ a n à y c ả hai
num l v à num2 th a m k hả o tớ i cù n g m ộ t đố i tư ợ n g n h ư th ế ch ú n g là cù n g b iế n .
C ầ n b iế t rõ là m ộ t th a m c h iế u k h ô n g tạ o ra m ộ t b ả n sao c ủ a m ộ t đ ố i tư ợ n g m à
ch ỉ đ ơ n th u ầ n là m ộ t b iệ t h iệ u ch o nó. V ì v ậ y , sau p h é p gán
num l =0.16;
c ả h ai num l v à num2 sẽ biể u th ị g iá trị 0.16.
M ộ t th a m ch iế u ph ả i lu ô n đ ư ự c k h ở i tạ o k h i n ó đư ự c đ ị n h nghĩ a : n ó là
m ộ t b iệ t d a n h ch o cái gì đó. V iệ c đ ị n h n g h ĩ a m ộ t th a m chiế u rồ i sau đ ó m ớ i
k h ở i tạ o n ó là k h ô n g đ ú n g lu ậ t.
double &num3; // không đung luậ t: tham chiế u không có khỏ i tạ o
n u m 3 = n u in l;
B ạ n cũ n g có th ế khở i tạ o th a m ch iế u tớ i m ộ t h ằ n g . T ro n g trư ờ n g h ợ p
n ày , m ộ t b ả n sao c ủ a h ằ n g đ ư ợ c tạ o ra (sau k hi b ấ t k ỳ sự c h u y ể n k iế u cầ n
th iế t n à o đ ó ) v à th a m chiế u đ ư ợ c th iế t lậ p đ ế th a m ch iế u tớ i b ả n sao đó.
in t& n = l;
// n th am khả o tói bả n sao củ a 1
L ý do m à n lạ i th a m chiế u tớ i b ả n sao c ủ a 1 h ơ n là th a m chiế u tớ i c h ín h 1 là
sự an toàn. B ạ n hãy x em x é l đ iề u gì sẽ xả y ra Irơ ng Irư ừ ng hự p sau:
in t& x = l;
-H-x;
in ty = x + 1;
1 ở h à n g đ ầ u tiê n v à 1 ở h à n g th ứ b a g iố n g n h au là c ù n g đố i tư ợ n g (hầ u h ế t
các trìn h b iê n d ị c h th ự c h iệ n tố i ư u h ằ n g v à cấ p p h á t cả hai 1 tro n g cù n g m ộ t
v ị trí b ộ nhớ ). V ì th ế ch ú n g ta m o n g đợ i y là 3 n h ư n g nó có th ể c h u y ể n th à n h
Chapter 5: Mả ng, con trỏ , và tham chiế u
70
4. T u y n h iê n , b ằ n g các h ép b u ộ c X là m ộ t b ả n sao c ủ a 1 nên trình b iê n d ị c h
đ ả m b ả o rằ n g đ ố i tư ợ n g đ ư ợ c b iể u th ị b ở i X sẽ k h ác v ớ i cá hai 1.
V iệ c sử d ụ n g ch u n g n h ấ t c ủ a th a m ch iế u là cho các th a m số c ủ a hàm .
C ác th a m sổ củ a h àm th ư ờ n g là m ch o dỗ d àn g k iế u tru y ề n -b ằ n g -th a m chiế u,
trá i v ớ i k iề u tru y ề n -b ằ n g -g iá trị m à c h ú n g ta sử d ụ n g đ ế n thòi đ iể m này. Đ ế
q u a n sát sự k h ác n h a u hãy x e m x é t b a h à m sw ap tro n g D anh sách 5.9.
D a n h s á c h 5 .9
1
2
3
void Swapl (intx, inty)
{
in ttem p = x ;
4
x = y,
5
y = tem p ;
6
I
7
void Swap2 (int *x, int *y)
8
{
// truyên băng trị (đôi tuọ ng)
// truyề n bằ ng đị a chỉ (con trò)
in ttem p= *x;
*x = *y,
*y=tem p;
9
10
11
12
}
13
void Swap3 (int &x, int &y)
// truyề n bằ ng tham chiế u
14
15
16
17
18
in ttem p = x ;
x = y,
y = tem p ;
!
C h ú g iả i
1
M ặ c dù Swapl ch u y ế n đ ố i X v à y, đ iề u n à y k h ô n g ả n h h ư ở n g tớ i các đố i
số đ ư ợ c tru y ề n tớ i h àm b ở i v ì Swapl n h ậ n m ộ t bả n sao c ủ a các đ ố i số .
N h ữ n g th a y đ ố i trên b ả n sao th ì k h ô n g ả n h h ư ở n g đ ế n dữ liệ u gố c.
7
Swap2 v ư ợ t q u a vấ n đ ề c ủ a Swapl b ằ n g các h sử d ụ n g các th a m số c o n trỏ
đ ể th a y thế . T h ô n g q u a giả i th a m k h ả o (d e re fe re n c in g ) các con trỏ Swap2
lấ y g iá trị gố c v à ch u y ể n đ ổ i chúng.
13
Swap3 v ư ợ t q u a vấ n đ ề c ủ a Swapl b ằ n g c á c h sử d ụ n g các th a m số th a m
ch iế u đ ể th a y thế . C ác th a m số trở th à n h cá c b iệ t d anh ch o các đ ố i số
đ ư ợ c tru y ề n tớ i h àm v à v ì th ế ch u y ế n đ ố i ch ú n g k h i cầ n.
Swap3 có th u ậ n lợ i th ê m , cú p h á p g ọ i củ a n ó g iố n g n h ư Swapl v à k h ô n g
có liê n q u a n đ ế n đ ị n h đ ị a ch ỉ (ad d re ssin g ) h a y là giả i th a m k h ả o
(d e re fe re n c in g ). H à m main sau m in h h ọ a sự k h ác n h a u giữ a các lờ i gọ i h àm
S w a p l, S w ap 2 , v à Sw ap3.
int main (void)
{
in ti= 10, j =20;
Swapl(Cj);
cout« i « " « j « V;
Swap2(&i,&j); cout« i «
Chapter 5: Mả ng, con trỏ , và tham chiế u
"," « j «
Vi';
71
Swap3(i,j);
cout«
i«
"« j «
V;
}
K hi c h ạ y ch ư ơ n g trìn h sẽ ch o k ế t q u ả sau:
10,20
20,10
20, 10
5 .8 . Đ ị n h n g h ĩa k iể u
T y p e d e f là cú p h á p đ ể m ở đ ầ u ch o các tê n tư ợ n g trư n g cho các k iể u d ữ liệ u.
N h ư là m ộ t th a m chiế u đ ị n h n g h ĩ a m ộ t b iệ t d an h ch o m ộ t đố i tư ợ n g , m ộ t
ty p e d e f đ ị n h n g h ĩ a m ộ t b iệ t d a n h ch o m ộ t k iể u . M ụ c đ íc h cơ b ả n củ a n ó là đế
đ ơ n g iả n h ó a các k h ai b á o k iể u p h ứ c tạ p k h ác n h ư m ộ t sự trợ g iú p đ ể cả i
th iệ n k h ả n ă n g đọ c. Ớ đây là m ộ t v à i v í dụ :
typedef char *String;
typedef charName[12];
typedef unsigned int uint;
T ác d ụ n g c ủ a các đ ị n h n g h ĩ a n à y là String trở th à n h m ộ t b iệ t d a n h c h o char*,
N am e trở th à n h m ộ t b iệ t d a n h ch o m ộ t m á n g g ồ m 12 char, v à uint trở th à n h
m ộ t b iệ t d a n h ch o unsigned int. V ì thế :
String
N am e
uint n;
str,
name;
// thì tuong tự như ; ch a ' *str,
// thì tuung tự như : char name[ 12];
// thì tuong tự như ; unsigned int n;
K h ai b áo p h ứ c tạ p củ a Compare tro n g D a n h sách 5.8 là m ộ t m in h h ọ a tố t
ch o ty p ed ef:
typedef int (*CompareXconst char*, const char*);
int BinSearch (char *item, char *tableQ, int n, Compare comp)
{
//...
if ((cm p= comp(item, table[mid]))= 0 )
return mid;
II...
}
ty p e d e f m ở đầ u Compare n h ư là m ộ t tê n k iế u m ớ i ch o b ấ t kỳ h à m v ớ i n g u y ê n
m ẫ u (p ro to ty p e ) cho trư ớ c. N g ư ờ i ta ch o ràn g đ iề u n à y làm ch o d ấ u h iệ u c ủ a
BinScarch đ ơ n g iả n hơ n.
Chapter 5: Mả ng, con trỏ , và tham chiế u
72
B à i tậ p c u ố i c h ư o n g 5
5.1
Đ ị n h n g h ĩ a h ai h à m tư ơ n g ứ n g th ự c h iệ n n h ậ p v ào các g iá trị ch o các p h ầ n tử
c ủ a m ả n g v à x u ấ t các p h ầ n tử c ủ a m ả ng:
void ReadArray (double nums[], coast int size);
void WriteArray (double numsỊ ], coast int size);
5.2
Đ ị n h n g h ĩ a m ộ t h à m đả o n g ư ợ c th ứ tự
các p h à n tò củ a m ộ t m ả ng số thự c:
void Reverse (double numsỊ ], coast int size);
5.3
B ả n g sau đ ặ c tả các nộ i d u n g c h ín h c ủ a b ố n loạ i h à n g c ủ a các n g ũ cố c đ iể m
tâm . Đ ị n h n g h ĩ a m ộ t m án g h a i ch iề u đ ể b ắ t d ữ liệ u n ày:
Sơ
Top Flake
C om abix
Oatabix
Ultrabran
Đư ờ ng
Béo
16g
12.U
22g
28g
32g
8g
- ĩllliÉ
1 ■ ..............
Muố i
0.4g
0.3g
0.5g
0.2g
V iế t m ộ t h à m x u ấ t b ả n g n à y từ n g p h ầ n tử m ộ t.
5.4
Đ ị n h n g h ĩ a m ộ t h à m để n h ậ p v à o d a n h sách các tê n v à lư u trữ c h ú n g n h ư
các ch u ồ i đ ư ợ c cấ p p h át đ ộ n g tro n g m ộ t m ả n g v à m ộ t h à m để x u ấ t chúng:
là
void ReadNames (char *names[], coast int size);
void WriteNames (chai' *names[|, coast int size);
V ie t m ộ t h à m k h á c đ ể sắ p x ế p d a n h sách b ằ n g c á c h sử
x ế p n ổ i b ọ t (b u b b le sort):
dụ n g g iả i th u ậ t sắ p
void BubbleSort (char *names[], coast int size);
S ap x ế p n ố i b ọ t liên q uan đ ế n v iệ c q u é t lặ p lạ i d an h sách, ư o n g đ ó tro n g k hi
th ự c h iệ n q u é t các h ạ n g m ụ c k ề n h a u đ ư ợ c so sán h v à đổ i chỗ n ế u k h ô n g th e o
th ứ tự . Q u é t m à k h ô n g liê n q u a n đ ế n v iệ c đổ i ch ỗ ch ỉ ra rằ ng d a n h sách đ ã
đ ư ợ c sắ p x ế p th ứ tự .
5.5
V iế t lạ i h à m sau b à n g cách sử d ụ n g tín h to á n c o n trỏ :
char* ReverseString (char *str)
{
intlen=strlen(str);
char *result= new chaiflen + 1 ];
for (register i = 0 ; i < len; -Hi)
result[i] = s tr p e n - i- 1];
resuftflen] - \0';
return result;
}
Chapter 5: Mả ng, con trỏ , và tham chiế u
73
5.6 V iế t lạ i g iả i th u ậ t B u b b le S o rt (từ b à i 5.4) sao ch o nó sử dụ ng m ộ t c o n trỏ h àm
đ ể so sán h các tên.
5.7
V iế t lạ i các m ã sau b ằ n g cá c h sử d ụ n g đ ị n h n g h ĩ a k iể u :
void (*SwapXdouble, double);
char*table[|;
char*&nam e;
usigned long *vahies[10][20];
Chapter 5: Mả ng, con trỏ , và tham chiế u
74
r
C h ư ơ n g 6. L ậ p trình h ư ớ n g đôi tư ợ n g
C hư ơ ng n ày giớ i thiệ u nhữ ng khái niệ m cơ b ả n trong lậ p trình hư ớ ng đố i
tư ợ ng. C ác khái niệ m cơ b ả n nh ư lớ p, đố i tư ợ ng, thuộ c tính, phư ơ ng thứ c,
thông điệ p, v à quan hệ củ a chúng sẽ đư ợ c tháo luậ n trong phầ n này. T hêm
vào đó là sự trình b ày củ a nhữ ng đặ c điế m quan trọ ng trong lậ p trình hư ớ ng
đố i tư ợ ng nh ư tính bao gói, tính thừ a kế , tính đa hình,., nhằ m giúp ngư ờ i họ c
có cái nhìn tổ ng quát về lậ p trình hư ớ ng đố i tư ợ ng.
6.1. G ió i th iệ u
•
H ư ớ ng đố i tư ợ ng (object orientation) cung
phầ n m ề m . T rong kiể u m ớ i này, các đố i tư ợ
nhữ ng khố i x ây dự ng trong khi các phư ơ
(m essage), và sự thừ a kế (inheritance) cung cấ
cấ p m ộ t kiể u m ớ i để x ây dự ng
ng (object) và các lớ p (class) là
ng thứ c (m ethod), thông điệ p
p các cơ chế chủ yế u.
L ậ p tr ìn h h ư ớ n g đ ố i tư ợ n g (O O P- O bject-O riented P rogram m ing) là
m ộ t cách tư duy m ớ i, tiế p cậ n hư ớ ng đố i tư ợ ng đế giả i quyế t v ấ n đề bằ ng
rnáy tính. Thư ậ l ng ữ O OP ngày càng trở nên Ihông dụ ng trong lĩ n h vự c công
nghệ thông tin.
K hái niệ m 6.1
Lậ p trinh huóng đố i tuạ ng (OOP) là mộ t phư ơ ng pháp thiế t kế
triể n phầ n mề m dự a trên kiế n trúc lóp và đố i tư ợ ng.
và phát
N eu bạ n chư a bao giờ sử dụ ng m ộ t ngôn ng ữ O O P thì trư ớ c tiên bạ n nên
nắ m vừ ng các khái niệ m củ a O O P h o n là viế t các chư ơ ng trình. B ạ n cầ n hiế u
đư ợ c đố i tư ợ ng (object) là gì, lớ p (class) là gì, ch úng có quan hệ vớ i nhau như
thế nào, v à làm thế nào để các đố i tư ợ ng trao đố i th ông điệ p (m essage) vớ i
nhau, vâng vâng.
O O P là tậ p hợ p các kỹ thuậ t quan trọ ng m à có thế dùng đế làm cho việ c
triể n khai chư ơ ng trình hiệ u quả hơ n. Q uá trình tiế n hóa củ a O O P như sau:
■
■
■
■
Lậ
Lậ
Sự
Lậ
p trình
p trình
trừ u tư
p trình
tuyế n tính
có cấ u trúc
ợ ng hóa dữ liệ u
hư ớ ng đố i tư ợ ng
Chư ơ ng 6: Lậ p trình hư ớ ng đố i tư ợ ng
76
6.2. T rừ u tư ợ n g hóa (A b stra ctio n )
Trừ u tư ợ ng hóa là m ộ t kỹ thuậ t chỉ trình bày nhữ ng các đặ c điể m càn thiế t
củ a vấ n đề m à không trình b ày nhữ ng chi tiế t cụ thể h ay nhữ ng lờ i giả i thích
phứ c tạ p củ a vấ n đề đó. H ay nói khác ho n nó là m ộ t k ỹ thuậ t tậ p trung vào
thứ cầ n thiế t v à phớ t lờ đi nhữ ng thứ không cầ n thiế t.
V í dụ nhữ ng thông tin sau đây là các đặ c tính gắ n kế t vớ i con ngư ờ i:
■
TêlT
■
■
■
*
Tuổ i
Đ ị a chỉ
C hiề u cao
M àu tóc
G iả sử ta cầ n phát triể n ứ ng dụ ng khách hàng m ua sắ m hàng hóa thì
nhữ ng chi tiế t thiế t yế u là tên, đị a chỉ còn nhữ ng chi tiế t khác (tuổ i, chiề u cao,
m àu tóc, ..) là không quan trọ ng đố i vớ i ứ ng dụ ng. T uy nhiên, nế u chúng ta
phát triể n m ộ t ứ ng dụ ng hồ trợ cho việ c điề u tra tộ i phạ m thì nhữ ng thông tin
như chiề u cao và m àu tóc là thiế t yế u.
S ự trừ u tư ợ ng hóa đã không ngừ ng p h át triể n trong các ngôn ngữ lậ p
trình, như ng chỉ ở mứ c dữ liệ u v à thủ tụ c. T rong O O P, việ c n ày đư ợ c nâng
lên ở m ứ c cao h o n - mứ c đố i tư ợ ng. Sự trừ u tư ợ ng h óa đư ợ c phân thành sự
trừ u tư ợ ng hóa dữ liệ u và trừ u tư ợ ng h óa chư ơ ng trình.
K hái niệ m 6.2
Trừ u tuạ ng hóa dữ liệ u (data àbstraction) là tiế n trìr.h xác đị nh và
nhóm các thuộ c tinh và các hành độ ng liên quan đế n mộ t thự c thể đặ c
thù trong ứ ng dụ ng đang phát triể n.
Trừ u tuạ ng hóa chuông trình (program ábstraction) là mộ t sự trừ u
tư ợ ng hóa dữ liệ u mà lầ m cho các dị ch vụ thay đổ i theo dữ liệ u.
6.3. Đ ố i tư ợ n g (object)
C ác đố i tư ợ ng là chìa khóa đe hiế u đư ợ c kỳ thuậ t hư ớ ng đố i tư ợ ng. B ạ n có
thế nhìn xung quanh và thấ y đư ợ c nhiề u đố i tư ợ ng trong thế giớ i thự c như :
con chó, cái bàn, quyế n vở , cây viế t, tivi, xe hoi ...T rong m ộ t hệ thố ng hư ớ ng
đố i tư ợ ng, m ọ i thứ đề u là đố i tư ợ ng. M ộ t bả ng tính,m ộ t ô trong bả ng tính,
m ộ t biế u đồ , m ộ t bả ng báo cáo, m ộ t con số h ay m ộ t số điệ n thoạ i, m ộ t tậ p tin,
m ộ t thư m ụ c, m ộ t m áy in, m ộ t câu hoặ c m ộ t từ , thậ m chi m ộ t ký tự , tấ t cả
chúng là nhữ ng ví dụ củ a m ộ t đố i tư ợ ng. Rõ ràng chúng ta viế t m ộ t chư ơ ng
trình hư ớ ng đố i tư ợ ng cũ n g có nghĩ a là chúng ta đan g xây dự ng m ộ t m ô hình
Chư ơ ng 6: Lậ p trình hư ớ ng đố i tư ợ ng
77
củ a m ộ t vài bộ phậ n trong thế giớ i thự c. T uy n h iên các đố i tư ợ ng này có thể
đư ợ c biế u diễ n hay m ô hình ừ ê n m áy tính.
M ộ t đố i tư ợ n ậ thế giớ i thự c là m ộ t thự c thể cụ thể m à thông thư ờ ng bạ n
có thế sờ , nhìn thấ y hay cả m nhậ n đư ợ c. T ấ t cả các đố i tư ợ ng trong thế giớ i
thự c đề u có tr ạ n g th á i (state) v à h à n h đ ộ n g (behaviour). Ví dụ :
Trạ ng thái
■
H ành độ ng
C on chó
■
Tên
Màu
Giố ng
Vui sư ớ ng
■
■
■
■
Xe đạ p
■
■
Bánh răng
Bàn đạ p
Dây xích
Bánh xe
■
■
■
■
■
■
■
Sủ a
v ẫ y tai
Chạ y
Ăn
Tăng tôc
Giả m lố c
Chuyể n
bánh răng
C ác đ ố i tư ọ n g p h ầ n m ề m (softw are object) có thể đư ợ c dùng để biể u
diễ n các đố i tư ợ ng thế giớ i thự c. C húng đư ợ c m ô hình sau khi các đố i tư ợ ng
thế giớ i thự c có cả trạ ng thái và hành độ ng. G iố ng nh ư các đố i tư ợ ng thế giớ i
thự c, các đố i tư ợ ng phầ n m ề m cũ n g có the có trạ ng t hái và hành độ ng. M ộ t
đố i tư ợ ng phầ n m ề m có biế n (variable) h ay trạ ng thái (state) m à thư ờ ng đư ợ c
gọ i là th u ộ c tín h (attribute; property) đế duy trì trạ ng thái củ a nó và p h ư ơ n g
th ứ c (m ethod) để thự c hiệ n các hành độ ng củ a nó. Thuộ c tính là m ộ t hạ ng
m ụ c dữ liệ u đư ợ c đặ t tên bở i m ộ t đị nh danh (identifier) trong khi phư ơ ng
thứ c là m ộ t chứ c năng đư ợ c kế t họ p vớ i đố i tư ợ ng chứ a nó.
O O P thư ờ ng sử dụ ng hai thuậ t ng ữ m à sau n ày Java cũ ng sử dụ ng là
thuộ c tính (attribute) và phư ơ ng thứ c (m ethod) để đặ c tả tư ơ ng ứ ng cho trạ ng
thái (state) h ay b iế n (variable) v à hành độ ng (behavior). Tuy nhiên C + + lạ i sử
dụ ng hai thuậ t n gữ d ữ liệ u th à n h v iê n (m em ber data) và h à m th à n h v iê n
(m em ber function) thay cho các thuậ t ng ữ này.
X ét m ộ t cách đặ c biệ t, chỉ m ộ t đố i tư ợ ng riêng rẽ th ì chính nó không hữ u
dụ ng. M ộ t chư ơ ng trình hư ớ ng đố i tư ợ ng thư ờ ng gồ m có hai hay nhiề u hơ n
các đố i tư ợ ng phầ n m ề m tư ơ ng tác lẫ n nhau nh ư là sự tư ơ ng tác củ a các đố i
tư ợ ng trong trong thế giớ i thự c.
K hái niệ m 6.3
Đố i tuợ ng (object) là mộ t thự c thể
và các phư ơ ng thứ c liên quan.
phầ n mề m bao bọ c các thuộ c tinh
K ể từ đây, trong giáo trình n ày chúng ta sử dụ ng thuậ t ngữ đ ố i tư ọ n g (object)
để chỉ m ộ t đố i tư ợ ng phầ n m ề m . H ình 6.1 là m ộ t m inh họ a củ a m ộ t đố i tư ợ ng
phầ n m ề m :
Chư ơ ng 6: Lậ p trình hư ớ ng đố i tư ợ ng
78
Ilình 6.1
M ộ t đố i tư ọ n g phầ n mề m
Variables
(state)
Methods
(behavior)
M ọ i thứ m à đố i tư ợ ng phầ n m ề m biế t (trạ ng thái) v à có thể là m (hành
độ ng) đư ợ c thể hiệ n qua các thuộ c tính và các phư ơ ng thứ c. M ộ t đố i tư ợ ng
phầ n m ề m m ô phỏ ng cho chiế c xe đạ p sẽ có các thuộ c tính đế xác đị nh các
trạ ng thái củ a chiế c xe đạ p như : tố c độ củ a nó là 10 km trcn giờ , nhị p bàn đạ p
là 90 vòng trên phút, và bánh răng hiệ n tạ i là bánh răng thứ 5. Các thuộ c tính
này thông thư ờ ng đư ợ c xem như th u ộ c tín h th ể h iệ n (instance attribute) bở i
vì chúng chứ a đự ng các trạ ng thái cho m ộ t đố i tư ợ ng xe đạ p cụ thể . T rong kỹ
thuậ t hư ớ ng đố i tư ợ ng thì m ộ t đố i tư ợ ng cụ thể đư ợ cgọ i là m ộ t th ể h iệ n
(instance).
K hái niệ m 6.4
Mộ t đố i tư ợ ng cụ
thể
đư ợ c gọ i là mộ t thể
hiệ n (instance).
H ình 6.2 m inh họ a m ộ t xe đạ p đư ợ c m ô hình như m ộ t đố i tư ợ ng phầ n mề m:
H ình 6.2
Đ ố i tư ợ ng phầ n m ề m xe đạ p
10 mph
90 rpm
5th gear
Đ ố i tư ợ ng xe dạ p pnan m em cung có các phư ơ ng thứ c để thắ ng lạ i, tăng
nhị p đạ p hay là chuyế n đổ i bánh răng. N ó không có phư ơ ng thứ c để thay đố i
tố c độ vì tố c độ củ a xe đạ p có thể tình ra từ hai yế u tố số vòng quay và bánh
răng hiệ n tạ i. N hữ ng phư ơ ng thứ c n ày thông thư ờ ng đư ợ c biế t nh ư là các
p h ư ơ n g th ư ớ c th ế h iệ n (instance m ethod) bở i vì chúng tác độ ng hay thay
đổ i trạ ng thái củ a m ộ t đố i tư ợ ng cụ thể .
Chư ơ ng 6: Lậ p trình hư ớ ng đố i tư ợ ng
79
6.4. L ó p (C lass)
T rong thế giớ i thự c thông thư ờ ng có nhiề u loạ i đố i tư ợ ng cùng loạ i. C hẳ ng
hạ n chiế c xe đạ p củ a bạ n chỉ là m ộ t trong hàng tỉ chiế c xe đạ p trên thế giớ i.
T ư ơ ng tự , trong m ộ t chư ơ ng trình hư ớ ng đố i tư ợ ng có thể có nhiề u đố i tư ợ ng
cùng loạ i v à chia sẻ nhữ ng đặ c điế m chung. Sử dụ ng thuậ t ng ừ hư ớ ng đố i
tư ợ ng, chúng ta có thế nói rằ ng chiế c xe đạ p củ a bạ n là mộ t thể hiệ n củ a lớ p
xe đạ p. C ác xe đạ p có m ộ t vài trạ ng thái chung (bánh răng h iệ n tạ i, số vòng
quay hiệ n tạ i, hai bánh xe) v à các hành độ ng (chuyể n bánh răng, giả m tố c).
T uy nhiên, trạ ng thái củ a m ồ i xe đạ p là độ c lậ p v à có thế khác vớ i các trạ ng
thái củ a các xe đạ p khác. T rư ớ c khi tạ o ra các xe đạ p, các nhà sả n xuấ t
thư ờ ng thiế t lậ p m ộ t bả ng thiế t kế (blueprint) m ô tả các đặ c điêm v à các yế u
tố cơ bả n củ a xe đạ p. Sau đó hàng loạ t xe đạ p sè đư ợ c tạ o ra từ b ả n thiế t kế
này. K hông hiệ u quả nế u như tạ o ra m ộ t bả n thiế t kế m ớ i cho m ồ i xe đạ p
đư ợ c sả n xuấ t.
T rong phầ n m ề m hư ớ ng đố i tư ợ ng cũ n g có thế có nhiề u đố i tư ợ ng cùng
loạ i chia sẻ nhữ ng đặ c điể m chung như là: các hình chữ nhậ t, các m ẫ u tin
nhân viên, các đoạ n phim , ... G iố ng nh ư là các nhà sả n xuấ t xe đạ p, bạ n có
thế tạ o ra m ộ t bả ng thiế t kế cho các đố i tư ợ ng này. M ộ t bả ng thiế t kế phầ n
m ề m cho các đố i tư ợ ng đư ợ c gọ i là lớ p (class).
K hái niệ m 6.5
Lớ p (class) là mộ t thiế t kế (blueprint) hay mộ t mẫ u ban
đầ u (prototype) đị nh nghĩa các thuộ c tinh và các ph ư ơ ng
thứ c chung cho tấ t cả các đố i tư ợ ng củ a cùng mộ t loạ i
nào đó.
Mộ t đố i tư ợ ng là mộ t thể
hiệ n cụ
thể
củ a mộ t lớ p.
T rở lạ i ví dụ về xe đạ p chúng ta thấ y ràng m ộ t lớ p X edap là m ộ t bả ng thiế t kế
cho hàng loạ t các đố i tư ợ ng xe đạ p đư ợ c tạ o ra. M ồ iđố i tư ợ ng xe đạ p là m ộ t
thế hiệ n củ a lớ p X edap v à trạ ng thái củ a nó có thế khác vớ i các đố i tư ợ ng xe
đạ p khác. V í dụ m ộ t xe đạ p hiệ n tạ i có thế là ở bánh răng thứ 5 trong khi m ộ t
chiế c khác có thề là ở bánh răng thứ 3.
L ớ p X edap sẽ khai báo các thuộ c tính thể hiệ n cầ n thiế t đế chứ a đự ng
bánh răng hiệ n tạ i, số vòng quay hiệ n tạ i, .. cho m ồ i đố i tư ợ ng xe đạ p. Lớ p
X edap cũ n g khai báo và cung cấ p nhữ ng thi công cho các phư ơ ng thứ c thế
hiệ n để cho phép ngư ờ i đi xe đạ p chuyế n đố i bánh răng, phanh lạ i, chuyế n
đố i số vòng q u a y ,.. như H ình 6.3.
Chư ơ ng 6: Lậ p trình hư ớ ng đố i tư ợ ng
80
H ình 6.3
K hai báo cho lóp Xedap
Sau khi b ạ n đã tạ o ra lớ p xe đạ p, bạ n có thể tạ o ra bấ t kỳ đố i tư
đạ p nào từ lớ p này. K hi bạ n tạ o ra m ộ t thế hiệ n củ a lớ p, hệ thố ng cấ p
bộ nhớ cho đố i tư ợ ng và tấ t cả các thuộ c tính thế hiệ n củ a nó. M ỗ i thể
có vùng n h ớ riêng cho các thuộ c tính thế hiệ n củ a nó. Hình 6.4 m inh
đố i tư ợ ng xe đạ p khác nhau đư ợ c tạ o ra từ cùng lớ pX edap:
H ình 6.4
ợ ng xe
phát đủ
hiệ n sẽ
họ a hai
H ai đố i tư ợ ng củ a lóp Xedap
HyBi k e
YourBike
N goài các thuộ c tính thế hiệ n, các lớ p có thế đị nh nghĩ a các th u ộ c tín h
ló p (class attribute). M ộ t thuộ c tính lớ p chứ a đự ng các thông tin m à đư ợ c
chia sẻ bở i tấ t cả các thể hiệ n củ a lớ p. V í dụ , tấ t cả xe đạ p có cùng số lư ợ ng
bánh răng. T rong trư ờ ng hợ p này, đị nh nghĩ a m ộ t thu ộ c tính thể hiệ n để giữ
số lư ợ ng bánh răng là không hiệ u quả bở i vì tấ t cả các vùng n hớ củ a các
thuộ c tính thể hiệ n n ày đề u g iữ cùng m ộ t giá trị . T rong nhữ ng trư ờ ng hợ p như
thế bạ n có thế đị nh nghĩ a m ộ t thuộ c tính lớ p để chứ a đụ ng số lư ợ ng bánh
răng củ a xe đạ p.T ấ t cả các thế hiệ n củ a lớ p X edap sẽ chia thuộ c tính này. M ộ t
lớ p cũ n g có thế khai báo các p h ư ơ n g th ứ c lớ p (class m ethods). B ạ n có thể
triệ u gọ i m ộ t phư ơ ng thứ c lớ p trự c tiế p từ lớ p như ng ngư ợ c lạ i b ạ n phả i triệ u
gọ i các phư ơ ng thứ c thê hiệ n từ m ộ t thể hiệ n cụ thể nào đó.
Chư ơ ng 6: Lậ p trình hư ớ ng đố i tư ợ ng
81
H ình 6.5
L óp và thể hiệ n củ a lóp
K hái niệ m 6.6
Thuộ c tinh lóp (class
liệ u liên kế t vói mộ t
các thể hiệ n củ a lớ p.
nghĩa lớ p và đư ọ c chia
lố p.
attribute) là mộ t hạ ng mụ c dữ
lớ p cụ thể mà không liên kế t vớ i
Nó đư ợ c đinh nghĩa bên trong đị nh
sẻ bơ i tat cả các thể hiệ n c ủ a
Phuong thúc lóp (class method) là mộ t phư ơ
triệ u gọ i mà không tham khả o tớ i bấ t ky mộ
nào! Tat cả các phư ơ ng thứ c lớ p ả nh hư ơ ng
lớ p chứ không ả nh hư ở ng đế n mộ t lớ p riêng
ng thứ c đư ợ c
t"đố i tư ợ ng
đế n toàn bọ
rẽ nào.
6.5. T h u ộ c tín h (A ttrib u te)
Các thuộ c tính trình bày trạ ng thái củ a đố i tư ợ ng. Các thuộ c tính nắ m giữ các
giá trị dữ liệ u trong m ộ t đố i tư ợ ng, chúng đị nh nghĩ a m ộ t đố i tư ợ ng đặ c thù.
K hái niệ m 6.7
Thuộ c tinh (attribute) là dữ
về mộ t đố i tư ợ ng.
liệ u trình bày các đặ c điế m
M ộ t thuộ c tính có thể đư ợ c gán m ộ t giá trị chỉ sau khi m ộ t đố i tư ợ ng dự a
trên lóp ấ y đư ợ c tạ o ra. M ộ t khi các thuộ c tính đư ợ c gán giá trị chúng m ô tả
m ộ t đố i tư ợ ng. M ọ i đố i tư ợ ng củ a m ộ t lớ p phả i có cùn g các thuộ c tính như ng
giá trị củ a các thuộ c tính thì có thể khác nhau. M ộ t thuộ c tính củ a đố i tư ợ ng
có thể nhậ n các giá trị khác nhau tạ i nhữ ng thờ i điế m khác nhau.
Chư ơ ng 6: Lậ p trình hư ớ ng đố i tư ợ ng
82
6.6. P h ư ơ n g th ứ c (M eth od )
C ác phư ơ ng thứ c thự c thi các hoạ t độ ng củ a đố i tư ợ ng. Các phư ơ ng thứ c là
nhân tố làm thay đổ i các thuộ c tính củ a đố i tư ợ ng.
Khái niệ m 6.8
Phuong thứ c (method) có liên quan tớ i nhữ ng thứ mà đố i
tư ợ ng có thể làm. Mộ t phư ơ ng thứ c đáp ứ ng mộ t chứ c năng
tác độ ng lên dữ liệ u cua đố i tư ợ ng (thuộ c tinh).
C ác phư ơ ng thứ c xác đị nh cách thứ c hoạ t độ ng củ a m ộ t đố i tư ợ ng và
đư ợ c thự c thi khi đố i tư ợ ng cụ thê đư ợ c tạ o ra.V í ụ d, các hoạ t độ ng chung củ a
m ộ t đố i tư ợ ng thuộ c lóp C hó là sủ a, v ẫ y tai, chạ y, v à ăn. T uy nhiên, chỉ khi
m ộ t đố i tư ợ ng cụ thế thuộ c lớ p C hó đư ợ c tạ o ra thìcác phư ơ ng thứ c sủ a, vầ y
tai, chạ y, và ăn m ớ i đư ợ c thự c thi.
C ác phư ơ ng thứ c m ang lạ i m ộ t cách nhìn khác về đố i tư ợ ng. K hi bạ n
nhìn vào đố i tư ợ ng C ử a ra vào bên trong m ôi trư ờ ng củ a bạ n (m ôi trư ờ ng thế
giớ i thự c), m ộ t cách đơ n giả n bạ n có thế thấ y nó là m ộ t đố i tư ợ ng bấ t độ ng
không có khả năng suy nghỉ . T rong tiế p cậ n hư ớ ng đố i tư ợ ng cho phát triể n
hệ thố ng, C ử a ra vào có thế đư ợ c liên kể t tớ i phư ơ ng thứ c đư ợ c g iả sử là có
thể đư ợ c thự c hiệ n. V í dụ , C ử a ra vào có thế m ở , nó có thế đóng, nó có thế
khóa, hoặ c nó có thể m ở khóa. T ấ t cả các phư ơ ng thứ c này gắ n kế t vớ i đố i
tư ợ ng C ử a ra vào v à đư ợ c thự c hiệ n bở i C ử a ra vào ch ứ không phả i m ộ t đố i
lư ự ng nào khác.
6.7. T h ô n g điệ p (M essage)
M ộ t chư ơ ng trình h ay ứ ng dụ ng lớ n thư ờ ng chứ a
Các đố i tư ợ ng phầ n m ề m tư ơ ng tác v à giao tiế p
th ô n g đ iệ p (m essage). K hi đố i tư ợ ng A m uố n
phư ơ ng thứ c củ a đổ i tư ợ ng B thì đố i tư ợ ng A
tư ợ ng B.
nhiề
vớ i
đố i
gỏ i
u đố i tư ợ ng khác nhau.
nhau bằ ng cách gở i các
tư ợ ng B thự c hiệ n các
m ộ t thông điệ p tớ i đố i
V í dụ đố i tư ợ ng ngư ờ i đi x e đạ p m uố n đố i tư ợ ng xe đạ p thự c hiệ n
phư ơ ng thứ c chuyể n đố i bánh răng củ a nó thì đố i tư ợ ng ngư ờ i đi xe đạ p cầ n
phả i gở i m ộ t thông điệ p tớ i đố i tư ợ ng xe đạ p.
Đ ôi khi
hiệ n công việ
thì bạ n phả i
đư ợ c truyề n
đố i tư ợ ng nhậ n cầ n thông tin nhiề u hơ n để biế t chính xác thự c
c gì. V í dụ khi bạ n chuyế n bánh răng trên chiế c xe đạ p củ a bạ n
chỉ rõ bánh răng nào m à bạ n m uố n chuyế n. Các thông tin này
kèm theo thông điệ p và đư ợ c gọ i là cácth a m số (param eter).
Chư ơ ng 6: Lậ p trình hư ớ ng đố i tư ợ ng
83
M ộ t thông điệ p gồ m có:
■
■
■
Đ ố i tư ợ ng nhậ n thông điệ p
T ên củ a phư ơ ng thứ c thự c hiệ n
C ác tham số m à phư ơ ng thứ c cầ n
K hái niệ m 6.9
Mộ t thông điệ p (message) là mộ t lờ i yêu cầ u mộ t hoạ t độ ng.
Mộ t thông điệ p đư ợ c truyề n khi mộ t đố i tư ợ ng triệ u gọ i mộ t
haỵ nhiề u phư ơ ng thứ c củ a đố i tư ợ ng khác để yêu cầ u thông
tin.
K hi m ộ t đố i tư ợ ng nhậ n đư ợ c m ộ t thông
thứ c tư ơ ng ứ ng. V í dụ đố i tư ợ ng xe đạ p nhậ n
bánh răng nó sẽ thự c hiệ n việ c tìm kiế m phư ơ
tư ơ ng ứ ng v à thự c hiệ n theo yêu cầ u củ a thông
điệ p, nó thự chiệ n m ộ t phư ơ ng
đư ợ c thô ng điệ p là chuyế n đố i
ng thứ c chuyể n đổ i bánh răng
điệ p m à nó nhậ n đư ợ c.
6.8. T ín h b ao gói (E n ca p su la tio n )
T rong đố i tư ợ ng xe đạ p, giá trị củ a các thuộ c tính đư ợ c chuyế n đổ i bở i các
phư ơ ng thứ c. P hư ơ ng thứ c changeG ear() chuyế n đố i giá trị củ a thuộ c tính
currentG ear. T huộ c tính speed đư ợ c chuyể n đổ i bở i phư ơ ng thứ c
changeG ear() hoặ c changRpm ().
T rong O O P thì các thuộ c tính là trung tâm , là hạ t nhân củ a đố i tư ợ ng.
C ác phư ơ ng thứ c bao quanh và che giấ u đi hạ t nhân củ a đố i tư ợ ng từ các đố i
tư ợ ng khác trong chư ơ ng trình.V iệ c bao gói các thuộ c tính củ a m ộ t đố i tư ợ ng
bên trong sự che chở củ a các phư ơ ng thứ c củ a nó đư ợ c gọ i là sự đ ó n g g ó i
(encapsulation) h ay là đóng gói dữ liệ u.
Đ ặ c tính đóng gói dữ liệ u là ý tư ở ng củ a các nhà thiế t các hệ thố ng
hư ớ ng đố i tư ợ ng. T uy nhiên, việ c áp dụ ng trong thự c tế thì có thể không hoàn
toàn nh ư thế . V ì nhữ ng lý do thự c tế m à các đố i tư ợ ng đôi khi cầ n phả i phơ i
b ày ra m ộ t vài thuộ c tính n ày v à che giấ u đi m ộ t vài phư ơ ng thứ c kia. T ùy
thuộ c vào các ngôn ngữ lậ p trình hư ớ ng đố i tư ợ ng khác nhau, chúng ta có các
điề u khiể n các truy xuấ t dữ liệ u khác nhau.
K hái niệ m 6.10
Đóng gói (encapsulation) là tiế n trình che giấ u việ c thự c thi
chi tiế t củ a mọ t đố i tư ợ nq.
M ộ t đố i tư ợ ng có m ộ t giao diệ n chung cho các đố i tư ợ ng khác sử dụ ng
đế giao tiế p vớ i nó. Do đặ c tính đóng gói m à các chi tiế t như : các trạ ng thái
Chư ơ ng 6: Lậ p trình hư ớ ng đố i tư ợ ng
84
đư ợ c lư u trữ nh ư thế nào h ay các hành độ ng đư ợ c thicông ra sao có thể đư ợ c
che giấ u đi từ các đố i tư ợ ng khác. Đ iề u này có nghĩ a là các chi tiế t riêng củ a
đố i tư ợ ng có thế đư ợ c chuyế n đổ i m à hoàn toàn khôngả nh hư ở ng tớ i các đố i
tư ợ ng khác có liên hệ vớ i nó. V í dụ , m ộ t ngư ờ i đi xe đạ p không cầ n biế t
chính xác cơ chế chuyể n bánh răng trên xe đạ p thự c sự làm việ c như thế nào
như ng vẫ n có thể sử dụ ng nó. Đ iề u n ày đư ợ c gọ i là che giấ u thông tin.
K hái niệ m 6.11
Che giấ u thông tin (information hiding) là việ c ẩ n đi các chi
tiế t củ a thiế t kế hay thi công từ các đố i tư ợ ng khác.
6.9. T ín h th ừ a kế (In h eritan ce)
H ệ thố ng hư ớ ng đố i tư ợ ng cho phép các lớ p đư ợ c đị nhnghĩ a kế thừ a từ các
lóp khác. V í dụ , lớ p xe đạ p leo núi và xe đạ p đua là nhữ ng lớ p con (subclass)
củ a lớ p xe đạ p. N h ư vậ y ta có thế nói lớ p xe đạ p là lớ p cha (superclass) củ a
lófp xe đạ p leo núi v à xe đạ p đua.
K hái niệ m 6.12
Thừ a kế (inheritance) nghĩa là các hành độ ng (phư ơ ng thứ c) và
các thuộ c tính đư cc đị nh nghĩa trong mộ t lóp có thể đư ợ c thừ a
kế hoặ c đư ợ c sử dụ ng lạ i bơ i lóp khac.
K hái niệ m 6.13
Lóp cha (superclass) là lcp có các thuộ c tính haỵ
đư ợ c thừ a hư ở ng bở i mộ t hay nhiề u lợ p khác.
hành độ ng
Lợ p con (subclass) là lớ p thừ a hư ở ng mộ t vài đặ c tính chung
củ a lợ p cha và thêm vào nhữ ng đặ c tinh riêng khác.
C ác lớ p con thừ a kế thuộ c tính v à hành độ ng từ lỏ fp cha củ a chúng. V í dụ ,
m ộ t xe đạ p leo núi không nhữ ng có bánh răng, số vòng quay trên p hút v à tố c
độ giố ng nh ư m ọ i xe đạ p khác m à còn có thèm m ộ t vài loạ i bánh răng vì thế
m à nó cầ n thêm m ộ t thuộ c tính là gearR ange (loạ i bánh răng).
C ác lớ p con có thế đị nh nghĩ a lạ i các phư ơ ng thứ c đ ư ợ c thừ a kế để cung
cấ p các thi công riêng biệ t cho các phư ơ ng thứ c này. V í đụ , m ộ t xe đạ p leo
núi sẽ cầ n m ộ t phư ơ ng thứ c đặ c b iệ t để chuyế n đố i bánh răng.
Chư ơ ng 6: Lậ p trình hư ớ ng đố i tư ợ ng
85
C ác lớ p con cung cấ p các phiên b ả n đặ c biệ t củ a các lớ p cha m à không
cầ n phả i đị nh nghĩ a lạ i các lóp m ớ i hoàn toàn. Ớ đâ y, m ã lớ p cha có thế đư ợ c
sử dụ ng lạ i nhiề u lầ n.
6 .1 0 .T ín h đa h ìn h (P o ly m o rp h ism )
M ộ t khái niệ m quan trọ ng khác có liên quan m ậ t thiế t vớ i truyề n thông điệ p
là đ a h ìn h (polym orphism ). V ớ i đa hình, nế u cùng m ộ t hành độ ng (phư ơ ng
thứ c) ứ ng dụ ng cho các đố i tư ợ ng thuộ c các lớ p khác nhau thì có thế đư a đế n
nhữ ng kế t quả khác nhau.
K hái niệ m 6.14
Đa hình (polymorphism) nghĩa là "nhiề u hình thứ c", hành độ ng
cùng tên có thê đư ợ c thự c hiệ n khác nhau đố i vớ i các đố i
tư ợ ng/các lớ p khác nhau.
C húng ta h ãy xem xét các đố i tư ợ ng C ử a s ổ và C ử a Cái. C ả hai đố i
tư ợ ng có m ộ t hành độ ng chung có thể thự c hiệ n là đóng. N hư ng m ộ t đố i
tư ợ ng C ử a C ái thự c hiệ n hành độ ng đó có thế khác vớ i cách m à m ộ t đố i
tư ợ ng C ử a s ổ thự c hiệ n hành độ ng đó. C ử a C ái khép cánh cử a lạ i trong khi
C ử a Số hạ các thanh cừ a xuố ng. T hậ t vậ y, hành độ ng đóng có thế thự c hiệ n
m ộ t trong hai hình thứ c khác nhau. M ộ t ví dụ khác là hành độ ng hiể n thị . T ùy
thuộ c vào đố i tư ợ ng tác độ ng, hành độ ng ấ y có thể hiể n thị m ộ t chuồ i, hoặ c
vc m ộ t đư ờ ng thắ ng, hoặ c là hiế n thị m ộ t hình.
Đ a hình có sự liên quan tớ i việ c truyề n thông điệ p. Đố i tư ợ ng yêu cầ u
cầ n biế t hành độ ng nào đế yêu cầ u v à yêu cầ u từ đố i tư ợ ng nào. T uy nhiên
đố i tư ợ ng yêu cầ u không cầ n lo lắ ng về m ộ t hành độ ng đư ợ c hoàn thành như
thế nào.
B ài tậ p cu ố i ch ư ơ n g 6
6.1
T rình b ày các đị nh nghĩ a củ a các thuậ t ngữ :
■
L ậ p trình hư ớ ng đố i tư ợ ng
■
Trừ u tư ợ ng hóa
■
Đ ố i tư ợ ng
■
Lớ p
■
Thuộ c tính
■
P hư ơ ng thứ c
■
T hông điệ p
Chư ơ ng 6: Lậ p trình hư ớ ng đố i tư ợ ng
86
6.2
Phân b iệ t sự khác nhau giữ a lớ p và đố i tư ợ ng, giữ a thuộ c tính
thông điệ p v à truyề n thông điệ p.
6.3
T rình b ày các đặ c điế m củ a OOP.
6.4
N hữ ng lợ i ích có đư ợ c thông qua thừ a kế v à baogói.
6.5
N hữ ng thuộ c tính v à phư ơ ng thứ c cơ bả n củ a m ộ t cái m áy giặ t.
6.6
N hữ ng thuộ c tính v à phư ơ ng thứ c cơ bả n củ a m ộ t chiế c xe hơ i.
6.7
N hữ ng thuộ c tính v à phư ơ ng thứ c cơ bả n củ a m ộ t hình tròn.
6.8
C hỉ ra các đố i tư ợ ng trong hệ thố ng rú t tiề n tự đ ộ ng A TM .
6.9
C hỉ ra các lớ p có thể kế thừ a từ lóp điệ n thoạ i, xe hơ i, và độ ng vậ t.
Chư ơ ng 6: Lậ p trình hư ớ ng đố i tư ợ ng
v à giá tộ , giữ a
87