Professional Documents
Culture Documents
,
(|()|) , >
(
+ )
()
, <
3. Vit chng trnh gii h phng trnh ba n y bng cng thc
nh thc Cramer.
Cu trc lp
Trong thc t, chng ta gp nhiu tnh hung lp i lp li. Vi mc ch
ny, ngn ng C++ cung cp cho chng ta cc cu trc lp tng ng.
1. Vng lp while
C php:
while (biu_thc_iu_kin_ng)
{
.
}
Gii thch: Nu biu_thc_iu_kin ng, cc lnh bn trong vng lp s
c thc hin cho n khi n nhn gi tr sai.
V d Kt qu
#include<iostream>
using namespace std;
Nhap n:5
5
Chng 6. Cc cu trc lnh iu khin
T r a n g | 61
C
+
+
int main()
{
int n;
cout<<Nhap n:;
cin>>n;
while (n>0){
cout<<n<<endl;
n--;
}
return 0;
}
4
3
2
1
Gii thch: u tin nhp vo gi tr cho bin n. N nhp vo y l 5. Vng
lp while kim tra iu kin n>0. iu kin ny ng, nn cc lnh trong
vng lp s c thc hin. N s in ra gi tr ca n l 5. Sau , gi tr ca n
gim i 1, tc l n = 4. Vng lp li tip tc thc hin, v n>0 cn ng. Qu
trnh ny c tip tc, cho n khi n=0. Khi , iu kin n>0 l sai. Do ,
vng lp s dng li. Gi tr in ra mn hnh l cc s t 5 gim n 1.
Lu : khi s dng vng lp while cn lu cc im sau y:
Vng lp phi c tnh dng. Ngha l biu_thc_iu_kin phi c trng
hp sai. Trong mt s tnh hung, ngi ta vn s dng vng lp v hn,
nhng cn c c ch thot khi vng lp khi cn thit.
Nu c nhiu lnh chu s chi phi ca while, th chng cn c t
trong du khi lnh.
2. Vng lp dowhile
C php:
do
{
.
}while (biu_thc_iu_kin_ng);
Chng 6. Cc cu trc lnh iu khin
T r a n g | 62
C
+
+
Gii thch: Thc hin cc lnh trong vng lp, sau kim tra
biu_thc_iu_kin. Nu biu_thc_iu_kin cn ng, th tip tc lp.
V d Kt qu
#include<iostream>
using namespace std;
int main(){
int n;
cout<<Nhap n:;
cin>>n;
do {
cout<<n<<endl;
n--;
}while(n>0);
return 0;
}
Nhap n:5
5
4
3
2
1
0
Gii thch: u tin nhp vo gi tr cho bin n. Gi tr n nhp vo y l 5.
Vng lp dowhile s thc thi cc lnh bn trong n. N s in ra gi tr ca
n l 5. Sau , gi tr ca n gim i 1, tc l n = 4. Vng lp kim tra gi tr
ca biu thc n>0. V biu thc ny ng, nn n tip tc lp. Qu trnh ny
c tip tc cho n khi n=0. Gi tr n=0 vn c in ra, sau khi kim tra n>0
khng cn ng na, vng lp kt thc. Khc vi vng lp while trn, n
s in ra gi tr t 5 gim n 0.
Lu : khi s dng vng lp dowhile cn lu cc im sau y:
Vng lp phi c tnh dng. Ngha l biu_thc_iu_kin phi c trng
hp sai. Trong mt s tnh hung, ngi ta vn s dng vng lp v hn,
nhng cn c c ch thot khi vng lp khi cn thit.
Nu c nhiu lnh chu s chi phi ca dowhile, th chng cn c t
trong du khi lnh.
Chng 6. Cc cu trc lnh iu khin
T r a n g | 63
C
+
+
Vng lp dowhile lun thc hin cc lnh bn trong n, t nht 1 ln.
3. Vng lp for
C php:
for (biu_thc_khi_to; biu_thc_gii_hn; biu_thc_tng_gim)
{
.
}
Gii thch: Thc hin vng lp, vi s vng lp t biu_thc_khi_to cho
n biu_thc_gii_hn theo mc tng l biu_thc_tng_gim.
V d Kt qu
#include<iostream>
using namespace std;
int main()
{
int n, i;
cout<<Nhap n:;
cin>>n;
for (i=0; i<=n;i++) {
cout<<i<<endl;
};
return 0;
}
Nhap n:5
0
1
2
3
4
5
Gii thch: u tin nhp vo gi tr cho bin n. Gi tr n nhp vo y l 5.
Vng lp for s thc thi cc lnh bn trong vi s vng lp l t 0 n 5,
theo bc nhy l 1 tng ng vi i++.
Lu : khi s dng vng lp for cn lu cc im sau y:
Chng 6. Cc cu trc lnh iu khin
T r a n g | 64
C
+
+
Cc tham s trong vng lp for c th khuyt mt hoc vi (thm ch l
tt c) tham s. Tuy nhin, du chm phy l lun bt buc. S bc lp
ca vng lp for s c tnh nh sau:
___ ___
___
+1
Nu c nhiu lnh chu s chi phi ca for, th chng cn c t trong
du khi lnh.
Ta c th thc hin vic khai bo bin trc tip bn trong du ngoc n
ca vng lp for.
V d Kt qu
#include<iostream>
using namespace std;
int main()
{
int n;
cout<<Nhap n:;
cin>>n;
for (int i=0; i<=n;i++) {
cout<<i<<endl;
};
return 0;
}
Nhap n:5
0
1
2
3
4
5
4. Cc cu lnh nhy
a. Cu lnh break
Lnh break dng thot ra khi vng lp. Thng thng, khi ta s
dng cc vng lp khng xc nh c s ln lp, trnh lp v hn,
ngi ta thng s dng cu lnh break thot khi vng lp.
Chng 6. Cc cu trc lnh iu khin
T r a n g | 65
C
+
+
V d Kt qu
#include<iostream>
using namespace std;
int main()
{
int n = 2;
for(;;){
cout<<n<<endl;
n--;
if (n<0) break;
}
return 0;
}
2
1
0
Gii thch: Gi tr khi to ca n = 2. Vng lp for s tin hnh in gi tr ca
n, sau , gim gi tr ca n i 1. Cu lnh iu kin bn trong for s kim
tra iu kin ca n. Nu n<0, th lnh break s c thc hin v vng lp b
hy.
b. Cu lnh continue
Cu lnh continue thng c dng trong cc vng lp. Khi lnh
continue c gi, bc lp hin ti s c b qua, v tin hnh bc lp
tip theo.
V d Kt qu
#include<iostream>
using namespace std;
int main()
{
for(int i=0;i<10;i++){
if (i%2!=0)
continue;
cout<<i<<endl;
}
return 0;
}
0
2
4
6
8
Chng 6. Cc cu trc lnh iu khin
T r a n g | 66
C
+
+
Gii thch: Vng lp for s thc thi cc lnh bn trong n. Bin i chy t 0
n 9, kim tra iu kin i c phi l s chn hay khng. Nu i l s l, th
cu lnh continue s c thc hin v bc lp hin ti s b b qua. Nu i
l s chn, th lnh continue s khng c gi v bc lp hin ti vn
c thc hin. Do , lnh cout ch c thc hin trong trng hp bin
i l chn. Nh vy, mi khi gi tr i l chn, n s in kt qu. Nu gi tr ca i
l l, th kt qu s khng c in ra.
c. Lnh goto
Lnh goto cho php to ra mt bc nhy n mt nhn c n nh
sn. Tn nhn s c t nh sau tn_nhn: v lnh goto s nhy n tn
nhn. Mt li khuyn cho chng ta l nn hn ch ti a vic s dng lnh
goto. Bi v lnh goto thng lm ph v cu trc ca lp trnh hin i.
Nhiu ngn ng lp trnh h nh C ra i sau C++ nh Java tuyt giao
hon ton vi cu lnh goto ny.
Chng trnh Kt qu
#include <iostream>
using namespace std;
int main()
{
int n = 5;
loop://Tn nhn
cout<<n<<endl;
n--;
if(n>0) goto loop;
return 0;
}
5
4
3
2
1
Gii thch: Gi tr khi to ca bin n l 5. Nhn c t tn l loop. Nhn
c th hiu nh mt v tr c nh du (bookmark). Chng trnh tin
hnh in gi tr ca bin n. Sau , gim gi tr ca n i. Cu lnh iu kin,
kim tra gi tr ca biu thc n>0, nu ng thi lnh goto c gi v n s
c chuyn n v tr c nh du l loop. Chng trnh li thc thi
thm ln na k t v tr loop . Nu n<=0, lnh goto khng c gi.
Chng trnh kt thc. Vic s dng cc cu lnh lp, hon ton c th thay
Chng 6. Cc cu trc lnh iu khin
T r a n g | 67
C
+
+
th cho lnh goto. Hy lun ghi nh: CH NN s dng goto khi thc s cn
thit.
d. Lnh exit
Lnh exit dng thot khi chng trnh v tr v mt m c ch
nh. M ch nh ny ty thuc vo h iu hnh, n c th s dng trong
chng trnh theo quy c nh sau: nu chng trnh kt thc bnh
thng, th m chng trnh l 0; nu c mt s c khng mong mun xy
ra, th m chng trnh l mt gi tr khc 0.
void exit(int m_ch_nh);
Nu tham s m_ch_nh khng c cp vo, tc l exit (khng c du
ngoc n), th n s tin hnh theo mc nh tc gi tr 0. Hm exit nm
trong th vin stdlib.h. y l mt hm tng i c nm trong th vin .h.
Ta ch c th s dng lnh exit nu khai bo th vin stdlib.h m khng c
th vin tng ng l stdlib.
Cu trc la chn: switch
C php:
switch(biu_thc){
case hng_1:
nhm_cc_lnh;
break;
case hng_2:
nhm_cc_lnh;
break;
default:
nhm_cc_lnh;
}
Chng 6. Cc cu trc lnh iu khin
T r a n g | 68
C
+
+
Gii thch: kim tra gi tr ca biu thc, nu gi tr ca biu thc ri vo
danh sch hng, th n s thc hin cc lnh trong tng trng hp case
tng ng (nu l hng_1 cc lnh trong trng hp case hng_1, .). Nu
biu thc khng thuc vo danh sch hng, th n s thc hin lnh trong
trng hp default.
Chng trnh Kt qu
#include <iostream>
using namespace std;
int main()
{
char n;
cout<<Ban la nam hay nu b/g:<<endl;
cin>>n;
switch(n)
{
case b:
cout<<Nam;
break;
case g:
cout<<Nu;
break;
default:
cout<<Khong xac dinh;
}
return 0;
}
Ban la nam hay nu b/g:b
Nam
Gii thch: chng trnh buc ngi dng nhp vo mt k t (b boy) hay
(g girl). Nu ngi dng nhp vo mt k t khc, chng trnh vn tnh
n trng hp ny. K t m ngi dng nhp vo c lu trong bin n.
Cu lnh switch s kim tra bin nhp vo c nm trong danh sch hng
hay khng (danh sch hng y l b v g). Nu c, th tng ng vi b
n s thc hin trng hp case b, nu l g n s thc hin trng hp
case g. Lnh break trong mi trng hp c tc dng l thot ra khi cu
lnh la chn (cng mang tnh lp), nu khng c lnh break, tt c cc
trng hp u c xt duyt v nu ri vo trng hp no th cc lnh
tng ng s c thc thi, ng thi lnh trng hp bn di n cng
Chng 6. Cc cu trc lnh iu khin
T r a n g | 69
C
+
+
c thc thi. Trong trng hp, k t nhp vo khng tng ng trong
danh sch hng, n s thc thi trng hp default. V default l trng hp
cui cng, nn n khng cn lnh break.
Ch :
Lnh switch ch c la chn s dng khi cn kim tra gi tr ca
mt biu thc c tng ng vi mt tp cc hng s no hay khng (s
tng ng y c th l thuc hoc khng thuc tng ng vi khi nim
trong tp hp). Cc hng_1, hng_2, c th l mt vng lin tc, hoc gin
on (nh cc s t 0..1, a..d,). Nhng nht thit cc gi tr tng ng
vi cc trng hp case phi l hng s (hoc khong hng).
int a = 1;
switch(a>0)
{
case true:
cout<<"Duong";
break;
case false:
cout<<"Am";
break;
default:
cout<<"Khong";
}
Lin tc
int a = 1;
switch(a)
{
case 1: case 2: case 3:
cout<<"Xuan";
break;
case 4: case 5: case 6:
cout<<"Ha";
break;
case 7: case 8: case 9:
cout<<"Thu";
break;
case 10: case 11: case 12:
cout<<"Dong";
break;
default:
cout<<"Khong phai thang cua nam";
Ri rc
Chng 6. Cc cu trc lnh iu khin
T r a n g | 70
C
+
+
}
Biu thc trong lnh switch nht thit khng phi l mt kiu c cu
trc (mng, xu,). V d sau y s pht sinh li khi bin dch, do biu thc
tng ng vi mt xu.
string s = abc;
switch(s)
{
case a:
case ab:
case abc:
default:
}
Error
Trong hu ht cc ngn ng lp trnh, i a s u khng cho php tham
s trong switch l mt xu (cng nh lnh case of trong h Pascal Delphi).
Tuy nhin, ngn ng C# vn h tr xu k t trong tham s ca switch d
n l mt dn xut ca C++.
Mt iu cn lu , v bn cht th cu lnh switch s tng ng vi mt
dy cc cu lnh if. Chng hon ton c th thay th cho nhau. Cng tng
t, cc cu lnh lp while, do..while v for cng c th thay th cho nhau
mt cch hon ton. C ngha l chng ta ch cn nm c c php ca mt
trong ba cu lnh lp ny l c th vn dng trong mi trng hp. Tuy
nhin, chng vn c s dng trong cc trng hp mang tnh c trng.
iu ny rt hu ch cho nhng ngi tng lm quen vi ngn ng lp
trnh h Pascal Delphi. Bng sau y tng hp cc cch s dng ca cc
lnh c cu trc thng dng.
Tn lnh Cch dng
ifelse Khi cn kim tra mt hoc mt vi iu kin mang
tnh cht logic.
switch Khi cn kim tra iu kin hoc tnh thuc vo ca
mt bin s/biu thc trong mt danh sch hng
tng ng.
for Lp c s vng lp xc nh
while Cn kim tra iu kin lp trc khi thc hin
lnh, lp khng xc nh s vng lp.
dowhile Kim tra iu kin lp sau khi thc hin lnh, lp
khng xc nh s vng lp.
break Cn thot khi vng lp.
Chng 6. Cc cu trc lnh iu khin
T r a n g | 71
C
+
+
continue B qua vng lp hin ti, thc thi bc lp tip
theo.
goto Nhy n mt nhn c ch inh. Nn trnh s
dng, ch s dng trong nhng trng hp thc s
cn thit.
Bi tp 6.
1. S dng cc cu trc lp for, while, dowhile, goto xy dng cc
chng trnh tnh tch phn sau (vi mi cu trc xy dng mi
chng trnh) bng phng php hnh ch nht (tri, phi hoc
trung ta).
()
2. La chn cu trc lnh ph hp, tnh gi tr ca chui hu hn sau
y
=
3. Tnh cc tng sau y
=
++
+
=
!
+
!
++
!
=
+
+
+ !
++
()
+!
=
!
+
+
!
+
++
( )!
+
=
!
+
!
++()
!
vi n, x nhp vo t bn phm. Yu cu xy dng hm.
Chng 7. Hm
Trang | 72
CHNG 7. HM
Hm l mt tp hp cc cu lnh, n c thc thi khi c gi t mt v
tr khc trong chng trnh. Hy quan st lc bn di y:
Trong lc ny, cc hm c vit trong cc th vin khc nhau.
Trong chng trnh chnh, chng ta c th gi cc hm trong cc th vin,
ln cc hm c khai bo trong chng trnh chnh.
Nh vo vic s dng hm, chng ta c th phn chia chng trnh
thnh cc modul nh. i lc, ngi ta gi cch phn chia chng trnh
Th vin 1
Hm 1
Hm 2
Hm 3
Th vin 2
Hm 1
Hm 2
Hm 3
Th vin n
Hm 1
Hm 2
Hm 3
Chng trnh chnh
Hm 1
Hm main{
Gi Hm 1 (Th vin 1);
Gi Hm 2 (Th vin 2);
Gi Hm 3 (Th vin n);
Gi Hm 1 (chng trnh chnh)
Hnh 16 S minh ha vic s dng hm
Chng 7. Hm
T r a n g | 73
C
+
+
thnh cc hm nh th ny l cch gii quyt bi ton theo phng php
chia tr. Cch phn chia ny c rt nhiu u im:
Lm cho chng trnh tr nn gn gng d c hn.
D ci bin chng trnh.
D kim tra theo cc modul.
l tng xy dng hm. Vy hm c khai bo v s dng nh th
no. Chng ta s tm hiu trong chng ny.
Khai bo v s dng hm
C php:
kiu_d_liu tn_hm(danh_sch_tham_s)
{
Thn hm;
}
Trong ,
o kiu_d_liu: l kiu d liu m hm tr v.
o tn_hm: l tn ca hm, do ngi lp trnh t. Tn hm khng c
cha k t c bit, khng c bt u bng s, khng cha k t trng,
khng trng vi t kha.
o danh_sch_tham_s: l danh sch cc tham s dng nh cc bin cc
b. Nu c nhiu tham s, th chng s c phn tch theo cc du
phy.
o Thn hm: l ni dung m ngi lp trnh xy dng nn. Nu hm tr v
kiu d liu khc void, ta cn s dng lnh return tr v bin cha
kt qu v c cng kiu d liu vi kiu d liu ca hm. Nu hm tr v
kiu d liu void th iu ny l khng cn thit.
V d Kt qu
#include <iostream>
using namespace std;
int add(int a, int b)
{
3
Chng 7. Hm
T r a n g | 74
C
+
+
return a+b;
}
int main()
{
cout<<add(1, 2);
return 0;
}
Gii thch: Mi chng trnh trong C++ lun bt u bi hm main. iu
c ngha l cc lnh trong hm main s c thc thi mt cch tun t. i
tng cout s in gi tr ca hm add(1,2). Khi gi n hm add, n s nh x
n hm add c khai bo trn, n ch to ra mt li gi hm n
hm c xy dng c tn tng ng (chng ta cn lu n iu ny
phn bit vi khi nim hm ni tuyn s c tm hiu trong cc mc
tip theo). Vi a, b l cc tham s hnh thc, chng s c thay th bng
cc gi tr c th l 1 v 2. Hm add ny s tr v gi tr l tng ca a v b
nh t kha return.
Cch khai bo hm trong v d trn c gi l khai bo trc tip. Chng ta
cng cn mt cch khai bo hm gin tip na, m ta thng gi l khai bo
hm prototype nh sau:
V d Kt qu
#include <iostream>
using namespace std;
int add(int a, int b);
int main()
{
cout<<add(1, 2);
return 0;
3
Chng 7. Hm
T r a n g | 75
C
+
+
}
int add(int a, int b)
{
return a+b;
}
Trong khai bo hm dng ny, cu trc khai bo hm khuyt phn thn
hm. Ch c khai bo phn tn ca hm theo c php chun. Ta c th t
hm xy dng hon chnh bt k v tr no. Cch khai bo hm prototype
c nhiu u im:
- Khng cn quan tm n th t khai bo hm. Nu khng s dng khai
bo prototype, th hm khai bo sau mi c php gi hm khai bo trc
n. iu ngc li l khng c php. Nhng i vi khai bo prototype
th ta hon ton khng cn quan tm n iu ny.
- Ta c th tch phn khai bo prototype v t n vo trong mt tp tin
mi, thng l tp tin tiu .h (vi tn gi ty vo ngi lp trnh quy
nh), phn thn hm li cha trong mt tp khc, thng l .cpp hoc
trong chnh tp cha chng trnh chnh. Cch lm ny gip chng trnh
sng sa hn rt nhiu. Trong cc d n lp trnh ln, ngi ta thng
phn tch theo dng ny. Chng ta s xt v d minh ha sau.
Trong v d minh ha ny, d n ca ti gm c hai tp: tieude.h cha
khai bo prototype v main.cpp cha thn hm v hm main.
i vi Codeblocks, hy thc hin theo cc bc sau:
- To mi mt d n C++ v lu li. Trong d n ny, mc nh Codeblocks
s to mt tp main.cpp.
- Vo New > File > chn C/C++ header. Sau , hy chn v tr lu tr tp
tiu (thng thng, ta nn to cc th mc khc nhau lu tp .h cng
nh tp .cpp nh ti trnh by trn).
i vi Eclipse, thc hin nh sau:
- Kch chut phi vo th mc cn t tp .h, chn New > Header File.
Chng 7. Hm
T r a n g | 76
C
+
+
- Kch chut phi vo th mc cn t tp .cpp, chn New > Source File.
i vi Visual Studio 2010, kch chut phi vo tn d n, chn Add New
Item. Sau chn header file .h.
Tp tieude.h Tp main.cpp
#ifndef TIEUDE_H_INCLUDED
#define TIEUDE_H_INCLUDED
int sum(int, int);
void showmsg(void);
#endif // TIEUDE_H_INCLUDED
#include <iostream>
#include "tieude.h"
using namespace std;
int main()
{
showmsg();
return 0;
}
void showmsg(){
cout<<sum(1, 3);
}
int sum(int a, int b){
return a+b;
}
Trong tp tieude.h, ta ch vic nhp cc khai bo prototype vo gia #define
v #endif. Trong tp main.cpp, ta cn b sung khai bo th vin #include
tieude.h. Ch rng, tn tp tiu nm trong du nhy kp , m khng
phi l du <>. Cc hm trong chng trnh chnh c th s dng m khng
cn quan tm n th t khai bo. Nh chng ta thy, cc hm khai bo sau
hm main (iu ny ch c th c php i vi khai bo prototype). Hm
showmsg khai bo trc hm sum nhng c th gi c hm sum. Th t
tiu ca hm trong tp tiu hon ton khng quan trng v n khng
nh hng vic s dng cc hm theo th t trc sau.
Lu :
Khi s dng khai bo prototype trn cc tp tin .h, ta cn lu , nu d
n c s dng namespace, v d std, ta ch c th s dng c php truy
cp std:: m khng c s dng using namespace std trong tp .h ny.
Nu tp .cpp v tp .h nm trong cng th mc, th phn #include trong
tp cpp c th vit tn tp tiu trong du . Nu chng khng nm
trong cng th mc, ta cn ch ng dn tng i cho n. V d tp
headers.h nm trong th mc headers v tp main.cpp nm trong th
mc cpps. Nu tp headers.h l tp tiu ca tp main.cpp, ta cn
Chng 7. Hm
T r a n g | 77
C
+
+
include n trong main.cpp. Gi s headers v cpps nm trong cng th
mc src. Khi , trong tp main.cpp, hy khai bo nh sau:
#include../headers/headers.h. Trong , du ../ dch li mt mc
trong cu trc cy th mc (dch li t th mc headers mt mc chnh
l th mc src), sau l headers/headers.h.
Phm vi tc dng ca bin
Nh ti gii thiu trn, bin ton cc l nhng bin c khai
bo ngoi tt c cc hm (hay khng bao trong bt k du {} no). Cc bin
ny c tc dng trong ton b chng trnh. Ta c th gi n trong hm
main, hay trong cc hm khc. Ngc li, nhng bin cn li gi l cc bin
cc b. Nhng bin cc b c khai bo trong phm vi no (c xc nh
nh du {}) th ch c tc dng trong phm vi m thi.
V d Gii thch
#include <iostream>
using namespace std;
int global;
int add(int a, int b)
{
local result = a + b;
return result;
}
int main()
{
int local1;
if(local1>0)
{
int local2;
- Bin global l bin ton cc, n
c tc dng trong ton b
chng trnh. Ta c th s dng
n trong hm main, hm add
- Bin local, local1, local2 l cc
bin cc b. Bin local c khai
bo trong hm add, n c phm
vi tc dng trong phm vi ca
hm ny. Bin cc b local1 c
khai bo trong hm main. N
cng ch c tc dng trong hm
main. Bin local2 c khai bo
trong phm vi tc dng ca cu
lnh if, n ch c tc dng trong
khi lnh ny. Nu ta gi bin
ny ngoi khi lnh ca if,
chng trnh dch s bo li.
Chng 7. Hm
T r a n g | 78
C
+
+
}
return 0;
}
Hm khng tr v gi tr - Hm void.
Nh chng ta thy trong cc v d trn, cc hm m chng ta s
dng l cc hm c gi tr tr v. i vi cc loi hm ny, hm tr v
mt gi tr no , ta s dng t kha return. Gi tr hm tr v phi c kiu
d liu cng loi vi kiu d liu m ta quy nh khi khai bo hm.
Chng ta cng bt gp tnh hung: nhiu lc hm m ta xy dng khng tr
v mt gi tr no, hoc tr v nhiu hn mt gi tr. Khi , chng ta s
dng khai bo hm void. i vi hm khng tr v gi tr, ta c th tham
kho v d sau. Cn i vi hm tr v nhiu hn mt gi tr, chng ta s
tho lun k hn trong phn tham bin.
V d Kt qu
#include<iostream>
using namespace std;
void showMsg()
{
cout<<Hello, world !;
}
int main()
{
showMsg();
return 0;
}
Hello, world !
Ch :
Chng 7. Hm
T r a n g | 79
C
+
+
V hm c kiu d liu tr v lun tr v mt gi tr c th, nn chng
ta c th s dng trc tip loi hm ny trong cc biu thc tnh ton (v d
a=b+sin(x)). iu ny l khng th i vi hm void.
Khi s dng cc hm khng c tham s hnh thc, nu ta gi hm theo
cch sau: tn_hm(); l cch gi hm ng. Nu gi hm theo cch:
tn_hm;, th d chng trnh dch khng bo li, nhng kt qu nhiu khi
khng chnh xc. V vy, chng ta nn gi hm theo cch u tin.
Tham bin v tham tr
Cho n thi im ny, cc hm m chng ta nghin cu u
truyn tham s theo tham tr. iu ny c ngha l khi gi hm, cc gi tr
t cc i s truyn vo trong hm s c sao chp sang cc tham s ny,
cc tham s ch ng vai tr l cc tham s hnh thc, chng khng lu
li gi tr cho cc i s truyn vo, m cc gi tr b cc lnh trong
hm lm thay i.
V d Gii thch
#include <iostream>
using namespace std;
void setNum(int a)
{
a = 0;
}
int main()
{
int b = 1;
setNum(b);
cout<<b;
return 0;
Nu tham s a trong hm setNum
c s dng nh trn (n thun
l int a) th n c quy nh l
truyn theo tham tr.
Khi truyn theo tham tr, gi tr ca
bin xut hin trong li gi hm ny,
s khng thay i sau khi thot ra
khi hm. iu ny c ngha l gi tr
ca bin b trc khi gi hm l 1,
sau khi gi hm, n vn nhn gi tr
l 1.
Chng 7. Hm
T r a n g | 80
C
+
+
}
Nu mun thay i gi tr ca bin khi truyn tham s trong hm, ta
s dng khai bo tham bin. Vi vic quy nh cc tham s truyn theo
tham bin, th khi khai bo ta ch b sung vo du & trc tn tham s .
Bng cch ny, cc bin l i s trong li gi hm s b lm thay i gi tr
sau khi kt thc li gi hm.
V d Gii thch
#include <iostream>
using namespace std;
void setNum(int &a)
{
a = 0;
}
int main()
{
int b = 1;
setNum(b);
cout<<b;
return 0;
}
Nu tham s a trong hm setNum
c s dng nh trn (int &a) th
n c quy nh l truyn theo
tham bin.
Khi truyn theo tham bin, gi tr
ca bin xut hin trong li gi hm
ny, s thay i sau khi thot ra khi
hm. iu ny c ngha l gi tr ca
bin b trc khi gi hm l 1, sau khi
gi hm, n vn nhn gi tr l 0.
Vic s dng khai bo hm theo tham bin c u im: ta bit rng,
mt hm ch c th tr v mt gi tr duy nht. Nu trng hp, ta mong
mun hm tr v nhiu gi tr, ta c th s dng hm void kt hp vi vic
truyn tham s cho hm theo tham bin. V d sau y s cho ta thy r
iu ny.
V d Kt qu
Chng 7. Hm
T r a n g | 81
C
+
+
#include <iostream>
using namespace std;
void swap(int &a, int &b)
{
int c = a;
a = b;
b = c;
}
int main()
{
int m = 1;
int n = 2;
swap(m, n);
cout<<m=<<m<<, n=<<n;
return 0;
}
m= 2, n=1
Gii thch: trong khai bo hm swap, tham s a v b c quy nh truyn
theo tham bin. Hm ny s thc hin vic hon i gi tr ca hai tham s
hnh thc a v b. Trong hm main, hai bin m, n c gi tr tng ng l 1 v
2. Khi gi hm swap, th hai bin ny s b hon i gi tr cho nhau. Do ,
kt qu in ra l m=2, n=1 (v tham s c truyn theo tham bin). Nh
vy, hm trong trng hp ny c th xem nh tr v hn mt gi tr mong
mun.
Lu : Cch truyn tham bin nh trn ch p dng cho C++, trong C ta ch
c th truyn tham bin nh con tr. Cch ny, vn cn hot ng tt trn
C++.
Chng 7. Hm
T r a n g | 82
C
+
+
V d Kt qu
#include <iostream>
using namespace std;
void swap(int *a, int *b)
{
int *c;//hoc n thun ch l c
*c = *a;
*a = *b;
*b = *c;
}
int main()
{
int m = 1;
int n = 2;
swap(&m, &n);
cout<<m=<<m<<, n=<<n;
return 0;
}
m= 2, n=1
Gi tr mc nh ca tham s hnh thc
Khi khai bo cc tham s hnh thc bn trong hm. Nu cc tham s
c gn gi tr mc nh, th khi gi hm, chng ta s c mt vi cch
gi tng ng vi s lng khc nhau ca cc tham s.
Chng trnh Kt qu
#include<iostream> 1
Chng 7. Hm
T r a n g | 83
C
+
+
using namespace std;
int add(int a, int b=0, int c=0)
{
return a+b+c;
}
int main()
{
cout<<add(1)<<endl;
cout<<add(1,2)<<endl;
cout<<add(1,2,3)<<endl;
return 0;
}
3
6
Gii thch: Hm add c khai bo vi ba tham s hnh thc. Tham s th
nht l khng th thiu, v n khng quy nh gi tr mc nh. Vi hai tham
s b, c cn li, ta c th khuyt. Trong trng hp khuyt, n s nhn
gi tr mc nh m ta gn cho n (c th y l 0). Do , khi gi hm
add(1), n s tng ng vi li gi hm add(1,0,0), tc gi tr l tng ca
1+0+0 bng 1. Tng t, khi gi hm add(1,2) th s tng ng vi
add(1,2,0) v cho kt qu l 3. Khi gi hm y ba tham s add(1,2,3) s
cho kt qu l 6.
Chng cht hm
Trong C++, hai hm khc nhau c th c cng tn, nhng danh sch
tham s ca chng phi khc nhau. Chng c bit n vi tn gi l
chng cht hm. Khi nim chng cht hm khc hon ton vi khi nim
qu ti hm m chng ta s tm hiu trong phn lp trnh hng i tng.
V d Kt qu
#include<iostream> 3
Chng 7. Hm
T r a n g | 84
C
+
+
#include<string>
using namespace std;
int add(int a, int b)
{
return a+b;
}
string add(string a, string b)
{
return a+b;
}
int main()
{
cout<<add(1,2)<<endl;
cout<<add(ab,cd)<<endl;
return 0;
}
abcd
Gii thch: Hai hm m ta xy dng c cng tn l add. Hm add u tin c
chc nng cng hai s. Hm add th hai c chc nng cng hai xu k t.
Kiu d liu tr v v tham s hnh thc ca chng cng khc nhau.
Hm ni tuyn
Ch nh inline trc khai bo mt hm s gip trnh bin dch nhn
bit hm ny c khai bo l ni tuyn. Khng c mt s thay i no
ng k gia hm bnh thng vi hm ni tuyn. Ch c mt im khc
bit duy nht l: vi hm ni tuyn, trnh bin dch s khi to mt thn
hm v chn n vo v tr c gi ti mi thi im m hm c gi,
thay v n ch chn li gi hm. Vic lm ny s ci thin ng k tc bin
dch chng trnh.
Chng 7. Hm
T r a n g | 85
C
+
+
inline type tn_hm(danh_sch_tham_s)
{
Thn hm;
}
Trong hu ht cc trnh bin dch hin i, vic quy nh hm l inline
l khng cn thit. Nu mt hm c th s dng khai bo inline, th chng
trnh dch s t ng ti u m ngun c th s dng n. Ngc li, nu
mt hm khng th s dng khai bo inline, th chng trnh dch s b qua
khai bo ny. Ch nh inline ch c tc dng nh hng cho chng trnh
dch.
Hm quy
Hm quy l nhng hm gi li chnh n. N hu dng trong cc
tc v nh sp xp (Quicksort) hoc tnh ton cc biu thc truy hi, gii
cc bi ton bng gii thut cng tn Hm quy tng ng vi khi
nim quy np trong ton hc. Ta c th s dng nh ngha giai tha theo
quy np ton hc nh sau
! =
, =
. ( )!, > 0
V chng ta c th xy dng hm quy tng ng vi php tnh giai tha
ny nh sau
V d Kt qu
#include <iostream>
using namespace std;
long Fac(long a)
{
if(a>0)
return a*Fac(a-1);
else
return 1;
}
6
Chng 7. Hm
T r a n g | 86
C
+
+
int main()
{
long num = 3;
cout<<Fac(num);
return 0;
}
Gii thch: hm Fac s tnh gi tr giai tha ca a theo cng thc tnh trn.
Nu a>0, th hm s tr v gi tr l a*Fac(a-1), hm Fac(a-1) li gi n
chnh n, v qu trnh ny c tip tc cho n khi gi tr a = 0. Vic s dng
li gi hm Fac(0) s cho kt qu tng ng l 1.
Lu : hm quy cng nh vng lp, n c th lp v hn, nu iu kin
dng khng c m bo.
Ta xt thm mt v d s dng quy. Tnh tng:
= 1 +2 ++
Vi cng thc ny, ta c th phn tch nh sau
=
1 +2 ++( 1)
1
+ =
1
+
T phn tch ny, ta d dng thy cng thc di dng truy hi:
=
1, = 1
1
+, > 1
V d Kt qu
#include <iostream>
using namespace std;
long S(int n)
{
if(n == 1)
6
Chng 7. Hm
T r a n g | 87
C
+
+
return 1;
else
return n+S(n-1);
}
int main()
{
int n = 3;
cout<<S(n);
return 0;
}
Bi tp 7.
1. Xy dng hm gii phng trnh
() = +
2. Xy dng hm tnh tng ca n s nguyn t u tin, vi n l s nhp
vo t bn phm.
3. Xy dng hm kim tra mt s c phi l s chnh phng hay khng.
S chnh phng l s nguyn c th biu din di dng ly tha
ca mt s nguyn.
4. Xy dng hm quy tnh tng ca n s nguyn dng t 0 n n.
5. Xy dng hm quy tnh xc nh s hng th n ca dy sau y
=
Vi, n nhp vo t bn phm.
6. Cho mt dy 5 s nguyn. Hy xy dng cc hm sau:
a. Hm nhp vo 5 s nguyn .
b. Hm sp xp 5 s nguyn theo th t tng dn.
c. Hm tnh tng ca 5 s nguyn .
d. Xut cc kt qu: cc s nguyn sau khi sp xp v tng ca chng.
Chng 8. Cc kiu d liu c cu trc
Trang | 88
CHNG 8. CC KIU D LIU C CU TRC
Mng
Mt mng l mt dy cc phn t c cng loi d liu c sp xp
lin tc trong b nh my tnh. Chng c th c truy cp theo ch s ca
n.
iu ny c u im l chng ta c th khai bo 5 bin gi tr kiu
nguyn nh vo khai bo mng, m khng cn phi khai bo ring bit.
0 1 2 3 4
Mng int
Khai bo mng
kiu_d_liu tn_mng[s_phn_t];
V d
string humans[5]; //Khai bo mng humans c 5 phn t xu k t
int numbers[10]; //Khai bo mng numbers c 5 phn t s nguyn
Cc ch s ca mng c nh th t t v tr 0. truy cp n
phn t mng, chng ta truy cp theo ch s nh sau humans[0],
humans[1], tng ng vi cc phn t th nht, tha hai trong mng
humans.
Khi to mng
Vic khi to gi tr cho mng c th s dng cp du {}.
string humans[5] = {Lan, Nam, Binh, Hoa, Hieu};
Khi truy cp vo mng theo ch s, th humans[0]=Lan,
humans[1]=Nam,
Chng 8. Cc kiu d liu c cu trc
T r a n g | 89
C
+
+
Mt cch thc na khi to gi tr cho mng, l ta s dng ton t
gn cho tng phn t. vt ton b mng ( nhp d liu cho mng hoc
xut d liu t mng hoc lm vic vi cc phn t ca mng), ta c th s
dng vng lp for.
int numbers[10];
for (int i=0; i<10; i++)
numbers[i]=i;
Mng nhiu chiu
Mng nhiu chiu c th c xem nh l mng ca mng. Mng hai
chiu l mng ca mng mt chiu, mng ba chiu l mng ca mng hai
chiu,
//Khai bo ma trn
int matrix[4][4];//Ma trn c 16 phn t (4 dng, 4 ct)
Chng ta c th minh ha khai bo ma trn trc quan nh sau:
0 1 2 3 4
0
1 matrix[1][3]
2
3
4
Tng t, ta c th to ra cc khai bo mng nhiu chiu khc. Vic
truy cp vo mng xt duyt cc phn t ca n, c th c thc hin
vi s cu lnh lp lng nhau chnh l s chiu ca mng: mng hai chiu
hai vng lp lng nhau, mng ba chiu ba vng lp lng nhau,
//In gi tr ca ton mng
for(int i=0; i<4; i++){
for(int j=0;j<4;j++)
cout<<matrix[i][j]<< ;
cout<<endl;
Chng 8. Cc kiu d liu c cu trc
T r a n g | 90
C
+
+
}
Mng gi nhiu chiu
Nu ta khai bo mng nh sau
//Khai bo ma trn
int matrix[4*4];//Ma trn c 16 phn t
th mng ny gi l mng gi nhiu chiu (gi hai chiu). S phn t ca
mng gi hai chiu ny bng s phn t ca mng hai chiu. Thc cht ca
mng gi nhiu chiu l mng mt chiu. Cc thao tc x l vi mng gi
nhiu chiu c thc thi nh mng mt chiu.
Ta cn lu rng, vic chuyn i ch s qua li gia mng nhiu
chiu v mng gi nhiu chiu l hon ton c th thc hin c. V d sau
y s in ra gi tr ca cc phn t theo dng ma trn bng cch s dng
khai bo mng hai chiu v mng gi hai chiu.
Mng hai chiu Mng gi hai chiu
int matrix[4][4];
//Nhp mng
for(int i=0; i<4; i++)
for(int j=0;j<4;j++)
matrix[i][j]=i+j;
//In gi tr mng
for(int i=0; i<4; i++){
for(int j=0;j<4;j++)
cout<<matrix[i][j]<< ;
cout<<endl;
}
int matrix[4*4];
//Nhp mng
for(int i=0; i<4; i++)
for(int j=0;j<4;j++)
matrix[i*4+j]=i+j;
//In gi tr mng
for(int i=0;i<4;i++){
for(int j=0; j<4;j++)
cout<<matrix[i*4+j]<< ;
cout<<endl;
}
Mng l tham s hnh thc: khi s dng mng lm tham s hnh thc, cn
lu cc im sau y:
Trong trng hp mng mt chiu, ta c th khng cn khai bo kch
thc ca mng (v d type tn_hm(int args[])).
Trong trng hp mng nhiu chiu, th ch c s phn t trong chiu
th nht l c th khng cn khai bo, cn cc chiu cn li, nht thit
phi khai bo (v d type tn_hm(int args[][10][10])).
Mng c truyn theo tham bin.
Chng 8. Cc kiu d liu c cu trc
T r a n g | 91
C
+
+
Cch tt nht khi s dng mng lm tham s hnh thc l hy s dng n
di dng con tr. Chi tit v con tr s c trnh by trong chng
sau.
Bi tp 8.
1. Xy dng cc hm sau y
a. Nhp vo mt mng hai chiu cc s nguyn.
b. Thc hin cc php cng, nhn hai mng ny.
c. Xc nh phn t ln nht, nh nht trong mi dng.
d. Xy dng mi mt ma trn t ma trn c, trong cc phn t ca
ma trn c ny c gi tr chn s bng chnh n cng vi phn t
ln nht ca dng . Cc phn t l s bng chnh n tr cho
phn t nh nht ca dng . Tng ng vi ch s , ta s xy
dng nn ma trn mi t ma trn c cho.
V d:
1 2
3 2
Phn t ln nht ca dng 1: 2
Phn t ln nht ca dng 2: 3
Phn t nh nht ca dng 1: 1
Phn t nh nht ca dng 2: 2
Phn t 1x1 l l, nn n bng 1-1=0, v y chnh l phn t 1x1
trong ma trn mi. Tng t cho cc phn t cn li. Ma trn mi
thu c l
0 4
1 5
2. Cho mng mt chiu, vit chng trnh hon i vng cc gi tr ca
mng (phn t u tr thnh phn t cui, ). V d {1, 2, 3}, sau
khi hon i, ta thu c {2, 3, 1}
3. Cho ma trn, hy s dng phng php kh Gauss a ma trn
ny v dng tam gic trn.
Xu k t
Nh ti gii thiu, th vin chun ca C++ cha mt lp string rt
mnh m, m n c th hu dng trong vic thc thi cc tc v x l xu.
Tuy nhin, bi v xu l mt mng cc k t, do , chng ta c th x l xu
nh x l trn mng.
Chng 8. Cc kiu d liu c cu trc
T r a n g | 92
C
+
+
V d, ta c mt khai bo xu nh sau
char strings [20];
Xu strings ny cha 20 k t.
Vic khi to gi tr cho mt xu hon ton tng t nh khi to gi
tr cho mng. Tuy nhin, chng ta c thm mt cch khi to thun li hn
nh sau
strings = Chao ban;
Khi phn b vo trong b nh, xu ny s c biu din nh mng.
Tuy nhin, phn t cui cng trong mng k t ny l phn t kt thc xu,
c k hiu l \0.
C h a o b a n \0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Vic khai bo xu theo kiu mng k t hay theo kiu string l hon
ton tng ng nhau. V vy, chng ta c th ty la chn cch x l
chng. Ngoi ra, mng cng c th c khai bo nh con tr. V vy, vi
xu k t, chng ta c ba cch khai bo: s dng mng k t, s dng con tr
v khai bo xu string. Chi tit v con tr, chng ta s hc trong chng sau.
Chng 9. Con tr
Trang | 93
CHNG 9. CON TR
Khi mt bin c lu vo trong cc nh, thng thng ta khng
quan tm n cch b tr theo v tr vt l ca n, chng ta n thun ch
truy cp n cc bin theo nh danh ca n. B nh ca my tnh c t
chc theo cc nh, mi mt nh l kch thc nh nht m my tnh c
th qun l cn gi l bytes. Mi nh c nh du theo mt cch lin
tc. Cc nh trong cng mt khi nh c nh du theo cng mt ch
s nh khi nh trc cng 1. Theo cch thc t chc ny, mi nh
c mt a ch nh danh duy nht v tt c cc nh thuc vo mt mu
lin tip. V d, nu chng ta tm kim nh 1776, chng ta bit rng n s
l nh nm ngay v tr gia nh 1775 v 1777, hay chnh xc hn l
nh sau 776 nh so vi nh 1000 (hay trc nh 2776 l 1000
nh).
Ton t tham chiu &
Khi m t mt bin, h iu hnh s cung cp mt s lng nh cn
thit lu tr gi tr ca bin. Chng ta khng quyt nh mt cch trc
tip v tr chnh xc lu tr bin bn trong mng cc nh . May mn
thay, tc v ny hon ton t ng trong sut qu trnh Runtime ca h
iu hnh. Tuy nhin, trong mt vi trng hp, chng ta c th quan tm
n a ch m cc bin c lu tr iu khin chng.
a ch m cc bin lu bn trong b nh c gi l s tham chiu
n bin . S tham chiu n bin c th nhn c bng cch b sung
du & trc nh danh ca bin n c gi l a ch ca bin .
V d:
int a = 10;
int *adr = &a;
Khi khi gn bin *adr cho a ch ca bin a, th t thi im ny,
vic truy cp tn bin a vi tham chiu & hon ton khng lin quan n gi
tr ca n, nhng ta vn nhn c gi tr ca bin a nh vo bin *adr.
Chng 9. Con tr
T r a n g | 94
C
+
+
Gi s bin andy c lu vo trong b nh ti nh 1776. Chng ta
c th minh ha on chng trnh sau bng lc bn di
int andy = 25;
int fred = andy;
int* ted = &andy;
andy
25
1775 1776 1777
fred & -ted
Hnh 17 Tham chiu trong con tr
u tin gi tr 25 s c gn cho bin andy, bin fred c khi to
t bin andy (sao chp gi tr). Bin ted s tham chiu n a ch ca bin
andy, m khng sao chp gi tr ca bin ny vo nh ca n.
Ton t tham chiu ngc *
Mt bin tham chiu n bin khc gi l con tr. Con tr s tr n
bin tham chiu. Bng vic s dng con tr, chng ta c th truy cp trc
tip n gi tr ca bin c tham chiu n. thc thi c iu ny,
chng ta t trc nh danh ca bin tr du *, khi , n ng vai tr l
ton t tham chiu ngc v n c th gi l gi tr tr bi.
Bi vy, chng ta c th vit nh sau
beth = *ted;
Chng ta c th gi: beth tng ng vi gi tr tr bi ted. minh
ha iu ny, chng ta c th tham kho lc sau:
Chng 9. Con tr
T r a n g | 95
C
+
+
ted
1776
1775 1776 1777
25 b nh
25
beth
Hnh 18 Tham chiu ngc trong con tr
Lc ny tng ng vi on chng trnh sau
beth = ted;//beth tng ng vi ted
beth = *ted;//beth tng ng vi gi tr tr bi ted
Cn phn bit chnh xc gia bin ted tr n gi tr 1776, trong khi
*ted tr n gi tr lu ti 1776, tc l 25. Nh vy, chng ta cn phi
phn bit mt cch chnh xc hai ton t: ton t tham chiu & v ton t
tham chiu ngc*.
Ton t tham chiu &: c l a ch ca.
Ton t tham chiu ngc *: c l gi tr tr bi.
Nh vy, mt bin c th tham chiu nh ton t & v c th tham chiu
ngc bi ton t *.
Gi s chng ta c
int andy = 25;
int *ted = &andy;
Khi , cc biu thc sau y s cho gi tr ng (gi s a ch ca bin
andy c lu ti nh 1776)
andy == 25;
&andy == ted;//=1776
*ted == 25;
Chng 9. Con tr
T r a n g | 96
C
+
+
Ta c th pht biu tng qut biu thc *ted = &andy nh sau: con tr *ted
tr vo a ch ca andy, tng ng vi a ch ny ca nh, ta c th nhn
c gi tr tng ng l gi tr lu ti nh ny.
Khai bo bin con tr
Ta c th ly gi tr m con tr tr n mt cch trc tip, n cn thit
khi chng ta mun khai bo kiu d liu tng ng vi n. C php khai
bo con tr nh sau:
type *tn_con_tr;
V d
int *pint;
char *pchar;
float *pfloat;
Trong v d trn, chng ta khai bo ba con tr c kiu d liu khc
nhau, nhng v bn cht, chng pint, pchar, pfloat l nhng con tr v
chng c cng s nh trong khng gian b nh (trn h thng windows
32bit, chng chim 4byte ta c th s dng hm sizeof kim tra kch
thc thc trn h thng my tnh ang s dng). Tuy nhin, d liu m
cc con tr tr n li c kch thc khc nhau tng ng vi int, char v
float m chng ta tm hiu (tng ng trn h windows 32 bit ln lt l
4, 1, 4).
V d Kt qu
#include<iostream>
using namespace std;
int main()
{
int *pint;
long long *pll;
cout<<sizeof(pint)<<endl;
cout<<sizeof(pll)<<endl;
cout<<sizeof(*pint)<<endl;
cout<<sizeof(*pll)<<endl;
return 0;
}
4
4
4
8
Gii thch: trong v d ny, bin pint v pll dng lu a ch ca con tr,
chng lun c kch thc mc nh l 4 bytes. Cc bin *pint v *pll l cc
Chng 9. Con tr
T r a n g | 97
C
+
+
bin tr vo cc kiu d liu int v long long tng ng. Bin int c kch
thc 4 bytes v bin long long c kch thc 8 bytes.
Lu , trong khai bo ny, du * khng phi l ton t tham chiu
ngc, n n thun l con tr. Chng c cng k hiu, nhng l hai th
hon ton khc nhau.
V d Kt qu
#include<iostream>
using namespace std;
int main()
{
int fval, sval;
int *p;
p = &fval;
*p = 10;
p = &sval;
*p=20;
cout<<fval<<endl;
cout<<sval<<endl;
return 0;
}
10
20
Gii thch: Bng cch s dng bin con tr *p, chng ta lm thay i gi
tr ca bin fval v sval. Bin tr ny trong ln u tin, n tr n a ch
ca bin fval, t nh ca a ch ny, n nh x n gi tr m ta khi gn
l 10. Do , gi tr ca bin fval cng nh x tng ng n 10. Tng t
cho bin sval.
minh ha con tr c th to ra s sai khc gi tr trong cng mt
chng trnh, chng ta tham kho v d sau
V d Kt qu
#include<iostream>
using namespace std;
int main()
{
int fval=5, sval=15;
int *p1, *p2;
p1 = &fval;
p2 = &sval;
*p1 = 10;
10
20
Chng 9. Con tr
T r a n g | 98
C
+
+
*p2 = *p1;
p1 = p2;
*p1 = 20;
cout<<fval<<endl;
cout<<sval<<endl;
return 0;
}
Gii thch: Cc bin *p1 v *p2 tr n a ch ca fval v sval. Nh vy,
*p1=10, s to cho vng a ch m n tr n, nh x n gi tr 10 (c
ngha l ti thi im ny fval = 10, sval = 15). Dng lnh *p2=*p1 s lm
cho bin tr *p2 tr n gi tr m *p1 tr n (tc *p2 = 10). V ti thi
im ny, bin sval c gi tr tng ng l 10 (do nh x theo vng a ch
m *p2 tr n). Dng lnh p1=p2 s gn a ch m p2 tr n (a ch ca
bin sval) cho a ch m p1 tr n (a ch ca bin fval), nh vy, ti thi
im ny sval=fval=10. Dng lnh *p1=20 s to cho vng a ch m *p1
tr n (cng l a ch ca bin *p2 v fval) nh x n gi tr 20, ngha l
fval = 20. V vy, khi kt thc chng trnh, fval = 10, sval = 20. C hai bin
*p1 v *p2 u tr n a ch ca bin fval.
Mt con tr c khai bo d liu ca n l mt loi d liu no .
Do , nu c mt bin khng phi l con tr c cng kiu d liu, chng ta
c th s dng khai bo thu gn
int *p1, *p2, num;
Con tr, mng v xu k t
Nh ti ni trn, mng c th c khai bo theo kiu truyn
thng hoc theo cu trc con tr. V d, ti c mt mng s nguyn, chng
c 20 phn t
int numbers[20]; //Khai bo truyn thng
int *p = new int[20]; //Khai bo con tr
Hoc ta c khai bo mt bin xu k t theo mt trong 3 cch sau
char xau[20]; //Khai bo truyn thng
char *xau; //Khai bo con tr
string xau;//Khai bo xu
Khi to gi tr cho con tr khi n ng vai tr l mng
Th nht: ta s dng php gn sao chp ton b mng ln con tr
Chng 9. Con tr
T r a n g | 99
C
+
+
p = numbers;//p l con tr, numbers l mng
Th hai: khi to trc tip cho tng phn t
int *p;
for (int i=0; i<20; i++){
*(p+i)=numbers[i];
}
Chng trnh nhp xut d liu bng vic s dng con tr.
Chng trnh Kt qu
#include<iostream>
using namespace std;
void Input(int *p, int length)
{
for (int i=0; i<length; i++){
cin>>*(p+i);
}
}
void Output(int *p, int length)
{
for (int i=0; i<length; i++){
cout<<*(p+i)<< ;
}
}
int main()
{
int *a;
int lengtha;
cout<<Nhap do dai: ;
cin>>lengtha;
Input(a, lengtha);
cout<<========<<endl;
Output(a, lengtha);
return 0;
}
Nhap do dai: 4
6
8
9
0
========
6 8 9 0
Gii thch: bin con tr lun c truyn theo kiu tham bin, do , chng
ta khng cn b sung du & vo bn trc tn bin. Hm Input dng
nhp mng s nguyn c di length, hm Output dng xut d liu t
mng nguyn . Khi truy xut t bin con tr, ngoi cch xut nh trn, ta
Chng 9. Con tr
T r a n g | 100
C
+
+
cn c th vit p[i] tng ng nh mng p[i] v *(p+i) u l phn t th
i. Ngha l ta hon ton c th vit
cin>>p[i]; cout<<p[i];
cin>>*(p+i); cout<<*(p+i);
int c = p[i]+q[j]; int c = *(p+i)+*(q+j);
Vic s dng con tr thay cho xu cng hon ton tng t. Nhng hy
lu , phn t cui cng ca n l phn t \0.
Cc php ton s hc trn con tr
Cc php ton s hc trn con tr tng i khc vi php ton s
hc trn s nguyn. Chng ta cng tham kho cc php ton tng ng vi
n.
Php cng v php tr
Gi s, chng ta c ba con tr khai bo nh sau
char *pchar;
short *pshort;
int *pint;
v cc bin tr ny ln lt tr vo cc nh 1000, 2000 v 3000. Khi ta
vit
pchar++;
pshort++;
pint++;
n s ln lt nhy sang a ch ca nh tip theo ( nh dch sang phi
mt n v, tc l tng ng vi 1001, 2002 v 3004). iu ny cng rt
n gin. Kiu d liu char chim mt byte, nn tip theo s l a ch ca
hin ti +1. Kiu d liu short chim 2 byte, nn a ch tip theo +2.
Kiu d liu long chim 4 byte, nn a ch ca tip theo l +4.
Chng trnh Kt qu
int *p;
for(int i=0; i<4; i++){
*(p+i)=i;
cout<<*(p+i)<<" "<<(p+i)<<endl;
Chng 9. Con tr
T r a n g | 101
C
+
+
}
Ta c th thy gi tr v vng a ch ca bin tr nguyn nh trong kt qu
trn. D nhn thy rng a ch tng theo 4 byte (0x7ffd5000 tip theo
0x7ffd5004,)
hiu r hn, ta c th quan st lc sau y
1000 1001
pchar pchar++
2000 2001 2002 2003
pshort pshort++
3000 3001 3002 3003 3004 3005 3006 3007
plong plong++
Hnh 19 Tng/Gim a ch ca con tr
Kt qu ny tng ng vi pchar+1, pshort+1 v plong+1.
Hon ton tng t vi ton t ++p, p-- v --p.
Ton t tham chiu ngc v ton t tng-gim
C hai ton t tng v gim c u tin cao hn ton t tham chiu
ngc. Nu ta t
*p++;
Do ton t ++ c u tin cao hn ton t *, nn biu thc ny tng ng
vi *(p++). V vy, biu thc ny c ngha l ly gi tr nh x bi nh tip
theo.
Ta cn ch rng, biu thc ny hon ton khc vi
(*p)++;
Chng 9. Con tr
T r a n g | 102
C
+
+
Trong biu thc ny, du () c u tin cao nht, nn biu thc *p s thc
hin trc, do , gi tr ca biu thc ny l gi tr nh x bi nh hin
ti cng thm 1.
Biu thc
*p++ = *q++;
Bi v ton t ++ c u tin cao hn ton t *, c hai bin p v q u
tng, nhng bi v chng u l ton t hu t, nn ton t * s c thc
hin trc, sau mi tng a ch ca bin tng ng. Nh vy, biu thc
trn tng ng vi
*p = *q;
++p; // hay p=p+1;
++q; // hay q=q+1
Trong trng hp ny, chng ta nn s dng du () c mt cch nhn
nhn r rng hn.
Con tr tr vo con tr
C++ cho php s dng con tr a tng, ngha l con tr tr vo con
tr. khai bo con tr loi ny, chng ta ch cn b sung thm vo bin tr
mt ton t *.
char a;
char *b;
char **c;
a = z;
b = &a;
c = &b;
minh ha iu ny, chng ta c th to mt a ch ngu nhin
trong b nh cho mi bin, v d l 7230, 8092 v 10502.
a b c
z 7230 8092
7230 8092 10502
Gi tr ca mi bin c vit trong mi . Di mi l a ch
tng ng ca trong b nh. a ch ca bin a l 7230, gi tr ca
nh tng ng l z. Bin *b tr vo a ch ca bin a v gi tr tng ng
Chng 9. Con tr
T r a n g | 103
C
+
+
ca bin b nh x n gi tr ca nh bin a tc gi tr l z. Bin c tr
vo a ch ca b, n s nh x gin tip n gi tr ca a tc gi tr z.
S tng ng gia con tr tr vo con tr khc v mng hai chiu
Vic khai bo bin **c nh trn, c th xem nh l mng hai chiu.
Chng ta li xt bi ton ma trn.
Chng trnh Kt qu
#include <iostream>
using namespace std;
int main()
{
//Khai bo ma trn
int **matrix;
//Khi to ma trn
matrix = new int*[3];//dng
for(int i=0; i<3; i++)//phn t
matrix[i] = new int[3];
//Nhp ma trn
for (int i=0; i<3; i++)
for (int j=0; j<3; j++)
{
*(*(matrix+i)+j)=i+j;
}
//Xut ma trn
for (int i=0; i<3; i++){
for (int j=0; j<3; j++)
cout<<*(*(matrix+i)+j)<< ;
cout<<endl;
}
//Xa ma trn
delete[] matrix;
return 0;
}
0 1 2
1 2 3
2 3 4
T nay tr i, khi x l bi ton trn mng, ta hon ton c th s dng con
tr x l. Chng hon ton tng ng nhau. Ch c duy nht mt s
khc bit trong khai bo: nu khai bo theo kiu truyn thng, ta cn ch ra
kch thc ngay khi khai bo, cn khai bo theo kiu con tr, ta c th ch
nh kch thc sau nh vo ton t new. Chng ta s tm hiu chi tit v
ton t new trong chng tip theo.
Chng 9. Con tr
T r a n g | 104
C
+
+
Con tr void
Con tr void l loi con tr c bit. Trong C++, void dng quy nh
s khng tn ti ca mt kiu d liu (hay kiu d liu rng). V vy, con
tr void l con tr tr vo gi tr c kiu d liu void (cng v l , m n
khng xc nh di v thuc tnh tham chiu ngc).
Con tr void cho php tr sang mt kiu d liu bt k. Nhng khi
chuyn i, chng c mt gii hn rt ln: d liu tr bi chng khng th
trc tip tham chiu ngc, v v nguyn nhn ny, chng ta cn p kiu a
ch ca con tr void sang mt con tr khc m n c mt kiu d liu c th
trc khi tham chiu ngc tr li.
Chng trnh Kt qu
#include<iostream>
using namespace std;
void increase(void* data, int psize)
{
if(psize==sizeof(char))
{
char* pchar;
pchar=(char*)data;
++(*pchar);
}else if(psize==sizeof(int))
{
int* pint;
pint = (int*)data;
++(*pint);
}
}
int main()
{
char a = x;
int b = 1602;
increase(&a, sizeof(a));
increase(&b, sizeof(b));
cout<<a<<, <<b<<endl;
return 0;
}
y, 1603
Gii thch: hm increase c hai tham s: tham s data l mt con tr void,
tham s psize l kch thc ca con tr data. Cu lnh if s kim tra iu
kin xem bin tr data thuc kiu d liu no nu psize==sizeof(char) th
Chng 9. Con tr
T r a n g | 105
C
+
+
n l con tr kiu char, tng t nu psize==sizeof(int) th n l con tr
kiu int. V y, ta cha xc nh c n l con tr kiu g, nn ta s s
dng tham s l con tr void. Nu l con tr char, ta s s dng bin tr
pchar khi to gi tr cho n bng cch p kiu t con tr void. Hon
ton tng t cho bin tr pint. Mc ch ca hm increase l tm gi tr
tip theo ca tham s data. Trong hm main, ta s dng hai bin char v int.
Gi tr tip theo ca k t x l k t y, ca s 1602 l 1603.
Con tr null
Mt con tr null l con tr dng khi gn cho mt bin tr c kiu
d liu bt k. Trong C++, n c quy nh l 0.
int *p;
p = 0;
char *c;
c = 0;
Ta khng nn nhm ln gia con tr null v con tr void. Mt con tr
null l mt gi tr c th m mi con tr u c th tr n, v n c th tr
n mi v tr. Trong khi , con tr void l con tr c bit, n c th tr
n vi v tr.
Con tr hm
C++ cho php thc thi tnh ton vi con tr tr vo hm. Khi thc thi
iu ny, n s xem hm nh l mt tham s tr vo mt hm khc, nhng
chng khng tn ti tham chiu ngc. khai bo mt con tr hm, chng
ta cn khai bo n nh khai bo prototype cho mt hm, nhng tn ca
hm s c bao trong du () ng thi b sung * pha trc tn ca n.
Chng trnh Kt qu
#include<iostream>
using namespace std;
int addition(int a, int b)
{
return a+b;
}
int substraction(int a, int b)
{
return a-b;
12
8
Chng 9. Con tr
T r a n g | 106
C
+
+
}
int operation (int x, int y, int (*functocall) (int, int))
{
int g;
g=(*functocall)(x,y);
return (g);
}
int main()
{
int m, n;
int (*minus)(int, int) = substraction;
m = operation(7, 5, addition);
cout<<m<<endl;
n = operation(20, m, minus);
cout<<n;
return 0;
}
Gii thch: Hai hm addition v substraction thc hin cc chc nng cng
v tr hai s nguyn. Hm operation s gi hm tng ng vi con tr hm
c ch nh. Trong hm main, con tr hm minus s tng ng vi hm
substraction. Khi gi hm operation, ty theo con tr hm quy nh tham
s th ba, n s tr n hm tng ng c ch nh: operation(7, 5,
addition) tr n hm addition, tc cng hai s 7 v 5. Tng t,
operation(20, m, minus) s tng ng vi operation(20, m, substraction)
v cho kt qu l php tr 20 cho m.
Bi tp 9.
1. Hy xy dng ba hm cng hai s nguyn addi, cng hai s thc addf v
cng hai xu adds bng cch s dng con tr hm. Hm tng qut s c
t tn l add.
2. S dng con tr hm xy dng hm gii phng trnh bc nht v
phng trnh bc 2.
3. S dng con tr hm tnh cc tch phn sau bng phng php hnh
thang hoc hnh ch nht (phi, tri hoc trung v).
()
()
Chng 10. B nh ng
Trang | 107
CHNG 10. B NH NG
Mc ch to ra bin con tr l khng ch x l cc tc v tnh ton,
m cn c th qun l b nh my tnh. thc hin iu ny, chng ta cn
khai bo s nh cung cp cho mi bin con tr, khi khng cn cn dng
n chng na, chng ta c th gii phng cc nh ny i. thc hin
c nhng tc v ny, trong C++ cung cp cho ta hai ton t l new v
delete.
Ton t new v new[]
yu cu b nh ng, chng ta s dng ton t new, theo sau n l
kiu d liu. Nu n l mng ca nhiu phn t, th s phn t s c n
nh bn trong du [] ngay sau kiu d liu. Khi , n s tr v con tr tr
vo khi nh u tin.
int*num = new int;//Khai bo bin tr int 4 byte
int*nums = new int[10];//Khai bo bin tr nums vi 4*10 bytes
Ti xin nhc li ln na, mt kiu d liu tng ng vi mt s lng
cc nh c quy nh sn. Nh trong trng hp ny, trn h iu hnh
windows 32bit, bin num s chim 4 bytes b nh bng 2
4.8
gi tr. Cn
bin nums th chim 40 byte b nh, tng ng vi 2
40.8
gi tr. Nu s
dng hm sizeof kim tra kch thc ca bin *nums trong trng hp
ny, ta s nhn c 4. S d nh vy l v, sau khi khi to 10 phn t kiu
int, con tr s t vo phn t u tin, cho nn, khi s dng sizeof trong
trng hp ny l sizeof ca phn t u tin (tc kiu int). Do , kt qu
thu c l 4 bytes.
Khi khi to cho bin tr tr vo bin tr khc (tm gi l bin tr
nhiu tng). Ta cn khi to cho bin tr chung. Tng ng vi mi bin
tr chung, s c mt mng cc bin tr khc tng ng. Do , ta cn khi
to cho dy bin tr ny, nh vo vng lp for. Tng t nh vy, chng ta
c th khi to cho bin tr a tng (c th l hai, ba, bn).
int***num;
int length = 10;
//khi to bin tr chung
num = new int**[length];
Chng 10. B nh ng
T r a n g | 108
C
+
+
//khi to bin tr tng 1
for (int i=0; i<length; i++)
num[i]=new int*[length];
//khi to bin tr tng 2
for (int i=0; i<length; i++)
for(int j=0; j<length; j++)
num[i][j]=new int[length];
truy cp n tng nh, ta c th truy cp theo num[i][j][k] hoc
*(*(*(num+i)+j)+k). Nh vy, ta c th thy rng, thc cht con tr cng l
mt mng. Ch c mt im khc bit c bn l mng c kch thc c nh
ngay khi khai bo, con con tr c kch thc c ch nh khi ta cn s
dng bi ton t new.
B nh ng c yu cu bi chng trnh, v h iu hnh s cung
cp cho n t b nh heap. Tuy nhin, b nh my tnh cng hu hn, v n
c th b cn kit. Chnh v l , chng ta cn n mt k thut kim tra
tnh trng ny ca b nh. C++ (v thm ch C) cung cp cho ta hai phng
thc chun kim tra: vt qua ngoi l (throw bad_alloc) v khng vt
qua ngoi l (nothrow bad_alloc).
Bng vic s dng mt ngoi l l bad_alloc, h thng s b qua khi
qu trnh cung ng nh b tht bi (theo mc nh). Ngoi l l mt tnh
nng mnh m ca C++, chng ta s tm hiu chi tit nhng chng sau.
Nu gp mt ngoi l, chng ta cn cho bit c b qua tip tc chy
chng trnh hay khng. Ton t new cung cp theo phng thc mc nh
l vt qua (throw bad_alloc).
bobby = new int[5];
//Nu tht bi, ngoi l s b vt qua throw bad_alloc
Nu khng vt qua ngoi l, m c gng tip tc chy chng trnh, th
bobby = new (nothrow) int[5];
//Khng vt qua ngoi l, chng trnh c gng tip tc
Nu s dng vt qua ngoi l throw bad_alloc, trong trng hp
cung ng nh b tht bi, con tr s tr v con tr null, v chng trnh
vn tip tc. Chng ta ch cn kim tra bin tr bobby. Nu n l null th qu
trnh cung cp b nh ng tht bi v ngc li th thnh cng. y l cch
lm th cng, chng ta c th s dng cu trc try catch x l tnh
Chng 10. B nh ng
T r a n g | 109
C
+
+
hung ny. Chi tit, chng ta s tho lun k hn trong phn sau. Lu rng,
hai ngoi l ny nm trong th vin <new>.
Ton t delete v delete[]
Nu khi bin tr khng cn dng n na, chng ta c th xa b cc
nh ca n gii phng b nh ng. Qu trnh ny c thc thi bi
ton t delete.
delete num;
delete[] nums;
Cch vit th nht dng gii phng con tr n tng. Cch th hai
dng cho con tr a tng (hai tng tr ln).
Ton t delete ch c tc dng vi con tr c khi to bi ton t
new hoc con tr null.
Chng trnh Kt qu
#include <iostream>
#include <new>
using namespace std;
int main()
{
double *ptr[ 5];
for ( int i = 0; i < 5; i++ )
{
ptr[ i ] = new (nothrow) double[ 50000000 ];
if (ptr[i]!=0)
cout << "Allocation is ok";
else
cout<<Allocation fail;
}
delete[] ptr;
return 0;
}
Allocation is ok
Allocation is ok
Allocation is ok
Allocation is ok
Allocation fail
Trong ANSI-C, hm malloc, calloc, realloc v free c dng thay cho
new v delete v hin nhin chng cng hot ng trn C++. Chng ta
khng tho lun chi tit v hm ny, v theo xu hng ca lp trnh C++
hin i, ngi ta s dng hai ton t new v delete m ta tho lun trn.
Chng 11. Kiu d liu struct v Con tr struct
Trang | 110
CHNG 11. KIU D LIU STRUCT V CON
TR STRUCT
Kiu d liu mng m chng ta tho lun trn ch gip chng ta
lu mt tp d liu cng loi. Nu chng ta khng n thun lu tr cng
loi d liu, m c th l nhiu kiu d liu khc nhau, th mng khng th
gii quyt c vn . Trong C++ (v c C) cung cp cho chng ta mt kiu
d liu gip ta gii quyt vn ny, l struct.
Struct
Mt d liu struct l mt nhm cc phn t c th c kiu d liu
khc nhau c t cng mt tn. Cc phn t d liu ny c gi l cc
thnh vin ca struct. Cu trc khai bo struct trong C++ nh sau
struct tn_struct{
type thnh_vin_1;
type thnh_vin_2;
} [tn_i_tng_struct];
Trong :
struct l mt t kha.
tn_struct l tn kiu d liu struct m ta nh ngha.
thnh_vin_1, l cc phn t thnh vin ca struct.
tn_i_tng_struct: l tn bin thuc kiu tn_struct.
Hai cch khai bo sau y l tng ng.
V d 1 V d 2
struct product{
int weight;
float price;
}
product apple;
product banana, melon;
struct product{
int weight;
float price;
}apple, banana, melon;
Gii thch: trong hai v d trn product l kiu d liu struct m ta to ra.
N gm c hai thnh vin l weight v price. Tng ng vi kiu d liu
Chng 11. Kiu d liu struct v Con tr struct
T r a n g | 111
C
+
+
ny, ta c cc bin apple, banana, melon. khai bo n, ta c th s dng
mt trong hai cch theo nh hai v d ny. Cn lu rng, cc bin apple,
banana, melon l cc bin thuc kiu d liu product.
truy cp n cc thnh vin ca bin struct, ta s dng ton t chm (.).
apple.weight = 200;
apple.price = 2;
banana.weight = 150;
banana.price = 1;
Chng ta c th hiu apple.weight l khi lng ca to, apple.price l
gi tin ca to... C th xem mi thnh vin ca mt bin struct nh l mt
bin c lp m ta c th truy cp bng cch
tn_bin.phn_t_thnh_vin. Ta hon ton c th thc hin cc php
ton tng ng vi mi d liu thnh vin ny (ngha l cc php ton
tng ng vi cc php ton trn kiu d liu ca cc phn t thnh vin
: nu phn t thnh vin l kiu nguyn th ta c th thc hin cc php
ton s nguyn vi thnh vin ny, nu phn t thnh vin l kiu xu th
c th thc thi cc php ton vi xu cho bin thnh vin ny,).
V d, ti mua 400gam to, v 300g chui. Gi ca mi 100g to l 1$, v
100g chui l 0.7$. Cn tnh ton s tin m ti cn tr.
V d
apple.weight = 400;
apple.price = (float)apple.weight*1/100;
banana.weight = 300;
banana.price = banana.weight*0.7/100;
float money = apple.price+banana.price;
Nh trong v d trn, ti c th thc hin cc php ton s hc vi cc phn
t thnh vin l kiu s nh cc bin s bnh thng.
Struct l mt kiu d liu do ngi dng nh ngha (nh vo t kha
struct t kha struct vit thng). Ta cng c th khai bo mt mng cc
phn t thuc kiu struct. V d sau y minh ha cho vic mua bn khi i
siu th.
Chng 11. Kiu d liu struct v Con tr struct
T r a n g | 112
C
+
+
Bi ton: Trong siu th, gi to v chui c n nh trn tng sn phm
ty thuc cht lng ca sn phm, khng ph thuc vo khi lng ca n.
a. Tnh khi lng hng ha (kg) m ngi tiu dng mua.
b. Nu khch hng mua hng tr gi trn 10$, th ngi tiu dng s c
khuyn mi. Hy kim tra xem ngi tiu dng c c khuyn mi
hay khng.
Bit rng s lng to v chui do ngi tiu dng la chn.
Chng trnh Kt qu
#include<iostream>
using namespace std;
#define MAX 10
struct product{
int weight;
float price;
}apples[MAX], bananas[MAX];
/*
Khai bo hm
*/
void buyProducts(product pd, string
name, int &weight, float &price)
{
int i = 0;
cout<<Buy <<name<<endl;
while (true){
cout<<weight and price: <<endl;
cin>>pd[i].weight;
cin>>pd[i].price;
weight += pd[i].weight;
price += pd[i].price;
cout<<Continue to buy <<name<<
(y/n) ?;
char yn;
cin>>yn;
if((yn==n)||(yn==N)) break;
else i++;
}
}
int main()
{
Buy apples
weight and price
100
2
Continue to buy apples (y/n) ?y
weight and price
200
3
Continue to buy apples (y/n) ?n
Buy bananas
weight and price
150
1
Continue to buy bananas (y/n)
?y
weight and price
250
3
Continue to buy bananas (y/n)
?n
Total weight: 0.7
No Promotion
Chng 11. Kiu d liu struct v Con tr struct
T r a n g | 113
C
+
+
int weight = 0;
float price = 0;
buyProducts(apples, apples, weight,
price);
buyProducts(bananas, bananas,
weight, price);
cout<<Total weight:
<<(float)weight/1000<<endl;
if(price>10)
cout<<Promotion;
else
cout<<No Promotion;
return 0;
}
Gii thch:
Mng apples v bananas thuc kiu d liu product. Hm
buyProducts dng tnh ton khi lng v tng gi hng ha mi loi
mua c. Nu tham s products trong hm l apples, th n s tnh tng
ng vi khi lng tng cng v tng n gi ca apples. Tng t cho
bananas. Ta s dng vng lp while v ta khng bit chnh xc s lng
hng ha m ngi dng la chn. Tuy nhin, con s tng khng th vt
hng s MAX m ta nh ngha. Bin weight v price c truyn theo
tham bin, do , trc php cng dn (ton t cng ng nht +=), ta
khng cn khi to gi tr 0 cho chng, ta c th khi to cho chng ngay
u hm main. Nu khi to u hm buyProducts, th ta ch c th tnh
c khi lng v gi ca tng loi mt m thi (khi , nu mun tnh
ton cho c hai sn phm, ta b sung thm bin lu li cc gi tr ny).
Sau khi gi hm ny hai ln, tng ng vi apples v bananas, th bin
weight lu li tng khi lng ca c hai sn phm, bin price lu li gi
ca c hai sn phm. Khi lng c quy i sang kg, nn ta s chia cho
1000. Nu quy nh n v l kg, th iu ny l khng cn thit.
Trong phn thc thi chng trnh, ngi tiu dng mua hai qu
to v hai qu chui. Qu to th nht c khi lng 100g v gi 2$, qu to
th hai 200g v 3$. Qu chui th nht c khi lng 150g v gi 1$, qu
chui th hai 250g v 3$.
Chng 11. Kiu d liu struct v Con tr struct
T r a n g | 114
C
+
+
Con tr struct
Tng ng vi mng struct, ta cng c con tr tr vo struct. Vi con
tr tr vo struct, ta c th to ra mt mng struct ng.
Khai bo con tr struct: c hai cch khai bo
struct product{
int weight;
float price;
}*apples;
struct product{
int weight;
float price;
};
product* apples;
Tham chiu: hon ton tng t nh con tr tr vo kiu d liu nguyn
thy.
struct product{
int weight;
float price;
}apples1;
products* apples2;
apples2 = &apples1;
Truy cp gi tr ca phn t thnh vin: c hai cch truy cp
apples2->weight
apples2->price
*(apples2.weight)
*(apples2.price)
Ta cn lu s khc nhau gia apples2->weight v *apples2.weight.
Trng hp u n s tng ng vi *(apples2.weight) v theo u
tin ca ton t, du () s thc hin trc tin, ngha l thnh vin weight
ca apples2. Tip l php ton *. iu ny c th hiu l con tr apples2
tr vo a ch ca bin thnh vin weight ca apples 2. Trng hp th
hai, l gi tr tr bi bin thnh vin weight ca apples2 (ton t . c u
tin cao hn ton t *).
struct product{
int weight;
float price;
}*apples2;
.
apples2->weight
struct product{
int *weight;
float price;
}apples2;
*apples2.weight
Chng 11. Kiu d liu struct v Con tr struct
T r a n g | 115
C
+
+
Struct lng nhau
Struct c th c khai bo lng nhau. Chng ta c th khai bo lng bn
trong, hoc khai bo tun t
Khai bo lng nhau Khai bo tun t
struct family{
string father;
string mother;
struct children{
string son;
string daughter;
}first, second;
}myfamily;
struct children{
string son;
string daughter;
};
struct family{
string father;
string mother;
children first, second;
}myfamily;
Khi , vic truy cp cng tng t nh trn
myfamily.first.son
.
Nu l con tr, ta cng c cch truy cp tng t.
struct family{
string father;
string mother;
struct children{
string son;
string daughter;
}*first, second;
}*myfamily;
myfamily->first->son
myfamily->second.son
Kch thc b nh ca struct
Kch thc ca struct theo l thuyt n s l kch thc tng cng ca
cc d liu thnh vin. Tuy nhin, theo cch thc t chc b nh, cc d
liu thnh vin ca mt struct s c sp xp lin k nhau. Vic t chc b
nh ca h thng my tnh 32bit s theo xu hng l nhm 4 bytes. iu
ny c ngha l, nu d liu thnh vin th nht lp vo mt s byte b
nh, v nu cn tha, th h iu hnh s xem xt a d liu thnh vin
tip theo vo. Nu d liu thnh vin tip theo chim mt s lng cc byte
b nh cn tha, th n s c lp vo phn b nh cn tha . Nhng
nu vt qu, th h thng s c nh hng b sung thm mt nhm 4
byte b nh mi cha d liu thnh vin tip theo (nu cn nhiu hn
Chng 11. Kiu d liu struct v Con tr struct
T r a n g | 116
C
+
+
th cung cp tip nhm 4 byte na). Cn i vi s byte cn tha, n vn
c trng.
V d 1 V d 2
struct number{
char a;
int b;
char c;
}mynum;
cout<<sizeof(mynum);
//12
struct number{
char a;
char c;
int b;
}mynum;
cout<<sizeof(mynum);
//8
Gii thch:
Trong v d 1:
char 1byte
int 4byte
u tin, d liu thnh vin char s
lp y nhm 4byte, char chim
1byte nn cn tha 3 byte. D liu
thnh vin tip theo l int. V int
chim 4byte, nhng ch tha c 3
byte, n khng ch cho int. Do ,
h thng s t ng cung cp thm 3
byte lp y phn cn tha. Tip
theo, s cung cp nhm 4 byte cho
int. Khng c byte tha trong trng
hp ny. Kiu d liu thnh vin
char cn li chim 1byte, nhng h
thng cung cp cho n 4 byte, cn
tha 3 byte. S byte tha ny s
c lp y. Nh vy, s byte trong
trng hp ny l
(1+3)+4+(1+3)=12 byte.
Trong v d 2:
Cng tng t v d 1. D liu thnh
vin char th nht chim 1 byte, h
thng cung cp 4 byte, nh vy tha
3 byte. Kiu d liu thnh vin tip
theo cng kiu char, chim 1byte, n
c th lp vo s byte cn tha. Ti
thi im ny, cn tha 2 byte. Tip
theo, ta xt n d liu thnh vin
int. D liu ny chim 4 byte, nhng
ch cn tha 2 byte, do h thng
s lp y 2 byte ny v cung cp
thm 4 byte mi cho int. Nh vy, s
byte trong trng hp ny l
(1+1+2)+4=8 byte.
Nh vy, ty vo kiu d liu thnh vin, ta cn chn mt cch sp xp hp
l c mt kt qu ti u v b nh. Hy quan st lc sp xp b nh
hng ti u nh bn di (trng hp 2).
char char int
Chng 12. Cc kiu d liu khc
Trang | 117
CHNG 12. CC KIU D LIU KHC
Kiu d liu t nh ngha
Ta c th nh ngha mt kiu d liu mi thng qua mt kiu d liu
tn ti
typedef kiu_d_liu_tn_ti tn_kiu_d_liu_mi;
Sau khi khai bo kiu d liu mi, ta c th s dng n nh kiu d liu
thng thng
typedef char C;
typedef char* pchar;
typedef char string50[50];
C mychar;
pchar p;
string50 str;
Kiu d liu union thng
Vi t kha union, ta c th khai bo mt kiu d liu mi t cc kiu
d liu tn ti.
union Tn_kiu_union{
kiu_d_liu_thnh_vin_1 tn_thnh_vin_1;
kiu_d_liu_thnh_vin_2 tn_thnh_vin_2;
}bin_kiu_d_liu_union;
Khi khi bo kiu union, cc d liu thnh vin s c khai bo trn cng
mt khng gian b nh vt l. Kch thc ca n l kch thc ca kiu d
liu thnh vin ln nht.
V d
union myType{
char C;
double Db;
} newType;
//8 byte, v double = 8byte, char = 1byte.
Chng 12. Cc kiu d liu khc
T r a n g | 118
C
+
+
//S dng
bin_kiu_d_liu_union.tn_thnh_vin
Kiu d liu union n danh
Hon ton tng t vi kiu d liu union thng, nhng ta khng
cn ch nh tn bin union mi to ra
union Tn_kiu_union{
kiu_d_liu_thnh_vin_1 tn_thnh_vin_1;
kiu_d_liu_thnh_vin_2 tn_thnh_vin_2;
};
Khi khai bo bin thuc kiu union n danh, ta c th khai bo nh sau
V d
union Tn_kiu_union tn_bin;
tn_bin.tn_thnh_vin
Kiu d liu enum
Kiu d liu enum c to mi c th cha nhiu d liu khc nhau
m khng c s gii hn v gi tr.
enum Tn_kiu_enum{
gi_tr_1;
gi_tr_2;
}Tn_th_hin_enum;
Chng ta c th tham kho thm cc v d sau y
enum colors{black=0, blue, green, cyan, red} mycolor;
enum colors{black=0, blue, green, cyan, red};
colors mycolor;
Enum l mt loi d liu cha cc bin c nh ch s. Do , cc gi tr
hng ca n lun l s nguyn ( lm ch s).
Chng 12. Cc kiu d liu khc
T r a n g | 119
C
+
+
V d
#include<iostream>
using namespace std;
enum colors{red, green, blue};
int main()
{
for(int i=0; i<3; i++)
if (colors(i)==green) cout<<"green"<<endl;
return 0;
}
Chng 13. Lp trnh hng i tng
Trang | 120
CHNG 13. LP TRNH HNG I
TNG
Lch s hnh thnh
Trc khi k thut lp trnh hng i tng ra i, con ngi tri qua
cc thi k lp trnh tuyn tnh, lp trnh hng th tc.
1. Lp trnh tuyn tnh
My tnh u tin c lp trnh bng m nh phn, s dng cc cng
tc c kh np chng trnh. Cng vi s xut hin ca cc thit b lu
tr ln v b nh my tnh c dung lng ln, nn cc ngn ng lp trnh
cp cao bt u xut hin. Cc ngn ng lp trnh ny c thit k lm
cho cng vic lp trnh tr nn n gin hn. Cc chng trnh ban u
ch yu lin quan n tnh ton, chng tng i ngn. Chng ch yu
chy theo cc dng lnh mt cch tun t, dng trc chy trc, dng sau
chy sau.
Nhc im:
o Nu ta cn s dng mt on lnh no nhiu ln, th ta phi sao chp
n nhiu ln.
o Khng c kh nng kim sot phm vi nhn thy ca bin.
o Chng trnh di dng, kh hiu, kh nng cp.
2. Lp trnh hng th tc
Vi nhng nhc im trn, i hi c mt ngn ng lp trnh mi thay
th. chnh l nguyn nhn ra i ca ngn ng lp trnh hng th tc.
V bn cht, chng trnh c chia nh thnh cc modul (n v chng
trnh). Mi n v chng trnh cha cc hm hay th tc (nn gi l
hng th tc). Tuy tch ri thnh cc modul ring bit, nhng ngn ng
lp trnh hng th tc vn m bo thng tin thng sut gia cc modul
nh vo c ch hot ng ca hm, c ch truyn theo tham bin v tham
tr. Vi lp trnh hng th tc, mt chng trnh ln c th c chia nh
Chng 13. Lp trnh hng i tng
T r a n g | 121
C
+
+
thnh cc modul, mi lp trnh vin c th m nhn. Tiu biu trong s
ny l C, Pascal.
Nhc im:
o Cc hm v th tc thng gn kt vi nhau, nu mun nng cp
chng trnh, thng phi chnh sa tt c cc hm v th tc lin
quan.
o Khng ph hp vi xu th hin i v khng m t c thc th trong
cuc sng thc.
3. Lp trnh hng i tng
a. Gii thiu
Vi xu th hin i, ngn ng lp trnh hng i tng ra i. C
s ca lp trnh hng i tng l i tng. i tng l s th hin ca
mt thc th trong th gii thc. Mt thc th trong th gii thc thng
c: cc c trng v cc hnh ng. V d: con ngi trong th gii thc c
cc c trng nh - tn gi, tui, mu tc, mu mt, mu da v cc hnh
ng nh n, ni, chy, nhy Cch thc lp trnh ny m t mt cch
chnh xc cc s vt, con ngi trong th gii thc.
By gi, ta s xt mt vi v d cho thy s cn thit ca lp trnh
hng i tng.
V d 1. Chng ta mun xy dng mt chng trnh qun l sinh vin.
Khi , ta cn lu tr cc thng tin lin quan n i tng sinh vin ny:
h tn sinh vin, m s sinh vin, ngy thng nm sinh, qu qun, im cc
mn, im tng kt,. v rt nhiu thng tin khc lin quan. Sau khi kt
thc nm hc, sinh vin s nhn c nh gi kt qu hc tp ca mnh.
Chng ta cn c phng thc tip nhn kt qu sinh vin c th phn
ng li vi nhng g m mnh nhn c, h phi thc hin cc hnh ng
hc tp, tham gia vo cc hot ng ca trng, ca khoa l nhng
hnh ng m mi sinh vin cn thc hin.
V d 2. Chng ta s im qua mt s tnh nng trong chng trnh son
tho vn bn Word ca Microsoft. Chng ta s tho lun v cc i tng
Drawing trong Word. Mi i tng u c cc thuc tnh: mu vin, dng
ng vin, kch thc vin, mu sc vin, mu nn, c vn bn hay khng
trong i tng drawingKhi chng ta bin i hnh dng ca mi i
Chng 13. Lp trnh hng i tng
T r a n g | 122
C
+
+
tng: ko gin, lm lch xing, quay vng chng ta cn a ra mt
thng ip cc i tng hnh th ny thay i theo. Cc hnh ng ny
thuc quyn s hu ca i tng.
Trong hai v d minh ha trn, chng ta thy rng hng tip cn theo
lp trnh hng i tng l rt gn gi vi cuc sng thc. Chng ta
khng quan tm n nhng kha cnh khng cn thit ca i tng,
chng ta ch tp trung vo cc c trng v cc hnh ng ca i tng.
K t thi im ny tr i, chng ta s gi cc c trng ca i tng l
cc thuc tnh thnh vin ca i tng (hoc d liu thnh vin, bin
thnh vin ca i tng) v cc hnh ng ca i tng l cc phng
thc thnh vin (hay hm thnh vin) ca i tng. Cc cch gi d liu
thnh vin, thuc tnh thnh vin, bin thnh vin hay thuc tnh (tng
ng phng thc thnh vin, hm thnh vin, phng thc) l khng c
s phn bit. Ti ch a ra nhiu cch gi khc nhau chng ta c th
quen khi tham kho cc gio trnh khc nhau. Bi l, nhiu gio trnh chn
la cc cch gi khc nhau. Cc cch gi ny cng ty thuc vo ngn ng
lp trnh (trong C++ thng thng ngi ta s dng khi nim d liu
thnh vin member data hoc bin thnh vin member variable v hm
thnh vin member function, trong khi , cc ngn ng nh Java, Delphi
hay C# li s dng khi nim phng thc method v thuc tnh
property). Khi nim thnh vin s p dng cho c d liu thnh vin ln
hm thnh vin.
Phng chm ca lp trnh hng th tc theo gio s Niklaus Wirth
Chng trnh = Cu trc d liu + Gii thut
Cn phng chm ca lp trnh hng i tng l
Chng trnh = i tng + D liu
Tiu biu trong s ny l C++, Java, C#, Delphi, Python
b. Phng php phn tch v thit k hng i tng
Trc khi bt u vit mt chng trnh theo hng i tng, th ta cn
phn tch v thit k cc i tng. T s cu trc nhn c, chng ta
c th xy dng nn chng trnh. Chi tit v cch thc phn tch v thit
k i tng, chng ta s c tm hiu k hn trong hc phn phn tch
thit k h thng thng tin. Trong ni dung ca gio trnh ny, chng ta ch
tho lun mt phn nh, gip cc bn c th xy dng nn mt cu trc
chng trnh theo hng i tng. S cu trc trong lp trnh hng
i tng c s dng ph bin l s m t trn ngn ng UML
(Unified Modeling Languages). UML l ngn ng chuyn dng m hnh
Chng 13. Lp trnh hng i tng
T r a n g | 123
C
+
+
ha cc i tng. N khng ch c p dng trong lp trnh, m cn c
s dng rng ri trong cc lnh vc khc ca cuc sng. Trong UML c
nhiu dng s c hoch nh. Nhng trong phm tr ca lp trnh
hng i tng, s lp l s m t gn gi nht. Do , ti s trnh by
cch xy dng mt chng trnh c m t bng s lp.
Mt s k hiu cn lu trong UML. Trc khi tm hiu cch m hnh ha
mt bi ton trong UML, chng ta cn tm hiu mt s k hiu c s dng
trong UML. Cc k hiu ny c th khc nhau trong nhiu chng trnh m
phng. Nhng k hiu m ti s dng y l k hiu dng trn Visual
Studio 2010.
K hiu ngha
Lp
Thuc tnh hoc phng thc private
Thuc tnh hoc phng thc protected
Thuc tnh hoc phng thc public
Biu din tnh k tha. Mi tn lun
hng v lp c s. Chiu cn li lun
ch vo lp con.
Thuc tnh
Phng thc
Phn tch v thit k m hnh. Vic phn tch v thit k mt m hnh l
cng vic i hi cc nh thit k phi c mt t duy tt. i vi mt bi
ton phn tch v thit k, khng phi ch c duy nht mt m hnh kt qu,
m c th c mt vi, thm ch l nhiu m hnh khc nhau. Tuy nhin, cng
vic chn la mt m hnh ti u l iu cn thit. Trong ni dung gio
trnh ny, ti ch gii thiu s qua v cch hoch nh mt m hnh. Chng
ta s khng i su nghin cu vn ny. Trong hc phn phn tch v thit
k h thng thng tin s trnh by chi tit v c th hn.
Cc bc phn tch v thit k. phn tch v thit k mt m hnh
hng i tng, cn thc hin cc giai on sau y:
Chng 13. Lp trnh hng i tng
T r a n g | 124
C
+
+
- Bc 1. M t bi ton. Mt bi ton s c miu t di dng ngn ng
t nhin. N ch yu da vo yu cu ca khc hng v s tr gip khch
hng.
- Bc 2. c t cc yu cu. Sau khi phn tch cc nhn t tham gia vo
trong m hnh, ta cn tin hnh xem xt cc tc nhn tc ng vo tng
nhn t. Mi quan h gia cc nhn t
- Bc 3. Trch chn i tng. Sau khi tng hp cc tc nhn v nhn t
trong m hnh. Chng ta cn tin hnh la chn chng. Vic loi b cc
nhn t v tc nhn khng cn thit l rt quan trng. N s gip cho m
hnh tp trung vo cc nhn t quan trng v cn thit, trnh phn tch v
thit k trn lan.
- Bc 3. M hnh ha cc lp i tng. Sau khi chn la cc i tng
cn thit. Chng ta phn tch tng i tng. Khi phn tch i tng, ta cn
lu tp trung vo nhng th ct li ca mi i tng, trnh a vo
nhng phng thc v thuc tnh khng cn thit, khng quan trng ca
i tng chnh l tnh tru tng ha ca d liu. Khi phn tch,
chng ta cng cn lu n cc tnh cht chung ca tng i tng. Nu
cc i tng c nhiu tnh cht chung, chng ta nn xy dng mt i
tng mi, cha cc tnh cht chung , mi i tng cn li s tha k t
i tng ny, nhn c cc tnh cht chung.
- Bc 4. Thit k tng i tng. Chng ta cn m bo rng, mi i
tng phi c cc phng thc v thuc tnh ring ln cc phng thc v
thuc tnh chia s. Cc phng thc ring ch c bn thn i tng mi c
quyn thay i. Cc phng thc chia s c th c truy cp bi i tng
khc theo cc mc khc nhau.
- Bc 5. Xy dng v kim th m hnh. Bt tay vo xy dng m hnh.
y, chng ta s dng ngn ng UML m t. Sau khi xy dng xong m
hnh, cn tin hnh kim th m hnh. Kim th cc m hnh trong cc tnh
hung thc t l cn thit m bo rng m hnh nhn c l ph hp,
trc khi bt tay vo vit chng trnh.
Trn y, ch l nhng bc ngh chng ta c mt ci nhn tng qut
khi phn tch v thit k. C th c nhiu cch phn tch v thit k mt
m hnh. Nhng hy lun m bo rng, m hnh thu c khng nhng
t hiu qu cao, m cn m bo rng n phi d dng bo tr v nng cp.
Mi khi c mt li xut hin, chng ta cng cn bit khoanh vng thu
nh phm vi pht hin li.
Chng ta s ly mt v d nh. Phn tch hng i tng m hnh qun
l ca hng bn xe p. Trong m hnh ny, ta cn qun l cc nhm i
tng sau: i tng xe p, i tng chi nhnh bn hng, i tng
khch hng v i tng nhn vin bn hng.
- i tng xe p: chng ta cn qun l m s xe (m s gm hai phn:
phn id chi nhnh bn hng + m s vch), loi xe, mu sc, gi bn, nc
Chng 13. Lp trnh hng i tng
T r a n g | 125
C
+
+
sn xut (cc thuc tnh chung). i tng xe p a hnh: s bnh rng,
cch ln rng (bng tay/t ng), chng sooc. i tng xe p du lch: xe
n/i, t ng (h tr t chy bng in hay khng), chiu sng
(c/khng). Xe ua th thao: iu chnh cao (c/khng), cc ch p
(p th gin, p tng tc, p chm).
- i tng khch hng v nhn vin bn hng: h v tn, s CMND. i
tng khch hng: cch thc thanh ton (tin mt/chuyn khon), cch
thc giao hng (nhn ti ch/ a n tn nh). i tng nhn vin bn
hng: id chi nhnh bn hng, ngy thng nm sinh, qu qun, a ch, m s
thu, lng
- i tng chi nhnh bn hng: id chi nhnh bn hng, a ch.
Nu yu cu qun l nhiu hn cc thng tin ca tng i tng, khi ta
cn b sung thm cc thuc tnh tng ng ny.
i vi cc phng thc thc thi hnh ng, tng ng vi mi thuc tnh,
ta c hai phng thc ch nh v tip nhn. V d, i tng nhn vin,
c h v tn. Tng ng vi thuc tnh ny, ta c phng thc ch nh
t tn cho nhn vin (t tn l thit lp tn gi trong phn mm qun l)
v tip nhn tn khi c yu cu.
i tng khch hng c phng thc quyt nh (quyt nh thc hin
giao dch). i tng nhn vin bn hng c phng thc tip nhn (nhn
giao dch). i tng a im bn hng c phng thc nhn hng (nu
hng cn y th khng tip nhn thm).
Theo nh phn tch trn, i tng xe p l i tng chung. Cc i
tng xe p th thao, xe p du lch, xe p a hnh k tha t lp xe p.
i tng con ngi qun l thng tin chung. V cc i tng nhn
vin v khch hng tha k t lp con ngi. Cui cng l i tng chi
nhnh bn hng. Theo nh cch phn tch ny, ta c s lp nh sau:
Hnh 20 Minh ha s lp
Chng 13. Lp trnh hng i tng
T r a n g | 126
C
+
+
Trong s ny, cc phng thc v thuc tnh ca mi lp i tng nh
phn tch trn. trnh rm r, cc phng thc ch biu din s
lc.
Lp v i tng
Lp l s biu din ca i tng trong lp trnh v ngc li i
tng l s th hin ca lp. Mt i tng gm c: thuc tnh v phng
thc. Chng ta c th xem mt lp nh l mt kiu d liu, cn i tng l
bin. Lp c khai bo nh t kha class
class tn_lp{
cc_thuc_tnh
cc_phng_thc
} [tn_i_tng];
tn_lp: l tn ca lp.
tn_i_tng: l tn ca i tng.
Khai bo lp tng i ging khai bo struct.
Cc thuc tnh c khai bo nh khai bo bin. Cc phng thc c
khai bo nh khai bo hm. Chng c th c ch nh bng mt trong ba
t kha: private, protected v public.
o private: cc thnh vin (bin thnh vin hoc hm thnh vin) ca cng
mt lp hoc t mt hm bn ca n c th truy cp.
o protected: cc thnh vin ca cng mt lp hoc t mt hm bn ca n
hoc t mt lp dn xut ca n hoc bn ca mt lp dn xut ca n
u c th truy cp. Mc truy cp ln nht trong trng hp ny l bn
ca lp dn xut. Chng ta s tho lun thm trong nhng phn sau.
o public: cc thnh vin c th truy cp ln nhau t mi lp.
Theo mc nh, nu khng ch nh t kha, th private c n nh.
class Humans{
string name;
int age;
public:
void setName(string);
void setAge(string);
string getName(void);
int getAge(void);
Chng 13. Lp trnh hng i tng
T r a n g | 127
C
+
+
}man;
Humans l tn lp, cha cc thuc tnh l name v age, chng khng c
ch nh t kha, nn private s c s dng. Cc phng thc setName,
setAge, getName v getAge c ch nh l public. Trong trng hp ny,
man l mt i tng th hin ca lp Humans.
Sau khi khai bo lp, ta cn b sung phn thn lp tng ng vi cc hm
thnh vin. Hoc ta c th b sung trc tip vo trong lp tng t khai
bo hm trc tip, hoc s dng khai bo prototype. i vi khai bo
prototype, xc nh mt phng thc l ca mt lp no , ta s dng
ton t phm vi :: theo sau tn lp.
Chng trnh Kt qu
#include<iostream>
using namespace std;
class Humans{
string name;
int age;
public:
void setName(string);
void setAge(int);
string getName(void);
int getAge(void);
};
void Humans::setName(string s){
name = s;
}
void Humans::setAge (int a){
age = a;
}
string Humans::getName(void){
return name;
}
int Humans::getAge(void){
return age;
}
int main(){
Humans man;
man.setName(Jack);
man.setAge(21);
cout<<The man: <<man.getName()<<, age
The man: Jack, age 21
Chng 13. Lp trnh hng i tng
T r a n g | 128
C
+
+
<<man.getAge();
return 0;
}
Gii thch: Hm setName s gn bin s cho thnh vin name, tng t cho
hm setAge s gn bin a cho thnh vin age. Hm getName tr v d liu
nhn c t thnh vin name v hm getAge nhn c d liu t
thnh vin age. Hai phng thc setName v setAge gi l phng thc
setter. Phng thc getName v getAge gi l phng thc getter. Cc
phng thc setter dng nhp d liu cho cc thuc tnh thnh vin, cc
phng thc getter dng nhn gi tr t cc thuc tnh thnh vin
c nhp bi setter (hoc phng thc khi to). Chng ta cn lu rng,
hm main khng thuc lp Humans, do , n khng th truy xut n cc
thuc tnh thnh vin trong trng hp ny, v chng c khai bo mc
nh l private.
Ton t phm vi :: s gii hn s truy cp bt hp l ca nhng hm
khng thuc lp Humans hay l bn ca Humans. y l mt cch thc
quy nh mt phng thc c phi l thnh vin ca mt lp hay khng.
Cch thc th hai, c th khai bo hm trc tip ngay bn trong lp. V bn
cht, hai cch ny khng c s khc bit no.
Lp cng c tc dng nh l mt kiu d liu, do , ta cng c th
khai bo nhiu i tng ca cng mt lp hay mng cc i tng.
Chng trnh Kt qu
#include<iostream>
using namespace std;
class Humans{
string name;
int age;
public:
void setName(string);
void setAge(int);
string getName(void);
int getAge(void);
};
void Humans::setName(string s){
name = s;
Name and age of Student
1
Nam
21
Name and age of Student
2
Binh
22
Name and age of Student
3
Xuan
22
Name and age of Student
4
Tuan
Chng 13. Lp trnh hng i tng
T r a n g | 129
C
+
+
}
void Humans::setAge (int a){
age = a;
}
string Humans::getName(void){
return name;
}
int Humans::getAge(void){
return age;
}
#define MAX 5
int main(){
Humans man[MAX];
for(int i=0; i<MAX; i++){
string s;
int a;
cout<<"Name and age of Student "
<<(i+1)<<endl;
cin>>s;
cin>>a;
man[i].setName(s);
man[i].setAge(a);
}
cout<<"=====Students====="<<endl;
for(int i=0; i<MAX; i++)
cout<<"The man: "<<man[i].getName()<<",
age "<<man[i].getAge()<<endl;
return 0;
}
21
Name and age of Student
5
Lan
22
=====Students=====
The man: Nam, age 21
The man: Binh, age 22
The man: Xuan, age 22
The man: Tuan, age 21
The man: Lan, age 22
Trong trng hp ny, bin man l mt mng cc i tng Humans.
Chng trnh minh ha cho vic nhp tn sinh vin, tui ca h v lu vo
mt mng. Sau , xut kt qu ra mn hnh. D l cng l s th hin ca
lp Humans, nhng cc i tng man[1], man[2], c cc thuc tnh hon
ton khc nhau.
C s ca lp trnh hng i tng l d liu thnh vin v cc hm
thnh vin ca mt i tng. Chng ta hon ton khng s dng mt tp
cc bin ton cc truyn qua mt hm (hay tp cc bin cc b truyn
theo tham bin), m thay vo , chng ta s dng cc i tng cng vi
Chng 13. Lp trnh hng i tng
T r a n g | 130
C
+
+
d liu thnh vin v hm thnh vin ca n. Cc hm thnh vin tc ng
trc tip ln cc d liu thnh vin.
Hm to v hm hy
Trc khi s dng mt i tng, chng ta cn khi to gi tr cho n
trnh gp phi nhng gi tr khng mong mun khi thc thi chng
trnh. Mt cch thc m chng ta s dng trn l s dng phng thc
setter. Mt phng thc n gin hn, chng ta c th s dng hm khi
to (hay gi tt l hm to). Vic khai bo hm to cng tng t nh khai
bo hm thnh vin khc, tuy nhin nht thit tn hm to phi trng vi
tn lp.
Chng trnh V d
#include<iostream>
using namespace std;
class Humans{
string name;
int age;
public:
Humans(string, int);
string getName(void);
int getAge(void);
};
Humans::Humans (string s, int a){
name = s;
age = a;
}
string Humans::getName(void){
return name;
}
int Humans::getAge(void){
return age;
}
int main(){
Humans man(Jack, 21);
cout<<The man: <<man.getName()<<, age
<<man.getAge();
return 0;
}
The man: Jack, age 21
Hm to khng c kiu d liu tr v - tng ng vi kiu void. Tuy nhin
chng ta s khng s dng t kha void trc khai bo hm to.
Chng 13. Lp trnh hng i tng
T r a n g | 131
C
+
+
Nu mt i tng c to ra, nhng ta khng mun s dng
n n na, thu hi b nh, ta cn s dng mt phng thc hy b
cc d liu thnh vin ca n l hm hy. Hm hy cng l mt hm
thnh vin ca lp. N khng c kiu d liu tr v, nhng ta cng khng
s dng t kha void trc khai bo hm hy. Hm hy c tn trng vi
tn lp v pha trc tn hm hy l du ~. Hm hy s t ng c gi
khi phm vi hot ng ca i tng kt thc. Phm vi hot ng ca mt
i tng cng ging nh phm vi hot ng ca mt bin cc b - khai bo
trong phm vi no, th ch c tc dng trong phm vi .
Chng trnh V d
#include<iostream>
using namespace std;
class Humans{
string name;
int age;
public:
Humans(string, int);
~Human();
string getName(void);
int getAge(void);
};
Humans::Humans (string s, int a){
name = s;
age = a;
}
Humans::~Humans()
{
//do something
//delete pointer;
}
string Humans::getName(void){
return name;
}
int Humans::getAge(void){
return age;
}
int main(){
Humans man(Jack, 21);
cout<<The man: <<man.getName()<<, age
<<man.getAge();
The man: Jack, age 21
Chng 13. Lp trnh hng i tng
T r a n g | 132
C
+
+
return 0;
}
Chng cht hm to
Cng nh cc hm khc trong C++ cho php chng cht hm, hm to
cng c th b chng cht. Khi chng cht hm to th danh sch tham s
phi khc nhau (kiu d liu hoc s lng tham s). Chng ta cn nh
rng, khi chng cht hm th trnh bin dch s gi mt hm tng ng vi
danh sch tham s ca n. Trong trng hp chng cht hm to, th qu
trnh gi l t ng khi i tng c to ra, do , mt hm to s c
gi t ng tng ng vi danh sch tham s ca n.
Chng trnh V d
#include<iostream>
using namespace std;
class Humans{
string name;
int age;
public:
Humans(void);
Humans(string, int);
string getName(void);
int getAge(void);
};
Humans::Humans (void){
name = Default;
age = 21;
}
Humans::Humans (string s, int a){
name = s;
age = a;
}
string Humans::getName(void){
return name;
}
int Humans::getAge(void){
return age;
}
int main(){
Humans man(Jack, 21);
Humans default;
The man: Jack, age 21
The default: Default, age
21
Chng 13. Lp trnh hng i tng
T r a n g | 133
C
+
+
cout<<The man: <<man.getName()<<, age
<<man.getAge()<<endl;
cout<<The default: <<default.getName()<<,
age <<default.getAge();
return 0;
}
Gii thch: trong trng hp v d trn, to i tng thuc lp
Humans, ta c th s dng mt trong hai hm to tng ng:
Humans(void) hoc Humans(string, int). Nu gi theo phng thc hm
to khng i s, th tn gi v tui s c to mc nh. Cn nu gi theo
phng thc c i s, th tn gi v tui s c to theo tham s truyn
vo. Ta cng cn lu trong cch gi hm to, i vi hm to c i s, th
sau tn i tng, chng ta cn cung cp tham s tng ng vi tham s
hm to bn trong du (). Cn i vi hm to khng i s, th hy khai
bo n nh khai bo bin m khng h c bt k du () no.
Humans man(); //Sai
Humans man; //ng
Humans man = Humans(); //ng
Ch : Khi ta khng khai bo mt hm to mc nh khng tham s v ch
khai bo hm to mc nh c tham s, th vic khai bo mt i tng theo
cch Humans man; l khng c php. Nu ta khng to ra mt hm to
no, th iu ny l hp l.
Hm to sao chp
Mt i tng c th c to ra t hm to theo cch khi gn cc
d liu thnh vin ca n cho mt gi tr no . Chng ta hon ton c th
khi to mt i tng t mt i tng khc bng cch s dng ton t
gn. Tuy nhin, trong thc t, nu d liu ca i tng ln, phc tp, th
vic s dng ton t gn s thc thi rt chm v c th gy ra mt s li lin
quan n hy i tng trong vng b nh. khc phc nhc im ny,
ta c th s dng hm to sao chp. Khi s dng hm to sao chp, trnh
bin dch s sao chp ton b d liu thnh vin ca i tng sang i
tng khi to.
Humans man(Jack, 21);
//Sao chp trc tip
Humans man2 = man;
//Sao chp hm to
Chng 13. Lp trnh hng i tng
T r a n g | 134
C
+
+
Humans::Humans(const Humans& m){
name = m.name;
age = m.age;
}
Humans man2(man);
Chng ta lu rng, vic sao chp hm to s c quy nh theo tham
chiu hng const Humans&. Nu ta khng vit hm to sao chp, th trnh
bin dch s t ng lm gip(ngha l ta lun c th s dng cch khi to
i tng theo kiu Object newObj(oldObj); vi oldObj l i tng thuc
lp Object c to, d ta c to ra phng thc hm to sao chp hay
khng). Hay ni cch khc, hm to sao chp l mc nh i vi i a
s trnh bin dch ANSI C++ hin i (GCC, Visual C++, Borland C++,
Intel C++).
Tham chiu hng. Phng thc hm to sao chp (hoc tng qut l cc
phng thc c s dng tham chiu hng n lp i tng) c th thc
hin theo tham chiu hoc tham chiu hng (tng ng vi khng hoc c
t kha const), nhng hy lun quy nh l tham chiu (c ton t &). Khi
quy nh tham chiu, i tng tham chiu s tham chiu n a ch ca
i tng gc. D liu ca i tng tham chiu s c nh x theo a ch
ca i tng c tham chiu (khng thc hin vic sao chp trc tip m
l gin tip thng qua a ch ca bin tham chiu). Tuy nhin, cng v l do
ny m i tng c tham chiu c th b thay i gi tr (tng t nh
truyn theo tham bin). iu ny lm vi phm tnh ng gi trong lp trnh
hng i tng. Cng v l do ny, C++ cung cp cho ta t kha const
quy nh mt i tng khi c tham chiu s khng b lm thay i d
liu thnh vin v n c gi l tham chiu hng. Nh vy, ta cn phn
bit ba cch truyn tham s i tng trong mt phng thc: truyn theo
tham tr d liu ca i tng c th c thay i bn trong phng
thc nhng s thay i ny khng lu li, vic sao chp d liu trong
trng hp ny l thc thi trc tip nn thng ch p dng cho cc kiu
d liu nguyn thy n gin; truyn theo tham chiu d liu ca i
tng c th b thay i trong phng thc v n c lu li, n thc hin
vic sao chp d liu mt cch gin tip nn d liu c cu trc phc tp
(nh lp i tng, con tr) c th c sao chp nhanh hn rt nhiu so
vi truyn theo tham tr; tham chiu hng tng t nh tham chiu
nhng khng cho php thay i d liu ca i tng ngay c trong
phng thc.
Chng 13. Lp trnh hng i tng
T r a n g | 135
C
+
+
Hp l Khng hp l
class Humans{
string name;
int age;
public:
Humans(string, int);
Humans(const Humans&);
string getName(void);
int getAge(void);
};
Humans::Humans(const Humans&
m){
name = m.name;
age = m.age;
}
class Humans{
string name;
int age;
public:
Humans(string, int);
Humans(const Humans&);
~Human();
string getName(void);
int getAge(void);
};
Humans::Humans(const Humans&
m){
name = m.name;
age = m.age = 22;//Error
}
Ta c th thy trong trng hp khng hp l, chng ta quy nh i
tng c tham chiu m s cho php i tng khc tham chiu n n
theo tham chiu hng. Nhng i tng tham chiu n n, li c gng thay
i thuc tnh age ca n. Trong trng hp ny, chng trnh s pht sinh
li. Nu quy nh l tham chiu bnh thng (b i t kha const) th khai
bo c xem l hp l (tuy nhin vi phm tnh ng gi).
Khi mt phng thc ca lp i tng s dng tham s chnh l i tng
ca lp , chng ta c th truy cp trc tip n thuc tnh ca i tng
tham chiu k c n c quy nh l private (c tham chiu ln khng
tham chiu). Bn cnh , nu ta quy nh l tham chiu bnh thng, th ta
c th s dng cc phng thc nh getter v setter truy cp n cc
thuc tnh ca n. Nhng nu ta s dng tham chiu hng, th khng c
php truy cp n cc phng thc ca i tng tham chiu hng. Chng
ta ch c th truy cp n cc phng thc hng ca i tng tham chiu
hng ny. Phng thc hng l nhng phng thc c b sung vo t
kha const vo cui khai bo phng thc trong tiu hm prototype v
tiu trong khai bo hm y . Hy quan st cc v d sau y.
V d Tham chiu Hng V d Tham chiu
class PhanSo
class PhanSo
Chng 13. Lp trnh hng i tng
T r a n g | 136
C
+
+
{
private:
int Tu;
int Mau;
public:
//Khai bo cc hm to
PhanSo Nhan(const PhanSo&);
int GetTu(void);
int GetMau(void);
};
PhanSo PhanSo::Nhan(const
PhanSo& p)
{
return PhanSo(Tu*p.Tu,
Mau*p.Mau);
//khng c php vit
PhanSo(Tu*p.GetTu(),
Mau*p.GetMau());
}
int PhanSo::GetTu(void)
{
return Tu;
}
int PhanSo::GetMau(void)
{
return Mau;
}
{
private:
int Tu;
int Mau;
public:
//Khai bo cc hm to
PhanSo Nhan(PhanSo&);
int GetTu(void);
int GetMau(void);
};
PhanSo PhanSo::Nhan(PhanSo& p)
{
return PhanSo(Tu*p.GetTu(),
Mau*p.GetMau());
//hoc PhanSo(Tu*p.Tu,
Mau*p.Mau);
}
int PhanSo::GetTu(void)
{
return Tu;
}
int PhanSo::GetMau(void)
{
return Mau;
}
Trong trng hp ta mun s dng phng thc cho i tng tham chiu
hng, th cn khai bo phng thc GetTu v GetMau l phng thc hng.
Khi , chng ta s dng c php sau y:
int GetTu(void) const;
int GetMau(void) const;
Chng 13. Lp trnh hng i tng
T r a n g | 137
C
+
+
class PhanSo
{
private:
int Tu;
int Mau;
public:
//Khai bo cc hm to
PhanSo Nhan(const PhanSo&);
int GetTu(void) const;
int GetMau(void) const;
};
PhanSo PhanSo::Nhan(const PhanSo& p)
{
return PhanSo(Tu*p.Tu, Mau*p.Mau);
//hoc PhanSo(Tu*p.GetTu(), Mau*p.GetMau());
}
int PhanSo::GetTu(void) const
{
return Tu;
}
int PhanSo::GetMau(void) const
{
return Mau;
}
Vic b sung t kha const vo sau khai bo phng thc s gip cho i
tng tham chiu hng c th gi phng thc hng ny.
Thm mt khi nim na trong C++ m chng ta cn bit l phng thc
tham chiu. Mt phng thc tham chiu cho php ta s dng n nh mt
bin ta c th gn trc tip mt gi tr bin cho phng thc m khng
gp phi mt tr ngi no.
Chng trnh
#include <iostream>
using namespace std;
Chng 13. Lp trnh hng i tng
T r a n g | 138
C
+
+
class complex{
private:
float img;
float real;
public:
complex();
complex(float, float);
float &getimg();
float &getreal();
};
complex::complex( float a, float b )
{
img = a;
real = b;
}
complex::complex()
{
real = 0;
img = 0;
}
float & complex::getreal()
{
return real;
}
float & complex::getimg()
{
return img;
}
int main () {
complex c;
c.getreal() = 2;
c.getimg() = 1;
cout<<c.getreal()<<" + I*"<<c.getimg();
}
Trong v d ny, chng ta thy cc phng thc getter c khai bo l
phng thc tham chiu. Ta c th gn trc tip gi tr cho cc phng
thc ny. Trong trng hp ny, phng thc getter c c hai tnh nng:
Chng 13. Lp trnh hng i tng
T r a n g | 139
C
+
+
va l getter va l setter. Nhng vi tnh nng ca mt phng thc setter
n (tc ch thit lp mt gi tr duy nht).
Tnh ng gi Encapsulation
V d trn a ra cho ta hai phng n: nn hay khng nn s dng
t kha const. Cu tr li l hy nn quy nh vic sao chp hm to l
truyn theo tham chiu hng, bi l cc i tng khc nhau, khng c
quyn chnh sa d liu thnh vin ca nhau, n ch c th truyn thng
ip cho nhau m thi, vic chnh sa d liu thnh vin l do bn thn ca
i tng . iu ny l s th hin tnh ng gi trong lp trnh hng
i tng. Tnh ng gi ca lp trnh hng i tng cn th hin cc
mc cho php truy cp i vi d liu v hm thnh vin tng ng
vi t kho private, protected v public m ta tho lun trn.
Khi nim: tnh ng gi l tnh cht khng cho php ngi dng hay
i tng khc thay i d liu thnh vin ca i tng ni ti. Ch c cc
hm thnh vin ca i tng mi c quyn thay i trng thi ni ti
ca n m thi. Cc i tng khc mun thay i thuc tnh thnh vin ca
i tng ni ti, th chng cn truyn thng ip cho i tng, v vic
quyt nh thay i hay khng vn do i tng ni ti quyt nh.
Chng ta c th kho st v d sau: nu mt bnh nhn cn phi thay
ni tng c th sng, th vic thay th ni tng cn phi c s ng
ca bnh nhn. Khng ai c th t ng thc hin iu ny (ch khi bnh
nhn ri vo tnh trng hn m, th ngi nh bnh nhn mi quyt nh
thay h). Ni tng l cc thuc tnh c hu ca bnh nhn. Cc phng thc
thay th ni tng ca i tng bc s khng phi l phng thc thnh
vin ca i tng bnh nhn (bnh nhn khng th t thay th ni tng
cho mnh v bc s khng c quyn thay th ni tng cho bnh nhn nu
khng c s ng ca h). Do , h mun thc hin th cn c phng
thc ng ca bnh nhn (phng thc thnh vin ca i tng bnh
nhn). Phng thc ng ca bnh nhn ny cng khng th no p dng
cho bnh nhn kia (bnh nhn A khng th quyt nh thay th ni tng cho
bnh nhn B). Nh vy, d liu thnh vin ca i tng no, th ch c i
tng mi c quyn thay i.
Trong mt vi gio trnh, tnh cht ny cn c gi l tnh ng gi
v n du thng tin (encapsulation and information hiding).
Chng 13. Lp trnh hng i tng
T r a n g | 140
C
+
+
Con tr i tng
Chng ta lm quen vi mng i tng v chng ta cng bit
rng c s tng ng 1-1 gia mng v con tr. Trong phn ny, chng ta
s tho lun v con tr i tng. Chng ta vn s dng lp Humans trn
cho cc v d minh ha trong phn ny. Vic khai bo con tr i tng
hon ton tng t nh khai bo con tr d liu.
Humans *man;
truy cp n cc phng thc thnh vin bn ngoi lp (hm thnh
vin), ta s dng du -> (v ch c cc phng thc thnh vin c ch
nh l public). Khi gi phng thc khi to, ta c th gi theo cch m ta
s dng cho con tr d liu. Hoc c th s dng ton t new.
Chng trnh Kt qu
int main()
{
Humans man(Andy, 22);
Humans *man0 = &man;
//Hoc
Humans *man1 = new Humans(Jack, 21);
cout<<man0->getName()<<, <<endl<<man0-
>getAge()<<endl;
cout<<man1->getName()<<endl<<man1->getAge();
return 0;
}
Andy, 22
Jack, 21
Ngay sau ton t new, chng ta gi phng thc khi to ca n. Trong v
d trn, ta ang khi to mt i tng duy nht. Nu mun to mt danh
sch cc i tng theo dng con tr, ta c th s dng ton t new[] m ta
tho lun trn.
Chng 13. Lp trnh hng i tng
T r a n g | 141
C
+
+
Khi lin i n con tr, c nhiu vn lin quan n cch c. Chng ta
c th tng kt theo bng bn di y
Biu thc Cch c
*x tr bi x
&x a ch ca x
x.y thnh vin y ca i tng x
x->y thnh vin y ca i tng tr bi x
(*x).y thnh vin y ca i tng tr bi x
x[i] i tng th i tr bi x
Lp c khai bo nh t kha struct v union
Trong C++, mt lp c th c khai bo nh vo t kha struct hoc
t kha union. Chng ta bit t kha struct dng khai bo kiu d
liu struct v n cha cc d liu thnh vin. T kha union dng khai
bo kiu d liu union v cng cha cc d liu thnh vin. Tuy nhin,
chng vn c th cha cc hm thnh vin. Khi khai bo lp bng t kha
struct, khng c mt s khc bit no so vi t kha class. Ch c duy nht
mt s khc bit, l theo mc nh, nhng phng thc thnh vin v d
liu thnh vin no khng c ch nh t kha quy nh mc truy cp
(private, protected, public) th trong lp c khai bo bng t kha class
s l private cn trong lp c khai bo bng struct s l public. Cn i
vi t kha union c vi s khc bit, tuy khng th dng khai bo mt
lp hon ho nh t kha struct hay class, nhng n vn c th cha cc
phng thc bn trong n. Nu khng ch nh t kha quy nh mc truy
cp, th n s mc nh l public.
Nu vit mt lp vi y hm to, hm hy v cc phng thc
khc bng t kha class, th khi thay th bng t kha struct, s khng c
nhiu s thay i. Nu thay th bng t kha union, th trnh dch s thng
bo li. S d nh th l bi v d union cho php cha phng thc thnh
vin, nhng n khng h tr khai bo prototype, khng h tr d liu kiu
string.
Ch : Hy lun s dng t kha class khai bo lp.
Con tr this
Con tr this tr vo d liu thnh vin ca chnh n. iu ny c
ngha l con tr this ch c phm vi tc dng trong mt lp. Mt iu cc k
Chng 13. Lp trnh hng i tng
T r a n g | 142
C
+
+
quan trng, l con tr this ch hot ng vi cc d liu thnh vin v cc
hm thnh vin c khai bo l khng tnh (non-static). Cc d liu thnh
vin v hm thnh vin tnh (static) khng h tr con tr this.
V d trong phng thc hm to ca lp Complex trn, chng ta c th s
dng this->real truy cp thuc tnh real, this->img truy cp thuc
tnh img. Ta cng c th so snh mt i tng khc vi i tng ni ti
nh vo con tr this ny.
V d Kt qu
#include<iostream>
using namespace std;
class Complex{
float real;
float img;
public:
Complex(float, float);
bool isMe(const Complex&);
};
Complex::Complex(float real, float img){
this->real = real;
this->img = img;
}
bool Complex::isMe(const Complex& c){
if(&c==this)
return true;
else
return false;
}
int main(){
Complex a(3, 2);
Complex b(2, 2);
Complex *c = &a;
cout<<a.isMe(b)<<endl;
cout<<a.isMe(*c);
return 0;
}
0
1
Gii thch: vi vic s dng con tr this trong hm to, ta c th t tn cc
tham s trong hm to trng vi tn cc d liu ca lp. truy cp n
cc thuc tnh ca lp, ta s dng con tr this. Hm thnh vin isMe s kim
tra mt i tng c phi l chnh n hay khng (c cng a ch trn b
Chng 13. Lp trnh hng i tng
T r a n g | 143
C
+
+
nh). D l mt bn sao ca n (c d liu thnh vin ging nhau) th kt
qu nhn c cng l sai (0). Trong hm main, ta khi to hai i tng a
v b. i tng con tr c s tr vo a ch ca i tng a. iu ny c
ngha l c s c cng vng a ch vi a, cn b th khng. Khi gi hm
a.isMe(b) s cho kt qu l sai (0) v a.isMe(*c) s cho kt qu l ng (1).
Thnh vin tnh T kha static
Mt lp c th cha cc thnh vin tnh hoc khng tnh. Nu khng
ch nh t kha l static cho cc thnh vin, th theo mc nh, n s l non-
static. Nu mun quy nh cho mt thnh vin no l tnh, th ta b sung t
kha static vo trc n. Nu l thnh vin khng tnh, ta khng cn khai
bo bt k t kha no.
Mt d liu thnh vin tnh ca lp nh l mt bin ton cc ca lp
. Bi mi s thay i d liu thnh vin tnh ca i tng ny u c tc
dng ln ton b cc d liu thnh vin tnh ca cc i tng khc.
Mt phng thc khng tnh c quyn truy cp n cc d liu thnh
vin khng tnh. Mt phng thc tnh c th truy cp n d liu thnh
vin khng tnh. Trong trng hp ny, ta cn to ra mt s th hin ca
i tng v truy cp n cc thuc tnh khng tnh t i tng ny.
truy cp n thnh vin khng tnh, ta s dng mt s th hin ca i
tng, sau l du chm (hoc ->), tip n l thnh vin khng tnh.
truy cp n i tng tnh, ta s dng ton t phm vi ngay sau tn lp,
tip n l thnh vin tnh. Cc phng thc tnh v khng tnh c th truy
cp ln nhau.
V d Kt qu
#include <iostream>
using namespace std;
class Car
{
public:
string name;
int serial;
public:
static int count;
static void Show()
{
Car vehicle;
---Call by NonStatic method---
Name: Ford
Serial: 123
---Call by Static method---
Name: Ford
Serial: 123
Count: 2
Chng 13. Lp trnh hng i tng
T r a n g | 144
C
+
+
vehicle.name = "Ford";
vehicle.serial = 123;
cout << "\nName: " << vehicle.name;
cout << "\nSerial: " << vehicle.serial;
}
static void CallShowStatic(){
Show();
}
void CallShowNonStatic(){
Show();
}
};
int Car::count = 2;
int main()
{
Car a;
cout<<"---Call by NonStatic method---";
a.CallShowNonStatic();
cout<<"\n---Call by Static method---";
Car::CallShowStatic();
cout << "\n\nCount: " <<Car::count;
return 0;
}
Gii thch: Hm thnh vin Show l static, nn mun truy cp n cc d
liu thnh vin khng tnh th n cn to mt s th hin ca lp l i
tng vehicle. Hm CallShowStatic l static, hm CallShowNonStatic l
non-static u c th truy cp n hm Show l static mt cch trc tip.
Trong hm main, cc hm non-static c gi thng qua mt s th hin
lp, cn hm static c gi thng qua ton t phm vi. D liu static l
count cng c truy cp thng qua ton t phm vi.
Mc d thnh vin static c th c truy cp trc tip thng qua ton t
phm vi, nhng n cng chu s chi phi ca cc mc truy cp (private,
protected, public).
Ch c cc thnh vin khng tnh mi c th s dng con tr this.
Hm bn v lp bn
Hm bn: nu mt thnh vin ca lp c quy nh l private hoc
protected th ch c cc hm thnh vin ca lp mi c quyn truy cp n
n. Nu mt phng thc khng phi l thnh vin ca lp mun truy cp
Chng 13. Lp trnh hng i tng
T r a n g | 145
C
+
+
n, th n phi l hm bn ca lp . Phng thc bn c th c khai
bo nh t kha friend.
V d Kt qu
#include <iostream>
using namespace std;
class Rectangle
{
private:
int w;
int h;
public:
Rectangle(int, int);
friend int Area(Rectangle);
};
Rectangle::Rectangle(int w, int h){
this->w = w;
this->h = h;
}
int Area(Rectangle rec){
return (rec.w*rec.h);
}
int main()
{
Rectangle rec(2, 5);
cout<<Area(rec);
return 0;
}
10
Gii thch: hm Area l mt hm ton cc, n khng phi l thnh vin ca
lp (v khng s dng ton t phm vi khi khai bo). Nu ta c tnh truy cp
n cc d liu w v h th chng trnh dch s bo li, bi chng c quy
nh l private. Khi ta khai bo hm Area l hm bn, n s gii quyt vn
ny.
Lp bn: nu ta c hai lp A v B, v khai bo rng B l bn ca A, th
khi , cc phng thc ca lp A c th truy cp n cc thuc tnh private
v protected ca lp B.
V d Kt qu
#include <iostream>
using namespace std;
Square: 5x5
Chng 13. Lp trnh hng i tng
T r a n g | 146
C
+
+
class Rectangle
{
private:
int w;
int h;
public:
Rectangle(int, int);
friend class MakeSquare;
};
class MakeSquare{
private:
int w;
int h;
public:
MakeSquare(Rectangle);
void ShowSquare(void);
};
MakeSquare::MakeSquare(Rectangle rec){
this->w = max(rec.w, rec.h);
this->h = max(rec.w, rec.h);
}
void MakeSquare::ShowSquare(void){
cout<<"Square: "<<w<<"x"<<h;
}
int main()
{
Rectangle rec(2, 5);
MakeSquare mk(rec);
mk.ShowSquare();
return 0;
}
Gii thch: Lp Rectangle c quy nh l lp bn ca lp Square, do ,
lp Square c quyn truy cp n cc thuc tnh private v protected ca
lp Rectangle. Hm to ca lp Square truy cp n cc d liu thnh vin
ca lp Rectangle ly chiu di v chiu rng ca i tng rec (d
chng l private), to nn i tng mk. i tng Square c to mi
vi cnh ca n l s o ln nht cc cnh ca i tng Rectangle.
Ta cng lu rng A l bn ca B, th khng c ngha l B cng l bn ca A.
Nh vy, tnh bn c th l mt chiu hoc hai chiu ty thuc vo s quy
nh ca ngi lp trnh.
Chng 13. Lp trnh hng i tng
T r a n g | 147
C
+
+
Chng cht ton t
Trong ngn ng lp trnh hng i tng, c nhiu ngn ng h tr
chng cht ton t (cc ngn ng h tr bao gm C++, Delphi 2009,
C#,VB.net, nhng mc h tr khc nhau; cc ngn ng khng h tr
bao gm Java, Python,). Chng cht ton t (operator overloading) l cch
thc xy dng cc hm thnh vin m tn gi ca chng l cc ton t
c nh ngha trc (+, -, *, v.v.). C++ l ngn ng h tr chng cht
ton t hon ho. Cc ton t sau y c th c chng cht trong C++
Cc ton t c php chng cht
+ - * / = < > += -= *= /= << >> <<= >>= ==
!= <= >= ++ -- % & ^ ! | ~ &= ^= |= || &&
%= [] () , ->* -> new delete new[] delete[]
Cu trc khai bo chng cht ton t
type operator ton_t(tham s){thn hm}
V d sau y s minh ha cho vic chng cht ton t. Chng ta s xy
dng mt lp s phc, xy dng cc php ton cng hai s phc (php ton
hai ngi) v php tng s phc ln 1 n v thc v 1 n v o(php ton
mt ngi) bng cch s dng chng cht ton t.
V d Kt qu
#include<iostream>
using namespace std;
class Complex{
float real;
float img;
public:
Complex(float, float);
Complex operator +(const Complex&);
Complex operator ++(void);
void toString(void);
};
Complex::Complex(float a, float b){
real = a;
img = b;
}
Complex Complex::operator +(const Complex& b){
Complex c(0, 0);
c.real = real + b.real;
2 + 3*I
4 + 3*I
Chng 13. Lp trnh hng i tng
T r a n g | 148
C
+
+
c.img = img + b.img;
return c;
}
Complex Complex::operator ++(void){
Complex c(0, 0);
c.real += ++real;
c.img += ++img;
return c;
}
void Complex::toString(void){
cout<<real<<" + "<<img<<"*I"<<endl;
}
int main(){
Complex a(3, 2);
Complex b(-1, 1);
(a+b).toString();
(++a).toString();
return 0;
}
Ta lu rng, trong phng thc ton t, s tham s hnh thc lun
bng hng ca ton t tr 1. iu ny c ngha l vi php ton mt ngi s
khng c tham s hnh thc, vi ton t hai ngi s c mt tham s hnh
thc. iu ny l d hiu, bi c mt tham s mc nh chnh l bn
thn i tng ni ti (i tng tng ng vi con tr this). Php ton
cng, s cng i tng ni ti vi mt i tng khc. Php ton tng mt
n v thc, mt n v o s lm thay i gi tr ca n v thc v n v
o ca i tng ni ti ln 1. V cc ton t ny tr v kiu s phc, nn ta
hon ton c th thc hin php ton phc hp vi chng (tc l mt biu
thc c nhiu ton t loi ny thc hin trn cc hng t l cc s phc).
(a+ ++b+(a+b)).toString();
Bng vic s dng chng cht ton t, biu thc tnh ton s tr nn n
gin hn. Ta cng c th s dng cch gi a.operator+(b). Hai cch ny cho
kt qu nh nhau. i vi hm ton t + v ++ trn, ta c th vit ngn
gn hn m khng cn khai bo thm mt bin tm:
Complex Complex::operator +(const Complex& b){
return Complex(real + b.real, img + b.img);
}
Chng 13. Lp trnh hng i tng
T r a n g | 149
C
+
+
Complex Complex::operator ++(void){
return Complex(++real, ++img);
}
Vic thc hin cc ton t trn cc i tng cn yu cu i tng trc
phi c khi to gi tr. Ngha l phi c mt hm to cho i tng
. Mc d C++ h tr chng cht nhiu ton t, nhng ta khng nn lm
dng n. Chng ta nn s dng chng cht ton t vi mc ch ng n
(cng hai s phc th s dng ton t + m khng phi l ton t khc, ).
Vic s dng chng cht ton t nh l hm thnh vin p dng cho tt c
cc ton t m C++ h tr. Tr cc ton t gn, hp nht, () v ->. Cc ton
t cn li cng p dng cho cc hm ton cc. Hm ton cc cng nh hm
thnh vin, nhng n khng thuc mt lp no. Vic khai bo hm ton cc
s c thc hin nh sau
type operator@(A)
Trong , @ l k hiu ton t, A l tn lp.
V d Kt qu
#include<iostream>
using namespace std;
class Complex{
public:
float real;
float img;
Complex(float, float);
void toString(void);
};
Complex::Complex(float a, float b){
real = a;
img = b;
}
void Complex::toString(void){
cout<<real<<" + "<<img<<"*I"<<endl;
}
Complex operator -(const Complex &a, const Complex
&b){
return Complex(a.real - b.real, a.img - b.img);
}
int main(){
4 + 1*I
Chng 13. Lp trnh hng i tng
T r a n g | 150
C
+
+
Complex a(3, 2);
Complex b(-1, 1);
(a-b).toString();
return 0;
}
Gii thch: trong v d ny, hm ton t - khng phi l hm thnh vin ca
lp Complex. Do , mun truy cp n cc thuc tnh ca n, ta phi quy
nh cc thuc tnh ny l public hoc phi to thm cc phng thc getter
thu thp d liu hoc quy nh n l hm bn. Cng v n khng phi l
hm thnh vin ca lp Complex, nn s tham s trong php ton mt ngi
l 1, trong php ton hai ngi l 2.
i vi chng cht ton t nhp xut - IO overloading, chng ta c mt
s ch :
+ Nu khai bo hm ton t l mt thnh vin ca lp.
V d Kt qu
#include <iostream>
using namespace std;
class Vector2D{
private:
int x, y;
public:
Vector2D(){
x = 0;
y = 0;
}
Vector2D(int x1, int y1){
x = x1;
y = y1;
}
ostream& operator<<(ostream& os){
os<<"("<<x<<", "<< y<<")";
return os;
}
};
int main()
{
(4, 5)
Chng 13. Lp trnh hng i tng
T r a n g | 151
C
+
+
Vector2D ab(4, 5);
//ab.operator<<(cout);
ab<<(cout);
return 0;
}
Gii thch: hm ton t << s thc thi vic in gi tr ca i tng ni ti (v
n l thnh vin ca lp Vector2D). N l ton t n hng, do , trong
hm ton t khng c mt tham s Vector2D. i vi cch s dng ny, ta
ch c th gi n trong hm main bng mt trong hai cch sau:
ab.operator<<(cout) hoc ab<<(cout). C hai cch gi ny u khng trng
khp vi ton t xut (hay ton t chn d liu). Thng thng, ta s xut
d liu theo chun cout<<d_liu. thc hin iu ny, ta cn s dng
cch hai.
+ Nu khai bo hm ton t khng phi l thnh vin ca lp.
V d Kt qu
#include <iostream>
using namespace std;
class Vector2D{
private:
int x, y;
public:
Vector2D(){
x = 0;
y = 0;
}
Vector2D(int x1, int y1){
x = x1;
y = y1;
}
friend ostream& operator<<(ostream&, const Vector2D&);
};
ostream& operator<<(ostream& os, const Vector2D& v){
os<<"("<<v.x<<", "<<v.y<<")";
return os;
}
(4, 5)
Chng 13. Lp trnh hng i tng
T r a n g | 152
C
+
+
int main()
{
Vector2D ab(4, 5);
cout<<ab;
return 0;
}
Gii thch: trong v d ny, hm ton t l mt hm bn ca lp Vector2D.
N cha tham s Vector2D bi n khng phi l thnh vin ca lp ni ti.
Khi in gi tr, n s in gi tr ca Vector2D ny.
Khi s dng ton t nhp d liu >> (hay ton t trch tch d liu), ta khai
bo hon ton tng t. Kiu d liu tr v lc ny l istream& thay v s
dng ostream& nh trn. Chng ta tin hnh nhp d liu cho nn tham s
Vector2D trong hm cng cn thay i chng ta cn b i t kha const
bi l ta ang tin hnh nhp d liu cho n nn khng th quy nh truyn
gi tr theo tham chiu hng (tc khng cho php thay i gi tr).
V d Kt qu
#include <iostream>
using namespace std;
class Vector2D{
private:
int x, y;
public:
Vector2D(){
this->x = 0;
this->y = 0;
}
Vector2D(int x, int y){
this->x = x;
this->y = y;
}
friend istream& operator>>(istream&, Vector2D&);
};
istream& operator>>(istream& is, Vector2D& v){
is>>v.x>>v.y;
return is;
}
(4, 5)
Chng 13. Lp trnh hng i tng
T r a n g | 153
C
+
+
int main()
{
Vector2D ab;
cin>>ab;
return 0;
}
Cc kiu d liu ostream& v istream& nm trong th vin iostream ca
namespace std (du & quy nh l truyn theo tham chiu hoc phng
thc tham chiu).
Tnh k tha - Inheritance
Mt tnh nng theng cht ca lp trnh hng i tng l tnh k
tha. Nh vo tnh k tha, n cho php mt lp c th dn xut t mt lp
khc, chnh v th chng s t ng tip nhn cc thnh vin ca b m v
b sung thm cc thnh vin ca ring chng. Tnh k tha cho php lp
mi c th nhn c mi d liu thnh vin (private, protected, public) v
cc hm thnh vin (tr hm to, hm hy, hm bn v hm ton t gn =).
Ta c th xt v d v lp ng vt Animal v minh ha tnh k tha
bng lc bn di (Hnh 13).
Lp ng vt Animal c cc thuc tnh thnh vin: tn gi, cn nng. Cc
hm thnh vin: di chuyn, n. Ta xt hai lp dn xut ca n l lp mo Cat
v lp c Fish. Lp Cat c cc thuc tnh thnh vin ring: mu lng, mu
mt. Cc hm thnh vin ring: Bt chut, Leo cy. Lp Fish c cc thuc
tnh thnh vin ring: kiu vy, loi nc (nc ngt, nc mn, nc l).
Cc hm thnh vin: bi, sinh sn (cch thc sinh con nh th no).
Hnh 21 Tnh k tha
Chng 13. Lp trnh hng i tng
T r a n g | 154
C
+
+
Theo nh tnh tha k, lp Cat v Fish khng nhng c nhng thuc
tnh thnh vin v hm thnh vin ring ca tng lp, m n cn c nhng
thuc tnh thnh vin v hm thnh vin ca lp Animal.
T nay, ta s gi lp dn xut Cat v Fish l cc lp con v lp c
dn xut Animal l lp c s (hay lp cha). Ta cn lu rng, tn gi cng
mang tnh tng i, v mt lp c th l con ca lp ny, nhng li l lp
c s ca lp khc. Do , trnh nhm ln, trong nhng trng hp cn
phn bit, ta s gi c th l lp con ca lp no, hay lp c s ca lp no.
quy nh mt lp l dn xut t lp khc, ta s dng ton t : theo
cu trc sau
class Animal{
};
class Cat: T_kha_mc_truy _cp Animal{
};
class Fish: T_kha_mc_truy _cp Animal{
};
Theo cu trc khai bo ny, th Cat v Fish l lp con ca lp c s Animal.
V d Kt qu
#include <iostream>
using namespace std;
class Animal{
protected:
string name;
int weight;
public:
Animal(void);
Animal(string, int);
void move(void);
void eat(void);
};
class Cat:public Animal{
private:
-----Animal Object-----
I can eat
I can move
-----Cat Object-----
I can eat
I can move
I can catch mouse
I can climb tree
Chng 13. Lp trnh hng i tng
T r a n g | 155
C
+
+
string colorf;
string colore;
public:
Cat(string, int, string, string);
void catchmouse(void);
void climb(void);
};
void Animal::move(void){
cout<<"I can move"<<endl;
}
void Animal::eat(void){
cout<<"I can eat"<<endl;
}
Animal::Animal(){
this->name = "";
this->weight = 0;
}
Animal::Animal(string name, int weight){
this->name = name;
this->weight = weight;
}
void Cat::catchmouse(void){
cout<<"I can catch mouse"<<endl;
}
void Cat::climb(void){
cout<<"I can climb tree"<<endl;
}
Cat::Cat(string name, int weight, string colorfc,
string colorec){
this->name = name;
this->weight = weight;
this->colorf = colorf;
this->colore = colore;
}
int main()
{
Chng 13. Lp trnh hng i tng
T r a n g | 156
C
+
+
Animal an("Gau", 100);
Cat ca("Cat1", 3, "black", "blue");
cout<<"-----Animal Object-----"<<endl;
an.eat();
an.move();
cout<<"-----Cat Object-----"<<endl;
ca.eat();
ca.move();
ca.catchmouse();
ca.climb();
return 0;
}
Gii thch: trong chng trnh ny lp Cat tha k t lp Animal. N s k
tha mi d liu thnh vin v hm thnh vin ca lp Animal. hm to
ca lp Cat c th truy cp n cc d liu thnh vin ca lp Animal, th
cc d liu thnh vin ny phi c khai bo mc truy cp l protected
hoc public. i tng ca ca lp Cat ch c th truy cp n cc phng
thc thnh vin ca lp c s l Animal khi lp Animal ny c public
(Cat:public Animal). Mt iu cn lu na l hm to. Khi tha k, th
lp con s khng tha k hm to t lp c s, nhng lp c s cn c mt
hm to mc nh khng i s (hm to ny lun tn ti; nu ta khai bo
thm mt vi hm to, th cn khai bo mt hm to khng c i s).
Cc mc truy cp
Mc cho php truy cp n cc d liu thnh vin t mt lp c cho
trong bng sau
Phm vi public protected private
Thnh vin ca cng mt lp c php c php c php
Thnh vin ca lp dn xut c php c php khng c php
Cn li c php khng c php khng c php
Chng ta cn lu rng trong cch vit v tnh k tha Cat:public Animal c
mt s quy tc chuyn i. Nu cc thnh vin ca lp c s c mc truy
cp l A, khi tha k ta quy nh mc truy cp ca lp con i vi lp c s
l B (A v B c th l private < protected < public) v gi s rng A<B, th
Chng 13. Lp trnh hng i tng
T r a n g | 157
C
+
+
cc thnh vin ny ca lp cha s tr thnh cc thnh vin ca lp con c
mc truy cp l mc truy cp b nht A.
Nh ti gii thiu trn, mt bin thnh vin c ch nh t kha ch
mc truy cp l private th ch c cc phng thc trong cng mt lp hoc
cc phng thc bn mi c quyn truy cp (bao gm hm bn v lp bn).
Nu mc truy cp l public, th mi phng thc u c quyn truy cp
n. Chng ta s tm hiu k hn v t kha protected. Ti trnh by v
cc kh nng m mt phng thc c th truy cp n mt bin thnh vin
c khai bo l protected:
- Tng t nh cc mc truy cp ca private (chnh n v bn ca n).
- T cc phng thc ca mt lp dn xut.
- T cc phng thc bn ca lp dn xut (bao gm hm bn v lp bn).
i vi trng hp u tin, chng ta tm hiu n trong phn hm bn
v lp bn. Chng ta s kho st hai kh nng sau cng. i vi kh nng
th hai, hy quan st v d sau y:
V d Kt qu
#include <iostream>
using namespace std;
class Polygon{
protected:
int w, h;
public:
void SetValue(int w, int h){
this->w = w;
this->h = h;
}
};
class Rectangle:public Polygon{
public:
int GetArea(){
return w*h;
}
};
int main()
{
20
Chng 13. Lp trnh hng i tng
T r a n g | 158
C
+
+
Rectangle rec;
rec.SetValue(4, 5);
cout<<rec.GetArea();
return 0;
}
Gii thch: bn lu trong phng thc GetArea ca i tng Rectangle.
N s dng cc bin thnh vin c tha k t lp Polygon. Nhng bin
thnh vin ny c khai bo l protected, do , n c quyn truy cp n.
Trong trng hp, bn ca mt lp dn xut, ta c th quan st v d minh
ha sau y:
V d Kt qu
#include <iostream>
using namespace std;
class Polygon{
protected:
int w, h;
public:
void SetValue(int w, int h){
this->w = w;
this->h = h;
}
};
class Rectangle:public Polygon{
public:
int GetArea(){
return w*h;
}
friend void ShowWH(Rectangle);
};
void ShowWH(Rectangle p){
cout<<p.w<<"x"<<p.h;
}
int main()
{
Rectangle rec;
rec.SetValue(4, 5);
ShowWH(rec);
return 0;
}
4x5
Chng 13. Lp trnh hng i tng
T r a n g | 159
C
+
+
Gii thch: trong trng hp ny, phng thc ShowWH l bn ca lp dn
xut Rectangle, n c quyn truy cp n cc bin thnh vin c ch nh
protected.
Tnh a k tha Multiple Inheritance
Trong ngn ng lp trnh hng i tng, tnh k tha chia lm hai loi:
ngn ng n tha k v ngn ng a tha k.
Tnh n tha k: l tnh cht cho php mt lp ch c th k tha t
mt lp c s duy nht. Nu mun s dng tnh nng a tha k trong
ngn ng lp trnh loi ny, ta c th cn phi s dng n khi nim
giao din interface. Ngn ng n tha k tiu biu gm: Java, C#,
Delphi.
Tnh a tha k: l tnh cht cho php mt lp c th k tha t nhiu
lp c s. Ngn ng a tha k tiu biu gm: C++.
Khai bo tnh a k tha trong C++ tun theo c php sau
class A: TKMTC1 B, TKMTC2 C, TKMTC3 D,;
Trong ,
+ TKMTC1, TKMTC2, TKMTC3 l cc t kha ch mc truy cp. Chng c th
l public, protected hoc private.
+ Lp A gi l lp con; lp B, C, D gi l cc lp c s.
V d Kt qu
#include <iostream>
using namespace std;
class A{
int a;
public:
void showA(void);
};
class B{
int b;
public:
void showB(void);
};
Im A
Im B
Im C
Chng 13. Lp trnh hng i tng
T r a n g | 160
C
+
+
class C: public A, public B{
int c;
public:
void showC(void);
};
void A::showA(void){
cout<<"I'm A"<<endl;
}
void B::showB(void){
cout<<"I'm B"<<endl;
}
void C::showC(void){
cout<<"I'm C"<<endl;
}
int main()
{
C c;
c.showA();
c.showB();
c.showC();
return 0;
}
Gii thch: trong v d ny, lp C k tha t lp A v lp B. Khi ta khai bo c
l i tng ca lp C, do tnh k tha nn i tng c cha khng ch
thnh vin ca lp c, m cn c cc thnh vin ca lp A v B.
Tnh a hnh Polymorphism
Con tr tr vo lp c s
Mt trong nhng tnh nng theng cht ca lp dn xut l con tr tr
vo lp dn xut s tng thch kiu vi mt con tr ca lp c s.
chnh l s th hin ca tnh a hnh (cng mt lp c s, nhng mi con
tr ca lp dn xut c cc hnh thi th hin khc nhau). Tnh a hnh ny
mang li cho k thut lp trnh hng i tng thm nhng u im trong
vic to dng nhng tnh nng n gin nhng hu dng v linh hot.
Chng ta s bt u vit chng trnh v hnh ch nht v tam gic.
Lp ch nht v tam gic k tha t lp a gic v chng c nhng phng
Chng 13. Lp trnh hng i tng
T r a n g | 161
C
+
+
thc thnh vin ring. Phng thc thnh vin ny cng ni dung, nhng
li c cch th hin khc nhau (cng tnh din tch, nhng din tch hnh
ch nht v hnh tam gic c cng thc tnh khc nhau).
V d Kt qu
#include <iostream>
using namespace std;
class Polygon{
protected:
int w, h;
public:
void setValue(int w, int h){
this->w = w;
this->h = h;
}
};
class Rectangle:public Polygon{
public:
int area(){
return w*h;
}
};
class Triangle:public Polygon{
public:
int area(){
return w*h/2;
}
};
int main()
{
Rectangle rec;
Triangle tri;
Polygon *pol1 = &rec;
Polygon *pol2 = &tri;
pol1->setValue(4, 5);
pol2->setValue(4, 5);
Area of Rectangle: 20
Area of Triangle: 10
Chng 13. Lp trnh hng i tng
T r a n g | 162
C
+
+
cout<<"Area of Rectangle: "<<rec.area()<<endl;
cout<<"Area of Triangle: "<<tri.area()<<endl;
return 0;
}
Trong hm main, chng ta to ra hai con tr i tng ca lp
Polygon l pol1 v pol2. Chng ta truy cp tham chiu cho rec v tri n hai
con tr ny, v chng l hai i tng ca lp dn xut t Polygon, nn
php gn trong trng hp ny l hp l.
Ch c mt gii hn l vic s dng *pol1 v *pol2 thay th cho rec v
tri l khng th (ta khng th s dng phng thc pol1->area() hay pol2-
>area()). Bi v phng thc area() khng phi l mt thnh vin ca
Polygon. gii quyt vn ny, chng ta s s dng phng thc thnh
vin o.
Nh chng ta thy trong v d ny, hai i tng tri v rec l hai i
tng khc nhau tha k t polygon. Nhng chng c cng phng thc
area tnh din tch. Tuy nhin, cch tnh din tch ca hnh ch nht v
hnh tam gic l hon ton khc nhau.
Tnh a hnh. L tnh cht th hin nhiu hnh thi ca i tng.
Cc i tng khc nhau c th c cng phng thc thc thi mt hnh
ng. Nhng mi i tng li thc thi hnh ng theo cch ring ca
mnh, m khng ging nhau cho tt c cc i tng.
Thnh vin o
quy nh mt phng thc l o, chng ta s dng t kha
virtual. Nh vo phng thc o, ta c th nh ngha li mt phng thc
thnh vin ca lp c s bn trong lp dn xut.
V d Kt qu
#include <iostream>
using namespace std;
class Polygon{
protected:
int w, h;
public:
void setValue(int w, int h){
Area of Rectangle: 20
Area of Triangle: 10
Area of Polygon: 0
Chng 13. Lp trnh hng i tng
T r a n g | 163
C
+
+
this->w = w;
this->h = h;
}
virtual int area(){
return (0);
};
};
class Rectangle:public Polygon{
public:
int area(){
return w*h;
}
};
class Triangle:public Polygon{
public:
int area(){
return w*h/2;
}
};
int main()
{
Rectangle rec;
Triangle tri;
Polygon pol;
Polygon *pol1 = &rec;
Polygon *pol2 = &tri;
Polygon *pol3 = &pol;
pol1->setValue(4, 5);
pol2->setValue(4, 5);
pol3->setValue(4, 5);
cout<<"Area of Rectangle: "<<pol1-
>area()<<endl;
cout<<"Area of Triangle: "<<pol2-
>area()<<endl;
cout<<"Area of Polygon: "<<pol3-
>area()<<endl;
Chng 13. Lp trnh hng i tng
T r a n g | 164
C
+
+
return 0;
}
Nu g b t kha virtual th kt qu s l 0, 0 v 0. S d l v trong trng
hp ny area() l phng thc thnh vin ca lp Polygon. D phng
thc ny b qu ti trong cc lp thnh vin, nhng cc i tng *pol1,
*pol2, *pol3 l cc i tng ca lp Polygon, nn khi gi phng thc
area() l gi n phng thc area() ca Polygon.
Nh vy, vi t kha virtual, cc phng thc ca cc lp dn xut c th
thc hin cc phng thc thnh vin ring m phng thc thnh vin
c th trng tn vi phng thc thnh vin ca lp c s.
Ta cn lu rng, mt s ngn ng quy nh virtual l mc nh cho cc
phng thc thnh vin (nu khng khai bo t kha ny) nh Java, C#.
Nhng ngn ng lp trnh C++ th khng nh vy. Trong C++, t kha
virtual l khng mc nh cho cc phng thc thnh vin.
T kha virtual cn c thm mt ng dng trong nh ngha lp c s o.
Chng ta xt v d sau
Hnh 22 Lp c s o
Chng 13. Lp trnh hng i tng
T r a n g | 165
C
+
+
Trong cy tha k ny, ta thy rng lp F tha k t lp D v E. Lp D tha
k t lp A v B; lp E tha k t lp A v C. iu c ngha l lp F tha
k lp A 2 ln. Khi ta mun truy cp n thuc tnh a (tha k t lp D v E)
th trnh bin dch khng nhn bit c ta mun truy cp n gi tr a ca
lp no.
V d Kt qu
#include<iostream>
using namespace std;
class A
{
public:
int a;
};
class B
{
public:
int b;
};
class C
{
public:
int c;
};
class D:public A, public B
{
public:
int d;
};
class E:public A, public C
error C2385:
ambiguous access of 'a'
Chng 13. Lp trnh hng i tng
T r a n g | 166
C
+
+
{
public:
int e;
};
class F:public D, public E
{
public:
int f;
};
int main()
{
F f;
f.a = 1;//Li
return 0;
}
Trnh bin dch s thng bo li error C2385: ambiguous access of 'a'.
khc phc nhc im ny, ta s dng lp c s o. Khng c nhiu s
khc bit trong trng hp ny. n thun ch b sung t kha virtual vo
trc cc mc tha k ca lp D v E (bi hai lp ny u tha k t lp A
v c tha k bi lp F, l nguyn nhn gy nn li tha k lp A
nhiu ln).
V d Kt qu
#include<iostream>
using namespace std;
class A
{
public:
int a;
};
class B
Khng li
Chng 13. Lp trnh hng i tng
T r a n g | 167
C
+
+
{
public:
int b;
};
class C
{
public:
int c;
};
class D:virtual public A, public B
{
public:
int d;
};
class E:virtual public A, public C
{
public:
int e;
};
class F:public D, public E
{
public:
int f;
};
int main()
{
F f;
f.a = 1;
return 0;
}
Chng 13. Lp trnh hng i tng
T r a n g | 168
C
+
+
Thm mt khi nim m ta cn quan tm qu ti hm. Chng ta cn lu ,
khi nim chng cht hm thnh vin khc vi khi nim qu ti hm thnh
vin (i lc gi l ghi hm thnh vin). Chng cht hm thnh vin
(overload) l vic quy nh nhiu hm cng tn nhng khc tham s, cc
hm ny l thnh vin ca cng mt lp ni ti hoc cc hm ton cc.
Trong khi , qu ti hm thnh vin (override) l cc hm c cu trc
ging nhau nhng thuc hai lp khc nhau v mt trong s chng tha k
t lp cn li, khi , ta ni rng phng thc ca lp cha b phng
thc ca lp con qu ti.
Lp c s tru tng
Lp c s tru tng (abstract base class) c nhiu nt tng ng vi lp
Polygon ca v d trn. Ch c s khc bit l phng thc area() ca lp
Polygon khng thc hin hon ton chc nng ca mt hm m n thun
ta s khai bo virtual int area() = 0;. Ngha l ta ch b sung vo gi tr 0
sau ton t gn. Vi s khai bo dng ny, ngi ta gi l phng thc o
thun ty (pure virtual function). Mt lp c gi l lp c s tru tng,
khi n cha t nht mt phng thc thnh vin o thun ty.
S khc bit cn bn gia lp c s tru tng v lp a hnh l lp c s
tru tng khng th to ra mt s th hin cho n. Ngha l ta khng th
vit Polygon pol; nh trong v d trn. Ta ch c th s dng mt con tr,
tr n n v s dng cc tnh nng a hnh ca n m thi.
V d Kt qu
#include <iostream>
using namespace std;
class Polygon{
protected:
int w, h;
public:
void setValue(int w, int h){
this->w = w;
this->h = h;
}
virtual int area() = 0;
};
Area of Rectangle: 20
Area of Triangle: 10
Chng 13. Lp trnh hng i tng
T r a n g | 169
C
+
+
class Rectangle:public Polygon{
public:
int area(){
return w*h;
}
};
class Triangle:public Polygon{
public:
int area(){
return w*h/2;
}
};
int main()
{
Rectangle rec;
Triangle tri;
/* Polygon pol; Pht sinh li v Polygon l mt
lp tru tng, ta khng th to mt th hin cho
lp tru tng */
Polygon *pol1 = &rec;
Polygon *pol2 = &tri;
pol1->setValue(4, 5);
pol2->setValue(4, 5);
cout<<"Area of Rectangle: "<<pol1-
>area()<<endl;
cout<<"Area of Triangle: "<<pol2-
>area()<<endl;
return 0;
}
Trong v d trn, ta s dng mt phng thc o thun ty n gin. Khi
khai bo mt phng thc o thun ty, ta cn ch :
Tham s ca n nu rng th ta quy nh l void. Nu n l mt kiu
tham chiu (nh cc i tng ca lp) th ta nn quy nh l con tr
void* v sau ny, khi cn s dng n n, ta c th chuyn i con tr
void sang con tr i tng.
Gi tr tr v trong phng thc o thun ty NN quy nh l 0.
Chng 13. Lp trnh hng i tng
T r a n g | 170
C
+
+
V d sau y s cho ta thy cch s dng lp tru tng trong trng hp
tham s bn trong phng thc o thun ty l mt i tng. Ta c mt
lp tru tng Point (lp im) v hai lp Point2D v Point3D tha k
tha Point. Lp Point l mt lp tru tng cha phng thc o thun
ty l KhoangCach. Cc lp Point2D v Point3D s qu ti phng thc o
thun ty ny.
V d Kt qu
#include <iostream>
#include <math.h>
using namespace std;
class Point
{
protected:
float x, y;
public:
float& getX(void);
float& getY(void);
virtual float KhoangCach(void*)=0;
};
float& Point::getX(void)
{
return x;
}
float& Point::getY(void)
{
return y;
}
class Point2D:public Point
{
public:
float KhoangCach(void*);
};
class Point3D:public Point
{
.::-----Nhap toa do cho
hai Point2D u va v-----
::.
+ Toa do u:
1
1
+ Toa do v:
1
2
D(u,v) = 1
.::-----Nhap toa do cho
hai Point3D u va v-----
::.
+ Toa do u:
1
1
1
+ Toa do v:
1
1
2
D(u3,v3) = 1
Chng 13. Lp trnh hng i tng
T r a n g | 171
C
+
+
float z;
public:
float& getZ(void);
float KhoangCach(void*);
};
float Point2D::KhoangCach(void* p)
{
Point2D* q = (Point2D*)(p);
return sqrt(pow(q->x-x,2)+pow(q->y-y,2));
}
float& Point3D::getZ(void)
{
return z;
}
float Point3D::KhoangCach(void* p)
{
Point3D* q = (Point3D*)(p);
return sqrt(pow(q->x-x,2)+pow(q->y-
y,2)+pow(q->z-z,2));
}
int main()
{
Point2D v2;
Point2D u2;
cout<<".::-----Nhap toa do cho hai Point2D u
va v-----::."<<endl;
cout<<"+ Toa do u:"<<endl;
cin>>v2.getX();
cin>>v2.getY();
cout<<"+ Toa do v:"<<endl;
cin>>u2.getX();
cin>>u2.getY();
Point* u = &v2;
Point* v = &u2;
cout<<"D(u,v) = "<<u->KhoangCach(v);
Point3D v3;
Point3D u3;
cout<<endl<<".::-----Nhap toa do cho hai
Chng 13. Lp trnh hng i tng
T r a n g | 172
C
+
+
Point3D u va v-----::."<<endl;
cout<<"+ Toa do u:"<<endl;
cin>>v3.getX();
cin>>v3.getY();
cin>>v3.getZ();
cout<<"+ Toa do v:"<<endl;
cin>>u3.getX();
cin>>u3.getY();
cin>>u3.getZ();
Point* p = &v3;
Point* q = &u3;
cout<<"D(u3,v3) = "<<p->KhoangCach(q);
cout<<endl;
return 0;
}
Gii thch: chng ta cn ch rng, nu khai bo mt lp tru tng (cha
phng thc o thun ty) th lp tha k t n nn c mt phng thc
c khai bo hon ton trng khp vi phng thc o thun ty ny (v
tn gi, danh sch tham s; ch tr php gn = 0 v t kha virtual s khng
xut hin trong phng thc qu ti ca lp con). Nu ta khai bo khng
trng khp, th lp con s c phng thc o thun ty ny, v hin nhin
n cng s l lp tru tng.
Trong v d ny, khong cch c th l gia hai im Point2D hoc hai im
Point3D. Do , trong lp tru tng, ta s s dng void*. Trong lp con, ta
s chuyn i t void* sang Point2D* hoc Point3D* ty thuc vo lp
Point2D hay Point3D.
Tnh tru tng ha - Abstraction
Tnh tru tng ha l tnh cht ch tp trung vo nhng phn ct li ca
i tng, b qua nhng tiu tit khng cn thit. N cn th hin lp
tru tng c s: lp tru tng c s cha cc c tnh chung, tng qut
cho mt nhm i tng. Khi , nhm i tng s tha k t lp tru
tng ny nhn cc thuc tnh chung, ng thi b sung thm tnh nng
mi.
Khi phn tch mt nhm i tng, ta thng tm ra cc im chung v c
trng cho cc i tng, ri t xy dng nn mt lp tru tng c s
cha cc phng thc tc ng n cc cc c trng chung . Mi mt
i tng trong nhm i tng trn khi tha k t lp tru tng c s
Chng 13. Lp trnh hng i tng
T r a n g | 173
C
+
+
s c phng thc c trng cho nhm i tng ny. Tnh tru tng
cng l mt c trng ca ngn ng lp trnh hng i tng.
Hm mu Template Function
Trong nhiu trng hp chng ta cn xy dng hm m kiu d liu
ca cc tham s v kiu d liu ca hm tr v l khng tng minh (c
ngha l chng c dng tng qut, c th l s nguyn, s nguyn di, xu).
Khi , gii quyt vn ny, chng ta c th s dng qu ti hm nh
trn, con tr hm v thm mt cch thc na, l hm mu template
function. khai bo kiu d liu khng tng minh ny, chng ta c th
khai bo nh sau:
template <class T>
V d sau y minh ha vic s dng hm mu template function.
V d Kt qu
#include <iostream>
using namespace std;
template <class T>
T add(T a, T b)
{
return a+b;
}
int main()
{
cout<<add<int>(1, 2)<<endl;
cout<<add<string>(ab, cd)<<endl;
}
3
abcd
Gii thch: khai bo hm mu template function c dng to mt kiu
d liu khng tng minh. Vic xy dng hm add vi kiu d liu tr v l
kiu T v cc tham s ca n cng l kiu T. Do , hm add ny c th s
dng di dng tng qut, dng cng s, cng xu quy nh l cng
s, ta c th quy nh ngay sau tn hm: tn_hm<kiu_d_liu>. Nh vy,
trong v d trn, i tng cout th nht in ra gi tr tng ca hai s nguyn
1 v 2. i tng cout th hai in ra gi tr ghp ni ca hai xu ab v cd.
Lp mu Template class
Tng t hm template, ta cng c khai bo lp template.
template <class T>
Chng 13. Lp trnh hng i tng
T r a n g | 174
C
+
+
class mypair{
T values[2];
public:
mypair(T first, T second)
{
values[0]=first;
values[1]=second;
}
};
int main()
{
mypair<int>x(2, 3);
mypair<float>f(2.3, 3.3);
return 0;
}
Ta c th s hm to vi tham s first v second thuc loi T bng cc tham
s c th c n nh. V d mypair<int> x(1, 2) s s dng hm to ca
lp mypair to i tng cha hai thuc tnh l 1 v 2 thuc s nguyn.
Tng t cho trng hp mypair<float>f(2.3, 3.3).
Khi cn s dng nhiu kiu d liu khng tng minh, ta c th b sung
thm trong khai bo template:
template<class T, class U, class V,>
V khi triu gi phng thc, ta ch n thun ch ch danh kiu d liu
tng ng:
myclass<kiu_d_liu_1, kiu_d_liu_2, kiu_d_liu_3,..> i_tng;
Lp template c s dng rng ri trong lp trnh C++ bi c nhiu lp c
chung cc phng thc v d liu nhng chng ch khc nhau kiu d liu
cho cc bin thnh vin. V d nh trong lp s phc: cc d liu thnh vin
l phn thc v phn o c th l s nguyn, s thc. V d sau y s xy
dng lp s phc theo hng tip cn template class.
V d Kt qu
#include <iostream>
using namespace std;
template <class T>
real=1
image=2
real=3
image=4
4+I*6
Chng 13. Lp trnh hng i tng
T r a n g | 175
C
+
+
class complex{
private:
T real;
T imag;
public:
complex(void);
complex(T, T);
complex(const complex<T>&);
complex operator+(const complex<T>&);
template <class T, class charT, class traits> friend
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>&, const
complex<T>&);
template <class T, class charT, class traits> friend
basic_istream<charT, traits>& operator>>(basic_istream<charT,
traits>&, complex<T>&);
};
template <class T>
complex<T>::complex(void)
{
real = 0;
imag = 0;
}
template <class T>
complex<T>::complex(T real, T imag)
{
this->real = real;
this->imag = imag;
}
template <class T>
complex<T>::complex(const complex<T>& c)
{
this->real = c.real;
this->imag = c.imag;
}
template <class T>
complex<T> complex<T>::operator+(const complex<T>& c)
{
Chng 13. Lp trnh hng i tng
T r a n g | 176
C
+
+
return complex(real+c.real, imag+c.imag);
}
template <class T, class charT, class traits>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const
complex<T>& c)
{
os<<c.real<<"+I*"<<c.imag;
return os;
}
template <class T, class charT, class traits>
basic_istream<charT, traits>& operator>>(basic_istream<charT,
traits>& is, complex<T>& c)
{
cout<<"real=";
is>>c.real;
cout<<"image=";
is>>c.imag;
return is;
}
int main () {
complex<int> c;
complex<int> d;
cin>>c>>d;
complex<int> x = c + d;
cout<<x;
return 0;
}
Gii thch: trong v d ny, khng c nhiu s khc bit so vi lp s phc
thng thng. Chng ta ch n thun b sung khai bo template<class T>
vo bn trc khai bo lp v khai bo phng thc c s dng kiu d
liu dng chung T. Ring i vi phng thc nhp xut d liu, cn lu :
ta khng th s dng kiu d liu thng thng l ostream& v istream&,
m thay vo l basic_ostream<?, ?> v basic_istream<?,?>. y cng l
hai lp template vi hai i s. iu ny gii thch ti sao trc cc ton t
nhp/xut li b sung thm khai bo template<class T, class charT, class
traits>. Chng ta cng cn ch thm mt im, tt c cc t complex trong
v d trn c phn thnh hai nhm: nhm kiu d liu complex v nhm
Chng 13. Lp trnh hng i tng
T r a n g | 177
C
+
+
tn hm complex. Tn hm to complex ta khng b sung kiu d liu ch
nh T ch n thun l complex. i vi cc t complex cn li, nht thit
phi ch nh kiu d liu T complex<T>. nh ngha class template ch c
phm vi tc dng trong lp hoc hm c ch nh ngay sau n. N khng
phi l mt khai bo c th dng chung. iu ny gii thch v sao ta li s
dng qu nhiu khai bo class template nh trn.
Tng kt v lp trnh hng i tng
C s ca lp trnh hng i tng l cc i tng v lp. i tng
l mt thc th trong th gii thc. Lp m t i tng bng ngn ng lp
trnh. Ngc li, mt i tng l mt s th hin (instance) ca lp.
Ngn ng lp trnh hng i tng c 4 c trng c bn:
- Tnh tru tng ha d liu (abstraction): l kha cnh m cc ngn
ng khng quan tm n nhng tiu tit ca i tng. N ch tp trung
vo nhng th ct li ca i tng. Tnh tru tng cn th hin khi
nim lp tru tng c s.
- Tnh ng gi (encapsulation) hay tnh ng gi v che du thng tin
(encapsulation and information hiding): l tnh cht ch mc chia s
thng tin. Mt i tng khc khng c quyn truy cp v lm thay i
thng tin ca i tng ni ti, ch c i tng ni ti mi quyt nh c
nn thay i thng tin ca mnh hay khng.
- Tnh a hnh (polymorphism): l nhiu hnh thi. Cc i tng khc
nhau c th c cng phng thc thc thi hnh ng, nhng cch thc thc
thi hnh ng c th khc nhau.
- Tnh tha k (hay k tha - inheritance): l tnh cht cho php cc i
tng tip nhn d liu t mt i tng khc m n tha k. Nh vo tnh
tha k, cc i tng c th s dng cc tnh nng ca i tng khc.
Tnh tha k chia lm hai loi: n tha k v a tha k. n tha k l
tnh cht ch cho php mt lp tha k t mt lp c s; cn tnh a tha
k cho php mt lp k tha t nhiu lp c s. C++ l ngn ng lp trnh
h tr a tha k.
Chng 14. Namespace
Trang | 178
CHNG 14. NAMESPACE
T kha namespace
Nh vo namespace, ta c th nhm cc thc th nh lp, i tng v cc
hm di mt tn gi tng ng vi t kha namespace. Theo cch ny,
cc phm vi ton cc li c chia nh ra thnh cc phm vi ton cc con,
m mi mt phm vi ton cc con ny c mt tn gi ring.
khai bo namespace, ta s dng t kha namespace theo c php sau
namespace tn_ca_namespace
{
cc_thc_th
}
truy cp n cc thc th ca namespace, ta s dng ton t phm vi ::
V d Kt qu
#include <iostream>
using namespace std;
namespace first
{
int var = 5;
}
namespace second
{
double var = 3.14;
}
int main()
{
cout<<first::var<<endl;
cout<<second::var<<endl;
return 0;
}
5
3.14
Nh ta thy, trong v d ny c hai bin ton cc l var (lu , hai bin var
ny u l bin ton cc v phm vi hot ng ca n l ton b chng
trnh). D l trng tn, nhng do chng thuc vo cc namespace khc
nhau, nn khai bo ny l hp l.
Chng 14. Namespace
T r a n g | 179
C
+
+
T kha using
T kha using c s dng a mt tn gi t namespace sang vng
khai bo hin ti. Khi s dng using namespace tn_namespace, chng ta
khng cn s dng tn_namespace khi gi n thc th ca n.
V d Kt qu
#include <iostream>
using namespace std;
namespace first
{
int x = 5;
int y = 5;
}
namespace second
{
double x = 1.60;
double y = 3.14;
}
int main()
{
using namespace first;
cout<<x <<endl;
cout<<y<<endl;
return 0;
}
5
5
Trong trng hp ny, khi s dng namespace first, chng ta c th s
dng cc bin trong namespace ca n m khng cn gi n tn ca
namespace. Nhng cng lu rng, nu using c hai namespace th trong
trng hp ny, ta khng th truy cp n cc bin x v y theo cch ny (v
chng trng tn), m ch c th truy cp theo cch s dng ton t phm vi
::
Ta cng c th s dng t kha using nh sau
V d Kt qu
#include <iostream>
using namespace std;
namespace first
{
int x = 5;
int y = 5;
5
3.14
Chng 14. Namespace
T r a n g | 180
C
+
+
}
namespace second
{
double x = 1.60;
double y = 3.14;
}
int main()
{
using first::x;
using second::y;
cout<<x <<endl;
cout<<y<<endl;
return 0;
}
Phm vi ca namespace
Mt namespace c khai bo s dng bng t kha using ch c tc dng
trong phm vi m n c khai bo. iu c ngha l nu ta using
namespace tn_namespace, th n ch c tc dng trong khi lnh m ta
khai bo.
V d Kt qu
#include <iostream>
using namespace std;
namespace first
{
int x = 5;
int y = 5;
}
namespace second
{
double x = 1.60;
double y = 3.14;
}
int main()
{
{
using namespace first;
cout<<x<<endl;
cout<<y<<endl;
}
{
5
5
1.6
3.14
Chng 14. Namespace
T r a n g | 181
C
+
+
using namespace second;
cout<<x<<endl;
cout<<y<<endl;
}
return 0;
}
Ti nh danh cho namespace
Nu mun khai bo mt tn mi cho namespace tn ti, hy s
dng c php
namespace tn_mi_ca_namespace = tn__khai_bo_ca_name_space;
Namespace std
Tt c cc tp trong th vin chun ca C++ u c khai bo nh l
thc th ca namespace std. iu gii thch ti sao khi vit mt chng
trnh trong C++ c s dng cc hm nhp xut c bn, cc kiu d liu nh
string th ta phi s dng khai bo using namespace std.
Chng 15. Ngoi l
Trang | 182
CHNG 15. NGOI L
Cc ngoi l l cch thc gip chng ta tc ng ngc tr li vi cc tnh
hung sinh ra ngoi l .
nm bt c ngoi l, chng ta s dng c php trycatch hoc throw.
Mnh trycatch
Nu vit mt chng trnh c kh nng ny sinh ngoi l, chng ta cn t
n vo trong khi lnh ca t kha try, nu ngoi l pht sinh, hnh ng
x l s c t trong khi lnh ca t kha catch.
V d Kt qu
#include <iostream>
using namespace std;
int main()
{
int a;
try{
throw 20;
}catch(int e){
cout<<e;
}
return 0;
}
20
Gii thch: Trong chng trnh ny, lnh throw ang c vt qua mt ngoi
l tng ng vi m 20, nhng ngoi l ny b nm bt bi cu lnh
trycatch. Do ngoi l pht sinh, nn lnh trong mnh catch c thc
thi.
Nu c nhiu ngoi l pht sinh, ta c th s dng cu trc a tng ca
mnh catch: try{}catch(){}catch(){}
Mnh throw
Khi khai bo mt hm, nu trong hm c kh nng pht sinh ngoi l,
chng ta c th ch nh t kha throw cho n
type tn_hm(danh_sch_tham_s) throw (int)
Chng 15. Ngoi l
T r a n g | 183
C
+
+
Nu ch c throw() ngha l khng ch nh loi d liu trong throw th
hm s cho php vt qua mi ngoi l. Nu hm khng c mnh throw
th s khng c php vt qua ngoi l.
Th vin chun exception
Th vin chun ca C++ cung cp cho chng ta mt th vin qun l cc
ngoi l l exception. N nm trong namespace std. Lp ny c mt hm
to mc nh, mt hm to sao chp, cc ton t, hm hy v mt hm
thnh vin o what(). Hm ny tr v con tr k t pht sinh ngoi l. N c
th c qu ti trong lp dn xut.
V d Kt qu
#include <iostream>
#include <exception>
using namespace std;
class myexception:public exception{
virtual const char* what() const throw(){
return Co ngoai le !;
}
};
int main(){
try{
myexception myex;
throw myex;
}catch(exception& e){
cout<<e.what();
}
return 0;
}
Co ngoai le !
Mi khi c ngoi l xy ra, mnh catch s c thc hin, v ngoi l s
c nm bt, kt qu in ra lun l cu thng bo Co ngoai le.
Khi ta xy dng mt ng dng c kh nng pht sinh ngoi l, ta cn quy
nh lp i tng c xy dng phi tha k t lp exception ny. iu
ny gip chng ta c th nm bt ngoi l v b qua chng bi trong mt s
trng hp cc ngoi l ny c th gy ra cc li khng mong mun cho ng
dng. V d sau y gip ng dng ca chng ta vt qua php chia cho 0
v tip tc thc thi chng trnh.
Chng 15. Ngoi l
T r a n g | 184
C
+
+
V d Kt qu
#include<iostream>
using namespace std;
class MyNumber:public exception
{
private:
float x, y;
public:
virtual const char* what() const throw()
{
return "Chia cho 0";
}
MyNumber(float, float);
float DivMe(void);
};
MyNumber::MyNumber(float x, float y)
{
this->x = x;
this->y = y;
}
float MyNumber::DivMe(void)
{
x/y;
}
int main()
{
MyNumber m(1, 0);
try
{
m.DivMe();
throw m;
}
catch(exception& e)
{
cout<<e.what();
}
Chia cho 0
Chng 15. Ngoi l
T r a n g | 185
C
+
+
return 0;
}
Gii thch: trong v d ny, lp khai bo c kh nng pht sinh ngoi l v
n thc hin php chia (ngoi l tng ng l chia cho 0). iu ny gii
thch v sao ta cn cho n tha k t lp exception. Mi khi gi tr nhp vo
cho bin thnh vin y l 0, th ngoi l Chia cho 0 s pht sinh. Khi ngoi l
pht sinh, ta s dng c php try bao bc quanh vng lnh pht sinh ra
ngoi l (c th l m.DivMe()). Khi ngoi l pht sinh, mnh catch s thc
thi v in ra li tng ng vi hm thnh vin what tc l Chia cho 0.
Chng 16. Lm vic vi file
Trang | 186
CHNG 16. LM VIC VI FILE
C++ cung cp cho ta cc lp sau y lm vic vi file
ofstream: lp ghi d liu ra file.
ifstream: lp c d liu t file.
fstream: lp c/ghi d liu t/ln file.
Cc lp ny l dn xut trc tip hoc gin tin t lp istream v ostream.
Chng ta s dng i tng cin l mt th hin ca lp istream v cout l
mt th hin ca lp ostream. Chng ta cng c th s dng cc i tng
ca lp ofstream, ifstream hoc fstream lm vic trc tip vi file. V d
sau y s cho thy iu ny
V d
#include <iostream>
#include <fstream>
using namespace std;
int main(){
ofstream myfile;
myfile.open(example.txt);
myfile.<<Ghi du lieu ra file;
myfile.close();
return 0;
}
V d ny ch n thun ghi cu Ghi du lieu ra file ln tp example.txt.
Chng ta s nghin cu tng bc khi lm vic vi cc i tng ca ba lp
m chng ta nu trn..
M file
m file trong chng trnh bng mt i tng stream, chng ta s
dng hm thnh vin open(tn_file, ch__m).
Trong ,
Chng 16. Lm vic vi file
T r a n g | 187
C
+
+
- tn_file: l tn ca file m chng ta cn m. Ta cn m bo cung cp
ng dn chnh xc n tp tin ny. Ta cng cn lu ng dn n tp
tin. ng dn c th l ng dn tuyt i hoc tng i. Nu cung cp
ng dn tng i, ta cn tun th nguyn tc nh khi lm vic vi tp
.cpp v .h nh ti trnh by trn.
- ch__m: l tham s ty chn, thng trong C++ n c th l cc c hiu
sau y:
C hiu Gii thch
ios::in M file c.
ios::out M file ghi.
ios::binary M file ch nh phn (thng p dng cho cc
file m ha).
ios::ate Thit lp v tr khi to ti v tr cui cng ca file.
Nu c hiu ny khng thit lp bt k gi tr no, v
tr khi to s t u file.
ios::app Mi d liu c ghi ra file s tin hnh b sung vo
cui file (khng ghi ln file). C hiu ny ch c th
s dng trong tc v m file ghi.
ios::trunc Nu mt file c m ghi tn ti, n s ghi
ln ni dung c.
Cc c hiu ny c th c kt hp bng cch s dng ton t dch bit OR
(|). V d, ti mun m mt file nh phn example.bin ghi d liu v b
sung d liu cui file ny, ti c th vit nh sau
ofstream myfile;
myfile.open(example.bin, ios::out|ios::app|ios::binary);
Thnh vin open ca cc lp ofstream, ifstream v fstream c tham s
ch__m mc nh (trong trng hp tham s ny khng c ch nh)
c a ra trong bng sau:
Lp ch__m mc nh
ofstream ios::out
ifstream ios::in
fstream ios::in|ios::out
Nu tham s c n nh mt gi tr c th, th tham s c s dng s
ghi ln tham s mc nh m khng phi l kt hp vi tham s mc
nh. V d, nu s dng ofstream m file vi tham s ch__m c
Chng 16. Lm vic vi file
T r a n g | 188
C
+
+
quy nh l ios::binary, th tham s m s l ios::binary m khng phi l
ios::out|ios::binary.
Nu s dng hm khi to cho cc lp ny, th phng thc thnh vin
open s t ng c triu gi. Ngha l ta c th vit
ofstream myfile(example.bin, ios::out|ios::app, ios::binary);
thay cho cch vit trn.
kim tra mt file m thnh cng hay cha, chng ta c th s dng
phng thc is_open. Nu m thnh cng, n s tr v gi tr true v
ngc li, nu m khng thnh cng, n s tr v gi tr false.
ng file
Khi chng ta hon tt cng vic vi mt file, chng ta cn thc hin thao tc
ng file li. Tc v ny l bt buc nu ta hon tt cc tc v trn file.
Khi , ta ch n thun triu gi phng thc thnh vin close
myfile.close();
Nu phng thc hy ca i tng c triu gi, phng thc close s
t ng c gi theo.
File vn bn
i vi mt file vn bn, th c hiu ios::binary s khng bao gi c s
dng. Nhng file vn bn ch n thun cha vn bn. c ghi d liu
trn file ny ta s dng ton t xut nhp d liu (<< v >>).
Ghi d liu ln file vn bn
#include <iostream>
#include<fstream>
using namespace std;
int main(){
ofstream myfile (example.txt);
if (myfile.is_open(){
myfile<<Dong 1 da ghi\n;
myfile<<Dong 2 da ghi\n;
myfile.close();
}
else cout<<Khong the ghi du lieu len file;
Chng 16. Lm vic vi file
T r a n g | 189
C
+
+
return 0;
}
V d trn cho thy vic ghi d liu ln file vn bn nh vo ton t <<. V
d tip theo sau y s minh ha cho vic c d liu t file vn bn bng
ton t >>.
c d liu t file vn bn
#include <iostream>
#include<fstream>
#include<string>
using namespace std;
int main(){
ifstream myfile (example.txt);
if (myfile.is_open(){
while(!myfile.eof()){
getline(myfile, line);
cout<<line<<endl;
}
myfile.close();
}
else cout<<Khong the ghi du lieu len file;
return 0;
}
Trong v d ny, chng ta c s dng hm thnh vin eof ca i tng
ifstream. Hm thnh vin ny c chc nng kim tra v tr c l v tr
cui cng ca file hay cha, nu cha, d liu t file s tip tc c c.
Ngc li, n s dng vic c d liu.
Kim tra trng thi ca cc c hiu
V d trn cho ta mt cc thc kim tra trng thi ca cc c hiu. Bng
sau y s lit k cc trng thi c hiu c th c s dng trong C++.
Trng thi Gii thch
bad() Nu tc v c/ghi file b li, n s tr v gi tr true;
ngc li, n s tr v gi tr false.
fail() Tr v gi tr true trong trng hp nh bad(), nhng
nu gp li v nh dng, n cng tr v gi tr true (v
d c s t mt file vn bn).
eof() Tr v gi tr true nu file c c n v tr cui
Chng 16. Lm vic vi file
T r a n g | 190
C
+
+
cng ca file, ngc li, tr v gi tr false.
good() N s tr v gi tr true nu bad(), fail() v eof() khng
pht sinh li.
thit lp li cc mc kim tra trng thi c hiu, ta s dng phng thc
thnh vin clear().
Con tr get v put
Mi i tng lung xut nhp u c t nht mt con tr lung:
- Lung ifstream c con tr istream m ta gi l con tr get tr vo phn
t c th c d liu.
- Lung ofstream c con tr ostream m ta gi l con tr put tr vo
phn t c th ghi d liu.
- Lung fstream c c hai con tr get v put c v ghi d liu.
Nhng con tr lung ni ti ny tr vo v tr c v ghi vi lung c th s
dng cc hm thnh vin sau y:
Hm thnh vin tellg() v tellp()
Hai hm thnh vin ny khng c tham s v tr v gi tr ca mt kiu d
liu dng pos_type. Kiu d liu ny bn cht l mt s nguyn integer. N
m t v tr hin ti ca ca con tr lung get v con tr lung put.
Hm thnh vin seekg() v seekp()
Nhng hm thnh vin ny cho php chng ta thay i v tr hin ti ca
con tr lung get v put. C hai hm ny c chng cht vi hai prototype
khc nhau. Prototype th nht:
seekg(v_tr);
seekp(v_tr);
Vic s dng cc prototype ny gip lm thay i v tr tuyt i (v tr ny
tnh t u file). Kiu d liu ca tham s ny trng vi kiu d liu ca hai
hm tellg() v tellp() trn.
Prototype th hai:
seekg(v_tr, kiu);
Chng 16. Lm vic vi file
T r a n g | 191
C
+
+
seekp(v_tr, kiu);
Vic s dng prototype ny s lm thay i v tr hin ti ca con tr get v
con tr put c xc nh theo v tr tng i theo tham s v_tr v tham
s kiu. Tham s v_tr ca mt thnh vin thuc kiu d liu off_type, n
cng l mt kiu s nguyn, n tng ng vi v tr ca con tr get/put
c t vo. Tham s kiu l mt kiu d liu seekdir, n l mt kiu enum
xc nh v_tr ca con tr get/put k t tham s kiu, n c th nhn
mt trong cc gi tr sau y.
ios::beg v_tr c m t v tr bt u ca lung
ios::cur v_tr c m t v tr hin ti ca lung
ios::end v_tr c m t v tr cui ca lung
iu ny c ngha l hm chng cht hai tham s ny cng tng t hm
mt tham s, nhng v tr bt u tnh trong hm mt tham s lun l t v
tr u tin, cn hm hai tham s c ba v tr c th bt u m bt u
(ios::beg), hin ti (ios::cur) hay cui file (ios::end).
Ta hy quan st v d sau y
V d Kt qu
1. #include <iostream>
2. #include <fstream>
3. using namespace std;
4. int main(){
5. long begin, end;
6. ifstream myfile(example.txt);
7. begin = myfile.tellg();
8. myfile.seekg(0, ios::end);
9. end = myfile.tellg();
10. myfile.close();
11. cout<<Size=<<(end-begin)<< bytes;
12. return 0;
13. }
Size=10 bytes
Gii thch: trong chng trnh trn chng ta ang m mt file example.txt.
Chng ta m kch thc ca file ny. Khi m file, con tr get s t vo v
tr u file. Khi , dng lnh 7 s gn gi tr khi u cho bin begin (trong
trng hp ny s l 0). Dng lnh 8 s t con tr get vo v tr cui cng
ca file (v tr 0 k t cui file tnh ln). Dng lnh 9 s gn v tr hin ti v
tr cui file cho bin end. iu c ngha l gi tr end-begin chnh l kch
Chng 16. Lm vic vi file
T r a n g | 192
C
+
+
thc ca file. Ta cng cn lu rng, trong file vn bn, mt k t tng
ng vi 1 byte cng chnh l quy nh trong C++ (mt kiu char chim
1 byte). Hay ni chnh xc, chng trnh ny m s k t trong file vn bn.
File nh phn
i vi file nh phn, vic c ghi d liu bng ton t tch trch >> v ton
t chn << cng nh hm getline l khng c hiu lc, bi chng khng
c nh dng theo kiu vn bn nh i vi file vn bn trn (khng
dng phm space to khong cch, khng c k t xung dng).
Cc lung ca file gm hai hm thnh vin c v ghi d liu l read v
write. Hm thnh vin write l hm thnh vin ca lp ostream tha k cho
ofstream. V hm read l thnh vin ca lp istream tha k cho ifstream.
Cc i tng ca lp fstream c c hai hm thnh vin ny. Chng c
prototype nh sau:
write(khi_b_nh, kch_thc);
read(khi_b_nh, kch_thc);
, khi_b_nh l mt con tr kiu char (char*) v n biu din a ch
ca mt mng cc byte m n c hoc ghi c. Bin kch_thc l mt
kiu s nguyn integer, n ch nh s cc k t c th c/ghi ln khi b
nh. Chng ta hy quan st v d sau y
V d
#include<iostream>
#include<fstream>
using namespace std;
ifstream::pos_type size;
char* memblock;
int main(){
ifstream file(example.bin, ios::in|ios::binary|ios::ate);
if(file.is_open()){
size = file.tellg();
memblock = new char[size];
file.seekg(0, ios::beg);
file.read(memblock, size);
file.close();
cout<<Hoan tat !;
//Lm vic vi d liu trong con tr memblock
Chng 16. Lm vic vi file
T r a n g | 193
C
+
+
delete[] memblock;
}
else cout<<Khong mo duoc file.;
return 0;
}
Gii thch: trong chng trnh, ta m file example.bin. Ch m file
c (ios::in), theo kiu file nh phn (ios::binary), t con tr get vo cui
file (ios::ate). Sau khi m file, hm file.tellg() s cho bit kch thc thc
ca file. Sau hm file.seekg s t v tr con tr get vo u file (v tr 0 k
t v tr u tin) v tin hnh c theo khi b nh nh vo file.read. Sau
khi hon tt, phng thc close c triu gi kt thc vic c file. Khi
, d liu t file c vo mng memblock. Chng ta c th b sung tc
v thao tc vi d liu nu mun. Cui cng, con tr memblock s b xa
gii phng b nh.
B m v ng b ha
Khi thc thi cc tc v c/ghi d liu vi file, chng ta thc thi nh trn
nhng thng qua mt b m c kiu d liu streambuf. B m ny l mt
khi b nh ng vai tr trung gian gia cc lung v file vt l. V d, vi
ofstream, mi thi im hm put c gi, k t khng ghi trc tip ln file
m n s c ghi ln b m. Khi b m y, mi d liu cha trong
s c ghi ln file (nu l lung ghi d liu) hay xa b lm rnh b
nh (nu l lung c d liu). Tin trnh ny c gi l ng b ha v
c cc tnh hung sau y:
- Khi file ng: trc khi ng mt file, tt c d liu trong b nh nu
cha y vn c ng b v chun b c/ghi ln file.
- Khi b nh y: b m c kch thc gii hn. Khi n y, n s t ng
ng b ha.
- B iu phi: khi cc b iu phi c s dng trn lung, mt tin trnh
ng b dt im s c din ra. Nhng b iu phi ny bao gm: flush
v endl.
- Hm thnh vin sync(): nu hm thnh vin sync() c triu gi, tin
trnh ng b ha s din ra. Hm ny tr v mt kiu integer (int) tng
ng vi -1, nu lung khng c b m lin kt hoc trong trng hp
c/ghi tht bi. Ngc li, n s tr v gi tr 0.
Chng 17. Cc lp th vin
Trang | 194
CHNG 17. CC LP TH VIN
1. Lp s phc complex
y l lp template. Khi khi to mt lp i tng s phc, ta cn ch nh
kiu d liu cho n. N nm trong th vin complex. V d v vic khi to
mt s phc:
complex<float> c(10.2, 3);
s khi to mt i tng s phc m phn thc v phn o ca n l cc
s thc. Thng thng, kiu d liu c ch nh cho lp s phc l kiu
d liu thc: float, double hoc long double. Nhng chng ta hon ton c
th s dng kiu s nguyn.
Cc hm thnh vin ca lp s phc
Tn thnh vin Mc truy cp Chc nng
real
imag
private Phn thc v phn o.
Phng thc khi to:
complex<?> c;
complex<?> c(real, imag);
complex <?> c(d);
public Cc phng thc khi
to: khng tham s, c
hai tham s v hm to
sao chp.
imag() public Phng thc getImage
tr v gi tr phn o.
real() public Phng thc getReal
tr v gi tr ca phn
thc.
operator=
operator+=
operator-=
operator*=
operator/=
public Cc hm ton t thnh
vin: ton t gn, ton
t cng hp nht, ton
t tr hp nht, ton t
nhn hp nht, ton t
chia hp nht.
_Add(complex)
_Sub(complex)
_Mul(complex)
_Div(complex)
protected Cc phng thc cng,
tr, nhn v chia hai s
phc.
Chng 17. Cc lp th vin
T r a n g | 195
C
+
+
Cc hm ton cc (hoc hm bn)
Tn phng thc Chc nng
operator +
operator
operator *
operator /
operator =
operator ==
operator !=
operator >>
operator <<
Ton t cng hai s phc.
Ton t tr hai s phc.
Ton t nhn hai s phc.
Ton t chia hai s phc.
Ton t gn s phc.
Ton t so snh bng.
Ton t so snh khc.
Ton t nhp s phc.
Ton t xut s phc.
real(complex) Tr v phn thc ca s phc.
imag(complex) Tr v phn o ca s phc.
abs(complex) Tr v gi tr modul ca s phc. Modul ca s
phc c tnh theo cng thc
2
+
2
.
norm(complex) Tr v gi tr l chun ca s phc. Chun ca s
phc l bnh phng gi tr ca modul, tc l
2
+
2
.
conj(complex) Tr v s phc lin hp. S phc lin hp ca s
phc a nhn c bng cch thay phn o ca a
bng a.
polar(float, float) Tr v mt s phc trong h ta Decac. Hai
tham s truyn vo tng ng vi modul v
argument ca s phc.
= cos (arg )
= sin (arg )
cos(complex) Tr v gi tr cosin ca s phc.
sin(complex) Tr v gi tr sin ca s phc.
tan(complex) Tr v gi tr tan ca s phc.
cosh(complex) Tr v gi tr cosin hyperbol ca s phc.
sinh(complex) Tr v gi tr sinh hyperbol ca s phc.
tanh(complex) Tr v gi tr tan hyperbol ca s phc.
exp(complex) Tr v gi tr e ly tha ca s phc.
sqrt(complex) Tr v gi tr cn bc hai ca s phc.
log(complex) Tr v gi tr logarith c s t nhin (logarith
nepe) ca s phc.
log10(complex) Tr v gi tr logarith c s 10 ca s phc.
pow(complex, <T>) Tr v ly tha ca s phc. Tham s th hai c
th l s phc, s thc, s nguyn.
Chng 17. Cc lp th vin
T r a n g | 196
C
+
+
y l lp s hc kh hu dng trong tnh ton khoa hc. Chng ta c th
s dng n m khng cn xy dng li lp ny. Tuy nhin, khi bt u tip
xc vi lp trnh hng i tng, cn thit phi xy dng n.
2. Lp ngn xp stack
Lp stack cng l mt lp template. N lm vic theo nguyn tc hng i
vo trc ra sau. Lp stack cung cp cc phng thc lm vic theo
nguyn tc Lifo nh trong hc phn cu trc d liu v gii thut.
Khai bo mt i tng thuc lp stack:
stack<int> s;
Cn lu rng, lp stack nm trong th vin stack. Sau y l mt s hm
thnh vin ca lp stack.
Tn phng thc Mc truy cp Chc nng
stack<?>c;
stack<?,deque, allocator>
public Hm to. i vi hm to th
hai, ta cn s dng cc i
tng deque v allocator. y
cng l cc lp template.
empty() public Phng thc hng. Tr v
kiu bool. Nhn gi tr true
nu stack rng v ngc li
stack khng rng th nhn gi
tr false.
size() public Phng thc hng. Tr v
kiu s nguyn l kch thc
ca stack (tc s phn t ca
stack).
top() public C hai phng thc top c
qu ti: hng v khng hng.
N tr v phn t nm nh
ca stack (tc phn t c
a vo sau cng).
push() public B sung mt phn t mi vo
trong stack.
pop() public Ly ra mt phn t trong
stack. Phng thc ny khng
tr v gi tr ca phn t va
c ly ra.
Chng 17. Cc lp th vin
T r a n g | 197
C
+
+
Stack trong trng hp ny khng b gii hn kch thc (bi n c khai
bo ng).
3. Lp hng i queue
Queue l mt lp template. s dng queue, ta cn khai bo th vin
queue tng ng. Queue lm vic theo nguyn tc Fifo tc vo trc th
ra trc. Sau y l v d v vic to mt i tng queue:
queue<int> q;
Cc phng thc thnh vin ca lp queue:
Tn phng thc Mc truy cp Chc nng
queue<?>
queue<?, deque, allocator>
public Hm to. i vi hm to th
hai, ta cn s dng cc i
tng deque v allocator. y
cng l cc lp template.
empty() public Phng thc hng. Tr v
kiu bool. Nhn gi tr true
nu queue rng v ngc li
queue khng rng th nhn gi
tr false.
size() public Phng thc hng. Tr v
kiu s nguyn l kch thc
ca queue (tc s phn t ca
queue).
front() public C hai phng thc front
c qu ti: hng v khng
hng. N tr v phn t nm
u ra (tc phn t c a
vo u tin).
back() public C hai phng thc front
c qu ti: hng v khng
hng. N tr v phn t nm
u vo (tc phn t c
a vo sau cng).
push() public B sung mt phn t mi vo
trong queue. Phn t c
a vo theo hng back.
pop() public Ly ra mt phn t trong
queue. Phng thc ny
khng tr v gi tr ca phn
Chng 17. Cc lp th vin
T r a n g | 198
C
+
+
t va c ly ra. Phn t
c ly ra theo hng front.
Cng tng t nh stack, queue trong trng hp ny cng khng b gii
hn kch thc (v c kha bo ng).
3. Lp vector
Cn lu rng, lp vector c cu trc tng i ging vi mng. Vector
khng phi l mt lp i tng nh trong hnh hc. Cc phn t ca
vector c sp xp lin tc trong b nh. Chng ta khng th ri rc ha
cc phn t (khi b sung cc phn t, cn b sung mt cch lin tc; nu
khng s b li cp pht b nh). Chng ta c th truy cp n cc phn t
ca vector thng qua ch s hoc iterator.
Chng trnh Kt qu
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(22);
//=====Cch 1=====
cout<<"Theo chi so:"<<endl;
for (unsigned i=0; i<v.size(); i++)
cout<<v[i]<<endl;
//=====Cch 2=====
cout<<"Theo con tro iterator:"<<endl;
vector<int>::iterator it;
for (it=v.begin(); it<v.end();++it)
cout<<*it<<endl;
return 0;
}
Theo chi so:
10
20
22
Theo con tro iterator:
10
20
22
Theo cch 1, chng ta truy cp n cc phn t ca vector theo cch truy
cp nh i vi mng; cch th hai cho php ta truy cp thng qua con tr
iterator. Sau y, chng ta s tham kho cc phng thc thnh vin ca
lp vector.
Chng 17. Cc lp th vin
T r a n g | 199
C
+
+
Tn phng thc Mc truy cp Chc nng
vector<?>
vector<?, allocator>
public Hm to.
~vector() public Hm hy.
operator = public Ton t gn.
begin() public Tr v iterator tng ng vi
iterator u tin ca vector.
end() public Tr v iterator tng ng vi
iterator cui ca vector.
rbegin() public Tr v iterator nghch o ca
iterator u tin ca vector.
rend() public Tr v iterator nghch o ca
iterator cui ca vector.
size() public Tr v kch thc ca vector.
max_size() public Tr v kch thc cc i ca
vector.
resize(int)
resize(int, ?)
public Thay i kch thc ca vector.
N c hai chng cht hm, tham
s int th nht tng ng vi
kch thc mi ca vector; tham
s template th hai tng ng
vi gi tr c b sung mc
nh.
capacity() public Tr v kch thc b nh cp
pht cho cc phn t ca vector.
Cn lu , c ch cp pht ny
trong C++ l t ng v lun
m bo size()<=capacity().
empty() public Tr v gi tr true nu vector
rng v ngc li.
reserve(int) public Thay i kch thc cho vng
b nh lu tr cc phn t
khi to ca vector. Tham s
ca hm tng ng vi gi tr
tr v ca phng thc
capacity.
operator[int] public Tr v phn t tng ng vi v
tr c ch nh (nh i vi
mng).
at(int) public Tham chiu n phn t tng
ng vi ch s c ch nh.
Phng thc ny tng t nh
Chng 17. Cc lp th vin
T r a n g | 200
C
+
+
ton t [] trn.
front() public Tr v phn t u tin (khng
phi l iterator nh begin).
back() public Tr v phn t cui cng (khng
phi l iterator nh end).
assign(iterator, iterator)
assign(int, ?)
public Khi gn gi tr cho vector.
push_back(?) public B sung mt phn t vo cui
vector.
pop_back() public Loi b phn t pha cui ca
vector.
iterator(iterator, ?)
insert(iterator, ?)
insert(iterator, int , ?)
insert(iterator, iterator,
iterator)
public Phng thc th nht tr v
iterator, ba phng thc cn li
tr v void. Vector s c ni
rng bng cch b sung thm
cc phn t mi. Phng thc
u tin tr v iterator cui
cng ca vector sau khi ni rng
kch thc ca n.
erase(iterator)
erase(iterator, iterator)
public Xa b cc phn t ca vector.
Phng thc u xa mt phn
t, phng thc hai xa cc
phn t trong vng gia hai
tham s c ch nh. Sau khi
xa b, n tr v iterator ca
phn t cui.
swap(vector&) public Hon i gi tr ca hai vector.
clear() public Xa b hon ton cc phn t
ca vector. Sau khi xa b, kch
thc ca n l 0.
get_allocator() public Tr v s lng cc i tng
c cp pht b nh s dng
khi kh to vector.
4. Lp string
Th vin chun string ca C++ cung cp lp template tng ng vi string
v wstring. Cc phng thc thnh vin ca lp string bao gm:
Tn phng thc Mc truy cp Chc nng
string()
string(const string&)
public Cc phng thc khi to:
- Khi to khng tham s.
Chng 17. Cc lp th vin
T r a n g | 201
C
+
+
string(const string&, int, int)
string(const char*, int)
string(const char*)
string(int, char)
- Hm to sao chp.
- Sao chp xu con t v tr
int th nht vi di int
th hai.
- Sao chp cc k t ca
mng xu k t vi di
l tham s int (k t v tr
u tin).
- To mt xu k t c ni
dung l k t char v di
l tham s int.
Cc iterator: begin, end,
rbegin, rend
public Xem phn lp vector.
size, max_size, resize,
capacity, reserve, clear, empty
public Xem phn lp vector.
operator[int]
at
public Xem phn lp vector.
length() public Tr v di ca xu.
operator+= public Cng dn xu.
append(const string&)
append(const string&, int, int)
append(const char*, int)
append(const char*)
append(int, char)
public B sung xu hoc mt phn
ca xu vo xu c. Cc
tham s ny tng t nh
trong phng thc khi
to.
push_back(char) public B sung mt k t vo xu.
assign, erase, swap public Xem lp vector.
insert(int, const string&)
insert(int, const string&, int,
int)
insert(int, const char*)
insert(int, int, char)
insert(iterator, char)
insert(iterator, int, char)
insert(iterator, iterator,
iterator)
public Chn xu con vo xu. Cc
phng thc s dng tham
s iterator hon ton
tng t nh trng hp
lp vector. Phng thc 1
s chn xu con vo xu
ban u ti v tr int.
Phng thc hai tng t,
nhng xu con ch ly t
tham s int th 2 vi
di l tham s int th 3.
Phng thc 3 tng t
phng thc 1. Phng
thc 4 s chn k t char
vo v tr tham s int th
nht vi s ln l tham s
Chng 17. Cc lp th vin
T r a n g | 202
C
+
+
int th 2.
replace public Thay th mt phn ca xu
theo cc tham s tng t
nh phng thc khi to.
c_str public Chuyn sang xu dng C
tng ng.
data public Tr v mng cc k t.
get_allocator public Xem lp vector.
copy(char*, int, int=0) public Sao chp xu.
find(const string&, int=0)
find(const char*, int, int)
find(const char*, int=0)
find(char, int=0)
public Tm kim xu con trong
mt xu.
find_fist_of
find_last_of
find_fist_not_of
find_last_not_of
public Tm kim xu u tin,
cui cng, khng phi l
u tin, khng phi l cui
cng.
substr(int, int) public Tr v xu con t v tr int
th nht vi di int th
hai.
compare public So snh hai xu. Nhn gi
tr 0, nu hai xu bng
nhau v ngc li.
Cc hm ton cc.
Tn phng thc Chc nng
operator+ Cng hai xu.
swap(string&, string&) Hon i ni dung ca hai xu.
operator==
operator!=
operator<
operator>
operator>=
operator<=
Cc ton t so snh hai xu. Xu s>ss nu cc k
t trong s ng trc ss trong bng ch ci.
getline Nhp xu.
operator<< Chn xu v chuyn ha thnh lung stream.
operator>> Trch tch xu t lung stream.
Chng 17. Cc lp th vin
T r a n g | 203
C
+
+
5. Lp list
Tn phng thc Mc truy cp Chc nng
list<?>(allocator)
list<?>(int, ?, allocator)
list<?>(list)
public Hm to.
~list() public Hm hy.
begin, end, rbegin, rend public Xem lp vector.
empty, size, max_size, resize public Xem lp vector.
front, back, push_front,
push_back, pop_front,
pop_back, insert, erase, swap,
clear.
public Xem lp vector.
splice(iterator, list) public Chuyn cc phn t t
danh sch list sang danh
sch cha t v tr c ch
nh.
remove(const T&) public Xa cc phn t c gi tr
c ch nh.
remove_if public Xa phn t v dn danh
sch li.
unique public Xa cc phn t trng lp.
merge public Nhp hai danh sch li.
sort public Sp xp danh sch.
reverse public o ngc th t cc phn
t trong danh sch.
get_allocator public Xem lp vector.
6. Lp map
Map l mt cu trc d liu gm c hai phn l kha v gi tr. Mi kha l
duy nht v n tng ng vi mt gi tr c th. Lp map l mt lp
template.
Tn phng thc Mc truy cp Chc nng
map<?,?>
public Hm to.
~map() public Hm hy.
begin, end, rbegin, rend public Xem lp vector.
empty, size, max_size, resize public Xem lp vector.
insert, erase, swap, clear. public Xem lp vector.
operator[] public Xem lp vector.
Chng 17. Cc lp th vin
T r a n g | 204
C
+
+
key_comp public Tr v key ca i tng.
value_comp public Tr v gi tr ca i
tng.
find public Tr v ch s dng iterator
ca kha tm kim.
count m s i tng c kha
ch nh.
lower_bound Tr v iterator ca bin
di.
upper_bound Tr v iterator ca bin
trn.
equal_range Tr v cp cn trn v cn
di.
get_allocator public Xem lp vector.
7. Lp set
Set l mt dng cu trc d liu m mi phn t ca n l mt kha (ngha
l khng cho php cha cc phn t trng lp). Cc phng thc ca set
hon ton tng t nh ca map. Set cng l mt lp template.
8. Cc lp th vin nhp xut
Th vin cc lung nhp xut
Th vin iostream l th vin hng i tng cung cp cc chc nng
nhp xut c bn s dng lung stream. Mt lung l mt i tng tru
tng c th lm vic vi cc thit b xut nhp. Mt lung v c bn c th
c biu din nh mt dy cc k t c di v hn.
Cc lung c qun l v lu tr ti nguyn vt l di dng k t nh tp
tin, bn phm, console, cc k t ny c th c c t hoc ghi ln lung.
Chng 17. Cc lp th vin
T r a n g | 205
C
+
+
V d cc tp tin trong C++ c t chc v tng tc vi tp tin. Mt lung
tp tin c s dng m tp tin, c, ghi trn tp tin.
lm vic vi lung, C++ cung cp th vin iostream chun cha cc i
tng sau:
Cc lp template c bn
C s ca th vin iostream l cu trc cy ph h ca cc lp template. Cc
lp template cung cp hu ht cc tnh nng trong th vin ca C++ c
th lm vic vi cc kiu d liu hin i c b sung sau ny. N l mt
tp hp cc lp template, mi lp c hai tham s template: kiu char
(charT) xc nh kiu ca cc phn t v tham s traits cung cp cc
c tnh b sung cho mi loi phn t. Lp template trong cy ph h lp c
cng tn vi i tng th hin ca lp char v c tin t l basic_. V d lp
template ca istream l basic_istream, ca fstream l basic_fstream, Ch
c duy nht mt ngoi l l ios_base l mt lp c lp v khng tn ti
lp tng ng l base.
Thc th ca lp template
Th vin c chia thnh hai tp hp thc th ca lp iostream: mt l
theo hng hp qun l cc phn t kiu char v mt phn t thuc kiu
khc; theo hng rng t chc cc phn t kiu wchar_t.
Thc th theo hng hp char c th c bit n nhiu hn nh l mt
thc th ca th vin iostream. Cc lp nh ios, iostream v ofstream l cc
thc th theo hng rng. Biu trn l biu biu din tn v mi
quan h gia cc lp theo hng hp.
Cc thc th theo hng rng wchar_t c cng tn vi thc th theo hng
hp nhng c tin t b sung l w. V d wios v ios, wistream v
wofstream.
Cc i tng chun
L mt phn ca th vin iostream, c c t trong tp tiu
<iostream> thng c s dng thc hin cc chc nng nhp xut
chun. Chng c chia thnh hai nhm: nhm i tng nh hng hp
bao gm ba i tng ph bin nht: cin, cout, cer v clog v nhm nh
hng rng bao gm wcin, wcout, werr v wlog.
Chng 17. Cc lp th vin
T r a n g | 206
C
+
+
Cc kiu d liu
Cc lp iostream s dng cc kiu c bn. Chng s dng kiu d liu c
bn ph thuc vo s th hin ca chng. V d theo mc nh char v
wchar_t, kiu streampos, streamoff v streamsize dng biu din v tr,
offset v kch thc tng ng.
Cc thao tc thc hin
Cc thao tc thc thi trn lung l cc hm ton cc c thit k s
dng cng vi ton t chn << v ton t trch tch >>. Ngoi ra cn c cc
chc nng nh dng nh endl, hex, scientific.
Cc tp tin
<ios>, <istream>, <ostream>, <streambuf> v <iosfwd> khng thng
c s dng mt cch trc tip trong cc chng trnh C++. Chng m
t lp c s ca cy ph h v c a vo trong chng trnh thng
qua mt tp tin tiu khc ca th vin cha cc lp dn xut.
<iostream> c t cc i tng s dng kt ni thng qua cc
chun nhp xut (bao gm c cin, cout).
<fstream> xc nh cc lp lung (nh cc lp template basic_ifstream
hay lp ofstream) cng nh cc i tng b m (basic_filebuf).
Nhng lp ny c s dng lm vic vi tp tin bng cch s dng
lung.
<sstream> cc lp xc nh trong tp tin ny thng s dng i tng
string nu chng l lung.
<iomanip> c t mt vi chc nng chun vi cc tham s c s
dng kt hp vi cc ton t tch v chn chnh sa cc c hiu v
cc thng s nh dng.
Cc thnh phn ca th vin iostream (vi thc th char)
1) Cc lp trong iostream (c th tham kho thm trong th vin ny).
Lp ios_base
Lp ios
Lp istream
Lp ostream
Lp ifstream
Chng 17. Cc lp th vin
T r a n g | 207
C
+
+
Lp ofstream
Lp fstream
Lp istringstream
Lp ostringstream
Lp streambuf
Lp filebuf
Lp stringbuf
2) Cc i tng
i tng cin
Xem chng Nhp xut c bn. Cc phng thc v thuc tnh khc
xem thm lp istream.
i tng cout
Xem chng Nhp xut c bn. Cc phng thc v thuc tnh ca lp
khc xem thm lp ostream.
i tng cerr
Thuc lp ostream c s dng in lung li c bn. Mc nh, hu
ht h thng u c mt chun li c bn in ra mn hnh. Bi v cerr l
mt i tng ca lp ostream, chng ta c th vit cc k t theo d liu
c nh dng nh vo ton t chn << hoc khng nh dng d liu
nu s dng hm thnh vin write.
#include <iostream>
int main()
{
int num;
std::cin>>num;
if (std::cin.good())
{
std::cout<<"Good !";
}else
{
std::cerr<<"Error";
//Hoc std::cerr.write("Error",
sizeof(std::streamsize));
Chng 17. Cc lp th vin
T r a n g | 208
C
+
+
}
return 0;
}
Nu s nguyn nhp vo ng nh dng th s thc hin chc nng in ra
Good, ngc li s in ra Error.
i tng clog
Tng t nh cerr, clog dng biu din lung ng nhp chun.
3) Cc kiu d liu
Kiu fpos: xc nh v tr trong lung. V bn cht n l mt lp
template. N c hai thnh vin getter v setter tng ng l: state() v
state(stateT).
Kiu streamoff: xc nh v tr ca offset trong lung. Ta hon ton c
th chuyn i n thnh streamsize, fpos hoc streampos.
Kiu streampos: tng t vi fpos.
Kiu streamsize: biu din kch thc lung.
4) Cc thao tc thc hin
boolalpha: thng s dng kt hp vi ton t nhp >> hoc xut <<.
Nu tham s l boolalpha th tham s bool l 1 v 0 tng ng s c
hiu l true v false.
#include <iostream>
int main()
{
bool num;
std::cin>>std::boolalpha>>num;
std::cout<<num;
return 0;
}
true
true
dec: c ghi d liu s theo dng thp phn (mc nh).
#include <iostream>
int main()
10
Chng 17. Cc lp th vin
T r a n g | 209
C
+
+
{
int num = 10;
std::cout<<std::dec<<num;
return 0;
}
endl: chn du xung dng. Tng t nh \n.
ends: chn k t trng \0.
fixed: p dng cho nh dng s thc c du chm. Khi
cout.precision(int) c triu gi, th s ch s thp phn (tham s
int) s c p dng nu chun xut d liu c s dng fixed (khc vi
none - s p dng theo mc nh v khng ph thuc vo vic triu gi
phng thc trn).
#include <iostream>
int main()
{
float a = 3.141516f, b = 1.00f;
std::cout.precision(3);
std::cout<<a<<"\t"<<b<<std::endl;
std::cout<<std::fixed<<a<<"\t"<<b;
return 0;
}
3.14 1
//Khng bt
fixed
3.142 1.000
//Bt fixed
flush: ng b ha b m vi con tr lung. iu ny c ngha l tt c
cc k t cha c ghi trong b m s c ghi ra lin tc.
#include <fstream>
using namespace std;
int main () {
ofstream outfile
("test.txt");
for (int n=0; n<100; n++)
outfile << n << flush;
outfile.close();
return 0;
}
//D liu s c ghi lin
tc ln tp tin test.txt. D
liu trong file ny s c
cp nhp lin tc 100 ln.
Chng 17. Cc lp th vin
T r a n g | 210
C
+
+
hex: thit lp c hiu chui thp lc phn cho s c in ra.
cout<<hex<<15; //Kt qu - F
internal: ko gin vng d liu v hai pha (tng t justify trong
Microsoft Word) theo rng c thit lp bi cout.width(int).
left: tng t internal, nhng d liu c ko v bn tri.
noboolalpha: ngc li vi boolalpha, ch in ra gi tr l 1 v 0, d cho
gi tr ng c c thit lp l true, v gi tr sai c thit lp l
false.
noshowbase: khng hin th dng thc ca c s. V d c s 8 s c
dng 0x Nu c hiu ny c triu gi, dng d liu in ra s khng
cha 0x.
noshowpoint: khng hin th du chm ng.
noshowpos: khng hin th du ca s dng.
noskipws: khng b qua cc k t trng khi tch d liu (khi kt hp s
dng lp istringstream).
nounitbuf: b m s khng b lm cn sau mi ln thc hin thao tc
ghi d liu.
nouppercase: khng hin th phn ch trong cc gi tr ca h c s 16
di dng ch hoa (ngha l lun vit thng a, b, c, d, e, f).
oct: thit lp c hiu cho chui bt phn in ra (chuyn mt s thnh
chui bt phn).
resetiosflags : hy b c hiu tng ng vi h c s c chn.
right: tng t internal, nhng d liu c ko v bn phi.
scientific: tng t fixed, nhng n hin th s thp phn du chm
ng di dng E.
setbase: thit lp h c s s chuyn i. N tng ng vi hex
nu c s thit lp l 16; oct 8; dec 10.
setfill: b sung cc k t c ch nh vo phn cn trng trong vng
d liu c ch nh.
setiosflags: thit lp c hiu vi h c s c chn.
setprecision: thit lp s trng dnh cho c phn nguyn ln phn
thp phn (khng tnh du chm). Cng hot ng tng ng vi
fixed.
setw: thit lp rng cho vng d liu hin th.
showbase: hin th dng thc c s. C hiu ny ngc vi
noshowbase.
Chng 17. Cc lp th vin
T r a n g | 211
C
+
+
showpoint: hin th du chm ng.
showpos: hin th du + trc s dng.
skipws: b qua k t trng khi tch d liu.
unitbuf: b m s b lm cn sau mi ln ghi d liu.
uppercase: hin th phn ch trong h c s 16 di dng ch hoa (A,
B, C, D, E, F).
ws: b qua cc k t trng (hoc cc k t tab, enter) khi tch d liu.
Phn Thc hnh
Trang | 212
HNG DN THC HNH
BI THC HNH S 1
Nhp xut c bn v Hm trong C++.
Hy thc hin cc cng vic sau y:
a. Xy dng mt chng trnh gm c hai phn: phn file header t tn l
tieude.h, phn chng trnh chnh l main.cpp.
b. Tt c cc hm trong chng trnh cn phi khai bo prototype. Cc tiu
file c t trong tp tiu . Chng trnh chnh cha cc hm thc
hin cc cng vic sau v hm main.
- S dng hm nhp xut c bn xy dng hm nhp vo mt xu k t
di dng kiu d liu string. Sau :
+ In ra xu o ngc. V d Toi di hoc, th in ra coh id ioT. Hm ny
gi l hm DaoXau.
+ In ra cc k t o ngc. V d Toi di hoc, th in ra hoc di Toi. Hm
ny gi l hm DaoTu.
- Nhp vo mt mng s nguyn, in ra tng cc phn t ca chng. Hm
ny gi l hm TinhTong.
- S dng khai bo chng cht hm, xy dng hai hm gii phng trnh
bc nht v phng trnh bc hai. Tn gi ca hai hm ny l
GiaiPhuongTrinh.
- S dng khai bo hm vi tham s mc nh gii phng trnh bc nht
v phng trnh bc hai, hm ny c tn gi l GiaiPhuongTrinhTSMD.
- Trong hm main, hy thc hin cc cng vic sau: in ra thng bo nhp
vo mt xu k t v gi hm DaoXau v DaoTu, nhp vo mt mng s
nguyn v gi hm TinhTong. S dng hm xut nhp c bn a ra
thng bo nhp cc h s cho phng trnh. Nu h s c nhp vo bng 0,
th thc hin gii phng trnh bc nht, cn c khc khng th thc hin gii
Phn Thc hnh
T r a n g | 213
C
+
+
phng trnh bc hai (gii cc phng trnh ny bng cch gi cc hm xy
dng trn).
BI THC HNH S 2
Xy dng Lp v Lm vic vi i Tng
1. Xy dng lp HangHoa gm c cc phng thc v thuc tnh sau:
Tn gi Mc truy cp Loi Gii thch
tenHang private
Thuc
tnh
Tn mt hng
ngaySanXuat private Ngy sn xut
donGia private n gi
soLuong private S lng
SetTenHang public
Phng
thc
Thit lp tn hng
GetTenHang public Tip nhn tn hng
SetNgaySanXuat public Thit lp ngy sn xut
GetNgaySanXuat public Tip nhn ngy sn xut
SetDonGia public Thit lp n gi
GetDonGia public Tip nhn n gi
SetSoLuong public Thit lp s lng
GetSoLuong public Tip nhn s lng
TinhTien public Tnh tin
Cc phng thc trn bao gm setter v getter. Phng thc TinhTien l
phng thc dng tnh s tin m khch hng mua. Tnh tin s bng
donGia*soLuong.
2. Xy dng lp KhachHang gm cc phng thc v thuc tnh sau:
Tn gi Mc truy cp Loi Gii thch
username private Thuc
tnh
Tn ti khon ngi dng
password private Mt khu ngi dng
SetUsername public
Phng
thc
Lp ti khon ngi dng
GetUsername public Tip nhn ti khon ngi dng
SetPassword public Lp mt khu ngi dng
GetPassword public Tip nhn mt khu ngi dng
MuaHang public Mua hng
Cc phng thc setter v getter hon ton tng t nh trn. Phng
thc MuaHang s triu gi cc phng thc thit lp tn hng, ngy sn
xut, v tnh tin ca i tng HangHoa trn. Phng thc mua hng
Phn Thc hnh
T r a n g | 214
C
+
+
ny, ch c chp nhn khi username v password ca khch hng nhp
vo trng vi username v password trong h thng.
Trong chng trnh chnh, hy to hai i tng ca hai lp HangHoa v
KhachHang. Username v Password ca khch hng nhp vo t bn phm.
Kim tra nu username v password trng vi username v password
c thit lp sn th khi mi tin hnh khi to i tng KhachHang,
nu ngc li, hy b giao dch v in thng bo: Xin loi, tai khoan cua quy
khach khong ton tai trong he thong. Xin lien he dang ki voi chi nhanh khach
hang gan nhat. Trong trng hp ng nhp thnh cng, hy thc hin
hnh ng mua hng ca i tng khch hng ny (thao tc mua c
nhp vo t bn phm).
BI THC HNH S 3
Hm to, hm to sao chp, hm bn, con tr this
Lu : trong bi thc hnh chng ny, ch cho php s dng con tr i
tng thc hin. Mi phng n s dng khai bo i tng thng
thng s khng c chp nhn !
1. Quay tr li vi bi thc hnh s 2. Hy to chng trnh bng cch thay
th cc phng thc setter bng cc hm to tng ng. Hy s dng con
tr this trong trng hp ny. B sung phng thc ResetHangHoa cho
lp HangHoa a v cc tham s mc nh cho cc thuc tnh (xu k t
th thit lp v , s nguyn/thc th thit lp v 0). B sung phng thc
HuyBo cho i tng KhachHang hy b vic mua hng. Trong chng
trnh chnh, hy to con tr i tng thc hin hnh ng mua hng v
hnh ng hy b.
2. Xy dng lp im Point v lp hnh trn Round. S dng hm random
to ta ngu nhin cho mt i tng im trong hm to ca i
tng im. Cho trc ta tm ca ng trn, bn knh ca n. Hy
a ra cc kt lun v mt im c khi to nm trong hay ngoi ng
trn. y l phng thc thnh vin ca lp hnh trn.
Khuyn khch: Nn s dng hm bn v lp bn.
Phn Thc hnh
T r a n g | 215
C
+
+
BI THC HNH S 4
Chng cht Ton t trong C++
Xy dng 2 lp s phc v lp phn s. S dng chng cht ton t thc
hin cc thao tc tnh ton sau:
- Lp s phc: phng thc khi to (hoc phng thc setter), phng
thc hm to sao chp, phng thc + (cng hai s phc), - (tr hai s
phc), * (nhn hai s phc), / (chia hai s phc) v phng thc tnh
modul v argument ca s phc. Xy dng hm chng cht ton t
nhp/xut d liu vi lp s phc ny.
- Lp phn s: phng thc khi to, phng thc hm to sao chp,
phng thc + (cng hai phn s), phng thc (tr hai phn s),
phng thc * (nhn hai phn s), phng thc / (chia hai phn s). Xy
dng hm chng cht ton t nhp/xut d liu vi lp phn s ny.
BI THC HNH S 5
K thut tha k trong C++
Xy dng lp HinhKhoi, cha thuc tnh chiu cao (chieucao). Xy dng
hm to tng ng v phng thc hm to sao chp.
Xy dng lp HinhKhoi1 tha k t lp HinhKhoi. B sung thm thuc tnh
chiu di (chieudai). B sung hm to v phng thc hm to sao chp.
Xy dng tip hm tnh th tch cho HinhKhoi1 (bng chieucao*chieudai
2
).
Xy dng lp lp HinhKhoi2 tha k t lp HinhKhoi1. B sung thm thuc
tnh chiu rng (chieurong). B sung hm to v phng thc hm to sao
chp. Qu ti hm tnh th tch cho HinhKhoi2 (bng
chieucao*chieudai*chieurong).
Xy dng lp HinhKhoi3 tha k t lp HinhKhoi. B sung thm thuc tnh
bn knh (bankinh). B sung hm to v phng thc hm to sao chp.
Xy dng hm tnh th tch cho HinhKhoi3 (bng chieucao*Pi*bankinh
2
).
Phn Thc hnh
T r a n g | 216
C
+
+
BI THC HNH S 6
Lp c s tru tng trong C++
Xy dng mt lp c s tru tng Vector cha ba phng thc o thun
ty: TinhDoDai (tnh di), SinGoc (tnh sin ca gc gia hai Vector),
TrucGiao (tm vector trc giao tc vector vung gc vi vector trn), hai
thuc tnh thnh vin l ta x v y, hai phng thc setter (khng s
dng hm to trong trng hp ny, v lp tru tng khng c kh nng
to ra mt s th hin, v hm to cng khng c tha k); hoc s dng
phng thc tham chiu getter.
Xy dng lp Vector2D tha k t lp c s tru tng Vector thc thi
cc phng thc o thun ty nu trn.
Xy dng lp Vector3D tha k t lp c s tru tng Vector (b sung
thm ta z v cc phng thc getter, setter tng ng) thc thi cc
phng thc o thun ty nu trn.
Trong , Vector2D l vector 2 chiu (ch c hai ta x v y); Vector3D l
vector 3 chiu (c ba ta x, y v z).
THANG IM NH GI K NNG
Bi thc hnh s 1 2 3 4 5 6
im 20 15 20 15 20 10
Ngng t 60-70
Cng im 70-80 80-90 90-100
Quy i +1 +1.5 +2
- Mi bi thc hnh c th thc hin nh hoc trn lp, nhng phi np
bi ng thi hn.
- Hn np mi bi thc hnh tng ng vi bui thc hnh. V d: Bi thc
hnh s 1 phi np ng hn vo bui th nht (mi t im ti a). Nu
mun mt bui, tr i 2 im. Nu np tt c cc bi vo bui cui cng, th
ti a ch t Ngng t.
Phn Thc hnh
T r a n g | 217
C
+
+
- im tng kt mn hc gm c 4 ct im qu trnh v 1 im thi. im
Qu trnh 1 = im chuyn cn; im Qu trnh 2 s tng ng vi trung
bnh cng ca 2 bi trc nghim; im Qu trnh 3 = im Thc hnh/10,
im Qu trnh 4 = im Qu trnh 3 + Quy i. Nu ct im qu trnh
no vt ngng 10, th phn d s c chuyn sang cc ct im qu
trnh khc. im tng kt s c tnh theo cng thc:
(
1
+
2
+
3
+
4
)
8
+
2
Phn Bi tp
Trang | 218
BI TP NNG CAO
Bi tp 1.
Xy dng cc hm tnh cc tng sau y:
=
1
2
+
2
3
++
1
= 1! +2! ++ !
= 1 2 +3 + (1)
+1
.
=
1!
+
+
2!
2
2
++
!
+(1)
+1
.
= 1! +3! ++ (2 1)!
Trong : n , x v k l cc tham s nhp vo t bn phm.
Bi tp 2.
Khai bo chui k t bng cch s dng con tr. Sau xy dng cc hm
thc hin cc cu sau:
- m s k t c gi tr l a.
- o xu k t.
- o t.
- m s t.
- Nhm cc k t cng loi. V d:
Xu ban u: aaabbbaacbd
Xu in ra: 5a4b1c1d
- Thut ton nn d liu RLE (Run length Encoding) l thut ton nn
khng mt d liu lossless. N c s dng nn nh i vi nh dng
bmp. Thut ton RLE s thc hin m s k t ging nhau v lin tip, sau
Phn Bi tp
T r a n g | 219
C
+
+
, s thay th ton b dy k t ging nhau ny bng s k t m c
sau l k t tng ng. V d:
Xu ban u: aaaabbbbcdddAA
Xu sau khi nn: 4a4b1c3d2A
+ Hy xy dng hm RLE nn d liu. Vi d liu nhp vo t bn phm.
+ Hy xy dng hm IRLE gii nn d liu. Vi d liu nhp vo t bn
phm.
Bi tp 3.
Xy dng cc hm thc hin cc chc nng sau y trn mng mt chiu
bng hai cch: khai bo theo kiu thng thng v khai bo bng con tr.
- Hm nhp d liu cho mng 1 chiu.
- Hm xut d liu cho mng 1 chiu.
- Hm tnh tng cc phn t ca mng.
- Hm tnh tng cc phn t ca mng l s nguyn t.
- Hm tnh tng cc phn t ca mng l s chnh phng.
- Hm tnh tng cc s nguyn t ca mng ln hn 10 v nh hn 100.
- Hm tnh tng cc phn t ca mng l s chnh phng chn.
- Hm m s phn t ca mng l s nguyn t.
- Hm m s phn t ca mng l s chnh phng.
- Hm m s phn t ca mng l s nguyn t ln hn 10 v nh hn 50.
- Hm m s phn t ca mng l s chnh phng chn.
- Hm tm kim ch s phn t c gi tr x ca mng.
- Hm tnh gi tr trung bnh ca mng.
- Hm tm ch s ca phn t c gi tr nh nht.
- Hm tm ch s ca phn t c gi tr ln nht.
Phn Bi tp
T r a n g | 220
C
+
+
- Hm sp xp mng theo th t tng dn (c th s dng thut ton sp
xp bt k).
- Hm tnh gi tr trung bnh ca cc phn t ca mng c gi tr chn.
- Hm dn tt c cc phn t chn v mt pha, cc phn t l v mt pha.
V d, mng ban u l: 1 4 5 6 2 3 th kt qu s l 1 5 3 4 6 2.
- Hm xc nh phn t c gi tr gn vi gi tr trung bnh ca mng nht.
- Hm y cc phn t ca mng ln n v tr. V d mng ban u l 1 3 2 5 4
7 9. Nu n = 2, th mng thu c s l 7 9 1 3 2 5 4.
B sung hm main v cc th vin nhn c mt chng trnh hon
chnh. Cc hm cn c khai bo theo prototype.
Bi tp 4.
Xy dng cc hm thc hin cc chc nng sau y trn mng hai chiu
bng hai cch khai bo: theo kiu thng thng v khai bo bng con tr.
- Hm nhp gi tr cho mng hai chiu.
- Hm xut gi tr ca mng hai chiu theo dng ma trn.
- Hm cng hai ma trn.
- Hm nhn hai ma trn.
- Hm thay th tt c cc phn t c gi tr l ca ma trn thnh 0.
- Hm thay th tt c cc phn t m ca ma trn bng phn t dng
tng ng.
- Hm thay th cc phn t c gi tr nh hn gi tr trung bnh ca ma trn
bng phn t 0.
- Hm tnh ly tha ca ma trn vung.
Cc hm yu cu c xy dng theo prototype. Cc ma trn (mng hai
chiu) trong cc bi tp trn l ma trn vung. B sung hm main v cc th
vin cn thit c mt chng trnh hon chnh.
Bi tp 5.
Phn Bi tp
T r a n g | 221
C
+
+
Hy chn la cc phng php ph hp trong lp trnh hng i tng
lp trnh gii cc bi ton sau y.
a) Xy dng lp TamGiac (tam gic) gm c ba cnh vi cc phng thc
sau:
- Cc phng thc khi to cho tam gic: khng tham s, c tham s v hm
to sao chp.
- Cc phng thc Getter.
- Phng thc KiemTra cho bit n c phi l mt tam gic thc s
khng.
- Phng thc tnh din tch tam gic nu n l mt tam gic thc s.
- Cc phng thc nhp/xut cho tam gic. Xy dng theo ton t.
b) Xy dng lp Diem (im) gm c 3 ta x, y, z v cc phng thc
sau:
- Cc phng thc khi to.
- Cc phng thc Getter.
- Phng thc tnh khong cch gia hai im.
Xy dng lp Vector gm c hai thuc tnh tng ng vi hai i tng
Diem (im u v im mt). Hy b sung cc phng thc sau cho lp
Vector:
- Cc phng thc khi to.
- Cc phng thc Getter.
- Phng thc tnh di ca vector.
- Phng thc cng hai vector. Xy dng theo ton t.
- Phng thc tnh tch v hng ca hai vector.
- Phng thc tnh cosin gc gia hai vector.
- Phng thc tnh tch hu hng ca hai vector.
Phn Bi tp
T r a n g | 222
C
+
+
Xy dng lp HinhCau (hnh cu) gm hai thuc tnh l i tng Diem
tng ng vi tm hnh cu v bn knh R. Hy b sung cc phng thc
sau cho lp HinhCau:
- Cc phng thc khi to.
- Cc phng thc Getter.
- Phng thc tnh din tch hnh cu.
- Phng thc xc nh v tr tng i gia hnh cu v mt im.
- Phng thc xc nh v tr tng i gia hai hnh cu.
Yu cu chung: hy b sung cc hm ton t nhp xut cho mi lp i
tng trn.
Bi 6.
Xy dng lp ConNguoi gm c hai thuc tnh thnh vin l: tn v tui. Cc
phng thc khi to v cc phng thc Getter tng ng.
Lp NhanVien tha k t lp ConNguoi, bng cch b sung thm hai thuc
tnh l: m nhn vin, lng v mc ng gp (tnh theo lng). B sung
phng thc khi to v cc phng thc Getter.
Cc cng ty qun l nhn vin ca mnh. i tng CongTy c cc thuc
tnh: tn cng ty, mc ng gp chun, ngn sch hin c, ngun thu theo
thng, ngun chi theo thng. Gi s ngun chi ny khng bao gm chi ph
tr lng cho nhn vin. i tng CongTy c phng thc tuyn dng
tuyn thm nhn vin, v phng thc sa thi sa thi nhn vin.
Mt nhn vin s b sa thi, nu mc ng gp ca h nh hn mc ng
gp chun ca cng ty.
Mt cng ty s tuyn b ph sn nu vn iu l ca h b m. Vn iu l l
tng ngn sch hin c cng vi mc ng gp ca mi nhn vin tr cho
ngun chi theo thng v tr tip cho tng lng chi tr cho ton b nhn
vin. Hy xy dng chng trnh thc thi m t ny.
Bi 7.
Hy xy dng chng trnh ng dng theo m t sau.
Phn Bi tp
T r a n g | 223
C
+
+
- Lp i tng ngi dng gm cc thuc tnh: username, password, cu
hi bo mt v cu tr li. B sung cc phng thc tng ng cho ph
hp. Khi chy chng trnh, ngi dng nhp vo username v password.
Nu trng khp vi username v password to trong h thng th thng
bo ng nhp thnh cng.
- Sau khi ng nhp thnh cng, ngi dng c quyn triu gi cc phng
thc tnh ton ca lp s phc v phn s (cn xy dng thm hai lp ny).
- Nu ngi dng ng nhp khng thnh cng, yu cu h xc minh rng
c phi h qun mt khu hay khng bng mt cu hi bo mt. Nu tr
li ng, th cho php h thay i mt khu.
- Nu ng nhp khng thnh cng v tr li sai cu hi bo mt, hy in ra
thng bo Bn cha phi l thnh vin, hy chn y ng k v chn
n thot.
Bi 8.
Mi i tng Shape trong Microsoft Word u c c cc thuc tnh: mu
vin, mu nn, ni dung vn bn bn trong, th bc, tnh trng ang c
chn hay khng v cc phng thc khi to, thay i gi tr cho mi thuc
tnh (phng thc setter).
Hy to ra mt mng 10 phn t Shape. Cc gi tr th bc khng c
trng nhau (v phn b t 0-9). Trong 10 i tng ny, ti mi thi im,
ch c ng mt i tng ang tnh trng chn. Nu i tng tnh
trng chn, th ta mi c quyn thay i gi tr cho n.
Hy b sung thm cc phng thc cn thit thc hin cc yu cu trn.
Bi 9.
Hy phn tch m hnh qun l sinh vin trong trng i hc. T m hnh
phn tch c, hy xy dng chng trnh qun l sinh vin. Trong m
hnh ny, yu cu qun l khng di 10 lp i tng.
Gi : Cc lp i tng trong m hnh ny bao gm Sinh vin, Gio vin
ch nhim, Phng Cng tc hc sinh sinh vin, Phng o to, Phng Ti
chnh, Khoa chuyn mn, on TN, Lp, Phng hc, Mn hc
Bi 10.
Phn Bi tp
T r a n g | 224
C
+
+
Hy phn tch theo hng i tng m hnh qun l Nh nc thu nh
c cho bn di y. T m hnh phn tch , hy xy dng chng
trnh qun l Nh nc thu nh. Bit rng, tng tc gia cc i tng
c tnh bc cu.
Hnh 23 M hnh tng tc qun l Nh nc.
B GD
B Y t
B Cng Thng
B Quc Phng
B Nng Nghip
S GD
S Y t
C s
K tha Tng tc
Phn Bi tp
T r a n g | 225
C
+
+
BI TP LN
D n 1. Phn tch, thit k v xy dng chng trnh qun l th vin.
Trong chng trnh ny, cn m bo cc chc nng sau y:
- Trong m hnh qun l ny cn m bo cc thng tin: m sch, tn sch,
tn tc gi, nm xut bn, nh xut bn, s trang, gi v s lng.
- Cho php b sung thm mt hoc nhiu quyn sch.
- Cp nhp li s lng sch khi c ngi mn/tr sch.
- Tm kim sch theo tn tc gi hoc tn sch.
- Kim tra tnh trng sch cn hay khng.
- Chng trnh thc thi trn mn hnh Console. C menu ty chn. D liu
c lu tr vo tp tin data.dat di dng m ha nh phn.
D n 2. Phn tch, thit k v xy dng chng trnh qun l website bn
my tnh. Trong chng trnh trnh ny, cn m bo cc chc nng sau
y:
- Trong m hnh qun l ny, cn m bo cc thng tin: m hng, mu sc,
nc sn xut, hng, gi tin, s lng, thi gian bo hnh, c ci t h
iu hnh hay khng, a ch khc hng, s in thoi khch hng.
- Tm kim mt hng theo tn hng, gi tin v nc sn xut.
- Kim tra tnh trng cn hng hay khng.
- B sung (nhp thm hng) hoc xa b (bn hng).
- Chng trnh thc thi trn mn hnh Console. C menu ty chn. D liu
c lu tr vo tp tin data.dat di dng m ha nh phn.
D n 3. Phn tch, thit k v xy dng chng trnh qun l nhn vin
trong cng ty. Trong chng trnh trnh ny, cn m bo cc chc nng
sau y:
Phn Bi tp
T r a n g | 226
C
+
+
- Trong m hnh qun l ny, cn m bo cc thng tin: m nhn vin, h
tn nhn vin, ngy thng nm sinh, h s lng, nm bt u cng tc, tnh
trng hn nhn, b phn lm vic.
- Tm kim nhn vin theo h tn.
- Thng k s lng nhn vin theo b phn lm vic
- B sung (tuyn dng) hoc xa b (kt thc hp ng).
- Chng trnh thc thi trn mn hnh Console. C menu ty chn. D liu
c lu tr vo tp tin data.dat di dng m ha nh phn.
D n 4. Phn tch, thit k v xy dng game FarmVille (mt game ni
ting trn Facebook). Trong game ny, cn m bo cc chc nng sau y:
- Trong m hnh qun l ny, cn m bo cc thng tin: ngi chi
email, tn ngi chi, tng s tin. Cc i tng trong game: tn i
tng, tr gi, thi gian khi to, thi gian thu hoch.
- Tm kim ngi chi theo h tn.
- Thng k s tin thu c ca mt ngi chi.
- B sung ngi chi hoc i tng trong game.
- Khi thu hoch mt i tng, th tr gi ca i tng s c cp nhp
vo cho tng tin ca ngi chi, ng thi i tng cng s b hy. i
tng ch c th c thu hoch nu: thi gian hin ti thi gian khi to
>= thi gian thu hoch.
- Chng trnh c menu iu khin, khng yu cu to giao din ha.
Ghi ch: Cc sinh vin np bi thc hnh vo trc bui th 5 s c c
hi nhn c bi tp ln. Khi nhn c bi tp ln, ngoi yu cu b sung
ca ging vin, sinh vin cn thc thi thn cc yu cu sau:
- Phn tch m hnh ln giy (np bn in).
Phn Bi tp
T r a n g | 227
C
+
+
- Np chng trnh hon chnh. Trong , chng trnh hon chnh v tp
tin word (*.doc; *.docx) phi c ghi ln a CD, bn ngoi a c ghi: tn
sinh vin, lp v Bi tp ln: Lp trnh hng i tng C++. Ging vin
hng dn: ..
Trang | 228
DANH SCH HNH
Hnh 1 To mi d n trong CodeBlocks ................................................................ 10
Hnh 2 Khi to thn phng thc ............................................................................ 11
Hnh 3 Cu hnh MinGW trong Eclipse Helios ....................................................... 12
Hnh 4 Chn ng dn n th mc bin ca MinGW ...................................... 13
Hnh 5 - To mi d n ....................................................................................................... 13
Hnh 6 - Cu trc th mc ca mt d n ................................................................... 14
Hnh 7 - Bin dch mt d n ........................................................................................... 14
Hnh 8 - Hp thoi to mi class .................................................................................... 15
Hnh 9 - Giao din tng th ca Visual Studio 2010 ............................................... 17
Hnh 10 - To d n Win32 Console ............................................................................. 18
Hnh 11 - Win32 Application Wizard ........................................................................... 18
Hnh 12 - B sung thm mt tp tin .............................................................................. 20
Hnh 13 - B sung thm lp i tng ........................................................................ 20
Hnh 14 - To lp bng Class Wizard ........................................................................... 21
Hnh 15 - Xem biu lp ................................................................................................. 22
Hnh 16 S minh ha vic s dng hm ............................................................ 72
Hnh 17 Tham chiu trong con tr ............................................................................. 94
Hnh 18 Tham chiu ngc trong con tr ............................................................... 95
Hnh 19 Tng/Gim a ch ca con tr ................................................................ 101
Hnh 20 Minh ha s lp ....................................................................................... 125
Hnh 21 Tnh k tha .................................................................................................... 153
Hnh 22 Lp c s o .................................................................................................... 164
Hnh 23 M hnh tng tc qun l Nh nc. .................................................. 224
T r a n g | 229
C
+
+
TRA CU T KHA
MT S THUT NG ANH-VIT C S DNG TRONG GIO TRNH
Nguyn bn ting Anh Dch sang ting Vit
Abstract base class Lp c s tru tng
Abstraction Tnh tru tng
Arithmetic operators Ton t s hc
Assignment operators Ton t gn
Base class Lp c s/ Lp cha
Bitwise operators Ton t dch bit
Child class/SubClass Lp con
Class Lp
Comma operators Ton t phn tch
Compound assignment operator Ton t gn hp nht
Conditional operators Ton t iu kin
Encapsulation Tnh ng gi
Exception Ngoi l
Explicit type casting operators Ton t chuyn i kiu d liu
Increase and decrease operators Ton t tng gim
Information hiding Che du/n du thng tin
Inheritance Tnh tha k/ Tnh k tha
Instance S th hin
Logical operators Ton t logic
Multiple inheritance Tnh a tha kt/Tnh a k tha
Object i tng
Operator Ton t
Operator overloading Chng cht ton t
Overload Chng cht
Override Qu ti
Polymorphism Tnh a hnh
Prototype Nguyn mu
Pure virtual function Hm o thun ty
Reference Tham chiu
Relational and equality operators Ton t quan h v so snh
T r a n g | 230
C
+
+
TI LIU THAM KHO
[1]. http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp
. Mc: XL C/C++ V8.0 for AIX. Language Reference.
[2]. http://msdn.microsoft.com/en-us/library/3bstk3k5(v=VS.100).aspx
[3]. Ivor Horton. Beginning Visual C++ 2010. Wrox pub.
[4]. C++ for Mathematicians. An introduction for Student and
Professional. Edward Scheinerman. Chapman & Hall/CRC.
[5]. Website: http://www.cplusplus.com/doc/tutorial