You are on page 1of 132

T hc C++ trong 21 ngy.

Teache yourself C++.

Danh mc: Cc ph n ca mt chng trnh C++. Gii thiu hm Cout. Trnh b y ch thch. nh ngha h m. Hng s v b in s. Cc k iu b in s. Typedef. K t d c bit. Hng s . Hng s lit k . Biu thc v cu lnh . Cu lnh . Biu th c. Cc ton t. Ton t tng v g im. Cu lnh if. Ton t l gc. Ton t ph thuc. Cc loi hm. Kh ai b o hm Nguy n mu h m. Bin khu vc (b in a phng ). Bin ton c c. Gi tr tr v. Tham s mc nh. Cc h m xp chng. Cc h m InLin e.

Trang 1

T hc C++ trong 21 ngy.


qui.

Cc lp c bn
To ra mt kiu mi. Khai bo lp( class ). nh ngha i tng (objects). Private v public. Class. Cc hm trong lp. Cch t khai bo lp v hm.

Cc loi vng lp.

Lnh goto. While. Continue v break. While(1). Do ... While.

FOR.
Vng lp lng. Switch.

Con tr.
Con tr, a ch, bin. Khai bo con tr.

Reference
C php:

Trang 2

T hc C++ trong 21 ngy.

Cc phn ca chng trnh C++.


Cc chng trnh C++ bao gm : cc i tng (obj), cc bin (var) v cc thnh phn khc.

I.1

Mt chng trnh n gin.


1: #include <iostream.h> 2: 3: int main() 4: { 5: 6: 7: } Hello World! cout << "Hello World!\n"; return 0;

V d ly chng trnh HELLO.CPP gii thch cc phn ca mt chng trnh C++.

Dng 1 l th vin # iostream.h. K t u tin l biu tng # : l mt tn hiu cho b tin x l. Mi ln bt u bin dch, b tin x l c chy. B tin x l c m ngun ca bn, tm kim nhng dng bt u vi du ( #) v thc hin cc dng ny trc khi bin dch. Include l mt lnh tin x l. Du ngoc n <file name > ch cho b tin x l tm trong tt c cc v tr thng thng i vi file ny. Nu b bin dch c thit lp ng, du ngoc < > s lm cho b tin x l tm kim file " iostream.h" trong th mc m cha tt c cc file H cho b bin dch.

Trang 3

T hc C++ trong 21 ngy.


( file "iostream.h" [ Input-Oput-Stream] c dng bi hm "cout"_ gip cho vic vit ra mn hnh. ) Dng 3 bt u chng trnh thng thng vi hm c tn " main() ". Mi chng ttrnh C++ u c 1 hm main(). Ni chung," hm l 1 khi m lnh m thc hin 1 hoc nhiu cng vic." Cc hm thng thng c gi bi cc hm khc, nhng main() l c bit. Khi chng trnh bt u, main() c t ng gi ln. ( main(), ging nh tt cc hm, phi nh r loi gi tr no n s tr v. Kiu gi tr tr v i vi main() trong HELLO.CPP l "void" _ngha l hm ny s khng tr v bt c gi tr no. ) Tt c cc hm bt u vi mt ngoc m ({) v kt thc mt du ngoc ng (}). Du ngoc ca main() l trn dng 4 v dng 7. Phn cn bn ca chng trnh l dng s 5. Hm "cout" dng in mt bn tin ra mn hnh. Cch dng cout : t cout t sau ton t (<<). Bt c ci g sau du ny th u c vit ln mn hnh. Nu bn mun vit mt chui k t, phi vit chng trong du ngoc kp ("), nh dng 5. Cui cng l 2 k t : " \n " _ bo hm cout nhy xung mt dng mi sau t Hello World ! y l m c bit c gii thch k phn sau. Trong quyn sch ny hm main() s lun tr v 0.

I.2
1: 2: 3: 4: 5: 6: 7: 8:

Mt ci nhn ngn gn v hm Cout.


// Listing 2.2 using cout

Listing 2.2.Using cout.

#include <iostream.h> int main() { cout << "Hello there.\n"; cout << "Here is 5: " << 5 << "\n"; cout << "The manipulator endl writes a new line to the screen." << endl;

9: 10: 11: 12:

cout << "Here is a very big number:\t" << 70000 << endl; cout << "Here is the sum of 8 and 5:\t" << 8+5 << endl; cout << "Here's a fraction:\t\t" << (float) 5/8 << endl; cout << "And a very very big number:\t" << (double) 7000 * 7000 << endl;

Trang 4

T hc C++ trong 21 ngy.


13: 14: 15: 16: } cout << "Don't forget to replace Jesse Liberty with your name...\n"; cout << "Jesse Liberty is a C++ programmer!\n"; return 0;

Hello there. Here is 5: 5 The manipulator endl writes a new line to the screen. Here is a very big number: Here is the sum of 8 and 5: Here's a fraction: 70000 13

0.625 4.9e+07

And a very very big number:

Don't forget to replace Jesse Liberty with your name... Jesse Liberty is a C++ programmer! Ch : 3 gi tr c a ra trn dng 7, mi gi tr c tch ra bi ton t chn. Gi tr u tin l chui " Here is 5: ". Ch c du cch sau du hai chm. Du cch l mt phn ca chui. Tip n, gi tr 5 c a ra n ton t chn v k t dng mi ( lun lun trong du ngoc kp hay du ngoc n). iu ny to ra dng: Here is 5: 5 c in ra mn hnh. V khng c k t dng mi nn gi tr sau s c in ngay sau . y gi l mc ni 2 gi tr. Trn dng 8, bn tin c in ra, v sau lnh " endl" c s dng. Mc ch ca "endl " l vit mt dng mi ra mn hnh. Trn dng 9, ( \t) c a vo. y l chn mt k t "tab" v n c dng trn dng 812. Dng 9 ch ra rng khng ch c cc s nguyn, s nguyn di cng c in ra. Dng 10 gii thch rng: cout s thc hin phn b sung n gin. Gi tr ca 8+5 c a ra bi cout, nhng 13 c in ra. Trn dng 11, gi tr 5/8 c chn vo cout. S hng (float) ch ra cho cout rng bn mun gi tr ny c gi tr tng h s 10, v v vy mt phn s c in. Trn dng 12, gi tr 7000*7000 a ti cout v s hng (double) ch cho cout bit bn mun ci ny c in ra s dng k hiu ton hc

I.3

Ch thch (Comments).
Dng gii thch cu lnh cho d hiu v gii thiu c cc thng tin v tc gi v thi

gian sa i mi nht cho d nng cp.

Trang 5

T hc C++ trong 21 ngy.


Trong C++ c hai cch bo hiu li ch thch l : ( // ) v ( /* ). Du ( // ) ny bo cho chng trnh bin dch b qua tt c nhng g sau du ch thch ny, ti tn ht dng. Du ( /* ) ny bo cho chng trnh bin dch b qua tt c nhng g sau du ch thch ny, ti khi tm thy mt ( /* ) khc. Cch s dng Comments: Mt qui lut chung, nn c mt ch thch u ca ton chng trnh, ni ln chng ttrnh lm ci g. Mi hm cng nn c ch thch gii thch hm lm ci g v n tr v gi tr no. Nu trong chng trnh c cu lnh no kh hiu th cng nn c ch thch lm sng t vn . Listing 2.3. HELP.CPP demonstrates comments. 1: #include <iostream.h> 2: 3: int main() 4: { 5: /* this is a comment 6: and it extends until the closing 7: star-slash comment mark */ 8: cout << "Hello World!\n"; 9: // this comment ends at the end of the line 10: cout << "That comment ended!\n"; 11: 12: // double slash comments can be alone on a line 13: /* as can slash-star comments */ 14: 15: } Hello World! That comment ended! Ch thch u mi file. Thng tin v tn ca chng trnh. Tn ca file C hm hoc chng trnh g. M t chung v cng vic ca chng trnh. Tn tc gi. return 0;

Trang 6

T hc C++ trong 21 ngy.


V d : /************************************************************ Program: Hello World File: Hello.cpp Function: Main (complete program listing in this file) Description: Prints the words "Hello world" to the screen Author: Jesse Liberty (jl) Environment: Turbo C++ version 4, 486/66 32mb RAM, Windows 3.1 DOS 6.0. EasyWin module. Notes: This is an introductory, sample program. Revisions: 1.00 10/1/94 (jl) First release 1.01 10/2/94 (jl) Capitalized "World" ************************************************************/ Lch s ca qu trnh sa i. Trnh bin dch v kt ni no v cc cng c khc c dng thc hin chng trnh. Thm cc ch nu cn.

I.4

Hm ( Functions ).
Hm main() l c bit. Cc hm thng thng c gi trong chng trnh ca bn. Mt

chng trnh c x l tng dng theo th t m n c trong m ngun, tn khi n mt hm. Sau chng trnh r nhnh x l hm. Khi hm kt thc, n tr li iu khin cho dng m ngay sau n. Khi mt chng trnh cn thc hin mt dch v, n c th gi mt hm thc hin dch v . V d sau minh ho iu : Listing 2.4. Demonstrating a call to a function. 1: 2: 3: 4: 5: 6: 7: 8: 9: } // function Demonstration Function // prints out a useful message void DemonstrationFunction() { cout << "In Demonstration Function\n"; #include <iostream.h>

Trang 7

T hc C++ trong 21 ngy.


10: // function main - prints out a message, then 11: // calls DemonstrationFunction, then prints out 12: // a second message. 13: int main() 14: { 15: 16: 17: 18: 19: } In main In Demonstration Function Back in main Cch s dng hm: Hm hoc tr v gi tr hoc chng tr v void ( ngha l chng tr v s khng "nothing" ). Mt hm m cng hai s nguyn, phi tr v tng v v vy s c nh ngha tr v mt gi tr s nguyn. Mt hm m ch in mt bn tin khng c ci g tr v, v vy s c khai bo tr v dng "void". Mt hm bao gm : u v thn hm. u bao gm ln lt : kiu tr v, tn hm, v cc tham s dnh cho hm. Cc tham s dnh cho hm cho php cc gi tr c a vo bn trong hm. V vy,nu hm cng 2 s, cc s s l tham s cho hm. V d mt u dng hm thng thng: int Sum(int a, int b) Mi tham s c khai bo cng vi kiu gi tr s a vo ; gi tr thng thng c a vo bng cch gi hm c gi l i s. Nhiu nh lp trnh s dng s dng hai s hng : tham s (parameters) v i s (arguments) nh l " synonyms". Nhng ngi khc cn thn i vi vic phn bit thc v chuyn mn. Trong sch ny s s dng cc s hng c th hon i cho nhau. Thn hm bao gm : mt du ngoc m, khng c hoc c cc cu lnh v du ngoc ng. Cc lnh cu trc nn cng vic ca hm. Mt hm c th tr v mt gi tr, s dng mt lnh tr v. Lnh ny cng lm cho hm kt thc. Nu khng a vo mt lnh tr v bn trong hm, n s t ng tr v dng void cui hm. Gi tr c tr v phi l dng c khai bo u hm. cout << "In main\n" ; DemonstrationFunction(); cout << "Back in main\n"; return 0;

Trang 8

T hc C++ trong 21 ngy.


Listing 2.5. FUNC.CPP demonstrates a simple function. 1: #include <iostream.h> 2: int Add (int x, int y) 3: { 4: 5: 6: 7: } 8: 9: int main() 10: { 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: } cout << "I'm in main()!\n"; int a, b, c; cout << "Enter two numbers: "; cin >> a; cin >> b; cout << "\nCalling Add()\n"; c=Add(a,b); cout << "\nBack in main().\n"; cout << "c was set to " << c; cout << "\nExiting...\n\n"; return 0; cout << "In Add(), received " << x << " and " << y << "\n"; return (x+y);

I'm in main()! Enter two numbers: 3 5

Calling Add() In Add(), received 3 and 5

Back in main(). c was set to 8

Exiting...

Trang 9

T hc C++ trong 21 ngy.

II
II.1

Hng s v bin s.
Bin s l g:
Trong C++, bin s l ni lu gi thng tin. Mt bin s l mt v tr trong b nh ca

my tnh m c th lu gi mt gi tr v t bn c th truy nhp vo gi tr sau ny. B nh ca my tnh c th c xem nh l mt lot cc "cubbyholes". Mi "cubbyholes" hay v tr trong b nh c nh s ln lt. Nhng s ny c bit l a ch b nh. Mt bin lu gi trong mt hoc nhiu "cubbyholes" lu mt gi tr. Tn bin ( v d : myVariable) l mt nhn trn 1 hay nhiu "cubbyholes", v vy c th tm n d dng khng cn s hiu bit a ch b nh thng thng ca n. Cch thit lp bin: Khi nh ngha mt bin trong C++, bn phi bo cho trnh bin dch bit bin l kiu g : s nguyn, k t,.... y l thng tin bo cho trnh bin dch bit kch thc ln bao nhiu thit lp mt khong b nh v kiu gi tr bn mun lu trong bin ca bn. Mi "cubbyholes" l ln 1 byte. Nu kiu bin to ra l kch thc 2 byte, n cn 2 byte ca b nh, hay 2 "cubbyholes". Kiu bin s cho trnh bin dch bit cn bao nhiu b nh dnh cho bin.

II.1.1
-

Kch thc kiu s nguyn (Intergers)

Mt bin char (dng lu k t) thng l mt byte long. Mt short interger l 2 byte trn hu ht cc my tnh, mt long interger thng l 4 byte, v mt interger (khng phi l long hay short) c th l 2 hay 4 byte.

Mt character l mt ch n, s, hay biu tng chim 1 byte ca b nh.

Listing 3.1. Determining the size of variable types on your computer. 1: #include <iostream.h> 2: 3: int main() 4: { 5: 6: 7: 8: 9: cout << "The size of an int is:\t\t" << sizeof(int) << " bytes.\n";

cout << "The size of a short int is:\t" << sizeof(short) << " bytes.\n"; cout << "The size of a long int is:\t" << sizeof(long) << " bytes.\n"; cout << "The size of a char is:\t\t" << sizeof(char) << " bytes.\n"; cout << "The size of a float is:\t\t" << sizeof(float) << " bytes.\n";

10: cout << "The size of a double is:\t" << sizeof(double) << " bytes.\n"; 11: 12: return 0;

Trang 10

T hc C++ trong 21 ngy.


13: } Output: The size of an int is: The size of a short int is: The size of a long int is: The size of a char is: The size of a float is: The size of a double is: 2 bytes.

2 bytes. 4 bytes. 1 bytes. 4 bytes. 8 bytes.

II.1.2

S c du v khng du.

Ni chung tt c cc kiu s nguyn l 2 dng chnh : c du v khng c du. Mc ch y l thnh thong bn cn s m v khng cn. S nguyn ( short v long )khng c t "unsigned" c coi l c du (signed). S nguyn c du hoc l s dng hoc s m. S nguyn khng du lun l dng. S nguyn khng du short c gi tr t : 0 n 65535 S nguyn c du short c gi tr t : -32768 n 32767

II.1.3
-

Cc kiu bin c bn

Bin du phy ng dng biu din s thc (real) Bin Character chim 1 byte dng cha 256 k t hoc biu tng ca bng ASCII hoc ASCII m rng.

Table 3.1. Variable Types.

Type Unsigned short int Short int Unsigned long int Long int Int (16 bit) Int (32 bit) Unsigned int (16 bit) Unsigned int (32 bit) Char Float Double

Size 2 bytes 2 bytes 4 bytes 4 bytes 2 bytes 4 bytes 2 bytes 2 bytes 1 byte 4 bytes 8 bytes

Values 0 to 65,535 -32,768 to 32,767 0 to 4,294,967,295 -2,147,483,648 to 2,147,483,647 -32,768 to 32,767 -2,147,483,648 to 2,147,483,647 0 to 65,535 0 to 4,294,967,295 256 character values 1.2e-38 to 3.4e38 2.2e-308 to 1.8e308

Cch to mt bin:

Trang 11

T hc C++ trong 21 ngy.


u tin l kiu bin, sau l mt hoc nhiu du cch, sau l tn bin v du chm phy. Example 1 main() { unsigned short x; unsigned short y; ULONG z; z = x * y; } Example 2 main () { unsigned short Width; unsigned short Length; unsigned short Area; Area = Width * Length; } C th to nhiu bin cng mt lc nh sau: unsigned int myAge, myWeight; long area, width, length; // two unsigned int variables // three longs

II.1.4

T kho.

Bao gm : if, while , for, main. Khng c s dng t kha lm tn bin.

II.1.5

Gn gi tr cho bin

Gn gi tr cho bin bng cch s dng ton t (=). V d: unsigned short Width; Width = 5; Bn c th gp ba bc thnh mt bc. unsigned short Width = 5; Tng t, c th khi to cho nhiu bin cng mt lc nh sau: long width = 5, length = 7; V d ny khi to bin s nguyn long l width =5 v bin s nguyn long l length =7. Ta c th kt hp c khai bo v khi to nh sau:

Trang 12

T hc C++ trong 21 ngy.


int myAge = 39, yourAge, hisAge = 40;

Listing 3.2. A demonstration of the use of variables.


1: // Demonstration of variables 2: #include <iostream.h> 3: 4: int main() 5: { 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: } Output: Width:5 Length: 10 Area: 50 cout << "Width:" << Width << "\n"; cout << "Length: " << Length << endl; cout << "Area: " << Area << endl; return 0; // create an unsigned short and initialize with result // of multiplying Width by Length unsigned short int Area = Width * Length; unsigned short int Width = 5, Length; Length = 10;

II.1.6

Typedef

Ta c th cm thy chn ngt v bun t nu c phi s dng kiu khai bo unsigned short int. C++ cho php bn to ra mt b danh cho cm t ny bng cch s dng t kho typedef, vit tt cho s nh ngha kiu. Ta nh ngha bng cch: sau t kho typedef l kiu v sau l tn mi. V d: Typedef unsigned short int USHORT Tn mi USHORT s dng bt c u thay th cho vic vit : unsigned short int.

Listing 3.3. A demonstration of typedef.


1: // ***************** 2: // Demonstrates typedef keyword 3: #include <iostream.h> 4:

Trang 13

T hc C++ trong 21 ngy.


5: typedef unsigned short int USHORT; 6: 7: void main() 8: { 9: USHORT Width = 5; //typedef defined

10: USHORT Length; 11: Length = 10; 12: USHORT Area = Width * Length; 13: cout << "Width:" << Width << "\n"; 14: cout << "Length: " << Length << endl; 15: cout << "Area: " << Area <<endl; 16: } Output: Width:5 Length: 10 Area: 50

II.1.7

Hin tng nhy vng trong s nguyn c du v khng c du.

Hin tng nhy vng khi bin s vt qu gi tr cho php ca kiu khai bo.

Listing 3.4.A demonstration of putting too large a value in an unsigned integer.


1: #include <iostream.h> 2: int main() 3: { 4: 5: 6: 7: 8: 9: unsigned short int smallNumber; smallNumber = 65535; cout << "small number:" << smallNumber << endl; smallNumber++; cout << "small number:" << smallNumber << endl; smallNumber++;

10: cout << "small number:" << smallNumber << endl; 11: 12: } Output: small number:65535 small number:0 small number:1 return 0;

Trang 14

T hc C++ trong 21 ngy. Listing 3.5. A demonstration of adding too large a number to a signed integer.
1: #include <iostream.h> 2: int main() 3: { 4: 5: 6: 7: 8: 9: short int smallNumber; smallNumber = 32767; cout << "small number:" << smallNumber << endl; smallNumber++; cout << "small number:" << smallNumber << endl; smallNumber++;

10: cout << "small number:" << smallNumber << endl; 11: 12: } Output: small number:32767 small number:-32768 small number:-32767 return 0;

II.1.8

Characters

Bin k t ( type char ) l 1 byte, cha 256 gi tr. Mt char c th c dch nh l mt s nh ( 0-255) hay nh l mt s ca tp ASCII. Trong m ASCII, "a" c xc nh bng gi tr 97. Tt c ch thng v ch hoa, ch s v cc du chm c gi tr trong khong 1 n 128.

Listing 3.6. Printing characters based on numbers


1: #include <iostream.h> 2: int main() 3: { 4: for (int i = 32; i<128; i++) 5: 6: 7: } Output: !"#$%G'()*+,./0123456789:;<>?@ABCDEFGHIJKLMNOP _QRSTUVWXYZ[\]^'abcdefghijklmnopqrstuvwxyz<|>~s cout << (char) i; return 0;

Trang 15

T hc C++ trong 21 ngy.


