C++Chuong 04

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 12

Chng 4.

Hm






Chng ny m t nhng hm do ngi dng nh ngha nh l mt trong
nhng khi chng trnh C++. Hm cung cp mt phng thc ng gi
qu trnh tnh ton mt cch d dng c s dng khi cn. nh ngha
hm gm hai phn: giao din v thn.

Phn giao din hm (cng c gi l khai bo hm) c t hm c th
c s dng nh th no. N gm ba phn:
Tn hm. y ch l mt nh danh duy nht.
Cc tham s ca hm. y l mt tp ca khng hay nhiu nh danh
nh kiu c s dng truyn cc gi tr ti v t hm.
Kiu tr v ca hm. Kiu tr v ca hm c t cho kiu ca gi tr m
hm tr v. Hm khng tr v bt k kiu no th nn tr v kiu void.
Phn thn hm cha ng cc bc tnh ton (cc lnh).

S dng mt hm lin quan n vic gi n. Mt li gi hm gm c tn
hm, theo sau l cp du ngoc n (), bn trong cp du ngoc l khng,
mt hay nhiu i s c tch bit nhau bng du phy. S cc i s phi
khp vi s cc tham s ca hm. Mi i s l mt biu thc m kiu ca n
phi khp vi kiu ca tham s tng ng trong khai bo hm.

Khi li gi hm c thc thi, cc i s c c lng trc tin v
cc gi tr kt qu ca chng c gn ti cc tham s tng ng. Sau
thn hm c thc hin. Cui cng gi tr tr v ca hm c truyn ti
thnh phn gi hm.

V mt li gi ti mt hm m kiu tr v khng l void s mang li mt
gi tr tr v nn li gi l mt biu thc v c th c s dng trong cc
biu thc khc. Ngc li mt li gi ti mt hm m kiu tr v ca n l
void th li gi l mt lnh.

Chng 4: Hm 45
4.1. Hm n gin
Danh sch 4.1 trnh by nh ngha ca mt hm n gin tnh ly tha
ca mt s nguyn.

Danh sch 4.1
1
2
3

4
5
6
7
int Power (int base, unsigned int exponent)
{
int result = 1;

for (int i = 0; i < exponent; ++i)
result *= base;
return result;
}
Ch gii
1 Dng ny nh ngha giao din hm. N bt u vi kiu tr v ca hm
(l int trong trng hp ny). K tip l tn hm, theo sau l danh sch
cc tham s. Power c hai tham s (base v exponent) thuc kiu int v
unsigned int tng ng. Ch l c php cho cc tham s l tng t nh
c php cho nh ngha bin: nh danh kiu c theo sau bi tn tham
s. Tuy nhin, khng th theo sau nh danh kiu vi nhiu tham s phn
cch bi du phy:
int Power (int base, exponent) // Sai!
2 Du ngoc ny nh du im bt u ca thn hm.
3 Dng ny l nh ngha mt bin cc b.
4-5 Vng lp for ny tng c s base ln ly tha ca exponent v lu tr kt
qu vo trong result.
6 Hng ny tr result v nh l kt qu ca hm.
7 Du ngoc ny nh du im kt thc ca thn hm.

Danh sch 4.2 minh ha hm c gi nh th no. Tc ng ca li gi
hm ny l u tin cc gi tr 2 v 8 tng ng c gn cho cc tham s
base va exponent, v sau thn hm c c lng.

Danh sch 4.2
1

2
3
4
5
#include <iostream.h>

main (void)
{
cout << "2 ^ 8 = " << Power(2,8) << '\n';
}

Khi chy chng trnh ny xut ra kt qu sau:

2 ^ 8 = 256

Chng 4: Hm 46
Ni chung, mt hm phi c khai bo trc khi s dng n. Khai bo
hm (function declaration) n gin gm c mu ban u ca hm gi l
nguyn mu hm (function prototype) ch nh tn hm, cc kiu tham s, v
kiu tr v. Hng 2 trong Danh sch 4.3 trnh by hm Power c th c khai
bo nh th no cho chng trnh trn. Nhng mt hm cng c th c
khai bo m khng cn tn cc tham s ca n,

int Power (int, unsigned int);

tuy nhin chng ta khng nn lm iu tr phi vai tr ca cc tham s l r
rng.

