Docstoc

C++ Can Ban

Document Sample
C++ Can Ban Powered By Docstoc
					Updatesofts.com                                                     Ebooks Team


                     C++ Căn b n và nâng cao
M c l c:
   I. Cơ b n v C++ (2)
          I. C u trúc c a m t trương trình C++ (2)
         II. Các bi n ki u và h ng s (5)
        III. Các toán t (13)
        IV. Giao ti p v i Console (19)
   II. Các c u trúc ñi u khi n và Hàm (22)
          I. C u trúc d li u ñi u khi n (22)
         II. Hàm I (29)
        III. Hàm II (34)
   III. D li u nâng cao (41)
          I. M ng (41)
         II. Sâu ký t (48)
        III. Con tr (54)
        IV. B nh ñ ng (65)
         V. Các c u trúc (69)
        VI. Các ki u d li u do ngư i dùng ñ nh nghĩa. (typedef, union, enum) (75)




                                     Trang 1
Updatesofts.com                                                           Ebooks Team




C u trúc c a m t chương trình C++


Có l m t trong nh ng cách t t nh t ñ b t ñ u h c m t ngôn ng l p trình là b ng m t
chương trình. V y ñây là chương trình ñ u tiên c a chúng ta :

// my first program in C++                  Hello World!

#include <iostream.h>

int main ()
{
  cout << "Hello World!";
  return 0;
}


Chương trình trên ñây là chương trình ñ u tiên mà h u h t nh ng ngư i h c ngh l p
trình vi t ñ u tiên và k t qu c a nó là vi t câu "Hello, World" lên màn hình. ðây là m t
trong nh ng chương trình ñơn gi n nh t có th vi t b ng C++ nhưng nó ñã bao g m
nh ng ph n cơ b n mà m i chương trình C++ có. Hãy cùng xem xét t ng dòng m t :