II.1.9 Cc k t c bit
Trnh bin dch C++ chp nhn mt s k t nh dng. Bn phi t k t ny vo trong on m bng cch nh du gch cho ( c gi l k t iu khin ), sau l k t. V vy a mt k t tab vo trong on m, thc hin nh sau : Char tabCharacter = '\t' ; V d ny khai bo mt bin char (tabCharacter) v khi to n vi k t \t , m c chp nhn nh l mt tab. Cc k t in c bit c dng khi in hoc ra mn hnh hoc ra mt thit b u ra.

Table 3.2. The Escape Characters. Character


\n \t \b \" \' \? \\

What it means
New line Tab Backspace Double quote Single quote Question mark Backslash

II.2

Hng s.

Ging nh bin s, hng s cng l ni lu tr d liu. Bn phi khi to hng s khi to ra n v khng th gn mt gi tr mi. Trong C++ c hai kiu hng : ch v biu tng.

II.2.1
V d :

Hng s kiu ch
Int myAge = 39 ;

MyAge l mt bin kiu int ; 39 l mt hng s dng ch. Bn khng th gn mt gi tr cho 39, v gi tr ca n khng th thay i c.

II.2.2

Hng s kiu biu tng.

L mt hng s m c i din bng 1 tn, ch nh l mt bin nhng khng ging nh bin, gi tr ca n sau khi khi to th khng thay i c. Nu chng trnh c mt bin s nguyn t tn l : students v mt bin khc tn l : classes, c th tnh ton c bao nhiu sinh vin, nu bit c 15sinh vin/1 lp : Students = classes * 15 ; Trong v d ny, 15 l hng s kiu ch s. on m tr ln d c v d sa. Nu thay th bng mt hng s kiu ch cho gi tr ny th s l:

Trang 16

T hc C++ trong 21 ngy.


Students = classes * studentsPerClass ; Nu sau mun thay i s sinh vin/lp, c th lm iu ni nh ngha hng s studentsPerClass khng cn thc hin s thay i bt c ni no bn dng gi tr ny. C hai cch khai bo mt hng s kiu biu tng trong C++. Cch truyn thng v kiu hin nay l dng b tin x l, #define. Hng s nh ngha vi #define nh ngha mt hng s theo cch truyn thng, c th thc hin nh sau: #define studentsPerClass 15 Ch rng studentsPerClass l khng phi l kiu c th ( int, char,....). #define thc hin mt s thay th on vn bn n gin. Mi ln tin x l nhn thy t studentsPerClass, n s thay bng 15. V b tin x l chy trc trnh bin dch, do trnh bin dch khng bao gi nhn thy hng s ; n ch thy s 15. Cc bin nh ngha const, mc d #define lm vic, c mt cch mi tt hn nhiu cch nh ngha hng trong C++ : const unsigned short int studentsPerClass = 15; V d ny cng khai bo mt hng s biu tng t tn studentsPerClass, nhng ln ny studentsPerClass l kiu unsigned short int. Phng php ny c mt s u im lm cho vic sa d dng hn v ngn nga s ri lon. S khc nhau ln nht l hng ny c mt kiu, v trnh bin dch c th bt buc dng ng theo kiu ca n. Ch : khng nn dng kiu int chung m ch r kiu short hay long.

II.2.3

Hng s lit k.

Cho php to ra nhiu kiu mi v sau nh ngha cc bin ca nhng kiu ny,ton b gi tr c hn ch trong mt tp cc gi ttr c th. V d bn c th khai bo COLOR l mt bng kit k, v c th nh ngha c 5 gi tr i vi COLOR : RED, BLUE, GREEN, WHITE v BLACK. C php i vi hng s lit k c vit vi t kho enum, sau l tn kiu, mt du ngoc m, mi gi tr c phn cch bi mt du phy, cui cng l du ngoc ng v du chm phy. V d: Enum COLOR { RED, BLUE, GREEN, WHITE, BLACK } ; Lnh ny thc hin 2 cng vic: N t tn COLOR cho lit k, l mt kiu mi. N gn cho RED mt hng s biu tng 0, BLUE mt hng s biu tng 1, GREEN l 3, v tip tc. Mi hng s lit k c gi tr nguyn. Nu khng ch r cch xc nh khc th hng s u tin s c gi tr 0, v tip tc tng ln. Bt c 1 trong cc hng s ny c th c khi to vi mt gi tr c th. V vy nu vit: enum Color { RED=100, BLUE, GREEN=500, WHITE, BLACK=700 };

Trang 17

T hc C++ trong 21 ngy.


th RED c gi tr 100; BLUE c gi tr 101 ; GREEN c gi tr 500; WHITE c gi tr 501; v BLACK c gi tr 700. C th nh ngha bin kiu COLOR, nhng chng c th c gn 1 trong cc gi tr lit k ( trong trng hp ny, RED, BLUE, GREEN, WHITE, hoc BLACK, hoc 100, 101, 500, 501, 700 ). C th gn bt c gi tr mu no cho bin COLOR. Trong thc t, bn c th gn bt c s nguyn no, thm ch nu n khng l mu theo qui nh, mc d mt trnh bin dch tt pht ra cnh bo nu bn thc hin. Do cc bin ca kiu lit k thng l gi tr kiu " unsigned int ", v nhng hng s lit k tng ng vi cc bin s nguyn. V d :

Listing 3.7. A demonstration of enumerated constants.


1: #include <iostream.h> 2: int main() 3: { 4: enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday,

_Saturday }; 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: } Output: What day would you like off (0-6)? 1 Okay, I'll put in the vacation day. What day would you like off (0-6)? 0 You're already off on weekends! Trn dng 4, hng s kiu lit k DAYS c nh ngha, vi 7 gi tr bt u t 0. Ngi s dng c nhc nh i vi ngy trong dng 9. Gi tr c chn, mt s gia 0 v 6, c so snh trn dng 13 vi cc gi tr lit k ch nht v th by, v hnh ng i theo. if (DayOff == Sunday || DayOff == Saturday) cout << "\nYou're already off on weekends!\n"; else cout << "\nOkay, I'll put in the vacation day.\n"; return 0; cout << "What day would you like off (0-6)? "; cin >> x; DayOff = Days(x); Days DayOff; int x;

Trang 18

T hc C++ trong 21 ngy.


Ta khng th nh t " Sunday " khi c nhc ti i vi 1 ngy; chng trnh s khng bit dch nh th no k t "Sunday" ra mt gi tr lit k.

III

Biu thc v cu lnh

Mt chng trnh l mt tp cc lnh x l ni tip nhau.

III.1 Cu lnh:
Trong C++ mt cu lnh iu khin chui x l, c lng mt biu thc, hoc khng c g ( cu lnh rng ). Tt c cc cu lnh kt thc vi mt du chm phy, thm ch cu lnh "null". Mt trong cc cu lnh thng dng l lnh gn : X=a+b; Khng ging nh trong i s, cu lnh ny khng c ngha l x bng a+b. M c l " Gn gi tr ca php cng a v b cho x" hoc " Gn cho x, a+b ". Ton t gn s gn bt c ci g bn phi du bng cho bt c ci g bn tri du bng. Ch : Cu lnh null l mt cu lnh khng lm ci g.

III.1.1

Khong trng

Khong trng ( tabs, spaces, v cc dng mi) thng c b qua trong cu lnh. Cu lnh gn trn s c vit nh sau: X=a+b; Hoc nh l : X + b ; =a

Khong trng c th c dng cho chng trnh d c,d sa hn, hoc n c th c dng to ra m kinh khng v khng th c ra c. Trong trng hp ny,nh tt c mi th, C++ cung cp kh nng. Cc k t khong trng ( tab, space, newline )khng th nhn thy c. Nu cc k t ny c in ra, bn ch nhn thy khong trng trn giy.

III.1.2

Cc lnh khi v lnh phc.

Bt c ni no bn c th a vo mt cu lnh n, bn c th a vo mt cu lnh phc, cng c th c gi l mt khi. Mt khi bt u vi 1 du ngoc m ({) v kt thc vi 1 du ngoc ng (}). Mc d vy mi cu lnh trong khi phi kt thc vi mt du chm phy, khi t n khng kt thc vi mt du chm phy. V d : { temp = a;

Trang 19

T hc C++ trong 21 ngy.


a = b; b = temp; } Khi m ny hot ng nh mt lnh v s trao i cc gi tr trong cc bin a v b

III.2 Biu thc


Mt biu thc tr v mt gi tr. Do , 3+2 ; tr v gi tr 5 v v vy l mt biu thc. Tt c cc biu thc l cc lnh. 3.2 PI // returns the value 3.2 // float const that returns the value 3.14 // int const that returns 60

SecondsPerMinute

Gi s rng PI l mt hng s bng 3.14 v SecondsPerMinute l mt hng s bng 60, tt c 3 cu lnh ny l cc biu thc. Biu thc phc tp x = a + b; khng ch cng a v b v gn kt qu cho x, nhng tr v gi tr ca vic gn (gi tr ca x). V vy, lnh ny cng l mt biu thc. V l mt biu thc, n c th bn phi ca ton t gn: y = x = a + b; Dng ny c xc nh trong lnh sau : Cng a vi b. Gn kt qu ca biu thc a+b cho x. Gn kt qu ca biu thc x = a+b cho y

Listing 4.1. Evaluating complex expressions.


1: #include <iostream.h> 2: int main() 3: { 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: } int a=0, b=0, x=0, y=35; cout << "a: " << a << " b: " << b; cout << " x: " << x << " y: " << y << endl; a = 9; b = 7; y = x = a+b; cout << "a: " << a << " b: " << b; cout << " x: " << x << " y: " << y << endl; return 0;

Trang 20

T hc C++ trong 21 ngy.


Output: a: 0 b: 0 x: 0 y: 35 a: 9 b: 7 x: 16 y: 16

III.3 Cc ton t.
L biu tng m lm cho trnh bin dch hot ng. Cc ton t hot ng trn cc ton hng, v trong C++ tt c cc t l cc biu thc. Trong C++ c mt vi loi ton t khc nhau. Hai loi ton t l : Cc ton t gn. Cc ton t ton hc.

III.3.1

Ton t gn.
X=a+b;

Ton t gn (=). V d : Cc hng s u l r- gi tr. Chng khng th l 1_ gi tr. V vy, c th vit. X = 35 ; // OK Nhng khng th vit: 35 = x ; // error, not an 1 value !

III.3.2

Ton t ton hc.

C 5 ton t ton hc: cng (+), tr (-), nhn (*), chia (/), v (%).

Listing 4.2. A demonstration of subtraction and integer overflow.


1: // Listing 4.2 - demonstrates subtraction and 2: // integer overflow 3: #include <iostream.h> 4: 5: int main() 6: { 7: unsigned int difference; 8: unsigned int bigNumber = 100; 9: unsigned int smallNumber = 50; 10: difference = bigNumber - smallNumber; 11: cout << "Difference is: " << difference; 12: difference = smallNumber - bigNumber; 13: cout << "\nNow difference is: " << difference <<endl; 14: 15: } Output: Difference is: 50 return 0;

Trang 21

T hc C++ trong 21 ngy.


Now difference is: 4294967246 Ch khi thc hin php tr. Nu ly s nh hn tr i mt s ln hn, s c kt qu l s m. Nu l s khng du th s xy ra trn nh v d trn.

III.3.3

Php chia s nguyn v php chia ly s d.

Php chia s nguyn c khc mt cht so vi php chia thng thng. Khi chia 21 cho 4, kt qu l mt s thc (mt s thp phn). Cc s nguyn khng c phn thp phn, v v vy "remainder" (s d) c ct i. Tr li l 5. ly c s d, a 21 modulus 4 (21%4) v kt qu l 1. Php chia divison (/) l php chi ly phn nguyn. Php chia modulus (%) l php chia ly phn d.

Ch : Nhiu ngi lp trnh C++ cha c kinh nghim tnh c a mt du chm phy sau cc lnh if. If ( SomeValue <10) ; SomeValue = 10 ; Ta phi vit li theo cch sau: if (SomeValue < 10) // test ; // do nothing SomeValue = 10; // assign

III.3.4

Ton t gn v ton t ton hc phc.

Him khi mun cng mt gi tr vi mt bin s v sau gn kt qu tr li bin. Nu c mt bin myAge v bn mun tng gi tr thm hai, c th vit: int myAge = 5; int temp; temp = myAge + 2; // add 5 + 2 and put it in temp myAge = temp; // put it back in myAge

Phng php ny, mc d, rt kh chu v gy lng ph. Trong C++, c th a vo bin tng t trn c hai chiu ca ton t gn, v v vy phn trc tr nn tt hn nhiu :s MyAge = myAge + 2 ; Trong i s biu thc thc ny l v ngha, nhng trong C++ c c l "cng 2 vo gi tr ca myAge v gn kt qu vo myAge ". Mt cch vit n gin hn l : MyAge += 2 ; Ton t (+=) cng r-gi tr vo 1-gi tr v sau gn tr li kt qu vo trong 1-gi tr. Ton t l "cng-bng". Cu lnh c l "myAge cng-bng 2". Nu myAge c gi tr 4 bt u, sau cu lnh s l 6.

Trang 22

T hc C++ trong 21 ngy.


C cc ton t "t -gn" tr (-=), chia (/=), nhn (*=), v modulus (%=).

III.3.5

Cc php tng v gim

Thng thng gi tr cng (hoc tr) v sau gn li vo bin l 1.Trong C++, vic tng gi tr l 1 c gi l lng tng, v gim 1 c gi lng gim. C cc ton t c bit thc hin nhng tc ng ny. Ton t tng (++) tng gi tr ca bin ln 1, v ton t gim (--) gim i 1. V vy,nu c 1 bin, c, v mun tng n, ta s s dng lnh ny: c++ ; Lnh ny tng ng vi lnh sau: c = c +1 ; Cu lnh ny cng tng ng: c += 1 ;

III.3.6
-

Tin t v hu t.

C hai ton t (++) v ton t (--) i n 2 loi: tin t v hu t. Tin t c vit trc tn bin (++myAge) Hu t c vit sau tn bin (myAge++).

V ng ngha hc th: tng gi tr ln trc khi thc hin lnh. Cn vi hu t th : thc hin lnh sau mi tng gi tr. V d: nu x l s nguyn c gi tr l 5, nu vit: int a = ++x ; C ngha l tng x (lm n thnh 6) v sau ly gi tr gn cho a. V vy a = 6 v x = 6. Nu sau ta tip tc vit: int b = x++ ; C ngha l ly gi tr ca x (6) v gn cho b, sau tng gi tr ca x. V vy, by gi b = 6, v x = 7.

Listing 4.3. A demonstration of prefix and postfix operators.


1: // Listing 4.3 - demonstrates use of 2: // prefix and postfix increment and 3: // decrement operators 4: #include <iostream.h> 5: int main() 6: { 7: 8: 9: int myAge = 39; int yourAge = 39; cout << "I am: " << myAge << " years old.\n"; // initialize two integers

Trang 23

T hc C++ trong 21 ngy.


10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: } Output: I am 39 years old cout << "You are: " << yourAge << " years old\n"; myAge++; ++yourAge; // postfix increment // prefix increment

cout << "One year passes...\n"; cout << "I am: " << myAge << " years old.\n"; cout << "You are: " << yourAge << " years old\n"; cout << "Another year passes\n"; cout << "I am: " << myAge++ << " years old.\n"; cout << "You are: " << ++yourAge << " years old\n"; cout << "Let's print it again.\n"; cout << "I am: " << myAge << " years old.\n"; cout << "You are: " << yourAge << " years old\n"; return 0;

You are 39 years old One year passes I am 40 years old

You are 40 years old Another year passes I am 40 years old

You are 41 years old Let's print it again I am 41 years old

You are 41 years old

III.3.7

Quyn u tin.

Trong cu lnh phc tp : x = 5 + 3 * 8; Th php nhn s c thc hin trc php cng. Mi ton t u c 1 gi tr u tin. Khi 2 ton t ton hc c cng quyn u tin, chng s thc hin theo trt t " t tri - qua - phi". V vy X=5+3+8*9+6*4; Php nhn s thc hin t tri qua phi. V vy, 8 * 9 = 72, v 6*4 =24. By gi cu lnh s l: X = 5 + 3 + 72 + 24; By gi php cng thc hin t tri qua phi: 5 + 3 =8 ; 8+72 =80 ; 80+24 = 104.

Trang 24

T hc C++ trong 21 ngy.


Hy cn thn vi iu ny. Mt s ton t, nh l ton t gn thc hin theo trt t t " phi qua - tri ". V d : TotalSeconds = NumMinutesToThink + NumMinutesToType * 60 Trong biu thc ny, ta mun nhn NumMinutesToType vi 60 v sau cng n vi NumMinutesToThink. Ta mun cng hai bin ta c tng s pht, v sau nhn n vi 60 c tng s giy. Trong trng hp ny, ta phi s dng cc du ngoc thay i trt t u tin. Cc s hng trong du ngoc c xc nh trt t u tin cao hn nhng ton t ton hc. V vy ta phi vit : TotalSeconds = ( NumMinutesToThink + NumMinutesToType ) * 60

III.3.8

Ton t quan h

Dng xc nh hoc 2 s bng nhau, hoc 1 s ln hn hoc nh hn 1 s khc. Cu lnh quan h xc nh hoc 1 (TRUE) hoc 0 (FALSE). Ton t bng "equals" : MyAge == yourAge ; Ton t ln hn. MyAge > yourAge ; Bng : == Nh hn: < Ln hn: > Nh hn hoc bng: <= Ln hn hoc bng : >= Khc nhau : != // gi tr myAge ln hn yourAge ? // gi tr myAge tng t ca yourAge ? Biu thc xc nh 0, hoc FALSE khi 2 bin khng bng nhau.

Trong C++ c 6 ton t quan h :

Table 4.1. The Relational Operators.

Name Equals Not Equals

Operator
==

Sample
100 == 50; 50 == 50;

Evaluates
false true true false true false

!=

100 != 50; 50 != 50;

Greater Than

>

100 > 50; 50 > 50;

Trang 25

T hc C++ trong 21 ngy. Greater Than or Equals Less Than


< >= 100 >= 50; 50 >= 50; 100 < 50; 50 < 50; true true false false False true

Less Than or Equals

<=

100 <= 50; 50 <= 50;

III.4 Cu lnh IF.


Cu lnh if cho php bn kim tra mt iu kin, v r nhnh ti phn khc ca on m, ph thuc vo kt qu. Cu lnh if n gin nht l: If (biu thc ) Statement ; Biu thc trong du ngoc c th l bt c biu thc no, nhng n thng cha mt biu thc quan h. Nu biu thc c gi tr 0, n coi l sai, v lnh c b qua. Nu n c gi tr khng phi l 0, n coi l ng, v lnh c x l. Ch v d sau: if (bigNumber > smallNumber) bigNumber = smallNumber; Nu lnh trong cu lnh if gm nhiu lnh th dng lnh if nh sau: if (expression) { statement1; statement2; statement3; } V d: if (bigNumber > smallNumber) { bigNumber = smallNumber; cout << "bigNumber: " << bigNumber << "\n"; cout << "smallNumber: " << smallNumber << "\n"; }

Listing 4.4. A demonstration of branching based on relational operators. Trang 26

T hc C++ trong 21 ngy.


1: // Listing 4.4 - demonstrates if statement 2: // used with relational operators 3: #include <iostream.h> 4: int main() 5: { 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: if (YankeesScore > RedSoxScore) cout << "Knew it! Go Yanks!"; if (RedSoxScore > YankeesScore) cout << "Knew it! Go Sox!"; if (RedSoxScore == YankeesScore) { cout << "A tie? Naah, can't be.\n"; cout << "Give me the real score for the Yanks: "; cin >> YankeesScore; } if (RedSoxScore < YankeesScore) { cout << "Go Yankees!\n"; cout << "Happy days in New York!\n"; if (RedSoxScore > YankeesScore) cout << "Go Sox!\n"; cout << "\n"; cout << "\nEnter the score for the Yankees: "; cin >> YankeesScore; int RedSoxScore, YankeesScore; cout << "Enter the score for the Red Sox: "; cin >> RedSoxScore;

Trang 27

T hc C++ trong 21 ngy.


36: 37: 38: 39: 40: 41: 42: } Output: Enter the score for the Red Sox: 10 Enter the score for the Yankees: 10 A tie? Naah, can't be Give me the real score for the Yanks: 8 Knew it! Go Sox! Thanks for telling me. Cc cch t du ngoc. t du ngoc ngay sau iu kin v cn thng hng vi lnh if hng di ng khi lnh. If (biu thc) { Cu lnh ; } { cu lnh ; } { cu lnh ; } t du ngoc tht vo cng vi cu lnh. if (biu thc) t du ngoc bn di lnh if. if (biu thc) cout << "\nThanks for telling me.\n"; return 0; } if (YankeesScore == RedSoxScore) cout << "Wow, it really was a tie!";