Danh sch 4.3
1

2

3
4
5
6

7
8
9

10
11
12
13
#include <iostream.h>

int Power (int base, unsigned int exponent); // khai bao ham

main (void)
{
cout << "2 ^ 8 = " << Power(2,8) << '\n';
}

int Power (int base, unsigned int exponent)
{
int result = 1;

for (int i = 0; i < exponent; ++i)
result *= base;
return result;
}

Bi v mt nh ngha hm cha ng mt nguyn mu (prototype) nn
n cng c xem nh l mt khai bo. V th nu nh ngha ca mt hm
xut hin trc khi s dng n th khng cn khai bo thm vo. Tuy nhin
vic s dng cc nguyn mu hm l khuyn khch cho mi trng hp. Tp
hp ca nhiu hm vo mt tp tin header ring bit cho php nhng lp trnh
vin khc truy xut nhanh chng ti cc hm m khng cn phi c ton b
cc nh ngha ca chng.

4.2. Tham s v i s
C++ h tr hai kiu tham s: gi tr v tham chiu. Tham s gi tr nhn mt
sao chp gi tr ca i s c truyn ti n. Kt qu l, nu hm c bt k
chuyn i no ti tham s th vn khng tc ng n i s. V d, trong

#include <iostream.h>

void Foo (int num)
{
num = 0;
Chng 4: Hm 47
cout << "num = " << num << '\n';
}

int main (void)
{
int x = 10;

Foo(x);
cout << "x = " << x << '\n';
return 0;
}

th tham s duy nht ca hm Foo l mt tham s gi tr. n lc m hm ny
c thc thi th num c s dng nh l mt bin cc b bn trong hm.
Khi hm c gi v x c truyn ti n, num nhn mt sao chp gi tr ca
x. Kt qu l mc d num c t v 0 bi hm nhng vn khng c g tc
ng ln x. Chng trnh cho kt qu nh sau:

num = 0;
x = 10;

Tri li, tham s tham chiu nhn cc i s c truyn ti n v lm
trc tip trn i s . Bt k chuyn i no c to ra bi hm ti tham
s tham chiu u tc ng trc tip ln i s.

Bn trong ng cnh ca cc li gi hm, hai kiu truyn i s tng ng
c gi l truyn-bng-gi tr v truyn-bng-tham chiu. Tht l hon
ton hp l cho mt hm truyn-bng-gi tr i vi mt vi tham s v
truyn-bng-tham chiu cho mt vi tham s khc. Trong thc t th truyn-
bng-gi tr thng c s dng nhiu hn.

4.3. Phm vi cc b v ton cc
Mi th c nh ngha mc phm vi chng trnh (ngha l bn ngoi cc
hm v cc lp) c hiu l c mt phm vi ton cc (global scope). Cc
hm v d m chng ta thy cho n thi im ny u c mt phm vi
ton cc. Cc bin cng c th nh ngha phm vi ton cc:

int year = 1994; // bin ton cc
int Max (int, int); // hm ton cc
int main (void) // hm ton cc
{
//...
}

Cc bin ton cc khng c khi to, s c khi to t ng l 0.

V cc u vo ton cc l c th thy c mc chng trnh nn
chng cng phi l duy nht mc chng trnh. iu ny ngha l cng cc
bin hoc hm ton cc c th khng c nh ngha nhiu hn mt ln
Chng 4: Hm 48
mc ton cc. (Tuy nhin chng ta s thy sau ny mt tn hm c th c
s dng li). Thng thng cc bin hay hm ton cc c th c truy xut
t mi ni trong chng trnh.

Mi khi trong mt chng trnh nh ngha mt phm vi cc b. Tht
vy, thn ca mt hm trnh by mt phm vi cc b. Cc tham s ca mt
hm c cng phm vi nh l thn hm. Cc bin c nh ngha bn trong
mt phm vi cc b c th nhn thy ti ch phm vi . Do mt bin ch
cn l duy nht trong phm vi ca chnh n. Cc phm vi cc b c th lng
nhau, trong trng hp ny cc phm vi bn trong chng ln cc phm vi bn
ngoi. V d trong

int xyz; // xyz l ton cc
void Foo (int xyz) // xyz l cc b cho thn ca Foo
{
if (xyz > 0) {
double xyz; // xyz l cc b cho khi ny
//...
}
}

