You are on page 1of 200

HC VIN K THUT QUN S

KHOA CNG NGH THNG TIN

Bi ging
K THUT LP TRNH
Bin son
H i Dng
Nguyn Mu Uyn

H Ni - 1/2013
MC LC
Bi 1 - TNG QUAN...................................................................................................................................................4
I. Gii thiu...............................................................................................................................................................4
II. Bi ton v vic gii bi ton trn my tnh .........................................................................................................5
III. Cng c lp trnh...............................................................................................................................................10
IV. Tm tt ni dung bi hc ..................................................................................................................................13
V. Bi tp ................................................................................................................................................................14
Bi 2 - NGN NG LP TRNH C/C++................................................................................................................15
I. Gii thiu.............................................................................................................................................................15
II. Mt s khi nim c bn ....................................................................................................................................16
III. Cu trc mt chng trnh n gin .................................................................................................................25
IV. Nhp/Xut d liu.............................................................................................................................................27
V. Tm tt ni dung bi hc ...................................................................................................................................32
VI. Bi tp...............................................................................................................................................................33
Bi 3 - Bi thc hnh: MI TRNG LP TRNH V CC LNH VO/RA ...............................................34
I. Lm quen mi trng Dev-C++ ..........................................................................................................................34
II. Bi tp lm theo yu cu ....................................................................................................................................34
III. Bi tp t lm....................................................................................................................................................37
Bi 4 - IU KHIN CHN....................................................................................................................................40
I. Khi lnh .............................................................................................................................................................40
II. Lnh IF ...............................................................................................................................................................41
III. Lnh SWITCH..................................................................................................................................................44
IV. Tm tt..............................................................................................................................................................48
V. Bi tp ................................................................................................................................................................48
Bi 5 - Bi thc hnh: IU KHIN CHN..........................................................................................................49
I. Bi tp lm theo yu cu......................................................................................................................................49
II. Bi tp t lm .....................................................................................................................................................52
Bi 6 - IU KHIN LP........................................................................................................................................53
I. Lnh FOR ............................................................................................................................................................53
II. Lnh WHILE......................................................................................................................................................55
III. Lnh DO .. WHILE...........................................................................................................................................57
IV. Lnh break v continue.....................................................................................................................................60
III. Tm tt ni dung bi hc ..................................................................................................................................60
IV. Bi tp...............................................................................................................................................................60
Bi 7 - Bi thc hnh: IU KHIN LP..............................................................................................................61
I. Bi tp lm theo yu cu......................................................................................................................................61
II. Bi tp t lm .....................................................................................................................................................63
Bi 8 - MNG V CON TR ..................................................................................................................................65
I. Mng....................................................................................................................................................................65
II. Con tr................................................................................................................................................................73
IV. Tm tt ni dung bi hc ..................................................................................................................................83
V. Bi tp ................................................................................................................................................................83
Bi 9 - Bi thc hnh: MNG V CON TR........................................................................................................84
I. Bi tp lm theo yu cu......................................................................................................................................84
II. Bi tp t lm .....................................................................................................................................................87
Bi 10 - XU K T.................................................................................................................................................89
I. Khai bo...............................................................................................................................................................89
II. Nhp xut chui .................................................................................................................................................90
III. Mt s hm x l chui ....................................................................................................................................91
V. Tm tt ni dung bi hc ...................................................................................................................................95
VI. Bi tp...............................................................................................................................................................95
Bi 11 - Bi thc hnh: XU K T ......................................................................................................................96
I. Bi tp lm theo yu cu......................................................................................................................................96
II. Bi tp t lm .....................................................................................................................................................98

2
Bi 12 - HM V CU TRC CHNG TRNH..............................................................................................100
I. T chc chng trnh ........................................................................................................................................100
II. Hm do ngi dng nh ngha ........................................................................................................................104
III. Con tr hm.....................................................................................................................................................122
IV. qui .............................................................................................................................................................125
V. Tm tt ni dung bi hc .................................................................................................................................129
VI. Bi tp.............................................................................................................................................................130
Bi 13 - Bi thc hnh: HM V CU TRC CHNG TRNH ...................................................................131
I. Bi tp lm theo yu cu....................................................................................................................................131
II. Bi tp t lm ...................................................................................................................................................133
Bi 14 - CU TRC D LIU DO NGI DNG T NH NGHA............................................................135
I. Cu trc d liu do ngi dng t nh ngha ...................................................................................................135
II. Ngn xp ..........................................................................................................................................................145
III. Hng i..........................................................................................................................................................151
IV. Tm tt ni dung bi hc ................................................................................................................................154
V. Bi tp ..............................................................................................................................................................154
Bi 15 - Bi thc hnh: CU TRC D LIU DO NGI DNG T NH NGHA .................................155
I. Bi tp lm theo yu cu....................................................................................................................................155
II. Bi tp t lm ...................................................................................................................................................160
Bi 16 - LM VIC VI FILE ..............................................................................................................................162
I. Mt s khi nim ...............................................................................................................................................162
II. Cc thao tc trn tp tin....................................................................................................................................163
III. Truy cp tp tin vn bn..................................................................................................................................165
IV. Truy cp tp tin nh phn ................................................................................................................................168
V. Tm tt ni dung bi hc .................................................................................................................................172
VI. Bi tp.............................................................................................................................................................172
Bi 17 - Bi thc hnh LM VIC VI FILE .....................................................................................................173
I. Bi tp lm theo yu cu....................................................................................................................................173
II. Bi tp t lm ...................................................................................................................................................176
Bi 18 - MT S VN M RNG ................................................................................................................177
I. Cy, Hm bm ...................................................................................................................................................177
II. Khi ng ho .............................................................................................................................................181
III. Cc hm ho...............................................................................................................................................184
IV. X l vn bn trn mn hnh ho...............................................................................................................193
V. Hiu ng hot hnh ha...............................................................................................................................195
VI. Tm tt ni dung bi hc ................................................................................................................................197
VII. Bi tp ...........................................................................................................................................................197
Bi 19 - Bi thc hnh: MT S VN M RNG ......................................................................................198
I. Bi tp lm theo yu cu....................................................................................................................................198
II. Bi tp t lm ...................................................................................................................................................198
Bi 20 - N TP ......................................................................................................................................................199
I. Nhng vn l thuyt......................................................................................................................................199
II. Cc bi thc hnh .............................................................................................................................................200

3
Bi 1 - TNG QUAN
Ni dung bi hc
I. Gii thiu
II. Bi ton v vic gii bi ton trn my tnh
III. Cng c lp trnh
IV. Bi tp

I. Gii thiu
1. Mc ch, Yu cu
Mc ch ca mn hc l cung cp cho sinh vin nhng kin thc c bn v k thut lp trnh
ni chung v k nng s dng cng c lp trnh C/C++ trong vic gii quyt bi ton bng
chng trnh phn mm trn my tnh.
Kt thc mn hc sinh vin c trang b nhng kin thc v:
- Cch thc gii quyt mt bi ton trn my tnh;
- Cng c, kim thc v vic thut ton ha bi ton;
- Ngn ng lp trnh C/C++;
- Mt s cu trc d liu v gii thut in hnh.
Yu cu i vi sinh vin
- C hiu bit c bn v cu trc my tnh;
- C hiu bit c bn v h iu hnh;
- Bit s dng cc phn mm h thng trong vic qun l ti nguyn, sao chp/copy d
liu;
- Bit s dng cc phn mn ng dng nh cng c son tho vn bn, truy cp
internet, web.
- Nghe ging v lm bi tp.

2. Ni dung mn hc
Xem chi tit mc lc.

3. Ti liu hc tp v tham kho


1. H i Dng, Nguyn Mu Uyn, Tp Bi ging Lp trnh co bn, HVKTQS 2010;
2. Trn c Huyn, Phng php gii cc bi ton trong tin hc, Nh xut bn gio dc
1997;
3. o Thanh Tnh, H i Dng, Tin hc i cng, Hc vin KTQS, 2003;
4. Xun Li, Cu trc d liu v gii thut, NXB Gio dc, 1997;
5. Robert Sedgewick, Algorithns in C++, Addison-Wesley 1992;
6. Niklaus Wirth Bn dch ca Nguyn Quc Cng, Cu trc d liu + Gii thut =
Chng trnh, , NXB KHKT, 2001;
7. Gio trnh Tin Hc i Cng A, Nguyn Vn Linh, Khoa Cng Ngh Thng Tin, i
hc Cn Th, 1991.
8. Gio trnh l thuyt v bi tp ngn ng C; Nguyn nh T, Hong c Hi, Nh xut
bn Gio dc, 1999.
9. C - Tham kho ton din, Nguyn Cn, Nh xut bn ng Nai, 1996.
10. Gip t hc Lp Trnh vi ngn ng C, V Vn Vin, Nh xut bn ng Nai, 2002.
11. The C Programming Language, Brain W. Kernighan & Dennis Ritchie, Prentice Hall
Publisher, 1988.

4
II. Bi ton v vic gii bi ton trn my tnh
1. Phng php tng qut gii mt bi ton trn my tnh
gii mt bi ton trn my tnh cn thc hin cc bc sau:
1. Xc nh bi ton;
2. Xc nh cu trc d liu m t bi ton;
3. Xy dng thut ton;
4. Son tho vn bn chng trnh, kim tra v hon thin chng trnh.

2. Xc nh bi ton
Khi qut v bi ton
Trong qu trnh tn ti v pht trin, mi c nhn lun phi gii quyt nhiu bi ton t ra trong
cuc sng. C th ni cuc sng l mt chui cc bi ton m ta phi i u gii quyt.
Theo nhiu nh nghin cu th mi bi ton u c th din t theo mt s chung nh sau:
AB (*)
trong :
- A l gi thit, iu kin ban u, thng tin cho, bit;
- B l kt lun, l mc tiu cn t hoc ci phi tm, phi lm ra khi kt thc bi ton;
l suy lun, gii php cn xc nh hoc chui cc thao tc cn thc hin c c kt
qu B t ci c A.
Xc nh bi ton
Theo s trn th vic xc nh bi ton c ngha l xc nh A, B v nu c th th xc nh
lun c cc bc thc hin i c t A n B.
Bi ton trn my tnh
Tng t nh (*), v
- A gi l u vo (INPUT);
- B gi l u ra (OUTPUT);
l CHNG TRNH MY TNH cho kt qu B vi u vo A.
Kh khn
Vic xc nh mt bi ton trn my tnh thng gp kh khn sau:
- Thng tin v A, B thng khng r rng v khng y ;
- Thng bo v iu kin t ra cho cch gii (=>) thng khng c nu ra mt cch
minh bch;
V d 1: Hy vit chng trnh cho php gii phng trnh bc 2.
A =???, B=???
V d 2: Gi s ngi A c mt s tin X em gi tit kin, li xut thng l L% hi rng sau T
thng th A c bao nhiu tin bit rng c 3 thng th tin li c cng vo gc.
V d 3: Bi ton 8 hu - Hy tm cch t 8 con hu trn mt bn c vua sao cho khng c qun
hu no c th n qun hu khc.
V d 4: Cho dy s a1, a2, ..., an hy sp xp dy trn theo th t gim dn.
V d 5: Hy xy dng h thng qun l h s v kt qu hc tp ca sinh vin.
...
A =???, B=???
Nhn xt quan trng
Vic xc nh bi ton l rt rt quan trng, n nh hng ti cch thc v cht lng ca vic
gii quyt bi ton;

5
- Mt bi ton cho d c din t chi tit, r rng vn nn gi nh l phn ln thng tin
v A, B l tim n trong u ngi gii. Thng tin v A hoc B thng ch l biu tng
gi nh n cc thng tin tim n.
- Bc u tin xc nh mt bi ton l phi pht biu li bi ton mt cch chnh xc
theo ngn ng ca ring mnh v chnh l cch tip cn bi ton, hiu bi ton.
- Bc tip l tm hiu thng tin Input A, Output B v cc mi lin h gia chng;
- Nn xt mt vi trng hp c th thng qua hiu c c bi ton , thy r c
cc thao tc phi lm. Thc t cho thy c nhng bi ton trong tin hc ch c th m t
c thng qua cc v d (nh: ).

3. Cu trc d liu v Gii thut


Cu trc d liu
- Trong khoa hc my tnh, cu trc d liu l mt cch t chc lu tr v truy cp d
liu trong my tnh sao cho n c th c s dng mt cch hiu qu (v ph thuc c
vo cng c lp trnh).
- V d (trong C): Mng (Array), Con tr (Pointer), Xu k t (String), File, Stack, Queue
- Thng thng, mt cu trc d liu c chn cn thn s cho php thc hin thut ton
hiu qu hn.
- Vic chn cu trc d liu thng bt u t chn mt cu trc d liu tru tng. Mt
cu trc d liu c thit k tt cho php thc hin nhiu php ton, s dng cng t ti
nguyn, thi gian x l v khng gian b nh cng tt.
- Cc cu trc d liu c trin khai bng cch s dng cc kiu d liu, cc tham chiu
v cc php ton trn c cung cp bi mt ngn ng lp trnh.
Thut ton
- Thut ton , cn gi l gii thut, l mt tp hp hu hn ca cc ch th hay phng
cch c nh ngha r rng cho vic hon tt mt s s vic t mt trng thi ban u
cho trc; khi cc ch th ny c p dng trit th s dn n kt qu sau cng nh
d on.
- Thut ton l mt b cc qui tc hay qui trnh c th nhm gii quyt mt vn trong
mt s bc hu hn, hoc nhm cung cp mt kt qu t mt tp hp ca cc d kin
a vo.
V d 1: Gi s c hai bnh A v B ng hai loi cht lng khc nhau, A cha dung dch Da, B
cha dung dch Db. Gii thut i dung dch Da vo bnh B v Db vo A l:
Yu cu phi c thm mt bnh th ba gi l bnh C.
Bc 1: dung dch Db vo bnh C;
Bc 2: dung dch Da vo bnh B;
Bc 3: dung dch Db vo bnh A
V d 2: Mt trong nhng gii thut tm c chung ln nht ca hai s a v b l:
Bc 1: Nhp vo hai s a v b.
Bc 2: So snh 2 s a,b chn s nh nht gn cho UCLN.
Bc 3: Nu hai s a v b chia ht cho UCLN th
Thc hin bc 5.
Bc 4: Gim UCLN mt n v v quay li bc 3
Bc 5: In UCLN - Kt thc.
Mt thut ton c cc tnh cht sau:
- Tnh chnh xc: m bo kt qu tnh ton hay cc thao tc m my tnh thc hin
c l chnh xc.
- Tnh r rng: Thut ton phi c th hin bng cc cu lnh minh bch; cc cu lnh
c sp xp theo th t nht nh.

6
- Tnh khch quan: Mt thut ton d c vit bi nhiu ngi trn nhiu my tnh vn
phi cho kt qu nh nhau.
- Tnh ph dng: Thut ton khng ch p dng cho mt bi ton nht nh m c th p
dng cho mt lp cc bi ton c u vo tng t nhau.
- Tnh kt thc: Thut ton phi gm mt s hu hn cc bc tnh ton.
Trnh t thc hin cc bc ca thut ton
Gii thut c thit k theo ba cu trc suy lun c bn sau y:
1. Tun t (Sequential): Cc cng vic c thc hin mt cch tun t, cng vic ny ni
tip cng vic kia.
2. Cu trc la chn (Selection) : La chn mt cng vic thc hin cn c vo mt
iu kin no . C mt s dng nh sau:
- Cu trc 1: Nu < iu kin> (ng) th thc hin <cng vic>
- Cu trc 2: Nu < iu kin> (ng) th thc hin <cng vic 1>, ngc li (iu
kin sai) th thc hin <cng vic 2>
- Cu trc 3: Trng hp < i> thc hin <cng vic i>
3. Cu trc lp (Repeating): Thc hin lp li mt cng vic khng hoc nhiu ln cn c
vo mt iu kin no . C hai dng nh sau:
- Lp xc nh: l loi lp m khi vit chng trnh, ngi lp trnh xc nh
c cng vic s lp bao nhiu ln.
- Lp khng xc nh: l loi lp m khi vit chng trnh ngi lp trnh cha xc
nh c cng vic s lp bao nhiu ln. S ln lp s c xc nh khi chng
trnh thc thi.
Biu din thut gii
Ngn ng t nhin: Ngn ng t nhin l ngn ng ca chng ta ang s dng, chng ta c th
s dng ngn ng t nhin m t gii thut ging nh cc v d trn.
V d: Ta c gii thut gii phng trnh bc nht dng ax b 0 nh sau:
Bc 1: Nhn gi tr ca cc tham s a, b
Bc 2: Xt gi tr ca a xem c bng 0 hay khng?
Nu a=0 th lm bc 3, nu a khc khng th lm bc 4.
Bc 3: (a bng 0) Nu b bng 0 th ta kt lun phng trnh v s nghim,
nu b khc 0 th ta kt lun phng trnh v nghim.
Bc 4: ( a khc 0) Ta kt lun phng trnh c nghim x=-b/a

7
Lu thut ton: Ngn ng s (lu ) l mt ngn ng c bit dng m t gii thut
bng cc s hnh khi. Mi khi qui nh mt hnh ng nh m t hnh trn. V d: So
snh 2 s.

Gi m: (ting Anh: Pseudocode, xut pht t ch pseudo v code) l mt bn m t gii thut


ngn gn v khng chnh thc, trong s dng nhng quy c c cu trc ca mt s ngn ng
lp trnh (thng l Pascal) nhng thng b i nhng chi tit khng cn thit gip hiu r
gii thut hn.
V d: Thut gii phng trnh bc 2
Vo: a,b,c
Ra: Kt lun v nghim
BEGIN
Delta: = b*b 4*a*c;
If Delta=0 Then
Phng trnh c nghim kp x=-b/(2*a);
else
begin
if Delta<0 then
Phng trnh V nghim
Else
Begin
Phng trnh c 2 nghim
x1=(-b+sqrt(Delte))/(2*a)
x2=(-b+sqrt(Delte))/(2*a)
end
end
END.
Mt s v d khc v thut ton v biu din thut ton
V d 1: Cn vit chng trnh cho my tnh sao cho khi thc hin chng trnh , my tnh yu
cu ngi s dng chng trnh nhp vo cc s hng ca tng (n); nhp vo dy cc s hng a
i
ca tng. Sau , my tnh s thc hin vic tnh tng cc s a ny v in kt qu ca tng tnh
i
c.

8
Yu cu: Tnh tng n s S=a + a +a +......+a .
1 2 3 n
Chi tit gii thut c m t bng ngn ng t nhin nh sau:
- Bc 1: Nhp s cc s hng n.
- Bc 2: Cho S=0 (lu tr s 0 trong S)
- Bc 3: Cho i=1 (lu tr s 1 trong i)
- Bc 4: Kim tra nu i<=n th thc hin bc 5, ngc li thc hin bc 8.
- Bc 5: Nhp a
i
- Bc 6: Cho S=S+a (lu tr gi tr S + a trong S)
i i
- Bc 7: Tng i ln 1 n v v quay li bc 4.
- Bc 8: In S v kt thc chng trnh.
V d 2: Vit chng trnh cho php nhp vo 2 gi tr a, b mang ngha l cc h s a, b ca
phng trnh bc nht. Da vo cc gi tr a, b cho bit nghim ca phng trnh bc nht ax
+ b = 0. M t gii thut bng ngn ng t nhin:
- Bc 1: Nhp 2 s a v b
- Bc 2: Nu a = 0 th thc hin bc 3, ngc li thc hin bc 4
- Bc 3: Nu b=0 th thng bo phng trnh v s nghim v kt thc chng trnh,
ngc li thng bo phng trnh v nghim v kt thc chng trnh.
- Bc 4: Thng bo nghim ca phng trnh l b/a v kt thc.
V d 3: Vit chng trnh cho php nhp vo 1 s n, sau ln lt nhp vo n gi tr a ,
1
a ,,a . Hy tm v in ra gi tr ln nht trong n s a , a , , a . M t gii thut bng ngn ng
2 n 1 2 n
t nhin:
- Bc 1: Nhp s n
- Bc 2: Nhp s th nht a
1
- Bc 3: Gn max=a
1
- Bc 4: Gn i=2
- Bc 5: Nu i<=n th thc hin bc 6, ngc li thc hin bc 9
- Bc 6: Nhp a
i
- Bc 7: Nu max < a th gn max=a .
i i
- Bc 8: Tng i ln mt n v v quay li bc 5
- Bc 9: In max - kt thc
V d 4: Vit chng trnh cho php nhp vo 1 s n, sau ln lt nhp vo n gi tr a ,
1
a ,,a . Sp theo th t tng dn mt dy n s a , a ,...a ni trn. C rt nhiu gii thut gii
2 n 1 2 n
quyt bi ton ny. Phn trnh by di y l mt phng php.
Gi s ta nhp vo my dy n s a , a ,..., a . Vic sp xp dy s ny tri qua (n-1) ln:
1 2 n
- Ln 1: So snh phn t u tin vi tt c cc phn t ng sau phn t u tin. Nu c
phn t no nh hn phn t u tin th i ch phn t u tin vi phn t nh hn
. Sau ln 1, ta c phn t u tin l phn t nh nht.
- Ln 2: So snh phn t th 2 vi tt c cc phn t ng sau phn t th 2. Nu c phn
t no nh hn phn t th 2 th i ch phn t th 2 vi phn t nh hn . Sau ln 2,
ta c phn t u tin v phn t th 2 l ng v tr ca n khi sp xp.
-
- Ln (n-1): So snh phn t th (n-1) vi phn t ng sau phn t (n-1) l phn t th n.
Nu phn t th n nh hn phn t th (n-1) th i ch 2 phn t ny. Sau ln th (n-1),
ta c danh sch gm n phn t c sp th t.
M t gii thut bng ngn ng t nhin:
- Bc 1: Gn i=1
- Bc 2: Gn j=i+1
- Bc 3: Nu i <=n-1 th thc hin bc 4, ngc li thc hin bc 8

9
- Bc 4: Nu j <=n th thc hin bc 5, ngc li th thc hin bc 7.
- Bc 5: Nu a > a th hon i a v a cho nhau (nu khng th thi).
i j i j
- Bc 6: Tng j ln mt n v v quay li bc 4
- Bc 7: Tng i ln mt n v v quay li bc 3
- Bc 8: In dy s a , a ,..., a - Kt thc.
1 2 n

Gii thut + Cu trc d liu = Chng trnh


Algorithms + Data Structures = Programs
Niklaus Emil Wirth
In 1975 he wrote the book "Algorithms + Data Structures =
Programs", which gained wide recognition and is still useful today.
Biography
Wirth was born in Winterthur, Switzerland, in 1934. In 1959 he earned
a degree in Electronics Engineering from the Swiss Federal Institute of
Technology Zrich (ETH Zrich). In 1960 he earned an M.Sc. from
Universit Laval, Canada. Then in 1963 he was awarded a Ph.D.in EECS from the University of
California, Berkeley, supervised by the computer designer pioneer Harry Huskey.
From 1963 to 1967 he served as assistant professor of Computer Science at Stanford University
and again at the University of Zurich. Then in 1968 he became Professor of Informatics at ETH
Zrich, taking two one-year sabbaticals at Xerox PARC in California (19761977 and 1984
1985). Wirth retired in 1999.
Programming languages
Wirth was the chief designer of the programming languages Euler, Algol W, Pascal, Modula,
Modula-2, Oberon, Oberon-2, and Oberon-07 . He was also a major part of the design and
implementation team for the Lilith and Oberon operating systems, and for the Lola digital
hardware design and simulation system. He received the ACM Turing Award for the
development of these languages and in 1994 he was inducted as a Fellow of the ACM. He
designed the simple programming language PL/0 to illustrate compiler design. It has formed the
basis for many university compiler design classes.

4. Chng trnh
nh ngha
- Chng trnh my tnh: l mt tp hp nhng cu lnh c vit bng mt ngn ng lp
trnh theo mt trt t xc nh nhm t ng thc hin mt s nhim v hoc chc nng
hoc gii quyt mt bi ton no .
- L mt biu hin c th ca mt gii thut trn mt ngn ng lp trnh no cng vi
nhng m t v cu trc d liu m t u vo, u ra ca bi ton cn gii quyt.
V d 1: Chng trnh gii phng trnh bc 2 bng Pascal
V d 2: Chng trnh gii phng trnh bc 2 bng C
To ra chng trnh my tnh bng cch no???
III. Cng c lp trnh
1. Ngn ng lp trnh
Khi nim

10
- Ngn ng lp trnh l mt ngn ng dng vit chng trnh cho my tnh. Ta c th
chia ngn ng lp trnh thnh cc loi sau: ngn ng my, hp ng v ngn ng cp cao.
- Ngn ng my (machine language): L cc ch th di dng nh phn, can thip trc tip
vo trong cc mch in t. Chng trnh c vit bng ngn ng my th c th c
thc hin ngay khng cn qua bc trung gian no. Tuy nhin chng trnh vit bng
ngn ng my d sai st, cng knh v kh c, kh hiu v ton nhng con s 0 v 1.
- Hp ng (assembly language): Bao gm tn cc cu lnh v quy tc vit cc cu lnh .
Tn cc cu lnh bao gm hai phn: phn m lnh (vit ta ting Anh) ch php ton cn
thc hin v a ch cha ton hng ca php ton . V d:
INPUT a ; Nhp gi tr cho a t bn phm
LOAD a ; c gi tr a vo thanh ghi tng A
PRINT a; Hin th gi tr ca a ra mn hnh.
INPUT b
ADD b; Cng gi tr ca thanh ghi tng A vi gi tr b
Trong cc lnh trn th INPUT, LOAD, PRINT, ADD l cc m lnh cn a, b l
a ch. my thc hin c mt chng trnh vit bng hp ng th chng
trnh phi c dch sang ngn ng my. Cng c thc hin vic dch c
gi l Assembler.
- Ngn ng cp cao (High level language): Ra i v pht trin nhm phn nh cch thc
ngi lp trnh ngh v lm. Rt gn vi ngn ng con ngi (Anh ng) nhng chnh xc
nh ngn ng ton hc. Cng vi s pht trin ca cc th h my tnh, ngn ng lp
trnh cp cao cng c pht trin rt a dng v phong ph, vic lp trnh cho my tnh
v th m cng c nhiu khuynh hng khc nhau: lp trnh cu trc, lp trnh hng i
tng, lp trnh logic, lp trnh hm... Mt chng trnh vit bng ngn ng cp cao c
gi l chng trnh ngun (source programs). my tnh "hiu" v thc hin c cc
lnh trong chng trnh ngun th phi c mt chng trnh dch dch chung trnh
ngun (vit bng ngn ng cp cao) thnh dng chng trnh c kh nng thc thi.

Chng trnh dch


- Nh trn trnh by, mun chuyn t chng trnh ngun sang chng trnh ch phi
c chng trnh dch. Thng thng mi mt ngn ng cp cao u c mt chng trnh
dch ring nhng chung quy li th c hai cch dch: thng dch v bin dch.
- Thng dch (interpreter): L cch dch tng lnh mt, dch ti u thc hin ti .
Chng hn ngn ng LISP s dng trnh thng dch.
- Bin dch (compiler): Dch ton b chng trnh ngun thnh chng trnh ch ri sau
mi thc hin. Cc ngn ng s dng trnh bin dch nh Pascal, C...
- Gia thng dch v bin dch c khc nhau ch: Do thng dch l va dch va thc thi
chng trnh cn bin dch l dch xong ton b chng trnh ri mi thc thi nn
chng trnh vit bng ngn ng bin dch thc hin nhanh hn chng trnh vit bng
ngn ng thng dch.
- Mt s ngn ng s dng kt hp gia thng dch v bin dch chng hn nh Java.
Chng trnh ngun ca Java c bin dch to thnh mt chng trnh i tng (mt
dng m trung gian) v khi thc hin th tng lnh trong chng trnh i tng c
thng dch thnh m my.

2. Cng c lp trnh
- Trc nhng nm 1990 ngi ta cho rng ngn ng lp trnh quyt nh kt qu lp trnh.
Chng hn, trong mt tnh hung c th no , chng trnh vit bng C++ th tt hn
Pascal, vit bng Pascal th tt hn Fortran Khi cc cng c lp trnh cn th s v cc
yu cu phn mm cha cao th nhn nh ny l kh chnh xc.

11
- Sau ngi ta cho rng cng ngh lp trnh mi nh hng ln nht n sn phm cui
cng, s thng tr trong thp k 90 ca lp trnh hng i tng v RAD (vit tt ca
Rapid Application Development ngha l Cng c pht trin ng dng nhanh, thng gi
l lp trnh trc quan hay Visual Programming) cho thy t duy ca ngi lp trnh b
nh hng bi nn tng pht trin phn mm.
- Khng ai ph phn Delphi - phin bn pht trin t ngn ng Pascal l km hn Java hay
Visual C++. Tuy mi c 1/20 thi gian ca th k 21 tri qua nhng t u th k n
nay Cng ngh thng tin c nhng bc pht trin mnh m trong c Cng ngh
phn mm. Nhu cu s dng phn mm v yu cu i vi phn mm t nhin tng vt
khin nhiu nh pht trin phn mm phi xem li cch lm vic ca mnh. chnh l
c s cho s pht trin rng ri trn ton th gii ca ngnh Cng nghip phn mm hin
nay.
- Ngi ta khng ch quan tm n cng ngh lp trnh m cn quan tm n quy trnh
pht trin phn mm.
- Cc cng ty bt u chun ha v a ra quy trnh cng ngh phn mm ca mnh -
vic la chn b cng c lp trnh c vai tr rt quan trng. Cc b cng c lp trnh hin
nay c xu hng thng nht v tng tc vi nhau cht ch. tng ny tng xut
hin trong thp k trc, tiu biu nh CORBA ca Sun hay Delphi - C++ Builder
Project Union ca Borland, tuy nhin khi chng cha c a chung.
- Khi Visual Studio.NET ca Microsoft ra i nm 2002, ngi ta nhn thy rng cc cng
c lp trnh nn i vi nhau thnh b. n thi im hin nay gii php v cng c lp
trnh ca cc nh pht trin lun c nhc n nh b cng c.
- Hin nay c rt nhiu ngn ng lp trnh (NNLT) v rt nhiu cng c lp trnh (CCLT).
Mt CCLT c th gn lin vi mt NNLT hoc khng - y l iu m mt s t ngi
khng c kinh nghim khng h bit. Ta c th phn loi:
o Theo NNLT: Dng C c Visual C++, C++ Builder Dng Pascal c Borland
Pascal, Delphi
o Theo phm vi s dng: Dng lp trnh h thng c Microsoft Assembly, Borland
C Dng lp trnh trc quan c Visual Basic, Jbuilder Dng lp trnh mng c
Java, ASP, PHP
o Theo phong cch lp trnh: Dng c in c Pascal, Fortran Dng hng i
tng c C++, SmallTalk, Java
- Cng c thng dng:
o Microsoft Visual Studio 2005, Microsoft Visual Studio 2008: C++, C##,
VisualBasic, ASPX...
o Java;
o PHP;
o Pascal, Turbo C, Dev - C++
- Chc nng ca cng c lp trnh:
1. Biu din chng trnh bng mt ngn ng lp trnh no
2. Giao din tch hp (IDE - Itergrated Developments Environment) cho php son
tho vn bn chng trnh, kim li, th nghim;
3. Bin dch thnh chng trnh c lp trn my tnh.

3. Cng c lp trnh Dev-C++


- Dev-C++ l mt cng c lp trnh vi giao din tch hp cho php lm vic trn
Windows, cho php lp trnh bng C/C++;

12
- D n pht trin Dev-C++ c lu tr trn SourceForge. Dev-C++ nguyn c pht
trin bi mt lp trnh vin c tn l Colin Laplace v ch chy trn h iu hnh
Microsoft Windows.
- Bloodshed Dev-C++ l mt Mi trng Pht trin Tch hp (IDE) c h tr y tnh
nng cho ngn ng lp trnh C/C++. N s dng trnh MinGW ca GCC (B trnh dch
GNU) lm trnh bin dch. Dev-C++ cng c th c dng kt hp vi Cygwin hay bt
k trnh dch nn tng GCC no khc.
- Chng trnh cho ngi dng c cm nhn hi ging vi hnh thc ca chng trnh
Microsoft Visual Studio vn c s dng rng ri hn. Dev-C++ c mt c im
ph l n s dung DevPaks, l mt phn gm cc gi m rng so vi mi trng tiu
chun, bao gm cc th vin, mu, v cc tin ch c a thm vo. DevPaks thng
c, nhng khng nht nh, tin ch GUI (giao din ngi dng ha), bao gm cc
cng c ph bin nh GTK+ , wxWidgets, v FLTK. C nhng DevPaks c cha cc
th vin vi thm ch nhiu hm chc nng cao hn.
- Dev-C++ ni chung l mt chng trnh ch chy trn Windows. Tuy nhin cng c
mt phin bn cho Linux, nhng vn trong giai on alpha v cha c cp nht
trong vng hn 6 nm qua.
Mt s giao din
Giao din chnh

IV. Tm tt ni dung bi hc
I. Gii thiu
1. Mc ch, Yu cu
2. Ni dung mn hc
3. Ti liu hc tp v tham kho
4. Hnh thc nh gi kt qu mn hc

13
5. Tng quan v my tnh
II. Bi ton v vic gii bi ton trn my tnh
1. Xc nh bi ton
2. Cu trc d liu v Gii thut
3. Chng trnh
III. Cng c lp trnh
1. Ngn ng lp trnh
2. Cng c lp trnh
3. Cng c lp trnh Dev-C++

V. Bi tp
1. Biu din thut ton gii cc bi ton sau bng s khi v gi m:
a. Gii phng trnh bc 2;
b. Gii h phng trnh bc nht;
c. Tnh s ngy ca mt thng mt nm no ;
d. Thut ton tm c s chung ln nht;
2. Ci t, lm quen vi giao din Dev-C++
3. Tm hiu nhng bi ton thc t, m t thut ton gii quyt vn .

14
Bi 2 - NGN NG LP TRNH C/C++
Ni dung bi hc
I. Gii thiu
II. Mt s khi nim c bn
III. Cu trc chng trnh n gin trong C
IV. Nhp/Xut d liu
V. Bi tp

I. Gii thiu
- C l ngn ng lp trnh cp cao, c s dng rt ph bin lp trnh h thng cng vi
Assembler v pht trin cc ng dng.
- Vo nhng nm cui thp k 60 u thp k 70 ca th k XX, Dennish Ritchie (lm
vic ti phng th nghim Bell) pht trin ngn ng lp trnh C da trn ngn ng
BCPL (do Martin Richards a ra vo nm 1967) v ngn ng B (do Ken Thompson
pht trin t ngn ng BCPL vo nm 1970 khi vit h iu hnh UNIX u tin trn
my PDP-7) v c ci t ln u tin trn h iu hnh UNIX ca my DEC PDP-11.
- Nm 1978, Dennish Ritchie v B.W Kernighan cho xut bn quyn Ngn ng lp
trnh C v c ph bin rng ri n nay.
- Lc ban u, C c thit k nhm lp trnh trong mi trng ca h iu hnh Unix
nhm mc ch h tr cho cc cng vic lp trnh phc tp. Nhng v sau, vi nhng nhu
cu pht trin ngy mt tng ca cng vic lp trnh, C vt qua khun kh ca phng
th nghim Bell v nhanh chng hi nhp vo th gii lp trnh ri cc cng ty lp
trnh s dng mt cch rng ri. Sau , cc cng ty sn xut phn mm ln lt a ra
cc phin bn h tr cho vic lp trnh bng ngn ng C v chun ANSI C cng c
khai sinh t .
- Ngn ng lp trnh C l mt ngn ng lp trnh h thng rt mnh v rt mm do, c
mt th vin gm rt nhiu cc hm (function) c to sn. Ngi lp trnh c th
tn dng cc hm ny gii quyt cc bi ton m khng cn phi to mi. Hn th na,
ngn ng C h tr rt nhiu php ton nn ph hp cho vic gii quyt cc bi ton k
thut c nhiu cng thc phc tp. Ngoi ra, C cng cho php ngi lp trnh t nh
ngha thm cc kiu d liu tru tng khc. Tuy nhin, iu m ngi mi va hc lp
trnh C thng gp rc ri l hi kh hiu do s mm do ca C. D vy, C c
ph bin kh rng ri v tr thnh mt cng c lp trnh kh mnh, c s dng nh
l mt ngn ng lp trnh ch yu trong vic xy dng nhng phn mm hin nay
- Ngn ng C c nhng c im c bn sau:
o Tnh c ng (compact): C ch c 32 t kha chun v 40 ton t chun, nhng
hu ht u c biu din bng nhng chui k t ngn gn.
o Tnh cu trc (structured): C c mt tp hp nhng ch th ca lp trnh nh cu
trc la chn, lp T cc chng trnh vit bng C c t chc r rng, d
hiu.
o Tnh tng thch (compatible): C c b tin x l v mt th vin chun v cng
phong ph nn khi chuyn t my tnh ny sang my tnh khc cc chng trnh
vit bng C vn hon ton tng thch.
o Tnh linh ng (flexible): C l mt ngn ng rt uyn chuyn v c php, chp
nhn nhiu cch th hin, c th thu gn kch thc ca cc m lnh lm chng
trnh chy nhanh hn.
o Bin dch (compile): C cho php bin dch nhiu tp tin chng trnh ring r
thnh cc tp tin i tng (object) v lin kt (link) cc i tng li vi nhau
thnh mt chng trnh c th thc thi c (executable) thng nht.

15
II. Mt s khi nim c bn
1. B k t
B ch vit trong ngn ng C bao gm nhng k t, k hiu sau: (phn bit ch in hoa v in
thng):
- 26 ch ci latinh ln A,B,C...Z ;
- 26 ch ci latinh nh a,b,c ...z. ;
- 10 ch s thp phn 0,1,2...9. ;
- Cc k hiu ton hc: +, -, *, /, =, <, >, (, )
- Cc k hiu c bit: :. , ; " ' _ @ # $ ! ^ [ ] { } ... ;
- Du cch hay khong trng.

2. T kha
T kha l cc t dnh ring (reserved words) ca C vi mc ch c xc nh trc. V
d:
- T kha int dng khai bo bin hoc hm vi kiu d liu s nguyn;
- T kha if dng xy dng cu lnh cu trc chn;
- T kha for dng xy dng cu lnh cu trc lp.
Danh sch cc t kha:

Lu : khng c dng t kha vo mc ch khc, hoc t tn mt i tng no (bin,


hng, tn hm ...) trng vi t kha. Cc t kha ca Turbo C 3.0 bao gm:

3. Kiu d liu
Cc kiu d liu s cp chun trong C c th c chia lm 2 dng : kiu s nguyn, kiu s
thc.

