Professional Documents
Culture Documents
250 C Exercices With Solutions DuongThienTu PDF
250 C Exercices With Solutions DuongThienTu PDF
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
Gi gii bi tp.
2
(c) Dng Thin T www.trainingwithexperts.com
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
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
Nhap a, b, c: 2 1 -4
x1 = -6.74456
x2 = 4.74456
Bi gii: xem trang 71
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
5
(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
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),
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
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
7
(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
8
(c) Dng Thin T www.trainingwithexperts.com
9
(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.
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.
Bi 34: Dng cng thc hnh thang, tnh gn ng tch phn xc nh sau vi
chnh xc 10-6:
11
(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
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.
Nhap n: 822
822 khong la so nguyen to
So nguyen to be hon gan nhat: 821
Bi gii: xem trang 95
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 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 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
Nhap n: 50
Ve trai = 1625625
Ve phai = 1625625
Bi gii: xem trang 104
Nhap n: 10
Ket qua: 1.24624
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
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
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
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
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
Gip Tn Du Su
Qu Nhm Tut T
Hi
Nhap n (n chan): 10
109 111 162 107 115 111 108 173 108 113
20
(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
21
(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
22
(c) Dng Thin T www.trainingwithexperts.com
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
24
(c) Dng Thin T www.trainingwithexperts.com
MNG CA CC MNG 11
26
(c) Dng Thin T www.trainingwithexperts.com
27
(c) Dng Thin T www.trainingwithexperts.com
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
28
(c) Dng Thin T www.trainingwithexperts.com
29
(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
30
(c) Dng Thin T www.trainingwithexperts.com
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
31
(c) Dng Thin T www.trainingwithexperts.com
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
(c) Dng Thin T www.trainingwithexperts.com
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
34
(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
35
(c) Dng Thin T www.trainingwithexperts.com
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
(c) Dng Thin T www.trainingwithexperts.com
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
5. Nu i 0, lp li bc 3, 4
6. Tr v x
MCMXCIX = 1999
MCMIC = So khong hop le
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
40
(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 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()
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 146: Nhp vo s nguyn n (0 < n 9). Xut tam gic Pascal chiu cao n.
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
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
Bi gii: xem trang 222
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
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 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 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 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 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
(c) Dng Thin T www.trainingwithexperts.com
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
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
A B C A B C A B C A B C
Xem thm v bi ny trong nhiu sch v lp trnh.
45
(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 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)
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.
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
(c) Dng Thin T www.trainingwithexperts.com
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 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 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
(c) Dng Thin T www.trainingwithexperts.com
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
53
(c) Dng Thin T www.trainingwithexperts.com
54
(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 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.
55
(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 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
56
(c) Dng Thin T www.trainingwithexperts.com
57
(c) Dng Thin T www.trainingwithexperts.com
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
(c) Dng Thin T www.trainingwithexperts.com
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
(c) Dng Thin T www.trainingwithexperts.com
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
60
(c) Dng Thin T www.trainingwithexperts.com
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 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
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 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
(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 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 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
63
(c) Dng Thin T www.trainingwithexperts.com
65
(c) Dng Thin T www.trainingwithexperts.com
Bi 1: (trang 3)
#include <stdio.h>
#include <math.h>
int main() {
double S;
Bi 2: (trang 3)
#include <stdio.h>
#include <math.h>
int main() {
float xA, yA, xB, yB;
Bi 3: (trang 3)
#include <stdio.h>
#include <math.h>
int main() {
double xC, yC, R, xM, yM, d;
66
(c) Dng Thin T www.trainingwithexperts.com
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;
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
(c) Dng Thin T www.trainingwithexperts.com
int main() {
float a, b, c;
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;
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;
69
(c) Dng Thin T www.trainingwithexperts.com
Bi 7: (trang 4)
#include <stdio.h>
int main() {
float a, b;
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
(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;
Bi 8: (trang 4)
#include <stdio.h>
#include <math.h>
int main() {
float 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
(c) Dng Thin T www.trainingwithexperts.com
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;
int main() {
int m;
Bi 10: (trang 5)
#include <stdio.h>
int main() {
72
(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 */
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
(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;
d = ( a1 * b2 - a2 * b1 );
dx = ( c1 * b2 - c2 * b1 );
74
(c) Dng Thin T www.trainingwithexperts.com
dy = ( a1 * c2 - a2 * c1 );
Bi 13: (trang 6)
#include <stdio.h>
int main() {
unsigned d, m, y, top, dayofweek; /* top l s ngy ti a ca thng */
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
(c) Dng Thin T www.trainingwithexperts.com
[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]
Bi 14: (trang 6)
#include <stdio.h>
76
(c) Dng Thin T www.trainingwithexperts.com
int main() {
unsigned d, m, y, top;
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 ) );
Bi 15: (trang 6)
#include <stdio.h>
int main() {
unsigned d, m, y, s, i;
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
(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);
}
Bi 16: (trang 7)
#include <stdio.h>
int main() {
unsigned y, m, dow, d, top, y1, m1;
'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
(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;
80
(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;
Bi 19: (trang 8)
#include <stdio.h>
int main() {
int h, m, s;
long time;
81
(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( "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;
int main() {
unsigned kw;
unsigned long money;
82
(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;
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
(c) Dng Thin T www.trainingwithexperts.com
unsigned n, i, count, sum;
Bi 23: (trang 8)
#include <stdio.h>
int main() {
unsigned n, i, j, sum;
Bi 24: (trang 9)
#include <stdio.h>
int main() {
unsigned long n, t;
unsigned u, sum = 0, count = 0;
#include <stdio.h>
#include <math.h>
85
(c) Dng Thin T www.trainingwithexperts.com
int main() {
unsigned long n;
int c;
Bi 25: (trang 9)
#include <stdio.h>
int main() {
unsigned a, b, gcd, lcm;
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;
#include <stdio.h>
#include <math.h>
int main() {
double n, m;
long t;
int i = 0;
87
(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;
88
(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;
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>
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 );
int main() {
double x;
90
(c) Dng Thin T www.trainingwithexperts.com
long round;
unsigned n;
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 );
int main() {
unsigned cel, fah;
#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 );
int main() {
unsigned i, j;
92
(c) Dng Thin T www.trainingwithexperts.com
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.
int main() {
unsigned i, j, s;
int main() {
unsigned i, j, k, l, d;
double f( double x ) {
return pow( sin( x ), 2 ) * cos( x );
}
int main() {
unsigned n = 10;
double a = 0;
double b = 1.5708; /* /2 */
double t, t1;
t1 = inter( a, b, n );
do {
94
(c) Dng Thin T www.trainingwithexperts.com
t = t1;
n *= 2;
t1 = inter( a, b, n );
} while ( fabs( t1 - t ) / 3 > eps );
95
(c) Dng Thin T www.trainingwithexperts.com
int main() {
unsigned 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 main() {
unsigned n, t;
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;
}
int main() {
unsigned n, k, i, count;
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
(c) Dng Thin T www.trainingwithexperts.com
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
(c) Dng Thin T www.trainingwithexperts.com
}
int main() {
unsigned x, y, z, x1, y1, z1, min, 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;
}
}
int main() {
unsigned x, y, z;
int main() {
unsigned x, y, z;
100
(c) Dng Thin T www.trainingwithexperts.com
}
return 0;
}
int main() {
unsigned i, j, k, l, m;
char sign[] = { '+', '-', '*', '/' };
int main() {
unsigned p[200], i, n, count;
unsigned x, y, z;
int main() {
unsigned n, i, Fi, Fi1, Fi2;
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
int main() {
unsigned n, i, j;
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
(c) Dng Thin T www.trainingwithexperts.com
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;
int main() {
unsigned n, i, j;
int main() {
104
(c) Dng Thin T www.trainingwithexperts.com
unsigned long n, s, i;
int main() {
unsigned n, i, s;
int main() {
unsigned i, n, temp;
105
(c) Dng Thin T www.trainingwithexperts.com
printf( "Nhap n: " );
scanf( "%u", &n );
106
(c) Dng Thin T www.trainingwithexperts.com
int main() {
unsigned n, k;
double S = 1.0;
int main() {
int s, t, temp;
printf( "[" );
do {
printf( "%d", t / s );
temp = t % s;
/* to phn s t/s mi */
t = s;
107
(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.
int main() {
int i;
float x, F;
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
(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 );
}
int main() {
int n, i;
double s = 0.0;
int main() {
float s, expr, expo, fact, x;
int i, sign = -1;
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
(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>
int main() {
int n, k;
110
(c) Dng Thin T www.trainingwithexperts.com
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.
int main() {
int x;
int main() {
int 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 );
112
(c) Dng Thin T www.trainingwithexperts.com
}
int main() {
int n;
int main() {
int i, j, n;
int a[MAX] = { 0 };
113
(c) Dng Thin T www.trainingwithexperts.com
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 );
114
(c) Dng Thin T www.trainingwithexperts.com
}
int main() {
int a[MAX], b[MAX];
int n, i, count;
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
(c) Dng Thin T www.trainingwithexperts.com
int main() {
int a[MAX];
int n, i, s, p;
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--;
int main() {
int a[MAX], n, i, j, s1, s2;
117
(c) Dng Thin T www.trainingwithexperts.com
int main() {
int a[MAX];
int n, i, c;
118
(c) Dng Thin T www.trainingwithexperts.com
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 );
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 );
int main() {
int a[MAX];
int n, i, k, maxpos, minpos;
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] );
int main() {
int a[MAX], t;
int n, i, j;
122
(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' );
123
(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 main() {
int a[] = { 8, 3, 6, 7, 2, 5, 7, 1, 4, 1 };
int *p;
int i, size = sizeof a / sizeof *a;
124
(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;
125
(c) Dng Thin T www.trainingwithexperts.com
int main() {
int a[MAX];
int i, head, n, maxlen, maxhead;
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
(c) Dng Thin T www.trainingwithexperts.com
int main() {
int a[MAX];
int n, i, j;
127
(c) Dng Thin T www.trainingwithexperts.com
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 );
128
(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]
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" );
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
(c) Dng Thin T www.trainingwithexperts.com
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 );
131
(c) Dng Thin T www.trainingwithexperts.com
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 );
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 );
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 );
int main() {
int a[MAX];
int n, i;
135
(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>
COPY
COPY
136
(c) Dng Thin T www.trainingwithexperts.com
int main() {
int a[MAX], x;
int n, i;
138
(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;
a = myAlloc( n );
if ( !a )
{ printf( "Loi cap phat\n" ); return 1; }
140
(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.
int main() {
int *a, *b;
int n, m;
a = myAlloc( n );
b = myAlloc( m );
if ( !a || !b ) printf( "Loi cap phat\n" );
else {
142
(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.
143
(c) Dng Thin T www.trainingwithexperts.com
int main() {
int a[MAX], x;
int n, i;
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
(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;
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.
int main() {
int a[MAX];
int n, i;
int main() {
int a[4][4];
int* b = &a[0][0];
int i, j, t, n = 4;
146
(c) Dng Thin T www.trainingwithexperts.com
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
(c) Dng Thin T www.trainingwithexperts.com
for ( i = 0; i < n; ++i )
memmove( &b[i * n], &a[i][0], n * sizeof( **a ) );
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.
int main() {
int a[MAX][MAX], b[MAX];
148
(c) Dng Thin T www.trainingwithexperts.com
int n, i, j, k;
/* 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;
}
int main() {
149
(c) Dng Thin T www.trainingwithexperts.com
int a[MAX][MAX], s;
int n, i, j;
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];
150
(c) Dng Thin T www.trainingwithexperts.com
int main() {
int a[MAX][MAX];
int n, i, j;
int main() {
int a[MAX][MAX];
int n, i, j;
151
(c) Dng Thin T www.trainingwithexperts.com
if ( a[i][j] > a[i][maxpos] ) maxpos = j;
swap( a[i][i], a[i][maxpos] );
}
int main() {
int a[MAX][MAX], k;
int n, i, j;
152
(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)
int main() {
int i, j;
_W
int main() {
int a[MAX][MAX], k, s, maxsum;
int n, i, j, maxpos;
maxsum = -101;
for ( k = -n + 1; k < n; ++k ) {
for ( s = i = 0; i < n; ++i )
for ( j = 0; j < n; ++j )
154
(c) Dng Thin T www.trainingwithexperts.com
if ( j == i + k ) s += a[i][j];
if ( s > maxsum ) { maxsum = s; maxpos = k; }
}
typedef struct {
int array[MAX][MAX];
} array_inside;
int main() {
int a[MAX][MAX];
array_inside c;
int i, j, k;
156
(c) Dng Thin T www.trainingwithexperts.com
int main() {
int a[MAX][MAX], b[MAX][MAX];
int n, i, j, maxr, maxc;
Nhap a b c d: 1 2 1 3
1/2 > 1/3
#include <stdio.h>
int main() {
char op[] = { '<', '=', '>' };
int a, b, c, d, z;
khng
thay i
maxr
dn c
dn dng dng ln ct
int main() {
int a[MAX][MAX], b[MAX][MAX];
int n, i, j, k;
int main() {
double a[MAX][MAX];
int n, i, j, k;
159
(c) Dng Thin T www.trainingwithexperts.com
printf( "Nhap bac ma tran: " );
scanf( "%d", &n );
int main() {
int a[MAX][MAX];
int n, m, i, j;
160
(c) Dng Thin T www.trainingwithexperts.com
int main() {
int A[MAX][MAX], C[MAX][MAX];
int n, m, i, j ;
161
(c) Dng Thin T www.trainingwithexperts.com
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
(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.
int main() {
int **a, **b, **c, **d;
int n;
a = myAlloc( n, 1 );
b = myAlloc( n, 1 );
if ( !a || !b )
{ printf( "Loi cap phat\n" ); return 1; }
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
(c) Dng Thin T www.trainingwithexperts.com
int main() {
int a[MAX][MAX];
int n, m, i, j, s;
165
(c) Dng Thin T www.trainingwithexperts.com
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;
166
(c) Dng Thin T www.trainingwithexperts.com
int main() {
int a[MAX][MAX], b[MAX][MAX];
int n, m, i, j;
167
(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.
int main() {
int a[MAX][MAX];
int sumd1[2 * MAX], sumd2[2 * MAX];
int n, i, j, k;
int main() {
int a[MAX][MAX];
int n, i, j, k, l, s;
int main() {
int a[MAX][MAX];
int n, i, j, k, l, max;
int main() {
int a[MAX][MAX];
int sumR[MAX] = { 0 };
int sumC[MAX] = { 0 };
int n, i, j, s;
170
(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 );
int main() {
int a[MAX][MAX];
int maxc[MAX], minc[MAX];
int n, i, j, pmax, pmin;
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
(c) Dng Thin T www.trainingwithexperts.com
int main() {
int a[MAX][MAX];
int i, j, k, 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
(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).
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++;
174
(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;
}
int main() {
int **a;
int n, m, i, j, k;
a = myAlloc( n, m );
if ( !a )
{ printf( "Loi cap phat\n" ); return 1; }
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).
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 );
}
v = direction = 0;
176
(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;
177
(c) Dng Thin T www.trainingwithexperts.com
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;
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
(c) Dng Thin T www.trainingwithexperts.com
int main() {
double** a, t;
int n, i, j, k;
180
(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).
int main() {
char s[255];
int i, head;
int maxhead, maxlen;
int main() {
char* buf;
size_t size;
char s1[] = "the quick brown fox ";
char s2[] = "jumps over the lazy dog";
183
(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.
184
(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;
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
(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;
}
int main() {
char s1[] = "hom qua qua noi qua ma qua khong qua";
const char* p = s1;
const char* oldp = s1;
char s2[] = "cabbage";
187
(c) Dng Thin T www.trainingwithexperts.com
188
(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;
int main() {
char str[] = "Kernighan and Ritchie";
int main() {
char str[] = " 'bJARne? sTROUstRUP' ";
char d[] = " \t\"'?!.,";
char *p = str;
int main() {
char s[255];
char* p = s;
int freq[7] = { 0 };
int i, count;
int main() {
char s[80], s1[80], *t;
unsigned long k;
192
(c) Dng Thin T www.trainingwithexperts.com
printf( "Chuoi chen : " );
fgets( s1, 80, stdin );
if ( ( t = strrchr( s1, '\n' ) ) != NULL ) *t = '\0';
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
int main() {
char s[80], *t;
int start, count;
193
(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.
int main() {
char s[255], *t;
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
196
(c) Dng Thin T www.trainingwithexperts.com
int main() {
int n;
char s[100];
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
(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' );
printf( "%20s\n", a );
printf( "%3c\n", '*' );
printf( "%20s\n", b );
printf( "%s\n", "--------------------" );
int main() {
char a[20], b[20], *t;
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
(c) Dng Thin T www.trainingwithexperts.com
int main() {
char a[] = "87654321";
char b[] = "12345678";
200
(c) Dng Thin T www.trainingwithexperts.com
int main() {
char s[100], *t, c;
int main() {
char s[] = " cam khong duoc do rac ";
char* s1 = reverseWord( s );
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
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 */
int main() {
char s[255];
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.
int main() {
char s[80], *t;
size_t i, j;
if ( strlen( s ) < 4 )
{ printf( "Phai co it nhat 4 so\n" ); return 0; }
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
(c) Dng Thin T www.trainingwithexperts.com
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;
206
(c) Dng Thin T www.trainingwithexperts.com
int main() {
char s[100], c, *t;
#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;
int main() {
char a[80], b[80];
int main() {
char s[10], *t;
unsigned long n;
209
(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.
int main() {
int n;
210
(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)
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 );
211
(c) Dng Thin T www.trainingwithexperts.com
s c a t \0
q l i o n \0
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.
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;
p = s;
while ( ( p = strtok( p, delimiter ) ) != NULL )
{ words++; p = NULL; }
212
(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.
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
(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
int main() {
char s[MAX + 1];
char* lines[100];
int i, n = 0;
215
(c) Dng Thin T www.trainingwithexperts.com
}
int main() {
char s[] = "aaabccccddddeeeeeeeeeeeefghhhhhhiiiiaaaabbbbbbc";
char* t;
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.
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 );
}
217
(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.
int main() {
char c;
int main() {
int c = 0;
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.
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
(c) Dng Thin T www.trainingwithexperts.com
int main() {
int x;
221
(c) Dng Thin T www.trainingwithexperts.com
int main() {
int n;
222
(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.
int main() {
int a[] = { 3, 5, 4, 6, 7, 1, 2 };
int size = sizeof a / sizeof *a;
int i;
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
(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;
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).
int main() {
int a[] = { 2, 3, 4, 5, 6, 7 };
int size = sizeof a / sizeof *a;
int i, x;
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
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
(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])
int main() {
int a[] = { 2, 3, 4, 5, 6, 7 };
int size = sizeof a / sizeof *a;
int i;
227
(c) Dng Thin T www.trainingwithexperts.com
int main() {
int a[] = { -2, 3, -4, -5, 6, -8 };
int i;
int size = sizeof a / sizeof *a;
i = Max( a, size );
printf( "\nMax = a[%d] = %d\n", i, a[i] );
228
(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.
int main() {
int a[] = { 7, -2, 3, 4, 3, -2, 7 };
int i;
int size = sizeof a / sizeof *a;
int main() {
int a[] = { -2, 3, -4, -5, 6, -8 };
int i;
int size = sizeof a / sizeof *a;
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
(c) Dng Thin T www.trainingwithexperts.com
printf( "\nTrung binh cong cac phan tu am: %g\n", NegAvg( a, size, 0, 0 ) );
int main() {
double a, b;
int n;
231
(c) Dng Thin T www.trainingwithexperts.com
do {
printf( "Nhap n (0 < n < 40): " );
scanf( "%d", &n );
} while( n <= 0 || n >= 40 );
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
double F( int n ) {
if ( n == 103 ) return 103;
232
(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.
int main( ) {
int *a, n, i, j;
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
int main() {
int m, n, g;
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
(c) Dng Thin T www.trainingwithexperts.com
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).
236
(c) Dng Thin T www.trainingwithexperts.com
permutation( s, l + 1, r );
Swap( s[i], s[l] );
}
}
}
int main() {
int n, i;
char* s;
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
(c) Dng Thin T www.trainingwithexperts.com
int main() {
double x = -2.1;
int main() {
hanoi( 4, 1, 3 );
return 0;
}
238
(c) Dng Thin T www.trainingwithexperts.com
int main() {
double x;
int n;
typedef struct {
double real, imag;
} Complex;
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;
}
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
(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.
typedef struct {
int num, denom;
} Fraction;
242
(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.
typedef struct {
double xc, yc;
double R;
} CIRCLE;
int main() {
CIRCLE a, b;
double d;
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
typedef struct {
double coef;
int power;
} MONO;
int main() {
MONO *poly1, *poly2, *poly;
int n1, n2;
245
(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" );
246
(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;
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
(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).
typedef struct {
int h;
int m;
} TIME;
typedef struct {
char workerID[8];
TIME t_in, t_out;
} timeCard;
248
(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;
249
(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.
typedef struct {
unsigned face: 4;
unsigned suit: 2;
} Card;
int main() {
Card deck[ 52 ];
fill( deck );
250
(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.
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;
252
(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;
}
int main() {
FILE *file1, *file2;
int i;
253
(c) Dng Thin T www.trainingwithexperts.com
double r;
#include <stdio.h>
int main() {
FILE* f;
unsigned code;
char name[32];
char add[32];
char birthday[10];
255
(c) Dng Thin T www.trainingwithexperts.com
if ( argc != 3 ) {
printf( "Cu phap: UPPER lowerfile upperfile\n" );
return 0;
}
256
(c) Dng Thin T www.trainingwithexperts.com
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.
if ( argc != 3 ) {
printf( "Cu phap: CIPHER originalfile encodefile\n" );
printf( "hoac : CIPHER encodefile originalfile\n" );
return 0;
}
257
(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.
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;
}
int main() {
int c, nlines = 0, f = 1;
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;
}
typedef struct {
int code;
char name[20];
260
(c) Dng Thin T www.trainingwithexperts.com
double avgmark;
} STUDENT;
int main() {
char c;
char s[20];
263
(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 );
264
(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 .
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 );
typedef struct {
265
(c) Dng Thin T www.trainingwithexperts.com
char name[15];
char tel[15];
char add[25];
} PERSON;
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()) .
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
(c) Dng Thin T www.trainingwithexperts.com
}
int main() {
EMP e, e1, e2;
FILE * fp;
int i, j, n;
268
(c) Dng Thin T www.trainingwithexperts.com
fwrite( &e, sizeof( e ), 1, fp );
}
fclose ( fp );
printf( "Nhap du lieu xong ...\n" );
/* 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;
}
typedef struct {
char name[80];
long pos;
} INDEX;
274
(c) Dng Thin T www.trainingwithexperts.com
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
(c) Dng Thin T www.trainingwithexperts.com
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
(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.
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
(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 );
278
(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() {
char* month[] = { "Gieng", "Hai", "Ba", "Tu", "Nam", "Sau",
"Bay", "Tam", "Chin", "Muoi", "Muoi Mot", "Chap" };
int m, y, top;
struct tm 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
(c) Dng Thin T www.trainingwithexperts.com
time()
gmtime() asctime()
mktime()
localtime() strftime()
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.
int main() {
char* week[] = { "Chu Nhat", "Thu Hai", "Thu Ba", "Thu Tu",
"Thu Nam", "Thu Sau", "Thu Bay" };
281
(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
(c) Dng Thin T www.trainingwithexperts.com
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
int main() {
char *code;
printf( "Code: [%s]\n", code = genCode( "abc" ) );
free( code );
return 0;
}
int main() {
char c;
funcFile *p[3] = { createFile, readFile, adjustFile };
do {
printf( "\nMENU\n" );
printf( "----\n"
283
(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 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.
int main() {
double x = 32.4, y = 24.7, z = 4.5, t = 11.8;
285
(c) Dng Thin T www.trainingwithexperts.com
int main() {
printf( "'c' viet hoa la '%c'\n", toupper( 'c' ) );
printf( "123 la %g%% cua 12345\n", percent( 123, 12345 ) );
return 0;
}
int main() {
int d = 12345;
286
(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
(c) Dng Thin T www.trainingwithexperts.com
int main() {
int d = INT_MAX / 10;
288
(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 main() {
int i, n;
char* s[100];
FILE *f;
289
(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
(c) Dng Thin T www.trainingwithexperts.com
int main() {
int i, n;
char *s[100], *fname[100], *t;
char** p;
char key[20];
char* k = key;
FILE *f;
291
(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 );
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
(c) Dng Thin T www.trainingwithexperts.com
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
(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).
struct NODE {
int data;
struct NODE* next;
};
typedef struct NODE* NODEPTR;
int main() {
NODEPTR l = NULL;
int x;
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
(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
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
(c) Dng Thin T www.trainingwithexperts.com
NODE l;
printf( "Nhap 0 de dung: " );
l = Solution();
/* ... */
}
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;
}
int main() {
NODEPTR l;
Solution( l );
OutList( l, "Chen 0 sau tri chan" );
return 0;
300
(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.
/* 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
(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;
}
302
(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
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
(c) Dng Thin T www.trainingwithexperts.com
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.
304
(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.
/* 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.
/* gi trong hm main() */
Solution( &l, m );
Xem hnh v.
306
(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).
/* 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
(c) Dng Thin T www.trainingwithexperts.com
/* 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
(c) Dng Thin T www.trainingwithexperts.com
/* gi trong hm main() */
p = NULL;
Solution( l, &p );
OutList( p, "List dao" );
struct NODE {
int data;
struct NODE * next;
};
typedef struct NODE* NODEPTR;
struct RNODE {
NODEPTR ptr;
struct RNODE * next;
};
typedef struct RNODE* RNODEPTR;
309
(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;
}
int main() {
NODEPTR l;
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.
312
(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.
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
(c) Dng Thin T www.trainingwithexperts.com
/* 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
(c) Dng Thin T www.trainingwithexperts.com
317
(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
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
4 7
320
(c) Dng Thin T www.trainingwithexperts.com
20 27
12 18 23 27
16
Sao chp chng d liu cha trong node thay th trc vo node cn xa:
321
(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
(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
(c) Dng Thin T www.trainingwithexperts.com
10
8 20
15
12 18
16 25
23 27
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
(c) Dng Thin T www.trainingwithexperts.com
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
(c) Dng Thin T www.trainingwithexperts.com
struct NODE {
int data;
struct NODE *left, *right;
};
typedef struct NODE* NODEPTR;
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;
327
(c) Dng Thin T www.trainingwithexperts.com
printf( "Nhap 0 de dung: " );
do {
scanf( "%d", &x );
if ( x ) Insert( t, x );
} while ( x );
}
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
(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 );
}
}
struct NODE {
int data;
struct NODE *left, *right;
};
typedef struct NODE* NODEPTR;
int main() {
NODEPTR t, t1;
t = t1 = NULL;
InTree( &t );
printf( "\nCay goc : " ); OutTree( t );
330
(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 );
}
}
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.
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
(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).
struct DATA {
335
(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;
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
(c) Dng Thin T www.trainingwithexperts.com
339
(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().
341
(c) Dng Thin T www.trainingwithexperts.com
342
(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