c ba phm vi ring bit, mi phm vi cha ng mt xyz ring.

Thng thng, thi gian sng ca mt bin b gii hn bi phm vi ca
n. V th, v d cc bin ton cc tn ti sut thi gian thc hin chng
trnh trong khi cc bin cc b c to ra khi phm vi ca chng bt u v
mt i khi phm vi ca chng kt thc. Khng gian b nh cho cc bin ton
cc c dnh ring trc khi s thc hin ca chng trnh bt u nhng
ngc li khng gian b nh cho cc bin cc b c cp pht thi im
thc hin chng trnh.
4.4. Ton t phm vi
Bi v phm vi cc b ghi chng ln phm vi ton cc nn mt bin cc b c
cng tn vi bin ton cc lm cho bin ton cc khng th truy xut c ti
phm vi cc b. V d, trong

int error;

void Error (int error)
{
//...
}

bin ton cc error l khng th truy xut c bn trong hm Error bi v n
c ghi chng bi tham s error cc b.

Vn ny c gii quyt nh vo s dng ton t phm vi n hng
(::) , ton t ny ly u vo ton cc nh l i s:

Chng 4: Hm 49
int error;

void Error (int error)
{
//...
if (::error != 0) // tham kho ti error ton cc
//...
}

4.5. Bin t ng
Bi v thi gian sng ca mt bin cc b l c gii hn v c xc nh
hon ton t ng nn nhng bin ny cng c gi l t ng. B xc nh
lp lu tr auto c th c dng ch nh r rng mt bin cc b l t
ng. V d:

void Foo (void)
{
auto int xyz; // nh l: int xyz;
//...
}

iu ny t khi c s dng bi v tt c cc bin cc b mc nh l t
ng.

4.6. Bin thanh ghi
Nh c cp trc , ni chung cc bin biu th cc v tr b nh ni
m gi tr ca bin c lu tr ti. Khi m chng trnh tham kho ti mt
bin (v d, trong mt biu thc), trnh bin dch pht ra cc m my truy xut
ti v tr b nh c biu th bi cc bin. i vi cc bin dng thng
xuyn (v d nh cc bin vng lp), hiu xut chng trnh c th thu c
bng cch gi bin trong mt thanh ghi, bng cch ny c th trnh c truy
xut b nh ti bin .

B lu tr thanh ghi c th c s dng ch nh cho trnh bin dch
bin c th c lu tr trong mt thanh ghi nu c th. V d:

for (register int i = 0; i < n; ++i)
sum += i;

y mi vng lp i c s dng ba ln: mt ln khi n c so snh vi n,
mt ln khi n c cng vo sum, v mt ln khi n c tng. V th vic
gi bin i trong thanh ghi trong sut vng lp for l c ngha trong vic ci
thin hiu sut chng trnh.

Ch rng thanh ghi ch l mt gi cho trnh bin dch, v trong mt vi
trng hp trnh bin dch c th chn khng s dng thanh ghi khi n c
Chng 4: Hm 50
yu cu lm iu . Mt l do l gii l bt k my tnh no cng c mt
s hu hn cc thanh ghi v n c th trong trng hp tt c cc thanh ghi
ang c s dng.

Thm ch khi lp trnh vin khng khai bo thanh ghi, nhiu trnh bin
dch ti u c gng thc hin mt d on thng minh v s dng cc thanh
ghi m chng mun ci thin hiu sut ca chng trnh.

tng s dng khai bo thanh ghi thng c xut sau cng; ngha
l sau khi vit m chng trnh hon tt lp trnh vin c th xem li m v
chn cc khai bo thanh ghi vo nhng ni cn thit.

4.7. Hm ni tuyn
Gi s mt chng trnh thng xuyn yu cu tm gi tr tuyt i ca mt
s cc s nguyn. Cho mt gi tr c biu th bi n, iu ny c th c
gii thch nh sau:

(n > 0 ? n : -n)

Tuy nhin, thay v ti to biu thc ny ti nhiu v tr khc nhau trong
chng trnh, tt hn ht l nn nh ngha n trong mt hm nh sau:

int Abs (int n)
{
return n > 0 ? n : -n;
}

