You are on page 1of 196

TRNG I HC S PHM TPHCM

Khoa Ton Tin hc

Ti liu tham kho mn

NGN NG LP TRNH C/C++

Ging vin: LNG TRN HY HIN


Email: hienlth@hcmup.edu.vn
Web Course: http://fit.hcmup.edu.vn/~hienlth/C

TPHCM 2009

LI NI U
Ngn ng lp trnh (NNLT) C/C++ l mt trong nhng ngn ng lp trnh hng i
tng mnh v ph bin hin nay do tnh mm do v a nng ca n. Khng ch cc ng
dng c vit trn C/C++ m c nhng chng trnh h thng ln u c vit hu ht
trn C/C++. C++ l ngn ng lp trnh hng i tng c pht trin trn nn tng ca C,
khng nhng khc phc mt s nhc im ca ngn ng C m quan trng hn, C++ cung
cp cho ngi s dng (NSD) mt phng tin lp trnh theo k thut mi: lp trnh hng
i tng. y l k thut lp trnh c s dng hu ht trong cc ngn ng mnh hin
nay, c bit l cc ngn ng hot ng trong mi trung Windows nh Microsoft Access,
Visual C++, VB.NET, C++.NET, C#,
Hin nay NNLT C/C++ c a vo ging dy trong hu ht cc trng i hc,
Cao ng thay th mt s NNLT c nh Pascal N c th mang nhiu tn gi khc
nh Tin hc c s, K thut lp trnh, Ngn ng lp trnh bc cao, Ti liu ny ch cp
mt phn nh n k thut lp trnh vi C++, bn cnh cng ni mt s im khc bit so
vi C. V k thut lp trnh hng i tng (trong C++) s c trang b bi mt gio
trnh khc. Tuy nhin ngn gn, trong ti liu ny tn gi C/C++ s c chng ti thay
bng C++.
Ni dung ti liu ny gm 8 chng. Phn u gm cc chng t 1 n 5 ch yu
trnh by v NNLT C++ trn nn tng ca k thut lp trnh cu trc. Cc chng cn li
(chng 6, 7 v 8) s trnh by cc cu trc c bn trong C++ l k thut ng gi (lp
v i tng), nh ngha php ton mi cho lp v lm vic vi file (sinh vin t tham
kho, ging vin ch gii thiu).
Tuy c nhiu c gng nhng do thi gian v trnh ngi vit c hn nn chc
chn khng trnh khi sai st, v vy rt mong nhn c s gp ca bn c ti liu
ny ngy cng mt hon thin hn.

Mi ng gp, xin gi v a ch:


LNG TRN HY HIN
hienlth@hcmup.edu.vn

MC LC
CHNG I.

CC KHI NIM C BN CA C++.................................................................. 9

I.1. CC YU T C BN ........................................................................................................................................ 9
I.1.1.
Bng k t ca C++ .................................................................................................................................... 9
I.1.2.
T kho ....................................................................................................................................................... 9
I.1.3.
Tn gi ...................................................................................................................................................... 10
I.1.4.
Ch thch trong chng trnh .................................................................................................................... 10
I.2. CC BC TO V THC HIN MT CHNG TRNH ...................................................................... 11
I.2.1.
Qui trnh vit v thc hin chng trnh ................................................................................................... 11
I.2.2.
Son tho tp tin chng trnh ngun ....................................................................................................... 11
I.2.3.
Dch chng trnh ..................................................................................................................................... 12
I.2.4.
Chy chng trnh .................................................................................................................................... 12
I.3. VO/RA TRONG C++ ....................................................................................................................................... 12
I.3.1.
Vo d liu t bn phm ........................................................................................................................... 13
I.3.2.
In d liu ra mn hnh ............................................................................................................................... 13
I.3.3.
nh dng thng tin cn in ra mn hnh .................................................................................................... 15
I.3.4.
Vo/ra trong C .......................................................................................................................................... 16
I.3.5.
In kt qu ra mn hnh .............................................................................................................................. 16
I.3.6.
Nhp d liu t bn phm ......................................................................................................................... 18

CHNG II.

KIU D LIU, BIU THC V CU LNH .................................................. 20

II.1.
KIU D LIU N GIN ......................................................................................................................... 20
II.1.1. Khi nim v kiu d liu ......................................................................................................................... 20
II.1.2. Kiu k t ................................................................................................................................................. 21
II.1.3. Kiu s nguyn ......................................................................................................................................... 22
II.1.4. Kiu s thc .............................................................................................................................................. 22
II.2.
HNG - KHAI BO V S DNG HNG ................................................................................................... 22
II.2.1. Hng nguyn ............................................................................................................................................. 22
II.2.2. Hng thc .................................................................................................................................................. 23
a.
Dng du phy tnh ........................................................................................................................................ 23
b.
Dng du phy ng ...................................................................................................................................... 23
II.2.3. Hng k t ................................................................................................................................................. 23
a.
Cch vit hng ............................................................................................................................................... 23
b.
Mt s hng thng dng ................................................................................................................................ 23
II.2.4. Hng xu k t ........................................................................................................................................... 24
II.2.5. Khai bo hng ........................................................................................................................................... 24
II.3.
BIN - KHAI BO V S DNG BIN ....................................................................................................... 25
II.3.1. Khai bo bin ............................................................................................................................................ 25
a.
Khai bo khng khi to ................................................................................................................................ 26
b.
Khai bo c khi to ...................................................................................................................................... 26
II.3.2. Phm vi ca bin ....................................................................................................................................... 26
II.3.3. Gn gi tr cho bin (php gn)................................................................................................................. 27
II.3.4. Mt s im lu v php gn ................................................................................................................. 27
II.4.
PHP TON, BIU THC V CU LNH ................................................................................................. 28
II.4.1. Php ton .................................................................................................................................................. 28
a.
Cc php ton s hc: +, -, *, /, % ................................................................................................................. 28
b.
Cc php ton t tng, gim: i++, ++i, i--, --i ................................................................................................ 28
c.
Cc php ton so snh v lgic ...................................................................................................................... 29
II.4.2. Cc php gn ............................................................................................................................................. 30
II.4.3. Biu thc ................................................................................................................................................... 31
a.
Th t u tin ca cc php ton ................................................................................................................... 31
b.
Php chuyn i kiu ..................................................................................................................................... 32
II.4.4. Cu lnh v khi lnh ............................................................................................................................... 33

II.5.
TH VIN CC HM TON HC .............................................................................................................. 33
II.5.1. Cc hm s hc ......................................................................................................................................... 34
II.5.2. Cc hm lng gic .................................................................................................................................. 34

CHNG III.

CU TRC IU KHIN V D LIU KIU MNG .................................... 37

III.1.
CU TRC R NHNH ................................................................................................................................ 37
III.1.1.
Cu lnh iu kin if ............................................................................................................................ 37
a.
ngha .......................................................................................................................................................... 37
b.
C php .......................................................................................................................................................... 37
c.
c im........................................................................................................................................................ 37
d.
V d minh ho .............................................................................................................................................. 38
III.1.2.
Cu lnh la chn switch ..................................................................................................................... 39
a.
ngha .......................................................................................................................................................... 39
b.
C php .......................................................................................................................................................... 39
c.
Cch thc hin ............................................................................................................................................... 39
d.
V d minh ho .............................................................................................................................................. 39
III.1.3.
Cu lnh nhy goto............................................................................................................................... 40
a.
ngha .......................................................................................................................................................... 40
b.
C php .......................................................................................................................................................... 41
c.
V d minh ho .............................................................................................................................................. 41
III.2.
CU TRC LP ............................................................................................................................................ 41
III.2.1.
Lnh lp for .......................................................................................................................................... 42
a.
C php .......................................................................................................................................................... 42
b.
Cch thc hin ............................................................................................................................................... 42
c.
V d minh ho .............................................................................................................................................. 42
d.
c im........................................................................................................................................................ 43
e.
Lnh for lng nhau ........................................................................................................................................ 44
III.2.2.
Lnh lp while ...................................................................................................................................... 45
a.
C php .......................................................................................................................................................... 45
b.
Thc hin ....................................................................................................................................................... 45
c.
c im........................................................................................................................................................ 45
d.
V d minh ho .............................................................................................................................................. 45
III.2.3.
Lnh lp do ... while ............................................................................................................................. 48
a.
C php .......................................................................................................................................................... 48
b.
Thc hin ....................................................................................................................................................... 48
c.
c im........................................................................................................................................................ 48
d.
V d minh ho .............................................................................................................................................. 48
III.2.4.
Li ra ca vng lp: break, continue .................................................................................................... 49
a.
Lnh break ..................................................................................................................................................... 49
b.
Lnh continue ................................................................................................................................................ 49
III.2.5.
So snh cch dng cc cu lnh lp ..................................................................................................... 50
III.3.
MNG D LIU ........................................................................................................................................... 50
III.3.1.
Mng mt chiu ................................................................................................................................... 50
a.
ngha .......................................................................................................................................................... 50
b.
Khai bo......................................................................................................................................................... 51
c.
Cch s dng ................................................................................................................................................. 52
d.
V d minh ho .............................................................................................................................................. 52
III.3.2.
Xu k t............................................................................................................................................... 54
a.
Khai bo......................................................................................................................................................... 54
b.
Cch s dng ................................................................................................................................................. 54
c.
Phng thc nhp xu (#include <iostream.h>) ............................................................................................ 55
d.
Mt s hm x l xu (#include <cstring>) ................................................................................................... 56
III.4.
a.
b.
c.

MNG HAI CHIU ....................................................................................................................................... 60


Khai bo......................................................................................................................................................... 60
S dng .......................................................................................................................................................... 60
V d minh ho .............................................................................................................................................. 61

CHNG IV.

HM V CHNG TRNH ................................................................................ 68

IV.1.
CON TR V S HC A CH .................................................................................................................. 68
IV.1.1.
a ch, php ton & ............................................................................................................................ 68
IV.1.2.
Con tr ................................................................................................................................................. 69
a.
ngha .......................................................................................................................................................... 69
b.
Khai bo bin con tr..................................................................................................................................... 69
c.
S dng con tr, php ton * ......................................................................................................................... 69
IV.1.3.
Cc php ton vi con tr .................................................................................................................... 70
a.
Php ton gn................................................................................................................................................. 70
b.
Php ton tng gim a ch ........................................................................................................................... 70
c.
Php ton t tng gim .................................................................................................................................. 71
d.
Hiu ca 2 con tr .......................................................................................................................................... 71
e.
Php ton so snh .......................................................................................................................................... 71
IV.1.4.
Cp pht ng, ton t cp pht, thu hi new, delete ........................................................................... 72
IV.1.5.
Con tr v mng, xu k t ................................................................................................................... 73
a.
Con tr v mng 1 chiu ................................................................................................................................ 73
b.
Con tr v xu k t ....................................................................................................................................... 74
c.
Con tr v mng hai chiu ............................................................................................................................. 74
IV.1.6.
Mng con tr ........................................................................................................................................ 76
a.
Khi nim chung ............................................................................................................................................ 76
b.
Mng xu k t ............................................................................................................................................... 76
IV.2.
HM .............................................................................................................................................................. 77
IV.2.1.
Khai bo v nh ngha hm................................................................................................................. 77
a.
Khai bo......................................................................................................................................................... 77
b.
nh ngha hm ............................................................................................................................................. 77
c.
Ch v khai bo v nh ngha hm ............................................................................................................ 79
IV.2.2.
Li gi v s dng hm........................................................................................................................ 79
IV.2.3.
Hm vi i mc nh .......................................................................................................................... 80
IV.2.4.
Khai bo hm trng tn ........................................................................................................................ 81
IV.2.5.
Bin, i tham chiu ............................................................................................................................ 82
IV.2.6.
Cc cch truyn tham i ..................................................................................................................... 83
a.
Truyn theo tham tr ...................................................................................................................................... 83
b.
Truyn theo dn tr........................................................................................................................................ 84
c.
Truyn theo tham chiu ................................................................................................................................. 86
IV.2.7.
Hm v mng d liu ........................................................................................................................... 87
a.
Truyn mng 1 chiu cho hm....................................................................................................................... 87
b.
Truyn mng 2 chiu cho hm....................................................................................................................... 88
c.
Gi tr tr li ca hm l mt mng ............................................................................................................... 90
d.
i v gi tr tr li l xu k t ..................................................................................................................... 93
e.
i l hng con tr ........................................................................................................................................ 94
IV.2.8.
Con tr hm.......................................................................................................................................... 95
a.
Khai bo......................................................................................................................................................... 95
b.
Khi to ......................................................................................................................................................... 95
c.
S dng con tr hm ...................................................................................................................................... 95
d.
Mng con tr hm .......................................................................................................................................... 96
IV.3.
QUI .......................................................................................................................................................... 97
IV.3.1.
Khi nim qui .................................................................................................................................. 97
IV.3.2.
Lp cc bi ton gii c bng qui ................................................................................................ 98
IV.3.3.
Cu trc chung ca hm qui ............................................................................................................ 98
IV.4.
T CHC CHNG TRNH ....................................................................................................................... 99
IV.4.1.
Cc loi bin v phm vi ...................................................................................................................... 99
a.
Bin cc b .................................................................................................................................................... 99
b.
Bin ngoi .................................................................................................................................................... 100
IV.4.2.
Bin vi mc ch c bit ................................................................................................................. 102
a.
Bin hng v t kho const .......................................................................................................................... 102
b.
Bin tnh v t kho static ........................................................................................................................... 103
c.
Bin thanh ghi v t kho register ............................................................................................................... 103

d.
Bin ngoi v t kho extern ....................................................................................................................... 104
IV.4.3.
Cc ch th tin x l .......................................................................................................................... 105
a.
Ch th bao hm tp tin #include .................................................................................................................. 105
b.
Ch th macro #define .................................................................................................................................. 105
c.
Cc ch th bin dch c iu kin #if, #ifdef, #ifndef ................................................................................. 106

CHNG V.

D LIU KIU CU TRC V HP .............................................................. 113

V.1.
KIU CU TRC ........................................................................................................................................ 113
V.1.1. Khai bo, khi to ................................................................................................................................... 113
V.1.2. Truy nhp cc thnh phn kiu cu trc.................................................................................................. 114
V.1.3. Php ton gn cu trc ............................................................................................................................ 115
V.1.4. Cc v d minh ho ................................................................................................................................. 116
V.1.5. Hm vi cu trc ..................................................................................................................................... 118
a.
Con tr v a ch cu trc ........................................................................................................................... 118
b.
a ch ca cc thnh phn ca cu trc ...................................................................................................... 120
c.
i ca hm l cu trc ............................................................................................................................... 120
d.
Gi tr hm l cu trc ................................................................................................................................. 124
V.1.6. Cu trc vi thnh phn kiu bit ............................................................................................................. 127
a.
Trng bit .................................................................................................................................................... 127
b.
c im...................................................................................................................................................... 127
V.1.7. Cu lnh typedef ..................................................................................................................................... 128
1.

Hm sizeof() ..................................................................................................................................................... 128

V.2.
CU TRC T TR V DANH SCH LIN KT ..................................................................................... 128
V.2.1. Cu trc t tr ......................................................................................................................................... 129
V.2.2. Khi nim danh sch lin kt .................................................................................................................. 130
V.2.3. Cc php ton trn danh sch lin kt ..................................................................................................... 131
a.
To phn t mi ........................................................................................................................................... 131
b.
Chn phn t mi vo gia .......................................................................................................................... 131
c.
Xo phn t th i khi danh sch ................................................................................................................ 132
d.
Duyt danh sch........................................................................................................................................... 132
e.
Tm kim ..................................................................................................................................................... 132
V.3.
KIU HP................................................................................................................................................... 135
V.3.1. Khai bo .................................................................................................................................................. 135
V.3.2. Truy cp .................................................................................................................................................. 136
V.4.

KIU LIT K............................................................................................................................................. 136

CHNG VI.

LP V I TNG ........................................................................................ 142

VI.1.
LP TRNH C CU TRC V LP TRNH HNG I TNG ....................................................... 142
VI.1.1.
Phng php lp trnh cu trc .......................................................................................................... 142
VI.1.2.
Phng php lp trnh hng i tng ............................................................................................ 143
VI.2.
LP V I TNG ................................................................................................................................. 145
VI.2.1.
Khai bo lp ....................................................................................................................................... 145
VI.2.2.
Khai bo cc thnh phn ca lp (thuc tnh v phng thc) .......................................................... 146
a.
Cc t kha private v public ...................................................................................................................... 146
b.
Cc thnh phn d liu (thuc tnh) ............................................................................................................. 146
c.
Cc phng thc (hm thnh vin).............................................................................................................. 146
VI.2.3.
Bin, mng v con tr i tng ........................................................................................................ 147
a.
Thuc tnh ca i tng ............................................................................................................................. 148
b.
S dng cc phng thc ............................................................................................................................ 148
c.
Con tr i tng ......................................................................................................................................... 149
VI.3.
I CA PHNG THC, CON TR this .............................................................................................. 151
VI.3.1.
Con tr this l i th nht ca phng thc ..................................................................................... 151
VI.3.2.
Tham s ng vi i con tr this........................................................................................................ 151
VI.4.

HM TO (Constructor) ............................................................................................................................. 152

VI.4.1.
Hm to (hm thit lp)...................................................................................................................... 152
a.
Cch vit hm to ........................................................................................................................................ 152
b.
Dng hm to trong khai bo ....................................................................................................................... 153
c.
Dng hm to trong cp pht b nh ........................................................................................................... 153
d.
Dng hm to biu in cc i tng hng ........................................................................................... 154
e.
V d minh ha ............................................................................................................................................ 154
VI.4.2.
Lp khng c hm to v hm to mc nh ...................................................................................... 155
a.
Nu lp khng c hm to ........................................................................................................................... 155
b.
Nu trong lp c t nht mt hm to...................................................................................................... 156
VI.4.3.
Hm to sao chp (Copy Constructor) ............................................................................................... 157
a.
Hm to sao chp mc nh ......................................................................................................................... 157
b.
Cch xy dng hm to sao chp................................................................................................................. 159
c.
Khi no cn xy dng hm to sao chp...................................................................................................... 159
d.
V d v hm to sao chp ........................................................................................................................... 161
VI.5.
HM HY (Destructor)............................................................................................................................... 163
VI.5.1.
Hm hy mc nh ............................................................................................................................. 163
VI.5.2.
Quy tc vit hm hy ......................................................................................................................... 163
VI.5.3.
Vai tr ca hm hy trong lp DT ..................................................................................................... 164
VI.6.
CC HM TRC TUYN (inline) .............................................................................................................. 164
VI.6.1.
u nhc im ca hm .................................................................................................................... 164
VI.6.2.
Cc hm trc tuyn ............................................................................................................................ 165
VI.6.3.
Cch bin dch v dng hm trc tuyn ............................................................................................. 165
VI.6.4.
S hn ch ca trnh bin dch ........................................................................................................... 166

CHNG VII.

HM BN, NH NGHA PHP TON CHO LP .................................... 168

VII.1. HM BN (Friend function) ....................................................................................................................... 168


VII.1.1.
Hm bn ............................................................................................................................................. 168
VII.1.2.
Tnh cht ca hm bn ....................................................................................................................... 169
VII.1.3.
Hm bn ca nhiu lp....................................................................................................................... 170
VII.2. NH NGHA PHP TON CHO LP ...................................................................................................... 173
VII.2.1.
Tn hm ton t ................................................................................................................................. 174
VII.2.2.
Cc i ca hm ton t ..................................................................................................................... 174
VII.2.3.
Thn ca hm ton t ......................................................................................................................... 174
a.
Cch dng hm ton t ................................................................................................................................ 175
b.
Cc v d v nh ngha chng ton t ........................................................................................................ 175

CHNG VIII.

CC DNG NHP/XUT V FILE............................................................. 180

VIII.1. NHP/XUT VI CIN/COUT ..................................................................................................................... 180


VIII.1.1. Ton t nhp >> ................................................................................................................................. 181
VIII.1.2. Cc hm nhp k t v xu k t ......................................................................................................... 182
a.
Nhp k t .................................................................................................................................................... 182
b.
Nhp xu k t ............................................................................................................................................. 182
VIII.1.3. Ton t xut << .................................................................................................................................. 183
VIII.2. NH DNG................................................................................................................................................ 183
VIII.2.1. Cc phng thc nh dng ............................................................................................................... 184
a.
Ch nh rng cn in ............................................................................................................................... 184
b.
Ch nh k t chn vo khong trng trc gi tr cn in ........................................................................... 184
c.
Ch nh chnh xc (s s l thp phn) cn in ....................................................................................... 184
2.

Cc c nh dng.............................................................................................................................................. 184
ppppp.
Nhm cn l ....................................................................................................................................... 185
d.
Nhm nh dng s nguyn ......................................................................................................................... 185
e.
Nhm nh dng s thc .............................................................................................................................. 185
f.
Nhm nh dng hin th ............................................................................................................................. 186
VIII.2.2. Cc b v hm nh dng ................................................................................................................... 186
a.
Cc b nh dng ......................................................................................................................................... 186

b.

Cc hm nh dng (#include <iomanip.h>)................................................................................................ 186

VIII.3. IN RA MY IN ............................................................................................................................................. 187


VIII.4. LM VIC VI FILE .................................................................................................................................. 187
VIII.4.1. To i tng gn vi file .................................................................................................................. 187
VIII.4.2. ng file v gii phng i tng ..................................................................................................... 188
VIII.4.3. Kim tra s tn ti ca file, kim tra ht file ...................................................................................... 191
VIII.4.4. c ghi ng thi trn file ................................................................................................................. 191
VIII.4.5. Di chuyn con tr file ......................................................................................................................... 191
VIII.5. NHP/XUT NH PHN ............................................................................................................................ 193
VIII.5.1. Khi nim v 2 loi file: vn bn v nh phn .................................................................................... 193
a.
File vn bn ................................................................................................................................................. 193
b.
File nh phn ................................................................................................................................................ 193
VIII.5.2. c, ghi k t ..................................................................................................................................... 194
VIII.5.3. c, ghi dy k t ............................................................................................................................... 194

TI LIU THAM KHO................................................................................................................ 196

CHNG I.

CC KHI NIM C BN CA C++

Cc yu t c bn
Mi trng lm vic ca C++
Cc bc to v thc hin mt chng trnh
Vo/ra trong C++

I.1. CC YU T C BN
Mt ngn ng lp trnh (NNLT) bc cao cho php ngi s dng (NSD) biu hin tng ca
mnh gii quyt mt vn , bi ton bng cch din t gn vi ngn ng thng thng thay v
phi din t theo ngn ng my (dy cc k hiu 0,1). Hin nhin, cc tng NSD mun trnh
by phi c vit theo mt cu trc cht ch thng c gi l thut ton hoc gii thut v theo
ng cc qui tc ca ngn ng gi l c php hoc vn phm. Trong gio trnh ny chng ta bn
n mt ngn ng lp trnh nh vy, l ngn ng lp trnh C++ v lm th no th hin cc
tng gii quyt vn bng cch vit thnh chng trnh trong C++.
Trc ht, trong mc ny chng ta s trnh by v cc qui nh bt buc n gin v c bn nht.
Thng thng cc qui nh ny s c nh dn trong qu trnh hc ngn ng, tuy nhin c mt
vi khi nim tng i h thng v NNLT C++ chng ta trnh by s lc cc khi nim c bn
. Ngi c tng lm quen vi cc NNLT khc c th c lt qua phn ny.
I.1.1. Bng k t ca C++
Hu ht cc ngn ng lp trnh hin nay u s dng cc k t ting Anh, cc k hiu thng dng v
cc con s th hin chng trnh. Cc k t ca nhng ngn ng khc khng c s dng (v d
cc ch ci ting Vit). Di y l bng k t c php dng to nn nhng cu lnh ca ngn
ng C++.
Cc ch ci la tinh (vit thng v vit hoa): a .. z v A .. Z. Cng mt ch ci nhng vit
thng phn bit vi vit hoa. V d ch ci 'a' l khc vi 'A'.
Du gch di: _
Cc ch s thp phn: 0, 1, . ., 9.
Cc k hiu ton hc: +, -, *, /, % , &, ||, !, >, <, = ...
Cc k hiu c bit khc: , ;: [ ], {}, #, du cch, ...
I.1.2. T kho
Mt t kho l mt t c qui nh trc trong NNLT vi mt ngha c nh, thng dng
ch cc loi d liu hoc kt hp thnh cu lnh. NSD c th to ra nhng t mi ch cc i
tng ca mnh nhng khng c php trng vi t kho. Di y chng ti lit k mt vi t
kho thng gp, ngha ca cc t ny, s c trnh by dn trong cc mc lin quan.
auto, break, case, char, continue, default, do, double, else, externe, float,
for, goto, if, int, long, register, return, short, sizeof, static, struct, switch,
typedef, union, unsigned, while ...

Mt c trng ca C++ l cc t kho lun lun c vit bng ch thng.

I.1.3. Tn gi
phn bit cc i tng vi nhau chng cn c mt tn gi. Hu ht mt i tng c vit ra
trong chng trnh thuc 2 dng, mt dng c sn trong ngn ng (v d cc t kho, tn cc
hm chun ...), mt s do NSD to ra dng t tn cho hng, bin, kiu, hm ... cc tn gi do
NSD t t phi tun theo mt s qui tc sau:
L dy k t lin tip (khng cha du cch) v phi bt u bng ch ci hoc gch di.
Phn bit k t in hoa v thng.
Khng c trng vi t kha.
S lng ch ci dng phn bit tn gi c th c t tu .
Ch cc tn gi c sn ca C++ cng tun th theo ng qui tc trn.
Trong mt chng trnh nu NSD t tn sai th trong qu trnh x l s b (trc khi chy chng
trnh) my s bo li (gi l li vn phm).
V d :

Cc tn gi sau y l ng (c php): i, i1, j, tinhoc, tin_hoc, luu_luong

Cc tn gi sau y l sai (khng c php): 1i, tin hoc, luu-luong-nuoc

Cc tn gi sau y l khc nhau: hy_hien, Hy_hien, HY_Hien, HY_HIEN, ...


I.1.4. Ch thch trong chng trnh

Mt chng trnh thng c vit mt cch ngn gn, do vy thng thng bn cnh cc cu lnh
chnh thc ca chng trnh, NSD cn c php vit vo chng trnh cc cu ghi ch, gii thch
lm r ngha hn chng trnh. Mt ch thch c th ghi ch v nhim v, mc ch, cch thc
ca thnh phn ang c ch thch nh bin, hng, hm hoc cng dng ca mt on lnh ... Cc
ch thch s lm cho chng trnh sng sa, d c, d hiu v v vy d bo tr, sa cha v sau.
C 2 cch bo cho chng trnh bit mt on ch thch:
Nu ch thch l mt on k t bt k lin tip nhau (trong 1 dng hoc trn nhiu dng)
ta t on ch thch gia cp du ng m ch thch /* (m) v */ (ng).
Nu ch thch bt u t mt v tr no cho n ht dng, th ta t du // v tr .
Nh vy // s dng cho cc ch thch ch trn 1 dng.
Nh nhc trn, vai tr ca on ch thch l lm cho chng trnh d hiu i vi ngi c,
v vy i vi my cc on ch thch s c b qua. Li dng c im ny ca ch thch i khi
tm thi b qua mt on lnh no trong chng trnh (nhng khng xo hn khi phi g
li khi cn dng n) ta c th t cc du ch thch bao quanh on lnh ny (v d khi chy th
chng trnh, g li ...), khi cn s dng li ta c th b cc du ch thch.
Ch : Cp du ch thch /* ... */ khng c php vit lng nhau, v d dng ch thch sau l
khng c php
/* y l on ch thch /* cha on ch thch ny */ nh on ch thch con */

cn phi sa li nh sau:

hoc ch gi li cp du ch thch ngoi cng

/* y l on ch thch cha on ch thch ny nh on ch thch con */

10

hoc chia thnh cc on ch thch lin tip nhau

/* y l on ch thch */ /*cha on ch thch ny*/ /*nh on ch thch con */

I.2. CC BC TO V THC HIN MT CHNG TRNH


I.2.1. Qui trnh vit v thc hin chng trnh
Trc khi vit v chy mt chng trnh thng thng chng ta cn:
1. Xc nh yu cu ca chng trnh. Ngha l xc nh d liu u vo (input) cung cp
cho chng trnh v tp cc d liu cn t c tc u ra (output). Cc tp hp d liu
ny ngoi cc tn gi cn cn xc nh kiu ca n.V d gii mt phng trnh bc 2
dng: ax2 + bx + c = 0, cn bo cho chng trnh bit d liu u vo l a, b, c v u ra l
nghim x1 v x2 ca phng trnh. Kiu ca a, b, c, x1, x2 l cc s thc.
2. Xc nh thut ton gii.
3. C th ho cc khai bo kiu v thut ton thnh dy cc lnh, tc vit thnh chng trnh
thng thng l trn giy, sau bt u son tho vo trong my. Qu trnh ny c gi
l son tho chng trnh ngun.
4. Dch chng trnh ngun tm v sa cc li gi l li c php.
5. Chy chng trnh, kim tra kt qu in ra trn mn hnh. Nu sai, sa li chng trnh,
dch v chy li kim tra. Qu trnh ny c thc hin lp i lp li cho n khi
chng trnh chy tt theo yu cu ra ca NSD.
I.2.2. Son tho tp tin chng trnh ngun
Son tho chng trnh ngun l mt cng vic n gin: g ni dung ca chng trnh ( vit ra
giy) vo trong my v lu li n ln a. Thng thng khi lu li chng trnh ln a ln sau
s khng cn phi g li. C th son chng trnh ngun trn cc b son tho (editor) khc nhng
phi chy trong mi trng tch hp C++ (Borland C++, Turbo C++, Visual C++, Dev C++). Mc
ch ca son tho l to ra mt vn bn chng trnh v a vo b nh ca my. Vn bn chng
trnh cn c trnh by sng sa, r rng. Cc cu lnh cn canh thng ct theo cu trc ca lnh
(cc lnh cha trong mt lnh cu trc c trnh by tht vo trong so vi im bt u ca lnh).
Cc ch thch nn ghi ngn gn, r ngha v ph hp.

Hnh 1: Giao din mn hnh IDE Visual C++ 6.0

11

I.2.3. Dch chng trnh


Khuyn khch cc bn dng Visual C++ hay Dev C++. Trong gio trnh ny ti s dng Visual C++
(khng phn bit version 6.0 hay 8.0, 9.0).
Sau khi son tho xong chng trnh ngun, bc tip theo thng l dch (n phm F7 dch)
tm v sa cc li (n phm F4) gi l li c php. Trong khi dch C++ s t con tr vo ni gy
li (vit sai c php) trong vn bn. Sau khi sa xong mt li NSD c th dng F4 chuyn con
tr n li tip theo hoc dch li (tt nht nn dch li). Qu trnh sa li dch c lp li cho
n khi vn bn c sa ht li c php.
Sn phm sau khi dch l mt tp tin mi gi l chng trnh ch c ui EXE tc l tp tin m
my thc hin. Tp tin ny c th lu tm thi trong b nh phc v cho qu trnh chy chng
trnh hoc lu li trn a tu theo tu chn khi dch ca NSD. Trong v sau khi dch, C++ s hin
mt ca s cha thng bo v cc li (nu c), hoc thng bo chng trnh c dch thnh
cng (khng cn li). Cc li ny c gi l li c php.

Hnh 2: Mn hnh bin dch Project trong VC++ 6.0

I.2.4. Chy chng trnh


n Ctrl-F5 (i vi Visual C++) chy chng trnh, nu chng trnh cha dch sang m my,
my s t ng dch li trc khi chy. Kt qu ca chng trnh s hin ra trong mt ca s kt
qu NSD kim tra. Nu kt qu cha c nh mong mun, quay li vn bn sa v li chy
li chng trnh. Qu trnh ny c lp li cho n khi chng trnh chy ng nh yu cu
ra. Khi chng trnh chy, ca s kt qu s hin ra tm thi che khut ca s son tho. Sau khi
kt thc chy chng trnh ca s son tho s t ng hin ra tr li v che khut ca s kt qu.
Sau khi xem xong quay li ca s son tho n phm bt k.

I.3. VO/RA TRONG C++


Trong phn ny chng ta lm quen mt s lnh n gin cho php NSD nhp d liu vo t bn
phm hoc in kt qu ra mn hnh. Trong phn sau ca gio trnh chng ta s kho st cc cu lnh
vo/ra phc tp hn

12

I.3.1. Vo d liu t bn phm


nhp d liu vo cho cc bin c tn bin_1, bin_2, bin_3 chng ta s dng cu lnh:
cin >> bin_1 ;
cin >> bin_2 ;
cin >> bin_3 ;

hoc:
cin >> bin_1 >> bin_2 >> bin_3 ;

bin_1, bin_2, bin_3 l cc bin c s dng lu tr cc gi tr NSD nhp vo t bn


phm. Khi nim bin s c m t c th hn trong chng 2, y bin_1, bin_2, bin_3
c hiu l cc tn gi ch 3 gi tr khc nhau. Hin nhin c th nhp d liu nhiu hn 3 bin
bng cch tip tc vit tn bin vo bn phi sau du >> ca cu lnh.

Khi chy chng trnh nu gp cc cu lnh trn chng trnh s "tm dng" ch
NSD nhp d liu vo cho cc bin. Sau khi NSD nhp xong d liu, chng trnh s tip
tc chy t cu lnh tip theo sau ca cc cu lnh trn.
Cch thc nhp d liu ca NSD ph thuc vo loi gi tr ca bin cn nhp m ta gi l kiu, v
d nhp mt s c cch thc khc vi nhp mt chui k t. Gi s cn nhp di hai cnh ca
mt hnh ch nht, trong cnh di c qui c bng tn bin cd v chiu rng c qui c bi
tn bin cr. Cu lnh nhp s nh sau:
cin >> cd >> cr ;

Khi my dng ch nhp d liu NSD s g gi tr c th ca cc chiu di, rng theo ng th t


trong cu lnh. Cc gi tr ny cn cch nhau bi t nht mt du trng (ta qui c gi du trng l
mt trong 3 loi du c nhp bi cc phm sau: phm spacebar (du cch), phm tab (du tab)
hoc phm Enter (du xung dng)). Cc gi tr NSD nhp vo cng c hin th trn mn hnh
NSD d theo di.
V d nu NSD nhp vo 23 11 th chng trnh s gn gi tr 23 cho bin cd v 11 cho bin cr.
Ch : gi s NSD nhp 2311 (khng c du cch gia 23 v 11) th chng trnh s xem 2311 l
mt gi tr v gn cho cd. My s tm dng ch NSD nhp tip gi tr cho bin cr.
I.3.2. In d liu ra mn hnh
in gi tr ca cc biu thc ra mn hnh ta dng cu lnh sau:
cout << bt_1 ;
cout << bt_2 ;
cout << bt_3 ;

hoc:
cout << bt_1 << bt_2 << bt_3 ;

cng ging cu lnh nhp y chng ta cng c th m rng lnh in vi nhiu hn 3 biu thc.
Cu lnh trn cho php in gi tr ca cc biu thc bt_1, bt_2, bt_3. Cc gi tr ny c th l tn
ca bin hoc cc kt hp tnh ton trn bin.
V d in cu "Chiu di l " v s 23 v tip theo l ch "mt", ta c th s dng 3 lnh sau y:
cout << "Chiu di l" ;
cout << 23 ;
cout << "mt";

13

hoc c th ch bng 1 lnh:


cout << "Chiu di l 23 mt" ;

Trng hp cha bit gi tr c th ca chiu di, ch bit hin ti gi tr ny c lu trong bin


cd (v d c nhp vo l 23 t bn phm bi cu lnh cin >> cd trc ) v ta cn bit gi tr
ny l bao nhiu th c th s dng cu lnh in ra mn hnh.
cout << "Chiu di l" << cd << "mt" ;

Khi trn mn hnh s hin ra dng ch: "Chiu di l 23 mt". Nh vy trong trng hp ny
ta phi dng n ba ln du php ton << ch khng phi mt nh cu lnh trn. Ngoi ra ph
thuc vo gi tr hin c lu trong bin cd, chng trnh s in ra s chiu di thch hp ch
khng ch in c nh thnh "chiu di l 23 mt". V d nu cd c nhp l 15 th lnh trn s in
cu "chiu di l 15 mt".
Mt gi tr cn in khng ch l mt bin nh cd, cr, ... m cn c th l mt biu thc,

iu ny cho php ta d dng yu cu my in ra din tch v chu vi ca hnh ch nht khi


bit cd v cr bng cc cu lnh sau:
cout << "Din tch = " << cd * cr ;
cout << "Chu vi = " << 2 * (cd + cr) ;

hoc gp tt c thnh 1 cu lnh:


cout << Din tch = " << cd * cr << \n << " Chu vi = " << 2 * (cd + cr) ;

y c mt k t c bit: l k t '\n' k hiu cho k t xung dng, khi gp k t ny chng


trnh s in cc phn tip theo u dng k tip. Do kt qu ca cu lnh trn l 2 dng sau y
trn mn hnh:
Din tch = 253
Chu vi = 68

y 253 v 68 ln lt l cc gi tr m my tnh c t cc biu thc cd * cr, v 2 * (cd + cr)


trong cu lnh in trn.
Ch : s dng cc cu lnh nhp v in trong phn ny, u chng trnh phi c dng khai bo
#include <iostream.h>1.

Thng thng ta hay s dng lnh in in cu thng bo nhc NSD nhp d liu trc
khi c cu lnh nhp. Khi trn mn hnh s hin dng thng bo ny ri mi tm dng
ch d liu nhp vo t bn phm. Nh vo thng bo ny NSD s bit phi nhp d liu,
nhp ni dung g v nh th no ... v d:
cout << "Hy nhp chiu di: "; cin >> cd;
cout << "V nhp chiu rng: "; cin >> cr;

khi my s in dng thng bo "Hy nhp chiu di: " v ch sau khi NSD nhp xong 23 ,
my s thc hin cu lnh tip theo tc in dng thng bo "V nhp chiu rng: " v ch n khi
NSD nhp xong 11 chng trnh s tip tc thc hin cc cu lnh tip theo.

Theo chun ANSI C++ 92 (ph hp vi Visual C++ 6.0 tr ln, Dev C++), ta s dng khai bo nhp xut nh sau:
#include <iostream>
using namespace std;

14

V d 2 : T cc tho lun trn ta c th vit mt cch y chng trnh tnh din tch v chu vi
ca mt hnh ch nht. chng trnh c th tnh vi cc b gi tr khc nhau ca chiu di v
rng ta cn lu gi tr ny vo trong cc bin (v d cd, cr).
#include <iostream.h>
// khai bo tp tin nguyn mu dng c cin, cout
void main()
// y l hm chnh ca chng trnh
{
float cd, cr ;
// khai bo cc bin c tn cd, cr cha di cc cnh
cout << "Hy nhp chiu di: " ; cin >> cd ;
// nhp d liu
cout << "Hy nhp chiu rng: " ; cin >> cr ;
cout << "Din tch = " << cd * cr << '\n' ;
// in kt qu
cout << "Chu vi = " << 2 * (cd + cr) << '\n';
return ; //Khi c return cng c
}

Chng trnh ny c th g vo my v chy. Khi chy n cu lnh nhp, chng trnh dng
ch nhn chiu di v chiu rng, NSD nhp cc gi tr c th, chng trnh s tip tc thc hin v
in ra kt qu. Thng qua cu lnh nhp d liu v 2 bin cd, cr NSD c th yu cu chng trnh
cho kt qu ca mt hnh ch nht bt k ch khng ch trong trng hp hnh c chiu di 23 v
chiu rng 11 nh trong v d c th trn.
I.3.3. nh dng thng tin cn in ra mn hnh
Mt s nh dng n gin c chng ti trnh by trc y. Cc nh dng chi tit v phc tp
hn s c trnh by trong cc phn sau ca gio trnh. s dng cc nh dng ny cn khai bo
file nguyn mu <iomanip.h> u chng trnh bng ch th #include <iomanip.h>2.
endl: Tng ng vi k t xung dng '\n'.
setw(n): Bnh thng cc gi tr c in ra bi lnh cout << s thng theo l tri vi
rng ph thuc vo rng ca gi tr . Phng thc ny qui nh rng dnh in ra
cc gi tr l n ct mn hnh. Nu n ln hn di thc ca gi tr, gi tr s in ra theo l
phi, trng phn tha (du cch) trc.
setprecision(n): Ch nh s ch s ca phn thp phn in ra l n. S s c lm trn
trc khi in ra.
setiosflags(ios::showpoint): Phng thc setprecision ch c tc dng trn mt dng
in. c nh cc gi tr t cho mi dng in (cho n khi t li gi tr mi) ta s
dng phng thc setiosflags(ios::showpoint).

V d sau minh ho cch s dng cc phng thc trn.


V d 3 :
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
void main()
{

// s dng cout <<


// s dng cc nh dng
// s dng hm getch()

Nu s dng th vin STL th khng cn .h

15

cout << "CHI TIU" << endl << "=======" << endl ;
cout << setiosflags(ios::showpoint) << setprecision(2) ;
cout << "Sch v" << setw(20) << 123.456 << endl;
cout << "Thc n" << setw(20) << 2453.6 << endl;
cout << "Qun o lnh" << setw(15) << 3200.0 << endl;
getch();
// tm dng ( xem kt qu)
return ;
// kt thc thc hin hm main()
}

Chng trnh ny khi chy s in ra bng sau:


CHI TIU
========
Sch v
Thc n
Qun o lnh

123.46
2453.60
3200.00

Ch : ton t nhp >> ch yu lm vic vi d liu kiu s. nhp k t hoc xu k t, C++


cung cp cc phng thc (hm) sau:
cin.get(c): cho php nhp mt k t vo bin k t c,
cin.getline(s,n): cho php nhp ti a n-1 k t vo xu s.
cc hm trn khi thc hin s ly cc k t cn li trong b nh m (ca ln nhp trc) gn cho
c hoc s. Do ton t cin >> x s li k t xung dng trong b m nn k t ny s lm tri cc
lnh sau nh cin.get(c), cin.getline(s,n) (my khng dng nhp cho c hoc s). V vy trc
khi s dng cc phng thc cin.get(c) hoc cin.getline(s,n) nn s dng phng thc
cin.ignore(1) ly ra k t xung dng cn st li trong b m. V d on lnh sau cho php
nhp mt s nguyn x (bng ton t >>) v mt k t c (bng phng thc cin.get(c)):
int x;
char c;
cin >> x; cin.ignore(1);
cin.get(c);

I.3.4. Vo/ra trong C


Trong phn trn chng ti trnh by 2 ton t vo/ra v mt s phng thc, hm nhp v nh
dng trong C++. Phn ny chng ti trnh by cc cu lnh nhp xut theo khun dng c trong C.
Hin nhin cc cu lnh ny vn dng c trong chng trnh vit bng C++, tuy nhin ch nn s
dng hoc cc cu lnh ca C++ hoc ca C, khng nn dng ln ln c hai v d gy nhm ln. Do
mc ny ch c gi tr tham kho bn c c th hiu c cc cu lnh vo/ra trong cc
chng trnh vit theo NNLT C c.
I.3.5. In kt qu ra mn hnh
in cc gi tr bt_1, bt_2, , bt_n ra mn hnh theo mt khun dng mong mun ta c th s
dng cu lnh sau y:

16

printf(dng nh dng, bt_1, bt_2, ..., bt_n) ;

trong dng nh dng l mt dy k t t trong cp du nhy kp () qui nh khun dng cn


in ca cc gi tr bt_1, bt_2, , bt_n. Cc bt_i c th l cc hng, bin hay cc biu thc tnh
ton. Cu lnh trn s in gi tr ca cc bt_i ny theo th t xut hin ca chng v theo qui nh
c cho trong dng nh dng.
V d, gi s x = 4, cu lnh:
printf(%d %0.2f, 3, x + 1) ;

s in cc s 3 v 5.00 ra mn hnh, trong 3 c in di dng s nguyn (c qui nh bi


%d) v x + 1 (c gi tr l 5) c in di dng s thc vi 2 s l thp phn (c qui nh bi
%0.2f). C th, cc k t i sau k hiu % dng nh dng vic in gm c:
d
in s nguyn di dng h thp phn
o
in s nguyn dng h 8
x, X in s nguyn dng h 16
u
in s nguyn dng khng du
c
in k t
s
in xu k t
e, E in s thc dng du phy ng
f
in s thc dng du phy tnh
Cc k t trn phi i sau du %. Cc k t nm trong dng nh dng nu khng i sau %
th s c in ra mn hnh. Mun in % phi vit 2 ln (tc %%).
V d cu lnh: printf(T l hc sinh gii: %0.2f %%, 32.486) ;
s in cu T l hc sinh gii: , tip theo s in s 32.486 c lm trn n 2 s l thp phn lp
vo v tr ca %0.2f, v cui cng s in du % (do c %% trong dng nh dng). Cu c in
ra mn hnh s l:
T l hc sinh gii: 32.49%

Ch : Mi bt_i cn in phi c mt nh dng tng ng trong dng nh dng. V d cu lnh trn


cng c th vit:
printf(%s %0.2f , T l hc sinh gii: , 32.486);

trong cu lnh ny c 2 biu thc cn in. Biu thc th nht l xu k t T l hc sinh gii: c
in vi khun dng %s (in xu k t) v biu thc th hai l 32.486 c in vi khun dng %0.2f
(in s thc vi 2 s l phn thp phn).
Nu gia k t % v k t nh dng c s biu th rng cn in th gi tr in ra s c
ging ct sang l phi, trng cc du cch pha trc. Nu rng m (thm du tr
pha trc) s ging ct sang l tri. Nu khng c rng hoc rng bng 0 (v d
%0.2f) th rng c t iu chnh ng bng rng ca gi tr cn in.
Du + trc rng in gi tr s km theo du (dng hoc m)
Trc cc nh dng s cn thm k t l (v d ld, lf) khi in s nguyn di long hoc s
thc vi chnh xc gp i double.
V d 4 :
void main()
{
int i = 2, j = 3 ;

17

printf(Chng trnh tnh tng 2 s nguyn:\ni + j = %d, i+j);


}

s in ra:
Chng trnh tnh tng 2 s nguyn:
i + j = 5.

I.3.6. Nhp d liu t bn phm


scanf(dng nh dng, bin_1, bin_2, ..., bin_n) ;

Lnh ny cho php nhp d liu vo cho cc bin bin_1, , bin_n. Trong dng nh dng
cha cc nh dng v kiu bin (nguyn, thc, k t ) c vit nh trong m t cu lnh printf.
Cc bin c vit di dng a ch ca chng tc c du & trc mi tn bin. V d cu lnh:
scanf(%d %f %ld, &x, &y, &z) ;

cho php nhp gi tr cho cc bin x, y, z trong x l bin nguyn, y l bin thc v z l bin
nguyn di (long). Cu lnh:
scanf(%2d %f %lf %3s, &i, &x, &d, s);

cho php nhp gi tr cho cc bin i, x, d, s, trong i l bin nguyn c 2 ch s, f l bin thc (
di ty ), d l bin nguyn di v s l xu k t c 3 k t. Gi s NSD nhp vo dy d liu:
12345 67abcd th cc bin trn s c gn cc gi tr nh sau: i = 12, x = 345, d = 67 v s =
abc. K t d v du enter () s c lu li trong b nh v t ng gn cho cc bin ca ln
nhp sau.
Cui cng, chng trnh trong v d 3 c vit li vi printf() v scanf() nh sau:
V d 5 :
#include <stdio.h>
// s dng cc hm printf() v scanf()
#include <conio.h>
// s dng hm getch()
void main()
{
printf("CHI TIU\n=======\n") ;
printf("Sch v %20.2f\n" , 123.456) ;
printf("Thc n %20.2f\n" , 2453.6) ;
printf(Qun o lnh %15.2f\n" , 3200.0) ;
getch();
// tm dng ( xem kt qu)
}

18

BI TP
1.

Nhng tn gi no sau y l hp l:
x
RADIUS

123variabe
one.0

tin_hoc
number#

toan tin
Radius

2.

Bn hy th vit mt chng trnh ngn nht c th c.

3.

Tm cc li c php trong chng trnh sau:

so-dem
nam2000

#include (iostream.h)
void main();
// Gii phng trnh bc 1
{
cout << Day la chng trnh: Gptb1.\nXin chao cac ban;
}

4.

Vit chng trnh in ni dung mt bi th no .

5.

Chng trnh sau khai bo 5 bin k t a, b, c, d, e v mt bin s nam. Hy in thm cc


cu lnh vo cc dng chng trnh thc hin nhim v sau:
Nhp gi tr cho bin nam
Nhp gi tr cho cc bin k t a, b, c, d, e.
In ra mn hnh dng ch c ghp bi 5 k t nhp v ch "nm" sau in s nhp
(nam). V d nu 6 ch ci nhp l 'S', 'A', 'I', G, 'O', 'N' v nam c nhap l 2000,
th mn hnh in ra dng ch: SAIGON nm 2000.
Nhp chng trnh sa vo my v chy kim tra kt qu.
#include <iostream.h>
void main()
{
int nam;
char a, b, c, d, e;
clrscr();
cin >> nam ;
;
cin.get(a); cin.get(b); cin.get(c); ; ;
// in kt qu
cout << a << << << << << " nam " << ;
}

19

CHNG II.

KIU D LIU, BIU THC V CU LNH

Kiu d liu n gin


Hng - khai bo v s dng hng
Bin - khai bo v s dng bin
Php ton, biu thc v cu lnh
Th vin cc hm ton hc

II.1.

KIU D LIU N GIN

II.1.1. Khi nim v kiu d liu


Thng thng d liu hay dng l s v ch. Tuy nhin vic phn chia ch 2 loai d liu l khng
. d dng hn cho lp trnh, hu ht cc NNLT u phn chia d liu thnh nhiu kiu khc
nhau c gi l cc kiu c bn hay chun. Trn c s kt hp cc kiu d liu chun, NSD c th
t t ra cc kiu d liu mi phc v cho chng trnh gii quyt bi ton ca mnh. C ngha
lc mi i tng c qun l trong chng trnh s l mt tp hp nhiu thng tin hn v
c to thnh t nhiu loi (kiu) d liu khc nhau. Di y chng ta s xt n mt s kiu d
liu chun c qui nh sn bi C++.
Mt bin nh bit l mt s nh lin tip no trong b nh dng lu tr d liu (vo, ra
hay kt qu trung gian) trong qu trnh hot ng ca chng trnh. qun l cht ch cc bin,
NSD cn khai bo cho chng trnh bit trc tn bin v kiu ca d liu c cha trong bin.
Vic khai bo ny s lm chng trnh qun l cc bin d dng hn nh trong vic phn b b nh
cng nh qun l cc tnh ton trn bin theo nguyn tc: ch c cc d liu cng kiu vi nhau mi
c php lm ton vi nhau. Do , khi cp n mt kiu chun ca mt NNLT, thng thng
chng ta s xt n cc yu t sau:
tn kiu: l mt t dnh ring ch nh kiu ca d liu.
s byte trong b nh lu tr mt n v d liu thuc kiu ny: Thng thng s byte
ny ph thuc vo cc trnh bin dch v h thng my khc nhau, y ta ch xt n h
thng my PC thng dng hin nay.
Min gi tr ca kiu: Cho bit mt n v d liu thuc kiu ny s c th ly gi tr trong
min no, v d nh nht v ln nht l bao nhiu. Hin nhin cc gi tr ny ph thuc
vo s byte m h thng my qui nh cho tng kiu. NSD cn nh n min gi tr ny
khai bo kiu cho cc bin cn s dng mt cch thch hp.
Di y l bng tm tt mt s kiu chun n gin v cc thng s ca n c s dng trong
C++.

20

Loi d liu

Tn kiu

S nh

Min gi tr

K t

char

1 byte

S nguyn

unsigned char
int

1 byte
2 byte

128 .. 127
0 .. 255

unsigned int

2 byte

32768 .. 32767
0 .. 65535

S thc

short

2 byte

32768 .. 32767

long

4 byte

215 .. 215 1

float

4 byte

10 -37 . . 10 +38

double

8 byte

10 -307 . . 10 +308

Bng 1. Cc loi kiu n gin


Trong chng ny chng ta ch xt cc loi kiu n gin trn y. Cc loi kiu c cu trc do
ngi dng nh ngha s c trnh by trong cc chng sau.
II.1.2. Kiu k t
Mt k t l mt k hiu trong bng m ASCII. Nh bit mt s k t c mt ch trn bn phm
(v d cc ch ci, ch s) trong khi mt s k t li khng (v d k t biu din vic li li mt
trong vn bn, k t ch vic kt thc mt dng hay kt thc mt vn bn). Do vy biu din mt
k t ngi ta dng chnh m ASCII ca k t trong bng m ASCII v thng gi l gi tr ca
k t. V d pht biu "Cho k t 'A'" l cng tng ng vi pht biu "Cho k t 65" (65 l m
ASCII ca k t 'A'), hoc "Xo k t xung dng" l cng tng ng vi pht biu "Xo k t
13" v 13 l m ASCII ca k t xung dng.
Nh vy mt bin kiu k t c th c nhn gi tr theo 2 cch tng ng - ch hoc gi tr s:
v d gi s c l mt bin k t th cu lnh gn c = 'A' cng tng ng vi cu lnh gn c = 65.
Tuy nhin s dng gi tr s ca mt k t c no ta phi yu cu i c sang gi tr s bng cu
lnh int(c).
Theo bng trn ta thy c 2 loi k t l char vi min gi tr t -128 n 127 v unsigned char (k
t khng du) vi min gi tr t 0 n 255. Trng hp mt bin c gn gi tr vt ra ngoi
min gi tr ca kiu th gi tr ca bin s c tnh theo m b (256 c). V d nu gn cho
char c gi tr 179 (vt khi min gi tr c qui nh ca char) th gi tr thc s c lu
trong my s l (256 179) = 77.
V d 1 :
char c, d ;
unsigned e ;
c = 65 ; d = 179 ;
e = 179; f = 330 ;
cout << c << int(c) ;
cout << d << int(d) ;
cout << e << int(e)
cout << f << int(f)

// c, d c php gn gi tr t -128 n 127


// e c php gn gi tr t 0 n 255
// d c gi tr ngoi min cho php
// f c gi tr ngoi min cho php
// in ra ch ci 'A' v gi tr s 65
// in ra l k t '|' v gi tr s -77
// in ra l k t '|' v gi tr s 179
// in ra l k t 'J' v gi tr s 74

Ch : Qua v d trn ta thy mt bin nu c gn gi tr ngoi min cho php s dn n kt qu


khng theo suy ngh thng thng. Do vy nn tun th qui tc ch gn gi tr cho bin thuc min
gi tr m kiu ca bin qui nh. V d nu mun s dng bin c gi tr t 128 .. 255 ta nn
khai bo bin di dng k t khng du (unsigned char), cn nu gi tr vt qu 255 ta nn
chuyn sang kiu nguyn (int) chng hn.

21

II.1.3. Kiu s nguyn


Cc s nguyn c phn chia thnh 4 loi kiu khc nhau vi cc min gi tr tng ng c cho
trong bng 1. l kiu s nguyn ngn (short) tng ng vi kiu s nguyn (int) s dng 2
byte v s nguyn di (long int) s dng 4 byte. Kiu s nguyn thng c chia lm 2 loi c
du (int) v khng du (unsigned int hoc c th vit gn hn l unsigned). Qui tc m b cng
c p dng nu gi tr ca bin vt ra ngoi min gi tr cho php, v vy cn cn nhc khi khai
bo kiu cho cc bin. Ta thng s dng kiu int cho cc s nguyn trong cc bi ton vi min
gi tr va phi (c gi tr tuyt i b hn 32767), chng hn cc bin m trong cc vng lp, ...
II.1.4. Kiu s thc
s dng s thc ta cn khai bo kiu float hoc double m min gi tr ca chng c cho
trong bng 1. Cc gi tr s kiu double c gi l s thc vi chnh xc gp i v vi kiu d
liu ny my tnh c cch biu din khc so vi kiu float m bo s s l sau mt s thc c
th tng ln m bo tnh chnh xc cao hn so vi s kiu float. Tuy nhin, trong cc bi ton
thng dng thng ngy chnh xc ca s kiu float l dng.

Nh nhc n trong phn cc lnh vo/ra chng 1, lin quan n vic in n s


thc ta c mt vi cch thit t dng in theo mun, v d rng ti thiu in mt s
hay s s l thp phn cn in ...
V d 2 : Chng trnh sau y s in din tch v chu vi ca mt hnh trn c bn knh 2cm vi 3 s
l.
#include <iostream.h>
#include <iomanip.h>
void main()
{
float r = 2 ;
// r l tn bin dng cha bn knh
cout << "Din tch = " << setiosflags(ios::showpoint) ;
cout << setprecision(3) << r * r * 3.1416 ;
}

II.2.

HNG - KHAI BO V S DNG HNG

Hng l mt gi tr c nh no v d 3 (hng nguyn), 'A' (hng k t), 5.0 (hng thc), "Ha noi"
(hng xu k t). Mt gi tr c th c hiu di nhiu kiu khc nhau, do vy khi vit hng ta
cng cn c dng vit thch hp.
II.2.1. Hng nguyn
kiu short, int: 3, -7, ...
kiu unsigned: 3, 123456, ...
kiu long, long int: 3L, -7L, 123456L, ... (vit L vo cui mi gi tr)
Cc cch vit trn l th hin ca s nguyn trong h thp phn, ngoi ra chng cn c vit di
cc h m khc nh h c s 8 hoc h c s 16. Mt s nguyn trong c s 8 lun lun c vit
vi s 0 u, tng t vi c s 16 phi vit vi 0x u. V d ta bit 65 trong c s 8 l 101 v
trong c s 16 l 41, do 3 cch vit 65, 0101, 0x41 l nh nhau, cng biu din gi tr 65.

22

II.2.2. Hng thc


Mt s thc c th c khai bo di dng kiu float hoc double v cc gi tr ca n c th
c vit di mt trong hai dng.
a. Dng du phy tnh

Theo cch vit thng thng. V d: 3.0, -7.0, 3.1416, ...


b. Dng du phy ng

Tng qut, mt s thc x c th c vit di dng: men hoc mEn, trong m c gi l phn
nh tr, n gi l phn bc (hay m). S men biu th gi tr x = m x 10n. V d s = 3.1416 c
th c vit:
= = 0.031416e2 = 0.31416e1 = 3.1416e0 = 31.416e1 = 314.16e2 =
v

= 0.031416 x 102 = 0.31416 x 101 = 3.1416 x 100 =

Nh vy mt s x c th c vit di dng mEn vi nhiu gi tr m, n khc nhau, ph thuc vo


du phy ngn cch phn nguyn v phn thp phn ca s. Do vy cch vit ny c gi l dng
du phy ng.
II.2.3. Hng k t
a. Cch vit hng

C 2 cch vit mt hng k t. i vi cc k t c mt ch th hin ta thng s dng cch vit


thng dng l t mt ch gia 2 du nhy n nh: 'A', '3', ' ' (du cch) ... hoc s dng trc
tip gi tr s ca chng. V d cc gi tr tng ng ca cc k t trn l 65, 51 v 32. Vi mt s
k t khng c mt ch ta buc phi dng gi tr (s) ca chng, nh vit 27 thay cho k t c
nhn bi phm Escape, 13 thay cho k t c nhn bi phm Enter ...
biu din k t bng gi tr s ta c th vit trc tip (khng dng cp du nhy n) gi tr
di dng h s 10 (nh trn) hoc t chng vo cp du nhy n, trng hp ny ch dng cho
gi tr vit di dng h 8 hoc h 16 theo mu sau:
'\kkk': khng qu 3 ch s trong h 8. V d '\11' biu din k t c m 9.
'\xkk': khng qu 2 ch s trong h 16. V d '\x1B' biu din k t c m 27.
Tm li, mt k t c th c nhiu cch vit, chng hn 'A' c gi tr l 65 (h 10) hoc 101 (h 8)
hoc 41 (h 16), do k t 'A' c th vit bi mt trong cc dng sau:
65, 0101, 0x41 hoc 'A' , '\101' , '\x41'
Tng t, du kt thc xu c gi tr 0 nn c th vit bi 0 hoc '\0' hoc '\x0', trong cc cch ny
cch vit '\0' c dng thng dng nht.
b. Mt s hng thng dng

i vi mt s hng k t thng dng nhng khng c mt ch tng ng, hoc cc k t c


dnh ring vi nhim v khc, khi thay v phi nh gi tr ca chng ta c th vit theo qui c
sau:
'\n' :
'\t' :
'\a' :

biu th k t xung dng (cng tng ng vi endl)


k t tab
k t chung (tc thay v in k t, loa s pht ra mt ting 'bp')

23

'\r' :
'\f' :
'\\' :
'\?' :
'\'' :
'\"' :
'\kkk'
'\xkk'

xung dng
ko trang
du \
du chm hi ?
du nhy n '
du nhy kp "
:
k t c m l kkk trong h 8
:
k t c m l kk trong h 16

V d:
cout << "Hm nay tri \t nng \a \a \a \n" ;

s in ra mn hnh dng ch "Hm nay tri" sau b mt khong cch bng mt tab (khong 8 du
cch) ri in tip ch "nng", tip theo pht ra 3 ting chung v cui cng con tr trn mn hnh s
nhy xung u dng mi.

Do du cch (phm spacebar) khng c mt ch, nn trong mt s trng hp trnh


nhm ln chng ti qui c s dng k hiu <> biu din du cch. V d trong gio trnh
ny du cch (c gi tr l 32) c vit ' ' (du nhy n bao mt du cch) hoc r rng
hn bng cch vit theo qui c <>.
II.2.4. Hng xu k t
L dy k t bt k t gia cp du nhy kp. V d: "Lp K43*", "12A4", "A", "<>", "" l cc
hng xu k t, trong "" l xu khng cha k t no, cc xu "<>", "A" cha 1 k t ... S cc k
t gia 2 du nhy kp c gi l di ca xu. V d xu "" c di 0, xu "<>" hoc "A" c
di 1 cn xu "Lp K43*" c di 8.

Ch phn bit gia 2 cch vit 'A' v "A", tuy chng cng biu din ch ci A nhng
chng trnh s hiu 'A' l mt k t cn "A" l mt xu k t (do vy chng c b tr
khc nhau trong b nh cng nh cch s dng chng l khc nhau). Tng t ta khng
c vit '' (2 du nhy n lin nhau) v khng c khi nim k t "rng". ch xu rng
(khng c k t no) ta phi vit "" (2 du nhy kp lin nhau).
Tm li mt gi tr c th c vit di nhiu kiu d liu khc nhau v do cch s dng chng
cng khc nhau. V d lin quan n khi nim 3 n v c th c cc cch vit sau tuy nhin chng
hon ton khc nhau:
3

s nguyn 3 n v

3L

s nguyn di 3 n v

3.0 :

s thc 3 n v

'3'

ch s 3

"3" :

xu cha k t duy nht l 3

II.2.5. Khai bo hng


Mt gi tr c nh (hng) c s dng nhiu ln trong chng trnh i khi s thun li hn nu ta
t cho n mt tn gi, thao tc ny c gi l khai bo hng. V d mt chng trnh qun l sinh
vin vi gi thit s sinh vin ti a l 50. Nu s sinh vin ti a khng thay i trong chng
trnh ta c th t cho n mt tn gi nh sosv chng hn. Trong sut chng trnh bt k ch no

24

xut hin gi tr 50 ta u c th thay n bng sosv. Tng t C++ cng c nhng tn hng c
t sn, c gi l cc hng chun v NSD c th s dng khi cn thit. V d hng c t sn
trong C++ vi tn gi M_PI. Vic s dng tn hng thay cho hng c nhiu im thun li nh sau:
Chng trnh d c hn, v thay cho cc con s t c ngha, mt tn gi s lm NSD d
hnh dung vai tr, ni dung ca n. V d, khi gp tn gi sosv NSD s hnh dung c
chng hn, "y l s sinh vin ti a trong mt lp", trong khi s 50 c th l s sinh vin
m cng c th l tui ca mt sinh vin no .
Chng trnh d sa cha hn, v d by gi nu mun thay i chng trnh sao cho bi
ton qun l c thc hin vi s sinh vin ti a l 60, khi ta cn tm v thay th
hng trm v tr xut hin ca 50 thnh 60. Vic thay th nh vy d gy ra li v c th
khng tm thy ht cc s 50 trong chng trnh hoc thay nhm s 50 vi ngha khc
nh tui ca mt sinh vin no chng hn. Nu trong chng trnh s dng hng sosv,
by gi vic thay th tr nn chnh xc v d dng hn bng thao tc khai bo li gi tr
hng sosv bng 60. Lc trong chng trnh bt k ni no gp tn hng sosv u
c chng trnh hiu vi gi tr 60.
khai bo hng ta dng cc cu khai bo sau (C++):
const kiu tn_hng = gi_tr_hng ;
hoc trong C l:
#define tn_hng gi_tr_hng ;
V d:
#define sosv 50 ;
#define MAX 100 ;
const int sosv = 50 ;

Nh trn ch mt gi tr hng cha ni ln kiu s dng ca n v vy ta cn khai bo r rng


hn bng cch thm tn kiu trc tn hng trong khai bo const, cc hng khai bo nh vy c
gi l hng c kiu.
V d:
const int sosv = 50 ;
const float nhiet_do_soi = 100.0 ;

II.3.

BIN - KHAI BO V S DNG BIN

II.3.1. Khai bo bin


Bin l cc tn gi lu gi tr khi lm vic trong chng trnh. Cc gi tr c lu c th l cc
gi tr d liu ban u, cc gi tr trung gian tm thi trong qu trnh tnh ton hoc cc gi tr kt
qu cui cng. Khc vi hng, gi tr ca bin c th thay i trong qu trnh lm vic bng cc
lnh c vo t bn phm hoc gn. Hnh nh c th ca bin l mt s nh trong b nh c s
dng lu cc gi tr ca bin.
Mi bin phi c khai bo trc khi s dng. Mt khai bo nh vy s bo cho chng trnh bit
v mt bin mi gm c: tn ca bin, kiu ca bin (tc kiu ca gi tr d liu m bin s lu
gi). Thng thng vi nhiu NNLT tt c cc bin phi c khai bo ngay t u chng trnh
hay u ca hm, tuy nhin thun tin C++ cho php khai bo bin ngay bn trong chng trnh

25

hoc hm, c ngha bt k lc no NSD thy cn thit s dng bin mi, h c quyn khai bo v
s dng n t tr i.
C php khai bo bin gm tn kiu, tn bin v c th c hay khng khi to gi tr ban u cho
bin. khi to hoc thay i gi tr ca bin ta dng lnh gn (=).
a. Khai bo khng khi to
tn_kiu tn_bin_1 ;
tn_kiu tn_bin_2 ;
tn_kiu tn_bin_3 ;

Nhiu bin cng kiu c th c khai bo trn cng mt dng:


tn_kiu tn_bin_1, tn_bin_2, tn_bin_3 ;

V d:
void main()
{
int i, j ;
float x ;
char c, d[100] ;
unsigned int u ;

// khai bo 2 bin i, j c kiu nguyn


// khai bo bin thc x
// bin k t c, xu d cha ti a 100 k t
// bin nguyn khng du u

b. Khai bo c khi to

Trong cu lnh khai bo, cc bin c th c gn ngay gi tr ban u bi php ton gn (=) theo
c php:
tn_kiu tn_bin_1 = gt_1, tn_bin_2 = gt_2, tn_bin_3 = gt_3 ;

trong cc gi tr gt_1, gt_2, gt_3 c th l cc hng, bin hoc biu thc.

V d:
const int n = 10 ;
void main()
{
int i = 2, j , k = n + 5; // khai bo i v khi to bng 2, k bng 15
float eps = 1.0e-6 ; // khai bo bin thc epsilon khi to bng 10-6
char c = 'Z';
// khai bo bin k t c v khi to bng 'A'
char d[100] = "Tin hc";// khai bo xu k t d cha dng ch "Tin hc"

II.3.2. Phm vi ca bin


Nh bit chng trnh l mt tp hp cc hm, cc cu lnh cng nh cc khai bo. Phm vi tc
dng ca mt bin l ni m bin c tc dng, tc hm no, cu lnh no c php s dng bin
. Mt bin xut hin trong chng trnh c th c s dng bi hm ny nhng khng c bi
hm khc hoc bi c hai, iu ny ph thuc cht ch vo v tr ni bin c khai bo. Mt
nguyn tc u tin l bin s c tc dng k t v tr n c khai bo cho n ht khi lnh cha
n. Chi tit c th hn s c trnh by trong chng 4 khi ni v hm trong C++.

26

II.3.3. Gn gi tr cho bin (php gn)


Trong cc v d trc chng ta s dng php gn d n cha c trnh by, n gin mt php
gn mang ngha to gi tr mi cho mt bin. Khi bin c gn gi tr mi, gi tr c s c t
ng xo i bt k trc n cha gi tr no (hoc cha c gi tr, v d ch mi va khai bo
xong). C php ca php gn nh sau:
tn_bin = biu thc ;

Khi gp php gn chng trnh s tnh ton gi tr ca biu thc sau gn gi tr ny cho bin. V
d:
int n, i = 3;
n = 10;
cout << n <<", " << i << endl;
i = n / 2;
cout << n <<", " << i << endl;

// khi to i bng 3
// gn cho n gi tr 10
// in ra: 10, 3
// gn li gi tr ca i bng n/2 = 5
// in ra: 10, 5

Trong v d trn n c gn gi tr bng 10; trong cu lnh tip theo biu thc n/2 c tnh (bng
5) v sau gn kt qu cho bin i, tc i nhn kt qu bng 5 d trc n c gi tr l 2 (trong
trng hp ny vic khi to gi tr 2 cho bin i l khng c ngha).
Mt khai bo c khi to cng tng ng vi mt khai bo v sau thm lnh gn cho bin (v
d int i = 3 cng tng ng vi 2 cu lnh int i; i = 3) tuy nhin v mt bn cht khi to gi tr
cho bin vn khc vi php ton gn nh ta s thy trong cc phn sau.
II.3.4. Mt s im lu v php gn
Vi ngha thng thng ca php ton (ngha l tnh ton v cho li mt gi tr) th php ton gn
cn mt nhim v na l tr li mt gi tr. Gi tr tr li ca php ton gn chnh l gi tr ca biu
thc sau du bng. Li dng iu ny C++ cho php chng ta gn "kp" cho nhiu bin nhn cng
mt gi tr bi c php:
bin_1 = bin_2 = = bin_n = gt ;

vi cch gn ny tt c cc bin s nhn cng gi tr gt. V d:


int i, j, k ;
i = j = k = 1;

Biu thc gn trn c th c vit li nh (i = (j = (k = 1))), c ngha u tin thc hin php
ton gn gi tr cho bin i chng trnh phi tnh biu thc (j = (k = 1)), tc phi tnh k = 1, y l
php ton gn, gn gi tr 1 cho k v tr li gi tr 1, gi tr tr li ny s c gn cho j v tr li gi
tr 1 tip tc gn cho i.
Ngoi vic gn kp nh trn, php ton gn cn c php xut hin trong bt k biu thc no,
iu ny cho php trong mt biu thc c php ton gn, n khng ch tnh ton m cn gn gi tr
cho cc bin, v d n = 3 + (i = 2) s cho ta i = 2 v n = 5. Vic s dng nhiu chc nng ca mt
cu lnh lm cho chng trnh gn gng hn (trong mt s trng hp) nhng cng tr nn kh
c, chng hn cu lnh trn c th vit tch thnh 2 cu lnh i = 2; n = 3 + i; s d c hn t nht
i vi cc bn mi bt u tm hiu v lp trnh.

27

II.4.

PHP TON, BIU THC V CU LNH

II.4.1. Php ton


C++ c rt nhiu php ton loi 1 ngi, 2 ngi v thm ch c 3 ngi. h thng, chng ti tm
phn chia thnh cc lp v trnh by ch mt s trong chng. Cc php ton cn li s c tm hiu
dn trong cc phn sau ca gio trnh. Cc thnh phn tn gi tham gia trong php ton c gi l
hng thc hoc ton hng, cc k hiu php ton c gi l ton t. V d trong php ton a + b;
a, b c gi l ton hng v + l ton t. Php ton 1 ngi l php ton ch c mt ton hng, v
d a (i du s a), &x (ly a ch ca bin x) Mt s k hiu php ton cng c s dng
chung cho c 1 ngi ln 2 ngi (hin nhin vi ng ngha khc nhau), v d k hiu c s dng
cho php ton tr 2 ngi a b, hoc php & cn c s dng cho php ton ly hi cc bit (a &
b) ca 2 s nguyn a v b
a. Cc php ton s hc: +, -, *, /, %

Cc php ton + (cng), (tr), * (nhn) c hiu theo ngha thng thng trong s hc.
Php ton a / b (chia) c thc hin theo kiu ca cc ton hng, tc nu c hai ton
hng l s nguyn th kt qu ca php chia ch ly phn nguyn, ngc li nu 1 trong 2
ton hng l thc th kt qu l s thc. V d:
13/5 = 2
13.0/5 = 13/5.0 = 13.0/5.0 = 2.6

// do 13 v 5 l 2 s nguyn
// do c t nht 1 ton hng l thc

Php ton a % b (ly phn d) tr li phn d ca php chia a/b, trong a v b l 2 s


nguyn. V d:
13%5 = 3
5%13 = 5

// phn d ca 13/5
// phn d ca 5/13

b. Cc php ton t tng, gim: i++, ++i, i--, --i

Php ton ++i v i++ s cng tng i ln 1 n v tc tng ng vi cu lnh i = i+1.


Tuy nhin nu 2 php ton ny nm trong cu lnh hoc biu thc th ++i khc vi i++.
C th ++i s tng i, sau i mi c tham gia vo tnh ton trong biu thc. Ngc li
i++ s tng i sau khi biu thc c tnh ton xong (vi gi tr i c). im khc bit ny
c minh ho thng qua v d sau, gi s i = 3, j = 15.
Php ton

Tng ng

Kt qu

i = ++j ; // tng trc

j=j+1;i=j;

i = 16 , j = 16

i = j++ ; // tng sau

i=j;j=j+1;

i = 15 , j = 16

j = ++i + 5 ;

i=i+1;j=i+5;

i = 4, j = 9

j = i++ + 5 ;

j = i + 5; i = i + 1;

i = 4, j = 8

Ghi ch: Vic kt hp php ton t tng gim vo trong biu thc hoc cu lnh (nh v d trong
phn sau) s lm chng trnh gn nhng kh hiu hn.

28

c. Cc php ton so snh v lgic

y l cc php ton m gi tr tr li l ng hoc sai. Nu gi tr ca biu thc l ng th n nhn


gi tr 1, ngc li l sai th biu thc nhn gi tr 0. Ni cch khc 1 v 0 l gi tr c th ca 2 khi
nim "ng", "sai". M rng hn C++ quan nim mt gi tr bt k khc 0 l "ng" v gi tr 0 l
"sai".

Cc php ton so snh

== (bng nhau), != (khc nhau), > (ln hn), < (nh hn), >= (ln hn hoc bng), <= (nh hn
hoc bng).
Hai ton hng ca cc php ton ny phi cng kiu. V d:
// nhn gi tr 1 v ng
// = 0 v sai
// = 1
// = 3 v 5<2 bng 0
// = 4 v 5>=2 bng 1

3 == 3 hoc 3 == (4 -1)
3 == 5
3 != 5
3 + (5 < 2)
3 + (5 >= 2)

Ch : cn phn bit php ton gn (=) v php ton so snh (==). Php gn va gn
gi tr cho bin va tr li gi tr bt k (l gi tr ca ton hng bn phi), trong khi php so
snh lun lun tr li gi tr 1 hoc 0.

Cc php ton lgic:


&& (v), || (hoc ), ! (khng, ph nh)

Hai ton hng ca loi php ton ny phi c kiu lgic tc ch nhn mt trong hai gi tr "ng"
(c th hin bi cc s nguyn khc 0) hoc "sai" (th hin bi 0). Khi gi tr tr li ca php
ton l 1 hoc 0 v c cho trong bng sau:
a

a && b

a || b

!a

Tm li:
Php ton "v" ng khi v ch khi hai ton hng cng ng
Php ton "hoc" sai khi v ch khi hai ton hng cng sai
Php ton "khng" (hoc "ph nh") ng khi v ch khi ton hng ca n sai.
V d:
3 && (4 > 5)
(3 >= 1) && (7)
!1
! (4 + 3 < 7)
5 || (4 >= 6)
(5 < !0) || (4 >= 6)

// = 0 v c hng thc (4>5) sai


// = 1 v c hai hng thc cng ng
// = 0
// = 1 v (4+3<7) bng 0
// = 1 v c mt hng thc (5) ng
// = 0 v c hai hng thc u sai

Ch : vic nh gi biu thc c tin hnh t tri sang phi v s dng khi bit kt qu m

29

khng ch nh gi ht biu thc. Cch nh gi ny s cho nhng kt qu ph khc nhau nu trong


biu thc ta "tranh th" a thm vo cc php ton t tng gim. V d cho i = 2, j = 3, xt 2 biu
thc sau y:
x = (++i < 4 && ++j > 5)
y = (++j > 5 && ++i < 4)

cho kt qu x = 0 , i = 3 , j = 4
cho kt qu y = 0 , i = 2 , j = 4

cch vit hai biu thc l nh nhau (ngoi tr hon i v tr 2 ton hng ca php ton &&). Vi
gi thit i = 2 v j = 3 ta thy c hai biu thc trn cng nhn gi tr 0. Tuy nhin cc gi tr ca i v
j sau khi thc hin xong hai biu thc ny s c kt qu khc nhau. C th vi biu thc u v ++i
< 4 l ng nn chng trnh phi tip tc tnh tip ++j > 5 nh gi c biu thc. Do vy sau
khi nh gi xong c i v j u c tng 1 (i=3, j=4). Trong khi vi biu thc sau do ++j > 5 l
sai nn chng trnh c th kt lun c ton b biu thc l sai m khng cn tnh tip ++i < 4.
C ngha chng trnh sau khi nh gi xong ++j > 5 s dng v v vy ch c bin j c tng 1, t
ta c i = 2, j = 4 khc vi kt qu ca biu thc trn. V d ny mt ln na nhc ta ch kim
sot k vic s dng cc php ton t tng gim trong biu thc v trong cu lnh.
II.4.2. Cc php gn

Php gn thng thng: y l php gn c trnh by trong mc trc.

Php gn c iu kin:
bin = (iu_kin) ? a: b ;

iu_kin l mt biu thc logic, a, b l cc biu thc bt k cng kiu vi kiu ca bin. Php ton
ny gn gi tr a cho bin nu iu kin ng v b nu ngc li.
V d:
x = (3 + 4 < 7) ? 10: 20
x = (3 + 4) ? 10: 20
x = (a > b) ? a: b

// x = 20 v 3+4<7 l sai
// x = 10 v 3+4 khc 0, tc iu kin ng
// x = s ln nht trong 2 s a, b.

Cch vit gn ca php gn: Mt php gn dng x = x @ a ; c th c vit gn di


dng x @= a trong @ l cc php ton s hc, x l bit ... V d:
thay cho vit x = x + 2 c th vit x += 2;
hoc x = x/2 ; x = x*2 c th c vit li nh x /= 2; x *= 2;

Cch vit gn ny c nhiu thun li khi vit v c chng trnh nht l khi tn bin qu di hoc
i km nhiu ch s thay v phi vit hai ln tn bin trong cu lnh th ch phi vit mt ln, iu
ny trnh vit lp li tn bin d gy ra sai st. V d thay v vit:
ngay_quoc_te_lao_dong = ngay_quoc_te_lao_dong + 365;

c th vit gn hn bi:
ngay_quoc_te_lao_dong += 365;

hoc thay cho vit :


Luong[Nhanvien[3][2*i+1]] = Luong[Nhanvien[3][2*i+1]] * 290 ;

c th c vit li bi:
Luong[Nhanvien[3][2*i+1]] *= 290;

30

II.4.3. Biu thc


Biu thc l dy k hiu kt hp gia cc ton hng, php ton v cp du () theo mt qui tc nht
nh. Cc ton hng l hng, bin, hm. Biu thc cung cp mt cch thc tnh gi tr mi da
trn cc ton hng v ton t trong biu thc. V d:
(x + y) * 2 - 4 ; 3 - x + sqrt(y) ;

(-b + sqrt(delta)) / (2*a) ;

a. Th t u tin ca cc php ton

tnh gi tr ca mt biu thc cn c mt trt t tnh ton c th v thng nht. V d xt biu


thc x = 3 + 4 * 2 + 7
nu tnh theo ng trt t t tri sang phi, ta c x = ((3+4) * 2) + 7 = 21,
nu u tin du + c thc hin trc du *, x = (3 + 4) * (2 + 7) = 63,
nu u tin du * c thc hin trc du +, x = 3 + (4 * 2) + 7 = 18.
Nh vy cng mt biu thc tnh x nhng cho 3 kt qu khc nhau theo nhng cch hiu khc nhau.
V vy cn c mt cch hiu thng nht da trn th t u tin ca cc php ton, tc nhng php
ton no s c u tin tnh trc v nhng php ton no c tnh sau ...
C++ qui nh trt t tnh ton theo cc mc u tin nh sau:
1. Cc biu thc trong cp du ngoc ()
2. Cc php ton 1 ngi (t tng, gim, ly a ch, ly ni dung con tr )
3. Cc php ton s hc.
4. Cc php ton quan h, logic.
5. Cc php gn.
Nu c nhiu cp ngoc lng nhau th cp trong cng (su nht) c tnh trc. Cc php ton
trong cng mt lp c u tin theo th t: lp nhn (*, /, &&), lp cng (+, , ||). Nu cc php
ton c cng th t u tin th chng trnh s thc hin t tri sang phi. Cc php gn c u
tin cui cng v c thc hin t phi sang tri. V d. theo mc u tin qui nh, biu thc
tnh x trong v d trn s c tnh nh x = 3 + (4 * 2) + 7 = 18.
Phn ln cc trng hp mun tnh ton theo mt trt t no ta nn s dng c th cc du
ngoc (v cc biu thc trong du ngoc c tnh trc). V d:
tnh = b2 - 4ac ta vit delta = b * b 4 * a * c ;
tnh nghim phng trnh bc 2: x =

b+
vit : x = b + sqrt(delta) / 2*a; l sai
2a

v theo mc u tin x s c tnh nh b + ((sqrt(delta)/2) * a) (th t tnh s l php


ton 1 ngi i du b, n php chia, php nhn v cui cng l php cng). tnh
chnh xc cn phi vit (b + sqrt(delta)) / (2*a).
Cho a = 1, b = 2, c = 3. Biu thc a += b += c cho gi tr c = 3, b = 5, a = 6. Th t tnh s
l t phi sang tri, tc cu lnh trn tng ng vi cc cu lnh sau:
a=1;b=2;c=3;
b=b+c;
a=a+b;

// b = 5
// a = 6

31

r rng, tt nht nn vit biu thc cn tnh trc trong cc du ngoc.


b. Php chuyn i kiu

Khi tnh ton mt biu thc phn ln cc php ton u yu cu cc ton hng phi cng kiu. V
d php gn thc hin c th gi tr ca biu thc phi c cng kiu vi bin. Trong trng
hp kiu ca gi tr biu thc khc vi kiu ca php gn th hoc l chng trnh s t ng
chuyn kiu gi tr biu thc v thnh kiu ca bin c gn (nu c) hoc s bo li. Do vy
khi cn thit NSD phi s dng cc cu lnh chuyn kiu ca biu thc cho ph hp vi kiu ca
bin.
Chuyn kiu t ng: v mt nguyn tc, khi cn thit cc kiu c gi tr thp s c
chng trnh t ng chuyn ln kiu cao hn cho ph hp vi php ton. C th php
chuyn kiu c th c thc hin theo s nh sau:
char int long int float double

V d:
int i = 3;
float f ;
f = i + 2;

trong v d trn i c kiu nguyn v v vy i+2 cng c kiu nguyn trong khi f c kiu
thc. Tuy vy php ton gn ny l hp l v chng trnh s t ng chuyn kiu cu i+2
(bng 5) sang kiu thc (bng 5.0) ri mi gn cho f.
p kiu: trong chuyn kiu t ng, chng trnh chuyn cc kiu t thp n cao, tuy
nhin chiu ngc li khng th thc hin c v n c th gy mt d liu. Do nu
cn thit NSD phi ra lnh cho chng trnh. V d:
int i;
float f = 3 ;
i=f+2;

// t ng chuyn 3 thnh 3.0 v gn cho f


// sai v mc d f + 2 = 5 nhng khng gn c cho i

Trong v d trn cu lnh i = f+2 thc hin c ta phi p kiu ca biu thc f+2 v thnh kiu
nguyn. C php tng qut nh sau:
(tn_kiu)biu_thc

// c php c trong C

tn_kiu(biu_thc)

// c php mi trong C++

hoc:
trong tn_kiu l kiu cn c chuyn sang. Nh vy cu lnh trn phi c vit li:
i = int(f + 2) ;

khi f+2 (bng 5.0) c chuyn thnh 5 v gn cho i.


Di y ta s xt mt s v d v li ch ca vic p kiu.

Php p kiu t mt s thc v s nguyn s ct b tt c phn thp phn ca s thc, ch


li phn nguyn. Nh vy tnh phn nguyn ca mt s thc x ta ch cn p kiu ca
x v thnh kiu nguyn, c ngha int(x) l phn nguyn ca s thc x bt k. V d
kim tra mt s nguyn n c phi l s chnh phng, ta cn tnh cn bc hai ca n. Nu
cn bc hai x ca n l s nguyn th n l s chnh phng, tc nu int(x) = x th x nguyn
v n l chnh phng, v d:
int n = 10 ;
float x = sqrt(n) ;

32

// hm sqrt(n) tr li cn bc hai ca s n

if (int(x) == x) cout << "n chnh phng" ;


else cout << "n khng chnh phng" ;

bit m ASCII ca mt k t ta ch cn chuyn k t sang kiu nguyn.


char c ;
cin >> c ;
cout << "M ca k t va nhp l " << int(c) ;

Ghi ch: Xt v d sau:


int i = 3 , j = 5 ;
float x ;
x = i / j * 10;
cout << x ;

// x = 6 ?

trong v d ny mc d x c khai bo l thc nhng kt qu in ra s l 0 thay v 6


nh mong mun. L do l v php chia gia 2 s nguyn i v j s cho li s nguyn, tc i/j =
3/5 = 0. T x = 0*10 = 0. php chia ra kt qu thc ta cn phi p kiu hoc i hoc j
hoc c 2 thnh s thc, khi php chia s cho kt qu thc v x c tnh ng gi tr. C
th cu lnh x = i/j*10 c i thnh:
x = float(i) / j * 10 ;
x = i / float(j) * 10 ;
x = float(i) / float(j) * 10 ;
x = float(i/j) * 10 ;

// ng
// ng
// ng
// sai

Php p kiu: x = float(i/j) * 10 ; vn cho kt qu sai v trong du ngoc php chia i/j
vn l php chia nguyn, kt qu x vn l 0.
II.4.4. Cu lnh v khi lnh
Mt cu lnh trong C++ c thit lp t cc t kho v cc biu thc v lun lun c kt
thc bng du chm phy. Cc v d vo/ra hoc cc php gn to thnh nhng cu lnh n gin
nh:
cin >> x >> y ;
x = 3 + x ; y = (x = sqrt(x)) + 1 ;
cout << x ;
cout << y ;

Cc cu lnh c php vit trn cng mt hoc nhiu dng. Mt s cu lnh c gi l lnh c
cu trc, tc bn trong n li cha dy lnh khc. Dy lnh ny phi c bao gia cp du ngoc
{} v c gi l khi lnh. V d tt c cc lnh trong mt hm (nh hm main()) lun lun l mt
khi lnh. Mt c im ca khi lnh l cc bin c khai bo trong khi lnh no th ch c tc
dng trong khi lnh . Chi tit hn v cc c im ca lnh v khi lnh s c trnh by trong
cc chng tip theo ca gio trnh.

II.5.

TH VIN CC HM TON HC

Trong phn ny chng ti tm tt mt s cc hm ton hc hay dng. Cc hm ny u c khai


bo trong file nguyn mu cmath (hay trong C l math.h).

33

II.5.1. Cc hm s hc

abs(x), labs(x), fabs(x) : tr li gi tr tuyt i ca mt s nguyn, s nguyn di v s


thc.

pow(x, y) : hm m, tr li gi tr x ly tha y (xy).

exp(x) : hm m, tr li gi tr e m x (ex).

log(x), log10(x) : tr li lgarit c s e v lgarit thp phn ca x (lnx, logx) .

sqrt(x) : tr li cn bc 2 ca x.

atof(s_number) : tr li s thc ng vi s vit di dng xu k t s_number.


II.5.2. Cc hm lng gic

sin(x), cos(x), tan(x) : tr li cc gi tr sinx, cosx, tgx.

BI TP
6.

Vit cu lnh khai bo bin lu cc gi tr sau:


Tui ca mt ngi
S lng cy trong thnh ph
di cnh mt tam gic
Khong cch gia cc hnh tinh
Mt ch s
Nghim x ca phng trnh bc 1
Mt ch ci
Bit thc ca phng trnh bc 2

7.

Vit cu lnh nhp vo 4 gi tr ln lt l s thc, nguyn, nguyn di v k t. In ra mn hnh


cc gi tr ny kim tra.

8.

Vit cu lnh in ra mn hnh cc dng sau (khng k cc s th t v du: u mi dng)


1: B Gio dc v o to CNG HA X HI CH NGHA VIT NAM
2:
3: S Gio dc TpHCM

c lp - T do - Hnh phc

Ch : khong trng gia ch o to v CNG HA (dng 1) l 2 tab. Dng 2: trng.


9.

Vit chng trnh nhp vo mt k t. In ra k t v m ascii ca n.

10. Vit chng trnh nhp vo hai s thc. In ra hai s thc vi 2 s l v cch nhau 5 ct.
11. Nhp, chy v gii thch kt qu t c ca on chng trnh sau:
#include <iostream.h>
void main()
{
char c1 = 200; unsigned char c2 = 200 ;
cout << "c1 = " << c1 << ", c2 = " << c2 << "\n" ;
cout << "c1+100 = " << c1+100 << ", c2+100 = " << c2+100 ;
}

34

12. Nhp a, b, c. In ra mn hnh dng ch phng trnh c dng ax^2 + bx + c = 0, trong cc


gi tr a, b, c ch in 2 s l (v d vi a = 5.141, b = 2, c = 0.8 in ra 5.14 x^2 2.00 x + 0.80).
13. Vit chng trnh tnh v in ra gi tr cc biu thc sau vi 2 s l:

3+ 3+ 3

a.

b.

2+

1
2+

1
2

14. Nhp a, b, c l cc s thc. In ra gi tr ca cc biu thc sau vi 3 s l:


a. a2 2b + ab/c
b.

c. 3a b3 2 c

b 2 4ac
2a

d.

a 2 / b 4a / bc + 1

15. In ra tng, tch, hiu v thng ca 2 s c nhp vo t bn phm.


16. In ra trung bnh cng, trung bnh nhn ca 3 s c nhp vo t bn phm.
17. Vit chng trnh nhp cnh, bn knh v in ra din tch, chu vi ca cc hnh: vung, ch nht,
trn.
18. Nhp a, b, c l di 3 cnh ca tam gic (ch m bo tng 2 cnh phi ln hn cnh cn
li). Tnh chu vi, din tch, di 3 ng cao, 3 ng trung tuyn, 3 ng phn gic, bn
knh ng trn ni tip, ngoi tip ln lt theo cc cng thc sau:
C = 2p = a + b + c ;

ha =

r=

2S
;
a

S
;
p

S=

p( p a )( p b )( p c ) ;
ma =

R=

1
2b 2 + 2c 2 a 2 ;
2

ga =

2
b+c

bcp( p a ) ;

abc
;
4S

19. Tnh din tch v th tch ca hnh cu bn knh R theo cng thc:
S = 4R2 ;

V = RS/3

20. Nhp vo 4 ch s. In ra tng ca 4 ch s ny v ch s hng chc, hng n v ca tng (v


d 4 ch s 3, 1, 8, 5 c tng l 17 v ch s hng chc l 1 v hng n v l 7, cn in ra 17,
1, 7).
21. Nhp vo mt s nguyn (c 4 ch s). In ra tng ca 4 ch s ny v ch s u, ch s cui
(v d s 3185 c tng cc ch s l 17, u v cui l 3 v 5, kt qu in ra l: 17, 3, 5).
22. Hy nhp 2 s a v b. Vit chng trnh i gi tr ca a v b theo 2 cch:
dng bin ph t: t = a; a = b; b = t;
khng dng bin ph: a = a + b; b = a - b; a = a - b;
In kt qu ra mn hnh kim tra.
23. Vit chng trnh on s ca ngi chi ang ngh, bng cch yu cu ngi chi ngh mt
s, sau thc hin mt lot cc tnh ton trn s ngh ri cho bit kt qu. My s in ra s

35

m ngi chi ngh. (v d yu cu ngi chi ly s ngh nhn i, tr 4, bnh phng,


chia 2 v tr 7 ri cho bit kt qu, my s in ra s ngi chi ngh).
24. Mt sinh vin gm c cc thng tin: h tn, tui, im ton (h s 2), im tin (h s 1). Hy
nhp cc thng tin trn cho 2 sinh vin. In ra bng im gm cc chi tit nu trn v im
trung bnh ca mi sinh vin.
25. Mt nhn vin gm c cc thng tin: h tn, h s lng, phn trm ph cp (theo long) v
phn trm phi ng BHXH. Hy nhp cc thng tin trn cho 2 nhn vin. In ra bng lng
gm cc chi tit nu trn v tng s tin cui cng mi nhn vin c nhn.

36

CHNG III.

CU TRC IU KHIN V D LIU KIU MNG

Cu trc r nhnh
Cu trc lp
Mng d liu
Mng hai chiu

III.1.

CU TRC R NHNH

Ni chung vic thc hin chng trnh l hot ng tun t, tc thc hin tng lnh mt t cu lnh
bt u ca chng trnh cho n cu lnh cui cng. Tuy nhin, vic lp trnh hiu qu hn hu
ht cc NNLT bc cao u c cc cu lnh r nhnh v cc cu lnh lp cho php thc hin cc cu
lnh ca chng trnh khng theo trnh t tun t nh trong vn bn.
Phn ny chng ti s trnh by cc cu lnh cho php r nhnh nh vy. thng nht mi cu
lnh c trnh by v c php (tc cch vit cu lnh), cch s dng, c im, v d minh ho v
mt vi iu cn ch khi s dng lnh.
III.1.1. Cu lnh iu kin if
a. ngha

Mt cu lnh if cho php chng trnh c th thc hin khi lnh ny hay khi lnh khc ph thuc
vo mt iu kin c vit trong cu lnh l ng hay sai. Ni cch khc cu lnh if cho php
chng trnh r nhnh (ch thc hin 1 trong 2 nhnh).
b. C php

if (iu kin) { khi lnh 1; } else { khi lnh 2; }


if (iu kin) { khi lnh 1; }
Trong c php trn cu lnh if c hai dng: c else v khng c else. iu kin l mt biu thc
lgic tc n c gi tr ng (khc 0) hoc sai (bng 0).
Khi chng trnh thc hin cu lnh if n s tnh biu thc iu kin. Nu iu kin ng chng
trnh s tip tc thc hin cc lnh trong khi lnh 1, ngc li nu iu kin sai chng trnh s
thc hin khi lnh 2 (nu c else) hoc khng lm g (nu khng c else).
c. c im

c im chung ca cc cu lnh c cu trc l bn thn n cha cc cu lnh khc. iu


ny cho php cc cu lnh if c th lng nhau.
Nu nhiu cu lnh if (c else v khng else) lng nhau vic hiu if v else no i vi
nhau cn phi ch . Qui tc l else s i vi if gn n nht m cha c ghp cp vi
else khc. V d cu lnh
if (n>0) if (a>b) c = a;
else c = b;

l tng ng vi

37

if (n>0) { if (a>b) c = a; else c = b;}


d. V d minh ho

V d : Bng php ton gn c iu kin c th tm s ln nht max trong 2 s a, b nh sau: max =


(a > b) ? a: b ;

hoc max c tm bi dng cu lnh if:


if (a > b) max = a; else max = b;

V d : Tnh nm nhun. Nm th n l nhun nu n chia ht cho 4, nhng khng chia ht cho 100
hoc chia ht 400. Ch : mt s nguyn a l chia ht cho b nu phn d ca php chia bng 0, tc
a%b == 0.
#include <iostream.h>
void main()
{
int nam;
cout << Nam = ; cin >> nam ;
if ((nam%4 == 0 && year%100 !=0) || nam%400 == 0)
cout << nam << "la nam nhuan ;
else
cout << nam << "la nam khong nhuan ;
}

V d : Gii phng trnh bc 2. Cho phng trnh ax2 + bx + c = 0 (a 0), tm x.


#include <iostream.h>
// tp tin cha cc phng thc vo/ra
#include <cmath>
// tp tin cha cc hm ton hc
void main()
{
float a, b, c;
// khai bo cc h s
float delta;
float x1, x2;
// 2 nghiem
cout << Nhap a, b, c:\n ; cin >> a >> b >> c ;
// qui c nhp a 0
delta = b*b - 4*a*c ;
if (delta < 0) cout << ph. trnh v nghim\n ;
else if (delta==0) cout<<ph. trnh c nghim kp:" << -b/(2*a) << '\n';
else
{
x1 = (-b+sqrt(delta))/(2*a);
x2 = (-b-sqrt(delta))/(2*a);
cout << nghiem 1 = " << x1 << " v nghiem 2 = " << x2 ;
}
}

Ch : do C++ quan nim "ng" l mt gi tr khc 0 bt k v "sai" l gi tr 0 nn thay v vit if


(x != 0) hoc if (x == 0) ta c th vit gn thnh if (x) hoc if (!x) v nu (x != 0) ng th ta c x
0 v v x 0 nn (x) cng ng. Ngc li nu (x) ng th x 0, t (x != 0) cng ng. Tng
t ta d dng thy c (x == 0) l tng ng vi (!x).

38

III.1.2. Cu lnh la chn switch


a. ngha

Cu lnh if cho ta kh nng c la chn mt trong hai nhnh thc hin, do nu s dng
nhiu lnh if lng nhau s cung cp kh nng c r theo nhiu nhnh. Tuy nhin trong trng hp
nh vy chng trnh s rt kh c, do vy C++ cn cung cp mt cu lnh cu trc khc cho php
chng trnh c th chn mt trong nhiu nhnh thc hin, l cu lnh switch.
b. C php

switch (biu thc iu khin)


{
case biu_thc_1: dy lnh 1 ; break;
case biu_thc_2: dy lnh 2 ; break;
case ...: .................. ; break;
case biu_thc_n: dy lnh n ; break;
default: dy lnh n+1;
}
biu thc iu khin: phi c kiu nguyn hoc k t,
cc biu_thc_i: c to t cc hng nguyn hoc k t,
cc dy lnh c th rng. Khng cn bao dy lnh bi cp du {},
nhnh default c th c hoc khng v v tr ca n c th nm bt k trong cu lnh
(gia cc nhnh case), khng nht thit phi nm cui cng.
c. Cch thc hin

thc hin cu lnh switch u tin chng trnh tnh gi tr ca biu thc iu khin (btk), sau
so snh kt qu ca btk vi gi tr ca cc biu_thc_i bn di ln lt t biu thc u tin
(th nht) cho n biu thc cui cng (th n), nu gi tr ca btk bng gi tr ca biu thc th i
u tin no th chng trnh s thc hin dy lnh th i v tip tc thc hin tt c dy lnh cn
li (t dy lnh th i+1) cho n ht (gp du ngoc ng } ca lnh switch). Nu qu trnh so snh
khng gp biu thc (nhnh case) no bng vi gi tr ca btk th chng trnh thc hin dy lnh
trong default v tip tc cho n ht (sau default c th cn nhng nhnh case khc). Trng hp
cu lnh switch khng c nhnh default v btk khng khp vi bt c nhnh case no th chng
trnh khng lm g, coi nh thc hin xong lnh switch.
Nu mun lnh switch ch thc hin nhnh th i (khi btk = biu_thc_i) m khng phi thc hin
thm cc lnh cn li th cui dy lnh th i thng thng ta t thm lnh break; y l lnh cho
php thot ra khi mt lnh cu trc bt k.
d. V d minh ho

V d : In s ngy ca mt thng bt k no c nhp t bn phm.


int th;
cout << Cho bit thng cn tnh: ; cin >> th ;

39

switch (th)
{
case 1: case 3: case 5: case 7: case 8: case 10:
case 12: cout << "thng ny c 31 ngy" ; break ;
case 2: cout << "thng ny c 28 ngy" ; break;
case 4: case 6: case 9:
case 11: cout << "thng ny c 30 ngy" ; break;
default: cout << "Bn nhp sai thng, khng c thng ny" ;
}

Trong chng trnh trn gi s NSD nhp thng l 5 th chng trnh bt u thc hin dy lnh sau
case 5 (khng c lnh no) sau tip tc thc hin cc lnh cn li, c th l bt u t dy lnh
trong case 7, n case 12 chng trnh gp lnh in kt qu "thng ny c 31 ngy", sau gp lnh
break nn chng trnh thot ra khi cu lnh switch ( thc hin xong). Vic gii thch cng
tng t cho cc trng hp khc ca thng. Nu NSD nhp sai thng (v d thng nm ngoi phm
vi 1..12), chng trnh thy th khng khp vi bt k nhnh case no nn s thc hin cu lnh
trong default, in ra mn hnh dng ch "Bn nhp sai thng, khng c thng ny" v kt thc
lnh.
V d : Nhp 2 s a v b vo t bn phm. Nhp k t th hin mt trong bn php ton: cng, tr,
nhn, chia. In ra kt qu thc hin php ton trn 2 s a, b.
void main()
{
float a, b, c ;
// cc ton hng a, b v kt qu c
char dau ;
// php ton c cho di dng k t
cout << "Hy nhp 2 s a, b: " ; cin >> a >> b ;
cout << "v du php ton: " ; cin >> dau ;
switch (dau)
{
case '+': c = a + b ; break ;
case '': c = a - b ; break ;
case 'x': case '.': case '*': c = a * b ; break ;
case ':': case '/': c = a / b ; break ;
}
cout << setiosflags(ios::showpoint) << setprecision(4) ;
// in 4 s l
cout << "Kt qu l: " << c ;
}

Trong chng trnh trn ta chp nhn cc k t x, ., * th hin cho php ton nhn v :, / th hin
php ton chia.
III.1.3. Cu lnh nhy goto
a. ngha

Mt dng khc ca r nhnh l cu lnh nhy goto cho php chng trnh chuyn n thc hin mt
on lnh khc bt u t mt im c nh du bi mt nhn trong chng trnh. Nhn l mt
tn gi do NSD t t theo cc qui tt t tn gi. Lnh goto thng c s dng to vng lp.
Tuy nhin vic xut hin nhiu lnh goto dn n vic kh theo di trnh t thc hin chng trnh,

40

v vy lnh ny thng c s dng rt hn ch.


b. C php

Goto <nhn> ;
V tr chng trnh chuyn n thc hin l on lnh ng sau nhn v du hai chm (:).
c. V d minh ho

V d : Nhn 2 s nguyn theo phng php n .


Phng php n cho php nhn 2 s nguyn bng cch ch dng cc php ton nhn i, chia
i v cng. Cc php nhn i v chia i thc cht l php ton dch bit v bn tri (nhn) hoc
bn phi (chia) 1 bit. y l cc php ton c s trong b x l, do vy dng phng php ny s
lm cho vic nhn cc s nguyn c thc hin rt nhanh. C th tm tt phng php nh sau:
Gi s cn nhn m vi n. Kim tra m nu l th cng thm n vo kq (u tin kq c khi to bng
0), sau ly m chia 2 v n nhn 2. Quay li kim tra m v thc hin nh trn. Qu trnh dng khi
khng th chia i m c na (m = 0), khi kq l kt qu cn tm (tc kq = m*n). d hiu
phng php ny chng ta tin hnh tnh trn v d vi cc s m, n c th. Gi s m = 21 v n = 11.
Cc bc tin hnh c cho trong bng di y:
Bc

m (chia 2)

n (nhn 2)

kq (khi to kq = 0)

21

11

m l, cng thm 11 vo kq = 0 + 11 = 11

10

22

m chn, b qua

44

m l, cng thm 44 vo kq = 11 + 44 = 55

88

m chn, b qua

176

m l, cng thm 176 vo kq = 55 + 176 = 231

m = 0, dng cho kt qu kq = 231

Sau y l chng trnh c vit vi cu lnh goto.


void main()
{
long m, n, kq = 0;
// Cc s cn nhn v kt qu kq
cout << Nhp m v n: ; cin >> m >> n ;
lap:
// y l nhn chng trnh quay li
if (m%2) kq += n;
// nu m l th cng thm n vo kq
m = m >> 1;
// dch m sang phi 1 bit tc m = m / 2
n = n << 1;
// dch m sang tri 1 bit tc m = m * 2
if (m) goto lap;
// quay li nu m 0s
cout << m nhn n = << kq ;
}

III.2.

CU TRC LP

Mt trong nhng cu trc quan trng ca lp trnh cu trc l cc cu lnh cho php lp nhiu
ln mt on lnh no ca chng trnh. Chng hn trong v d v bi ton nhn theo phng
php n , lp li mt on lnh chng ta s dng cu lnh goto. Tuy nhin nh lu

41

vic dng nhiu cu lnh ny lm chng trnh rt kh c. Do vy cn c nhng cu lnh khc


trc quan hn v thc hin cc php lp mt cch trc tip. C++ cung cp cho chng ta 3 lnh lp
nh vy. V thc cht 3 lnh ny l tng ng (cng nh c th dng goto thay cho c 3 lnh lp
ny), tuy nhin chng trnh vit c sng sa, r rng, C++ cung cp nhiu phng n cho
NSD la chn cu lnh khi vit chng trnh ph hp vi tnh cht lp. Mi bi ton lp c mt c
trng ring, v d lp cho n khi s ln nh trc th dng hoc lp cho n khi mt iu
kin no khng cn tho mn na th dng vic s dng cu lnh lp ph hp s lm cho
chng trnh d c v d bo tr hn. y l ngha chung ca cc cu lnh lp, do vy trong cc
trnh by v cu lnh tip theo sau y chng ta s khng cn phi trnh by li ngha ca chng.
III.2.1. Lnh lp for
a. C php

for (dy biu thc 1 ; iu kin lp ; dy biu thc 2) { khi lnh lp; }
Cc biu thc trong cc dy biu thc 1, 2 cch nhau bi du phy (,). C th c nhiu
biu thc trong cc dy ny hoc dy biu thc cng c th trng.
iu kin lp: l biu thc lgic (c gi tr ng, sai).
Cc dy biu thc v/hoc iu kin c th trng tuy nhin vn gi li cc du chm phy
(;) ngn cch cc thnh phn vi nhau.
b. Cch thc hin

Khi gp cu lnh for trnh t thc hin ca chng trnh nh sau:

Thc hin dy biu thc 1 (thng thng l cc lnh khi to cho mt s bin),

Kim tra iu kin lp, nu ng th thc hin khi lnh lp thc hin dy biu thc 2
quay lai kim tra iu kin lp v lp li qu trnh trn cho n bc no vic kim
tra iu kin lp cho kt qu sai th dng.
Tm li, biu thc 1 s c thc hin 1 ln duy nht ngay t u qu trnh lp sau
thc hin cc cu lnh lp v dy biu thc 2 cho n khi no khng cn tho iu kin
lp na th dng.

c. V d minh ho

V d : Nhn 2 s nguyn theo phng php n


void main()
{
long m, n, kq;
// Cc s cn nhn v kt qu kq
cout << Nhp m v n: ; cin >> m >> n ;
for (kq = 0 ; m ; m >>= 1, n <<= 1)
if (m%2) kq += n ;
cout << m nhn n = << kq ;
}

So snh v d ny vi v d dng goto ta thy chng trnh c vit rt gn. bn c d hiu


cu lnh for, mt ln na chng ta nhc li cch hot ng ca n thng qua v d ny, trong cc
thnh phn c vit trong c php l nh sau:
Dy biu thc 1: kq = 0,

42

iu kin lp: m. y iu kin l ng nu m 0 v sai nu m = 0.


Dy biu thc 2: m >>= 1 v n <<= 1. 2 biu thc ny c ngha m = m >> 1 (tng ng
vi m = m / 2) v n = n << 1 (tng ng vi n = n * 2).
Khi lnh lp: ch c mt lnh duy nht if (m%2) kq += n ; (nu phn d ca m chia 2 l
khc 0, tc m l th cng thm n vo kq).
Cch thc hin ca chng trnh nh sau:

u tin thc hin biu thc 1 tc gn kq = 0. Ch rng nu kq c khi to trc


bng 0 trong khi khai bo (ging nh trong v d 6) th thnh phn biu thc 1 y c
th trng (nhng vn gi li du ; phn bit vi cc thnh phn khc).

Kim tra iu kin: gi s m 0 (tc iu kin ng) for s thc hin lnh lp tc kim
tra nu m l th cng thm n vo cho kq.

Quay li thc hin cc biu thc 2 tc chia i m v nhn i n v vng lp c tip tc


li bt u bng vic kim tra m

n mt bc lp no m s bng 0 (v b chia i lin tip), iu kin khng tho, vng


lp dng v cho ta kt qu l kq.

V d : Tnh tng ca dy cc s t 1 n 100.


Chng trnh dng mt bin m i c khi to t 1, v mt bin kq cha tng. Mi bc lp
chng trnh cng i vo kq v sau tng i ln 1 n v. Chng trnh cn lp khi no i cn cha
vt qua 100. Khi i ln hn 100 chng trnh dng. Sau y l vn bn chng trnh.
void main()
{
int i, kq = 0;
for (i = 1 ; i <= 100 ; i ++) kq += i ;
cout << "Tng = " << kq;
}

V d : In ra mn hnh dy s l b hn mt s n no c nhp vo t bn phm.


Chng trnh dng mt bin m i c khi to t 1, mi bc lp chng trnh s in i sau tng
i ln 2 n v. Chng trnh cn lp khi no i cn cha vt qua n. Khi i ln hn n chng trnh
dng. Sau y l vn bn chng trnh.
void main()
{
int n, i ;
cout << "Hy nhp n = " ; cin >> n ;
for (i = 1 ; i < n ; i += 2) cout << i << '\n' ;
}
d. c im

Thng qua phn gii thch cch hot ng ca cu lnh for trong v d 7 c th thy cc thnh phn
ca for c th trng, tuy nhin cc du chm phy vn gi li ngn cch cc thnh phn vi
nhau. V d cu lnh for (kq = 0 ; m ; m >>= 1, n <<= 1) if (m%2) kq += n ; trong v d 7 c th
c vit li nh sau:
kq = 0;
for ( ; m ; ) { if (m%2) kq += n; m >>= 1; n <<= 1; }

43

Tng t, cu lnh for (i = 1 ; i <= 100 ; i ++) kq += i ; trong v d 8 cng c th c vit li nh


sau:
i = 1;
for ( ; i <= 100 ; ) kq += i ++ ;

(cu lnh kq += i++; c thc hin theo 2 bc: cng i vo kq v tng i (tng sau)).
Trong trng hp iu kin trong for cng trng chng trnh s ngm nh l iu kin lun
lun ng, tc vng lp s lp v hn ln (!). Trong trng hp ny dng vng lp trong khi
lnh cn c cu lnh kim tra dng v cu lnh break.
V d cu lnh for (i = 1 ; i <= 100 ; i ++) kq += i ; c vit li nh sau:
i = 1;
for ( ; ; )
{
kq += i++;
if (i > 100) break;
}

Tm li, vic s dng dng vit no ca for ph thuc vo thi quen ca NSD, tuy
nhin vic vit y cc thnh phn ca for lm cho vic c chng trnh tr nn d dng
hn.
e. Lnh for lng nhau

Trong dy lnh lp c th cha c lnh for, tc cc lnh for cng c php lng nhau nh cc cu
lnh c cu trc khc.
V d : Bi ton c: va g va ch b li cho trn m 100 chn. Hi c my g v my con
ch, bit tng s con l 36.
gii bi ton ny ta gi g l s g v c l s ch. Theo iu kin bi ton ta thy g c th i t 0
(khng c con no) v n ti a l 50 (v ch c 100 chn), tng t c c th i t 0 n 25. Nh
vy ta c th cho g chy t 0 n 50 v vi mi gi tr c th ca g li cho c chy t 0 n 25, ln
lt vi mi cp (g, c) c th ta kim tra 2 iu kin: g + c == 36 ? (s con) v 2g + 4c == 100 ?
(s chn). Nu c 2 iu kin u tho th cp (g, c) c th chnh l nghim cn tm. T ta c
chng trnh vi 2 vng for lng nhau, mt vng for cho g v mt vng cho c.
void main()
{
int g, c ;
for (g = 0 ; g <= 50 ; g++)
for (c = 0 ; c <= 25 ; c++)
if ((g+c == 36) && (2*g+4*c == 100)) cout << "g=" << g << ", ch=" << c ;
}

Chng trnh trn c th c gii thch mt cch ngn gn nh sau: u tin cho g = 0, thc hin
lnh for bn trong tc ln lt cho c = 0, 1, , 25, vi c=0 v g=0 kim tra iu kin, nu tho th
in kt qu nu khng th b qua, quay li tng c, cho n khi no c>25 th kt thc vng lp trong
quay v vng lp ngoi tng g ln 1, li thc hin vng lp trong vi g=1 ny (tc li cho c chy t
0 n 25). Khi g ca vng lp ngoi vt qu 50 th dng. T ta thy s vng lp ca chng
trnh l 50 x 25 = 1000 ln lp.
Ch : C th gim bt s ln lp bng nhn xt s g khng th vt qu 36 (v tng s con l 36).

44

Mt vi nhn xt khc cng c th lm gim s vng lp, tit kim thi gian chy ca chng trnh.
Bn c t ngh thm cc phng n gii khc gim s vng lp n t nht.
V d : Tm tt c cc phng n c 100 t cc t giy bc loi 10, 20 v 50.
void main()
{
int t10, t20, t50;
// s t 10, 20, 50
sopa = 0;
// s phng n
for (t10 = 0 ; t10 <= 10 ; t10++)
for (t20 = 0 ; t20 <= 5 ; t20++)
for (t50 = 0 ; t50 <= 2 ; t50++)
if (t10*10 + t20*20 + t50*50 == 100)
// nu tho th
{
sopa++;
// tng s phng n
if (t10) cout << t10 << "t 10 ;
// in s t 10 nu 0
if (t20) cout << "+" << t20 << "t 20 ;// thm s t 20 nu0
if (t50) cout << "+" << t50 << "t 50 ;// thm s t 50 nu0
cout << '\n' ;
// xung dng
}
cout << Tong so phuong an = << sopa ;
}

III.2.2. Lnh lp while


a. C php

while (iu kin) { khi lnh lp ; }


b. Thc hin

Khi gp lnh while chng trnh thc hin nh sau: u tin chng trnh s kim tra iu kin, nu
ng th thc hin khi lnh lp, sau quay li kim tra iu kin v tip tc. Nu iu kin sai th
dng vng lp. Tm li c th m t mt cch ngn gn v cu lnh while nh sau: lp li cc lnh
trong khi iu kin vn cn ng.
c. c im

Khi lnh lp c th khng c thc hin ln no nu iu kin sai ngay t u.


vng lp khng lp v hn th trong khi lnh thng thng phi c t nht mt cu
lnh no gy nh hng n kt qu ca iu kin, v d lm cho iu kin ang ng
tr thnh sai.
Nu iu kin lun lun nhn gi tr ng (v d biu thc iu kin l 1) th trong khi
lnh lp phi c cu lnh kim tra dng v lnh break.
d. V d minh ho

V d : Nhn 2 s nguyn theo phng php n


void main()
{
long m, n, kq;

// Cc s cn nhn v kt qu kq

45

cout << Nhp m v n: ; cin >> m >> n ;


kq = 0 ;
while (m)
{
if (m%2) kq += n ;
m >>= 1;
n <<= 1;
}
cout << m nhn n = << kq ;
}

Trong chng trnh trn cu lnh while (m) c c l "trong khi m cn khc 0 thc hin ",
ta thy trong khi lnh lp c lnh m >>= 1, lnh ny s nh hng n iu kin (m), n lc no
m bng 0 tc (m) l sai v chng trnh s dng lp.
Cu lnh while (m) cng c th c thay bng while (1) nh sau:
void main()
{
long m, n, kq;
// Cc s cn nhn v kt qu kq
cout << Nhp m v n: ; cin >> m >> n ;
kq = 0 ;
while (1) {
if (m%2) kq += n ;
m >>= 1;
n <<= 1;
if (!m) break ;
// nu m = 0 th thot khi vng lp
}
cout << m nhn n = << kq ;
}

V d : Bi ton c: va g va ch b li cho trn m d 100 chn. Hi c my g v my con


ch, bit tng s con l 36.
void main()
{
int g, c ;
g=0;
while (g <= 36) {
c=0;
while (c <= 50) {
if ((g + c == 36) && (2*g + 4*c == 100)) cout << g << c ;
c++;
}
g++;
}
}

V d : Tm c chung ln nht (UCLN) ca 2 s nguyn m v n.


p dng thut ton Euclide bng cch lin tip ly s ln tr i s nh khi no 2 s bng nhau th
l UCLN. Trong chng trnh ta qui c m l s ln v n l s nh. Thm bin ph r tnh

46

hiu ca 2 s. Sau t li m hoc n bng r sao cho m > n v lp li. Vng lp dng khi m = n.
void main()
{
int m, n, r;
cout << "Nhp m, n: " ; cin >> m >> n ;
if (m < n) { int t = m; m = n; n = t; } // nu m < n th i vai tr hai s
while (m != n) {
r=m-n;
if (r > n) m = r; else { m = n ; n = r ; }
}
cout << "UCLN = " << m ;
}

V d : Tm nghim xp x ca phng trnh ex 1.5 = 0, trn on [0, 1] vi chnh xc 10-6 bng


phng php chia i.
vit chng trnh ny chng ta nhc li phng php chia i. Cho hm f(x) lin tc v i du
trn mt on [a, b] no (tc f(a), f(b) tri du nhau hay f(a)*f(b) < 0). Ta bit vi iu kin
ny chc chn th ca hm f(x) s ct trc honh ti mt im x0 no trong on [a, b], tc x0
l nghim ca phng trnh f(x) = 0. Tuy nhin vic tm chnh xc x0 l kh, v vy ta c th tm
xp x x' ca n sao cho x' cng gn x0 cng tt. Ly c l im gia ca on [a, b], c s chia on
[a, b] thnh 2 on con [a, c] v [c, b] v do f(a), f(b) tri du nn chc chn mt trong hai on con
cng phi tri du, tc nghim x0 s nm trong on ny. Tip tc qu trnh bng cch chia i on
va tm c cho n khi ta nhn c mt on con (tri du, cha x0) sao cho di ca on
con ny b hn xp x cho trc th dng. Khi ly bt k im no trn on con ny (v d
hai im mt hoc im gia ca a v b) th chc chn khong cch ca n n x0 cng b hn
xp x cho trc, tc c th ly im ny lm nghim xp x ca phng trnh f(x) = 0.
Trong v d ny hm f(x) chnh l ex - 1.5 v xp x l 10-6. y l hm lin tc trn ton trc s
v i du trn on [0, 1] (v f(0) = 1 1.5 < 0 cn f(1) = e - 1.5 > 0). Sau y l chng trnh.
void main()
{
float a = 0, b = 1, c;
// cc im mt a, b v im gia c
float fa, fc;
// gi tr ca f(x) ti cc im a, c
while (b-a > 1.0e-6)
// trong khi di on cn ln hn
{
c = (a + b)/2;
// tm im c gia on [a,b]
fa = exp(a) - 1.5; fc = exp(c) - 1.5; // tnh f(a) v f(c)
if (fa*fc == 0) break;
// f(c) = 0 tc c l nghim
if (fa*fc > 0) a = c; else b = c;
}
cout << "Nghiem xap xi cua phuong trinh = " << c ;
}

Trong chng trnh trn cu lnh if (fa*fc > 0) a = c; else b = c; dng kim tra f(a) v f(c), nu
cng du (f(a)*f(c) > 0) th hm f(x) phi tri du trn on con [c, b] do t li on ny l [a,
b] ( quay li vng lp) tc t a = c v b gi nguyn, ngc li nu hm f(x) tri du trn on
con [a, c] th t li b = c cn a gi nguyn. Sau vng lp quay li kim tra di on [a, b]
(mi) nu b hn xp x th dng v ly c lm nghim xp x, nu khng th tnh li c v tip
tc qu trnh.

47

tnh f(a) v f(c) chng trnh s dng hm exp(x), y l hm cho li kt qu ex, dng hm
ny hoc cc hm ton hc ni chung, cn khai bo file nguyn mu math.h.
III.2.3. Lnh lp do ... while
a. C php

do { khi lnh lp } while (iu kin) ;


b. Thc hin

u tin chng trnh s thc hin khi lnh lp, tip theo kim tra iu kin, nu iu kin cn
ng th quay li thc hin khi lnh v qu trnh tip tc cho n khi iu kin tr thnh sai th
dng.
c. c im

Cc c im ca cu lnh do while cng ging vi cu lnh lp while tr im khc bit, l


khi lnh trong do while s c thc hin t nht mt ln, trong khi trong cu lnh while c th
khng c thc hin ln no (v lnh while phi kim tra iu kin trc khi thc hin khi lnh,
do nu iu kin sai ngay t u th lnh s dng, khi lnh khng c thc hin ln no.
Trong khi lnh do while s thc hin khi lnh ri mi kim tra iu kin lp cho php
thc hin tip hoc dng).
d. V d minh ho

V d : Tnh xp x s pi theo cng thc Euler

2
1
1 1 1
1
= 2 + 2 + 2 + ...+ 2 , vi 2 <10 6 .
6 1 2 3
n
n

void main()
{
int n = 1; float S = 0;
do S += 1.0/(n*n) while 1.0/(n*n) < 1.0e-6;
float pi = sqrt(6*S);
cout << "pi = " << pi ;
}

V d : Kim tra mt s n c l s nguyn t.


kim tra mt s n > 3 c phi l s nguyn t ta ln lt chia n cho cc s i i t 2 n mt na
ca n. Nu c i sao cho n chia ht cho i th n l hp s ngc li n l s nguyn t.
void main()
{
int i, n ;
// n: s cn kim tra
cout << "Cho bit s cn kim tra: " ; cin >> n ;
i=2;
do {
if (n%i == 0) {
cout << n << "l hp s" ;
return ;
// dng chng trnh
}

48

i++;
} while (i <= n/2);
cout << n << "l s nguyn t" ;
}

V d : Nhp dy k t v thng k cc loi ch hoa, thng, ch s v cc loi khc cn li n khi


gp ENTER th dng.
void main()
{
char c;
// k t dng cho nhp
int n1, n2, n3, n4 ;
// s lng cc loi k t
n1 = n2 = n3 = n4 = 0;
cout << Hy nhp dy k t: \n ;
do
{
cin >> c;
if (a <= c && c <= z) n1++;
// nu c l ch thng th tng n1
else if (A <= c && c <= Z) n2++; // ch hoa, tng n2
else if (0 <= c && c <= 9) n3++;
// ch s, tng n3
else n4++;
// loi khc, tng n4
cout << n1 << n2 << n3 << n4 ;
// in kt qu
} while (c != 10) ;
// cn lp khi c cn khc k t
}

III.2.4. Li ra ca vng lp: break, continue


a. Lnh break

Cng dng ca lnh dng thot ra khi (chm dt) cc cu lnh cu trc, chng trnh s tip tc
thc hin cc cu lnh tip sau cu lnh va thot. Cc v d minh ho bn c c th xem li trong
cc v d v cu lnh switch, for, while.
b. Lnh continue

Lnh dng quay li u vng lp m khng ch thc hin ht cc lnh trong khi lnh lp.
V d : Gi s vi mi i t 1 n 100 ta cn thc hin mt lot cc lnh no tr nhng s i l s
chnh phng. Nh vy tit kim thi gian, vng lp s kim tra nu i l s chnh phng th s
quay li ngay t u thc hin vi i tip theo.
int i ;
for (i = 1; i <= 100; i++) {
if (i l s chnh phng) continue;
{

// dy lnh khc

.
.
.

}
}

49

( kim tra i c l s chnh phng chng ta so snh cn bc hai ca i vi phn nguyn ca n.


Nu hai s ny bng nhau th i l s chnh phng. C th nu sqrt(i) = int(sqrt(i)) th i l s chnh
phng. y sqrt(x) l hm tr li cn bc hai ca x. s dng hm ny cn phi khai bo file
nguyn mu math.h.)
III.2.5. So snh cch dng cc cu lnh lp
Thng qua cc v d trnh by bn c c th thy rng v mt thc cht t chc mt vng lp
chng ta c th chn mt trong cc cu lnh goto, for, while, do while, c ngha v mt kh nng
thc hin cc cu lnh ny l nh nhau. Tuy nhin, trong mt ng cnh c th vic s dng cu lnh
ph hp trong chng lm cho chng trnh sng sa, r rng v tng tin cy ln cao hn. Theo
thi quen lp trnh trong mt s ngn ng c trc v da trn c trng ring ca tng cu lnh,
cc lnh lp thng c dng trong cc ng cnh c th nh sau:

FOR thng c s dng trong nhng vng lp m s ln lp c bit trc, ngha l


vng lp thng c t chc di dng mt (hoc nhiu) bin m chy t mt gi tr
no v n khi t c n mt gi tr khc cho trc th dng. V d dng thng
dng ca cu lnh for l nh sau:

for (i = gt1 ; i <= gt2 ; i++) tc i tng t gt1 n gt2 hoc

for (i = gt2 ; i >= gt1 ; i--) tc i gim t gt2 xung gt1

Ngc li vi FOR, WHILE v DO WHILE thng dng trong cc vng lp m s ln


lp khng bit trc, chng thng c s dng khi vic lp hay dng ph thuc vo
mt biu thc lgic.

WHILE c s dng khi kh nng thc hin khi lp khng xy ra ln no, tc nu iu


kin lp c gi tr sai ngay t u, trong khi DO WHILE c s dng khi ta bit
chc chn khi lnh lp phi c thc hin t nht mt ln.

III.3.

MNG D LIU

III.3.1. Mng mt chiu


a. ngha

Khi cn lu tr mt dy n phn t d liu chng ta cn khai bo n bin tng ng vi n tn gi


khc nhau. iu ny s rt kh khn cho ngi lp trnh c th nh v qun l ht c tt c
cc bin, c bit khi n ln. Trong thc t, hin nhin chng ta gp rt nhiu d liu c lin quan
n nhau v mt mt no , v d chng c cng kiu v cng th hin mt i tng: nh cc to
ca mt vect, cc s hng ca mt ma trn, cc sinh vin ca mt lp hoc cc dng k t ca
mt vn bn Li dng c im ny ton b d liu (cng kiu v cng m t mt i tng) c
th ch cn chung mt tn gi phn bit vi cc i tng khc, v phn bit cc d liu trong
cng i tng ta s dng cch nh s th t cho chng, t vic qun l bin s d dng hn,
chng trnh s gn v c tnh h thng hn.
Gi s ta c 2 vect trong khng gian ba chiu, mi vec t cn 3 bin lu 3 to , v vy lu
to ca 2 vect chng ta phi dng n 6 bin, v d x1, y1, z1 cho vect th nht v x2, y2, z2
cho vect th hai. Mt kiu d liu mi c gi l mng mt chiu cho php ta ch cn khai bo 2
bin v1 v v2 ch 2 vect, trong mi v1 hoc v2 s cha 3 d liu c nh s th t t 0
n 2, trong ta c th ngm nh thnh phn 0 biu din to x, thnh phn 1 biu din to y

50

v thnh phn c s th t 2 s biu din to z.


Tm li, mng l mt dy cc thnh phn c cng kiu c sp k nhau lin tc trong b nh. Tt
c cc thnh phn u c cng tn l tn ca mng. phn bit cc thnh phn vi nhau, cc thnh
phn s c nh s th t t 0 cho n ht mng. Khi cn ni n thnh phn c th no ca
mng ta s dng tn mng v km theo s th t ca thnh phn .
Di y l hnh nh ca mt mng gm c 9 thnh phn, cc thnh phn c nh s t 0 n 8.
0 1 2 3 4 5 6 7 8
b. Khai bo

<tn kiu> <tn mng>[s thnh phn] ;

// khng khi to

<tn kiu> <tn mng>[s thnh phn] = { dy gi tr } ;

// c khi to

<tn kiu> <tn mng>[ ] = { dy gi tr } ;

// c khi to

Tn kiu l kiu d liu ca cc thnh phn, cc thnh phn ny c kiu ging nhau.
Thnh thong ta cng gi cc thnh phn l phn t.
Cch khai bo trn ging nh khai bo tn bin bnh thng nhng thm s thnh phn
trong mng gia cp du ngoc vung [] cn c gi l kch thc ca mng. Mi tn
mng l mt bin v phn bit vi cc bin thng thng ta cn gi l bin mng.
Mt mng d liu c lu trong b nh bi dy cc lin tip nhau. S lng bng
vi s thnh phn ca mng v di (byte) ca mi cha thng tin ca mi
thnh phn. u tin c nh th t bi 0, tip theo bi 1, v tip tc cho n ht.
Nh vy nu mng c n thnh phn th cui cng trong mng s c nh s l n - 1.
Dng khai bo th 2 cho php khi to mng bi dy gi tr trong cp du {}, mi gi tr
cch nhau bi du phy (,), cc gi tr ny s c gn ln lt cho cc phn t ca mng
bt u t phn t th 0 cho n ht dy. S gi tr c th b hn s phn t. Cc phn t
mng cha c gi tr s khng c xc nh cho n khi trong chng trnh n c gn
mt gi tr no .
Dng khai bo th 3 cho php vng mt s phn t, trng hp ny s phn t c xc
nh bi s gi tr ca dy khi to. Do nu vng mt c dy khi to l khng c
php (chng hn khai bo int a[] l sai).
V d:

Khai bo bin cha 2 vect a, b trong khng gian 3 chiu:

float a[3] , b[3] ;

Khai bo 3 phn s a, b, c; trong a = 1/3 v b = 3/5:

int a[2] = {1, 3} , b[2] = {3, 5} , c[2] ;


y ta ngm qui c thnh phn u tin (s th t 0) l t v thnh phn th hai (s th
t 1) l mu ca phn s.

Khai bo mng L cha c ti a 100 s nguyn di:

long L[100] ;

Khai bo mng dong (dng), mi dng cha c ti a 80 k t:

51

char dong[80] ;

Khai bo dy Data cha c 5 s thc chnh xc gp i:

double Data[] = { 0,0,0,0,0 };

// khi to tm thi bng 0

c. Cch s dng

i.

ch thnh phn th i (hay ch s i) ca mt mng ta vit tn mng km theo ch s


trong cp ngoc vung []. V d vi cc phn s trn a[0], b[0], c[0] ch t s v a[1],
b[1], c[1] ch mu s ca 3 phn s a,b,c.

ii.

Tuy mi mng biu din mt i tng nhng chng ta khng th p dng cc thao tc
ln ton b mng m phi thc hin thao tc thng qua tng thnh phn ca mng. V d
chng ta khng th nhp d liu cho mng a[10] bng cu lnh:
cin >> a ;

// sai

m phi nhp cho tng phn t t a[0] n a[9] ca a. D nhin trong trng hp ny
chng ta phi cn n lnh lp for:
int i ;
for (i = 0 ; i < 10 ; i++) cin >> a[i] ;

Tng t, gi s chng ta cn cng 2 phn s a, b v t kt qu vo c.


Khng th vit:
c=a+b;

// sai

m cn phi tnh tng phn t ca c:


c[0] = a[0] * b[1] + a[1] * b[0] ; // t s
c[1] = a[1] * b[1] ;
// mu s

khc phc nhc im ny, trong cc chng sau C++ cung cp mt kiu d liu
mi gi l lp, v cho php NSD c th nh ngha ring php cng cho 2 mng tu , khi
c th vit mt cch n gin v quen thuc c = a + b cng 2 phn s.
d. V d minh ho

V d : Tm tng, tch 2 phn s.


void main()
{
int a[2], b[2], tong[2], tich[2] ;
cout << "Nhp a. T = " ; cin >> a[0] ; cout << "mu = " ; cin >> a[1] ;
cout << "Nhp b. T = " ; cin >> b[0] ; cout << "mu = " ; cin >> b[1] ;
tong[0] = a[0]*b[1] + a[1]*b[0] ; tong[1] = a[1] * b[1] ;
tich[0] = a[0]*b[0]; tich[1] = a[1] * b[1] ;
cout << "Tng = " << tong[0] << '/' << tong[1] ;
cout << "Tch = " << tich[0] << '/' << tich[1] ;
}

V d : Nhp dy s nguyn, tnh: s s hng dng, m, bng khng ca dy.


void main()
{
float a[50], i, n, sd, sa, s0;

52

// a cha ti a 50 s

cout << "Nhp s phn t ca dy: " ; cin >> n;


// nhp s phn t
for (i=0; i<n; i++) { cout << "a[" << i << "] = " ; cin >> a[i]; } // nhp dy s
sd = sa = s0 = 0 ;
for (i=1; i<n; i++) {
if (a[i] > 0 ) sd++;
if (a[i] < 0 ) sa++;
if (a[i] == 0 ) s0++;
}
cout << "S s dng = " << sd << " s s m = " << sa ;
cout << "S s bng 0 = " << s0 ;
}

V d : Tm s b nht ca mt dy s. In ra s ny v v tr ca n trong dy.


Chng trnh s dng mng a lu dy s, n l s phn t thc s trong dy, min lu s b nht
tm c v k l v tr ca min trong dy. min c khi to bng gi tr u tin (a[0]), sau ln
lt so snh vi cc s hng cn li, nu gp s hng nh hn, min s nhn gi tr ca s hng ny.
Qu trnh so snh tip tc cho n ht dy. V s s hng ca dy l bit trc (n), nn s ln lp
cng c bit trc (n-1 ln lp), do vy chng ta s s dng cu lnh for cho v d ny.
void main()
{
float a[100], i, n, min, k;
// a cha ti a 100 s
cout << "Nhp s phn t ca dy: " ; cin >> n;
for (i=0; i<n; i++) { cout << "a[" << i << "] = " ; cin >> a[i]; }
min = a[0]; k = 0;
for (i=1; i<n; i++) if (a[i] < min ) { min = a[i]; k = i; }
cout << "S b nht l " << min << "ti v tr " << k;
}

V d : Nhp v sp xp tng dn mt dy s. Thut ton c tin hnh bng cch sp xp dn


tng s hng b nht ln u dy. Gi s sp c i-1 v tr, ta s tm s b nht trong dy cn li
(t v tr th i n n-1) v a s ny lp vo v tr th i. thc hin, chng ta so snh a[i] ln lt
vi tng s a[j] trong dy cn li (tc j i t i+1 n n), nu gp a[j] b hn a[i] th i ch hai s
ny vi nhau.
void main()
{
float a[100], i, j, n, tam;
cout << "Cho bit s phn t n = " ; cin >> n ;
for (i=0; i<n; i++) {cout<<"a[" <<i<< "] = "; cin >> a[i] ;} // nhp d liu
for (i=0; i<n; i++) {
for (j=i+1; j<n; j++)
if (a[i] > a[j]) { tam = a[i]; a[i] = a[j]; a[j] = tam; } // i ch
}
for (i=0; i<n; i++) cout << a[i] ;
// in kt qu
}

53

III.3.2. Xu k t
Mt xu k t l mt dy bt k cc k t (k c du cch) do vy n c th c lu bng mng k
t. Tuy nhin my c th nhn bit c mng k t ny l mt xu, cn thit phi c k t kt
thc xu, theo qui c l k t c m 0 (tc '\0') ti v tr no trong mng. Khi xu l dy k t
bt u t phn t u tin (th 0) n k t kt thc xu u tin (khng k cc k t cn li trong
mng).
0

\0

\0

\0

\0

\0

Hnh v trn minh ho 3 xu, mi xu c cha trong mng k t c di ti a l 8. Ni dung


xu th nht l "Hello" c di thc t l 5 k t, chim 6 trong mng (thm cha k t kt
thc '\0'). Xu th hai c ni dung "Hel" vi di 3 (chim 4 ) v xu cui cng biu th mt xu
rng (chim 1 ). Ch mng k t c khai bo vi di 8 tuy nhin cc xu c th ch chim
mt s k t no trong mng ny v ti a l 7 k t.
a. Khai bo

char <tn xu>[ di] ;

// khng khi to

char <tn xu>[ di] = xu k t ;

// c khi to

char <tn xu>[] = xu k t ;

// c khi to

di mng l s k t ti a c th c trong xu. di thc s ca xu ch tnh t u


mng n du kt thc xu (khng k du kt thc xu \0).
Do mt xu phi c du kt thc xu nn trong khai bo di ca mng cn phi khai
bo tha ra mt phn t. Thc cht di ti a ca xu = di mng - 1. V d nu
mun khai bo mng s cha c xu c di ti a 80 k t, ta cn phi khai bo char
s[81].
Cch khai bo th hai c km theo khi to xu, l dy k t t gia cp du nhy
kp. V d:
char hoten[26] ;

// xu h tn cha ti a 25 k t

char monhoc[31] = "NNLT C++" ;


xu mn hc cha ti a 30 k t, c khi to vi ni dung "NNLT C++" vi di thc s l 10
k t (chim 11 u tin trong mng monhoc[31]).
Cch khai bo th 3 t chng trnh s quyt nh di ca mng bi xu khi to (bng
di xu + 1). V d:
char thang[] = "Mi hai" ;

// di mng = 9

b. Cch s dng

Tng t nh cc mng d liu khc, xu k t c nhng c trng nh mng, tuy nhin chng
cng c nhng im khc bit. Di y l cc im ging v khc nhau .

54

Truy cp mt k t trong xu: c php ging nh mng. V d:


char s[50] = "I\'m a student" ;
cout << s[0] ;
s[1] = 'a' ;

Khng c thc hin cc php ton trc tip trn xu nh:


char s[20] = "Hello", t[20] ;
t = "Hello" ;
t=s;
if (s < t)

// ch k t ' phi c vit l \'


// in k t u tin, tc k t 'I'
// t li k t th 2 l 'a'
// khai bo hai xu s v t
// sai, ch gn c khi khai bo
// sai, khng gn c ton b mng
// sai, khng so snh c hai mng

Ton t nhp d liu >> vn dng c nhng c nhiu hn ch. V d


char s[60] ;
cin >> s ;
cout << s ;

nu xu nhp vo l "Tin hc ho" chng hn th ton t >> ch nhp "Tin" cho s (b


tt c cc k t ng sau du trng), v vy khi in ra trn mn hnh ch c t "Tin".
V cc php ton khng dng c trc tip trn xu nn cc chng trnh dch vit sn cc hm
th vin c khai bo trong file nguyn mu string.h. Cc hm ny gii quyt c hu ht cc
cng vic cn thao tc trn xu. N cung cp cho NSD phng tin thao tc trn xu nh gn, so
snh, sao chp, tnh di xu, nhp, in, s dng c cc hm ny u chng trnh cn c
khai bo string.h. Phn ln cc hm ny s c gii thiu trong phn tip sau.
c. Phng thc nhp xu (#include <iostream.h>)

Do ton t nhp >> c hn ch i vi xu k t nn C++ a ra hm ring (cn gi l phng


thc) cin.getline(s,n) nhp xu k t. Hm c 2 i vi s l xu cn nhp ni dung v n-1 l s k
t ti a ca xu. Ging phng thc nhp k t cin.get(c), khi gp hm cin.getline(s,n) chng
trnh s nhn vo b m bn phm ly ra n-1 k t (nu hoc ly tt c k t cn li, tr k t
enter) v gn cho s. Nu ti thi im b m ang rng, chng trnh s tm dng ch NSD
nhp d liu (dy k t) vo t bn phm. NSD c th nhp vo dy vi di bt k cho n khi
nhn Enter, chng trnh s ly ra n-1 k t u tin gn cho s, phn cn li vn c lu trong b
m (k c k t Enter) dng cho ln nhp sau. Hin nhin, sau khi gn cc k t cho s, chng
trnh s t ng t k t kt thc xu vo tip theo ca xu s.
V d : Xt on lnh sau
char s[10] ;
cin.getline(s, 10) ;
cout << s << endl ;
cin.getline(s, 10) ;
cout << s << endl ;

gi s ta nhp vo bn phm dng k t: 1234567890abcd . Khi lnh cin.getline(s,10) u tin


s gn xu "123456789" (9 k t) cho s, phn cn li vn lu trong b m bn phm. Tip theo s
c in ra mn hnh. n lnh cin.getline(s,10) th hai NSD khng phi nhp thm d liu, chng
trnh t ng ly nt s d liu cn li (v cha 9 k t) "0abcd" gn cho s. Sau in ra mn
hnh. Nh vy trn mn hnh s xut hin hai dng:
123456789
0abcd

55

V d : Nhp mt ngy thng dng M (mm/dd/yy), i sang ngy thng dng Vit Nam ri in ra
mn hnh.
void main()
{
char US[9], VN[9] = " / / " ;
cin.getline(US, 9) ;
VN[0] = US[3]; VN[1] = US[4] ;
VN[3] = US[0]; VN[4] = US[1] ;
VN[6] = US[6]; VN[7] = US[7] ;
cout << VN << endl ;
}

// khi to trc hai du /


// nhp ngy thng, v d "05/01/99"
// ngy
// thng
// nm

d. Mt s hm x l xu (#include <cstring>)

strcpy(s, t) ;

Gn ni dung ca xu t cho xu s (thay cho php gn = khng c dng). Hm s sao chp ton b
ni dung ca xu t (k c k t kt thc xu) vo cho xu s. s dng hm ny cn m bo di
ca mng s t nht cng bng di ca mng t. Trong trng hp ngc li k t kt thc xu s
khng c ghi vo s v iu ny c th gy treo my khi chy chng trnh.
V d:
char s[10], t[10] ;
t = "Face" ;
s=t;
strcpy(t, "Face") ;
strcpy(s, t) ;
cout << s << " to " << t ;

// khng c dng
// khng c dng
// c, gn "Face" cho t
// c, sao chp t sang s
// in ra: Face to Face

strncpy(s, t, n) ;

Sao chp n k t ca t vo s. Hm ny ch lm nhim v sao chp, khng t ng gn k t kt thc


xu cho s. Do vy NSD phi thm cu lnh t k t '\0' vo cui xu s sau khi sao chp xong.
V d:
char s[10], t[10] = "Steven";
strncpy(s, t, 5) ;
s[5] = '\0' ;
// in cu: Steve is young brother of Steven
cout << s << " is young brother of " << t ;

// copy 5 k t "Steve" vo s
// t du kt thc xu

Mt s dng c ch ca hm ny l copy mt xu con bt k ca t v t vo s. V d cn copy xu


con di 2 k t bt u t k t th 3 ca xu t v t vo s, ta vit strncpy(s, t+3, 2). Ngoi ra xu
con c copy c th c t vo v tr bt k ca s (khng nht thit phi t u xu s) chng hn
t vo t v tr th 5, ta vit: strncpy(s+5, t+3, 2). Cu lnh ny c ngha: ly 2 k t th 3 v th 4
ca xu t t vo 2 th 5 v th 6 ca xu s. Trn c s ny chng ta c th vit cc on chng
trnh ngn thay th mt on con bt k no trong s bi mt on con bt k (c di tng
ng) trong t. V d cc dng lnh chuyn i ngy thng trong v d trc c th vit li bng
cch dng hm strncpy nh sau:
strncpy(VN+0, US+3, 2) ;
strncpy(VN+3, US+0, 2) ;
strncpy(VN+6, US+6, 2);

56

// ngy
// thng
// nm

strcat(s, t);

Ni mt bn sao ca t vo sau s (thay cho php +). Hin nhin hm s loi b k t kt thc xu s
trc khi ni thm t. Vic ni s m bo ly c k t kt thc ca xu t vo cho s (nu s ch) v
vy NSD khng cn thm k t ny vo cui xu. Tuy nhin, hm khng kim tra xem liu di
ca s c ch ni thm ni dung, vic kim tra ny phi do NSD m nhim. V d:
char a[100] = "Mn", b[4] = "ti";
strcat(a, v );
strcat(a, b);
cout << a

// Mn v ti

char s[100] , t[100] = "Steve" ;


strncpy(s, t, 3); s[3] = '\0';
// s = "Ste"
strcat(s, "p");
// s = "Step"
cout << t << " goes "<< s << " by " <<s // Steve goes Step by Step

strncat(s, t, n);

Ni bn sao n k t u tin ca xu t vo sau xu s. Hm t ng t thm du kt thc xu vo s


sau khi ni xong (tng phn vi strncpy()). Cng ging strcat hm i hi di ca s phi
cha kt qu. Tng t, c th s dng cch vit strncat(s, t+k, n) ni n k t t v tr th k ca
xu t cho s.
V d:
char s[20] = "Nh " ;
char t[] = "vua cha"
strncat(s, t, 3) ;
hoc:
strncat(s, t+4, 4) ;

// s = "Nh vua"
// s = "Nh cha"

strcmp(s, t);

Hm so snh 2 xu s v t (thay cho cc php ton so snh). Gi tr tr li l hiu 2 k t khc nhau


u tin ca s v t. T , nu s1 < s2 th hm tr li gi tr m, bng 0 nu s1==s2, v dng nu
s1 > s2. Trong trng hp ch quan tm n so snh bng, nu hm tr li gi tr 0 l 2 xu bng
nhau v nu gi tr tr li khc 0 l 2 xu khc nhau.
V d:
if (strcmp(s,t)) cout << "s khc t"; else cout << "s bng t" ;

strncmp(s, t) ;

Ging hm strcmp(s, t) nhng ch so snh ti a n k t u tin ca hai xu.


V d:
char s[] = "H Ni" , t[] = "H ni" ;
cout << strcmp(s,t) ;
cout << strncmp(s, t, 3) ;

// -32 (v 'N' = 78, 'n' = 110)


// 0 (v 3 k t u ca s v t l nh nhau)

strcmpi(s, t) ;

Nh strcmp(s, t) nhng khng phn bit ch hoa, thng.


V d:
char s[] = "H Ni" , t[] = "h ni" ;

57

cout << strcmpi(s, t) ;

// 0 (v s = t)

strupr(s);

Hm i xu s thnh in hoa, v cng tr li xu in hoa .


V d:
char s[10] = "Ha noi" ;
cout << strupr(s) ;
cout << s ;

// HA NOI
// HA NOI (s cng thnh in hoa)

strlwr(s);

Hm i xu s thnh in thung, kt qu tr li l xu s.
V d:
char s[10] = "Ha Noi" ;
cout << strlwr(s) ;
cout << s ;

// ha noi
// ha noi (s cng thnh in thng)

strlen(s) ;

Hm tr gi tr l di ca xu s.
V d:
char s[10] = "Ha Noi" ;
cout << strlen(s) ;

// 5

Sau y l mt s v d s dng tng hp cc hm trn.


V d : Thng k s ch 'a' xut hin trong xu s.
void main()
{
const int MAX = 100;
char s[MAX+1];
int sokitu = 0;
cin.getline(s, MAX+1);
for (int i=0; i < strlen(s); i++) if (s[i] = 'a ') sokitu++;
cout << "S k t = " << sokitu << endl ;
}

V d : Tnh di xu bng cch m tng k t (tng ng vi hm strlen())


void main()
{
char s[100];
cin.getline(s, 100);
for (int i=0 ; s[i] != '\0' ; i++) ;
cout << " di xu = " << i ;
}

// di ti a l 99 k t
// nhp xu s
// chy t u n cui xu

V d : Sao chp xu s sang xu t (tng ng vi hm strcpy(t,s))


void main()
{
char s[100], t[100];

58

cin.getline(s, 100);
int i=0;
while ((t[i] = s[i]) != '\0') i++;
cout << t << endl ;

// nhp xu s
// copy c du kt thc xu '\0'

V d : Ct du cch 2 u ca xu s. Chng trnh s dng bin i chy t u xu n v tr u


tin c k t khc du trng. T v tr ny sao chp tng k t cn li ca xu v u xu bng cch
s dng thm bin j lm ch s cho xu mi. Kt thc sao chp j s v tr cui xu (mi). Cho j
chy ngc v u xu cho n khi gp k t u tin khc du trng. t du kt thc xu ti y.
void main()
{
char s[100];
cin.getline(s, 100);
int i, j ;
i = j = 0;
while (s[i++] == ' '); i-- ;
while (s[i] != '\0') s[j++] = s[i++] ;
while (s[--j] == ' ') ;
s[j+1] = '\0' ;
cout << s ;
}

// nhp xu s

// b qua cc du cch u tin


// sao chp phn cn li vo s
// b qua cc du cch cui
// t du kt thc xu

V d : Nhp mt khu (khng qu 10 k t). In ra "ng" nu l "HIENLTH", "sai" nu ngc li.


Chng trnh cho php nhp ti a 3 ln. Nhp ring r tng k t (bng hm getch()) cho mt khu.
Hm getch() khng hin k t NSD g vo, thay vo chng trnh ch hin k t 'X' che giu
mt khu. Sau khi NSD g xong (9 k t) hoc Enter, chng trnh so snh xu va nhp vi
"HIENLTH ", nu ng chng trnh tip tuc, nu sai tng s ln nhp (cho php khng qu 3 ln).
#include <iostream>
using namespace std;
#include <conio.h>
#include <cstring>
void main()
{
char pw[11];
int solan = 0;// Cho phep nhap 3 lan
do {
system("CLS");//Xoa man hinh
int i = 0;
while ((pw[i]=getch()) != 13 && ++i < 10)
cout << 'X' ;// 13 = Enter
pw[i] = '\0' ;
cout << endl ;
if (!strcmp(pw, "HIENLTH"))
{ cout << "Moi vao" ; break; }
else {
cout << "Sai mat khau. Nhap lai" ; solan++ ;

59

getch();
}
} while (solan < 3);
}

III.4.

MNG HAI CHIU

thun tin trong vic biu din cc loi d liu phc tp nh ma trn hoc cc bng biu c
nhiu ch tiu, C++ a ra kiu d liu mng nhiu chiu. Tuy nhin, vic s dng mng nhiu
chiu rt kh lp trnh v vy trong mc ny chng ta ch bn n mng hai chiu. i vi mng
mt chiu m thnh phn, nu mi thnh phn ca n li l mng mt chiu n phn t th ta gi
mng l hai chiu vi s phn t (hay kch thc) mi chiu l m v n. Ma trn l mt minh ho
cho hnh nh ca mng hai chiu, n gm m dng v n ct, tc cha m x n phn t, v hin nhin
cc phn t ny c cng kiu. Tuy nhin, v mt bn cht mng hai chiu khng phi l mt tp hp
vi m x n phn t cng kiu m l tp hp vi m thnh phn, trong mi thnh phn l mt mng
mt chiu vi n phn t. im nhn mnh ny s c gii thch c th hn trong cc phn trnh
by v con tr ca chng sau.
0

0
1
2
Hnh trn minh ho hnh thc mt mng hai chiu vi 3 dng, 4 ct. Thc cht trong b nh tt c
12 phn t ca mng c sp lin tip theo tng dng ca mng nh minh ho trong hnh di
y.

dng 0

dng 1

dng 2

a. Khai bo

<kiu thnh phn > <tn mng>[m][n] ;


m, n l s hng, s ct ca mng.
kiu thnh phn l kiu ca m x n phn t trong mng.
Trong khai bo cng c th c khi to bng dy cc dng gi tr, cc dng cch nhau
bi du phy, mi dng c bao bi cp ngoc {} v ton b gi tr khi to nm trong
cp du {}.
b. S dng

60

Tng t mng mt chiu cc chiu trong mng cng c nh s t 0.

Khng s dng cc thao tc trn ton b mng m phi thc hin thng qua tng phn t
ca mng.

truy nhp phn t ca mng ta s dng tn mng km theo 2 ch s ch v tr hng v


ct ca phn t. Cc ch s ny c th l cc biu thc thc, khi C++ s t chuyn kiu
sang nguyn.

V d:
Khai bo 2 ma trn 4 hng 5 ct A, B cha cc s nguyn:
int A[3][4], B[3][4] ;
Khai bo c khi to:
int A[3][4] = { {1,2,3,4}, {3,2,1,4}, {0,1,1,0} };
vi khi to ny ta c ma trn:
1

trong : A[0][0] = 1, A[0][1] = 2, A[1][0] = 3, A[2][3] = 0


Trong khai bo c th vng s hng (khng c vng s ct), s hng ny c xc nh
thng qua khi to.
float A[][3] = { {1,2,3}, {0,1,0} } ;
trong khai bo ny chng trnh t ng xc nh s hng l 2.
Php khai bo v khi to sau y l cng hp l:
float A[][3] = { {1,2}, {0} } ;
chng trnh cng xc nh s hng l 2 v s ct (bt buc phi khai bo) l 3 mc d trong khi
to khng th xc nh c s ct. Cc phn t cha khi to s cha c xc nh cho n khi
no n c nhp hoc gn gi tr c th. Trong v d trn cc phn t A[0][2], A[1][1] v A[1][2]
l cha c xc nh.
c. V d minh ho

V d : Nhp, in v tm phn t ln nht ca mt ma trn.


#include <iostream.h>
#include <iomanip.h>
void main()
{
float a[10][10] ;
int m, n ;
// s hng, ct ca ma trn
int i, j ;
// cc ch s trong vng lp
int amax, imax, jmax ;
// s ln nht v ch s ca n
cout << "Nhp s hng v ct: " ; cin >> m >> n ;
for (i=0; i<m; i++)
for (j=0; j<n; j++)
{
cout << "a[" << i << "," << j << "] = " ; cin >> a[i][j] ;
}

61

amax = a[0][0]; imax = 0; jmax = 0;


for (i=0; i<m; i++)
for (j=0; j<n; j++)
if (amax < a[i][j])
{
amax = a[i][j]; imax = i; jmax = j;
}
cout << "Ma trn nhp\n" ;
cout << setiosflags(ios::showpoint) << setprecision(1) ;
for (i=0; i<m; i++)
for (j=0; j<n; j++)
{
if (j==0) cout << endl;
cout << setw(6) << a[i][j] ;
}
cout << "S ln nht l " << setw(6) << amax << endl;
cout << "ti v tr (" << imax << "," << jmax << ")" ;
}

Ghi ch: Khi lm vic vi mng (1 chiu, 2 chiu) do thi quen chng ta thng tnh ch s t 1
(thay v 0), do vy trong mng ta c th b qua hng 0, ct 0 bng cch khai bo s hng v ct tng
ln 1 so vi s hng, ct thc t ca mng v t c th lm vic t hng 1, ct 1 tr i.
V d : Nhn 2 ma trn. Cho 2 ma trn A (m x n) v B (n x p). Tnh ma trn C = A x B, trong C
c kch thc l m x p. Ta lp vng lp tnh tng phn t ca C. Gi tr ca phn t C ti hng i, ct
j chnh l tch v hng ca hng i ma trn A vi ct j ma trn B. trnh nhm ln ta qui c b
cc hng, ct 0 ca cc ma trn A, B, C (tc cc ch s c tnh t 1 tr i).
#include <iostream.h>
#include <iomanip.h>
void main()
{
float A[10][10], B[10], C[10][10] ;
int m, n, p ;
// s hng, ct ca ma trn
int i, j, k ;
// cc ch s trong vng lp
clrscr();
cout << "Nhp s hng v ct ca 2 ma trn: " ; cin >> m >> n >> p;
// Nhp ma trn A
for (i=1; i<=m; i++)
for (j=1; j<=n; j++)
{
cout << "A[" << i << "," << j << "] = " ; cin >> A[i][j] ;
}
// Nhp ma trn B
for (i=1; i<=n; i++)
for (j=1; j<=p; j++)
{
cout << "B[" << i << "," << j << "] = " ; cin >> B[i][j] ;
}

62

// Tnh ma trn C = A x B
for (i=1; i<=m; i++)
for (j=1; j<=p; j++)
{
C[i][j] = 0; for (k=1; k<=n; k++) C[i][j] += A[i][k]*B[k][j] ;
}
// In kt qu
cout << "Ma trn kt qu\n" ;
cout << setiosflags(ios::showpoint) << setprecision(2) ;
for (i=1; i<m; i++)
for (j=1; j<n; j++)
{
if (j==1) cout << endl;
cout << setw(6) << a[i][j] ;
}
}

63

BI TP
Lnh r nhnh
26. Nhp mt k t. Cho bit k t c phi l ch ci hay khng.
27. Nhp vo mt s nguyn. Tr li s nguyn : m hay dng, chn hay l ?
28. Cho n = x = y v bng: a. 1

b. 2

c. 3

d. 4

Hy cho bit gi tr ca x, y sau khi chy xong cu lnh:


if (n % 2 == 0) if (x > 3) x = 0;
else y = 0;
29. Tnh gi tr hm
a.

3x + x
f(x) = x
e +4

b.

x 2 +1

f ( x ) = 3x + 5
2
x + 2 x 1

, x>0
, x0
, x 1
, 1< x <1
, x 1

ax + by = c
dx + ey = f

30. Vit chng trnh gii h phng trnh bc nht 2 n:

31. Nhp 2 s a, b. In ra max, min ca 2 s . M rng vi 3 s, 4 s ?


32. Nhp 3 s a, b, c. Hy cho bit 3 s trn c th l di 3 cnh ca mt tam gic ? Nu l mt
tam gic th l tam gic g: vung, u, cn, vung cn hay tam gic thng ?
33. Nhp vo mt s, in ra th tng ng vi s (qui c 2 l th hai, , 8 l ch nht).
34. Nhp 2 s biu th thng v nm. In ra s ngy ca thng nm (c kim tra nm nhun).
35. Ly ngy thng hin ti lm chun. Hy nhp mt ngy bt k trong thng. Cho bit th ca
ngy va nhp ?

Lnh lp
36. Gi tr ca i bng bao nhiu sau khi thc hin cu trc for sau:
for (i = 0; i < 100; i++);
37. Gi tr ca x bng bao nhiu sau khi thc hin cu trc for sau:
for (x = 2; i < 10; x+=3) ;
38. Bn b sung g vo lnh for sau:
for ( ; nam < 1997 ; ) ;
khi kt thc nam c gi tr 2000.
39. Bao nhiu k t X c in ra mn hnh khi thc hin on chng trnh sau:
for (x = 0; x < 10; x ++) for (y = 5; y > 0; y --) cout << X;

64

40. Nhp vo tui cha v tui con hin nay sao cho tui cha ln hn 2 ln tui con. Tm xem bao
nhiu nm na tui cha s bng ng 2 ln tui con (v d 30 v 12, sau 6 nm na tui cha l
36 gp i tui con l 18).
41. Nhp s nguyn dng N. Tnh:
c. S1 =
d. S 2 =

1 + 2 + 3 + .. . + N
N
12 + 2 2 + 3 2 + ... + N 2

42. Nhp s nguyn dng n. Tnh:


e. S1 =
f.

S2 =

3 + 3 + 3 + .. . + 3
1
2+

n du chia

1
2+

n du cn

1
2+. . .

1
2

43. Nhp s t nhin n. In ra mn hnh biu din ca n dng nh phn.


44. In ra mn hnh cc s c 2 ch s sao cho tch ca 2 ch s ny bng 2 ln tng ca 2 ch s
(v d s 36 c tch 3*6 = 18 gp 2 ln tng ca n l 3 + 6 = 9).
45. S hon chnh l s bng tng mi c ca n (khng k chnh n). V d 6 = 1 + 2 + 3 l mt
s hon chnh. Hy in ra mn hnh tt c cc s hon chnh < 1000.
46. Cc s sinh i l cc s nguyn t m khong cch gia chng l 2. Hy in tt c cp s sinh
i < 1000.
47. Nhp dy k t n khi gp k t . th dng. Thng k s ch ci vit hoa, vit thng, s ch
s v tng s cc k t khc nhp. Loi k t no nhiu nht ?
48. Tm s nguyn dng n ln nht tho mn iu kin:

1 1
3 5

g. 1 + + + .. . +

1
< 2.101999 .
2n 1

h. e n 1999 log10 n < 2000 .


49. Cho = 1e6. Tnh gn ng cc s sau:

2
1 1 1
1
1
i. S pi theo cng thc Euler:
= 2 + 2 + 2 + ...+ 2 dng lp khi 2 <10 6 .
6 1 2 3
n
n
x1 x 2
xn
xn
j. e theo cng thc: e = 1 + +
+ ... +
dng lp khi
< 10 6 .
1! 2!
n!
n!
x

k. sin x = x

x3 x5
x 2 n +1
x 2 n +1
+ + .. . + ( 1 ) n
, dng lp khi
< 10 6 .
3! 5!
( 2n + 1 )!
( 2n + 1 )!
65

l.

a (a>0)

theo

cng

thc:

n=0
a
sn = 2
( s n 1 + a ) / 2 s n 1 n > 0

dng

khi

s n s n 1 <10 6 .
50. In ra m ca phm bt k c nhn. Chng trnh lp cho n khi nhn ESC thot.
51. Bng phng php chia i, hy tm nghim xp x ( chnh xc 106) ca cc phng trnh
sau:
m. ex 1.5 = 0, trn on [0, 1].
n. x2x 1 = 0, trn on [0, 1].
o. a0xn + a1xn-1 + ... + an = 0, trn on [a, b]. Cc s thc ai, a, b c nhp t bn phm sao
cho f(a) v f(b) tri du.

Mng
52. Nhp vo dy n s thc. Tnh tng dy, trung bnh dy, tng cc s m, dng v tng cc s
v tr chn, v tr l trong dy. Tm phn t gn s trung bnh nht ca dy.
53. Tm v ch ra v tr xut hin u tin ca phn t x trong dy.
54. Nhp vo dy n s. Hy in ra s ln nht, b nht ca dy.
55. Nhp vo dy s. In ra dy c sp xp tng dn, gim dn.
56. Cho dy c sp tng dn. Chn thm vo dy phn t x sao cho dy vn sp xp tng
dn.
57. Hy nhp vo 16 s nguyn. In ra thnh 4 dng, 4 ct.
58. Nhp ma trn A v in ra ma trn i xng ca n.
59. Cho mt ma trn nguyn kch thc m*n. Tnh:
Tng tt c cc phn t ca ma trn.
Tng tt c cc phn t dng ca ma trn.
Tng tt c cc phn t m ca ma trn.
Tng tt c cc phn t chn ca ma trn.
Tng tt c cc phn t l ca ma trn.
60. Cho mt ma trn thc kch thc m*n. Tm:
S nh nht, ln nht (km ch s) ca ma trn.
S nh nht, ln nht (km ch s) ca tng hng ca ma trn.
S nh nht, ln nht (km ch s) ca tng ct ca ma trn.
S nh nht, ln nht (km ch s) ca ng cho chnh ca ma trn.
S nh nht, ln nht (km ch s) ca ng cho ph ca ma trn.
61. Nhp 2 ma trn vung cp n A v B. Tnh A + B, A B, A * B v A2 - B2.

66

Xu k t
62. Hy nhp mt xu k t. In ra mn hnh o ngc ca xu .
63. Nhp xu. Thng k s cc ch s '0', s ch s '1', , s ch s '9' trong xu.
64. In ra v tr k t trng u tin t bn tri (phi) mt xu k t.
65. Nhp xu. In ra tt cc cc v tr ca ch 'a' trong xu v tng s ln xut hin ca n.
66. Nhp xu. Tnh s t c trong xu. In mi dng mt t.
67. Nhp xu h tn, in ra h, tn di dng vit hoa.
68. Thay k t x trong xu s bi k t y (s, x, y c c vo t bn phm)
69. Xo mi k t x c trong xu s (s, x c c vo t bn phm). (Gi : nn xo ngc t cui
xu v u xu).
70. Nhp xu. Khng phn bit vit hoa hay vit thng, hy in ra cc k t c mt trong xu v s
ln xut hin ca n (v d xu Trach Van Doanh c ch a xut hin 3 ln, c(1), d(1),
h(2), n(2), o(1), r(1), t(1), (2), space(4)).

67

CHNG IV.

HM V CHNG TRNH

Con tr v s hc a ch
Hm
qui
T chc chng trnh

CON TR V S HC A CH

IV.1.

Trc khi bn v hm v chng trnh, trong phn ny chng ta s ni v mt loi bin mi gi l


con tr, ngha, cng dng v s dng n nh th no. Bin con tr l mt c trng mnh ca
C++, n cho php chng ta thm nhp trc tip vo b nh x l cc bi ton kh bng ch vi
cu lnh n gin ca chng trnh. iu ny cng gp phn lm cho C++ tr thnh ngn ng gn
gi vi cc ngn ng cp thp nh hp ng. Tuy nhin, v tnh n gin, ngn gn nn vic s dng
con tr i hi tnh cn thn cao v giu kinh nghim ca ngi lp trnh.
IV.1.1. a ch, php ton &
Mi chng trnh trc khi chy u phi b tr cc bin do NSD khai bo vo u trong b nh.
to iu kin truy nhp d dng tr li cc bin ny, b nh c nh s, mi byte s c ng
vi mt s nguyn, c gi l a ch ca byte t 0 n ht b nh. T , mi bin (vi tn
bin) c gn vi mt s nguyn l a ch ca byte u tin m bin c phn phi. S lng
cc byte phn phi cho bin l khc nhau (nhng t lin nhau t thp n cao) tu thuc kiu d
liu ca bin (v tu thuc vo quan nim ca tng NNLT), tuy nhin ch cn bit tn bin hoc a
ch ca bin ta c th c/vit d liu vo/ra cc bin . T ngoi vic thng qua tn bin
chng ta cn c th thng qua a ch ca chng truy nhp vo ni dung. Tm li bin, nh v
a ch c quan h khng kht vi nhau. C++ cung cp mt ton t mt ngi & ly a ch ca
cc bin (ngoi tr bin mng v xu k t). Nu x l mt bin th &x l a ch ca x. T cu
lnh sau cho ta bit x c b tr u trong b nh:
int x ;
cout << &x ;

// a ch s c hin di dng c s 16. V d 0xfff4

i vi bin kiu mng, th tn mng chnh l a ch ca mng, do khng cn dng n ton t


&. V d a ch ca mng a chnh l a (khng phi &a). Mt khc a ch ca mng a cng chnh l
a ch ca byte u tin m mng a chim v n cng chnh l a ch ca phn t u tin ca
mng a. Do vy a ch ca mng a l a ch ca phn t a[0] tc &a[0]. Tm li, a ch ca mng
a l a hoc &a[0].

Tm li, cn nh:

68

int x;

// khai bo bin nguyn x

long y;

// khai bo bin nguyn di y

cout << &x << &y;

// in a ch cc bin x, y

char s[9];

// khai bo mng k t s

cout << a;

// in a ch mng s

cout << &a[0];

// in a ch mng s (tc a ch s[0])

// in a ch k t s[2]

cout << &a[2];

Hnh v sau y minh ho mt vi bin v a ch ca n trong b nh.


200 201

500 501 502 503

650 651

658

\0

x
y
s
Bin x chim 2 byte nh, c a ch l 200, bin y c a ch l 500 v chim 4 byte
nh. Xu s chim 9 byte nh ti a ch 650. Cc byte nh ca mt bin l lin nhau.
Cc php ton lin quan n a ch c gi l s hc a ch. Tuy nhin, chng ta vn khng c
php thao tc trc tip trn cc a ch nh t bin vo a ch ny hay khc (cng vic ny do
chng trnh dch m nhim), hay vic cng, tr hai a ch vi nhau l v ngha Cc thao tc
c php trn a ch vn phi thng qua cc bin trung gian cha a ch, c gi l bin con tr.
IV.1.2. Con tr
a. ngha

Con tr l mt bin cha a ch ca bin khc. Nu p l con tr cha a ch ca bin x ta


gi p tr ti x v x c tr bi p. Thng qua con tr ta c th lm vic c vi ni dung
ca nhng nh m p tr n.
con tr p tr ti x ta phi gn a ch ca x cho p.
lm vic vi a ch ca cc bin cn phi thng qua cc bin con tr tr n bin .
b. Khai bo bin con tr

<kiu c tr> <*tn bin> ;


a ch ca mt bin l a ch byte nh u tin ca bin . V vy ly c ni dung ca bin,
con tr phi bit c s byte ca bin, tc kiu ca bin m con tr s tr ti. Kiu ny cng c
gi l kiu ca con tr. Nh vy khai bo bin con tr cng ging nh khai bo mt bin thng
ngoi tr cn thm du * trc tn bin (hoc sau tn kiu). V d:
int *p ;
float *q, *r ;

// khai bo bin p l bin con tr tr n kiu d liu nguyn.


// hai con tr thc q v r.

c. S dng con tr, php ton *

con tr p tr n bin x ta phi dng php gn p = a ch ca x.


Nu x khng phi l mng ta vit: p = &x.
Nu x l mng ta vit: p = x hoc p = &x[0].

Khng gn p cho mt hng a ch c th. V d vit p = 200 l sai.

Php ton * cho php ly ni dung ni p tr n, v d gn ni dung ni p tr n cho


bin f ta vit f = *p.

& v * l 2 php ton ngc nhau. C th nu p = &x th x = *p. T nu p tr n x th

69

bt k ni no xut hin x u c th thay c bi *p v ngc li.


V d :
int i, j ;
int *p, *q ;
p = &i;
q = &j;
cout << &i ;
cout << q ;
i = 2;
*q = 5;
i++ ; cout << i ;
(*q)++ ; cout << j ;
(*p) = (*q) * 2 + 1;
cout << i ;

// khai bo 2 bin nguyn i, j


// khai bo 2 con tr nguyn p, q
// cho p tr ti i
// cho q tr ti j
// hi a ch bin i
// hi a ch bin j (thng qua q)
// gn i bng 2
// gn j bng 5 (thng qua q)
// tng i v hi i, i = 3
// tng j (thng qua q) v hi j, j = 6
// gn li i (thng qua p)
// 13

Qua v d trn ta thy mi thao tc vi i l tng ng vi *p, vi j l tng ng vi *q v


ngc li.
IV.1.3. Cc php ton vi con tr
Trn y ta trnh by v 2 php ton mt ngi lin quan n a ch v con tr l & v *. Phn
ny chng ta tip tc xt vi cc php ton khc lm vic vi con tr.
a. Php ton gn

Gn con tr vi a ch mt bin: p = &x ;


Gn con tr vi con tr khc: p = q ; (sau php ton gn ny p, q cha cng mt a ch,
cng tr n mt ni).
V d :
int i = 10 ;
int *p, *q, *r ;
p = q = r = &i ;
*p = q**q + 2**r + 1 ;
cout << i ;

// khai bo v khi to bin i = 10


// khai bo 3 con tr nguyn p, q, r
// cng tr ti i
// i = 10*10 + 2*10 + 1
// 121

b. Php ton tng gim a ch

p n: con tr tr n thnh phn th n sau (trc) p.


Mt n v tng gim ca con tr bng kch thc ca bin c tr. V d gi s p l con tr
nguyn (2 byte) ang tr n a ch 200 th p+1 l con tr tr n a ch 202. Tng t, p + 5 l
con tr tr n a ch 210. p 3 cha a ch 194.
194
p3

195

196

197

198

199

200
p

201

202
p+1

Nh vy, php ton tng, gim con tr cho php lm vic thun li trn mng. Nu con tr ang tr
n mng (tc ang cha a ch u tin ca mng), vic tng con tr ln 1 n v s dch chuyn

70

con tr tr n phn t th hai, T ta c th cho con tr chy t u n cui mng bng cch
tng con tr ln tng n v nh trong cu lnh for di y.
V d :
int a[100] = { 1, 2, 3, 4, 5, 6, 7 }, *p, *q;
p = a; cout << *p ;
p += 5; cout << *p ;
q = p - 4 ; cout << *q ;
for (int i=0; i<100; i++) cout << *(p+i) ;

// cho p tr n mng a, *p = a[0] = 1


// *p = a[5] = 6 ;
// q = a[1] = 2 ;
// in ton b mng a

c. Php ton t tng gim

p++, p--, ++p, --p: tng t p+1 v p-1, c ch n tng (gim) trc, sau.
V d : V d sau minh ho kt qu kt hp php t tng gim vi ly gi tr ni con tr tr n. a l
mt mng gm 2 s, p l con tr tr n mng a. Cc lnh di y c qui c l c lp vi
nhau (tc lnh sau khng b nh hng bi lnh trc, i vi mi lnh p lun lun tr n phn t
u (a[0]) ca a.
int a[2] = {3, 7}, *p = a;
(*p)++ ;
// tng (sau) gi tr ni p tr tng a[0] thnh 4
++(*p) ;
// tng (trc) gi tr ni p tr tng a[0] thnh 4
*(p++) ;
// ly gi tr ni p tr (3) v tng tr p (tng sau), p a[1]
*(++p) ;
// tng tr p (tng trc), p a[1] v ly gi tr ni p tr (7)

Ch :

Phn bit p+1 v p++ (hoc ++p):

p+1 c xem nh mt con tr khc vi p. p+1 tr n phn t sau p.

p++ l con tr p nhng tr n phn t khc. p++ tr n phn t ng sau phn t p tr


n ban u.

Phn bit *(p++) v *(++p):

Cc php ton t tng gim cng l mt ngi, mc u tin ca chng l cao hn cc php ton hai
ngi khc v cao hn php ly gi tr (*). C th:
*p++
*++p
++*p

*(p++)
*(++p)
++(*p)

Cng ging cc bin nguyn vic kt hp cc php ton ny vi nhau rt d gy nhm


ln, do vy cn s dng cp du ngoc qui nh trnh t tnh ton.
d. Hiu ca 2 con tr

Php ton ny ch thc hin c khi p v q l 2 con tr cng tr n cc phn t ca mt dy d


liu no trong b nh (v d cng tr n 1 mng d liu). Khi hiu p - q l s thnh phn
gia p v q (ch p - q khng phi l hiu ca 2 a ch m l s thnh phn gia p v q).
V d: gi s p v q l 2 con tr nguyn, p c a ch 200 v q c a ch 208. Khi p - q = 4 v q
- p = 4 (4 l s thnh phn nguyn t a ch 200 n 208).
e. Php ton so snh

Cc php ton so snh cng c p dng i vi con tr, thc cht l so snh gia a ch ca hai

71

ni c tr bi cc con tr ny. Thng thng cc php so snh <, <=, >, >= ch p dng cho hai
con tr tr n phn t ca cng mt mng d liu no . Thc cht ca php so snh ny chnh l
so snh ch s ca 2 phn t c tr bi 2 con tr .
V d :
float a[100], *p, *q ;
p=a;
// p tr n mng (tc p tr n a[0])
q = &a[3] ;
// q tr n phn t th 3 (a[3]) ca mng
cout << (p < q) ;
// 1
cout << (p + 3 == q) ;
// 1
cout << (p > q - 1) ;
// 0
cout << (p >= q - 2) ;
// 0
for (p=a ; p < a+100; p++) cout << *p ; // in ton b mng a

IV.1.4. Cp pht ng, ton t cp pht, thu hi new, delete


Khi tin hnh chy chng trnh, chng trnh dch s b tr cc nh c th cho cc bin c
khai bo trong chng trnh. V tr cng nh s lng cc nh ny tn ti v c nh trong sut
thi gian chy chng trnh, chng xem nh b chim dng v s khng c s dng vo mc
ch khc v ch c gii phng sau khi chm dt chng trnh. Vic phn b b nh nh vy
c gi l cp pht tnh (v c cp sn trc khi chy chng trnh v khng th thay i tng,
gim kch thc hoc v tr trong sut qu trnh chy chng trnh). V d nu ta khai bo mt mng
nguyn cha 1000 s th trong b nh s c mt vng nh lin tc 2000 bytes cha d liu ca
mng ny. Khi d trong chng trnh ta ch nhp vo mng v lm vic vi mt vi s th phn
mng ri cn li vn khng c s dng vo vic khc. y l hn ch th nht ca kiu mng.
mt hng khc, mt ln no chy chng trnh ta li cn lm vic vi hn 1000 s nguyn. Khi
vng nh m chng trnh dch dnh cho mng l khng s dng. y chnh l hn ch
th hai ca mng c khai bo trc.
Khc phc cc hn ch trn ca kiu mng, by gi chng ta s khng khai bo (b tr) trc mng
d liu vi kch thc c nh nh vy. Kch thc c th s c cp pht trong qu trnh chy
chng trnh theo ng yu cu ca NSD. Nh vy chng ta c s nh lm vic m vn tit
kim c b nh, v khi khng dng na ta c th thu hi (cn gi l gii phng) s nh ny
chng trnh s dng vo vic khc. Hai cng vic cp pht v thu hi ny c thc hin thng
qua cc ton t new, delete v con tr p. Thng qua p ta c th lm vic vi bt k a ch no ca
vng c cp pht. Cch thc b tr b nh nh th ny c gi l cp pht ng. Sau y l c
php ca cu lnh new.
p = new <kiu> ;

// cp pht 1 phn t

p = new <kiu>[n] ;

// cp pht n phn t

V d:
int *p ;
p = new int;
p = float int[100] ;

// cp pht vng nh cha c 1 s nguyn


// cp pht vng nh cha c 100 s thc

Khi gp ton t new, chng trnh s tm trong b nh mt lng nh cn ri v lin


tc vi s lng theo yu cu v cho p tr n a ch (byte u tin) ca vng nh ny.
Nu khng c vng nh vi s lng nh vy th vic cp pht l tht bi v p = NULL
(NULL l mt a ch rng, khng xc nh). Do vy ta c th kim tra vic cp pht c
thnh cng hay khng thng qua kim tra con tr p bng hay khc NULL. V d:
72

float *p ;
int n ;
cout << "S lng cn cp pht = "; cin >> n;
p = new double[n];
if (p == NULL) {
cout << "Khng b nh" ;
exit(0) ;
}

Ghi ch: lnh exit(0) cho php thot khi chng trnh, s dng lnh ny cn khai
bo file tiu <process.h>.
gii phng b nh cp pht cho mt bin (khi khng cn s dng na) ta s
dng cu lnh delete.
delete p ;

// p l con tr c s dng trong new

v gii phng ton b mng c cp php thng qua con tr p ta dng cu lnh:
delete[] p ;

// p l con tr tr n mng

Di y l v d s dng tng hp cc php ton trn con tr.


V d : Nhp dy s (khng dng mng). Sp xp v in ra mn hnh.
Trong v d ny chng trnh xin cp pht b nh cha n s nguyn v c tr bi con tr
head. Khi a ch ca s nguyn u tin v cui cng s l head v head+n-1. p v q l 2 con tr
chy trn dy s ny, so snh v i ni dung ca cc s ny vi nhau sp thnh dy tng dn v
cui cng in kt qu.
void main()
{
int *head, *p, *q, n, tam;
// head tr n (nh du) u dy
cout << "Cho bit s s hng ca dy: "); cin >> n ;
head = new int[n] ;
// cp pht b nh cha n s nguyn
for (p=head; p<head+n; p++)
// nhp dy
{
cout << "So thu " << p-head+1 << ": " ; cin >> *p ;
}
for (p=head; p<head+n-1; p++)
// sp xp
for (q=p+1; q<head+n; q++)
if (*q < *p) { tam = *p; *p = *q; *q = tam; }
// i ch
for (p=head; p<head+n; p++) cout << *p ;
// in kt qu
}

IV.1.5. Con tr v mng, xu k t


a. Con tr v mng 1 chiu

Vic cho con tr tr n mng cng tng t tr n cc bin khc, tc gn a ch ca mng (chnh
l tn mng) cho con tr. Ch rng a ch ca mng cng l a ch ca thnh phn th 0 nn a+i
s l a ch thnh phn th i ca mng. Tng t, nu p tr n mng a th p+i l a ch thnh
phn th i ca mng a v do *(p+i) = a[i] = *(a+i).

73

Ch khi vit *(p+1) = *(a+1) ta thy vai tr ca p v a trong biu thc ny l nh nhau, cng truy
cp n gi tr ca phn t a[1]. Tuy nhin khi vit *(p++) th li khc vi *(a++), c th vit p++ l
hp l cn a++ l khng c php. L do l tuy p v a cng th hin a ch ca mng a nhng p
thc s l mt bin, n c th thay i c gi tr cn a l mt hng, gi tr khng c php thay
i. V d vit x = 3 v sau c th tng x bi x++ nhng khng th vit x = 3++.
V d : In ton b mng thng qua con tr.
int a[5] = {1,2,3,4,5}, *p, i;
1: p = a; for (i=1; i<=5; i++) cout << *(p+i);

// p khng thay i

2: for (p=a; p<=a+4; p++) cout << *p ;

// thay i p

hoc:
Trong phng n 1, con tr p khng thay i trong sut qu trnh lm vic ca lnh for, truy
nhp n phn t th i ca mng a ta s dng c php *(p+i).
i vi phng n 2 con tr s dch chuyn dc theo mng a bt u t a ch a (phn t u tin)
n phn t cui cng. Ti bc th i, p s tr vo phn t a[i], do ta ch cn in gi tr *p.
kim tra khi no p t n phn t cui cng, ta c th so snh p vi a ch cui mng chnh l a
ch u mng cng thm s phn t trong a v tr 1 (tc a+4 trong v d trn).
b. Con tr v xu k t

Mt con tr k t c th xem nh mt bin xu k t, trong xu chnh l tt c cc k t k t byte


con tr tr n cho n byte '\0' gp u tin. V vy ta c th khai bo cc xu di dng con tr k
t nh sau.
char *s ;
char *s = "Hello" ;
Cc hm trn xu vn c s dng nh khi ta khai bo n di dng mng k t. Ngoi ra khc vi
mng k t, ta c php s dng php gn cho 2 xu di dng con tr, v d:
char *s, *t = "Tin hc" ; s = t;

// thay cho hm strcpy(s, t) ;

Thc cht php gn trn ch l gn 2 con tr vi nhau, n cho php s by gi cng c tr n ni


m t tr (tc dy k t "Tin hc" b tr sn trong b nh)
Khi khai bo xu dng con tr n vn cha c b nh c th, v vy thng thng km theo khai
bo ta cn phi xin cp pht b nh cho xu vi di cn thit. V d:
char *s = new char[30], *t ;
strcpy(s, "Hello") ;

// trong trng hp ny khng cn cp pht b

t=s;

// nh cho t v t v s cng s dng chung vng nh

nhng:
char *s = new char[30], *t ;
strcpy(s, "Hello") ;
t = new char[30];
// trong trng hp ny phi cp b nh cho t v
strcpy(t, s) ;
// c ch strcpy sao chp sang ni dung ca s.
c. Con tr v mng hai chiu

d hiu vic s dng con tr tr n mng hai chiu, chng ta nhc li v mng 2 chiu thng
qua v d. Gi s ta c khai bo:

74

float a[2][3], *p;


khi a c b tr trong b nh nh l mt dy 6 phn t float nh sau

a+1

tuy nhin a khng c xem l mng 1 chiu vi 6 phn t m c quan nim nh mng mt
chiu gm 2 phn t, mi phn t l 1 b 3 s thc. Do a ch ca mng a chnh l a ch ca
phn t u tin a[0][0], v a+1 khng phi l a ch ca phn t tip theo a[0][1] m l a ch ca
phn t a[1][0]. Ni cch khc a+1 cng l tng a ch ca a ln mt thnh phn, nhng 1 thnh
phn y c hiu l ton b mt dng ca mng.
Mt khc, vic ly a ch ca tng phn t (float) trong a thng l khng chnh xc. V d: vit
&a[i][j] (a ch ca phn t dng i ct j) l c i vi mng nguyn nhng li khng ng i
vi mng thc.
T cc tho lun trn, php gn p = a l d gy nhm ln v p l con tr float cn a l a ch mng
(1 chiu). Do vy trc khi gn ta cn p kiu ca a v kiu float. Tm li cch gn a ch ca a
cho con tr p c thc hin nh sau:
Cch sai:
p=a;

// sai v khc kiu

Cc cch ng:
p = (float*)a;
p = a[0];
p = &a[0][0];

// p kiu ca a v con tr float (cng l kiu ca p)


// gn vi a ch ca mng a[0]
// gn vi a ch s thc u tin trong a

trong cch dng p = (float*)a; l trc quan v ng trong mi trng hp nn c


dng thng dng hn c.
Sau khi gn a cho p (p l con tr thc), vic tng gim p chnh l dch chuyn con tr trn tng phn
t (thc) ca a. Tc:
p tr ti a[0][0]
p+1
tr ti a[0][1]
p+2
tr ti a[0][2]
p+3
tr ti a[1][0]
p+4
tr ti a[1][1]
p+5
tr ti a[1][2]

Tng qut, i vi mng m x n phn t:


p + i*n + j tr ti a[i][j]

hoc

a[i][j] = *(p + i*n + j)

T truy nhp n phn t a[i][j] thng qua con tr p ta nn s dng cch vit sau:
p = (float*)a;
cin >> *(p+i*n+j) ;
cout << *(p+i*n+j);

// nhp cho a[i][j]


// in a[i][j]

V d sau y cho php nhp v in mt mng 2 chiu m*n (m dng, n ct) thng qua
con tr p. Nhp lin tip m*n s vo mng v in thnh ma trn m dng, n ct.
void main()
{

75

float a[m][n], *p;


int i, j;
p = (float*) a;
for (i=0; i<m*n; i++) cin >> *(p+i);
// nhp nh dy mxn phn t
*(p+2*n+3) = 100; *(p+4*n) = 100;
// gn a[2,3] = a[4][0] = 100
for (i=0; i<m; i++)
// in li di dng ma trn
{
for (j=0; j<n; j++) cout << *(p+i*n+j);
cout << endl;
}
}

Ch : vic ly a ch phn t a[i][j] ca mng thc a l khng chnh xc. Tc: vit p = &a[i][j] c
th dn n kt qu sai.
IV.1.6. Mng con tr
a. Khi nim chung

Thc cht mt con tr cng l mt bin thng thng c tn gi (v d p, q, ), do cng ging


nh bin, nhiu bin cng kiu c th t chc thnh mt mng vi tn gi chung, y cng vy
nhiu con tr cng kiu cng c t chc thnh mng. Nh vy mi phn t ca mng con tr l
mt con tr tr n mt mng no . Ni cch khc mt mng con tr cho php qun l nhiu
mng d liu cng kiu. Cch khai bo:
<kiu> *a[size];
V d:
int *a[10];
khai bo mt mng cha 10 con tr. Mi con tr a[i] cha a ch ca mt mng nguyn no .
b. Mng xu k t

L trng hp ring ca mng con tr ni chung, trong kiu c th l char. Mi thnh phn
mng l mt con tr tr n mt xu k t, c ngha cc thao tc tin hnh trn *a[i] nh i vi mt
xu k t.
V d : Nhp vo v in ra mt bi th.
void main()
{
char *dong[100];
// khai bo 100 con tr k t (100 dng)
int i, n;
cout << "so dong = "; cin >> n ; // nhp s dng thc s
cin.ignore();
// loi du trong lnh cin trn
for (i=0; i<n; i++)
{
dong[i] = new char[80];
// cp b nh cho dng i
cin.getline(dong[i],80);
// nhp dng i
}
for (i=0; i<n; i++) cout << dong[i] << endl; // in kt qu

76

IV.2.

HM

Hm l mt chng trnh con trong chng trnh ln. Hm nhn (hoc khng) cc i s v tr li
(hoc khng) mt gi tr cho chng trnh gi n. Trong trng hp khng tr li gi tr, hm hot
ng nh mt th tc trong cc NNLT khc. Mt chng trnh l tp cc hm, trong c mt hm
chnh vi tn gi main(), khi chy chng trnh, hm main() s c chy u tin v gi n hm
khc. Kt thc hm main() cng l kt thc chng trnh.
Hm gip cho vic phn on chng trnh thnh nhng mun ring r, hot ng c lp vi ng
ngha ca chng trnh ln, c ngha mt hm c th c s dng trong chng trnh ny m cng
c th c s dng trong chng trnh khc, d cho vic kim tra v bo tr chng trnh. Hm c
mt s c trng:

Nm trong hoc ngoi vn bn c chng trnh gi n hm. Trong mt vn bn c th


cha nhiu hm,

c gi t chng trnh chnh (main), t hm khc hoc t chnh n ( quy),

Khng lng nhau.

C 3 cch truyn gi tr: Truyn theo tham tr, tham bin v tham tr.
IV.2.1. Khai bo v nh ngha hm

a. Khai bo

Mt hm thng lm chc nng: tnh ton trn cc tham i v cho li gi tr kt qu, hoc ch n
thun thc hin mt chc nng no , khng tr li kt qu tnh ton. Thng thng kiu ca gi
tr tr li c gi l kiu ca hm. Cc hm thng c khai bo u chng trnh. Cc hm
vit sn c khai bo trong cc file nguyn mu *.h. Do , s dng c cc hm ny, cn c
ch th #include <*.h> ngay u chng trnh, trong *.h l tn file c th c cha khai bo ca
cc hm c s dng (v d s dng cc hm ton hc ta cn khai bo file nguyn mu math.h).
i vi cc hm do NSD t vit, cng cn phi khai bo. Khai bo mt hm nh sau:
<kiu gi tr tr li> <tn hm>(d/s kiu i) ;

trong , kiu gi tr tr li cn gi l kiu hm v c th nhn kiu bt k chun ca C++ v c


kiu ca NSD t to. c bit nu hm khng tr li gi tr th kiu ca gi tr tr li c khai bo
l void. Nu kiu gi tr tr li c b qua th chng trnh ngm nh hm c kiu l int (phn
bit vi void !).
V d :
int bp(int);
// Khai bo hm bp, c i kiu int v kiu hm l int
int rand100();
// Khng i, kiu hm (gi tr tr li) l int
void alltrim(char[]) ;// i l xu k t, hm khng tr li gi tr (khng kiu).
cong(int, int);
// Hai i kiu int, kiu hm l int (ngm nh).

Thng thng chng trnh c r rng chng ta nn trnh lm dng cc ngm nh. V d
trong khai bo cong(int, int); nn khai bo r c kiu hm (trong trng hp ny kiu hm ngm
nh l int) nh sau : int cong(int, int);
b. nh ngha hm

77

Cu trc mt hm bt k c b tr cng ging nh hm main() trong cc phn trc. C th:

Hm c tr v gi tr

<kiu hm> <tn hm>(danh sch tham i hnh thc)


{
khai bo cc b ca hm ;

// ch dng ring cho hm ny

dy lnh ca hm ;
return (biu thc tr v);

// c th nm u trong dy lnh.

}
Danh sch tham i hnh thc cn c gi ngn gn l danh sch i gm dy cc i
cch nhau bi du phy, i c th l mt bin thng, bin tham chiu hoc bin con tr,
hai loi bin sau ta s trnh by trong cc phn ti. Mi i c khai bo ging nh khai
bo bin, tc l cp gm <kiu i> <tn i>.
Vi hm c tr li gi tr cn c cu lnh return km theo sau l mt biu thc. Kiu ca
gi tr biu thc ny chnh l kiu ca hm c khai bo phn tn hm. Cu lnh
return c th nm v tr bt k trong phn cu lnh, tu thuc mc ch ca hm. Khi
gp cu lnh return chng trnh tc khc thot khi hm v tr li gi tr ca biu thc
sau return nh gi tr ca hm.
V d : V d sau nh ngha hm tnh lu tha n (vi n nguyn) ca mt s thc bt k. Hm ny c
hai u vo (i thc x v s m nguyn n) v u ra (gi tr tr li) kiu thc vi chnh xc gp
i l xn.
double luythua(float x, int n)
{
int i ;
double kq = 1 ;
for (i=1; i<=n; i++) kq *= x ;
return kq;
}

// bin ch s
// lu kt qu

Hm khng tr v gi tr

Nu hm khng tr li gi tr (tc kiu hm l void), khi c th c hoc khng c cu lnh return,


nu c th ng sau return s khng c biu thc gi tr tr li.
V d : Hm xo mn hnh 100 ln, hm ch lm cng vic cn thn xo mn hnh nhiu ln mn
hnh tht sch, nn khng c gi tr g tr li.
void xmh()
{
int i;
for (i=1; i<=100; i++) clrscr();
return ;
}

Hm main() thng thng c hoc khng c gi tr tr v cho h iu hnh khi chng trnh chy
xong, v vy ta thng khai bo kiu hm l int main() hoc void main() v cu lnh cui cng
trong hm thng l return 1 hoc return. Trng hp b qua t kho void nhng trong thn hm
khng c cu lnh return (ging phn ln v d trong gio trnh ny) chng trnh s ngm hiu

78

hm main() tr li mt gi tr nguyn nhng v khng c nn khi dch chng trnh ta s gp li


cnh bo "Cn c gi tr tr li cho hm" (mt li cnh bo khng phi l li, chng trnh vn chy
bnh thng). trnh b quy ry v nhng li cnh bo "khng mi" ny chng ta c th t
thm cu lnh return 0; (nu khng khai bo void main()) hoc khai bo kiu hm l void main() v
t cu lnh return vo cui hm.
c. Ch v khai bo v nh ngha hm

Danh sch i trong khai bo hm c th cha hoc khng cha tn i, thng thng ta
ch khai bo kiu i ch khng cn khai bo tn i, trong khi dng u tin ca nh
ngha hm phi c tn i y .

Cui khai bo hm phi c du chm phy (;), trong khi cui dng u tin ca nh ngha
hm khng c du chm phy.

Hm c th khng c i (danh sch i rng), tuy nhin cp du ngoc sau tn hm vn


phi c vit. V d clrscr(), lamtho(), vietgiaotrinh(),

Mt hm c th khng cn phi khai bo nu n c nh ngha trc khi c hm no


gi n n. V d c th vit hm main() trc (trong vn bn chng trnh), ri sau
mi vit n cc hm "con". Do trong hm main() chc chn s gi n hm con ny nn
danh sch ca chng phi c khai bo trc hm main(). Trng hp ngc li nu cc
hm con c vit (nh ngha) trc th khng cn phi khai bo chng na (v trong
nh ngha hm khai bo). Nguyn tc ny p dng cho hai hm A, B bt k ch
khng ring cho hm main(), ngha l nu B gi n A th trc A phi c nh
ngha hoc t nht cng c dng khai bo v A.
IV.2.2. Li gi v s dng hm

Li gi hm c php xut hin trong bt k biu thc, cu lnh ca hm khc Nu li gi hm


li nm trong chnh bn thn hm th ta gi l quy. gi hm ta ch cn vit tn hm v
danh sch cc gi tr c th truyn cho cc i t trong cp du ngoc trn ().
tn hm(danh sch tham i thc s) ;
Danh sch tham i thc s cn gi l danh sch gi tr gm cc gi tr c th gn ln
lt cho cc i hnh thc ca hm. Khi hm c gi thc hin th tt c nhng v tr
xut hin ca i hnh thc s c gn cho gi tr c th ca i thc s tng ng trong
danh sch, sau hm tin hnh thc hin cc cu lnh ca hm ( tnh kt qu).
Danh sch tham i thc s truyn cho tham i hnh thc c s lng bng vi s lng
i trong hm v c truyn cho i theo th t tng ng. Cc tham i thc s c th
l cc hng, cc bin hoc biu thc. Bin trong gi tr c th trng vi tn i. V d ta c
hm in n ln k t c vi tn hm inkitu(int n, char c); v li gi hm inkitu(12, 'A'); th n
v c l cc i hnh thc, 12 v 'A' l cc i thc s hoc gi tr. Cc i hnh thc n v c
s ln lt c gn bng cc gi tr tng ng l 12 v 'A' trc khi tin hnh cc cu
lnh trong phn thn hm. Gi s hm in k t c khai bo li thnh inkitu(char c, int
n); th li gi hm cng phi c thay li thnh inkitu('A', 12).
Cc gi tr tng ng c truyn cho i phi c kiu cng vi kiu i (hoc C++ c
th t ng chuyn kiu c v kiu ca i).
Khi mt hm c gi, ni gi tm thi chuyn iu khin n thc hin dng lnh u
tin trong hm c gi. Sau khi kt thc thc hin hm, iu khin li c tr v thc

79

hin tip cu lnh sau lnh gi hm ca ni gi.


V d : Gi s ta cn tnh gi tr ca biu thc 2x3 - 5x2 - 4x + 1, thay cho vic tnh trc tip x3 v
x2, ta c th gi hm luythua() trong v d trn tnh cc gi tr ny bng cch gi n trong hm
main() nh sau:
#include <iostream.h>
#include <iomanip.h>
double luythua(float x, int n)
// tr li gi tr xn
{
int i ;
// bin ch s
double kq = 1 ;
// lu kt qu
for (i=1; i<=n; i++) kt qu *= x ;
return kq;
}
void xmh(int n)
{
int i;
for (i=1; i<=n; i++) clrscr();
return ;
}

// xo mn hnh n ln

void main()
// tnh gi tr 2x3 - 5x2 - 4x + 1
{
float x ;
// tn bin c th trng vi i ca hm
double f ;
// lu kt qu
cout << "x = " ; cin >> x
f = 2*luythua(x,3) - 5*luythua(x,2) - 4*x + 1;
xmh(100);
// xo tht sch mn hnh 100 ln
cout << setprecision(2) << f << endl ;
}

Qua v d ny ta thy li ch ca lp trnh cu trc, chng trnh tr nn gn hn, chng hn hm


luythua() ch c vit mt ln nhng c th s dng n nhiu ln (2 ln trong v d ny) ch bng
mt cu lnh gi n gin cho mi ln s dng thay v phi vit li nhiu ln on lnh tnh lu
tha.
IV.2.3. Hm vi i mc nh
Mc ny v mc sau chng ta bn n mt vi m rng thit thc ca C++ i vi C c lin quan
n hm, l hm vi i mc nh v cch to, s dng cc hm c chung tn gi. Mt m rng
quan trng khc l cch truyn i theo tham chiu s c bn chung trong mc truyn tham i
thc s cho hm.
Trong phn trc chng ta khng nh s lng tham i thc s phi bng s lng tham i
hnh thc khi gi hm. Tuy nhin, trong thc t rt nhiu ln hm c gi vi cc gi tr ca mt
s tham i hnh thc c lp i lp li. Trong trng hp nh vy lc no cng phi vit mt
danh sch di cc tham i thc s ging nhau cho mi ln gi l mt cng vic khng my th v.
T thc t C++ a ra mt c php mi v hm sao cho mt danh sch tham i thc s trong
li gi khng nht thit phi vit y nu mt s trong chng c sn nhng gi tr nh trc.

80

C php ny c gi l hm vi tham i mc nh v c khai bo vi c php nh sau:


<kiu hm> <tn hm>(1, , n, m1 = gt1, , mm = gtm) ;
Cc i 1, , n v i mc nh m1, , mm u c khai bo nh c ngha l
gm c kiu i v tn i.
Ring cc i mc nh m1, , mm c gn thm cc gi tr mc nh gt1, , gtm.
Mt li gi bt k khi gi n hm ny u phi c y cc tham i thc s ng vi
cc 1, , m nhng c th c hoc khng cc tham i thc s ng vi cc i mc
nh m1, , mm. Nu tham i no khng c tham i thc s th n s c t
ng gn gi tr mc nh khai bo.
V d :
Xt hm xmh(int n = 100), trong n mc nh l 100, ngha l nu gi xmh(99) th mn
hnh c xo 99 ln, cn nu gi xmh(100) hoc gn hn xmh() th chng trnh s xo
mn hnh 100 ln.
Tng t, xt hm int luythua(float x, int n = 2); Hm ny c mt tham i mc nh l s
m n, nu li gi hm b qua s m ny th chng trnh hiu l tnh bnh phng ca x
(n = 2). V d li gi luythua(4, 3) c hiu l 43 cn luythua(4) c hiu l 42.
Hm tnh tng 4 s nguyn: int tong(int m, int n, int i = 0; int j = 0); khi c th tnh
tng ca 5, 2, 3, 7 bng li gi hm tong(5,2,3,7) hoc c th ch tnh tng 3 s 4, 2, 1
bng li gi tong(4,2,1) hoc cng c th gi tong(6,4) ch tnh tng ca 2 s 6 v 4.
Ch : Cc i ngm nh phi c khai bo lin tc v xut hin cui cng trong danh sch i.
V d:
int tong(int x, int y=2, int z, int t=1); // sai v cc i mc nh khng lin tc
void xoa(int x=0, int y)
// sai v i mc nh khng cui

IV.2.4. Khai bo hm trng tn


Hm trng tn hay cn gi l hm chng (). y l mt k thut cho php s dng cng mt tn
gi cho cc hm "ging nhau" (cng mc ch) nhng x l trn cc kiu d liu khc nhau hoc
trn s lng d liu khc nhau. V d hm sau tm s ln nht trong 2 s nguyn:
int max(int a, int b) { return (a > b) ? a: b ; }
Nu t c = max(3, 5) ta s c c = 5. Tuy nhin cng tng t nh vy nu t c = max(3.0, 5.0)
chng trnh s b li v cc gi tr (float) khng ph hp v kiu (int) ca i trong hm max.
Trong trng hp nh vy chng ta phi vit hm mi tnh max ca 2 s thc. Mc ch, cch
lm vic ca hm ny hon ton ging hm trc, tuy nhin trong C v cc NNLT c in khc
chng ta buc phi s dng mt tn mi cho hm "mi" ny. V d:
float fmax(float a, float b) { return (a > b) ? a: b ; }
Tng t tun tin ta s vit thm cc hm
char cmax(char a, char b) { return (a > b) ? a: b ; }
long lmax(long a, long b) { return (a > b) ? a: b ; }
double dmax(double a, double b) { return (a > b) ? a: b ; }

Tm li ta s c 5 hm: max, cmax, fmax, lmax, dmax, vic s dng tn nh vy s


gy bt li khi cn gi hm. C++ cho php ta c th khai bo v nh ngha c 5 hm trn
81

vi cng 1 tn gi v d l max chng hn. Khi ta c 5 hm:


1:
2:
3:
4:
5:

int max(int a, int b) { return (a > b) ? a: b ; }


float max(float a, float b) { return (a > b) ? a: b ; }
char max(char a, char b) { return (a > b) ? a: b ; }
long max(long a, long b) { return (a > b) ? a: b ; }
double max(double a, double b) { return (a > b) ? a: b ; }

V li gi hm bt k dng no nh max(3,5), max(3.0,5), max('O', 'K') u c p ng. Chng


ta c th t ra vn : vi c 5 hm cng tn nh vy, chng trnh gi n hm no. Vn c
gii quyt d dng v chng trnh s da vo kiu ca cc i khi gi quyt nh chy hm no.
V d li gi max(3,5) c 2 i u l kiu nguyn nn chng trnh s gi hm 1, li gi
max(3.0,5) hng n hm s 2 v tng t chng trnh s chy hm s 3 khi gp li gi
max('O','K'). Nh vy mt c im ca cc hm trng tn l trong danh sch i ca chng phi
c t nht mt cp i no khc kiu nhau. Mt c trng khc phn bit thng qua cc i
l s lng i trong cc hm phi khc nhau (nu kiu ca chng l ging nhau).
V d vic v cc hnh: thng, tam gic, vung, ch nht trn mn hnh l ging nhau, chng ch
ph thuc vo s lng cc im ni v to ca chng. Do vy ta c th khai bo v nh ngha
4 hm v ni trn vi cng chung tn gi. Chng hn:
void ve(Diem A, Diem B) ;
void ve(Diem A, Diem B, Diem C) ;
void ve(Diem A, Diem B, Diem C, Diem D) ;

// v ng thng AB
// v tam gic ABC
// v t gic ABCD

trong v d trn ta gi thit Diem l mt kiu d liu lu to ca cc im trn mn hnh. Hm


ve(Diem A, Diem B, Diem C, Diem D) s v hnh vung, ch nht, thoi, bnh hnh hay hnh thang
ph thuc vo to ca 4 im ABCD, ni chung n c s dng v mt t gic bt k.
Tm li nhiu hm c th c nh ngha chng (vi cng tn gi ging nhau) nu chng tho cc
iu kin sau:

S lng cc tham i trong hm l khc nhau, hoc

Kiu ca tham i trong hm l khc nhau.

K thut chng tn ny cn p dng c cho cc ton t. Trong phn lp trnh hng i tng, ta s
thy NSD c php nh ngha cc ton t mi nhng vn ly tn c nh +, -, *, /
IV.2.5. Bin, i tham chiu
Mt bin c th c gn cho mt b danh mi, v khi ch no xut hin bin th cng tng
ng nh dng b danh v ngc li. Mt b danh nh vy c gi l mt bin tham chiu,
ngha thc t ca n l cho php "tham chiu" ti mt bin khc cng kiu ca n, tc s dng bin
khc nhng bng tn ca bin tham chiu.
Ging khai bo bin bnh thng, tuy nhin trc tn bin ta thm du v (&). C th tm phn
bin thnh 3 loi: bin thng vi tn thng, bin con tr vi du * trc tn v bin tham chiu
vi du &.
<kiu bin> &<tn bin tham chiu> = <tn bin c tham chiu>;
C php khai bo ny cho php ta to ra mt bin tham chiu mi v cho n tham chiu n bin
c tham chiu (cng kiu v phi c khai bo t trc). Khi bin tham chiu cn c gi
l b danh ca bin c tham chiu. Ch khng c c php khai bo ch tn bin tham chiu m
khng km theo khi to.

82

V d:
int hung, dung ;
int &ti = hung;
int &teo = dung;

// khai bo cc bin nguyn hung, dung


// khai bo bin tham chiu ti, teo tham chieu n
// hung dung. ti, teo l b danh ca hung, dung

T v tr ny tr i vic s dng cc tn hung, ti hoc dung, teo l nh nhau.


V d:
hung = 2 ;
ti ++;
cout << hung << ti ;
teo = ti + hung ;
dung ++ ;
cout << dung << teo ;

// tng ng hung ++;


// 3 3
// tng ng dung = hung + hung
// tng ng teo ++
// 7 7

Vy s dng thm bin tham chiu lm g ?


Cch t chc bn trong ca mt bin tham chiu khc vi bin thng ch ni dung ca n l a
ch ca bin m n i din (ging bin con tr), v d cu lnh
cout << teo ;

// 7

in ra gi tr 7 nhng thc cht y khng phi l ni dung ca bin teo, ni dung ca teo l a ch
ca dung, khi cn in teo, chng trnh s tham chiu n dung v in ra ni dung ca dung (7). Cc
hot ng khc trn teo cng vy (v d teo++), thc cht l tng mt n v ni dung ca dung
(ch khng phi ca teo). T cch t chc ca bin tham chiu ta thy chng ging con tr nhng
thun li hn ch khi truy cp n gi tr ca bin c tham chiu (dung) ta ch cn ghi tn bin
tham chiu (teo) ch khng cn thm ton t (*) trc nh trng hp dng con tr. im khc
bit ny c ch khi c s dng truyn i cho cc hm vi mc ch lm thay i ni dung ca
bin ngoi. T tng ny c trnh by r rng hn trong mc 6 ca chng.
Ch :

Bin tham chiu phi c khi to khi khai bo.

Tuy ging con tr nhng khng dng c cc php ton con tr cho bin tham chiu.
Ni chung ch nn dng trong truyn i cho hm.
IV.2.6. Cc cch truyn tham i

C 3 cch truyn tham i thc s cho cc tham i hnh thc trong li gi hm. Trong cch ta
dng cho n thi im hin nay c gi l truyn theo tham tr, tc cc i hnh thc s nhn
cc gi tr c th t li gi hm v tin hnh tnh ton ri tr li gi tr. d hiu cc cch truyn
i chng ta s xem qua cch thc chng trnh thc hin vi cc i khi thc hin hm.
a. Truyn theo tham tr

Ta xt li v d hm luythua(float x, int n) tnh xn. Gi s trong chng trnh chnh ta c cc bin


a, b, f ang cha cc gi tr a = 2, b = 3, v f cha c gi tr. tnh ab v gn gi tr tnh c cho
f, ta c th gi f = luythua(a,b). Khi gp li gi ny, chng trnh s t chc nh sau:
To 2 bin mi (tc 2 nh trong b nh) c tn x v n. Gn ni dung cc nh ny bng
cc gi tr trong li gi, tc gn 2 (a) cho x v 3 (b) cho n.
Ti phn khai bo (ca hm), chng trnh to thm cc nh mang tn kq v i.

83

Tin hnh tnh ton (gn li kt qu cho kq).


Cui cng ly kt qu trong kq gn cho nh f (l nh c sn c khai bo trc,
nm bn ngoi hm).
Kt thc hm quay v chng trnh gi. Do hm luythua hon thnh xong vic tnh
ton nn cc nh c to ra trong khi thc hin hm (x, n, kq, i) s c xo khi b
nh. Kt qu tnh ton c lu gi trong nh f (khng b xo v khng lin quan g n
hm).
Trn y l truyn i theo cch thng thng. Vn t ra l gi s ngoi vic tnh f, ta cn
mun thay i cc gi tr ca cc nh a, b (khi truyn n cho hm) th c th thc hin c
khng? gii quyt bi ton ny ta cn theo mt k thut khc, nh vo vai tr ca bin con tr v
tham chiu.
b. Truyn theo dn tr

Xt v d tro i gi tr ca 2 bin. y l mt yu cu nh nhng c gp nhiu ln trong


chng trnh, v d sp xp mt danh sch. Do vy cn vit mt hm thc hin yu cu trn.
Hm khng tr kt qu. Do cc bin cn trao i l cha c bit trc ti thi im vit hm, nn
ta phi a chng vo hm nh cc tham i, tc hm c hai tham i x, y i din cho cc bin s
thay i gi tr sau ny.
T mt vi nhn xt trn, theo thng thng hm tro i s c vit nh sau:
void swap(int x, int y)
{
int t ; t = x ; x = y ; y = t ;
}

Gi s trong chng trnh chnh ta c 2 bin x, y cha cc gi tr ln lt l 2, 5. Ta cn i ni


dung 2 bin ny sao cho x = 5 cn y = 2 bng cch gi n hm swap(x, y).
void main()
{
int x = 2; int y = 5;
swap(x, y) ;
cout << x << y ;
}

// 2, 5 (x, y vn khng i)

Thc s sau khi chy xong chng trnh ta thy gi tr ca x v y vn khng thay i
!?.
Nh gii thch trong mc trn (gi hm luythua), vic u tin khi chng trnh thc hin mt
hm l to ra cc bin mi (cc nh mi, c lp vi cc nh x, y c sn) tng ng vi cc
tham i, trong trng hp ny cng c tn l x, y v gn ni dung ca x, y (ngoi hm) cho x, y
(mi). V vic cui cng ca chng trnh sau khi thc hin xong hm l xo cc bin mi ny. Do
vy ni dung ca cc bin mi thc s l c thay i, nhng khng nh hng g n cc bin x, y
c. Hnh v di y minh ho cch lm vic ca hm swap, trc, trong v sau khi gi hm.
Trc

84

Trong

Sau

x'

y'

Cc bin tm b
xo khi chy xong
hm

Nh vy hm swap cn c vit li sao cho vic thay i gi tr khng thc hin trn cc bin tm
m phi thc s thc hin trn cc bin ngoi. Mun vy thay v truyn gi tr ca cc bin ngoi
cho i, by gi ta s truyn a ch ca n cho i, v cc thay i s phi thc hin trn ni dung
ca cc a ch ny. chnh l l do ta phi s dng con tr lm tham i thay cho bin
thng. C th hm swap c vit li nh sau:
void swap(int *p, int *q)
{
int t;
t = *p ;
*p = *q ;
*q = t ;
}

// khai bo bin tm t
// t gi tr ca t bng ni dung ni p tr ti
// thay ni dung ni p tr bng ni dung ni q tr
// thay ni dung ni q tr ti bng ni dung ca t

Vi cch t chc hm nh vy r rng nu ta cho p tr ti bin x v q tr ti bin y th hm swap s


thc s lm thay i ni dung ca x, y ch khng phi ca p, q.
T li gi hm s l swap(&x, &y) (tc truyn a ch ca x cho p, p tr ti x v tng t q tr
ti y).
Nh vy c th tm tt 3 c trng vit mt hm lm thay i gi tr bin ngoi nh sau:

i ca hm phi l con tr (v d int *p)

Cc thao tc lin quan n i ny (trong thn hm) phi thc hin ti ni n tr n (v


d *p = )

Li gi hm phi chuyn a ch cho p (v d &x).

Ngoi hm swap trnh by, y ta a thm v d thy s cn thit phi c hm cho php
thay i bin ngoi. V d hm gii phng trnh bc 2 rt hay gp trong cc bi ton khoa hc k
thut. Tc cho trc 3 s a, b, c nh 3 h s ca phng trnh, cn tm 2 nghim x1, x2 ca n.
Khng th ly gi tr tr li ca hm lm nghim v gi tr tr li ch c 1 trong khi ta cn n 2
nghim. Do vy ta cn khai bo 2 bin "ngoi" trong chng trnh cha cc nghim, v hm phi
lm thay i 2 bin ny (tc cha gi tr nghim gii c). Nh vy hm c vit cn phi c 5
i, trong 3 i a, b, c i din cho cc h s, khng thay i v 2 bin x1, x2 i din cho
nghim, 2 i ny phi c khai bo dng con tr. Ngoi ra, phng trnh c th v nghim, 1
nghim hoc 2 nghim do vy hm s tr li gi tr l s nghim ca phng trnh, trong trng hp
1 nghim (nghim kp), gi tr nghim s c cho vo x1.
V d : Di y l mt dng n gin ca hm gii phng trnh bc 2.
int gptb2(float a, float b, float c, float *p, float *q)
{
float d ;
// cha
d = (b*b) - 4*a*c ;

85

if (d < 0) return 0 ;
else if (d == 0) { *p = -b/(2*a) ; return 1 ; }
else {
*p = (-b + sqrt(d))/(2*a) ;
*q = (-b - sqrt(d))/(2*a) ;
return 2 ;
}
}

Mt v d ca li gi hm trong chng trnh chnh nh sau:


void main()
{
float a, b, c ;
// cc h s
float x1, x2 ;
// cc nghim
cout << "Nhp h s: " ;
cin >> a >> b >> c;
switch (gptb2(a, b, c, &x1, &x2))
{
case 0: cout << "Phng trnh v nghim" ; break;
case 1: cout << "Phng trnh c nghim kp x = " << x1 ; break ;
case 2: cout << "Phng trnh c 2 nghim phn bit:" << endl ;
cout << "x1 = " << x1 << " v x2 = " << x2 << endl ; break;
}
}

Trn y chng ta trnh by cch xy dng cc hm cho php thay i gi tr ca bin ngoi. Mt
c trng d nhn thy l cch vit hm tng i phc tp. Do vy C++ pht trin mt cch vit
khc da trn i tham chiu v vic truyn i cho hm c gi l truyn theo tham chiu.
c. Truyn theo tham chiu

Mt hm vit di dng i tham chiu s n gin hn rt nhiu so vi i con tr v ging vi


cch vit bnh thng (truyn theo tham tr), trong ch c mt khc bit l cc i khai bo
di dng tham chiu.
so snh 2 cch s dng ta nhc li cc im khi vit hm theo con tr phi ch n, l:
i ca hm phi l con tr (v d int *p)
Cc thao tc lin quan n i ny trong thn hm phi thc hin ti ni n tr n (v d
*p = )
Li gi hm phi chuyn a ch cho p (v d &x).
Hy so snh vi i tham chiu, c th:

86

i ca hm phi l tham chiu (v d int &p)

Cc thao tc lin quan n i ny phi thc hin ti ni n tr n, tc a ch cn thao


tc. V mt thao tc trn bin tham chiu thc cht l thao tc trn bin c n tham
chiu nn trong hm ch cn vit p trong mi thao tc (thay v *p nh trong con tr)

Li gi hm phi chuyn a ch cho p. V bn thn p khi tham chiu n bin no th s


cha a ch ca bin , do li gi hm ch cn ghi tn bin, v d x (thay v &x nh

i vi dn tr).
Tm li, i vi hm vit theo tham chiu ch thay i i (l cc tham chiu) cn li mi ni
khc u vit n gin nh cch vit truyn theo tham tr.
V d : i gi tr 2 bin
void swap(int &x, int &y)
{
int t = x; x = y; y = t;
}

v li gi hm cng n gin nh trong truyn i theo tham tr. V d:


int a = 5, b = 3;
swap(a, b);
cout << a << b;

Bng di y minh ho tm tt 3 cch vit hm thng qua v d i bin trn.


Tham tr

Tham chiu

Dn tr

Khai bo i

void swap(int x, int y)

void swap(int &x, int &y) void swap(int *x, int *y)

Cu lnh

t = x; x = y; y = t;

t = x; x = y; y = t;

t = *x; *x = *y; *y = t;

Li gi

swap(a, b);

swap(a, b);

swap(&a, &b);

Tc dng

a, b khng thay i

a, b c thay i

a, b c thay i

IV.2.7. Hm v mng d liu


a. Truyn mng 1 chiu cho hm

Thng thng chng ta hay xy dng cc hm lm vic trn mng nh vect hay ma trn cc phn
t. Khi tham i thc s ca hm s l cc mng d liu ny. Trong trng hp ny ta c 2 cch
khai bo i. Cch th nht i c khai bo bnh thng nh khai bo bin mng nhng khng
cn c s phn t km theo, v d:
int x[];
float x[];
Cch th hai khai bo i nh mt con tr kiu phn t mng, v d:

int *p;

float *p

Trong li gi hm tn mng a s c vit vo danh sch tham i thc s, v a l a ch ca phn


t u tin ca mng a, nn khi hm c gi a ch ny s gn cho con tr p. V vy gi tr ca
phn t th i ca a c th c truy cp bi x[i] (theo khai bo 1) hoc *(p+i) (theo khai bo 2) v
n cng c th c thay i thc s (do y cng l cch truyn theo dn tr).
Sau y l v d n gin, nhp v in vect, minh ho cho c 2 kiu khai bo i.
V d : Hm nhp v in gi tr 1 vect
void nhap(int x[], int n)

// n: s phn t

87

{
int i;
for (i=0; i<n; i++) cin >> x[i];
}
void in(int *p, int n)
{
int i;
for (i=0; i<n; i++) cout << *(p+i);
}
void main()
{
int a[10] ;
nhap(a,7);
in(a,3);
}

// hoc cin >> *(x+i)

// mng a cha ti a 10 phn t


// vo 7 phn t u tin cho a
// ra 3 phn t u tin ca a

b. Truyn mng 2 chiu cho hm

i vi mng 2 chiu khai bo i cng nh li gi l phc tp hn nhiu so vi mng 1 chiu. Ta


c hai cch khai bo i nh sau:
Khai bo theo ng bn cht ca mng 2 chiu float x[m][n] do C++ qui nh, tc x l
mng 1 chiu m phn t, mi phn t ca n c kiu float[n]. T , i c khai bo
nh mt mng hnh thc 1 chiu (khng cn s phn t - y l s dng) ca kiu
float[n]. Tc c th khai bo nh sau:
float x[][n] ; // mng vi s phn t khng nh trc, mi phn t l n s
float (*x)[n] ;// mt con tr, c kiu l mng n s (float[n])

truy nhp n n phn t th i, j ta vn s dng c php x[i][j]. Tn ca mng a c vit bnh


thng trong li gi hm. Ni chung theo cch khai bo ny vic truy nhp l n gin nhng
phng php cng c hn ch l s ct ca mng truyn cho hm phi c nh bng n.
Xem mng float x[m][n] thc s l mng mt chiu float x[m*n] v s dng cch khai
bo nh trong mng mt chiu, l s dng con tr float *p truy cp c n tng
phn t ca mng. Cch ny c hn ch trong li gi: a ch truyn cho hm khng phi
l mng a m cn phi p kiu v (float*) ( ph hp vi p). Vi cch ny gi k l th t
ca phn t a[i][j] trong mng mt chiu (m*n), ta c quan h gia k, i, j nh sau:

k = *(p + i*n + j)

i = k/n

j = k%n

trong n l s ct ca mng truyn cho hm. iu ny c ngha truy cp n a[i][j] ta c th


vit *(p+i*n+j), ngc li bit ch s k c th tnh c dng i, ct j ca phn t ny. u im ca
cch khai bo ny l ta c th truyn mng vi kch thc bt k (s ct khng cn nh trc) cho
hm.
Sau y l cc v d minh ho cho 2 cch khai bo trn.
V d : Tnh tng cc s hng trong ma trn
float tong(float x[][10], int m, int n)// hoc float tong(float (*x)[10], int m, int n)
{
// m: s dng, n: s ct

88

float t = 0;
int i, j ;
for (i=0; i<m; i++)
for (j=0; j<n; j++) t += x[i][j] ;
return t;
}
void main()
{
float a[8][10], b[5][7] ;
int i, j, ma, na, mb, nb;
cout << "nhp s dng, s ct ma trn a: " ; cin >> ma >> na;
for (i=0; i<ma; i++)
// nhp ma trn a
for (j=0; j<na; j++)
{ cout << "a[" << i << "," << j << "] = " ; cin >> a[i][j] ; }
cout << "nhp s dng, s ct ma trn b: " ; cin >> mb >> nb;
for (i=0; i<mb; i++)
// nhp ma trn b
for (j=0; j<nb; j++)
{ cout << "b[" << i << "," << j << "] = " ; cin >> b[i][j] ; }
cout << tong(a, ma, na);
// in tng cc s trong ma trn
cout << tong(b, mb, nb);
// sai v s ct ca b khc 10
}

V d : Tm phn t b nht ca ma trn


void minmt(float *x, int m, int n)
// m: s dng, n: s ct
{
float min = *x;
// gn phn t u tin cho min
int k, kmin;
for (k=1; k<m*n; k++)
if (min > *(x+k)) { min = *(x+k) ; kmin = k; }
cout << "Gi tr min la: " << min << " ti dng " << k/n << " ct " << k%n;
}
void main()
{
float a[8][10], b[5][7] ;
int i, j ;
for (i=0; i<8; i++)
// nhp ma trn a
for (j=0; j<10; j++)
{ cout << "a[" << i << "," << j << "] = " ; cin >> a[i][j] ; }
for (i=0; i<5; i++)
// nhp ma trn b
for (j=0; j<7; j++)
{ cout << "b[" << i << "," << j << "] = " ; cin >> b[i][j] ; }
minmt((float*)a, 8, 10) ;
// in gi tr v v tr s b nht trong a
minmt((float*)b, 5, 7) ;
// in gi tr v v tr s b nht trong b
}

89

V d : Cng 2 ma trn v in kt qu.


void inmt(float *x, int m, int n)
{
int i, j;
for (i=0; i<m; i++)
{
for (j=0; j<n; j++) cout << *(x+i*n+j);
cout << endl;
}
}
void cong(float *x, float *y, int m, int n)
{
float *t = new float[m*n]; // t l ma trn kt qu (xem nh dy s)
int k, i, j ;
for (k = 0; k < m*n; k++) *(t+k) = *(x+k) + *(y+k) ;
inmt((float*)t, m, n);
}
void main()
{
float a[8][10], b[5][7] ;
int i, j, m, n;
cout << "nhp s dng, s ct ma trn: " ; cin >> m >> n;
for (i=0; i<m; i++)
//nhp ma trn a, b
for (j=0; j<n; j++)
{
cout << "a[" << i << "," << j << "] = " ; cin >> a[i][j] ;
cout << "b[" << i << "," << j << "] = " ; cin >> b[i][j] ;
}
cong((float*)a, (float*)b, m, n);
//cng v in kt qu a+b
}

Xu hng chung l chng ta xem mng (1 hoc 2 chiu) nh l mt dy lin tip cc s trong b
nh, tc mt ma trn l mt i con tr tr n thnh phn ca mng. i vi mng 2 chiu m*n
khi truyn i a ch ca ma trn cn phi p kiu v kiu con tr. Ngoi ra bc chy k ca con
tr (t 0 n m*n-1) tng ng vi cc to ca phn t a[i][j] trong mng nh sau:

k = *(p + i*n + j)

i = k/n

j = k%n

t , chng ta c th vit cc hm m khng cn phi bn khon g v kch thc ca


ma trn s truyn cho hm.
c. Gi tr tr li ca hm l mt mng

Khng c cch no gi tr tr li ca mt hm l mng. Tuy nhin thc s mi mng cng chnh


l mt con tr, v vy vic hm tr li mt con tr tr n dy d liu kt qu l tng ng vi

90

vic tr li mng. Ngoi ra cn mt cch d dng hn i vi mng 2 chiu l mng kt qu c


tr li vo trong tham i ca hm (ging nh nghim ca phng trnh bc 2 c tr li vo trong
cc tham i). y chng ta s ln lt xt 2 cch lm vic ny.
6. Gi tr tr li l con tr tr n mng kt qu. Trc ht chng ta xt v d nh sau y:
int* tragiatri1()
// gi tr tr li l con tr tr n dy s nguyn
{
int kq[3] = { 1, 2, 3 }; // to mng kt qu vi 3 gi tr 1, 2, 3
return kq ;
// tr li a ch cho con tr kt qu hm
}
int* tragiatri2()
// gi tr tr li l con tr tr n dy s nguyn
{
int *kq = new int[4]; // cp pht 3 nh nguyn
*kq = *(kq+1) = *(kq+2) = 0 ;// to mng kt qu vi 3 gi tr 1, 2, 3
return kq ;
// tr li a ch cho con tr kt qu hm
}
void main()
{
int *a, i;
a = tragiatri1();
for (i=0; i<3; i++) cout *(a+i); // khng phi l 1, 2, 3
a = tragiatri2();
for (i=0; i<3; i++) cout *(a+i); // 1, 2, 3
}

Qua v d trn ta thy hai hm tr gi tr u to bn trong n mt mng 3 s nguyn v tr li a


ch mng ny cho con tr kt qu hm. Tuy nhin, ch c tragiatri2() l cho li kt qu ng. Ti sao
? Xt mng kq c khai bo v khi to trong tragiatri1(), y l mt mng cc b (c to bn
trong hm) nh sau ny chng ta s thy, cc loi bin "tm thi" ny (v c cc tham i) ch tn
ti trong qu trnh hm hot ng. Khi hm kt thc cc bin ny s mt i. Do vy tuy hm tr
li a ch ca kq trc khi n kt thc, th nhng sau khi hm thc hin xong, ton b kq s c
xo khi b nh v v vy con tr kt qu hm tr n vng nh khng cn cc gi tr nh kq
c. T iu ny vic s dng hm tr li con tr l phi ht sc cn thn. Mun tr li con tr cho
hm th con tr ny phi tr n dy d liu no sao cho n khng mt i sau khi hm kt thc, hay
ni khc hn phi l nhng dy d liu c khi to bn ngoi hm hoc c th s dng theo
phng php trong hm tragiatri2(). Trong tragiatri2() mt mng kt qu 3 s cng c to ra
nhng bng cch xin cp pht vng nh. Vng nh c cp pht ny s vn cn tn ti sau khi
hm kt thc (n ch b xo i khi s dng ton t delete). Do vy hot ng ca tragiatri2() l
chnh xc.
Tm li, v d trn cho thy nu mun tr li gi tr con tr th vng d liu m n tr n phi
c cp pht mt cch tng minh (bng ton t new), ch khng chng trnh t ng cp
pht v t ng thu hi. V d sau minh ho hm cng 2 vect v tr li vect kt qu (thc cht l
con tr tr n vng nh t kt qu)
int* congvt(int *x, int *y, int n)
{
int* z = new int[n];
for (int i=0; i<n; i++) z[i] = x[i] + y[i];

// n s phn t ca vect
// xin cp pht b nh

91

return c;
}
void main()
{
int i, n, a[10], b[10], c[10] ;
cout << "n = " ; cin >> n;
for (i=0; i<n; i++) cin >> a[i] ;
for (i=0; i<n; i++) cin >> b[i] ;
c = congvt(a, b, n);
for (i=0; i<n; i++) cout << c[i] ;
}

// nhp s phn t
// nhp vect a
// nhp vect b
// in kt qu

Ch : a[i], b[i], c[i] cn c vit di dng tng ng *(a+i), *(b+i), *(c+i).


7. Trong cch ny, mng cn tr li c khai bo nh mt tham i trong danh sch i ca
hm. Tham i ny l mt con tr nn hin nhin khi truyn mng khai bo sn (
cha kt qu) t ngoi vo cho hm th mng s thc s nhn c ni dung kt qu (tc
c thay i trc v sau khi gi hm - xem mc truyn tham i thc s theo dn tr).
y ta xt 2 v d: bi ton cng 2 vect trong v d trc v nhn 2 ma trn.
V d : Cng 2 vect, vect kt qu tr li trong tham i ca hm. So vi v d trc gi tr tr li
l void (khng tr li gi tr) cn danh sch i c thm con tr z cha kt qu.
void congvt(int *x, int *y, int *z, int n)
{
for (int i=0; i<n; i++) z[i] = x[i] + y[i];
}
void main()
{
int i, n, a[10], b[10], c[10] ;
cout << "n = " ; cin >> n;
for (i=0; i<n; i++) cin >> a[i] ;
for (i=0; i<n; i++) cin >> b[i] ;
congvt(a, b, c, n);
for (i=0; i<n; i++) cout << c[i] ;
}

// z lu kt qu

// nhp s phn t
// nhp vect a
// nhp vect b
// in kt qu

V d : Nhn 2 ma trn kch thc m*n v n*p. Hai ma trn u vo v ma trn kt qu (kch thc
m*p) u c khai bo di dng con tr v l i ca hm nhanmt(). Nhc li, trong li gi hm
a ch ca 3 mng cn c p kiu v (int*) ph hp vi cc con tr tham i.
void nhanmt(int *x, int *y, int *z, int m, int n, int p)
// z lu kt qu
{
int i, j, k ;
for (i=0; i<m; i++)
for (j=0; j<p; j++)
{
*(z+i*p+j) = 0;
// tc z[i][j] = 0
for (k=0; k<n; k++)
*(z+i*p+j) += *(x+i*n+k)**(y+k*p+j) ; // tc z[i][j] += x[i][k]*y[k][j]

92

}
}
void main()
{
int a[10][10], b[10][10], c[10][10] ;
// khai bo 3 mng a, b, c
int m, n, p ;
// kch thc cc mng
cout << "m, n, p = " ; cin >> m >> n >> p ;
// nhp s phn t
for (i=0; i<m; i++)
// nhp ma trn a
for (j=0; j<n; j++) {
cout << "a[" << i << "," << j << "] = " ;
cin >> a[i][j] ; }
for (i=0; i<n; i++)
// nhp ma trn b
for (j=0; j<p; j++) {
cout << "b[" << i << "," << j << "] = " ; cin >> b[i][j] ; }
nhanmt((int*)a, (int*)b, (int*)c, m, n, p);
// gi hm
for (i=0; i<m; i++)
// in kt qu
{
for (j=0; j<p; j++) cout << c[i][j] ;
cout << endl;
}
}
d. i v gi tr tr li l xu k t

Ging cc trng hp xt vi mng 1 chiu, i ca cc hm xu k t c th khai bo di 2


dng: mng k t hoc con tr k t. Gi tr tr li lun lun l con tr k t. Ngoi ra hm cng c
th tr li gi tr vo trong cc i con tr trong danh sch i.
V d sau y dng tch h, tn ca mt xu h v tn. V d gm 3 hm. Hm h tr li xu h
(con tr k t) vi i l xu h v tn c khai bo dng mng. Hm tn tr li xu tn (con tr k
t) vi i l xu h v tn c khai bo dng con tr k t. Thc cht i h v tn trong hai hm
h, tn c th c khai bo theo cng cch thc, y chng trnh mun minh ho cc cch khai
bo i khc nhau ( cp n trong phn i mng 1 chiu). Hm th ba cng tr li h, tn
nhng cho vo trong danh sch tham i, do vy hm khng tr li gi tr (void). n gin ta qui
c xu h v tn khng cha cc du cch u v cui xu, trong h l dy k t t u cho n
khi gp du cch u tin v tn l dy k t t sau du cch cui cng n k t cui xu.
char* ho(char hoten[])
{
char* kq = new char[10];
int i=0;
while (hoten[i] != '\40') i++;
strncpy(kq, hoten, i) ;
return kq;
}
char* ten(char* hoten)
{
char* kq = new char[10];

// hm tr li h
// cp b nh cha h
// i dng ti du cch u tin
// copy i k t ca hoten vo kq

// hm tr li tn
// cp b nh cha tn

93

int i=strlen(hoten);
while (hoten[i] != '\40') i--;
// i dng ti du cch cui cng
strncpy(kq, hoten+i+1, strlen(hoten)-i-1) ;
// copy tn vo kq
return kq;
}
void tachht(char* hoten, char* ho, char* ten)
{
int i=0;
while (hoten[i] != '\40') i++;
// i dng ti du cch u tin
strncpy(ho, hoten, i) ;
// copy i k t ca hoten vo ho
i=strlen(hoten);
while (hoten[i] != '\40') i--;
// i dng ti du cch cui cng
strncpy(ten, hoten+i+1, strlen(hoten)-i-1) ; // copy tn vo ten
}
void main()
{
char ht[30], *h, *t ;
// cc bin h tn, h, tn
cout << "H v tn = " ; cin.getline(ht,30) ; // nhp h tn
h = ho(ht); t = ten(ht);
cout << "H = " << h << ", tn = " << t << endl;
tachht(ht, h, t);
cout << "H = " << h << ", tn = " << t << endl;
}
e. i l hng con tr

Theo phn truyn i cho hm ta bit thay i bin ngoi i tng ng phi c khai bo
di dng con tr. Tuy nhin, trong nhiu trng hp cc bin ngoi khng c nhu cu thay i
nhng i tng ng vi n vn phi khai bo di dng con tr (v d i l mng hoc xu k t).
iu ny c kh nng do nhm ln, cc bin ngoi ny s b thay i ngoi mun. Trong trng
hp nh vy cn thn, cc i con tr nu khng mun thay i (ch ly gi tr) cn c khai
bo nh l mt hng con tr bng cch thm trc khai bo kiu ca chng t kho const. T kho
ny khng nh bin tuy l con tr nhng n l mt hng khng thay i c gi tr. Nu trong
thn hm ta c tnh thay i chng th chng trnh s bo li. V d i hoten trong c 3 hm
trn c th c khai bo dng const char* hoten.
V d : i l hng con tr. In hoa mt xu k t
void inhoa(const char* s)
{
char *t;
strcpy(t, s);
cout << s << strupr(t);
}
void main()
{
char *s = "abcde" ;
inhoa(s);

94

// khng dng c strupr(s)

// abcdeABCDE

IV.2.8. Con tr hm
Mt hm (tp hp cc lnh) cng ging nh d liu: c tn gi , c a ch lu trong b nh v c
th truy nhp n hm thng qua tn gi hoc a ch ca n. truy nhp (gi hm) thng qua a
ch chng ta phi khai bo mt con tr cha a ch ny v sau gi hm bng cch gi tn con
tr.
a. Khai bo

<kiu gi tr> (*tn bin hm)(d/s tham i);


<kiu gi tr> (*tn bin hm)(d/s tham i) = <tn hm>;
Ta thy cch khai bo con tr hm cng tng t khai bo con tr bin (ch cn t du * trc tn),
ngoi ra cn phi bao *tn hm gia cp du ngoc (). V d:
float (*f)(int);

// khai bo con tr hm c tn l f tr n hm
// c mt tham i kiu int v cho gi tr kiu float.
void (*f)(float, int);// con tr tr n hm vi cp i (float, int).

hoc phc tp hn:


char* (*m[10])(int, char) // khai bo mt mng 10 con tr hm tr n

// cc hm c cp tham i (int, char), gi tr tr


// li ca cc hm ny l xu k t.
Ch : phn bit gia 2 khai bo: float (*f)(int) v float *f(int). Cch khai bo trc l khai bo con
tr hm c tn l f. Cch khai bo sau c th vit li thnh float* f(int) l khai bo hm f vi gi tr
tr li l mt con tr float.
b. Khi to

Mt con tr hm cng ging nh cc con tr, c php khi to trong khi khai bo hoc gn vi
mt a ch hm c th sau khi khai bo. Cng ging nh kiu d liu mng, tn hm chnh l mt
hng a ch tr n bn thn n. Do vy c php ca khi to cng nh php gn l nh sau:
bin con tr hm = tn hm;
trong f v tn hm c tr phi ging nhau v kiu tr li v danh sch i. Ni cch khc vi
mc ch s dng con tr f tr n hm (lp hm) no th f phi c khai bo vi kiu tr li v
danh sch i ging nh hm . V d:
float luythua(float, int);
float (*f)(float, int);
f = luythua;

// khai bo hm lu tha
// khai bo con tr f tng thch vi hm luythua
// cho f tr n hm lu tha

c. S dng con tr hm

s dng con tr hm ta phi gn n vi tn hm c th v sau bt k ni no c php xut


hin tn hm th ta u c th thay n bng tn con tr. V d nh cc thao tc gi hm, a hm
vo lm tham i hnh thc cho mt hm khc Sau y l cc v d minh ho.
V d : Dng tn con tr gi hm
float bphuong(float x)
{

// hm tr li x2

95

return x*x;
}
void main()
{
float (*f)(float);
f = bphuong;
cout << "Bnh phng ca 3.5 l " << f(3.5) ;
}

V d : Dng hm lm tham i. Tham i ca hm ngoi cc kiu d liu bit cn c th l mt


hm. iu ny c tc dng rt ln trong cc bi ton tnh ton trn nhng i tng l hm ton hc
nh tm nghim, tnh tch phn ca hm trn mt on ... Hm ng vai tr tham i s c khai
bo di dng con tr hm. V d sau y trnh by hm tm nghim xp x ca mt hm lin tc v
i du trn on [a, b]. hm tm nghim ny s dng c trn nhiu hm ton hc khc nhau,
trong hm s cha mt bin con tr hm v hai cn a, b, c th bng khai bo float
timnghiem(float (*f)(float), float a, float b). Trong li gi hm f s c thay th bng tn hm c
th cn tm nghim.
#include <iostream.h>
#include <cmath>
#define EPS 1.0e-6
float timnghiem(float (*f)(float), float a, float b);
float emux(float);
float loga(float);
void main()
{
cout << "Nghim ca e m x - 2 trn on [0,1] = ";
cout << timnghiem(emux,0,1);
cout << "Nghim ca loga(x) - 1 trn on [2,3] = ";
cout << timnghiem(loga,2,3);
}
float timnghiem(float (*f)(float), float a, float b)
{
float c = (a+b)/2;
while (fabs(a-b)>EPS && f(c)!=0)
{
if (f(a)*f(c)>0) a = c ; else b = c;
c = (a+b)/2;
}
return c;
}
float emux(float x)
{ return (exp(x)-2); }
float loga(float x) { return (log(x)-1); }
d. Mng con tr hm

Tng t nh bin bnh thng cc con tr hm ging nhau c th c gp li vo trong mt


mng, trong khai bo ta ch cn thm [n] vo sau tn mng vi n l s lng ti a cc con tr. V

96

d sau minh ho cch s dng ny. Trong v d chng ta xy dng 4 hm cng, tr, nhn, chia 2 s
thc. Cc hm ny ging nhau v kiu, s lng i, Chng ta c th s dng 4 con tr hm
ring bit tr n cc hm ny hoc cng c th dng mng 4 con tr tr n cc hm ny.
Chng trnh s in ra kt qu cng, tr, nhn, chia ca 2 s nhp vo t bn phm.
V d :
void cong(int a, int b)
{ cout << a << " + " << b << " = " << a+b ; }
void tru(int a, int b)
{ cout << a << " - " << b << " = " << a-b ; }
void nhan(int a, int b)
{ cout << a << " x " << b << " = " << a*b ; }
void chia(int a, int b)
{ cout << a << ": " << b << " = " << a/b ; }
void main()
{
void (*f[4])(int, int) = {cong, tru, nhan, chia}; //khai bo, khi to 4 con tr
int m, n;
cout <<"Nhp m, n " ; cin >> m >> n ;
for (int i=0; i<4; i++) f[i](m,n);
}

IV.3.

QUI

IV.3.1. Khi nim qui


Mt hm gi n hm khc l bnh thng, nhng nu hm li gi n chnh n th ta gi hm l
qui. Khi thc hin mt hm qui, hm s phi chy rt nhiu ln, trong mi ln chy chng trnh
s to nn mt tp bin cc b mi trn ngn xp (cc i, cc bin ring khai bo trong hm) c
lp vi ln chy trc , t d gy trn ngn xp. V vy i vi nhng bi ton c th gii
c bng phng php lp th khng nn dng qui.
minh ho ta hy xt hm tnh n giai tha. tnh n! ta c th dng phng php lp nh sau:
void main()
{
int n; doule kq = 1;
cout << "n = " ; cin >> n;
for (int i=1; i<=n; i++) kq *= i;
cout << n << "! = " << kq;
}

Mt khc, n! giai tha cng c tnh thng qua (n-1)! bi cng thc truy hi
n! = 1
n! = (n-1)!n

nu n = 0
nu n > 0

do ta c th xy dng hm qui tnh n! nh sau:


double gt(int n)
{
if (n==0) return 1;
else return gt(n-1)*n;
}
void main()
{

97

int n;
cout << "n = " ; cin >> n;
cout << gt(n);
}

Trong hm main() gi s ta nhp 3 cho n, khi thc hin cu lnh cout << gt(3) in 3! u
tin chng trnh s gi chy hm gt(3). Do 3 0 nn hm gt(3) s tr li gi tr gt(2)*3, tc li gi
hm gt vi tham i thc s bc ny l n = 2. Tng t gt(2) = gt(1)*2 v gt(1) = gt(0)*1. Khi
thc hin gt(0) ta c i n = 0 nn hm tr li gi tr 1, t gt(1) = 1*1 = 1 v suy ngc tr li ta
c gt(2) = gt(1)*2 = 1*2 = 2, gt(3) = gt(2)*3 = 2*3 = 6, chng trnh in ra kt qu 6.
T v d trn ta thy hm qui c c im:
Chng trnh vit rt gn,
Vic thc hin gi i gi li hm rt nhiu ln ph thuc vo ln ca u vo. Chng
hn trong v d trn hm c gi n ln, mi ln nh vy chng trnh s mt thi gian
lu gi cc thng tin ca hm gi trc khi chuyn iu khin n thc hin hm c
gi. Mt khc cc thng tin ny c lu tr nhiu ln trong ngn xp s dn n trn
ngn xp nu n ln.
Tuy nhin, qui l cch vit rt gn, d vit v c chng trnh, mt khc c nhiu bi ton hu
nh tm mt thut ton lp cho n l rt kh trong khi vit theo thut ton qui th li rt d dng.
IV.3.2. Lp cc bi ton gii c bng qui
Phng php qui thng c dng gii cc bi ton c c im:
Gii quyt c d dng trong cc trng hp ring gi l trng hp suy bin hay c s,
trong trng hp ny hm c tnh bnh thng m khng cn gi li chnh n,
i vi trng hp tng qut, bi ton c th gii c bng bi ton cng dng nhng
vi tham i khc c kch thc nh hn tham i ban u. V sau mt s bc hu hn
bin i cng dng, bi ton a c v trng hp suy bin.
Nh vy trong trng hp tnh n! nu n = 0 hm cho ngay gi tr 1 m khng cn phi gi li chnh
n, y chnh l trng hp suy bin. Trng hp n > 0 hm s gi li chnh n nhng vi n gim 1
n v. Vic gi ny c lp li cho n khi n = 0.
Mt lp rt rng ca bi ton dng ny l cc bi ton c th nh ngha c di dng qui nh
cc bi ton lp vi s bc hu hn bit trc, cc bi ton UCLN, thp H Ni, ...
IV.3.3. Cu trc chung ca hm qui
Dng thc chung ca mt chng trnh qui thng nh sau:
if (trng hp suy bin)
{
trnh by cch gii
// gi nh c cch gii
}
else
// trng hp tng qut
{
gi li hm vi tham i "b" hn
}

98

Cc v d
V d : Tm UCLN ca 2 s a, b. Bi ton c th c nh ngha di dng qui nh sau:
nu a = b th UCLN = a
nu a > b th UCLN(a, b) = UCLN(a-b, b)
nu a < b th UCLN(a, b) = UCLN(a, b-a)
T ta c chng trnh qui tnh UCLN ca a v b nh sau.
int UCLN(int a, int b)
{
if (a < b) UCLN(a, b-a);
if (a == b) return a;
if (a > b) UCLN(a-b, b);
}

// qui uoc a, b > 0

V d : Tnh s hng th n ca dy Fibonaci l dy f(n) c nh ngha:


f(0) = f(1) = 1
f(n) = f(n-1) + f(n-2) vi n 2.
long Fib(int n)
{
long kq;
if (n==0 || n==1) kq = 1; else kq = Fib(n-1) + Fib(n-2);
return kq;
}

IV.4.

T CHC CHNG TRNH

IV.4.1. Cc loi bin v phm vi


a. Bin cc b

L cc bin c khai bo trong thn ca hm v ch c tc dng trong hm ny, k c cc bin khai


bo trong hm main() cng ch c tc dng ring trong hm main(). T , tn bin trong cc hm
l c php trng nhau. Cc bin ca hm no s ch tn ti trong thi gian hm hot ng. Khi
bt u hot ng cc bin ny c t ng sinh ra v n khi hm kt thc cc bin ny s mt i.
Tm li, mt hm c xem nh mt n v c lp, khp kn.
Tham i ca cc hm cng c xem nh bin cc b.
V d : Di y ta nhc li mt chng trnh nh gm 3 hm: lu tha, xo mn hnh v main().
Mc ch minh ho bin cc b.
float luythua(float x, int n)
{
int i ;
float kq = 1;
for (i=1; i<=n; i++) kq *= x;
return kq;

// hm tr gi tr xn

99

}
void xmh(int n)
{
int i;
for (i=1; i<=n; i++) clrscr();
}
void main()
{
float x; int n;
cout << "Nhp x v n: "; cin >> x >> n;
xmh(5);
cout << luythua(x, n);
}

// xo mn hnh n ln

// xo mn hnh 5 ln
// in xn

Qua v d trn ta thy cc bin i, i n c khai bo trong hai hm: luythua() v xmh(). kq c
khai bo trong luythua v main(), ngoi ra cc bin x v n trng vi i ca hm luythua(). Tuy
nhin, tt c khai bo trn u hp l v u c xem nh khc nhau. C th gii thch nh sau:
Tt c cc bin trn u cc b trong hm n c khai bo.
x v n trong main() c thi gian hot ng di nht: trong sut qu trnh chy chng
trnh. Chng ch mt i khi chng trnh chm dt. i x v n trong luythua() ch tm thi
c to ra khi hm luythua() c gi n v c lp vi x, n trong main(), ni cch
khc ti thi im trong b nh c hai bin x v hai bin n. Khi hm luythua chay xong
bin x v n ca n t ng bin mt.
Tng t 2 i n, 2 bin i trong luythua() v xo mn hnh cng c lp vi nhau, chng
ch c to v tn ti trong thi gian hm ca chng c gi v hot ng.
b. Bin ngoi

L cc bin c khai bo bn ngoi ca tt c cc hm. V tr khai bo ca chng c th t u vn


bn chng trnh hoc ti mt mt v tr bt k no gia vn bn chng trnh. Thi gian tn ti
ca chng l t lc chng trnh bt u chy n khi kt thc chng trnh ging nh cc bin
trong hm main(). Tuy nhin v phm vi tc dng ca chng l bt u t im khai bo chng n
ht chng trnh, tc tt c cc hm khai bo sau ny u c th s dng v thay i gi tr ca
chng. Nh vy cc bin ngoi c khai bo t u chng trnh s c tc dng ln ton b
chng trnh. Tt c cc hm u s dng c cc bin ny nu trong hm khng c bin khai
bo trng tn. Mt hm nu c bin trng tn vi bin ngoi th bin ngoi b che i vi hm ny.
C ngha nu i c khai bo nh mt bin ngoi v ngoi ra trong mt hm no cng c bin i
th nh vy c 2 bin i c lp vi nhau v khi hm truy nhp n i th c ngha l i ca hm ch
khng phi i ca bin ngoi.
Di y l v d minh ho cho cc gii thch trn.
V d : Chng ta xt li cc hm luythua() v xmh(). Ch rng trong c hai hm ny u c bin i,
v vy chng ta c th khai bo i nh mt bin ngoi ( dng chung cho luythua() v xmh()), ngoi
ra x, n cng c th c khai bo nh bin ngoi. C th:
#include <iostream.h>
#include <iomanip.h>

100

float x; int n; int i ;


float luythua(float x, int n)
{
float kq = 1;
for (i=1; i<=n; i++) kq *= x;
}
void xmh()
{
for (i=1; i<=n; i++) clrscr();
}
void main()
{
cout << "Nhp x v n: "; cin >> x >> n;
xmh(5);
cout << luythua(x, n);
}

// xo mn hnh 5 ln
// in xn

Trong v d ny ta thy cc bin x, n, i u l cc bin ngoi. Khi ta mun s dng bin ngoi v d
i, th bin i s khng c khai bo trong hm s dng n. Chng hn, luythua() v xmh() u s
dng i cho vng lp for ca mnh v n khng c khai bo li trong 2 hm ny. Cc i x v n
trong luythua() l c lp vi bin ngoi x v n. Trong luythua() khi s dng n x v n (v d cu
lnh kq *= x) th y l x ca hm ch khng phi bin ngoi, trong khi trong main() khng c khai
bo v x v n nn v d cu lnh cout << luythua(x, n); l s dng x, n ca bin ngoi.
Ni chung trong 2 v d trn chng trnh u chy tt v nh nhau. Tuy nhin, vic khai bo khc
nhau nh vy c nh hng hoc gy nhm ln g cho ngi lp trnh ? Liu chng ta c nn t t
ra mt nguyn tc no trong khai bo bin ngoi v bin cc b trnh nhng nhm ln c th
xy ra. Chng ta hy xt tip cng v d trn nhng thay i mt s khai bo v tnh 23 (c th b
bt bin n) nh sau:
#include <iostream.h>
#include <iomanip.h>
float x; int i ;
float luythua(float x, int n)
{
float kq = 1;
for (i=1; i<=n; i++) kq *= x;
}

// khng dng n

void xmh()
{
for (i=1; i<=n; i++) clrscr();
}
void main()
{
x = 2;
i = 3;

101

xmh(5);
cout << luythua(x, i);

// xo mn hnh 5 ln
// in xi, kt qu x = 23 = 8 ?

Nhn vo hm main() ta thy gi tr 23 c tnh bng cch t x = 2, i = 3 v gi hm luythua(x,i).


Kt qu ta mong mun s l gi tr 8 hin ra mn hnh, tuy nhin khng ng nh vy. Trc khi in
kt qu ny ra mn hnh hm xmh() c gi n xo mn hnh. Hm ny s dng mt bin
ngoi i lm bin m cho mnh trong vng lp for v sau khi ra khi for (cng l kt thc xmh())
i nhn gi tr 6. Bin i ngoi ny li c s dng trong li gi luythua(x,i) ca hm main(), tc ti
thi im ny x = 2 v i = 6, kt qu in ra mn hnh s l 26 = 64 thay v 8 nh mong mun.
Tm li "im yu" dn n sai st ca chng trnh trn l ch lp trnh vin "tranh th" s
dng bin i cho 2 hm xmh() v main() (bng cch khai bo n nh bin ngoi) nhng li vi mc
ch khc nhau. Do vy sau khi chy xong hm xmh() i b thay i khc vi gi tr i c khi to
lc ban u. khc phc li trong chng trnh trn ta cn khai bo li bin i: hoc trong main()
khai bo thm i (n s che bin i ngoi), hoc trong c hai xmh() v main() u c bin i (cc b
trong tng hm).
T , ta nn ra mt vi nguyn tc lp trnh sao cho n c th trnh c nhng li khng ng
c nh vy:

nu mt bin ch s dng v mc ch ring ca mt hm th nn khai bo bin


nh bin cc b trong hm. V d cc bin m ca vng lp, thng thng chng ch
c s dng thm ch ch ring trong vng lp ch cng cha phi cho ton b c hm,
v vy khng nn khai bo chng nh bin ngoi. Nhng bin cc b ny sau khi hm kt
thc chng cng s kt thc, khng gy nh hng n bt k hm no khc. Mt c
im c li na cho khai bo cc b l chng to cho hm tnh cch hon chnh, c lp
vi mi hm khc, chng trnh khc. V d hm xmh() c th mang qua chy chng
trnh khc m khng phi sa cha g nu i c khai bo bn trong hm. Trong khi
v d ny hm xmh() vn hot ng c nhng trong chng trnh khc nu khng c i
nh mt bin ngoi ( xmh() s dng) th hm s gy li.

vi cc bin mang tnh cht s dng chung r nt (c bit vi nhng bin kch thc
ln) m nhiu hm cng s dng chng vi mc ch ging nhau th nn khai bo chng
nh bin ngoi. iu ny tit kim c thi gian cho ngi lp trnh v khng phi khai
bo chng nhiu ln trong nhiu hm, tit kim b nh v khng phi to chng tm thi
mi khi chy cc hm, tit kim c thi gian chy chng trnh v khng phi t chc
b nh lu tr v gii phng chng. V d trong chng trnh qun l sinh vin
(chng 6), bin sinh vin c dng chung v thng nht trong hu ht cc hm (xem,
xo, sa, b sung, thng k ) nn c th khai bo chng nh bin ngoi, iu ny cng
tng tnh thng nht ca chng trnh (mi bin sinh vin l nh nhau cho mi hm con
ca chng trnh).

Tm li, nguyn tc tng qut nht l c gng to hm mt cch c lp, khp kn, khng chu nh
hng ca cc hm khc v khng gy nh hng n hot ng ca cc hm khc n mc c th.
IV.4.2. Bin vi mc ch c bit
a. Bin hng v t kho const

s dng hng c th khai bo thm t kho const trc khai bo bin. Phm vi v min tc dng
cng nh bin, c ngha bin hng cng c th dng cc b hoc ton th. Bin hng lun lun

102

c khi to trc.
C th khai bo t kho const trc cc tham i hnh thc khng cho php thay i gi tr ca
cc bin ngoi (c bit i vi vi mng v xu k t, v bn thn cc bin ny c xem nh con
tr do hm c th thay i c gi tr ca cc bin ngoi truyn cho hm ny).
V d sau th hin hng cng c th c khai bo cc phm vi khc nhau.
const int MAX = 30;
void vidu(const int *p)
{
const MAX = 10;

}
void main()
{
const MAX = 5;

// ton th
// cc b
// cc b

// cc b

Trong Turbo C, BorlandC v cc chng trnh dch khc c nhiu hng s khai bo sn trong tp tin
values.h nh MAXINT, M_PI hoc cc hng ho trong graphics.h nh WHITE, RED,
b. Bin tnh v t kho static

c khai bo bng t kho static. L bin cc b nhng vn gi gi tr sau khi ra khi hm. Phm
vi tc dng nh bin cc b, ngha l n ch c s dng trong hm khai bo n. Tuy nhin thi
gian tc dng c xem nh bin ton th, tc sau khi hm thc hin xong bin vn cn tn ti v
vn lu li gi tr sau khi ra khi hm. Gi tr ny ny c tip tc s dng khi hm c gi li,
tc bin static ch c khi u mt ln trong ln chy hm u tin. Nu khng khi to, C++ t
ng gn gi tr 0 (ngm nh = 0). V d:
int i = 1;
void bp()
{
static int lanthu = 0;
lanthu++;
i = 2 * i;
cout << "Hm chy ln th " << lanthu << ", i = " << i ;

}
void main()
{
ham();
ham();
ham();

// Hm chy ln th 1, i = 1
// Hm chy ln th 2, i = 2
// Hm chy ln th 3, i = 4

c. Bin thanh ghi v t kho register

103

tng tc tnh ton C++ cho php mt s bin c t trc tip vo thanh ghi thay v b
nh. Khai bo bng t kho register ng trc khai bo bin. Tuy nhin khai bo ny ch c tc
dng i vi cc bin c kch thc nh nh bin char, int.
V d: register char c; register int dem;
d. Bin ngoi v t kho extern

Nh bit mt chng trnh c th c t trn nhiu file vn bn khc nhau. Mt bin khng
th c khai bo nhiu ln vi cng phm vi hot ng. Do vy nu mt hm s dng bin c
khai bo trong file vn bn khc th bin ny phi c khai bo vi t kho extern. T kho ny
cho php chng trnh dch tm v lin kt bin ny t bn ngoi file ang cha bin. Chng ta hy
xt v d gy li sau y v tm phng n khc phc chng.
void in();
void main()
{
int i = 1;
in();
}
void in()
{
cout << i ;
}

Li (c php) v i l bin cc b trong main(), trong in() khng nhn bit i, nu trong hoc
trc in() khai bo thm i th li ng ngha (tc chng trnh in gi tr i khc khng theo
mun ca lp trnh vin).
Gi thit khai bo li nh sau:
void in();
void main() { ... }
int i;
void in() { ... }

// B khai bo i trong main()


// a khai bo i ra trc in() v sau main()

cch khai bo ny cng gy li v main() khng nhn bit i. Cui cng main() c th nhn bit i
th i phi c khai bo di dng bin extern. Thng thng trong trng hp ny cch khc phc
hay nht l khai bo trc main() b cc extern (khng cn thit).
Gi thit 2 chng trnh trn nm trong 2 tp tin khc nhau. lin kt (link) bin i gia 2 chng
trnh cn nh ngha tng th i trong mt v khai bo extern trong chng trnh kia.
/* program1.cpp*/
void in();
int i;
void main()
{
i = 1;
in();
}
/* program2.cpp */
void in()

104

{
extern i;
cout << i ;
}

Hm in() nm trong tp tin vn bn program2.cpp, c dng in gi tr ca bin i khai bo trong


program1.cpp, tm gi l tp tin gc (hai tp tin ny khi dch s c lin kt vi nhau). T
trong tp tin gc, i phi c khai bo l bin ngoi, v bt k hm tp tin khc mun s dng
bin i ny u phi c cu lnh khai bo extern int i (nu khng c t kho extern th bin i li c
xem l bin cc b, khc vi bin i trong tp tin gc).
lin kt cc tp tin ngun c th to mt d n (project) thng qua menu PROJECT (Alt-P). Cc
phm nng cho php m d n, thm bt tp tin vo danh sch tp tin ca d n c hng dn
dng cui ca ca s d n.
IV.4.3. Cc ch th tin x l
Nh bit trc khi chy chng trnh (bt u t vn bn chng trnh tc chng trnh ngun)
C++ s dch chng trnh ra tp tin m my cn gi l chng trnh ch. Thao tc dch chng
trnh ni chung gm c 2 phn: x l s b chng trnh v dch. Phn x l s b c gi l tin
x l, trong c cc cng vic lin quan n cc ch th c t u tp tin chng trnh ngun
nh #include, #define
a. Ch th bao hm tp tin #include

Cho php ghp ni dung cc tp tin c khc vo chng trnh trc khi dch. Cc tp tin cn
ghp thm vo chng trnh thng l cc tp tin cha khai bo nguyn mu ca cc hng, bin,
hm c sn trong C hoc cc hm do lp trnh vin t vit. C hai dng vit ch th ny.
1: #include <tp tin>
2: #include ng dn\tp tin

Dng khai bo 1 cho php C++ ngm nh tm tp tin ti th mc nh sn thng l


th mc cha code v tp tin l cc tp tin nguyn mu ca th vin C++.
Dng khai bo 2 cho php tm tp tin theo ng dn, nu khng c ng dn s tm trong th
mc hin ti. Tp tin thng l cc tp tin (th vin) c to bi lp trnh vin v c t trong
cng th mc cha chng trnh. C php ny cho php lp trnh vin chia mt chng trnh thnh
nhiu mun t trn mt s tp tin khc nhau d qun l. N c bit hu ch khi lp trnh vin
mun to cc th vin ring cho mnh.
b. Ch th macro #define
#define tn_macro xaukitu

Trc khi dch b tin x l s tm trong chng trnh v thay th bt k v tr xut hin no ca
tn_macro bi xu k t. Ta thng s dng macro nh ngha cc hng hoc thay cm t ny
bng cm t khc d nh hn, v d:
#define then
#define begin {
#define end }
#define MAX 100
#define TRUE 1

// thay then bng du cch


// thay begin bng du {
// thay end bng du }
// thay MAX bng 100
// thay TRUE bng 1

105

t trong chng trnh ta c th vit nhng on lnh nh:


if (i < MAX) then
begin
Ok = TRUE;
cout << i ;
end

trc khi dch b tin x l s chuyn on chng trnh trn thnh


if (i < 100)
{
Ok = 1;
cout << i ;
}

theo ng c php ca C++ v ri mi tin hnh dch.


Ngoi vic ch th #define cho php thay tn_macro bi mt xu k t bt k, n cn cng c
php vit di dng c i. V d, tm s ln nht ca 2 s, thay v ta phi vit nhiu hm max
(mi hm ng vi mt kiu s khc nhau), by gi ta ch cn thay chng bi mt macro c i n
gin nh sau:
#define max(A,B) ((A) > (B) ? (A): (B))

khi trong chng trnh nu c dng x = max(a, b) th n s c thay bi: x = ((a) > (b) ? (a):
(b))
Ch :

Tn macro phi c vit lin vi du ngoc ca danh sch i. V d khng vit max
(A,B).

#define bp(x) (x*x) vit sai v bp(5) ng nhng bp(a+b) s thnh (a+b*a+b) (tc
a+b+ab).

Cng tng t vit #define max(A,B) (A > B ? A: B) l sai (?) v vy lun lun bao cc
i bi du ngoc.

#define bp(x) ((x)*(x)) vit ng nhng nu gi s lp trnh vin mun tnh bnh phng
ca 2 bng on lnh sau:
int i = 1;
cout << bp(++i);

// 6

th kt qu in ra s l 6 thay v kt qu ng l 4. L do l ch chng trnh dch s


thay bp(++i) bi ((++i)*(++i)), v vi i = 1 chng trnh s thc hin nh 2*3 = 6. Do vy
cn cn thn khi s dng cc php ton t tng gim trong cc macro c i. Ni chung, nn
hn ch vic s dng cc macro phc tp, v n c th gy nn nhng hiu ng ph kh
kim sot.
c. Cc ch th bin dch c iu kin #if, #ifdef, #ifndef

Ch th:

#if dy lnh #endif


#if dy lnh #else dy lnh #endif,

Cc ch th ny ging nh cu lnh if, mc ch ca n l bo cho chng trnh dch


106

bit on lnh gia #if (iu kin ) v #endif ch c dch nu iu kin ng. V d:
const int M = 1;
void main() {
int i = 5;
#if M==1
cout << i ;
#endif
}

hoc:
const int M = 10;
void main() {
int i = 5;
#if M > 8
cout << i+i ;
#else
cout << i*i ;
#endif
}

Ch th #ifdef v #ifndef

Ch th ny bo cho chng trnh dch bit on lnh c c dch hay khng khi mt tn gi
c nh ngha hay cha. #ifdef c hiu l nu tn c nh ngha th dch, cn #ifndef
c hiu l nu tn cha c nh ngha th dch. nh ngha mt tn gi ta dng ch th
#define tn.
Ch th ny c bit c ch khi chn cc tp tin th vin vo s dng. Mt tp tin th vin c th
c chn nhiu ln trong vn bn do vy n c th s c dch nhiu ln, iu ny s gy ra li v
cc bin c khai bo nhiu ln. trnh vic ny, ta cn s dng ch th trn nh v d minh ho
sau: Gi s ta vit sn 2 tp tin th vin l mylib.h v mathfunc.h, trong mylib.h cha hm
max(a,b) tm s ln nht gia 2 s, mathfunc.h cha hm max(a,b,c) tm s ln nht gia 3 s thng
qua s dng hm max(a,b). Do vy mathfunc.h phi c ch th #include mylib.h s dng c
hm max(a,b).
Th vin 1. tn tp tin: MYLIB.H
int max(int a, int b)
{
return (a>b? a: b);
}

Th vin 2. tn tp tin: MATHFUNC.H


#include "mylib.h"
int max(int a, int b)
{
return (a>b? a: b);
}

Hm main ca chng ta nhp 3 s, in ra max ca tng cp s v max ca c 3 s.


Chng trnh cn phi s dng c 2 th vin.
#include "mylib.h"

107

#include "mathfunc.h"
void main()
{
int a, b, c;
cout << "a, b, c = " ; cin >> a >> b >> c;
cout << max(a,b) << max(b,c) << max(a,c) << max(a,b,c) ;
}

Trc khi dch chng trnh, b tin x l s chn cc th vin vo trong tp tin chnh (cha
main()) trong mylib.h c chn vo 2 ln (mt ln ca tp tin chnh v mt ln ca
mathfunc.h), do vy khi dch chng trnh, C++ s bo li (do hm int max(inta, int b) c khai
bo hai ln). khc phc tnh trng ny trong mylib.h ta thm ch th mi nh sau:
// tp tin mylib.h
#ifndef _MYLIB_
#define _MYLIB_
int max(int a, int b)
{
return (a>b? a: b);
}
#endif

// nu cha nh ngha tn gi _MYLIB_


// th nh ngha n
// v cc hm khc

Nh vy khi chng trnh dch x l mylib.h ln u do _MYLIB_ cha nh ngha nn my s


nh ngha t ny, v dch on chng trnh tip theo cho n #endif. Ln th hai khi gp li on
lnh ny do _MYLIB_ c nh ngha nn chng trnh b qua on lnh ny khng dch.
cn thn trong c mathfunc.h ta cng s dng c php ny, v c th trong mt chng trnh
khc mathfunc.h li c s dng nhiu ln.

BI TP
Con tr
71. Hy khai bo bin k t ch v con tr kiu k t pc tr vo bin ch. Vit ra cc cch gn gi tr
A cho bin ch.
72. Cho mng nguyn cost. Vit ra cc cch gn gi tr 100 cho phn t th 3 ca mng.
73. Cho p, q l cc con tr cng tr n k t c. t *p = *q + 1. C th khng nh: *q = *p - 1 ?
74. Cho p, q l cc con tr tr n bin nguyn x = 5. t *p = *q + 1; Hi *q ?
75. Cho p, q, r, s l cc con tr tr n bin nguyn x = 10. t *q = *p + 1; *r = *q + 1; *s = *r +
1. Hi gi tr ca bin x ?
76. Chn cu ng nht trong cc cu sau:
A: a ch ca mt bin l s th t ca byte u tin my dnh cho bin .
B: a ch ca mt bin l mt s nguyn.
C: S hc a ch l cc php ton lm vic trn cc s nguyn biu din a ch ca bin
D: a v b ng

108

77. Chn cu sai trong cc cu sau:


A: Cc con tr c th phn bit nhau bi kiu ca bin m n tr n.
B: Hai con tr tr n cc kiu khc nhau s c kch thc khc nhau.
C: Mt con tr kiu void c th c gn bi con tr c kiu bt k (cn p kiu).
D: Hai con tr cng tr n kiu cu trc c th gn cho nhau.
78. Cho con tr p tr n bin x kiu float. C th khng nh ?
A: p l mt bin v *p cng l mt bin
B: p l mt bin v *p l mt gi tr hng
C: s dng c p cn phi khai bo float *p; v gn *p = x;
D: Cng c th khai bo void *p; v gn (float)p = &x;
79. Cho khai bo float x, y, z, *px, *py; v cc lnh px = &x; py = &y; C th khng nh ?
A: Nu x = *px th y = *py
C: Nu *px = y + z th *px = *py + z

B: Nu x = y + z th *px = y + z
D: a, b, c ng

80. Cho khai bo float x, y, z, *px, *py; v cc lnh px = &x; py = &y; C th khng nh ?
A: Nu *px = x th *py = y

B: Nu *px = *py - z th *px = y - z

C: Nu *px = y - z th x = y - z

D: a, b, c ng

81. Khng dng mng, hy nhp mt dy s nguyn v in ngc dy ra mn hnh.


82. Khng dng mng, hy nhp mt dy s nguyn v ch ra v tr ca s b nht, ln nht.
83. Khng dng mng, hy nhp mt dy s nguyn v in ra dy c sp xp.
84. Khng dng mng, hy nhp mt dy k t. Thay mi k t a trong dy thnh k t b v in
kt qu ra mn hnh.

Con tr v xu k t
85. Gi s p l mt con tr kiu k t tr n xu "Tin hc". Chn cu ng nht trong cc cu sau:
A: cout << p s in ra dng "Tin hc" B: cout << p s in ra dng "Tin hc"
C: cout << p s in ra ch ci 'T'

D: b v c ng

86. Xt chng trnh (khng k cc khai bo file nguyn mu):


char st[] = "tin hc";
main() {
char *p; p = new char[10];
for (int i=0; st[i] != '\0'; i++) p[i] = st[i];
}

Chng trnh trn cha hon chnh v:


A: S dng sai c php ton t new
B: S dng sai c php p[i] (ng ra l *(p+i))
C: Xu p cha c kt thc
D: C a, b, c, u sai

109

87. tnh di xu mt sinh vin vit on chng trnh sau:


char *st;
main()
{
int len = 0; gets(st); while (st++ != '\0') len++; printf("%d",len);
}

Hy chn cu ng nht:
A: Chng trnh trn l hon chnh B: Cn thay len++ bi ++len
C: Cn thay st++ bi *st++

D: Cn thay st++ != '\0' bi st++ == '\0'

88. Cho xu k t (dng con tr) s. Hy in ngc xu ra mn hnh.


89. Cho xu k t (dng con tr) s. Hy copy t s sang xu t mt on bt u ti v tr m vi
di n.
90. Cho xu k t (dng con tr) s. Hy thng k tn xut xut hin ca cc k t c trong s. In ra
mn hnh theo th t gim dn ca cc tn xut (tn xut l t l % s ln xut hin ca x trn
tng s k t trong s).

Hm
91. Chn cu sai trong cc cu sau y:
A: Hm khng tr li gi tr th khng cn khai bo kiu gi tr ca hm.
B: Cc bin c khai bo trong hm l cc b, t xo khi hm thc hin xong
C: Hm khng tr li gi tr s c kiu gi tr ngm nh l void.
D: Hm l n v c lp, khng c khai bo hm lng nhau.
92. Chn cu ng nht trong cc cu sau y:
A: Hm phi c kt thc vi 1 cu lnh return
B: Phi c t nht 1 cu lnh return cho hm
C: Cc cu lnh return c php nm v tr bt k trong thn hm
D: Khng cn khai bo kiu gi tr tr li ca hm nu hm khng c lnh return
93. Chn cu sai trong cc cu sau y:
A: S tham s thc s phi bng s tham s hnh thc trong li gi hm
B: Cc bin cc b trong thn hm c chng trnh dch cp pht b nh
C: Cc tham s hnh thc s c cp pht b nh tm thi khi hm c gi
D: Kiu ca tham s thc s phi bng kiu ca tham s hnh thc tng ng vi n trong li gi
hm
94. thay i gi tr ca tham bin, cc i ca hm cn khai bo di dng:
A: bin bnh thng v tham i c truyn theo gi tr
B: bin con tr v tham i c truyn theo gi tr
C: bin bnh thng v tham i c truyn theo a ch
D: bin tham chiu v tham i c truyn theo gi tr

110

95. Vit hm tm UCLN ca 2 s. p dng hm ny (AD: ) tm UCLN ca 4 s nhp t bn


phm.
96. Vit hm kim tra mt s nguyn n c l s nguyn t. AD: In ra cc s nguyn t b hn
1000.
97. Vit hm kim tra mt s nguyn n c l s nguyn t. AD: In cc cp s sinh i < 1000.
(Cc s "sinh i" l cc s nguyn t m khong cch gia chng l 2).
98. Vit hm kim tra mt nm c l nm nhun. AD: In ra cc nm nhun t nm 1000 n 2000.
99. Vit hm xo du cch u tin trong mt xu. AD: Xo tt c du cch trong xu.
100. Vit hm thay 2 du cch bi 1 du cch. AD: Ct cc du cch gia 2 t ca mt xu v cn 1
du cch.
101. Vit hm tro i gi tr ca 2 s. AD: sp xp dy s.
102. Vit hm gii phng trnh bc 2. Dng chng trnh con ny tm nghim ca mt phng
trnh chnh phng bc 4.
103. S hon chnh l s bng tng mi c ca n (V d 6 = 1 + 2 + 3). Hy in ra mi s hon
chnh t 1 n 100.
104. Tnh tng ca dy phn s. In ra mn hnh kt qu di dng phn s ti gin.
105. Nhp s t nhin chn n > 2. Hy kim tra s ny c th biu din c di dng tng ca 2
s nguyn t hay khng ?.
106. In tng ca n s nguyn t u tin.
107. Tnh phn din tch gii hn bi hnh trn bn knh R v hnh vung ngoi tip ca n.
108. Chun ho mt xu (ct k t trng 2 u, ct bt cc du trng (ch li 1) gia cc t, vit
hoa u t).
109. Vit chng trnh nhp s nguyn ln (khng qu mt t), hy c gi tr ca n bng cch in
ra xu k t tng ng vi gi tr ca n. V d 1094507 l Mt triu, (khng trm) chn t
nghn, nm trm linh by n v.
110. Vit chng trnh sp xp theo tn mt mng h tn no .
111. Tm tt c s t nhin c 4 ch s m trong mi s khng c 2 ch s no ging nhau.
112. Nhp s t nhin n. Hy biu din n di dng tch ca cc tha s nguyn t.

qui
113. Nhp s nguyn dng N. Vit hm qui tnh:
p. S1 =
q. S 2 =

1 + 2 + 3 + .. . + N
N
12 + 2 2 + 3 2 + ... + N 2

114. Nhp s nguyn dng n. Vit hm qui tnh:


r.

S1 = 3 + 3 + 3 + ... + 3

n du cn

111

s.

S2 =

1
2+

n du chia

1
2+

1
2+. . .

1
2

115. Vit hm qui tnh n!. p dng chng trnh con ny tnh t hp chp k theo cng thc truy
hi: C(n, k) = n!/(k! (n-k)!)
116. Vit hm qui tnh s fibonaci th n. Dng chng trnh con ny tnh f(2) + f(4) + f(6) +
f(8).
117. Vit di dng qui cc hm
t. daoxau

b. UCLN

c. Fibonaci

118. Vit macro tro i ni dung 2 bin. AD: Sp xp dy s.

112

d. Thp H Ni

CHNG V.

D LIU KIU CU TRC V HP

Kiu cu trc
Cu trc t tr v danh sch lin kt
Kiu hp
Kiu lit k

lu tr cc gi tr gm nhiu thnh phn d liu ging nhau ta c kiu bin mng. Thc t rt
nhiu d liu l tp cc kiu d liu khc nhau tp hp li, qun l d liu kiu ny C++ a ra
kiu d liu cu trc. Mt v d ca d liu kiu cu trc l mt bng l lch trong mi nhn s
c lu trong mt bng gm nhiu kiu d liu khc nhau nh h tn, tui, gii tnh, mc lng

V.1.

KIU CU TRC

V.1.1. Khai bo, khi to


to ra mt kiu cu trc NSD cn phi khai bo tn ca kiu (l mt tn gi do NSD t t), tn
cng vi cc thnh phn d liu c trong kiu cu trc ny. Mt kiu cu trc c khai bo theo
mu sau:
struct <tn kiu>
{
cc thnh phn ;
} <danh sch bin>;
Mi thnh phn ging nh mt bin ring ca kiu, n gm kiu v tn thnh phn. Mt
thnh phn cng cn c gi l trng.
Phn tn ca kiu cu trc v phn danh sch bin c th c hoc khng. Tuy nhin trong
khai bo k t kt thc cui cng phi l du chm phy (;).
Cc kiu cu trc c php khai bo lng nhau, ngha l mt thnh phn ca kiu cu
trc c th li l mt trng c kiu cu trc.
Mt bin c kiu cu trc s c phn b b nh sao cho cc thc hin ca n c sp
lin tc theo th t xut hin trong khai bo.
Khai bo bin kiu cu trc cng ging nh khai bo cc bin kiu c s di dng:
<tn cu trc> <danh sch bin> ;

// trong C++

Cc bin c khai bo cng c th i km khi to:


<tn cu trc> bin = { gi tr khi to } ;
V d:
Khai bo kiu cu trc cha phn s gm 2 thnh phn nguyn cha t s v mu s.
struct Phanso
{

113

int tu ;
int mau ;
};

hoc:
struct Phanso { int tu, mau ; }

Kiu ngy thng gm 3 thnh phn nguyn cha ngy, thng, nm.
struct Ngaythang {
int ng ;
int th ;
int nam ;
} holiday = { 1,5,2000 } ;

mt bin holiday cng c khai bo km cng kiu ny v c khi to bi b s 1.


5. 2000. Cc gi tr khi to ny ln lt gn cho cc thnh phn theo ng th t trong khai
bo, tc ng = 1, th = 5 v nam = 2000.
Kiu Lop dng cha thng tin v mt lp hc gm tn lp v s s sinh vin. Cc bin
kiu Lop c khai bo l daihoc v caodang, trong daihoc c khi to bi b gi tr
{" CNTT1", 60} vi ngha tn lp i hc l CNTT1v s s l 60 sinh vin.
struct Lop {
char tenlop[10],
int soluong;
};
Lop daihoc = {"CNTT1", 60}, caodang ;

Kiu Sinhvien gm c cc trng hoten lu tr h v tn sinh vin, ns lu tr ngy


sinh, gt lu tr gii tnh di dng s (qui c 1: nam, 2: n) v cui cng trng diem
lu tr im thi ca sinh vin. Cc trng trn u c kiu khc nhau.
struct Sinhvien {
char hoten[25] ;
Ngaythang ns;
int gt;
float diem ;
} x, *p, CNTT1 [60];
Sinhvien y = {"NVA", {1,1,1980}, 1} ;

Khai bo cng vi cu trc Sinhvien c cc bin x, con tr p v mng CNTT1vi 60 phn t kiu
Sinhvien. Mt bin y c khai bo thm v km theo khi to gi tr {"NVA", {1,1,1980}, 1}, tc
h tn ca sinh vin y l "NVA", ngy sinh l 1/1/1980, gii tnh nam v im thi trng. y l
kiu khi to thiu gi tr, ging nh khi to mng, cc gi tr trng phi nm cui b gi tr
khi to (tc cc thnh phn b khi to khng c nm xen k gia nhng thnh phn c khi
to).V d ny cn minh ho cho cc cu trc lng nhau, c th trong kiu cu trc Sinhvien c mt
thnh phn cng kiu cu trc l thnh phn ns.
V.1.2. Truy nhp cc thnh phn kiu cu trc
truy nhp vo cc thnh phn kiu cu trc ta s dng c php: tn bin.tn thnh phn hoc tn
bin tn thnh phn i vi bin con tr cu trc. C th:

114

i vi bin thng: tn bin.tn thnh phn

V d:
struct Lop {
char tenlop[10];
int siso;
};
Lop daihoc = " CNTT1", caodang ;
caodang.tenlop = daihoc.tenlop ;
caodang.siso++;

// gn tn lp cng bi tn lp hc
// tng s s lp caodang ln 1

i vi bin con tr: tn bin tn thnh phn

V d:
struct Sinhvien {
char hoten[25] ;
Ngaythang ns;
int gt;
float diem ;
} x, *p, CNTT1 [60];
Sinhvien y = {"NVA", {1,1,1980}, 1} ;
y.diem = 5.5 ;
p = new Sinhvien ;
strcpy(photen, y.hoten) ;
cout << photen << y.hoten;

// gn im thi cho sinh vin y


// cp b nh cha 1 sinh vin
// gn h tn ca y cho sv tr bi p
// in hoten ca y v con tr p

i vi bin mng: truy nhp thnh phn mng ri n thnh phn cu trc.
V d:
strcpy(CNTT1[1].hoten, photen) ;
CNTT1[1].diem = 7.0 ;

// gn h tn cho sv u tin ca lp
// gn im cho sv u tin

i vi cu trc lng nhau. Truy nhp thnh phn ngoi ri n thnh phn ca cu trc
bn trong, s dng cc php ton . hoc (cc php ton ly thnh phn) mt cch thch
hp.
x.ngaysinh.ng = y.ngaysinh.ng ;
x.ngaysinh.th = y.ngaysinh.th ;
x.ngaysinh.nam = y.ngaysinh.nam ;

// gn ngy,
// thng,
// nm sinh ca y cho x.

V.1.3. Php ton gn cu trc


Cng ging cc bin mng, lm vic vi mt bin cu trc chng ta phi thc hin thao tc trn
tng thnh phn ca chng. V d vo/ra mt bin cu trc phi vit cu lnh vo/ra tng cho tng
thnh phn. Nhn xt ny c minh ha trong v d sau:
struct Sinhvien {
char hoten[25] ;
Ngaythang ns;
int gt;
float diem ;
} x, y;
cout << " Nhp d liu cho sinh vin x:" << endl ;

115

cin.getline(x.hoten, 25);
cin >> x.ns.ng >> x.ns.th >> x.ns.nam;
cin >> x.gt;
cin >> x.diem
cout << "Thng tin v sinh vin x l:" << endl ;
cout << "H v tn: " << x.hoten << endl;
cout << "Sinh ngy: " << x.ns.ng << "/" << x.ns.th << "/" << x.ns.nam ;
cout << "Gii tnh: " << (x.gt == 1) ? "Nam": "N ;
cout << x.diem

Tuy nhin, khc vi bin mng, i vi cu trc chng ta c th gn gi tr ca 2 bin cho nhau.
Php gn ny cng tng ng vi vic gn tng thnh phn ca cu trc. V d:
struct Sinhvien {
char hoten[25] ;
Ngaythang ns;
int gt;
float diem ;
} x, y, *p ;
cout << " Nhp d liu cho sinh vin x:" << endl ;
cin.getline(x.hoten, 25);
cin >> x.ns.ng >> x.ns.th >> x.ns.nam;
cin >> x.gt;
cin >> x.diem
y=x;
// i vi bin mng, php gn ny l khng thc hin c
p = new Sinhvien[1] ; *p = x ;
cout << "Thng tin v sinh vin y l:" << endl ;
cout << "H v tn: " << y.hoten << endl;
cout << "Sinh ngy: " << y.ns.ng << "/" << y.ns.th << "/" << y.ns.nam ;
cout << "Gii tnh: " << (y.gt = 1) ? "Nam": "N ;
cout << y.diem

Ch : khng gn b gi tr c th cho bin cu trc. Cch gn ny ch thc hin c khi khi to.
V d:
Sinhvien x = { "NVA", {1,1,1980}, 1, 7.0}, y ;
y = { "NVA", {1,1,1980}, 1, 7.0};
y = x;

// c
// khng c
// c

V.1.4. Cc v d minh ho
Di y chng ta a ra mt vi v d minh ho cho vic s dng kiu cu trc.
V d : Cng, tr, nhn chia hai phn s c cho di dng cu trc.
#include <iostream.h>
struct Phanso {
int tu ;
int mau ;

116

} a, b, c ;
void main()
{
cout << "Nhp phn s a:" << endl ;
cout << "T:"; cin >> a.tu;
cout << "Mu:"; cin >> a.mau;
cout << "Nhp phn s b:" << endl ;
cout << "T:"; cin >> b.tu;
cout << "Mu:"; cin >> b.mau;
c.tu = a.tu*b.mau + a.mau*b.tu;
c.mau = a.mau*b.mau;
cout << "a + b = " << c.tu << "/" << c.mau;
c.tu = a.tu*b.mau - a.mau*b.tu;
c.mau = a.mau*b.mau;
cout << "a - b = " << c.tu << "/" << c.mau;
c.tu = a.tu*b.tu;
c.mau = a.mau*b.mau;
cout << "a + b = " << c.tu << "/" << c.mau;
c.tu = a.tu*b.mau;
c.mau = a.mau*b.tu;
cout << "a + b = " << c.tu << "/" << c.mau;
}

// nhp a

// nhp b

// tnh v in a+b

// tnh v in a-b

// tnh v in axb

// tnh v in a/b

V d : Nhp mng CNTT1. Tnh tui trung bnh ca sinh vin nam, n. Hin danh sch ca sinh
vin c im thi cao nht.
#include <iostream.h>
void main()
{
struct Sinhvien {
char hoten[25] ;
Ngaythang ns;
int gt;
float diem ;
} x, CNTT1[60];
int i, n;
// nhp d liu
cout << "Cho bit s sinh vin: "; cin >> n;
for (i=1, i<=n, i++)
{
cout << "Nhap sinh vien thu " << i);
cout << "Ho ten: " ; cin.getline(x.hoten);
cout << "Ngy sinh: " ; cin >> x.ns.ng >> x.ns.th >>x.ns.nam ;
cout << "Gii tnh: " ; cin >> x.gt ;
cout << "im: " ; cin >> x.diem ;

117

cin.ignore();
CNTT1[i] = x ;
}
}

// Tnh im trung bnh


float tbnam = 0, tbnu = 0;
int sonam = 0, sonu = 0 ;
for (i=1; i<=n; i++)
if (CNTT1[i].gt == 1) { sonam++ ; tbnam += CNTT1[1].diem ; }
else { sonu++ ; tbnu += CNTT1[1].diem ; }
cout << "im trung bnh ca sinh vin nam l " << tbnam/sonam ;
cout << "im trung bnh ca sinh vin n l " << tbnu/sonu ;
// In danh sch sinh vin c im cao nht
float diemmax = 0;
for (i=1; i<=n; i++)

// Tm im cao nht

if (diemmax < CNTT1[i].diem) diemmax = CNTT1[i].diem ;


for (i=1; i<=n; i++)

// In danh sch

{
if (CNTT1[i].diem < diemmax) continue ;
x = CNTT1[1] ;
cout << x.hoten << '\t' ;
cout << x.ns.ng << "/" << x.ns.th << "/" << x.ns.nam << '\t' ;
cout << (x.gt == 1) ? "Nam": "N" << '\t' ;
cout << x.diem << endl;
}
}
V.1.5. Hm vi cu trc
a. Con tr v a ch cu trc

Mt con tr cu trc cng ging nh con tr tr n cc kiu d liu khc, c ngha n cha a ch
ca mt bin cu trc hoc mt vng nh c kiu cu trc no . Mt con tr cu trc c khi
to bi:
Gn a ch ca mt bin cu trc, mt thnh phn ca mng, tng t nu a ch ca
mng (cng l a ch ca phn t u tin ca mng) gn cho con tr th ta cng gi l
con tr mng cu trc. V d:

118

struct Sinhvien {
char hoten[25] ;
Ngaythang ns;
int gt;
float diem ;
} x, y, *p, lop[60];
p = &x ;
pdiem = 5.0;
p = &lop[10] ;
cout << photen;
*p = y ;
(*p).gt = 2;

// cho con tr p tr ti bin cu trc x


// gn gi tr 5.0 cho im ca bin x
// cho p tr ti sinh vin th 10 ca lp
// hin h tn ca sinh vin ny
// gn li sinh vin th 10 l y
// sa li gii tnh ca sinh vin th 10 l n

Ch : thng qua v d ny ta cn thy mt cch khc na truy nhp cc thnh phn ca x c


tr bi con tr p. Khi *p l tng ng vi x, do vy ta dng li c php s dng ton t . sau
*p ly thnh phn nh (*p).hoten, (*p).diem,

Con tr c khi to do xin cp pht b nh. V d:


Sinhvien *p, *q ;
p = new Sinhvien[1];
q = new Sinhvien[60];

trong v d ny *p c th thay cho mt bin kiu sinh vin (tng ng bin x trn)
cn q c th c dng qun l mt danh sch c ti a l 60 sinh vin (tng ng
bin lop[60], v d khi *(p+10) l sinh vin th 10 trong danh sch).

i vi con tr p tr n mng a, chng ta c th s dng mt s cch sau truy nhp


n cc trng ca cc thnh phn trong mng, v d truy cp hoten ca thnh phn th
i ca mng a ta c th vit:
p[i].hoten
(p+i)hoten
*(p+i).hoten

Ni chung cc cch vit trn u d nh do suy t kiu mng v con tr mng. C th


trong p[i] l thnh phn th i ca mng a, tc a[i]. (p+i) l con tr tr n thnh phn th
i v *(p+i) chnh l a[i]. V d sau gn gi tr cho thnh phn th 10 ca mng sinh vin lop,
sau in ra mn hnh cc thng tin ny. V d dng minh ho cc cch truy nhp trng
d liu ca thnh phn trong mng lop.
V d :
struct Sinhvien {
char hoten[25] ;
Ngaythang ns;
int gt;
float diem ;

119

} lop[60] ;
strcpy(lop[10].hoten, "NVA");
lop[10].gt = 1; lop[10].diem = 9.0 ;
Sinhvien *p ;
// khai bo thm bin con tr Sinh vin
p = &lop ;
// cho con tr p tr ti mng lop
cout << p[10].hoten ;
// in h tn sinh vin th 10
cout << (p+10) gt ;
// in gii tnh ca sinh vin th 10
cout << (*(p+10)).diem ;
// in im ca sinh vin th 10

Ch : u tin ca ton t ly thnh phn (du chm) l cao hn cc ton t ly a ch (&) v


ly gi tr (*) nn cn phi vit cc du ngoc ng cch.
b. a ch ca cc thnh phn ca cu trc

Cc thnh phn ca mt cu trc cng ging nh cc bin, do vy cch ly a ch ca cc thnh


phn ny cng tng t nh i vi bin bnh thng. Chng hn a ch ca thnh phn gii tnh
ca bin cu trc x l &x.gt (lu u tin ca . cao hn &, nn &x.gt l cng tng ng vi
&(x.gt)), a ch ca trng hoten ca thnh phn th 10 trong mng lp l lop[10].hoten (hoten l
xu k t), tng t a ch ca thnh phn diem ca bin c tr bi p l &(pdiem).
V d:
struct Sinhvien {
char hoten[25] ;
Ngaythang ns;
int gt;
float diem ;
} lop[60], *p, x = { "NVA", {1,1,1980}, 1, 9.0) };
lop[10] = x; p = &lop[10] ;
// p tr n sinh vin th 10 trong lop
char *ht; int *gt; float *d;
// cc con tr kiu thnh phn
ht = x.ht ;
// cho ht tr n thnh phn hoten ca x
gt = &(lop[10].gt) ;
// gt tr n gt ca sinh vin th 10
d = &(pdiem) ;
// p tr n diem ca sv p ang tr
cout << ht ;
// in h tn sinh vin x
cout << *gt ;
// in gii tnh ca sinh vin th 10
cout << *d ;
// in im ca sinh vin p ang tr.
c. i ca hm l cu trc

Mt cu trc c th c s dng lm i ca hm di cc dng sau y:


L mt bin cu trc, khi tham i thc s l mt cu trc.
L mt con tr cu trc, tham i thc s l a ch ca mt cu trc.
L mt tham chiu cu trc, tham i thc s l mt cu trc.
L mt mng cu trc hnh thc hoc con tr mng, tham i thc s l tn mng cu
trc.
V d : V d sau y cho php tnh chnh xc khong cch ca 2 ngy thng bt k, t c th
suy ra th ca mt ngy thng bt k. i ca cc hm l mt bin cu trc.

120

Khai bo
struct DATE {
int ngay ;
int thang;
int nam ;
};
// S ngy ca mi thng
int n[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

//Kiu ngy thng

Hm tnh nm nhun hay khng nhun, tr li 1 nu nm nhun, ngc li tr 0.


int Nhuan(int nm)
{
return (((nam%4==0) && (nam%100!=0)) || (nam%400==0))? 1: 0;
}

Hm tr li s ngy ca mt thng bt k. Nu nm nhun v l thng hai s ngy ca


thng hai (28) c cng thm 1.
int Ngayct(int thang, int nam)
{
return n[thang] + ((thang==2) ? Nhuan(nam): 0);
}

Hm tr li s ngy tnh t ngy 1 thng 1 nm 1 bng cch cng dn s ngy ca tng


nm t nm 1 n nm hin ti, tip theo cng dn s ngy tng thng ca nm hin ti
cho n thng hin ti v cui cng cng thm s ngy hin ti.
long Tongngay(DATE d)
{
long i, kq = 0;
for (i=1; i<d.nam; i++) kq += 365 + Nhuan(i);
for (i=1; i<d.thang; i++) kq += Ngayct(i,d.nam);
kq += d.ngay;
return kq;
}

Hm tr li khong cch gia 2 ngy bt k.


long Khoangcach(DATE d1, DATE d2)
{
return Tongngay(d1)-Tongngay(d2);
}

Hm tr li th ca mt ngy bt k. Qui c 1 l ch nht, 2 l th hai, tnh th


hm da trn mt ngy chun no ( y l ngy 1/1/2000, c bit l th by). T

121

ngy chun ny nu cng hoc tr 7 s cho ra ngy mi cng l th by. T , tnh


khong cch gia ngy cn tnh th v ngy chun. Tm phn d ca php chia khong
cch ny vi 7, nu phn d l 0 th th l by, phn d l 1 th th l ch nht
int Thu(DATE d)
{
DATE curdate = {1,1,2000};
long kc = Khoangcach(d, curdate);
int du = kc % 7; if (du < 0) du += 7;
return du;
}

// ngy 1/1/2000 l th by

Hm dch mt s d sang th
char* Dich(int t)
{
char* kq = new char[10];
switch (t) {
case 0: strcpy(kq, "th by"); break;
case 1: strcpy(kq, "ch nht"); break;
case 2: strcpy(kq, "th hai"); break;
case 3: strcpy(kq, "th ba"); break;
case 4: strcpy(kq, "th t"); break;
case 5: strcpy(kq, "th nm"); break;
case 6: strcpy(kq, "th su"); break;
}
return kq;
}

Hm main()
void main()
{
DATE d;
cout << "Nhap ngay thang nam: " ;
cin >> d.ngay >> d.thang >> d.nam ;
cout << "Ngy " << d.ngay << "/" << d.thang << "/" << d.nam ;
cout << " l " << Dich(Thu(d));
}

V d : Chng trnh n gin v qun l sinh vin.

Khai bo.
struct Sinhvien {
char hoten[25] ;
Ngaythang ns;
int gt;
float diem ;
};
Sinhvien lop[3];

122

// cu trc sinh vin

// lp cha ti a 3 sinh vin

Hm in thng tin v sinh vin s dng bin cu trc lm i. Trong li gi s dng bin
cu trc truyn cho hm.
void in(Sinhvien x)
{
cout << x.hoten << "\t" ;
cout << x.ns.ng << "/" << x.ns.th << "/" << x.ns.nam << "\t" ;
cout << x.gt << "\t";
cout << x.diem << endl;
}

Hm nhp thng tin v sinh vin s dng con tr sinh vin lm i. Trong li gi s dng
a ch ca mt cu trc truyn cho hm.
void nhap(Sinhvien *p)
{
cin.ignore();
cout << "H tn: "; cin.getline(photen, 25) ;
cout << "Ngy sinh: ";
cin >> (pns).ng >> (pns).th >> (pns).nam ;
cout << "Gii tnh: "; cin >> (pgt) ;
cout << "im: "; cin >> (pdiem) ;
}

Hm sa thng tin v sinh vin s dng tham chiu cu trc lm i. Trong li gi s


dng bin cu trc truyn cho hm.
void sua(Sinhvien &r)
{
int chon;
do {
cout << "1: Sa h tn" << endl ;
cout << "2: Sa ngy sinh" << endl ;
cout << "3: Sa gii tnh" << endl ;
cout << "4: Sa im" << endl ;
cout << "0: Thi" << endl ;
cout << "Sa (0/1/2/3/4) ? ; cin >> chon ; cin.ignore();
switch (chon) {
case 1: cin.getline(r.hoten, 25) ; break;
case 2: cin >> r.ns.ng >> r.ns.th >> r.ns.nam ; break;
case 3: cin >> r.gt ; break;
case 4: cin >> r.diem ; break;
}
} while (chon) ;
}

Hm nhapds nhp thng tin ca mi sinh vin trong mng, s dng con tr mng Sinhvien
lm tham i hnh thc. Trong li gi s dng tn mng truyn cho hm.
void nhapds(Sinhvien *a)
{
int sosv = sizeof(lop) / sizeof(Sinhvien) -1;

// b phn t 0

123

for (int i=1; i<=sosv; i++) nhap(&a[i]) ;


}

Hm suads cho php sa thng tin ca sinh vin trong mng, s dng con tr mng
Sinhvien lm tham i hnh thc. Trong li gi s dng tn mng truyn cho hm.
void suads(Sinhvien *a)
{
int chon;
cout << "Chn sinh vin cn sa: " ; cin >> chon ; cin.ignore();
sua(a[chon]) ;
}

Hm inds hin thng tin ca mi sinh vin trong mng, s dng hng con tr mng
Sinhvien lm tham i hnh thc. Trong li gi s dng tn mng truyn cho hm.
void hien(const Sinhvien *a)
{
int sosv = sizeof(lop) / sizeof(Sinhvien) -1;
for (int i=1; i<=sosv; i++) in(a[i]) ;
}

// b phn t 0

Hm main() gi chy cc hm trn nhp, in, sa danh sch sinh vin.


void main()
{
nhapds(lop) ;
inds(lop);
suads(lop);
inds(lop);
}

d.

Gi tr hm l cu trc

Cng tng t nh cc kiu d liu c bn, gi tr tr li ca mt hm cng c th l cc cu trc


di cc dng sau:

l mt bin cu trc.

l mt con tr cu trc.

l mt tham chiu cu trc.

Sau y l cc v d minh ho gi tr cu trc ca hm.


V d : i v gi tr ca hm l cu trc: Cng, tr hai s phc.
Khai bo kiu s phc
struct Sophuc
{
float thuc;
float ao;
};

Hm cng 2 s phc, tr li mt s phc

Sophuc Cong(Sophuc x, Sophuc y)

124

// Khai bo kiu s phc dng chung

{
Sophuc kq;
kq.thuc = x.thuc + y.thuc ;
kq.ao = x.ao + y.ao ;
return kq;
}

Hm tr 2 s phc, tr li mt s phc

Sophuc Tru(Sophuc x, Sophuc y)


{
Sophuc kq;
kq.thuc = x.thuc + y.thuc ;
kq.ao = x.ao + y.ao ;
return kq;
}

Hm in mt s phc dng (r + im)


void In(Sophuc x)
{
cout << "(" << x.thuc << "," << x.ao << ")" << endl ;
}

Hm chnh
void main()
{
Sophuc x, y, z ;
cout << "x = " ; cin >> x.thuc >> x.ao ;
cout << "y = " ; cin >> y.thuc >> y.ao ;
cout << "x + y = " ; In(Cong(x,y)) ;
cout << "x - y = " ; In(Tru(x,y)) ;
}

V d : Chng trnh nhp v in thng tin v mt lp cng sinh vin c im cao nht lp.

Khai bo kiu d liu Sinh vin v bin mng lop.


struct Sinhvien {
char *hoten ;
float diem ;
} lop[4] ;

Hm nhp sinh vin, gi tr tr li l mt con tr tr n d liu va nhp.


Sinhvien* nhap()
{
Sinhvien* kq = new Sinhvien[1];

// nh cp pht vng nh

125

kq->hoten = new char[15];


// cho c con tr hoten
cout << "H tn: "; cin.getline(kq->hoten,30);
cout << "im: "; cin >> kq->diem; cin.ignore();
return kq;
// tr li con tr kq
}

Hm tm sinh vin c im cao nht, gi tr tr li l mt tham chiu n sinh vin tm


c.
Sinhvien& svmax()
{
int sosv = sizeof(lop)/sizeof(Sinhvien)-1; // b thnh phn th 0
float maxdiem = 0;
int kmax;
// ch s sv c im max
for (int i=1; i<sosv; i++)
if (maxdiem < lop[i].diem)
{
maxdiem = lop[i].diem ;
kmax = i;
}
return lop[kmax];
// tr li sv c im max
}

Hm in thng tin ca mt sinh vin x


void in(Sinhvien x)
{
cout << x.hoten << "\t";
cout << x.diem << endl;
}

Hm chnh
void main()
{
int i;
int sosv = sizeof(lop)/sizeof(Sinhvien)-1; // b thnh phn th 0
for (i=1; i<=sosv; i++) lop[i] = *nhap();
// nhp danh sch lp
for (i=1; i<=sosv; i++) in(lop[i]);
// in danh sch lp
Sinhvien &b = svmax();
// khai bo tham chiu b v cho
// tham chiu n sv c im max
in(b);
// in sinh vin c im max
}

126

V.1.6. Cu trc vi thnh phn kiu bit


a. Trng bit

Thng thng cc trng trong mt cu trc thng s dng t nht l 2 byte tc 16 bit. Trong
nhiu trng hp mt s trng c th ch cn n s bit t hn, v d trng gioitinh thng thng
ch cn n 1 bit lu tr. Nhng trng hp nh vy ta c th khai bo kiu bit cho cc trng
ny tit kim b nh. Tuy nhin, cch khai bo ny t c s dng tr khi cn thit phi truy
nhp n mc bit ca d liu trong cc chng trnh lin quan n h thng.
Mt trng bit l mt khai bo trng int v thm du: cng s bit n theo sau, trong 0 n < 15.
V d do ln ca ngy khng vt qu 31, thng khng vut qu 12 nn 2 trng ny trong cu
trc ngy thng c th khai bo tit kim hn bng 5 v 4 bit nh sau:
struct Date {
int ng: 5;
int th: 4;
int nam;
};
b. c im

Cn ch cc c im sau ca mt cu trc c cha trng bit:


Cc bit c b tr lin tc trn dy cc byte.
Kiu trng bit phi l int (signed hoc unsigned).
di mi trng bit khng qu 16 bit.
C th b qua mt s bit nu b trng tn trng, v d:
struct tu {
int: 8;
int x:8;
};

mi mt bin cu trc theo khai bo trn gm 2 byte, b qua khng s dng byte thp
v trng x chim byte (8 bit) cao.
Khng cho php ly a ch ca thnh phn kiu bit.
Khng th xy dng c mng kiu bit.
Khng c tr v t hm mt thnh phn kiu bit. V d nu b l mt thnh phn ca
bin cu trc x c kiu bit th cu lnh sau l sai:
return x.b ;

// sai

tuy nhin c th thng qua bin ph nh sau:


int tam = x.b ; return tam ;

Tit kim b nh
Dng trong kiu union ly cc bit ca mt t (xem v d trong phn kiu hp).

127

V.1.7. Cu lnh typedef


thun tin trong s dng, thng thng cc kiu c NSD to mi s c gn cho mt tn
kiu bng cu lnh typedef nh sau:
typedef <kiu> <tn_kiu> ;
V d: to kiu mi c tn Bool v ch cha gi tr nguyn (thc cht ch cn 2 gi tr 0, 1), ta c
th khai bo:
typedef int Bool;
khai bo ny cho php xem Bool nh kiu s nguyn.
hoc c th t tn cho kiu ngy thng l Date vi khai bo sau:
typedef struct Date {
int ng;
int th;
int nam;
};

khi ta c th s dng cc tn kiu ny trong cc khai bo (v d tn kiu ca i,


ca gi tr hm tr li ).
1. Hm sizeof()
Hm tr li kch thc ca mt bin hoc kiu. V d:
Bool a, b;
Date x, y, z[50];
cout << sizeof(a) << sizeof(b) << sizeof(Bool) ;
cout << "S phn t ca z = " << sizeof(z) / sizeof(Date)

V.2.

// in 2 2 2
// in 50

CU TRC T TR V DANH SCH LIN KT

Thng thng khi thit k chng trnh chng ta cha bit c s lng d liu cn dng l bao
nhiu khai bo s bin cho ph hp. c bit l bin d liu kiu mng. S lng cc thnh phn
ca bin mng cn phi khai bo trc v chng trnh dch s b tr vng nh c nh cho cc bin
ny. Do buc phi khai bo trc s lng thnh phn nn kiu mng thng dn n hoc l lng
ph b nh (khi chng trnh khng dng ht) hoc l khng cha d liu (khi chng trnh
cn cha d liu vi s lng thnh phn ln hn).
khc phc tnh trng ny C++ cho php cp pht b nh ng, ngha l s lng cc thnh phn
khng cn phi khai bo trc. Bng ton t new chng ta c th xin cp pht vng nh theo nhu
cu mi khi chy chng trnh. Tuy nhin, cch lm ny dn n vic d liu ca mt danh sch s
khng cn nm lin tc trong b nh nh i vi bin mng. Mi ln xin cp pht bi ton t new,
chng trnh s tm mt vng nh ang ri bt k cp pht cho bin v nh vy d liu s nm
ri rc trong b nh. T , d dng qun l trt t ca mt danh sch cc d liu, mi thnh
phn ca danh sch cn phi cha a ch ca thnh phn tip theo hoc trc n (iu ny l khng
cn thit i vi bin mng v cc thnh phn ca chng sp xp lin tc, k nhau). T , mi
thnh phn ca danh sch s l mt cu trc, ngoi cc thnh phn cha thng tin ca bn thn,
chng cn phi c thm mt hoc nhiu con tr tr n cc thnh phn tip theo hay ng trc.
Cc cu trc nh vy c gi l cu trc t tr v cc thnh phn con tr trong cu trc ny s tr

128

n cc vng d liu c kiu chnh l kiu ca chng.


V.2.1. Cu trc t tr
Mt cu trc c cha t nht mt thnh phn con tr c kiu ca chnh cu trc ang nh ngha
c gi l cu trc t tr. C th khai bo cu trc t tr bi mt trong nhng cch sau:
Cch 1:
typedef struct <tn cu trc> <tn kiu> ;
struct <tn cu trc>
{
cc thnh phn cha thng tin ;
<tn kiu> *con tr ;
};

// nh ngha tn cu trc

V d:
typedef struct Sv Sinhvien ;
// lu phi c t kho struct
struct Sv
{
char hoten[30] ;
// thnh phn cha thng tin
float diem ;
// thnh phn cha thng tin
Sinhvien *tiep ;
// thnh phn con tr cha a ch tip theo
};

Cch 2:
struct <tn cu trc>
{
cc thnh phn cha thng tin ;
<tn cu trc> *con tr ;
};
typedef <tn cu trc> <tn kiu> ;

// nh ngha tn cu trc t tr

V d:
struct Sv
{
char hoten[30] ;
float diem ;
Sv *tiep ;
};
typedef Sv Sinhvien ;

// thnh phn cha thng tin


// thnh phn cha thng tin
// thnh phn con tr cha a ch tip theo

Cch 3:
typedef struct <tn kiu>
// nh ngha tn cu trc t tr
{
cc thnh phn cha thng tin ;
<tn kiu> *con tr ;
};

V d:

129

typedef struct Sinhvien


{
char hoten[30] ;
float diem ;
Sinhvien *tiep ;
};

// thnh phn cha thng tin


// thnh phn cha thng tin
// con tr cha a ch thnh phn tip theo

Cch 4:
struct <tn kiu>
{
cc thnh phn cha thng tin ;
<tn kiu> *con tr ;
};

V d:
struct Sinhvien
{
char hoten[30] ;
float diem ;
Sinhvien *tiep ;
};

// thnh phn cha thng tin


// thnh phn cha thng tin
// con tr cha a ch ca phn t tip.

Trong cc cch trn ta thy 2 cch khai bo cui cng l n gin nht. C++ quan
nim cc tn gi ng sau cc t kho struct, union, enum l cc tn kiu (d khng c t
kho typedef), do vy c th s dng cc tn ny khai bo.
V.2.2. Khi nim danh sch lin kt
Danh sch lin kt l mt cu trc d liu cho php th hin v qun l danh sch bng cc cu trc
lin kt vi nhau thng qua cc con tr trong cu trc. C nhiu dng danh sch lin kt ph thuc
vo cc kt ni, v d:
Danh sch lin kt n, mi cu trc cha mt con tr tr n cu trc tip theo hoc
trc . i vi danh sch con tr tr v trc, cu trc u tin ca danh sch s tr v
hng con tr NULL, cu trc cui cng c nh du bi con tr last l con tr tr vo
cu trc ny. i vi danh sch con tr tr v cu trc tip theo, cu trc u s c
nh du bng con tr head v cu trc cui cng cha con tr NULL.
Danh sch lin kt kp gm 2 con tr, mt tr n cu trc trc v mt tr n cu trc
sau, 2 u ca danh sch c nh du bi cc con tr head, last.
Danh sch lin kt vng gm 1 con tr tr v sau (hoc trc), hai u ca danh sch
c ni vi nhau to thnh vng trn. Ch cn mt con tr head nh du u danh
sch.
Do trong cu trc c cha cc con tr tr n cu trc tip theo v/hoc cu trc ng trc nn t
mt cu trc ny chng ta c th truy cp n mt cu trc khc (trc v/hoc sau n). Kt hp vi
cc con tr nh du 2 u danh sch (head, last) chng ta s d dng lm vic vi bt k phn t
no ca danh sch. C th k mt s cng vic thng thc hin trn mt danh sch nh: b sung
phn t vo cui danh sch, chn thm mt phn t mi, xo mt phn t ca danh sch, tm kim,
sp xp danh sch, in danh sch

130

Hnh v bn di minh ho mt danh sch lin kt n qun l sinh vin, thng tin cha trong mi
phn t ca danh sch gm c h tn sinh vin, im. Ngoi ra mi phn t cn cha con tr tiep
ni vi phn t tip theo ca n. Phn t cui cng ni vi cu trc rng (NULL).

head

NVA
9.0

TTB
7.5

PHT
4.0

NULL

V.2.3. Cc php ton trn danh sch lin kt


Di y chng ta m t tm tt cch thc thc hin mt s thao tc trn danh sch lin kt n.
a. To phn t mi

to phn t mi thng thng chng ta thc hin theo cc bc sau y:


dng ton t new xin cp pht mt vng nh cha mt phn t ca danh sch.
nhp thng tin cn lu tr vo phn t mi. Con tr tiep c t bng NULL.
gn phn t va to c vo danh sch. C hai cch:

hoc gn vo u danh sch, khi v tr ca con tr head (ch vo u danh sch)


c iu chnh li ch vo phn t mi.

hoc gn vo cui danh sch bng cch cho con tr tiep ca phn t cui danh sch
(ang tr vo NULL) tr vo phn t mi. Nu danh sch c con tr last ch vo
cui danh sch th last c iu chnh tr vo phn t mi. Nu danh sch khng
c con tr last th tm c phn t cui chng trnh phi duyt t u, bt u t
con tr head cho n khi gp phn t tr vo NULL, l phn t cui ca danh sch.

head

MOI
0.0

NVA
9.0

TTB
7.5

PHT
4.0

NULL

Gn phn t mi vo u danh sch

b. Chn phn t mi vo gia

Gi s phn t mi c chn vo gia phn t th i v i+1. chn ta ni phn t th i vo phn


t mi v phn t mi ni vo phn t th i+1. Thut ton s nh sau:

Cho con tr p chy n phn t th i.

Cho con tr tiep ca phn t mi tr vo phn t th i+1 (tuc p->tiep).

131

Cho con tr tiep ca phn t th i (hin c tr bi p) thay v tr vo phn t th i+1 by


gi s tr vo phn t mi.
MOI

u
0.0

i
9.0

i+1
7.5

cui
4.0

NULL

Chn phn t mi vo gia phn t i v i+1

c. Xo phn t th i khi danh sch

Vic xo mt phn t ra khi danh sch rt n gin bi ch vic thay i cc con tr. C th gi s
cn xo phn t th i ta ch cn cho con tr tiep ca phn t th i-1 tr ("vng qua" phn t th i)
vo phn t th i+1. Nh vy by gi khi chy trn danh sch n phn t th i-1, phn t tip theo
l phn t th i+1 ch khng cn l phn t th i. Ni cch khc phn t th i khng c ni bi
bt k phn t no nn n s khng thuc danh sch. C th thc hin cc bc nh sau:
Cho con tr p chy n phn t th i-1.
t phn t th i vo bin x.
Cho con tr tiep ca phn t th i-1 tr vo phn t th i+1 bng cch t tiep = x.tiep.
Gii phng b nh c tr bi x bng cu lnh delete x.

i-1
0.0

i
9.0

i+1
7.5

cui
4.0

NULL

Xa phn t th i
d. Duyt danh sch

Duyt l thao tc i qua tng phn t ca danh sch, ti mi phn t chng trnh thc hin mt
cng vic g trn phn t m ta gi l thm phn t . Mt php thm c th n gin l hin
ni dung thng tin ca phn t ra mn hnh chng hn. duyt danh sch ta ch cn cho mt
con tr p chy t u n cui danh sch n khi phn t cui c con tr tiep = NULL th dng.
Cu lnh cho con tr p chuyn n phn t tip theo ca n l:
p = p tiep ;
e. Tm kim

Cho mt danh sch trong mi phn t ca danh sch u cha mt trng gi l trng kho,
thng l cc trng c kiu c s hoc kt hp ca mt s trng nh vy. Bi ton t ra l tm

132

trn danh sch phn t c gi tr ca trng kho bng vi mt gi tr cho trc. Tin trnh thc
hin nhim v thccht cng l bi ton duyt, trong thao tc "thm" chnh l so snh trng
kho ca phn t vi gi tr cho trc, nu trng nhau ta in kt qu v dng, Nu duyt ht m
khng c phn t no c trng kho trng vi gi tr cho trc th xem danh sch khng cha gi
tr ny.
Ngoi cc thao tc trn, ni chung cn nhiu cc thao tc quen thuc khc tuy nhin chng ta khng
trnh by y v n khng thuc phm vi ca gio trnh ny.
Di y l mt v d minh ho cho cc cu trc t tr, danh sch lin kt v mt vi thao tc trn
danh sch lin kt thng qua bi ton qun l sinh vin.

Khai bo
struct DATE
{
int day, month, year;
};
struct Sinhvien {
char hoten[31];
DATE ns;
float diem;
Sinhvien *tiep ;
};
Sinhvien *dau = NULL, *cuoi = NULL;
Sinhvien *cur = NULL;
int sosv = 0;

// ngy, thng, nm
// cu trc t tr

// Cc con tr ti u v cui ds
// Con tr ti sv hin ti
// S sv ca danh sch

To sinh vin mi v nhp thng tin, tr li con tr tr n sinh vin mi.


Sinhvien* Nhap1sv()
// To 1 khi d liu cho sv mi
{
Sinhvien *kq = new Sinhvien[1] ;
// Cp pht b nh cho kq
cout << "\nSinh vien thu ", sosv+1 ;
cout << "Ho ten = " ; cin.getline(kq->hoten);
cout << "Ns = " ; cin >> kq->ns.day >> kq->ns.month >> kq->ns.year;
cout << "Diem = " ; cin >> kq->diem ; cin.ignore() ;
kq->tiep = NULL;
return kq ;
}

B sung sinh vin mi vo cui danh sch.


void Bosung()
// B sung sv mi vo cui ds
{
cur = Nhap1sv();
if (sosv == 0) {dau = cuoi = cur;}
else { cuoi->tiep = cur; cuoi = cur; }
sosv++;
}

133

Chn sv mi vo trc sinh vin th n.


void Chentruoc(int n)
// Chn sv mi vo trc sv th n
{
cur = Nhap1sv();
if (sosv==0) { dau = cuoi = cur; sosv++; return; }
if (sosv==1 || n==1) {cur->tiep = dau; dau = cur; sosv++; return;}
Sinhvien *truoc, *sau;
truoc = dau;
sau = dau -> tiep;
for (int i=1; i<n-1; i++) truoc = truoc->tiep;
sau = truoc->tiep;
truoc->tiep = cur;
cur -> tiep = sau;
sosv ++;
}

Chn sv mi vo sau sinh vin th n.


void Chensau(int n)
// Chn sv mi vo sau sv th n
{
cur = Nhap1sv();
if (sosv==0 || sosv<n) { dau = cuoi = cur; sosv++; return; }
Sinhvien *truoc, *sau;
truoc = dau; sau = dau -> tiep;
for (int i=1; i<n; i++) truoc = truoc->tiep;
sau = truoc->tiep;
truoc->tiep = cur;
cur -> tiep = sau;
sosv ++;
}

Xo sinh vin th n.
void Xoa(int n)
// Xo sinh vin th n
{
if (sosv==1&&n==1) { delete dau ; dau = cuoi = NULL; sosv--; return; }
if (n==1) { cur = dau; dau = cur->tiep; delete cur; sosv--; return; }
Sinhvien *truoc, *sau;
truoc = dau;
sau = dau -> tiep;
for (int i=1; i<n-1; i++) truoc = truoc->tiep;
cur = truoc->tiep; sau = cur->tiep; truoc->tiep = sau;
delete cur ;
sosv --;
}

134

To danh sch sinh vin.

void Taods()
// To danh sch
{
int tiep = 1;
while (tiep) {
Bosung();
cout << "Tiep (0/1) ? " ; cin >> tiep ;
}
}

In danh sch sinh vin.


void Inds()
// In danh sch
{
cur = dau;
int i=1;
while (cur != NULL) {
cout << "\nSinh vien thu " << i << " ----------------------------\n") ;
cout << "Hoten:" << cur->hoten ;
cout << "Ngay sinh: "
cout << cur -> ns.day << "/" ;
cout << cur -> ns.month << "/" ;
cout << cur -> ns.year ;
cout << "Diem: " << cur->diem ;
cur = cur->tiep; i++;
}
}

Hm chnh.
void main()
{
Taods();
Inds();
}

V.3.

KIU HP

V.3.1. Khai bo
Ging nh cu trc, kiu hp cng c nhiu thnh phn nhng cc thnh phn ca chng s dng
chung nhau mt vng nh. Do vy kch thc ca mt kiu hp l di ca trng ln nht v
vic thay i mt thnh phn s nh hng n tt c cc thnh phn cn li.
union <tn kiu> {
Danh sch cc thnh phn;
};

135

V.3.2. Truy cp
C php truy cp n cc thnh phn ca hp cng tng t nh kiu cu trc, tc cng s dng
ton t ly thnh phn (du chm . hoc cho bin con tr kiu hp).
Di y l mt v d minh ho vic s dng khai bo kiu hp tch byte thp, byte cao ca mt
s nguyn.
V d :
void main()
{
union songuyen {
int n;
unsigned char c[2];
} x;
cout << "Nhp s nguyn: " ; cin >> x.n ;
cout << "Byte thp ca x = " << x.c[0] << endl ;
cout << "Byte cao ca x = " << x.c[1] << endl;
}

V d : Kt hp cng kiu nhm bit trong cu trc, chng ta c th tm c cc bit ca mt s nh


chng trnh sau. Trong chng trnh ta s dng mt bin u c kiu hp. Trong kiu hp ny c 2
thnh phn l 2 cu trc ln lt c tn s v f.
union {
struct { unsigned a, b ; } s;
struct {
unsigned n1: 1;
unsigned: 15;
unsigned n2: 1;
unsigned: 7;
unsigned n3: 8;
}t;
} u;

vi khai bo trn y khi nhp u.s th n cng nh hng n u.t, c th


u.t.n1 l bit u tin (0) ca thnh phn u.s.a
u.t.n2 l bit 0 ca thnh phn u.s.b
u.t.n3 l byte cao ca u.s.b

V.4.

KIU LIT K

C th gn cc gi tr nguyn lin tip (tnh t 0) cho cc tn gi c th bng kiu lit k theo khai
bo sau y:
enum tn_kiu { d/s tn cc gi tr };

136

V d:
enum Bool {false, true};
khai bo kiu mi t tn Bool ch nhn 1 trong 2 gi tr t tn false v true, trong false ng vi
gi tr 0 v true ng vi gi tr 1. Cch khai bo kiu enum trn cng tng ng vi dy cc
macro sau:
#define false 0
#define true 1

Vi kiu Bool ta c th khai bo mt s bin nh sau:


Bool Ok, found;
hai bin Ok v found s ch nhn 1 trong 2 gi tr false (thay cho 0) hoc true (thay cho 1). C ngha
c th gn:
Ok = true;
found = false;

hoc:

Tuy nhin khng th gn cc gi tr nguyn trc tip cho cc bin enum m phi thng
qua p kiu. V d:
Ok = 0;

// sai

Ok = Bool(0) ;

// ng

hoc Ok = false ;

// ng

BI TP
119. C th truy nhp thnh phn ca cu trc thng qua con tr nh sau (vi p l con tr cu trc
v a l thnh phn ca cu trc):
A: (*p).a

B: *pa

C: a v b sai

D: a v b ng

120. Cho khai bo struct T {int x; float y;} t, *p, a[10]; Cu lnh no trong cc cu sau l khng
hp l:
(1) p = &t;

(2) p = &t.x; (3) p = a;

(4) p = &a

(5) p = &a[5]; (6) p = &a[5].y;

A: 1, 2 v 3

B: 4, 5 v 6

C: 1, 3 v 5

D: 2, 4 v 6

121. Cho cc khai bo sau:


struct ngay {int ng, th, nam;} vaotruong, ratruong;
typedef struct {char hoten[25]; ngay ngaysinh;} sinhvien;
Hy chn cu ng nht
A: Khng c php gn: ratruong = vaotruong;
B: sinhvien l tn cu trc, vaotruong, ratruong l bin cu trc

137

C: C th vit: vaotruong.ng, ratruong.th, sinhvien.vaotruong.nam truy nhp n cc thnh


phn tng ng.
D: a, b, c ng
122. Trong cc khi to gi tr cho cc cu trc sau, khi to no ng:
struct S1 {
int ngay, thang, nam;
} s1 = {2,3};
struct S2 {
char hoten[10];
struct S1 ngaysinh;
} s2 = {"Ly Ly",1,2,3};
struct S3 {
struct S2 sinhvien;
float diem;
} s3 = {{{"Cc cc", {4,5,6}}, 7};

A: S1 v S2 ng

B: S2 v S3 ng

C: S3 v S1 ng

D: C 3 cng ng

123. i vi kiu cu trc, cch gn no di y l khng c php:


A: Gn hai bin cho nhau.
B: Gn hai phn t mng (kiu cu trc) cho nhau
C: Gn mt phn t mng (kiu cu trc) cho mt bin v ngc li
D: Gn hai mng cu trc cng s phn t cho nhau
124. Cho on chng trnh sau:
struct {
int to ;
float soluong;
} x[10];
for (int i = 0; i < 10; i++) cin >> x[i].to >> x[i].soluong ;

Chn cu ng nht trong cc cu sau:


A: on chng trnh trn c li c php
B: Khng c php s dng ton t ly a ch i vi cc thnh phn to v soluong
C: Ly a ch thnh phn soluong dn n chng trnh hot ng khng ng n
D: C a, b, c u sai
125. Chn cu ng nht trong cc cu sau:
A: Cc thnh phn ca kiu hp (union) c cp pht mt vng nh chung
B: Kch thc ca kiu hp bng kch thc ca thnh phn ln nht
C: Mt bin kiu hp c th c t chc cho php thay i c kiu d liu ca bin
trong qua trnh chy chng trnh
D: a, b, c ng
126. Cho khai bo:

138

union {
unsigned x;
unsigned char y[2];
} z = {0xabcd};

Chn cu ng nht trong cc cu sau:


A: Khai bo trn l sai v thiu tn kiu
B: Khi to bin z l sai v ch c mt gi tr (0xabcd)
C: z.y[0] = 0xab
D: z.y[1] = 0xab
127. Cho kiu hp:
union U {
char x[1];
int y[2]; float z[3];
} u;

Chn cu ng nht trong cc cu sau:


A: sizeof(U) = 1+2+3 = 6
B: sizeof(U) = max(sizeof(char), sizeof(int), sizeof(float))
C: sizeof(u) = max(sizeof(u.x), sizeof(u.y), sizeof(u.z))
D: b v c ng
128. Cho khai bo:
union {
unsigned x;
struct {
unsigned char a, b;
} y;
} z = {0xabcd};

Gi tr ca z.y.a v z.y.b tng ng:


A: 0xab, 0xcd

B: 0xcd, 0xab

C: 0xabcd, 0

D: 0, 0xabcd

129. Cho khai bo:


union {
struct {
unsigned char a, b;
} y;
unsigned x;
} z = {{1,2}};

Gi tr ca z.x bng:
A: 513

B: 258

C: Khng xc nh v khi to sai

D: Khi to ng nhng z.x cha c gi tr

130. Xt on lnh:
union U {

139

int x; char y;
} u;
u.x = 0; u.y = 200;

Tm gi tr ca u.x + u.y ?
A: 122

B: 144

C: 200

D: 400

131. Cho s phc di dng cu trc gm 2 thnh phn l thc v o. Vit chng trnh nhp 2 s
phc v in ra tng, tch, hiu, thng ca chng.
132. Cho phn s di dng cu trc gm 2 thnh phn l t v mu. Vit chng trnh nhp 2 phn
s, in ra tng, tch, hiu, thng ca chng di dng ti gin.
133. Tnh s ngy qua k t u nm cho n ngy hin ti. Qui c ngy c khai bo di
dng cu trc v n gin mt nm bt k c tnh 365 ngy v thng bt k c 30 ngy.
134. Nhp mt ngy thng nm di dng cu trc. Tnh chnh xc (k c nm nhun) s ngy
qua k t ngy 1/1/1 cho n ngy .
135. Tnh khong cch gia 2 ngy thng bt k.
136. Hin th ca mt ngy bt k no , bit rng ngy 1/1/1 l th hai.
137. Hin th ca mt ngy bt k no , ly ngy th hin ti lm chun.
138. Vit chng trnh nhp mt mng sinh vin, thng tin v mi sinh vin gm h tn v ngy
sinh (kiu cu trc). Sp xp mng theo tui v in ra mn hnh
139. biu din s phc c th s dng nh ngha sau:
typedef struct {

float re, im; } sophuc;

Cn b sung thm trng no vo cu trc c th lp c mt danh sch lin kt cc s phc.


140. to danh sch lin kt, theo bn sinh vin no di y khai bo ng cu trc t tr s
c dng:
Sinh vin 1: struct SV {char ht[25]; int tuoi; struct SV *tiep;};
Sinh vin 2: typedef struct SV node; struct SV {char ht[25]; int tuoi; node *tiep;};
Sinh vin 3: typedef struct SV {char ht[25]; int tuoi; struct SV *tiep;} node;
A: Sinh vin 1

B: Sinh vin 2 C: Sinh vin 2 v 3

D: Sinh vin 1, 2 v 3

141. Lp danh sch lin kt cha bng ch ci A, B, C Hy o phn u t A .. M xung cui


thnh N, O, Z, A, M.
142. Vit chng trnh tm ngi cui cng trong tr chi: 30 ngi xp vng trn. m vng trn
(bt u t ngi s 1) c n ngi th 7 th ngi ny b loi ra khi vng. Hi ngi cn
li cui cng ?
143. Gi s c danh sch lin kt m mi nt ca n lu mt gi tr nguyn. Vit chng trnh sp
xp danh sch theo th t gim dn.
144. Gi s c danh sch lin kt m mi nt ca n lu mt gi tr nguyn c sp gim dn. Vit
chng trnh cho php chn thm mt phn t vo danh sch sao cho danh sch vn c sp
gim dn.
145. To danh sch lin kt cc s thc x1, x2, ..., xn. Gi m l trung bnh cng:

140

m=

x1 + x2 + ...+ xn
n

Hy in ln lt ra mn hnh cc gi tr: m, x1 - m, x2 - m, ..., xn - m.


146. S dng kiu union in ra byte thp, byte cao ca mt s nguyn.

141

CHNG VI.

LP V I TNG

Lp trnh c cu trc v lp trnh hng i tng


Lp v i tng
i ca phng thc - Con tr this
Hm to (contructor)
Hm hy (destructor)
Cc hm trc tuyn (inline)

VI.1.

LP TRNH C CU TRC V LP TRNH HNG I TNG

VI.1.1. Phng php lp trnh cu trc


Lp trnh cu trc l t chc chng trnh thnh cc chng trnh con. Trong mt s ngn
ng nh PASCAL c 2 kiu chng trnh con l th tc v hm, cn trong C++ ch c
mt loi chng trnh con l hm.
Hm l mt n v chng trnh c lp dng thc hin mt phn vic no nh:
Nhp s liu, in kt qu hay thc hin mt s cng vic tnh ton. Hm cn c i v cc
bin, mng cc b dng ring cho hm.
Vic trao i d liu gia cc hm thc hin thng qua cc i v cc bin ton cc.
Mt chng trnh cu trc gm cc cu trc d liu (nh bin, mng, bn ghi) v cc hm,
th tc.
Nhim v chnh ca vic t chc thit k chng trnh cu trc l t chc chng trnh
thnh cc hm, th tc.
V d, ta xt yu cu sau: Vit chng trnh nhp to (x,y) ca mt dy im, sau tm mt
cp im cch xa nhau nht.
Trn t tng ca lp trnh cu trc c th t chc chng trnh nh sau:

S dng 2 mng thc ton b x v y cha to dy im.

Xy dng 2 hm:

Hm nhapsl dng nhp to n im, hm ny c mt i l bin nguyn n v c khai bo


nh sau:
void nhapsl(int n);

Hm do_dai dng tnh di on thng i qua 2 im c ch s l i v j, n c khai bo nh


sau:
float do_dai(int i, int j);

Chng trnh C ca v d trn c vit nh sau:


#include <iostream.h>
#include <cmath>
float x[100],y[100];
float do_dai(int i, int j)

142

{
return sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2));
}
void nhapsl(int n)
{
int i;
for (i=1; i<=n; ++i)
{
cout<<\n Nhap toa do x, y cua diem thu<<i<< : ";
cin>>x[i]>>y[i];
}
}
void main()
{
int n, i, j, imax,jmax;
float d, dmax;
cout<<''\n So diem N= '';
cin>>n;
nhapsl(n);
dmax=do_dai(1,2);imax=1; jmax=2;
for(i=1; i<=n-1; ++i)
for (j=i+1; j<=n; ++j)
{
d=do_dai(i,j);
if (d>dmax)
{
dmax=d;
imax=i; jmax=j;
}
}
cout<<''\nDoan thang lon nhat co do dai bang: "<< dmax;
cout<<''\n Di qua 2 diem co chi so la "<< imax<<" va ''<<jmax;
}

VI.1.2. Phng php lp trnh hng i tng


L lp trnh c cu trc + tru tng ha d liu. C ngha chng trnh t chc di dng cu trc.
Tuy nhin vic thit k chng trnh s xoay quanh d liu, ly d liu lm trung tm. Ngha l tr
li cu hi: Chng trnh lm vic vi nhng i tng d liu no, trn cc i tng d liu ny
cn thao tc, thc hin nhng g. T gn vi mi i tng d liu mt s thao tc thc hin c
nh ring ca i tng d liu , iu ny s qui nh cht ch hn nhng thao tc no c
thc hin trn i tng d liu no. Khc vi lp trnh cu trc thun ty, trong d liu c
khai bo ring r, tch ri vi thao tc x l, do vic x l d liu thng khng thng nht khi
chng trnh c xy dng t nhiu lp trnh vin khc nhau.
T lp trnh hng i tng c xy dng da trn c trng chnh l khi nim ng gi.
ng gi l khi nim trung tm ca phng php lp trnh hng i tng, trong d liu v
cc thao tc x l n s c qui nh trc v "ng" thnh mt "gi" thng nht, ring bit vi

143

cc d liu khc to thnh kiu d liu vi tn gi l cc lp. Nh vy mt lp khng ch cha d


liu bnh thng nh cc kiu d liu khc m cn cha cc thao tc x l d liu ny. Cc thao
tc c khai bo trong gi d liu no ch x l d liu trong gi v ngc li d liu trong mt
gi ch b tc ng, x l bi thao tc khai bo trong gi . iu ny to tnh tp trung cao khi
lp trnh, mi i tng trong mt lp s cha cng loi d liu c ch nh v cng c x l
bi cc thao tc nh nhau. Mi lp trnh vin khi lm vic vi d liu trong mt gi u s dng
cc thao tc nh nhau x l d liu trong gi . C++ cung cp cch thc to mt cu trc d
liu mi th hin cc gi ni trn, cu trc d liu ny c gi l lp.
minh ho cc khi nim va nu v kiu d liu lp ta tr li xt bi ton tm di ln nht i
qua 2 im. Trong bi ton ny ta gp mt thc th l dy im. Cc thnh phn d liu ca lp dy
im gm:

Bin nguyn n l s im ca dy

Con tr x kiu thc tr n vng nh cha dy honh

Con tr y kiu thc tr n vng nh cha dy tung

Cc phng thc cn a vo theo yu cu bi ton gm:

Nhp to mt im

Tnh di on thng i qua 2 im

Di y l chng trnh vit theo thit k hng i tng.


#include <iostream.h>
#include <cmath>
class daydiem
{
int n;
float *x,*y;
public:
float do_dai(int i, int j)
{
return sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2));
}
void nhapsl(void);
};
void daydiem::nhapsl(void)
{
int i;
cout<<''\n So diem N= '';
cin>>n;
x = new float[n+1];
y = new float[n+1];
for (i=1; i<=n; ++i)
{
cout<<''\n Nhap toa do x, y cua diem thu <<i<<: '';
cin>>x[i]>>y[i];
}
}

144

void main()
{
daydiem p;
p.nhapsl();
int n,i,j,imax,jmax;
float d,dmax;
n = p.n;
dmax=p.do_dai(1,2);imax=1; jmax=2;
for (i=1;i<=n-1;++i)
for (j=i+1;j<=n;++j)
{
d=p.do_dai(i,j);
if (d>dmax)
{
dmax=d;
imax=i; jmax=j;
}
}
cout<<\n Doan thang lon nhat co do dai bang: <<dmax;
cout<<''\n Di qua 2 diem co chi so la "<< imax<<" va <<jmax;
}

VI.2.

LP V I TNG

Trong lp trnh hng i tng, lp (class) l mt khi nim rt quan trng, n cho php gii quyt
cc vn phc tp ca vic lp trnh. Mt lp n (c nh ngha nh struct, union, hoc class)
bao gm cc hm v d liu c lin quan. Cc hm ny l cc hm thnh phn (member functon)
hay cn l phng thc (method), th hin tc ng ca lp c th c thc hin trn d liu ca
chnh lp (data member).
Cng ging nh cu trc, lp c th xem nh mt kiu d liu. V vy lp cn gi l kiu i tng
v lp c dng khai bo cc bin, mng i tng (nh th dng kiu int khai bo cc bin
mng nguyn).
Nh vy t mt lp c th to ra (bng cch khai bo) nhiu i tng (bin, mng) khc nhau. Mi
i tng c vng nh ring ca mnh v v vy ta cng c th quan nim lp chnh l tp hp cc
i tng cng kiu.
VI.2.1. Khai bo lp
khai bo mt lp, ta s dng t kho class nh sau:
class tn_lp
{
// Khai bo cc thnh phn d liu (thuc tnh)
// Khai bo cc phng thc (hm)
};

Ch : Vic khai bo mt lp khng chim gi b nh, chcc i tng ca lp mi thc s chim


gi b nh.

145

Thuc tnh ca lp c th l cc bin, mng, con tr c kiu chun (int, float, char, char*, long,...)
hoc kiu ngoi chun nh ngha trc (cu trc, hp, lp,...). Thuc tnh ca lp khng th c
kiu ca chnh lp , nhng c th l con tr ca lp ny, v d:
class A
{
A x;
A* p ;
};

//Khng cho php, v x c kiu lp A


//Cho php , v p l con tr kiu lp A

VI.2.2. Khai bo cc thnh phn ca lp (thuc tnh v phng thc)


a. Cc t kha private v public

Khi khai bo cc thnh phn d liu v phng thc c th dng cc t kho private v public
quy nh phm vi s dng ca cc thnh phn ny. Trong t kha private qui nh cc thnh
phn (c khai bo vi t kha ny) ch c s dng bn trong lp (trong thn cc phng thc
ca lp). Cc hm bn ngoi lp (khng phi l phng thc ca lp) khng c php s dng cc
thnh phn ny. c trng ny th hin tnh che giu thng tin trong ni b ca lp, n c
cc thng tin ny cn phi thng qua chnh cc thnh phn hm ca lp . Do vy thng tin c tnh
ton vn cao v vic x l thng tin (d liu) ny mang tnh thng nht hn v hu nh d liu
trong cc lp u c khai bo vi t kha ny. Ngc li vi private, cc thnh phn c khai
bo vi t kha public c php s dng c bn trong v bn ngoi lp, iu ny cho php trong
chng trnh c th s dng cc hm ny truy nhp n d liu ca lp. Hin nhin nu cc
thnh phn d liu khai bo l privte th cc thnh phn hm phi c t nht mt vi hm c
khai bo dng public chng trnh c th truy cp c, nu khng ton b lp s b ng kn v
iu ny khng gip g cho chng trnh. Do vy cch khai bo lp tng i ph bin l cc thnh
phn d liu c dng private v thnh phn hm di dng public. Nu khng quy nh c th
(khng dng cc t kho private v public) th C++ hiu l private.
b. Cc thnh phn d liu (thuc tnh)

c khai bo nh khai bo cc thnh phn trong kiu cu trc hay hp. Bnh thng cc thnh
phn ny c khai bo l private bo m tnh giu kn, bo v an ton d liu ca lp khng
cho php cc hm bn ngoi xm nhp vo cc d liu ny.
c. Cc phng thc (hm thnh vin)

Thng khai bo l public chng c th c gi ti (s dng) t cc hm khc trong chng


trnh.
Cc phng thc c th c khai bo v nh ngha bn trong lp hoc ch khai bo bn trong cn
nh ngha c th ca phng thc c th c vit bn ngoi. Thng thng, cc phng thc
ngn c vit (nh ngha) bn trong lp, cn cc phng thc di th vit bn ngoi lp.
Mt phng thc bt k ca mt lp, c th s dng bt k thnh phn (thuc tnh v phng thc)
no ca lp v bt k hm no khc trong chng trnh (v phm vi s dng ca hm l ton
chng trnh).
Gi tr tr v ca phng thc c th c kiu bt k (chun v ngoi chun)
V d sau s minh ho cc iu ni trn. Chng ta s nh ngha lp m t v x l cc im trn
mn hnh ho. Lp c t tn l DIEM.

146

Cc thuc tnh ca lp gm:


int x ;
int y ;
int m ;

// Honh (ct)
// Tung (hng)
// Mu

Cc phng thc:
Nhp d liu mt im
Hin th mt im

Lp im c xy dng nh sau:
#include <iostream.h>
class DIEM
{
private:
int x, y, m ;
public:
void nhapsl() ;
void hien() ;
};
void DIEM::nhapsl()
{
cout <<"\n Nhap hoanh do (cot) va tung do (hang) cua diem: '';
cin >> x >> y ;
cout << ''\n Nhap ma mau cua diem: '';
cin >> m ;
}
void DIEM::hien()
{
cout<<Diem ("<<x<<, "<<y<<);
}

Qua v d trn c th rt ra mt s ch sau:

+ Trong c 2 phng thc (d vit trong hay vit ngoi nh ngha lp) u c
php truy nhp n cc thuc tnh x, y v m ca lp.
+ Cc phng thc vit bn trong nh ngha lp (nh phng thc an() ) c vit
nh mt hm thng thng.
+ Khi xy dng cc phng thc bn ngoi lp, cn dng thm tn lp v ton t
phm vi :: t ngay trc tn phng phc quy nh r y l phng thc ca
lp no.
VI.2.3. Bin, mng v con tr i tng
Nh ni trn, mt lp (sau khi nh ngha) c th xem nh mt kiu i tng v c th dng
khai bo cc bin, mng i tng. Cch khai bo bin, mng i tng cng ging nh khai
bo bin, mng cc kiu khc (nh int, float, cu trc, hp,...), theo mu sau:

147

Tn_lp danh sch i ;


Tn_lp danh sch mng ;

V d s dng DIEM trn, ta c th khai bo cc bin, mng DIEM nh sau:


DIEM d1, d2, d3 ; // Khai bo 3 bin i tng d1, d2, d3
DIEM d[20] ;
// Khai bo mng i tng d gm 20 phn t

Mi i tng sau khi khai bo s c cp pht mt vng nh ring cha cc


thuc tnh ca n. Ch rng s khng c vng nh ring cha cc phng thc cho mi
i tng, cc phng thc s c s dng chung cho tt c cc i tng cng lp. Nh
vy v b nh c cp pht th i tng ging cu trc.
Trong trng hp ny:
sizeof(d1) = sizeof(d2) = sizeof(d3) = 3*sizeof(int) = 6
sizeof(d) = 20*6 = 120
a. Thuc tnh ca i tng

Trong v d trn, mi i tng d1, d2, d3 v mi phn t d[i] u c 3 thuc tnh l x, y, m. Ch


l mi thuc tnh u thuc v mt i tng, v vy khng th vit tn thuc tnh mt cch ring r
m bao gi cng phi c tn i tng i km, ging nh cch vit trong cu trc ca C. Ni cch
khc, cch vit thuc tnh ca i tng nh sau:
tn_i_tng.Tn_thuc_tnh

Vi cc i tng d1, d2, d3 v mng d, c th vit nh sau:


d1.x;
// Thuc tnh x ca i tng d1
d2.x;
// Thuc tnh x ca i tng d2
d3.y;
// Thuc tnh y ca i tng d3
d[2].m;
// Thuc tnh m ca phn t d[2]
d1.x = 100; // Gn 100 cho d1.x
d2.y =d1.x; // Gn d1.x cho d2.y
b. S dng cc phng thc

Cng ging nh hm, mt phng thc c s dng thng qua li gi. Tuy nhin trong li gi
phng thc bao gi cng phi c tn i tng ch r phng thc thc hin trn cc thuc tnh
ca i tng no.
V d li gi sau s thc hin nhp s liu vo cc thnh phn d1.x, d1.y v d1.m: d1.nhapsl(); Cu
lnh sau s thc hin nhp s liu vo cc thnh phn d[3].x, d[3].y v d[3].m: d[3].nhapsl() ;
Chng ta s minh ha cc iu ni trn bng mt chng trnh n gin s dng lp DIEM nhp
3 im, ri hin cc im va nhp. Trong chng trnh a vo hm kd_do_hoa() dng khi
ng h ho.
#include <conio.h>
#include <iostream.h>
#include <graphics.h>
class DIEM
{
private:
int x, y, m ;

148

public:
void nhapsl();
void hien();
};
void DIEM::nhapsl()
{
cout << "\n Nhap hoanh do (cot) va tung do (hang) cua DIEM: '' ;
cin>> x >> y ;
cout << " \n Nhap ma tran cua diem: " ;
cin >> m ;
}
void DIEM::hien()
{
cout<<Diem ("<<x<<, "<<y<<);
}
void main()
{
DIEMd1, d2, d3 ;
d1.nhapsl(); d2.nhapsl(); d3.nhapsl();
d1.hien(); d2.hien(); d3.hien();
}
c. Con tr i tng

Con tr i tng dng cha a ch ca bin, mng i tng. N c khai bo nh sau:


Tn_lp *con tr;

V d dng lp DIEM c th khai bo:


DIEM *p1, *p2, *p3 ;
DIEM d1, d2 ;
DIEM d[20] ;

// Khai bo 3 con tr p1, p2, p3


// Khai bo 2 i tng d1, d2
// Khai bo mng i tng

v c th thc hin cc cu lnh:


p1= &d2 ;
p2 = d ;
p3 = new DIEM

// p1 cha a ch ca d2 , hay p1 tr ti d2
// p2 tr ti u mng d
// To mt t v cha a ch ca n vo p3

s dng thuc tnh ca i tng thng qua con tr, ta vit nh sau:
Tn_con_tr Tn_thuc_tnh

Ch : Nu con tr cha a ch u ca mng, c th dng con tr nh tn mng.


Nh vy sau khi thc hin cc cu lnh trn th:
p1 x v d2.x l nh nhau
p2[i].y v d[i].y l nh nhau
T ta c quy tc s dng thuc tnh: s dng mt thuc tnh ca i tng ta phi dng php
. hoc php . Trong chng trnh, khng cho php vit tn thuc tnh mt cch n c m phi

149

i km tn i tng hoc tn con tr theo cc mu sau:


Tn_i_tng.Tn_thuc_tnh
Tn_con_tr Tn_thuc_tnh
Tn_mng_i_ tng[ch_s].Tn_thuc_tnh
Tn_con_tr[ch_s].Tn_thuc_tnh

Chng trnh di y cng s dng lp DIEM nhp mt dy im, hin th v n cc im va


nhp. Chng trnh dng mt con tr kiu DIEM v dng ton t new to ta mt dy i tng
#include <conio.h>
#include <iostream.h>
#include <graphics.h>
class DIEM
{
private:
int x, y, m ;
public:
void nhapsl();
void hien();
};
void DIEM::nhapsl()
{
cout <<"\n Nhap hoanh do (cot) va tung do (hang) cua diem:'' ;
cin >> x >> y ;
cout << " \n Nhap ma mau cua DIEM: '' ;
cin >> m ;
}
void DIEM::hien()
{
cout<<Diem ("<<x<<, "<<y<<);
}
void main()
{
DIEM *p;
int i, n;
cout << ''So diem: '' ;
cin >> n;
p = new DIEM[n+1];
for (i=1;i<=n;++i)
p[i].nhapsl();
for (i=1;i<=n;++i) p[i].hien();
}

150

VI.3.

I CA PHNG THC, CON TR this

VI.3.1. Con tr this l i th nht ca phng thc


Chng ta hy xem li phng thc nhapsl ca lp DIEM
void DIEM::nhapsl()
{
cout <<"\n Nhap hoanh do (cot) va tung do (hang) cua diem:" ;
cin >> x >> y ;
cout <<'' \n Nhap ma mau cua diem: " ;
cin >> m ;
}

Trong phng thc ny chng ta s dng tn cc thuc tnh x, y v m mt cch n c. iu ny


c v nh mu thun vi quy tc s dng thuc tnh nu trong mc trc. Thc t C++ ngm
nh s dng mt con tr c bit vi tn gi this trong cc phng thc trn. Cc thuc tnh vit
trong phng thc c hiu l thuc mt i tng do con tr this tr ti. Do , nu tng minh
hn, phng thc nhapsl() c th c vit di dng tng ng nh sau:
void DIEM::nhapsl()
{
cout << ''\n Nhap hoanh do (cot) va tung do (hang) cua diem:'' ;
cin >> this x >> this y ;
cout << "\n Nhap ma mau cua diem: '' ;
cin >>this m;
}

Nh vy c th kt lun rng: Phng thc bao gi cng c t nht mt i l con tr this v n


lun lun l i u tin ca phng thc.
VI.3.2. Tham s ng vi i con tr this
Xt mt li gi ti phng thc nhapsl() :
DIEM d1;
d1.nhapsl() ;

Trong trng hp ny tham s truyn cho con tr this chnh l a ch ca d1:


this = &d1

Do :
this x chnh l d1.x
this y chnh l d1.y
this m chnh l d1.m

Nh vy cu lnh:d1.nhapsl() ;s nhp d liu cho cc thuc tnh ca i tng d1. T c th


rt ra kt lun sau:
Tham s truyn cho i con tr this chnh l a ch ca i tng i km vi phng thc trong li
gi phng thc.

151

VI.4.

HM TO (Constructor)

VI.4.1. Hm to (hm thit lp)


Hm to cng l mt phng thc ca lp (nhng l hm c bit) dng to dng mt i
tng mi. Chng trnh dch s cp pht b nh cho i tng sau s gi n hm to. Hm to
s khi gn gi tr cho cc thuc tnh ca i tng v c th thc hin mt s cng vic khc nhm
chun b cho i tng mi.
a. Cch vit hm to

iii. im khc ca hm to v cc phng thc thng thng:

Khi vit hm to cn 3 s khc bit ca hm to so vi cc phng thc khc nh


sau:

Tn ca hm to: Tn ca hm to bt buc phi trng vi tn ca lp.

Khng khai bo kiu cho hm to.

Hm to khng c kt qu tr v.

iv. S ging nhau ca hm to v cc phng thc thng thng


Ngoi 3 im khc bit trn, hm to c vit nh cc phng thc khc:

Hm to c th c xy dng bn trong hoc bn ngoi nh ngha lp.

Hm to c th c i hoc khng c i.

Trong mt lp c th c nhiu hm to (cng tn nhng khc b i).

V d sau nh ngha lp DIEM_DH (im ha) c 3 thuc tnh:


int x;
int y;
int m;

// honh (ct) ca im
// tung (hng) ca im
// mu ca im

v a vo 2 hm to khi gn cho cc thuc tnh ca lp:


// Hm to khng i: Dng cc gi tr c nh khi gn cho x, y, m
DIEM_DH() ;
// Hm to c i: Dng cc i x1, y1, m1 khi gn cho x, y, m
DIEM_DH(int x1, int y1, int m1 = 15) ; // i m1 c gi tr mc nh 15
class DIEM_DH
// (mu trng)
{
private:
int x, y, m ;
public:
// Hm to khng i: khi gn cho x = 0, y = 0, m = 1
// Hm ny vit bn trong nh ngha lp
DlEM_DH()
{
x = y = 0;
m = 1;
}

152

// Hm to ny xy dng bn ngoi nh ngha lp


DIEM_DH(int x1, int y1, int m1 = 15) ;
// Cc phng thc khc
};
// Xy dng hm to bn ngoi nh ngha lp
DIEM_DH:: DIEM_DH(int x1, int y1, int m1) ;
{
x = x1; y = y1; m = m1;
}
b. Dng hm to trong khai bo

+ Khi xy dng cc hm to, ta c th dng chng trong khai bo to ra mt


i tng ng thi khi gn cho cc thuc tnh ca i tng c to. Da vo
cc tham s trong khai bo m trnh bin dch s bit cn gi n hm to no.
+ Khi khai bo mt bin i tng c th s dng cc tham s khi gn cho cc
thuc tnh ca bin i tng.
+ Khi khai bo mng i tng khng cho php dng cc tham s khi gn.
+ Cu lnh khai bo mt bin i tng s gi ti hm to 1 ln.
+ Cu lnh khai bo mt mng n i tng s gi ti hm to n ln.
V d:
DIEM_DH d;

// Gi ti hm to khng i.

// Kt qu d.x = 0, d.y = 0, d.m = 1


DIEM_DH u(300, 100, 5);

// Gi ti hm to c i.

// Kt qu u.x = 300, u.y = 100, d.m = 5


DIEM_DH v(400, 200);

// Gi ti hm to c i.

// Kt qu v.x = 400, v.y = 200, d.m = 15


DIEM_DH p[20] ;

// Gi ti hm to khng i 20 ln

Ch : Vi cc hm c i kiu lp, th i ch xem l cc tham s hnh thc, v vy khai bo i


(trong dng u ca hm) s khng to ra i tng mi v do khng gi ti cc hm to.
c. Dng hm to trong cp pht b nh

+ Khi cp pht b nh cho mt i tng c th dng cc tham s khi gn cho


cc thuc tnh ca i tng, v d
DIEM_DH *q = new DIEM_DH(40, 20, 4);

// Gi ti hm to c i s

// Kt qu q x = 40, q y = 20, q m = 4
DIEM_DH *r = new DIEM_DH ;

//Gi ti hm to khng i s

// Kt qu r x = 0, r y = 0, r m = 1

+ Khi cp pht b nh cho mt dy i tng khng cho php dng tham s khi
gn, v d:
int n = 30;

153

DIEM_DH *s = new DlEM_DH[n] ;

// Gi ti hm to khng i s 30 ln.

d. Dng hm to biu in cc i tng hng

+ Nh bit, sau khi nh ngha lp DIEM_DH th c th xem lp ny nh mt


kiu d liu nh int, double, char, ...
Vi kiu int chng ta c cc hng int, nh 253.
Vi kiu double chng ta c cc hng double, nh 75.42
Khi nim hng kiu int, hng kiu double c th m rng cho hng kiu DIEM_DH

+ biu din mt hng i tng (hay cn gi: i tng hng) chng ta phi
dng ti hm to. Mu vit nh sau:
Tn_lp(danh sch tham s) ;

V d i vi lp DIEM_DH ni trn, c th vit nh sau:


DIEM_DH(234, 123, 4)

// Biu th mt i tng kiu DIEM_DH


// c cc thuc tnh x = 234, y = 123, m = 4

Ch : C th s dng mt hng i tng nh mt i tng. Ni cch khc, c th dng hng i


tng thc hin mt phng thc, v d nu vit:
DIEM_DH(234, l 23, 4).in();

th c ngha l thc hin phng thc in() i vi hng i tng.


e. V d minh ha

Chng trnh sau y minh ha cch xy dng hm to v cch s dng hm to trong khai
bo, trong cp pht b nh v trong vic biu din cc hng i tng.
#include <iostream.h>
#include <iomanip.h>
class DIEM_DH
{
private:
int x, y, m;
public:
// Hm bn dng in i tng DIEM_DH
friend void in(DIEM_DH d)
{
cout <<"\n '' << d.x << '' ''<< d.y<<" " << d.m ;
}
// Phng thc dng in i tng DIEM_DH
void in()
{
cout <<''\n '' << x << '' ''<< y<<" " << m ;
}
// Hm to khng i
DIEM_DH()
{
x = y = 0;
m = 1;

154

}
// Hm to c i, i m1 c gi tr mc nh l 15 (mu trng)
DIEM_DH(int x1, int y1, int m1 = 15);
};
// Xy dng hm to
DIEM_DH::DIEM_DH(int x1, int y1, int m1)
{
x = x1; y = y1; m = m1;
}
void main()
{
DIEM_DH d1;
// Gi ti hm to khng i
DIEM_DH d2(200, 200, 10);
// Gi ti hm to c i
DIEM_DH*d;
d = new DIEM_DH(300, 300);
// Gi ti hm to c i
in(d1);
//Gi hm bn in()
d2.in();
//Gi phng thc in()
in(*d);
// Gi hm bn in()
DIEM_DH(2, 2, 2).in();
// Gi phng thc in()
DIEM_DH t[3];
// 3 ln gi hm to khng i
DIEM_DH*q;
// Gi hm to khng i
int n;
cout << "\n N = "; cin >> n;
q = new DIEM_DH[n+1];
// (n+1) ln gi hm to khng i
for (int i = 0; i< = n; ++i)
q[i] = DIEM_DH(300+i, 200+i, 8); //(n+1) ln gi hm to c i
for (i = 0; i< = n; ++i)
q[i].in();
// Gi phng thc in()
for (i = 0; i< = n; ++i)
DIEM_DH(300+i, 200+i, 8).in(); // Gi phng thc in()
}

VI.4.2. Lp khng c hm to v hm to mc nh
a. Nu lp khng c hm to

Chng trnh dch s cung cp mt hm to mc nh khng i (default), hm ny thc cht


khng lm g c. Nh vy mt i tng to ra ch c cp pht b nh, cn cc thuc tnh ca n
cha c xc nh. Chng ta c th kim chng iu ny, bng cch chy chng trnh sau:
// Hm to mc nh
#include <iostream.h>
class DIEM_DH
{
private:
int x, y, m;

155

public:
// Phng thc
void in() { cout <<"\n '' << x << '' ''<< y<<'' " << m ; }
};
void main()
{
DIEM_DH d;
d.in();
DIEM_DH *p;
p = new DIEM_DH[10];
d.in();
for (int i = 0; i<10; ++i) (p+i)->in();
}
b. Nu trong lp c t nht mt hm to

Khi hm to mc nh s khng c pht sinh na v mi cu lnh xy dng i tng


mi u s gi n mt hm to ca lp. Nu khng tm thy hm to cn gi th chng trnh dch
s bo li. iu ny thng xy ra khi chng ta khng xy dng hm to khng i, nhng li s
dng cc khai bo khng tham s nh v d sau:
#include <iostream.h>
class DIEM_DH
{
private:
int x, y, m;
public:
// Phng thc dng in i tng DIEM_DH
void in()
{
cout <<"\n'' << x << " "<< y<<" " << m ;
}
//Hm to c i
DIEM_DH::DIEM_DH(int x1, int y1 , int m1)
{
x = x1; y = y1 ; m = m1;
}
};
void main()
{
DIEM_DH d1(200, 200, 10); // Gi ti hm to c i
DIEM_DH d2;
// Gi ti hm to khng i
d2 = DIEM_DH(300, 300, 8); // Gi ti hm to c i
d1.in();
d2.in();
}

Trong cc cu lnh trn, ch c cu lnh th 2 trong hm main() l b bo li. Cu lnh ny s gi

156

ti hm to khng i, m hm ny cha c xy dng.


Gii php: c th chn mt trong 2 gii php sau:
Xy dng thm hm to khng i.
Gn gi tr mc nh cho tt c cc i x1, y1 v m1 ca hm to xy dng trn.
Theo phng n 2, chng trnh c th sa nh sau:
#include <iostream.h>
class DIEM_DH
{
private:
int x, y, m;
public:
// Phng thc dng in i tng DIEM_DH
void in() { cout <<''\n '' << x << " "<< y<<" " << m ; }
// Hm to c i , tt c cc i u c gi tr mc nh
DIEM_DH::DIEM_DH(int x1 = 0, int y1 = 0, int m1 = 15)
{
x = x1; y = y1; m = m1;
}
};
void main()
{
// Gi ti hm to, khng dng tham s mc nh
DIEM_DH d1(200, 200, 10);
// Gi ti hm to, dng 3 tham s mc nh
DIEM_DH d2;
// Gi ti hm to, dng 1 tham s mc nh
d2 = DIEM_DH(300, 300);
d1.in();
d2.in();
}

VI.4.3. Hm to sao chp (Copy Constructor)


a. Hm to sao chp mc nh

Gi s nh ngha mt lp no , v d lp PS (phn s). Khi :

+ Ta c th dng cu lnh khai bo hoc cp pht b nh to cc i tng mi, v


d:
PS p1, p2 ;
PS *p = new PS ;

+ Ta cng c th dng lnh khai bo to mt i tng mi t mt i tng


tn ti, v d:
PS u;
PS v(u) ; // To v theo u

157

ngha ca cu lnh ny nh sau:


Nu trong lp PS cha xy dng hm to sao chp, th cu lnh ny s gi ti mt hm
to sao chp mc nh (ca C++). Hm ny s sao chp ni dung tng bit ca u vo cc bit
tng ng ca v. Nh vy cc vng nh ca u v v s c ni dung nh nhau. R rng
trong a s cc trng hp, nu lp khng c cc thuc tnh kiu con tr hay tham chiu,
th vic dng cc hm to sao chp mc nh ( to ra mt i tng mi c ni dung
nh mt i tng cho trc) l v khng cn xy dng mt hm to sao chp mi.
Nu trong lp PS c hm to sao chp (cch vit s ni sau) th cu lnh: PS v(u); s
to ra i tng mi v, sau gi ti hm to sao chp khi gn v theo u.
V d sau s minh ha cch dng hm to sao chp mc nh:
Trong chng trnh a vo lp PS (phn s):

+ Cc thuc tnh gm: t (t s) v m (mu).


+ Trong lp khng c phng thc no c m ch c 2 hm bn l cc hm ton t
nhp (>>) v xut (<<).
+ Ni dung chng trnh l: Dng lnh khai bo to mt i tng u (kiu PS) c
ni dung nh i tng c d.
// Ham tao sao chep mac dinh
#include <iostream.h>
class PS
{
private:
int t, m ;
public:
friend ostream& operator<< (ostream&os, const PS &p)
{
os << " = " << p.t << "/" << p.m;
return os;
}
friend istream& operator>> (istream& is, PS &p)
{
cout << "\n Nhap tu va mau: " ;
is >> p.t >> p.m ;
return is;
}
};
void main()
{
PS d;
cout << "\n Nhap PS d "; cin >> d;
cout << "\n PS d " << d;
PS u(d);
cout << "\n PS u "<< u;
}

158

b. Cch xy dng hm to sao chp

+ Hm to sao chp s dng mt i kiu tham chiu i tng khi gn cho i


tng mi. Hm to sao chp c vit theo mu:
Tn_lp (const Tn_lp & dt)
{
// Cc cu lnh dng cc thuc tnh ca i tng dt
// khi gn cho cc thuc tnh ca i tng mi
}

+ V d c th xy dng hm to sao chp cho lp PS nh sau:


class PS
{
private:
int t, m ;
public:
PS (const PS &p)
{
this->t = p.t ;
this->m = p.m ;
}
...
};
c. Khi no cn xy dng hm to sao chp

+ Nhn xt: Hm to sao chp trong v d trn khng khc g hm to sao chp mc
nh.
+ Khi lp khng c cc thuc tnh kiu con tr hoc tham chiu, th dng hm to
sao chp mc nh l .
+ Khi lp c cc thuc tnh con tr hoc tham chiu, th hm to sao chp mc nh
cha p ng c yu cu.
V d:
class DT
{
private:
int n; // Bac da thuc
double *a; // Tro toi vung nho chua cac he so da thuc a0, a1, ...
public:
DT() { this->n0; this->a = NULL; }
DT(int n1)
{
this->n = n1;
this->a = new double[n1+1];
}
friend ostream& operator << (ostream& os, const DT &d);
friend istream& operator>> (istream& is, DT &d);

159

...
};

By gi chng ta hy theo di xem vic dng hm to mc nh trong on chng trnh sau s dn


n sai lm nh th no:
DT d ; // To i tng d kiu DT
cin >> d ;

/* Nhp i tng d, gm: nhp mt s nguyn dng v gn cho d.n, cp pht vng nh
cho d.a, nhp cc h s ca a thc v cha vo vng nh c cp pht */
DT u(d);

/* Dng hm to mc nh xy dng i tng u theo d. Kt qu: u.n = d.n v u.a = d.a. Nh vy


2 con tr u.a v d.a cng tr n mt vng nh */
Nhn xt: Mc ch l to ra mt i tng u ging nh d, nhng c lp vi d. Ngha l khi d thay
i th u khng b nh hng g. Th nhng mc tiu ny khng t c, v u v d c chung mt
vng nh cha h s ca a thc, nn khi sa i cc h s ca a thc trong d th cc h s ca a
thc trong u cng thay i theo. Cn mt trng hp na cng dn n li l khi mt trong 2 i
tng u v d b gii phng (thu hi vng nh cha a thc) th i tng cn li cng s khng cn
vng nh na.
V d sau s minh ha nhn xt trn: Khi d thay i th u cng thay i v ngc li khi u thay i
th d cng thay i theo.
#include <iostream.h>
#include <cmath>
class DT
{
private:
int n; // Bac da thuc
double *a; // Tro ti vung nho chua cac he so da thuc a0, a1 , ...
public:
DT() { this->n = 0; this->a = NULL; }
DT(int n1)
{
this->n = n1 ;
this->a = new double[n1+1];
}
friend ostream& operator<< (ostream& os, const DT &d);
friend istream& operator>> (istream& is, DT &d);
};
ostream& operator<< (ostream& os, const DT &d)
{
os << " Cac he so (tu ao): ";
for (int i = 0 ; i< = d.n ; ++i)
os << d.a[i] <<" " ;
return os;
}
istream& operator >> (istream& is, DT &d)

160

{
if (d.a! = NULL) delete d.a;
cout << " \n Bac da thuc: " ;
cin >> d.n;
d.a = new double[d.n+1];
cout << ''Nhap cac he so da thuc:\n" ;
for (int i = 0 ; i< = d.n ; ++i)
{
cout << "He so bac "<< i << " = " ;
is >> d.a[i] ;
}
return is;
}
void main()
{
DT d;
cout <<"\n Nhap da thuc d " ; cin >> d;
DT u(d);
cout << "\n Da thuc d "<< d ;
cout << "\n Da thuc u " << u ;
cout <<"\n Nhap da thuc d " ; cin >> d;
cout << "\nDa thuc d " << d;
cout <<"\n Da thuc u " << u ;
cout <<"\n Nhap da thuc u " ; cin >> u;
cout << "\n Da thuc d "<< d ;
cout << "\n Da thuc u " << u ;
}
d. V d v hm to sao chp

Trong chng trnh trn ch r: Hm to sao chp mc nh l cha tho mn i vi lp DT.


V vy cn vit hm to sao chp xy dng i tng mi (v d u) t mt i tng ang
tn ti (v d d) theo cc yu cu sau:

+ Gn d.n cho u.n


+ Cp pht mt vng nh cho u.a c th cha c (d.n + 1) h s.
+ Gn cc h s cha trong vng nh ca d.a sang vng nh ca u.a
Nh vy chng ta s to c i tng u c ni dung ban u ging nh d, nhng c lp vi d.
p ng cc yu cu nu trn, hm to sao chp cn c xy dng nh sau:
DT::DT(const DT &d)
{
this n = d.n ;
this a = new double[d.n+1];

161

for (int i = 0; i< = d.n; ++i)


this a[i] = d.a[i];
}

Chng trnh sau s minh ha iu ny: S thay i ca d khng lm nh hng n u v ngc li


s thay i ca u khng lm nh hng n d.
// Vit hm to sao chp cho lp DT
#include <iostream.h>
#include <cmath>
class DT
{
private:
int n; // Bac da thuc
double *a; // Tro toi vung nho chua cac he so da thuc a0, a1 , ...
public:
DT() { this n = 0; this a = NULL; }
DT(int n1)
{
this n = n1 ;
this a = new double[n1+1];
}
DT(const DT &d);
friend ostream& operator<< (ostream& os, const DT&d);
friend istream& operator>> (istream& is, DT&d);
};
DT::DT(const DT&d)
{
this n = d.n;
this a = new double[d.n+1];
for (int i = 0; i< = d.n; ++i)
this a[i] = d.a[i];
}
ostream& operator<< (ostream& os, const DT &d)
{
os << " Cac he so (tu ao): " ;
for (int i = 0 ; i< = d.n ; ++i) os << d.a[ i] <<" " ;
return os;
}
istream& operator>> (istream& is, DT &d)
{
if (d.a! = NULL) delete d.a;
cout << "\n Bac da thuc: '' ;
cin >> d.n;
d.a = new double[d.n+1];

162

cout << ''Nhap cac he so da thuc:\n'' ;


for (int i = 0 ; i< = d.n ; ++i)
{
cout << "He so bac " << i << " = " ;
is >> d.a[i] ;
}
return is;
}
void main()
{
DT d;
cout <<"\n Nhap da thuc d " ; cin >> d;
DT u(d);
cout <<"\n Da thuc d " << d ;
cout << "\n Da thuc u " << u ;
cout <<"\n Nhap da thuc d " ; cin >> d;
cout << "\n Da thuc d "<< d ;
cout <<"\n Da thuc u " << u ;
cout <<"\n Nhap da thuc u " ; cin >> u;
cout << "\n Da thuc d " << d ;
cout <<"\n Da thuc u " << u ;
}

VI.5.

HM HY (Destructor)

Hm hy l mt hm thnh vin ca lp (phng thc) c chc nng ngc vi hm to. Hm hy


c gi trc khi gii phng (xo b) mt i tng thc hin mt s cng vic c tnh ''dn
dp'' trc khi i tng c hy b, v d nh gii phng mt vng nh m i tng ang qun
l, xo i tng khi mn hnh nu nh n ang hin th, ...
Vic hy b mt i tng thng xy ra trong 2 trng hp sau:

+ Trong cc ton t v cc hm gii phng b nh, nh delete, free, ...


+ Gii phng cc bin, mng cc b khi thot khi hm, phng thc.
VI.5.1. Hm hy mc nh
Nu trong lp khng nh ngha hm hy, th mt hm hy mc nh khng lm g c c
pht sinh. i vi nhiu lp th hm hy mc nh l , v khng cn a vo mt hm hy mi.
VI.5.2. Quy tc vit hm hy
Mi lp ch c mt hm hy vit theo cc quy tc sau:

+ Kiu ca hm: Hm hy cng ging nh hm to l hm khng c kiu, khng c


gi tr tr v.
+ Tn hm: Tn ca hm hy gm mt du ng (ng trc) v tn lp:
~Tn_lp

163

+ i: Hm hy khng c i
V d c th xy dng hm hy cho lp DT (a thc) nh sau:
class DT
{
private:
int n; // Bac da thua
double *a; // Tro toi vung nho chua cac he so da thuc a0, a1 , ...
public:
~DT()
{
this n = 0;
delete this a;
}
...
};

VI.5.3. Vai tr ca hm hy trong lp DT


Trong phn trc nh ngha lp DT (a thc) kh y gm:

+ Cc hm to
+ Cc ton t nhp >>, xut <<
+ Cc hm ton t thc hin cc php tnh +, -, *, /
Tuy nhin vn cn thiu hm hy gii phng vng nh m i tng kiu DT (cn hy) ang
qun l.
Chng ta hy phn tch cc khim khuyt ca chng trnh ny:

+ Khi chng trnh gi ti mt phng thc ton t thc hin cc php tnh cng,
tr, nhn a thc, th mt i tng trung gian c to ra. Mt vng nh c cp
pht v giao cho n (i tng trung gian) qun l.
+ Khi thc hin xong php tnh s ra khi phng thc. i tng trung gian b xo,
tuy nhin ch vng nh ca cc thuc tnh ca i tng ny c gii phng. Cn
vng nh (cha cc h s ca a thc) m i tng trung gian ang qun l th
khng h b gii phng. Nh vy s vng nh b chim dng v ch s tng ln.
Nhc im trn d dng khc phc bng cch a vo lp DT hm hy trong mc 3 trn.

VI.6.

CC HM TRC TUYN (inline)

Mt s m rng ca C++ i vi C c trnh by trong cc chng trc nh bin tham chiu,


nh ngha chng hm, hm vi i mc nh Phn ny ta xem mt c trng khc ca C++
c gi l hm trc tuyn (inline).
VI.6.1. u nhc im ca hm
Vic t chc chng trnh thnh cc hm c 2 u im r rt:

Th nht l chia chng trnh thnh cc n v c lp, lm cho chng trnh c t


164

chc mt cch khoa hc d kim sot, d pht hin li, d pht trin v m rng.
Th hai l gim c kch thc chng trnh, v mi on chng trnh thc hin
nhim v ca hm c thay bng mt li gi hm.
Tuy nhin hm cng c nhc im l lm chm tc chng trnh do phi thc hin mt s thao
tc c tnh th tc mi khi gi hm nh: cp pht vng nh cho cc iv bin cc b, truyn d
liu ca cc tham s cho cc i, gii phng vng nh trc khi thot khi hm.
Cc hm trc tuyn trong C++ c kh nng khc phc c cc nhc im ni trn.
VI.6.2. Cc hm trc tuyn
bin mt hm thnh trc tuyn ta vit thm t kho inline vo trc khai bo nguyn mu hm.
Nu khng dng nguyn mu th vit t kho ny trc dng u tin ca nh ngha hm.
V d :
inline float f(int n, float x);
float f(int n, float x)
{
// Cc cu lnh trong thn hm
}

hoc
inline float f(int n, float x)
{
// Cc cu lnh trong thn hm
}

Ch : Trong mi trng hp, t kho inline phi xut hin trc cc li gi hm th trnh bin dch
mi bit cn x l hm theo kiu inline.
V d hm f trong chng trnh sau s khng phi l hm trc tuyn v t kho inline vit sau li
gi hm:
#include <iostream.h>
void main()
{
int s ;
s = f(5,6);
cout << s ;
}
inline int f(int a, int b)
{
return a*b;
}

Ch : Trong C++, nu hm c xy dng sau li gi hm th bt buc phi khai bo nguyn mu


hm trc li gi. Trong v d trn, trnh bin dch C++ s bt li v thiu khai bo nguyn ngu hm
f.
VI.6.3. Cch bin dch v dng hm trc tuyn
Chng trnh dch x l cc hm inline nh cc macro (c nh ngha trong lnh #define), ngha

165

l n s thay mi li gi hm bng mt on chng trnh thc hin nhim v ca hm. Cch ny


lm cho chng trnh di ra, nhng tc chng trnh tng ln do khng phi thc hin cc thao
tc c tnh th tc khi gi hm.
Phng n dng hm trc tuyn rt ngn c thi gian chy my nhng li lm tng khi lng
b nh chng trnh (nht l i vi cc hm trc tuyn c nhiu cu lnh). V vy ch nn dng
phng n trc tuyn i vi cc hm nh.
VI.6.4. S hn ch ca trnh bin dch
Khng phi khi gp t kho inline l trnh bin dch nht thit phi x l hm theo kiu trc tuyn.
C mt s hm m cc trnh bin dch thng khng x l theo cch inline nh cc hm cha bin
static, hm cha cc lnh chu trnh hoc lnh goto hoc lnh switch, hm quy. Trong trng hp
ny t kho inline l d nhin b b qua.
Thm ch t kho inline vn b b qua ngay c i vi cc hm khng c nhng hn ch nu trn
nu nh trnh bin dch thy cn thit (v d c qu nhiu hm inline lm cho b nh chng
trnh qu ln)
V d : Chng trnh sau s dng hm inline tnh chu vi v din tch ca hnh ch nht:
Cch 1: Khng khai bo nguyn mu. Khi hm dtcvhcn phi t trc hm main.
#include <iostream.h>
inline void dtcvhcn(int a, int b, int &dt, int &cv)
{
dt=a*b;
cv=2*(a+b);
}
void main()
{
int a[20],b[20],cv[20],dt[20],n;
cout << "\n So hinh chu nhat: '' ;
cin >> n;
for (int i=1; i<=n; ++i)
{
cout <<"\n Nhap 2 canh cua hinh chu nhat thu " << i << ": ";
cin >> a[i] >> b[i];
dtcvhcn(a[i],b[i],dt[i], cv[i]);
}
for (i=1; i<=n; ++i)
{
cout << "\n Hinh chu nhat thu "<< i << '' : '';
cout << "\n Do dai 2 canh= '' << a[i] << '' va '' << b[i] ;
cout <<"\n Dien tich= " << dt[i] ;
cout << "\n Chu vi= '' << cv[i] ;
}
}

Cch 2:S dng khai bo nguyn mu. Khi t kho inline t trc nguyn mu.
Ch : Khng c t inline trc nh ngha hm. Trong chng trnh di y nu t inline

166

trc nh ngha hm th hu qu nh sau: Chng trnh vn dch thng, nhng khi chy th chng
trnh b qun v khng thot i c.
#include <iostream.h>
inline void dtcvhcn(int a, int b, int &dt, int &cv);
void main()
{
int a[20],b[20],cv[20],dt[20],n;
cout << "\n So hinh chu nhat: '' ;
cin >> n;
for (int i=1; i<=n; ++i)
{
cout <<"\n Nhap 2 canh cua hinh chu nhat thu " << i << ": ";
cin >> a[i] >> b[i];
dtcvhcn(a[i],b[i],dt[i], cv[i]);
}
for (i=1; i<=n; ++i)
{
cout << "\n Hinh chu nhat thu "<< i << '' : '';
cout << "\n Do dai 2 canh= '' << a[i] << '' va '' << b[i] ;
cout <<"\n Dien tich= " << dt[i] ;
cout << "\n Chu vi= '' << cv[i] ;
}
}
void dtcvhcn(int a, int b, int&dt, int &cv)
{
dt=a*b;
cv=2*(a+b);
}

167

CHNG VII.

HM BN, NH NGHA PHP TON CHO LP

Hm bn
nh ngha php ton cho lp

VII.1.

HM BN (Friend function)

VII.1.1.

Hm bn

mt hm tr thnh bn ca mt lp, c 2 cch vit:


Cch 1: Dng t kha friend khai bo hm trong lp v xy dng hm bn ngoi nh cc hm
thng thng (khng dng t kha friend). Mu vit nh sau:
class A
{
private:
// Khai bo cc thuc tnh
public:
...
// Khai bo cc hm bn ca lp A
friend void f1(...);
friend double f2(...);
friend A f3(...) ;
...
};
// Xy dng cc hm f1, f2, f3
void f1(...)
{
...
}
double f2(...)
{
...
}
A f3(...)
{
...
}

Cch 2: Dng t kha friend xy dng hm trong nh ngha lp. Mu vit nh sau:
class A
{
private:
// Khai bo cc thuc tnh
public:

168

// Xy dng cc hm bn ca lp A
void f1(...)
{
...
}
double f2(...)
{
...
}
A f3(...)
{
...
}
...
};

VII.1.2.

Tnh cht ca hm bn

Trong thn hm bn ca mt lp c th truy nhp ti cc thuc tnh ca cc i tng thuc lp


ny. y l s khc nhau duy nht gia hm bn v hm thng thng.
Ch rng hm bn khng phi l phng thc ca lp. Phng thc c mt i n (ng
vi con tr this) v li gi ca phng thc phi gn vi mt i tng no (a ch i tng
ny c truyn cho con tr this). Li gi ca hm bn ging nh li gi ca hm thng thng.
V d sau s so snh phng thc, hm bn v hm thng thng.
Xt lp SP (s phc), hy so snh 3 phng n thc hin vic cng 2 s phc:
Phng n 1: Dng phng thc
class SP
{
private:
double a; // phn thc
double b; // Phn o
public:
SP cong(SP u2)
{
SP u:
u.a = this a + u2.a ;
u.b = this b + u2.b ;
return u;
}
};

Cch dng:
SP u, u1, u2;
u = u1.cong(u2);

169

Phng n 2: Dng hm bn
class SP
{
private:
double a; // Phn thc
double b; // Phn o
public:
friend SP cong(SP u1 , SP u2)
{
SP u:
u.a = u1.a + u2.a ;
u.b = u1.b + u2.b ;
return u;
}
};

Cch dng
SP u, u1, u2;
u = cong(u1, u2);

Phng n 3: Dng hm thng thng


class SP
{
private:
double a; // phn thc
double b; // Phn o
public:
...
};
SP cong(SP u1, SP u2)
{
SP u:
u.a = u1.a + u2.a ;
u.b = u1.b + u2.b ;
return u;
}

Phng n ny khng c chp nhn, trnh bin dch s bo li trong thn hm khng c quyn
truy xut n cc thuc tnh ring (private) a, b ca cc i tng u, u1 v u2 thuc lp SP.
VII.1.3.

Hm bn ca nhiu lp

Khi mt hm l bn ca nhiu lp, th n c quyn truy nhp ti tt c cc thuc tnh ca cc


i tng trong cc lp ny.
lm cho hm f tr thnh bn ca cc lp A, B v C ta s dng mu vit nh sau:
class A;
class B;

170

// Khai bo trc lp A
// Khai bo trc lp B

class C;
// Khai bo trc lp C
// nh ngha lp A
class A
{
// Khai bo f l bn ca A
friend void f(...) ;
};
// nh ngha lp B
class B
{
// Khai bo f l bn ca B
friend void f(...) ;
};
// nh ngha lp C
class C
{
// Khai bo f l bn ca C
friend void f(...) ;
};
// Xy dng hm f
void f(...)
{
...
}

Chng trnh sau y minh ha cch dng hm bn (bn ca mt lp v bn ca nhiu lp).


Chng trnh a vo 2 lp VT (vc t), MT (ma trn) v 3 hm bn thc hin cc thao tc trn
2 lp ny:
// Hm bn vi lp VT dng in mt vc t
friend void in(const VT &x);
// Hm bn vi lp MT dng in mt ma trn
friend void in(const MT &a);
// Hm bn vi c 2 lp MT v VT dng nhn ma trn vi vc t
friend VT tich(const MT &a, const VT &x);

Ni dung chng trnh l nhp mt ma trn vung cp n v mt vc t cp n, sau thc hin php
nhn ma trn vi vc t va nhp.
#include <iostream.h>
#include <cmath>
class VT;
class MT;
class VT
{
private:
int n;
double x[20]; // Toa do cua diem
public:
void nhapsl();

171

friend void in(const VT &x);


friend VT tich(const MT &a, const VT &x) ;
};
class MT
{
private:
int n;
double a[20][20];
public:
friend VT tich(const MT &a, const VT &x);
friend void in(const MT &a);
void nhapsl();
};
void VT::nhapsl()
{
cout << "\n Cap vec to = ";
cin >> n ;
for (int i = 1; i< = n ; ++i)
{
cout << "\n Phan tu thu " << i <<" = " ;
cin >> x[i];
}
}
void MT::nhapsl()
{
cout <<"\n Cap ma tran = ";
cin >> n ;
for (int i = 1; i< = n ; ++i)
for (int j = 1; j< = n; ++j)
{
cout << "\n Phan tu thu: "<<i<< " hang "<< i << " cot " << j << " = ";
cin >> a[i][j];
}
}
VT tich(const MT &a, const VT &x)
{
VT y;
int n = a.n;
if (n! = x.n)
return x;
y.n = n;
for (int i = 1; i< = n; ++i)
{

172

y.x[i] = 0;
for (int j = 1; j< = n; ++j)
y.x[i] = a.a[i][j]*x.x[j];
}
return y;
}
void in(const VT &x)
{
cout << "\n";
for (int i = 1; i< = x.n; ++i)
cout << x.x[i] << " ";
}
void in(const MT &a)
{
for (int i = 1; i< = a.n; ++i)
{
cout << "\n " ;
for (int j = 1; j< = a.n; ++j)
cout << a.a[i][j] << " ";
}
}
void main()
{
MT a; VT x, y;
a.nhapsl();
x.nhapsl();
y = tich(a, x);
clrscr();
cout << "\n Ma tran A:";
in(a);
cout << "\n Vec to x: " ;
in(x);
cout << "\n Vec to y = Ax: " ;
in(y);
}

VII.2.

NH NGHA PHP TON CHO LP

i vi mi lp ta c th s dng li cc k hiu php ton thng dng (+, -, *, ) nh ngha


cho cc php ton ca lp. Sau khi c nh ngha cc k hiu ny s c dng nh cc php ton
ca lp theo cch vit thng thng. Cch nh ngha ny c gi l php chng ton t (nh khi
nim chng hm trong cc chng trc).

173

VII.2.1.

Tn hm ton t

Gm t kho operator v tn php ton.


V d:
operator+(nh ngha chng php +)
operator- (nh ngha chng php -)

VII.2.2.

Cc i ca hm ton t

Vi cc php ton c 2 ton hng th hm ton t cn c 2 i. i th nht ng vi ton


hng th nht, i th hai ng vi ton hng th hai. Do vy, vi cc php ton khng
giao hon (php -) th th t i l rt quan trng.
V d: Cc hm ton t cng, tr phn s c khai bo nh sau:
struct PS
{
int a;
//T s
int b;
// Mu s
};
PS operator+(PS p1, PS p2);
PS operator-(PS p1 , PS p2);
PS operator*(PS p1, PS p2);
PS operator/(PS p1, PS p2);

// p1 + p2
// p1 - p2
// p1 *p2
// p1/p2

Vi cc php ton c mt ton hng, th hm ton t c mt i. V d hm ton t i


du ma trn (i du tt c cc phn t ca ma trn) c khai bo nh sau:
struct MT
{
double a[20][20] ; // Mng cha cc phn t ma trn
int m ;
// S hng ma trn
int n ;
// S ct ma trn
};
MT operator-(MT x) ;

VII.2.3.

Thn ca hm ton t

Vit nh thn ca hm thng thng. V d hm i du ma trn c th c nh ngha nh sau:


struct MT
{
double a[20][20] ;
// Mng cha cc phn t ma trn
int m ;
// S hng ma trn
int n ;
// S ct ma trn
};
MT operator-(MT x)
{
MT y;
for (int i=1 ;i<= y.m ; ++i)
for (int j =1 ;j<= y.n ; ++j)y.a[i][j] =- x.a[i][j];

174

return y;
}
a. Cch dng hm ton t

C 2 cch dng:
Cch 1: Dng nh mt hm thng thng bng cch vit li gi
V d:
PS p, q, u, v ;
u = operator+(p, q) ;
v = operator-(p, q) ;

// u = p + q
// v= p - q

Cch 2: Dng nh php ton ca C++


V d:
PS p, q, u, v ;
u=p+q;
v=p-q;

// u = p + q
//v = p - q

Ch : Khi dng cc hm ton t nh php ton ca C++ ta c th kt hp nhiu php ton vit
cc cng thc phc tp. Cng cho php dng du ngoc trn quy nh th t thc hin cc php
tnh. Th t u tin ca cc php tnh vn tun theo cc quy tc ban u ca C++. Chng hn cc
php * v / c th t u tin cao hn so vi cc php + v b. Cc v d v nh ngha chng ton t

V d : Trong v d ny ngoi vic s dng cc hm ton t thc hin 4 php tnh trn phn s,
cn nh ngha chng cc php ton << v >> xut v nhp phn s.
Hm operator<< c 2 i kiu ostream& v PS (Phn s). Hm tr v gi tr kiu ostream& v c
khai bo nh sau:
ostream& operator<< (ostream& os, PS p);

Tng t hm operator>> c khai bo nh sau:


istream& operator>> (istream& is,PS &p);

Di y s ch ra cch xy dng v s dng cc hm ton t.


Chng ta cng s thy vic s dng cc hm ton t rt t nhin, ngn gn v tin li.
#include <iostream.h>
#include <cmath>
struct PS
{
int a,b;
};
ostream& operator<< (ostream& os, PS p);
istream& operator>> (istream& is,PS &p);
int uscln(int x, int y);
PS rutgon(PS p);
PS operator+(PS p1, PS p2);
PS operator-(PS p1, PS p2);
PS operator*(PS p1, PS p2);

175

PS operator/(PS p1, PS p2);


ostream& operator<< (ostream& os, PS p)
{
os << p.a << '/' << p.b ;
return os;
}
istream& operator>> (istream& is,PS &p)
{
cout << "\n Nhap tu va mau: '' ;
is >> p.a >> p.b ;
return is;
}
int uscln(int x, int y)
{
x=abs(x);y=abs(y);
if (x*y==0) return 1;
while (x!=y)
{
if (x>y) x-=y;
else y-=x;
}
return x;
}
PS rutgon(PS p)
{
PS q;
int x;
x=uscln(p.a,p.b);
q.a = p.a / x ;
q.b = p.b/ x ;
return q;
}
PS operator+(PS p1, PS p2)
{
PS q;
q.a = p1.a*p2.b + p2.a*p1.b;
q.b = p1 .b * p2.b ;
return rutgon(q);
}
PS operator-(PS p1, PS p2)
{
PS q;
q.a = p1.a*p2.b - p2.a*p1 .b;
q.b = p1.b * p2.b ;
return rutgon(q);
}

176

PS operator*(PS p1, PS p2)


{
PS q;
q.a = p1.a * p2.a ;
q.b = p1.b * p2.b ;
return rutgon(q);
}
PS operator/(PS p1 , PS p2)
{
PS q;
q.a = p1.a * p2.b ;
q.b = p1.b * p2.a ;
return rutgon(q);
}
void main()
{
PS p, q, z, u, v ;
PS s;
cout <<"\nNhap cac PS p, q, z, u, v: '' ;
cin >> p >> q >> z >> u >> v ;
s = (p - q*z) / (u + v) ;
cout << "\n Phan so s = " << s;
}

V d : Chng trnh a vo cc hm ton t:


operator- c mt i dng o du mt a thc
operator+ c 2 i dng cng 2 a thc
operator- c 2 i dng tr 2 a thc
operator* c 2 i dng nhn 2 a thc
operator^c 2 i dng tnh gi a thc ti x
perator<< c 2 i dng in a thc
perator>> c 2 i dng nhp a thc
Chng trnh s nhp 4 a thc: p, q, r, s. Sau tnh a thc: f = -(p+q)*(r-s)
Cui cng tnh gi tr f(x), vi x l mt s thc nhp t bn phm.
#include <iostream.h>
#include <cmath>
struct DT
{
double a[20];// Mang chua cac he so da thuc a0, a1,...
int n ;// Bac da thuc
};
ostream& operator<< (ostream& os, DT d);
istream& operator>> (istream& is, DT &d);
DT operator-(const DT& d);

177

DT operator+(DT d1, DT d2);


DT operator-(DT d1, DT d2);
DT operator*(DT d1, DT d2);
double operator^(DT d, double x);// Tinh gia tri da thuc
ostream& operator<< (ostream& os, DT d)
{
os << " Cac he so (tu ao): '' ;
for (int i=0 ;i<= d.n ;++i)
os << d.a[i] <<" " ;
return os;
}
istream& operator>> (istream& is, DT &d)
{
cout << " Bac da thuc: '' ;
cin >> d.n;
cout << ''Nhap cac he so da thuc:" ;
for (int i=0 ;i<=d.n ;++i)
{
cout << "\n He so bac " << i <<" = '' ;
is >> d.a[i] ;
}
return is;
}
DT operator-(const DT& d)
{
DT p;
p.n = d.n;
for (int i=0 ;i<=d.n ;++i)
p.a[i] = -d.a[i];
return p;
}
DT operator+(DT d1, DT d2)
{
DT d;
int k,i;
k = d1.n > d2.n ? d1.n : d2.n ;
for (i=0;i<=k ;++i)
if (i<=d1.n && i<=d2.n) d.a[i] = d1.a[i] + d2.a[i];
else if (i<=d1.n) d.a[i] = d1.a[i];
else d.a[i] = d2.a[i];
i = k;
while (i>0 && d.a[i]==0.0) --i;
d.n=i;
return d ;
}
DT operator-(DT d1, DT d2)

178

{
return (d1 + (-d2));
}
DT operator*(DT d1 , DT d2)
{
DT d;
int k, i, j;
k = d.n = d1.n + d2.n ;
for (i=0;i<=k;++i) d.a[i] = 0;
for (i=0 ;i<= d1 .n ;++i)
for (j=0 ;j<= d2.n ;++j)
d.a[i+j] += d1 .a[i]*d2.a[j];
return d;
}
double operator^(DT d, double x)
{
double s=0.0 , t=1.0;
for (int i=0 ;i<= d.n ;++i)
{
s += d.a[i]*t;
t *= x;
}
return s;
}
void main()
{
DT p,q,r,s,f;
double x,g;
cout <<"\n Nhap da thuc P '' ;cin >> p;
cout <<"\n Nhap da thuc Q '' ;cin >> q;
cout <<"\n Nhap da thuc R '' ;cin >> r;
cout <<"\n Nhap da thuc S '' ;cin >> s;
cout << "\n Nhap so thuc x: '' ;cin >> x;
f = -(p+q)*(r-s);
g = f^x;
cout << "\n Da thuc f "<< f ;
cout << "\n x = '' << x;
cout << "\n f(x) = '' << g;
}

179

CHNG VIII.

CC DNG NHP/XUT V FILE

Nhp/xut vi cin/cout
nh dng
In ra my in
Lm vic vi File
Nhp/xut nh phn

Trong C++ c sn mt s lp chun cha d liu v cc phng thc phc v cho cc thao tc
nhp/xut d liu ca NSD, thng c gi chung l stream (dng). Trong s cc lp ny, lp c
tn ios l lp c s, cha cc thuc tnh nh dng vic nhp/xut v kim tra li. M rng (k
tha) lp ny c cc lp istream, ostream cung cp thm cc ton t nhp/xut nh >>, << v cc
hm get, getline, read, ignore, put, write, flush Mt lp rng hn c tn iostream l tng hp ca
2 lp trn. Bn lp nhp/xut c bn ny c khai bo trong cc file tiu c tn tng ng (vi
ui *.h). S tha k ca 4 lp trn c th hin qua hnh v di y.

ios

istream

ostream

iostream
i tng ca cc lp trn c gi l cc dng d liu. Mt s i tng thuc lp iostream
c khai bo sn (chun) v c gn vi nhng thit b nhp/xut c nh nh cc i tng cin,
cout, cerr, clog gn vi bn phm (cin) v mn hnh (cout, cerr, clog). iu ny c ngha cc ton
t >>, << v cc hm k trn khi lm vic vi cc i tng ny s cho php NSD nhp d liu
thng qua bn phm hoc xut kt qu thng qua mn hnh.
nhp/xut thng qua cc thit b khc (nh my in, file trn a ), C++ cung cp thm cc lp
ifstream, ofstream, fstream cho php NSD khai bo cc i tng mi gn vi thit b v t
nhp/xut thng qua cc thit b ny.
Trong chng ny, chng ta s xt cc i tng chun cin, cout v mt s ton t, hm nhp xut
c trng ca lp iostream cng nh cch to v s dng cc i tng thuc cc lp ifstream,
ofstream, fstream lm vic vi cc thit b nh my in v file trn a.

VIII.1.

NHP/XUT VI CIN/COUT

Nh nhc trn, cin l dng d liu nhp (i tng) thuc lp istream. Cc thao tc trn i
tng ny gm c cc ton t v hm phc v nhp d liu vo cho bin t bn phm.

180

VIII.1.1.

Ton t nhp >>

Ton t ny cho php nhp d liu t mt dng Input_stream no vo cho mt danh sch cc
bin. C php chung nh sau:
Input_stream >> bin1 >> bin2 >>

trong Input_stream l i tng thuc lp istream. Trng hp Input_stream l cin, cu lnh


nhp s c vit:
cin >> bin1 >> bin2 >>

cu lnh ny cho php nhp d liu t bn phm cho cc bin. Cc bin ny c th thuc cc kiu
chun nh : kiu nguyn, thc, k t, xu k t. Ch 2 c im quan trng ca cu lnh trn.

Lnh s b qua khng gn cc du trng (du cch <>, du Tab, du xung dng ) vo
cho cc bin (k c bin xu k t).

Khi NSD nhp vo dy byte nhiu hn cn thit gn cho cc bin th s byte cn li v


k c du xung dng s nm li trong cin. Cc byte ny s t ng gn cho cc bin
trong ln nhp sau m khng ch NSD g thm d liu vo t bn phm. Do vy cu lnh
cin >> a >> b >> c;

cng c th c vit thnh


cin >> a;
cin >> b;
cin >> c;

v ch cn nhp d liu vo t bn phm mt ln chung cho c 3 lnh (mi d liu nhp cho mi
bin phi cch nhau t nht mt du trng)
V d : Nhp d liu cho cc bin
int a;
float b;
char c;
char *s;
cin >> a >> b >> c >> s;

gi s NSD nhp vo dy d liu : <><>12<>34.517ABC<>12E<>D


khi cc bin s c nhn nhng gi tr c th sau:
a = 12
b = 34.517
c = 'A'
s = "BC"

trong cin s cn li dy d liu : <>12E<>D .


Nu trong on chng trnh tip theo c cu lnh cin >> s; th s s c t ng gn gi tr "12E"
m khng cn NSD nhp thm d liu vo cho cin.
Qua v d trn mt ln na ta nhc li c im ca ton t nhp >> l cc bin ch ly d liu va
cho kiu ca bin (v d bin c ch ly mt k t 'A', b ly gi tr 34.517) hoc cho n khi gp
du trng u tin (v d a ly gi tr 12, s ly gi tr "BC" d trong cin vn cn d liu). T ta
thy ton t >> l khng ph hp khi nhp d liu cho cc xu k t c cha du cch. C++ gii
quyt trng hp ny bng mt s hm (phng thc) nhp khc thay cho ton t >>.

181

VIII.1.2.

Cc hm nhp k t v xu k t

a. Nhp k t

cin.get() : Hm tr li mt k t (k c du cch, du ).. V d:


char ch;
ch = cin.get();

nu nhp AB, ch nhn gi tr 'A', trong cin cn B.


nu nhp A, ch nhn gi tr 'A', trong cin cn .
nu nhp , ch nhn gi tr '', trong cin rng.

cin.get(ch) : Hm nhp k t cho ch v tr li mt tham chiu ti cin. Do hm tr li tham


chiu ti cin nn c th vit cc phng thc nhp ny lin tip trn mt i tng cin. V
d:
char c, d;
cin.get(c).get(d);

nu nhp AB th c nhn gi tr 'A' v d nhn gi tr 'B'. Trong cin cn 'C'.


b. Nhp xu k t

cin.get(s, n, fchar) : Hm nhp cho s dy k t t cin. Dy c tnh t k t u tin


trong cin cho n khi n 1 k t hoc gp k t kt thc fchar. K t kt thc ny
c ngm nh l du xung dng nu b b qua trong danh sch i. Tc c th vit cu
lnh trn di dng cin.get(s, n) khi xu s s nhn dy k t nhp cho n khi n-1 k
t hoc n khi NSD kt thc nhp (bng du ).
Ch :

Lnh s t ng gn du kt thc xu ('\0') vo cho xu s sau khi nhp xong.


Cc lnh c th vit ni nhau, v d: cin.get(s1, n1).get(s2,n2);
K t kt thc fchar (hoc ) vn nm li trong cin. iu ny c th lm tri cc lnh get()
tip theo. V d:
struct Sinhvien {
char *ht;
// h tn
char *qq;
// qu qun
};
void main()
{
int i;
for (i=1; i<=3; i++) {
cout << "Nhap ho ten sv thu " << i; cin.get(sv[i].ht, 25);
cout << "Nhap que quan sv thu "<< i; cin.get(sv[i].qq, 30);
}

Trong on lnh trn sau khi nhp h tn ca sinh vin th 1, do k t vn nm trong b m nn


khi nhp qu qun chng trnh s ly k t ny gn cho qq, do qu qun ca sinh vin s l

182

xu rng.
khc phc tnh trng ny chng ta c th s dng mt trong cc cu lnh nhp k t "nhc"
du enter cn "ri vi" ra khi b m. C th s dng cc cu lnh sau :
// c mt k t trong b m
//c n k t trong b m (vi n=1)

cin.get();
cin.ignore(n);

nh vy on chng trnh trn hot ng tt ta c th t chc li nh sau:


void main()
{
int i;
for (i=1; i<=3; i++) {
cout << "Nhap ho ten sv thu " << i; cin.get(sv[i].ht, 25);
cin.get();
// nhc 1 k t (enter)
cout << "Nhap que quan sv thu "<< i; cin.get(sv[i].qq, 30);
cin.get()
// hoc cin.ignore(1);
}

cin.getline(s, n, fchar): Phng thc ny hot ng hon ton tng t phng thc
cin.get(s, n, fchar), tuy nhin n c th khc phc "li enter" ca cu lnh trn. C th
hm sau khi gn ni dung nhp cho bin s s xa k t enter khi b m v do vy NSD
khng cn phi s dng thm cc cu lnh ph tr (cin.get(), cin.ignore(1)) loi enter ra
khi b m.

cin.ignore(n): Phng thc ny ca i tng cin dng c v loi b n k t cn


trong b m (dng nhp cin).

Ch : Ton t nhp >> cng ging cc phng thc nhp k t v xu k t ch cng li k t


enter trong cin. Do vy, chng ta nn s dng cc phng thc cin.get(), cin.ignore(n) loi b k
t enter trc khi thc hin lnh nhp k t v xu k t khc.
Tng t dng nhp cin, cout l dng d liu xut thuc lp ostream. iu ny c ngha d liu
lm vic vi cc thao tc xut (in) s a kt qu ra cout m c mc nh l mn hnh. Do
ta c th s dng ton t xut << v cc phng thc xut trong cc lp ios (lp c s) v ostream.
VIII.1.3.

Ton t xut <<

Ton t ny cho php xut gi tr ca dy cc biu thc n mt dng Output_stream no vi


c php chung nh sau:
Output_stream << bt_1 << bt_2 <<

y Output_stream l i tng thuc lp ostream. Trng hp Output_stream l cout, cu


lnh xut s c vit:
cout << bt_1 << bt_2 <<

cu lnh ny cho php in kt qu ca cc biu thc ra mn hnh. Kiu d liu ca cc biu thc c
th l s nguyn, thc, k t hoc xu k t.

VIII.2.
NH DNG
Cc gi tr in ra mn hnh c th c trnh by di nhiu dng khc nhau thng qua
183

cc cng c nh dng nh cc phng thc, cc c v cc b phn khc c khai bo sn


trong cc lp ios v ostream.
VIII.2.1.

Cc phng thc nh dng

a. Ch nh rng cn in
cout.width(n) ;

S ct trn mn hnh in mt gi tr c ngm nh bng vi rng thc (s ch s, ch ci v


k t khc trong gi t c in). t li rng mn hnh dnh cho gi tr cn in (thng thng
ln hn rng thc) ta c th s dng phng thc trn.
Phng thc ny cho php cc gi tr in ra mn hnh vi rng n. Nu n b hn rng thc s
ca gi tr th my s in gi tr vi s ct mn hnh bng vi rng thc. Nu n ln hn rng
thc, my s in gi tr cn theo l phi, v trng cc ct tha pha trc gi tr c in. Phng
thc ny ch c tc dng vi gi tr cn in ngay sau n. V d:
int a = 12; b = 345;
cout << a;
cout.width(7);
cout << b;

// rng thc ca a l 2, ca b l 3
// chim 2 ct mn hnh
// t rng gi tr in tip theo l 7
// b in trong 7 ct vi 4 du cch ng trc

Kt qu in ra s l: 12<><><><>345
b. Ch nh k t chn vo khong trng trc gi tr cn in
cout.fill(ch) ;

K t n ngm nh l du cch, c ngha khi rng ca gi tr cn in b hn rng ch nh th


my s n cc du cch vo trc gi tr cn in cho vi rng ch nh. C th yu cu n
mt k t ch bt k thay cho du cch bng phng thc trn. V d trong dy lnh trn, nu ta thm
dng lnh cout.fill('*') trc khi in b chng hn th kt qu in ra s l: 12****345.
Phng thc ny c tc dng vi mi cu lnh in sau n cho n khi gp mt ch nh mi.
c. Ch nh chnh xc (s s l thp phn) cn in
cout.precision(n) ;

Phng thc ny yu cu cc s thc in ra sau s c n ch s l. Cc s thc trc khi in ra s


c lm trn n ch s l th n. Ch nh ny c tc dng cho n khi gp mt ch nh mi. V
d:
int a = 12.3; b = 345.678;
cout << a;
cout.width(10);
cout.precision(2);
cout << b;

// rng thc ca a l 4, ca b l 7
// chim 4 ct mn hnh
// t rng gi tr in tip theo l 10
// t chnh xc n 2 s l
// b in trong 10 ct vi 4 du cch ng trc

Kt qu in ra s l: 12.3<><><><>345.68
2. Cc c nh dng
Mt s cc qui nh v nh dng thng c gn lin vi cc "c". Thng thng nu nh dng
ny c s dng trong sut qu trnh chy chng trnh hoc trong mt khong thi gian di trc
khi g b th ta "bt" cc c tng ng vi n. Cc c c bt s c tc dng cho n khi c vi

184

nh dng khc c bt. Cc c c cho trong file tiu iostream.h.


bt/tt cc c ta s dng cc phng thc sau:
cout.setf(danh sch c);
cout.unsetf(danh sch c);

// Bt cc c trong danh sch


// Tt cc c trong danh sch

Cc c trong danh sch c vit cch nhau bi php ton hp bit (|). V d lnh cout.setf(ios::left
| ios::scientific) s bt cc c ios::left v ios::scientific. Phng thc cout.unsetf(ios::right |
ios::fixed) s tt cc c ios::right | ios::fixed.
Di y l danh sch cc c cho trong iostream.h.
ppppp. Nhm cn l

ios::left : nu bt th gi tr in nm bn tri vng in ra (k t n nm sau).


ios::right : gi tr in nm bn phi vng in ra (k t n nm trc), y l trng hp
ngm nh nu ta khng s dng c c th.
ios::internal : ging c ios::right tuy nhin du ca gi tr in ra s c in u tin, sau
mi n k t n v gi tr s.
V d:
int a = 12.3; b = 345.678;
cout << a;
cout.width(10);
cout.fill('*') ;
cout.precision(2);
cout.setf(ios::left) ;
cout << b;
cout.setf(ios::right) ;
cout << b;
cout.setf(ios::internal) ;
cout << b;

// rng thc ca a l 4, ca b l 8
// chim 4 ct mn hnh
// t rng gi tr in tip theo l 10
// du * lm k t n
// t chnh xc n 2 s l
// bt c ios::left
// kt qa: 12.3345.68***
// bt c ios::right
// kt qa: 12.3***345.68
// bt c ios::internal
// kt qa: 12.3***345.68

d. Nhm nh dng s nguyn

ios::dec : in s nguyn di dng thp phn (ngm nh)


ios::oct : in s nguyn di dng c s 8
ios::hex : in s nguyn di dng c s 16
e. Nhm nh dng s thc

ios::fixed : in s thc dng du phy tnh (ngm nh)


ios::scientific : in s thc dng du phy ng
ios::showpoint : in n ch s l ca phn thp phn, nu tt (ngm nh) th khng in
cc s 0 cui ca phn thp phn.
V d: gi s chnh xc c t vi 3 s l (bi cu lnh cout.precision(3))
nu fixed bt + showpoint bt :
123.2500

c in thnh

123.250

185

123.2599
123.2

c in thnh
c in thnh

123.260
123.200

nu fixed bt + showpoint tt :
123.2500
123.2599
123.2

c in thnh
c in thnh
c in thnh

123.25
123.26
123.2

nu scientific bt + showpoint bt :
12.3
2.32599
324

c in thnh
c in thnh
c in thnh

1.230e+01
2.326e+00
3.240e+02

nu scientific bt + showpoint tt :
12.3
2.32599
324
f.

c in thnh
c in thnh
c in thnh

1.23e+01
2.326e+00
3.24e+02

Nhm nh dng hin th

ios::showpos : nu tt (ngm nh) th khng in du cng (+) trc s dng. Nu bt


trc mi s dng s in thm du cng.
ios::showbase : nu bt s in s 0 trc cc s nguyn h 8 v in 0x trc s h 16.
Nu tt (ngm nh) s khng in 0 v 0x.
ios::uppercase : nu bt th cc k t biu din s trong h 16 (A..F) s vit hoa, nu tt
(ngm nh) s vit thng.
VIII.2.2.

Cc b v hm nh dng

iostream.h cng cung cp mt s b v hm nh dng cho php s dng tin li hn so vi cc c


v cc phng thc v n c th c vit lin tip trn dng lnh xut.
a. Cc b nh dng
dec
oct
hex
endl
flush

// tng t ios::dec
// tng t ios::dec
// tng t ios::hex
// xut k t xung dng ('\n')
// y ton b d liu ra dng xut

V d :
cout.setf(ios::showbase) ;
// cho php in cc k t biu th c s
cout.setf(ios::uppercase) ;
// di dng ch vit hoa
int a = 171; int b = 32 ;
cout << hex << a << endl << b ; // in 0xAB v 0x20
b. Cc hm nh dng (#include <iomanip.h>)
setw(n)
// tng t cout.width(n)
setprecision(n)
// tng t cout.precision(n)
setfill(c)
// tng t cout.fill(c)
setiosflags(l)
// tng t cout.setf(l)

186

resetiosflags(l)

VIII.3.

// tng t cout.unsetf(l)

IN RA MY IN

Nh trong phn u chng trnh by, lm vic vi cc thit b khc vi mn hnh v a


chng ta cn to ra cc i tng (thuc cc lp ifstream, ofstream v fstream) tc cc dng tin
bng cc hm to ca lp v gn chng vi thit b bng cu lnh:
ofstream Tn_dng(thit b) ;

V d to mt i tng mang tn Mayin v gn vi my in, chng ta dng lnh:


ofstream Mayin(4) ;

trong 4 l s hiu ca my in.


Khi mi cu lnh dng ton t xut << v cho ra Mayin s a d liu cn in vo mt b m
mc nh trong b nh. Nu b m y, mt s thng tin a vo trc s t ng chuyn ra my
in. ch ng a tt c d liu cn li trong b m ra my in chng ta cn s dng b nh
dng flush (Mayin << flush << ) hoc phng thc flush (Mayin.flush(); ). V d:
Sau khi khai bo mt i tng mang tn Mayin bng cu lnh nh trn in chu vi v din tch
hnh ch nht c cnh cd v cr ta c th vit:
Mayin << "Din tch HCN = " << cd * cr << endl;
Mayin << "Chu vi HCN = " << 2*(cd + cr) << endl;
Mayin.flush();

hoc :
Mayin << "Din tch HCN = " << cd * cr << endl;
Mayin << "Chu vi HCN = " << 2*(cd + cr) << endl << flush;

khi chng trnh kt thc mi d liu cn li trong cc i tng s c t ng chuyn ra thit b


gn vi n. V d my in s in tt c mi d liu cn st li trong Mayin khi chng trnh kt thc.

VIII.4.

LM VIC VI FILE

Lm vic vi mt file trn a cng c quan nim nh lm vic vi cc thit b khc ca my tnh
(v d nh lm vic vi my in vi i tng Mayin trong phn trn hoc lm vic vi mn hnh
vi i tng chun cout). Cc i tng ny c khai bo thuc lp ifstream hay ofstream ty
thuc ta mun s dng file c hay ghi.
Nh vy, s dng mt file d liu u tin chng ta cn to i tng v gn cho file ny. to
i tng c th s dng cc hm to c sn trong hai lp ifstream v ofstream. i tng s c
gn vi tn file c th trn a ngay trong qu trnh to i tng (to i tng vi tham s l tn
file) hoc cng c th c gn vi tn file sau ny bng cu lnh m file. Sau khi gn mt i
tng vi file trn a, c th s dng i tng nh i vi Mayin hoc cin, cout. iu ny c
ngha trong cc cu lnh in ra mn hnh ch cn thay t kha cout bi tn i tng mi d liu cn
in trong cu lnh s c ghi ln file m i tng i din. Cng tng t nu thay cin bi tn i
tng, d liu s c c vo t file thay cho t bn phm. to i tng dng cho vic ghi ta
khai bo chng vi lp ofstream cn dng cho vic c ta khai bo chng vi lp ifstream.
VIII.4.1.

To i tng gn vi file

Mi lp ifstream v ofstream cung cp 4 phng thc to file. y chng ti ch trnh by 2

187

cch (2 phng thc) hay dng.

+ Cch 1:

<Lp> i_tng;

i_tng.open(tn_file, ch_);
Lp l mt trong hai lp ifstream v ofstream. i tng l tn do NSD t t. Ch l cch thc
lm vic vi file (xem di). Cch ny cho php to trc mt i tng cha gn vi file c th
no. Sau dng tip phng thc open ng thi m file v gn vi i tng va to.
V d:
// to i tng c tn f c hoc
// to i tng c tn f ghi
// m file Baitap v gn vi f

ifstream f;
ofstream f;
f.open("Baitap");

+ Cch 2:

<Lp> i_tng(tn_file, ch_)

Cch ny cho php ng thi m file c th v gn file vi tn i tng trong cu lnh.


V d:
ifstream f("Baitap");
ofstream f("Baitap);

// m file Baitap gn vi i tng f


// c hoc ghi.

Sau khi m file v gn vi i tng f, mi thao tc trn f cng chnh l lm vic vi file Baitap.
Trong cc cu lnh trn c cc ch qui nh cch thc lm vic ca file. Cc ch ny gm
c:

ios::binary : quan nim file theo kiu nh phn. Ngm nh l kiu vn bn.

ios::in : file c (ngm nh vi i tng trong ifstream).

ios::out : file ghi (ngm nh vi i tng trong ofstream), nu file c trn a


th ni dung ca n s b ghi (b xa).ios::app : b sung vo cui file

ios::trunc : xa ni dung file c

ios::ate : chuyn con tr n cui file

ios::nocreate : khng lm g nu file cha c

ios::replace : khng lm g nu file c

c th ch nh cng lc nhiu ch bng cch ghi chng lin tip nhau vi ton t hp bit |. V d
m file bi tp nh mt file nh phn v ghi tip theo vo cui file ta dng cu lnh:
ofstream f("Baitap", ios::binary | ios::app);

VIII.4.2.

ng file v gii phng i tng

ng file c i din bi f, s dng phng thc close nh sau:


i_tng.close();

Sau khi ng file (v gii phng mi lin kt gia i tng v file) c th dng i tng gn
v lm vic vi file khc bng phng thc open nh trn.
V d : c mt dy s t bn phm v ghi ln file. File c xem nh file vn bn (ngm nh), cc
s c ghi cch nhau 1 du cch.
#include <iostream.h>
#include <fstream.h>

188

void main()
{
ofstream f;
int x;
f.open("DAYSO");
for (int i = 1; i<=10; i++) {
cin >> x;
f << x << ' ';
}
f.close();
}

// khai bo (to) i tng f


// m file DAYSO v gn vi f

V d : Chng trnh sau nhp danh sch sinh vin, ghi vo file 1, c ra mng, sp xp theo tui v
in ra file 2. Dng u tin trong file ghi s sinh vin, cc dng tip theo ghi thng tin ca sinh vin
gm h tn vi rng 24 k t, tui vi rng 4 k t v im vi rng 8 k t.
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
#include <cstdlib>
struct Sv {
char *hoten;
int tuoi;
double diem;
};
class Sinhvien {
int sosv ;
Sv *sv;
public:
Sinhvien() {
sosv = 0;
sv = NULL;
}
void nhap();
void sapxep();
void ghifile(char *fname);
void docfile(char *fname);
};
void Sinhvien::nhap()
{
int n;
cout << "\nSo sinh vin: ";
cin >> n;
this->sosv = n;
this->sv = new Sv[n+1];// B phn t th 0
for (int i = 1; i <= n; i++) {
cout << "\nNhp sinh vin th: " << i << endl;

189

cout << "\nH tn: "; cin.ignore(100);


cin.getline(sv[i].hoten, 100);
cout << "\nTui: "; cin >> sv[i].tuoi;
cout << "\nim: "; cin >> sv[i].diem;
}
}
void Sinhvien::ghifile(char *fname)
{
ofstream f(fname) ;
f << sosv;
f << setprecision(1) << setiosflags(ios::showpoint) ;
for (int i=1; i<=sosv; i++) {
f << endl << setw(24) << sv[i].hoten << setw(4) << sv[i].tuoi;
f << setw(8) << sv[i].diem;
}
f.close();
}
void Sinhvien::docfile(char *fname)
{
ifstream f(fname) ;
f >> sosv;
for (int i=1; i<=sosv; i++) {
f.getline(sv[i].hoten, 25);
f >> sv[i].tuoi >> sv[i].diem;
}
f.close();
}
void Sinhvien::sapxep()
{
int n = sosv;
for (int i = 1; i < n; i++)
for (int j = j+1; j <= n; j++)
if (sv[i].tuoi > sv[j].tuoi) {
Sv t = sv[i]; sv[i] = sv[j]; sv[j] = t;
}
}
void main() {
Sinhvien x ;
x.nhap(); x.ghifile("DSSV1");
x.docfile("DSSV1"); x.sapxep(); x.ghifile("DSSV2");
cout << " xong";
}

190

VIII.4.3.

Kim tra s tn ti ca file, kim tra ht file

Vic m mt file cha c c s gy nn li v lm dng chng trnh. Khi xy ra li m file,


gi tr tr li ca phng thc bad l mt s khc 0. Do vy c th s dng phng thc ny
kim tra mt file c trn a hay cha. V d:
ifstream f("Bai tap");
if (f.bad()) {
cout << "file Baitap cha c";
exit(1);
}

Khi c hoc ghi, con tr file s chuyn dn v cui file. Khi con tr cui file, phng thc eof()
s tr li gi tr khc khng. Do c th s dng phng thc ny kim tra ht file hay cha.
Chng trnh sau cho php tnh di ca file Baitap. File cn c m theo kiu nh phn.
#include <iostream.h>
#include <fstream.h>
#include <cstdlib>
void main()
{
clrscr();
long dodai = 0;
char ch;
ifstream f("Baitap", ios::in | ios::binary) ;
if (f.bad()) {
cout << "File Baitap khng c";
exit(1);
}
while (!f.eof()) {
f.get(ch));
dodai++;
}
cout << " di ca file = " << dodai;
}

VIII.4.4.

c ghi ng thi trn file

c ghi ng thi, file phi c gn vi i tng ca lp fstream l lp tha k ca 2 lp


ifstream v ofstream. Khi ch phi c bao gm ch nh ios::in | ios::out. V d:
fstream f("Data", ios::in | ios::out) ;

hoc
fstream f ;
f.open("Data", ios::in | ios::out) ;

VIII.4.5.

Di chuyn con tr file

Cc phng thc sau cho php lm vic trn i tng ca dng xut (ofstream).
i_tng.seekp(n) ; Di chuyn con tr n byte th n (cc byte c tnh t 0)

191

i_tng.seekp(n, v tr xut pht) ; Di chuyn i n byte (c th m hoc dng) t v


tr xut pht. V tr xut pht gm:

ios::beg : t u file

ios::end : t cui file

ios::cur : t v tr hin ti ca con tr.

i_tng.tellp(n) ; Cho bit v tr hin ti ca con tr.


lm vic vi dng nhp tn cc phng thc trn c thay tng ng bi cc tn : seekg v
tellg. i vi cc dng nhp ln xut c th s dng c c 6 phng thc trn.
V d sau tnh di tp tin n gin hn v d trn.
fstream f("Baitap");
f.seekg(0, ios::end);
cout << " di bng = " << f.tellg();

V d : Chng trnh nhp v in danh sch sinh vin trn ghi/c ng thi.
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
#include <cstdlib>
void main() {
int stt ;
char *hoten, *fname, traloi;
int tuoi;
float diem;
fstream f;
cout << "Nhp tn file: "; cin >> fname;
f.open(fname, ios::in | ios::out | ios::noreplace) ;
if (f.bad()) {
cout << "Tp tin c. Ghi (C/K)?" ;
cin.get(traloi) ;
if (toupper(traloi) == 'C') {
f.close() ;
f.open(fname, ios::in | ios::out | ios::trunc) ;
} else exit(1);
}
stt = 0;
f << setprecision(1) << setiosflags(ios::showpoint) ;
// nhp danh sch
while (1) {
stt++;
cout << "\nNhp sinh vin th " << stt ;
cout << "\nH tn: "; cin.ignore() ; cin.getline(hoten, 25);
if (hoten[0] = 0) break;
cout << "\nTui: "; cin >> tuoi;
cout << "\nim: "; cin >> diem;
f << setw(24) << hoten << endl;

192

f << setw(4) << tuoi << setw(8) << diem ;


}
// in danh sch
f.seekg(0) ;
// quay v u danh sch
stt = 0;
cout << "Danh sch sinh vin nhp\n" ;
cout << setprecision(1) << setiosflags(ios::showpoint) ;
while (1) {
f.getline(hoten,25);
if (f.eof()) break;
stt++;
f >> tuoi >> diem;
f.ignore();
cout << "\nSinh vin th " << stt ;
cout << "\nH tn: " << hoten;
cout << "\nTui: " << setw(4) << tuoi;
cout << "\nim: " << setw(8) << diem;
}
f.close();
}

VIII.5.

NHP/XUT NH PHN

VIII.5.1.

Khi nim v 2 loi file: vn bn v nh phn

a. File vn bn

Trong file vn bn mi byte c xem l mt k t. Tuy nhin nu 2 byte 10 (LF), 13


(CR) i lin nhau th c xem l mt k t v n l k t xung dng. Nh vy file vn bn
l mt tp hp cc dng k t vi k t xung dng c m l 10. K t c m 26 c xem l
k t kt thc file.
b. File nh phn

Thng tin lu trong file c xem nh dy byte bnh thng. M kt thc file c chn l -1, c
nh ngha l EOF trong stdio.h. Cc thao tc trn file nh phn thng c ghi tng byte mt,
khng quan tm ngha ca byte.
Mt s cc thao tc nhp/xut s c hiu qu khc nhau khi m file di cc dng khc nhau.
V d : gi s ch = 10, khi f << ch s ghi 2 byte 10,13 ln file vn bn f, trong khi lnh ny
ch khi 1 byte 10 ln file nh phn.
Ngc li, nu f la file vn bn th f.getc(ch) s tr v ch 1 byte 10 khi c c 2 byte 10, 13 lin
tip nhau.
Mt file lun ngm nh di dng vn bn, do vy ch nh file l nh phn ta cn s dng c
ios::binary.

193

VIII.5.2.

c, ghi k t

put(c);

// ghi k t ra file

get(c);

// c k t t file

V d : Sao chp file 1 sang file 2. Cn sao chp v ghi tng byte mt do vy chnh xc ta s m
cc file di dng nh phn.
#include <iostream.h>
#include <fstream.h>
#include <cstdlib>
void main()
{
clrscr();
fstream fnguon("DATA1", ios::in | ios::binary);
fstream fdich("DATA2", ios::out | ios::binary);
char ch;
while (!fnguon.eof()) {
fnguon.get(ch);
fdich.put(ch);
}
fnguon.close();
fdich.close();
}

VIII.5.3.

c, ghi dy k t

write(char *buf, int n);

// ghi n k t trong buf ra dng xut

read(char *buf, int n);

// nhp n k t t buf vo dng nhp

gcount();

// cho bit s k t read c c

V d : Chng trnh sao chp file trn c th s dng cc phng thc mi ny nh sau:
#include <iostream.h>
#include <fstream.h>
#include <cstdlib>
void main()
{
fstream fnguon("DATA1", ios::in | ios::binary);
fstream fdich("DATA2", ios::out | ios::binary);
char buf[2000] ;
int n = 2000;
while (n) {
fnguon.read(buf, 2000);
n = fnguon.gcount();
fdich.write(buf, n);
}
fnguon.close();
fdich.close();
}

194

BI TP
147. Vit chng trnh m s dng ca mt file vn bn.
148. Vit chng trnh c in tng k t ca file vn bn ra mn hnh, mi mn hnh 20 dng.
149. Vit chng trnh tm xu di nht trong mt file vn bn.
150. Vit chng trnh ghp mt file vn bn th hai vo file vn bn th nht, trong tt c ch
ci ca file vn bn th nht phi i thnh ch in hoa.
151. Vit chng trnh in ni dung file ra mn hnh v cho bit tng s ch ci, tng s ch s
xut hin trong file.
152. Cho 2 file s thc ( c sp tng dn). In ra mn hnh dy s xp tng dn ca c 2 file.
(Cn to c 2 file d liu ny bng Editor ca C++).
153. Vit hm nhp 10 s thc t bn phm vo file INPUT.DAT. Vit hm c cc s thc t file
trn v in tng bnh phng ca chng ra mn hnh.
154. Vit hm nhp 10 s nguyn t bn phm vo file vn bn tn INPUT.DAT. Vit hm c cc
s nguyn t file trn v ghi nhng s chn vo file EVEN.DAT cn cc s l vo file
ODD.DAT.
155. Nhp bng chng trnh 2 ma trn s nguyn vo 2 file vn bn. Hy to file vn bn th 3
cha ni dung ca ma trn tch ca 2 ma trn trn.
156. T chc qun l file sinh vin (H tn, ngy sinh, gii tnh, im) vi cc chc nng : Nhp,
xem, xa, sa, tnh im trung chung.
157. Thng tin v mt nhn vin trong c quan bao gm : h v tn, ngh nghip, s in thoi, a
ch nh ring. Vit hm nhp t bn phm thng tin ca 7 nhn vin v ghi vo file
INPUT.DAT. Vit hm tm trong file INPUT.DAT v in ra thng tin ca 1 nhn vin theo s
in thoi c nhp t bn phm.

195

TI LIU THAM KHO


[1]. Phm Vn t, Lp trnh C, NXB KHKT 2001.
[2]. Phm Vn t, Lp trnh hng i tng vi C++, NXB KHKT 2003.
[3]. Gio trnh l thuyt C++ ca cc trng i hc
[4]. Slide bi ging C++ ca cc trng i hc.
[5]. http://cplusplus.com
[6]. http://creference.com
[7]. MSDN 2001

196

You might also like