Bài giảng C++ Căn bản và nâng cao

pdf 79 trang phuongnguyen 4961
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng C++ Căn bản và nâng cao", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_c_can_ban_va_nang_cao.pdf

Nội dung text: Bài giảng C++ Căn bản và nâng cao

  1. Updatesofts.com EbooksTeam C++Cănbnvànângcao Mclc: I. CơbnvC++(2) I. CutrúccamttrươngtrìnhC++(2) II. Cácbinkiuvàhngs(5) III. Cáctốnt(13) IV. GiaotipviConsole(19) II. CáccutrúcđiukhinvàHàm(22) I. Cutrúcdliuđiukhin(22) II. HàmI(29) III. HàmII(34) III. Dliunângcao(41) I. Mng(41) II. Sâukýt(48) III. Contr(54) IV. Bnhđng(65) V. Cáccutrúc(69) VI. Cáckiudliudongưidùngđnhnghĩa.(typedef,union,enum)(75) Trang1
  2. Updatesofts.com EbooksTeam Cu trúc c a m t ch ươ ng trình C++ Cĩ l m t trong nh ng cách t t nh t đ b t đu h c mt ngơn ng l p trình là b ng m t ch ươ ng trình. V y đây là ch ươ ng trình đu tiên c a chúng ta : // my first program in C++ Hello World! #include int main () { cout Các câu b t đu b ng d u (#) đưc dùng cho preprocessor (ai d ch h tơi t này v i). Chúng khơng ph i là nh ng dịng mã th c hi n nh ưng đưc dùng đ báo hi u cho trình dch. đây câu l nh #include báo cho trình d ch bi t c n ph i "include" th ư vi n iostream. ðây là m t th ư vi n vào ra c ơ b n trong C++ và nĩ ph i đưc "include" vì nĩ s đưc dùng trong ch ươ ng trình. ðây là cách c đin đ s d ng th ư vi n iostream int main () Dịng này t ươ ng ng v i ph n b t đu khai báo hàm main. Hàm main là đim mà t t c các ch ươ ng trình C++ b t đu th c hi n. Nĩ khơng ph thu c vào v trí c a hàm này ( đu, cu i hay gi a c a mã ngu n) mà n i dung c a nĩ luơn đưc th c hi n đu tiên khi ch ươ ng trình b t đu. Thêm vào đĩ, do nguyên nhân nĩi trên, m i ch ươ ng trình C++ đu ph i t n t i m t hàm main. Theo sau main là m t c p ngo c đơ n b i vì nĩ là m t hàm. Trong C++, t t c các hàm mà sau đĩ là m t c p ngo c đơ n () thì cĩ ngh ĩa là nĩ cĩ th cĩ ho c khơng cĩ tham s Trang2
  3. Updatesofts.com EbooksTeam (khơng b t bu c). N i dung c a hàm main ti p ngay sau ph n khai báo chính th c đưc bao trong các ngo c nh n ( { } ) nh ư trong ví d c a chúng ta cout << "Hello World"; Dịng l nh này làm vi c quan tr ng nh t c a ch ươ ng trình. cout là m t dịng (stream) output chu n trong C++ đưc đnh ngh ĩa trong th ư vi n iostream và nh ng gì mà dịng lnh này làm là g i chu i kí t "Hello World" ra màn hình. Chú ý r ng dịng này k t thúc b ng d u ch m ph y ( ; ). Kí t này đưc dùng đ k t thúc mt l nh và b t bu c ph i cĩ sau m i l nh trong ch ươ ng trình C++ c a b n (m t trong nh ng l i ph bi n nh t c a nh ng l p trình viên C++ là quên m t d u ch m ph y). return 0; Lnh return k t thúc hàm main và tr v mã đi sau nĩ, trong tr ưng h p này là 0. ðây là mt k t thúc bình th ưng c a m t ch ươ ng trình khơng cĩ m t l i nào trong quá trình th c hi n. Nh ư b n s th y trong các ví d ti p theo, đây là m t cách ph bi n nh t đ k t thúc mt ch ươ ng trình C++. Ch ươ ng trình đưc c u trúc thành nh ng dịng khác nhau đ nĩ tr nên d đc h ơn nh ưng hồn tồn khơng ph i b t bu c ph i làm v y. Ví d , thay vì vi t int main () { cout << " Hello World "; return 0; } ta cĩ th vi t int main () { cout << " Hello World "; return 0; } cũng cho m t k t qu chính xác nh ư nhau. Trong C++, các dịng l nh đưc phân cách b ng d u ch m ph y ( ;). Vi c chia ch ươ ng trình thành các dịng ch nh m đ cho nĩ d đc h ơn mà thơi. Các chú thích. Các chú thích đưc các l p trình viên s d ng đ ghi chú hay mơ t trong các ph n c a ch ươ ng trình. Trong C++ cĩ hai cách đ chú thích // Chú thích theo dịng /* Chú thích theo kh ối */ Chú thích theo dịng b t đu t c p d u x (//) cho đn cu i dịng. Chú thích theo kh i bt đu b ng /* và k t thúc b ng */ và cĩ th bao g m nhi u dịng. Chúng ta s thêm các chú thích cho ch ươ ng trình : /* my second program in C++ Hello World! I'm a C++ program Trang3
  4. Updatesofts.com EbooksTeam with more comments */ #include int main () { cout << "Hello World! "; // says Hello World! cout << "I'm a C++ program"; // says I'm a C++ program return 0; } Nu b n vi t các chú thích trong ch ươ ng trình mà khơng s d ng các d u //, /* hay */, trình d ch s coi chúng nh ư là các l nh C++ và s hi n th các l i. Trang4
  5. Updatesofts.com EbooksTeam Các bi n, ki u và h ng s Identifiers Mt tên (indentifiers) h p l là m t chu i g m các ch cái, ch s ho c kí t g ch d ưi. Chi u dài c a m t tên là khơng gi i h n. Kí t tr ng, các kí t đánh d u đu khơng th cĩ m t trong m t tên. Ch cĩ ch cái, ch s và kí t g ch d ưi là đưc cho phép. Thêm vào đĩ, m t tên bi n luơn ph i b t đu bng m t ch cái. Chúng c ũng cĩ th b t đu b ng kí t g ch d ưi ( _ ) nh ưng kí t này th ưng đưc dành cho các liên k t bên ngồi (external link). Khơng bao gi chúng b t đu b ng m t ch s . Mt lu t n a mà b n ph i quan tâm đn khi t o ra các tên c a riêng mình là chúng khơng đưc trùng v i b t kì t khố nào c a ngơn ng hay c a trình d ch, ví d các tên sau đây luơn luơn đưc coi là t khố theo chu n ANSI-C++ và do v y chúng khơng th đưc dùng đ đt tên asm, car, bool, break, marry, catch, to char, class, const, const_cast, continue, default, delete, do, double, dynamic_cast, else, enum, explicit, extern, false, float, for, friend, goto, if, inline, int, long, mutable, namespace, new, operator, private, protected, public, to register, reinterpret_cast, return, short, signed, sizeof, static, static_cast, struct, switch, template, this, throw, true, try, typedef, typeid, typename, union, unsigned, using, virtual, void, volatile, wchar_t Thêm vào đĩ, m t s bi u di n khác c a các tốn t (operator) c ũng khơng đưc dùng làm tên vì chúng là nh ng t đưc dành riêng trong m t s tr ưng h p. and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq Trình d ch c a b n cĩ th thêm m t t dành riêng đc tr ưng khác. Ví d , r t nhi u trình dch 16 bit (nh ư các trình d ch cho DOS) cịn cĩ th các t khố far , huge và near . Chú ý : Ngơn ng C++ là "case sensitive" cĩ ngh ĩa là phân bi t ch hoa ch th ưng. Do vy bi n RESULT khác v i result c ũng nh ư Result . Các ki u d li u Khi l p trình, chúng ta l ưu tr các bi n trong b nh c a máy tính nh ưng máy tính ph i bi t chúng ta mu n l ưu tr gì trong chúng vì các ki u d li u khác nhau s c n l ưng b nh khác nhau. Trang5
  6. Updatesofts.com EbooksTeam B nh c a máy tính chúng ta đưc t ch c thành các byte. M t byte là l ưng b nh nh nh t mà chúng ta cĩ th qu n lí. M t byte cĩ th dùng đ l ưu tr m t lo i d li u nh nh ư là ki u s nguyên t 0 đn 255 hay m t kí t . Nh ưng máy tính cĩ th x lý các ki u d li u ph c t p h ơn b ng cách g p nhi u byte l i v i nhau, nh ư s nguyên dài hay s th p phân. Ti p theo b n s cĩ m t danh sách các ki u d li u c ơ b n trong C++ c ũng nh ư mi n giá tr mà chúng cĩ th bi u di n S Tên Mơ t Mi n giá tr byte cĩ d u: -128 to 127 char 1 Kí t hay ki u s nguyên 8-bit khơng d u: 0 to 255 cĩ d u: -32763 to 32762 short 2 ki u s nguyên 16-bit khơng d u: 0 to 65535 cĩ d u: -2147483648 to long 4 ki u s nguyên 32-bit 2147483647 khơng d u: 0 to 4294967295 S nguyên. ð dài c a nĩ ph thu c vào h int * th ng, nh ư trong MS-DOS nĩ là 16-bit, trên Xem short , long Windows 9x/2000/NT là 32 bit float 4 Dng d u ph y đng 3.4e + / - 38 (7 digits) Dng d u ph y đng v i đ chính xác g p double 8 1.7e + / - 308 (15 digits) đơi long Dng d u ph y đng v i đ chính xác h ơn 10 1.2e + / - 4932 (19 digits) double na Giá tr logic. Nĩ m i đưc thêm vào chu n bool 1 ANSI-C++. B i v y khơng ph i t t c các true ho c false trình d ch đu h tr nĩ. Ngồi các ki u d li u c ơ b n nĩi trên cịn t n t i các con tr và các tham s khơng ki u (void) mà chúng ta s xem xét sau. Khai báo m t bi n ð cĩ th s d ng m t bi n trong C++, đu tiên chúng ta ph i khai báo nĩ, ghi rõ nĩ là ki u d li u nào. Chúng ta ch c n vi t tên ki u (nh ư int , short , float ) ti p theo sau đĩ là m t tên bi n h p l . Ví d int a; float mynumber; Dịng đu tiên khai báo m t bi n ki u int v i tên là a. Dịng th hai khai báo m t bi n ki u float v i tên mynumber . Sau khi đưc khai báo, các bi n trên cĩ th đưc dùng trong ph m vi c a chúng trong ch ươ ng trình. Trang6
  7. Updatesofts.com EbooksTeam Nu b n mu n khai báo m t vài bi n cĩ cùng m t ki u và b n mu n ti t ki m cơng s c vi t b n cĩ th khai báo chúng trên m t dịng, ng ăn cách các tên b ng d u ph y. Ví d int a, b, c; khai báo ba bi n ki u int ( a,b và c) và hồn tồn t ươ ng đươ ng v i : int a; int b; int c; Các ki u s nguyên ( char , short , long and int ) cĩ th là s cĩ d u hay khơng d u tu ỳ theo mi n giá tr mà chúng ta c n bi u di n. Vì v y khi xác đnh m t ki u s nguyên chúng ta đt t khố signed ho c unsigned tr ưc tên ki u d li u. Ví d : unsigned short NumberOfSons; signed int MyAccountBalance; Nu ta khơng ch rõ signed or unsigned nĩ s đưc coi là cĩ d u, vì v y trong khai báo th hai chúng ta cĩ th vi t : int MyAccountBalance cũng hồn tồn t ươ ng đươ ng v i dịng khai báo trên. Trong th c t , r t ít khi ng ưi ta dùng đn t khố signed . Ngo i l duy nh t c a lu t này ki u char . Trong chu n ANSI- C++ nĩ là ki u d li u khác v i signed char và unsigned char . ð cĩ th th y rõ h ơn vi c khai báo trong ch ươ ng trình, chúng ta s xem xét m t đon mã C++ ví d nh ư sau: // operating with variables 4 #include int main () { // declaring variables: int a, b; int result; // process: a = 5; b = 2; a = a + 1; result = a - b; // print out the result: cout << result; // terminate the program: Trang7
  8. Updatesofts.com EbooksTeam return 0; } ðng lo l ng n u nh ư vi c khai báo cĩ v h ơi l lùng v i b n. B n s th y ph n chi ti t cịn l i trong ph n ti p theo Kh i t o các bi n Khi khai báo m t bi n, giá tr c a nĩ m c nhiên là khơng xác đnh. Nh ưng cĩ th b n s mu n nĩ mang m t giá tr xác đnh khi đưc khai báo. ð làm điu đĩ, b n ch c n vi t du b ng và giá tr b n mu n bi n đĩ s mang: type identifier = initial_value ; Ví d , n u chúng ta mu n khai báo m t bi n int là a ch a giá tr 0 ngay t khi kh i t o, chúng ta s vi t : int a = 0; B xung vào cách kh i t o ki u C này, C++ cịn cĩ thêm m t cách m i đ kh i t o bi n bng cách b c m t c p ngo c đơ n sau giá tr kh i t o. Ví d : int a (0); C hai cách đu h p l trong C++. Ph m vi ho t đng c a các bi n Tt c các bi n mà chúng ta s s d ng đu ph i đưc khai báo tr ưc. M t đim khác bi t gi a Cvà C++ là trong C++ chúng ta cĩ th khai báo bi n b t kì n ơi nào trong ch ươ ng trình, th m chí là ngay gi a các l nh thc hi n ch khơng ch là đu kh i l nh nh ư trong C. Mc dù v y chúng ta v n nên theo cách c a ngơn ng C khi khai báo các bi n b i vì nĩ s r t h u d ng khi c n s a ch a m t ch ươ ng trình cĩ t t c các ph n khai báo đưc g p li v i nhau. B i v y, cách thơng d ng nh t đ khai báo bi n là đt nĩ trong ph n b t đu ca m i hàm (bi n c c b ) hay tr c ti p trong thân ch ươ ng trình, ngồi t t c các hàm (bi n tồn c c). Global variables (bi n tồn c c) cĩ th đưc s d ng b t kì đâu trong ch ươ ng trình, ngay sau khi nĩ đưc khai báo. Tm ho t đng c a local variables (bi n c c b ) b gi i h n trong ph n mã mà nĩ đưc khai báo. N u chúng đưc khai báo đu m t hàm (nh ư hàm main ), t m ho t đng s là tồn b hàm main . ðiu đĩ cĩ ngh ĩa là trong ví d trên, các bi n đưc khai báo trong Trang8
  9. Updatesofts.com EbooksTeam hàm main() ch cĩ th đưc dùng trong hàm đĩ, khơng đưc dùng b t kì đâu khác. Thêm vào các bi n tồn c c và c c b , cịn cĩ các bi n ngồi (external). Các bi n này khơng nh ng đưc dùng trong m t file mã ngu n mà cịn trong t t c các file đưc liên kt trong ch ươ ng trình. Trong C++ t m ho t đng c a m t bi n chính là kh i l nh mà nĩ đưc khai báo (m t kh i l nh là m t t p h p các l nh đưc g p l i trong m t b ng các ngo c nh n { } ). N u nĩ đưc khai báo trong m t hàm t m ho t đng s là hàm đĩ, cịn n u đưc khai báo trong vịng l p thì t m ho t đng s ch là vịng l p đĩ Các h ng s Mt h ng s là b t kì m t bi u th c nào mang m t giá tr c đnh, nh ư: Các s nguyên 1776 707 -273 chúng là các h ng mang giá tr s . Chú ý r ng khi bi u di n m t h ng ki u s chúng ta khơng c n vi t d u ngo c kép hay b t kì d u hi u nào khác. Thêm vào nh ng s h c ơ s 10 ( cái mà t t c chúng ta đu đã bi t) C++ cịn cho phép s d ng các h ng s c ơ s 8 và 16. ð bi u di n m t s h c ơ s 8 chúng ta đt tr ưc nĩ kí t 0, đ bi u di n s h c ơ s 16 chúng ta đt tr ưc nĩ hai kí t 0x. Ví d : 75 // C ơ s 10 0113 // c ơ s 8 0x4b // c ơ s 16 Các s th p phân (d ng d u ph y đng) Chúng bi u di n các s v i ph n th p phân và/ho c s m ũ. Chúng cĩ th bao g m ph n th p phân, kí t e (bi u di n 10 m ũ ). 3.14159 // 3.14159 6.02e23 // 6.02 x 10 23 1.6e-19 // 1.6 x 10 -19 3.0 // 3.0 Kí t và xâu kí t Trong C++ cịn t n t i các h ng khơng ph i ki u s nh ư: 'z' 'p' "Hello world" "How do you do?" Trang9
  10. Updatesofts.com EbooksTeam Hai bi u th c đu tiên bi u di n các kí t đơ n, các kí t đưc đt trong d u nháy đơ n ( '), hai bi u th c ti p theo bi u th c các xâu kí t đưc đt trong d u nháy kép ( "). Khi vi t các kí t đơ n hay các xâu kí t c n ph i đ chúng trong các d u nháy đ phân bi t v i các tên bi n hay các t khố. Chú ý: x 'x' x tr đn bi n x trong khi ' x' là kí t h ng ' x'. Các kí t đơ n và các xâu kí t cĩ m t tính ch t riêng bi t là các mã điu khi n. Chúng là nh ng kí t đc bi t mà khơng th đưc vi t b t kì đâu khác trong ch ươ ng trình nh ư là mã xu ng dịng ( \n) hay tab ( \t). T t c đu b t đu b ng d u x ng ưc ( \). Sau đây là danh sách các mã điu khi n đĩ: \n xu ng dịng \r lùi v đu dịng \t kí t tab \v căn th ng theo chi u d c \b backspace \f sang trang \a Kêu bíp \' du nháy đơ n \" du nháy kép \ du h i \\ kí t x ng ưc Ví d : '\n' '\t' "Left \t Right" "one\ntwo\nthree" Thêm vào đĩ, đ bi u di n m t mã ASCII b n c n s d ng kí t x ng ưc ( \) ti p theo đĩ là mã ASCII vi t trong h c ơ s 8 hay c ơ s 16. Trong tr ưng h p đu mã ASCII đưc vi t ngay sau d u s ng ưc, trong tr ưng h p th hai, đ s d ng s trong h c ơ s 16 bn c n vi t kí t x tr ưc s đĩ (ví d \x20 hay \x4A ). Các h ng chu i kí t cĩ th đưc vi t trên nhi u dịng n u m i dịng đưc k t thúc b ng mt d u s ng ưc ( \): Trang10
  11. Updatesofts.com EbooksTeam "string expressed in \ two lines" Bn cĩ th n i m t vài h ng xâu kí t ng ăn cách b ng m t hay vài d u tr ng, kí t tab, xu ng dịng hay b t kì kí t tr ng nào khác. "we form" "a unique" "string" "of characters" ðnh ngh ĩa các h ng ( #define ) Bn cĩ th đnh ngh ĩa các h ng v i tên mà b n mu n đ cĩ th s d ng th ưng xuyên mà khơng m t tài nguyên cho các bi n b ng cách s d ng ch th #define . ðây là d ng c a nĩ: #define identifier value Ví d : #define PI 3.14159265 #define NEWLINE '\n' #define WIDTH 100 chúng đnh ngh ĩa ba h ng s m i. Sau khi khai báo b n cĩ th s d ng chúng nh ư b t kì các h ng s nào khác, ví d circle = 2 * PI * r; cout << NEWLINE; Trong th c t vi c duy nh t mà trình d ch làm khi nĩ tìm th y m t ch th #define là thay th các tên h ng t i b t kì ch nào chúng xu t hi n (nh ư trong ví d tr ưc, PI , NEWLINE hay WIDTH ) b ng giá tr mà chúng đưc đnh ngh ĩa. Vì v y các h ng s #define đưc coi là các hng s macro Ch th #define khơng ph i là m t l nh th c thi, nĩ là ch th ti n x lý (preprocessor), đĩ là lý do trình d ch coi c dịng là m t ch th và dịng đĩ khơng c n k t thúc b ng d u ch m ph y. N u b n thêm d u ch m ph y vào cu i dịng, nĩ s đưc coi là m t ph n c a giá tr đnh ngh ĩa h ng. Khai báo các h ng (const) Vi ti n t const b n cĩ th khai báo các h ng v i m t ki u xác đnh nh ư là b n làm v i mt bi n const int width = 100; const to char tab = '\t'; const zip = 12440; Trang11
  12. Updatesofts.com EbooksTeam Trong tr ưng h p ki u khơng đưc ch rõ (nh ư trong ví d cu i) trình d ch s coi nĩ là ki u int Trang12
  13. Updatesofts.com EbooksTeam Các tốn t ử Qua bài tr ưc chúng ta đã bi t đn s t n t i c a các bi n và các h ng. Trong C++, đ thao tác v i chúng ta s d ng các tốn t , đĩ là các t khố và các d u khơng cĩ trong bng ch cái nh ưng l i cĩ trên h u h t các bàn phím trên th gi i. Hi u bi t v chúng là rt quan tr ng vì đây là m t trong nh ng thành ph n c ơ b n c a ngơn ng C++. Tốntgán( =). Tốntgándùngđgánmtgiátrnàođĩchomtbin a = 5; gángiátrnguyên5chobin a.Vtráibtbucphilàmtbincịnvphi cĩthlàbtkìhng,binhayktqucamtbiuthc. Cn ph i nh n m nh r ng tốn t gán luơn đưc th c hi n t trái sang ph i và khơng bao gi đo ng ưc a = b; gángiátrcabin abnggiátrđangchatrongbin b.Chúýrng chúngtachgán giátr ca bchoavàsthayđica bsauđĩs khơngnhhưngđngiátrca a. Mt thu c tính c a tốn t gán trong C++ gĩp ph n giúp nĩ v ưt lên các ngơn ng l p trình khác là vi c cho phép v ph i cĩ th ch a các phép gán khác. Ví d : a = 2 + (b = 5); tươngđươngvi b = 5; a = 2 + b; Vì v y bi u th c sau c ũng h p l trong C++ a = b = c = 5; gángiátr5chocbabin a, bvà c Cáctốntshc( +, -, *, /, % ) Nămtốntshcđưchtrbingơnnglà: + cng tr * nhân / chia Trang13
  14. Updatesofts.com EbooksTeam %lyphndư(trongphépchia) Th t th c hi n các tốn t này c ũng gi ng nh ư chúng đưc th c hi n trong tốn hc. ðiu duy nh t cĩ v h ơi l đi v i b n là phép l y ph n d ư, ký hi u b ng d u ph n tr ăm (%). ðây chính là phép tốn l y ph n d ư trong phép chia hai s nguyên vi nhau. Ví d , n u a = 11 % 3; , bi n a s mang giá tr 2 vì 11 = 3*3 +2. Cáctốntgánphchp( +=, -=, *=, /=, %=, >>=, , =, <= ) ðcĩthsosánhhaibiuthcvinhauchúngtacĩthsdngcáctốnt quanh.TheochunANSIC++thìgiátrcathaotácquanhchcĩthlà giátrlogicchúngchcĩthcĩgiátr true hoc false ,tuỳtheobiuthc ktqulàđúnghaysai. Trang14
  15. Updatesofts.com EbooksTeam SauđâylàcáctốntquanhbncĩthsdngtrongC++ == Bng != Khác > Lnhơn = Lnhơnhocbng = 6) strgiátr true ttnhiênthayvìsdngcács,chúngtacĩthsdngbtcbiu thcnào.Cho a=2 , b=3 và c=6 (a*b >= c) strgiátr true . (b+4 < a*c) strgiátr false Cnchúýrng=(mtdubng)lfhồntồnkhácvi==(haidubng). Duđutiênlàmttốntgán(gángiátrcabiuthcbênphichobin bêntrái)vàducịnli(==)làmttốntquanhnhmsosánhxemhai biuthccĩbngnhauhaykhơng. TrongnhiutrìnhdchcĩtrưcchunANSIC++cũngnhưtrongngơnngC, cáctốntquanhkhơngtrvgiátrlogic true hoc false màtrvgiátr int vi 0tươngngvi false cịngiátrkhác0(thưnglà1)thìtươngngvi true . Cáctốntlogic( !, &&, || ). Tốnt !tươngđươngvitốntlogicNOT,nĩchcĩmtđisphíabên phivàvicduynhtmànĩlàmlàđingưcgiátrcađist true sang false hocngưcli.Víd: !(5 == 5) trv false vìbiuthcbênphi (5 == 5) cĩgiátrtrue . !(6 <= 4) trv true vì (6 <= 4) cĩgiátr false . !true trv false . !false trv true . Tốntlogic && và || đưcsdngkhitínhtốnhaibiuthcđlyramt ktquduynht.Chúngtươngngvicáctốntlogic AND và OR .Ktqu cachúngphthucvàomiquanhcahaiđis: ðisthnht ðisthhai Kết qu ảKết qu ả a b a && b a || b true true true true true false false true false true false true false false false false Víd: Trang15
  16. Updatesofts.com EbooksTeam ( (5 == 5) && (3 > 6) ) trv false ( true && false ) . ( (5 == 5) || (3 > 6)) trv true ( true || false ) . Tốntđiukin( ?). Tốntđiukintínhtốnmtbiuthcvàtrvmtgiátrkháctuỳthuc vàobiuthcđĩlàđúnghaysai.Cutrúccanĩnhưsau: condition ? result1 : result2 Nu condition là true thìgiátrtrvslà result1 ,nukhơnggiátrtr vlà result2 . 7==5 ? 4 : 3 trv 3vì 7khơngbng 5. 7==5+2 ? 4 : 3 trv 4vì 7bng 5+2 . 5>3 ? a : b trv a,vì 5lnhơn 3. a>b ? a : b trvgiátrlnhơn, ahoc b. Cáctốntthaotácbit( &, |, ^, ~, > ). Cáctốntthaotácbitthayđicácbitbiudinmtbin,cĩnghĩalàthay đibiudinnhphâncachúng tốntasm Mơt & AND LogicalAND | OR LogicalOR ^ XOR LogicalexclusiveOR ~ NOT ðongưcbit > SHR Dchbitsangphi Cáctốntchuynđikiu Cáctốntchuynđikiuchophépbnchuynđidliutkiunàysang kiukhác.CĩvàicáchđlàmvicnàytrongC++,cáchcơbnnhtđưc thaktngơnngClàđttrưcbiuthccnchuynđitênkiudliu đưcbctrongcpngocđơn () ,víd: int i; float f = 3.14; i = (int) f; ðonmãtrênchuynsthpphân3.14sangmtsnguyên(3).đây,tốn tchuynđikiulà(int).MtcáchkhácđlàmđiunàytrongC++làs dngcácconstructors(mtssáchthutngnàyđưcdchlà cut nhưngtơithynĩcĩvkhơngxuơitailm)thayvìdùngcáctốnt:đt trưcbiuthccnchuynđikiutênkiumivàbaobc biuthc gia mtcpngocđơn. i = int ( f ); Trang16
  17. Updatesofts.com EbooksTeam ChaicáchchuynđikiuđuhpltrongC++.ThêmvàođĩANSIC++ cịncĩnhngtốntchuynđikiumiđctrưngcholptrìnhhưngđi tưng. sizeof() Tốntnàycĩmtthams,đĩcĩthlàmtkiudliuhaylàmtbinvà trvkíchcbngbytecakiuhayđitưngđĩ. a = sizeof (char); asmanggiátr1vìkiu char luơncĩkíchc1bytetrênmihthng.Giá trtrvca sizeof làmthngsvìvynĩluơnluơnđưctínhtrưckhi chươngtrìnhthchin. Cáctốntkhác TrongC++cịncĩmtscáctốntkhác,nhưcáctốntliênquanđncon trhaylptrìnhhưngđitưng.Chúngsđưcnĩiđncthtrongcác phntươngng. Th t ưu tiên ca các tốn t Khivitcácbiuthcphctpvinhiutốnhngcácbncĩththitốnhng nàođưctínhtrưc,tốnhngnàođưctínhsau.Vídnhưtrongbiuthcsau: a = 5 + 7 % 2 cĩthcĩhaicáchhiusau: a = 5 + (7 % 2) v i k t qu là 6, ho c a = (5 + 7) % 2 v i k t qu là 0 Câutrliđúnglàbiuthcđutiên.Vìnguyênnhânnĩitrên,ngơnngC++đã thitlpmtthtưutiêngiacáctốnt,khơngchriêngcáctốntshcmà ttccáctốntcĩthxuthintrongC++.Thtưutiêncachúngđưclitkê trongbngsautheothttcaoxungthp. Th Tốnt Mơt Associativity t 1 :: scope Trái 2 () [ ] -> . sizeof Trái ++ tăng/gim ~ ðongưcbit ! NOT 3 Phi & * Tốntcontr (type ) Chuynđikiu + - Dươnghocâm 4 * / % Tốntshc Trái Trang17
  18. Updatesofts.com EbooksTeam 5 + - Tốntshc Trái 6 > Dchbit Trái 7 >= Tốntquanh Trái 8 == != Tốntquanh Trái Tốntthaotác 9 & ^ | Trái bit 10 && || Tốntlogic Trái 11 ?: Tốntđiukin Phi = += -= *= /= %= 12 >>= <<= &= ^= |= Tốntgán Phi 13 , Duphy Trái Associativity đnh ngh ĩa trong tr ưng h p cĩ m t vài tốn t cĩ cùng th t ưu tiên thì cái nào s đưc tính tr ưc, tốn t phía xa nh t bên ph i hay là xa nh t bên trái. Nu b n mu n vi t m t bi u th c ph c t p mà l i khơng ch c l m v th t ưu tiên c a các tốn t thì nên s d ng các ngo c đơ n. Các b n nên th c hi n điu này vì nĩ s giúp ch ươ ng trình d đc h ơn. Trang18
  19. Updatesofts.com EbooksTeam Giao ti p v i console. Console là giao di n c ơ b n c a máy tính. Bàn phím là thi t b vào c ơ b n cịn màn hình là thi t b ra c ơ b n. Trong th ư vi n iostream c a C++, các thao tác vào ra c ơ b n c a m t ch ươ ng trình đưc h tr b i hai dịng d li u : cin đ nh p d li u và cout đ xu t. Thêm vào đĩ, cịn cĩ cerr và clog là hai dịng d li u dùng đ hi n th các thơng báo l i trên thi t b ra chu n (th ưng là màn hình) ho c ra m t file. Thơng th ưng cout đưc gán v i màn hình cịn cin đưc gán v i bàn phím. S d ng hai dịng d li u này b n s cĩ th giao ti p v i ng ưi s d ng vì b n cĩ th hi n th các thơng báo lên màn hình c ũng nh ư nh n d li u t bàn phím. Xu t d li u ( cout ) Dịng cout đưc s d ng v i tốn t đã quá t i << (overloaded - b n s hi u rõ h ơn v thu t ng này trong ph n l p trình h ưng đi t ưng) cout << "Output sentence"; // Hi n th Output sentence lên màn hình cout << 120; // Hi n th s 120 lên màn hình cout << x; // Hi n th n i dung bi n x lên màn hình Tốn t << đưc g i là tốn t chèn vì nĩ chèn d li u đi sau nĩ vào dịng d li u đng tr ưc. Trong ví d trên nĩ chèn chu i " Output sentence ", h ng s 120 và bi n x vào dịng d li u ra cout .Chú ý r ng dịng đu tiên chúng ta s d ng d u ngo c kép vì đĩ là mt chu i kí t . Khi chúng ta mu n s d ng các h ng xâu kí t ta ph i đt chúng trong cp d u ngo c kép đ chúng cĩ th đưc phân bi t v i các bi n. Ví d , hai l nh sau đây là hồn tồn khác nhau: cout << "Hello"; // Hi n th Hello lên màn hình cout << Hello; // Hi n th n i dung c a bi n Hello lên màn hình Tốn t chèn (<<) cĩ th đưc s d ng nhi u l n trong m t câu l nh: cout << "Hello, " << "I am " << "a C++ sentence"; Câu l nh trên s in thơng báo Hello, I am a C++ sentence lên màn hình. S ti n l i ca vi c s d ng l p l i tốn t chèn (<<) th hi n rõ khi chúng ta mu n hi n th nhi u bi n và h ng h ơn là ch m t bi n: cout << "Hello, I am " << age << " years old and my email address is " << email_add; Cn ph i nh n m nh r ng cout khơng nh y xu ng dịng sau khi xu t d li u, vì v y hai câu l nh sau : cout << "This is a sentence."; cout << "This is another sentence."; s đưc hi n th trên màn hình: This is a sentence.This is another sentence. Bi v y khi mu n xu ng dịng chúng ta ph i s d ng kí t xu ng dịng, trong C++ là \n: Trang19
  20. Updatesofts.com EbooksTeam cout > vi dịng cin . Theo sau tốn t này là bi n s l ưu tr d li u đưc đc vào. Ví d : int age; cin >> age; khai báo bi n age cĩ ki u int và đi nh p d li u t cin (bàn phím) đ l ưu tr nĩ trong bi n ki u nguyên này. cin ch b t đu s lý d li u nh p t bàn phím sau khi phím Enter đưc gõ. Vì v y dù bn ch nh p m t kí t thì cin v n s kiên nh n ch cho đn khi b n gõ phím Enter. // i/o example Please enter an integer value: 702 #include The value you entered is 702 and its double is 1404. int main () { int i; cout > i; cout << "The value you entered is " << i; cout << " and its double is " << Trang20
  21. Updatesofts.com EbooksTeam i*2 > a >> b; tươ ng đươ ng v i cin >> a; cin >> b; Trong c hai tr ưng h p ng ưi s d ng ph i cung c p hai d li u, m t cho bi n a và m t cho bi n b và đưc ng ăn cách b i m t d u tr ng h p l : m t d u cách, d u tab hay kí t xu ng dịng. Trong tr ưng h p ki u khơng đưc ch rõ (nh ư trong ví d cu i) trình d ch s coi nĩ là ki u int . Trang21
  22. Updatesofts.com EbooksTeam Các c u trúc điu khi n. Mt ch ươ ng trình th ưng khơng ch bao g m các l nh tu n t n i ti p nhau. Trong quá trình ch y nĩ cĩ th r nhánh hay l p l i m t đon mã nào đĩ. ð làm điu này chúng ta s d ng các c u trúc điu khi n. Cùng v i vi c gi i thi u các c u trúc điu khi n chúng ta c ũng s ph i bi t t i m t khái ni m m i: kh i l nh , đĩ là m t nhĩm các l nh đưc ng ăn cách b i d u ch m ph y (;) nh ưng đưc g p trong m t kh i gi i h n b i m t c p ngo c nh n: { và }. Hu h t các c u trúc điu khi n mà chúng ta s xem xét trong ch ươ ng này cho phép s dng m t l nh đơ n hay m t kh i l nh làm tham s , tu ỳ thu c vào chúng ta cĩ đt nĩ trong c p ngo c nh n hay khơng. Cu trúc điu ki n: if và else Cu trúc này đưc dùng khi m t l nh hay m t kh i l nh ch đưc th c hi n khi m t điu ki n nào đĩ tho mãn. D ng c a nĩ nh ư sau: if ( condition ) statement trong đĩ condition là bi u th c s đưc tính tốn. N u điu ki n đĩ là true , statement đưc th c hi n. N u khơng statement b b qua (khơng th c hi n) và ch ươ ng trình ti p tc th c hi n l nh ti p sau c u trúc điu ki n. Ví d , đon mã sau đây s vi t x is 100 ch khi bi n x ch a giá tr 100: if (x == 100) cout << "x is 100"; Nu chúng ta mu n cĩ h ơn m t l nh đưc th c hi n trong tr ưng h p condition là true chúng ta cĩ th ch đnh m t kh i l nh bng cách s d ng m t c p ngo c nh n { } : if (x == 100) { cout << "x is "; cout << x; } Chúng ta c ũng cĩ th ch đnh điu gì s x y ra n u điu ki n khơng đưc tho mãn b ng cách s u d ng t khố else . Nĩ đưc s d ng cùng v i if nh ư sau: if ( condition ) statement1 else statement2 Ví d : Trang22
  23. Updatesofts.com EbooksTeam if (x == 100) cout 0) cout 8 #include 8, 7, 6, 5, 4, 3, 2, 1, FIRE! int main () { int n; cout "; cin >> n; while (n>0) { cout 0 kh i l nh s đưc th c hi n m t s l n khơng xác đnh ch ng nào điu ki n (n>0) cịn đưc tho mãn. Trang23
  24. Updatesofts.com EbooksTeam Chúng ta c n ph i nh r ng vịng l p ph i k t thúc m t đim nào đĩ, vì vy bên trong vịng l p chúng ta ph i cung c p m t ph ươ ng th c nào đĩ đ bu c condition tr thành sai n u khơng thì nĩ s l p l i mãi mãi. Trong ví d trên vịng l p ph i cĩ l nh n; đ làm cho condition tr thành sai sau m t s l n l p. Vịng l p do-while Dng th c: do statement while ( condition ); Ch c n ăng c a nĩ là hồn tồn gi ng vịng l p while ch tr cĩ m t điu là điu ki n điu khi n vịng l p đưc tính tốn sau khi statement đưc th c hi n, vì vy statement s đưc th c hi n ít nh t m t l n ngay c khi condition khơng bao gi đưc tho mãn. Ví d , ch ươ ng trình d ưi đây s vi t ra b t kì s nào mà bn nh p vào cho đn khi b n nh p s 0. // number echoer Enter number (0 to end): 12345 #include You entered: 12345 int main () Enter number (0 to end): 160277 { You entered: 160277 unsigned long n; Enter number (0 to end): 0 do { You entered: 0 cout > n; cout << "You entered: " << n << "\n"; } while (n != 0); return 0; } Vịng l p do-while th ưng đưc dùng khi điu ki n đ k t thúc vịng l p n m trong vịng l p, nh ư trong ví d trên, s mà ng ưi dùng nh p vào là điu ki n ki m tra đ k t thúc vịng l p. N u b n khơng nh p s 0 trong ví d trên thì vịng lp s khơng bao gi ch m d t. Vịng l p for . Dng th c: for ( initialization ; condition ; increase ) statement ; và ch c n ăng chính c a nĩ là l p l i statement ch ng nào condition cịn mang giá tr đúng, nh ư trong vịng l p while . Nh ưng thêm vào đĩ, for cung c p ch dành cho l nh kh i t o và l nh t ăng. Vì v y vịng l p này đưc thi t k đc bi t lp l i m t hành đng v i m t s l n xác đnh. Cách th c ho t đng c a nĩ nh ư sau: Trang24
  25. Updatesofts.com EbooksTeam 1, initialization đưc th c hi n. Nĩi chung nĩ đt m t giá khí ban đu cho bi n điu khi n. L nh này đưc th c hi n ch m t l n. 2, condition đưc ki m tra, n u nĩ là đúng vịng l p ti p t c cịn n u khơng vịng l p k t thúc và statement đưc b qua. 3, statement đưc th c hi n. Nĩ cĩ th là m t l nh đơ n ho c là m t kh i lnh đưc bao trong m t c p ngo c nh n. 4, Cu i cùng, increase đưc th c hi n đ t ăng bi n điu khi n và vịng lp quay tr l i b ưc 2. Sau đây là m t ví d đm ng ưc s d ng vịng for . // countdown using a for loop 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, #include FIRE! int main () { for (int n=10; n>0; n ) { cout << n << ", "; } cout << "FIRE!"; return 0; } Ph n kh i t o và l nh t ăng khơng b t bu c ph i cĩ. Chúng cĩ th đưc b qua nh ưng v n ph i cĩ d u ch m ph y ng ăn cách gi a các ph n. Vì v y, chúng ta cĩ th vi t for (;n<10;) ho c for (;n<10;n++) . Bng cách s d ng d u ph y, chúng ta cĩ th dùng nhi u l nh trong b t kì tr ưng nào trong vịng for , nh ư là trong ph n kh i t o. Ví d chúng ta cĩ th kh i t o m t lúc nhi u bi n trong vịng l p: for ( n=0, i=100 ; n!=i ; n++, i ) { // cái gì đây c ũng đưc } Vịng l p này s th c hi n 50 l n n u nh ư n và i khơng b thay đi trong thân vịng l p: Các l nh r nhánh và l nh nh y Lnh break . S d ng break chúng ta cĩ th thốt kh i vịng l p ngay c khi điu ki n đ nĩ k t thúc ch ưa đưc tho mãn. L nh này cĩ th đưc dùng đ k t thúc m t vịng l p Trang25
  26. Updatesofts.com EbooksTeam khơng xác đnh hay bu c nĩ ph i k t thúc gi a ch ng thay vì k t thúc m t cách bình th ưng. Ví d , chúng ta s d ng vi c đm ng ưc tr ưc khi nĩ k t thúc: // break loop example 10, 9, 8, 7, 6, 5, 4, countdown #include aborted! int main () { int n; for (n=10; n>0; n ) { cout FIRE! int main () { for (int n=10; n>0; n ) { if (n==5) continue; cout FIRE! int main () { int n=10; loop: ; cout 0) goto loop; cout << "FIRE!"; return 0; } Hàm exit. Trang26
  27. Updatesofts.com EbooksTeam Mc đích c a exit là k t thúc ch ươ ng trình và tr v m t mã xác đnh. D ng th c ca nĩ nh ư sau void exit (int exit code ); exit code đưc dùng b i m t s h điu hành ho c cĩ th đưc dùng b i các ch ươ ng trình g i. Theo quy ưc, mã tr v 0 cĩ ngh ĩa là ch ươ ng trình k t thúc bình th ưng cịn các giá tr khác 0 cĩ ngh ĩa là cĩ l i. Cu trúc l a ch n: switch . Cú pháp c a l nh switch h ơi đc bi t m t chút. M c đích c a nĩ là ki m tra m t vài giá tr h ng cho m t bi u th c, t ươ ng t v i nh ng gì chúng ta làm đu bài này khi liên k t mt vài l nh if và else if v i nhau. D ng th c c a nĩ nh ư sau: switch ( expression ) { case constant1 : block of instructions 1 break; case constant2 : block of instructions 2 break; . . . default: default block of instructions } Nĩ ho t đng theo cách sau: switch tính bi u th c và ki m tra xem nĩ cĩ b ng constant1 hay khơng, n u đúng thì nĩ th c hi n block of instructions 1 cho đn khi tìm th y t khố break , sau đĩ nh y đn ph n cu i c a c u trúc l a ch n switch . Cịn n u khơng, switch s ki m tra xem bi u th c cĩ b ng constant2 hay khơng. N u đúng nĩ s th c hi n block of instructions 2 cho đn khi tìm th y t khố break . Cu i cùng, n u giá tr bi u th c khơng b ng b t kì h ng nào đưc ch đnh trên (b n cĩ th ch đnh bao nhiêu câu l nh case tu ỳ thích), ch ươ ng trình s th c hi n các l nh trong ph n default: n u nĩ t n t i vì ph n này khơng b t bu c ph i cĩ. Hai đon mã sau là t ươ ng đươ ng: ví d switch if-else t ươ ng đươ ng switch (x) { if (x == 1) { case 1: cout << "x is 1"; cout << "x is 1"; } break; else if (x == 2) { case 2: cout << "x is 2"; cout << "x is 2"; } break; else { Trang27
  28. Updatesofts.com EbooksTeam default: cout << "value of x unknown"; cout << "value of x } unknown"; } Tơi đã nĩi trên r ng c u trúc c a l nh switch h ơi đc bi t. Chú ý s t n t i c a l nh break cu i m i kh i l nh. ðiu này là c n thi t vì n u khơng thì sau khi th c hi n block of instructions 1 ch ươ ng trình s khơng nh y đn cu i c a l nh switch mà s th c hi n các kh i l nh ti p theo cho đn khi nĩ tìm th y l nh break đu tiên. ðiu này khi n cho vi c đt c p ngo c nh n { } trong m i tr ưng h p là khơng c n thi t và cĩ th đưc dùng khi b n mu n th c hi n m t kh i l nh cho nhi u tr ưng h p khác nhau, ví d : switch (x) { case 1: case 2: case 3: cout << "x is 1, 2 or 3"; break; default: cout << "x is not 1, 2 nor 3"; } Chú ý r ng l nh switch ch cĩ th đưc dùng đ so sánh m t bi u th c v i các hng . Vì vy chúng ta khơng th đt các bi n ( case (n*2): ) hay các kho ng ( case (1 3): ) vì chúng khơng ph i là các h ng h p l . Nu b n c n ki m tra các kho ng hay nhi u giá tr khơng ph i là h ng s hãy k t h p các lnh if và else if . Trang28
  29. Updatesofts.com EbooksTeam Hàm (I) Hàm là m t kh i l nh đưc th c hi n khi nĩ đưc g i t m t đim khác c a ch ươ ng trình. D ng th c c a nĩ nh ư sau: type name ( argument1 , argument2 , ) statement trong đĩ: type là ki u d li u đưc tr v c a hàm name là tên g i c a hàm. arguments là các tham s (cĩ nhi u bao nhiêu c ũng đưc tu ỳ theo nhu c u). M t tham s bao g m tên ki u d li u sau đĩ là tên c a tham s gi ng nh ư khi khai báo bi n (ví d int x ) và đĩng vai trị bên trong hàm nh ư b t kì bi n nào khác. Chúng dùng đ truy n tham s cho hàm khi nĩ đưc g i. Các tham s khác nhau đưc ng ăn cách b i các du ph y. statement là thân c a hàm. Nĩ cĩ th là m t l nh đơ n hay m t kh i l nh. Dưi đây là ví d đu tiên v hàm: // function example The result is 8 #include int addition (int a, int b) { int r; r=a+b; return (r); } int main () { int z; z = addition (5,3); cout << "The result is " << z; return 0; } ð cĩ th hi u đưc đon mã này, tr ưc h t hãy nh l i nh ng điu đã nĩi bài đu tiên: mt ch ươ ng trình C++ luơn b t đu th c hi n t hàm main . Vì v y chúng ta b t đu t đây. Chúng ta cĩ th th y hàm main b t đu b ng vi c khai báo bi n z ki u int . Ngay sau đĩ là m t l i g i t i hàm addition . N u đ ý chúng ta s th y s t ươ ng t gi a c u trúc c a li g i hàm v i khai báo c a hàm: Trang29
  30. Updatesofts.com EbooksTeam Các tham s cĩ vai trị th t rõ ràng. Bên trong hàm main chúng ta g i hàm addition và truy n hai giá tr : 5 và 3 t ươ ng ng v i hai tham s int a và int b đưc khai báo cho hàm addition . Vào th i đim hàm đưc g i t main , quy n điu khi n đưc chuy n sang cho hàm addition . Giá tr c a c hai tham s ( 5 và 3) đưc copy sang hai bi n c c b int a và int b bên trong hàm. Dịng l nh sau: return (r); kt thúc hàm addition , và tr l i quy n điu khi n cho hàm nào đã g i nĩ ( main ) và ti p tc ch ươ ng trình cái đim mà nĩ b ng t b i l i g i đn addition . Nh ưng thêm vào đĩ, giá tr đưc dùng v i l nh return ( r) chính là giá tr đưc tr v c a hàm.\ Giá tr tr v b i m t hàm chính là giá tr c a hàm khi nĩ đưc tính tốn. Vì v y bi n z s cĩ cĩ giá tr đưc tr v b i addition (5, 3) , đĩ là 8. Ph m vi ho t đng c a các bi n [nh c l i] Bn c n nh r ng ph m vi ho t đng c a các bi n khai báo trong m t hàm hay b t kì m t kh i l nh nào khác ch là hàm đĩ hay kh i l nh đĩ và khơng th s d ng bên ngồi chúng. Ví d , trong ch ươ ng trình ví d trên, b n khơng th s d ng tr c ti p các bi n a, b hay r trong hàm main vì chúng là các bi n c c b c a hàm addition . Thêm vào đĩ b n cũng khơng th s d ng bi n z tr c ti p bên trong hàm addition vì nĩ làm bi n c c b ca hàm main . Tuy nhiên b n cĩ th khai báo các bi n tồn c c đ cĩ th s d ng chúng b t kì đâu, bên trong hay bên ngồi b t kì hàm nào. ð làm vi c này b n c n khai báo chúng bên ngồi m i hàm hay các kh i l nh, cĩ ngh ĩa là ngay trong thân ch ươ ng trình. ðây là m t ví d khác v hàm: // function example The first result is 5 #include The second result is 5 Trang30
  31. Updatesofts.com EbooksTeam The third result is 2 int subtraction (int a, int b) The fourth result is 6 { int r; r=a-b; return (r); } int main () { int x=5, y=3, z; z = subtraction (7,2); cout << "The first result is " << z << '\n'; cout << "The second result is " << subtraction (7,2) << '\n'; cout << "The third result is " << subtraction (x,y) << '\n'; z= 4 + subtraction (x,y); cout << "The fourth result is " << z << '\n'; return 0; } Trong tr ưng h p này chúng ta t o ra hàm subtraction . Ch c n ăng c a hàm này là l y hi u c a hai tham s r i tr v k t qu . Tuy nhiên, n u phân tích hàm main các b n s th y ch ươ ng trình đã vài l n g i đn hàm subtraction . Tơi đã s d ng vài cách g i khác nhau đ các b n th y các cách khác nhau mà m t hàm cĩ th đưc g i. ð cĩ hi u c n k ví d này b n c n nh r ng m t l i g i đn m t hàm cĩ th hồn tồn đưc thay th b i giá tr c a nĩ. Ví d trong l nh g i hàm đu tiên : z = subtraction (7,2); cout << "The first result is " << z; Nu chúng ta thay l i g i hàm b ng giá tr c a nĩ ( đĩ là 5), chúng ta s cĩ: z = 5; cout << "The first result is " << z; Tươ ng t nh ư v y cout << "The second result is " << subtraction (7,2); cũng cho k t qu gi ng nh ư hai dịng l nh trên nh ưng trong tr ưng h p này chúng ta g i hàm subtraction tr c ti p nh ư là m t tham s c a cout . Chúng ta c ũng cĩ th vi t: cout << "The second result is " << 5; Trang31
  32. Updatesofts.com EbooksTeam vì 5 là k t qu c a subtraction (7,2) . Cịn v i l nh cout void dummyfunction (void) { cout << "I'm a function!"; } int main () { dummyfunction (); return 0; } Trang32
  33. Updatesofts.com EbooksTeam T khố void trong ph n danh sách tham s cĩ ngh ĩa là hàm này khơng nh n m t tham s nào. Tuy nhiên trong C++ khơng c n thi t ph i s d ng void đ làm điu này. B n ch đơ n gi n s d ng c p ngo c đơ n ( ) là xong. Bi vì hàm c a chúng ta khơng cĩ m t tham s nào, vì v y l i g i hàm dummyfunction s là : dummyfunction (); Hai d u ngo c đơ n là c n thi t đ cho trình d ch hi u đĩ là m t l i g i hàm ch khơng ph i là m t tên bi n hay b t kì d u hi u nào khác. Trang33
  34. Updatesofts.com EbooksTeam Hàm (II). Truy n tham s theo tham s giá tr hay tham s bi n. Cho đn nay, trong t t c các hàm chúng ta đã bi t, t t c các tham s truy n cho hàm đu đưc truy n theo giá tr . ðiu này cĩ ngh ĩa là khi chúng ta g i hàm v i các tham s , nh ng gì chúng ta truy n cho hàm là các giá tr ch khơng ph i b n thân các bi n. Ví d , gi s chúng ta g i hàm addition nh ư sau: int x=5, y=3, z; z = addition ( x , y ); Trong tr ưng h p này khi chúng ta g i hàm addition thì các giá tr 5 and 3 đưc truy n cho hàm, khơng ph i là b n thân các bi n. ðn đây các b n cĩ th h i tơi: Nh ư v y thì sao, cĩ nh h ưng gì đâu ? ðiu đáng nĩi đây là khi các b n thay đi giá tr c a các bi n a hay b bên trong hàm thì các bi n x và y vn khơng thay đi vì chúng đâu cĩ đưc truy n cho hàm ch cĩ giá tr c a chúng đưc truy n mà thơi. Hãy xét tr ưng h p b n c n thao tác v i m t bi n ngồi bên trong m t hàm. Vì v y b n s ph i truy n tham s d ưi d ng tham s bi n nh ư trong hàm duplicate trong ví d dưi đây: // passing parameters by reference x=2, y=6, z=14 #include void duplicate (int& a, int& b, int& c) { a*=2; b*=2; c*=2; } int main () { int x=1, y=3, z=7; duplicate (x, y, z); cout << "x=" << x << ", y=" << y << ", z=" << z; return 0; } Trang34
  35. Updatesofts.com EbooksTeam ðiu đu tiên làm b n chú ý là trong khai báo c a duplicate theo sau tên ki u c a m i tham s đu là d u và ( &), đ báo hi u r ng các tham s này đưc truy n theo tham s bi n ch khơng ph i tham s giá tr . Khi truy n tham s d ưi d ng tham s bi n chúng ta đang truy n b n thân bi n đĩ và b t kì s thay đi nào mà chúng ta th c hi n v i tham s đĩ bên trong hàm s nh h ưng tr c ti p đn bi n đĩ. Trong ví d trên, chúng ta đã liên k t a, b và c v i các tham s khi g i hàm ( x, y và z) và mi s thay đi v i a bên trong hàm s nh h ưng đn giá tr c a x và hồn tồn t ươ ng t vi b và y, c và z. Ki u khai báo tham s theo d ng tham s bi n s d ng du và ( &) ch cĩ trong C++. Trong ngơn ng C chúng ta ph i s d ng con tr đ làm vi c t ươ ng t nh ư th . Truy n tham s d ưi d ng tham s bi n cho phép m t hàm tr v nhi u h ơn m t giá tr . Ví d , đây là m t hàm tr v s li n tr ưc và li n sau c a tham s đu tiên. // more than one returning value Previous=99, Next=101 #include void prevnext (int x, int& prev, int& next) { prev = x-1; next = x+1; } int main () { int x=100, y, z; prevnext (x, y, z); cout << "Previous=" << y << ", Next=" << z; return 0; } Giá tr m c đnh c a tham s . Khi đnh ngh ĩa m t hàm chúng ta cĩ th ch đnh nh ng giá tr m c đnh s đưc truy n cho các đi s trong tr ưng h p chúng b b qua khi hàm đưc g i. ð làm vi c này đơ n gi n ch c n gán m t giá tr cho đi s khi khai báo hàm. N u giá tr c a tham s đĩ v n đưc ch đnh khi g i hàm thì giá tr m c đnh s b b qua. Ví d : Trang35
  36. Updatesofts.com EbooksTeam // default values in functions 6 #include 5 int divide (int a, int b=2) { int r; r=a/b; return (r); } int main () { cout 2.5 int divide (int a, int b) { return (a/b); } float divide (float a, float b) { Trang36
  37. Updatesofts.com EbooksTeam return (a/b); } int main () { int x=5,y=2; float n=5.0,m=2.0; cout !9 = 362880 long factorial (long a) Trang37
  38. Updatesofts.com EbooksTeam { if (a > 1) return (a * factorial (a-1)); else return (1); } int main () { long l; cout > l; cout << "!" << l << " = " << factorial (l); return 0; } Chú ý trong hàm factorial chúng ta cĩ th l nh g i chính nĩ nh ưng ch khi tham s l n hơn 1, n u khơng thì hàm s th c hi n m t vịng l p vơ h n vì sau khi đn 0 nĩ s ti p t c nhân c nh ng s âm. Hàm này cĩ m t h n ch là ki u d li u mà nĩ dùng ( long ) khơng cho phép tính giai tha quá 12! . Khai báo m u cho hàm. Cho đn gi chúng ta hồn tồn ph i đnh ngh ĩa hàm tr ưc l nh g i đu tiên đn nĩ, mà th ưng là trong main , vì v y hàm main luơn ph i n m cu i ch ươ ng trình. N u b n th l p li m t vài ví d v hàm tr ưc đây nh ưng th đt hàm main tr ưc b t kì m t hàm đưc gi t nĩ, b n g n nh ư ch c ch n s nh n đưc thơng báo l i. Nguyên nhân là m t hàm ph i đưc khai báo tr ưc khi nĩ đưc g i nh ư nh ưnggx gì chúng ta đã làm trng t t c các ví d . Nh ưng cĩ m t cách khác đ tránh ph i vi t t t c mã ch ươ ng trình tr ưc khi chúng cĩ th đưc dùng trong main hay b t kì m t hàm nào khác. ðĩ chính là khai báo m u cho hàm . Cách này bao g m vi c khai báo hàm m t cách ng n g n nh ưng đ đ cho trình d ch cĩ th bi t các tham s và ki u d li u tr v c a hàm. Dng c a nĩ nh ư sau: type name ( argument_type1 , argument_type2 , ); ðây chính là ph n đu c a đnh ngh ĩa hàm, ngo i tr : • Nĩ khơng cĩ b t kì l nh nào cho hàm. ðiu này cĩ ngh ĩa là nĩ khơng bao g m thân hàm v i t t c các l nh th ưng đưc b c trong c p ngo c nh n { } . • Nĩ k t thúc b ng d u ch m ph y ( ;). Trang38
  39. Updatesofts.com EbooksTeam • Trong ph n li t kê các tham s ch c n vi t ki u c a chúng là đ. Vi c vi t tên c a các tham s trong ph n khai báo m u là khơng b t bu c. Ví d : // prototyping Type a number (0 to exit): 9 #include Number is odd. Type a number (0 to exit): 6 void odd (int a); Number is even. void even (int a); Type a number (0 to exit): 1030 Number is even. int main () Type a number (0 to exit): 0 { Number is even. int i; do { cout > i; odd (i); } while (i!=0); return 0; } void odd (int a) { if ((a%2)!=0) cout << "Number is odd.\n"; else even (a); } void even (int a) { if ((a%2)==0) cout << "Number is even.\n"; else odd (a); } Ví d này rõ ràng khơng ph i là m t ví d v s hi u qu . Tơi ch c ch n r ng các b n cĩ th nh n đưc k t qu nh ư trên ch v i m t n a s dịng l nh. Tuy nhiên nĩ giúp cho chúng ta th y đưc vi c khai báo m u các hàm là nh ư th nào. H ơn n a, trong ví d này vi c khai báo m u ít nh t m t hàm là b t bu c. ðu tiên chúng ta th y khai báo m u c a hai hàm odd và even : void odd (int a); void even (int a); cho phép hai hàm này cĩ th đưc s d ng tr ưc khi chúng đưc đnh ngh ĩa hồn ch nh. Tuy nhiên lý do đc bi t gi i thích t i sao ch ươ ng trình này l i c n ít nh t m t hàm ph i đưc khi báo m u là trong odd cĩ m t l i g i đn even và trong even cĩ m t l i g i đn odd . Vì v y n u khơng cĩ hàm nào đưc khai báo tr ưc thì l i ch c ch n s x y ra. Trang39
  40. Updatesofts.com EbooksTeam Rt nhi u l p trình viên kinh nghi m khuyên r ng tt c các hàm nên đưc khai báo m u. ðĩ c ũng là l i khuyên c a tơi, nh t là trong tr ưng h p cĩ nhi u hàm ho c chúng r t dài, khi đĩ vi c khai báo t t c các hàm cùng m t ch cho phép chúng ta bi t ph i g i các hàm nh ư th nào, vì v y ti t ki m đưc th i gian. Trang40
  41. Updatesofts.com EbooksTeam Mng Mng là m t dãy các ph n t cĩ cùng ki u đưc đt liên ti p trong b nh và cĩ th truy xu t đn t ng ph n t b ng cách thêm m t ch s vào sau tên c a m ng. ðiu này cĩ ngh ĩa là, ví d , chúng ta cĩ th l ưu 5 giá tr ki u int mà khơng c n ph i khai báo 5 bi n khác nhau.Ví d , m t m ng ch a 5 giá tr nguyên ki u int cĩ tên là billy cĩ th đưc bi u di n nh ư sau: trong đĩ m i m t ơ tr ng bi u di n m t ph n t c a m ng, trong tr ưng h p này là các giá tr nguyên ki u int . Chúng đưc đánh s t 0 đn 4 vì ph n t đu tiên c a m ng luơn là 0 b t k đ dài c a nĩ là bao nhiêu. Nh ư b t kì bi n nào khác, m t m ng ph i đưc khai báo tr ưc khi cĩ th s d ng. M t khai báo đin hình cho m t m ng trong C++ nh ư sau: type name [ elements ]; trong đĩ type là m t ki u d li u h p l ( int , float ), name là m t tên bi n h p l và tr ưng elements ch đnh m ng đĩ s ch a bao nhiêu ph n t Vì v y, đ khai báo billy nh ư đã trình bày trên chúng ta ch c n m t dịng đơ n gi n nh ư sau: int billy [5]; Chú ý: Tr ưng elements bên trong c p ngo c [] ph i là m t giá tr h ng khi khai báo mt m ng, vì m ng là m t kh i nh t ĩnh cĩ kích c xác đnh và trình biên d ch ph i cĩ kh n ăng xác đnh xem c n bao nhiêu b nh đ c p phát cho m ng tr ưc khi các l nh cĩ th đưc th c hi n. Kh i t o m t m ng. Khi khai báo m t m ng v i t m ho t đng đa ph ươ ng (trong m t hàm), theo m c đnh nĩ s khơng đưc kh i t o, vì v y n i dung c a nĩ là khơng xác đnh cho đn khi chúng ra lưu các giá tr lên đĩ. Nu chúng ta khai báo m t m ng tồn c c (bên ngồi t t c các hàm) nĩ s đưc kh i t o và t t c các ph n t đưc đt b ng 0. Vì v y n u chúng ta khai báo m ng tồn c c: Trang41
  42. Updatesofts.com EbooksTeam int billy [5]; mi ph n t c a billy s đưc kh i t o là 0: Nh ưng thêm vào đĩ, khi chúng ta khai báo m t m ng, chúng ta cĩ th gán các giá tr kh i to cho t ng ph n t c a nĩ. Ví d : int billy [5] = { 16, 2, 77, 40, 12071 }; lnh trên s khai báo m t m ng nh ư sau: S ph n t trong m ng mà chúng ta kh i t o v i c p ngo c nh n { } ph i b ng s ph n t c a m ng đã đưc khai báo v i c p ngo c vuơng [ ] . B i vì điu này cĩ th đưc coi là m t s l p l i khơng c n thi t nên C++ cho phép đ tr ng gi a c p ngo c vuơng, kích th ưc c a m ng đưc xác đnh b ng s giá tr gi a c p ngo c nh n. Truy xu t đn các ph n t c a m ng. b t kì đim nào c a ch ươ ng trình trong t m ho t đng c a m ng, chúng ta cĩ th truy xu t t ng ph n t c a m ng đ đc hay ch nh s a nh ư là đi v i m t bi n bình th ưng. Cu trúc c a nĩ nh ư sau: name [index ] Nh ư trong ví d tr ưc ta cĩ m ng billy g m 5 ph n t cĩ ki u int , chúng ta cĩ th truy xu t đn t ng ph n t c a m ng nh ư sau: Ví d , đ l ưu giá tr 75 vào ph n t th ba c a billy ta vi t nh ư sau: Trang42
  43. Updatesofts.com EbooksTeam billy[2] = 75; và, ví d , đ gán giá tr c a ph n t th 3 c a billy cho bi n a, chúng ta vi t: a = billy[2]; Vì v y, xét v m i ph ươ ng di n, bi u th c billy[2] gi ng nh ư b t kì m t bi n ki u int . Chú ý r ng ph n t th ba c a billy là billy[2] , vì m ng b t đu t ch s 0. Vì v y, ph n t cu i cùng s là billy[4] . Vì v y n u chúng ta vi t billy[5] , chúng ta s truy xu t đn ph n t th 6 c a m ng và v ưt quá gi i h n c a m ng. Trong C++, vi c v ưt quá gi i h n ch s c a m ng là hồn tồn h p l , tuy nhiên nĩ cĩ th gây ra nh ng v n đ th c s khĩ phát hi n b i vì chúng khơng t o ra nh ng l i trong quá trình d ch nh ưng chúng cĩ th t o ra nh ng k t qu khơng mong mu n trong quá trình th c hi n. Nguyên nhân c a vi c này s đưc nĩi đn k ĩ h ơn khi chúng ta b t đu s dng con tr . Cn ph i nh n m nh r ng chúng ta s d ng c p ngo c vuơng cho hai tác v : đu tiên là đt kích th ưc cho m ng khi khai báo chúng và th hai, đ ch đnh ch s cho m t ph n t c th c a m ng khi xem xét đn nĩ. int billy[5]; // khai báo m t m ng m i. billy[2] = 75; // truy xu t đn m t ph n t c a mng. Mt vài thao tác h p l khác v i m ng: billy[0] = a; billy[a] = 75; b = billy [a+2]; billy[billy[a]] = billy[2] + 5; // ví d v m ng 12206 #include int billy [] = {16, 2, 77, 40, 12071}; int n, result=0; int main () { for ( n=0 ; n<5 ; n++ ) { result += billy[n]; } cout << result; return 0; } Trang43
  44. Updatesofts.com EbooksTeam Mng nhi u chi u. Mng nhi u chi u cĩ th đưc coi nh ư m ng c a mng, ví d , m t m ng hai chi u cĩ th đưc t ưng t ưc nh ư là m t b ng hai chi u g m các ph n t cĩ ki u d li u c th và gi ng nhau. jimmy bi u di n m t m ng hai chi u kích th ưc 3x5 cĩ ki u int . Cách khai báo m ng này nh ư sau: int jimmy [3][5]; và, ví d , cách đ truy xu t đn ph n t th hai theo chi u d c và th t ư theo chi u ngang trong m t bi u th c nh ư sau: jimmy[1][3] (hãy nh r ng ch s c a m ng luơn b t đu t 0). Mng nhi u chi u khơng b gi i h n b i hai ch s (hai chi u), Chúng cĩ th ch a bao nhi u ch s tùy thích m c dù ít khí c n ph i dùng đn m ng l n h ơn 3 chi u. Hãy th xem xét l ưng b nh mà m t m ng cĩ nhi u ch s c n đn. Ví d : char century [100][365][24][60][60]; gán m t giá tr char cho m i giây trong m t th k , ph i c n đn h ơn 3 t giá tr chars ! Chúng ta s ph i c n kho ng 3GB RAM đ khai báo nĩ. Mng nhi u chi u th c ra là m t khái ni m tr u t ưng vì chúng ta cĩ th cĩ k t qu tươ ng t v i m ng m t chi u b ng m t thao tác đơ n gi n gi a các ch s c a nĩ: int jimmy [3][5]; t ươ ng đươ ng v i int jimmy [15]; (3 * 5 = 15) Trang44
  45. Updatesofts.com EbooksTeam Dưi đây là hai ví d v i cùng m t k t qu nh ư nhau, m t s d ng m ng hai chi u và mt s d ng m ng m t chi u: // multidimensional array // pseudo-multidimensional array #include #include #define WIDTH 5 #define WIDTH 5 #define HEIGHT 3 #define HEIGHT 3 int jimmy [HEIGHT][WIDTH]; int jimmy [HEIGHT * WIDTH]; int n,m; int n,m; int main () int main () { { for (n=0;n<HEIGHT;n++) for (n=0;n<HEIGHT;n++) for (m=0;m<WIDTH;m++) for (m=0;m<WIDTH;m++) { { jimmy[n][m]=(n+1)*(m+1); jimmy[n * WIDTH + } m]=(n+1)*(m+1); return 0; } } return 0; } khơng m t ch ươ ng trình nào vi t gì ra màn hình nh ưng c hai đu gán giá tr vào kh i nh cĩ tên jimmy theo cách sau: Chúng ta đã đnh ngh ĩa h ng ( #define ) đ đơ n gi n hĩa nh ng ch nh s a sau này c a ch ươ ng trình, ví d , trong tr ưng h p chúng ta quy t đnh t ăng kích th ưc c a m ng vi chi u cao là 4 thay vì là 3, chúng ta ch c n thay đi dịng: #define HEIGHT 3 thành #define HEIGHT 4 và khơng ph i cĩ thêm s thay đi nào n a đi v i ch ươ ng trình. Dùng mng làm tham s . Vào m t lúc nào đĩ cĩ th chúng ta c n ph i truy n m t m ng t i m t hàm nh ư là m t tham s . Trong C++, vi c truy n theo tham s giá tr m t kh i nh là khơng h p l , ngay c khi nĩ đưc t ch c thành m t m ng. Tuy nhiên chúng ta l i đưc phép truy n đa ch Trang45
  46. Updatesofts.com EbooksTeam ca nĩ, vi c này c ũng t o ra k t qu th c t gi ng thao tác trên nh ưng l i nhanh h ơn nhi u và hi u qu h ơn. ð cĩ th nh n m ng là tham s thì điu duy nh t chúng ta ph i làm khi khai báo hàm là ch đnh trong ph n tham s ki u d li u c ơ b n c a m ng, tên m ng và c p ngo c vuơng tr ng. Ví d , hàm sau: void procedure (int arg[]) nh n vào m t tham s cĩ ki u "m ng c a char " và cĩ tên arg . ð truy n tham s cho hàm này m t m ng đưc khai báo: int myarray [40]; ch c n g i hàm nh ư sau: procedure (myarray); Dưi đây là m t ví d c th // arrays as parameters 5 10 15 #include 2 4 6 8 10 void printarray (int arg[], int length) { for (int n=0; n<length; n++) cout << arg[n] << " "; cout << "\n"; } int main () { int firstarray[] = {5, 10, 15}; int secondarray[] = {2, 4, 6, 8, 10}; printarray (firstarray,3); printarray (secondarray,5); return 0; } Nh ư b n cĩ th th y, tham s đu tiên ( int arg[] ) ch p nh n m i m ng cĩ ki u c ơ b n là int , b t k đ dài c a nĩ là bao nhiêu, vì v y c n thi t ph i cĩ tham s th hai đ báo cho hàm này bi t đ dài c a m ng mà chúng ta truy n cho nĩ. Trong ph n khai báo hàm chúng ta c ũng cĩ th dùng tham s là các m ng nhi u chi u. Cu trúc c a m ng 3 chi u nh ư sau: base_type [][ depth ][ depth ] Trang46
  47. Updatesofts.com EbooksTeam ví d , m t hàm v i tham s là m ng nhi u chi u cĩ th nh ư sau: void procedure (int myarray[][3][4]) chú ý r ng c p ngo c vuơng đu tiên đ tr ng nh ưng các c p ngo c sau thì khơng. B n luơn luơn ph i làm v y vì trình biên d ch C++ ph i cĩ kh n ăng xác đnh đ l n c a các chi u thêm vào c a m ng. Mng, c m t chi u và nhi u chi u, khi truy n cho hàm nh ư là m t tham s th ưng là nguyên nhân gây l i cho nh ng l p trình viên thi u kinh nghi m. Các b n nên đc bài 3.3. Con tr đ cĩ th hi u rõ h ơn m ng ho t đng nh ư th nào. Trang47
  48. Updatesofts.com EbooksTeam Xâu kí t Trong t t c các ch ươ ng trình chúng ta đã th y cho đn gi , chúng ta ch s d ng các bi n ki u s , ch dùng đ bi u di n các s . Nh ưng bên c nh các bi n ki u s cịn cĩ các xâu kí t, chúng cho phép chúng ta bi u di n các chu i kí t nh ư là các t , câu, đon v ăn b n Cho đn gi chúng ta m i ch dùng chúng d ưi d ng h ng ch ch a quan tâm đn các bi n cĩ th ch a chúng. Trong C++ khơng cĩ ki u d li u cơ b n đ l ưu các xâu kí t . ð cĩ th th a mãn nhu cu này, ng ưi ta s d ng m ng cĩ ki u char . Hãy nh r ng ki u d li u này ( char ) ch cĩ th l ưu tr m t kí t đơ n, b i v y nĩ đưc dùng đ t o ra xâu c a các kí t đơ n. Ví d , m ng sau (hay là xâu kí t ): char jenny [20]; cĩ th l ưu m t xâu kí t v i đ dài c c đi là 20 kí t . B n cĩ th t ưng t ưng nĩ nh ư sau: Kích th ưc c c đi này khơng c n ph i luơn luơn dùng đn. Ví d , jenny cĩ th l ưu xâu "Hello" hay "Merry christmas" . Vì các m ng kí t cĩ th l ưu các xâu kí t ng n h ơn đ dài c a nĩ, trong C++ đã cĩ m t quy ưc đ k t thúc m t n i dung c a m t xâu kí t bng m t kí t null, cĩ th đưc vi t là '\0' . Chúng ta cĩ th biu di n jenny (m t m ng cĩ 20 ph n t ki u char ) khi l ưu tr xâu kí t "Hello" và "Merry Christmas" theo cách sau: Chú ý r ng sau n i dung c a xâu, m t kí t null ( '\0' ) đưc dùng đ báo hi u k t thúc xâu. Nh ng ơ màu xám bi u di n nh ng giá tr khơng xác đnh. Kh i t o các xâu kí t . Vì nh ng xâu kí t là nh ng m ng bình th ưng nên chúng c ũng nh ư các m ng khác. Ví d, n u chúng ta mu n kh i t o m t xâu kí t v i nh ng giá tr xác đnh chúng ta cĩ th làm điu đĩ t ươ ng t nh ư v i các m ng khác: Trang48
  49. Updatesofts.com EbooksTeam char mystring[] = { 'H', 'e', 'l', 'l', 'o', '\0' }; Tuy nhiên, chúng ta cĩ th kh i t o giá tr cho m t xâu kí t b ng cách khác: s d ng các hng xâu kí t . Trong các bi u th c chúng ta đã s d ng trong các ví d trong các ch ươ ng tr ưc các h ng xâu kí t đ xu t hi n vài l n. Chúng đưc bi u di n trong c p ngo c kép ( "), ví d : "the result is: " là m t h ng xâu kí t chúng ta s d ng m t s ch . Khơng gi ng nh ư d u nháy đơ n ( ') cho phép bi u di n h ng kí t , c p ngo c kép ( ") là hng bi u di n m t chu i kí t liên ti p, và cu i chu i m t kí t null ( '\0' ) luơn đưc t đng thêm vào. Vì v y chúng ta cĩ th kh i t o xâu mystring theo m t trong hai cách sau đây: char mystring [] = { 'H', 'e', 'l', 'l', 'o', '\0' }; char mystring [] = "Hello"; Trong c hai tr ưng h p m ng (hay xâu kí t ) mystring đưc khai báo v i kích th ưc 6 kí t : 5 kí t bi u di n Hello c ng v i m t kí t null. Tr ưc khi ti p t c, tơi c n ph i nh c nh b n r ng vi c gán nhi u h ng nh ư vi c s d ng du ngo c kép ( ") ch h p l khi kh i t o m ng, t c là lúc khai báo m ng. Các bi u th c trong ch ươ ng trình nh ư: mystring = "Hello"; mystring[] = "Hello"; là khơng h p l , c câu l nh d ưi đây c ũng v y: mystring = { 'H', 'e', 'l', 'l', 'o', '\0' }; Vy hãy nh : Chúng ta ch cĩ th "gán" nhi u h ng cho m t m ng vào lúc kh i t o nĩ . Nguyên nhân là m t thao tác gán ( =) khơng th nh n v trái là c m t m ng mà ch cĩ th nh n m t trong nh ng ph n t c a nĩ. Vào th i đim kh i t o m ng là m t tr ưng h p đc bi t, vì nĩ khơng th c s là m t l nh gán m c dù nĩ s d ng d u b ng ( =). Gán giá tr cho xâu kí t Vì v trái c a m t l nh gán ch cĩ th là m t ph n t c a m ng ch khơng th là c m ng, chúng ta cĩ th gán m t xâu kí t cho m t m ng ki u char s d ng m t ph ươ ng pháp nh ư sau: mystring[0] = 'H'; mystring[1] = 'e'; Trang49
  50. Updatesofts.com EbooksTeam mystring[2] = 'l'; mystring[3] = 'l'; mystring[4] = 'o'; mystring[5] = '\0'; Nh ưng rõ ràng đây khơng ph i là m t ph ươ ng pháp th c t . ð gán giá tr cho m t xâu kí t, chúng ta cĩ th s d ng lo t hàm ki u strcpy ( str ing copy ), hàm này đưc đnh ngh ĩa trong string.h và cĩ th đưc g i nh ư sau: strcpy ( string1 , string2 ); Lnh này copy n i dung c a string2 sang string1 . string2 cĩ th là m t m ng, con tr hay m t hng xâu kí t , b i v y l nh sau đây là m t cách đúng đ gán xâu h ng "Hello" cho mystring : strcpy (mystring, "Hello"); Ví d : // setting value to string J. Soulie #include #include int main () { char szMyName [20]; strcpy (szMyName,"J. Soulie"); cout đ cĩ th s d ng hàm strcpy . Mc dù chúng ta luơn cĩ th vi t m t hàm đơ n gi n nh ư hàm setstring d ưi đây đ th c hi n m t thao tác gi ng nh ư strcpy : // setting value to string J. Soulie #include void setstring (char szOut [], char szIn []) { int n=0; do { szOut[n] = szIn[n]; n++; } while (szIn[n] != 0); } int main () Trang50
  51. Updatesofts.com EbooksTeam { char szMyName [20]; setstring (szMyName,"J. Soulie"); cout Hello Juan. Which is your favourite team? Inter int main () Milan { I like Inter Milan too. char mybuffer [100]; cout > đ nh n d li u tr c ti p t đu vào chu n. Ph ươ ng th c này cĩ th đưc dùng v i các Trang51
  52. Updatesofts.com EbooksTeam xâu kí t thay cho cin.getline . Ví d , trong ch ươ n trình c a chúng ta, khi chúng ta mu n nh n d li u t ng ưi dùng chúng ta cĩ th vi t: cin >> mybuffer; lnh này s làm vi c nh ư nĩ cĩ nh ng h n ch sau mà cin.getline khơng cĩ: • Nĩ ch cĩ th nh n nh ng t đơ n (khơng nhn đưc c câu) vì ph ươ ng th c này s d ng kí t tr ng(bao g m c d u cách, d u tab và d u xu ng dịng) làm d u hi u k t thúc • Nĩ khơng cho phép ch đnh kích th ưc cho b đm. Ch ươ ng trình c a b n cĩ th ch y khơng n đnh n u d li u vào l n h ơn kích c c a m ng ch a nĩ. Vì nh ng nguyên nhân trên, khi mu n nh p vào các xâu kí t b n nên s d ng cin.getline thay vì cin >> . Chuy n đi xâu kí t sang các ki u khác. Vì m t xâu kí t cĩ th bi u di n nhi u ki u d li u khác nh ư d ng s nên vi c chuy n đi ni dung nh ư v y sang d ng s là r t h u ích. Ví d , m t xâu cĩ th mang giá tr "1977" nh ưng đĩ là m t chu i g m 5 kí t (k c kí t null) và khơng d gì chuy n thành mt s nguyên. Vì v y th ư vi n cstdlib ( stdlib.h ) đã cung c p 3 macro/hàm h u ích sau: • atoi: chuy n xâu thành ki u int . • atol: chuy n xâu thành ki u long . • atof: chuy n xâu thành ki u float . Tt c các hàm này nh n m t tham s và tr v giá tr s ( int , long ho c float ). Các hàm này khi k t h p v i ph ươ ng th c getline c a cin là m t cách đáng tin c y h ơn ph ươ ng th c cin>> c đin khi yêu c u ng ưi s d ng nh p vào m t s : // cin and ato* functions Enter price: 2.75 #include Enter quantity: 21 #include Total price: 57.75 int main () { char mybuffer [100]; float price; int quantity; cout << "Enter price: "; cin.getline (mybuffer,100); price = atof (mybuffer); cout << "Enter quantity: "; cin.getline (mybuffer,100); quantity = atoi (mybuffer); cout << "Total price: " << price*quantity; Trang52
  53. Updatesofts.com EbooksTeam return 0; } Các hàm đ thao tác trên chu i Th ư vi n cstring ( string.h ) khơng ch cĩ hàm strcpy mà cịn cĩ nhi u hàm khác đ thao tác trên chu i. D ưi đây là gi i thi u l ưt qua c a các hàm thơng d ng nh t: strcat: char* strcat (char* dest , const char* src ); Gn thêm chu i src vào phía cu i c a dest . Tr v dest . strcmp: int strcmp (const char* string1 , const char* string2 ); So sánh hai xâu string1 và string2 . Tr v 0 n u hai xâu là b ng nhau. strcpy: char* strcpy (char* dest , const char* src ); Copy n i dung c a src cho dest . Tr v dest . strlen: size_t strlen (const char* string ); Tr v đ dài c a string . Chú ý: char* hồn tồn t ươ ng đươ ng v i char[] Trang53
  54. Updatesofts.com EbooksTeam Con tr Chúng ta đã bi t các bi n chính là các ơ nh mà chúng ta cĩ th truy xu t d ưi các tên. Các bi n này đưc l ưu tr t i nh ng ch c th trong b nh . ði v i ch ươ ng trình c a chúng ta, b nh máy tính ch là m t dãy g m các ơ nh 1 byte, m i ơ cĩ m t đa ch xác đnh. Mt s mơ hình t t đi v i b nh máy tính chính là m t ph trong m t thành ph . Trên mt ph t t c các ngơi nhà đu đưc đánh s tu n t v i m t cái tên duy nh t nên n u chúng ta nĩi đn s 27 ph Tr n H ưng ðo thì chúng ta cĩ th tìm đưc n ơi đĩ mà khơng lm l n vì ch cĩ m t ngơi nhà v i s nh ư v y. Cũng v i cách t ch c t ươ ng t nh ư vi c đánh s các ngơi nhà, h điu hành t ch c b nh thành nh ng s đơ n nh t, tu n t , nên n u chúng ta nĩi đn v trí 1776 trong b nh chúng ta bi t chính xác ơ nh đĩ vì ch cĩ m t v trí v i đa ch nh ư v y. Tốn t l y đa ch ( &). Vào th i đim mà chúng ta khai báo m t bi n thì nĩ ph i đưc l ưu tr trong m t v trí c th trong b nh . Nĩi chung chúng ta khơng quy t đnh n ơi nào bi n đĩ đưc đt - th t may m n r ng điu đĩ đã đưc làm t đng b i trình biên d ch và h điu hành, nh ưng mt khi h điu hành đã gán m t đa ch cho bi n thì chúng ta cĩ th mu n bi t bi n đĩ đưc l ưu tr đâu. ðiu này cĩ th đưc th c hi n b ng cách đt tr ưc tên bi n m t d u và ( &), cĩ ngh ĩa là "đa ch c a". Ví d : ted = &andy; s gán cho bi n ted đa ch c a bi n andy , vì khi đt tr ưc tên bi n andy d u và ( &) chúng ta khơng cịn nĩi đn n i dung c a bi n đĩ mà ch nĩi đn đa ch c a nĩ trong b nh . Gi s r ng bi n andy đưc đt ơ nh cĩ đa ch 1776 và chúng ta vi t nh ư sau: andy = 25; fred = andy; ted = &andy; kt qu s gi ng nh ư trong s ơ đ d ưi đây: Trang54
  55. Updatesofts.com EbooksTeam Chúng ta đã gán cho fred n i dung c a bi n andy nh ư chúng ta đã làm r t l n nhi u khác trong nh ng ph n tr ưc nh ưng v i bi n ted chúng ta đã gán đa ch mà h điu hành l ưu giá tr c a bi n andy , chúng ta v a gi s nĩ là 1776 . Nh ng bi n l ưu tr đa ch c a m t bi n khác (nh ư ted trong ví d tr ưc) đưc g i là con tr . Trong C++ con tr cĩ r t nhi u ưu đim và chúng đưc s d ng r t th ưng xuyên, Ti p theo chúng ta s th y các bi n ki u này đưc khai báo nh ư th nào. Tốn t tham chi u ( *) Bng cách s d ng con tr chúng ta cĩ th truy xu t tr c ti p đn giá tr đưc l ưu tr trong bi n đưc tr b i nĩ b ng cách đ tr ưc tên bi n con tr m t d u sao ( *) - đây cĩ th đưc d ch là " giá tr đưc tr b i". Vì v y, n u chúng ta vi t: beth = *ted; (chúng ta cĩ th đc nĩ là: "beth b ng giá tr đưc tr b i ted" beth s mang giá tr 25 , vì ted b ng 1776 và giá tr tr b i 1776 là 25 . Bn ph i phân bi t đưc r ng ted cĩ giá tr 1776 , nh ưng *ted (v i m t d u sao đng tr ưc) tr t i giá tr đưc l ưu tr trong đa ch 1776 , đĩ là 25 . Hãy chú ý s khác bi t gi a vi c cĩ hay khơng cĩ d u sao tham chi u. beth = ted; // beth b ng ted ( 1776 ) beth = *ted; // beth b ng giá tr đưc tr b i( 25 ) Tốn t l y đa ch ( &) Trang55
  56. Updatesofts.com EbooksTeam Nĩ đưc dùng nh ư là m t ti n t c a bi n và cĩ th đưc d ch là " đa ch c a", vì v y &variable1 cĩ th đưc đc là " đa ch c a variable1 ". Tốn t tham chi u ( *) Nĩ ch ra r ng cái c n đưc tính tốn là n i dung đưc tr b i bi u th c đưc coi nh ư là mt đa ch . Nĩ cĩ th đưc d ch là " giá tr đưc tr b i" *mypointer đưc đc là "giá tr đưc tr b i mypointer ". Vào lúc này, v i nh ng ví d đã vi t trên andy = 25; ted = &andy; bn cĩ th d dàng nh n ra t t c các bi u th c sau là đúng: andy == 25 &andy == 1776 ted == 1776 *ted == 25 Khai báo bi n ki u con tr Vì con tr cĩ kh n ăng tham chi u tr c ti p đn giá tr mà chúng tr t i nên c n thi t ph i ch rõ ki u d li u nào mà m t bi n con tr tr t i khai báo nĩ. Vì v y, khai báo c a m t bi n con tr s cĩ m u sau: type * pointer_name ; trong đĩ type là ki u d li u đưc tr t i, khơng ph i là ki u c a b n thân con tr . Ví d : int * number; char * character; float * greatnumber; đĩ là ba khai báo c a con tr . M i bi n đu tr t i m t ki u d li u khác nhau nh ưng c ba đu là con tr và chúng đu chi m m t l ưng b nh nh ư nhau (kích th ưc c a m t bi n con tr tùy thu c vào h điu hành). nh ưng d li u mà chúng tr t i khơng chi m lưng b nh nh ư nhau, m t ki u int , m t ki u char và cái cịn l i ki u float . Tơi ph i nh n m nh l i r ng d u sao ( *) mà chúng ta đt khi khai báo m t con tr ch cĩ ngh ĩa r ng: đĩ là m t con tr và hồn tồn khơng liên quan đn tốn t tham chi u mà chúng ta đã xem xét tr ưc đĩ. ðĩ đơ n gi n ch là hai tác v khác nhau đưc bi u di n b i cùng m t d u. // my first pointer value1==10 / value2==20 #include Trang56
  57. Updatesofts.com EbooksTeam int main () { int value1 = 5, value2 = 15; int * mypointer; mypointer = &value1; *mypointer = 10; mypointer = &value2; *mypointer = 20; cout int main () { int value1 = 5, value2 = 15; int *p1, *p2; p1 = &value1; // p1 = đa ch ca value1 p2 = &value2; // p2 = đa ch ca value2 *p1 = 10; // giá tr tr bi p1 = 10 *p2 = *p1; // giá tr tr bi p2 = giá tr tr b i p1 p1 = p2; // p1 = p2 (phép gán con tr ) *p1 = 20; // giá tr tr bi p1 = 20 cout << "value1==" << value1 << "/ value2==" << value2; return 0; } Mt dịng cĩ th gây s chú ý c a b n là: Trang57
  58. Updatesofts.com EbooksTeam int *p1, *p2; dịng này khai báo hai con tr b ng cách đt d u sao ( *) tr ưc m i con tr . Nguyên nhân là ki u d li u khai báo cho c dịng là int và vì theo th t t ph i sang trái, d u sao đưc tính tr ưc tên ki u. Chúng ta đã nĩi đn điu này trong bài 1.3: Các tốn t . Con tr và m ng. Trong th c t , tên c a m t m ng t ươ ng đươ ng v i đa ch ph n t đu tiên c a nĩ, gi ng nh ư m t con tr t ươ ng đươ ng v i đa ch c a phn t đu tiên mà nĩ tr t i, vì v y th c t chúng hồn tồn nh ư nhau. Ví d , cho hai khai báo sau: int numbers [20]; int * p; lnh sau s h p l : p = numbers; đây p và numbers là t ươ ng đươ ng và chúng cĩ c ũng thu c tính, s khác bi t duy nh t là chúng ta cĩ th gán m t giá tr khác cho con tr p trong khi numbers luơn tr đn ph n t đu tiên trong s 20 ph n t ki u int mà nĩ đưc đnh ngh ĩa v i. Vì v y, khơng gi ng nh ư p - đĩ là m t bi n con tr bình th ưng, numbers là m t con tr h ng. L nh gán sau đây là khơng h p l : numbers = p; bi vì numbers là m t m ng (con tr h ng) và khơng cĩ giá tr nào cĩ th đưc gán cho các h ng. Vì con tr c ũng cĩ m i tính ch t c a m t bi n nên t t c các bi u th c cĩ con tr trong ví d d ưi đây là hồn tồn h p l : // more pointers 10, 20, 30, 40, 50, #include int main () { int numbers[5]; int * p; p = numbers; *p = 10; p++; *p = 20; p = &numbers[2]; *p = 30; p = numbers + 3; *p = 40; p = numbers; *(p+4) = 50; for (int n=0; n<5; n++) cout << numbers[n] << ", "; return 0; Trang58
  59. Updatesofts.com EbooksTeam } Trong bài "m ng" chúng ta đã dùng d u ngo c vuơng đ ch ra ph n t c a m ng mà chúng ta mu n tr đn. C p ngo c vuơng này đưc coi nh ư là tốn t offset và ý ngh ĩa ca chúng khơng đi khi đưc dùng v i bi n con tr . Ví d , hai bi u th c sau đây: a[5] = 0; // a [offset of 5] = 0 *(a+5) = 0; // pointed by (a+5) = 0 là hồn tồn t ươ ng đươ ng và h p l b t k a là m ng hay là m t con tr . Kh i t o con tr Khi khai báo con tr cĩ th chúng ta s mu n ch đnh rõ ràng chúng s tr t i bi n nào, int number; int *tommy = &number; là t ươ ng đươ ng v i: int number; int *tommy; tommy = &number; Trong m t phép gán con tr chúng ta ph i luơn luơn gán đa ch mà nĩ tr t i ch khơng ph i là giá tr mà nĩ tr t i. B n c n ph i nh r ng khi khai báo m t bi n con tr , d u sao (*) đưc dùng đ ch ra nĩ là m t con tr , và hồn tồn khác v i tốn t tham chi u. ðĩ là hai tốn t khác nhau m c dù chúng đưc vi t v i cùng m t d u. Vì v y, các câu l nh sau là khơng h p l : int number; int *tommy; *tommy = &number; Nh ư đi v i m ng, trình biên d ch cho phép chúng ta kh i t o giá tr mà con tr tr t i bng giá tr h ng vào th i đim khai báo bi n con tr : char * terry = "hello"; trong tr ưng h p này m t kh i nh t ĩnh đưc dành đ ch a "hello" và m t con tr tr ti kí t đu tiên c a kh i nh này ( đĩ là kí t h') đưc gán cho terry . N u "hello" đưc l ưu t i đa ch 1702, l nh khai báo trên cĩ th đưc hình dung nh ư th này: Trang59
  60. Updatesofts.com EbooksTeam cn ph i nh c l i r ng terry mang giá tr 1702 ch khơng ph i là 'h' hay "hello" . Bi n con tr terry tr t i m t xâu kí t và nĩ cĩ th đưc s d ng nh ư là đi v i m t mng (hãy nh r ng m t m ng ch đơ n thu n là m t con tr h ng). Ví d , n u chúng ta mu n thay kí t 'o' b ng m t d u ch m than, chúng ta cĩ th th c hi n vi c đĩ b ng hai cách: terry[4] = '!'; *(terry+4) = '!'; hãy nh r ng vi t terry[4] là hồn tồn gi ng v i vi t *(terry+4) m c dù bi u th c thơng d ng nh t là cái đu tiên. V i m t trong hai l nh trên xâu do terry tr đn s cĩ giá tr nh ư sau: Các phép tính s h c v i pointer Vi c th c hi n các phép tính s h c v i con tr h ơi khác so v i các ki u d li u s nguyên khác. Tr ưc h t, ch phép c ng và tr là đưc phép dùng. Nh ưng c c ng và tr đu cho k t qu ph thu c vào kích th ưc c a ki u d li u mà bi n con tr tr t i. Chúng ta th y cĩ nhi u ki u d li u khác nhau t n t i và chúng cĩ th chi m ch nhi u hơn ho c ít h ơn các ki u d li u khác. Ví d , trong các ki u s nguyên, char chi m 1 byte, short chi m 2 byte và long chi m 4 byte. Gi s chúng ta cĩ 3 con tr sau: char *mychar; short *myshort; long *mylong; và chúng l n l ưt tr t i ơ nh 1000 , 2000 and 3000 . Trang60
  61. Updatesofts.com EbooksTeam Nu chúng ta vi t mychar++; myshort++; mylong++; mychar - nh ư b n mong đi - s mang giá tr 1001 . Tuy nhiên myshort s mang giá tr 2002 và mylong mang giá tr 3004 . Nguyên nhân là khi c ng thêm 1 vào m t con tr thì nĩ s tr t i ph n t ti p theo cĩ cùng ki u mà nĩ đã đưc đnh ngh ĩa, vì v y kích th ưc tính b ng byte c a ki u d li u nĩ tr t i s đưc c ng thêm vào bi n con tr . ðiu này đúng v i c hai phép tốn c ng và tr đi v i con tr . Chúng ta c ũng hồn tồn thu đưc k t qu nh ư trên n u vi t: mychar = mychar + 1; myshort = myshort + 1; mylong = mylong + 1; Cn ph i c nh báo b n r ng c hai tốn t t ăng ( ++ ) và gi m ( ) đu cĩ quy n ưu tiên ln h ơn tốn t tham chi u ( *), vì v y bi u th c sau đây cĩ th d n t i k t qu sai: *p++; *p++ = *q++; Lnh đu tiên t ươ ng đươ ng v i *(p++) điu mà nĩ th c hi n là t ăng p ( đa ch ơ nh mà nĩ tr t i ch khơng ph i là giá tr tr t i). Lnh th hai, c hai tốn t t ăng ( ++ ) đu đưc th c hi n sau khi giá tr c a *q đưc gán cho *p và sau đĩ c q và p đu t ăng lên 1. L nh này t ươ ng đươ ng v i: *p = *q; p++; q++; Trang61
  62. Updatesofts.com EbooksTeam Nh ư đã nĩi trong các bài tr ưc, tơi khuyên các b n nên dùng các c p ngo c đơ n đ tránh nh ng k t qu khơng mong mu n. Con tr tr t i con tr C++ cho phép s d ng các con tr tr t i các con tr khác gi ng nh ư là tr t i d li u. ð làm vi c đĩ chúng ta ch c n thêm m t d u sao ( *) cho m i m c tham chi u. char a; char * b; char c; a = 'z'; b = &a; c = &b; gi s r ng a,b,c đưc l ưu các ơ nh 7230 , 8092 and 10502 , ta cĩ th mơ t đon mã trên nh ư sau: ðim m i trong ví d này là bi n c, chúng ta cĩ th nĩi v nĩ theo 3 cách khác nhau, m i cách s t ươ ng ng v i m t giá tr khác nhau: c là m ột bi ến cĩ ki ểu (char ) mang giá tr ị 8092 *c là m ột bi ến cĩ ki ểu (char*) mang giá tr ị 7230 c là m ột bi ến cĩ ki ểu (char) mang giá tr ị 'z' Con tr khơng ki u Con tr khơng ki u là m t lo i con tr đc bi t. Nĩ cĩ th tr t i b t kì lo i d li u nào, t giá tr nguyên ho c th c cho t i m t xâu kí t . H n ch duy nh t c a nĩ là d li u đưc tr t i khơng th đưc tham chi u t i m t cách tr c ti p (chúng ta khơng th dùng tốn t tham chi u * v i chúng) vì đ dài c a nĩ là khơng xác đnh và vì v y chúng ta ph i dùng đn tốn t chuy n ki u d li u hay phép gán đ chuy n con tr khơng ki u thành m t con tr tr t i m t lo i d li u c th . Mt trong nh ng ti n ích c a nĩ là cho phép truy n tham s cho hàm mà khơng c n ch rõ ki u // integer increaser 6, 10, 13 #include void increase (void* data, int Trang62
  63. Updatesofts.com EbooksTeam type) { switch (type) { case sizeof(char) : (*((char*)data))++; break; case sizeof(short): (*((short*)data))++; break; case sizeof(long) : (*((long*)data))++; break; } } int main () { char a = 5; short b = 9; long c = 12; increase (&a,sizeof(a)); increase (&b,sizeof(b)); increase (&c,sizeof(c)); cout int addition (int a, int b) { return (a+b); } int subtraction (int a, int b) { return (a-b); } int (*minus)(int,int) = subtraction; int operation (int x, int y, int (*functocall)(int,int)) { int g; Trang63
  64. Updatesofts.com EbooksTeam g = (*functocall)(x,y); return (g); } int main () { int m,n; m = operation (7, 5, &addition); n = operation (20, m, minus); cout <<n; return 0; } Trong ví d này, minus là m t con tr tồn c c tr t i m t hàm cĩ hai tham s ki u int , con tr này đưc gám đ tr t i hàm subtraction , t t c đu trên m t dịng: int (* minus)(int,int) = subtraction; Trang64
  65. Updatesofts.com EbooksTeam B nh đng Cho đn nay, trong các ch ươ ng trình c a chúng ta, t t c nh ng ph n b nh chúng ta cĩ th s d ng là các bi n các m ng và các đi t ưng khác mà chúng ta đã khai báo. Kích c ca chúng là c đnh và khơng th thay đi trong th i gian ch ươ ng trình ch y. Nh ưng n u chúng ta c n m t l ưng b nh mà kích c c a nĩ ch cĩ th đưc xác đnh khi ch ươ ng trình ch y, ví d nh ư trong tr ưng h p chúng ta nh n thơng tin t ng ưi dùng đ xác đnh lưng b nh c n thi t. Gi i pháp đây chính là b nh đng , C++ đã tích h p hai tốn t new và delete đ th c hi n vi c này Hai tốn t new và delete ch cĩ trong C++. ph n sau c a bài chúng ta s bi t nh ng thao tác t ươ ng đươ ng v i các tốn t này trong C. Tốn t new và new[ ] ð cĩ th cĩ đưc b nh đng chúng ta cĩ th dùng tốn t new . Theo sau tốn t này là tên ki u d li u và cĩ th là s ph n t c n thi t đưc đt trong c p ngo c vuơng. Nĩ tr v m t con tr tr t i đu c a kh i nh v a đưc c p phát. D ng th c c a tốn t này nh ư sau: pointer = new type ho c pointer = new type [ elements ] Bi u th c đu tien đưc dùng đ c p phát b nh ch a m t ph n t cĩ ki u type . L nh th hai đưc dùng đ c p phát m t kh i nh (m t m ng) g m các ph n t ki u type . Ví d : int * bobby; bobby = new int [5]; trong tr ưng h p này, h điu hành dành ch cho 5 ph n t ki u int trong b nh và tr v m t con tr tr đn đu c a kh i nh . Vì v y lúc này bobby tr đn m t kh i nh h p l g m 5 ph n t int . Bn cĩ th h i tơi là cĩ gì khác nhau gi a vi c khai báo m t m ng v i vi c c p phát b nh cho m t con tr nh ư chúng ta v a làm. ðiu quan tr ng nh t là kích th ưc c a m t Trang65
  66. Updatesofts.com EbooksTeam mng ph i là m t h ng, điu này gi i h n kích th ưc c a m ng đn kích th ưc mà chúng ta ch n khi thi t k ch ươ ng trình trong khi đĩ c p phát b nh đng cho phép c p phát b nh trong quá trình ch y v i kích th ưc b t kì. B nh đng nĩi chung đưc qu n lí b i h điu hành và trong các mơi tr ưng đa nhi m cĩ th ch y m t lúc vài ch ươ ng trình cĩ m t kh n ăng cĩ th x y ra là h t b nh đ c p phát. N u điu này x y ra và h điu hành khơng th c p phát b nh nh ư chúng ta yêu cu v i tốn t new , m t con tr null (zero) s đưc tr v . Vì v y các b n nên ki m tra xem con tr tr v b i tốn t new cĩ b ng null hay khơng: int * bobby; bobby = new int [5]; if (bobby == NULL) { // error assigning memory. Take measures. }; Tốn t delete . Vì b nh đng ch c n thi t trong m t kho ng th i gian nh t đnh, khi nĩ khơng c n dùng đn n a thì nĩ s đưc gi i phĩng đ cĩ th c p phát cho các nhu c u khác trong tươ ng lai. ð th c hi n vi c này ta dùng tốn t delete , d ng th c c a nĩ nh ư sau: delete pointer ; ho c delete [] pointer ; Bi u th c đu tiên nên đưc dùng đ gi i phĩng b nh đưc c p phát cho m t ph n t và l nh th hai dùng đ gi i phĩng m t kh i nh g m nhi u ph n t (m ng). Trong h u ht các trình d ch c hai bi u th c là t ươ ng đươ ng mc dù chúng là rõ ràng là hai tốn t khác nhau. // rememb-o-matic How many numbers do you want to #include type in? 5 #include Enter number : 75 Enter number : 436 int main () Enter number : 1067 { Enter number : 8 char input [100]; Enter number : 32 int i,n; You have entered: 75, 436, 1067, 8, long * l, total = 0; 32, cout << "How many numbers do you want to type in? "; cin.getline (input,100); i=atoi (input); l= new long[i]; if (l == NULL) exit (1); for (n=0; n<i; n++) { cout << "Enter number: "; cin.getline (input,100); l[n]=atol (input); } Trang66
  67. Updatesofts.com EbooksTeam cout << "You have entered: "; for (n=0; n<i; n++) cout << l[n] << ", "; delete[] l; return 0; } NULL là m t h ng s đưc đnh ngh ĩa trong th ư vi n C++ dùng đ bi u th con tr null. Trong tr ưng h p h ng s này ch ưa đnh ngh ĩa b n cĩ th t đnh ngh ĩa nĩ: #define NULL 0 Dùng 0 hay NULL khi ki m tra con tr là nh ư nhau nh ưng vi c dùng NULL v i con tr đưc s d ng r t r ng rãi và điu này đưc khuy n khích đ giúp cho ch ươ ng trình d đc h ơn. B nh đng trong ANSI-C Tốn t new và delete là đc quy n C++ và chúng khơng cĩ trong ngơn ng C. Trong ngơn ng C, đ cĩ th s d ng b nh đng chúng ta ph i s d ng th ư vi n stdlib.h . Chúng ta s xem xét cách này vì nĩ c ũng h p l trong C++ và nĩ v n cịn đưc s d ng trong m t s ch ươ ng trình. Hàm malloc ðây là m t hàm t ng quát đ c p phát b nh đng cho con tr . C u trúc c a nĩ nh ư sau: void * malloc (size_t nbytes ); trong đĩ nbytes là s byte chúng ta mu n gán cho con tr . Hàm này tr v m t con tr ki u void* , vì v y chúng ta ph i chuy n đi ki u sang ki u c a con tr đích, ví d : char * ronny; ronny = (char *) malloc (10); ðon mã này c p phát cho con tr ronny m t kh i nh 10 byte. Khi chúng ta mu n c p phát m t kh i d li u cĩ ki u khác char (l n h ơn 1 byte) chúng ta ph i nhân s ph n t mong mu n v i kích th ưc c a chúng. Th t may m n là chúng ta cĩ tốn t sizeof , tốn t này tr v kích th ưc c a m t ki u d li u c th . int * bobby; bobby = (int *) malloc (5 * sizeof(int)); ðon mã này c p phát cho bobby m t kh i nh g m 5 s nguyên ki u int , kích c c a ki u d li u này cĩ th b ng 2, 4 hay h ơn tùy thu c vào h th ng mà ch ươ ng trình đưc dch. Trang67