Professional Documents
Culture Documents
--- ---
Hµ néi – 8/2004
2. C++ vµ lËp tr×nh Híng ®èi tîng - GS. TS. Ph¹m v¨n Êt.
3. Kü thuËt lËp tr×nh - NguyÔn TiÕn Huy – TrÇn H¹nh Nhi.
4. Ng«n ng÷ lËp tr×nh C++ - Ng« Trung ViÖt.
….
Ch¬ng I. Giíi thiÖu vÒ ng«n ng÷ lËp tr×nh C++
- Bá b«i ®en khèi: §a con trá lªn trªn ®o¹n b«i ®en vµ bÊm tæ hîp phÝm
Ctrl + K + K ®Ó bá b«i ®en
Chó ý: Kh¸c víi ng«n ng÷ Pascal, ng«n ng÷ C++ cã ph©n biÖt ch÷ hoa
vµ ch÷ thêng.
§Ó ghi c¸c dßng chó thÝch, sö dông dÊu // t¹i ®Çu dßng hoÆc ®Æt
®o¹n chó thÝch nh sau: /* ®o¹n chó thÝch */
[5]. DÞch ch¬ng tr×nh: BÊm phÝm F9 ®Ó dÞch ch¬ng tr×nh. NÕu ch¬ng
tr×nh cã lçi, ch¬ng tr×nh dÞch sÏ b¸o lçi. Ch¬ng tr×nh chØ thùc thi ®îc nÕu
kh«ng cã lçi.
[6]. Thùc thi ch¬ng tr×nh: BÊm tæ hîp phÝm Ctrl + F9 ®Ó thùc thi ch¬ng
tr×nh.
[7]. §Æt ®êng dÉn tíi c¸c th viÖn: Trong mét ch¬ng tr×nh viÕt b»ng ng«n ng÷
C++ thêng sö dông c¸c hµm trong c¸c th viÖn kh¸c nhau. Th«ng thêng, c¸c th
viÖn ®Æt trong c¸c th môc TC\INCLUDE hoÆc TC\ LIB. M«i trêng lËp tr×nh
C++ tù thiÕt ®Æt ®êng dÉn tíi c¸c th viÖn nµy. Tuy nhiªn, trong trêng hîp ®-
êng dÉn bÞ thay ®æi, ta cÇn ph¶i thiÕt ®Æt l¹i.
B1: Trong Menu chÝnh, chän Option\ Directories.
B2: Trong Include, ®Æt ®êng dÉn tíi c¸c th viÖn cã ®u«i .h. Trong
Libraries, ®Æt ®êng dÉn tíi c¸c th viÖn ®u«i .lib.
2. C¸c kiÓu d÷ liÖu c¬ b¶n trong C++
Trong C++ cã sö dông mét sè kiÓu d÷ liÖu c¬ b¶n sau:
a. KiÓu sè: bao gåm
+ Sè nguyªn ng¾n int: lµ kiÓu d÷ liÖu cã ®é dµi 2 byte, dïng ®Ó khai
b¸o c¸c biÕn nguyªn cã gi¸ trÞ trong kho¶ng –32768 -> 32767
+ Sè nguyªn ng¾n kh«ng dÊu: unsign int: ®é dµi 2 byte, khai b¸o c¸c
biÕn nguyªn cã gi¸ trÞ tõ 0 tíi 65535.
+ Sè nguyªn dµi long: lµ kiÓu d÷ liÖu cã ®é dµi 4 byte, dïng khai b¸o c¸c
biÕn nguyªn cã gi¸ trÞ trong kho¶ng – 2.147.483.648 -> 2.147.483.647.
+ Sè nguyªn dµi kh«ng dÊu: unsign long: ®é dµi 4 byte, khai b¸o c¸c biÕn
cã gi¸ trÞ tõ 0 tíi 4.294.967.295.
+ Sè thùc (dÊu ph¶y ®éng) float: kÝch thíc 4 byte khai b¸o c¸c biÕn thùc
tõ 3.4*10-38 -> 3.4*1038.
+ Sè thùc double: kÝch thíc 8 byte, cã ph¹m vi tõ 1.7*10-308 - > 1.7*10308
+ Sè thùc (dÊu ph¶y ®éng, ®é chÝnh x¸c kÐp) dµi: long double: kÝch th-
íc 10 byte, khai b¸o c¸c biÕn tõ 3.4 * 10-4932 tíi 1.1 * 104932.
b. KiÓu ký tù: bao gåm
+ KiÓu ký tù char: khai b¸o biÕn chøa mét ký tù.
+ KiÓu con trá ký tù char *: t¬ng ®¬ng víi chuçi ký tù.
3. BiÕn vµ c¸ch khai b¸o biÕn
§Ó khai b¸o biÕn trong C++ ta dïng có ph¸p sau:
<kiÓu d÷ liÖu> <tªn biÕn> <;>
Trong ®ã:
- <KiÓu d÷ liÖu>: cã thÓ lµ mét trong c¸c kiÓu d÷ liÖu chuÈn, cã thÓ lµ
c¸c kiÓu tù ®Þnh nghÜa.
- <Tªn biÕn>: ®îc ®Æt tu©n theo quy t¾c ®Æt tªn biÕn trong ng«n ng÷
lËp tr×nh Pascal.
- C¸c biÕn c¸ch nhau bëi dÊu ph¶y, c¸c khai b¸o c¸ch nhau bëi dÊu chÊm
ph¶y.
VD: int a, b, c;
long so;
char * s;
Chó ý: cã thÓ khai b¸o biÕn t¹i bÊt kú ®©u trong ch¬ng tr×nh vµ tríc
khi sö dông.
4. CÊu tróc mét ch¬ng tr×nh ®¬n gi¶n
Mét ch¬ng tr×nh ®¬n gi¶n trong C++ thêng cã cÊu tróc nh sau:
//Khai b¸o c¸c th viÖn sö dông trong ch¬ng tr×nh.
#include <Tªn th viÖn>
….
main() //tªn hµm chÝnh
{
// NhËp d÷ liÖu
// TÝnh to¸n
// In c¸c kÕt qu¶
}
VD1. xÐt ®o¹n tr×nh sau:
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
int a, b; //khai b¸o hai biÕn nguyªn a, b
cout<<”nhËp sè nguyªn a “;
cin>>a;
cout<<“nhËp sè nguyªn b”;
cin>>b;
int c;
c = a+b;
cout<<”Tæng cña a + b lµ “<<c;
getch();
return 0;
}
Trong vÝ dô trªn, ta cã:
- C¸c c©u lÖnh #include <tªn th viÖn.h>: khai b¸o mét sè th viÖn sÏ sö
dông. C¸c th viÖn nµy cã chøa s½n c¸c hµm sÏ sö dông trong ch¬ng tr×nh.
Ch¼ng h¹n th viÖn iostream.h chøa c¸c hµm cout, cin…
- Tõ khãa main() ®Ó b¾t ®Çu th©n ch¬ng tr×nh chÝnh.
- C¸c ký tù {, } ®Ó b¾t ®Çu vµ kÕt thóc mét khèi lÖnh trong ch¬ng
tr×nh. C¸c ký tù nµy t¬ng tù c¸c tõ khãa nµy Begin vµ End trong Pascal.
- clrscr(); lµ mét lêi gäi hµm xãa mµn h×nh. Hµm n·y ®· cã s½n trong th
viÖn stdio.h. CÇn lu ý c¸ch gäi hµm kh«ng ®èi, kh¸c víi Pascal.
- C¸c lÖnh cout, cin cã s½n trong th viÖn iostream.h cho phÐp in lªn mµn
h×nh c©u th«ng b¸o vµ nhËn gi¸ trÞ nhËp vµo tõ bµn phÝm cho hai biÕn a,
b. chóng t¬ng tù nh lÖnh Write vµ Read trong Pascal.
- LÖnh getch() cã trong th viÖn conio.h cho phÐp dõng mµn h×nh l¹i ®Ó
xem kÕt qu¶. Mµn h×nh sÏ dõng cho tíi khi mét phÝm bÊt kú ®îc bÊm.
- LÖnh return 0; dïng ®Ó chØ ra kÕt qu¶ tr¶ vÒ cña hµm.
VD2. ViÕt ch¬ng tr×nh nhËp vµo hai sè nguyªn a, b sau ®ã in ra mµn
h×nh tæng, hiÖu, tÝch, th¬ng cña hai sè nguyªn ®ã.
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
int a, b; //khai b¸o hai biÕn nguyªn a, b
cout<<”nhËp sè nguyªn a “;
cin>>a;
cout<<“nhËp sè nguyªn b”;
cin>>b;
int T, H, TI, TH;
T = a+b;
H = a-b;
TI = a*b;
TH= a/b;
cout<<”Tæng cña a + b lµ “<<T;
cout<<”HiÖu cña a + b lµ “<<H;
cout<<”TÝch cña a + b lµ “<<TI;
cout<<”Th¬ng cña a + b lµ “<<TH;
getch();
return 0;
}
Chó ý: Trong C++, th¬ng cña hai sè nguyªn lµ mét sè nguyªn.
5. C¸c lÖnh nhËp xuÊt
a. C¸c lÖnh nhËp xuÊt trong IOStream.h
- LÖnh xuÊt: Có ph¸p
cout<< <Néi dung cÇn xuÊt>;
Trong ®ã:
<<: ®îc gäi lµ to¸n tö xuÊt.
<Néi dung cÇn xuÊt>: cã thÓ lµ H»ng ký tù, H»ng x©u ký tù, BiÕn,
Hµm, ph¬ng thøc ®Þnh d¹ng.
VD: cout<<”Sin(x) = “;
cout<<Sin(x);
Chó ý: - cã thÓ sö dông liªn tiÕp nhiÒu to¸n tö xuÊt trªn mét dßng cout.
VD: cout<<”Gi¸ trÞ cña a[“<<i<<”] lµ “<<a[i];
C¸c lÖnh cout, cin chØ thÝch hîp cho viÖc nhËp xuÊt c¸c biÕn kiÓu sè.
Víi c¸c biÕn kiÓu x©u ký tù th× x©u nhËp, xuÊt ph¶i kh«ng chøa dÊu c¸ch.
Trong ®ã:
>>: ®îc gäi lµ to¸n tö nhËp.
Dßng cin dïng ®Ó nhËp c¸c gi¸ trÞ (th«ng thêng lµ) tõ bµn phÝm vµo
c¸c biÕn.
VD: cout<<”NhËp gi¸ trÞ cña a”;
cin>>a;
Chó ý: cã thÓ dïng liªn tiÕp nhiÒu to¸n tö nhËp trªn mét dßng cin ®Ó
nhËp gi¸ trÞ cho nhiÒu biÕn.
cin>>a>>b>>c;
Bµi tËp vÝ dô: ViÕt ch¬ng tr×nh nhËp vµo mét sè thùc x, in ra mµn
h×nh gi¸ trÞ cña F(x) = sin2(x) + cos(x) víi ®é chÝnh x¸c 2 ch÷ sè sau dÊu
ph¶y.
#include <conio.h>
#include <math.h>
#include <iostream.h>
void main()
{
clrscr();
float x, F;
cout<<”nhËp sè thùc a “;
cin>>x
cout.precision(2);
cout<<”Gi¸ trÞ F(“<<x<<”) = “<<sin(x)*sin(x) + cos(x);
getch();
}
b. C¸c lÖnh nhËp xuÊt trong Stdio.h
LÖnh xuÊt: printf.
Có ph¸p: printf(“ chuçi cÇn xuÊt “, <BiÕn 1>, <BiÕn 2>…);
Trong ®ã: “ Chuçi cÇn xuÊt” cã thÓ lµ:
- H»ng ký tù, h»ng x©u ký tù: Lµ c¸c ký tù cÇn in lªn mµn h×nh.
- C¸c ®Æc t¶ hay ký tù ®¹i diÖn, bao gåm:
%d: ®¹i diÖn cho biÕn nguyªn.
%f: ®¹i diÖn cho biÕn thùc.
%c: ®¹i diÖn cho biÕn kiÓu ký tù (mÆc ®Þnh).
…
- Mçi biÕn cÇn ®a ra mµn h×nh cÇn cã mét ®Æc t¶ t¬ng øng t¹i vÞ trÝ
muèn ®a ra.
VD: CÇn ®a ra c¸c gi¸ trÞ cña c¸c biÕn a, b, c kiÓu nguyªn, ta viÕt:
printf (“ Gi¸ trÞ cña a b c la %d %d %d, a, b, c);
LÖnh nhËp: scanf.
Có ph¸p: scanf(“chuçi c¸c ®Æc t¶”, <&BiÕn 1>, <&biÕn 2>…);
Trong ®ã, mçi biÕn cÇn ph¶i cã mét ®Æc t¶ t¬ng øng. LÖnh scanf
nhËp gi¸ trÞ vµo c¸c biÕn th«ng qua ®Þa chØ cña biÕn.
c. C¸c lÖnh nhËp xuÊt trong Conio.h
LÖnh xuÊt: puts.
Có ph¸p: puts(p);
Trong ®ã p lµ mét con trá, trá tíi mét ký tù hoÆc h»ng x©u ký tù. NÕu p
lµ biÕn chøa 1 ký tù th× p ph¶i cã kiÓu char *, nÕu p lµ kiÓu char th× ph¶i lµ
mét m¶ng kiÓu char.
LÖnh puts sÏ ®a c¸c ký tù ®îc con trá p trá tíi lªn mµn h×nh.
VD:
char * p = “a”;
puts(p);// ®a ký tù a ra mµn h×nh
char q[100] = “Ha Noi”;
puts(q);// ®a Ha Noi ra mµn h×nh.
LÖnh nhËp: gets().
Có ph¸p: gets(p);
Trong ®ã, p lµ biÕn con trá ký tù, nh vËy, p ph¶i cã kiÓu char * . NÕu p
lµ biÕn kiÓu char th× ph¶i lµ mét biÕn m¶ng kiÓu char. (char * p hoÆc char
p[])
C¸c lÖnh gets, puts thÝch hîp cho viÖc nhËp xuÊt c¸c biÕn kiÓu x©u
ký tù.
6. BiÓu thøc trong C++
Mét biÓu thøc th«ng thêng ®îc cÊu thµnh tõ hai thµnh phÇn: c¸c to¸n tö
vµ c¸c to¸n h¹ng.
a. C¸c to¸n tö: ®îc t¹m chia lµm 3 lo¹i
C¸c to¸n tö sè häc
Trong C++ sö dông c¸c to¸n tö sè häc cho trong b¶ng sau:
Có ph¸p:
(m« pháng mÖnh ®Ò 1)
if (<biÓu thøc ®iÒu kiÖn>)
<LÖnh>;
(M« pháng mÖnh ®Ò 2)
if (<biÓu thøc ®iÒu kiÖn>)
<LÖnh 1>;
else
<LÖnh 2>;
ý nghÜa:
[1]. nÕu <biÓu thøc ®iÒu kiÖn> nhËn gi¸ trÞ ®óng, sÏ thùc hiÖn
<LÖnh>, ngîc l¹i, bá qua lÖnh if.
[2]. nÕu <biÓu thøc ®iÒu kiÖn> nhËn gi¸ trÞ ®óng, sÏ thùc hiÖn
<LÖnh 1>, ngîc l¹i, nÕu <biÓu thøc ®iÒu kiÖn> nhËn gi¸ trÞ sai sÏ thùc hiÖn
<LÖnh 2>.
Chó ý:
- BiÓu thøc ®iÒu kiÖn ®îc ®Æt gi÷a hai dÊu ngoÆc ®¬n “(“ “)”.
- C©u lÖnh tríc else cã dÊu “;”.
- <LÖnh 1> vµ <LÖnh 2> cã thÓ lµ mét khèi lÖnh. C¸c khèi lÖnh ®îc
®Æt trong hai dÊu { }.
VD: LËp ch¬ng tr×nh nhËp vµo mét sè nguyªn. KiÓm tra tÝnh ch½n lÎ
cña sè ®ã vµ th«ng b¸o ra mµn h×nh.
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr(); int a;
cout<< “nhËp sè nguyªn a ”;
cin>>a;
if (a%2 = = 0)
cout<<”sè “<<a<<” ch½n”;
else
cout<<”sè “<<a<<” lΔ;
getch();
}
C¸c lÖnh if cã thÓ lång nhau theo nghÜa: C¸c c©u lÖnh bªn trong mét
mÖnh ®Ò if l¹i cã thÓ lµ c¸c mÖnh ®Ò if. C¸c mÖnh ®Ò if lång nhau t¬ng ®-
¬ng víi mét mÖnh ®Ò if mµ biÓu thøc ®iÒu kiÖn cña nã lµ sù kÕt hîp biÓu
c¸c biÓu thøc ®iÒu kiÖn cña c¸c mÖnh ®Ó if lång nhau theo phÐp vµ (AND).
Mçi lÖnh if ®ñ sÏ cho phÐp lùa chän 2 kh¶ n¨ng ®Ó thùc hiÖn. Trong
trêng hîp cã n kh¶ n¨ng lùa chän, ta cã thÓ sö dông n-1 lÖnh if ®ñ lång nhau.
VD: ViÕt ch¬ng tr×nh thùc hiÖn viÖc nhËp vµo sè tiÒn cña kh¸ch hµng
ph¶i tr¶. NÕu sè tiÒn tõ 300000 tíi 400000, khuyÕn m¹i 20%. NÕu sè tiÒn tõ
400000 trë lªn, khuyÕn m¹i 30%. C¸c trêng hîp kh¸c kh«ng ®îc khuyÕn m¹i.
TÝnh vµ in sè tiÒn khuyÕn m¹i cña kh¸ch lªn mµn h×nh.
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
int T, km;
cout<<”NhËp sè tiÒn “;
cin>>T;
if (T>=300000 && T <=400000)
km = 20*T/100;
else
if (T>40000)
km = 30*T/100;
else
km = 0;
cout<<”Sè tiÒn khuyÕn m¹i “<<km;
getch();
}
NÕu c¸c kh¶ n¨ng lµ lo¹i trõ nhau th× kh«ng khi ®ã cã thÓ sö dông c¸c
lÖnh if lång nhau hoÆc cã thÓ sö dông n lÖnh if rêi nhau cho n kh¶ n¨ng lùa
chän. Trêng hîp ngîc l¹i, th× nhÊt thiÕt ph¶i sö dông c¸c lÖnh if rêi nhau.
VD: ViÕt ch¬ng tr×nh nhËp vµo ®iÓm tæng kÕt vµ xÕp lo¹i ®¹o ®øc
cña mét sinh viªn. Sau ®ã tÝnh sè tiÒn häc bæng cho sinh viªn ®ã nh sau:
NÕu tæng kÕt >=7.00 th× ®îc 300000.
NÕu ®iÓm tæng kÕt >=9.00 vµ ®¹o ®øc = “T” th× ®îc céng thªm
100000.
XÐt ®o¹n tr×nh sau:
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
float tk;
char * hk;
long T;
cout<<”Nhap ®iÓm tong ket”;
cin>>tk;
cout<<”Nhap hanh kiem”;
cin>>hk;
T=0;
if (tk >= 7.0)
T = 30000;
else
if (tk>=9.0 && hk = = “T”)
T += 100000;
cout<<”Häc bæng ” <<T;
getch();
}
§o¹n tr×nh trªn sÏ cho kÕt qu¶ sai trong trêng hîp sinh viªn tæng kÕt
>=9.0 vµ ®¹o ®øc tèt. Lý do lµ sö dông hai lÖnh if lång nhau khi c¸c kh¶ n¨ng
kh«ng lo¹i trõ nhau.
§o¹n tr×nh trªn cã thÓ ®îc viÕt l¹i nh sau:
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
float tk;
char * hk;
long T;
cout<<”Nhap ®iÓm tong ket”;
cin>>tk;
cout<<”Nhap hanh kiem”;
cin>>hk;
T=0;
if (tk >= 7.0)
T = 30000;
if (tk>=9.0 && hk = = “T”)
T += 100000;
cout<<”Häc bæng ” <<T;
getch();
}
3. CÊu tróc chän
Trong trêng hîp cã qu¸ nhiÒu kh¶ n¨ng lùa chän vµ c¸c kh¶ n¨ng lo¹i trõ
nhau, nÕu sö dông nhiÒu lÖnh if lång nhau sÏ lµm cho ch¬ng tr×nh phøc t¹p,
khã kiÓm so¸t. V× vËy C++ cung cÊp mét cÊu tróc ®iÒu khiÓn kh¸c sö dông
trong trêng hîp nµy, ®ã lµ cÊu tróc chän.
Có ph¸p:
switch (<BiÕn nguyªn>)
{
case <GT 1><:>
LÖnh 1;
break;
case <GT 2><:>
LÖnh 2;
break;
…
case <GT n><:>
LÖnh n;
break;
[default:
<LÖnh mÆc ®Þnh>;]
}
ý nghÜa:
NÕu <BiÕn nguyªn> nhËn gi¸ trÞ GT1, thùc hiÖn <LÖnh 1>
NÕu <BiÕn nguyªn> nhËn gi¸ trÞ GT2, thùc hiÖn <LÖnh 2>…
NÕu <BiÕn nguyªn> nhËn gi¸ trÞ GTn, thùc hiÖn <LÖnh n>
NÕu cã thµnh phÇn [default:], thùc hiÖn <lÖnh mÆc ®Þnh> khi
biÕn nguyªn kh«ng nhËn gi¸ trÞ nµo trong c¸c gi¸ trÞ trªn.
- S¬ ®å khèi:
BiÕn = LÖnh 1
GT1
BiÕn = LÖnh 2
GT2
BiÕn = LÖnh n
GTn
LÖnh mÆc
®Þnh
Chó ý:
- LÖnh switch chØ thùc hiÖn trªn biÕn nguyªn.
- Mçi tõ kho¸ case chØ lùa chän 1 trêng hîp.
- C¸c c©u lÖnh <LÖnh 1>, <LÖnh 2>… cã thÓ lµ mét khèi lÖnh. Sau
®ã b¾t buéc ph¶i cã tõ khãa <break;> .
- Thµnh phÇn [deffault:] lµ kh«ng b¾t buéc. NÕu cã thµnh phÇn nµy,
<LÖnh mÆc ®Þnh> sÏ ®îc ®îc thùc hiÖn sau khi tÊt c¶ c¸c trêng hîp
case ®Òu kh«ng tháa m·n.
VD1: ViÕt ch¬ng tr×nh nhËp vµo mét th¸ng cña mét n¨m nµo ®ã. In sè
ngµy cña th¸ng ®ã ra mµn h×nh.
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
int T, N;
cout<<”NhËp th¸ng”;
cin>>T;
cout<<”NhËp n¨m “;
cin>>N;
switch (T)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
cout<<”Th¸ng cã 31 ngµy”;
break;
case 4:
case 6:
case 9:
case 11:
cout<<”Th¸ng cã 30 ngµy”;
break;
case 2:
if (N%4 = = 0)
cout<<”Th¸ng cã 28 ngµy”;
else
cout<<”Th¸ng cã 29 ngµy”;
break;
}
getch();
}
VD2: ViÕt ch¬ng tr×nh nhËp vµo m· häc vÞ (lµ mét sè nguyªn) cña mét
nh©n viªn. In ra häc vÞ t¬ng øng víi quy ®Þnh:
M· =1: Cö nh©n.
M· =2: Kü s.
Chó ý:
- C¸c biÓu thøc ®Æt c¸ch nhau bëi dÊy “;”.
- <LÖnh lÆp> cã thÓ lµ mét khèi lÖnh.
- C¸c biÓu thøc cã thÓ khuyÕt nhng c¸c dÊu “;” ph¶i ®îc gi÷ nguyªn.
VD1: ViÕt ch¬ng tr×nh tÝnh n! (n nguyªn)
C¸ch 1: C¸ch th«ng thêng
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
void main()
{
clrscr();
int n; long GT=1;
cout<<”Nhap n “; cin>>n;
for (int i=2;i<=n; i++)
GT*=i;
cout<<n<<” Giai thua : “<<GT;
getch();
}
- Tho¸t tù nhiªn: Khi <BiÓu thøc 2> nhËn gi¸ trÞ sai, ch¬ng tr×nh tù
®éng tho¸t khái vßng for vµ chuyÓn tíi lÖnh tiÕp theo.
- Tho¸t cìng bøc:
+ C¸ch 1: sö dông lÖnh break;
Khi gÆp lÖnh break; trong th©n vßng for, ch¬ng tr×nh sÏ lËp tøc tho¸t
khái vßng lÆp for vµ chuyÓn tíi lÖnh tiÕp theo bÊt kÓ <BiÓu thøc 2> vÉn
nhËn gi¸ trÞ ®óng.
+ C¸ch 2: sö dông lÖnh goto
LÖnh goto cã d¹ng: goto <Nh·n>. Trong ®ã,<Nh·n> cã d¹ng:
<Tªn nh·n> <:>
<Tªn nh·n> tuú ý ®Æt theo quy íc ®Æt tªn trong C.
Khi gÆp lÖnh goto <Nh·n>, ch¬ng tr×nh sÏ nh¶y tíi vÞ trÝ ®Æt nh·n.
NÕu nh·n ®Æt ngoµi vßng for, ch¬ng tr×nh sÏ tho¸t khái vßng for.
CÇn chó ý trong trêng hîp 2 lÖnh for lång nhau, khi ®ã lÖnh break chØ
lµm cho ch¬ng tr×nh tho¸t khái vßng for gÇn nhÊt chøa lÖnh break. Do vËy,
®Ó tho¸t khái c¶ 2 vßng for lång nhau, ta sö dông lÖnh goto.
VD2: xÐt vÝ dô 1 trong trêng hîp thiÕu biÓu thøc 1 vµ/ hoÆc biÓu
thøc 2.
C¸ch 3: ViÕt thiÕu <BiÓu thøc 2> vµ <BiÓu thøc 3> sö dông
break.
void main()
{
clrscr();
int n; long GT=1;
cout<<”Nhap n “; cin>>n;
C¸ch 4: ViÕt thiÕu <BiÓu thøc 2> vµ <BiÓu thøc 3> sö dông goto.
void main()
{
clrscr();
int n; long GT=1;
cout<<”Nhap n “; cin>>n;
#include "conio.h"
#include "iostream.h"
#include "stdio.h"
void main()
{
clrscr();
int x[] = {1, 4, 5, 7, 3, 2}, n;
n=sizeof(x)/ sizeof(int);
for (int i=0, j=n-1; i<n/2; i++, j--)
{
int tg = x[i];
x[i]=x[j];
x[j]=tg;
}
for (i=0; i<n; i ++)
cout<<x[i]<<" ";
getch();
}
NhËn xÐt: C¸c biÓu thøc 1, 2, 3 trong có ph¸p cña vßng for cã thÓ bao
gåm mét d·y c¸c biÓu thøc con, c¸ch nhay bëi dÊu ph¶y. Khi ®ã, sù ®óng/ sai
cña biÓu thøc “mÑ” lµ sù ®óng/ sai cña biÓu thøc con ®Çu tiªn trong d·y.
Nh vËy vßng for trªn cã thÓ viÕt nh sau:
void main()
{
clrscr();
int x[] = {1, 4, 5, 7, 3, 2}, n;
n=sizeof(x)/ sizeof(int);
int tg;
for (int i=0, j=n-1; i<n/2; tg=x[i], x[i]=x[j], x[j]=tg, i++, j--)
{
}
for (i=0; i<n; i ++)
cout<<x[i]<<" ";
getch();
}
b. Vßng lÆp víi sè lÇn lÆp kh«ng x¸c ®Þnh
Trong C++, ta chia vßng lÆp víi sè lÇn lÆp kh«ng x¸c ®Þnh ra lµm hai
lo¹i:
LÆp kiÓm tra ®iÒu kiÖn tríc: Tríc tiªn, kiÓm tra biÓu thøc ®iÒu
kiÖn. NÕu biÓu thøc ®iÒu kiÖn cßn ®óng, sÏ thùc hiÖn lÖnh lÆp. NÕu biÓu
thøc ®iÒu kiÖn sai, ra khái vßng lÆp.
+ S¬ ®å khèi:
Nh vËy: LÖnh lÆp cã thÓ kh«ng ®îc thùc hiÖn lÇn nµo.
+ Có ph¸p:
while (<BiÓu thøc ®iÒu kiÖn>)
<LÖnh lÆp>
ý nghÜa:
B1: KiÓm tra biÓu thøc ®iÒu kiÖn. NÕu biÓu thøc ®iÒu kiÖn sai,
tho¸t ra khái vßng lÆp. NÕu biÓu thøc ®iÒu kiÖn ®óng, chuyÓn qua bíc 2.
B2: Thùc hiÖn <LÖnh lÆp>. Quay l¹i B1.
Chó ý:
- BiÓu thøc ®iÒu kiÖn ph¶i ®Æt trong dÊu “(“ “)”.
- <LÖnh lÆp> cã thÓ lµ mét khèi lÖnh.
- CÇn tr¸nh c¸c trêng hîp lÆp v« h¹n.
VD1: ViÕt ch¬ng tr×nh t×m sè lòy thõa 2 ®Çu tiªn lín h¬n 1000.
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
int So=2;
while (So <=1000)
So *=2;
cout<<”Sè cÇn t×m lµ ”<<So;
getch();
}
VD2: ViÕt ch¬ng tr×nh nhËp vµo ®iÓm ®¹o ®øc cña mét häc sinh
(thang ®iÓm 100, nguyªn) vµ sè ngµy ®i häc muén cña häc sinh ®ã. NÕu häc
sinh ®i häc muén 1 ngµy, trõ 1 ®iÓm. TÝnh vµ in sè ®iÓm cßn l¹i cña häc
sinh.
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
int D, HM;
cout<<”NhËp ®iÓm ®¹o ®øc”;
cin>>D;
cout<<”NhËp sè ngµy ®i häc muén”;
cin>>HM;
while (HM>0)
{
D - -;
HM - -;
}
cout<<”§iÓm cßn l¹i “<<D;
getch();
}
LÆp kiÓm tra ®iÒu kiÖn sau: T¬ng tù nh vßng lÆp kiÓm tra ®iÒu
kiÖn tríc, chØ kh¸c ë chç biÓu thøc ®iÒu kiÖn ®îc kiÓm tra mçi khi ®· thùc
hiÖn lÖnh lÆp. Nh vËy, lÖnh lÆp lu«n ®îc thùc hiÖn Ýt nhÊt mét lÇn.
+ S¬ ®å khèi:
Y
BT§K
®óng?
N
+ Có ph¸p:
do
<LÖnh lÆp;>
while (<BiÓu thøc ®iÒu kiÖn>)
ý nghÜa:
B1: Thùc hiÖn lÖnh lÆp.
B2: KiÓm tra <BiÓu thøc ®iÒu kiÖn>. NÕu <BiÓu thøc ®iÒu kiÖn
®óng, quay l¹i B1. Ngîc l¹i, tho¸t khái vßng lÆp.
Chó ý:
- <LÖnh lÆp> cã thÓ lµ mét khèi lÖnh.
- <BiÓu thøc ®iÒu kiÖn> ph¶i ®îc ®Æt trong dÊu “(“ “)”;
- CÇn tr¸nh c¸c trêng hîp lÆp v« h¹n.
VD1: ViÕt ch¬ng tr×nh t×m sè nguyªn x ®Çu tiªn lín h¬n 5 mµ tháa m·n
sin(x) = 1
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
int x=0;
do
x +=1;
while (x <=5 | | sin(x) !=1)
cout<<”Sè cÇn t×m lµ ”<<x;
getch();
}
VD2: ViÕt ch¬ng tr×nh nhËp vµo mét sè nguyªn x. KiÓm tra xem sè ®ã
®· lín h¬n 10 hay cha. NÕu cha, yªu cÇu nhËp l¹i cho tíi khi sè nhËp vµo lín
h¬n 10. KiÓm tra xem sè ®ã cã ph¶i lµ sè nguyªn tè kh«ng, in kÕt luËn lªn
mµn h×nh.
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
int So;
cout<<”NhËp mét sè nguyªn “;
do
{
cin>>So;
if (So <=10)
cout<<”Sè kh«ng tháa m·n. NhËp l¹i : “;
}
while (So <=10)
int kt=0;
int d =2;
do
{
if (So % d ==0)
kt = 1;
d++;
}
while (d<So)
if (kt==0)
cout<<”Sè “<<So<<” Lµ sè nguyªn tè”;
else
cout<<”Sè “<<So<<” Kh«ng lµ sè nguyªn tè”;
getch();
}
cout<<”Sè cÇn t×m lµ ”<<So;
getch();
}
§Ó tho¸t khái vßng lÆp kh«ng x¸c ®Þnh, ta còng cã thÓ sö dông break
ho¨ck goto. Tuy nhiªn, c¸c trêng hîp nµy Ýt x¶y ra do ®Æc thï cña vßng lÆp.
ChuyÓn ®æi gi÷a c¸c cÊu tróc lÆp:
Tõ vßng lÆp x¸c ®Þnh (for), ta cã thÓ chuyÓn sang vßng lÆp kh«ng
x¸c ®Þnh (while hoÆc do/ while) b»ng c¸ch sö dông thªm mét biÕn ®Õm kiÓu
nguyªn trong th©n vßng lÆp kh«ng x¸c ®Þnh. Tríc khi lÆp ta khëi g¸n gi¸ trÞ
cña biÕn ®Õm nµy b»ng 0. Mçi khi thùc hiÖn mét lÇn lÆp, ta t¨ng gi¸ trÞ cña
biÕn ®Õm nµy lªn 1.
§Ó chuyÓn ®æi ngîc l¹i (tõ cÊu tróc lÆp kh«ng x¸c ®Þnh sang cÊu tróc
lÆp x¸c ®Þnh) th× nãi chung, ta ph¶i sö dông c¸c vßng for khuyÕt biÓu thøc 2,
díi d¹ng:
for (<BiÓu thøc 1> ; ; <biÓu thøc 3>)
bëi v× ta kh«ng biÕt ch¾c sè lÇn lÆp cña cÊu tróc. Khi ®ã b¾t buéc
ph¶i sö dông lÖnh break vµ goto trong th©n vßng for ®Ó tho¸t cìng bøc.
5. C¸c vÝ dô minh häa
VD1: ViÕt ch¬ng tr×nh nhËp vµo mét sè nguyªn n, sau ®ã tÝnh tæng
c¸c sè nguyªn tè thuéc ®o¹n [1..n]. Cho biÕt cã bao nhiªu sè nguyªn tè thuéc
®o¹n trªn?
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
int So, Tong, Dem;
cout<<”NhËp sè nguyªn”;
cin>>So;
Tong =Dem=0;
for (int i=1; i<=n; i++)
{
int Check = 0;
for (int j=2; j<n; j++)
if (i%j==0)
Check = 1;
If (Check ==0)
{
Tong +=i;
Dem++;
}
}
cout<<”Tæng c¸c sè nguyªn tè “<<Tong;
cout<<” Cã “<<Dem<<sè nguyªn tè trong ®o¹n 1..n”;
getch();
}
VD2: ViÕt ch¬ng tr×nh nhËp vµo mét sè nguyªn n vµ mét sè thùc x, sau
®ã tÝnh gi¸ trÞ biÓu thøc:
x2 x3 xn
x 2 .. n 1 NÕun ch½n
F= 3 3 3
0 NÕun lÎ
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
main()
{
clrscr();
int n; float x, F;
float ts, ms;
cout<<”NhËp x”;
cin>>x;
cout<<”NhËp n”;
cin>>n;
F=0;
ts=x;
ms=1;
if (n%2==0)
{
for(int i=1; i<=n; i++)
{
ts*=x;
ms*=3;
F+=ts/ms;
}
}
cout<<”Gi¸ trÞ cña biÓu thøc “<<F;
getch();
}
Ch¬ng III. Kü thuËt lËp tr×nh ®¬n thÓ
I. Giíi thiÖu
1. Kh¸i niÖm vÒ ®¬n thÓ
Khi viÕt mét ch¬ng tr×nh, chóng ta cã thÓ triÓn khai theo hai c¸ch:
C¸ch 1: Toµn bé c¸c lÖnh cña ch¬ng tr×nh ®îc viÕt trong hµm main.
C¸c lÖnh ®îc viÕt theo tr×nh tù ®Ó gi¶i quyÕt bµi to¸n ®Æt ra.
C¸ch 2: Ch¬ng tr×nh ®îc t¹o thµnh tõ nhiÒu ®¬n thÓ kh¸c nhau. C¸c
®¬n thÓ thùc hiÖn nh÷ng nhiÖm vô t¬ng ®èi ®éc lËp vµ ®îc “l¾p ghÐp” l¹i
thµnh ch¬ng tr×nh th«ng qua nh÷ng lêi gäi ®¬n thÓ trong hµm main.
u nhîc ®iÓm:
- Víi c¸ch 1: sÏ thÝch hîp khi viÕt nh÷ng ch¬ng tr×nh cã kÝch thíc nhá.
Toµn bé thuËt to¸n ®îc thÓ hiÖn trong mét ®o¹n m· tõ trªn xuèng díi. Tuy
nhiªn, c¸ch nµy kh«ng phï hîp víi c¸c ch¬ng tr×nh lín do:
+ KÝch thíc ch¬ng tr×nh cång kÒnh, khã kiÓm so¸t, chØnh söa.
+ C¸c ®o¹n m· cã thÓ lÆp ®i lÆp l¹i, ch¬ng tr×nh dµi kh«ng cÇn
thiÕt.
- Víi c¸ch 2: Ch¬ng tr×nh ®îc chia nhá thµnh c¸c ®¬n thÓ kh¾c phôc ®îc
hai nhîc ®iÓm c¬ b¶n trªn. §Æc biÖt phï hîp víi c¸c ch¬ng tr×nh cã kÝch
thíc lín.
Trong C++, ta cã hai lo¹i ®¬n thÓ sau:
[1]. C¸c líp ®èi tîng: Ch¬ng tr×nh bao gåm mét sè ®o¹n m· m« t¶ c¸c líp
c¸c ®èi tîng nµo ®ã sÏ sö dông trong ch¬ng tr×nh chÝnh. Lo¹i ®¬n thÓ nµy ®-
îc nghiªn cøu trong néi dung m«n häc “LËp tr×nh híng ®èi tîng”.
[2]. C¸c hµm: Ch¬ng tr×nh ®îc cÊu t¹o tõ c¸c hµm. Mçi hµm thùc thi
mét nhiÖm vô t¬ng ®èi ®éc lËp, trong ®ã cã mét hµm main ®ãng vai trß nh
ch¬ng tr×nh chÝnh ®Ó sö dông c¸c hµm kh¸c.
Trong ph¹m vi m«n häc, ta chØ xem xÐt c¸c ®¬n thÓ díi d¹ng c¸c hµm.
2. C¸c ®Æc trng cña hµm
Mét hµm trong C++ cã c¸c ®Æc trng sau:
- Tªn hµm: do ngêi lËp tr×nh tù ®Æt vµ cã nh÷ng ®Æc ®iÓm sau:
+ Tªn hµm thêng mang tÝnh ®¹i diÖn cho c«ng viÖc mµ hµm sÏ ®¶m
nhiÖm.
+ Tªn hµm kh«ng ®îc chøa dÊu c¸ch vµ c¸c ký tù ®Æc biÖt (trõ dÊu
g¹ch díi).
- KiÓu gi¸ trÞ tr¶ vÒ cña hµm: NÕu hµm tr¶ vÒ mét gi¸ trÞ nµo ®ã th×
gi¸ trÞ ®ã ph¶i thuéc mét kiÓu d÷ liÖu nµo ®ã mµ ta gäi lµ kiÓu gi¸ trÞ tr¶
vÒ cña hµm. KiÓu gi¸ trÞ tr¶ vÒ cña hµm cã thÓ lµ c¸c kiÓu d÷ liÖu
chuÈn.
- KiÓu vµ tªn c¸c ®èi cña hµm: NÕu hµm sö dông c¸c ®èi th× c¸c ®èi
ph¶i thuéc mét kiÓu d÷ liÖu nµo ®ã. Khi thiÕt lËp mét hµm, ta cÇn chØ ra
danh s¸ch c¸c ®èi cña hµm vµ kiÓu d÷ liÖu cña mçi ®èi.
- Th©n hµm: lµ néi dung chÝnh cña hµm, chøa toµn bé c¸c lÖnh cña
hµm.
3. Ph©n lo¹i hµm
Trong pascal, ta cã hai lo¹i ch¬ng tr×nh con: thñ tôc (procedure) vµ hµm
(function). Trong C++, chóng ta cã duy nhÊt mét lo¹i “ch¬ng tr×nh con” (mµ ta
gäi lµ ®¬n thÓ), ®ã lµ hµm.
Mét ch¬ng tr×nh trong C++ ®îc cÊu t¹o tõ c¸c hµm, trong ®ã hµm main
lµ hµm b¾t buéc ph¶i cã, ®ãng vai trß nh ch¬ng tr×nh chÝnh.
Kh¸c víi trong Pascal, tÊt c¶ c¸c hµm ®Òu tr¶ vÒ mét gi¸ trÞ nµo ®ã, c¸c
hµm trong C++ ®îc chia lµm hai lo¹i:
- Hµm kh«ng cã gi¸ trÞ tr¶ vÒ: Lµ hµm chØ cã chøc n¨ng thùc hiÖn mét
c«ng viÖc nµo ®ã mµ ta kh«ng quan t©m tíi gi¸ trÞ tr¶ vÒ cña hµm.
- Hµm cã gi¸ trÞ tr¶ vÒ: Ngoµi viÖc thùc hiÖn mét c«ng viÖc nµo ®ã, ta
cßn quan t©m tíi gi¸ trÞ thu ®îc sau khi hµm thùc thi ®Ó dïng trong nh÷ng
®o¹n tr×nh tiÕp theo.
<KiÓu hµm> <Tªn Hµm 2> <([kiÓu ®èi] [Danh s¸ch c¸c ®èi]>
{
th©n hµm 2;
}
…
void main()
{
Th©n hµm main;
}
HoÆc:
#include…
….
<KiÓu hµm> <Tªn Hµm 1> <([kiÓu ®èi] [Danh s¸ch c¸c ®èi]>;
<KiÓu hµm> <Tªn Hµm 2> <([kiÓu ®èi] [Danh s¸ch c¸c ®èi]>
….
void main()
{
Th©n hµm main;
}
<KiÓu hµm> <Tªn Hµm 1> <([kiÓu ®èi] [Danh s¸ch c¸c ®èi]>
{
Th©n hµm 1;
}
<KiÓu hµm> <Tªn Hµm 2> <([kiÓu ®èi] [Danh s¸ch c¸c ®èi]>
{
Th©n hµm 2;
}
….
VD1: ViÕt ch¬ng tr×nh kiÓm tra mét sè nguyªn n cã ph¶i lµ sè nguyªn tè
kh«ng, nÕu n lµ sè nguyªn tè, h·y tÝnh n!.
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
int NT(int n)
{
if (n ==1 | | n ==2)
return =1;
else
{Check =0;
for (int i=2; i<n; i++)
if (n%i==0)
Check =1;
if (Check = 0)
return 1;
else
return 0;
}
}
//=================
long GT(int n)
{
long kq=1;
if (n==0 | | n==1)
kq=1;
else
for (int i=1; i<=n; i++)
kq *=i;
return kq;
}
void main()
{
int a;
cout<<”NhËp a”;
cin>>a;
if (NT(a) == 0)
cout<<”Sè “<<a<<” Kh«ng ph¶i nguyªn tè”;
else
{
cout<<”Sè “<<a<<” lµ sè nguyªn tè”;
cout<<” Giai thõa cña “<<a<<” lµ “<<GT(a);
}
getch();
}
C¸ch 2: Tæ chøc trong tÖp th viÖn:
B1: ViÕt c¸c hµm (trõ hµm main() )trong mét file sau ®ã lu díi ®Þnh
d¹ng .h. File nµy thêng ®îc gäi lµ file th viÖn. (®Ó thuËn tiÖn cho viÖc so¸t
lçi, tèt nhÊt tríc tiªn nªn tæ chøc c¸c hµm nh c¸ch 1, sau ®ã di chuyÓn toµn bé
c¸c hµm (trõ hµm main() sang mét file .h vµ lu l¹i)
B2: ViÕt hµm main() trong mét tÖp riªng. §Ó hµm main() cã thÓ sö
dông c¸c hµm viÕt trong file th viÖn ®· t¹o trong B1, cÇn thªm chØ thÞ:
#include <[ ®êng dÉn] <Tªn th viÖn.h>
Chó ý: nÕu ®Æt th viÖn trªn trong th môc TC\ Include th× trong chØ
thÞ #include kh«ng cÇn thªm ®êng dÉn. Ngîc l¹i, cÇn thªm ®Çy ®ñ ®êng dÉn
tíi file th viÖn nãi trªn.
VD: T¹o file .h víi néi dông sau, VD file “TV.h”:
int NT(int n)
{
if (n ==1 | | n ==2)
return =1;
else
{Check =0;
for (int i=2; i<n; i++)
if (n%i==0)
Check =1;
if (Check = 0)
return 1;
else
return 0;
}
}
//=================
long GT(int n)
{
long kq=1;
if (n==0 | | n==1)
kq=1;
else
for (int i=1; i<=n; i++)
kq *=i;
return kq;
}
Më mét file míi vµ viÕt hµm main():
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#include <C:\TC\BIN\ TV.h”
void main()
{
int a;
cout<<”NhËp a”;
cin>>a;
if (NT(a) == 0)
cout<<”Sè “<<a<<” Kh«ng ph¶i nguyªn tè”;
else
{
cout<<”Sè “<<a<<” lµ sè nguyªn tè”;
cout<<” Giai thõa cña “<<a<<” lµ
“<<GT(a);
}
getch();
}
Chó ý:
- C¸c file th viÖn .h kh«ng nhÊt thiÕt ph¶i cã c¸c chØ thÞ tiÒn xö lý
#include …
- Kh«ng thÓ so¸t lçi b»ng c¸ch bÊm F9 trong file th viÖn .h.
2. Sö dông hµm
Hµm ®îc sö dông th«ng qua lêi gäi cña nã. C¸ch viÕt mét lêi gäi hµm
nh sau:
<Tªn hµm> <([danh s¸ch c¸c tham sè thùc sù])>
Chó ý:
- NÕu hµm ®îc ®Þnh nghÜa cã ®èi sè th× khi gäi hµm ta ph¶i truyÒn
®Çy ®ñ c¸c tham sè cho hµm.
- C¸c tham sè ph¶i cã kiÓu trïng víi kiÓu cña ®èi sè t¬ng øng.
- NÕu hµm kh«ng cã ®èi sè th× lêi gäi hµm vÉn ph¶i sö dông dÊu () kÌm
tªn hµm: <Tªn hµm> <()>.
- NÕu hµm cã gi¸ trÞ tr¶ vÒ th× tªn hµm ®îc sö dông nh mét biÕn. Ngîc
l¹i, nÕu hµm kh«ng cã gi¸ trÞ tr¶ vÒ, tªn hµm ®îc sö dông nh mét lÖnh.
3. Ph¹m vi cña biÕn
Theo ph¹m vi ho¹t ®éng cña biÕn, ta chia ra:
- BiÕn toµn côc:
Ph¹m vi ho¹t ®éng trong toµn bé ch¬ng tr×nh, kÓ tõ vÞ trÝ khai b¸o biÕn.
VÞ trÝ khai b¸o n»m ngoµi c¸c hµm (kÓ c¶ hµm main).
NÕu ch¬ng tr×nh ®îc viÕt trªn nhiÒu tÖp, ®Ó ph¹m vi ho¹t ®éng cña biÕn
bao gåm c¶ c¸c tÖp kh¸c, ta cÇn thªm chØ danh extern vµo tríc khai b¸o biÕn.
- BiÕn côc bé:
Ph¹m vi ho¹t ®éng: NÕu biÕn ®îc khai b¸o trong th©n mét khèi nµo ®ã sÏ cã
ph¹m vi ho¹t ®éng chØ trong khèi, kÓ c¶ c¸c khèi con n»m bªn trong khèi ®ã.
+ KÕt thóc khèi, biÕn côc bé sÏ ®îc gi¶i phãng.
+ Muèn biÕn nµy tån t¹i trong suèt thêi gian ch¬ng tr×nh lµm viÖc, ta
cÇn thªm tõ khãa static tríc khai b¸o biÕn ®Ó khai b¸o biÕn díi d¹ng biÕn
tÝnh.
VD1: XÐt vÝ dô sau:
int x;
void Ham(int a)
{
cout<<”BiÕn x trong hµm “<<x;
if (a%2==0) {
int x=5;
x+=a;
cout<<”BiÕn x trong hµm “<< x;}
}
void main()
{
x=1;
int a = 2;
Ham(a);
cout<< “BiÕn x trong hµm main “<<x;
int x = 3;
cout<<”BiÕn x trong hµm main “<<x;
getch();
}
NhËn xÐt:
- BiÕn x díi d¹ng toµn côc cã ph¹m vi ho¹t ®éng trong toµn bé ch¬ng
tr×nh, kÓ tõ khi khai b¸o.
- NÕu trong mét khèi cã khai b¸o biÕn côc bé trïng tªn víi viÕn toµn côc
th× kÓ tõ khi khai b¸o, khèi ®ã sÏ sö dông biÕn côc bé mµ kh«ng sö dông
biÕn toµn côc.
4. Sö dông c¸c tham sè trong lËp tr×nh ®¬n thÓ
1. Ph©n lo¹i tham sè
NÕu hµm cã ®èi sè (tham sè h×nh thøc), khi gäi hµm ta ph¶i truyÒn c¸c
tham sè t¬ng øng cho hµm. C¸c tham sè cã thÓ lµ c¸c biÕn hoÆc c¸c h»ng gi¸ trÞ.
Cã hai lo¹i tham sè:
[1]. Tham chiÕu: Khi truyÒn tham sè díi d¹ng tham chiÕu, tham sè lµ
c¸c biÕn vµ tham sè sÏ ®îc truy cËp trùc tiÕp. Nh vËy, c¸c mét tham sè khi
truyÒn vµo mét hµm cã thÓ bÞ biÕn ®æi gi¸ trÞ cña nã.
[2]. Tham trÞ: Khi truyÒn tham sè díi d¹ng tham trÞ, tham sè sÏ kh«ng
®îc truy cËp trùc tiÕp. Hµm sÏ cÊp ph¸t mét vïng nhí míi vµ sao chÐp gi¸ trÞ
cña tham sè vµo ®ã. C¸c lÖnh trong th©n hµm sÏ thao t¸c trªn vïng nhí míi nµy.
Nh vËy, mét tham sè khi truyÒn vµo mét hµm sÏ kh«ng bÞ tham ®æi gi¸ trÞ
cña nã khi ra khái hµm.
Vïng nhí Vïng nhí
BiÕn BiÕn
cña biÕn cña biÕn
Vïng nhí
míi
Gäi hµm Thùc thi Gäi hµm Thùc thi
hµm hµm
Biªn so¹n: NguyÔn M¹nh Cêng Trang 3
7
§Ò c¬ng chi tiÕt Kü thuËt lËp tr×nh
void main()
{
int a, b;
a=1;
b=2;
cout<<”Gi¸ trÞ a tríc khi gäi hµm “<<a;
cout<<”Gi¸ trÞ b tríc khi gäi hµm “<<b;
Ham(a, b);
cout<<”Gi¸ trÞ a sau khi gäi hµm “<<a;
cout<<”Gi¸ trÞ b sau khi gäi hµm “<<b;
getch();
}
5. Kü thuËt ®Ö quy
1. Kh¸i niÖm vÒ ®Ö quy
Trong C++, mét hµm cã thÓ gäi ®Õn chÝnh nã, kh¶ n¨ng nµy cña hµm
gäi lµ ®Ö quy. Khi mét hµm gäi ®Õn chÝnh nã, hµm ®îc viÕt theo kiÓu ®Ö
quy.
VD: XÐt hµm tÝnh n!. Ta cã ®Þnh nghÜa sau: n! = (n-1)! * n.
Nh vËy, gi¶ sö n=5 th× n! ®îc tÝnh nh sau:
5! = 4! * 5
= 3! * 4 * 5.
= 2! * 3 * 4 * 5.
= 1! * 2 * 3 * 4 * 5.
Víi 1! = 1, ta hoµn toµn cã thÓ tÝnh ®îc 5!. Khi ®ã, ®Ó tÝnh ®îc 5!, ta
ph¶i tÝnh 2!, 3!, 4!.
Hµm lÆp:
long GT(int n)
{
long kq=1;
if (n==0 | | n==1)
kq=1;
else
for (int i=1; i<=n; i++)
kq *=i;
return kq;
}
Hµm ®Ö quy:
long GT(int n)
{
if (n==1)
return 1;
else
return GT(n-1) * n;
}
Thùc hiÖn: Gi¶ sö n kh¸c 1. Khi ®ã, quy tr×nh thùc hiÖn nh sau:
… … ….
(1)! 1
- T¹o mét t¹o mét b¶n sao cña hµm, cÊp ph¸t c¸c vïng nhí míi cho c¸c biÕn
côc bé, thùc hiÖn b¶n sao nµy.
- LÊy ®Þa chØ cña dßng lÖnh gäi ®Ö quy vµ quay vÒ.
KÕt thóc
Nh vËy cã bao nhiªu lêi gäi hµm th× cã bÊy nhiªu lÇn kÕt thóc hµm.
Trong trêng hîp kh«ng tån t¹i mét b¶n sao cña hµm mµ t¹i ®ã kh«ng thùc hiÖn
hiÖn lêi gäi ®Ö quy th× qu¸ tr×nh ®Ö quy sÏ kh«ng dõng ®îc (ta gäi lµ ®Ö
quy v« h¹n).
Gäi ®Ö quy GT(2) Gäi ®Ö quy GT(1) Gäi ®Ö quy GT(0) Bá qua lÖnh
gäi ®Ö quy
KÕt thóc
Return 1*2*3 Return 1*2 Return 1
Chó ý: Lu ý tíi ®iÒu kiÖn dõng cña hµm viÕt theo kiÓu ®Ö quy.
Ph¬ng ph¸p ®Ö quy ®Æc biÖt thÝch hîp víi mét sè bµi to¸n nh duyÖt
c©y, ®å thÞ… Tuy nhiªn, nãi chung ta nªn Ýt sö dông ®Ö quy khi viÕt ch¬ng
tr×nh do c¸c nhîc ®iÓm trªn, trõ nh÷ng trêng hîp ®Æc thï.
C¸c bµi to¸n ¸p dông gi¶i thuËt ®Ö quy thêng cã ®Æc ®iÓm sau:
- Bµi to¸n dÔ dµng gi¶i quyÕt trong mét sè trêng hîp riªng øng víi c¸c gi¸
trÞ ®Æc biÖt cña tham sè. Trong trêng hîp nµy, ta cã thÓ gi¶i quyÕt bµi
to¸n mµ kh«ng cÇn gäi ®Ö quy. Ta gäi trêng hîp nµy lµ trêng hîp suy biÕn.
- Trong trêng hîp tæng qu¸t, bµi to¸n cã thÓ quy vÒ bµi to¸n cïng d¹ng nh-
ng gi¸ trÞ cña tham sè thay ®æi. Vµ sau mét sè h÷u h¹n bíc biÕn ®æi ®Ö
quy, sÏ dÉn tíi trêng hîp say biÕn.
- Víi n=0 hoÆc n = 1 th× n! = 1. Khi ®ã ta kh«ng cÇn gäi ®Ö quy vÉn cã
thÓ tÝnh ®îc n!.
- Trêng hîp tæng qu¸t, n! = n* (n-1)!. Tøc lµ ®Ó tÝnh n!, ta cã thÓ quy
vÒ bµi to¸n tÝnh (n-1)!. Sau mét sè h÷u h¹n bíc biÕn ®æi, ta cã thÓ quy vÒ
bµi to¸n tÝnh 1!.
Nh vËy lµ:
- Trêng hîp suy biÕn: n=0 hoÆc n=1. C«ng thøc trong trêng hîp nµy : n! = 1;
- Trêng hîp tæng qu¸t: lµ c¸c trêng hîp cßn l¹i (n kh¸c 1 vµ n kh¸c 0) khi
®ã: n! = n* (n-1)!.
Sau khi thiÕt kÕ song, viÖc lËp hµm ®Ö quy trë lªn rÊt ®¬n gi¶n.
n 1
Cn = C C
i 1
i n i
Bíc 2:
if (n = = 1)
return 1;
else
{ int C =0;
for (int i=1; i<n; i++)
C+= CataLan(i) * CataLan(n-i);
Return C;
}
Víi phÇn thiÕt kÕ trªn, hµm ®Ö quy tÝnh sè CataLan thø n ®îc viÕt
nh sau:
int CataLan(int n)
{
if (n==1)
return 1;
else
{
int C=0;
for (int i=1; i<n; i++)
C+=CataLan(i)*CataLan(n-i);
return C;
}
}
3. §Ö quy vµ c¸c d·y truy håi
Kh¸i niÖm: Mét d·y truy håi lµ d·y mµ c¸c sè h¹ng ®øng sau ®îc ®Þnh
nghÜa dùa trªn sè h¹ng ®øng tríc cña d·y.
VD: cho d·y sau:
a[1] = 1;
a[n] = a[n-1] * n;
DÔ dµng thÊy ®©y chÝnh lµ d·y c¸c giai thõa cña c¸c sè tù nhiªn: 1!, 2!,
3!, 4!…
HoÆc d·y c¸c sè Fibonacci:
A[1] = 1;
A[2] = 1;
A[n] = A[n-1] + A[n-2] (víi n>2).
Víi c¸c d·y truy håi, ta hoµn toµn cã thÓ dïng c¸c thuËt to¸n lÆp ®Ó
tÝnh. Tuy nhiªn c¸c gi¶i thuËt ®Ö quy thêng ®îc ¸p dông trªn c¸c d·y truy håi .
4. Mét sè vÝ dô vÒ ®Ö quy
VD1: USCLN cña hai sè nguyªn a, b ®îc ®Þnh nghÜa nh sau:
USCLN(a, b) = a nÕu b =0
= USCLN(b, a%b) nÕu b kh¸c 0.
ViÕt hµm lÆp vµ ®Ö quy ®Ó tÝnh USCLN cña hai sè nguyªn a, b.
Hµm lÆp:
else
return USCLN(b, a%b)
LËp tr×nh:
Int USCLN_DQ(int a, int b)
{
if (b==0)
return a;
else
return USCLN_DQ(b, a%b);
}
VD2: C¸c sè Fibonacci ®îc ®Þnh nghÜa ®Ö quy nh sau:
F[0] = F[1] = 1;
F[i] = F[i-1] + F[i-2];
VD: 1, 1, 2, 3, 5, 8, 13…
ViÕt hµm ®Ö quy t×m sè Fibonacci thø n.
ThiÕt kÕ:
Bíc 1: Suy biÕn: n <=1; c«ng thøc suy biÕn: Fibo(n) = 1;
Kh«ng suy biÕn: n >1; c«ng thøc tæng qu¸t: Fibo(n) = Fibo(n-1) +
Fibo(n-2).
Bíc 2:
if(n<=1)
return 1;
else
return Fibo(n-1) + Fibo(n-2);
LËp tr×nh:
int Fibo(int n)
{
if(n<=1)
return 1;
else
return Fibo(n-1) + Fibo(n-2);
}
M¶ng hai chiÒu: Dïng ®Ó lu tr÷ mét b¶ng c¸c gi¸ trÞ cïng kiÓu. C¸c cét
vµ dßng ®îc ®¸nh chØ sè tõ 0. Nh vËy, phÇn tö t¹i dßng i, cét j ®¸nh chØ sè lµ
[i-1][j-1].
VD: Víi m¶ng hai chiÒu a ta cã:
PhÇn tö t¹i dßng 1 cét 1: a[0][0].
PhÇn tö t¹i cét 1 dßng 2: a[0][1]. …
2. Khai b¸o m¶ng
a. M¶ng mét chiÒu
Có ph¸p:
<KiÓu m¶ng> <tªn m¶ng> <[Kichs thuíc]>;
Trong ®ã:
+ <KiÓu m¶ng>: cã thÓ lµ c¸c kiÓu chuÈn nh float, int, double, long…
hoÆc kiÓu tù ®Þnh nghÜa.
+ <Tªn m¶ng> : hay tªn biÕn m¶ng, tïy ý ®Æt theo quy íc ®Æt tªn biÕn.
+ <KÝch thíc>: dïng ®Ó xc¸ ®Þnh sè phÇn tö tèi ®a cña m¶ng.
VD: float a[10];
SÏ khai b¸o mét biÕn m¶ng c¸c gi¸ trÞ kiÓu thùc, sè phÇn tö tèi ®a lµ 10.
C¸c phÇn tö ®îc ®¸nh chØ sè a[0], a[1], …, a[9].
b. M¶ng hai chiÒu:
T¬ng tù nh m¶ng mét chiÒu ta cã:
<KiÓu m¶ng> <tªn m¶ng> <[Sè dßng] [sè cét]>;
Víi <[sè dßng] [sè cét]>: chØ ra kÝch thíc mçi chiÒu cña m¶ng.
VD: double b[3][2];
SÏ khai b¸o mét m¶ng 2 chiÒu cã 3 dßng, 2 cét víi c¸c ph©n tö kiÓu
double. C¸c phÇn tö ®îc ®¸nh chØ sè nh sau:
b[0][0] b[0][1]
b[1][0] b[1][1]
b[2][0] b[2][1]
3. Sö dông m¶ng
a. LÊy ®Þa chØ c¸c phÇn tö
Víi m¶ng mét chiÒu, ta vÉn sö dông phÐp lÊy ®Þa chØ th«ng thêng
VD: ®Ó lÊy ®Þa chØ phÇn tö a[i] ta viÕt: &a[i].
Víi m¶ng hai chiÒu: nãi chung kh«ng cho phÐp lÊy ®Þa chØ cña c¸c
phÇn tö m¶ng. Nh vËy, kh«ng chÊp nhËn c¸ch viÕt: & a[i][j]. Víi C++3.0 trë
lªn, ta vÉn cã thÓ sö dông phÐp lÊy ®Þa chØ c¸c phÇn tö m¶ng thùc hai chiÒu
víi c¸c file ch¬ng tr×nh cã phÇn më réng .CPP.
b. DuyÖt m¶ng
Víi m¶ng mét chiÒu cã n phÇn tö, ®Ó duyÖt qua c¸c phÇn tö cña m¶ng
ta cã thÓ sö dông 1 vßng lÆp for sau:
for(int i=0; i<n; i++)
{
Truy cËp tíi hÇn tö cã chØ sè i;
}
VD: NhËp d÷ liÖu cho mét m¶ng gåm 10 phÇn tö nguyªn.
int a[10];
for(int i=0; i<10; i++)
{
printf(“NhËp A[%d] : “,i);
scanf(“%d”, &a[i]);
}
Víi m¶ng 2 chiÒu cã n dßng, m cét, ta cã thÓ sö dông 2 vßng for lång
nhau:
for(int i=0; j<n; i++)
for(int j=0; j<m; j++)
{
Truy cËp tíi phÇn tö cã chØ sè [i][j];
}
VD: NhËp d÷ liÖu cho m¶ng thùc 2 chiÒu 5 dßng, 3 cét:
float a[5][3];
float tg;
for(int i=0; i<5; i++)
for(int j=0; j<3; j++)
{
printf(“NhËp a[%d][%d]: “,i, j);
scanf(“%f”, &tg); a[i][j] = tg;
}
Chó ý: V× c¸c file .h trong C kh«ng chÊp nhËn phÐp lÊy ®Þa chØ c¸c
phÇn tö m¶ng hai chiÒu nªn ta kh«ng thÓ viÕt trùc tiÕp:
scanf(“%f”, &a[i][j]);
Mµ cÇn sö dông mét biÕn trung gian tg cã cïng kiÓu ®Ó lµm trung gian
trong qu¸ tr×nh nhËp d÷ liÖu. Sau ®ã, ta g¸n a[i][j] b»ng gi¸ trÞ tg võa nhËp
nµy. Tuy nhiªn, tõ C 3.0 trë lªn, vÉn cho phÐp lÊy ®Þa chØ cña phÇn tö m¶ng
2 chiÒu nh thêng.
c. VÊn ®Ò t¹o d¸ng ma trËn
§Ó t¹o gi¸ng ma trËn, ta sö dông c©u lÖnh gotoxy(). C©u lÖnh nµy cã
t¸c dông ®a con trá mµn h×nh tíi c¸c täa ®é mµn h×nh ®· chØ ra trong c¸c
tham sè ®Ó nhËp hoÆc xuÊt c¸c phÇn tö cña m¶ng.
Có ph¸p: gotoxy(X, Y);
Víi X lµ täa ®é theo ph¬ng X (cét X) cña mµn h×nh, cã gi¸ trÞ tõ 1 tíi
80.
Y lµ täa ®é theo ph¬ng Y (dßng Y) cña mµn h×nh, cã gi¸ trÞ tõ 1 tíi 25.
X
1 80
25
Y
Nh vËy, ta cã thÓ sö dông c©u lÖnh gotoxy trong vßng lÆp nh sau
for (i=0; i<n; i++)
for(j = 0; j <m; j++)
{
gotoxy(X + j *n, Y + i*m);
cout<<a[i][j];
}
Trong ®ã : X, Y lµ to¹ ®é ®Ønh tr¸i, trªn cña ma trËn; n, m lµ c¸c b íc nh¶y
theo trôc x vµ trôc y. Th«ng thêng, ta chän n = 3 vµ m = 1.
4. C¸c vÝ dô minh häa
ViÕt ch¬ng tr×nh nhËp vµo mét m¶ng n sè nguyªn. S¾p xÕp m¶ng theo
chiÒu t¨ng dÇn vµ in kÕt qu¶ ra mµn h×nh.
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
void main()
{
int a[100];
int tg, n, j;
printf(“NhËp n “);
scanf(“%d”, &n);
for(int i=0; i<n; i++)
{
printf(“NhËp a[%d]: “,i);
scanf(“%d”, &a[i]);
}
for(i=0; i<n-1; i++)
for(j=i+1; j<n; j++)
if (a[i]>a[j])
{
tg=a[i];
a[i] = a[j];
a[j] = tg;
}
printf(“m¶ng sau khi s¾p”);
for (i=0; i<n; i++)
printf(“%d “, a[i]);
getch();
}
VD2: NhËp mét ma trËn sè nguyªn gåm n dßng, m cét. In ma trËn võa
nhËp vµ phÇn tö lín nhÊt ra mµn h×nh.
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
void main()
{
int a[100][100];
int n, m, Max, tg;
printf(“NhËp sè dßng “);
scanf(“%d”, &n);
printf(“NhËp sè cét “);
scanf(“%d”, &m);
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
printf(“NhËp a[%d][%d]: “, i, j);
scanf(“%d”, &tg);
a[i][j] = tg;
}
Max = a[0][0];
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{
if(a[i][j]>Max)
Max = a[i][j];
printf(“%d\n”, a[i][j]);
}
printf(“PhÇn tö lín nhÊt %d“, Max);
getch();
}
II. TruyÒn tham sè m¶ng cho hµm
Trong C++, cho phÐp viÕt c¸c hµm cã ®èi sè lµ m¶ng nh s¸c ®èi sè
th«ng thêng. Tuy nhiªn, khi truyÒn tham sè lµ m¶ng, ta thêng truyÒn thªm c¶
c¸c biÕn lµ kÝch thíc cña m¶ng.
VD1: ViÕt ch¬ng tr×nh thùc hiÖn viÖc nhËp mét d·y sè nguyªn, tÝnh
tæng c¸c phÇn tö lÎ vµ in kÕt qu¶ ®ã lªn mµn h×nh.
#include “stdio.h”
…
long Tong(int a[100], int n)
{
long T=0;
for (int i=0; i<n; i++)
if(a[i]%2==0)
T+=a[i];
return T;
}
void main()
{
int b[100]; int n;
cout<<”NhËp n”;
cin>>n;
for(int i=0; i<n; i++)
{
cout<<”NhËp b[“<<i<<”]”;
cin>>b[i];
cout<<”Tæng c¸c phÇn tö lÎ “<<Tong(b, n);
getch();
}
VD2: ViÕt ch¬ng tr×nh nhËp mét ma trËn n hµng, m cét. T×m phÇn tö
lín nhÊt cña ma trËn vµ in ma trËn võa nhËp cïng phÇn tö lín nhÊt ra mµn
h×nh.
#include…
…
double Max(double a[100][100], n, m)
{
Max = a[0][0];
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
if (a[i][j]>Max)
Max=a[i][j];
return Max;
}
void main()
{
double b[100][100]; int m, n;
cout<<”NhËp n”; cin>>n;
cout<<”NhËp m”; cin>>m;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
cout<<”b[“<<i<<”]= “;
cin>>b[i][j];
}
cout<<”Ma trËn võa nhËp lµ “;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
cout<<”b[“<<i<<”]= “<<b[i][j];
cout<<”PhÇn tö lín nhÊt : “<<Max(b, n, m);
getch();
}
III. C¸c bµi to¸n c¬ b¶n vÒ m¶ng
1. Bµi to¸n trªn m¶ng mét chiÒu.
Bµi 1: ViÕt ch¬ng tr×nh nhËp vµo m¶ng n sè nguyªn vµ mét sè nguyªn
c. Cho biÕt cã bao nhiªu sè nguyªn c trong m¶ng vµ vÞ trÝ cña nã.
Bµi 2: ViÕt ch¬ng tr×nh nhËp vµo mét m¶ng n phÇn tö nguyªn. tÝnh
tæng c¸c phÇn tö lÎ, ch½n, chia hÕt cho 3 trong m¶ng.
2. Bµi to¸n trªn m¶ng hai chiÒu.
Bµi 1: ViÕt ch¬ng tr×nh nhËp vµo 2 ma trËn A, B cïng kÝch thíc m x n
c¸c sè nguyªn. TÝnh vµ in ma trËn C = A+B.
Bµi 2: Ma trËn B gäi lµ ma trËn chuyÓn vÞ cña A nÕu B[i][j] = A[j][i].
ViÕt ch¬ng tr×nh nhËp vµo mét ma trËn A cã n dßng, m cét c¸c phÇn tö thùc.
TÝnh vµ in ra ma trËn chuyÓn vÞ cña A.
IV. C¸c gi¶i thuËt t×m kiÕm, s¾p xÕp trªn m¶ng
Bµi to¸n t×m kiÕm c¬ b¶n ®îc ph¸t biÓu nh sau:
- Cho mét m¶ng a gåm n phÇn tö vµ mét kho¸ c. H·y cho biÕt kho¸
c cã xuÊt hiÖn trong a kh«ng? NÕu cã, h·y chØ ra mét vÞ trÝ cña c trong a.
Bµi to¸n s¾p xÕp ®îc ph¸t biÓu rÊt ®¬n gi¶n:
- Cho mét m¶ng a gåm n phÇn tö. H·y s¾p xÕp m¶ng a theo thø tù
t¨ng dÇn (hoÆc gi¶m dÇn).
Víi hai bµi to¸n ®Æc thï trªn m¶ng nh trªn, viÖc t×m ra c¸c ph¬ng ph¸p
kh¸c nhau ®Ó gi¶i quyÕt lµ rÊt quan träng. Sau ®©y sÏ lÇn lît tr×nh bµy mét
sè gi¶i thuËt c¬ b¶n ®Ó gi¶i quyÕt hai bµi to¸n trªn.
1. T×m kiÕm tuÇn tù
Mét ph¬ng ph¸p ®¬n gi¶n nhÊt ®Ó gi¶i quyÕt bµi to¸n t×m kiÕm lµ
t×m kiÕm tuÇn tù. Theo ph¬ng ph¸p nµy, ta chØ cÇn duyÖt tõ ®Çu ®Õn
cuèi m¶ng. NÕu gÆp kho¸ c, sÏ in ra vÞ trÝ cña c (tøc lµ chØ sè cña phÇn tö c
trong m¶ng). Ngîc l¹i, khi duyÖt hÕt m¶ng mµ kh«ng t×m thÊy c, tøc lµ c
kh«ng xuÊt hiÖn trong m¶ng. Nh vËy, ®é phøc t¹p cña thuËt gi¶i lµ O(n).
int d=0;
×or (i =0; i< n; i++)
if (a[i]==c)
{
cout<<” VÞ trÝ t×m ®îc c “<<i+1;
d++;
}
if (d==0)
cout<<”kho¸ c kh«ng xuÊt hiÖn trong m¶ng”;
§«i khi, cÇn ph¶i n¾m ®îc tÊt c¶ c¸c vÞ trÝ xuÊt hiÖn c, ta sö dông mét
m¶ng VT[] ®ång hµnh ®Ó lu c¸c vÞ trÝ ®· t×m ®îc c. Nh vËy, thay b»ng
viÖc in vÞ trÝ t×m ®îc ra mµn h×nh, ta lu vÞ trÝ ®ã trong m¶ng VT: VT[d]
= i+1;
2. T×m kiÕm nhÞ ph©n trªn m¶ng ®îc s¾p
Ph¬ng ph¸p nµy chØ ¸p dông trªn m¶ng ®· ®îc s¾p. ý tëng cã thÓ h×nh
dung nh sau:
Gi¶ sö ta cÇn t×m kiÕm c trong mét ®o¹n tõ vÞ trÝ L tíi vÞ trÝ R trªn
mét m¶ng a ®îc s¾p:
Khi ®ã, ta chia m¶ng a lµm hai phÇn bëi ®iÓm chia M: M = (L+R)/ 2
L M R
Ta ¸p dông t×m kiÕm trªn 2 nöa cña a. Tuy nhiªn, do a ®· ®îc s¾p nªn
chØ cã thÓ s¶y ra 3 trêng hîp sau:
[1]. NÕu a[M] = c th× ta ®· t×m ®îc c trong m¶ng. VÞ trÝ cña c lµ M.
[2]. NÕu a[M] > c th× c thuéc vÒ nöa tr¸i cña m¶ng a. Khi ®ã ta ¸p dông
t×m kiÕm trªn nöa tr¸i, tøc lµ tõ vÞ trÝ L tíi M-1.
[3]. NÕu a[M] < c th× c thuéc vÒ nöa ph¶i cña m¶ng a. Khi ®ã ta ¸p
dông t×m kiÕm trªn nöa ph¶i, tøc lµ tõ vÞ trÝ M+1 tíi R.
ViÖc t×m kiÕm trªn c¸c nöa cña a còng ¸p dông ph¬ng ph¸p chia ®«i t-
¬ng tù nh trªn. Nh vËy, ngay tõ ®Çu ta ¸p dông t×m kiÕm nhÞ ph©n trªn toµn
m¶ng a (L=0; R=n-1). Hµm t×m kiÕm nhÞ ph©n lÆp sau ®©y tr¶ vÒ gi¸ trÞ
-1 nÕu kh«ng t×m thÊy c trong a; ngîc l¹i, nã tr¶ vÒ vÞ trÝ cña c trong a.
int TKNP_Lap(int a[100], int n, int c)
{
int L, R, M;
L =0;
R = n-1;
do
{
M = (L+R)/2;
if (a[M] > c) L = M+1;
if (a[M] < c) R = M-1;
}
while (L<R && a[M]!=c);
if (a[M] ==c)
return M;
else
return -1;
}
Râ rµng lµ trong trêng hîp nµy, viÖc ¸p dông ®Ö quy lµ rÊt phï hîp. Sau
®©y ta xem xÐt kh¶ n¨ng ¸p dông ®Ö quy víi thiÕt kÕ sau:
B1: Suy biÕn trong trêng hîp L > R hoÆc a[M] = c. Khi ®ã
- NÕu L > R th× kh«ng t×m ®îc c trong a.
- NÕu a[M] = c th× tr¶ vÒ M lµ vÞ trÝ cña c trong a.
Ngîc l¹i, trong trêng hîp L <= R vµ a[M] ! = c. Khi ®ã:
- NÕu a[M] > c th× gäi ®Ò quy trªn ®o¹n [L, M-1]
- NÕu a[M] < c th× gäi ®Ò quy trªn ®o¹n [M+1, R].
B2:
if (L > R) return -1;
else
if (a[M] ==c) return M;
else
if (a[M] > c) return TKQD(a, n, c, L, M-1);
else return TKDQ(a, n, c, M+1, R);
Sau ®©y lµ code:
int TKNP_DQ(int a[100], int n, int c, int L, int R)
{
int M=(L+R)/2;
if (L>R) return -1;
else
if (a[M]==c) return M;
else
if (a[M] > c)
return TKNP_DQ(a, n, c, M+1, R);
else
return TKNP_DQ(a, n, c, L, M-1);
}
ThuËt to¸n t×m kiÕm ®Ö quy trªn m¶ng ®îc s¾p ®îc ®¸nh gi¸ t¬ng ®èi
tèt. §é phøc t¹p trong trêng hîp tåi nhÊt lµ O(lg (n)). Ph¬ng ph¸p nµy kh«ng
bao giê dïng nhiÒu h¬n lg(n) + 1 phÐp so s¸nh. Mét ph¬ng ph¸p t×m kiÕm
hiÖu qu¶ h¬n lµ t×m kiÕm néi suy trªn c©y (Ýt h¬n lg(lg(n)) +1 phÐp so
s¸nh) kh«ng ®îc ®Ò cËp trong bµi gi¶ng nµy.
3. S¾p xÕp næi bät
Ph¬ng ph¸p s¾p xÕp c¬ b¶n nhÊt lµ ph¬ng ph¸p næi bät quen thuéc.
Gi¶i thuËt ®ùoc tr×nh bµy nh sau:
for (i=0; i < n-1; i++)
for (j=i+1; j<n; j++)
If (a[i] > a[j])
//®æi chç a[i] cho a[j];
KÕt thóc hai vßng lÆp trªn, m¶ng ®· ®îc s¾p (t¨ng). ta cã thÓ h×nh
dung qu¸ tr×nh s¾p xÕp qua vÝ dô sau
B¾t ®Çu s¾p i = 0 3 5 2 7 4 8
HÕt 1 vßng lÆp j; i = 1; 2 5 3 7 4 8
HÕt mét vßng j; i=2; 2 3 5 7 4 8
HÕt mét vßng j; i=3; 2 3 4 7 5 8
HÕt mét vßng j; i=4; 2 3 4 5 7 8
Trong trêng hîp trung b×nh vµ trêng hîp tåi nhÊt, ph¬ng ph¸p nµy cÇn
n /2 lÇn so s¸nh vµ n2/ 2 lÇn ®æi chç.
2
3 5 2 7 4 8
3 PhÇn tö ®Çu
tiªn
3 5 ChÌn 5 vµo
2 3 5 ChÌn 2 vµo
2 3 5 7 ChÌn 7 vµo
2 3 4 5 7 ChÌn 4 vµo
2 3 4 5 7 8 ChÌn 8 vµo
Ta xem xÐt qu¸ tr×nh chÌn mét phÇn tö vµo m¶ng míi (gi¶ sö chÌn 2
vµo). Khi ®ã, c¸c phÇn tö 3 vµ 5 ®· ®îc chÌn vµ qu¸ tr×nh diÔn ra nh sau:
2 Tg
B1352748B235748B335748B42357
48
NÕu ta chia m¶ng c lµm hai phÇn vµ s¾p xÕp trªn hai phÇn ®ã th× ta
thu ®îc m¶ng c cã 2 nöa c1 vµ c2 ®· ®îc s¾p d¹ng:
Cuèi cïng, dïng gi¶i thuËt trén ë trªn ®Ó trén c1 vµ c2 ®Ó thu ®îc mét
m¶ng c ®· ®îc s¾p:
ý tëng trªn cho ta mét thuËt to¸n s¾p xÕp rÊt tèt nÕu nh trªn 2 m¶ng c1
vµ c2 ta l¹i ¸p dông chia thµnh c¸c m¶ng con ®Ó s¾p xÕp vµ trén chóng vµ
cø nh vËy m·i cho tíi khi c¸c m¶ng con chØ cßn 1 phÇn tö. ¸p dông ®Ö quy
vµo c¸ch chia, s¾p xÕp, trén nµy ta thu ®îc ph¬ng ph¸p s¾p xÕp trén æn
®Þnh . kh«ng ¶nh hëng bëi thø tù ban ®Çu cña d÷ liÖu. Ph¬ng ph¸p nµy nãi
chung cÇn n.lg(n) lÇn so s¸nh ®Ó s¾p xÕp mét tËp d÷ liÖu n phÇn tö.
7. Ph¬ng ¸n s¾p xÕp QuickSort
ý tëng cña QuickSort còng lµ chia m¶ng a cÇn s¾p thµnh 2 phÇn nh ph-
¬ng ph¸p trén, tuy nhiªn ®iÓm chia ®îc tÝnh to¸n sao cho phï hîp.
®Ó x¸c ®Þnh ®îc ®iÓm chia, ta sö dông hµm Partition(L, R). Hµm nµy
sÏ sö dông ®Ó tr¶ vÒ ®iÓm chia lµm c¬ së ®Ó chia m¶ng a. NÕu ®iÓm chia
lµ i th×:
i = Partition(L, R);
Khi cã ®iÓm chia råi, ta sÏ chia a thµnh 2 nöa theo ®iÓm chia vµ ¸p
dông viÖc s¾p trªn 2 nöa, trén l¹i ®Ó thu ®îc mét m¶ng ®· ®îc s¾p. Tuy
nhiªn ®Ó s¾p trªn 2 nöa cña a, ta còng ¸p dông ph¬ng ph¸p t¬ng tù. Nh vËy,
gi¶i thuËt cã thÓ nh sau:
void QuickSort(int L, int R)
{
int i= Partition(L, R);
QuickSort(L, i-1);
QuickSort(i+1, R);
}
VÊn ®Ò cßn l¹i lµ hµm Partition x¸c ®Þnh ®iÓm chia nh thÕ nµo. Ta
cã thÓ h×nh dung ®iÒu nµy nh sau:
B1: LÊy phÇn tö cuèi cïng cña m¶ng lµm phÇn tö cÇm canh (tøc lµ a[R]).
B2: Cho i ch¹y tõ tr¸i sang cho tíi khi gÆp phÇn tö lín h¬n phÇn tö cÇm canh.
Cho j ch¹y tõ bªn ph¶i vÒ cho tíi khi gÆp phÇn tö nhë h¬n phÇn tö cÇm
canh.
B3: §¶o chç hai phÇn tö a[i] cho a[j]. Cho i, j tiÕp tôc ch¹y nh trong B2. TiÕp
tôc ®æi chç nh vËy cho tíi khi i vµ j giao nhau (tøc lµ i>=j).
B4: §æi chç a[i] cho a[j] lÇn cuèi. Khi ®ã, dÔ thÊy c¸c phÇn tö bªn tr¸i cña
a[i] ®Òu nhë h¬n a[i] vµ c¸c phÇn tö bªn ph¶i th× lín h¬n nã. §iÓm i
chÝnh lµ ®iÓm chia t×m ®îc. return i;
ThuËt to¸n nµy, thªm mét chót c¶i tiÕn sÏ lµ thuËt to¸n s¾p xÕp rÊt tèt
(trong trêng hîp d÷ liÖu bÊt kú) víi trung b×nh 2n.lg(n) phÐp so s¸nh.
ThËt vËy, gi¶i thuËt Partition cÇn duyÖt qua n phÇn tö ®Ó x¸c ®Þnh
®iÓm chia. Khi cã ®iÓm chia råi ta cÇn s¾p xÕp c¸c phÇn tö trªn 2 nöa cña
m¶ng. (mçi nöa tÝnh trung b×nh cã n/2 phÇn tö. Nh vËy tæng phÝ tæn lµ:
Cn = 2 Cn/2 + n.
Gi¶i c«ng thøc truy håi nµy cho ta ®îc ®é phøc t¹p: Cn = 2n.ln(n)
Khi sö dông tªn con trá trong biÓu thøc th× ®Þa chØ cña vïng nhí mµ nã
trá tíi sÏ ®îc sö dông trong biÓu thøc chø kh«ng ph¶i lµ gi¸ trÞ cña vïng nhí.
Khi con trá p trá tíi biÕn a th× ®Ó sö dông gi¸ trÞ cña biÕn a nµy th«ng
qua con trá p ta viÕt *p. Nh vËy 3 c¸ch viÕt sau lµ t¬ng ®¬ng:
b = 2*a + 3;
b = 2*(*p) + 3;
*q = 2*(*p) + 3;// víi q lµ con trá trá tíi biÕn b.
VD:
void main()
{
int a, b, x, *p, *q;
cout<<”NhËp a”;
cin>>a;
p = &a;
q = &b;
b = 2*a+3;
cout<<b;
*q = 2*a +3;
cout<<b;
*q = 2*(*p) +3.
cout<<b;
getch();
}
NhËn xÐt: Khi lÊy ®îc ®Þa chØ cña biÕn chøa vµo con trá, ta cã thÓ
sö dông con trá ®Ó thay ®æi gi¸ trÞ cña biÕn mµ nã trá tíi.
§Æc biÖt, ta cã thÓ g¸n con trá p cho mét con trá q kh¸c cïng kiÓu. Khi
®ã, hai con trá p, q sÏ trá tíi cïng mét vïng nhí cña cïng mét biÕn.
VD:
void main()
{
int a, *p, *q;
a = 2;
p=&a;
cout<<*p;
q = p;
cout<<*q;
getch();
}
else
if (s==-1)
cout<<”Ph¬ng tr×nh v« nghiÖm”;
else
{
cout<<” Ph¬ng tr×nh cã hai nghiÖm”<<x1<<” vµ
“<<x2;
float P = 2* x1+x2;
cout<<”Gi¸ trÞ cña P “<<P;
}
getch();
}
NhËn xÐt:
- C¸c gi¸ trÞ tr¶ vÒ cña hµm t¹i x1 vµ x2 cã thÓ ®îc sö dông tiÕp trong
ch¬ng tr×nh.
- Ch¬ng tr×nh sö dông c¶ c¸c gi¸ trÞ tr¶ vÒ cña c¸c ®èi ra vµ cña tªn hµm.
3. Con trá vµ m¶ng
a. Con trá vµ m¶ng mét chiÒu
Nh ®· biÕt, c¸c phÇn tö cña m¶ng cã thÓ ®îc x¸c ®Þnh th«ng qua chØ
sè. VÝ dô phÇn tö thø nhÊt lµ a[0], phÇn tö thø 2 lµ a[1]…
Ta cßn cã c¸ch thø 2 ®Ó x¸c ®Þnh c¸c phÇn tö cña m¶ng, kh«ng ph¶i
th«ng qua c¸c chØ sè mµ th«ng qua con trá.
Khi khai b¸o mét m¶ng a gåm 10 phÇn tö, m¸y tÝnh sÏ cÊp ph¸t 10 « nhí
liªn tiÕp nhau.
§iÒu ®Æc biÖt lµ: ®Þa chØ cña phÇn tö ®Çu tiªn cña m¶ng ®îc chøa
trong tªn m¶ng. Nh vËy a t¬ng ®¬ng víi &a[0] vµ tªn m¶ng t¬ng ®¬ng víi mét
con trá chøa ®Þa chØ cña phÇn tö ®Çu tiªn cña m¶ng.
Ta cã:
a chøa ®Þa chØ &a[0].
a+i chøa ®Þa chØ &a[i].
Nh vËy, nÕu p lµ con trá cïng kiÓu ta cã thÓ g¸n: p = a; vµ khi ®ã:
a[i] = p[i] = *(a+i) = *(p+i);
Thay b»ng truy cËp tíi phÇn tö thø i+1 cña m¶ng qua a[i] ta cã thÓ viÕt
p[i] hoÆc *(a+i) hoÆc *(p+i).
VD1:
float a[4];
a[0] = 0;
a[1] = 1;
a[2] = 2;
a[3] = 3;
cout<<a[3];
cout<<*(a+3);
float *p;
p = a;
cout<<p[3];
cout<<*(p+3);
getch();
}
VD2: NhËp vµo mét m¶ng 4 sè nguyªn vµ tÝnh tæng cña c¸c sè ®ã.
C¸ch 1:
void main()
{
float a[4];
for (int i=0; i<4; i++)
{
cout<<”NhËp a[“<<i<<”]”;
cin>>a[i];
}
float T=0;
for(i=0; i<4; i++)
T+=*(a+i);
cout<<”Tæng b»ng”<<T;
getch();
}
C¸ch 2:
void main()
{
float a[4], *p;
for (int i=0; i<4; i++)
{
cout<<”NhËp a[“<<i<<”]”;
cin>>a[i];
}
p=a; float T=0;
for(i=0; i<4; i++)
T+=p[i];
cout<<”Tæng b»ng”<<T;
getch();
}
C¸ch 3:
void main()
{
float a[4], *p;
for (int i=0; i<4; i++)
{
cout<<”NhËp a[“<<i<<”]”;
cin>>a[i];
}
p=a;
float T=0;
for(i=0; i<4; i++)
T+=*(p+i);
cout<<”Tæng b»ng”<<T;
getch();
}
Do tªn m¶ng còng t¬ng ®¬ng víi mét con trá nªn khi p lµ mét con trá
kiÓu nguyªn, ta cã thÓ khai b¸o int *p; nhng còng cã thÓ khai b¸o nh mét m¶ng
h×nh thøc: int p[]. MÆt kh¸c, thËm chÝ ta cã thÓ sö dông con trá p nh mét
m¶ng. Hµm Sum2() sau sÏ sö dông con trá a nh mét m¶ng.
VD: ViÕt hµm tÝnh tæng c¸c phÇn tö cña m¶ng 4 phÇn tö.
double Sum1(double a[])
{
double T=0;
for(int i=0; i<4; i++)
T+=a[i];
return T;
}
double Sum2(double *a)
{double T=0;
for(int i=0; i<4; i++)
T+=a[i];
return T;
}
void main()
{
double *b;
b[0] = 1; b[1] = 3;
b[2] = 2; b[3] = 5;
cout<<”Tæng thø nhÊt”<<Sum1(b);
Nh vËy, vÒ c¸ch tæ chøc bé nhí, m¶ng hai chiÒu thùc chÊt lµ m¶ng mét
chiÒu. Ta gäi lµ m¶ng cña m¶ng.
Tuy nhiªn, ta kh«ng thÓ g¸n trùc tiÕp tªn m¶ng hai chiÒu A cho mét con
trá p cïng kiÓu mµ ph¶i sö dông to¸n tö Ðp kiÓu.
Víi c¸ch hiÓu trªn, nÕu ta g¸n con trá thùc p = (float*)A th×:
p trá tíi A[0][0].
p+1 trá tíi A[0][1].
p+2 trá tíi A[0][2].
p+3 trá tíi A[1][0].
p+4 trá tíi A[1][1].
p+5 trá tíi A[1][2].
Nh vËy ta cã thÓ sö dông con trá trong qu¸ tr×nh truy cËp m¶ng hai
chiÒu. Víi m¶ng hai chiÒu, ®Ó nhËp c¸c phÇn tö m¶ng, ta chØ cÇn mét vßng
lÆp.
VD: NhËp d÷ liÖu cho m¶ng hai chiÒu th«ng qua con trá:
void main()
{
float a[2][3], *p;
p=(float*) a;
for(int i=0; i<6; i++)
scanf(“%f”, p+i);
}
HoÆc cã thÓ dïng ngay a nh lµ mét con trá víi to¸n tö Ðp kiÓu:
void main()
{
float a[2][3];
2 3 4 2
3 4 3 3
4 5 4
3
4
3
5
Ma trËn nµy l·ng phÝ rÊt nhiÒu « nhí (v× kh«ng dïng ®Õn) cã thÓ xem
nh lµ mét ma trËn tha.
§Ó kh¾c phôc ®îc tÝnh tr¹ng l·ng phÝ bé nhí, ta chuyÓn sang sö dông
m¶ng 1 chiÒu, nh vËy, m¶ng sè liÖu sÏ lµ:
2 3 4 3 4 4 3 5 2 3 4 3 4 3 5
Nh vËy sÏ tr¸nh ®îc t×nh tr¹ng l·ng phÝ bé nhí. Tuy nhiªn, mét vÊn ®Ò
kh¸c n¶y sinh lµ lµm thÕ nµo ®Ó cã ®îc sè liÖu cña xe i (i=1..4) bÊt kú.
Râ rµng ta cÇn dïng ®Õn mét m¶ng con trá ®Ó lu ®Þa chØ cña phÇn tö
®Çu tiªn trong d·y c¸c sè liÖu cña tõng xe, nh vËy th×:
2 3 4 3 4 4 3 5 2 3 4 3 4 3 5
Dùa vµo m¶ng con trá nµy ta cã thÓ lÊy ®îc th«ng tin cña tõng xe. Sau
®©y lµ code cña ch¬ng tr×nh.
#include "conio.h"
#include "iostream.h"
#include "stdio.h"
void main()
{
clrscr();
int a[100], n;
int *p[50], *q;
cout<<"Nhap n"; cin>>n;
//nhap thong tin cho n xe, ket thuc bang so 0.
p[0] =q = a;// cho con tro q vaf p[0] tro toi a[0]
for (int i=0; i<n; i++)
{
cout<<"Nhap so lieu cho xe "<<i+1<<endl;
cin>>*q;
while(*q!=0)
{
q++;
cin>>*q;
}
p[i+1]=q;
}
//xuat so lieu cua xe bay ky ra man hinh
int stt;
cout<<" can xem so lieu cua xe nao "; cin>>stt;//nhap stt thuoc [0..n-1]
for (q=p[stt-1]; q<p[stt]; q++)
cout<<*(q)<<" ";
getch();
}
5. Con trá hµm
Con trá hµm dïng ®Ó trá tíi c¸c hµm (hay chøa ®Þa chØ cña c¸c hµm).
Tuú theo d¹ng thøc cña c¸c hµm mµ ta khai b¸o con trá hµm t¬ng øng.
Hµm: <KiÓu tr¶ vÒ> <Tªn hµm> (<Danh s¸ch c¸c ®èi>);
Con trá hµm t¬ng øng: <KiÓu con trá> <(* <tªn con trá>)> <(danh s¸ch
c¸c kiÓu ®èi)>;
Trong ®ã:
<KiÓu con trá> : Ph¶i trïng víi kiÓu tr¶ vÒ cña hµm mµ nã sÏ trá tíi.
<tªn con trá>: lµ tuú ý ®Æt.
<Danh s¸ch c¸c kiÓu ®èi>: ph¶i t¬ng øng cíi c¸c kiÓu ®èi cña hµm mµ
nã sÏ trá tíi.
VD:
Hµm Con trá hµm t¬ng øng
int GT(int n); int (*p) (int)
void Check(double x, double y); void (*q) (double, double)
Khi khai b¸o con trá hµm song, ta cã thÓ cho nã trá vµo hµm t¬ng øng
b»ng c¸ch g¸n:
<tªn con trá> = <tªn hµm>;
VD: p = GT; hoÆc q = Check;
Tõ ®©y ta cã thÓ sö dông tªn con trá thay cho tªn hµm.
Trong trêng hîp khi gäi hµm, tham sè cña hµm l¹i lµ mét hµm kh¸c th×
®èi sè t¬ng øng ph¶i lµ con trá hµm.
x2 1
VD: ViÕt hµm tÝnh gi¸ trÞ cña biÓu thøc F(x) = , sau ®ã viÕt
x2 1
hµm tÝnh P(x, y) = F(x) + F(y)
include "conio.h"
#include "iostream.h"
#include "stdio.h"
float ham(float x)
{
return (x*x-1)/ (x*x+1);
}
void main()
{
clrscr();
void main()
{
clrscr();
int x=5;
cout<<"F la "<<F(TS,MS, x);
getch();
}