Else
Thng chng trnh ca bn s mun r nhnh nu iu kin ng, v nu iu kin sai. Nu ch s dng lnh if khng th chng trnh s di v ta s dng t kho "else" nh sau: If (biu thc) Cu lnh ; Else Cu lnh ;

Trang 28

T hc C++ trong 21 ngy. Listing 4.5. Demonstrating the else keyword.


1: // Listing 4.5 - demonstrates if statement 2: // with else clause 3: #include <iostream.h> 4: int main() 5: { 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: } return 0; int firstNumber, secondNumber; cout << "Please enter a big number: "; cin >> firstNumber; cout << "\nPlease enter a smaller number: "; cin >> secondNumber; if (firstNumber > secondNumber) cout << "\nThanks!\n"; else cout << "\nOops. The second is bigger!";

Output: Please enter a big number: 10 Please enter a smaller number: 12 Oops. The second is bigger!

Cc kiu c php lnh if.


Dng 1: If (biu thc) Cu lnh ; Next statement ; Nu biu thc xc nh l ng, "cu lnh " c x l v chng trnh tip tc vi "next statement". Nu biu thc sai, cu lnh c b qua v chng trnh nhy ti "next statement". Nh rng cu lnh c th l mt cu lnh n kt thc vi 1 du chm phy hoc 1 du ngoc ng khi. Dng 2. statement1; else if (expression)

Trang 29

T hc C++ trong 21 ngy.


statement2; next statement; Nu biu thc ng th "statement1" c x l; nu sai "statement2" c x l, sau y, chng trnh tip tc vi "next statement". V d: if (SomeValue < 10) cout << "SomeValue is less than 10"); else cout << "SomeValue is not less than 10!"); cout << "Done." << endl;

Cc lnh if phc tp.


if (expression1) { if (expression2) statement1; else { if (expression3) statement2; else statement3; } } else statement4; V d :

Listing 4.6. A complex, nested if statement.


1: // Listing 4.5 - a complex nested 2: // if statement 3: #include <iostream.h> 4: int main() 5: { 6: 7: 8: 9: // Ask for two numbers // Assign the numbers to bigNumber and littleNumber // If bigNumber is bigger than littleNumber, // see if they are evenly divisible

Trang 30

T hc C++ trong 21 ngy.


10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: } } else cout << "Hey! The second one is larger!\n"; return 0; } else cout << "They are not evenly divisible!\n"; if (firstNumber >= secondNumber) { if ( (firstNumber % secondNumber) == 0) // neu chia het cho nhau? { if (firstNumber == secondNumber) cout << "They are the same!\n"; else cout << "They are evenly divisible!\n"; int firstNumber, secondNumber; cout << "Enter two numbers.\nFirst: "; cin >> firstNumber; cout << "\nSecond: "; cin >> secondNumber; cout << "\n\n"; // If they are, see if they are the same number

Output: Enter two numbers. First: 10

Second: 2

They are evenly divisible!

III.5 Ton t lgc. Table 4.2. The Logical Operators. Trang 31

T hc C++ trong 21 ngy. Operator


AND OR NOT

Symbol
&& || !

Example expression1 expression1


!expression && ||

expression2 expression2

III.5.1

Php lgc AND


If ( ( x == 5 ) && (y == 5) )

Php AND ng (=1) khi c hai biu thc u ng. Sai khi 1 trong 2 biu thc sai. Php AND c biu tng l &&.

III.5.2

Php lgc OR
if ( (x == 5) || (y == 5) )

ng khi 1 trong 2 hoc c 2 biu thc ng. Sai khi c 2 biu thc u sai.

Php OR c biu tng l

III.5.3

Php lgc NOT.


if ( !(x == 5) )

L php ph nh. kt qu ca if l ng nu x khc 5. Php ny c th vit cch khc nh sau : if ( x != 5 )

III.5.4
V d:

Quyn u tin trong ton t lgc.

if ( x > 5 && y > 5 || z > 5) Nu vit cch ny s lm cho cu lnh khng r ngha. Do ta c th s dng cc du ngoc. if ( (x > 5) && (y > 5 || z > 5) ) Ch trong khi vit chng trnh cn trnh by sao cho d c v d hiu.

III.5.5
V d 1:

Mt s cch vit tt.


if (x) x = 0; // if x is true (nonzero)

Cu lnh c ngha : nu x c gi tr khc 0, t n l 0. Ta c th vit cch khc r rng hn: if (x != 0) x = 0; V d 2: Hai cu lnh sau l tng ng : if (!x) // if x is false (zero) // if x is nonzero

Trang 32

T hc C++ trong 21 ngy.


if (x == 0) // if x is zero

III.6 Ton t ph thuc.


Ton t ph thuc ( ?: ) l cc ton t bc ba ch c C++ ; l ton t vi 3 s hng. Ton t ph thuc thc hin vi 3 biu thc v tr v mt gi tr : ( biu thc 1) ? ( biu thc 2) : (biu thc 3) Cu lnh c ngha : Nu biu thc-1 l ng, tr v gi tr biu thc-2 ; nu sai tr v gi tr biu thc-3.

Listing 4.9. A demonstration of the conditional operator.


1: // Listing 4.9 - demonstrates the conditional operator 2: // 3: #include <iostream.h> 4: int main() 5: { 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: cout << "z: " << z; cout << "\n"; return 0; z = (x > y) ? x : y; cout << "z: " << z; cout << "\n"; if (x > y) z = x; else z = y; int x, y, z; cout << "Enter two numbers.\n"; cout << "First: "; cin >> x; cout << "\nSecond: "; cin >> y; cout << "\n";

Trang 33

T hc C++ trong 21 ngy.


27: } Output: Enter two numbers. First: 5

Second: 8

z: 8 z: 8

IV

Cc hm.

Hm l g ? Hm l mt chng trnh con m c th lm vic trn d liu v tr v mt gi tr. Trong chng trnh C++ c ti thiu mt hm, main(). Khi chng trnh bt u, main() c t ng gi. main() c th gi cc hm khc. Mi hm c tn ca n v khi tn c gp, vic x l chng trnh r nhnh vo trong thn hm. Khi hm tr v, vic x l tr li trn dng tip theo ca hm gi. Cc hm c hai cch to ra: Do ngi s dng nh ngha. C sn trong trnh bin dch.

IV.1 Khai bo v nh ngha hm.


S dng cc hm trong chng trnh,u tin phi khai bo hm v sau nh ngha hm . Khai bo l ch ra tn, kiu tr v, cc tham s ca hm. nh ngha l bo trnh bin dch bit hm lm vic nh th no. Khng c hm no c gi t hm khc m khng khai bo. Khai bo l th tc u tin. Khai bo hm. C 3 cch khai bo mt hm: Vit nguyn mu vo trong mt file, sau s dng mt ch dn #include gp n vo trong chng trnh ca bn. Vit nguyn mu vo trong file m hm ca bn c s dng. nh ngha hm trc khi n c gi bi bt k hm. Khi lm iu ny, vic nh ngha hot ng nh chnh s khai bo ca n. Cch th nht, l tng ti v kh cho vic sa v thay i. Cch th hai, gi s rng hm A() cn c th gi hm B(), nhng hm B() cng cn c th gi hm A() trong mt s trng hp.

Trang 34

T hc C++ trong 21 ngy.


C th nh ngha hm A() trc khi nh ngha hm B() v cng hm B() trc khi nh ngha hm A(), v vy ti thiu 1 trong s chng phi c khai bo trong bt c trng hp no. Cch th ba, cc nguyn mu l mt k thut g ri y sc mnh v tt. Nu nguyn mu ca bn khai bo rng hm gm mt tp cc tham s ring bit, hoc rng n tr v mt kiu gi tr c th, v sau hm khng sp xp nguyn mu, trnh bin dch c th ra hiu bng c li ca bn thay v i n hin ln khi chy chng trnh .

IV.1.1
dng

Cc nguyn mu hm.
# include . i vi cc hm ca chnh bn vit, bn phi gp nguyn mu.

Nhiu hm c sn, bn c th s dng chng trong chng trnh ca bn bng cch s Nguyn mu hm l mt cu lnh , ngha l n kt thc vi du chm phy (;). N kiu tr v ca hm, tn, v danh sch tham s. Danh sch tham s l mt danh sch ca tt c cc tham s v kiu ca chng, phn cch bi du phy (commas). Nguyn mu hm v s nh ngha hm phi ging nhau chnh xc v kiu tr v, tn, danh sch tham s. Nu chng khng ging nhau , bn s nhn c mt li "compile-time". Ch : nguyn mu hm khng cn gm tn ca tham s, m ch l kiu ca chng. Mt nguyn mu trng ging nh : Long Area (int , int ) ; Nguyn mu ny khai bo mt hm tn l Area() tr v mt long v c hai tham s, c hai l s nguyn. Mc d y l theo qui nh, n khng phi l tng tt. Tn tham s thm vo lm cho nguyn mu r rng hn. Hm tng t vi cc tham s c dt tn c th l : Long Area (int length, int width) ; Ch rng: tt c cc hm c mt kiu tr v. Nu khng nh r, kiu tr v mc nh l int . Chng trnh ca bn s hiu d dng hn, mc d, nu khai bo r rng kiu tr v ca mi hm, k c main() .

Listing 5.1. A function declaration and the definition and use of that function.
1: // Listing 5.1 - demonstrates the use of function prototypes 2: 3: typedef unsigned short USHORT; 4: #include <iostream.h> 5: USHORT FindArea(USHORT length, USHORT width); 6: 7: int main() //function prototype

Trang 35

T hc C++ trong 21 ngy.


8: { 9: USHORT lengthOfYard;

10: USHORT widthOfYard; 11: USHORT areaOfYard; 12: 13: cout << "\nHow wide is your yard? "; 14: cin >> widthOfYard; 15: cout << "\nHow long is your yard? "; 16: cin >> lengthOfYard; 17: 18: areaOfYard= FindArea(lengthOfYard,widthOfYard); 19: 20: cout << "\nYour yard is "; 21: cout << areaOfYard; 22: cout << " square feet\n\n"; 23: 24: } 25: 26: USHORT FindArea(USHORT l, USHORT w) 27: { 28: 29: } Output: How wide is your yard? 100 return l * w; return 0;

How long is your yard? 200

Your yard is 20000 square feet

IV.1.2

nh ngha hm .

nh ngha hm bao gm u hm v thn hm. u hm chnh xc ging nh nguyn mu hm, ngoi tr cc tham s phi c t tn, v khng c du chm phy kt thc. Thn hm l mt tp cc lnh bn trong cc du ngoc. Hm: C php nguyn mu hm: Return_type function_name ( [type [parameterName] ] .....) ; C php nh ngha hm:

Trang 36

T hc C++ trong 21 ngy.


Return_type function_name ( [type [parameterName] ] .....) ; { cu lnh ; } Nguyn mu hm ch ra : kiu tr v, tn, danh sch tham s. Hm khng cn c cc tham s, v nguyn mu khng cn danh sch cc tn ca chng, ch c cc kiu ca chng. Mt nguyn mu lun kt thc vi du chm phy (;). nh ngha hm phi ph hp kiu tr v v danh sch tham s vi nguyn mu ca n. N phi cung cp tn cho cc tham s, v thn nh ngha hm phi c bao quanh bng cc du ngoc. Tt c cc lnh bn trong thn hm phi c kt thc vi du chm phy (;), nhng hm t n khng kt thc vi mt du chm phy m n kt thc vi mt du ng ngoc. Nu hm tr v mt gi tr, n kt thc vi mt cu lnh return, mc d cc lnh return c th xut hin hp php bt c ni no trong thn hm. Mi hm c 1 kiu tr v. Nu khng r rng, kiu tr v s l int. Nu mt hm khng tr v mt gi tr, kiu tr v ca n s l void.

Function Prototype Examples


long FindArea(long length, long width); void PrintMessage(int messageNumber); int GetChoice(); BadFunction(); // returns long, has two parameters // returns void, has one parameter // returns int, has no parameters // returns int, has no parameters

Function Definition Examples


long Area(long l, long w) { return l * w; }

void PrintMessage(int whichMsg) { if (whichMsg == 0) cout << "Hello.\n"; if (whichMsg == 1) cout << "Goodbye.\n"; if (whichMsg > 1) cout << "I'm confused.\n"; }

Trang 37

T hc C++ trong 21 ngy.


IV.1.3 X l hm.
Khi bn gi mt hm, vic x l bt u vi cu lnh u tin sau du ngoc m ({). Nhnh c th c x l bng cch s dng lnh if. Cc hm cng c th gi cc hm khc thm ch gi chnh chng.

IV.2 Bin khu vc.


Bin khu vc ch tn ti trong khu vc bn trong hm ca n. Khi hm tr v, cc bin khu vc l bin khng c hiu lc na. Bin khu vc c nh ngha nh bt c bin khc. Cc tham s t bn trong hm cng coi l bin khu vc v c th c s dng chnh xc bi v nu chng c nh ngha bn trong thn hm.

Listing 5.2. The use of local variables and parameters.


1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: } 16: 17: float Convert(float TempFer) 18: { 19: 20: 21: 22: } float TempCel; TempCel = ((TempFer - 32) * 5) / 9; return TempCel; cout << "Please enter the temperature in Fahrenheit: "; cin >> TempFer; TempCel = Convert(TempFer); cout << "\nHere's the temperature in Celsius: "; cout << TempCel << endl; return 0; float Convert(float); int main() { float TempFer; float TempCel; #include <iostream.h>

Trang 38

T hc C++ trong 21 ngy.


Output: Please enter the temperature in Fahrenheit: 212 Here's the temperature in Celsius: 100 Please enter the temperature in Fahrenheit: 32 Here's the temperature in Celsius: 0 Please enter the temperature in Fahrenheit: 85 Here's the temperature in Celsius: 29.4444 V d khc: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: i++ ) } float Convert(float Fer) { float Cel; Cel = ((Fer - 32) * 5) / 9; return Cel; } cout << "Please enter the temperature in Fahrenheit: "; cin >> TempFer; TempCel = Convert(TempFer); cout << "\nHere's the temperature in Celsius: "; cout << TempCel << endl; float Convert(float); int main() { float TempFer; float TempCel; #include <iostream.h>

Hin nay, cc bin c khai bo bn trong u ca mt vng for (for int i = 0; i<SomeValue ;

IV.3 Bin ton cc.


Cc bin c nh ngha bn ngoi ca bt c hm c phm vi ln v v vy c sn bt c hm trong chng trnh, k c main() .

Trang 39

T hc C++ trong 21 ngy.


Bin khu vc vi tn tng t nh cc bin ton cc khng lm thay i bin ton cc. Nu mt hm c 1 bin vi tn ging bin ton cc, tn c xem l bin khu vc--khng l bin ton cc-- khi c dng trong hm.

Listing 5.3. Demonstrating global and local variables.


1: #include <iostream.h> 2: void myFunction(); 3: 4: int x = 5, y = 7; 5: int main() 6: { 7: 8: 9: 10: 11: 12: 13: 14: 15: } 16: 17: void myFunction() 18: { 19: 20: 21: 22: 23: } cout << "x from myFunction: " << x << "\n"; cout << "y from myFunction: " << y << "\n\n"; int y = 10; cout << "x from main: " << x << "\n"; cout << "y from main: " << y << "\n\n"; myFunction(); cout << "Back from myFunction!\n\n"; cout << "x from main: " << x << "\n"; cout << "y from main: " << y << "\n"; return 0; // global variables // prototype

Output: x from main: 5 y from main: 7

x from myFunction: 5 y from myFunction: 10

Back from myFunction!

Trang 40

T hc C++ trong 21 ngy.


x from main: 5 y from main: 7 V d bin khu vc.

Listing 5.4. Variables scoped within a block.


1: // Listing 5.4 - demonstrates variables 2: // scoped within a block 3: 4: #include <iostream.h> 5: 6: void myFunc(); 7: 8: int main() 9: { 10: 11: 12: 13: 14: 15: 16: 17: } 18: 19: void myFunc() 20: { 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: cout << "\nVery local x: " << x; int x = 9; { cout << "\nIn block in myFunc, x is: " << x; int x = 8; cout << "\nIn myFunc, local x: " << x << endl; cout << "\nBack in main, x is: " << x; return 0; myFunc(); int x = 5; cout << "\nIn main x is: " << x;

Trang 41

T hc C++ trong 21 ngy.


31: 32: 33: cout << "\nOut of block, in myFunc, x: " << x << endl; }

34: }

Output: In main x is: 5 In myFunc, local x: 8

In block in myFunc, x is: 8 Very local x: 9 Out of block, in myFunc, x: 8

Back in main, x is: 5 Chng trnh bt u vi s khi to 1 bin khu vc, x, trn dng 10, trong main(). In ra trn dng 11 xc nh rng x c khi to vi gi tr 5. MyFunc() c gi, v 1 bin khu vc, cng c t tn x, c khi to vi gi tr 8 trn dng 22. Gi tr c in ra trn dng 23. Mt khi c bt u trn dng 25, v bin x t hm c in li trn dng 26. Mt bin mi cng c t tn x, nhng khu vc khi c to ra trn dng 28 v c khi to vi gi tr 9. Gi tr ca bin x mi nht c in ra trn dng 30. Khi kt thc trn dng 31, v bin c to ra trn dng 28 -"out of scope". Khi x c in ra trn dng 33, x c nh ngha trn dng 28; gi tr ca n vn l 8.

IV.3.1

Cu lnh hm.

Hu nh khng c gii hn v s kiu cu lnh m c th bn trong thn hm. Mc d vy bn khng th nh ngha mt hm khc t bn trong mt hm, bn c th gi 1 hm. Cc hm c th thm ch gi chnh chng. Mc d khng c gii hn v kch thc ca 1 hm trong C++, nhng xu hng xy dng hm c kch thc nh. Nhiu nh lp trnh khuyn lm cho hm va trn mt mn hnh n v vy bn c th nhn ton b hm cng mt lc. y l mt qui lut lt trang, thng ngt qung bi cc nh lp trnh gii, nhng mt hm cng nh th cng d hiu v sa cha. Mi hm nn thc hin mt cng vic n l v d hiu.

IV.3.2

i s ca hm.

Cc i s hm c l l 1 i s hm, bao gm cc hng s, biu thc lgc v ton hc, v cc hm khc m tr v gi tr .

Trang 42

T hc C++ trong 21 ngy.


Bt c biu thc C++ c th l 1 i s hm, bao gm cc hng s, biu thc lgc v ton hc, v cc hm khc m tr v gi tr .

IV.3.3

S dng cc hm nh l cc tham s thc hin cc chc nng.

Mc d l qui lut i vi mt hm thc hin nh 1 tham s ca hm th hai m tr v 1 gi tr,n c th lm cho m chng trnh kh c v rc ri. V d, c cc hm : double(), triple(), square(), v cube(); mi hm tr v 1 gi tr. C th vit. Answer = (double(triple(square(cube(myValue))))); Cu lnh ny dng 1 bin, myValue, v coi n nh 1 i s i vi hm cube(), gi tr tr v c coi l i s ca hm square(), gi tr tr v ca n coi l i s ca hm triple(), v gi tr tr v a ti hm double(). Gi tr tr v ca hm double(), triple(), square(), cube() c a ti Answer. Kh c th chc chn on m no thc hin (l gi tr trc triple hay sau l square ?). Mt thay i k tip l gn mi bc ti bin trung gian ca n: unsigned long myValue = 2; unsigned long cubed = cube(myValue); unsigned long squared = square(cubed); unsigned long tripled = triple(squared); unsigned long Answer = double(tripled); // cubed = 8 // squared = 64 // tripled = 196 // Answer = 392

IV.3.4

Tham s l cc bin khu vc.

i s a vo trong hm l khu vc cho hm. S thay i lm cho cc i s khng nh hng ti gi tr trong gi hm. iu ny c bit nh truyn gi tr, ngha l mt bn sao khu vc ca mi i s lm trong hm. Nhng bn sao khu vc ny c coi nh l bt c bin khu vc khc.

Listing 5.5. A demonstration of passing by value.


