You are on page 1of 343

TopTaiLieu.

Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Li ni u
250 bi tp k thut lp trnh C (230 bi tp chnh thc, 20 bi tp b sung) trong tp
sch ny c chn lc t cc bi tp thc hnh mn Ngn ng lp trnh C v Lp
trnh Cu trc d liu bng ngn ng C cho sinh vin i hc v Cao ng chuyn
ngnh Cng ngh Thng tin.
Cc bi tp c sp xp theo mt trnh t nht nh, nhm m bo cho ngi
c nm vng mt cch c h thng cc kin thc cn thit ca k thut lp trnh ni
chung v ngn ng lp trnh C ni ring; chun b nn tng cho cc mn hc c lin
quan. Mc d c gng duyt qua cc vn c bn ca ngn ng lp trnh C, nhng
tp sch ny c vit vi mc tiu cng c v nng cao kh nng lm vic vi ngn
ng C.
Khc vi cc sch bi tp khc, cc bi tp trong tp sch ny u c hng dn gii
chi tit. Khi hng dn gii bi tp, chng ti c gng:
- Th hin mt gc nhn ring v k thut lp trnh bng ngn ng C, ch n
nhng c im ca ngn ng C. Ni cch khc, chng ti ch n lp trnh theo
phong cch ca C.
- Phn tch qu trnh t duy khi gii quyt vn , cng c cc kin thc ton hc
cng nh lp trnh c bn, nhm lm ni bt vai tr ca ngn ng lp trnh nh mt
cng c h tr mang tnh thc t cao.
- Lp trnh tht ngn gn v r rng gip ngi c hiu r vn . Nng cao k
nng lp trnh. Ngi c s thy th v v bt ng vi mt s k thut gii quyt
vn .
- Theo chun ANSI/ISO C89 ph hp vi nh trng Vit nam, chun mi nht l
ANSI/ISO C11 (ISO/IEC 9899:2011).
- Cc bi gii ca 250 bi tp v cc phng n gii khc c kim tra bng
Cppcheck 1.72 (cppcheck.sourceforge.net).
Chng ti tin rng tp sch ny s gip ngi c tht s cng c v nng cao kin
thc lp trnh vi ngn ng C.
Mc d dnh rt nhiu thi gian v cng sc cho tp sch, phi hiu chnh nhiu
ln v chi tit, nhng tp sch khng th no trnh c nhng sai st v hn ch.
Chng ti tht s mong nhn c cc kin gp t bn c tp sch c th
hon thin hn.
Xin chn thnh cm n anh L Gia Minh xem v ng gp nhiu kin qu gi
cho tp sch. Cm n bn Nguyn nh Song Ton khuyn khch ti hc C. Cm
n cc anh Thn Vn S, L Mu Long, Nguyn Minh Nam, ti hc tp c rt
nhiu kinh nghim t cc anh.

Phin bn
Cp nht ngy: 08/03/2016

Thng tin lin lc


Mi kin v cu hi c lin quan xin vui lng gi v:
Dng Thin T
91/29 Trn Tn, P. Tn Sn Nh, Q. Tn Ph, Thnh ph H Ch Minh
Facebook: https://www.facebook.com/tu.duongthien
E-mail: thientu2000@yahoo.com
1
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Hng dn s dng ti liu


Trong gio trnh thc hnh ny, cc bn s thc hin cc bi tp lp trnh c bn,
c thc hin bng ngn ng lp trnh C, theo chun ANSI/ISO C89 (ANS X3.
159-1989 v ISO/IEC 9899 - 1990).
ANSI/ISO C99 (ISO/IEC 9899 - 1999) hin cha dng ph bin ti nh trng
Vit nam, bn c th tham kho thm t cc ti liu gii thiu trong phn tham kho.
Hng dn thc hin bi tp thc hnh
- Cc bn nn thc hin ton b cc bi tp thc hnh. Cc bi tp ny c tuyn
chn v sp xp mang n cho cc bn kin thc c bn v tng qut v ngn ng
lp trnh C. Cc bn nn:
c k bi tp hiu r yu cu bi tp.
Dnh nhiu thi gian thit k cn thn chng trnh. Nhiu vn lp trnh s
ny sinh do thit k sai, v nu bn mt nhiu thi gian thit k bn s rt ngn
c giai on vit code v d li. Lun lun th tm mt cch n gin nht
thit k chng trnh.
- Nu chng trnh c li v khng chy c, trc khi xem bi gii, hy chc rng
bn :
Mt nhiu thi gian c gng gii bi tp theo cch ca bn;
Th dng tin ch d li (debugger) nu chng trnh c li;
c k li bi hc l thuyt c lin quan;
Th mi cch m bn ngh c th gii c bi tp.
- Mt s chi tit:
Cc chng trnh khng yu cu kim tra cht ch d liu nhp. Tuy nhin, c
th dng hm assert() kim tra cc tin iu kin (pre-condition).
Cc bi tp c th thc hin hai phin bn: gii quyt vn trc tip trong hm
main(), hoc vit cc hm ph gii quyt tng vn ring ty theo yu cu v
phc tp ca bi tp (hm main() xem nh mt test driver).
Cc bi tp v mng (array) v chui (string) thc hin hai phin bn: khng
dng con tr v dng con tr (cp pht ng).
- Xem bi gii:
Bi gii ch trnh by mt trong cc li gii c th c ca bi tp. Chng ti c a
dng ha cch gii bn c th rt c nhiu kin thc v kinh nghim t bi gii.
Bn cng c th hc tp thm cch tip cn vn , cch vit code,
Bn ch xem bi gii khi thc hin xong bi tp, so snh vi bi gii ca bn
c thm kinh nghim.
Ghi ch dng trong sch
Thng tin, kin thc h tr
cn c thc hin bi tp.

V d xut mu ca chng trnh.


Dng kim tra nhanh chng trnh.

Gi gii bi tp.

2
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

KHI NIM C BN - TON T


CU TRC LA CHN - CU TRC LP
Bi 1: Nhp vo din tch S ca mt mt cu. Tnh th tch V ca hnh cu ny.
S 4 R 2

4 ( 3.141593 )
V R 3
3

Nhap dien tich S: 256.128


The tich V = 385.442302
Bi gii: xem trang 66

Bi 2: Nhp vo ta 2 im A(xA, yA) v B(xB, yB). Tnh khong cch AB.


AB (xB xA)2 (yB yA)2

A(xA, yA)? 3.2 -1.4


B(xB, yB)? -5.7 6.1
|AB| = 11.6387
Bi gii: xem trang 66

Bi 3: Vit chng trnh nhp vo ta (xC, yC) l tm ca mt ng trn, v R


l bn knh ca ng trn . Nhp vo ta (xM, yM) ca im M. Xc nh im
M nm trong, trn hay nm ngoi ng trn.
Nhap toa do tam C(xC, yC)? 0.5 4.3
Nhap ban kinh R? 7.4
Nhap toa do M(xM, yM)? 3.2 6.5
M nam trong C()
Bi gii: xem trang 66

Bi 4: Vit chng trnh nhp vo ba s thc l ba cnh ca mt tam gic. Kim tra
ba cnh c nhp c hp l hay khng. Nu hp l, hy cho bit loi tam gic v
tnh din tch tam gic .
Tng hai cnh bt k ca mt tam gic phi ln hn cnh cn li.
Cng thc Heron1 dng tnh din tch tam gic theo chu vi:
S p(p a)(p b)(p c) , trong p l na chu vi: p
a b c
2

Nhap 3 canh tam giac: 3 4 5


Tam giac vuong
Dien tch S = 6
Bi gii: xem trang 67

Bi 5: Vit chng trnh nhp vo ta cc nh ca tam gic ABC v ca im M.


xc nh im M nm trong, nm trn cnh hay nm ngoi tam gic ABC.

1 Heron of Alexandria (10 - 70)


3
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Cng thc tnh din tch mt tam gic theo ta 3 nh ca n:


xA yA 1
1 1 yB 1 xB 1 xB yB
S ABC xB yB 1 xA yA
2 2 yC 1 xC 1 xC yC
xC yC 1
1
x A (yB y C) y A (x B x C) (x B y C x C yB)
2
1
x A yB x B y A x B y C x C yB x C y A x A y C
2

Bin lun bng cch so snh tng din tch: MAB + MBC + MCA vi din
tch ABC.

A(xA, yA)? 0 5
B(xB, yB)? 3 0
C(xC, yC)? 4 7
M(xM, yM)? 2 6
M nam tren canh tam giac ABC
Bi gii: xem trang 68

Bi 6: Vit chng trnh nhp vo ba s nguyn. Hy in ba s ny ra mn hnh theo


th t tng dn v ch dng ti a mt bin ph.
Nhap a, b, c: 5 3 4
Tang dan: 3 4 5
Bi gii: xem trang 69

Bi 7: Vit chng trnh gii phng trnh bc 1: ax + b = 0 (a, b nhp t bn phm).


Xt tt c cc trng hp c th.
Nhap a, b: 4 -3
x = 0.75
Bi gii: xem trang 70

Bi 8: Vit chng trnh gii phng trnh bc 2: ax2 + bx + c = 0 (a, b, c nhp t


bn phm). Xt tt c cc trng hp c th.
Nghim ca phng trnh bc 2: ax2 + bx + c = 0 (a 0)
b
x , vi delta: b 2 4ac
2a

Nhap a, b, c: 2 1 -4
x1 = -6.74456
x2 = 4.74456
Bi gii: xem trang 71

Bi 9: Vit chng trnh nhp vo s x ch s o ca mt gc, tnh bng pht. Cho


bit n thuc gc vung th bao nhiu ca vng trn lng gic.
Tnh cos(x), dng hm do math.h cung cp.
4
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

60 = 1o. Cng thc chuyn i gia v radian: 1 radian = 180 degree


Nhap so do x cua goc (phut): 12345


x thuoc goc vuong thu 3
cos(x) = -0.900698
Bi gii: xem trang 72

Bi 10: S bo him x hi ca Canada (SIN - Canadian Social Insurance Number)


l mt s c 9 ch s, c kim tra tnh hp l nh sau:
- S phi nht (v tr 1, tnh t phi sang), l s kim tra (check digit).
- Trng s c tnh t phi qua tri (khng tnh check digit), bng s1 + s2:
+ s1 l tng cc s c v tr l.
+ Cc s c v tr chn nhn i. Nu kt qu nhn i c hai ch s th kt qu l
tng ca hai ch s ny. s2 l tng cc kt qu.
SIN hp l c tng trng s vi s kim tra chia ht cho 10.
V d: SIN 193456787
- S kim tra l 7 (s t m).
- Trng s l tng ca s1 v s2, vi:
+ s1 = 1 + 3 + 5 + 7 = 16
+ Cc s c v tr chn nhn i:
(9 * 2) (4 * 2) (6 * 2) (8 * 2) 18 8 12 16
s2 = (1 + 8) + 8 + (1 + 2) + (1 + 6) = 27
Trng s bng s1 + s2 = 16 + 27 = 43.
V tng trng s vi s kim tra 43 + 7 = 50 chia ht
cho 10 nn s SIN hp l.
Vit chng trnh nhp mt s SIN. Kim tra xem s SIN c hp l hay khng.
Nhp 0 thot.
SIN (0 de thoat): 193456787
SIN hop le!
SIN (0 de thoat): 193456788
SIN khong hop le!
SIN (0 de thoat): 0
Bi gii: xem trang 72

Bi 11: Vit tr chi bao - - ko vi lut chi: bao thng , thng ko, ko
thng bao. Ngi dng nhp vo mt trong ba k t b (bao), d (), k (ko); my
tnh sinh ngu nhin mt trong ba k t trn, thng bo kt qu chi.
Nhap ky tu (b-d-k), ky tu khac de thoat: b
Computer: d
Ty so human - computer: 1 - 0
Nhap ky tu (b-d-k), ky tu khac de thoat: k
Computer: d
Ty so human - computer: 1 - 1
Nhap ky tu (b-d-k), ky tu khac de thoat: 0
Bi gii: xem trang 73

Bi 12: Vit chng trnh gii h phng trnh 2 n:

5
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

a1x b1 y c1

a2 x b2 y c2
Cc h s a1, a2, b1, b2, c1, c2 nhp t bn phm. Xt tt c cc trng hp c th.
Cng thc Cramer2 dng tnh h phng trnh 2 n:
a1 b1 c1 b1 a1 c1
D Dx Dy
a2 b2 c2 b2 a2 c2
Nu D 0, x
Dx
,y
Dy
D D

Nhap a1, b1, c1: 1 2 3


Nhap a2, b2, c2: 4 5 6
x = -1
y = 2
Bi gii: xem trang 74

Bi 13: Vit chng trnh nhp vo ngy, thng, nm. Kim tra ngy v thng nhp
c hp l hay khng. Tnh th trong tun ca ngy .
Nm nhun (leap year) tnh theo lch Gregorian (t 1582): nm phi chia
ht cho 4 v khng chia kt cho 100, hoc nm phi chia ht cho 400.
Th trong tun tnh theo cng thc Zeller3:
dayofweek = (d + y + y/4 - y/100 + y/400 + (31 * m)/12) % 7
vi: a = (14 - month)/12
y = year - a
m = month + 12*a - 2
dayofweek: 0 (cha nht), 1 (th hai), 2 (th ba),

Nhap ngay, thang va nam: 20 4 1976


Hop le
Thu 3
Bi gii: xem trang 75

Bi 14: Vit chng trnh nhp vo ngy, thng, nm (gi s nhp ng, khng cn
kim tra hp l). Tm ngy, thng, nm ca ngy tip theo.
Tng t, tm ngy, thng, nm ca ngy trc .
Nhap ngay, thang, nam: 28 2 2000
Ngay mai: 29/02/2000
Nhap ngay, thang, nam: 1 1 2001
Hom qua: 31/12/2000
Bi gii: xem trang 76

Bi 15: Vit chng trnh nhp vo ngy, thng, nm (gi s nhp ng, khng cn
kim tra hp l). Tm xem ngy l ngy th bao nhiu trong nm.
Nu khng dng vng lp, c th dng cng thc sau:
sum = (int) (30.42 * (month - 1)) + day

2 Gabriel Cramer (1704 - 1752)


3 Julius Christian Johannes Zeller (1824 - 1899)
6
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Nu month = 2, hoc nm nhun v month > 2 th sum = sum + 1


Nu 2 < month < 8 th sum = sum - 1

Nhap ngay, thang, nam: 4 4 2000


Ngay thu: 95
Bi gii: xem trang 77

Bi 16: Vit chng trnh nhp vo mt nm (> 1582), in lch ca nm . Tnh th


cho ngy u nm bng cng thc Zeller (bi 14, trang 6).
Nhap nam: 2008
Thang 1
S M T W T F S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
...
Thang 12
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Bi gii: xem trang 78

Bi 17: Vit chng trnh to lch trc cho 5 bn: A, B, C, D, E. Nhp nm v th (0


- 6, 0 l Cha Nht, 1 l th Hai, ) cho ngy u nm. Sau nhp mt thng
trong nm v in lch trc ca thng . Lu 5 bn trc ln lt theo th t trn,
ngy Cha nht khng trc v bn A s trc ngy u tin ca nm.
Nhap nam: 2006
Nhap thu cho ngay dau tien cua nam: 0
Nhap thang: 5
Sun Mon Tue Wen Thu Fri Sat
1 [C] 2 [D] 3 [E] 4 [A] 5 [B] 6 [C]
7 [ ] 8 [D] 9 [E] 10 [A] 11 [B] 12 [C] 13 [D]
14 [ ] 15 [E] 16 [A] 17 [B] 18 [C] 19 [D] 20 [E]
21 [ ] 22 [A] 23 [B] 24 [C] 25 [D] 26 [E] 27 [A]
28 [ ] 29 [B] 30 [C] 31 [D]
Bi gii: xem trang 80

Bi 18: Vit chng trnh nhp vo s gi, xut ra s tng ng tnh theo tun,
theo ngy v theo gi.
Nhap so gio: 1000
5 tuan, 6 ngay, 16 gio

Bi gii: xem trang 81

7
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 19: Nhp vo thi im 1 v thi im 2. Tm thi gian tri qua gia hai thi
im ny tnh bng gi, pht, giy.
Nhap gio, phut, giay [1]: 3 28 47
Nhap gio, phut, giay [2]: 5 40 12
Hieu thoi gian: 2 gio 11 phut, 25 giay
Bi gii: xem trang 81

Bi 20: Vit chng trnh nhp s kW in tiu th. Tnh tin in phi tr, bit
rng khung gi in nh sau:
0kW 100kW 250kW 350kW
500/kW 800/kW 1000/kW 1500/kW

Nhap so kW tieu thu: 4321


Chi phi: 6226500
Bi gii: xem trang 82

Bi 21: Trong k thi tuyn, mt th sinh s trng truyn nu c im tng kt ln


hn hoc bng im chun v khng c mn no im 0.
- im tng kt l tng im ca 3 mn thi v im u tin.
- im u tin bao gm im u tin theo khu vc v im u tin theo i tng.
Khu vc i tng
A B C 1 2 3
2 1 0.5 2.5 1.5 1
Vit chng trnh nhp: im chun ca hi ng, im 3 mn thi ca th sinh, khu
vc (nhp X nu khng thuc khu vc u tin) v i tng d thi (nhp 0 nu khng
thuc i tng u tin). Cho bit th sinh u hay rt v tng s im t c.
Nhap diem chuan: 15.5
Nhap diem 3 mon thi: 4.5 3.4 3.6
Nhap khu vuc (A, B, C, X): B
Nhap doi tuong (1, 2, 3, 0): 1
Rot [15]
Bi gii: xem trang 83

Bi 22: Vit chng trnh lit k, m v tnh tng cc c s ca s nguyn dng


n (n nhp t bn phm).
Nhap n: 1966
Cac uoc so: 1 2 983 1966
Co 4 uoc so, tong la: 2952
Bi gii: xem trang 83

Bi 23: Vit chng trnh tm cc s hon ho (perfect number) nh hn mt s


nguyn dng n cho trc. Bit s hon ho l s nguyn dng, bng tng cc c
s thc s ca n (v d: 28 = 14 + 7 + 4 + 2 + 1).
Nhap n: 10000
Cac so hoan hao nho hon 10000: 6 28 496 8128

Bi gii: xem trang 84

8
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 24: Nhp vo mt s t nhin n (n khai bo kiu unsigned long)


a. S t nhin n c bao nhiu ch s.
b. Hy tm ch s cui cng ca n.
c. Hy tm ch s u tin ca n.
d. Tnh tng cc ch s ca n.
e. Hy tm s o ngc ca n.
Nhap n: 43210
43210 co 5 chu so
Chu so cuoi cung la: 0
Chu so dau tien la: 4
Tong cac chu so la: 10
So dao nguoc la: 1234
Bi gii: xem trang 84

Bi 25: Nhp vo hai s nguyn dng a, b. Tnh c s chung ln nht v bi s


chung nh nht ca a, b.
USCLN: (Greatest Common Divisor) gcd(a, b) = max{k k\a k\b}
BSCNN: (Least Common Multiple) lcd(a, b) = min{k k>0, a\k b\k}

USCLN(a, b): + Cho gcd bng a hoc b


+ Tr dn gcd cho n khi c a v b u chia ht cho gcd
+ USCLN (a, b) = gcd
BSCNN(a, b): + Cho lcm bng a hoc b
+ Tng dn lcm cho n khi lcm chia ht cho c a v b
+ BSCNN (a, b) = lcm

Nhap cap (a, b): 12 8


USCLN (a, b): 4
BSCNN (a, b): 24
Bi gii: xem trang 86

Bi 26: Nhp vo t s, mu s (u khc 0) ca mt phn s. Hy rt gn phn s


ny. Chn dng xut thch hp trong trng hp mu s bng 1 v phn s c du.
rt gn mt phn s, chia c t s v mu s cho USLCN ca t s v
mu s.

Nhap tu so, mau so: -3 -15


Rut gon: 1/5
Nhap tu so, mau so: 8 -2
Rut gon: -4
Bi gii: xem trang 88

Bi 27: Nhp vo mt s nguyn dng n, phn tch n thnh cc tha s nguyn t.


Nhap n: 12345
3 * 5 * 823
Bi gii: xem trang 89

9
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 28: Vit chng trnh m phng hm ROUND ca Microsoft Excel, dng lm trn
mt s double vi mt s n cho trc.
- Nu n > 0, s lm trn s c n ch s phn thp phn.
- Nu n = 0, s lm trn s l s nguyn gn nht.
- Nu n < 0, s lm trn l s nguyn lm trn t v tr th n tnh t phi
sang.

Nhap so thuc x: 3.1415926535


Do chinh xac: 7
3.1415927
Nhap so thuc x: -4.932
Do chinh xac: 0
-5
Nhap so thuc x: 21.5
Do chinh xac: -1
20
Bi gii: xem trang 90

Bi 29: Lp bng so snh hai thang o nhit Fahrenheit v Celsius4 trong:


- on [0oC, 10oC], bc tng 1oC.
- on [32oF, 42oF], bc tng 1oF.
Cng thc chuyn i Fahrenheit - Celcius:
5(F - 32) = 9C

Celcius Fahrenheit Fahrenheit Celcius


0 32.00 32 0.00
1 33.80 33 0.56
2 35.60 34 1.11
3 37.40 35 1.67
4 39.20 36 2.22
5 41.00 37 2.78
6 42.80 38 3.33
7 44.60 39 3.89
8 46.40 40 4.44
9 48.20 41 5.00
10 50.00 42 5.56
Bi gii: xem trang 91

Bi 30: Vit chng trnh nhp li xut nm r (%), tin vn p v thi hn gi tin n
(nm). Mi tr nhp phi cch nhau bi du ,. In ra vn tch ly a ca tng nm.
Chng trnh c kim tra nhp thiu hoc nhp li.
a = p(1 + r)n
Trong , a (mount) l vn tch ly c, p (principal) l vn gc, r l
(rate) li sut v n l s nm u t.

4 Gabriel Fahrenheit (1686 - 1736) v Anders Celsius (1701 - 1744)


10
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Nhap lai suat, tien von, thoi han: 0.027, 15000, 3


Lai suat: 2.7%
Von ban dau: 15000
Thoi han: 3 nam
Nam Von
1 15405
2 15820.9
3 16248.1
Bi gii: xem trang 91

Bi 31: Vit chng trnh in bng cu chng t 2 n 9 ra mn hnh.


Bang cuu chuong
2x 1= 23x 1= 34x 1= 45x 1= 56x 1= 67x 1= 78x 1= 89x 1= 9
2x 2= 43x 2= 64x 2= 85x 2=106x 2=127x 2=148x 2=169x 2=18
2x 3= 63x 3= 94x 3=125x 3=156x 3=187x 3=218x 3=249x 3=27
2x 4= 83x 4=124x 4=165x 4=206x 4=247x 4=288x 4=329x 4=36
2x 5=103x 5=154x 5=205x 5=256x 5=307x 5=358x 5=409x 5=45
2x 6=123x 6=184x 6=245x 6=306x 6=367x 6=428x 6=489x 6=54
2x 7=143x 7=214x 7=285x 7=356x 7=427x 7=498x 7=569x 7=63
2x 8=163x 8=244x 8=325x 8=406x 8=487x 8=568x 8=649x 8=72
2x 9=183x 9=274x 9=365x 9=456x 9=547x 9=638x 9=729x 9=81
2x10=203x10=304x10=405x10=506x10=607x10=708x10=809x10=90
Bi gii: xem trang 92

Bi 32: Cho ni l mt s nguyn dng, vi nh ngha:


ni / 2 ni 2k 1
ni 1
3ni 1 ni 2k
Chui trn s ngng khi ni c tr 1. Cc s c sinh ra
gi l hailstones (ma )
v qu trnh trn c chng minh l lun lun dng. Vit chng trnh sinh ra
chui hailstones vi ni nhp vo t bn phm.
Nhap n: 15
15 46 23 70 35 106
53 160 80 40 20 10
5 16 8 4 2 1
Hailstones sinh duoc: 18
Tiep (y/n)? n
Bi gii: xem trang 93

Bi 33: S t nhin c n ch s l mt s Armstrong (cn gi l narcissistic numbers


hoc pluperfect digital invariants - PPDI) nu tng cc ly tha bc n ca cc ch s
ca n bng chnh n. Hy tm tt c cc s Armstrong c 3, 4 ch s.
V d: 153 l s Armstrong c 3 ch s v: 13 + 53 + 33 = 153
So Armstrong co 3, 4 chu so:
153 370 371 407 1634 8208 9474

Bi gii: xem trang 93

Bi 34: Dng cng thc hnh thang, tnh gn ng tch phn xc nh sau vi
chnh xc 10-6:

11
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


/2
sin x cosx dx
2

0
Kim chng vi cch tnh trc tip:
sin3 x
/2
2 1 1
sin x cosx dx sin3 sin3 0
2
sin3
0
3 0 3 2 3 2

tnh gn ng tch phn xc nh, ngi ta thng dng cng thc hnh
thang (trapezoidal rule) nh sau:
fx 0 fx 1 fx 1 fx 2 fx n 1 fx n
b
fx dx h 2

2
...
2

a

fx 0 fx n
= h fx 1 ... fx n 1 ln
2
vi: b a
h , x i a ih
n

t chnh xc, chn n0 ty , sau tnh ln vi n = n0, 2n0, 4n0


Vic tnh ton dng li khi l2n ln / 3 e (e l chnh xc).

Ket qua : 0.333333


Doi chung: 0.333333
Bi gii: xem trang 94

Bi 35: Vit chng trnh kim tra mt s nguyn dng n c l s nguyn t hay
khng. Nu khng th phi xc nh s nguyn t gn n nht v b hn n.
S nguyn t n l mt s nguyn ln hn 1, ch c hai c s (ch chia ht):
1 v chnh n.

xc nh n l s nguyn t, ch cn kim tra n khng c c s t 2 n


n ; do mi hp s (s nguyn ln hn 1 khng phi l s nguyn t) n u
c c s nguyn t nh hn n 5.

Nhap n: 822
822 khong la so nguyen to
So nguyen to be hon gan nhat: 821
Bi gii: xem trang 95

Bi 36: Vit chng trnh in ra n s nguyn t u tin (n nhp t bn phm).


Nhap n: 15
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47

Bi gii: xem trang 97

5 V n l hp s, ta c th vit n = a*b, trong a, b l cc s nguyn vi 1 < a b < n. R rng phi


c a hoc b khng vt qu n , gi s l b. c s nguyn t ca b cng l c s nguyn t ca n.
12
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 37: Vit chng trnh nhp s nguyn dng n. Tm s nguyn dng m ln nht
sao cho: 1 + 2 + + m < n.
Nhap n: 22
1 + 2 + 3 + 4 + 5 + 6 = 21 < 22
m = 6
Bi gii: xem trang 98

Bi 38: Nhp vo mt s tin n (nghn ng, n > 5) nguyn dng. i s tin ny


ra ba loi tin giy 1000VN, 2000VN, 5000VN.
Tm phng n i tin sao cho loi tin 2000VN chim hn phn na s t bc phi
i t nht.
Nhap n (nghin dong, n > 5): 137
( 0, 21, 19 ): 40

Bi gii: xem trang 99

Bi 39: Tm cc b s nguyn dng (x, y, z) (x, y, z < 100) l 3 s nguyn lin tip
hoc 3 s chn lin tip, tha mn cng thc Pithagoras6: x2 + y2 = z2
(3, 4, 5): ba so nguyen lien tiep
(6, 8, 10): ba so chan lien tiep

Bi gii: xem trang 99

Bi 40: Tm cc b (tru ng, tru nm, tru gi) tha mn bi ton c:


Trm tru n trm b c
Tru ng n nm
Tru nm n ba
L kh tru gi
Ba con mt b
Th tm cch gim s vng lp khi tnh ton xung.
(4, 18, 78)
(8, 11, 81)
(12, 4, 84)
Bi gii: xem trang 100

Bi 41: Vit chng trnh tm cch thay th cc du hi (?) bi cc du 4 php tnh


s hc +, -, *, /, trong biu thc di y sao cho biu thc c gi tr bng 36.
((((1 ? 2) ? 3) ? 4) ? 5) ? 6
((((1 - 2) + 3) + 4) * 5) + 6 = 36
((((1 - 2) * 3) + 4) + 5) * 6 = 36
((((1 * 2) + 3) - 4) + 5) * 6 = 36
((((1 / 2) * 3) * 4) * 5) + 6 = 36
Bi gii: xem trang 100

6 Pythagoras (582 BC - 507 BC)


13
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 42: Gi thuyt Goldbach (Goldbach's conjecture) cho rng: mt s nguyn t n


7

bt k (n > 5) u c th khai trin thnh tng ca ba s nguyn t khc.


Vit chng trnh kim chng gi thuyt Goldbach vi n < 1000.
Co 165 so nguyen to n (5 < n < 1000)
7 = 2 + 2 + 3
11 = 2 + 2 + 7
...
997 = 3 + 3 + 991
Kiem chung dung voi 165 so nguyen to
Bi gii: xem trang 101

Bi 43: Tm s Fibonacci8 th n (n < 40), dng vng lp (khng dng quy).


1 n 1, 2
S Fibonacci th n: F(n)
Fn 2 Fn 1 n 2

Nhap n (n < 40): 24


Fi(24) = 46368
Bi gii: xem trang 102

Bi 44: Dng vng lp lng, vit chng trnh in ra tam gic cn c v rng, to t
cc du sao (*), c cao l n nhp t bn phm.
Nhap n: 4
*
* * *
* * * * *
* * * * * * *
*
* *
* *
* * * * * * *
Bi gii: xem trang 103

Bi 45: Dng vng lp lng, vi n (n < 5) nhp t bn phm, vit chng trnh in
hai tam gic i nh bng s, tng theo ct t 1 n 2n - 1.
Nhap n (n < 5): 3
1 5
1 2 4 5
1 2 3 4 5
1 2 4 5
1 5
Bi gii: xem trang 104

Bi 46: Vit chng trnh kim tra hai v ca cng thc sau, vi n cho trc:
n
n2 n 12
i3 4
i3

7 Christian Goldbach (1690 - 1764)


8 Leonardo Fibonacci (1170 - 1250)
14
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Nhap n: 50
Ve trai = 1625625
Ve phai = 1625625
Bi gii: xem trang 104

Bi 47: Vi n cho trc, tnh tng S, bit:


Nu n chn: S = 2 + 4 + 6 + + n
Nu n l: S = 1 + 2 + 3 + + n
Nhap n: 120
S = 3660

Bi gii: xem trang 105

Bi 48: Vi s nguyn n cho trc, tm c s l ln nht ca n v c s ln nht


ca n l ly tha ca 2.
Nhap n: 384
US le lon nhat: 3
US lon nhat la luy thua cua 2: 128
Bi gii: xem trang 105

Bi 49: Vit chng trnh tnh cn s lin tc sau:


n1 n n1 3
S n n 1 n 2 ... 2 1

Nhap n: 10
Ket qua: 1.24624

Bi gii: xem trang 107

Bi 50: Phn s lin tc (continued fraction) k hiu [b1, b2, , bk], c dng:
s 1

t 1
b1
1
b2
...
1
bk 1
bk
l cc s t nhin. Cho s v t, vit chng trnh tm [b1, b2, , bk].
b1, b2, , bk
Mi phn s hu t s (0 < s < t l cc s t nhin) u c th a v
t
dng phn s lin tc bng thut ton sau:
1. Chia t cho s, c a d r: t a * s r . Suy ra:
s 1 1

t t r
a
s s
2. t b1 = a, ri tip tc bin i r cho n khi s d r bng 0.
s

Nhap s, t (0 < s < t): 123 1234


[10, 30, 1, 3]
Bi gii: xem trang 107
15
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 51: Vit chng trnh tnh phn s lin tc sau:


1
F x (x l s thc khc 0)
2
x
4
x
...
128
x
256
x
x
Nhap x: 2.4
F = 2.73649
Bi gii: xem trang 108

n
1
Bi 52: Cho s t nhin n, hy tnh Fn bit: Fn 2
i1n i
Nhap n: 12
Fn = 0.0797762
Bi gii: xem trang 109

Bi 53: Vit chng trnh tnh sin(x) vi chnh xc 10-4 theo chui Taylor9
(Taylor series):
x3 x5 x 2n 1
sinx x ... 1n
3! 5! 2n 1 !
Nhap x (radian): 2.7
cong thuc Taylor: sin(2.70) = 0.4274
sin() cua math.h: sin(2.70) = 0.4274
Bi gii: xem trang 109

Bi 54: Dng vng lp, tnh t hp chp k ca n (k < n < 25):


n!
Ck
n
k! n k !
Kim chng cng thc Ck nk
n Cn

Nhap n, k (k < n < 25): 20 5


C( k, n ): 15504
C( n-k, n ): 15504
Bi gii: xem trang 110

Bi 55: Tnh cn bc hai ca mt s nguyn dng x bng thut ton Babylonian.


Kim tra kt qu vi hm chun sqrt().
Thut ton Babylonian dng tnh cn bc hai ca mt s nguyn dng x:
1. t y = 1.0
2. Thay y vi trung bnh cng ca y v x/y
3. Lp li bc 2 n khi y khng cn thay i (y xp x bng x/y)
4. Tr v y

9 Brook Taylor (1685 - 1731)


16
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Nhap x (x > 0): 7


thuat toan babylonian: 2.64575
ham sqrt() cua math.h: 2.64575
Bi gii: xem trang 111

Bi 56: Vit chng trnh nhp vo mt s nguyn n c du, in ra dng hin th nh


phn v thp lc phn ca n.
xc nh mt bit ti v tr bt k, dng mt n (mask) AND, kt hp vi
ton t AND bitwise (&):
Mt n thng l mt dy bit 0, vi bit 1 c bt ti v tr cn kim tra.
10 1 1010 10 0 1010
mask 00 1 0000 mask 00 1 0000
00 1 0000 00 0 0000
(0) bit 1 (=0) bit 0
Khi cn xc nh bit ti v tr khc, dng ton t dch bit di chuyn bit
1 ca mt n; hoc dch chuyn s kim tra bit cn kim tra n ng v
tr bit 1 ca mt n.
Khng dng cch chia 2 chuyn s nguyn thnh s nh phn ri ly
tng bit v s nguyn m lu dng s b 2 (twos complement).

Nhap n: -5678
-5678 = 11111111 11111111 11101001 11010010
Hex: FFFFE9D2
Bi gii: xem trang 111

Bi 57: Bit parity l bit thm vo mt nhm m c truyn i, dng pht hin
li mt bit n trong qu trnh truyn. Bit parity chn (even parity) l bit c tr c
chn sao cho tng s bit 1 trong mt nhm m k c bit parity l mt s chn. Vit
chng trnh nhp vo mt s nguyn n. Xc nh bit parity chn ca n.
Bit parity chn ca n s bng 0 nu s cc bit 1 l s chn v bng 1 nu s
cc bit 1 l s l.

Nhap n: 13579
Even parity bit = 1

Bi gii: xem trang 112

MNG
Bi 58: Vit chng trnh thc hin thut ton sng Erastosthenes10 (Sieve of
Erastosthenes) in ra cc s nguyn t nh hn s n cho trc (n < 100).
Sng Erastosthenes: vit cc s nguyn t 2 n n. Khoanh trn 2; gch
cho tt c nhng bi s khc ca 2. Lp li bng cch khoanh trn s nh
nht cha c khoanh trn, khng b gch cho; gch cho tt c nhng

10 Eratosthenes (276 BC - 194 BC)


17
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

bi s ca n. Khi khng cn s no khoanh trn hoc gch cho th


dng. Tt c nhng s c khoanh trn l s nguyn t.

Nhap n: 64
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61
Bi gii: xem trang 113

Bi 59: Nhp vo nm Dng lch, xut tn nm m lch. Xut nm Dng lch k


tip c cng tn nm m lch. Bit bnh xe tnh hai chu k Can - Chi nh sau:
inh Mu T
Ng Thn
Bnh K Mi Mo

t CAN Canh Thn CHI Dn

Gip Tn Du Su

Qu Nhm Tut T
Hi

Nm c cng tn m lch vi nm y l y k * 60 (60 l BSCNN ca hai chu


k 10 v 12). Mc tnh Can Chi, ly nm 0 l nm Canh Thn.

Nhap nam: 2000


2000 - Canh Thin
2060 - Canh Thin
Bi gii: xem trang 114

Bi 60: Vit chng trnh thc hin nhng yu cu sau:


a. To ngu nhin mng mt chiu n phn t nguyn (n chn) c gi tr cha
trong on [-100, 100] v xut mng.
b. Vit hm thc hin vic trn hon ho (perfect shuffle) mt mng: sao cho
cc phn t ca mt na mng sau xen k vi cc phn t ca mt na mng
u. Xut mng sau khi trn.
c. Xc nh s ln trn hon ho mng tr v nh ban u.
Nhap n (n chan): 12
-33 62 -12 34 -89 65 -3 -96 86 89 39 35
-33 -3 62 -96 -12 86 34 89 -89 39 65 35
Can 10 lan shuffle de mang tro ve ban dau
Bi gii: xem trang 114

Bi 61: Vit chng trnh thc hin nhng yu cu sau:


a. To ngu nhin mng mt chiu n phn t nguyn c gi tr cha trong on
[-100, 100] v xut mng.
b. Tnh tng cc s nguyn dng c trong mng.
c. Xa phn t c ch s p (p nhp t bn phm) trong mng.
Nhap n [1, 99]: 10
69 -41 48 22 -34 100 -14 70 66 -29
Tong cac so nguyen duong = 375
Nhap p [0, 9]: 4
18
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


69 -41 48 22 100 -14 70 66 -29
Bi gii: xem trang 116

Bi 62: Vit chng trnh thc hin nhng yu cu sau:


a. To ngu nhin mng mt chiu n phn t nguyn dng c gi tr cha
trong on [10, 20] v xut mng.
b. Kim tra xem tng cc s chn v tr l c bng tng cc s l v tr chn
hay khng?
c. Xc nh xem mng c cp s nguyn t cng nhau (coprime) no khng.
Hai s nguyn dng a v b c gi l hai s nguyn t cng nhau nu
c s chung ln nht ca hai s a v b l 1.

Nhap n [1, 99]: 5


14 14 11 16 12
Tong le vi tri chan (30) khac tong chan vi tri le (11)
Cac cap nguyen to cung nhau:
(14, 11)
(11, 16)
(11, 12)
Bi gii: xem trang 117

Bi 63: Vit chng trnh thc hin nhng yu cu sau:


a. To ngu nhin mng mt chiu n phn t nguyn c gi tr cha trong on
[-100, 100] v xut mng.
b. m s phn t chia ht cho 4 v c ch s tn cng l 6.
c. Thay cc phn t l bng 2 ln gi tr ca n.
Nhap n [1, 99]: 10
70 -67 22 -87 34 16 -34 -58 76 -78
Co 2 phan tu chia het cho 4, tan cung 6
Nhan doi phan tu le:
70 -134 22 -174 34 16 -34 -58 76 -78
Bi gii: xem trang 118

Bi 64: Vit chng trnh thc hin nhng yu cu sau:


a. To mng mt chiu n phn t nguyn c gi tr nhp vo t bn phm.
b. Hy m s cc phn t c tr l ly tha ca 2 c trong mng.
c. Nhp x nguyn, xa cc phn t trong mng c tr trng vi x.
Mt s l ly tha ca 2 nu s c bit 1 duy nht l bit MSB (Most
Significant Bit). V d: 28 = 256 = 1 0000 0000

Nhap n [1, 99]: 10


Nhap 10 phan tu:
2 -5 4 7 9 -8 32 16 11 4
Co 5 so la luy thua cua 2
Nhap x: 4
2 -5 7 9 -8 32 16 11
Bi gii: xem trang 119
19
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 65: Vit chng trnh thc hin nhng yu cu sau:


a. To mng mt chiu n phn t nguyn c gi tr nhp vo t bn phm.
b. Tnh trung bnh cng ca cc s nguyn m l c trong mng.
c. Xa cc phn t c tr trng nhau trong mng, ch cha li mt phn t.
Nhap n [1, 99]: 10
Nhap 10 phan tu:
2 2 -3 7 4 -5 4 9 -1 -1
Trung binh cong nguyen am le = -2.50
2 -3 7 4 -5 9 -1
Bi gii: xem trang 120

Bi 66: Vit chng trnh thc hin nhng yu cu sau:


a. To ngu nhin mng mt chiu n phn t nguyn c gi tr cha trong on
[-100, 100] v xut mng.
b. Dng mt vng lp, tm phn t c tr nh nht v ln nht ca mng.
c. Xa cc phn t trong mng c tr trng vi gi tr ln nht ca mng, tr
phn t tm c u tin.
Nhap n [1, 99]: 10
21 1 -68 24 22 -76 -69 0 24 -84
max = 24
min = -84
21 1 -68 24 22 -76 -69 0 -84
Bi gii: xem trang 121

Bi 67: Vit chng trnh thc hin nhng yu cu sau:


a. To ngu nhin mng mt chiu n phn t nguyn c gi tr cha trong on
[-100, 100] v xut mng.
b. Sp xp sao cho cc v tr cha tr chn trn mng vn cha tr chn nhng
c th t tng, cc v tr cha tr l trn mng vn cha tr l nhng c th
t gim.
Nhap n [1, 99]: 10
72 -8 45 -97 77 25 -86 86 -2 60
-86 -8 77 45 25 -97 -2 60 72 86
Bi gii: xem trang 122

Bi 68: Vit chng trnh thc hin nhng yu cu sau:


a. To ngu nhin mng mt chiu n phn t nguyn (n chn) c gi tr cha
trong on [100, 200] v xut mng.
b. Chia cc phn t ca mng thnh hai nhm, sao cho hiu ca tng cc phn
t nhm ny v tng cc phn t nhm kia l mt s dng nh nht.
Tm cp a0, b0 (a0 > b0) c hiu nh nht, cp a1, b1 (a1 > b1) c hiu nh
th hai, Nh vy hiu (a0 + a1 + ) - (b0 + b1 + ) s nh nht.
Tham kho thm bi 62, trang 19.

Nhap n (n chan): 10
109 111 162 107 115 111 108 173 108 113
20
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


111 108 109 115 173 : 616
111 108 107 113 162 : 601
Hieu nho nhat = 15
Bi gii: xem trang 124

Bi 69: Vit chng trnh thc hin nhng yu cu sau:


a. To ngu nhin mng mt chiu n phn t nguyn c gi tr cha trong on
[-100, 100] v xut mng.
b. Xut ra mn hnh run tng di nht tm thy u tin.
run l chui cc phn t (lin tc) theo cng mt quy lut no (tng
dn, gim dn, chn, l, bng nhau, ).

Nhap n [1, 99]: 10


-53 -32 23 78 61 -1 95 83 -55 -7
"run" tang dai nhat: -53 -32 23 78
Bi gii: xem trang 126

Bi 70: Vit chng trnh thc hin nhng yu cu sau:


a. To ngu nhin mng mt chiu n phn t nguyn c gi tr cha trong on
[-100, 100] v xut mng.
b. Hy chuyn cc phn t c tr l v u mng, cc phn t c tr chn v
cui mng. Cc phn t c tr 0 nm gia.
Nhap n [1, 99]: 10
-66 64 0 -50 58 51 0 45 1 82
51 45 1 0 0 -50 58 -66 64 82
Bi gii: xem trang 127

Bi 71: Vit chng trnh thc hin nhng yu cu sau:


a. To mng mt chiu n phn t nguyn c gi tr nhp vo t bn phm.
b. Kim tra xem mng c i xng hay khng.
c. Hy dch tri xoay vng mng k ln, k nhp t bn phm.
Nhap n [1, 99]: 10
Nhap 10 phan tu:
1 2 3 4 5 5 4 3 2 1
Doi xung
Nhap so lan can dich: 3
4 5 5 4 3 2 1 1 2 3
Bi gii: xem trang 128

Bi 72: Vit chng trnh thc hin nhng yu cu sau:


a. To ngu nhin mng mt chiu n phn t nguyn c gi tr cha trong on
[-100, 100] v xut mng.
b. Kim tra trong mng c s l hay khng? Nu c tm s l ln nht.
c. Hy dch phi xoay vng mng k ln, k nhp t bn phm.
Nhap n [1, 99]: 10
4 -33 36 -4 12 72 -9 -87 76 -40
Phan tu le lon nhat: a[6] = -9

21
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


Nhap so lan can dich: 3
-87 76 -40 4 -33 36 -4 12 72 -9
Bi gii: xem trang 129

Bi 73: Vit chng trnh thc hin nhng yu cu sau:


a. To mng mt chiu n phn t nguyn c gi tr nhp vo t bn phm.
b. In ra cc phn t trong mng c tr phn bit.
Nhap n [1, 99]: 10
Nhap 10 phan tu:
1 2 2 3 4 3 1 5 5 4
1 2 3 4 5
Bi gii: xem trang 131

Bi 74: Vit chng trnh thc hin nhng yu cu sau:


a. To mng mt chiu n phn t nguyn c gi tr nhp vo t bn phm.
b. Thng k s ln xut hin ca cc phn t trong mng.
Nhap n [1, 99]: 10
Nhap 10 phan tu:
1 2 2 3 4 3 2 5 5 3
1[1] 2[3] 3[3] 4[1] 5[2]
Bi gii: xem trang 132

Bi 75: Vit chng trnh thc hin nhng yu cu sau:


a. To mng mt chiu n phn t nguyn c gi tr nhp vo t bn phm.
b. Xut phn t xut hin nhiu nht, xut hin t nht tm thy u tin.
Nhap n [1, 99]: 10
Nhap 10 phan tu:
3 2 2 3 4 3 2 5 5 3
Phan tu xuat hien nhieu nhat: 3[4]
Phan tu xuat hien it nhat: 4[1]
Bi gii: xem trang 133

Bi 76: Vit chng trnh thc hin nhng yu cu sau:


a. To mng mt chiu n phn t nguyn c gi tr nhp vo t bn phm.
b. Tm cc phn t c s ln xut hin l nh nhau v nhiu nht.
Nhap n [1, 99]: 10
Nhap 10 phan tu:
1 2 2 3 4 4 2 5 5 4
Phan tu xuat hien nhieu nhat:
2[3] 4[3]
Bi gii: xem trang 134

Bi 77: Vit chng trnh thc hin nhng yu cu sau:


a. To ngu nhin mng mt chiu n phn t nguyn c gi tr cha trong on
[-100, 100] v xut mng.
b. Tnh tng nghch o cc phn t trong mng.

22
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

c. Vit hm duyt cc phn t A[i] ca mng theo th t t tri sang phi; nu


A[i] l th xa mt phn t bn phi n.
Nhap n [1, 99]: 10
-1 -39 62 -48 -12 -32 -39 87 75 -53
Tong nghich dao: -1
-1 62 -48 -12 -32 -39 75
Bi gii: xem trang 135

Bi 78: Vit chng trnh thc hin nhng yu cu sau:


a. To ngu nhin mng mt chiu n phn t nguyn c gi tr cha trong on
[-100, 100] v xut mng.
b. Hy sp xp cc phn t trong mng theo th t tng dn.
c. Hy chn mt phn t x vo trong mng c sp tng dn m vn gi
nguyn tnh tng dn ca n.
Nhap n [1, 99]: 10
-94 63 -78 2 7 -26 -82 8 -18 39
Mang sap xep tang:
-94 -82 -78 -26 -18 2 7 8 39 63
Nhap x: 0
-94 -82 -78 -26 -18 0 2 7 8 39 63
Bi gii: xem trang 136

Bi 79: Vit chng trnh thc hin nhng yu cu sau:


a. To ngu nhin mng mt chiu n phn t nguyn c gi tr cha trong on
[-100, 100] v xut mng.
b. Nhp s nguyn x, tm phn t trong mng gn x nht.
c. Vit hm chn 1 vo bn phi cc phn t c tr m ca mng.
Nhap n (n > 0): 10
55 98 87 93 -37 -50 77 -48 93 52
Nhap x: 50
So gan x nhat: 52
55 98 87 93 -37 1 -50 1 77 -48 1 93 52
Bi gii: xem trang 138

Bi 80: Vit chng trnh thc hin nhng yu cu sau:


a. To mng mt chiu A, n phn t nguyn c gi tr nhp vo t bn phm.
b. To mng mt chiu B, m phn t nguyn (m n), c gi tr nhp vo t bn
phm. Tm v tr xut hin u tin ca mng B trong mng A.
c. Tm s nguyn m cui cng ca mng A.
Nhap n [1, 99]: 10
Nhap 10 phan tu mang A:
-1 2 -3 4 -5 5 -4 3 -2 1
Nhap m [1, 10]: 4
Nhap 4 phan tu mang B:
4 -5 5 -4
B co trong A tai: A[3]
So nguyen am cuoi: -2
Bi gii: xem trang 140
23
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 81: Vit hm trn hai mng A, B c sp xp tng, sao cho mng kt qu l


mt mng sp xp gim. Khng c sp xp trc tip mng kt qu.
Nhap so phan tu mang A va B (n, m > 0): 5 7
17 -21 0 100 -42
67 11 -66 32 52 22 -48
Mang A sap tang: -42 -21 0 17 100
Mang B sap tang: -66 -48 11 22 32 52 67
Tron A va B thanh C sap giam:
100 67 52 32 22 17 11 0 -21 -42 -48 -66
Bi gii: xem trang 141

Bi 82: Vit chng trnh cho php ngi dng nhp n s ty , nhp cho n khi
nhn Ctrl+Z. Hy lu cc s ny thnh mt tp hp cha cc phn t c tr phn bit.
Nhap khong qua 100 phan tu (Ctrl+Z de dung)
1 3 5 7 2 4 3 6 7 5 4 8
^Z
Tap hop A: {1, 3, 5, 7, 2, 4, 6, 8}
Bi gii: xem trang 143

Bi 83: Cho hai mng A, B l hai tp hp, khi to trc hoc nhp t bn phm. To
mng C l mt tp hp gm cc phn t:
a. Xut hin trong c A v B (giao). A B A B A B
b. Khng xut hin trong B (hiu).
c. Xut hin trong A hoc B (hp).
A B A B A \ B

Tap hop A: {1, 2, 3, 5}


Tap hop B: {1, 3, 6, 7}
C = A * B: {1, 3}
C = A + B: {1, 2, 3, 5, 6, 7}
C = A \ B: {2, 5}
Bi gii: xem trang 144

Bi 84: Vit chng trnh nhp thc hin nhng yu cu sau:


a. Vit hm chn tng phn t vo mt mng s nguyn sao cho mng lun
gi th t gim.
b. Dng hm ny lu cc tr nhp thnh mt mng c th t gim. Nhp cho
n khi nhn Ctrl+Z, xut mng kim tra.
Nhap khong qua 100 phan tu (Ctrl+Z de dung):
3 5 4 7 2 6 9 1 8
^Z
9 8 7 6 5 4 3 2 1
Bi gii: xem trang 145

24
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

MNG CA CC MNG 11

Bi 85: Vit chng trnh thc hin nhng yu cu sau:


a. To ngu nhin mng hai chiu vung c kch thc 4 x 4 vi cc phn t
ngu nhin trong on [-100, 100] v xut mng.
b. Sp xp li cc phn t ca mng hai chiu trn sao cho mi dng tng t
tri sang phi v mi ct tng t trn xung di.
Mang goc:
100 21 -67 -81
1 55 31 -61
48 99 62 3
51 27 -61 14
Mang sau khi sap xep:
-81 -67 -61 -61
1 3 14 21
27 31 48 51
55 62 99 100
Bi gii: xem trang 146

Bi 86: Vit chng trnh thc hin nhng yu cu sau:


a. To ngu nhin mng hai chiu vung c kch thc n x n (n nhp t bn
phm) vi cc phn t ngu nhin trong on [-100, 100] v xut mng.
b. Sp xp li cc ct ca mng hai chiu trn sao cho tng tr cc phn t ca
mi ct tng dn t tri sang phi.
Nhap n (n < 20): 3
-48 61 31
-22 -23 -62
83 -24 -18
Mang sau khi sap xep:
61 31 -48
-23 -62 -22
-24 -18 83
Bi gii: xem trang 148

Bi 87: Vit chng trnh thc hin nhng yu cu sau:


a. To ma trn A vung bc n (n nhp t bn phm) vi cc phn t c nhp
t bn phm, xut ma trn.
b. Tnh tng cc phn t trn ng cho chnh (vt - trace) ca ma trn A.
c. Kim tra xem ma trn A c phi l ma trn tam gic trn hay khng. Nu
phi, tnh nh thc ca ma trn .
Ma trn tam gic trn l ma trn c cc phn t nm di ng cho chnh
u bng 0. nh thc ca ma trn tam gic trn theo Gauss12:
n
det(A) A ii
l1

11 C khng h tr mng nhiu chiu (v d a[5,7]), C ch h tr mng c kiu bt k, k c mng cha


cc mng (v d a[5][7]). d trnh by, chng ti vn dng thut ng mng 1 chiu, 2 chiu,
12 Carl Friedrich Gauss (1777 - 1855)
25
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Nhap bac ma tran: 3


a[0][0] = 1
...
a[2][2] = 9
1 2 3
0 5 6
0 0 9
Trace = 15
det(A) = 45
Bi gii: xem trang 149

Bi 88: Vit chng trnh thc hin nhng yu cu sau:


a. To ma trn vung bc n (n nhp t bn phm) vi cc phn t l cc tr ngu
nhin trong on [-100, 100], xut ma trn.
b. Vit hm kim tra xem ma trn c ng nht hay khng. Nu khng, in ra
ma trn ng nht cng bc vi ma trn trn.
Ma trn ng nht In (identity matrix) l ma trn vung bc n c cc phn
t u bng 0, tr cc phn t trn ng cho chnh u bng 1.

Nhap bac ma tran: 3


43 65 29
78 -67 26
-72 -61 95
Ma tran tren khong dong nhat
1 0 0
0 1 0
0 0 1
Bi gii: xem trang 150

Bi 89: Vit chng trnh thc hin nhng yu cu sau:


a. To ma trn vung bc n (n nhp t bn phm) vi cc phn t l cc tr ngu
nhin trong on [-100, 100], xut ma trn.
b. Hon chuyn phn t ln nht nm trn mi dng vi phn t nm trn
ng cho chnh cng thuc dng .
Nhap bac ma tran: 3
-27 11 -81
-10 -13 35
-24 61 -17
Ma tran sau khi sap xep:
11 -27 -81
-10 35 -13
-24 -17 61
Bi gii: xem trang 151

Bi 90: Vit chng trnh thc hin nhng yu cu sau:


a. To ma trn vung bc n (n nhp t bn phm) vi cc phn t l cc tr ngu
nhin trong on [-100, 100], xut ma trn.

26
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

b. Vit hm xut tt c cc ng cho song song vi ng cho ph, mi


ng cho trn mt dng.
Nhap bac ma tran: 3
-84 50 68
53 -94 -47
-62 -59 67
Cac duong cheo song song cheo phu:
-84
50 53
68 -94 -62
-47 -59
67
Bi gii: xem trang 152

Bi 91: Mt mu lt (pattern) thng c nh ngha di dng mt ma trn nh


phn (xem hnh di). Gi s mu lt trn dng lt kn ma trn A (kch thc 20 x
20), xut ma trn B l ma trn con ca A, kch thc 8 x 12, c gc trn tri nm ti
phn t A[3][4].
* * 010100
* * 100010
* * 100010
* * 010100
* * * *
* * * *
* * * *
* * * *
* * * *
* * * *
* * * *
* * * *
Bi gii: xem trang 153

Bi 92: Vit chng trnh thc hin nhng yu cu sau:


a. To ma trn vung bc n (n nhp t bn phm) vi cc phn t l cc tr ngu
nhin trong on [-100, 100], xut ma trn.
b. Tm ng cho, song song vi ng cho chnh v c tng tr cc phn t
l ln nht.
Nhap bac ma tran: 3
-99 -24 -89
97 -66 10
16 22 -66
Duong cheo co tong lon nhat:
97 22 : 119
Bi gii: xem trang 154

Bi 93: Vit chng trnh thc hin nhng yu cu sau:


a. To ma trn A vung bc 3 vi cc phn t l cc tr ngu nhin trong on
[0, 9], xut ma trn.
b. Vi k nguyn dng nhp t bn phm (k > 1), xut ma trn ly tha Ak.

27
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Nu A l mt ma trn n x n v nu k l mt s nguyn dng th Ak l k


hiu ca tch k ln ma trn A, gi l ma trn ly tha Ak. A0 = I (ma trn
ng nht). Ma trn ly tha thng dng khi xc nh tnh lin thng ca
th bng ma trn k. Cc phn t ca ma trn tch C = A.B l
n
Cij A ikBkj . Tch A.B tn ti khi s ct ca A bng s dng ca B.
k1

3 8 8
9 2 8
9 3 6
Nhap luy thua (k > 1): 3
2259 1760 2552
2475 1544 2552
2376 1452 2424
Bi gii: xem trang 155

Bi 94: Vit chng trnh thc hin nhng yu cu sau:


a. To ma trn A vung bc n (n > 1, nhp t bn phm) vi cc phn t l cc
tr ngu nhin trong on [-100, 100], xut ma trn.
b. To ri xut ma trn con B vung bc n - 1 t ma trn A bng cch loi b
dng v ct cha phn t c tr tuyt i ln nht.
Nhap bac ma tran (n > 1): 3
-56 42 5
-18 82 18
50 -39 42
Ma tran B:
-56 5
50 42
Bi gii: xem trang 157

Bi 95: Vit chng trnh thc hin nhng yu cu sau:


a. To ma trn A vung bc n (n nhp t bn phm) vi cc phn t l cc tr
ngu nhin trong on [-100, 100], xut ma trn.
b. Cho k nguyn vi 0 k < n. To v xut ma trn B vung bc n t ma trn
A bng cch hon chuyn dng k vi ct k.
Nhap bac ma tran: 3
-52 31 -75
-92 59 27
-58 47 29
Nhap k: 1
-52 -92 -75
31 59 47
-58 27 29
Bi gii: xem trang 159

Bi 96: Vit chng trnh thc hin nhng yu cu sau:


a. To ma trn A vung bc n (n nhp t bn phm) vi cc phn t c tr:
Aij = sin( i - 2 * j / ), xut ma trn.

28
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

b. m s phn t khng m ca ma trn.


Nhap bac ma tran: 4
0.000000 -0.594481 -0.956056 -0.943067
0.841471 0.355436 -0.269852 -0.789417
0.909297 0.978566 0.664452 0.090019
0.141120 0.702007 0.987862 0.886692
Co 11 phan tu khong am
Bi gii: xem trang 159

Bi 97: Vit chng trnh thc hin nhng yu cu sau:


a. To ma trn A c kch thc n x m (n, m nhp t bn phm) vi cc phn t
l cc tr ngu nhin trong on [-100, 100], xut ma trn.
b. Ln cn ca phn t Aij c hiu l cc phn t c ch s tng ng chnh
lch vi i, j khng qu 1 n v. Xut ma trn nh phn B (gi l ma trn cc
tiu) c kch thc m x n vi Bij = 1 khi tt c nhng phn t ln cn Aij
u ln hn Aij (khi Aij c gi l phn t cc tiu), cc phn t Bij cn
li bng 0.
Nhap n, m: 3 4
14 78 54 -43
84 71 -45 22
-54 35 14 83
Ma tran cuc tieu:
1 0 0 0
0 0 1 0
1 0 0 0
Bi gii: xem trang 160

Bi 98: Vit chng trnh thc hin nhng yu cu sau:


c. To ma trn c kch thc n x m (n, m nhp t bn phm) vi cc phn t l
cc tr ngu nhin trong on [-100, 100], xut ma trn.
d. In ma trn xoay 90o theo chiu kim ng h t ca ma trn trn. Tm quay
l phn t gc di tri.
Nhap n, m: 3 4
63 -49 88 95
-52 -94 -33 48
73 -69 86 -38
Ma tran sau khi quay:
73 -52 63
-69 -94 -49
86 -33 88
-38 48 95
Bi gii: xem trang 161

Bi 99: Vit chng trnh thc hin nhng yu cu sau:


a. To hai ma trn vung cng bc n (n nhp t bn phm) vi cc phn t l
cc tr ngu nhin trong on [-10, 10], xut hai ma trn.
b. In ma trn tng v ma trn tch ca hai ma trn trn.
Nhap bac ma tran: 2
Ma tran A:

29
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


-10 9
7 9
Ma tran B:
3 -1
7 4
Ma tran tong:
-7 8
14 13
Ma tran tich:
33 46
84 29
Bi gii: xem trang 163

Bi 100: Vit chng trnh thc hin nhng yu cu sau:


a. To ma trn c kch thc n x m (n, m nhp t bn phm) vi cc phn t
c nhp t bn phm, xut ma trn.
b. Ma trn gi l tha (sparse matrix) nu s phn t c tr 0 nhiu hn s
phn t c tr khc 0. Kim tra xem ma trn trn c tha hay khng.
Nhap n, m: 3 4
a[0][0] = 3
...
a[2][3] = 0
3 0 2 -5
0 -4 0 0
0 0 0 0
Ma tran thua
Bi gii: xem trang 165

Bi 101: Vit chng trnh thc hin nhng yu cu sau:


a. To ma trn vung bc n (n nhp t bn phm) vi cc phn t nhp vo t
bn phm, xut ma trn.
b. Xut tng cc hng v tng cc ct.
c. Kim tra xem ma trn trn c to thnh mt ma phng khng.
Ma phng (magic square) l hnh vung c tng ng 2 9 4
cho chnh, ng cho ph, hng bt k, ct bt k u
7 5 3
bng nhau. V d, hnh vung bn phi l ma phng bc
6 1 8
3 vi tng 15.

Nhap bac ma tran: 3


A[0][0] = 2
...
A[2][2] = 8
2 9 4 Tong hang 0: 15 Tong cot 0: 15
7 5 3 Tong hang 1: 15 Tong cot 1: 15
6 1 8 Tong hang 2: 15 Tong cot 2: 15
Ma phuong
Bi gii: xem trang 166

Bi 102: Vit chng trnh thc hin nhng yu cu sau:

30
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

a. To ma trn c kch thc n x m (n, m nhp t bn phm) vi cc phn t l


cc tr ngu nhin trong on [-100, 100], xut ma trn.
b. Chuyn ma trn A thnh ma trn chuyn v A* v in ra.
Ma trn AT kch thc m x n vi ATji = Aij c gi l ma trn chuyn v
(transpose) ca ma trn A kch thc n x m.

Nhap n, m: 3 4
-31 79 -30 43
60 -69 87 -36
72 10 -63 53
Ma tran chuyen vi:
-31 60 72
79 -69 10
-30 87 -63
43 -36 53
Bi gii: xem trang 167

Bi 103: Vit chng trnh thc hin nhng yu cu sau:


a. To ma trn vung bc n (n nhp t bn phm) vi cc phn t l cc tr ngu
nhin trong on [-10, 10], xut ma trn.
b. Xut ma trn B t ma trn ngun A, sao cho B[i][j] bng tng cc phn t
thuc hai ng cho i qua phn t A[i][j].
Nhap bac ma tran: 3
-4 -6 -7
7 8 -9
4 7 -10
Ma tran B:
-6 -8 5
8 -9 -8
5 5 -6
Bi gii: xem trang 168

Bi 104: Vit chng trnh thc hin nhng yu cu sau:


a. To ma trn vung bc n (n nhp t bn phm) vi cc phn t l cc tr ngu
nhin trong on [-10, 10], xut ma trn.
c. Xut ma trn B t ma trn ngun A, sao cho B[i][j] bng s ln nht trong
hai ng cho i qua phn t A[i][j].
Nhap bac ma tran: 3
-3 3 -1
1 -7 -4
2 -5 -7
Ma tran B:
-3 3 2
3 2 3
2 1 -3
Bi gii: xem trang 170

Bi 105: Vit chng trnh thc hin nhng yu cu sau:

31
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

a. To ma trn c kch thc n x m (n, m nhp t bn phm) vi cc phn t l


cc tr ngu nhin trong on [-10, 10], xut ma trn.
b. To ma trn B t ma trn ngun A sao cho B[i][j] bng tng cc phn t
khng thuc dng i ct j ca ma trn A.
Nhap bac ma tran: 3
9 3 0
-10 -8 -4
-1 0 1
Ma tran B:
-11 -14 -19
4 9 11
-9 -5 -6
Bi gii: xem trang 170

Bi 106: Vit chng trnh thc hin nhng yu cu sau:


a. To ma trn vung bc n (n nhp t bn phm) vi cc
phn t l cc tr ngu nhin trong on [-10, 10],
xut ma trn.
b. Tm cc im yn nga ca ma trn trn.
Phn t Aij gi l im yn nga (saddle point) ca ma trn A nu n va
l phn t nh nht ca dng i, ng thi l phn t ln nht ca ct j;
hoc ngc li, va l phn t ln nht ca dng i, ng thi l phn t
nh nht ca ct j.
Mt ma trn c th khng c hoc c nhiu im yn nga.

Nhap bac ma tran: 3


-2 5 -1
-3 1 -2
-6 2 -4
MIN dong MAX cot: a[0][0] = -2
MAX dong MIN cot: a[1][1] = 1
Bi gii: xem trang 171

Bi 107: To ma trn vung bc 5 vi cc phn t c tr t 1, 2, , 25, sp xp gim


theo hnh zigzag t tri sang phi, t trn xung di.

1 2 3 4 5
10 9 8 7 6
11 12 13 14 15
20 19 18 17 16
21 22 23 24 25
Bi gii: xem trang 172

32
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 108: To ma trn vung bc n (n nhp t bn phm, n < 20) vi cc phn t c


tr t 1 n n2 sp xp tng theo hnh xon c t tri sang phi, t ngoi vo trong.

Nhap bac ma tran (n < 20): 5


1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
Bi gii: xem trang 173

Bi 109: To ma trn vung bc 5 vi cc phn t c tr t 1, 2, , 25, xut ma trn.


Vit chng trnh sp xp tr ca cc phn t trong ma trn tng theo th t nh hnh
di:

Thc cht l ghi ln lt cc phn t ln cc ng cho song song vi


ng cho ph. Mi ln chuyn sang ng cho mi th li i chiu
ghi, thc cht l chuyn v cc phn t ang ghi.

1 2 6 7 15
3 5 8 14 16
4 9 13 17 22
10 12 18 21 23
11 19 20 24 25
Bi gii: xem trang 174

Bi 110: Vit chng trnh thc hin nhng yu cu sau:


a. Cp pht ng ma trn c kch thc n x m (n, m nhp t bn phm) vi cc
phn t l cc tr ngu nhin trong on [-10, 10], xut ma trn.
b. Vit hm int sumNeg( int a[], int m ) tr v s cc s m c trong mng
mt chiu a, kch thc m. S dng hm ny tm s cc s m ca dng k
(0 k < m, nhp t bn phm) trong ma trn trn.
Nhap n, m: 5 4
-7 -3 -4 3
3 5 5 9
7 -6 9 3
9 4 5 7
5 3 -2 6
33
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


Nhap dong k: 2
Dong 2 co 1 so am
Bi gii: xem trang 174

Bi 111: Vit chng trnh thc hin nhng yu cu sau:


a. To ma trn c kch thc n x m (n, m nhp t bn phm) vi cc phn t l
cc tr ngu nhin trong on [-10, 10], xut ma trn.
b. Hy dch tri xoay vng cc phn t trong ma trn theo hnh trn xon c t
tri sang phi, t ngoi vo trong k bc (k nhp t bn phm).
Nhap dong, cot: 4 6
6 -1 -1 8 -8 -1
0 -8 9 5 -3 -3
-10 3 -5 -2 -2 7
5 -10 -1 0 4 10
Nhap buoc dich: 2
-5 3 6 -1 -1 8
5 -10 0 -8 9 -8
-10 -2 -2 -3 5 -1
-1 0 4 10 7 -3
Bi gii: xem trang 176

Bi 112: Cho ma trn vung bc n (nhp t bn phm), cha cc phn t l cc s


thc ngu nhin. Thc hin cc php bin i s cp hng trn ma trn (php kh
Gauss) a ma trn tr thnh ma trn tam gic trn.
nh l v cc php bin i s cp:
- nh thc trn ma trn khng i nu thay mt hng trn ma trn bi mt
hng mi bng hiu ca hng c vi mt hng khc ca ma trn nhn vi
mt h s k bt k.
- nh thc ca ma trn i du nu hon v hai hng trn ma trn.
Php kh Gauss: vi mi phn t Aii trn ng cho chnh ca ma trn:
- Nu Aii khc 0, kh cc phn t trn ct i nm di Aii bng cch thay
cc hng Ajk bi hiu: Ajk - Aik * Aji/Aii
vi j = (i+1)..(n-1) v k = i..(n-1).
- Nu Aii bng 0, tm phn t Aji u tin 0 khc vi j = (i+1)..(n-1); nu
tm thy, hon v hng i vi hng j (v i du nh thc nu cn tnh);
nu khng tm thy, nh thc bng 0.

Nhap bac cua ma tran: 3


0.943 0.217 0.075
0.304 0.165 0.564
0.047 0.178 0.682

0.943 0.217 0.075


0.000 0.095 0.540
0.000 0.000 -0.272
Bi gii: xem trang 180

34
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

CHUI
Bi 113: Nhp mt vo chui s nh phn. Tm trong chui con di nht cha
ton cc s 0.
Nhap chuoi nhi phan: 100101000010001001001
Chuoi 0 dai nhat co 4 ky tu
Bat dau tai s[6]
Bi gii: xem trang 181

Bi 114: Vit cc hm m phng cc hm ca string.h sau: strlen(), strcpy(),


strcat(). Th nghim cc hm ny.
Chuoi 1: [the quick brown fox ] (20)
Chuoi 2: [jumps over the lazy dog] (23)
strcpy( buf, s1 ) roi strcat( buf, s2 ):
[the quick brown fox jumps over the lazy dog] (43)
Bi gii: xem trang 182

Bi 115: Vit cc hm m phng cc hm ca string.h sau: strcmp(), strchr(),


strrchr(). Th nghim cc hm ny.
Chuoi goc s: [jackdaws love my big sphinx of quartz]
strchr( s, 'm' ) : [my big sphinx of quartz]
strrchr( s, 'o' ): [of quartz]
Sap xep cac chuoi dung strcmp():
black blue brown
Bi gii: xem trang 184

Bi 116: Vit cc hm m phng ca cc hm string.h sau: strspn(), strncmp(),


strstr(). Th nghim cc hm ny.
Chuoi kiem tra : hom qua qua noi qua ma qua khong qua
Vi tri tu 'qua': x x x x x
Ky tu dau tien cua s = 'cabbage' khong co trong 'abc' la s[5]
Bi gii: xem trang 186

Bi 117: Vit cc hm:


a. M phng hm LEFT (tr v n k t bn tri chui) ca Microsoft Excel.
b. M phng hm RIGHT (tr v n k t bn phi chui) ca Microsoft Excel.
Chuoi goc: [Kernighan and Ritchie]
left( str, 9 ) : [Kernighan]
right( str, 7 ): [Ritchie]
Bi gii: xem trang 189

Bi 118: Vit chng trnh nhp vo mt chui, ngoi cc k t ch ci cn cho


php cc k t space, tab, nhy n, nhy i, chm hi, chm than, chm, phy. X
l chui nh sau:
a. B cc k t space tha (cc k t space u chui, cui chui, gia cc t
ch cha li mt k t space).
b. Xut cc t phn bit, c vit hoa cc k t u mi t, vit thng cc k
t cn li ca t.

35
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Chuoi goc : [ 'bJARne? sTROUstRUP' ]


Loai space du: ['bJARne? sTROUstRUP']
Cac tu da chuan hoa:
Bjarne, Stroustrup
Bi gii: xem trang 190

Bi 119: Vit chng trnh nhp vo mt chui ti a 255 k t.


a. m s t c trong chui bit gia cc t c t nht mt k t space, cc du
. v ,, khng c k t c bit khc.
b. Thng k tn s xut hin cc t c 1, 2, 3, 4, 5, 6, 7 k t c trong chui
nhp trn.
Nhap chuoi: Chieu nay, tren song, khong mot con do.
Co 8 tu
Tan so xuat hien cac tu:
1[0] 2[1] 3[3] 4[2] 5[2] 6[0] 7[0]
Bi gii: xem trang 191

Bi 120: Vit chng trnh yu cu nhp vo hai chui k t, mi chui c chiu di


ti a 80 k t. Chn chui 2 vo chui 1 ti v tr th k (k nhp t bn phm, vi 0
k chiu di chui 1).
Chuoi goc : Em noi sao, roi sao?
Chuoi chen : doi tre muon
Vi tri chen: 11
Chuoi ket qua: Em noi sao, doi tre muon roi sao?
Bi gii: xem trang 192

Bi 121: Vit chng trnh yu cu nhp vo chui k t c chiu di ti a l 80


k t. Nhp vo hai s nguyn dng n v p, trong chui trn tin hnh xa n k t
bt u t v tr p.
Nhap chuoi: Con dieu roi cho vuc tham buon theo
Nhap vi tri dau: 9
Nhap so ky tu loai bo: 17
Chuoi ket qua: Con dieu buon theo
Bi gii: xem trang 193

Bi 122: Vit chng trnh nhp vo mt s nh phn dng chui k t 0 v 1,


chuyn s ny thnh mt s nguyn h thp phn.
Nhap chuoi nhi phan: 100110111101010010100011
Tri thap phan: 10212515

Bi gii: xem trang 194

Bi 123: Vit chng trnh ch dng cc thao tc trn chui, cng hai s nh phn
dng chui k t, in ra kt qu cng dng chui k t.
1101010000110001
11000000111001
-----------------
10000010001101010

36
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi gii: xem trang 195

Bi 124: Vit hm itos() nhn vo mt s nguyn dng, chuyn s nguyn dng


ny thnh chui k t. Vit hm stoi() ngc li, nhn vo mt chui k t s m
t mt s nguyn dng, chuyn chui ny thnh s nguyn dng.
Nhap so nguyen duong n: 12345
itos() -> 12345
stoi() -> 12345
Bi gii: xem trang 197

Bi 125: Vit chng trnh nhp vo hai s nguyn dng rt ln lu dng chui k
t, in ra kt qu nhn hai s nguyn dng trn cng dng chui k t. Trnh by
ging nh bi ton nhn tay. Thc hin hon ton bng cc thao tc trn chui.
So bi nhan: 87654321
So nhan : 12345678
87654321
*
12345678
--------------------
701234568
613580247
525925926
438271605
350617284
262962963
175308642
87654321
--------------------
1082152022374638
Bi gii: xem trang 198

Bi 126: Vit chng trnh nhp mt chui v mt k t. Tm tt c cc v tr xut


hin ca k t c trong mt chui s.
Nhap chuoi: Mai sau khoc nhung roi don dinh menh
Tm ky tu nao? o
Vi tri xuat hien: 10 20 24
Bi gii: xem trang 200

Bi 127: Khng s dng cc hm ca string.h, vit chng trnh o cc t ca


mt chui cho sn hoc nhp t bn phm. Chui c th c nhng k t c bit.
Chuoi goc: [ cam khong duoc do rac ]
Chuoi dao: [ rac do duoc khong cam ]

Bi gii: xem trang 201

Bi 128: Nhp mt chui k t, xut ra cc t di nht trong chui.


Nhap chuoi: Troi dat rong nen tinh yeu de lac
Troi[4] rong[4] tinh[4]

Bi gii: xem trang 203


37
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 129: Nhp mt chui k t cha t nht 4 k t s. Loi b mt s k t ra khi


chui sao cho 4 k t s cui cng cn li (theo ng th t ) to nn s ln nht.
Nhap chuoi (it nhat 4 chu so): 24d5n4r05f704n652z393
So lon nhat con lai: 7693

Bi gii: xem trang 204

Bi 130: Vit hm tm kim trong mt s chui cho trc, mt chui so trng vi


chui mu. Cho php chui mu dng k t i din (wildcard): *. K t *: so trng
vi khng hoc nhiu k t bt k ti v tr tng ng trong chui cho trc.
Danh sach cac tu: television menu editions education
Tim [*e*u*]: menu education
Tim [e*i*n]: education
Tim [*e*o*]: television editions education
Bi gii: xem trang 206

Bi 131: Vit chng trnh nhp vo chui k t c chiu di ti a 80 k t. Khng


phn bit ch hoa, ch thng, thc hin cc cng vic sau:
a. Kim tra xem chui c i xng hay khng?
b. Nhp vo mt chui k t ri tin hnh xa ht cc k t ging vi k t
trong chui trn.
Nhap chuoi: Stressed? No tips? Spit on desserts!
Chuoi doi xung
Xoa ky tu nao? s
treed? No tip? pit on deert!
Bi gii: xem trang 207

Bi 132: Vit chng trnh nhp hai chui v xc nh xem chng c c to ra


vi cng cc k t hay khng. V d dear v reader l hai chui to t cng cc
k t a, d, e, r.
Nhap chuoi a: dear
Nhap chuoi b: reader
Tao tu cung cac ky tu
Bi gii: xem trang 209

Bi 133: Vit hm hextoulong() nhn mt chui m t s unsigned long int thuc


h thp lc phn, tr v s unsigned long int thuc h thp phn tng ng.
Dng phng php Horner13 nh sau:
1. t x = 0 V d: s 0F4D
2. t i bng th t k t tri nht i hi x = 16 * x + h
ca chui hex, th t tnh t 0, phi 3 0 0
sang tri. hi l tr hex ti v tr i. 2 F 16 * 0 + F = 15
1 4 16 * 15 + 4 = 244
3. Nhn x vi 16 ri cng hi vi x
0 D 16 * 244 + D = 3917
4. Gim i i 1.

13 William George Horner (1786 - 1837)


38
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

5. Nu i 0, lp li bc 3, 4
6. Tr v x

Nhap chuoi hex: 3AdE68b1


Decimal: 987654321
Bi gii: xem trang 209

Bi 134: Vit hm rtoi() nhn mt s La m di dng chui k t, tr v s nguyn


tng ng.
M: 1000 D: 500 C: 100
L: 50 X: 10 V: 5 I: 1
K hiu th hin 10 khng c ng ngay trc
x k hiu ln hn 10x+1.
V d: s 99 l XCIX, khng phi IC.

MCMXCIX = 1999
MCMIC = So khong hop le

Bi gii: xem trang 210

Bi 135: Vit chng trnh thay th tt c cc chui con cho trc (thng gi l
cc mu - pattern) trong mt chui bng mt chui khc. Xut chui kt qu.
Chuoi goc: ta mo thay em o mot noi em xa lam
Thay the 'em' voi 'em yeu'
Chuoi moi: Ta mo thay em yeu o mot noi em yeu xa lam
Bi gii: xem trang 211

Bi 136: Nhp vo s dng vn bn cho n khi nhn Ctrl+Z. Vit chng trnh m
s v in s dng, s t, tn s, cc ch ci trong cc dng vn bn .
Que nha me co gian thien ly,
Mot khoang ram hien giua nang trua.
Va nhung chuyen nghe hoai khong biet chan,
Bat dau la: Ngay xua, ngay xua...
^Z
4 hang, 29 tu, voi tan so cac ky tu:
A: 17 B: 2 C: 3 D: 1 E: 7 F: 0 G: 9
H: 10 I: 6 J: 0 K: 2 L: 2 M: 3 N: 15
O: 5 P: 0 Q: 1 R: 2 S: 0 T: 5 U: 8
V: 1 W: 0 X: 2 Y: 4 Z: 0
Bi gii: xem trang 212

Bi 137: Vit chng trnh c cc tn y , gia cc t ca tn ch c k t space,


mi tn trn mt dng, cho n khi nhn Ctrl+Z (hoc Ctrl+D nu trn Unix). Sau
in chng ta theo dng nin gim in thoi chun. V d:
Wolfgang Amadeus Mozart Mozart, Wolfgang A.
George Frederic Handel
Carl Philipp Emanuel Bach
Wolfgang Amadeus Mozart
^Z
Handel, George F.
39
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


Bach, Carl P. E.
Mozart, Wolfgang A.
Bi gii: xem trang 213

Bi 138: Vit chng trnh c vo mt s dng, mi dng khng qu 50 k t, cho


n khi nhn Ctrl+Z. Sau in li cc dng theo dng thc canh phi vi chiu
ngang dng 50 k t.
Xa em, gio it, lanh nhieu,
Lua khuya tan cham, mua chieu do nhanh.
(Tran Huyen Tran)
^Z
Xa em, gio it, lanh nhieu,
Lua khuya tan cham, mua chieu do nhanh.
(Tran Huyen Tran)
Bi gii: xem trang 214

Bi 139: Nn run-length: mt chui k t (khng cha k t s) c th nn bng


cch sau: Chui con gm n (n > 1) k t a ging nhau s c thay th bng na (ch
, n c th c nhiu hn 1 k t). V d: aabcccd c nn thnh 2ab3cd. Vit chng
trnh nn v gii nn run-length chui k t (khng cha k t s) nhp vo.
Chuoi goc: aaabccccddddeeeeeeeeeeeefghhhhhhiiiiaaaabbbbbbc
Nen : 3ab4c4d12efg6h4i4a6bc [44.7%]
Giai nen : aaabccccddddeeeeeeeeeeeefghhhhhhiiiiaaaabbbbbbc
Bi gii: xem trang 215

Bi 140: ISBN (International Standard Book Number, pht m is-ben) l m s


duy nht cho sch xut bn trn th gii. ISBN bao gm 13 k t (0 - 9, k t ni -
(hyphen), X) chia thnh 4 phn bi k t ni: nh danh nhm (quc gia, ngn ng,
) nh danh nh xut bn, nh danh sch ca nh xut bn , v s kim tra. S
kim tra c dng kt hp vi cc s khc trong mt thut ton kim tra s ISBN,
ch cha mt k t (0 n 9, X thay cho 10).
Vit chng trnh kim tra mt s chui ISBN nhp vo c hp l hay khng.
Thut ton n gin dng kim tra tnh hp l ca s ISBN: ly tng s
ca ISBN nhn vi s th t ch v tr ca n (bt u t 1, tnh t phi
sang tri, khng tnh du ni ). Tng cc tch nhn c nu chia ht cho
11 th s ISBN c kim tra l hp l. V d:
ISBN 0 - 1 3 1 - 1 0 3 7 0 - 9
V tr 10 9 8 7 6 5 4 3 2 1
Tch 0 + 9 + 24 + 7 + 6 + 0 + 12 + 21 + 0 + 9 = 88
88 chia ht cho 11, vy s ISBN trn hp l.

ISBN 0-133-62658-x hop le

Bi gii: xem trang 216

40
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

QUY
Bi 141: Gi s dn s th gii nm 2000 l 8 t ngi vi mc tng trng hng
nm khng i l 2,5%. Vit hm quy tnh dn s th gii nm 2010.
10240676354 nguoi

Bi gii: xem trang 217

Bi 142: Vit chng trnh nhp vo mt dng vn bn, kt thc bng phm Enter,
sau hin th dng vn bn o ca vn bn nhp. Dng gii thut quy vi hm
main(), khng dng cc cu trc lu tr nh mng, chui.
Ngn ng C cho php quy ngay c vi hm main()

race fast safe car


rac efas tsaf ecar

Bi gii: xem trang 218

Bi 143: Cho hm Ackermann14 vi n v m khng m:


m 1 n 0

A n, m A n 1, 1 m 0
A n 1, A n, m 1 n, m 0

Tnh A(3, 6). Cho bit s ln gi quy khi tnh A(3, 6).
A( 3, 6 ) = 509
Goi de quy 172233 lan

Bi gii: xem trang 219

Bi 144: Vit hm quy double Pi() khng tham s tnh s Pi theo cng thc:
1 1 1 1 (vi sai s epsilon 10-3, 4/n < epsilon)
1 .. (1)k
4 3 5 7 2k 1
Pi = 3.141

Bi gii: xem trang 220

Bi 145: Vit cc hm quy


void ToBin( int n ) xut dng nh phn ca n (n nguyn dng).
void ToHex( int n ) xut dng thp lc phn ca n (n nguyn dng).
Nhap x: 123
Bin: 1111011
Hex: 7B
Bi gii: xem trang 221

Bi 146: Nhp vo s nguyn n (0 < n 9). Xut tam gic Pascal chiu cao n.

14 Wilhelm Ackermann (1896 - 1962)


41
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Tam gic Pascal c xc nh nh sau:


15

C00
C10 C11
...
Cn0 Cn1...Cnn
Trong Ckn
n!
,0 k n l t hp n chp k (trong trng hp
k! (n k)!
ny gi l cc h s ca nh thc Newton16).
n cn c xc nh bng cng thc truy hi:
Ck

1 k 0

Ckn 1 k n
Ck k 1
n 1 Cn 1 0 k n

Nhap n (n < 9): 4

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
Bi gii: xem trang 222

Bi 147: Vit hm sp xp tng mt mng theo kiu chn (SelectionSort) vi gii


thut quy: void SelectSort( int a[], int n ) (n l s phn t).
Mang goc : 3 5 4 6 7 1 2
Mang tang: 1 2 3 4 5 6 7

Bi gii: xem trang 223

Bi 148: Vit hm sp xp gim mt mng theo kiu ni bt (BubbleSort) vi gii


thut quy: void BubbleSort( int a[], int n ) (n l s phn t).
Mang goc : 3 5 4 6 7 1 2
Mang giam: 7 6 5 4 3 2 1

Bi gii: xem trang 224

Bi 149: Dng gii thut quy, vit hm tm kim nh phn trn mng c sp
xp: int BSearch( int a[], int x, int left, int right )
(left l bin tri, right l bin phi ca mng, x l s cn tm trong mng).
2 3 4 5 6 7
Nhap x: 5
a[3]
Bi gii: xem trang 225

15 Blaise Pascal (1623 - 1662)


16 Isaac Newton (1643 - 1727)
42
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 150: Dng gii thut quy, vit hm int OddSum( int a[], int n ) tr v
tng cc phn t c tr l trong mng.
2 3 4 5 6 7
Tong cac phan tu le: 15

Bi gii: xem trang 227

Bi 151: Dng gii thut quy, vit hm int MaxArr( int a[], int n ) tr v v
tr ca phn t c tr ln nht trong mt mng khng rng.
-2 3 -4 -5 6 -8
Max = a[4] = 6

Bi gii: xem trang 228

Bi 152: Dng gii thut quy, vit hm int isSym( int a[], int left, int
right ) kim tra xem mt mng c i xng hay khng (left l bin tri, right l
bin phi, tr v 1 nu mng i xng).
7 -2 3 4 3 -2 7
Mang doi xung

Bi gii: xem trang 229

Bi 153: Dng gii thut quy, vit hm float NegAverage( int a[], int n ) tr
v tr trung bnh cc phn t m ca mt mng cha cc s nguyn.
-2 3 -4 -5 6 -8
Trung binh cong cac phan tu am: -4.75

Bi gii: xem trang 230

Bi 154: Dng gii thut quy, vit chng trnh FACTORIAL.C, tnh giai tha cc
s nguyn dng. Cc s nguyn dng c nhp vo t tham s dng lnh.
FACTORIAL 9 3A 12
9! = 362880
3A: so khong hop le
12! = 479001600
Bi gii: xem trang 231

Bi 155: Vit hm quy F(n) tnh s Fibonacci th n (n nguyn, 0 < n < 40, nhp
t bn phm) theo cng thc truy hi:
1 n 1,2
Fn
Fn 1 Fn 2 n 2
Kim tra li bng cng thc dng ng (ca A. de Moivre) dng tnh s Fibonacci
n n 1 5
th n nh sau: Fn vi , 1 ( gi l golden mean).
5 2
Nhap n (0 < n < 40): 24
De quy : Fi(24) = 46368
Cong thuc dong: Fi(24) = 46368
Bi gii: xem trang 231

43
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 156: Vit hm quy tnh phn s lin tc sau:


1
F 1
1
3
1
5
...
1
101
103
F = 1.31304

Bi gii: xem trang 232

Bi 157: Vit gii thut quy, tnh nh thc ca mt ma trn vung bc n (nhp
t bn phm), tr cc phn t ca ma trn ly ngu nhin trong on [-10, 10].
Cng thc truy hi dng tnh nh thc ma trn A vung bc n:
a11 n 1
n
det(A)
1 a1j det(A 1j) n 1
1j

j 1

Vi (Aij) l ma trn con vung bc n-1, to t ma trn A b i cc phn t


trn dng 1, ct j (dng v ct ca phn t a1j)

Nhap bac ma tran: 4


10 -2 3 9
7 6 2 -10
9 10 4 -5
3 -4 -3 -2
Det(A) = 2448
Bi gii: xem trang 233

Bi 158: Dng gii thut quy, vit chng trnh GCD (Greatest Common Divisor),
tnh c s chung ln nht ca 2 s nguyn thp vo t bn phm. Chng trnh phi
x l cc trng hp nhp s 0 hoc s m.
Thut ton Euclid17 vi cng thc truy hi:
b a 0
gcda, b
gcdb mod a, a a 0

Nhap hai so: 0 0


GCD (0, 0): khong xac dinh
Nhap hai so: 0 3
GCD (0,3) = 3
Nhap hai so: -18 27
GCD(-18, 27) = 9
Bi gii: xem trang 235

17 Euclid of Alexandria (325 BC - 265 BC)


44
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 159: Mt palindrome l mt t hay mt cu, c xui ngc u ging nh


nhau. Vit chng trnh, vi gii thut quy, c tng dng t bn phm vo v
bo cho bit c phi l palindrome khng. Vi mi dng, b qua cc k t khng
phi alphabet v khng quan tm n ch hoa, ch thng.
O give me a home
-> khong phai palinedrom
Madam, Im Adam!
-> Palindrome
^Z
Bi gii: xem trang 236

Bi 160: Vit hm quy in ra tt c n! cc hon v ca chui n k t u bng


alphabet. p dng tm tt c cc hon v ca chui ABC (n = 3).
Nhap n: 3
ABC ACB BAC BCA CBA CAB

Bi gii: xem trang 236

Bi 161: Vit cc hm quy tnh sin(x) v cos(x) theo cp ng nht thc:


sin 3x (4 cos2 x 1) sin x

cos 3x (1 4 sin2 x) cos x
v cp ng nht thc xp x cho cc gi tr rt nh ca x:
sin x x x 3 / 6

cos x 1 x 2 / 2
Vi chnh xc 5.10-4. Kim tra vi cc hm tng ng ca math.h.
Doi chung tinh bang math.h trong ()
sin(-2.1) = -0.8632093666 ( -0.8632093666 )
cos(-2.1) = -0.5048461046 ( -0.5048461046 )
Bi gii: xem trang 237

Bi 162: In cc ln di chuyn a trong bi ton thp Hanoi vi 4 a.


Bi ton thp Hanoi (Towers of Hanoi): c 3 cc A, B, C; khi u cc A c
n a xp sao cho a ln hn lun nm bn di, 2 cc kia trng.
Hy chuyn tt c a t cc A sang cc C, c dng cc ph B. trong qu
trnh chuyn a phi m bo a ln hn lun nm bn di.
Minh ha vi 2 a:

A B C A B C A B C A B C
Xem thm v bi ny trong nhiu sch v lp trnh.

Disk 1: [1] -> [2]


Disk 2: [1] -> [3]
Disk 1: [2] -> [3]
Disk 3: [1] -> [2]
Disk 1: [3] -> [1]

45
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


Disk 2: [3] -> [2]
Disk 1: [1] -> [2]
Disk 4: [1] -> [3]
Disk 1: [2] -> [3]
Disk 2: [2] -> [1]
Disk 1: [3] -> [1]
Disk 3: [2] -> [3]
Disk 1: [1] -> [2]
Disk 2: [1] -> [3]
Disk 1: [2] -> [3]
Bi gii: xem trang 238

Bi 163: C th tnh xn ch cn khong log2n php nhn da vo nhn xt:


1 n 0
n k k
x (x )(x ) n 2k k
k k
x(x )(x ) n 2k 1
Hy tnh xn vi x l s thc, n l s nguyn, nhp t bn phm. Kim tra i chng
bng hm pow() ca math.h.
Nhap x, n: 8.5 - 2
mypow() : 0.013841
pow() : 0.013841
Bi gii: xem trang 239

STRUCTURE - UNION - BIT FIELD


Bi 164: Vit chng trnh ci t cu trc ca mt s phc v cc hm thc hin
cc php ton trn n.
Nu z = a + bi v w = c + di l hai s phc, th:
z w (a c) (b d)i
z - w (a - c) (b - d)i
zw (ac - bd) (ad bc)i
z ac bd bc ad
i
2 2
w c d c2 d2

Nhap mot so phuc:


Phan thuc: 3.5
Phan ao : 0.7
Nhap mot so phuc:
Phan thuc: 4.2
Phan ao : 2.6
a + b = 7.7 + 3.3i
a - b = -0.7 - 1.9i
a * b = 12.9 + 12.0i
a / b = 0.7 - 0.3i
Bi gii: xem trang 240

Bi 165: Vit chng trnh ci t cu trc ca mt phn s v cc hm thc hin


cc php ton s hc trn n.
46
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Nhap tu so va mau so: 1 -2


Nhap tu so va mau so: -3 4
a + b = -5/4
a - b = 1/4
a * b = 3/8
a / b = 2/3
Bi gii: xem trang 242

Bi 166: Vit chng trnh ci t cu trc lu thng tin ca ng trn, bao gm


ta tm v bn knh ca ng trn. Nhp d liu ca hai ng trn, xc nh
v tr tng i gia chng.
Vi mi cp ng trn, xt 3 trng hp:
- Tm ng trn ny nm ngoi ng trn kia.
- Hai tm trng nhau.
- Tm ng trn ny nm trn hoc trong ng trn kia (tr tm).
Da vo khong cch gia hai tm vi bn knh ca mi ng trn xc
nh v tr tng i gia chng.

Nhap xc, yc va R cua C1: 2.23 1.12 1.67


Nhap xc, yc va R cua C2: 1.32 2.41 3.25
Trong nhau
Bi gii: xem trang 243

Bi 167: Vit chng trnh ci t cu trc mt n thc (mt tham s), v dng
mng cc cu trc ny lu mt a thc. Nhp vo hai a thc, thc hin php ton
nhn hai a thc ny; sau tnh tr ca a thc kt qu vi tr ca tham s nhp vo
t bn phm.
Tch ca 2 a thc 1 tham s x, f(x) bc m v g(x) bc n l:
f(x).g(x) cm n x m n cm n 1 x m n 1 ... c1 x c 0
Trong ck bng tng cc tch aib j m i j k (k 0,1,..., m n)

Tnh tr a thc tng qut bc n: P(x) anx n an 1 x n 1 ... a1x a0


phi thc hin n(n+1)/2 php nhn (xk tnh k-1 php nhn). Nu tnh tr ca
a thc bng phng php Horner sau y, ch cn thc hin n php nhn:
P(x) ((...((anx an 1)x an 2 )x ... a2 )x a1)x a0

Nhap bac da thuc: 3


Nhap 4 he so: 5 -4 7 -2
Nhap bac da thuc: 2
Nhap 3 he so: 3 -2 7
p1(x) = 5x^3-4x^2+7x-2
p2(x) = 3x^2-2x+7
Da thuc ket qua:
p(x) = 15x^5-22x^4+64x^3-48x^2+53x-14
Nhap x: 1.2
p(1.2) = 82.7776
Bi gii: xem trang 244
47
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 168: Vit chng trnh ci t mt mng cc cu trc lu tr thng tin sch trong
th vin, bao gm: ta sch, ISBN, tn tc gi, tn nh xut bn, ngy thng nm
nhp sch (l ngy vit phiu). Sau , nhp vo mt chui ISBN, tm v in ra thng
tin sch tng ng nu c.
Dng struct tm ca time.h lu tr ngy cp nht phiu.

Nhap thong tin sach:


Tua > The C Programming Language
ISBN > 0-131-10370-9
Tac gia > Kernighan, Brian W. & Ritchie, Dennis M.
NXB > Prentice Hall
Tiep ( y/n )? y
Nhap thong tin sach:
Tua > Applications Programming in ANSI C
ISBN > 0-023-61141-3
Tac gia > Johnsonbaugh, R. & Kalin M.
NXB > MacMillan Pub. Co.
Tiep ( y/n )? n
ISBN ? 0-023-61141-3
Ket qua tim:
Applications Programming in ANSI C
Johnsonbaugh, R. & Kalin M.
MacMillan Pub. Co.
[update: 15-04-2006]
Bi gii: xem trang 246

Bi 169: Vit chng trnh ci t mt cu trc lu thng tin chm cng ngy (time
card) ca mt t 6 cng nhn, bao gm: m s cng nhn, gi vo lm v gi ngh.
Mt t vo lm khng c lm vt qu 2 ca lin tip. In bng thanh ton cng
ngy ca t cng nhn . Bit:
Ca m 01 gi - 06 gi, 18 gi - 24 gi 15000/gi
Ca ngy 06 gi - 18 gi 10000/gi
Nhap ID cong nhan 1: 78-125
Vao (gio phut): 1 45
Ra (gio phut) : 5 30
...
Nhap ID cong nhan 6: 89-273
Vao (gio phut): 21 25
Ra (gio phut) : 3 40
78-125 01:45 05:30 56250
45-224 03:10 09:50 80833
52-436 06:20 01:30 Nhap sai!
82-729 14:40 20:30 70833
67-451 18:45 23:10 70000
Bi gii: xem trang 248

48
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 170: Vit chng trnh t mt cu trc lu 52 l bi ca b bi ty, bao gm


nc (face: ch , hai, ba, , mi, bi, m, gi) v cht (suit: c, r, chun, bch).
Thc hin vic chia bi ngu nhin cho 4 ngi chi.
Hy trn bi (shuffle) ngu nhin, trc khi chia theo th t.

Chin Ro Bon Co Bay Bich Dam Ro


Sau Co Bay Ro Nam Ro Ba Ro
...
Gia Chuon Boi Ro Nam Chuon Chin Bich
Bon Chuon Sau Ro Ach Ro Sau Bich
Bi gii: xem trang 250

Bi 171: Vit chng trnh nhp vo mt k t. Khng dng cc ton t thao tc


trn bit (bitwise operators) cng nh khng thc hin php chia cho 2, hy in dng
hin th nh phn ca k t ny.
Dng union kt hp vi bit field.

Nhap 1 ky tu: Z
0 1 0 1 1 0 1 0
Bi gii: xem trang 251

TP TIN
Bi 172: Vit chng trnh FILESIZE.C dng xc nh kch thc ca mt s tp tin.
Tn cc tp tin cn c xc nh kch thc c nhp nh l tham s dng lnh
ca FILESIZE.
FILESIZE readme.txt list.dat
readme.txt [2148 byte(s)]
list.dat [1246 byte(s)]
Bi gii: xem trang 252

Bi 173: Vit chng trnh ghi 5 s nguyn ngu nhin vo tp tin INTERGER.DAT, 5
s thc ngu nhin vo tp tin REAL.DAT. Sau c cc s ny t tp tin v xut ra
mn hnh.
Ghi xong file...
28764 13997 19450 7297 24082
0.14554 0.13376 0.82284 0.35276 0.79724
Doc xong file...
Bi gii: xem trang 253

Bi 174: Tp tin vn bn PERSON.DAT lu thng tin c nhn thnh cc dng c nh


dng nh sau (ch thch trong () l yu cu ca trng):
code(unsigned int):firstname lastname(32),address(32):birthday(mm/dd/yy)
Vit chng trnh c tp tin PERSON.DAT, ly v hin th thng tin lu tr ng vi
tng c nhn.
49
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Ni dung tp tin PERSON.DAT


1654:Jackie Chan,Hong Kong:7/22/54
4424:Tony Jaa,Thailand:5/12/76
Kt qu
Jackie Chan [code: 1654]
Address : [Hong Kong]
Birthday: [7/22/54]
Tony Jaa [code: 4424]
Address : [Thailand]
Birthday: [5/12/76]
Bi gii: xem trang 254

Bi 175: Vit chng trnh UPPER.C khi chy s chuyn i tt c k t thng ca


mt tp tin (nhp tn tp tin t dng lnh) thnh k t hoa cha vo mt tp tin khc
(nhp tn tp tin t dng lnh).
UPPER lower.txt upper.txt
Chuyen thanh chu hoa xong...
Bi gii: xem trang 256

Bi 176: Vit chng trnh CIPHER.C c hai chc nng: m ha ni dung mt tp tin
v gii m ni dung tp tin c m ha. Lut m ha: k t no c m ASCII nh
hn 128 th chuyn m thnh: m k t + 128; k t no c m ASCII ln hn
128 th chuyn m thnh: m k t - 128.
M ha:
CIPHER origin.txt encode.txt
Xu ly xong...
Gii m:
CIPHER encode.txt origin.txt
Xu ly xong...
Bi gii: xem trang 257

Bi 177: Vit chng trnh TESTFILE.C s dng theo c php sau:


TESTFILE num filename : (number) to tp tin filename cha num k t ngu
nhin vit hoa.
TESTFILE -v filename : (view) in ni dung tp tin filename ra mn hnh.
TESTFILE -r filename : (reverse) in ngc ni dung tp tin filename ra mn
hnh.
TESTFILE 10 test.txt
File da duoc tao...
TESTFILE -v test.txt
F L P C Q P Z D L O
Cuoi file...
TESTFILE -r test.txt
O L D Z P Q C P L F
Dau file...
Bi gii: xem trang 258

Bi 178: Vit chng trnh LINES.C hin th ni dung ca tp tin ngun vi tng
dng c nh s ti u dng. C php s dng:
50
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

LINES < SOURCE.C : hin th tp tin SOURCE.C c nh s dng.


LINES < SOURCE.C > NSOURCE.C: tp tin mi NSOURCE.C s c nh s dng.
LINES < SOURCE.C
0: #include <stdio.h>
1:
2: int main ()
3: {
...
17: return 0;
18: }
Bi gii: xem trang 259

Bi 179: Vit chng trnh thc hin cc tc v sau:


- To tp tin cha cc mu tin theo cu trc sau:
struct STUDENT {
int code; /* m s */
char name [20]; /* tn */
double avgmark; /* im trung bnh */
};
- Nhp thng tin mt s sinh vin, thm vo tp tin (gi s nhp trng code khng
trng, khng cn kim tra).
- In tt c cc mu tin lu trong tp tin.
- Nhp code, tm mu tin trong tp tin theo code; nu tm c, cho php cp nht li
trng avgmark ca mu tin .
- Dng mt menu n gin hin th cc tc v.
Ten file? STUDENT.DAT

MENU (File 'STUDENT.DAT')


----
[1]. Them
[2]. Doc
[3]. Sua
[4]. Thoat
Chon tac vu: 1
GHI FILE
Nhap mot mau tin (y/n)? y
Ma so > 7366
Ten > Steve Blenheim
Diem TB > 7.84
Nhap mot mau tin (y/n)? y
Ma so > 8376
Ten > James Ikeda
Diem TB > 8.21
Nhap mot mau tin (y/n)? n
Da ghi file...

MENU (File 'STUDENT.DAT')


----
[1]. Them
[2]. Doc
[3]. Sua
[4]. Thoat
51
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


Chon tac vu: 2
DOC FILE
1 7366 Steve Blenheim 7.84
2 8376 James Ikeda 8.21
Tong cong: 2 record(s)

MENU (File 'STUDENT.DAT')


----
[1]. Them
[2]. Doc
[3]. Sua
[4]. Thoat
Chon tac vu: 3
SUA
Ma so > 8376
James Ikeda
Diem moi > 7.94
Da cap nhat...

MENU (File 'STUDENT.DAT')


----
[1]. Them
[2]. Doc
[3]. Sua
[4]. Thoat
Chon tac vu: 4
Bye...
Bi gii: xem trang 260

Bi 180: Vit chng trnh c mt tp tin vn bn. Sau trnh by nhng thng
k sau: s dng, s t, tn s xut hin ca cc t trong tp tin .
Ni dung tp tin HANOI.TXT
Ta con em, cay bang mo coi mua Dong...
Goc pho mo coi mua Dong, manh trang mo coi mua Dong
Mua Dong nam ay...
Kt qu:
Nhap ten file: HANOI.TXT
File HANOI.TXT co 3 dong, 25 tu, voi tan so cac tu:
ta: 1 con: 1 em: 1 cay: 1
bang: 1 mo: 3 coi: 3 mua: 4
dong: 4 goc: 1 pho: 1 manh: 1
trang: 1 nam: 1 ay: 1
Bi gii: xem trang 263

Bi 181: Vit chng trnh nhn vo chui s, sau c mt tp tin vn bn. In s


th t cc dng c cha chui s; vi mi dng in cc v tr c xut hin chui s.
Ni dung tp tin TONGBIET.TXT
Dua nguoi, ta khong dua sang song,
Sao lai thay song o trong long?
Bong chieu khong tham, khong vang vot
Sao day hoang hon trong mat trong?
Kt qu:
Nhap ten file: THO.TXT
52
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


Nhap chuoi tim: khong
Dong 0: 14
Dong 2: 11 23
Bi gii: xem trang 265

Bi 182: Vit chng trnh to mt tp tin nh phn cha cc mu tin, mi mu tin


bao gm tn, s in thoi, a ch ca mt ngi. Sau c tp tin nh phn ny
v to mt tp tin vn bn cha kt qu c c, trnh by dng bng.
Tao file nhi phan PERSON.DAT...
Nhap mot mau tin (y/n)? y
Ten > Popeye Sailor
Dien thoai > (156)454-3325
Dia chi > 94 Comics Str., Anywhere
Nhap mot mau tin (y/n)? y
Ten > James Bond
Dien thoai > (846)233-2837
Dia chi > 07 Movies Str., Cinema
Nhap mot mau tin (y/n)? n
Tao file van ban PERSON.TXT...
Hien thi file van ban PERSON.TXT...
Popeye Sailor (156)454-3325 94 Comics Str., Anywhere
James Bond (846)233-2837 07 Movies Str., Cinema
Bi gii: xem trang 265

Bi 183: Vit mt hm dng gii thut quy c cc dng vn bn (khng qu 255


k t) t mt tp tin. Sau ghi cc dng vn bn ny theo mt th t o ngc
vo mt tp tin khc.
REVERSE test.txt reverse.txt
Dao nguoc de quy xong...

Bi gii: xem trang 267

Bi 184: Tp tin EMP.DAT cha cc h s nhn vin, mi h s l mt cu trc bao


gm tn, ngy sinh (l mt cu trc bao gm ngy, thng, nm sinh), lng. Vit
chng trnh nhp, sp xp cc mu tin trong tp tin trn theo th t tng ca tui,
xut danh sch sp xp. Thao tc trn tp tin, khng dng mng tm.
Nhap so nhan vien: 3
Nhap (ten, ngay, thang, nam sinh, luong):
1 > Dong 30 4 1982 350000
2 > Tay 26 3 1980 150000
3 > Nam 1 9 1982 400000
Nhap du lieu xong ...
Xuat danh sach sap xep:
Nam 1/9/1982 400000
Dong 30/4/1982 350000
Tay 26/3/1980 150000
Bi gii: xem trang 268

53
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 185: Mi ma trn kch thc m x n c lu trong mt tp tin vn bn theo quy


c sau: dng u cha tr m (s dng) v tr n (s ct); m dng tip theo, mi dng
lu n phn t trn cc dng tng ng ca ma trn, cch nhau bi du space.
Vit chng trnh nhn cc tham s dng lnh l tn cc tp tin vn bn, thc hin
cng vic sau:
- Nu c hai tham s dng lnh: to hai ma trn (kch thc nhp t bn phm), c
cc phn t l cc s thc ngu nhin v lu vo hai tp tin vn bn c tn tng ng
vi cc tham s dng lnh.
- Nu c ba tham s dng lnh: nhn hai ma trn cha trong cc tp tin vn bn c
tn l tham s dng lnh th nht v th hai, sau lu ma trn kt qu vo tp tin
vn bn c tn l tham s dng lnh th ba. Nu php nhn ma trn khng thc hin
c, khng to tp tin kt qu.
MULMATRIX MATRIX1.TXT MATRIX2.TXT
Nhap m, n: 3 4
Tao xong file chua ma tran...
Nhap m, n: 4 5
Tao xong file chua ma tran...

MULMATRIX MATRIX1.TXT MATRIX2.TXT MATRIX3.TXT


Tao xong file chua ma tran...
Bi gii: xem trang 270

Bi 186: Thng tin mt quyn sch trong th vin c lu trong tp tin vn bn


BOOKS.TXT thnh mt khi nh sau:
C How to Program
Deitel, H.M. & Deitel, P.J.
Prentice Hall, 2001
ISBN 0-13-089572-5
*
Cc khi thng tin lu lin tc nhau v cch nhau bi dng c du * (cc dng khc
trong khi khng c c du * u dng)
tm kim nhanh, ngi ta to mt tp tin nh phn INDEX.IDX lu cc mu tin gm
tn sch v v tr ca khi thng tin v tn sch trong tp tin BOOKS.TXT.
Vit chng trnh LOOK s dng theo c php sau:
LOOK -i BOOKS.TXT INDEX.IDX : To tp tin INDEX.IDX.
LOOK -v BOOKS.TXT INDEX.IDX : Hi tn sch, tm trong BOOKS.TXT
nhanh nh INDEX.IDX, in thng tin.
LOOK -i BOOKS.TXT INDEX.IDX
Tao xong file index...
LOOK -v BOOKS.TXT INDEX.IDX
Nhan Ctrl+Z de dung
Ten sach? C How to Program
C How to Program
Deitel, H.M & Deitel, P.J.
Prentice Hall, 2001
ISBN 0-13-089572-5
Ten sach? ^Z
Bi gii: xem trang 273

54
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 187: Vit chng trnh hin th ni dung mt tp tin vn bn trn thit b xut
chun (gi s l mn hnh vn bn 80 x 25); mi ln hin th y cc dng ca mn
hnh, sau dng li ch nhn phm Enter hin th tip.
Bi gii: xem trang 275

Bi 188: Cho hai tp tin vn bn cha cc s nguyn c sp xp theo th t tng


dn. Vit mt chng trnh trn (merge) hai tp tin ny vo mt tp tin s nguyn
th ba cng c sp theo th t tng dn (khng dng mng ph). Tn ca c ba
tp tin c nhp vo nh cc tham s dng lnh.
Ni dung tp tin NUMBER1.TXT: 1 5 9 13 17 19
Ni dung tp tin NUMBER2.TXT: 2 6 10 14 18 22
SORT NUMBER1.TXT NUMBER2.TXT NUMBER.TXT
Tron ket thuc...
Ni dung tp tin NUMBER.TXT: 1 2 5 6 9 10 13 14 17 18 19 22
Bi gii: xem trang 276

Bi 189: Vit chng trnh chia (split) mt tp tin thnh nhiu tp tin nh c kch
thc ti a n. Cc tp tin nh ny cng tn vi tp tin ban u, vi phn m rng
c nh s.
Chng trnh nhn hai tham s dng lnh: tn tp tin cn chia v kch thc ti a n
(tnh bng Kb).
Kim tra kt qu bng cch ni cc tp tin li (lnh COPY /B) hoc vit
chng trnh kt hp (combine) cc tp tin con chia trn thnh mt
tp tin duy nht.

Tp tin bigfile.dat c kch thc 58436 bytes


SPLIT bigfile.dat 20
File bigfile.000 [20480 byte(s)]
File bigfile.001 [20480 byte(s)]
File bigfile.002 [17476 byte(s)]
Chia file ket thuc... [3 file(s)]
Bi gii: xem trang 277

Bi 190: Hin th ni dung ca mt tp tin di dng s thp lc phn. Cch trnh


by ny (gi l hex dump) thng thy trong cc tin ch xem tp tin ph bin.
Xem v d minh ha.
+0 +1 +2 +3 ... +C +D +E +F Contents
00000000 23 69 6E 63 ... 64 69 6F 2E #include <stdio.
00000010 68 3E 0D 0A ... 20 3C 63 74 h> #include <ct
00000020 79 70 65 2E ... 69 7A 65 5F ype.h> size_
...
00000450 7D 20 0D 0A }
1108 bytes
Bi gii: xem trang 278

55
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

CC VN KHC
Bi 191: Dng cc hm chun ca time.h vit hm nhp vo thng v nm (sau
1900). In lch bng ting Vit (khng du) ca thng ch trong 5 dng.
Nhap thang, nam (sau 1900): 7 2006
Thang Bay 2006
CN Hai Ba Tu Nam Sau Bay
30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
Bi gii: xem trang 279

Bi 192: Dng cc hm chun ca time.h, vit chng trnh hin th th, ngy,
thng, nm, gi hin ti, mi gi GMT, bng ting Vit (khng du).
Hom nay Chu Nhat, ngay 09 thang Hai nam 2003
Bay gio la 05:24:18 AM +007 GMT

Bi gii: xem trang 281

Bi 193: To menu cho chng trnh trong bi 178 (trang 50) bng cch dng mng
cc con tr hm (functor).
MENU (File 'STUDENT.DAT')
----
[1]. Them
[2]. Doc
[3]. Sua
[4]. Thoat
Chon tac vu:
Bi gii: xem trang 283

Bi 194: Vit mt hm nhn danh sch tham s gm: tn mt hm lng gic (c


mt tham s double) ca math.h, cn di v cn trn ca min cn tnh tr, bc
tng khi tnh tr. In ra bng cc tr ca hm trong min v bc tng c chn.
Gi hm khi cn tnh sin(x) trong on [0, ], vi bc tng /8:
tab_func( sin, 0.0, M_PI, M_PI/8.0 );
Kt qu:
x f(x)
0.0000 0.0000
0.3927 0.3827
0.7854 0.7071
1.1781 0.9239
1.5708 1.0000
1.9635 0.9239
2.3562 0.7071
2.7489 0.3827
3.1416 0.0000
Bi gii: xem trang 285

56
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 195: Vit mt hm Average( n, ... ), nhn vo n tham s nguyn (sau tham


s th nht l n), tr v trung bnh cng ca n tham s nguyn .
x = 32.4 y = 24.7 z = 4.5 t = 11.8
average( 2, x, y ) : 28.550
average( 3, x, y, z ) : 20.533
average( 4, x, y, z, t ): 18.350
Bi gii: xem trang 285

Bi 196: Vit cc macro:


islower( c ) cho kt qu l 1 nu k t c l ch thng, hoc 0 nu k t c
l ch hoa.
toupper( c ) cho kt qu l k t hoa tng ng vi c nu c l ch thng,
hoc cho kt qu l chnh k t c nu c l ch hoa.
percent( a, b ) cho kt qu l phn trm ca a trn b.
'c' viet hoa la 'C'
123 la 0.996355% cua 12345

Bi gii: xem trang 286

Bi 197: Vit cc macro:


bitOff( d, n ) t bit th n ca d v 0.
bitOn( d, n ) bt bit th n ca d ln 1.
bitFlip( d, n ) o bit th n ca d.
isBit( d, n ) tr v 1 nu bit th n ca d ang l 1 hoc tr v 0 nu bit th
n ny ang l 0.
Vi d l s nguyn.
To ri dng macro isBit( d, n ) to hm to in cc bit ca mt s
nguyn.

So goc : 12345 = 00000000 00000000 00110000 00111001


Bat bit 8: 12601 = 00000000 00000000 00110001 00111001
Xoa bit 5: 12313 = 00000000 00000000 00110000 00011001
Dao bit 4: 12329 = 00000000 00000000 00110000 00101001
Bi gii: xem trang 286

Bi 198: Vit macro hibyte( n ) v lowbyte( n ) tr v byte cao v byte thp ca


s integer n.
Platform 32-bits
INT_MAX / 10:
214748364 = 00001100 11001100 11001100 11001100
High Byte: 3276 = 00000000 00000000 00001100 11001100
Low Byte : 52428 = 00000000 00000000 11001100 11001100
Bi gii: xem trang 288

Bi 199: Tp tin vn bn EMP.TXT lu thng tin nhn vin thnh cc dng vi nh


dng sau:
ID:firstname lastname:birthday:salary

57
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Cc trng cch nhau bi du : ; firstname v lastname cch nhau bi du space;


cui dng c k t newline.
Vit chng trnh c tp tin EMP.TXT, hin th thng tin cc nhn vin vi firstname
sp xp theo th t alphabet, nu firstname ging nhau, sp xp theo lastname. Thao
tc sp xp phi s dng hm chun qsort() ca stdlib.h.
Noi dung...
4424:Tom Jones:5/12/66:54335
2638:Jackie Lee:9/23/44:42500
1683:Billy Black:9/23/44:336500
1654:Jackie Chan:7/22/54:65000
5346:Mary Adams:11/4/63:28765
Sap xep...
1683:Billy Black:9/23/44:336500
1654:Jackie Chan:7/22/54:65000
2638:Jackie Lee:9/23/44:42500
5346:Mary Adams:11/4/63:28765
4424:Tom Jones:5/12/66:54335
Bi gii: xem trang 288

Bi 200: Tp tin vn bn PERSON.TXT lu thng tin c nhn thnh cc dng vi nh


dng sau:
ID:firstname lastname:(area_code) phone_number
Cc trng cch nhau bi du :, cc cp firstname v lastname, area_code (bao
quanh bi cp ngoc n) v phone_number, u cch nhau bi du space, cui dng
c k t newline.
Vit chng trnh c tp tin PERSON.TXT, nhp vo firstname ca mt ngi (gi s
cc firstname u khc nhau), tm v hin th m vng ca ngi . Thao tc tm
kim phi s dng hm chun bsearch() ca stdlib.h.
Noi dung...
4424:Mike Harrington:(510) 5481278
2638:Christian Dobbins:(408) 5382358
5346:Jody Savage:(311) 5481278

Nhap firstname: Christian


Ma vung cua Christian: 408
Bi gii: xem trang 291

CU TRC D LIU
Cc bi tp cu trc d liu (data structure) c a vo tp sch ny c xem
nh l cc bi tp dng rn luyn: thao tc trn con tr, truyn tham s bng con tr
(hiu qu tng ng vi truyn tham s bng tham chiu trong C++), gii thut
quy
V l do trn, phn ny ch gii hn trong phm vi cc bi tp vi danh sch lin kt
n v cy tm kim nh phn (BST).
Theo quan im ring ca chng ti, bi tp cu trc d liu c thc hin bng
C++ hoc Java vi s h tr ca OOP s d dng v thun li hn. Tuy nhin vic
vit li cc bi tp trong phn ny bng C++ hoc Java khng kh.
Phn ln cc bi tp trong phn danh sch lin kt n u dng thng tin lu ti
58
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

mi node (tr cc lin kt) l mt s nguyn.


struct NODE {
int data;
struct NODE* next;
};
typedef struct NODE* NODEPTR;
Thng tin lu tr phc tp hn ch nh hng n vic truy xut, khng nh hng
n gii thut. V d:
struct STUDENT {
char name[30];
int age;
};
typedef struct STUDENT* SLINK;

struct NODE {
SLINK data;
struct NODE* next;
};
typedef struct NODE* NODEPTR;
Nn t chc v qun l thng tin lu tr nh trn thun tin cho vic hon chuyn
d liu khi cn.
Phn ln cc bi tp trong phn BST u dng cu trc d liu chung nh sau:
struct NODE {
int data;
struct NODE *left, *right;
};
typedef struct NODE* NODEPTR;
Chng ti cng dng mt cy c cu trc tng i
tng qut d kim tra kt qu xut ca cc bi tp 9
trong phn ny, d liu nhp: 9 3 16 14 2 5 4 8 18
V cc bi gii di v c nhiu tc v lp i lp li nn 3 16
ch c mt s bi gii y , cc bi gii cn li ch
tp trung gii quyt yu cu. Bi gii y xin tham 2 5 14 18
kho trong source code ca sch.
Bi 201: Xt cc trng hp chn mt node mi vo 4 8
mt danh sch lin kt n cha cc tr nguyn.
Nhap 0 de dung: 3 2 1 0
List goc: [1][2][3]
Chen 5 cuoi: [1][2][3][5]
Chen 4 sau node [3]: [1][2][3][4][5]
Bi gii: xem trang 296

Bi 202: Cho mt danh sch lin kt n cha cc tr nguyn. Dng gii thut
quy, chn mt node cha tr 0 sau mi node cha tr chn trong danh sch lin kt.
Nhap 0 de dung: 1 2 4 3 5 6 0
List goc: [1][2][4][3][5][6]
Chen 0 sau tri chan: [1][2][0][4][0][3][5][6][0]
Bi gii: xem trang 300

59
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 203: Chn mt node mi vo mt danh sch lin kt n, sao cho tr lu trong


cc node ca danh sch lun theo th t tng. Khng dng quy.
Nhap 0 de dung: 3 2 5 1 0
List goc: [1][2][3][5]
Nhap tri moi: 4
List moi: [1][2][3][4][5]
Bi gii: xem trang 301

Bi 204: Xa mt node trong mt danh sch lin kt n cha cc tr nguyn. Xt


cc trng hp ph bin.
Nhap 0 de dung: 1 2 3 4 0
List goc: [1][2][3][4]
Nhap tri can xoa: 3
List moi: [1][2][4]
Bi gii: xem trang 302

Bi 205: Cho mt danh sch lin kt n cha cc tr nguyn. Vit hm thc hin
xa ln lt tt c cc node t cui danh sch ngc tr ln u.
Nhap 0 de dung: 1 2 3 0
List goc: [1][2][3]
Xoa node [3]
Xoa node [2]
Xoa node [1]
Bi gii: xem trang 304

Bi 206: Cho mt danh sch lin kt n cha cc tr nguyn. Vit hm thc hin
xa tt c cc node c tr ch nh nhp t bn phm.
Nhap 0 de dung: 1 2 1 1 3 1 4 1 1 0
List goc: [1][2][1][1][3][1][4][1][1]
Nhap tri can xoa: 1
List moi: [2][3][4]
Bi gii: xem trang 304

Bi 207: Cho mt danh sch lin kt n cha cc tr nguyn, sa cc lin kt ca


danh sch ny c c hai danh sch danh sch lin kt mi: mt danh sch cha
cc tr l ca danh sch cho, mt danh sch cha tr chn ca danh sch cho.
Nhap 0 de dung: 1 2 3 4 5 6 7 8 0
List goc : [1][2][3][4][5][6][7][8]
List chan: [8][6][4][2]
List le : [7][5][3][1]
Bi gii: xem trang 305

Bi 208: Cho mt danh sch lin kt n cha cc tr nguyn. i m phn t cui


ca danh sch lin kt ln u, m l s nguyn dng cho trc.
Nhap 0 de dung: 1 2 3 4 5 0
List goc: [1][2][3][4][5]
Nhap m: 2
List moi: [4][5][1][2][3]

60
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi gii: xem trang 306

Bi 209: Cho mt danh sch lin kt n cha cc tr nguyn (khng cha nhiu
phn t). In cc phn t ca danh sch theo th t ngc li vi th t lu tr k t
u danh sch. Tm phn t cha tr ln nht trong danh sch bng quy.
Nhap 0 de dung: 1 3 5 2 4 0
List dao: [4][2][5][3][1]
Tri max: 5
Bi gii: xem trang 307

Bi 210: o ngc cc lin kt ca mt danh sch lin kt n cha cc tr nguyn.


Nhap 0 de dung: 1 2 3 4 5 0
List goc: [1][2][3][4][5]
List dao: [5][4][3][2][1]
Bi gii: xem trang 308

Bi 211: Cho danh sch lin kt n cha cc tr nguyn. Tch danh sch ny thnh
cc danh sch lin kt n con, mi danh sch lin kt n con cha mt run tng.
Dng mt danh sch lin kt n ring qun l cc danh sch run ni trn.
Nhap 0 de dung: 1 2 3 2 3 4 5 4 6 0
List 'run':
r-+-[4][6][n]
|-[2][3][4][5]
`-[1][2][3][n]
Bi gii: xem trang 309

Bi 212: Cho danh sch lin kt n qun l cc run nh bi 211 (trang 61). Trn
cc run do danh sch ny qun l thnh mt run tng duy nht.
Nhap 0 de dung: 1 2 3 2 3 4 5 4 6 0
List 'run':
r-+-[4][6][n]
|-[2][3][4][5][n]
`-[1][2][3][n]
'run' tang duy nhat:
r-+-[n]
|-[n]
`-[1][2][2][3][3][4][4][5][6][n]
Bi gii: xem trang 311

Bi 213: Tm phn t cha tr xut hin nhiu ln nht (tn sut cao nht) trong mt
danh sch lin kt n khc rng cha cc tr nguyn, gi s tn sut ca cc tr trong
danh sch lin kt u khc nhau.
Nhap 0 de dung: 1 2 3 3 4 3 2 2 4 2 0
List goc: [1][2][3][3][4][3][2][2][4][1]
Phan tu xuat hien nhieu nhat: [2](4)
Bi gii: xem trang 312

Bi 214: Cho mt danh sch lin kt n cha cc tr nguyn. Thay i cc lin kt


ca danh sch sao cho: cc node cha tr chn nm u danh sch, cc node cha tr
61
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

l nm cui danh sch, th t xut hin cc node ging vi danh sch ban u.
Nhap 0 de dung: 3 8 4 1 5 7 6 2 0
List goc: [3][8][4][1][5][7][6][2]
List moi: [8][4][6][2][3][1][5][7]
Bi gii: xem trang 313

Bi 215: Cho mt danh sch lin kt n khng rng, vit chng trnh thay i cc
lin kt ca danh sch sao cho danh sch tr thnh:
node[1] node[3] ... node[2n+1]
node[2] node[4] ... node[2n] NULL
Nhap 0 de dung: 4 3 7 2 6 5 9 8 0
List goc: [4][3][7][2][6][5][9][8]
List moi: [4][7][6][9][3][2][5][8]
Bi gii: xem trang 314

Bi 216: Thc hin gii thut Selection Sort trn danh sch lin kt n cha cc tr
nguyn, sp xp tng cc phn t cha trong danh sch.
Nhap 0 de dung: 1 3 5 7 2 4 6 8 0
List goc : [1][3][5][7][2][4][6][8]
List tang: [1][2][3][4][5][6][7][8]
Bi gii: xem trang 315

Bi 217: Cho mt danh sch lin kt n cha cc tr nguyn. o cc node trong


danh sch lin kt cha tr k vi node ngay sau n. Trong , hon chuyn cc node
thay v hon chuyn d liu trong node.
Nhap 0 de dung: 1 2 3 1 2 3 1 0
List goc: [1][2][3][1][2][3][1]
Nhap k: 1
List moi: [2][1][3][2][1][3][1]
Bi gii: xem trang 315

Bi 218: Thc hin gii thut Selection Sort trn danh sch lin kt n cha cc tr
nguyn, sp xp tng cc phn t cha trong danh sch. Trong , hon chuyn cc
node thay v hon chuyn d liu trong node.
Nhap 0 de dung: 1 3 5 7 2 4 6 8 0
List goc : [1][3][5][7][2][4][6][8]
List tang: [1][2][3][4][5][6][7][8]
Bi gii: xem trang 317

Bi 219: Thc hin gii thut Bubble Sort trn danh sch lin kt n cha cc tr
nguyn, sp xp tng cc phn t cha trong danh sch.
Nhap 0 de dung: 1 3 5 7 2 4 6 8 0
List goc : [1][3][5][7][2][4][6][8]
List tang: [1][2][3][4][5][6][7][8]
Bi gii: xem trang 318

Bi 220: Thc hin gii thut Insertion Sort trn danh sch lin kt n cha cc tr
nguyn, sp xp tng cc phn t cha trong danh sch.
62
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Nhap 0 de dung: 1 3 5 7 2 4 6 8 0
List goc : [1][3][5][7][2][4][6][8]
List tang: [1][2][3][4][5][6][7][8]
Bi gii: xem trang 319

Bi 221: Xa mt node trong cy BST.


Nhap 0 de dung: 9 3 16 14 2 5 4 8 18 0
2 3 4 5 8 9 14 16 18
Nhap k: 5
2 3 4 8 9 14 16 18
Bi gii: xem trang 320

Bi 222: Thc hin duyt cy BST theo chiu su (deep-first traversal).


Nhap 0 de dung: 9 3 16 14 2 5 4 8 18 0
LNR: 2 3 4 5 8 9 14 16 18
NLR: 9 3 2 5 4 8 16 14 18
LRN: 2 4 8 5 3 14 18 16 9
Bi gii: xem trang 325

Bi 223: Thc hin thao tc duyt cy BST theo tng mc (breadth-first traversal).
Nhap 0 de dung: 9 3 16 14 2 5 4 8 18 0
BFS: 9 3 16 2 5 14 18 4 8

Bi gii: xem trang 327

Bi 224: ngha ca tng cch duyt cy BST, v d minh ha.


Nhap 0 de dung: 9 3 16 14 2 5 4 8 18 0
Cay goc : 9 3 2 5 4 8 16 14 18
Cay copy: 9 3 2 5 4 8 16 14 18
Xoa cay goc... 2 4 5 8 3 14 18 16 9
Cay goc rong
Bi gii: xem trang 329

Bi 225: Cho cy BST cha cc tr nguyn. Vit hm thc hin hai nhim v: xut
cc node thuc mc n v m cc node thuc mc n. Gc c mc 0.
Nhap 0 de dung: 9 3 16 14 2 5 4 8 18 0
Nhap n: 2
Muc 2: 2 5 14 18
Tong: 39
Bi gii: xem trang 332

Bi 226: Cho cy BST cha cc tr nguyn. Tm mc ca node cha tr x cho trc.


Nu cy khng cha tr x, thng bo khng tm thy. Gc c mc 0.
Nhap 0 de dung: 9 3 16 14 2 5 4 8 18 0
Nhap x: 5
Muc 2
Bi gii: xem trang 333

63
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 227: Cho cy BST cha cc tr nguyn. Nhp cc s x, y (x < y, c trong cy


BST). Nu mt trong hai node cha tr x hoc y l node cha ca node kia, tr v node
cha. Nu khng, xc nh cha chung gn nht ca hai node cha x v y.
Nhap 0 de dung: 9 3 16 14 2 5 4 8 18 0
Nhap a, b: 4 14 9
Node cha: 9
... 3 16
Nhap a, b: 16 14
Node cha: 16
2 5 14 18
...
Nhap a, b: 4 2
Node cha: 3 4 8

Bi gii: xem trang 333

Bi 228: Cho cy BST cha cc tr nguyn. Nhp cc s x, y (x < y, c trong cy


BST). Xc nh ng i t node cha x n node cha y.
Nhap 0 de dung: 9 3 16 14 2 5 4 8 18 0
Nhap a, b: 18 5
5 3 9 16 18
...
Nhap a, b: 2 4
2 3 5 4
...
Nhap a, b: 9 14
9 16 14
Bi gii: xem trang 334

Bi 229: Thc hin thao tc chn mt node mi vo cy nh phn tm kim cn bng


AVL. Tm kim mt node trong cy AVL trn.
(11,|) 11 11 11
11
----------
(11,\) 4 12 4 12 4
(4,|)
----------
(12,|) 3
3 11 11 11
(11,|)
(4,|)
4 12 4 12 9 12
----------
(12,|)
(11,\) 3 9 3 9 4
(4,\) 3 3 3
(3,|) 6 3 6
---------- trinode
3 restructuring
(12,|)
(11,\)
(9,|)
9
(4,|)
(3,|) 4 11
----------
(12,|)
(11,/) 3 6 12
3
64
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


(9,|)
(6,|)
(4,|)
(3,|)
----------
Nhap khoa can tim: 12
[12,Heo]
Bi gii: xem trang 335

Bi 230: Thc hin thao tc xa mt node c trong cy AVL.


Cay goc:
(12,|)
(11,\)
(8,|)
(6,/)
(5,/) 5 4 6
(4,|)
(3,/) 3 11 3 6 4 11
Khoa can xoa: 5
(12,|) 4 6 12 11 3 8 12
(11,|) 3 3 3
(8,|) node thay th, 8 8 12
(6,|) s b xa thc trinode restructuring
3
(4,\)
(3,|)
Bi gii: xem trang 340

65
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 1: (trang 3)
#include <stdio.h>
#include <math.h>

int main() {
double S;

printf( "Nhap dien tich S: " );


scanf( "%lf", &S );
printf( "The tich V = %g\n",
( 4 * M_PI * pow( sqrt( S / ( 4 * M_PI ) ), 3 ) ) / 3 );
return 0;
}
Cch gii thng gp l tnh R t S, sau dng R tnh V. Cch ny di dng v ta c
th tnh V trc tip theo S:
S 4 R 2 3
4 S
V ( 3.141593 )
V
4
R 3 3 4
3
Bn phi thc hin nhng tnh ton s b nh trn trong khi thit k chng trnh,
trc khi ci t chng trnh bng mt ngn ng lp trnh c th.
nh dng chui %g trong printf() c dng khi mun ti u kt qu in mt s
thc, nh dng ny t c ch n nhng li dng thun tin hn %f hoc %e.

Bi 2: (trang 3)
#include <stdio.h>
#include <math.h>

int main() {
float xA, yA, xB, yB;

printf( "A(xA, yA)? " );


scanf( "%f%f", &xA, &yA );
printf( "B(xB, yB)? " );
scanf( "%f%f", &xB, &yB );
printf( "|AB| = %g\n",
sqrt( ( xB - xA ) * ( xB - xA ) + ( yB - yA ) * ( yB - yA ) ) );
return 0;
}
Khi bin dch dng lnh bng gcc, thng gp li:
In function `main': undefined reference to `sqrt'
kt ni n hm sqrt() trong th vin math.h, cn ch nh bin dch nh sau:
$ gcc c002.c /usr/lib/libm.a -o c002
hoc ngn gn hn:
$ gcc c002.c -lm -o c002

Bi 3: (trang 3)
#include <stdio.h>
#include <math.h>

int main() {
double xC, yC, R, xM, yM, d;
66
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

printf( "Nhap toa do tam C(xC, yC)? " );


scanf( "%lf%lf", &xC, &yC );
printf( "Nhap ban kinh R? " );
scanf( "%lf", &R );
printf( "Nhap toa do M(xM, yM)? " );
scanf( "%lf%lf", &xM, &yM );

d = R - sqrt( ( xM - xC ) * ( xM - xC ) + ( yM - yC ) * ( yM - yC ) );
if ( d > 0 ) printf( "M nam trong C()\n" );
else if ( d < 0 ) printf( "M nam ngoai C()\n" );
else printf( "M nam tren C()\n" );
return 0;
}
Ta bin lun bng cch so snh khong cch gia im M n tm O vi bn knh R
ca ng trn. Khong cch ny c tnh t cng thc trong bi 2 (trang 66).
Ch , nu bn nhp cc s thc c s k s phn thp phn ln hn chnh xc
ca double, kt qu s khng nh mong mun.

Bi 4: (trang 3)
#include <stdio.h>
#include <math.h>

int main() {
float a, b, c;

printf( "Nhap 3 canh tam giac: " );


scanf( "%f%f%f", &a, &b, &c );

if ( a > 0 && b > 0 && c > 0 && a + b > c && a + c > b && b + c > a ) {
unsigned f = 0;
if ( a == b || b == c || c == a ) f += 1;
if ( a == b && b == c ) f += 1;
if ( a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a )
f += 3;
switch ( f ) {
case 0: printf( "Tam giac thuong\n" ); break;
case 1: printf( "Tam giac can\n" ); break;
case 2: printf( "Tam giac deu\n" ); break;
case 3: printf( "Tam giac vuong\n" ); break;
case 4: printf( "Tam giac vuong can\n" );
}
float p = ( a + b + c ) / 2;
printf( "Dien tich S = %g\n", sqrt( p * ( p - a ) * ( p - b ) * ( p - c ) ) );
}
else printf( "Khong hop le\n" );
return 0;
}
Thng thng bn phi dng rt nhiu cu lnh r nhnh v gp kh khn khi x l
trng hp tam gic vung cn. Cch trn to c hiu f theo cch cc lp trnh vin
C thng dng, ngha l cc tr c khc nhau s c cng thm (hoc OR) vo tr c
rng ban u. V d, trong trng hp tam gic vung cn: c hiu f c cng thm
1 khi xt tam gic cn v c cng thm 3 khi xt tam gic vung. Kt qu tam gic

67
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

vung cn c f = 1 + 3 = 4 v tam gic vung c f = 0 + 3 = 3 (0 c gn cho


c hiu mc nh, ng vi tam gic thng).
Mt cch gii khc: vic sp xp li cc cnh tam gic theo kch thc gip gim
kh nhiu cc trng hp phi xt, nhng tn thm chi ph cho vic sp xp. Cch
ny thng dng trong ha my tnh, v vic sp xp cc cnh theo kch thc
cn tin dng cho cc gii thut khc tip theo sau.
#include <stdio.h>
#include <math.h>
#define swap( a, b ) { float t = a; a = b; b = t; }

int main() {
float a, b, c;

printf( "Nhap 3 canh tam gic: " );


scanf( "%f%f%f", &a, &b, &c );
/* sp xp sao cho: a b c */
if ( a > b ) swap( a, b );
if ( a > c ) swap( a, c );
if ( b > c ) swap( b, c );
if ( a * b * c > 0 && a + b > c ) {
/* nu a = c th a = b */
if ( a == c ) printf( "Tam giac deu\n" );
else if ( a == b || b == c )
/* nu tam gic vung, cnh ln nht c l cnh huyn */
if ( ( a * a + b * b ) == c * c ) printf( "Tam giac vuong can\n" );
else printf( "Tam giac can\n" );
else
if ( ( a * a + b * b ) == c * c ) printf( "Tam gic vuong" );
else printf( "Tam giac thuong\n" );
float p = ( a + b + c ) / 2;
printf( "Dien tich S = %g\n", sqrt( p * ( p - a ) * ( p - b ) * ( p - c ) ) );
}
else printf( "Khong hop le\n" );
return 0;
}

Bi 5: (trang 3)
#include <stdio.h>
#include <math.h>

double area( double xA, double yA, double xB, double yB, double xC, double yC ) {
return 0.5 * fabs( xA * yB - xB * yA + xB * yC - xC * yB + xC * yA - xA * yC );
}

int main() {
double xA, yA, xB, yB, xC, yC, xM, yM;
double d;

printf( "A(xA, yA)? " );


scanf( "%lf%lf", &xA, &yA );
printf( "B(xB, yB)? " );
scanf( "%lf%lf", &xB, &yB );
printf( "C(xC, yC)? " );
scanf( "%lf%lf", &xC, &yC );
68
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


printf( "M(xM, yM)? " );
scanf( "%lf%lf", &xM, &yM );

d = area( xM, yM, xA, yA, xB, yB ) + area( xM, yM, xA, yA, xC, yC )
+ area( xM, yM, xB, yB, xC, yC ) - area( xA, yA, xB, yB, xC, yC );
if ( d > 0 ) printf( "M nam ngoai tam giac ABC\n" );
else
if ( area( xM, yM, xA, yA, xB, yB ) == 0 ||
area( xM, yM, xA, yA, xC, yC ) == 0 ||
area( xM, yM, xB, yB, xC, yC ) == 0 )
printf( "M nam tren canh tam giac ABC\n" );
else printf( "M nam trong tam giac ABC\n" );
return 0;
}
Khi xc nh tam gic bng ta cc nh, khng cn phi kim tra tam gic c
hp l hay khng. Tam gic c din tch bng 0 cng hp l, khi ba nh ca tam
gic s thng hng. Cng thc tnh din tch tam gic t ta cc nh ca n bng
nh thc cp 3 gip bi gii ngn gn hn rt nhiu.

Bi 6: (trang 4)
#include <stdio.h>

int main() {
int a, b, c, t;

printf( "Nhap a, b, c: " );


scanf( "%d%d%d", &a, &b, &c );
/* a < b th hon chuyn, vy a b */
if ( a < b ) { t = a; a = b; b = t; }
/* a < c th hon chuyn, vy a c, kt qu a ln nht */
if ( a < c ) { t = a; a = c; c = t; }
/* b < c th hon chuyn, vy b c, kt qu c nh nht */
if ( b < c ) { t = b; b = c; c = t; }

printf( "Tang dan: %d %d %d\n", c, b, a );


return 0;
}
Bn cng c th thit k on code hon chuyn hai tr nguyn di dng macro
hoc hm:
- Macro swap() c tham s: Khi dng macro, on chng trnh c nh ngha s
chn vo ng on lnh gi macro trong giai on tin x l trc lc bin dch.
nh ngha macro:
#define swap( a, b ) { int t = a; a = b; b = t; }
dng macro:
int a = 5;
int b = 7;
swap( a, b );
- Hm swap() dng con tr: Khi dng hm, hm s c gi ti on lnh gi hm,
cc tham s s c truyn cho hm c gi. Cc tham s c truyn cho hm
cn c thay i sau khi gi hm, ni cch khc hm s thao tc trn cc tham s

69
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

ny v tr li cho ni gi hm. V vy cn truyn cc tham s bng cch dng con


tr. nh ngha hm:
void swap( int *a, int *b ) {
int t = *a;
*a = *b;
*b = *t;
}
truyn tham s cho hm:
int a = 5;
int b = 7;
swap( &a, &b );
Hm swap() dng tham chiu ch c trong ngn ng C++.
Hon chuyn a v b cng c th thc hin m khng dng bin ph:
a = a + b; b = a - b; a = a - b;
hoc:
a ^= b ^= a ^= b;
Tuy nhin cc cch hon chuyn ny ch ng vi cc tr nguyn v khng p dng
khi hon chuyn mt s vi chnh n.

Bi 7: (trang 4)
#include <stdio.h>

int main() {
float a, b;

printf( "Nhap a, b: " );


scanf( "%f%f", &a, &b );
if ( !a ) printf( b ? "Vo nghiem\n" : "Vo dinh\n" );
else printf( "x = %g\n", -b / a );
return 0;
}
Khng c gii thut phc tp khi gii quyt bi ton trn. Bn ch cn bo m duyt
ht mi trng hp trong lu sau (lu ny c c bng cch bin lun phng
trnh bc nht):
Yes Yes V s
a=0 b=0
nghim

No No

x = -b/a V
nghim
Ch cch dng biu thc iu kin rt gn, thng dng trong C:
- Biu thc iu kin ( a == 0 ) rt gn thnh biu thc iu kin ( !a ).
- Biu thc iu kin ( a != 0 ) rt gn thnh biu thc iu kin ( a ).
C hai biu thc tng ng ny u c bn chn tr (truth table) ging nhau.
n li cch dng ton t 3 ngi:
printf( b ? "Vo nghiem\n" : "Vo dinh\n" );
hoc:
b ? printf( "Vo nghiem\n" ) : printf( "Vo dinh\n" );

70
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

ngha l:
if ( b != 0 ) printf( "Vo nghiem\n" );
else printf( "Vo dinh\n" );
Nn trnh cch dng ton t 3 ngi lng nhiu ln v s lm chng trnh tr nn
kh c:
!a ? ( !b ? printf( "Vo dinh\n" )
: printf( "Vo nghiem\n" ) )
: printf( "x = %g\n", -b/a );
Tuy nhin cch vit ny lm ny sinh mt phng php gii bi trn rt c o:
khng dng if ... else, khng dng ton t 3 ngi.
Thay ? bng &&, v thay du : bng ||, ta nhn c biu thc iu kin:
#include <stdio.h>
int main() {
float a, b;

printf( "Nhap a, b: " );


scanf( "%f%f", &a, &b );
!a && ( !b && printf( "Vo dinh\n" ) || printf( "Vo nghiem\n" ) )
|| printf( "x = %g\n", -b/a );
return 0;
}
Do c im ngn mch khi nh tr biu thc iu kin ca C, vic nh tr biu
thc iu kin trn cng r nhnh ging nh khi vit chng trnh vi if ... else
v bi ton c gii quyt tng t. Cch gii ny ch dng rn luyn t duy, t
ngha thc t.

Bi 8: (trang 4)
#include <stdio.h>
#include <math.h>

int main() {
float a, b, c;

printf( "Nhap a, b, c: " );


scanf( "%f%f%f", &a, &b, &c );

if ( !a )
if ( !b ) printf( c ? "Vo nghiem\n" : "Vo dinh\n" );
else printf( "x = %g\n", -c / b );
else {
float d = b * b - 4 * a * c;
if ( d > 0 )
printf( "x1 = %g\nx2 = %g\n", ( -b + sqrt( d ) ) / ( 2 * a ),
( -b - sqrt( d ) ) / ( 2 * a ) );
else ( !d ) ? printf( "x1 = x2 = %g\n", -b / ( 2 * a ) )
: printf( "Vo nghiem\n" );
}
return 0;
}

Gii theo lu bin lun phng trnh bc hai (xem hnh di)

71
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Yes Yes Yes V s


a=0 b=0 c=0
nghim

No No No
suy bin thnh
x = -c/b
V phng trnh
nghim bc nht

No Yes
V
> 0 < 0
nghim

Yes No

x1,2 = x1 = x2 =
(-b )/2a -b/2a

Bi 9: (trang 4)
#include <stdio.h>
#include <math.h>

int main() {
double angle;

printf( "Nhap so do x cua goc (phut): " );


scanf( "%lf", &angle );

angle /= 60; /* i pht thnh */


printf( "x thuoc goc vuong thu %d\n", ( int )ceil( angle / 90 ) % 4 );
printf( "cos(x) = %g\n", cos( angle * M_PI / 180 ) );
return 0;
}
Thay v phi bin lun kt qu (bng if ... else) tnh s th t gc vung cha
gc, chng trnh trn tnh ton t d liu nhp ra trc tip kt qu.
Cc hm lng gic trong th vin <math.h> ca C u nhn tham s vi n v
radian, 1 radian = degree * /180. Trong bi trn, cn i pht radian.
Bi tp: Xc nh thng m thuc qu no trong nm (3 qu/nm, 4 thng/qu).
#include <stdio.h>

int main() {
int m;

printf( "Nhap thang: " );


scanf( "%d", &m );
printf( "Thang %d thuoc quy %d\n", m, ( m - 1 ) / 4 + 1 );
return 0;
}

Bi 10: (trang 5)
#include <stdio.h>

int main() {

72
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


unsigned pos, t;
unsigned long sin;

while ( 1 ) {
printf( "SIN (0 de thoat): " );
scanf( "%lu", &sin );
if ( !sin ) break;
unsigned sum = sin % 10;
sin /= 10;
for ( pos = 0; pos < 8 && sin > 0; sin /= 10, ++pos ) {
t = sin % 10;
if ( pos % 2 ) sum += t;
else sum += ( 2 * t ) / 10 + ( 2 * t ) % 10;
}
printf( "SIN %shop le!\n",
( pos < 8 || sin > 0 || sum % 10 ) ? "khong " : "" );
}
return 0;
}
thc hin bi tp c v phc tp ny, bn ch cn gii quyt c cc vn n
gin sau:
- Ly ch s cui cng (ch s phi nht) ca mt s n: n % 10.
- Loi b ch s cui cng ca mt s n: n /= 10.
- Cho d c nhiu nht hai ch s, ly ch s hng chc: d / 10 v ly ch s hng
n v: d % 10.
Sau khi tnh tng sum (check digit + trng s), cc trng hp sau l khng hp l:
- pos < 8: s k t ca SIN nh hn 9, iu kin sin > 0 ngt vng lp.
- sin > 0: s k t ca SIN ln hn 9, iu kin pos < 8 ngt vng lp.
- sum khng chia ht cho 10.

Bi 11: (trang 5)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
char human, computer;
unsigned h, c; /* h: im ca ngi; c: im ca my */

srand( time( NULL ) );


h = c = 0;

while ( 1 ) {
printf( "Nhap ky tu (b-d-k), ky tu khac de thoat: " );
scanf( "%c", &human );
while ( getchar() != '\n' ) { }
switch ( human ) {
case 'b':
switch ( rand() % 3 ) {
case 0: computer= 'b'; break;
case 1: computer= 'd'; h++; break;
case 2: computer= 'k'; c++;
}

73
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


break;
case 'd':
switch ( rand() % 3 ) {
case 0: computer= 'b'; c++; break;
case 1: computer= 'd'; break;
case 2: computer= 'k'; h++;
}
break;
case 'k':
switch ( rand() % 3 ) {
case 0: computer= 'b'; h++; break;
case 1: computer= 'd'; c++; break;
case 2: computer= 'k';
}
break;
default: return 0;
}
printf( "Computer: %c\n", computer );
printf( "Ty so: %u - %u\n", h, c );
}
}
Trong C, khi sinh s ngu nhin, chng ta dng cc hm sau:
- Hm srand() thit lp mm ngu nhin (seed) cho lot s ngu nhin sinh bi
rand(). Hm srand() cho php chng trnh dng rand() sinh chui s ngu nhin
khc nhau cho mi ln chy do ch nh im khi u khc nhau. Thng thng,
c mm ngu nhin ta chn tham s cho srand() l hm time(NULL), thuc th
vin time.h. Hm ny tr v ngy v gi hin ti (gi l calendar time) di dng
mt s nguyn, chnh l s giy tri qua t giy u tin ca nm 1900 n nay.
- Hm rand() dng sinh mt s nguyn ngu nhin gia 0 v RAND_MAX (32767).
sinh s ngu nhin trong na on [0, n), dng rand() % n.
Hm srand() v rand() hin c khuyn co thay th do khng ngu nhin, p
ng bo mt km. Tuy nhin, chng vn dng tt vi cc bi tp trong ti liu ny.
Cu lnh fflush( stdin ), dng sc vng m nhp chun (stdin) loi k t
'\n' cn st trong ln nhp trc. Nu khng, k t ny s c nhn trong ln
nhp k tip lm sai lc kt qu nhp. Do fflush() gi trn stdin c th c hnh vi
khng xc nh trn h iu hnh Linux nn ta thay dng lnh ny vi:
while ( getchar() != '\n' ) { }
i lc cng dng scanf( "%c%*c", &human ); b qua k t '\n'.

Bi 12: (trang 5)
#include <stdio.h>

int main() {
float a1, b1, c1, a2, b2, c2, dx, dy, d;

printf( "Nhap a1, b1, c1: " );


scanf( "%f%f%f", &a1, &b1, &c1 );
printf( "Nhap a2, b2, c2: " );
scanf( "%f%f%f", &a2, &b2, &c2 );

d = ( a1 * b2 - a2 * b1 );
dx = ( c1 * b2 - c2 * b1 );
74
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


dy = ( a1 * c2 - a2 * c1 );

if ( !d ) printf( ( !dx && !dy ) ? "Vo dinh\n" : "Vo nghiem\n" );


else printf( "x = %g\ny = %g\n", dx / d, dy / d );
return 0;
}
Ngi gii thng qun bin lun vi cc trng hp h phng trnh v nghim
hoc v s nghim.

Bi 13: (trang 6)
#include <stdio.h>

int main() {
unsigned d, m, y, top, dayofweek; /* top l s ngy ti a ca thng */

printf( "Nhap ngay, thang va nam: " );


scanf( "%u%u%u", &d, &m, &y );

if ( y < 1582 ) {
printf( "Lich Gregorian bat dau tu nam 1582\n" );
return 1;
}
if ( m < 1 || m > 12 ) {
printf( "Thang khong hop le\n" );
return 2;
}
switch ( m ) {
case 4: case 6: case 9: case 11: top = 30; break;
case 2: top = 28 + ( ( y % 4 == 0 && y % 100 ) || y % 400 == 0 ); break;
default: top = 31;
}
if ( d < 1 || d > top ) {
printf( "Ngay khong hop le\n" );
return 3;
}
printf( "Hop le\n" );
/* Cng thc Zeller */
y -= ( 14 - m ) / 12;
m += 12 * ( ( 14 - m ) / 12 ) - 2;
dayofweek = ( d + y + y / 4 - y / 100 + y / 400 + ( 31 * m ) / 12 ) % 7;
if ( !dayofweek ) printf( "Chu Nhat\n" );
else printf( "Thu %u\n", dayofweek + 1 );
return 0;
}
Bi ny rn luyn cch s dng cu trc switch ca C, c bit khi xt cc trng
hp (case) cho kt qu nh nhau.
Cn ghi nh rng trong mi pht biu case, phi chm dt bng lnh break thot
khi cu trc switch, trnh xy ra vic xung (cascade) pht biu case tip. Tuy
nhin, vi cc trng hp cho kt qu nh nhau, vic xt n pht biu case tip li
cn thit, v khi bn phi xem xt vic c dng hay khng lnh break.
Chng ta c 3 trng hp cn xt trong switch: 4 thng c 30 ngy, 7 thng c 31
ngy v thng 2 c ngy c bit ph thuc nm nhp vo l nm nhun hay khng.

75
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

D thy l nn t trng hp 7 thng c 31 ngy l trng hp default chng


trnh ngn gn hn.

[true]
case a: lnh cho case a break
[false]

[true]
case b: lnh cho case b
[false]

[true]
case c: lnh cho case c break
[false]
...

[true]
case z: lnh cho case z break
[false]

lnh cho default

Cu trc r nhnh switch vi mt s case khng c break


Thut ton xt nm nhun (leap year) c pht biu nh sau: mt nm l nm nhun
nu n chia ht cho 4 nhng khng chia ht cho 100, tr phi n cng chia ht cho
400:
( y % 4 == 0 && y % 100 ) || y % 400 == 0
Mt cch dng switch khc gii bi tp ny, li dng kho lo tnh cht
xung khi khng c lnh break:
top = 29;
switch ( m ) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
top++;
/* nu " xung" t u dng trn, n break, top s l 31
nu " xung" t u dng di, n break, top s l 30 */
case 4: case 6: case 9: case 11: top++; break;
case 2: if ( !( ( y % 4 == 0 && y % 100 ) || y % 400 == 0 ) ) top--;
}
Tuy nhin, khng c lm dng kh nng xung, v d lm chng trnh kh
hiu v nhm ln. Ngn ng tha k C l C# sau ny b kh nng xung d
nhm ln ny.

Bi 14: (trang 6)
#include <stdio.h>

76
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

int main() {
unsigned d, m, y, top;

printf( "Nhap ngay, thang, nam: " );


scanf( "%u%u%u", &d, &m, &y );
switch ( m ) {
case 4: case 6: case 9: case 11: top = 30; break;
case 2: top = 28 + ( ( y % 4 == 0 && y % 100 ) || y % 400 == 0 ); break;
default: top = 31;
}

d = ( d % top ) + 1;
if ( d == 1 ) m = ( m % 12 ) + 1;
printf( "Ngay mai: %02u/%02u/%u\n", d, m, y + ( m == 1 && d == 1 ) );

printf( "Nhap ngay, thang, nam: " );


scanf( "%u%u%u", &d, &m, &y );
if ( d == 1 ) {
switch ( m - 1 ) {
case 4: case 6: case 9: case 11: d = 30; break;
case 2: d = 28 + ( ( y % 4 == 0 && y % 100 ) || y % 400 == 0 ); break;
default: d = 31;
}
if ( m == 1 ) { m = 12; y--; }
else m--;
} else d--;
printf( "Hom qua: %02u/%02u/%u\n", d, m, y );
return 0;
}
Pht biu n % d nh x tr n vo na on [0, d). iu ny gip gim cc pht biu
iu kin. V d, thay v phi vit:
if ( d == top ) d = 1;
else d++;
nn thay bng:
d = ( d % top ) + 1;
Bn cng nn ch n chui nh dng %02u: in s nguyn khng du chim 2 v
tr, nu ch c mt ch s th thm s 0 trc ch s .

Bi 15: (trang 6)
#include <stdio.h>

int main() {
unsigned d, m, y, s, i;

printf( "Nhap ngay, thang, nam: " );


scanf( "%u%u%u", &d, &m, &y );

s = d;
for ( i = 1; i < m; ++i )
switch ( i ) {
case 4: case 6: case 9: case 11: s += 30; break;
case 2: s += 28 + ( ( y % 4 == 0 && y % 100 ) || y % 400 == 0 ); break;
default: s += 31;

77
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}
printf( "Ngay thu: %u\n", s );
return 0;
}
Bi ny l mt bin th ca bi 13 (trang 75). Tng s c khi to bng ngy nhp
d (cng l ngy th d trong thng nhp). Vng lp chy t thng 1 n thng trc
thng nhp. Trong thn vng lp, tng s c cng dn vi s ngy ti a ca cc
thng phi tri qua trc thng nhp.
Bn c th dng hm difftime() ca time.h, nu hiu r cch thao tc vi thng tin
thi gian trong C, xem bi 191 (trang 279):
int days_diff( unsigned d, unsigned m, unsigned y ) {
time_t first, now;
struct tm date = { 0 };
date.tm_year = y - 1900; /* ngy ang xt */
date.tm_mon = m - 1;
date.tm_mday = d;
now = mktime ( &date );
date.tm_mon = 0; /* ngy u nm */
date.tm_mday = 1;
first = mktime ( &date );
return ( int ) difftime( now, first ) / (24 * 60 * 60);
}

/* dng hm trn trong hm main() */


printf( "Ngay thu: %d\n", days_diff( d, m, y ) + 1 );

Bi 16: (trang 7)
#include <stdio.h>

int main() {
unsigned y, m, dow, d, top, y1, m1;

printf( "Nhap nam: " );


scanf( "%u", &y );
/* Cng thc Zeller, tnh th cho ngy u nm (ngy 1/1) */
m = 1;
y1 = y - ( 14 - m ) / 12;
m1 = m + 12 * ( ( 14 - m ) / 12 ) - 2;
dow = ( 1 + y1 + y1 / 4 - y1 / 100 + y1 / 400 + ( 31 * m1 ) / 12 ) % 7;
/* lp cho 12 thng */
for ( m = 1; m <= 12; ++m ) {
printf( "Thang %u\n", m );
switch ( m ) {
case 4: case 6: case 9: case 11: top = 30; break;
case 2: top = 28 + ( ( y % 4 == 0 && y % 100 ) || y % 400 == 0 ); break;
default: top = 31;
}
printf( " S M T W T F S\n" );
for ( d = 0; d < dow; ++d )
printf( " " );
for ( d = 1; d <= top; ++d ) {
printf( "%3u", d );
if ( ( dow + d ) % 7 == 0 ) putchar( '\n' );
}
78
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


dow = ( dow + top ) % 7; /* tnh li th cho ngy u mi thng */
if ( dow ) putchar( '\n' );
}
return 0;
}
C hai vn cn gii quyt trong bi ny:
- Th ca ngy u tin mi thng:
Trc ht, tnh th ca ngy u tin ca nm dow bng cng thc Zeller. Th ca
ngy u tin thng sau: (dow + top) % 7 (ch dow [0, 7)) vi top l s ngy
ti a ca thng trc.
- Xung hng sau khi in mt hng lch: nu ngy u thng u l Cha nht th n
gin.
for ( d = 1; d <= top; ++d ) {
printf( "%3u", d );
if ( d % 7 == 0 ) putchar( '\n' );
}
Tuy nhin, ta phi in k t space nu cha n th ca ngy u tin trong thng
(dow). Ngha l iu kin xung dng by gi l (dow + d) % 7 == 0.
Sau khi in lch mt thng, ta cn xung dng in lch thng k tip. Nhng nu
(dow + d) % 7 == 0 ta khng xung dng trnh xung dng hai ln, do kt thc
mt dng lch trng vi kt thc in lch mt thng.
Do dow mi cng bng (dow + top) % 7, ta tnh dow mi trc ri mi kim tra
chn k t xung dng.
dow = (dow + top) % 7;
if ( dow ) putchar('\n');
Bi ny cng rn luyn cch dng phi hp nhiu vng lp.
Bi tp: Linux cung cp hai lnh dng in lch, lnh cal in lch theo chiu ngang v
lnh ncal in lch theo chiu dc (xem hnh di). Vit chng trnh thc hin hai
lnh ny. Chng trnh nhn d liu vo l thng v nm, dng cng thc Zeller
tnh th ca ngy u tin trong thng.
Thang va nam: 2 2016
2/2016
'cal' command:
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29

'ncal' command:
Thang 12
S 7 14 21 28
M 1 8 15 22 29
T 2 9 16 23
W 3 10 17 24
T 4 11 18 25
F 5 12 19 26
S 6 13 20 27

#include <stdio.h>
79
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


#include <math.h>

int main() {
unsigned y, m, d, dow, top, y1, m1, col, i, j;
char s[] = { 'S', 'M', 'T', 'W', 'T', 'F', 'S' };
printf( "Thang va nam? " );
scanf( "%u %u", &m, &y );
y1 = y - ( 14 - m ) / 12;
m1 = m + 12 * ( ( 14 - m ) / 12 ) - 2;
dow = ( 1 + y1 + y1 / 4 - y1 / 100 + y1 / 400 + ( 31 * m1 ) / 12 ) % 7;
switch (m) {
case 4: case 6: case 9: case 11: top = 30; break;
case 2: top = 28 + ( ( y % 4 == 0 && y % 100 ) || y % 400 == 0 ); break;
default: top = 31;
}
printf( "%u/%u\n", m, y );
printf( "'cal' command:\n" );
for ( i = 0; i < 7; ++i ) printf( "%3c", s[i] );
putchar( '\n' );
for ( d = 0; d < dow; ++d ) printf( " " );
for ( d = 1; d <= top; ++d ) {
printf( "%3u", d );
if ( ( dow + d ) % 7 == 0 ) putchar( '\n' );
}
if ( ( dow + top ) % 7 ) putchar('\n');
printf("\n'ncal' command:\n" );
col = ( unsigned ) ceil( ( dow + top ) / 7.0 );
for ( i = 0; i < 7; ++i, putchar( '\n' ) )
for ( d = i + 1 - dow, j = 0; j <= col; ++j )
if ( j == 0 ) printf( "%3c", s[i] );
else if ( j == 1 && i < dow ) printf( " " );
else if ( ( d += j > 1 ? 7 : 0 ) <= top ) printf( "%3u", d );
else break;
return 0;
}

Bi 17: (trang 7)
#include <stdio.h>

int main() {
unsigned y, m, dow, s, i, p, top, d;

printf( "Nhap nam: " );


scanf( "%u", &y );
printf( "Nhap thu cho ngay dau tien cua nam: " );
scanf( "%u", &dow );
printf( "Nhap thang: " );
scanf( "%u", &m );
/* ngy u thng m l ngy th s trong nm */
s = 0;
for ( i = 1; i <= m; ++i, s += top )
switch ( i ) {
case 4: case 6: case 9: case 11: top = 30; break;
case 2: top = 28 + ( ( y % 4 == 0 && y % 100 ) || y % 400 == 0 ); break;
default: top = 31;

80
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}
/* top hin l s ngy ca thng m, v vy s phi tr bt top */
s -= top;
/* th t ngi trc p vo ngy u thng m */
for ( p = 0, i = dow; i < s + dow; ++i )
/* c 5 ngi trc v Cha nht khng trc */
if ( i % 7 ) p = ( p + 1 ) % 5;
/* th dow ca ngy u thng m */
dow = i % 7; /* tng ng dow = ( s + dow ) % 7 */
printf( " Sun Mon Tue Wen Thu Fri Sat\n" );
for ( d = 0; d < dow; ++d )
printf( "%7c", ' ' );
for ( d = 1; d <= top; ++d ) {
printf( "%3u", d );
if ( ( dow + d - 1 ) % 7 ) {
printf( " [%c]", p["ABCDE"] );
p = ( p + 1 ) % 5;
} else printf( " [ ]" );
if ( ( dow + d ) % 7 == 0 ) putchar( '\n' );
}
if ( ( dow + top ) % 7 ) putchar( '\n' );
return 0;
}
y l bi tp tng hp kin thc c c khi gii cc bi tp t 13 - 16.
- Ngy u tin ca thng quan tm (m) l ngy th s trong nm. Ta cng cn s ngy
(top) ca thng m, nn vng lp tnh c thng m. V vy kt qu s phi bt i top.
- T th u tin dow cho n s + dow, nu khng phi Cha nht (i % 7 == 0),
ngi trc th p tng nhng vn trong on [0, 5). Xc nh c ngi trc ngy
u thng m.
- D dng xc nh th ca ngy u thng m: dow = (s + dow) % 7.
Sau ta c th in lch thng km theo ngi trc.

Bi 18: (trang 7)
#include <stdio.h>

int main() {
long h;

printf( "Nhap so gio: " );


scanf( "%ld", &h );
printf( "%ld tuan, %ld ngay, %ld gio\n",
h / ( 24 * 7 ), ( h % ( 24 * 7 ) ) / 24, ( h % ( 24 * 7 ) ) % 24 );
return 0;
}
Bi tp rn luyn cch dng cc ton t / v %.

Bi 19: (trang 8)
#include <stdio.h>

int main() {
int h, m, s;
long time;

81
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


printf( "Nhap gio, phut, giay [1]: " );
scanf( "%d%d%d", &h, &m, &s );
time = 3600 * h + 60 * m + s;

printf( "Nhap gio, phut, giay [2]: " );


scanf( "%d%d%d", &h, &m, &s );
time -= 3600 * h + 60 * m + s;
if ( time < 0 ) time = -time;

printf( "Hieu thoi gian: %ld gio, %ld phut, %ld giay\n",
time / 3600, ( time % 3600 ) / 60, ( time % 3600 ) % 60 );
return 0;
}
Khi cn thao tc trn d liu c nhiu n v tnh ton khc nhau, ta phi chuyn d
liu v mt n v tnh ton chung.

Bi 20: (trang 8)
#include <stdio.h>

int main() {
unsigned kw;
unsigned long money;

printf( "Nhap so kW tieu thu: " );


scanf( "%u", &kw );
/* c tnh gi sn, tin ph thu tnh sau */
money = kw * 500;
/* t kw 100 tr i, thm ph thu (800 - 500) cho mi kw tng thm */
if ( kw > 100 ) money += ( kw - 100 ) * 300;
/* t kw 250 tr i, thm ph thu (1000 - 800) cho mi kw tng thm */
if ( kw > 250 ) money += ( kw - 250 ) * 200;
/* t kw 350 tr i, thm ph thu (1500 - 1000) cho mi kw tng thm */
if ( kw > 350 ) money += ( kw - 350 ) * 500;
printf( "Chi phi: %lu\n", money );
return 0;
}
C nhiu bi tp tng t nh tnh tin nc, tin in (tnh ph thu khi vt ch
tiu), tnh tin phng, tin taxi (c chit khu khi s dng nhiu).
Cch tnh thng thng s n gin chuyn yu cu ca bi tp thnh cc pht biu
r nhnh tng ng. Cch tnh ny di dng, d nhm ln v c th gy trn cc bin
trung gian khi tnh ton:
#include <stdio.h>

int main() {
unsigned kw;
unsigned long money;

printf( "Nhap so kW tieu thu: " );


scanf( "%u", &kw );

if ( kw <= 100 ) money = kw * 500;


else if ( kw <= 250 ) money = 500 * 100 + 800 * ( kw - 100 );
else if ( kw <= 350 )

82
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


money = 500 * 100 + 800 * ( 250 - 100 ) + 1000 * ( kw - 250 );
else
money = 500 * 100 + 800 * ( 250 - 100 ) +
1000 * ( 350 - 250 ) + 1500 * ( kw - 350 );
printf( "Chi phi: %lu\n", money );
return 0;
}
Phng php tt nht l tnh ton b chi ph vi mc ph c bn (gi sn). Sau
ty theo iu kin m tnh tip phn chi ph c gim (hoc tng) cho thch hp.
Xem cc ch gii chi tit trong bi gii chnh.

Bi 21: (trang 8)
#include <stdio.h>

int main() {
float sd, d1, d2, d3;
char zone;
unsigned beneficiary;

printf( "Nhap diem chuan: " );


scanf( "%f", &sd );
printf( "Nhap diem 3 mon thi: " );
scanf( "%f%f%f", &d1, &d2, &d3 );
while ( getchar() != '\n' ) { }
printf( "Nhap khu vuc (A, B, C, X): " );
scanf( "%c", &zone );
printf( "Nhap doi tuong (1, 2, 3, 0): " );
scanf( "%u", &beneficiary );

if ( d1 * d2 * d3 ) {
float d = d1 + d2 + d3;
switch ( zone ) {
case 'A': d += 2; break;
case 'B': d += 1; break;
case 'C': d += 0.5;
}
switch ( beneficiary ) {
case 1: d += 2.5; break;
case 2: d += 1.5; break;
case 3: d += 1;
}
printf( "%s [%g]\n", d >= sd ? "Dau" : "Rot", d );
}
else printf( "Rot (co mon diem 0)\n" );
return 0;
}
kim tra trong 3 im nhp vo d1, d2 v d3 c im 0 hay khng, xt tch d1 *
d2 * d3.

Bi 22: (trang 8)
#include <stdio.h>

int main() {

83
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


unsigned n, i, count, sum;

printf( "Nhap n: " );


scanf( "%u", &n );

printf( "Cac uoc so: " );


for ( count = sum = 0, i = 1; i <= n; ++i )
if ( n % i == 0 ) {
printf( "%u ", i );
count++;
sum += i;
}

printf ( "\nCo %u uoc so, tong la: %u\n", count, sum );


return 0;
}
Bi tp ny rn luyn mt k nng thng dng: cch thu thp thng tin qua cc
vng lp:
- Mt bin tch ly (count, sum, ) phi c khi to trc khi vo vng lp, thay
i trong thn vng lp (tng dn tng n v, cng tch ly, ) ri c hin th
sau khi chm dt vng lp.

Bi 23: (trang 8)
#include <stdio.h>

int main() {
unsigned n, i, j, sum;

printf( "Nhap n: " );


scanf( "%u", &n );

printf( "Cac so hoan hao nho hon %u: ", n );


for ( i = 1; i < n; ++i ) {
for ( sum = 0, j = 1; sum <= i && j < i; ++j )
if ( i % j == 0 ) sum += j;
if ( sum == i ) printf( "%u ", i );
}
putchar( '\n' );
return 0;
}
Thm iu kin (sum <= i) cho vng lp bn trong s gim ng k s vng lp cn
xt.

Bi 24: (trang 9)
#include <stdio.h>

int main() {
unsigned long n, t;
unsigned u, sum = 0, count = 0;

printf( "Nhap n: " );


scanf( "%lu", &n );
t = n;
84
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


do {
u = t % 10;
count++;
sum += u;
} while ( t /= 10 );
printf( "%lu co %u chu so\n", n, count );
printf( "Chu so cuoi cung la: %lu\n", n % 10 );
printf( "Chu so dau tien la: %u\n", u );
printf( "Tong cac chu so la: %u\n", sum );
printf( "So dao nguoc la: " );
while ( n % 10 == 0 ) n /= 10; /* loi cc s 0 u s o */
do printf( "%lu" , n % 10 ); while ( n /= 10 ) ;
putchar( '\n' );
return 0;
}
Vic kt hp va nh tr va dng lm biu thc iu kin rt ph bin khi dng
vng lp while, do ... while, bn cn rn luyn cch vit ny. V d:
do {
printf( "%u" , n % 10 );
} while ( n /= 10 );
Gii thch: sau khi n chia cho 10, nu n cn khc 0 (ngha l n < 10) th vng lp vn
cn hot ng.
Biu thc iu kin ca C s c nh tr xc nh ng sai: tr bt k khc 0 l
true (ng), tr bng 0 l false (sai). C np tr ny vo thanh ghi v kim tra cc bit
xc nh ng sai.
iu ny dn n mt li rt thng gp vi ngi mi lm quen C l nhm ln gia
du == ca php so snh bng vi du = ca php gn. V d:
if ( i = 0 ) printf( "i bang 0\n" );
else printf( "i khac 0\n" );
Kt qu lun xut: i khac 0 vi mi i nhp vo, k c khi nhp i = 0.
Ngi vit nhm ln biu thc kim tra vi php gn. Trnh bin dch s gn i
bng 0, ri kim tra biu thc iu kin. V biu thc ny bng 0 nn lun cho kt
qu false v phn else ca cu trc if ... else s c thc hin.
Lp trnh vin c kinh nghim thng dng mo sau trnh li: thay v bn vit:
if ( i == 0 ) ... , dng: if ( 0 == i )...
Trong trng hp nhm ln du == vi =:
if ( i = 0 ) ... : chng trnh vn chy v cho kt qu sai.
if ( 0 = i ) ... : s bo li do khng th gn cho mt hng. Li ny gi l li
Lvalue: tr bn tri du = c C cho l mt modifiable lvalue, ngha l phi thay
i c. Ngn ng tha k C l C# cng ch loi b c tnh d nhm ln ny.
Do th t cc yu cu nn bi c trin khai nh trn. Tuy nhin, cng c cch thc
hin khc.
Bi tp: Nhp vo mt s t nhin n (c nhiu hn 2 ch s), cho bit n c bao nhiu
ch s, tm 2 ch s u tin v 2 ch s cui cng ca n.
Nhap n: 12345
12345 co 5 chu so: [12] .. [45]

#include <stdio.h>
#include <math.h>

85
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


int main() {
unsigned long n;
int c;

printf( "Nhap n: " );


scanf( "%lu%n", &n, &c );
printf( "%lu co %d chu so: [%lu] .. [%lu]\n",
n, c, n / ( unsigned ) pow( 10, c - 2 ), n % 100 );
return 0;
}

Bi 25: (trang 9)
#include <stdio.h>

int main() {
unsigned a, b, gcd, lcm;

printf( "Nhap cap (a, b): " );


scanf( "%u%u", &a, &b );

gcd = a;
while ( a % gcd || b % gcd ) gcd--;
printf( "USCLN (a, b): %u\n", gcd );
lcm = a;
while ( lcm % a || lcm % b ) lcm++;
printf( "BSCNN (a, b): %u\n", lcm );
return 0;
}
C nhiu gii thut cho bi ny trnh by trong nhiu sch lp trnh, ch yu l gii
thut tnh USCLN. Chng ti gii thiu 2 gii thut ph bin:
- Dng gii thut vt cn (cch trn). Gi gcd l USCLN, khi to gcd bng a hoc b
(tt nht bng s nh hn). Sau tr gcd dn tng n v cho n khi a v b u
chia ht cho gcd, gcd cui s l USCLN.
Nh vy iu kin chm dt vng lp l a v b u chia ht cho gcd:
( a % gcd == 0 && b % gcd == 0 )
Suy ra, iu kin vng lp tn ti l ph nh mnh trn, theo nh l De
Morgan18 l:
( a % gcd != 0 || b % gcd != 0 )
v vit tt: ( a % gcd || b % gcd )
- Dng thut ton Euclid:
#include <stdio.h>

int main() {
unsigned a, b, c;

printf( "Nhap cap (a, b): " );


scanf( "%u%u", &a, &b );
c = a * b;
while ( a - b ) ( a > b )? ( a -= b ) : ( b -= a );
printf( "USCLN (a, b): %u\n", a );

18 Augustus De Morgan (1806 - 1871)


86
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


printf( "BSCNN (a, b): %u\n", c/a );
return 0;
}
+ Ch biu thc iu kin (a - b) ca vng lp while tng ng biu thc iu
kin (a != b) v trc khi tin hnh gii thut tnh USCLN phi tnh trc tch a *
b v sau gii thut a, b thay i.
+ Nu bn vit:
while ( a - b ) ( a > b ) ? a -= b : b -= a;
bn c th s nhn kt qu sai do qu trnh ti u m i tng ty theo trnh bin
dch. Bn nn vit vi cp ngoc n bao quanh:
while ( a - b ) ( a > b ) ? ( a -= b ) : ( b -= a );
Ta cng gp iu tng t khi dng macro. C vi nguyn tc n gin trnh cc
hiu ng l do macro gy ra: dng cp ngoc n bao quanh maro v cc tham s
ca macro, khng nn truyn mt biu thc nh l mt tham s ca macro. V d:
#define Cube( x ) x * x * x
s hot ng sai vi: Cube( x + 1 ), v trnh bin dch s hiu l:
x + 1 * x + 1 * x + 1 tc: x + (1 * x) + (1 * x) + 1.
Ta cn vit nh sau:
#define Cube(x) ( (x) * (x) * (x) )
+ Thut ton tnh USCLN trong cch trn khng chnh xc vi a (hoc b) m hoc
bng 0. Chng c suy khng y t thut ton Euclid nh nhiu sch lp trnh
m t. Thut ton Euclid dng cng thc truy hi (recurrence) sau:
gcd( 0, b ) b

gcd( a, b ) gcd( b MOD a, a ) a 0


V vy thut ton Euclid c th thc hin d dng bng quy:
unsigned gcd( unsigned a, unsigned b ) {
return ( !a ) ? b : gcd( b % a, a );
}
Ch :
- USCLN(0, 0) khng xc nh, ta khng xt y.
- BSCNN( a, b ) c th tnh c t USCLN( a, b ).
Bi tp: Nhp mt s thc (kiu double) dng, phn thp phn c ti a 6 k t.
Tch s nhp vo thnh phn nguyn v phn thp phn ri in ra mn hnh:
Nhap mot so float: 123.456789
Phan nguyen : 123
Phan thap phan: 456789

#include <stdio.h>
#include <math.h>

int main() {
double n, m;
long t;
int i = 0;

printf( "Nhap mot so double: " );


scanf( "%lf", &n );
printf( "Phan nguyen : %ld\n", t = ( long ) n );
do {
i++;

87
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


m = n * pow( 10, i ) - t * pow( 10 , i );
} while ( n * pow( 10, i ) - ( long ) ( t * pow( 10 , i ) + m ) );
printf( "Phan thap phan: %ld\n", ( long ) m );
return 0;
}
Gi m l tr float ca phn thp phn ca s thc n.
tng l s thc (n) v phn nguyn (t) ca n khng bao gi bng nhau (n - t
!= 0) khi phn thp phn ca s thc cn khc 0. phn thp phn ca s thc l
0, ta nhn s thc n vi 10 mt s ln, cng ng bng s ln nhn 10 chuyn m
thnh tr nguyn. Tuy nhin, do hn ch v chnh xc ca kiu double, khi so snh
n v t ta phi y chng sang phn nguyn ri mi so snh.
Nu ch n gin ly phn nguyn v phn thp phn, dng hm modf() trong th
vin math.h.
#include <stdio.h>
#include <math.h>

int main() {
double n, fractpart, intpart;
n = 9.123456;
fractpart = modf(n, &intpart);
printf("Phan nguyen : %lf\n", intpart);
printf("Phan thap phan: %lf\n", fractpart);
return 0;
}

Bi 26: (trang 9)
#include <stdio.h>
#include <math.h>

int main() {
int num, denom;
int tnum, tdenom;

printf( "Nhap tu so, mau so: ");


scanf( "%d%d", &num, &denom );

tnum = abs( num );


tdenom = abs( denom );

while ( tnum != tdenom )


( tnum > tdenom ) ? ( tnum -= tdenom ) : ( tdenom -= tnum );
/* tnum by gi bng gcd( num, denom ) */
num /= tnum;
denom /= tnum;

printf( "Rut gon: " );


if ( denom < 0 ) {
num = -num;
denom = -denom;
}
if ( denom == 1 ) printf( "%d\n", num );
else printf( "%d/%d\n", num, denom );
return 0;

88
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}
Thut ton Euclid tnh USCLN p dng trong bi 25 (trang 86), ch ng vi hai s
nguyn dng, v vy cn ly gi tr tuyt i ca hai s trc khi tin hnh thut
ton.
phn s c dng in thun tin, ta bin lun nh sau:
Nu t s v mu s khc du, xt mu s; nu mu s < 0, ta i du c t s v
mu s du - chuyn sang t s.
Nu t s v mu s cng du, xt mu s; nu mu s < 0 (ngha l t s cng
< 0), ta i du c t s v mu s loi du -.
M t iu kin trn bng ngn ng lp trnh:
if ( num * denom < 0 ) {
if ( denom < 0 ) { num = -num; denom = -denom; }
} else {
if ( denom < 0 ) { num = -num; denom = -denom; }
}
Ta rt gn thnh:
if ( denom < 0 ) { num = -num; denom = -denom; }

Bi 27: (trang 9)
#include <stdio.h>

int main() {
unsigned n, i = 2;

printf( "Nhap n: " );


scanf( "%u", &n );
while ( n > 1 ) { /* lp khi n > 1 */
while ( n % i ) ++i; /* tm c s i u tin > 1 ca n */
/* chia n cho i va tm c v phn tch tha s nguyn t tip */
n /= i;
/* i chnh l c s nguyn t nh nht ca n */
printf( n > 1 ? "%u * " : "%u\n", i );
}
return 0;
}
Trc ht bn hy quan st cch tnh tha s nguyn t ca n trong hnh di:
- Bn tri ta chia n cho s nguyn t va tm c bn phi,
i
v thc hin iu ny cho n khi n = 1 (ngha l lp trong n / i (khng cn
khi n > 1). khi to)
- Bn phi ta tm c s nguyn t nh nht vi mi n tng 12 2
ng bn tri. 6 2
- Kt qu ct bn tri (cc c s nguyn t nh nht tm 3 3
1
c) l cc tha s nguyn t nhn c khi phn tch n 12 = 2 * 2 * 3
thnh tha s nguyn t.
Ta nhn xt: c s i > 1 nh nht ca mt s n lun l mt s nguyn t. Bi v
nu i khng phi l s nguyn t th s tm c mt c s > 1 ca n nh hn i,
l c s ca chnh i. Nh vy, pha bn phi, thay v phi tm c s nguyn t
nh nht ca n ta ch cn tm c s > 1 nh nht ca n. Ni cch khc, pha bn
phi ch cn tm c s > 1 u tin ca n bn tri.
89
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Ch , vng lp tm c s ln sau bt u t i c.
Mt cch gii khc:
- Tm cc c s ca n ln hn 1.
- Nu tm thy loi b tha s nguyn t (n /= i), in n ra v tm tip.
V mt tha s c th xut hin nhiu ln, dng while thay v if.
for ( i = 2; i <= n; ++i )
while ( n % i == 0 ) {
n /= i;
printf( n > 1 ? "%u * " : "%u\n", i );
}
C th dng gii thut quy nhng phc tp hn nhiu:
#include <stdio.h>
#include <math.h>

void PrimeAnalyse( unsigned prime, unsigned n ) {


if ( prime > ( unsigned )( sqrt( n ) ) ) {
printf( "%u\n", n );
return;
}
if ( n % prime == 0 ) {
printf( "%u * ", prime );
PrimeAnalyse( prime, n/prime );
return;
}
else PrimeAnalyse( prime + 1, n );
}

int main() {
unsigned n;
printf( "Nhap n: " );
scanf( "%u", &n );
PrimeAnalyse( 2, n );
return 0;
}
y l mt bi ton quy kiu chn trn, tng s prime c chuyn n hm
PrimeAnalyse() xc nh c phi l c s ca n khng, cho n khi prime vt
qu im chn trn n (im dng ca quy). Trong hm, khi mt prime c
xc nh l c s (n % prime == 0) th prime c in ra v kim tra tip vi
n/prime xem cn l c s khng, nu khng prime mi (prime + 1) s c kim
tra.
gim s ln quy, dng: PrimeAnalyse( prime + 1, n );
c vit thnh:
if ( prime == 2 ) PrimeAnalyse( 3, n );
else PrimeAnalyse( prime + 2, n );

Bi 28: (trang 10)


#include <stdio.h>
#include <math.h>

int main() {
double x;

90
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


long round;
unsigned n;

printf( "Nhap so thuc x: ");


scanf( "%lf", &x );
printf( "Do chinh xac: ");
scanf( "%u", &n );

/* x = x * 10n, mc tiu dch chuyn phn cn


lm trn thnh phn nguyn ca s thp phn */
x *= pow( 10, n );

/* tin hnh lm trn, chuyn kiu t ng thnh long */


if ( x > 0 ) round = ( long )( x + 0.5 );
else round = ( long )( x - 0.5 );
/* x = x / 10n, ngc vi dch chuyn lc u */
x = round / pow( 10, n );

printf( "%.*lf\n", n > 0 ? n : 0 , x );


return 0;
}
Chui nh dng: %.*lf c ngha nh sau:
x = 3.141593;
n = 4;
printf( "%.*lf", n, x );

n ch s
thp phn

3.141593
K t * cho bit s k t dnh ch c ch nh bi mt tham s (kiu int) ca
printf() ti v tr tng ng.
Ngha l:
printf( "%.*lf\n", n , x );
Vi n = 4, tng ng vi: printf( "%.4lf\n", x );

Bi 29: (trang 10)


#include <stdio.h>

int main() {
unsigned cel, fah;

printf( "%10s%14s\n", "Celcius", "Fahrenheit" );


for ( cel = 0; cel <= 10; ++cel )
printf( "%10u%14.2f\n", cel, 9.0 * cel / 5 + 32 );
printf( "\n%10s%14s\n", "Fahrenheit", "Celcius" );
for ( fah = 32; fah <= 42; ++fah )
printf( "%10u%14.2f\n", fah, 5.0 * ( fah - 32 ) / 9 );
return 0;
}

Bi 30: (trang 10)


91
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

#include <stdio.h>

int main() {
double rate, balance;
unsigned year, period, n;

do {
printf( "Nhap lai suat, tien von, thoi han: " );
n = scanf( "%lf,%lf,%u", &rate, &balance, &period );
while ( getchar() != '\n' ) { }
if ( n != 3 || n == EOF )
printf( "Nhap thieu hoac nhap loi!\n" );
} while ( n != 3 || n == EOF );

printf( "Lai suat: %g%%\n", rate * 100 );


printf( "Von ban dau: %g\n", balance );
printf( "Thoi han: %u nam\n", period );
printf( "%3s%10s\n", "Nam", "Von" );
for ( year = 1; year <= period; ++year ) {
balance *= 1 + rate;
printf( "%3u%10g\n", year, balance );
}
return 0;
}
Bi ny dng vng lp do while kim sot nhp vi hm scanf(): hm scanf()
s tr v s phn t c gn tr thnh cng. Nu xut hin li scanf() tr v tr EOF.
Mt v d v dng hm scanf() c kim tra li v c ch loi b k t '\n' cn
st li trong vng m nhp:
printf( "Nhap mot so integer: " );
while ( scanf( "%d", &x ) != 1 ) {
while ( getchar() != '\n' ) { }
printf( "Nhap mot so integer: " );
}
Hm scanf() cn c s dng rt linh hot x l d liu nhp, xem thm bi
174 (trang 254).

Bi 31: (trang 11)


#include <stdio.h>

int main() {
unsigned i, j;

printf( "Bang cuu chuong\n" );


for ( i = 1; i <= 10; ++i ) {
for ( j = 2; j <= 9; ++j )
printf( "%c%2ux%2u=%2u", 179, j, i, i * j );
printf( "%c\n", 179 );
}
return 0;
}
In tng dng cho tt c cc bng cu chng ri mi chuyn sang in dng k tip.
Cc bng cu chng cch nhau bi k t c m ASCII 179.

92
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 32: (trang 11)


#include <stdio.h>

int main() {
char c;
do {
unsigned n;
printf( "Nhap n: " );
scanf( "%u", &n );
while ( getchar() != '\n' ) { }
unsigned num = 0, i = 0;
while ( 1 ) {
printf( "%5u", n );
if ( n == 1 && num > 1 && ++num ) break;
if ( n % 2 ) n = n * 3 + 1;
else n /= 2;
num++; i++;
if ( i % 6 == 0 ) putchar( '\n' );
}
printf( "\nHailstones sinh duoc: %u\n", num );
do {
printf( "Tiep (y/n)? ");
scanf( "%1[^\n]c", &c );
while ( getchar() != '\n' ) { }
} while ( c != 'y' && c != 'n' );
} while ( c != 'n' );
return 0;
}
Kh khn ch yu ca bi tp ny l xc nh cc Hailstones ca 1, nguyn do l tr
1 cng c xem nh iu kin kt thc vng lp. Tuy nhin, ta d dng phn bit
tr 1 ny l tr a vo tnh hay tr cui chui Hailstones da vo vic m s phn
t ca chui Hailstones c sinh ra:
if ( n == 1 && num > 1 && ++num ) break;
Nu hai iu kin u l true th tng num v do num > 0 nn cng true.
C vi cch th hin vng lp vnh vin trong C nh:
for ( ; ; ) { }
while ( 1 ) { }
thot khi cc vng lp vnh vin ny, dng pht biu break, goto hoc return,
nhng lp trnh vin c kinh nghim thng khng dng goto.

Bi 33: (trang 11)


#include <stdio.h>
#include <math.h>

int main() {
unsigned i, j, s;

printf( "So Amstrong co 3, 4 chu so:\n" );


/* i dng duyt cc s c 3, 4 ch s */
for ( i = 100; i < 9999; ++i ) {
/* j dng tch cc ch s ca i ra kim tra */
for ( s = 0, j = i; s <= i && j > 0; j /= 10 )
s += ( unsigned )pow( j % 10, i < 1000 ? 3 : 4 );
93
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


if ( i == s ) printf( "%u ", i );
}
putchar( '\n' );
return 0;
}
Tng t bi 23 (trang 84), thm iu kin sum <= i cho vng lp bn trong s gim
ng k s vng lp cn xt.
Mt cch gii khc, dng macro thay cho dng hm pow():
#include <stdio.h>
#define p3( x ) x * x * x
#define p4( x ) x * x * x * x

int main() {
unsigned i, j, k, l, d;

for ( i = 1; i < 10; ++i )


for ( j = 0; j < 10; ++j )
for ( k = 0; k < 10; ++k ) {
d = 100*i + 10*j + k;
if ( p3(i) + p3(j) + p3(k) == d )
printf( "%u ", d );
for ( l = 0; l < 10; ++l )
if ( p4(i) + p4(j) + p4(k) + p4(l) == 10*d + l )
printf( "%u ", 10*d + l );
}
return 0;
}

Bi 34: (trang 11)


#include <stdio.h>
#include <math.h>
#define eps 1e-6

double f( double x ) {
return pow( sin( x ), 2 ) * cos( x );
}

double inter( double a, double b, unsigned n ) {


unsigned i;
double h = ( b - a )/n;
double t = 0.5 * ( f( a ) + f( a + n * h ) );
for ( i = 1; i < n; ++i )
t += f( a + i * h );
return t * h;
}

int main() {
unsigned n = 10;
double a = 0;
double b = 1.5708; /* /2 */
double t, t1;

t1 = inter( a, b, n );
do {

94
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


t = t1;
n *= 2;
t1 = inter( a, b, n );
} while ( fabs( t1 - t ) / 3 > eps );

printf ( "Ket qua : %lf\n", t1 );


printf ( "Doi chung: %lf\n", pow( sin( b ), 3 ) / 3 );
return 0;
}
Cng thc hnh thang dng tnh tch phn xc nh: vi b a
h , x i a ih
n
fx 0 fx 1 fx 1 fx 2 fx n 1 fx n
b
fx dx h
2

2
...
2

a
n f(x i) f(x i 1 ) n
f(a ih) f(a (i 1)h)
h h
i0 2 i0 2
biu thc cui trn thun li cho vic t chc vng lp chy t 0 n n - 1, thn
vng lp l tng tch ly ca 1/2 tng hai li gi hm:
double inter( double a, double b, unsigned n ) {
unsigned i;
double h = ( b - a )/n;
double t = 0.0;

for ( i = 0; i < n; ++i )


t += ( f( a + i * h ) + f( a + ( i + 1 ) * h ) ) / 2;
return t * h;
}
nhng biu thc sau gip d xy dng vng lp hn v cng chy nhanh hn (thn
vng lp ch gi hm mt ln):
fx 0 fx 1 fx 1 fx 2 fx n 1 fx n
h ...
2 2 2
fx 0 fx n
h fx 1 ... fx n 1
2
fx 0 fx n n1
f(a) f(a nh) n1
h f(xi)
h f(a ih)
2 i1 2 i1
double inter( double a, double b, unsigned n ) {
unsigned i;
double h = ( b - a )/n;
double t = 0.5 * ( f( a ) + f( a + n * h ) );

for ( i = 1; i < n; ++i )


t += f( a + i * h );
return t * h;
}
Bn cn nhn thy mi tng quan nht nh ca cc k hiu ton hc hoc vi
vng lp for. Nhng bin i s b cng thc ton hc lm giai on lp trnh tr
nn thun tin hn.

Bi 35: (trang 12)


#include <stdio.h>

95
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

int isPrime( unsigned k ) {


unsigned i;
if ( k == 2 ) return 1;
if ( k < 2 || k % 2 == 0 ) return 0;
for ( i = 3; i < ( k >> 1 ); i += 2 )
if ( k % i == 0 ) return 0;
return 1;
}

int main() {
unsigned n;

printf( "Nhap n: " );


scanf( "%u", &n );

if ( isPrime( n ) )
printf( "%u la so nguyen to\n", n );
else {
printf( "%u khong la so nguyen to\n", n );
unsigned i;
for ( i = n - 1; i >= 2; --i )
if ( isPrime( i ) ) {
printf( "So nguyen to be hon gan nhat: %u\n", i );
break;
}
}
return 0;
}
Mt s nguyn t k l s nguyn ln hn 1, ch chia ht cho 1 v cho chnh n. Bn
phi kim tra iu ny bng cch ln lt kim tra cc s t 2 (ng nhin k chia
ht cho 1) n k xem k c chia ht cho s no khng. Nu s cn kim tra cha n
k m k chia ht cho n th k khng phi l s nguyn t.
Thc t ch cn kim tra t 2 n k : iu kin vng lp l k n , hoc k * k n
. Theo bt ng thc Cauchy19: k (k 1) , v vy thay v dng k (phi c th
2
vin math.h) v tnh ton chm hn, ta c th dng:
(k + 1)/2 = k/2 + 0.5 k/2 + 1
Vi s nguyn, php chia cho 2n c th thay th bng php dch phi bit >> n n v.
V d: thay v kim tra vi 1 + k/2, ta kim tra vi 1 + (k >> 1).
Php dch bit c thc thi nhanh hn do phn cng h tr.
Bn cng c th ly s nguyn t gn nht, b hn n, bng cch quy nh sau.
Cch ny th v do gn vi t duy ca con ngi:
#include <stdio.h>

int isPrime( unsigned k ) {


unsigned i;
if ( k == 2 ) return 1;
if ( k < 2 || k % 2 == 0 ) return 0;
for ( i = 3; i < (k >> 1); i += 2 )
if ( k % i == 0 ) return 0;

19 Augustin Louis Cauchy (1789 - 1857)


96
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


return 1;
}

int getPrime( unsigned n ) {


if ( isPrime( n ) ) return n;
return getPrime( n - 1 );
}

int main() {
unsigned n, t;

printf( "Nhap n (n > 2): " );


scanf( "%u", &n );

t = getPrime( n );
if ( t == n )
printf( "%u la so nguyen to\n", n );
else {
printf( "%u khong la so nguyen to\n", n );
printf( "So nguyen to be hon gan nhat: %u\n", t );
}
return 0;
}

Bi 36: (trang 12)


#include <stdio.h>

int main() {
unsigned n, k, i, count;

printf( "Nhap n: " );


scanf( "%u", &n );

k = 2;
count = 0;
while ( count < n ) { /* vng lp kim tra k c phi l s nguyn t */
for ( i = 2; i * i <= k; ++i )
if ( k % i == 0 ) break;
if ( i * i > k ) {
printf( "%u ", k );
count++;
}
k++;
}
putchar( '\n' );
return 0;
}
Vng lp duyt cc s i t 2 n k , nu k chia c cho mt trong cc s dng
lnh break thot khi vng lp. Nh vy c hai trng hp kt thc vng lp, xc
nh bi tr ca i khi kt thc vng lp:
- Nu i <= k , ngha l k c c s v khng phi l s nguyn t.
- Nu i > k , ngha l k vt qua vng lp kim tra v l s nguyn t.

97
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 37: (trang 13)


#include <stdio.h>

int main() {
unsigned n, m, s;

do {
printf( "Nhap n: " );
scanf( "%u", &n );
} while ( !n && printf( " Error: n > 0\n" ) );

s = 0;
m = 1;
while ( s + m < n ) {
printf( "%u", m );
s += m++;
if ( s + m < n ) printf( " + " );
}
if ( s ) {
printf( " = %u < %u\n", s, n );
printf( "m = %u\n", m - 1 );
}
else printf( "Khong tim thay\n" );
return 0;
}
Ch mt cch bo li ca vng lp nhp s:
do {
printf( "Nhap n: " );
scanf( "%u", &n );
} while ( n <= 0 && printf( " Error: n > 0\n" ) );
Hm printf() tr v s k t xut, trong trng hp trn v phi biu thc iu kin
lun ng.
- Trong trng hp nhp sai (n <= 0), kim tra v tri biu thc iu kin cho kt
qu ng nn tip tc kim tra v phi v li bo li c in ra.
- Trong trng hp nhp ng (n > 0), kim tra v tri biu thc iu kin cho kt
qu sai; do tnh cht ngn mch ca biu thc iu kin, nn khng cn kim tra
biu thc v phi na.
Nu ch tm m, c th vit ngn gn nh sau:
#include <stdio.h>

int main() {
unsigned n, m, s;

do {
printf( "Nhap n: " );
scanf( "%u", &n );
} while ( n <= 0 && printf( " Error: n > 0\n" ) );
s = 0;
m = 1;
while( s + m < n ) s += m++;
if ( s ) printf( "m = %u\n", m - 1 );
else printf("Khong tim thay\n");
return 0;
98
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}

Bi 38: (trang 13)


#include <stdio.h>

int main() {
unsigned x, y, z, x1, y1, z1, min, n;

printf( "Nhap n (nghin dong, n > 5): " );


scanf( "%u", &n );

x = y = z = x1 = y1 = z1 = 0;
min = n;
for ( y = n / 2; y > 0; --y )
for ( z = 0; z < n / 5; ++z ) {
x = ( n - 2 * y - 5 * z );
if ( ( y > x + z ) && ( x + y + z < min ) ) {
min = x + y + z;
x1 = x; y1 = y; z1 = z;
}
}

printf( "( %u, %u, %u ): %u\n", x1, y1, z1, min );


return 0;
}
Bi tp ny thc cht l gii h phng trnh;
x 2y 5z n
vi (x y z) nh nht
y x z
bng cch th tt c tp hp nghim c th.
Cc bi tp t 38 - 42 dng nhiu vng lp lng nhau duyt vt cn mt tp hp
ln cc kh nng cn xt.
Hai bin php c p dng gim s vng lp lng nhau, a n gim kch thc
tp hp cn xt:
- T x 2y 5z n , suy ra 2y n v 5z n , nn tp hp cn xt thu nh li:
y [1, ] v z [0, ) . V y x z nn ta thit k vng lp theo y chy t ln
n n
2 5
n nh c kt qu nhanh hn.
- T x 2y 5z n , suy ra x n (2y 5z) , ta loi b c vng lp theo x.
B kt qu (x, y, z) c lu vo (x1, y1, z1), ng thi tng x + y + z (s t bc
ca p n) c tnh so snh vi ln sau nhm thu c b kt qu c s t bc
t nht.

Bi 39: (trang 13)


#include <stdio.h>

int main() {
unsigned x, y, z;

for ( x = 1; x < 100; ++x )


for ( y = 1; y < 100; ++y )
for ( z = 1; z < 100; ++z )
99
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


if ( x * x + y * y == z * z ) {
if ( y - x == 1 && z - y == 1 )
printf( "(%u, %u, %u): ba so nguyen lien tiep\n", x, y, z );
if ( y % 2 == 0 && y - x == 2 && z - y == 2 )
printf( "(%u, %u, %u): ba so chan lien tiep\n", x, y, z );
}
return 0;
}
Ch cc iu kin:
- 3 s nguyn lin tip a, b, c: b - a = c - b = 1.
Khng vit sai biu thc iu kin nh sau: if ( b - a == c - b == 1 )...
Biu thc iu kin trn c c php hp l nhng (c - b == 1) s c nh tr trc
(0 hoc 1), sau (b - a) s so snh vi kt qu nh tr ny dn n sai.
- 3 s chn lin tip a, b, c: b - a = c - b = 2, b (hoc a, c) chn.

Bi 40: (trang 13)


#include <stdio.h>

int main() {
unsigned x, y, z;

for ( x = 1; x < 100 / 5; ++x )


for ( y = 1; y < 100 / 3; ++y ) {
z = 100 - ( x + y );
if ( 300 == 15 * x + 9 * y + z )
printf( "( %2u, %2u, %2u )\n", x, y, z );
}
return 0;
}
Bi tp ny thc cht l gii h phng trnh:
x y z 100
x y z 100
1
5x 3y z 100 15x 9y z 300
3
bng cch th tt c tp hp nghim c th.
Hai bin php c p dng gim s vng lp lng nhau v gim kch thc tp
hp cn xt:
- T 5x 3y z / 3 100 , suy ra 5x 100 v 3y 100 , nn tp hp cn xt thu
nh li: x [1, 100) v y [1, 100)
5 3
- T x y z 100 , suy ra z 100 (x y) , ta loi b c vng lp theo z.

Bi 41: (trang 13)


#include <stdio.h>

float f( float x, float y, int d ) {


switch ( d ) {
case 0: return ( float ) x + y;
case 1: return ( float ) x - y;
case 2: return ( float ) x * y;
case 3: return ( float ) x / y;

100
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}
return 0;
}

int main() {
unsigned i, j, k, l, m;
char sign[] = { '+', '-', '*', '/' };

for ( i = 0; i < 4; ++i )


for ( j = 0; j < 4; ++j )
for ( k = 0; k < 4; ++k )
for ( l = 0; l < 4; ++l )
for ( m = 0; m < 4; ++m )
if ( f( f( f( f( f(1, 2, i), 3, j), 4, k), 5, l), 6, m) == 36 )
printf( "((((1 %c 2) %c 3) %c 4) %c 5) %c 6 = 36\n",
sign[i], sign[j], sign[k], sign[l], sign[m] );
return 0;
}
C 5 du ? (5 php ton c th) v 4 ton t; nn cn 5 vng lp lng nhau, mi vng
lp duyt qua 4 ton t vt cn tt c kh nng c th c.
Do khng xc nh c ton t s s dng, biu thc cn tnh c t chc thnh
dng gi hm, thun li cho vic th hin yu cu trong biu thc iu kin hn.
Trong , cc ton t (+, -, *, /) tng ng (0, 1, 2, 3), c thay bng tham s truyn
n hm.
Cc php ton l nh nhau v c th lp li, nn ta khng ti u cc vng lp.

Bi 42: (trang 14)


#include <stdio.h>

int isPrime( unsigned k ) {


unsigned i;
if ( k == 2 ) return 1;
if ( k < 2 || k % 2 == 0 ) return 0;
for ( i = 3; i < (k >> 1); i += 2 )
if ( k % i == 0 ) return 0;
return 1;
}

int main() {
unsigned p[200], i, n, count;
unsigned x, y, z;

/* mng dng kim chng cha cc s nguyn t 1 < n < 1000


nhng ch kim chng cc s nguyn t 5 < n < 1000 */
for ( n = 0, i = 2; i < 1000; ++i )
if ( isPrime( i ) ) p[n++] = i;
/* n - 3: tr 3 s nguyn t < 5 (2, 3, 5) */
printf( "Co %u so nguyen to n (5 < n < 1000)\n", n - 3 );
for ( count = 0, i = 3; i < n; ++i ) {
for ( x = 0; x < i; ++x )
for ( y = x; y < i; ++y )
for ( z = i; z > y; --z )
if (p[i] == p[x] + p[y] + p[z]) {
printf("%3u = %u + %u + %u\n", p[i], p[x], p[y], p[z]);
101
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


count++;
goto checked;
} /* end if */
checked: { }
} /* end for i */
printf( "Da kiem tra %u so nguyen to\n", count );
return 0;
}
Pht biu nhy goto c khuyn co l khng nn dng v s to m khng cu trc
v phc tp (spaghetti code). Tuy nhin pht biu goto rt hu hiu khi cn thot ra
hng lot vng lp lng nhau nh trng hp bi tp trn. Pht biu break ch c th
gip thot khi mt vng lp ang cha n.
Nu khng mun dng goto, a thn ca vng lp i vo mt hm.
Vi n ln, chng trnh chy chm (v d n = 10000, phi kim chng n 1226 s
nguyn t). Ch sau khi vng lp x chn, vng lp y ch chn s nguyn t t v tr
x tr i, tng t vi z. Nhn xt ny gip gim s ln lp xung nhiu ln.

Bi 43: (trang 14)


#include <stdio.h>

int main() {
unsigned n, i, Fi, Fi1, Fi2;

printf( "Nhap n (n < 40): " );


scanf( "%ld", &n );

Fi = Fi1 = Fi2 = 1;
for ( i = 3; i <= n; ++i ) {
Fi = Fi1 + Fi2;
Fi1 = Fi2;
Fi2 = Fi;
}
printf( "Fi(%u) = %u\n", n, Fi );
return 0;
}
Bi tp ny in hnh cho cch tnh dch chuyn, thng gp khi tnh biu thc
truy hi tuyn tnh:

Fi1 Fi2 Fi

Fi1 = Fi2 Fi2 = Fi


Fi1 Fi2 Fi

tnh Fi mi, cc tr lin quan (Fi1 v Fi2) cn c cp nht, dch chuyn ln


cho ng b, thc hin bng cch gn dn cc tr ln.
Cch khc, kh hiu hn mt cht:
unsigned n, i, Fi, Fi1, t;
/* ... */
Fi1 = Fi = 1;
for ( i = 3; i <= n; ++i ) {
102
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


t = Fi; /* lu li Fi c */
Fi += Fi1; /* Fi mi = Fi c + Fi1 ng trc Fi */
Fi1 = t; /* cp nht Fi1 bng Fi c */
}
printf( "Fi(%u) = %u\n", n, Fi );
hoc dng mng:
unsigned n, i, Fi[40];
/* ... */
Fi[1] = Fi[2] = 1;
for ( i = 3; i <= n; ++i )
Fi[i] = Fi[i-1] + Fi[i-2];
printf( "Fi(%u) = %u\n", n, Fi[n] );
Tham kho thm thut ton tnh nhanh s Fibonnaci bng ma trn ly tha, bi 93
(trang 155).

Bi 44: (trang 14)


#include <stdio.h>

int main() {
unsigned n, i, j;

printf( "Nhap n: " );


scanf( "%u", &n );

for ( i = 1; i <= n; ++i, putchar( '\n' ) )


for ( j = 1; j <= n + i - 1; ++j )
printf( ( j < n - i + 1 )? " " : "* " );

for ( i = 1; i <= n; ++i, putchar( '\n' ) )


for ( j = 1; j <= n + i - 1; ++j )
printf( ( j == n - i + 1 || j == n + i - 1 || i == n ) ? "* " : " " );
return 0;
}
Bi ny ph bin trong cc sch bi tp lp trnh, thng c xem nh bi tp rn
luyn cch tnh ton trong vng lp mt cch trc gic. Vn n gin hn nhiu
nu nhn di kha cnh ton hc.
Bn cht ca yu cu trn l v cc im trn mn hnh theo ta . Bn hy xem
m t th ca bi trn trong hnh di, ch l trc tung i trn mn hnh quay
xung di, gc ta l (1, 1).
1

j<n-i+1 j

i=n
j=n-i+1 j=i j=n+i-1
i
j=n
ng j = n + i - 1 l tnh tin ca ng j = n v ng j = n - i + 1 l i
xng qua trc j = n ca ng j = n + i - 1.
103
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

v c dng ln ct bn dng 2 vng lp lng vo nhau: vng lp ngoi tnh dng


(bin m i), vi mi dng, vng lp trong v cc ct (bin m j). Hai vng lp
ny qut tt c cc v tr phi v (k t * hoc k t space).
Khi v tam gic c, bn qut ton b min:
1 i n

1 j n i 1
trong : vi 1 j n i 1 ta v du space
vi n 1 1 j n i 1 , tc phn cn li, ta v du *
Khi v tam gic rng, c ba trng hp v * tng ng vi phng trnh ba cnh,
d dng xc nh cc trng hp ny da vo th trn.
Bi tp: p dng cch suy lun trn v hai tam gic c, i nh, mi tam gic
c chiu cao l n nhp t bn phm.
#include <stdio.h>

int main() {
unsigned n, i, j;

printf( "Nhap n: " );


scanf( "%u", &n );

for ( i = 1; i <= 2 * n - 1; ++i, putchar( '\n' ) )


for ( j = 1; j <= 2 * n - 1; ++j )
if ( ( j >= i && j <= 2 * n - i ) || ( j <= i && j >= 2 * n - i ) )
printf( "* " );
else printf( " " );
return 0;
}

Bi 45: (trang 14)


#include <stdio.h>

int main() {
unsigned n, i, j;

printf( "Nhap n (n < 5): " );


scanf( "%u", &n );

for ( i = 1; i <= 2 * n - 1; ++i, putchar( '\n' ) )


for ( j = 1; j <= 2 * n - 1; ++j )
if ( ( j <= i && j <= 2 * n - i ) || ( j >= i && j >= 2 * n - i ) )
printf( "%2u", j );
else printf( " " );
return 0;
}
Tnh ton nh bi 44, nhng thay v v du * ta in tr j, ngha l in tr ca ch s ct
tng ng.

Bi 46: (trang 14)


#include <stdio.h>

int main() {
104
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


unsigned long n, s, i;

printf( "Nhap n: " );


scanf( "%lu", &n );

for ( s = 0, i = 1; i <= n; ++i )


s += i * i * i;
printf( "Ve trai = %lu\n", s );
printf( "Ve phai = %lu\n", n * n * ( n + 1 ) * ( n + 1 ) / 4 );
return 0;
}

Bi 47: (trang 15)


#include <stdio.h>

int main() {
unsigned n, i, s;

printf( "Nhap n: " );


scanf( "%u", &n );
for ( s = 0, i = n; i > 0; i -= 2 ) s += i;
printf( "S = %u\n", s );
return 0;
}
Khc nhau gia cch tnh hai tng l tr khi u, c th dng biu thc iu kin
tnh (da vo n chn hay l):
for ( s = 0, i = ( n % 2 ) ? 1 : 2; i <= n; i += 2 )
s += i;
Tng chn c th bt u bng 0, nh vy: i = ( n % 2 ) ? 1 : 0;
ch 1 v 0 cng l nh tr ng hoc sai cho biu thc iu kin ( n % 2 ), nn ta
c th vit rt gn: i = ( n % 2 );
v vng lp tr thnh:
for ( s = 0, i = n % 2; i <= n; i += 2 )
s += i;
Bn nn ch cch vit ny. Mt v d, hm kim tra xem n c l s l khng,
thay v vit: nn vit nh sau:
int isOdd( int n ) { int isOdd( int n ) {
if ( n % 2 ) return 0; return ( n % 2 );
return 1; }
}

Ta nhn thy hai tng trn u kt thc vi n, nn nu ta chn tr khi u l n v


tnh ngc li, cch tnh hai tng trn khng khc nhau, cch gii n gin hn.
for ( s = 0, i = n; i > 0; i -= 2 ) s += i;

Bi 48: (trang 15)


#include <stdio.h>

int main() {
unsigned i, n, temp;

105
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


printf( "Nhap n: " );
scanf( "%u", &n );

for ( i = n / 2; i >= 1; --i )


if ( n % i == 0 && i & 1 ) break;
printf( "US le lon nhat: %u\n", i );

for ( temp = i = 1; i <= n / 2; i *= 2 )


if ( n % i == 0 ) temp = i;

printf( "US lon nhat la luy thua cua 2: %u\n",temp );


return 0;
}
Hai yu cu ca bi tp c v ging nhau nhng cch tin hnh li rt khc nhau:
- Vi cu a) ta tin hnh theo cch thng thng l ly tng c s ca n kim tra
xem c chia ht cho 2 (c s l) khng. nhanh chng ly c c s ln nht,
ta duyt cc s theo chiu ngc t n/2 (c s ln nht c th) n 1 (c s nh
nht c th), v ngt vng lp duyt khi pht hin ra c s l u tin.
- Vi cu b) kh c th tin hnh nh trn l ly tng c s ca n kim tra xem c
phi l ly tha ca 2 khng, do thut ton kim tra ly tha ca 2 khng d. tng
y l suy ngh vi th t ngc li: ly tng ly tha ca 2 trong on cn tm
kim tra xem c phi l c s ca n khng. iu ny thc hin c v ta c th
ch ng to ra ln lt tt c cc s l ly tha ca 2 trong on cho php, bt u
t ly tha ca 2 nh nht (20 = 1). Phi c mt bin tm ln lt lu cc c s tm
c (c s tm c sau s chng ln c s trc), v sau khi kt thc vic duyt
cc ly tha ca 2 (ngha l khi ly tha ca 2 ang xt ln hn n/2) c s cn nm
li trong bin lu tm s l c s ln nht.
Khi kim tra i phi l s l hay khng, ta dng iu kin:
if ( i % 2 ) printf( "Odd number" );
nh vy ngha l ta t duy theo h thp phn: i chia cho 2 cho s d khc 0. Cn
mt cch kim tra khc:
if ( i & 1 ) printf( "Odd number" );
Ta t duy theo h nh phn: dng ton t AND kim tra xem bit cui ca i c
khc 0 hay khng. Ton t AND c thc hin nhanh hn.
Vi s gip sc ca hm pow() (th vin math.h) bn c th tnh cu b) cch khc,
tuy nhin khng hay bng cch trn:
for ( temp = i = 1; pow( 2, i ) <= n / 2; ++i )
if ( n % i == 0 ) temp = i;
printf( "US lon nhat la luy thua cua 2: %u\n", temp );
Trong trng hp bi ny, cu b) cng c th gii theo cch ca cu a), do chng ta
c cch xc nh nhanh mt s c phi l ly tha ca 2 hay khng.
Do nhng tnh cht c bit ca ton hc s b 2 (twos complement), ta vit c
macro kim tra mt s c phi l ly tha ca 2 hay khng:
#define ispow2(x) (!((x) & ((x)-1)) && (x))
Macro ny thc cht kim tra xem bit MSB c phi l bit duy nht bng 1 khng:
x 1000 bit MSB bng 1 vi x l ly tha ca 2
x - 1 0111 x - 1 l mt n ca x dng kim tra bit MSB
x & (x - 1) 0000
ispow2( x ) 1111

106
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Ngoi ra x phi khc 0;


Cu b) c vit li nh sau:
#define ispow2(x) (!((x) & ((x)-1)) && (x))
for ( i = n / 2; i >= 1; --i )
if ( n % i == 0 && ispow2( i ) ) break;
printf( "US lon nhat la luy thua cua 2: %u\n", i );
Cch ny tuy ng ch nhng vn khng nhanh hn cch c dng trong bi gii
trn.

Bi 49: (trang 15)


#include <stdio.h>
#include <math.h>

int main() {
unsigned n, k;
double S = 1.0;

printf( "Nhap n: " );


scanf( "%u", &n );
for ( k = 2; k <= n; ++k )
S = pow( k + S, 1.0 / ( k + 1 ) );
printf( "Ket qua: %g\n", S );
return 0;
}
Xem xt biu thc:
n1 n n1 3
S n (n 1) (n 2) ... 2 1
D dng nhn thy cng thc truy hi ca cn lin tc trn:
Sk k1 k Sk 1 , k 1..n
iu kin u: S1 1 1
Nh vy, ta cn thc hin mt vng lp vi bin m k chy t 2 (v S 1 ng vi k =
1 c tnh) n n. Biu thc trong thn vng lp:
1
Sk k1k Sk 1 (k Sk 1 ) k1 pow(k Sk 1 , 1.0 /(k 1))

Bi 50: (trang 15)


#include <stdio.h>

int main() {
int s, t, temp;

printf( "Nhap s, t (0 < s < t): " );


scanf( "%d%d", &s, &t );

printf( "[" );
do {
printf( "%d", t / s );
temp = t % s;
/* to phn s t/s mi */
t = s;
107
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


s = temp;
printf( temp ? ", " : "]\n" );
} while ( temp );
return 0;
}
T nh ngha ca phn s lin tc:
s chuyn thnh r
trong ln tnh sau
s 1 1

t t r
t chuyn thnh s b
s s
trong ln tnh sau b l thng s ca
php chia t/s
Ta thc hin trong mi vng lp nh sau:
- Tnh thng s b = t / s v in ra.
- Hnh thnh nn phn s t / s mi, vi t s = r = t % s v mu s = s.
Ch cc php gn to phn s mi cn mt bin tm temp do t v s c lin quan
vi nhau.

Bi 51: (trang 16)


#include <stdio.h>

int main() {
int i;
float x, F;

printf( "Nhap x: " );


scanf( "%f", &x );

F = x;
for ( i = 256; i > 0; i /= 2 )
F = x + i / F;
printf( "F = %g\n", F );
return 0;
}
Vn ca bi tp ny l xc nh vng lp cn thc hin, xem biu thc:
1
F x
2
x
4
x
...
128
x
256
x
x
D dng nhn thy cng thc truy hi ca phn s lin tc trn:
2k
Fk x ,k 0 9
Fk 1
iu kin u: F9 x
n y ta c th dng vng lp for. Tuy nhin, ta nhn thy biu thc c tnh t
di ln trn, trong mi ln lp ta phi chuyn 2k thnh 2k-1 = 2k/2. Do vy ta dng
lun i = 2k lm bin m.
108
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

F = x;
for ( i = 256; i > 0; i /= 2 )
F = x + i / F;
Cch vit quy:
float F( float x, int n ) {
if ( n > 256 ) return x;
return x + n / F( x, n * 2 );
}

/* dng trong hm main() */


printf( "F = %g\n", F( x, 1 ) );

Bi 52: (trang 16)


#include <stdio.h>

int main() {
int n, i;
double s = 0.0;

printf( "Nhap n: " );


scanf( "%d", &n );

for ( i = 1; i <= n; ++i )


s += 1.0 / ( n * n + i );
printf( "Fn = %g\n", s );
return 0;
}
D dng nhn thy cch din gii biu thc ton hc vi vng lp for c s tng
ng: tng cc 1 , vi i chy t 1 n n
n2 i
n
1
2
i1 n i
for ( i = 1; i <= n; ++i )
s += 1.0 / ( n * n + i );

Bi 53: (trang 16)


#include <stdio.h>
#include <math.h>
#define eps 1e-4

int main() {
float s, expr, expo, fact, x;
int i, sign = -1;

printf( "Nhap x (radian): " );


scanf( "%f", &x );

fact = 1;
s = expr = expo = x;
for ( i = 3; expr > eps; i += 2, sign = -sign ) {
expr = ( expo *= x * x ) / ( fact *= i * ( i - 1 ) );
s += sign * expr;
}
109
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


printf( "cong thuc Taylor: sin(%.2f) = %.4f\n", x, s );
printf( "sin() cua math.h: sin(%.2f) = %.4f\n", x, sin( x ) );
return 0;
}
Bi ny tng kt cc k nng dng tnh ton trong vng lp. Xt biu thc:
x3 x5 x 2n 1
sinx x ... 1n
3! 5! 2n 1 !
Ek
Vit gn: sin(x) (1)k vi Ek x 2k 1 , Fk (2k 1)!
k0 Fk

x 2k 1 x 2.x 2k 1
Trong mi vng lp t s Ek tng: x2
x 2(k 1) 1 x 2k 1
Trong mi vng lp mu s Fk tng:
(2k 1)! (2k 1).2k.(2k 1)!
(2k 1).2k
(2(k 1) 1)! (2k 1)!
Ek x 2Ek 1
Suy ra biu thc truy hi: sin(x) (1)k (1)k
k0 Fk k0 (2k 1)2kFk 1
iu kin u: E 0 x, F0 1
Gi s khng quan tm n vic du thay i tun hon, t i 2k 1
Ei x 2E
i(i 1i)F1 (1)
i 1 Fi i1 i1

iu kin u theo i: E1 x, F1 1
By gi ta c th xy dng vng lp for tnh biu thc expr vi cc ch sau:
- Bin m i c cp nht i += 2 v khi to i = 3 (do iu kin u i = 1).
- i du vi tng vng lp, khi to bng tr m (do iu kin u du dng).
- Thn vng lp tnh tch ly lun ly tha v giai tha trong mi ln lp:
expr = (biu thc tnh tch ly ly tha) / (biu thc tnh tch ly giai tha);
C th, theo (1):
s += sign * ( expo *= x * x ) / ( fact *= i * ( i - 1 ) );
expo (tc Ei ) khi to bng E1 x , fact (tc Fi ) khi to bng F1 1 .
E1
Tng s, khi to vi du dng v tr: x.
F1
Bi 54: (trang 16)
#include <stdio.h>

float combination( int k, int n ) {


float i;
float nfac = 1.0;
for ( i = 1; i <= k; ++i )
nfac *= ( ( n - i + 1 ) / i );
return nfac;
}

int main() {
int n, k;

printf( "Nhap n, k (k < n < 25): " );


scanf( "%d%d", &n, &k );

110
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

printf( "C( k, n ): %g\n", combination( k, n ) );


printf( "C( n - k, n ): %g\n", combination( n - k, n ) );
return 0;
}
Cn bin i biu thc yu cu thnh dng thun li cho vic m t bng cu trc
lp ca ngn ng lp trnh:
n! n(n 1)(n 2)...(n k 2)(n k 1)(n k)!
Ckn
k! n k ! k!(n k)!
n(n 1)(n 2)...(n k 2)(n k 1)

1.2...k
n (n 1) (n 2) (n (k 2)) (n (k 1))
. . ... .
1 2 3 k 1 k
k
n i 1
i
i1
d dng m t cng thc trn bng pht biu lp.
Ch khai bo bin m i kiu float trnh php chia s nguyn.

Bi 55: (trang 16)


#include <stdio.h>
#include <math.h>

double babylonian( int x ) {


double y = 1.0, q;
do {
double p = x / y;
y = ( y + p ) / 2;
q = fabs( y - p );
} while ( q > 1e - 13 );
return y;
}

int main() {
int x;

printf( "Nhap x (x > 0): " );


scanf( "%d", &x );

printf( "thuat toan babylonian: %g\n", babylonian( x ) );


printf( "ham sqrt() cua math.h: %g\n", sqrt( x ) );
return 0;
}
Thc hin thn vng lp chnh xc theo tng bc c m t trong thut ton
Babylonian. Ch cch dng hm fabs() ca th vin math.h tnh tr tuyt i
ca mt s thc l khong cch gia y v x / y.

Bi 56: (trang 17)


#include <stdio.h>
#include <limits.h>

void printBits( int n ) {


111
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


int size = sizeof( int ) * CHAR_BIT;
printf( "%d = ", n );
while ( --size >= 0 ) {
putchar( ( ( n >> size ) & 1 ) + '0' );
if ( size % CHAR_BIT == 0 ) putchar( ' ' );
}
putchar( '\n' );
}

int main() {
int n;

printf( "Nhap n: " );


scanf( "%d", &n );

printBits( n );
printf( "Hex: %X\n", n );
return 0;
}
Hng s CHAR_BIT, nh ngha s bit trong 1 byte, c nh ngha trc trong
limits.h.
Ngn ng C khng c kch thc c nh cho tng kiu d liu, ngoi tr kiu char
c kch thc 1 byte. Kch thc kiu int chng hn, ph thuc vo kch thc
thanh ghi v xc nh c bng ton t sizeof.
xc nh tng bit ca mt s int, theo th t t tri sang phi:
- Xc nh s bit ca bin n kiu int: size = sizeof( int ) * 8;
- Dch tri n mt khong (size - 1) bit a bit th nht (k t bn tri) thnh bit
phi nht.
- Thc hin php ton bitwise AND (ton t & thao tc trn bit) gia kt qu dch phi
trn vi mt n 1 xc nh bit phi nht l 0 hoc 1.
xc nh bit k tip, th hai (k t bn tri), ta cng a bit ny thnh bit phi
nht bng cch dch tri n mt khong (size - 1) bit vi size gim xung thm
1 n v.
V ta tnh ton vi (size - 1) nn gim size vi --size, ri mi tnh ton. Bin
size cng dng lm bin m dng tch bit cc cm bit ca mi byte d xem.
Dng hin th thp lc phn (hexadecimal, h m 16) hoc bt phn (octal, h m
8) c ngn ng C h tr:
printf( "%d(d) = %#x(h) = %#o(o)\n", 1234, 1234, 1234 );
printf( "%#x(h) = %d(d)\n", 0x162E, 0x162E );
printf( "%#o(o) = %d(d)\n", 013056, 013056 );

Bi 57: (trang 17)


#include <stdio.h>
#include <limits.h>

unsigned parity( int n ) {


int c, size = sizeof( int ) * CHAR_BIT;
unsigned b = 0;
for ( c = size - 1; c >= 0; --c )
b += ( n >> c ) & 1;
return ( b % 2 );

112
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}

int main() {
int n;

printf( "Nhap n: " );


scanf( "%d", &n );

printf( "Even parity bit = %u\n", parity( n ) );


return 0;
}
Mt cch m cc bit 1 khc vi bi 56 (trang 111): dch tri n sao cho cc bit ca n
tnh t bit MSB sang phi, ln lt c a n v tr bit 0. Dng ton t bitwise
AND vi mt n 1, kim tra bit ti v tr bit 0 v m cc bit 1.
Ch cch tr v ca hm parity(), nu cn tm bit parity l, n gin thay i tr
tr v nh sau: return !( b % 2 );
Mt cch tnh bit parity chn hay, nn tham kho:
unsigned parity( int n ) {
unsigned b;
for ( b = 0; n != 0; n &= ( n - 1 ) ) b++;
return ( b % 2 );
}

Bi 58: (trang 17)


#include <stdio.h>
#define MAX 100

int main() {
int i, j, n;
int a[MAX] = { 0 };

printf( "Nhap n: " );


scanf( "%d", &n );

for ( i = 2; i <= n; ++i )


if ( !a[i] ) {
printf( "%d ", i );
/* vng lp "gch cho" cc bi s ca i */
for ( j = i + i; j <= n; j += i ) a[j] = 1;
}
putchar( '\n' );
return 0;
}
Ta ch dng mt mng a, trong :
- Ch s ca mng l dy s cn sng xc nh cc s nguyn t.
- Tr ca tng phn t: nu bng 1, s trong dy s (tng ng vi ch s ca phn
t) s b gch cho.
Khi duyt mng a, bt c ch s no c tr bng 0 ta gp u l s nguyn t, v nu
khng l s nguyn t th tr ti ch s c chuyn thnh 1 do qu trnh gch
cho bi s ca mt c s nguyn t no ca n trc (ch ch s u tin
2 chc chn l s nguyn t).

113
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Vng lp gch cho bi s mt ch s (chuyn tr ca ch s thnh 1) ca s nguyn


t tm thy, c thc hin bng php cng nn rt nhanh, v bc lp tng dn nn
s bc lp cng t li.
Cch ci t trn st vi thut ton, ngn gn v hiu qu.
Ch cch khi to mng a cha ton 0 bng khai bo:
int a[MAX] = { 0 };
Cng c th khai bo mng a l static ngay t u cc phn t ca mng c
khi to tr 0, nhng lun cn thn khi s dng bin kiu static.

Bi 59: (trang 18)


#include <stdio.h>

int main() {
int n;
char can[][5] = {"Canh", "Tan", "Nham", "Quy", "Giap",
"At", "Binh", "Dinh", "Mau", "Ky"};
char chi[][5] = {"Than", "Dau", "Tuat", "Hoi", "Ti", "Suu",
"Dan", "Meo", "Thin", "Ty", "Ngo", "Mui"};
printf( "Nhap nam: " );
scanf( "%d", &n );

printf( "%d - %s %s\n", n, can[ n%10 ], chi[ n%12 ] );


printf( "%d - %s %s\n", n + 60, can[ n%10 ], chi[ n%12 ] );
return 0;
}
Mc d Can bt u t Gip v Chi bt u t T, nhng do nm 0 lm mc l nm
Canh Thn, nn cc mng can v chi c b tr nh trn cho ph hp.
Ch cch dng ton t %, hn ch ch s ca mng can (trong [0, 10)) v mng
chi (trong [0, 12)).
Phng php dng bng tra cu (lookup table) nh trn c s dng rt ph bin.

Bi 60: (trang 18)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX 100

void shuffle( int a[], int n ) {


int t[MAX], i;
for ( i = 0; i < n / 2; ++i ) {
t[2 * i] = a[i];
t[2 * i + 1] = a[n / 2 + i];
}
memmove( a, t, ( n - 1 ) * sizeof( *a ) );
}

int isEqual( int a[], int b[], int n ) {


int i;
for ( i = 0; i < n; ++i )
if ( a[i] != b[i] ) return 0;
return 1;

114
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}

int main() {
int a[MAX], b[MAX];
int n, i, count;

srand( time( NULL ) );


do {
printf( "Nhap n (n chan): " );
scanf( "%d", &n );
} while ( n < 2 || n % 2 );

for ( i = 0; i < n; ++i )


printf( "%d ", a[i] = b[i] = rand() % 201 - 100 );
putchar( '\n' );

shuffle( a, n );
for ( i = 0; i < n; ++i )
printf( "%d ", a[i] );

shuffle( b, n );
count = 0;
do {
shuffle( b, n );
count++;
} while ( !isEqual( a, b, n ) );
printf( "\nCan %d lan shuffle de mang tro ve ban dau\n", count );
return 0;
}
on [a, b] cha (b - a + 1) s. Xem bi 11 (trang 73), sinh n s ngu nhin
trong na on [0, n), dng rand() % n. Suy ra, sinh (b - a + 1) s ngu nhin
trong na on [0, b - a + 1), dng rand() % (b - a + 1).
Vy sinh s ngu nhin trong on [a, b], tng ng na on [a, b + 1), ta
iu chnh cn trn v cn di, dng rand() % (b - a + 1) + a.
Bi tp: Xut s ngu nhin trong tp cc s l t 3 n 99.
S l trong on [3, 99] c dng 2 * k + 1 vi k [1, 49], bi tp tr thnh: tm
s ngu nhin k [1, 49].
int randomOdd() {
return 2 * ( rand() % 49 + 1 ) + 1;
}
Hnh bn minh ha mt ln trn perfect shuffle
a[i] a[n/2+i]
mng a thnh mng tm t, c thc hin trong
hm shuffle(), ch cch tnh cc ch s vi
nhng mc ch khc nhau.
Vng lp trn ch cn chy n na mng v trong
thn vng lp thc hin n hai thao tc chuyn v.
Sau khi trn xong mng t s c sao chp tr li
mng gc a. Bn c th thc hin nhanh thao tc
ny bng cch chuyn khi vng nh cp cho t[2*i] t[2*i +1]
mng t chng ln khi vng nh cp cho mng a, bng hm chun memmove() ca
th vin <string.h>.

115
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Hm memmove() c 3 tham s: a ch u vng nh ch, a ch u vng nh ngun


(tham s nm bn phi tham s a ch vng nh ch, b tr ging nh php gn) v
kch thc tnh bng byte ca khi vng nh cn chuyn.
chm dt vng lp m s ln perfect shuffle cho mng tr v ban u, ta kim
tra kt qu trn bng hm so snh hai mng isEqual().

Bi 61: (trang 18)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100

int main() {
int a[MAX];
int n, i, s, p;

srand( time( NULL ) );


do {
printf( "Nhap n [1, %d]: ", MAX - 1 );
scanf( "%d", &n );
} while ( n < 1 || n > MAX - 1 );

for ( i = 0; i < n; ++i )


printf( "%d ", a[i] = rand() % 201 - 100 );
for ( s = i = 0; i < n; ++i )
if ( a[i] > 0 ) s += a[i];
printf( "\nTong cac so nguyen duong = %d\n", s );

do {
printf( "Nhap p [0, %d]: ", n - 1 );
scanf( "%d", &p );
} while ( p < 0 || p > n - 1 );
for ( i = p + 1; i < n; ++i )
a[i-1] = a[i];
n--;

for ( i = 0; i < n; ++i )


printf( "%d ", a[i] );
putchar( '\n' );
return 0;
}
Thng thng, vic xa mng ti mt v tr p c thc hin bng cch dch chuyn
dn tng phn t ca mng sau v tr p chng ln
phn t ngay trc n. C khng kim tra vic truy
p
xut vt qu phm vi ca mng, lp trnh vin phi
chu trch nhim kim sot kch thc ca mng, v
vy phi nh gim s phn t ca mng xung sau
n--
khi xa phn t.
C lu tr cc phn t ca mt mng trong mt vng i=p+1
a[i-1] = a[i]
nh vt l lin tc, v vy dch chuyn cc phn
t nhanh hn, ngi ta thng dng hm chun memmove() ca string.h:
#include <string.h>
116
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


/* ... */
memmove( &a[p], &a[p + 1], ( n - p - 1 ) * sizeof( *a ) );
ta chuyn khi vng nh c (n - p - 1) phn t, bt u t a[p + 1] chng ln
khi vng nh bt u t a[p].
Ch trong C: a = &a[0] l a ch bt u ca mng a; a + p = &a[p] l a ch
ca phn t a[p]. iu ny rt quen thuc vi lp trnh vin C (gi l idiom ca
C), v vy bn nn vit nh sau:
memmove( a + p, a + p + 1, ( n - p - 1 ) * sizeof( *a ) );
Lp trnh vin C xem a[2] chng hn, nh mt a ch, nn vit a[2] hoc 2[a] cng
cho kt qu nh nhau v: a[i] tng ng *(a + i), tng ng *(i + a) v
tng ng i[a]. Tt nhin, dng a[i] th quen thuc hn.

Bi 62: (trang 19)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100

int gcd( int a, int b ) {


return ( !a ) ? b : gcd( b % a, a );
}

int main() {
int a[MAX], n, i, j, s1, s2;

srand( time( NULL ) );


do {
printf( "Nhap n [1, %d]: ", MAX - 1 );
scanf( "%d", &n );
} while ( n < 1 || n > MAX - 1 );
for ( i = 0; i < n; ++i )
printf( "%d ", a[i] = rand() % 11 + 10 );

for ( s1 = s2 = i = 0; i < n; ++i ) {


if ( i % 2 && a[i] % 2 == 0 ) s1 += a[i];
if ( i % 2 == 0 && a[i] % 2 ) s2 += a[i];
}
printf( "\nTong le vi tri chan (%d) ", s1 );
printf( s1 == s2 ? "bang" : "khac" );
printf( " tong chan vi tri le (%d)\n", s2 );

printf( "Cac cap nguyen to cung nhau:\n" );


for ( i = 0; i < n; ++i )
for ( j = i + 1; j < n; ++j )
if ( gcd( a[i], a[j] ) == 1 )
printf( "(%2d, %2d)\n", a[i], a[j] );
return 0;
}
Khi xt cc cp nguyn t cng nhau, v quan h ny l quan h khng th t nn c
th gp cc cp kt qu trng lp, v d: (a[5], a[8]) vi (a[8], a[5]). Do , ta
ch xt mt phn t vi dy phn t ngay sau n n cui mng. D dng nhn thy

117
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

cc cp kt qu lun c ch s phn t sau ln hn ch s phn t trc, trnh c


vic xut cc cp kt qu trng lp.
Tuy nhin ta vn nhn c cc kt qu trng lp khi chy chng trnh. iu ny
do min gi tr hp dn n s trng lp tr ca cc phn t. V d, gi s a[10] c
tr trng a[8], ta c cp kt qu trng lp: (a[5], a[8]) vi (a[5], a[10]). gii
quyt trit , trc tin cn xa cc phn t trng nhau trong mng, ch cha li
mt phn t. Bn tham kho thm bi 64 (trang 119) v bi 65 (trang 120), v d c
th thc hin nh sau:
for ( i = 0; i < n; ++i )
for ( j = i + 1; j < n; ++j )
if ( a[j] == a[i] ) a[j--] = a[--n];
for ( i = 0; i < n; ++i )
for ( j = i + 1; j < n; ++j )
if ( gcd( a[i], a[j] ) == 1 )
printf( "(%2d, %2d)\n", a[i], a[j] );

Bi 63: (trang 19)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define MAX 100

int main() {
int a[MAX];
int n, i, c;

srand( time( NULL ) );


do {
printf( "Nhap n [1, %d]: ", MAX - 1 );
scanf( "%d", &n );
} while ( n < 1 || n > MAX - 1 );
for ( i = 0; i < n; ++i )
printf( "%d ", a[i] = rand() % 201 - 100 );

for ( c = i = 0; i < n; ++i )


if ( a[i] % 4 == 0 && abs( a[i] ) % 10 == 6 ) c++;
printf( "\nCo %d phan tu chia het cho 4, tan cung 6\n", c );

printf( "Nhan doi phan tu le:\n" );


for ( i = 0; i < n; ++i )
if ( a[i] % 2 ) a[i] *= 2;

for ( i = 0; i < n; ++i )


printf( "%d ", a[i] );
putchar( '\n' );
return 0;
}
iu kin mt s tn cng l 6 khng kh, ta tch ch s cui bng cch ly phn
d ca php chia cho 10: ab 10a b . Tuy nhin, bn d b st trng hp a[i]
tn cng l 6 nhng c tr m nn a[i] % 10 bng -6, khng phi 6.

118
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 64: (trang 19)


#include <stdio.h>
#define MAX 100
#define ispow2(x) (!((x) & ((x)-1)) && x)

int main() {
int a[MAX];
int n, i, c, x;

do {
printf( "Nhap n [1, %d]: ", MAX - 1 );
scanf( "%d", &n );
} while ( n < 1 || n > MAX - 1 );

printf( "Nhap %d phan tu:\n", n );


for ( i = 0; i < n; ++i )
scanf( "%d", a + i );

for ( c = i = 0; i < n; ++i )


if ( ispow2( a[i] ) ) c++;
printf( "Co %d so la luy thua cua 2\n", c );

printf( "Nhap x: " );


scanf( "%d", &x );
for ( c = i = 0; i < n; ++i )
if ( a[i] != x ) a[c++] = a[i];
n = c;

for ( i = 0; i < n; ++i )


printf( "%d ", a[i] );
putchar( '\n' );
return 0;
}
Macro ispow2(x) dng kim tra x c phi l ly tha ca 2 khng, c gii thch
trong bi 48 (trang 105).
xa phn t c tr bng x trong mng a c n phn t, theo bi 61 (trang 116):
for ( i = 0; i < n; ++i )
if ( a[i] == x ) {
memmove( a + i, a + i + 1, (n - i - 1 ) * sizeof( *a ) );
i--;
n--;
}
Sau khi dn mng, do a[i] b phn t sau n chng ln, ta cn li i (i--) xt li
phn t a[i]. C th dng mt phng php hay: duyt ngc mng, nh vy trnh
c tnh trng phn t cha kp xt chng ln phn t va b xa:
for ( i = n - 1; i >= 0; --i )
if ( a[i] == x ) {
memmove( a + i, a + i + 1, (n - i - 1 ) * sizeof( *a ) );
n--;
}
Ta vn c th xa mt phn t trong mng m khng cn dn mng: ly phn t cui
chng ln phn t cn xa; ng thi va li i (trnh trng hp phn t cui mng
bng x), va tr s phn t ca mng 1 n v:
119
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

for ( i = 0; i < n; ++i )


if ( a[i] == x )
a[i--] = a[--n];
Phng php ny ch thc hin c trn mng khng th t, nhng mng c th
t, v d nh chui, khng th p dng cch ny. Cch ny hiu qu trong vic xa
mt phn t bt k trong danh sch lin kt (khng c th t).
Trong bi tp ny v mt s bi tp sau, chng ti dng mt phng php khc c
bit d hiu: loi cc phn t c tr bng x ta sao chp cc phn t c tr khc x
sang mt mng b khc:
for ( k = i = 0; i < n; ++i )
if ( a[i] != x )
b[k++] = a[i];
/* k l s phn t ca mng b */
Nh vy ta phi khai bo thm mng b. Tuy nhin, nhn thy rng lc no k i, ta
dng li mng a m khng cn khai bo thm mng b:
for ( k = i = 0; i < n; ++i )
if ( a[i] != 2 )
a[k++] = a[i];
n = k; /* n l s phn t mi ca mng a */
C th vit ti u hn vi nhn xt: khng cn sao chp t a[i] n a[k] nu k = i
(ngha l khng cn sao chp mt phn t ln chnh n):
for ( k = i = 0; i < n; ++i )
if ( a[i] != x ) {
if ( k != i ) a[k] = a[i];
k++;
}
n = k;

Bi 65: (trang 20)


#include <stdio.h>
#define MAX 100

int main() {
int a[MAX], n;
int i, j, c, s;

do {
printf( "Nhap n [1, %d]: ", MAX - 1 );
scanf( "%d", &n );
} while ( n < 1 || n > MAX - 1 );

printf( "Nhap %d phan tu:\n", n );


for ( i = 0; i < n; ++i )
scanf( "%d", a + i );

for ( s = c = i = 0; i < n; ++i )


if ( a[i] < 0 && a[i] % 2 ) {
c++;
s += a[i];
}
printf( "Trung binh cong nguyen am le = %.2f\n", c ? ( float ) s / c : 0 );
for ( i = 0; i < n - 1; ++i ) {
120
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


for ( c = j = i + 1; j < n; ++j )
if ( a[j] != a[i] ) a[c++] = a[j];
n = c;
}

for ( i = 0; i < n; ++i )


printf( "%d ", a[i] );
putchar( '\n' );
return 0;
}
Tnh trung bnh cc phn t nguyn m ca mt mng c v n gin. Tuy nhin
bn c th gp vi li:
- Nu khng xt trng hp mng khng c phn t nguyn m no, do s phn t
nguyn m c m c bng 0, bn s gp li chia cho 0.
- Php chia ly trung bnh cng l php chia nguyn. gii quyt, ta cn mt
trong cc ton hng ca biu thc l s thc:
bng cch p kiu: ( float ) s / c
bng cch khai bo trc s c kiu float
hoc bng cch thm mt ton hng l s thc: s * 1.0 / c
Khi nh tr mt biu thc vi cc ton hng c nhiu kiu khc nhau, C s nng cp
kiu cc ton hng mt cch khng tng minh ri mi thc hin nh tr.
Cch xa tt c phn t c tr x trong mng a, trnh by trong bi 64 (trang 119) thun
li cho vic vit cc chng trnh xa phn t trong mng vi iu kin phc tp
nh bi tp trn:
for ( i = 0; i < n - 1; ++i ) {
for ( c = j = i + 1; j < n; ++j )
if ( a[j] != a[i] ) a[c++] = a[j];
n = c;
}
Vi phn t a[i] ang xt ta xa tt c phn t c tr trng a[i] trong mng con
ngay sau n (phn mng t j = i + 1 tr i). Ch xt n phn t n - 2 v phn t
cui chc chn khng cn phn t trng (khng c mng con pha sau).
V &a[i] tng ng a + i, nn thay v vit: scanf( "%d", &a[i] );
ta c th vit tt: scanf( "%d", a + i );

Bi 66: (trang 20)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100

int main() {
int a[MAX];
int n, i, k, maxpos, minpos;

srand( time( NULL ) );


do {
printf( "Nhap n [1, %d]: ", MAX - 1 );
scanf( "%d", &n );
} while ( n < 1 || n > MAX - 1 );
for ( i = 0; i < n; ++i )
121
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


printf( "%d ", a[i] = rand() % 201 - 100 );
putchar( '\n' );

maxpos = minpos = 0;
for ( i = 1; i < n; ++i ) {
if ( a[i] < a[minpos] ) minpos = i;
if ( a[i] > a[maxpos] ) maxpos = i;
}
printf( "max = %d\n", a[maxpos] );
printf( "min = %d\n", a[minpos] );

for ( k = i = maxpos + 1; i < n; ++i )


if ( a[i] != a[maxpos] ) a[k++] = a[i];
n = k;

for ( i = 0; i < n; ++i )


printf( "%d ",a[i] );
putchar( '\n' );
return 0;
}
C th tm tr ln nht nh sau:
maxval = a[0];
for ( i = 1; i < n; ++i )
if ( a[i] > maxval ) maxval = a[i];
printf( "max = %d\n", maxval );
Ta gi s phn t u tin ca mng l phn t ln nht, gi l maxval. Tin hnh so
snh tr maxval ny vi cc phn t cn li trong mng, nu xut hin phn t no
ln hn maxval th hiu chnh li gi tr maxval.
Gii thut tm tr nh nht ca mng thc hin tng t.
Tuy nhin, khi lm vic vi mng bn nn tp t duy theo ch s. V d ta tin hnh
tm tr ln nht trong mt mng nh sau:
maxpos = 0;
for ( i = 1; i < n; ++i )
if ( a[i] > a[maxpos] ) maxpos = i;
printf( "max = %d\n", a[maxpos] );
Ta gi s phn t u tin (ch s 0) ca mng l phn t ln nht, ta lu ch s thay
v lu phn t: maxpos = 0. Tin hnh duyt mng t phn t th hai (ch s 1) tr
i, nu phn t ang xt ln hn phn t c ch s maxpos lu, ta cp nht li ch
s maxpos vi ch s ang xt.

Bi 67: (trang 20)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100

int main() {
int a[MAX], t;
int n, i, j;

srand( time( NULL ) );


do {

122
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


printf( "Nhap n [1, %d]: ", MAX - 1 );
scanf( "%d", &n );
} while ( n < 1 || n > MAX - 1 );
for ( i = 0; i < n; ++i )
printf( "%d ", a[i] = rand() % 201 - 100 );
putchar( '\n' );

for ( i = 0; i < n - 1; ++i )


for ( j = i + 1; j < n; ++j )
if ( ( a[i] % 2 == 0 && a[j] % 2 == 0 && a[i] > a[j] ) ||
( a[i] % 2 && a[j] %2 && a[i] < a[j] ) )
{ t = a[i]; a[i] = a[j]; a[j] = t; }

for ( i = 0; i < n; ++i )


printf( "%d ", a[i] );
putchar( '\n' );
return 0;
}
Bi tp ny yu cu nm vng gii thut sp xp (sort). Cc gii thut sp xp c
trnh by trong cc gio trnh Cu trc d liu v gii thut hoc K thut lp trnh,
mi gii thut c thc hin bng nhiu cch khc nhau. Trong tp sch ny,
bn d hiu v d nh gii thut, chng ti ch dng gii thut n gin, khng st
vi gii thut gc.
Gi s ta cn sp xp tng n phn t ca mng a. Gii thut sp xp thng c s
dng nht trong cc bi tp lp trnh c bn l sp xp theo kiu chn (Selection
Sort). Ni dung nh sau:
for ( i = 0; i < n - 1; ++i )
for ( j = i + 1; j < n; ++j )
if ( a[i] > a[j] )
/* hon chuyn a[i] vi a[j] */
t = a[i]; a[i] = a[j]; a[j] = t;
Vng lp ngoi, ch s i, thc hin n - 1 t sp xp, mi t sp xp ng cho mt
v tr i. Mng c sp xp theo th t t u n cui.
sp xp ng mt v tr i, ta so snh a[i] vi cc phn t sau n (t j = i + 1
tr i), chn ra phn t nh nht t vo v tr a[i]. Vng lp trong, ch s j, thc
hin iu ny: duyt cc phn t sau v tr i, phn t ang duyt a[j] no nh hn
phn t a[i] ang xt th hon i ngay vi a[i].
Nhc li, sp xp (tng) theo kiu chn nh trn ch d nh, nhng cha th hin r
tng gii thut gc, c s ln hon i t hn: trong phn on mng cha sp
xp, hon i phn t u vi phn t nh nht.
T cch chn phn t ln nht hay nh nht ca mt mng trong bi 66 (trang 121)
bn d dng thc hin iu ny:
for ( i = 0; i < n - 1; ++i ) {
/* Duyt phn on mng cha sp xp */
for ( minpos = i, j = i + 1; j < n; ++j )
/* Chn li minpos nu pht hin phn t c tr nh hn */
if ( a[j] < a[minpos] ) minpos = j;
/* Hon chuyn phn t u vi phn t nh nht ti v tr minpos */
t = a[i], a[i] = a[minpos]; a[minpos] = t;
}

123
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Vic hon chuyn hai phn t vi nhau c th dng macro hay gi hm (truyn tham
s bng con tr).
T duy theo ch s nh trn gip bn gii mt s bi tp phc tp, v d bi tp sau.
Bi tp: In cc phn t ca mt mng cho trc theo th t tng dn, m vn gi
nguyn v tr ca cc phn t trong mng .
Mang ban dau : 8 3 6 7 2 5 7 1 4 1
Sap xep tang : 1 1 2 3 4 5 6 7 7 8
Mang sau xu ly: 8 3 6 7 2 5 7 1 4 1
#include <stdio.h>
#include <stdlib.h>

int* sortAscIndex( int* a, int n ) {


int *p = malloc( n * sizeof( int ) );
int i, j, minpos;
for ( i = 0; i < n; ++i ) p[i] = i;
for ( i = 0; i < n - 1; ++i ) {
int t;
for ( minpos = i, j = i + 1; j < n; ++j )
if ( a[p[j]] < a[p[minpos]] ) minpos = j;
t = p[i]; p[i] = p[minpos]; p[minpos] = t;
}
return p;
}

int main() {
int a[] = { 8, 3, 6, 7, 2, 5, 7, 1, 4, 1 };
int *p;
int i, size = sizeof a / sizeof *a;

printf( "Mang ban dau : " );


for ( i = 0; i < size; ++i ) printf( "%d ", a[i] );
putchar( '\n' );
p = sortAscIndex( a, size );
printf( "Sap xep tang : " );
for ( i = 0; i < size; ++i ) printf( "%d ", a[p[i]] );
putchar( '\n' );
printf( "Mang sau xu ly: " );
for ( i = 0; i < size; ++i ) printf( "%d ", a[i] );
putchar( '\n' );
free( p );
return 0;
}
Ta to mt mng ch s nh x ch s ca mng cn sp xp. Khi so snh cc phn
t v thy cn sp xp, thay v sp xp li v tr ca cc phn t trong mng gc, ta
sp xp li v tr ca cc ch s trong mng ch s.
Nh vy, mng ch s kt qu lu cc ch s ca mng gc, theo th t sao cho cc
phn t ca mng gc ti cc ch s c th t tng dn.

Bi 68: (trang 20)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

124
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


#include <math.h>
#define MAX 100
#define swap(a, b) { int t = a; a = b; b = t; }

int main() {
int a[MAX], n, i, j, i1, j1, k;

srand( time( NULL ) );


do {
printf( "Nhap n (n chan): " );
scanf( "%d", &n );
} while ( n < 2 || n % 2 );
for ( i = 0; i < n; ++i )
printf( "%d ", a[i] = rand() % 101 + 100 );
putchar( '\n' );

for ( k = 0; k < n/2; ++k ) {


/* Tm cp (a[i1], a[j1]) sao cho |a[i1] - a[j1]| nh nht
on cn xt t t thu hp li:
0 n-1, 1 n-2, ... , k n-k-1, ... */
int min = 101;
for ( i = k; i < n - k; ++i )
for ( j = i + 1; j < n - k; ++j )
if ( abs( a[i] - a[j] ) < min ) {
min = abs( a[i] - a[j] );
i1 = i;
j1 = j;
}
/* Nu hiu a[i1] - a[j1] < 0, hon chuyn chng */
if ( a[i1] < a[j1] ) swap( a[i1], a[j1] );
/* a[i1] chuyn v u v a[j1] chuyn v cui on ang xt */
swap( a[i1], a[k] );
swap( a[j1], a[n-k-1] );
}
for ( j = i = 0; i < n/2; ++i ) { /* In v tnh tng na mng u */
printf( "%d ", a[i] );
j += a[i];
}
printf( ": %d\n", j );
for ( j1 = 0; i < n; ++i ) { /* In tip v tnh tng na mng sau */
printf( "%d ", a[i] );
j1 += a[i];
}
printf( ": %d\n", j1 );
printf( "Hieu nho nhat = %d\n", j - j1 );
return 0;
}
Kt hp cc k thut ca bi 62 (trang 117: tm cp phn t tha yu cu cho trc)
v bi 66 (trang 121: xc nh max hoc min ca mt dy), ta tm c cp a0, b0 (a0
> b0) c hiu nh nht, cp a1, b1 (a1 > b1) c hiu nh th hai,
Hon chuyn trong mng chng c sp xp nh sau: a0, a1, , b1, b0. Vic
hon chuyn ny va t chc li mng tin cho xut kt qu, va gip tm cc cp
k tip c d dng, v sau mi ln tm khng gian tm kim li thu hp 2 phn t.

125
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Nh vy hiu (a0 + a1 + ) - (b0 + b1 + ) = tng na mng u - tng na mng


sau s nh nht.
Trong trng hp hai phn t c tr khc bit nhau nht: a0 bng bin phi v a1 bng
bin tri ca on [100, 200], hiu ca chng (100) vn nh hn tr min c gn
u tin (101). Ngha l lc no cng tm c cp phn t tha yu cu.

Bi 69: (trang 21)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100

int main() {
int a[MAX];
int i, head, n, maxlen, maxhead;

srand( time( NULL ) );


do {
printf( "Nhap n [1, %d]: ", MAX - 1 );
scanf( "%d", &n );
} while ( n < 1 || n > MAX - 1 );

for ( i = 0; i < n; ++i )


printf( "%d ", a[i] = rand() % 201 - 100 );
putchar( '\n' );

head = maxhead = maxlen = 0;


do {
int len = 1;
for ( i = head; i < n - 1 && a[i] < a[i+1]; ++i )
len++;
if ( len > maxlen )
{ maxlen = len; maxhead = head; }
head = i + 1;
} while ( head < n );

printf( "\"run\" tang dai nhat: " );


for ( i = 0; i < maxlen; ++i )
printf( "%d ", a[maxhead + i] );
putchar( '\n' );
return 0;
}
Mt run trong qu trnh d tm c xc nh bng 2 bin:
a[i], cui
run trc
len

head mi cp nht
head = i+1
- head: ch s phn t u ca run, c cp nht l phn t ngay sau run trc,
khi d tm run mi. Ban u head c khi to bng 0.
126
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

- len: chiu di ca run, l s phn t m c khi phn t ang xt vn cn tha


tnh cht ca run.
so snh gia cc run, dng 2 bin lu kt qu d tm:
- maxlen: lu chiu di run di nht hin ti, s c cp nht nu pht hin run
c chiu di ln hn.
- maxhead: lu ch s phn t head ca run di nht hin ti, ngha l c chiu di
tng ng maxlen.

Bi 70: (trang 21)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100

void Swap( int *a, int *b ) {


int t = *a; *a = *b; *b = t;
}

int main() {
int a[MAX];
int n, i, j;

srand( time( NULL ) );


do {
printf( "Nhap n [1, %d]: ", MAX - 1 );
scanf( "%d", &n );
} while ( n < 1 || n > MAX - 1 );

for ( i = 0; i < n; ++i )


printf( "%d ", a[i] = rand() % 201 - 100 );
putchar( '\n' );

/* j ch phn t u mng, i dng duyt


nu a[i] l, hon chuyn a[i] vi a[j] v tng j */
for ( i = j = 0; i < n; ++i )
if ( a[i] % 2 ) Swap( a + i, a + j++ );
/* s l cui cng l a[j - 1],
j ch phn t u mng cn li, i dng duyt tip
nu a[i] bng 0, hon chuyn a[i] vi a[j] v tng j */
for ( i = j; i < n; ++i )
if ( !a[i] ) Swap( a + i, a + j++ );

for ( i = 0; i < n; ++i )


printf( "%d ", a[i] );
putchar( '\n' );
return 0;
}
Tng chng bi tp c th thc hin d dng nh sau:
do {
while ( a[i] % 2 && i < j ) i++;
while ( a[j] % 2 == 0 && j > i ) j--;
if ( i < j ) swap( a[i], a[j] );
} while ( i < j );

127
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

vng lp while vi bin m i dng theo di run l (nu c) t u mng tr i,


vng lp while vi bin m j dng theo di run chn (nu c) t cui mng v
trc. Khi cc run ny chm dt, cc trng hp sau y xy ra:
- Nu i < j, ngha l hai run u b dng do xut hin phn t khc tnh cht ca
mi run. Ta hon chuyn hai phn t ny vi nhau ri tip tc duyt tip hai run
(vng lp do while bn ngoi).
- Ngc li, hai run gp nhau, hoc mt trong hai run duyt ht mng
(mng ton chn hoc ton l), ta kt thc vng lp duyt bn ngoi.
Tuy nhin, cch ny khng gii quyt c cc phn t c tr 0. Khng c cch x
l d pht hin c chng trong run, v d trong trng hp hai run u dng
khi pht hin c tr 0.

Bi 71: (trang 21)


#include <stdio.h>
#include <string.h>
#define MAX 100

void lshiftkstep( int a[], int n, int k ) {


int i;
k %= n;
for ( i = 0; i < k; ++i ) {
int t = a[0];
memmove( a, a + 1, ( n - 1 ) * sizeof( *a ) );
a[n - 1] = t;
}
}

int isSymmetrical( int a[], int n ) {


int i;
for ( i = 0; i < n / 2; ++i )
if ( a[i] != a[n - 1 - i] ) return 0;
return 1;
}

int main() {
int a[MAX];
int n, i, k;

do {
printf( "Nhap n [1, %d]: ", MAX - 1 );
scanf( "%d", &n );
} while ( n < 1 || n > MAX - 1 );

printf( "Nhap %d phan tu:\n", n );


for ( i = 0; i < n; ++i )
scanf( "%d", a + i );
printf( isSymmetrical( a, n ) ? "Doi xung" : "Khong doi xung" );

printf( "\nNhap so lan can dich: " );


scanf( "%d", &k );
lshiftkstep( a, n, k );

for ( i = 0; i < n; ++i )

128
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


printf( "%d ", a[i] );
putchar( '\n' );
return 0;
}
S thc hin mt bc dch tri mng ca hm lshiftkstep() c trnh by
trong hnh bn:
- Lu tm phn t a[0] vo bin t.
- n - 1 phn t ca mng (k t a[1]) c sao chp dch tri mt phn t, chng
ln a[0], bng hm memmove().
- a[n - 1] = t, ngha l bng a[0] va b y khi u mng.
t = a[0]

a[1]

memmove()
n-1 phn t a[n-1] = t

a[0]

Ch , nu xoay vng n ln, mng s tr li nh c, v vy vi k > n, thc t k = k


% n.
T bi tp ny tr i, chng ta thc hin cc yu cu ca bi tp bng cch gi hm
lm quen vi vic xy dng cc hm ring l.

Bi 72: (trang 21)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX 100

void rshiftkstep( int a[], int n, int k ) {


int i;
for ( i = 0; i < k; ++i ) {
int t = a[n - 1];
memmove( a + 1, a, ( n - 1 ) * sizeof( *a ) );
a[0] = t;
}
}

int maxOdd( int a[], int n ) {


int i, maxpos = -1;
/* Tm phn t c tr l u tin */
for ( i = 0; i < n; ++i )
if ( a[i] % 2 ) break;
if ( i < n ) {
maxpos = i;
for ( i = maxpos + 1; i < n; ++i )
if ( a[i] % 2 && a[i] > a[maxpos] ) maxpos = i;
}
return maxpos;
}
129
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

int main() {
int a[MAX];
int n, i, k;
srand( time( NULL ) );
do {
printf( "Nhap n [1, %d]: ", MAX - 1 );
scanf( "%d", &n );
} while ( n < 1 || n > MAX - 1 );
for ( i = 0; i < n; ++i )
printf( "%d ", a[i] = rand() % 201 - 100 );
putchar( '\n' );

if ( ( k = maxOdd( a, n ) ) >= 0 )
printf( "Phan tu le lon nhat a[%d] = %d", k, a[k] );
else printf( "Mang toan so chan" );

printf( "\nNhap so lan can dich: " );


scanf( "%d", &k );
k %= n;
rshiftkstep( a, n, k );
for ( i = 0; i < n; ++i )
printf( "%d ", a[i] );
putchar( '\n' );
return 0;
}
S thc hin mt bc dch phi mng ca hm rshiftkstep() c trnh by
trong hnh di, l hnh nh o ngc ca hm lshiftkstep() trong bi 71 (trang
128):
a[0]

memmove() t = a[n-1]
n-1 phn t

a[1]

a[0] = t
- Lu tm phn t a[n-1] vo bin t.
- n-1 phn t ca mng (k t a[0]) c sao chp dch phi mt phn t, chng ln
mng bt u t a[1], bng hm memmove().
- a[0] = t, ngha l bng a[n-1] va b y khi cui mng.
K thut tm mt phn t tha yu cu t mt dy phn t c trnh by trong
bi 66 (trang 121). Tuy nhin, trong bi tp ny cn ch :
- Tm phn t min, max ca mt mng bao gi cng c kt qu, nn t u ta c th
gi s v gn maxpos = 0 (ch s ca phn t u tin). Tuy nhin, khi tm phn t
c tr l ln nht, cha chc c kt qu; v d vi mng cha ton s chn hoc 0.
V vy trc ht cn tm phn t c tr l u tin ca mng ri mi tin hnh tm
phn t l c tr ln nht theo cch bit.
int maxOdd( int a[], int n ) {
int i, maxpos = -1;

130
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

for ( i = 0; i < n; ++i )


if ( a[i] % n ) break;
if ( i < n ) {
maxpos = i;
for ( i = maxpos + 1; i < n; ++i )
if ( a[i] % 2 && a[i] > a[maxpos] ) maxpos = i;
}
return maxpos;
}
Nu mng khng c tr l, sau vng lp th nht i s bng n, chng trnh khng vo
thn ca pht biu if v maxpos tr v s l tr khi to -1.
Ngc li, maxpos l v tr ca tr l u tin, ta tip tc tm v so snh cc tr l k
tip nu c k t v tr maxpos + 1.
Xy dng hm tm kim tr v ch s ca phn t tm c l ph hp vi t duy
theo ch s khi lp trnh bng C vi mng. u im cn ch khi khng tm thy
phn t tha yu cu, hm tr v -1, ng vi khng v tr no.

Bi 73: (trang 22)


#include <stdio.h>
#define MAX 100

int main() {
int a[MAX];
int n, i, j;

do {
printf( "Nhap n [1, %d]: ", MAX - 1 );
scanf( "%d", &n );
} while ( n < 1 || n > MAX - 1 );

printf( "Nhap %d phan tu:\n", n );


for ( i = 0; i < n; ++i )
scanf( "%d", a + i );

for ( i = 0; i < n; ++i ) {


for ( j = 0; j < i; ++j )
if ( a[j] == a[i] ) break;
if ( j == i ) printf( "%d ", a[i] );
}
putchar( '\n' );
return 0;
}
Bi tp ny dng mt k thut n gin pht hin v khng xut cc phn t c
tr trng lp, ngoi tr phn t u tin:
Xt phn t a[i], vng lp theo j bn trong s duyt tt c cc phn t nm trc v
tr i. C hai trng hp:
- Vng lp kim tra j ngt na chng do pht hin mt phn t trng vi a[i]. Khi
, j < i v c mt phn t c tr trng a[i] c xut trc y, ta khng xut
a[i] na.

131
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

- Vng lp kim tra j chy n cui (n i) m khng pht hin mt phn t no


trng vi a[i]. Khi , j = i v phn t a[i] cha xut hin ln no, c th xut
c.
Bi tp: Vit chng trnh thc hin nhng yu cu sau:
a. To mng mt chiu n phn t nguyn c gi tr nhp vo t bn phm. Gi
tr ca cc phn t thuc on [0, n - 1].
b. In ra cc phn t trong mng c tr phn bit.
Nhap n [1, 99]: 10
Nhap 10 phan tu:
1 2 2 3 4 3 1 5 5 4
1 2 3 4 5
Lu iu kin "gi tr ca cc phn t thuc on [0, n - 1]", a n gii thut:
- Phn phi tr x vo ng phn t c ch s x. Ngha l, nu tr x ti a[i] khng trng
vi ch s phn t mng (i) cha n, n s c hon chuyn vi s ti a[x] cho n
khi iu kin trn tha.
- Tr i c th khng c trong mng, nh vy khi hon chuyn n mt lc no , x
= a[i] s l mt tr trng lp, x = a[i] s trng x = a[x]. Ta trnh trng hp ny
bng cch ngt vng lp khi a[i] = a[a[i]].
- Sau khi thc hin phn phi, in cc tr phn bit khi tha iu kin a[i] bng i.
for ( i = 0; i < n; ++i )
while ( a[i] != i ) {
if ( a[i] == a[a[i]] ) break;
t = a[i]; a[i] = a[t]; a[t] = t;
}
for ( i = 0; i < n; ++i )
if ( a[i] == i ) printf( "%d ", a[i] );
Ta nhn thy, trng hp break cng l trng hp pht hin cc tr trng lp. Nu
yu cu l in ra cc tr b trng lp, in tr a[i] trc khi break.

Bi 74: (trang 22)


#include <stdio.h>
#define MAX 100

int main() {
int a[MAX];
int n, i, j, count;

do {
printf( "Nhap n [1, %d]: ", MAX - 1 );
scanf( "%d", &n );
} while ( n < 1 || n > MAX - 1 );
printf( "Nhap %d phan tu:\n", n );
for ( i = 0; i < n; ++i )
scanf( "%d", a + i );

for ( i = 0; i < n; ++i ) {


for ( count = j = 0; j < n; ++j )
if ( a[j] == a[i] )
if ( j < i ) break;
else count++;
if ( count ) printf( "%d[%d] ", a[i], count );
132
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}
putchar( '\n' );
return 0;
}
Cch gii thng gp l dng mt mng ph lu tn sut ca tng phn t.Vn
ch yu ca bi tp ny l ch m s ln xut hin ca mt phn t nu n xut
hin ln u tin trong mng. Nu nhn ra mt phn t xut hin trong mng, ta
phi b qua, khng m na. Cch pht hin mt phn t xut hin l m rng
ca bi tp 73 (trang 131):
Xt phn t a[i], vng lp theo j bn trong s duyt m tt c cc phn t trng
vi a[i] c trong mng a. Vng lp ny c c im:
- Khi to bin m count bng 0 trc khi duyt.
- Khi gp mt phn t trng vi a[i], vng lp kim tra: nu j < i th ngha l pht
hin c mt phn t c tr trng a[i] xut hin trc y, vng lp ngt ngay
v nh vy count vn bng 0. Ngc li vng lp vn m bnh thng.
Vi cch kim tra nh trn, ch c nhng phn t xut hin ln u tin c m,
count ca chng khc 0, v c xut ra.

Bi 75: (trang 22)


#include <stdio.h>
#define MAX 100

int main() {
int a[MAX];
int n, i, j, count, max, min, pos;

do {
printf( "Nhap n [1, %d]: ", MAX - 1 );
scanf( "%d", &n );
} while ( n < 1 || n > MAX - 1 );
printf( "Nhap %d phan tu:\n", n );
for ( i = 0; i < n; ++i )
scanf( "%d", a + i );

printf( "Phan tu xuat hien nhieu nhat: " );


pos = max = 0;
for ( i = 0; i < n; ++i ) {
for ( count = 1, j = i + 1; j < n; ++j )
if ( a[j] == a[i] ) count++;
if ( count > max ) { max = count; pos = i; }
}
printf( "%d[%d]\n", a[pos], max );

printf( "Phan tu xuat hien it nhat: " );


pos = 0; min = n;
for ( i = 0; i < n; ++i ) {
for ( count = j = 0; j < n; ++j )
if ( a[j] == a[i] )
if ( j < i ) break;
else count++;
if ( count && count < min ) { min = count; pos = i; }
}
printf( "%d[%d]\n", a[pos], min );
133
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


return 0;
}
Trong bi tp 74 (trang 132), khi tnh tn sut cc phn t, ta phi gii quyt vn
trnh tnh tn sut ca cc k t xut hin. Vi yu cu tm phn t c tn sut
ln nht, ta khng cn ch vn ny, v tn sut ca phn t xut hin vn nh
hn tn sut ca phn t ny khi c tnh ln u.
Ta khi to tr max bng 0, tnh tn sut cho mi v tr d phn t ti v tr xut
hin, ri so snh vi max tm tn sut ln nht.
Vi yu cu tm phn t c tn sut nh nht, ta khi to tr min bng kch thc ton
mng. Sau tm tn sut count ca tng phn t nh trong bi 74 (trang 132), ri
so snh vi min tm tn sut nh nht.
Ch khi gp phn t trng lp ta khng tnh tn sut, ngt vng lp nn count = 0,
v vy ng qun kim tra count khc 0 trc khi so snh count vi min.

Bi 76: (trang 22)


#include <stdio.h>
#define MAX 100

int main() {
int a[MAX], max, oldmax, pos;
int n, i, j, count;

do {
printf( "Nhap n [1, %d]: ", MAX - 1 );
scanf( "%d", &n );
} while ( n < 1 || n > MAX - 1 );

printf( "Nhap %d phan tu:\n", n );


for ( i = 0; i < n; ++i )
scanf( "%d", a + i );
printf( "Cac phan tu xuat hien nhieu nhat:\n" );
oldmax = 0;
pos = -1;
do {
max = 0;
for ( i = pos + 1; i < n; ++i ) {
for ( count = 1,j = i + 1; j < n; ++j )
if ( a[j] == a[i] ) count++;
if ( count > max ) { max = count; pos = i; }
}
if ( max >= oldmax ) {
printf( "%d[%d] ", a[pos], max );
oldmax = max;
}
} while ( max == oldmax );
putchar( '\n' );
return 0;
}
Trong bi tp 75 (trang 133) ta ch tm c phn t c tn sut ln nht u tin.
tm tt c cc phn t c cng tn sut ln nht ta phi:
- a vic tnh ton tn sut ln nht trn vo mt vng lp tm tip (vng lp do
while trn), vng lp ny c thit k hot ng vi s gip ca 2 bin:
134
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bin oldmax lu tn sut ln nht tm c ln trc, vi ln tm u tin oldmax


khi to bng 0.
Bin pos lu v tr ca phn t c tn sut ln nht tm c ln trc, vi ln tm
u tin pos khi to bng -1. Khi tip tc tm tn sut ln nht mi, ta s bt u
sau v tr pos ny.
- Vi mi tn sut max ln nht mi tm c ta so snh vi oldmax. D max khng
bao gi ln hn oldmax nhng vn phi dng iu kin so snh >= cho trng hp
u tin.
Nu tm c max mi c cng tn sut ln nht vi oldmax th xut ra; nu khng
vng lp tm tip s chm dt.

Bi 77: (trang 22)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX 100

double invSum( int a[], int n ) {


int i;
double sum = 0.0;
for ( i = 0; i < n; ++i )
if ( a[i] ) sum += 1.0/a[i];
return sum;
}

void rmLeftOdd( int a[], int* n ) {


int i;
for ( i = 0; i < *n - 2; ++i )
if ( ( a[i] % 2 ) ) {
memmove( a+i+1, a+i+2, ( *n-i-2 ) * sizeof( *a ) );
( *n )--;
}
if ( ( a[*n - 2] % 2 ) ) ( *n )--;
}

int main() {
int a[MAX];
int n, i;

srand( time( NULL ) );


do {
printf( "Nhap n [1, %d]: ", MAX - 1 );
scanf( "%d", &n );
} while ( n < 1 || n > MAX - 1 );

for ( i = 0; i < n; ++i )


printf( "%d ", a[i] = rand() % 201 - 100 );
printf( "\nTong nghich dao: %g\n", invSum( a, n ) );
rmLeftOdd( a, &n );
for ( i = 0; i < n; ++i )
printf( "%d ", a[i] );
putchar( '\n' );

135
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


return 0;
}
Khi thao tc trn mt mng bn cn ch n vn kim sot cc phn t bin.
Thut ton p dng vi cc phn t ca mng c th khng p dng ng vi cc
phn t ca bin mng. Bn phi kim tra gii quyt cc ngoi l ny.
Trong hm rmLeftOdd(), khi pht hin phn t a[i] l, ta chuyn on mng t
a[i+2] chng ln on mng t a[i+1]. Nhng nu a[n-2] l, ch cn mt phn t
sau a[n-2], khng th p dng vic chng mng m ch n gin gim n, khng ch
n phn t a[n-1], tng ng vi loi b n.
Truyn tham chiu bng con tr (gi tt l truyn bng con tr) l cch ca C dng
thay i tham s c truyn n hm. Xem v d di:
Truyn bng tham tr Truyn bng con tr
#include <stdio.h> #include <stdio.h>

void func( int x ) { void func( int *x ) {


x = x * 2; a c sao chp *x = *x * 2; "khai bo" con tr x
} n x: int x = a } ch n a:

COPY
COPY

s thay i ca x int* x = &a


int main() { int main() {
khng lin quan thay i *x ngha l
int a = 3; int a = 3;
n a "gin tip" thay i a
func( a ); func( &a );
/* a khng i a = 3 */ /* a thay i a = 6 */
printf( "%d\n", a ); printf( "%d\n", a );
return 0; return 0;
} }

- Hm func() bn tri khng th thay i bin a ca hm main() do khc tm vc


(scope). Truyn bng tham tr thc cht l sao chp bin a ca hm main() vo bin
cc b x ca hm func().
- Hm func() bn phi c truyn tham s bng con tr, thc cht l khai bo
mt con tr x ch n bin a ca hm main(). Thng qua con tr ny, hm func() c
th thay i gin tip bin a ca hm main(): khi , thay i *x ngha l ang
thay i gin tip bin a.
C++ gii quyt vn ny bng tham chiu, khi nim ny khng c trong C.
Truyn tham chiu bng con tr cn thng dng khi mun tr v nhiu hn mt tr,
v d hm swap() dng hon chuyn tr ca hai bin, hoc khi mun t ng thay i
mt tr no do hm m khng cn ch cp nht li.
Bn n li vic s dng cc ton t dng thao tc vi con tr:
- Ton t &: ton t ly a ch ca mt bin t vo con tr. Kt qu l con tr
s ch n bin .
- Ton t *: (dereference) ton t ly ni dung ca mt bin do con tr ch n. Dng
ton t ny c/ghi gin tip bin do con tr ch n.

Bi 78: (trang 23)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX 100

136
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

void sort( int a[], int n ) {


int i, j;
for ( i = 0; i < n - 1; ++i )
for ( j = i + 1; j < n; ++j )
if ( a[i] > a[j] )
{ int t = a[i]; a[i] = a[j]; a[j] = t; }
}

void insertOrder( int a[], int* n, int x ) {


int i = 0;
while ( i < *n && a[i] < x ) i++;
if ( i < *n )
memmove( a + i + 1, a + i, ( *n - i ) * sizeof( *a ) );
a[i] = x;
( *n )++;
}

int main() {
int a[MAX], x;
int n, i;

srand( time( NULL ) );


do {
printf( "Nhap n [1, %d]: ", MAX - 1 );
scanf( "%d", &n );
} while ( n < 1 || n > MAX - 1 );
for ( i = 0; i < n; ++i )
printf( "%d ", a[i] = rand() % 201 - 100 );

printf( "\nMang sap xep tang:\n" );


sort( a, n );
for ( i = 0; i < n; ++i )
printf( "%d ", a[i] );
printf( "\nNhap x: " );

scanf( "%d", &x );


insertOrder( a, &n, x );

for ( i = 0; i < n; ++i )


printf( "%d ", a[i] );
putchar( '\n' );
return 0;
}
Hm insertOrder() thc hin hai thao tc; do vn kim sot phn t bin, c hai
thao tc u phi ch n cc ngoi l:
- Tm n v tr cn chn: nu cc phn t ca mng u nh hn tr cn chn, vng
lp tm kim s vt qu cui mng, cn phi kim sot bng iu kin ph i < n.
- Dch chuyn mt phn mng chn: nu cc phn t ca mng u nh hn tr
cn chn, v tr cn chn l v tr mi cui mng, v vy khng cn phi dch chuyn
mng, ta cng kim sot trng hp ny bng iu kin ph i < n.
C th gii quyt vn trn bng cch to phn t ma (ghost node) thm vo cui
mng, phn t ny cha tr ln hn bt k phn t no khc ca mng. Khi hm
insertOder() c vit gn hn:
137
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

void insertOrder( int a[], int* n, int x ) {


int i = 0;
a[( *n )++] = 101;
while ( a[i] < x ) i++;
memmove( a + i + 1, a + i, ( *n - i ) * sizeof( *a ) );
a[i] = x;
}
Vi mng sp xp c s phn t ln, ngi ta thng dng gii thut tm kim
nh phn xc nh rt nhanh v tr chn:
void insertOrder( int a[], int* n, int x ) {
int left, right, mid;
a[( n )++] = 101; /* ghost node */
left = 0; /* bin tri */
last = *n; /* bin phi */
while ( left <= last ) {
mid = ( left + last ) / 2;
/* v tr ca x trong na u on cn tm iu chnh bin tri
ngc li, iu chnh bin phi */
if ( x < a[mid] ) last = mid - 1;
else left = mid + 1;
}
/* left by gi l v tr ng ca x */
memmove( a+left+1, a+left, ( *n - left )*sizeof( *a ) );
a[first] = x;
}

Bi 79: (trang 23)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>

int* myAlloc( int n ) {


return ( int* )calloc( n, sizeof( int ) );
}

void printArr( int *a, int n ) {


int i;
for ( i = 0; i < n; ++i )
printf( "%d ", a[i] );
putchar( '\n' );
}

int nearX( int *a, int n, int x ) {


int i, pos;
int min = 201;
for ( i = 0; i < n; ++i )
if ( abs( a[i] - x ) < min )
{ min = abs( a[i] - x ); pos = i; }
return pos;
}

int insertRNeg( int **a, int *n ) {

138
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


int i, c, *p;
for ( c = i = 0; i < *n; ++i )
c += ( (*a)[i] < 0 );
if ( c ) {
p = ( int* )realloc( *a, ( *n + c ) * sizeof( int ) );
if ( !p ) return 1;
*a = p;
int k = *n + c - 1;
for ( i = *n - 1; i >= 0; --i ) {
if ( (*a)[i] < 0 ) (*a)[k--] = 1;
(*a)[k--] = (*a)[i];
}
*n += c;
}
return 0;
}

int main() {
int n, i;
int *a, x;

srand( time( NULL ) );


do { printf( "Nhap n (n > 0): " );
scanf( "%d", &n );
} while ( n < 1 );

a = myAlloc( n );
if ( !a )
{ printf( "Loi cap phat\n" ); return 1; }

for ( i = 0; i < n; ++i )


printf( "%d ", a[i] = rand() % 201 - 100 );

printf( "\nNhap x: " );


scanf( "%d", &x );
printf( "So gan x nhat: %d\n", a[nearX( a, n, x )] );

if ( insertRNeg( &a, &n ) )


{ printf( "Loi cap phat\n" ); return 2; }
printArr( a, n );
free( a );
return 0;
}
Bi tp ny minh ha cc thao tc cn thc hin khi lm vic vi mng cp pht
ng, n li cc hm dng cp pht ng vng nh trn heap (stdlib.h):
- void *malloc( size_t size ): tr v con tr ch n byte u tin ca vng nh
c kch thc size c cp pht trn heap. Nu khng vng nh trn heap cho
yu cu cp pht, tr v con tr NULL.
- void *calloc( size_t num, size_t size ): tr v con tr ch n byte u tin
ca vng nh cp pht cho mt mng c num phn t, mi phn t c kch thc
size. Tt c cc bit ca vng nh cp pht c t bng 0. Nu khng vng nh
trn heap cho yu cu cp pht, tr v con tr NULL.
- void *realloc( void *ptr, size_t size ): thay i kch thc ca vng nh
c cp pht trc y (ch bi con tr ptr) thnh kch thc size (ln hn hoc
139
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

nh hn kch thc c). Mt con tr ch n vng nh cp pht c tr v do c s


sao chp ni dung vng nh c sang vng nh mi.
- void free( void *ptr ): gii phng vng nh cp pht trn heap ch bi con tr
ptr cho nhng nhu cu cp pht khc.
Hm insertRNeg() c hai tham s u thay i sau khi gi hm nn c truyn
bng con tr (xem bi 77, trang 135): con tr a qun l mng s c cp pht li v
s phn t n ca mng s thay i khi chn thm 1 vo mng.
Thao tc chn vo mng c th thc hin nh bi 78 (trang 136), bng hm memmove()
ca string.h:
for ( i = *n; i > 0; --i )
if ( (*a)[i - 1] < 0 ) {
memmove( *a+i+1, *a+i, (*n - i) * sizeof( int ) );
(*a)[i] = 1;
(*n)++;
}
tuy nhin, do bit trc s phn t mi ca mng (n + c, c l s cc s nguyn m
c trong mng), nn vic chn vo mng c thc hin d hiu nh sau:
/* k ch v tr cui mng mi */
k = n + c - 1;
for ( i = *n - 1; i >= 0; --i ) {
/* sao chp tng phn t t mng c (a) sang mng mi (vn l a) theo th
t t cui mng ra trc, nu gp phn t m th sao chp 1 trc khi sao
chp phn t */
if ( (*a)[i] < 0 ) (*a)[k--] = 1;
(*a)[k--] = (*a)[i];
}
*n += c; /* cp nht s phn t mi ca mng */
Cch vit (*a)[i] r rng d nhm ln hn cch vit theo a ch: (*a + i).

Bi 80: (trang 23)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

int subArrPos( int a[], int b[], int n, int m ) {


int i, j;
i = j = 0;
do {
if ( a[i] == b[j] ) { i++; j++; }
else { i = i - j + 1; j = 0; }
} while ( i <= n - m && j < m );
return ( j >= m ) ? i - m : -1;
}

int checkNegInt( int a[], int n ) {


int i;
for ( i = n - 1; i >= 0; --i )
if ( a[i] < 0 ) break;
return i;
}

140
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


int main() {
int a[MAX], b[MAX], i;
int n, m;
do {
printf( "Nhap n [1, %d]: ", MAX - 1 );
scanf( "%d", &n );
} while ( n < 1 || n > MAX - 1 );
printf( "Nhap %d phan tu mang A:\n", n );
for ( i = 0; i < n; ++i )
scanf( "%d", a + i );

do {
printf( "Nhap m [1, %d]: ", n );
scanf( "%d", &m );
} while ( m < 1 || m > n );
printf( "Nhap %d phan tu mang B:\n", m );
for ( i = 0; i < m; ++i )
scanf( "%d", b + i );

i = subArrPos( a, b, n, m );
if ( i != -1 ) printf( "B co trong A tai: A[%d]\n", i );
else printf( "B khong thay trong A\n" );

i = checkNegInt( a, n );
if ( i != -1 ) printf( "So nguyen am cuoi: %d\n", a[i] );
else printf( "Mang khong co so nguyen am\n" );
return 0;
}
Hm subArrPos() thc cht l tm mt run B trong mng A, xem bi 69 (trang 126).
Hm subArrPos() hot ng nh sau:
i = j = 0; /* i dng duyt a, j dng duyt b */
do {
/* nu a[i] bng b[j] th tng i v j ri kim tra tip */
if ( a[i] == b[j] ) { i++; j++; }
/* nu khng, j ch v u b, i ch n v tr bt u kim tra ln trc + 1 */
else { i = i - j + 1; j = 0; }
/*
c 2 trng hp kt thc:
+ on cn li trn a ngn hn m: n - i < m iu kin vng lp i <= n - m
+ kim tra 'run' b thnh cng: j >= m iu kin vng lp j < m
*/
} while ( i <= n - m && j < m );
/* nu thnh cng, tr v v tr bt u 'run' b trn a,
ngc li, tr v -1 (khng v tr no) */
return ( j >= m ) ? i - m : -1;
Ch cch tr v ca mt hm tm v tr trong mt mng. Nu khng tm thy v tr
theo yu cu, tr v -1, ch s khng th c trong mng.

Bi 81: (trang 24)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int* myAlloc( int n ) {


141
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


return ( int* ) calloc( n, sizeof( int ) );
}

int* initArr( int n ) {


int i;
int* a = myAlloc( n );
for ( i = 0; i < n; ++i )
printf( "%d ", a[i] = rand() % 201 - 100 );
putchar( '\n' );
return a;
}

void printArr( int *a, int n ) {


int i;
for ( i = 0; i < n; ++i )
printf( "%d ", a[i] );
putchar( '\n' );
}

int* sort( int *a, int n ) {


int i, j;
for ( i = 0; i < n - 1; ++i )
for ( j = i + 1; j < n; ++j )
if ( a[i] > a[j] )
{ int t = a[i]; a[i] = a[j]; a[j] = t; }
return a;
}

int* mergeArrDesc( int *a, int *b, int n, int m ) {


int i = n - 1;
int j = m - 1;
int* c = myAlloc( n + m );
if ( c ) {
int k = 0;
while ( i >= 0 && j >= 0 )
c[k++] = ( a[i] > b[j] ) ? a[i--] : b[j--];
while ( i >= 0 ) c[k++] = a[i--];
while ( j >= 0 ) c[k++] = b[j--];
}
return c;
}

int main() {
int *a, *b;
int n, m;

srand( time( NULL ) );


do {
printf( "Nhap so phan tu mang A va B (n, m > 0): " );
scanf( "%d%d", &n, &m );
} while ( n < 1 || m < 1 );

a = myAlloc( n );
b = myAlloc( m );
if ( !a || !b ) printf( "Loi cap phat\n" );
else {
142
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


a = initArr( n );
b = initArr( m );
printf( "Mang A sap tang: " ); printArr( sort( a, n ), n );
printf( "Mang B sap tang: " ); printArr( sort( b, m ), m );
printf( "Tron A va B thanh C sap giam:\n" );
int *c = mergeArrDesc( a, b, n, m );
if ( !c ) printf( "Loi cap phat\n" );
else { printArr( c, n + m ); free( c ); }
}
if ( a ) free( a );
if ( b ) free( b );
return 0;
}
Thao tc c yu cu, thng gi l trn (merge), thc hin bng hm
mergeArrDesc(). Hm ny tin hnh duyt cc mng a v b sp xp t cui n
u mng, ly cc phn t thch hp chuyn vo mng c. C hai giai on:
- So snh a[i] v b[j], phn t no ln hn s c a vo mng c. Thc hin cho
n khi chuyn ht phn t ca mt trong hai mng.
- Chuyn tt c cc phn t cn li ca mng kia vo mng c.
Nu yu cu trn mng a v b thnh mng c sp xp tng, c th tin hnh tng t
hoc dng phng php phn t ma (ghost node) b i giai on sau, xem thm
bi 78 (trang 23):
int* mergeArrAsc( int *a, int *b, int n, int m ) {
int i, j, k;
a[n] = b[m] = 101;
i = j = k = 0;
int* c = myAlloc( n + m );
if ( c ) {
while ( k <= n + m - 1 )
c[k++] = ( a[i] < b[j] ) ? a[i++] : b[j++];
}
return c;
}
Ch phi cp pht thm 1 phn t cho mng a v mng b, cho phn t ma ny.

Bi 82: (trang 24)


#include <stdio.h>
#define MAX 100

void output( int a[], int n, char* s ) {


int i;
printf( "%s: { ",s );
for ( i = 0; i < n; ++i )
printf( "%d%s", a[i], ( i == n - 1 ) ? " }\n" : ", " );
}

int isMember( int a[], int n, int x ) {


int i;
for ( i = 0; i < n; ++i )
if ( x == a[i] ) return 1;
return 0;
}

143
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


int main() {
int a[MAX], x;
int n, i;

printf( "Nhap khong qua 100 phan tu (Ctrl+Z de dung)\n" );


for ( n = i = 0; scanf( "%d", &x ) == 1 && i < MAX; ++i )
if ( !isMember( a, n, x ) ) a[n++] = x;
output( a, n, "Tap hop A" );
return 0;
}
Hm isMember() l trung tm ca bi tp ny, nhm xc nh xem mt s x c thuc
v tp hp (mng) a khng. Trn c s ca hm ny, bt k s mi nhp no cng
c kim tra xem tn ti cha. Nu cha, s mi nhp mi c a vo mng
v s phn t n ca mng mi c tng ln.
Ch cch kim tra nhp vi hm scanf(), xem bi 30 (trang 91).

Bi 83: (trang 24)


#include <stdio.h>
#define MAX 100

void output( int a[], int n, char* s ) {


int i;
printf( "%s: { ",s );
for ( i = 0; i < n; ++i )
printf( "%d%s", a[i], ( i == n-1 ) ? " }\n" : ", " );
}

int isMember( int a[], int n, int x ) {


int i;
for ( i = 0; i < n; ++i )
if ( x == a[i] ) return 1;
return 0;
}

int AandB( int a[], int n, int b[], int m, int c[] ) {
int i, j, k;
for ( k = i = 0; i < n; ++i )
for ( j = 0; j < m; ++j )
if ( b[j] == a[i] )
c[k++] = a[i];
return k;
}

int AorB( int a[], int n, int b[], int m, int c[] ) {
int i, j, k;
i = j = k = 0;
while ( i < n ) c[k++] = a[i++];
while ( j < m )
if ( !isMember( a, n, b[j] ) )
c[k++] = b[j++];
else j++;
return k;
}

144
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


int AdecB( int a[], int n, int b[], int m, int c[] ) {
int i, k;
for ( k = i = 0; i < n; ++i )
if ( !isMember( b, m, a[i] ) )
c[k++] = a[i];
return k;
}

int main() {
int a[] = { 1, 2, 3, 5 };
int b[] = { 1, 3, 6, 7 };
int c[MAX];
int n, m, k;

n = sizeof a / sizeof *a;


m = sizeof b / sizeof *b;

output( a, n, "Tap hop A" );


output( b, m, "Tap hop B" );

k = AandB( a, n, b, m, c );
output( c, k, "C = A * B" );

k = AorB( a, n, b, m, c );
output( c, k, "C = A + B" );

k = AdecB( a, n, b, m, c );
output( c, k, "C = A \\ B");
return 0;
}
Vi hm isMember() (xem bi 82, trang 143) cc php ton trn tp hp c thc
hin d dng:
- a b: hai vng lp lng nhau duyt tt c cc cp (a[i], b[j]), cp no tha iu
kin a[i] = b[j] s c a vo c.
- a b: u tin ton b cc phn t ca a c chuyn vo c. Tip theo, phn t
no ca b v khng l thnh vin ca a (tr i phn giao a b) c chuyn vo c.
- a \ b: phn t no ca a v khng l thnh vin ca b (tr i phn giao a b) s
c chuyn vo c.

Bi 84: (trang 24)


#include <stdio.h>
#include <string.h>
#define MAX 100

void insertOrder( int* a, int *n, int x ) {


int i = 0;
while ( i < *n && a[i] > x ) i++;
if ( i < *n )
memmove( a + i + 1, a + i, ( *n - i ) * sizeof( *a ) );
a[i] = x;
( *n )++;
}

int tableReadAndSort( int* a ) {


145
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


int n, x;
for ( n = 0; scanf( "%d", &x ) == 1 && n < MAX; )
insertOrder( a, &n, x );
return n;
}

int main() {
int a[MAX];
int n, i;

printf( "Nhap khong qua 100 phan tu (Ctrl+Z de dung)\n" );


n = tableReadAndSort( a );
for ( i = 0; i < n; ++i )
printf( "%d ", a[i] );
putchar( '\n' );
return 0;
}
Hm insertOrder() c gii thch trong bi 78 (trang 136), nhm chn mt phn
t vo mt mng sp xp m vn gi nguyn tnh cht sp xp ca mng. Sau khi
gi hm ny, s phn t ca mng c truyn nh tham s n hm s thay i. V
vy trong hm tableReadAndSort(), vng lp khng cn cp nht bin m n (biu
thc th ba ca vng lp for), do c cp nht bi hm insertOrder().

Bi 85: (trang 25)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

int main() {
int a[4][4];
int* b = &a[0][0];
int i, j, t, n = 4;

printf( "Mang goc:\n" );


srand( time( NULL ) );
for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", a[i][j] = rand() % 201 - 100 );

for ( i = 0; i < n * n - 1; ++i )


for ( j = i + 1; j < n * n; ++j )
if ( b[i] > b[j] )
{ t = b[i]; b[i] = b[j]; b[j] = t; }

printf( "Mang sau khi sap xep:\n" );


for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", a[i][j] );
return 0;
}

146
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Nu xem mng hai chiu nh mng a[0][0]


mt chiu tng t hnh di; v nu 1 2 3
cc phn t trong mng mt chiu 4 5 6
c sp xp tng dn th hnh nh
7 8 9
hai chiu ca chng s tha iu
kin bi tp trn: mi dng tng t 1 2 3 4 5 6 7 8 9
tri sang phi v mi ct tng ln t
trn xung bn. con tr b
V C xem mng hai chiu nh l
mng ca mng, ni cch khc trong C mng no cng l mng mt chiu. V vy,
mng hai chiu c cp pht trong vng nh thc cht l mt khi lin tc ging
mng mt chiu nh hnh di.
Nh vy:
- Nu qun l bng ch s (v d a[i][j]), ta lm vic vi mng a nh l mng
hai chiu kch thc n x n.
- Nu qun l bng con tr b ch n phn t u tin ca mng a (int *b =
&a[0][0]), ta lm vic vi mng a nh l mng mt chiu b kch thc n x n.
Thao tc trn mng mt chiu b ny rt bnh thng do kh nng gn ch s cho con
tr qun l mng ca C. Trn c s , bi tp trn c thc hin nh sau:
- Khi to mng: xem nh khi to mng hai chiu a.
- Sp xp tng: xem nh sp xp mng mt chiu b.
- Xut mng: xem nh xut mng hai chiu a.
Ch phi khi to trc: int* b = &a[0][0];
hoc bo m kiu d liu: int* b = (int*)a;
Bi tp trn cho chnh xc kch thc ca mng hai chiu. Trong trng hp cha
bit kch thc mng, ta phi khai bo mng tnh ln hn nn hnh nh mt chiu
ca chng trong vng nh s sai lch (xem hnh di).
MAX phn t

a[i][0]
memmove()
MAX phn t

n phn t

b[i*n]

n phn t
Khi , cch lp trnh s khc. Ta c nhu cu sao chp mng hai chiu thnh mng
mt chiu tin x l. Thao tc sao chp nh sau, xem hnh trn hiu r trnh t
sao chp:
#define MAX 20
/* ... */
int a[MAX][MAX], b[MAX * MAX];
int n, i, j;
/* ... */
/* sao chp sang mng 1 chiu */
147
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


for ( i = 0; i < n; ++i )
memmove( &b[i * n], &a[i][0], n * sizeof( **a ) );

/* sao chp tr li mng 2 chiu */


for ( i = 0; i < n; ++i )
memmove( &a[i][0], &b[i * n], n * sizeof( **a ) );
Tuy nhin, vn c cch thc hin bi tp m khng cn khai bo thm mng mt
chiu ph.
Xt tng qut vi mng hai chiu kch thc n x m:
- Hnh di m t nh x gia mt phn t ca mng hai chiu vi phn t tng
ng trong mng mt chiu, nu chuyn mng hai chiu thnh mt chiu:
k=i*m+j Mng 2 chiu Mng 1 chiu:
i Suy ra: b[i * m + j]
i=k/m Mng 1 chiu Mng 2 chiu:
n j=k%m a[k / m][k % m]
j b[k]
a[i][j]

m n*m
- Gi s mng hai chiu a c chuyn thnh mng mt chiu b, ta sp xp mng
b tng dn bng sp xp kiu chn:
int k, l;
for ( k = 0; k < n * m - 1; ++k )
for ( l = k + 1; l < n * m; ++l )
if ( b[k] > b[l] ) {
int t = b[k];
b[k] = b[l];
b[l] = t;
}
- Thay th b[k] v b[l] bng phn t tng ng trong mng hai chiu, xem cng
thc nh x trong hnh trn:
int k, l;
for ( k = 0; k < n * m - 1; ++k )
for ( l = k + 1; l < n * m; ++l )
if ( a[k / m][k % m] > a[l / m][l % m] ) {
int t = a[k / m][k % m];
a[k / m][k % m] = a[l / m][l % m];
a[l / m][l % m] = t;
}
Khi ma trn c sp xp nh trn, vic tm kim mt tr trong ma trn c th c
tin hnh theo cch tm kim nh phn.

Bi 86: (trang 25)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 20
#define swap( a, b ) { int t = a; a = b; b = t; }

int main() {
int a[MAX][MAX], b[MAX];
148
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


int n, i, j, k;

printf( "Nhap n (n < 20): " );


scanf( "%d", &n );

srand( time( NULL ) );


for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", a[i][j] = rand() % 201 - 100 );

/* lu tng tr cc ct vo mng b */
for ( i = 0; i < n; ++i ) {
int t;
for ( t = j = 0; j < n; ++j )
t += a[i][j];
b[i] = t;
}

/* sp xp mng b, ko theo sp xp cc ct mng a */


for ( i = 0; i < n - 1; ++i )
for ( j = i + 1; j < n; ++j )
if ( b[i] > b[j] ) {
/* hon chuyn b[i] vi b[j] */
swap( b[i], b[j] );
/* hon chuyn ct a[][i] vi ct a[][j] */
for ( k = 0; k < n; ++k )
swap( a[k][i], a[k][j] );
}

printf( "Mang sau khi sap xep:\n" );


for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", a[i][j] );
return 0;
}
Trc ht ta lu tng tr cc ct ca mng hai chiu a (kch thc n x n) vo mng
mt chiu b (kch thc n).
Sau ta sp xp tng cc phn t trong b: khi hon chuyn hai phn t b[i] (cha
tng tr ct a[][i]) v b[j] (cha tng tr ct a[][j]) trong b, ta cng ng thi hon
chuyn hai ct a[][i] v a[][j] tng ng trong a.

Bi 87: (trang 25)


#include <stdio.h>
#define MAX 20

int triMatrix( int a[][MAX], int n ) {


int i, j;
for ( i = 0; i < n; ++i )
for ( j = 0; j < i; ++j )
if ( a[i][j] ) return 0;
return 1;
}

int main() {

149
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


int a[MAX][MAX], s;
int n, i, j;

printf( "Nhap bac ma tran: " );


scanf( "%d", &n );
for ( i = 0; i < n; ++i )
for ( j = 0; j < n; ++j ) {
printf( "a[%d][%d] = ", i, j );
scanf( "%d", &a[i][j] );
}

for ( i = 0; i < n; ++i, putchar( '\n' ) )


for ( j = 0; j <n; ++j )
printf( "%5d", a[i][j] );

for ( s = i = 0; i < n; ++i ) s += a[i][i];


printf( "Trace = %d\n", s );

if ( triMatrix( a, n ) ) {
for ( s = 1, i = 0; i < n; ++i ) s *= a[i][i];
printf( "det(A) = %d\n", s );
}
else printf( "A khong la ma tran tam giac tren\n" );
return 0;
}
Hnh bn l m t ton hc ca ma trn
vung cn thao tc. Vi i l bin m ca 0 j
dng v j l bin m ca ct, cc phn
t nm trn ng cho chnh tha iu
kin j = i v cc phn t nm trn ng
cho ph tha iu kin j = n - i - 1.
Tam gic di ca ma trn l min tha cho ph j<i
iu kin j < i. j=n-i-1 cho chnh
j=i
Nh vy, cc yu cu ca bi tp c th
d dng thc hin: i
- Kim tra ma trn tam gic di: ta kim
tra cc phn t thuc min j < i xem c phn t no khc 0, nu c th khng phi
l ma trn tam gic di.
- Tnh trace v det: c tnh da trn cc phn t thuc ng cho chnh. C th
duyt cc phn t ny bng iu kin j = i:
for ( s = i = 0; i < n; ++i )
for ( j = 0; j < n; ++j )
if ( j == i ) s += a[i][j];
Do j = i v j cng min xc nh vi i (min [0, n)), nn ch cn mt vng lp:
for ( s = i = 0; i < n; ++i ) s += a[i][i];

Bi 88: (trang 26)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 20

150
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

int isIdentity( int a[][MAX], int n ) {


int i, j;
for ( i = 0; i < n; ++i )
for ( j = 0; j < n; ++j ) {
if ( i != j && a[i][j] != 0 ) return 0;
if ( i == j && a[i][j] != 1 ) return 0;
}
return 1;
}

int main() {
int a[MAX][MAX];
int n, i, j;

printf( "Nhap bac ma tran: " );


scanf( "%d", &n );

srand( time( NULL ) );


for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", a[i][j] = rand() % 201 - 100 );

if ( isIdentity( a, n ) ) printf( "Ma tran dong nhat\n" );


else {
printf( "Ma tran tren khong dong nhat\n");
for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", i == j );
}
return 0;
}

Bi 89: (trang 26)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 20
#define swap( a, b ) { int t = a; a = b; b = t; }

int main() {
int a[MAX][MAX];
int n, i, j;

printf( "Nhap bac ma tran: " );


scanf( "%d", &n );

srand( time( NULL ) );


for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", a[i][j] = rand() % 201 - 100 );

for ( i = 0; i < n; ++i ) {


int maxpos = 0;
for ( j = 1; j < n; ++j )

151
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


if ( a[i][j] > a[i][maxpos] ) maxpos = j;
swap( a[i][i], a[i][maxpos] );
}

printf( "Ma tran sau khi sap xep:\n" );


for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", a[i][j] );
return 0;
}
Thao tc hon chuyn phn t c tr ln nht trong mt dng vi phn t nm trn
ng cho chnh thuc dng c thc hin n gin nh sau:
- Trn dng i, tm v tr phn t c tr ln nht, xem gii thut bi 67 (trang 122).
Gi s l phn t a[i][maxpos].
- Hon chuyn phn t a[i][maxpos] vi phn t a[i][i] (phn t ny nm trn
ng cho chnh v thuc dng i).
Trong trng hp gi hm, bn nn tham kho cch gii sau, th hin r tnh linh
hot ca C khi xem mng hai chiu nh l mng ca mng, tc mng mt chiu:
/* Hm swapMax tm phn t c tr ln nht trong mng
mt chiu b v hon chuyn vi phn t b[p] */
void swapMax( int b[], int n, int p ) {
int i, maxpos = 0;
for ( i = 1; i < n; ++i )
if ( b[i] > b[maxpos] ) maxpos = i;
swap( b[p], b[maxpos] );
}

/* xem mi dng nh mt mng mt chiu tn (a[i]), hon chuyn


phn t c tr ln nht trong mng (a[i]) vi phn t (a[i])[i] */
for ( i = 0; i < n; ++i )
swapMax( a[i], n, i );

Bi 90: (trang 26)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 20

int main() {
int a[MAX][MAX], k;
int n, i, j;

printf( "Nhap bac ma tran: " );


scanf( "%d", &n );

srand( time( NULL ) );


for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", a[i][j] = rand() % 201 - 100 );

printf( "Cac duong cheo song song cheo phu:\n" );


for ( k = -n + 1; k < n; ++k, putchar( '\n' ) )
for ( i = 0; i < n; ++i )

152
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


for ( j = 0; j < n; ++j )
if ( j == n - i - 1 + k )
printf( "%5d", a[i][j] );
return 0;
}
M t ton hc ca bi tp ny c trnh by trong hnh di: cc ng cho song
song ng cho ph phi thuc h cc ng thng c phng trnh tham s: j =
n - i - 1 + k vi tham s k [-n + 1, n), trong k = 0 chnh l ng cho
ph. Cc phn t a[i][j] nm trn cc ng cho ny d nhin phi tha iu kin
i, j [0, n).

0 n-1
j

n-1
h cc ng thng song
song ng cho ph
j=n-i-1+k
k=0 i k [- n + 1, n)

Nh vy, vi mi k thuc min xc nh ta tch ly cc phn t a[i][j] tha cc


iu kin trn (j = n - i - 1 + k v i, j [0, n)) th cc phn t ny s nm
trn mt ng cho song song vi ng cho ph, tng ng vi k .

Bi 91: (trang 27)


#include <stdio.h>
#include <stdlib.h>
#define _W 12
#define _H 8
#define _X 4
#define _Y 3

int p[4][6] = { { 0,1,0,1,0,0 },


{ 1,0,0,0,1,0 },
{ 1,0,0,0,1,0 },
{ 0,1,0,1,0,0 } };

int main() {
int i, j;

for ( i = 0; i < _H; ++i, putchar( '\n' ) )


for ( j = 0; j < _W; ++j )
printf( "%c", p[(i + _Y) % 4][(j + _X) % 6] ? '*' : ' ' );
return 0;
}
Khai bo khi to ma trn hai chiu nh trn l tng minh, gip hnh dung c
mng hai chiu. V C xem mi mng l mng mt chiu nn c th khai bo nh sau,
p dng c vi mng c s chiu nhiu hn 2:
int p[4][6] = { { 0,1,0,1,0,0 },
153
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


{ 1,0,0,0,1,0 },
{ 1,0,0,0,1,0 },
{ 0,1,0,1,0,0 } };
Hnh trang sau m t trc quan yu cu ca bi tp, ta c cc nhn xt sau:
- Vi ma trn A, tp ch s i nh x vo on [0, 4) (s dng ca ma trn p) v tp
ch s j nh x vo on [0, 6) (s ct ca ma trn p).
Ni cch khc, phn t A[i][j] ca ma trn A nh x vi phn t p[i % 4][j % 6]
ca ma trn n v p. Nu p[i % 4][j % 6] cha tr 1 th ti A[i][j] v k t *,
ngc li ti A[i][j] v k t space.
- Ma trn B thc cht l php dch chuyn tnh tin ca ma trn A, vi dch chuyn
hai chiu l (_Y, _X). Ngha l: phn t B[i][j] ca ma trn B tng ng vi phn
t A[i + _Y][j + _X] ca ma trn A; v nh vy s nh x vi phn t p[(i + _Y) %
4][(j + _X) % 6] ca ma trn n v p.
A[i][j]
B[i][j] tng ng
nh x
A[i+_Y][j+_X], v nh x
p[i%4][j%6]
p[(i+_Y)%4][(j+_X)%6]
6
010100 010100 ma trn A
4
100010 100010 _Y
100010 100010
010100 010100
010100 010100
100010
ma trn 100010
n v100010
p 100010 _H
010100 010100
_X
ma trn B

_W

Bi 92: (trang 27)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 20

int main() {
int a[MAX][MAX], k, s, maxsum;
int n, i, j, maxpos;

printf( "Nhap bac ma tran: " );


scanf( "%d", &n );

srand( time( NULL ) );


for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", a[i][j] = rand() % 201 - 100 );

maxsum = -101;
for ( k = -n + 1; k < n; ++k ) {
for ( s = i = 0; i < n; ++i )
for ( j = 0; j < n; ++j )
154
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


if ( j == i + k ) s += a[i][j];
if ( s > maxsum ) { maxsum = s; maxpos = k; }
}

printf( "Duong cheo co tong lon nhat:\n" );


for ( i = 0; i < n; ++i )
for ( j = 0; j < n; ++j )
if ( j == i + maxpos ) printf( "%d ", a[i][j] );
printf( ": %d\n", maxsum );
return 0;
}
y l bi tp m rng ca bi tp 90 (trang 152). Trong , ta lm vic vi h cc
ng thng song song vi ng cho chnh, c phng trnh tham s l:
j = i + k.
Bi tp yu cu xc nh tham s k ng vi ng cho c tng tr cc phn t ln
nht. Sau khi xc nh tham s k ny (lu trong maxpos) ta d dng xut cc phn t
trn ng cho tng ng.
Ch cch chng ta khi to tr maxsum (-101), v c ng cho u tin ch c mt
phn t v phn t ny c tr ln hn -101 nn tr maxsum chc chn s c t li
sau khi tnh tng ng cho u tin ny.

Bi 93: (trang 27)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 3

typedef struct {
int array[MAX][MAX];
} array_inside;

array_inside mulMatrix( int a[][MAX], int b[][MAX] ) {


array_inside temp = { { { 0 } } };
int i, j, k;
for ( i = 0; i < MAX; ++i )
for ( j = 0; j < MAX; ++j )
for ( k = 0; k < MAX; ++k )
temp.array[i][j] += a[i][k] * b[k][j];
return temp;
}

int main() {
int a[MAX][MAX];
array_inside c;
int i, j, k;

srand( time( NULL ) );


for ( i = 0; i < MAX; ++i, putchar( '\n' ) )
for ( j = 0; j < MAX; ++j )
printf( "%5d", a[i][j] = c.array[i][j] = rand() % 10 );
do {
printf( "Nhap luy thua (k > 1): " );
scanf( "%d", &k );
} while ( k < 2 );
155
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

for ( i = 2; i <= k; ++i )


c = mulMatrix( a, c.array );

for ( i = 0; i < MAX; ++i, putchar( '\n' ) )


for ( j = 0; j < MAX; ++j )
printf( "%5d", c.array[i][j] );
return 0;
}
Nhc li, cc ch khi khai bo mng:
- S cc tr c khi to phi bng ng vi s phn t khai bo trong mng:
int a[5] = { 1, 2, 3, 4, 5 };
int b[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
S cc tr c khi to nu t hn s phn t khai bo ca mng, th cc phn t
cn li ca mng s c khi to bng 0:
int a[5] = { 1, 2 }; /* a[2] n a[4] cha tr 0 */
/* b l ma trn tam gic di */
int b[3][3] = { { 1 }, { 4, 5 }, { 7, 8, 9 } };
- Nu kch thc ca mng khng c khai bo, th s phn t khi to s xc nh
kch thc ca mng.
int a[] = { 1, 2, 3, 4, 5 };
int b[][3] = { { 1 }, { 4 , 5 }, { 7, 8, 9 } };
Nh vy:
- Khai bo mng a v khi to tt c cc phn t vi tr 0:
int a[MAX] = { 0 };
- Khai bo mng 2 chiu b v khi to tt c cc phn t vi tr 0:
int b[MAX][MAX] = { { 0 } };
Khi thc hin php nhn ma trn trong hm mulMatrix(), cn khi to trc ma trn
tm t sao cho tt c cc phn t u c tr 0, ta khai bo nh trn.
Mc d khi khai bo static th cc phn t ca mng cng c khi to bng 0,
nhng khng c khai bo static vi ma trn tm t trong hm mulMatrix(), v nu
hm ny c gi nhiu ln ma trn tm t vn lu gi kt qu tnh ca ln trc.
Bn cng nn ch n cch thit k hm mulMatrix():
- Cch thng thng, matrix result l tham s xut, nhn kt qu nhn hai matrix a
v b. Cc tham s thng b tr ging nh ton t gn, kt qu c gn sang tri.
void mulMatrix(result[][MAX], a[][MAX], b[][MAX]);
- Tr v con tr, bn phi thc hin cp pht ng trong hm mulMatrix() v gii
phng con tr bn ngoi.
- Hm mulMatrix() khng th tr v mng hai chiu nhng c th tr v mt structure
bao bc (wrapper) mng hai chiu . Cch ny c thc hin trn.
Ma trn ly tha thng dng tnh nhanh s Fibonacci:
n
1 1 Fi(n 1) Fi(n)

1 0 Fi(n) Fi(n 1)
int main() {
int a[2][2] = { 1, 1, 1, 0 };
array_inside c = { { 1, 1, 1, 0 } };
int i, n;

printf( "Nhap n (0 < n < 40): " );


scanf( "%d", &n );

156
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

printf( "Fibonacci( 1 ) = %d\n", c.array[0][1] );


for ( i = 2; i <= n; ++i ) {
c = mulMatrix( a, c.array );
printf( "Fibonacci( %d ) = %d\n", i, c.array[0][1] );
}
return 0;
}

Bi 94: (trang 28)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define MAX 20

void maxAbs( int a[][MAX], int n, int *maxr, int *maxc ) {


int i, j;
*maxr = *maxc = 0;
for ( i = 0; i < n; ++i )
for ( j = 0; j < n; ++j )
if ( abs( a[i][j] ) > abs( a[*maxr][*maxc] ) )
{ *maxr = i; *maxc = j; }
}

int main() {
int a[MAX][MAX], b[MAX][MAX];
int n, i, j, maxr, maxc;

printf( "Nhap bac ma tran (n > 1): " );


scanf( "%d", &n );

srand( time( NULL ) );


for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", a[i][j] = rand() % 201 - 100 );

maxAbs( a, n, &maxr, &maxc );


for ( i = 0; i < n; ++i )
for ( j = 0; j < n; ++j )
b[i - ( i > maxr )][j - ( j > maxc )] = a[i][j];

printf( "Ma tran B:\n" );


for ( i = 0; i < n - 1; ++i, putchar( '\n' ) )
for ( j = 0; j < n - 1; ++j )
printf( "%5d", b[i][j] );
return 0;
}
Nhc li, C h tr mt tp y cc ton t so snh. Mi php so snh cho kt qu
thnh cng hay tht bi. Kt qu nh tr biu thc so snh bng 1 nu so snh thnh
cng, v bng 0 nu so snh tht bi. V mt nguyn tc, mt tr khc 0 cng c th
c dng ch php so snh thnh cng. Tuy nhin C ch dng 1 ch so snh
thnh cng.
Bi tp: So snh hai phn s a/b v c/d vi a, b, c, d c nhp t bn phm.
157
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Nhap a b c d: 1 2 1 3
1/2 > 1/3

#include <stdio.h>

int comp( int a, int b ) {


return ( a > b ) - ( a < b );
}

int main() {
char op[] = { '<', '=', '>' };
int a, b, c, d, z;

printf( "Nhap a b c d: " );


scanf( "%d%d%d%d", &a, &b, &c, &d );
printf( "%d/%d %c %d/%d\n", a, b, op[comp( a * d, c * b ) + 1], c, d );
return 0;
}
Hm compare() so snh a v b, tr v -1, 0 hoc 1 nu a nh hn b, bng b hoc ln
hn b. Sau khi quy ng mu s, vic so snh hai phn s a/b v c/d chnh l so snh
hai t s a * d v c * b.
Mt cch khc:
int comp( int a, int b ) {
return ( a < b ) ? -1 : ( a > b );
}
Hnh di trnh by cch loi b dng maxr v ct maxc ca ma trn a khi sao chp
n sang ma trn b khc.
maxc
dn ct

khng
thay i

maxr

dn c
dn dng dng ln ct

Cu trc iu kin nh sau:


if ( i > maxr ) b[i - 1][j] = a[i][j]; /* dn dng */
else if ( j > maxc ) b[i][j - 1] = a[i][j]; /* dn ct */
else /* dn c dng ln ct */
if ( ( i > maxr ) && ( j > maxc ) b[i - 1][j - 1] = a[i][j]
else b[i][j] = a[i][j]; /* khng thay i */
T kin thc v th hin ng Sai ca C khi nh tr biu thc so snh, biu thc
phc tp trn c vit gn li nh sau:
b[i - (i > maxr)][j - (j > maxc)] = a[i][j];
Xa b dng r v ct c ca ma trn a cng c th thc hin theo cch trn:
for ( i = 0; i < n; ++i )
for ( j = 0; j < n; ++j )
a[i - (i > r)][j - (j > c)] = a[i][j];
Xem thm bi 64 (trang 119).
158
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Hm maxAbs() dng xc nh v tr ca phn t c tr tuyt i ln nht. V hm ny


tr v n 2 tr (dng v ct), nn hai tr ny c tr v di dng tham s xut v
truyn bng con tr.

Bi 95: (trang 28)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 20

int main() {
int a[MAX][MAX], b[MAX][MAX];
int n, i, j, k;

printf( "Nhap bac ma tran: " );


scanf( "%d", &n );

srand( time( NULL ) );


for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", a[i][j] = rand() % 201 - 100 );
do {
printf( "Nhap k: " );
scanf( "%d", &k );
} while ( k >= n );

for ( i = 0; i < n; ++i, putchar( '\n' ) )


for ( j = 0; j < n; j++ )
printf( "%5d", b[i][j] = ( i == k || j == k ) ? a[j][i] : a[i][j] );
return 0;
}
Bi tp ny ch n gin chuyn v (transpose) dng k vi ct k ca ma trn vung
vi cng thc chuyn v quen thuc b[i][j] = a[j][i], ngha l dng k t a thnh
ct k ca b v ct k t a thnh dng k ca b.
Ch khi bn mun chuyn v trn cng mt ma trn vung a:
#define swap(a, b) { int t = a; a = b; b = t; }
/* ... */
for ( i = 0; i < n; ++i )
for ( j = 0; j < n; j++ )
if ( i == k ) swap( a[i][j], a[j][i] );
nu thm iu kin ( i == k || j == k ) nh trn th cc v tr chuyn v hon chuyn
lp li lm cho mng tr v ban u, ma trn a s khng thay i nh mong mun.

Bi 96: (trang 28)


#include <stdio.h>
#include <math.h>
#define MAX 20

int main() {
double a[MAX][MAX];
int n, i, j, k;

159
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


printf( "Nhap bac ma tran: " );
scanf( "%d", &n );

for ( i = 0; i < n; ++i, putchar( '\n' ) )


for ( j = 0; j < n; ++j )
printf( "%10lf", a[i][j] = sin( i - 2 * j / M_PI ) );
for ( k = i = 0; i < n; ++i )
for ( j = 0; j < n; ++j )
if ( a[i][j] >= 0 ) k++;
printf( "Co %d phan tu khong am\n", k );
return 0;
}

Bi 97: (trang 29)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 20

int minPos( int a[][MAX], int i, int j ) {


int k;
for ( k = j - 1; k <= j + 1; ++k )
if ( ( a[i - 1][k] <= a[i][j] ) ||
( a[i + 1][k] <= a[i][j] ) ||
( a[i][j - 1] <= a[i][j] ) ||
( a[i][j + 1] <= a[i][j] ) ) return 0;
return 1;
}

int main() {
int a[MAX][MAX];
int n, m, i, j;

printf( "Nhap n, m: " );


scanf( "%d%d", &n, &m );

srand( time( NULL ) );


for ( i = 1; i <= n; ++i, putchar( '\n' ) )
for ( j = 1; j <= m; ++j )
printf( "%5d", a[i][j] = rand() % 201 - 100 );
/* to bin gi cho ma trn */
for ( j = 0; j <= m + 1; ++j )
a[0][j] = a[n + 1][j] = 101;
for ( i = 1; i <= n; ++i )
a[i][0] = a[i][m + 1] = 101;

printf( "Ma tran cuc tieu:\n" );


for ( i = 1; i <= n; ++i, putchar( '\n' ) )
for ( j = 1; j <= m; ++j )
printf( "%5d", minPos( a, i, j ) );
return 0;
}
Khng kh xt cc tiu mt phn t trong ma trn. Tuy nhin, vn y l c
kh nhiu trng hp cn kim tra khi xt cc tiu cho mt phn t:

160
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

- Nu phn t nm gc ma trn: c 3 ln cn cn kim tra.


- Nu phn t nm bin ma trn: c 5 ln cn cn kim tra.
- Nu phn t nm gia ma trn: c 8 ln cn cn kim tra.
Cc ln cn ca phn t nm gc v bin ma trn li khc
nhau ty theo gc hoc bin. Tng cng 9 trng hp cn xt. 101 101 101
n gin ha qu trnh xt cc tiu, ta to mt bin gi cho 101
ma trn. Hnh bn minh ha vic xt cc tiu mt phn t nm
gc ma trn vi s tham gia ca bin gi. 101
Nh vy:
- Cc phn t xt cc tiu u l phn t nm gia ma trn
v ch c mt trng hp: c 8 ln cn cn kim tra.
- Do cc phn t ca bin gi cha tr (101) ln hn tt c cc phn t nn vic so
snh chng vi phn t xt cc tiu lun ng, khng nh hng kt qu kim tra.
Kh nng xut hin mt phn t cc tiu l thp, nn hm minPos() ch yu kim tra
mt phn t khng phi l cc tiu trong vng lp. Biu thc iu kin c dng
l ph nh ca biu thc iu kin bo m mt phn t l cc tiu, c suy ra t
nh l De Morgan.
Tr tr v ca hm minPos() c chuyn trc tip thnh phn t ca ma trn cc
tiu nh phn.

Bi 98: (trang 29)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 20

int main() {
int A[MAX][MAX], C[MAX][MAX];
int n, m, i, j ;

printf( "Nhap n, m: " );


scanf( "%d%d", &n, &m );

srand( time( NULL ) );


for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < m; ++j )
printf( "%5d", A[i][j] = rand() % 201 - 100 );

printf( "Ma tran sau khi quay:\n" );


for ( i = 0; i < m; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", C[i][j] = A[n - 1 - j][i] );
return 0;
}
Thng thng bn tnh nhm xem v tr C[i][j] trong ma trn mi l kt qu chuyn
i ca v tr A[i][j] no ca ma trn c, thit lp cng thc chuyn i v tr.
Sau tin hnh hai vng lp lng duyt tt c cc phn t, dng cng thc ny,
chuyn tt c cc v tr t ma trn c sang ma trn mi.

161
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Cn phi c t duy ton hc ngay c trong trng hp bn c th tnh nhm c,


bi v cng thc m bn tnh nhm l kt qu ca vic th sai, ca vic quy np cha
y nn khng chc l chnh xc. Quan st hnh di y:
j j j

Quay

A
A
-900
0 i i i
0
j 0 0 0 j

A A

A
Tnh tin
n-1
i ma trn A ma trn B ma trn C i
Phn trong khung l ma trn ta chuyn thnh h ta ton hc d tnh ton,
ta nhn thy lc ny trc x l i v trc y l j. Phn trong khung cng m t cc bc
ta quay v tnh tin ma trn p ng yu cu bi ton (ch A d nhn thy ma
trn quay).
Ma trn B l kt qu php quay ma trn A mt gc -900 (theo chiu kim ng h du
-, ngc chiu kim ng h du +), vi tm quay l gc ta :
xB cos sin xA
90o
yB
sin cos yA
xB xA cos yA sin xB yA

yB xA sin yA cos yB xA
Ma trn C l kt qu php tnh tin ma trn B mt on dch chuyn (n - 1) theo
chiu tng trc y:
xC xB

yC yB (n 1)
xC xB xC yA xC yA xA n 1 yC

yC yB (n 1) yC xA (n 1) yC n 1 xA yA xC
Ngha l gi tr ti ta (xC, yC) ca ma trn C l gi tr ly t ta (xA = n - 1
- yC, yA = xC) ca ma trn A:
C( xC, yC ) = A( n - 1 - yC, xC )
T ch trn: trc x l i v trc y l j: C[i][j] = A[n - 1 - j][i]
y chnh l cng thc cn tm.
Bn c th t hi: ngi ta tnh nhm nh th no c cng thc trn? Trc
ht ta ly mu v to kt qu ch bng tay:
1 2 3 7 4 1
A = 4 5 6 C = 8 5 2
7 8 9 9 6 3
D nhn thy rng hng chuyn thnh ct v ct chuyn thnh hng, ta ngh
ngay n cng thc B[i][j] = A[j][i]
Nhng y l cng thc quen thuc ca ma trn chuyn v, kt qu khi chuyn v
nh sau:
1 4 7
B = 2 5 8
3 6 9
So vi kt qu ch, ta thy C ch khc B th t cc ct: ct ca C ngc li so vi
ct ca B, ngha l ct (j) ca C l ct (n - 1 - j) ca B:
162
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


C[i][j] = B[i][n - 1 - j] = A[n - 1 - j][i]
Bn chc nhn thy ngay cch ny nhanh nhng khng c c s vng chc v khng
phi trng hp no cng tnh nhm c.

Bi 99: (trang 29)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int** myAlloc( int n, int f ) {


int i, j;
int** t = ( int** )calloc( n, sizeof( int* ) );
if ( !t ) return t;
for ( i = 0; i < n; ++i ) {
t[i] = ( int* ) calloc( n, sizeof( int ) );
if ( f )
for ( j = 0; j < n; ++j )
t[i][j] = rand() % 21 - 10;
}
return t;
}

void printMatrix( int** a, int n, char* s ) {


int i, j;
printf( "%s:\n", s );
for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", a[i][j] );
}

int** mulMatrix( int** a, int** b, int n ) {


int** t;
int i, j, k;
if( ( t = myAlloc( n, 0 ) ) == NULL ) return t;
for ( i = 0; i < n; ++i )
for ( j = 0; j < n; ++j )
for ( k = 0; k < n; ++k )
t[i][j] += a[i][k] * b[k][j];
return t;
}

int** addMatrix( int** a, int** b, int n ) {


int** t;
int i, j;
if( ( t = myAlloc( n, 0 ) ) == NULL ) return t;
for ( i = 0; i < n; ++i )
for ( j = 0; j < n; ++j )
t[i][j] = a[i][j] + b[i][j];
return t;
}

void myFree( int** a, int n ) {


int i;
for ( i = 0; i < n; ++i ) free( a[i] );
free( a );
163
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}

int main() {
int **a, **b, **c, **d;
int n;

srand( time( NULL ) );


printf( "Nhap bac ma tran: " );
scanf( "%d", &n );

a = myAlloc( n, 1 );
b = myAlloc( n, 1 );

if ( !a || !b )
{ printf( "Loi cap phat\n" ); return 1; }

printMatrix( a, n, "Ma tran A" );


printMatrix( b, n, "Ma tran B" );

c = addMatrix( a, b, n );
if ( c ) printMatrix( c, n, "Ma tran tong" );
else { printf( "Loi cap phat\n" ); return 1; }

d = mulMatrix( a, b, n );
if ( d ) printMatrix( d, n, "Ma tran tich" );
else { printf("Loi cap phat\n"); return 1; }

myFree( a, n ); myFree( b, n );
myFree( c, n ); myFree( d, n );
return 0;
}
Bi tp yu cu bn bit cch cp pht vng nh ng trn heap cho mng 2 chiu
trong C. Gi s ta cn cp pht ng mt mng hai chiu c kch thc n x m, c hai
cch thc hin iu ny:
- Cch 1:
u tin ta cp pht mt mng cha n con tr kiu int*, qun l bi con tr t (kiu
int**). Tip theo, vi mi con tr trong mng con tr t, cp pht mt mng cha m
phn t kiu int. Do cp pht nhiu ln nn vi cch ny vng nh c cp pht
khng lin tc.
Cp pht: t m phn t
t = ( int** )calloc( n, sizeof( int* ) );
for ( i = 0; i < n; ++i )
t[i] = ( int* )calloc( m, sizeof( int ) );
n phn t

Gii phng:
for ( i = 0; i < n; ++i )
free( t[i] );
free( t );

- Cch 2:
u tin ta cp pht mt mng cha n con tr kiu int*, qun l bi con tr t (kiu
int**). Tip theo, cp pht mt vng nh cho n x m phn t ca mng hai chiu,
qun l bi con tr u tin t[0] ca mng con tr t. Cui cng, chia u vng
nh ny cho cc con tr cn li trong mng con tr t.
164
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Vng nh cp pht bi cch ny lin tc hn, gi l ch phng (flattened mode),


ging cch C cp pht tnh cho mng hai chiu.
m phn t
t
n phn t

Cp pht: Gii phng:


t = ( int** )calloc( n, sizeof( int* ) ); free( t[0] );
t[0] = ( int* )calloc( n * m, sizeof( int ) ); free( t );
for ( i = 0; i < n; ++i )
t[i] = t[0] + i * m;
Sau khi cp pht cc ma trn c s dng bnh thng ging nh trng hp cc
ma trn cp pht tnh.
V cc ma trn tham gia vo cc php tnh u l ma trn vung v cng cp nn
nhng yu cu cho cc php tnh trn ma trn u tha.
Cn ch hm myAlloc(), khi to cho cc ma trn va cp pht khc nhau ty theo
tham s f: nu bng 0 th cc phn t ca ma trn mi cp pht s c khi to vi
tr 0; ngc li, cc phn t ca ma trn mi cp pht s c khi to vi tr ngu
nhin nm trong on [-10, 10].

Bi 100: (trang 30)


#include <stdio.h>
#define MAX 20

int main() {
int a[MAX][MAX];
int n, m, i, j, s;

printf( "Nhap n, m: " );


scanf( "%d%d", &n, &m );

for ( i = 0; i < n; ++i )


for ( j = 0; j < m; ++j ) {
printf( "a[%d][%d] = ", i, j );
scanf( "%d", &a[i][j] );
}
for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < m; ++j )
printf( "%5d", a[i][j] );

for ( s = i = 0; i < n; ++i )


for ( j = 0; j < m; ++j )
s += ( !a[i][j] );

if ( 2 * s > n * m ) printf( "Ma tran thua\n" );


else printf( "Ma tran khong thua\n" );
return 0;
}

165
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Ch cch m s phn t s c tr 0 ca mng, bng cch dng biu thc iu kin.


Hai ln tr s ny s c so snh vi s phn t n * m ca ma trn. Khng nn so
snh (s > n * m / 2) trnh php chia nguyn.

Bi 101: (trang 30)


#include <stdio.h>
#define MAX 20

int isMagic( int a[][MAX], int n ) {


int i, j, t, s1, s2;

for ( s1 = s2 = i = 0; i < n; ++i ) {


s1 += a[i][i];
s2 += a[i][n - i - 1];
}
if ( s1 != s2 ) return 0;

t = s1;
for ( i = 0; i < n; ++i ) {
for ( s1 = s2 = j = 0; j < n; ++j ) {
s1 += a[i][j];
s2 += a[j][i];
}
if ( s1 != t || s2 != t ) return 0;
}
return 1;
}

int main() {
int a[MAX][MAX];
int n, i, j, sr, sc;

printf( "Nhap bac ma tran: " );


scanf( "%d", &n );

for ( i = 0; i < n; ++i )


for ( j = 0; j < n; ++j ) {
printf( "a[%d][%d] = ", i, j );
scanf( "%d", &a[i][j] );
}

for ( i = 0; i < n; ++i ) {


for ( sr = sc = j = 0; j < n; ++j ) {
sr += a[i][j];
sc += a[j][i];
printf( "%5d", a[i][j] );
}
printf( " Tong hang %d:%4d", i, sr );
printf( " Tong cot %d:%4d\n", i, sc );
}
if ( isMagic( a, n ) ) printf( "Ma phuong\n" );
else printf( "Khong phai ma phuong\n" );
return 0;
}

166
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Khi tnh tng tr cc phn t ca mi dng, thc hin tng vi mi dng,


bn dng vng for m dng (bin m i) bn ngoi. Vi mi dng i bn dng vng
for m ct (bin m j) bn trong cng dn cc phn t trn dng :
for ( i = 0; i < n; ++i )
for ( sr = j = 0; j < n; ++j )
sr += a[i][j];
Khi tnh tng cc ct, khi phn tch ta nhn thy vai tr dng v ct i ch
nhau: vi mi dng ta cng dn ct thay bng vi mi ct ta cng dn dng. V
vy, tht n gin, bn ch cn i ch cc vng lp i v j tng ng.
for ( j = 0; j < n; ++j )
for ( sc = i = 0; i < n; ++i )
sc += a[i][j];
Vi ma trn vung hai vng lp i v j c s ln lp nh nhau nn c th vit:
for ( i = 0; i < n; ++i )
for ( sc = j = 0; j < n; ++j )
sc += a[j][i];
Nh vy, tng tr phn t cc dng v cc ct c tnh gn hn nh sau:
for ( i = 0; i < n; ++i ) {
for ( sr = sc = j = 0; j < n; ++j ) {
sr += a[i][j];
sc += a[j][i];
}
Tng tr cc phn t thuc ng cho chnh v ng cho ph c tnh nh bi
87 (trang 149), chung trong mt vng lp:
for ( s1 = s2 = i = 0; i < n; ++i ) {
s1 += a[i][i];
s2 += a[i][n-i-1];
}

Bi 102: (trang 30)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 20

int main() {
int a[MAX][MAX], b[MAX][MAX];
int n, m, i, j;

printf( "Nhap n, m: " );


scanf( "%d%d", &n, &m );

srand( time( NULL ) );


for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < m; ++j )
printf( "%5d", a[i][j] = rand() % 201 - 100 );

printf( "Ma tran chuyen vi:\n" );


for ( i = 0; i < m; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", b[i][j] = a[j][i] );

167
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


return 0;
}
Nu ma trn l ma trn vung cp n v chuyn v din ra ch trong ma trn , ngha
l khng to ma trn mi, th ta ch cn chuyn v tam gic di hoc tam gic trn
ca ma trn.
Khi duyt ma trn ta ch cn duyt min cn hon chuyn l tam gic di
ng cho chnh, v nu duyt c ma trn th khi hon chuyn tam gic cn li (trn
ng cho chnh) bn hon chuyn mt ln na cc cp hon chuyn v nh
vy ma trn tr v nh ban u.
#define swap(a, b) { int t = a; a = b; b = t; }
/* ... */
for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < i; ++j )
swap( a[i][j], a[j][i] );
Ch cp phn t i xng vi nhau qua ng cho chnh l: (a[i][j], a[j][i]),
mt thuc tam gic di v mt thuc tam gic trn.

Bi 103: (trang 31)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 20

int main() {
int a[MAX][MAX];
int sumd1[2 * MAX], sumd2[2 * MAX];
int n, i, j, k;

printf( "Nhap bac ma tran: " );


scanf( "%d", &n );

srand( time( NULL ) );


for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", a[i][j] = rand() % 21 - 10 );

for ( k = -n + 1; k < n; ++k ) {


int s1, s2;
s1 = s2 = 0;
for ( i = 0; i < n; ++i )
for ( j = 0; j < n; ++j ) {
if ( j == i + k ) s1 += a[i][j];
if ( j == n - i - 1 + k ) s2 += a[i][j];
}
sumd1[k + n - 1] = s1;
sumd2[k + n - 1] = s2;
}

printf( "Ma tran B:\n" );


for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", sumd1[j - i + n - 1] + sumd2[j + i] - a[i][j] );
return 0;
168
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}
Bn cn cc kin thc v h ch s = k2+n-1
ng cho song song ng h cho ph: j = n-i-1+k2
cho ph (bi 90, trang 152) v s2 sumd2
h ng cho song song
ng cho chnh (bi 92, trang ch s = j+i
154) gii bi tp ny. a[i][j]
Cch gii c trnh by trong ch s = j-i+n-1
hnh bn:
s1 sumd1
Vi phn t a[i][j] bt k:
- Tng tr s1 ca cc phn t ch s = k1+n-1
h cho chnh: j = i+k1
trn ng cho song song
ng cho chnh i qua a[i][j] c tnh v t vo mng sumd1. ng cho ny
c phng trnh tham s l j = i + k1 (1), v k1 [-n + 1, n) nn ch s ca n
trong mng sumd1 phi c tnh tin thnh: k1 + n - 1 (2). T (1) v (2) ta c ch
s ca tng tr s1 trong mng sumd1 theo i, j l: j - i + n - 1.
- Tnh ton tng t, ta c tng tr s2 ca cc phn t trn ng cho song song
ng cho ph i qua a[i][j] c tnh v t vo mng sumd2 ti phn t c ch
s theo i, j l: j + i.
Sau khi tnh xong hai mng sumd1 v sumd2, ta d dng tnh c tng tr cc phn
t trn hai ng cho (song song ng cho chnh v ng cho ph) i qua phn
t a[i][j]:
b[i][j] = s1 + s2 = sumd1[j - i + n - 1] + sumd2[j + i] - a[i][j]
phn t a[i][j] c mt c trong hai tng s1 v s2 nn cn loi bt mt phn t.
Tuy nhin, do c im ca phn t nm trn hai ng cho i qua mt phn t ch
nh, ta c cch gii ngn gn hn khi xt vi iu kin n gin nh sau:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define MAX 20

int main() {
int a[MAX][MAX];
int n, i, j, k, l, s;

printf( "Nhap bac ma tran: " );


scanf( "%d", &n );

srand( time( NULL ) );


for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", a[i][j] = rand() % 21 - 10 );

printf( "Ma tran B:\n" );


for ( k = 0; k < n; ++k, putchar( '\n' ) )
for ( l = 0; l < n; ++l ) {
for ( s = i = 0; i < n; ++i )
for ( j = 0; j < n; ++j )
if ( abs(i - k) == abs(j - l) ) s += a[i][j];
printf( "%5d", s );
169
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}
return 0;
}

Bi 104: (trang 31)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define MAX 20

int main() {
int a[MAX][MAX];
int n, i, j, k, l, max;

printf( "Nhap bac ma tran: " );


scanf( "%d", &n );

srand( time( NULL ) );


for ( i = 0; i < n ; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", a[i][j] = rand() % 21 - 10 );

printf( "Ma tran B:\n" );


for ( k = 0; k < n; ++k, putchar( '\n' ) )
for ( l = 0; l < n; ++l ) {
max = -11;
for ( i = 0; i < n; ++i )
for ( j = 0; j < n; ++j )
if ( abs(i - k) == abs(j - l) && a[i][j] > max )
max = a[i][j];
printf( "%5d", max );
}
return 0;
}
Bi tp ny c thc hin ging bi 103 (trang 170), ch tr max khi to nh hn
bin tri ca on tr c chn cho cc phn t ca ma trn nn chc chn max s b
thay th.

Bi 105: (trang 31)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 20

int main() {
int a[MAX][MAX];
int sumR[MAX] = { 0 };
int sumC[MAX] = { 0 };
int n, i, j, s;

printf( "Nhap bac ma tran: " );


scanf( "%d", &n );

170
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


srand( time( NULL ) );
for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", a[i][j] = rand() % 21 - 10 );

for (s = i = 0; i < n; s += sumR[i++] )


for ( j = 0; j < n; ++j ) {
sumR[i] += a[i][j];
sumC[i] += a[j][i];
}

printf( "Ma tran B:\n" );


for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", s - ( sumR[i] + sumC[j] - a[i][j] ) );
return 0;
}
Vic tnh tng tr cc phn t ca mi dng v mi ct c gii thch trong bi 101
(trang 166): Tng tr cc phn t ca mi dng lu trong mng sumR, ch s ca mng
l ch s ca dng tng ng. Tng tr cc phn t ca mi ct lu trong mng sumC,
ch s ca mng l ch s ca ct tng ng. Cc phn t ca hai mng ny u c
khi to bng 0.
Nh vy, tng tr cc phn t nm trn dng i, ct j, i qua phn t a[i][j] l:
sumR[i] + sumC[j] - a[i][j]
Phn t a[i][j] c mt c trong hai tng sumR[i] v sumC[j] nn cn loi bt mt
phn t.
Sau mi vng lp j, tc vi tng (dng) i,ta nhn tin tnh tng tr s ca cc phn t
trong ma trn, thc cht l tng tr cc phn t ca mng sumR.
Suy ra tng tr cc phn t khng thuc dng i ct j ca ma trn A:
b[i][j] = s - ( sumR[i] + sumC[j] - a[i][j] )

Bi 106: (trang 32)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 20

int main() {
int a[MAX][MAX];
int maxc[MAX], minc[MAX];
int n, i, j, pmax, pmin;

printf( "Nhap bac ma tran: " );


scanf( "%d", &n );
srand( time( NULL ) );
for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%5d", a[i][j] = rand() % 21 - 10 );

/* mng maxc: cha ch s dng ca dng c phn t 'max ct'


mng minc: cha ch s dng ca dng c phn t 'min ct'
Ch s ca mng l ct. Ngha l, ct j c phn t 'max ct' ti
dng maxc[j] v phn t 'min ct' ti dng minc[j] */
171
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


for ( j = 0; j < n; ++j ) {
pmax = pmin = 0;
for ( i = 1; i < n; ++i ) {
if ( a[i][j] > a[pmax][j] ) pmax = i;
if ( a[i][j] < a[pmin][j] ) pmin = i;
}
maxc[j] = pmax;
minc[j] = pmin;
}
/* xc nh ct c phn t 'max dng' v ct c phn t 'min dng' */
for ( i = 0; i < n; ++i ) {
pmax = pmin = 0;
for ( j = 1; j < n; ++j ) {
if ( a[i][j] > a[i][pmax] ) pmax = j;
if ( a[i][j] < a[i][pmin] ) pmin = j;
}
/* pmin l ct c phn t 'min dng' ca dng i, phn t 'max ct'
ca ct pmin c ch s dng l maxc[pmin], ta so snh xem
ch s dng ny c phi l dng i hay khng */
if ( i == maxc[pmin] )
printf( "MIN dong MAX cot: a[%d][%d] = %d\n", i, pmin, a[i][pmin] );
/* pmax l ct c phn t 'max dng' ca dng i, phn t 'min ct'
ca ct pmax c ch s dng l minc[pmax], ta so snh xem
ch s dng ny c phi l dng i hay khng */
if ( i == minc[pmax] )
printf( "MAX dong MIN cot: a[%d][%d] = %d\n", i, pmax, a[i][pmax] );
}
return 0;
}
Xem ch gii chi tit trong bi gii.

Bi 107: (trang 32)


#include <stdio.h>

int main() {
int a[5][5];
int n, i, j, v;

n = 5;
v = 1;
for ( i = 0; i < n; ++i )
for ( j = 0; j < n; ++j )
if ( i % 2 ) a[i][n - j - 1] = v++;
else a[i][j] = v++;
for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%3d", a[i][j] );
return 0;
}
Bi tp ny thc hin n gin, cc dng ln lt theo th t t trn xung di s
c x l nh sau:
- Vi mi dng chn: tr v tng dn s c gn vo tng phn t ca cc ct tnh t
tri sang phi mt cch bnh thng.

172
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

- Vi mi dng l: tr v tng dn s c gn vo tng phn t ca cc ct tnh t


phi sang tri, i chiu gn bng cch p dng cng thc cp phn t i xng nhau
trong mng mt chiu (b[i], b[n - i - 1]).

Bi 108: (trang 33)


#include <stdio.h>
#define MAX 20
#define AK a[i][j] = ++k; if ( k == n * n ) goto RET;

int main() {
int a[MAX][MAX];
int i, j, k, n;

printf( "Nhap bac ma tran (n < 20): " );


scanf( "%d", &n );

i = j = k = 0;
while( 1 ) {
do { AK; j++; } while ( j < n - i - 1 );
do { AK; i++; } while ( j > i );
do { AK; j--; } while ( j > n - i - 1 );
do { AK; i--; } while ( j < i - 1 );
}
RET:
for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%3d", a[i][j] );
return 0;
}
Bi tp c v phc tp nhng c thc hin d dng. Hnh di l m t ton hc
ca bi tp trn:
tng j
j < n-i-1 j = n-i-1

j = i-1

gim i tng i
j>i
j < i-1

gim j j=i
j > n-i-1
Ch trong mt vng xon c, cc cnh xon c khng phi b gii hn bi cc bin
ca ma trn nh cch ngh thng thng, m b gii hn bi ng cho chnh j =
i, ng cho ph j = n - i - 1 v ng cho song song ng cho chnh j =
i - 1. Cc ng cho ny chia mt phng thnh nhiu min. Ty iu kin mi
min ta xc nh c yu cu cn thc hin trong mi min nh: tng j i dn
sang phi, gim i i t di ln trn, V d:
do {
a[i][j] = ++k; /* tr k tng dn c gn vo tng phn t */
if ( k == n * n )
goto RET; /* nu gn y ma trn th thot */
173
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


j--; /* trong min j < n-i-1, gim j i t phi sang tri */
} while ( j > n - i - 1 );
Macro AK, dng gn ln lt cc tr k tng dn vo cc phn t ca ma trn v kim
tra gn xong, gip code vit ngn gn hn. Bn cn hc tp s dng thng tho
macro, lp trnh vin C s dng rt nhiu macro t vit hoc c sn.
Pht biu goto gip thot nhanh ra khi hai vng lp: vng lp while vnh vin bn
ngoi v vng lp do while dng gn tr bn trong.
Nu to ma trn trong hm, thay lnh goto bng return;
Nu ma trn khng vung, tham kho bi tp 111 (trang 176).

Bi 109: (trang 33)


#include <stdio.h>

int main() {
int a[5][5];
int n, i, j, k, v;

n = 5;
v = 1;
for ( k = -n + 1; k < n; ++k )
for ( i = 0; i < n; ++i )
for ( j = 0; j < n; ++j )
if ( j == n - i - 1 + k )
if ( k % 2 ) a[j][i] = v++;
else a[i][j] = v++;

for ( i = 0; i < n; ++i, putchar( '\n' ) )


for ( j = 0; j < n; ++j )
printf( "%3d", a[i][j] );
return 0;
}
Bi tp c v phc tp ny c thc hin d dng nu bn c kin thc v h
ng cho song song ng cho ph j = n - i - 1 + k (bi 90, trang 152) v
kin thc v ma trn chuyn v (bi 102, trang 167).
Ta ln lt gn cc tr k tng dn vo cc phn t nm trn cc ng cho song
song vi ng cho ph, khi sang ng cho khc (ngha l khi k thay i, kim
tra bng cch xt k chn hoc l), ta i chiu th t cc phn t cn gn tr. Nhn
xt thy rng cc phn t nm trn mt ng cho song song ng cho ph to
thnh cc cp phn t i xng nhau qua ng cho chnh, ta p dng cng thc
chuyn v ma trn to nn s i chiu ny.

Bi 110: (trang 33)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int** myAlloc( int n, int m ) {


int i, j;
int** t = ( int ** )calloc( n, sizeof( int* ) );
if ( !t ) return t;
t[0] = ( int * )calloc( n * m, sizeof( int ) );

174
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


if ( !t[0] ) return t;
srand( time( NULL ) );
for ( i = 0; i < n; ++i ) {
t[i] = t[0] + i * m;
for ( j = 0; j < m; ++j )
t[i][j] = rand() % 21 - 10;
}
return t;
}

void myFree( int** a, int n ) {


free( a[0] );
free( a );
}

int sumNeg( int *a, int size ) {


int i, s;
for ( s = i = 0; i < size; ++i )
if ( a[i] < 0 ) s++;
return s;
}

int main() {
int **a;
int n, m, i, j, k;

printf( "Nhap n, m: " );


scanf( "%d%d", &n, &m );

a = myAlloc( n, m );
if ( !a )
{ printf( "Loi cap phat\n" ); return 1; }

for ( i = 0; i < n; ++i, putchar( '\n' ) )


for ( j = 0; j < m; ++j )
printf( "%5d", a[i][j] );
do {
printf( "Nhap k: " );
scanf( "%d", &k );
} while ( k < 0 || k > n );
printf( "Dong %d co %d so am\n", k, sumNeg( a[k], m ) );
myFree( a, n );
return 0;
}
Cp pht ng cho mng hai chiu c trnh by chi tit trong bi 99 (trang 163),
bi tp ny hin thc cch cp pht th hai (flattened mode).
- Do tnh linh hot ca C khi x l mng, hm p dng cho mng c th dng p
dng d dng cho mt dng ca ma trn:
sumNeg( b, n ); /* b l tn mng mt chiu b */
sumNeg( a[k], m ); /* a[k] l "tn" dng k ca ma trn a */
y a[k] c xem nh tn ca mt mng. Lp trnh vin C c t duy gn vi
kin trc bn di hn. H khng phn bit tr c truyn l tn mng b hay tn
dng th k ca ma trn a[k], m ch xem l cc a ch bt u ca mt vng nh
lin tc:
175
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

sumNeg( b, n ); /* b l a ch bt u mng b */
sumNeg( a + k, m ); /* a+k l a ch bt u dng a[k] ca ma trn a */
Tham kho thm bi 89 (trang 151).

Bi 111: (trang 34)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX 20

void rShiftkStep( int b[], int n, int m, int k ) {


int i, j;

for ( i = 0; i < k; ++i ) {


int t = b[n * m - 1];
for ( j = n * m - 1; j > 0; --j )
b[j] = b[j - 1];
b[0] = t;
}
}

void two2one( int b[], int a[][MAX], int n, int m ) {


int i, j, v, direction, k;
int size = n * m;

v = direction = 0;
i = j = 0;
do {
switch ( direction ) {
case 0:
for ( k = 0; k < m; ++k ) b[v++] = a[i][j+k];
j += m - 1; break;
case 1:
for ( k = 1; k < n; ++k ) b[v++] = a[i+k][j];
i += n - 1; break;
case 2:
for ( k = 1; k < m; ++k ) b[v++] = a[i][j-k];
j -= m - 1; break;
case 3:
for ( k = 1; k < n-1; ++k ) b[v++] = a[i-k][j];
i -= n - 2;
n -= 2;
m -= 2;
j++;
}
direction = ( direction + 1 ) % 4;
} while ( v < size );
}

void one2two( int a[][MAX], int b[], int n, int m ) {


int i, j, v, direction, k;
int size = n * m;

v = direction = 0;
176
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


i = j = 0;
do {
switch ( direction ) {
case 0:
for ( k = 0; k < m; ++k ) a[i][j+k] = b[v++];
j += m - 1; break;
case 1:
for ( k = 1; k < n; ++k ) a[i+k][j] = b[v++];
i += n - 1; break;
case 2:
for ( k = 1; k < m; ++k ) a[i][j-k] = b[v++];
j -= m - 1; break;
case 3:
for ( k = 1; k < n-1; ++k ) a[i-k][j] = b[v++];
i -= n - 2;
n -= 2;
m -= 2;
j++;
}
direction = ( direction + 1 ) % 4;
} while ( v < size );
}

int main() {
int a[MAX][MAX];
int b[MAX*MAX];
int n, m, i, j, k;

printf( "Nhap dong, cot: ");


scanf( "%d%d", &n, &m );

srand( time( NULL ) );


for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < m; ++j )
printf( "%5d", a[i][j] = rand() % 21 - 10 );

two2one( b, a, n, m ); /* chuyn t mng 2 chiu sang 1 chiu */

printf( "Nhap buoc dich: " );


scanf( "%d", &k );
if ( k > n * m ) k = 0;
rShiftkStep( b, n, m, k ); /* dch trn mng mt chiu */

one2two( a, b, n, m ); /* chuyn t mng 1 chiu tr li 2 chiu */

for ( i = 0; i < n; ++i, putchar( '\n' ) )


for ( j = 0; j < m; ++j )
printf( "%5d", a[i][j] );
return 0;
}

177
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Khc hn bi 108 (trang 173), bi tp trn


khng dng ma trn vung nn chng ta tng j
m-1 phn t
phi dng cc cnh ma trn gii hn
j++
vic gn vo cc phn t trong tng chu
k ca vng xon c. Hnh bn trnh by m -= 2
tng i
nhng tnh ton c th: gim i n -=2 n-1 phn t
- Trong cnh 0 ca vng xon, gn cho m- n-2 phn t
1 phn t trong mt vng lp, sau tng
j ng m-1. Tng t vi cc cnh 1 (gn
n-1 phn t, tng i ng n-1), cnh 2 (gn gim j
m-1 phn t, gim j ng m-1) v cnh 3 m-1 phn t
(gn n-2 phn t, gim i ng n-2).
- Mun chuyn sang chu k vng xon th hai, phi tng j (j++), sau hiu chnh
li kch thc cc cnh vng xon: m v n u gim 2 phn t.
Dng nhng tnh ton trn vit hai hm:
- two2one(): ln lt ly cc phn t theo th t vng xon c trong mng hai chiu
chuyn vo mng mt chiu.
- one2two(): thao tc ngc li, ln lt chuyn cc phn t ca mng mt chiu
tng ng vo mng hai chiu theo th t vng xon c.
Hai hm ny vit nh nhau, ch khc vai tr gn phn t.
Trc lc chuyn mng mt chiu tr li mng hai chiu theo th t vng xon c
ta dng hm rShiftkStep() dch phi mng mt chiu k v tr. Hm ny c gii
thch trong bi tp 72 (trang 129).
Cch gii trn rt tng minh v d hiu nhng khng gn. Tham kho cch gii
cui ca bi 85 (trang 146) ta t vn : c th tnh cng thc nh x ch s gia
mng hai chiu v mng mt chiu trn c khng? Nu tnh c th ta c th
p dng cng thc nh x ny trong hm rShiftkStep() v khng cn mng mt
chiu trung gian. Song vic tnh cng thc nh x ch s ny r rng phc tp.
Tuy vy, nh nhn xt ny ta c bi gii gn v ng hc tp hn:
- Thay v dng mng mt chiu lu tr phn t tng ng theo chiu xon c trn
mng hai chiu, ta dng mng mt chiu lu ch s phn t tng ng theo chiu
xon c trn mng hai chiu. Ni cch khc, ta dng mng mt chiu khng nh mt
i tng trung gian, m nh mt cu trc d liu c bit lu thng tin truy xut
mng hai chiu. Thng tin ny, chnh l thng tin nh x ch s, s c dng trong
hm rShiftkStep().
- Mt phn t ca mng mt chiu lu n hai ch s i v j cho mt phn t ca
mng hai chiu nn ta dng cng thc nh x lu chung i v j: i * size + j
(size = n * m l kch thc mng hai chiu). C th dng mng cc structure y
nhng chng ta cha tho lun n cc bi tp v structure.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX 20

void rShiftkStep( int a[][MAX], int b[], int n, int m, int k ) {


int i, j, t;
int size = n * m;
178
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

for ( i = 0; i < k; ++i ) {


t = a[b[n * m - 1]/size][b[n * m - 1]%size];
for ( j = n * m - 1; j > 0; --j )
a[b[j]/size][b[j]%size] = a[b[j-1]/size][b[j-1]%size];
a[0][0] = t;
}
}

/* thay v lu tr, lu ch s ca phn t tng ng theo chiu xon c */


void createIndex( int b[], int a[][MAX], int n, int m ) {
int i, j, v, direction, k;
int size = n * m;

v = direction = 0;
i = j = 0;
do {
switch ( direction ) {
case 0:
for ( k = 0; k < m; ++k ) b[v++] = i*size + (j+k);
j += m - 1; break;
case 1:
for ( k = 1; k < n; ++k ) b[v++] = (i+k)*size + j;
i += n - 1; break;
case 2:
for ( k = 1; k < m; ++k ) b[v++] = i*size + (j-k);
j -= m - 1; break;
case 3:
for ( k = 1; k < n-1; ++k ) b[v++] = (i-k)*size + j;
i -= n - 2;
n -= 2;
m -= 2;
j++;
}
direction = ( direction + 1 ) % 4;
} while ( v < size );
}

int main() {
int a[MAX][MAX];
int b[MAX*MAX]; /* b l mng nh x ch s */
int n, m, i, j, k;

printf( "Nhap dong, cot: ");


scanf( "%d%d", &n, &m );

srand( time( NULL ) );


for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < m; ++j )
printf( "%5d", a[i][j] = rand() % 21 - 10 );

createIndex( b, a, n, m ); /* to mng nh x ch s */
printf( "Nhap buoc dich: " );
scanf( "%d", &k );
if ( k > n * m ) k = 0;
rShiftkStep( a, b, n, m, k ); /* dng mng nh x ch s */
179
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

for ( i = 0; i < n; ++i, putchar( '\n' ) )


for ( j = 0; j < m; ++j )
printf( "%5d", a[i][j] );
return 0;
}

Bi 112: (trang 34)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

double fround( double x, long n ) {


long round;
x *= pow( 10, n );
round = ( x > 0 ) ? (long)( x + 0.5 ) : (long)( x - 0.5 );
return round / pow( 10, n );
}

void swaprow( double** a, int r1, int r2 ) {


double* t = a[r1]; a[r1] = a[r2]; a[r2] = t;
}

int main() {
double** a, t;
int n, i, j, k;

printf( "Nhap bac cua ma tran: ");


scanf( "%d", &n );

a = ( double ** )calloc( n, sizeof( double* ) );


if ( !a )
{ printf( "Loi cap phat\n" ); return 1; }
a[0] = ( double * )calloc( n * n, sizeof( double ) );
if ( !a[0] )
{ printf( "Loi cap phat\n" ); free( a ); return 1; }

srand( time( NULL ) );


for ( i = 0; i < n; ++i ) {
a[i] = a[0] + i * n;
for ( j = 0; j < n; ++j )
printf( "%8.3lf", a[i][j] = rand()/(double)RAND_MAX );
putchar( '\n' );
}
/* php kh Gauss */
for ( i = 0; i < n; ++i ) {
if ( a[i][i] )
for ( j = i + 1; j < n; ++j ) {
t = a[j][i] / a[i][i];
for ( k = 0; k < n; ++k )
a[j][k] -= a[i][k] * t;
}
else {
/* Kim tra xem trong trng hp a[i][i] bng 0,

180
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


c tm c a[j][i] no khc 0 khng */
for ( j = i + 1; j < n; ++j )
if ( a[j][i] ) break;
if ( j < n ) swaprow( a, i, j );
else break;
i--;
}
}
putchar( '\n' );

if ( i >= n ) {
for ( i = 0; i < n; ++i, putchar( '\n' ) )
for ( j = 0; j < n; ++j )
printf( "%8.3lf", fround( a[i][j], 3 ) );
} else printf( "Dinh thuc ma tran bang 0\n" );

free( a[0] );
free( a );
return 0;
}
Hm rand() sinh ra mt s nguyn ngu nhin trong on [0, RAND_MAX]. Ta dng
srand() v rand() sinh s thc ngu nhin x nh sau:
srand( time( NULL ) );
x = rand() / ( double )RAND_MAX;
Sau khi c ma trn cc s thc ngu nhin, ta tin hnh chnh xc cc bc ca php
kh Gauss nh m t trong phn hng dn.
Hm fround() dng lm trn cc s thc trong ma trn kt qu, c trnh by
trong bi tp 28 (trang 90).

Bi 113: (trang 35)


#include <stdio.h>
#include <string.h>

int main() {
char s[255];
int i, head;
int maxhead, maxlen;

printf( "Nhap chuoi nhi phan: " );


fgets( s, 255, stdin );

head = maxhead = maxlen = 0;


do {
int len = 0;
for ( i = head; s[i] && s[i] == '0'; ++i )
len++;
if ( len > maxlen ) { maxlen = len; maxhead = head; }
head = i + 1;
} while ( s[i] );

printf( "Chuoi 0 dai nhat co %d ky tu\n", maxlen );


printf( "Bat dau tai s[%d] ", maxhead );
putchar( '\n' );
return 0;
181
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}
Hm gets( char* str ) c cc k t t stdin (ng nhp chun) v t chng vo
mng k t ch bi con tr str, k t c vo cho n khi xut hin mt k t xung
dng (newline) hoc EOF. K t newline khng lu trong mng m c thay th
bng k t null kt thc mng. Tuy nhin, hm gets() khng cung cp kim tra gii
hn nhp (bounds checking) nn c th gy trn mng k t nn c xem l nguy
him v khuyn co khng nn dng.
thay th, ngh dng hm fgets( char* str, int num, FILE* stream ); hm
ny c ti a num - 1 k t t stream (thng dng l stdin) vo mng k t ch
bi con tr str, k t c vo cho n khi xut hin mt k t xung dng (newline)
hoc EOF, k t newline cng c lu trong mng. Sau mt k t null kt thc
mng c lu ngay sau k t nhp cui cng.
Do fgets() khng loi b k t newline khi nhp, ta phi lm iu nh sau:
char s[50];
size_t len;
printf( "Nhap mot chuoi: " );
fgets( s, 50, stdin );
len = strlen( s ) - 1;
if ( s[len] == '\n' ) s[len] = '\0';
hoc gn hn, gi hm strchr():
char s[50], *t;
printf( "Nhap mot chuoi: " );
fgets( s, 50, stdin );
if ( ( t = strrchr( s, '\n' ) ) != NULL ) *t = '\0';
Tr li bi tp trn, thc cht ta cn tm run di nht cha ton k t '0', cch tm
tng t nh thc hin trong mng mt chiu, xem bi tp 69 (trang 126), ch khc
tnh cht ca run v cch kim tra n cui mng k t.
C khng h tr kiu d liu chui (string). Trong C, chui l mng cc k t v C
c mt du c bit ch r k t cui trong mt chui. K t ny gi l null v
vit l '\0'. Bn ng nhm ln k t null ny vi con tr NULL cng nh s 0 (kiu
int), k t null (kiu char) lun lun bng 0.
Cng trnh hiu qu n gin: chui l mng cc k t, v d mt trng hp c
bit xy ra khi thit lp chnh xc s k t c dng trong khi khi to m khng
tnh n k t null, nh sau: char characters[7] = "No null";
y trnh bin dch cn nhc vic thiu k t kt thc null. Trnh bin dch xc
nh y l mt mng k t, khng phi l mt chui.
Khi lm vic vi chui, vic kim tra kt thc chui khng phi bng cch so snh
vi chiu di chui (i < strlen( s )) m nn kim tra k t ang thao tc c khc
null hay cha, ngha l s[i] != '\0' hay gn hn (s[i]).

Bi 114: (trang 35)


#include <stdio.h>
#include <stdlib.h>

size_t _strlen( const char *s ) {


const char* p = s;
while ( *p ) ++p;
return p - s;
}
182
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

char* _strcpy( char *s, const char *t ) {


char* p = s;
while ( *p++ = *t++ ) {}
return s;
}

char* _strcat( char *s, const char *t ) {


char *p = s;
while ( *p ) ++p;
while ( *p++ = *t++ ) {}
return s;
}

int main() {
char* buf;
size_t size;
char s1[] = "the quick brown fox ";
char s2[] = "jumps over the lazy dog";

size = sizeof( s1 ) - 1 + sizeof( s2 ) - 1 + 1;


if ( !( buf = ( char* )malloc( size ) ) )
{ printf( "Loi cap phat!" ); return 1; }

printf( "Chuoi 1: [%s] (%lu)\n", s1, ( unsigned long )_strlen( s1 ) );


printf( "Chuoi 2: [%s] (%lu)\n", s2, ( unsigned long )_strlen( s2 ) );
printf( "strcpy( buf, s1 ) roi strcat( buf, s2 ):\n" );
_strcat( _strcpy( buf, s1 ), s2 );
printf( "[%s] (%lu)\n", buf, ( unsigned long )_strlen( buf ) );
free( buf );
return 0;
}
Mt c im trong vic x l chui l thc hin cc thao tc ch yu bng con tr.
Dng con tr k t trong trng hp ny linh ng v trc quan hn nhiu so vi
dng cch dng ch s:
- Hm _strlen(): m phng strlen(), con tr p c khi w o r l d \0
to ch n u mng s, nu p vn cha ch n phn t
cui mng ( *p != '\0' ) th ta cn tng p. Nu p ch p=s p
n phn t cui mng, dng php tr con tr xc nh
s phn t gia p v u mng.
Con tr trong C rt thun li cho vic truy xut cc phn t ca mng. Php cng
con tr t l theo kch thc phn t ca mng do con tr ch n, v d p++ c ngha
l con tr p ch n phn t k tip ca mng. Khi hai con tr cng ch vo mt mng
c tr nhau, kt qu s l s phn t ca mng gia chng.
trnh mt s nhm ln, bn n tp mt cht v s dng con tr:
V d 1: *p++ c ngha: ly tr ni con tr ch n (*p), tng con tr ln 1 (p++), con
tr ch n phn t k tip. Mc d ton t ++ c u tin cao hn ton t *, nhng
v ton t tnh sau postfix ++ dng thanh ghi lu tr nn ta c cm gic vic ly tr
ni con tr ch n c thc hin trc.
V d 2: (*p)++ c ngha: ly tr ni con tr ch n (*p), ri tng tr ni con tr ch
n ln 1 (()++), con tr khng dch chuyn.

183
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

V d 3: *++p c ngha: tng con tr ln 1 (++p) do dng ton t tng trc prefix,
con tr ch n phn t k tip, ri ly tr ni con tr ch n (*p).
- Hm _strcpy(): m phng strcpy(), con tr p c khi to ch n u mng s.
Trong vng lp, ln lt cc tr ca phn t ni con tr t ch n c sao chp sang
phn t ni con tr p ch n. Mi ln sao chp, hai con tr p v t u tng mt n
v, ngha l s ch n phn t k tip. Tr va
t t
sao chp (*p) c kim tra pht hin k t
null chm dt vng lp. Nh vy, qu trnh
w o r l d \0
sao chp s chm dt khi k t null cui chui
sao chp
t c sao chp sang p ri c kim tra pht *p = *t
hin thy. w o r l d \0
Ta nhn thy con tr t c truyn bng tr (by
value) cho hm _strcpy(). Ngha l con tr t p=s p
kim tra *p
c dng bn trong hm ch l bn sao, c th
thay i n (t++) m khng nh hng n chui c truyn.
- Hm _strcat(): m phng strcat( char* s1, const char* s2 ).
Hm strcat() s ni mt bn sao ca chui s2 vo cui chui s1, k t u tin ca
chui s2 s chng ln k t null cui chui s1. Ch l hm strcat() khng c kim
tra bin (bounds checking), lp trnh vin phi bo m rng chui s1 ln cha
c ni dung chui gc v chui s2 thm vo.
Hm _strcat( s, t ) do chng ta vit c hai thao tc: dng con tr p i v cui
chui s (nh hm _strlen()), sau sao chp cc phn t t t sang p (nh hm
_strcpy()).
Vi khai bo: char s[] = "she see sea";
Trnh bin dch s t tnh chiu di ca chui khai bo, k c k t '\0' (tc 12 k
t). C th tnh c chiu di ca chui s bng ton t sizeof:
( ( sizeof s ) / sizeof *s ) ) - 1
ton t sizeof tnh lun c k t '\0' nn phi tr kt qu i 1 cho ging vi kt qu
ca hm strlen(). V char lun c kch thc 1 byte nn c th vit gn hn: sizeof(
s ) - 1
Cng do C chp nhn kiu char c kch thc 1 byte, nn khi cp pht cho con tr
k t vi hm malloc() ta khng cn dng ton t sizeof na.

Bi 115: (trang 35)


#include <stdio.h>

int _strcmp( const char *s, const char *t ) {


for ( ; *s == *t; ++s, ++t )
if ( *s == '\0') return 0;
return *s - *t;
}

char* _strchr( char *s, int c ) {


for ( ; *s; s++ )
if ( *s == c ) return s;
return NULL;
}

char* _strrchr( char *s, int c ) {

184
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


char* p = NULL;
for ( ; *s; ++s )
if ( *s == c ) p = s;
return p;
}

int main() {
char str[] = "jackdaws love my big sphinx of quartz";
char *test[] = { "brown", "blue", "black" };
int n = sizeof test / sizeof *test;
int i, j;

printf( "Chuoi goc s: [%s]\n", str );


printf( "strchr( s, 'm' ) : [%s]\n", _strchr( str, 'm' ) );
printf( "strrchr( s, 'o' ): [%s]\n", _strrchr( str, 'o' ) );

printf( "Sap xep cac chuoi dung strcmp():\n" );


for ( i = 0; i < n; ++i )
for ( j = i + 1; j < n; ++j )
if ( _strcmp( test[i], test[j] ) > 0 ) {
char *t = test[i];
test[i] = test[j];
test[j] = t;
}
for ( i = 0; i < n; ++i )
printf( "%s ", test[i] );
putchar( '\n' );
return 0;
}
Ta thc hin cc hm m phng nh sau:
- Hm _strcmp():
M phng strcmp( const char* s1, const char* s2 ). Hm strcmp() ln lt so
snh cc k t trong hai chui c truyn ti hm ti nhng v tr tng ng theo
th t t u chui n cui chui. Nu trong qu trnh so snh, pht hin k t
khng so trng ti v tr k tng ng trn hai chui, hm tr v:
tr m nu s1[k] < s2[k].
tr dng nu s1[k] > s2[k].
tr 0 nu hai chui ging nhau.
C khng quy nh c th tr tr v, ty cch ci t hm ta nhn c tr tr v l (-
1, 0, 1) hoc (-d, 0, d) (d l khong cch trong bng m ASCII gia hai k t c
pht hin khc nhau).
Ta ci t nh sau: vng lp for s lp khi hai k t ti v tr tng ng trn hai chui
cn ging nhau. Hai k t ny do hai con tr s v t ch n, s v t tng dn sau mi
vng lp. Ch s v t l bin cc b ca hm, tr ca chng c truyn bng tr
n hm, nn s di chuyn ca chng khng nh hng n hai chui. n khi pht
hin *s = '\0', v d nhin lc *t cng bng '\0', v nu khng vng lp ngt
khng vo n thn vng lp, tr v 0 xc nh hai chui ging nhau. Nu pht
hin hai k t khc nhau (*s != *t) hoc mt trong hai chui chm dt, v d chui
t (*s != '\0'), vng lp s ngt.
Vi cch ci t tr tr v (-1, 0, 1) ta tr v: return *s > *t ? 1 : -1;
Vi cch ci t tr tr v (-d, 0, d) ta tr v: return *s - *t;
185
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Cn nh l strcmp() dng so snh cc chui, khng phi cc k t. K t, kiu char,


c C xem nh kiu int, c tr ng nht vi v tr ca chng trong bng m ASCII,
nn c th so snh chng bng cc ton t so snh thng thng. Trong v d minh
ha cch dng hm _strcmp(), ta sp xp mng cc chui theo gii thut Selection
Sort vi iu kin sp xp l so snh gia hai chui bng _strcmp().
- Hm _strchr():
Hm strchr( const char *s, int c ); tr v mt con tr ch n k t c (c
chuyn kiu ngm thnh char) u tin xut hin trong chui s (k t null kt thc
chui v thuc chui nn cng c th c tm). Nu khng pht hin ra k t c, hm
tr v mt con tr NULL.
Ta ci t nh sau: vng lp for c tng s cho n khi pht hin k t c (tr v a
ch s ca k t c) hoc n cui chui (*s = '\0'). Nu vt qua vng lp kim
tra (cha tr v v cha pht hin k t c), ta tr v con tr NULL.
- Hm _strrchr():
M phng hm strrchr( const char *s, int c ). Ging nh hm strchr() nhng
tr v mt con tr ch n k t c xut hin cui cng trong chui s. Nu khng pht
hin ra k t c, hm tr v mt con tr NULL.
C v nh nu tin hnh tm kim t cui chui th s nhanh hn. Tuy nhin, vn
phi i n cui chui bng vng lp hoc gi hm (strlen(), v bn cht cng
tng t). Ta ci t nh sau: chun b mt con tr p cha kt qu, khi to bng
NULL. Tin hnh tm kim c t u chui ging nh hm _strchr(), nhng khi tm
c th khng tr a ch tm c v m lu kt qu vo p, chng ln kt qu c.
C nh th cho n khi kt thc vng lp, p s cha a ch cui cng tm thy c
hoc vn l NULL nu khng tm thy c; tr p v.

Bi 116: (trang 35)


#include <stdio.h>

size_t _strlen( const char *s ) {


const char* p = s;
while ( *p++ ) {}
return p - s - 1;
}

const char* _strchr( const char *s, int c ) {


int i;
for ( i = 0; s[i]; ++i )
if ( s[i] == c ) return s + i;
return NULL;
}

size_t _strspn( const char* s1, const char* s2 ) {


size_t i;
for ( i = 0; s1[i] && _strchr( s2, s1[i] ); ++i ) { }
return i;
}

int _strncmp( const char *s1, const char *s2, size_t len ) {
size_t i;
if ( len > _strlen( s1 ) ) len = _strlen( s1 );
if ( len > _strlen( s2 ) ) len = _strlen( s2 );
186
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


for ( i = 0; i < len; ++i )
if ( s1[i] != s2[i] )
return s1[i] > s2[i] ? 1 : -1;
return 0;
}

const char* _strstr( const char *s1, const char *s2 ) {


size_t len = _strlen( s2 );
for ( ; *s1; ++s1 )
if ( _strncmp( s1, s2, len ) == 0 ) return s1;
return NULL;
}

int main() {
char s1[] = "hom qua qua noi qua ma qua khong qua";
const char* p = s1;
const char* oldp = s1;
char s2[] = "cabbage";

printf( "Chuoi kiem tra : %s\n", s1 );


printf( "Vi tri tu 'qua': " );
while ( ( p = _strstr( p, "qua" ) ) != NULL ) {
printf( "%*c", p - oldp + 1, 'x' );
oldp = ++p;
}
printf( "\nKy tu dau tien cua s = '%s' khong co trong '%s' la s[%lu]\n",
s2, "abc", ( unsigned long )_strspn( s2, "abc" ) );
return 0;
}
Cc hm m phng trong bi tp ny ch dng ch s nn c v d hiu vi bn,
nhng bn cn nh rng thao tc trn chui ch yu c thc hin bng con tr.
Cc bi tp m phng li cc hm trong string.h nhm mc ch nm vng cc thao
tc chi tit trn chui.
- Hm _strspn(): m phng hm strspn( s1, s2 ), hm ny c m t kh kh
hiu trong ti liu, thc t c dng tm ch s ca phn t u tin trong chui
s1 sao cho k t khng c mt trong chui s2.
Ta ci t nh sau: vng lp for duyt cc phn t ca chui s1, ch b ngt bi hai
trng hp: n cui chui (s1[i] = '\0') hoc pht hin ra k t ca s[1] khng
c mt trong s2 (strchar( s2, s1[i] ) == NULL). Tr tr v l ch s i ca phn t
lm vng lp b ngt.
- Hm _strncmp(): m phng hm strncmp( s1, s2, n ), hm ny ging hm
strcmp() nhng so snh s dng sau khi kim tra n k t u tin hoc khi pht hin
ra k t null u tin. Ngha l nu c chui so snh ngn hn n, hm ch tin hnh
so snh len k t vi len l kch thc chui ngn hn.
Ta ci t nh sau: trc ht ta xc nh li n, s bng chiu di chui ngn hn, nu
c chui ngn hn n. Sau ta dng vng lp for duyt n phn t ca chui s1, dng
khi pht hin k t ang xt khc k t v tr tng ng trong chui s2, tr v tr
m hoc dng ty kt qu so snh. Nu vt qua vng lp kim tra, so snh
thnh cng v hm tr v tr 0.

187
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

- Hm _strstr(): m phng hm strstr( s1, s2 ); nu chui con s2 c mt trong


s1, hm tr v v tr xut hin u tin ca chui s2 trong s1, ngc li, hm tr v
con tr NULL.
Ta ci t nh sau: trong vng lp for vi s1 tng lin tc, ta dng hm strncmp()
so snh s1 vi s2 trong strlen(s2) k t. Nu thnh cng, tr v s1; ngc li,
tng s1 v tip tc so snh li. Nu vt qua vng lp m vn cha pht hin c
chui s2 trong s1, tr v con tr NULL.
Cn nhc li rng: mt phn ca chui, bt u t mt k t no trc k t null
kt thc chui, vn c xem nh mt chui:
char s[] = "she see sea";
char* p = s;
puts( p + 4 ); /* chui con: "see sea" */
puts( p += 8 ); /* chui con: "sea" */
a s cc hm x l chui ca C nhn tham s l mt con tr ch n chui cn x
l, tr v mt con tr n chui con hoc NULL nu khng thnh cng. V vy, C
thng dng mt vng lp x l chui in hnh, c minh ha bn di.
/* vng lp x l chui in hnh ca C: in v tr xut hin chui "qua" trong s */
char* p = s;
1) p u tin chnh l chui cn x l
while ( ( p = _strstr( p, "qua" ) ) != NULL )
{ 2) dng kt
qu tm c 4) dng vng lp
3) cp nht li p nu khng tm c
printf( "s[%d] ", p - s ); x l tip
p++;
}
s dng hiu qu cc hm trong string.h, bn cn c bit hiu r cch xy dng
vng lp ny.
Kinh nghim: nu cn xy dng mt hm x l chui no b sung cho cc hm
ca string.h, ta xy dng ging nh cc hm x l chui ca C: nhn char*, tr v
char* hoc NULL nu khng thnh cng.
Trong v d minh ha dng chui nh dng "%*c" dnh ch, y k t x ch t
"qua" n v tr thch hp, xem bi tp 28 (trang 90).
Hm _strstr() do chng ta vit ln hm strstr() ca string.h u tm chui vi
ch so snh nghim ngt, phn bit ch hoa v ch thng (case sensitive).
c th tm chui vi ch insensitive, dng hm sau:
#define islower( c ) ( (c) >= 'a' && (c) <= 'z' )
#define toupper( c ) ( islower((c))? (c) + ('A'-'a') : (c) )
const char* _stristr( const char *s1, const char *s2 ) {
for ( ; *s1; ++s1 ) {
if ( toupper( *s1 ) == toupper( *s2 ) ) {
const char *h, *n;
for ( h = s1, n = s2; *h && *n; ++h, ++n )
if ( toupper( *h ) != toupper( *n ) ) break;
if ( !*n ) return s1;
}
}
return NULL;
}

188
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Mt gii php khc, vn dng strstr(), l chuyn thnh ch hoa c hai chui tham
s. Ta dng hm strupr(), tuy nhin cn nh hm strupr() s chuyn chui n nhn
thnh ch hoa lun nn cn dng strdup() sao chp chui trc khi gi.
Bi tp: Vit hm findByKeyword() tm trong mng cc structure Student nhng
Student c trng name cha keyword nhp t bn phm.
#define MAX 20
typedef struct {
int code;
char name[20];
float mark;
} Student;

void findByKeyword( Student students[], int size ) {


char keyword[20];
char* t;
int i, rsize = 0;
Student results[MAX];
printf( "Keyword? " );
fgets( keyword, 20, stdin );
if ( ( t = strrchr( strupr( keyword ), '\n') ) != NULL ) *t = '\0';
for ( i = 0; i < size; ++i ) {
t = strupr( strdup( students[i].name ) );
if ( strstr( t, keyword ) != NULL )
results[rsize++] = students[i];
}
if ( rsize == 0 ) printf( "Student not found!\n" );
else {
printf( "%-7s %-20s %s\n", "Code", "Name", "Mark" );
printf( "----------------------------------\n" );
for ( i = 0; i < rsize; ++i )
printf( "%-7d %-20s %g\n",
results[i].code, results[i].name, results[i].mark );
}
}

Bi 117: (trang 35)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* left( const char* str, size_t n ) {


char* buf;
size_t len = strlen( str );
if ( n > len ) n = len;
buf = ( char* ) malloc( n + 1 );
buf[n] = '\0';
return strncpy( buf, str, n );
}

char* right( const char* str, size_t n ) {


char *buf;
size_t len = strlen( str );
if ( n > len ) n = len;
buf = strdup( &str[len - n] );
189
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


return buf;
}

int main() {
char str[] = "Kernighan and Ritchie";

printf( "Chuoi goc: [%s]\n", str );


printf( "left( str, 9 ) : [%s]\n", left( str, 9 ) );
printf( "right( str, 7 ): [%s]\n", right( str, 7 ) );
return 0;
}
C hai hm u: x l li chiu di n c truyn cho hp l, cp pht chui kt qu
mi vi chiu di n + 1, cui cng sao chp chui con tch c sang chui kt qu.
Tuy nhin:
- Hm left(): strncpy() b qua k t null kt thc, nn chng ta cn thm k t
null vo cui to k t kt thc cho chui kt qu.
- Hm right(): ch str l mt chui th &str[len - n] cng l mt chui. C u
hiu chng nh a ch: str v str + len - n. Chui &str[len - n] c sao chp
c k t kt thc null nn khng cn quan tm na.

Bi 118: (trang 35)


#include <stdio.h>
#include <string.h>
#include <ctype.h>

char* allTrim( char* s ) {


char* p = s;
/* tm chui c hai space lin tip */
while ( ( p = strstr( p, " " ) ) != NULL )
strcpy( p, p + 1 );
if ( *s == ' ' ) strcpy( s, s + 1 );
p = s + strlen( s ) - 1;
if ( *p == ' ' ) *p = '\0';
return s;
}

char* stdWord( char* s ) {


int i;
if ( !s ) return NULL;
s[0] = toupper( s[0] );
for ( i = 1; s[i]; ++i )
s[i] = tolower( s[i] );
return s;
}

int main() {
char str[] = " 'bJARne? sTROUstRUP' ";
char d[] = " \t\"'?!.,";
char *p = str;

printf( "Chuoi goc : [%s]\n", str );


printf( "Loai space du: [%s]\n", allTrim( str ) );
printf( "Cac tu da chuan hoa:\n" );
while ( ( p = stdWord( strtok( p, d ) ) ) != NULL ) {
190
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


printf( " %s\n", p );
p = NULL;
}
return 0;
}
Chun ha chui l tin hnh cc cng vic:
- Xa tt c cc k t trng u chui, (thng gi l ltrim).
- Xa tt c cc k t trng cui chui, (thng gi l rtrim).
- Vi cc k t trng gia chui, xa v ch cha li ng mt k t trng (thng
gi l mtrim).
Ta s thc hin c ba thao tc x l trn trong hm allTrim().
- Cc k t u mi t c vit hoa, cc k t cn li c vit thng, (thng
gi l capitalize hay title case). Thao tc x l mi t ca chui c thc hin trong
hm stdWord().
Hm allTrim( s ) c ci t nh sau:
- Tm tt c cc chui con c 2 space lin tip trong s v xa i k t space ng
trc trong cp space bng hm strcpy():
strcpy( p, p + 1 ); /* xa 1 k t ni p ch n */
- C th cn mt k t space u chui, kim tra v li xa bng hm strcpy().
- C th cn mt k t space cui chui, kim tra v n gin t li k t ny bng
k t null kt thc chui.
Hm stdWord() ci t nh sau:
- Chuyn cc k t u t thnh k t hoa bng hm toupper() ca ctype.h.
- Dng vng lp chuyn cc k t cn li ca t thnh k t thng bng hm
tolower() ca ctype.h.
x l tt c cc t ca chui ta phi tch cc t ny ra bng hm strtok().
Hm strtok( char *s1, const char *s2 ); tr v mt con tr ch n token (chui
k t theo mt quy tc no ) k tip trong chui ch bi con tr s1, cc k t m
t trong chui s2 c xem nh l cc k t ngn cch (delimiter) gia cc token.
Khi khng c token no c pht hin, hm tr v con tr NULL.
Trong qu trnh tch token (tokenized), hm strtok() lu mt con tr ni ch n
chui cn tch token. Khi strtok() c gi u tin vi tham s th nht l mt
chui, con tr ni c thit lp ch n chui ny. Trong chui cc ln gi sau, tham
s th nht l NULL, con tr ni strtok() s tip tc tch cc token trong chui, t
sau token tch ln u.
Nh vy tch cc t ca chui ta chia lm hai giai on gi hm strtok():
printf( " %s\n", stdWord( strtok( str, d ) ) );
while ( ( p = stdWord( strtok( NULL, d ) ) ) != NULL )
printf( " %s\n", p );
hoc dng vng lp x l chui in hnh nh trong bi 116 (trang 186):
char* p = s;
while ( ( p = stdWord( strtok( p, d ) ) ) != NULL ) {
printf( " %s\n", p );
p = NULL;
}

Bi 119: (trang 36)


#include <stdio.h>
191
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


#include <string.h>
#include <ctype.h>

int main() {
char s[255];
char* p = s;
int freq[7] = { 0 };
int i, count;

printf( "Nhap chuoi: " );


fgets( s, 255, stdin );
count = 0;
while ( ( p = strtok( p, "., " ) ) != NULL ) {
if ( isalpha( p[0] ) ) {
count++;
freq[strlen( p ) - 1]++;
}
p = NULL;
}
printf( "Co %d tu\n", count );
printf( "Tan so xuat hien cac tu:\n" );
for ( i = 0; i < 7; ++i )
printf( "%d[%d] ", i + 1, freq[i] );
putchar( '\n' );
return 0;
}
Bi tp ny n gin dng vng lp x l chui in hnh kt hp vi hm
strtok() (xem bi 118, trang 190) tch cc t trong chui nhp.
Cc t trong chui nhp, nu khng phi s, s c m t v m tn s. Tn s
xut hin cc t c cng s k t lu trong mng freq[7] (t di nht ca ting Vit,
t nghing, ch c 7 k t), s cc t c k k t s c lu ti phn t c ch s k
- 1.

Bi 120: (trang 36)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* insertString( char* s, char* s1, size_t k ) {


char* s2 = strdup( s );
if ( k > strlen( s ) ) k = strlen( s );
strcpy( &s2[k], s1 );
strcpy( &s2[k + strlen( s1 )], &s[k] );
return s2;
}

int main() {
char s[80], s1[80], *t;
unsigned long k;

printf( "Chuoi goc : " );


fgets( s, 80, stdin );
if ( ( t = strrchr( s, '\n' ) ) != NULL ) *t = '\0';

192
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


printf( "Chuoi chen : " );
fgets( s1, 80, stdin );
if ( ( t = strrchr( s1, '\n' ) ) != NULL ) *t = '\0';

printf( "Vi tri chen: " );


scanf( "%lu", &k );
printf( "Chuoi ket qua: %s\n", insertString( s, s1, (size_t) k ) );
return 0;
}
Hnh di m t cch thc hin hm insertString():
s1 c o l l \0
strcpy( &s2[k], s1 )
k + strlen( s1 )

s2 C ' s c o l l l a n g \0
k
strcpy( s2, s ) strcpy( &s2[k + strlen( s1 )], &s[k] )

s C ' s l a n g \0

- Trc ht chui s c sao chp vo s2 bng strdup().


- Ti v tr s2[k] ca chui sao chp vo trn, sao chp chui s1 vo.
- Ti v tr s2[k + strlen( s1 )], tc ti k t null ca chui s1 va sao chp, ta sao
chp on sau ca chui s (tnh t k, tc chui &s[k]) vo tip. K t null ca chui
ny cng l k t null kt thc chui kt qu.

Bi 121: (trang 36)


#include <stdio.h>
#include <string.h>

int removeString( char *s, int start, int count ) {


size_t len = strlen( s );
if ( start > len || start < 0 || len < start + count )
return 1;
strcpy( &s[start], &s[start + count] );
return 0;
}

int main() {
char s[80], *t;
int start, count;

printf( "Nhap chuoi: " );


fgets( s, 80, stdin );
if ( ( t = strrchr( s, '\n' ) ) != NULL ) *t = '\0';
printf( "Nhap vi tri dau: " );
scanf( "%d", &start );
printf( "Nhap so ky tu loai bo: " );
scanf( "%d", &count );
if ( removeString( s, start, count ) ) puts( "Error!" );
else printf( "Chuoi ket qua: %s\n", s );
return 0;

193
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}
start

s f i r e a n d f o x \0
count kt thc chui s
strcpy( s + start, s + start + count )

s f i r e f o x \0 f o x \0
kt thc chui s

Khi xa mt k t hoc mt on trong chui ta khng dng cch dch chuyn phn
t nh mng m dng hm strcpy() ca <string.h>, v thc cht hm ny cng
dch chuyn vng nh. Khi sao chp chui chng ln on chui cn xa, k t null
kt thc ca chui sao chp cng l k t null kt thc ca chui kt qu.

Bi 122: (trang 36)


#include <stdio.h>
#include <string.h>

long bin2dec( char* s ) {


long d = 0;
while ( *s ) d = ( d << 1 ) | ( *s++ - '0' );
return d;
}

int main() {
char s[255], *t;

printf( "Nhap chuoi nhi phan: " );


fgets( s, 255, stdin );
if ( ( t = strrchr( s, '\n' ) ) != NULL ) *t = '\0';

printf( "Tri thap phan: %ld\n", bin2dec( s ) );


return 0;
}
Cho chui nh phn s, ta c tr thp phn tng ng l:
d s[0].2 n 1 s[1].2 n 2 ... s[n 2].2 s[n 1]
t: k n 1
d P(2) s[0].2k s[1].2k 1 ... s[k 1].2 s[k]
Tnh tr ca a thc ny bng phng php Horner, ch phi thc hin k = n-1 php
nhn.
d P(2) (...((s[0].2 s[1]).2 s[2]).2 ... s[k 1]).2 s[k]
Chuyn thnh vng lp, ch chuyn k t s[i] thnh s: s[i] - '0':
d = 0;
for ( i = 0; s[i]; ++i )
d = d * 2 + ( s[i] - '0' );
hoc:
while ( *s )
d = d * 2 + ( *s++ - '0' );
194
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

biu din bng ngn ng ca cc ton t bitwise:


while ( *s )
d = ( d << 1 ) | ( *s++ - '0' );
Lp trnh vin C c thi quen thao tc vi cc ton t cp thp. Vo thi im C ra
i, Brian v Dennis lm vic vi cc ton t bitwise nhiu hn cc ton t lun l,
cho nn h dng 1 k t cho ton t thao tc bit (v d &) v 2 k t cho ton t lun
l (v d &&).
Bi tp: Thc hin tc v ngc li, chuyn s thp phn thnh nh phn.
C s dng stack d dng thc hin bng quy u.
void dec2bin( int n ) {
if ( n / 2 == 0 ) printf( "%d", n % 2 );
else {
dec2bin( n / 2 );
printf( "%d", n % 2 );
}
}
hoc khng quy, dng mng:
void dec2bin( int n ) {
int bin[255], k = -1;
do {
bin[++k] = n % 2;
} while ( ( n /= 2 ) > 0 );
for( ; k >= 0; --k )
printf( "%d", bin[k] );
}

Bi 123: (trang 36)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* addBinStr( char* a, char* b ) {


size_t alen, blen;
int clen, t, carry;
char *c;
alen = strlen( a );
blen = strlen( b );
clen = ( alen > blen ) ? alen + 1 : blen + 1;
c = ( char* )calloc( clen + 1, sizeof( char ) );
if ( !c ) return NULL;
carry = 0;
/* a v b cn phn t */
while ( alen && blen ) {
t = a[alen-1] - 48 + b[blen -1] - 48 + carry;
carry = t / 2;
c[clen-1] = (t % 2) + 48;
alen--; blen--; clen--;
}
/* a cn phn t */
while ( alen ) {
t = a[alen-1] - 48 + carry;
carry = t / 2;
c[clen-1] = (t % 2) + 48;
195
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


alen--; clen--;
}
/* b cn phn t */
while ( blen ) {
t = b[blen-1] - 48 + carry;
carry = t / 2;
c[clen-1] = (t % 2) + 48;
blen--; clen--;
}
/* a v b u ht phn t, xt carry cui */
if ( carry ) c[clen-1] = 1 + 48;
else c++;
return c;
}

int main() {
char a[] = "1101010000110001"; /* 54321 */
char b[] = "11000000111001"; /* 12345 */
char* c;
/* a + b = 10000010001101010 66666 */
printf( "%20s\n", a );
printf( "%20s\n", b );
printf( "%20s\n", "-----------------" );
printf( "%20s\n", c = addBinStr( a, b ) );
free( c );
return 0;
}
Hnh bn di trnh by tm tt cc trng hp cn tnh ton. d hiu, trong hnh
cc phn t cha s (0 hoc 1). Hai chui a v b cha 2 s nh phn a, b; chui c cha
s nh phn l tng a + b.
Nu ch l k t s, s tng ng s l ch - 48 (hoc ch - '0') nu d l s (1 ch
s), k t tng ng l d + 48 (hoc d + '0'). Cn ghi nh iu ny khi ly mt k
t ra tnh ton (chuyn k t thnh s) hoc khi ghi kt qu tnh c vo chui kt
qu (chuyn s thnh k t).
Qu trnh tnh ton tin hnh t phi sang tri trong vng lp, c 3 trng hp phi
gii quyt trong hm addBinStr():
1 a[i] 1 a[i]

carry = t/2 0 c[i] = t%2 carry = t/2 0 c[i] = t%2 1 c[i] = carry

carry 1 0 carry carry 1 0 carry 1 carry

t = a[i]+b[i]+carry 1 b[i] t = a[i]+carry

- C hai chui a v b cn phn t (hnh tri):


c[i] = ( a[i] + b[i] + carry(c) ) % 2
carry(mi) = ( a[i] + b[i] + carry(c) ) / 2
- Ch mt chui (a hoc b) cn phn t (hnh gia): gi s l a, tng t vi b
c[i] = ( a[i] + carry(c) ) % 2
carry(mi) = ( a[i] + carry(c) ) / 2

196
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

- C hai chui a v b u ht phn t (hnh phi): nu cn carry th ghi carry ny


vo c.
c[i] = carry(cn li, bng 1)
Khi cp pht cho chui c, ta dng hm calloc(). Mc tiu l khi to cho cc phn
t ca chui c, c bit l k t kt thc chui. Nu cp pht bng hm malloc(),
bn nh gn phn t cui tr c k t '\0' nh sau:
c = ( char* )malloc( clen + 1 );
if ( !c ) return NULL;
c[clen] = '\0';

Bi 124: (trang 37)


#include <stdio.h>
#include <ctype.h>

void itos( char *s, int n ) {


char *p;
for ( p = s; n > 0; ++p, n /= 10 )
*p = ( n % 10 ) + '0';
if ( p == s ) {
*p++ = '0';
*p = '\0';
} else {
*p = '\0';
for ( --p; p > s; ++s, --p )
{ char t = *p; *p = *s; *s = t; }
}
}

int stoi( const char *s ) {


int d = 0;
while ( *s && !isdigit( *s ) ) s++;
while ( isdigit( *s ) )
d = d * 10 + *s++ - '0';
return d;
}

int main() {
int n;
char s[100];

printf( "Nhap so nguyen duong n: " );


scanf( "%d", &n );

itos( s, n );
printf( "itos() -> %s\n", s );
printf( "stoi() -> %d\n", stoi( s ) );
return 0;
}
Hm itos(): chng ta tch cc ch s thp phn t phi sang tri, chuyn thnh k
t ri lu vo chui t tri sang phi, ngc vi th t bnh thng. Do khng dng
mng ph, cu trc d liu thch hp (stack) hoc quy, nn chng ta s chn cch
o ngc chui kt qu c chui vi th t bnh thng.
Hm itos() c hai giai on:
197
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

- Vng lp vi p, tch ch s thp phn (n % 10) t tri sang phi, chuyn thnh k
t (+ '0' hoc + 48) ri chuyn vo chui ti v tr do p ch n. Kt thc giai on
ny cn ch nhp thm k t null kt thc chui.
- o chui: lc ny s ch phn t u chui v p ch phn t cui chui (khng phi
phn t null). Trong lc hai con tr ny tin li gn nhau (++s v --p), ta hon chuyn
ni dung ca cc phn t do chng ch n vi nhau o ngc chui.
Hm stoi(): thc hin tng t bi 122 (trang 194), dng phng php Horner
nh tr a thc:
d P(10) (...((s[0].10 s[1]).10 s[2]).10 ... s[k 1]).10 s[k]
ch chuyn k t ca chui thnh s tng ng (*s - '0'):
while ( isdigit( *s ) )
d = d * 10 + ( *s++ - '0' );

Bi 125: (trang 37)


#include <stdio.h>
#include <string.h>

char* reverse( char* s ) {


int i;
size_t len = strlen( s );
for ( i = 0; i < len / 2; ++i ) {
char t = s[i];
s[i] = s[len - i - 1];
s[len - i - 1] = t;
}
return s;
}

void multiply( char* a, char* b ) {


char c[20], d[20];
size_t alen, blen;
int i, j, carry, k, l, t;
blen = strlen( b ) - 1;
alen = strlen( a ) - 1;

printf( "%20s\n", a );
printf( "%3c\n", '*' );
printf( "%20s\n", b );
printf( "%s\n", "--------------------" );

/* chun b chui d (cc k t u l '0') lu tng kt qu */


for ( i = 0; i < 20; ++i ) d[i] = '0';

/* l dng trong printf cn chnh kt qu in ra, dch dn sang tri 1 n v


vng lp i tnh mt dng nhn, cng vo tng kt qu, in dng nhn ra */
for ( l = 20, i = 0; b[i]; ++i, --l ) { /* vi mi s b nhn */
/* to chui c, lu kt qu (ngc) ca mt dng nhn */
for ( carry = j = 0; a[j]; ++j ) { /* nhn cho s nhn */
t = ( b[blen - i] - 48 ) * ( a[alen - j] - 48 ) + carry;
carry = t / 10;
c[j] = t % 10 + 48;
}
/* kim tra carry cui ng chui c, kt thc mt dng nhn */
198
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


if ( carry ) { c[j] = carry + 48; c[++j] = '\0'; }
else c[j] ='\0';

/* cng kt qu mt dng nhn t c vo d, bt u ti v tr i


tnh t tri sang (v lu ngc) i vi dng nhn th i */
for ( carry = k = 0; c[k]; ++k ) {
t = ( d[k + i] - 48 ) + ( c[k] - 48 ) + carry;
carry = t / 10;
d[k + i] = ( t % 10 ) + 48;
}
/* k lu v tr cui chui d, dng ng d sau khi cng tt c cc dng nhn */
if ( carry ) { d[k + i] = carry + 48; k += i + 1; }
else k += i;
/* in mt dng nhn, tc in c o ngc, cn chnh bng l */
printf( "%*s\n", l, reverse( c ) );
}

printf( "%s\n", "--------------------" );


d[k] = '\0'; /* ng chui d ti k */
/* in tng kt qu, tc in d o ngc */
printf( "%20s\n", reverse( d ) );
}

int main() {
char a[20], b[20], *t;

printf( "So bi nhan: " );


fgets( a, 20, stdin );
if ( ( t = strrchr( a, '\n' ) ) != NULL ) *t = '\0';

printf( "So nhan : " );


fgets( b, 20, stdin );
if ( ( t = strrchr( b, '\n' ) ) != NULL ) *t = '\0';

multiply( a, b );
return 0;
}
Trc khi thc hin bi ny, hy c v hiu tht r bi 123 (trang 195). Bi tp trn
khng kh, nhng do nhng c im ring khi thao tc vi chui, bn cn thc hin
chnh xc v cn thn. Xem ch thch chi tit trong bi gii, ch cc vn sau:
- Php nhn trong bi tp c thc hin nh sau: tng s ca s b nhn (chui a,
t phi sang tri) s nhn vi chui s nhn (chui b, t phi sang tri). Kt qu lu
trong mt dng nhn, tc chui c, t tri sang phi ( d cng vi chui d).
Php nhn cng c carry (c nh) v khi nhn xong cng cn kim tra carry cui
cng a trn vo chui c v tin hnh ng chui.
- Mi dng nhn c tnh c s c cng vo chui d (chui cha tng kt qu), t
tri sang phi, bt u ti v tr i vi dng nhn th i.
Php cng cng c carry v khi cng xong cng cn kim tra carry cui cng, chui
d cha ng ngay (v cn phi cng thm) nhng phi dng k ghi nh v tr cui
chui. Khi cng xong tt c cc dng nhn, s dng k t null ng chui d ti v
tr k ny.
- Khi tnh xong mt dng nhn c v cng chng vo d. Dng nhn c s c o
ngc li bng hm reverse() v xut ra. cho kt qu xut nh tht, dng l
199
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

cn chnh kt qu in ra, l gim 1 n v vi mi dng nhn nn kt qu cc dng


nhn c xut dch dn sang tri.
- Khi xut tt c cc dng nhn, ngha l cng tt c cc dng nhn vo d v
ng chui d, tng kt qu trong chui d s c o ngc li bng hm reverse()
v xut ra.
Nu khng cn in cc tnh ton trung gian, c th dng gii thut nhn hai s nguyn
di cho kt qu nhanh hn:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* reverse( char* ); /* vit trn */

char* multiple( char* a, char* b ) {


int alen = strlen( a ) - 1;
int blen = strlen( b ) - 1;
int n = alen + blen;
int sum = 0;
int k, m;
char* c = ( char* )malloc( n + 1 );

for ( k = n; k >= 0; --k ) {


for ( m = k; m >= 0; --m )
if ( m <= alen && k - m <= blen )
sum += ( a[m] - 48 ) * ( b[k - m] - 48 );
c[n - k] = ( sum % 10 ) + 48;
sum /= 10;
}
if ( sum ) c[++n] = sum + 48;
c[++n] = '\0';
return reverse( c );
}

int main() {
char a[] = "87654321";
char b[] = "12345678";

printf("%s * %s = %s\n", a, b, multiple( a, b ) );


return 0;
}

Bi 126: (trang 37)


#include <stdio.h>
#include <string.h>

void occur( const char *s, char c ) {


const char* p = s;
while ( ( p = strchr( p, c ) ) != NULL ) {
printf( "%u ", p - s );
p++;
}
putchar( '\n' );
}

200
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


int main() {
char s[100], *t, c;

printf( "Nhap chuoi: " );


fgets( s, 100, stdin );
if ( ( t = strrchr( s, '\n' ) ) != NULL ) *t = '\0';
printf( "Tim ky tu nao? " );
scanf( "%c", &c );
printf( "Vi tri xuat hien: " );
occur( s, c );
return 0;
}
Bi tp ny cng dng vng lp x l chui in hnh tng t nh bi 116 (trang
186). Tuy nhin, v cn tm v tr xut hin ca k t nn hm x l chui dng trong
vng lp l hm strchr().

Bi 127: (trang 37)


#include <stdio.h>
#include <stdlib.h>

int _isalpha( char c ) {


return ( c >= 'A' && c <= 'Z' ) || ( c >= 'a' && c <= 'z' );
}

size_t _strlen( const char* s ) {


const char* p = s;
while ( *p++ ) { }
return p - s - 1;
}

char* reverseWord( char* s ) {


/* con tr p1 ch cui chui gc */
char *p1 = s + _strlen( s ) - 1;
/* s1 l chui kt qu, con tr q ch chui s1 */
char *s1 = ( char* )calloc( 1, _strlen( s ) + 1 );
char *q = s1;
char *p2, *p3;
p2 = p1;
/* x l t cui chui s ln u */
do {
/* sao chp nhng k t khng phi alphabet cui chui s sang s1 */
while ( p2 >= s && !_isalpha( *p2 ) ) { *q++ = *p2--; }
/* ly tng t, p1 d tm u t, p2 gi ui t */
p1 = p2;
if ( p1 >= s ) {
/* dch chuyn p1 ln u chui tm u t */
while ( p1 > s && _isalpha( *( p1 - 1 ) ) ) p1--;
/* p3 dng sao chp t tm c sang chui q */
p3 = p1;
while ( p3 <= p2 ) { *q++ = *p3++; }
/* cp nht li p2 */
p2 = p1 - 1;
}
} while ( p1 >= s );
return s1;
201
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}

int main() {
char s[] = " cam khong duoc do rac ";
char* s1 = reverseWord( s );

printf( "Chuoi goc: [%s]\n", s );


printf( "Chuoi dao: [%s]\n", s1 );
free( s1 );
return 0;
}
Cch tin hnh o t trong chui ch thch chi tit trong chng trnh. Hnh di
minh ha hai thao tc x l chnh trong hm reverseWord().
p2

s c u p w o r l d \0

copy k t
*q++ = *p2-- khc alphabet

s1 \0

q
p1 tm t p2

s c u p w o r l d \0
copy t p3
*q++ = *p3++

s1 w o r l d \0

- Sao chp nhng k t khng phi alphabet: nhng k t ny do con tr p2 ch n,


con tr p2 va duyt cc k t ny t cui chui ra trc, va sao chp chng sang
chui kt qu, ti v tr con tr q. Ch pht biu sao chp c trng:
*q++ = *p2--;
- Sao chp mt t:
Trc ht cn xc nh phm vi mt t: lc bt u duyt mt t con tr p2 ch
cui t, con tr p1 xut pht t p2 tm ngc ra trc n u t. Nh vy p1 v p2
xc nh phm vi mt t.
Tip theo l sao chp t: con tr p3 va duyt cc k t ny t p1 n p2, va sao
chp chng sang chui kt qu, ti v tr con tr q, cng bng pht biu sao chp c
trng:
*q++ = *p3++;
Sau con tr p2 cp nht li v tr, ch n phn t khng phi alphabet u tin
trc t, hai thao tc trn li lp li. Cn ch kim tra bin, bo m khng vt
qu u mng. Nhc li, kim tra bin (bounds checking) l cng vic quan trng
nht ca lp trnh vin C khi lm vic vi mng hoc chui.
202
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Chui ch s1 c cp pht bng calloc(), mc ch l cc phn t u khi to


bng 0, mc nhin c trc phn t '\0' cui chui.
Vi s h tr ca cc hm x l chui trong <string.h>, cc thao tc x l tin hnh
d dng hn rt nhiu v ch cn mt con tr p duyt ngc ton chui gc.
- Sao chp nhng k t khng phi alphabet: con tr p va duyt va sao chp tng
k t ny vo chui tm t, sau dng hm strcat() ni chui tm t vo cui chui
kt qu s1.
- Sao chp mt t: sau khi vt qua cc k t khng phi alphabet, con tr p tip tc
di chuyn ti u t k tip, n k t khng phi alphabet mi ngay trc t. Ti
y, dng hm strtok() tch t ra ri li dng hm strcat() ni t tch c
vo cui chui kt qu s1.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main() {
char s[] = " con co con an con ca con ";
char *s1 = ( char* )calloc( 1, strlen( s ) + 1 );
char *t = ( char* )calloc( 1, strlen( s ) + 1 );
int i;
char *p = s + strlen(s) - 1; /* con tr p ch cui chui gc */

printf( "Chuoi goc: [%s]\n", s );


do {
i = 0;
/* sao chp nhng k t khng phi alphabet cui chui s sang t */
while ( p >= s && !isalpha( *(p) ) )
t[i++] = *p--;
t[i] ='\0';
/* dng strcat ni vo cui chui kt qu s1 */
strcat( s1, t );
/* dch chuyn p ln u chui tm u t */
while ( p >= s && isalpha( *(p) ) ) p--;
if ( p >= s ) {
p++;
/* dng strtok tch t ri dng strcat ni vo cui chui kt qu s1 */
if ( ( p = strtok( p, t ) ) != NULL )
strcat( s1, p );
p--;
}
} while( p >= s );
printf( "Chuoi dao: [%s]\n", s1 );
free( t );
free( s1 );
return 0;
}

Bi 128: (trang 37)


#include <stdio.h>
#include <string.h>

char* maxW( char *s, int *oldMax ) {


203
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


char *p = strdup( s );
char *t = NULL;
while ( ( p = strtok( p, " " ) ) != NULL ) {
if ( strlen(p) > *oldMax ) *oldMax = strlen( t = p );
p = NULL;
}
return t;
}

void maxWords( char *s ) {


char *t;
char *p = s;
int oldMax = 0;
while ( ( t = maxW(p, &oldMax ) ) != NULL ) {
printf( "%s[%d] ", t, oldMax-- );
p = strstr( p, t ) + strlen( t );
}
}

int main() {
char s[255];

printf( "Nhap chuoi: " );


scanf( "%254[^\n]s", s );

maxWords( s );
putchar( '\n' );
return 0;
}
Hm maxW( char* s, int *oldMax ) s tr v t di nht tm thy u tin trong
chui s. Kch thc ca t ny phi ln hn oldMax truyn cho hm, mc tiu tm
t di nht (cng kch thc) k tip. thc hin iu ny, maxW() dng strtok()
tch cc t v so snh kch thc vi oldMax, oldMax c cp nht vi t di hn
tm thy. oldMax truyn bng con tr nn thay i khi maxW() thc thi xong.
Hm maxWords() s dng vng lp x l chui in hnh. Sau khi gi maxW() vi
oldMax bng 0 xut t di nht tm thy u tin, t t, bn ch n cch vng
lp x l tip:
- Gim oldMax i 1 n v, do maxW() tm cc t di hn oldMax nn ch tm c cc
t c kch thc bng t di nht tm thy u tin.
- Chui tm tip, tc chui truyn cho maxW() bt u ngay sau t t. Ta cp nht
p xc nh chui ny: dng strstr() tm t t trong p c ri di chuyn p n ngay
sau t t ny xc nh chui tm tip.

Bi 129: (trang 38)


#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main() {
char s[80], *t;
size_t i, j;

printf( "Nhap chuoi (chua it nhat 4 so): " );


204
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


fgets( s, 80, stdin );
if ( ( t = strrchr( s, '\n' ) ) != NULL ) *t = '\0';

for ( i = 0; s[i]; ++i )


if ( !isdigit( s[i] ) )
{ strcpy( s + i, s + i + 1 ); i--; }

if ( strlen( s ) < 4 )
{ printf( "Phai co it nhat 4 so\n" ); return 0; }

for ( i = 0; i < 4; ++i ) {


size_t maxpos = i;
for ( j = i; j < strlen( s ) + i - 3; ++j )
if ( s[maxpos] < s[j] ) maxpos = j;
if ( maxpos > i ) strcpy( s + i, s + maxpos );
}
s[4] = '\0';
printf( "So lon nhat con lai: %s\n", s );
return 0;
}
Chui nhn vo c x l nh sau:
s 4 3 2 1 9 8 7 6 9 5 7 2 8 \0
tm s ln nht maxpos ch tm
n y
strcpy( s + i, s + maxpos )

s 9 8 7 6 9 5 7 2 8 \0
j ch tm
n y

s 9 9 5 7 2 8 \0
ch tm
i n y

s 9 9 7 2 8 \0
ch tm
n y

s 9 9 7 8 \0
- u tin loi b tt c cc k t khng phi s: kim tra bng isdigit() ca ctype.h
v xa bng strcpy() ca string.h. Sau khi xa phi li con tr li v k t pha sau
chng ln v tr xa nn c kh nng b b qua khi vng lp duyt tip (xem bi
64, trang 119) .
- Kim tra chiu di chui (ch cha s) cn li, bo m chiu di phi > 4.
- S abcd c tr ln nht khi a b c d . Trn c s ny, ta tin hnh tuyn
ln lt cc s (mt k t) ln nht, ln th hai, t u chui n cui to
chui cn li c tr ln nht.

205
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Ch gii hn cui ca vng lp tm s ln nht. Gii hn ny bo m s phn t


chn c t nht l 4 phn t. Nu khng, sau khi chn mt phn t, c kh nng
khng cn s phn t chn na.

Bi 130: (trang 38)


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int PatternSearch( char *s1, char *s2 ) {


char* pat[100] = { 0 };
char* p = strdup( s2 );
int i = 0;
while( ( p = strtok( p, "*" ) ) != NULL ) {
pat[i++] = p;
p = NULL;
}

p = s1;
i = 0;
while ( pat[i] && ( p = strstr( p, pat[i] ) ) != NULL ) {
p += strlen( pat[i] );
i++;
}
if ( ( s2[0] != '*' && strstr( s1, pat[0] ) != s1 ) ||
( s2[strlen( s2 ) - 1] != '*' &&
strcmp( s1 + strlen( s1 ) - strlen( pat[i - 1] ), pat[i - 1] ) )
)
return 0;
return ( !pat[i] );
}

int main() {
char* str[] = { "television", "menu", "editions", "education" };
char* pattern[] = { "*e*u*", "e*i*n", "*e*o*" };
int i, j, n = 4, m = 3;

printf( "Danh sach cac tu: " );


for ( i = 0; i < n; ++i ) printf( "%s ", str[i] );

for ( j = 0; j < m; ++j ) {


printf( "\nTim [%s]: ", pattern[j] );
for ( i = 0; i < n; ++i )
if ( PatternSearch( str[i], pattern[j] ) )
printf( "%s ", str[i] );
}
putchar( '\n' );
return 0;
}
u tin ta tch cc token trong chui mu s2, vi delimiter l k t '*', t vo
mng chui pat. Sau ta dng hm strstr() kim tra xem cc token ny c tm
thy trong chui cn kim tra s1 khng, ch cc iu kin:

206
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

- Cc token phi c tm thy ln lt theo th t trong s1: khi tm thy token


pat[i], tng con tr d tm (p += strlen(pat[i]) vt qua token tm thy ri mi
tm vi token k tip pat[i + 1].
- Cc token phi tm thy y trong s1: xc nh yu cu ny bng cch sau khi
ra khi vng lp while kim tra xem pat[i] c bng null hay khng. Ch mng
chui pat khi to cc phn t u bng null trc khi nhn token.
Chng ta cng cn gii quyt hai trng hp c bit:
- Khng c k t '*' u chui s2: v d [e*i*n] khng so trng television. Khi
, con tr tm pat[0] (token u tin) trong s1 phi trng vi s1.
- Khng c k t '*' cui chui s2: v d [e*i*n] khng so trng editions. Khi
, con tr tm pat[i - 1] (token cui, sau khi ra khi vng while kim tra) trong
s1 phi trng vi chui con cui s1 c kch thc tng t.

Bi 131: (trang 38)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int isSym( char *s ) {


char* l = s;
char* r = s + strlen( s ) - 1;
do {
while ( !isalpha( *l ) ) l++;
while ( !isalpha( *r ) ) r--;
if ( tolower( *l++ ) != tolower( *r-- ) ) return 0;
} while ( l < r );
return 1;
}

void delChar( char *s, char c ) {


char* p = s;
while ( ( p = strchr( p, c ) ) != NULL )
strcpy( p, p + 1 );
c = isupper( c ) ? tolower( c ) : toupper( c );
p = s;
while ( ( p = strchr( p, c ) ) != NULL )
strcpy( p, p + 1 );
}

int main() {
char s[100], c, *t;

printf( "Nhap chuoi: " );


fgets( s, 100, stdin );
if ( ( t = strrchr( s, '\n' ) ) != NULL ) *t = '\0';
if ( isSym( s ) ) printf( "Chuoi doi xung\n" );
else printf( "Chuoi khong doi xung\n" );
printf( "Xoa ky tu nao? " );
scanf( "%c", &c );
delChar( s, c );
printf( "%s\n", s );
return 0;
207
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}
Kim tra chui i xng khng th da vo ch s cc phn t trong chui, nh so
snh cp s[i] vi s[strlen(s) - i - 1], v trong chui cn nhng k t khng phi
alphabet, ta cn b qua khng quan tm n cc k t ny.
Trong vng lp kim tra do while:
- Vng lp con while vi bin m l dng vt qua cc k t khng phi alphabet
nu c, k t u mng.
- Vng lp con while vi bin m r dng vt qua cc k t khng phi alphabet
nu c, k t cui mng.
Khi c hai vng lp con trn chm dt:
- Nu l < r, ngha l r ch mt k t alphabet u chui, l ch mt k t alphabet
cui chui, i xng vi r (theo ngha khng quan tm n cc k t khng phi
alphabet). Ta so snh chng dng ch thng. Nu hai k t ny ging nhau, tng
l v gim r kim tra tip; ngc li tr v False.
- Vng lp do while chm dt khi l r, qu trnh kim tra thnh cng, tr v True.
xa k t ch nh, ta dng vng lp x l chui in hnh hai ln: mt ln
dng xa k t ch thng, mt ln dng xa k t ch hoa hoc ngc li.
Bi tp: Nhp mt chui k t:
- Xut v tr v m cc k t l nguyn m trong chui.
- Xut v m cc chui con i xng c 5 k t.
Nhap chuoi: nhuthuhuhu
[2] [5] [7] [9]
Co 4 nguyen am
huhuh
uhuhu
Co 2 chuoi 5 ky tu doi xung

#include <stdio.h>
#include <string.h>
#define MAX 100

int main() {
char s[MAX];
char s1[6] = { 0 };
char *p = s;
int i, n, c1 = 0, c2 = 0;

printf( "Nhap chuoi: " );


scanf("%99[^\n]s", s);

for ( ;*p; p++ )


if ( strchr( "aeiou", *p ) != NULL && ++c1 )
printf("[%u] ", p - s );
printf( "\nCo %d nguyen am\n", c1 );
n = strlen( s ) - 4;

for ( i = 0; i < n; ++i )


if ( s[i] == s[i + 4] && s[i + 1] == s[i + 3] && ++c2 )
printf( "%s\n", strncpy( s1, s + i, 5 ) );
printf( "Co %d chuoi 5 ky tu doi xung\n", c2 );
return 0;
}
208
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 132: (trang 38)


#include <stdio.h>
#include <string.h>

int main() {
char a[80], b[80];

printf( "Nhap chuoi a: " );


fgets( a, 80, stdin );
printf( "Nhap chuoi b: " );
fgets( b, 80, stdin );
if ( strtok( a, b ) == NULL && strtok( b, a ) == NULL )
printf( "Tao tu cung cac ky tu\n" );
else
printf( "Co ky tu khac nhau\n" );
return 0;
}
Nhc li, tham s th hai ca hm strtok() l mt chui cha cc k t ngn cch
(delimiter) gia cc token m strtok() cn phi tch ra t chui l tham s th nht.
Nh vy:
- Nu strtok( a, b ) == NULL, ngha l a ch cha cc k t ca b, v a ch cha
ton cc k t ngn cch nn khng tch c token.
- Tng t, nu strtok( b, a ) == NULL, ngha l b ch cha cc k t ca a.
Nu c hai trng hp trn cng xy ra, a v b c to ra vi cng tp k t.

Bi 133: (trang 38)


#include <stdio.h>
#include <string.h>
#include <ctype.h>

int convert( char c ) {


if ( !isxdigit( c ) ) return -1;
if ( isdigit( c ) ) return c - '0';
if ( islower( c ) ) return c - 'a' + 10;
return c - 'A' + 10;
}

unsigned long hextoulong( char* s ) {


int i;
unsigned long n = 0;
for ( i = 0; s[i]; ++i ) {
int t = convert( s[i] );
if ( t == -1 ) return t;
n = n * 16 + t;
}
return n;
}

int main() {
char s[10], *t;
unsigned long n;

209
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


printf( "Nhap chuoi hex: " );
fgets( s, 10, stdin );
if ( ( t = strrchr( s, '\n' ) ) != NULL ) *t = '\0';

if ( ( n = hextoulong( s ) ) == -1 )
printf( "Chuoi chua ky tu khong hop le\n" );
else
printf( "Decimal: %lu\n", n );
return 0;
}
Phng php Horner trnh by trong phn hng dn, tng qut nh sau:
d P(16) (...((s[0].16 s[1]).16 s[2]).16 ... s[n 2]).16 s[n 1] xem
bi 122 (trang 194, nh phn thp phn) v 124 (trang 197, chui s thp phn)
Khi tnh ton, hm convert() s nh x tng k t hex thnh tr thp phn c th.

Bi 134: (trang 39)


#include <stdio.h>

int convert( char* s, int i ) {


char c = s[i];
if ( c == 'M' ) return 1000;
if ( c == 'D' ) return 500;
if ( c == 'C' ) return 100;
if ( c == 'L' ) return 50;
if ( c == 'X' ) return 10;
if ( c == 'V' ) return 5;
if ( c == 'I' ) return 1;
return 0;
}

int rtoi( char* s ) {


int n, a, i;
a = n = convert( s, 0 );
for ( i = 1; s[i]; ++i ) {
int b = convert( s, i );
if ( 10 * a < b ) return 0;
n += b;
if ( b > a ) n -= 2 * a;
a = b;
}
return n;
}

int main() {
int n;

printf( "MCMXCIX = " );


if ( ( n = rtoi( "MCMXCIX" ) ) == 0 )
printf( "So khong hop le\n" );
else
printf( "%d\n", n );
printf( "MCMIC = " );
if ( ( n = rtoi( "MCMIC" ) ) == 0 )
printf( "So khong hop le\n" );

210
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


else
printf( "%d\n", n );
return 0;
}
Hm convert() s nh x k t s[i] thnh tr thp phn c th.
Trn lut to s La m, vi cp k t La m ab :
- Nu a b, tr thp phn ca chng s l (tr ca a + tr ca b).
- Nu a < b:
Nu 10 * a < b, sai lut to s La m, hm tr v 0 (h thng s La m khng c s
0). Ngc li, tr thp phn ca chng s l (tr ca b - tr ca a). V tr ca a c
cng dn vo tng chung trc khi so snh nn ta dng cng thc tng ng sau:
(tr ca a + tr ca b) - 2 * (tr ca a)

Bi 135: (trang 39)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* strrepl( char* s, char* pat, char* rep ) {


size_t plen, rlen, d = 0;
char *t, *p, *q = s;
if ( !strcmp( pat, rep ) )
return strdup( s );
plen = strlen( pat );
rlen = strlen( rep );
while ( ( p = strstr( q + d, pat ) ) != NULL ) {
d = p - q + rlen;
t = ( char * )calloc( strlen( q ) + rlen - plen + 1, sizeof( char ) );
if ( !t ) return NULL;
strncpy( t, q, p - q );
strncpy( t + ( p - q ), rep, rlen );
strcpy( t + ( p - q ) + rlen, p + plen );
free( q );
q = t;
}
return d ? q : s;
}

int main() {
char s[] = "Ta mo thay em o mot noi em xa lam";
char pat[] = "em";
char rep[] = "em yeu";
char* t = strrepl( s, pat, rep );

printf( "Chuoi goc: %s\n", s );


printf( "Thay the '%s' voi '%s'\n", pat, rep );
printf( "Chuoi moi: %s\n", t );
return 0;
}
Ch chui thay th c th:
- cha chui tm kim.
- ging vi chui tm kim.

211
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

- di hoc ngn hn chui tm kim.


- chui rng.
Hm strrepl( char* s, char* pat, char* rep ), dng thay th tt c chui con
pat trong chui s bng chui con rep, hot ng nh sau:
p, do srtstr() tr v
plen

s c a t \0

1) strncpy(q, s, p - s) 3) strcpy(q+(p-s)+rlen, p+plen)

q l i o n \0

2) strncpy(q+(p-s), rep, rlen)

rep l i o n
rlen
- Tr v NULL trong trng hp khng c thay th no xy ra: rep ging pat hoc
khng c pat trong s.
- Tm v tr cn thay th p bng hm strstr().
- Cp pht mt chui q mi, va cha chui kt qu.
- Ln lt sao chp: on trc chui thay th, chui thay th, on sau chui thay
th; to thnh chui kt qu. Ch dng hm x l chui thch hp v tnh ton
chnh xc v tr bt u ca ni s sao chp chui n.

Bi 136: (trang 39)


#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main() {
char s[100];
char delimiter[] = " \t\"'?!.,:;";
char freq[26] = { 0 };
char *p;
int lines, words, i;

lines = words = 0;
while ( fgets( s, 100, stdin ) != NULL ) {
char *t = strrchr( s, '\n' );
if ( t != NULL ) *t = '\0';
lines++;
if ( strcmp( s, "") == 0 ) continue;

for ( i = 0; s[i]; ++i )


if ( isalpha( s[i]) ) freq[toupper(s[i]) - 'A']++;

p = s;
while ( ( p = strtok( p, delimiter ) ) != NULL )
{ words++; p = NULL; }
212
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}
printf( "%d hang, %d tu, voi tan so cac ky tu:\n", lines, words );
for ( i = 0; i < 26; ++i ) {
printf( "%c: %d\t", i + 'A', freq[i] );
if ( i > 0 && ( i + 1 )%7 == 0 ) putchar( '\n' );
}
putchar( '\n' );
return 0;
}
Ta x l mi dng nhp nh sau:
- X l s b: xa k t '\n' do fgets() lu v kim tra dng rng.
- m dng: vi mi vng lp, ngha l vi mi ln fgets() hot ng thnh cng,
tng bin m dng lines.
- m tn s xut hin cc ch ci: dng mng freq[26] (cho 26 ch ci ting Anh).
Duyt chui, vi mi ch ci tng tn s ca n ti phn t tng ng trong mng
freq.
- m t: dng vng lp x l chui in hnh vi strtok(), tch tng t v tng
bin m t words.

Bi 137: (trang 39)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void allTrim( char* s ) {


char* p;
while ( ( p = strstr( s, " " ) ) != NULL )
strcpy( p, p + 1 );
if ( *s == ' ' ) strcpy( s, s + 1 );
p = s + strlen( s ) - 1;
if ( *p == ' ' ) *p = '\0';
}

int main() {
char s[30];
char sname[4] = " x.";
char *p, *out;
char name[100][30];
int line, i;

line = 0;
while ( fgets( s, 30, stdin ) != NULL ) {
char* t = strrchr( s, '\n' );
if ( t != NULL ) *t = '\0';
if ( strcmp( s, "" ) == 0 ) continue;
allTrim( s );
/* ly t cui ca chui, t lu v tr t ny */
p = strrchr( s, ' ' );
t = p + 1;
out = strdup( t );
strcat( out, ", " );
/* ly t u bng strtok(s), trn t */
if ( ( p = strtok( s, " " ) ) != NULL )

213
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


strcat( out, p );
/* ly cc t sau bng strtok(NULL), chuyn thnh dng vit tt */
while ( ( p = strtok( NULL, " " ) ) != t ) {
sname[1] = p[0]; /* k t x trong chui sname thnh tn vit tt */
strcat( out, sname );
}
/* lu vo mng chui name */
strcpy( name[line++], out );
}
for ( i = 0; i < line; ++i )
printf( "%s\n", name[i] );
return 0;
}
S tho lp mt chui c m t trong hnh di:
strrchr t
George Frederic Handel
s p[0] = 'F'
strtok(NULL, " ")
strtok(s, " ")
strdup strcat strcat " x."
out
Handel, George F. sname

strcat

Bi 138: (trang 40)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 50

int main() {
char s[MAX + 1];
char* lines[100];
int i, n = 0;

while ( fgets( s, MAX, stdin ) != NULL ) {


char* t = strrchr( s, '\n' );
if ( t != NULL ) *t = '\0';
if ( strcmp( s, "" ) == 0 ) continue;
lines[n] = ( char* )malloc( MAX + 1 );
snprintf( lines[n], MAX - ( t - s ) + strlen( s ) + 1,
"%*c%s", MAX - ( t - s ), ' ', s );
n++;
}
for ( i = 0; i < n; ++i ) {
printf( "%s\n", lines[i] );
free( lines[i] );
}
return 0;
}

Hm sprintf(char *buf, const char *format, ...); hot ng tng t printf(),


nhng n ghi kt qu ra mt chui buf (c k t null cui chui), ch khng xut ra
214
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

thit b xut chun (stdout). Nh vy, hm sprintf() cung cp cho chng ta mt


cch lp rp chui theo mun. Tham s th nht ca sprintf() l a ch ca
chui ch, cc tham s cn li tng t printf().
Tuy nhin, hm ny c khuyn co l khng an ton do cc tham s c th lm
trn buf. Thay th bng:
snprintf(char *buf, size_t n, const char *format, ...);
V chui nh dng "%*", xem bi 28 (trang 90).

Bi 139: (trang 40)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

char* pack( char* s ) {


char *s1, *p, *t;
size_t d;
s1 = strdup( s );
p = t = s;
d = 0;
do {
while ( *p == *t ) t++;
if ( t - p > 1 ) {
char buf[5];
itoa( t - p, buf, 10 );
d += snprintf( s1 + d, strlen( buf ) + 2, "%s%c", buf, *p );
} else
d += snprintf( s1 + d, 2, "%c", *p );
p = t;
} while ( *t );
return s1;
}

char* unpack( char* s ) {


char *s1;
size_t d, i;
for ( d = i = 0; s[i]; ++i )
if ( isdigit( s[i] ) ) {
int k = ( s[i] - '0' );
while ( isdigit( s[++i] ) )
k = ( k * 10 ) + ( s[i] - '0' );
d += k;
} else d++;
s1 = ( char* )calloc( d + 1, sizeof( char ) );

for ( d = i = 0; s[i]; ++i )


if ( isdigit( s[i] ) ) {
int k = ( s[i] - '0' );
while ( isdigit( s[++i] ) )
k = ( k * 10 ) + ( s[i] - '0' );
memset( s1 + d, s[i], k );
d += k;
} else d += snprintf( s1 + d, 1, "%c", s[i] );
return s1;

215
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}

int main() {
char s[] = "aaabccccddddeeeeeeeeeeeefghhhhhhiiiiaaaabbbbbbc";
char* t;

printf( "Chuoi goc: %s\n", s );


t = pack( s );
printf( "Nen : %s [%.1f%%]\n", t, strlen( t ) * 100.0 / strlen( s ) );
printf( "Giai nen : %s\n", t = unpack( t ) );
return 0;
}
Hm snprintf() (bi 138, trang 214) tr v mt s int l chiu di ca chui do hm
to thnh (khng tnh k t null).
Hm void *memset(void *buf, int ch, size_t count); sao chp tr ch (chuyn
kiu thnh unsigned char) n count byte u tin ca vng nh ch bi buf.
Hm itoa(int value, char* buf, int radix); chuyn tr value di h s radix
thnh chui buf.
Mi cp nn na bao gm phn s n (n > 1, c th c nhiu k t) v k t a.
Hnh di m t cch nn v gii nn run:

p t
s 3 a b \0
s a a a b \0
snprintf
memset(s1+d, 'a', 3)
t-p *p

s1 3 a \0 s1+d a a a \0
d=0
s1+d

- Nn run: (hnh bn tri) hiu ca hai con tr p (ch u run) v t (dng trong
vng lp d tm cui run) xc nh chiu di ca run, cng l phn s trong
cp nn. K t trong cp nn chnh l ni dung ca phn t do p tr n. Cp nn
c hm snprintf() t vo chui kt qu s1 ti v tr d (tc s1 + d). Tr d l kt
qu tr v ca hm snprintf(), tr d c khi to bng 0 (u chui s1) v s c
cp nht lin tc xc nh chnh xc ni t cp nn k tip vo.
- Gii nn run: (hnh bn phi) phn s trong cp nn c ly ra v chuyn thnh
s trc. N c dng nh tham s th ba ca hm memset() xc nh s byte
s c thit lp bi memset(), tc chiu di run. K t k tip c dng nh
tham s th hai ca hm memset(), l k t c thit lp cho ton b run. Hm
memset() bt u hot ng t s1 + d. Tr d khi to bng 0 v s c cp nht lin
tc xc nh chnh xc ni hm memset() bt u hot ng.
Vi run mt k t khng nn, gii thut n gin nn khng m t y.
Trc khi gii nn, chui nn c duyt xc nh chiu di chui gii nn, gip
cp pht chnh xc.

Bi 140: (trang 40)


#include <stdio.h>
#include <ctype.h>
216
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

int IsISBN( char* ISBN ) {


int i, k, c, sum;

k = 10;
for ( sum = i = 0; ISBN[i]; ++i )
if ( isdigit( ISBN[i] ) || toupper( ISBN[i] ) == 'X' ) {
c = ( toupper( ISBN[i] ) == 'X' ) ? 10 : ISBN[i] - '0';
sum += c * k;
k--;
}
return ( sum % 11 == 0 );
}

int main() {
char* s = "0-13-362658-X";
if ( IsISBN( s ) ) printf( "ISBN %s hop le\n", s );
else printf( "ISBN %s khong hop le\n", s );
return 0;
}
Xem chui ISBN nh mng cc k t, cc k t tch ra c kim tra bng hm
isdigit() hoc so snh vi 'X' chc l cc k t hp l ca ISBN, loi cc k t
ni hyphen. K t s c chuyn thnh s (tr cho '0'), k t 'X' c chuyn
thnh 10. Sau thc hin theo thut ton gii thiu.
Cn mt thut ton khc dng kim tra s ISBN: ly tng s ca ISBN (tr s cui,
gi l check digit) nhn vi s th t ch v tr ca n (bt u t 1, tnh t tri sang
phi, khng tnh du ni ). S d ca php chia tng cc tch nhn c cho 11 nu
bng check digit th s ISBN c kim tra l hp l. V d:
ISBN 0 1 3 1 - 1 0 3 7 0 9
V tr 1 2 3 4 5 6 7 8 9 Khng tnh
Tch 0 + 2 + 9 + 4 + 5 + 0 + 21 + 56 + 0 = 97
97 chia cho 11 d 9, bng check digit, vy s ISBN trn hp l.
int IsISBN( char* ISBN ) {
int i, k, c, sum, len;
len = strlen( ISBN );
k = 1;
for ( sum = i = 0; i < len - 1; ++i )
if ( isdigit( ISBN[i] ) ) {
sum += k * ( ISBN[i] - '0' );
k++;
}
c = ( toupper( ISBN[len - 1] ) == 'X' ) ? 10 : ISBN[len - 1] - '0';
return ( sum % 11 == c );
}

Bi 141: (trang 41)


#include <stdio.h>

double population( int year ) {


if ( year == 2000 ) return 8E + 9;
return population( year - 1 ) * ( 1 + 0.025 );
}

217
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

int main() {
printf( "%.f nguoi\n", population( 2010 ) );
return 0;
}
Chng ta c th dng cch tip cn nh sau vit mt hm quy:
1. nh ngha chnh xc vn cn gii quyt. Tt nht l trnh by n di dng
mt biu thc truy hi.
2. Xc nh quy m (kch thc, size) ca vn . Kch thc ny s c truyn
nh tham s n hm v s thay i (thng l thu nh) sau mi ln gi hm.
3. Xc nh v gii quyt trng hp c s, ngha l trng hp m vn c th
c gii quyt khng quy, thng l iu kin u (initial condition) ca biu
thc truy hi. y chnh l im dng quy, nu khng nh ngha, hm quy s
thc hin n khi trn stack.
4. Xc nh v gii quyt trng hp tng qut, thng da vo biu thc truy hi
hoc tnh cht quy ca vn . Gii quyt trng hp tng qut theo cch quy
thng l thu nh quy m vn chuyn dn n v trng hp c s.
V d cho bi tp trn:
1. Biu thc truy hi:
8.109 y 2000

Py 2.5
Py 1 Py 1
100
2. Kch thc quy: nm (year), s gim cho mi ln gi quy.
3. Trng hp c s: gii quyt da vo iu kin u P2000 8.109
4. Trng hp tng qut: gii quyt da vo biu thc truy hi Py Py 1(1 2.5%)
T phn tch trn bn d dng vit c hm quy gii quyt vn .
Ngoi ra, ch :
- Cch biu din s theo dng thc khoa hc: aE n , tng ng vi a.10n .
- Chui nh dng "%.f" (c du .) dng in s thc khng c phn thp phn.

Bi 142: (trang 41)


#include <stdio.h>

int main() {
char c;

if ( ( c = getchar() ) != '\n' ) main();


putchar( c );
return 0;
}
Chui quy l mt chui gi hm lin tc, bin cc b cng nh a ch tr v s
c lu vo stack trc khi gi hm. quy thng thng chm do stack overhead.
Phn bit hai loi quy:
- quy u:
void hello( int n ) {
hello( n - 1 ); /* gi quy */
printf( "%d", n ); /* tc v trong mt ln quy */
}
218
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Li gi quy c gi trc cc tc v trong mt ln quy. Khi kt thc quy,


bin cc b c y ra khi stack theo nguyn tc LIFO (Last In First Out - vo
sau ra trc) v c s dng nn kt qu xut ngc vi th t dng cc bin cc
b.
- quy ui (tail recursion):
void hello( int n ) {
printf( "%d", n ); /* thc hin cng vic trong mt ln quy */
hello( n - 1 ); /* gi quy */
}
Li gi quy c thc hin cui cng. Khng c tc v no c thc hin sau
li gi quy.
quy u quy ui
gi hello( 3 ) gi hello( 3 )
{ 3 {
gi hello( 2 ) in "3"
{ 2 3 gi hello( 2 )
gi hello( 1 ) {
1 2 3
{ in "2"
gi hello( 0 ) {} gi hello( 1 )
in "1" {
2 3
} in "1"
in "2" gi hello( 0 ) {}
3
} }
in "3" }
} }

Ta dng c im quy u ny thc hin quy vi hm main(). Kt qu l


cc k t nhn vo trong mi ln quy s c xut ra vi th t ngc li. Bn
c th dng chc nng Call Stack thng c trong tin ch debug theo di qu
trnh ny.

Bi 143: (trang 41)


#include <stdio.h>

int A( int n, int m, int *c ) {


( *c )++;
if ( !n ) return m + 1;
if ( !m ) return A( n - 1, 1, c );
return A( n - 1, A( n, m - 1, c ), c );
}

int main() {
int c = 0;

printf( "A( 3, 6 ) = %d\n", A( 3, 6, &c ) );


printf( "Goi de quy %d lan\n", c );
return 0;
}
Hm Ackermann l v d v hm quy khng c bn, c tr tng cc nhanh. V d
dng thp phn ca A(4, 3) khng trnh by c v c s ch s ln hn s nguyn
t c lng ca v tr.
Hm Ackermann c hin thc bng cch dng biu thc truy hi sau:
219
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

m 1 n 0

A n, m A n 1, 1 m 0
A n 1, A n, m 1 n, m 0

iu kin u: A(0, m) = m + 1
Tham s c c a vo m s ln quy.
A(3, 6) gi quy 172233, lng su 511 cp, thng dng o tc hot ng
(benchmark), v d:
#include <time.h>
/* ... */
clock_t t1, t2;
t1 = clock();
A( 3, 6 );
t2 = clock();
printf( "Time taken = %.3f Seconds\n", ( t2 - t1 ) / (double)CLOCKS_PER_SEC );
Cng thc A(3, n) = 2n+33 dng tnh nhanh A(3, n).
Trong li gi quy c truyn tham chiu bng con tr, tham s c ca hm trn phi
c truyn nh sau: &(*c), nhng iu ny tng ng vi c.

Bi 144: (trang 41)


#include <stdio.h>
#include <math.h>
#define eps 1e - 3

double Pi() {
static k = 0;
double E = 4.0 / ( 2 * k + 1 );
double s = pow( -1, k );
if ( E < eps ) return 0;
k++;
return s * E + Pi();
}

int main() {
printf( "Pi = %.3lf\n", Pi( 0 ) );
return 0;
}
4
Biu thc tnh Pi: (1)k thun li cho vic thc hin bng vng lp
k0 2k 1
hoc chuyn sang dng quy:
double Pi( int k ) {
double E = 4.0 / ( 2 * k + 1 );
double s = pow( -1, k );
if ( E < eps ) return 0;
return s * E + Pi( k + 1 );
}
Trong k (kch thc quy) c thay i bng cch truyn nh tham s ca
nhng ln gi quy.
Do yu cu ca bi tp, hm Pi() c vit khng tham s, ta dng bin static
lu li tr ca k trong ln gi trc.

220
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Ch l hm ch c gi mt ln t hm main() ca chng trnh, v tr static k


khi u s thay i, nh hng n ln gi sau. Cch thit k vi bin static trong
hm nh trn ch p ng yu cu bi tp, khng nn dng trong thc t, v d thit
k cc hm trong th vin ring.

Bi 145: (trang 41)


#include <stdio.h>

void dec2bin( int x ) {


if ( x >= 2 ) dec2bin( x / 2 );
printf( "%d", x % 2 );
}

void dec2hex( int x ) {


int c = x % 16;
if ( x >= 16 ) dec2hex( x / 16 );
printf( "%c", c > 9 ? c - 10 + 'A' : c + '0' );
}

int main() {
int x;

printf( "Nhap x: " );


scanf( "%d", &x );

printf( "Bin: " );


dec2bin( x );

printf( "\nHex: " );


dec2hex( x );
putchar( '\n' );
return 0;
}
Chuyn i h s ca s x, v d t h thp phn sang h thp lc phn, c thc
hin nh hnh bn: x/16 x%16
Chia lin tc x cho 16 n khi thng s bng 0, cc s d 1234 2
ca php chia cho 16 c ln lt lu vo stack. 77 13 stack
Khi php chia cho 16 chm dt (thng s bng 0), ln lt 4 4
y cc s d ra khi stack (theo nguyn tc LIFO - vo sau 0 4D2
ra trc) c kt qu chuyn i. s d hex
Cc tr d t 10 - 15 c chuyn thnh t A - F.
Vng lp chia x cho 16 c chuyn thnh quy nhm s dng stack hot ng
c to ra trong qu trnh quy lu cc s d cho php chia h s 16. d liu
a vo stack ng th t, ta dng quy u. Trong , s d ca php chia cho h
s c lu vo stack ca quy.
Bi tp: Vit hm convert(n, k) quy, trong n l s thp phn cn chuyn i
v k l h s (2, 8, 16).
void convert( unsigned n, unsigned k ) {
if ( n >= k ) convert( n / k, k );
printf( "%c", ( n % k )[ "0123456789ABCDEF" ] );
}

221
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Nhc li, trong C, s[3] v 3[s] c xem ch l mt a ch s + 3. V vy:


printf( "%c", ( n % k )[ "0123456789ABCDEF" ] );
Ch l cch vit tt ca:
char s[] = "0123456789ABCDEF";
printf( "%c", s[n % k] );

Bi 146: (trang 41)


#include <stdio.h>

int coef( int n, int k ) {


if ( k == 0 || k == n ) return 1;
return coef( n - 1, k - 1 ) + coef( n - 1, k );
}

void tpascal( int n ) {


int i, j;
for ( i = 0; i <= n; ++i ) {
printf( "%*c", ( n - i + 1 ) * 2, ' ' );
for ( j = 0; j <= i; ++j )
printf( "%2d%2c", coef( i, j ), ' ' );
putchar( '\n' );
}
}

int main() {
int n;

printf( "Nhap n (n < 15): " );


scanf( "%d", &n );
tpascal( n );
return 0;
}
D dng tnh mt h s trong tam gic Pascal bng quy da vo biu thc truy
hi: Ckn Ckn 1 Ckn 11 (gii thut chia tr)
Vi iu kin u: Cn0 Cnn 1
Tuy nhin, gii thut quy ny km hiu qu. Thc t, ngi ta thng dng gii
thut quy hoch ng:
int** coefArray( int n ) {
int i, j;
/* cp pht ng mng B[n + 1][n + 1] */
int** B = ( int** )calloc( ( n + 1 ), sizeof( int* ) );
B[0] = ( int* )calloc( ( n + 1)*( n + 1 ), sizeof( int ) );
for ( i = 0; i < n + 1; ++i )
B[i] = B[0] + i * ( k + 1 );
/* quy hoch ng */
for ( i = 0; i <= n; ++i )
for ( j = 0; j <= i; ++j )
if ( j == 0 || j == i ) B[i][j] = 1;
else B[i][j] = B[i - 1][j - 1] + B[i - 1][j];
return B;
}

222
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


void tpascal( int n ) {
int i, j;
int** B = coefArray( n );
for ( i = 0; i <= n; ++i ) {
printf( "%*c", ( n - i + 1 ) * 2, ' ' );
for ( j = 0; j <= i; ++j )
printf( "%2d%2c", B[i][j], ' ' );
putchar( '\n' );
}
/* gii phng vng nh c cp pht */
free( B[0] );
free( B );
}
Ch cch trnh by kt qu xut ca tam gic Pascal, dng %*c.

Bi 147: (trang 42)


#include <stdio.h>

void Swap( int *a, int *b ) {


int t = *a; *a = *b; *b = t;
}

int Max( int* a, int n ) {


int i, maxpos = 0;
for ( i = 1; i < n; ++i )
if ( a[i] > a[maxpos] ) maxpos = i;
return maxpos;
}

void selectSort( int a[], int n ) {


if ( n < 2 ) return;
Swap( a + n - 1, a + Max( a, n ) );
selectSort( a, n - 1 );
}

int main() {
int a[] = { 3, 5, 4, 6, 7, 1, 2 };
int size = sizeof a / sizeof *a;
int i;

printf( "Mang goc : " );


for ( i = 0; i < size; ++i )
printf( "%d ", a[i] );
putchar( '\n' );

selectSort( a, size );
printf( "Mang tang: " );
for ( i = 0; i < size; ++i )
printf( "%d ", a[i] );
putchar( '\n' );
return 0;
}
Phn tch:
1. Sp xp tng mt mng A theo thut ton sp xp kiu chn (Selection Sort).
223
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

2. Kch thc quy: s phn t ca mng A.


3. Trng hp c s: khi mng A c duy nht mt phn t, xem nh sp xp, dng
quy.
4. Trng hp tng qut: da vo cu trc quy ca mng (mng con ca mt
mng cng l mt mng), thao tc sp xp mng A c m t quy nh sau:
Sort(A, n) = Sort(A, n - 1) + A[n-1]
Sp xp mng A = Sp xp mng con Phn t cui A[n-1]
t A[0] -> A[n-2] sp xp
Du + biu th A[n-1] nm pha sau mng con.
Thao tc sp xp tng ng phn t cui ca mt mng (con) theo kiu chn nh
sau: hon chuyn phn t ln nht ca mng (con), c tm bng hm Max() vi
phn t cui mng (con).
Hm Swap(), v c tham s truyn bng con tr, c gi y nh sau:
Swap( &a[n - 1], &a[Max( a, n )] );
Tng ng:
Swap( a + n - 1, a + Max( a, n ) );
Cch sp xp trn l hon chuyn phn t ln nht ca mng con (t phn t u
n k cui) cho phn t cui mng, c t duy hi ngc vi thut ton c bn.
L do chng ta mun gi ch s ca phn t u mng con lun bng 0.
Bn vn c th lm theo thut ton c bn: hon chuyn phn t nh nht ca mng
con (t phn t th hai n cui) cho phn t u mng, nu nm vng quan h
gia con tr v mng:
int Min( int* a, int n ) {
int i, minpos = 0;
for ( i = 1; i < n; ++i )
if ( a[i] < a[minpos] ) minpos = i;
return minpos;
}

void selectSort( int a[], int n ) {


if ( n < 2 ) return;
Swap( a, a + Min( a, n ) );
a++;
selectSort( a, n - 1 );
}
Hm Max() cng c th vit quy, xem bi 151 (trang 228).

Bi 148: (trang 42)


#include <stdio.h>

void Swap( int *a, int *b ) {


int t = *a; *a = *b; *b = t;
}

void bubbleSort( int a[], int n ) {


int i;
if ( n < 2 ) return;
for ( i = 0; i < n - 1; ++i )
if ( a[i] < a[i + 1] )
Swap( a + i, a + i + 1 );
bubbleSort( a, n - 1 );
224
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}

int main() {
int a[] = { 3, 5, 4, 6, 7, 1, 2 };
int size = sizeof a / sizeof *a;
int i;

printf( "Mang goc : " );


for ( i = 0; i < size; ++i )
printf( "%d ", a[i] );
putchar( '\n' );

bubbleSort( a, size );
printf( "Mang giam: " );
for ( i = 0; i < size; ++i )
printf( "%d ", a[i] );
putchar( '\n' );
return 0;
}
Phn tch:
1. Sp xp tng mt mng A theo thut ton sp xp kiu ni bt (bubble sort).
2. Kch thc quy: s phn t ca mng A.
3. Trng hp c s: khi mng A c duy nht mt phn t, xem nh sp xp, dng
quy.
4. Trng hp tng qut: da vo cu trc quy ca mng, thao tc sp xp mng
A c m t quy nh sau:
Sort(A, n) = Sort(A, n - 1) + A[n-1]
Sp xp mng A = Sp xp mng con Phn t cui A[n-1]
t A[0] -> A[n-2] sp xp
Thao tc sp xp gim ng phn t cui ca mt mng (con) theo kiu ni bt nh
sau: so snh hon chuyn tng cp phn t k tip nhau k t u mng (con) n
cui mng (con); qu trnh ny lm phn t nh nht ca mng (con) ni bt thnh
phn t cui mng (con).

Bi 149: (trang 42)


#include <stdio.h>

int isAsc( int* a, int n ) {


if ( n < 2 ) return 1;
if ( a[n - 1] < a[n - 2] ) return 0;
return isAsc( a, n - 1 );
}

int BSearch( int* a, int x, int left, int right ) {


if ( left > right ) return -1;
else {
int m = ( left + right ) / 2;
if ( a[m] == x ) return m;
else
if ( a[m] > x ) return BSearch( a, x, left, m - 1 );
else return BSearch( a, x, m + 1, right );
}
}
225
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

int main() {
int a[] = { 2, 3, 4, 5, 6, 7 };
int size = sizeof a / sizeof *a;
int i, x;

for ( i = 0; i < size; ++i )


printf( "%d ", a[i] );

if ( isAsc( a, size ) ) {
printf( "\nNhap x: " );
scanf( "%d", &x );
int pos = BSearch( a, x, 0, size - 1 );
if ( pos != -1 )
printf( "a[%d]\n", pos );
else
printf( "Khong tim thay\n" );
}
else printf( "Mang chua duoc sap xep\n" );
return 0;
}
Gii thut tm kim nh phn (Binary Search):
a 2 3 5 7 11 13 17 19 23 29 31 37 41

chn mng con so snh x


tri v x < 17 vi 17

a 2 3 5 7 11 13
so snh x chn mng con
vi 5 phi v x > 5

7 11 13
so snh x tm c x
vi 11 v x = 11
a) c thc hin trn mng sp xp tng a: phn t u c ch s left, phn t cui
c ch s right.
Nu left > right, dng tm kim, tr v -1 (khng v tr no trong mng). y l
im dng quy.
b) Phn t gia mng a[m] c so snh vi tr x cn tm.
c) Nu x < a[m] ta tm kim nh phn x trong mng con bn tri: phn t u c ch
s left, phn t cui c ch s m - 1.
Nu x > a[m] ta tm kim nh phn x trong mng con bn phi: phn t u c ch
s m + 1, phn t cui c ch s right.
Hai pht biu trn mang tnh quy.
Nu x = a[m] ta tm c x, tr v ch s ca x. Dng tm kim. y l im dng
quy.
V d: tm x trong mng sp xp tng sau.
Phn tch:
1. Tm kim BSearch mt phn t trong mt mng a sp xp tng.

226
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

2. Kch thc quy: s phn t ca mng a, bin tri left, bin phi right. m l ch
s ca phn t gia mng:
m = ( left + right ) / 2;
3. Trng hp c s:
- Nu left > right, tr v -1.
- Nu x = a[m], tm c x, tr v ch s ca x.
4. Trng hp tng qut:
- Nu x < a[m], tm kim BSearch mng con bn tri, bin tri left, bin phi m - 1.
- Nu x > a[m], tm kim BSearch mng con bn tri, bin tri m + 1, bin phi right.
Ci t cho hm BSearch() trn dng nhiu if ... else tng minh, c th vit
gn hn:
int BSearch( int* a, int x, int left, int right ) {
int m = ( left + right ) / 2;
if ( left > right ) return -1;
if ( a[m] == x ) return m;
return ( a[m] > x ) ? BSearch( a, x, left, m - 1 )
: BSearch( a, x, m + 1, right );
}
Hm isAsc() thit k da trn phn tch sau:
1. Kim tra mt mng c phi l mng sp xp tng hay khng.
2. Kch thc quy: s phn t ca mng.
3. Trng hp c s:
- Mng ch c 1 phn t (s phn t < 2), xem nh mng tng, tr v TRUE.
- Pht hin hai phn t k tip nhau khng ng th t tng, tr v FALSE.
4. Trng hp tng qut: m t quy nh sau
isAsc(a, n) = isAsc(a, n - 1) + a[n-1]
Kim tra mng a = Kim tra mng con Phn t cui a[n-1]
t a[0] -> a[n-2] ng th t (ln hn a[n-2])

Bi 150: (trang 43)


#include <stdio.h>

int OddSum( int* a, int n ) {


if ( n < 1 ) return 0;
return ( a[n - 1] % 2 ) ? a[n - 1] + OddSum( a, n - 1 )
: OddSum( a, n - 1 );
}

int main() {
int a[] = { 2, 3, 4, 5, 6, 7 };
int size = sizeof a / sizeof *a;
int i;

for ( i = 0; i < size; ++i )


printf( "%d ", a[i] );
printf( "\nTong cac phan tu le: %d\n", OddSum( a, size ) );
return 0;
}
Phn tch:
1. Tnh tng cc phn t c tr l trong mt mng.

227
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

2. Kch thc quy: s phn t ca mng.


3. Trng hp c s: Mng c 0 phn t (s phn t < 1), tng cc tr l bng 0.
4. Trng hp tng qut:
- Phn t cui mng c tr l:
OddSum(a, n) = a[n-1] + OddSum(a, n-1)
Tng tr l mng a = Tr ca a[n-1] Tng tr l ca mng con
v a[n-1] l cn li (t a[0]->a[n-2])
- Phn t cui mng c tr chn:
OddSum(a, n) = 0 + OddSum(a, n-1)
Tng tr l mng a = Khng tnh a[n-1] Tng tr l ca mng con
v a[n-1] chn cn li (t a[0]->a[n-2])
Cc bi tp quy trn mng thng xt t phn t cui ngc ln bo m a[0]
lun l phn t u mng con, thun tin v t nhin. Tuy vy ta vn c th xt cc
phn t k t u mng v sau nu nm vng thao tc con tr trn mng.
Bi tp: dng gii thut quy, in cc phn t l trong mng, theo th t t u
mng tr v sau.
void PrintOdd( int* a, int n ) {
if ( n < 1 ) return;
if ( a[0] % 2 ) {
printf( "%d ", a[0] );
PrintOdd( a + 1, n - 1 );
}
else PrintOdd( a + 1, n - 1 );
}
Gii php khc, dng quy u:
void PrintOdd( int* a, int n ) {
if ( n < 1 ) return;
if ( a[n - 1] % 2 ) {
PrintOdd( a, n - 1 );
printf( "%d ", a[n - 1] );
}
else PrintOdd( a, n - 1 );
}

Bi 151: (trang 43)


#include <stdio.h>

int Max( int* a, int n ) {


if ( n < 2 ) return 0;
return ( a[n - 1] > a[Max( a, n - 1 )] ) ? n - 1 : Max( a, n - 1 );
}

int main() {
int a[] = { -2, 3, -4, -5, 6, -8 };
int i;
int size = sizeof a / sizeof *a;

for ( i = 0; i < size; ++i )


printf( "%d ", a[i] );

i = Max( a, size );
printf( "\nMax = a[%d] = %d\n", i, a[i] );
228
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


return 0;
}
Phn tch:
1. Tr v ch s ca phn t c tr ln nht trong mng khng rng.
2. Kch thc quy: s phn t ca mng.
3. Trng hp c s: Mng c 1 phn t a[0] (s phn t < 2), phn t ny c tr ln
nht, tr v ch s 0.
4. Trng hp tng qut: pht biu quy
Tr ln nht ca mng a (t a[0] a[n-1]), Max(a, n), l s ln hn trong php so
snh gia phn t cui a[n-1] v tr ln nht ca mng con cn li (t a[0] a[n-
2]) tc tr a[Max(a, n - 1)]. Php so snh ny tr v ch s ca tr ln nht tng
ng.

Bi 152: (trang 43)


#include <stdio.h>

int isSym( int* a, int left, int right ) {


if ( left > right ) return 1;
if ( a[left] != a[right] ) return 0;
return isSym( a, left + 1, right - 1 );
}

int main() {
int a[] = { 7, -2, 3, 4, 3, -2, 7 };
int i;
int size = sizeof a / sizeof *a;

for ( i = 0; i < size; ++i )


printf( "%d ", a[i] );

if ( isSym( a, 0, size - 1 ) ) printf( "\nMang doi xung\n" );


else printf( "\nMang khong doi xung\n");
return 0;
}
Phn tch:
1. Kim tra tnh i xng ca mt mng vi left l bin tri, right l bin phi.
2. Kch thc quy: s phn t ca mng.
3. Trng hp c s:
- Pht hin hai phn t nm ti cc v tr i xng left v right khng cng tr, tr
v FALSE.
- left > right, mng kim tra thnh cng, tr v TRUE.
4. Trng hp tng qut:
Kt qu kim tra tnh i xng ca mng a (t left right) l kt qu kim tra
a[left] = a[right] thnh cng v kim tra tnh i xng ca mng con cn li (t
left+1 right-1).
Ta cng c th thit k hm isSym() mt cch quen thuc, ngha l so snh phn
t u vi phn t cui, nhn tham s l mng v s phn t ca mng, nh sau:
int isSym( int* a, int n );
a l mng cn kim tra, n l kch thc ca mng.
int isSym( int* a, int n ) {
229
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


if ( n < 2 ) return 1;
if ( a[0] != a[n - 1] ) return 0;
return isSym( a + 1, n - 2 );
}
Mi ln quy ta gim n (kch thc quy) i 2 n v do kim tra xong 2 phn
t ca mng.

Bi 153: (trang 43)


#include <stdio.h>

float NegAvg( int* a, int n ) {


static int count = 0;
static float sum = 0;
if ( n < 1 ) return ( !count )? 0 : sum / count;
if ( a[n - 1] < 0 ) {
sum += a[n - 1];
count++;
}
return NegAvg( a, n - 1 );
}

int main() {
int a[] = { -2, 3, -4, -5, 6, -8 };
int i;
int size = sizeof a / sizeof *a;

for ( i = 0; i < size; ++i )


printf( "%d ", a[i] );

printf( "\nTrung binh cong cac phan tu am: %g\n", NegAvg( a, size ) );
return 0;
}
C hai tr thay i lin tc m hm NegAvg() phi truyn t khi bt u n kt thc
quy l:
sum: tng cc s nguyn m c trong mng.
count: s cc s nguyn m c trong mng.
Khi kt thc quy (trng hp c s, n < 1), hai tr ny s dng tnh tng trung
bnh cng cc s nguyn m.
Do yu cu ca bi tp, hai tr lun thay i ny khng c truyn nh tham s gia
cc ln gi quy. V vy ta khai bo chng nh l bin static nhng thay i
c truyn cho cc ln gi sau.
Ch , do tnh cht ca bin static, hm NegAvg() ch ng vi ln gi u tin t
hm main(). Cch vit quy sau n hn:
float NegAvg( int* a, int n, int count, float sum ) {
if ( n < 1 ) return ( !count )? 0 : sum / count;
if ( a[n - 1] < 0 ) {
sum += a[n - 1];
count++;
}
return NegAvg( a, n - 1, count, sum );
}
/* gi hm */

230
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


printf( "\nTrung binh cong cac phan tu am: %g\n", NegAvg( a, size, 0, 0 ) );

Bi 154: (trang 43)


#include <stdio.h>
#include <ctype.h>

long fact( int n ) {


if ( n == 0 ) return 1;
return ( n * fact( n - 1 ) );
}

int strtoint( char *s ) {


int n = 0;
while ( isspace( *s ) ) s++;
if ( !isdigit( *s ) ) return -1;
while ( isdigit( *s ) ) n = n * 10 + *s++ - '0';
return *s ? -1 : n;
}

int main( int argc, char *argv[] ) {


int i, rv = 0;

for ( i = 1; i < argc; ++i ) {


int n = strtoint( argv[i] );
if ( n == -1 && ++rv ) printf( "%s: so khong hop le\n", argv[i] );
else printf( "%d! = %ld\n", n, fact( n ) );
}
return rv;
}
Tham s dng lnh l cc chui nn trc khi tnh giai tha cn phi chuyn sang
s. Hm strtoint() m nhn vic ny bng cch dng cc hm trong ctype.h,
chuyn chui tham s dng lnh thnh mt s nguyn dng. Hm strtoint() tr
v -1 nu pht hin k t khng hp l. M li ca hm main(), rv, tr v s tham
s dng lnh nhp khng hp l.
Hm fact() dng gii thut quy tnh giai tha, c vit d dng da trn biu
thc truy hi:
1 n 0
Fn
nFn 1 n 0
Ch hm fact() khng tnh c giai tha s ln, ch tnh khong n 32!

Bi 155: (trang 43)


#include <stdio.h>
#include <math.h>

int Fi( int n ) {


return ( n < 3 ) ? 1 : Fi( n - 1 ) + Fi( n - 2 );
}

int main() {
double a, b;
int n;

231
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


do {
printf( "Nhap n (0 < n < 40): " );
scanf( "%d", &n );
} while( n <= 0 || n >= 40 );

printf( "De quy : Fi(%d) = %d\n", n, Fi( n ) );

a = ( 1 + sqrt( 5 ) ) / 2;
b = 1 - a;
printf( "Cong thuc dong: Fi(%d) = %.f\n", n,
( pow( a, n ) + pow( b, n ) ) / sqrt( 5 ) );
return 0;
}
Hm quy Fi() c vit d dng da trn biu thc truy hi:
1 n 1,2
Fn
Fn 1 Fn 2 n 2
Tuy nhin, do quy nh phn nn s ln gi quy rt ln, ch dng tnh s
Fibonacci vi n nh. Thng thay th bng thut ton quy hoch ng.
Tham kho thm: biu thc dng ng ca s Fibonacci c tnh nh sau:
Biu thc truy hi ca s Fibonacci:
F0 0

F1 1
F F
n n 1 Fn 2 0 n 1
t Fn r2 , t Fn Fn 1 Fn 2 0 ta c phng trnh c trng:
2
r r 1 0
1 5
C 2 nghim c trng: r nn c li gii tng qut cho biu thc quy:
2
n n
1 5
Fn c1 c2 1 5
2 2

Xc nh tr ca cc hng s da vo cc iu kin u:
F0 c1 c2 1
c1

5
1 5

c2 1 5
F1 c1 2 2 c2 1
5
[(1 5) / 2]n [(1 5) / 2]n
Suy ra: Fn
5
1 5
t: , 1 , ta c biu thc dng ng ca s Fibonacci:
2
n n
Fn
5

Bi 156: (trang 44)


#include <stdio.h>

double F( int n ) {
if ( n == 103 ) return 103;
232
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


return n + 1 / F( n + 2 );
}

int main() {
printf( "F = %g", F( 1 ) );
putchar( '\n' );
return 0;
}
Xt phn s lin tc:
1
F 1
1
3
1
5
...
1
101
103
D dng nhn thy cng thc truy hi ca phn s lin tc trn:
1
Fn n , n [1, 101], n l
Fn 2
iu kin u: F103 103
y l bi ton quy kiu chn trn: bt u vi kch thc quy n = 1, sau mi
ln gi quy, n tng thm 2 n v. n khi n = 103, bi ton tnh c m khng
cn quy nh iu kin u.

Bi 157: (trang 44)


#include <stdio.h>
#include <stdlib.h>

int detMatrix( int* a, int n ) {


int j, k, l;
int sign = 1, sum = 0;
if ( n == 1 ) return ( a[0] );
for ( j = 0 ; j < n ; ++j, sign = -sign ) {
/* tnh A1j (cha trong mng a1) truyn trong li gi quy */
int* a1 = ( int * )calloc( (n-1) * (n-1), sizeof( *a1 ) );
for ( l = 0, k = n; k < n * n; ++k )
if ( k % n != j ) a1[l++] = a[k];
/* dng cng thc truy hi tnh detA */
sum += sign * a[j] * detMatrix( a1, n - 1 );
free( a1 );
}
return sum;
}

int main( ) {
int *a, n, i, j;

printf( "Nhap bac ma tran: " );


scanf( "%d", &n );

a = ( int* )calloc( n * n, sizeof( *a ) );


srand( time( NULL ) );
for ( i = 0; i < n; ++i, putchar( '\n' ) )
233
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


for ( j = 0; j < n; ++j )
printf( "%5d", a[i * n + j] = rand() % 21 - 10 );

printf( "det(A) = %d\n", detMatrix( a, n ) );


free( a );
return 0;
}
Bi tp c cung cp cng thc truy hi nn thun li cho vic p dng gii
thut quy:
a11 n 1
n
det(A)
1 a1j det(A 1j) n 1
1j

j 1
Tuy nhin vn y l vic th hin cc ma trn A v A1j. Ta gp hng lot vn
: cp pht ng v gii phng mng 2 chiu (xem bi 99, trang 163), xa dng xa
ct to ma trn mi (xem bi 94, trang 157),
n gin, dng mng mt chiu a (n x n) cha ma trn A v mng mt chiu
a1 ((n - 1) x (n - 1)) cha ma trn A1j. Khi , trong cng thc truy hi:
a11 chnh l a[0] ca ma trn a.
a1j chnh l a[j] ca ma trn a.
Xem hnh di hiu cch to ma trn A1j t ma trn A.
ct j ma trn A1j tch t A

1 2 3 a1 4 6 7 8

4 5 6 n n

7 8 9 a 1 2 3 4 5 6 7 8 9
ma trn A ti trong mng k bt u j j
2 chiu v mng 1 chiu ti a[n]
Trong mng mt chiu a cha ma trn A, ta duyt cc phn t vi k bt u t n (do
xa dng u); sao chp nhng phn t c ch s k vi k % n != j vo mng a1
cha ma trn. Bin l dng lm bin m ch s cho mng a1.
for ( l = 0, k = n; k < n * n; ++k )
if ( k % n != j ) a1[l++] = a[k];
Cng thc k % n != j ngha l k gii hn trong on [0, n) v khc j.
n y ta c th vit hm quy:
- Trng hp c bn: ma trn ch c mt phn t (a11), tr v phn t ny, chnh l
a[0] ca a.
- Trng hp tng qut: dng cng thc truy hi:
n
det(A) 11 j a1j det(A 1j)
j 1

Trong vng lp theo j, cn xc nh:


Du ca biu thc: thay cho cng thc phc tp: (1)1 j dng bin sign, s
i du sau mi vng lp, khi to du dng (do (1)1 j bng 1 vi j ban
u bng 1) .
a1j chnh l a[j] ca ma trn a.
A1j cho li gi quy det(A1j): tnh nh hng dn trn.
Li gi quy vi A1j.
234
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 158: (trang 44)


#include <stdio.h>

int gcd( int, int ); /* khai bo forward */

int gcdr( int m, int n ) {


if ( !m ) return n;
if ( !n ) return m;
return gcd( n, m % n );
}

int gcd( int m, int n ) {


if ( !m && !n ) return -1;
if ( m < 0 ) m = -m;
if ( n < 0 ) n = -n;
return ( gcdr( m, n ) );
}

int main() {
int m, n, g;

printf( "Nhap hai so: " );


scanf( "%d%d", &m, &n );

printf( "GCD( %d, %d ) ", m, n );


if ( ( g = gcd( m, n ) ) == -1 )
printf( ": khong xac dinh\n" );
else printf( "= %d\n", g );
return 0;
}
USCLN (gcd - greatest common divisor) c tnh bng thut ton Euclid, dng
cng thc truy hi:
gcd( 0, b ) b

gcd( a, b ) gcd( b MOD a, a )


Hm quy gcdr() c xy dng da trn cng thc ny.
Vi trng hp tham s truyn vo l s m, dng lut sau:
gcd(a, b) gcd(a, b)
Hm khng quy gcd() c xem nh mt hm bc (wrapper) hm gcdr() lc
trng hp tham s truyn vo l s m, trc khi chuyn n cho hm gcdr().
Nu ta dng cng thc truy hi sau:
gcd( 0, b ) b

gcd( a, b ) gcd( b, a b)
Tr a - b c th < 0, ngha lphi gii quyt bng lut: gcd(a, b) gcd(a, b)
Khi ta c th to hai hm gcdr() v gcd() nh l mt cp quy tng h, phi
hp gi ln nhau gii quyt vn .
Xem thm mt v d v quy tng h trong bi 161 (trang 237).
Khai bo forward gip trnh bin dch hnh dung c tr tr v v danh sch tham
s ca hm mc d trnh bin dch cha thy nh ngha ca hm.

235
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 159: (trang 45)


#include <stdio.h>
#include <string.h>
#include <ctype.h>

void shrink( char* buffer ) {


char *p, *n;
for ( n = p = buffer; *p; ++p )
if ( isalpha( *p ) )
*n++ = tolower( *p );
*n = '\0';
}

int ispal( char* first, char* last ) {


if ( first >= last ) return 1;
if ( *first != *last ) return 0;
return ispal( first + 1, last - 1 );
}

int main() {
char buffer [1000];
while ( fgets( buffer, sizeof( buffer ), stdin ) != NULL ) {
shrink( buffer );
size_t len = strlen( buffer );
if ( len == 0 )
printf( "-> Khong nhan duoc chuoi\n" );
else
if ( ispal( buffer, &buffer[len - 1] ) )
printf( "-> Palindrome\n" );
else printf( "-> Khong phai palindrome\n" );
}
return 0;
}
trnh nhng rc ri khi kim tra tnh i xng ca chui nh: cc k t khong
trng, k t khng phi alphabet, k t ch hoa, ta dng hm shrink() chun
ha chui trc. Hm ny s loi b cc k t khc alphabet (dng k thut xa
mng trnh by trong bi 64, trang 119), cc k t cn li u chuyn thnh ch
thng. Kt qu lu trong mng buffer.
Sau vic kim tra tnh i xng (hm ispal()) thc hin bnh thng nh kim
tra tnh i xng ca mt mng k t bng quy, xem bi 152 (trang 229).

Bi 160: (trang 45)


#include <stdio.h>
#include <stdlib.h>

#define Swap( a, b ) { char c = a; a = b; b = c; }

void permutation( char* s, int l, int r ) {


if ( l == r ) printf( "%s ", s );
else {
int i;
for ( i = l; i <= r; ++i ) {
Swap( s[i], s[l] );

236
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


permutation( s, l + 1, r );
Swap( s[i], s[l] );
}
}
}

int main() {
int n, i;
char* s;

printf( "Nhap n: " );


scanf( "%d", &n );
s = ( char* )calloc( n + 1, 1 );
for ( i = 0; i < n; ++i )
s[i] = i + 'A';
permutation( s, 0, n - 1 );
return 0;
}
Xt dy k t ca chui t s[0] n s[n - 1] (n k t, n = strlen(s)).
Ta tm cch to ra b hon v bt u bng s[0], sau to ra b hon v bt
u bng s[1],
B nhng hon v bt u bng s[0] u c k t u l s[0], phn ui l hon
v ca n - 1 phn t cn li (t s[1] n s[n - 1]). Nh vy ta c c lp lun
truy hi a vn t kch thc n (k t) v kch thc nh hn n - 1 (k t).
Hm permutation(s, l, r) to cc b hon v vi k t bt u l s[i]: s[l], s[l
+ 1], , s[r] nh sau:
- Hon chuyn k t s[i] vi s[l] nhm to b hon v vi k t u s[i].
- Cc hon v trong b hon v ny u c k t u l s[i], phn ui l hon v
ca cc k t cn li, to bng cch gi quy vi quy m nh hn: permutation(s,
l + 1, r).
- Sau khi gi quy bc 2, chui s vn gi nguyn nh trc khi gi quy. Ta
cn thc hin hon chuyn k t ngc vi bc 1 tr chui s v nh ban u,
chun b to b hon v k tip.
By gi ta xt trng hp c s dng quy: nu l = r th on cn hon v ch
c 1 k t, ch cn in ra.

Bi 161: (trang 45)


#include <stdio.h>
#include <math.h>
#define eps 5e - 4

double C( double ); /* khai bo forward */

double S( double x ) {
if ( fabs( x ) < eps ) return x * ( 1 - x * x / 6 );
return ( 4 * C( x / 3 ) * C( x / 3 ) - 1 ) * S( x / 3 );
}

double C( double x ) {
if ( fabs( x ) < eps ) return ( 1 - x * x / 2 );
return ( 1 - 4 * S( x / 3 ) * S( x / 3 ) ) * C( x / 3 );
}
237
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

int main() {
double x = -2.1;

printf( "Doi chung tinh bang math.h trong ()\n" );


printf( "sin(%g) = %14.10g ( %.10g )\n", x, S( x ), sin( x ) );
printf( "cos(%g) = %14.10g ( %.10g )\n", x, C( x ), cos( x ) );
return 0;
}
Bi tp ny dng quy tng h: hai (hay nhiu) hm gi nhau mt cch quy.
Tnh tng h c th hin khi hm f1 gi hm f2 v hm f2 gi li hm f1 vi
quy m nh hn, ta gi l vo li (re-entrant).
Cng ging nh quy thng thng, cch quy ny yu cu mi hm gi c
trng hp c s (c im dng) v kch thc bi ton thay i (thng l gim)
sau mi li gi quy.
Phn tch:
1. Tnh sin( x ) v cos( x ) da vo quy tng h.
2. Kch thc quy: tr x, s gim 1/3 sau mi ln gi quy. Ni cch khc, hai
hm ny gi qua li vi nhau, mi ln gi kch thc quy gim dn, tin n
trng hp c s.
3. Trng hp c s: vi x rt nh (< 5.10-4) ta khng dng cp ng nht thc
quy tng h tnh m dng cp ng nht thc xp x khng quy tnh:
sin x x x 3 / 6

cos x 1 x 2 / 2
v nh vy ta dng lun quy ti y.
4. Trng hp tng qut: vi x ln ta dng cp ng nht thc quy tng h:
sin 3x (4 cos2 x 1) sin x

cos 3x (1 4 sin2 x) cos x
Ch kch thc quy gim cho mi li gi quy.

Bi 162: (trang 45)


#include <stdio.h>

void hanoi( int n, int source, int target ) {


if ( n == 1 )
printf( "Disk %d: [%d] -> [%d]\n", n, source, target );
else {
int between = 6 - ( source + target );
hanoi( n - 1, source, between );
printf( "Disk %d: [%d] -> [%d]\n", n, source, target );
hanoi( n - 1, between, target );
}
}

int main() {
hanoi( 4, 1, 3 );
return 0;
}

238
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Ta gi hanoi(n, source, target) l php chuyn n a t cc source sang cc


target. Gi s ta chuyn c n - 1 a (tr a ln nht) t cc source sang cc
trung gian between bng php chuyn hanoi(n - 1, source, between), th ta c th
d dng thc hin c hanoi(n, source, target) bng ba thao tc:
- hanoi(n - 1, source, between): chuyn n - 1 a (tr a ln nht) t cc source
sang cc trung gian between.
- Chuyn a th n t cc source sang cc target.
- hanoi(n - 1, between, target): chuyn n - 1 a t cc trung gian between sang
cc target, chng ln a ln nht va chuyn sang.

source between target source between target source between target


Nh vy ta xc nh c lp lun truy hi cho tr chi trn.
t tr cho tng cc: source(1), between(2), target(3). Ta c:
source + between + target = 6
T d dng xc nh c cc between trong cc li gi quy khc (vi source
v target khc): between = 6 - ( source + target )
By gi cn xc nh trng hp c s (iu kin u) dng quy: nu ch c
mt a, th n gin chuyn a ny trc tip t cc source sang cc target.
Tham kho thm: gi s s bc chuyn n a l F(n).
T iu kin u, ta c: F(1) = 1
T lp lun truy hi trn, ta c: F(n) = F(n-1) + 1 + F(n-1), n > 1
Suy ra:
F(1) + 1 = 2
F(n) + 1 = 2F(n-1) + 1 + 1 = 2(F(n-1) + 1), n > 1
Vy hm G(n) = F(n) + 1 chnh l hm m: G(n) = 2n
F(n) = 2n - 1, n > 0
chuyn n a, cn 2n - 1 bc chuyn. V vy khng nn thc hin bi tp vi s
ln. V d chuyn 64 a, mi bc chuyn mt 1 giy, chng ta cn 585 t nm
(v tr hnh thnh khong 13,7 t nm).
Ngoi gii thut quy, ngi ta cn gii bi tp ny bng nhiu gii thut khc nh
gii thut Binary, gii thut m Gray...

Bi 163: (trang 46)


#include <stdio.h>
#include <math.h>

double mypow( double x, int n ) {


double xlast;
if ( n < 0 ) return 1 / mypow( x, -n );
if ( n == 0 ) return 1;
if ( n == 1 ) return x;
if ( n % 2 ) {
xlast = mypow( x, ( n - 1 ) / 2 );
return xlast * xlast * x;
} else {
xlast = mypow( x, n / 2 );
return xlast * xlast;
}
239
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}

int main() {
double x;
int n;

printf( "Nhap x, n: " );


scanf( "%lf%d", &x, &n );

printf( "mypow() : %lf\n", mypow( x, n ) );


printf( "pow() : %lf\n", pow( x, n ) );
return 0;
}
Phn tch:
1. Tnh ly tha xn. tng qut hn, ta dng biu thc truy hi:
n
1 / x n 0
1 n 0
n
x x n 1
k k
(x )(x ) n 2k k
k k
x(x )(x ) n 2k 1
Trng hp n < 0 thng b b qua khi gii bi tp.
2. Kch thc quy: n, s gim dn mi ln gi quy (tr trng hp n < 0).
3. Trng hp c s:
n = 0, xn = 1.
n = 1, xn = x. Trng hp ny ch dng gim 1 ln quy khi n l, khng cn
thit trong gii thut.
4. Trng hp tng qut:
Dng biu thc truy hi m t trn.

Bi 164: (trang 46)


#include <stdio.h>

typedef struct {
double real, imag;
} Complex;

Complex add( Complex a, Complex b ) {


Complex t;
t.real = a.real + b.real;
t.imag = a.imag + b.imag;
return t;
}

Complex sub( Complex a, Complex b ) {


Complex t;
t.real = a.real - b.real;
t.imag = a.imag - b.imag;
return t;
}

Complex mul( Complex a, Complex b ) {


240
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


Complex t;
t.real = a.real * b.real - a.imag * b.imag;
t.imag = a.real * b.imag + a.imag * b.real;
return t;
}

Complex div( Complex a, Complex b ) {


Complex t;
double k = b.real * b.real + b.imag * b.imag;
t.real = ( a.real * b.real + a.imag * b.imag ) / k;
t.imag = ( a.imag * b.real - a.real * b.imag ) / k;
return t;
}

Complex input() {
Complex t;
printf( "Nhap mot so phuc:\n" );
printf( " Phan thuc: " );
scanf( "%lf", &t.real );
printf( " Phan ao : " );
scanf( "%lf", &t.imag );
return t;
}

void output( Complex a ) {


printf( "%.1lf%+.1lfi\n", a.real, a.imag );
}

int main() {
Complex a, b;

a = input();
b = input();
printf( "a + b = " ); output( add( a, b ) );
printf( "a - b = " ); output( sub( a, b ) );
printf( "a * b = " ); output( mul( a, b ) );
printf( "a / b = " ); output( div( a, b ) );
return 0;
}
Thng thng mt structure c khai bo nh sau:
struct sComplex { double real, imag; };
ta khai bo mt kiu d liu mi: struct sComplex. T kha struct bt buc km
theo bt c ni no c dng kiu va khai bo (C++ b qua quy tc ny). c
tn kiu mi mt t, ta c th dng typedef:
typedef struct sComplex Complex;
by gi c th dng tn kiu mt t Complex thay cho struct sComplex.
T kin thc trn, cc bi tp v structure trong tp sch ny dng mt cch khai bo
kh tin dng:
typedef struct { double real, imag; } Complex;
ngha l khai bo mt structure v danh, sau dng typedef gn cho structure v
danh ny mt tn kiu mt t Complex.
Thao tc ch yu trn d liu kiu structure l truy xut cc thnh vin ca structure
thng qua ton t "." hoc "->". Bn cn ch thao tc truy xut thnh vin ny.

241
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Kiu d liu structure s c m rng trong C++ thnh khi nim class v thao tc
tt trn structure s gip bn lm vic tt vi class sau ny.

Bi 165: (trang 46)


#include <stdio.h>
#include <math.h>

typedef struct {
int num, denom;
} Fraction;

int gcd( int a, int b ) {


return ( !a ) ? b : gcd( b % a, a );
}

Fraction reduce( Fraction a ) {


Fraction t;
int r = gcd( abs( a.num ), abs( a.denom ) );
t.num = a.num / r;
t.denom = a.denom / r;
if ( t.denom < 0 ) {
t.num = -t.num;
t.denom = -t.denom;
}
return t;
}

Fraction add( Fraction a, Fraction b ) {


Fraction t;
t.num = a.num * b.denom + b.num * a.denom;
t.denom = a.denom * b.denom;
return reduce( t );
}

Fraction sub( Fraction a, Fraction b ) {


Fraction t;
t.num = a.num * b.denom - b.num * a.denom;
t.denom = a.denom * b.denom;
return reduce( t );
}

Fraction mul( Fraction a, Fraction b ) {


Fraction t;
t.num = a.num * b.num;
t.denom = a.denom * b.denom;
return reduce( t );
}

Fraction div( Fraction a, Fraction b ) {


Fraction t;
t.num = a.num * b.denom;
t.denom = a.denom * b.num;
return reduce( t );
}

242
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


void output( Fraction a ) {
if ( a.denom == 1 ) printf( "%d\n", a.num );
else printf( "%d/%d\n", a.num, a.denom );
}

Fraction input() {
Fraction t;
do {
printf( "Nhap tu so va mau so: " );
scanf( "%d%d", &t.num, &t.denom );
} while ( !t.denom );
return reduce( t );
}

int main() {
Fraction a, b;

a = input(); b = input();
printf( "a + b = " ); output( add( a, b ) );
printf( "a - b = " ); output( sub( a, b ) );
printf( "a * b = " ); output( mul( a, b ) );
printf( "a / b = " ); output( div( a, b ) );
return 0;
}
Ngoi cc hm chnh, ta cn vit thm hai hm b tr (helper): hm reduce() gi
hm gcd():
- Hm gcd( a, b ) dng ly c s chung ln nht ca hai s a v b. Mt vi cch
trnh by trong bi 25 (trang 86) . Cch gii quyt trong bi tp ny vn theo thut
ton Euclid:
gcd( 0, b ) b

gcd( a, b ) gcd( b MOD a, a ) a 0
- Hm reduce() dng ti gin mt phn s, c thc hin tng t bi 26 (trang
88). Hm ny c gi vo bt k thi im no c mt phn s mi c to ra.

Bi 166: (trang 47)


#include <stdio.h>
#include <math.h>

typedef struct {
double xc, yc;
double R;
} CIRCLE;

int main() {
CIRCLE a, b;
double d;

printf( "Nhap xc, yc va R cua C1: " );


scanf( "%lf%lf%lf", &a.xc, &a.yc, &a.R );
printf( "Nhap xc, yc va R cua C2: " );
scanf( "%lf%lf%lf", &b.xc, &b.yc, &b.R );

d = sqrt( ( b.xc - a.xc ) * ( b.xc - a.xc ) +


243
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


( b.yc - a.yc ) * ( b.yc - a.yc ) );

if ( d == 0 ) {
if ( a.R == b.R ) printf( "Trung nhau\n" );
else if ( a.R < b.R ) printf( "C1 trong C2\n" );
else printf( "C2 trong C1\n" );
}
else if ( d < a.R + b.R ) {
if ( d == fabs( a.R - b.R ) ) printf( "Tiep xuc trong\n" );
else if ( d < fabs( a.R - b.R ) ) printf( "Trong nhau\n" );
else printf( "Cat nhau\n" );
}
else if ( d == a.R + b.R ) printf( "Tiep xuc ngoai\n" );
else printf( "Ngoai nhau\n" );
return 0;
}
Khi bin lun phc tp nhiu trng hp, nn v lu xc nh cc trng
hp v vit code thun tin theo lu :
Yes No No Cb trong
d=0 ra = rb ra < rb
Ca

No Yes Yes

Trng Ca trong
nhau Cb

Yes No No
d<ra+rb d=|ra-rb| d<|ra-rb| Ct nhau

No Yes Yes

Tip xc Trong
trong nhau

Yes
Tip xc
d=ra+rb
ngoi

No

Ngoi nhau

Bi 167: (trang 47)


#include <stdio.h>
#include <stdlib.h>

typedef struct {
double coef;
int power;
} MONO;

int inputPoly( MONO** poly ) {


int n, i;
244
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


printf( "Nhap bac da thuc: " );
scanf( "%d", &n );
*poly = ( MONO* )calloc( n + 1, sizeof( MONO ) );
if ( !*poly ) return -1;

printf( "Nhap %d he so: ", n + 1 );


for ( i = n; i >= 0; --i ) {
scanf( "%lf", &(*poly)[i].coef ); /* nhp h s */
(*poly)[i].power = i; /* t gn ly tha */
}
while ( (*poly)[n].coef == 0 ) n--; /* a thc suy bin */
return n;
}

void outputPoly( MONO* poly, int n, char* s ) {


int i;
printf( "%s(x) = ", s );
if ( poly[n].coef && n > 1 )
printf( "%gx^%d", poly[n].coef, poly[n].power );
for ( i = n - 1; i > 1; --i )
if ( poly[i].coef )
printf( "%+gx^%d", poly[i].coef, poly[i].power );
if ( poly[1].coef ) printf( "%+gx", poly[1].coef );
if ( poly[0].coef ) printf( "%+g", poly[0].coef );
putchar( '\n' );
}

MONO* mulPoly( MONO* poly1, MONO* poly2, int n1, int n2 ) {


MONO* poly;
int i, j;
poly = ( MONO* )calloc( n1 + n2 + 1, sizeof( MONO ) );
if ( !poly ) return NULL;

for ( i = n1 + n2; i >= 0; --i ) {


poly[i].coef = 0.0;
poly[i].power = i;
}

for ( i = n1; i >= 0; --i )


for ( j = n2; j >= 0; --j )
poly[i + j].coef += poly1[i].coef * poly2[j].coef;
return poly;
}

double valuePoly( MONO* poly, int n, double x ) {


int i;
double v;
v = poly[n].coef;
for ( i = n - 1; i >= 0; --i )
v = v * x + poly[i].coef;
return v;
}

int main() {
MONO *poly1, *poly2, *poly;
int n1, n2;
245
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


double x;

n1 = inputPoly( &poly1 );
n2 = inputPoly( &poly2 );
if ( n1 == -1 || n2 == -1 )
{ printf( "Loi cap phat\n" ); return 1; }
outputPoly( poly1, n1, "P1" );
outputPoly( poly2, n2, "P2" );

poly = mulPoly( poly1, poly2, n1, n2 );


if ( !poly )
{ printf( "Loi cap phat\n" ); return 1; }
printf( "Da thuc ket qua:\n" );
outputPoly( poly, n1 + n2, "P" );

printf( "Nhap x: " );


scanf( "%lf", &x );
printf( "P(%g) = %g\n", x, valuePoly( poly, n1 + n2, x ) );
free( poly1 );
free( poly2 );
free( poly );
return 0;
}
Cc hm trong bi gii:
- Hm inputPoly(): nhn mt con tr (kiu MONO*), cp pht cho con tr ny, tr v
s phn t ca mng qun l bi con tr va cp pht hoc tr v -1 nu cp pht
khng thnh cng. Con tr poly, kiu MONO*, truyn n hm thay i sau khi gi
hm, nn c truyn bng con tr n hm (xem bi 77, trang 135): MONO** poly,
ch trong hm poly lun c du * km theo.
Sau khi nhp cc h s v t gn cc ch s, cn kim tra h s ca bc ln nht
trnh trng hp nhp h s 0 lm a thc suy bin.
- Hm outputPoly(): xut a thc ra mn hnh. a thc in ra c dng t nhin, ta
phn bit cc trng hp: in n thc bc ln nht - in n thc cc bc ln hn 1 -
in n thc bc 1 v bc 0.
- Hm mulPoly(): nhn hai a thc c truyn n v tr v a thc kt qu. Cch
nhn a thc theo ng hng dn: tch ca 2 a thc 1 tham s x, f(x) bc m v
g(x) bc n l: f(x).g(x) cm nxm n cm n 1xm n 1 ... c1x c0
Trong c k bng tng cc tch aibj m i j k (k 0,1,..., m n)
- Hm valuePoly(): tnh tr ca a thc bng phng php Horner:
P(x) ((...((anx an 1)x an 2)x ... a2)x a1)x a0
C th tnh bng vng lp nh bi gii, hoc tnh bng gii thut quy:
double valuePoly( MONO* poly, int n, int c, double x ) {
if ( c == n ) return poly[n].coef;
return valuePoly( poly, n, c + 1, x ) * x + poly[c].coef;
}
/* gi hm */
printf( "P(%g) = %g\n", x, valuePoly( poly, n1 + n2, 0, x ) );

Bi 168: (trang 48)


#include <stdio.h>

246
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


#include <stdlib.h>
#include <string.h>
#include <time.h>

typedef struct {
char bookTitle[80];
char isbn[15];
char author[80];
char publisher[32];
struct tm* dateAdded;
} BOOK;

BOOK* inputBook() {
BOOK* b;
time_t now;
printf( "Nhap thong tin sach:\n" );
b = ( BOOK* )calloc( 1, sizeof( BOOK ) );
if ( !b ) return NULL;

printf( " Tua > " ); fgets( b->bookTitle, 80, stdin );


printf( " ISBN > " ); fgets( b->isbn, 15, stdin );
printf( " Tac gia > " ); fgets( b->author, 80, stdin );
printf( " NXB > " ); fgets( b->publisher, 32, stdin );
time( &now );
b->dateAdded = localtime( &now );
return b;
}

void outputBook( BOOK* b ) {


printf( "%s", b->bookTitle );
printf( " %s %s", b->author, b->publisher );
printf( " [upate: %02d-%02d-%d]\n", b->dateAdded->tm_mday,
b->dateAdded->tm_mon + 1, b->dateAdded->tm_year + 1900 );
}

BOOK* findBook( BOOK* books[], int n, char* ISBN ) {


int i;
for ( i = 0; i < n; ++i )
if ( strcmp ( books[i]->isbn, ISBN ) == 0 )
return books[i];
return NULL;
}

int main() {
BOOK* books[1000] = { 0 };
BOOK* t;
char s[15];
int n = 0;
char c;
do {
c = 0;
if ( ( books[n] = inputBook() ) != NULL ) n++;
do {
printf( "Tiep ( y/n )? " );
scanf( "%1[yn]c", &c );
while ( getchar() != '\n' ) { }
247
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


} while ( !c );
} while ( c != 'n' );
printf( "ISBN ? " );
fgets( s, 15, stdin );
printf( "Ket qua tim:\n" );
if ( ( t = findBook( books, n, s ) ) != NULL )
outputBook( t );
else printf( "Khong tim thay\n" );
n = 0;
while ( books[n] ) free( books[n++] );
return 0;
}
qun l c nhiu sch, ta khng dng mng cc structure BOOK m dng mng
books cha cc con tr ch n structure BOOK.
Khi nhp thng tin mt quyn sch mi cn qun l bng hm inputBook(), hm ny
s cp pht v tr v mt con tr ch n structure cha thng tin quyn sch mi .
Con tr tr v s c t vo mng books. Truy xut cc thnh vin ca structure
thng qua con tr ch n structure c thc hin bng cch dng ton t "->".
Cc thng tin dng chui u nhn bng fgets(), khng cn loi b k t '\n' v
chui tm kim cng nhn bng fgets() nn cng cha k t ny.
Cu trc tm, kiu d liu time_t v cch dng, xem bi tp 190 (trang 278).

Bi 169: (trang 48)


#include <stdio.h>
#include <string.h>
#define PAY1 15000
#define PAY2 10000

typedef struct {
int h;
int m;
} TIME;

typedef struct {
char workerID[8];
TIME t_in, t_out;
} timeCard;

long toMinute( TIME t ) {


return t.h * 60 + t.m;
}

double pay( TIME a, TIME b ) {


if ( a.h >= 1 && a.h <= 6 ) {
if ( b.h < a.h ) return -1;
if ( b.h <= 6 ) /* trng hp 1 */
return PAY1 * ( toMinute( b ) - toMinute( a ) ) / 60.0;
if ( b.h <= 18 ) /* trng hp 2 */
return PAY1 * ( 6 * 60 - toMinute( a ) ) / 60.0 +
PAY2 * ( toMinute( b ) - 6 * 60 ) / 60.0;
return -1;
}
if ( a.h >= 6 && a.h <= 18 ) {

248
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


if ( b.h < a.h ) return -1;
if ( b.h <= 18 ) /* trng hp 3 */
return PAY2 * ( toMinute( b ) - toMinute( a ) ) / 60.0;
if ( b.h <= 24 ) /* trng hp 4 */
return PAY2 * ( 18 * 60 - toMinute( a ) ) / 60.0 +
PAY1 * ( toMinute( b ) - 18 * 60 ) / 60.0;
return -1;
}
if ( a.h >= 18 && a.h <= 24 ) {
if ( b.h >=1 && b.h <= 6 ) /* trng hp 6 */
return PAY1 * ( 24 * 60 - toMinute( a ) ) / 60.0 +
PAY1 * ( toMinute( b ) - 1 * 60 ) / 60.0;
if ( b.h <= 24 ) { /* trng hp 5 */
if ( b.h < a.h ) return -1;
return PAY1 * ( toMinute( b ) - toMinute( a ) ) / 60.0;
}
return -1;
}
return -1;
}

int main() {
timeCard group[6];
int i, n = 6;

for ( i = 0; i < n; ++i ) {


printf( "Nhap ID cong nhan %d: ", i + 1 );
fgets( group[i].workerID, 8, stdin );
char* t = strrchr(group[i].workerID, '\n' );
if ( t != NULL ) *t = '\0';
printf( "Vao (gio phut): " );
scanf( "%d:%d", &group[i].t_in.h, &group[i].t_in.m );
printf( "Ra (gio phut) : " );
scanf( "%d:%d", &group[i].t_out.h, &group[i].t_out.m );
while ( getchar() != '\n' ) { }
}

for ( i = 0; i < n; ++i ) {


printf( "%8s %02d:%02d %02d:%02d ",
group[i].workerID,
group[i].t_in.h, group[i].t_in.m,
group[i].t_out.h, group[i].t_out.m );
double d = pay( group[i].t_in, group[i].t_out );
if ( d != -1 ) printf( "%-.lf\n", d );
else printf( "%-s\n", "Nhap sai!" );
}
return 0;
}
Vic tnh lng cng nhn ch lm mt ca (trng hp 1, 3, 5 trong hnh di) khng
kh, ch cn tnh thi gian chnh lch gia hai thi im ra vo ca (quy thnh bng
pht tnh, xem bi 18 (trang 81), chuyn thnh gi ri nhn vi lng quy nh.
Nu cng nhn lm bc qua hai ca, tnh lng tr nn phc tp hn nhiu. Tuy nhin
do c quy nh khng lm vt qu hai ca nn ch c 6 trng hp cn tnh lng
c m t trong hnh di y:

249
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


1H 6H 18H 24H 1H

1 3 5
2 4 6
6 trng hp ny chia lm 3 nhm chnh da vo thi im vo ca: 1-2, 3-4, 5-6.
Cc trng hp 1, 2, 3, 4 v 5 cn ch thi im ra ca khng c nh hn thi
im vo ca, iu kin ny nh l mt chn di cho cc iu kin v thi im
ra ca. Ring trng hp 6 cn bin lun iu kin chnh xc trnh xung t iu
kin vi trng hp 5.

Bi 170: (trang 49)


#include <stdio.h>
#include <stdlib.h>

typedef struct {
unsigned face: 4;
unsigned suit: 2;
} Card;

char* Face[] = { "Ach", "Hai", "Ba", "Bon", "Nam", "Sau",


"Bay", "Tam", "Chin", "Muoi", "Boi", "Dam", "Gia" };
char* Suit[] = { "Co", "Ro", "Chuon", "Bich" };

void fill( Card* Deck ) {


int i;
for ( i = 0; i < 52; ++i ) {
Deck[i].face = i % 13;
Deck[i].suit = i / 13;
}
}

void shuffle( Card* Deck ) {


srand( time( NULL ) );
for ( int i = 0; i < 52; ++i ) {
int j = rand() % 52;
Card t = Deck[i]; Deck[i] = Deck[j]; Deck[j] = t;
}
}

void deal( Card* Deck ) {


int i;
for ( i = 0; i < 52; i += 4 )
printf( "%5s %-6s%5s %-6s%5s %-6s%5s %-5s\n",
Face[Deck[i].face], Suit[Deck[i].suit],
Face[Deck[i+1].face], Suit[Deck[i+1].suit],
Face[Deck[i+2].face], Suit[Deck[i+2].suit],
Face[Deck[i+3].face], Suit[Deck[i+3].suit] );
}

int main() {
Card deck[ 52 ];

fill( deck );

250
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


shuffle( deck );
deal( deck );
return 0;
}
Thng tin v mt l bi gm nc (Face) v cht (Suit) i i vi nhau nn ta dng
structure Card lu l hp l. Mng deck cc structure Card dng lu thng tin mt
b bi. tit kim khng gian lu cc thnh vin ca structure Card c lu di
dng s trong cc bit field (xem bi 171, trang 251); khi xut l bi nc v cht
c th ca l bi c tham chiu trong bng lookup Face v Suit.
Hm fill() dng khi to cc l bi trong mng deck. Khi gn nc cho l bi th
i (i [0, 52)) ta dng cng thc i % 13 nc ca l bi lun thuc [0, 13).
Khi gn cht cho l bi ta cng c th lm tng t vi cng thc i % 4, nhng nn
dng cng thc i / 13 hn v:
- Vn bo m cht ca l bi i / 13 [0, 4) do i [0, 52).
- Cht s c gn ging nhau cho tng b 13 l bi. Do 13 khng l bi s ca 4
nn dng cng thc i % 4 c, nu khng s c l bi cng nc cng cht.
Hm shuffle() dng trn bi ngu nhin. Thao tc ny c tin hnh nh sau: hon
chuyn tng l bi cn trn vi mt l bi ngu nhin trong 52 l bi, ngha l c th
hon chuyn vi chnh n.
Hm deal() dng chia bi, m phng gn vi thc t ging cc thao tc khc trong
bi tp, thao tc ny thc hin nh sau: chia tng t 4 l bi cho 4 ngi chi theo
ng th t, mi ngi mt l bi.

Bi 171: (trang 49)


#include <stdio.h>

union charbit {
char c;
struct {
unsigned b0:1, b1:1, b2:1, b3:1,
b4:1, b5:1, b6:1, b7:1;
} b;
};

int main() {
union charbit n;

printf( "Nhap 1 ky tu: " );


scanf( "%c", &n.c );
printf( "%u %u %u %u %u %u %u %u\n",
n.b.b7, n.b.b6, n.b.b5, n.b.b4,
n.b.b3, n.b.b2, n.b.b1, n.b.b0 );
return 0;
}
Ta dng k thut dual view, xem d liu t cc hng khc nhau vi s h tr ca
hai kiu d liu:
- union l mt kiu d liu c bit, ti nhng thi im khc nhau, c th lu gi
cc i tng c kiu v kch thc khc nhau.
Khc vi structure, union khai bo nhiu kiu d liu, nhng trong mt thi im ch
c duy nht mt tr c lu vi mt trong cc kiu d liu khai bo trong union.
251
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Cc thnh vin ca structure ni tip nhau trong vng nh cp cho structure, cn cc


thnh vin ca union chng lp ln nhau trong cng mt vng nh cp cho union, c
kch thc bng kch thc ca kiu d liu ln nht c khai bo trong union.
V trnh bin dch khng th xc nh ta lu d liu kiu no vo union hoc c d
liu t union vi kiu no; nn cn phi nh kiu ca d liu hin c union lu
tr. D liu c truy xut t union thng qua ton t truy xut thnh vin "." hoc
"->", ging nh vi structure.
Mt tin ch khi dng union l ghi d liu vo union vi mt kiu v c chnh d
liu t union vi mt kiu khc, c hai kiu ny u khai bo trong union. Bi
tp trn dng cch ny din dch (interpreted) d liu: ghi d liu vo union vi
kiu char, sau c chnh d liu t union vi kiu structure cha cc bit field.
- Mt bit field l mt bin nguyn cha mt s ch nh cc bit. bit field gip
lu tr mu tin di dng nn gn nht. V d:
structure Date cha nn:
struct Date {
unsigned month;
unsigned day;
int year;
};
structure Date nn bng cch dng bit field, kch thc ch cn 4 byte:
struct Date {
unsigned month: 4; /* lu c 24 thng */ .
unsigned day : 5; /* lu c 25 ngy */
int year : 22; /* lu c 222 nm (-2097152 n +2097151) */
};
Ngoi cch dng cc ton t bitwise, ngi ta dng bit field nh l mt cch thao
tc n tng bit c th theo tn.
Trong bi tp trn, dng union tr char c din dch thnh structure cc bit
field. Sau ta dng ton t truy xut thnh vin thao tc n tng bit c th
theo tn khai bo ca chng trong cc bit field.

Bi 172: (trang 49)


#include <stdio.h>

long filesize( char* filename ) {


long length = -1L;
FILE* f;
f = fopen( filename, "rb" );
if ( f ) {
fseek( f, 0L, SEEK_END );
length = ftell( f );
fclose( f );
}
return length;
}

int main( int argc, char *argv[] ) {


while ( --argc ) {
char* fname = *(++argv);
long len = filesize( fname );
if ( len == -1L )

252
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


printf( "%s [unknown]\n", fname );
else
printf( "%s [%ld byte(s)]\n", fname, len );
}
return 0;
}
C hai c ch di chuyn n v tr ch nh trong mt tp tin nh phn.
- Cch kinh in l dng hm:
int fseek( FILE* stream, long offset, int origin );
Hm ny dng thay i v tr ca con tr ni truy xut tp tin (file position
indicator) lin kt vi stream, ty theo tr ca offset v origin. V tr mi l mt
on di offset byte k t v tr c ch nh bi origin. origin phi l mt trong
cc macro sau (thuc stdio.h):
SEEK_SET im bt u tp tin
SEEK_CUR im hin ti ca con tr ni
SEEK_END im kt thc tp tin
offset phi l mt s long, c th dng (di chuyn ti), m (di chuyn lui), 0 (ng
ti ch).
V d: fseek( f, 0L, SEEK_END ); con tr ni ch ngay im cui tp tin.
- Hm long ftell( FILE* stream ); tr v v tr hin ti ca con tr ni nh mt
s long. Vi stream nh phn, chnh l s byte k t u tp tin ti con tr ni.
Vi stream vn bn, hm hot ng khng chnh xc.
Nh vy, trc ht ta di chuyn con tr ni n im cui tp tin bng fseek(),
ri dng ftell() ly v tr ca n, y cng chnh l kch thc ca tp tin. Ch
l stream ni vi tp tin phi c m ch nh phn ("rb" : ch c (read) v
nh phn (binary)), ftell() hot ng chnh xc.
Do dng kiu long nn fseek() v ftell() c th b hn ch bi kch thc tp tin,
ta c th thay th bng cch dng cp hm:
int fgetpos( FILE* stream, fpos_t* position );
int fsetpos( FILE* stream, const fpos_t* position );
V d dng fgetpos():
fpos_t filesize( char* filename ) {
fpos_t length = -1;
FILE* f = fopen( filename, "rb" );
if ( f ) {
fseek( f, 0L, SEEK_END );
fgetpos( f, &length );
fclose( f );
}
return length;
}

Bi 173: (trang 49)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
FILE *file1, *file2;
int i;

253
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


double r;

srand( time( NULL ) );


file1 = fopen( "INTEGER.DAT", "w" );
if ( !file1 ) { perror( "Loi!" ); return 1; }
for ( i = 0; i < 5; ++i )
fprintf( file1, "%d\n", rand() );
fclose( file1 );

file2 = fopen( "REAL.DAT", "w" );


if ( !file2 ) { perror( "Loi!" ); return 1; }
for ( i = 0; i < 5; ++i )
fprintf( file2, "%f\n", rand() / ( double) RAND_MAX );
fclose ( file2 );
printf( "Ghi xong file...\n" );

file1 = fopen( "INTEGER.DAT", "r" );


if ( !file1 ) { perror( "Loi!" ); return 1; }
while ( fscanf( file1, "%d", &i ) != EOF )
printf( "%8d ", i );
putchar( '\n' );
fclose( file1 );

file2 = fopen( "REAL.DAT", "r" );


if ( !file2 ) { perror( "Loi!" ); return 1; }
while ( fscanf ( file2, "%lf", &r ) != EOF )
printf( "%8.5f ", r );
putchar( '\n' );
fclose( file2 );
printf( "Doc xong file...\n" );
return 0;
}
Bi tp ny n tp thao tc nhp xut c nh dng vo stream vn bn vi s h tr
ca cc hm sau:
- Hm fprintf() ging vi hm printf(), ngoi tr tham s u tin ca n l stream
xut m ta s ghi n. V d: ghi mt s d liu ra thit b xut chun ( stdout,
mc nh lin kt vi mn hnh), ta dng:
printf( "%d %.1f %-39s", n, flt, word );
Tng t, ghi chng vo stream:
fprintf( out_stream, "%d %.1f %-39s", n, flt, word );
stdout cng c xem nh tp tin nn c th dng fprintf() nh printf():
fprintf( stdout, "%d %.1f %-39s", n, flt, word );
- Hm fscanf() ging vi hm scanf(), ngoi tr tham s u tin ca n l stream
nhp m ta s nhn d liu. V d: c vo mt s d liu t thit b nhp chun
(stdin, mc nh lin kt vi bn phm), ta dng:
scanf( "%d %f %39s", &n, &flt, word );
Tng t, c chng t stream:
fscanf( in_stream, "%d %f %39s", &n, &flt, word );
stdin cng c xem nh tp tin nn c th dng fscanf() nh scanf():
fscanf( stdin, "%d %f %39s", &n, &flt, word );
Nu fscanf() c n cui tp tin, n s tr v tr EOF.

Bi 174: (trang 49)


254
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

#include <stdio.h>

int main() {
FILE* f;
unsigned code;
char name[32];
char add[32];
char birthday[10];

f = fopen( "PERSON.DAT", "r" );


if ( !f ) { perror( "Loi!" ); return 1; }
while ( ( fscanf( f, "%u:%32[^,],%32[^:]:%10[^\n]",
&code, name, add, birthday ) ) != EOF ) {
printf( "%-32s[code: %u]\n", name, code );
printf( " Address : [%s]\n", add );
printf( " Birthday: [%s]\n", birthday );
}
fclose( f );
return 0;
}
Cng ging nh hm scanf(), fscanf() dng cc chui nh dng, gi chnh xc
hn l cc c t chuyn i (conversion specification), gip x l chuyn i rt
linh hot d liu nhp. C php nh sau:
%[*][field_width][length_modifier]specifier
- Ty chn field_width l mt s nguyn dng ch nh s ti a cc k t c
c v chuyn i. V d: scanf( "%32s", s ); s nhn vo s ti a 32 k t (k c
k t space nu c trong d liu nhp.
- Ty chn length_modifier, ty theo specifier tng ng, m t chi tit thm
specifier . V d: %lf gm length_modifier l v specifier f x l d liu nhp
thnh mt s double.
- specifier ch nh kiu tham s v cch d liu nhp c x l chuyn i. Mi
specifier c mt tham s tng ng. Mt vi specifier t c m t trong cc ti
liu ting Vit:
specifier Kiu tham s M t
[scanset] char * Tp k t dng chuyn i. Xem bn di.
n int * Khng c d liu nhp, scanf() lu s k t c
c cho n lc t ng nhp vo tham s tng
ng. V d:
scanf( "%s%f%n%i", s, &x, &d, &y );
printf( "[%s][%g][%d][%i]\n", s, x, d, y );
nhp abc 3.14 100
xut [abc][3.14][8][100]
*c Khng c Mt du % n, khng lu tr nhp.
Specifier [...] tng ng vi s, ngoi ra n cn so trng d liu nhp vi tp k
t gia hai du [] gi l scanset (c th c hoc khng k t khong trng, c th c
c k t [ v ]), ngha l scanf() s ngng chuyn i d liu nhp khi c k t nhp
khng thuc scanset.
V d: ch nhp vo s cc k t s, ngng nhp ngay khi pht hin k t khc s.
scanf( "%[0-9]s", s );

255
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Nu k t u tin ca scanset l ^, s ngng chuyn i d liu nhp khi gp k t


thuc scanset.
V d: nhp 10 k t vo s, ngng nhp khi pht hin du hai chm.
scanf( "%10[^:]s", s );
Chui %*specifier s c d liu ch nh bi specifier nhng b qua khng gn
cho tham s no.
V d: nhp 10/20, s t tr 10 vo x, b qua du /, t tr 20 vo y.
scanf( "%d%*c%d", &x, &y );
Bi tp: vit hm update(), dng cp nht cho mt structure Student. Vi nhng
trng khng cn cp nht, c th nhn phm Enter b qua.
typedef struct {
char name[20];
int age;
float mark;
} Student;

void update( Student *student ) {


char _name[20], buf, *t;
int _age, size;
float _mark;

printf( "Nhap [Enter] de bo qua\n" );


printf( "Ten moi? " );
fgets( _name, 20, stdin );
if ( ( t = strrchr( _name, '\n' ) ) != NULL ) *t = '\0';
if ( strlen( _name ) > 0 ) strcpy( student->name, _name );

printf( "Tuoi moi? " );


while ( scanf( "%1[\n]", &buf ) == 0 ) {
if ( scanf( "%d", &_age ) == 1 ) student->age = _age;
scanf( "%*[^\n]" );
}

printf( "Diem moi? " );


while ( scanf( "%1[\n]", &buf ) == 0 ) {
if ( scanf( "%f", &_mark ) == 1 ) student->mark = _mark;
scanf( "%*[^\n]" );
}
printf( "Cap nhat xong...\n" );
}

Bi 175: (trang 50)


#include <stdio.h>
#define UPPER( a ) (a) = ((a)>='a' && (a)<='z')? (a)-32:(a)

int main( int argc, char* argv[] ) {


FILE *fin, *fout;
int ch;

if ( argc != 3 ) {
printf( "Cu phap: UPPER lowerfile upperfile\n" );
return 0;
}
256
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

if ( ( fin = fopen( argv[1], "r" ) ) == NULL ) {


perror( "Loi mo file nhap" );
return 1;
} else if ( ( fout = fopen(argv[2], "w") ) == NULL ) {
perror( "Loi mo file xuat" );
fclose(fin);
return 1;
}

while ( ( ch = fgetc( fin ) ) != EOF )


fputc( UPPER( ch ), fout );

fclose( fin );
fclose( fout );
printf( "Chuyen thanh chu hoa xong...\n" );
return 0;
}
lm vic vi tng k t trong mt tp tin, dng cc hm sau:
- Hm int fgetc( FILE* stream ): ly k t k tip t stream ch nh v tng mt
con tr ni dng truy xut tp tin. K t c c nh mt unsigned char v c
chuyn i thnh int. Nu n cui tp tin hoc gp li hm fgetc() tr v EOF. Vi
tp tin nh phn, phi dng feof() kim tra cui tp tin.
- Hm int fputc( int ch, FILE *stream ): ghi k t ch n stream ch nh ri
tng con tr ni dng truy xut tp tin. K t nhp s c chuyn i thnh
unsigned char. Hm fputc() tr v tr ca k t ghi hoc EOF nu gp li. Vi tp
tin nh phn, phi dng ferror() xc nh c li xy ra.
- getc() tng t fgetc() v putc() tng t fputc() nhng l cc macro.

Bi 176: (trang 50)


#include <stdio.h>

int main( int argc, char* argv[] ) {


FILE *fin, *fout;
int ch;

if ( argc != 3 ) {
printf( "Cu phap: CIPHER originalfile encodefile\n" );
printf( "hoac : CIPHER encodefile originalfile\n" );
return 0;
}

if ( ( fin = fopen( argv[1], "r" ) ) == NULL ) {


perror( "Loi mo file nhap" );
return 1;
} else if ( ( fout = fopen( argv[2], "w" ) ) == NULL ) {
perror( "Loi mo file xuat" );
fclose( fin );
return 1;
}

while ( ( ch = fgetc( fin ) ) != EOF )


fputc( ( ch + 128 ) % 256, fout );

257
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

fclose( fin );
fclose( fout );
printf( "Xu ly xong...\n" );
return 0;
}
Dng cc hm fgetc() v fputc(), ging bi 175 (trang 256). y l m ha i
xng nn chng trnh trn c th dng m ha ln gii m.

Bi 177: (trang 50)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( int argc, char* argv[] ) {


FILE *fin;
int ch, pos;

if ( argc != 3 ) {
printf( "Cu phap: TESTFILE <options> filename\n" );
printf( "Options:\n"
" n sinh n ky tu ngau nhien, dat vao 'filename'\n"
" -r hien thi noi dung 'filename'\n"
" -v hien thi noi dung 'filename', thu tu nguoc\n" );
return 0;
}

/* To file cha k t ngu nhin: n filename */


if ( argv[1][0] != '-' ) {
srand( time( NULL ) );
FILE* fout = fopen( argv[2], "w" );
if ( fout == NULL ) {
perror( "Loi" );
return 1;
}
for ( int i = 0; i < atoi( argv[1] ); ++i )
fputc( rand() % 26 + 'A', fout );
fclose( fout );
printf( "File da duoc tao...\n" );
}
/* Hin th ni dung file: -v filename */
else if ( !strcmp( argv[1], "-v" ) ) {
if ( ( fin = fopen( argv[2], "r" ) ) == NULL ) {
perror( "Loi" );
return 1;
}
while ( ( ch = fgetc( fin ) ) != EOF ) {
fputc( ch, stdout );
fputc( ' ', stdout );
}
fclose( fin );
printf( "\nCuoi file...\n" );
}
/* Hin th ni dung file theo th t ngc li: -r filename */
else if ( !strcmp( argv[1],"-r" ) ) {
258
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


pos = -1;
if ( ( fin = fopen( argv[2], "r" ) ) == NULL ) {
perror( "Loi" );
return 1;
}
do {
fseek( fin, 1L * pos, SEEK_END );
if ( ( ch = fgetc( fin ) ) != EOF ) {
fputc( ch, stdout );
fputc( ' ', stdout );
}
pos--;
} while ( ch != EOF );
fclose( fin );
printf( "\nDau file...\n" );
} else {
printf( "Tham so khong hop le\n" );
return 2;
}
return 0;
}
Sau khi x l cc ty chn dng lnh, chng trnh s la chn thc thi mt trong
cc cng vic sau:
- To tp tin cha cc k t ngu nhin: ty chn dng lnh c chuyn t chui
thnh s int bng hm atoi(). Hm fputc() ghi tng k t vo stream, cc k t
ly ngu nhin trong on [0, 16) + 'A' (bng alphabet ch hoa).
- Hin th ni dung tp tin: khi m stream xut, con tr ni truy xut tp tin nm
ngay u tp tin. Dng fgetc() ly ln lt tng k t v dng fputc() xut ra mn
hnh. Ch , cc lnh sau y l tng ng:
fputc( ch, stdout );
putc( ch, stdout );
putchar( ch );
- Hin th ni dung tp tin theo th t ngc: sau khi m stream xut, dng fseek()
nh v con tr ni truy xut tp tin ch cui tp tin (khng phi ch k t cui tp
tin). i ngc ln u tp tin qua tng k t, xem bi 172 (trang 252), offset pos
phi l s m v gim dn tng n v.

Bi 178: (trang 50)


#include <stdio.h>

int main() {
int c, nlines = 0, f = 1;

while ( ( c = getchar() )!= EOF ) {


if ( f ) {
printf( "%3u: ", ++nlines );
f = 0;
}
putchar( c );
if ( c == '\n' ) f = 1;
}
return 0;
}
259
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Khi chng trnh C chy, c 3 stream m sn lin kt vi n:


- stream nhp chun stdin, lin kt vi bn phm. Ta c th nh hng li stream
ny bng cch dng filter (b lc) hay pipe (ng ng). H iu hnh thng h
tr cc tc v ny:
lines < p1.c dng pipe, stdin ca lines l p1.c
type p1.c | lines dng filter, stdin ca lines l kt qu lnh type
Cc lnh sau y u ly mt k t t stream nhp chun (stdin) a vo ch:
ch = fgetc( stdin );
ch = getc( ch, stdin );
ch = getchar();
- stream xut chun stdout, lin kt vi mn hnh. Ta c th nh hng li stream
ny kt qu xut vo mt tp tin khc.
type p1.c > p2.c stdout ca lnh type l p2.c
lines < p1.c > p2.c stdout ca lines l p2.c
Cc lnh sau y u t k t ch vo stream xut chun (stdout):
fputc( ch, stdout );
putc( ch, stdout );
putchar( ch );
- stream li chun stderr.
Chng trnh hot ng nh sau:
stdin (bn phm, tp tin ngun) ch = getchar()
nu ch = '\n' chn s dng (unsigned int) vo stream
putchar( ch ) stdout (mn hnh, tp tin ngun khc)
Bi tp: Nhp t bn phm cho n khi nhp k t #. m s [space], [enter] v cc
k t khc (k c k t #).
#include <stdio.h>

int main() {
char c;
unsigned space, ret, other;
space = ret = other = 0;
do {
c = getchar();
switch ( c ) {
case '\n': ret++; break;
case ' ': space++; break;
default: other++;
}
} while ( c != '#' );
printf( "[space]: %u, [return]: %u, [other]: %u \n", space, ret, other );
return 0;
}

Bi 179: (trang 51)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
int code;
char name[20];
260
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


double avgmark;
} STUDENT;

void createFile( char *s ) {


FILE *f;
STUDENT r;
char c;
printf( "GHI FILE\n" );
f = fopen( s, "a" );
if ( !f ) fprintf( stderr, "Loi tao file\n" );
else {
do {
do {
c = 0;
printf( "Nhap mot mau tin( y/n )? " );
scanf( "%1[yn]c", &c );
while ( getchar() != '\n' ) { }
} while ( !c );
if ( c != 'n' ) {
printf( " Ma so > " );
scanf( "%d", &r.code );
while ( getchar() != '\n' ) { }
printf( " Ten > " );
fgets( r.name, 20, stdin );
char* t = strrchr( r.name, '\n' );
if ( t != NULL ) *t = '\0';
printf( " Diem TB > " );
scanf( "%lf", &r.avgmark );
while ( getchar() != '\n' ) { }
fwrite( &r, sizeof( STUDENT ), 1, f );
}
} while ( c != 'n' );
fclose( f );
printf( "Da ghi file...\n" );
}
}

void readFile( char *s ) {


FILE *f;
STUDENT r;
printf( "DOC FILE\n" );
f = fopen( s, "r" );
if ( !f ) fprintf( stderr, "Loi mo file\n" );
else {
int count = 0;
while( ( fread( &r, sizeof( STUDENT ), 1, f ) ) != 0 )
printf( "%-3d%-5d%-16s%-5g\n", ++count, r.code, r.name, r.avgmark );
printf( "Tong cong: %d record(s)\n", count );
fclose( f );
}
}

long find( FILE *f, int x ) {


STUDENT r;
int n;
do {
261
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


long d = ftell( f );
n = fread( &r, sizeof( STUDENT ), 1, f );
if ( x == r.code ) return d;
} while ( n );
return -1;
}

void adjustFile( char *s ) {


FILE *f;
STUDENT r;
int x;
printf( "SUA\n" );
f = fopen( s, "r+b" );
if ( !f ) fprintf( stderr, "Loi mo file\n" );
else {
printf( "Ma so > ");
scanf( "%d", &x );
long d = find( f, x );
if ( d > -1 ) {
fseek( f, d, SEEK_SET );
fread( &r, sizeof( STUDENT ), 1, f );
printf( " %s\n", r.name );
printf( "Diem moi > " );
scanf( "%lf", &r.avgmark );
while ( getchar() != '\n' ) { }
fseek( f, d, SEEK_SET );
if ( fwrite( &r, sizeof( STUDENT ), 1, f ) )
printf( "Da cap nhat...\n");
}
else printf( "Khong tim thay...\n" );
fclose( f );
}
}

int main() {
char c;
char s[20];

printf( "Ten file? " );


scanf( "%19s", &s );
while ( getchar() != '\n' ) { }
if ( *s == '\0' ) strcpy( s, "DEFAULT.DAT" );
do {
printf( "MENU (File '%s')\n", s );
printf( "----\n"
"[1]. Them\n"
"[2]. Doc\n"
"[3]. Sua\n"
"[4]. Thoat\n");
printf( "Chon tac vu: " );
c = getchar();
while ( getchar() != '\n' ) { }
switch ( c - 48 ) {
case 1: createFile( s ); break;
case 2: readFile( s ); break;
case 3: adjustFile( s );
262
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}
} while ( c != '4' );
printf( "Bye...\n" );
return 0;
}
Khi c ghi cc structure vo mt tp tin, tt nht ta xem tp tin nh tp tin nh
phn. Nh vy, c ghi mt structure ging nh c ghi mt khi byte c kch thc
tng ng, bng cch dng phi hp cc hm:
- Hm size_t fread( void *buf, size_t size, size_t count, FILE *stream );
c count i tng, mi i tng c kch thc size byte, t stream v lu n vo
mng do buf ch n. Sau , con tr ni truy xut tp tin s di chuyn mt on
bng s k t c c, fread() cng tr v s k t ny.
- Hm size_t fwrite( const void *buf, size_t size, size_t count, FILE *stream
); ghi count i tng, mi i tng c kch thc size byte, t mng do buf ch
n vo stream. Sau , con tr ni truy xut tp tin di chuyn mt on bng s
k t c ghi, fwrite() tr v s k t thc s ghi thnh cng.
di chuyn trong tp tin nh phn, dng cc hm: fseek(), ftell(), rewind().
Cc thao tc trn structure trnh by trong phn bi tp v structure. Bi tp ny
ch tp trung vo thao tc c ghi mt structure vo tp tin:
- To tp tin (hoc ghi thm): tp tin vi tn nhp vo (hoc tn mc nh
DEFAULT.DAT) c m vi ch ghi tip ("a" - append). Tng structure sau khi
nhp thng tin s c ghi nh mt khi byte vo tp tin bng hm fwrite().
- c tp tin: tp tin c m vi ch c ("r" - read). Ln lt tng khi byte
tng ng vi mt structure c c vo structure tm bng hm fread(). Sau
thng tin c trch t structure tm ny xut ra mn hnh.
- Hiu chnh tp tin: tp tin c m vi ch c c cp nht ("r+"). V tr ca
structure cha thng tin cn hiu chnh do hm find() ca chng ta cung cp. Ta
thc hin mt chui thao tc ln lt theo th t sau:
Di chuyn n v tr ny bng hm fseek().
c khi byte tng ng vi mt structure ra structure tm bng fread().
Hiu chnh d liu trn structure tm.
Li di chuyn n v tr ca structure trong tp tin bng hm fseek().
Ghi structure tm ( hiu chnh) vo tp tin bng fwrite().
- Hm find(): c ln lt tng khi byte tng ng vi mt structure ra structure
tm ri kim sot thnh vin code ca chng tm c structure cn tm. ng
thi dng ftell() lu v tr ti u cc khi byte tng ng vi structure ang c.
V tr ny s c tr v nu pht hin ra structure cn tm.
Cn kim sot k buffer nhp, sc stream nhp trnh st k t '\n' khi nhp s
hoc khi nhn mt k t bng getchar():
while ( getchar() != '\n' ) { }
Bn cn trnh li ph bin: st k t '\n' trong buffer nhp khi gi mt module
ca chng trnh v module tip theo chu nh hng lm chng trnh chy khng
theo iu khin.
Bn cng nn hc tp cch to menu n gin nh trong bi.

Bi 180: (trang 52)


#include <stdio.h>

263
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


#include <string.h>

typedef struct {
char w[8]; /* t c lu (ch thng) */
int freq; /* tn s xut hin t */
} WORD;

int main() {
WORD words[1000];
char filename[20];
char s[255];
char* delimiter = " ,;.:?!()\"\\'\n";
FILE *fin;
int i, k, nlines, nwords;

do {
printf( "Nhap ten file: " );
scanf( "%19s", filename );
fin = fopen( filename, "r" );
if ( !fin )
printf( "Khong tim thay file: %s\n", filename );
} while ( !fin );

nlines = nwords = k = 0;
while ( fgets( s, sizeof( s ), fin ) != NULL ) {
nlines++;
char* p = s;
while ( ( p = strtok( p, delimiter ) ) != NULL ) {
p = strlwr( p );
for ( i = 0; i < k; ++i )
if ( ( strcmp( words[i].w, p ) ) == 0 )
{ words[i].freq++; break; }
if ( i == k ) {
strcpy( words[k].w, p );
words[k++].freq = 1;
}
nwords++;
p = NULL;
}
}
fclose( fin );

printf( "File %s co %d dong, %d tu, voi tan so cac tu:\n",


filename, nlines, nwords );
for ( i = 0; i < k; ++i ) {
printf( "%8s:%3d ", words[i].w, words[i].freq );
if ( i > 0 && (i + 1) % 4 == 0 ) putchar( '\n' );
}
putchar( '\n' );
return 0;
}
Thao tc ch yu ca bi tp trn l c mt dng vn bn t tp tin (xem nh m
trong ch vn bn) bng hm fgets(). Ch , chui do fgets() nhn vo c c
k t '\n', cn lit k trong tp delimiter strtok() lc ra.

264
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Dng vn bn sau khi c vo chui th tin hnh tch t bng strtok(), dng vng
lp x l chui in hnh, xem bi 118 (trang 190).
Mi t tch ra s c kim tra xem c trong mng words hay khng (so snh
bng strcmp()). Mng ny lu cc structure WORD, bao gm t c lu (ch thng)
v tn s xut hin ca t .

Bi 181: (trang 52)


#include <stdio.h>
#include <string.h>

int main() {
FILE* fin;
char buf[255];
char s[30];
char* p;
int nline = 0;

do {
printf( "Nhap ten file: " );
scanf( "%29s", s );
while ( getchar() != '\n' ) { }
fin = fopen( s, "r" );
if ( !fin ) printf( "Khong tim thay file: %s\n", s );
} while ( !fin );

printf( "Nhap chuoi tim: " );


fgets( s, 30, stdin );
if ( ( p = strrchr( s, '\n' ) ) != NULL ) *p = '\0';

while ( fgets( buf, sizeof( buf ), fin ) != NULL ) {


if ( ( strstr( buf, s ) ) != NULL ) {
printf( "Dong %d: ", nline );
p = buf;
while ( ( p = strstr( p, s ) ) != NULL ) {
printf( "%d ", p - buf );
p++;
}
putchar( '\n' );
}
nline++;
}
fclose( fin );
return 0;
}
Tng t bi 180 (trang 263), tng dng ca tp tin vn bn cng c c nh hm
fgets(). Sau khi c dng vn bn vo chui, ta tin hnh tm v tr chui con bng
strstr(), dng vng lp x l chui in hnh, tng t nh bi 116 (trang 186).

Bi 182: (trang 53)


#include <stdio.h>
#include <string.h>

typedef struct {
265
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


char name[15];
char tel[15];
char add[25];
} PERSON;

void createBinFile( char *s ) {


FILE *f;
PERSON r;
char c;
printf( "Tao file nhi phan %s...\n", s );
f = fopen( s, "w" );
if ( !f ) fprintf( stderr, "Loi tao file\n" );
else {
do {
do {
c = 0;
printf( "Nhap mot mau tin( y/n )? " );
scanf( "%1[yn]c", &c );
while ( getchar() != '\n' ) { }
} while (!c);
if ( c != 'n' ) {
char *t;
printf( " Ten > " );
fgets( r.name, 15, stdin );
if ( ( t = strrchr( r.name, '\n' ) ) != NULL ) *t = '\0';
printf( " Dien thoai > " );
fgets( r.tel, 15, stdin );
if ( ( t = strrchr( r.tel, '\n' ) ) != NULL ) *t = '\0';
printf( " Dia chi > " );
fgets( r.add, 25, stdin );
if ( ( t = strrchr( r.add, '\n' ) ) != NULL ) *t = '\0';
fwrite( &r, sizeof( PERSON ), 1, f );
}
} while ( c != 'n' );
fclose( f );
}
}

void createTextFile( char *s, char *s1 ) {


FILE *f, *f1;
PERSON r;
printf( "Tao file van ban %s...\n", s );
f1 = fopen( s1, "r" );
f = fopen( s, "w" );
if ( !f1 || !f ) fprintf( stderr, "Loi mo file\n" );
else
while ( ( fread( &r, sizeof( PERSON ), 1, f1 ) ) != 0 )
fprintf( f, "%-15s%-15s%-25s\n", r.name, r.tel, r.add );
fclose( f ) ;
fclose( f1 );
}

void displayTextFile( char *s ) {


FILE *f;
printf( "Hien thi file van ban %s...\n", s );
f = fopen( s, "r" );
266
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


if ( !f ) fprintf( stderr, "Loi mo file\n" );
else {
char buf[100];
while ( fgets( buf, sizeof( buf ), f ) != NULL )
fprintf( stdout, "%s", buf );
}
fclose(f);
}

int main() {
createBinFile( "PERSON.DAT" );
createTextFile( "PERSON.TXT", "PERSON.DAT" );
displayTextFile( "PERSON.TXT" );
return 0;
}
Bi tp trn gip nm vng v phn bit cc hm x l tp tin trong c hai trng
hp dng stream nh phn v stream vn bn.
Cc yu cu ca bi tp c thc hin bng cc hm sau:
- Hm createBinFile(): vic to mt tp tin nh phn lu cc structure c trnh
by chi tit trong bi 179 (trang 260). Ta dng hm fwrite() lu cc khi byte
tng ng vi tng structure vo tp tin nh phn.
- Hm createTextFile(): mi khi byte tng ng vi mt structure c c ln
lt t tp tin nh phn vo structure tm bng hm fread(). Cc thng tin trch t
structure tm c b tr theo mt chui nh dng nht nh v c ghi vo tp tin
vn bn bng hm fprintf(). Hm fprintf() tng t hm printf(), nhng ghi kt
xut vo stream thay v vo ng xut chun stdout.
- Hm displayTextFile(): n gin c tng dng vn bn trong tp tin vn bn
bng hm fgets() v xut ra mn hnh (dng printf() hoc fprintf()) .

Bi 183: (trang 53)


#include <stdio.h>

void reverse ( FILE* fin, FILE* fout ) {


char buf[255];
if ( fgets( buf, sizeof( buf ), fin ) == NULL ) return;
reverse( fin, fout );
fprintf( fout, "%s", buf );
}

int main( int argc, char* argv[] ) {


FILE *fin, *fout;

if ( argc != 3 ) {
printf( "Cu phap: REVERSE originalfile reversefile\n" );
return 0;
}
if ( ( fin = fopen( argv[1], "r" ) ) == NULL ) {
perror( "Loi mo file nhap" );
return 1;
} else if ( ( fout = fopen( argv[2], "w" ) ) == NULL ) {
perror( "Loi mo file xuat" );
fclose( fin );
return 1;
267
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}

reverse( fin, fout );


fclose( fin );
fclose( fout );
printf( "Dao nguoc de quy xong...\n" );
return 0;
}
C s gi quy y l: khi ta dng hm fgets() c mt dng t tp tin fin
v dng hm fprintf() ghi dng vo tp tin fout, mt con tr ni truy xut tp
tin s c duy tr trong fin ln trong fout ch v tr truy xut k tip, cho n khi
cc tp tin ny c ng.
V vy, d khng thay i cc tham s trong mi li gi quy, v tr cc con tr
ni cng t ng thay i. n lc con tr ni ca tp tin fin ch n cui,
quy s dng.
cc dng c t fin, ghi theo th t ngc vo fout, ta dng quy u, xem
bi 142 (trang 41). Ngha l khi quy chm dt, cc dng c t fin mi c y
ra khi stack v ghi theo nguyn tc LIFO vo fout.

Bi 184: (trang 53)


#include <stdio.h>

typedef struct { int dd, mm, yy; } DATE;


typedef struct {
char name[10];
DATE bd;
float salary;
} EMP;

long datecmp( DATE *d1, DATE *d2 ) {


long t1, t2;
t1 = ( d1->yy - 1900 ) * 365 + ( d1->mm - 1 ) * 31 + d1->dd;
t2 = ( d2->yy - 1900 ) * 365 + ( d2->mm - 1 ) * 31 + d2->dd;
return ( t1 - t2 );
}

int main() {
EMP e, e1, e2;
FILE * fp;
int i, j, n;

fp = fopen( "EMP.DAT", "wb" );


if ( !fp ) {
perror( "Loi" );
return 1;
}
printf( "Nhap so nhan vien: " );
scanf( "%d", &n );
while ( getchar() != '\n' ) { }
printf( "Nhap (ten, ngay, thang, nam sinh, luong):\n" );
for ( i = 0; i < n; ++i ) {
printf( "%d > ", i + 1 );
scanf( "%9s%d%d%d%f", e.name, &e.bd.dd, &e.bd.mm, &e.bd.yy, &e.salary );

268
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


fwrite( &e, sizeof( e ), 1, fp );
}
fclose ( fp );
printf( "Nhap du lieu xong ...\n" );

fp = fopen( "EMP.DAT", "r+b" );


if ( !fp ) { perror( "Loi" ); return 1; }

for ( i = n - 1; i > 0; --i ) {


fread( &e1, sizeof( EMP ), 1, fp );
for ( j = 0 ; j < i ; ++j ) {
fread( &e2, sizeof( e2 ), 1, fp );
if ( datecmp( &e2.bd, &e1.bd ) > 0 ) {
fseek( fp, -2*(long)sizeof( EMP ), SEEK_CUR );
fwrite( &e2, sizeof ( EMP ), 1, fp );
fwrite( &e1, sizeof ( EMP ), 1, fp );
}
else e1 = e2;
}
rewind ( fp );
}

printf ( "Xuat danh sach sap xep: \n" );


while ( fread ( &e, sizeof( e ), 1, fp ) )
printf( "%s\t %d/%d/%d \t%7g\n",
e.name, e.bd.dd, e.bd.mm, e.bd.yy, e.salary );
fclose( fp );
return 0;
}
Sp xp tng theo tui c ngha l sp xp gim theo ngy, thng, nm sinh. C th
so snh ngy thng bng hm difftime() ca time.h. y, hm datecmp() do
chng ta vit trn khng tr v chnh xc thi gian chnh lch gia hai thi im
nhng cng so snh hai thi im.
Ta chn gii thut sp xp kiu ni bt (bubble sort) do c im so snh v hon
chuyn d liu trong gii thut din ra gia hai phn t k tip nhau. iu ny thun
li cho thao tc trn tp tin v khng phi di chuyn nhiu qu bng fseek(). Xem
ch gii chi tit bn di.
for ( i = n - 1; i > 0; --i ) {
/* e1 l structure u */
fread( &e1, sizeof( EMP ), 1, fp );
for ( j = 0 ; j < i ; ++j ) {
/* ti y con tr ni lun sau e1, e2 l structure k tip sau e1 */
fread( &e2, sizeof( e2 ), 1, fp );
/* so snh e2 v e1, sp xp gim theo ngy */
if ( datecmp( &e2.bd, &e1.bd ) > 0 ) {
/* nu c sp xp, lui 2 structure ghi e2 ri e1 */
fseek( fp, -2*(long)sizeof( EMP ), SEEK_CUR );
fwrite( &e2, sizeof ( EMP ), 1, fp );
fwrite ( &e1, sizeof ( EMP ), 1, fp );
/* sau khi ghi, e2 by gi l e1, con tr ni ngay sau e1 */
}
/* khng sp xp, dn e1 thnh e2, con tr ni ngay sau e1 */
else e1 = e2;
}
269
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


rewind ( fp ); /* tr li u file, chun b mt chui bubble mi */
}
Quan trng nht trong truy xut ngu nhin tp tin nh phn l xc nh c chnh
xc v tr con tr ni truy xut tp tin ti mi thi im.
Sau y l cch sp xp bng gii thut sp xp kiu chn (Selection Sort) d hiu
hn nhng phi di chuyn trong tp tin bng fseek() nhiu hn. Xem ch gii chi
tit bn di.
long d = 0L;
long maxpos;
/* ... */
for ( i = 0; i < n - 1; ++i ) {
/* d ch v tr structure ang chn sp xp */
fseek( fp, d, SEEK_SET );
fread( &e1, sizeof( e1 ), 1, fp );
for ( j = i + 1 ; j < n ; ++j ) {
fread( &e2, sizeof( EMP ), 1, fp );
if ( datecmp( &e2.bd, &e1.bd ) > 0 )
/* maxpos ch v tr structure c ngy sinh ln hn (sp xp gim theo ngy) */
maxpos = ftell( fp ) - sizeof( EMP );
}
/* ghi hon chuyn hai structure vo file */
fseek( fp, maxpos, SEEK_SET );
fwrite ( &e1, sizeof ( EMP ), 1, fp );
fseek( fp, d, SEEK_SET );
fwrite ( &e2, sizeof ( EMP ), 1, fp );
d += sizeof( EMP );
}
rewind( fp ); /* tr li u file xut */

Bi 185: (trang 54)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void createMatrixFile( FILE* fin ) {


int m, n, i, j;
printf( "Nhap m, n: " );
scanf( "%d%d", &m, &n );
fprintf( fin, "%d %d\n", m, n );
for ( i = 0; i < m; ++i, fputc( '\n', fin ) )
for ( j = 0; j < n; ++j )
fprintf( fin, "%lf ", rand() / ( double )RAND_MAX );
printf( "Tao xong file chua ma tran...\n" );
}

int mulMatrixFile( FILE* f1, FILE* f2, FILE* f3 ) {


int m1, n1, m2, n2, i, j, k;
double *a, *b, t;
/* dng m v ct n ca ma trn */
fscanf( f1, "%d%d", &m1, &n1 );
fscanf( f2, "%d%d", &m2, &n2 );
if ( n1 != m2 ) { fclose( f1 ); fclose( f2 ); return 2; }

a = ( double * )calloc( m1 * n1, sizeof( double ) );


270
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


b = ( double * )calloc( m2 * n2, sizeof( double ) );
if ( !a || !b ) {
if ( a != NULL ) free( a );
if ( b != NULL ) free( b );
return 3;
}
/* c cc phn t n mng mt chiu */
for ( i = 0; i < m1; ++i )
for ( j = 0; j < n1; ++j )
fscanf( f1, "%lf", &a[i*n1 + j] );
for ( i = 0; i < m2; ++i )
for ( j = 0; j < n2; ++j )
fscanf( f2, "%lf", &b[i*n2 + j] );

/* nhn ma trn, dng cng thc nh x mng hai chiu thnh mng mt chiu */
fprintf( f3, "%d %d\n", m1, n2 );
for ( i = 0; i < m1; ++i, fputc( '\n', f3 ) )
for ( j = 0; j < n2; ++j ) {
for ( t = 0.0, k = 0; k < n1; ++k )
t += a[i*n1 + k] * b[k*n1 + j];
fprintf( f3, "%lf ", t );
}

free( b );
free( a );
printf( "Nhan ma tran da xong...\n" );
return 0;
}

int main( int argc, char* argv[] ) {


if ( argc < 3 ) {
printf( "Cu phap: file1 file2 file3\n" );
printf( " 2 tham so: tao hai file chua ma tran"
" so thuc ngau nhien\n"
" 3 tham so: nhan 2 ma tran trong file1"
" va file2, dat ket qua vao file3\n" );
return 0;
}

srand( time( NULL ) );


if ( argc == 3 ) {
for ( int i = 1; i < argc; ++i ) {
FILE* fin = fopen( argv[i], "w" );
if ( !fin ) {
printf( "Loi tao file\n" );
return 1;
}
createMatrixFile( fin );
fclose( fin );
}
}
else {
FILE* f1 = fopen( argv[1], "r" );
FILE* f2 = fopen( argv[2], "r" );
FILE* f3 = fopen( argv[3], "w" );
if ( !f1 || !f2 || !f3 ) {
271
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


printf( "Loi mo file\n" );
if ( f1 != NULL ) fclose( f1 );
if ( f2 != NULL ) fclose( f2 );
if ( f3 != NULL ) fclose( f3 );
return 1;
}
if ( mulMatrixFile( f1, f2, f3 ) ) {
printf( "Loi nhan ma tran\n" );
return 2;
}
fclose( f1 );
fclose( f2 );
fclose( f3 );
}
return 0;
}
Bi tp ny gip chng ta c mt kinh nghim tt v cc thao tc tng ng gia
vic c ghi n thit b chun (stdin, stdout) vi thao tc c ghi stream. Cc hm
dng trong bi tp c thit k nhn tham s l con tr FILE, nhm lm ni bt
c im ny:
- Hm createMatrixFile() to tp tin cha ma trn: thay v to v xut thng tin ca
ma trn (s hng, s ct, cc phn t) ra mn hnh (chuyn n n stream stdout),
ta to v chuyn chng n mt stream ang m. Ngha l ta thay th cc hm xut
mc nh ra stdout thnh cc hm x l tp tin nh:
putchar( '\n' ) thay bng fputc( '\n', fin ).
printf( ... ) thay bng fprintf( fin, ... ).
Cn nhn mnh, stdin v stdout cng l mt loi stream. V d, thay v to ma trn
ngu nhin v lu vo tp tin, ta c th to ma trn ngu nhin v xut thng ra mn
hnh bng: createMatrixFile( stdout );
Nhap m, n: 2 3
2 3 dng v ct ma trn mi to
0.001251 0.563585 0.193304 cc phn t ma trn mi to
0.808741 0.585009 0.479873
Tao xong file chua ma tran...
- Hm mulMatrixFile(): nhn ma trn ri chuyn kt qu vo mt tp tin khc.
Trc ht cn c thng tin ma trn: thay v dng scanf() nhn dng v ct t
bn phm, ta dng fscanf() nhn chng t stream. Cc phn t ca ma trn c
lu tr lin tc trong tp tin nh hnh nh ca mng mt chiu. trnh cp pht
phc tp ta dng mng mt chiu vi cng thc nh x phn t a[i][j] t mng hai
chiu m x n thnh phn t b[i*n + n] trong mng mt chiu, thun tin cho vic c
cc phn t t tp tin lu tr ra mng mt chiu bng fscanf().
Nhn ma trn c phc tp mt cht v dng cng thc nh x phn t. Cui cng,
vic ghi ma trn kt qu vo tp tin chng khc g xut chng ra mn hnh, vi s h
tr ca cc hm fputc() (thay putchar()) v fprintf() (thay printf()).
Cng ging nh hm createMatrixFile(), ta c th gi hm trn nh sau:
createMatrixFile( stdin, stdin, stdout );
2 3 dng v ct ma trn 1
3 2 dng v ct ma trn 2
1.1234 2.4321 3.2135 cc phn t ma trn 1
4.6352 5.1027 6.0248
272
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


7.2413 8.6721 cc phn t ma trn 2
9.3425 6.7236
5.4321 4.3214
2 2 dng v ct ma trn tch
24.487344 22.953648 cc phn t ma trn tch
67.873387 67.915295
Nhan ma tran da xong...

Bi 186: (trang 54)


#include <stdio.h>
#include <string.h>

typedef struct {
char name[80];
long pos;
} INDEX;

long search( FILE* indexf, char* target ) {


INDEX t;
rewind( indexf );
while ( fread( &t, sizeof( INDEX ), 1, indexf ) != 0 )
if ( strcmp( strlwr( target ), strlwr( t.name ) ) == 0 )
return t.pos;
return -1L;
}

void lookIndex( FILE* textf, FILE* indexf ) {


char line[32];
printf( "Nhan Ctrl+Z de dung\n" );
long pos = 0;
while ( printf( "Ten sach? " ), fgets( line, sizeof( line ), stdin ) ) {
if ( ( pos = search( indexf, line ) ) == -1 )
printf( "Khong tim thay sach [%s]", line );
else if ( fseek( textf, pos, 0 ) != 0 )
printf( "Vi tri ghi sai%ld\n", pos );
else
while( fgets( line, sizeof( line ), textf ) && line[0] != '*' )
fputs( line, stdout );
}
}

void createIndex( FILE* textf, FILE* indexf ) {


INDEX t;
char line[32];
while ( ( fgets( line, sizeof( line ), textf ) ) != NULL ) {
long pos = 0;
t.pos = pos;
strcpy( t.name, line );
while ( fgets( line, sizeof( line ), textf ) && line[0] != '*' ) {}
/* thng tin kt thc vi dng bt u bng du * mi c lu thnh ch mc */
if ( line[0] == '*' )
fwrite( &t, sizeof( INDEX ), 1, indexf );
pos = ftell( textf );
}
printf( "Tao xong file index...\n" );
273
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}

int main( int argc, char *argv[] ) {


FILE *textf, *indexf;

if ( argc != 4 || ( strcmp( argv[1], "-v" ) && strcmp( argv[1], "-i" ) ) ) {


printf( "Cu phap: LOOK <option> text_file index_file\n"
"Options: -i tao index_file\n"
" -v dung index_file tim trong text_file\n" );
return 0;
}
if ( strcmp( argv[1], "-i" ) == 0 ) {
textf = fopen( argv[2], "r" );
indexf = fopen( argv[3], "wb" );
if ( !textf || !indexf ) {
if ( textf != NULL ) fclose( textf );
if ( indexf != NULL ) fclose( indexf );
perror( "Loi" );
return 0;
}
createIndex( textf, indexf );
} else {
textf = fopen( argv[2], "r" );
indexf = fopen( argv[3], "rb" );
if ( !textf || !indexf ) {
if ( textf != NULL ) fclose( textf );
if ( indexf != NULL ) fclose( indexf );
perror( "Loi" );
return 0;
}
lookIndex( textf, indexf );
}
fclose( indexf );
fclose( textf );
return 0;
}
Vi tp tin ln, cha nhiu loi d liu khc nhau (nh bitmap, nh vector 2D hoc
3D, m thanh, font, text, ), ngi ta dng mt tp tin ch mc (index) truy xut
nhanh d liu cn thit trong tp tin ln trn. Tp tin ch mc ny l mt tp tin nh
phn cha cc structure (cn gi l cc record - b d liu, mu tin), mi structure
lu cc thng tin lu tr ca mt d liu tng ng trong tp tin ln: loi d liu,
offset (v tr k t u tp tin ln), kch thc d liu, Bi tp trn minh ha cch
truy xut ny.
Cn thc hin phi hp hai loi thao tc truy xut tp tin trong bi tp trn:
- Thao tc trn tp tin ch mc nh phn, xem bi tp 179 (trang 260), dng cc hm:
fwrite() (khi to ch mc), fread() (khi tm kim, c thng tin mt ch mc).
- Thao tc trn tp tin d liu vn bn, xem bi tp 180 (trang 263), dng cc hm:
fseek() (dch chuyn n offset d liu cn truy xut), fgets() (c tng dng d
liu vn bn).
Xem xt cn thn biu thc iu kin kim tra cc tham s dng lnh, tuy n gin
nhng d nhm ln. Ch th t cc biu thc iu kin con:

274
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bo li nu s tham s dng lnh khc 4 (argc != 4); trong trng hp s tham s


dng lnh bng 4 (ngha l argc != 4 sai) th bo li nu tham s th nht khc "-v"
ln (iu kin AND, khng phi OR) "-i".

Bi 187: (trang 55)


#include <stdio.h>
#define MAXCOLS 80
#define MAXROWS 24

int main() {
char fname[30];
FILE* fin;
int nlines, ncols;
do {
printf( "Nhap ten file: " );
scanf( "%29s", fname );
fin = fopen( fname, "r" );
if ( !fin ) perror( "Loi" );
} while ( !fin );
while ( getchar() != '\n' ) { }
nlines = ncols = 0;
while ( !feof( fin ) ) {
char c = fgetc( fin );
if ( !feof( fin ) ) {
ncols++;
if ( ncols == MAXCOLS || c == '\n' ) {
nlines++;
if ( nlines == MAXROWS ) {
printf( "\nNhan Enter de xem tiep..." );
getchar(); /* nhn k t Enter xem tip */
nlines = 1;
}
putchar( c );
ncols = 1;
}
else putchar( c );
}
}
fclose( fin );
return 0;
}
Tng t bi 175 (trang 256), tng k t ca tp tin c c bng hm fgetc() v
c xut ra mn hnh bng hm putchar(), cho n khi n cui tp tin, kim tra
bng feof().
Ta cn kim sot:
- S k t trn mi dng (s ct): bng cch m s k t in ra ( ncols), khng cho
vt s k t ti a ngh cho mi dng (MAXCOLS).
- S dng cho mi trang: bng cch m s dng in ra (nlines), s dng ny tng
khi k t in ra l '\n' hoc ncols bng MAXCOLS nn cn chuyn n in dng
mi. Khi nlines bng s dng ti a ngh cho mi trang (MAXROWS), ta dng li
v xut dng nhc "\nNhan Enter de xem tiep...".

275
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Ch khi to li ncols = 1 cho mi dng mi v khi to li nlines = 1 cho mi


trang mi.

Bi 188: (trang 55)


#include <stdio.h>

int main( int argc, char* argv[] ) {


FILE *f1, *f2, *f;
int n1, n2, n;

if ( argc != 4 ) {
printf( "Cu phap: SORT file1 file2 sortfile\n" );
printf( "file1 va file phai sap xep tang truoc\n" );
return 0;
}
f1 = fopen( argv[1], "r" );
f2 = fopen( argv[2], "r" );
f = fopen( argv[3], "w" );
if ( f1 && f2 && f ) {
FILE *ft;
int t1, t2;
t1 = fscanf( f1, "%d", &n1 );
t2 = fscanf( f2, "%d", &n2 );
/* c tng k t bng fscanf() cho n cui mt trong 2 file ngun */
while ( t1 != EOF && t2 != EOF ) {
if ( t1 != 1 || t2 != 1 ) { printf( "Loi doc\n" ); break; }
/* k t no nh hn a vo n, k t cn li dng so snh tip */
if ( n1 < n2 ) {
n = n1;
/* sau khi a k t vo n, c tip file cha k t */
t1 = fscanf( f1, "%d", &n1 );
} else {
n = n2;
t2 = fscanf( f2, "%d", &n2 );
}
/* ghi n vo file ch bng fprintf() */
if ( fprintf( f, "%d ", n ) == EOF ) { printf( "Loi ghi\n" ); break; }
}
/* stream (file) cha c ht t tn l ft */
if ( t1 == EOF && t2 != EOF ) {
n = n2;
ft = f2;
} else if ( t1 != EOF && t2 == EOF ) {
n = n1;
ft = f1;
} else return 0;
/* c tip tng k t t stream ft vo stream ch */
t1 = 1;
do {
if ( fprintf( f, "%d ", n ) == EOF ) { printf( "Loi ghi\n" ); break; }
if ( t1 != 1 ) { printf( "Loi doc\n" ); break; }
} while ( ( t1 = fscanf( ft, "%d", &n ) ) != EOF );
}
if ( f1 ) fclose( f1 );
if ( f2 ) fclose( f2 );
276
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


if ( f ) fclose( f );
printf( "Tron ket thuc...\n" );
return 0;
}
Bn tham kho bi 81 (trang 141) v thao tc trn (merge) hai mng (cha cc
phn t tng/gim) thnh mt mng (cha cc phn t tng/gim). Thao tc ny thc
hin ging nhau vi cc i tng tng t nh run, tp tin cha cc phn t
tng/gim, Chia lm hai giai on:
- Chn phn t thch hp t mt trong hai tp tin ngun, ghi vo tp tin ch.
- Khi duyt ht phn t ca mt trong hai tp tin ngun, ln lt ghi cc phn t
trong tp tin cn li vo tp tin ch.
Xem ch thch chi tit trong bi gii.

Bi 189: (trang 55)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main( int argc, char* argv[] ) {


FILE *f;
char *buf, *p;
char *fname;
size_t size, readout;
int i, pos;

if ( argc > 3 || argc < 2 ) {


printf( "SPLIT big_file [size_in_Kb]\n" );
return 0;
}
/* x l kch thc truyn t tham s dng lnh */
size = ( argc == 2 ) ? 128 : ( size_t )atol( argv[2] );
size <<= 10;
buf = ( char* ) calloc( size, sizeof( char ) );
if ( !buf ) {
buf = ( char* ) calloc( 2048, sizeof( char ) );
if ( !buf ) { perror( "Loi" ); return 1; }
}

f = fopen( argv[1], "rb" );


if ( !f ) { perror( "Loi" ); free( buf ); return 2; }
/* x l tn file ln c tn cc file con */
fname = strdup( argv[1] );
if ( ( p = strrchr( fname, '.' ) ) != NULL ) {}
if ( p != NULL ) pos = p - fname;
else pos = strlen( fname );
strncpy( fname + pos, ".xxx", 4 );
pos++;

i = 0;
do {
snprintf( fname + pos, 4, "%03d", i++ );
/* c t tp tin ln vo buf */
readout = fread( buf, sizeof( char ), size, f );
/* ghi s byte tht s c c t buf vo tng tp tin con */
277
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


FILE* f1 = fopen( fname, "wb" );
fwrite( buf, readout, sizeof( char ), f1 );
fclose( f1 );
printf( "File %s [%lu byte(s)]\n", fname, ( unsigned long )readout );
} while ( readout >= size );

printf( "Chia file ket thuc... [%d file(s)]\n", i );


fclose( f );
free( buf );
return 0;
}
Cc vn quan trng cn gii quyt trong bi tp trn:
- Kch thc cc tp tin con: tham s dng lnh th hai (kch thc tp tin con) c
chuyn t chui thnh s long bng hm atol(), kch thc ny dng cp pht
vng nh m buf, lm ni trung chuyn d liu c t tp tin ln v ghi vo tp tin
con.
Ch kch thc ny tnh bng Kb nn cn nhn vi 210 c kch thc tnh bng
byte, tng ng vi dch tri 10 n v.
- Tn cc tp tin con: tn tp tin ln c tch ly phn trc du "." (hoc ly c
tn nu khng c du "."), k tip c ghp vi chui ".xxx", cc chui k t s
ln lt t 000 tr i c t ngay sau du ".", chng ln chui "xxx" to tn tp
tin con. Hm snprintf() rt hu dng khi to cc chui vi nh dng ch nh nh
trn.
- Kch thc ca tp tin con cui cng: tp tin con cui cng thng c kch thc
nh hn cc tp tin trc do l phn l cn li ca tp tin. Mi khi c mt khi byte
t tp tin ln n buf bng hm fread(), ta cn ly tr tr v readout ca fread(),
y l s byte tht s c c so vi s byte yu cu c (size, tham s th ba ca
fread()). S byte tht s c c readout ny c dng nh l s byte yu cu
ghi t buf vo tp tin con, tham s th hai ca fwrite(); cng dng nh iu kin
kt thc vng lp tch tp tin.

Bi 190: (trang 55)


#include <stdio.h>
#include <ctype.h>

size_t hexDump( FILE *file ) {


char data[16];
size_t i, j, size, count = 0;
/* Dng tiu */
fputs( " ", stdout );
for ( i = 0; i < sizeof data; ++i )
printf( "+%lX ", (long unsigned)i );
/* Phn ni dung, bn tri hex, bn phi ASCII */
puts( " Contents" );
do {
size = fread( data, 1, sizeof data, file );
if ( size ) {
/* a ch offset (base address) */
printf( "%08lX ", (long unsigned)count );
count += size;
/* "hex dump", size l lng d liu tht s c c */

278
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


for ( i = 0; i < size; ++i )
printf( "%02X ", data[i] );
/* cho dng cui, khi size < sizeof data */
for ( ++i; i <= sizeof data; ++i )
fputs( " ", stdout );
putchar( ' ' );
/* "ASCII dump", d liu tng ng */
for ( j = 0; j < size; j++ )
putchar( isprint( data[j] ) ? data[j] : ' ' );
putchar( '\n' );
}
} while ( size == sizeof data );
return count;
}

int main( int argc, char* argv[] ) {


FILE* file;
if ( argc != 2 ) {
printf( "Syntax: HEXDUMP <filename>\n" );
return 0;
}

file = fopen( argv[1], "rb" );


if ( file != NULL ) {
printf( "%lu bytes\n", ( long unsigned )hexDump( file ) );
fclose( file );
} else perror( argv[1] );
return 0;
}
D liu t tp tin c c tng khi 16 byte, ng vi mt hng xut, vo vng m
data. Sau , d liu tht s c c trong vng m data c hin th bng hai
cch:
- Bn tri: phn hex dump, dng chui nh dng %X in s hex.
- Bn phi: phn ascii dump dng hm putchar() in tng k t in c, kim
tra iu ny bng hm isprint() ca ctype.h. Trong ASCII, cc k t in c
nm trong khong 0x20 n 0x7E.
Thc hin cho n khi d liu tht s c c nh hn kch thc vng m, ngha
l ht d liu c.
Bi tp khng kh, ch cn ch trnh by thch hp theo yu cu. Xem ch gii chi
tit trong bi gii.

Bi 191: (trang 56)


#include <stdio.h>
#include <time.h>

void printCal( int d, int top ) {


int i, j, n, k;
n = top - ( 7 - d ) - 28;
n = ( n > 0 ) ? n : 0;
for ( j = 1; j <= n; ++j )
printf( "%5d", top - n + j );
for ( ; j < d + 1; ++j )
printf( "%5c", ' ' );
279
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


k = 1;
for ( ; j <= 7; ++j )
printf( "%5d", k++ );
putchar( '\n' );
for ( i = 2; i <= 5; ++i, putchar( '\n' ) )
for ( j = 1; j <= 7; ++j ) {
if ( k > top ) break;
printf( "%5d", k++ );
}
}

int main() {
char* month[] = { "Gieng", "Hai", "Ba", "Tu", "Nam", "Sau",
"Bay", "Tam", "Chin", "Muoi", "Muoi Mot", "Chap" };
int m, y, top;
struct tm tmstruct;

printf( "Nhap thang, nam (sau 1900): " );


scanf( "%d%d", &m, &y );
tmstruct.tm_sec = 0;
tmstruct.tm_min = 0;
tmstruct.tm_hour = 0;
tmstruct.tm_mday = 1;
tmstruct.tm_mon = m - 1;
tmstruct.tm_year = y - 1900;
mktime( &tmstruct );

switch ( m ) {
case 4: case 6: case 9: case 11: top = 30; break;
case 2: top = 28 + ( ( y % 4 == 0 && y % 100 ) || y % 400 == 0 ); break;
default: top = 31;
}
printf( "Thang %s %d\n", month[m - 1], y );
printf( " CN Hai Ba Tu Nam Sau Bay\n" );
printCal( tmstruct.tm_wday, top );
return 0;
}
time.h nh ngha thi gian theo hai dng:
- broken-down time: thi gian tch thnh nhm, ngha l thng tin ngy gi c
chia thnh cc thnh phn ring v c lu vo trong mt cu trc c bit do
time.h nh ngha: cu trc tm:
struct tm {
int tm_sec; /* giy (0-60; 1 giy "nhun") */
int tm_min; /* pht (0-59) */
int tm_hour; /* gi (0-23) */
int tm_mday; /* ngy (1-31) */
int tm_mon; /* thng (0-11; tnh t thng 1) */
int tm_year; /* nm (tnh t 1900) */
int tm_wday; /* th (0-6; tnh t Cha nht) */
int tm_yday; /* ngy trong nm (0-365) */
int tm_isdst; /* daylight saving time (-1, 0, 1) */
};
daylight saving time ch dng khi bn chn mi gi (time zone) thuc mt s nc
(n i) v bt ch t ng hiu chnh thi gian theo daylight saving time. Ch

280
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

ny t ng iu chnh ng h tro gi mu n hn so vi thi gian chu n trong


mua xun to cm gic tri t i mu n hn trong mua he.
Ta c th thit lp thi gian chnh xc n giy cho cu trc tm ri chuyn n hm
mktime(), sau khi gi hm tm_wday v tm_yday s c hm tnh ton, ngha l khng
cn thit lp chng trc khi gi hm. y l cch bi tp trn dng.
Cu trc tm cng nhn c khi gi cc hm gmtime(), localtime(); thc cht l
chuyn i t dng thi gian th hai (calendar time) sang.
Khi cn ly thng tin ngy gi chi tit ta dng dng broken-down time.
- calendar time: thi gian th hin nh mt s nguyn c kiu time_t, l s giy tri
qua t giy u tin ca nm 1900 n nay. time_t nhn c khi gi hm mktime();
thc cht l chuyn i t dng thi gian th nht (broken-down time) sang.
Khi cn so snh thi gian, ly thi gian hin ti, ta dng dng calendar time.
H thng

time()

calendar time vi ctime() calendar time dng


kiu s hc time_t nh mt chui

gmtime() asctime()
mktime()
localtime() strftime()

broken-down time tch thng tin


ngy gi a vo cu trc tm

Vic tnh dng u tin ca lch thng trong bi tp c gii quyt nh sau:
Trc ht, t th d ca ngy u thng (0-6, tnh t Cha Nht) ta c tnh c s
ngy u thng c trn dng u: 7 - d.
Vi top l s ngy ti a trong thng, nu s ngy cn li (top - (7 - d)) khng
phn b trn 4 dng tip (cha c 28 ngy), th dng u c cha n ngy cui
thng chnh l s ngy di ra. Ngc li, dng u khng cha ngy cui thng (n =
0).
n = ( top - ( 7 - d ) > 28 ) ? top - ( 7 - d ) - 28 : 0;
hoc:
n = ( top - ( 7 - d ) - 28 > 0 ) ? top - ( 7 - d ) - 28 : 0;
vit r hn:
n = top - ( 7 - d ) - 28;
n = ( n > 0 ) ? n : 0;
Nh vy dng u trnh by nh sau: t 1 n n in n ngy cui thng, t n + 1 n d
in khong trng, t d + 1 n cui bt u in nhng ngy u thng.
Cc dng cn li in ln lt cc ngy k tip, khng c vt top.

Bi 192: (trang 56)


#include <stdio.h>
#include <string.h>
#include <time.h>

int main() {
char* week[] = { "Chu Nhat", "Thu Hai", "Thu Ba", "Thu Tu",
"Thu Nam", "Thu Sau", "Thu Bay" };
281
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


char* month[] = { "Gieng", "Hai", "Ba", "Tu", "Nam", "Sau",
"Bay", "Tam", "Chin", "Muoi", "Muoi Mot", "Chap" };
time_t now, l_now, gmt_now;
struct tm *t;
char s[80];

time( &now );
t = localtime( &now );
snprintf( s, 30 + strlen( week[t->tm_wday] ) + strlen( month[t->tm_mon] ),
"Hom nay %s, ngay %02d thang %s nam ",
week[t->tm_wday], t->tm_mday, month[t->tm_mon] );
strftime( s + strlen( s ), 80, "%Y\nBay gio la %I:%M:%S %p", t );
l_now = mktime( t );
gmt_now = mktime( gmtime( &now ) );
printf( "%s %+04g GMT\n", s, difftime( l_now, gmt_now ) / 3600 );
return 0;
}
Thng thng ly thng tin ngy v gi, ta cn phn tch cu trc tm mt cch th
cng. Tuy nhin, time.h cung cp hm size_t strftime( char *str, size_t
maxsize, const char *fmt, const struct tm* time ); cho php chuyn i thng
tin ny t con tr kiu tm time thnh mt chui k t vi nh dng ch nh bi
chui fmt. Hm strftime() s lu chui kt qu vo vng m ch bi con tr str,
c kch thc ti a l maxsize.
Cc chui nh dng trong strftime() (gi l c t chuyn i - conversion
specifier) kh chi tit, nht l vi C99, trnh by thng tin ngy gi cho nhng
yu cu phc tp. Bn tm hiu thm trong nhng ti liu v C.
Hm time() tr v thi gian hin ti di dng time_t, bng hai cch:
now = time( NULL ); /* now kiu time_t */
hoc:
time( &now ); /* sau khi gi hm now thnh calendar time hin ti */
Sau calendar time ny c chuyn cho hm localtime() tr v cu trc tm,
dng broken-down time, cho php ly thng tin thi gian chi tit.
Chui ngy gi trong bi tp c thc hin nh sau:
- Vi thng tin cn chuyn thnh ting Vit (th, thng) ta phi dng thng tin ly
t cc thnh vin ca cu trc tm, ri tra trong cc bng lookup (week, month).
- Vi thng tin truy xut trc tip, chuyn cu trc tm trn cho hm strftime()
tch thng tin thi gian bng cc specifier. V d: %Y (nm), %I (gi, h 0-12), %M
(pht), %S (giy), %p (AM hoc PM cho h 0-12),
- Thng tin v gi chu n cn c theo kinh tuy n Greenwich (GMT - Greenwich
Mean Time) c tnh bng cch ly chnh lch gia hai calendar time:
Thi im hin ti a phng l_now: ly bng localtime() ri dng mktime()
chuyn sang calendar time.
Thi im hin ti kinh tuyn chun Greenwich gmt_now: ly bng gmtime() ri
dng mktime() chuyn sang calendar time.
Hm difftime() tnh chnh lch (tnh bng giy) gia hai calendar time ny. V
GMT chia theo mi gi nn thi gian chnh lch c chia cho 3600 (s giy/gi).
Bi tp: Vit hm sinh chui code da trn chui s a vo.
- Bn k t u ca code l bn k t u ca s vit hoa. Nu c k t space,
hoc s khng 4 k t, thay th cc k t space bng k t 'X'.
282
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

- Nm k t cui ca code l nm k t cui ca chui thi gian hin ti.


Code: [ABCX03729]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>

char* genCode( char *s ) {


int i;
size_t size = strlen( s ) < 5 ? strlen( s ) : 5;
char* t1 = calloc( size, sizeof( char ) );
char* t2 = calloc( 5, sizeof( char ) );
char* code = calloc( 9, sizeof( char ) );
snprintf( t2, 5, "%-4s", strncpy( t1, s, size ) );
for ( i = 0; i < 5; ++i )
t2[i] = ( t2[i] == ' ' ) ? 'X' : toupper( t2[i] );
snprintf( code, 9, "%s%04d", t2, time( NULL ) % 100000 );
free( t1 );
free( t2 );
return code;
}

int main() {
char *code;
printf( "Code: [%s]\n", code = genCode( "abc" ) );
free( code );
return 0;
}

Bi 193: (trang 56)


#include <stdio.h>
typedef void funcFile( char* );

void createFile( char* s ) {


printf( "Create file [%s]\n\n", s );
}

void readFile( char* s ) {


printf( "Read file [%s]\n\n", s );
}

void adjustFile( char* s ) {


printf( "Adjust file [%s]\n\n", s );
}

int main() {
char c;
funcFile *p[3] = { createFile, readFile, adjustFile };

do {
printf( "\nMENU\n" );
printf( "----\n"
283
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


"1. Them\n"
"2. Doc\n"
"3. Sua\n"
"4. Thoat\n");
printf( "Chon tac vu: " );
c = getchar();
while ( getchar() != '\n' ) { }
if ( c >= '1' && c <= '3' ) p[c - '0' - 1]( "Hello" );
} while ( c != '4' );
printf( "Bye...\n" );
return 0;
}
Khc vi con tr thng thng dng ch n d liu, con tr hm (function pointer,
thng gi l functor) l mt loi con tr dng ch n code. Bn xem cch dng con
tr hm trong v d c ng v chi tit sau:
#include <stdio.h>
/* nh ngha mt s hm c c im ging nhau (tham s, tr tr v, ...) */
int add( int a, int b ) { return a + b; }
int mul( int a, int b ) { return a * b; }
/* khai bo con tr hm c tham s v kiu tr v ging c im trn */
int ( *pFunc )( int, int );
/* khai bo v gn mt mng cc con tr hm */
int ( *apFunc[] )( int, int ) = { add, mul };
/* khai bo mt hm nhn tham s l mt con tr hm */
int caller( int, int, int (*p)( int, int ) );

int main() {
/* gn cho con tr hm mt a ch hm n y nhim n khi gi hm */
pFunc = &add;
/* dereference mt con tr hm ngha l y nhim li gi n hm cn gi
y l hm add(), va c gn a ch trn */
printf( "%d\n", ( *pFunc )( 4, 5 ) );
/* nn dng c php sau, linh ng v d s dng hn, y nhim n hm mul()*/
pFunc = mul; /* tn mt hm xem nh l mt con tr hm! */
/* dng con tr hm nh mt hm! (y nhim gi hm) */
printf( "%d\n", pFunc( 4, 5 ) );
/* dng mt con tr hm trong mng cc con tr hm */
printf( "%d\n", apFunc[0]( 4, 5 ) );
printf( "%d\n", ( *( apFunc + 1 ) )( 4, 5 ) );
/* truyn li gi hm mul() n hm caller() nh l tham s ca caller() */
printf( "%d\n", caller( 4, 5, mul ) );
return 0;
}

int caller( int a, int b, int (*p)( int, int ) ) {


return p( a, b );
}
Vi bi tp cn gii, ta dng mt mng cc con tr hm, mi con tr hm ch n
mt hm nhn tham s l mt chui v c tr tr v l void.
Khi khai bo mng con tr hm thay v dng c php:
void( *p[] )( char* ) = { createFile, readFile, adjustFile };
ta dng typedef nh ngha tn kiu n gin v d qun l hn:
typedef void funcFile( char* );
funcFile* p[3] = { createFile, readFile, adjustFile };
284
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 194: (trang 56)


#include <stdio.h>
#include <math.h>

void tab_func( double( *f )( double ), double a, double b, double step ) {


if ( a > b ) { double t = a; a = b; b = t; }
printf( "%10s%10s\n", "x", "f(x)" );
for ( ; a < b + step; a += step )
printf( "%10.4lf%10.4lf\n", a, ( double )f( a ) );
}

int main () {
tab_func( sin, 0.0, M_PI, M_PI / 8.0 );
return 0;
}
Hm yu cu vit trong bi tp trn nhn mt tham s l mt con tr hm. Xem hm
caller() trong v d phn gii bi tp 192 (trang 281). Ta phi:
- Khai bo mt con tr hm trong danh sch tham s: ch c php khai bo phi
danh sch tham s v tr tr v.
- Dng con tr hm trong thn hm cn vit: do kh nng dng con tr hm nh mt
hm (gi l y nhim gi hm) nn cch dng con tr hm rt t nhin.

Bi 195: (trang 57)


#include <stdio.h>
#include <stdarg.h>

double average( int n, ... ) { /* Hm c danh sch tham s thay i */


int i;
double s = 0;
va_list ap;
va_start( ap, n );
for ( i = 1; i <= n; ++i ) s += va_arg( ap, double );
va_end( ap );
return n ? s / n : 0;
}

int main() {
double x = 32.4, y = 24.7, z = 4.5, t = 11.8;

printf( "x = %.1f y = %.1f z = %.1f t = %.1f\n", x, y, z, t );


printf( "average( 2, x, y ) : %.3f\n", average( 2, x, y ) );
printf( "average( 3, x, y, z ) : %.3f\n", average( 3, x, y, z ) );
printf( "average( 4, x, y, z, t ): %.3f\n", average( 4, x, y, z, t ) );
return 0;
}
Hm yu cu trong bi tp l hm c danh sch tham s thay i (variable argument
list), cn gi l variadic function. C php khai bo hm nh sau:
fn_type fn_name ( [ arg_type_1 fixed_arg_1,
[ arg_type_2 fixed_arg_2, [etc.] ] ]
last_arg_type last_fixed_arg, ... );
V d: hm printf(), hm scanf(),

285
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Khi khai bo prototype, ngoi cc tham s bt buc, cc tham s cn li c thay


th bi chui "...".
Hm loi ny c thc hin vi s h tr ca cc macro trong <stdarg.h> sau:
- void va_start( va_list argptr, last_fixed_arg );
Dng khi to danh sch tham s argptr trc khi dng bi va_arg() v va_end();
last_fixed_arg l tham s cui bt buc khai bo tn trong prototype.
- void va_arg( va_list argptr, type );
Mi ln gi s tch t danh sch tham s argptr ra mt tham s vi kiu type. Ln
gi tip s tr v tham s tip.
- void va_end ( va_list argptr );
Kt thc x l danh sch tham s argptr, khng lu cc tham s khng s dng, khi
c mt li gi va_start() khc bt u x l li danh sch tham s.

Bi 196: (trang 57)


#include <stdio.h>
#define islower( c ) ( (c) >= 'a' && (c) <= 'z' )
#define toupper( c ) ( islower((c))? (c) + ('A'-'a') : (c) )
#define percent( a, b ) ( (b) ? (double)a / b * 100 : 0 )

int main() {
printf( "'c' viet hoa la '%c'\n", toupper( 'c' ) );
printf( "123 la %g%% cua 12345\n", percent( 123, 12345 ) );
return 0;
}

Bi 197: (trang 57)


#include <stdio.h>
#define BitOn( d, n ) ( (d) | ( (int)1 << (n) ) )
#define BitOff( d, n ) ( (d) & ~( (int)1 << (n) ) )
#define BitFlip( d, n ) ( (d) ^ ( (int)1 << (n) ) )
#define isBit( d, n ) ( ( (d) & ( (int)1 << (n) ) ) > 0 )

void printBits( int d ) {


int i, size = sizeof( int ) * CHAR_BIT;
printf( "%d = ", d );
for ( i = size - 1; i >= 0; --i ) {
putchar( isBit( d, i ) + 48 );
if ( i % CHAR_BIT == 0 ) putchar( ' ' );
}
putchar( '\n' );
}

int main() {
int d = 12345;

printf( "So goc : " ); printBits( d );


printf( "Bat bit 8: " ); printBits( BitOn( d, 8 ) );
printf( "Xoa bit 5: " ); printBits( BitOff( d, 5 ) );
printf( "Dao bit 4: " ); printBits( BitFlip( d, 4 ) );
return 0;

286
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Cc macro trong bi tp dng cc ton t bitwise thc hin cc thao tc trn bit,
xem bi tp 56 (trang 111):
- Macro BitOn( d, n ): to mask bng cch dng ton t dch tri <<, dch bit 1 n
ng v tr cn bt bit trong d, sau dng ton t OR bitwise bt bit.

1 1 1 0 1 1 1 1 d

0 0 0 1 0 0 0 0 mask

dch tri
1 n n v
to mask
OR bitwise
- Macro BitOff( d, n ): to mask bng cch dng ton t dch tri <<, dch bit 1 n
ng v tr, sau dng ton t o bit ~ o tt c bit ca mask c mask o.
Trong mask o, bit 0 nm ng v tr cn xa bit trong d, sau dng ton t AND
bitwise xa bit.

1 1 1 1 1 1 1 1 d

1 1 1 0 1 1 1 1 mask o

dch tri n n
0 v, ri o bit
to mask o
AND bitwise
- Macro BitFlip( d, n ): to mask bng cch dng ton t dch tri <<, dch bit 1
n ng v tr cn lt bit trong d, sau dng ton t XOR bitwise lt bit.

1 1 1 1 1 1 1 1 d

0 0 0 1 0 0 0 0 mask

dch tri
0 n n v
to mask
XOR bitwise
- Macro isBit( d, n ): nh tr mt biu thc iu kin xc nh bit ang xem
xt l 0 hay 1. Trc ht, to mask bng cch dng ton t dch tri <<, dch bit 1 n
ng v tr cn kim tra trong d, sau dng ton t AND bitwise AND gia d v
mask. Nu bit kim tra bng 0 th kt qu AND bng 0, ngc li kt qu AND ln hn
0. Ta nh tr biu thc iu kin bo m tr v 0 hoc 1.

1 1 1 0 1 1 1 1 d

0 0 0 1 0 0 0 0 mask

dch tri
0 n n v
to mask
AND bitwise
Hm printBits() dng macro isBit() ny in cc bit ca mt s.
287
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 198: (trang 57)


#include <stdio.h>
#include <limits.h>
#define isBit( d, n ) ( ( (d) & ( (int)1 << (n) ) ) > 0 )
#define LoByte(x) ((x)&(INT_MAX >> sizeof(int)*CHAR_BIT/2-1))
#define HiByte(x) ((x) >> sizeof(int)*CHAR_BIT/2)

void printBits( int d ) {


int size = sizeof( int ) * CHAR_BIT;
int i;
printf( "%d = ", d );
for ( i = size - 1; i >= 0; --i ) {
putchar( isBit( d, i ) + 48 );
if ( i % CHAR_BIT == 0 ) putchar( ' ' );
}
putchar( '\n' );
}

int main() {
int d = INT_MAX / 10;

printf( "Platform %d-bits\n", sizeof( int ) * CHAR_BIT );


printf( "INT_MAX / 10:\n" ); printBits( d );
printf( "High Byte: " ); printBits( HiByte( d ) );
printf( "Low Byte : " ); printBits( LoByte( d ) );
return 0;
}
Cc hng s sau c khai bo trong <limits.h>:
CHAR_BIT: s bit trong 1 byte, t nht l 8.
INT_MAX: tr int ln nht, bng 2k - 1 vi k = sizeof(int)*CHAR_BIT. Nh vy
INT_MAX c s bit sizeof(int)*CHAR_BIT - 1, cc bit u bng 1:
01111111 11111111 11111111 11111111
p dng vit cc macro nh sau:
- Macro HiByte( x ): n gin dch phi s integer x phn na s bit ca chng
loi i cc bit thuc cc byte thp.
S gc: 00001100 11001100 11001100 11001100

Dch phi: 00000000 00000000 11001100 11001100


- Macro LoByte( x ): trc ht to mask bng cch dch phi INT_MAX phn na s
bit - 1 (ton t - u tin hn ton t >>), sau AND bitwise cho x lc ly cc bit
thuc cc byte thp.
S gc: 00001100 11001100 11001100 11001100
Mask: 00000000 00000000 11111111 11111111
Kt qu AND: 00000000 00000000 11001100 11001100

Bi 199: (trang 57)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

288
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


char* firstname( char* s ) {
char *t = strdup( t );
char *r = strtok( strchr( t, ':' ), " :" );
free( t );
return r;
}

int compare( const void* s, const void* s1 ) {


char *t, * t1;
t = firstname( *( char** ) s );
t1 = firstname( *( char** ) s1 );
if ( strcmp( t, t1 ) == 0 ) {
t = strchr( *( char** ) s, ' ' );
t1 = strchr( *( char** ) s1, ' ' );
}
return strcmp( t, t1 );
}

int main() {
int i, n;
char* s[100];
FILE *f;

f = fopen( "EMP.TXT", "r" );


if ( !f ) {
perror( "Loi" );
return 1;
}

printf( "Noi dung...\n" );


i = 0;
while ( ( s[i] = calloc ( 255, sizeof( char ) ) ) != NULL
&& fgets( s[i], 255, f ) != NULL )
printf( "%s", s[i++] );
fclose( f );

printf( "Sap xep...\n" );


n = i;
qsort( ( void* )s, ( size_t )n, sizeof( char* ), compare );
for ( i = 0; i < n; ++i )
printf( "%s", s[i] );
return 0;
}
Gii thut sp xp c xem l nhanh nht l sp xp nhanh (quick sort). Ni dung
gii thut (sp xp tng) nh sau:
void quicksort( int a[], int lo, int hi ) {
int i = lo, j = hi, pivot;
if ( i < j ) {
pivot = a[hi];
do {
while ( i < j && a[i] < pivot ) i++;
while ( j > i && a[j] >= pivot ) j--;
if ( i < j ) swap( a[i], a[j] );
} while ( i < j );
swap( a[i], a[hi] );

289
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


quicksort( a, lo, i - 1 );
quicksort( a, i + 1, hi );
}
}
- Chn mt phn t lm trc pivot.
- Mng cn sp xp c phn hoch (partition) thnh hai phn vi phn t pivot
lm trc sao cho: cc phn t t v tr 0 n v tr pivot - 1 c ni dung nh hn
phn t pivot, cc phn t t v tr pivot + 1 n v tr n - 1 c ni dung ln hn
hoc bng phn t pivot.
- Tip tc chn phn t pivot v phn hoch cho mi phn trong hai phn trn ...
y l mt qu trnh quy vi im dng l khi danh sch c th t.
V bn cht, quick sort ln lt chn cc phn t trong danh sch lm phn t pivot,
phn t ny s c sp xp ng v tr, khi tt c cc phn t u c chn lm
phn t pivot th mng sp xp xong, quy s dng li.
Gii thut phn hoch vi mt phn ca mng, gii hn bi bin di lo v bin trn
hi, c thc hin nh sau:
- Chn phn t cui a[hi] lm trc.
- Qut mng theo 2 hng, t lo ln (i++) v t hi xung (j--), nu vn bnh
thng (sp xp ng) th tip tc qut (2 vng while bn trong), nu sai (sp xp
sai) th hon i.
- Sau khi qut xong (thot khi vng do while, phn t pivot sp ng v tr),
hon i v tr a[hi] (pivot) vi v tr a[i].
Gii thut quick sort c p dng trong hm qsort() ca stdlib.h:
void qsort( void* array, size_t n, size_t size,
int ( *compare )( const void*, const void* ) );
m qsort() s sp xp mng array bng thut ton quick sort theo iu kin do ngi
dng quy nh. Ngi dng nh ngha iu kin sp xp bng cch nh ngha mt
hm callback (hai tham s) so snh hai phn t ca mng, cc tr tr v ca hm ny
(< 0, = 0, > 0) quyt nh chiu sp xp. qsort() gi hm ny thng qua con tr hm
c truyn nh tham s cui ca qsort().
int ( *compare )( const void *, const void * );
Tham s th hai (kiu size_t) l s phn t cn sp xp.
Tham s th ba l kch thc mi phn t ca array, do array c qsort() chuyn
thnh kiu void* nn cn tham s ny xc nh kch thc mi phn t.
Ch l hm callback chuyn tham s truyn ti thnh con tr kiu void*, bn trong
hm ta p kiu tham s ri dng ton t ly ni dung * (dereference - gii quy) so
snh. V d cn so snh 2 phn t kiu int, tham s c truyn nh con tr void*,
ta p kiu thnh int* (khng phi thnh int), ri dng ton t dereference *:
int intcompare( const void* a, const void* b ) {
return *( ( int* ) a ) - *( ( int* ) b );
}
S d nhm ln nu ta cn so snh 2 chui (ngha l hai con tr char*), lc ta p
kiu thnh con tr ch n con tr:
int strcompare( const void* sp1, const void* sp2 ) {
const char* s1 = *( char** )sp1;
const char* s2 = *( char** )sp2;
return strcmp( s1, s2 );
}

290
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Hm firstname() dng strchr() xc nh token th hai, tch firstname t token


ny bng strtok() vi delimiter l space v ":". Delimiter ":" nhm loi du ":"
u chui do strchr() tr v v phng trng hp khng c lastname.
strtok( strchr( t, ':' ), " :" )
V strtok() ph hy chui phn tch nn ta sao chp ra chui t trc khi phn tch.
Sau khi so snh thy firstname ging nhau, ta li dng strchr() tm k t space
phn cch gia firstname v lastname xc nh lastname.

Bi 200: (trang 58)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* firstname( char* s ) {


char *t = strdup( t );
char *r = strtok( strchr( t, ':' ), " :" );
free( t );
return r;
}

int compare( const void* s, const void* s1 ) {


char *t, * t1;
t = firstname( *( char** ) s );
t1 = firstname( *( char** ) s1 );
return strcmp( t, t1 );
}

int compare1( const void* s, const void* s1 ) {


return strcmp( *( char** ) s, *( char** ) s1 );
}

int main() {
int i, n;
char *s[100], *fname[100], *t;
char** p;
char key[20];
char* k = key;
FILE *f;

f = fopen( "PERSON.TXT", "r" );


if ( !f ) {
perror( "Loi" );
return 1;
}
printf( "Noi dung...\n" );
i = 0;
while ( ( s[i] = calloc ( 255, sizeof( char ) ) ) != NULL
&& ( fname[i] = calloc ( 20, sizeof( char ) ) ) != NULL
&& fgets( s[i], 255, f ) != NULL ) {
printf( "%s", s[i] );
fname[i] = firstname( s[i] );
i++;
}
fclose( f );

291
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


n = i;
qsort( ( void* )s, ( size_t )n, sizeof( char* ), compare );
qsort( ( void* )fname, ( size_t )n, sizeof( char* ), compare1 );

printf( "\nNhap firstname: " );


fgets( key, 20, stdin );
if ( ( t = strrchr( key, '\n' ) ) != NULL ) *t = '\0';

p = ( char** )bsearch( ( void * ) &k, ( void * ) fname,


( size_t )n, sizeof( char * ), compare1 );
if ( p )
printf( "Ma vung cua %s: %s\n",
key, strtok( strchr( s[p-fname], '(' ), "()" ) );
else
printf( "Khong tim thay %s\n", key );
return 0;
}
Vi mng sp xp, ngi ta thng dng thut ton tm kim nh phn (binary
search) xc nh nhanh mt phn t trong mng.
Hm bsearch() ca stdlib.h dng thut ton tm kim nh phn tm mt phn t
so trng vi key trong mt mng sp xp array:
void bsearch( const void* key, const void* array, size_t n,
size_t size, int ( *compare )( const void*, const void* ) );
Ba tham s cui ca bsearch() ging hm qsort(), xem bi 199 (trang 288), c bit
l tham s cui l con tr hm ch n hm so snh do ngi dng vit, cho bit
mng array sp xp theo iu kin no.

Trc khi chuyn sang phn Cu trc d liu, chng ta n tp bng cch thc hin
vi bi tp c c t phc tp. Do bi gii di, nn chng ti ch km theo source
code ca sch, khng trnh by y.

Bi tp:
Chng trnh tnh thu thu nhp (Ontario, Canada) da trn ti liu c t sau:
Payroll Deduction Calculations for Ontario Employees
I Gross Income
F Registered Pension Plan Contributions
U1 Union Dues
P Number of Pay Periods
TC Federal Personal Claim
TCP Provincial Personal Claim
XX Number of Dependants below age of 18
YY Labour-sponsored share purchases
F1 Authourized deductions
D CPP contributions year-to-date
C CPP contribution: tr nh hn gia
(4.95% * (I - $3,500 / P), < 0 th dng 0) v (1,861.20 D, 0)
D EI premiums year-to-date
EI EI premiums: tr nh hn gia (1.95% * I) v ($760.50 D, 0)
A Annual Taxable Income : P * (I - F - U1) - F1

292
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

1. Annual Federal tax (T1)


Annual Federal Tax Bracket (FF)
Income Bracket 1 35,595 > 35,595 > 71,190 > 115,739
71,190 115,739
Annual Taxable Income A 2
Rate R 3 16% 22% 26% 29%
A*R 4
Overcharge Constant K 5 0 2,136 4,983 8,455
A*R-K FF
K1 Personal Tax Credit: 16% * TC
K2 CPP, EI credit: 16% * (P * C, ti a 1,861.20) + 16% * (P * EI, ti a 760.50)
T3 Basic Federal Tax: FF - K1 - K2
LCF Labour-sponsored tax credit: tr nh hn gia $750 v 15% * YY
T1 = T3 - LCF

2. Annual Ontario Tax (T2)


Annual Ontario Tax Bracket (PP)
Income Bracket 6 34,010 > 34,010 > 68,020
68,020
Annual Taxable Income A 7
Rate V 8 6.05% 9.15% 11,16%
A*V 9
Overcharge Constant KP 10 0 1,054 2,422
A * V - KP PP
K1P Personal Tax Credit: 6.05% * TCP
K2P CPP, EI credit: 6.05% * (P * C, ti a 1,861.20) + 6.05% * (P * EI, ti a 760.50)
T4 Basic Provincial Tax: PP - K1P - K2P
V1 Total Surtax
Surtax a: (T4 - 3,929) * 20%, 0
Surtax b: (T4 4,957) * 36%, 0
S Provincial Tax Reduction: nh hn gia
(T4 + V1) v (2 * ($190 + $350 * XX) - (T4 + V1), < 0 th dng 0)
LCP Labour-sponsored tax credit: nh hn gia $750 v 15% * YY
Ontario Health Premium (V2)
Income Bracket 11 20,000 >20,000 >36,000 >48,000 >72,000 >200,000
36,000 48,000 72,000 200,000
Annual Taxable 12
Income A
Base Amount 13 0 20,000 36,000 48,000 72,000 200,000
(12) - (13) 14
Rate 15 0% 6% 6% 25% 25% 25%
(14) * (15) 16
Base Premium 17 0 0 300 450 600 750
(16) + (17) 18
Premium Limit 19 0 300 450 600 750 950
Min ca (18) (19) V2
T2 = T4 + V1 + V2 - S - LCP

TP1 Annual Federal Tax per Pay Period: T1 / P


293
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

TP2 Annual Ontario Tax per Pay Period: T2 / P


T Total Tax Deduction per Pay Period: TP1 + TP2
TD Total Deductions: T + C + EI + F + U1
Net Income: I - TD __________
Payroll Deduction Calculator
============================

Please enter the employee's pay period information :


Income for the current pay period : 1600
Registered Pension Plan contributions : 57
Union dues for the current pay period : 7
Please enter the employee's annual information :
Number of pay periods this year : 26
Federal tax credits (as per TD1 form) : 8148
Ontario tax credits (as per TD1 form) : 8196
Number of Dependants < 18 years old : 2
Labor-sponsored share purchases : 0
Authorized deductions : 0
Please enter the employee's year-to-date information :
CPP contributions year-to-date : 500
EI premiums paid year-to-date : 200

Gross Income 1600.00


Deductions:
Federal Tax 189.49
Provincial Tax 92.14
Canada Pension Plan 72.54
Employment Insurance 31.20
RRSP Contributions 57.00
Union Dues 7.00
Total Deductions 449.37
Net Income 1150.63

Bi tp:
Ti khon (account) gm nhiu loi. Ti mt thi im, ti khon c mt s d
(balance). Ghi n (debit) v ghi c (credit) l hai loi bt ton thc hin trn ti
khon. Tc ng ca n khc nhau ty theo loi ti khon:
- Ti khon c s d n (debit balances): ghi n (debit) lm tng balance ca n, ghi
c (credit) lm gim balance ca n. Ti khon c s d n gm cc loi sau:
+ Asset account: ti khon ti sn (tin mt, bt ng sn, thit b, hng tn kho,
khon phi thu). M bt u 1 (ti sn ngn hn), 2 (ti sn di hn).
+ Expense account: ti khon chi ph (chi ph hot ng, khu hao, li vay ph
tr). M bt u 6 (chi ph).
- Ti khon c s d c (credit balances): ghi n (debit) lm gim balance ca n,
ghi c (credit) lm tng balance ca n. Ti khon c s d c gm cc loi sau:
+ Liability account: ti khon n phi tr (cc khon vay, n di hn, li phi
tr). M bt u 3 (n phi tr).
+ Equity account: ti khon u t (khon d phng, li nhun gi li). M bt
u 4 (ngun vn ch s hu).
+ Revenue account: ti khon doanh thu (doanh thu dch v, tin li nhn c).
M bt u 5 (doanh thu).
294
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Thc t c nhiu loi ti khon hn. M ti khon c t 3 n 4 k t, ty theo mc


chi tit.
Giao tc (transaction) gi l hch ton, bao gm mt s bt ton thc hin trn vi
ti khon c lin quan.
V d: mt s hch ton.
- Mua laptop tr bng tin mt:
N ti khon 2112 (Equipment & machine, thit b & my mc) gi tr my nhp v.
C ti khon 111 (Cash on hand, tin mt) tin chi mua my.
- Doanh thu cung cp dch v vi thu gi tr gia tng (VAT) 5%:
N ti khon 111 tng gi tr thanh ton.
C ti khon 511 (Sales, ti khon doanh thu bn hng) doanh thu cha c VAT
C ti khon 3331 (Value Added Tax, ti khon thu gi tr gia tng) VAT phi np.
- Chi ph in nc mua ngoi:
N ti khon 6277 (Outside purchasing services cost, chi ph dch v mua ngoi).
C ti khon 111 chi
Thc t, nhiu hch ton rt phc tp, nhng chng u bo m d n v d c ca
tt c cc ti khon phi cn bng nhau. Mt cn i xy ra thng do bt ton sai.
Nht k k ton ghi nhn cc giao tc trn:
General Journal
Account Description Debit Credit
------- ------------------------------ ---------- ----------
411 Von kinh doanh 100000
111 Tien mat tu von 100000
111 Chi tien mua laptop 3500
2112 Nhap tai san: laptop (3500) 3500
111 Thu tien dich vu 12600
511 Doanh thu dich vu #1234 12000
3331 VAT ca #1234 600
111 Chi tien hoa don dien nuoc 5000
641 Chi phi dien nuoc 5000
111 Agribank chuyen tien mat 22000
311 Vay Agribank 22000
S k ton cn i tng loi ti khon v cho bit d n, d c ca loi ti khon .
Balance Sheet
Account Description Debit Credit
------- ------------------------------ ---------- ----------
111 Cash on hand 134600 8500
2112 Equipment & machine 3500 0
641 Selling expenses 5000 0
------------------------------------------------
Debit Balances 134600
------------------------------------------------------------
411 Working capital 0 100000
311 Short-term loan 0 22000
3331 Value Added Tax 0 600
511 Sales 0 12000
------------------------------------------------
Credit Balances 134600
------------------------------------------------------------
Bo co thu nhp cho thy thu nhp rng (net income) l hiu ca tng doanh thu
(revenues) vi tng chi ph (expenses):
295
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Income Statement
Account Description Debit Credit
------- ------------------------------ ---------- ----------
511 Sales 0 12000
---------- ----------
Total Revenues 12000
------------------------------------------------------------
641 Selling expenses 5000 0
---------- ----------
Total Expenses 5000
------------------------------------------------------------
Net Income 7000.00
------------------------------------------------------------
Ngi s dng chng trnh dng hai menu:
Menu th nht hin th cc tc v c bn: thc hin giao tc, xem nht k k ton,
xem s k ton, xem bo co thu nhp.
------------ MENU ------------
1. Execute transaction
2. View the general journal
3. View the balance sheet
4. View the income statement
5. Quit the program
------------------------------
Khi chn thc hin giao tc (mc 1.), menu th hai s hin th loi giao tc: to ti
khon, ghi n v ghi c n ti khon ch nh.
------ Transaction MENU ------
1. Create account
2. Debit
3. Credit
4. Cancel
------------------------------
Bi tp trn ch kh ch bn phi phn tch c c t vi kin thc thuc v mt
ngnh khc. Sau khi phn tch, bi tp c thc hin d dng khi t chc tt cu
trc d liu dng cha ti khon (account) v giao tc (transaction).

Bi 201: (trang 59)


#include <stdio.h>
#include <stdlib.h>

struct NODE {
int data;
struct NODE* next;
};
typedef struct NODE* NODEPTR;

void InsertFirst( NODEPTR* l, int x ) {


NODEPTR p = ( NODEPTR )malloc( sizeof( struct NODE ) );
p->data = x;
p->next = *l;
*l = p;
}

void InsertLast( NODEPTR* l, int x ) {


296
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


NODEPTR p = ( NODEPTR )malloc( sizeof( struct NODE ) );
p->data = x;
p->next = NULL;
if ( !*l ) *l = p;
else {
NODEPTR q;
for ( q = *l; q->next; q = q->next ) { }
q->next = p;
}
}

void OutList( NODEPTR l, char* s ) {


printf( "%s: ", s );
for ( ; l ; l = l->next ) printf( "[%d]", l->data );
putchar( '\n' );
}

void AfterInsert( NODEPTR l, int d, int x ) {


if ( !l ) return;
if ( l->data == d ) {
NODEPTR p = ( NODEPTR )malloc( sizeof( struct NODE ) );
p->data = x;
p->next = l->next;
l->next = p;
return;
}
AfterInsert( l->next, d, x );
}

int main() {
NODEPTR l = NULL;
int x;

printf( "Nhap 0 de dung: " );


do {
scanf( "%d", &x );
if ( x ) InsertFirst( &l, x );
} while ( x );
OutList( l, "List goc" );

InsertLast( &l, 5 );
OutList( l, "Chen 5 cuoi" );
AfterInsert( l, 3, 4 );
OutList( l, "Chen 4 sau node [3]" );
return 0;
}
Chn node vo danh sch lin kt c vit nh mt thnh phn ca hm nhp
a d liu vo danh sch lin kt.

1. Chn node u
Chui d liu c chn u vo danh sch lin kt s c th t lu tr ngc vi
th t nhp (ngha l cng ngc vi th t duyt - LIFO). Cc bc:
- Cp pht mt node p mi v a y d liu vo node.
- Cho p->next v l tr cng mt ni (cha cng a ch): p->next = l.
297
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

- l by gi thay i thnh p: l = p.
p p p->next = l

l l
l = p

void Solution( NODEPTR* l, int x ) {


NODEPTR p = ( NODEPTR )malloc( sizeof( struct NODE ) );
p->data = x;
p->next = *l;
*l = p;
}
Cn nm vng hai bc cui.
Khi vit hm nhp, s dng thao tc chn ny, con tr l cung cp cho hm nhp phi
khi to trc bng NULL trc.

2. Chn sau node q


Theo quan im node bt k ca danh sch cng l node u (node u ca danh
sch cn li), ta thy thc cht vic chn sau node p l chn node u, vi con tr
qun l danh sch l by gi l q->next (xem li chn node u):
Phi kim tra xem l v q c khc NULL khng trc khi chn.
void Solution( NOPDEPTR l, NOPDEPTR q, int x ) {
if ( l && q ) {
NODEPTR p = ( NODEPTR )malloc( sizeof( struct NODE ) );
p->data = x;
p->next = q->next;
q->next = p;
}
}
Trong trng hp chn sau mt node cha tr d, dng quy:
- quy cho n khi tm ra node q cha tr d. Khi tm ra node q thc hin chn (chn
u vi l by gi l l->next) ri kt thc quy.
- C hai trng hp dng quy: n cui danh sch hoc tm v chn c
node.
void Solution( NODEPTR l, int d, int x ) {
if ( !l ) return;
if ( l->data == d ) {
NODEPTR p = ( NODEPTR )malloc( sizeof( struct NODE ) );
p->data = x;
p->next = l->next;
l->next = p;
return;
}
Solution( l->next, d, x );
}

3. Chn node cui


Chui d liu c chn u vo danh sch lin kt s c th t lu tr ging vi
th t nhp (ngha l cng ging vi th t duyt - FIFO). V vy cch chn cui
thng c la chn hn.
- Cp pht mt node p mi v a y d liu vo node (vi p->next = NULL).
298
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

- Nu danh sch rng th node mi l node u tin nn l = p.


- Nu khng, tm n node cui q (khng phi tm con tr cui). Ta dng mt vng
lp a node q chy t u danh sch n cui, ngha l khi con tr cui ca danh
sch l q->next c tr NULL. y chnh l thao tc d pha trc.
- Con tr cui ny phi ch n p: q->next = p.
void Solution( NODEPTR* l, int x ) {
NODEPTR p = ( NODEPTR )malloc( sizeof( struct NODE ) );
p->data = x;
p->next = NULL;
if ( !*l ) *l = p;
else {
NODEPTR q;
for ( q = *l; q->next; q = q->next ) { }
q->next = p;
}
}
Kh khn do vic phi duyt n cui danh sch lin kt c th c khc phc bng
cch a thm con tr cui (thng gi l con tr last) vo cu trc v chp nhn
thm mt s thao tc x l con tr cui ny.
Vi s lng node t, chn node cui c th thc hin bng quy:
- quy vi phn cn li ca danh sch cho n con tr cui.
- Khi to con tr cui ny thnh mt node v a y d liu vo node.
void Solution( NODEPTR* l, int x ) {
if ( !*l ) {
*l = ( NODEPTR )malloc( sizeof( struct NODE ) );
( *l )->data = x;
( *l )->next = NULL;
return;
}
Solution( &( *l )->next, x );
}

4. Nhp quy
Cch nhp quy cho kt qu ging chn node cui, thun tin do chui lu tr c
th t ging vi chui nhp. Cch ny cng khng dng hm chn node, khng cn
khi to NULL cho con tr u danh sch. V vy thch hp cho vic vit nhanh cc
v d. Khuyt im cch nhp ny l ch p dng vi danh sch lin kt c s node
gii hn hn ch bc quy.
V d sau s nhp cc s nguyn vo danh sch lin kt cho n khi nhp s 0.
NODEPTR Solution() {
int x;
NODEPTR p;
scanf( "%d", &x );
if ( !x ) return NULL;
p = ( NODEPTR )malloc( sizeof( struct NODE ) );
p->data = x;
p->next = Solution();
return p;
}

int main() {

299
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


NODE l;
printf( "Nhap 0 de dung: " );
l = Solution();
/* ... */
}

Bi 202: (trang 59)


#include <stdio.h>
#include <stdlib.h>

struct NODE {
int data;
struct NODE* next;
};
typedef struct NODE* NODEPTR;

NODEPTR InList() {
int x;
NODEPTR p;
scanf( "%d", &x );
if ( !x ) return NULL;
p = ( NODEPTR )malloc( sizeof( struct NODE ) );
p->data = x;
p->next = InList();
return p;
}

void Solution( NODEPTR l ) {


if ( !l ) return;
if ( l->data % 2 == 0 ) { /* iu kin l tr chn */
NODEPTR p = ( NODEPTR )malloc( sizeof( struct NODE ) );
p->data = 0;
p->next = l->next;
l->next = p;
Solution( l->next->next ); /* vt qua node va chn */
}
else Solution( l->next );
}

void OutList( NODEPTR l, char* s ) {


printf( "%s: ", s );
for ( ; l ; l = l->next ) printf( "[%d]", l->data );
putchar( '\n' );
}

int main() {
NODEPTR l;

printf( "Nhap 0 de dung: " );


l = InList();
OutList( l, "List goc" );

Solution( l );
OutList( l, "Chen 0 sau tri chan" );
return 0;

300
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}
Ta dng cch chn quy, nhng ch : trong trng hp phi chn sau tt c cc
node cha tr d vi iu kin no , khi chn mt node xong s khng dng quy
m phi vt qua node va chn vo. V nu node chn vo c cng tr d (hoc c
iu kin rng buc nh d) s gy quy vnh vin lm trn stack.

Bi 203: (trang 60)


void Solution( NODEPTR* l, int x ) {
NODEPTR p = ( NODEPTR )malloc( sizeof( struct NODE ) );
p->data = x;
if ( !*l || ( *l )->data > x ) {
p->next = *l;
*l = p;
} else {
NODEPTR t;
for ( t = *l; t->next && t->next->data < x; t = t->next ) { }
p->next = t->next;
t->next = p;
}
}

/* gi trong hm InList() */
NODEPTR InList() {
int x;
NODEPTR p = NULL;
while ( 1 ) {
scanf( "%d", &x );
if ( !x ) return p;
Solution( &p, x );
}
}
Gii php khng quy nh sau:
- Nu danh sch rng hoc node u cha tr ln hn tr cn chn, ta thc hin thao
tc chn u.
- Nu khng, dng phng php d pha trc, xc nh node trc node cn chn
v thc hin thao tc chn sau mt node bt k.
Mt cch trnh by khc, d hiu hn, cho gii php trn:
void Solution( NODEPTR* l, int x ) {
NODEPTR t1, t2;
NODEPTR p = ( NODEPTR )malloc( sizeof( struct NODE ) );
p->data = x;
p->next = NULL;
t1 = NULL;
t2 = *l;
while ( t2 && t2->data < x ) {
t1 = t2, t2 = t2->next;
}
if ( !t1 ) { p->next = *l; *l = p; }
else { p->next = t1->next; t1->next = p; }
}
- u tin to mt node p kiu NODEPTR cha tr x.
- Tm node x trong danh sch l bng con tr t2, con tr t1 i ngay sau t2. y l k
301
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

thut hai con tr theo nhau: trc khi t2 dch chuyn, gn t1 bng t2 lu node
trc (hoc node cha) ca t2. Khi vng lp dng, t1 s l node trc v tr cn chn.
Nu t1 bng NULL, ngha l vng lp khng hot ng do danh sch l rng hoc node
u c d liu ln hn x, ta chn u node p vo danh sch l.
Ngc li, chn node p vo danh sch l theo gii thut chn sau node t1.
Gii php quy r rng ngn gn hn:
- quy cho n khi gp mt trong hai trng hp dng quy: xc nh c node
c tr ln hn tr cn chn hoc n cui danh sch.
- Con tr l lc ny c xem nh mt con tr ch n node u ca danh sch
cn li, ta thc hin thao tc chn u ri chm dt quy.
void Solution( NODEPTR* l, int x ) {
if ( !*l || ( *l )->data > x ) {
NODEPTR p = ( NODEPTR )malloc( sizeof( struct NODE ) );
p->data = x;
p->next = *l;
*l = p;
return;
}
Solution( &( *l )->next, x );
}
Mt gii php cng ng quan tm l chn pha trc danh sch lin kt mt node
gi (ghost node), nh vy loi b c vic xt danh sch rng v trng hp chn
u. Tuy nhin thao tc chun b phc tp, ch s dng nu node gi c th s dng
nhiu ln.
#include <stdio.h>
void Solution( NODEPTR l, int x ) {
NODEPTR p = ( NODEPTR )malloc( sizeof( struct NODE ) );
p->data = x;
for ( ; l->next && l->next->data < x; l = l->next ) { }
p->next = l->next;
l->next = p;
}

int main() {
/* ... */
/* ghost node */
q = ( NODEPTR )malloc( sizeof( struct NODE ) );
q->next = l; /* chn u node gi vo danh sch l */
Solution( q, x ); /* chn vo danh sch khi u t node gi q */
l = q->next; /* bt buc phi dng do c th c chn u */
/* ... */
return 0;
}

Bi 204: (trang 60)


Thng thng node cn xa do mt hm tm node theo mt yu cu no tr v.
V d xa node c tr bng x, hm tm node s l:
NODEPTR Find( NODEPTR l, int x ) {
for ( ; l; l = l->next )
if ( l->data == x ) return l;
return NULL;

302
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}
Sau :
if ( ( p = Find( l, x ) ) != NULL )
Solution( &l, p );
else
printf( "Khong tim thay node!\n" );

1. Xa node u l

Cn nm vng cc bc xa node u, v n l c s cho d


cc trng hp cn li.
- Phi khai bo mt con tr d (kiu NODEPTR) gi li node d l
cn xa.
- Con tr l tin ln li node u cho con tr d gi.
- By gi c th xa d. d l
- Phi kim tra xem l c khc NULL khng trc khi xa.
void Solution( NODEPTR* l ) {
if ( *l ) {
NODEPTR d = *l;
*l = ( *l )->next;
free( d );
}
}
Xa node u nn l thay i khi gi hm, do phi truyn l bng con tr.

2. Xa node p
Xa node khng quan tm n th t trong danh sch:
- Sao chp d liu t node u vo node p, nh vy node p b xa, nhng li c 2
node cha ni dung ging node u.
- Xa node u nh trn.
- Phi kim tra xem l c khc NULL khng trc khi xa.
void Solution( NODEPTR* l, NODEPTR p ) {
if ( *l ) {
p->data = ( *l )->data;
p = l; /* dng li con tr p */
*l = ( *l )->next;
free( p );
}
}
Xa node c quan tm n th t trong danh sch:
Theo quan im node bt k ca danh sch cng l
node u (node u ca danh sch cn li), ta thy q p
thc cht vic xa node p l xa node u (xem cc
bc xa node u):
- Con tr gi node xa l p. q p
- Con tr ch vo node cn xa (s tin ln):
Trng hp p l node u danh sch, con tr ch vo
node l l, s tin ln: l = l->next
Trng hp p l node nm gia danh sch, phi xc nh node ngay trc p (gi l
node q) bng phng php d pha trc (lp cho n khi q->next ch vo p). Nu
303
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

c, con tr ch vo node l q->next, s tin ln:


(q->next) = (q->next)->next.
n gin, ta dng con tr tng ng: q->next = p->next
- Xa node, tc gii phng p.
void Solution( NODEPTR* l, NODEPTR p ) {
if ( *l ) {
if ( p == *l ) *l = ( *l )->next;
else {
NODEPTR q;
for ( q = *l; q->next && q->next != p; q = q->next ) { }
if ( q->next ) q->next = p->next;
}
free( p );
}
}

3. Xa quy
void Solution( NODEPTR* l, NODEPTR p ) {
if ( !*l ) return;
if ( p == *l ) {
*l = ( *l )->next;
free( p );
return;
}
Solution( &( *l )->next, p );
}
Khi quy, lc no ta cng ang xt node u ca danh sch (danh sch ban u
cng nh cc danh sch cn li khi quy). V vy, ta a v trng hp xa u.
C hai trng hp dng quy: n cui danh sch; tm v xa c node.

Bi 205: (trang 60)


void Solution( NODEPTR* l ) {
if ( !*l ) return;
Solution( &( *l )->next );
if ( *l ) {
NODEPTR p = *l;
*l = ( *l )->next;
printf( "Xoa node [%d]\n", p->data );
free( p );
return;
}
}
Ta thc hin xa quy tng node ca danh sch lin kt k t u n cui ging
nh bi trn. Sau chuyn gii php tr thnh quy u. Khi quy s c
thc hin n cui danh sch lin kt, lu cc thng tin vo stack h thng, sau
mi tin hnh xa t cui ngc ln u.

Bi 206: (trang 60)


void Solution( NODEPTR* l, int x ) {
if ( !*l ) return;
if ( x == ( *l )->data ) {

304
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


NODEPTR d = *l;
*l = ( *l )->next;
free( d );
Solution( l, x );
}
else Solution( &( ( *l )->next ), x );
}

/* gi trong hm main() */
Solution( &l, k );
Trong trng hp phi xa nhiu node cha tr x, khi xa mt node xong ta khng
dng quy. Tuy nhin cn ch khi quy tip:
- Trong trng hp khng xa node ang xt, ta quy tip vi danh sch cn li,
k t node k tip: l->next
- Trong trng hp xa node ang xt, ta quy tip vi danh sch cn li, k t
node mi dn ln: l. iu ny gip trnh b st cc node dn ln khi xa, xut hin
khi c hai node cn xa nm k tip nhau.

Bi 207: (trang 60)


void Solution( NODEPTR* l, NODEPTR* p ) {
NODEPTR t, q;
*p = q = NULL;
while ( *l ) {
t = *l;
*l = ( *l )->next;
if ( t->data % 2 ) { t->next = *p; *p = t; }
else { t->next = q; q = t; }
}
*l = q; /* dng li con tr l */
}
/* gi trong hm main() */
Solution( &l, &p );
OutList( l, "List chan" );
OutList( p, "List le " );
Duyt danh sch lin kt cho, mi ln duyt b li node duyt xong cho mt con
tr t (kiu NODEPTR) gi. Nh vy danh sch lin kt ban u b hy dn tng node,
node b hy chuyn dn cho con tr t gi.
Ty tr cha trong t l chn hay l, chn u t (khng to node mi) vo mt trong
hai danh sch mi, i din bi 2 con tr p, q kiu NODEPTR (phi khi to bng NULL
trc).
Khi con tr l ca danh sch gc i n cui danh sch, dng li con tr ny ch
n mt trong hai danh sch mi.
Khng dng vng lp for c, v sau khi gn l cho t, phi cho l = l->next ngay
trc khi l->next b thay i do chn t vo p hoc q (l->next lc ny l t->next).
y cng l l do ti sao phi dng con tr tm t.
Nu khng ph hy danh sch ban u ta thc hin nh sau:
- Duyt danh sch cho, ly ln lt ni dung tng node ca n.
- Ty tr cha trong node l chn hay l, thc hin thao tc chn u node mi cha
tr vo mt trong hai danh sch mi, i din bi 2 con tr p, q kiu NODEPTR (phi
khi to bng NULL trc).
305
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Do khi duyt ta ch ly ni dung node v chn c to node mi nn danh sch c


khng b ph hy.
void Insert( NODEPTR *l, int x ) {
NODEPTR p = ( NODEPTR )malloc( sizeof( struct NODE ) );
p->data = x;
p->next = *l;
*l = p;
}

void Solution( NODEPTR l, NODEPTR* p, NODEPTR* q ) {


*p = *q = NULL;
for ( ; l; l = l->next )
( l->data % 2 ) ? Insert( p, l->data )
: Insert( q, l->data );
}

/* gi trong hm main() */
Solution( l, &p, &q );
OutList( q, "List chan" );
OutList( p, "List le " );
Ch li gi hm Insert() trong Solution(), y phi nh sau:
Insert( &*p, l->data )
Nhng &*p tng ng vi p nn c th vit tt. Cch vit ny thng thy trong
cc hm quy c tham s truyn nh con tr. Tuy nhin trnh nhm ln vi trng
hp sau:
&(*t)->left tng ng vi &((*t)->left), khc hn vi t->left.

Bi 208: (trang 60)


void Solution( NODEPTR* l, int m ) {
NODEPTR p, q;
int c = 0;
p = q = *l;
for ( ; q && c < m; q = q->next, c++ ) { }
if ( q ) {
for ( ; q && q->next; p = p->next, q = q->next ) { }
q->next = *l;
*l = p->next;
p->next = NULL;
}
}

/* gi trong hm main() */
Solution( &l, m );
Xem hnh v.

306
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


m=2

p q

p q

p l q

l
Ta cn c 2 con tr (kiu NODEPTR): mt con tr p ch n node cch node cui m node,
mt con tr q ch n node cui. Dng 2 vng lp nh sau:
- Cho con tr p v q ch n node u, vng lp th nht a con tr q ri xa con tr
p mt khong m node. Khng cn kim tra m c ln hn s node ca danh sch khng,
v trong trng hp , q s bng NULL ngay sau vng lp u v khng cn chuyn
node na.
- Trong vng lp th hai, hai con tr cng di chuyn song song, khi con tr q n
node cui l t yu cu.
Nh vy cc vng lp ch c nhim v di chuyn 2 con tr p, q n ng v tr, khng
thc hin thao tc no khc.
Tip theo, con tr (q->next) cui cng ch n u danh sch, con tr l ch n danh
sch by gi ch n p->next, cn p->next trc y tr thnh con tr cui danh sch
(tc thnh NULL).

Bi 209: (trang 61)


void OutListR( NODEPTR l ) {
if ( !l ) return;
OutListR( l->next );
printf( "[%d]", l->data );
}

NODEPTR Max( NODEPTR l ) {


if ( l->next == NULL ) return l;
return ( l->data > Max( l->next )->data ) ? l : Max( l->next );
}

/* gi trong hm main() */
printf( "List dao: " );
OutListR( l );
putchar( '\n' );
if ( l ) printf( "Tri max: %d\n", Max( l )->data );
Ta thng duyt danh sch lin kt n in ni dung tng node theo th t lu tr
k t u danh sch theo hai cch: dng vng lp hoc dng quy.
307
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Nu dng quy: in ni dung cha trong node u v gi quy vi danh sch cn


li (gi l quy ui), quy chm dt khi danh sch cn li rng (l == NULL).
void OutList( NODEPTR l ) {
if ( !l ) return;
printf( "[%d]", l->data );
OutList( l->next );
}
Nu gi quy trc khi in ni dung cha trong node u th mi n khi chm dt
quy, node u ca danh sch xt cui cng (tc node cui ca danh sch cho)
mi c in ra, c nh th cc node s c in ra tip theo th t ngc t cui danh
sch tr ln u. y l c im ca quy u.
Hm quy Max() c xy dng da trn pht biu quy: phn t ln nht ca
danh sch c chn bng cch so snh phn t u danh sch vi phn t ln nht
ca danh sch cn li.
iu kin u: nu danh sch ch c mt phn t th phn t cng l phn t ln
nht. Hm Max() khng dng vi danh sch rng.

Bi 210: (trang 61)


void Solution( NODEPTR* l ) {
NODEPTR t, p = NULL;
while ( *l ) {
t = *l;
*l = ( *l )->next;
t->next = p;
p = t;
}
*l = p;
}

/* gi trong hm main() */
Solution( &l );
OutList( l, "List dao" );
Ta thc hin khng quy nh sau:
- Duyt danh sch lin kt cho, mi ln duyt b li node va duyt cho mt con
tr t (kiu NODEPTR) gi. Nh vy danh sch lin kt ban u dn dn b hy.
- Chn u t (khng to node mi) vo mt danh sch mi, i din bi con tr p
kiu NODEPTR (phi khi to bng NULL trc). V chn u nn danh sch mi s c
th t o ngc so vi danh sch c.
- Sau khi duyt, con tr l n cui danh sch, dng li con tr ny ch n danh
sch mi.
Khng thay i lin kt ca cc node, ta cng c th o ngc th t cc phn t
trong danh sch lin kt n bng cch hon chuyn d liu ca cc phn t t hai
u danh sch:
- Vng lp ngoi nh v node cn hon chuyn d liu th nht (nm na u danh
sch), t u danh sch bng con tr l.
- Vng lp trong nh v node cn hon chuyn d liu th hai (nm na cui danh
sch), t cui danh sch bng con tr p.
Vn l lm sao cho con tr p di chuyn ngc ln u danh sch: vng lp trong
c chn di bi con tr q. Sau mi vng lp trong p ch node cui, ta gn cho
308
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

q tr ca p nn chn di c dch chuyn ngc ln v v vy p cng dch chuyn


ngc ln sau mi vng lp trong.
#define Swap( a, b ) { int t = a; a = b; b = t; }
/* ... */
void Solution( NODEPTR l ) {
NODEPTR p, q;
for ( q = NULL; l != q && l->next != q; l = l->next ) {
for ( p = l; p->next != q; p = p->next ) { }
Swap( l->data, p->data );
q = p;
}
}
Dng gii thut quy nh sau:
- Khai bo thm mt tham s p (kiu NODEPTR), truyn bng con tr v khi to bng
NULL, dng lu danh sch mi c to ra, v ta s chn u nn p thay i lin
tc v cn lu bng cch truyn qua cc ln gi quy.
- Vn chn u nh cch khng quy trn o ngc danh sch nhng cn
dng mt con tr q lu l->next li trc khi chn v qu trnh chn s lm thay i
l->next.
- Gi quy x l danh sch cn li (dng q thay cho l->next lm tham s khi
gi).
- Khi chm dt quy tr v con tr p, tc danh sch o ngc.
NODEPTR Solution( NODEPTR l, NODEPTR* p ) {
if ( !l ) return *p;
else {
NODEPTR q = l->next;
l->next = *p;
*p = l;
return Solution( q, p );
}
}

/* gi trong hm main() */
p = NULL;
Solution( l, &p );
OutList( p, "List dao" );

Bi 211: (trang 61)


#include <stdio.h>
#include <stdlib.h>

struct NODE {
int data;
struct NODE * next;
};
typedef struct NODE* NODEPTR;

struct RNODE {
NODEPTR ptr;
struct RNODE * next;
};
typedef struct RNODE* RNODEPTR;

309
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

NODEPTR InList() {
int x;
NODEPTR p;
scanf( "%d", &x );
if ( !x ) return NULL;
p = ( NODEPTR )malloc( sizeof( struct NODE ) );
p->data = x;
p->next = InList();
return p;
}

RNODEPTR CreateRun( NODEPTR* l ) {


NODEPTR p;
RNODEPTR t, r;
r = NULL;
while ( *l ) {
for ( p = *l; p->next && p->data < p->next->data; p = p->next ) { }
/* to mt node cho "run" mi trong danh sch qun l "run" */
t = ( RNODEPTR )malloc( sizeof( struct RNODE ) );
/* chn u "run" va tm c vo danh sch qun l "run" */
t->ptr = *l;
t->next = r;
r = t;
*l = p->next;
p->next = NULL;
}
return r;
}

void ShowRun( RNODEPTR r ) {


NODEPTR p;
printf( "r-" );
if ( r->next ) printf( "+-" );
else printf( "--" );
for ( p = r->ptr; p; p = p->next )
printf( "[%d]", p->data );
printf( "[n]\n" );
if ( r->next ) {
for ( r = r->next; r->next; r = r->next ) {
printf( " |-" );
for ( p = r->ptr; p; p = p->next )
printf( "[%d]", p->data );
printf( "[n]\n" );
}
printf( " `-" );
for ( p = r->ptr; p; p = p->next )
printf( "[%d]", p->data );
printf( "[n]\n" );
}
}

int main() {
NODEPTR l;

printf( "Nhap 0 de dung: " );


310
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


l = InList();
printf( "List 'run':\n" );
ShowRun( CreateRun( &l ) );
return 0;
}
S tch cc run c trnh by trong hnh di:
l 5 7 4 8

p p

r l 4 8

5 7p

4 8p

5 7
- Ta dng mt vng lp vi con tr p xc nh node cui ca mt run (hoc bo
n node cui ca danh sch lin kt). Khi chm dt vng lp, node u ca run
do l ch n v node cui run do p ch n. Vng lp ny nhm mc ch di chuyn
p nn khng c thn vng lp.
- Chn u node mi (cha con tr l, ch n mt run) vo danh sch lin kt qun
l run (danh sch r).
- Cho p->next = NULL kt thc run ny, nhng trc khi p->next thay i phi
cho l = p->next l ch n u run mi.
- Ln lt x l tng run cho n khi ht danh sch lin kt.
Hm ShowRun() trong bi gii vit phc tp mt cht trnh by kt qu trc quan,
bn c th vit n gin nh sau:
void ShowRun( RNODEPTR r ) {
NODEPTR p;
for ( ; r; r = r->next ) {
for ( p = r->ptr; p; p = p->next )
printf( "[%d]", p->data );
printf( "[n]\n" );
}
}
Danh sch cc run r c duyt, vi mi node ca danh sch r, in danh sch run
do node qun l.

Bi 212: (trang 61)


NODEPTR MergeTwoRun( NODEPTR* r1, NODEPTR r2 ) {
NODEPTR p, t1, t2;
while ( *r1 ) {
p = *r1;
*r1 = ( *r1 )->next;
p->next = NULL;
311
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


/* chn p vo r2 theo ng th t */
t1 = NULL;
t2 = r2;
while ( t2 && t2->data < p->data ) {
t1 = t2;
t2 = t2->next;
}
if ( !t1 ) { p->next = r2; r2 = p; }
else { p->next = t1->next; t1->next = p; }
}
return r2;
}

NODEPTR MergeRuns( RNODEPTR run ) {


RNODEPTR p;
for ( p = run; p->next; p = p->next )
p->next->ptr = MergeTwoRun( &p->ptr, p->next->ptr );
return p->ptr;
}
Hm MergeTwoRun(): dng trn hai run tng r1 v r2 thnh mt run tng (r2)
c thc hin theo tng chn tng node tch ra t r1 vo r2 theo ng th t:
- Vng lp ngoi (vi r1) s tch tng node ca r1, theo gii thut xa node u,
chuyn cho con tr p lu gi.
- Vi mi node p, chn p ng th t vo r2 sao cho r2 vn tng, xem bi 203 (trang
301).
Hm MergeRuns(): dng trn n run. Trong vng for, mi ln lp gi hm
MergeTwoRun() trn run i v run i + 1 thnh run i + 1, .v.v ; cui cng
trn run n - 1 v run n thnh mt run n duy nht,

Bi 213: (trang 61)


void Solution( NODEPTR l ) {
int count, max = 0;
NODEPTR p, pos = NULL;
for ( ; l; l = l->next ) {
for ( count = 1, p = l->next; p; p = p->next )
if ( p->data == l->data ) count++;
if ( count > max ) {
max = count;
pos = l;
}
}
printf( "[%d](%d) ", pos->data, max );
}
Tham kho bi tp 75 (trang 133), thc hin bi tp trn vi mng. C nhiu im
tng ng khi thc hin bi tp trn vi danh sch lin kt:
- Vi tng tr trong node phi thc hin mt vng lp m s ln xut hin ca n
trong danh sch lin kt. Nh vy c hai vng lp lng nhau: mt vng lp duyt
(ngoi) v mt vng lp m (trong).
- S ln m s c so snh vi mt tr max tuyn ra tr c s ln xut hin nhiu nht.
- Vi tr xut hin th tn s m ln sau s nh hn khi m tr ln u nn
khng nh hng n kt qu.

312
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi tp: Thc t, tn sut ca cc tr trong danh sch lin kt c th bng nhau. Hy


in tt c cc tr trong danh sch lin kt c tn sut ln nht v bng nhau.
Tham kho bi tp 76 (trang 134). Ta cn c mt s iu chnh:
- Dng con tr q thay cho con tr l v vng lp ny phi chy nhiu ln.
Con tr q lc u ch node u tin ca danh sch (q = pos->next m p = l nn q =
l->next). Nhng ln sau q ch node ngay sau node cha tr c tn sut ln nht tm
c ln trc (q = pos->next).
- Mt bin oldmax c thm lu tr max ca ln tm trc.
- Mt vng lp do while bao bn ngoi tin hnh tm nhiu ln.
void Solution( NODEPTR l ) {
int count, max, oldmax;
NODEPTR p, q, pos;
oldmax = 0;
pos = l;
do {
max = 0;
for ( q = pos->next; q; q = q->next ) {
for ( count = 1, p = q->next; p; p = p->next )
if ( p->data == q->data ) count++;
if ( count > max ) { max = count; pos = q; }
}
if ( max >= oldmax ) {
printf( "[%d](%d) ", pos->data, max );
oldmax = max;
}
} while ( max == oldmax );
}
Bn c th nhn thy gii thut tin hnh trn c nhiu im tng t vi gii thut
c tin hnh vi mng. iu ny c nhn mnh trong bi 216 (trang 315).

Bi 214: (trang 61)


void InsertLast( NODEPTR* l, NODEPTR p ) {
p->next = NULL;
if ( !*l ) *l = p;
else {
NODEPTR t;
for ( t = *l; t->next; t = t->next ) { }
t->next = p;
}
}

void Solution( NODEPTR* l, NODEPTR* p ) {


if ( !*l ) {
*l = *p;
return;
}
if ( ( *l )->data % 2 ) {
NODEPTR t = *l;
*l = ( *l )->next;
InsertLast( p, t );
Solution( l, p );
}
else Solution( &( *l )->next, p );
313
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}

/* gi trong hm main() */
p = NULL;
Solution( &l, &p );
Bi tp c thc hin ging nh xa quy cc node (xem bi 204, trang 302) cha
tr l trong danh sch lin kt, cn li danh sch lin kt vi cc node cha cc tr
chn theo ng th t. Nhng cc node cha tr l sau khi tch ra khi danh sch
lin kt khng xa lun, m c chn cui vo mt con tr p (kiu NODEPTR, phi
khi to bng NULL).
Thao tc chn cui nhm mc ch khng thay i th t lu tr cc node so vi
danh sch nhp. Trong ln chn cui u tin, con tr p thay i; ta cn lu thay i
ny n khi kt thc quy bng cch truyn con tr p nh tham s qua cc ln gi
quy, cho d cc ln chn cui tip theo con tr p khng thay i.
Khi kt thc gi quy, con tr l ch n cui danh sch cc tr chn, cho con tr l
ch n p (bng l = p) ni hai danh sch li to thnh danh sch kt qu.

Bi 215: (trang 62)


void Solution( NODEPTR l ) {
NODEPTR p, q, t;
for ( p = l, t = q = l->next;
p->next && q->next;
p = p->next, q = q->next ) {
p->next = p->next->next;
q->next = q->next->next;
}
p->next = t;
}
Ta thc hin nh hnh sau:
l 1 2 3 4

p q p->next = p->next->next

l 1 2 3 4

p q

l 1 2 3 4

p q
p->next

l 1 2 3 4

t p q

l 1 3
p->next = t

2 4
314
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

- Khai bo hai con tr p, q kiu NODEPTR, mt dng kt ni cc node c th t l v


mt dng kt ni cc node c th t chn. Nh vy phi khi to: p = l v q =
l->next. Vic kt ni ny phi tin hnh song song, nu khng cc lin kt s b ri
ra.
- Khi p di chuyn th danh sch th t l c con tr l qun l. Ta cng dng mt
con tr t kiu NODEPTR qun l danh sch th t chn khi q di chuyn.
Khi duyt ht th t l, cho p->next ch vo node t ni danh sch th t l vi
danh sch th t chn, hon thnh cng vic.
Nu s node danh sch l s l, do php gn: q->next = q->next->next;
nn danh sch th t chn s lun kt thc bi con tr NULL.

Bi 216: (trang 62)


#define Swap( a, b ) { int t = a; a = b; b = t; }
/* ... */
void Solution( NODEPTR l ) {
NODEPTR p, q;
for ( p = l; p->next; p = p->next )
for ( q = p->next; q; q = q->next )
if ( p->data > q->data )
Swap( p->data, q->data );
}
Xem li gii thut sp xp Selection Sort trn mng:
#define Swap( a, b ) { int t = a; a = b; b = t; }
/* ... */
void selectsort( int a[], int n ) {
int i, j;
for ( i = 0; i < n - 1; ++i )
for ( j = i + 1; j < n; ++j )
if ( a[i] > a[j] ) Swap( a[i], a[j] );
}
Thc hin n - 1 t sp xp (vng lp ngoi, ch s i), mi t sp xp cho v tr
a[i]. Mng c sp xp t u n cui. sp xp ng v tr a[i], ta so snh
a[i] vi cc phn t sau n (t j = i + 1 tr i), chn ra phn t nh nht t vo
v tr a[i], bng cch duyt cc phn t sau a[i] (vng lp trong, ch s j), phn t
ang duyt a[j] no nh hn phn t a[i] ang xt th hon i vi a[i].
Danh sch lin kt c nhng thao tc tng t nh trn mng:
Mng a Danh sch lin kt l ngha vi danh sch lin kt
i = 0 p = l Ch n u danh sch
i < n - 1 p->next != NULL Cha n cui danh sch
i++ p = p->next n phn t k tip
j = i + 1 q = p->next Phn t ny ngay sau phn t kia
a[i] > a[j] p->data > q->data So snh hai tr
T nhng nhn xt trn ta d dng vit c gii thut Selection Sort trn danh sch
lin kt n cha cc tr nguyn.

Bi 217: (trang 62)


NODEPTR SwapTwoNode( NODEPTR p ) {
NODEPTR t = p->next->next->next;
p->next->next->next = p->next;
315
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


p->next = p->next->next;
p->next->next->next = t;
return p->next->next;
}

void Solution( NODEPTR* l, int x ) {


NODEPTR p, g;
/* chn u ghost node, khng cn lu tr trong ghost node */
g = ( NODEPTR )malloc( sizeof( struct NODE ) );
g->next = *l;
*l = g;
for ( p = g; p->next && p->next->next; )
p = ( p->next->data == x ) ? SwapTwoNode( p ) : p->next;
/* xa u ghost node */
*l = ( *l )->next;
free( g );
}

/* gi trong hm main() */
printf( "Nhap k: " );
scanf( "%d", &k );
Solution( &l, k );
o hai node k tip nhau trong mt danh sch lin kt c thc hin nh sau:
a b
p t t = p->next->next->next

a b
p t
p->next->next->next = p->next
p->next = p->next->next

a b
p t
p->next->next->next = t

a b
p t
Cn ch nguyn tc:
- Khi thay i mt thng tin lin kt phi bo m thng tin c lu li.
V d: trc khi thay i p->next->next->next ta lu thng tin ny vo t.
- Nu khng lu thng tin lin kt li trc khi thay i chng th phi bo m l
cn cch khc nhn c thng tin ny.
V d: node a do p->next ch n, ta thay p->next bng p->next->next c v sau
vn xc nh c node a do con tr p->next->next ch n.
- Mt thng tin lin kt khng cn ngha na th c th thay i m khng cn lu li.
V d: bc cui, thng tin lin kt n node b c p->next lu nn c th
thay i thng tin lin kt t node a tr i.
Khi o hai node trong danh sch lin kt c cc ngoi l sau:
- Node a l node cui, khi p->next->next = NULL, ta kim tra v khng thc hin

316
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

hon chuyn na.


- Node a l node u, ta chn thm node gi (ghost node) vo a v trng hp
chung. C th nhn thy qu trnh tm node o khng xt node gi ny.
- Danh sch rng (khng k node gi), khi p->next = NULL, ta kim tra v khng
thc hin hon chuyn na.
o nhiu node cha tr k yu cu ta cn ch khi o hai node, node cha tr k
chuyn v pha sau; nu vng lp tin n node k tip bng p = p->next ta s gp
li node va o. V th hm SwapTwoNode() dng o hai node c thit k tr v
p->next->next vt qua node va o.

Bi 218: (trang 62)


void Swap( NODEPTR* a, NODEPTR* b ) {
NODEPTR t = *a; *a = *b; *b = t;
}

void Solution( NODEPTR* l ) {


NODEPTR p, p1, q, q1;
for ( p1 = p = *l; p->next; p1 = p, p = p->next )
for ( q1 = q = p->next; q; q1 = q, q = q->next )
if ( p->data > q->data ) {
Swap( &p->next, &q->next );
( p == *l ) ? Swap( l, &q1->next )
: Swap( &p1->next, &q1->next );
Swap( &p, &q );
}
}
Vn c gii quyt ging bi 216 (trang 315). Tuy nhin, ta cn hon chuyn
hai node, khng phi hon chuyn tr cha trong chng.
Trong danh sch lin kt, thng tin v tr mt node cn lu tr trong node truc n.
V vy mt s thao tc trn mt node cn n con tr qun l node trc node .
c c con tr ny ngi ta thng dng k thut hai con tr ni ui nhau.
for ( p1 = p = l; p->next; p1 = p, p = p->next ) { }
p chy t u danh sch l n cui danh sch. Trc khi p di chuyn, dng p1 lu
li v tr c ca p, vy p1 lun l con tr qun l node ng trc p. Ch nu p cha
di chuyn, p1 v p ch chung mt node.
Khi hon chuyn hai node, trc tin hon chuyn thng tin lin kt n node sau
trong n, sau hon chuyn thng tin lin kt n n cha trong node ngay trc.
Cc bc cn thc hin khi hon chuyn hai node p (c node trc l p1) v q (c
node trc l q1) trnh by trong hnh trang sau:
- Hon chuyn thng tin lin kt ch n node sau, cha trong node ang xt.
Swap( p->next, q->next );
- Hon chuyn thng tin lin kt ch n node ang xt, cha trong node ngay trc
node ang xt. Ch trng hp node ang xt l node u.
if ( p == l ) Swap( l, q1->next );
else Swap( p1->next, q1->next );
- Sau khi hon chuyn vai tr ca p v q i ch nhau nn cn hon chuyn chng
tr li:
Swap( p, q );

317
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

l 1 2 3 4 5

p1 p q1 q

l 1 2 3 4 5

p1 p q1 q

l 1 2 3 4 5

p1 p q1 q

l 1 4 3 2 5

q p

Hnh di m t mt vi trng hp c bit: hai node k tip nhau (tri), mt trong


hai node l node u (phi). Bn c th kim chng tnh chnh xc ca cch hon
chuyn node trn.
l 1 2 3 4 l 1 2 3 4

p1 p q1 q p1 p q1 q

l 1 2 3 4 l 1 2 3 l4

p1 p q1 q p1 p q1 q

l 1 2 3 4 1 2 3 l4

p1 p q1 q p1 p l q

l 1 3 2 4 l 2 1 3 4

q p q p

Bi 219: (trang 62)


#define Swap( a, b ) { int t = a; a = b; b = t; }
/* ... */
void Solution( NODEPTR l ) {
NODEPTR p, q;
for ( p = NULL; p != l->next; p = q )
for ( q = l; q->next != p; q = q->next )
if ( q->data > q->next->data )
Swap( q->data, q->next->data );
}
Xem li gii thut sp xp Bubble Sort trn mng:
318
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

#define Swap( a, b ) { int t = a; a = b; b = t; }


/* ... */
void bubblesort( int a[], int n ) {
int i, j;
for ( i = n - 1; i > 0; --i )
for ( j = 0; j < i; ++j )
if ( a[j] > a[j + 1] ) Swap( a[j], a[j+1] );
}
Thc hin n - 1 t sp xp (vng lp ngoi, ch s i), mi t sp xp cho v tr
a[i]. Mng c sp xp t cui n u. Trong mi t sp xp, ta so snh cc
phn t gn nhau, hon i chng cho ng chiu sp xp. Chui so snh - hon
i lin tc ny s dn dn y phn t a[i] ni dn ln ng v tr sp xp. Mng
c sp xp t u n cui.
Ta nhn thy vng lp bn ngoi (i) i ngc t cui mng ln u. Thao tc ny
kh thc hin c khi dng danh sch lin kt n, ch c th thc hin trn danh
sch lin kt i.
Tuy nhin, do mt s c im ca hai vng lp trn, ta vn c th iu khin c
mt con tr i ngc t cui danh sch lin kt n ln u danh sch bng mt th
thut nh sau:
for ( p = NULL; p != l->next; p = q )
for ( q = l; q->next != p; q = q->next )
if ( q->data > q->next->data )
Swap( q->data, q->next->data );
Vng lp trong (j) dng khi q->next ch n con tr chn di p (ln u gn p
bng NULL). Nh vy q ch n node trc p; sau mi vng lp ngoi (i), ta n gin
gn cho p tr cha trong q, kt qu l con tr chn di p di chuyn ngc ln u
mt node.

Bi 220: (trang 62)


void Solution( NODEPTR* l ) {
NODEPTR t, t1, t2;
NODEPTR p;
if ( *l ) {
/* list p c 1 phn t " sp xp", l phn t u list l */
p = *l;
*l = ( *l )->next;
p->next = NULL;
while ( *l ) {
/* xa u l tng node, lu node xa vo t */
t = *l;
*l = ( *l )->next;
t->next = NULL;
/* chn t vo danh sch " sp xp" p */
t1 = NULL;
t2 = p;
while ( t2 && t2->data < t->data ) {
t1 = t2,
t2 = t2->next;
}
if ( !t1 ) { t->next = p; p = t; }
else { t->next = t1->next; t1->next = t; }
}
319
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


/* cp nht li l vi p " sp xp" */
*l = p;
}
}
Gii php da trn gii thut sp xp Insertion Sort trn mng:
void insertsort( int a[], int n ) {
int v, i, j;
for ( i = 1; i < n; ++i ) {
v = a[i]; /* lu a[i] vo v dn mng */
j = i;
/* dn mng t a[i] ngc ln n v tr chn */
while ( a[j - 1] > v ) {
a[j] = a[j - 1];
j--;
}
a[j] = v; /* j l v tr chn, a v vo */
}
}
Thut ton chia mng thnh hai phn;
- Phn sp xp, nm u mng, c khi to c mt phn t a[0].
- Phn cn li l phn cha sp xp. Tng phn t trong phn ny s c chn ng
v tr vo phn sp xp.
Ta thc hin tng t trn danh sch lin kt:
- To mt danh sch sp xp do p qun l, c khi to c mt phn t l phn
t u danh sch l cn sp xp.
- Xa u dn danh sch l, tng node xa chuyn cho t qun l. Chn t vo danh
sch c th t p sao cho vn bo m th t , xem bi 203 (trang 301).

Bi 221: (trang 63)


Gi t l con tr ch n node cn xa. Ta s xa node ny khng phi thng qua t
m thng qua mt con tr khc cng ch n node cn xa, con tr d vi d = t.
C ba trng hp:
- Node cn xa khng c cy con bn phi (t->right = NULL)
- Node cn xa khng c cy con bn tri (t->left = NULL)
- Node cn xa c cc cy con bn tri v bn phi, tc node cn xa l node trong.

a) Node cn xa khng c cy con bn phi


V node cn xa c gi bi con tr d, ta n gin ch vt qua node cn xa
xung cy con bn tri:
if ( t->right == NULL ) t = t->left;
10
d=t
8 15
t->left
6 12 18

4 7

320
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Node cn xa by gi tch khi cy v c qun l bi con tr d, c th xa d dng:


free( d );

b) Node cn xa khng c cy con bn tri


Tng t trng hp trn, ch vt qua node cn xa xung cy con bn phi:
if ( t->left == NULL ) t = t->right;
free( d );
10
d=t
6 18
t->right
4 8 24

20 27

c) Node cn xa l node trong


Khi xa node t, node thay th node t phi bo m tnh cht ca cy BST, ngha l:
phi c tr ln hn tt c cc tr trong cc node ca cy con bn tri node t, ng thi
phi c tr nh hn tt c cc tr trong cc node ca cy con bn phi node t.
Vy node thay th node t phi l node cc phi ca cy con bn tri node t (tc node
ln nht trong cy con bn tri, gi l node thay th trc) hoc node cc tri ca
cy con bn phi node t (tc node nh nht ca cy con bn phi, gi l node thay
th sau). Ta quy c chn node thay th l node cc phi ca cy con bn tri node
t (node thay th trc).
C hai cch xa mt node trong:
- Cch th nht, xa bng cch sao chp node.
Tm node thay th trc l node phi nht ca cy con bn tri node t. Ta bt u
t node gc ca cy con bn tri (node t->left, ngha l d = t->left), sau lun
i v bn phi (d = d->right) cho n khi khng cn i tip c, ngha l khi con
tr d->right == NULL.
Trong khi con tr d di chuyn, ta dng con tr p ni ui con tr d, tc p lun ch
node cha ca node ang xt (node ang xt do d ch).
for ( p = t, d = t->left; d->right; p = d, d = d->right )
{ }
Kt thc vng lp trn d s ch node thay th trc v p l cha ca d.
10
8 p 20
15 25
d

12 18 23 27

16
Sao chp chng d liu cha trong node thay th trc vo node cn xa:
321
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


t->data = d->data;
10
8 p 18
15 25
d

12 18 23 27

16
By gi c cy 2 node cha d liu ging nhau, ta s xa node thay th trc v
node ny hoc l node l, hoc ch c mt cy con bn tri nn d dng xa hn.
Node cha ca node thay th trc l p, lu c do dng k thut hai con tr ni
ui bc trc. Cho p ch n node gc ca cy bn tri node thay th trc:
p->right = d->left;
10
8 p 18
15 p->right 25
cng l d

12 18 23 27
d->left
16
Node thay th trc by gi tch khi cy v qun l bi con tr d, ta xa d:
free( d );
Khi tm node thay th trc, c mt trng hp c bit l node thay th trc
nm ngay sau node cn xa. Kt qu vng lp tm node thay th trc nh sau:
10 p = t
8 d 18
15 25

12 23 27

10 14
Trong trng hp ny p = t v d chnh l p->left. Sau khi sao chp chng d liu
cha trong node thay th trc vo node cn xa:
t->data = d->data;
ta tch node thay th trc ra khi cy bng cch:
p->left = d->left;

322
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

10 p=t

8 15
p->left
15 cng l d
25
d->left
12 23 27

10 14
Node thay th trc by gi tch khi cy v qun l bi con tr d, ta xa d:
free( d );
Tng kt cch 1:
void RemoveNodeByCopy( NODEPTR* t ) {
NODEPTR p, d = *t;
if ( !( *t )->left ) *t = ( *t )->right;
else if ( !( *t )->right ) *t = ( *t )->left;
else {
for ( p = *t, d = ( *t )->left; d->right;
p = d, d = d->right ) { }
( *t )->data = d->data;
if ( p == *t ) p->left = d->left;
else p->right = d->left;
}
free( d );
}
- Cch th hai, xa node bng ghp cy (merge).
Cch th hai xa node trong, gn hn cch trn, nhng c mt vi khc bit khi
tin hnh xa node.
Tm node thay th trc l node phi nht ca cy con bn tri node t, khng cn
dng k thut hai con tr ni ui nhau. Ta bt u t node gc ca cy con bn tri
(node t->left, ngha l p = t->left), sau lun i v bn phi (p = p->right) cho
n khi khng cn i tip c, ngha l khi con tr p->right == NULL.
for ( p = t->left; p->right; p = p->right ) { }
10
8 20
15 25

12 18 23 27

16
Kt thc vng lp trn p s ch node thay th trc.
Cy con bn phi node cn xa s c ghp vo bn phi node thay th trc
thnh cy con bn phi node thay th trc, ch t->right l con tr qun l cy
con bn phi ca node t.
p->right = t->right;

323
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

10
8 20
15

12 18

16 25

23 27

Nh vy, xem nh node cn xa khng cn cy con bn phi (t->right vn tn ti


nhng khng cn ngha). Bn c th xa d dng bng cch vt qua node cn
xa xung cy con bn tri:
t = t->left;
10 d=t

8 20
15 t->left

12 18

16 25

23 27
Node cn xa by gi tch khi cy v qun l bi con tr d, c th xa d dng:
free( d );
Cch ny tuy n gin hn nhng d lm cho cy mt cn bng, gy nh hng n
hiu sut tm kim.
Tng kt cch 2:
void RemoveNodeByMerge( NODEPTR* t ) {
NODEPTR p, d = *t;
if ( !( *t )->left ) *t = ( *t )->right;
else if ( !( *t )->right ) *t = ( *t )->left;
else {
for ( p = ( *t )->left; p->right; p = p->right ) { }
p->right = ( *t )->right;
*t = ( *t )->left;
}
free( d );
}

d) Xa mt node cha tr ch nh
Trn c s thao tc xa mt node trn, ta tin hnh xa mt node vi tr ch nh
trong cy BST bng cch quy:
324
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

- Nu node ang xt cha tr trng vi tr ch nh th xa ngay node v dng quy.


- Nu node ang xt cha tr nh hn tr ch nh th tin hnh xa quy node cha
tr ch nh trong cy bn tri node ang xt.
- Ngc li, tin hnh xa quy node cha tr ch nh trong cy bn phi node
ang xt.
void Remove( NODEPTR* t, int x ) {
if ( x == ( *t )->data ) {
RemoveNode( t );
return;
}
( x < ( *t )->data ) ? Remove( &( *t )->left, x )
: Remove( &( *t )->right, x );
}

/* dng trong hm main() */


Remove( &t, k );
Ta nhn thy thao tc xa mt node (RemoveNode()) cch 1 tuy c u im hn nhng
phi gii quyt trng hp ngoi l v phi xc nh node cha ca node thay th bng
k thut dng hai con tr ni ui nhau. Nu vit hm RemoveNode() cch 1 ngay
trong hm quy Remove(), cch 1 s c thc hin n gin nh cch 2, xem ch
thch trong bi:
void Remove( NODEPTR* t, int x ) {
if ( x == ( *t )->data ) {
NODEPTR p, d = *t;
if ( ( *t )->left && ( *t )->right ) { /* node c 2 con */
/* tm node thay th nh cch 2, khng cn tm node cha ca node thay th */
for ( p = ( *t )->left; p->right; p = p->right ) { }
/* hon chuyn tr ca node xa v node thay th */
int temp = ( *t )->data;
( *t )->data = p->data;
p->data = temp;
/* tr cn xa "xung" cy con bn tri */
/* gi quy vi cy con bn tri xa n */
Remove( &( *t )->left, x );
} else {
*t = ( !( *t )->left ) ? ( *t )->right : ( *t )->left;
free( d );
}
return;
}
( x < ( *t )->data ) ? Remove( &( *t )->left, x )
: Remove( &( *t )->right, x );
}
Mc tiu ca cch xa node ny l chuyn node cn xa c hai cy con tri phi
thnh node xa ch c mt cy con tri hoc phi. Vic xa node gim thiu kh
nng mt cn bng ca cy.

Bi 222: (trang 63)


void LNR( NODEPTR t ) {
if ( t ) {
LNR( t->left );
printf( "%d ", t->data );
325
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


LNR( t->right );
}
}

void NLR( NODEPTR t ) {


if ( t ) {
printf( "%d ", t->data );
NLR( t->left );
NLR( t->right );
}
}

void LRN( NODEPTR t ) {


if ( t ) {
LRN( t->left );
LRN( t->right );
printf( "%d ", t->data );
}
}
Phng php m t sau l mt trong nhng cch duyt cy BST mt cch th cng,
gip kim tra nhanh cc kt qu duyt theo chiu su:
- i theo mt ng bao xung quanh cc node cy nh phn t tri sang phi (nu
trong th t duyt L trc R). Khi di chuyn ta duyt qua cc node ca cy 3 ln,
tng ng vi ba cch duyt cy.
- Th t xut cc node c xc nh nh sau (ch cc mi tn ):
LNR: (inorder) xut tr ca node khi i qua ngay di node.
NLR: (preorder) xut tr ca node khi i qua ngay trc (bn tri) node.
LRN: (postorder) xut tr ca node khi i qua ngay sau (bn phi) node.
Cc cch duyt ngc li (backward): RNL, NRL v RLN cng tin hnh tng t.
Start End
9
3 16

2 5 14 18

4 8

LNR: 2 3 4 5 8 9 14 16 18
Start End Start End
9 9

3 16 3 16

2 5 14 18 2 5 14 18

4 8 4 8

NLR: 9 3 2 5 4 8 16 14 18 LRN: 2 4 8 5 3 14 18 16 9
ngha mi cch duyt theo chiu su c trnh by trong bi 224 (trang 329).
326
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Bi 223: (trang 63)


#include <stdio.h>
#include <stdlib.h>

struct NODE {
int data;
struct NODE *left, *right;
};
typedef struct NODE* NODEPTR;

/* cu trc d liu cho queue */


struct QNODE {
NODEPTR data; /* d liu ca queue l mt node ca BST */
struct QNODE *next;
};
typedef struct QNODE* QNODEPTR;

typedef struct {
QNODEPTR qdata; /* danh sch lin kt cha cc node ca queue */
QNODEPTR front, rear; /* con tr qun l u v cui queue */
} QUEUE;

/* chn d liu vo queue - chn cui nh con tr rear */


void InQueue( QUEUE* q, NODEPTR p ) {
QNODEPTR h = ( QNODEPTR )malloc( sizeof( struct QNODE ) );
h->data = p;
h->next = NULL;
if ( ( *q ).rear ) ( *q ).rear->next = h;
( *q ).rear = h;
if ( !( *q ).front ) ( *q ).front = h;
}

/* tr v d liu xut t queue - xa u */


NODEPTR OutQueue( QUEUE* q ) {
NODEPTR t = ( *q ).front->data;
QNODEPTR d = ( *q ).front;
( *q ).front = ( *q ).front->next;
if ( !( *q ).front ) ( *q ).rear = NULL;
free( d );
return t;
}

void Insert( NODEPTR* t, int x ) {


if ( !*t ) {
*t = ( NODEPTR )malloc( sizeof( struct NODE ) );
( *t )->data = x;
( *t )->left = ( *t )->right = NULL;
}
else ( x < ( *t )->data ) ? Insert( &( *t )->left, x )
: Insert( &( *t )->right, x );
}

void InTree( NODEPTR* t ) {


int x;

327
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


printf( "Nhap 0 de dung: " );
do {
scanf( "%d", &x );
if ( x ) Insert( t, x );
} while ( x );
}

void BFS( NODEPTR t ) {


QUEUE q;
q.front = q.rear = NULL;
if ( t ) InQueue( &q, t );
while ( q.front ) {
NODEPTR d = OutQueue( &q );
printf( "%d ", d->data );
if ( d->left ) InQueue( &q, d->left );
if ( d->right ) InQueue( &q, d->right );
}
}

int main() {
NODEPTR t = NULL;

InTree( &t );
printf( "BFS: " );
BFS( t );
putchar( '\n' );
return 0;
}
Duyt theo chiu rng cy BST l ln lt duyt tng mc (level-by-level) ca cy,
ti mi mc duyt cc node t tri sang phi:
9 cp 0 9

3 16 cp 1 3 16

2 5 14 18 cp 2 2 5 14 18

4 8 cp 3 4 8

BFS: 9 3 16 2 5 14 18 4 8
Khi duyt mt node ta ng thi bit c thng tin lin kt n hai node con, thng
tin ny c lu tr vo mt cu trc d liu b tr (helper data structure) no
x l sau. Nh vy cu trc d liu b tr phi p ng:
- X l tun t.
- Ta t node cha vo cu trc d liu trc cc node con. Sau node cha c
x l trc cc node con.
Cu trc d liu b tr thch hp l queue (hng i), hot ng theo nguyn tc
FIFO tun t, c xy dng bng danh sch lin kt n, vi cc thao tc:
- InQueue(): chn cui mt node vo queue, d liu trong node ca queue chnh l
mt node ca cy BST.
- OutQueue(): xa u mt node ca queue, trc khi xa d liu c lu li tr
v. Trong queue, thao tc nhp/xut din ra hai u khc nhau ca queue.
328
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

thc hin nhanh thao tc chn cui, ta xy dng thm cu trc QUEUE dng qun
l queue, trong a thm con tr rear nhm h tr cho thao tc chn cui.
Nu dng cu trc d liu b tr l stack, ta c kt qu nh cch duyt NRL.
Mt cch duyt BFS khc, khng dng cu trc d liu b tr m dng quy:
#define Max( a, b ) ( ( a ) > ( b ) ? ( a ) : ( b ) )
/* ... */
void PrintLevel( NODEPTR t, int cLevel, int tLevel ) {
if ( t )
if ( cLevel == tLevel )
printf( "%d ", t->data );
else {
PrintLevel( t->left, cLevel + 1, tLevel );
PrintLevel( t->right, cLevel + 1, tLevel );
}
}

int MaxLevel( NODEPTR t ) {


if ( !t ) return 0;
return 1 + Max( MaxLevel( t->left ), MaxLevel( t->right ) );
}

void BFS( NODEPTR t ) {


int i;
int maxLevel = MaxLevel( t );
for ( i = 0; i < maxLevel; ++i )
PrintLevel( t, 0, i );
}
Ta dng hai hm quy:
- Hm PrintLevel( t, cLevel, tLevel ), duyt quy cy t v in cc node mc
tLevel. cLevel l mc hin hnh, dng xc nh xem c ang duyt mc tLevel hay
khng. V vy khi bt u duyt, truyn tham s cLevel bng 0 (mc 0).
- Hm MaxLevel( t ) tr v mc su nht (chiu cao) ca cy t, cng 1. Bn cng
c th tm chiu cao ca cy trong khi chn node to cy, khng nht thit dng
n hm ny.
Sau , hm BFS() ch n gin chy vng lp duyt t mc 0 n mc su nht. Ti
mi mc, gi hm PrintLevel() in cc phn t thuc mc .
Tuy nhin, do c hai hm quy trn u hot ng khng hiu qu nn phng
php ny khng ti u.
ngha cch duyt theo chiu rng c trnh by trong bi 225 (trang 332).

Bi 224: (trang 63)


#include <stdio.h>
#include <stdlib.h>

struct NODE {
int data;
struct NODE *left, *right;
};
typedef struct NODE* NODEPTR;

void Insert( NODEPTR* t, int x ) {


if ( !*t ) {
329
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


*t = ( NODEPTR )malloc( sizeof( struct NODE ) );
( *t )->data = x;
( *t )->left = ( *t )->right = NULL;
}
else ( x < ( *t )->data ) ? Insert( &( ( *t )->left ), x )
: Insert( &( ( *t )->right ), x );
}

void InTree( NODEPTR* t ) {


int x;
printf( "Nhap 0 de dung: " );
do {
scanf( "%d", &x );
if ( x ) Insert( t, x );
} while ( x );
}

void OutTree( NODEPTR t ) {


if ( t ) {
printf( "%d ", t->data );
OutTree( t->left );
OutTree( t->right );
}
}

void CopyTree( NODEPTR t, NODEPTR* t1 ) {


if ( t ) {
Insert( t1, t->data );
CopyTree( t->left, t1 );
CopyTree( t->right, t1 );
}
}

void SortTree( NODEPTR t ) {


if ( t ) {
SortTree( t->left );
printf( "%d ", t->data );
SortTree( t->right );
}
}

void RemoveTree( NODEPTR* t ) {


if ( *t ) {
RemoveTree( &( ( *t )->left ) );
RemoveTree( &( ( *t )->right ) );
printf( "%d ", ( *t )->data );
free( *t );
}
}

int main() {
NODEPTR t, t1;

t = t1 = NULL;
InTree( &t );
printf( "\nCay goc : " ); OutTree( t );
330
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


CopyTree( t, &t1 );
printf( "\nCay copy : " ); OutTree( t1 );
printf( "\nXuat tang: " );
SortTree( t );
printf( "\nXoa cay goc... " );
RemoveTree( &t );
if ( t ) printf( "\nCay goc rong\n" );
return 0;
}
Duyt cy BST l ln lt i qua tt c cc node ca cy v thc hin mt thao tc
no trn mi node. Ty thao tc cn thc hin, ta chn cch duyt cy thch hp
cho thao tc :
- InOrder: v tr cc node cha trong nhnh phi ca cy BST ln hn tr cc node cha
trong nhnh tri v node gc cha tr trung gian, ta dng cch duyt LNR xut tr cha
trong cc node cy BST theo chiu tng dn (L < N < R). Tng t, cch duyt RNL dng
xut tr cha trong cc node cy BST theo chiu gim dn (L > N > R). Cch duyt ny
tht s khng ngha vi cy tng qut.
- PreOrder: khi mun to mt cy BST mi sao chp t cy gc, ta duyt tng node
trn cy gc v chn tr c c vo cy sao chp. cy sao chp c cng cu
trc vi cy gc, phi bo m th t chn node vo cy sao chp ging nh cy
gc, to node gc trc ri mi to cc node con. Cch duyt NLR hoc NRL p ng
c yu cu ny. Do c im trn, cch duyt ny cn dng khi mun so snh cu
trc ca hai cy BST:
void CompareTree( NODEPTR t, NODEPTR t1, int* b ) {
if ( t && t1 ) {
if ( t->data != t1->data ) {
*b = 0;
return;
}
CompareTree( t->left, t1->left, b );
CompareTree( t->right, t1->right, b );
}
}

/* dng trong hm main() */


int b = 1;
CompareTree( t, t2, &b );
if ( b ) printf( "\nCung cau truc cay\n" );
else printf( "\nKhac cau truc cay\n" );
C th dng cch xut sau d dng quan st cu trc cy hn:
void OutTree( NODEPTR t, char label, int d ) {
if ( t ) {
OutTree( t->right, 'L', d + 1 );
printf( "%*c[%c%d]\n", 2 * d, ' ', label, t->data );
OutTree( t->left, 'R', d + 1 );
}
}

/* dng trong hm main() */


printf( "Cay goc:\n" );
OutTree( t, '*', 1 );
Kt qu xut:
331
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Nhap 0 de dung: 9 3 7 16 14 2 5 4 8 18 0
Cay goc:
[L18]
[L16]
[R14]
[*9]
[L8]
[L7]
[R5]
[R4]
[R3]
[R2]
Cch duyt PreOrder cn dng khi mun tm mt node trong cy BST. Cc phng
php duyt u duyt qua cc tt c cc node trong cy, nhng phng php
PreOrder x l node ngay t ln u tin gp node.
- PostOrder: Khi mun xa tt c cc node trong mt nhnh cy hoc c cy BST, ta
tin hnh xa cc node con (tri v phi) ri mi xa node cha ca chng. V vy ta
dng cch duyt LRN hoc RLN cho thao tc ny.

Bi 225: (trang 63)


void Solution( int n, NODEPTR t, int curlevel, int* sum ) {
if ( t ) {
if ( curlevel == n ) {
printf( "%d ", t->data );
*sum += t->data;
} else if ( curlevel < n ) {
Solution( n, t->left, curlevel + 1, sum );
Solution( n, t->right, curlevel + 1, sum );
}
}
}

/* dng trong hm main() */


s = 0;
Solution( n, t, 0, &s );
printf( "\nTong = %d\n", s );
Ta duyt quy cy t node gc n mc n yu cu, mc ang duyt c xc nh
bi curlevel c truyn nh tham s. curlevel c khi to mc 0 khi gi hm,
khi quy xung nhnh tri hay phi curlevel tng 1 n v.
Nu curlevel bng mc n yu cu th xut ni dung node lu tr.
tnh tng cc node thuc mc n, ta truyn bng con tr thm mt bin sum, nhng
thay i ca bin sum s c lu qua cc ln gi quy.
Cch trn d hiu nhng sum c truyn bng con tr nn d nhm ln. Mt phng
n khc:
int Solution( int n, NODEPTR t, int curlevel ) {
if ( t ) {
if ( curlevel == n ) {
printf( "%d ", t->data );
return t->data;
} else if ( curlevel < n ) {
return Solution( n, t->left, curlevel + 1 ) +
Solution( n, t->right, curlevel + 1 );
332
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


}
}
return 0;
}

Bi 226: (trang 63)


int Solution( int x, NODEPTR t, int level ) {
if ( !t ) return -1;
if ( t->data == x ) return level;
return ( x < t->data ) ? Solution( x, t->left, level + 1 )
: Solution( x, t->right, level + 1 );
}

/* dng trong hm main() */


n = Solution( x, t, 0 );
if ( n == -1 ) printf( "Khong tim thay\n" );
else printf( "Muc %d\n", n );
Ta tm x trong cy t bng cch duyt cy, c hai trng hp dng:
- Duyt n node l (t = NULL) m vn khng tm thy, tr v -1 (mc khng th c
trong cy). Ch , nu chn node cha tr x vo, t = NULL chnh l ni chn node.
- Tm thy node (x = t->data) ta tr v mc level. Mc level khi to bng 0 (mc
xut pht) khi gi hm v s tng 1 n v khi duyt xung cy con tri hoc phi.
Khi khng gp hai trng hp trn, duyt quy xung nhnh con tri hoc phi ty
theo tr ca x, ch tng mc level.

Bi 227: (trang 64)


NODEPTR isMember( NODEPTR t, int x ) {
if ( t ) {
if ( x == t->data ) return t;
return ( x < t->data ) ? isMember( t->left, x )
: isMember( t->right, x );
}
return NULL;
}

/* x, y phi chc chn thuc cy, x < y */


NODEPTR isParent( NODEPTR t, int x, int y ) {
if ( x == t->data || y == t->data || x < t->data && y > t->data )
return t;
return ( x < t->data ) ? isParent( t->left, x, y )
: isParent( t->right, x, y );
}

/* dng trong hm main() */


do {
printf( "Nhap a, b: " );
scanf( "%d%d", &a, &b );
if ( a != b && isMember( t, a ) && isMember( t, b ) )
break;
printf( "Nhap khong hop le...\n" );
} while ( 1 );
if ( a > b ) { int temp = a; a = b; b = temp; }
printf( "Node cha: %d\n", isParent( t, a, b )->data );
333
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Ta sp xp trc a < b: gip d dng xc nh c v tr node cn li khi xc nh


c mt node a hoc b.
- Nu 2 node cha a v b nm trn 2 cy con tri phi ca node gc, node gc l node
cha ca chng (TH1).
- Nu 2 node cha a v b cng nm trong cy con bn tri hoc bn phi ca node
gc th c hai trng hp con:
+ Node cha l mt trong hai node cha a hoc b (TH2).
+ Hai node nm trn 2 nhnh ca mt cy con thuc nhnh tri hoc phi ca
node gc, node cha l node gc ca cy con ny (quy v TH1).
T node gc p, ta quy xung hai nhnh tri v phi cho n khi xy ra mt trong
cc iu kin dng quy TH1 hoc TH2. Khi , tr tr v ca hm isParent() chnh
l node cha cn tm.
bo m hm isParent() c im dng, tr a v b phi c trong cy. Ta dng
hm isMember() xc nh iu kin ny: duyt cy theo NLR (tt nht cho tm
node). Nu tm c node, tr v node cn tm; nu khng, tr v NULL.

Bi 228: (trang 64)


void PathLeft( NODEPTR t, int x ) {
if ( t ) {
if ( x == t->data ) return;
( x < t->data ) ? PathLeft( t->left, x )
: PathLeft( t->right, x );
printf( "%d ", t->data );
}
}

void PathRight( NODEPTR t, int x ) {


if ( t ) {
if ( x == t->data ) return;
printf( "%d ", t->data );
( x < t->data ) ? PathRight( t->left, x )
: PathRight( t->right, x );
}
}

/* dng trong hm main() */


int main() {
NODEPTR t, p;
int a, b;

t = NULL;
InTree( &t );

do {
printf( "Nhap a, b: " );
scanf( "%d%d", &a, &b );
if ( a != b && isMember( t, a ) && isMember( t, b ) )
break;
printf( "Nhap khong hop le...\n" );
} while ( 1 );
if ( a > b ) { int temp = a; a = b; b = temp; }

334
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


p = isParent( t, a, b );
if ( p->data == a ) {
PathRight( p, b );
printf( "%d", b );
} else if ( p->data == b ) {
printf( "%d ", a );
PathLeft( p , a );
} else {
printf( "%d ", a );
PathLeft( p , a );
PathRight( p->right, b );
printf( "%d", b );
}
putchar( '\n' );
return 0;
}
Hm xut ng i t node gc n mt node trong cy thc cht l duyt cy
tm node, tt nht l duyt theo NLR; nhng thm thao tc xut tng node duyt
trn ng i ti node cn tm.
- Hm PathRight( t, x ): xut ng i t node gc p n node cha tr x c trong
cy con bn phi, node gc cha tr nh hn x.
- Hm PathLeft( t, x ): xut ng i t node cha tr x c trong cy con bn tri
n node gc p cha tr ln hn x. V ta duyt quy t node gc xung nn xut
ng i theo th t ngc li, ta dng quy u.
ng i khng bao gm node cha x.
Khi xt hai node cha a v b, a < b v phi c mt trong cy BST, ta gp cc trng
hp sau y:
- Node gc ang xt p l node cha a: v a < b node cha b nm trong cy con bn
phi node gc p; gi hm PathRight( p, b ) xut ng i t node gc p cha a
n node cha b.
- Node gc ang xt p l node cha b: v a < b node cha a nm trong cy con bn
tri node gc p; gi hm PathLeft( p, a ) xut ng i t node cha a n node
gc p cha b.
- Node gc p khng cha a hoc b: v a < b, node a nm trong cy con bn tri v
node b nm trong cy con bn phi cy ny; gi hm PathLeft( p, a ) xut
ng i t node a n node gc p, gi tip hm PathRight( p->right, b ) xut
tip ng i t node phi ca node gc p n node b. Xut ng i t node phi
ca p do node gc p xut khi gi hm PathLeft( p, a ).
Khi gii quyt cc trng hp trn, ta cn xc nh node cha gn nht ca hai node
cha tr a v b; ta dng hm isParent() cho yu cu ny, xem bi 227 (trang 333).

Bi 229: (trang 64)


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FALSE 0
#define TRUE 1
enum eBALANCE { LEFT, EVEN, RIGHT };

struct DATA {

335
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


int key;
char value[10];
};

struct NODE {
enum eBALANCE flag;
struct DATA* pData;
struct NODE *left, *right;
};
typedef struct NODE* NODEPTR;

void RotateRight( NODEPTR* t ) {


NODEPTR temp = ( *t )->left;
( *t )->left = temp->right;
temp->right = *t;
*t = temp;
}

void RotateLeft( NODEPTR* t ) {


NODEPTR temp = ( *t )->right;
( *t )->right = temp->left;
temp->left = *t;
*t = temp;
}

void Rebalance_RIGHT( NODEPTR* t ) {


NODEPTR temp2, temp = ( *t )->right;
switch ( temp->flag ) {
case RIGHT: /* RR - cy con bn phi (R) c nhnh phi (R) di */
( *t )->flag = EVEN;
temp->flag = EVEN;
RotateLeft( t );
break;
case LEFT: /* RL - cy con bn phi (R) c nhnh tri (L) di */
temp2 = temp->left;
switch ( temp2->flag ) {
case EVEN:
( *t )->flag = EVEN;
temp->flag = EVEN;
break;
case LEFT:
( *t )->flag = EVEN;
temp->flag = RIGHT;
break;
case RIGHT:
( *t )->flag = LEFT;
temp->flag = EVEN;
}
temp2->flag = EVEN;
RotateRight( &temp );
( *t )->right = temp;
RotateLeft( t );
}
}

void Rebalance_LEFT( NODEPTR* t ) {


336
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


NODEPTR temp2, temp = ( *t )->left;
switch ( temp->flag ) {
/* LL - cy con bn tri (R) c nhnh tri (R) di */
case LEFT:
( *t )->flag = EVEN;
temp->flag = EVEN;
RotateRight( t );
break;
/* LR - cy con bn tri (R) c nhnh phi (R) di */
case RIGHT:
temp2 = temp->right; temp t
// -
switch ( temp2->flag ) {
case EVEN: \ - -
( *t )->flag = EVEN;
temp->flag = EVEN; -
break;
case RIGHT:
( *t )->flag = EVEN; // temp - t
temp->flag = LEFT;
break; \ / -
case LEFT:
( *t )->flag = RIGHT; \
temp->flag = EVEN;
}
temp2->flag = EVEN; // temp - t
RotateLeft( &temp );
( *t )->left = temp; \ - \
RotateRight( t );
/
}
}

void Insert( NODEPTR* t, struct DATA* d, int* taller ) {


/* chn mt node mi */
if ( *t == NULL ) {
*t = ( NODEPTR )malloc( sizeof( struct NODE ) );
( *t )->pData = d;
( *t )->flag = EVEN;
( *t )->left = ( *t )->right = NULL;
*taller = TRUE;
return;
}
/* trng kha */
if ( d->key == ( *t )->pData->key ) {
*taller = 0;
return;
}
/* chn tri */
if ( d->key < ( *t )->pData->key ) {
Insert( &( *t )->left, d, taller );
if ( taller ) /* c kh nng lm mt cn bng */
switch ( ( *t )->flag ) {
case LEFT: /* node gc thnh //, cn cn bng tri */
Rebalance_LEFT( t );
*taller = FALSE;
break;
case EVEN: /* node gc lch tri nhng cha mt cn bng */
337
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


( *t )->flag = LEFT;
*taller = TRUE;
break;
case RIGHT: /* thm node ch lm cy cn bng */
( *t )->flag = EVEN;
*taller = FALSE;
break;
}
return;
}
/* chn phi */
Insert( &( *t )->right, d, taller );
if ( *taller ) { /* c kh nng lm mt cn bng */
switch ( ( *t )->flag ) {
case LEFT: /* thm node ch lm cy cn bng */
( *t )->flag = EVEN;
*taller = FALSE;
break;
case EVEN: /* node gc lch phi nhng cha mt cn bng */
( *t )->flag = RIGHT;
*taller = TRUE;
break;
case RIGHT: /* node gc thnh \\, cn cn bng phi */
Rebalance_RIGHT( t );
*taller = FALSE;
break;
}
}
return;
}

void OutTree( NODEPTR t, int depth ) {


int i;
char b[3] = { '\\', '|', '/' };
if ( t == NULL ) return;
OutTree( t->right, depth + 1 );
for ( i = 0; i < depth; ++i ) printf( " " );
printf( "(%d,%c)\n", t->pData->key, b[t->flag] );
OutTree( t->left, depth + 1 );
}

struct DATA* Find( NODEPTR t, int key ) {


for( ; t; ) {
if ( t->pData->key == key ) return t->pData;
t = ( t->pData->key > key ) ? t->left : t->right;
}
return NULL;
}

int main() {
int i, taller, x;
struct DATA* d;
NODEPTR t = NULL;
struct DATA data[6] = {
{ 11, "Cho" }, { 4, "Meo" }, { 12, "Heo" },
{ 3, "Cop" }, { 9, "De" }, { 6, "Ran" } };
338
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

for ( i = 0; i < 6; ++i ) {


d = ( struct DATA* )malloc( sizeof( struct DATA ) );
d->key = data[i].key;
strcpy( d->value, data[i].value );
Insert( &t, d, &taller );
OutTree( t, 0 );
printf( "----------\n" );
}
printf( "Nhap khoa can tim: " );
scanf( "%d", &x );
if ( ( d = Find( t, x ) ) != NULL )
printf( "[%d,%s]\n", d->key, d->value );
else
printf( "Khong tim thay khoa\n" );
return 0;
}
Cy AVL c Adelson - Velskii v Landis gii thiu nm 1962. Cy AVL l mt
cy BST cn bng 1 cp (1-balanced BST), iu kin cn bng ca cy l:
| height(TL(x)) height(TR (x)) | 1, x
Trong : height(): tr v chiu cao ca cy, TL(x): cy con bn tri node x, TR(x):
cy con bn phi node x
Ngha l chnh lch chiu cao gia cy con bn tri v cy con bn phi ca mt
node x bt k trong cy khng c vt qu 1.
Cu trc d liu ca mt node trong cy AVL cn thm mt tc nhn cn bng
(balancing factor) flag kim tra cn bng ca cy:
- height(TL(x)) height(TR (x)) : flag = LEFT (minh ha bng du /)
- height(TL(x)) height(TR (x)) : flag = EVEN (minh ha bng du -)
- height(TL(x)) height(TR (x)) : flag = RIGHT (minh ha bng du \)
Khi chn mt node mi vo cy AVL, ta c th lm cy AVL mt cn bng. C 4
trng hp lm cy AVL mt cn bng:
- RR - cy con bn phi (R) c nhnh phi (R) di
- RL - cy con bn phi (R) c nhnh tri (L) di
- LL - cy con bn tri (L) c nhnh tri (L) di
- LR - cy con bn tri (L) c nhnh phi (R) di
Bin taller dng trong hm Insert() bo rng cy ang lch sau mi ln chn
node. Trong ln chn node k tip, khi nhn thy ln chn node trc lm cy
lch, cn xc nh l ln chn node hin ti c lm cy mt cn bng khng (hoc
lm cy cn bng tr li).
S mt cn bng ny lin quan n 3 node: k t node gc i theo hng nhnh
gy mt cn bng. cn bng li cy, ngi ta ti b tr li (trinode restructuring)
sao cho 3 node ny v cc cy con lin quan vn gi ng th t duyt LNR (inoder,
xem bi 222, trang 325).
Cc hnh di trnh by cch ti b tr li cy, cc con tr trong hnh gip d theo
di cc hm quay cy:
- Trng hp RR:
Thao tc ti b tr gi l quay tri cy (xem hm RotateLeft()) c gc l a. Ch
th t duyt LNR (T1) a (T2) b (T3) c (T4) khng thay i sau khi cn bng cy.

339
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

t
a \ b -
\ temp
b \ a - c

T1 c
T2 T1 T2 T3 T4

T3 T4
- Trng hp RL:
t
a \ a \ c -
\ temp \

temp2 b / c \ a b

T1 c T1 b
T4 T2 T1 T2 T3 T4

T2 T3 T3 T4
Thao tc ti b tr thc hin quay kp: quay phi cy con gc b a v trng
hp RR, sau quay tri cy gc a gii quyt trng hp RR. Ch th t duyt
LNR (T1) a (T2) c (T3) b (T4) khng thay i sau khi cn bng cy.
- Trng hp LL: i xng vi trng hp RR, ti b tr bng cch tng t, gi l
quay phi cy (xem hm RotateRight()).
- Trng hp LR: i xng vi trng hp RL, ti b tr bng cch tng t, quay
tri cy chuyn v LL, sau quay phi cy cn bng.
Cc trng hp RR v RL gii quyt bng hm Rebalance_RIGHT().
Cc trng hp LL v LR gii quyt bng hm Rebalance_LEFT().

Bi 230: (trang 65)


void Delete( NODEPTR* t, int d, int* shorter ) {
if ( d == ( *t )->pData->key ) {
if ( ( *t )->left && ( *t )->right ) { /* c hai cy con */
NODEPTR p;
void* temp;
/* tm node thay th trc */
for ( p = ( *t )->left; p->right; p = p->right ) { }
/* hon chuyn d liu node cn xa vi node thay th trc */
temp = ( *t )->pData;
( *t )->pData = p->pData;
p->pData = temp;
/* gi quy xa node thay th (hin mang kha d) trong cy tri */
Delete( &( *t )->left, d, shorter );
/* cn bng cy sau khi xa node */
if ( shorter )
switch ( ( *t )->flag ) {
case RIGHT: /* xa node nhnh phi: cy mt cn bng */
Rebalance_RIGHT( t );
break;
case EVEN: /* xa node nhnh phi: node gc lch phi */
340
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com


( *t )->flag = RIGHT;
*shorter = FALSE;
break;
case LEFT: /* xa node nhnh phi: cy cn bng tr li */
( *t )->flag = EVEN;
*shorter = TRUE;
}
} else { /* trng hp ch c mt cy con, xa node ti y */
NODEPTR dnode = *t;
*t = ( !( *t )->left ) ? ( *t )->right : ( *t )->left;
free( dnode->pData );
free( dnode );
*shorter = TRUE;
}
} else if ( d < ( *t )->pData->key ) { /* xa bn nhnh tri */
Delete( &( *t )->left, d, shorter );
/* cn bng cy sau khi xa node */
if ( shorter )
switch ( ( *t )->flag ) {
case RIGHT:
Rebalance_RIGHT( t );
break;
case EVEN:
( *t )->flag = RIGHT;
*shorter = FALSE;
break;
case LEFT:
( *t )->flag = EVEN;
*shorter = TRUE;
}
} else { /* xa bn nhnh phi */
Delete( &( *t )->right, d, shorter );
/* cn bng cy sau khi xa node */
if ( shorter )
switch ( ( *t )->flag ) {
case LEFT:
Rebalance_LEFT( t );
break;
case EVEN:
( *t )->flag = LEFT;
*shorter = FALSE;
break;
case RIGHT:
( *t )->flag = EVEN;
*shorter = TRUE;
}
}
}
p dng cch xa node trong cy BST trnh by cui bi tp 221 (trang 320). Kt
qu node cn xa c chuyn thnh node thay th ch c mt cy con.
Ging nh bin taller trong hm Insert(), bin shorter truyn trong hm Delete()
bo rng cy ang lch sau mi ln xa node, dng xc nh vic xa node c lm
cy mt cn bng khng tin hnh cn bng li cy sau khi xa node.

341
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

TI LIU THAM KHO


(Sp xp theo nm xut bn)
[1] Programming Language - C. ANSI X3.159-1989 aka ISO 9899-1990 -
American National Standard for Information Systems.
[2] Kernighan, Brian W. & Ritchie, Dennis M. - The C Programming Language
- Second Edition - Prentice Hall, 1988. ISBN 0-131-10370-9
[3] Kochan, Stephen G. & Wood, Patrick H. - Topics in C Programming - Third
Edition - John Wiley & Sons, 1991. ISBN 0-471-53404-8
[4] Schildt, Herbert - A Book on C: Programming in C - Fourth Edition -
McGraw Hill/Osborne Media, 1995. ISBN 0-078-82101-0 (ting Anh).
[5] Johnsonbaugh, R. & Kalin M. - Applications Programming in ANSI C -
Third Edition - MacMillan, 1996. ISBN 0-023-61141-3
[6] Summit, Steve & Lafferty, Deborah - C Programming FAQs: Frequently
Asked Questions - Addison Wesley, 1996. ISBN 0-201-84519-9
[7] Kelley, Al & Pohl, Ira - C: The Complete Reference - Third Edition - Addison
Wesley, 1997. ISBN 0-078-82101-0
[8] Cassgne, Bernage - Introduction au Language C (norme ISO/ANSI) -
Universit Joseph Fourier & CNRS, 1998 (ting Php).
[9] P.S. Deshpande & O.G. Kakde - C & Data Structures - Charles River Media,
2004. ISBN 1-584-50338-6
[10] Ivor Horton - Beginning C - Fifth Edition - Apress, 2013. ISBN 978-1-4302-
4881-1
[11] Jeri R. Hanly, Elliot B. Koffman - Problem Solving and Program Design in
C - Seventh Edition - Pearson Education, Inc., 2013. ISBN 0-13-293649-6
[12] Deitel, H.M. & Deitel, P.J. - C How to Program - Seventh Edition - Prentice
Hall, 2013. ISBN 0-13-299044-X
[13] Stephen Prata - C Primer Plus - Sixth Edition Pearson Education, Inc., 2014.
ISBN 0-321-92842-3
[14] Tony Crawford, Peter Prinz - C: In a Nutshell - Second Edition - O'Reilly,
2016. ISBN 978-1-491-90475-6

342
TopTaiLieu.Com | Chia S Ti Liu Min Ph

(c) Dng Thin T www.trainingwithexperts.com

Mc lc
Li ni u................................................................................................................ 1
Hng dn s dng sch .......................................................................................... 2
Phn bi tp
Khi nim c bn - Ton t - Cu trc la chn - Cu trc lp ............................ 3
Mng .................................................................................................................... 17
Mng nhiu chiu ................................................................................................ 25
Chui ................................................................................................................... 35
quy ................................................................................................................. 41
Structure - Union - Bit Field ................................................................................ 46
Tp tin .................................................................................................................. 49
Cc vn khc ................................................................................................... 56
Cu trc d liu ................................................................................................... 58
Phn bi gii
Khi nim c bn - Ton t - Cu trc la chn - Cu trc lp .......................... 66
Mng .................................................................................................................. 113
Mng nhiu chiu .............................................................................................. 146
Chui ................................................................................................................. 181
quy ............................................................................................................... 217
Structure - Union - Bit Field .............................................................................. 240
Tp tin ................................................................................................................ 252
Cc vn khc ................................................................................................. 279
Cu trc d liu ................................................................................................. 296
Ti liu tham kho ................................................................................................ 342

343

You might also like