Kiu s nguyn
Kiu s nguyn l kiu d liu dng lu cc gi tr nguyn hay cn gi l kiu m c.
Kiu s nguyn trong C c chia thnh cc kiu d liu con, mi kiu c mt min gi tr khc
nhau.
Kiu s nguyn 1 byte (8 bits): Kiu s nguyn mt byte gm c 2 kiu sau:
STT Kiu d liu Min gi tr (Domain)
1 unsigned char T 0 n 255 (tng ng 256 k t trong bng m ASCII)
2 char T -128 n 127
Kiu unsigned char: lu cc s nguyn dng t 0 n 255.
khai bo mt bin l kiu k t th ta khai bo bin kiu unsigned char. Mi s trong min
gi tr ca kiu unsigned char tng ng vi mt k t trong bng m ASCII .
Kiu char: lu cc s nguyn t -128 n 127. Kiu char s dng bit tri nht lm bit du.
Nu gn gi tr > 127 cho bin kiu char th gi tr ca bin ny c th l s m (?).
Kiu s nguyn 2 bytes (16 bits): Kiu s nguyn 2 bytes gm c 4 kiu sau:
STT Kiu d liu Min gi tr (Domain)
1 enum T -32,768 n 32,767

16
2 unsigned int T 0 n 65,535
3 Short int T -32,768 n 32,767
4 int T -32,768 n 32,767
Kiu enum, short int, int : Lu cc s nguyn t -32768 n 32767. S dng bit bn tri nht
lm bit du.
Nu gn gi tr >32767 cho bin c 1 trong 3 kiu trn th gi tr ca bin ny c th l s m.
Kiu unsigned int: Kiu unsigned int lu cc s nguyn dng t 0 n 65535.
Kiu s nguyn 4 byte (32 bits): Kiu s nguyn 4 bytes hay cn gi l s nguyn di (long)
gm c 2 kiu sau:
STT Kiu d liu Min gi tr (Domain)
1 unsigned long T 0 n 4,294,967,295
2 long T -2,147,483,648 n 2,147,483,647
Kiu long : Lu cc s nguyn t -2147483658 n 2147483647. S dng bit bn tri nht
lm bit du.
Nu gn gi tr >2147483647 cho bin c kiu long th gi tr ca bin ny c th l s m.
Kiu unsigned long: Kiu unsigned long lu cc s nguyn dng t 0 n 4294967295

Kiu s thc
Kiu s thc dng lu cc s thc hay cc s c du chm thp phn gm c 3 kiu sau:
STT Kiu d liu Kch thc (Size) Min gi tr (Domain)
1 float 4 bytes T 3.4 * 10-38 n 3.4 * 1038
2 double 8 bytes T 1.7 * 10-308 n 1.7 * 10308
3 long double 10 bytes T 3.4 *10-4932 n 1.1 *104932
Mi kiu s thc trn u c min gi tr v chnh xc (s s l) khc nhau. Ty vo nhu
cu s dng m ta c th khai bo bin thuc 1 trong 3 kiu trn.
Ngoi ra ta cn c kiu d liu void, kiu ny mang ngha l kiu rng khng cha gi tr g
c.

4. Tn, Bin, hng

Tn
Tn hay cn gi l danh biu (identifier) c dng t cho chng trnh, hng, kiu, bin,
chng trnh con... Tn c hai loi l tn chun v tn do ngi lp trnh t.
- Tn chun l tn do C t sn nh tn kiu: int, char, float,; tn hm: sin, cos...
- Tn do ngi lp trnh t t dng trong chng trnh ca mnh.
S dng b ch ci, ch s v du gch di (_) t tn, nhng phi tun th quy tc:
- Bt u bng mt ch ci hoc du gch di;
- Khng c khong trng gia tn;
- Khng c trng vi t kha;
- di ti a ca tn l khng gii hn, tuy nhin ch c 31 k t u tin l c ngha;
- Khng cm vic t tn trng vi tn chun nhng khi ngha ca tn chun khng
cn gi tr na.
V d: tn do ngi lp trnh t:
Chieu_dai, Chieu_Rong, Chu_Vi, Dien_Tich
Tn khng hp l: Do Dai, 12A2,
Bin

17
Bin l mt i lng c ngi lp trnh nh ngha v c t tn thng qua vic khai bo
bin. Bin dng cha d liu trong qu trnh thc hin chng trnh v gi tr ca bin c th
b thay i trong qu trnh ny. Mi bin phi thuc v mt kiu d liu xc nh v c min gi
tr thuc kiu .
C php khai bo bin:
<Kiu d liu> Danh sch cc tn bin cch nhau bi du phy;
V d:
int a, b, c; /*Ba bi n a, b,c c kiu int*/
long int chu_vi; /*Bi n chu_vi c kiu long*/
float nua_chu_vi; /*Bi n nua_chu_vi c kiu float*/
double dien_tich; /*Bi n dien_tich c kiu double*/
Lu : kt thc 1 lnh phi c du chm phy (;) cui lnh.
V tr khai bo bin trong C
Trong ngn ng lp trnh C, ta phi khai bo bin ng v tr. Nu khai bo (t cc bin) khng
ng v tr s dn n nhng sai st ngoi mun m ngi lp trnh khng lng trc (hiu
ng l). Chng ta c 2 cch t v tr ca bin nh sau:
- Khai bo bin ngoi: Cc bin ny c t bn ngoi tt c cc hm v n c tc dng
hay nh hng n ton b chng trnh (cn gi l bin ton cc), v d :
int i; /*Bien ben ngoai */
float pi; /*Bien ben ngoai*/
int main()
{ }
- Khai bo bin trong: Cc bin c t bn trong hm, chng trnh chnh hay mt
khi lnh. Cc bin ny ch c tc dng hay nh hng n hm, chng trnh hay khi
lnh cha n. Khi khai bo bin, phi t cc bin ny u ca khi lnh, trc cc
lnh gn,
V d 1:
#include <stdio.h>
#include <conio.h>
int bienngoai; /*khai bao bien ngoai*/
int main ()
{
int j,i; /*khai bao bien ben trong chuong trinh chinh*/
i=1; j=2;
bienngoai=3;
printf("\n Gia tri cua i la %d",i);
/*%d l s nguyn, s bit sau */
printf("\n Gia tri cua j la %d",j);
printf("\n Gia tri cua bienngoai la %d",bienngoai);
getch();
return 0;
}
V d 2:
#include <stdio.h>
#include<conio.h>
int main ()
{
int i, j; /*Bien ben trong*/

18
i=4; j=5;
printf("\n Gia tri cua i la %d",i);
printf("\n Gia tri cua j la %d",j);
if(j>i)
{
int hieu=j-i; /*Bien ben trong */
printf("\n Hieu so cua j tru i la %d",hieu);
}
else
{
int hieu=i-j ; /*Bien ben trong* /
printf("\n Gia tri cua i tru j la %d",hieu);
}
getch();
return 0;
}
Hng
L i lng khng i trong sut qu trnh thc thi ca chng trnh.
C php:
const <Kiu d liu> <Tn_hng> = Gi_tr;
V d:
const int heso=10;
Hng s thc
S thc bao gm cc gi tr kiu float, double, long double c th hin theo 2 cch sau:
- Cch 1: S dng cch vit thng thng m chng ta s dng trong cc mn
Ton, L, iu cn lu l s dng du thp phn l du chm (.);
V d: 123.34 -223.333 3.00 -56.0
- Cch 2: S dng cch vit theo s m hay s khoa hc. Mt s thc c tch lm
2 phn, cch nhau bng k t e hay E
Phn gi tr: l mt s nguyn hay s thc c vit theo cch 1.
Phn m: l mt s nguyn
Gi tr ca s thc l: Phn gi tr nhn vi 10 m phn m.
V d: 1234.56e-3 = 1.23456 (l s 1234.56 * 10-3)
-123.45E4 = -1234500 ( l -123.45 *104)
Hng s nguyn
S nguyn gm cc kiu int (2 bytes) , long (4 bytes) c th hin theo nhng cch sau :
- Hng s nguyn 2 bytes (int) h thp phn: L kiu s m chng ta s dng thng
thng, h thp phn s dng cc k s t 0 n 9 biu din mt gi tr nguyn.
V d: 123, -242
- Hng s nguyn 2 byte (int) h bt phn: L kiu s nguyn s dng 8 k s t 0
n 7 biu din mt s nguyn.

19
Cch biu din: 0<cc k s t 0 n 7>
V d : 0345, -020 (s 345, -20 trong h bt phn)
- Hng s nguyn 2 byte (int) h thp lc phn: L kiu s nguyn s dng 10 k s
t 0 n 9 v 6 k t A, B, C, D, E ,F biu din mt s nguyn.
Cch biu din: 0x<cc k s t 0 n 9 v 6 k t t A n F>
- Hng s nguyn 4 byte (long): S long (s nguyn di) c biu din nh s int
trong h thp phn v km theo k t l hoc L. Mt s nguyn nm ngoi min gi
tr ca s int ( 2 bytes) l s long ( 4 bytes).
V d: 45345L hay 45345l hay 45345
- Cc hng s cn li: Vit nh cch vit thng thng (khng c du phn cch
gia 3 s)
Hng k t
Hng k t l mt k t ring bit c vit trong cp du nhy n (). Mi mt k t
tng ng vi mt gi tr trong bng m ASCII. Hng k t cng c xem nh tr s
nguyn.
V d: a, A, 0, 9
Chng ta c th thc hin cc php ton s hc trn 2 k t (thc cht l thc hin php
ton trn gi tr ASCII ca chng)
Hng chui k t
Hng chui k t l mt chui hay mt xu k t c t trong cp du nhy kp (). V
d: Ngon ngu lap trinh C, Khoa CNTT-HVKTQS.
Lu :
- Mt chui khng c ni dung c gi l chui rng;
- Khi lu tr trong b nh, mt chui c kt thc bng k t NULL (\0: m
Ascii l 0);
- biu din k t c bit bn trong chui ta phi thm du \ pha trc. V d:
Im a student phi vit I\m a student; Day la ky tu dac biet phi vit
Day la ky tu \dac biet\.

5. Biu thc
Biu thc l mt s kt hp gia cc ton t (operator) v cc ton hng (operand) theo
ng mt trt t nht nh. Mi ton hng c th l mt hng, mt bin hoc mt biu
thc khc.
Trong trng hp, biu thc c nhiu ton t, ta dng cp du ngoc n () ch nh
ton t no c thc hin trc.
V d: Biu thc nghim ca phng trnh bc hai:
(-b + sqrt(Delta))/(2*a)
Trong 2 l hng; a, b, Delta l bin.
Cc ton t s hc
Trong ngn ng C, cc ton t +, -, *, / lm vic tng t nh khi chng lm vic trong
cc ngn ng khc. Ta c th p dng chng cho a s kiu d liu c sn c cho php

20
bi C. Khi ta p dng php / cho mt s nguyn hay mt k t, bt k phn d no cng
b ct b. Chng hn, 5/2 bng 2 trong php chia nguyn.

Ton t ngha
+ Cng
- Tr
* Nhn
/ Chia
% Chia ly phn d
-- Gim 1 n v
++ Tng 1 n v
Tng v gim (++ & --)
Ton t ++ thm 1 vo ton hng ca n v - tr bt 1. Ni cch khc:
x = x + 1 ging nh ++x
x = x 1 ging nh x
C 2 ton t tng v gim u c th tin t (t trc) hay hu t (t sau) ton hng. V
d: x = x + 1 c th vit x++ (hay ++x)
Tuy nhin gia tin t v hu t c s khc bit khi s dng trong 1 biu thc. Khi 1 ton
t tng hay gim ng trc ton hng ca n, C thc hin vic tng hay gim trc khi
ly gi tr dng trong biu thc. Nu ton t i sau ton hng, C ly gi tr ton hng
trc khi tng hay gim n.
Tm li:
x = 10
y = ++x //y = 11
Tuy nhin:
x = 10
y = x++ //y = 10
Th t u tin ca cc ton t s hc: ++ -- sau l * / % ri mi n + -

Cc ton t quan h v cc ton t Logic


tng chnh ca ton t quan h v ton t Logic l ng hoc sai. Trong C mi gi tr
khc 0 c gi l ng, cn sai l 0. Cc biu thc s dng cc ton t quan h v Logic
tr v 0 nu sai v tr v 1 nu ng.
Ton t ngha
Cc ton t quan h
> Ln hn
>= Ln hn hoc bng

21
< Nh hn
<= Nh hn hoc bng
== Bng
!= Khc
Cc ton t Logic
&& AND
|| OR
! NOT

Bng chn tr cho cc ton t Logic:

P q p&&q p||q !p
0 0 0 0 1
0 1 0 1 1
1 0 0 1 0
1 1 1 1 0

Cc ton t quan h v Logic u c u tin thp hn cc ton t s hc. Do mt


biu thc nh: 10 > 1+ 12 s c xem l 10 > (1 + 12) v kt qu l sai (0).
Ta c th kt hp vi ton t li vi nhau thnh biu thc nh sau:
10>5&&!(10<9)||3<=4 Kt qu l ng
Th t u tin ca cc ton t quan h l Logic
Cao nht: !
> >= < <=
== !=
&&
Thp nht: ||
Cc ton t Bitwise
Cc ton t Bitwise ni n kim tra, gn hay s thay i cc Bit tht s trong 1 Byte
ca Word, m trong C chun l cc kiu d liu v bin char, int. Ta khng th s dng
cc ton t Bitwise vi d liu thuc cc kiu float, double, long double, void hay cc
kiu phc tp khc.

Ton t ngha
& AND
| OR
^ XOR
~ NOT

22
>> Dch phi
<< Dch tri

Bng chn tr ca ton t ^ (XOR)

p q p^q
0 0 0
0 1 1
1 0 1
1 1 0
Ton t ? cng vi :
C c mt ton t rt mnh v thch hp thay th cho cc cu lnh ca If-Then-Else. C
php ca vic s dng ton t ? l:
E1 ? E2 : E3
Trong E1, E2, E3 l cc biu thc.
ngha: Trc tin E1 c c lng, nu ng E2 c c lng v n tr thnh gi
tr ca biu thc; nu E1 sai, E3 c c lng v tr thnh gi tr ca biu thc.
V d:
X = 10
Y = X > 9 ? 100 : 200
Th Y c gn gi tr 100, nu X nh hn 9 th Y s nhn gi tr l 200. on m
ny tng ng cu trc if nh sau:
X = 10
if (X < 9) Y = 100
else Y = 200
Ton t con tr & v *
Mt con tr l a ch trong b nh ca mt bin. Mt bin con tr l mt bin c khai
bo ring cha mt con tr n mt i tng ca kiu ch ra n. Ta s tm hiu k
hn v con tr trong chng v con tr. y, chng ta s cp ngn gn n hai ton
t c s dng thao tc vi cc con tr.
Ton t th nht l &, l mt ton t quy c tr v a ch b nh ca h s ca n.
V d: m = &count
t vo bin m a ch b nh ca bin count.
Chng hn, bin count v tr b nh 2000, gi s count c gi tr l 100. Sau cu lnh
trn m s nhn gi tr 2000.
Ton t th hai l *, l mt b sung cho &; y l mt ton t quy c tr v gi tr ca
bin c cp pht ti a ch theo sau .
V d: q = *m
S t gi tr ca count vo q. By gi q s c gi tr l 100 v 100 c lu tr ti a ch
2000.

23
Ton t du phy ,
Ton t du , c s dng kt hp cc biu thc li vi nhau. Bn tri ca ton t
du , lun c xem l kiu void. iu c ngha l biu thc bn phi tr thnh gi tr
ca tng cc biu thc c phn cch bi du phy.
V d: x = (y=3,y+1);
Trc ht gn 3 cho y ri gn 4 cho x. Cp du ngoc n l cn thit v ton t du , c
u tin thp hn ton t gn.
Du ngoc n v du ngoc vung
Trong C, cp du ngoc n l ton t tng u tin ca cc biu thc bn trong n.
Cc cp du ngoc vung thc hin thao tc truy xut phn t trong mng.
Cch vit tt trong C
C nhiu php gn khc nhau, i khi ta c th s dng vit tt trong C na. Chng hn:
x = x + 10 c vit thnh x +=10
Ton t += bo cho chng trnh dch bit tng gi tr ca x ln 10. Cch vit ny lm
vic trn tt c cc ton t nh phn (php ton hai ngi) ca C. Tng qut:
(Bin) = (Bin) (Ton t) (Biu thc)
c th c vit:
(Bin) (Ton t)= (Biu thc)
Tng kt v u tin
Cao nht () []
! ~ ++ -- (Kiu) * &
*/%
+-
<< >>
< <= > >=
&
^
|
&&
||
?:
= += -= *= /=
Thp nht ,

24
III. Cu trc mt chng trnh n gin
1. Cu trc chung
Chng trnh sau c vit bng C, cho php ngi s dng nhp vo 2 s ri in ra kt
qu l tng 2 s .
Xt chng trnh sau:
/* 1. Khai bao su dung thu vien*/
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
/* 2. Khai bao Kieu du lieu*/
// se de cap o bai sau
/* 3. Khai bao hang */
#define heso 10
/* 4. Khai bao bien */
int a, b;
/* 5. Chuong trinh chinh */
int main()
{ /* Chuong trinh cho phep nhap vao hai so a v b,
Tinh va in ra tong hai so do */
float ketqua; // Khai bao bien ketqua
system("cls"); // Xoa man hinh
printf("Nhap vao A va B:"); // Hien thi thong bao huong dan nhap lieu
scanf("%d %d",&a,&b); // Nhap cac gia tri cho a va b tu ban phim
ketqua =float((a+b))/heso;
printf("Tong %d va %d la %0.1f\n",a,b,ketqua); // Hien thi ket qua ra man hinh
printf("Nhan phim bat ky de ket thuc!");
getch(); // Doi nhan phim bat ky de tiep tuc
return 0;
}

Kt qu thc hin chng trnh c nh hnh sau:

25
V c bn C khng qui nh 1 cch cht ch cu trc ca mt chng trnh; C ch qui
nh mt chng trnh phi c hm main, v ng thi l chng trnh chnh ca
chng trnh. Thng thng mt chng trnh C gm cc phn:
- Khai bo th vin;
- Khai bo bin; hng;
- Chng trnh chnh;

2. Khai bo s dng th vin


Phn khai bo s dng th vin:
C php:
#include <tn th vin> ->
Hoc
#include tn th vin ->
V d:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
Xem Help bit danh sch cc include file

3. Khai bo hng, bin, kiu


Khai bo (nh ngha) Hng
C ph:
#define Tn_Hng Gi_tri
V d:
#define heso 10
Khai bo (nh ngha) Bin
C ph:
Kiu_D_liu Danh_sch_Tn_Bin;
V d:
int a, b;

4. Mt s lnh n
- Lnh gn
- Lnh xa mn hnh
- Lnh dng chng trnh

5. Ch thch
Tt c cc dng bt u bng hai du s (//) c coi l cht thch m chng khng c bt
k mt nh hng no n hot ng ca chng trnh. Chng c th c cc lp trnh
vin dng gii thch hay bnh phm bn trong m ngun ca chng trnh. Trong
trng hp ny, dng ch thch l mt gii thch ngn gn nhng g m chng trnh
chng ta lm.

26
Trong ngn ng lp trnh C, ni dung ch thch phi c vit trong cp du /* v */.

6. Chng trnh chnh


int main ()
Dng ny tng ng vi phn bt u khai bo hm main. Hm main l im m tt c
cc chng trnh C++ bt u thc hin. N khng ph thuc vo v tr ca hm ny (
u, cui hay gia ca m ngun) m ni dung ca n lun c thc hin u tin khi
chng trnh bt u. Thm vo , do nguyn nhn ni trn, mi chng trnh C++ u
phi tn ti mt hm main.
int main()
{
.
return 0.
}
Theo sau main l mt cp ngoc n bi v n l mt hm. Trong C++, tt c cc hm
m sau l mt cp ngoc n () th c ngha l n c th c hoc khng c tham s
(khng bt buc). Ni dung ca hm main tip ngay sau phn khai bo chnh thc c
bao trong cc ngoc nhn ( { } ) nh trong v d.

return 0;

Lnh return kt thc hm main v tr v m i sau n, trong trng hp ny l 0. y l


mt kt thc bnh thng ca mt chng trnh khng c mt li no trong qu trnh thc
hin. Nh bn s thy trong cc v d tip theo, y l mt cch ph bin nht kt thc
mt chng trnh C++.

IV. Nhp/Xut d liu


1. Nhp d liu t bn phm Hm scanf()
L hm cho php c d liu t bn phm v gn cho cc bin trong chng trnh khi
chng trnh thc thi. Trong ngn ng C, l hm scanf nm trong th vin stdio.h.
C php:
scanf(Chui nh dng, a ch ca cc bin);
Gii thch:
- Chui nh dng: dng qui nh kiu d liu, cch biu din, rng, s ch s
thp phn... Mt s nh dng khi nhp kiu s nguyn, s thc, k t.

nh dng ngha
%[s ch s]d Nhp s nguyn c ti a <s ch s>
%[s ch s] f Nhp s thc c ti a <s ch s> tnh c du chm
%c Nhp mt k t
V d:
%d Nhp s nguyn

27
%4d Nhp s nguyn ti a 4 k s, nu nhp nhiu hn 4 k s th ch
nhn c 4 k s u tin
%f Nhp s thc
%6f Nhp s thc ti a 6 k s (tnh lun du chm), nu nhp nhiu hn
6 k s th ch nhn c 6 k s u tin (hoc 5 k s vi du
chm)
- a ch ca cc bin: l a ch (&) ca cc bin m chng ta cn nhp gi tr cho
n. c vit nh sau: &<tn bin>.
V d:
scanf(%d,&bien1);/*Doc gia tri cho bien1 co kieu nguyen*/
scanf(%f,&bien2); /*Doc gia tri cho bien2 co kieu thc*/
scanf(%d%f,&bien1,&bien2);
/*Doc gia tri cho bien1 co kieu nguyen, bien2 co kieu
thuc*/
scanf(%d%f%c,&bien1,&bien2,&bien3);
/*bien3 co kieu char*/
Lu :
- Chui nh dng phi t trong cp du nhy kp ().
- Cc bin (a ch bin) phi cch nhau bi du phy (,).
- C bao nhiu bin th phi c by nhiu nh dng ;
- Th t ca cc nh dng phi ph hp vi th t ca cc bin ;
- nhp gi tr kiu char c chnh xc, nn dng hm fflush(stdin) loi b
cc k t cn nm trong vng m bn phm trc hm scanf() ;
- nhp vo mt chui k t (khng cha khong trng hay kt thc bng khong
trng), chng ta phi khai bo kiu mng k t hay con tr k t, s dng nh
dng %s v tn bin thay cho a ch bin. ;
- c vo mt chui k t c cha khong trng (kt thc bng phm Enter) th
phi dng hm gets().
Mt s v d khc:
int biennguyen;
float bienthuc;
char bienchar;
char chuoi1[20], *chuoi2;
1. Lnh: scanf(%3d,&biennguyen); Nu ta nhp 1234455 th gi tr ca
biennguyen l 3 k s u tin (123). Cc k s cn li s cn nm li trong vng
m.
2. Lnh: scanf(%5f,&bienthuc); Nu ta nhp 123.446 th gi tr ca
bienthuc l 123.4, cc k s cn li s cn nm trong vng m.
3. Lnh: scanf(%2d%5f,&biennguyen, &bienthuc); Nu ta nhp
lin tip 2 s cch nhau bi khong trng: 1223 3.142325 th :
a. 2 k s u tin (12) s c c vo cho biennguyen ;
b. 2 k s tip theo trc khong trng (23) s c c vo cho bienthuc.

28
4. Lnh:scanf(%2d%5f%c,&biennguyen,&bienthuc,&bienchar);
Nu ta nhp lin tip 2 s cch nhau bi khong trng: 12345 3.142325 th :
a. 2 k s u tin (12) s c c vo cho biennguyen ;
b. 3 k s tip theo trc khong trng (345) s c c vo cho bienthuc ;
c. Khong trng s c c cho bienchar.
Nu ta ch nhp 1 s gm nhiu k s nh sau: 123456789:
d. 2 k s u tin (12) s c c vo cho biennguyen ;
e. 5 k s tip theo (34567) s c c vo cho bienthuc ;
f. bienchar s c gi tr l k s tip theo 8.
5. Lnh: scanf(%s,chuoi1); hoc scanf(%s,chuoi2); Nu ta
nhp chui nh sau: Nguyen Van Huynh th gi tr ca bin chuoi1 hay chuoi2
ch l Nguyen .
6. Lnh: scanf(%s%s,chuoi1, chuoi2); Nu ta nhp chui nh sau:
Duong Van Hieu th gi tr ca bin chuoi1 l Duong v gi tr ca bin chuoi2
l Van.
V sao nh vy? C s c t u n khi gp khong trng v gn gi tr cho bin u
tin, phn cn li sau khong trng l gi tr ca cc bin tip theo.
gets(chuoi1);
Nu nhp chui : Nguyen Van Lai th gi tr ca bin chuoi1 l Nguyen Van Lai

2. Xut d liu ra mn hnh - Hm printf()


Hm printf (nm trong th vin stdio.h) dng xut gi tr ca cc biu thc ln mn
hnh.
C php:
printf(Chui nh dng [, Cc biu thc]);
Gii thch:
- Chui nh dng: dng qui nh kiu d liu, cch biu din, rng, s ch s
thp phn... Mt s nh dng khi i vi s nguyn, s thc, k t.

nh dng ngha
%d Xut s nguyn
%[.s ch s thp phn] f Xut s thc c <s ch s thp phn> theo quy tc lm
trn s.
%o Xut s nguyn h bt phn
%x Xut s nguyn h thp lc phn
%c Xut mt k t
%s Xut chui k t
%e hoc %E hoc %g hoc Xut s nguyn dng khoa hc (nhn 10 m x)
%G

29
V d
%d In ra s nguyn
%4d In s nguyn ti a 4 k s, nu s cn in nhiu hn 4
k s th in ht
%f In s thc
%6f In s thc ti a 6 k s (tnh lun du chm), nu s
cn in nhiu hn 6 k s th in ht
%.3f In s thc c 3 s l, nu s cn in c nhiu hn 3 s l
th lm trn.
- Cc biu thc: l cc biu thc m chng ta cn xut gi tr ca n ln mn hnh, mi
biu thc phn cch nhau bi du phy (,).
V d 1:
#include<stdio.h>
#include<conio.h>
int main()
{
int bien_nguyen=1234, i=65;
float bien_thuc=123.456703;
printf("Gia tri nguyen cua bien nguyen
=%d\n",bien_nguyen);
printf("Gia tri thuc cua bien thuc =%f\n",bien_thuc);
printf("Truoc khi lam tron=%f \n Sau khi lam
tron=%.2f",bien_thuc, bien_thuc);
getch();
return 0;
}

Kt qu in ra mn hnh nh sau:

Lu : i vi cc k t iu khin, ta khng th s dng cch vit thng thng hin


th chng. K t iu khin l cc k t dng iu khin cc thao tc xut, nhp d
liu; mt s k t iu khin c m t trong bng sau:

30
K t iu Gi tr thp K t c
ngha
khin lc phn hin th

\a 0x07 BEL Pht ra ting chung


\b 0x08 BS Di chuyn con tr sang tri 1 k t v
xa k t bn tri (backspace)
\f 0x0C FF Sang trang
\n 0x0A LF Xung dng
\r 0x0D CR Tr v u dng
\t 0x09 HT Tab theo ct (ging g phm Tab)
\\ 0x5C \ Du \
\ 0x2C Du nhy n ()
\ 0x22 Du nhy kp ()
\? 0x3F ? u chm hi (?)
\ddd ddd K t c m ACSII trong h bt phn l s ddd
\xHHH oxHHH K t c m ACSII trong h thp lc phn l HHH
V d 2:
#include <stdio.h>
#include <conio.h>
int main ()
{
printf("\n Tieng Beep \a");
printf("\n Doi con tro sang trai 1 ky tu\b");
printf("\n Dau Tab \tva dau backslash \\");
printf("\n Dau nhay don \' va dau nhay kep \"");
printf("\n Dau cham hoi \?");
printf("\n Ky tu co ma bat phan 101 la \101");
printf("\n Ky tu co ma thap luc phan 41 la \x041");
printf("\n Dong hien tai, xin go enter");
getch();
printf("\rVe dau dong");
getch();
return 0;
}

3. V d
V d 1: Vit chng trnh cho php nhp vo 2 s a v b, trnh by kt qu v phng
php cng 2 s theo hnh thc sau (vi a=876 v b=7655):
876

31
+
7655
-----------------------------
= 8531
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
// Chuong trinh chinh
int main()
{
int a,b,tong;
system("cls");
printf("Nhap vao a va b:");
scanf("%d %d",&a,&b);
printf("Ket qua theo phuong phap cong \n\n");
tong=a+b;
printf("%20d\n",a);
printf("%10s\n","+");
printf("%20d\n",b);
printf("%20s\n","-------------------- ");
printf("%20d\n\n",tong);
printf("Nhan phim bat ky de ket thuc!");
getch();
return 0;
}
Kt qu thc hin

V. Tm tt ni dung bi hc
I. Gii thiu
II. Mt s khi nim c bn
1. B k t
2. T kha
3. Kiu d liu
4. Tn, Bin, hng

32
5. Biu thc
III. Cu trc chng trnh n gin trong C
1. Cu trc chung
2. Khai bo s dng th vin
3. Khai bo hng, bin, kiu
4. Mt s lnh n
5. Ch thch
6. Chng trnh chnh
IV. Nhp/Xut d liu
1. Nhp d liu t bn phm Hm scanf()
2. Xut d liu ra mn hnh Hm printf()
3. v d

VI. Bi tp
Xem Bi 3 - Bi tp thc hnh Mi trng lp trnh Dev-C++ v cc lnh vo/ra c
bn.

33
Bi 3 - Bi thc hnh: MI TRNG LP TRNH V CC
LNH VO/RA
I. Lm quen mi trng Dev-C++
1. Khi ng Dev-C++

Kch p vo biu tng trn mn hnh.

2. Giao din chnh

II. Bi tp lm theo yu cu
1. Tnh din tch mt tam gic

Yu cu: Cho cnh y a mt hnh tam gic v ng cao tng ng l h, hy tnh din
tch hnh tam gic .

Son tho vn bn chng trnh nh sau:

/* Vi du 1 - Tinh dien tich tam giac khi biet chieu cao va canh day */
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

34
// Chuong trinh chinh
int main()
{ int a,h; // a - chieu dai day, h - chieu cao
float s; // Dien tich tam gia
system("cls"); // Xoa man hinh
printf("Nhap vao a va h:");
scanf("%d %d",&a,&h);
s=a*h;
printf("Dien tich bang ", s);
printf("Nhan phim bat ky de ket thuc!");
getch(); // Dung doi nhan phim bat ky
return 0;
}
Th nghim 1:
1. Nhn F9, giao din xut hin nh sau:

2. Nhp vo cc gi tr: 4 5 Enter, khi kt qu nhn c nh sau:

3. Nhn xt v kt qu nhn c
Th nghim 2:
1. Thay dng printf("Dien tich bang ", s);
Bng dng printf("Dien tich bang %f", s);

35
2. Nhn xt v kt qu nhn c so vi th nghim 1.
Th nghim 3:
1. Thay dng printf("Dien tich bang %f", s);
Bng dng printf("Dien tich bang %10.2f", s);
2. Nhn xt v kt qu nhn c so vi th nghim 2.

2. Tnh tng, hiu, tch, thng ca 2 s


Yu cu: Vit chng trnh cho php nhp vo 2 s, tnh v in ra mn hnh tng, hiu,
tch v thng ca 2 s .
Son tho vn bn chng trnh nh sau
/* Chuong trinh tinh TONG, HIEU, TICH, THUONG 2 so*/
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
/* Chuong trinh chinh */
int main()
{ /* 1. Khai bao bien va chuan bi*/
int a,b;
float tong, hieu,tich, thuong;
system("cls");
/* 2. Huong dan nhap va Nhap du lieu vao*/
printf("Nhap vao A va B:");
scanf("%d %d",&a,&b);
/* 3. Tinh toan TONG, HIEU, TICH, THUONG*/
tong=a+b;
hieu=a-b;
tich=a*b;
thuong=a/b;
/* 4. Trinh bay ket qua r*/
printf("Tong %d + %d = %10.2f\n", a,b,tong);
printf("Hieu %d - %d = %10.2f\n", a,b,hieu);
printf("Tich %d * %d = %10.2f\n", a,b,tich);
printf("Thuong %d / %d = %10.2f\n", a,b,thuong);
printf("Nhan phim bat ky de ket thuc!");
/* 5. Doi nhan phim bat ky de ket thuc*/
getch();
return 0;
}
Th nghim 1:
1. Nhn F9, giao din xut hin nh hnh sau:

36
2. Nhp vo cc gi tr: 4 5 Enter, khi kt qu nhn c nh hnh sau.

3. Nhn xt v kt qu nhn c.
Th nghim 2: Cho A=6, B=4 nhn xt v kt qu nhn c;
Th nghim 3: Cho A=6, B=0 nhn xt v kt qu nhn c;

III. Bi tp t lm
T thc hin cc bi tp sau
2. Vit chng trnh in ln mn hnh mt thip mi d sinh nht c dng:
*******************************************
THIEP MOI
Than moi ban : Nguyen Van Manh
Toi du le sinh nhat cua minh
Vao luc 19h ngay 12/10/2008
Tai 100 Hoang Quoc Viet Ha noi
Rat mong uoc don tiep !
Ho Thu Huong

37
*******************************************
3. Vit chng trnh nhp vo bn knh r ca mt hnh trn. Tnh chu vi v din tch ca
hnh trn theo cng thc :
Chu vi CV = 2*Pi*r
Din tch S = Pi*r*r
In cc kt qu ln mn hnh
4. Vit chng trnh nhp vo di 3 cnh a, b, c ca mt tam gic. Tnh chu vi v
din tch ca tam gic theo cng thc:
Chu vi CV = a+b+c
Din tch S = sqrt(p*(p-a)*(p-b)*(p-c))
Trong : p=CV/2
In cc kt qu ln mn hnh
5. Vit chng trnh tnh log x vi a, x l cc s thc nhp vo t bn phm, v x>0,
a
a>0, a <> 1.( dng log x=lnx/lna) .
a

6. Vit chng trnh nhp vo ta ca hai im (x1, y1) v (x2, y2)


a) Tnh h s gc ca ng thng i qua hai im theo cng thc:
H s gc = (y2 - y1) /(x2 - x1)
b) Tnh khong cch gia hai im theo cng thc:
Khong cch = ( y 2 y1 ) 2 ( x 2 x1 ) 2

7. Vit chng trnh nhp vo mt k t:


a) In ra m Ascii ca k t .
b) In ra k t k tip ca n.
8. Vit chng trnh nhp vo cc gi tr in tr R1, R2, R3 ca mt mch in :
1 1 1 1
Tnh tng tr theo cng thc:
R R1 R2 R3

9. Vit chng trnh nhp vo im ba mn Ton, L, Ha ca mt hc sinh. In ra im


trung bnh ca hc sinh vi hai s l thp phn.
10. Vit chng trnh nhp vo ngy, thng, nm. In ra ngy thng nm theo dng
dd/mm/yy. (dd: ngy, mm: thng, yy: nm. V d: 20/11/99).

38
11. Vit chng trnh o ngc mt s nguyn dng c ng 3 ch s.
12. Cho hai s x= 100; y = 200; Hy in ra mn hnh cc kt qu ca cc biu thc:
x&y; x&x; !x&y; x^y^y;
13. Biu din cc hng s nguyn 2 byte sau y di dng s nh phn, bt phn, thp
lc phn :
a)12 b) 255 c) 31000 d) 32767 e) -32768
14. Biu din cc hng k t sau y di dng s nh phn, bt phn.
a) A b) a c) Z d) z
15. Cho h s k v s x (c biu din h c s k), s k1 c nhp vo t bn phm.
Hy i s x t h c s k sang h c s k1, bit k, k1 c th nhn cc s: 2, 8, 10, 16.

39
Bi 4 - IU KHIN CHN
Ni dung bi hc
I.Khi lnh
II. Lnh IF
III. Lnh SWITCH
IV. V d
V. Bi tp

I. Khi lnh
Mt dy cc khai bo cng vi cc cu lnh nm trong cp du ngoc mc { v } c
gi l mt khi lnh.
V d 1:
{
char ten[30];
printf(\n Nhap vao ten cua ban:);
scanf(%s, ten);
printf(\n Chao Ban %s,ten);
}
V d 2:
#include <stdio.h>
#include<conio.h>
int main ()
{
char ten[50];
printf("Xin cho bie t ten cua ban !");
scanf("%s",ten);
getch();
return 0;
}
Mt khi lnh c th cha bn trong n nhiu khi lnh khc gi l khi lnh lng nhau.
S lng nhau ca cc khi lnh l khng hn ch.
Minh ha:
{
lnh;
{
lnh;
{
lnh;
}
lnh;
}
lnh;
}
Lu v phm vi tc ng ca bin trong khi lnh lng nhau: Trong cc khi lnh
khc nhau hay cc khi lnh lng nhau c th khai bo cc bin cng tn.

40
V d 3:
{
lnh;
{
int a,b; /*bin a, b trong khi lnh th nht*/
lnh;
}
lnh;
{
int a,b; /*bin a,b trong khi lnh th hai*/
lnh;
}
}
V d 4:
{
int a, b; /*bin a,b trong khi lnh bn ngoi*/
lnh;
{
int a,b; /*bin a,b bn trong khi lnh con*/
}
}
- Nu mt bin c khai bo bn ngoi khi lnh v khng trng tn vi bin bn
trong khi lnh th n cng c s dng bn trong khi lnh.
- Mt khi lnh con c th s dng cc bin bn ngoi, cc lnh bn ngoi khng
th s dng cc bin bn trong khi lnh con.

II. Lnh IF
C php
if (<Biu thc iu kin>)

{
<Cng vic 1>
}
[else
{
<Cng vic 2>
}]

Lu c php:

41
ng Sai
BT iu kin

Cng vic 1 Cng vic 2

Gii thch:
- Cng vic 1, cng vic 2 c th hin l 1 cu lnh hay 1 khi lnh.
- u tin Biu thc iu kin c kim tra trc.
- Nu iu kin ng th thc hin cng vic 1.
- Nu iu kin sai th thc hin cng vic 2.
- Vic c thc hin cng vic 2 hay khng l mt la chn, c th c hoc khng.

V d 1: Yu cu ngi thc hin chng trnh nhp vo mt s thc a. In ra mn hnh


kt qu nghch o ca a khi a 0, khi a =0 in ra thng bo Khong the tim duoc nghich
dao cua a
#include <stdio.h>
#include <conio.h>
int main ()
{
float a;
printf("Nhap a = "); scanf("%f",&a);
if (a !=0 )
printf("Nghich dao cua %f la %f",a,1/a);
else
printf(Khong the tim duoc nghich dao cua a);
getch();
return 0;
}
Gii thch:
- Nu chng ta nhp vo a 0 th cu lnh printf("Nghich dao cua %f la
%f",a,1/a)c thc hin, ngc li cu lnh printf(Khong the tim
duoc nghich dao cua a) c thc hin.
- Lnh getch() lun lun c thc hin.
- Chy tng bc dng Debug, view cc bin a, b v biu thc a>b
V d 2: Yu cu ngi chy chng trnh nhp vo gi tr ca 2 s a v b, nu a ln hn
b th in ra thng bo Gia tr ca a ln hn gi tr ca b, gi tr ca 2 s, ngc li th in
ra mn hnh cu thng bo Gi tr ca a nh hn hoc bng gi tr ca b, gi tr ca 2
s.
#include <stdio.h>

42
#include<conio.h>
int main ()
{
int a, b;
printf("Nhap vao gia tri cua 2 so a va b !");
scanf("%d%d",&a,&b);
if (a>b)
{
printf("\n a lon hon b);
printf("\n a=%d b=%d ",a,b);
}
else
{
printf("\n a nho hon hoac bang b");
printf("\n a=%d b=%d",a,b);
}
printf("\n Thuc hien xong lenh if");
getch();
return 0;
}
V d 3: Yu cu ngi thc hin chng trnh nhp vo mt s nguyn dng l thng
trong nm v in ra s ngy ca thng .
- Thng c 31 ngy: 1, 3, 5, 7, 8, 10, 12;
- Thng c 30 ngy: 4, 6, 9, 10 ;
- Thng c 28 hoc 29 ngy : 2
#include <stdio.h>
#include<conio.h>
int main ()
{
int thg;
printf("Nhap vao thang trong nam !");
scanf("%d",&thg);
if(thg==1||thg==3||thg==5||thg==7||thg==8||thg==10||thg==12)
{
printf("\n Thang %d co 31 ngay ",thg);
}
else
{
if (thg==4||thg==6||thg==9||thg==11)
printf("\n Thang %d co 30 ngay",thg);
else if (thg==2)
printf("\n Thang %d co 28 hoac 29 ngay",thg);
else printf("Khong co thang %d",thg);
printf("\n Thuc hien xong lenh if");
}
getch();
return 0;
}

43
Lu :
- Ta c th s dng cc cu lnh ifelse lng nhau. Trong trng hp ifelse lng
nhau th else s kt hp vi if gn nht cha c else;
- Trong trng hp cu lnh if bn trong khng c else th phi vit n trong cp
du {} (coi nh l khi lnh) trnh s kt hp else if sai; V d:
if ( so1>0)
if (so2 > so3)
a=so2;
else /*else ca if (so2>so3) */
a=so3;
Hoc:
if (so1>0)
{
if (so2>so3) /*lnh if ny khng c else*/
a=so2;
}
else /*else ca if (so1>0)*/
a=so3;
- Nu sau biu thc logic ca if ta c du chn phy, v d:
if (a==0);
{
printf("Nghich dao cua %f la %f",a,1/a);
}
Th v c php trnh bin dch s khng bo sai, nhng xt v ngha l sai.

III. Lnh SWITCH


Cu trc la chn cho php la chn mt trong nhiu trng hp. Trong C, l cu
lnh switch.

C php:

switch (<Biu thc>)


{
case gi_tr_1:
{
Cng vic 1;
break;
}

case gi_tr_n:
{
Cng vic N;
break;
}
[default :
{
Cng vic N+1;

44
break;
} ]

}
Lu :

Tnh gi tr <Biu thc>

Sai
=Gi tr 1

Sai
ng =Gi tr 2

ng
=Gi tr N

Sai
ng

Cng vic 1 Cng vic 2 Cng vic n Cng vic n+1

Gii thch:
- Tnh gi tr ca Biu thc;
- Nu gi tr ca biu thc bng Gi tr 1 th thc hin Cng vic 1 ri thot;
- Nu gi tr ca biu thc khc Gi tr 1 th so snh vi Gi tr 2, nu bng th
thc hin Cng vic 2 ri thot;
- Tip tc so snh vi Gi tr N nu n-1 gi tr trc khng bng gi tr ca Biu
thc.
- Nu tt c cc php so snh trn u sai th c th chn thc hin (hay khng)
Cng vic N+1 (Cng vic mc nh).
Lu :
- Biu thc trong switch() phi c kt qu l gi tr kiu s nguyn (int, char,
long,);
- Cc gi tr sau case cng phi l kiu s nguyn;
- Khng bt buc phi c default;

V d 1: Nhp vo mt s nguyn, chia s nguyn ny cho 2 ly phn d. Kim tra nu


phn d bng 0 th in ra thng bo s chn, nu s d bng 1 th in thng bo s l.
#include <stdio.h>
#include<conio.h>

45
int main ()
{
int songuyen, phandu;
printf("\n Nhap vao so nguyen ");
scanf("%d",&songuyen);
phandu=(songuyen % 2);
switch(phandu)
{
case 0: printf("%d la so chan ",songuyen);
break;
case 1: printf("%d la so le ",songuyen);
break;
}
getch();
return 0;
}

V d 2: Nhp vo 2 s nguyn v 1 php ton. Nu php ton l +, -, * th in ra kt


qua l tng, hiu, tch ca 2 s; Nu php ton l / th kim tra xem s th 2 c khc
khng hay khng? Nu khc khng th in ra thng ca chng, ngc li th in ra thng
bo khong chia cho 0.
#include <stdio.h>
#include<conio.h>
int main ()
{
int so1, so2;
float thuong;
char pheptoan;
printf("\n Nhap vao 2 so nguyen ");
scanf("%d%d",&so1,&so2);
fflush(stdin); //Xoa ky tu enter trong vung dem truoc khi nhap phep toan
printf("\n Nhap vao phep toan ");
scanf("%c",&pheptoan);
switch(pheptoan)
{
case '+':
printf("\n %d + %d =%d",so1, so2, so1+so2);
break;
case '-':
printf("\n %d - %d =%d",so1, so2, so1-so2);
break;
case '*':
printf("\n %d * %d =%d",so1, so2, so1*so2);
break;

46
case '/':
if (so2!=0){
thuong=float(so1)/float(so2);
printf("\n %d / %d =%f", so1, so2, thuong);
}
else printf("Khong chia duoc cho 0");
break;
default :
printf("\n Chua ho tro phep toan %c", pheptoan);
break;
}
getch();
return 0;
}
Trong v d trn, ti sao phi xa k t trong vng m trc khi nhp php ton?
V d 3: Yu cu ngi thc hin chng trnh nhp vo mt s nguyn dng l thng
trong nm v in ra s ngy ca thng .
- Thng c 31 ngy: 1, 3, 5, 7, 8, 10, 12 ;
- Thng c 30 ngy: 4, 6, 9, 10;
- Thng c 28 hoc 29 ngy : 2
- Nu nhp vo s <1 hoc >12 th in ra cu thng bo khng c thng ny .
#include <stdio.h>
#include<conio.h>
int main ()
{
int thang;
printf("\n Nhap vao thangs trong nam ");
scanf("%d",&thang);
switch(thang)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
printf("\n Thang %d co 31 ngay ",thang);
break;
case 4:

47
case 6:
case 9:
case 11:
printf("\n Thang %d co 30 ngay ",thang);
break;
case 2:
printf ("\ Thang 2 co 28 hoac 29 ngay");
break;
default :
printf("\n Khong co thang %d", thang);
break;
}
getch();
return 0;
}

IV. Tm tt
I. Khi lnh
II. Lnh IF
III. Lnh SWITCH

V. Bi tp
Xem Bi 5 - Bi thc hnh iu khin chn

48
Bi 5 - Bi thc hnh: IU KHIN CHN
I. Bi tp lm theo yu cu
1. Gii phng trnh bc 2

Yu cu: Vit chng trnh cho php bin lun v nghim ca phng trnh bc 2
a*x2+b*x+c = 0.

Son tho vn bn chng trnh nh sau:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
int main()
{ int a,b,c;
float d;
float x1,x2;
system("cls");
printf("Nhap vao cac he so a,b va c:");
scanf("%d %d %d",&a,&b,&c);
d=b*b-4*a*c;
if (d<0)
{
printf("Phuong trinh vo nghiem\n");
}
else
{
if (d==0)
{
x1=(-b)/(2*a);
printf("Phuong trinh co nghiem kep x1=x2=%10.2f\n",x1);
}
else
{
x1=(-b+sqrt(d))/(2*a);
x2=(-b-sqrt(d))/(2*a);
printf("Phuong trinh co 2 nghiem phan biet x1=%10.2f , x2=%10.2f \n",x1,x2);
}
}
printf("Nhan phim bat ky de ket thuc!");

49
getch();
return 0;
}

Th nghim 1:

1. Nhn F9, khi giao din nhp liu xut hin nh hnh sau:

2. Nhp cc gi tr cho a,b, c tng ng l 2 4 2 Enter , khi kt qu nhn


c nh hnh sau:

3. Nhn xt v kt qu t c.

Th nghim 2: Nhp cc gi tr cho a,b, c tng ng l -3 1 2 nhn xt v kt qu nhn


c.
Th nghim 3: Nhp cc gi tr cho a,b, c bt k, nhn xt v kt qu nhn c.

2. To mt menu n gin
Son tho vn bn chng trnh nh sau
#include<stdio.h>
#include<conio.h>
int main()
{
char c;
while (1= =1)

50
{
c= getch();
if (c = = 'Q') break;
else printf("%c\n",c);
}
return 0;
}
Th nghim 1:
- Trc khi chy chng trnh hy nhn xt xem chng trnh thc hin lm vic g? Nu
khi chng trnh ng chy ngi s dng nhn phm Q (ch Q hoa) th chng trnh s
lm g?
- Chy th chng trnh.
Th nghim 2:
- Sa li chng trnh trn thnh nh sau:
#include<stdio.h>
#include<conio.h>
#include<iostream>
int main()
{
char c;
while (1==1)
{
system("cls");
printf("Nhan V de tinh dien tich hinh VUONG\n");
printf("Nhan C de tinh dien tich hinh CHUNHAT\n");
printf("Nhan T de tinh dien tich hinh TRON\n");
printf("-------------------------------------\n");
printf("Nhan Q de tinh ket thuc chuong trinh (QUIT)");
c= getch();
if (c=='Q') break;
else
{
switch (c)
{
case 'V': {
// Viet doan tinh dien tich hinh VUONG o day
}
break;
case 'C': {
// Viet doan tinh dien tich hinh CHUNHAT o day
}
break;
case 'T': {
// Viet doan tinh dien tich hinh TRON o day
}
break;
}
}
}
return 0;
}
- Chy v nhn xt v chng trnh

51
Th nghim 3:
- Gi s sau dong ghi ch // Viet doan tinh dien tich hinh VUONG o day thm vo on
chng trnh sau:
float a, s;
system("cls");
printf("Tinh dien tich hinh VUONG\n");
printf("-------------------------\n");
printf("Nhap vao do dai canh: ");
scanf("%f",&a);
s= a*a;
printf("Dein tich hinh VUONG canh = %3.1f la: %3.1f \n",a,s);
printf("Nhap phim bat ky de tro lai menu chinh");
getch();
- Chy v nhn xt v kt qu thc hin chng trnh
- Trong on chng trnh trn ti sao phi thm vo lnh system("cls"); ?
- Trong on chng trnh trn nu khng c lnh getch(); th vn g s xy ra, gii
thch.

II. Bi tp t lm
1. Vit chng trnh nhp 3 s t bn phm, tm s ln nht trong 3 s , in kt qu ln mn
hnh.
2. Vit chng trnh tnh chu vi, din tch ca tam gic vi yu cu sau khi nhp 3 s a, b, c
phi kim tra li xem a, b, c c to thnh mt tam gic khng? Nu c th tnh chu vi v din
tch. Nu khng th in ra cu " Khng to thnh tam gic".
3. Vit chng trnh gii phng trnh bc nht ax+b=0 vi a, b nhp t bn phm.
4. Vit chng trnh gii phng trnh bc hai ax2+bx + c = 0 vi a, b, c nhp t bn phm.
5. Vit chng trnh nhp t bn phm 2 s a, b v mt k t ch. Nu: ch l + th thc hin
php tnh a + b v in kt qu ln mn hnh. ch l th thc hin php tnh a - b v in kt
qu ln mn hnh. ch l * th thc hin php tnh a * b v in kt qu ln mn hnh. ch l /
th thc hin php tnh a / b v in kt qu ln mn hnh.
6. Vit chng trnh nhp vo 2 s l thng v nm ca mt nm. Xt xem thng c bao
nhiu ngy? Bit rng: Nu thng l 4, 6, 9, 11 th s ngy l 30. Nu thng l 1, 3, 5, 7, 8,
10, 12 th s ngy l 31. Nu thng l 2 v nm nhun th s ngy 29, ngc li th s ngy l
28.
7. C hai phng thc gi tin tit kim: gi khng k hn li sut 2.4%/thng, mi thng tnh
li mt ln, gi c k hn 3 thng li sut 4%/thng, 3 thng tnh li mt ln.Vit chng
trnh tnh tng cng s tin c vn ln li sau mt thi gian gi nhp t bn phm.

52
`Bi 6 - IU KHIN LP
I. Lnh FOR
Lnh for cho php lp li cng vic cho n khi iu kin sai.
C php:
for (Biu thc 1; biu thc 2; biu thc 3)
{
<Cng vic>
}

Lu :

Tnh gi tr BT 1

F
Biu thc 2

Thc hin CV

Tnh gi tr BT 3

Gii thch: <Cng vic>: c th hin l 1 cu lnh hay 1 khi lnh. Th t thc hin
ca cu lnh for nh sau:
B1: Tnh gi tr ca biu thc 1.
B2: Tnh gi tr ca biu thc 2.
- Nu gi tr ca biu thc 2 l sai (=0): thot khi cu lnh for.
- Nu gi tr ca biu thc 2 l ng (!=0): <Cng vic> c thc hin.
B3: Tnh gi tr ca biu thc 3 v quay li B2.
Lu :
- Khi biu thc 2 vng mt th n c coi l lun lun ng;
- Biu thc 1: thng thng l mt php gn khi to gi tr ban u cho bin
iu kin;
- Biu thc 2: l mt biu thc kim tra iu kin ng sai dng vng lp;
- Biu thc 3: thng thng l mt php gn thay i gi tr ca bin iu kin,
bin iu kin ny thng (phi c) trong Biu thc 2;

53
- Trong mi biu thc c th c nhiu biu thc con. Cc biu thc con c phn
bit bi du phy.
V d 1: Vit on chng trnh in dy s nguyn t 1 n 10.
#include <stdio.h>
#include<conio.h>
int main ()
{
int i;
printf("\n Day so tu 1 den 10 :");
for (i=1; i<=10; i++)
{
printf("%d ",i);
}
getch();
return 0;
}
V d 2: Vit chng trnh nhp vo mt s nguyn n. Tnh tng ca cc s nguyn t 1
n n.
#include <stdio.h>
#include<conio.h>
int main ()
{
unsigned int n,i,tong;
printf("\n Nhap vao so nguyen duong n:");
scanf("%d",&n);
tong=0;
for (i=1; i<=n; i++)
tong+=i;
printf("\n Tong tu 1 den %d =%d ",n,tong);
getch();
return 0;
}
V d 3: Vit chng trnh in ra trn mn hnh mt ma trn c n dng m ct nh sau:
1234567
2345678
3456789

#include <stdio.h>
#include <conio.h>
int main ()
{

54
unsigned int dong, cot, n, m;
printf("\n Nhap vao so dong va so cot :");
scanf("%d%d",&n,&m);
for (dong=0;dong<n;dong++)
{
printf("\n");
for (cot=1;cot<=m;cot++)
printf("%d\t",dong+cot);
}
getch();
return 0;
}

II. Lnh WHILE


Vng lp while ging nh vng lp for, dng lp li mt cng vic no cho n khi
iu kin sai.

C php:

while (Biu thc iu kin)


{
<Cng vic>
}

Lu :

F
iu kin

Thc hin CV

Gii thch:
- <Cng vic>: c th hin bng 1 cu lnh hay 1 khi lnh;
- Kim tra Biu thc iu kin;
- Nu iu kin sai (=0) th thot khi lnh while;
- Nu iu kin ng (!=0) th thc hin cng vic ri quay li kim tra iu kin
tip.

Lu :

- Lnh while gm c biu thc iu kin v thn vng lp (khi lnh thc hin cng
vic) ;

55
- Vng lp dng li khi no iu kin sai;
- Khi lnh thc hin cng vic c th rng, c th lm thay i iu kin.
V d 1: Vit on chng trnh in dy s nguyn t 1 n 10.
#include <stdio.h>
#include<conio.h>
int main ()
{
int i;
printf("\n Day so tu 1 den 10 :");
i=1;
while (i<=10)
{
printf("%d ",i);
i=i+1;
}
getch();
return 0;
}

V d 2: Vit chng trnh nhp vo mt s nguyn n. Tnh tng ca cc s nguyn t 1


n n.
#include <stdio.h>
#include<conio.h>
int main ()
{
unsigned int n,i,tong;
printf("\n Nhap vao so nguyen duong n:");
scanf("%d",&n);
tong=0;
i=1;
while (i<=n)
{
tong+=i;
i++;
}
printf("\n Tong tu 1 den %d =%d ",n,tong);
getch();
return 0;
}

V d 3: Vit chng trnh in ra trn mn hnh mt ma trn c n dng m ct nh sau:

56
1234567
2345678
3456789

#include <stdio.h>
#include<conio.h>
int main ()
{
unsigned int dong, cot, n, m;
printf("\n Nhap vao so dong va so cot :");
scanf("%d%d",&n,&m);
dong=0;
while (dong<n)
{
printf("\n");
cot=1;
while (cot<=m)
{
printf("%d\t",dong+cot);
cot++;
}
dong++;
}
getch();
return 0;
}

III. Lnh DO .. WHILE


Vng lp do while ging nh vng lp for, while, dng lp li mt cng vic no
khi iu kin cn ng.

C php:

do
{
<Cng vic>
}
while (<Biu thc iu kin>)

Lu :

57
Thc hin CV

T
iu kin

Gii thch:
- <Cng vic>: c th hin bng 1 cu lnh hay 1 khi lnh;
- Trc tin cng vic c thc hin trc, sau mi kim tra Biu thc iu
kin;
- Nu iu kin sai th thot khi lnh do while;
- Nu iu kin cn ng th thc hin cng vic ri quay li kim tra iu kin
tip;
Lu :
- Lnh dowhile thc hin cng vic t nht 1 ln;
- Vng lp dng li khi iu kin sai;
- Khi lnh thc hin cng vic c th rng, c th lm thay i iu kin.

V d 1: Vit on chng trnh in dy s nguyn t 1 n 10.


#include <stdio.h>
#include<conio.h>
int main ()
{
int i;
printf("\n Day so tu 1 den 10 :");
i=1;
do
printf("%d ",i++);
while (i<=10);
getch();
return 0;
}

V d 2: Vit chng trnh nhp vo mt s nguyn n. Tnh tng ca cc s nguyn t 1


n n.
#include <stdio.h>
#include<conio.h>
int main ()

58
{
unsigned int n,i,tong;
printf("\n Nhap vao so nguyen duong n:");
scanf("%d",&n);
tong=0;
i=1;
do
{
tong+=i;
i++;
} while (i<=n);
printf("\n Tong tu 1 den %d =%d ",n,tong);
getch();
return 0;
}

V d 3: Vit chng trnh in ra trn mn hnh mt ma trn c n dng m ct nh sau (n,


m>=1):
1234567
2345678
3456789

#include <stdio.h>
#include<conio.h>
int main ()
{
unsigned int dong, cot, n, m;
printf("\n Nhap vao so dong va so cot :");
scanf("%d%d",&n,&m);
dong=0;
do
{
printf("\n");
cot=1;
do
{
printf("%d\t",dong+cot);
cot++;
} while (cot<=m);
dong++;
} while (dong<n);
getch();
return 0;
}

59
So snh cc vng lp
Vng lp for, while:
- Kim tra iu kin trc thc hin cng vic sau nn on lnh thc hin cng
vic c th khng c thc hin;
- Vng lp kt thc khi no iu kin sai.
Vng lp dowhile:
- Thc hin cng vic trc kim tra iu kin sau nn on lnh thc hin cng
vic c thc hin t nht 1 ln.;
- Vng lp kt thc khi no iu kin sai.

IV. Lnh break v continue


Lnh break
C php:
break;
ngha: Dng thot khi vng lp. Khi gp cu lnh ny trong vng lp, chng trnh
s thot ra khi vng lp v ch n cu lnh lin sau n. Nu nhiu vng lp --> break s
thot ra khi vng lp gn nht. Ngoi ra, break cn c dng trong cu trc la chn
switch.

Lnh continue
C php:
continue;
ngha : Khi gp lnh ny trong cc vng lp, chng trnh s b qua phn cn li trong
vng lp v tip tc thc hin ln lp tip theo. i vi lnh for, biu thc 3 s c tnh
tr v quay li bc 2. i vi lnh while, do while; biu thc iu kin s c tnh v
xt xem c th tip tc thc hin <Cng vic> na hay khng? (da vo kt qu ca biu
thc iu kin).

III. Tm tt ni dung bi hc
I.Lnh FOR
II. Lnh WHILE
III. Lnh DO .. WHILE
IV. Lnh BREAK v CONTINUE
V. Bi tp

IV. Bi tp
Xem Bi 7 - Bi tp thc hnh Cc cu trc iu khin

60
Bi 7 - Bi thc hnh: IU KHIN LP
I. Bi tp lm theo yu cu
1. Tm USCNLN ca hai s

Yu cu: Vit chng trnh cho php nhp vo 2 s nguyn v in ra c s chung ln


nht ca 2 s .
Son tho vn bn chng trnh nh sau:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
int main()
{ int a,b,t,u,v;
system("cls");
printf("Nhap vao cac he so a va b:");
scanf("%d %d",&a,&b);
u=a;
v=b;
while (a>0)
{
if (a<b)
{
t=a; a=b; b=t;
}
a=a-b;
}
printf("USCLN cua %d va %d = %d\n", u, v, b);
printf("Nhan phim bat ky de ket thuc!");
getch();
return 0;
}
Th nghim 1:
1. Nhn F9 chy chng trnh, khi giao din CT xut hin nh sau:

61
2. Nhp cc gi tr cho a v b tng ng l 12 18 Enter, khi kt qu nhn c
nh sau:

3. Nhn xt v kt qu t c

Th nghim 2: Vit li chng trnh trn theo thut ton Euler m t nh sau:
Input: a, b
Output: d
M t:
1) x = a; y = b;
2) While y>0
a) r = x mod y;
b) x = y;
c) y = r;
End While
3) d = x;

2. Tnh li sut tin gi


Vn : Gi s tin gi tit kim c tnh vi li sut l m% mi thng, sau n thng th tin li
c cng vo gc. Vit chng trnh cho php tnh v in ra mn hnh s tin c c sau K
thng gi tit kim vi s tin gc ban u l T.
Son tho vn bn chng trnh sau:
#include<stdio.h>
#include<conio.h>
int main()
{
float m,T,lai, Tco;
int n, K;
printf("Lai suat (Phan tram) : "); scanf("%f",&m);
m=m/100;
printf("So thang de lai vao goc: "); scanf("%d",&n);
printf("So tien gui : "); scanf("%f",&T);
printf("So thang gui : "); scanf("%d",&K);
lai= 0;
for (int i=1; i<=K; i++)
{
lai = lai+ m*T;
if (i%n==0) ;
{

62
T=T+lai;
}
}
Tco = T + lai;
printf("So tien: %0.5f",Tco);
getch();
return 0;
}
Th nghim 1:
- Chy chng trnh v cho bit kt qu khi nhp vo m=5, n=3, T=100, K=2. Nhn xt v
kt qu nhn c
- Chy chng trnh v cho bit kt qu khi nhp vo m=5, n=3, T=100, K=3. Nhn xt v
kt qu nhn c.
Th nghim 2:
- Trong khi lnh
if (i%n==0)
{
T=T+lai;
}
Thm vo lnh lai =0; thnh nh sau:
if (i%n==0)
{
T=T+lai;
lai = 0 ;
}
- Chy chng trnh v cho bit kt qu khi nhp vo m=5, n=3, T=100, K=3. Nhn xt v
kt qu nhn c. Gii thch.
- Chy chng trnh v cho bit kt qu khi nhp vo m=5, n=3, T=100, K=20. Nhn xt
v kt qu nhn c. Gii thch.
Th nghim 3:
- Gi s s thng gi l khng nguyn, ngha l s thng gi c th l 3.5 thng, 4.3 thng
. Nu thay i kiu bin K l float thay v int bng cch thay dng lnh
int n, K;
thnh hai dng lnh sau:
int n ;
float K;
- Chy chng trnh v cho bit kt qu khi nhp vo m=5, n=3, T=100, K=3. Nhn xt v
kt qu nhn c.
- Debug tng bc v gii thch v sao chng trnh sau khi sa nh trn cho kt qu
khng ng.

II. Bi tp t lm
1. Mt s nguyn dng chia ht cho 3 nu tng cc ch s ca n chia ht cho 3. Vit chng
trnh nhp vo mt s c 3 ch s, kim tra s c chia ht cho 3 dng tnh cht trn.( if )
2. Tr chi "On t t": tr chi c 2 ngi chi mi ngi s dng tay biu th mt trong 3
cng c sau: Ko, Bao v Ba. Nguyn tc: Ko thng bao. Bao thng ba. Ba thng ko.
Vit chng trnh m phng tr chi ny cho hai ngi chi v ngi chi vi my. (switch)
3. Vit chng trnh tnh tin in gm cc khon sau: Tin thu bao in k : 1000 ng /
thng. nh mc s dng in cho mi h l 50 Kw Phn nh mc tnh gi 450 ng /Kwh
Nu phn vt nh mc <= 50 Kw tnh gi pht cho phn ny l 700 ng/Kwh . Nu phn
vt nh mc ln 50 Kw v nh hn 100Kw tnh gi pht cho phn ny l 910 ng/Kwh

63
Nu phn vt nh mc ln hn hay bng 100 Kw tnh gi pht cho phn ny l 1200
ng/Kwh . Vi : ch s in k c v ch s in k mi nhp vo t bn phm. In ra mn
hnh s tin tr trong nh mc, vt nh mc v tng ca chng. (if)
4. Vit chng trnh nhn vo gi, pht, giy dng (hh:mm:ss ), t bn phm. Cng thm mt s
giy vo v in ra kt qu di dng ( hh:mm:ss ).
5. Vit chng trnh nhp vo ngy thng nm ca mt ngy, kim tra n c hp l khng.
6. Kim tra mt k t nhp vo thuc tp hp no trong cc tp k t sau: Cc k t ch hoa:
'A' ...'Z' Cc k t ch thng: 'a' ... 'z' Cc k t ch s : '0' ... '9' Cc k t khc. 14. H
thp lc phn dng 16 k s bao gm cc k t 0 .. 9 v A, B, C, D, E ,F. Cc k s A, B, C,
D, E, F c gi tr tng ng trong h thp phn nh sau: A 10 B 11 C 12 D 13 E 14 F 15.
Hy vit chng trnh cho nhp vo k t biu din mt k s ca h thp lc phn v cho
bit gi tr thp phn tng ng. Trng hp k t nhp vo khng thuc cc k s trn, a
ra thng bo li : "H thp lc phn khng dng k s ny"
7. Vit chng trnh nhp vo ngy thng nm ca ngy hm nay, in ra ngy thng nm ca
ngy mai.
8. Vit chng trnh tnh cc tng sau: a) S=1 + 2 + ... + n b) S=1/2 + 2/3 + ... +n/(n+1) c) S= -
1 +2 - 3 +4 - ... + (-1)nn
9. Vit chng trnh nhp vo mt dy n s, tm s ln nht ca dy v xc nh v tr ca s
ln nht trong dy.
10. Vit chng trnh m s ch s ca mt s nguyn n.
11. Tm s nguyn dng k nh nht sao cho 2k > n vi n l mt s nguyn dng nhp t bn
phm.
12. Vit chng trnh in ra s o ngc ca mt s nguyn n, vi n nhp t bn phm.
13. Tnh gi tr trung bnh ca mt dy s thc, kt thc dy vi -1.
14. Vit chng trnh m phng php chia nguyn DIV 2 s nguyn a v b nh sau: chia
nguyn a v b ta tnh tr a-b, sau ly hiu tm c li tr cho b... tip tc cho n khi hiu
ca n nh hn b. S ln thc hin c cc php tr trn s bng tr ca php chia
nguyn.
15. Tm s nguyn dng N nh nht sao cho 1+1/2+ ...+1/N > S, vi S nhp t bn phm.
16. Vit chng trnh tnh P=2*4*6*...*(2n), n nhp t bn phm.
17. Vit chng trnh tm UCLN v BCNN ca hai s a v b theo thut ton sau (K hiu UCLN
ca a, b l (a,b) cn BCNN l [a,b]) - Nu a chia ht cho b th (a,b) = b - Nu a = b*q + r th
(a,b) = (b,r) - [a,b] = a*b/(b,r) .
18. Vit chng trnh nhp vo mt s nguyn dng n, in ra mn hnh cc s nguyn t p <= n.
S nguyn p gi l s nguyn t nu p ch chia ht cho mt v chia ht cho bn thn n.
19. Vit chng trnh tnh gn ng cn bc hai ca mt s dng a theo phng php Newton :
Trc ht cho x0=(1 + a)/2 sau l cng thc truy hi: xn+1=( xn + a/xn)/2 xn+1 - xn xn <
e th cn bc hai ca a bng xn+1Nu: Trong e l mt hng s cho trc lm chnh xc.
20. Vit chng trnh tnh gn ng cn bc n ca mt s dng a theo phng php Newton :
Trc ht cho x0= a/n sau l cng thc truy hi: (n-1) xkn +a nxkn-1xk+1 = Nu |a - xnn|
< e th xn l cn bc n ca a. Trong e l mt hng s cho trc lm chnh xc. Nu a <
0 v n chn th khng tn ti cn.

64
Bi 8 - MNG V CON TR
Ni dung bi hc
I. Mng
1. Mng trong C
2. Mng mt chiu
3. Mng nhiu chiu
II. Con tr
1. Khai bo v s dng bin con tr
2. Con tr v mng
3. Con tr v tham s hnh thc ca hm
III. Tm tt ni dung bi hc

I. Mng
1. Mng trong C
Mng l mt tp hp cc phn t c nh c cng mt kiu, gi l kiu phn t. Kiu
phn t c th l: k t, s, chui k t;
Ta c th chia mng lm 2 loi: mng 1 chiu v mng nhiu chiu.

2. Mng mt chiu
Mng 1 chiu l mt dy cc phn t c cng tn gi, c 1 ch s ch th t ca phn
t trong dy. Mng mt chiu cn c th hiu nh mt Vector.
Khai bo mng vi s phn t xc nh (khai bo tng minh)
C php:
<Kiu> <Tn mng >[n]
Trong :
- Tn mng: y l mt ci tn t ng theo quy tc t tn ca danh biu;
- n: l mt hng s nguyn, cho bit s lng phn t ti a trong mng l bao
nhiu (hay ni khc i kch thc ca mng l g);
- Kiu: mi phn t ca mng c d liu thuc kiu g;
- y, ta khai bo mt bin mng gm c n phn t, phn t th nht l tn mng
[0], phn t cui cng l tn mng[n -1];
V d:
int a[10];
/* Khai bo bin mng tn a, phn t th nht l a[0], phn t cui cng l a[9].*/
Ta c th coi mng a l mt dy lin tip cc phn t trong b nh nh sau:

65
V tr 0 1 2 3 4 5 6 7 8 9
Tn phn t a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

Hnh 1: Hnh nh mng a trong b nh


Khai bo mng vi s phn t khng xc nh (khai bo khng tng minh)
C php:
<Kiu> <Tn mng> <[]>
Khi khai bo, khng cho bit r s phn t ca mng, kiu khai bo ny thng c p
dng trong cc trng hp: va khai bo va gn gi tr, khai bo mng l tham s hnh
thc ca hm.
Va khai bo va gn gi tr
C php:
<Kiu> <Tn mng> []= {Cc gi tr cch nhau bi du phy}
Nu va khai bo va gn gi tr th mc nhin C s hiu s phn t ca mng l s gi
tr m chng ta gn cho mng trong cp du {}. Chng ta c th s dng hm sizeof()
ly s phn t ca mng nh sau:
S phn t=sizeof(tn mng)/ sizeof(kiu)
Truy xut tng phn t ca mng
Mi phn t ca mng c truy xut thng qua Tn bin mng theo sau l ch s nm
trong cp du ngoc vung [ ]. Chng hn a[0] l phn t u tin ca mng a c khai
bo trn. Ch s ca phn t mng l mt biu thc m gi tr l kiu s nguyn.
V d 1:
int a[10];
Trong khai bo ny, vic truy xut cc phn t c ch ra trong hnh 1. Chng hn phn
t th 2 (c v tr 1) l a[1]
V d 2: Va khai bo va gn tr cho 1 mng 1 chiu cc s nguyn. In mng s nguyn
ny ln mn hnh.
#include <stdio.h>
#include <conio.h>
int main()
{
int n,i,j,tam;
int dayso[]={66,65,69,68,67,70};
n=sizeof(dayso)/sizeof(int); /*Lay so phan tu*/

66
printf("\n Noi dung cua mang ");
for (i=0;i<n;i++)
printf("%d ",dayso[i]);
getch();
return 0;
}
V d 3: i mt s nguyn dng thp phn thnh s nh phn. Vic chuyn i ny
c thc hin bng cch ly s chia lin tip cho 2 cho ti khi bng 0 v ly cc s
d theo chiu ngc li to thnh s nh phn. Ta s dng mng mt chiu lu li
cc s d .
#include<conio.h>
#include<stdio.h>
int main()
{
unsigned int N;
unsigned int Du;
unsigned int NhiPhan[20],K=0;
int i;
printf("Nhap vao so nguyen N= ");scanf("%d",&N);
do
{
Du=N % 2;
NhiPhan[K]=Du;
K++;
N = N/2;
} while(N>0);
printf("Dang nhi phan la: ");
for(i=K-1;i>=0;i--)
printf("%d",NhiPhan[i]);
getch();
return 0;
}
V d 4: Nhp vo mt dy n s v sp xp cc s theo th t tng. C rt nhiu gii thut
sp xp. Mt trong s c m t nh sau: u tin a phn t th nht so snh vi
cc phn t cn li, nu n ln hn mt phn t ang so snh th i ch hai phn t cho
nhau ri tip tc so snh. Sau tip tc so snh phn t th hai vi cc phn t t th ba
tr i ... c tip tc nh vy cho n phn t th n-1.
#include<conio.h>
#include<stdio.h>
int main()

67
{
int b[20], N, i,j,t;
/* 1. Nhap so phan tu cua mang*/
printf("So phan tu thuc te cua mang N= ");
scanf("%d",&N);

/* 2. Nhap gia tri cac pha tu cua mang*/


for(i=0; i< N; i++)
{
printf("Phan tu thu %d: ",i);scanf("%d",&b[i]);
}

/* 3. Sap xep giam dan*/


for(i=0;i<N-1;i++)
{
for(int j=i+1;j<N;j++)
{
if (b[i]>b[j])
{
t=b[i];
b[i]=b[j];
b[j]=t;
}
}
}
/* 4. In ket qua sau khi sap xep*/
printf("Mang SAU khi sap xep: ");
for (i=0; i<N;i++)
printf("%d ",b[i]);

getch();
return 0;
}
Phin bn khc ca chng trnh s dng hm (s hc bi sau) : vit cc hm Nhap
(Nhp cc s), SapXep (Sp xp) v InMang (In cc s); cc tham s hnh thc ca cc
hm ny l 1 mng khng ch nh r s phn t ti a, nhng ta cn c thm s phn t
thc t c s dng ca mng l bao nhiu, y l mt gi tr nguyn.
#include<conio.h>
#include<stdio.h>
void Nhap(int a[],int N)

68
{
int i;
for(i=0; i< N; i++)
{
printf("Phan tu thu %d: ",i);scanf("%d",&a[i]);
}
}
void InMang(int a[], int N)
{
int i;
for (i=0; i<N;i++)
printf("%d ",a[i]);
printf("\n");
}
void SapXep(int a[], int N)
{
int t,i;
for(i=0;i<N-1;i++)
for(int j=i+1;j<N;j++)
if (a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
int main()
{
int b[20], N;
printf("So phan tu thuc te cua mang N= ");
scanf("%d",&N);
Nhap(b,N);
printf("Mang vua nhap: ");
InMang(b,N);
SapXep(b,N); /* G?i hm s?p x?p*/
printf("Mang sau khi sap xep: ");
InMang(b,N);
getch();
return 0;
}

69
3. Mng nhiu chiu
Mng nhiu chiu l mng c t 2 chiu tr ln. Ngi ta thng s dng mng nhiu
chiu lu cc ma trn, cc ta 2 chiu, 3 chiu
Khai bo mng 2 chiu tng minh
C php:
<Kiu> <Tn mng><[S phn t chiu 1]><[S phn t chiu 2]>
V d: Ngi ta cn lu tr thng tin ca mt ma trn gm cc s thc. Lc ny ta c th
khai bo mt mng 2 chiu nh sau:
float m[8][9]; /* Khai bo mng 2 chiu c 8*9 phn t l s thc*/
Trong trng hp ny, ta khai bo cho mt ma trn c ti a l 8 dng, mi dng c
ti a l 9 ct. Hnh nh ca ma trn ny c cho trong hnh 2:
Dng\Ct 0 1 2 3 4 5 6 7 8
0 m[0][0] m[0][1] m[0][2] m[0][3] m[0][4] M[0][5] m[0][6] m[0][7] m[0][8]
1 m[1][0] m[1][1] m[1][2] m[1][3] m[1][4] M[1][5] m[1][6] m[1][7] m[1][8]
2 m[2][0] m[2][1] m[2][2] m[2][3] m[2][4] M[2][5] m[2][6] m[2][7] m[2][8]
3 m[3][0] m[3][1] m[3][2] m[3][3] m[3][4] m[3][5] m[3][6] m[3][7] m[3][8]
4 m[4][0] m[4][1] m[4][2] m[4][3] m[4][4] m[4][5] m[4][6] m[4][7] m[4][8]
5 m[5][0] m[5][1] m[5][2] m[5][3] m[5][4] m[5][5] m[5][6] m[5][7] m[5][8]
6 m[6][0] m[6][1] m[6][2] m[6][3] m[6][4] m[6][5] m[6][6] m[6][7] m[6][8]
7 m[7][0] m[7][1] m[7][2] m[7][3] m[7][4] m[7][5] m[7][6] m[7][7] m[7][8]

Hnh 2: Ma trn c m t l 1 mng 2 chiu


Khai bo mng 2 chiu khng tng minh
khai bo mng 2 chiu khng tng minh, ta vn phi ch ra s phn t ca chiu th
hai (chiu cui cng).
C php:
<Kiu> <Tn mng> <[]><[S phn t chiu 2]>
Cch khai bo ny cng c p dng trong trng hp va khai bo, va gn tr hay t
mng 2 chiu l tham s hnh thc ca hm.
Truy xut tng phn t ca mng 2 chiu
Ta c th truy xut mt phn t ca mng hai chiu bng cch vit ra tn mng theo sau
l hai ch s t trong hai cp du ngoc vung. Chng hn ta vit m[2][3].
Vi cch truy xut theo cch ny, Tn mng[Ch s 1][Ch s 2] c th coi l 1 bin c
kiu c ch ra trong khai bo bin mng.

70
V d 1: Vit chng trnh cho php nhp 2 ma trn a, b c m dng n ct, thc hin php
ton cng hai ma trn a,b v in ma trn kt qu ln mn hnh. Trong v d ny, ta s s
dng hm lm ngn gn hn chng trnh ca ta. Ta s vit cc hm: nhp 1 ma trn
t bn phm, hin th ma trn ln mn hnh, cng 2 ma trn.
#include<conio.h>
#include<stdio.h>
void Nhap(int a[][10],int M,int N)
{
int i,j;
for(i=0;i<M;i++)
for(j=0; j<N; j++)
{
printf("Phan tu o dong %d cot %d: ",i,j);
scanf("%d",&a[i][j]);
}
}
void InMaTran(int a[][10], int M, int N)
{
int i,j;
for(i=0;i<M;i++)
{
for(j=0; j< N; j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
/* Cong 2 ma tran A & B ket qua la ma tran C*/
void CongMaTran(int a[][10],int b[][10],int M,int N,int c[][10])
{
int i,j;
for(i=0;i<M;i++)
for(j=0; j<N; j++)
c[i][j]=a[i][j]+b[i][j];
}
int main()
{
int a[10][10], b[10][10], M, N;
int c[10][10];/* Ma tran tong*/
printf("So dong M= "); scanf("%d",&M);

71
printf("So cot N= "); scanf("%d",&N);
printf("Nhap ma tran A\n");
Nhap(a,M,N);
printf("Nhap ma tran B\n");
Nhap(b,M,N);
printf("Ma tran A: \n");
InMaTran(a,M,N);
printf("Ma tran B: \n");
InMaTran(b,M,N);
CongMaTran(a,b,M,N,c);
printf("Ma tran tong C:\n");
InMaTran(c,M,N);
getch();
return 0;
}

V d 2: Nhp vo mt ma trn 2 chiu gm cc s thc, in ra tng ca cc phn t trn


ng cho chnh ca ma trn ny. Ta nhn thy rng gi s ma trn a c M dng, N ct
th cc phn t ca ng cho chnh l cc phn t c dng: a[i][i] vi i
[0min(M,N)-1].
#include<conio.h>
#include<stdio.h>
int main()
{
float a[10][10], T=0;
int M, N, i,j, Min;
printf("Ma tran co bao nhieu dong? ");scanf("%d",&M);
printf("Ma tran co bao nhieu cot? ");scanf("%d",&N);
for(i=0;i<M;i++)
for(j=0; j<N; j++)
{
printf("Phan tu o dong %d cot %d: ",i,j);
scanf("%f",&a[i][j]);
}
printf("Ma tran vua nhap: \n");
for(i=0;i<M;i++)
{
for(j=0; j< N; j++)
printf("%.2f ",a[i][j]);

72
printf("\n");
}
Min =(M>N) ? N: M; /* Tm gi tr? nh? nh?t c?a M & N*/
for(i=0;i<Min;i++)
T=T+a[i][i];
printf("Tong cac phan tu o duong cheo chinh la: %f",T);
getch();
return 0;
}

II. Con tr
Cc bin chng ta bit v s dng trc y u l bin c kch thc v kiu d liu
xc nh. Ngi ta gi cc bin kiu ny l bin tnh. Khi khai bo bin tnh, mt lng
nh cho cc bin ny s c cp pht m khng cn bit trong qu trnh thc thi chng
trnh c s dng ht lng nh ny hay khng. Mt khc, cc bin tnh dng ny s tn
ti trong sut thi gian thc thi chng trnh d c nhng bin m chng trnh ch s
dng 1 ln ri b.
Mt s hn ch c th gp phi khi s dng cc bin tnh:
- Cp pht nh d, gy ra lng ph nh;
- Cp pht nh thiu, chng trnh thc thi b li.
trnh nhng hn ch trn, ngn ng C cung cp cho ta mt loi bin c bit gi l
bin ng vi cc c im sau:
- Ch pht sinh trong qu trnh thc hin chng trnh ch khng pht sinh lc bt
u chng trnh;
- Khi chy chng trnh, kch thc ca bin, vng nh v a ch vng nh c
cp pht cho bin c th thay i;
- Sau khi s dng xong c th gii phng tit kim ch trong b nh.
Tuy nhin cc bin ng khng c a ch nht nh nn ta khng th truy cp n chng
c. V th, ngn ng C li cung cp cho ta mt loi bin c bit na khc phc tnh
trng ny, l bin con tr (pointer) vi cc c im:
- Bin con tr khng cha d liu m ch cha a ch ca d liu hay cha a ch
ca nh cha d liu;
- Kch thc ca bin con tr khng ph thuc vo kiu d liu, lun c kch thc
c nh l 2 byte.

1. Khai bo v s dng bin con tr

Khai bo bin con tr


C php:
<Kiu> * <Tn con tr> ;
ngha: Khai bo mt bin c tn l Tn con tr dng cha a ch ca cc bin c
kiu Kiu.

73
V d 1: Khai bo 2 bin a,b c kiu int v 2 bin pa, pb l 2 bin con tr kiu int.
int a, b, *pa, *pb;
V d 2: Khai bo bin f kiu float v bin pf l con tr float
float f, *pf;
Lu : Nu cha mun khai bo kiu d liu m con tr ptr ang ch n, ta s dng:
void *ptr;
sau , nu ta mun con tr ptr ch n kiu d liu g cng c. Tc dng ca khai bo
ny l ch dnh ra 2 bytes trong b nh cp pht cho bin con tr ptr.

Cc thao tc trn con tr


Gn a ch ca bin cho bin con tr
Ton t & dng nh v con tr n a ch ca mt bin ang lm vic.
C php:
<Tn bin con tr>=&<Tn bin>;
Gii thch: Ta gn a ch ca bin Tn bin cho con tr Tn bin con tr.
V d: Gn a ch ca bin a cho con tr pa, gn a ch ca bin b cho con tr pb.
pa=&a; pb=&b;
Lu : Khi gn a ch ca bin tnh cho con tr cn phi lu kiu d liu ca chng.
V d sau y khng ng do khng tng thch kiu:
int Bien_Nguyen;
float *Con_Tro_Thuc;
...
Con_Tro_Thuc=&Bien_Nguyen;
Php gn y l sai v Con_Tro_Thuc l mt con tr kiu float (n ch c th cha c
a ch ca bin kiu float); trong khi , Bien_Nguyen c kiu int.
Ni dung ca nh con tr ch ti
truy cp n ni dung ca nh m con tr ch ti, ta s dng c php:
*<Tn bin con tr>
V d 3: V d sau y cho php khai bo, gn a ch cng nh ly ni dung vng nh
ca bin con tr:
int x=100;
int *ptr;
ptr=&x;

74
int y= *ptr;
Lu : Khi gn a ch ca mt bin cho mt bin con tr, mi s thay i trn ni dung
nh con tr ch ti s lm gi tr ca bin thay i theo (thc cht ni dung nh v
bin ch l mt).
V d 4: on chng trnh sau thy r s thay i ny :
#include <stdio.h>
#include <conio.h>
int main()
{
int a,b,*pa,*pb;
a=2;
b=3;
printf("\nGia tri cua bien a=%d \nGia tri cua bien b=%d ",a,b);
pa=&a;
pb=&b;
printf("\nNoi dung cua o nho con tro pa tro toi=%d",*pa);
printf("\nNoi dung cua o nho con tro pb tro toi=%d ",*pb);
*pa=20; /* Thay doi gia tri cua *pa*/
*pb=20; /* Thay doi gia tri cua *pb*/
printf("\nGia tri moi cua bien a=%d \n Gia tri moi cua bien b=%d ",a,b);
getch();
return 0;
}

Cp pht vng nh cho bin con tr


Trc khi s dng bin con tr, ta nn cp pht vng nh cho bin con tr ny qun l
a ch. Vic cp pht c thc hin nh cc hm malloc(), calloc() trong th vin
alloc.h.
C php:
void *malloc(size_t size):
Cp pht vng nh c kch thc l size.
void *calloc(size_t nitems, size_t size):
Cp pht vng nh c kch thc l nitems*size.
V d: Gi s ta c khai bo:
int a, *pa, *pb;
pa = (int*)malloc(sizeof(int));

75
/* Cp pht vng nh c kch thc bng vi kch thc ca mt s nguyn */
pb= (int*)calloc(10, sizeof(int));
/* Cp pht vng nh c th cha c 10 s nguyn*/
Lc ny hnh nh trong b nh nh sau:

0 0 1 2 3 4 5 6 7 8 9
pa (2 byte) pb (2 byte)

Lu : Khi s dng hm malloc() hay calloc(), ta phi p kiu v nguyn mu cc hm


ny tr v con tr kiu void.

Cp pht li vng nh cho bin con tr

Trong qu trnh thao tc trn bin con tr, nu ta cn cp pht thm vng nh c kch
thc ln hn vng nh cp pht, ta s dng hm realloc().
C php:
void *realloc(void *block, size_t size)
ngha:
- Cp pht li 1 vng nh cho con tr block qun l, vng nh ny c kch thc
mi l size; khi cp pht li th ni dung vng nh trc vn tn ti;
- Kt qu tr v ca hm l a ch u tin ca vng nh mi. a ch ny c th
khc vi a ch c ch ra khi cp pht ban u.
V d: Trong v d trn ta c th cp pht li vng nh do con tr pa qun l nh sau:
int a, *pa;
pa= (int*)malloc(sizeof(int)); /*Cp pht vng nh c kch thc 2 byte*/
pa = realloc(pa, 6); /* Cp pht li vng nh c kch thc 6 byte*/
Gii phng vng nh cho bin con tr : Mt vng nh cp pht cho bin con tr, khi
khng cn s dng na, ta s thu hi li vng nh ny nh hm free().
C php:
void free(void *block)
ngha: Gii phng vng nh c qun l bi con tr block.
V d: v d trn, sau khi thc hin xong, ta gii phng vng nh cho 2 bin con tr pa
& pb:
free(pa);
free(pb);

76
Mt s php ton trn con tr

a. Php gn con tr: Hai con tr cng kiu c th gn cho nhau.


V d
int a, *p, *q ; float *f;
a = 5 ; p = &a ; q = p ; /* ng */
f = p ; /* sai do khc kiu */
Ta cng c th p kiu con tr theo c php:
(<Kiu kt qu>*)<Tn con tr>
Chng hn, v d trn c vit li:
int a, *p, *q ; float *f;
a = 5 ; p = &a ; q = p ; /* ng */
f = (float*)p; /* ng nh p kiu*/
b. Cng, tr con tr vi mt s nguyn
Ta c th cng (+), tr (-) 1 con tr vi 1 s nguyn N no ; kt qu tr v l 1 con tr.
Con tr ny ch n vng nh cch vng nh ca con tr hin ti N phn t.
V d: Cho on chng trnh sau:
int *pa;
pa = (int*) malloc(20); /* Cp pht vng nh 20 byte=10 s nguyn*/
int *pb, *pc;
pb = pa + 7;
pc = pb - 3;
Lc ny hnh nh ca pa, pb, pc nh sau:
0 1 2 3 4 5 6 7 8 9
pa pc pb

c. Con tr NULL: l con tr khng cha a ch no c. Ta c th gn gi tr NULL cho 1


con tr c kiu bt k.

d. Lu :
- Ta khng th cng 2 con tr vi nhau;
- Php tr 2 con tr cng kiu s tr v 1 gi tr nguyn (int). y chnh l khong
cch (s phn t) gia 2 con tr . Chng hn, trong v d trn pc-pa=4.

77
2. Con tr v mng

Con tr v mng 1 chiu


Gia mng v con tr c mt s lin h rt cht ch. Nhng phn t ca mng c th
c xc nh bng ch s trong mng, bn cnh chng cng c th c xc lp qua
bin con tr.
Truy cp cc phn t mng theo dng con tr
Ta c cc quy tc sau:
- &<Tn mng>[0] tng ng vi <Tn mng>
- &<Tn mng> [<V tr>] tng ng vi <Tn mng> + <V tr>
- <Tn mng>[<V tr>] tng ng vi *(<Tn mng> + <V tr>)
V d 1: Cho 1 mng 1 chiu cc s nguyn a c 5 phn t, truy cp cc phn t theo kiu
mng v theo kiu con tr.
#include <stdio.h>
#include <conio.h>
/* Nhap mang binh thuong */
void NhapMang(int a[], int N)
{
int i;
for(i=0;i<N;i++)
{
printf("Phan tu thu %d: ",i);scanf("%d",&a[i]);
}
}
/* Nhap mang theo dang con tro */
void NhapContro(int a[], int N)
{
int i;
for(i=0;i<N;i++)
{
printf("Phan tu thu %d: ",i);scanf("%d",a+i);
}
}
int main()
{
int a[20],N,i;
printf("So phan tu N= ");scanf("%d",&N);
NhapMang(a,N);

78
// NhapContro(a,N);
printf("Truy cap theo kieu mang: ");
for(i=0;i<N;i++)
printf("%d ",a[i]);
printf("\nTruy cap theo kieu con tro: ");
for(i=0;i<N;i++)
printf("%d ",*(a+i));
getch();
return 0;
}
Truy xut tng phn t ang c qun l bi con tr theo dng mng

- <Tn bin>[<V tr>] tng ng vi *(<Tn bin> + <V tr>)


- &<Tn bin>[<V tr>] tng ng vi (<Tn bin> + <V tr>)
Trong <Tn bin> l bin con tr, <V tr> l 1 biu thc s nguyn.
V d 2: Gi s c khai bo:
#include <stdio.h>
#include <alloc.h>
#include <conio.h>
#include <stdlib.h> /* Them vao so voi phien ban tren DOS*/
int main()
{
int *a;
int i;
a=(int*)malloc(sizeof(int)*10);
for(i=0;i<10;i++)
a[i] = 2*i;
printf("Truy cap theo kieu mang: ");
for(i=0;i<10;i++)
printf("%d ",a[i]);
printf("\nTruy cap theo kieu con tro: ");
for(i=0;i<10;i++)
printf("%d ",*(a+i));
getch();
return 0;
}
Con tr ch n phn t mng
Gi s con tr ptr ch n phn t a[i] no ca mng a th:

79
ptr + j ch n phn t th j sau a[i], tc a[i+j]
ptr - j ch n phn t ng trc a[i], tc a[i-j]
V d 3: Gi s c 1 mng mang_int, cho con tr contro_int ch n phn t th 5 trong
mng. In ra cc phn t ca contro_int & mang_int.
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <stdlib.h> /* Them vao so voi phien ban tren DOS*/
int main()
{
int i,mang_int[10];
int *contro_int;
for(i=0;i<=9;i++)
mang_int[i]=i*2;
contro_int=&mang_int[5];
printf("\nNoi dung cua mang_int ban dau=");
for (i=0;i<=9;i++)
printf("%d ",mang_int[i]);
printf("\nNoi dung cua contro_int ban dau =");
for (i=0;i<5;i++)
printf("%d ",contro_int[i]);
for(i=0;i<5;i++)
contro_int[i]++;
printf("\n--------------------");
printf("\nNoi dung cua mang_int sau khi tang 1=");
for (i=0;i<=9;i++)
printf("%d ",mang_int[i]);
printf("\nNoi dung cua contro_int sau khi tang 1=");
for (i=0;i<5;i++)
printf("%d ",contro_int[i]);
if (contro_int!=NULL)
free(contro_int);
getch();
return 0;
}

Con tr v mng nhiu chiu


Ta c th s dng con tr thay cho mng nhiu chiu nh sau: Gi s ta c mng 2 chiu
v bin con tr nh sau:

80
int a[n][m];
int *contro_int;
Thc hin php gn
contro_int=a;
khi phn t a[0][0] c qun l bi contro_int;
a[0][1] c qun l bi contro_int+1;
a[0][2] c qun l bi contro_int+2;
...
a[1][0] c qun l bi contro_int+m;
a[1][1] c qun l bi contro_int+m+1;
...
a[n-1][m-1] c qun l bi contro_int+(n-1)*m + (m-1);
Tng t nh th i vi mng nhiu hn 2 chiu.
V d 4: S tng ng gia mng 2 chiu v con tr.
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <stdlib.h>
int main()
{
int i,j;
int mang_int[4][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,
15,16,17,18,19,20};
int *contro_int;
contro_int=(int*)mang_int;
printf("\nNoi dung cua mang_int ban dau=");
for (i=0;i<4;i++)
{
printf("\n");
for (j=0;j<5;j++)
printf("%d\t",mang_int[i][j]);
}
printf("\n-----------------------------");
printf("\nNoi dung cua contro_int ban dau \n");
for (i=0;i<20;i++)
printf("%d ",contro_int[i]);

81
for(i=0;i<20;i++)
contro_int[i]++ ;
printf("\n-----------------------------");
printf("\nNoi dung cua mang_int sau khi tang 1=");
for (i=0;i<4;i++)
{
printf("\n");
for (j=0;j<5;j++)
printf("%d\t",mang_int[i][j]);
}
printf("\nNoi dung cua contro_int sau khi tang 1=\n");
for (i=0;i<20;i++)
printf("%d ",contro_int[i]);
if (contro_int!=NULL)
free(contro_int);
getch();
return 0;
}

3. Con tr v tham s hnh thc ca hm


Khi tham s hnh thc ca hm l mt con tr th theo nguyn tc gi hm ta dng tham
s thc t l 1 con tr c kiu ging vi kiu ca tham s hnh thc. Nu lc thc thi hm
ta c s thay i trn ni dung vng nh c ch bi con tr tham s hnh thc th lc
ni dung vng nh c ch bi tham s thc t cng s b thay i theo.
V d : Xt hm hon v c vit nh sau :
#include<stdio.h>
#include<conio.h>
void HoanVi(int *a, int *b)
{
int c=*a;
*a=*b;
*b=c;
}
int main()
{
int m=20,n=30;
printf("Truoc khi goi ham m= %d, n= %d\n",m,n);
HoanVi(&m,&n);
printf("Sau khi goi ham m= %d, n= %d",m,n);
getch();
return 0;

82
}

IV. Tm tt ni dung bi hc
I. Mng
1. Mng trong C
2. Mng mt chiu
3. Mng nhiu chiu
II. Con tr
1. Khai bo v s dng bin con tr
2. Con tr v mng
3. Con tr v tham s hnh thc ca hm

V. Bi tp
Xem Bi 9 - Bi tp thc hnh Mng v Con tr

83
Bi 9 - Bi thc hnh: MNG V CON TR
I. Bi tp lm theo yu cu
1. Tm phn t ln nht ca mng

Yu cu: Vit chng trnh cho php nhp vo mt mng, tm phn t ln nht v in ra
mn hnh

Son tho vn bn chng trnh nh sau:

#include<conio.h>
#include<stdio.h>
int main()
{
int b[20], N;
int i, ln;
printf("So phan tu thuc te cua mang N= ");
scanf("%d",&N);
for(i=0; i< N; i++)
{
printf("Phan tu thu %d: ",i);scanf("%d",&b[i]);
}
ln = b[0];
for(i=1; i< N; i++)
{
if (b[i]>ln)
{
ln=b[i];
}
}
printf("Gia tri lon nhat la: %d", ln);
getch();
return 0;
}

Th nghim 1:

1. Nhn F9 chy chng trnh, khi giao din xut hin nh sau:

84
2. Nhp cc gi tr cho N (s phn t ca mng) v cc gi tr tng ng cho mi
phn t ca mng nh sau: 4 8 5 9 1 , khi kt qu nhn c
nh sau:

3. Nhn xt v kt qu t c.

Th nghim 2: i vic tm phn t ln nht thnh phn t nh nht.

Th nghim 3: Thm vo yu cu l tm phn t ln nht v v tr ca phn t trong


mng.

2. Tnh ma trn tch


Vn : Vit chng trnh cho php nhp vo mng d liu liu hai chiu, tnh tch hai ma trn
v a ma trn kt qu ra mn hnh.
Son tho vn bn chng trnh nh sau:
#include <stdio.h>
#include <conio.h>
#define N 2
#define M 3
int main()
{
int i, j,k;
int a[N][M], b[M][N], c[N][N];
//nhap du lieu cho mang a
printf("Nhap ma tran A[%d][%d]:\n",N,M);
for(i=0;i<N;i++)

85
{
for(j=0;j<M;j++)
{
printf("a[%d][%d]:",i,j);
scanf("%d",&a[i][j]);
}
}
//nhap du lieu cho mang b
printf("Nhap ma tran b[%d][%d]:\n",M,N);
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
printf("b[%d][%d]:",i,j);
scanf("%d",&b[i][j]);
}
}
//Nhan hai ma tran
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
c[i][j]=0;
for(k=0;k<M;k++)
{
c[i][j]+=a[i][k]*b[k][j];
}
}
}
//ghi ra man hinh
printf("Ma tran tich\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%5d",c[i][j]);
}
printf("\n");
}
getch();
return 0;
}
Th nghim 1:
Nhn F9, nhp hai ma trn sau:
a
1 2 3
3 2 1
b
3 3
2 0
1 -1

86
- Hy nhn xt v kt qu nhn c
Th nghim 2:
Thay dng 49 thnh
//printf("\n");
Nhp li gi tr trn, ghi nhn s thay i kt qu in ra mn hnh
Th nghim 3:
nguyn dng printf("\n");
Thay dng 47 thnh
printf("%d",c[i][j]);
Nhp li gi tr trn, ghi nhn s thay i kt qu in ra mn hnh
Th nghim 4:
- Gi nguyn cc dng nh vn bn ban u
- Thay i dng 34 thnh
//c[i][j]=0;
Thc hin chng trnh, nhp d liu mng trn, nhn xt kt qu in ra mn hnh
Th nghim 5:
- Gi nguyn cc dng nh vn bn ban u
- Thay i dng 4 thnh
#define M 2
Thc hin chng trnh, v nhn xt v s lng phn t nhp vo, v kt qu in ra mn hnh

II. Bi tp t lm
1. Vit chng trnh nhp vo mt dy n s thc a[0], a[1],..., a[n-1], sp xp dy s
theo th t gim dn. In dy s sau khi sp xp.
2. Vit chng trnh sp xp mt mng theo th t tng dn sau khi loi b cc phn
t trng nhau.
3. Vit chng trnh nhp vo mt mng, hy xut ra mn hnh:
- Phn t ln nht ca mng.
- Phn t nh nht ca mng.
- Tnh tng ca cc phn t trong mng .
4. Vit chng trnh nhp vo mt dy cc s theo th t tng, nu nhp sai quy cch th
yu cu nhp li. In dy s sau khi nhp xong. Nhp thm mt s mi v chn s
vo dy c sao cho dy vn m bo th t tng. In li dy s kim tra.
5. Vit chng trnh nhp vo mt ma trn (mng hai chiu) cc s nguyn, gm m
hng, n ct. In ma trn ln mn hnh. Nhp mt s nguyn khc vo v xt xem c
phn t no ca ma trn trng vi s ny khng ? v tr no ? C bao nhiu phn t
?
6. Vit chng trnh chuyn i v tr t dng thnh ct ca mt ma trn (ma trn
chuyn v) vung 4 hng 4 ct. Sau vit cho ma trn tng qut cp m*n.
7. Vit chng trnh nhp vo mt mng s t nhin. Hy xut ra mn hnh:
- Dng 1 : gm cc s l, tng cng c bao nhiu s l.
- Dng 2 : gm cc s chn, tng cng c bao nhiu s chn.
- Dng 3 : gm cc s nguyn t.
- Dng 4 : gm cc s khng phi l s nguyn t.

87
8. Vit chng trnh tnh tng bnh phng ca cc s m trong mt mng cc s
nguyn.
9. Vit chng trnh thc hin vic o mt mng mt chiu.
V d : 1 2 3 4 5 7 9 10 o thnh 10 9 7 5 4 3 2 1 .
(Khng dng mng ph)
10. Vit chng trnh nhp vo hai ma trn A v B c cp m, n. In hai ma trn ln mn
hnh. Tng hai ma trn A v B l ma trn C c tnh bi cng thc:
c = a +b ( i=0,1,2,...m-1; j=0,1,2...n-1)
ij ij ij

Tnh ma trn tng C v in kt qu ln mn hnh.


11. Vit chng trnh nhp vo hai ma trn A c cp m, k v B c cp k, n. In hai ma trn
ln mn hnh. Tch hai ma trn A v B l ma trn C c tnh bi cng thc:
c = a *b + a *b + a *b + ... + a *b (i=0,1,2,...m-1;j=0,1,2...n-1)
ij i1 1j i2 2j i3 3j ik kj

Tnh ma trn tch C v in kt qu ln mn hnh.


12. Xt ma trn A vung cp n, cc phn t a[i, i] ( i= 1 ... n ) c gi l ng cho
chnh ca ma trn vung A. Ma trn vung A c gi l ma trn tam gic nu tt c
cc phn t di ng cho chnh u bng 0. nh thc ca ma trn tam gic bng
tch cc phn t trn ng cho chnh. Hy bin i ma trn A v ma trn tam gic.
In kt qu tng bc ln mn hnh.
13. Vit chng trnh thc hin vic trn hai dy c th t thnh mt dy c th t. Yu
cu khng c trn chung ri mi sp th t. Khi trn phi tn dng c tnh cht
sp ca hai dy con.
14. Thc hin cc bi tp phn Mng , bng cch s dng con tr.

88
Bi 10 - XU K T
I. Khai bo
- Chui k t l mt dy gm cc k t hoc mt mng cc k t c kt thc bng
k t \0 (cn c gi l k t NULL trong bng m ASCII).
- Cc hng chui k t c t trong cp du nhy kp .

1. Khai bo theo mng


C php:
char <Bin> [Chiu di ti a];
V d: Trong chng trnh, ta c khai bo:
char Ten[12];
Trong khai bo ny, b nh s cung cp 12+1 bytes lu tr ni dung ca chui k
t Ten; byte cui cng lu tr k t \0 chm dt chui.
Lu :
- Chiu di ti a ca bin chui l mt hng nguyn nm trong khong t 1 n 255
bytes.
- Chiu di ti a khng nn khai bo tha trnh lng ph b nh, nhng cng khng
nn khai bo thiu.

2. Khai bo theo con tr


C php:
char *<Bin>;
V d: Trong chng trnh, ta c khai bo:
char *Ten;
Trong khai bo ny, b nh s dnh 2 byte lu tr a ch ca bin con tr Ten ang
ch n, cha cung cp ni lu tr d liu. Mun c ch lu tr d liu, ta phi gi
n hm malloc() hoc calloc() c trong alloc.h, sau mi gn d liu cho bin.

3. Va khai bo va gn gi tr
C php:
char <Bin>[]=<Hng chui>
V d:
#include<stdio.h>
#include<conio.h>
int main()

89
{
char Chuoi[]="Mau nang hay la mau mat em" ;
printf("Vua khai bao vua gan tri : %s",Chuoi) ;
getch();
return 0;
}
Lu : Chui c khai bo l mt mng cc k t nn cc thao tc trn mng c th p
dng i vi chui k t.

II. Nhp xut chui


1. Nhp chui t bn phm
nhp mt chui k t t bn phm, ta s dng hm gets()
C php:
gets(<Bin chui>);
V d: char Ten[20];
gets(Ten);
Ta cng c th s dng hm scanf() nhp d liu cho bin chui, tuy nhin lc ny ta
ch c th nhp c mt chui khng c du khong trng.
Ngoi ra, hm cgets() (trong conio.h) cng c s dng nhp chui.

2. Xut chui ln mn hnh


xut mt chui (biu thc chui) ln mn hnh, ta s dng hm puts().
C php:
puts(<Biu thc chui>);
V d: Nhp vo mt chui v hin th trn mn hnh chui va nhp.
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char Ten[12];
printf("Nhap chuoi: ");gets(Ten);
printf("Chuoi vua nhap: ");puts(Ten);
getch();
return 0;
}
Ngoi ra, ta c th s dng hm printf(), cputs() (trong conio.h) hin th chui ln mn
hnh.

90
III. Mt s hm x l chui
Cc hm ny c trong string.h

1. Cng chui
- Hm strcat()
C php:
char *strcat(char *des, const char *source)
Hm ny c tc dng ghp chui ngun vo chui ch.
V d: Nhp vo h lt v tn ca mt ngi, sau in c h v tn ca h ln mn hnh.
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char HoLot[30], Ten[12];
printf("Nhap Ho Lot: ");gets(HoLot);
printf("Nhap Ten: ");gets(Ten);
strcat(HoLot,Ten); /* Ghep Ten vao HoLot*/
printf("Ho ten la: ");puts(HoLot);
getch();
return 0;
}

2. Xc nh di chui
- Hm strlen()

C php:
int strlen(const char* s)
V d: S dng hm strlen xc nh di mt chui nhp t bn phm.
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char Chuoi[255];
int Dodai;
printf("Nhap chuoi: ");gets(Chuoi);
Dodai = strlen(Chuoi);
printf("Chuoi vua nhap: ");puts(Chuoi);
printf("Co do dai %d",Dodai);

91
getch();
return 0;
}

3. i mt k t thng thnh k t hoa


- Hm toupper(): Hm toupper() (trong ctype.h) c dng chuyn i mt k t
thng thnh k t hoa.
C php:
char toupper(char c)

4. i chui ch thng thnh chui ch hoa


- Hm strupr(): Hm struppr() c dng chuyn i chui ch thng thnh chui
ch hoa, kt qu tr v ca hm l mt con tr ch n a ch chui c chuyn i.
C php:
char *strupr(char *s)
V d: Vit chng trnh nhp vo mt chui k t t bn phm. Sau s dng hm
strupr() chuyn i chng thnh chui ch hoa.
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char Chuoi[255],*s;
printf("Nhap chuoi: ");
gets(Chuoi);
s=strupr(Chuoi) ;
printf("Chuoi chu hoa: ");
puts(s);
getch();
return 0;
}

5. i chui ch hoa thnh chui ch thng


- Hm strlwr(): Mun chuyn i chui ch hoa thnh chui ton ch thng, ta s
dng hm strlwr(), cc tham s ca hm tng t nh hm strupr().
C php:
char *strlwr(char *s)

92
6. Sao chp chui
- Hm strcpy(): Hm ny c dng sao chp ton b ni dung ca chui ngun vo
chui ch.
C php:
char *strcpy(char *Des, const char *Source)
V d: Vit chng trnh cho php chp ton b chui ngun vo chui ch.
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char Chuoi[255],s[255];
printf("Nhap chuoi: ");
gets(Chuoi);
strcpy(s,Chuoi);
printf("Chuoi dich: ");
puts(s);
getch();
return 0;
}

7. Sao chp mt phn chui


- Hm strncpy(): Hm ny cho php chp n k t u tin ca chui ngun sang chui
ch.
C php:
char *strncpy(char *Des, const char *Source, size_t n)

8. Trch mt phn chui


- Hm strchr(): trch mt chui con ca mt chui k t bt u t mt k t c
ch nh trong chui cho n ht chui, ta s dng hm strchr().
C php :
char *strchr(const char *str, int c)
Lu :
- Nu k t ch nh khng c trong chui, kt qu tr v l NULL ;
- Kt qu tr v ca hm l mt con tr, con tr ny ch n k t c c tm thy u
tin trong chui str.

93
9. Tm kim ni dung chui
- Hm strstr(): Hm strstr() c s dng tm kim s xut hin u tin ca chui s2
trong chui s1.
C php:
char *strstr(const char *s1, const char *s2)
Kt qu tr v ca hm l mt con tr ch n phn t u tin ca chui s1 c cha
chui s2 hoc gi tr NULL nu chui s2 khng c trong chui s1.
V d: Vit chng trnh s dng hm strstr() ly ra mt phn ca chui gc bt u t
chui hoc.
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char Chuoi[255],*s;
printf("Nhap chuoi: ");
gets(Chuoi);
s=strstr(Chuoi,"hoc");
printf("Chuoi trich ra: ");
puts(s);
getch();
return 0;
}

10. So snh chui


- Hm strcmp(): so snh hai chui theo tng k t trong bng m Ascii, ta c th s
dng hm strcmp().
C php:
int strcmp(const char *s1, const char *s2)
Hai chui s1 v s2 c so snh vi nhau, kt qu tr v l mt s nguyn (s ny c
c bng cch ly k t ca s1 tr k t ca s2 ti v tr u tin xy ra s khc nhau).
- Nu kt qu l s m, chui s1 nh hn chui s2;
- Nu kt qu l 0, hai chui bng nhau;
- Nu kt qu l s dng, chui s1 ln hn chui s2.

94
11. So snh chui
- Hm stricmp(): Hm ny thc hin vic so snh trong n k t u tin ca 2 chui s1
v s2, gia ch thng v ch hoa khng phn bit.
C php:
int stricmp(const char *s1, const char *s2)
Kt qu tr v tng t nh kt qu tr v ca hm strcmp()

12. Khi to chui


- Hm memset(): Hm ny c s dng t n k t u tin ca chui l k t c.
C php:
memset(char *Des, int c, size_t n)
i t chui ra s, hm atoi(), atof(), atol() (trong stdlib.h): chuyn i chui ra
s, ta s dng cc hm trn.
C php :
int atoi(const char *s) : chuyn chui thnh s nguyn
long atol(const char *s) : chuyn chui thnh s nguyn di
float atof(const char *s) : chuyn chui thnh s thc
Nu chuyn i khng thnh cng, kt qu tr v ca cc hm l 0. Ngoi ra, th vin
string.h cn h tr cc hm x l chui khc, ta c th c thm trong phn tr gip.

V. Tm tt ni dung bi hc
I. Gii thiu
II. Khai bo
III. Nhp/Xut
IV. Cc hm x l

VI. Bi tp
Xem Bi 11 - Bi tp thc hnh Xu k t

95
Bi 11 - Bi thc hnh: XU K T
I. Bi tp lm theo yu cu
1. To xu chuyn ng trn mn hnh
Vn : Hy to mt dng ch chuyn ng trn mn hnh
Son tho on chng trnh sau:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define MAX_LENTH 100
int main()
{
char st[MAX_LENTH];
char sttemp[MAX_LENTH];
int length;
strcpy(st,"Lop hoc lap trinh co ban ");
length=strlen(st);
printf("Chuoi truoc khi xu ly (%s)\n",st);
strcpy(sttemp,&st[1]);
sttemp[length-1]=st[0];
sttemp[length]=0;
strcpy(st,sttemp);
printf("Chuoi sau khi xu ly (%s)\n",st);
getch();
return 0;
}
Th nghim 1:
- D on mc tiu chng trnh
- Chy th chng trnh.
- Chng trnh thc hin in ra hai dng d liu khc nhau nh th no?
Th nghim 2: Son tho on chng trnh sau:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include<time.h>
#define MAX_LENTH 100
int main()
{
int i=0;
clock_t goal;
system("cls");
do
{
printf("%d",i);
i++;
goal= clock()+100;
while (goal > clock());
system("cls");
} while (!kbhit());

96
return 0;
}
- Chy th chng trnh
- Chng trnh tin hnh to vng lp m cc s v in ra mn hnh, mi vng lp dng
100 mili giy trc khi in ra s tip theo.
- Th b lnh system(cls); xem kt qu
Th nghim 3:
- Phn tch ngha ca
goal= clock()+100;
while (goal > clock());
trong on chng trnh trn, th thay i gi tr 100 bi gi tr khc xem hiu ng.

2. Ly Tn t h tn ngi Vit

Yu cu: Gi s H tn ngi Vit lun c dng H m Tn, trong cc phn H,


m, Tn lun cch nhau 1 du cch; phn m c th c hoc khng hoc c nhiu hn
1 t. Hy vit chng trnh cho php nhp vo hoten, ri in ra phn Tn.

Son tho vn bn chng trnh nh sau

#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char Chuoi[255],s[255];
int n,i,k;
printf("Nhap chuoi: ");
gets(Chuoi);
n=strlen(Chuoi);
for (i=n-1;i>-1;i--)
{
if (Chuoi[i]==32)
{
k=i;
break;
}
}
printf("ket qua\n");
strncpy(s,Chuoi+k+1,n-k-1);
puts(s);
getch();
return 0;
}
Th nghim 1:

97
1. Nhn F9 chy th chng trnh, khi giao din xut hin nh hnh sau:

2. Nhp gi tr cho chui l Hoang Duc Van , khi kt qu nhn c nh


sau:

3. Nhn xt v kt qu t c.

Th nghim 2: Chy v nhp chui vo l Hoang Duc Van (c cha 2 du cch


cui), nhn xt v kt qu t c.

Th nghim 3: Chy v nhp chui vo l HoangDucVan (khng c du cch), nhn


xt v kt qu t c.

II. Bi tp t lm
1. Vit chng trnh nhp mt chui k t t bn phm, xut ra mn hnh m Ascii
ca tng k t c trong chui.
2. Vit chng trnh nhp mt chui k t t bn phm, xut ra mn hnh chui o
ngc ca chui . V d o ca abcdx_egh l hge_xdcba.
3. Vit chng trnh nhp mt chui k t v kim tra xem chui c i xng
khng. V d : Chui ABCDEDCBA l chui i xng.
4. Nhp vo mt chui bt k, hy m s ln xut hin ca mi loi k t.
a. V d:
b. Chuoi1[] = abcdeaabbdca
c. Chuoi2[]=a b c d e
d. SLXH[] = 4,3,2,2,1

98
5. Vit chng trnh nhp vo mt chui.
a. In ra mn hnh t bn tri nht v phn cn li ca chui. V d: Nguyn
Vn Minh in ra thnh:
i. Nguyn
ii. Vn Minh
b. In ra mn hnh t bn phi nht v phn cn li ca chui. V d: Nguyn
Vn Minh in ra thnh:
i. Minh
ii. Nguyn Vn
6. Vit chng trnh nhp vo mt chui ri xut chui ra mn hnh di dng
mi t mt dng. V d: Nguyn Vn Minh in ra :
i. Nguyn
ii. Vn
iii. Minh
7. Vit chng trnh nhp vo mt chui, in ra chui o ngc ca n theo tng t.
V d : chui Nguyn Vn Minh o thnh Minh Vn Nguyn
8. Vit chng trnh i s tin t s thnh ch. V d: 123 thnh ch l mot tram
hai muoi ba.
9. Vit chng trnh nhp vo h v tn ca mt ngi, ct b cc khong trng
khng cn thit (nu c), tch tn ra khi h v tn, in tn ln mn hnh. Ch n
trng hp c h v tn ch c mt t.
10. Vit chng trnh nhp vo h v tn ca mt ngi, ct b cc khong trng bn
phi, tri v cc khong trng khng c ngha trong chui. In ra mn hnh ton b
h tn ngi di dng ch hoa, ch thng.
11. Vit chng trnh nhp vo mt danh sch h v tn ca n ngi theo kiu ch
thng, i cc ch ci u ca h, tn v ch lt ca mi ngi thnh ch hoa. In
kt qu ln mn hnh.
12. Vit chng trnh nhp vo mt danh sch h v tn ca n ngi, tch tn tng
ngi ra khi h v tn ri sp xp danh sch tn theo th t t in. In danh sch
h v tn sau khi sp xp.

99
Bi 12 - HM V CU TRC CHNG TRNH
Ni dung bi hc
I. T chc chng trnh
1. V d
2. Cu trc chng trnh
3. Hm xy dng sn
II. Hm do ngi dng nh ngha
1. Khai bo v nh ngha Hm
2. Li gi Hm
3. Hm vi i mc nh
4. Khai bo hm trng tn
5. Truyn tham s
6. Hm v mng
III. Con tr hm
1. Khai bo
2. S dng con tr hm
3. Mng con tr hm
IV. qui
1. Khi nim
2. Lp cc bi ton gii c bng qui
3. Cc v d
V. Tm tt ni dung bi hc
VI. Bi tp

I. T chc chng trnh


Mi chng trnh nh nu ra cc v d trong cc chng trc y thng kh ngn; do :
Thng khng kh hiu;
D nh ton b ni dung chng trnh cng nh
Hiu trnh t logic cc bc ca cng vic.
Tuy nhin khi gii quyt cc bi ton thc t th vn bn chng trnh thng di hn rt nhiu,
khi :
Vic qun l trnh t logic cc cng vic l tng i kh khn.
Thm na, khi vit chng trnh chng ta thng gp nhng on chng trnh lp i
lp li nhiu ln nhng ch khc nhau vi s khc bit rt nh hoc thm ch ging
nhau hon ton.
gii quyt vn ny, tt c cc ngn ng lp trnh u cho php ngi s dng t chc
chng trnh thnh chng trnh chnh v cc chng trnh con dng th tc v hm.

1. V d
V d, xt bi ton kim tra v tr tng i ca im M trn mt phng so vi tam gic ABC l
trong, nm trn cnh hay ngoi tam gic.

100
Bi ton ny c th gii bng cch:
Nu din tch tam gic ABC bng tng din tch cc tam gic MAB, MBC v MAC th
kt lun l M nm trong tam gic ABC.
Ngc li, khi din tch tam gic ABC nh hn tng din tch cc tam gic MAB, MBC
v MAC th kt lun l M nm ngoi tam gic ABC.
Nu theo bin php ny th r rng l trong chng trnh phi cn t nht l bn ln tnh din tch
tam gic. Nu ta vit mt chng trnh con tnh din tch tam gic khi bit ba nh U, V, E nh
DT (U,V,E) chng hn, th chng trnh ca chng ta dng nh ch cn l mt dng lnh n
gin:
If (DT (A,B,C) < DT (M,B,C)+DT(M,C,A)+DT(M,A,B))
printf(M nam ngoai ABC);
else
printf(M nam trong ABC);
Vi v d va ri chng ta thy rt r mt li ch ca vic s dng chng trnh con l:
Lm gn nh chng trnh, thay v phi vit bn ln cng mt on chng trnh rt
ging nhau mt cch nhm chn th gi y ta ch cn vit c mt ln.
Ngoi ra n cho php ngi lp trnh c th kim sot chng trnh ca mnh mt cch
d dng v thun tin hn.
Hin nhin l vic phi kim tra, tm li lgic trong mt chng trnh c bn on tnh
din tch tam gic so vi vic kim tra k mt on chng trnh tnh din tch tam gic
cng vi mt dng lnh r rng v d hiu nh trn l rt khc nhau v s phc tp.

2. Cu trc chng trnh


Mt chng trnh hon chnh trong C/C++ c 6 phn chnh (nhng khng bt buc) theo th t
nh sau:
1. Ch th tin x k;
2. nh ngha kiu d liu;
3. Khi bo prototype;
4. Khai bo bin ngoi;
5. Chng trnh chnh v
6. Ci t hm.
Ni dung c bn cc phn ny c m t chi trong cc phn sau y.

101
1. Cc ch th tin x l
Nh bit trc khi chy chng trnh (bt u t vn bn chng trnh tc chng trnh
ngun) C/C++ s dch chng trnh ra tp m my cn gi l chng trnh ch. Thao tc dch
chng trnh ni chung gm c 2 phn:
X l s b chng trnh, hay cn gi l tin x l v
Dch.
Phn x l s b c gi l tin x l, trong c cc cng vic lin quan n cc ch th c
t u tp chng trnh ngun nh #include, #define
Ch th bao hm tp #include
Cho php ghp ni dung cc tp c khc vo chng trnh trc khi dch. Cc tp cn ghp
thm vo chng trnh thng l cc tp cha khai bo nguyn mu ca cc hng, bin, hm
c sn trong C hoc cc hm do lp trnh vin t vit. C hai dng vit ch th ny:
1. #include <tp>
2. #include ng dn\tp

Dng khai bo 1 cho php trnh bin dch tm tp cn ghp ti th mc nh sn ca cng


c lp trnh. Thng th mi cng c lp trnh dng C u xy dng sn cc hm trong
cc tp nguyn mu, cc tp ny c lu trong th mc INCLUDES, v thit lp th
mc mc nh n th mc INCLUDES ny.
Dng khai bo 2 cho php tm tp theo ng dn, nu khng c ng dn s tm trong
th mc hin ti. Tp thng l cc tp (th vin) c to bi lp trnh vin v c t
trong cng th mc cha chng trnh. C php ny cho php lp trnh vin chia mt
chng trnh thnh nhiu mun t trn mt s tp khc nhau d qun l.
Ch th macro #define
#define tn_macro xaukitu

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

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


if (i < MAX) then
begin
ok = TRUE;
printf(%d,i) ;
end

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


if (i < 100)
{
ok = 1;
printf(%d,i);

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

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

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

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

o Tng t nh trn, vit #define max(A,B) (A > B ? A: B) l sai (?) v vy lun lun
bao cc i bi du ngoc n ().
o #define bp(x) ((x)*(x)) vit ng nhng nu gi s lp trnh vin mun tnh bnh
phng ca 2 bng on lnh sau:
int i = 1;
printf(Ket qua: %d,bp(++i));

th kt qu in ra s l 6 (trn Dev-C++ kt qu ny l 9 ?) thay v kt qu mong


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

2. nh ngha kiu d liu


Dng t tn li cho mt kiu d liu no gi nh hay t 1 kiu d liu cho ring mnh
da trn cc kiu d liu c; phn ny khng bt buc phi c. Trong C/C++ cho php nh
ngha kiu d liu vi t kha struc v typedef; ni dung chi tit v vn ny c trnh by
trong phn chng 6.
3. Khai bo cc prototype
Khai bo m t cc hm s dng trong chng trnh chnh bao gm tn hm, cc tham s hnh
thc, kiu d liu tr v ca hm. Phn ny l khng bt buc, tuy nhin nhng hm c dng
trong chng trnh chnh hoc chng trnh con khc bt buc phi c khai bo prototype
trc khi s dng. Ti v tr ny c th khai bo y mt hm bao gm c phn m t v thn

103
hm, tuy nhin cch vit lm cho chng trnh chnh b y su xung cui chng trnh lm
cho chng trnh kh theo di. V vy vic vit cc hm, chng trnh con thng c t chc
thnh 2 phn l phn khai bo prototype trc hm main v phn ci t ni dung hm sau hm
main. Ni dung chi tit v cng vic ny s c cp c th trong phn sau ca chng ny.
4. Khai bo cc bin ngoi (cc bin ton cc)

Cho php khai bo cc bin, hng c phm vi tc ng trong ton b chng trnh. Phn ny l
ty vo nhu cu x dng trong mi chng trnh m c th c hoc khng.
5. Chng trnh chnh

Phn ny bt buc phi c. Trong C/C++ chng trnh chnh c qui nh c tn l main. Phn
ny c m t trong cc phn sau.
6. Ci t cc hm

y l phn m ngun y ca cc hm. Ni dung ny s c nghin cu trong cc phn


tip theo ca chng ny.

3. Hm xy dng sn
7. stdio.h: Th vin cha cc hm vo/ ra chun (standard input/output). Gm cc hm
printf(), scanf(), getc(), putc(), gets(), puts(), fflush(), fopen(), fclose(), fread(), fwrite(),
getchar(), putchar(), getw(), putw()
8. conio.h: Th vin cha cc hm vo ra trong ch DOS (DOS console). Gm cc hm
clrscr(), getch(), getche(), getpass(), cgets(), cputs(), putch(), clreol(),
9. math.h: Th vin cha cc hm tnh ton gm cc hm abs(), sqrt(), log(). log10(), sin(),
cos(), tan(), acos(), asin(), atan(), pow(), exp(),
10. alloc.h: Th vin cha cc hm lin quan n vic qun l b nh. Gm cc hm
calloc(), realloc(), malloc(), free(), farmalloc(), farcalloc(), farfree(),
11. io.h: Th vin cha cc hm vo ra cp thp. Gm cc hm open(), _open(), read(),
_read(), close(), _close(), creat(), _creat(), creatnew(), eof(), filelength(), lock(),
12. graphics.h: Th vin cha cc hm lin quan n ha. Gm initgraph(), line(),
circle(), putpixel(), getpixel(), setcolor(),

II. Hm do ngi dng nh ngha


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 ngn ng lp
trnh 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;

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

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


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

Thng thng chng trnh c r rng chng ta nn trnh lm dng cc ngm nh. V d
trong khai bo cong(int, int); nn khai bo r c kiu hm (trong trng hp ny kiu hm ngm
nh l int) nh sau : int cong(int, int);.
2. nh ngha hm
Cu trc mt hm bt k c b tr cng ging nh hm main() trong cc phn trc.
Hm c tr v gi tr
<kiu hm> <tn hm>(danh sch tham i hnh thc)
{
khai bo cc b ca hm ; // ch dng ring cho hm ny
dy lnh ca hm ;
return (biu thc tr v); // c th nm u trong dy lnh.
}

Trong :
o Danh sch tham i hnh thc cn c gi ngn gn l danh sch i gm dy

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

Hm khng tr v gi tr
void <tn hm>(danh sch tham i hnh thc)
{
khai bo cc b ca hm ; // ch dng ring cho hm ny
dy lnh ca hm ;
return; // c th nm u trong dy lnh.
}

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


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

Hm main() thng thng c hoc khng c gi tr tr v cho h iu hnh khi chng


trnh chy xong, v vy ta thng khai bo kiu hm l int main() hoc void main() v cu
lnh cui cng trong hm thng l return 1 hoc return. Trng hp b qua t kho void
nhng trong thn hm khng c cu lnh return (ging phn ln v d trong gio trnh
ny) chng trnh s ngm hiu hm main() tr li mt gi tr nguyn nhng v khng c
nn khi dch chng trnh ta s gp li cnh bo "Cn c gi tr tr li cho hm" (mt li
cnh bo khng phi l li, chng trnh vn chy bnh thng). trnh b quy ry v
nhng li cnh bo "khng mi" ny chng ta c th t thm cu lnh return 0; (nu
khng khai bo void main()) hoc khai bo kiu hm l void main() v t cu lnh
return vo cui hm.

106
Ch :
Danh sch i trong khai bo hm c th cha hoc khng cha tn i, thng thng ta
ch khai bo kiu i ch khng cn khai bo tn i, trong khi dng u tin ca nh
ngha hm phi c tn i y ;
Cui khai bo hm phi c du chm phy (;), trong khi cui dng u tin ca nh
ngha hm khng c du chm phy;
Hm c th khng c i (danh sch i rng), tuy nhin cp du ngoc sau tn hm vn
phi c vit. V d clrscr(), lamtho(), vietgiaotrinh(), ;
Mt hm c th khng cn phi khai bo nu n c nh ngha trc khi c hm no
gi n n. V d c th vit hm main() trc (trong vn bn chng trnh), ri sau
mi vit n cc hm "con". Do trong hm main() chc chn s gi n hm con ny
nn danh sch ca chng phi c khai bo trc hm main(). Trng hp ngc li
nu cc hm con c vit (nh ngha) trc th khng cn phi khai bo chng na (v
trong nh ngha hm khai bo). Nguyn tc ny p dng cho hai hm A, B bt k
ch khng ring cho hm main(), ngha l nu B gi n A th trc A phi c nh
ngha hoc t nht cng c dng khai bo v A.

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

107
V d: Gi s ta cn tnh gi tr ca biu thc 2x3 - 5x2 - 4x + 1, thay cho vic tnh trc
tip x3 v x2, ta c th gi hm luythua() trong v d trn tnh cc gi tr ny bng cch
gi n trong hm main() nh sau:
#include <iostream.h>
#include <iomanip.h>
void xmh(int);
double luythua(float x, int n);
3 2
main() // tnh gi tr 2x - 5x - 4x + 1
{
float x ; // tn bin c th trng vi i ca hm
double f ; // lu kt qu
printf("x = ");
scanf("%f" ,&x ) ;
f = 2*luythua(x,3) - 5*luythua(x,2) - 4*x + 1;
xmh(100); // xo tht sch mn hnh 100 ln
printf(%d,f) ;
getch();
return 0;
}
double luythua(float x, int n) // tr li gi tr xn
{
int i ; // bin ch s
double kq = 1 ; // lu kt qu
for (i=1; i<=n; i++) kq *= x ;
return kq;
}
void xmh(int n) // xo mn hnh n ln
{
int i;
for (i=1; i<=n; i++) clrscr();
return ;
}

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


hn hm luythua() ch c vit mt ln nhng c th s dng n nhiu ln (2 ln trong v
d ny) ch bng mt cu lnh gi n gin cho mi ln s dng thay v phi vit li
nhiu ln on lnh tnh lu tha.

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

108
nu mt s trong chng c sn nhng gi tr nh trc.
C php
<kiu hm> <tn hm>(1, , n, m1 = gt1, , mm = gtm

Trong :
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 4.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, cn luythua(2) c hiu l 22.
Hm tnh tng 4 s nguyn: int tong(int m, int n, int i = 0; int j = 0); khi c th tnh
tng ca 5, 2, 3, 7 bng li gi hm tong(5,2,3,7) hoc c th ch tnh tng 3 s 4, 2, 1
bng li gi tong(4,2,1) hoc cng c th gi tong(6,4) ch tnh tng ca 2 s 6 v 4.
Ch : Cc i ngm nh phi c khai bo lin tc v xut hin cui cng trong danh
sch i. V d:
int tong(int x, int y=2, int z, int t=1); // sai v cc i mc nh khng lin tc
void xoa(int x=0, int y) // sai v i mc nh khng cui

4. Khai bo hm trng tn
Hm trng tn hay cn gi l hm chng (). y l mt k thut cho php s dng
cng mt tn gi cho cc hm "ging nhau" (cng mc ch) nhng x l trn cc kiu
d liu khc nhau hoc trn s lng d liu khc nhau. V d hm sau tm s ln nht
trong 2 s nguyn:

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

o Nu t c = max(3, 5) ta s c c = 5.
o Tuy nhin cng tng t nh vy nu t c = max(3.0, 5.0) chng trnh s b li
v cc gi tr (float) khng ph hp v kiu (int) ca i trong hm max.
Trong trng hp nh vy chng ta phi vit hm mi tnh max ca 2 s thc. Mc
ch, cch lm vic ca hm ny hon ton ging hm trc, tuy nhin trong C v cc
ngn ng lp trnh khc chng ta buc phi s dng mt tn mi cho hm "mi" ny. V
d:
float fmax(float a, float b) { return (a > b) ? a: b ; }
Tng t tun tin ta s vit thm cc hm:

char cmax(char a, char b) { return (a > b) ? a: b ; }

109
long lmax(long a, long b) { return (a > b) ? a: b ; }
double dmax(double a, double b) { return (a > b) ? a: b ; }

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


bt li khi cn gi hm.
C++ cho php ta c th khai bo v nh ngha c 5 hm trn vi cng 1 tn gi v d l
max chng hn. Khi ta c 5 hm:
int max(int a, int b) { return (a > b) ? a: b ; }
float max(float a, float b) { return (a > b) ? a: b ; }
char max(char a, char b) { return (a > b) ? a: b ; }
long max(long a, long b) { return (a > b) ? a: b ; }
double max(double a, double b) { return (a > b) ? a: b ; }

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


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

Trong v d trn ta gi thit Diem l mt kiu d liu lu to ca cc im trn mn


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

5. Truyn tham s
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.

110
1. Truyn theo tham tr

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


bin a, b, f ang cha cc gi tr a = 2, b = 3, v f cha c gi tr. tnh ab v gn gi tr
tnh c cho f, ta c th gi f = luythua(a,b). Khi gp li gi ny, chng trnh s t chc
nh sau:
o To 2 bin mi (tc 2 nh trong b nh) c tn x v n. Gn ni dung cc nh
ny bng cc gi tr trong li gi, tc gn 2 (a) cho x v 3 (b) cho n;
o Ti phn khai bo (ca hm), chng trnh to thm cc nh mang tn kq v i;
o Tin hnh tnh ton (gn li kt qu cho kq);
o Cui cng ly kt qu trong kq gn cho nh f (l nh c sn c khai bo
trc, nm bn ngoi hm);
o Kt thc hm quay v chng trnh gi. Do hm luythua hon thnh xong vic
tnh ton nn cc nh c to ra trong khi thc hin hm (x, n, kq, i) s c
xo khi b nh. Kt qu tnh ton c lu gi trong nh f (khng b xo v
khng lin quan g n hm)
Trn y l truyn i theo cch thng thng. Vn t ra l gi s ngoi vic tnh f, ta
cn mun thay i cc gi tr ca cc nh a, b (khi truyn n cho hm) th c th thc
hin c khng ? gii quyt bi ton ny ta cn theo mt k thut khc, nh vo vai
tr ca bin con tr v tham chiu.
2. Truyn theo dn tr
Xt v d tro i gi tr ca 2 bin. y l mt yu cu nh nhng c gp nhiu ln
trong chng trnh, v d sp xp mt danh sch. Do vy cn vit mt hm thc
hin yu cu trn. Hm khng tr kt qu. Do cc bin cn trao i l cha c bit
trc ti thi im vit hm, nn ta phi a chng vo hm nh cc tham i, tc hm
c hai tham i x, y i din cho cc bin s thay i gi tr sau ny.
T mt vi nhn xt trn, theo thng thng hm tro i s c vit nh sau:
void doi_cho(int x, int y)
{
int t ;
t=x;
x=y;
y=t;
}

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


i ni dung 2 bin ny sao cho x = 5 cn y = 2 bng cch gi n hm doi_cho(x, y).
int main()
{
int x = 2;
int y = 5;
doi_cho(x, y) ;
printf("%d, %d",x, y); // 2, 5 (x, y vn khng i)
getch();
return 0;
}

111
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.

Hnh 4.1 - S thay i gi tr ca tham s thc


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

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


hm doi_cho s thc s lm thay i ni dung ca x, y ch khng phi ca p, q. T li
gi hm s l doi_cho(&x, &y) (tc truyn a ch ca x cho p, p tr ti x v tng t q tr
ti y).
Nh vy c th tm tt 3 c trng vit mt hm lm thay i gi tr bin ngoi nh
sau:
o i ca hm phi l con tr (v d int *p);
o Cc thao tc lin quan n i ny (trong thn hm) phi thc hin ti ni n tr
n (v d *p = );
o Li gi hm phi chuyn a ch cho p (v d &x).
Ngoi hm doi_cho trnh by, y ta a thm v d thy s cn thit phi c hm

112
cho php thay i bin ngoi. V d hm gii phng trnh bc 2 vi yu cu:
o Cho trc 3 s a, b, c nh 3 h s ca phng trnh, cn tm 2 nghim x1, x2 ca
n.
o Khng th ly gi tr tr li ca hm lm nghim v gi tr tr li ch c 1 trong
khi ta cn n 2 nghim.
o Do vy ta cn khai bo 2 bin "ngoi" trong chng trnh cha cc nghim, v
hm phi lm thay i 2 bin ny (tc cha gi tr nghim gii c).
o Nh vy hm c vit cn phi c 5 i, trong 3 i a, b, c i din cho cc
h s, khng thay i v 2 bin x1, x2 i din cho nghim, 2 i ny phi c
khai bo dng con tr.
o Ngoi ra, phng trnh c th v nghim, 1 nghim hoc 2 nghim do vy hm s
tr li gi tr l s nghim ca phng trnh, trong trng hp 1 nghim (nghim
kp), gi tr nghim s c cho vo x1.
int gptb2(float a, float b, float c, float *p, float *q)
{
float d ; // 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 ;
}
}

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


main()
{
float a, b, c ; // cc h s
float x1, x2 ; // cc nghim
printf("Nhp h s: ");
scanf(%f %f %f,&a, &b, &c);
switch (gptb2(a, b, c, &x1, &x2))
{
case 0:
printf("Phng trnh v nghim");
break;
case 1:
printf("Phng trnh c nghim kp x = %f", x1);
break;
case 2:
printf("Phng trnh c 2 nghim phn bit:\n");
printf("x1 = %f , v x2 = %f", x1, x2);
break;
}

113
}

Trn y chng ta trnh by cch xy dng cc hm cho php thay i gi tr ca bin


ngoi. Mt c trng d nhn thy l cch vit hm tng i phc tp. Do vy C++
pht trin mt cch vit khc da trn i tham chiu v vic truyn i cho hm c
gi l truyn theo tham chiu.
3. Truyn theo tham chiu

Mt bin c th c gn cho mt b danh mi, v khi ch no xut hin bin th cng


tng ng nh dng b danh v ngc li. Mt b danh nh vy c gi l mt bin
tham chiu, ngha thc t ca n l cho php "tham chiu" ti mt bin khc cng kiu
ca n, tc s dng bin khc nhng bng tn ca bin tham chiu.
Ging khai bo bin bnh thng, tuy nhin trc tn bin ta thm du v (&). C th
tm phn bin thnh 3 loi: bin thng vi tn thng, bin con tr vi du * trc tn
v bin tham chiu vi du &.

<kiu bin> &<tn bin tham chiu> = <tn bin c tham chiu>;

C php khai bo ny cho php ta to ra mt bin tham chiu mi v cho n tham chiu
n bin c tham chiu (cng kiu v phi c khai bo t trc). Khi bin tham
chiu cn c gi l b danh ca bin c tham chiu. Ch khng c c php khai
bo ch tn bin tham chiu m khng km theo khi to. V d:
int hung, dung ; // khai bo cc bin nguyn hung, dung
int &ti = hung; // khai bo bin tham chiu ti, teo tham chieu n
int &teo = dung; // hung dung. ti, teo l b danh ca hung, dung

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


hung = 2 ;
ti ++; // tng ng hung ++;
printf(%d, %d,hung, ti); // 3 3
teo = ti + hung ; // tng ng dung = hung + hung
dung ++ ; // tng ng teo ++
printf(%d, %d,dung,teo); // 7 7

Vy s dng thm bin tham chiu lm g ?


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

in ra gi tr 7 nhng thc cht y khng phi l ni dung ca bin teo, ni dung


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

114
hm vi mc ch lm thay i ni dung ca bin ngoi.
Ch :
o Bin tham chiu phi c khi to khi khai bo;
o 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.
Mt hm vit di dng i tham chiu s n gin hn rt nhiu so vi i con tr v
ging vi cch vit bnh thng (truyn theo tham tr), trong ch c mt khc bit
l cc i khai bo di dng tham chiu.
so snh 2 cch s dng ta nhc li cc im khi vit hm theo con tr phi ch n,
l:
o i ca hm phi l con tr (v d int *p);
o Cc thao tc lin quan n i ny trong thn hm phi thc hin ti ni n tr
n (v d *p = );
o Li gi hm phi chuyn a ch cho p (v d &x).
Hy so snh vi i tham chiu, c th:
o i ca hm phi l tham chiu (v d int &p);
o Cc thao tc lin quan n i ny phi thc hin ti ni n tr n, tc a ch
cn thao tc. V mt thao tc trn bin tham chiu thc cht l thao tc trn bin
c n tham chiu nn trong hm ch cn vit p trong mi thao tc (thay v *p
nh trong con tr);
o Li gi hm phi chuyn a ch cho p. V bn thn p khi tham chiu n bin
no th s cha a ch ca bin , do li gi hm ch cn ghi tn bin, v d x
(thay v &x nh i vi dn tr).
Tm li, i vi hm vit theo tham chiu ch thay i i (l cc tham chiu) cn li
mi ni khc u vit n gin nh cch vit truyn theo tham tr.
V d: i gi tr 2 bin
void doi_cho(int &x, int &y)
{
int t ;
t = x;
x = y;
y = t;
}

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


int a = 5, b = 3;
doi_cho(a, b);
printf(%d, %d,a,b);

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

Tham tr Tham chiu Dn tr

Khai bo void doi_cho(int void doi_cho(int void doi_cho(int


i x, int y) &x,int &y) *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 doi_cho(a,b) doi_cho(a,b) doi_cho(&a,&b)

Tc dng a,b khng thay i a,b c thay i a,b c thay i

Bng 4.1 - So snh cc cch truyn tham s

6. Hm v mng
1. 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.
o 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[ ];

o 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 (tham s thc) s c vit vo danh sch tham i thc


s, v a l a ch ca phn t u tin ca mng a, nn khi hm c gi a ch ny s
gn cho con tr p. V vy gi tr ca phn t th i ca a c th c truy cp bi x[i]
(theo khai bo 1) hoc *(p+i) (theo khai bo 2) v n cng c th c thay i thc s
(do y cng l cch truyn theo dn tr). Sau y l v d n gin, nhp v in vect,
minh ho cho c 2 kiu khai bo i.
V d: Hm nhp v in gi tr 1 vect
#include <stdio.h>
#include <conio.h>
void nhap(int x[ ], int n) // n: s phn t
{
int i;
for (i=0; i<n; i++)
scanf(%d,&x[i]);
}
void in(int *p, int n)
{
int i;
for (i=0; i<n; i++)

116
printf(%d, *(p+i));
}
int main()
{
int a[10] ; // mng a cha ti a 10 phn t
nhap(a,7); // vo 7 phn t u tin cho a
in(a,7); // ra 3 phn t u tin ca a
getch();
return 0;
}
2. Truyn mng 2 chiu cho hm

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


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

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


(tham s thc) c vit bnh thng trong li gi hm. Ni chung theo cch khai bo
ny vic truy nhp l n gin nhng phng php cng c hn ch l s ct ca
mng truyn cho hm phi c nh bng n.
V d: Tnh tng cc s hng trong ma trn
#include <stdio.h>
#include <conio.h>
float tong(float x[][10], int m, int n)
{
float t = 0;
int i, j ;
for (i=0; i<m; i++)
for (j=0; j<n; j++) t += x[i][j] ;
return t;
}
int main()
{
float a[8][10], b[8][10] ;
int i, j, ma, na, mb, nb;
printf("nhap so dong, so cot ma tran a: ");
scanf("%d%d",&ma,&na);
for (i=0; i<ma; i++)
for (j=0; j<na; j++)
{
printf("a[%d,%d]= ",i,j);
scanf("%f",&a[i][j]);
}
printf("nhap so dong, so cot ma tran b: ");
scanf("%d%d",&mb,&nb);

117
for (i=0; i<mb; i++)
for (j=0; j<nb; j++)
{
printf("a[%d,%d]= ",i,j);
scanf("%f",&b[i][j]);
}
printf("%f\n",tong(a, ma, na));
printf("%f\n",tong(b, mb, nb));
getch();
return 0;
}

b. Xem mng float x[m][n] thc s l mng mt chiu float x[m*n]


Khi s dng cch khai bo nh trong mng mt chiu, l s dng con tr float *p
truy cp c n tng phn t ca mng. Cch ny c hn ch trong li gi: a ch
truyn cho hm khng phi l mng a m cn phi p kiu v (float*) ( ph hp vi p).
Vi cch ny gi k l th t ca phn t a[i][j] trong mng mt chiu (m*n), ta c quan
h gia k, i, j nh sau: k = *(p + i*n + j) , i = k/n v j = k%n trong n l s ct ca
mng truyn cho hm. iu ny c ngha truy cp n a[i][j] ta c th vit *(p+i*n+j),
ngc li bit ch s k c th tnh c dng i, ct j ca phn t ny. u im ca cch
khai bo ny l ta c th truyn mng vi kch thc bt k (s ct khng cn nh trc)
cho hm.
V d: Tm phn t b nht ca ma trn
#include <stdio.h>
#include <conio.h>
void minmt(float *x, int m, int n)
{
float min = *x;
int k, kmin;
for (k=1; k<m*n; k++)
if (min > x[k])
{
min = x[k];
kmin = k;
}
printf("Gia tri min la: %f , tai dong %d, cot %d\n",min,kmin/n,kmin%n);
}
int main()
{
float a[3][3];
int i, j ;
for (i=0; i<3; i++)
for (j=0; j<3; j++)
{
printf("a[%d,%d]",i,j);
scanf("%f",&a[i][j]);
}
minmt((float*)(a), 3, 3) ;
getch();
return 0;
}

118
3. Gi tr tr li ca hm l mng

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


cng chnh l mt con tr, v vy vic hm tr li mt con tr tr n dy d liu kt qu
l tng ng vi vic tr li mng. Ngoi ra cn mt cch d dng hn i vi mng 2
chiu l mng kt qu c tr li vo trong tham i ca hm (ging nh nghim ca
phng trnh bc 2 c tr li vo trong cc tham i). y chng ta s ln lt xt 2
cch lm vic ny.
Gi tr tr li l con tr tr n mng kt qu
Trc ht chng ta xt v d sau y:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int* day1()
{
int kq[3] = { 7, 5, 3 };
return kq;
}
int* day2()
{
int *kq;
kq=(int*)malloc(3*sizeof(int));
*kq = *(kq+1) = *(kq+2) = 0 ;
return kq ;
}
int main()
{
int *a, i;
a = day1();
for (i=0; i<3; i++)
printf("%d\n",*(a+i));
a = day2();
for (i=0; i<3; i++)
printf("%d\n",*(a+i));
getch();
return 0;
}

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


li a ch mng ny cho con tr kt qu hm. Tuy nhin, ch c day2() l cho li kt qu
ng. Ti sao ?
o Xt mng kq c khai bo v khi to trong day1(), y l mt mng cc b
(c to bn trong hm) nh sau ny chng ta s thy, cc loi bin "tm thi"
ny (v c cc tham i) ch tn ti trong qu trnh hm hot ng. Khi hm kt
thc cc bin ny s mt i. Do vy tuy hm tr li a ch ca kq trc khi n
kt thc, th nhng sau khi hm thc hin xong, ton b kq s c xo khi b
nh v v vy con tr kt qu hm tr n vng nh khng cn cc gi tr nh
kq c. T iu ny vic s dng hm tr li con tr l phi ht sc cn thn.
Mun tr li con tr cho hm th con tr ny phi tr n dy d liu no sao cho
n khng mt i sau khi hm kt thc, hay ni khc hn phi l nhng dy d

119
liu c khi to bn ngoi hm hoc c th s dng theo phng php trong
hm dayi2().
o Trong day2() 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 day2() l
chnh xc.
Mng cn tr li c khai bo nh mt tham i trong danh sch i ca hm
Tham i ny l mt con tr nn hin nhin khi truyn mng khai bo sn ( cha kt
qu) t ngoi vo cho hm th mng s thc s nhn c ni dung kt qu (tc c thay
i trc v sau khi gi hm xem mc truyn tham i thc s theo dn tr). nm
c vn ny chng ta xt v d sau.
V d: Cng 2 vect, vect kt qu tr li trong tham i ca hm. So vi v d trc gi
tr tr li l void (khng tr li gi tr) cn danh sch i c thm con tr z cha kt
qu.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void congvt(int *x, int *y, int *z, int n)
{
for (int i=0; i<n; i++) z[i] = x[i] + y[i];
}
main()
{
int i, n, a[10], b[10], c[10] ;
printf("Nhap vao so phan tu: ");
scanf("%d",&n);
for (i=0; i<n; i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
for (i=0; i<n; i++)
{
printf("b[%d]=",i);
scanf("%d",&b[i]);
}
congvt(a, b, c, n);
for (i=0; i<n; i++)
{
printf("c[%d]=%d\n",i,c[i]);
}
getch();
return 0;
}
4. i v gi tr tr li ca hm l xu k t
Ging cc trng hp xt vi mng 1 chiu, i ca cc hm xu k t c th khai bo
di 2 dng: mng k t hoc con tr k t. Gi tr tr li lun lun l con tr k t. Ngoi
ra hm cng c th tr li gi tr vo trong cc i con tr trong danh sch i.

120
V d sau y dng tch h, tn ca mt xu h v tn. V d gm 3 hm. Hm h tr
li xu h (con tr k t) vi i l xu h v tn c khai bo dng mng. Hm tn tr
li xu tn (con tr k t) vi i l xu h v tn c khai bo dng con tr k t. Thc
cht i h v tn trong hai hm h, tn c th c khai bo theo cng cch thc, y
chng trnh mun minh ho cc cch khai bo i khc nhau ( cp n trong phn
i mng 1 chiu). Hm th ba cng tr li h, tn nhng cho vo trong danh sch tham
i, do vy hm khng tr li gi tr (void). n gin ta qui c xu h v tn khng
cha cc du cch u v cui xu, trong h l dy k t t u cho n khi gp du
cch u tin v tn l dy k t t sau du cch cui cng n k t cui xu.
V d:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
char* ho(char hoten[])
{
char* kq;
int i=0;
while (hoten[i] != 32) i++;
kq=(char*)malloc(i*sizeof(char));
strncpy(kq, hoten, i) ;
return kq;
}
char* ten(char* hoten)
{
char* kq = new char[10];
int i=strlen(hoten);
while (hoten[i] != 32) i--;
kq=hoten+i+1;
return kq;
}
void tachht(char* hoten, char* ho, char* ten)
{
int i=0;
while (hoten[i] != '\40') i++;
strncpy(ho, hoten, i) ;
i=strlen(hoten);
while (hoten[i] != '\40') i--;
strncpy(ten, hoten+i+1, strlen(hoten)-i-1) ;
}
int main()
{
char ht[30], *h, *t ;
printf("Ho va tan = ");
gets(ht);
h = ho(ht); t = ten(ht);
printf("Ho:%s, Ten:%s.\n",h,t);
tachht(ht, h, t);
printf("Ho:%s, Ten:%s.\n",h,t);
getch();
return 0;

121
}
5. i l hng con tr

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

Trong v d trn, nu strupr(t) bng strupr(s) th chng trnh s thng bo li v s c


nh ngha l hng con tr trong khi hm strupr() li lm thay i gi tr ca n, v iu
ny l khng th.

III. Con tr hm
- Mc d mt hm khng phi l mt bin nhng n vn chim v tr trong b nh v ta c
th gn vo v tr ca n cho mt loi bin con tr. Con tr ny tr n im xm nhp
vo hm. Ta gi y l con tr hm. Con tr hm c th s dng thay cho tn hm v vic
s dng con tr cho php cc hm cng c truyn nh l tham s cho cc hm khc.
hiu c cc con tr hm lm vic nh th no, ta cn hiu mt cht v cch bin
dch v gi mt hm. Khi bin dch hm, trnh bin dch chuyn chng trnh ngun sang
dng m my v thit lp mt im xm nhp vo hm (chnh l v tr ch th m my u
tin ca hm). Khi c li gi thc hin hm, my tnh s thc hin mt ch th call chuyn
iu khin n im xm nhp ny. Trong trng hp gi hm bng tn hm th im
xm nhp ny l tr tc thi (gn nh l mt hng v khng cha bin no c), cch gi
hm ny gi l cch gi hm trc tip. Tri li, khi gi hm gin tip thng qua mt bin
tr th bin tr phi tr ti ch th m my u tin ca hm . Cch gi hm thng
qua bin tr hm gi l cch gi hm gin tip.

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

1. Khai bo
C php
<kiu gi tr> (*tn bin hm)(d/s tham i);
<kiu gi tr> (*tn bin hm)(d/s tham i) = <tn hm>;

- Ta thy cch khai bo con tr hm cng tng t khai bo con tr bin (ch cn t du *
trc tn), ngoi ra cn phi bao *tn hm gia cp du ngoc (). V d:
float (*f)(int); // khai bo con tr hm c tn l f tr n hm
// c mt tham i kiu int v cho gi tr kiu float.
void (*f)(float, int); // con tr tr n hm vi cp i (float, int).

- hoc phc tp hn:


char* (*m[10])(int, char) // khai bo mt mng 10 con tr hm tr n
// cc hm c cp tham i (int, char), gi tr tr
// li ca cc hm ny l xu k t.

- Ch : phn bit gia 2 khai bo: float (*f)(int) v float *f(int). Cch khai bo trc l
khai bo con tr hm c tn l f. Cch khai bo sau c th vit li thnh float* f(int) l
khai bo hm f vi gi tr tr li l mt con tr float.

2. S dng con tr hm
- Con tr hm thay tn hm
- s dng con tr hm ta phi gn n vi tn hm c th v sau bt k ni no c
php xut hin tn hm th ta u c th thay n bng tn con tr. V d nh cc thao tc
gi hm, a hm vo lm tham i hnh thc cho mt hm khc Sau y l cc v d
minh ho.
- V d 4.16: Dng tn con tr gi hm
#include <stdio.h>
#include <conio.h>
float bphuong(float x)
{
return x*x;
}
int main()
{
float (*f)(float);
f = bphuong;
printf("Binh phuong cua 3.5 = :%f",f(3.5));
getch();
return 0;
}

- Con tr hm lm tham i
- V d 4.17: Tham i ca hm ngoi cc kiu d liu bit cn c th l mt hm. iu

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

3. Mng con tr hm
- Tng t nh bin bnh thng cc con tr hm ging nhau c th c gp li vo trong
mt mng, trong khai bo ta ch cn thm [n] vo sau tn mng vi n l s lng ti a
cc con tr; v d sau minh ho cch s dng ny. Dng mng con tr lp bng gi tr
cho cc hm : x*x, sin(x), cos(x), exp(x) v sqrt(x). Bin x chay t 1.0 n 10.0 theo
bc 0.5
- V d 4.18:
#include <stdio.h>
#include <conio.h>
#include <math.h>
double bp(double x)
{
return x*x;
}

124
int main()
{
int i,j;
double x=1.0;
double (*f[6])(double);
f[1]=bp; // hm bnh phng xy dng trn
f[2]=sin; // hm sin trong math.h
f[3]=cos; // hm cos trong math.h
f[4]=exp; // hm exp (e m) trong math.h
f[5]=sqrt; // hm sqrt (cn bc 2( trong math.h
while (x<=10.0) // Lp bng
{
printf("\n");
for (j=1;j<=5;++j)
printf("%10.2f ",f[j](x));
x+=0.5;
}
getch();
return 0;
}

IV. qui
1. Khi nim
- Mt hm c gi l quy nu bn trong thn hm c lnh gi n chnh n. Khi hm
gi qui n chnh n, th mi ln gi my s to ra mt tp cc bin cc b mi hon
ton c lp vi tp cc bin cc b c to ra trong cc ln gi trc.
minh ho chi tit nhng iu trn, ta xt mt v d v tnh giai tha ca s nguyn
dng n. Theo nh ngha giai tha ca mt s nguyn n c k hiu l n! v c tnh
nh sau:
- n!=1* 2 * 3 ** (n-1) *n = (n-1)! *n (vi 0!=1)
- Nh vy, tnh n! ta thy nu n=0 th n!=1 ngc li th n!=n * (n-1)!
- V d 4.19: minh ho chi tit nhng iu trn, ta xt mt v d v tnh giai tha ca s
nguyn dng n. Khi khng dng phng php qui hm c th c vit nh sau :
long int gt1(int n) /* Tnh n! v?i n>=0*/
{
long int gtphu=1;
int i;
for (i=1;i<=n;++i)
gtphu*=i;
return gtphu;
}

- Hm tnh n! theo phng php qui c th c vit nh sau :


long int gt2(int n)
{
if (n==0 || n==1)
return 1;
else
return(n*gt2(n-1));

125
}

- V li gi hm gt t chng trnh chnh c thc hin nh sau:


int main()
{
//printf("\n 3!=%d",gt1(3));
printf("\n 3!=%d",gt2(3));
getch();
return 0;
}

- Ln gi u tin ti hm gt2 c thc hin t hm main(). My s to ra mt tp cc


bin t ng ca hm gt2. Tp ny ch gm cc i n. Ta gi i n c to ra ln th
nht l n th nht. Gi tr ca tham s thc ( s 3 ) c gn cho n th nht. Lc ny bin
n trong thn hm c xem l n th nht. Do n th nht c gi tr bng 3 nn iu kin
trong ton t if l sai v do my s la chn cu lnh else. Theo cu lnh ny, my s
tnh gi tr biu thc: n*gt2(n-1) (*). tnh biu thc trn, my cn gi chnh hm gt2
v th ln gi th hai s thc hin. My s to ra i n mi, ta gi l n th hai. Gi tr
ca n-1 y li l i ca hm , c truyn cho hm v hiu l n th hai, do vy n th
hai c gi tr l 2. By gi, do n th hai vn cha tho mn iu kin if nn my li tip
tc tnh biu thc : n*gt2(n-1) (**). Biu thc trn li gi hm gt2 ln th ba. My li to
ra i n ln th ba v y n th ba c gi tr bng 1. i n=1 th ba li c truyn cho
hm, lc ny iu kin trong lnh if c tho mn, my i thc hin cu lnh: return
1=gt2(1) (***). Bt u t y, my s thc hin ba ln ra khi hm gt2. Ln ra khi hm
th nht ng vi ln vo th ba. Kt qu l i n th ba c gii phng, hm gt2(1) cho
gi tr l 1 v my tr v xt gi tr biu thc
n*gt2(1) y l kt qu ca (**) y, n l n th hai v c gi tr bng 2. Theo cu lnh
return, my s thc hin ln ra khi hm ln th hai, i n th hai s c gii phng, kt
qu l biu thc trong (**) c gi tr l 2.1. Sau my tr v biu thc (*) lc ny l:
n*gt2(2)=n*2*1 n li hiu l th nht, n c gi tr bng 3, do vy gi tr ca biu thc
trong (*) l 3.2.1=6. Chnh gi tr ny c s dng trong cu lnh printf ca hm main()
nn kt qu in ra trn mn hnh l: 3!=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.
- Hm qui so vi hm c th dng vng lp th n gin hn, tuy nhin vi my tnh khi
dng hm qui s dng nhiu b nh trn ngn xp v c th dn n trn ngn xp. V
vy khi gp mt bi ton m c th c cch gii lp ( khng dng qui ) th ta nn dng
cch lp ny. Song vn tn ti nhng bi ton ch c th gii bng qui.

2. Lp cc bi ton gii c bng qui


- Phng php qui thng c dng gii cc bi ton c c im:
- Gii quyt c d dng trong cc trng hp ring gi l trng hp suy bin hay c

126
s, trong trng hp ny hm c tnh bnh thng m khng cn gi li chnh n;
- i vi trng hp tng qut, bi ton c th gii c bng bi ton cng dng nhng
vi tham i khc c kch thc nh hn tham i ban u. V sau mt s bc hu hn
bin i cng dng, bi ton a c v trng hp suy bin.
- Nh vy trong trng hp tnh n! nu n = 0 hm cho ngay gi tr 1 m khng cn phi
gi li chnh n, y chnh l trng hp suy bin. Trng hp n > 0 hm s gi li chnh
n nhng vi n gim 1 n v. Vic gi ny c lp li cho n khi n = 0.
- Mt lp rt rng ca bi ton dng ny l cc bi ton c th nh ngha c di dng
qui nh cc bi ton lp vi s bc hu hn bit trc, cc bi ton UCLN, thp H
Ni, ...
- Cu trc chung ca hm qui
- Dng thc chung ca mt chng trnh qui thng nh sau:
if (trng hp suy bin)
{
trnh by cch gii // gi nh c cch gii
}
else // trng hp tng qut
{
gi li hm vi tham i "b" hn
}

3. Cc v d
- Bi ton tm c s chung ln nht (UCLN): Cho hai s nguyna v b, tm USCLN ca
hai s theo gii thut qui. Bi ton c th c nh ngha di dng qui nh sau:
- Nu b = 0 th UCLN = a;
- Nu b<>0 th UCLN(a, b) = UCLN(b, a mod b).
- T ta c hm qui tnh UCLN ca a v b nh sau.
- V d 4.20:
int USCLN(int a, int b)
{
if (b==0)
return a;
else
return USCLN(b,a%b);
}

- S Fibinaci: Tnh s hng th n ca dy Fibonaci vi gii thut qui. Dy Fibonaci


c nh ngha nh sau:
- f(0) = f(1) = 1;
- f(n) = f(n-1) + f(n-2) vi n >=2.
V d 4.21:
long Fib(int n)
{
long kq;

127
if (n==0 || n==1) kq = 1;
else kq = Fib(n-1) + Fib(n-2);
return kq;
}

- Bi ton thp H ni: C n a vi kch thc to, nh khc nhau. Ban u sp xp cc a


theo trt t kch thc vo mt cc sao cho a nh nht nm trn cng, tc l to ra mt
dng hnh nn. Ngi chi phi di chuyn ton b s a sang mt cc khc, tun theo
cc quy tc sau:
- Mt ln ch c di chuyn mt a;
- Mt a ch c th c t ln mt a ln hn (khng nht thit hai a ny phi c
kch thc lin k, tc l a nh nht c th nm trn a ln nht).
- Hnh nh m t bi ton c cho nh hnh 4.2.

Hnh 4.2 - Bi ton thp Hanoi


- M t bi ton:
- t tn cc cc l A, B, C v qui c A l Cc Ngun, B l Cc ch v C l Cc Trung
Gian;
- Gi n l tng s a;
- nh s a t 1 (nh nht, trn cng) n n (ln nht, di cng).
- Thut gii qui: chuyn n a t cc A sang cc B vi C l cc trung gian:
1. Chuyn n-1 a t A sang C. Ch cn li a #n trn cc A;
2. Chuyn a #n t A sang B;
3. Chuyn n-1 a t C sang B cho chng nm trn a #n
- V d 4.22:
#include <stdio.h>
#include <conio.h>
void chuyen(int sodia, char CotNguon, char CotDich, char CotTG)
{
if (sodia>0)
{
chuyen(sodia-1, CotNguon, CotTG, CotDich);
printf(" Chuyen dia %d Tu %c -> %c\n",sodia,CotNguon,CotDich);
chuyen(sodia-1, CotTG, CotDich, CotNguon);
}
}
int main()
{
char CotNguon,CotDich,CotTG;

128
int n;
printf("\n Hay nhap so dia: ");
scanf("%d",&n);
chuyen(n,'A','B','C');
getch();
}

- Kt qu thc hin v d 4.22 c cho nh hnh 4.3.

-
Hnh 4.3 - Kt qu thc hin bi ton thp H ni vi n=4

V. Tm tt ni dung bi hc
I. T chc chng trnh
1. V d
2. Cu trc chng trnh
3. Hm xy dng sn
II. Hm do ngi dng nh ngha
1. Khai bo v nh ngha Hm
2. Li gi Hm
3. Hm vi i mc nh
4. Khai bo hm trng tn
5. Truyn tham s
6. Hm v mng
III. Con tr hm
1. Khai bo
2. S dng con tr hm
3. Mng con tr hm
IV. qui
1. Khi nim
2. Lp cc bi ton gii c bng qui
3. Cc v d
V. Tm tt ni dung bi hc
VI. Bi tp

129
VI. Bi tp
Xem Bi 13 - Bi tp thc hnh HM

130
Bi 13 - Bi thc hnh: HM V CU TRC CHNG TRNH
I. Bi tp lm theo yu cu
1. Xc nh v tr tng i ca 1 im vi tam gic ABC

Yu cu: Vit chng trnh cho php nhp vo ta trn mt phng XOY ba nh ca
tam gic ABC, v ta ca im M; a ra kt lun v v tr tng i ca M so vi
ABC : M nm trong, trn cnh hay nm ngoi ABC.

Son tho vn bn chng trnh nh sau

#include <stdio.h>
#include <conio.h>
#include <math.h>
double KC(int x1, int y1, int x2, int y2);
double DT(double a, double b, double c);
int main()
{
int xa,ya, xb,yb, xc,yc, xm,ym;
double ab, bc, ac, am, bm, cm;
double abc, amb, bmc, amc;
printf("Nhap toa do diem A(x,y):");
scanf("%d%d", &xa, &ya);
printf("Nhap toa do diem B(x,y):");
scanf("%d%d", &xb, &yb);
printf("Nhap toa do diem C(x,y):");
scanf("%d%d", &xc, &yc);
printf("Nhap toa do diem M(x,y):");
scanf("%d%d", &xm, &ym);
ab=KC(xa,ya,xb,yb);
bc=KC(xb,yb,xc,yc);
ac=KC(xa,ya,xc,yc);
am=KC(xa,ya,xm,ym);
bm=KC(xb,yb,xm,ym);
cm=KC(xc,yc,xm,ym);
abc=DT(ab, bc, ac);
amb=DT(am, bm, ab);
bmc=DT(bm, cm, bc);
amc=DT(am, cm, ac);
if ((amb==0)||(bmc==0)||(amc==0))
{
printf("M nam tren canh cua ABC");
}
else
{
if ((amb+bmc+amc)==abc)
{

131
printf("M nam trong tam giac ABC");
}
else
{
printf("M nam ngoai tam giac ABC");
}
}
getch();
return 0;
}
double KC(int x1, int y1, int x2, int y2)
{
double kq;
kq=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
return kq;
}
double DT(double a, double b, double c)
{
double kq, p;
p=(double)(a+b+c)/2;
kq=sqrt(p*(p-a)*(p-b)*(p-c));
return kq;
}

Th nghim 1: Nhn F9 chy chng trnh, sau nhp vo ta cho cc nh ca


tam gic ABC ln lt l A(x,y): 0,0 ; B(x,y): 10,0; C(x,y): 0, 10; v ta ca im M
l M(x,y): 1,1. Nhn xt v kt qu t c.

Th nghim 2: Vi d liu vo A(x,y): 0,0 ; B(x,y): 10,0; C(x,y): 0, 10; M(x,y): 1,1 s
dng chc nng debug ca cng c lp trnh (Dev-C++) v ghi li gi tr ca cc bin
abc, amb, bmc v amc. Xem li kt lun ca chng trnh v a ra gii php khc
phc.

Th nghim 3: Xy dng hm tnh bnh phng ca 1 s v s dng vo chng trnh


thay cho hm sqrt() sn c.

2. Vit hm m s t ca mt xu k t

Yu cu: Vit chng trnh cho php nhp vo mt xu k t, m s t c trong xu. T


c hiu l mt on k t nm gia hai du trng v khc trng.

Son tho vn bn chng trnh nh sau

#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <string.h>
int wordCount(char *s);
int main()

132
{
char s[100];
printf("Nhap vao mot xau:");
gets(s);
printf("So tu: %d", wordCount(s));
getch();
return 0;
}
int wordCount(char *s)
{
int kq,i;
kq=0;
i=0;
while (s[i]!='\0')
{
if (s[i]==32)
{
kq=kq+1;
}
i++;
}
kq++;
return kq;
}

Th nghim 1: Nhn F9 chy chng trnh, nhp vo xu k t ky thuat lap trinh


nhn xt v kt qu t c.

Th nghim 2: Nhp vo xu k t ky thuat lap trinh (c mt k t trng cui) nhn


xt v kt qu t c.

Th nghim 3: Nhp vo xu k t ky thuat lap trinh (c 1 k t trng u, 3 k


t trng gia ky v thuat, 1 k t trng cui) nhn xt v kt qu t c.

II. Bi tp t lm
1. Vit 1 hm cho php nhp vo s nguyn, 1 hm cho php nhp vo s thc.
2. Vit chng trnh cho php nhp vo ta trn mt phng XOY ba nh ca tam gic
ABC, v ta ca im M; a ra kt lun v v tr tng i ca M so vi ABC : M
nm trong, trn cnh hay nm ngoi ABC.
3. Cho tam gic ABC v mt im M khng nm trn cnh ca tam gic. Hy vit chng
trnh tnh s ln nht R sao cho vng trn tm M, bn knh R, khng ct bt c cnh no
v khng cha tam gic.
4. Vit hm chun ha chui h tn ngi Vit theo yu cu sau: Khng c k t trng pha
u v cui, gia 2 t c mt k t trng, k t u tin ca mi t c vit HOA v k
t khc c vit thng.
5. Gi s hovaten l xu h tn ngi vit, vit cc hm TEN cho php ly ra phn tn, hm
HODEM cho php ly ra phn h v m ca hovaten.

133
6. Vit hm m s t ca mt xu k t. Mi t c hiu l on k t gia hai du trng
v khng phi l khong trng.
7. Vit hm chuyn s nguyn thnh xu k t biu din cch c s . V d nhp vo s:
235 -> in ra Hai tram ba muoi lam, 807 -> in ra Tam tram linh bay, 55 -> in ra Nam
muoi lam.
8. Xu k t biu din ngy thng l xu dng DD/MM/YYY, trong DD l hai ch s
biu din ngy, MM l hai ch s biu din thng v YYYY l bn ch s biu din
nm. Vit hm kim tra mt xu k t nhp vo c phi l xu biu din ngy thng hay
khng? Nu l xu biu din ngy thng th ngy thng c hp l hay khng. V d
xu 30/02/2010 l xu biu din ngy thng nhng ngy thng l khng hp l (v
khng c ngy 30 thng 2).
9. Cho hai xu biu din ngy thng sd1 v sd2, vit hm tnh s ngy tnh t sd1 n sd2
nu sd1 v sd2 l hai xu biu din ngy thng hp l (tham kho bi 6).
10. Cho sd1 l xu biu din ngy thng, n l mt s nguyn. Vit hm NgaySauN(sd1,n)
cho php tr v xu k t dng ngy thng l ngy th n sau ngy sd1, v d sd1 =
27/01/2010 v n= 15 th hm tr v 11/02/2010. Vit hm NgayTruocN(sd1,n) cho
php tr v xu k t dng ngy thng l ngy th n trc ngy sd1, v d sd1 =
27/01/2010 v n= 46 th hm tr v 12/12/2009.
11. Vit hm cho php i nm dng lch thnh nm m lch. V d nu nm dng lch l
2010 th nm m lch l Canh Dn.
12. Ta gi tng trit cc ch s ca s t nhin n l tng cc ch s ca n nu tng ny
ch c mt ch s; trong trng hp ngc li tng trit l kt qu ca vic cng dn
lin tip cho n khi ch cn mt ch s. V d s n=1186 c tng cc ch s l 16, s
ny c hai ch s v tng cc ch s ca n l 7. Vy tng trit ca n=1186 l 7.
Nhp t bn phm mt s k, 1 k 9, vit ra mn hnh tt c cc s c 4 ch s m
tng trit ca n bng k (khng k cc hon v).
13. Mt sn hnh ch nht c chia thnh mn vung c kch thc bng nhau, vi m v
n 50. Mi c th c chn mt qu mn. Nu n mt qu mn (i,j), tc l hng
i v ct j, th n s gy n cho cc xung quanh (i+1,j), (i-1,j), (i,j+1), (i,j-1) nu cc
ny c mn. Hy nhp vo v tr cc c mn v v tr u tin b n v in ra ti a cc
b n trn sn ch nht.
14. Cho mt dy c n+1 c nh s t 0 n n. Mt qun c ng s 0. Mi mt
nc i qun c c i ln pha trc khng qu k . Mt cch i ca qun c l xut
pht t s 0 qun c phi i n th n. Vi hai s nguyn dng n v k, hy tnh s
cch i ca qun c. V d, vi n=3 v k=2 s c 3 cch i qun c vi cc nc 1+1+1,
1+2 v 2+1. (Bi 1, thi Olympic Tin hc Sinh vin i hc Tng hp H ni m
rng, Khi khng chuyn, H ni 4-1996).
15. Vit ra tt c cc hon v ca dy Xn={1,2,...,n} c n phn t l cc s 1,2 ,..., n.
16. T hp chp k t n, k hiu l Cnk. Vit chng trnh tnh Cnk bit rng:
Cnk= Cn-1 k-1+ Cn-1k v
Cn0 = Cnn = Ckk= 1.

134
Bi 14 - CU TRC D LIU DO NGI DNG T NH
NGHA
Ni dung bi hc
I. Cu trc d liu do ngi dng t nh ngha
1 Khi nim
2. Khai bo bin cu trc
3. Cc thao tc trn bin kiu cu trc
4. Con tr cu trc
II. Kiu ngn xp
1. Khi nim
2. Cc thao tc c bn
3. Ci t
4. ng dng
III. Kiu hng i
1. Khi nim
2. Cc thao tc c bn
3. Ci t
4. ng dng
IV. Tm tt ni dung bi hc
V. Bi tp

I. Cu trc d liu do ngi dng t nh ngha


1 Khi nim
Vn : Lm th no m t mt SINH VIN vi cc thng tin:
- M s sinh vin;
- H tn;
- Ngy thng nm sinh;
- Gii tnh;
- a ch thng tr
Hoc lm th no m t NGY THNG bao gm cc thng tin:
- Ngy;
- Thng;
- Nm
=> Hu ht cc ngn ng lp trnh trong c C/C++ cho php ngi lp trnh t nh
ngha ra cu trc mi theo nhu cu s dng t nhng kiu d liu c hoc nh
ngha trc .
Kiu cu trc (Structure) l kiu d liu bao gm nhiu thnh phn c kiu khc nhau,
mi thnh phn c gi l mt trng (field).
S khc bit gia kiu cu trc v kiu mng l: cc phn t ca mng l cng kiu cn
cc phn t ca kiu cu trc c th c kiu khc nhau. Hnh nh sau l ca kiu cu trc
vi 7 trng
1 2 3 4 5 6 7

135
cn kiu mng c dng:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
C php 1:
struct <Tn cu trc>
{
<Kiu> <Tn trng 1> ;
<Kiu> <Tn trng 2> ;
..
<Kiu> <Tn trng n> ;
};
C php 2:
typedef struct
{
<Kiu> <Tn trng 1> ;
<Kiu> <Tn trng 2> ;
..
<Kiu> <Tn trng n> ;
} <Tn cu trc>;
Trong :
- <Tn cu trc>: l mt tn c t theo quy tc t tn ca danh biu; tn ny
mang ngha s l tn kiu cu trc;
- <Kiu> <Trng i> (i=1..n): mi trng trong cu trc c d liu thuc kiu g
(tn ca trng phi l mt tn c t theo quy tc t tn ca danh biu).
V d 1: qun l ngy, thng, nm ca mt ngy trong nm ta c th khai bo kiu cu
trc gm 3 thng tin: ngy, thng, nm.
struct KieuNgayThang
{
unsigned char Ngay;
unsigned char Thang;
unsigned int Nam;
};
typedef struct
{
unsigned char Ngay;
unsigned char Thang;
unsigned int Nam;
} KieuNgayThang;

136
V d 2: Mi sinh vin cn c qun l bi cc thng tin: M s sinh vin, h tn, ngy
thng nm sinh, gii tnh, a ch thng tr. Lc ny ta c th khai bo mt struct gm
cc thng tin trn.
struct KieuSinhVien
{
char MSSV[10];
char HoTen[40];
struct KieuNgayThang NgaySinh;
int Phai;
char DiaChi[40];
};

typedef struct
{
char MSSV[10];
char HoTen[40];
KieuNgayThang NgaySinh;
int Phai;
char DiaChi[40];
} KieuSinhVien;

o Mi thnh phn ging l mt bin ring thuc cu trc, n gm kiu v tn thnh


phn. Mt thnh phn cng cn c gi l trng.
o Phn tn ca kiu cu trc v phn danh sch bin c th c hoc khng. Tuy
nhin trong khai bo k t kt thc cui cng phi l du chm phy (;).
o Cc kiu cu trc c php khai bo lng nhau, ngha l mt thnh phn ca
kiu cu trc c th li l mt trng c kiu cu trc.
o Mt bin c kiu cu trc s c cp pht b nh sao cho cc thc hin ca n
c sp lin tc theo th t xut hin trong khai bo.

2. Khai bo bin cu trc


Vic khai bo bin cu trc cng tng t nh khai bo bin thuc kiu d liu chun.
C php:
- i vi cu trc c nh ngha theo cch 1:
struct <Tn cu trc> <Bin 1> [, <Bin 2>];
- i vi cc cu trc c nh ngha theo cch 2:
<Tn cu trc> <Bin 1> [, <Bin 2>];
V d: Khai bo bin NgaySinh c kiu cu trc KieuNgayThang; bin SV c kiu cu
trc KieuSinhVien.
struct KieuNgayThang NgaySinh;
struct KieuSinhVien SV;
KieuNgayThang NgaySinh;
KieuSinhVien SV;

137
3. Cc thao tc trn bin kiu cu trc
Truy xut n tng trng ca bin cu trc
C php:
<Bin cu trc>.<Tn trng>;
Khi s dng cch truy xut theo kiu ny, cc thao tc trn <Bin cu trc>.<Tn
trng> ging nh cc thao tc trn cc bin ca kiu d liu ca <Tn trng>.
V d1: Vit chng trnh cho php c d liu t bn phm cho bin mu tin SinhVien
v in bin mu tin ln mn hnh:
#include<conio.h>
#include<stdio.h>
#include<string.h>
typedef struct
{
unsigned char Ngay;
unsigned char Thang;
unsigned int Nam;
} KieuNgayThang;
typedef struct
{
char MSSV[10];
char HoTen[40];
KieuNgayThang NgaySinh;
int Phai;
char DiaChi[40];
} KieuSinhVien;
/* Hm in ln mn hnh 1 m?u tin SinhVien*/

void InSV(KieuSinhVien s)
{
printf(MSSV: | Ho va ten | Ngay Sinh | Dia chi\n);
printf(%s | %s | %d-%d-%d | %s\n,s.MSSV,s.HoTen,
s.NgaySinh.Ngay,s.NgaySinh.Thang,s.NgaySinh.Nam,s.DiaChi);
}
int main()
{
KieuSinhVien SV, s;
printf(Nhap MSSV: );gets(SV.MSSV);
printf(Nhap Ho va ten: );gets(SV.HoTen);
printf(Sinh ngay: );scanf(%d,&SV.NgaySinh.Ngay);
printf(Thang: );scanf(%d,&SV.NgaySinh.Thang);
printf(Nam: );scanf(%d,&SV.NgaySinh.Nam);
printf(Gioi tinh (0: Nu), (1: Nam): );scanf(%d,&SV.Phai);
fflush(stdin);
printf(Dia chi: );gets(SV.DiaChi);
InSV(SV);
s=SV;
InSV(s);
getch();
return 0;

138
}
Lu :
- Cc bin cu trc c th gn cho nhau. Thc cht y l thao tc trn ton b
cu trc khng phi trn mt trng ring r no. Chng trnh trn dng
s=SV l mt v d;
- Vi cc bin kiu cu trc ta khng th thc hin c cc thao tc sau y:
S dng cc hm xut nhp trn bin cu trc;
Cc php ton quan h, cc php ton s hc v logic.
V d 2: Nhp vo hai s phc v tnh tng ca chng. Ta bit rng s phc l mt cp
(a,b) trong a, b l cc s thc, a gi l phn thc, b l phn o. (i khi ngi ta cng
2
vit s phc di dng a + ib trong i l mt n v o c tnh cht i =-1). Gi s phc
c1=(a1, b1) v c2=(a2,b2) khi tng ca hai s phc c1 v c2 l mt s phc c3 m
c3=(a1+a2, b1+b2). Vi hiu bit nh vy ta c th xem mi s phc l mt cu trc c
hai trng, mt trng biu din cho phn thc, mt trng biu din cho phn o. Vic
tnh tng ca hai s phc c tnh bng cch ly phn thc cng vi phn thc v phn
o cng vi phn o.
#include<conio.h>
#include<stdio.h>
#include<string.h>
typedef struct
{
float Thuc;
float Ao;
} SoPhuc;
/* Ham in so phuc len man hinh*/
void InSoPhuc(SoPhuc p)
{
printf(%.2f + i%.2f\n,p.Thuc,p.Ao);
}
int main()
{
SoPhuc p1,p2,p;
printf(Nhap so phuc thu nhat:\n);
printf(Phan thuc: );scanf(%f,&p1.Thuc);
printf(Phan ao: );scanf(%f,&p1.Ao);
printf(Nhap so phuc thu hai:\n);
printf(Phan thuc: );scanf(%f,&p2.Thuc);
printf(Phan ao: );scanf(%f,&p2.Ao);
printf(So phuc thu nhat: );
InSoPhuc(p1);
printf(So phuc thu hai: );
InSoPhuc(p2);
p.Thuc = p1.Thuc+p2.Thuc;
p.Ao = p1.Ao + p2.Ao;

139
printf(Tong 2 so phuc: );
InSoPhuc(p);
getch();
return 0;
}
Khi to cu trc
Vic khi to cu trc c th c thc hin trong lc khai bo bin cu trc. Cc trng
ca cu trc c khi to c t gia 2 du { v }, chng c phn cch nhau bi
du phy (,).
V d: Khi to bin cu trc NgaySinh:
struct KieuNgayThang NgaySinh ={29, 8, 1986};
4. Con tr cu trc
Khai bo
Vic khai bo mt bin con tr kiu cu trc cng tng t nh khi khai bo mt bin
con tr khc, ngha l t thm du * vo pha trc tn bin.
C php:
struct <Tn cu trc> * <Tn bin con tr>;
V d: Ta c th khai bo mt con tr cu trc kiu NgayThang nh sau:
struct NgayThang *p;
/* NgayThang *p; // Nu c nh ngha kiu */
S dng cc con tr kiu cu trc
Khi khai bo bin con tr cu trc, bin con tr cha c a ch c th. Lc ny n ch
mi c cp pht 2 byte lu gi a ch v c ghi nhn l con tr ch n 1 cu
trc, nhng cha ch n 1 i tng c th. Mun thao tc trn con tr cu trc hp l,
cng tng t nh cc con tr khc, ta phi:
- Cp pht mt vng nh cho n (s dng hm malloc() hay calloc);
- Hoc, cho n qun l a ch ca mt bin cu trc no .
V d: Sau khi khi to gi tr ca cu trc:
struct NgayThang Ngay = {29,8,1986};
p = &Ngay;
lc ny bin con tr p cha a ch ca Ngay.
Truy cp cc thnh phn ca cu trc ang c qun l bi con tr
truy cp n tng trng ca 1 cu trc thng qua con tr ca n, ta s dng ton t
du mi tn (->: du - v du >). Ngoi ra, ta vn c th s dng n php ton * truy
cp vng d liu ang c qun l bi con tr cu trc ly thng tin cn thit.
V d: S dng con tr cu trc.

140
#include<conio.h>
#include<stdio.h>
typedef struct
{
unsigned char Ngay;
unsigned char Thang;
unsigned int Nam;
} NgayThang;
int main()
{
NgayThang Ng={29,8,1986};
NgayThang *p;
p=&Ng;
printf(Truy cap binh thuong %d-%d-%d\n,
Ng.Ngay,Ng.Thang,Ng.Nam);
printf(Truy cap qua con tro %d-%d-%d\n,
p->Ngay,p->Thang,p->Nam);
printf(Truy cap qua vung nho con tro %d-%d-%d\n,
(*p).Ngay,(*p).Thang,(*p).Nam);
getch();
return 0;
}
- Cho php s dng cu trc, con tr cu trc l i s ca hm nh cc loi bin khc
- Cho php hm xy dng tr v l kiu cu trc
V d : X l danh sch sinh vin, s dng hm vi i s l cu trc
#include <stdio.h>
#include <conio.h>
//Ngay thang
struct Ngaythang {
int ng ;
int th ;
int nam ;
};
//Sinh vien
struct Sinhvien {
char hoten[25] ;
Ngaythang ns;
int gt;
float diem ;
};
//cac ham xu ly
int sua(Sinhvien &r) ;
int in(Sinhvien x) ;
int nhap(Sinhvien *p) ;
int nhapds(Sinhvien *a, int n) ;
int suads(Sinhvien *a, int n) ;
int inds(const Sinhvien *a, int n) ;
//
struct Sinhvien a[10];

int main()
{
nhap(a);

141
// in(a[1]);
// sua(a[1]);
nhapds(a,9);
suads(a,9);
inds(a,9);
getch();
return 0;
}
///trien khai cac ham
int sua(Sinhvien &r)
{
int chon;
do {
printf("1: Sua ho ten\n2: Sua ngay sinh\n3:Sua gioi tinh\n4:Sua diem\n5:In\n0: Ket thuc\n");
scanf("%d",&chon);
switch (chon)
{
case 1:
printf("Nhap ho ten:");
scanf("%s",r.hoten);
break;
case 2:
printf("Nhap ngay thang nam sinh:");
scanf("%d%d%d",&r.ns.ng,&r.ns.th,&r.ns.nam);
break;
case 3:
printf("Nhap gioi tinh 0:Nu 1:Nam:");
scanf("%d",&r.gt) ;
break;
case 4:
printf("Nhap diem:");
scanf("%f",&r.diem);
break;
case 5:
printf("Sinh vien:");
in(r);
break;
case 0:
break;
default:
printf("Nhap gia tri khong dung\n");
break;
}
} while (chon) ;
return 0;
}
////////
int in(Sinhvien x)
{
printf("Ho ten :%s\nNgay sinh %d/%d/%d\n",x.hoten,x.ns.ng, x.ns.th, x.ns.nam) ;
printf("Gioi tinh :%s\nDiem :%f\n",(x.gt==1) ?"Nam" :"Nu",x.diem) ;
return 0;
}

142
///////
int nhap(Sinhvien *p)
{
printf("Nhap ho va ten: ");
scanf("%s",p->hoten);
printf("Nhap ngay sinh (ngay thang nam): ");
scanf("%d%d%d", &p->ns.ng ,&p->ns.th,&p->ns.nam);
printf("Gioi tinh 0: nu, 1: nam: ");
scanf("%d",& p->gt);
printf("Diem: ");
scanf("%f",& p->diem);
return 0;
}
//////
int nhapds(Sinhvien *a, int n)
{

for (int i=1; i<=n; i++) nhap(&a[i]) ;


return 0;
}
/////
int suads(Sinhvien *a, int n)
{
int chon;
do
{
printf("\nNhap phan tu duoc su tu 1 den %d, gia tri khac thoat:",n);
scanf("%d",&chon);
if(chon>0 &&chon<=n)
{
sua(a[chon]) ;
}
}while(chon>0 && chon<=n);
return 0;
}
//////////
int inds(const Sinhvien *a, int n)
{
for (int i=1; i<=n; i++)
in(a[i]) ;
return 0;
}

5. Cu trc vi thnh phn kiu bit


a. Trng bit
tit kim trong lu tr, trong ngn ng lp trnh C cho php khai bo cc trng
ca cu trc vi s lng bit xc nh khng ph thuc vo s lng bit cc kiu d liu
chun.
Mt trng bit l mt khai bo trng int v thm du: cng s bit n theo sau, trong
0 n < 15. V d do ln ca ngy khng vt qu 31, thng khng vut qu 12 nn

143
2 trng ny trong cu trc ngy thng c th khai bo tit kim hn bng 5 v 4 bit nh
sau:
struct Date {
int ng: 5;
int th: 4;
int nam:14;
};
b. c im
Cn ch cc c im sau ca mt cu trc c cha trng bit:
Cc bit c b tr lin tc trn dy cc byte.
Kiu trng bit phi l int (signed hoc unsigned).
di mi trng bit khng qu 16 bit.
C th b qua mt s bit nu b trng tn trng, v d:
struct tu {
int: 8;
int x:8;
}
mi mt bin cu trc theo khai bo trn gm 2 byte, b qua khng s dng byte thp
v trng x chim byte (8 bit) cao.
Khng cho php ly a ch ca thnh phn kiu bit.
Khng th xy dng c mng kiu bit.
Khng c tr v t hm mt thnh phn kiu bit. V d nu b l mt thnh phn
ca bin cu trc x c kiu bit th cu lnh sau l sai:
return x.b ; // sai
tuy nhin c th thng qua bin ph nh sau:
int tam = x.b ; return tam ;
Tit kim b nh
Dng trong kiu union ly cc bit ca mt t (xem v d trong phn kiu hp).

6. Cu lnh typedef
thun tin trong s dng, thng thng cc kiu c NSD to mi s c gn
cho mt tn kiu bng cu lnh typedef nh sau:
typedef <kiu> <tn_kiu> ;
V d: to kiu mi c tn Bool v ch cha gi tr nguyn (thc cht ch cn 2
gi tr 0, 1), ta c th khai bo:
typedef int Bool;
khai bo ny cho php xem Bool nh kiu s nguyn.
hoc c th t tn cho kiu ngy thng l Date vi khai bo sau:
typedef struct Date {
int ng;

144
int th;
int nam;
};

khi ta c th s dng cc tn kiu ny trong cc khai bo (v d tn kiu ca i,


ca gi tr hm tr li ).

7. Hm sizeof()
Hm tr li kch thc ca mt bin hoc kiu. V d:
Bool a, b;
Date x, y, z[50];
printf("%d,%d,%d",sizeof(a),sizeof(b),sizeof(Bool)) ; // in 2,2,2
printf("S phn t ca z =%d ",sizeof(z) / sizeof(Date)); // in 50

II. Ngn xp
- Khai bo bin c nh lm lng ph b nh do khai bo s lng phn t ln nht
lu tr d liu
- Khi thay i v s lng phn t cn phi lu tr th mng cp pht ng khng
th gii quyt c tit kim b nh v hn ch cc thao tc chuyn b nh.
- Gii quyt vn cp pht b nh ca khi d liu lin tc s vt qu gii hn
qun l b nh ca mt s h iu hnh, kh trong tm c vng nh ln ph hp
cp pht.
- Gii php a ra kiu cu trc, bn thn cc i tng tr (lin kt) n i tng
tip theo trong danh sch.
- Cc vng nh cp pht khng lin tc nn cc lnh lm vic vi nhm cc i
tng s khng thc hin c.
Kiu cu trc lin kt c s dng xy dng nhiu dng cu trc khc nhau, nhng c
trng l cu trc ngn xp v hng i.
1. Khi nim
Ngn xp l kiu c bit ca danh sch vic loi b v b sung u c thc hin trn mt u
ca danh sch. V th cc phn t khi b sung vo ngn xp sau s c ly ra trc nn gi l
LIFO (Last In First Out). Thao tc c bn ca ngn xp l b sung (push), loi b (pop), ngoi ra
c thao tc khi to, kim tra trng thi.
V d trc quan ca ngn xp l chng bt, bt mi vo lun c t ln trn, th t ly
bt t trn xung di.

Push(s,D)
Push(s,A) Push(s,B) Pop(s) Push(s,E) E Pop(s)
Push(s,C) Pop(s)
C D Pop(s)
B B B
A A A A A

- Cc thao tc c bn vi ngn xp
Khi to
Kim tra ngn xp rng

145
B sung mt phn t vo ngn xp
Ly mt phn t khi ngn xp

2. Ci t ngn xp s dng mng


S dng mng mt chiu th hin ngn xp, dng mt bin ch s m t phn t nh ca
ngn xp. Bin ch s s ch ra v tr tip theo c thm vo, v v tr tr i 1 l v tr phn t
ang c ngn xp.

Ch s

k D Phn t trn cng



1 B Phn t u tin
0 A
Khai bo
typedef struct stack
{
int top;
int storage[MAX];
};
Khi to ngn xp
void init(stack *s)
{
s->top=0;
}
Kim tra ngn xp rng
///0: empty
int empty(stack *s)
{
return s->top;
}
Kim tra ngn xp y
///0:full
int full(stack *s)
{
if(s->top>=MAX)
{
return 0;
}
else
{
return s->top+1;
}
}
B sung mt phn t vo ngn xp
//-1 full of stack
int push(stack *s, int value)
{
if(s->top==MAX)

146
{
return -1;
}
else
{
s->storage[s->top]=value;
s->top++;
}
return s->top;
}
Ly mt phn t khi ngn xp
//-1: try to pop the empty stack
int pop(stack *s, int *out)
{
if(s->top<=0)
{
out=0;
return -1;
}
else
{
s->top--;
*out=s->storage[s->top];
return s->top;
}
}
Do ngn xp c trin khai dng mng nn gp phi vn phi khai bo khi d liu
ti a s dng, trong trng hp pht trin nu s lng vt qu s lng MAX (vn
trong gii hn cho php ca b nh) th chng trnh s khng thc hin c.

3. Ci t ngn xp s dng con tr lin kt

Cp pht ng s lng phn t m ngn xp ang cn. Thao tc phc tp.

Khai bo
typedef struct stackNode
{
int item;
stackNode *next;
};
typedef struct stack{
stackNode* top;
};
Khi to ngn xp
void init(stack *s)
{
s->top=NULL;

147
}
Kim tra ngn xp rng
///0: empty
int empty(stack *s)
{
if(s->top==NULL)
{
return 0;
}
else
{
return 1;
}
}
B sung phn t vo ngn xp
4
3 2 1
top NULL

///-1: cant push to stack


int push(stack *s,int value)
{
stackNode *a;
a=(stackNode*)malloc(sizeof(stackNode));
if(a==NULL)
{
return -1;
}
a->item=value;
a->next=s->top;
s->top=a;
return 0;
}

Ly mt phn t ra khi ngn xp

2 1
top NULL

int pop(stack *s,int *out)


{
stackNode *cur;
if(s->top==NULL)
{
return -1;
}
*out=s->top->item;
cur=s->top;
s->top=s->top->next;

148
free(cur);
}

4. Mt s ng dng ca ngn xp
Ngn xp c s dng trong nhiu ng dng khc nhau
- o ngc xy k t
- Tnh gi tr biu thc dng hu t
- Chuyn biu thc dng trung t sang hu t
- S dng kh qui, chuyn bi ton qui (s dng ngn xp ca h thng) sang s dng
ngn xp ngoi.
o ngc xu k t
V d v o ngc xu s dng ngn xp. Do ngn xp c qui lut vo trc ra sau nn
ln lt a cc k t vo ngn xp, sau tin hnh ly ra cc k t s c o ngc
th t.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
typedef struct stackNode
{
char item;
stackNode *next;
};
typedef struct stack{
stackNode* top;
};
///
void init(stack *s);
///0: empty
int empty(stack *s);;
///-1: cant push to stack
int push(stack *s,char value);
///-1: pop empty stack
int pop(stack *s,char *out);

stack s;
int main()
{
int i;
char v;
char *c="xau dao nguoc";
init(&s);
for(i=0;i<strlen(c);i++)
{
push(&s,c[i]);
}
while(empty(&s)!=0)
{
pop(&s,&v);
printf("\n%c",v);
}

149
getch();
return 0;
}
///implemention
void init(stack *s)
{
s->top=NULL;
}
///---------
///0: empty
int empty(stack *s)
{
if(s->top==NULL)
{
return 0;
}
else
{
return 1;
}
}
///-----------
///-1: cant push to stack
int push(stack *s,char value)
{
stackNode *a;
a=(stackNode*)malloc(sizeof(stackNode));
if(a==NULL)
{
return -1;
}
a->item=value;
a->next=s->top;
s->top=a;
return 0;
}
///-------------
///-1: pop empty stack
int pop(stack *s,char *out)
{
stackNode *cur;
if(s->top==NULL)
{
return -1;
}
*out=s->top->item;
cur=s->top;
s->top=s->top->next;
free(cur);
}

150
III. Hng i
1. Khi nim
Hng i l cu trc d liu tng t ngn xp nhng nguyn tc a vo v ly ra cc phn t
theo th t phn t a vo trc s ly ra trc FIFO (First In First Out). Qui lut ny th hin
cc m hnh trong thc t nh hng i mua v, hng ha trong kho,
Do cc phn t vo trc c ly ra trc nn cn phi xy dng danh sch c hai u, u vo
v u ra.
Put(s,F) n
n Get(s)
u vo
k+1 F
Phn t trn cng k D
k D
1 B
1 B Phn t ly ra 0
0 A

- Cc thao tc c bn vi hng i
Khi to hng i
Kim tra hng i rng
B sung mt phn t vo hng i
Ly mt phn t khi hng i

2. Ci t hng i s dng mng


C th s dng mng lu tr d liu, v th c th s dng m t hng i. Do hng i c
hai u nn cn phi c hai ch s nh du. Do vic ly d liu v a d liu vo trong danh
sch u tng ch s nn cn phi kim tra trong trng hp ch s vt qua gii hn ca mng
cn phi chuyn ch s v 0.

Khai bo
typedef struct queue
{
int head, tail;
int storage[MAX];
};
Khi to hng i
void init(queue *s)
{
s->tail=0;
s->head=0;
}

151
Kim tra hng i rng
///0: empty
int empty(queue *s)
{
int d=s->head-s->tail;
if(d<0)
d+=MAX;
return d;
}
Kim tra hng i y
///0:full
int full(queue *s)
{
int nh=s->head+1;
if(nh==s->tail || (nh + MAX)%MAX==s->tail)
{
return 0;
}
return 1;
}
Thm mt phn t vo hng i
//-1 full of queue
int put(queue *s, int value)
{
if(full(s)==0)
return -1;
s->storage[s->head]=value;
s->head++;
s->head=s->head%MAX;
return s->head;
}
Ly mt phn t khi hng i
//-1: try to pop the empty queue
int get(queue *s, int *out)
{
if(empty(s)==0)
return -1;
*out=s->storage[s->tail];
s->tail++;
s->tail=s->tail%MAX;
return s->tail;
}

3. Ci hng i s dng con tr


S dng hai con tr l u v ui. Khi thm ni vo sau con tr ui, v khi ly ra s t
con tr u.

152
Khai bo
typedef struct queueNode
{
int item;
queueNode *next;
};
typedef struct queue{
queueNode* head, *tail;
};
Khi to hng i
void init(queue *s)
{
s->head=NULL;
s->tail=NULL;
}
Kim tra hng i rng
///0: empty
int empty(queue *s)
{
if(s->head==NULL)
{
return 0;
}
else
{
return 1;
}
}
Thm mt phn t vo hng i
///-1: cant push to queue
int put(queue *s,int value)
{
queueNode *a;
a=(queueNode*)malloc(sizeof(queueNode));
if(a==NULL)
{
return -1;
}
a->item=value;
a->next=NULL;
if(s->tail==NULL)
{
s->tail=a;
s->head=a;
}
s->tail->next=a;
s->tail=a;
return 0;
}
Ly mt phn t khi hng i
///-1: pop empty queue
int get(queue *s,int *out)
{

153
queueNode *a;
if(s->head==NULL)
{
return -1;
}
*out=s->head->item;
a=s->head;
s->head=s->head->next;
if(s->head==NULL)
{
s->tail=NULL;
}
free(a);
}

4. Mt s ng dng ca hng i
- Hng i c s dng trong m phng cc m hnh hng i thc t trong cc bi ton
- S dng trong bi ton duyt theo chiu rng

IV. Tm tt ni dung bi hc
I. Cu trc t nh ngha
1 Khi nim
2. Khai bo bin cu trc
3. Cc thao tc trn bin kiu cu trc
4. Con tr cu trc
II. Kiu ngn xp
1. Khi nim
2. Cc thao tc c bn
3. Ci t
4. ng dng
III. Kiu hng i
1. Khi nim
2. Cc thao tc c bn
3. Ci t
4. ng dng

V. Bi tp
Xem Bi 15 - Bi tp thc hnh Cu trc d liu t nh ngha.

154
Bi 15 - Bi thc hnh: CU TRC D LIU DO NGI
DNG T NH NGHA
I. Bi tp lm theo yu cu
1. Biu din v thc hin cc php ton phn s

Yu cu: Xy dng cu trc biu din phn s; cho php nhp vo 2 phn s, thc hin
cc php cng, tr, nhn, chia 2 phn s .

Son tho vn bn chng trnh nh sau


#include <stdio.h>
#include <conio.h>

typedef struct fraction


{
int numerator;
int denominator;
};
///-- khai bao cac ham
fraction add(fraction x, fraction y) ;
fraction sub(fraction x, fraction y) ;
fraction multiply(fraction x, fraction y) ;
fraction divide(fraction x, fraction y) ;
void printFraction(fraction x);

int main()
{
fraction a,b;

printf("Nhap phan so, tu so truoc, mau so sau:");


scanf("%d%d",&a.numerator, &a.denominator);
printf("Nhap phan so, tu so truoc, mau so sau:");
scanf("%d%d",&b.numerator, &b.denominator);
printf("Hieu:\n");
printFraction(sub(a,b));
printf("\nTong:\n");
printFraction(add(a,b));
printf("\nTich:\n");
printFraction(multiply(a,b));
printf("\nThuong:\n");
printFraction(divide(a,b));
getch();
return 0;
}
///--------------- trien khai cac ham
fraction add(fraction x, fraction y)
{
fraction t;
t.numerator=x.numerator * y.denominator + x.denominator * y.numerator;

155
t.denominator = x.denominator * y.denominator;
return t;
}
///------------------
fraction sub(fraction x, fraction y)
{
fraction t;
t.numerator=x.numerator * y.denominator - y.numerator * x.denominator;
t.denominator = x.denominator * y.denominator;
return t;

}
fraction multiply(fraction x, fraction y)
{
fraction t;
t.numerator=x.numerator * y.numerator;
t.denominator = x.denominator * y.denominator;
return t;
}
fraction divide(fraction x, fraction y)
{
fraction t;
t.numerator=x.numerator * y.denominator;
t.denominator = x.denominator * y.numerator;
return t;
}
void printFraction(fraction x)
{
printf("%d/%d",x.numerator,x.denominator);
}

Th nghim 1:

Th nghim 2:

Th nghim vi hai gi tr l 3/4, v 1/2 a ra nhn xt, cn ci tin nh th no?

Th nghim 3:

Th nghim vi hai gi tr l 3/4, v 0/2 a ra nhn xt, cn ci tin nh th no?

156
2. Chuyn biu thc trung t v dng hu t

Yu cu: Vit chng trnh cho php chuyn mt chui biu din biu thc dng trung t
thnh chui biu din biu thc dng hu t.

Son tho vn bn chng trnh nh sau


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
typedef struct stackNode
{
char item;
stackNode *next;
};
typedef struct stack{
stackNode* top;
};
///
void init(stack *s);
///0: empty
int empty(stack *s);;
///-1: cant push to stack
int push(stack *s,char value);
///-1: pop empty stack
int pop(stack *s,char *out);
char getTop(stack *s);
int isnumber(char ch);
int isoperator(char ch);
int priority(char ch);
int convert(char source[], char chuoihauto[]);

stack s;
int main()
{
int i;
char v;
char c[100];
char o[100];

gets(c);
convert(c,o);
puts(o);
getch();
return 0;
}
///implemention
void init(stack *s)
{
s->top=NULL;
}
///---------

157
///0: empty
int empty(stack *s)
{
if(s->top==NULL)
{
return 0;
}
else
{
return 1;
}
}
///-----------
///-1: cant push to stack
int push(stack *s,char value)
{
stackNode *a;
a=(stackNode*)malloc(sizeof(stackNode));
if(a==NULL)
{
return -1;
}
a->item=value;
a->next=s->top;
s->top=a;
return 0;
}
///-------------
///-1: pop empty stack
int pop(stack *s,char *out)
{
stackNode *cur;
if(s->top==NULL)
{
return -1;
}
cur=s->top;
*out=s->top->item;
s->top=cur->next;
free(cur);
}
///---------------
char getTop(stack *s)
{
return s->top->item;
}
///----------------
int isnumber(char ch)
{
return ((int(ch)>=48&&int(ch)<=57));
}
///---------
int isoperator(char ch)

158
{
return (ch=='+'||ch=='-'||ch=='*'||ch=='/');
}
///---------
int priority(char ch)
{
if(ch=='+'||ch=='-')
return 0;
if(ch=='*'||ch=='/')
return 1;
}
///------------------
int convert(char source[], char suffixExp[])
{
stack S;
init(&S);
int count=0;
char temp;
for(int i=0;i<strlen(source);i++)
{
if(isoperator(source[i])&&isoperator(source[i+1]))
return i;
if((source[i]>=65&&source[i]<=90)||(source[i]>=97&&source[i]<=121))
return i;
}
for(int i=0;i<strlen(source);i++)
{
char ch=source[i];
if(isnumber(ch))
{
suffixExp[count]=ch;
count++;
}
else//operator
{
if(empty(&S)!=0)//not empty
{

if(isoperator(getTop(&S))&&(priority(getTop(&S))>=priority(ch)))
{
pop(&S,&temp);
suffixExp[count++]=temp;
push(&S,ch);
}
else
push(&S,ch);
}
else
push(&S,ch);
}

}//END FOR
while(empty(&S)!=0)//Lay het nhung gi con lai trong stack

159
{
pop(&S,&temp);
suffixExp[count++]=temp;
}
suffixExp[count++]='\0';//CHEN KI TU NULL VAO CUOI XAU;
}

Th nghim 1:

Nhp chui l: 1-3*4/5+6+7-8

Th nghim 2:
Nhp chui l: 1+3-2*3
Nhn xt v pht trin cho trng hp c du ngoc (, ), php ton ^

II. Bi tp t lm
1. Hy nh ngha kiu:
struct Hoso{
char HoTen[40];
float Diem;
char Loai[10];
};
Vit chng trnh nhp vo h tn, im ca n hc sinh. Xp loi vn ha theo cch sau:
im Xp loi
9, 10 Gii
7, 8 Kh
5, 6 Trung bnh
di 5 Khng t
In danh sch ln mn hnh theo dng sau:
XEP LOAI VAN HOA
HO VA TEN DIEM XEPLOAI
Nguyen Van A 7 Kha
Ho Thi B 5 Trung binh
Dang Kim C 4 Khong dat
.........................................................................................................................
2. Xem mt phn s l mt cu trc c hai trng l t s v mu s. Hy vit chng
trnh thc hin cc php ton cng, tr, nhn, chia hai phn s. (Cc kt qu phi ti
gin).

160
3. To mt danh sch cn b cng nhn vin, mi ngi ngi xem nh mt cu trc
bao gm cc trng Ho, Ten, Luong, Tuoi, Dchi. Nhp mt s ngi vo danh sch,
sp xp tn theo th t t in, in danh sch sp xp theo mu sau:
DANH SACH CAN BO CONG NHAN VIEN
STT HO VA TEN LUONG TUOI DIACHI
1 Nguyen Van 333.00 26 Can Tho
2 Dang Kim B 290.00 23 Vinh Long
4. Hon thin m ngun ca chng trnh tnh biu thc dng hu t.
5. Hon thin m ngun chng trnh chuyn i biu thc dng trung t sang hu t
6. Vit chng trnh i s nguyn dng thp phn sang dng nh phn s dng ngn
xp
7. Cho mt ma trn mn MxN, cc im nhn gi tr 0 v 1, 1 l c mn. Nu n
(i,j) s kch n bn xung quanh nu c mn. Cho n (i,j) hy ch ra cc b
kch n khc. S dng ngn xp xt cc b kch n tip theo, in ra th t cc .
S dng hng i xt cc b kch n tip theo, in ra th t cc .

161
Bi 16 - LM VIC VI FILE
Ni dung bi hc
I. Mt s khi nim
II. Cc thao tc trn tp tin
1. Khai bo bin tp tin
2. M tp tin
3. ng tp tin
4. Kim tra n cui tp tin hay cha?
5 Di chuyn con tr tp tin v u tp tin - Hm rewind()
III. Truy cp tp tin vn bn
1. Ghi d liu ln tp tin vn bn
2. c d liu t tp tin vn bn
IV. Truy cp tp tin nh phn
1. Ghi d liu ln tp tin nh phn - Hm fwrite()
2 c d liu t tp tin nh phn - Hm fread()
3. Di chuyn con tr tp tin - Hm fseek()
4. V d
V. Tm tt ni dung bi hc

I. Mt s khi nim
D liu trong chng trnh c lu tr RAM my tnh, v th khi kt thc chng
trnh, tt my d liu s b gii phng. x l d liu cn phi lu tr trn b nh ngoi (a
cng, USB, ) di dng file. File l tp hp cc byte lin tc c lu tr v c gn tn gi.
Khi x l file chng trnh c th xem xt chui byte vi cch nhn khc nhau, c nhng ng x
khc nhau vi d liu. Trong C h tr vic thao tc vi file vi quan im: file vn bn, file nh
phn.
o File vn bn (Text File): l loi tp tin dng ghi cc k t ln a. im c bit l
d liu ca tp tin c lu tr thnh cc dng, mi dng c kt thc bng k t xung dng
(new line), k hiu \n; k t ny l s kt hp ca 2 k t CR (Carriage Return - V u dng,
m Ascii l 13) v LF (Line Feed - Xung dng, m Ascii l 10). Mi tp tin c kt thc bi
k t EOF (End Of File) c m Ascii l 26 (xc nh bi t hp phm Ctrl + Z).
Truy xut tp tin theo kiu vn bn ch c th truy xut theo kiu tun t.
o Tp tin nh phn: Quan im tp tin l dy byte lin tc, vic x l vi tp tin da trn
vic c ghi dy byte.
Bin tp tin: l mt bin thuc kiu d liu tp tin dng i din cho mt tp tin. D
liu cha trong mt tp tin c truy xut qua cc thao tc vi thng s l bin tp tin i din
cho tp tin .

162
Con tr tp tin: Khi mt tp tin c m ra lm vic, ti mi thi im, s c mt v
tr ca tp tin m ti vic c/ghi thng tin s xy ra. Ngi ta hnh dung c mt con tr ang
ch n v tr v t tn n l con tr tp tin.
Sau khi c/ghi xong d liu, con tr s chuyn dch thm mt phn t v pha cui tp
tin. Sau phn t d liu cui cng ca tp tin l du kt thc tp tin EOF (End Of File).

II. Cc thao tc trn tp tin


Cc thao tc vi tp tin:
o Khai bo bin tp tin.
o M tp tin bng hm fopen().
o Thc hin cc thao tc x l d liu ca tp tin bng cc hm c/ghi d liu.
o ng tp tin bng hm fclose().
y, ta thao tc vi tp tin nh cc hm c nh ngha trong th vin stdio.h.

1. Khai bo bin tp tin


C php
FILE <Danh sch cc bin con tr, i din cho tp tin>
Cc bin trong danh sch phi l cc con tr v c phn cch bi du phy(,).
V d: FILE *f1,*f2;

2. M tp tin
C php
FILE *fopen(char *Path, const char *Mode)
Trong :
- Path: chui ch ng dn n tp tin trn a.
- Mode: chui xc nh cch thc m tp tin s m. Cc gi tr c th ca Mode:
Ch ngha
r M tp tin vn bn c
w To ra tp tin vn bn mi ghi
a Ni vo tp tin vn bn
rb M tp tin nh phn c
wb To ra tp tin nh phn ghi
ab Ni vo tp tin nh phn
r+ M mt tp tin vn bn c/ghi
w+ To ra tp tin vn bn c ghi
a+ Ni vo hay to mi tp tin vn bn c/ghi

163
r+b M ra tp tin nh phn c/ghi
w+b To ra tp tin nh phn c/ghi
a+b Ni vo hay to mi tp tin nh phn
Mc nh l m dng text nu khng c xc nh l b, nu r rng hn th thm ch nh t xc
nh l kiu text.
- Hm fopen tr v mt con tr tp tin. Chng trnh ca ta khng th thay i gi tr ca con
tr ny. Nu c mt li xut hin trong khi m tp tin th hm ny tr v con tr NULL.
V d: M mt tp tin tn TEST.txt ghi.
FILE *f;
f = fopen("TEST.txt", "w");
if (f!=NULL)
{
/* Cc cu lnh thao tc vi tp tin*/
/* ng tp tin*/
}
Kim tra con tr f vi gi tr NULL cho php xc nh c lnh thc hin thnh cng hay
khng?
Nu m tp tin ghi, trng hp tp tin tn ti ri th tp tin s b xa v mt tp tin mi
c to ra. Nu ta mun ghi ni d liu, ta phi s dng ch a. Khi m vi ch c, tp
tin phi tn ti ri, nu khng mt li s xut hin.

3. ng tp tin
Hm fclose() c dng ng tp tin c m bi hm fopen(). Hm ny s ghi d liu
cn li trong vng m vo tp tin v ng li tp tin.
C php: int fclose(FILE *f)
Trong f l con tr tp tin c m bi hm fopen(). Gi tr tr v ca hm l 0 bo rng
vic ng tp tin thnh cng. Hm tr v EOF nu c xut hin li.
Ngoi ra, ta cn c th s dng hm fcloseall() ng tt c cc tp tin li.
C php: int fcloseall()
Kt qu tr v ca hm l tng s cc tp tin c ng li. Nu khng thnh cng, kt qu
tr v l EOF.

4. Kim tra n cui tp tin hay cha?


C php: int feof(FILE *f)
ngha: Kim tra xem chm ti cui tp tin hay cha v tr v EOF nu cui tp tin c
chm ti, ngc li tr v 0.

5. Di chuyn con tr tp tin v u tp tin - Hm rewind()


- Chuyn v u tp tin, s dng hm rewind().

164
C php: void rewind(FILE *f);
+ f: con tr tp tin ang thao tc.
- Chuyn n v tr bt k s dng hm fseek().
C php: int fseek(FILE *stream, long offset, int whence);
+ stream: con tr tp tin ang thao tc.
+ offset: s byte cn dch chuyn con tr tp tin.
+ whence: v tr bt u tnh khong cch dch chuyn cho offset:
0 SEEK_SET V tr u tp tin
1 SEEK_CUR V tr hin ti ca con tr tp tin
2 SEEK_END V tr cui tp tin
+ Kt qu tr v ca hm l 0 nu vic di chuyn thnh cng. Nu khng thnh cng, 1 gi tr
khc 0 ( l 1 m li) c tr v.
- Ly v tr ca con tr file hm ftell();
C php: long ftell(FILE *stream);
+ stream: bin i din cho file
+ tr v v tr ca con tr file so vi u file

III. Truy cp tp tin vn bn


1. Ghi d liu ln tp tin vn bn
1.1 Hm fputc()
Hm ny c dng ghi mt k t ln mt tp tin vn bn ang c m lm vic.
C php: int fputc(int c, FILE *f)
Trong , tham s c cha m Ascii ca mt k t no . M ny c ghi ln tp tin
lin kt vi con tr f. Hm ny tr v EOF nu gp li.
1.2 Hm fputs()
Hm ny dng ghi mt chui k t cha trong vng m ln tp tin vn bn.
C php: int fputs(const char *buffer, FILE *f)
Trong , buffer l con tr c kiu char ch n v tr u tin ca chui k t c ghi
vo. Hm ny tr v gi tr 0 nu buffer cha chui rng v tr v EOF nu gp li.
1.3 Hm fprintf()
Hm ny dng ghi d liu c nh dng ln tp tin vn bn.
C php: fprintf(FILE *f, const char *format, varexpr)
Trong : format: chui nh dng (ging vi cc nh dng ca hm printf()), varexpr:
danh sch cc biu thc, mi biu thc cch nhau du phy (,).
nh dng ngha

165
%d Ghi s nguyn
%[.s ch s thp phn] f Ghi s thc c <s ch s thp phn> theo quy tc lm trn
s.
%o Ghi s nguyn h bt phn
%x Ghi s nguyn h thp lc phn
%c Ghi mt k t
%s Ghi chui k t
%e hoc %E hoc %g hoc Ghi s thc dng khoa hc (nhn 10 m x)
%G

V d: Vit chng trnh ghi chui k t ln tp tin vn bn D:\\Baihat.txt


#include<stdio.h>
#include<conio.h>
int main(){
FILE *f;
clrscr();
f=fopen("D:\\Baihat.txt","r+");
if (f!=NULL){
fputs("Em oi Ha Noi pho.\n",f);
fputs("Ta con em, mui hoang lan; ta con em, mui hoa sua.",f);
fclose(f);
}
getch();
return 0;
}

2. c d liu t tp tin vn bn
2.1 Hm fgetc()
Hm ny dng c d liu t tp tin vn bn ang c m lm vic.
C php: int fgetc(FILE *f)
Hm ny tr v m Ascii ca mt k t no (k c EOF) trong tp tin lin kt vi con
tr f.
2.2 Hm fgets()
C php: char *fgets(char *buffer, int n, FILE *f)
Hm ny c dng c mt chui k t t tp tin vn bn ang c m ra v lin
kt vi con tr f cho n khi c n k t hoc gp k t xung dng \n (k t ny cng c
a vo chui kt qu) hay gp k t kt thc EOF (k t ny khng c a vo chui kt
qu).
Trong :

166
- buffer (vng m): con tr c kiu char ch n cng nh ln cha cc k t nhn
c.
- n: gi tr nguyn ch di ln nht ca chui k t nhn c.
- f: con tr lin kt vi mt tp tin no .
- K t NULL (\0) t ng c thm vo cui chui kt qu lu trong vng m.
- Hm tr v a ch u tin ca vng m khi khng gp li v cha gp k t kt thc
EOF. Ngc li, hm tr v gi tr NULL.
2.3 Hm fscanf()
Hm ny dng c d liu t tp tin vn bn vo danh sch cc bin theo nh dng.
C php: fscanf(FILE *f, const char *format, varlist)
Trong : format: chui nh dng (ging hm scanf()); varlist: danh sch cc bin mi
bin cch nhau du phy (,).
V d: Vit chng trnh chp tp tin D:\Baihat.txt trn sang tp tin D:\Baica.txt.
#include<stdio.h>
#include<conio.h>
int main()
{
FILE *f1,*f2;
clrscr();
f1=fopen("D:\\Baihat.txt","rt");
f2=fopen("D:\\Baica.txt","wt");
if (f1!=NULL && f2!=NULL)
{
int ch=fgetc(f1);
while (! feof(f1))
{
fputc(ch,f2);
ch=fgetc(f1);
}
fcloseall();
}
getch();
return 0;
}

3. V d
c ma trn tnh ma trn, ghi ma trn chuyn v vo file mi. Xem xt file vn bn nh u vo,
u ra ca chng trnh, thay v nhn t bn phm v xut ra mn hnh.
#include<stdio.h>
#include<conio.h>
int a[100][100];
int n,m;

int main()
{
char *infile="vao.txt", *outfile="ra.txt";

167
int i, j;
FILE *f1,*f2;
f1=fopen(infile,"rt");
if(f1==NULL)
{
printf("Loi mo file %s",infile);
getch();
return -1;
}
f2=fopen(outfile,"wt");
if(f2==NULL)
{
printf("Loi mo file %s",outfile);
getch();
fclose(f1);
return -2;
}
fscanf(f1,"%d%d",&m,&n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
fscanf(f1,"%d",&a[i][j]);
}
}
fprintf(f2,"%d %d\n",n,m);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
fprintf(f2,"%4d",a[j][i]);
}
fprintf(f2,"\n");
}
fclose(f1);
fclose(f2);
printf("Ket thuc tinh chuyen vi");
getch();
return 0;
}

IV. Truy cp tp tin nh phn


1. Ghi d liu ln tp tin nh phn
C php: size_t fwrite(const void *ptr, size_t size, size_t n, FILE *f)
Trong :
- ptr: con tr ch n vng nh cha thng tin cn ghi ln tp tin.
- n: s phn t s ghi ln tp tin.
- size: kch thc ca mi phn t.
- f: con tr tp tin c m.

168
- Gi tr tr v ca hm ny l s phn t c ghi ln tp tin. Gi tr ny bng n tr khi xut hin
li.

2. c d liu t tp tin nh phn


C php: size_t fread(const void *ptr, size_t size, size_t n, FILE *f)
Trong :
- ptr: con tr ch n vng nh s nhn d liu t tp tin.
- n: s phn t c c t tp tin.
- size: kch thc ca mi phn t.
- f: con tr tp tin c m.
- Gi tr tr v ca hm ny l s phn t c c t tp tin. Gi tr ny bng n hay nh hn
n nu chm n cui tp tin hoc c li xut hin..

3. V d
V d 1: Vit chng trnh ghi ln tp tin CacSo.Dat 3 gi tr s (thc, nguyn, nguyn
di). Sau c cc s t tp tin va ghi v hin th ln mn hnh.
#include<stdio.h>
#include<conio.h>
int main()
{
FILE *f;
f=fopen("number.txt","wb");
if (f!=NULL)
{
double d=3.14;
int i=101;
long l=54321;
fwrite(&d,sizeof(double),1,f);
fwrite(&i,sizeof(int),1,f);
fwrite(&l,sizeof(long),1,f);
/* Doc tu tap tin*/
rewind(f);
fread(&d,sizeof(double),1,f);
fread(&i,sizeof(int),1,f);
fread(&l,sizeof(long),1,f);
printf("Cac ket qua la: %f %d %ld",d,i,l);
fclose(f);
}
else
{
printf("Khong mo duoc file");
}
getch();
return 0;
}

169
V d 2: Mi sinh vin cn qun l t nht 2 thng tin: m sinh vin v h tn. Vit chng
trnh cho php la chn cc chc nng: nhp danh sch sinh vin t bn phm ri ghi ln tp tin
SinhVien.dat, c d liu t tp tin SinhVien.dat ri hin th danh sch ln mn hnh, tm kim
h tn ca mt sinh vin no da vo m sinh vin nhp t bn phm.
Ta nhn thy rng mi phn t ca tp tin SinhVien.Dat l mt cu trc c 2 trng: m v
h tn. Do , ta cn khai bo cu trc ny v s dng cc hm c/ghi tp tin nh phn vi kch
thc mi phn t ca tp tin l chnh kch thc cu trc .
Trong trng hp ny c th coi file nh phn nh l ni lu tr d liu lu di, cng c th
coi nh l ni lu tr x l d liu thay v dng b nh.
#include<stdio.h>
#include<conio.h>
#include<string.h>
typedef struct
{
char Ma[10];
char HoTen[40];
} SinhVien;
///-----------
void WriteFile(char *FileName)
{
FILE *f;
int n,i;
SinhVien sv;
f=fopen(FileName,"ab");
printf("Nhap bao nhieu sinh vien? ");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("Sinh vien thu %i\n",i);
fflush(stdin);
printf(" - MSSV: ");gets(sv.Ma);
printf(" - Ho ten: ");gets(sv.HoTen);
fwrite(&sv,sizeof(sv),1,f);
}
fclose(f);
printf("Bam phim bat ky de tiep tuc");
getch();
}
void ReadFile(char *FileName)
{
FILE *f;
SinhVien sv;
f=fopen(FileName,"rb");
printf(" MSSV | Ho va ten\n");
fread(&sv,sizeof(sv),1,f);
while (!feof(f))
{
printf(" %s | %s\n",sv.Ma,sv.HoTen);

170
fread(&sv,sizeof(sv),1,f);
}
fclose(f);
printf("Bam phim bat ky de tiep tuc!!!");
getch();
}
void Search(char *FileName)
{
char MSSV[10];
FILE *f;
int Found=0;
SinhVien sv;
fflush(stdin);
printf("Ma so sinh vien can tim: ");gets(MSSV);
f=fopen(FileName,"rb");
while (!feof(f) && Found==0)
{
fread(&sv,sizeof(sv),1,f);
if (strcmp(sv.Ma,MSSV)==0) Found=1;
}
fclose(f);
if (Found == 1)
{
printf("Tim thay SV co ma %s. Ho ten la: %s",sv.Ma,sv.HoTen);
}
else
{
printf("Tim khong thay sinh vien co ma %s",MSSV);
}
printf("\nBam phim bat ky de tiep tuc!!!");
getch();
}
int main()
{
int c;
for (;;)
{
printf("1. Nhap DSSV\n");
printf("2. In DSSV\n");
printf("3. Tim kiem\n");
printf("4. Thoat\n");
printf("Ban chon 1, 2, 3, 4: ");
scanf("%d",&c);
fflush(stdin);

if(c==1)
{
WriteFile("SinhVien.Dat");
}
else if (c==2)
{
ReadFile("SinhVien.Dat");
}

171
else if (c==3)
{
Search("SinhVien.Dat");
}
else break;
}
return 0;
}
Ngoi ra th vin stdio.h cn nh ngha mt s hm khc cho php thao tc vi tp tin, sinh
vin c th tham kho trong phn tr gip.

V. Tm tt ni dung bi hc
I. Mt s khi nim
II. Cc thao tc trn tp tin
1. Khai bo bin tp tin
2. M tp tin
3. ng tp tin
4. Kim tra n cui tp tin hay cha?
5 Di chuyn con tr tp tin v u tp tin - Hm rewind()
III. Truy cp tp tin vn bn
1. Ghi d liu ln tp tin vn bn
2. c d liu t tp tin vn bn
IV. Truy cp tp tin nh phn
1. Ghi d liu ln tp tin nh phn - Hm fwrite()
2 c d liu t tp tin nh phn - Hm fread()
3. Di chuyn con tr tp tin - Hm fseek()
4. V d
V. Tm tt ni dung bi hc

VI. Bi tp
Xem Bi 17 - Bi tp thc hnh Lm vic vi File v Thut ton nng cao

172
Bi 17 - Bi thc hnh LM VIC VI FILE
I. Bi tp lm theo yu cu
1. Vit chng trnh tnh nghim ca h 2 phng trnh vi tham s nhp
t File
Vn : Vit chng trnh gii h 2 phng trnh 2 n sau:
a1.x + b1.y = c1
a2.x + b2.y = c2
vi d liu l cc h s a1, b1, c1, a2, b2, c2 c nhp t file week5_1.dat.
Son tho vn bn chng trnh sau:
#include<stdio.h>
#include<conio.h>
int main()
{
int a1, b1, c1;
int a2, b2, c2;
float d, dx, dy, x, y;
FILE *finput;
FILE *foutput;
finput=fopen("week5_1.dat","rt");
foutput=fopen("week5_1.res","wt");
fscanf(finput,"%d %d %d",&a1, &b1, &c1);
fscanf(finput,"%d %d %d",&a2, &b2, &c2);
d =a1*b2-a2*b1;
dx=c1*b2-c2*b1;
dy=a1*c2-a2*c1;
fprintf(foutput,"%s\n","He phuong trinh:");
fprintf(foutput,"%d.x + %d.y = %d\n",a1,b1,c1);
fprintf(foutput,"%d.x + %d.y = %d\n",a2,b2,c2);
if (d!=0)
{
x = (float)dx/d; y = (float)dy/d;
fprintf(foutput,"%s\n","Co cap nghiem:");
fprintf(foutput,"x=%0.2f, y=%0.2f",x,y);
}
else
{
fprintf(foutput,"%s\n","Vo nghiem!");
}
fclose(finput);
fclose(foutput);
printf("Xem ket qua trong file week5_1.res");
getch();
return 0;
}
Th nghim 1:
- S dng cng c notepad son tho ni dung nh sau:
5 7 9
7 2 1

173
V ghi vo file week5_1.dat (tn file l week5_1 v phn m rng l dat) cng th mc
lu tr chng trnh ngun.
- Chy chng trnh v cho bit ni dung file week5_1.res. Nhn xt v kt qu t c.
Th nghim 2:
- S dng cng c notepad sa li ni dung file week5_1.dat nh sau:
5 7 9
10 14 18
- Chy chng trnh v cho bit ni dung file week5_1.res. Nhn xt v kt qu t c.
Th nghim 3:
- S dng cng c notepad sa li ni dung file week5_1.dat nh sau:
5.0 7.0 9.0
7.0 2.0 1.0
Chy chng trnh v cho bit ni dung file week5_1.res. Nhn xt v kt qu t c.

2. Kim tra nh dng file


Vn : Lm th no bit mt file thc s l file chng trnh dng EXE hoc l mt file nh
BMP? Cch th nht c th l kim tra phn m rng ca tn file, tuy nhin cch ny khng
ng tin cy v thc t ngi s dng c th t t cho phn m rng ca tn file. Cch th 2 l
kim tra nhng du hiu c bit trong ni dung ca file a ra kt lun. Cch th 2 ny l
mt trong nhng vic m mt con virus my tnh cn lm ly nhim ln cc file cn thit v
cng l cch mt chng trnh dit virus c th kim tra xem 1 file c b nhim virus hay
khng.
Son tho vn bn chng trnh sau:
#include<stdio.h>
#include<conio.h>
int main()
{
FILE *f;
f=fopen("notepad.exe","rb");
if (f!=NULL)
{
char a,b;
fread(&a,sizeof(char),1,f);
fread(&b,sizeof(char),1,f);
printf("%c %c",a,b);
fclose(f);
}
else
{
printf("Khong mo duoc file");
}
getch();
return 0;
}
Th nghim 1:
- Copy file notepad.exe trong th mc C:\windows\system32 a vo th mc lu gi
chng trnh.
- Chy chng trnh v nhn xt v kt qu hin th trn mn hnh.
- i dng lnh
f=fopen("notepad.exe","rb");
Thnh
f=fopen("calc.exe","rb");

174
- Copy file calc.exe trong th mc C:\windows\system32 a vo th mc lu gi chng
trnh.
- Chy chng trnh v nhn xt v kt qu hin th trn mn hnh.
Th nghim 2:
- Trong th mc lu gi chng trnh, chn mt file c phn m rng l EXE v i tn
thnh myfile.exe.
- i dng lnh
f=fopen("calc.exe","rb");
Thnh
f=fopen("myfile.exe","rb");
- Chy chng trnh v nhn xt v kt qu hin th trn mn hnh.
- Qua kt qu ca th nghim 1 v th nghim 2 c th kt lun s b g v file chng
trnh dng EXE.
Th nghim 3:
- S dng cng c Paint ca windows, to mt nh v ghi vo th mc lu tr chng
trnh vi nh dng file l 24-bit Bitmap v tn file l Anh1.bmp.
- i dng lnh
f=fopen("myfile.exe","rb");
Thnh
f=fopen("Anh1.bmp","rb");
- Chy chng trnh v nhn xt v kt qu hin th trn mn hnh.
- Tng t nh trn to 2 file nh Anh2.bmp v Anh3.bmp.
- Chy chng trnh v kt lun s b v dng file ny.
Th nghim 4:
- V th mc lu tr chng trnh, chy file notepad.exe, chng trnh ny c hot ng
bnh thng khng?
- Son tho chng trnh sau:
#include<stdio.h>
#include<conio.h>
int main()
{
FILE *f;
f=fopen("notepad.exe","r+b");
if (f!=NULL)
{
char a = 'N';
fwrite(&a,sizeof(char),1,f);
fclose(f);
}
else
{
printf("Khong mo duoc file");
}
getch();
return 0;
}
- on chng trnh trn lm g?
- V th mc lu tr chng trnh, chy file notepad.exe, chng trnh ny c hot ng
bnh thng khng? V sao?
- Sa dng lnh char a = 'N'; trong chng trnh trn thnh char a = 'M'; sau nhn F9
chy chng trnh.

175
- V th mc lu tr chng trnh, chy file notepad.exe, chng trnh ny c hot ng
bnh thng khng? V sao?

II. Bi tp t lm
1. Vit chng trnh qun l mt tp tin vn bn theo cc yu cu:
a- Nhp t bn phm ni dung mt vn bn sau ghi vo a.
b- c t a ni dung vn bn va nhp v in ln mn hnh.
c- c t a ni dung vn bn va nhp, in ni dung ln mn hnh v cho php
ni thm thng tin vo cui tp tin .
2. Vit chng trnh cho php thng k s ln xut hin ca cc k t l ch
(A..Z,a..z) trong mt tp tin vn bn.
3. Vit chng trnh m s t v s dng trong mt tp tin vn bn.
4. Vit chng trnh nhp t bn phm v ghi vo 1 tp tin tn l DMHH.DAT vi mi
phn t ca tp tin l 1 cu trc bao gm cc trng: Ma (m hng: char[5]), Ten (Tn
hng: char[20]).Kt thc vic nhp bng cch g ENTER vo Ma. Ta s dng tp tin ny
gii m hng ha cho tp tin DSHH.DAT s cp trong bi 5.
5. Vit chng trnh cho php nhp t bn phm v ghi vo 1 tp tin tn DSHH.Dat vi
mi phn t ca tp tin l mt cu trc bao gm cc trng : mh (m hng: char[5]), sl
(s lng : int), dg ( n gi: float), st (S tin: float) theo yu cu:
- Mi ln nhp mt cu trc
- Trc tin nhp m hng (mh), a mh so snh vi Ma trong tp tin DMHH.DAT
c to ra bi bi tp 1, nu mh=ma th in tn hng ngay bn cnh m hng.
- Nhp s lng (sl).
- Nhp n gi (dg).
- Tnh s tin = s lng * n gi.
Kt thc vic nhp bng cch nh ENTER vo m hng. Sau khi nhp xong yu cu in
ton b danh sch hng ha c s gii m v tn hng theo mu sau:
STT MA TEN HANG SO LG DON GIA SO TIEN
HANG
1 a0101 Duong cat trang 25 10000.00 250000.00
2 b0101 Sua co gai Ha Lan 10 40000.00 400000.00

176
Bi 18 - MT S VN M RNG
Ni dung bi hc
I. Cy, Hm bm
II. Khi ng ho
III. Cc hm ho
IV. X l vn bn trn mn hnh ho
V. Hiu ng hot hnh ha
Vic hin th thng tin trn mn hnh my tnh c thc hin thng qua mt v mch iu khin
mn hnh. Khi mn hnh ch vn bn (text mode) chng ta c th hin th thng tin ln mn
hnh bng cc lnh: printf(), putch(), putchar(), Thng tin m chng ta cn a ra mn hnh
c chuyn ti v mch iu khin mn hnh di dng m k t ASCII. V mch ni trn c
nhim v a k t theo mu nh sn ra mn hnh v tr c xc nh bi chng trnh ca
chng ta.
Ngoi ch vn bn, mn hnh cn c th lm vic trong ch ho. Khi mn hnh
ch ha chng ta c th v th, vit ch to hoc th hin cc hnh nh khc - nhng vic
m chng ta khng th thc hin c trong ch vn bn.
Cc hm v th tc ho c khai bo trong file graphics.h.

I. Cy, Hm bm
1. Cy
- Danh sch phi tuyn l danh sch cc i tng cn lu tr khng theo m hnh dy lit
k lin tc. Trong thc t nhiu kiu d liu khng biu din di dng danh sch lin tip v th
cn m hnh d liu khc m t cc kiu d liu ny. V d m t cc cy tm kim, th,
- Trong phn ny s trnh by cu trc d liu ng m t cy trong my tnh. Cy l cu
trc d liu ch cc nt, mi nt c th tr n khng hoc nhiu nt khc (con) c cng cu trc
nh n. Bn thn nh ngha cu l mt nh ngha qui bi chnh mt nt tr n c th nhiu
nt khc, chnh cc nt c tr n ny cng l mt cy.

-
- Hnh 1. M hnh cy.

177
- Theo hnh v, nt (5) l mt cy c hai con l (3), (7), nhng bn thn (3), (7) cng l
mt cy.
- Cc phn t trn c th khng c con (2), (5), (8), hoc c nhiu con ty thuc vo mc
tiu thit k v m t ca h thng. Trong bi ny s gii hiu v m hnh cy c nhiu nht l
hai con. M hnh cy nh phn tm kim nh sau: mi nh c nhiu nht l hai con, cc nt con
thuc cy tri lun b hn nh, v cc nt ca cy con phi lun ln hn hoc bng nh. Cc
thao tc vi cy bao gm khi ti init(), thm phn t - appendlabel(), tm kim phn t trong
cy seach(), gii phng cy dispose(), v c thm c thm mt s thao tc khc.
- - Khi to cy
- Hm init()
- - D liu vo: con tr n con tr cy
typedef struct trees{
int label;
trees *left, *right;
};
void init(trees ** top)
{
*top=NULL;
}

- - Thm phn t vo cy, m bo theo qui tc m t


- Hm appendlabel()
- - D liu vo: con tr n con tr cy, phn t cn thm vo
- - return: 1 nu khng thnh cng, 0 nu thm thnh cng
int append(trees **top, trees *temp)
{
trees *t=(*top);
if(t->label<temp->label)
{
if(t->left==NULL)
{
t->left=temp;
return 0;
}
return append(&(t->left),temp);
}
else
{
if(t->right==NULL)
{
t->right=temp;
return 0;
}
return append(&(t->right),temp);

178
}
int appendlabel(trees ** top, int label)
{
trees *temp;
temp=(trees*)malloc(sizeof(trees));
if(temp==NULL)
{
return 1;
}
temp->label=label;
temp->left=NULL;
temp->right=NULL;
if(*top==NULL)
{
*top=temp;
return 0;
}
return append(top,temp);
}

- - Tm kim tra s xut hin ca phn t trong cy


- Hm search()
- - D liu vo: con tr n con tr cy, gi tr cn tm kim
- - return: con tr null nu khng tm thy, ngc li con tr n nt tm thy
trees * search(trees **top,int label)
{
if(*top==NULL)
{
return NULL;
}
printf("Tim kiem cho %d ",(*top)->label);
if((*top)->label==label)
{
return (*top);
}
if((*top)->label<label)
{
printf(" --> trai\n");
return search(&((*top)->left),label);
}
else
{
printf(" --> phai\n");
return search(&((*top)->right),label);
}
}

- - Gii phng ton b cc phn t ca cy


- Hm dispose()

179
- - D liu vo: con tr n con tr nh ca cy
void dispose(trees **top)
{
if(*top==NULL)
{
return ;
}
dispose(&((*top)->left));
dispose(&((*top)->right));
delete(*top);
*top=NULL;
}

- Chng trnh th nghim


int main(int argc,char* argv[])
{
trees *top, *t;
init(&top);
appendlabel(&top,10);
appendlabel(&top,7);
appendlabel(&top,15);
appendlabel(&top,12);
appendlabel(&top,18);
appendlabel(&top,6);
appendlabel(&top,9);
t=search(&top,12);
if(t!=NULL)
{
printf("Tim thay\n");
}
else
{
printf("Khong tim thay\n");
}
dispose(&top);
getch();
return 0;
}

- Kt qu chng trnh

2. Hm bm
Tham kho: http://vi.wikipedia.org/wiki/H%C3%A0m_b%C4%83m
Hm bm (ting Anh: hash function) l gii thut nhm sinh ra cc gi tr bm tng ng vi
mi khi d liu (c th l mt chui k t, mt i tng trong lp trnh hng i tng,
v.v...). Gi tr bm ng vai gn nh mt kha phn bit cc khi d liu, tuy nhin, ngi ta
chp hin tng trng kha hay cn gi l ng v c gng ci thin gii thut gim thiu
s ng . Hm bm thng c dng trong bng bm nhm gim chi ph tnh ton khi tm

180
mt khi d liu trong mt tp hp (nh vic so snh cc gi tr bm nhanh hn vic so snh
nhng khi d liu c kch thc ln).
V tnh thng dng ca bng bm, ngy nay, a s ngn ng lp trnh u cung cp th vin ng
dng bng bm, thng gi l th vin collection trong c cc vn nh: tp
hp (collection), danh sch (list), bng(table), nh x (mapping), t in (dictionary)). Thng
thng, cc lp trnh vin ch cn vit hm bm cho cc i tng nhm tch hp vi th
vin bng bm c xy dng sn.
Mt hm bm tt phi tha mn cc iu kin sau:
- Tnh ton nhanh.
- Cc kho c phn b u trong bng.
- t xy ra ng .
- X l c cc loi kha c kiu d liu khc nhau
Xem thm ti liu tham kho, internet bit chi tit.

II. Khi ng ho
Chuyn ch mn hnh v ch ha cho php thc hin cc lnh v i tng ha.
C php: void initgraph(int *graphdriver,int graphmode,char *driverpath);
Trong :
+ driverpath: l xu k t ch ng dn n th mc cha cc tp tin iu khin ho.
+ graphdriver: cho bit mn hnh ho s dng trong chng trnh.
+ graphmode: cho bit mode ho s dng trong chng trnh.
Bng 13-1
Cc gi tr c th ca graphdriver v graphmode
Graphdriver graphmode phn gii
CGA (1) CGAC0 (0) 320x200
CGAC1 (1) 320x200
CGAC2 (2) 320x200
CGAC3 (3) 320x200
CGAHI (4) 640x200
MCGA (2) MCGA0 (0) 320x200
MCGA1 (1) 320x200
MCGA2 (2) 320x200
MCGA3 (3) 320x200
MCGAMed (4) 640x200
MCGAHI (5) 640x480
EGA (3) EGAL0 (0) 640x200
EGAHI (1) 640x350
EGA64 (4) EGA64LO (0) 640x200
EGA64HI (1) 640x350
EGAMONO (5) EGAMONOHi (0) 640x350
VGA (9) VGALO (0) 640x200

181
VGAMED (1) 640x350
VGAHI (2) 640x480
HERCMONO (7) HERCMONOHI 720x348
ATT400 (8) ATT400C0 (0) 320x200
ATT400C1 (1) 320x200
ATT400C2 (2) 320x200
ATT400C3 (3) 320x200
ATT400MED (4) 640x400
ATT400HI (5) 640x400
PC3270 (10) PC3270HI (0) 720x350
IBM8514 (6) PC3270LO (0) 640x480 256 mu
PC3270HI (1) 1024x768 256 mu
Bng trn cho thy phn gii ca mn hnh ph thuc c vo kiu mn hnh v mode.
V d nh trong mn hnh EGA nu dng EGALO th phn gii l 640x200 (Hm getmaxx()
cho gi tr cc i ca s im theo chiu ngang ca mn hnh. Hm getmaxy() cho gi tr cc
i ca s im theo chiu dc ca mn hnh.).
V d: Khi to ha trong mi trng lp trnh Turbo C. Gi s my tnh c mn hnh
VGA, cc tp tin ho cha trong th mc C:\TC \BGI, khi ta khi ng ch ho cho
mn hnh nh sau:
#include <graphics.h>
main()
{
int mh=VGA,mode=VGAHI; /*Hoc mh=9,mode=2*/
initgraph(&mh,&mode,"C:\\TC\\BGI");
}

Nu khng bit chnh xc kiu mn hnh ang s dng th ta gn cho bin graphdriver
bng DETECT hay gi tr 0. Khi , kt qu ca initgraph s l:
Kiu mn hnh ang s dng c pht hin, gi tr ca n c gn cho bin
graphdriver.
Mode ho phn gii cao nht ng vi mn hnh ang s dng cng c pht
hin v gi tr ca n c gn cho bin graphmode.
Nh vy dng hng s DETECT chng nhng c th khi to c ch ho cho
mn hnh hin c theo mode c phn gii cao nht m cn gip ta xc nh kiu mn hnh
ang s dng.
V d khi to ha trong mi trng DevC++.
Kim tra tnh tn ti ca file tiu th vin graphics.h trong th mc include, v th
vin libbgi.a lib.

182
To mt project trong ca s option ca project chn tab Parameters chn cc file th
vin:
-libbgi
-libgdi32
-libcomdlg32
-libuuid
-liboleaut32
-libole32
Khi to ging nh trong Turbo C, vi tham s cui cng l chui trng.
#include <graphics.h>
main()
{
int mh=VGA,mode=VGAHI; /*Hoc mh=9,mode=2*/
initgraph(&mh,&mode," ");
}

V d: Chng trnh di y xc nh kiu mn hnh ang s dng:


#include <graphics.h>
#include <stdio.h>
main()
{
int mh=0, mode;
initgraph(&mh,&mode,"C:\\TC\\BGI");
closegraph();
printf("\n Gia tri so cua man hinh la: %d",mh);
printf("\n Gia tri so mode do hoa la: %d",mode);

getch();
}

Nu chui dng xc nh driverpath l chui rng th chng trnh dch s tm kim


cc file iu khin ho trn th mc hin thi v th ca ca trnh bin dch.
Ch : Mn hnh ha my tnh c xc nh ta theo chiu t tri sang phi v t
trn xung di khc vi ta khng gian decac.

x
(0,0)

V th khi v hnh trn mn hnh cn chuyn trc ta v v tr ph hp, v o trc ta


theo ta thc.

183
III. Cc hm ho
1. Mu v mu
t mu nn: t mu cho ton b nn trong Turbo C, trong DevC++ t mu nn
cho cc lnh c v nn sau.
C php: void setbkcolor(int cl);
+ cl: l mu cn t, xem bng mu di
trong DevC++ c th s dng thm lnh bar in ton b mn hnh vi mu nn.
t mu ng v: t mu v ng trong cc lnh v sau .
C php: void setcolor(int cl);
+ cl: mu cn t, xem bng mu di
t mu (kiu) t v mu t: t mu (kiu) t v mu t ta dng th tc c in
nn.
C php: void setfillstyle(int par, int cl);
+ pr: kiu in, theo bng di
+ cl: kiu mu, theo bng di.
Bng 13-2
Cc gi tr mu
Tn hng Gi tr s Mu hin th
BLACK 0 en
BLUE 1 Xanh da tri
GREEN 2 Xanh l cy
CYAN 3 Xanh l
RED 4
MAGENTA 5 Tm
BROWN 6 Nu
LIGHTGRAY 7 Xm nht
DARKGRAY 8 Xm m
LIGHTBLUE 9 Xanh xa tri nht
LIGHTGREEN 10 Xanh l cy nht
LIGHTCYAN 11 Xanh l nht
LIGHTRED 12 nht
LIGHTMAGEN 13 Tm nht
TA
YELLOW 14 Vng
WHITE 15 Trng

184
Bng 13-3
Cc kiu mu t
Tn hng Gi tr s Kiu mu t
EMPTY_FILL 0 T bng mu nn
SOLID_FILL 1 T bng ng lin nt
LINE_FILL 2 T bng ng --------
LTSLASH_FILL 3 T bng ///
SLASH_FILL 4 T bng /// in m
BKSLASH_FILL 5 T bng \\\ in m
LTBKSLASH_FILL 6 T bng \\\
HATCH_FILL 7 T bng ng gch bng
nht
XHATCH_FILL 8 T bng ng gch bng
ch thp
INTERLEAVE_FIL 9 T bng ng t qung
L
WIDE_DOT_FILL 10 T bng du chm tha
CLOSE_DOT_FILL 11 T bng du chm mau

Chn li gi tr mu cho mu c bn: 16 mu c bn c chn t danh sch 256


mu. H thng cho ngi dng t chn li mu c bn t 256 mu.
C php: void setpalette(int clOr, int cl );
+ clOr: v tr ca mu trong bng mu c bn
+ cl: Mu c a vo theo danh sch 256;
V d: Cu lnh: setpalette(0,lightcyan); i mu u tin trong bng mu thnh mu
xanh l nht. Cc mu khc khng b nh hng. Lnh ny khng thc s c hiu qu trong
DevC++;
Ly bng mu hin thi:
- Ly mu v hin thi, tr v mu xc nh bng th tc setcolor ngay trc n.
C php: int getcolor()
- Ly mu nn hin thi, tr v mu nn t bi hm setbkcolor trc .
C php: int getbkcolor()

2. V v t mu ng trn
C th chia cc ng v hnh thnh bn nhm chnh:
Cung trn v hnh trn.

185
ng gp khc v a gic.
ng thng.
Hnh ch nht.
Cung trn v ng trn
Nhm ny bao gm: Cung trn, ng trn, cung elip v hnh qut.
Cung trn: v mt cung trn
C php: void arc(int x, int y, int gd, int gc, int r);
+ (x,y): l to tm cung trn.
+ gd: l gc u cung trn(0 n 360 ).
+ gc: l gc cui cung trn (gd n 360 ).
+ r: l bn knh cung trn .
V d:
V mt cung trn c tm ti (100,50), gc u l 0, gc cui l 180, bn knh 30.
arc(100,50,0,180,30);

ng trn: v ng trn
C php: void circle(int x, int y, int r);
+ (x,y) : l to tm cung trn.
+r : l bn knh ng trn.
V d:
V mt ng trn c tm ti (100,50) v bn knh 30.
circle(100,50,30);

Cung elip: v mt cung elip


C php: void ellipse(int x, int y, int gd, int gc, int xr, int yr);
+ (x,y) : l to tm cung elip.
+ gd : l gc u cung trn(0 n 360 ).
+ gc : l gc cui cung trn (gd n 360 ).
+ xr : l bn trc nm ngang.
+ yr : l bn trc thng ng.
V d:
V mt cung elip c tm ti (100,50), gc u l 0, gc cui l 180, bn trc ngang 30,
bn trc ng l 20.
ellipse(100,50,0,180,30,20);

Hnh qut: v v t mu mt hnh qut


C php: void pieslice(int x, int y, int gd, int gc, int r);
+ (x,y) : l to tm hnh qut.
+ gd : l gc u hnh qut (0 n 360 ).
+ gc : l gc cui hnh qut (gd n 360 ).

186
+ r: l bn knh hnh qut .
V d: Chng trnh di y s v mt cung trn gc phn t th nht, mt cung elip gc
phn t th ba, mt ng trn v mt hnh qut qut t 90 n 360 .
# include "graphics.h"
#include "stdio.h"
#include "conio.h"
main()
{
int md=0,mode;
initgraph(&md,&mode,"C:\\TC\\BGI");
setbkcolor(BLUE);
setcolor(YELLOW);
setfillstyle(SOLID_FILL,RED);;
arc(160,50,0,90,45);
circle(160,150,45);
pieslice(480,150,90,360,45);
getch();
closegraph();
}

3. V ng gp khc v a gic
V ng gp khc: Mun v ng gp khc i qua n im: (x1,y1), (x2,y2), ...., (xn,yn)
cc to (xi,yi) c gn cho mt mng a kiu int theo nguyn tc sau:
To x1 gn cho a[0]
To y1 gn cho a[1]
To x2 gn cho a[2]
To y2 gn cho a[3]
....
To xn gn cho a[2n-2]
To yn gn cho a[2n-1]
Sau gi hm:
C php: void drawpoly(n,a);
n: s im cn v tng ng s lng im c lu tr trong a
a: Cc im trn ng gp khc c lu tr theo m hnh trn
Nu im cui cng (xn,yn) trng vi im u (x1,y1) th ng gp khc khc khp
kn.
V d v tam gic
int a[8]={10,10,100,100,10,100,10,10};
drawpoly(4,a);
T mu a gic: V a gic v t mu cho phn a gic v
C php: void fillpoly(n,a);
n: s im cn v

187
a: danh sch cc im cn v
s v v t mu mt a gic c nh l cc im (x1,y1), (x2,y2), ...., (xn,yn)
V d: V mt ng gp khc v hai ng tam gic.
#include "graphics.h"
#include "stdio.h"
#include "conio.h"
int poly1[]={5,200,190,5,100,300};
int poly2[]={205,200,390,5,300,300};
int poly3[]={405,200,590,5,500,300,405,200};
main()
{
int md=0,mode;
initgraph(&md,&mode,"C:\\TC\\BGI");
setbkcolor(CYAN);
setcolor(YELLOW);
setfillstyle(SOLID_FILL,MAGENTA);
drawpoly(3,poly1);
fillpoly(3,poly2);
fillpoly(4,poly3);
getch();
closegraph();
}

V ng thng: ng thng ni hai im


C php: void line(int x1, int y1, int x2, int y2);
+ (x1,y1): ta im 1
+ (x2,y2): ta im 2
V ng thng: ng thng t im con tr ha hin ti n im mi
C php: void lineto(int x, int y);
(x,y): im s v n t con tr ha hin ti
V ng thng: ng thng t im con tr ha hin ti n im cch im hin ti
mt khong
C php: void linerel(int dx, int dy);
(dx,dy): khong cch vi con tr ha hin ti, nu im hin ti l (x,y) th im mi cn v
l (x+dx, y+dy)
Di chuyn con chy ho: di chuyn con chy n v tr mi
C php: void moveto(int x, int y);
+ (x,y): im con tr ha mi
V d:
moveto(200,100);
line(100,100,1,1);
lineto(100,200);
linerel(100,100);

Chn kiu ng: kiu ng v cc ng thng, a gic ,

188
C php : void setlinestyle(int linestyle, int par, int thin);
+ linestyle : kiu ng, c miu t di
+ par : nu tham s th nht l USERBIT_LINE th tun th theo bit ca tham s ny to ra
im v.
+ thin : dy ca ng c miu t di
Bng 13-4
M t kiu ng
Tn hng Gi tr s Kiu ng
SOLID_LINE 0 Nt lin
DOTTED_LINE 1 Nt chm
CENTER_LINE 2 Nt chm gch
DASHED_LINE 3 Nt gch
USERBIT_LINE 4 Mu t to
Bng 13-5
M t dy ca ng
Tn hng Gi tr s B dy
NORM_WIDTH 1 B dy bnh thng
THICK_WIDTH 3 B dy gp ba

V d: Chng trnh v mt ng gp khc bng cc on thng. ng gp khc i qua cc


nh sau:
(20,20),(620,20),(620,180),(20,180) v (320,100)
#include "graphics.h"
#include "stdio.h"
#include "conio.h"
main()
{
int mh=0, mode;
initgraph(&mh,&mode,"C:\\TC\\BGI");
setbkcolor(BLUE);
setcolor(YELLOW);
setlinestyle(SOLID-LINE,0,THICK_WIDTH);
moveto(320,100); /* con ch?y ? v? tr ( 320,100 ) */
line(20,20,620,20); /* con ch?y v?n ? v? tr ( 320,100 ) */
linerel(-300,80);
lineto(620,180);
lineto(620,20);
getch();
closegraph();
}

189
4. V im, min
V im: v im nh trn mn hnh vi mu xc nh
C php: void putpixel(int x, int y, int color);
+ (x,y): ta im cn v
+ color: mu v
Ly mu im v: xc nh mu ca mt im trn mn hnh
C php: unsigned getpixel(int x, int y);
+ (x,y): Ta ca im cn ly mu
+ gi tr tr v l mu ca im trn mn hnh
T min: T mu cho mt min kn c xc nh bi mu bin, nu vng khng kn s t
mu ht vng lm vic.
C php: void floodfill(int x, int y, int border);
+(x,y): ta xc nh im t mu u tin
+ border: mu ca vng bin
V d: V mt ng trn mu trn mn hnh mu xanh. To (x,y) ca im gieo c
np t bn phm. Tu thuc gi tr c th ca x,y chng trnh s t mu vng cho hnh trn hoc
phn mn hnh bn ngoi hnh trn.
#include "graphics.h"
#include "stdio.h"
#include <conio.h>
main()
{
int mh=0,mode=0, x, y;
printf("\nVao toa do x,y:");
scanf("%d%d",&x,&y);
initgraph(&mh,&mode,"");
setbkcolor(BLUE);
setcolor(RED);
setfillstyle(11,YELLOW);
circle(320,100,50);
moveto(1,150);
floodfill(x,y,RED);
getch();
closegraph();
}

5. Hnh ch nht
V hnh ch nht: xc nh hai nh l gc tri trn cng, v gc phi di cng ca hnh
ch nht
C php: void rectangle(int x1, int y1, int x2, int y2);
+ (x1,y1) : ta gc tri, pha trn hnh ch nht
+ (x2,y2) : ta gc phi pha di hnh ch nht

190
V hnh ch nht c to kn: v hnh ch nht vi min trong c t mu
C php : void bar(int x1, int y1, int x2, int y2);
+ (x1,y1) : ta gc tri, pha trn hnh ch nht
+ (x2,y2) : ta gc phi pha di hnh ch nht
V hnh ch nht c t bng: v hnh ch nht c t bng 3D.
C php: void bar3d(int x1, int y1, int x2, int y2, int depth, int top);
+ (x1,y1) : ta gc tri, pha trn hnh ch nht
+ (x2,y2) : ta gc phi pha di hnh ch nht
+ depth: su ca t bng
+ top: v nh (0: khng v, 1: v)
V d: Chng trnh di y to nn mt hnh ch nht, mt khi hnh ch nht v mt hnh
hp c np:
#include "graphics.h"
main()
{
int mh=0,mode=0;
initgraph(&mh,&mode,"");
setbkcolor(GREEN);
setcolor(RED);
setfillstyle(CLOSE_DOT_FILL,YELLOW);
rectangle(5,5,300,160);
bar(3,175,300,340);
bar3d(320,100,500,340,100,1);
getch();
closegraph();
}

6. Ca s (Viewport)
Thit lp viewport: to ca s lm vic o trn mn hnh.
C php: void setviewport(int x1, int y1, int x2, int y2, int clip);
+ (x1,y1) : ta gc trn bn tri
+ (x2,y2) : ta gc di bn phi
+ clip : 0 : cho php v ra ngoi viewport, 1 : khng cho php v ra ngoi viewport
V d:
setviewport(100,50,200,150,0);
line(-20,-20,50,50);
Lp nn mt vng viewport hnh ch nht c to gc tri cao l (100,50) v to gc phi
thp l (200,150) (l to trc khi t viewport).
Ch : Sau khi lp viewport, ta c h to mi m gc trn bn tri s c to (0,0).
Nhn din viewport hin hnh: thng tin v viewport hin hnh.
C php : void getviewsetting(struct viewporttype *vp);

191
vp: thng tin v viewport hin thi,
cu trc ca viewport
struct viewporttype
{
int left,top,right,bottom;
int clip;
};
Xa viewport: xa cc i tng v trong viewport
C php: void clearviewport(void);
Xo mn hnh, a con chy v to (0,0) ca mn hnh:
C php: void cleardevice(void);
To m dng:
Vi ch cho php v ra ngoi viewport, cc hm ha c th v ra ngoi viewport vi ta
m.
int xc,yc;
xc=getmaxx()/2;
yc=getmaxy()/2;
setviewport(xc,yc,getmaxx(),getmaxy(),0);
Nh th, mn hnh s c chia lm bn phn vi to m dng nh sau:
Phn t tri trn: x m, y m.
x: t -getmaxx()/2 n 0.
y: t -getmaxy()/2 n 0.
Phn t tri di: x m, y dng.
x: t -getmaxx()/2 n 0.
y: t 0 n getmaxy()/2.
Phn t phi trn: x dng, y m.
x: t 0 n getmaxx()/2.
y: t -getmaxy()/2 n 0.
Phn t phi di: x dng, y dng.
x: t 0 n getmaxx()/2.
y: t 0 n getmaxy()/2.
V d: Chng trnh v th hm sin x trong h trc to m dng. Honh x ly cc gi
tr t -4 n 4. Trong chng trnh c s dng hai hm mi l settextjustify v outtextxy ta s
cp ngay trong phn sau.
#include "graphics.h"
#include "conio.h"
#include "math.h"

192
#define TYLEX 20
#define TYLEY 60
main()
{
int mh=0,mode=DETECT;
int x,y,i;
initgraph(&mh,&mode,"");
setviewport(getmaxx()/2,getmaxy()/2,getmaxx(),getmaxy(),0);
setbkcolor(BLUE);
setcolor(YELLOW);
line(-getmaxx()/2,0,getmaxx()/2,0);
line(0,-getmaxy()/2,0,getmaxy()/2);
settextjustify(1,1);
setcolor(WHITE);
outtextxy(0,0,"(0,0)");
for (i=-400;i<=400;++i)
{
x=floor(2*M_PI*i*TYLEX/200);
y=floor(sin(2*M_PI*i/200)*TYLEY);
putpixel(x,y,WHITE);
}
getch();
closegraph();
}

IV. X l vn bn trn mn hnh ho


1. Hin th vn bn trn mn hnh ho
C php: void outtext(char *s);
s: chui vn bn c hin th ti v tr con tr ha hin ti
C php: void outtextxy(int x, int y,char *s);
(x,y): ta s hin th chui
s: chui vn bn s c hin th
V d:
Hai cch vit di y:
outtextxy(50,50, Say HELLO);

v
moveto(50,50);
outtext( Say HELLO);

cho cng kt qu.

2. S dng cc Fonts ch
Cc Fonts ch nm trong cc tp tin *.CHR trn a. Cc Fonts ny cho cc kch thc
v kiu ch khc nhau, chng s c hin th ln mn hnh bng cc hm outtext v outtextxy.
chn v np Fonts ta dng hm:
C php : void settextstyle(int font, int direction, int charsize);

193
+ font : la chn kiu ch v nhn mt trong cc hng sau:
DEFAULT_FONT=0
TRIPLEX_FONT=1
SMALL_FONT=2
SANS_SERIF_FONT=3
GOTHIC_FONT=4
+ derection: chn hng ch v nhn mt trong cc hng sau:
HORIZ_DIR=0 vn bn hin th theo hng nm ngang t tri qua phi.
VERT_DIR=1 vn bn hin th theo hng thng ng t di ln trn.
+ Charsize: l h s phng to ca k t v c gi tr trong khong t 1 n 10.
Khi charsize=1, font hin th trong hnh ch nht 8*8 pixel.
Khi charsize=2 font hin th trong hnh ch nht 16*16 pixel.
............
Khi charsize=10, font hin th trong hnh ch nht 80*80 pixel.
Cc gi tr do settextstyle lp ra s gi nguyn ti khi gi mt settextstyle mi.
V d:
Cc dng lnh:
settextstyle(3,1,3);//DevC++ khng chuyn thng ng
outtextxy(30,30,"GODS TRUST YOU");

s hin th ti v tr (30,30) dng ch GODS TRUST YOU theo chiu t di ln trn, font ch
chn l SANS_SERIF_FONT v c ch l 2.
t v tr hin th ca cc xu k t cho bi outtext v outtextxy:
C php: void settextjustify(int horiz, int vert);
+ horiz: c th l mt trong cc hng s sau:
LEFT_TEXT=0 ( Vn bn xut hin bn phi con chy).
CENTER_TEXT ( Chnh tm vn bn theo v tr con chy).
RIGHT_TEXT (Vn bn xut hin bn tri con chy).
+ vert: c th l mt trong cc hng s sau:
BOTTOM_TEXT=0 ( Vn bn xut hin pha trn con chy).
CENTER_TEXT=1 ( Chnh tm vn bn theo v tr con chy).
TOP_TEXT=2 ( Vn bn xut hin pha di con chy).
V d:
settextjustify(1,1);
outtextxy(100,100,"ABC");

3. B rng v chiu cao ca k t


- Chiu cao ca chui k t
C php: int textheight(char *s);

194
+ s: chui k t cn kim tra
+ tr v cao ca chui k t khi in ra mn hnh tnh bng pixel.
V d 1:
Vi font bit map v h s phng i l 1 th textheight(A) ch gi tr l 8.
V d 2:
#include "stdio.h"
#include "graphics.h"
main()
{ int mh=0,mode=DETECT, y,size;
initgraph(&mh,&mode,"C:\\TC\\BGI");
y=10;
settextjustify(0,0);
for (size=1;size<5;++size)
{ settextstyle(0,0,size);
outtextxy(0,y,"SACRIFICE");
y+=textheight("SACRIFICE")+10;
}
getch();
closegraph();
}

- B rng ca k t:
C php: int textwidth(char *s);
+ s: chui k t cn kim tra
+ tr v rng ca chui k t khi in ln mn hnh

V. Hiu ng hot hnh ha


Hiu ng hot hnh l hiu ng cc i tng di chuyn trn mn hnh. Bn cht ca vic dch
chuyn trn mn hnh l xa v tr c v v i tng sang v tr mi.
- Xa v tr c bng cch v i tng vi mu ca mu nn
V d v qu bng di chuyn t gc trn tri xung gc phi di
#include "graphics.h"
#include "stdio.h"
#include "conio.h"
#include <dos.h>
int draw(int x, int y, int color)
{
setcolor(color);
setbkcolor(color);
setfillstyle(0,color);
pieslice(x,y,0,360,10);
return 0;
}
main()
{
int i,x,y;
int dx=5;
int dy=5;
int md=0,mode;

195
initgraph(&md,&mode,"C:\\TC\\BGI");
x=10;
y=10;
while(!kbhit())
{
draw(x,y,15);
delay(10);
draw(x,y,0);
x+=dx;
y+=dy;
if(y<10 || y>300)
dy=-dy;
if(x<10 || x>400)
dx=-dx;
}
getch();
closegraph();
}
- Trong tnh hung nn c hnh nh khc vic v li mu nn s xa cc i tng trn nn.
gii quyt vn ny cn phi lu tr li tnh trng mn hnh trc khi v, sau hi phc li
mn hnh tip tc v sang v tr mi.
#include "graphics.h"
#include "stdio.h"
#include "conio.h"
#include <dos.h>
#define r 5
char *b;
int draw(int x, int y, int color)
{
setcolor(color);
setbkcolor(color);
setfillstyle(0,color);
pieslice(x,y,0,360,r);
return 0;
}
int main()
{
int i,x,y;
int dx=5;
int dy=5;
delay(10);
int md=0,mode=0;
initgraph(&md,&mode,"C:\\TC\\BGI");
b=(char*)malloc(imagesize(1,1,2*r+1,2*r+1));
if(b==NULL)
{
closegraph();
return -1;
}
line(0,0,getmaxx(),getmaxy());
line(0,getmaxy(),getmaxx(),0);
x=10;
y=10;

196
while(!kbhit())
{
getimage(x-r,y-r,x+r,y+r,b);
draw(x,y,15);
delay(10);
putimage(x-r,y-r,b,COPY_PUT);
x+=dx;
y+=dy;
if(y<10 || y>310)
dy=-dy;
if(x<10 || x>420)
dx=-dx;
}
getch();
free(b);
closegraph();
return 0;
}

VI. Tm tt ni dung bi hc
I. Cy, Hm bm
II. Khi ng ho
III. Cc hm ho
IV. X l vn bn trn mn hnh ho
V. Hiu ng hot hnh ha

VII. Bi tp
Xem Bi 19 - Bi tp thc hnh Lm vic vi File v Thut ton nng cao

197
Bi 19 - Bi thc hnh: MT S VN M RNG
I. Bi tp lm theo yu cu
1. Ci t cy nh phn tm kim theo v d trong phn I.1.

2. Ci t hiu ng hot hnh nu trong phn V.

II. Bi tp t lm
1. Vit chng trnh cho php hin th ng h vi tng t (ng h kim) c hai kim
gi v pht. S dng hm gettime ly d liu. Theo thi gian cc kim chy hin th
ng hin trng ca ng h my tnh.
2. Vit chng trnh m t dao ng ca con lc n.
3. V th hm s f(x)=3x3+4x2-x-1, trong khong [-4,4] .

198
Bi 20 - N TP
I. Nhng vn l thuyt
Bi 1 - TNG QUAN
I. Gii thiu
II. Bi ton v vic gii bi ton trn my tnh
III. Cng c lp trnh
Bi 2 - NGN NG LP TRNH C/C++
I. Gii thiu
II. Mt s khi nim c bn
III. Cu trc mt chng trnh n gin
IV. Nhp/Xut d liu
Bi 3 - Bi thc hnh: MI TRNG LP TRNH V CC LNH VO/RA
I. Lm quen mi trng Dev-C++
II. Bi tp lm theo yu cu
III. Bi tp t lm
Bi 4 - IU KHIN CHN
I. Khi lnh
II. Lnh IF
III. Lnh SWITCH
Bi 5 - Bi thc hnh: IU KHIN CHN
I. Bi tp lm theo yu cu
II. Bi tp t lm
Bi 6 - IU KHIN LP
I. Lnh FOR
II. Lnh WHILE
III. Lnh DO .. WHILE
IV. Lnh break v continue
Bi 7 - Bi thc hnh: IU KHIN LP
I. Bi tp lm theo yu cu
II. Bi tp t lm
Bi 8 - MNG V CON TR
I. Mng
II. Con tr
Bi 9 - Bi thc hnh: MNG V CON TR
I. Bi tp lm theo yu cu
II. Bi tp t lm
Bi 10 - XU K T
I. Khai bo
II. Nhp xut chui
III. Mt s hm x l chui
Bi 11 - Bi thc hnh: XU K T
I. Bi tp lm theo yu cu
II. Bi tp t lm
Bi 12 - HM V CU TRC CHNG TRNH
I. T chc chng trnh
II. Hm do ngi dng nh ngha
III. Con tr hm
IV. qui
Bi 13 - Bi thc hnh: HM V CU TRC CHNG TRNH
I. Bi tp lm theo yu cu

199
II. Bi tp t lm
Bi 14 - CU TRC D LIU DO NGI DNG T NH NGHA
I. Cu trc d liu do ngi dng t nh ngha
II. Ngn xp
III. Hng i
Bi 15 - Bi thc hnh: CU TRC D LIU DO NGI DNG T NH NGHA
I. Bi tp lm theo yu cu
II. Bi tp t lm
Bi 16 - LM VIC VI FILE
I. Mt s khi nim
II. Cc thao tc trn tp tin
III. Truy cp tp tin vn bn
IV. Truy cp tp tin nh phn
Bi 17 - Bi thc hnh LM VIC VI FILE
I. Bi tp lm theo yu cu
II. Bi tp t lm
Bi 18 - MT S VN M RNG
I. Cy, Hm bm
II. Khi ng ho
III. Cc hm ho
IV. X l vn bn trn mn hnh ho
V. Hiu ng hot hnh ha
Bi 19 - Bi thc hnh: MT S VN M RNG
I. Bi tp lm theo yu cu
II. Bi tp t lm
Bi 20 - N TP

II. Nhng vn v thc hnh


1. Gii quyt mt bi ton trn my tnh bt u nh th no?
2. Nhng vn cn ch trong lp trnh

200

You might also like