1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: cout << "Main. Before swap, x: " << x << " y: " << y << "\n"; int main() { int x = 5, y = 10; void swap(int x, int y); #include <iostream.h> // Listing 5.5 - demonstrates passing by value

Trang 43

T hc C++ trong 21 ngy.


12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: } cout << "Swap. After swap, x: " << x << " y: " << y << "\n"; temp = x; x = y; y = temp; cout << "Swap. Before swap, x: " << x << " y: " << y << "\n"; void swap (int x, int y) { int temp; } swap(x,y); cout << "Main. After swap, x: " << x << " y: " << y << "\n"; return 0;

Output: Main. Before swap, x: 5 y: 10 Swap. Before swap, x: 5 y: 10 Swap. After swap, x: 10 y: 5 Main. After swap, x: 5 y: 10

IV.3.5

Gi tr tr v.

Cc hm tr v gi tr hoc tr v dng void. Void l 1 tn hiu bo cho trnh bin dch s khng c gi tr tr v. tr v mt gi tr t 1 hm, vit t kho return theo sau l gi tr mun tr v. Gi tr c th t n l 1 biu thc m tr v mt gi tr. V d: return 5; return (x > 5); return (MyFunction()); y l tt c nhng lnh return theo qui nh, gi s rng hm MyFunction() t n tr v mt gi tr. G tr trong cu lnh th hai, return (x>5), s l zero nu x khng ln hn 5, hoc n s l 1. Ci c tr v l gi tr ca biu thc ,0 (false) hay 1(true), khng phi gi tr ca x.

Trang 44

T hc C++ trong 21 ngy.


Khi t kho return c bt gp, biu thc sau return c tr v nh gi tr ca hm. S thc hin chng trnh tr v ngay lp tc khi gi hm, v bt c cu lnh sau return khng c s l. l ng qui nh c hn mt cu lnh return trong 1 hm n.

Listing 5.6. A demonstration of multiple return statements.


1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: } 28: 29: int Doubler(int original) 30: { return 0; cout << "\nBack from Doubler...\n"; cout << "\ninput: " << input << " doubled: " << result << "\n"; result = Doubler(input); cout << "\nBefore doubler is called... "; cout << "\ninput: " << input << " doubled: " << result << "\n"; cout << "Enter a number between 0 and 10,000 to double: "; cin >> input; int result = 0; int input; int main() { int Doubler(int AmountToDouble); #include <iostream.h> // Listing 5.6 - demonstrates multiple return // statements

Trang 45

T hc C++ trong 21 ngy.


31: 32: 33: 34: 35: 36: } Output: Enter a number between 0 and 10,000 to double: 9000 Before doubler is called... input: 9000 doubled: 0 Back from doubler... input: 9000 doubled: 18000 Enter a number between 0 and 10,000 to double: 11000 Before doubler is called... input: 11000 doubled: 0 Back from doubler... input: 11000 doubled: -1 if (original <= 10000) return original * 2; else return -1; cout << "You can't get here!\n";

IV.3.6

Tham s mc nh.

i vi mi tham s khai bo v nh ngha trong nguyn mu hm, hm ang gi phi a vo mt gi tr. Gi tr c a vo phi l kiu c khai bo. V vy, nu c 1 hm khai bo nh sau. Long myFunction (int); Hm phi nhn mt bin s nguyn. Nu nh ngha hm khng ging hoc nu khng a vo mt s nguyn th s nhn c mt li bin dch. Mt s ngoi tr i vi qui lut ny l nu nguyn mu hm khai bo 1 gi tr mc nh i vi tham s. Gi tr mc nh l 1 gi tr s dng nu dng dng "none". Khai bo trc c th c vit nh sau: Long myFunction (int x = 50) ; Nguyn mu ni rng, "myFunction ()" tr v mt gi tr long v nhn 1 tham s s nguyn. Nu mt i s khng c a vo, s dng gi tr mc nh 50. Bi v tn tham s khng cn trong nguyn mu hm, nguyn mu ny c th c vit nh sau: Long myFunction (int = 50); nh ngha hm khng thay i bi khai bo 1 tham s mc nh. u nh ngha hm i vi hm ny s l : long myFunction (int x)

Trang 46

T hc C++ trong 21 ngy.


Nu hm gi khng c 1 tham s, trnh bin dch s in x vi gi tr mc nh 50. Tn ca tham s mc nh trong nguyn mu khng ging nh tn trong u hm; gi tr mc nh c gn cng v tr, khng c tn. Bt c hoc tt c cc tham s ca hm c th c gn gi tr mc nh. Mt s rc ri l : Nu bt c tham s no khng c gi tr mc nh, khng tham s c trc no c th c 1 gi tr mc nh. Nu nguyn mu hm trng ging nh: long myFunction (int Param1, int Param2, int Param3); C th gn 1 gi tr mc nh ch cho Param2, nu gn 1 gi tr mc nh cho Param3. C th gn 1 gi tr mc nh ch cho Param1 nu gn cc gi tr mc nh cho c hai Param2 v Param3.

Listing 5.7. A demonstration of default parameter values.


1: // Listing 5.7 - demonstrates use 2: // of default parameter values 3: 4: #include <iostream.h> 5: 6: int AreaCube(int length, int width = 25, int height = 1); 7: 8: int main() 9: { 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: area = AreaCube(length); cout << "Third time area equals: " << area << "\n"; return 0; area = AreaCube(length, width); cout << "Second time area equals: " << area << "\n"; area = AreaCube(length, width, height); cout << "First area equals: " << area << "\n"; int length = 100; int width = 50; int height = 2; int area;

Trang 47

T hc C++ trong 21 ngy.


24: } 25: 26: AreaCube(int length, int width, int height) 27: { 28: 29: 30: } return (length * width * height);

Output: First area equals: 10000 Second time area equals: 5000 Third time area equals: 2500

IV.3.7

Cc hm xp chng.

C++ cho php to ra hn 1hm cng tn. iu ny c gi l xp chng hm. Cc hm phi khc nhau trong danh sch tham s, vi kiu tham s khc nhau, mt s tham s khc nhau hoc c hai. V d: int myFunction (int, int); int myFunction (long, long); int myFunction (long); Kiu tr v c th ging nhau hoc khc nhau trn cc hm xp chng. Ch : hai hm c cng tn v dang sch tham s, nhng khc nhau kiu tr v, to ra mt li bin dch. Ch : Hm "Overloading" cng c gi l hm "polymorphism": Hm nhiu dng. Gi s vit 1 hm kiu double vi bt c u vo no. Bn mun a vo trong 1 kiu int, 1 kiu long, 1 kiu float, hoc 1 kiu double. Khng c xp chng hm, bn phi to ra 4 hm vi cc tn : int DoubleInt(int); long DoubleLong(long); float DoubleFloat(float); double DoubleDouble(double); Vi hm xp chng, c th khai bo nh sau: int Double(int); long Double(long); float Double(float); double Double(double); y l cch d c v d s dng.Khng phi lo lng v hm no gi; ch cn a vo 1 bin, v hm bn phi c gi t ng

Trang 48

T hc C++ trong 21 ngy. Listing 5.8. A demonstration of function polymorphism.


1: // Listing 5.8 - demonstrates 2: // function polymorphism 3: 4: #include <iostream.h> 5: 6: int Double(int); 7: long Double(long); 8: float Double(float); 9: double Double(double); 10: 11: int main() 12: { 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: cout << "doubledInt: " << doubledInt << "\n"; cout << "doubledLong: " << doubledLong << "\n"; doubledInt = Double(myInt); doubledLong = Double(myLong); doubledFloat = Double(myFloat); doubledDouble = Double(myDouble); cout << "myInt: " << myInt << "\n"; cout << "myLong: " << myLong << "\n"; cout << "myFloat: " << myFloat << "\n"; cout << "myDouble: " << myDouble << "\n"; int long float doubledInt; doubledLong; doubledFloat; int long float myInt = 6500; myLong = 65000; myFloat = 6.5F;

double myDouble = 6.5e20;

double doubledDouble;

Trang 49

T hc C++ trong 21 ngy.


35: 36: 37: 38: 39: } 40: 41: int Double(int original) 42: { 43: cout << "In Double(int)\n"; 44: return 2 * original; 45: } 46: 47: long Double(long original) 48: { 49: cout << "In Double(long)\n"; 50: return 2 * original; 51: } 52: 53: float Double(float original) 54: { 55: cout << "In Double(float)\n"; 56: return 2 * original; 57: } 58: 59: double Double(double original) 60: { 61: cout << "In Double(double)\n"; 62: return 2 * original; 63: } Output: myInt: 6500 myLong: 65000 myFloat: 6.5 myDouble: 6.5e+20 In Double(int) In Double(long) return 0; cout << "doubledFloat: " << doubledFloat << "\n"; cout << "doubledDouble: " << doubledDouble << "\n";

Trang 50

T hc C++ trong 21 ngy.


In Double(float) In Double(double) DoubledInt: 13000 DoubledLong: 130000 DoubledFloat: 13 DoubledDouble: 1.3e+21

IV.3.8

Cc hm "InLine".

Khi nh ngha 1 hm, thng thng trnh bin dch to ra 1 tp cc lnh trong b nh. Khi gi 1 hm, vic x l ca chng trnh nhy ti cc lnh ny, v khi tr v hm, vic thc hin nhy tr v dng tip theo trong hm gi. Nu gi hm 10 ln, chng trnh nhy ti tp lnh tng t mi ln. Ngha l ch c sao chp hm 1 ln, khng phi 10 ln. C 1 s chc nng mo u trong vic nhy vo v nhy ra khi hm. i vi hm nh ch 1 dng hoc 2 dng m lnh v 1 s kh nng c th c li nu chng trnh c th trnh c vic nhy ny ch x l 1 hoc 2 lnh. Khi ni v hiu qu , cc nh lp trnh ni rng: Chng trnh chy nhay hn nu hm gi c th c trnh. Nu 1 hm c khai bo vi t kho "inline", trnh bin dch khng to ra mt hm thc : n sao chp m t hm inline trc tip t hm gi. Khng c bc nhy; n ch nh l nu bn vit cc lnh ca hm bn phi sang hm gi. Ch rng: Trong hm inline c th a ra mt gi tr ln. Nu hm c gi 10 ln, m inline c copy sang hm gi mi ln trong 10 ln . Vic ci tin gim nh tc c th t c bng cch tng kh nng x l chng trnh . Cc trnh bin dch ngy nay thc hin cng vic rt ln, v hu nh khng c li ln t vic khai bo mt hm inline.

Listing 5.9. Demonstrates an inline function.


1: // Listing 5.9 - demonstrates inline functions 2: 3: #include <iostream.h> 4: 5: inline int Double(int); 6: 7: int main() 8: { 9: 10: 11: cout << "Enter a number to work with: "; 12: cin >> target; int target;

Trang 51

T hc C++ trong 21 ngy.


13: cout << "\n"; 14: 15: target = Double(target); 16: cout << "Target: " << target << endl; 17: 18: target = Double(target); 19: cout << "Target: " << target << endl; 20: 21: 22: target = Double(target); 23: cout << "Target: " << target << endl; 24: 25: } 26: 27: int Double(int target) 28: { 29: return 2*target; 30: } Output: Enter a number to work with: 20 return 0;

Target: 40 Target: 80 Target: 160

IV.4 qui.
Mt hm c th gi chnh n. iu ny c gi l qui, v qui c th l trc tip hoc khng trc tip. L trc tip khi 1 hm t gi chnh n; l khng trc tip khi 1 hm gi mt hm khc m sau gi hm u tin. Hm qui cn mt iu kin dng, nu khng n s khng bao gi kt thc. Trong chui Fibonacci , iu kin dng l n<3. Thut ton s dng cho chui : 1. Hi user v v tr trong chui. 2. Gi hm fib() vi v tr . Nhn gi tr user a vo. 3. Hm fib() xc nh i s (n). Nu n<3, n tr v 1; ngc li fib() t gi n ( qui) n-2, t gi li n-1 v tr v tng s.

Trang 52

T hc C++ trong 21 ngy.


Nu gi fib(1), n tr v 1. Nu gi fib(2) , n tr v 1, gi fib(3), n tr v tng ca fib(2) v fib(1). V fib(2) tr v 1 v fib(1) tr v 1, fib(3) s tr v 2. Nu gi fib(4), n tr v tng ca fib(3) v fib(2). Chng ta thit lp fib(3) tr v 2 v fib(2) tr v 1, v vy fib(4) s l tng ca nhng s ny v tr v 3, l s th 4 trong chui. Thc hin cc bc ny nu gi fib(5), n tr v 5. Phng php ny hu nh khng c hiu qu gii quyt bi ton ny ( vi fib(20), hm fib() c gi 13529 ln) , nhng n vn thc hin. Cn thn: nu vi n qu ln, n s ht b nh. Mi hm fib() c gi, b nh c thit lp ring ra. Khi n tr v b nh c gii phng. Vi qui, b nh tip tc ring ra trc khi n c gii phng, v phng php ny c th chim b nh rt nhanh.

Listing 5.10. Demonstrates recursion using the Fibonacci series.


1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: int main() 12: { 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: } cout << answer << " is the " << n << "th Fibonacci number\n"; return 0; answer = fib(n); cout << "\n\n"; int n, answer; cout << "Enter number to find: "; cin >> n; int fib(int n); #include <iostream.h> // Listing 5.10 - demonstrates recursion // Fibonacci find. // Finds the nth Fibonacci number // Uses this algorithm: Fib(n) = fib(n-1) + fib(n-2) // Stop conditions: n = 2 || n = 1

Trang 53

T hc C++ trong 21 ngy.


25: 26: int fib (int n) 27: { 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: } } else { cout << "Call fib(" << n-2 << ") and fib(" << n-1 << ").\n"; return( fib(n-2) + fib(n-1)); if (n < 3 ) { cout << "Return 1!\n"; return (1); cout << "Processing fib(" << n << ")... ";

40: }

Output: Enter number to find: 5

Processing fib(5)... Call fib(3) and fib(4). Processing fib(3)... Call fib(1) and fib(2). Processing fib(1)... Return 1! Processing fib(2)... Return 1! Processing fib(4)... Call fib(2) and fib(3). Processing fib(2)... Return 1! Processing fib(3)... Call fib(1) and fib(2). Processing fib(1)... Return 1! Processing fib(2)... Return 1! 5 is the 5th Fibonacci number qui khng thng s dng trong lp trnh C++, nhng n c th l cng c y sc mnh i vi nhu cu no . Ch : qui l 1 phn rt kho lo ca lp trnh nng cao.

Trang 54

T hc C++ trong 21 ngy. IV.5 Stack v hm.


hm: 1. a ch trong con tr lnh c tng ln ti lnh tip theo qua vic gi hm. a ch sau c thay th trn stack, v n s tr v a ch khi hm tr v. 2. Ngn c to ra trn stack i vi kiu tr v c khai bo. Trn h thng vi s nguyn 2-byte, nu kiu tr v c khai bo l int, 2-byte khc c thm vo stack, nhng khng gi tr c thay th trong cc byte ny. 3. a ch ca hm c gi, c gi trong khu vc c bit ca b nh, gi s rng c np vo trong con tr lnh, v vy lnh sau c x l s l bn trong hm c gi. 4. nh hin ti ca stack c gi trong con tr c bit c gi l khung stack. Mi th c thm vo stack t by gi ti khi hm tr v s c xem xt ti. 5. Tt c cc i s vi hm c thay th trn stack. 6. Lnh by gi trong con tr lnh c x l, v th x l lnh u tin ca hm. 7. Cc bin khu vc c y vo trong stack nh chng c nh ngha . Khi hm c tr v , gi tr tr v c thay th trong khu vc ca stack tr li bc 2.Stack sau c y tt c ln khung con tr.

y l nhng ci xy ra khi 1 chng trnh chy trn 1 PC di mi trng DOS, r nhnh ti

V
V.1
V.1.1

Cc lp c bn.
To ra cc kiu mi.
Ti sao phi to mt kiu mi.
Chng trnh thng c vit gii nhng bi ton ca th gii thc, nh l lu gi cc

bn ghi ca nhn vin, m phng cng vic ca mt h thng t nng. Mc d n c kh nng gii cc bi ton phc tp bng cch s dng cc chng trnh c vit ch vi s nguyn v k t, n s d dng thc hin cc bi ton ln v phc tp hn nu c th to i din ca cc i tng m s ni n. Ni cch khc, m phng cng vic mt h thng nung nng d dng hn nu c th to ra cc bin m i din l cc bung, cc cm bin nhit, b n nhit, v ni hi.

V.1.2

Lp v cc b phn.
Thc hin mt kiu mi bng cch khai bo mt lp (class).Mt lp ch l mt tp cc

bin-- thng l cc kiu khc nhau-- kt hp vi 1 tp cc hm c lin quan. Mt lp cho php gi gn nhng phn khc nhau v nhng hm khc nhau vo trong mt tp hp, m c gi l mt i tng (objects).

Trang 55

T hc C++ trong 21 ngy.


Mt lp c th bao gm bt c kiu bin no cng nh cc kiu lp khc. Cc bin trong lp c coi nh l cc bin b phn hay cc b phn d liu. Ch : Member variables cng c bit nh data members, l cc bin trong lp. Member functions cng c bit nh l methods l cc hm trong lp. Member functions cng nh cc bin thnh vin l cc phn ca lp. Chng xc nh i tng (objects) ca lp c th lm c g. V.1.2.1 Khai bo mt lp (class). khai bo 1 lp, s dng t kho class theo sau l du m ngoc ({), v sau l danh sch cc thnh vin d liu v cc h thng ca lp. Kt thc khai bo l du ng ngoc (}) v du chm phy. V d khai bo 1 lp c gi l Cat : class Cat { unsigned int itsAge; unsigned int itsWeight; Meow(); }; Khai bo lp ny khng nh v tr b nh cho Cat. N ch cho trnh bin dch bit Cat l g, d liu g n c ( itsAge v itsWeight), v n c th lm c g ( Meow() ). N cng ch cho trnh bin dch bit mt lp Cat ln bao nhiu, bao nhiu "room" trnh bin dch phi thit lp cho Cat m bn to ra. Trong v d ny , nu mt s nguyn l hai byte, mt Cat ch l 4byte : itsAge l 2 byte, itsWeight l 2 byte khc. Meow() khng chim "room" no, v khng c khng gian lu tr dnh cho hm thnh vin(methods). V.1.2.2 nh ngha i tng (Object). nh ngha mt i tng ca lp mi ch nh l nh ngha mt bin s nguyn: unsigned int GrossWeight; Cat Frisky; // define an unsigned integer // define a Cat

on m ny nh ngha 1 bin gi l Gross Weight l s nguyn khng du. N cng nh ngha Frisky, l i tng ca lp Cat. Ch : Mt i tng l 1 trng hp ring bit ca mt lp. truy nhp vo cc b phn trong lp, ngi ta thng dng du (.). Trong v d trn, gn 50 vo bin thnh vin Weight ca Frisky, phi vit: Frisky.Weight = 50; Tng t, gi hm Meow(), nn vit : Frisky.Meow() ;

Trang 56

V.1.2.3 Gn cho i tng, khng gn cho lp. Trong C++, khng gn gi tr cho cc kiu; m gn gi tr cho bin. V d, bn khng bao gi c vit : Int = 5 ; Trnh bin dch s a ra mt li, v khng th gn 5 cho mt s nguyn. Bn phi vit nh sau: Int x ; X=5; Tng t, khng th vit : Cat.age = 5 ; Trnh bin dch s a ra mt li, v khng th gn 5 cho phn tn ca mt lp Cat. Bn phi nh ngha mt i tng Cat v gn 5 cho i tng . V d: Cat Frisky; Frisky.age = 5; // just like int x; // just like x = 5;

T hc C++ trong 21 ngy.

V.1.3

Private v Public.
Cc t kho khc dng khai bo lp. C hai loi thng dng l : public v private.

Tt c cc phn (thnh vin) ca mt lp-- d liu v phng php (methods)-- l private theo mc nh. Cc thnh vin private c th c truy nhp ch bn trong method ca chnh lp . Cc thnh vin private c th c truy nhp thng qua bt c i tng no ca lp. S khc nhau ny l c quan trng v kh hiu. hiu r rng hn, quan st v d sau: class Cat { unsigned int itsAge; unsigned int itsWeight; Meow(); }; Trong v d ny , itsAge, itsWeight, v Meow() tt c l private, v tt c thnh vin ca 1 lp l private theo mc nh. Mc d vy, nu bn vit: Cat Boots; Boots.itsAge=5; // error! can't access private data! Trnh bin dch s bo 1 li . Cch s dng Cat v vy bn c th truy nhp vo c cc thnh vin data l: class Cat { public:

Trang 57

T hc C++ trong 21 ngy.


unsigned int itsAge; unsigned int itsWeight; Meow(); }; By gi itsAge , itsWeight, v Meow() tt c l public. Boots.itsAge = 5 bin dch khng gp li no.

Listing 6.1. Accessing the public members of a simple class.


1: // Demonstrates declaration of a class and 2: // definition of an object of the class, 3: 4: #include <iostream.h> // for cout 5: 6: class Cat 7: { 8: public: 9: 10: int itsAge; int itsWeight; // members which follow are public // declare the class object

11: }; 12: 13: 14: void main() 15: { 16: 17: 18: 19: 20: Output: Frisky is a cat who is 5 years old. Mt qui lut chung ca thit k l nn gi li d liu thnh phn ca mt private lp. V vy, bn phi to ra cc hm public c bit nh l b truy nhp h thng thit lp v nhn cc bin private thnh vin. Nhng b truy nhp h thng l cc hm thnh vin m cc phn ca chng trnh gi nhn c v thit lp cc bin private thnh vin. Ch : Mt public accessor method l 1 hm thnh vin ca lp c dng hoc c gi tr ca bin thnh vin private ca lp hoc thit lp gi tr ca n. Cat Frisky; Frisky.itsAge = 5; // assign to the member variable

cout << "Frisky is a cat who is " ; cout << Frisky.itsAge << " years old.\n";

Trang 58

T hc C++ trong 21 ngy.


Cc hm truy nhp cho php phn loi chi tit bao nhiu d liu lu tr c s dng. iu ny cho php thay i d liu c lu gi, khng phi vit li hm m s dng d liu. Nu mt hm cn truy nhp trc tip vo itsAge ca Cat, hm s cn phi vit li nu bn l tc gi ca lp Cat, quyt nh thay i d liu c lu tr. Bng cch gi hm GetAge(). V d minh ho:

Listing 6.2. A class with accessor methods.


1: 2: 3: 4: 5: class Cat 6: { 7: public: 8: 9: // public accessors unsigned int GetAge(); // Cat class declaration // Data members are private, public accessor methods // mediate setting and getting the values of the private data

10: void SetAge(unsigned int Age); 11: 12: unsigned int GetWeight(); 13: void SetWeight(unsigned int Weight); 14: 15: // public member functions

16: Meow(); 17: 18: // private member data

19: private: 20: unsigned int itsAge; 21: unsigned int itsWeight; 22: 23: }; thit lp tui ca Frisky, ta c th a gi tr vo hm SetAge() nh sau: Cat Frisky; Frisky.SetAge(5); // set Frisky's age using the public accessor

V.1.4

T kho Class.

C php nh sau: Class class_name

Trang 59

T hc C++ trong 21 ngy.


{ // t kha iu khin truy nhp // cc bin lp v cc hm c khai bo y. }; T kho Class dng khai bo cc kiu mi. Mt lp l mt tp hp ca lp d liu thnh vin, m l cc bin ca cc kiu khc nhau, bao gm cc lp khc nhau. Cc lp cng c cc hm lp-- cc methods-- l cc hm c x l d liu trong lp v thc hin cc dch v khc cho lp. Vic nh ngha cc i tng trong lp thc hin tng t nh nh ngha bin bt k. C th vo cc thnh vin ca lp v cc hm bng cch s dng du chm (.). Bn c th s dng cc t kho iu khin truy nhp khai bo cc phn ca lp nh l public hay private. Mc nh i vi iu khin truy nhp l private. Mi t kho thay i iu khin truy nhp t im n ht lp hoc n t kha iu khin truy nhp tip theo. V d: class Cat { public: unsigned int Age; unsigned int Weight; void Meow(); };

Cat Frisky; Frisky.Age = 8; Frisky.Weight = 18; Frisky.Meow(); V d: class Car { public: void Start(); void Accelerate(); void Brake(); void SetYear(int year); int GetYear(); // the next five are public

private: int Year;

// the rest is private

Trang 60

T hc C++ trong 21 ngy.


Char Model [255]; }; // end of class declaration

Car OldFaithful; int bought; OldFaithful.SetYear(84) ;

// make an instance of car // a local variable of type int // assign 84 to the year // set bought to 84

bought = OldFaithful.GetYear(); OldFaithful.Start();

// call the start method

V.1.4.1 Cc hm b sung trong lp. Hm b sung c gi l nh ngha hm. Mt nh ngha hm thnh vin bt u vi tn ca lp, sau l 2 du 2 chm (::), tn ca hm, v cc tham s ca n. V d:

Listing 6.3. Implementing the methods of a simple class.


1: // Demonstrates declaration of a class and 2: // definition of class methods, 3: 4: #include <iostream.h> 5: 6: class Cat 7: { 8: 9: 10: 11: public: int GetAge(); // begin public section // accessor function // begin declaration of the class // for cout

void SetAge (int age); // accessor function void Meow(); // general function // begin private section // member variable

12: private: 13: 14: }; 15: int itsAge;

16: // GetAge, Public accessor function 17: // returns value of itsAge member 18: int Cat::GetAge() 19: { 20: 21: } 22: return itsAge;

Trang 61

T hc C++ trong 21 ngy.


23: // definition of SetAge, public 24: // accessor function 25: // returns sets itsAge member 26: void Cat::SetAge(int age) 27: { 28: 29: 30: 31: } 32: 33: // definition of Meow method 34: // returns: void 35: // parameters: None 36: // action: Prints "meow" to screen 37: void Cat::Meow() 38: { 39: 40: } 41: 42: // create a cat, set its age, have it 43: // meow, tell us its age, then meow again. 44: int main() 45: { 46: 47: 48: 49: 50: 51: 52; Cat Frisky; Frisky.SetAge(5); Frisky.Meow(); cout << "Frisky is a cat who is " ; cout << Frisky.GetAge() << " years old.\n"; Frisky.Meow(); return 0; cout << "Meow.\n"; // set member variable its age to // value passed in by parameter age itsAge = age;

53: } Output: Meow. Frisky is a cat who is 5 years old. Meow.

Trang 62

T hc C++ trong 21 ngy.


V.1.5 Cc hm xy dng v xa mc nh.
Nu bn khng khai bo mt hm xy dng hoc 1 hm xo, trnh bin dch thc hin cho bn. Hm xy dng v xo mc nh khng c i s v khng lm g. khai bo mt i tng khng a vo cc tham s, nh l Cat Rags ; Cat () ; Khi nh ngha mt i tng ca 1 lp, cc hm xy dng c gi. Nu hm xy dng Cat() c 2 tham s, phi nh ngha mt i tng Cat bng cch vit Cat Frisky (5,7); Nu c 1 tham s th vit: Cat Frisky (3); Khi hm xy dng khng c tham s th b du ngoc v vit: Cat Frisky ; // Rags khng nhn tham s Bn phi c mt hm xy dng trong lp.

Listing 6.4. Using constructors and destructors.


1: // Demonstrates declaration of a constructors and 2: // destructor for the Cat class 3: 4: #include <iostream.h> 5: 6: class Cat 7: { 8: public: 9: 10: 11: 12: 13: // begin public section // constructor // destructor // accessor function // accessor function // begin declaration of the class // for cout

Cat(int initialAge); ~Cat(); int GetAge();

void SetAge(int age); void Meow();

14: private: 15: int itsAge;

// begin private section // member variable

16: }; 17: 18: // constructor of Cat, 19: Cat::Cat(int initialAge) 20: {

Trang 63

T hc C++ trong 21 ngy.


21: 22: } 23: 24: Cat::~Cat() 25: { 26: } 27: 28: // GetAge, Public accessor function 29: // returns value of itsAge member 30: int Cat::GetAge() 31: { 32: 33: } 34: 35: // Definition of SetAge, public 36: // accessor function 37: 38: void Cat::SetAge(int age) 39: { 40: 41: 42: 43: } 44: 45: // definition of Meow method 46: // returns: void 47: // parameters: None 48: // action: Prints "meow" to screen 49: void Cat::Meow() 50: { 51: 52: } 53: 54: // create a cat, set its age, have it 55 // meow, tell us its age, then meow again. cout << "Meow.\n"; // set member variable its age to // value passed in by parameter age itsAge = age; return itsAge; // destructor, takes no action itsAge = initialAge;

Trang 64

T hc C++ trong 21 ngy.


56: int main() 57: { 58: Cat Frisky(5); 59: Frisky.Meow(); 60: cout << "Frisky is a cat who is " ; 61: cout << Frisky.GetAge() << " years old.\n"; 62: Frisky.Meow(); 63: Frisky.SetAge(7); 64: cout << "Now Frisky is " ; 65: cout << Frisky.GetAge() << " years old.\n"; 66; return 0;

67: }

Output: Meow. Frisky is a cat who is 5 years old. Meow. Now Frisky is 7 years old. Ch : Khng nn a tham s cho cc hm xo ( destructors ). Cc hm xy dng (instructors ) v hm xo khng nn tr v gi tr . S dng hm xy dng khi to cho i tng . V.1.5.1 Cc hm thnh vin Const. Nu khai bo mt hm trong lp l const, bn phi hy vng hm s khng lm thay i gi tr ca bt c thnh vin no ca lp. khai bo mt hm khng i trong lp, t t kho const sau du ngoc n nhng trc du chm phy. V d khi bo hm khng i SomeFunction() khng c i s v tr v dng void: Void someFunction() const ; V d Void SetAge (int anAge) ; Int GetAge () ; SetAge() khng th l const v n thay i bin thnh vin itsAge. GetAge() c th l const v n khng thay i tt c lp. GetAge() tr v gi tr hin ti ca bin thnh vin itsAge. V vy, khai bo hm ny nn vit: Void SetAge (int anAge) ; Int GetAge () const ;

Trang 65

T hc C++ trong 21 ngy. V.2

t khai bo lp v hm trong lp u.

Mi hm m bn khai bo cho lp, phi c mt nh ngha . S nh ngha cng c gi l s b xung hm. Ging nh cc hm khc, nh ngha ca mt hm trong lp c mt u v 1 thn hm. S nh ngha phi trong 1 file m trnh bin dch c th tm thy. Hu ht cc trnh bin dch C++ mun cc file kt thc vi .C hoc .CCP. Trong quyn sch ny vit l .CCP. Bn t do t khai bo trong file ny, nhng l khng tt cho lp trnh thc t. Quy c m hu ht cc lp trnh vin chp nhn t khai bo vo trong ci c gi l u file, thng vi tn kt thc l .H hoc .HP, .HPP . Trong quyn sch ny u file vi .HPP. V d, t khai bo ca lp Cat vo trong 1 file c tn CAT.HPP, v t khai bo ca hm trong lp vo trong 1 file c gi l CAT.CPP. Sau gn u file vi file .CPP bng cch t m lnh sau u file CAT.CPP: #include Cat.hpp iu ny bo cho trnh bin dch c CAT.HPP bn trong file. Vic c file u bo cho chng mi th chng cn bit; chng c th b qua cc file b xung. V.2.1.1 B xung Inline. Khai bo vi hm GetWeight() : inline int Cat::GetWeight() { return itsWeight; } Bn cng c th t nh ngha ca hm vo trong khai bo ca lp, m t ng thc hin hm inline . V d : class Cat { public: int GetWeight() { return itsWeight; } void SetWeight(int aWeight); }; V d: class Cat { public: int GetWeight() { // inline // return the Weight data member

Trang 66

T hc C++ trong 21 ngy.


return itsWeight; } }; V d khai bo lp cat trong file CAT.HPP // inline void SetWeight(int aWeight);

Listing 6.6. Cat class declaration in CAT.HPP


1: #include <iostream.h> 2: class Cat 3: { 4: public: 5: Cat (int initialAge); 6: ~Cat(); 7: int GetAge() { return itsAge;} // inline! // inline! // inline!

8: void SetAge (int age) { itsAge = age;} 9: void Meow() { cout << "Meow.\n";} 10: private: 11: int itsAge; 12: };

Listing 6.7. Cat implementation in CAT.CPP.


1: // Demonstrates inline functions 2: // and inclusion of header files 3: 4: #include "cat.hpp" // be sure to include the header files! 5: 6: 7: Cat::Cat(int initialAge) //constructor 8: { 9: 10: } 11: 12: Cat::~Cat() 13: { 14: } 15: 16: // Create a cat, set its age, have it //destructor, takes no action itsAge = initialAge;

Trang 67

T hc C++ trong 21 ngy.


17: // meow, tell us its age, then meow again. 18: int main() 19: { 20: 21: 22: 23: 24: 25: 26: 27: 28: Cat Frisky(5); Frisky.Meow(); cout << "Frisky is a cat who is " ; cout << Frisky.GetAge() << " years old.\n"; Frisky.Meow(); Frisky.SetAge(7); cout << "Now Frisky is " ; cout << Frisky.GetAge() << " years old.\n"; return 0;

29: }

Output: Meow. Frisky is a cat who is 5 years old. Meow. Now Frisky is 7 years old. Trong v d ny, trn dng 4 c #include "cat.hpp" , n bo cho tin x l c file cat.hpp vo trong file ny. K thut ny cho php bn t khai bo vo trong mt file b xung khc. y l k thut rt thng dng trong lp trnh C++. in hnh, khai bo lp trong file .HPP v sau c #include vo trong file c lin kt .CPP.

V.2.2

Cc lp vi cc lp khc nh l d liu thnh vin.

Ngi ta khng thng xy dng mt lp phc tp bng vic khai bo cc lp n gin hn v gp chng vo trong khai bo ca lp phc tp. Quan st v d th 2. Mt hnh ch nht l kt hp ca cc ng thng. Mt ng thng c 2 im. Mt im c nh ngha bng 1 to x,y . V d sau ch ra mt khai bo hon chnh ca mt lp hnh ch nht, xut hin trong RECTANGLE.HPP. V mt hnh ch nhtdc nh ngha l 4 ng thng lin kt vi nhau 4 im, mi im coi l mt to trn th, u tin khai bo mt lp Point, gi cc to x,y ca mi im.

Listing 6.8. Declaring a complete class.


1: // Begin Rect.hpp 2: #include <iostream.h> 3: class Point 4: { // holds x,y coordinates

Trang 68

T hc C++ trong 21 ngy.


5: 6: 7: 8: 9: 10: 11: 12: 13: // no constructor, use default public: void SetX(int x) { itsX = x; } void SetY(int y) { itsY = y; } int GetX()const { return itsX;} int GetY()const { return itsY;} private: int itsX; int itsY;

14: }; // end of Point class declaration 15: 16: 17: class Rectangle 18: { 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: void SetTop(int top) { itsTop = top; } void SetLeft (int left) { itsLeft = left; } void SetUpperLeft(Point Location) {itsUpperLeft = Location;} void SetLowerLeft(Point Location) {itsLowerLeft = Location;} void SetUpperRight(Point Location) {itsUpperRight = Location;} void SetLowerRight(Point Location) {itsLowerRight = Location;} Point GetUpperLeft() const { return itsUpperLeft; } Point GetLowerLeft() const { return itsLowerLeft; } Point GetUpperRight() const { return itsUpperRight; } Point GetLowerRight() const { return itsLowerRight; } int GetTop() const { return itsTop; } int GetLeft() const { return itsLeft; } int GetBottom() const { return itsBottom; } int GetRight() const { return itsRight; } public: Rectangle (int top, int left, int bottom, int right); ~Rectangle () {}

Trang 69

T hc C++ trong 21 ngy.


40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: }; 55: // end Rect.hpp private: Point itsUpperLeft; Point itsUpperRight; Point itsLowerLeft; Point itsLowerRight; int int int int itsTop; itsLeft; itsBottom; itsRight; int GetArea() const; void SetBottom (int bottom) { itsBottom = bottom; } void SetRight (int right) { itsRight = right; }

Listing 6.9. RECT.CPP.


1: // Begin rect.cpp 2: #include "rect.hpp" 3: Rectangle::Rectangle(int top, int left, int bottom, int right) 4: { 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: itsLowerLeft.SetX(left); itsLowerLeft.SetY(bottom); itsUpperRight.SetX(right); itsUpperRight.SetY(top); itsUpperLeft.SetX(left); itsUpperLeft.SetY(top); itsTop = top; itsLeft = left; itsBottom = bottom; itsRight = right;

Trang 70

T hc C++ trong 21 ngy.


19: 20: 21: } 22: 23: 24: // compute area of the rectangle by finding corners, 25: // establish width and height and then multiply 26: int Rectangle::GetArea() const 27: { 28: 29: 30: 31: } 32: 33: int main() 34: { 35: 36: 37: 38: 39: 40: 41: 42: 43: cout << "Area: " << Area << "\n"; cout << "Upper Left X Coordinate: "; cout << MyRectangle.GetUpperLeft().GetX(); return 0; int Area = MyRectangle.GetArea(); //initialize a local Rectangle variable Rectangle MyRectangle (100, 20, 50, 80 ); int Width = itsRight-itsLeft; int Height = itsTop - itsBottom; return (Width * Height); itsLowerRight.SetX(right); itsLowerRight.SetY(bottom);

44: } Output: Area: 3000 Upper Left X Coordinate: 20

V.3

Cu trc (structures).

Mt t kha rt gn vi t kho class l struct , c dng khai bo mt cu trc. Trong C++, mt cu trc chnh xc ng nh mt lp, ngoi tr cc thnh vin ca n mc nh l public. Bn c th khai bo 1 cu trc chnh xc nh khai bo 1 lp. Xem li v d trn listing 6.8 : Dng 3, l : class Point to struct Point .

Trang 71

T hc C++ trong 21 ngy.


Ch : t khai bo lp vo trong file HPP v cc hm thnh vin trong file CPP. C th s dng const bt c khi no. Dng 17, l : class Rectangle to struct Rectangle . Khi chy chng trnh th kt qu khng thay i.

VI

Cc loi vng lp.

VI.1 Ngun gc vng lp go to.


Cc vng lp bao gm mt nhn, mt s cu lnh v mt bc nhy. Trong C++, mt nhn ch l mt tn theo sau l du (:). Mt bc nhy c thc hin bng cch vit goto vo sau tn nhn.

Listing 7.1. Looping with the keyword goto.


1: // Listing 7.1 2: // Looping with goto 3: 4: #include <iostream.h> 5: 6: int main() 7: { 8: int counter = 0; // initialize counter // top of the loop

9: loop: counter ++; 10: 11: 12: 13: 14: 15: 16: } Output: counter: 1 counter: 2 counter: 3 counter: 4 counter: 5

cout << "counter: " << counter << "\n"; if (counter < 5) goto loop; // test the value // jump to the top

cout << "Complete. Counter: " << counter << ".\n"; return 0;

Trang 72

T hc C++ trong 21 ngy.


Complete. Counter: 5.

VI.1.1

Ti sao trnh dng lp goto.

Vic s dng lnh goto s gy ra s ln xn v kh khn, khng th c chng trnh mt cch d dng c . Do nhng iu ny m ngi ta t khi s dng lnh goto. thay th cho vic s dng lnh goto, ngi ta a ra cc lnh: for, while, v do ... while. Ch khng nn dng goto. V n gy ra nhng phc tp.

VI.1.2

Cu lnh goto.

s dng lnh goto, ta vit sau goto l tn nhn. iu ny to ra bc nhy v iu kin ti nhn. V d: if (value > 10) goto end ; if (value < 10) goto end; cout << "value is 10!"; end: cout << "done";

VI.2 Vng lp While.


Vng lp While s lp li khi no iu kin bt u vn cn ng.

Listing 7.2. while loops.


1: // Listing 7.2 2: // Looping with while 3: 4: #include <iostream.h> 5: 6: int main() 7: { 8: 9: 10: 11: 12: 13: 14: 15: 16: cout << "Complete. Counter: " << counter << ".\n"; } while(counter < 5) { counter++; // body of the loop // test condition still true int counter = 0; // initialize the condition

cout << "counter: " << counter << "\n";

Trang 73

T hc C++ trong 21 ngy.


17: 18: } Output: counter: 1 counter: 2 counter: 3 counter: 4 counter: 5 Complete. Counter: 5. return 0;

VI.2.1
C php:

Cu lnh While.
While (iu kin ) Cu lnh ;

iu kin l bt c biu thc no, cu lnh c th l 1 cu lnh hoc mt khi cc lnh. Khi iu kin l ng (TRUE), , cu lnh c x l, v sau iu kin c kim tra li. Qu trnh s tip tc n khi iu kin kim tra l FALSE, khi vng lp kt thc v x l dng u tin sau cu lnh . V d: // count to 10 int x = 0; while (x < 10) cout << "X: " << x++;

VI.2.2

Cu lnh While phc tp hn.

iu kin kim tra trong vng lp while c th phc tp, n c th s dng ton t lgc: && (AND), // (OR), v ! (NOT).

