Professional Documents
Culture Documents
Giáo trình Ngôn ngữ lập trình CC++ PDF
Giáo trình Ngôn ngữ lập trình CC++ PDF
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
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.
§Ó 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
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
}
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ã.
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;
}
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.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
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
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ù.
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”[].
§Ó 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
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
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);
}
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;
}
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
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 */
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.
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
⎧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
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++
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++
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
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
Sai
Biểu thức
Đúng
Lệnh Thoát
#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++
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ô 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)!
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();
}
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();
}
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++
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
(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();
}
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++
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++
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();
}
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();
}
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
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++
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));
}
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
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
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
<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++
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á.
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
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;}
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.
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++
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
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
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
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);
}
}
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
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
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.
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
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
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
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.
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
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
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);}
ý 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
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
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
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)
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
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++
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++
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
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++
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
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;
}
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
}
# 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
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.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ô:
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
§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.
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.
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
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