Phin bn hm c mt s cc thun li. Th nht, n lm cho chng
trnh d c. Th hai, n c th c s dng li. V th ba, n trnh c
hiu ng ph khng mong mun khi i s chnh n l mt biu thc c cc
hiu ng ph.

Tuy nhin, bt li ca phin bn hm l vic s dng thng xuyn c
th dn ti s bt li v hiu sut ng k v cc tn ph dnh cho vic gi
hm. V d, nu hm Abs c s dng trong mt vng lp c lp i lp li
mt ngn ln th sau n s c mt tc ng trn hiu sut. Tn ph c th
c trnh bng cch nh ngha hm Abs nh l hm ni tuyn (inline):
inline int Abs (int n)
{
return n > 0 ? n : -n;
}

Hiu qu ca vic s dng hm ni tuyn l khi hm Abs c gi, trnh
bin dch thay v pht ra m gi hm Abs th m rng v thay th thn ca
hm Abs vo ni gi. Trong khi v bn cht th cng tnh ton c thc hin
nhng khng c lin quan n li gi hm v th m khng c cp pht stack.

Chng 4: Hm 51
Bi v cc li gi ti hm ni tuyn c m rng nn khng c vt ca
chnh hm c a vo trong m bin dch. V th, nu mt hm c
nh ngha ni tuyn trong mt tp tin th n khng sn dng cho cc tp tin
khc. Do , cc hm ni tuyn thng c t vo trong cc tp tin header
m chng c th c chia s.

Ging nh t kha register, inline l mt gi cho trnh bin dch thc
hin. Ni chung, vic s dng inline nn c hn ch ch cho cc hm n gin
c s dng thng xuyn m thi. Vic s dng inline cho cc hm di v
phc tp qu th chc chn b b qua bi trnh bin dch.
4.8. qui
Mt hm gi chnh n c gi l qui. qui l mt k thut lp trnh
tng qut c th ng dng cho cc bi ton m c th nh ngha theo thut
ng ca chnh chng. Chng hn bi ton giai tha c nh ngha nh sau:
Giai tha ca 0 l 1.
Giai tha ca mt s n l n ln giai tha ca n-1.

Hng th hai r rng cho bit giai tha c nh ngha theo thut ng ca
chnh n v v th c th c biu din nh mt hm qui:

int Factorial (unsigned int n)
{
return n == 0 ? 1 : n * Factorial(n-1);
}

Cho n bng 3, Bng 4.1 cung cp vt ca cc li gi Factorial. Cc khung
stack cho cc li gi ny xut hin tun t tng ci mt trn runtime stack.

Bng 4.1 Vt thc thi ca Factorial(3).

Call n n == 0 n * Factorial(n-1) Returns
Th nht 3 0 3 * Factorial(2) 6
Th hai 2 0 2 * Factorial(1) 2
Th ba 1 0 1 * Factorial(0) 1
Th t 0 1 1

Mt hm qui phi c t nht mt iu kin dng c th c tha.
Ngc li, hm s gi chnh n v hn nh cho ti khi trn stack. V d hm
Factorial c iu kin dng l n == 0. (Ch i vi trng hp n l s m
th iu kin s khng bao gi tha v Factorial s tht bi).



Chng 4: Hm 52
4.9. i s mc nh
i s mc nh l mt thun li lp trnh b bt i gnh nng phi ch
nh cc gi tr i s cho tt c cc tham s hm. V d, xem xt hm cho
vic bo co li:

void Error (char *message, int severity = 0);

y th severity c mt i s mc nh l 0; v th c hai li gi sau u hp
l:

Error("Division by zero", 3); // severity t ti 3
Error("Round off error"); // severity t ti 0

Nh l li gi hm u tin minh ha, mt i s mc nh c th c ghi
chng bng cch ch nh r rng mt i s.

Cc i s mc nh l thch hp cho cc trng hp m trong cc
tham s no ca hm (hoc tt c) thng xuyn ly cng gi tr. V d
trong hm Error, severity 0 li th ph bin hn l nhng trng hp khc v
v th l mt ng c vin tt cho i s mc nh. Mt cch dng cc i s t
ph hp c th l:

int Power (int base, unsigned int exponent = 1);

Bi v 1 (hoc bt k gi tr no khc) th khng chc xy ra thng xuyn
trong tnh hung ny.