Listing 7.3. Complex while loops.


1: // Listing 7.3 2: // Complex while statements 3: 4: #include <iostream.h> 5: 6: int main() 7: { 8: 9: 10: unsigned short small; unsigned long large; const unsigned short MAXSMALL=65535;

Trang 74

T hc C++ trong 21 ngy.


11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: cout << "\nSmall: " << small << " Large: " << large << endl; return 0; } large-=2; small++; { if (small % 5000 == 0) // write a dot every 5k lines cout << "."; // for each iteration, test three conditions while (small < large && large > 0 && small < MAXSMALL) cout << "small: " << small << "..."; cout << "Enter a small number: "; cin >> small; cout << "Enter a large number: "; cin >> large;

33: } Output: Enter a small number: 2 Enter a large number: 100000 small: 2......... Small: 33335 Large: 33334

VI.2.3

Continue v break.

Lnh continue nhy tr li u ca vng lp. Lnh break lp tc kt thc vng lp while v chng trnh x l tip sau du ng ngoc. V d:

Listing 7.4. break and continue.


1: // Listing 7.4 2: // Demonstrates break and continue 3:

Trang 75

T hc C++ trong 21 ngy.


4: #include <iostream.h> 5: 6: int main() 7: { 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: cout << "\n"; 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: if (large == target) // exact match for the target? } if (small % skip == 0) // skip the decrement? { cout << "skipping on " << small << endl; continue; small++; { // set up 3 stop conditions for the loop while (small < large && large > 0 && small < 65535) cout << "Enter a small number: "; cin >> small; cout << "Enter a large number: "; cin >> large; cout << "Enter a skip number: "; cin >> skip; cout << "Enter a target number: "; cin >> target; unsigned short small; unsigned long large; unsigned long skip; unsigned long target; const unsigned short MAXSMALL=65535;

Trang 76

T hc C++ trong 21 ngy.


39: 40: 41: 42: 43: 44: 45: 46: 47: cout << "\nSmall: " << small << " Large: " << large << endl; } large-=2; // end of while loop } { cout << "Target reached!"; break;

48: return 0; 49: } Output: Enter a small number: 2 Enter a large number: 20 Enter a skip number: 4 Enter a target number: 6 skipping on 4 skipping on 8

Small: 10 Large: 8 VI.2.3.1 Lnh Continue. Lm cho vng lp while hoc for tr li u vng lp. V d: if (value > 10) goto end; if (value < 10) goto end; cout << "value is 10!"; end: cout << "done"; VI.2.3.2 Cu lnh Break. Lm cho vng lp while hoc for lp tc kt thc. V d: while (condition) { if (condition2) break;

Trang 77

T hc C++ trong 21 ngy.


// statements; }

VI.2.4

Vng lp While(1).

y l vng lp While khng bao gi kt thc (lp v hn). V 1 lun l ng v lp khng bao gi kt thc tr khi gp lnh break.

Listing 7.5. while (1) loops.


1: // Listing 7.5 2: // Demonstrates a while true loop 3: 4: #include <iostream.h> 5: 6: int main() 7: { 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: Output: Counter: 11 } cout << "Counter: " << counter << "\n"; return 0; while (1) { counter ++; if (counter > 10) break; int counter = 0;

VI.3 Vng lp do ... While.


VI.3.1 Do ... While.

Vng lp ny x l khi lp trc khi kim tra iu kin ca n v chc chn rng khi lp lun c thc hin vi thi gian ti thiu.

1: 2: 3:

// Listing 7.7 // Demonstrates do while

Trang 78

T hc C++ trong 21 ngy.


4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: } int main() { int counter; cout << "How many hellos? "; cin >> counter; do { cout << "Hello\n"; counter--; } while (counter >0 ); cout << "Counter is: " << counter << endl; return 0; #include <iostream.h>

Output: How many hellos? 2 Hello Hello Counter is: 0 Cc lnh continue v break lm vic trong vng lp do ...while c tc dng nh trong vng lp while. S khc nhau gia while v do...while l khi no kim tra iu kin .

VI.3.2
C php: Do

C php vng lp do ... while.

Cu lnh While (iu kin) ; Cu lnh c thc hin sau iu kin c xc nh. Nu iu kin l TRUE, vng lp c lp li, ngc li nu l FALSE, vng lp kt thc. V d 1: // count to 10 int x = 0; do cout << "X: " << x++; while (x < 10)

Trang 79

T hc C++ trong 21 ngy.


V d 2: // print lowercase alphabet. char ch = `a'; do { cout << ch << ` `; ch++; } while ( ch <= `z' );

VI.4 Vng lp For.


Khi lp trnh vi vng lp while, ta lun thng tm cho mnh iu kin thit lp ban u, kim tra xem iu kin c ng khng, v tng ln hoc cch khc thay i bin mi ln lp li.

Listing 7.8. While reexamined.


1: // Listing 7.8 2: // Looping with while 3: 4: #include <iostream.h> 5: 6: int main() 7: { 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: } Output: Looping! Looping! Looping! Looping! Looping! Counter: 5. V d v vng lp for: cout << "\nCounter: " << counter << ".\n"; return 0; } while(counter < 5) { counter++; cout << "Looping! "; int counter = 0;

Listing 7.9. Demonstrating the for loop. Trang 80

T hc C++ trong 21 ngy.


1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: } Output: Looping! Looping! Looping! Looping! Looping! Counter: 5. cout << "\nCounter: " << counter << ".\n"; return 0; int main() { int counter; for (counter = 0; counter < 5; counter++) cout << "Looping! "; #include <iostream.h> // Listing 7.9 // Looping with for

VI.4.1

C php vng lp FOR.

C php cu lnh for : For ( Khi to; Kim tra; hot ng) Cu lnh ; V d: // print Hello ten times for (int i = 0; i<10; i++) cout << "Hello! "; V d 2: for (int i = 0; i < 10; i++) { cout << "Hello!" << endl; cout << "the value of i is: " << i << endl; }

VI.4.2

Vng lp For cp cao.

Cu lnh for c y sc mnh v s linh hot. Mt vng lp for lm vic theo cc bc sau: 1. Thc hin php ton khi to. 2. Xc nh iu kin .

Trang 81

T hc C++ trong 21 ngy.


3. Nu iu kin TRUE, thc hin lnh hot ng v lp. Sau mi ln, vng lp lp li cc bc 2 v 3. Vic khi to nhiu bin v tng chng nn, v thc hin nhiu hn mt lnh . Khi to v hot ng c th thay th bng nhiu cu lnh C++, mi cu lnh c ngn cch bi 1 du phy.

Listing 7.10. Demonstrating multiple statements in for loops.


1: //listing 7.10 2: // demonstrates multiple statements in 3: // for loops 4: 5: #include <iostream.h> 6: 7: int main() 8: { 9: 10: 11: for (int i=0, j=0; i<3; i++, j++) cout << "i: " << i << " j: " << j << endl; return 0;

12: }

Output: i: 0 j: 0 i: 1 j: 1 i: 2 j: 2 V d v cu lnh Null trong vng lp FOR: 1: // Listing 7.11 2: // For loops with null statements 3: 4: #include <iostream.h> 5: 6: int main() 7: { 8: 9: 10: 11: 12: 13: for( ; counter < 5; ) { counter++; cout << "Looping! "; int counter = 0;

Trang 82

T hc C++ trong 21 ngy.


14: 15: 16: 17: 18: } cout << "\nCounter: " << counter << ".\n"; return 0; }

output: Looping! Looping! Looping! Looping! Looping! Counter: 5. Trong thc t, s dng break v continue to ra mt vng for khng c 3 cu lnh . V d cu lnh For rng: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: } } return 0; } else break; int main() { int counter=0; int max; cout << "How many hellos?"; cin >> max; for (;;) { if (counter < max) { cout << "Hello!\n"; counter++; // increment // test // a for loop that doesn't end // initialization #include <iostream.h> //Listing 7.12 illustrating //empty for loop statement

Output: How many hellos?3

Trang 83

T hc C++ trong 21 ngy.


Hello! Hello! Hello! Vng lp for(; ;) l lp v hn ging nh vng lp while(1) .

VI.5 Vng lp lng.


Cc vng lp c th c lng vo bn trong thn ca mt vng lp khc. Vng lp bn trong c thc hin y i vi mi ln thc hin vng lp ngoi.

Listing 7.14. Illustrates nested for loops.


1: //Listing 7.14 2: //Illustrates nested for loops 3: 4: #include <iostream.h> 5: 6: int main() 7: { 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: } return 0; int rows, columns; char theChar; cout << "How many rows? "; cin >> rows; cout << "How many columns? "; cin >> columns; cout << "What character? "; cin >> theChar; for (int i = 0; i<rows; i++) { for (int j = 0; j<columns; j++) cout << theChar; cout << "\n";

23: }

Output: How many rows? 4 How many columns? 12

Trang 84

T hc C++ trong 21 ngy.


What character? x xxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxx

VI.6 S dng vng lp vi chui s.


Nh trn trnh by v chui Fibonacci. Chui Fibonacci c dng: 1, 1, 2, 3,5 , 8, 13, 21, 34, ..... Dng vng lp ta c th thc hin nh sau: 1: // Listing 7.15 2: // Demonstrates solving the nth 3: // Fibonacci number using iteration 4: 5: #include <iostream.h> 6: 7: typedef unsigned long int ULONG; 8: 9: ULONG fib(ULONG position); 10: int main() 11: { 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: } 22: 23: ULONG fib(ULONG n) 24: { 25: ULONG minusTwo=1, minusOne=1, answer=2; answer = fib(position); cout << answer << " is the "; cout << position << "th Fibonacci number.\n"; return 0; ULONG answer, position; cout << "Which position? "; cin >> position; cout << "\n";

Trang 85

T hc C++ trong 21 ngy.


26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: return answer; } for (n - = 3; n; n--) { minusTwo = minusOne; minusOne = answer; answer = minusOne + minusTwo; if (n < 3) return 1;

38: } Output: Which position? 4

3 is the 4th Fibonacci number.

Which position? 5

5 is the 5th Fibonacci number.

Which position? 20

6765 is the 20th Fibonacci number.

Which position? 100

3314859971 is the 100th Fibonacci number.

VI.7 Cu lnh Switch.


Cu lnh switch c dng: switch (expression) { case valueOne: statement; break;

Trang 86

T hc C++ trong 21 ngy.


case valueTwo: statement; break; .... case valueN: statement; break; default: } expression l bt c biu thc no, statements c th l mt lnh hoc 1 khi lnh. Switch xc nh expression v so snh kt qu vi mi gi tr case . statement;

Listing 7.16. Demonstrating the switch statement.


1: //Listing 7.16 2: // Demonstrates switch statement 3: 4: #include <iostream.h> 5: 6: int main() 7: { 8: unsigned short int number; 9: cout << "Enter a number between 1 and 5: "; 10: cin >> number; 11: switch (number) 12: { 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: } 24: cout << "\n\n"; 25: return 0; case 0: cout << "Too small, sorry!"; break; case 5: cout << "Good job!\n"; // fall through case 4: cout << "Nice Pick!\n"; // fall through case 3: cout << "Excellent!\n"; // fall through case 2: cout << "Masterful!\n"; // fall through case 1: cout << "Incredible!\n"; break; default: cout << "Too large!\n"; break;

Trang 87

T hc C++ trong 21 ngy.


26: }

Output: Enter a number between 1 and 5: 3 Excellent! Masterful! Incredible!

Enter a number between 1 and 5: 8 Too large! V d khc. switch (choice) { case 0: cout << "Zero!" << endl; break case 1: cout << "One!" << endl; break; case 2: cout << "Two!" << endl; default: cout << "Default!" << endl; }

Example 2
switch (choice) { choice 0: choice 1: choice 2: cout << "Less than 3!"; break; choice 3: cout << "Equals 3!"; break; default:

Trang 88

T hc C++ trong 21 ngy.


cout << "greater than 3!"; } VI.7.1.1 S dng lnh switch vi menu.

Listing 7.17. Demonstrating a forever loop.


1: //Listing 7.17 2: //Using a forever loop to manage 3: //user interaction 4: #include <iostream.h> 5: 6: // types & defines 7: enum BOOL { FALSE, TRUE }; 8: typedef unsigned short int USHORT; 9: 10: // prototypes 11: USHORT menu(); 12: void DoTaskOne(); 13: void DoTaskMany(USHORT); 14: 15: int main() 16: { 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: BOOL exit = FALSE; for (;;) { USHORT choice = menu(); switch(choice) { case (1): DoTaskOne(); break; case (2): DoTaskMany(2); break; case (3): DoTaskMany(3);

Trang 89

T hc C++ trong 21 ngy.


32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: } 49: 50: USHORT menu() 51: { 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: } 64: 65: void DoTaskOne() 66: { cout << " **** Menu ****\n\n"; cout << "(1) Choice one.\n"; cout << "(2) Choice two.\n"; cout << "(3) Choice three.\n"; cout << "(4) Redisplay menu.\n"; cout << "(5) Quit.\n\n"; cout << ": "; cin >> choice; return choice; USHORT choice; } return 0; // end main() if (exit) break; // end forever } break; case (4): continue; // redundant! break; case (5): exit=TRUE; break; default: cout << "Please select again!\n"; break; // end switch

Trang 90

T hc C++ trong 21 ngy.


67: 68: } 69: 70: void DoTaskMany(USHORT which) 71: { 72: 73: 74: 75: 76: } if (which == 2) cout << "Task Two!\n"; else cout << "Task Three!\n"; cout << "Task One!\n";

Output: **** Menu ****

(1) Choice one. (2) Choice two. (3) Choice three. (4) Redisplay menu. (5) Quit.

:1 Task One! **** Menu **** (1) Choice one. (2) Choice two. (3) Choice three. (4) Redisplay menu. (5) Quit.

:3 Task Three! **** Menu **** (1) Choice one. (2) Choice two. (3) Choice three. (4) Redisplay menu.

Trang 91

T hc C++ trong 21 ngy.


(5) Quit.

:5

VII
2:

n tp t I VI .

1: #include <iostream.h>

3: typedef unsigned short int USHORT; 4: typedef unsigned long int ULONG; 5: enum BOOL { FALSE, TRUE}; 6: enum CHOICE { DrawRect = 1, GetArea, 7: GetPerim, ChangeDimensions, Quit};

8: // Rectangle class declaration 9: class Rectangle 10: { 11: public: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: private: 27: 28: 29: }; 30: USHORT itsWidth; USHORT itsHeight; // Misc. methods void DrawShape() const; // accessors USHORT GetHeight() const { return itsHeight; } USHORT GetWidth() const { return itsWidth; } ULONG GetArea() const { return itsHeight * itsWidth; } ULONG GetPerim() const { return 2*itsHeight + 2*itsWidth; } void SetSize(USHORT newWidth, USHORT newHeight); // constructors Rectangle(USHORT width, USHORT height); ~Rectangle();

Trang 92

T hc C++ trong 21 ngy.


31: // Class method implementations 32: void Rectangle::SetSize(USHORT newWidth, USHORT newHeight) 33: { 34: itsWidth = newWidth; 35: itsHeight = newHeight; 36: } 37: 38: 39: Rectangle::Rectangle(USHORT width, USHORT height) 40: { 41: itsWidth = width; 42: itsHeight = height; 43: } 44: 45: Rectangle::~Rectangle() {} 46: 47: USHORT DoMenu(); 48: void DoDrawRect(Rectangle); 49: void DoGetArea(Rectangle); 50: void DoGetPerim(Rectangle); 51: 52: void main () 53: { 54: // initialize a rectangle to 10,20 55: Rectangle theRect(30,5); 56: 57: USHORT choice = DrawRect; 58: USHORT fQuit = FALSE; 59: 60: while (!fQuit) 61: { 62: 63: 64: 65: choice = DoMenu(); if (choice < DrawRect || choice > Quit) { cout << "\nInvalid Choice, please try again.\n\n";

Trang 93

T hc C++ trong 21 ngy.


66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: } 98: } 99: 100: } switch (choice) { case DrawRect: DoDrawRect(theRect); break; case GetArea: DoGetArea(theRect); break; case GetPerim: DoGetPerim(theRect); break; case ChangeDimensions: USHORT newLength, newWidth; cout << "\nNew width: "; cin >> newWidth; cout << "New height: "; cin >> newLength; theRect.SetSize(newWidth, newLength); DoDrawRect(theRect); break; case Quit: fQuit = TRUE; cout << "\nExiting...\n\n"; break; default: cout << "Error in choice!\n"; fQuit = TRUE; break; } // end switch // end while // end main continue;

Trang 94

T hc C++ trong 21 ngy.


101: USHORT DoMenu() 102: { 103: USHORT choice; 104: cout << "\n\n *** Menu *** \n"; 105: cout << "(1) Draw Rectangle\n"; 106: cout << "(2) Area\n"; 107: cout << "(3) Perimeter\n"; 108: cout << "(4) Resize\n"; 109: cout << "(5) Quit\n"; 110: 111: cin >> choice; 112: return choice; 113: } 114: 115: void DoDrawRect(Rectangle theRect) 116: { 117: USHORT height = theRect.GetHeight(); 118: USHORT width = theRect.GetWidth(); 119: 120: for (USHORT i = 0; i<height; i++) 121: { 122: 123: 124: 125: } 126: } 127: 128: 129: void DoGetArea(Rectangle theRect) 130: { 131: cout << "Area: " << theRect.GetArea() << endl; 132: } 133: 134: void DoGetPerim(Rectangle theRect) 135: { for (USHORT j = 0; j< width; j++) cout << "*"; cout << "\n";

Trang 95

T hc C++ trong 21 ngy.


136: cout << "Perimeter: " << theRect.GetPerim() << endl; 137: } Output: *** Menu *** (1) Draw Rectangle (2) Area (3) Perimeter (4) Resize (5) Quit 1 ****************************** ****************************** ****************************** ****************************** ******************************

*** Menu *** (1) Draw Rectangle (2) Area (3) Perimeter (4) Resize (5) Quit 2 Area: 150

*** Menu *** (1) Draw Rectangle (2) Area (3) Perimeter (4) Resize (5) Quit 3 Perimeter: 70

*** Menu *** (1) Draw Rectangle

Trang 96

T hc C++ trong 21 ngy.


(2) Area (3) Perimeter (4) Resize (5) Quit 4

New Width: 10 New height: 8 ********** ********** ********** ********** ********** ********** ********** **********

*** Menu *** (1) Draw Rectangle (2) Area (3) Perimeter (4) Resize (5) Quit 2 Area: 80

*** Menu *** (1) Draw Rectangle (2) Area (3) Perimeter (4) Resize (5) Quit 3 Perimeter: 36

Trang 97

T hc C++ trong 21 ngy.


*** Menu *** (1) Draw Rectangle (2) Area (3) Perimeter (4) Resize (5) Quit 5

Exiting...

VIII Con tr.


VIII.1 Con tr l g ?
Con tr l 1 bin gi mt a ch b nh.

VIII.1.1 Lu a ch vo trong con tr.


Mi bin u c mt a ch. Thm ch khng cn bit a ch c th ca mt bin bit, bn c th a ch vo mt con tr. V d, gi s, howOld l mt s nguyn. khai bo 1 con tr gi l pAge lu a ch ca n, ta vit: Int *pAge = 0; Khai bo ny pAge l mt con tr int . pAge c khai bo lu a ch ca mt s nguyn. Ch rng pAge l mt bin ging nh bt k bin no. Khi khai bo mt bin con tr nh pAge, n c thit lp lu a ch. pAge ch c khc kiu bin. Trong v d ny, pAge c khi to l zero. Mt con tr m gi tr ca n l 0 th c gi l con tr rng (null). Tt c cc con tr, khi chng c to ra, nn c khi to cho mt ci g .Nu bn khng bit gn g cho con tr ,th gn 0. Mt con tr m khng c khi to , c gi l con tr t do (wild pointer). Con tr t do l rt nguy him. Nu bn khi to con tr l 0, bn phi gn mt cch c th ca howOld cho pAge. V d: unsigned short int howOld = 50; unsigned short int * pAge = 0; pAge = &howOld; // make a variable // make a pointer // put howOld's address in pAge

Dng u tin to ra mt bin --howOld v khi to gi tr l 50. Dng th hai khai bo 1 con tr kiu unsigned short int v khi to l zero. PAge l mt con tr bi v du hoa th (*) sau kiu bin v trc tn bin.

Trang 98

T hc C++ trong 21 ngy.


Dng th 3 gn a ch ca howOld cho con tr pAge. C th ni rng a ch howOld ang c gn bi a ch ca ton t (&). Nu a ch ca ton t khng c s dng, gi tr ca howOld s c gn. iu c th hoc khng th c c mt a ch ng. Theo quan im ny, pAge c gi tr a ch ca howOld. HowOld ln lt c gi tr 50. C th thc hin iu ny vi mt bc nh: unsigned short int howOld = 50; // make a variable

unsigned short int * pAge = &howOld; // make pointer to howOld pAge l con tr cha a ch ca bin howOld. S dng pAge, bn c th xc nh gi tr ca bin howOld, trong trng hp ny l 50. Truy cp howOld bng cch s dng con tr pAge c gi l gin tip, bi v khng trc tip truy cp howOld bng pAge. Ngy nay, ta s xem cch s dng gin tip truy nhp vo gi tr ca bin. Gin tip ngha l truy nhp gi tr a ch c gi bi con tr. Con tr cung cp mt cch khng trc tip nhn c gi tr lu a ch .

VIII.1.2 Tn con tr v ton t gin tip.


Tn con tr thng bt u vi ch p, nh l : pAge hoc pNumber. Ton t gin tip (*) cng c gi l ton t "dereference". Khi mt con tr c "dereferenced", gi tr a ch c lu tr bi con tr c truy nhp. Cc bin thng thng cung cp truy nhp trc tip ti gi tr ca chng. Nu to ra mt bin mi ca kiu unsigned short int c gi l yourAge, v mun gn gi tr trong howOld cho bin mi , ta vit: Unsigned short int yourAge ; YourAge = howOld ; Mt con tr cung cp truy nhp gin tip ti gi tr ca bin m a ch n lu tr. gn gi tr trong howOld cho bin mi yourAge bng cch s dng con tr pAge, ta vit: Unsigned short int yourAge ; YourAge = *pAge ; (*) ng trc bin pAge c ngha " gi tr lu ". Lnh gn ny "a gi tr lu a ch trong pAge v gn n cho yourAge" khi con tr c "dereferenced", ton t gin tip ch ra gi tr vng b nh c lu trong con tr c truy nhp, hn l a ch ca chnh n. *pAge = 5 ; // gn 5 cho gi tr pAge. VIII.1.2.1 Con tr, a ch v bin. Ta phi phn bit c gia con tr v a ch m con tr lu, v gi tr a ch lu bi con tr. y l ngun gc ca nhng phin phc v con tr.

Trang 99

T hc C++ trong 21 ngy.


Quan st on m lnh sau: int theVariable = 5; int * pPointer = &theVariable ; theVariable c khai bo l mt bin s nguyn c khi to vi gi tr 5. pPointer c khai bo l mt con tr cho mt s nguyn; n c khi to vi a ch ca theVariable. Gi tr a ch m pPointer lu gi l 5.

VIII.1.3 Thao tc d liu s dng con tr.


Mi ln con tr c gn a ch ca mt bin, bn c th s dng con tr truy nhp vo d liu trong bin . V d 8.2 gii thch a ch ca bin khu vc c gn cho con tr nh th no v con tr thao tc gi tr trong bin nh th no. 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: cout << "myAge = 9\n"; cout << "*pAge: " << *pAge << "\n"; cout << "myAge: " << myAge << "\n\n"; *pAge = 7; // sets myAge to 7 cout << "*pAge = 7\n"; cout << "*pAge: " << *pAge << "\n\n"; pAge = &myAge; // assign address of myAge to pAge typedef unsigned short int USHORT; int main() { USHORT myAge; USHORT * pAge = 0; myAge = 5; cout << "myAge: " << myAge << "\n"; // a variable // a pointer #include <iostream.h> // Listing 8.2 Using pointers

Trang 100

T hc C++ trong 21 ngy.


26: 27: 28: 29: 30: 31: 32: return 0; 33: } cout << "myAge: " << myAge << "\n"; cout << "*pAge: " << *pAge << "\n"; myAge = 9;

Output: myAge: 5 *pAge: 5

*pAge = 7 *pAge: 7 myAge: 7

myAge = 9 myAge: 9 *pAge: 9 Ch : *pointer: ch ra gi tr ca a ch m con tr lu gi VIII.1.3.1 Kim tra a ch . Con tr cho php bn thao tc a ch khng cn bit gi tr thc ca chng.

Listing 8.3. Finding out what is stored in pointers.


1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: cout << "myAge:\t" << myAge << "\tyourAge:\t" << yourAge << "\n"; cout << "&myAge:\t" << &myAge << "\t&yourAge:\t" << &yourAge <<"\n"; typedef unsigned short int USHORT; int main() { unsigned short int myAge = 5, yourAge = 10; unsigned short int * pAge = &myAge; // a pointer #include <iostream.h> // Listing 8.3 What is stored in a pointer.

Trang 101

T hc C++ trong 21 ngy.


13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: cout << "&pAge:\t" << &pAge << "\n"; cout << "pAge:\t" << pAge << "\n"; cout << "*pAge:\t" << *pAge << "\n"; cout << "myAge:\t" << myAge << "\tyourAge:\t" << yourAge << "\n"; cout << "&myAge:\t" << &myAge << "\t&yourAge:\t" << &yourAge <<"\n"; pAge = &yourAge; // reassign the pointer cout << "pAge:\t" << pAge << "\n"; cout << "*pAge:\t" << *pAge << "\n";

26: return 0; 27: } Output: myAge: 5 yourAge: 10 &yourAge: 0x355E

&myAge: 0x355C pAge: *pAge: myAge: 0x355C 5 5

yourAge: 10 &yourAge: 0x355E

&myAge: 0x355C pAge: *pAge: &pAge: 0x355E 10 0x355A

Trong dng 8, myAge v yourAge c khai bo l cc bin kiu s nguyn khng du short. Trong dng 9, pAge c khai bo l 1 con tr cho s nguyn khng du short, v c khi to vi a ch ca bin myAge . Dng 11 v 12 in gi tr v a ch ca myAge v yourAge .Dng 14 in ni dung ca pAge, m l a ch ca myAge . Dng 15 in kt qu ca "dereferencing" pAge, m in gi tr pAge-- gi tr trong myAge, hoc 5. y l bn cht ca con tr. Dng 14 ch ra pAge lu c ca myAge, v dng 15 ch ra cch nhn gi tr c lu trong myAge bng cch "dereferencing" con tr pAge. Dng 17, pAge c gn li ti im c ca yourAge. Gi tr v a ch li c in ra. u ra a ra pAge by gi c a ch ca bin yourAge v t c gi tr trong yourAge .

Trang 102

T hc C++ trong 21 ngy.


Dng 25 in ra a ch ca chnh pAge. Nh bt c bin no, n c 1 a ch v a ch c th c lu trong 1 con tr. S dng (*) truy nhp d liu lu gi ti a ch tron con tr . Khi to con tr hoc a ch c th hoc gi tr null.

VIII.2 Con tr.


khai bo mt con tr, vit kiu bin ng sau ton t con tr (*) v tn ca con tr. V d: unsigned short int *pPointer = 0 ; gn hoc khi to con tr, s dng ton t a ch (&). V d: unsigned short int theVariable = 5; unsigned short int * pPointer = & theVariable;

VIII.3 NEW
Bn c th nh r v tr b nh trn b nh trng (free store) trong C++ bng cch s dng t kho new . New theo sau kiu ca i tng m bn mun nh r v tr v vy trnh bin dch bit c cn bao nhiu b nh. V vy, new unsigned short int nh r 2 byte nh v new long nh r 4 byte nh. Gi tr tr v t new l mt a ch b nh. N phi c gn vo mt con tr. to ra mt unsigned short trn b nh rng, ta phi vit: unsigned short int * pPointer; pPointer = new unsigned short int; Bn c th khi to con tr nh sau: unsigned short int * pPointer = new unsigned short int; Trong mi trng hp trn, pPointer coi nh mt con tr s nguyn khng du . Ta c th vit: *pPointer = 72 ; Lnh ny c ngha, "gn gi tr 72 cho vng trn b nh rng ti cc im pPointer ".

VIII.4 Delete.
Khi bn kt thc vi khu vc ca b nh, bn phi gi "delete" thuc con tr. Delete tr v vng nh cho b nh t do. Vng nh xc nh vi new khng t ng gii phng c. khi phc li b nh b nh rng, ta s dng t kho delete. V d: delete pPointer ;

Listing 8.4. Allocating, using, and deleting pointers.


1: 2: // Listing 8.4 // Allocating and deleting a pointer

Trang 103

T hc C++ trong 21 ngy.


3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: } } *pHeap = 9; cout << "*pHeap: " << *pHeap << "\n"; delete pHeap; return 0; } *pHeap = 7; cout << "localVariable: " << localVariable << "\n"; cout << "*pLocal: " << *pLocal << "\n"; cout << "*pHeap: " << *pHeap << "\n"; delete pHeap; pHeap = new int; if (pHeap == NULL) { cout << "Error! No memory for pHeap!!"; return 0; #include <iostream.h> int main() { int localVariable = 5; int * pLocal= &localVariable; int * pHeap = new int; if (pHeap == NULL) { cout << "Error! No memory for pHeap!!"; return 0;

Output: localVariable: 5 *pLocal: 5 *pHeap: 7 *pHeap: 9

Trang 104

T hc C++ trong 21 ngy.

VIII.5 To i tng trn Free Store.


Nu bn khai bo mt i tng kiu Cat, bn c th khai bo mt con tr trong lp Cat, c php nh sau: Cat *pCat = new Cat ;

Listing 8.5. Creating and deleting objects on the free store.


1: // Listing 8.5 2: // Creating objects on the free store 3: 4: 5: 6: 7: 8: 9: 10: 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 int main() { cout << "SimpleCat Frisky...\n"; SimpleCat Frisky; } SimpleCat::~SimpleCat() { cout << "Destructor called.\n"; } SimpleCat::SimpleCat() { cout << "Constructor called.\n"; itsAge = 1; }; class SimpleCat { public: SimpleCat(); ~SimpleCat(); private: int itsAge; #include <iostream.h>

Trang 105

T hc C++ trong 21 ngy.


30 31 32 33 34 35 36 } cout << "SimpleCat *pRags = new SimpleCat...\n"; SimpleCat * pRags = new SimpleCat; cout << "delete pRags...\n"; delete pRags; cout << "Exiting, watch Frisky go...\n"; return 0;

Output: SimpleCat Frisky... Constructor called. SimpleCat *pRags = new SimpleCat.. Constructor called. delete pRags... Destructor called. Exiting, watch Frisky go... Destructor called.

VIII.6 Truy nhp cc thnh phn d liu.


truy nhp cc thnh phn, ta dng ton t chm (.): (*pRags).GetAge() ; Nu dng cch vit ny th s rt phc tp, trong C++ dng cch vit tt l ton t ( -> ).

Listing 8.6. Accessing member data of objects on the free store.


1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: class SimpleCat { public: SimpleCat() {itsAge = 2; } ~SimpleCat() {} int GetAge() const { return itsAge; } void SetAge(int age) { itsAge = age; } private: #include <iostream.h> // Listing 8.6 // Accessing data members of objects on the heap

Trang 106

T hc C++ trong 21 ngy.


14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: } int main() { SimpleCat * Frisky = new SimpleCat; cout << "Frisky is " << Frisky->GetAge() << " years old\n"; Frisky->SetAge(5); cout << "Frisky is " << Frisky->GetAge() << " years old\n"; delete Frisky; return 0; }; int itsAge;

Output: Frisky is 2 years old Frisky is 5 years old

Listing 8.7. Pointers as member data.


1: // Listing 8.7 2: // Pointers as data members 3: 4: #include <iostream.h> 5: 6: class SimpleCat 7: { 8: public: 9: 10: 11: 12: 13: 14: 15: 16: 17: private: 18: 19: int * itsAge; int * itsWeight; int GetWeight() const { return *itsWeight; } void setWeight (int weight) { *itsWeight = weight; } SimpleCat(); ~SimpleCat(); int GetAge() const { return *itsAge; } void SetAge(int age) { *itsAge = age; }

Trang 107

T hc C++ trong 21 ngy.


20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: } int main() { SimpleCat *Frisky = new SimpleCat; cout << "Frisky is " << Frisky->GetAge() << " years old\n"; Frisky->SetAge(5); cout << "Frisky is " << Frisky->GetAge() << " years old\n"; delete Frisky; return 0; } SimpleCat::~SimpleCat() { delete itsAge; delete itsWeight; } SimpleCat::SimpleCat() { itsAge = new int(2); itsWeight = new int(5); };

Output: Frisky is 2 years old Frisky is 5 years old

VIII.6.1 Con tr This .


Mi hm thnh vin trong lp u c mt tham s n : con tr this . Con tr this dnh cho i tng ring. V vy, trong mi ln gi GetAge() hay SetAge(), con tr this i vi i tng c bao gm mt tham s n.

Listing 8.8. Using the this pointer.


1: 2: 3: 4: #include <iostream.h> // Listing 8.8 // Using the this pointer

Trang 108

T hc C++ trong 21 ngy.


5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: int main() { Rectangle theRect; cout << "theRect is " << theRect.GetLength() << " feet long.\n"; cout << "theRect is " << theRect.GetWidth() << " feet wide.\n"; theRect.SetLength(20); theRect.SetWidth(10); cout << "theRect is " << theRect.GetLength()<< " feet long.\n"; cout << "theRect is " << theRect.GetWidth()<< " feet wide.\n"; return 0; } Rectangle::~Rectangle() {} Rectangle::Rectangle() { itsWidth = 5; itsLength = 10; }; private: int itsLength; int itsWidth; void SetWidth(int width) { itsWidth = width; } int GetWidth() const { return itsWidth; } class Rectangle { public: Rectangle(); ~Rectangle(); void SetLength(int length) { this->itsLength = length; } int GetLength() const { return this->itsLength; }

Trang 109

T hc C++ trong 21 ngy.


40: }

Output: theRect is 10 feet long. theRect is 5 feet long. theRect is 20 feet long. theRect is 10 feet long. Cc hm SetLength() v GetLength() s dng con tr this truy nhp cc bin thnh vin ca i tung Rectangle. Cc hm GetWidth v SetWidth khng s dng.

VIII.7 Con tr hng (const Pointer).


S dng t kho const cho con tr trc kiu ca n. Cc v d sau y l hp php: const int * pOne; int * const pTwo; const int * const pThree; pOne l mt con tr vi mt hng s nguyn. Gi tr c lu tr khng thay i c . pTwo l con tr hng vi mt s nguyn. S nguyn c th c thay i, nhng pTwo cng khng th tr ti bt c ci g. pThree l con tr hng i vi mt hng s nguyn. Gi tr c lu khng th c thay i, v pThree khng th thay i tr ti bt c th g. const int * p1; // the int pointed to is constant int * const p2; // p2 is constant, it can't point to anything else

Listing 8.10. Using pointers to const objects.


1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: class Rectangle { public: Rectangle(); ~Rectangle(); void SetLength(int length) { itsLength = length; } int GetLength() const { return itsLength; } #include <iostream.h> // Listing 8.10 // Using pointers with const methods

Trang 110

T hc C++ trong 21 ngy.


13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: cout << "pRect width: " << pRect->GetWidth() << " feet\n"; cout << "pConstRect width: " << pConstRect->GetWidth() << " feet\n"; cout << "pConstPtr width: " << pConstPtr->GetWidth() << " feet\n"; return 0; pRect->SetWidth(10); // pConstRect->SetWidth(10); pConstPtr->SetWidth(10); cout << "pRect width: " << pRect->GetWidth() << " feet\n"; cout << "pConstRect width: " << pConstRect->GetWidth() << " feet\n"; cout << "pConstPtr width: " << pConstPtr->GetWidth() << " feet\n"; int main() { Rectangle* pRect = new Rectangle; const Rectangle * pConstRect = new Rectangle; Rectangle * const pConstPtr = new Rectangle; Rectangle::~Rectangle() {} Rectangle::Rectangle(): itsWidth(5), itsLength(10) {} }; private: int itsLength; int itsWidth; void SetWidth(int width) { itsWidth = width; } int GetWidth() const { return itsWidth; }

Trang 111

T hc C++ trong 21 ngy.


48: }

Output: pRect width: 5 feet pConstRect width: 5 feet pConstPtr width: 5 feet pRect width: 10 feet pConstRect width: 5 feet pConstPtr width: 10 feet

VIII.8 Tm li.
Con tr cung cp mt cch y sc mnh truy nhp d liu gin tip. Mi bin c mt a ch, m c th t c bng cch s dng ton t a ch ca (&) . a ch c th c lu trong mt con tr. Con tr c khai bo bng cch vit kiu ca i tng m chng tr ti, sau l ton t gin tip (*) v tn ca con tr. Con tr nn c khi to tr ti mt i tng hoc rng (null : 0 ). Bn c th truy nhp gi tr a ch c lu trong mt con tr bng cch s dng ton t gin tip (*). Bn c th khai bo con tr const, m khng th c gn li tr ti i tng khc, v cc con tr ti cc i tng hng (const), m khng th c dng thay i cc i tng m chng tr ti. to cc i tng mi trn b nh free, bn s dng t kho new v gn a ch tr li cho con tr. Bn gii phng b nh bng cch gi t kho delete con tr. Delete gii phng b nh, nhng n khng ph hu con tr. V vy, bn phi gn li con tr sau khi b nh c gii phng.

IX

Tham kho ( References).

IX.1 Reference l g ?
Reference l mt b danh; khi bn to mt reference, bn khi to n vi tn ca mt i tng khc, target. T , reference hot ng nh mt tn c chn cho target, v bt c ci g lm cho reference thc cht l lm cho target. Ta c th to ra mt reference bng cch vit kiu ca i tng target, theo sau ton t reference (&), sau l tn ca reference. Reference c th s dng bt c tn bin hp php no, nhng trong sch ny chng ta s dng tin t vi tn "r". V vy, nu bn c mt bin s nguyn tn someInt, bn c th thc hin mt reference cho bin bng cch vit nh sau: int &rSomeRef = SomeInt ;

Trang 112

T hc C++ trong 21 ngy.


Lnh ny c l : " rSomeRef l mt reference cho mt s nguyn m c khi to a cho someInt." Ch : Ton t reference (&) tng t biu tng nh c dng i vi a ch ca ton t . y khng l cc ton t ging nhau.

Listing 9.1. Creating and using references.


1: //Listing 9.1 2: // Demonstrating the use of References 3: 4: #include <iostream.h> 5: 6: int main() 7: { 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: rSomeRef = 7; cout << "intOne: " << intOne << endl; cout << "rSomeRef: " << rSomeRef << endl; intOne = 5; cout << "intOne: " << intOne << endl; cout << "rSomeRef: " << rSomeRef << endl; int intOne; int &rSomeRef = intOne;

18: return 0; 19: }

Output: intOne: 5 rSomeRef: 5 intOne: 7 rSomeRef: 7 Nu khai bo mt Reference, nhng nu khng khi to n th s gp phi li bin dch. Reference phi c khi to.

Trang 113

T hc C++ trong 21 ngy.


IX.1.1 S sng ton t a ch & References.
Nu bn i hi a ch i vi mt Reference, n tr v a ch ca target ca n. l iu t nhin ca n. Chng l cc b danh cho target.

Listing 9.2. Taking the address of a reference.


1: //Listing 9.2 2: // Demonstrating the use of References 3: 4: #include <iostream.h> 5: 6: int main() 7: { 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: return 0; 19: } cout << "&intOne: " << &intOne << endl; cout << "&rSomeRef: " << &rSomeRef << endl; intOne = 5; cout << "intOne: " << intOne << endl; cout << "rSomeRef: " << rSomeRef << endl; int intOne; int &rSomeRef = intOne;

Output: intOne: 5 rSomeRef: 5 &intOne: 0x3500 &rSomeRef: 0x3500

Listing 9.3. Assigning to a reference.


1: 2: 3: 4: 5: #include <iostream.h> //Listing 9.3 //Reassigning a reference

Trang 114

T hc C++ trong 21 ngy.


6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: int intTwo = 8; rSomeRef = intTwo; // not what you think! cout << "\nintOne:\t" << intOne << endl; cout << "intTwo:\t" << intTwo << endl; cout << "rSomeRef:\t" << rSomeRef << endl; cout << "&intOne:\t" << &intOne << endl; cout << "&intTwo:\t" << &intTwo << endl; cout << "&rSomeRef:\t" << &rSomeRef << endl; return 0; intOne = 5; cout << "intOne:\t" << intOne << endl; cout << "rSomeRef:\t" << rSomeRef << endl; cout << "&intOne:\t" << &intOne << endl; cout << "&rSomeRef:\t" << &rSomeRef << endl; int main() { int intOne; int &rSomeRef = intOne;

