Professional Documents
Culture Documents
[1]. 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 ®îc ®Æt tuú ý nhng tu©n theo quy íc ®Æt tªn trong C++.
[2]. KiÓu gi¸ trÞ tr¶ vÒ cña hµm: NÕu hµm tr¶ vÒ mét gi¸ trÞ th× gi¸
trÞ ®ã ph¶i thuéc mét kiÓu d÷ liÖu nµo ®ã; 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.
[3]. 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.
[4]. 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
Tïy theo nguån gèc cña hµm ta ph©n ra:
- C¸c hµm cã s½n: Lµ c¸c hµm chøa trong c¸c th viÖn cña C++, ®· ®îc
®Þnh nghÜa tõ tríc. C¸c hµm nµy ®îc ®Æt trong c¸c th viÖn .h. Ngêi lËp
tr×nh chØ viÖc sö dông chóng th«ng qua c¸c chØ thÞ:
#include <Tªn th viÖn chøa hµm>
mµ kh«ng cÇn ®Þnh nghÜa hµm.
VD: C¸c hµm sqrt(); sin(); cos(); gets(); puts() .v.v…
- C¸c hµm tù ®Þnh nghÜa: Lµ c¸c hµm mµ tríc khi dïng chóng ta ph¶i
®Þnh nghÜa chóng. C¸c hµm nµy còng cã thÓ ®îc tËp hîp l¹i trong mét file .h
®Ó dïng nh mét th viÖn cã s½n.
Tuú theo kiÓu cña gi¸ trÞ tr¶ vÒ cña hµm ta ph©n ra:
- 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. C¸c gi¸
trÞ tÝnh to¸n ®îc trong th©n hµm thêng ®îc kÕt xuÊt lªn mµn h×nh.
- Hµm cã gi¸ trÞ tr¶ vÒ: Ngoµi viÖc thùc hiÖn mét c«ng viÖc nµo ®ã,
hµm nµy cßn tr¶ vÒ mét gi¸ trÞ th«ng qua tªn hµm. Gi¸ trÞ nµy cã thÓ ®îc dïng
trong nh÷ng ®o¹n tr×nh tiÕp theo sau lêi gäi hµm.
NhËn xÐt:
- 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.
4. §Þnh nghÜa vµ sö dông hµm
a. CÊu tróc mét hµm:
Mét hµm thêng cã cÊu tróc nh sau:
- Hµm kh«ng cã gi¸ trÞ tr¶ vÒ (hµm void):
Trong ®ã:
- <KiÓu hµm>: lµ kiÓu gi¸ trÞ tr¶ vÒ cña hµm. NÕu hµm kh«ng cã gi¸
trÞ tr¶ vÒ, ta dïng kiÓu void. Ngîc l¹i, ta thêng sö dông c¸c kiÓu chuÈn nh
int, float, double, char…
- <Tªn hµm>: do ngêi dïng tù ®Þnh nghÜa.
- [<kiÓu ®èi> <tªn ®èi>]: liÖt kª danh s¸ch c¸c ®èi cña hµm vµ kiÓu d÷
liÖu cña ®èi (nÕu hµm cã ®èi).
VD1: hµm tÝnh n! ®îc viÕt theo 2 d¹ng: cã vµ kh«ng cã gi¸ trÞ tr¶ vÒ:
C¸ch 1: Hµm cã gi¸ trÞ tr¶ vÒ C¸ch 2: Hµm kh«ng cã gi¸ trÞ tr¶ vÒ
long GT(int n) void GT(int n)
{ {
long kq=1; long kq=1;
for (int i=1; i<=n; i++) for (int i=1; i<=n; i++)
kq *=i; kq *=i;
return kq; cout<<kq;
} }
NhËn xÐt:
- Hai ®iÓm kh¸c nhau c¬ b¶n gi÷a hai lo¹i hµm nµy lµ: KiÓu tr¶ vÒ
(long vµ void) vµ c©u lÖnh cuèi hµm (return kq; vµ cout<<kq;)
- NÕu hµm cã gi¸ trÞ tr¶ vÒ th× trong th©n hµm thêng dïng lÖnh:
return <Gi¸ trÞ tr¶ vÒ>;
Khi ®ã, gi¸ trÞ tr¶ vÒ sÏ ®îc g¸n vµo tªn hµm. Bªn ngoµi hµm ta sö dông gi¸
trÞ tr¶ vÒ nµy th«ng qua tªn hµm.
- <Gi¸ trÞ tr¶ vÒ> cã thÓ lµ h»ng, biÕn hoÆc hµm.
VD2: ViÕt hµm tÝnh gi¸ trÞ biÓu thøc
1 1 1 1
1 2 3 ... n nÕun ch½n
F= 2 2 2 2
n 1
2
nÕun lÎ
Mét vÊn ®Ò ®Æt ra lµ: khi nµo th× viÕt hµm díi d¹ng cã gi¸ trÞ tr¶
vÒ, khi nµo th× viÕt hµm kh«ng cã gi¸ trÞ tr¶ vÒ?
Nãi chung, tuú thuéc vµo bµi to¸n cô thÓ ta cã thÓ quyÕt ®Þnh ®iÒu
nµy, tuy nhiªn:
- NÕu ta chØ dïng hµm ®Ó thùc thi mét c«ng viÖc nµo ®ã mµ kÕt qu¶
cña nã chØ cÇn ®îc kÕt xuÊt ra mµn h×nh lµ ®ñ th× hµm thêng ®îc viÕt díi
d¹ng kh«ng cã gi¸ trÞ tr¶ vÒ.
- NÕu kÕt qu¶ tr¶ vÒ cña hµm cã thÓ ®îc dïng trong nh÷ng c«ng viÖc
tiÕp theo (tøc ta cßn sö dông chóng sau nµy) th× hµm thêng ®îc viÕt díi d¹ng
cã gi¸ trÞ tr¶ vÒ.
b. C¸ch tæ chøc c¸c hµm
C¸ch 1: C¸c hµm ®Æt trong cïng mét tÖp víi hµm main().
Ch¬ng tr×nh ngoµi hµm main() cßn cã c¸c hµm kh¸c th× ®îc viÕt theo
cÊu tróc sau:
D¹ng 1: Hµm ®Æt tríc hµm main() D¹ng 2: Hµm ®Æt sau hµm main()
#include… #include…
…. ….
//C¸c hµm ®Æt ë ®©y //Nguyªn mÉu cña hµm ®Æt ë ®©y
… …
void main() void main()
{ {
Th©n hµm main; Th©n hµm main;
} }
//C¸c hµm ®Æt ë ®©y
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 (.CPP) 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.
c. Sö dông hµm
§Ó n¾m c¸ch sö dông hai lo¹i hµm trªn, ta xÐt c¸ch sö dông c¸c biÕn vµ
c¸c lÖnh trong ch¬ng tr×nh.
Gi¶ sö ta xÐt a, b lµ mét biÕn vµ gets() lµ mét lÖnh cã trong ch¬ng
tr×nh. khi ®ã:
C¸ch viÕt sai C¸ch viÕt ®óng
a; b = a;
cout<<gets(b); gets(a);
Tøc lµ:
- C¸c biÕn kh«ng ®îc dïng mét c¸ch ®éc lËp mµ lu«n ®îc viÕt trong mét
lÖnh nµo ®ã hoÆc trong biÓu thøc cña lÖnh g¸n.
- C¸c lÖnh cã thÓ ®îc dïng ®éc lËp mµ kh«ng thÓ dïng lÖnh nµy bªn
trong lÖnh kia.
Ghi nhí:
- C¸c hµm cã gi¸ trÞ tr¶ vÒ dïng nh mét biÕn.
- C¸c hµm kh«ng cã gi¸ trÞ tr¶ vª dïng nh mét lÖnh.
Mét sè nguyªn t¾c khi dïng hµm:
- 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è (hay ®èi sè thùc 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> <( )>.
5. 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: lµ c¸c biÕn 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 biÕn toµn côc 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é: lµ c¸c biÕn cã ph¹m vi ho¹t ®éng bÞ h¹n chÕ: 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; //bien toan cuc
if (a%2==0)
{ int x=5; x+= a;
cout<<”BiÕn x trong hµm “<< x; // bien cuc bo
}
}
void main()
{
x=1; int a = 2;
Ham(a);
cout<< “BiÕn x trong hµm main “<<x; //bien toan cuc
int x = 3;
cout<<”BiÕn x trong hµm main “<<x; //bien cuc bo
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.
II. Sö dông c¸c tham sè trong lËp tr×nh ®¬n thÓ
int n=1;
cout<<”Gi¸ trÞ tríc khi gäi hµm “<<n;
tang(n);
cout<<”Gi¸ trÞ sau khi gäi hµm “<<n;
getch();
}
VD2: xÐt hµm sau
int Ham(int a, int b)
{
if (a%2==0){
a+=1;
b+=a;
}
cout<<”Gi¸ trÞ a trong th©n hµm “<<a;
cout<<Gi¸ trÞ b trong th©n hµm “<<b;
}
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();
}
III. Kü thuËt ®Ö quy
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 =3. Khi ®ã, quy tr×nh thùc hiÖn nh sau:
3! = 3 * 2!
2! = 1! * 2
1! = 1
NÕu biÕt 1!=1 th× ta cã thÓ tõ ®ã tÝnh ®îc 2! vµ 3!. VËy thø tù thùc
hiÖn c«ng viÖc tÝnh to¸n sÏ lµ: 1!, 2!, 3! (tøc ph¶i gäi hµm tÝnh n! tíi 3 lÇn
víi 3 ®èi vµo 1, 2, 3).
- 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Ò.
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).
KÕt thóc
Return 1*2*3 Return 1*2 Return 1
if (suy biÕn)
C«ng thøc trong trêng hîp suy biÕn.
else
C«ng thøc trong trêng hîp tæng qu¸t.
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;
}
Nh vËy, 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;
}
}
Hµm ®Ö quy:
Bíc 1:
- Suy biÕn : b=0; c«ng thøc suy biÕn: USCLN(a, b) = b;
- Kh«ng suy biÕn: b kh¸c 0; c«ng thøc tæng qu¸t: USCLN (a, b) =
USCLN(b, a%b);
Bíc 2:
if (b==0)
return a;
else
return USCLN(b, a%b)
LËp tr×nh: