Professional Documents
Culture Documents
Giao Trinh C++
Giao Trinh C++
Bi ging
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
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++
cn phi sa li nh sau:
hoc ch gi li cp du ch thch ngoi cng
/* y l on ch thch cha on ch thch ny nh on ch thch con */
Khi ng C++ cng nh mi chng trnh khc bng cch nhp p chut ln
biu tng ca chng trnh. Khi chng trnh c khi ng s hin ra giao din
gm c menu cng vic v mt khung ca s bn di phc v cho son tho. Mt con
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.
2. Giao din v ca s son tho
a. M t chung
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.
e. Chc nng dch v chy chng trnh
// khai bo tp nguyn mu
void main()
int h = 2,
// in ra mn hnh
Trc khi vit v chy mt chng trnh thng thng chng ta cn:
1. Xc nh yu cu ca chng trnh. Ngha l xc nh d liu u vo (input)
cung cp cho chng trnh v tp cc d liu cn t c tc u ra (output).
Cc tp hp d liu ny ngoi cc tn gi cn cn xc nh kiu ca n.V d
gii mt phng trnh bc 2 dng: ax2 + bx + c = 0, cn bo cho chng
trnh bit d liu u vo l a, b, c v u ra l nghim x1 v x2 ca phng
trnh. Kiu ca a, b, c, x1, x2 l cc s thc.
2. Xc nh thut ton gii.
3. C th ho cc khai bo kiu v thut ton thnh dy cc lnh, tc vit thnh
chng trnh thng thng l trn giy, sau bt u son tho vo trong
my. Qu trnh ny c gi l son tho chng trnh ngun.
4. Dch chng trnh ngun tm v sa cc li gi l li c php.
5. Chy chng trnh, kim tra kt qu in ra trn mn hnh. Nu sai, sa li
chng trnh, dch v chy li kim tra. Qu trnh ny c thc hin lp i
lp li cho n khi chng trnh chy tt theo yu cu ra ca NSD.
2. Son tho tp chng trnh ngun
Sau khi son tho xong chng trnh ngun, bc tip theo thng l dch (n
t hp phm Alt-F9) tm v sa cc li gi l li c php. Trong khi dch C++ s t
con tr vo ni gy li (vit sai c php) trong vn bn. Sau khi sa xong mt li NSD
c th dng Alt-F8 chuyn con tr n li tip theo hoc dch li. chuyn con tr
v ngc li li trc c th dng Alt-F7. Qu trnh sa li dch c lp li cho
n khi vn bn c sa ht li c php.
Sn phm sau khi dch l mt tp mi gi l chng trnh ch c ui EXE tc
l tp m my thc hin.Tp ny c th lu tm thi trong b nh phc v cho qu
trnh chy chng trnh hoc lu li trn a tu theo tu chn khi dch ca NSD.
Trong v sau khi dch, C++ s hin mt ca s cha thng bo v cc li (nu c),
hoc thng bo chng trnh c dch thnh cng (khng cn li). Cc li ny
c gi l li c php.
dch chng trnh ta chn menu \Compile\Compile hoc \Compile\Make hoc
nhanh chng hn bng cch n t hp phm Alt-F9.
n Ctrl-F9 chy chng trnh, nu chng trnh cha dch sang m my, my
s t ng dch li trc khi chy. Kt qu ca chng trnh s hin ra trong mt ca
s kt qu NSD kim tra. Nu kt qu cha c nh mong mun, quay li vn bn
sa v li chy li chng trnh. Qu trnh ny c lp li cho n khi chng
trnh chy ng nh yu cu ra. Khi chng trnh chy, ca s kt qu s hin ra
tm thi che khut ca s son tho. Sau khi kt thc chy chng trnh ca s son
tho s t ng hin ra tr li v che khut ca s kt qu. xem li kt qu hin
n Alt-F5. Sau khi xem xong quay li ca s son tho n phm bt k.
IV. VO/RA TRONG C++
Trong phn ny chng ta lm quen mt s lnh n gin cho php NSD nhp d
liu vo t bn phm hoc in kt qu ra mn hnh. Trong phn sau ca gio trnh chng
ta s kho st cc cu lnh vo/ra phc tp hn
1. Vo d liu t bn phm
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
10
hoc:
cout << bt_1 << bt_2 << bt_3 ;
khi my s in dng thng bo "Hy nhp chiu di: " v ch sau khi NSD
nhp xong 23 , my s thc hin cu lnh tip theo tc in dng thng bo "V nhp
chiu rng: " v ch n khi NSD nhp xong 11 chng trnh s tip tc thc hin
cc cu lnh tip theo.
V d 2 : T cc tho lun trn ta c th vit mt cch y chng trnh tnh
din tch v chu vi ca mt hnh ch nht. chng trnh c th tnh vi cc b gi
tr khc nhau ca chiu di v rng ta cn lu gi tr ny vo trong cc bin (v d cd,
cr).
#include <iostream.h>
void main()
{
float cd, cr ;
// nhp d liu
// in kt qu
12
#include <iomanip.h>
// s dng cc nh dng
#include <conio.h>
void main()
{
clrscr();
// xo mn hnh
cout << "CHI TIU" << endl << "=======" << endl ;
cout << setiosflags(ios::showpoint) << setprecision(2) ;
cout << "Sch v" << setw(20) << 123.456 << endl;
cout << "Thc n" << setw(20) << 2453.6 << endl;
cout << "Qun o lnh" << setw(15) << 3200.0 << endl;
13
getch();
return ;
123.46
2453.60
3200.00
4. Vo/ra trong C
14
15
s in ra:
Chng trnh tnh tng 2 s nguyn:
i + j = 5.
Lnh ny cho php nhp d liu vo cho cc bin bin_1, , bin_n. Trong
dng nh dng cha cc nh dng v kiu bin (nguyn, thc, k t ) c vit nh
trong m t cu lnh printf. Cc bin c vit di dng a ch ca chng tc c du
& trc mi tn bin. V d cu lnh:
scanf(%d %f %ld, &x, &y, &z) ;
cho php nhp gi tr cho cc bin x, y, z trong x l bin nguyn, y l bin thc
v z l bin nguyn di (long). Cu lnh:
16
#include <conio.h>
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();
return ;
BI TP
1.
Nhng tn gi no sau y l hp l:
x
123variabe
tin_hoc
RADIUS
one.0
number#
Radius nam2000
2.
3.
17
#include (iostream.h)
void main();
{
cout << 'Day la chng trnh: Gptb1.\nXin chao cac ban';
getch();
}
4.
-124. 6
59.002
65.7
-1200.654
6.
7.
18
// in kt qu
cout << a << << << << << " nam " << ;
getch();
}
19
CHNG 2
Thng thng d liu hay dng l s v ch. Tuy nhin vic phn chia ch 2 loai
d liu l khng . d dng hn cho lp trnh, hu ht cc NNLT u phn chia d
liu thnh nhiu kiu khc nhau c gi l cc kiu c bn hay chun. Trn c s kt
hp cc kiu d liu chun, NSD c th t t ra cc kiu d liu mi phc v cho
chng trnh gii quyt bi ton ca mnh. C ngha lc mi i tng c qun l
trong chng trnh s l mt tp hp nhiu thng tin hn v c to thnh t nhiu
loi (kiu) d liu khc nhau. Di y chng ta s xt n mt s kiu d liu chun
c qui nh sn bi C++.
Mt bin nh bit l mt s nh lin tip no trong b nh dng lu
tr d liu (vo, ra hay kt qu trung gian) trong qu trnh hot ng ca chng trnh.
qun l cht ch cc bin, NSD cn khai bo cho chng trnh bit trc tn bin
v kiu ca d liu c cha trong bin. Vic khai bo ny s lm chng trnh qun
l cc bin d dng hn nh trong vic phn b b nh cng nh qun l cc tnh ton
trn bin theo nguyn tc: ch c cc d liu cng kiu vi nhau mi c php lm
ton vi nhau. Do , khi cp n mt kiu chun ca mt NNLT, thng thng
chng ta s xt n cc yu t sau:
tn kiu: l mt t dnh ring ch nh kiu ca d liu.
s byte trong b nh lu tr mt n v d liu thuc kiu ny: Thng
thng s byte ny ph thuc vo cc trnh bin dch v h thng my khc
nhau, y ta ch xt n h thng my PC thng dng hin nay.
Min gi tr ca kiu: Cho bit mt n v d liu thuc kiu ny s c th ly
20
Tn kiu
S nh
Min gi tr
K t
char
1 byte
unsigned char
1 byte
2 byte
128 .. 127
0 .. 255
S nguyn
int
unsigned int
S thc
32768 .. 32767
0 .. 65535
short
2 byte
2 byte
long
4 byte
215 .. 215 1
float
4 byte
10 -37 . . 10 +38
double
8 byte
10 -307 . . 10 +308
32768 .. 32767
21
unsigned e ;
// e c php gn gi tr t 0 n 255
c = 65 ; d = 179 ;
e = 179; f = 330 ;
// in ra ch ci 'A' v gi tr s 65
// in ra l k t '|' v gi tr s -77
// in ra l k t '|' v gi tr s 179
// in ra l k t 'J' v gi tr s 74
22
23
2. Hng thc
'\t'
k t tab
'\a'
'\r'
xung dng
'\f'
ko trang
'\\'
du \
'\?'
du chm hi ?
'\''
du nhy n '
'\"'
du nhy kp "
'\kkk' :
k t c m l kkk trong h 8
'\xkk' :
k t c m l kk trong h 16
V d:
cout << "Hm nay tri \t nng \a \a \a \n" ;
25
"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"
5. Khai bo hng
26
hoc:
const tn_hng = gi_tr_hng ;
V d:
#define sosv 50 ;
#define MAX 100 ;
const sosv = 50 ;
27
tn_kiu tn_bin_3 ;
V d:
void main()
{
int i, j ;
float x ;
char c, d[100] ;
unsigned int u ;
}
b. Khai bo c khi to
char c = 'Z';
}
2. Phm vi ca bin
28
// khi to i bng 3
n = 10;
// gn cho n gi tr 10
// in ra: 10, 3
i = n / 2;
// gn li gi tr ca i bng n/2 = 5
// in ra: 10, 5
Trong v d trn n c gn gi tr bng 10; trong cu lnh tip theo biu thc n/2
c tnh (bng 5) v sau gn kt qu cho bin i, tc i nhn kt qu bng 5 d trc
n c gi tr l 2 (trong trng hp ny vic khi to gi tr 2 cho bin i l khng
c ngha).
Mt khai bo c khi to cng tng ng vi mt khai bo v sau thm
lnh gn cho bin (v d int i = 3 cng tng ng vi 2 cu lnh int i; i = 3) tuy
nhin v mt bn cht khi to gi tr cho bin vn khc vi php ton gn nh ta s
thy trong cc phn sau.
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 ;
29
int i, j, k ;
i = j = k = 1;
Cc php ton + (cng), (tr), * (nhn) c hiu theo ngha thng thng
trong s hc.
Php ton a / b (chia) c thc hin theo kiu ca cc ton hng, tc nu c
hai ton hng l s nguyn th kt qu ca php chia ch ly phn nguyn,
ngc li nu 1 trong 2 ton hng l thc th kt qu l s thc. V d:
30
13/5 = 2
// do 13 v 5 l 2 s nguyn
// phn d ca 13/5
5%13 = 5
// phn d ca 5/13
Tng ng
Kt qu
j=j+1;i=j;
i = 16 , j = 16
i=j;j=j+1;
i = 15 , j = 16
j = ++i + 5 ;
i=i+1;j=i+5;
i = 4, j = 9
j = i++ + 5 ;
j = i + 5; i = i + 1;
i = 4, j = 8
Ghi ch: Vic kt hp php ton t tng gim vo trong biu thc hoc cu lnh
(nh v d trong phn sau) s lm chng trnh gn nhng kh hiu hn.
c. Cc php ton so snh v lgic
// nhn gi tr 1 v ng
3 == 5
// = 0 v sai
3 != 5
// = 1
3 + (5 < 2)
// = 3 v 5<2 bng 0
31
3 + (5 >= 2)
// = 4 v 5>=2 bng 1
Ch : cn phn bit php ton gn (=) v php ton so snh (==). Php gn va
gn gi tr cho bin va tr li gi tr bt k (l gi tr ca ton hng bn phi), trong
khi php so snh lun lun tr li gi tr 1 hoc 0.
Cc php ton lgic:
&& (v), || (hoc ), ! (khng, ph nh)
Hai ton hng ca loi php ton ny phi c kiu lgic tc ch nhn mt trong
hai gi tr "ng" (c th hin bi cc s nguyn khc 0) hoc "sai" (th hin bi 0).
Khi gi tr tr li ca php ton l 1 hoc 0 v c cho trong bng sau:
a
a && b
a || b
!a
Tm li:
Php ton "v" ng khi v ch khi hai ton hng cng ng
Php ton "hoc" sai khi v ch khi hai ton hng cng sai
Php ton "khng" (hoc "ph nh") ng khi v ch khi ton hng ca n
sai.
V d:
3 && (4 > 5)
!1
// = 0
! (4 + 3 < 7)
// = 1 v (4+3<7) bng 0
5 || (4 >= 6)
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)
32
cho kt qu x = 0 , i = 3 , j = 4
cho kt qu y = 0 , i = 2 , j = 4
cch vit hai biu thc l nh nhau (ngoi tr hon i v tr 2 ton hng ca php
ton &&). Vi gi thit i = 2 v j = 3 ta thy c hai biu thc trn cng nhn gi tr 0.
Tuy nhin cc gi tr ca i v j sau khi thc hin xong hai biu thc ny s c kt qu
khc nhau. C th vi biu thc u v ++i < 4 l ng nn chng trnh phi tip tc
tnh tip ++j > 5 nh gi c biu thc. Do vy sau khi nh gi xong c i v j
u c tng 1 (i=3, j=4). Trong khi vi biu thc sau do ++j > 5 l sai nn
chng trnh c th kt lun c ton b biu thc l sai m khng cn tnh tip ++i <
4. C ngha chng trnh sau khi nh gi xong ++j > 5 s dng v v vy ch c bin j
c tng 1, t ta c i = 2, j = 4 khc vi kt qu ca biu thc trn. V d ny mt
ln na nhc ta ch kim sot k vic s dng cc php ton t tng gim trong biu
thc v trong cu lnh.
2. Cc php gn
// x = 20 v 3+4<7 l sai
x = (3 + 4) ? 10: 20
x = (a > b) ? a: b
// x = s ln nht trong 2 s a, b.
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
c th c vit li bi:
Luong[Nhanvien[3][2*i+1]] *= 290;
3. Biu thc
34
// b = 5
a=a+b;
// a = 6
Khi tnh ton mt biu thc phn ln cc php ton u yu cu cc ton hng
phi cng kiu. V d php gn thc hin c th gi tr ca biu thc phi c cng
kiu vi bin. Trong trng hp kiu ca gi tr biu thc khc vi kiu ca php gn
th hoc l chng trnh s t ng chuyn kiu gi tr biu thc v thnh kiu ca bin
c gn (nu c) hoc s bo li. Do vy khi cn thit NSD phi s dng cc cu
lnh chuyn kiu ca biu thc cho ph hp vi kiu ca bin.
Chuyn kiu t ng: v mt nguyn tc, khi cn thit cc kiu c gi tr thp
s c chng trnh t ng chuyn ln kiu cao hn cho ph hp vi php
ton. C th php chuyn kiu c th c thc hin theo s nh sau:
char int long int float double
V d:
int i = 3;
float f ;
f = i + 2;
trong v d trn i c kiu nguyn v v vy i+2 cng c kiu nguyn trong khi f c
kiu thc. Tuy vy php ton gn ny l hp l v chng trnh s t ng chuyn kiu
35
i=f+2;
Trong v d trn cu lnh i = f+2 thc hin c ta phi p kiu ca biu thc
f+2 v thnh kiu nguyn. C php tng qut nh sau:
(tn_kiu)biu_thc
// c php c trong C
tn_kiu(biu_thc)
hoc:
trong tn_kiu l kiu cn c chuyn sang. Nh vy cu lnh trn phi c
vit li:
i = int(f + 2) ;
// hm sqrt(n) tr li cn bc hai ca s n
36
// x = 6 ?
cout << x ;
// ng
;
// ng
x = float(i) / float(j) * 10 ;
// ng
x = float(i/j) * 10 ;
// sai
37
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
BI TP
1.
Mt ch s
Mt ch ci
2.
3.
38
B Gio dc v o to
3:
S Gio dc H Ni
c lp - T do - Hnh phc
5.
6.
7.
8.
3+
3+ 3
b.
2+
1
2+
9.
1
2
c. 3a b3 2 c
b 2 4ac
b.
2a
d.
a 2 / b 4a / bc + 1
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:
p( p a )( p b )( p c ) ;
C = 2p = a + b + c ; S =
ha =
r=
2S
;
a
S
;
p
ma =
R=
1
2b 2 + 2c 2 a 2 ;
2
ga =
2
b+c
bcp( p a ) ;
abc
;
4S
14. Tnh din tch v th tch ca hnh cu bn knh R theo cng thc:
S = 4R2 ;
V = RS/3
40
CHNG 3
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
41
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
l tng ng vi
if (n>0) { if (a>b) c = a; else c = b;}
d. V d minh ho
42
#include <iostream.h>
#include <math.h>
// tp cha cc hm ton hc
void main()
{
float a, b, c;
// khai bo cc h s
float delta;
float x1, x2;
// 2 nghiem
// qui c nhp a 0
43
thc hin cu lnh switch u tin chng trnh tnh gi tr ca biu thc iu
khin (btk), sau so snh kt qu ca btk vi gi tr ca cc biu_thc_i bn di
ln lt t biu thc u tin (th nht) cho n biu thc cui cng (th n), nu gi tr
ca btk bng gi tr ca biu thc th i u tin no th chng trnh s thc hin
dy lnh th i v tip tc thc hin tt c dy lnh cn li (t dy lnh th i+1) cho n
ht (gp du ngoc ng } ca lnh switch). Nu qu trnh so snh khng gp biu thc
(nhnh case) no bng vi gi tr ca btk th chng trnh thc hin dy lnh trong
default v tip tc cho n ht (sau default c th cn nhng nhnh case khc). Trng
hp cu lnh switch khng c nhnh default v btk khng khp vi bt c nhnh case
no th chng trnh khng lm g, coi nh thc hin xong lnh switch.
Nu mun lnh switch ch thc hin nhnh th i (khi btk = biu_thc_i) m
khng phi thc hin thm cc lnh cn li th cui dy lnh th i thng thng ta t
thm lnh break; y l lnh cho php thot ra khi mt lnh cu trc bt k.
d. V d minh ho
44
{
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 ;
// in 4 s l
45
Trong chng trnh trn ta chp nhn cc k t x, ., * th hin cho php ton nhn
v :, / th hin php ton chia.
3. Cu lnh nhy goto
a. ngha
Mt dng khc ca r nhnh l cu lnh nhy goto cho php chng trnh chuyn
n thc hin mt on lnh khc bt u t mt im c nh du bi mt nhn
trong chng trnh. Nhn l mt tn gi do NSD t t theo cc qui tt t tn gi.
Lnh goto thng c s dng to vng lp. Tuy nhin vic xut hin nhiu lnh
goto dn n vic kh theo di trnh t thc hin chng trnh, 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
46
Bc
m (chia 2)
n (nhn 2)
kq (khi to kq = 0)
21
11
m l, cng thm 11 vo kq = 0 + 11 = 11
10
22
m chn, b qua
44
m l, cng thm 44 vo kq = 11 + 44 = 55
88
m chn, b qua
176
// Cc s cn nhn v kt qu kq
if (m%2) kq += n;
// nu m l th cng thm n vo kq
m = m >> 1;
n = n << 1;
// quay li nu m 0
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
a. C php
for (dy biu thc 1 ; iu kin lp ; dy biu thc 2) { khi lnh lp; }
// Cc s cn nhn v kt qu kq
48
49
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; }
(cu lnh kq += i++; c thc hin theo 2 bc: cng i vo kq v tng i (tng sau)).
Trong trng hp iu kin trong for cng trng chng trnh s ngm nh l
iu kin lun lun ng, tc vng lp s lp v hn ln (!). Trong trng hp ny
dng vng lp trong khi lnh cn c cu lnh kim tra dng v cu lnh break.
V d cu lnh for (i = 1 ; i <= 100 ; i ++) kq += i ; c vit li nh sau:
i = 1;
for ( ; ; )
{
kq += i++;
if (i > 100) break;
}
Tm li, vic s dng dng vit no ca for ph thuc vo thi quen ca NSD,
tuy nhin vic vit y cc thnh phn ca for lm cho vic c chng trnh tr
nn d dng hn.
e. Lnh for lng nhau
Trong dy lnh lp c th cha c lnh for, tc cc lnh for cng c php lng
nhau nh cc cu lnh c cu trc khc.
V d 4 : Bi ton c: va g va ch b li cho trn m 100 chn. Hi c my g
50
// s t 10, 20, 50
sopa = 0;
// s phng n
51
// nu tho th
{
sopa++;
// tng s phng n
// in s t 10 nu 0
// thm s t 20 nu0
// thm s t 50 nu0
// xung dng
}
cout << Tong so phuong an = << sopa ;
}
2. Lnh lp while
a. C php
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
52
long m, n, kq;
// Cc s cn nhn v kt qu kq
Trong chng trnh trn cu lnh while (m) c c l "trong khi m cn khc
0 thc hin ", ta thy trong khi lnh lp c lnh m >>= 1, lnh ny s nh hng
n iu kin (m), n lc no m bng 0 tc (m) l sai v chng trnh s dng lp.
Cu lnh while (m) cng c th c thay bng while (1) nh sau:
void main()
{
long m, n, kq;
// Cc s cn nhn v kt qu kq
}
cout << m nhn n = << kq ;
}
53
{
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++;
}
}
while (m != n) {
r=m-n;
if (r > n) m = r; else { m = n ; n = r ; }
}
cout << "UCLN = " << m ;
}
54
// cc im mt a, b v im gia c
// gi tr ca f(x) ti cc im a, c
// trong khi di on cn ln hn
{
c = (a + b)/2;
// tm im c gia on [a,b]
if (fa*fc == 0) break;
// f(c) = 0 tc c l nghim
Trong chng trnh trn cu lnh if (fa*fc > 0) a = c; else b = c; dng kim tra
f(a) v f(c), nu cng du (f(a)*f(c) > 0) th hm f(x) phi tri du trn on con [c, b]
do t li on ny l [a, b] ( quay li vng lp) tc t a = c v b gi nguyn,
ngc li nu hm f(x) tri du trn on con [a, c] th t li b = c cn a gi nguyn.
Sau vng lp quay li kim tra di on [a, b] (mi) nu b hn xp x th
dng v ly c lm nghim xp x, nu khng th tnh li c v tip tc qu trnh.
tnh f(a) v f(c) chng trnh s dng hm exp(x), y l hm cho li kt
qu ex, dng hm ny hoc cc hm ton hc ni chung, cn khai bo file nguyn
55
mu math.h.
3. Lnh lp do ... while
a. C php
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
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
<10 6 .
2
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
// n: s cn kim tra
}
i++;
} while (i <= n/2);
cout << n << "l s nguyn t" ;
}
// s lng cc loi k t
n1 = n2 = n3 = n4 = 0;
cout << Hy nhp dy k t: \n ;
do
{
cin >> c;
if (a <= c && c <= z) n1++;
// nu c l ch thng th tng n1
// ch hoa, tng n2
// ch s, tng n3
else n4++;
57
// in kt qu
// cn lp khi c cn khc k t
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
// dy lnh khc
.
.
.
}
}
58
59
// khng khi to
// c khi to
60
c. Cch s dng
i.
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] ;
// sai
61
// t s
// mu s
khc phc nhc im ny, trong cc chng sau C++ cung cp mt kiu d
liu mi gi l lp, v cho php NSD c th nh ngha ring php cng cho 2 mng
tu , khi c th vit mt cch n gin v quen thuc c = a + b cng 2 phn s.
d. V d minh ho
// a cha ti a 50 s
// nhp s phn t
for (i=0; i<n; i++) { cout << "a[" << i << "] = " ; cin >> a[i]; } // nhp dy s
sd = sa = s0 = 0 ;
for (i=1; i<n; i++) {
if (a[i] > 0 ) sd++;
if (a[i] < 0 ) sa++;
if (a[i] == 0 ) s0++;
}
cout << "S s dng = " << sd << " s s m = " << sa ;
62
// a cha ti a 100 s
// nhp d liu
// i ch
63
// in kt qu
getch();
}
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
H
H
\0
1
E
E
H
2
L
L
E
3
L
\0
L
4
O
L
L
5 6 7
\0
O \0
O \0
// khng khi to
// c khi to
// c khi to
64
// xu h tn cha ti a 25 k t
// di mng = 9
b. Cch s dng
// in k t u tin, tc k t 'I'
s[1] = 'a' ;
// t li k t th 2 l 'a'
// khai bo hai xu s v t
t = "Hello" ;
t=s;
if (s < t)
65
V d 2 : Nhp mt ngy thng dng M (mm/dd/yy), i sang ngy thng dng Vit
Nam ri in ra mn hnh.
#include <iostream.h>
main()
{
char US[9], VN[9] = " / / " ;
cin.getline(US, 9) ;
66
// ngy
// thng
// nm
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) ;
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
// ngy
strncpy(VN+3, US+0, 2) ;
// thng
// nm
strcat(s, t);
Ni mt bn sao ca t vo sau s (thay cho php +). Hin nhin hm s loi b k
t kt thc xu s trc khi ni thm t. Vic ni s m bo ly c k t kt thc ca xu
t vo cho s (nu s ch) v vy NSD khng cn thm k t ny vo cui xu. Tuy
nhin, hm khng kim tra xem liu di ca s c ch ni thm ni dung, vic
kim tra ny phi do NSD m nhim. V d:
char a[100] = "Mn", b[4] = "ti";
strcat(a, v );
strcat(a, b);
cout << a
// Mn v ti
// s = "Ste"
strcat(s, "p");
// s = "Step"
cout << t << " goes "<< s << " by " <<s
strncat(s, t, n);
Ni bn sao n k t u tin ca xu t vo sau xu s. Hm t ng t thm du
kt thc xu vo s sau khi ni xong (tng phn vi strncpy()). Cng ging strcat hm
i hi di ca s phi cha kt qu. Tng t, c th s dng cch vit strncat(s,
t+k, n) ni n k t t v tr th k ca xu t cho s.
V d:
char s[20] = "Nh " ;
char t[] = "vua cha"
strncat(s, t, 3) ;
// s = "Nh vua"
hoc:
strncat(s, t+4, 4) ;
strcmp(s, t);
68
// s = "Nh cha"
strncmp(s, t) ;
Ging hm strcmp(s, t) nhng ch so snh ti a n k t u tin ca hai xu.
V d:
char s[] = "H Ni" , t[] = "H ni" ;
cout << strcmp(s,t) ;
// 0 (v 3 k t u ca s v t l nh
strcmpi(s, t) ;
Nh strcmp(s, t) nhng khng phn bit ch hoa, thng.
V d:
char s[] = "H Ni" , t[] = "h ni" ;
cout << strcmpi(s, t) ;
// 0 (v s = t)
strupr(s);
Hm i xu s thnh in hoa, v cng tr li xu in hoa .
V d:
char s[10] = "Ha noi" ;
cout << strupr(s) ;
// HA NOI
cout << s ;
strlwr(s);
Hm i xu s thnh in thung, kt qu tr li l xu s.
V d:
char s[10] = "Ha Noi" ;
cout << strlwr(s) ;
// ha noi
cout << s ;
69
strlen(s) ;
Hm tr gi tr l di ca xu s.
V d:
char s[10] = "Ha Noi" ;
cout << strlen(s) ;
// 5
// di ti a l 99 k t
cin.getline(s, 100);
// nhp xu s
// chy t u n cui xu
70
// nhp xu s
// nhp xu s
int i, j ;
i = j = 0;
while (s[i++] == ' '); i-- ;
s[j+1] = '\0' ;
// t du kt thc xu
cout << s ;
}
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
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) ;
clrscr();
// xo mn hnh
char hien[31] ;
// cha xu di 30 k t hin
i = 0;
while (!kbhit()) {
delay(100);
i++; if (i==dd) i = 0;
// tng i
}
}
72
#include <string.h>
void main()
{
char pw[11]; int solan = 0;
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
Hnh trn minh ho hnh thc mt mng hai chiu vi 3 dng, 4 ct. Thc cht
73
dng 0
dng 1
dng 2
a. Khai bo
vi khi to ny ta c ma trn:
1
74
// s hng, ct ca ma trn
int i, j ;
// cc ch s trong vng lp
// 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
{
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] ;
76
int m, n, p ;
// s hng, ct ca ma trn
int i, j, k ;
// cc ch s trong vng lp
clrscr();
cout << "Nhp s hng v ct ca 2 ma trn: " ; cin >> m >> n >> p;
// Nhp ma trn A
for (i=1; i<=m; i++)
for (j=1; j<=n; j++)
{
cout << "A[" << i << "," << j << "] = " ; cin >> A[i][j] ;
}
// Nhp ma trn B
for (i=1; i<=n; i++)
for (j=1; j<=p; j++)
{
cout << "B[" << i << "," << j << "] = " ; cin >> B[i][j] ;
}
// 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
BI TP
Lnh r nhnh
1.
2.
3.
Cho n = x = y v bng:
a. 1
b. 2
c. 3
d. 4
4.
Tnh gi tr hm
a.
3x + x
f(x) = x
e +4
x 2 +1
b. f ( x ) = 3x + 5
2
x + 2 x 1
, x>0
, x0
, x 1
, 1< x <1
, x 1
5.
ax + by = c
Vit chng trnh gii h phng trnh bc nht 2 n:
dx + ey = f
6.
7.
8.
9.
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
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) ;
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:
a. S1 =
b. S 2 =
1 + 2 + 3 + ... + N
N
12 + 2 2 + 3 2 + ... + N 2
a. S1 = 3 + 3 + 3 + ... + 3
b. S 2 =
n du chia
2+
2+
n du cn
1
2+. . .
1
2
79
dng lp khi
xn
x1 x 2
xn
< 10 6 .
+ + ... +
dng lp khi
n!
1! 2!
n!
x 2 n +1
x3 x5
x 2 n +1
n
< 10 6 .
c. sin x = x + + . . . + ( 1 )
, dng lp khi
( 2n + 1 )!
3! 5!
( 2n + 1 )!
d.
n=0
a
a ( a > 0 ) theo cng thc: s n = 2
, dng khi
+
>
(
s
a
)
/
2
s
n
0
n 1
n 1
6
s n s n 1 <10 .
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
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:
81
82
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.
1. a ch, php ton &
83
long y;
// in a ch cc bin x, y
char s[9];
// khai bo mng k t s
cout << a;
// in a ch mng s
// in a ch k t s[2]
650 651
2
x
O
s
658
\0
84
float *q, *r ;
int *p, *q ;
p = &i;
// cho p tr ti i
q = &j;
// cho q tr ti j
// hi a ch bin i
cout << q ;
i = 2;
// gn i bng 2
*q = 5;
// tng i v hi i, i = 3
85
(*p) = (*q) * 2 + 1;
// gn li i (thng qua p)
cout << i ;
// 13
p = q = r = &i ;
// cng tr ti i
*p = q**q + 2**r + 1 ;
// i = 10*10 + 2*10 + 1
cout << i ;
// 121
195
196
197
198
199
200
p
201
202
p+1
Nh vy, php ton tng, gim con tr cho php lm vic thun li trn mng.
Nu con tr ang tr n mng (tc ang cha a ch u tin ca mng), vic tng
con tr ln 1 n v s dch chuyn 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
V d 3 :
int a[100] = { 1, 2, 3, 4, 5, 6, 7 }, *p, *q;
p = a; cout << *p ;
p += 5; cout << *p ;
// *p = a[5] = 6 ;
q = p - 4 ; cout << *q ;
// q = a[1] = 2 ;
// in ton b mng a
++(*p) ;
*(p++) ;
*(++p) ;
Ch :
Phn bit p+1 v p++ (hoc ++p):
p+1 c xem nh mt con tr khc vi p. p+1 tr n phn t sau p.
p++ l con tr p nhng tr n phn t khc. p++ tr n phn t ng sau
phn t p tr n ban u.
Phn bit *(p++) v *(++p):
Cc php ton t tng gim cng l mt ngi, mc u tin ca chng l cao hn
cc php ton hai ngi khc v cao hn php ly gi tr (*). C th:
*p++
*(p++)
*++p
*(++p)
++*p
++(*p)
87
d. Hiu ca 2 con tr
Cc php ton so snh cng c p dng i vi con tr, thc cht l so snh
gia a ch ca hai ni c tr bi cc con tr ny. Thng thng cc php so snh
<, <=, >, >= ch p dng cho hai con tr tr n phn t ca cng mt mng d liu
no . Thc cht ca php so snh ny chnh l so snh ch s ca 2 phn t c tr
bi 2 con tr .
V d 5 :
float a[100], *p, *q ;
p=a;
q = &a[3] ;
// 1
cout << (p + 3 == q) ;
// 1
// 0
// 0
// in ton b mng a
Khi tin hnh chy chng trnh, chng trnh dch s b tr cc nh c th cho
cc bin c khai bo trong chng trnh. V tr cng nh s lng cc nh ny tn
ti v c nh trong sut thi gian chy chng trnh, chng xem nh b chim dng
v s khng c s dng vo mc ch khc v ch c gii phng sau khi chm dt
chng trnh. Vic phn b b nh nh vy c gi l cp pht tnh (v c cp sn
trc khi chy chng trnh v khng th thay i tng, gim kch thc hoc v tr
trong sut qu trnh chy chng trnh). V d nu ta khai bo mt mng nguyn cha
1000 s th trong b nh s c mt vng nh lin tc 2000 bytes cha d liu ca
mng ny. Khi d trong chng trnh ta ch nhp vo mng v lm vic vi mt vi
s th phn mng ri cn li vn khng c s dng vo vic khc. y l hn ch
th nht ca kiu mng. mt hng khc, mt ln no chy chng trnh ta li
88
// cp pht 1 phn t
p = new <kiu>[n] ;
// cp pht n phn t
V d:
int *p ;
p = new int
p = float int[100] ;
Ghi ch: lnh exit(0) cho php thot khi chng trnh, s dng lnh ny cn
khai bo file tiu <process.h>.
89
v gii phng ton b mng c cp php thng qua con tr p ta dng cu lnh:
delete[] p ;
// p l con tr tr n mng
// nhp dy
{
cout << "So thu " << p-head+1 << ": " ; cin >> *p ;
}
for (p=head; p<head+n-1; p++)
// sp xp
// i ch
// in kt qu
}
5. Con tr v mng, xu k t
a. Con tr v mng 1 chiu
90
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
91
strcpy(s, "Hello") ;
t=s;
nhng:
char *s = new char[30], *t ;
strcpy(s, "Hello") ;
t = new char[30];
strcpy(t, s) ;
a+1
Cc cch ng:
92
p = (float*)a;
p = a[0];
// gn vi a ch ca mng a[0]
p = &a[0][0];
tr ti a[0][0]
p+1 tr ti a[0][1]
p+2 tr ti a[0][2]
p+3 tr ti a[1][0]
p+4 tr ti a[1][1]
p+5 tr ti a[1][2]
hoc
// in a[i][j]
V d sau y cho php nhp v in mt mng 2 chiu m*n (m dng, n ct) thng
qua con tr p. Nhp lin tip m*n s vo mng v in thnh ma trn m dng, n ct.
main()
{
clrscr();
float a[m][n], *p;
int i, j;
p = (float*) a;
for (i=0; i<m*n; i++) cin >> *(p+i);
// in li di dng ma trn
{
for (j=0; j<n; j++) cout << *(p+i*n+j);
cout << endl;
93
}
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
a. Khi nim chung
V d:
int *a[10];
int i, n;
cout << "so dong = "; cin >> n ; // nhp s dng thc s
cin.ignore();
for (i=0; i<n; i++)
94
{
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
95
int rand100();
dy lnh ca hm ;
return (biu thc tr v);
// c th nm u trong dy lnh.
96
// bin ch s
double kq = 1 ;
// lu kt qu
Hm khng tr v gi tr
Nu hm khng tr li gi tr (tc kiu hm l void), khi c th c hoc khng
c cu lnh return, nu c th ng sau return s khng c biu thc gi tr tr li.
V d 3 : Hm xo mn hnh 100 ln, hm ch lm cng vic cn thn xo mn hnh
nhiu ln mn hnh tht sch, nn khng c gi tr g tr li.
void xmh()
{
int i;
for (i=1; i<=100; i++) clrscr();
return ;
}
97
c. Ch v khai bo v nh ngha hm
98
// tr li gi tr xn
{
int i ;
// bin ch s
double kq = 1 ;
// lu kt qu
// xo mn hnh n ln
{
int i;
for (i=1; i<=n; i++) clrscr();
return ;
}
main()
{
float x ;
// tn bin c th trng vi i ca hm
double f ;
// lu kt qu
99
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
4. Khai bo hm trng tn
2:
3:
4:
101
5:
// v ng thng AB
// v t gic ABCD
<kiu bin> &<tn bin tham chiu> = <tn bin c tham chiu>;
// 3 3
teo = ti + hung ;
dung ++ ;
// tng ng teo ++
// 7 7
// 7
103
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.
6. Cc cch truyn tham i
C 3 cch truyn tham i thc s cho cc tham i hnh thc trong li gi hm.
Trong cch ta dng cho n thi im hin nay c gi l truyn theo tham tr,
tc cc i hnh thc s nhn cc gi tr c th t li gi hm v tin hnh tnh ton ri
tr li gi tr. d hiu cc cch truyn i chng ta s xem qua cch thc chng
trnh thc hin vi cc i khi thc hin hm.
a. Truyn theo tham tr
104
// 2, 5 (x, y vn khng i)
Thc s sau khi chy xong chng trnh ta thy gi tr ca x v y vn khng thay
i !?.
Nh gii thch trong mc trn (gi hm luythua), vic u tin khi chng
trnh thc hin mt hm l to ra cc bin mi (cc nh mi, c lp vi cc nh x,
y c sn) tng ng vi cc tham i, trong trng hp ny cng c tn l x, y v
gn ni dung ca x, y (ngoi hm) cho x, y (mi). V vic cui cng ca chng trnh
sau khi thc hin xong hm l xo cc bin mi ny. Do vy ni dung ca cc bin mi
thc s l c thay i, nhng khng nh hng g n cc bin x, y c. Hnh v di
y minh ho cch lm vic ca hm swap, trc, trong v sau khi gi hm.
Trc
x
2
Trong
y
5
x
2
t
2
2
2
x'
2
5
5
Sau
y
5
x
2
y
5
y'
5
5
2
Cc bin tm b
xo khi chy
xong hm
105
// khai bo bin tm t
t = *p ;
// t gi tr ca t bng ni dung ni p tr ti
*p = *q ;
*q = t ;
106
// cha
d = (b*b) - 4*a*c ;
if (d < 0) return 0 ;
else if (d == 0) { *p = -b/(2*a) ; return 1 ; }
else {
*p = (-b + sqrt(d))/(2*a) ;
*q = (-b - sqrt(d))/(2*a) ;
return 2 ;
}
}
// cc h s
float x1, x2 ;
// cc nghim
107
108
Tham tr
Tham chiu
Dn tr
Khai bo i
void swap(int x, int y) void swap(int &x, int &y) void swap(int *x, int *y)
Cu lnh
t = x; x = y; y = t;
t = x; x = y; y = t;
t = *x; *x = *y; *y = t;
Li gi
swap(a, b);
swap(a, b);
swap(&a, &b);
Tc dng
a, b khng thay i
a, b c thay i
a, b c thay i
7. Hm v mng d liu
a. Truyn mng 1 chiu cho hm
Thng thng chng ta hay xy dng cc hm lm vic trn mng nh vect hay
ma trn cc phn t. Khi tham i thc s ca hm s l cc mng d liu ny.
Trong trng hp ny ta c 2 cch khai bo i. Cch th nht i c khai bo bnh
thng nh khai bo bin mng nhng khng cn c s phn t km theo, v d:
int x[];
float x[];
Cch th hai khai bo i nh mt con tr kiu phn t mng, v d:
int *p;
float *p
Trong li gi hm tn mng a s c vit vo danh sch tham i thc s, v a l
a ch ca phn t u tin ca mng a, nn khi hm c gi a ch ny s gn cho
con tr p. V vy gi tr ca phn t th i ca a c th c truy cp bi x[i] (theo khai
bo 1) hoc *(p+i) (theo khai bo 2) v n cng c th c thay i thc s (do y
cng l cch truyn theo dn tr).
Sau y l v d n gin, nhp v in vect, minh ho cho c 2 kiu khai bo i.
V d 8 : Hm nhp v in gi tr 1 vect
void nhap(int x[], int n)
// n: s phn t
{
int i;
for (i=0; i<n; i++) cin >> x[i];
}
void in(int *p, int n)
{
109
int i;
for (i=0; i<n; i++) cout << *(p+i);
}
main()
{
int a[10] ;
nhap(a,7);
in(a,3);
// ra 3 phn t u tin ca a
}
b. Truyn mng 2 chiu cho hm
float (*x)[n] ;
110
// m: s dng, n: s ct
float t = 0;
int i, j ;
for (i=0; i<m; i++)
for (j=0; j<n; j++) t += x[i][j] ;
return t;
}
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
// nhp ma trn b
// sai v s ct ca b khc 10
// m: s dng, n: s ct
111
int k, kmin;
for (k=1; k<m*n; k++)
if (min > *(x+k)) { min = *(x+k) ; kmin = k; }
cout << "Gi tr min la: " << min << " ti dng " << k/n << " ct " << k%n;
}
main()
{
float a[8][10], b[5][7] ;
int i, j ;
for (i=0; i<8; i++)
// nhp ma trn a
// nhp ma trn b
// 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
112
{
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
// cng v in kt qu a+b
113
// gi tr tr li l con tr tr n dy s nguyn
{
int kq[3] = { 1, 2, 3 };
// to mng kt qu vi 3 gi tr 1, 2, 3
return kq ;
// tr li a ch cho con tr kt qu hm
}
int* tragiatri2()
// gi tr tr li l con tr tr n dy s nguyn
{
int *kq = new int[4];
// cp pht 3 nh nguyn
// to mng kt qu vi 3 gi tr 1, 2, 3
return kq ;
// tr li a ch cho con tr kt qu hm
}
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
114
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
// nhp s phn t
// nhp vect a
// nhp vect b
c = congvt(a, b, n);
for (i=0; i<n; i++) cout << c[i] ;
// in kt qu
115
// z lu kt qu
{
for (int i=0; i<n; i++) z[i] = x[i] + y[i];
}
main()
{
int i, n, a[10], b[10], c[10] ;
cout << "n = " ; cin >> n;
// nhp s phn t
// nhp vect a
// nhp vect b
congvt(a, b, c, n);
for (i=0; i<n; i++) cout << c[i] ;
// in kt qu
// 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
116
}
}
main()
{
int a[10][10], b[10][10], c[10][10] ;
// khai bo 3 mng a, b, c
int m, n, p ;
// nhp s phn t
// nhp ma trn a
// nhp ma trn b
// gi hm
// 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
117
// hm tr li h
{
char* kq = new char[10];
// cp b nh cha h
int i=0;
while (hoten[i] != '\40') i++;
strncpy(kq, hoten, i) ;
// copy i k t ca hoten vo kq
return kq;
}
char* ten(char* hoten)
// hm tr li tn
{
char* kq = new char[10];
// cp b nh cha tn
int i=strlen(hoten);
while (hoten[i] != '\40') i--;
strncpy(ho, hoten, i) ;
// copy i k t ca hoten vo ho
i=strlen(hoten);
while (hoten[i] != '\40') i--;
118
// cc bin h tn, h, tn
}
main()
{
char *s = "abcde" ;
inhoa(s);
// abcdeABCDE
}
8. Con tr hm
119
// khai bo con tr hm c tn l f tr n hm
// c mt tham i kiu int v cho gi tr kiu float.
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
f = luythua;
// cho f tr n hm lu tha
c. S dng con tr hm
120
// hm tr li x2
{
return x*x;
}
void main()
{
float (*f)(float);
f = bphuong;
cout << "Bnh phng ca 3.5 l " << f(3.5) ;
}
121
{ return (exp(x)-2); }
float logx(float x)
{ return (log(x)-1); }
d. Mng con tr hm
{ 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
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
1. Khi nim qui
Mt khc, n! giai tha cng c tnh thng qua (n-1)! bi cng thc truy hi
n! = 1
nu n = 0
n! = (n-1)!n
nu n > 0
123
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.
2. Lp cc bi ton gii c bng qui
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, ...
3. Cu trc chung ca hm qui
// gi nh c cch gii
}
else
{
gi li hm vi tham i "b" hn
}
4. Cc v d
{
if (a < b) UCLN(a, b-a);
if (a == b) return a;
if (a > b) UCLN(a-b, b);
}
125
126
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)
{
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) ;
// 1 tng t tg v li den
}
}
main()
{
int sotang ;
cout << "S tng = " ; cin >> sotang;
chuyen(sotang, 1, 2);
}
127
// hm tr gi tr xn
{
int i ;
float kq = 1;
for (i=1; i<=n; i++) kq *= x;
return kq;
}
void xmh(int n)
// xo mn hnh n ln
{
int i;
for (i=1; i<=n; i++) clrscr();
}
main()
{
float x; int n;
cout << "Nhp x v n: "; cin >> x >> n;
xmh(5);
// xo mn hnh 5 ln
// in xn
128
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
129
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
// in xn
130
// khng dng n
// xo mn hnh 5 ln
// in xi, kt qu x = 23 = 8 ?
s dng hng c th khai bo thm t kho const trc khai bo bin. Phm vi
v min tc dng cng nh bin, c ngha bin hng cng c th dng cc b hoc
ton th. Bin hng lun lun c khi to trc.
C th khai bo t kho const trc cc tham i hnh thc khng cho php
thay i gi tr ca cc bin ngoi (c bit i vi vi mng v xu k t, v bn thn
cc bin ny c xem nh con tr do hm c th thay i c gi tr ca cc bin
ngoi truyn cho hm ny).
V d sau th hin hng cng c th c khai bo cc phm vi khc nhau.
const int MAX = 30;
// ton th
// cc b
{
const MAX = 10;
// cc b
}
void main()
{
const MAX = 5;
132
// cc b
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,
b. Bin tnh v t kho static
}
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
}
c. Bin thanh ghi v t kho register
tng tc tnh ton C++ cho php mt s bin c t trc tip vo thanh
ghi thay v b nh. Khai bo bng t kho register ng trc khai bo bin. Tuy
133
int i;
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
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 ;
}
135
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
#define begin {
#define end }
#define TRUE 1
136
Ok = 1;
cout << i ;
}
// 6
Ch th:
#if dy lnh #endif
#if dy lnh #else dy lnh #endif,
137
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
{
return (a>b? a: b);
}
// nu cha nh ngha tn gi
#define _MYLIB_
// th nh ngha n
// v cc hm khc
{
return (a>b? a: b);
}
139
#endif
BI TP
Con tr
1.
2.
3.
4.
5.
6.
140
8.
9.
B: Nu x = y + z th *px = y + z
D: a, b, c ng
10. Cho khai bo float x, y, z, *px, *py; v cc lnh px = &x; py = &y; C th khng
nh ?
A: Nu *px = x th *py = y
C: Nu *px = y - z th x = y - z
D: a, b, c ng
D: b v c ng
141
Hy chn cu ng nht:
A: Chng trnh trn l hon chnh
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
1 + 2 + 3 + ... + N
N
b. S 2 =
1.
12 + 2 2 + 3 2 + ... + N 2
n du chia
2+
2+
n du cn
1
2+. . .
1
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
144
d. Thp H Ni
CHNG 5
145
// kiu c trong C
// trong C++
hoc
Cc bin c khai bo cng c th i km khi to:
<tn cu trc> bin = { gi tr khi to } ;
V d:
Khai bo kiu cu trc cha phn s gm 2 thnh phn nguyn cha t s v
mu s.
struct Phanso
{
int tu ;
int mau ;
};
hoc:
struct Phanso { int tu, mau ; }
Kiu ngy thng gm 3 thnh phn nguyn cha ngy, thng, nm.
struct Ngaythang {
int ng ;
int th ;
int nam ;
} holiday = { 1,5,2000 } ;
146
int soluong;
};
struct Lop daihoc = {"K41T", 60}, caodang ;
hoc:
Lop daihoc = {"K41T", 60}, caodang ;
147
};
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
p = new Sinhvien ;
strcpy(photen, y.hoten) ;
// gn h tn ca y cho sv tr bi p
// in hoten ca y v con tr p
i vi bin mng: truy nhp thnh phn mng ri n thnh phn cu trc.
V d:
strcpy(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,
Cng ging cc bin mng, lm vic vi mt bin cu trc chng ta phi thc
hin thao tc trn tng thnh phn ca chng. V d vo/ra mt bin cu trc phi vit
148
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
p = new Sinhvien[1] ; *p = x ;
cout << "Thng tin v sinh vin y l:" << endl ;
cout << "H v tn: " << y.hoten << endl;
cout << "Sinh ngy: " << y.ns.ng << "/" << y.ns.th << "/" << y.ns.nam ;
cout << "Gii tnh: " << (y.gt = 1) ? "Nam": "N ;
cout << y.diem
// c
// khng c
y = x;
// c
4. Cc v d minh ho
150
// nhp a
// nhp b
// tnh v in a+b
c.mau = a.mau*b.mau;
cout << "a + b = " << c.tu << "/" << c.mau;
c.tu = a.tu*b.mau - a.mau*b.tu;
// tnh v in a-b
c.mau = a.mau*b.mau;
cout << "a - b = " << c.tu << "/" << c.mau;
c.tu = a.tu*b.tu;
// tnh v in axb
c.mau = a.mau*b.mau;
cout << "a + b = " << c.tu << "/" << c.mau;
c.tu = a.tu*b.mau;
// tnh v in a/b
c.mau = a.mau*b.tu;
cout << "a + b = " << c.tu << "/" << c.mau;
getch();
}
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
// 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 ;
}
}
// Tm im cao nht
152
// In danh sch
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
pdiem = 5.0;
p = &lop[10] ;
*p = y ;
// gn li sinh vin th 10 l y
(*p).gt = 2;
154
Sinhvien *p ;
p = &lop ;
// in h tn sinh vin th 10
// in im ca sinh vin th 10
ht = x.ht ;
gt = &(lop[10].gt) ;
// gt tr n gt ca sinh vin th 10
d = &(pdiem) ;
// p tr n diem ca sv p ang tr
cout << ht ;
// in h tn sinh vin x
cout << *d ;
c. i ca hm l cu trc
155
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
// ngy 1/1/2000 l th by
Hm dch mt s d sang th
157
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));
}
158
float diem ;
};
Sinhvien lop[3];
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) ;
}
159
Hm nhapds nhp thng tin ca mi sinh vin trong mng, s dng con tr
mng Sinhvien lm tham i hnh thc. Trong li gi s dng tn mng
truyn cho hm.
void nhapds(Sinhvien *a)
{
int sosv = sizeof(lop) / sizeof(Sinhvien) -1;
// b phn t 0
Hm suads cho php sa thng tin ca sinh vin trong mng, s dng con tr
mng Sinhvien lm tham i hnh thc. Trong li gi s dng tn mng
truyn cho hm.
void suads(Sinhvien *a)
{
int chon;
cout << "Chn sinh vin cn sa: " ; cin >> chon ; cin.ignore();
sua(a[chon]) ;
}
Hm inds hin thng tin ca mi sinh vin trong mng, s dng hng con tr
mng Sinhvien lm tham i hnh thc. Trong li gi s dng tn mng
truyn cho hm.
160
// b phn t 0
{
float thuc;
float ao;
};
161
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 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
// nh cp pht vng nh
// tr li con tr kq
// b thnh phn th 0
float maxdiem = 0;
int kmax;
// ch s sv c im max
// tr li sv c im max
163
Hm chnh
void main()
{
clrscr();
int i;
int sosv = sizeof(lop)/sizeof(Sinhvien)-1;
// b thnh phn th 0
// in danh sch lp
in(b);
getch();
}
6. Cu trc vi thnh phn kiu bit
a. Trng bit
164
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
Tit kim b nh
Dng trong kiu union ly cc bit ca mt t (xem v d trong phn kiu
hp).
165
7. Cu lnh typedef
// in 2 2 2
// in 50
166
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
// nh ngha tn cu trc
V d:
typedef struct Sv Sinhvien ;
struct Sv
{
char hoten[30] ;
float diem ;
Sinhvien *tiep ;
};
167
Cch 2:
struct <tn cu trc>
{
cc thnh phn cha thng tin ;
<tn cu trc> *con tr ;
};
typedef <tn cu trc> <tn kiu> ;
// nh ngha tn cu trc t tr
V d:
struct Sv
{
char hoten[30] ;
float diem ;
Sv *tiep ;
};
typedef Sv Sinhvien ;
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
{
};
Cch 4:
168
char hoten[30] ;
float diem ;
Sinhvien *tiep ;
V d:
struct Sinhvien
{
char hoten[30] ;
float diem ;
Sinhvien *tiep ;
};
Trong cc cch trn ta thy 2 cch khai bo cui cng l n gin nht. C++ quan
nim cc tn gi ng sau cc t kho struct, union, enum l cc tn kiu (d khng c
t kho typedef), do vy c th s dng cc tn ny khai bo.
2. Khi nim danh sch lin kt
Danh sch lin kt l mt cu trc d liu cho php th hin v qun l danh sch
bng cc cu trc lin kt vi nhau thng qua cc con tr trong cu trc. C nhiu dng
danh sch lin kt ph thuc vo cc kt ni, v d:
Danh sch lin kt n, mi cu trc cha mt con tr tr n cu trc tip
theo hoc trc . i vi danh sch con tr tr v trc, cu trc u tin
ca danh sch s tr v hng con tr NULL, cu trc cui cng c nh du
bi con tr last l con tr tr vo cu trc ny. i vi danh sch con tr tr
v cu trc tip theo, cu trc u s c nh du bng con tr head v cu
trc cui cng cha con tr NULL.
Danh sch lin kt kp gm 2 con tr, mt tr n cu trc trc v mt tr
n cu trc sau, 2 u ca danh sch c nh du bi cc con tr head,
last.
Danh sch lin kt vng gm 1 con tr tr v sau (hoc trc), hai u ca
danh sch c ni vi nhau to thnh vng trn. Ch cn mt con tr head
nh du u danh sch.
Do trong cu trc c cha cc con tr tr n cu trc tip theo v/hoc cu trc
ng trc nn t mt cu trc ny chng ta c th truy cp n mt cu trc khc
169
NVA
9.0
TTB
7.5
PHT
4.0
NULL
170
head
MOI
0.0
NVA
9.0
TTB
7.5
PHT
4.0
NULL
u
0.0
i
9.0
i+1
7.5
cui
4.0
NULL
171
i-1
0.0
i
9.0
i+1
7.5
cui
4.0
NULL
Xa phn t th i
c. Duyt danh sch
Duyt l thao tc i qua tng phn t ca danh sch, ti mi phn t chng trnh
thc hin mt cng vic g trn phn t m ta gi l thm phn t . Mt php
thm c th n gin l hin ni dung thng tin ca phn t ra mn hnh chng hn.
duyt danh sch ta ch cn cho mt con tr p chy t u n cui danh sch n
khi phn t cui c con tr tiep = NULL th dng. Cu lnh cho con tr p chuyn n
phn t tip theo ca n l:
p = p tiep ;
d. Tm kim
172
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
// Con tr ti sv hin ti
int sosv = 0;
// S sv ca danh sch
{
Sinhvien *kq = new Sinhvien[1] ;
// Cp pht b nh cho kq
// B sung sv mi vo cui ds
{
cur = Nhap1sv();
173
// Chn sv mi vo trc sv th n
{
cur = Nhap1sv();
if (sosv==0) { dau = cuoi = cur; sosv++; return; }
if (sosv==1 || n==1) {cur->tiep = dau; dau = cur; sosv++; return;}
Sinhvien *truoc, *sau;
truoc = dau;
sau = dau -> tiep;
for (int i=1; i<n-1; i++) truoc = truoc->tiep;
sau = truoc->tiep;
truoc->tiep = cur;
cur -> tiep = sau;
sosv ++;
}
// Chn sv mi vo sau sv th n
{
cur = Nhap1sv();
if (sosv==0 || sosv<n) { dau = cuoi = cur; sosv++; return; }
Sinhvien *truoc, *sau;
truoc = dau; sau = dau -> tiep;
for (int i=1; i<n; i++) truoc = truoc->tiep;
sau = truoc->tiep;
truoc->tiep = cur;
174
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 --;
}
// To danh sch
{
int tiep = 1;
while (tiep) {
Bosung();
cout << "Tiep (0/1) ? " ; cin >> tiep ;
}
}
// In danh sch
175
cur = dau;
int i=1;
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
2. Truy cp
177
V d:
enum Bool {false, true};
hai bin Ok v found s ch nhn 1 trong 2 gi tr false (thay cho 0) hoc true
(thay cho 1). C ngha c th gn:
Ok = true;
hoc:
found = false;
Tuy nhin khng th gn cc gi tr nguyn trc tip cho cc bin enum m phi
thng qua p kiu. V d:
Ok = 0;
// sai
Ok = Bool(0) ;
// ng
hoc Ok = false ;
178
// ng
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
2.
B: *pa
D: a v b ng
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;
(4) p = &a
A: 1, 2 v 3
3.
C: a v b sai
(3) p = a;
B: 4, 5 v 6
C: 1, 3 v 5
D: 2, 4 v 6
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.
179
A: S1 v S2 ng
B: S2 v S3 ng
C: S3 v S1 ng
D: C 3 cng
ng
5.
6.
8.
180
B: 0xcd, 0xab
C: 0xabcd, 0
D: 0, 0xabcd
181
} z = {{1,2}};
Gi tr ca z.x bng:
A: 513
B: 258
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;
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
D: Sinh vin 1, 2 v 3
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
184
Tn trnh iu khin
Kiu mn hnh ho
ATT.BGI
CGA.BGI
EGAVGA.BGI
Chng 6. ha v m thanh
HERC.BGI
IBM8514.BGI
PC3270.BGI
IBM 3270 PC
CGA
EGA
EGA64
EGAMONO
VGA
.....................
..
185
Chng 6. ha v m thanh
320 x 200
CGAC1
320 x 200
CGAC2
320 x 200
CGAC3
320 x 200
CGAHI
640 x 200
2 color
EGALO
640 x 200
16 color
EGAHI
640 x 350
16 color
EGA64LO
640 x 200
16 color
EGA64HI
640 x 350
4 color
VGALO
640 x 200
16 color
VGAMED
640 x 350
16 color
VGAHI
640 x 480
16 color
186
grOk
No error
-1
grNoInitGraph
-2
grNotDetected
Chng 6. ha v m thanh
-3
grFileNotFound
........................................................................................................
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();
}
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
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;
}
SOLID_LINE = 0
DOTTED_LINE = 1
CENTER_LINE = 2
DASHED_LINE = 3
USERBIT_LINE = 4,
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
setfillstyle(mu t, mu t): t mu t, mu t
setfillpattern(mu t, mu t): nh ngha mu t.
getfillsettings(struct fillsettingstype *info): Ly mu t hin ti
struct fillsettingstype {
int pattern;
int color;
};
SOLID_FILL
LINE_FILL
LTSLASH_FILL
SLASH_FILL
BKSLASH_FILL
LTBKSLASH_FILL
HATCH_FILL
XHATCH_FILL
INTERLEAVE_FILL
WIDE_DOT_FILL
10
CLOSE_DOT_FILL
11
USER_FILL
12
V d 5 : t mu t.
char caro[8] = {0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55};
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
// nh th nht
// nh th hai
// nh th ba
// nh th t
193
Chng 6. ha v m thanh
// cung trn
// ng trn
// ng trn
// cung elip
// ng elip;
setfillstyle(EMPTY_FILL, getmaxcolor());
pieslice(200, 200, 45, 135, 100) ;
// ng qut trn
// ng elip
setfillstyle(SOLID_FILL, getmaxcolor());
pieslice(200, 200, 45, 135, 100);
// hnh trn;
// hnh elip;
h. T mu
// V hnh ch nht
setfillstyle(1, BLUE);
// Mu t c, mu xanh
// 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
}
void fill2()
{
int i, x = 0, y = 0, r = 0;
for (i=1;i<10;i++) {
r = 10*i;
y = x += r;
circle(x, y, r);
setfillstyle(i, i);
floodfill(x, y, 15);
}
}
4. Vit vn bn trong mn hnh ha
a. Vit vn bn
outtext(s) ;
outtextxy(x, y, s) ;
195
Chng 6. ha v m thanh
SMALL_FONT
TRIPLEX_FONT
SANS_SERIF_FONT
GOTHIC_FONT
Hng : hng vit theo kiu nm ngang hay thng ng, tng ng vi cc
hng:
HOIRIZ_DIR
VERT_DIR
0
1
C ch : Gm cc c ch nh s tng dn t 1. C ch ngm nh l 1.
V d sau ln lt in ti tm mn hnh tn ca cc font vi cc c ch ln dn,
theo hng nm ngang.
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
void main()
{
char *fname[] = {"ngm nh", "Triplex", "Small", "Sans Serif", "Gothic" };
int gdriver = DETECT, gmode;
int font, midx, midy;
int size = 1;
initgraph(&gdriver, &gmode, "C:\\Borlandc\\BGI");
midx = getmaxx() / 2; midy = getmaxy() / 2;
for (font = DEFAULT_FONT; font <= GOTHIC_FONT; font++)
{
cleardevice();
size = font;
settextstyle(font, HORIZ_DIR, size);
outtextxy(midx, midy, fname[font]);
196
Chng 6. ha v m thanh
getch();
}
closegraph();
}
c. iu chnh cch vit
Theo mi hng (nm ngang hay thng ng) c 3 cch vit tng ng vi cc
hng s sau:
1. Theo hng nm ngang:
LEFT_TEXT = 0 : Vit t tri sang phi.
CENTER_TEXT = 1 : Vit t v tr con tr sang hai bn.
RIGHT_TEXE = 2 : Vit t phi sang tri.
2. Theo hng thng ng:
BOTTOM_TEXT = 0 : Vit t di ln.
CENTER_TEXT = 1 : Vit t v tr con tr ln trn v xung di.
TOP_TEXT = 2. Vit t trn xung.
ch nh mt trong cc cch vit trn ta dng lnh
settextjustify(Theo hng ngang, Theo hng dc);
5. Chuyn ng
// xa hnh
delay
// tm dng
197
Chng 6. ha v m thanh
imagesize(x1, y1, x2, y2): Cho li kch thc (byte) ca mt nh bitmap trong
khung ch nht c xc nh bi cc ta (x1, y1, x2, y2).
getimage(x1, y1, x2, y2, *pict): Lu nh t mn hnh vo vng b nh c
tr bi con tr pict.
putimage(x1, y1, *pict, op): Ghi ra mn hnh nh c lu ti v tr con
tr pict. op l ch qui nh vic hin nh ln mn hnh, mu ca cc im
s c qui nh thng qua mu ca nh c lu trong pict v mu hin ti
ca im trn mn hnh. Hai mu ny s "trn" theo cc php ton qui nh
bi op di y cho ra mu v ca nh:
COPY_PUT = 0
Sn cu th
XOR_PUT = 1
OR_PUT = 2
Hoc
AND_PUT = 3
NOT_PUT = 4
Not
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
198
// v cc nan hoa
Chng 6. ha v m thanh
}
setcolor(WHITE);
}
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
// xa bnh xe
phi = phi-pi/72;
// xoay i mt gc phi
}
}
phi = phi-pi/72;
199
Chng 6. ha v m thanh
}
6. V th ca cc hm ton hc
// Ve truc toa do
{
line(0, midy, maxx, midy);
// truc hoanh
// mui ten
// truc tung
// mui ten
200
// in toa do (0,0)
Chng 6. ha v m thanh
{
int tileX = 20, tileY = 60;
// T l theo X v Y
int x, y, i;
setviewport(midx, midy, maxx, maxy, 0);
for (i = -400; i<=400; i++) {
x = 2*pi*i*tileX/200;
y = sin(2*pi*i/200)*tileY;
putpixel(x, y, 1);
}
setviewport(0, 0, maxx, maxy, 0);
}
void Sinoverx()
// Ham Sinx/x
{
float t;
float tileX = 50/pi;
float tileY = 80;
int x, y;
for (x = 30; x < maxx-30; x++) {
t = ((x==midx)? 1 : (x-midx))/tileX;
y = midy - int(sin(t)/t*tileY);
putpixel(x, y, 2);
}
}
Ve do thi theo tham so (x = x(t), y = y(t))
void Hypocycloide()
// t [0, 2]
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()
// 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
void Archimede()
{
int i, x, y;
float r, t;
for (i = 0;i<=2500;i++) {
t = 0.02*i;
x = int(3*t*cos(t))+midx;
y = -int(3*t*sin(t))+midy;
putpixel(x, y, 6);
}
}
void Hoahong()
{
int i, x, y;
float r, t;
for (i = 0;i<=2000;i++) {
t = (pi/500)*i;
x = int(150*(sin(2*t)*cos(t)))+midx;
y = int(150*sin(2*t)*sin(t))+midy;
putpixel(x, y, 7);
}
}
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;
203
Chng 6. ha v m thanh
};
TOADO gr3 = { 320, 20, 20, 20, 20, 0.8*pi, 0.2*pi };
void Vetruc()
// Ve truc Ox, Oy
{
setviewport(0, 0, maxx, maxy, 0);
settextstyle(DEFAULT_FONT, HORIZ_HUONG, 0);
setcolor(WHITE);
line(0, midy, maxx, midy);
line(maxx-7, midy-3, maxx, midy); line(maxx-7, midy+3, maxx, midy);
line(midx, 0, midx, maxy);
line(midx-3, 7, midx, 0); line(midx+3, 7, midx, 0);
outtextxy(midx+6, midy+6, "(0, 0)");
outtextxy(maxx-18, midy+6, "x"); outtextxy(midx+8, 6, "y");
setbkcolor(CYAN); setcolor(RED);
settextstyle(TRIPLEX_FONT, HORIZ_HUONG, 2);
outtextxy(10, 0, "DO THI KHONG GIAN 3 CHIEU");
}
int X(double x, double y, double z)
{
return gr3.OX + x*gr3.UX*cos(gr3.Xx) + y*gr3.UY*cos(gr3.Xy);
}
int Y(double x, double y, double z)
{
return gr3.OY + x*gr3.UX*sin(gr3.Xx) + y*gr3.UY*sin(gr3.Xy) z*gr3.UZ;
}
double f(double x, double y)
{
return 4*sin(x)*sin(y);
}
204
Chng 6. ha v m thanh
{
return 5*sin(sqrt(x*x+y*y))/sqrt(x*x+y*y);
}
void Vehamf()
{
double x, y, z;
double xa = -6.28, xb = 6.28;
double ya = -6.28, yb = 6.28;
double xp = 0.2, yp = 0.2;
int mat[8];
settextstyle(TRIPLEX_FONT, HORIZ_HUONG, 1);
outtextxy(10, 20, "Ham z = sinx.siny");
setviewport(0, midy, maxx, maxy, 0);
for (x = xa; x <= xb; x+=xp)
// ve mat an
// diem A
// diem B
// diem C
// diem D
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();
}
#define do1
#define red1
208
66
78
#define dod1
#define mi1
70
82
#define re1
#define fa1
73
86
Chng 6. ha v m thanh
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
fad1
la1
do2
re2
fa2
sold2
si2
re3
fa3
sold3
si3
re4
fa4
sold4
si4
91
108
130
148
176
209
247
297
352
415
495
594
704
836
990
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
sol1
lad1
dod2
red2
fad2
la2
do3
red3
fad3
la3
do4
red4
fad4
la4
lang
96
#define
115 #define
139 #define
156 #define
188 #define
230 #define
264 #define
313 #define
374 #define
440 #define
528 #define
625 #define
748 #define
880 #define
30000
sold1
si1
re2
mi2
sol2
lad2
dod3
mi3
sol3
lad3
dod4
mi4
sol4
lad4
102
122
148
164
196
233
281
330
396
468
565
660
792
935
// 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
// trn
float md = d/2;
// mc en
float mk = d/4;
// mc kp
float m3 = d/8;
// mc 3
float m4 = d/16;
// mc 4
float dc = 3*d/2;
// en chm
// trng chm
// trn chm
210
Chng 6. ha v m thanh
BI TP
1.
2.
3.
4.
V mt bn c quc t vi cc en trng.
5.
6.
7.
8.
V tam gic ni tip trong hnh trn, hnh trn ni tip trong elip. T cc mu khc
nhau cho cc min to bi cc ng trn.
9.
10. V hai hnh ngi i vo t 2 pha mn hnh vi tc khc nhau. Gp nhau hai
hnh ngi xoay li v i ngc v 2 pha mn hnh. Chng trnh dng khi c hai
i khut vo hai pha ca mn hnh.
211
Chng 7. Lp v i tng
CHNG 7
LP V I TNG
Lp trnh c cu trc v lp trnh hng i tng
Lp v i tng
i ca phng thc - Con tr this
Hm to (contructor)
Hm hy (destructor)
Cc hm trc tuyn (inline)
212
Chng 7. Lp v i tng
n c khai bo nh sau:
float do_dai(int i, int j);
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();
}
2. Phng php lp trnh hng i tng
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
A* p ;
};
2. Khai bo cc thnh phn ca lp (thuc tnh v phng thc)
a. Cc t kha private v public
217
Chng 7. Lp v i tng
c khai bo nh khai bo cc thnh phn trong kiu cu trc hay hp. Bnh
thng cc thnh phn ny c khai bo l private bo m tnh giu kn, bo
v an ton d liu ca lp khng cho php cc hm bn ngoi xm nhp vo cc d
liu ny.
c. Cc phng thc (hm thnh vin)
// Honh (ct)
int y ;
// Tung (hng)
int m ;
// Mu
Cc phng thc:
Nhp d liu mt im
Hin th mt im
n mt im
Lp im c xy dng nh sau:
#include <iostream.h>
#include <graphics.h>
class DIEM
{
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);
}
219
Chng 7. Lp v i tng
DIEM d[20] ;
d2.x;
d3.y;
d[2].m;
d1.x = 100;
d2.y =d1.x;
Cng ging nh hm, mt phng thc c s dng thng qua li gi. Tuy
nhin trong li gi phng thc bao gi cng phi c tn i tng ch r
phng thc thc hin trn cc thuc tnh ca i tng no.
V d li gi sau s thc hin nhp s liu vo cc thnh phn d1.x, d1.y v
d1.m: d1.nhapsl(); Cu lnh sau s thc hin nhp s liu vo cc thnh phn
d[3].x, d[3].y v d[3].m: d[3].nhapsl() ;
Chng ta s minh ha cc iu ni trn bng mt chng trnh n gin s
220
Chng 7. Lp v i tng
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
DIEM d1, d2 ;
DIEM d[20] ;
// 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
222
Chng 7. Lp v i tng
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 ;
}
Do :
this x chnh l d1.x
this y chnh l d1.y
this m chnh l d1.m
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, '''');
}
void DIEM::ve_doan_thang(DIEM d2, int mau)
{
227
Chng 7. Lp v i tng
setcolor(mau);
line(this x,this y,d2.x,d2.y);
}
void DIEM:: ve_tam_giac(DIEM d2, DIEM d3,int mau)
{
(*this).ve_doan_thang(d2,mau);
d2.ve_doan_thang(d3,mau);
d3.ve_doan_thang(*this,mau);
}
double DIEM:: chu_vi(DIEM d2, DIEM d3)
{
double s;
s=(*this).do_dai(d2)+ d2.do_dai(d3) + d3.do_dai(*this) ;
return s;
}
void main()
{
DIEM d1, d2, d3;
char tb_cv[20] ;
d1.nhapsl();
d2.nhapsl();
d3.nhapsl();
kd_do_hoa();
d1.ve_tam_giac(d2,d3,15);
double s = d1.chu_vi(d2,d3);
sprintf(tb_cv, "chu_vi = %0.2f", s);
outtextxy(10,10,tb_cv);
getch();
closegraph();
}
228
Chng 7. Lp v i tng
Tuy nhin trong trng hp ny, vai tr ca this khng cao lm, v n c
a vo ch ct lm r i th nht. Trong thn phng thc c th b t kha this
vn c.
+ Vai tr ca this tr nn quan trng trong phng thc ve_tam_giac:
voidve_tam_giac(DIEM d2, DIEM d3, int mau)
Phng thc ny c 4 i l:
this : tr ti mt i tng kiu DIEM
d2 : mt i tng kiu DIEM
d3 : mt i tng kiu DIEM
mau : mt bin nguyn
Ni dung phng thc l v 3 cnh:
cnh 1 i qua *this v d2
cnh 2 i qua d2 v d3
cnh 3 i qua d3 v *this
229
Chng 7. Lp v i tng
IV. HM TO (CONSTRUCTOR)
1. Hm to (hm thit lp)
i.
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
// 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
};
// Xy dng hm to bn ngoi nh ngha lp
DIEM_DH:: DIEM_DH(int x1, int y1, int m1) ;
{
x = x1; y = y1; m = m1;
}
231
Chng 7. Lp v i tng
// Gi ti hm to khng i.
// Gi ti hm to c i.
// Gi ti hm to c i.
// Gi ti hm to khng i 20 ln
// Gi ti hm to c i
// Kt qu q x = 40, q y = 20, q m = 4
DIEM_DH *r = new DIEM_DH ;
//Gi ti hm to khng i
// Kt qu r x = 0, r y = 0, r m = 1
+ Khi cp pht b nh cho mt dy i tng khng cho php dng tham s
khi gn, v d:
int n = 30;
DIEM_DH *s = new DlEM_DH[n] ;
// Gi ti hm to khng i 30 ln.
232
Chng 7. Lp v i tng
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
// 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();
in(*d);
// Gi hm bn in()
DIEM_DH(2, 2, 2).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
// (n+1) ln gi hm to khng i
getch();
}
2. Lp khng c hm to v hm to mc nh
a. Nu lp khng c hm to
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
236
Chng 7. Lp v i tng
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();
}
3. Hm to sao chp (Copy Constructor)
a. Hm to sao chp mc nh
Chng 7. Lp v i tng
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);
};
ostream& operator<< (ostream& os, const DT &d)
{
os << " Cac he so (tu ao): ";
for (int i = 0 ; i< = d.n ; ++i)
os << d.a[i] <<" " ;
return os;
}
istream& operator >> (istream& is, DT &d)
{
if (d.a! = NULL) delete d.a;
cout << " \n Bac da thuc: " ;
cin >> d.n;
d.a = new double[d.n+1];
cout << ''Nhap cac he so da thuc:\n" ;
for (int i = 0 ; i< = d.n ; ++i)
{
cout << "He so bac "<< i << " = " ;
is >> d.a[i] ;
}
return is;
}
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
243
Chng 7. Lp v i tng
244
Chng 7. Lp v i tng
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
+ 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
// Bn knh
int m;
// Mu hnh trn
char *pht;
int hienmh;
247
Chng 7. Lp v i tng
// Khi to ha
void ve_bau_troi();
// V bu tri sao
248
void ktdh();
// Khi to ha
void ve_bau_troi();
// V bu tri sao
void ht_di_dong_xuong();
void ht_di_dong_len();
Chng 7. Lp v i tng
249
Chng 7. Lp v i tng
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
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
}
254
Chng 7. Lp v i tng
Khng phi khi gp t kho inline l trnh bin dch nht thit phi x l hm
theo kiu trc tuyn.
C mt s hm m cc trnh bin dch thng khng x l theo cch inline
nh cc hm cha bin static, hm cha cc lnh chu trnh hoc lnh goto hoc lnh
switch, hm quy. Trong trng hp ny t kho inline l d nhin b b qua.
Thm ch t kho inline vn b b qua ngay c i vi cc hm khng c
nhng hn ch nu trn nu nh trnh bin dch thy cn thit (v d c qu nhiu
hm inline lm cho b nh chng trnh qu ln)
V d 2 : Chng trnh sau s dng hm inline tnh chu vi v din tch ca hnh ch
nht:
Cch 1: Khng khai bo nguyn mu. Khi hm dtcvhcn phi t trc hm
main.
#include <conio.h>
#include <iostream.h>
inline void dtcvhcn(int a, int b, int &dt, int &cv)
{
dt=a*b;
cv=2*(a+b);
}
void main()
{
int a[20],b[20],cv[20],dt[20],n;
cout << "\n So hinh chu nhat: '' ;
cin >> n;
for (int i=1; i<=n; ++i)
{
cout <<"\n Nhap 2 canh cua hinh chu nhat thu " << i << ": ";
cin >> a[i] >> b[i];
dtcvhcn(a[i],b[i],dt[i], cv[i]);
}
clrscr();
for (i=1; i<=n; ++i)
{
cout << "\n Hinh chu nhat thu "<< i << '' : '';
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
I. HM BN (FRIEND FUNCTION)
1. Hm bn
258
...
}
A f3(...)
{
...
}
259
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
{
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);
261
// Khai bo trc lp A
class B;
// Khai bo trc lp B
class C;
// Khai bo trc lp C
// nh ngha lp A
class A
{
// Khai bo f l bn ca A
friend void f(...) ;
};
// nh ngha lp B
class B
{
// Khai bo f l bn ca B
friend void f(...) ;
};
// nh ngha lp C
class C
{
// Khai bo f l bn ca C
friend void f(...) ;
};
// Xy dng hm f
void f(...)
{
...
}
262
263
cin >> n ;
for (int i = 1; i< = n ; ++i)
{
cout << "\n Phan tu thu " << i <<" = " ;
cin >> x[i];
}
}
void MT::nhapsl()
{
cout <<"\n Cap ma tran = ";
cin >> n ;
for (int i = 1; i< = n ; ++i)
for (int j = 1; j< = n; ++j)
{
cout << "\n Phan tu thu: "<<i<< " hang "<< i << " cot " << j << " = ";
cin >> a[i][j];
}
}
VT tich(const MT &a, const VT &x)
{
VT y;
int n = a.n;
if (n! = x.n)
return x;
y.n = n;
for (int i = 1; i< = n; ++i)
{
y.x[i] = 0;
for (int j = 1; j< = n; ++j)
y.x[i] = a.a[i][j]*x.x[j];
}
return y;
264
}
void in(const VT &x)
{
cout << "\n";
for (int i = 1; i< = x.n; ++i)
cout << x.x[i] << " ";
}
void in(const MT &a)
{
for (int i = 1; i< = a.n; ++i)
{
cout << "\n " ;
for (int j = 1; j< = a.n; ++j)
cout << a.a[i][j] << " ";
}
}
void main()
{
MT a; VT x, y;
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
//T s
int b;
// Mu s
};
PS operator+(PS p1, PS p2);
// p1 + p2
PS operator-(PS p1 , PS p2);
// p1 - p2
// p1 *p2
// p1/p2
266
double a[20][20] ;
int m ;
// S hng ma trn
int n ;
// S ct ma trn
};
MT operator-(MT x) ;
3. Thn ca hm ton t
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;
}
a. Cch dng hm ton t
C 2 cch dng:
Cch 1: Dng nh mt hm thng thng bng cch vit li gi
V d:
PS p, q, u, v ;
u = operator+(p, q) ;
// u = p + q
v = operator-(p, q) ;
// v= p - q
// u = p + q
v=p-q;
//v = p - q
267
php ton vit cc cng thc phc tp. Cng cho php dng du ngoc trn
quy nh th t thc hin cc php tnh. Th t u tin ca cc php tnh vn tun
theo cc quy tc ban u ca C++. Chng hn cc php * v / c th t u tin cao
hn so vi cc php + v b. Cc v d v nh ngha chng ton t
268
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
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
271
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
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
274
CHNG 9
ios
istream
ostream
iostream
i tng ca cc lp trn c gi l cc dng d liu. Mt s i tng
thuc lp iostream c khai bo sn (chun) v c gn vi nhng thit b
nhp/xut c nh nh cc i tng cin, cout, cerr, clog gn vi bn phm (cin) v
mn hnh (cout, cerr, clog). iu ny c ngha cc ton t >>, << v cc hm k
trn khi lm vic vi cc i tng ny s cho php NSD nhp d liu thng qua
bn phm hoc xut kt qu thng qua mn hnh.
nhp/xut thng qua cc thit b khc (nh my in, file trn a ), C++
275
276
int a;
float b;
char c;
char *s;
cin >> a >> b >> c >> s;
277
// 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);
}
278
cin.get();
// c mt k t trong b m
cin.ignore(n);
// nhc 1 k t (enter)
// hoc cin.ignore(1);
279
// rng thc ca a l 2, ca b l 3
cout << a;
// chim 2 ct mn hnh
cout.width(7);
cout << b;
Kt qu in ra s l: 12<><><><>345
b. Ch nh k t chn vo khong trng trc gi tr cn in
cout.fill(ch) ;
280
// rng thc ca a l 4, ca b l 7
cout << a;
// chim 4 ct mn hnh
cout.width(10);
cout.precision(2);
// t chnh xc n 2 s l
cout << b;
Kt qu in ra s l: 12.3<><><><>345.68
2. Cc c nh dng
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
// rng thc ca a l 4, ca b l 8
cout << a;
// chim 4 ct mn hnh
cout.width(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
cout << b;
// kt qa: 12.3345.68***
cout.setf(ios::right) ;
// bt c ios::right
cout << b;
// kt qa: 12.3***345.68
cout.setf(ios::internal) ;
// bt c ios::internal
cout << b;
// kt qa: 12.3***345.68
c in thnh
123.250
123.2599
c in thnh
123.260
123.2
c in thnh
123.200
nu fixed bt + showpoint tt :
123.2500
c in thnh
123.25
123.2599
c in thnh
123.26
123.2
c in thnh
123.2
nu scientific bt + showpoint bt :
12.3
c in thnh
1.230e+01
2.32599
c in thnh
2.326e+00
324
c in thnh
3.240e+02
nu scientific bt + showpoint tt :
282
12.3
c in thnh
1.23e+01
2.32599
c in thnh
2.326e+00
324
c in thnh
3.24e+02
// tng t ios::dec
oct
// tng t ios::dec
hex
// tng t ios::hex
endl
flush
V d :
cout.setf(ios::showbase) ;
cout.setf(ios::uppercase) ;
// in 0xAB v 0x20
// tng t cout.width(n)
setprecision(n)
// tng t cout.precision(n)
setfill(c)
// tng t cout.fill(c)
setiosflags(l)
// tng t cout.setf(l)
resetiosflags(l)
// tng t cout.unsetf(l)
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
hoc :
Mayin << "Din tch HCN = " << cd * cr << endl;
Mayin << "Chu vi HCN = " << 2*(cd + cr) << endl << flush;
<Lp> i_tng;
i_tng.open(tn_file, ch_);
// 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:
ofstream f("Baitap);
// c hoc ghi.
285
int x;
f.open("DAYSO");
// m file DAYSO v gn vi f
V d 3 : Chng trnh sau nhp danh sch sinh vin, ghi vo file 1, c ra mng,
sp xp theo tui v in ra file 2. Dng u tin trong file ghi s sinh vin, cc dng
tip theo ghi thng tin ca sinh vin gm h tn vi rng 24 k t, tui vi
rng 4 k t v im vi rng 8 k t.
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
#include <stdlib.h>
286
#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
287
288
Sinhvien x ;
x.nhap(); x.ghi("DSSV1");
x.doc("DSSV1"); x.sapxep(); x.ghi("DSSV2");
cout << " xong";
getch();
}
3. Kim tra s tn ti ca file, kim tra ht file
Khi c hoc ghi, con tr file s chuyn dn v cui file. Khi con tr cui
file, phng thc eof() s tr li gi tr khc khng. Do c th s dng phng
thc ny kim tra ht file hay cha.
Chng trnh sau cho php tnh di ca file Baitap. File cn c m theo
kiu nh phn.
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <conio.h>
void main()
{
clrscr();
long dodai = 0;
char ch;
ifstream f("Baitap", ios::in | ios::binary) ;
if (f.bad()) {
cout << "File Baitap khng c";
exit(1);
}
289
while (!f.eof()) {
f.get(ch));
dodai++;
}
cout << " di ca file = " << dodai;
getch();
}
4. c ghi ng thi trn file
hoc
fstream f ;
f.open("Data", ios::in | ios::out) ;
5. Di chuyn con tr file
Cc phng thc sau cho php lm vic trn i tng ca dng xut
(ofstream).
i_tng.seekp(n) ; Di chuyn con tr n byte th n (cc byte c tnh
t 0)
i_tng.seekp(n, v tr xut pht) ; Di chuyn i n byte (c th m
hoc dng) t v tr xut pht. V tr xut pht gm:
ios::beg : t u file
ios::end : t cui file
ios::cur : t v tr hin ti ca con tr.
i_tng.tellp(n) ; Cho bit v tr hin ti ca con tr.
lm vic vi dng nhp tn cc phng thc trn c thay tng ng bi cc
tn : seekg v tellg. i vi cc dng nhp ln xut c th s dng c c 6
phng thc trn.
V d sau tnh di tp n gin hn v d trn.
fstream f("Baitap");
f.seekg(0, ios::end);
cout << " di bng = " << f.tellg();
290
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
stt = 0;
clrscr();
cout << "Danh sch sinh vin nhp\n" ;
cout << setprecision(1) << setiosflags(ios::showpoint) ;
while (1) {
f.getline(hoten,25);
if (f.eof()) break;
stt++;
f >> tuoi >> diem;
f.ignore();
cout << "\nSinh vin th " << stt ;
cout << "\nH tn: " << hoten;
cout << "\nTui: " << setw(4) << tuoi;
cout << "\nim: " << setw(8) << diem;
}
f.close();
getch();
}
V. NHP/XUT NH PHN
1. Khi nim v 2 loi file: vn bn v nh phn
a. File vn bn
292
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
3. c, ghi dy k t
gcount();
294
#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();
};
int Sinhvien::size = sizeof(Sv);
Sinhvien::Sinhvien(char *fn)
{
strcpy(fname, fn) ;
fstream f;
f.open(fname, ios::in | ios::ate | ios::binary);
if (!f.good) sosv = 0;
else {
sosv = f.tellg() / size;
}
}
void Sinhvien::tao()
295
{
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
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
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
}
}
BI TP
1.
2.
3.
4.
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.
7.
8.
9.
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
Chng 1. CC KHI NIM C BN CA C++
I.
CC YU T C BN ................................................................................................1
1.
2.
3.
4.
1.
2.
3.
4.
1.
2.
3.
4.
Vo d liu t bn phm......................................................................................... 9
In d liu ra mn hnh .......................................................................................... 10
nh dng thng tin cn in ra mn hnh ............................................................... 12
Vo/ra trong C...................................................................................................... 14
1.
2.
3.
4.
300
4. Hng xu k t ...................................................................................................... 25
5. Khai bo hng....................................................................................................... 26
III. BIN - KHAI BO V S DNG BIN ......................................................................27
1.
2.
3.
4.
5.
6.
7.
8.
1. Cc hm s hc ................................................................................................... 38
2. Cc hm lng gic.............................................................................................. 38
1.
2.
3.
4.
5.
1. Mng mt chiu.................................................................................................... 59
2. Xu k t............................................................................................................... 63
IV. MNG HAI CHIU.......................................................................................................73
301
CON TR V S HC A CH .................................................................................83
1.
2.
3.
4.
5.
6.
II. HM .............................................................................................................................95
1.
2.
3.
4.
5.
6.
7.
8.
III. QUI.......................................................................................................................123
1.
2.
3.
4.
KIU CU TRC.......................................................................................................145
1.
2.
3.
4.
5.
6.
302
Chng 6. HA V M THANH
I.
HO.....................................................................................................................184
1.
2.
3.
4.
5.
6.
Chng 7. LP V I TNG
I.
303
1.
2.
3.
4.
Hm hy mc nh ............................................................................................ 246
Quy tc vit hm hy ........................................................................................ 246
Vai tr ca hm hy trong lp DT .................................................................... 247
V d ................................................................................................................. 247
1.
2.
3.
4.
u nhc im ca hm ..................................................................................
Cc hm trc tuyn ..........................................................................................
Cch bin dch v dng hm trc tuyn ...........................................................
S hn ch ca trnh bin dch .........................................................................
253
253
254
255
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
1.
2.
3.
4.
5.
V. NHP/XUT NH PHN............................................................................................292
1.
2.
3.
4.
305
306