26: }

Output: intOne: rSomeRef: &intOne: &rSomeRef: 5 0x213e 0x213e

intOne: intTwo: rSomeRef: &intOne: &intTwo: &rSomeRef: Ch : 8

8 8

0x213e 0x2130 0x213e

Trang 115

T hc C++ trong 21 ngy.


S dng references to ra mt b danh cho 1 i tng. Nn khi to tt c cc reference. Khng nn c gng gn li mt reference.

IX.1.2

Reference.

Bt c i tng no cng c th c xt n, bao gm cc i tng c ngi s dng nh ngha. Ch rng bn to ra mt reference cho mt i tng, nhng khng phi cho 1 lp. Bn khng c vit : Int & rIntRef = int ; int howBig = 200; int & rIntRef = howBig; Trong cch tng t, bn khng nn khi to 1 reference cho mt CAT: CAT & rCatRef = CAT ; CAT frisky ; CAT & rCatRef = frisky ; Chng ta c th truy nhp vo d liu thnh vin bng cch dng ton t chm (.). // sai Bn phi khi to rCatRef cho mt i tng CAT c th : // sai Bn phi khi to rIntRef cho mt s nguyn c th , nh l:

Listing 9.4. References to objects.


1: // Listing 9.4 2: // References to class objects 3: 4: #include <iostream.h> 5: 6: class SimpleCat 7: { 8: 9: 10: 11: 12: 13: 14: 15: 16: }; 17: public: SimpleCat (int age, int weight); ~SimpleCat() {} int GetAge() { return itsAge; } int GetWeight() { return itsWeight; } private: int itsAge; int itsWeight;

Trang 116

T hc C++ trong 21 ngy.


18: SimpleCat::SimpleCat(int age, int weight) 19: { 20: 21: 22: } 23: 24: int main() 25: { 26: 27: 28: 29: 30: 31: 32: cout << "Frisky is: "; cout << Frisky.GetAge() << " years old. \n"; cout << "And Frisky weighs: "; cout << rCat.GetWeight() << " pounds. \n"; SimpleCat Frisky(5,8); SimpleCat & rCat = Frisky; itsAge = age; itsWeight = weight;

33: return 0; 34: } Output: Frisky is: 5 years old. And Frisky weighs 8 pounds. IX.1.2.1 C php References. Khai bo mt reference bng cch vit kiu, sau l ton t &, sau l tn reference. Reference phi c khi to cng thi im to ra. V d: int hisAge; int &rAge = hisAge; V d: CAT boots; CAT &rCatRef = boots; IX.1.2.2 Hm swap() lm vic vi con tr.

Listing 9.6. Passing by reference using pointers.


1: 2: 3: 4: #include <iostream.h> //Listing 9.6 Demonstrates passing by reference

Trang 117

T hc C++ trong 21 ngy.


5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: } cout << "Swap. After swap, *px: " << *px << " *py: " << *py << "\n"; temp = *px; *px = *py; *py = temp; cout << "Swap. Before swap, *px: " << *px << " *py: " << *py << "\n"; void swap (int *px, int *py) { int temp; cout << "Main. Before swap, x: " << x << " y: " << y << "\n"; swap(&x,&y); cout << "Main. After swap, x: " << x << " y: " << y << "\n"; return 0; } int main() { int x = 5, y = 10; void swap(int *x, int *y);

Output: Main. Before swap, x: 5 y: 10 Swap. Before swap, *px: 5 *py: 10 Swap. After swap, *px: 10 *py: 5 Main. After swap, x: 10 y: 5

Listing 9.7. swap() rewritten with references.


1: 2: 3: 4: #include <iostream.h> //Listing 9.7 Demonstrates passing by reference // using references!

Trang 118

T hc C++ trong 21 ngy.


5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: } Output: Main. Before swap, x:5 y: 10 Swap. Before swap, rx:5 ry:10 Swap. After swap, rx:10 ry:5 Main. After swap, x:10, y:5 cout << "Swap. After swap, rx: " << rx << " ry: " << ry << "\n"; temp = rx; rx = ry; ry = temp; cout << "Swap. Before swap, rx: " << rx << " ry: " << ry << "\n"; void swap (int &rx, int &ry) { int temp; cout << "Main. Before swap, x: " << x << " y: " << y << "\n"; swap(x,y); cout << "Main. After swap, x: " << x << " y: " << y << "\n"; return 0; } int main() { int x = 5, y = 10; void swap(int &x, int &y);

Listing 9.8. Returning values with pointers.


1: 2: 3: //Listing 9.8 // Returning multiple values from a function

Trang 119

T hc C++ trong 21 ngy.


4: 5: 6: 7: 8: 9: 10: int main() 11: { 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: } else cout << "Error encountered!!\n"; return 0; if (!error) { cout << "number: " << number << "\n"; cout << "square: " << squared << "\n"; cout << "cubed: " << cubed << "\n"; error = Factor(number, &squared, &cubed); cout << "Enter a number (0 - 20): "; cin >> number; USHORT number, squared, cubed; short error; short Factor(USHORT, USHORT*, USHORT*); typedef unsigned short USHORT; #include <iostream.h>

29: } 30: 31: short Factor(USHORT n, USHORT *pSquared, USHORT *pCubed) 32: { 33: short Value = 0; 34: 35: 36: 37: 38: if (n > 20) Value = 1; else { *pSquared = n*n;

Trang 120

T hc C++ trong 21 ngy.


39: 40: 41: 42: 43: } Output: Enter a number (0-20): 3 number: 3 square: 9 cubed: 27 } return Value; *pCubed = n*n*n; Value = 0;

Mng

Mng l mt tp cc v tr lu tr d liu, mi v tr lu tr c gi l mt thnh phn ca mng. Khai bo mng: Kiu mng tn mng ch s mng: l s phn t trong mng, bao quanh l du ngoc vung [ ]. V d : Long longarray[25] ; V d : 1: #include <iostream.h> 3: 4: int main() 5: { 6: int myArray[5]; 7: int i; 8: for ( i=0; i<5; i++) // 0-4 9: { 10: cout << "Value for myArray[" << i << "]: "; 11: cin >> myArray[i]; 12: } 13: for (i = 0; i<5; i++) 14: cout << i << ": " << myArray[i] << "\n"; 15: return 0; 16: } Output: Value for myArray[0]: 3 Trang 121 // mng ny c 25 phn t Cc phn t ca mng tnh t 0: longarray[0] , longarray[1], ... , longarray[24]

T hc C++ trong 21 ngy. Value for myArray[1]: 6 Value for myArray[2]: 9 Value for myArray[3]: 12 Value for myArray[4]: 15 0: 3 1: 6 2: 9 3: 12 4: 15 X.1 Khi to mng

C th khi to mng khi khai bo. V d: Int intArray[5] = {10, 15, 20, 25, 35} ; Nu qun kch thc ca mng, mt mng s c kch thc bng ng s phn t khi to. V d: Int intArray[ ] = { 5, 12, 15, 18, 20 }; Hm dng ly kch thc ca mng : Const USHORT IntArraylength ; IntArraylength = sizeof(IntArray)/sizeof(IntArray[0]) ; Ly kch thc ton mng chia cho kch thc mt phn t. Ch : Khng c khi to cc phn t ln hn khai bo cho mng. Tuy nhin c th khi to 2 phn t trong 5 phn t ca c mng: Int IntArray[5] = {2, 6}; Nu khng khi to cho cc phn t ca mng th cc phn t s c gn mc nh l 0. Listing 11.3. Using consts and enums in arrays.
1: // Listing 11.3 2: // Dimensioning arrays with consts and enumerations 3: 4: #include <iostream.h> 5: int main() 6: { 7: enum WeekDays { Sun, Mon, Tue, 8: Wed, Thu, Fri, Sat, DaysInWeek }; 9: int ArrayWeek[DaysInWeek] = { 10, 20, 30, 40, 50, 60, 70 }; 10: 11: cout << "The value at Tuesday is: " << ArrayWeek[Tue]; 12: return 0; 13: }

Trang 122

T hc C++ trong 21 ngy.


Output: The value at Tuesday is: 30

Mng cc i tng. Bt c i tng no , mc d c sn hoc c nh ngha, cng c th c lu trong mt mng. Vic truy nhp d liu thnh phn trong mt mng i tng, tri qua 2 bc: - Xc nh s phn t ca mng nh ch s trong ton t [ ] - Thm ton t (.) truy nhp bin thnh vin c th V d: Listing 11.4. Creating an array of objects.
1: // Listing 11.4 - An array of objects 2: 3: #include <iostream.h> 4: 5: class CAT 6: { 7: public: 8: CAT() { itsAge = 1; itsWeight=5; } 9: ~CAT() {} 10: int GetAge() const { return itsAge; } 11: int GetWeight() const { return itsWeight; } 12: void SetAge(int age) { itsAge = age; } 13: 14: private: 15: int itsAge; 16: int itsWeight; 17: }; 18: 19: int main() 20: { 21: CAT Litter[5]; 22: int i; 23: for (i = 0; i < 5; i++) 24: Litter[i].SetAge(2*i +1); 25: 26: for (i = 0; i < 5; i++) 27: { 28: cout << "Cat #" << i+1<< ": "; 29: cout << Litter[i].GetAge() << endl; 30: } 31: return 0; 32: } Output: cat #1: 1 cat #2: 3 cat #3: 5 cat #4: 7

Trang 123

T hc C++ trong 21 ngy.


cat #5: 9

X.2

Mng nhiu chiu.

Mng nhiu chiu l c t hai chiu tr ln. Mi chiu c xc nh bng mt du ngoc vung: Int Mang [5] [3] ; Khi to: Th t xc nh l: 3 phn t u tin thuc Mang[0], 3 phn t tip theo l thuc Mang[1] , v tip tc ... Ta c th vit : Int Mang[5][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } ; r dng, nn vit nh sau: Int Mang[5][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}, {13, 14, 15} } ;
X.2.1 Mng con tr.

Listing 11.6. Storing an array on the free store.


1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: // Listing 11.6 - An array of pointers to objects #include <iostream.h> class CAT { public: CAT() { itsAge = 1; itsWeight=5; } ~CAT() {} // destructor int GetAge() const { return itsAge; } int GetWeight() const { return itsWeight; } void SetAge(int age) { itsAge = age; } private: int itsAge; int itsWeight; }; int main() { CAT * Family[500]; int i; CAT * pCat; for (i = 0; i < 500; i++) { pCat = new CAT; pCat->SetAge(2*i +1); Family[i] = pCat;

Trang 124

T hc C++ trong 21 ngy.


29: } 30: 31: for (i = 0; i < 500; i++) 32: { 33: cout << "Cat #" << i+1 << ": "; 34: cout << Family[i]->GetAge() << endl; 35: } 36: return 0; 37: } Output: Cat #1: 1 Cat #2: 3 Cat #3: 5 ... Cat #499: 997 Cat #500: 999

Mng khai bo c tn Family, n gi 500 con tr i tng CAT.


X.2.2 Khai bo Mng trn Free Store.

C th a ton b mng ln Free Store, thc hin bng cch gi t kho new v s dng ton t ch s. Kt qu l mt con tr tr ti mt vng trn free store m cha mng . Vd: Cat *Family = new Cat[500]; Khai bo Family l mt con tr tr ti phn t u tin trong mng 500 Cat. Ni cch khc Family ch ti -- hoc c a ch ca -- Family[0]. u im ca vic s dng Family theo cch ny l bn c th s dng con tr s hc truy cp ti mi thnh vin ca Family. V d:
CAT *Family = new CAT[500]; CAT *pCat = Family; //pCat points to Family[0] pCat->SetAge(10); // set Family[0] to 10 pCat++; // advance to Family[1] pCat->SetAge(20); // set Family[1] to 20

X.2.3

So snh con tr tr ti mng v mng con tr.

V d : C 3 khai bo. 1: Cat Fone[500] ; 2: Cat *Ftwo[500] ; 3: Cat *Fthree = new Cat[500] ; FOne l mt mng 500 Cat. Trang 125

T hc C++ trong 21 ngy. Ftwo l mt mng 500 con tr tr ti cc Cat. Fthree l mt con tr tr ti mt mng 500 Cat. Trong khai bo th ba, Fthree l mt bin ca Fone. X.3 Tn con tr v mng

Trong C++, tn mng l mt con tr hng tr ti phn t u tin ca mng. V vy, trong khai bo: Cat Family[50] ; Family l mt con tr tr ti a ch &Family[0]: a ch ca phn t u tin ca mng Family. Ta c th vit : Family + 4 truy nhp n d liu ca Family[4]. X.4 Mng k t (CHAR).

Trong C++, mt chui (String) l mt mng cc k t, kt thc l mt k t null. Ta c th khai bo v khi to mt mng k t nh cc mng thng thng nh sau: Char Greeting[ ] = { 'H', 'e', 'l', 'l', 'o', ' ' W', 'o', 'r', 'l', 'd', '\0' }; '\0' l k t null, trong nhiu hm C++ chp nhn nh l du kt thc chui. gim s phc tp v c th gy ra li, C++ cho php vit nh sau: char Greeting[ ] = "Hello World" ; // Vi cch ny khng cn c k t null ('\0') Chui Hello World chim 12 byte. Hello chim 5 byte, space 1 byte, World 5 byte v null chim 1 byte. Listing 11.8. Filling an array.
1: //Listing 11.8 char array buffers 2: 3: #include <iostream.h> 4: 5: int main() 6: { 7: char buffer[80]; 8: cout << "Enter the string: "; 9: cin >> buffer; 10: cout << "Here's the buffer: " << buffer << endl; 11: return 0; 12: } Output: Enter the string: Hello World Here's the buffer: Hello

Trang 126

T hc C++ trong 21 ngy. C hai kh nng li vi chng trnh ny: - Th 1: Nu user a vo hn 79 k t (mt k t l ca null), cin vit vo vt qu im kt thc ca mng buffer . - Th 2: Nu user nhp vo 1 space, cin cho rng l kt thc chui, v dng vic ghi vo buffer. gii quyt iu ny, phi gi mt phng thc c bit vi cin: get().cin.get() c 3 tham s: - in y buffer - S k t ti a nhn vo. - nh ra ranh gii kt thc nhp vo. Ranh gii mc nh l newline. Listing 11.9. Filling an array.
1: //Listing 11.9 using cin.get() 2: 3: #include <iostream.h> 4: 5: int main() 6: { 7: char buffer[80]; 8: cout << "Enter the string: "; 9: cin.get(buffer, 79); // get up to 79 or newline 10: cout << "Here's the buffer: " << buffer << endl; 11: return 0; 12: } Output: Enter the string: Hello World Here's the buffer: Hello World

X.5

Hm Strcpy( ) v Strncpy( ).

C++ tha hng t C mt s hm , trong c hai hm ny. Listing 11.10. Using strcpy().
1: 2: 3: 4: 5: 6: 7: 8: 9: #include <iostream.h> #include <string.h> int main() { char String1[] = "No man is an island"; char String2[80]; strcpy(String2,String1);

Trang 127

T hc C++ trong 21 ngy.


10: cout << "String1: " << String1 << endl; 11: cout << "String2: " << String2 << endl; 12: return 0; 13: } Output: String1: No man is an island String2: No man is an island

Hm Strcpy( ) c hai tham s l chui ch v sau l chui ngun, nu chui ngun ln hn chui ch, Strcpy( ) s ghi ln phn cui ca buffer. chng li iu ny, s dng hm Strncpy( ). Hm ny s copy n k t, n s copy ti k t null u tin hoc ti s k t ti a c ch r trong chui ch. Listing 11.11. Using strncpy().
1: #include <iostream.h> 2: #include <string.h> 3: int main() 4: { 5: const int MaxLength = 80; 6: char String1[] = "No man is an island"; 7: char String2[MaxLength+1]; 8: 9: 10: strncpy(String2,String1,MaxLength); 11: 12: cout << "String1: " << String1 << endl; 13: cout << "String2: " << String2 << endl; 14: return 0; 15: } Output: String1: No man is an island String2: No man is an island

X.6
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:

String Classes
//Listing 11.12 #include <iostream.h> #include <string.h> // Rudimentary string class class String { public: // constructors String(); String(const char *const); String(const String &); ~String();

Listing 11.12. Using a String class.

Trang 128

T hc C++ trong 21 ngy.


16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: // overloaded operators char & operator[](unsigned short offset); char operator[](unsigned short offset) const; String operator+(const String&); void operator+=(const String&); String & operator= (const String &); // General accessors unsigned short GetLen()const { return itsLen; } const char * GetString() const { return itsString; } private: String (unsigned short); char * itsString; unsigned short itsLen; };

// private constructor

// default constructor creates string of 0 bytes String::String() { itsString = new char[1]; itsString[0] = `\0'; itsLen=0; } // private (helper) constructor, used only by // class methods for creating a new string of // required size. Null filled. String::String(unsigned short len) { itsString = new char[len+1]; for (unsigned short i = 0; i<=len; i++) itsString[i] = `\0'; itsLen=len; } // Converts a character array to a String String::String(const char * const cString) { itsLen = strlen(cString); itsString = new char[itsLen+1]; for (unsigned short i = 0; i<itsLen; i++) itsString[i] = cString[i]; itsString[itsLen]='\0'; } // copy constructor String::String (const String & rhs) { itsLen=rhs.GetLen(); itsString = new char[itsLen+1]; for (unsigned short i = 0; i<itsLen;i++)

Trang 129

T hc C++ trong 21 ngy.


68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: itsString[i] = rhs[i]; itsString[itsLen] = `\0'; } // destructor, frees allocated memory String::~String () { delete [] itsString; itsLen = 0; } // operator equals, frees existing memory // then copies string and size String& String::operator=(const String & rhs) { if (this == &rhs) return *this; delete [] itsString; itsLen=rhs.GetLen(); itsString = new char[itsLen+1]; for (unsigned short i = 0; i<itsLen;i++) itsString[i] = rhs[i]; itsString[itsLen] = `\0'; return *this; } //nonconstant offset operator, returns // reference to character so it can be // changed! char & String::operator[](unsigned short offset) { if (offset > itsLen) return itsString[itsLen-1]; else return itsString[offset]; } // constant offset operator for use // on const objects (see copy constructor!) char String::operator[](unsigned short offset) const { if (offset > itsLen) return itsString[itsLen-1]; else return itsString[offset]; } // creates a new string by adding current // string to rhs String String::operator+(const String& rhs) { unsigned short totalLen = itsLen + rhs.GetLen();

Trang 130

T hc C++ trong 21 ngy.


120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: String temp(totalLen); for (unsigned short i = 0; i<itsLen; i++) temp[i] = itsString[i]; for (unsigned short j = 0; j<rhs.GetLen(); j++, i++) temp[i] = rhs[j]; temp[totalLen]='\0'; return temp; } // changes current string, returns nothing void String::operator+=(const String& rhs) { unsigned short rhsLen = rhs.GetLen(); unsigned short totalLen = itsLen + rhsLen; String temp(totalLen); for (unsigned short i = 0; i<itsLen; i++) temp[i] = itsString[i]; for (unsigned short j = 0; j<rhs.GetLen(); j++, i++) temp[i] = rhs[i-itsLen]; temp[totalLen]='\0'; *this = temp; } int main() { String s1("initial test"); cout << "S1:\t" << s1.GetString() << endl; char * temp = "Hello World"; s1 = temp; cout << "S1:\t" << s1.GetString() << endl; char tempTwo[20]; strcpy(tempTwo,"; nice to be here!"); s1 += tempTwo; cout << "tempTwo:\t" << tempTwo << endl; cout << "S1:\t" << s1.GetString() << endl; cout << "S1[4]:\t" << s1[4] << endl; s1[4]='x'; cout << "S1:\t" << s1.GetString() << endl; cout << "S1[999]:\t" << s1[999] << endl; String s2(" Another string"); String s3; s3 = s1+s2; cout << "S3:\t" << s3.GetString() << endl; String s4; s4 = "Why does this work?"; cout << "S4:\t" << s4.GetString() << endl;

Trang 131

T hc C++ trong 21 ngy.


172: return 0; 173: } Output: S1: initial test S1: Hello world tempTwo: ; nice to be here! S1: Hello world; nice to be here! S1[4]: o S1: Hellx World; nice to be here! S1[999]: ! S3: Hellx World; nice to be here! Another string S4: Why does this work?

T dng 7-- 31 khai bo lp mt string n gin. Cc dng 11--13 c 3 hm constructor : constructor mc nh, constructor copy, constructor ly k t kt thc chui null.

Trang 132

You might also like