trnh m h, tt c i s mc nh phi l cc i s theo ui. V
th khai bo sau l khng theo lut:

void Error (char *message = "Bomb", int severity); // Tri qui tc

Mt i s mc nh khng nht thit l mt hng. Cc biu thc ty c
th c s dng min l cc bin c dng trong cc biu thc l c sn
cho phm vi nh ngha hm (v d, cc bin ton cc).

Qui c c chp nhn dnh cho cc i s mc nh l ch nh chng
trong cc khai bo hm ch khng trong nh ngha hm.

4.10.i s hng lnh
Khi mt chng trnh c thc thi di mt h iu hnh (nh l DOS hay
UNIX) n c th nhn khng hay nhiu i s t dng lnh. Cc i s ny
xut hin sau tn chng trnh c th thc thi v c phn cch bi cc
khong trng. Bi v chng xut hin trn cng hng ni m cc lnh ca h
iu hnh pht ra nn chng c gi l cc i s hng lnh.
Chng 4: Hm 53

V d nh xem xt mt chng trnh c t tn l sum in ra tng ca
tp hp cc s c cung cp ti n nh l cc i s hng lnh. Hp thoi
4.1 minh ha hai s c truyn nh l cc i s ti hm sum nh th no ($
l du nhc UNIX).

Hp thoi 4.1
1
2
3
$ sum 10.4 12.5
22.9
$

Cc i s hng lnh c to ra sn cho mt chng trnh C++ thng
qua hm main. C hai cch nh ngha mt hm main:

int main (void);
int main (int argc, const char* argv[]);

Cch sau c s dng khi chng trnh c d tnh chp nhn cc i
s hng lnh. Tham s u, argc, biu th s cc i s c truyn ti chng
trnh (bao gm c tn ca chnh chng trnh). Tham s th hai, argv, l mt
mng ca cc hng chui i din cho cc i s. V d t hng lnh cho
trong hp thoi 4.1, chng ta c:
argc is 3
argv[0] is "sum"
argv[1] is "10.4"
argv[2] is "12.5"

Danh sch 4.4 minh ha mt thi cng n gin cho chng trnh tnh tng
sum. Cc chui c chuyn i sang s thc s dng hm atof c nh
ngha trong th vin stdlib.h.
Danh sch 4.4
1
2

3
4
5
6
7
8
9
10
#include <iostream.h>
#include <stdlib.h>

int main (int argc, const char *argv[])
{
double sum = 0;
for (int i = 1; i < argc; ++i)
sum += atof(argv[i]);
cout << sum << '\n';
return 0;
}





Chng 4: Hm 54
Bi tp cui chng 4
4.1 Vit chng trnh trong bi tp 1.1 v 3.1 s dng hm.

4.2 Chng ta c nh ngha ca hm Swap sau

void Swap (int x, int y)
{
int temp = x;
x = y;
y = temp;
}

cho bit gi tr ca x v y sau khi gi hm:

x = 10;
y = 20;
Swap(x, y);

4.3 Chng trnh sau xut ra kt qu g khi c thc thi?

#include <iostream.h>
char *str = "global";

void Print (char *str)
{
cout << str << '\n';
{
char *str = "local";
cout << str << '\n';
cout << ::str << '\n';
}
cout << str << '\n';
}

int main (void)
{
Print("Parameter");
return 0;
}

4.4 Vit hm xut ra tt c cc s nguyn t t 2 n n (n l s nguyn dng):

void Primes (unsigned int n);

Mt s l s nguyn t nu nh n ch chia ht cho chnh n v 1.

4.5 nh ngha mt bng lit k gi l Month cho tt c cc thng trong nm v s
dng n nh ngha mt hm nhn mt thng nh l mt i s v tr v
n nh l mt hng chui.

4.6 nh ngha mt hm inline IsAlpha, hm tr v khc 0 khi tham s ca n l
mt k t v tr v 0 trong cc trng hp khc.
Chng 4: Hm 55

4.7 nh ngha mt phin bn qui ca hm Power c trnh by trong
chng ny.

4.8 Vit mt hm tr v tng ca mt danh sch cc gi tr thc

double Sum (int n, double val ...);

trong n biu th s lng cc gi tr trong danh sch.



Chng 4: Hm 56

You might also like