// my first program in C++
ðây là dòng chú thích. T t c các dòng b t ñ u b ng hai d u s (//) ñư c coi là chút thích
mà chúng không có b t kì m t nh hư ng nào ñ n ho t ñ ng c a chương trình. Chúng có
th ñư c các l p trình viên dùng ñ gi i thích hay bình ph m bên trong mã ngu n c a
chương trình. Trong trư ng h p này, dòng chú thích là m t gi i thích ng n g n nh ng gì
mà chương trình chúng ta làm.

#include <iostream.h>
Các câu b t ñ u b ng d u (#) ñư c dùng cho preprocessor (ai d ch h tôi t này v i).
Chúng không ph i là nh ng dòng mã th c hi n nhưng ñư c dùng ñ báo hi u cho trình
d ch. ñây câu l nh #include <iostream.h> báo cho trình d ch bi t c n ph i
"include" thư vi n iostream. ðây là m t thư vi n vào ra cơ b n trong C++ và nó ph i
ñư c "include" vì nó s ñư c dùng trong chương trình. ðây là cách c ñi n ñ s d ng
thư vi n iostream

int main ()
Dòng này tương ng v i ph n b t ñ u khai báo hàm main. Hàm main là ñi m mà t t c
các chương trình C++ b t ñ u th c hi n. Nó không ph thu c vào v trí c a hàm này (
ñ u, cu i hay gi a c a mã ngu n) mà n i dung c a nó luôn ñư c th c hi n ñ u tiên khi
chương trình b t ñ u. Thêm vào ñó, do nguyên nhân nói trên, m i chương trình C++ ñ u
ph i t n t i m t hàm main.

Theo sau main là m t c p ngo c ñơn b i vì nó là m t hàm. Trong C++, t t c các hàm
mà sau ñó là m t c p ngo c ñơn () thì có nghĩa là nó có th có ho c không có tham s


                                        Trang 2
Updatesofts.com                                                         Ebooks Team


(không b t bu c). N i dung c a hàm main ti p ngay sau ph n khai báo chính th c ñư c
bao trong các ngo c nh n ( { } ) như trong ví d c a chúng ta

cout << "Hello World";
Dòng l nh này làm vi c quan tr ng nh t c a chương trình. cout là m t dòng (stream)
output chu n trong C++ ñư c ñ nh nghĩa trong thư vi n iostream và nh ng gì mà dòng
l nh này làm là g i chu i kí t "Hello World" ra màn hình.

Chú ý r ng dòng này k t thúc b ng d u ch m ph y ( ; ). Kí t này ñư c dùng ñ k t thúc
m t l nh và b t bu c ph i có sau m i l nh trong chương trình C++ c a b n (m t trong
nh ng l i ph bi n nh t c a nh ng l p trình viên C++ là quên m t d u ch m ph y).

return 0;
L nh return k t thúc hàm main và tr v mã ñi sau nó, trong trư ng h p này là 0. ðây là
m t k t thúc bình thư ng c a m t chương trình không có m t l i nào trong quá trình th c
hi n. Như b n s th y trong các ví d ti p theo, ñây là m t cách ph bi n nh t ñ k t thúc
m t chương trình C++.

Chương trình ñư c c u trúc thành nh ng dòng khác nhau ñ nó tr nên d ñ c hơn nhưng
hoàn toàn không ph i b t bu c ph i làm v y. Ví d , thay vì vi t

       int main ()
       {
         cout << " Hello World ";
         return 0;
       }
ta có th vi t

       int main () { cout << " Hello World "; return 0; }

cũng cho m t k t qu chính xác như nhau.

Trong C++, các dòng l nh ñư c phân cách b ng d u ch m ph y ( ;). Vi c chia chương
trình thành các dòng ch nh m ñ cho nó d ñ c hơn mà thôi.

Các chú thích.
Các chú thích ñư c các l p trình viên s d ng ñ ghi chú hay mô t trong các ph n c a
chương trình. Trong C++ có hai cách ñ chú thích

       // Chú thích theo dòng
       /* Chú thích theo kh i */

Chú thích theo dòng b t ñ u t c p d u x (//) cho ñ n cu i dòng. Chú thích theo kh i
b t ñ u b ng /* và k t thúc b ng */ và có th bao g m nhi u dòng. Chúng ta s thêm
các chú thích cho chương trình :
/* my second program in C++          Hello World! I'm a C++ program



                                       Trang 3
Updatesofts.com                                                         Ebooks Team



   with more comments */

#include <iostream.h>

int main ()
{
  cout << "Hello World! ";
// says Hello World!
  cout << "I'm a C++
program"; // says I'm a C++
program
  return 0;
}


N u b n vi t các chú thích trong chương trình mà không s d ng các d u //, /* hay */,
trình d ch s coi chúng như là các l nh C++ và s hi n th các l i.




                                       Trang 4
Updatesofts.com                                                         Ebooks Team



Các bi n, ki u và h ng s
Identifiers
M t tên (indentifiers) h p l là m t chu i g m các ch cái, ch s ho c kí t g ch dư i.
Chi u dài c a m t tên là không gi i h n.

Kí t tr ng, các kí t ñánh d u ñ u không th có m t trong m t tên. Ch có ch cái, ch
s và kí t g ch dư i là ñư c cho phép. Thêm vào ñó, m t tên bi n luôn ph i b t ñ u
b ng m t ch cái. Chúng cũng có th b t ñ u b ng kí t g ch dư i ( _ ) nhưng kí t này
thư ng ñư c dành cho các liên k t bên ngoài (external link). Không bao gi chúng b t
ñ u b ng m t ch s .

M t lu t n a mà b n ph i quan tâm ñ n khi t o ra các tên c a riêng mình là chúng không
ñư c trùng v i b t kì t khoá nào c a ngôn ng hay c a trình d ch, ví d các tên sau ñây
luôn luôn ñư c coi là t khoá theo chu n ANSI-C++ và do v y chúng không th ñư c
dùng ñ ñ t tên

       asm, car, bool, break, marry, catch, to char, class, const,
       const_cast, continue, default, delete, do, double,
       dynamic_cast, else, enum, explicit, extern, false, float,
       for, friend, goto, if, inline, int, long, mutable,
       namespace, new, operator, private, protected, public, to
       register, reinterpret_cast, return, short, signed, sizeof,
       static, static_cast, struct, switch, template, this, throw,
       true, try, typedef, typeid, typename, union, unsigned,
       using, virtual, void, volatile, wchar_t

Thêm vào ñó, m t s bi u di n khác c a các toán t (operator) cũng không ñư c dùng
làm tên vì chúng là nh ng t ñư c dành riêng trong m t s trư ng h p.

       and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq,
       xor, xor_eq

Trình d ch c a b n có th thêm m t t dành riêng ñ c trưng khác. Ví d , r t nhi u trình
d ch 16 bit (như các trình d ch cho DOS) còn có th các t khoá far, huge và near.

Chú ý: Ngôn ng C++ là "case sensitive" có nghĩa là phân bi t ch hoa ch thư ng. Do
v y bi n RESULT khác v i result cũng như Result.

Các ki u d li u
Khi l p trình, chúng ta lưu tr các bi n trong b nh c a máy tính nhưng máy tính ph i
bi t chúng ta mu n lưu tr gì trong chúng vì các ki u d li u khác nhau s c n lư ng b
nh khác nhau.



                                       Trang 5
 Updatesofts.com                                                              Ebooks Team


 B nh c a máy tính chúng ta ñư c t ch c thành các byte. M t byte là lư ng b nh
 nh nh t mà chúng ta có th qu n lí. M t byte có th dùng ñ lưu tr m t lo i d li u nh
 như là ki u s nguyên t 0 ñ n 255 hay m t kí t . Nhưng máy tính có th x lý các ki u
 d li u ph c t p hơn b ng cách g p nhi u byte l i v i nhau, như s nguyên dài hay s
 th p phân. Ti p theo b n s có m t danh sách các ki u d li u cơ b n trong C++ cũng
 như mi n giá tr mà chúng có th bi u di n

        S
Tên            Mô t                                           Mi n giá tr
        byte
                                                              có d u: -128 to 127
char    1      Kí t hay ki u s nguyên 8-bit
                                                              không d u: 0 to 255
                                                              có d u: -32763 to 32762
short   2      ki u s nguyên 16-bit
                                                              không d u: 0 to 65535
                                                              có d u:-2147483648 to
long    4      ki u s nguyên 32-bit                           2147483647
                                                              không d u: 0 to 4294967295
               S nguyên. ð dài c a nó ph thu c vào h
int     *      th ng, như trong MS-DOS nó là 16-bit, trên     Xem short, long
               Windows 9x/2000/NT là 32 bit...
float   4      D ng d u ph y ñ ng                             3.4e + / - 38 (7 digits)
               D ng d u ph y ñ ng v i ñ chính xác g p
double 8                                                      1.7e + / - 308 (15 digits)
               ñôi
long           D ng d u ph y ñ ng v i ñ chính xác hơn
       10                                                     1.2e + / - 4932 (19 digits)
double         n a
               Giá tr logic. Nó m i ñư c thêm vào chu n
bool    1      ANSI-C++. B i v y không ph i t t c các         true   ho c false
               trình d ch ñ u h tr nó.

 Ngoài các ki u d li u cơ b n nói trên còn t n t i các con tr và các tham s không ki u
 (void) mà chúng ta s xem xét sau.

 Khai báo m t bi n
 ð có th s d ng m t bi n trong C++, ñ u tiên chúng ta ph i khai báo nó, ghi rõ nó là
 ki u d li u nào. Chúng ta ch c n vi t tên ki u (như int, short, float...) ti p theo sau ñó
 là m t tên bi n h p l . Ví d

        int a;
        float mynumber;

 Dòng ñ u tiên khai báo m t bi n ki u int v i tên là a. Dòng th hai khai báo m t bi n
 ki u float v i tên mynumber. Sau khi ñư c khai báo, các bi n trên có th ñư c dùng
 trong ph m vi c a chúng trong chương trình.



                                          Trang 6
Updatesofts.com                                                        Ebooks Team


N u b n mu n khai báo m t vài bi n có cùng m t ki u và b n mu n ti t ki m công s c
vi t b n có th khai báo chúng trên m t dòng, ngăn cách các tên b ng d u ph y. Ví d

       int a, b, c;

khai báo ba bi n ki u int (a,b và c) và hoàn toàn tương ñương v i :

       int a;
       int b;
       int c;

Các ki u s nguyên (char, short, long and int) có th là s có d u hay không d u tuỳ
theo mi n giá tr mà chúng ta c n bi u di n. Vì v y khi xác ñ nh m t ki u s nguyên
chúng ta ñ t t khoá signed ho c unsigned trư c tên ki u d li u. Ví d :

       unsigned short NumberOfSons;
       signed int MyAccountBalance;

N u ta không ch rõ signed or unsigned nó s ñư c coi là có d u, vì v y trong khai báo
th hai chúng ta có th vi t :

       int MyAccountBalance

cũng hoàn toàn tương ñương v i dòng khai báo trên. Trong th c t , r t ít khi ngư i ta
dùng ñ n t khoá signed. Ngo i l duy nh t c a lu t này ki u char. Trong chu n ANSI-
C++ nó là ki u d li u khác v i signed char và unsigned char.

ð có th th y rõ hơn vi c khai báo trong chương trình, chúng ta s xem xét m t ño n mã
C++ ví d như sau:

// operating with variables                  4

#include <iostream.h>

int main ()
{
  // declaring variables:
  int a, b;
  int result;

  // process:
  a = 5;
  b = 2;
  a = a + 1;
  result = a - b;

  // print out the result:
  cout << result;

  // terminate the program:




                                        Trang 7
Updatesofts.com                                                          Ebooks Team



    return 0;
}


ð ng lo l ng n u như vi c khai báo có v hơi l lùng v i b n. B n s th y ph n chi ti t
còn l i trong ph n ti p theo

Kh i t o các bi n
Khi khai báo m t bi n, giá tr c a nó m c nhiên là không xác ñ nh. Nhưng có th b n s
mu n nó mang m t giá tr xác ñ nh khi ñư c khai báo. ð làm ñi u ñó, b n ch c n vi t
d u b ng và giá tr b n mu n bi n ñó s mang:

        type identifier = initial_value ;

Ví d , n u chúng ta mu n khai báo m t bi n int là a ch a giá tr 0 ngay t khi kh i t o,
chúng ta s vi t :

        int a = 0;

B xung vào cách kh i t o ki u C này, C++ còn có thêm m t cách m i ñ kh i t o bi n
b ng cách b c m t c p ngo c ñơn sau giá tr kh i t o. Ví d :

        int a (0);

C hai cách ñ u h p l trong C++.

Ph m vi ho t ñ ng c a các bi n
T t c các bi n mà chúng ta s s d ng ñ u ph i ñư c khai báo trư c. M t ñi m khác bi t
gi a Cvà C++ là trong C++ chúng ta có th khai báo bi n b t kì nơi nào trong chương
trình, th m chí là ngay gi a các l nh th c hi n ch không ch là ñ u kh i l nh như
trong C.

M c dù v y chúng ta v n nên theo cách c a ngôn ng C khi khai báo các bi n b i vì nó
s r t h u d ng khi c n s a ch a m t chương trình có t t c các ph n khai báo ñư c g p
l i v i nhau. B i v y, cách thông d ng nh t ñ khai báo bi n là ñ t nó trong ph n b t ñ u
c a m i hàm (bi n c c b ) hay tr c ti p trong thân chương trình, ngoài t t c các hàm
(bi n toàn c c).

Global variables (bi n toàn c c) có th ñư c s d ng     b t kì ñâu trong chương trình,
ngay sau khi nó ñư c khai báo.

T m ho t ñ ng c a local variables (bi n c c b ) b gi i h n trong ph n mã mà nó ñư c
khai báo. N u chúng ñư c khai báo ñ u m t hàm (như hàm main), t m ho t ñ ng s là
toàn b hàm main. ði u ñó có nghĩa là trong ví d trên, các bi n ñư c khai báo trong


                                       Trang 8
Updatesofts.com                                                          Ebooks Team


hàm main() ch có th ñư c dùng trong hàm ñó, không ñư c dùng        b t kì ñâu khác.

Thêm vào các bi n toàn c c và c c b , còn có các bi n ngoài (external). Các bi n này
không nh ng ñư c dùng trong m t file mã ngu n mà còn trong t t c các file ñư c liên
k t trong chương trình.

Trong C++ t m ho t ñ ng c a m t bi n chính là kh i l nh mà nó ñư c khai báo (m t
kh i l nh là m t t p h p các l nh ñư c g p l i trong m t b ng các ngo c nh n { } ). N u
nó ñư c khai báo trong m t hàm t m ho t ñ ng s là hàm ñó, còn n u ñư c khai báo
trong vòng l p thì t m ho t ñ ng s ch là vòng l p ñó....

Các h ng s
M t h ng s là b t kì m t bi u th c nào mang m t giá tr c ñ nh, như:

Các s nguyên

       1776
       707
       -273

chúng là các h ng mang giá tr s . Chú ý r ng khi bi u di n m t h ng ki u s chúng ta
không c n vi t d u ngo c kép hay b t kì d u hi u nào khác.

Thêm vào nh ng s      h cơ s 10 ( cái mà t t c chúng ta ñ u ñã bi t) C++ còn cho phép
s d ng các h ng s cơ s 8 và 16. ð bi u di n m t s h cơ s 8 chúng ta ñ t trư c nó
kí t 0, ñ bi u di n s   h cơ s 16 chúng ta ñ t trư c nó hai kí t 0x. Ví d :

       75     // Cơ s 10
       0113     // cơ s 8
       0x4b     // cơ s 16

Các s th p phân (d ng d u ph y ñ ng)
Chúng bi u di n các s v i ph n th p phân và/ho c s mũ. Chúng có th bao g m ph n
th p phân, kí t e (bi u di n 10 mũ...).

       3.14159 // 3.14159
       6.02e23 // 6.02 x 1023
       1.6e-19 // 1.6 x 10-19
       3.0    // 3.0

Kí t và xâu kí t
Trong C++ còn t n t i các h ng không ph i ki u s như:

       'z'
       'p'
       "Hello world"
       "How do you do?"



                                       Trang 9
Updatesofts.com                                                          Ebooks Team


Hai bi u th c ñ u tiên bi u di n các kí t ñơn, các kí t ñư c ñ t trong d u nháy ñơn ('),
hai bi u th c ti p theo bi u th c các xâu kí t ñư c ñ t trong d u nháy kép (").

Khi vi t các kí t ñơn hay các xâu kí t c n ph i ñ chúng trong các d u nháy ñ phân
bi t v i các tên bi n hay các t khoá. Chú ý:

         x
         'x'

x tr ñ n bi n x trong khi 'x' là kí t h ng 'x'.

Các kí t ñơn và các xâu kí t có m t tính ch t riêng bi t là các mã ñi u khi n. Chúng là
nh ng kí t ñ c bi t mà không th ñư c vi t b t kì ñâu khác trong chương trình như là
mã xu ng dòng (\n) hay tab (\t). T t c ñ u b t ñ u b ng d u x ngư c (\). Sau ñây là
danh sách các mã ñi u khi n ñó:

          \n    xu ng dòng
          \r    lùi v ñ u dòng
          \t    kí t tab
          \v    căn th ng theo chi u d c
          \b    backspace
          \f    sang trang
          \a    Kêu bíp
          \'    d u nháy ñơn
          \"    d u nháy kép
           \    d uh i
          \\    kí t x ngư c

Ví d :

         '\n'
         '\t'
         "Left \t Right"
         "one\ntwo\nthree"

Thêm vào ñó, ñ bi u di n m t mã ASCII b n c n s d ng kí t x ngư c (\) ti p theo
ñó là mã ASCII vi t trong h cơ s 8 hay cơ s 16. Trong trư ng h p ñ u mã ASCII ñư c
vi t ngay sau d u s ngư c, trong trư ng h p th hai, ñ s d ng s trong h cơ s 16
b n c n vi t kí t x trư c s ñó (ví d \x20 hay \x4A).

Các h ng chu i kí t có th ñư c vi t trên nhi u dòng n u m i dòng ñư c k t thúc b ng
m t d u s ngư c (\):




                                         Trang 10
Updatesofts.com                                                        Ebooks Team


         "string expressed in \
         two lines"

B n có th n i m t vài h ng xâu kí t ngăn cách b ng m t hay vài d u tr ng, kí t tab,
xu ng dòng hay b t kì kí t tr ng nào khác.

         "we form" "a unique" "string" "of characters"


ð nh nghĩa các h ng (#define)
B n có th ñ nh nghĩa các h ng v i tên mà b n mu n ñ có th s d ng thư ng xuyên mà
không m t tài nguyên cho các bi n b ng cách s d ng ch th #define. ðây là d ng c a
nó:

         #define identifier value

Ví d :

         #define PI 3.14159265
         #define NEWLINE '\n'
         #define WIDTH 100

chúng ñ nh nghĩa ba h ng s m i. Sau khi khai báo b n có th s d ng chúng như b t kì
các h ng s nào khác, ví d

         circle = 2 * PI * r;
         cout << NEWLINE;

Trong th c t vi c duy nh t mà trình d ch làm khi nó tìm th y m t ch th #define là
thay th các tên h ng t i b t kì ch nào chúng xu t hi n (như trong ví d trư c, PI,
NEWLINE hay WIDTH) b ng giá tr mà chúng ñư c ñ nh nghĩa. Vì v y các h ng s #define
ñư c coi là các h ng s macro

Ch th #define không ph i là m t l nh th c thi, nó là ch th ti n x lý (preprocessor),
ñó là lý do trình d ch coi c dòng là m t ch th và dòng ñó không c n k t thúc b ng d u
ch m ph y. N u b n thêm d u ch m ph y vào cu i dòng, nó s ñư c coi là m t ph n c a
giá tr ñ nh nghĩa h ng.

Khai báo các h ng (const)
V i ti n t const b n có th khai báo các h ng v i m t ki u xác ñ nh như là b n làm v i
m t bi n

         const int width = 100;
         const to char tab = '\t';
         const zip = 12440;




                                               Trang 11
Updatesofts.com                                                        Ebooks Team


Trong trư ng h p ki u không ñư c ch rõ (như trong ví d cu i) trình d ch s coi nó là
ki u int




                                      Trang 12
Updatesofts.com                                                         Ebooks Team



Các toán t
Qua bài trư c chúng ta ñã bi t ñ n s t n t i c a các bi n và các h ng. Trong C++, ñ
thao tác v i chúng ta s d ng các toán t , ñó là các t khoá và các d u không có trong
b ng ch cái nhưng l i có trên h u h t các bàn phím trên th gi i. Hi u bi t v chúng là
r t quan tr ng vì ñây là m t trong nh ng thành ph n cơ b n c a ngôn ng C++.

Toán t     gán (=).
         Toán t gán dùng ñ gán m t giá tr nào ñó cho m t bi n

                a = 5;

         gán giá tr nguyên 5 cho bi n a. V trái b t bu c ph i là m t bi n còn v ph i
         có th là b t kì h ng, bi n hay k t qu c a m t bi u th c.

         C n ph i nh n m nh r ng toán t gán luôn ñư c th c hi n t trái sang ph i
         và không bao gi ñ o ngư c

                a = b;

         gán giá tr c a bi n a b ng giá tr ñang ch a trong bi n b. Chú ý r ng
         chúng ta ch gán giá tr c a b cho a và s thay ñ i c a b sau ñó s
         không nh hư ng ñ n giá tr c a a.

         M t thu c tính c a toán t gán trong C++ góp ph n giúp nó vư t lên các
         ngôn ng l p trình khác là vi c cho phép v ph i có th ch a các phép gán
         khác. Ví d :

                a = 2 + (b = 5);

         tương ñương v i

                b = 5;
                a = 2 + b;

         Vì v y bi u th c sau cũng h p l trong C++

                a = b = c = 5;

         gán giá tr 5 cho c ba bi n a, b và c

Các toán t s h c ( +, -, *, /, % )
      Năm toán t s h c ñư c h tr b i ngôn ng           là:

                + c ng
                - tr
                * nhân
                / chia


                                       Trang 13
Updatesofts.com                                                         Ebooks Team


             % l y ph n dư (trong phép chia)

      Th t th c hi n các toán t này cũng gi ng như chúng ñư c th c hi n trong toán
      h c. ði u duy nh t có v hơi l ñ i v i b n là phép l y ph n dư, ký hi u b ng d u
      ph n trăm (%). ðây chính là phép toán l y ph n dư trong phép chia hai s nguyên
      v i nhau. Ví d , n u a = 11 % 3;, bi n a s mang giá tr 2 vì 11 = 3*3 +2.

Các toán t gán ph c h p (+=, -=, *=,        /=, %=, >>=, <<=, &=, ^=, |=)
      M t ñ c tính c a ngôn ng C++ làm      cho nó n i ti ng là m t ngôn ng súc
      tích chính là các toán t gán ph c h   p cho phép ch nh s a giá tr c a m t
      bi n v i m t trong nh ng toán t cơ    b n sau:

             value += increase; tương ñương v i value = value + increase;
             a -= 5; tương ñương v i a = a - 5;
             a /= b; tương ñương v i a = a / b;
             price *= units + 1; tương ñương v i price = price *
             (units + 1);

      và tương t cho t t c các toán t khác.
Tăng và gi m.
      M t ví d khác c a vi c ti t ki m khi vi t mã l nh là toán t tăng (++) và
      gi m (--). Chúng tăng ho c gi m giá tr ch a trong m t bi n ñi 1. Chúng
      tương ñương v i +=1 ho c -=1. Vì v y, các dòng sau là tương ñương:

             a++;
             a+=1;
             a=a+1;

      M t tính ch t c a toán t này là nó có th là ti n t ho c h u t , có nghĩa là có th
      vi t trư c tên bi n (++a) ho c sau (a++) và m c dù trong hai bi u th c r t ñơn
      gi n ñó nó có cùng ý nghĩa nhưng trong các thao tác khác khi mà k t qu c a vi c
      tăng hay gi m ñư c s d ng trong m t bi u th c thì chúng có th có m t khác
      bi t quan tr ng v ý nghĩa: Trong trư ng h p toán t ñư c s d ng như là m t
      ti n t (++a) giá tr ñư c tăng trư c khi bi u th c ñư c tính và giá tr ñã tăng
      ñư c s d ng trong bi u th c; trong trư ng h p ngư c l i (a++) giá tr trong bi n
      a ñư c tăng sau khi ñã tính toán. Hãy chú ý s khác bi t :

                   Ví d   1               Ví d   2
             B=3;              B=3;
             A=++B;            A=B++;
             // A is 4, B is 4 // A is 3, B is 4

Các toán t quan h ( ==, !=, >, <, >=, <= )
      ð có th so sánh hai bi u th c v i nhau chúng ta có th s d ng các toán t
      quan h . Theo chu n ANSI-C++ thì giá tr c a thao tác quan h ch có th là
      giá tr logic - chúng ch có th có giá tr true ho c false, tuỳ theo bi u th c
      k t qu là ñúng hay sai.




                                     Trang 14
Updatesofts.com                                                            Ebooks Team


       Sau ñây là các toán t   quan h b n có th s     d ng trong C++
             == B ng
                != Khác
                > L n hơn
                <   Nh hơn
                > = L n hơn ho c b ng
                < = Nh hơn ho c b ng


       Ví d :

       (7 == 5) s tr giá tr false
       (6 >= 6) s tr giá tr true
       t t nhiên thay vì s d ng các s , chúng ta có th s      d ng b t c    bi u
       th c nào. Cho a=2, b=3 và c=6
       (a*b >= c) s tr giá tr true.
       (b+4 < a*c) s tr giá tr false

       C n chú ý r ng = (m t d u b ng) lf hoàn toàn khác v i == (hai d u b ng).
       D u ñ u tiên là m t toán t gán ( gán giá tr c a bi u th c bên ph i cho bi n
         bên trái) và d u còn l i (==) là m t toán t quan h nh m so sánh xem hai
       bi u th c có b ng nhau hay không.

Trong nhi u trình d ch có trư c chu n ANSI-C++ cũng như trong ngôn ng C,
các toán t quan h không tr v giá tr logic true ho c false mà tr v giá tr
int v i 0 tương ng v i false còn giá tr khác 0 (thư ng là 1) thì tương ng v i
true.
Các toán t logic ( !, &&, || ).
        Toán t ! tương ñương v i toán t logic NOT, nó ch có m t ñ i s       phía bên
        ph i và vi c duy nh t mà nó làm là ñ i ngư c giá tr c a ñ i s t true sang
        false ho c ngư c l i. Ví d :
               !(5 == 5) tr v false vì bi u th c bên ph i (5 == 5) có giá tr true.
                !(6 <= 4) tr v true vì (6 <= 4)có giá tr false.
                !true    tr v false.
                !false   tr v true.
       Toán t logic && và || ñư c s d ng khi tính toán hai bi u th c ñ l y ra m t
       k t qu duy nh t. Chúng tương ng v i các toán t logic AND và OR. K t qu
       c a chúng ph thu c vào m i quan h c a hai ñ i s :
                ð i s th   nh t ð i s th   hai K t qu K t qu
                      a               b        a && b a || b
                true            true          true     true
                true            false         false    true
                false           true          false    true
                false           false         false    false
       Ví d :




                                        Trang 15
Updatesofts.com                                                       Ebooks Team


               ( (5 == 5) && (3 > 6) ) tr v false ( true && false ).
               ( (5 == 5) || (3 > 6)) tr v true ( true || false ).

Toán t     ñi u ki n ( ? ).
         Toán t ñi u ki n tính toán m t bi u th c và tr v m t giá tr khác tuỳ thu c
         vào bi u th c ñó là ñúng hay sai. C u trúc c a nó như sau:

               condition ? result1 : result2

         N u condition là true thì giá tr tr v s là result1, n u không giá tr tr
         v là result2.
               7==5 ? 4 : 3 tr v 3 vì 7 không b ng 5.
               7==5+2 ? 4 : 3 tr v 4 vì 7 b ng 5+2.
               5>3 ? a : b    tr v a, vì 5 l n hơn 3.
               a>b ? a : b     tr v giá tr l n hơn, a ho c b.

Các toán t thao tác bit ( &, |, ^, ~, <<, >> ).
      Các toán t thao tác bit thay ñ i các bit bi u di n m t bi n, có nghĩa là thay
      ñ i bi u di n nh phân c a chúng
               toán t    asm Mô t
               &         AND Logical AND
               |         OR      Logical OR
               ^         XOR Logical exclusive OR
               ~         NOT ð o ngư c bit
               <<        SHL D ch bit sang trái
               >>        SHR D ch bit sang ph i

Các toán t chuy n ñ i ki u
      Các toán t chuy n ñ i ki u cho phép b n chuy n ñ i d li u t ki u này sang
      ki u khác. Có vài cách ñ làm vi c này trong C++, cách cơ b n nh t ñư c
      th a k t ngôn ng C là ñ t trư c bi u th c c n chuy n ñ i tên ki u d li u
      ñư c b c trong c p ngo c ñơn (), ví d :

               int i;
               float f = 3.14;
               i = (int) f;

         ðo n mã trên chuy n s th p phân 3.14 sang m t s nguyên (3).        ñây, toán
         t chuy n ñ i ki u là (int). M t cách khác ñ làm ñi u này trong C++ là s
         d ng các constructors ( m t s sách thu t ng này ñư c d ch là c u t
         nhưng tôi th y nó có v không xuôi tai l m) thay vì dùng các toán t : ñ t
         trư c bi u th c c n chuy n ñ i ki u tên ki u m i và bao b c bi u th c gi a
         m t c p ngo c ñơn.

               i = int ( f );




                                               Trang 16
Updatesofts.com                                                           Ebooks Team


      C hai cách chuy n ñ i ki u ñ u h p l trong C++. Thêm vào ñó ANSI-C++
      còn có nh ng toán t chuy n ñ i ki u m i ñ c trưng cho l p trình hư ng ñ i
      tư ng.

sizeof()
       Toán t này có m t tham s , ñó có th là m t ki u d         li u hay là m t bi n và
       tr v kích c b ng byte c a ki u hay ñ i tư ng ñó.

             a = sizeof (char);

      a s mang giá tr 1 vì ki u char luôn có kích c 1 byte trên m i h th ng. Giá
      tr tr v c a sizeof là m t h ng s vì v y nó luôn luôn ñư c tính trư c khi
      chương trình th c hi n.

Các toán t khác
      Trong C++ còn có m t s các toán t khác, như các toán t liên quan ñ n con
      tr hay l p trình hư ng ñ i tư ng. Chúng s ñư c nói ñ n c th trong các
      ph n tương ng.


Th t ưu tiên c a các toán t
Khi vi t các bi u th c ph c t p v i nhi u toán h ng các b n có th t h i toán h ng
nào ñư c tính trư c, toán h ng nào ñư c tính sau. Ví d như trong bi u th c sau:

      a = 5 + 7 % 2

có th có hai cách hi u sau:

      a = 5 + (7 % 2)         v i k t qu là 6, ho c
      a = (5 + 7) % 2         v i k t qu là 0

Câu tr l i ñúng là bi u th c ñ u tiên. Vì nguyên nhân nói trên, ngôn ng C++ ñã
thi t l p m t th t ưu tiên gi a các toán t , không ch riêng các toán t s h c mà
t t c các toán t có th xu t hi n trong C++. Th t ưu tiên c a chúng ñư c li t kê
trong b ng sau theo th t t cao xu ng th p.

      Th
              Toán t                    Mô t              Associativity
      t
      1       ::                        scope             Trái
      2       () [ ] -> . sizeof                          Trái
              ++ --                     tăng/gi m
              ~                         ð o ngư c bit
              !                         NOT
      3                                                   Ph i
              &*                        Toán t   con tr
              (type)                    Chuy n ñ i ki u
              +-                        Dương ho c âm
      4       */%                       Toán t   s h c    Trái



                                          Trang 17
Updatesofts.com                                                         Ebooks Team


       5      +-                     Toán t     s h c      Trái
       6      << >>                  D ch bit              Trái
       7      < <= > >=              Toán t     quan h     Trái
       8      == !=                  Toán t     quan h     Trái
                                     Toán t     thao tác
       9      &^|                                          Trái
                                     bit
       10     && ||                  Toán t     logic      Trái
       11     ?:                     Toán t     ñi u ki n Ph i
              = += -= *= /= %=
       12     >>= <<= &= ^= |=       Toán t     gán        Ph i

       13     ,                      D u ph y              Trái


Associativity ñ nh nghĩa trong trư ng h p có m t vài toán t có cùng th t ưu tiên thì cái
nào s ñư c tính trư c, toán t     phía xa nh t bên ph i hay là xa nh t bên trái.

N u b n mu n vi t m t bi u th c ph c t p mà l i không ch c l m v th t ưu tiên c a
các toán t thì nên s d ng các ngo c ñơn. Các b n nên th c hi n ñi u này vì nó s giúp
chương trình d ñ c hơn.




                                      Trang 18
Updatesofts.com                                                                   Ebooks Team



Giao ti p v i console.
Console là giao di n cơ b n c a máy tính. Bàn phím là thi t b vào cơ b n còn màn hình
là thi t b ra cơ b n.

Trong thư vi n iostream c a C++, các thao tác vào ra cơ b n c a m t chương trình ñư c
h tr b i hai dòng d li u : cin ñ nh p d li u và cout ñ xu t. Thêm vào ñó, còn có
cerr và clog là hai dòng d li u dùng ñ hi n th các thông báo l i trên thi t b ra chu n
(thư ng là màn hình) ho c ra m t file. Thông thư ng cout ñư c gán v i màn hình còn
cin ñư c gán v i bàn phím.

S d ng hai dòng d li u này b n s có th giao ti p v i ngư i s d ng vì b n có th hi n
th các thông báo lên màn hình cũng như nh n d li u t bàn phím.

Xu t d li u (cout)
Dòng cout ñư c s d ng v i toán t ñã quá t i << (overloaded - b n s hi u rõ hơn v
thu t ng này trong ph n l p trình hư ng ñ i tư ng)
       cout << "Output sentence"; // Hi n th Output sentence lên màn hình
       cout << 120;          // Hi n th s 120 lên màn hình
       cout << x;          // Hi n th n i dung bi n x lên màn hình
Toán t << ñư c g i là toán t chèn vì nó chèn d li u ñi sau nó vào dòng d li u ñ ng
trư c. Trong ví d trên nó chèn chu i "Output sentence", h ng s 120 và bi n x vào
dòng d li u ra cout.Chú ý r ng dòng ñ u tiên chúng ta s d ng d u ngo c kép vì ñó là
m t chu i kí t . Khi chúng ta mu n s d ng các h ng xâu kí t ta ph i ñ t chúng trong
c p d u ngo c kép ñ chúng có th ñư c phân bi t v i các bi n. Ví d , hai l nh sau ñây là
hoàn toàn khác nhau:
       cout << "Hello";     // Hi n th Hello lên màn hình
       cout << Hello;      // Hi n th n i dung c a bi n Hello lên màn hình
Toán t chèn (<<) có th ñư c s d ng nhi u l n trong m t câu l nh:
       cout << "Hello, " << "I am " << "a C++ sentence";
Câu l nh trên s in thông báo Hello, I am a C++ sentence      lên màn hình. S ti n l i
c a vi c s d ng l p l i toán t chèn (<<) th hi n rõ khi chúng ta mu n hi n th nhi u
bi n và h ng hơn là ch m t bi n:
      cout << "Hello, I am " << age << " years old and my email address is " << email_add;
C n ph i nh n m nh r ng cout không nh y xu ng dòng sau khi xu t d li u, vì v                 y hai
câu l nh sau :

       cout << "This is a sentence.";
       cout << "This is another sentence.";

s ñư c hi n th trên màn hình:

       This is a sentence.This is another sentence.

B i v y khi mu n xu ng dòng chúng ta ph i s d ng kí t xu ng dòng, trong C++ là \n:



                                              Trang 19
Updatesofts.com                                                       Ebooks Team


       cout << "First sentence.\n ";
       cout << "Second sentence.\nThird sentence.";

s vi t ra màn hình như sau:

       First sentence.
       Second sentence.
       Third sentence.

Thêm vào ñó, ñ xu ng dòng b n có th s d ng tham s endl. Ví d

       cout << "First sentence." << endl;
       cout << "Second sentence." << endl;

s in ra màn hình:

       First sentence.
       Second sentence.

Tham s endl có m t tác d ng ñ c bi t khi nó ñư c dùng v i các dòng d li u s d ng
b ñ m: các b ñ m s ñư c flushed ( chuy n toàn b thông tin t b ñ m ra dòng d
li u). Tuy nhiên, theo m c ñ nh cout không s d ng b ñ m.

Nh p d li u (cin).
Thao tác vào chu n trong C++ ñư c th c hi n b ng cách s d ng toán t ñã quá t i >>
v i dòng cin. Theo sau toán t này là bi n s lưu tr d li u ñư c ñ c vào. Ví d :

       int age;
       cin >> age;

khai báo bi n age có ki u int và ñ i nh p d li u t cin (bàn phím) ñ lưu tr nó trong
bi n ki u nguyên này.

cin ch b t ñ u s lý d li u nh p t bàn phím sau khi phím Enter ñư c gõ. Vì v y dù
b n ch nh p m t kí t thì cin v n s kiên nh n ch cho ñ n khi b n gõ phím Enter.

// i/o example                             Please enter an integer value: 702
#include <iostream.h>                      The value you entered is 702 and
                                           its double is 1404.
int main ()
{
  int i;
  cout << "Please enter an integer
value: ";
  cin >> i;
  cout << "The value you entered is
" << i;
  cout << " and its double is " <<



                                     Trang 20
Updatesofts.com                                                        Ebooks Team



i*2 << ".\n";
  return 0;
}


Ngư i s d ng chương trình có th là m t trong nh ng nguyên nhân gây ra l i trong m t
chương trình ñơn gi n s d ng cin (như chương trình trên). Trong khi b n mu n nh n
m t s nguyên thì ngư i s d ng l i nh p vào tên c a h (là m t xâu kí t ). K t qu là
chương trình s ch y sai vì ñó không ph i là nh ng gì mà chương trình mong ñ i t
ngư i dùng. B i v y khi b n s d ng d li u nh p vào t cin b n ph i tin ch c r ng
ngư i dùng s hoàn toàn h p tác và r ng anh ta s không nh p tên c a mình khi chương
trình yêu c u nh p s nguyên. Sau này, khi nghiên c u vi c s d ng các xâu kí t chúng
ta s xem xét các gi i pháp kh thi ñ gi i quy t các l i lo i này.

B n có th dùng cin ñ nh p m t lúc nhi u d li u t ngư i dùng:

       cin >> a >> b;

tương ñương v i

       cin >> a;
       cin >> b;

Trong c hai trư ng h p ngư i s d ng ph i cung c p hai d li u, m t cho bi n a và m t
cho bi n b và ñư c ngăn cách b i m t d u tr ng h p l : m t d u cách, d u tab hay kí t
xu ng dòng.

Trong trư ng h p ki u không ñư c ch rõ (như trong ví d cu i) trình d ch s coi nó là
ki u int.




                                      Trang 21
Updatesofts.com                                                           Ebooks Team



Các c u trúc ñi u khi n.
M t chương trình thư ng không ch bao g m các l nh tu n t n i ti p nhau. Trong quá
trình ch y nó có th r nhánh hay l p l i m t ño n mã nào ñó. ð làm ñi u này chúng ta
s d ng các c u trúc ñi u khi n.

Cùng v i vi c gi i thi u các c u trúc ñi u khi n chúng ta cũng s ph i bi t t i m t khái
ni m m i: kh i l nh, ñó là m t nhóm các l nh ñư c ngăn cách b i d u ch m ph y (;)
nhưng ñư c g p trong m t kh i gi i h n b i m t c p ngo c nh n: { và }.

H u h t các c u trúc ñi u khi n mà chúng ta s xem xét trong chương này cho phép s
d ng m t l nh ñơn hay m t kh i l nh làm tham s , tuỳ thu c vào chúng ta có ñ t nó
trong c p ngo c nh n hay không.

C u trúc ñi u ki n: if và else
C u trúc này ñư c dùng khi m t l nh hay m t kh i l nh ch ñư c th c hi n khi m t ñi u
ki n nào ñó tho mãn. D ng c a nó như sau:

         if (condition) statement

trong ñó condition là bi u th c s ñư c tính toán. N u ñi u ki n ñó là true, statement
ñư c th c hi n. N u không statement b b qua (không th c hi n) và chương trình ti p
t c th c hi n l nh ti p sau c u trúc ñi u ki n.

Ví d , ño n mã sau ñây s vi t x is 100 ch khi bi n x ch a giá tr 100:

         if (x == 100)
           cout << "x is 100";

N u chúng ta mu n có hơn m t l nh ñư c th c hi n trong trư ng h p condition là true
chúng ta có th ch ñ nh m t kh i l nh b ng cách s d ng m t c p ngo c nh n { }:

         if (x == 100)
          {
           cout << "x is ";
           cout << x;
          }

Chúng ta cũng có th ch ñ nh ñi u gì s x y ra n u ñi u ki n không ñư c tho mãn b ng
cách s u d ng t khoá else. Nó ñư c s d ng cùng v i if như sau:

         if (condition) statement1 else statement2

Ví d :




                                       Trang 22
Updatesofts.com                                                          Ebooks Team


       if (x == 100)
         cout << "x is 100";
       else
         cout << "x is not 100";

C u trúc if + else có th ñư c móc n i ñ ki m tra nhi u giá tr . Ví d sau ñây s ki m tra
xem giá tr ch a trong bi n x là dương, âm hay b ng không.

       if (x > 0)
         cout << "x    is positive";
       else if (x <    0)
         cout << "x    is negative";
       else
         cout << "x    is 0";


Các c u trúc l p
M c ñích c a các vòng l p là l p l i m t thao tác v i m t s l n nh t ñ nh ho c trong khi
m t ñi u ki n nào ñó còn tho mãn.
Vòng l p while .
       D ng c a nó như sau:

              while (expression) statement

       và ch c năng c a nó ñơn gi n ch là l p l i statement khi ñi u ki n expression
       còn tho mãn.

       Ví d , chúng ta s vi t m t chương trình ñ m ngư c s d ng vào l p while:

    // custom countdown using while          Enter the starting number > 8
    #include <iostream.h>                    8, 7, 6, 5, 4, 3, 2, 1, FIRE!
    int main ()
    {
      int n;
      cout << "Enter the starting
    number > ";
      cin >> n;
      while (n>0) {
        cout << n << ", ";
        --n;
      }
      cout << "FIRE!";
      return 0;
    }


       Khi chương trình ch y ngư i s d ng ñư c yêu c u nh p vào m t s ñ ñ m
       ngư c. Sau ñó, khi vòng l p while b t ñ u n u s mà ngư i dùng nh p vào tho
       mãn ñi u ki n ñi u ki n n>0 kh i l nh s ñư c th c hi n m t s l n không xác
       ñ nh ch ng nào ñi u ki n (n>0) còn ñư c tho mãn.


                                       Trang 23
Updatesofts.com                                                        Ebooks Team


      Chúng ta c n ph i nh r ng vòng l p ph i k t thúc m t ñi m nào ñó, vì
      v y bên trong vòng l p chúng ta ph i cung c p m t phương th c nào ñó ñ
      bu c condition tr thành sai n u không thì nó s l p l i mãi mãi. Trong
      ví d trên vòng l p ph i có l nh --n; ñ làm cho condition tr thành sai
      sau m t s l n l p.
Vòng l p do-while
      D ng th c:

              do statement while (condition);

       Ch c năng c a nó là hoàn toàn gi ng vòng l p while ch tr có m t ñi u là ñi u
       ki n ñi u khi n vòng l p ñư c tính toán sau khi statement ñư c th c hi n, vì
       v y statement s ñư c th c hi n ít nh t m t l n ngay c khi condition không
       bao gi ñư c tho mãn. Ví d , chương trình dư i ñây s vi t ra b t kì s nào mà
       b n nh p vào cho ñ n khi b n nh p s 0.
    // number echoer                         Enter number   (0 to end): 12345
    #include <iostream.h>                    You entered:   12345
    int main ()                              Enter number   (0 to end): 160277
    {                                        You entered:   160277
      unsigned long n;                       Enter number   (0 to end): 0
      do {                                   You entered:   0
        cout << "Enter number (0 to
    end): ";
        cin >> n;
        cout << "You entered: " <<
    n << "\n";
      } while (n != 0);
      return 0;
    }


       Vòng l p do-while thư ng ñư c dùng khi ñi u ki n ñ k t thúc vòng l p n m
       trong vòng l p, như trong ví d trên, s mà ngư i dùng nh p vào là ñi u ki n
       ki m tra ñ k t thúc vòng l p. N u b n không nh p s 0 trong ví d trên thì vòng
       l p s không bao gi ch m d t.

Vòng l p for .
      D ng th c:

              for (initialization; condition; increase) statement;

       và ch c năng chính c a nó là l p l i statement ch ng nào condition còn mang
       giá tr ñúng, như trong vòng l p while. Nhưng thêm vào ñó, for cung c p ch
       dành cho l nh kh i t o và l nh tăng. Vì v y vòng l p này ñư c thi t k ñ c bi t
       l p l i m t hành ñ ng v i m t s l n xác ñ nh.

       Cách th c ho t ñ ng c a nó như sau:




                                     Trang 24
Updatesofts.com                                                           Ebooks Team


      1, initialization ñư c th c hi n. Nói chung nó ñ t m t giá khí ban ñ u
      cho bi n ñi u khi n. L nh này ñư c th c hi n ch m t l n.
      2, condition ñư c ki m tra, n u nó là ñúng vòng l p ti p t c còn n u
      không vòng l p k t thúc và statement ñư c b qua.
      3, statement ñư c th c hi n. Nó có th là m t l nh ñơn ho c là m t kh i
      l nh ñư c bao trong m t c p ngo c nh n.
      4, Cu i cùng, increase ñư c th c hi n ñ tăng bi n ñi u khi n và vòng
      l p quay tr l i bư c 2.

      Sau ñây là m t ví d ñ m ngư c s d ng vòng for.
    // countdown using a for loop                   10, 9, 8, 7, 6, 5, 4, 3, 2, 1,
    #include <iostream.h>                           FIRE!
    int main ()
    {
      for (int n=10; n>0; n--) {
        cout << n << ", ";
      }
      cout << "FIRE!";
      return 0;
    }


      Ph n kh i t o và l nh tăng không b t bu c ph i có. Chúng có th ñư c b qua
      nhưng v n ph i có d u ch m ph y ngăn cách gi a các ph n. Vì v y, chúng ta có
      th vi t for (;n<10;) ho c for (;n<10;n++).

      B ng cách s d ng d u ph y, chúng ta có th dùng nhi u l nh trong b t kì
      trư ng nào trong vòng for, như là trong ph n kh i t o. Ví d chúng ta có
      th kh i t o m t lúc nhi u bi n trong vòng l p:

             for ( n=0, i=100 ; n!=i ; n++, i-- )
             {
               // cái gì ñây cũng ñư c...
             }

      Vòng l p này s th c hi n 50 l n n u như n và i không b thay ñ i trong
      thân vòng l p:




Các l nh r nhánh và l nh nh y
L nh break.
      S d ng break chúng ta có th thoát kh i vòng l p ngay c khi ñi u ki n ñ nó k t
      thúc chưa ñư c tho mãn. L nh này có th ñư c dùng ñ k t thúc m t vòng l p



                                             Trang 25
Updatesofts.com                                                        Ebooks Team


       không xác ñ nh hay bu c nó ph i k t thúc gi a ch ng thay vì k t thúc m t cách
       bình thư ng. Ví d , chúng ta s d ng vi c ñ m ngư c trư c khi nó k t thúc:
    // break loop example                   10, 9, 8, 7, 6, 5, 4, countdown
    #include <iostream.h>                   aborted!
    int main ()
    {
      int n;
      for (n=10; n>0; n--) {
        cout << n << ", ";
        if (n==3)
        {
          cout << "countdown
    aborted!";
          break;
        }
      }
      return 0;
    }

L nh continue.
      L nh continue làm cho chương trình b qua ph n còn l i c a vòng l p và nh y
      sang l n l p ti p theo. Ví d chúng ta s b qua s 5 trong ph n ñ m ngư c:
    // break loop example                   10, 9, 8, 7, 6, 4, 3, 2, 1,
    #include <iostream.h>                   FIRE!
    int main ()
    {
      for (int n=10; n>0; n--) {
        if (n==5) continue;
        cout << n << ", ";
      }
      cout << "FIRE!";
      return 0;
    }

L nh goto.
      L nh này cho phép nh y vô ñi u ki n t i b t kì ñi m nào trong chương trình. Nói
      chung b n nên tránh dùng nó trong chương trình C++. Tuy nhiên chúng ta v n có
      m t ví d dùng l nh goto ñ ñ m ngư c:
    // goto loop example                    10, 9, 8, 7, 6, 5, 4, 3, 2, 1,
    #include <iostream.h>                   FIRE!
    int main ()
    {
      int n=10;
      loop: ;
      cout << n << ", ";
      n--;
      if (n>0) goto loop;
      cout << "FIRE!";
      return 0;
    }

Hàm exit.




                                      Trang 26
Updatesofts.com                                                         Ebooks Team


       M c ñích c a exit là k t thúc chương trình và tr v m t mã xác ñ nh. D ng th c
       c a nó như sau

              void exit (int exit code);

       exit code ñư c dùng b i m t s h ñi u hành ho c có th ñư c dùng b i các
       chương trình g i. Theo quy ư c, mã tr v 0 có nghĩa là chương trình k t thúc
       bình thư ng còn các giá tr khác 0 có nghĩa là có l i.

C u trúc l a ch n: switch.
Cú pháp c a l nh switch hơi ñ c bi t m t chút. M c ñích c a nó là ki m tra m t vài giá
tr h ng cho m t bi u th c, tương t v i nh ng gì chúng ta làm ñ u bài này khi liên k t
m t vài l nh if và else if v i nhau. D ng th c c a nó như sau:

       switch (expression) {
         case constant1:
           block of instructions 1
           break;
         case constant2:
           block of instructions 2
           break;
         .
         .
         .
         default:
           default block of instructions
         }

Nó ho t ñ ng theo cách sau: switch tính bi u th c và ki m tra xem nó có b ng
constant1   hay không, n u ñúng thì nó th c hi n block of instructions 1 cho ñ n
khi tìm th y t khoá break, sau ñó nh y ñ n ph n cu i c a c u trúc l a ch n switch.
Còn n u không, switch s ki m tra xem bi u th c có b ng constant2 hay không. N u
ñúng nó s th c hi n block of instructions 2 cho ñ n khi tìm th y t khoá break.
Cu i cùng, n u giá tr bi u th c không b ng b t kì h ng nào ñư c ch ñ nh trên (b n có
th ch ñ nh bao nhiêu câu l nh case tuỳ thích), chương trình s th c hi n các l nh trong
ph n default: n u nó t n t i vì ph n này không b t bu c ph i có.

Hai ño n mã sau là tương ñương:

                 ví d switch                         if-else tương ñương
    switch (x) {                            if (x == 1) {
      case 1:                                 cout << "x is 1";
        cout << "x is 1";                     }
        break;                              else if (x == 2) {
      case 2:                                 cout << "x is 2";
        cout << "x is 2";                     }
        break;                              else {



                                      Trang 27
Updatesofts.com                                                         Ebooks Team



      default:                                 cout << "value of x unknown";
        cout << "value of x                    }
    unknown";
      }


Tôi ñã nói trên r ng c u trúc c a l nh switch hơi ñ c bi t. Chú ý s t n t i c a l nh
break cu i m i kh i l nh. ði u này là c n thi t vì n u không thì sau khi th c hi n
block of instructions 1 chương trình s không nh y ñ n cu i c a l nh switch mà s
th c hi n các kh i l nh ti p theo cho ñ n khi nó tìm th y l nh break ñ u tiên. ði u này
khi n cho vi c ñ t c p ngo c nh n { } trong m i trư ng h p là không c n thi t và có th
ñư c dùng khi b n mu n th c hi n m t kh i l nh cho nhi u trư ng h p khác nhau, ví d :

       switch (x) {
         case 1:
         case 2:
         case 3:
           cout << "x is 1, 2 or 3";
           break;
         default:
           cout << "x is not 1, 2 nor 3";
         }
Chú ý r ng l nh switch ch có th ñư c dùng ñ so sánh m t bi u th c v i các h ng. Vì
v y chúng ta không th ñ t các bi n (case (n*2):) hay các kho ng (case (1..3):) vì
chúng không ph i là các h ng h p l .

N u b n c n ki m tra các kho ng hay nhi u giá tr không ph i là h ng s hãy k t h p các
l nh if và else if.




                                      Trang 28
Updatesofts.com                                                        Ebooks Team



Hàm (I)
Hàm là m t kh i l nh ñư c th c hi n khi nó ñư c g i t m t ñi m khác c a chương
trình. D ng th c c a nó như sau:

       type name ( argument1, argument2, ...) statement

trong ñó:
type là ki u d li u ñư c tr v c    a hàm
name là tên g i c a hàm.
arguments là các tham s (có nhi   u bao nhiêu cũng ñư c tuỳ theo nhu c u). M t tham s
bao g m tên ki u d li u sau ñó là tên c a tham s gi ng như khi khai báo bi n (ví d
int x) và ñóng vai trò bên trong hàm như b t kì bi n nào khác. Chúng dùng ñ truy n
tham s cho hàm khi nó ñư c g i. Các tham s khác nhau ñư c ngăn cách b i các d u
ph y.
statement là thân c a hàm. Nó có th là m t l nh ñơn hay m t kh i l nh.

Dư i ñây là ví d ñ u tiên v hàm:

// function example                         The result is 8
#include <iostream.h>

int addition (int a, int b)
{
  int r;
  r=a+b;
  return (r);
}

int main ()
{
  int z;
  z = addition (5,3);
  cout << "The result is " << z;
  return 0;
}


ð có th hi u ñư c ño n mã này, trư c h t hãy nh l i nh ng ñi u ñã nói bài ñ u tiên:
m t chương trình C++ luôn b t ñ u th c hi n t hàm main. Vì v y chúng ta b t ñ u t
ñây.

Chúng ta có th th y hàm main b t ñ u b ng vi c khai báo bi n z ki u int. Ngay sau ñó
là m t l i g i t i hàm addition. N u ñ ý chúng ta s th y s tương t gi a c u trúc c a
l i g i hàm v i khai báo c a hàm:




                                       Trang 29
Updatesofts.com                                                         Ebooks Team




Các tham s có vai trò th t rõ ràng. Bên trong hàm main chúng ta g i hàm addition và
truy n hai giá tr : 5 và 3 tương ng v i hai tham s int a và int b ñư c khai báo cho
hàm addition.

Vào th i ñi m hàm ñư c g i t main, quy n ñi     u khi n ñư c chuy n sang cho hàm
addition. Giá tr c a c hai tham s (5 và 3) ñư   c copy sang hai bi n c c b int a và
int b bên trong hàm.

Dòng l nh sau:

       return (r);

k t thúc hàm addition, và tr l i quy n ñi u khi n cho hàm nào ñã g i nó (main) và ti p
t c chương trình cái ñi m mà nó b ng t b i l i g i ñ n addition. Nhưng thêm vào ñó,
giá tr ñư c dùng v i l nh return (r) chính là giá tr ñư c tr v c a hàm.\




Giá tr tr v b i m t hàm chính là giá tr c a hàm khi nó ñư c tính toán. Vì v y bi n z s
có có giá tr ñư c tr v b i addition (5, 3), ñó là 8.

Ph m vi ho t ñ ng c a các bi n [nh c l i]

B n c n nh r ng ph m vi ho t ñ ng c a các bi n khai báo trong m t hàm hay b t kì m t
kh i l nh nào khác ch là hàm ñó hay kh i l nh ñó và không th s d ng bên ngoài
chúng. Ví d , trong chương trình ví d trên, b n không th s d ng tr c ti p các bi n a, b
hay r trong hàm main vì chúng là các bi n c c b c a hàm addition. Thêm vào ñó b n
cũng không th s d ng bi n z tr c ti p bên trong hàm addition vì nó làm bi n c c b
c a hàm main.

Tuy nhiên b n có th khai báo các bi n toàn c c ñ có th s d ng chúng b t kì ñâu,
bên trong hay bên ngoài b t kì hàm nào. ð làm vi c này b n c n khai báo chúng bên
ngoài m i hàm hay các kh i l nh, có nghĩa là ngay trong thân chương trình.

ðây là m t ví d khác v hàm:

// function example                         The first result is 5
#include <iostream.h>                       The second result is 5



                                      Trang 30
Updatesofts.com                                                          Ebooks Team



                                             The third result is 2
int subtraction (int a, int b)               The fourth result is 6
{
  int r;
  r=a-b;
  return (r);
}

int main ()
{
  int x=5, y=3, z;
  z = subtraction (7,2);
  cout << "The first result is " <<
z << '\n';
  cout << "The second result is "
<< subtraction (7,2) << '\n';
  cout << "The third result is " <<
subtraction (x,y) << '\n';
  z= 4 + subtraction (x,y);
  cout << "The fourth result is "
<< z << '\n';
  return 0;
}


Trong trư ng h p này chúng ta t o ra hàm subtraction. Ch c năng c a hàm này là l y
hi u c a hai tham s r i tr v k t qu .

Tuy nhiên, n u phân tích hàm main các b n s th y chương trình ñã vài l n g i ñ n hàm
subtraction. Tôi ñã s d ng vài cách g i khác nhau ñ các b n th y các cách khác nhau
mà m t hàm có th ñư c g i.

ð có hi u c n k ví d này b n c n nh r ng m t l i g i ñ n m t hàm có th hoàn toàn
ñư c thay th b i giá tr c a nó. Ví d trong l nh g i hàm ñ u tiên :

       z = subtraction (7,2);
       cout << "The first result is " << z;

N u chúng ta thay l i g i hàm b ng giá tr c a nó (ñó là 5), chúng ta s có:

       z = 5;
       cout << "The first result is " << z;

Tương t như v y

       cout << "The second result is " << subtraction (7,2);

cũng cho k t qu gi ng như hai dòng l nh trên nhưng trong trư ng h p này chúng ta g i
hàm subtraction tr c ti p như là m t tham s c a cout. Chúng ta cũng có th vi t:

       cout << "The second result is " << 5;



                                       Trang 31
Updatesofts.com                                                         Ebooks Team


vì 5 là k t qu c a subtraction (7,2).

Còn v i l nh

       cout << "The third result is " << subtraction (x,y);

ði u m i m duy nh t ñây là các tham s c a subtraction là các bi n thay vì các
h ng. ði u này là hoàn toàn h p l . Trong trư ng h p này giá tr ñư c truy n cho hàm
subtraction là giá tr c a x and y.

Trư ng h p th tư cũng hoàn toàn tương t . Thay vì vi t

       z = 4 + subtraction (x,y);

chúng ta có th vi t:

       z = subtraction (x,y) + 4;

cũng hoàn toàn cho k t qu tương ñương. Chú ý r ng d u ch m ph y ñư c ñ t      cu i
bi u th c ch không c n thi t ph i ñ t ngay sau l i g i hàm.

Các hàm không ki u. Cách s d ng void.
N u b n còn nh cú pháp c a m t l i khai báo hàm:

       type name ( argument1, argument2 ...) statement

b n s th y rõ ràng r ng nó b t ñ u v i m t tên ki u, ñó là ki u d li u s ñư c hàm tr
v b i l nh return. Nhưng n u chúng ta không mu n tr v giá tr nào thì sao ?

Hãy tư ng tư ng r ng chúng ta mu n t o ra m t hàm ch ñ hi n th m t thông báo lên
màn hình. Nó không c n tr v m t giá tr nào c , hơn n a cũng không c n nh n tham s
nào h t. Vì v y ngư i ta ñã nghĩ ra ki u d li u void trong ngôn ng C. Hãy xem xét
chương trình sau:

// void function example                    I'm a function!
#include <iostream.h>

void dummyfunction (void)
{
  cout << "I'm a function!";
}

int main ()
{
  dummyfunction ();
  return 0;
}



                                      Trang 32
Updatesofts.com                                                        Ebooks Team


T khoá void trong ph n danh sách tham s có nghĩa là hàm này không nh n m t tham
s nào. Tuy nhiên trong C++ không c n thi t ph i s d ng void ñ làm ñi u này. B n ch
ñơn gi n s d ng c p ngo c ñơn ( ) là xong.

B i vì hàm c a chúng ta không có m t tham s nào, vì v y l i g i hàm dummyfunction
s là :

       dummyfunction ();

Hai d u ngo c ñơn là c n thi t ñ cho trình d ch hi u ñó là m t l i g i hàm ch không
ph i là m t tên bi n hay b t kì d u hi u nào khác.




                                      Trang 33
Updatesofts.com                                                            Ebooks Team



Hàm (II).

Truy n tham s theo tham s giá tr hay tham s bi n.
Cho ñ n nay, trong t t c các hàm chúng ta ñã bi t, t t c các tham s truy n cho hàm ñ u
ñư c truy n theo giá tr . ði u này có nghĩa là khi chúng ta g i hàm v i các tham s ,
nh ng gì chúng ta truy n cho hàm là các giá tr ch không ph i b n thân các bi n. Ví d ,
gi s chúng ta g i hàm addition như sau:

       int x=5, y=3, z;
       z = addition ( x , y );

Trong trư ng h p này khi chúng ta g i hàm addition thì các giá tr 5 and 3 ñư c truy n
cho hàm, không ph i là b n thân các bi n.




ð n ñây các b n có th h i tôi: Như v y thì sao, có nh hư ng gì ñâu ? ði u ñáng nói
ñây là khi các b n thay ñ i giá tr c a các bi n a hay b bên trong hàm thì các bi n x và y
v n không thay ñ i vì chúng ñâu có ñư c truy n cho hàm ch có giá tr c a chúng ñư c
truy n mà thôi.

Hãy xét trư ng h p b n c n thao tác v i m t bi n ngoài bên trong m t hàm. Vì v y b n
s ph i truy n tham s dư i d ng tham s bi n như trong hàm duplicate trong ví d
dư i ñây:

// passing parameters by reference            x=2, y=6, z=14
#include <iostream.h>

void duplicate (int& a, int& b,
int& c)
{
  a*=2;
  b*=2;
  c*=2;
}

int main ()
{
  int x=1, y=3, z=7;
  duplicate (x, y, z);
  cout << "x=" << x << ", y=" << y
<< ", z=" << z;
  return 0;
}




                                        Trang 34
Updatesofts.com                                                           Ebooks Team


ði u ñ u tiên làm b n chú ý là trong khai báo c a duplicate theo sau tên ki u c a m i
tham s ñ u là d u và (&), ñ báo hi u r ng các tham s này ñư c truy n theo tham s
bi n ch không ph i tham s giá tr .

Khi truy n tham s dư i d ng tham s bi n chúng ta ñang truy n b n thân bi n ñó và b t
kì s thay ñ i nào mà chúng ta th c hi n v i tham s ñó bên trong hàm s nh hư ng tr c
ti p ñ n bi n ñó.




Trong ví d trên, chúng ta ñã liên k t a, b và c v i các tham s khi g i hàm (x, y và z) và
m i s thay ñ i v i a bên trong hàm s nh hư ng ñ n giá tr c a x và hoàn toàn tương t
v i b và y, c và z.

Ki u khai báo tham s theo d ng tham s bi n s d ng d u và (&) ch có trong C++.
Trong ngôn ng C chúng ta ph i s d ng con tr ñ làm vi c tương t như th .

Truy n tham s dư i d ng tham s bi n cho phép m t hàm tr v nhi u hơn m t giá tr .
Ví d , ñây là m t hàm tr v s li n trư c và li n sau c a tham s ñ u tiên.

// more than one returning value              Previous=99, Next=101
#include <iostream.h>

void prevnext (int x, int& prev,
int& next)
{
  prev = x-1;
  next = x+1;
}

int main ()
{
  int x=100, y, z;
  prevnext (x, y, z);
  cout << "Previous=" << y << ",
Next=" << z;
  return 0;
}



Giá tr m c ñ nh c a tham s .
Khi ñ nh nghĩa m t hàm chúng ta có th ch ñ nh nh ng giá tr m c ñ nh s ñư c truy n
cho các ñ i s trong trư ng h p chúng b b qua khi hàm ñư c g i. ð làm vi c này ñơn
gi n ch c n gán m t giá tr cho ñ i s khi khai báo hàm. N u giá tr c a tham s ñó v n
ñư c ch ñ nh khi g i hàm thì giá tr m c ñ nh s b b qua. Ví d :


                                       Trang 35
Updatesofts.com                                                        Ebooks Team



// default values in functions              6
#include <iostream.h>                       5

int divide (int a, int b=2)
{
  int r;
  r=a/b;
  return (r);
}

int main ()
{
  cout << divide (12);
  cout << endl;
  cout << divide (20,4);
  return 0;
}


Nhưng chúng ta th y trong thân chương trình, có hai l i g i hàm divide. Trong l nh ñ u
tiên:

         divide (12)

chúng ta ch dùng m t tham s nhưng hàm divide cho phép ñ n hai. B i v y hàm
divide  s t cho tham s th hai giá tr b ng 2 vì ñó là giá tr m c ñ nh c a nó (chú ý
ph n khai báo hàm ñư c k t thúc b i int b=2). Vì v y k t qu s là 6 (12/2).

Trong l nh th hai:

         divide (20,4)

có hai tham s , b i v y giá tr m c ñ nh s ñư c b qua. K t qu c a hàm s là 5 (20/4).

Quá t i các hàm.
Hai hàm có th có cũng tên n u khai báo tham s c a chúng khác nhau, ñi u này có nghĩa
là b n có th ñ t cùng m t tên cho nhi u hàm n u chúng có s tham s khác nhau hay
ki u d li u c a các tham s khác nhau (hay th m chí là ki u d li u tr v khác nhau).
Ví d :
// overloaded function                      2
#include <iostream.h>                       2.5

int divide (int a, int b)
{
  return (a/b);
}

float divide (float a, float b)
{



                                      Trang 36
Updatesofts.com                                                          Ebooks Team



    return (a/b);
}

int main ()
{
  int x=5,y=2;
  float n=5.0,m=2.0;
  cout << divide (x,y);
  cout << "\n";
  cout << divide (n,m);
  return 0;
}


Trong ví d này chúng ta ñ nh nghĩa hai hàm có cùng tên nhưng m t hàm dùng hai tham
s ki u int và hàm còn l i dùng ki u float. Trình biên d ch s bi t c n ph i g i hàm nào
b ng cách phân tích ki u tham s khi hàm ñư c g i.

ð ñơn gi n tôi vi t c hai hàm ñ u có mã l nh như nhau nhưng ñi u này không b t bu c.
B n có th xây d ng hai hàm có cùng tên nhưng ho t ñ ng hoàn toàn khác nhau.

Các hàm inline.
Ch th inline có th ñư c ñ t trư c khao báo c a m t hàm ñ ch rõ r ng l i g i hàm s
ñư c thay th b ng mã l nh c a hàm khi chương trình ñư c d ch. Vi c này tương ñương
v i vi c khai báo m t macro, l i ích c a nó ch th hi n v i các hàm r t ng n, t c ñ
ch y chương trình s ñư c c i thi n vì nó không ph i g i m t th t c con.

C u trúc c a nó như sau:

inline type name ( arguments ... ) { instructions ... }
l i g i hàm cũng như b t kì m t hàm nào khác. Không c n thi t ph i ñ t t khoá inline
trong l nh g i, ch c n trong l i khai báo hàm là ñ .

ð qui.
Các hàm có th g i chính nó. ði u này có th có ích v i m t s tác v như là m t s
phương pháp s p x p hay tính giai th a c a m t s . Ví d , ñ tính giai th a c a m t s
(n), công th c toán h c c a nó như sau:

        n! = n * (n-1) * (n-2) * (n-3) ... * 1

và m t hàm ñ qui ñ tính toán s như sau:
// factorial calculator                      Type a number: 9
#include <iostream.h>                        !9 = 362880

long factorial (long a)




                                       Trang 37
Updatesofts.com                                                         Ebooks Team



{
    if (a > 1)
     return (a * factorial (a-1));
    else
     return (1);
}

int main ()
{
  long l;
  cout << "Type a number: ";
  cin >> l;
  cout << "!" << l << " = " <<
factorial (l);
  return 0;
}


Chú ý trong hàm factorial chúng ta có th l nh g i chính nó nhưng ch khi tham s l n
hơn 1, n u không thì hàm s th c hi n m t vòng l p vô h n vì sau khi ñ n 0 nó s ti p t c
nhân c nh ng s âm.

Hàm này có m t h n ch là ki u d li u mà nó dùng (long) không cho phép tính giai
th a quá 12!.

Khai báo m u cho hàm.
Cho ñ n gi chúng ta hoàn toàn ph i ñ nh nghĩa hàm trư c l nh g i ñ u tiên ñ n nó, mà
thư ng là trong main, vì v y hàm main luôn ph i n m cu i chương trình. N u b n th l p
l i m t vài ví d v hàm trư c ñây nhưng th ñ t hàm main trư c b t kì m t hàm ñư c
g i t nó, b n g n như ch c ch n s nh n ñư c thông báo l i. Nguyên nhân là m t hàm
ph i ñư c khai báo trư c khi nó ñư c g i như nhưnggx gì chúng ta ñã làm trng t t c các
ví d .

Nhưng có m t cách khác ñ tránh ph i vi t t t c mã chương trình trư c khi chúng có th
ñư c dùng trong main hay b t kì m t hàm nào khác. ðó chính là khai báo m u cho hàm.
Cách này bao g m vi c khai báo hàm m t cách ng n g n nhưng ñ ñ cho trình d ch có
th bi t các tham s và ki u d li u tr v c a hàm.

D ng c a nó như sau:

         type name ( argument_type1, argument_type2, ...);

ðây chính là ph n ñ u c a ñ nh nghĩa hàm, ngo i tr :

     •   Nó không có b t kì l nh nào cho hàm. ði u này có nghĩa là nó không bao g m
         thân hàm v i t t c các l nh thư ng ñư c b c trong c p ngo c nh n { }.
     •   Nó k t thúc b ng d u ch m ph y (;).



                                       Trang 38
Updatesofts.com                                                           Ebooks Team


   •     Trong ph n li t kê các tham s ch c n vi t ki u c a chúng là ñ . Vi c vi t tên c a
         các tham s trong ph n khai báo m u là không b t bu c.

Ví d :
// prototyping                                 Type a   number (0   to exit): 9
#include <iostream.h>                          Number   is odd.
                                               Type a   number (0   to exit): 6
void odd (int a);                              Number   is even.
void even (int a);                             Type a   number (0   to exit): 1030
                                               Number   is even.
int main ()                                    Type a   number (0   to exit): 0
{                                              Number   is even.
  int i;
  do {
    cout << "Type a number: (0 to
exit)";
    cin >> i;
    odd (i);
  } while (i!=0);
  return 0;
}

void odd (int a)
{
  if ((a%2)!=0) cout << "Number is
odd.\n";
  else even (a);
}

void even (int a)
{
  if ((a%2)==0) cout << "Number is
even.\n";
  else odd (a);
}


Ví d này rõ ràng không ph i là m t ví d v s hi u qu . Tôi ch c ch n r ng các b n có
th nh n ñư c k t qu như trên ch v i m t n a s dòng l nh. Tuy nhiên nó giúp cho
chúng ta th y ñư c vi c khai báo m u các hàm là như th nào. Hơn n a, trong ví d này
vi c khai báo m u ít nh t m t hàm là b t bu c.

ð u tiên chúng ta th y khai báo m u c a hai hàm odd và even:

         void odd (int a);
         void even (int a);

cho phép hai hàm này có th ñư c s d ng trư c khi chúng ñư c ñ nh nghĩa hoàn ch nh.
Tuy nhiên lý do ñ c bi t gi i thích t i sao chương trình này l i c n ít nh t m t hàm ph i
ñư c khi báo m u là trong odd có m t l i g i ñ n even và trong even có m t l i g i ñ n
odd. Vì v y n u không có hàm nào ñư c khai báo trư c thì l i ch c ch n s x y ra.




                                        Trang 39
Updatesofts.com                                                          Ebooks Team


R t nhi u l p trình viên kinh nghi m khuyên r ng t t c các hàm nên ñư c khai báo m u.
ðó cũng là l i khuyên c a tôi, nh t là trong trư ng h p có nhi u hàm ho c chúng r t dài,
khi ñó vi c khai báo t t c các hàm cùng m t ch cho phép chúng ta bi t ph i g i các
hàm như th nào, vì v y ti t ki m ñư c th i gian.




                                       Trang 40
Updatesofts.com                                                          Ebooks Team



M ng
M ng là m t dãy các ph n t có cùng ki u ñư c ñ t liên ti p trong b nh và có th truy
xu t ñ n t ng ph n t b ng cách thêm m t ch s vào sau tên c a m ng.

ði u này có nghĩa là, ví d , chúng ta có th lưu 5 giá tr ki u int mà không c n ph i khai
báo 5 bi n khác nhau.Ví d , m t m ng ch a 5 giá tr nguyên ki u int có tên là billy có
th ñư c bi u di n như sau:




trong ñó m i m t ô tr ng bi u di n m t ph n t c a m ng, trong trư ng h p này là các
giá tr nguyên ki u int. Chúng ñư c ñánh s t 0 ñ n 4 vì ph n t ñ u tiên c a m ng
luôn là 0 b t k ñ dài c a nó là bao nhiêu.
Như b t kì bi n nào khác, m t m ng ph i ñư c khai báo trư c khi có th s d ng. M t
khai báo ñi n hình cho m t m ng trong C++ như sau:

       type name [elements];




trong ñó type là m t ki u d li u h p l (int, float...), name là m t tên bi n h p l và
trư ng elements ch ñ nh m ng ñó s ch a bao nhiêu ph n t
Vì v y, ñ khai báo billy như ñã trình bày trên chúng ta ch c n m t dòng ñơn gi n như
sau:

       int billy [5];


Chú ý: Trư ng elements bên trong c p ngo c [] ph i là m t giá tr h ng khi khai báo
m t m ng, vì m ng là m t kh i nh tĩnh có kích c xác ñ nh và trình biên d ch ph i có
kh năng xác ñ nh xem c n bao nhiêu b nh ñ c p phát cho m ng trư c khi các l nh có
th ñư c th c hi n.

Kh i t o m t m ng.
Khi khai báo m t m ng v i t m ho t ñ ng ñ a phương (trong m t hàm), theo m c ñ nh nó
s không ñư c kh i t o, vì v y n i dung c a nó là không xác ñ nh cho ñ n khi chúng ra
lưu các giá tr lên ñó.

N u chúng ta khai báo m t m ng toàn c c (bên ngoài t t c các hàm) nó s ñư c kh i t o
và t t c các ph n t ñư c ñ t b ng 0. Vì v y n u chúng ta khai báo m ng toàn c c:




                                       Trang 41
Updatesofts.com                                                        Ebooks Team


       int billy [5];




m i ph n t c a billy s ñư c kh i t o là 0:




Nhưng thêm vào ñó, khi chúng ta khai báo m t m ng, chúng ta có th gán các giá tr kh i
t o cho t ng ph n t c a nó. Ví d :


       int billy [5] = { 16, 2, 77, 40, 12071 };




l nh trên s khai báo m t m ng như sau:




S ph n t trong m ng mà chúng ta kh i t o v i c p ngo c nh n { } ph i b ng s ph n
t c a m ng ñã ñư c khai báo v i c p ngo c vuông [ ]. B i vì ñi u này có th ñư c coi
là m t s l p l i không c n thi t nên C++ cho phép ñ tr ng gi a c p ngo c vuông, kích
thư c c a m ng ñư c xác ñ nh b ng s giá tr gi a c p ngo c nh n.

Truy xu t ñ n các ph n t c a m ng.
  b t kì ñi m nào c a chương trình trong t m ho t ñ ng c a m ng, chúng ta có th truy
xu t t ng ph n t c a m ng ñ ñ c hay ch nh s a như là ñ i v i m t bi n bình thư ng.
C u trúc c a nó như sau:

       name[index]

Như trong ví d trư c ta có m ng billy g m 5 ph n t có ki u int, chúng ta có th truy
xu t ñ n t ng ph n t c a m ng như sau:




Ví d , ñ lưu giá tr 75 vào ph n t th ba c a billy ta vi t như sau:


                                       Trang 42
Updatesofts.com                                                           Ebooks Team


       billy[2] = 75;

và, ví d , ñ gán giá tr c a ph n t th 3 c a billy cho bi n a, chúng ta vi t:

       a = billy[2];

Vì v y, xét v m i phương di n, bi u th c billy[2] gi ng như b t kì m t bi n ki u int.

Chú ý r ng ph n t th ba c a billy là billy[2], vì m ng b t ñ u t ch s 0. Vì v y,
ph n t cu i cùng s là billy[4]. Vì v y n u chúng ta vi t billy[5], chúng ta s truy
xu t ñ n ph n t th 6 c a m ng và vư t quá gi i h n c a m ng.

Trong C++, vi c vư t quá gi i h n ch s c a m ng là hoàn toàn h p l , tuy nhiên nó có
th gây ra nh ng v n ñ th c s khó phát hi n b i vì chúng không t o ra nh ng l i trong
quá trình d ch nhưng chúng có th t o ra nh ng k t qu không mong mu n trong quá
trình th c hi n. Nguyên nhân c a vi c này s ñư c nói ñ n kĩ hơn khi chúng ta b t ñ u s
d ng con tr .

C n ph i nh n m nh r ng chúng ta s d ng c p ngo c vuông cho hai tác v : ñ u tiên là
ñ t kích thư c cho m ng khi khai báo chúng và th hai, ñ ch ñ nh ch s cho m t ph n
t c th c a m ng khi xem xét ñ n nó.

       int billy[5];              // khai báo m t m ng m i.
       billy[2] = 75;             // truy xu t ñ n m t ph n t         c a
       m ng.

M t vài thao tác h p l khác v i m ng:

       billy[0] = a;
       billy[a] = 75;
       b = billy [a+2];
       billy[billy[a]] = billy[2] + 5;


// ví d v m ng                                12206
#include <iostream.h>

int billy [] = {16, 2, 77, 40,
12071};
int n, result=0;

int main ()
{
  for ( n=0 ; n<5 ; n++ )
  {
    result += billy[n];
  }
  cout << result;
  return 0;
}




                                        Trang 43
Updatesofts.com                                                         Ebooks Team



M ng nhi u chi u.
M ng nhi u chi u có th ñư c coi như m ng c a m ng, ví d , m t m ng hai chi u có th
ñư c tư ng tư c như là m t b ng hai chi u g m các ph n t có ki u d li u c th và
gi ng nhau.




jimmy bi u di n m t m ng hai chi u kích thư c 3x5 có ki u int. Cách khai báo m ng
này như sau:

        int jimmy [3][5];

và, ví d , cách ñ truy xu t ñ n ph n t th hai theo chi u d c và th tư theo chi u ngang
trong m t bi u th c như sau:

        jimmy[1][3]




        (hãy nh r ng ch s c a m ng luôn b t ñ u t 0).

M ng nhi u chi u không b gi i h n b i hai ch s (hai chi u), Chúng có th ch a bao
nhi u ch s tùy thích m c dù ít khí c n ph i dùng ñ n m ng l n hơn 3 chi u. Hãy th
xem xét lư ng b nh mà m t m ng có nhi u ch s c n ñ n. Ví d :

        char century [100][365][24][60][60];

gán m t giá tr char cho m i giây trong m t th k , ph i c n ñ n hơn 3 t giá tr chars!
Chúng ta s ph i c n kho ng 3GB RAM ñ khai báo nó.

M ng nhi u chi u th c ra là m t khái ni m tr u tư ng vì chúng ta có th có k t qu
tương t v i m ng m t chi u b ng m t thao tác ñơn gi n gi a các ch s c a nó:

        int jimmy [3][5]; tương ñương v      i
        int jimmy [15]; (3 * 5 = 15)




                                      Trang 44
Updatesofts.com                                                         Ebooks Team


Dư i ñây là hai ví d v i cùng m t k t qu như nhau, m t s d ng m ng hai chi u và
m t s d ng m ng m t chi u:
// multidimensional array                   // pseudo-multidimensional array
#include <iostream.h>                       #include <iostream.h>

#define WIDTH 5                             #define WIDTH 5
#define HEIGHT 3                            #define HEIGHT 3

int jimmy [HEIGHT][WIDTH];                  int jimmy [HEIGHT * WIDTH];
int n,m;                                    int n,m;

int main ()                                 int main ()
{                                           {
  for (n=0;n<HEIGHT;n++)                      for (n=0;n<HEIGHT;n++)
    for (m=0;m<WIDTH;m++)                       for (m=0;m<WIDTH;m++)
    {                                           {
      jimmy[n][m]=(n+1)*(m+1);                    jimmy[n * WIDTH +
    }                                       m]=(n+1)*(m+1);
  return 0;                                     }
}                                             return 0;
                                            }


không m t chương trình nào vi t gì ra màn hình nhưng c hai ñ u gán giá tr vào kh i
nh có tên jimmy theo cách sau:




Chúng ta ñã ñ nh nghĩa h ng (#define) ñ ñơn gi n hóa nh ng ch nh s a sau này c a
chương trình, ví d , trong trư ng h p chúng ta quy t ñ nh tăng kích thư c c a m ng v i
chi u cao là 4 thay vì là 3, chúng ta ch c n thay ñ i dòng:

        #define HEIGHT 3

thành

        #define HEIGHT 4

và không ph i có thêm s thay ñ i nào n a ñ i v i chương trình.

Dùng m ng làm tham s .
Vào m t lúc nào ñó có th chúng ta c n ph i truy n m t m ng t i m t hàm như là m t
tham s . Trong C++, vi c truy n theo tham s giá tr m t kh i nh là không h p l , ngay
c khi nó ñư c t ch c thành m t m ng. Tuy nhiên chúng ta l i ñư c phép truy n ñ a ch



                                      Trang 45
Updatesofts.com                                                          Ebooks Team


c a nó, vi c này cũng t o ra k t qu th c t gi ng thao tác   trên nhưng l i nhanh hơn
nhi u và hi u qu hơn.

ð có th nh n m ng là tham s thì ñi u duy nh t chúng ta ph i làm khi khai báo hàm là
ch ñ nh trong ph n tham s ki u d li u cơ b n c a m ng, tên m ng và c p ngo c vuông
tr ng. Ví d , hàm sau:

       void procedure (int arg[])

nh n vào m t tham s có ki u "m ng c a char" và có tên arg. ð truy n tham s cho
hàm này m t m ng ñư c khai báo:

       int myarray [40];

ch c n g i hàm như sau:

       procedure (myarray);

Dư i ñây là m t ví d c th

// arrays as parameters                      5 10 15
#include <iostream.h>                        2 4 6 8 10

void printarray (int arg[], int
length) {
  for (int n=0; n<length; n++)
    cout << arg[n] << " ";
  cout << "\n";
}

int main ()
{
  int firstarray[] = {5, 10, 15};
  int secondarray[] = {2, 4, 6, 8,
10};
  printarray (firstarray,3);
  printarray (secondarray,5);
  return 0;
}


Như b n có th th y, tham s ñ u tiên (int arg[]) ch p nh n m i m ng có ki u cơ b n
là int, b t k ñ dài c a nó là bao nhiêu, vì v y c n thi t ph i có tham s th hai ñ báo
cho hàm này bi t ñ dài c a m ng mà chúng ta truy n cho nó.

Trong ph n khai báo hàm chúng ta cũng có th dùng tham s là các m ng nhi u chi u.
C u trúc c a m ng 3 chi u như sau:

       base_type[][depth][depth]




                                       Trang 46
Updatesofts.com                                                         Ebooks Team


ví d , m t hàm v i tham s là m ng nhi u chi u có th như sau:

       void procedure (int myarray[][3][4])

chú ý r ng c p ngo c vuông ñ u tiên ñ tr ng nhưng các c p ngo c sau thì không. B n
luôn luôn ph i làm v y vì trình biên d ch C++ ph i có kh năng xác ñ nh ñ l n c a các
chi u thêm vào c a m ng.

M ng, c m t chi u và nhi u chi u, khi truy n cho hàm như là m t tham s thư ng là
nguyên nhân gây l i cho nh ng l p trình viên thi u kinh nghi m. Các b n nên ñ c bài
3.3. Con tr ñ có th hi u rõ hơn m ng ho t ñ ng như th nào.




                                      Trang 47
Updatesofts.com                                                         Ebooks Team



Xâu kí t
Trong t t c các chương trình chúng ta ñã th y cho ñ n gi , chúng ta ch s d ng các bi n
ki u s , ch dùng ñ bi u di n các s . Nhưng bên c nh các bi n ki u s còn có các xâu kí
t , chúng cho phép chúng ta bi u di n các chu i kí t như là các t , câu, ño n văn b n...
Cho ñ n gi chúng ta m i ch dùng chúng dư i d ng h ng ch ch a quan tâm ñ n các
bi n có th ch a chúng.

Trong C++ không có ki u d li u cơ b n ñ lưu các xâu kí t . ð có th th a mãn nhu
c u này, ngư i ta s d ng m ng có ki u char. Hãy nh r ng ki u d li u này (char) ch
có th lưu tr m t kí t ñơn, b i v y nó ñư c dùng ñ t o ra xâu c a các kí t ñơn.

Ví d , m ng sau (hay là xâu kí t ):

char jenny [20];

có th lưu m t xâu kí t v i ñ dài c c ñ i là 20 kí t . B n có th tư ng tư ng nó như
sau:




Kích thư c c c ñ i này không c n ph i luôn luôn dùng ñ n. Ví d , jenny có th lưu xâu
"Hello" hay "Merry christmas".       Vì các m ng kí t có th lưu các xâu kí t ng n hơn
ñ dài c a nó, trong C++ ñã có m t quy ư c ñ k t thúc m t n i dung c a m t xâu kí t
b ng m t kí t null, có th ñư c vi t là '\0'.

Chúng ta có th bi u di n jenny (m t m ng có 20 ph n t ki u char) khi lưu tr xâu kí
t "Hello" và "Merry Christmas" theo cách sau:




Chú ý r ng sau n i dung c a xâu, m t kí t null ('\0') ñư c dùng ñ báo hi u k t thúc
xâu. Nh ng ô màu xám bi u di n nh ng giá tr không xác ñ nh.

Kh i t o các xâu kí t .
Vì nh ng xâu kí t là nh ng m ng bình thư ng nên chúng cũng như các m ng khác. Ví
d , n u chúng ta mu n kh i t o m t xâu kí t v i nh ng giá tr xác ñ nh chúng ta có th
làm ñi u ñó tương t như v i các m ng khác:



                                      Trang 48
Updatesofts.com                                                        Ebooks Team


char mystring[] = { 'H', 'e', 'l', 'l', 'o', '\0' };

Tuy nhiên, chúng ta có th kh i t o giá tr cho m t xâu kí t b ng cách khác: s d ng các
h ng xâu kí t .

Trong các bi u th c chúng ta ñã s d ng trong các ví d trong các chương trư c các h ng
xâu kí t ñ xu t hi n vài l n. Chúng ñư c bi u di n trong c p ngo c kép ("), ví d :

"the result is: "
là m t h ng xâu kí t chúng ta s d ng    m t s ch .

Không gi ng như d u nháy ñơn (') cho phép bi u di n h ng kí t , c p ngo c kép (") là
h ng bi u di n m t chu i kí t liên ti p, và cu i chu i m t kí t null ('\0') luôn ñư c
t ñ ng thêm vào.

Vì v y chúng ta có th kh i t o xâu mystring theo m t trong hai cách sau ñây:

char mystring [] = { 'H', 'e', 'l', 'l', 'o', '\0' };
char mystring [] = "Hello";

Trong c hai trư ng h p m ng (hay xâu kí t ) mystring ñư c khai báo v i kích thư c 6
kí t : 5 kí t bi u di n Hello c ng v i m t kí t null.

Trư c khi ti p t c, tôi c n ph i nh c nh b n r ng vi c gán nhi u h ng như vi c s d ng
d u ngo c kép (") ch h p l khi kh i t o m ng, t c là lúc khai báo m ng. Các bi u th c
trong chương trình như:

mystring = "Hello";
mystring[] = "Hello";

là không h p l , c câu l nh dư i ñây cũng v y:

mystring = { 'H', 'e', 'l', 'l', 'o', '\0' };

V y hãy nh : Chúng ta ch có th "gán" nhi u h ng cho m t m ng vào lúc kh i t o nó.
Nguyên nhân là m t thao tác gán (=) không th nh n v trái là c m t m ng mà ch có th
nh n m t trong nh ng ph n t c a nó. Vào th i ñi m kh i t o m ng là m t trư ng h p
ñ c bi t, vì nó không th c s là m t l nh gán m c dù nó s d ng d u b ng (=).

Gán giá tr cho xâu kí t
Vì v trái c a m t l nh gán ch có th là m t ph n t c a m ng ch không th là c m ng,
chúng ta có th gán m t xâu kí t cho m t m ng ki u char s d ng m t phương pháp
như sau:

mystring[0] = 'H';
mystring[1] = 'e';



                                       Trang 49
Updatesofts.com                                                       Ebooks Team


mystring[2]   =   'l';
mystring[3]   =   'l';
mystring[4]   =   'o';
mystring[5]   =   '\0';

Nhưng rõ ràng ñây không ph i là m t phương pháp th c t . ð gán giá tr cho m t xâu kí
t , chúng ta có th s d ng lo t hàm ki u strcpy (string copy), hàm này ñư c ñ nh
nghĩa trong string.h và có th ñư c g i như sau:

strcpy (string1, string2);

L nh này copy n i dung c a string2 sang string1. string2 có th là m t m ng, con
tr hay m t h ng xâu kí t , b i v y l nh sau ñây là m t cách ñúng ñ gán xâu h ng
"Hello" cho mystring:

strcpy (mystring, "Hello");

Ví d :

// setting value to string                 J. Soulie
#include <iostream.h>
#include <string.h>

int main ()
{
  char szMyName [20];
  strcpy (szMyName,"J. Soulie");
  cout << szMyName;
  return 0;
}


ð ý r ng chúng ta ph i include file <string.h> ñ có th s d ng hàm strcpy.

M c dù chúng ta luôn có th vi t m t hàm ñơn gi n như hàm setstring dư i ñây ñ
th c hi n m t thao tác gi ng như strcpy:

// setting value to string                 J. Soulie
#include <iostream.h>

void setstring (char szOut [], char
szIn [])
{
  int n=0;
  do {
    szOut[n] = szIn[n];
    n++;
  } while (szIn[n] != 0);
}

int main ()



                                     Trang 50
Updatesofts.com                                                         Ebooks Team



{
    char szMyName [20];
    setstring (szMyName,"J. Soulie");
    cout << szMyName;
    return 0;
}


M t phương th c thư ng dùng khác ñ gán giá tr cho m t m ng là s d ng tr c ti p
dòng nh p d li u (cin). Trong trư ng h p này giá tr c a xâu kí t ñư c gán b i ngư i
dùng trong quá trình chương trình th c hi n.

Khi cin ñư c s d ng v i các xâu kí t nó thư ng ñư c dùng v i phương th c getline
c a nó, phương th c này có th ñư c g i như sau:

cin.getline ( char buffer[], int length, char delimiter = ' \n');

trong ñó buffer (b ñ m) là ñ a ch nơi s lưu tr d li u vào (như là m t m ng ch ng
h n), length là ñ dài c c ñ i c a b ñ m (kích thư c c a m ng) và delimiter là kí t
ñư c dùng ñ k t thúc vi c nh p, m c ñ nh - n u chúng ta không dùng tham s này - s là
kí t xu ng dòng ('\n').

Ví d sau ñây l p l i t t c nh ng gì b n gõ trên bàn phím. Nó r t ñơn gi n nhưng là m t
ví d cho th y b n có th s d ng cin.getline v i các xâu kí t như th nào:

// cin with strings                         What's your name? Juan
#include <iostream.h>                       Hello Juan.
                                            Which is your favourite team? Inter
int main ()                                 Milan
{                                           I like Inter Milan too.
  char mybuffer [100];
  cout << "What's your name? ";
  cin.getline (mybuffer,100);
  cout << "Hello " << mybuffer <<
".\n";
  cout << "Which is your favourite
team? ";
  cin.getline (mybuffer,100);
  cout << "I like " << mybuffer <<
" too.\n";
  return 0;
}


Chú ý trong c hai l i g i cin.getline chúng ta s d ng cùng m t bi n xâu (mybuffer).
Nh ng gì chương trình làm trong l i g i th hai ñơn gi n là thay th n i dung c a
buffer trong l i g i cũ b ng n i dung m i.

N u b n còn nh ph n nói v giao ti p v i, b n s nh r ng chúng ta ñã s d ng toán t
>> ñ nh n d li u tr c ti p t ñ u vào chu n. Phương th c này có th ñư c dùng v i các



                                      Trang 51
Updatesofts.com                                                        Ebooks Team


xâu kí t thay cho cin.getline. Ví d , trong chươn trình c a chúng ta, khi chúng ta
mu n nh n d li u t ngư i dùng chúng ta có th vi t:

cin >> mybuffer;

l nh này s làm vi c như nó có nh ng h n ch sau mà cin.getline không có:

   •   Nó ch có th nh n nh ng t ñơn (không nh n ñư c c câu) vì phương th c này
       s d ng kí t tr ng(bao g m c d u cách, d u tab và d u xu ng dòng) làm d u
       hi u k t thúc..
   •   Nó không cho phép ch ñ nh kích thư c cho b ñ m. Chương trình c a b n có th
       ch y không n ñ nh n u d li u vào l n hơn kích c c a m ng ch a nó.

Vì nh ng nguyên nhân trên, khi mu n nh p vào các xâu kí t b n nên s d ng
cin.getline thay vì cin >>.


Chuy n ñ i xâu kí t sang các ki u khác.
Vì m t xâu kí t có th bi u di n nhi u ki u d li u khác như d ng s nên vi c chuy n
ñ i n i dung như v y sang d ng s là r t h u ích. Ví d , m t xâu có th mang giá tr
"1977"nhưng ñó là m t chu i g m 5 kí t (k c kí t null) và không d gì chuy n thành
m t s nguyên. Vì v y thư vi n cstdlib (stdlib.h) ñã cung c p 3 macro/hàm h u ích
sau:

   •   atoi: chuy n xâu thành ki u int.
   •   atol: chuy n xâu thành ki u long.
   •   atof: chuy n xâu thành ki u float.

T t c các hàm này nh n m t tham s và tr v giá tr s (int, long ho c float). Các
hàm này khi k t h p v i phương th c getline c a cin là m t cách ñáng tin c y hơn
phương th c cin>> c ñi n khi yêu c u ngư i s d ng nh p vào m t s :
// cin and ato* functions                   Enter price: 2.75
#include <iostream.h>                       Enter quantity: 21
#include <stdlib.h>                         Total price: 57.75

int main ()
{
  char mybuffer [100];
  float price;
  int quantity;
  cout << "Enter price: ";
  cin.getline (mybuffer,100);
  price = atof (mybuffer);
  cout << "Enter quantity: ";
  cin.getline (mybuffer,100);
  quantity = atoi (mybuffer);
  cout << "Total price: " <<
price*quantity;



                                      Trang 52
Updatesofts.com                                                       Ebooks Team



    return 0;
}



Các hàm ñ thao tác trên chu i
Thư vi n cstring (string.h) không ch có hàm strcpy mà còn có nhi u hàm khác ñ
thao tác trên chu i. Dư i ñây là gi i thi u lư t qua c a các hàm thông d ng nh t:
strcat: char* strcat (char* dest, const char* src);
        G n thêm chu i src vào phía cu i c a dest. Tr v dest.
strcmp: int strcmp (const char* string1, const char* string2);
        So sánh hai xâu string1 và string2. Tr v 0 n u hai xâu là b ng nhau.
strcpy: char* strcpy (char* dest, const char* src);
        Copy n i dung c a src cho dest. Tr v dest.
strlen: size_t strlen (const char* string);
        Tr v ñ dài c a string.

Chú ý: char* hoàn toàn tương ñương v i char[]




                                     Trang 53
Updatesofts.com                                                         Ebooks Team



Con tr


Chúng ta ñã bi t các bi n chính là các ô nh mà chúng ta có th truy xu t dư i các tên.
Các bi n này ñư c lưu tr t i nh ng ch c th trong b nh . ð i v i chương trình c a
chúng ta, b nh máy tính ch là m t dãy g m các ô nh 1 byte, m i ô có m t ñ a ch xác
ñ nh.

M t s mô hình t t ñ i v i b nh máy tính chính là m t ph trong m t thành ph . Trên
m t ph t t c các ngôi nhà ñ u ñư c ñánh s tu n t v i m t cái tên duy nh t nên n u
chúng ta nói ñ n s 27 ph Tr n Hưng ð o thì chúng ta có th tìm ñư c nơi ñó mà không
l m l n vì ch có m t ngôi nhà v i s như v y.

Cũng v i cách t ch c tương t như vi c ñánh s các ngôi nhà, h ñi u hành t ch c b
nh thành nh ng s ñơn nh t, tu n t , nên n u chúng ta nói ñ n v trí 1776 trong b nh
chúng ta bi t chính xác ô nh ñó vì ch có m t v trí v i ñ a ch như v y.

Toán t l y ñ a ch (&).
Vào th i ñi m mà chúng ta khai báo m t bi n thì nó ph i ñư c lưu tr trong m t v trí c
th trong b nh . Nói chung chúng ta không quy t ñ nh nơi nào bi n ñó ñư c ñ t - th t
may m n r ng ñi u ñó ñã ñư c làm t ñ ng b i trình biên d ch và h ñi u hành, nhưng
m t khi h ñi u hành ñã gán m t ñ a ch cho bi n thì chúng ta có th mu n bi t bi n ñó
ñư c lưu tr   ñâu.

ði u này có th ñư c th c hi n b ng cách ñ t trư c tên bi n m t d u và (&), có nghĩa là
"ñ a ch c a". Ví d :

ted = &andy;

s gán cho bi n ted ñ a ch c a bi n andy, vì khi ñ t trư c tên bi n andy d u và (&)
chúng ta không còn nói ñ n n i dung c a bi n ñó mà ch nói ñ n ñ a ch c a nó trong b
nh .

Gi s r ng bi n andy ñư c ñ t     ô nh có ñ a ch 1776 và chúng ta vi t như sau:

andy = 25;
fred = andy;
ted = &andy;

k t qu s gi ng như trong sơ ñ dư i ñây:




                                      Trang 54
Updatesofts.com                                                         Ebooks Team




Chúng ta ñã gán cho fred n i dung c a bi n andy như chúng ta ñã làm r t l n nhi u khác
trong nh ng ph n trư c nhưng v i bi n ted chúng ta ñã gán ñ a ch mà h ñi u hành lưu
giá tr c a bi n andy, chúng ta v a gi s nó là 1776.

Nh ng bi n lưu tr ñ a ch c a m t bi n khác (như ted trong ví d trư c) ñư c g i là
con tr . Trong C++ con tr có r t nhi u ưu ñi m và chúng ñư c s d ng r t thư ng
xuyên, Ti p theo chúng ta s th y các bi n ki u này ñư c khai báo như th nào.

Toán t tham chi u (*)
B ng cách s d ng con tr chúng ta có th truy xu t tr c ti p ñ n giá tr ñư c lưu tr
trong bi n ñư c tr b i nó b ng cách ñ trư c tên bi n con tr m t d u sao (*) - ñây có
th ñư c d ch là "giá tr ñư c tr b i". Vì v y, n u chúng ta vi t:

beth = *ted;

(chúng ta có th ñ c nó là: "beth b ng giá tr ñư c tr b i ted" beth s mang giá tr 25, vì
ted b ng 1776 và giá tr tr b i 1776 là 25.




B n ph i phân bi t ñư c r ng ted có giá tr 1776, nhưng *ted (v i m t d u sao ñ ng
trư c) tr t i giá tr ñư c lưu tr trong ñ a ch 1776, ñó là 25. Hãy chú ý s khác bi t gi a
vi c có hay không có d u sao tham chi u.
beth = ted;      // beth b ng ted ( 1776 )
beth = *ted;     // beth b ng giá tr ñư c tr         b i( 25 )
Toán t l y ñ a ch (&)



                                      Trang 55
Updatesofts.com                                                           Ebooks Team



Nó ñư c dùng như là m t ti n t c a bi n và có th ñư c d ch là "ñ a ch c a", vì v y
&variable1 có th ñư c ñ c là "ñ a ch c a variable1".

Toán t tham chi u (*)
Nó ch ra r ng cái c n ñư c tính toán là n i dung ñư c tr b i bi u th c ñư c coi như là
m t ñ a ch . Nó có th ñư c d ch là "giá tr ñư c tr b i"..
*mypointer ñư c ñ c là "giá tr ñư c tr b i mypointer".


Vào lúc này, v i nh ng ví d ñã vi t   trên

andy = 25;
ted = &andy;

b n có th d dàng nh n ra t t c các bi u th c sau là ñúng:
andy == 25
&andy == 1776
ted == 1776
*ted == 25


Khai báo bi n ki u con tr
Vì con tr có kh năng tham chi u tr c ti p ñ n giá tr mà chúng tr t i nên c n thi t ph i
ch rõ ki u d li u nào mà m t bi n con tr tr t i khai báo nó. Vì v y, khai báo c a m t
bi n con tr s có m u sau:

type * pointer_name;

trong ñó type là ki u d li u ñư c tr t i, không ph i là ki u c a b n thân con tr . Ví d :

int * number;
char * character;
float * greatnumber;

ñó là ba khai báo c a con tr . M i bi n ñ u tr t i m t ki u d li u khác nhau nhưng c
ba ñ u là con tr và chúng ñ u chi m m t lư ng b nh như nhau (kích thư c c a m t
bi n con tr tùy thu c vào h ñi u hành). nhưng d li u mà chúng tr t i không chi m
lư ng b nh như nhau, m t ki u int, m t ki u char và cái còn l i ki u float.

Tôi ph i nh n m nh l i r ng d u sao (*) mà chúng ta ñ t khi khai báo m t con tr ch có
nghĩa r ng: ñó là m t con tr và hoàn toàn không liên quan ñ n toán t tham chi u mà
chúng ta ñã xem xét trư c ñó. ðó ñơn gi n ch là hai tác v khác nhau ñư c bi u di n b i
cùng m t d u.

// my first pointer                          value1==10 / value2==20
#include <iostream.h>




                                       Trang 56
Updatesofts.com                                                        Ebooks Team



int main ()
{
  int value1 = 5, value2 = 15;
  int * mypointer;

  mypointer = &value1;
  *mypointer = 10;
  mypointer = &value2;
  *mypointer = 20;
  cout << "value1==" << value1 <<
"/ value2==" << value2;
  return 0;
}

Chú ý r ng giá tr c a value1 và value2 ñư c thay ñ i m t cách gián ti p. ð u tiên
chúng ta gán cho mypointer ñ a ch c a value1 dùng toán t l y ñ a ch (&) và sau ñó
chúng ta gán 10 cho giá tr ñư c tr b i mypointer, ñó là giá tr ñư c tr b i value1 vì
v y chúng ta ñã s a bi n value1 m t cách gián ti p

ð b n có th th y r ng m t con tr có th mang m t vài giá tr trong cùng m t chương
trình chúng ta s l p l i quá trình v i value2 và v i cùng m t con tr .

ðây là m t ví d ph c t p hơn m t chút:

// more pointers                            value1==10 / value2==20
#include <iostream.h>

int main ()
{
  int value1 = 5, value2 = 15;
  int *p1, *p2;

  p1 = &value1;    // p1 = ñ a ch
c a value1
  p2 = &value2;    // p2 = ñ a ch
c a value2
  *p1 = 10;        // giá tr tr
b i p1 = 10
  *p2 = *p1;       // giá tr tr
b i p2 = giá tr tr b i p1
  p1 = p2;         // p1 = p2
(phép gán con tr )
  *p1 = 20;        // giá tr tr
b i p1 = 20

  cout << "value1==" << value1 <<
"/ value2==" << value2;
  return 0;
}


M t dòng có th gây s chú ý c a b n là:



                                      Trang 57
Updatesofts.com                                                         Ebooks Team


int *p1, *p2;

dòng này khai báo hai con tr b ng cách ñ t d u sao (*) trư c m i con tr . Nguyên nhân
là ki u d li u khai báo cho c dòng là int và vì theo th t t ph i sang trái, d u sao
ñư c tính trư c tên ki u. Chúng ta ñã nói ñ n ñi u này trong bài 1.3: Các toán t .

Con tr và m ng.
Trong th c t , tên c a m t m ng tương ñương v i ñ a ch ph n t ñ u tiên c a nó, gi ng
như m t con tr tương ñương v i ñ a ch c a ph n t ñ u tiên mà nó tr t i, vì v y th c
t chúng hoàn toàn như nhau. Ví d , cho hai khai báo sau:

int numbers [20];
int * p;

l nh sau s h p l :

p = numbers;

   ñây p và numbers là tương ñương và chúng có cũng thu c tính, s khác bi t duy nh t
là chúng ta có th gán m t giá tr khác cho con tr p trong khi numbers luôn tr ñ n ph n
t ñ u tiên trong s 20 ph n t ki u int mà nó ñư c ñ nh nghĩa v i. Vì v y, không gi ng
như p - ñó là m t bi n con tr bình thư ng, numbers là m t con tr h ng. L nh gán sau
ñây là không h p l :

numbers = p;

b i vì numbers là m t m ng (con tr h ng) và không có giá tr nào có th ñư c gán cho
các h ng.

Vì con tr cũng có m i tính ch t c a m t bi n nên t t c các bi u th c có con tr trong ví
d dư i ñây là hoàn toàn h p l :

// more pointers                             10, 20, 30, 40, 50,
#include <iostream.h>

int main ()
{
  int numbers[5];
  int * p;
  p = numbers; *p = 10;
  p++; *p = 20;
  p = &numbers[2]; *p = 30;
  p = numbers + 3; *p = 40;
  p = numbers; *(p+4) = 50;
  for (int n=0; n<5; n++)
    cout << numbers[n] << ", ";
  return 0;




                                      Trang 58
Updatesofts.com                                                             Ebooks Team



}


Trong bài "m ng" chúng ta ñã dùng d u ngo c vuông ñ ch ra ph n t c a m ng mà
chúng ta mu n tr ñ n. C p ngo c vuông này ñư c coi như là toán t offset và ý nghĩa
c a chúng không ñ i khi ñư c dùng v i bi n con tr . Ví d , hai bi u th c sau ñây:

a[5] = 0;             // a [offset of 5] = 0
*(a+5) = 0;           // pointed by (a+5) = 0
là hoàn toàn   tương ñương và h p l b t k a là m   ng hay là m t con tr .

Kh i t o con tr
Khi khai báo con tr có th chúng ta s mu n ch ñ nh rõ ràng chúng s tr t i bi n nào,

int number;
int *tommy = &number;

là tương ñương v i:

int number;
int *tommy;
tommy = &number;

Trong m t phép gán con tr chúng ta ph i luôn luôn gán ñ a ch mà nó tr t i ch không
ph i là giá tr mà nó tr t i. B n c n ph i nh r ng khi khai báo m t bi n con tr , d u sao
(*) ñư c dùng ñ ch ra nó là m t con tr , và hoàn toàn khác v i toán t tham chi u. ðó
là hai toán t khác nhau m c dù chúng ñư c vi t v i cùng m t d u. Vì v y, các câu l nh
sau là không h p l :

int number;
int *tommy;
*tommy = &number;

Như ñ i v i m ng, trình biên d ch cho phép chúng ta kh i t o giá tr mà con tr tr t i
b ng giá tr h ng vào th i ñi m khai báo bi n con tr :

char * terry = "hello";

trong trư ng h p này m t kh i nh tĩnh ñư c dành ñ ch a "hello" và m t con tr tr
t i kí t ñ u tiên c a kh i nh này (ñó là kí t h') ñư c gán cho terry. N u "hello"
ñư c lưu t i ñ a ch 1702, l nh khai báo trên có th ñư c hình dung như th này:




                                       Trang 59
Updatesofts.com                                                         Ebooks Team




c n ph i nh c l i r ng terry mang giá tr 1702 ch không ph i là 'h' hay "hello".

Bi n con tr terry tr t i m t xâu kí t và nó có th ñư c s d ng như là ñ i v i m t
m ng (hãy nh r ng m t m ng ch ñơn thu n là m t con tr h ng). Ví d , n u chúng ta
mu n thay kí t 'o' b ng m t d u ch m than, chúng ta có th th c hi n vi c ñó b ng hai
cách:

terry[4] = '!';
*(terry+4) = '!';

hãy nh r ng vi t terry[4] là hoàn toàn gi ng v i vi t *(terry+4) m c dù bi u th c
thông d ng nh t là cái ñ u tiên. V i m t trong hai l nh trên xâu do terry tr ñ n s có
giá tr như sau:




Các phép tính s h c v i pointer
Vi c th c hi n các phép tính s h c v i con tr hơi khác so v i các ki u d li u s
nguyên khác. Trư c h t, ch phép c ng và tr là ñư c phép dùng. Nhưng c c ng và tr
ñ u cho k t qu ph thu c vào kích thư c c a ki u d li u mà bi n con tr tr t i.

Chúng ta th y có nhi u ki u d li u khác nhau t n t i và chúng có th chi m ch nhi u
hơn ho c ít hơn các ki u d li u khác. Ví d , trong các ki u s nguyên, char chi m 1
byte, short chi m 2 byte và long chi m 4 byte.

Gi s chúng ta có 3 con tr sau:

char *mychar;
short *myshort;
long *mylong;

và chúng l n lư t tr t i ô nh 1000, 2000 and 3000.



                                      Trang 60
Updatesofts.com                                                        Ebooks Team


N u chúng ta vi t

mychar++;
myshort++;
mylong++;

mychar - như b n mong ñ i - s mang giá tr 1001. Tuy nhiên myshort s mang giá tr
2002 và mylong mang giá tr 3004. Nguyên nhân là khi c ng thêm 1 vào m t con tr thì
nó s tr t i ph n t ti p theo có cùng ki u mà nó ñã ñư c ñ nh nghĩa, vì v y kích thư c
tính b ng byte c a ki u d li u nó tr t i s ñư c c ng thêm vào bi n con tr .




ði u này ñúng v i c hai phép toán c ng và tr ñ i v i con tr . Chúng ta cũng hoàn toàn
thu ñư c k t qu như trên n u vi t:

mychar = mychar + 1;
myshort = myshort + 1;
mylong = mylong + 1;

C n ph i c nh báo b n r ng c hai toán t tăng (++) và gi m (--) ñ u có quy n ưu tiên
l n hơn toán t tham chi u (*), vì v y bi u th c sau ñây có th d n t i k t qu sai:

*p++;
*p++ = *q++;

L nh ñ u tiên tương ñương v i *(p++) ñi u mà nó th c hi n là tăng p (ñ a ch ô nh mà
nó tr t i ch không ph i là giá tr tr t i).

L nh th hai, c hai toán t tăng (++) ñ u ñư c th c hi n sau khi giá tr c a *q ñư c gán
cho *p và sau ñó c q và p ñ u tăng lên 1. L nh này tương ñương v i:

*p = *q;
p++;
q++;




                                      Trang 61
Updatesofts.com                                                         Ebooks Team


Như ñã nói trong các bài trư c, tôi khuyên các b n nên dùng các c p ngo c ñơn ñ tránh
nh ng k t qu không mong mu n.

Con tr tr t i con tr
C++ cho phép s d ng các con tr tr t i các con tr khác gi ng như là tr t i d li u. ð
làm vi c ñó chúng ta ch c n thêm m t d u sao (*) cho m i m c tham chi u.

char a;
char * b;
char ** c;
a = 'z';
b = &a;
c = &b;

gi s r ng a,b,c ñư c lưu   các ô nh 7230, 8092 and 10502, ta có th mô t ño n mã
trên như sau:




ði m m i trong ví d này là bi n c, chúng ta có th nói v nó theo 3 cách khác nhau, m i
cách s tương ng v i m t giá tr khác nhau:

c là m t bi n có ki u (char **) mang giá tr 8092
*c là m t bi n có ki u (char*) mang giá tr 7230
**c là m t bi n có ki u (char) mang giá tr 'z'


Con tr không ki u
Con tr không ki u là m t lo i con tr ñ c bi t. Nó có th tr t i b t kì lo i d li u nào,
t giá tr nguyên ho c th c cho t i m t xâu kí t . H n ch duy nh t c a nó là d li u
ñư c tr t i không th ñư c tham chi u t i m t cách tr c ti p (chúng ta không th dùng
toán t tham chi u * v i chúng) vì ñ dài c a nó là không xác ñ nh và vì v y chúng ta
ph i dùng ñ n toán t chuy n ki u d li u hay phép gán ñ chuy n con tr không ki u
thành m t con tr tr t i m t lo i d li u c th .

M t trong nh ng ti n ích c a nó là cho phép truy n tham s cho hàm mà không c n ch
rõ ki u

// integer increaser                         6, 10, 13
#include <iostream.h>

void increase (void* data, int




                                      Trang 62
Updatesofts.com                                                        Ebooks Team



type)
{
  switch (type)
  {
    case sizeof(char) :
(*((char*)data))++; break;
    case sizeof(short):
(*((short*)data))++; break;
    case sizeof(long) :
(*((long*)data))++; break;
  }
}

int main ()
{
  char a = 5;
  short b = 9;
  long c = 12;
  increase (&a,sizeof(a));
  increase (&b,sizeof(b));
  increase (&c,sizeof(c));
  cout << (int) a << ", " << b <<
", " << c;
  return 0;
}

sizeof   là m t toán t c a ngôn ng C++, nó tr v m t giá tr h ng là kích thư c tính
b ng byte c a tham s truy n cho nó, ví d sizeof(char) b ng 1 vì kích thư c c a char
là 1 byte.

Con tr hàm
C++ cho phép thao tác v i các con tr hàm. Ti n ích tuy t v i này cho phép truy n m t
hàm như là m t tham s ñ n m t hàm khác. ð có th khai báo m t con tr tr t i m t
hàm chúng ta ph i khai báo nó như là khai báo m u c a m t hàm nhưng ph i bao trong
m t c p ngo c ñơn () tên c a hàm và chèn d u sao (*) ñ ng trư c.
// pointer to functions                     8
#include <iostream.h>

int addition (int a, int b)
{ return (a+b); }

int subtraction (int a, int b)
{ return (a-b); }

int (*minus)(int,int) =
subtraction;

int operation (int x, int y, int
(*functocall)(int,int))
{
  int g;




                                      Trang 63
Updatesofts.com                                                       Ebooks Team



    g = (*functocall)(x,y);
    return (g);
}

int main ()
{
  int m,n;
  m = operation (7, 5, &addition);
  n = operation (20, m, minus);
  cout <<n;
  return 0;
}

Trong ví d này, minus là m t con tr toàn c c tr t i m t hàm có hai tham s ki u int,
con tr này ñư c gám ñ tr t i hàm subtraction, t t c ñ u trên m t dòng:

int (* minus)(int,int) = subtraction;




                                     Trang 64
Updatesofts.com                                                        Ebooks Team



B nh ñ ng


Cho ñ n nay, trong các chương trình c a chúng ta, t t c nh ng ph n b nh chúng ta có
th s d ng là các bi n các m ng và các ñ i tư ng khác mà chúng ta ñã khai báo. Kích c
c a chúng là c ñ nh và không th thay ñ i trong th i gian chương trình ch y. Nhưng n u
chúng ta c n m t lư ng b nh mà kích c c a nó ch có th ñư c xác ñ nh khi chương
trình ch y, ví d như trong trư ng h p chúng ta nh n thông tin t ngư i dùng ñ xác ñ nh
lư ng b nh c n thi t.

Gi i pháp ñây chính là b nh ñ ng, C++ ñã tích h p hai toán t new và delete ñ th c
hi n vi c này

          Hai toán t new và delete ch có trong C++. ph n sau c a bài chúng ta s
          bi t nh ng thao tác tương ñương v i các toán t này trong C.


Toán t new và new[ ]
ð có th có ñư c b nh ñ ng chúng ta có th dùng toán t new. Theo sau toán t này
là tên ki u d li u và có th là s ph n t c n thi t ñư c ñ t trong c p ngo c vuông. Nó
tr v m t con tr tr t i ñ u c a kh i nh v a ñư c c p phát. D ng th c c a toán t này
như sau:

pointer = new type

ho c
pointer = new type [elements]
Bi u th c ñ u tien ñư c dùng ñ c p phát b nh ch a m t ph n t có ki u type. L nh
th hai ñư c dùng ñ c p phát m t kh i nh (m t m ng) g m các ph n t ki u type.
Ví d :

int * bobby;
bobby = new int [5];

trong trư ng h p này, h ñi u hành dành ch cho 5 ph n t ki u int trong b nh và tr
v m t con tr tr ñ n ñ u c a kh i nh . Vì v y lúc này bobby tr ñ n m t kh i nh h p
l g m 5 ph n t int.




B n có th h i tôi là có gì khác nhau gi a vi c khai báo m t m ng v i vi c c p phát b
nh cho m t con tr như chúng ta v a làm. ði u quan tr ng nh t là kích thư c c a m t


                                      Trang 65
Updatesofts.com                                                           Ebooks Team


m ng ph i là m t h ng, ñi u này gi i h n kích thư c c a m ng ñ n kích thư c mà chúng
ta ch n khi thi t k chương trình trong khi ñó c p phát b nh ñ ng cho phép c p phát b
nh trong quá trình ch y v i kích thư c b t kì.

B nh ñ ng nói chung ñư c qu n lí b i h ñi u hành và trong các môi trư ng ña nhi m
có th ch y m t lúc vài chương trình có m t kh năng có th x y ra là h t b nh ñ c p
phát. N u ñi u này x y ra và h ñi u hành không th c p phát b nh như chúng ta yêu
c u v i toán t new, m t con tr null (zero) s ñư c tr v . Vì v y các b n nên ki m tra
xem con tr tr v b i toán t new có b ng null hay không:

int * bobby;
bobby = new int [5];
if (bobby == NULL) {
  // error assigning memory. Take measures.
  };

Toán t delete.
Vì b nh ñ ng ch c n thi t trong m t kho ng th i gian nh t ñ nh, khi nó không c n
dùng ñ n n a thì nó s ñư c gi i phóng ñ có th c p phát cho các nhu c u khác trong
tương lai. ð th c hi n vi c này ta dùng toán t delete, d ng th c c a nó như sau:

delete pointer;

ho c
delete [] pointer;
Bi u th c ñ u tiên nên ñư c dùng ñ gi i phóng b nh ñư c c p phát cho m t ph n t
và l nh th hai dùng ñ gi i phóng m t kh i nh g m nhi u ph n t (m ng). Trong h u
h t các trình d ch c hai bi u th c là tương ñương m c dù chúng là rõ ràng là hai toán t
khác nhau.
// rememb-o-matic                            How many numbers do you want to
#include <iostream.h>                        type in? 5
#include <stdlib.h>                          Enter number : 75
                                             Enter number : 436
int main ()                                  Enter number : 1067
{                                            Enter number : 8
  char input [100];                          Enter number : 32
  int i,n;                                   You have entered: 75, 436, 1067, 8,
  long * l, total = 0;                       32,
  cout << "How many numbers do you
want to type in? ";
  cin.getline (input,100); i=atoi
(input);
  l= new long[i];
  if (l == NULL) exit (1);
  for (n=0; n<i; n++)
  {
    cout << "Enter number: ";
    cin.getline (input,100);
l[n]=atol (input);
  }




                                       Trang 66
Updatesofts.com                                                        Ebooks Team



    cout << "You have entered: ";
    for (n=0; n<i; n++)
      cout << l[n] << ", ";
    delete[] l;
    return 0;
}


NULL là m t h ng s ñư c ñ nh nghĩa trong thư vi n C++ dùng ñ bi u th con tr null.
Trong trư ng h p h ng s này chưa ñ nh nghĩa b n có th t ñ nh nghĩa nó:

#define NULL 0

Dùng 0 hay NULL khi ki m tra con tr là như nhau nhưng vi c dùng NULL v i con tr
ñư c s d ng r t r ng rãi và ñi u này ñư c khuy n khích ñ giúp cho chương trình d
ñ c hơn.

B nh ñ ng trong ANSI-C
Toán t new và delete là ñ c quy n C++ và chúng không có trong ngôn ng C. Trong
ngôn ng C, ñ có th s d ng b nh ñ ng chúng ta ph i s d ng thư vi n stdlib.h.
Chúng ta s xem xét cách này vì nó cũng h p l trong C++ và nó v n còn ñư c s d ng
trong m t s chương trình.

Hàm malloc
ðây là m t hàm t ng quát ñ c p phát b nh ñ ng cho con tr . C u trúc c a nó như sau:

void * malloc (size_t nbytes);

trong ñó nbytes là s byte chúng ta mu n gán cho con tr . Hàm này tr v m t con tr
ki u void*, vì v y chúng ta ph i chuy n ñ i ki u sang ki u c a con tr ñích, ví d :

char * ronny;
ronny = (char *) malloc (10);

ðo n mã này c p phát cho con tr ronny m t kh i nh 10 byte. Khi chúng ta mu n c p
phát m t kh i d li u có ki u khác char (l n hơn 1 byte) chúng ta ph i nhân s ph n t
mong mu n v i kích thư c c a chúng. Th t may m n là chúng ta có toán t sizeof, toán
t này tr v kích thư c c a m t ki u d li u c th .

int * bobby;
bobby = (int *) malloc (5 * sizeof(int));

ðo n mã này c p phát cho bobby m t kh i nh g m 5 s nguyên ki u int, kích c c a
ki u d li u này có th b ng 2, 4 hay hơn tùy thu c vào h th ng mà chương trình ñư c
d ch.




                                      Trang 67
Updatesofts.com                                                        Ebooks Team


Hàm calloc.
calloc ho t ñ ng r t gi ng v i malloc, s khác nhau ch y u là khai báo m u c a nó:

void * calloc (size_t nelements, size_t size);

nó s d ng hai tham s thay vì m t. Hai tham s này ñư c nhân v i nhau ñ có ñư c kích
thư c t ng c ng c a kh i nh c n c p phát. Thông thư ng tham s ñ u tiên (nelements)
là s ph n t và tham s th c hai (size) là kích thư c c a m i ph n t . Ví d , chúng ta
có th ñ nh nghĩa bobby v i calloc như sau:

int * bobby;
bobby = (int *) calloc (5, sizeof(int));

M t ñi m khác nhau n a gi a malloc và calloc là calloc kh i t o t t c các ph n t
c a nó v 0.

Hàm realloc.
Nó thay ñ i kích thư c c a kh i nh ñã ñư c c p phát cho m t con tr .

void * realloc (void * pointer, size_t size);

tham s pointer nh n vào m t con tr ñã ñư c c p phát b nh hay m t con tr null, và
size ch ñ nh kích thư c c a kh i nh m i. Hàm này s c p phát size byte b nh cho
con tr . Nó có th ph i thay ñ i v v trí c a kh i nh ñ có th ñ ch cho kích thư c
m i c a kh i nh , trong trư ng h p này n i dung hi n th i c a kh i nh ñư c copy t i v
trí m i ñ ñ m b o d li u không b m t. Con tr m i tr t i kh i nh ñư c hàm tr v .
N u không th thay ñ i kích thư c c a kh i nh thì hàm s tr v m t con tr null nhưng
tham s pointer và n i dung c a nó s không b thay ñ i.

Hàm free.
Hàm này gi i phóng m t kh i nh ñ ng ñã ñư c c p phát b i malloc, calloc ho c
realloc.

void free (void * pointer);

Hàm này ch ñư c dùng ñ gi i phóng b nh ñư c c p phát b i các hàm malloc,
callocand realloc.




                                     Trang 68
Updatesofts.com                                                          Ebooks Team



Các c u trúc

Các c u trúc d li u.
M t c u trúc d li u là m t t p h p c a nh ng ki u d li u khác nhau ñư c g p l i v i
m t cái tên duy nh t. D ng th c c a nó như sau:
struct model_name {
   type1 element1;
   type2 element2;
   type3 element3;
   .
   .
} object_name;
trong ñó model_name là tên c a m u ki u d li u và tham s tùy ch n object_name m t
tên h p l cho ñ i tư ng. Bên trong c p ngo c nh n là tên các ph n t c a c u trúc và
ki u c a chúng.

N u ñ nh nghĩa c a c u trúc bao g m tham s model_name (tuỳ ch n), tham s này tr
thành m t tên ki u h p l tương ñương v i c u trúc. Ví d :

struct products {
  char name [30];
  float price;
} ;

products apple;
products orange, melon;
Chúng ta ñã ñ nh nghĩa c u trúc products v i hai trư ng: name và price, m i trư ng có
m t ki u khác nhau. Chúng ta cũng ñã s d ng tên c a ki u c u trúc (products) ñ khai
báo ba ñ i tư ng có ki u ñó : apple, orange và melon.

Sau khi ñư c khai báo, products tr thành m t tên ki u h p l gi ng các ki u cơ b n
như int, char hay short.

Trư ng tuỳ ch n object_name có th n m cu i c a ph n khai báo c u trúc dùng ñ
khai báo tr c ti p ñ i tư ng có ki u c u trúc. Ví d , ñ khai báo các ñ i tư ng apple,
orange và melon như ñã làm ph n trư c chúng ta cũng có th làm theo cách sau:

struct products {
  char name [30];
  float price;
} apple, orange, melon;
Hơn n a, trong trư ng h p này tham s model_name tr thành tuỳ ch n. M c dù n u
model_name không ñư c s d ng thì chúng ta s không th khai báo thêm các ñ i tư ng
có ki u m u này.




                                       Trang 69
Updatesofts.com                                                          Ebooks Team


M t ñi u quan tr ng là c n phân bi t rõ ràng ñâu là ki u m u c u trúc, ñâu là ñ i tư ng
c u trúc. N u dùng các thu t ng chúng ta ñã s d ng v i các bi n, ki u m u là tên ki u
d li u còn ñ i tư ng là các bi n.

Sau khi ñã khai báo ba ñ i tư ng có ki u là m t m u c u trúc xác ñ nh (apple, orange
and melon) chúng ta có th thao tác v i các trư ng t o nên chúng. ð làm vi c này chúng
ta s d ng m t d u ch m (.) chèn gi a tên ñ i tư ng và tên trư ng. Ví d , chúng ta có
th thao tác v i b t kì ph n t nào c a c u trúc như là ñ i v i các bi n chu n :

apple.name
apple.price
orange.name
orange.price
melon.name
melon.price

m i trư ng có ki u d li u tương ng: apple.name, orange.name và melon.name có
ki u char[30], và apple.price, orange.price và melon.price có ki u float.

Chúng ta t m bi t apples, oranges và melons ñ ñ n v i m t ví d v các b phim:

// example about structures                  Enter title: Alien
#include <iostream.h>                        Enter year: 1979
#include <string.h>
#include <stdlib.h>                          My favourite movie is:
                                              2001 A Space Odyssey (1968)
struct movies_t {                            And yours:
  char title [50];                            Alien (1979)
  int year;
} mine, yours;

void printmovie (movies_t movie);

int main ()
{
  char buffer [50];

  strcpy (mine.title, "2001 A Space
Odyssey");
  mine.year = 1968;

  cout << "Enter title: ";
  cin.getline (yours.title,50);
  cout << "Enter year: ";
  cin.getline (buffer,50);
  yours.year = atoi (buffer);

  cout << "My favourite movie is:\n
";
  printmovie (mine);
  cout << "And yours:\n ";
  printmovie (yours);



                                       Trang 70
Updatesofts.com                                                       Ebooks Team



    return 0;
}

void printmovie (movies_t movie)
{
  cout << movie.title;
  cout << " (" << movie.year <<
")\n";
}



Ví d này cho chúng ta th y cách s d ng các ph n t c a m t c u trúc và b n thân c u
trúc như là các bi n thông thư ng. Ví d , yours.year là m t bi n h p l có ki u int
cũng như mine.title là m t m ng h p l v i 50 ph n t ki u chars.

Chú ý r ng c mine and yours ñ u ñư c coi là các bi n h p l ki u movie_t khi ñư c
truy n cho hàm printmovie().Hơn n a m t l i th quan tr ng c a c u trúc là chúng ta
có th xét các ph n t c a chúng m t cách riêng bi t ho c toàn b c u trúc như là m t
kh i.

Các c u trúc ñư c s d ng r t nhi u ñ xây d ng cơ s d li u ñ c bi t n u chúng ta xét
ñ n kh năng xây d ng các m ng c a chúng.

// array of structures                     Enter   title: Alien
#include <iostream.h>                      Enter   year: 1979
#include <stdlib.h>                        Enter   title: Blade Runner
                                           Enter   year: 1982
#define N_MOVIES 5                         Enter   title: Matrix
                                           Enter   year: 1999
struct movies_t {                          Enter   title: Rear Window
  char title [50];                         Enter   year: 1954
  int year;                                Enter   title: Taxi Driver
} films [N_MOVIES];                        Enter   year: 1975

void printmovie (movies_t movie);          You have entered these movies:
                                           Alien (1979)
int main ()                                Blade Runner (1982)
{                                          Matrix (1999)
  char buffer [50];                        Rear Window (1954)
  int n;                                   Taxi Driver (1975)
  for (n=0; n<N_MOVIES; n++)
  {
    cout << "Enter title: ";
    cin.getline
(films[n].title,50);
    cout << "Enter year: ";
    cin.getline (buffer,50);
    films[n].year = atoi (buffer);
  }
  cout << "\nYou have entered these
movies:\n";




                                     Trang 71
Updatesofts.com                                                        Ebooks Team



    for (n=0; n<N_MOVIES; n++)
      printmovie (films[n]);
    return 0;
}

void printmovie (movies_t movie)
{
  cout << movie.title;
  cout << " (" << movie.year <<
")\n";
}




Con tr tr ñ n c u trúc
Như b t kì các ki u d li u nào khác, các c u trúc có th ñư c tr ñ n b i con tr . Quy
t c hoàn toàn gi ng như ñ i v i b t kì ki u d li u cơ b n nào:
struct movies_t {
  char title [50];
  int year;
};

movies_t amovie;
movies_t * pmovie;
  ñây amovie là m t ñ i tư ng có ki u movies_t và pmovie là m   t con tr tr t i ñ i
tư ng movies_t. OK, bây gi chúng ta s ñ n v i m t ví d khác,    nó s gi i thi u m t
toán t m i:
// pointers to structures                   Enter title: Matrix
#include <iostream.h>                       Enter year: 1999
#include <stdlib.h>
                                            You have entered:
struct movies_t {                           Matrix (1999)
  char title [50];
  int year;
};


int main ()
{
  char buffer[50];

    movies_t amovie;
    movies_t * pmovie;
    pmovie = & amovie;

    cout << "Enter title: ";
    cin.getline (pmovie->title,50);
    cout << "Enter year: ";
    cin.getline (buffer,50);
    pmovie->year = atoi (buffer);

    cout << "\nYou have entered:\n";



                                      Trang 72
Updatesofts.com                                                          Ebooks Team



  cout << pmovie->title;
  cout << " (" << pmovie->year <<
")\n";

    return 0;
}




ðo n mã trên gi i thi u m t ñi u quan tr ng: toán t ->. ðây là m t toán t tham chi u
ch dùng ñ tr t i các c u trúc và các l p (class). Nó cho phép chúng ta không ph i dùng
ngo c m i khi tham chi u ñ n m t ph n t c a c u trúc. Trong ví d này chúng ta s
d ng:

movies->title

nó có th ñư c d ch thành:

(*movies).title

c hai bi u th c movies->title và (*movies).title ñ u h p l và chúng ñ u dùng ñ
tham chi u ñ n ph n t title c a c u trúc ñư c tr b i movies. B n c n phân bi t rõ
ràng v i:

*movies.title

nó tương ñương v i

*(movies.title)

l nh này dùng ñ tính toán giá tr ñư c tr b i ph n t title c a c u trúc movies, trong
trư ng h p này (title không ph i là m t con tr ) nó ch ng có ý nghĩa gì nhi u. B n dư i
ñây t ng k t t t c các k t h p có th ñư c gi a con tr và c u trúc:
Bi u th c        Mô t                                                 Tương ñương v i
movies.title     Ph n t title c a c u trúc movies
movies->title    Ph n t title c a c u trúc ñư c tr b i movies         (*movies).title

*movies.title    Giá tr ñư c tr b i ph n t title c a c u trúc         *(movies.title)
                 movies


Các c u trúc l ng nhau
Các c u trúc có th ñư c ñ t l ng nhau vì v y m t ph n t h p l c a m t c u trúc có th
là m t c u trúc khác.
struct movies_t {
  char title [50];



                                       Trang 73
Updatesofts.com                                                           Ebooks Team


    int year;
}

struct friends_t {
  char name [50];
  char email [50];
  movies_t favourite_movie;
  } charlie, maria;

friends_t * pfriends = &charlie;
Vì v y, sau ph n khai báo trên chúng ta có th s d ng các bi u th c sau:

charlie.name
maria.favourite_movie.title
charlie.favourite_movie.year
pfriends->favourite_movie.year

(trong ñó hai bi u th c cu i cùng là tương ñương).

Các khái ni m cơ b n v c u trúc ñư c ñ c p ñ n trong ph n này là hoàn toàn gi ng v i
ngôn ng C, tuy nhiên trong C++, c u trúc ñã ñư c m r ng thêm các ch c năng c a m t
l p v i tính ch t ñ c trưng là t t c các ph n t c a nó ñ u là công c ng (public). B n s
có thêm các thông tin chi ti t trong ph n




                                       Trang 74
Updatesofts.com                                                         Ebooks Team



Các ki u d li u t ñ nh nghĩa.


Trong bài trư c chúng ta ñã xem xét m t lo i d li u ñư c ñ nh nghĩa b i ngư i dùng
(ngư i l p trình): c u trúc. Nhưng có còn nhi u ki u d li u t ñ nh nghĩa khác:

T ñ nh nghĩa các ki u d li u (typedef).
C++ cho phép chúng ta ñ nh nghĩa các ki u d li u c a riêng mình d a trên các ki u d
li u ñã có. ð có th làm vi c ñó chúng ta s s d ng t khoá typedef, d ng th c như
sau:

typedef     existing_type      new_type_name ;

trong ñó existing_type là m t ki u d li u cơ b n hay b t kì m t ki u d li u ñã ñ nh
nghĩa và new_type_name là tên c a ki u d li u m i. Ví d

typedef   char C;
typedef   unsigned int WORD;
typedef   char * string_t;
typedef   char field [50];

Trong trư ng h p này chúng ta ñã ñ nh nghĩa b n ki u d li u m i: C, WORD, string_t
và field ki u char, unsigned int, char* ki u char[50], chúng ta hoàn toàn có th s
d ng chúng như là các ki u d li u h p l :
C achar, anotherchar, *ptchar1;
WORD myword;
string_t ptchar2;
field name;
typedef có th h u d ng khi b n mu n     ñ nh nghĩa m t ki u d li u ñư c dùng l p ñi l p
l i trong chương trình ho c ki u d li u b n mu n dùng có tên quá dài và b n mu n nó
có tên ng n hơn.

Union
Union cho phép m t ph n b nh có th ñư c truy xu t dư i d ng nhi u ki u d li u
khác nhau m c dù t t c chúng ñ u n m cùng m t v trí trong b nh . Ph n khai báo và
s d ng nó tương t v i c u trúc nhưng ch c năng thì khác hoàn toàn:
union model_name {
  type1 element1;
  type2 element2;
  type3 element3;
  .
  .
} object_name;




                                      Trang 75
Updatesofts.com                                                       Ebooks Team


T t c các ph n t c a union ñ u chi m cùng m t ch trong b nh . Kích thư c c a nó là
kích thư c c a ph n t l n nh t. Ví d :
union mytypes_t {
  char c;
  int i;
  float f;
  } mytypes;
ñ nh nghĩa ba ph n t

mytypes.c
mytypes.i
mytypes.f

m i ph n t có m t ki u d li u khác nhau. Nhưng vì t t c chúng ñ u n m cùng m t ch
trong b nh nên b t kì s thay ñ i nào ñ i v i m t ph n t s nh hư ng t i t t c các
thành ph n còn l i.

M t trong nh ng công d ng c a union là dùng ñ k t h p m t ki u d liêu cơ b n v i
m t m ng hay các c u trúc g m các ph n t nh hơn. Ví d :

union mix_t{
  long l;
  struct {
    short hi;
    short lo;
    } s;
  char c[4];
} mix;
ñ nh nghĩa ba ph n t cho phép chúng ta truy xu t ñ n cùng m t nhóm 4 byte: mix.l,
mix.s và mix.c mà chúng ta có th s d ng tuỳ theo vi c chúng ta mu n truy xu t ñ n
nhóm 4 byte này như th nào. Tôi dùng nhi u ki u d li u khác nhau, m ng và c u trúc
trong union ñ b n có th th y các cách khác nhau mà chúng ta có th truy xu t d li u.




Các unions vô danh
Trong C++ chúng ta có th s d ng các unions vô danh. N u chúng ta ñ t m t union
trong m t c u trúc mà không ñ tên (ph n ñi sau c p ngo c nh n { }) union s tr thành
vô danh và chúng ta có th truy xu t tr c ti p ñ n các ph n t c a nó mà không c n ñ n
tên c a union (có c n cũng không ñư c). Ví d , hãy xem xét s khác bi t gi a hai ph n
khai báo sau ñây:
                  union                                  union vô danh



                                     Trang 76
Updatesofts.com                                                         Ebooks Team



struct {                                    struct {
  char title[50];                             char title[50];
  char author[50];                            char author[50];
  union {                                     union {
    float dollars;                              float dollars;
    int yens;                                   int yens;
  } price;                                    };
} book;                                     } book;


S khác bi t duy nh t gi a hai ño n mã này là trong ño n mã ñ u tiên chúng ta ñ t tên
cho union (price) còn trong cái th hai thì không. Khi truy nh p vào các ph n t
dollars và yens, trong trư ng h p th nh t chúng ta vi t:

book.price.dollars
book.price.yens

còn trong trư ng h p th hai:

book.dollars
book.yens

M t l n n a tôi nh c l i r ng vì nó là m t union, hai trư ng dollars và yens ñ u chi m
cùng m t ch trong b nh nên chúng không th gi hai giá tr khác nhau.

Ki u li t kê (enum)
Ki u d li u li t kê dùng ñ t o ra các ki u d li u ch a m t cái gì ñó hơi ñ c bi t m t
chút, không ph i ki u s hay ki u kí t ho c các h ng true và false. D ng th c c a nó
như sau:
enum model_name {
  value1,
  value2,
  value3,
  .
  .
} object_name;
Ví d , chúng ta có th t o ra m t ki u d li u m i có tên color ñ lưu tr các màu v i
ph n khai báo như sau:

enum colors_t {black, blue, green, cyan, red, purple, yellow, white};

Chú ý r ng chúng ta không s d ng b t kì m t ki u d li u cơ b n nào trong ph n khai
báo. Chúng ta ñã t o ra m t ki u d li u m i mà không d a trên b t kì ki u d li u nào
có s n: ki u color_t, nh ng giá tr có th c a ki u color_t ñư c vi t trong c p ngo c
nh n {}. Ví d , sau khi khai báo ki u li t kê, bi u th c sau s là h p l :
colors_t mycolor;

mycolor = blue;
if (mycolor == green) mycolor = red;



                                      Trang 77
Updatesofts.com                                                            Ebooks Team


Trên th c t ki u d li u li t kê ñư c d ch là m t s nguyên và các giá tr c a nó là các
h ng s nguyên ñư c ch ñ nh. N u ñi u này không ñ oc ch ñ nh, giá tr nguyên tương
ñương v i ph n t ñ u tiên là 0 và các giá tr ti p theo c th tăng lên 1, Vì v y, trong
ki u d li u colors_t mà chúng ta ñ nh nghĩa trên, white tương ñương v i 0, blue
tương ñương v i 1, green tương ñương v i 2 và c ti p t c như th .

N u chúng ta ch ñ nh m t giá tr nguyên cho m t giá tr nào ñó c a ki u d li u li t kê
(trong ví d này là ph n t ñ u tiên) các giá tr ti p theo s là các giá tr nguyên ti p theo,
ví d :

enum months_t { january=1, february, march, april,
                   may, june, july, august,
                   september, october, november, december} y2k;
trong trư ng h p này, bi n y2k có ki u d li u li t kê months_t có th ch a m t trong 12
giá tr t january ñ n december và tương ñương v i các giá tr nguyên t 1 ñ n 12,
không ph i 0 ñ n 11 vì chúng ta ñã ñ t january b ng 1.




                                        Trang 78

				
DOCUMENT INFO
Shared By:
Categories:
Tags:
Stats:
views:1
posted:5/3/2011
language:Vietnamese
pages:79