Professional Documents
Culture Documents
C++ PH M H NG Thái PDF
C++ PH M H NG Thái PDF
Bi ging
NGN NG LP TRNH C/C++
H Ni 2003
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
Basic, Visual Foxpro
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 FORTRAN, Pascal Tp
bi ging ny c vit ra vi mc ch , trang b kin thc v k nng thc hnh
cho sinh vin bt u hc vo NNLT C/C++ ti Khoa Cng ngh, i hc Quc gia
H Ni. ph hp vi chng trnh, tp bi ging ny ch cp mt phn nh
n k thut lp trnh hng i tng trong C++, l cc k thut ng gi d
liu, phng thc v nh ngha mi cc ton t. Tn gi ca tp bi ging ny ni
ln iu , c ngha ni dung ca bi ging thc cht l NNLT C c m rng
vi mt s c im mi ca 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 tp bi
ging ny tn gi C/C++ s c chng ti thay bng C++.
Ni dung tp bi ging ny gm 8 chng. Phn u gm cc chng t 1 n
6 ch yu trnh by v NNLT C++ trn nn tng ca k thut lp trnh cu trc. Cc
chng cn li (chng 7 v 8) s trnh by cc cu trc c bn trong C++ l k
thut ng gi (lp v i tng) v nh ngha php ton mi cho lp.
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
bi ging ngy cng mt hon thin hn.
Tc gi.
Chng 1. Cc khi nim c bn ca C++
CHNG 1
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. 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.
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.
1
Chng 1. Cc khi nim c bn ca C++
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.
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 1 :
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: ha_noi, Ha_noi, HA_Noi, HA_NOI, ...
2
Chng 1. Cc khi nim c bn ca C++
3
Chng 1. Cc khi nim c bn ca C++
tr nhp nhy trong khung ca s v chng ta bt u nhp ni dung (vn bn) chng
trnh vo trong khung ca s son tho ny. Mc ch ca gio trnh ny l trang b
nhng kin thc c bn ca lp trnh thng qua NNLT C++ cho cc sinh vin mi bt
u nn chng ti vn chn trnh by giao din ca cc trnh bin dch quen thuc l
Turbo C hoc Borland C. V cc trnh bin dch khc c gi c th t tham kho trong
cc ti liu lin quan.
kt thc lm vic vi C++ (son tho, chy chng trnh ...) v quay v mi
trng Windows chng ta n Alt-X.
a. M t chung
Khi gi chy C++ trn mn hnh s xut hin mt menu x xung v mt ca s
son tho. Trn menu gm c cc nhm chc nng: File, Edit, Search, Run, Compile,
Debug, Project, Options, Window, Help. kch hot cc nhm chc nng, c th
n Alt+ch ci biu th cho menu ca chc nng (l ch ci c gch di). V d
m nhm chc nng File n Alt+F, sau dch chuyn hp sng n mc cn chn ri
n Enter. thun tin cho NSD, mt s cc chc nng hay dng cn c gn vi
mt t hp cc phm cho php ngi dng c th chn nhanh chc nng ny m khng
cn thng qua vic m menu nh m t trn. Mt s t hp phm c th s
c trnh by vo cui phn ny. Cc b chng trnh dch h tr ngi lp trnh mt
mi trng tch hp tc ngoi chc nng son tho, n cn cung cp nhiu chc nng,
tin ch khc gip ngi lp trnh va c th son tho vn bn chng trnh va gi
chy chng trnh va g li
Cc chc nng lin quan n son tho phn ln ging vi cc b son tho khc
(nh WinWord) do vy chng ti ch trnh by tm tt m khng trnh by chi tit
y.
4
Chng 1. Cc khi nim c bn ca C++
5
Chng 1. Cc khi nim c bn ca C++
vo tn tp c th.
Ghi tp ang son tho ln a vi tn mi: Chn menu File\Save As v nhp
tn tp mi vo ri n Enter.
6
Chng 1. Cc khi nim c bn ca C++
7
Chng 1. Cc khi nim c bn ca C++
8
Chng 1. Cc khi nim c bn ca C++
9
Chng 1. Cc khi nim c bn ca C++
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.
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 ;
10
Chng 1. Cc khi nim c bn ca C++
11
Chng 1. Cc khi nim c bn ca C++
12
Chng 1. Cc khi nim c bn ca C++
13
Chng 1. Cc khi nim c bn ca C++
CHI TIU
========
Sch v 123.46
Thc n 2453.60
Qun o lnh 3200.00
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
14
Chng 1. Cc khi nim c bn ca C++
a. 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:
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.
15
Chng 1. Cc khi nim c bn ca C++
16
Chng 1. Cc khi nim c bn ca C++
V d 5 :
#include <stdio.h> // s dng cc hm printf() v scanf()
#include <conio.h> // s dng cc hm clrscr() v getch()
void main()
{
clrscr(); // xo mn hnh
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)
return ; // kt thc thc hin hm main()
}
BI TP
1. Nhng tn gi no sau y l hp l:
x 123variabe tin_hoc toan tin so-dem
RADIUS one.0 number# Radius nam2000
2. Bn hy th vit mt chng trnh ngn nht c th c.
3. Tm cc li c php trong chng trnh sau:
17
Chng 1. Cc khi nim c bn ca C++
#include (iostream.h)
void main(); / Gii phng trnh bc 1
{
cout << 'Day la chng trnh: Gptb1.\nXin chao cac ban';
getch();
}
4. Vit chng trnh in ni dung mt bi th no .
5. Vit chng trnh in ra 4 dng, 2 ct gm cc s sau v ging ct:
thng theo l tri 0.63 64.1
thng theo l phi 12.78 -11.678
thng theo du chm thp phn -124. 6 59.002
65.7 -1200.654
6. Hy vit v chy cc chng trnh trong cc v d 3, 5.
7. 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 5 ch ci nhp l 'H', 'A', 'N', 'O', 'I' v nam
c nhap l 2000, th mn hnh in ra dng ch: HANOI nm 2000.
Nhp chng trnh sa vo my v chy kim tra kt qu.
#include <iostream.h>
#include <conio.h>
main()
{
int nam;
char a, b, c, d, e;
clrscr();
cin >> nam ;
;
cin.get(a); cin.get(b); cin.get(c); ; ;
18
Chng 1. Cc khi nim c bn ca C++
// in kt qu
cout << a << << << << << " nam " << ;
getch();
}
19
Chng 2. Kiu d liu, biu thc v cu lnh
CHNG 2
20
Chng 2. Kiu d liu, biu thc v cu lnh
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
21
Chng 2. Kiu d liu, biu thc v cu lnh
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, ...
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
22
Chng 2. Kiu d liu, biu thc v cu lnh
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.
23
Chng 2. Kiu d liu, biu thc v cu lnh
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.
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.
3. Hng k t
24
Chng 2. Kiu d liu, biu thc v cu lnh
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
25
Chng 2. Kiu d liu, biu thc v cu lnh
"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
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 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:
26
Chng 2. Kiu d liu, biu thc v cu lnh
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 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 (=).
27
Chng 2. Kiu d liu, biu thc v cu lnh
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 ; // khai bo 2 bin i, j c kiu nguyn
float x ; // khai bo bin thc x
char c, d[100] ; // bin k t c, xu d cha ti a 100 k t
unsigned int u ; // 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"
}
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
28
Chng 2. Kiu d liu, biu thc v cu lnh
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:
29
Chng 2. Kiu d liu, biu thc v cu lnh
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.
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
30
Chng 2. Kiu d liu, biu thc v cu lnh
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.
31
Chng 2. Kiu d liu, biu thc v cu lnh
a b a && b a || b !a
1 1 1 1 0
1 0 0 1 0
0 1 0 1 1
0 0 0 0 1
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) // = 0 v c hng thc (4>5) sai
(3 >= 1) && (7) // = 1 v c hai hng thc cng ng
!1 // = 0
! (4 + 3 < 7) // = 1 v (4+3<7) bng 0
5 || (4 >= 6) // = 1 v c mt hng thc (5) ng
(5 < !0) || (4 >= 6) // = 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 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) cho kt qu x = 0 , i = 3 , j = 4
32
Chng 2. Kiu d liu, biu thc v cu lnh
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 = 20 v 3+4<7 l sai
x = (3 + 4) ? 10: 20 // x = 10 v 3+4 khc 0, tc iu kin ng
x = (a > b) ? a: b // 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;
33
Chng 2. Kiu d liu, biu thc v cu lnh
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) ;
34
Chng 2. Kiu d liu, biu thc v cu lnh
35
Chng 2. Kiu d liu, biu thc v cu lnh
36
Chng 2. Kiu d liu, biu thc v cu lnh
37
Chng 2. Kiu d liu, biu thc v cu lnh
V. 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 math.h.
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.
2. Cc hm lng gic
sin(x), cos(x), tan(x) : tr li cc gi tr sinx, cosx, tgx.
BI TP
38
Chng 2. Kiu d liu, biu thc v cu lnh
39
Chng 2. Kiu d liu, biu thc v cu lnh
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 ; S = p( p a )( p b )( p c ) ;
2S 1 2
ha = ; ma = 2b 2 + 2c 2 a 2 ; ga = bcp( p a ) ;
a 2 b+c
S abc
r= ; R= ;
p 4S
14. Tnh din tch v th tch ca hnh cu bn knh R theo cng thc:
S = 4R2 ; V = RS/3
15. 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).
16. 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).
17. 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.
18. 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 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).
19. 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.
20. 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.
40
Chng 3. Cu trc iu khin v d liu kiu mng
CHNG 3
Cu trc r nhnh
Cu trc lp
Mng d liu
Mng hai chiu
I. 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.
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
41
Chng 3. Cu trc iu khin v d liu kiu mng
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
if (n>0) { if (a>b) c = a; else c = b;}
d. V d minh ho
V d 1 : 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 2 : 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 3 : Gii phng trnh bc 2. Cho phng trnh ax2 + bx + c = 0 (a 0), tm x.
42
Chng 3. Cu trc iu khin v d liu kiu mng
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
43
Chng 3. Cu trc iu khin v d liu kiu mng
d. V d minh ho
V d 1 : In s ngy ca mt thng bt k no c nhp t bn phm.
int th;
cout << Cho bit thng cn tnh: ; cin >> th ;
switch (th)
44
Chng 3. Cu trc iu khin v d liu kiu mng
{
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 2 : 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
45
Chng 3. Cu trc iu khin v d liu kiu mng
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, 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 3 : 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:
46
Chng 3. Cu trc iu khin v d liu kiu mng
4 2 88 m chn, b qua
5 1 176 m l, cng thm 176 vo kq = 55 + 176 = 231
6 0 m = 0, dng cho kt qu kq = 231
II. 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 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.
1. Lnh lp for
47
Chng 3. Cu trc iu khin v d liu kiu mng
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.
c. V d minh ho
V d 1 : 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,
iu kin lp: m. y iu kin l ng nu m 0 v sai nu m = 0.
48
Chng 3. Cu trc iu khin v d liu kiu mng
49
Chng 3. Cu trc iu khin v d liu kiu mng
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; }
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.
50
Chng 3. Cu trc iu khin v d liu kiu mng
51
Chng 3. Cu trc iu khin v d liu kiu mng
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 1 : Nhn 2 s nguyn theo phng php n
void main()
{
52
Chng 3. Cu trc iu khin v d liu kiu mng
53
Chng 3. Cu trc iu khin v d liu kiu mng
{
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 3 : 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 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 4 : 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)
54
Chng 3. Cu trc iu khin v d liu kiu mng
55
Chng 3. Cu trc iu khin v d liu kiu mng
mu math.h.
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
2 1 1 1 1
V d 1 : Tnh xp x s pi theo cng thc Euler = 2 + 2 + 2 + ... + 2 , vi
6 1 2 3 n
1
2
<10 6 .
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 ;
}
56
Chng 3. Cu trc iu khin v d liu kiu mng
57
Chng 3. Cu trc iu khin v d liu kiu mng
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 1 : 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
.
.
.
}
}
( 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.)
58
Chng 3. Cu trc iu khin v d liu kiu mng
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
59
Chng 3. Cu trc iu khin v d liu kiu mng
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
60
Chng 3. Cu trc iu khin v d liu kiu mng
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:
61
Chng 3. Cu trc iu khin v d liu kiu mng
d. V d minh ho
V d 1 : 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] ;
}
62
Chng 3. Cu trc iu khin v d liu kiu mng
63
Chng 3. Cu trc iu khin v d liu kiu mng
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 1 2 3 4 5 6 7
H E L L O \0
H E L \0 L O \0
\0 H E L L O \0
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
64
Chng 3. Cu trc iu khin v d liu kiu mng
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
.
Truy cp mt k t trong xu: c php ging nh mng. V d:
char s[50] = "I\'m a student" ; // ch k t ' phi c vit l \'
cout << s[0] ; // in k t u tin, tc k t 'I'
s[1] = 'a' ; // t li k t th 2 l 'a'
Khng c thc hin cc php ton trc tip trn xu nh:
char s[20] = "Hello", t[20] ; // khai bo hai xu s v t
t = "Hello" ; // sai, ch gn c khi khai bo
t=s; // sai, khng gn c ton b mng
if (s < t) // 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.
65
Chng 3. Cu trc iu khin v d liu kiu mng
66
Chng 3. Cu trc iu khin v d liu kiu mng
d. Mt s hm x l xu (#include <string.h>)
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" ; // khng c dng
s=t; // khng c dng
strcpy(t, "Face") ; // c, gn "Face" cho t
strcpy(s, t) ; // c, sao chp t sang s
cout << s << " to " << t ; // 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) ; // copy 5 k t "Steve" vo s
s[5] = '\0' ; // t du kt thc xu
// in cu: Steve is young brother of Steven
cout << s << " is young brother of " << t ;
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
67
Chng 3. Cu trc iu khin v d liu kiu mng
68
Chng 3. Cu trc iu khin v d liu kiu mng
69
Chng 3. Cu trc iu khin v d liu kiu mng
strlen(s) ;
Hm tr gi tr l di ca xu s.
V d:
char s[10] = "Ha Noi" ;
cout << strlen(s) ; // 5
70
Chng 3. Cu trc iu khin v d liu kiu mng
V d 5 : Chy dng ch qung co vng trn t phi sang tri gia mn hnh.
Gi s hin 30 k t ca xu qung co. Ta s dng vng lp. Ct 30 k t u
tin ca xu cho vo bin hien, hin bin ny ra mn hnh. Bc lp tip theo ct ra 30
k t ca xu nhng dch sang phi 1 k t cho vo bin hien v hin ra mn hnh. Qu
trnh tip tc, mi bc lp ta dch chuyn ni dung cn hin ra mn hnh 1 k t, do
hiu ng ca mt ta thy dng ch s chy t bin phi v bin tri ca mn hnh.
qu trnh chy theo vng trn (khi hin n k t cui ca xu s hin quay li t k t
u ca xu) chng trnh s dng bin i nh du im u ca xu con cn ct cho
vo hien, khi i bng di ca xu chng trnh t li i = 0 (ct li t u xu). Ngoi
ra, phn cui xu ni vi phn u (to thnh vng trn) ngay t u chng trnh,
xu qung co s c ni thnh gp i.
Vng lp tip tc n khi no NSD n phm bt k (chng trnh nhn bit iu
ny nh vo hm kbhit() thuc file nguyn mu conio.h) th dng. dng ch chy
71
Chng 3. Cu trc iu khin v d liu kiu mng
khng qu nhanh chng trnh s dng hm tr delay(n) (thuc dos.h, tm dng trong
n phn nghn giy) vi n c iu chnh thch hp theo tc ca my. Hm
gotoxy(x, y) (thuc conio.h) trong chng trnh t con tr mn hnh ti v tr ct x
dng y m bo dng ch lun lun hin ra ti ng mt v tr trn mn hnh.
#include <iostream.h>
#include <conio.h>
#include <dos.h>
main()
{
char qc[100] = "Qung co min ph: Khng c tin th khng c kem. ";
int dd = strlen(qc);
char tam[100] ; strcpy(tam, qc) ;
strcat(qc, tam) ; // nhn i dng qung co
clrscr(); // xo mn hnh
char hien[31] ; // cha xu di 30 k t hin
i = 0;
while (!kbhit()) { // trong khi cha n phm bt k
strncpy(hien, s+i, 30);
hien[30] = '\0'; // copy 30 k t t qc[i] sang hien
gotoxy(20,10); cout << hien ; // in hien ti dng 10 cot 20
delay(100); // tm dng 1/10 giy
i++; if (i==dd) i = 0; // tng i
}
}
V d 6 : Nhp mt khu (khng qu 10 k t). In ra "ng" nu l "HaNoi2000", "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 "HaNoi2000", nu ng chng
trnh tip tuc, nu sai tng s ln nhp (cho php khng qu 3 ln).
#include <iostream.h>
#include <conio.h>
72
Chng 3. Cu trc iu khin v d liu kiu mng
#include <string.h>
void main()
{
char pw[11]; int solan = 0; // Cho phep nhap 3 lan
do {
clrscr(); gotoxy(30,12) ;
int i = 0;
while ((pw[i]=getch()) != 13 && ++i < 10) cout << 'X' ; // 13 = Enter
pw[i] = '\0' ;
cout << endl ;
if (!strcmp(pw, "HaNoi2000")) { cout << "Mi vo" ; break; }
else { cout << "Sai mt khu. Nhp li") ; solan++ ; }
} while (solan < 3);
}
0 1 2 3
0
1
2
Hnh trn minh ho hnh thc mt mng hai chiu vi 3 dng, 4 ct. Thc cht
73
Chng 3. Cu trc iu khin v d liu kiu mng
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
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 2 3 4
3 2 1 4
0 1 1 0
trong : A[0][0] = 1, A[0][1] = 2, A[1][0] = 3, A[2][3] = 0
74
Chng 3. Cu trc iu khin v d liu kiu mng
c. V d minh ho
V d 1 : Nhp, in v tm phn t ln nht ca mt ma trn.
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
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
clrscr(); 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] ;
}
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])
75
Chng 3. Cu trc iu khin v d liu kiu mng
{
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 << ")" ;
getch();
}
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 2 : 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>
#include <conio.h>
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
76
Chng 3. Cu trc iu khin v d liu kiu mng
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] ;
}
// 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] ;
}
getch();
}
77
Chng 3. Cu trc iu khin v d liu kiu mng
BI TP
Lnh r nhnh
1. Nhp mt k t. Cho bit k t c phi l ch ci hay khng.
2. Nhp vo mt s nguyn. Tr li s nguyn : m hay dng, chn hay l ?
3. 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;
4. Tnh gi tr hm
3x + x , x>0
a. f(x) = x
e +4 , x0
x 2 +1 , x 1
b. f ( x ) = 3x + 5 , 1< x <1
2
x + 2 x 1 , x 1
ax + by = c
5. Vit chng trnh gii h phng trnh bc nht 2 n:
dx + ey = f
6. Nhp 2 s a, b. In ra max, min ca 2 s . M rng vi 3 s, 4 s ?
7. 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 ?
8. Nhp vo mt s, in ra th tng ng vi s (qui c 2 l th hai, , 8 l ch
nht).
9. Nhp 2 s biu th thng v nm. In ra s ngy ca thng nm (c kim tra nm
nhun).
10. Ly ngy thng hin ti lm chun. Hy nhp mt ngy bt k trong thng. Cho
bit th ca ngy va nhp ?
Lnh lp
78
Chng 3. Cu trc iu khin v d liu kiu mng
11. Gi tr ca i bng bao nhiu sau khi thc hin cu trc for sau:
for (i = 0; i < 100; i++);
12. Gi tr ca x bng bao nhiu sau khi thc hin cu trc for sau:
for (x = 2; i < 10; x+=3) ;
13. Bn b sung g vo lnh for sau:
for ( ; nam < 1997 ; ) ;
khi kt thc nam c gi tr 2000.
14. 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;
15. 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).
16. Nhp s nguyn dng N. Tnh:
1 + 2 + 3 + ... + N
a. S1 =
N
b. S 2 = 12 + 2 2 + 3 2 + ... + N 2
17. Nhp s nguyn dng n. Tnh:
a. S1 = 3 + 3 + 3 + ... + 3 n du cn
1
b. S 2 = n du chia
1
2+
1
2+
1
2+. . .
2
18. Nhp s t nhin n. In ra mn hnh biu din ca n dng nh phn.
19. 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).
20. 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.
21. 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.
79
Chng 3. Cu trc iu khin v d liu kiu mng
x3 x5 x 2 n +1 x 2 n +1
c. sin x = x + + . . . + ( 1 ) n
, dng lp khi < 10 6 .
3! 5! ( 2n + 1 )! ( 2n + 1 )!
a n=0
d. a ( a > 0 ) theo cng thc: s n = 2 , dng khi
( s
n 1 + a ) / 2 s n 1 n > 0
6
s n s n 1 <10 .
25. In ra m ca phm bt k c nhn. Chng trnh lp cho n khi nhn ESC
thot.
26. Bng phng php chia i, hy tm nghim xp x ( chnh xc 106) ca cc
phng trnh sau:
a. ex 1.5 = 0, trn on [0, 1].
b. x2x 1 = 0, trn on [0, 1].
c. 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
27. 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
80
Chng 3. Cu trc iu khin v d liu kiu mng
ca dy.
28. Tm v ch ra v tr xut hin u tin ca phn t x trong dy.
29. Nhp vo dy n s. Hy in ra s ln nht, b nht ca dy.
30. Nhp vo dy s. In ra dy c sp xp tng dn, gim dn.
31. Cho dy c sp tng dn. Chn thm vo dy phn t x sao cho dy vn sp
xp tng dn.
32. Hy nhp vo 16 s nguyn. In ra thnh 4 dng, 4 ct.
33. Nhp ma trn A v in ra ma trn i xng ca n.
34. 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.
35. 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.
36. Nhp 2 ma trn vung cp n A v B. Tnh A + B, A B, A * B v A2 - B2.
Xu k t
37. Hy nhp mt xu k t. In ra mn hnh o ngc ca xu .
38. Nhp xu. Thng k s cc ch s '0', s ch s '1', , s ch s '9' trong xu.
39. In ra v tr k t trng u tin t bn tri (phi) mt xu k t.
40. Nhp xu. In ra tt cc cc v tr ca ch 'a' trong xu v tng s ln xut hin ca
n.
41. Nhp xu. Tnh s t c trong xu. In mi dng mt t.
81
Chng 3. Cu trc iu khin v d liu kiu mng
82
Chng 4. Hm v chng trnh
CHNG 4
HM V CHNG TRNH
Con tr v s hc a ch
Hm
qui
T chc chng trnh
I. CON TR V S HC A CH
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.
83
Chng 4. Hm v chng trnh
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.
84
Chng 4. Hm v chng trnh
85
Chng 4. Hm v chng trnh
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 2 :
int i = 10 ; // khai bo v khi to bin i = 10
int *p, *q, *r ; // khai bo 3 con tr nguyn p, q, r
p = q = r = &i ; // cng tr ti i
*p = q**q + 2**r + 1 ; // i = 10*10 + 2*10 + 1
cout << i ; // 121
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 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.
86
Chng 4. Hm v chng trnh
V d 3 :
int a[100] = { 1, 2, 3, 4, 5, 6, 7 }, *p, *q;
p = a; cout << *p ; // cho p tr n mng a, *p = a[0] = 1
p += 5; cout << *p ; // *p = a[5] = 6 ;
q = p - 4 ; cout << *q ; // q = a[1] = 2 ;
for (int i=0; i<100; i++) cout << *(p+i) ; // in ton b mng a
87
Chng 4. Hm v chng trnh
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).
88
Chng 4. Hm v chng trnh
89
Chng 4. Hm v chng trnh
5. Con tr v mng, xu k t
90
Chng 4. Hm v chng trnh
a[i] = *(a+i).
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 1 : 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
hoc:
2: for (p=a; p<=a+4; p++) cout << *p ; // thay i p
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 ;
91
Chng 4. Hm v chng trnh
a 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 kiu ca a v con tr float (cng l kiu ca p)
p = a[0]; // gn vi a ch ca mng a[0]
p = &a[0][0]; // gn vi a ch s thc u tin trong a
92
Chng 4. Hm v chng trnh
93
Chng 4. Hm v chng trnh
}
getch();
}
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.
6. Mng con tr
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 1 : Nhp vo v in ra mt bi th.
main()
{
clrscr();
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++)
94
Chng 4. Hm v chng trnh
{
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
getch();
}
II. 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.
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
95
Chng 4. Hm v chng trnh
b. nh ngha hm
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
96
Chng 4. Hm v chng trnh
97
Chng 4. Hm v chng trnh
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.
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
98
Chng 4. Hm v chng trnh
99
Chng 4. Hm v chng trnh
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. 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 5 :
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
100
Chng 4. Hm v chng trnh
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 vi cng 1 tn gi v d l max chng hn. Khi ta c 5 hm:
1: int max(int a, int b) { return (a > b) ? a: b ; }
2: float max(float a, float b) { return (a > b) ? a: b ; }
3: char max(char a, char b) { return (a > b) ? a: b ; }
4: long max(long a, long b) { return (a > b) ? a: b ; }
101
Chng 4. Hm v chng trnh
102
Chng 4. Hm v chng trnh
<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.
V d:
int hung, dung ; // khai bo cc bin nguyn hung, dung
int &ti = hung; // khai bo bin tham chiu ti, teo tham chieu n
int &teo = dung; // 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 ++; // tng ng hung ++;
cout << hung << ti ; // 3 3
teo = ti + hung ; // tng ng dung = hung + hung
dung ++ ; // tng ng teo ++
cout << dung << 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.
103
Chng 4. Hm v chng trnh
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.
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.
104
Chng 4. Hm v chng trnh
t x' y'
2 2 5 Cc bin tm b
2 5 5 xo khi chy
xong hm
2 5 2
105
Chng 4. Hm v chng trnh
106
Chng 4. Hm v chng trnh
107
Chng 4. Hm v chng trnh
108
Chng 4. Hm v chng trnh
7. Hm v mng d liu
109
Chng 4. Hm v chng trnh
int i;
for (i=0; i<n; i++) cout << *(p+i);
}
main()
{
int a[10] ; // mng a cha ti a 10 phn t
nhap(a,7); // vo 7 phn t u tin cho a
in(a,3); // ra 3 phn t u tin ca a
}
110
Chng 4. Hm v chng trnh
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 10 : Tm phn t b nht ca ma trn
void minmt(float *x, int m, int n) // m: s dng, n: s ct
{
111
Chng 4. Hm v chng trnh
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
}
V d 11 : 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;
}
}
112
Chng 4. Hm v chng trnh
{
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);
}
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
113
Chng 4. Hm v chng trnh
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
114
Chng 4. Hm v chng trnh
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) // n s phn t ca vect
{
int* z = new int[n]; // xin cp pht b nh
for (int i=0; i<n; i++) z[i] = x[i] + y[i];
return c;
}
main()
{
int i, n, a[10], b[10], c[10] ;
cout << "n = " ; cin >> n; // nhp s phn t
for (i=0; i<n; i++) cin >> a[i] ; // nhp vect a
for (i=0; i<n; i++) cin >> b[i] ; // nhp vect b
c = congvt(a, b, n);
for (i=0; i<n; i++) cout << c[i] ; // in kt qu
}
Ch : a[i], b[i], c[i] cn c vit di dng tng ng *(a+i), *(b+i), *(c+i).
2. 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
115
Chng 4. Hm v chng trnh
main()
{
int i, n, a[10], b[10], c[10] ;
cout << "n = " ; cin >> n; // nhp s phn t
for (i=0; i<n; i++) cin >> a[i] ; // nhp vect a
for (i=0; i<n; i++) cin >> b[i] ; // nhp vect b
congvt(a, b, c, n);
for (i=0; i<n; i++) cout << c[i] ; // in kt qu
}
V d 13 : 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]
116
Chng 4. Hm v chng trnh
}
}
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
117
Chng 4. Hm v chng trnh
main()
{
118
Chng 4. Hm v chng trnh
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 14 : 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); // khng dng c strupr(s)
}
main()
{
char *s = "abcde" ;
inhoa(s); // abcdeABCDE
}
8. Con tr hm
Mt hm (tp hp cc lnh) cng ging nh d liu: c tn gi , c a ch lu
119
Chng 4. Hm v chng trnh
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); // khai bo hm lu tha
float (*f)(float, int); // khai bo con tr f tng thch vi hm luythua
f = luythua; // cho f tr n hm lu tha
c. S dng con tr hm
120
Chng 4. Hm v chng trnh
121
Chng 4. Hm v chng trnh
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 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 17 :
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 ; }
main()
{
122
Chng 4. Hm v chng trnh
clrscr();
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);
getch();
}
III. QUI
123
Chng 4. Hm v chng trnh
if (n==0) return 1;
else return gt(n-1)*n;
}
main()
{
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.
124
Chng 4. Hm v chng trnh
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, ...
4. Cc v d
V d 1 : 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) // qui uoc a, b > 0
{
if (a < b) UCLN(a, b-a);
if (a == b) return a;
if (a > b) UCLN(a-b, b);
}
125
Chng 4. Hm v chng trnh
long Fib(int n)
{
long kq;
if (n==0 || n==1) kq = 1; else kq = Fib(n-1) + Fib(n-2);
return kq;
}
1 2 3 1 2 3
126
Chng 4. Hm v chng trnh
hin nhin nu s tng l 1 th ta ch phi thc hin mt php chuyn t di sang den.
Mi ln chuyn 1 tng t v tr i n j ta k hiu i j. Chng trnh s nhp vo
input l s tng v in ra cc bc chuyn theo k hiu trn.
T ta c th xy dng hm qui sau y ;
void chuyen(int n, int di, int den) // n: s tng, di, den: v tr i, n
{
if (n==1) cout << di << " " << den << endl;
else {
cout << di << "" << 6-di-den << endl; // 1 tng t di qua trung gian
chuyen(n-1, di, den) ; // n-1 tng t di qua den
cout << 6-di-den << "" den << endl; // 1 tng t tg v li den
}
}
main()
{
int sotang ;
cout << "S tng = " ; cin >> sotang;
chuyen(sotang, 1, 2);
}
V d nu s tng bng 3 th chng trnh in ra kt qu l dy cc php chuyn
sau y:
1 2 , 1 3 , 2 3 , 1 2 , 3 1 , 3 2 , 1 2.
c th tnh c s ln chuyn l 2n - 1 vi n l s tng.
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
127
Chng 4. Hm v chng trnh
main()
{
float x; int n;
cout << "Nhp x v n: "; cin >> x >> n;
xmh(5); // xo mn hnh 5 ln
cout << luythua(x, n); // in xn
}
128
Chng 4. Hm v chng trnh
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 2 : 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>
float x; int n; int i ;
float luythua(float x, int n)
{
float kq = 1;
for (i=1; i<=n; i++) kq *= x;
}
129
Chng 4. Hm v chng trnh
void xmh()
{
for (i=1; i<=n; i++) clrscr();
}
main()
{
cout << "Nhp x v n: "; cin >> x >> n;
xmh(5); // xo mn hnh 5 ln
cout << luythua(x, n); // 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 ; // khng dng n
float luythua(float x, int n)
{
float kq = 1;
for (i=1; i<=n; i++) kq *= x;
}
void xmh()
{
130
Chng 4. Hm v chng trnh
main()
{
x = 2;
i = 3;
xmh(5); // xo mn hnh 5 ln
cout << luythua(x, i); // 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.
131
Chng 4. Hm v chng trnh
2. Bin vi mc ch c bit
132
Chng 4. Hm v chng trnh
}
Trong Turbo C, BorlandC v cc chng trnh dch khc c nhiu hng s khai
bo sn trong tp values.h nh MAXINT, M_PI hoc cc hng ho trong graphics.h
nh WHITE, RED,
main()
{
ham(); // Hm chy ln th 1, i = 1
ham(); // Hm chy ln th 2, i = 2
ham(); // Hm chy ln th 3, i = 4
}
133
Chng 4. Hm v chng trnh
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() { ... } // B khai bo i trong main()
int i; // a khai bo i ra trc in() v sau main()
void in() { ... }
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).
134
Chng 4. Hm v chng trnh
Gi thit 2 chng trnh trn nm trong 2 tp 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()
{
extern i;
cout << i ;
}
Hm in() nm trong tp vn bn program2.cpp, c dng in gi tr ca bin i
khai bo trong program1.cpp, tm gi l tp gc (hai tp ny khi dch s c lin kt
vi nhau). T trong tp gc, i phi c khai bo l bin ngoi, v bt k hm tp
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 gc).
lin kt cc tp 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 vo danh sch tp
ca d n c hng dn dng cui ca ca s d n.
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 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 chng trnh ngun nh #include, #define
a. Ch th bao hm tp #include
135
Chng 4. Hm v chng trnh
Cho php ghp ni dung cc tp c khc vo chng trnh trc khi dch. Cc
tp cn ghp thm vo chng trnh thng l cc tp 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>
2: #include ng dn\tp
Dng khai bo 1 cho php C++ ngm nh tm tp ti th mc nh sn (khai bo
thng qua menu Options\Directories) thng l th mc TC\INCLUDE v tp l cc
tp nguyn mu ca th vin C++.
Dng khai bo 2 cho php tm tp theo ng dn, nu khng c ng dn s
tm trong th mc hin ti. Tp thng l cc tp (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 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 // thay then bng du cch
#define begin { // thay begin bng du {
#define end } // thay end bng du }
#define MAX 100 // thay MAX bng 100
#define TRUE 1 // thay TRUE bng 1
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)
{
136
Chng 4. Hm v chng trnh
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.
137
Chng 4. Hm v chng trnh
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 th vin vo s dng. Mt tp 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 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: MYLIB.H
int max(int a, int b)
138
Chng 4. Hm v chng trnh
{
return (a>b? a: b);
}
Th vin 2. tn tp: 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"
#include "mathfunc.h"
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
chnh (cha main()) trong mylib.h c chn vo 2 ln (mt ln ca tp 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 mylib.h
#ifndef _MYLIB_ // nu cha nh ngha tn gi
_MYLIB_
#define _MYLIB_ // th nh ngha n
int max(int a, int b) // v cc hm khc
{
return (a>b? a: b);
}
139
Chng 4. Hm v chng trnh
#endif
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
1. 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.
2. Cho mng nguyn cost. Vit ra cc cch gn gi tr 100 cho phn t th 3 ca
mng.
3. Cho p, q l cc con tr cng tr n k t c. t *p = *q + 1. C th khng nh:
*q = *p - 1 ?
4. Cho p, q l cc con tr tr n bin nguyn x = 5. t *p = *q + 1; Hi *q ?
5. 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 ?
6. 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
7. 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.
140
Chng 4. Hm v chng trnh
Con tr v xu k t
15. 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
16. 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];
}
141
Chng 4. Hm v chng trnh
Hm
21. 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.
22. 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
142
Chng 4. Hm v chng trnh
143
Chng 4. Hm v chng trnh
37. Tnh phn din tch gii hn bi hnh trn bn knh R v hnh vung ngoi tip
ca n.
38. 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).
39. 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.
40. Vit chng trnh sp xp theo tn mt mng h tn no .
41. Tm tt c s t nhin c 4 ch s m trong mi s khng c 2 ch s no ging
nhau.
42. Nhp s t nhin n. Hy biu din n di dng tch ca cc tha s nguyn t.
qui
43. Nhp s nguyn dng N. Vit hm qui tnh:
1 + 2 + 3 + ... + N
a. S1 =
N
b. S 2 = 12 + 2 2 + 3 2 + ... + N 2
1. Nhp s nguyn dng n. Vit hm qui tnh:
a. S1 = 3 + 3 + 3 + ... + 3 n du cn
1
b. S 2 = n du chia
1
2+
1
2+
1
2+. . .
2
44. 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)!)
45. Vit hm qui tnh s fibonaci th n. Dng chng trnh con ny tnh f(2) + f(4)
+ f(6) + f(8).
46. Vit di dng qui cc hm
a. daoxau b. UCLN c. Fibonaci d. Thp H Ni
47. Vit macro tro i ni dung 2 bin. AD: Sp xp dy s.
144
Chng 5. D liu kiu cu trc v hp
CHNG 5
Kiu cu trc
Cu trc t tr v danh sch lin kt
Kiu hp
Kiu lit k
I. KIU CU TRC
145
Chng 5. D liu kiu cu trc v hp
146
Chng 5. D liu kiu cu trc v hp
int soluong;
};
struct Lop daihoc = {"K41T", 60}, caodang ;
hoc:
Lop daihoc = {"K41T", 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, K41T[60];
Sinhvien y = {"NVA", {1,1,1980}, 1} ;
147
Chng 5. D liu kiu cu trc v hp
};
Lop daihoc = "K41T", caodang ;
caodang.tenlop = daihoc.tenlop ; // gn tn lp cng bi tn lp hc
caodang.siso++; // 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, K41T[60];
Sinhvien y = {"NVA", {1,1,1980}, 1} ;
y.diem = 5.5 ; // gn im thi cho sinh vin y
p = new Sinhvien ; // cp b nh cha 1 sinh vin
strcpy(photen, y.hoten) ; // gn h tn ca y cho sv tr bi p
cout << photen << y.hoten; // 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(K41T[1].hoten, photen) ; // gn h tn cho sv u tin ca lp
K41T[1].diem = 7.0 ; // 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 ; // gn ngy,
x.ngaysinh.th = y.ngaysinh.th ; // thng,
x.ngaysinh.nam = y.ngaysinh.nam ; // nm sinh ca y cho x.
148
Chng 5. D liu kiu cu trc v hp
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 ;
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
149
Chng 5. D liu kiu cu trc v hp
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 1 : Cng, tr, nhn chia hai phn s c cho di dng cu trc.
#include <iostream.h>
#include <conio.h>
struct Phanso {
int tu ;
int mau ;
} a, b, c ;
void main()
{
clrscr();
cout << "Nhp phn s a:" << endl ; // nhp a
cout << "T:"; cin >> a.tu;
cout << "Mu:"; cin >> a.mau;
150
Chng 5. D liu kiu cu trc v hp
V d 2 : Nhp mng K41T. Tnh tui trung bnh ca sinh vin nam, n. Hin danh
sch ca sinh vin c im thi cao nht.
#include <iostream.h>
#include <conio.h>
void main()
{
struct Sinhvien {
char hoten[25] ;
Ngaythang ns;
int gt;
float diem ;
} x, K41T[60];
int i, n;
151
Chng 5. D liu kiu cu trc v hp
// 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 ;
cin.ignore();
K41T[i] = x ;
}
}
152
Chng 5. D liu kiu cu trc v hp
x = K41T[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;
}
}
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:
struct Sinhvien {
char hoten[25] ;
Ngaythang ns;
int gt;
float diem ;
} x, y, *p, lop[60];
153
Chng 5. D liu kiu cu trc v hp
Sinhvien *p, *q ;
p = new Sinhvien[1];
q = new Sinhvien[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
154
Chng 5. D liu kiu cu trc v hp
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.
155
Chng 5. D liu kiu cu trc v hp
Khai bo
struct DATE { // Kiu ngy thng
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};
156
Chng 5. D liu kiu cu trc v hp
157
Chng 5. D liu kiu cu trc v hp
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 5 : Chng trnh n gin v qun l sinh vin.
Khai bo.
struct Sinhvien { // cu trc sinh vin
char hoten[25] ;
Ngaythang ns;
int gt;
158
Chng 5. D liu kiu cu trc v hp
float diem ;
};
Sinhvien lop[3]; // 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 ;
159
Chng 5. D liu kiu cu trc v hp
160
Chng 5. D liu kiu cu trc v hp
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 6 : i v gi tr ca hm l cu trc: Cng, tr hai s phc.
Khai bo kiu s phc
struct Sophuc // Khai bo kiu s phc dng chung
{
float thuc;
float ao;
};
Hm cng 2 s phc, tr li mt s phc
Sophuc Cong(Sophuc x, Sophuc y)
{
161
Chng 5. D liu kiu cu trc v hp
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 7 : Chng trnh nhp v in thng tin v mt lp cng sinh vin c im cao nht
lp.
162
Chng 5. D liu kiu cu trc v hp
struct Sinhvien {
char *hoten ;
float diem ;
} lop[4] ;
Sinhvien* nhap()
{
Sinhvien* kq = new Sinhvien[1]; // nh cp pht vng nh
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
}
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
163
Chng 5. D liu kiu cu trc v hp
void in(Sinhvien x)
{
cout << x.hoten << "\t";
cout << x.diem << endl;
}
Hm chnh
void main()
{
clrscr();
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
getch();
}
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,
164
Chng 5. D liu kiu cu trc v hp
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).
165
Chng 5. D liu kiu cu trc v hp
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 ).
8. 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) ; // in 2 2 2
cout << "S phn t ca z = " << sizeof(z) / sizeof(Date) // in 50
166
Chng 5. D liu kiu cu trc v hp
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 n cc vng d liu c
kiu chnh l kiu ca chng.
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> ; // nh ngha tn cu trc
struct <tn cu trc>
{
cc thnh phn cha thng tin ;
<tn kiu> *con tr ;
};
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
};
167
Chng 5. D liu kiu cu trc v hp
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] ; // thnh phn cha thng tin
float diem ; // thnh phn cha thng tin
Sv *tiep ; // thnh phn con tr cha a ch tip theo
};
typedef Sv Sinhvien ;
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:
typedef struct Sinhvien
{
char hoten[30] ; // thnh phn cha thng tin
float diem ; // thnh phn cha thng tin
Sinhvien *tiep ; // con tr cha a ch thnh phn tip theo
};
Cch 4:
168
Chng 5. D liu kiu cu trc v hp
169
Chng 5. D liu kiu cu trc v hp
head
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.
170
Chng 5. D liu kiu cu trc v hp
head
MOI
u i i+1 cui
NULL
0.0 9.0 7.5 4.0
171
Chng 5. D liu kiu cu trc v hp
Xa phn t th i
172
Chng 5. D liu kiu cu trc v hp
Khai bo
struct DATE
{
int day, month, year; // ngy, thng, nm
};
struct Sinhvien { // cu trc t tr
char hoten[31];
DATE ns;
float diem;
Sinhvien *tiep ;
};
Sinhvien *dau = NULL, *cuoi = NULL; // Cc con tr ti u v cui ds
Sinhvien *cur = NULL; // Con tr ti sv hin ti
int sosv = 0; // S sv ca danh sch
173
Chng 5. D liu kiu cu trc v hp
174
Chng 5. D liu kiu cu trc v hp
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 --;
}
175
Chng 5. D liu kiu cu trc v hp
Hm chnh.
void main()
{
clrscr();
Taods();
Inds();
getch();
}
III. KIU HP
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;
};
176
Chng 5. D liu kiu cu trc v hp
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 1 :
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;
}
union {
struct { unsigned a, b ; } s;
struct {
unsigned n1: 1;
unsigned: 15;
unsigned n2: 1;
unsigned: 7;
unsigned n3: 8;
}t;
} u;
177
Chng 5. D liu kiu cu trc v hp
178
Chng 5. D liu kiu cu trc v hp
BI TP
1. 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
2. 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
3. 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
C: C th vit: vaotruong.ng, ratruong.th, sinhvien.vaotruong.nam truy nhp
n cc thnh phn tng ng.
D: a, b, c ng
4. 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};
179
Chng 5. D liu kiu cu trc v hp
A: S1 v S2 ng B: S2 v S3 ng C: S3 v S1 ng D: C 3 cng
ng
5. 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
6. 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
7. 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
8. Cho khai bo:
union {
unsigned x;
unsigned char y[2];
} z = {0xabcd};
180
Chng 5. D liu kiu cu trc v hp
181
Chng 5. D liu kiu cu trc v hp
} 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
12. Xt on lnh:
union U {
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
13. 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.
14. 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.
15. 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.
16. 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 .
17. Tnh khong cch gia 2 ngy thng bt k.
18. Hin th ca mt ngy bt k no , bit rng ngy 1/1/1 l th hai.
19. Hin th ca mt ngy bt k no , ly ngy th hin ti lm chun.
20. 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
21. 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.
22. 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;};
182
Chng 5. D liu kiu cu trc v hp
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
23. 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.
24. 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 ?
25. 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.
26. 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.
27. To danh sch lin kt cc s thc x1, x2, ..., xn. Gi m l trung bnh cng:
x1 + x2 + ... + xn
m= .
n
Hy in ln lt ra mn hnh cc gi tr: m, x1 - m, x2 - m, ..., xn - m.
28. S dng kiu union in ra byte thp, byte cao ca mt s nguyn.
183
Chng 6. ha v m thanh
CHNG 6
HO V M THANH
ho
m thanh
I. HO
1. Khi nim ho
a. im nh v phn gii
Mn hnh ch ho l tp hp cc im (pixel-picture elements) nh. S
im nh v cch b tr theo chiu ngang, dc ca mn hnh c gi l phn gii
(resolution). V vy phn gii thng c c trng bi mt cp s ch nh s
im nh theo chiu ngang v chiu dc ca mn hnh. V d mn hnh VGA mode 2
c phn gii l 640x480, tc trn mi dng ngang ca mn hnh c th v c 640
im nh v trn mi ct dc v c 480 im nh. Cc ct v dng c nh s t
0, theo chiu t tri sang phi (i vi ct) v t trn xung di (i vi dng). Mt
im nh hay cn gi l pixel l giao im ca mt ct v mt dng no trn mn
hnh v v tr ca n c th hin bi cp to (x,y) vi x biu din cho ct v y
biu din cho dng. V d vi mn hnh trn im nh u tin nm gc trn bn
tri ca mn hnh c to (0,0) v im cui cng gc di bn phi c to
(639,479). im c to (150,200) l giao im ca ct th 150 v dng 200.
b. Trnh iu khin ho
Mn hnh ho c nhiu loi khc nhau. Mi loi mn hnh cn c trnh iu
khin tng ng. C cung cp cc trnh iu khin mn hnh trong th mc BGI t
di th mc gc ca C (TC hoc BC) gm c:
184
Chng 6. ha v m thanh
2. Vo/ra ch ho
Trong C++ cc hm lin quan n ho c khai bo trong tp <graphics.h>
a. Khi ng ch ho
void initgraph(int *graphdriver, int *graphmode, char *drivepath)
drivepath: ng dn ca th mc cha cc trnh iu khin ho. Nu rng
s tm trong th mc hin ti.
graphdriver, graphmode: Ch nh trnh qun l v mt mn hnh cn s dng.
Trong graphdriver c th nhn 1 trong cc gi tr sau:
DETECT 0
CGA 1
EGA 3
EGA64 4
EGAMONO 5
VGA 9
..................... ..
185
Chng 6. ha v m thanh
b. Kt thc ch ho
kt thc ch ho v li ch vn bn ta s dng hm closegraph();
c. Li ho
- Sau mi thao tc ho, hm graphresult() s cho gi tr 0 nu khng c li,
hoc cc gi tr m (-1 .. -18) tng ng vi li. Hm grapherrormsg(n) tr li ni
dung li v m li.
M li Hng li (graphresult()) Ni dung li (grapherrormsg())
0 grOk No error
-1 grNoInitGraph (BGI) Khng c BGI
-2 grNotDetected Graphics hardware not detected
186
Chng 6. ha v m thanh
V d 1 :
V d sau y khi to ch ho vi graphdriver = 0 (DETECT) v thng
bo li nu khng thnh cng hoc thng bo ch ho cng nh mode mn hnh.
bit phn gii ca mn hnh c th dng cc hm getmaxx() (s ct) v
getmaxy() (s dng)
void main()
{
int gd = DETECT, gm, maloi;
initgraph(&gd, &gm, "C:\\BC\\BGI");
maloi = graphresult();
if (maloi != grOk)
{
cout << "Li: " << grapherrormsg(maloi)) << endl;
cout << "An phm bt k dng "; getch();
exit(1);
} else {
cout << "Ch mn hnh = " << gd << endl;
cout << "Mode mn hnh = " << gm << endl;
cout << " phn gii: " << getmaxx() << "," << getmaxy() << endl;
getch();
}
closegraph();
}
a. Mu sc
getmaxcolor(): Tr li s hiu (hng) tng ng vi mu ti a ca mn hnh
hin ti. Do cc hng mu c tnh t 0 nn s mu s bng hng tr li cng
187
Chng 6. ha v m thanh
thm 1.
setbkcolor(mu): t mu nn. C tc dng vi vn bn v cc nt v.
setcolor(mu): t mu v. C tc dng vi vn bn v cc nt v.
getbkcolor(): Tr li mu nn hin ti.
getcolor(): Tr li mu v hin ti (t 0 n getmaxcolor()).
V d: In to ti v tr hin ti ca con tr mn hnh. Trong v d ny chng ta
s dng cu lnh sprintf(xu s, "dng k", cc biu thc cn in), cu lnh ny s
thay vic in cc biu thc ra mn hnh thnh in ra xu s (tc to xu s t cc biu thc).
Ngoi ra hm outtextxy(x, y, s) s in xu s ti v tr (x,y).
void intoado(dx, dy, color)
{
int oldcolor;
oldcolor = getcolor();
setcolor(color);
char td[10];
sprintf(td, "(%d, %d)", getx(), gety());
outtextxy(getx()+dx, gety()+dy, td);
setcolor(oldcolor);
}
b. V im
putpixel(x, y, c): V im (x, y) vi mu c.
getpixel (x, y): Tr li mu ti im (x, y).
V d 2 : V bu tri sao
void sky()
{
int maxx, maxy, maxc;
int i, xarr[3001], yarr[3001];
maxx = getmaxx();
maxy = getmaxy();
maxc = getmaxcolor();
188
Chng 6. ha v m thanh
randomize();
for (i=1;i<3001;i++) {xarr[i]=random(maxx);yarr[i]=random(maxy);}
while (!kbhit()) {
for (i=1;i<3001;i++)
{
putpixel(xarr[i], yarr[i], random(maxc));delay(1);
}
for (i=1;i<3001;i++)
if (getpitxel(xarr[i], yarr[i]) == random(maxc))
putpitxel(xarr[i], yarr[i], 0);
}
}
c. V ng thng v gp khc
line(x1, y1, x2, y2): V ng thng t (x1, y1) n (x2, y2). Con tr mn
hnh vn ng ti v tr c.
lineto(x, y): V ng thng t v tr hin ti ca con tr n v tr (x, y). con
tr chuyn v (x, y).
linerel(dx, dy): Gi (x, y) l v tr hin ti ca con tr, lnh ny s v ng
thng ni (x, y) vi im mi c ta (x+dx, y+dy). Tc lnh ny cng
tng ng vi lnh lineto(getx()+dx, gety()+dy), trong getx() v gety() l
hai hm tr li v tr x, y hin ti ca con tr. Lnh linerel sau khi thc hin
xong s t con tr ti v tr cui ca ng thng va v.
V d 3 : V hnh bao th bng 1 nt.
void baothu()
{
setbkcolor(1);
setcolor(YELLOW);
moveto(100, 100);
lineto(300, 100); lineto(300, 200); lineto(100, 200); lineto(100, 100);
lineto(200, 50); lineto(300, 100);
}
189
Chng 6. ha v m thanh
190
Chng 6. ha v m thanh
struct linesettingstype {
int linetsyle;
int upattern;
int thickness;
}
Cc hng s qui nh cc kiu ng (style):
style: SOLID_LINE = 0
DOTTED_LINE = 1
CENTER_LINE = 2
DASHED_LINE = 3
USERBIT_LINE = 4, // Kiu ng do NSD nh ngha
pattern: Do NSD nh ngha theo 2 byte cho mt ng. Ch c tc dng khi
style = 4.
Cc hng s qui nh m ( dy) ca ng (width):
NORM_WIDTH = 1
THICK_WIDTH = 3
V d 4 :
void netve()
{
char *lname[] = {"Duong lien net", "Duong cham cham",
"Duong trung tam", "Duong dut net", "Duong do NSD dinh nghia" };
int style, midx, midy, mauNSD;
midx = getmaxx() / 2; midy = getmaxy() / 2;
// Mu ng c nh ngha bi NSD "0000000000000001"
mauNSD = 1;
for (style=SOLID_LINE; style<=USERBIT_LINE; style++) {
setlinestyle(style, mauNSD, 1);
line(0, 0, midx-10, midy);
rectangle(0, 0, getmaxx(), getmaxy());
outtextxy(midx, midy, lname[style]);
191
Chng 6. ha v m thanh
192
Chng 6. ha v m thanh
maxx = getmaxx();
maxy = getmaxy();
setfillpattern(caro, getmaxcolor());
// T mn hnh theo mu
bar(0, 0, maxx, maxy);
getch();
f. V a gic
drawpoly(s nh, v tr nh): V ng a gic theo setlinestyle;
fillpoly(s nh, v tr nh): V hnh a gic c theo setfillstyle;
V tr nh l con tr tr n dy cc to , thng thng dng mng.
v a gic ng phi a ra n+1 to trong to n = to 0.
V d 6 :
int poly[10];
poly[0] = 20; poly[1] = maxy / 2; // nh th nht
poly[2] = maxx - 20; poly[3] = 20; // nh th hai
poly[4] = maxx - 50; poly[5] = maxy - 20; // nh th ba
poly[6] = maxx / 2; poly[7] = maxy / 2; // nh th t
poly[8] = poly[0]; poly[9] = poly[1];
// v a gic
drawpoly(5, poly);
g. V ng cong
arc(x, y, gc u, gc cui, bn knh): V cung trn c tm (x, y) vi cc
gc v bn knh tng ng.
circle(x, y, bn knh): V ng trn c tm ti (x, y).
pieslice(x, y, gc u, gc cui, bn knh): V hnh qut trn c vi mu
hin ti;
ellipse(x, y, gc u, gc cui, bkx, bky): V cung elip vi tm, cc gc v
cc bn knh theo hong v tung tng ng.
fillellipse(x, y, bkx, bky): V hnh elip c.
sector(x, y, gc u, gc cui, bkx, bky): V hnh qut elip.
193
Chng 6. ha v m thanh
h. T mu
floodfill(x, y, c): T mu mt hnh kn cha im x, y v mu vin c. Mu
dng t c t bi hm setfillstyle(kiu t, mu t). V d:
void fill()
{
rectangle(100, 100, 180, 140); // V hnh ch nht
setfillstyle(1, BLUE); // Mu t c, mu xanh
floodfill(120, 120, 15); // T hnh ch nht v
int tg[8] = {150, 120, 180, 280, 350, 180, 150, 120};
drawpoly(4, tg);
setfillstyle(2, RED);
floodfill(180, 200, 15);
circle(380, 210, 100);
setfillstyle(3, GREEN);
floodfill(380, 210, 15);
194
Chng 6. ha v m thanh
a. Vit vn bn
outtext(s) ;
outtextxy(x, y, s) ;
Cu lnh trn cho php vit xu k t ti v tr con tr trn mn hnh ha. Cu
lnh tip theo cho php vit s ra ti v tr (x, y). V tr con tr sau khi thc hin
outtext(s) s t ti v tr cui ca xu c in trong khi v tr con tr sau khi thc hin
lnh outtextxy(x, y, s) l khng thay i. V d sau in ra mn hnh ha dng ch
"y l chng trnh minh ha lnh outtext(s)" ti v tr (100, 20):
moveto(100, 20) ; // chuyen con tro den cot 100, dong 20
outtext("y l chng trnh minh ha lnh outtext(s)") ; hoc
outtext("y l chng trnh ") ;
outtext("minh ha lnh ") ;
outtext("outtext(s)") ;
hoc dng vn bn trn cng c th c in bi lnh outtextxy(x, y, s);
outtextxy(100, 20, "y l chng trnh minh ha lnh outtextxy(x, y, s)");
195
Chng 6. ha v m thanh
196
Chng 6. ha v m thanh
getch();
}
closegraph();
}
5. Chuyn ng
Nguyn tc: xa hnh v tr c ri v li hnh ti v tr mi theo hng
chuyn ng. xo, ta v li hnh ngay ti v tr c nhng vi mu v trng vi mu
nn (do hnh v b chm vo nn ging nh b xa). bit mu nn hin ti c
th dng hm setcolor(getbkcolor()). Tm li c th a ra s nh sau:
v li hnh vi mu nn ti v tr c // xa hnh
delay // tm dng
v li hnh (vi mu ca hnh) ti v tr mi // hnh chuyn n v tr khc
Cc bc trn nu c lp i lp li ta s thy hnh chuyn ng t v tr ny n
v tr khc.
i vi cc hnh v phc tp, xa nhanh ta c th v li hnh trong ch
XOR_PUT nh c trnh by trong phn sau.
Chng ta hy xem qua mt s hm phc tp hn v hnh.
197
Chng 6. ha v m thanh
V d 8 : V bnh xe xoay
void bx(int x, int y, int r, float phi, int xoa) // xo nh nu xoa = 1
{
int i, x1, x2, y1, y2;
if (xoa) setcolor(BLACK); // t mu v bng mu nn
circle(x, y, r); // v vnh bnh xe
for (i=0; i<6; i++) {
x1 = x+int(r*cos(phi)); y1 = y-int(r*sin(phi));
x2 = x-int(r*cos(phi)); y2 = y+int(r*sin(phi));
line(x1, y1, x2, y2); // v cc nan hoa
198
Chng 6. ha v m thanh
void xoay()
{
int i, x, y, r;
static float phi = 0;
x = midx; y = midy; r = 100;
while (!kbhit()) {
bx(x, y, r, phi, 0); // v bnh xe
delay(100); // tm dng
bx(x, y, r, phi, 1); // xa bnh xe
phi = phi-pi/72; // xoay i mt gc phi
}
}
199
Chng 6. ha v m thanh
6. V th ca cc hm ton hc
v th ca mt hm ton hc, ta v tng im mt ca th. Mi im
c xc nh bi cp ta (x, y) trn mn hnh. Do vy cn tnh cc im ny theo
ta trn mn hnh. Cc bc cn lm gm c:
Xc nh h trc ta . Thng thng ta s ly tm mn hnh lm tm h trc
bng vic xc nh li ca s mn hnh bi cu lnh:
viewport(midx, midy, maxx, maxy, 0);
trong midx, midy l ta tm mn hnh, maxx, maxy l ta gc di bn
phi ca mn hnh. Cu lnh trn to mt ca s l phn t bn phi, pha di ca
mn hnh. Tham tr cui (1) cho php cc hnh v s c v ra ngoi khung ca s
ny. Nh vy tm mn hnh s bin thnh tm ca h trc ta . Ta ca tm mn
hnh by gi c tnh l (0,0).
Xc nh t l: Cn xc nh mt n v ca x v y ca hm cn v s tng
ng vi bao nhiu im trn trc x v y ca mn hnh. Do s im theo chiu
rng v chiu cao ca mn hnh khc nhau v do gi tr ca hm (y) c th rt
ln so vi gi tr ca i (x) (v d hm y = x4) hoc rt b (v d hm y =
sinx) nn cc t l ny theo x v y c th khc nhau hnh v trn mn hnh
c cn i. Vic xc nh cc t l ny ph thuc vo kinh nghim v
thng c iu chnh sau khi chy th chng trnh.
V h trc : C th v h trc ta hay khng. Hm sau cho php v cc trc
ta vi tm nm gia mn hnh.
void vetruc() // Ve truc toa do
{
line(0, midy, maxx, midy); // truc hoanh
line(maxx-7, midy-3, maxx, midy); // mui ten
line(maxx-7, midy+3, maxx, midy);
line(midx, 0, midx, maxy); // truc tung
line(midx-3, 7, midx, 0); // mui ten
line(midx+3, 7, midx, 0);
outtextxy(midx+6, midy+6, "(0, 0)"); // in toa do (0,0)
}
200
Chng 6. ha v m thanh
201
Chng 6. ha v m thanh
float t;
int i, x, y;
for (i = 0; i<1000; i++) {
t = (pi/500)*i;
x = int(120*pow(cos(t), 3)) + midx;
y = int(120*pow(sin(t), 3)) + midy;
putpixel(x, y, 3);
}
}
void Trocoide() // Ham (2t-3sint, 2-3cost)
{ // t [-9, 9]
float t;
int i, x, y;
for (i = -1000; i<=1000; i++) {
t = 0.01*i;
x = int(15*(2*t-3*sin(t))) + midx;
y = -int(10*(2-3*cos(t))) + midy;
putpixel(x, y, 4);
}
}
void So3() // x = sintcos2t + sint
{ // y = sin2tcost, t [0, 2]
float t;
int i, x, y;
for (i = 0; i<=1000; i++) {
t = (pi/500)*i;
x = int(150*(sin(t)*(1+cos(t)*cos(t)))) + midx;
y = int(200*sin(t)*sin(t)*cos(t)) + midy;
putpixel(x, y, 5);
}
}
202
Chng 6. ha v m thanh
Chng trnh di y cho php v hai mt trong khng gian 3 chiu c cho
sin( x 2 + y 2 )
bi hai hm f = sinx.siny v g =
x2 + y2
typedef struct TOADO {
int OX, OY, UX, UY, UZ; // truc hoanh, tung va don vi cac truc
double Xx, Xy; // goc (OX, ox), (OY, oy)
203
Chng 6. ha v m thanh
};
TOADO gr3 = { 320, 20, 20, 20, 20, 0.8*pi, 0.2*pi };
204
Chng 6. ha v m thanh
205
Chng 6. ha v m thanh
}
getch();
}
void Vehamg()
{
double x, y, z;
double xa = -10, xb = 10;
double ya = -10, yb = 10;
double xp = 0.1, yp = 0.1;
settextstyle(TRIPLEX_FONT, HORIZ_DIR, 1);
outtextxy(10, 20, "Ham z = sin(sqrt(x*x+y*y))");
outtextxy(100, 30, "------------");
outtextxy(115, 40, "sqrt(x*x+y*y)");
setviewport(0, midy, maxx, maxy, 0);
setcolor(BLUE);
for (x = xa; x <= xb; x+=xp)
for (y = ya; y <= yb; y+=yp)
{
if (kbhit()) return;
z = g(x, y); lineto(X(x, y, z), Y(x, y, z));
delay(10);
}
getch();
}
void main()
{
Initgraph(); Vetruc(); Vehamf();
cleardevice(); Vetruc(); Vehamg();
closegraph();
}
206
Chng 6. ha v m thanh
II. M THANH
m thanh c c trng bi cao (tn s) v trng ( di). Vic to ra
mt chui m (bi ht chng hn), l s kt hp lp i lp li ca cc hm sau vi cc
tham s n v t c chn thch hp.
sound(n): pht m ra loa my tnh vi tn s n.
delay(t): ko di trong t miligiy.
nosound(): tt m thanh pht.
V d 1 : Ting ci bo ng
void coi(int cao; int thap)
{
do {
sound(cao); delay(400); sound(thap); delay(400);
} while (!kbhit())
nosound();
}
V d 2 : Ting bng ny
void bong(int cao; int thap)
{
int sodem = 20;
while (sodem > 1) {
sound(thap-2*sodem); delay(sodem*500/20);
nosound(); delay(100);
sound(cao); delay(sodem*500/15); nosound(); delay(150);
sodem --;
}
}
207
Chng 6. ha v m thanh
V d 3 : Ting bom
void bong(int cao; int thap; int t)
{
int sodem = thap;
while (sodem <= cao) {
sound(sodem); delay(t/sodem*75);
sodem += 10;
}
for (sodem =1 to 3) {
nosound();
sound(40); delay(500); nosound(); delay(100);
}
sound(40); delay(3000); nosound();
}
208
Chng 6. ha v m thanh
void main()
{
int gdriver = DETECT, gmode;
initgraph(&gdriver, &gmode, "c:\\borlandc\\bgi");
int star[20] = {320, 150, 285, 225, 200, 225, 270, 270, 240, 350,
320, 300, 390, 350, 360, 270, 430, 225, 345, 225};
setbkcolor(RED); setcolor(YELLOW); // V l c sao vng
setfillstyle(SOLID_FILL, YELLOW);
fillpoly(10, star);
// Trng cc nt nhc
float d = 300; // en
float tr = 2*d; // trng
209
Chng 6. ha v m thanh
210
Chng 6. ha v m thanh
BI TP
211
Chng 7. Lp v i tng
CHNG 7
LP V I TNG
212
Chng 7. Lp v i tng
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 <stdio.h>
#include <conio.h>
#include <math.h>
float x[100],y[100];
float do_dai(int i, int j)
{
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)
{
printf("\n Nhap toa do x, y cua diem thu %d : ",i);
scanf(''%f%f",&x[i],&y[i]);
}
}
void main()
{
int n, i, j, imax,jmax;
float d, dmax;
printf(''\n So diem N= '');
scanf(''%d'', &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)
213
Chng 7. Lp v i tng
{
dmax=d;
imax=i; jmax=j;
}
}
printf(''\nDoan thang lon nhat co do dai bang: %0.2f",dmax);
printf(''\n Di qua 2 diem co chi so la %d va %d'',imax,jmax);
getch();
}
214
Chng 7. Lp v i tng
215
Chng 7. Lp v i tng
void main()
{
clrscr();
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;
}
}
printf(''\n Doan thang lon nhat co do dai bang: %0.2f",dmax);
printf(''\n Di qua 2 diem co chi so la %d va %d" , imax,jmax);
getch();
}
II. 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,
216
Chng 7. Lp v i tng
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.
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; //Khng cho php, v x c kiu lp A
A* p ; //Cho php , v p l con tr kiu lp A
};
217
Chng 7. Lp v i tng
218
Chng 7. Lp v i tng
private:
int x, y, m ;
public:
void nhapsl() ;
void hien() ;
void an() { putpixel(x, y, getbkcolor());}
};
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()
{
int mau_ht ;
mau_ht = getcolor();
putpixel(x, y, m);
setcolor(mau_ht);
}
Qua v d trn c th rt ra mt s ch sau:
+ Trong c 3 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.
219
Chng 7. Lp v i tng
220
Chng 7. Lp v i tng
#include <conio.h>
#include <iostream.h>
#include <graphics.h>
class DIEM
{
private:
int x, y, m ;
public:
void nhapsl();
void an() { putpixel(x,y,getbkcolor());}
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()
{
int mau_ht;
mau_ht = getcolor() ;
putpixel(x,y,m);
setcolor(mau_ht);
}
void kd_do_hoa()
{
int mh, mode ;
221
Chng 7. Lp v i tng
mh=mode=0;
initgraph(&mh, &mode, "C:\\TC\BGI");
}
void main()
{
DIEMd1, d2, d3 ;
d1.nhapsl(); d2.nhapsl(); d3.nhapsl();
kd_do_hoa();
setbkcolor(BLACK);
d1.hien(); d2.hien(); d3.hien();
getch();
d1.an(); d2.an(); d3.an();
getch();
closegraph();
}
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 ; // Khai bo 3 con tr p1, p2, p3
DIEM d1, d2 ; // Khai bo 2 i tng d1, d2
DIEM d[20] ; // Khai bo mng i tng
v c th thc hin cc cu lnh:
p1= &d2 ; // p1 cha a ch ca d2 , hay p1 tr ti d2
p2 = d ; // p2 tr ti u mng d
p3 = new DIEM // 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
222
Chng 7. Lp v i tng
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()
{
223
Chng 7. Lp v i tng
int mau_ht;
mau_ht = getcolor() ;
putpixel(x,y,m);
setcolor(mau_ht);
}
void kd_do_hoa()
{
int mh, mode ;
mh=mode=0;
initgraph(&mh, &mode, ''C:\\TC\BGI'');
}
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();
kd_do_hoa();
for (i=1;i<=n;++i) p[i].hien();
getch();
for (i=1;i<=n;++i) p[i].an();
getch();
closegraph();
}
224
Chng 7. Lp v i tng
{
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.
225
Chng 7. Lp v i tng
226
Chng 7. Lp v i tng
#include <iostream.h>
#include <graphics.h>
#include <math.h>
#include <stdio.h>
class DIEM
{
private:
int x, y ;
public:
void nhapsl();
void ve_doan_thang(DIEM d2, int mau) ;
void ve_tam_giac(DIEM d2, DIEM d3,int mau) ;
double do_dai(DIEM d2)
{
DIEM d1 = *this ;
return sqrt(pow(d1.x - d2.x,2) + pow(d1.y - d2.y,2) ) ;
}
double chu_vi(DIEM d2, DIEM d3);
};
void DIEM::nhapsl()
{
cout <<'' \n Nhap hoanh do (cot) va tung do (hang) cua diem:'' ;
cin >> x >> y;
}
void kd_do_hoa()
{
int mh, mode ;
mh=mode=0;
initgraph(&mh, &mode, '''');
}
227
Chng 7. Lp v i tng
setcolor(mau);
line(this x,this y,d2.x,d2.y);
}
228
Chng 7. Lp v i tng
229
Chng 7. Lp v i tng
IV. HM TO (CONSTRUCTOR)
a. Cch vit hm to
i. 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.
ii. 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.
230
Chng 7. Lp v i tng
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; // honh (ct) ca im
int y; // tung (hng) ca im
int m; // 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;
}
// Hm to ny xy dng bn ngoi nh ngha lp
DIEM_DH(int x1, int y1, int m1 = 15) ;
// Cc phng thc khc
};
231
Chng 7. Lp v i tng
232
Chng 7. Lp v 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 <conio.h>
#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
233
Chng 7. Lp v i tng
void in()
{
cout <<''\n '' << x << '' ''<< y<<" " << m ;
}
// Hm to khng i
DIEM_DH()
{
x = y = 0;
m = 1;
}
// 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
clrscr();
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;
234
Chng 7. Lp v i tng
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 <conio.h>
#include <iostream.h>
class DIEM_DH
{
private:
int x, y, m;
public:
// Phng thc
void in() { cout <<"\n '' << x << '' ''<< y<<'' " << m ; }
};
void main()
{
DIEM_DH d;
d.in();
DIEM_DH *p;
235
Chng 7. Lp v i tng
p = new DIEM_DH[10];
clrscr();
d.in();
for (int i = 0; i<10; ++i) (p+i)->in();
getch();
}
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 <conio.h>
#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
236
Chng 7. Lp v i tng
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
237
Chng 7. Lp v i tng
DIEM_DH d2;
// Gi ti hm to, dng 1 tham s mc nh
d2 = DIEM_DH(300, 300);
d1.in();
d2.in();
getch();
}
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
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 (<<).
238
Chng 7. Lp v i tng
void main()
{
PS d;
cout << "\n Nhap PS d "; cin >> d;
cout << "\n PS d " << d;
PS u(d);
cout << "\n PS u "<< u;
getch();
}
239
Chng 7. Lp v i tng
240
Chng 7. Lp v i tng
241
Chng 7. Lp v i tng
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);
};
242
Chng 7. Lp v i tng
void main()
{
DT d;
clrscr();
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 ;
getch();
}
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];
for (int i = 0; i< = d.n; ++i)
this a[i] = d.a[i];
}
243
Chng 7. Lp v i tng
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];
}
244
Chng 7. Lp v i tng
void main()
{
DT d;
clrscr();
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 ;
getch();
245
Chng 7. Lp v i tng
V. 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.
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.
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
+ 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;
246
Chng 7. Lp v i tng
}
...
};
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.
4. V d
Phn ny chng ti trnh by mt v d tng i hon chnh v lp cc hnh
trn trong ch ha. Chng trnh gm:
i. Lp HT (hnh trn) vi cc thuc tnh:
int r; // Bn knh
int m; // Mu hnh trn
int xhien, yhien; // V tr hin th hnh trn trn mn hnh
char *pht; // Con tr tr ti vng nh cha nh hnh trn
int hienmh; // Trng thi hin (hienmh = 1), n (hienmh = 0)
ii. Cc phng thc
+ Hm to khng i thc hin vic gn gi tr bng 0 cho cc thuc tnh ca
lp. HT();
+ Hm to c i. HT(int n, int m1 = 15);
247
Chng 7. Lp v i tng
248
Chng 7. Lp v i tng
HT:: HT()
{
r = m = hienmh = 0;
xhien = yhien = 0;
pht = NULL;
}
249
Chng 7. Lp v i tng
void HT::an()
{
if (hienmh) // Dang hien
{
hienmh = 0;
putimage(xhien, yhien, pht, XOR_PUT);
}
}
HT::~HT()
{
an();
250
Chng 7. Lp v i tng
if (pht! = NULL)
{
delete pht;
pht = NULL;
}
}
void ktdh()
{
int mh = 0, mode = 0;
initgraph(&mh, &mode, " ");
xmax = getmaxx();
ymax = getmaxy();
}
void ve_bau_troi()
{
for (int i = 0; i<2000; ++i)
putpixel(random(xmax), random(ymax), 1+random( 15));
}
void ht_di_dong_xuong()
{
HT h(50, 4);
HT u(60, 15);
h.hien(0, 0);
u.hien(40, 0);
for (int x = 0; x< = 340; x+ = 10)
{
h.an();
u.an();
h.hien(x, x);
delay(200);
u.hien(x+40, x);
delay(200);
251
Chng 7. Lp v i tng
}
}
void ht_di_dong_len()
{
HT h(50, 4);
HT u(60, 15);
h.hien(340, 340);
u.hien(380, 340);
for (int x = 340; x> = 0; x- = 10)
{
h.an();
u.an();
u.hien(x, x);
delay(200);
u.hien(x+40, x);
delay(200);
}
};
void main()
{
ktdh();
ve_bau_troi();
ht_di_dong_xuong();
ht_di_dong_len();
getch();
closegraph();
}
Cc nhn xt:
+ Trong thn hm hy gi ti phng thc an().
+ iu g xy ra khi b i hm hy:
Khi gi hm ht_di_dong_xuong() th c 2 i tng kiu HT c to ra.
Trong thn hm s dng cc i tng ny v cc hnh trn di
252
Chng 7. Lp v i tng
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 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.
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 1 :
inline float f(int n, float x);
float f(int n, float x)
{
// Cc cu lnh trong thn hm
}
253
Chng 7. Lp v i tng
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 <conio.h>
#include <iostream.h>
void main()
{
int s ;
s = f(5,6);
cout << s ;
getch();
}
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 .
254
Chng 7. Lp v i tng
255
Chng 7. Lp v i tng
cout << "\n Do dai 2 canh= '' << a[i] << '' va '' << b[i] ;
cout <<"\n Dien tich= " << dt[i] ;
cout << "\n Chu vi= '' << cv[i] ;
}
getch();
}
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 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 <conio.h>
#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]);
}
clrscr();
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] ;
}
getch();
256
Chng 7. Lp v i tng
}
void dtcvhcn(int a, int b, int&dt, int &cv)
{
dt=a*b;
cv=2*(a+b);
}
257
Chng 8. Hm bn, nh ngha php ton cho lp
CHNG 8
Hm bn
nh ngha php ton cho lp
I. HM BN (FRIEND FUNCTION)
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(...)
{
258
Chng 8. Hm bn, nh ngha php ton cho lp
...
}
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:
// Xy dng cc hm bn ca lp A
void f1(...)
{
...
}
double f2(...)
{
...
}
A f3(...)
{
...
}
...
};
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
259
Chng 8. Hm bn, nh ngha php ton cho lp
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);
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)
260
Chng 8. Hm bn, nh ngha php ton cho lp
{
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:
...
};
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.
261
Chng 8. Hm bn, nh ngha php ton cho lp
262
Chng 8. Hm bn, nh ngha php ton cho lp
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 = ";
263
Chng 8. Hm bn, nh ngha php ton cho lp
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];
}
}
264
Chng 8. Hm bn, nh ngha php ton cho lp
void main()
{
MT a; VT x, y;
clrscr();
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);
getch();
}
265
Chng 8. Hm bn, nh ngha php ton cho lp
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 -)
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); // p1 + p2
PS operator-(PS p1 , PS p2); // p1 - p2
PS operator*(PS p1, PS p2); // p1 *p2
PS operator/(PS p1, PS 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
266
Chng 8. Hm bn, nh ngha php ton cho lp
int n ; // S ct ma trn
};
MT operator-(MT x) ;
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];
return y;
}
267
Chng 8. Hm bn, nh ngha php ton cho lp
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 -
268
Chng 8. Hm bn, nh ngha php ton cho lp
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 ;
269
Chng 8. Hm bn, nh ngha php ton cho lp
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);
}
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;
getch();
}
270
Chng 8. Hm bn, nh ngha php ton cho lp
271
Chng 8. Hm bn, nh ngha php ton cho lp
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;
272
Chng 8. Hm bn, nh ngha php ton cho lp
d.n=i;
return d ;
}
DT operator-(DT d1, DT d2)
{
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;
clrscr();
273
Chng 8. Hm bn, nh ngha php ton cho lp
274
Chng 9. Cc dng nhp/xut v file
CHNG 9
Nhp/xut vi cin/cout
nh dng
In ra my in
Lm vic vi File
Nhp/xut nh phn
ios
istream ostream
iostream
275
Chng 9. Cc dng nhp/xut v file
I. 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.
276
Chng 9. Cc dng nhp/xut v file
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 >>.
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);
277
Chng 9. Cc dng nhp/xut v file
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 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 :
cin.get(); // c mt k t trong b m
cin.ignore(n); //c n k t trong b m (vi n=1)
278
Chng 9. Cc dng nhp/xut v file
279
Chng 9. Cc dng nhp/xut v file
II. NH DNG
Cc gi tr in ra mn hnh c th c trnh by di nhiu dng khc nhau
thng qua 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.
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; // rng thc ca a l 2, ca b l 3
cout << a; // chim 2 ct mn hnh
cout.width(7); // t rng gi tr in tip theo l 7
cout << b; // b in trong 7 ct vi 4 du cch ng trc
Kt qu in ra s l: 12<><><><>345
280
Chng 9. Cc dng nhp/xut v file
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 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); // Bt cc c trong danh sch
cout.unsetf(danh sch c); // 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.
a. 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; // rng thc ca a l 4, ca b l 8
cout << a; // chim 4 ct mn hnh
cout.width(10); // t rng gi tr in tip theo l 10
cout.fill('*') ; // du * lm k t n
cout.precision(2); // t chnh xc n 2 s l
cout.setf(ios::left) ; // bt c ios::left
281
Chng 9. Cc dng nhp/xut v file
282
Chng 9. Cc dng nhp/xut v file
3. 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 // tng t ios::dec
oct // tng t ios::dec
hex // tng t ios::hex
endl // xut k t xung dng ('\n')
flush // 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
III. 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
283
Chng 9. Cc dng nhp/xut v file
284
Chng 9. Cc dng nhp/xut v file
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 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:
ifstream f; // to i tng c tn f c hoc
ofstream f; // to i tng c tn f ghi
f.open("Baitap"); // m file Baitap v gn vi f
+ 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"); // m file Baitap gn vi i tng f
ofstream f("Baitap); // 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
285
Chng 9. Cc dng nhp/xut v file
286
Chng 9. Cc dng nhp/xut v file
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
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 Sinhvien::nhap()
{
cout << "\nS sinh vin: "; cin >> sosv;
int n = sosv;
sv = new Sinhvien[n+1]; // B phn t th 0
for (int i = 1; i <= n; i++) {
cout << "\nNhp sinh vin th: " << i << endl;
cout << "\nH tn: "; cin.ignore(); cin.getline(sv[i].hoten);
cout << "\nTui: "; cin >> sv[i].tuoi;
cout << "\nim: "; cin >> sv[i].diem;
}
}
287
Chng 9. Cc dng nhp/xut v file
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) {
Sinhvien t = sv[i]; sv[i] = sv[j]; sv[j] = t;
}
}
void main() {
clrscr();
288
Chng 9. Cc dng nhp/xut v file
Sinhvien x ;
x.nhap(); x.ghi("DSSV1");
x.doc("DSSV1"); x.sapxep(); x.ghi("DSSV2");
cout << " xong";
getch();
}
289
Chng 9. Cc dng nhp/xut v file
while (!f.eof()) {
f.get(ch));
dodai++;
}
cout << " di ca file = " << dodai;
getch();
}
290
Chng 9. Cc dng nhp/xut v file
V d 4 : Chng trnh nhp v in danh sch sinh vin trn ghi/c ng thi.
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
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 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;
291
Chng 9. Cc dng nhp/xut v file
V. NHP/XUT 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
292
Chng 9. Cc dng nhp/xut v file
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 1 : 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.
2. c, ghi k t
put(c); // ghi k t ra file
get(c); // c k t t file
V d 2 : 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 <stdlib.h>
#include <conio.h>
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();
}
293
Chng 9. Cc dng nhp/xut v file
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 3 : Chng trnh sao chp file trn c th s dng cc phng thc mi ny
nh sau:
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <conio.h>
void main()
{
clrscr();
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();
}
4. c ghi ng thi
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
#include <stdlib.h>
#include <stdio.h>
294
Chng 9. Cc dng nhp/xut v file
#include <conio.h>
#include <string.h>
#include <ctype.h>
struct Sv {
char *hoten;
int tuoi;
double diem;
};
class Sinhvien {
int sosv;
Sv x;
char fname[30];
static int size;
public:
Sinhvien(char *fn);
void tao();
void bosung();
void xemsua();
};
void Sinhvien::tao()
295
Chng 9. Cc dng nhp/xut v file
{
fstream f;
f.open(fname, ios::out | ios::noreplace | ios::binary);
if (!f.good()) {
cout << "danh sach da co. Co tao lai (C/K) ?";
char traloi = getch();
if (toupper(traloi) == 'C') return;
else {
f.close() ;
f.open(fname, ios::out | ios::trunc | ios::binary);
}
}
sosv = 0
while (1) {
cout << "\nSinh vin th: " << sosv+1;
cout << "\nH tn: "; cin.ignore(); cin.getline(x.hoten);
if (x.hoten[0] == 0) break;
cout << "\nTui: "; cin >> x.tuoi;
cout << "\nim: "; cin >> x.diem;
f.write((char*)(&x), size);
sosv++;
}
f.close();
}
void Sinhvien::bosung()
{
fstream f;
f.open(fname, ios::out | ios::app | ios::binary);
if (!f.good()) {
cout << "danh sach chua co. Tao moi (C/K) ?";
char traloi = getch();
if (toupper(traloi) == 'C') return;
else {
296
Chng 9. Cc dng nhp/xut v file
f.close() ;
f.open(fname, ios::out | ios::binary);
}
}
int stt = 0
while (1) {
cout << "\nB sung sinh vin th: " << stt+1;
cout << "\nH tn: "; cin.ignore(); cin.getline(x.hoten);
if (x.hoten[0] == 0) break;
cout << "\nTui: "; cin >> x.tuoi;
cout << "\nim: "; cin >> x.diem;
f.write((char*)(&x), size);
stt++;
}
sosv += stt;
f.close();
}
void Sinhvien::xemsua()
{
fstream f;
int ch;
f.open(fname, ios::out | ios::app | ios::binary);
if (!f.good()) {
cout << "danh sach chua co";
getch(); return;
}
cout << "\nDanh sch sinh vin" << endl;
int stt ;
while (1) {
cout << "\nCn xem (sua) sinh vin th (0: dng): " ;
cin >> stt;
if (stt < 1 || stt > sosv) break;
f.seekg((stt-1) * size, ios::beg);
297
Chng 9. Cc dng nhp/xut v file
f.read((char*)(&x), size);
cout << "\nH tn: " << x.hoten;
cout << "\nTui: " << x.tuoi;
cout << "\nim: " << x.diem;
cout << "C sa khng (C/K) ?";
cin >> traloi;
if (toupper(traloi) == 'C') {
f.seekg(-size, ios::cur);
cout << "\nH tn: "; cin.ignore(); cin.getline(x.hoten);
cout << "\nTui: "; cin >> x.tuoi;
cout << "\nim: "; cin >> x.diem;
f.write((char*)(&x), size);
}
}
f.close();
}
void main()
{
int chon;
Sinhvien SV("DSSV") ;
while (1) {
clrscr();
cout << "\n1: To danh sch sinh vin";
cout << "\n2: B sung danh sch";
cout << "\n3: Xem sa danh sch";
cout << "\n0: Kt thc";
chon = getch();
chon = chon 48;
clrscr();
if (chon == 1) SV.tao();
else if (chon == 2) SV.bosung();
else if (chon == 3) SV.xemsua();
else break;
298
Chng 9. Cc dng nhp/xut v file
}
}
BI TP
1. Vit chng trnh m s dng ca mt file vn bn.
2. Vit chng trnh c in tng k t ca file vn bn ra mn hnh, mi mn hnh
20 dng.
3. Vit chng trnh tm xu di nht trong mt file vn bn.
4. 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.
5. 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.
6. 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++).
7. 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.
8. 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.
9. 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.
10. 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.
11. 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.
299
MC LC
I. CC YU T C BN ................................................................................................1
1. Vo d liu t bn phm......................................................................................... 9
2. In d liu ra mn hnh .......................................................................................... 10
3. nh dng thng tin cn in ra mn hnh ............................................................... 12
4. Vo/ra trong C...................................................................................................... 14
300
4. Hng xu k t ...................................................................................................... 25
5. Khai bo hng....................................................................................................... 26
III. BIN - KHAI BO V S DNG BIN ......................................................................27
1. Cc hm s hc ................................................................................................... 38
2. Cc hm lng gic.............................................................................................. 38
1. Mng mt chiu.................................................................................................... 59
2. Xu k t............................................................................................................... 63
IV. MNG HAI CHIU.......................................................................................................73
301
Chng 4. HM V CHNG TRNH
I. CON TR V S HC A CH .................................................................................83
I. KIU CU TRC.......................................................................................................145
302
7. Cu lnh typedef................................................................................................. 165
8. Hm sizeof()....................................................................................................... 166
II. CU TRC T TR V DANH SCH LIN KT....................................................166
Chng 6. HA V M THANH
I. HO.....................................................................................................................184
Chng 7. LP V I TNG
303
1. Hm to (hm thit lp) .................................................................................... 230
2. Lp khng c hm to v hm to mc nh ................................................... 235
3. Hm to sao chp (Copy constructor) .............................................................. 238
V. HM HY (Destructor) ........................................................................................... 246
1. Hm hy mc nh ............................................................................................ 246
2. Quy tc vit hm hy ........................................................................................ 246
3. Vai tr ca hm hy trong lp DT .................................................................... 247
4. V d ................................................................................................................. 247
VI. CC HM TRC TUYN (inline) ........................................................................... 253
1. Hm bn ........................................................................................................... 258
2. Tnh cht ca hm bn ..................................................................................... 259
3. Hm bn ca nhiu lp ...................................................................................... 261
II. NH NGHA PHP TON CHO LP .................................................................... 266
304
IV. LM VIC VI FILE..................................................................................................284
305
TI LIU THAM KHO
306