You are on page 1of 197

TS.

Nguyễn Ngöc Cương (Chủ biên)


ThS. Nguyễn Đình Nghïa - ThS. Đỗ Quốc Huy - CN. Trần Nghi Phú - KS. Phạm Thành Công

NHμ XUÊT B¶N TH¤NG TIN Vμ TRUYÒN TH¤NG


M· sè: GD 14 HM 11
LỜI NÓI ĐẦU

Từ ngàn năm nay, con người liên lạc với nhau thông qua ngôn 
ngữ,  tạo  ra  các  mẫu  từ  ngữ  và  âm  thanh.  Ngôn  ngữ  lập  trình  cũng 
tương tự như vậy, đó là một tập từ ngữ và ký hiệu cho phép lập trình 
viên hoặc người dùng có thể tương tác với máy tính. Việc hiểu biết 
và nắm vững các ngôn ngữ lập trình là yêu cầu bắt buộc đối với các 
lập trình viên. Mặc dù đã có hàng trăm ngôn ngữ lập trình được sinh 
ra, song chỉ có một số ít là được sử dụng rộng rãi và được xem là một 
chuẩn công nghiệp. Các ngôn ngữ này đều có thể được sử dụng trên 
nhiều loại máy tính khác nhau. Hiện nay, ngôn ngữ lập trình C/C++ 
là ngôn ngữ bậc cao đang được sử dụng khá rộng rãi trong lập trình.  
Nhằm  giúp  các  bạn  sinh  viên,  nghiên  cứu  sinh  và  các  lập  trình 
viên    có  được  một  tài  liệu  chuẩn  về  ngôn  ngữ  lập  trình  C/C++,  Nhà 
xuất  bản  Thông  tin  và  Truyền  thông  trân  trọng  giới  thiệu  cuốn  sách 
“Giáo  trình  ngôn  ngữ  lập  trình  C/C++ʺ  do  TS.  Nguyễn  Ngọc  Cương 
(Trưởng khoa Toán tin, Học viện An ninh Nhân dân) làm chủ biên. 
Nội dung cuốn sách gồm 7 chương: 
Chương 1: Giới thiệu C/C++ 
Chương 2: Sử dụng các phép toán của C/C++ 
Chương 3: Sử dụng các lệnh của C/C++ 
Chương 4: Mảng và con trỏ 
Chương 5: Cấu trúc và vào/ra tệp 
Chương 6: Kỹ thuật đồ họa trong C/C++ 
Chương 7: Giới thiệu lập trình hướng đối tượng 
Hy vọng cuốn sách không chỉ dành riêng cho các Học viên Học 
viện An ninh Nhân dân, Học viện Cảnh sát, còn là tài liệu tham khảo 
bổ  ích  cho các  cán  bộ  giảng  dạy, sinh  viên  các  trường đại  học  cũng 
như  các  kỹ  sư,  kỹ  thuật  viên  chuyên  ngành  Công  nghệ  Thông  tin, 
Điện tử Viễn thông và Tự động hóa. 
Nhà xuất bản xin trân trọng giới thiệu cùng bạn đọc và rất mong 
nhận được ý kiến đóng góp của quý vị. Mọi ý kiến đóng góp xin gửi 
về Nhà xuất bản Thông tin và Truyền thông ‐ 18 Nguyễn Du, Hà Nội 
hoặc gửi trực tiếp cho tác giả theo địa chỉ: cuongnnhvan@yahoo.com. 
Xin trân trọng cảm ơn./. 

NXB THÔNG TIN VÀ TRUYỀN THÔNG 
 
Ch−¬ng 1: Giíi thiÖu C/C++ 5

Chương 1 

GIỚI THIỆU C/C++

Ng«n ng÷ C/C++ lμ mét trong c¸c ng«n ng÷ lËp tr×nh ®−îc sö dông
réng r·i nhÊt trªn thÕ giíi. §· cã rÊt nhiÒu c«ng ty tin häc x©y dùng
ch−¬ng tr×nh dÞch cho ng«n ng÷ C/C++ mμ dÉn ®Çu lμ Borland vμ
Microsoft. HiÖn nay ng«n ng÷ C/C++ ®· trë thμnh c«ng cô chuÈn,
hiÖu qu¶ vμ th«ng dông cho c¸c lËp tr×nh viªn chuyªn nghiÖp.

1.1. LÞch sö C/C++


Nh÷ng n¨m cuèi cña thËp kû 60 ®Çu 1970, xuÊt hiÖn yªu cÇu cÇn
cã ng«n ng÷ bËc cao ®Ó hç trî c¸c nhµ tin häc trong viÖc x©y dùng
phÇn mÒm hÖ thèng, hÖ ®iÒu hµnh vµ do ®ã ®· ra ®êi ng«n ng÷ C t¹i
phßng thÝ nghiÖm ®iÖn tho¹i Bell Labs (Mü) ®Ó viÕt hÖ ®iÒu hµnh Unix
cho m¸y tÝnh mini PDP11 cña c«ng ty DEC (Mü) vµ trë nªn rÊt quen
thuéc víi c¸c chuyªn gia tin häc.
Vµo nh÷ng n¨m 1980, Bjourn Stroustrup, lµm viÖc t¹i C«ng ty
§iÖn b¸o vµ §iÖn tho¹i (AT&T - American Telephone & Telegraph) ®·
bæ sung c¸c ®Æc tÝnh míi “h−íng ®èi t−îng” cho ng«n ng÷ C. C¸c kh¸i
niÖm vÒ lËp tr×nh h−íng ®èi t−îng ®· cã tr−íc ®ã trong c¸c ng«n ng÷
lËp tr×nh kh¸c nh− Smalltalk, nh−ng C++ lµ ng«n ng÷ lËp tr×nh h−íng
®èi t−îng m¹nh.

1.2. Ch−¬ng tr×nh m¸y tÝnh lμ g×?


Ch−¬ng tr×nh m¸y tÝnh lµ d·y c¸c lÖnh cho m¸y tÝnh biÕt cÇn ph¶i
thùc hiÖn.
C/C++ lµ ng«n ng÷ lËp tr×nh m¸y tÝnh gióp chóng ta x©y dùng
ch−¬ng tr×nh ®Ó m¸y tÝnh thùc hiÖn ®óng c¸c c«ng viÖc mµ ta yªu cÇu.
6 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

§Ó cung cÊp c¸c lÖnh cho m¸y tÝnh b»ng ng«n ng÷ lËp tr×nh
C/C++ chóng ta cÇn cã ch−¬ng tr×nh so¹n th¶o (Editor) vµ ch−¬ng
tr×nh biªn dÞch (C++ compiler).
C¸c b−íc x©y dùng ch−¬ng tr×nh m¸y tÝnh b»ng C/C++
1. X¸c ®Þnh vÊn ®Ò cÇn gi¶i quyÕt b»ng m¸y tÝnh
2. §Þnh nghÜa ®Çu ra ch−¬ng tr×nh
3. Chia nhá vÊn ®Ò thµnh c¸c b−íc logic
4. ViÕt ch−¬ng tr×nh
5. DÞch ch−¬ng tr×nh
6. KiÓm tra, thö nghiÖm ch−¬ng tr×nh
C¸c lÖnh trong ch−¬ng tr×nh C/C++ ®−îc gäi lµ m· nguån. Sau khi
nhËp m· nguån ta cã thÓ ghi lªn ®Üa tõ d−íi d¹ng tÖp tr−íc khi dÞch vµ
ch¹y chóng. C¸c tªn tÖp m· nguån cã phÇn më réng lµ .C cho ng«n
ng÷ C vµ .CPP cho ng«n ng÷ C++.
VÝ dô: Tªn tÖp cña ch−¬ng tr×nh C cã thÓ lµ myprog.c cßn trong
C++ cã thÓ lµ sales.cpp,...
Sau khi nhËp m· ch−¬ng tr×nh ta ph¶i dÞch ch−¬ng tr×nh. NÕu cã
th«ng b¸o lçi trªn mµn h×nh th× ph¶i trë l¹i tr×nh so¹n th¶o m· nguån
®Ó söa lçi.
Tr−íc khi t×m hiÓu kü vÒ C/C++ ta h·y lµm quen víi tr×nh so¹n th¶o
m· nguån vµ tr×nh biªn dÞch C++ cña Borland th«ng qua vÝ dô sau ®©y:
VÝ dô: Ch−¬ng tr×nh sau ®−îc viÕt b»ng ng«n ng÷ C:
#include <stdio.h>
main ()
{
printf("Xin chao");
}
VÝ dô trªn sÏ ®−a ra mµn h×nh dßng ch÷:
Xin chao
Ch−¬ng 1: Giíi thiÖu C/C++ 7

//Ten tep hello.cpp


// Chuong trinh hien thi dong chu "Hello C++!" tren man hinh
#include <iostream.h>
#include <conio.h>
main()
{
cout << "Hello C++!\n";
getch();
return 0;
}
Sau khi nhËp xong m· ch−¬ng tr×nh, chóng ta nhÊn tæ hîp phÝm
(Alt + R) ®Ó ch¹y thö ch−¬ng tr×nh. Trªn mµn h×nh sÏ xuÊt hiÖn dßng
ch÷ Hello C++! vµ chê nhÊn phÝm bÊt kú ®Ó tho¸t khái ch−¬ng tr×nh.

1.3. CÊu tróc ch−¬ng tr×nh C/C++


§Ó thÊy râ ®−îc cÊu tróc ch−¬ng tr×nh cña C/C++ chóng ta sÏ xÐt
mét sè vÝ dô viÕt trªn ng«n ng÷ C, sau ®ã sÏ xem xÐt viÕt trªn C++
1.3.1. Mét sè ch−¬ng tr×nh vÝ dô
VÝ dô 1: LËp ch−¬ng tr×nh s¾p xÕp mét d·y sè n thùc a1, a2,... an
theo thø tù t¨ng dÇn.
§©y lµ bµi to¸n øng dông nhiÒu trong thùc tÕ nh−: s¾p xÕp kÕt qu¶
thi, b¶ng kÕt qu¶ häc tËp, s¾p xÕp danh s¸ch c¸n bé cña mét ®¬n vÞ
theo tuæi…
ThuËt to¸n:
1) NhËp sè n vµ d·y sè a1, a2,... an vµo m¶ng a[1], a[2],... a[n];
2) for i →1 to n-1 do
3) for j → i+1 to n do
KiÓm tra ®iÒu kiÖn: nÕu a[i] >a[j] th× ®æi gi¸ trÞ a[i], a[j] cho nhau;
8 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

4) In ra d·y sè a[1], a[2],... a[n];


5) KÕt thóc ch−¬ng tr×nh
Ch−¬ng tr×nh nh− sau:
# include <stdio.h>
# include <conio.h>
# define Nmax 50
short i,j, n;
float tg, A[Nmax];
void main()
{
clrscr();
printf("Nhap n="); scanf("%d",&n);
for (i=1; i<=n; i++)
{ printf("Nhap so thu %d ",i);
scanf("%f",&A[i]);
}
printf("\n");
for (i=1; i<=n-1; i++)
for (j=i+1; j<=n; j++)
if (A[i]>A[j])
{ tg=A[i];
A[i]=A[j];
A[j]=tg;
}
printf("Day so da duoc sap xep la \n \n");
for (i=1; i<=n; i++) printf("%4.1f",A[i]);
printf("\n");
getch();
}
Ch−¬ng 1: Giíi thiÖu C/C++ 9

VÝ dô 2: LËp ch−¬ng tr×nh tÝnh sè c¸ch chän k sinh viªn vµo häc
khoa To¸n tin trong sè n sinh viªn tróng tuyÓn vµo Häc viÖn An ninh
Nh©n d©n.
ThuËt to¸n
Ta sö dông hµm ®Ö quy TH ®Ó tÝnh tæ hîp chËp k cña n.
TH(n,0) = TH(n,n) = 1;
TH (n, k) = TH (n-1,k) + TH(n-1,k-1) ;
// Chuong trinh de quy tinh to hop chap k cua n
# include <stdio.h>
# include <conio.h>
short nL, kL;
short TH(short n, short k)
{
if (n== k||k== 0) return 1;
else return TH(n-1,k)+ TH(n-1,k-1);
}
void main()
{
clrscr();
printf("Cho biet tong so hoc sinh n=");
scanf("%d", &nL);
printf("Cho biet so hoc sinh duoc chon");
scanf("%d", &kL);
printf("So cach chon la: %d",TH(nL, kL));
getch();
}

NhËn xÐt:
+ Ch−¬ng tr×nh C b¾t ®Çu b»ng #include ®Ó khai b¸o th− viÖn to¸n
häc, ®å häa, c¸c ®¬n vÞ ch−¬ng tr×nh mµ ®−îc gäi lµ chØ thÞ tiÒn xö lý.
C¸c tÖp conio.h hay math.h ph¶i cã trong th− viÖn cña C.
10 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

+ Dßng define ®Ó ®Þnh nghÜa c¸c h»ng sè, macro. T−¬ng øng víi
c¸c biÕn kiÓu nguyªn, thùc, ký tù chóng ta còng sÏ cã c¸c h»ng kiÓu
d÷ liÖu ®ã.
B¶ng d−íi ®©y cho ta mét cÊu tróc chung cña ch−¬ng tr×nh viÕt
trªn ng«n ng÷ C.
1.3.2. CÊu tróc ch−¬ng tr×nh C
# include <...> ChØ thÞ tiÒn xö lý bao hμm c¸c tÖp
tiªu ®Ò vμ tÖp ghÐp
# define <Tªn h»ng> <Gi¸ trÞ> §Þnh nghÜa c¸c h»ng, macro
typedef <KiÓu> <Tªn kiÓu> Khai b¸o kiÓu d÷ liÖu míi
<Tªn kiÓu> <Danh s¸ch biÕn>; Khai b¸o c¸c biÕn toμn côc
<Tªn kiÓu> <Tªn hμm 1> Khai b¸o hμm 1
{ <Tªn kiÓu> <Danh s¸ch biÕn>; Khai b¸o c¸c biÕn ®Þa ph−¬ng
D·y c©u lÖnh C¸c lÖnh thùc hiÖn trong hμm
....
return <BiÓu thøc_1>;} Tr¶ kÕt qu¶ cho hμm
main() Ch−¬ng tr×nh chÝnh - hμm main
{
<Tªn kiÓu> <Danh s¸ch biÕn>; Khai b¸o c¸c biÕn ®Þa ph−¬ng
D·y c©u lÖnh; C¸c c©u lÖnh thùc hiÖn trong
...... ch−¬ng tr×nh chÝnh
}

1.4. C¸c ký hiÖu c¬ b¶n trong ng«n ng÷ C


TËp c¸c ký hiÖu c¬ b¶n ®−îc gäi lµ b¶ng ch÷ c¸i cña ng«n ng÷.
Nã bao gåm nhãm c¸c ch÷ c¸i, nhãm c¸c ch÷ sè vµ nhãm c¸c ký hiÖu
®Æc biÖt.
a) C¸c ch÷ c¸i: A, B, C,... Z, a, b, c,... z, _ (dÊu g¹ch nèi)
b) C¸c ch÷ sè: 0, 1, 2,..., 9
c) C¸c dÊu phÐp to¸n
Ch−¬ng 1: Giíi thiÖu C/C++ 11

- C¸c phÐp to¸n sè häc: +, -, *, /, %


- C¸c phÐp so s¸nh: <, <=, >=, >, ==, !=
- C¸c phÐp to¸n logic: !, ⏐⏐, &&
- C¸c phÐp to¸n trªn bit: ~, ⏐, &, ^, <<, >>
- C¸c phÐp t¨ng, gi¶m: ++, --
- DÊu phÐp g¸n: =
d) C¸c ký hiÖu ®Æc biÖt:
- C¸c dÊu ngoÆc (,), [, ], {, }
- C¸c dÊu chó thÝch /*, */, //
- C¸c ký hiÖu kh¸c ->, #, \,:, ?, ., ';

1.5. C¸c tõ khãa cña ng«n ng÷ C


Ng«n ng÷ lËp tr×nh C sö dông 38 tõ tiÕng Anh ®Ó t¹o nªn c¸c khai
b¸o, c¸c biÓu thøc, c©u lÖnh. §©y lµ c¸c tõ khãa cña ng«n ng÷ C vµ
®−îc viÕt b»ng ch÷ th−êng. Mçi tõ khãa mang mét ý nghÜa nhÊt ®Þnh
do ®ã trong lËp tr×nh kh«ng ®−îc sö dông tõ khãa ®Ó ®Æt tªn cho c¸c
®èi t−îng kh¸c trong ch−¬ng tr×nh.
asm far short
auto float signed
break for sizeof
case goto Static
cdecl huge struc
char if switch
continue int typedef
default interrupt union
do long unsigned
double near void
else pascal volatile
enum register while
extern return
12 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Ngoµi c¸c tõ khãa, ng«n ng÷ C cßn ®Æt mét sè tªn chuÈn cho c¸c
h»ng, c¸c kiÓu, c¸c biÕn, c¸c hµm mÉu. VÝ dô: BLUE, M_PI,
SEEK_CUR, clrscr; printf, sizeof, strcmp, stdin, textattr...
Khi ®Æt tªn cho c¸c ®èi t−îng trong ch−¬ng tr×nh, chóng ta kh«ng
®−îc phÐp ®Æt trïng víi tªn chuÈn ®· cã.

1.6. C¸c më réng cña C++


VÒ thùc chÊt C++ gièng nh− C nh−ng bæ sung thªm mét sè më
réng kh¸c nh−: ®èi t−îng, lËp tr×nh h−íng ®èi t−îng. Tõ c¸c n¨m 70
cña thÕ kû XX ®· cã c¸c ý t−ëng vÒ cÊu tróc trong C++ tõ ng«n ng÷
Simula 70 vµ Algol 68.
1.6.1. C¸c tõ khãa míi cña C++
§Ó bæ sung c¸c tÝnh n¨ng míi vµo C, c¸c tõ khãa sau ®· ®−îc ®−a
vµo C++:
asm catch class delete friend inline
new operator private protected public template
this throw try virtual

Nh− vËy, khi chóng ta chuyÓn ch−¬ng tr×nh tõ C sang C++, cÇn
ph¶i thay ®æi mét sè tªn nÕu trïng víi tõ khãa cña C++ sau ®ã míi
biªn dÞch l¹i.
1.6.2. LÖnh nhËp vμ xuÊt d÷ liÖu chuÈn
Trong ch−¬ng tr×nh C, chóng ta th−êng sö dông c¸c hµm nhËp/xuÊt
d÷ liÖu lµ scanf() vµ printf(), cßn trong C++ cã thÓ dïng dßng
nhËp/xuÊt chuÈn (standard input/output stream) ®Ó nhËp/xuÊt d÷ liÖu
th«ng qua hai biÕn ®èi t−îng cña dßng (stream object) lµ cout vµ cin.
XÐt vÝ dô: ViÕt ch−¬ng tr×nh nhËp vµo hai sè, sau ®ã tÝnh tæng,
hiÖu, tÝch cña hai sè ®ã.
# include <iostream.h>
# include <conio.h>
int main()
Ch−¬ng 1: Giíi thiÖu C/C++ 13

{ int a,b;
clrscr();
cout<<"Nhap so a=";
cin>>a;
cout<<"Nhap so b=";
cin>>b;
cout<<"Tong hai so la:"<<a+b<<"\n";
cout<<"Hieu hai so la:"<<a-b<<"\n";
cout<<"Tich hai so la:"<<a*b<<"\n";
getch();
return 0;
}
§Ó thùc hiÖn dßng xuÊt chóng ta sö dông biÕn cout (console
output) kÕt hîp víi to¸n tö chÌn (insertion operator) <<. Cßn ®Ó thùc
hiÖn dßng nhËp, chóng ta sö dông biÕn cin (console input) kÕt hîp víi
to¸n tö trÝch (extration operator) >>. CÇn ph¶i khai b¸o tÖp iostream.h
b»ng include.
1.6.3. C¸ch chuyÓn ®æi kiÓu d÷ liÖu
Trong C++ cã thªm c¸ch chuyÓn ®æi kiÓu d÷ liÖu gièng nh− lÖnh
gäi hµm.
VÝ dô:
# include<iostream.h>;
# include<conio.h>;
int main()
{
int X=200;
long Y = (long) X; //Chuyen doi theo cach cua C
long Z = long(X);//Chuyen doi theo cach moi cua C++
cout<<"X="<<X<<"\n";
14 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

cout<<"Y="<<Y<<"\n";
cout<<"Z="<<Z<<"\n";
getch();
return 0;
}

1.6.4. C¸c thay ®æi kh¸c trong C++


VÞ trÝ khai b¸o biÕn
Ch−¬ng tr×nh C ®ßi hái tÊt c¶ c¸c khai b¸o bªn trong mét ph¹m vi
cho tr−íc ph¶i ®Æt ë ngay ®Çu cña ph¹m vi ®ã. Tøc lµ, c¸c khai b¸o
toµn côc ph¶i ®Æt tr−íc tÊt c¶ c¸c hµm vµ c¸c khai b¸o côc bé ph¶i
®−îc tiÕn hµnh tr−íc tÊt c¶ c¸c lÖnh thùc hiÖn.
Ng−îc l¹i, trong C++, cho phÐp chóng ta khai b¸o linh ho¹t bÊt kú
vÞ trÝ nµo trong mét ph¹m vi cho tr−íc (kh«ng nhÊt thiÕt ph¶i ngay ®Çu
cña ph¹m vi), cã thÓ xen kÏ khai b¸o d÷ liÖu víi c¸c c©u lÖnh thùc
hiÖn. Khi khai b¸o mét biÕn trong ch−¬ng tr×nh, biÕn ®ã sÏ cã hiÖu lùc
trong ph¹m vi cña ch−¬ng tr×nh kÓ tõ vÞ trÝ nã xuÊt hiÖn, v× vËy chóng
ta kh«ng thÓ sö dông mét biÕn ®−îc khai b¸o bªn d−íi nã.
Ta xÐt vÝ dô sau ®©y ®−îc viÕt trªn C:
void makeit(void)
{ float i;
char *cp;
/* Doan chuong trinh */
/* CÊp 100 bytes cho cp */
cp = malloc(100); /* lÇn thø nhÊt dïng cp */
for (i=0; i<100; ++i) /* lÇn thø nhÊt dïng i */
{
/* Mét sè lÖnh trong chu tr×nh */
}
/* ch−¬ng tr×nh tiÕp tôc */
Ch−¬ng 1: Giíi thiÖu C/C++ 15

Sau ®o¹n ch−¬ng tr×nh kh«ng gian cho cp ®−îc cÊp vµ i cuèi cïng
còng ®−îc dïng trong chu tr×nh for. Tuy nhiªn, ng−êi lËp tr×nh quªn
biÕn i ®· khai b¸o råi vµ do i lµ float nªn vßng lÆp for ®−îc t¹o ra dïng
float nªn nã ch¹y chËm h¬n th«ng th−êng. C¸c khai b¸o ë xa n¬i sö
dông d÷ liÖu th−êng hay g©y nhÇm lÉn nªn dÉn ®Õn lçi.
C++ cho phÐp khai b¸o ®−îc ®Æt gÇn n¬i sö dông h¬n. Ch−¬ng
tr×nh trªn ®−îc viÕt l¹i nh− sau:
void makeit(void)
{
char *cp;
/* Doan chuong trinh */
/* CÊp 100 bytes cho cp */
char *cp = new char[100] ;
for (i=0; i<100; ++i) /* lÇn thø nhÊt dïng i */
{
/* Mét sè lÖnh trong chu tr×nh */
}
/* ch−¬ng tr×nh tiÕp tôc */
Ch−¬ng tr×nh nµy dÔ theo dâi h¬n b»ng c¸ch khai b¸o biÕn i vµ cp
lÇn ®Çu tiªn dïng chø kh«ng ph¶i khai b¸o trªn ®o¹n lÖnh.
C¸c h»ng const
Trong C, muèn ®Þnh nghÜa mét h»ng cã kiÓu nhÊt ®Þnh th× ta dïng
khai b¸o const v× nÕu dïng #define th× t¹o ra c¸c h»ng kh«ng chøa
th«ng tin vÒ kiÓu. Cßn trong C++, khai b¸o const rÊt linh ho¹t:
- C++ xem const còng nh− #define ®Ó ®Þnh nghÜa h»ng trong
ch−¬ng tr×nh, vÝ dô:
const int n =100;
int X[n];
16 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Trong C++, chóng ta ph¶i khëi t¹o gi¸ trÞ ban ®Çu cña hµm, cßn
trong C th× nã tù ®éng g¸n gi¸ trÞ zero cho mäi h»ng ®Þnh nghÜa b»ng
cout nÕu ta kh«ng ®Þnh nghÜa gi¸ trÞ ban ®Çu cho nã.
Trong C, c¸c h»ng ®Þnh nghÜa b»ng const ®−îc khai b¸o ë bªn
ngoµi mäi hµm th× chóng cã ph¹m vi toµn côc, tøc lµ chóng cã thÓ nh×n
thÊy c¶ ë bªn ngoµi file mµ chóng ®−îc ®Þnh nghÜa trõ khi chóng ®−îc
khai b¸o lµ static.
Nh−ng trong C++, c¸c h»ng ®Þnh nghÜa b»ng const ®−îc hiÓu mÆc
®Þnh lµ static. C¸c gi¸ trÞ const trong C++ cã thÓ linh ho¹t h¬n rÊt
nhiÒu, cã thÓ ®−îc dïng ë mäi vÞ trÝ nªn cho phÐp lËp tr×nh viªn kh«ng
cÇn dïng #define ®Ó t¹o h»ng kh«ng cã th«ng tin kiÓu.
§o¹n ch−¬ng tr×nh sau ®−îc chÊp nhËn trong C++ nh−ng sÏ bÞ lçi
trong C:
const int ArraySize =100;
int Array[Arraysize];
Cßn cã sù kh¸c biÖt vÒ c¸c kiÓu d÷ liÖu struct, union vµ enum, c¸c
to¸n tö new vµ delete gi÷a C vµ C++, chóng ta sÏ xem xÐt sau.
C++ cho phÐp dïng hai kiÓu chó thÝch lµ /* */ nh− trong C vµ //.
Tr×nh biªn dÞch sÏ bá qua mäi thø n»m trong /* */ vµ //, tuy nhiªn
kiÓu // ®−îc dïng cho chó thÝch trªn mét dßng Ýt ®−îc sö dông h¬n.

1.7. BiÕn vμ h»ng

1.7.1. BiÕn
BiÕn lµ mét ®¹i l−îng thay ®æi khi thùc hiÖn ch−¬ng tr×nh. BiÕn lµ
mét thµnh phÇn quan träng trong mét ch−¬ng tr×nh, dï ch−¬ng tr×nh
®−îc viÕt b»ng ng«n ng÷ nµo. BiÕn cã thÓ l−u tr÷ c¸c kiÓu d÷ liÖu kh¸c
nhau, d−íi ®©y lµ c¸c kiÓu biÕn c¬ së vµ kh¶ n¨ng l−u tr÷ cña chóng
trong C/C++.
Ch−¬ng 1: Giíi thiÖu C/C++ 17

Tªn khai b¸o KiÓu Kh¶ n¨ng l−u tr÷


short sè nguyªn tõ –128 ®Õn 127
unsigned char ký tù kh«ng dÊu tõ 0 ®Õn 255
int sè nguyªn tõ –32768 ®Õn 32767
unsigned int sè nguyªn kh«ng dÊu tõ 0 ®Õn 65535
long sè nguyªn dμi tõ –2147483648
®Õn 2147483647

unsigned long sè nguyªn dμi kh«ng dÊu tõ 0 ®Õn 4294967295


float sè dÊu ph¶y di ®éng tõ -3.4E-38 ®Õn 3.4E+308
double sè dÊu ph¶y di ®éng dμi tõ –1.7E-308 ®Õn 1.7E+308
gÊp ®«i

char KiÓu ký tù 1 gi¸ trÞ trong b¶ng ASCII


cã 256 ký tù

Kh«ng ®Þnh nghÜa KiÓu logic 1 biÓu diÔn gi¸ trÞ logic
t−êng minh ®óng; 0 biÓu diÔn gi¸ trÞ
logic sai

Trong ng«n ng÷ C/C++, biÕn ph¶i ®−îc khai b¸o tr−íc khi dïng.
ViÖc ®Þnh nghÜa biÕn ph¶i x¸c ®Þnh ®−îc hai thµnh phÇn: tªn biÕn, kiÓu
biÕn. Trong ®ã:
KiÓu biÕn x¸c ®Þnh giíi h¹n miÒn gi¸ trÞ mµ biÕn cã thÓ l−u gi÷
vµ biÓu diÔn. C¸c kiÓu biÕn cã thÓ ®−îc ng«n ng÷ C/C++ ®Þnh nghÜa
s½n hoÆc do ng−êi dïng cã thÓ tù ®Þnh nghÜa dùa trªn c¸c kiÓu ®· cã s½n.
Tªn biÕn do ng−êi dïng tù ®Æt nh−ng ph¶i tu©n thñ theo quy t¾c lµ
mét d·y ký tù kh«ng cã dÊu c¸ch, cã thÓ cã c¶ ch÷, sè vµ dÊu g¹ch
d−íi nh−ng ph¶i b¾t ®Çu b»ng ch÷ c¸i hoÆc dÊu g¹ch d−íi. Tªn biÕn cã
ph©n biÖt ch÷ hoa vµ ch÷ th−êng, vµ mang tÝnh gîi nhí ®Ó ng−êi lËp
tr×nh dÔ sö dông.
Chó ý:
- Tªn biÕn th−êng ®−îc viÕt b»ng ch÷ th−êng
- Tªn biÕn cÇn ®−îc ®−a ra theo mét tªn gîi nhí, tøc lµ tªn nªu ra
®−îc mét chØ dÉn nµo ®ã vÒ viÖc dïng cña nã trong ch−¬ng tr×nh.
18 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

- Tªn biÕn cã nhiÒu tõ th× c¸c tõ nèi víi nhau b»ng dÊu g¹ch d−íi (_).
C++ dµnh riªng mét tËp c¸c tõ ®Ó dïng bªn trong ng«n ng÷ xem
nh− c¸c tõ khãa. Ng−êi dïng kh«ng ®−îc dïng tªn gäi cho c¸c tõ khãa
lµm tªn gäi riªng cho ch−¬ng tr×nh.
Cã thÓ khai b¸o nhiÒu biÕn cã cïng mét kiÓu trªn cïng mét hay nhiÒu
dßng vµ ng¨n c¸ch nhau bëi dÊu ph¶y kÕt thóc b»ng dÊu chÊm ph¶y.
Khi ®Þnh nghÜa biÕn ta cã thÓ g¸n gi¸ trÞ khëi ®Çu cho biÕn. §©y lµ
®iÓm kh¸c cña C/C++ so víi Pascal.
Có ph¸p khai b¸o biÕn:
<KiÓu d÷ liÖu> <Danh s¸ch tªn biÕn>;
Trong ®ã:
KiÓu d÷ liÖu: Tªn kiÓu d÷ liÖu cña mét hoÆc nhiÒu biÕn cÇn khai b¸o.
Danh s¸ch tªn biÕn: NÕu cã nhiÒu biÕn thuéc cïng mét kiÓu d÷
liÖu, ta cã thÓ liÖt kª danh s¸ch c¸c tªn biÕn, ph©n c¸ch nhau bëi dÊu
ph¶y (,). KÕt thóc khai b¸o lµ dÊu chÊm ph¶y (;).
ViÖc khai b¸o biÕn nªu trªn ch−a t¹o ra viÖc cÊp ph¸t bé nhí cho
biÕn, nã chØ x¸c nhËn r»ng biÕn ®ã ®· ®−îc ®Þnh nghÜa ®©u ®ã trong
ch−¬ng tr×nh. Mét biÕn cã thÓ ®−îc khai b¸o nhiÒu lÇn trong ch−¬ng tr×nh.
VÝ dô 1: khai b¸o biÕn:
int i; /* biÕn tªn i cã kiÓu nguyªn */
float f1, f2; /*c¸c biÕn tªn f1 vμ f2 ®Òu cã kiÓu sè thùc dÊu ph¶y
®éng*/
int j = 5; /* khai b¸o biÕn j vμ khëi t¹o gi¸ trÞ lμ 5*/
VÝ dô 2:
# include <stdio.h>
main()
{
int a, b,c ; /*khai b¸o 3 biÕn kiÓu int */
long ad, biÓu diÔn, cd; /*khai b¸o 3 biÕn kiÓu long*/
Ch−¬ng 1: Giíi thiÖu C/C++ 19

unsigned au, bu, cu; /*khai b¸o 3 biÕn kiÓu unisigned */


char k1, k2; /* khai b¸o 2 biÕn kiÓu char */
float x, y; /*khai b¸o 2 biÕn kiÓu float */
double xd, yd; /*khai b¸o 2 biÕn kiÓu double */
Mét biÕn ph¶i ®−îc ®Þnh nghÜa hay khai b¸o cho ch−¬ng tr×nh
tr−íc khi nã ®−îc sö dông.
Chó ý: ViÖc khai b¸o biÕn trong C/C++ vµ Pascal cã sù kh¸c nhau.
§èi víi Turbo C §èi víi Pascal
KiÓu DS biÕn; DS biÕn:KiÓu;
Var
# include <stdio> a, b, c: Integer;
main() Begin
{
int a, b, c; ....
..
} End;

VÞ trÝ khai b¸o biÕn


C¸c biÕn trong C/C++ cã thÓ ®−îc khai b¸o bªn ngoµi hoÆc bªn
trong hµm hay khèi lÖnh.
Khai b¸o biÕn ngoμi
VÞ trÝ c¸c biÕn ®Æt ë bªn ngoµi tÊt c¶ c¸c hµm. C¸c biÕn nµy sÏ t¸c
®éng tíi toµn bé ch−¬ng tr×nh cña C/C++.
VÝ dô:
int n, tong ; /*Khai b¸o biÕn ngoμi */
main ()
{
n = tong +10;
...
}
20 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Khai b¸o biÕn trong


C¸c biÕn ®−îc ®Æt ë ®Çu cña mét hµm hoÆc khèi lÖnh. C¸c biÕn
nµy chØ t¸c ®éng trong ph¹m vi hµm hoÆc khèi lÖnh ®ã.
VÝ dô:
func1()
{
int i, j ; /*Khai b¸o biÕn trong */
....
for (i=j;
...
}

Khai b¸o c¸c ®èi sè hμm


VÞ trÝ biÕn ®Æt trong phÇn ®Þnh nghÜa tham sè cña hµm.
VÝ dô:
func2(x,c);
int x /*Khai b¸o ®èi sè hμm */
char c;
{ x= x-1;
....
}
Trong C, khi khai b¸o c¸c biÕn trong, chóng ta cÇn ph¶i ®Æt biÕn
ngay sau dÊu { ®Çu tiªn cña th©n hµm vµ cÇn ph¶i ®øng tr−íc c¸c c©u
lÖnh kh¸c. Nh− vËy sau mét lÖnh kh¸c (ch¼ng h¹n nh− c©u lÖnh g¸n)
th× kh«ng ®−îc khai b¸o biÕn n÷a, nÕu kh«ng C sÏ b¸o sai nh− ®o¹n
ch−¬ng tr×nh sau:
VÝ dô:
/* Khai b¸o sai vÞ trÝ biÕn */
main()
{ int a, b, c; /*Khai b¸o ®óng */
a = 35;
int d ; /*Khai b¸o sai v× sau c©u lÖnh g¸n */
Ch−¬ng 1: Giíi thiÖu C/C++ 21

Trong C++ th× viÖc khai b¸o ë nh÷ng vÞ trÝ nµo lµ tïy ý.
ViÖc g¸n gi¸ trÞ ®Çu tiªn cho biÕn cã thÓ thùc hiÖn b»ng 1 trong 2
c¸ch: khai b¸o tr−íc, g¸n gi¸ trÞ sau hoÆc võa khai b¸o võa g¸n gi¸ trÞ.
VÝ dô:
main()
{ int a, b = 20, c, d = 40;
float e = -35.1, f = 23.0;
int i;
i = 10;
...
}

1.7.2. H»ng
BiÕn kiÓu h»ng ®−îc ®Þnh nghÜa nh− mét biÕn th−êng vµ thªm
vµo ®»ng tr−íc tõ khãa const. BiÕn h»ng ®−îc g¸n gi¸ trÞ khëi ®Çu khi
®Þnh nghÜa vµ kh«ng ®−îc phÐp thay ®æi gi¸ trÞ cña nã trong toµn bé
ch−¬ng tr×nh.
Trong C/C++ mçi h»ng hoÆc biÓu thøc h»ng ®Òu cã mét trÞ vµ
kiÓu d÷ liÖu cña chóng. §ã cã thÓ lµ: h»ng sè thùc (float, double),
h»ng nguyªn (int, long), h»ng ký tù, h»ng x©u ký tù.

1.8. M¶ng ký tù vμ x©u ký tù


Trong c¸c lo¹i biÕn th−êng dïng trong ng«n ng÷ C/C++, lo¹i biÕn
m¶ng c¸c ký tù lµ lo¹i biÕn th−êng ®−îc sö dông. BiÕn m¶ng ký tù ®Ó
l−u tr÷ liªn tiÕp c¸c ký tù.
Có ph¸p:
char tªn_biÕn[kÝch cì];
víi: - char: kiÓu ký tù.
- tªn_biÕn: tªn cña biÕn m¶ng ký tù.
- []: ký hiÖu m¶ng.
- kÝch cì: sè phÇn tö cña m¶ng.
22 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

VÝ dô: §Ó l−u tr÷ tªn cña mét sinh viªn, ta khai b¸o mét biÕn
m¶ng ký tù nh− sau: char TenSV[15];
Cã nghÜa lµ ta khai b¸o mét biÕn m¶ng kiÓu ký tù cã ®é dµi 15 ký
tù. Ta cã thÓ g¸n gi¸ trÞ cho biÕn m¶ng ký tù ngay khi khai b¸o:
char TenSV[15] = “Nguyen Van A”;
hoÆc khai b¸o biÕn m¶ng ký tù vµ g¸n gi¸ trÞ theo kiÓu sau:
char TenSV[15] = {‘N’, ‘g’, ‘u’, ‘y’, ‘e’, ‘n’, ‘’, ‘V’, ‘a’, ‘n’, ‘ ‘, ‘A’};
Trong bé nhí m¸y tÝnh sÏ cã 15 « nhí liªn tiÕp, mçi « chøa mét
ký tù gäi lµ mét phÇn tö: phÇn tö thø 12 (ký tù \0) lµ ký tù kÕt thóc x©u
ký tù.
NÕu g¸n ngay gi¸ trÞ cho m¶ng ký tù lóc khai b¸o biÕn th× cã thÓ
kh«ng cÇn khai b¸o kÝch cì cña m¶ng, ch−¬ng tr×nh sÏ tù ®éng ®Õm vµ
x¸c ®Þnh sè ký tù cho biÕn m¶ng.
char TenSV[] = “Nguyen Van A”;
Ta cã thÓ ®äc hay ghi d÷ liÖu tõ biÕn m¶ng ký tù.
VÝ dô: Ta thùc hiÖn phÐp g¸n sau:
TenSV[11] = ‘B’;
Kh«ng nh− Pascal, trong C/C++, chØ sè cña m¶ng ph¶i ®−îc b¾t
®Çu tõ 0, truy nhËp ®Õn phÇn tö tiÕp theo b»ng c¸ch t¨ng chØ sè lªn 1
®¬n vÞ.
VÝ dô: TenSV[i+1] x¸c ®Þnh phÇn tö thø i+1 lµ phÇn tö ®øng ngay
sau phÇn tö i. T−¬ng tù khi truy nhËp ®Õn phÇn tö ®øng ngay tr−íc nã
th× gi¶m chØ sè ®i 1 ®¬n vÞ.
VÝ dô: TenSV[i-1] x¸c ®Þnh phÇn tö thø i-1 lµ phÇn tö ®øng ngay
tr−íc phÇn tö i.
X©u ký tù lµ m¶ng ký tù cã phÇn tö tËn cïng lµ ký tù kÕt thóc
x©u ‘\0’.
Víi x©u ký tù, chóng ta kh«ng thÓ g¸n trùc tiÕp d÷ liÖu nh− víi
c¸c kiÓu biÕn kh¸c:
Ch−¬ng 1: Giíi thiÖu C/C++ 23

VÝ dô:
char TenSV[20];
TenSV = “Nguyen Van A”; // C++ sÏ b¸o lçi khi dÞch
Ngoµi kiÓu khai b¸o vµ g¸n khëi ®Çu nh− trªn th× chØ cã thÓ thùc
hiÖn g¸n trùc tiÕp tõng phÇn tö nh− sau:
TenSV[0] = ‘N’;
TenSV[1] = ‘g’
TenSV[2] = ‘u’;
TenSV[3] = ‘y’;
TenSV[4] = ‘e’;
TenSV[5] = ‘n’;
TenSV[6] = ‘\0’;
Ng«n ng÷ C++ cung cÊp cho ng−êi dïng hµm th− viÖn strcpy()
trong th− viÖn hµm vµ ®−îc dïng nh− sau:
strcpy(TenSV, “Nguyen”);
Hµm nµy tù ®éng thªm ký tù kÕt thóc x©u vµo cuèi m¶ng ký tù
TenSV”[].

1.9. C¸c lÖnh ®iÒu khiÓn tiÒn dÞch ch−¬ng tr×nh


Ch−¬ng tr×nh dÞch cña C/C++ kh«ng dÞch ngay ra ch−¬ng tr×nh
nguån mµ thùc hiÖn c¸c tiÒn xö lý tr−íc, sau ®ã míi dÞch ch−¬ng tr×nh.
C«ng viÖc tiÒn xö lý bao gåm: thùc hiÖn chØ thÞ bao hµm tÖp, ®Þnh
nghÜa c¸c h»ng, macro, dÞch vµ thùc hiÖn ch−¬ng tr×nh cã ®iÒu kiÖn.
C/C++ cã mét th− viÖn chuÈn bao gåm c¸c tÖp tiªu ®Ò (header)
chuÈn, chøa c¸c th«ng tin vÒ th− viÖn mµ ng−êi dïng cÇn tíi. §Ó th©m
nhËp vµo c¸c biÕn hay hµm ®−îc ®Þnh nghÜa bªn trong th− viÖn chuÈn,
ta ph¶i khai b¸o c¸c tÖp tiªu ®Ò liªn kÕt vµo ch−¬ng tr×nh cña m×nh.
TÖp tiªu ®Ò ph¶i lµ tÖp m· ASCII (tÖp v¨n b¶n).
24 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

§Ó sö dông tÖp tiªu ®Ò trong ch−¬ng tr×nh ta ph¶i sö dông chØ thÞ
#include. ChØ thÞ nµy ®−îc xö lý tr−íc khi gäi tíi tr×nh biªn dÞch ng«n ng÷.
ChØ thÞ #include cã hai d¹ng:
#include <tªn tÖp> vÝ dô: #include <stream.h>
#include “tªn tÖp” vÝ dô: #include “myIO.h”
NÕu tªn tÖp ®−îc bao bëi dÊu ngoÆc gãc (<...>) th× tÖp cã tªn n»m
trong mãc nhän lµ tÖp tiªu ®Ò ®· ®−îc x¸c ®Þnh s½n, hay chuÈn. ViÖc
t×m kiÕm nã ®−îc thùc hiÖn b»ng c¸ch duyÖt trong tËp c¸c vÞ trÝ ®Þnh
s½n b»ng ch−¬ng tr×nh dÞch.
NÕu tªn tÖp ®−îc bao quanh bëi dÊu nh¸y kÐp (“...”) th× tÖp cã tªn
n»m trong dÊu nh¸y lµ tÖp tiªu ®Ò do ng−êi dïng cung cÊp. ViÖc t×m
tÖp nµy ®−îc thùc hiÖn b¾t ®Çu tõ th− môc hiÖn thêi (current dir). NÕu
kh«ng t×m thÊy th× sÏ duyÖt t×m trong tËp c¸c vÞ trÝ ®· ®Þnh s½n.
TÖp ®−îc ®−a vµo b¶n th©n nã l¹i cã thÓ chøa chØ thÞ #include. Do
c¸c tÖp ®−îc ®−a vµo lång nhau nªn mét tÖp tiªu ®Ò ®«i khi cã thÓ
®−îc kÐo vµo nhiÒu lÇn ®èi víi mét tÖp gèc. Cã thÓ dïng c¸c chØ thÞ
®iÒu kiÖn ®Ó kh¾c phôc l¹i viÖc xö lý nhiÒu lÇn cho mét tÖp tiªu ®Ò.
VÝ dô:
#ifndef STRING_H
#define STRING_H
/* néi dung cña string.h*/
#endif
ChØ thÞ ®iÒu kiÖn #ifndef cho l¹i gi¸ trÞ ®óng nÕu tªn gäi ®i sau nã
ch−a ®−îc ®Þnh nghÜa. Khi mét chØ thÞ ®iÒu kiÖn cho l¹i gi¸ trÞ ®óng th×
c¸c dßng ®i sau nã ®−îc thùc hiÖn cho ®Õn khi gÆp #endif.
ChØ thÞ #define ®Þnh nghÜa tªn ®i sau nã. Nh− vÝ dô trªn nã ®Þnh
nghÜa STRING_H
ChØ thÞ #define cßn cã ý nghÜa ®Ó ®Þnh nghÜa gi¸ trÞ mét h»ng sè
nµo ®ã. Sau ®ã ta cã thÓ sö dông chóng vÒ sau trong ch−¬ng tr×nh.
Ch−¬ng 1: Giíi thiÖu C/C++ 25

VÝ dô:
#define BUFSIZE 512
#define MONTHS 12

1.10. C¸c lÖnh vμo/ra ®¬n gi¶n


C¸c thiÕt bÞ vµo ra chuÈn th«ng dông gåm cã thiÕt bÞ vµo lµ bµn
phÝm, thiÕt bÞ ra lµ mµn h×nh, m¸y in.
Sau ®©y ta xem xÐt viÖc sö dông mét sè hµm vµo ra ®¬n gi¶n víi
c¸c thiÕt bÞ chuÈn trong ng«n ng÷ C/C++.
1.10.1. C©u lÖnh nhËp d÷ liÖu vμo biÕn nhí
Có ph¸p:
scanf("ký tù ®Þnh d¹ng", danh s¸ch biÕn);
Ký tù ®Þnh d¹ng b¾t ®Çu b»ng dÊu % cho phÐp m« t¶ d÷ liÖu nhËp
hoÆc d÷ liÖu xuÊt. Danh s¸ch biÕn quy ®Þnh nh− sau:
- Mçi biÕn ph¶i b¾t ®Çu b»ng dÊu & ®Ó ®Þnh ®Þa chØ biÕn vµ ph©n
c¸ch nhau b»ng dÊu ph¶y. Cã bao nhiªu biÕn ph¶i cã bÊy nhiªu ®Þnh
d¹ng vµ thø tù cña c¸c ®Þnh d¹ng ph¶i phï hîp víi thø tù cña danh s¸ch.
§Ó nhËp ®−îc dßng ký tù cã kho¶ng tr¾ng b»ng hµm scanf ph¶i viÕt:
scanf("%[^\n]",a)) /*a lµ chuçi x©u ký tù ®−îc nhËp */
VÝ dô 1: §Þnh d¹ng chØ nhËp sè nguyªn, kh«ng nhËp sè thùc cho 2
biÕn x vµ y: scanf ("%d%d",&x, &y);
VÝ dô 2: §Þnh d¹ng nhËp 1 sè thùc cã tèi ®a lµ 2 sè lÎ
scanf("%.2f",&y);
VÝ dô 3: §Þnh d¹ng ®Ó nhËp 10/20 nh− sau:
scanf("%d%c%d", &x, &y);
Cã nghÜa lµ 10 g¸n cho x, 20 g¸n cho y, bá qua dÊu (/) kh«ng g¸n
cho biÕn nµo c¶ nh−ng vÉn ®äc ®−îc.
26 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

VÝ dô 4:
#include <stdio.h>
void main()
{
float total_sale;
float vat_tax;
printf(“\nTong so tien hang ban duoc trong ngay: ”);
scanf(“%f”, &total_sale);
vat_tax = total_sale * 0.1;
printf(“\nThue vat phai nop cua %.2f la: %.2f”, total_sale, vat_tax);
}
Trong C/C++ th−êng dïng hµm gets ®Ó nhËn mét chuçi tõ bµn
phÝm cho ®Õn khi gÆp ký tù \n.
Có ph¸p:
gets(tªn cña m¶ng ký tù);
Khi nhËp chuçi ta kh«ng cÇn ph¶i lÊy ®Þa chØ.
VÝ dô:
#include <stdio.h>
char a[5]; /*Khai bao chuoi a do dai 5 ky tu */
main()
/* ham chinh */
int i;
printf("Nhap chuoi 5 ky tu: ");
gets(a);
/* gia su nhap cuong */
print f("%s", a); /*In ra cuong */
§Ó nhËn mét ký tù tõ bµn phÝm vµ tr¶ vÒ m· ký tù nhËn ®−îc ta
dïng hµm getchar.
Ch−¬ng 1: Giíi thiÖu C/C++ 27

Có ph¸p:
int getchar(void).
VÝ dô:
int j;
printf ("Nhap 1 ky tu:");
j = getchar(); /* Nhap mot ky tu tu ban phim */
printf("%c\n",j) /*in ra man hinh ma ASCII cua ky tu nhap vao */
Gi¶ sö ta gâ 'B' th× ch−¬ng tr×nh sÏ in ra 66 lµ m· ASCII cña 'B'.
L−u ý vÒ c¸c hμm nhËp d÷ liÖu scanf, gets, getchar
§©y lµ c¸c hµm nhËn d÷ liÖu tõ vïng nhí ®Æc biÖt stdin theo
nguyªn t¾c:
- NÕu trªn stdin cã ®ñ d÷ liÖu th× chóng sÏ nhËn mét phÇn d÷ liÖu
mµ nã yªu cÇu, phÇn d÷ liÖu cßn l¹i vÉn ë trªn stdin.
- NÕu trªn stdin kh«ng ®ñ d÷ liÖu theo yªu cÇu cña hµm th× m¸y
t¹m dõng ®Ó chê ng−êi sö dông ®−a d÷ liÖu tõ bµn phÝm lªn stdin cho
®Õn khi gÆp phÝm.
- Xãa khái stdin phÇn d÷ liÖu ®· lÊy.
- Hµm gets sÏ xãa ký tù \n trong stdin
- Hµm scanf vµ getchar kh«ng xãa \n trong stdin
Nh− vËy nÕu trong ch−¬ng tr×nh cã sö dông c¸c lÖnh scanf,
getchar th× c¸c lÖnh sö dông sau sÏ kh«ng cã t¸c dông do m· phÝm \n
cßn l¹i trong stdin cña lÖnh scanf hoÆc getchar tr−íc ®ã.
VÝ dô:
# include <stdio.h>
main () /* Ham chinh * /
{
char a, b;
printf("Nhap mot so: ");
28 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

scanf("%d", &a);
printf("Nhap mot ky tu: ");
scanf("%c", &b);
printf("\n%d %c", a, b);
}
Gi¶ sö ta nhËp 65 sau ®ã gâ Enter. Khi ®ã lÖnh scanf thø hai bÞ
tr«i vµ kÕt qu¶ lµ a = 65 vµ b = <enter>
Tr−êng hîp ta nhËp 65ABC sau ®ã gâ Enter th× lÖnh scanf thø hai
còng tr«i nh− tr−êng hîp ®Çu vµ a = 65 vµ b = A.
V× vËy, ®Ó c¸c hµm sau ho¹t ®éng ®óng, chóng ta cÇn ph¶i khö ký
tù \n cßn l−u trong stdin b»ng lÖnh fflush(stdin) sau lÖnh scanf hoÆc
dïng ký tù ®Æc t¶ %*c trong lÖnh scanf.
Nh− vËy, ta cã thÓ söa l¹i ®o¹n ch−¬ng tr×nh trªn nh− sau:
# include <stdio.h>
main () /* Ham chinh * /
{
char a, b;
printf("Nhap mot so: ");
scanf("%d", &a);
fflush(stdin);
/* HoÆc scanf("%d%*c", &a) */
printf("Nhap mot ky tu: ");
scanf("%c", &b);
printf("\n%d %c", a, b);
}
Trong th− viÖn conio.h cßn cã c¸c hµm getch() vµ getche().
Có ph¸p: int getch(void)
int getche(void)
Hai hµm nµy chê nhËn mét ký tù trùc tiÕp tõ bé nhí ®Öm cña bµn
phÝm. NÕu bé ®Öm rçng th× chê. Khi mét phÝm ®−îc nhÊn th× nhËn
Ch−¬ng 1: Giíi thiÖu C/C++ 29

ngay ký tù ®ã mµ kh«ng cÇn ta gâ phÝm Enter nh− c¸c hµm nhËp tõ


stdin. KÕt qu¶ tr¶ vÒ cña hµm lµ ký tù ®−îc nhÊn.
§iÓm kh¸c nhau gi÷a getche() vµ getch() lµ: getche() cho hiÖn ký
tù lªn mµn h×nh cßn getch() th× kh«ng cho hiÖn.
§Ó nhËn c¸c phÝm ®Æc biÖt (c¸c phÝm chøc n¨ng nh− F1, F2...)
cÇn chó ý khi ®−îc nhÊn sÏ cã hai gi¸ trÞ ®−îc göi lªn bé ®Öm bµn
phÝm. VÝ dô, nhÊn phÝm F1, cã gi¸ trÞ ®Çu lµ 0 vµ gi¸ trÞ tiÕp lµ 59 ®−îc
göi lªn bé ®Öm, do ®ã ®Ó nhËn ®−îc m· c¸c phÝm nµy ta ph¶i ®äc bé
®Öm bµn phÝm thªm mét lÇn n÷a.
Trong C++ th−êng sö dông: To¸n tö cin
cin ®Ó nhËn d÷ liÖu tõ bµn phÝm vµ l−u tr÷ vµo biÕn nhí.
Có ph¸p:
cin >> value [ >> value];
value: biÕn d÷ liÖu
Khi gÆp lÖnh cin, ch−¬ng tr×nh sÏ chê ng−êi sö dông nhËp d÷ liÖu
vµo tõ bµn phÝm, qu¸ tr×nh nhËp liÖu cho biÕn d÷ liÖu kÕt thóc khi
ng−êi sö dông nhÊn phÝm Enter hoÆc phÝm Space.
VÝ dô:
#include <iostream.h>
void main()
{
char name[30];
cout << “\nHay nhap vao ten cña ban: ”;
cin >> name;
cout << “\nChao ban ”<< name <<“. Rat vui vi ban da den voi C++ !”;
}
KÕt qu¶ hiÓn thÞ:
Hay nhap vao ten cua ban:...
Chao ban... Rat vui vi ban da den voi C++ !
30 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Trong ng«n ng÷ C th−êng hay sö dông hµm printf() vµ scanf() cho
c¸c thao t¸c vµo/ra d÷ diÖu víi c¸c thiÕt bÞ vµo ra chuÈn.
1.10.2. C©u lÖnh xuÊt gi¸ trÞ
Có ph¸p:
printf("®Þnh d¹ng", Danh s¸ch biÕn);
Trong ®ã, ®Þnh d¹ng quy ®Þnh:
- Cã bao nhiªu biÕn ph¶i cã bÊy nhiªu ®Þnh d¹ng vµ thø tù cña c¸c
®Þnh d¹ng ph¶i phï hîp víi thø tù cña danh s¸ch biÕn.
- M· ®Þnh d¹ng ph¶i phï hîp víi kiÓu d÷ liÖu biÕn vµ b¾t ®Çu b»ng
dÊu phÇn tr¨m %.
VÝ dô:
#include <stdio.h>
void main()
{
char hoten[] = “Nguyen Van A”;
int tuoi=32;
float hesoluong = 5.25;
printf (“\n%s”, hoten);
printf(“, Tuoi: %d”, tuoi);
printf(“, Luong: %f”, hesoluong);
}

KÕt qu¶ hiÓn thÞ:


Nguyen Van A, Tuoi: 32, He so luong: 5.25
Ngoµi hµm printf, trong C/C++ cßn cã c¸c hµm xuÊt d÷ liÖu sau:
Hμm putchar
Hµm putchar ®Ó xuÊt mét ký tù lªn mµn h×nh. KÕt qu¶ cña hµm
tr¶ vÒ ký tù xuÊt nÕu thµnh c«ng vµ cho gi¸ trÞ EOF(-1) nÕu kh«ng
thµnh c«ng.
Ch−¬ng 1: Giíi thiÖu C/C++ 31

Có ph¸p:
int putchar (int ch);
VÝ dô:
char c= 'C' ;
putchar (c) ; /* in ra mµn h×nh ký tù C */
Hμm puts
Hµm puts cã chøc n¨ng xuÊt mét chuçi ký tù ra mµn h×nh.
Có ph¸p:
int puts(char *s);
Hµm nµy sÏ xuÊt chuçi lªn mµn h×nh víi *s lµ con trá kiÓu ký tù
char trá tíi « nhí ®Çu cña vïng nhí chøa chuçi ký tù cÇn xuÊt. Hµm
nµy khi xuÊt sÏ ®−a thªm ký tù \n vµo cuèi, kÕt qu¶ cña hµm =\n nÕu
thµnh c«ng, ng−îc l¹i hµm cho gi¸ trÞ lµ EOF.
Hμm fprintf
Hµm fprintf cho phÐp xuÊt th«ng tin ra m¸y in.
Có ph¸p:
fprintf(stdprn, "§Þnh d¹ng xuÊt, <danh s¸ch c¸c biÓu thøc>);
Hµm nµy t−¬ng tù nh− hµm in ra mµn h×nh nh−ng yªu cÇu chóng
ta thªm vµo tªn quy −íc cña m¸y in.
Trong C++ th−êng sö dông to¸n tö cout ®Ó xuÊt d÷ liÖu.
To¸n tö cout
cout ®−a d÷ liÖu ra thiÕt bÞ ra chuÈn.
Có ph¸p:
cout << data [<<data];
data: cã thÓ lµ mét biÕn d÷ liÖu, mét h»ng, mét biÓu thøc hoÆc kÕt
hîp cña c¸c lo¹i trªn.
32 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

VÝ dô:
#include <iostream.h>
void main()
{
int i = 1;
char Head[] = “Gia tri cua i la: ”;
cout << “\nKiem tra lenh cout !\n” << Head << i;
}

KÕt qu¶ hiÓn thÞ:


Kiem tra lenh cout
Gia tri cua i la: 1
Danh s¸ch c¸c m· ®Þnh d¹ng th«ng dông cña C/C++
Khu«n d¹ng ý nghÜa
%s §−a ra d÷ liÖu d−íi d¹ng x©u ký tù (®Õn khi cã dÊu kÕt thóc x©u)
%c §−a ra d÷ liÖu d¹ng ký tù
%d §−a ra d÷ liÖu d¹ng sè nguyªn
%f §−a ra d÷ liÖu d¹ng sè float
%u §−a ra d÷ liÖu d¹ng sè nguyªn d−¬ng
%x §−a ra d÷ liÖu d¹ng sè c¬ sè 16 (sè Hexa)
%% In ra dÊu %

VÝ dô 1: ViÕt ch−¬ng tr×nh nhËp vµo 4 sè thùc a, b, c, d; sau ®ã


tÝnh vµ ®−a ra mµn h×nh tæng vµ trung b×nh céng cña 4 sè ®ã.
include <stdio.h>
main()
{
float a, b, c, d, e, f ;
clrscr();
printf(“\n - nhap so thu nhat= ” ); scanf(“%f”, &a);
printf(“\n - nhap so thu hai=” ); scanf(“%f”, &b);
Ch−¬ng 1: Giíi thiÖu C/C++ 33

printf(“\n - nhap so thu ba=”); scanf(“%f”, &c);


printf(“\n - nhap so thu tu=”); scanf(“%f”, &d);
e = a+b+c+d;
printf(“\n Tong cua 4 so vua nhap vao= %f”,e);
f = (a+b+c+d)/4;
printf(“\n trung binh cong cua 4 so vua nhap vao= %f”,f);
getch();
}
VÝ dô 2: H·y ch¹y ch−¬ng tr×nh sau ®Ó xem t¸c dông cña m·
®Þnh d¹ng.
/* Khai bao va gan tri dau tien cho bien */
main()
{
int i,j=3,k; /* Chi co j duoc gan gia tri */
float x=15;
float y=1.2e-3; /* Mo ta so thuc o dang khoa hoc */
char c1=“A”;
char c2=“\x41”; /* Mo ta ky tu bang tri ASCII o dang thap luc */
long l1=123L; /* Hang 123 luu tru o dang long */
double z1=.5E8;
printf("KET QUA IN RA MAN HINH \n");
printf("j=%d\n",j);
printf("x=%f,y=%e\n",x,y);
printf("c1=%x,c2=%c\n",c1,c2);
printf("l1=%Ld,z1=%LE\n",l1,z1);
getch();
}
34 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Bài tập chương 1

1. ViÕt ch−¬ng tr×nh C++ ®Ó l−u tr÷ ba biÕn: träng l−îng, chiÒu cao vµ
cì giµy cña anh, chÞ. Khai b¸o biÕn sau ®ã g¸n gi¸ trÞ cho chóng.
2. Bæ sung lÖnh cout hoÆc/vµ printf() vµo ch−¬ng tr×nh trong vÝ dô trªn
®Ó hiÓn thÞ c¸c gi¸ trÞ ®· l−u tr÷.
3. ViÕt ch−¬ng tr×nh l−u tr÷ gi¸ trÞ vµ hiÓn thÞ c¸c kiÓu biÕn cña C++
mµ c¸c anh chÞ biÕt.
4. ViÕt ch−¬ng tr×nh l−u tr÷ tªn hai ch−¬ng tr×nh truyÒn h×nh mµ
anh/chÞ thÝch nhÊt.
5. ViÕt ch−¬ng tr×nh hiÓn thÞ tªn, tuæi cña anh chÞ. L−u tr÷ chóng trong
tÖp víi tªn tïy ý. Sau ®ã viÕt tÖp thø hai gép tÖp thø nhÊt víi kh¶
n¨ng hiÓn thÞ tªn vµ tuæi cña anh chÞ.
6. ViÕt ch−¬ng tr×nh ®Þnh nghÜa 10 tªn h»ng tõ 0 ®Õn 9, vÝ dô ZERO
®Õn NINE. Sö dông chóng ®Ó hiÓn thÞ lªn mµn h×nh.
7. ViÕt ch−¬ng tr×nh nhËp ®iÓm thi cña c¸c m«n häc trong häc kú võa
qua cña anh chÞ. Sau ®ã hiÓn thÞ ®iÓm trung b×nh céng.
8. Söa ®æi ch−¬ng tr×nh trong bµi tËp 7 ®Ó nhËp ®iÓm vµ tªn sinh viªn
bÊt kú trong líp.
9. ViÕt ch−¬ng tr×nh nhËp vµo ba c¹nh cña mét tam gi¸c a, b, c sau ®ã
tÝnh diÖn tÝch tam gi¸c theo c«ng thøc: S = p ( p − a )( p − b )( p − c)
trong ®ã p = (a + b + c)/2.
10. ViÕt ch−¬ng tr×nh nhËp tõ bµn phÝm vµ sau ®ã xuÊt ra mµn h×nh,
c¸c th«ng tin cña mét mÆt hµng bao gåm: tªn mÆt hµng, träng
l−îng, ®¬n gi¸, m· chÊt l−îng.
Ch−¬ng 1: Giíi thiÖu C/C++ 35

11. Sö dông lÖnh cout ®Ó viÕt ch−¬ng tr×nh hiÓn thÞ bøc tranh nh−
d−íi ®©y:
+
/ * \
| | |
| | |
| | |
| | |
/ | | | \
/ * \
* * *
*
36 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Chương 2 

SỬ DỤNG CÁC PHÉP TOÁN CỦA C/C++

Néi dung cña ch−¬ng sÏ tr×nh bμy c¸c vÊn ®Ò sau:


- BiÓu thøc
- C¸c phÐp to¸n sè häc
- C¸c phÐp to¸n quan hÖ vμ logic
- C¸c phÐp to¸n kh¸c, lÖnh if
- Thø tù −u tiªn gi÷a c¸c phÐp to¸n

2.1. BiÓu thøc


BiÓu thøc lµ sù kÕt hîp hîp lÖ mét hay nhiÒu phÐp to¸n thùc hiÖn
trªn c¸c biÕn, h»ng hoÆc c¸c gi¸ trÞ cña hµm.
VÝ dô: float a, b=3.5; b=(a=b*25);
§èi t−îng cña c¸c phÐp to¸n ®−îc gäi lµ to¸n h¹ng. C¸c phÐp
to¸n ®−îc biÓu thÞ th«ng qua c¸c to¸n tö.
To¸n tö t¸c ®éng lªn mét to¸n h¹ng gäi lµ to¸n tö mét ng«i. To¸n
tö t¸c ®éng lªn hai to¸n h¹ng gäi lµ to¸n tö hai ng«i.
ViÖc tÝnh mét biÓu thøc sÏ thùc hiÖn mét hay nhiÒu phÐp to¸n vµ
cho l¹i mét kÕt qu¶, kiÓu d÷ liÖu cña kÕt qu¶ ®−îc x¸c ®Þnh bëi kiÓu d÷
liÖu cña c¸c to¸n h¹ng. Khi hai hay nhiÒu to¸n h¹ng ®−îc tæ hîp víi
nhau qua to¸n tö, biÓu thøc ®−îc xem nh− lµ mét biÓu thøc tÝnh to¸n.
TrËt tù tÝnh to¸n ®−îc x¸c ®Þnh bëi thø tù −u tiªn vµ luËt kÕt hîp cña
c¸c to¸n tö.
CÇn l−u ý, trong c¸c biÓu thøc cña C/C++ kh«ng dïng c¸c cÆp dÊu
[, ], {, } nh− trong c¸c biÓu thøc to¸n häc mµ ®Òu sö dông dÊu ngoÆc
trßn ( vµ ).
Ch−¬ng 2: Sö dông c¸c phÐp to¸n cña C/C++ 37

2.2. C¸c phÐp to¸n sè häc

To¸n tö Chøc n¨ng C¸ch dïng


+ Céng Expr + Expr
- Trõ Expr - Expr
* Nh©n Expr * Expr
/ Chia Expr / Expr
% LÊy phÇn d− Expr % Expr

trong ®ã:
- Expr lµ to¸n h¹ng.
- PhÐp chia gi÷a hai sè nguyªn cho kÕt qu¶ lµ mét sè nguyªn. NÕu
th−¬ng sè chøa phÇn thËp ph©n th× nã sÏ bÞ lµm trßn.
- PhÐp to¸n lÊy phÇn d− (%) tÝnh phÇn d− cña phÐp chia gi÷a hai
gi¸ trÞ. Nã chØ ¸p dông cho c¸c to¸n h¹ng thuéc kiÓu nguyªn tøc lµ c¶
hai to¸n h¹ng cïng ph¶i cã kiÓu nguyªn.
VÝ dô:
int so1 = 10;
int so2 = 3;
int so3 = so1 / so2; /* phep chia hai so nguyen cho ket qua la so
nguyen 10/3 = 3 */
int so4 = so1 % so2; /* phep modulo (%) cho phan du cua phep chia
10 % 3 = 1 */

C¸c tr−êng hîp ®Æc biÖt:


Cã thÓ x¶y ra c¸c tr−êng hîp ®Æc biÖt nh−: chia cho kh«ng hoÆc
trµn «.
Trµn « x¶y ra trong phÐp g¸n, vÝ dô ta xem xÐt c¸c c©u lÖnh g¸n sau:
unsigned char uc=32;
int i = 8;
uc = i*uc; // trμn «
Lóc nµy m¸y tÝnh sÏ dõng thùc hiÖn ch−¬ng tr×nh vµ th«ng b¸o lçi
overflow.
38 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

2.3. C¸c phÐp to¸n quan hÖ vμ logic


C¸c phÐp to¸n quan hÖ vµ logic cho l¹i mét gi¸ trÞ ®óng hay sai.
Mét ®iÒu kiÖn ®óng sÏ cho gi¸ trÞ lµ 1 vµ sai cho gi¸ trÞ lµ 0. C¸c phÐp
to¸n quan hÖ gåm: == (b»ng), != (kh«ng b»ng), > (lín h¬n), < (nhá
h¬n), >= (lín h¬n hoÆc b»ng), <= (nhá h¬n hoÆc b»ng).
C¸c phÐp to¸n logic bao gåm: ! (phñ ®Þnh hay NOT), && (nh©n
logic hay phÐp AND ), || (céng logic hay phÐp hoÆc OR). Trong lËp
tr×nh, c¸c phÐp to¸n logic cã thÓ kÕt hîp nhau ®Ó t¹o nªn biÓu thøc
logic.
To¸n tö so s¸nh b»ng
Có ph¸p: expr1 = = expr2
ý nghÜa: lµ to¸n tö so s¸nh 2 to¸n h¹ng.
To¸n tö AND (vμ)
Có ph¸p: expr1 && expr2
ý nghÜa: Tr¶ l¹i gi¸ trÞ ®óng chØ khi c¶ hai to¸n h¹ng cña nã cã
gi¸ trÞ ®óng.
1 && 1 = 1 1 && 0 = 0
0 && 1 = 0 0 && 0 = 0
To¸n tö OR (hoÆc):
Có ph¸p: expr1 || expr2
ý nghÜa: Tr¶ l¹i gi¸ trÞ ®óng chØ khi mét trong hai to¸n h¹ng cña
nã cã gi¸ trÞ ®óng
1 || 1 = 1 1 || 0 = 1
0 || 1 = 1 0 || 0 = 0
Víi c¸c to¸n tö vµ && to¸n tö hoÆc ||, c¸c to¸n h¹ng ®−îc tÝnh tõ
tr¸i qua ph¶i. ViÖc tÝnh to¸n sÏ dõng l¹i ngay khi gi¸ trÞ ®óng hay sai
cña biÓu thøc ®−îc x¸c ®Þnh, ch¼ng h¹n víi: expr1 && expr2 vµ
Ch−¬ng 2: Sö dông c¸c phÐp to¸n cña C/C++ 39

expr1 || expr2 th× expr2 sÏ kh«ng ®−îc tÝnh n÷a nÕu: Trong biÓu thøc
expr1 && expr2, expr1 cã gi¸ trÞ sai, hoÆc trong biÓu thøc
expr1 || expr2, expr1 cã gi¸ trÞ ®óng.
To¸n tö phñ ®Þnh NOT
Có ph¸p: ! expr
ý nghÜa: Tr¶ l¹i gi¸ trÞ ®óng nÕu to¸n h¹ng cña nã cã gi¸ trÞ sai vµ
ng−îc l¹i.
To¸n tö g¸n
Có ph¸p: <BiÕn> = <biÓu thøc>
VÝ dô:
x = a; // cÊt gi÷ gi¸ trÞ a vµo vïng nhí cña biÕn x
ý nghÜa: CÊt gi÷ mét gi¸ trÞ míi vµo vïng bé nhí liªn kÕt víi to¸n
h¹ng bªn tr¸i.
KÕt qu¶ cña to¸n tö g¸n lµ gi¸ trÞ cña biÓu thøc ë vÕ ph¶i cña to¸n
tö. KiÓu d÷ liÖu cña kÕt qu¶ lµ kiÓu cña to¸n h¹ng bªn tr¸i.
Th−êng dïng c©u lÖnh g¸n tÝch lòy:
Có ph¸p: <biÕn> op = <biÓu thøc>;
trong ®ã, op lµ mét phÐp to¸n hai ng«i nµo ®ã nh− +, -, *, /, %
hoÆc c¸c phÐp thao t¸c bit ®èi víi to¸n h¹ng nguyªn & (AND), | (OR),
^(XOR), << (dÞch tr¸i), >> (dÞch ph¶i).
VÝ dô:
a+ = b-c; t−¬ng ®−¬ng víi a= a+b-c;
a/=b+c; t−¬ng ®−¬ng víi a=a/(b+c);
a&=b t−¬ng ®−¬ng víi a=a&b
a+ = (b = 5); /* g¸n gi¸ trÞ 5 vµo biÕn b råi céng 5 vµo a*/
a+ = (b+ =2); /* nÕu a = 5 vµ b = 6 th× sau khi thi hµnh c©u
lÖnh trªn ta ®−îc b = 8 vµ a = 13*/
40 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

To¸n tö g¸n ®−îc thùc hiÖn tõ ph¶i sang tr¸i v× vËy víi hai vÝ dô
trªn cã thÓ bá dÊu ngoÆc.
a = b = c = 0 /* biÓu thøc nµy hoµn toµn ®óng */.
To¸n tö ph¶y
§©y lµ mét to¸n tö ®Æc biÖt cã ký hiÖu lµ ",". BiÓu thøc ph¶y gåm
mét cÆp biÓu thøc c¸ch nhau b»ng dÊu ph¶y vµ ®−îc tÝnh to¸n tõ biÓu
thøc bªn tr¸i sau ®ã ®Õn biÓu thøc bªn ph¶i. KÕt qu¶ cña toµn bé biÓu
thøc ph¶y sÏ lµ kÕt qu¶ cña biÓu thøc bªn ph¶i. To¸n tö ph¶y lµ ®Æc thï
riªng cña C/C++ mµ trong ng«n ng÷ Pascal kh«ng cã.
VÝ dô:
int x, y, z;
x = (y = 2, z = y*y + 3);

KÕt qu¶ sÏ lµ y = 2; z =7 vµ x = 7.
ChuyÓn ®æi kiÓu d÷ liÖu
- Khi hai to¸n h¹ng trong mét phÐp to¸n kh¸c kiÓu d÷ liÖu th× kiÓu
d÷ liÖu thÊp ®−îc n©ng thµnh kiÓu d÷ liÖu cao tr−íc khi tÝnh to¸n.
VÝ dô: nÕu f cã kiÓu float vµ i cã kiÓu int th× trong biÓu thøc f+i, i
sÏ t¹m thêi ®−îc chuyÓn sang kiÓu float ®Ó thùc hiÖn phÐp céng.
- NÕu f cã kiÓu float, i1 vμ i2 cã kiÓu int vµ cã gi¸ trÞ 10 vµ 3 th×
biÓu thøc f =i1/i2 sÏ cã gi¸ trÞ 3.0. §Ó thu ®−îc kÕt qu¶ chÝnh x¸c
trong tr−êng hîp nµy cÇn sö dông phÐp Ðp kiÓu: f = (float) i1/i2.

2.4. LÖnh if, else

Th«ng th−êng sö dông c¸c phÐp to¸n quan hÖ víi lÖnh if. BiÓu
thøc chøa phÐp to¸n quan hÖ ®−îc xem nh− biÓu thøc quyÕt ®Þnh. Có
ph¸p sö dông nh− sau:
if(<biÓu thøc ®iÒu kiÖn>) <C©u lÖnh 1>; [else <C©u lÖnh 2>;]
Ch−¬ng 2: Sö dông c¸c phÐp to¸n cña C/C++ 41

Khi thùc hiÖn c©u lÖnh nµy, m¸y tÝnh sÏ kiÓm tra biÓu thøc ®iÒu
kiÖn. NÕu <biÓu thøc> cho gi¸ trÞ ®óng th× c¸c lÖnh 1 ®−îc thùc hiÖn,
ng−îc l¹i c¸c lÖnh 2 ®−îc thùc hiÖn. L−u ®å:

Sai
Biểu thức

Đúng

Lệnh 1 Lệnh 2

VÝ dô 1: T×m sè lín nhÊt trong 2 sè nhËp vµo tõ bµn phÝm


Ph©n tÝch thuËt to¸n:
B¾t ®Çu:
int a, b, max; /* Khai b¸o 3 biÕn*/
NhËp gi¸ trÞ a, b;
max = a;
NÕu (b>a)
max = b;
In kÕt qu¶ a, b, max;
LÖnh dõng;
KÕt thóc

Ch−¬ng tr×nh nh− sau:


#include<stdio.h>
#include<conio.h>
main()
{
clrscr();
float a,b,max;
printf("\n Nhap so thu nhat=");
scanf("%f",&a);
42 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

printf("\n Nhap so thu hai=");


scanf("%f",&b);
max=a;
if (b>a)
max=b;
printf("\n So thu nhat= %f",a);
printf("\n So thu hai = %f",b);
printf("\n So lon nhat= %f",max);
getch();
}

VÝ dô 2: LËp ch−¬ng tr×nh tÝnh gi¸ trÞ hµm sè:

⎧x + 2 nÕu x ≤ −1

y = ⎨ x 2 + 1 nÕu − 1 < x < 2
⎪ 3
⎩2x − 4 nÕu x ≥ 2
T¹i c¸c ®iÓm n»m trong ®o¹n [a,b] ®−îc chia thµnh n ®o¹n con
®Òu nhau.
Ch−¬ng tr×nh nh− sau:
# include <stdio.h>
# include <conio.h>
int i,n;
float a,b,h,x,y;
void main()
{
clrscr();
printf("Nhap a, b:"); scanf("%f%f", &a, &b);
printf("Nhap so diem:"); scanf("%d",&n);
h=(b-a)/n;
Ch−¬ng 2: Sö dông c¸c phÐp to¸n cña C/C++ 43

printf("\n BANG GIA TRI HAM SO \n*");


for (i=0; i<=n; i++)
{
x=a + i*h;
if (x<=-1) y=x+2; else
if (x<2) y=x*x+1;
else y=2*x*x*x+4;
printf("\n%5.2f%8.2f",x,y);
}
printf("\n");
getch();
}

LÖnh else ®−îc sö dông víi lÖnh if nh− sau:


if(®iÒu kiÖn)
{mét lÖnh hay mét khèi lÖnh};
else
{mét lÖnh hay mét khèi lÖnh }
NÕu ®iÒu kiÖn ®−îc tháa m·n th× khèi lÖnh sau if ®−îc thùc hiÖn,
nÕu kh«ng th× khèi lÖnh sau else ®−îc thùc hiÖn.
Cã thÓ lÆp cÆp lÖnh if-else bao nhiªu lÇn tïy ý, vÝ dô:
if (®k1)
{....}
else if (®k2)
{....}
else
{...}
44 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

2.5. C¸c phÐp to¸n kh¸c


To¸n tö t¨ng vμ gi¶m
To¸n tö t¨ng (++) vµ gi¶m (--) ®−a ra c¸ch viÕt gän vµ thuËn tiÖn
biÓu thÞ sù t¨ng hay gi¶m ®i 1 tõ gi¸ trÞ cña mét biÕn. Mçi to¸n tö ®Òu
cã d¹ng tiÒn tè vµ hËu tè. D¹ng tiÒn tè vµ hËu tè cho l¹i c¸c gi¸ trÞ
kh¸c nhau ®èi víi biÕn sö dông.
Cã hai d¹ng:
1. ++ <biÕn> vµ <biÕn>++
2. - - <biÕn> vµ <biÕn> - -
§Ó dÔ hiÓu chóng ta xÐt vÝ dô sau:
i =3;
s = ++ i;

KÕt qu¶ s lµ 4, v× lÖnh ++i sÏ thùc hiÖn phÐp t¨ng biÕn tr−íc sau
®ã míi thùc hiÖn nh÷ng phÐp to¸n kh¸c.
Cßn nÕu viÕt
i =3;
s = i++;

kÕt qu¶ cña s lµ 3 v× lÖnh i ++ kh«ng ®−îc thùc hiÖn tr−íc lÖnh g¸n.
Nh− vËy, ++<biÕn> vµ -- <biÕn> sÏ thùc hiÖn phÐp to¸n t¨ng hoÆc
gi¶m gi¸ trÞ cña biÕn tr−íc råi míi thùc hiÖn nh÷ng phÐp to¸n kh¸c,
cßn <biÕn> ++ vµ <biÕn> -- th× ng−îc l¹i nh− ®· xÐt trong vÝ dô trªn.
VÝ dô: i++; ++i; j--; --j;
To¸n tö sizeof
To¸n tö sizeof cho l¹i kÝch cì tÝnh theo byte cña mét biÓu thøc
hay mét bé x¸c ®Þnh kiÓu.
VÝ dô: sizeof(int) cho l¹i gi¸ trÞ 2.
Ch−¬ng 2: Sö dông c¸c phÐp to¸n cña C/C++ 45

To¸n tö ba ng«i
To¸n tö ®iÒu kiÖn hay to¸n tö ba ng«i ký hiÖu lµ ? gåm ba
thµnh phÇn:
<§iÒu kiÖn> ? <biÓu thøc 1>: <biÓu thøc 2>
KÕt qu¶ cña biÓu thøc trªn b»ng biÓu thøc 1 nÕu ®iÒu kiÖn cã kÕt
qu¶ kh¸c 0, ng−îc l¹i kÕt qu¶ cña biÓu thøc nµy b»ng biÓu thøc 2.
VÝ dô:
a = 1>5 ? 15: -15 /* biÓu thøc a cho kÕt qu¶ b»ng -1 */
char c, t;
t = 'E';
c = (t >= 'A') && (t <= 'Z') ? t:'A';
/* biÓu thøc c cho kÕt qu¶ b»ng ký tù E */

BiÓu thøc b = a?a: -a; cho kÕt qu¶ b chøa gi¸ trÞ tuyÖt ®èi cña a. BiÓu
thøc nµy t−¬ng ®−¬ng víi: if(a > 0) b = a; else b = -a;
To¸n tö thao t¸c bit
To¸n tö nµy cho phÐp xö lý tõng bit cña mét sè nguyªn kh«ng
dïng cho kiÓu float vµ double. C¸c t¸c vô bao gåm AND(&), OR(|),
XOR (^), dÞch tr¸i (<<), dÞch ph¶i (>>), lÊy phÇn bï (~) theo bit.
To¸n tö thao t¸c bit coi c¸c to¸n h¹ng cña nã nh− lµ mét tËp hîp
c¸c bit. Mçi bit cã thÓ chøa gi¸ trÞ 1 hoÆc 0. To¸n tö thao t¸c bit cho
phÐp ng−êi lËp tr×nh kiÓm thö hay ®Æt gi¸ trÞ cho tõng bit hay tõng
nhãm bit.
To¸n tö Chøc n¨ng C¸ch dïng
~ phñ ®Þnh (NOT) ~Expr
<< dÞch chuyÓn tr¸i Expr1 << Expr2
>> dÞch chuyÓn ph¶i Expr1 >> Expr2
& vμ bit (AND) Expr1 & Expr2
^ hoÆc bit (XOR) Expr1 ^ Expr2
| hoÆc bit (OR) Expr1 ^ Expr2
46 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

trong ®ã, Exp, Exp1, Exp2 lµ c¸c biÓu thøc


To¸n h¹ng cña to¸n tö bit ph¶i cã kiÓu nguyªn.
To¸n tö phñ ®Þnh bit (~):
§¶o l¹i gi¸ trÞ tõng bit cña to¸n h¹ng, bit 0 ®−îc ®Æt thµnh 1 vµ bit 1
®Æt thµnh 0.
VÝ dô: char c = 0x0f; nÕu c1 = ~c; th× c1 cã gi¸ trÞ 0xf0;
C¸c phÐp to¸n dÞch chuyÓn bit
To¸n tö dÞch chuyÓn tr¸i (<<) vµ to¸n tö dÞch chuyÓn ph¶i (>>) sÏ
chuyÓn c¸c bit cña to¸n h¹ng bªn tr¸i ®i mét sè vÞ trÝ hoÆc sang tr¸i
hoÆc sang ph¶i.
C¸c bit v−ît qu¸ trong to¸n h¹ng sÏ bÞ bá qua. NÕu to¸n h¹ng lµ kh«ng
dÊu th× to¸n tö dÞch chuyÓn tr¸i sÏ thªm c¸c bit cã gi¸ trÞ 0 vµo bªn ph¶i.
§èi víi kiÓu kh«ng dÊu th×:
a << n = a* (2n)
a << = a/ (2n)
To¸n tö dÞch chuyÓn ph¶i sÏ thªm c¸c bit cã gi¸ trÞ 0 vμo bªn tr¸i
NÕu to¸n h¹ng lµ cã dÊu th× nã cã thÓ thªm b¶n sao cña bit dÊu
hoÆc thªm c¸c bit gi¸ trÞ 0 (tïy thuéc vµo m¸y)
To¸n tö vμ bit (&)
To¸n tö vµ bit lµ to¸n tö hai ng«i. Víi mçi vÞ trÝ bit th× kÕt qu¶ tr¶ l¹i
lµ bit 1, nÕu c¶ hai to¸n h¹ng ®Òu chøa bit 1, ng−îc l¹i kÕt qu¶ lµ bit 0.
To¸n tö XOR bit (^)
To¸n tö XOR bit lµ to¸n tö hai ng«i. Víi mçi vÞ trÝ bit th× kÕt qu¶
cho l¹i lµ bit 1 nÕu mét trong hai chøa bit 1, tøc kh«ng cÇn ®ång thêi
c¶ hai cã chøa bit 1, ng−îc l¹i kÕt qu¶ lµ bit 0.
To¸n tö hoÆc bit ( | )
To¸n tö hoÆc bit lµ to¸n tö hai ng«i. Víi mçi vÞ trÝ bit th× kÕt qu¶
tr¶ l¹i lµ bit 1 nÕu mét trong hai to¸n h¹ng cã chøa bit 1, ng−îc l¹i kÕt
qu¶ lµ bit 0.
Ch−¬ng 2: Sö dông c¸c phÐp to¸n cña C/C++ 47

2.6. Thø tù −u tiªn thùc hiÖn c¸c phÐp tÝnh

Thø tù −u tiªn cña c¸c to¸n tö lµ tr×nh tù thùc hiÖn chóng trong
mét biÓu thøc hîp thµnh. §©y lµ ®iÒu quan träng cÇn ph¶i nhí ®Ó tr¸nh
c¸c lçi ch−¬ng tr×nh th«ng th−êng.
B¶ng sau cho ta mét tËp hîp ®Çy ®ñ c¸c to¸n tö cña C++ theo trËt
tù −u tiªn tÝnh to¸n, møc −u tiªn cµng cao th× phÐp to¸n cµng cã quyÒn
−u tiªn thùc hiÖn tr−íc.
R: thø tù kÕt hîp tõ ph¶i qua tr¸i
L: thø tù kÕt hîp tõ tr¸i qua ph¶i
VÝ dô 17R cã nghÜa lµ sè −u tiªn møc 17, kÕt hîp tõ ph¶i qua tr¸i
Møc To¸n tö Chøc n¨ng
17R :: Ph¹m vi toμn côc (mét ng«i)
17L :: Ph¹m vi líp (hai ng«i)
16L ->, . Chän thμnh phÇn cña cÊu tróc, líp
16L [] ChØ sè m¶ng
16L () Gäi hμm
16L () X©y dùng kiÓu
16L sizeof TÝnh kÝch cì theo byte
15R ++, -- PhÐp t¨ng, gi¶m
15R ~ PhÐp thao t¸c bit NOT
15R ! PhÐp to¸n logic NOT
15R +, - Céng trõ mét ng«i
15R *, & PhÐp lÊy gi¸ trÞ, lÊy ®Þa chØ
15R () ChuyÓn ®æi kiÓu
15R new, delete Qu¶n lý bé nhí tù do
14L ->*, .* Bé chän con trá thμnh phÇn
13L *, /, % C¸c to¸n tö nh©n, chia
12L +, - C¸c to¸n tö sè häc
11L <<, >> DÞch chuyÓn bit
10L <, <=, >, >= To¸n tö quan hÖ
48 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

9L ==, != So s¸nh b»ng, kh«ng b»ng


8L & PhÐp to¸n vμ bit (AND)
7L ^ PhÐp to¸n hoÆc lo¹i bit (XOR)
6L | PhÐp to¸n hoÆc bit (OR)
5L && PhÐp logic vμ (AND)
4L || PhÐp logic hoÆc (OR)
3L ?: PhÐp if sè häc
2R =, *=, /=, %=, +=, -=
C¸c to¸n tö g¸n
2R <<=, >>=, &=, | =, ^=

1L , To¸n tö ph¶y

VÝ dô 1:
Cho m¶ng mét chiÒu kiÓu sè thùc nh− sau:
a[] ={3.5, 0, 23.3, 0, 4.7, -2, 10, 30, 40}
ViÕt ch−¬ng tr×nh ®Ó x¸c ®Þnh:
- PhÇn tö ©m ®Çu tiªn lµ phÇn tö thø mÊy
- Sè phÇn tö d−¬ng ®Çu tiªn
- Tæng c¸c phÇn tö d−¬ng ®Çu tiªn
- Max cña phÇn tö d−¬ng ®Çu tiªn
Ch−¬ng tr×nh nh− sau:
float a[]={3.5, 0, 23.3, 0, 4.7, -2, 10, 30, 40};
main()
{
float s=0,max=0;
int k=0,i;
clrscr();
for (i=0;i<9;++i)
{
if(a[i] <0)
Ch−¬ng 2: Sö dông c¸c phÐp to¸n cña C/C++ 49

break;
if(a[i] >0)
{
s+=a[i];
k++;
if (max < a[i])
max=a[i];
}
}
printf("\nPhan tu am dau tien la phan tu thu %d\co tri = %8.2f",i+1,a[i]);
printf("\nSo phan tu duong dau tien la: %d",k);
printf("\nTong cac phan tu duong dau tien la: %8.2f",s);
printf("\nMax cua phan tu duong dau tien la: %8.2f",max);
getch();
}

VÝ dô 2:
ViÕt ch−¬ng tr×nh tÝnh c¨n bËc hai cña mét sè nhËp vµo tõ bµn phÝm.
/* Chuong trinh tinh can bac 2 */
main()
{
double a,xn,c,fabs();
int i;
tt:printf("\nNhap vao mot so a= ");
scanf("%lf",&a);
if(a<0)
{
printf("\nKhong the tinh can bac 2 cua so am\n");
printf("\nBam phim bat ky de nhap lai");
getch();
50 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

goto tt;
}
if(a==0)
{
xn=0;
goto kq;
}
xn=a;
do
{
c=xn;
xn=(xn*xn+a)/(2*xn);
}
while(fabs((xn-c)/c) > 1e-5);
kq:printf("\nNeu a= %8.2f,thi can bac hai cua a=%8.2f\ ",a,xn);
printf("\n\n Tiep tuc nua khong ?(tiep=1,khong=0)");
scanf("%d",&i);
if(i==1) goto tt;
}
Ch−¬ng 2: Sö dông c¸c phÐp to¸n cña C/C++ 51

Bài tập chương 2

1. VÝ dô trong ch−¬ng tr×nh cã khai b¸o nh− sau:


unsigned int ui1=3, ui2=7;
H·y cho biÕt kÕt qu¶ cña c¸c phÐp to¸n sau:
(a) ui1 & ui2
(b) ui1 && ui2
(c) ui1 | ui2
(d) ui1 || ui2
(e) ui1 << 2
(f) ui1 ^ ui2
(g) ui1 >> 3
2. Theo thø tù −u tiªn trong C++ th× phÐp to¸n sau tr¶ l¹i kÕt qu¶ bao
nhiªu: 6 + 3 * 4 / 2 + 2
3. ViÕt ch−¬ng tr×nh tÝnh diÖn tÝch h×nh trßn cã b¸n kÝnh r.
4. ViÕt ch−¬ng tr×nh hiÓn thÞ sè d− cña phÐp chia hai sè nguyªn nhËp
tõ bµn phÝm.
5. ViÕt ch−¬ng tr×nh chuyÓn ®æi sè nguyªn sang sè nhÞ ph©n.
6. C¸c biÓu thøc sau ®©y cho gi¸ trÞ True hay False:
a) ‘C’ < ‘c’
b) ‘0’ > ‘0’
c) ‘?’ > ‘)’
7. ViÕt ch−¬ng tr×nh cho biÕt sè nhËp tõ bµn phÝm lµ ch½n hay lÎ.
8. Cho tr−íc c¸c lÖnh: int i = 12, j = 10, k = 5;
52 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Cho biÕt kÕt qu¶ (True hay False) cña c¸c lÖnh sau:
a) i&&j
b) 12-i || k
c) j!=k && i!=k
9. ViÕt ch−¬ng tr×nh chuyÓn ®æi ch÷ hoa thµnh ch÷ th−êng. C¸c ký tù
®−îc nhËp tõ bµn phÝm, nÕu ký tù lµ ch÷ th−êng th× kh«ng chuyÓn ®æi.
10. ¤ng B lµm viÖc 50 giê cho mét cöa hµng. ¤ng ta ®−îc nhËn
8 ngh×n/giê cho 40 giê ®Çu. N¨m giê tiÕp theo «ng ®−îc tr¶ gÊp r−ìi
sè tiÒn b×nh th−êng nhËn ®−îc cho mét giê. NhËn ®−îc gÊp hai sè tiÒn
trong mét giê cho c¸c giê lµm viÖc cßn l¹i. ¤ng B ph¶i tr¶ 10% thuÕ
thu nhËp. H·y viÕt ch−¬ng tr×nh tÝnh tæng thu nhËp, sè thuÕ ph¶i nép
cña «ng B.
11. LËp ch−¬ng tr×nh gi¶i hÖ:
⎧ax + by = c

⎩ dx + ey = f
C¸c hÖ sè a, b, c, d, e, f nhËp vµo tõ bµn phÝm. Yªu cÇu xÐt tÊt c¶ c¸c
tr−êng hîp cã thÓ.
12. ViÕt ch−¬ng tr×nh nhËp ba c¹nh cña mét tam gi¸c. H·y cho biÕt tam
gi¸c ®ã lµ tam gi¸c g×?
13. Cho ba sè thùc, h·y thay tÊt c¶ c¸c sè ©m b»ng gi¸ trÞ tuyÖt ®èi cña
nã. VÝ dô nhËp a = 2; b = -5; c = -8 th× kÕt qu¶ lµ: a = 2; b = 5; c = 8.
14. ViÕt ch−¬ng tr×nh gi¶i ph−¬ng tr×nh bËc hai.
15. ViÕt ch−¬ng tr×nh nhËp ngµy, th¸ng, n¨m. H·y cho biÕt th¸ng ®ã cã
bao nhiªu ngµy vµ ngµy, th¸ng, n¨m tiÕp theo.
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 53

Chương 3 

SỬ DỤNG CÁC LỆNH CỦA C/C++

3.1. C¸c vßng lÆp while, do-while, for


Trong lËp tr×nh gi¶i c¸c bµi to¸n thùc tÕ, chóng ta lu«n gÆp ph¶i
cÊu tróc lÆp ®Ó thùc hiÖn mét c«ng viÖc nµo ®ã lÆp ®i lÆp l¹i theo mét
quy luËt nµo ®ã. VÝ dô: trong bµi to¸n qu¶n lý c¸n bé, ®Ó nhËp d÷ liÖu
vµo danh s¸ch gåm n ng−êi th× c«ng viÖc lÆp l¹i chÝnh lµ: nhËp th«ng
tin cña mét c¸n bé (gåm hä tªn, ngµy sinh, giíi tÝnh, chøc vô, l−¬ng...)
n lÇn vµo m¸y tÝnh.
Trong nhiÒu tr−êng hîp, sè lÇn lÆp cã thÓ kh«ng biÕt tr−íc mµ chØ
biÕt ®iÒu kiÖn ®Ó dõng lÆp l¹i. VÝ dô bµi to¸n nhËp th«ng tin vÒ mét
c¸n bé nµo ®ã trong mét c¬ quan cho ®Õn khi nhÊn phÝm ESCAPE th×
dõng nhËp.
Trong c¸c ng«n ng÷ lËp tr×nh, cÊu tróc lÆp cho phÐp thùc hiÖn lÆp
®i, lÆp l¹i nhiÒu lÇn mét c©u lÖnh hay mét khèi c©u lÖnh nµo ®ã (chÝnh
lµ khèi c«ng viÖc trong c¸c bµi to¸n thùc tÕ).
Trong C/C++ mét d·y c¸c lÖnh ®Æt trong cÆp dÊu { vµ } ®−îc gäi
lµ mét khèi lÖnh vµ cã thÓ coi khèi lÖnh nµy nh− lµ mét c©u lÖnh riªng
lÎ (t−¬ng tù nh− lÖnh ghÐp trong ng«n ng÷ Pascal).
3.1.1. C©u lÖnh while
§©y lµ c©u lÖnh lÆp sè lÇn kh«ng x¸c ®Þnh cã kiÓm tra ®iÒu kiÖn
tr−íc khi thùc hiÖn vßng lÆp.
Có ph¸p:
while(<biÓu thøc ®iÒu kiÖn>)
<c©u lÖnh>;
S¬ ®å khèi cña cÊu tróc lÆp nh− sau:
54 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Sai
Biểu thức

Đúng

Lệnh Thoát

Tr×nh tù thùc hiÖn:


1. Ch−¬ng tr×nh sÏ tÝnh to¸n gi¸ trÞ <biÓu thøc ®iÒu kiÖn>
2. NÕu biÓu thøc ®iÒu kiÖn cho gi¸ trÞ ®óng th× ch−¬ng tr×nh sÏ
thùc hiÖn <c©u lÖnh>, nÕu biÓu thøc ®iÒu kiÖn cho l¹i gi¸ trÞ sai th× kÕt
thóc c©u lÖnh while.
3. Quay vÒ b−íc 1
NÕu ngay lÇn tÝnh ®Çu tiªn gi¸ trÞ biÓu thøc ®iÒu kiÖn cho l¹i lµ sai
th× phÇn c©u lÖnh sÏ kh«ng bao giê ®−îc thùc hiÖn.
C¸c vßng lÆp while cã thÓ lång nhau theo có ph¸p sau:
while(biÓu thøc ®iÒu kiÖn 1)
{
c©u lÖnh...
while (biÓu thøc ®iÒu kiÖn 2)
{
c©u lÖnh...
}
c©u lÖnh...
}
VÝ dô 1: H·y viÕt ch−¬ng tr×nh ®Ó in ra 10 hµng ch÷ cho biÕt sè
thø tù cña hµng:
#include<stdio.h>
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 55

#include<conio.h>
int i=0;
main()
{
clrscr();
printf("\n Theo chieu tang");
while (i<10)
{
printf("\n Hang thu %2d= %2d",i+1,i);
++ i;
}
getch();
}

VÝ dô 2: ViÕt ch−¬ng tr×nh t¹o mËt khÈu, chØ khi nµo gâ ®óng mËt
khÈu th× míi tho¸t khái vßng lÆp ®Ó thùc hiÖn c©u lÖnh kh¸c. Trong vÝ
dô nµy mËt khÈu lµ m.
#include<stdio.h>
#include<conio.h>
main()
{
char mk;
clrscr();
printf("\n cho biet mat khau:");
scanf("%s",&mk);
while (mk!='m')
{
printf("\n Cho biet mat khau:");
scanf("%s",&mk);
}
56 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

printf("Ban da go dung mat khau");


getch();
}
VÝ dô 3: ViÕt ch−¬ng tr×nh tÝnh 12 + 22 +... + N3.
# include <stdio.h>
# include <conio.h>
void main()
{
int s = 0; int i = 1; int n;
printf("Nhap n:= ");
scanf("%d", &n);
s = 0;
while (i <= n)
{
s = s + i* i;
i = i + 1;
}
printf(" Tong s = %d", s);
getch();
}

3.1.2. C©u lÖnh do..while


Lµ c©u lÖnh kiÓm tra ®iÒu kiÖn sau (kiÓm tra ®iÒu kiÖn sau khi
thùc hiÖn vßng lÆp). CÊu tróc nµy thùc hiÖn khèi lÖnh cho ®Õn khi biÓu
thøc cã gi¸ trÞ b»ng 0.
Có ph¸p:
do
{
<c©u lÖnh>;
}
while(<biÓu thøc ®iÒu kiÖn>)
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 57

S¬ ®å khèi cÊu tróc lÖnh nh− sau:

Lệnh

Đúng
Biểu thức

Sai

Thoát

Thùc hiÖn:
1. Ch−¬ng tr×nh sÏ thùc hiÖn khèi c©u lÖnh sau lÖnh do,
2. KiÓm tra gi¸ trÞ biÓu thøc ®iÒu kiÖn cña lÖnh while, nÕu gi¸ trÞ
biÓu thøc ®iÒu kiÖn lµ ®óng, ch−¬ng tr×nh sÏ thùc hiÖn tiÕp b−íc 1, nÕu
gi¸ trÞ biÓu thøc ®iÒu kiÖn lµ sai, nã sÏ kÕt thóc lÖnh do-while.
Chó ý:
Kh¸c víi lÖnh while, lÖnh do-while bao giê còng cho phÐp thùc
hiÖn khèi lÖnh sau Ýt nhÊt mét lÇn, sau ®ã nã míi kiÓm tra gi¸ trÞ biÓu
thøc ®iÒu kiÖn ®Ó quyÕt ®Þnh cã thùc hiÖn khèi lÖnh ®ã vßng tiÕp theo
hay kh«ng (kiÓm tra ®iÒu kiÖn sau). Cßn lÖnh while th× kiÓm tra gi¸ trÞ
biÓu thøc ®iÒu kiÖn ngay tõ ban ®Çu tr−íc khi quyÕt ®Þnh cho thùc hiÖn
khèi c©u lÖnh (kiÓm tra ®iÒu kiÖn tr−íc).
VÝ dô 1: ViÕt ch−¬ng tr×nh tÝnh trung b×nh céng cña n sè nguyªn
nhËp vµo tõ bµn phÝm. Khi nµo bÊm sè 0 th× kÕt thóc nhËp vµ tÝnh gi¸
trÞ trung b×nh.
# include <stdio.h>
# include<conio.h>
main()
{ int so, tong=0, n=0;
float tb;
58 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

clrscr();
do
{
printf(“\n Nhap vao 1 so (so 0 de dung)”);
scanf(“%d”, &so);
tong+=so;
n+=1;
}
while (so!=0);
n-=1;
tb=tong/n;
printf(“\n Da nhap vao: %d so ”,n);
printf(“\n Trung binh cong= %f ”, tb);
getch();
}

VÝ dô 2: ViÕt ch−¬ng tr×nh tÝnh tæng b×nh ph−¬ng cña n sè nguyªn


theo c«ng thøc: S n = 12 + 22 + .... + n 2
# include<stdio.h>
# include<conio.h>
main()
{
int s=0, i=1, n;
clrscr();
printf(“\n Tinh tong binh phuong cua bao nhieu so nguyen:”);
scanf(“%d”,&n);
do
{
s+ = (i * i);
++ i;
}
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 59

while (i<= n);


printf(“\n Tong binh phuong cua: %d so nguyen dau tien lap: %d”,n,s);
getch();
}

VÝ dô 3: LËp ch−¬ng tr×nh tÝnh gÇn ®óng gi¸ trÞ cña hµm sin(x)
theo c«ng thøc sau:
x3 x5 x 2i +1
sin(x) = x − + + ...(−1)i + ...
3! 5! (2i + 1)!

víi sai sè kh«ng v−ît qu¸ ε cho tr−íc.


§©y thùc chÊt lµ mét bµi to¸n tÝnh tæng c¸c sè h¹ng, trong ®ã mçi
sè h¹ng thø i + 1 ®−îc tÝnh qua sè h¹ng thø i. §iÒu kiÖn ®Ó tho¸t khái
vßng lÆp chÝnh lµ khi gi¸ trÞ sè h¹ng thø n nµo ®ã nhá h¬n hoÆc b»ng
ε. §Ó gi¶i bµi to¸n chóng ta cÇn t×m ®−îc c«ng thøc biÓu diÔn sè h¹ng
thø i + 1 theo sè h¹ng thø i b»ng c«ng thøc truy håi. DÔ dµng t×m
®−îc: a i = − a i −1 x2 víi i: 2.. n.
(2i − 1)( 2i − 2)
Ch−¬ng tr×nh nh− sau:
# include <stdio.h>
# include <conio.h>
# include <math.h>
long i;
float x,y,a;
void main()
{
clrscr();
printf("Nhap gia tri x:");
scanf("%f",&x);
fflush(stdin);
y=a=x;
60 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

i=1;
do
{
i+=2;
a*=-x*x/(2*i-1)/(2*i-2);
y+=a;
}
while (fabs(a) >0.0001);
printf("\n Ham sin la: %0.4f\n",y);
printf("Sai so la: %0.4f\n",y-sin(x));
getch();
}

VÝ dô 4: LËp ch−¬ng tr×nh gi¶i ph−¬ng tr×nh x = sin(x) + 0,1 trªn


®o¹n [0.3, 0.9] b»ng ph−¬ng ph¸p lÆp ®¬n víi ®é chÝnh x¸c ε cho tr−íc.
Ph©n tÝch thuËt to¸n: Ph−¬ng ph¸p lÆp ®¬n gi¶i ph−¬ng tr×nh tæng
qu¸t x = ϕ(x) trªn ®o¹n [a, b] víi ®é chÝnh x¸c ε nh− sau:
B¾t ®Çu, chóng ta chän nghiÖm ban ®Çu x0 trong ®o¹n [a, b], sau
®ã tÝnh: x1 = ϕ(x0), x2 = ϕ(x1),... xn+1 = ϕ(xn)
Qu¸ tr×nh lÆp dõng l¹i khi: ⎪xn+1 -xn⎪ < ε
Ch−¬ng tr×nh nh− sau:
//Chuong trinh giai phuong trinh bang phuong phap lap don
#include <stdio.h>
#include <math.h>
#include <conio.h>
float x1, x2, saiso;
float Phi(float x)
{
return sin(x)+0.1;
}
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 61

void main()
{
clrscr();
printf("Cho biet sai so:"); scanf("%f",&saiso);
printf("Cho xap xi dau tien:"); scanf("%f",&x2);
do
{
x1=x2;
x2 = Phi(x1);
}
while (fabs(x2-x1)>saiso);
printf("\n Nghiem phuong trinh la %0.5f",x2);
getch();
}

3.1.3. C©u lÖnh for


§©y lµ c©u lÖnh lÆp cã kiÓm tra ®iÒu kiÖn tr−íc, nªn sö dông khi
lËp tr×nh viªn biÕt tr−íc ®−îc sè lÇn lÆp.
Có ph¸p:
for (<c©u lÖnh khëi ®Çu>;<biÓu thøc 1>;<biÓu thøc 2>)
{
<c©u lÖnh>;
}
L−u ®å:

Sai
Biểu thức

Đúng

Lệnh Thoát
62 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Thùc hiÖn:
B−íc 1: Thùc hiÖn c©u lÖnh khëi ®Çu, c©u lÖnh khëi ®Çu cã thÓ
hoÆc lµ mét khai b¸o biÕn hay lµ mét biÓu thøc. Nãi chung nã ®−îc
dïng ®Ó khëi ®Çu hay g¸n gi¸ trÞ cho mét hay mét tËp c¸c biÕn hoÆc nã
còng cã thÓ lµ c©u lÖnh rçng.
PhÇn c©u lÖnh khëi ®Çu cã thÓ cã c¸c d¹ng sau:
for (int i = 0; …
for (; … // C©u lÖnh khëi ®Çu rçng
for (i = 0; …
for (int lo = 0, hi=MAX, mid=MAX/2; …
for (char *ptr=getStr (); …
B−íc 2: TÝnh gi¸ trÞ cña biÓu thøc 1. BiÓu thøc 1 ®Ó ®iÒu khiÓn
chu tr×nh, nÕu biÓu thøc 1 cßn ®óng th× viÖc lÆp cßn tiÕp tôc vµ phÇn
c©u lÖnh cßn ®−îc thùc hiÖn, nÕu gi¸ trÞ biÓu thøc 1 cho l¹i lµ sai th× sÏ
kÕt thóc c©u lÖnh for. Còng nh− trong c©u lÖnh while, nÕu ë lÇn tÝnh
®Çu tiªn, gi¸ trÞ cña biÓu thøc 1 ®· cho gi¸ trÞ sai th× phÇn c©u lÖnh sÏ
kh«ng bao giê ®−îc thùc hiÖn.
BiÓu thøc 1 cã thÓ cã c¸c d¹ng sau:
(…; index < arrSize; …)
(…; ptr; …)
(…; *st1++ = *st2++; …)
(…; ch = getNextChar (); …)
B−íc 3: TÝnh gi¸ trÞ biÓu thøc 2. BiÓu thøc 2 ®−îc tÝnh sau mçi lÇn
lÆp chu tr×nh. Nãi chung lµ nã ®−îc dïng ®Ó thay ®æi gi¸ trÞ c¸c biÕn
®· ®−îc khëi ®Çu trong phÇn c©u lÖnh khëi ®Çu. NÕu viÖc tÝnh gi¸ trÞ
lÇn ®Çu cña biÓu thøc 1 cho kÕt qu¶ sai th× biÓu thøc 2 sÏ kh«ng bao
giê ®−îc tÝnh. BiÓu thøc 2 cã thÓ cã c¸c d¹ng sau:
(…;;i++)
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 63

(…;…;ptr = ptr->next)
(…;…;i++,j--,++cnt)
(…;…;) //ch−¬ng tr×nh kh«ng ®iÒu kiÖn
C¸c vßng lÆp for cã thÓ lång nhau theo có ph¸p sau:
for(c©u lÖnh khëi ®Çu 1;biÓu thøc 1;biÓu thøc 2)
{
c©u lÖnh...
for (c©u lÖnh khëi ®Çu 2;biÓu thøc 3;biÓu thøc 4)
{
c©u lÖnh...
}
c©u lÖnh...
}
Chó ý: LÖnh for sÏ gièng nh− lÖnh while trong tr−êng hîp kh«ng
cã gi¸ trÞ ban ®Çu vµ kh«ng tÝnh gi¸ trÞ tiÕp theo cho biÕn ch¹y:
for (; ®iÒu kiÖn gi¸ trÞ cña run;)
{
c©u lÖnh;
}
VÝ dô 1: ViÕt ch−¬ng tr×nh tÝnh tæng b×nh ph−¬ng cña n sè nguyªn
theo c«ng thøc: S n = 12 + 22 + .... + n 2
# include<stdio.h>
# include<conio.h>
main()
{
int s=0, i, n;
clrscr();
64 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

printf(“\n Tinh tong binh phuong cua bao nhieu so nguyen:”);


scanf(“%d”,&n);
for (i=1; i<=n; ++i)
s+ = (i * i);
printf(“\n Tong binh phuong cua: %d so nguyen dau tien lap: %d”,n,s);
getch();
}

VÝ dô 2: ViÕt ch−¬ng tr×nh tÝnh tæng c¸c sè lÎ nguyªn d−¬ng nhá


h¬n n.
# include<stdio.h>
# include<conio.h>
void main()
{
int i, n, s;
printf("nhap n = ");
scanf("%d", &n);
for (i = 1, s = 0; i <= n ; i = i + 2)
s = s + i;
printf(“\n Tong N so le nguye duong dau tien la: %d",s);
getch();
}

3.2. C¸c lÖnh nh¶y


C¸c c©u lÖnh nh¶y gåm break, continue, go to vµ switch. Trong ®ã
c¸c lÖnh break, continue, go to lµ c¸c lÖnh nh¶y trong vµ nh¶y ra khái
vßng lÆp, cßn lÖnh switch lµ lÖnh nh¶y lùa chän.
Sau ®©y ta sÏ xÐt tõng c©u lÖnh.
3.2.1. C©u lÖnh switch
C©u lÖnh switch còng cã ý nghÜa nh− tËp c¸c c©u lÖnh if...else
nh−ng nã x¸c ®Þnh râ h¬n gi¸ trÞ cô thÓ cña biÓu thøc ®iÒu kiÖn. NÕu
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 65

nh− c©u lÖnh if chØ cho chän mét trong hai nh¸nh tÝnh to¸n, tïy theo
gi¸ trÞ cña mét biÓu thøc nguyªn.
Có ph¸p:
switch (Expr)
{
case <constant expr1>:
c©u lÖnh 1;
break;
case <constant expr2>:
c©u lÖnh 2;
break;
case <constant exprn>:
c©u lÖnh n;
break;
default:
c©u lÖnh m;
break;
}
Expr: biÓu thøc kiÓu nguyªn
<constant expr> ph¶i cã gi¸ trÞ lµ mét h»ng sè integer vµ ph¶i cã
gi¸ trÞ duy nhÊt.
Thùc hiÖn:
B−íc 1: Ch−¬ng tr×nh tÝnh to¸n gi¸ trÞ cho biÓu thøc Expr
B−íc 2: So s¸nh gi¸ trÞ tr¶ vÒ cña biÓu thøc Expr vµ gi¸ trÞ cña
<constant expr1>, <constant expr2>,..., <constant exprn>; nÕu biÓu
thøc Expr cã gi¸ trÞ b»ng mét trong c¸c gi¸ trÞ <constant expr1>,
<constant expr2>,..., <constant exprn> th× c¸c khèi lÖnh t−¬ng øng sÏ
®−îc thùc hiÖn vµ sau ®ã c©u lÖnh switch sÏ ®−îc kÕt thóc b»ng c©u
66 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

lÖnh break. NÕu gi¸ trÞ tr¶ vÒ cña biÓu thøc Expr kh«ng n»m trong c¸c
gi¸ trÞ cña <constant expr1>, <constant expr2>,..., <constant exprn>
th× khèi lÖnh trong default sÏ ®−îc thùc hiÖn.
Khi ch−¬ng tr×nh ®· thùc hiÖn xong c©u lÖnh cña case <constant
expri> nµo ®ã, nã sÏ thùc hiÖn lu«n c¸c lÖnh thuéc case bªn d−íi nã
mµ kh«ng xÐt l¹i ®iÒu kiÖn do c¸c <constant expri> ®−îc xem nh− c¸c
nh·n. V× vËy ®Ó ch−¬ng tr×nh tho¸t khái lÖnh swithch sau khi thùc
hiÖn xong mét ch−¬ng tr×nh ta dïng lÖnh break.
VÝ dô 1: ViÕt ch−¬ng tr×nh nhËp vµo mét n¨m, m¸y sÏ th«ng b¸o
n¨m ®ã lµ n¨m nhuËn hay kh«ng?
# include<stdio.h>
# include<conio.h>
main()
{
int nam;
clrscr();
printf(“\n Cho biet nam can xem?”);
scanf(“%d”,&nam);
switch (nam % 4)
{
case 0: printf(“\n Nam %4d”,nam);
printf(“\n La nam nhuan”);
case 1: printf(“\n Nam ngoai%4d”,nam-1);
printf(“\n Moi la nam nhuan”);
break;
case 2: printf(“\n Nam kia %4d”,nam-2);
printf(“\n Moi la nam nhuan”);
break;
default: printf(“\n Sang nam %4d”, nam+1);
printf(“\n Moi la nam nhuan”);
break; } }
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 67

VÝ dô 2: ViÕt ch−¬ng tr×nh thùc hiÖn mét trong 4 phÐp to¸n +, -, *,


/ b»ng c¸ch nhÊn c¸c phÝm mòi tªn ←↑→ trªn bµn phÝm.

# include<stdio.h>
# include<conio.h>
int c;
void main()
{
int a, b;
clrscr();
printf("Nhap hai so nguyen a va b:");
scanf("%d%d", &a, &b);
printf("\n Nhan phim mui ten chon phep toan thuc hien");
c = getch();
if (!c)
switch (getch( ) )
{
case 75: printf("\n Tong a va b la: %d", a + b);
break;
case 77: printf("\n Hieu a va b la: %d", a - b);
break;
case 72: printf("\n Tich a va b la: %d", a * b);
break;
case 80: printf("\n Hieu a va b la: %d", a / b);
}
getch ();
}

3.2.2. C©u lÖnh break


C©u lÖnh break cho phÐp tho¸t khái vßng lÆp cña c¸c lÖnh while,
do, for hay switch... case (nh− trong vÝ dô trªn). LÖnh break t−¬ng tù
nh− lÖnh EXIT trong FOXPRO. Khi cã nhiÒu vßng lÆp lång nhau, lÖnh
break cã t¸c dông ra khái vßng lÆp (hoÆc lÖnh switch) bªn trong nhÊt
68 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

(gÇn nhÊt) chøa nã mµ kh«ng cÇn kiÓm tra ®iÒu kiÖn kÕt thóc vßng lÆp.
Nãi mét c¸ch kh¸c, m¸y sÏ bá qua c¸c c©u lÖnh cßn l¹i ®Ó tho¸t ra
khái vßng lÆp.
3.2.3. C©u lÖnh continue
C©u lÖnh continue lµm cho lÇn lÆp hiÖn t¹i cña chu tr×nh while, do
hay for gÇn nhÊt bao quanh nã ®−îc kÕt thóc, tr¸i víi lÖnh break
Víi lÖnh while hay do viÖc thùc hiÖn lÇn lÆp tiÕp theo tïy thuéc
vµo gi¸ trÞ biÓu thøc cho l¹i, cßn víi lÖnh for th× viÖc thùc hiÖn lÇn lÆp
tiÕp theo tïy thuéc vµo gi¸ trÞ biÓu thøc 2.
Chó ý: Kh¸c víi c©u lÖnh break, c©u lÖnh continue chØ lµm kÕt
thóc lÇn lÆp hiÖn t¹i vµ kh«ng ¸p dông cho switch.
VÝ dô: ViÕt ch−¬ng tr×nh in ra tÊt c¶ c¸c sè ch½n nhá h¬n 101 trõ
c¸c sè 6, 8, 94.
# include <stdio.h>
# include <conio.h>
void main()
{
int i;
for (i = 0; i < 101; i + = 2)
{
if (( i==6) || (i== 8) || (i== 94)
continue;
printf("%5d",i);
}
getch();
}

3.2.4. C©u lÖnh goto


C©u lÖnh goto còng cã kh¶ n¨ng gièng nh− c¸c c©u lÖnh break hay
continue ®Ó nh¶y ra khái mét chu tr×nh hay c©u lÖnh switch, nh−ng
kh¸c c¸c c©u lÖnh trªn lµ goto cã thÓ chuyÓn ®iÒu khiÓn ®Õn mét c©u
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 69

lÖnh bÊt kú tïy thuéc vµo nh·n ®Ých, cßn break chØ cã thÓ chuyÓn ®iÒu
khiÓn ®Õn lÖnh tiÕp ngay sau lÖnh lÆp while, do, for hay switch.
Có ph¸p:
goto nh·n;
C¸c quy ®Þnh sö dông nh·n:
Nh·n lµ tªn do ng−êi dïng x¸c ®Þnh, mét nh·n cã thÓ chØ ®−îc
dïng lµm ®Ých cho mét goto vµ ph¶i ®−îc kÕt thóc b»ng dÊu hai chÊm.
Nh·n kh«ng ®−îc ®øng tr−íc dÊu ngoÆc nhän ®ãng (cã thÓ dïng c©u
lÖnh rçng ®i sau nh·n ®Ó xö lý cho rµng buéc nµy).
C©u lÖnh goto kh«ng ®−îc phÐp nh¶y qua ®Þnh nghÜa cña mét biªn
cã bé khëi ®Çu t−êng minh hay kh«ng t−êng minh trõ khi ®Þnh nghÜa
nµy xuÊt hiÖn trong mét khèi vµ toµn bé khèi bÞ nh¶y qua.
HiÖn nay, víi nh÷ng ng−êi lËp tr×nh cã kinh nghiÖm, ng−êi ta
kh«ng dïng goto trong ch−¬ng tr×nh, v× nh− vËy ch−¬ng tr×nh cã thÓ
nh¶y ®Õn nhiÒu n¬i nªn rÊt khã ®äc, khã hiÓu vµ khã kiÓm so¸t lçi.
VÝ dô:
main()
{
int i,k;
tt: printf(“\n Nhap vao mo ta so nguyen”);
scanf(“%d”,&i);
switch(i);
{
case 0: printf (“\n vua nhap so 0”);
break;
case 1: printf (“\n vua nhap so 1”);
break;
case 2: printf (“\n vua nhap so 2”);
break;
default: printf (“\n vua nhap mo ta so nguyen”);
}
70 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

printf(“\n Tiep tuc nua hay khong?”);


printf(“\n Bam so (1) de tiep tuc, so (2) de dung”);
scanf(“%d”,&k);
if(i= =1)
goto tt;
}

3.3. Hμm vμ ch−¬ng tr×nh con


3.3.1. Kh¸i niÖm vμ quy t¾c x©y dùng hμm
Hµm dïng ®Ó chia mét ch−¬ng tr×nh lín thµnh nhiÒu phÇn nhá
gióp ng−êi lËp tr×nh dÔ ®äc, dÔ hiÓu, dÔ viÕt vµ dÔ söa khi cã lçi.
Sö dông hµm rÊt cã ý nghÜa trong lËp tr×nh v× viÖc sö dông hµm
chÝnh lµ viÖc sö dông vµ t¸i sö dông c¸c phÇn m· ch−¬ng tr×nh ®· viÕt,
nã rÊt cã ý nghÜa trong lµm viÖc lËp tr×nh theo nhãm vµ viÖc sö dông
hµm còng ®ång nghÜa víi viÖc tiÕt kiÖm bé nhí cho hÖ thèng.
Trong ng«n ng÷ C/C++, mçi ch−¬ng tr×nh con lµ mét hμm ®−îc
x©y dùng theo cÊu tróc chung. B¶n th©n ch−¬ng tr×nh còng lµ mét hµm.
§ã lµ hµm main() ®ãng vai trß ®iÒu khiÓn toµn bé ch−¬ng tr×nh. Hµm
lµ mét khèi ch−¬ng tr×nh hoµn chØnh ®Ó thùc hiÖn mét tÝnh to¸n nµo ®ã
mµ ta cã thÓ gäi ®Ó thùc hiÖn ë bÊt cø chç nµo trong ch−¬ng tr×nh. Bëi
vËy khi lËp tr×nh, nÕu gÆp nh÷ng ®o¹n ch−¬ng tr×nh ph¶i sö dông l¹i
nhiÒu lÇn ë nh÷ng chç kh¸c nhau trong ch−¬ng tr×nh th× chóng ta nªn
viÕt nh÷ng ®o¹n ch−¬ng tr×nh ®ã thµnh c¸c hµm vµ sö dông lêi gäi
hµm ®ã thay cho viÖc ph¶i viÕt toµn bé ch−¬ng tr×nh.
Cã thÓ coi hµm lµ mét phÐp to¸n do ng−êi dïng x¸c ®Þnh. Hµm
®−îc biÓu thÞ bëi mét tªn chø kh«ng ph¶i lµ mét to¸n tö.
C¸c to¸n h¹ng cña hµm, ®−îc gäi lµ c¸c ®èi sè cña nã ®−îc x¸c
®Þnh trong danh s¸ch ®èi ph©n c¸ch nhau bëi dÊu ph¶y vµ ®−îc bao
trong ngoÆc trßn.
KÕt qu¶ cña hµm th−êng ®−îc coi lµ kiÓu tr¶ l¹i cña nã, hµm
kh«ng cho gi¸ trÞ tr¶ l¹i cã kiÓu cho l¹i lµ void.
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 71

C¸c hµnh ®éng thùc t¹i mµ mét hµm thùc hiÖn ®−îc x¸c ®Þnh
trong th©n cña hµm, th©n cña hµm ®−îc bao trong ngoÆc nhän (“{ }”)
vµ ®«i khi cßn ®−îc coi nh− mét khèi.
CÊu tróc cña hµm gåm hai phÇn: phÇn khai b¸o vµ phÇn c©u lÖnh.
a. PhÇn khai b¸o
<tªn kiÓu> <tªn hμm> (<khai b¸o c¸c tham biÕn h×nh thøc>
Trong ®ã:
- <tªn kiÓu> lµ kiÓu gi¸ trÞ tr¶ vÒ cña hµm. NÕu hµm ph¶i tr¶ vÒ
mét gi¸ trÞ th× tr−íc hÕt ph¶i khai b¸o kiÓu d÷ liÖu cña hµm
- <tªn hµm> lµ tªn gäi do ta ®Æt ®Ó gäi thùc hiÖn hµm nµy trong
ch−¬ng tr×nh. Tªn hîp lÖ cña hµm gåm 8 ký tù viÕt liÒn nhau. Nªn ®Æt
tªn hµm mang tÝnh gîi nhí ®Ó tiÖn sö dông.
- < Khai b¸o c¸c biÕn h×nh thøc>: lµ d·y khai b¸o c¸c tham biÕn
h×nh thøc c¸ch nhau b»ng dÊu ph¶y. Nh÷ng tham sè nµy khi hµm ®−îc
gäi sÏ ®−îc truyÒn tham sè thùc. NÕu cã nhiÒu tham sè th× ph¶i cã dÊu
ph¶y (,) ®Ó ph©n c¸ch chóng. VÝ dô: float max3s(a, b, c).
Tham sè cña mét hµm cã hai c«ng dông:
- Cung cÊp c¸c gi¸ trÞ cho hµm khi ta gäi nã thùc hiÖn.
- L−u c¸c kÕt qu¶ tÝnh to¸n ®−îc trong qu¸ tr×nh hµm ho¹t ®éng.
Nh− vËy ta cã c¸c lo¹i tham sè:
+ Tham sè vµo: cung cÊp gi¸ trÞ cho hµm
+ Tham sè ra: l−u kÕt qu¶ tÝnh to¸n ®−îc trong hµm
+ Lo¹i tham sè võa vµo, võa ra: võa cung cÊp gi¸ trÞ cho hµm, võa
l−u kÕt qu¶ tÝnh to¸n ®−îc trong hµm.
Khi viÕt mét hµm ta cÇn x¸c ®Þnh xem hµm cã bao nhiªu tham sè.
VÝ dô: PhÇn khai b¸o cña hµm GIAITHUA
long giaithua (int n);
72 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

b. PhÇn th©n hμm


PhÇn nµy thÓ hiÖn c¸c lÖnh cÇn ph¶i thùc hiÖn khi hµm ®−îc gäi.
Nã chÝnh lµ mét c©u lÖnh ghÐp (lÖnh hîp thµnh) bao gåm khai b¸o
h»ng, kiÓu, biÕn trong hµm vµ c¸c c©u lÖnh. Th©n hµm ph¶i ®−îc ®Æt
trong dÊu { vµ }. CÊu tróc th©n hµm nh− sau:
{ <c¸c khai b¸o h»ng, kiÓu, biÕn>;
<c¸c c©u lÖnh>;
...
[return <biÓu thøc>; ]
}
NÕu hµm cho ®óng mét gi¸ trÞ th× <biÓu thøc> trong c©u lÖnh
return sÏ cho gi¸ trÞ tr¶ vÒ cña hµm nµy, tÊt nhiªn kiÓu cña biÓu thøc
ph¶i trïng víi kiÓu cña hµm ®· khai b¸o trong phÇn khai b¸o th©n hµm.
NÕu hµm kh«ng cã gi¸ trÞ tr¶ vÒ th× kh«ng cÇn viÕt c©u lÖnh return
vµ khi ®ã kiÓu cña hµm lµ void. C¸c hµm kh«ng cho gi¸ trÞ tr¶ vÒ gièng
nh− thñ tôc (procedure) trong ng«n ng÷ lËp tr×nh Pascal.
VÝ dô, ta cã thÓ viÕt hµm t×m gi¸ trÞ lín nhÊt (max) trong ba sè lµ
max3s theo kiÓu thñ tôc hiÓn thÞ sè cùc ®¹i trong ba sè nh− sau:
# include <stdio.h>
# include <conio.h>
# include <iostream.h>
void max3s(float a, float b, float c)
{
float max;
max = a;
if (max <b) max = b;
if (max <c) max = c;
cout<<"max="<<max<<"\n";
}
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 73

int main(void)
{
clrscr();
float x,y,z;
x=3; y=8; z=1;
max3s(x,y,z);
getch();
return 0;
}
Trong vÝ dô trªn, hµm max3s kh«ng ®−îc tr¶ vÒ gi¸ trÞ nªn ta khai
b¸o lµ void, c¸c tham sè a, b, c lµ tham sè h×nh thøc cßn x, y, z lµ c¸c
tham sè thùc sù.
Trong tr−êng hîp hµm cho nhiÒu gi¸ trÞ th× c¸c gi¸ trÞ tr¶ vÒ nµy
ph¶i ®Æt trong c¸c tham biÕn h×nh thøc th«ng qua c¸c biÕn con trá.
Trong d·y c©u lÖnh cña hµm cã thÓ sö dông c¸c tham biÕn h×nh
thøc, c¸c biÕn ®Þa ph−¬ng ®−îc khai b¸o trong hµm nµy vµ c¶ c¸c biÕn
toμn côc ®−îc khai b¸o ë ®Çu ch−¬ng tr×nh. Do vËy, hµm cã thÓ kh«ng
cã tham biÕn h×nh thøc. Khi ®ã trong phÇn tham biÕn h×nh thøc ta viÕt
void. Trong hµm main() kh«ng ®−îc sö dông c¸c tham biÕn h×nh thøc
vµ c¸c biÕn ®Þa ph−¬ng khai b¸o trong c¸c hµm kh¸c.
Tuy vËy còng cã hµm kh«ng cã tham sè nh−ng vÉn ph¶i ®Ó cÆp
dÊu ngoÆc ®¬n nh− hµm main(), hµm clrscr() ch¼ng h¹n.
- Khai b¸o kiÓu cho c¸c tham sè: nÕu hµm cã c¸c tham sè h×nh
thøc th× ph¶i khai b¸o kiÓu d÷ liÖu cho c¸c biÕn. NÕu cã nhiÒu tham sè
cã cïng kiÓu d÷ liÖu th× ph¶i cã dÊu ph¶y (,) ®Ó ph©n c¸ch c¸c tham sè.
VÝ dô: float a, b, c;
- Th©n hμm: th©n hµm lµ phÇn ®−îc giíi h¹n bëi cÆp dÊu mãc
nhän { vµ }. Trong th©n hµm gåm:
+ Khai b¸o c¸c biÕn côc bé: VÝ dô float max. C¸c biÕn côc bé chØ
cã t¸c dông trong th©n cña hµm, nã kh«ng cã mèi liªn hÖ g× víi c¸c
74 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

biÕn cña c¸c hµm kh¸c trong ch−¬ng tr×nh. Tr¸i l¹i, c¸c tham sè h×nh
thøc nh− float a, b, c kÓ trªn l¹i ®−îc dïng ®Ó trao ®æi d÷ liÖu tõ hµm
nµy cho hµm kh¸c.
+ Trong th©n hµm cã thÓ sö dông mét c©u lÖnh return, gi¸ trÞ cña
biÓu thøc trong c©u lÖnh return sÏ ®−îc g¸n cho hµm.
- Sö dông hμm: Sau khi ®· t¹o lËp hµm, khi cÇn sö dông hµm trong
ch−¬ng tr×nh chÝnh, ta thùc hiÖn lêi gäi hµm cã hoÆc kh«ng cã c¸c
tham sè thùc nh− sau:
Tªn hμm ([Danh s¸ch c¸c tham sè thùc]);
Chó ý: tr−íc khi sö dông hµm ph¶i khai b¸o kiÓu gi¸ trÞ cña nã:
kiÓu d÷ liÖu tªn hµm(). VÝ dô: float x, y, z, max3s();
3.3.2. C¸ch thøc truyÒn tham sè
§èi víi nh÷ng hµm cã tham sè h×nh thøc th× khi thùc hiÖn ph¶i
®−îc truyÒn gi¸ trÞ thùc cho tham sè nµy. Cã 2 c¸ch truyÒn tham sè:
truyÒn theo trÞ vµ truyÒn theo biÕn.
TruyÒn theo trÞ
Trong C/C++ th× chÕ ®é mÆc ®Þnh lµ truyÒn tham sè theo gi¸ trÞ,
®iÒu nµy cã nghÜa lµ c¸c gi¸ trÞ thùc (tham sè thùc) kh«ng bÞ thay ®æi
gi¸ trÞ khi truyÒn cho c¸c tham sè h×nh thøc.
VÝ dô 1:
/* TruyÒn theo trÞ*/
Void hoanvi(a,b)
{
int tam;
tam=a;
a=b;
b=tam;
}
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 75

main()
{
int a, b;
printf("\n Nhap so thu nhat:");
scanf("%d",&a);
printf("\n Nhap so thu hai:");
scanf("%d",&b);
hoanvi(a,b);
printf("\n Sau khi hoan vi, so thu nhat=%d",a);
printf("\n Sau khi hoan vi, so thu hai=%d",b);
getch();
}

Khi ch¹y ch−¬ng tr×nh nÕu ta cung cÊp gi¸ trÞ:


Nhap so thu nhat: 12
Nhap so thu hai: 24
Th× sau khi thùc hiÖn, kÕt qu¶ lµ:
Sau khi hoan vi, so thu nhat = 12
Sau khi hoan vi, so thu hai = 24
Nh− vËy nÕu ta muèn ®æi gi¸ trÞ hai biÕn a vµ b cho nhau th× ®o¹n
ch−¬ng tr×nh nµy ®· kh«ng thùc hiÖn ®−îc môc ®Ých ®ã. Lý do lµ: c¸c
tham sè thùc (c¸c gi¸ trÞ thùc cña hai biÕn a, b) khi truyÒn cho c¸c
tham sè h×nh thøc trong hµm hoanvi(a,b) chØ truyÒn gi¸ trÞ chø kh«ng
truyÒn ®Þa chØ, do ®ã sù thay ®æi trong c¸c hµm nµy (ho¸n vÞ 2 sè)
kh«ng thÓ ghi l¹i ®−îc.
TruyÒn theo biÕn
NÕu muèn truyÒn c¶ néi dung vµ ®Þa chØ cña biÕn th× ph¶i sö dông
biÕn con trá (sÏ ®−îc tr×nh bµy chi tiÕt trong phÇn sau).
76 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

VÝ dô:
/* TruyÒn theo biÕn*/
Void hoanvi(int *a,int *b) /*a,b lμ biÕn kiÓu con trá*/
{
int tam;
tam =*a;
*a=*b;
*b=tam;
}
main()
{
int a, b;
printf("\n Nhap so thu nhat:");
scanf("%d",&a);
printf("\n Nhap so thu hai:");
scanf("%d",&b);
hoanvi(a,b);
printf("\n Sau khi hoan vi, so thu nhat=%d",a);
printf("\n Sau khi hoan vi, so thu hai=%d",b);
getch();
}

Khi ch¹y ch−¬ng tr×nh nÕu ta cung cÊp gi¸ trÞ:


Nhap so thu nhat: 12
Nhap so thu hai: 24
Th× sau khi thùc hiÖn, kÕt qu¶ lµ:
Sau khi hoan vi, so thu nhat = 24
Sau khi hoan vi, so thu hai = 12
Lý do cña viÖc chóng ta ®æi ®−îc gi¸ trÞ hai biÕn a vµ b trªn lµ do:
viÖc truyÒn tham biÕn lµ truyÒn ®Þa chØ cña tham biÕn thùc sù cho tham
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 77

biÕn h×nh thøc t−¬ng øng. Hai tham biÕn nµy tuy kh¸c nhau nh−ng l¹i
cã chung mét ®Þa chØ, do vËy chóng còng cã chung d÷ liÖu.
TruyÒn tham sè kiÓu tham chiÕu cho hμm trong C++
Trong C++, ngoµi viÖc truyÒn tham sè kiÓu tham trÞ vµ truyÒn
tham sè kiÓu con trá ®· nªu trªn cßn cho phÐp truyÒn tham sè cho hµm
kiÓu tham chiÕu. Cã nghÜa lµ gi¸ trÞ cña tham sè bÞ hμm thay ®æi còng
sÏ ®−îc gi÷ l¹i khi ra khái hμm.
B¶n chÊt cña c¸ch truyÒn tham sè kiÓu tham chiÕu kh¸c b¶n chÊt
cña hai c¸ch truyÒn tham sè truyÒn thèng: kiÓu tham trÞ vµ kiÓu con
trá. Theo c¸ch truyÒn tham sè truyÒn thèng th× chØ cã b¶n sao gi¸ trÞ
(hoÆc gi¸ trÞ cña biÕn hoÆc gi¸ trÞ lµ ®Þa chØ biÕn) truyÒn vµo hµm, cßn
trong c¸ch truyÒn tham sè kiÓu tham chiÕu th× hµm lµm viÖc trùc tiÕp
trªn biÕn truyÒn vµo hµm, th«ng qua bÝ danh cña nã.
VÝ dô:
# include <stdio.h>
# include <conio.h>
void hoandoi (int &, int &);
void main () {
int x = 10, y = 5;
clrscr ();
hoandoi (x, y);
printf ("x = %d y = %d\n", x, y);
getch (); }
void hoandoi (int &x, int &y)
{ int z = x; x = y ; y = z; }
VÒ mÆt có ph¸p, khi truyÒn tham sè cho hµm theo kiÓu tham chiÕu
ta chØ cÇn b¸o hiÖu ®Þa chØ cña biÕn ë phÇn khai b¸o, cßn trong th©n
hµm vµ trong lêi gäi hµm, ta vÉn viÕt tªn biÕn mét c¸ch b×nh th−êng.
Chó ý víi c¸ch truyÒn tham sè kiÓu tham chiÕu ta kh«ng ®−îc cÊp
ph¸t bé nhí ®éng cho biÕn tham chiÕu vµ kh«ng dïng phÐp to¸n t¨ng
78 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

gi¶m ®Þa chØ cho biÕn tham chiÕu v× biÕn tham chiÕu g¾n liÒn víi ®Þa
chØ tÜnh trong bé nhí vµ do ®ã kh«ng ®−îc phÐp thay ®æi ®Þa chØ nµy.
3.3.3. Ph¹m vi biÕn vμ lËp tr×nh m«-®un
a. Ph¹m vi biÕn
Ph¹m vi côc bé (local variable)
BiÕn côc bé lµ c¸c biÕn ®−îc khai b¸o trong c¸c hµm. BiÕn côc bé
®−îc cÊp ph¸t bé nhí vµo lóc hµm ®−îc gäi vµ ®−îc g¸n khëi ®Çu b»ng
mét gi¸ trÞ kh«ng x¸c ®Þnh nµo ®ã. §Õn khi kÕt thóc hµm th× vïng nhí
dµnh cho c¸c biÕn côc bé trong hµm ®−îc gi¶i phãng, tøc lµ c¸c biÕn
nµy kh«ng cßn truy nhËp ®−îc. Kh«ng nªn truyÒn ®Þa chØ cña biÕn côc
bé ra ngoµi ph¹m vi cña nã.
C¸c biÕn côc bé cã ph¹m vi ho¹t ®éng chØ trong hµm khai b¸o vµ
nã cã thÓ trïng tªn víi c¸c biÕn toµn côc (global) mµ kh«ng ¶nh h−ëng
g×. Trong tr−êng hîp nµy, viÖc gäi tªn truy nhËp biÕn toµn côc ®Ó sö
dông trong hµm chØ cÇn thªm to¸n tö ph¹m vi “::” ®»ng tr−íc tªn biÕn.
V× ta cßn cã thÓ khai b¸o biÕn ë trong mét khèi lÖnh cña mét hµm
nµo ®ã, do vËy ngoµi biÕn côc bé cã ph¹m vi trong hµm, cßn cã biÕn
côc bé cã ph¹m vi trong mét khèi lÖnh, nÕu biÕn côc bé khai b¸o trong
khèi lÖnh th× nã chØ cã ph¹m vi trong khèi lÖnh, khi ra khái khèi lÖnh,
biÕn côc bé ®ã sÏ bÞ gi¶i phãng vµ kh«ng sö dông ®−îc n÷a.
BiÕn côc bé tÜnh (Static Local Variable)
BiÕn côc bé tÜnh lµ biÕn côc bé ®−îc x¸c ®Þnh b»ng tõ khãa static.
Có ph¸p:
static type varName;
Trong ®ã:
type: kiÓu biÕn
varName: tªn biÕn.
Khi dïng biÕn côc bé, sau khi ra khái hµm, biÕn côc bé sÏ bÞ gi¶i
phãng hÕt vïng nhí vµ gi¸ trÞ cña biÕn sÏ bÞ xãa tøc lµ kh«ng thÓ truy
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 79

nhËp biÕn côc bé tõ bªn ngoµi hµm. BiÕn côc bé tÜnh, còng gièng biÕn
côc bé lµ chØ gäi vµ truy nhËp trong hµm, nh−ng gi¸ trÞ cña nã kh«ng
bÞ xãa khi kÕt thóc hµm. VÝ dô, ®Ó theo dâi mét hµm ®Ö quy ®· ®−îc
gäi lÆp bao nhiªu lÇn, ta cã thÓ dïng biÕn tÜnh côc bé ®Ó ®Õm.
BiÕn toμn côc (Global variable)
BiÕn toµn côc lµ biÕn ®−îc khai b¸o ngoµi tÊt c¶ c¸c hµm. Cã thÓ
truy nhËp biÕn toµn côc tõ bÊt cø hµm nµo, tõ bÊt cø n¬i ®©u trong hµm
vµ cã thÓ sö dông biÕn toµn côc ®Ó g¸n gi¸ trÞ tr¶ vÒ trong hµm.
Khi ch−¬ng tr×nh b¾t ®Çu ®−îc khëi t¹o th× biÕn toµn côc ®−îc cÊp
ph¸t bé nhí vµ nã sÏ tån t¹i suèt thêi gian tån t¹i cña ch−¬ng tr×nh.
C¸c biÕn toµn côc ®−îc tù ®éng g¸n gi¸ trÞ ban ®Çu lµ 0.
Víi c¸c biÕn ngoµi, khi ®· khai b¸o ë mét m«-®un, cã thÓ gäi sö
dông ë mét m«-®un kh¸c b»ng c¸ch dïng tõ khãa extern. Tõ khãa
extern chØ lµ c¸ch ®Ó b¸o cho ch−¬ng tr×nh dÞch biÕt r»ng, biÕn ®· ®−îc
khai b¸o t−êng minh ë ®©u ®ã (ë mét m«-®un kh¸c), mµ kh«ng cÇn ph¶i
cÊp ph¸t bé nhí còng nh− kh«ng ph¶i g¸n gi¸ trÞ khëi ®Çu l¹i cho biÕn.
BiÕn toμn côc tÜnh
BiÕn toµn côc tÜnh lµ biÕn toµn côc cã thªm tõ khãa static ®øng tr−íc.
BiÕn toµn côc tÜnh kh¸c biÕn toµn côc lµ chØ cã thÓ truy nhËp ®Õn nã tõ
bÊt cø ®©u bªn trong tÖp khai b¸o nã, tøc lµ kh«ng thÓ truy nhËp ®−îc
biÕn toµn côc tÜnh theo kiÓu dïng c¸ch gäi extern (kh«ng cã extern biÕn
toµn côc tÜnh). Nh− vËy cã thÓ cã nhiÒu biÕn toµn côc tÜnh cã cïng tªn
nh−ng ®−îc khai b¸o ë c¸c tÖp kh¸c nhau trong ch−¬ng tr×nh.
b. TruyÒn gi¸ trÞ cho hμm
Cã hai ph−¬ng ph¸p truyÒn gi¸ trÞ cho hµm: dïng biÕn toµn côc
trong ch−¬ng tr×nh vµ dïng danh s¸ch ®èi h×nh thøc.
Ph−¬ng ph¸p dïng biÕn toμn côc
Kh¶ n¨ng th©m nhËp chung vµo biÕn toµn côc tõ bÊt cø ®©u trong
ch−¬ng tr×nh lµ lîi Ých chÝnh cña nã. TÝnh thÊy ®−îc cña biÕn toµn côc
lµm cho nã trë thµnh ph−¬ng ph¸p thuËn tiÖn cho viÖc liªn l¹c gi÷a c¸c
80 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

thµnh phÇn kh¸c nhau cña ch−¬ng tr×nh. Nh−ng viÖc sö dông biÕn toµn
côc ®Ó truyÒn gi¸ trÞ cho hµm còng cã nh−îc ®iÓm:
- C¸c hµm cã dïng tíi biÕn toµn côc phô thuéc vµo sù tån t¹i vµ
kiÓu cña biÕn toµn côc ®ã lµm cho viÖc dïng l¹i hµm nµy trong ng÷
c¶nh kh¸c trë lªn khã kh¨n.
- NÕu cÇn söa ®æi ch−¬ng tr×nh th× nh÷ng sù phô thuéc toµn côc sÏ
lµm t¨ng kh¶ n¨ng sinh lçi. H¬n n÷a viÖc ®−a vµo nh÷ng thay ®æi côc
bé ®ßi hái viÖc hiÓu biÕt toµn bé ch−¬ng tr×nh.
- NÕu mét biÕn toµn côc nhËn mét gi¸ trÞ kh«ng ®óng th× ph¶i t×m
kiÕm trong toµn bé ch−¬ng tr×nh ®Ó x¸c ®Þnh xem lçi xuÊt hiÖn ë ®©u.
Kh«ng cã viÖc côc bé hãa.
- ViÖc ®Ö quy l¹i cßn khã ®i ®Õn ®óng chç h¬n khi hµm dïng mét
biÕn toµn côc.
Ph−¬ng ph¸p dïng danh s¸ch ®èi
Danh s¸ch ®èi cïng víi kiÓu cho l¹i cña hµm x¸c ®Þnh ra giao
diÖn chung cña hµm. Víi viÖc truyÒn theo danh s¸ch ®èi, mét ch−¬ng
tr×nh nh×n chung lµ kh«ng ph¶i thay ®æi khi hµm thay ®æi. MÆt kh¸c mét
hµm cã thÓ dïng qua nhiÒu ch−¬ng tr×nh, kh«ng nhÊt thiÕt bÞ giíi h¹n
vµo mét øng dông riªng. Nh−ng víi mét hµm, nÕu sè l−îng ®èi sè qu¸
lín th× hµm sÏ rÊt khã dïng v× dÔ g©y ra lçi do truyÒn sai kiÓu ®èi. §Ó dÔ
dïng h¬n th× mét hµm th−êng chØ dïng tèi ®a ®Õn t¸m ®èi. NÕu mét
hµm mµ ph¶i dïng ®Õn sè ®èi nhiÒu h¬n th× ta cã thÓ ®Þnh nghÜa ra mét
kiÓu líp (hoÆc cÊu tróc) chøa c¸c gi¸ trÞ ®èi. §iÒu nµy cã hai lîi Ých:
- §é phøc t¹p cña danh s¸ch ®èi ®−îc gi¶m ®i
- ViÖc kiÓm tra tÝnh hîp lÖ cña c¸c gi¸ trÞ ®èi cã thÓ ®−îc thùc
hiÖn b»ng c¸c hµm thµnh phÇn cña líp chø kh«ng ph¶i lµ bªn trong
hµm, lµm cho gi¶m kÝch cì cña hµm vµ hµm sÏ dÔ hiÓu h¬n.
Có ph¸p danh s¸ch ®èi
Mét hµm kh«ng cã ®èi cã thÓ ®−îc biÓu thÞ b»ng danh s¸ch ®èi
rçng hoÆc mét danh s¸ch ®èi chØ chøa mét tõ khãa void.
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 81

Danh s¸ch ®èi cßn ®−îc gäi lµ dÊu hiÖu cña hµm, bëi v× nã th−êng
dïng ®Ó ph©n biÖt mét thÓ nghiÖm cña hµm nµy víi hµm kh¸c. Tªn vµ
dÊu hiÖu cña mét hµm lµ x¸c ®Þnh duy nhÊt nã.
DÊu hiÖu bao gåm mét danh s¸ch c¸c kiÓu ®èi ph©n c¸ch nhau
bëi dÊu ph¶y, cã thÓ cã tªn biÕn ®i theo bé x¸c ®Þnh kiÓu nh−ng
kh«ng b¾t buéc.
Kh«ng cã hai tªn ®èi nµo xuÊt hiÖn trong danh s¸ch ®èi ®−îc phÐp
trïng nhau. Tªn ®èi cho phÐp ®èi ®ã ®−îc th©m nhËp tõ bªn trong th©n
hµm, do vËy tªn ®èi kh«ng cÇn viÕt trong khai b¸o hµm.
Bé khëi ®Çu ngÇm ®Þnh
Mét hµm cã thÓ x¸c ®Þnh mét gi¸ trÞ ngÇm ®Þnh cho mét hay
nhiÒu ®èi cña nã b»ng c¸ch dïng có ph¸p khëi ®Çu bªn trong dÊu hiÖu.
Mét hµm cã cung cÊp c¸c bé khëi ®Çu ngÇm ®Þnh cã thÓ ®−îc gäi víi
c¸c ®èi thùc t¹i t−¬ng øng hoÆc kh«ng cã c¸c ®èi ®ã. NÕu mét ®èi
®−îc ®−a ra th× nã sÏ thay thÕ cho gi¸ trÞ ngÇm ®Þnh, nÕu kh«ng th× gi¸
trÞ ngÇm ®Þnh sÏ ®−îc dïng.
Chó ý r»ng khi gäi hµm, kh«ng thÓ cung cÊp mét gi¸ trÞ cho tham
sè ®øng sau mµ kh«ng cung cÊp gi¸ trÞ cho c¸c tham sè ®øng tr−íc,
tøc lµ c¸c ®èi cña lêi gäi hµm ph¶i ®−îc g¸n gi¸ trÞ theo thø tù tõ tr¸i
qua ph¶i.
TruyÒn ®èi
Khi ch¹y ch−¬ng tr×nh, mçi khi mét hµm ®−îc gäi, c¸c ®èi ®−îc
cÊp ph¸t bé nhí trong ng¨n xÕp. Vïng nhí trong ng¨n xÕp dµnh cho
®èi tån t¹i cho tíi khi hµm kÕt thóc, lóc ®ã vïng nhí nµy tù ®éng bÞ
lo¹i bá.
Danh s¸ch c¸c ®èi cña hµm ®−îc m« t¶ gäi lµ ®èi h×nh thøc, mçi
®èi h×nh thøc ®−îc cÊp ph¸t bé nhí trong ng¨n xÕp, kÝch cì cña chóng
®−îc x¸c ®Þnh theo kiÓu ®èi.
82 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

C¸c biÓu thøc n»m gi÷a hai dÊu ngoÆc trßn cña lêi gäi hµm ®−îc
gäi lµ c¸c ®èi thùc cña hµm. ViÖc truyÒn ®èi chÝnh lµ mét tiÕn tr×nh khëi
®Çu cho vïng nhí cña c¸c ®èi h×nh thøc theo c¸c ®èi thùc cña hµm.
Trong ng«n ng÷ C/C++, cã hai ph−¬ng ph¸p truyÒn ®èi, truyÒn
theo gi¸ trÞ vµ truyÒn theo ®Þa chØ.
TruyÒn tham sè theo gi¸ trÞ:
Ph−¬ng ph¸p khëi ®Çu ngÇm ®Þnh cho viÖc truyÒn ®èi lµ sao chÐp
gi¸ trÞ c¸c ®èi thùc vµo vïng nhí cña ®èi h×nh thøc gäi lµ truyÒn ®èi
theo gi¸ trÞ.
§Æc ®iÓm:
- Gi¸ trÞ ®èi thùc ®−îc sao chÐp vµo vïng nhí cña c¸c ®èi sè h×nh
thøc t−¬ng øng cña hµm, t¹o thµnh c¸c b¶n sao côc bé riªng cña nã.
- Gi¸ trÞ c¸c ®èi sè h×nh thøc cña hµm thay ®æi trong qu¸ tr×nh tÝnh
to¸n, nh−ng gi¸ trÞ cña ®èi thùc kh«ng thay ®æi trong qu¸ tr×nh tÝnh
to¸n ®ã. Ng−êi lËp tr×nh kh«ng cÇn ph¶i cÊt gi÷ vµ kh«i phôc c¸c gi¸
trÞ ®èi khi tiÕn hµnh gäi hµm. Do vËy ph−¬ng ph¸p nµy lµ biÖn ph¸p an
toµn Ýt yªu cÇu ng−êi dïng chung ph¶i ®Ó ý ®Õn.
- Tuy nhiªn, viÖc truyÒn theo gi¸ trÞ kh«ng ph¶i lµ ph−¬ng ph¸p
thÝch hîp cho mäi hµm. Nh÷ng t×nh huèng mµ truyÒn theo gi¸ trÞ tá ra
kh«ng thÝch hîp bao gåm:
+ Khi ph¶i truyÒn mét ®èi t−îng líp lín nh− mét ®èi. PhÝ tæn vÒ
thêi gian vµ kh«ng gian nhí ®Ó cÊp ph¸t vµ sao chÐp ®èi t−îng lªn líp
th−êng cao so víi c¸c ch−¬ng tr×nh øng dông thùc.
+ Kh«ng thay ®æi ®−îc gi¸ trÞ ®èi thùc khi cÇn thay ®æi.
TruyÒn tham sè theo ®Þa chØ:
Hµm thùc hiÖn truyÒn c¸c gi¸ trÞ ®Þa chØ cña ®èi thùc vµ c¸c ®èi
h×nh thøc ®−îc gäi lµ c¸c ®èi tham chiÕu.
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 83

ViÖc truyÒn tham sè theo ®Þa chØ kh¾c phôc ®−îc c¸c nh−îc ®iÓm
cña ph−¬ng ph¸p truyÒn tham sè theo gi¸ trÞ.
Ch−¬ng tr×nh gäi hµm sÏ truyÒn cho hµm gi¸ trÞ ®Þa chØ cña ®èi thùc;
C¸c thao t¸c tÝnh to¸n trong hµm lµ thao t¸c trùc tiÕp víi gi¸ trÞ
cña ®èi thùc, chø kh«ng ph¶i lµ lµm viÖc víi b¶n sao cña ®èi thùc, do
vËy nã lµm thay ®æi gi¸ trÞ ®èi thùc.
c. Gi¸ trÞ cho l¹i cña hμm
KÕt qu¶ cña hµm cho l¹i ph¶i cã kiÓu.
Hµm kh«ng cho l¹i mét gi¸ trÞ nµo cã kiÓu lµ void.
KiÓu cho l¹i cña hµm cã thÓ lµ kiÓu c¬ së, kiÓu do ng−êi dïng
®Þnh nghÜa hay kiÓu suy dÉn.
Hµm kh«ng cã gi¸ trÞ cho l¹i t−êng minh, theo ngÇm ®Þnh ®−îc
coi nh− cho l¹i mét gi¸ trÞ cã kiÓu int.
C©u lÖnh return kÕt thóc viÖc thùc hiÖn hµm hiÖn t¹i, ®iÒu khiÓn
cña ch−¬ng tr×nh trë vÒ hµm ®· gäi hµm võa kÕt thóc.
Cã hai d¹ng c©u lÖnh return:
return;
return expr;
- D¹ng thø nhÊt dïng cho hµm cã kiÓu void (hµm kh«ng cã gi¸ trÞ
tr¶ vÒ). C©u lÖnh return nµy kh«ng thùc sù cÇn thiÕt cho hµm kiÓu nµy.
Nã ®−îc dïng chñ yÕu ®Ó kÕt thóc sím hµm theo mét ®iÒu kiÖn nµo ®ã.
- D¹ng thø hai cña c©u lÖnh return x¸c ®Þnh ra kÕt qu¶ cña hµm.
BiÓu thøc Expr cã thÓ lµ mét biÓu thøc phøc t¹p, tïy ý, b¶n th©n nã
còng cã thÓ chøa c¶ lêi gäi hµm (trong vÝ dô vÒ hµm ®Ö quy).
NÕu gi¸ trÞ cho l¹i kh«ng ®óng víi kiÓu cho l¹i ®· khai b¸o th×
viÖc chuyÓn ®æi kh«ng t−êng minh sÏ ®−îc tiÕn hµnh.
84 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Mét hµm cã thÓ cho l¹i mét gi¸ trÞ. NÕu logic ch−¬ng tr×nh ®ßi hái
ph¶i cho l¹i nhiÒu gi¸ trÞ th× ta cã thÓ sö dông c¸c ph−¬ng ph¸p sau ®Ó
nhËn gi¸ trÞ tr¶ vÒ cña hµm:
- Tr¶ gi¸ trÞ tr¶ vÒ qua biÕn toµn côc
- C¸c ®èi h×nh thøc cã thÓ ®−îc ®Þnh nghÜa hoÆc nh− kiÓu con trá,
hoÆc nh− kiÓu tham kh¶o
- Cho l¹i kiÓu d÷ liÖu tËp hîp cã chøa nhiÒu gi¸ trÞ. Víi c¸ch nµy
th× nªn dïng líp mÒm dÎo h¬n m¶ng.
3.3.4. C¸c vÝ dô minh häa vÒ hμm
VÝ dô 1: T¹o mét hµm t×m mét sè lín nhÊt trong 3 sè.
#include<stdio.h>
#include<conio.h>
float max3s(a, b, c) /*Khai bao ham*/
float a,b,c;
{
float max; /*Bien cuc bo*/
max=a>b?a:b; /*lenh dieu kien*/
return(max>c?max:c);
} /*Ket thuc ham*/
#include<stdio.h>
main()
{
clrscr();
float x,y,z, max3s();
int s;
tt:printf("\nNhap 3 so:");
printf("\n So thu nhat=");
scanf("%f",&x);
printf("\n So thu hai=");
scanf("%f",&y);
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 85

printf("\n So thu ba=");


scanf("%f",&z);
printf("\n So lon nhat la %8.2f",max3s(x,y,z));
getch();
}
VÝ dô 2: T¹o mét hµm tÝnh giai thõa cña n sè nguyªn ®Çu tiªn.
long int gt(n)
int n;
{
int s=1,i;
for (i=1;i<=n;++i)
s*=i;
return(s);
}
main()
{
long gt();
int n;
printf("\nTinh giai thua cua n= ");
scanf("%d",&n);
printf("\nNeu n=%3d,thi n! = %8ld",n,gt(n));
}
VÝ dô 3: ViÕt ch−¬ng tr×nh nhËp vµo täa ®é cña 2 vÐc-t¬, mçi vÐc-t¬
5 thµnh phÇn, tÝnh m«-®un vµ tæng cña 2 vÐc-t¬.
ë ®©y m¶ng ®−îc sö dông lµm tham sè h×nh thøc cña mét hµm
trong ch−¬ng tr×nh nªn ta ph¶i khai b¸o theo có ph¸p sau:
<KiÓu> <Tªn hµm> (<kiÓu> <tªn m¶ng[],...);
# include <stdio.h>
# include<math.h>
# include<conio.h>
# include<math.h>
86 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

float modul(int x[]);


main()
{
int A[5], B[5];
clrscr();
printf("\n");
nhap(A,'A');
nhap(B,'B');
printf("\n KET QUA TINH TOAN CUA 2 VECTO A va B");
trinhbay(A,'A');
trinhbay(B,'B');
printf("\n --------------");
tong(A,B);
printf("\n Module cua vecto A la: %f",modul(A));
printf("\n Module cua vecto B la: %f",modul(B));
getch();
}
nhap(int x[], char chu);
{ int k;
for (k=0;k<5,k++)
{
printf("\n %c[%d]=",chu,k+1);
scanf("%d",&x[k]);
}
printf("\n");
}
trinhbay(int x[], char chu)
{
printf("\n %c={%d\,%d\,%d\,%d\,%d\}",chu,x[0],x[1],x[2],x[3],x[4]);
}
float modul(int x[])
{
int k;
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 87

float s=0;
for (k=0; k<5; k++)
s=s+x[k]*x[k];
s=sqrt((double),s);
return(s);
}
tong int X[], int Y[])
{
int z[5],k;
for (k=0; k<5; k++)
z[k]= x[k]+ y[k]
trinhbay(z,'C');
}
VÝ dô 4: ViÕt ch−¬ng tr×nh nhËp ngÉu nhiªn mét m¶ng gåm 1000
phÇn tö lµ c¸c sè nguyªn nhá h¬n 100 vµ t×m hai sè liªn tiÕp cã tæng
b»ng sè nguyªn X nhËp vµo tõ bµn phÝm.
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
int a[1000];
void tao()
{
int k;
randomize();
for (k=0;k<1000;k++)
a[k]= random(100);
}
void tim()
{
int x,k;
printf("\n Nhap vao gia tri cua x=");
88 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

scanf("%d%,&x");
for (k=0; k<999;k++)
if(a[k]+a[k+1]==x)
printf("a[%d]+[%d]=%d\n",k,k+1,x);
puts("ket thuc");
}
main()
{
tao();
tim();
getch();
}
b
VÝ dô 5: TÝnh tÝch ph©n I = ∫ f(x)dx b»ng ph−¬ng ph¸p h×nh thang.
a

Ph©n tÝch thuËt to¸n: NÕu hµm f(x) liªn tôc trong kho¶ng [a, b]
th× tÝch ph©n I ®−îc tÝnh gÇn ®óng b»ng tæng c¸c h×nh thang nhá. Gi¶
sö ta chia [a, b] thµnh m ®o¹n cã b−íc tÝch ph©n h = (b-a)/m th×
xi = a+ ih (i = 0, 1.. m) vµ khi ®ã:

f(a) + f(b) m −1
b
I = ∫ f(x)dx = h[ + ∑ f(a + ih)] + R m (f)
a
2 i =1

(b − a)3
trong ®ã phÇn d−: R m (f) = − f ′(ξ), ξ ∈ [a, b]
12m 2
Ch−¬ng tr×nh bao gåm c¸c c«ng viÖc sau:
1. X¸c ®Þnh hµm cÇn lÊy tÝch ph©n (ch¼ng h¹n y = e-xsinx) b»ng
hµm float ham(float x).
2. §−a sè liÖu vµo gåm cËn d−íi a, cËn trªn b vµ sè ®iÓm tÝnh m.
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 89

3. TÝnh tæng gi¸ trÞ tÝch ph©n theo ph−¬ng ph¸p h×nh thang b»ng
vßng lÆp. ë ®©y cã thÓ sö dông for lµ vßng lÆp sè lÇn x¸c ®Þnh v× sè lÇn
lÆp n ®−îc biÕt tr−íc.
Ch−¬ng tr×nh ®−îc x©y dùng nh− sau:
# include <stdio.h>
# include <conio.h>
# include <math.h>
float ham(float);
void main()
{
clrscr();
int i,n;
float a,b,c,x,s,h,tp;
printf("\n Nhap can duoi a=");scanf("%f",&a);
printf("\n Nhap can tren b=");scanf("%f",&b);
printf("\n Cho so diem tinh n=");scanf("%d",&n);
h=(b-a)/n;
x=a;
s= (ham(a)+ham(b))/2;
for (i=1; i<n-1; i++)
{ x=x+i*h;s=s+ham(x);}
tp=s*h;
printf("\n Gia tri cua tich phan =%f",tp);
getch();
return;}/*het chuong trinh chinh*/
/*ham duoi dau tich phan*/
float ham(float x)
{ return exp(-x)*sin(x); }
Trong ch−¬ng tr×nh nµy chóng ta khai b¸o tªn hµm d−íi dÊu tÝch
ph©n ham trªn ®Çu ch−¬ng tr×nh chÝnh main() cßn néi dung hµm nµy
®−îc x©y dùng sau return cña ch−¬ng tr×nh chÝnh main().
90 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

3.3.5. Hμm ®Ö quy


Trong thùc tÕ, chóng ta gÆp rÊt nhiÒu ®èi t−îng mµ khã cã thÓ
®Þnh nghÜa nã mét c¸ch t−êng minh, nh−ng l¹i dÔ dµng ®Þnh nghÜa ®èi
t−îng qua chÝnh nã. Kü thuËt ®Þnh nghÜa ®èi t−îng qua chÝnh nã ®−îc
gäi lµ kü thuËt ®Ö quy (recursion). Hµm gäi ®Õn chÝnh nã, trùc tiÕp hay
gi¸n tiÕp, ®Òu ®−îc coi lµ hµm ®Ö quy. Kh¸i niÖm ®Ö quy gióp chóng ta
m« t¶ mét tËp v« h¹n b»ng c¸c ph¸t biÓu h÷u h¹n.
VÝ dô: chóng ta cã thÓ ph¸t biÓu ®Þnh nghÜa n! b»ng hai c¸ch sau:
1) n! lµ tÝch cña c¸c sè nguyªn d−¬ng liªn tiÕp tõ 1 tíi n.
2) n! b»ng 1 nÕu n = 0 hoÆc b»ng n*(n-1)! nÕu n > 0.
C¸c gi¶i thuËt ®Ö quy ®Òu ®−îc x©y dùng th«ng qua hai b−íc:
b−íc ph©n tÝch vµ b−íc thay thÕ ng−îc l¹i.
VÝ dô: §Ó tÝnh tæng n sè nguyªn: S(n)= 1+2+... + n, ta cã thÓ thùc
hiÖn th«ng qua hai b−íc sau:
B−íc ph©n tÝch:
- §Ó tÝnh ®−îc S(n), ®Çu tiªn ph¶i tÝnh tr−íc ®−îc S(n-1) sau ®ã
tÝnh S(n) = S(n-1) + n
- §Ó tÝnh ®−îc S(n-1), ph¶i tÝnh tr−íc ®−îc S(n-2) sau ®ã tÝnh:
S(n-1) = S(n-2) + n-1
- TiÕp tôc tÝnh S(n-2), S(n-3)... cho ®Õn S(1).
- §Ó tÝnh ®−îc S(2) ta ph¶i tÝnh ®−îc S(1) sau ®ã tÝnh:
S(2) = S(1)+2
- Vµ cuèi cïng tÝnh S(1) chÝnh lµ 1.
B−íc thay thÕ ng−îc l¹i:
XuÊt ph¸t tõ S(1), thay thÕ ng−îc l¹i ta x¸c ®Þnh ®−îc S(n):
S(1) = 1
S(2) = S(1)+2
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 91

S(3) = S(2) + 3
...
S(n) = S(n-1) + n
Có ph¸p:
type fname(parameter_list)
{
if (condition_stop==true) // ®iÒu kiÖn dõng
return(value_atStop); // gi¸ trÞ t¹i thêi ®iÓm dõng
else
return(fname(value_of_func_with_next_paramater));
// gi¸ trÞ ®−îc tÝnh bëi viÖc gäi l¹i hµm víi tham sè kh¸c
}
Hµm ®Ö quy bao giê còng ph¶i x¸c ®Þnh ®iÒu kiÖn dõng, nÕu
kh«ng nã sÏ ®Ö quy m·i vµ ch−¬ng tr×nh sÏ bÞ treo do trµn bé nhí
(trong vÝ dô trªn ®iÒu kiÖn dõng lµ n<=1).
Hµm ®Ö quy cã thÓ ch¹y chËm h¬n hµm kh«ng ®Ö quy nh−ng
ch−¬ng tr×nh viÕt l¹i nhá gän, Ýt phøc t¹p h¬n.
Ta xem xÐt mét sè vÝ dô sau:
VÝ dô 1: TÝnh an b»ng gi¶i thuËt ®Ö quy víi mäi sè thùc a vµ sè tù
nhiªn n.
double luythua (float a, int n) {
if (n == 0)
return(1);
return(a*luythua(a,n-1)); }

VÝ dô 2: ThuËt to¸n ®Ö quy t×m −íc sè chung lín nhÊt cña hai sè
nguyªn d−¬ng a vµ b víi b>a.
Ph©n tÝch: ta cã thÓ rót gän vÒ bµi to¸n t×m −íc sè chung lín nhÊt
cña (b mod a) vµ a, v× USCLN(b mod a, a) = USCLN(a, b).
92 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

D·y c¸c rót gän liªn tiÕp cã thÓ ®¹t ®−îc cho tíi khi ®¹t ®iÒu kiÖn
dõng USCLN(0, a) = USCLN(a, b) = a.
int USCLN(int a, int b) {
if (a==0)
return (b);
return(USCLN(b % a, a));
}

VÝ dô 3: ThuËt to¸n ®Ö quy tÝnh n!


long giaithua(int n) {
if (n==1)
return(1);
return(n*giaithua(n-1));

3.3.6. Hμm inline


Trong C++ cã thÓ ®Þnh nghÜa c¸c hµm ®−îc thay thÕ trùc tiÕp
thµnh m· lÖnh m¸y t¹i chç gäi (inline) mçi lÇn ®−îc tham chiÕu. Hµm
kiÓu inline th−êng ¸p dông cho c¸c hµm nhá, cã th©n hµm th−êng lµ
mét vµi dßng vµ lµ hµm hay ®−îc sö dông.
Mét hµm inline ®−îc ®Þnh nghÜa vµ ®−îc sö dông gièng nh− b×nh
th−êng. §iÓm kh¸c nhau duy nhÊt lµ ph¶i ®Æt m« t¶ inline tr−íc khai
b¸o hµm.
Có ph¸p: inline type fname(parameter_list)
¦u ®iÓm cña c¸c hµm inline lµ chóng kh«ng ®ßi hái c¸c thñ tôc
bæ sung khi gäi hµm vµ tr¶ gi¸ trÞ vÒ. Do vËy hµm inline ®−îc thùc
hiÖn nhanh h¬n so víi c¸c hµm th«ng th−êng.
Tõ khãa inline yªu cÇu ch−¬ng tr×nh biªn dÞch xö lý hµm min()
kh¸c víi c¸c hµm th«ng th−êng. Cô thÓ lµ, mçi lÇn gäi min(), tr×nh
biªn dÞch ghÐp trùc tiÕp c¸c chØ thÞ t−¬ng øng cña hµm vµo trong
ch−¬ng tr×nh (ë d¹ng ng«n ng÷ m¸y). Do ®ã c¬ chÕ qu¶n lý lêi gäi vµ
trë vÒ kh«ng cÇn n÷a (kh«ng cÇn l−u ng÷ c¶nh, sao chÐp c¸c th«ng
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 93

sè...), nhê vËy tiÕt kiÖm thêi gian thùc hiÖn. Bªn c¹nh ®ã c¸c chØ thÞ
t−¬ng øng sÏ ®−îc sinh ra mçi khi gäi hµm, do ®ã bé nhí l−u tr÷ t¨ng
lªn khi hµm ®−îc gäi nhiÒu lÇn.
§iÓm bÊt lîi khi sö dông c¸c hµm inline lµ nÕu chóng qu¸ lín vµ
®−îc gäi th−êng xuyªn th× kÝch th−íc ch−¬ng tr×nh sÏ t¨ng lªn rÊt
nhanh. V× lý do nµy, chØ nh÷ng hµm ®¬n gi¶n, kh«ng chøa c¸c cÊu tróc
lÆp míi ®−îc khai b¸o lµ hµm inline.
94 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Bài tập chương 3

1. ViÕt ch−¬ng tr×nh nhËn ký tù vµo tõ bµn phÝm, nÕu ký tù nhËn lµ


ESC (0x1b) th× hiÓn thÞ tæng sè ký tù ®· nhËn vµ kÕt thóc ch−¬ng
tr×nh.
2. ViÕt ch−¬ng tr×nh víi vßng lÆp do-while hiÓn thÞ c¸c sè tõ 10 ®Õn 20.
3. ViÕt ch−¬ng tr×nh kiÓm tra tõ khãa lµ sè nguyªn l−u tr−íc trong
m¸y. NÕu vµo ®óng tõ khãa ch−¬ng tr×nh th«ng b¸o dßng ch÷ “§·
vµo ®óng tõ khãa” kÕt thóc ch−¬ng tr×nh, nÕu vµo sai tõ khãa,
ch−¬ng tr×nh yªu cÇu vµo l¹i vµ nÕu ba lÇn vµo sai liªn tiÕp ch−¬ng
tr×nh th«ng b¸o “Tõ khãa kh«ng ®óng” vµ kÕt thóc ch−¬ng tr×nh.
4. ViÕt ch−¬ng tr×nh hiÓn thÞ b¶ng m· ASCII. Chó ý: kh«ng hiÓn thÞ 32
ký tù ®Çu tiªn.
5. ViÕt ch−¬ng tr×nh víi lÖnh for tÝnh giai thõa cña mét sè nhËp vµo tõ
bµn phÝm.
6. ViÕt ch−¬ng tr×nh víi switch-case ®Ó ®Õm sè nguyªn ©m vµ phô ©m
nhËp tõ bµn phÝm.
7. ViÕt ch−¬ng tr×nh ®Õm c¸c tõ vµ c¸c dßng trong tÖp ch−¬ng tr×nh C++.
8. Cho ch−¬ng tr×nh
main()
{
cout<< “Lop hoc C/C++”;
}
H·y söa ®æi ch−¬ng tr×nh trªn nh−ng vÉn gi÷ nguyªn hµm main()
®Ó ch−¬ng tr×nh cã thÓ hiÓn thÞ trªn mµn h×nh nh− sau:
HVANND don chao Lop hoc C/C++
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ 95

b
9. ViÕt ch−¬ng tr×nh tÝnh tÝch ph©n sè I = ∫ f(x)dx b»ng ph−¬ng ph¸p
a
Simson.
10. ViÕt hµm ®æi chç hai sè nguyªn vµ viÕt hµm main() sö dông chóng.
11. ViÕt c¸c hµm tÝnh cùc ®¹i vµ cùc tiÓu cña hai sè. X©y dùng vÝ dô sö
dông chóng.
Cho ®o¹n ch−¬ng tr×nh sau:
#include<iostream.h>
void test(float x);
void main()
{
float x, y;
Test(x);
cout << “x= ” << x << “ , y= ”<< y;
}
void Test(float x)
{
float y;
y = 25.0;
x = y;
}
Cho biÕt gi¸ trÞ x vµ y mµ ch−¬ng tr×nh sÏ in ra.
Cho biÕt gi¸ trÞ x vµ y mµ ch−¬ng tr×nh sÏ in ra nÕu thay
void Test(float x) b»ng void Test(float &x).
Cho biÕt gi¸ trÞ x vµ y mµ ch−¬ng tr×nh sÏ in ra nÕu thay
void Test(float x) b»ng void Test(float &x) vµ gäi trong hµm main() lµ
Test(y).
12. ViÕt hµm ®Õm vµ hiÓn thÞ sè lÇn c¸c hµm kh¸c gäi nã. Cho vÝ dô
sö dông.
96 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

13. ViÕt ch−¬ng tr×nh cã 3 hµm main(), fun1() vµ fun2(). H·y khai
b¸o m¶ng chøa 10 ký tù trong hµm main(), n¹p c¸c ký tù tõ A ®Õn
J vµo chóng trong hµm fun1(), sö dông hµm fun2() ®Ó hiÓn thÞ
m¶ng nãi trªn.
14. ViÕt ch−¬ng tr×nh chøa 3 hµm, mét hµm tÝnh b×nh ph−¬ng, hµm thø
hai tÝnh lËp ph−¬ng cña sè nguyªn. Hµm thø ba lµ hµm main() ®Ó
hiÓn thÞ b¶ng c¸c gi¸ trÞ b×nh ph−¬ng vµ lËp ph−¬ng cña 15 ch÷ sè
nguyªn ®Çu tiªn.
15. ViÕt ch−¬ng tr×nh gi¶i ph−¬ng tr×nh bËc hai:
- X©y dùng hµm nhËp c¸c hÖ sè a, b, c
- X©y dùng hµm ®Ó tÝnh nghiÖm sè
- X©y dùng hµm ®Ó in kÕt qu¶
16. ViÕt hµm tÝnh S = xy. VÝ dô tÝnh S = 0.451.34
Ch−¬ng 4: M¶ng vμ con trá 97

Chương 4 

MẢNG VÀ CON TRỎ

Trong lËp tr×nh ®Ó biÓu diÔn c¸c d÷ liÖu thùc tÕ th× c¸c kiÓu d÷ liÖu
chuÈn trong c¸c ng«n ng÷ lËp tr×nh th−êng ch−a ®ñ ®Ó m« pháng
nã, do ®ã c¸c ng«n ng÷ lËp tr×nh th−êng cho phÐp ng−êi dïng tù
x©y dùng c¸c kiÓu d÷ liÖu phøc t¹p tõ c¸c kiÓu d÷ liÖu chuÈn hoÆc
c¸c kiÓu d÷ liÖu ®· ®−îc x©y dùng tr−íc.
Néi dung ch−¬ng nμy sÏ tr×nh bμy c¸c vÊn ®Ò sau ®©y:
- KiÓu d÷ liÖu m¶ng vμ xö lý
- M¶ng nhiÒu chiÒu
- Con trá
- Con trá vμ m¶ng

4.1. KiÓu d÷ liÖu m¶ng vμ xö lý m¶ng


Nh− ta biÕt, mçi biÕn chØ cã thÓ biÓu diÔn mét gi¸ trÞ. Muèn biÓu
diÔn mét d·y sè hay mét b¶ng sè ta cã thÓ sö dông nhiÒu biÕn nh−ng
rÊt bÊt tiÖn. V× vËy trong hÇu hÕt c¸c ng«n ng÷ lËp tr×nh ®Òu thiÕt kÕ
mét kiÓu d÷ liÖu chuyªn dông cho lo¹i nµy ®−îc gäi lµ kiÓu m¶ng.
M¶ng lµ tËp hîp nhiÒu phÇn tö cã cïng mét kiÓu d÷ liÖu vµ cã chung
mét tªn. Mçi phÇn tö m¶ng biÓu diÔn ®−îc mét gi¸ trÞ. Cã bao nhiªu
kiÓu d÷ liÖu th× còng cã tõng ®ã kiÓu m¶ng.
Có ph¸p khai b¸o m¶ng:
<Tªn kiÓu> <tªn m¶ng>[<KÝch th−íc>];
<Tªn kiÓu>: lµ kiÓu d÷ liÖu cña c¸c phÇn tö m¶ng.
98 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

<Tªn m¶ng> lµ tªn gäi ®Æt cho m¶ng ®Ó truy cËp tíi nã vµ c¸c
phÇn tö cña nã
<KÝch th−íc> cho biÕt sè phÇn tö m¶ng
VÝ dô, cã c¸c m¶ng sau ®©y:
int a[10], b[4][2]
float x[5], y[3][3]
M¶ng a[10]: m¶ng 1 chiÒu a, cã 10 phÇn tö thuéc kiÓu sè nguyªn
(int) ®−îc ®¸nh sè nh− sau: a[0], a[1],... a[9].
M¶ng b[4][2]: m¶ng 2 chiÒu b cã 8 phÇn tö thuéc kiÓu nguyªn
(int) gåm 4 hµng vµ 2 cét ®−îc s¾p xÕp nh− sau:
b[0][0] b[0][1]
b[1][0] b[1][1]
b[2][0] b[2][1]
b[3][0] b[3][1]
Mçi phÇn tö b[i][j] biÓu diÔn mét gi¸ trÞ kiÓu nguyªn.
M¶ng x[5]: m¶ng 1 chiÒu x cã 5 phÇn tö thuéc kiÓu sè thùc
M¶ng 2 chiÒu y gåm 3 hµng, 3 cét cã 9 phÇn tö, mçi phÇn tö y[i][j]
chøa mét gi¸ trÞ kiÓu sè thùc (float).
Mét ®Þnh nghÜa m¶ng bao gåm mét bé x¸c ®Þnh: kiÓu m¶ng, tªn
gäi m¶ng vµ sè chiÒu cña m¶ng. ChiÒu cña m¶ng x¸c ®Þnh sè phÇn tö
cã trong m¶ng, ®−îc bao trong dÊu ngoÆc vu«ng (“[ ]”), m¶ng ph¶i cã
sè chiÒu lín h¬n hoÆc b»ng mét. Gi¸ trÞ cña chiÒu ph¶i lµ mét biÓu
thøc h»ng, tøc lµ ph¶i cã thÓ tÝnh ra ®−îc gi¸ trÞ cña nã vµo lóc dÞch,
kh«ng thÓ dïng biÕn kh«ng x¸c ®Þnh ®Ó x¸c ®Þnh chiÒu cña m¶ng.
Ta cã thÓ truy nhËp c¸c ®èi t−îng trong m¶ng th«ng qua gi¸ trÞ chØ
sè x¸c ®Þnh vÞ trÝ cña chóng trong m¶ng. C¸c phÇn tö trong m¶ng ®−îc
®¸nh chØ sè b¾t ®Çu tõ 0, vÝ dô víi m¶ng cã 10 phÇn tö th× c¸c phÇn tö
sÏ ®−îc ®¸nh sè tõ 0 ®Õn 9.
Ch−¬ng 4: M¶ng vμ con trá 99

M¶ng cã thÓ khëi ®Çu t−êng minh b»ng c¸ch x¸c ®Þnh danh s¸ch
c¸c gi¸ trÞ c¸ch nhau bëi dÊu ph¶y vµ ®−îc bao trong ngoÆc nhän. Mét
m¶ng ®−îc khëi ®Çu t−êng minh kh«ng cÇn ph¶i x¸c ®Þnh gi¸ trÞ chiÒu,
tr×nh biªn dÞch sÏ x¸c ®Þnh kÝch cì m¶ng theo sè phÇn tö ®−îc liÖt kª.
NÕu kÝch cì cña chiÒu ®−îc x¸c ®Þnh th× sè phÇn tö khëi ®Çu ph¶i
kh«ng ®−îc v−ît qu¸ kÝch cì ®ã, ng−îc l¹i tr×nh biªn dÞch sÏ b¸o lçi.
NÕu kÝch cì cña chiÒu lín h¬n sè phÇn tö khëi ®Çu ®−îc liÖt kª th× c¸c
phÇn tö m¶ng kh«ng ®−îc khëi ®Çu t−êng minh sÏ ®−îc ®Æt gi¸ trÞ lµ 0.
Cã thÓ khëi ®Çu mét m¶ng ký tù víi hoÆc lµ mét danh s¸ch c¸c ký
tù c¸ch nhau bëi dÊu ph¶y ®Æt trong ngoÆc nhän hoÆc mét h»ng x©u.
Tuy nhiªn hai d¹ng nµy lµ kh«ng t−¬ng ®−¬ng v× h»ng x©u cßn chøa
thªm ký tù kÕt thóc x©u ‘\0’.
Mét m¶ng kh«ng thÓ khëi ®Çu víi m¶ng kh¸c, còng kh«ng thÓ
g¸n m¶ng nµy sang m¶ng kh¸c.
§Ó sao chÐp m¶ng nµy sang m¶ng kh¸c ph¶i sao chÐp lÇn l−ît c¸c
phÇn tö cña m¶ng.
Mét m¶ng, khi ®−îc truyÒn cho hµm sÏ ®−îc chuyÓn thµnh mét
con trá tíi phÇn tö ®Çu tiªn cña m¶ng, thùc tÕ lµ th«ng tin vÒ chiÒu cña
m¶ng bÞ mÊt, do vËy mét m¶ng ®−îc truyÒn cho hµm ph¶i b»ng c¸ch
nµo ®ã th«ng b¸o thªm vÒ chiÒu cña nã. VÝ dô cã thÓ truyÒn th«ng tin
vÒ chiÒu cña m¶ng nh− lµ tham sè tiÕp theo.
Mäi biÓu thøc cho kÕt qu¶ nguyªn ®Òu cã thÓ ®−îc dïng lµm chØ
sè cho m¶ng. Ng«n ng÷ kh«ng ®−a ra viÖc kiÓm tra miÒn chØ sè c¶ lóc
dÞch còng nh− lóc ch¹y. Kh«ng cã g× ng¨n c¶n ng−êi lËp tr×nh v−ît
qu¸ cËn m¶ng, do vËy ph¶i chó ý vµo chi tiÕt vµ kiÓm thö kü l−ìng
ch−¬ng tr×nh.
LÊy ®Þa chØ cña phÇn tö m¶ng
§Þa chØ cña c¸c phÇn tö trong m¶ng mét chiÒu ®−îc x¸c ®Þnh
th«ng qua to¸n tö & theo có ph¸p:
& tªn_biÕn [i] (i lµ chØ sè cña m¶ng).
100 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Tªn cña m¶ng sÏ chøa ®Þa chØ ®Çu cña m¶ng.


VÝ dô: nÕu cã int a[10] th× a = &a[0].
NhËp xuÊt d÷ liÖu cho c¸c phÇn tö m¶ng
§Ó nhËp hay xuÊt d÷ liÖu cho c¸c phÇn tö m¶ng cã hai c¸ch:
C¸ch 1: NhËp trùc tiÕp
ChØ sö dông ®−îc víi m¶ng mét chiÒu vµ m¶ng hai chiÒu mµ c¸c
phÇn tö lµ kiÓu int.
VÝ dô: ViÕt ch−¬ng tr×nh ®Ó nhËp d÷ liÖu vµo m¶ng a cã 5 phÇn tö,
sau ®ã in c¸c gi¸ trÞ cña m¶ng ra mµn h×nh.
# include <stdio.h>
# include <conio.h>
void main ()
{
int a[5]; int i;
clrscr ();
/* Nhap du lieu vao mang a */
for ( i = 0; i < 5 ; i ++)
{
printf("\na [%d] ", i) ;
scanf("%d", &a[i]) ; /* nhap truc tiep cac phan tu mang a */
}
/* Xuat cac gia tri mang ra man hinh */
for ( i = 0; i < 5 ; i ++)
printf("%d", a[i]);
getch();
}
C¸ch 2: NhËp gi¸n tiÕp
§©y lµ c¸ch sö dông tèt cho m¶ng mét chiÒu còng nh− nhiÒu
chiÒu. ViÖc nhËp d÷ liÖu vµo m¶ng th«ng qua mét biÕn trung gian
temp nµo ®ã, sau ®ã g¸n gi¸ trÞ biÕn temp cho c¸c phÇn tö m¶ng.
Ch−¬ng 4: M¶ng vμ con trá 101

VÝ dô: ViÕt ch−¬ng tr×nh ®Ó nhËp d÷ liÖu vµo ma trËn vu«ng a cã


3x3 phÇn tö, sau ®ã in c¸c gi¸ trÞ cña m¶ng ra mµn h×nh.
# include <stdio.h>
# include <conio.h>
void main ()
{
float temp, a[3] [3]; int i, j;
clrscr ();
/* Nhap du lieu vao ma tran a */
for ( i = 0; i < 3 ; i ++)
for ( j = 0; j < 3 ; j ++)
{
printf("\na [%d] [%d] ", i, j);
scanf("%d", &temp); /* nhap gian tiep vao bien trung gian temp */
a[i] [j] = temp;
/* Gan gia tri temp cho phan tu ma tran */
}
/* Xuat cac gia tri ma tran ra man hinh */
for ( i = 0; i < 3 ; i ++)
{
printf(" \n");
for ( j = 0; j < 3 ; j ++)
printf("%.2f", a[i] [j] );
}
getch();
}

4.2. M¶ng nhiÒu chiÒu


Ta cã thÓ khai b¸o mét m¶ng nhiÒu chiÒu, mçi chiÒu ®−îc x¸c
®Þnh theo cÆp dÊu ngoÆc vu«ng cña nã.
102 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

VÝ dô ta khai b¸o m¶ng hai chiÒu sau: int a [4][3]; x¸c ®Þnh ra mét
m¶ng hai chiÒu, chiÒu thø nhÊt lµ hµng, chiÒu thø hai lµ cét. ë ®©y
biÕn a cã 4 hµng, mçi hµng 3 cét (m¶ng hai chiÒu cßn gäi lµ ma trËn).
Cã thÓ cho gi¸ trÞ khëi ®Çu cho m¶ng nhiÒu chiÒu ngay sau khai b¸o.
ViÖc lÊy chØ sè cho m¶ng nhiÒu chiÒu cÇn cÆp dÊu ngoÆc vu«ng cho
tõng chiÒu.
M¶ng nhiÒu chiÒu lµ sù më réng cña m¶ng mét chiÒu. Do vËy,
viÖc xö lý c¸c m¶ng nhiÒu chiÒu trë nªn phøc t¹p. PhÐp lÊy ®Þa chØ nh−
®· tr×nh bµy ë trªn kh«ng ¸p dông ®−îc cho c¸c phÇn tö m¶ng nhiÒu
chiÒu trõ m¶ng hai chiÒu c¸c sè nguyªn. V× vËy, ®Ó kh¾c phôc h¹n chÕ
nµy cña m¶ng, th−êng dïng con trá vµ c¸c phÐp to¸n trªn con trá.

4.3. C¸c vÝ dô vÒ m¶ng


VÝ dô 1: ViÕt ch−¬ng tr×nh s¾p xÕp mét m¶ng gåm n sè thùc theo
thø tù t¨ng dÇn (hoÆc gi¶m dÇn)
# include<stdio.h>;
# include<conio.h>;
# include<math.h>;
main()
{
clrscr();
float x[10];
float tam;
int i,j,n;
printf("\n nhap so hang n=");
scanf("%d",&n);
for (i=1;i<=n;i++)
{ printf("\n Nhap so thu %d=",i);
scanf("%f",&x[i]);
}
for (i=1; i<=n-1; i++)
Ch−¬ng 4: M¶ng vμ con trá 103

for (j=i+1;j<=n;j++)
{
if (x[i]<x[j])
{
tam=x[i];
x[i]=x[j];
x[j]=tam;
}
}
printf("\n mang sau sap xep la");
for (i=1; i<=n; i++)
printf("\n %f",x[i]);
getch();
}
VÝ dô 2: T×m phÇn tö ©m ®Çu tiªn cña ma trËn sè thùc a(m,n)
#include <stdio.h>
#include<conio.h>
#include<math.h>
main()
{ clrscr();
float a[20][20];
int i,j,n,m;
printf("\n Cho so hang ma tran m=");
scanf("%d",&m);
printf("\n Cho so cot ma tran n=");
scanf("%d",&n);
for (i=1;i<=m;i++)
for (j=1; j<=n;j++)
{ printf("Nhap A[%d,%d]=",i,j);
scanf("%f",&a[i][j]);
if (a[i][j]<0)
104 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

goto timthay;
}
printf("\n ma tran khong phan tu am");
goto kethuc;
timthay:
printf("n Phan tu am dau tien la a[%d,%d]= %f",i,j,a[i][j]);
kethuc:
;
getch();
}
VÝ dô 3: T×m vµ ®−a ra mµn h×nh c¸c gi¸ trÞ lín nhÊt vµ nhá nhÊt
trªn mçi hµng cña mét ma trËn cho tr−íc.
# include<stdio.h>
#include<conio.h>
# include<math.h>
main()
{
clrscr();
int i,j,n,m;
float a[10][10],max,min;
printf("\n Nhap so hang cua ma tran=");
scanf("%d",&m);
printf("\n Nhap so cot cua ma tran=");
scanf("%d",&n);
for (i=1;i<=m;i++)
for (j=1;j<=n;j++)
{
printf("\n Nhap a[%d,%d]=",i,j);
scanf("%f",&a[i][j]);
}
for (i=1;i<=m;i++)
Ch−¬ng 4: M¶ng vμ con trá 105

{
max=a[i][1];
min=a[i][1];
for (j=2;j<=n;j++)
{
if (a[i][j]>=max)
{ max=a[i][j];
}
if (a[i][j]<=min)
{ min=a[i][j];}
}
printf("\n Hang %d max=%f min=%f",i,max,min);
}
getch();
}
VÝ dô 4: TÝnh tÝch ma trËn C = A.B
Ph©n tÝch: NÕu A lµ ma trËn mxp phÇn tö vµ B lµ ma trËn pxn
phÇn tö th× ma trËn tÝch C gåm mxn phÇn tö vµ ®−îc tÝnh nh− sau:
n
c ij = ∑ a ik b kj
k =1

§©y thùc chÊt lµ bµi to¸n tÝnh tæng c¸c sè h¹ng.


Ch−¬ng tr×nh nh− sau:
# include <stdio.h>
# include <conio.h>
typedef float mt[10][10];
void main()
{
int i,j,k,m,n,p;
float x;
mt a,b,c;
106 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

/*Nhap du lieu ma tran A*/


printf("Ma tran A n hang va m cot:\n\n");
printf("So hang ma tran A n=");
scanf("%d",&n);
printf("So cot ma tran A m=");
scanf("%d",&m);
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
{ printf("\n a[%d][%d]=",i,j);
scanf("%f",&x);
a[i][j]=x;
}
printf("\n");
/*Nhap du lieu ma tran B*/
printf("Ma tran B n hang va m cot:\n\n");
printf("So hang ma tran B p=");
scanf("%d",&p);
printf("So cot ma tran B n=");
scanf("%d",&n);
for (i=1;i<=p;i++)
for (j=1;j<=n;j++)
{ printf("\n b[%d][%d]=",i,j);
scanf("%f",&x);
b[i][j]=x;
}
printf("\n");
/*Tinh tich c=a*b*/
for (i=1; i<=m;i++)
for (j=1; j<=p; j++)
{c[i][j]=0;
for (k=1; k<=n; k++)
Ch−¬ng 4: M¶ng vμ con trá 107

c[i][j]+=a[i][k]*b[k][j];
}
/*Hien thi ket qua*/
printf("ma tran ket qua tich C\n\n");
for (i=1; i<=m; i++)
{
for (j=1; j<=p; j++)
printf("%4.2f",c[i][j]);
printf("\n");
}
getch();
return;}

4.4. Con trá vμ biÕn ®éng


C¸c biÕn nhí cã kiÓu d÷ liÖu nh− ®· tr×nh bµy ë trªn lµ c¸c biÕn
tÜnh (static). §©y lµ c¸c biÕn mµ kÝch th−íc, kiÓu vµ ®Þa chØ cña nã
kh«ng thay ®æi, tån t¹i trong suèt qu¸ tr×nh ch¹y ch−¬ng tr×nh.
BiÕn tÜnh cã nh−îc ®iÓm lµ khi chóng ta khai b¸o d−: g©y l·ng phÝ
bé nhí, cßn nÕu khai b¸o thiÕu th× kh«ng ch¹y ®−îc ch−¬ng tr×nh. §Ó
kh¾c phôc nh÷ng nh−îc ®iÓm trªn trong c¸c ng«n ng÷ lËp tr×nh cÊp
cao th−êng sö dông biÕn ®éng (dynamic).
BiÕn ®éng kh¸c biÕn tÜnh, kh«ng sinh ra lóc b¾t ®Çu ch−¬ng tr×nh
mµ sinh ra trong qu¸ tr×nh thùc hiÖn ch−¬ng tr×nh. Nã cã thÓ thay ®æi
®−îc kÝch th−íc vµ ®Þa chØ vïng nhí cÊp ph¸t lóc ch¹y ch−¬ng tr×nh vµ
cã thÓ gi¶i phãng khi ®· sö dông xong ®Ó tiÕt kiÖm bé nhí.
Tuy nhiªn kh«ng thÓ truy nhËp ®Õn biÕn ®éng v× nã kh«ng chøa
®Þa chØ nhÊt ®Þnh. Ng−êi ta ph¶i sö dông mét lo¹i biÕn ®Æc biÖt gäi lµ
biÕn con trá (pointer). BiÕn con trá lµ lo¹i biÕn chuyªn dïng ®Ó chøa
®Þa chØ cña biÕn ®éng gióp ng−êi lËp tr×nh truy nhËp ®Õn biÕn ®éng.
108 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Khai b¸o biÕn con trá:


Con trá lµ biÕn ®Ó chøa ®Þa chØ cña mét biÕn nhí kh¸c hoÆc mét
hµm. V× cã nhiÒu lo¹i d÷ liÖu nªn cã nhiÒu kiÓu con trá t−¬ng øng.
- Con trá kiÓu nguyªn dïng ®Ó chøa ®Þa chØ c¸c biÕn nguyªn.
- Con trá kiÓu float, double dïng ®Ó chøa ®Þa chØ cña c¸c biÕn
float, double.
Có ph¸p: <tªn kiÓu> *<BiÕn con trá>;
<Tªn kiÓu> lµ kiÓu d÷ liÖu cña biÕn ®éng mµ biÕn con trá l−u ®Þa
chØ cña nã.
<BiÕn con trá>: ®−îc ®Æt theo quy t¾c ®Æt tªn.
VÝ dô:
int *ip1, *ip2;
unsigned char *ucp;
double *dp;
float a=4.5, b= 6.0, *p;
Trong vÝ dô nµy ip1, ip2 trá ®Õn d÷ liÖu kiÓu nguyªn cßn p trá ®Õn
d÷ liÖu kiÓu thùc.
Th«ng qua con trá, mét ®èi t−îng cã thÓ ®−îc tham chiÕu tíi mét
c¸ch gi¸n tiÕp. C¸ch dïng ®iÓn h×nh cña con trá lµ trong viÖc t¹o ra
danh s¸ch mãc nèi vµ qu¶n lý c¸c ®èi t−îng ®−îc cÊp ph¸t bé nhí
trong khi thùc hiÖn ch−¬ng tr×nh.
Mäi con trá ®Òu cã mét kiÓu liªn kÕt d÷ liÖu. KiÓu d÷ liÖu x¸c
®Þnh ra kiÓu cña ®èi t−îng d÷ liÖu mµ con trá trá tíi. VÝ dô mét con trá
kiÓu int, sÏ trá tíi mét ®èi t−îng cã kiÓu int.
Bé nhí ®−îc cÊp ph¸t cho mét con trá chÝnh lµ kÝch cì cÇn thiÕt
®Ó l−u tr÷ mét ®Þa chØ bé nhí, tøc lµ mét con trá kiÓu int vµ mét con
trá kiÓu double sÏ cã cïng kÝch cì. KiÓu liªn kÕt cña con trá x¸c ®Þnh
ra c¸ch thøc th«ng dÞch néi dung vµ kÝch cì cña vïng bé nhí mµ nã
trá tíi.
Ch−¬ng 4: M¶ng vμ con trá 109

Mét con trá cã thÓ ®−îc khëi ®Çu b»ng gi¸ trÞ ®Þa chØ cña mét ®èi
t−îng cïng kiÓu. §Ó lÊy ®−îc ®Þa chØ cña mét ®èi t−îng, cÇn ph¶i dïng
mét to¸n tö ®Æc biÖt, gäi lµ to¸n tö lÊy ®Þa chØ, cã ký hiÖu lµ dÊu “&”.
§Ó ®Þnh vÞ con trá trá tíi ®Þa chØ mét biÕn nµo ®ã, ta sö dông có
ph¸p: Tªn con trá = &biÕn
VÝ dô:
- Khai b¸o c¸c biÕn con trá:
....
int x, y, *px, *c;
float *t, *d;
- Quy ®Þnh vïng trá tíi:
c = &y; //* g¸n ®Þa chØ cña y cho con trá c *//
px = &x; // g¸n ®Þa chØ cña x cho con trá px
Nh− vËy trong con trá c chøa ®Þa chØ cña biÕn y vµ trong con trá
px chøa ®Þa chØ cña biÕn x.
t = &y;
V× t lµ con trá kiÓu float nã chØ chøa ®−îc ®Þa chØ cña biÕn float,
trong khi ®ã y l¹i lµ biÕn kiÓu int nªn kh«ng thÓ chÊp nhËn ®−îc.
Néi dung cña biÕn con trá lµ néi dung cña biÕn mµ nã trá tíi (tøc
lµ biÕn ®éng ®ang chøa d÷ liÖu).
VÝ dô: *px = 567 sÏ gièng nh− x = 567
#include <stdio.h>
#include<stdlib.h>
#include<conio.h>
main()
{
int x, *px;
px =&x;
*px=567;
110 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

clrscr();
printf("Vi tri cua bien x la: %p \n",&x);
printf("Noi dung cua bien x la: %d\n",x);
printf("Vi tri cua bien con tro p la: %p \n",px);
printf("Noi dung cua bien con tro px la: %d\n",*px);
getch();
}
Con trá còng cã thÓ ®−îc khëi ®Çu b»ng mét con trá kh¸c cã
cïng kiÓu.
ViÖc g¸n gi¸ trÞ mét biÕn cho mét con trá vµ ng−îc l¹i bao giê
còng lµ kh«ng hîp lÖ v× con trá lu«n chøa gi¸ trÞ kiÓu ®Þa chØ.
Cã thÓ g¸n gi¸ trÞ 0 (hay cßn gäi lµ gi¸ trÞ NULL) cho mét con
trá cã kiÓu bÊt kú ®Ó chØ ra r»ng con trá hiÖn t¹i kh«ng trá tíi ®èi
t−îng d÷ liÖu.
§Ó th©m nhËp vµo ®èi t−îng d÷ liÖu mµ con trá trá tíi, cÇn ¸p
dông to¸n tö lÊy gi¸ trÞ, ký hiÖu “*”.
T¹o ra c¸c biÕn nhí ®éng
ViÖc t¹o ra mét biÕn ®éng (dynamic) ®−îc thùc hiÖn nhê c¸c
hµm sau:
1. Hµm malloc, khai b¸o:
void *malloc(<kÝch th−íc>);
void *farmalloc(<kÝch th−íc>);
Hµm malloc cho phÐp cÊp ph¸t mét vïng nhí cã <kÝch th−íc>
nhá h¬n 64Kb, cßn nÕu muèn cÊp ph¸t vïng nhí lín h¬n ph¶i sö dông
farmalloc. NÕu m¸y tÝnh cßn ®ñ bé nhí ®Ó cÊp ph¸t th× c¸c hµm nµy
cho con trá trá tíi vïng nhí võa ®−îc cÊp, ng−îc l¹i hµm cho con trá
rçng NULL.
2. Hµm calloc, khai b¸o:
void *calloc(<sè l−îng>, <kÝch th−íc>);
void *farcalloc(<sè l−îng>, <kÝch th−íc>);
Ch−¬ng 4: M¶ng vμ con trá 111

Hµm calloc xin cÊp ph¸t mét vïng nhí cã dung l−îng lµ
<sè l−îng>x<kÝch th−íc>. NÕu m¸y tÝnh cßn ®ñ bé nhí ®Ó cÊp ph¸t th×
c¸c hµm nµy cho con trá trá tíi vïng nhí võa ®−îc cÊp, ng−îc l¹i hµm
cho con trá rçng NULL. Tr−êng hîp muèn xin cÊp vïng nhí trªn
64KB th× ph¶i sö dông farcalloc.
Gi¶i phãng vïng nhí
Khi kh«ng cÇn dïng ®Õn c¸c biÕn ®éng cã thÓ sö dông hai hµm
sau ®©y ®Ó thu håi l¹i vïng nhí ®· cÊp ph¸t cho chóng.
Hµm: void free(void *<khèi>) gi¶i phãng vïng nhí ®· ®−îc cÊp
ph¸t b»ng malloc, calloc.
Hµm: void farfree(void *<khèi>) gi¶i phãng vïng nhí ®· ®−îc
cÊp ph¸t b»ng farmalloc, farcalloc.

4.5. Con trá vμ m¶ng


Trong C/C++, kh¸i niÖm m¶ng vµ con trá liªn quan chÆt chÏ víi
nhau. C¸c thao t¸c thùc hiÖn th«ng qua chØ sè cña m¶ng ®Òu cã thÓ
thùc hiÖn biÕn con trá. C¸c con trá trá vµo c¸c d÷ liÖu cïng mét kiÓu
cã thÓ gép l¹i thµnh mét m¶ng. §Ó khai b¸o m¶ng c¸c con trá, ta viÕt:
<Tªn kiÓu> * <Tªn m¶ng> [<kÝch th−íc m¶ng>];
VÝ dô: int *a_nguyen[10]; char *b_ten[20];
Víi d÷ liÖu kiÓu m¶ng, tªn gäi cña m¶ng x¸c ®Þnh ®Þa chØ trong bé
nhí cña phÇn tö ®Çu tiªn n»m trong m¶ng.
Ta xÐt mét biÕn m¶ng: char buf [8]; khai b¸o mét m¶ng cã 8
phÇn tö cã kiÓu char.
Ta cã: buf Ù &buf [0]
V× viÖc ¸p dông to¸n tö lÊy ®Þa chØ cho mét ®èi t−îng d÷ liÖu sÏ
cho l¹i con trá thuéc kiÓu ®èi t−îng ®ã. Trong tr−êng hîp nµy, ®èi
t−îng cã kiÓu char, cã nghÜa lµ buf (tªn gäi cña m¶ng) ph¶i cho l¹i
mét gi¸ trÞ kiÓu char*. Hay ta cã thÓ viÕt nh− sau:
char *pBuf = buf;
112 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

pBuf vµ buf lµ t−¬ng ®−¬ng v× mçi tªn gäi ®Òu chØ ra phÇn tö ®Çu
tiªn cña m¶ng.
§Ó trá ®Õn ®Þa chØ phÇn tö tiÕp theo, cã thÓ cã hai c¸ch:
pBuf + 1;
hoÆc &buf [1];
LÊy ®Þa chØ phÇn tö thø i:
pBuf + i;
hoÆc &buf [i];
Vµ ta cã thÓ th©m nhËp phÇn tö d÷ liÖu ®Çu tiªn:
*pBuf;
hoÆc buf [0];
Th©m nhËp phÇn tö d÷ liÖu thø i:
*(pBuf + i );
hoÆc buf [ i ];
Ta xÐt khai b¸o sau ®©y: float t, *p, A[9];
C©u lÖnh nµy khai b¸o biÕn thùc t, con trá thùc p vµ m¶ng A gåm
9 phÇn tö: A[0], A[1],... A[9].
LÖnh g¸n p = &A[0]; sÏ cho biÕn p trá ®Õn phÇn tö ®Çu tiªn cña
m¶ng A. Chóng ta cÇn nhí r»ng viÖc sö dông &<tªn biÕn> lµ cho ta
®Þa chØ cña biÕn. B©y giê nÕu ta viÕt t=*p sÏ sao chÐp néi dung cña
A[0] vµo biÕn t.
Mét con trá vµ mét m¶ng kh¸c nhau vÒ ph−¬ng ph¸p cÊp bé nhí:
Víi mét m¶ng d÷ liÖu, bé nhí cÊp ph¸t cho kiÓu m¶ng lµ mét
khèi bé nhí liªn tôc, tªn gäi cña m¶ng chøa ®Þa chØ ®Çu cña vïng nhí
vµ nã ®−îc xö lý nh− mét h»ng.
ViÖc t¨ng kÝch cì cña m¶ng lµ kh«ng thÓ thùc hiÖn ®−îc v× sè
phÇn tö cña m¶ng ®· ®−îc x¸c ®Þnh ngay tõ ®Çu.
Nh−ng d÷ liÖu kiÓu con trá lµ ®Ó l−u gi¸ trÞ cña mét ®Þa chØ bé
nhí. Ng−êi dïng tr−íc hÕt ph¶i ®Æt con trá trá vµo ®èi t−îng ®· ®−îc
Ch−¬ng 4: M¶ng vμ con trá 113

cÊp ph¸t bé nhí tr−íc ®ã tr−íc khi sö dông chóng mét c¸ch an toµn.
§iÒu nµy th−êng ®−îc thùc hiÖn b»ng c¸ch cÊp ph¸t bé nhí trong khi
ch−¬ng tr×nh ®ang ch¹y th«ng qua viÖc dïng to¸n tö new. Hñy bá vïng
nhí ®−îc cÊp ph¸t b»ng new nhê to¸n tö delete.
Chóng ta xÐt vÝ dô sau:
VÝ dô: LËp tr×nh sö dông con trá ®Ó s¾p xÕp mét d·y sè theo thø tù
t¨ng dÇn.
# include<stdio.h>
# include<conio.h>
short i,j,n;
float tg, *p;
void main()
{
clrscr();
printf("Nhap so phan tu mang n=");
scanf("%d",&n);
for (i=1; i<=n; i++)
{
printf("Nhap so thu %d=",i);
scanf("%f",p+i);
}
printf("\n");
for (i=1; i<=n-1; i++)
for (j=i+1; j<=n; j++)
if (*(p+i)>*(p+j))
{
tg=*(p+i);
*(p+i)=*(p+j);
*(p+j)=tg;
}
114 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

printf("day so sap xep tang dan nhu sau:\n\n");


for (i=1; i<=n; i++)
printf("%6.1f",*(p+i));
printf("\n");
getch();
}
Trong ch−¬ng tr×nh trªn chóng ta sö dông *(p+i) lµ ®Ó truy nhËp
®Õn phÇn tö thø i cña m¶ng A[i].
Ch−¬ng 4: M¶ng vμ con trá 115

Bài tập chương 4

1. §o¹n ch−¬ng tr×nh sau dÞch kh«ng cã lçi, nh−ng nã vÉn sai. H·y
t×m ra chç sai ®ã: char buf [ ] = “Xau kiem thu”;
void main ()
{
char *ptr = 0;
for (int i=0; buf [i] != ‘\0’; i++)
ptr [i] = buf [i];
}
2. Trong c¸c khai b¸o m¶ng sau, khai b¸o nµo lµ kh«ng hîp lÖ? T¹i sao?
int getSize();
int bufSize = 1024;
a) int ia[ bufSize];
b) int ia[ getSize()];
c) int ia[ 4*7 - 14];
3. Trong c¸c khai b¸o con trá sau, khai b¸o nµo lµ kh«ng hîp lÖ?
T¹i sao?
int ival = 1024;
int *iptr;
double *dptr;
a) ival = *iptr; e) *iptr = & ival;
b) ival = iptr; f) iptr = &ival;
c) *iptr = ival; g) dptr = iptr;
d) iptr = ival; h) dptr = *iptr;
116 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

4. ViÕt ch−¬ng tr×nh l−u tr÷ tuæi cña 6 ng−êi b¹n trong m¶ng mét chiÒu
b»ng to¸n tö g¸n. HiÓn thÞ tuæi trªn mµn h×nh theo thø tù t¨ng dÇn.
5. ViÕt ch−¬ng tr×nh l−u tr÷ vµ hiÓn thÞ c¸c sè tõ 1 ®Õn 21 trong
b¶ng 3x7.
6. ViÕt ch−¬ng tr×nh l−u tr÷ ®iÓm häc trung b×nh cña häc kú võa qua
cña 5 líp häc, mçi líp cã 20 sinh viªn. Sö dông cin ®Ó nhËp ®iÓm,
hiÓn thÞ b¶ng ®iÓm trªn mµn h×nh.
7. ViÕt ch−¬ng tr×nh l−u tr÷ tªn thµnh viªn trong gia ®×nh trong b¶ng
hai chiÒu.
8. ViÕt ch−¬ng tr×nh nhËp d·y sè tõ bµn phÝm. Sö dông con trá ®Ó t×m
xem d·y sè ®ã cã chøa sè 0 hay kh«ng?
9. ViÕt ch−¬ng tr×nh nhËp d·y sè tõ bµn phÝm. Sö dông con trá ®Ó t×m
ra sè lín nhÊt vµ sè nhá nhÊt võa nhËp. HiÓn thÞ l¹i d·y sè võa nhËp,
sè lín nhÊt vµ sè nhá nhÊt trong d·y ®ã.
10. LËp ch−¬ng tr×nh nhËp m¶ng mét chiÒu, tÝnh tæng c¸c phÇn tö dïng
con trá.
11. Sö dông viÖc cÊp ph¸t bé nhí ®éng (kh«ng sö dông m¶ng) ®Ó nhËp
hai d·y sè cã sè phÇn tö mçi d·y ®−îc nhËp tõ bµn phÝm. Sau ®ã in
ra tæng cña mçi d·y vµ tæng cña hai d·y nµy.
12. ViÕt ch−¬ng tr×nh nhËp vµo m¶ng, h·y xuÊt ra mµn h×nh:
- Dßng 1: phÇn tö ©m lín nhÊt cña m¶ng.
- Dßng 2: phÇn tö d−¬ng nhá nhÊt cña m¶ng.
- Dßng 3: Tæng c¸c phÇn tö cã c¨n bËc hai nguyªn.
- Dßng 4: Gåm c¸c sè lÎ vµ sè c¸c sè lÎ.
- Dßng 5: Gåm c¸c sè ch½n vµ sè c¸c sè ch½n
Ch−¬ng 5: CÊu tróc vμ vμo/ra tÖp 117

Chương 5 

CẤU TRÚC VÀ VÀO/RA TỆP

Trong c¸c bμi to¸n thùc tÕ chóng ta hay gÆp c¸c kiÓu d÷ liÖu cã
nhiÒu thμnh phÇn kh¸c nhau chø kh«ng nhÊt ®Þnh lμ thuéc kiÓu d÷
liÖu nguyªn hay thùc hoÆc ký tù. VÝ dô, trong hå s¬ c¸n bé th−êng
bao gåm c¸c thuéc tÝnh: hä vμ tªn, ngμy sinh, quª qu¸n, giíi tÝnh,
l−¬ng, ®Þa chØ... cô thÓ:
- Hä vμ tªn: d÷ liÖu kiÓu ký tù.
- L−¬ng: d÷ liÖu kiÓu sè thùc
- Ngμy sinh: d÷ liÖu kiÓu ngμy/th¸ng/n¨m...
Mçi mét thuéc tÝnh nμy ta gäi lμ mét tr−êng, cßn tËp c¸c thuéc
tÝnh trªn sÏ t¹o thμnh mét hå s¬ vμ trong C/C++ ta gäi lμ mét
kiÓu cÊu tróc.
Trong ch−¬ng nμy chóng ta sÏ nghiªn cøu c¸ch sö dông kiÓu cÊu
tróc trong ch−¬ng tr×nh. Néi dung ch−¬ng nμy sÏ tr×nh bμy c¸c vÊn
®Ò sau ®©y:
- CÊu tróc, hîp nhÊt
- M¶ng cÊu tróc
- C¸c thao t¸c vμo/ra tÖp

5.1. CÊu tróc, hîp nhÊt

5.1.1. CÊu tróc


CÊu tróc lµ tËp hîp cña mét hay nhiÒu biÕn, chóng cã thÓ kh¸c
kiÓu nhau, ®−îc nhãm l¹i d−íi mét tªn duy nhÊt ®Ó tiÖn xö lý. Trong
ng«n ng÷ Pascal cÊu tróc ®−îc gäi lµ b¶n ghi (record).
118 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Nh− vËy, d÷ liÖu kiÓu cÊu tróc cho phÐp lËp tr×nh viªn tæ chøc gép
nhiÒu kiÓu d÷ liÖu kh¸c nhau trong mét cÊu tróc ®¬n, nã lµ mét kiÓu
d÷ liÖu dÉn xuÊt tõ c¸c kiÓu d÷ liÖu ®· ®−îc ®Þnh nghÜa.
VÝ dô cÊu tróc d÷ liÖu m« t¶ nh©n viªn gåm hä tªn, giíi tÝnh, tuæi...
Có ph¸p khai b¸o kiÓu cÊu tróc:
struct <Tªn kiÓu>
{
<kiÓu d÷ liÖu 1 > <tr−êng 1>;
<kiÓu d÷ liÖu 2> <tr−êng >2;
...
<kiÓu d÷ liÖu n> <tr−êng n>;
};
struct: tõ khãa
<kiÓu 1>, <kiÓu 2>, <kiÓu n>: lµ c¸c kiÓu d÷ liÖu cña c¸c thµnh
phÇn cÊu tróc.
<tr−êng1>, <tr−êng 2>,.. <tr−êng n>: lµ tªn c¸c thµnh phÇn cÊu tróc.
VÝ dô: §Ó m« t¶ kiÓu d÷ liÖu hå s¬ c¸n bé ta cã thÓ viÕt:
struct hoso
{
char hoten[20];
int namsinh;
float luong;
char gioitinh;
}
struct hoso canbo1, canbo2;
Khi khai b¸o cÊu tróc nh− trªn tøc lµ ta ®Þnh nghÜa ra mét kiÓu d÷
liÖu míi, ch−a cã bé nhí cho cÊu tróc. Bé nhí ®−îc cÊp ph¸t khi ta
khai b¸o biÕn d÷ liÖu cã kiÓu cÊu tróc.
Ch−¬ng 5: CÊu tróc vμ vμo/ra tÖp 119

Có ph¸p khai b¸o biÕn kiÓu cÊu tróc:


<kiÓu cÊu tróc> <tªn biÕn cÊu tróc>;
§Ó cã thÓ khai b¸o biÕn kiÓu cÊu tróc, tr−íc hÕt ta ph¶i khai b¸o
cÊu tróc, tøc lµ hiÓn nhiªn ta ph¶i khai b¸o kiÓu biÕn tr−íc khi khai
b¸o biÕn.
Sau khi khai b¸o biÕn kiÓu cÊu tróc, ta cã thÓ th©m nhËp c¸c thµnh
phÇn cÊu tróc vµ thùc hiÖn c¸c thao t¸c d÷ liÖu cÇn thiÕt b»ng to¸n tö
“.” nh− sau: <tªn biÕn cÊu tróc>.<tªn tr−êng>
VÝ dô: canbo1.hoten="nguyen van A"; canbo1.luong=890.5;
PhÐp g¸n víi kiÓu cÊu tróc
Víi d÷ liÖu kiÓu cÊu tróc, ta còng cã thÓ thùc hiÖn c¸c phÐp to¸n:
- G¸n cÊu tróc: Cã thÓ g¸n gi¸ trÞ hai biÕn cã cïng kiÓu cÊu tróc.
VÝ dô: canbo1 = canbo2;
Khi thùc hiÖn phÐp g¸n, c¸c thµnh phÇn d÷ liÖu t−¬ng øng sÏ ®−îc
tù ®éng sao chÐp sang nhau.
- Sö dông biÕn cÊu tróc nh− lµ mét ®èi cña hµm.
VÝ dô 1: H·y x©y dùng mét cÊu tróc hå s¬ ®Ó nhËp vµo danh s¸ch:
Hä vµ tªn, ngµy vµo tr−êng, ngµy tèt nghiÖp. Trong ®ã yªu cÇu ngµy
vµo tr−êng vµ ngµy tèt nghiÖp lµ kiÓu d÷ liÖu ngµy th¸ng (bao gåm:
ngµy, th¸ng, n¨m).
Ch−¬ng tr×nh nh− sau:
/*Chuong trinh minh hoa du lieu kieu cau truc*/
#include <stdio.h>
#include <conio.h>
#define maxTen 40 /*Ho ten dai nhat 40 ky tu*/
struct ngaythang
{
int ngay,thang,nam;};
120 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

struct hoso
{
char Ten[maxTen];
struct ngaythang ngayvao; /*ngay vao truong*/
struct ngaythang ngayra; /*ngay tot nghiep truong*/
};
void VaoDS(struct hoso *ds);
void main()
{
struct hoso nhvat;
clrscr();
VaoDS(&nhvat);
printf("\nHo ten:%s\nNgay vao:%d%d%d\nNgay tot nghiep
%d%d%d",nhvat.Ten,nhvat.ngayvao.ngay,nhvat.ngayvao.thang,
nhvat.ngayvao.nam,nhvat.ngayra.ngay,nhvat.ngayra.thang,
nhvat.ngayra.nam);
getch();
return;}
void VaoDS(struct hoso *ds)
{
char traloi;
printf("\nCho ho va ten:");
gets(ds->Ten);
printf("\n Ngay vao truong:");
scanf("%d%d%d",&ds->ngayvao.ngay,&ds->ngayvao.thang,
&ds->ngayvao.nam);
printf("\nNgay = Ngay tot nghiep?y/n:");
getchar();
traloi=getchar();
if (traloi=='y') ds->ngayra=ds->ngayvao;
else
{printf("\nNgay tot nghiep:");
Ch−¬ng 5: CÊu tróc vμ vμo/ra tÖp 121

scanf("%d%d%d",&ds->ngayra.ngay,&ds->ngayra.thang,
&ds->ngayra.nam);
}
}

Trong ch−¬ng tr×nh trªn, chóng ta ®· khai b¸o kiÓu d÷ liÖu


ngaythang lµ kiÓu d÷ liÖu cÊu tróc gåm c¸c tr−êng ngay, thang vµ nam.
KiÓu d÷ liÖu hoso (Hå s¬) bao gåm:
tr−êng tªn (kiÓu ký tù);
ngayvao, ngayra ®Òu thuéc kiÓu cÊu tróc d÷ liÖu ngaythang ta
®· t¹o ra ë trªn.
Khai b¸o void VaoDS lµ khai b¸o hµm kh«ng ®Þnh kiÓu (gièng thñ
tôc trong Pascal) ®Ó thùc hiÖn c«ng viÖc nhËp danh s¸ch c¸n bé. Hµm
nµy ®−îc khai b¸o sau return cña ch−¬ng tr×nh chÝnh. Trong ch−¬ng
tr×nh nµy chóng ta ®· sö dông c¸c cÊu tróc lång nhau, tøc lµ mét
tr−êng trong kiÓu cÊu tróc (ngayvao, ngayra) l¹i lµ mét kiÓu cÊu tróc
kh¸c (ngaythang).
§Ó truy nhËp ®Õn c¸c tr−êng nh− vËy chóng ta sö dông lÖnh:
<Tªn biÕn b¶n ghi>.<Tªn tr−êng ngoμi>.<Tªn tr−êng trong>
Chóng ta còng ®· sö dông ®Õn biÕn con trá cÊu tróc. BiÕn cÊu tróc
lµ mét biÕn trong bé nhí nªn cã thÓ cã con trá trá ®Õn nã. Khai b¸o
biÕn con trá trá ®Õn cÊu tróc nh− sau:
struct <tªn kiÓu cÊu tróc> * <BiÕn con trá>;
VÝ dô: struct cb *tro_hoso;
ViÖc truy cËp vµo c¸c tr−êng cña biÕn cÊu tróc th«ng qua con trá
cÊu tróc ®−îc viÕt nh− sau:
<BiÕn con trá cÊu tróc> -> <Tªn tr−êng>
VÝ dô: gets(ds->Ten);
DÊu -> ë ®©y lµ b¾t buéc kh«ng ®−îc dïng dÊu chÊm (.).
122 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

VÝ dô 2: ViÕt ch−¬ng tr×nh nhËp vµo hä tªn vµ ®iÓm thi cña sinh
viªn mét líp, sau ®ã in ra danh s¸ch nh÷ng sinh viªn ®¹t ®iÓm kh¸ tõ
7,0 trë lªn.
#include <stdio.h>
#include <conio.h>
# include <string.h>
#define maxTen 40 /*Ho ten dai nhat 40 ky tu*/
struct hoc_sinh
{
char ho_ten[maxTen];
float diem;
} dshs[100];
int n ; / * So luong sinh vien lop * /
int k; / * So luong sinh vien lop dat diem kha * /
int i;
char name[20]; float d;
/* Nhap thong tin sinh vien */
n = 0;
do {
clrscr();
printf(" Nhap thong tin sinh thu %d\n", n+1) ;
printf ("Ho va ten : "); gets(name);
if (strcmp(name, " ")!=0)
{
strcpy(dshs[n].ho_ten.name);
printf(" Diem : ");
scanf("%d", &d);
dshs[n++].diem = d;
}
} while (strcmp(name," ")!=0);
Ch−¬ng 5: CÊu tróc vμ vμo/ra tÖp 123

if (!n) /* Khong nhap duoc sinh vien nao */


{
printf ("Chua nhap hoc sinh nao \n");
return 0;
}
else
{
k =0;
printf ("Danh sach sinh vien dat diem kha \n");
for (i = 0; i<n; i++)
if (dshs[i].diem >= 7)
printf("%d.%s%6.3f", ++k, dshs[i].ho_ten, dshs[i].diem);
if (!k)
printf ("Khong co sinh vien nao dat diem kha \n"
}
getch ();
}

5.1.2. Hîp nhÊt


Ngoµi kiÓu d÷ liÖu cÊu tróc, ng«n ng÷ C/C++ cßn cho phÐp ng−êi
lËp tr×nh t¹o ra mét kiÓu d÷ liÖu dÉn xuÊt kh¸c, ®ã lµ kiÓu hîp nhÊt
(union). KiÓu d÷ liÖu union còng cho phÐp ng−êi dïng gép nhiÒu kiÓu
d÷ liÖu trong mét tæ chøc nhÊt ®Þnh nh− kiÓu d÷ liÖu cÊu tróc.
Có ph¸p:
union Uname
{
type1 id_list1;
type2 id_list2;
...
typen id_listn;
};
124 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Trong ®ã:
+ union: tõ khãa hîp nhÊt
+ Uname: tªn hîp nhÊt
+ type1, type2, typen: c¸c kiÓu d÷ liÖu cña c¸c thµnh phÇn hîp nhÊt
+ id_list1, id_list2, id_listn: tªn c¸c thµnh phÇn hîp nhÊt
§iÓm kh¸c biÖt cña union víi kiÓu d÷ liÖu cÊu tróc (struct) lµ: c¸c
thµnh phÇn cña biÕn cÊu tróc ®−îc cÊp ph¸t c¸c vïng nhí kh¸c nhau,
cßn c¸c thµnh phÇn cña biÕn union ®−îc cÊp ph¸t chung mét vïng nhí.
Vïng bé nhí cña union th−êng cã ®é lín b»ng ®é lín vïng bé nhí ®Ó
l−u tr÷ thµnh phÇn d÷ liÖu cã kÝch cì lín nhÊt trong union.
C¸ch dïng kiÓu d÷ liÖu hîp nhÊt:
KiÓu d÷ liÖu hîp nhÊt còng ®−îc dïng nh− kiÓu d÷ liÖu cÊu tróc.
Tr−íc khi khai b¸o biÕn cã kiÓu hîp nhÊt, ta ph¶i khai b¸o hîp nhÊt
nh− lµ mét kiÓu vµ c¸c thµnh phÇn cña nã.
Ta cã thÓ truy nhËp vµo c¸c thµnh phÇn cña hîp nhÊt b»ng c¸c
to¸n tö “ . "
VÝ dô:
struct ng{
int ngay;
int thang;
int nam;
};
struct diachi {
int sonha;
char *tenpho;
};
union u{
struct ng date;
Ch−¬ng 5: CÊu tróc vμ vμo/ra tÖp 125

struct diachi address;


} diachi_ngaysinh;
Trong vÝ dô nµy chóng ta ®· khai b¸o mét union tªn lµ u cã c¸c
thµnh phÇn lµ cÊu tróc.

5.2. M¶ng cÊu tróc


Còng nh− c¸c kiÓu d÷ liÖu ®¬n kh¸c, ta còng cã thÓ dïng kiÓu d÷
liÖu lµ mét m¶ng c¸c cÊu tróc nh− lµ mét tËp hîp c¸c cÊu tróc. M¶ng
mµ c¸c thµnh phÇn cã kiÓu cÊu tróc ®−îc gäi lµ m¶ng cÊu tróc. Khai
b¸o mét m¶ng cã cÊu tróc hoµn toµn t−¬ng tù nh− ®èi víi khai b¸o mét
m¶ng b×nh th−êng nh−ng thay cho tªn kiÓu d÷ liÖu b×nh th−êng lµ tªn
kiÓu d÷ liÖu cÊu tróc.
Có ph¸p:
<KiÓu cÊu tróc> Tªn m¶ng [sè phÇn tö];
VÝ dô:
struct hoc_sinh dshs[100]; /*hoc_sinh lµ kieu cau truc */
Víi hoc_sinh lµ kiÓu cÊu tróc ®−îc khai b¸o nh− sau:
struct hoc_sinh
{
char ho_ten[20];
float diem;
} hs, dshs[100];
M¶ng cÊu tróc còng cã ®Çy ®ñ c¸c tÝnh chÊt cña mét m¶ng d÷
liÖu, tøc lµ ta cã thÓ truy nhËp ®Õn tõng cÊu tróc theo chØ sè m¶ng.
Muèn truy nhËp vµo c¸c thµnh phÇn cÊu tróc ta l¹i dïng to¸n tö thµnh
phÇn “ . ”.
Truy nhËp ®Õn c¸c thµnh phÇn cÊu tróc theo thø tù:
Dïng to¸n tö [ ] ®Ó x¸c ®Þnh thø tù cña phÇn tö cÊu tróc trong m¶ng
cÊu tróc. Dïng to¸n tö “ . " ®Ó truy nhËp vµo thµnh phÇn cña cÊu tróc.
126 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Khi dïng m¶ng hay m¶ng cÊu tróc, ng−êi lËp tr×nh lu«n ph¶i chó
ý r»ng sè c¸c phÇn tö cña m¶ng lµ cã giíi h¹n size khi khai b¸o. Khi
thùc hiÖn c¸c phÐp to¸n víi c¸c phÇn tö cÊu tróc, lu«n ph¶i kiÓm tra
thø tù giíi h¹n n»m trong kÝch th−íc cña m¶ng cÊu tróc.

5.3. C¸c thao t¸c vμo/ra tÖp


C¸c tÖp d÷ liÖu lµ gi¶i ph¸p cÇn thiÕt cho viÖc l−u tr÷ d÷ liÖu cña
c¸c ch−¬ng tr×nh khi ph¶i xö lý d÷ liÖu ®−a vµo hoÆc kÕt qu¶ qu¸ tr×nh
xö lý cã khèi l−îng lín kh«ng thÓ chøa hÕt trong bé nhí trong cña
m¸y tÝnh. H¬n n÷a, khi ch−¬ng tr×nh kÕt thóc, d÷ liÖu trong bé nhí
trong cña m¸y sÏ bÞ xãa nªn ta kh«ng thÓ l−u tr÷ d÷ liÖu l©u dµi ®Ó sö
dông nhiÒu lÇn. Ngoµi ra, c¸c tÖp d÷ liÖu cßn ®ãng vai trß lµ “hßm
th−” phôc vô cho viÖc trao ®æi d÷ liÖu gi÷a c¸c tiÕn tr×nh trong hÖ
thèng. ViÖc vµo/ra d÷ liÖu trªn tÖp lu«n ph¶i tu©n thñ theo mét quy t¾c
chung lµ ph¶i lµm viÖc tuÇn tù theo ba b−íc: Më tÖp (Open) → Xö lý
(®äc/ghi) → §ãng tÖp (close).
Trong ng«n ng÷ C/C++, cã thÓ xö lý viÖc vµo/ra tÖp d÷ liÖu theo
hai c¸ch: Sö dông líp ifstream vµ ofstream hoÆc sö dông hÖ thèng th−
viÖn vµo ra chuÈn.
Trong ch−¬ng tr×nh C, kiÓu tÖp ®−îc khai b¸o nh− sau:
FILE *<BiÕn trá tÖp>;
VÝ dô: FILE *f, *tep;
f = fopen("data.dat", "wt");
5.3.1. Sö dông líp ifstream vμ ofstream
Ng«n ng÷ C/C++ cung cÊp kh¸i niÖm luång d÷ liÖu (stream). §©y
lµ kh¸i niÖm trõu t−îng lµm trung gian gi÷a ch−¬ng tr×nh vµ c¸c thiÕt
bÞ vµo - ra.
Líp ifstream vµ ofstream ®−îc ®Þnh nghÜa trong th− viÖn fstream,
nªn khi sö dông ph¶i cã dßng #include <fstream.h> ë ®Çu tÖp nguån
ch−¬ng tr×nh.
Ch−¬ng 5: CÊu tróc vμ vμo/ra tÖp 127

Mét sè hµm th«ng dông trong líp ifstream vµ ofstream.


a. C¸c hμm më tÖp
void ofstream::open(const char *filename,int mode,int nProt);
Më mét tÖp ®Ó ghi d÷ liÖu, víi tham sè:
int mode: x¸c ®Þnh mode më tÖp, cã gi¸ trÞ mÆc ®Þnh lµ ios::out.
void ifstream::open(char *filename,int mode,int nProt);
Më mét tÖp ®Ó ®äc d÷ liÖu, víi tham sè:
int mode: x¸c ®Þnh mode më tÖp, cã gi¸ trÞ mÆc ®Þnh lµ ios::in.
const char *filename: x¸c ®Þnh tªn cña tÖp.
int nProf: x¸c ®Þnh mode sö dông chung.
b. Hμm ®ãng tÖp
void ofstream::close();
void ifstream::close();
§ãng tÖp d÷ liÖu ®· më ®Ó ghi hoÆc ®äc d÷ liÖu.
c. C¸c hμm xö lý trªn tÖp
ifstream::get(char ch);
§äc vµo mét ký tù tõ tÖp vµ ®−a vµo char ch.
ifstream::getline(char *str,int num_bytes,char=‘\n’);
§äc c¸c ký tù vµo vïng ®Öm str cho tíi khi gÆp ký tù ph©n c¸ch
(tham sè thø 3) hoÆc ký hiÖu kÕt thóc tÖp hoÆc khi sè ký tù ®· ®−îc
®äc b»ng num_bytes-1. Ký hiÖu kÕt thóc x©u (‘\0’) ®−îc tù ®éng thªm
vµo cuèi x©u. Cã lçi khi kh«ng ký tù nµo ®−îc ®äc (fail()!=0).
char *str: x©u ký tù ®äc ®−îc tõ tÖp
int num_bytes: ®é lín cña x©u str.
char= ‘\n’: ký tù ph©n c¸ch.
ofstream::put(char ch);
Ghi vµo tÖp mét ký tù char ch.
128 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

To¸n tö <<
Ghi gi¸ trÞ mét biÕn n»m bªn ph¶i to¸n tö vµo tÖp d÷ liÖu ®· më
b»ng ofstream::open
To¸n tö >>
§äc d÷ liÖu tõ tÖp ra mét biÕn n»m bªn ph¶i to¸n tö.
ifstream::eof()
KiÓm tra cuèi tÖp d÷ liÖu
ifstream::read(char* str, int n);
ifstream::read(signed char* str, int n);
ifstream::read(unsigned char* str, int n);
§äc n ký tù tõ tÖp d÷ liÖu vµo vïng ®Öm str. Sö dông hµm thµnh
phÇn gcount() ®Ó biÕt sè ký tù thùc sù ®−îc ®äc.
ofstream outf;
ofstream:: write(const char*, int n);
ofstream:: write(const signed char*, int n);
ofstream:: write(const unsigned char*, int n);
Ghi n ký tù tõ vïng ®Öm str vµo tÖp d÷ liÖu.
5.3.2. Sö dông hÖ thèng th− viÖn vμo ra chuÈn
Khi thao t¸c víi tÖp d÷ liÖu sö dông c¸c hµm th− viÖn vµo/ra
chuÈn, ta sö dông kiÓu FILE lµ kiÓu d÷ liÖu sö dông cho viÖc thao t¸c
víi tÖp d÷ liÖu.
Ph¶i thªm dßng lÖnh #include <stdio.h> vµo ®Çu tÖp ch−¬ng tr×nh
nguån khi x©m nhËp tÖp.
a. Hμm më tÖp: fopen()
Có ph¸p:
FILE * fopen(const char *fname,const char *mode);
Ch−¬ng 5: CÊu tróc vμ vμo/ra tÖp 129

Trong ®ã:
const char *fname: tªn tÖp d÷ liÖu sÏ më.
const char *mode:
r: Më ®Ó ®äc;
w: T¹o mét tÖp ®Ó ghi d÷ liÖu (nÕu tÖp cã tªn ®· tån t¹i sÏ bÞ ghi ®Ì);
a: Më ®Ó ghi thªm vµo cuèi tÖp (t¹o míi nÕu tÖp ch−a tån t¹i);
r+: Më tÖp ®· tån t¹i ®Ó cËp nhËt (reading & writing).
w+: T¹o mét tÖp míi ®Ó cËp nhËt (reading & writing). NÕu tÖp ®·
tån t¹i sÏ bÞ ghi ®Ì.
a+: Më ®Ó cËp nhËt vµo cuèi tÖp (t¹o míi nÕu tÖp ch−a tån t¹i).
Hµm nµy tr¶ l¹i con trá tíi tÖp ®−îc më, NULL nÕu kh«ng më
®−îc tÖp.
b. Hμm ®ãng tÖp: fclose()
Có ph¸p:
int fclose(FILE *fp);
§ãng tÖp ®· ®−îc më. Tr¶ l¹i 0 nÕu thµnh c«ng, EOF nÕu cã lçi.
c. C¸c thao t¸c tÖp d÷ liÖu
§äc ký tù: fgetc()
Có ph¸p:
int fgetc(FILE *fp);
§äc mét ký tù. Tr¶ vÒ gi¸ trÞ (m· ASSCI) cña ký tù nÕu thµnh
c«ng, EOF nÕu cã lçi.
§äc x©u ký tù: fgets()
Có ph¸p:
char *fgets(char *s,int n,FILE *stream);
130 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

§äc x©u ký tù cho ®Õn khi gÆp ký tù xuèng dßng hoÆc ®· ®äc
®−îc n -1 ký tù.
Tr¶ vÒ con trá tíi x©u kÕt qu¶ s nÕu thµnh c«ng, NULL nÕu cã lçi.
§äc d÷ liÖu: fread()
Có ph¸p:
size_t fread(void *ptr,size_t size,size_t n,FILE *stream);
§äc d÷ liÖu tõ tÖp .fread ®äc n phÇn tö, mçi phÇn tö cã ®é lín size
bytes (tæng sè bytes = n*size) tõ tÖp vµo vïng nhí ®−îc x¸c ®Þnh bëi
ptr. Tæng sè byte ®äc mét lÇn lµ < 64kb.
Tr¶ vÒ sè phÇn tö thùc sù ®äc ®−îc.
Ghi ký tù vμo tÖp: fputc()
Có ph¸p:
int fputc(int c,FILE *stream);
Tr¶ vÒ c nÕu thµnh c«ng, EOF nÕu kh«ng thµnh c«ng.
Ghi x©u ký tù vμo tÖp: fputs()
Có ph¸p:
int fputs(const char *s,FILE *stream);
Ghi x©u s vµo tÖp (kh«ng ghi ký tù ‘\0’ vµ ‘\n’)
Tr¶ vÒ gi¸ trÞ >0 nÕu thµnh c«ng, EOF nÕu thÊt b¹i.
Ghi d÷ liÖu vμo tÖp: fwrite()
Có ph¸p:
size_t fwrite(const void *ptr,size_t size,size_t n,FILE *stream);
Ghi bæ sung n phÇn tö, mçi phÇn tö cã ®é lín size bytes vµo tÖp.
Tr¶ vÒ sè phÇn tö thùc sù ®−îc ghi.
Ch−¬ng 5: CÊu tróc vμ vμo/ra tÖp 131

DÞch chuyÓn con trá tÖp: fseek()


Có ph¸p:
int fseek(FILE *stream, long offset, int whence);
trong ®ã:
whence: SEEK_SET0 offset tÝnh tõ ®Çu tÖp
SEEK_CUR 1 offset tÝnh tõ vÞ trÝ hiÖn hµnh
SEEK_END 2 offset tÝnh tõ cuèi tÖp
fseek tr¶ vÒ 0 nÕu thµnh c«ng, kh¸c 0 nÕu thÊt b¹i.
XÐt vÝ dô sau:
VÝ dô 1: LËp ch−¬ng tr×nh ®äc tõ file d÷ liÖu kiÓu v¨n b¶n vµo mét
ma trËn. CÊu tróc tÖp d÷ liÖu gåm: dßng ®Çu lµ hai sè nguyªn cho biÕt
sè hµng vµ cét cña ma trËn; c¸c hµng tiÕp theo cho biÕt c¸c phÇn tö ma
trËn theo hµng. VÝ dô:
23
4.5 8.0 9
357
Ch−¬ng tr×nh nh− sau:
#include<stdio.h>
#include<iostream.h>
#include<conio.h>
#define Mmax 10
#define Nmax 20
char xau[20];
FILE *f;
int i,j,m,n;
float A[Mmax][Nmax];
void main()
{
clrscr();
132 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

printf("Cho biet ten tep:");


fflush(stdin);
gets(xau);
if (!(f=fopen(xau,"r+")))
{
puts("khong mo duoc tep!");
getch();
/*exit(1);*/
}
fscanf(f,"%d%d",&m,&n);
for (i=0; i<m; ++i)
{for (j=0;j<n;++j)
{
fscanf(f,"%f",&A[i][j]);
printf("%8.3f",A[i][j]);
}
printf("\n");
}
getch();
}

VÝ dô 2: ViÕt ch−¬ng tr×nh cho phÐp t×m mét tÖp xem cã trªn ®Üa
kh«ng b»ng c¸ch nhËp vµo tªn tÖp cÇn t×m kiÕm vµ th«ng b¸o kÕt qu¶.
#include<stdio.h>
#include<conio.h>
# include<iostream.h>
main()
{ clrscr();
FILE *f;
char duong_dan[79];
printf("\n Chuong trinh tim mot tep tren dia");
printf("\n Nhap ten tep hoac ten duong dan");
Ch−¬ng 5: CÊu tróc vμ vμo/ra tÖp 133

printf("\n Nhap ten tep can tim: ");


gets(duong_dan);
f=fopen(duong_dan,"r");
if (f==NULL)
puts("\n Tep khong co tren dia");
else
puts("\t Co tep nay tren dia");
fclose(f);
printf("\n Nhan phim bat ky de ket thuc");
getch();
}
134 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Bài tập chương 5

1. Sù kh¸c nhau gi÷a cÊu tróc vµ tr−êng?


2. Cã thÓ khai b¸o cÊu tróc vµ biÕn cÊu tróc lµ tæng thÓ hay riªng?
3. ViÕt cÊu tróc trong ch−¬ng tr×nh ®Ó l−u tr÷ b¨ng h×nh trong mét cöa
hµng. CÊu tróc ph¶i cã kh¶ n¨ng chøa tªn b¨ng, ®é dµi, gi¸ khi mua,
gi¸ cho thuª vµ ngµy th¸ng s¶n xuÊt phim trong b¨ng.
4. ViÕt ch−¬ng tr×nh nhËp c¸c d÷ liÖu cho cÊu tróc trong bµi tËp 3 vµ
hiÓn thÞ danh s¸ch b¨ng h×nh cña cöa hµng trªn mµn h×nh.
5. ViÕt ch−¬ng tr×nh l−u tr÷ danh môc ®iÖn tho¹i cña sinh viªn trong
líp, bao gåm hä vµ tªn, ®Þa chØ, sè ®iÖn tho¹i.
6. Bæ sung s¾p xÕp hä vµ tªn trong danh s¸ch ®iÖn tho¹i (vÝ dô 5) theo
thø tù abc.
7. ViÕt ch−¬ng tr×nh hiÓn thÞ tÖp autoexec.bat trong m¸y cña b¹n.
8. ViÕt ch−¬ng tr×nh hiÓn thÞ 30 byte ®Çu tiªn cña tÖp command.com
trong m¸y tÝnh.
9. ViÕt ch−¬ng tr×nh sao l−u tÖp autoexec.bat thµnh autoexec.bak vµ
tÖp config.sys thµnh config.bak trong m¸y tÝnh.
10. ViÕt ch−¬ng tr×nh l−u tr÷ danh s¸ch ®iÖn tho¹i ®−îc t¹o ra tõ vÝ dô 5.
Sau ®ã ®äc chóng ®Ó hiÓn thÞ l¹i trªn mµn h×nh.
11. ViÕt ch−¬ng tr×nh hiÓn thÞ 10 ký tù cuèi cïng cña tÖp command.com
trong m¸y tÝnh.
12. ViÕt ch−¬ng tr×nh nhËp d÷ liÖu vµ ghi vµo ®Üa mét d·y sè nguyªn bÊt
kú. S¾p xÕp d·y sè ®ã theo thø tù gi¶m dÇn råi l¹i ghi vµo ®Üa.
13. ViÕt ch−¬ng tr×nh nhËp d÷ liÖu ghi vµo ®Üa c¸c thµnh phÇn: HO,
TEN, TUOI, CHUCVU, LUONG thµnh tÖp LUONG.DAT, khi nµo
kh«ng muèn nhËp n÷a nhÊn phÝm ESC.
Ch−¬ng 5: CÊu tróc vμ vμo/ra tÖp 135

14. ViÕt ch−¬ng tr×nh liÖt kª tªn c¸c tÖp cã trong mét th− môc vµ trong
tÊt c¶ c¸c th− môc con cña nã.
15. ViÕt ch−¬ng tr×nh gåm hai chøc n¨ng:
- NhËp vµ l−u c¸c hÖ sè a, b, c cña c¸c ph−¬ng tr×nh bËc 2 vµo 1 tÖp.
- T×m nghiÖm cña c¸c ph−¬ng tr×nh bËc 2 cã hÖ sè a, b, c ®−îc l−u trong
tÖp trªn vµ l−u kÕt qu¶ vµo mét tÖp kh¸c.
136 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Chương 6 

KỸ THUẬT ĐỒ HỌA TRONG C/C++

Ngay tõ khi m¸y tÝnh ra ®êi ng−êi ta ®· sö dông ®Ó t¹o ®å häa v×


kh«ng cã s¶n phÈm cña m¸y tÝnh nμo mμ kh«ng liªn quan ®Õn ®å
häa. Trong nh÷ng thËp kû 70 vμ 80, ng−êi ta sö dông c¸ch hiÓn thÞ
®å häa cæ ®iÓn b»ng c¸c ch−¬ng tr×nh viÕt b»ng BASIC hoÆc
FORTRAN, th«ng tin hoÆc d÷ kiÖn tr«i nhanh trªn mμn h×nh råi
biÕn mÊt nªn cã nhiÒu nh−îc ®iÓm h¹n chÕ ®Õn viÖc øng dông ®å
häa. Ngμy nay do tèc ®é ph¸t triÓn nhanh cña phÇn cøng, cã nhiÒu
thiÕt bÞ chuyªn dïng cho ®å häa nªn kü thuËt ®å häa ph¸t triÓn v−ît
bËc. Ng«n ng÷ C/C++ cã nhiÒu −u thÕ vÒ ®å häa.
Néi dung ch−¬ng nμy sÏ tr×nh bμy c¸c vÊn ®Ò sau ®©y:
- Giíi thiÖu hÖ thèng ®å häa
- Nh÷ng c¬ së ®å häa cña m¸y PC
- M« h×nh ®å häa trong Turbo C/C++
- Mμn h×nh hiÓn thÞ vμ hÖ täa ®é
- ChÕ ®é mμn h×nh
- X©y dùng mét ch−¬ng tr×nh ®å häa
- Mét sè hμm ®å häa c¬ b¶n

6.1. Giíi thiÖu hÖ thèng ®å häa


Kü thuËt ®å häa lµ mét trong nh÷ng kü thuËt kh¸ phøc t¹p vµ
ng«n ng÷ C++ ®−îc sö dông trong kü thuËt ®å häa rÊt thµnh c«ng. Cã
thÓ nãi ®å häa lµ mét trong nh÷ng sù thÓ hiÖn søc m¹nh cña C++.
Ch−¬ng 6: Kü thuËt ®å häa trong C/C++ 137

H×nh ¶nh lµ s¶n phÈm cña kü thuËt ®å häa. Qu¸ tr×nh t¹o ¶nh lµ viÖc
®Æt d÷ liÖu vµo d¹ng trung gian sau ®ã hiÓn thÞ chóng trªn mµn h×nh.
C¸c thµnh phÇn c¬ b¶n (nguyªn s¬) t¹o nªn ®å häa bao gåm ®iÓm,
®−êng, ®a gi¸c, h×nh trßn, v¨n b¶n...
Mçi phÇn tö c¬ b¶n ®−îc g¾n thªm thuéc tÝnh vÏ (kiÓu vÏ, mµu vÏ,
kiÓu ch÷, kiÓu t« mµu).
Trong ch−¬ng tr×nh øng dông C++ (ch−¬ng tr×nh thÓ hiÖn b»ng
ng«n ng÷ C++) c¸c thuéc tÝnh vÏ ®−îc x¸c ®Þnh tr−íc c¸c phÇn tö sÏ
®−îc vÏ.
HÖ täa ®é vÏ trªn mµn h×nh: sö dông hÖ täa ®é §Ò-c¸c hai chiÒu,
chiÒu x t¨ng vÒ bªn ph¶i, chiÒu y t¨ng lªn trªn. Gèc täa ®é cã gi¸ trÞ
(0, 0) n»m trªn gãc trªn tr¸i mµn h×nh.
KiÓu biÕn biÓu diÔn cho täa ®é: nguyªn hoÆc dÊu ph¶y ®éng. Tuy
nhiªn trªn m¸y tÝnh biÕn nguyªn sÏ ®−îc sö dông ®Ó biÓu diÔn täa ®é
v× nh− thÕ míi ®¶m b¶o tèc ®é xö lý d÷ liÖu.

6.2. Nh÷ng c¬ së ®å häa cña m¸y PC


ThiÕt bÞ hiÓn thÞ th«ng tin ra mµn h×nh lµ thiÕt bÞ hiÓn thÞ th«ng
dông nhÊt. Trªn m¸y tÝnh IBM PC vµ c¸c m¸y t−¬ng thÝch, ®Çu ra cña
mµn h×nh phô thuéc vµo hai thµnh phÇn: thiÕt bÞ ghÐp nèi mµn h×nh
(display adapter) vµ mµn h×nh (display monitor).
Adapter: lµ vØ m¹ch c¾m trong m¸y tÝnh, trªn ®ã cã bé nhí mµn h×nh
Monitor: lµ mµn h×nh ®Ó hiÓn thÞ th«ng tin (kÕt qu¶ ra) d−íi d¹ng
v¨n b¶n hay h×nh ¶nh. Mçi mµn h×nh cã thÓ hiÓn thÞ mét m¶ng (hai
chiÒu) c¸c ®iÓm, mçi ®iÓm ®−îc gäi lµ mét pixel. §é ph©n gi¶i cña mµn
h×nh lµ sè l−îng ®iÓm theo chiÒu ngang vµ chiÒu ®øng cña mµn h×nh.
Khi m¸y tÝnh muèn hiÓn thÞ mét h×nh ¶nh, h×nh ¶nh nµy sÏ ®−îc
thÓ hiÖn trªn mét m¶ng ®iÓm vµ m¶ng ®iÓm nµy sÏ ®−îc göi tíi
monitor th«ng qua adapter. VÝ dô: khi m¸y tÝnh muèn hiÓn thÞ c¸c ký
138 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

tù, mçi ký tù ®−îc x©y dùng b»ng mét mÉu vÏ bëi c¸c pixel vµ c¸c
mÉu (ký tù) nµy sÏ ®−îc göi tíi monitor th«ng qua adapter.
Mçi lo¹i adapter cã thÓ ®−a d÷ liÖu ra theo mét hoÆc hai chÕ ®é
sau: V¨n b¶n (text) hay ®å häa (graphics).
6.2.1. C¸c lo¹i Adapter vμ Monitor
§èi víi c¸c m¸y tÝnh IBM PC
Adapter cã lo¹i chuÈn sau:
1. MDA: Monochrome Display Adapter
2. CGA: Color Graphics Adapter
3. EGA: Enhanced Graphics Adapter
4. VGA: Video Graphics Array
5. SVGA: Super VGA
Ngoµi ra cßn mét lo¹i thø s¸u: HGC (Hercules Graphics Adapter)
cã kh¶ n¨ng hiÓn thÞ chÕ ®é ®å häa trong mµn h×nh monochrome.
Monitor: Monochrome display, color display, enhanced color display.
Mèi t−¬ng quan gi÷a Adapter vμ Monitor:
MDA: cã thÓ hiÓn thÞ v¨n b¶n (text) trªn 25 dßng (rows), mçi
dßng 80 ký tù (columns) trong chÕ ®é text trªn monochrome display.
HGC: Cã thÓ hiÓn thÞ theo chÕ ®é text vµ chÕ ®é ®å häa trªn mµn
h×nh monochrome. Trong chÕ ®é ®å häa, ®é ph©n gi¶i tèi ®a 720x348.
CGA: Cã thÓ hiÓn thÞ theo chÕ ®é text vµ chÕ ®é ®å häa trªn mµn
h×nh mµu. Trong chÕ ®é text: mµu ch÷: 16, mµu nÒn: 8.
Trong chÕ ®é graphics:
- 4 mµu, ®é ph©n gi¶i: 320x200.
- 2 mµu (®en tr¾ng), ®é ph©n gi¶i: 640x200.
Ch−¬ng 6: Kü thuËt ®å häa trong C/C++ 139

EGA: Cã thÓ hiÓn thÞ theo chÕ ®é text vµ chÕ ®é ®å häa trªn mµn
h×nh mµu, bao hµm c¸c chÕ ®é cña CGA.
Trong chÕ ®é graphics: cã kh¶ n¨ng thÓ hiÖn 16 mµu víi ®é ph©n
gi¶i: 640x350.
C¸c lo¹i Adapter trong m¸y tÝnh IBM PS/2
MCGA: Multi Color Graphics Array
VGA: Video Graphics Array
- 16 mµu: 640x480
- 256 mµu: 320x200
SVGA: Super VGA
- 256 mµu, 64K mµu hay mµu thùc
- §é ph©n gi¶i cao h¬n VGA
6.2.2. LËp tr×nh cho display adapter
Bé nhí ¶nh mµn h×nh (video RAM): n»m trªn adapter ®−îc truy
cËp tíi th«ng qua ®Þa chØ nh− ®Þa chØ cña RAM. Mçi ®iÓm (pixel) trªn
mµn h×nh t−¬ng øng víi 1 hay nhiÒu bit trong bé nhí mµn h×nh.
C¸c d÷ liÖu cÇn hiÓn thÞ ra mµn h×nh sÏ ®−îc l−u tr÷ trong Video
RAM, cã mét vßng lÆp ®äc c¸c gi¸ trÞ tõ Video RAM vµ hiÓn thÞ tõng
®iÓm pixel lªn mµn h×nh. Ng−êi lËp tr×nh cã thÓ ®−a d÷ liÖu lªn mµn
h×nh b»ng c¸ch ghi d÷ liÖu trùc tiÕp vµo bé nhí mµn h×nh.
Trong chÕ ®é text: Mçi ký tù ®−îc vÏ trong mét m¶ng ®iÓm hai
chiÒu. Mçi ký tù ®−îc l−u tr÷ trong 2 bytes: 1 byte chøa m· ASCII cña
ký tù, 1 byte chøa thuéc tÝnh hiÓn thÞ cña ký tù (mµu, mµu nÒn, ®é
s¸ng ...).
Font ch÷: Mét m¶ng bé nhí chøa c¸c mÉu vÏ thÓ hiÖn cho mçi
ký tù.
140 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Trong chÕ ®é ®å häa: Sè bits ®Ó thÓ hiÖn cho mét pixel phô thuéc
vµo sè mµu ®−îc dïng ®Ó vÏ pixel.
Trong chÕ ®é B/W: 1 pixel ~ 1 bit (on/off)
Trong chÕ ®é 4 (2^2) colors: 1 pixel ~ 2 bits
Trong chÕ ®é 16 (2^4) colors: 1 pixel ~ 4 bits
Trong chÕ ®é 256 (2^8) colors: 1 pixel ~ 8 bits

6.3. M« h×nh ®å häa trong Turbo C/C++

6.3.1. Mμn h×nh hiÓn thÞ vμ hÖ täa ®é


Täa ®é mµn h×nh trong chÕ ®é Text vµ Graphics:
Trong chÕ ®é Text: Mµn h×nh ®−îc chia thµnh l−íi c¸c cells
(th«ng th−êng 25 dßng 80 cét), mçi cell sÏ hiÓn thÞ 1 ký tù.
Trong chÕ ®é Graphics: Mµn h×nh ®−îc xem nh− mét ma trËn
®iÓm hai chiÒu. KÝch cì cña ma trËn ®−îc gäi lµ ®é ph©n gi¶i, phô
thuéc vµo chÕ ®é ®å häa vµ Adapter. Täa ®é gèc cña hÖ thèng: x¸c
®Þnh ë gãc trªn bªn tr¸i.
View Port: Cöa sæ hiÓn thÞ d÷ liÖu (vïng nh×n), lµ mét h×nh ch÷
nhËt mµ c¸c d÷ liÖu ®å häa sÏ hiÓn thÞ bªn trong.
C¸c hµm trong Turbo C/C++ lµm viÖc víi täa ®é trong View Port.
6.3.2. ChÕ ®é mμn h×nh
X¸c ®Þnh chÕ ®é mµn h×nh Text hay Graphics
ChÕ ®é mµn h×nh x¸c ®Þnh sè l−îng mµu thÓ hiÖn ®−îc vµ ®é ph©n
gi¶i cña mµn h×nh trong chÕ ®é Graphics. Víi mçi lo¹i vØ ®iÒu khiÓn
mµn h×nh Borland cung cÊp tÖp ®iÒu khiÓn mµn h×nh t−¬ng øng, vÝ dô
EGAVGA.BGI cho mµn h×nh VGA, EGA...
B¶ng chÕ ®é mµn h×nh ®å häa trong Turbo C/C++ ®èi víi tõng
lo¹i Adapter nh− sau:
Ch−¬ng 6: Kü thuËt ®å häa trong C/C++ 141

Graphics Column x
graphics_modes Value Palette Pages
driver Row
CGA CGAC0 0 320 x 200 C0 1
CGAC1 1 320 x 200 C1 1
CGAC2 2 320 x 200 C2 1
CGAC3 3 320 x 200 C3 1
CGAHI 4 640 x 200 2 Color 1
MCGA MCGA0 0 320 x 200 C0 1
MCGA1 1 320 x 200 C1 1
MCGA2 2 320 x 200 C2 1
MCGA3 3 320 x 200 C3 1
MCGAMED 4 640 x 200 2 Color 1
MCGAHI 5 640 x 480 2 Color 1
EGA EGALO 0 640 x 200 16 Color 4
EGAHI 1 640 x 350 16 Color 2
EGA64 EGA64LO 0 640 x 200 16 Color 1
EGA64HI 1 640 x 350 4 Color 1
EGA-
EGAMONOHI 3 640 x 350 2 Color 1*
MONO
EGAMONOHI 3 640 x 350 2 Color 2**
HERC HERCMONOHI 0 720 x 348 2 Color 2
ATT400 ATT400C0 0 320 x 200 C0 1
ATT400C1 1 320 x 200 C1 1
ATT400C2 2 320 x 200 C2 1
ATT400C3 3 320 x 200 C3 1
ATT400MED 4 640 x 200 2 Color 1
ATT400HI 5 640 x 200 2 Color 1
VGA VGALO 0 640 x 200 16 Color 2
VGAMED 1 640 x 350 16 Color 2
VGAHI 2 640 x 480 16 Color 1
PC3270 PC3270HI 0 720 x 350 2 Color 1
IBM8514 IBM8514HI 1 1024 x 760 256 Color
IBM8514LO 0 640 x 480 256 Color

* 64K on EGAMONO card


** 256K on EGAMONO card
142 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

6.3.3. X©y dùng mét ch−¬ng tr×nh ®å häa


§Ó thùc hiÖn c¸c thao t¸c ®å häa, tÝnh to¸n kÝch th−íc ®èi t−îng
vÏ hay kiÓm tra ®é ph©n gi¶i mµn h×nh… c«ng viÖc ®Çu tiªn lµ ph¶i
khëi ®éng mµn h×nh ë chÕ ®é ®å häa.
Turbo C++ gäi khëi ®éng chÕ ®é mµn h×nh ®å häa víi hµm:
void initgraph(int far *graphdriver, int far *graphmode, char
far pathtodriver);
Hμm initgraph khëi ®éng hÖ thèng ®å häa b»ng viÖc n¹p c¸c ®iÒu
khiÓn ®å häa tõ ®Üa vµ ®Æt hÖ thèng trong chÕ ®é ®å häa. Nã khëi t¹o
l¹i vµ ®Æt l¹i tÊt c¶ c¸c tham sè ®å häa (nh− mµu, vÞ trÝ hiÖn t¹i,
viewport…) vÒ gi¸ trÞ mÆc ®Þnh cña chóng.
C¸c tham sè:
int far *graphdriver x¸c ®Þnh ®iÒu khiÓn ®å häa sÏ ®−îc sö dông.
Cã thÓ sö dông c¸c h»ng sè cña graphdriver ®−îc ®Þnh nghÜa trªn
b¶ng 1.
int far *graphmode x¸c ®Þnh chÕ ®é ®å häa.
NÕu graphmode = DETECT, hµm initgraph sÏ ®Æt graphmode ë
chÕ ®é ph©n gi¶i cao nhÊt mµ hÖ thèng cã thÓ cã. Cã thÓ ®Æt
graphmode theo c¸c h»ng sè trong b¶ng chÕ ®é mµn h×nh ®å häa trong
Turbo C/C++.
char far pathtodriver chØ ra ®−êng dÉn ®Õn th− môc BGI (Borland
Graphics Interface) cña tr×nh biªn dÞch cña Borland.
Cã thÓ kiÓm tra kÕt qu¶ cña viÖc khëi ®éng chÕ ®é ®å häa b»ng
hµm int graphresult(), hµm nµy tr¶ vÒ sè hiÖu lçi cña viÖc khëi ®éng
chÕ ®é ®å häa. Cã thÓ ®−a ra th«ng b¸o lçi b»ng viÖc gäi hµm
grapherrormsg(int) víi ®èi sè cña hµm lµ sè hiÖu lçi tr¶ l¹i.
Sau khi khëi ®éng mµn h×nh ë chÕ ®é ®å häa, ta cã thÓ thùc hiÖn
tiÕp c¸c b−íc vÏ c¸c ®èi t−îng ®å häa theo ý ®å biÓu diÔn th«ng qua
c¸c hµm ®å häa c¬ b¶n cña th− viÖn ng«n ng÷ C/C++.
Ch−¬ng 6: Kü thuËt ®å häa trong C/C++ 143

Khi kÕt thóc chÕ ®é ®å häa, ta ph¶i dïng hµm closegraph() ®Ó tr¶
vÒ c¸c ®iÒu khiÓn ®å häa vµ chuyÓn vÒ chÕ ®é v¨n b¶n nh− b×nh th−êng.
VÝ dô:
#include <graphics.h>
#include <stdio.h>
#include <process.h>
main()
{
int errorcode;
int graphdriver;
int graphmode;
graphdriver = DETECT;
initgraph(&graphdriver, &graphmode, "..");
errorcode = graphresult();
if (errorcode != grOk)
{
printf("graphics error: %s\n",grapherrormsg(errorcode));
exit(1);
}
// xen c¸c hμm vÏ ®å häa vμo ®©y
getch();
/* kÕt thóc chÕ ®é ®å häa */
closegraph();
return(0);}

6.3.4. Mét sè hμm c¬ b¶n cña th− viÖn ®å häa


Turbo C++ cung cÊp cho ng−êi lËp tr×nh mét sè l−îng rÊt phong
phó vµ kh¸ ®a d¹ng c¸c hµm th− viÖn ®å häa. Sau ®©y lµ thèng kª vµ
m« t¶ cña mét sè hµm ®å häa c¬ b¶n hay ®−îc dïng trong c¸c ch−¬ng
tr×nh ®å häa.
144 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

1. Hµm void far initgraph(int far *graphdriver,int far *graphmode,


char far pathtodriver);
ý nghÜa: Khëi ®éng mµn h×nh ë chÕ ®é ®å häa (®· m« t¶ ë
phÇn trªn)
2. Hµm void far closegraph(void);
ý nghÜa: Gi¶i phãng c¸c ®iÒu khiÓn ®å häa, ®Æt mµn h×nh trë vÒ
chÕ ®é tr−íc khi khëi ®éng chÕ ®é ®å häa.
3. Hµm void far setcolor(int color);
ý nghÜa: §Æt mµu vÏ cho bót vÏ hiÖn thêi.
Tham sè: int color: mµu bót vÏ ®−îc ®Æt, color cã gi¸ trÞ tõ 0 ®Õn
gi¸ trÞ tr¶ vÒ cña hµm getmaxcolor().
4. Hµm int far getmaxcolor()
ý nghÜa: Tr¶ vÒ sè mµu lín nhÊt mµ chÕ ®é mµn h×nh hiÖn thêi cã
thÓ thÓ hiÖn ®−îc.
5. Hµm int far getcolor(void);
ý nghÜa: Tr¶ vÒ gi¸ trÞ mµu cña bót vÏ hiÖn thêi
6. Hµm void far putpixel(int x,int y,int color);
ý nghÜa: §Æt mét pixel cã mµu color vµo ®iÓm cã täa ®é (x, y)
trªn mµn h×nh.
7. unsigned far getpixel(int x,int y);
ý nghÜa: NhËn gi¸ trÞ mµu cña mét ®iÓm cã täa ®é (x, y) trªn
mµn h×nh.
8. void far moveto(int x,int y);
ý nghÜa: §Æt bót vÏ ®Õn vÞ trÝ hiÖn thêi cã täa ®é (x, y).
9. Hµm void far lineto (int x,int y)
Ch−¬ng 6: Kü thuËt ®å häa trong C/C++ 145

ý nghÜa: VÏ mét ®o¹n th¼ng tõ vÞ trÝ hiÖn thêi ®Õn ®iÓm cã täa ®é
(x, y), víi mµu vÏ hiÖn thêi, kiÓu ®−êng vµ ®é dµy ®−êng hiÖn thêi.
NÕu kh«ng chän c¸c tham sè trªn th× gi¸ trÞ mÆc ®Þnh cña chóng sÏ lµ:
mµu bót vÏ lµ mµu tr¾ng, ®é dµy ®−êng lµ 1 pixel, kiÓu ®−êng lµ kiÓu
liÒn nÐt.
10. Hµm void far line(int x1,int y1,int x2,int y2);
ý nghÜa: VÏ mét ®o¹n th¼ng nèi hai ®iÓm cã täa ®é (x1, y1) vµ
(x2, y2) víi mµu vÏ hiÖn thêi, kiÓu ®−êng vµ ®é dµy ®−êng hiÖn thêi.
11. Hµm void far rectangle(int left,int top,int right,int bottom);
ý nghÜa: VÏ h×nh ch÷ nhËt cã täa ®é ®Ønh trªn bªn tr¸i lµ (left, top)
vµ täa ®é ®Ønh d−íi bªn ph¶i lµ (right, bottom), víi mµu vÏ hiÖn thêi,
kiÓu ®−êng vµ ®é dµy ®−êng hiÖn thêi.
12. Hµm void far circle(int x,int y,int radius)
ý nghÜa: VÏ ®−êng trßn, cã täa ®é t©m lµ (x, y) vµ b¸n kÝnh lµ
radius, víi mµu vÏ lµ mµu hiÖn thêi.
13. Hµm void far arc(int x,int y,int stangle,int endangle,int radius);
ý nghÜa: VÏ cung trßn.
(int x, int y): täa ®é t©m cung trßn
int stangle: ®é lín gãc b¾t ®Çu tÝnh theo ®é (tÝnh tõ phÝa ph¶i trôc
n»m ngang)
int endangle: ®é lín gãc kÕt thóc tÝnh theo ®é (tÝnh tõ phÝa ph¶i
trôc n»m ngang)
int radius: ®é lín b¸n kÝnh cung trßn.
14. Hµm void far ellipse(int x,int y,int stangle,int endangle, int
xradius,int yradius)
ý nghÜa: VÏ cung ellipse víi mµu cña bót vÏ hiÖn thêi.
(int x, int y) täa ®é t©m h×nh ellipse
146 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

int stangle: ®é lín gãc b¾t ®Çu tÝnh theo ®é (tÝnh tõ phÝa ph¶i trôc
n»m ngang)
int endangle: ®é lín gãc kÕt thóc tÝnh theo ®é (tÝnh tõ phÝa ph¶i
trôc n»m ngang)
int xradius: ®é lín b¸n kÝnh theo trôc x.
int yradius: ®é lín b¸n kÝnh theo trôc y.
15. Hµm void far fillellipse(int x,int y,int xradius,int yradius);
ý nghÜa: VÏ h×nh ellipse vµ t« mµu h×nh ellipse theo mµu vµ kiÓu
t« hiÖn thêi.
(int x, int y) täa ®é t©m h×nh ellipse
int xradius: ®é lín b¸n kÝnh theo trôc x.
int yradius: ®é lín b¸n kÝnh theo trôc y.
16. Hµm int far getmaxx(void);
ý nghÜa: Tr¶ vÒ gi¸ trÞ sè pixel cña mµn h×nh theo chiÒu n»m
ngang, trong chÕ ®é ®iÒu khiÓn ®å häa hiÖn thêi.
17. int far getmaxy(void);
ý nghÜa: Tr¶ vÒ gi¸ trÞ sè pixel cña mµn h×nh theo chiÒu th¼ng
®øng, trong chÕ ®é ®iÒu khiÓn ®å häa hiÖn thêi.
18. void far outtextxy(int x,int y,char far *textString);
ý nghÜa: HiÓn thÞ x©u ký tù textString trong khung nh×n ë vÞ trÝ täa
®é (int x, int y).

6.4. VÝ dô vÒ vÏ ®å häa
ViÕt ch−¬ng tr×nh vÏ hµm sè y = f(x), víi y1 = sinx vµ y2 = sinx/x.
§Ó vÏ ®å thÞ y = f(x) ta cÇn ph¶i biÕt c¸c gi¸ trÞ x vµ t−¬ng øng víi
nã lµ gi¸ trÞ y tøc lµ d·y sè x, y. Ta sÏ sö dông hµm putpixel(x,y,mµu)
®Ó chÊm c¸c ®iÓm (x,y) ®ã.
Ch−¬ng 6: Kü thuËt ®å häa trong C/C++ 147

Ch−¬ng tr×nh nh− sau:


#include<stdlib.h>
#include<conio.h>
#include<math.h>
#include<graphics.h>
#define pi 3.14159255
#define TileX 20
#define TileY 100
int i,x,y; float t;
int KhoiTaoDoHoa(void);
void main()
{
KhoiTaoDoHoa();
setbkcolor(CYAN);
setviewport(0,getmaxy()/2,getmaxx(),getmaxy(),0);
setcolor(LIGHTRED);
outtextxy(getmaxx()/2,10,"(0,0)");
setcolor(RED);
moveto(getmaxx()/2-5,10);
linerel(0,-(getmaxy()/2-20));
outtextxy((getmaxx()/2-5),-(getmaxy()/2-20),"y");
moveto(getmaxx()/2-5,10);
linerel(0,getmaxy()/2-60);
moveto(0,0);
linerel(getmaxx()-10,0);
outtextxy(getmaxx()-10,0,"x");
setcolor(BLUE);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,3);
outtextxy(200,200,"VE DO THI HAM SO Y=F(x)");
for (i=1; i<=2000; i++) / *Ham y=sin(x)* /
{
x=(int)(2*pi*i*TileX/400);
148 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

y=-(int)(sin((2*i*pi)/400)*TileY);
putpixel(x,y,YELLOW);
}
getch();
for (i=1;i<=2000;i++) /*Ham y=sin(x)/x */
{
t=pi*i;
x=(int)(t*TileX/400+320);
y=-(int)(2*sin((t)/400)*TileY/t*200);
putpixel(x,y,WHITE);
}
getch();
closegraph();
return;
}
int KhoiTaoDoHoa(void)
{
int graphdriver=DETECT, graphmode,error_code;
initgraph(&graphdriver,&graphmode,"..\\bgi");
error_code=graphresult();
if (error_code!=grOk)
return(-1);
if((graphdriver!=EGA)&&(graphdriver!=VGA))
{
closegraph();
return 0;
}
return(1); }
Ch−¬ng 6: Kü thuËt ®å häa trong C/C++ 149

Bài tập chương 6

1. ViÕt ch−¬ng tr×nh vÏ ®o¹n th¼ng tõ täa ®é (20, 20) ®Õn (400, 300)
trong mµn h×nh ®å häa 640x480x16mµu.
2. ViÕt ch−¬ng tr×nh hiÓn thÞ kÝch th−íc cña mµn h×nh ®å häa hiÖn
hµnh. (Gîi ý: sö dông hµm getmaxx() vµ getmaxy()).
3. ViÕt ch−¬ng tr×nh vÏ ®−êng trßn t©m (200, 150) b¸n kÝnh 50 víi
®−êng nÐt ®øt.
4. ViÕt ch−¬ng tr×nh vÏ h×nh ch÷ nhËt víi ®é réng nÐt lµ 3 ®iÓm ¶nh vµ
t« mµu ®á.
5. ViÕt ch−¬ng tr×nh hiÓn thÞ x©u ký tù “HVAN” víi ph«ng kh«ng
ch©n, kÝch th−íc 24.
6. ViÕt ch−¬ng tr×nh hiÓn thÞ x©u ký tù “Ng«n ng÷ lËp tr×nh C/C++”
theo h−íng th¼ng ®øng.
7. ViÕt ch−¬ng tr×nh vÏ ®å thÞ hµm sè y = sin(x).
8. ViÕt ch−¬ng tr×nh vÏ ®a gi¸c ®Òu n c¹nh víi n nhËp vµo tõ bµn phÝm.
9. VÏ mét ®−êng trßn mµu ®á trªn mµn h×nh mµu xanh. Täa ®é (x, y)
cña ®iÓm gieo ®−îc nhËp vµo, tïy thuéc gi¸ trÞ cô thÓ cña x,y mµ
ch−¬ng tr×nh sÏ t« mµu vµng cho h×nh trßn hoÆc phÇn mµn h×nh bªn
ngoµi h×nh trßn.
150 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Chương 7 

GIỚI THIỆU LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Néi dung ch−¬ng nμy sÏ tr×nh bμy c¸c vÊn ®Ò sau ®©y:
- Giíi thiÖu lËp tr×nh h−íng ®èi t−îng
- Líp vμ c¸c thμnh phÇn cña líp
- CÊp ph¸t bé nhí ®éng - c¸c thμnh phÇn tÜnh - friend
- Thõa kÕ vμ ®a h×nh
- N¹p chång to¸n tö vμ c¸c hμm chuyÓn ®æi
- C¸c hμm mÉu (template)

7.1. Kh¸i niÖm vÒ lËp tr×nh h−íng ®èi t−îng (OOP)


LËp tr×nh h−íng ®èi t−îng OOP (Object - Oriented Programming)
lµ mét ph−¬ng ph¸p míi trªn b−íc ®−êng tiÕn hãa cña lËp tr×nh m¸y
tÝnh, nh»m lµm cho ch−¬ng tr×nh trë nªn linh ho¹t, tin cËy vµ dÔ ph¸t
triÓn. Kü thuËt OOP kh«ng theo c¸ch lËp tr×nh cæ ®iÓn, thñ tôc tõ trªn
xuèng (top - down procedureal) mµ ph©n tÝch bµi to¸n thµnh c¸c thùc
thÓ gäi lµ ®èi t−îng, sau ®ã x©y dùng c¸c hµm xung quanh ®èi t−îng.
§Ó hiÓu ®−îc OOP chóng ta h·y xem xÐt lÞch sö cña qu¸ tr×nh lËp tr×nh.
7.1.1. LËp tr×nh tuyÕn tÝnh
M¸y tÝnh ®Çu tiªn ®−îc lËp tr×nh b»ng m· nhÞ ph©n, sö dông c¸c
c«ng t¾c c¬ khÝ ®Ó n¹p ch−¬ng tr×nh. Cïng víi sù xuÊt hiÖn cña c¸c
thiÕt bÞ l−u tr÷ lín vµ bé nhí m¸y tÝnh cã dung l−îng lín nªn c¸c
ng«n ng÷ lËp tr×nh cÊp cao ®Çu tiªn ®−îc ®−a vµo sö dông. Thay v×
ph¶i suy nghÜ trªn mét d·y c¸c bit vµ byte, lËp tr×nh viªn cã thÓ viÕt
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 151

mét lo¹t lÖnh gÇn víi tiÕng Anh vµ sau ®ã ch−¬ng tr×nh dÞch thµnh
ng«n ng÷ m¸y.
C¸c ng«n ng÷ lËp tr×nh cÊp cao ®Çu tiªn ®−îc thiÕt kÕ ®Ó lËp c¸c
ch−¬ng tr×nh lµm c¸c c«ng viÖc t−¬ng ®èi ®¬n gi¶n nh− tÝnh to¸n. C¸c
ch−¬ng tr×nh ban ®Çu chñ yÕu liªn quan ®Õn tÝnh to¸n vµ kh«ng ®ßi hái
g× nhiÒu ë ng«n ng÷ lËp tr×nh. H¬n n÷a, phÇn lín c¸c ch−¬ng tr×nh nµy
t−¬ng ®èi ng¾n, th−êng Ýt h¬n 100 dßng.
Khi kh¶ n¨ng cña m¸y tÝnh t¨ng lªn th× kh¶ n¨ng ®Ó triÓn khai c¸c
ch−¬ng tr×nh phøc t¹p còng t¨ng lªn. C¸c ng«n ng÷ lËp tr×nh tr−íc ®©y
kh«ng cßn thÝch hîp ®èi víi viÖc lËp tr×nh ®ßi hái cao h¬n.
Chóng ta biÕt r»ng, mét ®o¹n lÖnh th−êng ®−îc chÐp lÆp l¹i mçi
khi chóng ta dïng trong nhiÒu ch−¬ng tr×nh nªn ch−¬ng tr×nh cµng dµi
dßng, logic cña ch−¬ng tr×nh cµng khã hiÓu. Trong lËp tr×nh tuyÕn tÝnh
kh«ng cã c¸c ph−¬ng tiÖn cÇn thiÕt ®Ó sö dông l¹i c¸c phÇn m· ch−¬ng
tr×nh ®· viÕt.
Ngoµi ra, ch−¬ng tr×nh ®−îc ®iÒu khiÓn ®Ó nh¶y ®Õn nhiÒu chç mµ
th−êng kh«ng cã sù gi¶i thÝch râ rµng. Lµm thÕ nµo ®Ó ch−¬ng tr×nh
®Õn ®−îc chç cÇn thiÕt hoÆc t¹i sao nh− vËy?
Ng«n ng÷ lËp tr×nh tuyÕn tÝnh kh«ng cã kh¶ n¨ng kiÓm so¸t ph¹m
vi nh×n thÊy cña c¸c d÷ liÖu. Mäi d÷ liÖu trong ch−¬ng tr×nh ®Òu lµ d÷
liÖu toµn côc, nghÜa lµ chóng cã thÓ bÞ söa ®æi ë bÊt kú phÇn nµo cña
ch−¬ng tr×nh. ViÖc dß t×m c¸c thay ®æi kh«ng mong muèn ®ã cña c¸c
phÇn tö d÷ liÖu trong mét d·y m· lÖnh dµi vµ vßng vÌo ®· tõng lµm
cho c¸c lËp tr×nh viªn mÊt rÊt nhiÒu thêi gian.
7.1.2. LËp tr×nh cÊu tróc
Râ rµng lµ c¸c ng«n ng÷ míi víi c¸c tÝnh n¨ng míi cÇn ph¶i ®−îc
ph¸t triÓn ®Ó cã thÓ t¹o ra c¸c øng dông tinh vi h¬n. Vµo thËp kû 60 vµ
70 cña thÕ kû XX, ng«n ng÷ lËp tr×nh cã cÊu tróc ra ®êi. C¸c ch−¬ng
tr×nh cã cÊu tróc ®−îc tæ chøc theo c¸c c«ng viÖc mµ chóng thùc hiÖn.
152 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

VÒ b¶n chÊt, ch−¬ng tr×nh ®−îc chia thµnh c¸c ch−¬ng tr×nh con
riªng rÏ (cßn gäi lµ hµm hay thñ tôc) thùc hiÖn c¸c c«ng viÖc rêi r¹c
trong qu¸ tr×nh lín h¬n, phøc t¹p h¬n. C¸c hµm nµy ®−îc gi÷ cµng ®éc
lËp víi nhau cµng nhiÒu cµng tèt, mçi hµm cã d÷ liÖu vµ logic riªng.
Th«ng tin ®−îc chuyÓn giao gi÷a c¸c hµm th«ng qua tham sè, c¸c hµm
cã thÓ cã c¸c biÕn côc bé mµ c¸c ®èi t−îng bªn ngoµi ph¹m vi cña
hµm kh«ng thÓ truy xuÊt ®−îc. Nh− vËy, c¸c hµm cã thÓ ®−îc xem lµ
c¸c ch−¬ng tr×nh con ®−îc ®Æt chung víi nhau ®Ó x©y dùng nªn mét
øng dông.
Môc tiªu lµ lµm sao cho viÖc triÓn khai c¸c phÇn mÒm dÔ dµng
h¬n ®èi víi c¸c lËp tr×nh viªn mµ vÉn c¶i thiÖn ®−îc tÝnh tin cËy vµ dÔ
b¶o qu¶n ch−¬ng tr×nh. Mét ch−¬ng tr×nh cã cÊu tróc ®−îc h×nh thµnh
b»ng c¸ch "bÎ g·y" c¸c m¶nh nhá mµ sau ®ã trë thµnh c¸c hµm. B»ng
c¸ch "c« lËp" c¸c c«ng viÖc vµo trong c¸c hµm, ch−¬ng tr×nh cã cÊu
tróc cã thÓ lµm gi¶m kh¶ n¨ng cña mét hµm nµy ¶nh h−ëng ®Õn mét
hµm kh¸c. ViÖc nµy còng lµm cho viÖc ph©n t¸ch c¸c vÊn ®Ò trë nªn dÔ
dµng h¬n. Sù gãi gän nµy cho phÐp chóng ta cã thÓ viÕt c¸c ch−¬ng
tr×nh s¸ng sña h¬n vµ gi÷ ®−îc ®iÒu khiÓn trªn tõng hµm. C¸c biÕn
toµn côc kh«ng cßn n÷a vµ ®−îc thay thÕ b»ng c¸c tham sè vµ c¸c biÕn
côc bé cã ph¹m vi nhá h¬n vµ dÔ kiÓm so¸t h¬n. C¸ch tæ chøc tèt h¬n
nµy nãi lªn r»ng chóng ta cã kh¶ n¨ng qu¶n lý logic cña cÊu tróc
ch−¬ng tr×nh, lµm cho viÖc triÓn khai vµ b¶o d−ìng ch−¬ng tr×nh nhanh
h¬n, h÷u hiÖu h¬n vµ hiÖu qu¶ h¬n.
Mét kh¸i niÖm lín ®· ®−îc ®Æt ra trong lËp tr×nh cã cÊu tróc lµ sù
trõu t−îng hãa (Abstraction). Sù trõu t−îng hãa cã thÓ xem nh− kh¶
n¨ng quan s¸t mét sù viÖc mµ kh«ng cÇn xem xÐt ®Õn c¸c chi tiÕt bªn
trong cña nã. Trong mét ch−¬ng tr×nh cã cÊu tróc, chóng ta chØ cÇn
biÕt mét hµm ®· cho cã thÓ lµm ®−îc mét c«ng viÖc cô thÓ g× lµ ®ñ.
Cßn lµm thÕ nµo mµ c«ng viÖc ®ã l¹i thùc hiÖn ®−îc lµ kh«ng quan
träng, chõng nµo hµm cßn tin cËy ®−îc th× cßn cã thÓ dïng nã mµ
kh«ng cÇn ph¶i biÕt nã thùc hiÖn ®óng chøc n¨ng cña m×nh nh− thÕ
nµo. §iÒu nµy gäi lµ sù trõu t−îng hãa theo chøc n¨ng (Funtional
Abstraction) vµ lµ nÒn t¶ng cña lËp tr×nh cã cÊu tróc.
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 153

Tuy nhiªn lËp tr×nh cÊu tróc cã nh÷ng ®iÓm yÕu nhÊt ®Þnh. Khi ®é
phøc t¹p cña mét ch−¬ng tr×nh t¨ng lªn, sù phô thuéc cña ch−¬ng tr×nh
vµo c¸c kiÓu d÷ liÖu c¬ b¶n mµ nã xö lý còng t¨ng theo. VÊn ®Ò trë
nªn râ rµng lµ cÊu tróc d÷ liÖu trong ch−¬ng tr×nh quan träng ch¼ng
kÐm g× c¸c phÐp to¸n thùc hiÖn trªn chóng nhÊt lµ khi kÝch th−íc cña
ch−¬ng tr×nh cµng t¨ng.
C¸c kiÓu d÷ liÖu ®−îc xö lý trong nhiÒu hµm kh¸c nhau bªn trong
mét ch−¬ng tr×nh cã cÊu tróc nªn khi cã sù thay ®æi trong c¸c d÷ liÖu
nµy th× còng cÇn ph¶i thùc hiÖn c¶ c¸c thay ®æi ë mäi n¬i cã thao t¸c
t¸c ®éng trªn chóng. §©y cã thÓ lµ mét c«ng viÖc tèn thêi gian vµ kÐm
hiÖu qu¶ ®èi víi c¸c ch−¬ng tr×nh cã hµng ngµn dßng lÖnh vµ hµng
tr¨m hµm trë lªn.
Mét yÕu ®iÓm n÷a cña viÖc lËp tr×nh cã cÊu tróc lµ khi cã nhiÒu
lËp tr×nh viªn lµm viÖc theo nhãm cïng mét øng dông nµo ®ã. Trong
mét ch−¬ng tr×nh cã cÊu tróc, c¸c lËp tr×nh viªn ®−îc ph©n c«ng viÕt
mét tËp hîp c¸c hµm vµ c¸c kiÓu d÷ liÖu. V× cã nhiÒu lËp tr×nh viªn
kh¸c nhau qu¶n lý c¸c hµm riªng, cã liªn quan ®Õn c¸c kiÓu d÷ liÖu
dïng chung nªn c¸c thay ®æi mµ lËp tr×nh viªn t¹o ra trªn mét phÇn tö
d÷ liÖu sÏ lµm ¶nh h−ëng ®Õn c«ng viÖc cña tÊt c¶ c¸c ng−êi cßn l¹i
trong nhãm.
7.1.3. Sù trõu t−îng hãa d÷ liÖu
Sù trõu t−îng hãa d÷ liÖu (Data abstraction) t¸c ®éng trªn c¸c d÷
liÖu còng t−¬ng tù nh− sù trõu t−îng hãa theo chøc n¨ng. Khi cã trõu
t−îng hãa d÷ liÖu, c¸c cÊu tróc d÷ liÖu vµ c¸c phÇn tö cã thÓ ®−îc sö
dông mµ kh«ng cÇn bËn t©m ®Õn c¸c chi tiÕt cô thÓ. Ch¼ng h¹n nh−
c¸c sè dÊu chÊm ®éng ®· ®−îc trõu t−îng hãa trong tÊt c¶ c¸c ng«n
ng÷ lËp tr×nh, chóng ta kh«ng cÇn quan t©m ®Õn c¸ch biÓu diÔn nhÞ
ph©n chÝnh x¸c nµo cho sè dÊu chÊm ®éng khi g¸n mét gi¸ trÞ, còng
kh«ng cÇn biÕt tÝnh bÊt th−êng cña phÐp nh©n nhÞ ph©n khi nh©n c¸c
gi¸ trÞ dÊu chÊm ®éng. §iÒu quan träng lµ c¸c sè dÊu chÊm ®éng ho¹t
®éng ®óng ®¾n vµ hiÓu ®−îc.
154 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Sù trõu t−îng hãa d÷ liÖu gióp chóng ta kh«ng ph¶i bËn t©m vÒ
c¸c chi tiÕt kh«ng cÇn thiÕt. NÕu lËp tr×nh viªn ph¶i hiÓu biÕt vÒ tÊt c¶
c¸c khÝa c¹nh cña vÊn ®Ò ë mäi lóc vµ vÒ tÊt c¶ c¸c hµm cña ch−¬ng
tr×nh th× chØ Ýt hµm míi ®−îc viÕt ra. Nh−ng sù trõu t−îng hãa theo d÷
liÖu ®· tån t¹i s½n trong mäi ng«n ng÷ lËp tr×nh ®èi víi c¸c d÷ liÖu
phøc t¹p nh− sè dÊu chÊm ®éng. Tuy nhiªn chØ míi gÇn ®©y, ng−êi ta
míi ph¸t triÓn c¸c ng«n ng÷ cho phÐp chóng ta ®Þnh nghÜa c¸c kiÓu d÷
liÖu trõu t−îng riªng.
7.1.4. LËp tr×nh h−íng ®èi t−îng
Kh¸i niÖm h−íng ®èi t−îng ®−îc x©y dùng trªn nÒn t¶ng cña kh¸i
niÖm lËp tr×nh cã cÊu tróc vµ sù trõu t−îng hãa d÷ liÖu. Sù thay ®æi c¨n
b¶n ë chç, mét ch−¬ng tr×nh h−íng ®èi t−îng ®−îc thiÕt kÕ xoay
quanh d÷ liÖu mµ chóng ta lµm viÖc trªn ®ã h¬n lµ b¶n th©n chøc n¨ng
cña ch−¬ng tr×nh. §iÒu nµy lµ hoµn toµn tù nhiªn khi chóng ta hiÓu
r»ng môc tiªu cña ch−¬ng tr×nh lµ xö lý d÷ liÖu. Suy cho cïng, mäi
viÖc mµ m¸y tÝnh thùc hiÖn vÉn th−êng ®−îc gäi lµ xö lý d÷ liÖu. D÷
liÖu vµ thao t¸c liªn kÕt víi nhau ë møc c¬ b¶n (cßn cã thÓ gäi lµ møc
thÊp nhÊt), mçi thø ®Òu ®ßi hái ë thø kia cã môc tiªu cô thÓ, c¸c
ch−¬ng tr×nh h−íng ®èi t−îng lµm t−êng minh mèi quan hÖ nµy.
LËp tr×nh h−íng ®èi t−îng liªn kÕt cÊu tróc d÷ liÖu víi c¸c thao
t¸c, theo c¸ch mµ tÊt c¶ th−êng nghÜ vÒ thÕ giíi quanh m×nh. Chóng ta
th−êng g¾n mét sè c¸c ho¹t ®éng cô thÓ víi mét lo¹i ho¹t ®éng nµo ®ã
vµ ®Æt c¸c gi¶ thiÕt cña m×nh trªn c¸c quan hÖ ®ã.
VÝ dô 1: Chóng ta biÕt r»ng mét chiÕc xe cã c¸c b¸nh xe, di
chuyÓn ®−îc vµ cã thÓ ®æi h−íng cña nã b»ng c¸ch quÑo tay l¸i.
T−¬ng tù nh− thÕ, mét c¸i c©y lµ mét lo¹i thùc vËt cã th©n, gç vµ l¸.
Mét chiÕc xe kh«ng ph¶i lµ mét c¸i c©y, mµ c¸i c©y kh«ng ph¶i lµ mét
chiÕc xe vµ chóng ta cã thÓ gi¶ thiÕt r»ng c¸i mµ chóng ta lµm ®−îc víi
mét chiÕc xe th× kh«ng thÓ lµm ®−îc víi mét c¸i c©y. Ch¼ng h¹n, thËt
lµ v« nghÜa khi muèn l¸i mét c¸i c©y, cßn chiÕc xe th× l¹i ch¼ng lín
thªm ®−îc khi chóng ta t−íi n−íc cho nã.
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 155

LËp tr×nh h−íng ®èi t−îng cho phÐp chóng ta sö dông c¸c qu¸
tr×nh suy nghÜ nh− vËy víi c¸c kh¸i niÖm trõu t−îng ®−îc sö dông
trong m¸y tÝnh. Mét mÉu tin (record) nh©n sù cã thÓ ®−îc ®äc ra, thay
®æi vµ l−u tr÷ l¹i; cßn sè phøc th× cã thÓ ®−îc dïng trong c¸c tÝnh to¸n.
Tuy vËy, kh«ng thÓ nµo l¹i viÕt mét sè phøc vµo tËp tin lµm mÉu tin
nh©n sù vµ ng−îc l¹i hai mÉu tin nh©n sù l¹i kh«ng thÓ céng víi nhau
®−îc. Mét ch−¬ng tr×nh h−íng ®èi t−îng sÏ x¸c ®Þnh ®Æc ®iÓm vµ hµnh
vi cô thÓ cña c¸c kiÓu d÷ liÖu, ®iÒu ®ã cho phÐp chóng ta biÕt mét c¸ch
chÝnh x¸c r»ng chóng ta cã thÓ cã ®−îc nh÷ng g× ë c¸c kiÓu d÷ liÖu
kh¸c nhau.
Chóng ta cßn cã thÓ t¹o ra c¸c quan hÖ gi÷a c¸c kiÓu d÷ liÖu t−¬ng
tù nh−ng kh¸c nhau trong mét ch−¬ng tr×nh h−íng ®èi t−îng. Ng−êi ta
th−êng tù nhiªn ph©n lo¹i ra mäi thø, th−êng ®Æt mèi liªn hÖ gi÷a c¸c
kh¸i niÖm míi víi c¸c kh¸i niÖm ®· cã vµ th−êng cã thÓ thùc hiÖn suy
diÔn gi÷a chóng trªn c¸c quan hÖ ®ã. Chóng ta cã thÓ quan niÖm thÕ
giíi theo cÊu tróc c©y, víi c¸c møc x©y dùng chi tiÕt h¬n kÕ tiÕp nhau
cho c¸c thÕ hÖ sau so víi c¸c thÕ hÖ tr−íc. §©y lµ ph−¬ng ph¸p hiÖu
qu¶ ®Ó tæ chøc thÕ giíi quanh chóng ta. C¸c ch−¬ng tr×nh h−íng ®èi
t−îng còng lµm viÖc theo mét ph−¬ng thøc t−¬ng tù, trong ®ã chóng
cho phÐp x©y dùng c¸c c¬ cÊu d÷ liÖu vµ thao t¸c míi dùa trªn c¸c c¬
cÊu cã s½n, mang theo c¸c tÝnh n¨ng cña c¸c c¬ cÊu nÒn mµ chóng dùa
trªn ®ã, trong khi vÉn thªm vµo c¸c tÝnh n¨ng míi.
LËp tr×nh h−íng ®èi t−îng cho phÐp chóng ta tæ chøc d÷ liÖu trong
ch−¬ng tr×nh theo mét c¸ch t−¬ng tù nh− c¸c nhµ sinh häc tæ chøc c¸c
lo¹i thùc vËt kh¸c nhau. Theo c¸ch nãi lËp tr×nh ®èi t−îng: xe h¬i, c©y
cèi, c¸c sè phøc, c¸c quyÓn s¸ch ®Òu ®−îc gäi lµ c¸c líp (Class).
Mét líp lµ mét b¶n mÉu m« t¶ c¸c th«ng tin cÊu tróc d÷ liÖu, lÉn
c¸c thao t¸c hîp lÖ cña c¸c phÇn tö d÷ liÖu. Khi mét phÇn tö d÷ liÖu
®−îc khai b¸o lµ mét phÇn tö cña mét líp th× nã ®−îc gäi lµ mét ®èi
t−îng (Object). C¸c hµm ®−îc ®Þnh nghÜa hîp lÖ trong mét líp ®−îc
gäi lµ c¸c ph−¬ng thøc (Method) vµ chóng lµ c¸c hµm duy nhÊt cã thÓ
156 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

xö lý d÷ liÖu cña c¸c ®èi t−îng cña líp ®ã. Mét thùc thÓ (Instance) lµ
mét vËt thÓ cã thùc bªn trong bé nhí, thùc chÊt ®ã lµ mét ®èi t−îng
®−îc cÊp ph¸t vïng nhí.
Mçi mét ®èi t−îng cã riªng cho m×nh mét b¶n sao c¸c phÇn tö d÷
liÖu cña líp cßn gäi lµ c¸c biÕn thùc thÓ (Instance variable). C¸c
ph−¬ng thøc ®Þnh nghÜa trong mét líp cã thÓ ®−îc gäi bëi c¸c ®èi
t−îng cña líp ®ã. §iÒu nµy ®−îc gäi lµ göi mét th«ng ®iÖp (Message)
cho ®èi t−îng. C¸c th«ng ®iÖp nµy phô thuéc vµo ®èi t−îng, chØ ®èi
t−îng nµo nhËn th«ng ®iÖp míi ph¶i lµm viÖc theo th«ng ®iÖp ®ã. C¸c
®èi t−îng ®Òu ®éc lËp víi nhau v× vËy c¸c thay ®æi trªn c¸c biÕn thÓ
hiÖn cña ®èi t−îng nµy kh«ng ¶nh h−ëng g× trªn c¸c biÕn thÓ hiÖn cña
c¸c ®èi t−îng kh¸c vµ viÖc göi th«ng ®iÖp cho ®èi t−îng nµy kh«ng
¶nh h−ëng g× ®Õn c¸c ®èi t−îng kh¸c.

7.2. Mét sè kh¸i niÖm míi trong lËp tr×nh h−íng ®èi t−îng
Trong lËp tr×nh h−íng ®èi t−îng, c¸c kh¸i niÖm nh− sù ®ãng gãi,
tÝnh kÕ thõa vµ tÝnh ®a h×nh lµ c¸c kh¸i niÖm c¨n b¶n, lµ nÒn t¶ng t−
t−ëng cña nã. HiÓu ®−îc kh¸i niÖm nµy, chóng ta b−íc ®Çu tiÕp cËn
víi phong c¸ch lËp tr×nh míi, phong c¸ch lËp tr×nh dùa vµo ®èi t−îng
lµm nÒn t¶ng mµ trong ®ã quan ®iÓm che dÊu th«ng tin th«ng qua sù
®ãng gãi lµ quan ®iÓm trung t©m cña vÊn ®Ò.
7.2.1. Sù ®ãng gãi (Encapsulation)
Sù ®ãng gãi lµ c¬ chÕ rµng buéc d÷ liÖu vµ thao t¸c trªn d÷ liÖu ®ã
thµnh mét thÓ thèng nhÊt, tr¸nh ®−îc c¸c t¸c ®éng bÊt ngê tõ bªn
ngoµi. ThÓ thèng nhÊt nµy gäi lµ ®èi t−îng.
Trong mét ®èi t−îng, d÷ liÖu hay thao t¸c hay c¶ hai cã thÓ lµ
riªng (private) hoÆc chung (public) cña ®èi t−îng ®ã.
Thao t¸c hay d÷ liÖu riªng lµ thuéc vÒ ®èi t−îng chØ ®−îc truy cËp
bëi c¸c thµnh phÇn cña ®èi t−îng, ®iÒu nµy nghÜa lµ thao t¸c hay d÷
liÖu kh«ng thÓ truy cËp bëi c¸c phÇn kh¸c cña ch−¬ng tr×nh tån t¹i
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 157

ngoµi ®èi t−îng. Khi thao t¸c hay d÷ liÖu chung, c¸c phÇn kh¸c cña
ch−¬ng tr×nh cã thÓ truy cËp nã mÆc dï nã ®−îc ®Þnh nghÜa trong mét
®èi t−îng. C¸c thµnh phÇn chung cña mét ®èi t−îng dïng ®Ó cung cÊp
mét giao diÖn cã ®iÒu khiÓn cho c¸c thµnh phÇn riªng cña ®èi t−îng.
C¬ chÕ ®ãng gãi lµ ph−¬ng thøc tèt ®Ó thùc hiÖn c¬ chÕ che dÊu
th«ng tin so víi c¸c ng«n ng÷ lËp tr×nh cÊu tróc.
7.2.2. TÝnh kÕ thõa (Inheritance)
Chóng ta cã thÓ x©y dùng c¸c líp míi tõ c¸c líp cò th«ng qua sù
kÕ thõa. Mét líp míi cßn ®−îc gäi lµ líp dÉn xuÊt (derived class) cã
thÓ thõa h−ëng d÷ liÖu vµ c¸c ph−¬ng thøc cña líp c¬ së (base class)
ban ®Çu. Trong líp nµy, cã thÓ bæ sung c¸c thµnh phÇn d÷ liÖu vµ c¸c
ph−¬ng thøc míi vµo nh÷ng thµnh phÇn d÷ liÖu vµ c¸c ph−¬ng thøc mµ
nã thõa h−ëng tõ líp c¬ së. Mçi líp (kÓ c¶ líp dÉn xuÊt) cã thÓ cã mét
sè l−îng bÊt kú c¸c líp dÉn xuÊt. Qua c¬ cÊu kÕ thõa nµy, d¹ng h×nh
c©y cña c¸c líp ®−îc h×nh thµnh. D¹ng c©y cña c¸c líp tr«ng gièng
nh− c©y gia ph¶ v× thÕ c¸c líp c¬ së cßn ®−îc gäi lµ líp cha (parent
class) vµ c¸c líp dÉn xuÊt ®−îc gäi lµ líp con (child class).
VÝ dô: Chóng ta sÏ x©y dùng mét tËp c¸c líp m« t¶ cho th− viÖn
c¸c Ên phÈm. Cã hai kiÓu Ên phÈm: t¹p chÝ vµ s¸ch. Chóng ta cã thÓ t¹o
ra mét Ên phÈm tæng qu¸t b»ng c¸ch ®Þnh nghÜa c¸c thµnh phÇn d÷ liÖu
t−¬ng øng víi sè trang, m· sè tra cøu, ngµy th¸ng xuÊt b¶n, b¶n quyÒn
vµ nhµ xuÊt b¶n. C¸c Ên phÈm cã thÓ ®−îc lÊy ra, cÊt ®i vµ ®äc. §ã lµ
c¸c ph−¬ng thøc thùc hiÖn trªn mét Ên phÈm. TiÕp ®ã, chóng ta ®Þnh
nghÜa hai líp dÉn xuÊt tªn lµ t¹p chÝ vµ s¸ch. T¹p chÝ cã tªn, sè ký ph¸t
hµnh vµ chøa nhiÒu bµi cña c¸c t¸c gi¶ kh¸c nhau. C¸c thµnh phÇn d÷
liÖu t−¬ng øng víi c¸c yÕu tè nµy ®−îc ®Æt vµo ®Þnh nghÜa cña líp t¹p
chÝ. T¹p chÝ còng cÇn cã mét ph−¬ng thøc n÷a ®ã lµ ®Æt mua. C¸c
thµnh phÇn d÷ liÖu x¸c ®Þnh cho s¸ch sÏ bao gåm tªn cña c¸c t¸c gi¶,
lo¹i b×a (cøng hay mÒm) vµ sè hiÖu ISBN cña nã. Nh− vËy, chóng ta cã
thÓ thÊy: s¸ch vµ t¹p chÝ cã chung c¸c ®Æc tr−ng Ên phÈm trong khi vÉn
cã c¸c thuéc tÝnh riªng cña chóng.
158 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Ấn phẩm
Số trang
Mã số tra cứu
Ngày tháng xuất bản
Bản quyền
Nhà xuất bản
Lấy ra
Cất đi
Đọc

Tạp chí Sách

Tên Tên của các tác giả


Số kỳ phát hành Loại bìa
Các bài viết ISBN
Đặt mua

H×nh 7.1: Líp Ên phÈm vμ c¸c líp dÉn xuÊt cña nã


Víi tÝnh kÕ thõa, chóng ta kh«ng ph¶i mÊt c«ng x©y dùng l¹i tõ
®Çu c¸c líp míi, chØ cÇn bæ sung ®Ó cã ®−îc trong c¸c líp dÉn xuÊt
c¸c ®Æc tr−ng cÇn thiÕt.
7.2.3. TÝnh ®a h×nh (Polymorphism)
XÐt l¹i vÝ dô trªn, chóng ta thÊy r»ng c¶ t¹p chÝ vµ s¸ch ®Òu ph¶i
cã kh¶ n¨ng lÊy ra. Tuy nhiªn ph−¬ng ph¸p lÊy ra cho t¹p chÝ cã kh¸c
so víi ph−¬ng ph¸p lÊy ra cho s¸ch, mÆc dï kÕt qu¶ cuèi cïng gièng
nhau. Khi ph¶i lÊy ra t¹p chÝ, th× ph¶i sö dông ph−¬ng ph¸p lÊy ra
riªng cho t¹p chÝ (dùa trªn mét b¶n tra cøu) nh−ng khi lÊy ra s¸ch th×
l¹i ph¶i sö dông ph−¬ng ph¸p lÊy ra riªng cho s¸ch (dùa trªn hÖ thèng
phiÕu l−u tr÷). TÝnh ®a h×nh trong lËp tr×nh h−íng ®èi t−îng cho phÐp
chóng ta x¸c ®Þnh mét ph−¬ng thøc ®Ó lÊy ra mét t¹p chÝ hay mét
cuèn s¸ch. Khi lÊy ra mét t¹p chÝ nã sÏ dïng ph−¬ng thøc lÊy ra riªng
cho t¹p chÝ, cßn khi lÊy ra mét cuèn s¸ch th× nã sö dông ph−¬ng thøc
lÊy ra t−¬ng øng víi s¸ch. KÕt qu¶ lµ chØ cÇn mét tªn ph−¬ng thøc duy
nhÊt ®−îc dïng cho c¶ hai c«ng viÖc tiÕn hµnh trªn hai líp dÉn xuÊt
cã liªn quan, mÆc dï viÖc thùc hiÖn cña ph−¬ng thøc ®ã thay ®æi tïy
theo tõng líp.
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 159

Nh− vËy, tÝnh ®a h×nh (Polymorphism) lµ kh¶ n¨ng ®Ó cho mét


th«ng ®iÖp ®−a ra c¸ch thùc hiÖn cña nã theo líp cô thÓ cña ®èi t−îng
nhËn th«ng ®iÖp. Khi mét líp dÉn xuÊt ®−îc t¹o ra (vÝ dô líp t¹p chÝ vµ
líp s¸ch) nã cã thÓ thay ®æi c¸ch thùc hiÖn c¸c ph−¬ng thøc nµo ®ã mµ
nã thõa h−ëng tõ líp c¬ së cña nã (vÝ dô ph−¬ng thøc lÊy ra tõ líp Ên
phÈm). Mét th«ng ®iÖp khi ®−îc göi ®Õn mét ®èi t−îng cña líp c¬ së,
sÏ dïng ph−¬ng thøc ®· ®Þnh nghÜa cho nã trong líp c¬ së. NÕu mét
líp dÉn xuÊt ®Þnh nghÜa l¹i mét ph−¬ng thøc thõa h−ëng tõ líp c¬ së
cña nã th× mét th«ng ®iÖp cã cïng tªn víi ph−¬ng thøc nµy, khi ®−îc
göi tíi mét ®èi t−îng cña líp dÉn xuÊt sÏ gäi ph−¬ng thøc ®· ®Þnh
nghÜa cho líp dÉn xuÊt.
TÝnh ®a h×nh dùa trªn sù nèi kÕt (Binding), ®ã lµ qu¸ tr×nh g¾n
mét ph−¬ng thøc víi mét hµm thùc sù. Khi c¸c ph−¬ng thøc kiÓu ®a
h×nh ®−îc sö dông th× tr×nh biªn dÞch ch−a thÓ x¸c ®Þnh hµm nµo t−¬ng
øng víi ph−¬ng thøc nµo sÏ ®−îc gäi. Hµm cô thÓ ®−îc gäi sÏ tïy
thuéc vµo viÖc phÇn tö nhËn th«ng ®iÖp lóc ®ã thuéc líp nµo, do ®ã
hµm ®−îc gäi chØ x¸c ®Þnh ®−îc vµo lóc ch−¬ng tr×nh ch¹y. §iÒu nµy
®−îc gäi lµ sù kÕt nèi muén (Late binding) hay kÕt nèi lóc ch¹y
(Runtime binding) v× nã x¶y ra khi ch−¬ng tr×nh ®ang thùc hiÖn.
Ấn phẩm
Số trang
Mã số tra cứu
Ngày tháng xuất bản
Bản quyền
Nhà xuất bản
Lấy ra
Cất đi
Đọc

Tạp chí Sách

Tên Tên của các tác giả


Số kỳ phát hành Loại bìa
Các bài viết ISBN
Đặt mua Lấy ra
Lấy ra

H×nh 7.2: Líp Ên phÈm vμ c¸c líp dÉn cña nã


160 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

7.3. Líp vμ c¸c thμnh phÇn cña líp

7.3.1. Kh¸i niÖm líp


Trong phÇn trªn ta ®· ®−a ra kh¸i niÖm líp trong lËp tr×nh h−íng
®èi t−îng. C¬ chÕ líp cña C++ cho phÐp ng−êi dïng ®Þnh nghÜa ra
kiÓu d÷ liÖu riªng cña m×nh.
Mét líp cña C++ cã bèn thuéc tÝnh liªn kÕt:
- Mét tËp hîp c¸c thµnh phÇn d÷ liÖu, ®¹i diÖn cho c¸c thuéc tÝnh
cña líp.
- Mét tËp hîp c¸c hµm thµnh phÇn, lµ tËp c¸c phÐp to¸n cã thÓ
®−îc ¸p dông vµo c¸c ®èi t−îng cña líp. Chóng cßn ®−îc gäi lµ giao
diÖn cña líp.
- Ph¹m vi th©m nhËp líp tõ ch−¬ng tr×nh. Thµnh phÇn cña mét líp
cã thÓ ®−îc x¸c ®Þnh lµ private, protected hay public.
- Mét tªn nh·n líp dïng lµm bé x¸c ®Þnh kiÓu cho líp do ng−êi
dïng ®Þnh nghÜa.
Líp th−êng ®−îc khai b¸o theo có ph¸p sau:
class <tªn líp> {
private:
<khai b¸o c¸c thµnh phÇn riªng >
protected:
<khai b¸o c¸c thµnh phÇn b¶o vÖ >
public:
<khai b¸o c¸c thµnh phÇn c«ng céng>
};
<®Þnh nghÜa cña c¸c hµm thµnh phÇn ch−a ®−îc ®Þnh nghÜa bªn
trong khai b¸o líp>
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 161

Nh÷ng thμnh phÇn ®−îc khai b¸o trong líp chia lμm hai nhãm:
- Nh÷ng thμnh phÇn private kh«ng thÓ truy nhËp ®−îc bëi nh÷ng
hµm bªn ngoµi líp mµ chØ cã thÓ truy nhËp ®−îc bëi c¸c hµm thµnh
phÇn kh¸c bªn trong chÝnh líp ®ã, tøc lµ chóng chØ ®−îc sö dông bªn
trong th©n c¸c hµm thµnh phÇn cña líp.
- Nh÷ng thμnh phÇn public cã thÓ ®−îc truy nhËp bëi c¸c hµm
thµnh phÇn bªn trong líp vµ c¸c hµm bªn ngoµi líp. NÕu truy nhËp bëi
c¸c hµm bªn ngoµi líp th× ph¶i sö dông th«ng qua ®èi t−îng cña líp.
C¸c ®èi t−îng thuéc líp sÏ truy nhËp tíi c¸c thµnh phÇn public th«ng
qua to¸n tö x¸c ®Þnh '.'.
7.3.2. C¸c thμnh phÇn cña líp (Data member and function member)
D÷ liÖu thµnh phÇn trong mét líp cã thÓ cã c¸c kiÓu sau ®©y:
1. KiÓu private - d÷ liÖu riªng
2. KiÓu public - d÷ liÖu chung
3. KiÓu protect - d÷ liÖu ®−îc b¶o vÖ
4. KiÓu class - d÷ liÖu kiÓu líp
5. KiÓu static - d÷ liÖu tÜnh
Hµm thµnh phÇn trong mét líp cã thÓ cã c¸c kiÓu sau ®©y:
1. KiÓu private - hµm thµnh phÇn riªng
2. KiÓu public - hµm thµnh phÇn chung
3. KiÓu protect - hµm thµnh phÇn ®−îc b¶o vÖ
4. KiÓu static - hµm thµnh phÇn tÜnh
5. Constructor (hµm khëi t¹o) lµ hµm thµnh phÇn cho phÐp khëi
t¹o d÷ liÖu cña ®èi t−îng mét c¸ch tù ®éng khi nã ®−îc khai b¸o sau
tªn líp.
6. Destructor (hµm hñy bá) lµ hµm thµnh phÇn cho phÐp hñy bá
®èi t−îng mét c¸ch tù ®éng khi kh«ng cßn dïng ®Õn ®èi t−îng trong
ch−¬ng tr×nh n÷a.
162 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

7. Friend - hµm thµnh phÇn th©n thiÖn


8. Overloading Operator - To¸n tö t¶i béi
9. Overloading Function - Hµm t¶i béi
10. Virtual function - Hµm ¶o
Thμnh phÇn d÷ liÖu (data member)
C¸c thµnh phÇn d÷ liÖu ®−îc khai b¸o trong líp theo c¸c quy t¾c
nh− khai b¸o c¸c biÕn d÷ liÖu th−êng, chØ kh¸c lµ c¸c thµnh phÇn d÷
liÖu kh«ng ®−îc phÐp cã khëi ®Çu t−êng minh.
Mét ®èi t−îng líp cã thÓ ®−îc khai b¸o nh− mét thµnh phÇn d÷ liÖu.
§Þnh nghÜa c¸c hμm thμnh phÇn (member function)
C¸c hµm thµnh phÇn cña líp ®−îc khai b¸o ngay bªn trong th©n líp.
§Þnh nghÜa ngay bªn trong líp
Class <tªn líp>
{ private:
// khai b¸o ®Þnh nghÜa c¸c thµnh phÇn private
public:
// khai b¸o c¸c biÕn public
return_type fun_name(arg_list)
{
// C¸c lÖnh trong th©n hµm
}
// c¸c hµm thµnh phÇn kh¸c
}
Sau ®©y ta sÏ xÐt mét vÝ dô ®Þnh nghÜa líp thanhvien, trong ®ã
thµnh phÇn private gåm c¸c th«ng tin cña mét c¸ nh©n: tªn, tuæi; thµnh
phÇn public gåm hai ph−¬ng thøc: ph−¬ng thøc nhap() ®Ó nhËp th«ng
tin vµ ph−¬ng thøc xuat ®Ó hiÓn thÞ th«ng tin cña mét c¸ nh©n ®ã.
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 163

C¸c hµm nhap() vµ xuat() ®Òu ®−îc ®Þnh nghÜa trùc tiÕp ngay
trong ®Þnh nghÜa líp:
VÝ dô 1:
# include <iostream.h>
# include <conio.h>
# include <stdio.h>
class thanhvien
{ char ten[25];
int tuoi;
public:
void nhap(void)
{ cout<< "Nhap ten:"; gets(ten);
cout <<"Nhap tuoi:"; cin >>tuoi; }
void xuat(void)
{ cout<< "Ten:"<<ten<<"\n";
cout <<"Tuoi:"<<tuoi<<endl; }
} a;
int main() {
clrscr();
a.nhap();
a.xuat();
getch();
return 0; }

C¸c ®Þnh nghÜa hμm ngoμi th©n líp ph¶i theo có ph¸p sau:
type classname:functionName(parameter_list)
{
function body;
}
parameter_list: danh s¸ch tham sè cña hµm
function body: th©n hµm
164 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Ta xÐt vÝ dô, ®Þnh nghÜa líp SINHVIEN cã thµnh phÇn private


gåm c¸c th«ng tin riªng cña mét sinh viªn: hä tªn (kiÓu ký tù), n¨m
sinh (kiÓu sè nguyªn), ®iÓm trung b×nh (sè thùc); thµnh phÇn public
gåm hai ph−¬ng thøc nhap() vµ xem() c¸c d÷ liÖu cho sinh viªn.
C¸c hµm nhap() vµ xem() minh häa c¸c ®Þnh nghÜa hµm thµnh
phÇn bªn ngoµi ®Þnh nghÜa líp.
VÝ dô 2:
# include <iostream.h>
# include <conio.h>
# include <stdio.h>
class SINHVIEN
{ char hoten[25];
int namsinh;
float dtb;
public:
void nhap(void);
void xem(void);
};
void SINHVIEN::nhap()
{ cout<< "Nhap ho ten:"; gets(hoten);
cout <<"Nhap nam sinh:"; cin >>namsinh;
cout <<"Nhap diem trung binh:"; cin >>dtb;}
void SINHVIEN::xem(void)
{ cout<< "Ho ten:"<<hoten<<endl;
cout <<"Nam sinh:"<<namsinh<<endl;
cout <<"Diem trung binh:"<<dtb<<endl;}
int main() {
clrscr();
SINHVIEN s;
s.nhap();
s.xem();
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 165

getch();
return 0;
}
Chó ý, truy nhËp ®Õn thµnh phÇn public th«ng qua ®èi t−îng
nh− sau:
obj_name.var_member;
obj_name.fun_member;
Chóng ta sÏ xÐt vÝ dô sau ®©y ®Ó ph©n biÖt thµnh phÇn (d÷ liÖu vµ
hµm) private kh¸c thµnh phÇn public nh− thÕ nµo.
VÝ dô 3:
Class A
{ private:
long x;
void f()
public:
double y;
void g();
};
int main()
{ A a;
a.x =10; // Sai v× x lμ d÷ liÖu thμnh phÇn private
a.f(); // Sai v× f() lμ d÷ liÖu thμnh phÇn private
a.y =20; // §óng, v× y lμ d÷ liÖu thμnh phÇn public
a.g(); // §óng v× g() lμ d÷ liÖu thμnh phÇn public
}
VÝ dô 4: Chóng ta x©y dùng ch−¬ng tr×nh qu¶n lý sinh viªn bao
gåm c¸c chøc n¨ng:
- NhËp d÷ liÖu cho c¸c sinh viªn
- §−a ra mµn h×nh danh s¸ch c¸c sinh viªn cã n¨m sinh nhËp vµo
tõ bµn phÝm
166 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

- §−a ra mµn h×nh danh s¸ch c¸c sinh viªn ®−îc s¾p t¨ng dÇn
theo tªn.
§Ó gi¶i quyÕt bµi to¸n nµy, tr−íc hÕt chóng ta sÏ x©y dùng líp
(class) c¸c sinh viªn bao gåm c¸c thuéc tÝnh: sè b¸o danh, tªn vµ n¨m
sinh. Ta sÏ sö dông líp sinh viªn nµy ®Ó t¹o ra mét m¶ng c¸c ®èi t−îng
lµ c¸c sinh viªn.
Ch−¬ng tr×nh nh− sau:
# include <iostream.h>
# include <conio.h>
# include <stdio.h>
# include <string.h>
class SINHVIEN
{ int sbd;
char ten[30];
int ns;
public:
char *getten();
int getns() {return ns;}
void nhapsv();
void xemsv();
};
char *SINHVIEN::getten()
{ int len=strlen(ten);
char *s = new char[len];
strcpy(s,ten);
return s;}
void SINHVIEN::nhapsv()
{ cout <<"so bao danh:"; cin>>sbd;
cout<<"ten:";gets(ten);
cout<<"nam sinh:"; cin>>ns;}
void SINHVIEN::xemsv()
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 167

{ cout<<sbd<<" "
<<ten<<" "
<<ns<<endl;}
const n=4;
SINHVIEN a[n];
void nhapdssv()
{ for (int i=0; i<n; i++) {a[i].nhapsv();}}
void xemdssv()
{ for (int i=0; i<n; i++) {a[i].xemsv();}
cout<<endl;}
void xemns()
{ int x;
cout<<"nhap nam sinh:"; cin>>x;
cout<<"danh sach sinh vien sinh nam"<<x<<":\n";
for (int i=0; i<n; i++)
if (a[i].getns()==x) a[i].xemsv();
cout<< endl;}
void swap(int i, int j)
{SINHVIEN tg=a[i]; a[i]=a[j]; a[j]=tg;}
void sapxepten()
{int i,j,k;
for (i=0; i<n; i++)
{ k=i;
for (j=i+1; j<n; j++)
if (strcmp(a[j].getten(), a[k].getten())<0)k=j;
if (k!=i) swap(i,k); }}
void main()
{ nhapdssv();
xemns();
sapxepten();
xemdssv();
getch();}
168 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Ngoµi thµnh phÇn private vµ public, trong líp cßn cã thµnh phÇn
protected ®−îc dïng trong quan hÖ kÕ thõa gi÷a c¸c líp.
Ngoµi c¸ch dïng tõ khãa class ta cßn cã thÓ sö dông c¸ch sau ®©y
®Ó ®Þnh nghÜa líp:
1. Sö dông cÊu tróc (struct) ®Ó ®Þnh nghÜa líp, khi ®ã ngÇm ®Þnh
c¸c tr−êng trong struct lµ thµnh phÇn public. Ta cã thÓ quy ®Þnh l¹i c¸c
tr−êng thuéc thµnh phÇn private hay public.
2. Sö dông hîp (union) ®Ó ®Þnh nghÜa líp, khi ®ã ngÇm ®Þnh c¸c
tr−êng trong union lµ thµnh phÇn public vµ kh«ng thÓ thay ®æi ®−îc.
C¸c hµm thµnh phÇn cña líp kh¸c víi hµm th«ng th−êng ë c¸c
tÝnh chÊt sau:
- Hµm thµnh phÇn cña líp cã quyÒn th©m nhËp vµo tÊt c¶ c¸c lo¹i
thµnh phÇn cña líp ®ã, trong khi c¸c hµm th«ng th−êng chØ ®−îc
quyÒn th©m nhËp vµo c¸c thµnh phÇn public cña líp.
- C¸c hµm thµnh phÇn ®−îc ®Þnh nghÜa bªn trong ph¹m vi cña líp,
c¸c hµm th«ng th−êng ®−îc ®Þnh nghÜa bªn trong ph¹m vi tÖp.
Che giÊu th«ng tin:
Che giÊu th«ng tin lµ mét c¬ chÕ h×nh thøc ®Ó h¹n chÕ viÖc th©m
nhËp cña ng−êi dïng vµo biÓu diÔn bªn trong cña mét kiÓu líp. Nã
®−îc x¸c ®Þnh bëi viÖc g¾n nh·n chung (public), riªng (private) hay
b¶o vÖ (protected) bªn trong th©n líp. Mét thµnh phÇn c«ng céng lµ
thµnh phÇn cã thÓ th©m nhËp tíi ®−îc tõ bÊt kú ®©u trong ch−¬ng tr×nh.
- Mét thµnh phÇn ®−îc b¶o vÖ lµ thµnh phÇn c«ng céng ®èi víi
c¸c líp suy diÔn, nã lµ thµnh phÇn riªng ®èi víi phÇn cßn l¹i cña
ch−¬ng tr×nh.
- Mét thµnh phÇn riªng chØ cã thÓ ®−îc th©m nhËp tíi tõ c¸c hµm
thµnh phÇn vµ hµm b¹n friend cña líp cña nã.
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 169

Hμm cÊu tö vμ hμm hñy tö


Hμm cÊu tö - constructor
- Hµm cÊu tö lµ mét hµm thµnh phÇn ®Æc biÖt kh«ng thÓ thiÕu
®−îc trong mét líp. Nã cho phÐp khëi t¹o d÷ liÖu cña ®èi t−îng mét
c¸ch tù ®éng khi nã ®−îc khai b¸o sau tªn líp, tøc lµ nã ®−îc gäi tù
®éng mçi khi cã mét ®èi t−îng ®−îc khai b¸o.
- C¸c ®Æc tr−ng cña hµm cÊu tö:
+ Hµm cÊu tö cã cïng tªn víi tªn cña líp.
+ Hµm cÊu tö ph¶i cã thuéc tÝnh public.
+ Hµm cÊu tö kh«ng cã gi¸ trÞ tr¶ vÒ. Vµ kh«ng cÇn khai b¸o void
Cã thÓ cã nhiÒu hµm cÊu tö trong cïng líp (chång c¸c hµm cÊu tö).
Hµm cÊu tö cã thÓ ®−îc khai b¸o víi c¸c tham sè cã gi¸ trÞ
ngÇm ®Þnh.
Hμm hñy tö - destructor
Ng−îc víi hµm cÊu tö, hµm hñy bá ®−îc gäi khi ®èi t−îng t−¬ng
øng bÞ xo¸ khái bé nhí. Nãi c¸ch kh¸c, nã lµ hµm thµnh phÇn cho
phÐp hñy bá ®èi t−îng mét c¸ch tù ®éng khi kh«ng cßn dïng ®èi
t−îng trong ch−¬ng tr×nh n÷a. Hµm hñy tö cã ®Æc tr−ng sau:
- Tªn cña hµm hñy tö b¾t ®Çu b»ng dÊu ‘~’ theo sau lµ tªn cña líp
t−¬ng øng. Hµm hñy tö ph¶i cã thuéc tÝnh public.
- Nãi chung hµm hñy tö kh«ng cã tham sè, mçi líp chØ cã mét
hµm hñy tö.
- Gièng nh− hµm cÊu tö, hµm hñy tö kh«ng cã gi¸ trÞ tr¶ vÒ.

7.4. CÊp ph¸t bé nhí ®éng - c¸c thμnh phÇn tÜnh - Friend
7.4.1. CÊp ph¸t vμ gi¶i phãng bé nhí ®éng
Vïng bé nhí tù do ®−îc cÊp ph¸t b»ng c¸ch ¸p dông to¸n tö new.
ViÖc cÊp ph¸t vïng nhí cho c¸c ®èi t−îng ®−îc thùc hiÖn vµo lóc
ch−¬ng tr×nh ch¹y ®−îc gäi lµ cÊp ph¸t bé nhí ®éng.
170 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Có ph¸p cña to¸n tö new:


<pointer_to_name> = new <name> [ <name_initializer> ];
§Æc tr−ng cña bé nhí tù do lµ nã kh«ng cã tªn. C¸c ®èi t−îng
®−îc cÊp ph¸t bé nhí tù do cÇn ph¶i thao t¸c gi¸n tiÕp qua con trá.
MÆc ®Þnh, to¸n tö new g¸n gi¸ trÞ 0 khi kh«ng cßn ®ñ bé nhí tù do ®Ó
tho¶ m·n yªu cÇu.
ViÖc cÊp ph¸t bé nhí khi dÞch gäi lµ cÊp ph¸t bé nhí tÜnh. VÝ dô,
bé nhí dµnh cho b¶n th©n con trá ®−îc cÊp ph¸t lóc dÞch ®−îc gäi lµ
cÊp ph¸t tÜnh.
Bé nhí tù do bÞ hñy bá th«ng qua to¸n tö delete.
Có ph¸p cña to¸n tö delete:
delete <pointer_to_name>;
ViÖc ¸p dông to¸n tö delete cho vïng bé nhí kh«ng ®−îc cÊp ph¸t
trong miÒn bé nhí tù do cã thÓ g©y ra lçi nguy hiÓm cho ch−¬ng tr×nh
khi ch¹y.
7.4.2. C¸c thμnh phÇn tÜnh
§«i khi ta cÇn mäi ®èi t−îng cña mét líp cã quyÒn th©m nhËp vµo
cïng mét biÕn. Thµnh phÇn tÜnh cña líp lµ mét gi¶i ph¸p gióp ta lµm
viÖc nµy.
VÒ h×nh thøc: NÕu ®Æt tõ khãa static tr−íc c¸c khai b¸o thµnh
phÇn th× d÷ liÖu ®ã lµ d÷ liÖu thµnh phÇn tÜnh (hoÆc gäi lµ d÷ liÖu thµnh
phÇn static).
VÒ b¶n chÊt: D÷ liÖu thµnh phÇn static chØ cã mét b¶n sao duy
nhÊt dïng chung cho tÊt c¶ c¸c ®èi t−îng trong mét líp.
VÝ dô khai b¸o:
class A
{ static int c;
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 171

int n;
...
} a,b;
SÏ t¹o ra 2 ®èi t−îng a vµ b cã chung thµnh phÇn d÷ liÖu c:

Mét thµnh phÇn tÜnh cã ý nghÜa nh− mét biÕn toµn côc cho líp,
nh−ng nã cßn cã nhiÒu −u ®iÓm h¬n biÕn toµn côc.
Mçi mét ®èi t−îng trong líp ®−¬ng nhiªn ®· cã thµnh phÇn d÷
liÖu private lµ thµnh phÇn riªng cña nã vµ ®−îc bao bäc, che giÊu.
Thµnh phÇn d÷ liÖu public cña ®èi t−îng suy cho cïng còng vÉn lµ së
h÷u riªng cña ®èi t−îng nh−ng cã thÓ ®−îc ®èi t−îng ®ã thÓ hiÖn ra
bªn ngoµi. Mét thµnh phÇn d÷ liÖu static ®−îc khai b¸o trong mét líp
th× sÏ kh«ng lµ cña riªng bÊt kú ®èi t−îng nµo trong líp ®ã vµ tÊt c¶
c¸c ®èi t−îng cña líp sÏ dïng chung thµnh phÇn d÷ liÖu static nµy.
Thµnh phÇn static trong líp lµ cÇn thiÕt ®Ó ®¶m b¶o tÝnh ®Çy ®ñ khi m«
t¶ thÕ giíi thùc. C¸c thùc thÓ cïng lo¹i khi tån t¹i cã nh÷ng c¸i riªng
®−îc ®ãng kÝn, cã c¸i riªng cã thÓ béc lé vµ cã c¸i chung (c¸i chung
®ã chØ cã ë lo¹i thùc thÓ ®ang xÐt).
Cã thÓ t¨ng c−êng che giÊu th«ng tin. Thµnh phÇn tÜnh còng cã
thÓ ®−îc ®Æt lµ thµnh phÇn c«ng céng, riªng hay b¶o vÖ.
Thµnh phÇn tÜnh kh«ng n»m trong “kh«ng gian tªn” toµn côc cña
ch−¬ng tr×nh, do vËy lo¹i bá ®−îc kh¶ n¨ng trïng tªn ngÉu nhiªn.
ChØ tån t¹i mét thÓ nghiÖm cho thµnh phÇn tÜnh cña líp. Có ph¸p
khai b¸o thµnh phÇn d÷ liÖu tÜnh chØ lµ ghÐp thªm vµo phÇn ®Çu khai
b¸o tõ khãa static.
172 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Khi ®èi t−îng ®Çu tiªn cña líp ®−îc t¹o lËp th× nh÷ng biÕn static
®−îc tù khëi g¸n b»ng 0.
Thµnh phÇn d÷ liÖu tÜnh chØ ®−îc khëi ®Çu mét lÇn trong ch−¬ng
tr×nh. Cã thÓ th©m nhËp thµnh phÇn d÷ liÖu tÜnh nh− th©m nhËp víi c¸c
thµnh phÇn kh¸c. V× thµnh phÇn static dïng chung cho tÊt c¶ c¸c ®èi
t−îng cña líp nªn kh«ng thÓ truy nhËp thµnh phÇn static th«ng qua
mét ®èi t−îng cô thÓ nµo trong líp mµ ph¶i th«ng qua chÝnh tªn líp
cïng to¸n tö ph©n gi¶i miÒn x¸c ®Þnh.
§Þnh nghÜa cña hµm thµnh phÇn tÜnh còng gièng nh− ®Þnh nghÜa
c¸c hµm thµnh phÇn kh¸c. ViÖc gäi c¸c hµm thµnh phÇn tÜnh còng cã
thÓ th«ng qua mét ®èi t−îng líp hay mét con trá tíi ®èi t−îng líp, hay
còng cã thÓ ®−îc gäi trùc tiÕp b»ng c¸ch dïng có ph¸p líp thµnh phÇn.
Tr−íc khi sö dông c¸c ®èi t−îng trong líp ph¶i cã mét lÖnh ®Æc
biÖt khëi t¹o biÕn static, nÕu kh«ng cã lÖnh nµy ch−¬ng tr×nh sÏ b¸o lçi.
static_type class_name:: var_static;
VÝ dô sau ®©y t¹o ra mét líp HOSO víi biÕn tuoi lµ mét biÕn
nguyªn kiÓu static vµ diem lµ mét biÕn nguyªn thuéc thµnh phÇn private.
# include <iostream.h>
# include <conio.h>
class HOSO
{ static int tuoi;
int diem;
public:
void get(int a)
{diem = a;tuoi++;}
void put(void)
{cout<<"tuoi:"<<tuoi<<"diem="<<diem<<endl;}};
int HOSO::tuoi;
int main() {
clrscr();
HOSO a,b,tuoi;
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 173

a.get(20); b.get(30); tuoi.get(40);


a.put(); b.put(); tuoi.put();
getche(); return 0;}
V× tuoi lµ biÕn static nªn nã chØ cã mét b¶n sao duy nhÊt dïng
chung cho ba ®èi t−îng a, b, tuoi trong ch−¬ng tr×nh. Mçi khi mét ®èi
t−îng míi ®−îc t¹o, gi¸ trÞ cña biÕn static sÏ ®−îc xÐt tíi. Trong
tr−êng hîp nµy, gi¸ trÞ cña biÕn static lµ c lÇn l−ît t¨ng ®Õn 3 (v× gi¸ trÞ
khëi t¹o ®Çu tiªn cña static ngÇm ®Þnh lµ 0) vµ dïng chung cho c¶ a, b,
tuoi. Ng−îc l¹i víi tuoi, biÕn diem kh«ng ph¶i lµ biÕn static nªn diem
cã ba b¶n sao t−¬ng øng víi ba ®èi t−îng kh¸c nhau.
Chóng ta sÏ xÐt tiÕp mét vÝ dô sau ®Ó thÊy ®−îc ý nghÜa thùc tÕ
cña thµnh phÇn d÷ liÖu static.
Gi¶ sö trong mét hÖ thèng m¹ng m¸y tÝnh, mét sè ng−êi trong
cïng phßng lµm viÖc cã chung tµi kho¶n truy nhËp m¹ng (gåm tªn vµ
mËt khÈu) vµ t¹o thµnh mét nhãm (NHOM) lµm viÖc. Ta cã thÓ xem
nhãm (NHOM) c¸c thµnh viªn trªn nh− lµ mét líp, cßn tªn (TEN) vµ
mËt khÈu (MATKHAU) ®−îc xem nh− ®èi t−îng cña líp nµy. Mçi
mét thµnh viªn khi khai b¸o tªn vµ mËt khÈu sÏ ®−îc cÊp c¸c quyÒn
riªng vµ cã c¸c thiÕt lËp kh¸c nhau vÒ hÖ thèng. Nh− vËy ta cã thÓ xem
Tªn vµ mËt khÈu sÏ lµ thµnh phÇn d÷ liÖu tÜnh (cña tõng ®èi t−îng) cña
líp. Ch−¬ng tr×nh ®¨ng nhËp nh− sau:
# include <iostream.h>
# include <conio.h>
# include <string.h>
class MEMBER
{ static long taikhoan;
static long matkhau;
char *loginten;
double loginkhoa;
public:
void get(char *s, double k)
{ int len = strlen(s);
174 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

loginten=new char[len+1];
strcpy(loginten,s);
loginkhoa=k;}
void put()
{ cout<<"ten truy nhap:"<<loginten<<endl;
cout<<"Ma khoa truy nhap:"<<loginkhoa<<endl;
public_infor(); }
void public_infor()
{ cout<<"tai khoan:"<<taikhoan<<endl;
cout <<"mat khau:"<<matkhau<<endl<<endl;}
};
long MEMBER::taikhoan=922011;
long MEMBER::matkhau=23081968;
int main() { clrscr();
MEMBER t1,t2;
t1.get("Phuong Thao",1721994);
t2.get("Ngoc Quynh",711997);
t1.put(); t2.put();
getche(); return 0;
}

7.4.3. Hμm thμnh phÇn th©n thiÖn (Friend function)


Hµm thµnh phÇn th©n thiÖn lµ mét trong nh÷ng hµm ®Æc biÖt vµ
quan träng trong líp. Hµm thµnh phÇn th©n thiÖn kh«ng thuéc miÒn
x¸c ®Þnh cña líp, n¬i nã ®−îc khai b¸o lµ th©n thiÖn (nhê tõ khãa
friend). Khi mét líp hay mét hµm trë thµnh "b¹n" víi líp kh¸c, c¸c
hµm thµnh phÇn cña líp "b¹n" sÏ ®−îc trao quyÒn th©m nhËp vµo c¸c
thµnh phÇn riªng cña líp kia.
Khai b¸o hµm "b¹n" b¾t ®Çu b»ng tõ khãa friend. Nã chØ xuÊt hiÖn
bªn trong ®Þnh nghÜa líp.
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 175

Hµm thµnh phÇn th©n thiÖn nÕu ®−îc ®Þnh nghÜa bªn ngoµi líp th×
nã ®−îc ®Þnh nghÜa nh− mét hµm b×nh th−êng. Ta kh«ng truy nhËp
hµm th©n thiÖn bëi ®èi t−îng cña líp mµ truy nhËp nã nh− lµ mét hµm
b×nh th−êng.
Hμm tù do lμ b¹n cña mét líp
Có ph¸p khai b¸o:
class <class name>
{
private:
public:
friend function_type Function_name(parameter_list);
}
// ®Þnh nghÜa hμm b¹n
function_type Function_name(parameter_list)
{
// th©n hμm b¹n
}

Hμm tù do lμ b¹n cña nhiÒu líp


Mét hµm tù do lµ b¹n cña nhiÒu líp, th× nã còng ®−îc khai b¸o lµ
b¹n trong tÊt c¶ c¸c líp mµ nã coi lµ b¹n. Khi ®ã hµm tù do cã thÓ truy
nhËp vµo tÊt c¶ c¸c thµnh phÇn d÷ liÖu private cña c¸c líp b¹n.
Ph−¬ng thøc cña mét líp lμ b¹n cña mét líp kh¸c
Mét ph−¬ng thøc cña mét líp nµy còng cã thÓ lµ b¹n cña líp kia.
Víi c¸ch lµm viÖc nµy, ph−¬ng thøc cã thÓ truy nhËp vµo thµnh phÇn
riªng t− cña c¶ hai líp.
Ta sÏ xÐt vÝ dô sau ®Ó minh häa cho viÖc sö dông hµm th©n thiÖn.
Gi¶ sö cÇn x©y dùng líp c¸c ph©n sè, trong ®ã c¸c phÐp to¸n: nhËp,
xem, tèi gi¶n vµ céng ph©n sè ®−îc thÓ hiÖn b»ng c¸c hµm th©n thiÖn.
176 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

# include <iostream.h>
# include <conio.h>
# include <math.h>
class FRAC
{ int t,m;
public:
void read();
friend void write(FRAC);
friend void reduce(FRAC&);
friend FRAC sum(FRAC, FRAC);
};
void FRAC::read()
{ cout<<"tu so:"; cin>> t;
do {cout<<"mau so:"; cin>>m;
} while (m==0);
}
void write (FRAC P)
{ reduce(P);
cout<<P.t<<"/"<<P.m;}
void reduce(FRAC& P)
{ int i,j;
i=abs(P.t);
i=P.t; j=P.m;
j= abs(P.m);
while (i!=j) if(i>j) i-=j; else j-=i;
P.t= P.t/i;
P.m=P.m/j;
}
FRAC sum(FRAC P, FRAC Q)
{FRAC R;
R.t = P.t*Q.m + Q.t*P.m;
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 177

R.m =P.m* Q.m;


reduce(R);
return R;
}
int main() {
clrscr();
FRAC p,q;
p.read();
q.read();
write(p); cout<<"+"; write(q);
cout<<"=";write(sum(p,q));
getche();
return 0; }

Vai trß cña hµm th©n thiÖn lóc nµy cho phÐp sö dông chóng nh−
nh÷ng hµm b×nh th−êng ®Ó thao t¸c trªn ®èi t−îng hoÆc xö lý chÝnh d÷
liÖu cña líp mµ kh«ng cÇn truy nhËp qua ®èi t−îng cña líp.

7.5. Thõa kÕ vμ ®a h×nh

7.5.1. Thõa kÕ
Thõa kÕ nÒn t¶ng cho viÖc sö dông l¹i c¸c bé phËn cña ch−¬ng
tr×nh. Thõa kÕ cho phÐp ta ®Þnh nghÜa mét líp míi, gäi lµ líp dÉn
xuÊt, tõ mét líp ®· cã (gäi lµ líp c¬ së). Líp dÉn xuÊt sÏ thõa kÕ c¸c
thµnh phÇn (d÷ liÖu, hµm) cña líp c¬ së, ®ång thêi thªm vµo c¸c
thµnh phÇn míi. Nãi c¸ch kh¸c, líp dÉn xuÊt chØ kÕ thõa c¸c thuéc
tÝnh vµ ph−¬ng thøc cña líp c¬ së chø kh«ng kÕ thõa c¸c hµm cÊu tö
vµ hñy tö.
Líp dÉn xuÊt th−êng bæ sung thªm c¸c thµnh phÇn d÷ liÖu vµ c¸c
hµm thµnh phÇn trong ®Þnh nghÜa, ta nãi líp dÉn xuÊt cô thÓ h¬n so víi
líp c¬ së vµ v× vËy th−êng m« t¶ mét líp c¸c ®èi t−îng cã ph¹m vi hÑp
h¬n líp c¬ së.
178 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Hµm cÊu tö cña líp dÉn xuÊt th−êng tù ®éng gäi c¸c hµm cÊu tö
cña c¸c líp c¬ së ®Ó khëi t¹o gi¸ trÞ cho c¸c thµnh phÇn trong líp c¬
së. Hµm hñy tö ®−îc gäi theo thø tù ng−îc l¹i. Khi ng−êi sö dông
kh«ng khai b¸o t−êng minh sö dông hµm cÊu tö nµo cña líp c¬ së
®−îc sö dông trong hµm cÊu tö cña líp dÉn xuÊt th× tr×nh biªn dÞch tù
®éng sö dông hµm cÊu tö mÆc ®Þnh kh«ng cã ®èi sè.
Ta cã thÓ hiÓu kÕ thõa ®¬n gi¶n nh− sau: NÕu líp B lµ líp kÕ thõa
tõ líp A th× toµn bé c¸c thµnh phÇn cña líp A còng cã mÆt trong líp B
mµ kh«ng cÇn ph¶i khai b¸o trong líp B. Líp A th−êng ®−îc gäi lµ líp
cha (hay líp c¬ së) cßn líp B lµ líp con (hay líp dÉn xuÊt).
VÝ dô:

§iÓm (x, y, c); // täa ®é vµ mµu s¾c

§o¹n th¼ng (x2, y2); // ®Çu mót thø 2

Tam gi¸c (x, y, c); // ®Ønh thø 3 cña tam gi¸c

Khai b¸o: C¸ch khai b¸o mét líp dÉn xuÊt trong C++
class A
{
...
};
class B: public A
{
...
};
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 179

C¸c kiÓu dÉn xuÊt kh¸c nhau


Tïy thuéc vµo tõ khãa ®øng tr−íc líp c¬ së trong khai b¸o líp
dÉn xuÊt, ng−êi ta ph©n biÖt ba lo¹i dÉn xuÊt nh− sau: public, private
vµ protected.
DÉn xuÊt public
Trong dÉn xuÊt public, c¸c thµnh phÇn, c¸c hµm b¹n vµ c¸c ®èi t−îng
cña líp dÉn xuÊt kh«ng thÓ truy nhËp ®Õn c¸c thµnh phÇn private cña
líp c¬ së. C¸c thµnh phÇn protected trong líp c¬ së trë thµnh c¸c
thµnh phÇn private trong líp dÉn xuÊt. C¸c thµnh phÇn public cña líp c¬
së vÉn lµ public trong líp dÉn xuÊt.
DÉn xuÊt private
Trong tr−êng hîp nµy, c¸c thµnh phÇn public trong líp c¬ së
kh«ng thÓ truy nhËp ®−îc tõ c¸c ®èi t−îng cña líp dÉn xuÊt, nghÜa lµ
chóng trë thµnh c¸c thµnh phÇn private trong líp dÉn xuÊt. C¸c thµnh
phÇn protected trong líp c¬ së cã thÓ truy nhËp ®−îc tõ c¸c hµm thµnh
phÇn vµ c¸c hµm b¹n cña líp dÉn xuÊt.
DÉn xuÊt protected
Trong dÉn xuÊt lo¹i nµy, c¸c thµnh phÇn public, protected trong
líp c¬ së trë thµnh c¸c thµnh phÇn protected trong líp dÉn xuÊt.
Cã hai kiÓu thõa kÕ:
§¬n thõa kÕ:
Truy nhËp c¸c thµnh phÇn líp c¬ së tõ líp dÉn xuÊt: C¸c thµnh
phÇn private trong líp c¬ së kh«ng thÓ truy nhËp ®−îc tõ c¸c líp dÉn
xuÊt. C¸c líp dÉn xuÊt chØ cã thÓ truy nhËp vµo c¸c thµnh phÇn
protected vµ thµnh phÇn public cña líp c¬ së.
§Þnh nghÜa l¹i c¸c thµnh phÇn líp c¬ së trong líp dÉn xuÊt.
180 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

§a thõa kÕ:
§a thõa kÕ cho phÐp mét líp cã thÓ lµ dÉn xuÊt cña nhiÒu líp c¬
së, do vËy nh÷ng g× ®· ®Ò cËp trong phÇn ®¬n thõa kÕ ®−îc tæng qu¸t
hãa cho tr−êng hîp ®a thõa kÕ.
Gièng nh− trong ®¬n thõa kÕ, trong hµm thµnh phÇn cña líp dÉn
xuÊt cã thÓ sö dông tÊt c¶ c¸c hµm thµnh phÇn public (hoÆc protected)
cña líp c¬ së.
Khi cã nhiÒu hµm thµnh phÇn cïng tªn trong c¸c líp kh¸c nhau
(®Þnh nghÜa l¹i mét hµm), ta cã thÓ lo¹i bá sù nhËp nh»ng b»ng c¸ch sö
dông to¸n tö ph¹m vi “::”.
7.5.2. §a h×nh
TÝnh ®a h×nh ®−îc xuÊt hiÖn khi cã sù kÕ thõa gi÷a c¸c líp. Líp
c¬ së ®−îc coi lµ tæng qu¸t hãa cña c¸c líp dÉn xuÊt, ng−îc l¹i c¸c líp
dÉn xuÊt lµ chi tiÕt hãa cña líp c¬ së. Do vËy, cã nh÷ng ph−¬ng thøc
tæng qu¸t cho mäi líp dÉn xuÊt nªn cã mÆt ë líp c¬ së nh−ng néi dung
cña nã chØ ®−îc x¸c ®Þnh ë c¸c líp dÉn xuÊt cô thÓ. VÝ dô mét líp c¬
së h×nh ®a gi¸c ph¶i cã ph−¬ng thøc tÝnh diÖn tÝch cña nã nh−ng tÝnh
diÖn tÝch nh− thÕ nµo sÏ ®−îc x¸c ®Þnh ë c¸c líp dÉn xuÊt h×nh tam
gi¸c, tø gi¸c, ngò gi¸c,... TÝnh chÊt nh− trªn trong kÕ thõa gäi lµ tÝnh
®a h×nh.
Mét vÝ dô trùc quan n÷a thÓ hiÖn tÝnh ®a h×nh lµ mét ti vi cã thÓ
võa lµ ®èi t−îng cña mÆt hµng võa lµ ®èi t−îng cña líp mÆt hµng ®iÖn
tö d©n dông. C¸c ®èi t−îng h×nh häc nh− h×nh vu«ng, h×nh trßn, h×nh
ch÷ nhËt ®Òu cã cïng c¸ch vÏ nh− nhau: x¸c ®Þnh hai ®iÓm ®Çu vµ
cuèi, nèi hai ®iÓm nµy. Do vËy thuËt to¸n tuy gièng nhau ®èi víi tÊt c¶
c¸c ®èi t−îng h×nh, nh−ng c¸ch vÏ th× phô thuéc vµo tõng líp ®èi
t−îng cô thÓ. Ta nãi ph−¬ng thøc nèi ®iÓm cña c¸c ®èi t−îng h×nh häc
cã tÝnh ®a h×nh. TÝnh ®a h×nh cßn ®−îc thÓ hiÖn trong c¸ch thøc hiÓn
thÞ th«ng tin trong c¸c ®èi t−îng ®iÓm mµu/kh«ng mµu.
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 181

TÝnh ®a h×nh cßn thÓ hiÖn khi mét hµm thµnh phÇn trong líp c¬ së
®−îc gäi tõ mét ®èi t−îng líp dÉn xuÊt, cßn b¶n th©n hµm ®ã th× gäi
tíi hµm thµnh phÇn ®−îc ®Þnh nghÜa ®ång thêi trong c¶ líp c¬ së (khai
b¸o virtual cã mÆt ë ®©y) vµ trong c¸c líp dÉn xuÊt.

7.6. N¹p chång to¸n tö vμ hμm chuyÓn ®æi

7.6.1. N¹p chång to¸n tö


Trong C++, cã thÓ ®Þnh nghÜa chång ®èi víi hÇu hÕt c¸c phÐp to¸n
(mét ng«i hoÆc hai ng«i) trªn c¸c líp, nghÜa lµ mét trong sè c¸c to¸n
h¹ng tham gia phÐp to¸n lµ c¸c ®èi t−îng. §©y lµ mét kh¶ n¨ng m¹nh
v× nã cho phÐp x©y dùng trªn c¸c líp c¸c to¸n tö cÇn thiÕt, lµm cho
ch−¬ng tr×nh ®−îc viÕt ng¾n gän dÔ ®äc h¬n vµ cã ý nghÜa h¬n. Ch¼ng
h¹n, khi ®Þnh nghÜa mét líp complex ®Ó biÓu diÔn c¸c sè phøc, cã thÓ
viÕt trong C++: a+b, a-b, a*b, a/b víi a,b lµ c¸c ®èi t−îng complex.
§Ó cã ®−îc ®iÒu nµy, ta ®Þnh nghÜa chång c¸c phÐp to¸n +, -, * vµ
/ b»ng c¸ch ®Þnh nghÜa ho¹t ®éng cña tõng phÐp to¸n gièng nh− ®Þnh
nghÜa mét hµm, chØ kh¸c ®©y lµ hµm to¸n tö (operator function). Hµm
to¸n tö cã tªn ®−îc ghÐp bëi tõ khãa operator vµ ký hiÖu cña phÐp to¸n
t−¬ng øng. B¶ng sau ®−a ra mét sè vÝ dô vÒ tªn hµm to¸n tö.
B¶ng liÖt kª mét sè tªn hμm to¸n tö quen thuéc

Tªn hμm ý nghÜa


operator + ®Þnh nghÜa phÐp +
operator * ®Þnh nghÜa phÐp nh©n *
operator / ®Þnh nghÜa phÐp chia /
operator += ®Þnh nghÜa phÐp tù céng +=
operator != ®Þnh nghÜa phÐp so s¸nh kh¸c nhau

Hµm to¸n tö cã thÓ dïng nh− lµ mét hµm thµnh phÇn cña mét líp
hoÆc lµ hµm tù do, khi ®ã hµm to¸n tö ph¶i ®−îc khai b¸o lµ b¹n cña
c¸c líp cã c¸c ®èi t−îng mµ hµm thao t¸c.
182 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Hµm to¸n tö ph¶i cã thuéc tÝnh public v× nÕu kh«ng ch−¬ng tr×nh
dÞch kh«ng thÓ thùc hiÖn ®−îc nã ë ngoµi ph¹m vi líp.
Ký hiÖu ®øng sau tõ khãa operator ph¶i lµ mét trong sè c¸c ký
hiÖu to¸n tö ¸p dông cho c¸c kiÓu d÷ liÖu c¬ së, kh«ng thÓ dïng c¸c ký
hiÖu míi. TÊt nhiªn lµ ta kh«ng thÓ t¹o ra c¸c ký hiÖu phÐp to¸n míi tõ
viÖc ®Þnh nghÜa chång c¸c to¸n tö.
Ph¶i ®¶m b¶o c¸c ®Æc tÝnh nguyªn thñy cña to¸n tö ®−îc ®Þnh
nghÜa chång, ch¼ng h¹n: ®é −u tiªn, trËt tù kÕt hîp, sè ng«i.
Mçi hµm to¸n tö chØ cã thÓ ¸p dông víi kiÓu to¸n h¹ng nhÊt ®Þnh.
CÇn chó ý r»ng c¸c tÝnh chÊt vèn cã, ch¼ng h¹n tÝnh giao ho¸n cña
to¸n tö kh«ng thÓ ¸p dông mét c¸ch tïy tiÖn cho c¸c to¸n tö ®−îc ®Þnh
nghÜa chång.
PhÇn lín to¸n tö trong C++ ®Òu cã thÓ ®Þnh nghÜa chång. Mét sè
to¸n tö kh«ng thÓ ®Þnh nghÜa chång (ch¼ng h¹n to¸n tö truy nhËp thµnh
phÇn cÊu tróc “.”, to¸n tö ph¹m vi “::”, to¸n tö ®iÒu kiÖn “?:”) vµ cã
mét sè to¸n tö ta ph¶i tu©n theo c¸c rµng buéc sau:
- PhÐp =, [] nhÊt ®Þnh ph¶i ®−îc ®Þnh nghÜa nh− hµm thµnh phÇn
cña líp.
- PhÐp << vµ >> dïng víi cout vµ cin ph¶i ®−îc ®Þnh nghÜa nh−
hµm b¹n.
Hai phÐp to¸n ++ vµ -- cã thÓ sö dông theo hai c¸ch kh¸c nhau
øng víi d¹ng tiÒn tè ++a, --b vµ d¹ng hËu tè a++, b--. §iÒu nµy ®ßi hái
hai hµm to¸n tö kh¸c nhau.
ChiÕn l−îc sö dông hµm to¸n tö
VÒ nguyªn t¾c, ®Þnh nghÜa chång mét phÐp to¸n lµ kh¸ ®¬n gi¶n,
nh−ng viÖc sö dông phÐp to¸n ®Þnh nghÜa chång l¹i kh«ng ph¶i dÔ
dµng vµ ®ßi hái ph¶i c©n nh¾c bëi lÏ nÕu bÞ l¹m dông sÏ lµm cho
ch−¬ng tr×nh khã hiÓu.
Ph¶i lµm sao ®Ó c¸c phÐp to¸n vÉn gi÷ ®−îc ý nghÜa trùc quan
nguyªn thñy cña chóng. Ch¼ng h¹n kh«ng thÓ ®Þnh nghÜa céng “+”
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 183

nh− phÐp trõ “-” hai gi¸ trÞ. Ph¶i x¸c ®Þnh tr−íc ý nghÜa c¸c phÐp to¸n
tr−íc khi viÕt ®Þnh nghÜa cña c¸c hµm to¸n tö t−¬ng øng.
a) C¸c phÐp to¸n mét ng«i
C¸c phÐp to¸n mét ng«i lµ: *, &, ~, !, ++, --, sizeof (kiÓu)
C¸c hµm to¸n tö t−¬ng øng chØ cã mét ®èi sè vµ ph¶i tr¶ vÒ gi¸ trÞ
cïng kiÓu víi to¸n h¹ng, riªng sizeof cã gi¸ trÞ tr¶ vÒ kiÓu nguyªn
kh«ng dÊu vµ to¸n tö (kiÓu) dïng ®Ó tr¶ vÒ mét gi¸ trÞ cã kiÓu nh− ®·
ghi trong dÊu ngoÆc.
b) C¸c phÐp to¸n hai ng«i
C¸c phÐp to¸n hai ng«i nh−:
*, /, %, +, -, <<, >>, <, >, <=, >=, ==, !=, &,|, ^, &&, ||
Hai to¸n h¹ng tham gia c¸c phÐp to¸n kh«ng nhÊt thiÕt ph¶i cïng
kiÓu, mÆc dï trong thùc tÕ sö dông th× th−êng lµ nh− vËy. Nh− vËy chØ
cÇn mét trong hai ®èi sè cña hµm to¸n tö t−¬ng øng lµ ®èi t−îng lµ ®ñ.
c) C¸c phÐp to¸n g¸n
C¸c to¸n tö g¸n gåm cã:
=, +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=
Do c¸c to¸n tö g¸n ®−îc ®Þnh nghÜa d−íi d¹ng hµm thµnh phÇn,
nªn chØ cã mét tham sè t−êng minh vµ kh«ng cã rµng buéc g× vÒ kiÓu
®èi sè vµ kiÓu gi¸ trÞ tr¶ vÒ cña c¸c phÐp g¸n.
d) To¸n tö truy nhËp thμnh phÇn "->"
PhÐp to¸n nµy ®−îc dïng ®Ó truy xuÊt c¸c thµnh phÇn cña mét cÊu
tróc hay mét líp vµ cÇn ph©n biÖt víi nh÷ng c¸ch sö dông kh¸c ®Ó
tr¸nh dÉn ®Õn sù nhÇm lÉn. Cã thÓ ®Þnh nghÜa phÐp to¸n lÊy thµnh
phÇn gièng nh− ®èi víi c¸c phÐp to¸n mét ng«i.
e) To¸n tö truy nhËp thμnh phÇn theo chØ sè
To¸n tö lÊy thµnh phÇn theo chØ sè ®−îc dïng ®Ó x¸c ®Þnh mét
thµnh phÇn cô thÓ trong mét khèi d÷ liÖu (cÊp ph¸t ®éng hay tÜnh).
184 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

Th«ng th−êng phÐp to¸n nµy ®−îc dïng víi m¶ng, nh−ng còng cã thÓ
®Þnh nghÜa l¹i nã khi lµm viÖc víi c¸c kiÓu d÷ liÖu kh¸c. Ch¼ng h¹n
víi kiÓu d÷ liÖu vÐc-t¬ cã thÓ ®Þnh nghÜa phÐp lÊy theo chØ sè ®Ó tr¶ vÒ
mét thµnh phÇn täa ®é nµo ®ã vÐc-t¬. Vµ ph¶i ®−îc ®Þnh nghÜa nh−
hµm thµnh phÇn cã mét ®èi sè t−êng minh.
7.6.2. C¸c hμm chuyÓn ®æi
Víi c¸c kiÓu d÷ liÖu chuÈn, ta cã thÓ thùc hiÖn c¸c phÐp chuyÓn
kiÓu ngÇm ®Þnh, ch¼ng h¹n cã thÓ g¸n mét gi¸ trÞ int vµo mét biÕn
long, hoÆc céng gi¸ trÞ long vµo mét biÕn float. Th−êng cã hai kiÓu
chuyÓn kiÓu: chuyÓn kiÓu ngÇm ®Þnh (tù ®éng) vµ chuyÓn kiÓu t−êng
minh (Ðp kiÓu). PhÐp chuyÓn kiÓu ngÇm ®Þnh ®−îc thùc hiÖn bëi
ch−¬ng tr×nh biªn dÞch. PhÐp chuyÓn kiÓu t−êng minh x¶y ra khi sö
dông phÐp Ðp kiÓu b¾t buéc. PhÐp Ðp kiÓu th−êng ®−îc dïng trong c¸c
c©u lÖnh gäi hµm ®Ó göi c¸c tham sè cã kiÓu kh¸c víi c¸c tham sè
h×nh thøc t−¬ng øng.
C¸c kiÓu líp kh«ng thÓ dÔ dµng chuyÓn sang c¸c kiÓu kh¸c ®−îc
mµ ph¶i do ng−êi lËp tr×nh tù lµm lÊy. C++ còng cung cÊp c¸ch thøc
®Þnh nghÜa phÐp chuyÓn kiÓu ngÇm ®Þnh vµ t−êng minh. PhÐp chuyÓn
kiÓu ngÇm ®Þnh ®−îc ®Þnh nghÜa b»ng mét hµm cÊu tö chuyÓn kiÓu
(conversion constructor), cßn phÐp chuyÓn kiÓu t−êng minh ®−îc x¸c
®Þnh th«ng qua to¸n tö chuyÓn kiÓu hoÆc Ðp kiÓu (cast operator).
PhÐp chuyÓn kiÓu ngÇm ®Þnh ®−îc ®Þnh nghÜa th«ng qua mét hµm
cÊu tö chuyÓn kiÓu cho líp. Víi ®èi sè cã kiÓu cÇn ph¶i chuyÓn thµnh
mét ®èi t−îng cña líp ®ã. Tham sè nµy cã thÓ cã kiÓu c¬ së hay lµ mét
®èi t−îng thuéc líp kh¸c. Hµm cÊu tö mét tham sè trong líp point
trong c¸c ch−¬ng tr×nh point.cpp ë ch−¬ng tr−íc lµ vÝ dô cho hµm cÊu
tö chuyÓn kiÓu.
C¸c to¸n tö chuyÓn kiÓu cã thÓ ®−îc dïng ®Ó chuyÓn c¸c ®èi
t−îng sang c¸c kiÓu kh¸c vµ còng cã thÓ ®−îc dïng cho c¸c môc ®Ých
kh¸c ngoµi phÐp g¸n vµ khëi t¹o gi¸ trÞ. C++ quy ®Þnh r»ng mét hµm
to¸n tö chuyÓn kiÓu nh− thÕ buéc ph¶i lµ hµm thµnh phÇn cña líp liªn
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 185

quan vµ kh«ng cã tham sè hoÆc kiÓu tr¶ vÒ. Tªn cña nã ®−îc cho theo
d¹ng nh− sau:
operator type();
trong ®ã type lµ tªn cña kiÓu d÷ liÖu mµ mét ®èi t−îng sÏ ®−îc
chuyÓn sang; cã thÓ lµ kiÓu d÷ liÖu c¬ së (khi ®ã ta ph¶i chuyÓn kiÓu
tõ ®èi t−îng sang kiÓu c¬ së) hay mét kiÓu líp kh¸c (khi ®ã ta ph¶i
chuyÓn kiÓu tõ ®èi t−îng líp nµy sang líp kh¸c).
Trong c¸c chuyÓn ®æi kiÓu tõ líp nµy sang mét líp kh¸c cã thÓ
®−îc më réng cho hai kiÓu líp kh¸c nhau:
- Trong líp A, ta cã thÓ ®Þnh nghÜa mét hµm to¸n tö ®Ó thùc hiÖn
chuyÓn ®æi tõ kiÓu A sang kiÓu B (cast operator).
- Hµm thiÕt lËp cña líp A chØ víi mét tham sè kiÓu B sÏ thùc hiÖn
chuyÓn ®æi kiÓu tõ B sang A.

7.7. C¸c hμm mÉu (template)


Trong lËp tr×nh, nhiÒu khi cã nh÷ng ®o¹n ch−¬ng tr×nh t−¬ng ®ång
vÒ c«ng viÖc cÇn lµm. §Ó tr¸nh nh÷ng c«ng viÖc cã tÝnh chÊt lÆp ®i lÆp
l¹i nh− vËy, C++ hç trî kh¸i niÖm khu«n mÉu (template).
Khu«n mÉu cho phÐp ta ®Þnh nghÜa mét c«ng viÖc cã tÝnh chÊt
tæng qu¸t , chung chung, ®Ó tõ ®ã cã thÓ t¹o nªn hµng lo¹t nh÷ng c«ng
viÖc cô thÓ theo mét c¸ch nµo ®ã. Cã hai khu«n mÉu: hµm mÉu
(function template) vµ líp mÉu (class template).
7.7.1. T¹o mét hμm khu«n mÉu
Ta ®· biÕt ®Þnh nghÜa chång hµm cho phÐp dïng mét tªn duy nhÊt
cho nhiÒu hµm thùc hiÖn c¸c c«ng viÖc kh¸c nhau. Kh¸i niÖm khu«n
h×nh hµm còng cho phÐp sö dông cïng mét tªn duy nhÊt ®Ó thùc hiÖn
c¸c c«ng viÖc kh¸c nhau, tuy nhiªn so víi ®Þnh nghÜa chång hµm, nã
cã phÇn m¹nh h¬n vµ chÆt chÏ h¬n; m¹nh h¬n v× chØ cÇn viÕt ®Þnh
nghÜa khu«n h×nh hµm mét lÇn, råi sau ®ã ch−¬ng tr×nh biªn dÞch lµm
cho nã thÝch øng víi c¸c kiÓu d÷ liÖu kh¸c nhau; chÆt chÏ h¬n bëi v×
186 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

dùa theo khu«n h×nh hµm, tÊt c¶ c¸c hµm thÓ hiÖn ®−îc sinh ra bëi
tr×nh biªn dÞch sÏ t−¬ng øng víi cïng mét ®Þnh nghÜa vµ nh− vËy sÏ cã
cïng mét gi¶i thuËt.
Khai b¸o vμ ®Þnh nghÜa hμm mÉu
template <class Etype1, class Etype2,... )
return_type func_name ( Etype1 v1, Etype2 v2,...)
{ // néi dung hμm
}
VÝ dô: Gi¶ thiÕt r»ng chóng ta cÇn viÕt mét hµm min ®−a ra gi¸ trÞ
nhá nhÊt trong hai gi¸ trÞ cã cïng kiÓu. Ta cã thÓ viÕt mét ®Þnh nghÜa
nh− thÕ ®èi víi kiÓu int nh− sau:
int min (int a, int b) {
if (a < b) return a;
else return b; }
Gi¶ sö, ta l¹i ph¶i viÕt ®Þnh nghÜa hµm min() cho kiÓu double,
float, char, char*...
float min(float a, float b) {
if (a < b) return a;
return else b; }
NÕu tiÕp tôc nh− vËy, sÏ cã khuynh h−íng ph¶i viÕt rÊt nhiÒu ®Þnh
nghÜa hµm hoµn toµn t−¬ng tù nhau; chØ cã kiÓu d÷ liÖu c¸c tham sè lµ
thay ®æi. C¸c ch−¬ng tr×nh biªn dÞch C++ hiÖn cã cho phÐp gi¶i quyÕt
®¬n gi¶n vÊn ®Ò trªn b»ng c¸ch ®Þnh nghÜa mét khu«n h×nh hµm duy
nhÊt theo c¸ch nh− sau:
#include <iostream.h>
//t¹o mét khu«n h×nh hµm
template <class T> T min(T a, T b)
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 187

{
if (a < b) return a;
else return b;
}
So s¸nh víi ®Þnh nghÜa hµm th«ng th−êng, ta thÊy chØ cã dßng ®Çu
tiªn bÞ thay ®æi:
template <class T> T min (T a, T b)
trong ®ã:
template <class T>: x¸c ®Þnh r»ng ®ã lµ mét khu«n h×nh víi mét
tham sè kiÓu T;
PhÇn cßn l¹i: T min(T a, T b): nãi r»ng, min() lµ mét hµm víi hai
tham sè h×nh thøc kiÓu T vµ cã gi¸ trÞ tr¶ vÒ còng lµ kiÓu T.
7.7.2. Sö dông hμm khu«n mÉu
Hμm khu«n mÉu cho kiÓu d÷ liÖu c¬ së
§Ó sö dông hµm khu«n mÉu min() võa t¹o ra, chØ cÇn sö dông
hµm min() trong nh÷ng ®iÒu kiÖn phï hîp (ë ®©y cã nghÜa lµ hai tham
sè cña hµm cã cïng kiÓu d÷ liÖu). Nh− vËy, nÕu trong mét ch−¬ng
tr×nh cã hai tham sè nguyªn n vµ p, víi lêi gäi min(n,p) ch−¬ng tr×nh
biªn dÞch sÏ tù ®éng s¶n sinh ra hµm min() (ta gäi lµ mét hµm thÓ
hiÖn) t−¬ng øng víi hai tham sè kiÓu nguyªn int. NÕu chóng ta gäi
min() víi hai tham sè kiÓu float, ch−¬ng tr×nh biªn dÞch còng sÏ tù
®éng s¶n sinh mét hµm thÓ hiÖn min kh¸c t−¬ng øng víi c¸c tham sè
kiÓu float vµ cø thÕ.
Hμm khu«n mÉu min víi kiÓu d÷ liÖu líp
§Ó ¸p dông hµm khu«n mÉu min() ë trªn víi kiÓu líp, cÇn ph¶i
®Þnh nghÜa líp sao cho cã thÓ ¸p dông phÐp to¸n so s¸nh “<” víi c¸c
®èi t−îng cña líp nµy, nghÜa lµ ta ph¶i ®Þnh nghÜa mét hµm to¸n tö
operator < cho líp.
188 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

VÝ dô: X©y dùng líp mÉu SWAP gåm 2 thµnh phÇn d÷ liÖu cã
kiÓu bÊt kú vµ cho phÐp ho¸n ®æi gi¸ trÞ cña 2 thµnh phÇn d÷ liÖu ®ã.
# include <iostream.h>
# include <conio.h>
template <class Etype>
class SWAP
{ Etype x,y ;
public:
SWAP (Etype a, Etype b) { x = a ; y = b ; }
void swap ();
void print ();
};
template <class Etype>
void SWAP <Etype> :: swap ()
{ Etype z = x ; x = y; y = z ;}
template <class Etype>
void SWAP <Etype> :: print ()
{ cout << " x = "<<x<<" y = " << y << endl; }
int main ()
{ SWAP <int> s1(4, 5);
SWAP <char> s2 ('A', 'M') ;
s1.print () ; s1.swap () ; s1.print () ;
s2.print () ; s2.swap () ; s2.print () ;
return 0 ;
}
Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng 189

Bài tập chương 7

1. H·y x©y dùng líp ®Ó l−u tr÷ b¶n ghi vÒ c¸ nh©n, bao gåm c¸c thµnh
phÇn d÷ liÖu sau:
char name[25];
float salary;
char date_of_birth[9];
H·y t¹o lËp hai cÊu tö, mét khëi ®éng b¶n ghi bëi c¸c gi¸ trÞ hîp
lÖ vµ mét cÊu tö kh¸c t¹o lËp b¶n ghi rçng. T¹o lËp hµm thµnh phÇn ®Ó
hiÓn thÞ tªn, l−¬ng vµ ngµy sinh cña tõng c¸ nh©n.
2. Cho tr−íc ch−¬ng tr×nh nh− sau:
#include <iostream.h>
main()
{
cout<< “Lop hoc C/C++”;
}
H·y söa ®æi ch−¬ng tr×nh trªn nh−ng vÉn gi÷ nguyªn hµm main()
®Ó ch−¬ng tr×nh cã thÓ hiÓn thÞ trªn mµn h×nh nh− sau:
HVAN don chao Lop hoc C/C++
3. X©y dùng líp tªn box. Hµm cÊu tö cña nã nhËn ba gi¸ trÞ kiÓu
double lµ kÝch th−íc ba chiÒu cña khèi h×nh hép. Líp cã hµm tÝnh
thÓ tÝch cña hép vµ hµm hiÓn thÞ thÓ tÝch cña mçi ®èi t−îng.
4. X©y dùng hµm cã tªn min() chÊp nhËn ®èi sè lµ sè vµ cho l¹i gi¸ trÞ
nhá nhÊt gi÷a hai sè. H·y n¹p chång hµm min() ®Ó chÊp nhËn x©u
ký tù lµm ®èi sè.
190 Gi¸o tr×nh Ng«n ng÷ lËp tr×nh C/C++

5. X©y dùng líp ph©n sè cho phÐp thùc hiÖn c¸c phÐp to¸n sè häc
Session
- Khi hiÖn ra th«ng b¸o cã l−u Session hiÖn t¹i hay kh«ng →
Chän No.
- Vµo Session → Import→ From SAM file, sau ®ã nhÊn Browse,
chän tÖp SAM trong th− môc C:\WINOWS\SYSTEM32\CONFIG,
ch−¬ng tr×nh sÏ hiÖn ra mËt khÈu t×m ®−îc.
TÀI LIỆU THAM KHẢO

TiÕng Anh
1. Borland, Borland C++ 3.0 User’s Guide, Borland Pub, 1992.
2. Borland, Borland C++ 3.0 Programmer’s Guide, Borland Pub, 1992.
3. Greg Pery, C++ by Example, Que, 1992.
4. Herbert Schildt, Teach Yourself C++, Second Edition, Osborne
McGraw-hill, 1994.
5. The C programming language, ANSI, W.Kernighan and D.M.Ritchie,
Prentice Hall, 1988.
6. Mark Allen Weiss - Florida Internationnal University, 1998,
"Algorithms, data Structures and Problem Solving with C++"
Addison - Wesley Publishing Company, Inc.
7. Scott Robert Ladd - United States of America, 1996, "C++:
Commponents And Algorithms", M&T Books. A Division of MIS:
Press, Inc. A Subsidiary of Henry Holt and Company, Inc. 15 Wec
18th Street. New York, New York 10011.

TiÕng ViÖt
8. Gi¸o tr×nh lý thuyÕt & Bμi tËp ng«n ng÷ C (tËp 1, 2), NguyÔn §×nh Tª
- Hoµng §øc H¶i, Nhµ xuÊt b¶n Lao ®éng X· héi, 2009.
9. Gi¸o tr×nh lËp tr×nh h−íng ®èi t−îng víi C++, Vò Thanh HiÒn, Nhµ
xuÊt b¶n Thèng kª, 2003.
10. 101 thuËt to¸n vμ ch−¬ng tr×nh b»ng ng«n ng÷ C, Lª V¨n Doanh -
TrÇn Kh¾c TuÊn - Lª §×nh Anh, Nhµ xuÊt b¶n Khoa häc vµ Kü
thuËt, 2002.
11. LËp tr×nh trªn ng«n ng÷ C, Hoµng ChÝ Thµnh, Nhµ xuÊt b¶n Khoa
häc vµ Kü thuËt, 2009.
12. LËp tr×nh h−íng ®èi t−îng víi C++, NguyÔn ChÝ Trung (chñ biªn),
Nhµ xuÊt b¶n Hµ Néi, 2005.
13. Bμi tËp lËp tr×nh h−íng ®èi t−îng víi C++, NguyÔn Thanh Thñy
(chñ biªn), nhµ xuÊt b¶n khoa häc vµ kü thuËt, 2004.
14. Gi¸o tr×nh Tin häc ®¹i c−¬ng A2, Lª Hoµi B¾c (chñ biªn), Nhµ
xuÊt b¶n ®¹i häc Quèc gia TP. Hå ChÝ Minh, 2006.
MỤC LỤC

Lêi nãi ®Çu............................................................................................3

Ch−¬ng 1: Giíi thiÖu C/C++ ..............................................................5


1.1. LÞch sö C/C++............................................................................5
1.2. Ch−¬ng tr×nh m¸y tÝnh lµ g×? .....................................................5
1.3. CÊu tróc ch−¬ng tr×nh C/C++.....................................................7
1.4. C¸c ký hiÖu c¬ b¶n trong ng«n ng÷ C......................................10
1.5. C¸c tõ khãa cña ng«n ng÷ C ....................................................11
1.6. C¸c më réng cña C++ ..............................................................12
1.7. BiÕn vµ h»ng.............................................................................16
1.8. M¶ng ký tù vµ x©u ký tù ..........................................................21
1.9. C¸c lÖnh ®iÒu khiÓn tiÒn dÞch ch−¬ng tr×nh .............................23
1.10. C¸c lÖnh vµo/ra ®¬n gi¶n........................................................25
Bμi tËp ch−¬ng 1 .............................................................................34

Ch−¬ng 2: Sö dông c¸c phÐp to¸n cña C/C++................................36


2.1. BiÓu thøc ..................................................................................36
2.2. C¸c phÐp to¸n sè häc ...............................................................37
2.3. C¸c phÐp to¸n quan hÖ vµ logic ...............................................38
2.4. LÖnh if, else .............................................................................40
2.5. C¸c phÐp to¸n kh¸c ..................................................................44
2.6 Thø tù −u tiªn thùc hiÖn c¸c phÐp tÝnh......................................47
Bμi tËp ch−¬ng 2 .............................................................................51
Ch−¬ng 3: Sö dông c¸c lÖnh cña C/C++ .........................................53
3.1 C¸c vßng lÆp while, do-while, for .............................................53
3.2. C¸c lÖnh nh¶y...........................................................................64
3.3. Hµm vµ ch−¬ng tr×nh con.........................................................70
Bμi tËp ch−¬ng 3 .............................................................................94

Ch−¬ng 4: M¶ng vμ con trá..............................................................97


4.1. KiÓu d÷ liÖu m¶ng vµ xö lý m¶ng ............................................97
4.2. M¶ng nhiÒu chiÒu ..................................................................101
4.3. C¸c vÝ dô vÒ m¶ng..................................................................102
4.4. Con trá vµ biÕn ®éng..............................................................107
4.5. Con trá vµ m¶ng.....................................................................111
Bμi tËp ch−¬ng 4 ...........................................................................115

Ch−¬ng 5: CÊu tróc vμ vμo/ra tÖp .................................................117


5.1 CÊu tróc, hîp nhÊt ...................................................................117
5.2. M¶ng cÊu tróc ........................................................................125
5.3. C¸c thao t¸c vµo/ra tÖp ...........................................................126
Bμi tËp ch−¬ng 5 ...........................................................................134

Ch−¬ng 6: Kü thuËt ®å häa trong C/C++ .....................................136


6.1. Giíi thiÖu hÖ thèng ®å häa.....................................................136
6.2. Nh÷ng c¬ së ®å häa cña m¸y PC ...........................................137
6.3. M« h×nh ®å häa trong Turbo C/C++ ......................................140
6.4. VÝ dô vÒ vÏ ®å häa .................................................................146
Bμi tËp ch−¬ng 6 ...........................................................................149

Ch−¬ng 7: Giíi thiÖu lËp tr×nh h−íng ®èi t−îng ..........................150


7.1. Kh¸i niÖm vÒ lËp tr×nh h−íng ®èi t−îng (OPP) .....................150
7.2. Mét sè kh¸i niÖm míi trong lËp tr×nh h−íng ®èi t−îng ................156
7.3. Líp vµ c¸c thµnh phÇn cña líp...............................................160
7.4. CÊp ph¸t bé nhí ®éng - c¸c thµnh phÇn tÜnh - Friend .............169
7.5. Thõa kÕ vµ ®a h×nh.................................................................177
7.6. N¹p chång to¸n tö vµ hµm chuyÓn ®æi...................................181
7.7. C¸c hµm mÉu (template) ........................................................185
Bμi tËp ch−¬ng 7 ...........................................................................189
Tμi liÖu tham kh¶o ...........................................................................191
M· sè: GD 14 HM 11

ChÞu tr¸ch nhiÖm xuÊt b¶n


NGUYÔN THÞ THU Hμ

Biªn tËp: NG¤ Mü H¹NH


TrÞnh THU CH¢U
Tr×nh bμy s¸ch: BïI CH¢U LOAN
Söa b¶n in: TRÞNH THU CH¢U
ThiÕt kÕ b×a: TRÇN HåNG MINH

NHμ XUÊT B¶N TH¤NG TIN Vμ TRUYÒN TH¤NG


Trô së: 18 NguyÔn Du, TP. Hμ Néi
§T Biªn tËp: 04.35772143, 04.35772145 §T Ph¸t hμnh: 04.35772138
E-mail: nxb.tttt@mic.gov.vn Fax: 04.35772037
Website: www.nxbthongtintruyenthong .vn
Chi nh¸nh TP. Hå ChÝ Minh: 8A ®−êng D2, P25, QuËn B×nh Th¹nh, TP. Hå ChÝ Minh
§iÖn tho¹i: 08.35127750, 08.35127751 Fax: 08.35127751
E-mail: cnsg.nxbtttt@ mic.gov.vn
Chi nh¸nh TP. §μ N½ng: 42 TrÇn Quèc To¶n, QuËn H¶i Ch©u, TP. §μ N½ng
§iÖn tho¹i: 0511.3897467 Fax: 0511.3843359
E-mail: cndn.nxbtttt@ mic.gov.vn

In 1000 b¶n, khæ 16x24cm t¹i C«ng ty In H¶i Nam


Sè ®¨ng ký kÕ ho¹ch xuÊt b¶n: 410-2011/CXB/3-102/TTTT
Sè quyÕt ®Þnh xuÊt b¶n: 141/Q§-NXB TTTT ngμy 23 th¸ng 6 n¨m 2011
In xong vμ nép l−u chiÓu th¸ng 7 n¨m 2011

You might also like