Academia.eduAcademia.edu
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 =&num; 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