Professional Documents
Culture Documents
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
9
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
21
TopTaiLieu.Com | Chia S Ti Liu Min Ph
22
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
MNG CA CC MNG 11
26
TopTaiLieu.Com | Chia S Ti Liu Min Ph
27
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
29
TopTaiLieu.Com | Chia S Ti Liu Min Ph
30
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
1 2 3 4 5
10 9 8 7 6
11 12 13 14 15
20 19 18 17 16
21 22 23 24 25
Bi gii: xem trang 172
32
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
Bi 123: Vit chng trnh ch dng cc thao tc trn chui, cng hai s nh phn
dng chui k t, in ra kt qu cng dng chui k t.
1101010000110001
11000000111001
-----------------
10000010001101010
36
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
54
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
57
TopTaiLieu.Com | Chia S Ti Liu Min Ph
CU TRC D LIU
Cc bi tp cu trc d liu (data structure) c a vo tp sch ny c xem
nh l cc bi tp dng rn luyn: thao tc trn con tr, truyn tham s bng con tr
(hiu qu tng ng vi truyn tham s bng tham chiu trong C++), gii thut
quy
V l do trn, phn ny ch gii hn trong phm vi cc bi tp vi danh sch lin kt
n v cy tm kim nh phn (BST).
Theo quan im ring ca chng ti, bi tp cu trc d liu c thc hin bng
C++ hoc Java vi s h tr ca OOP s d dng v thun li hn. Tuy nhin vic
vit li cc bi tp trong phn ny bng C++ hoc Java khng kh.
Phn ln cc bi tp trong phn danh sch lin kt n u dng thng tin lu ti
58
TopTaiLieu.Com | Chia S Ti Liu Min Ph
struct NODE {
SLINK data;
struct NODE* next;
};
typedef struct NODE* NODEPTR;
Nn t chc v qun l thng tin lu tr nh trn thun tin cho vic hon chuyn
d liu khi cn.
Phn ln cc bi tp trong phn BST u dng cu trc d liu chung nh sau:
struct NODE {
int data;
struct NODE *left, *right;
};
typedef struct NODE* NODEPTR;
Chng ti cng dng mt cy c cu trc tng i
tng qut d kim tra kt qu xut ca cc bi tp 9
trong phn ny, d liu nhp: 9 3 16 14 2 5 4 8 18
V cc bi gii di v c nhiu tc v lp i lp li nn 3 16
ch c mt s bi gii y , cc bi gii cn li ch
tp trung gii quyt yu cu. Bi gii y xin tham 2 5 14 18
kho trong source code ca sch.
Bi 201: Xt cc trng hp chn mt node mi vo 4 8
mt danh sch lin kt n cha cc tr nguyn.
Nhap 0 de dung: 3 2 1 0
List goc: [1][2][3]
Chen 5 cuoi: [1][2][3][5]
Chen 4 sau node [3]: [1][2][3][4][5]
Bi gii: xem trang 296
Bi 202: Cho mt danh sch lin kt n cha cc tr nguyn. Dng gii thut
quy, chn mt node cha tr 0 sau mi node cha tr chn trong danh sch lin kt.
Nhap 0 de dung: 1 2 4 3 5 6 0
List goc: [1][2][4][3][5][6]
Chen 0 sau tri chan: [1][2][0][4][0][3][5][6][0]
Bi gii: xem trang 300
59
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
65
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
[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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
95
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
unsigned n, m, s;
do {
printf( "Nhap n: " );
scanf( "%u", &n );
} while ( !n && printf( " Error: n > 0\n" ) );
s = 0;
m = 1;
while ( s + m < n ) {
printf( "%u", m );
s += m++;
if ( s + m < n ) printf( " + " );
}
if ( s ) {
printf( " = %u < %u\n", s, n );
printf( "m = %u\n", m - 1 );
}
else printf( "Khong tim thay\n" );
return 0;
}
Ch mt cch bo li ca vng lp nhp s:
do {
printf( "Nhap n: " );
scanf( "%u", &n );
} while ( n <= 0 && printf( " Error: n > 0\n" ) );
Hm printf() tr v s k t xut, trong trng hp trn v phi biu thc iu kin
lun ng.
- Trong trng hp nhp sai (n <= 0), kim tra v tri biu thc iu kin cho kt
qu ng nn tip tc kim tra v phi v li bo li c in ra.
- Trong trng hp nhp ng (n > 0), kim tra v tri biu thc iu kin cho kt
qu sai; do tnh cht ngn mch ca biu thc iu kin, nn khng cn kim tra
biu thc v phi na.
Nu ch tm m, c th vit ngn gn nh sau:
#include <stdio.h>
int main() {
unsigned n, m, s;
do {
printf( "Nhap n: " );
scanf( "%u", &n );
} while ( n <= 0 && printf( " Error: n > 0\n" ) );
s = 0;
m = 1;
while( s + m < n ) s += m++;
if ( s ) printf( "m = %u\n", m - 1 );
else printf("Khong tim thay\n");
return 0;
98
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
unsigned n, i, s;
int main() {
unsigned i, n, temp;
105
TopTaiLieu.Com | Chia S Ti Liu Min Ph
106
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
int n;
int main() {
int i, j, n;
int a[MAX] = { 0 };
113
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
int a[MAX];
int n, i, c;
118
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
123
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
int a[MAX], n, i, j, i1, j1, k;
125
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
int a[MAX];
int n, i, j;
127
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
COPY
COPY
136
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
int a[MAX], x;
int n, i;
138
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
int n, i;
int *a, x;
a = myAlloc( n );
if ( !a )
{ printf( "Loi cap phat\n" ); return 1; }
140
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
143
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int AandB( int a[], int n, int b[], int m, int c[] ) {
int i, j, k;
for ( k = i = 0; i < n; ++i )
for ( j = 0; j < m; ++j )
if ( b[j] == a[i] )
c[k++] = a[i];
return k;
}
int AorB( int a[], int n, int b[], int m, int c[] ) {
int i, j, k;
i = j = k = 0;
while ( i < n ) c[k++] = a[i++];
while ( j < m )
if ( !isMember( a, n, b[j] ) )
c[k++] = b[j++];
else j++;
return k;
}
144
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
a[i][0]
memmove()
MAX phn t
n phn t
b[i*n]
n phn t
Khi , cch lp trnh s khc. Ta c nhu cu sao chp mng hai chiu thnh mng
mt chiu tin x l. Thao tc sao chp nh sau, xem hnh trn hiu r trnh t
sao chp:
#define MAX 20
/* ... */
int a[MAX][MAX], b[MAX * MAX];
int n, i, j;
/* ... */
/* sao chp sang mng 1 chiu */
147
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
/* 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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
int a[MAX][MAX];
int n, i, j;
int main() {
int a[MAX][MAX];
int n, i, j;
151
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
int a[MAX][MAX], k;
int n, i, j;
152
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
typedef struct {
int array[MAX][MAX];
} array_inside;
int main() {
int a[MAX][MAX];
array_inside c;
int i, j, k;
156
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
int a[MAX][MAX];
int n, m, i, j;
160
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
int A[MAX][MAX], C[MAX][MAX];
int n, m, i, j ;
161
TopTaiLieu.Com | Chia S Ti Liu Min Ph
Quay
A
A
-900
0 i i i
0
j 0 0 0 j
A A
A
Tnh tin
n-1
i ma trn A ma trn B ma trn C i
Phn trong khung l ma trn ta chuyn thnh h ta ton hc d tnh ton,
ta nhn thy lc ny trc x l i v trc y l j. Phn trong khung cng m t cc bc
ta quay v tnh tin ma trn p ng yu cu bi ton (ch A d nhn thy ma
trn quay).
Ma trn B l kt qu php quay ma trn A mt gc -900 (theo chiu kim ng h du
-, ngc chiu kim ng h du +), vi tm quay l gc ta :
xB cos sin xA
90o
yB
sin cos yA
xB xA cos yA sin xB yA
yB xA sin yA cos yB xA
Ma trn C l kt qu php tnh tin ma trn B mt on dch chuyn (n - 1) theo
chiu tng trc y:
xC xB
yC yB (n 1)
xC xB xC yA xC yA xA n 1 yC
yC yB (n 1) yC xA (n 1) yC n 1 xA yA xC
Ngha l gi tr ti ta (xC, yC) ca ma trn C l gi tr ly t ta (xA = n - 1
- yC, yA = xC) ca ma trn A:
C( xC, yC ) = A( n - 1 - yC, xC )
T ch trn: trc x l i v trc y l j: C[i][j] = A[n - 1 - j][i]
y chnh l cng thc cn tm.
Bn c th t hi: ngi ta tnh nhm nh th no c cng thc trn? Trc
ht ta ly mu v to kt qu ch bng tay:
1 2 3 7 4 1
A = 4 5 6 C = 8 5 2
7 8 9 9 6 3
D nhn thy rng hng chuyn thnh ct v ct chuyn thnh hng, ta ngh
ngay n cng thc B[i][j] = A[j][i]
Nhng y l cng thc quen thuc ca ma trn chuyn v, kt qu khi chuyn v
nh sau:
1 4 7
B = 2 5 8
3 6 9
So vi kt qu ch, ta thy C ch khc B th t cc ct: ct ca C ngc li so vi
ct ca B, ngha l ct (j) ca C l ct (n - 1 - j) ca B:
162
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
int a[MAX][MAX];
int n, m, i, j, s;
165
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
int a[MAX][MAX], b[MAX][MAX];
int n, m, i, j;
167
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
int a[MAX][MAX];
int b[MAX*MAX];
int n, m, i, j, k;
177
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
double** a, t;
int n, i, j, k;
180
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
188
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
- 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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
char a[] = "87654321";
char b[] = "12345678";
200
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
char s[30];
char sname[4] = " x.";
char *p, *out;
char name[100][30];
int line, i;
line = 0;
while ( fgets( s, 30, stdin ) != NULL ) {
char* t = strrchr( s, '\n' );
if ( t != NULL ) *t = '\0';
if ( strcmp( s, "" ) == 0 ) continue;
allTrim( s );
/* ly t cui ca chui, t lu v tr t ny */
p = strrchr( s, ' ' );
t = p + 1;
out = strdup( t );
strcat( out, ", " );
/* ly t u bng strtok(s), trn t */
if ( ( p = strtok( s, " " ) ) != NULL )
213
TopTaiLieu.Com | Chia S Ti Liu Min Ph
strcat
int main() {
char s[MAX + 1];
char* lines[100];
int i, n = 0;
215
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
int x;
221
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
int n;
222
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
double a, b;
int n;
231
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
double x = -2.1;
int main() {
hanoi( 4, 1, 3 );
return 0;
}
238
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
typedef struct {
int h;
int m;
} TIME;
typedef struct {
char workerID[8];
TIME t_in, t_out;
} timeCard;
248
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
timeCard group[6];
int i, n = 6;
249
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
FILE *file1, *file2;
int i;
253
TopTaiLieu.Com | Chia S Ti Liu Min Ph
#include <stdio.h>
int main() {
FILE* f;
unsigned code;
char name[32];
char add[32];
char birthday[10];
255
TopTaiLieu.Com | Chia S Ti Liu Min Ph
if ( argc != 3 ) {
printf( "Cu phap: UPPER lowerfile upperfile\n" );
return 0;
}
256
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
char c;
char s[20];
263
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
EMP e, e1, e2;
FILE * fp;
int i, j, n;
268
TopTaiLieu.Com | Chia S Ti Liu Min Ph
/* 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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
char fname[30];
FILE* fin;
int nlines, ncols;
do {
printf( "Nhap ten file: " );
scanf( "%29s", fname );
fin = fopen( fname, "r" );
if ( !fin ) perror( "Loi" );
} while ( !fin );
while ( getchar() != '\n' ) { }
nlines = ncols = 0;
while ( !feof( fin ) ) {
char c = fgetc( fin );
if ( !feof( fin ) ) {
ncols++;
if ( ncols == MAXCOLS || c == '\n' ) {
nlines++;
if ( nlines == MAXROWS ) {
printf( "\nNhan Enter de xem tiep..." );
getchar(); /* nhn k t Enter xem tip */
nlines = 1;
}
putchar( c );
ncols = 1;
}
else putchar( c );
}
}
fclose( fin );
return 0;
}
Tng t bi 175 (trang 256), tng k t ca tp tin c c bng hm fgetc() v
c xut ra mn hnh bng hm putchar(), cho n khi n cui tp tin, kim tra
bng feof().
Ta cn kim sot:
- S k t trn mi dng (s ct): bng cch m s k t in ra ( ncols), khng cho
vt s k t ti a ngh cho mi dng (MAXCOLS).
- S dng cho mi trang: bng cch m s dng in ra (nlines), s dng ny tng
khi k t in ra l '\n' hoc ncols bng MAXCOLS nn cn chuyn n in dng
mi. Khi nlines bng s dng ti a ngh cho mi trang (MAXROWS), ta dng li
v xut dng nhc "\nNhan Enter de xem tiep...".
275
TopTaiLieu.Com | Chia S Ti Liu Min Ph
if ( argc != 4 ) {
printf( "Cu phap: SORT file1 file2 sortfile\n" );
printf( "file1 va file phai sap xep tang truoc\n" );
return 0;
}
f1 = fopen( argv[1], "r" );
f2 = fopen( argv[2], "r" );
f = fopen( argv[3], "w" );
if ( f1 && f2 && f ) {
FILE *ft;
int t1, t2;
t1 = fscanf( f1, "%d", &n1 );
t2 = fscanf( f2, "%d", &n2 );
/* c tng k t bng fscanf() cho n cui mt trong 2 file ngun */
while ( t1 != EOF && t2 != EOF ) {
if ( t1 != 1 || t2 != 1 ) { printf( "Loi doc\n" ); break; }
/* k t no nh hn a vo n, k t cn li dng so snh tip */
if ( n1 < n2 ) {
n = n1;
/* sau khi a k t vo n, c tip file cha k t */
t1 = fscanf( f1, "%d", &n1 );
} else {
n = n2;
t2 = fscanf( f2, "%d", &n2 );
}
/* ghi n vo file ch bng fprintf() */
if ( fprintf( f, "%d ", n ) == EOF ) { printf( "Loi ghi\n" ); break; }
}
/* stream (file) cha c ht t tn l ft */
if ( t1 == EOF && t2 != EOF ) {
n = n2;
ft = f2;
} else if ( t1 != EOF && t2 == EOF ) {
n = n1;
ft = f1;
} else return 0;
/* c tip tng k t t stream ft vo stream ch */
t1 = 1;
do {
if ( fprintf( f, "%d ", n ) == EOF ) { printf( "Loi ghi\n" ); break; }
if ( t1 != 1 ) { printf( "Loi doc\n" ); break; }
} while ( ( t1 = fscanf( ft, "%d", &n ) ) != EOF );
}
if ( f1 ) fclose( f1 );
if ( f2 ) fclose( f2 );
276
TopTaiLieu.Com | Chia S Ti Liu Min Ph
i = 0;
do {
snprintf( fname + pos, 4, "%03d", i++ );
/* c t tp tin ln vo buf */
readout = fread( buf, sizeof( char ), size, f );
/* ghi s byte tht s c c t buf vo tng tp tin con */
277
TopTaiLieu.Com | Chia S Ti Liu Min Ph
278
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
time( &now );
t = localtime( &now );
snprintf( s, 30 + strlen( week[t->tm_wday] ) + strlen( month[t->tm_mon] ),
"Hom nay %s, ngay %02d thang %s nam ",
week[t->tm_wday], t->tm_mday, month[t->tm_mon] );
strftime( s + strlen( s ), 80, "%Y\nBay gio la %I:%M:%S %p", t );
l_now = mktime( t );
gmt_now = mktime( gmtime( &now ) );
printf( "%s %+04g GMT\n", s, difftime( l_now, gmt_now ) / 3600 );
return 0;
}
Thng thng ly thng tin ngy v gi, ta cn phn tch cu trc tm mt cch th
cng. Tuy nhin, time.h cung cp hm size_t strftime( char *str, size_t
maxsize, const char *fmt, const struct tm* time ); cho php chuyn i thng
tin ny t con tr kiu tm time thnh mt chui k t vi nh dng ch nh bi
chui fmt. Hm strftime() s lu chui kt qu vo vng m ch bi con tr str,
c kch thc ti a l maxsize.
Cc chui nh dng trong strftime() (gi l c t chuyn i - conversion
specifier) kh chi tit, nht l vi C99, trnh by thng tin ngy gi cho nhng
yu cu phc tp. Bn tm hiu thm trong nhng ti liu v C.
Hm time() tr v thi gian hin ti di dng time_t, bng hai cch:
now = time( NULL ); /* now kiu time_t */
hoc:
time( &now ); /* sau khi gi hm now thnh calendar time hin ti */
Sau calendar time ny c chuyn cho hm localtime() tr v cu trc tm,
dng broken-down time, cho php ly thng tin thi gian chi tit.
Chui ngy gi trong bi tp c thc hin nh sau:
- Vi thng tin cn chuyn thnh ting Vit (th, thng) ta phi dng thng tin ly
t cc thnh vin ca cu trc tm, ri tra trong cc bng lookup (week, month).
- Vi thng tin truy xut trc tip, chuyn cu trc tm trn cho hm strftime()
tch thng tin thi gian bng cc specifier. V d: %Y (nm), %I (gi, h 0-12), %M
(pht), %S (giy), %p (AM hoc PM cho h 0-12),
- Thng tin v gi chu n cn c theo kinh tuy n Greenwich (GMT - Greenwich
Mean Time) c tnh bng cch ly chnh lch gia hai calendar time:
Thi im hin ti a phng l_now: ly bng localtime() ri dng mktime()
chuyn sang calendar time.
Thi im hin ti kinh tuyn chun Greenwich gmt_now: ly bng gmtime() ri
dng mktime() chuyn sang calendar time.
Hm difftime() tnh chnh lch (tnh bng giy) gia hai calendar time ny. V
GMT chia theo mi gi nn thi gian chnh lch c chia cho 3600 (s giy/gi).
Bi tp: Vit hm sinh chui code da trn chui s a vo.
- Bn k t u ca code l bn k t u ca s vit hoa. Nu c k t space,
hoc s khng 4 k t, thay th cc k t space bng k t 'X'.
282
TopTaiLieu.Com | Chia S Ti Liu Min Ph
#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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
Cc macro trong bi tp dng cc ton t bitwise thc hin cc thao tc trn bit,
xem bi tp 56 (trang 111):
- Macro BitOn( d, n ): to mask bng cch dng ton t dch tri <<, dch bit 1 n
ng v tr cn bt bit trong d, sau dng ton t OR bitwise bt bit.
1 1 1 0 1 1 1 1 d
0 0 0 1 0 0 0 0 mask
dch tri
1 n n v
to mask
OR bitwise
- Macro BitOff( d, n ): to mask bng cch dng ton t dch tri <<, dch bit 1 n
ng v tr, sau dng ton t o bit ~ o tt c bit ca mask c mask o.
Trong mask o, bit 0 nm ng v tr cn xa bit trong d, sau dng ton t AND
bitwise xa bit.
1 1 1 1 1 1 1 1 d
1 1 1 0 1 1 1 1 mask o
dch tri n n
0 v, ri o bit
to mask o
AND bitwise
- Macro BitFlip( d, n ): to mask bng cch dng ton t dch tri <<, dch bit 1
n ng v tr cn lt bit trong d, sau dng ton t XOR bitwise lt bit.
1 1 1 1 1 1 1 1 d
0 0 0 1 0 0 0 0 mask
dch tri
0 n n v
to mask
XOR bitwise
- Macro isBit( d, n ): nh tr mt biu thc iu kin xc nh bit ang xem
xt l 0 hay 1. Trc ht, to mask bng cch dng ton t dch tri <<, dch bit 1 n
ng v tr cn kim tra trong d, sau dng ton t AND bitwise AND gia d v
mask. Nu bit kim tra bng 0 th kt qu AND bng 0, ngc li kt qu AND ln hn
0. Ta nh tr biu thc iu kin bo m tr v 0 hoc 1.
1 1 1 0 1 1 1 1 d
0 0 0 1 0 0 0 0 mask
dch tri
0 n n v
to mask
AND bitwise
Hm printBits() dng macro isBit() ny in cc bit ca mt s.
287
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
int d = INT_MAX / 10;
288
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
int i, n;
char* s[100];
FILE *f;
289
TopTaiLieu.Com | Chia S Ti Liu Min Ph
290
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
int i, n;
char *s[100], *fname[100], *t;
char** p;
char key[20];
char* k = key;
FILE *f;
291
TopTaiLieu.Com | Chia S Ti Liu Min Ph
Trc khi chuyn sang phn Cu trc d liu, chng ta n tp bng cch thc hin
vi bi tp c c t phc tp. Do bi gii di, nn chng ti ch km theo source
code ca sch, khng trnh by y.
Bi tp:
Chng trnh tnh thu thu nhp (Ontario, Canada) da trn ti liu c t sau:
Payroll Deduction Calculations for Ontario Employees
I Gross Income
F Registered Pension Plan Contributions
U1 Union Dues
P Number of Pay Periods
TC Federal Personal Claim
TCP Provincial Personal Claim
XX Number of Dependants below age of 18
YY Labour-sponsored share purchases
F1 Authourized deductions
D CPP contributions year-to-date
C CPP contribution: tr nh hn gia
(4.95% * (I - $3,500 / P), < 0 th dng 0) v (1,861.20 D, 0)
D EI premiums year-to-date
EI EI premiums: tr nh hn gia (1.95% * I) v ($760.50 D, 0)
A Annual Taxable Income : P * (I - F - U1) - F1
292
TopTaiLieu.Com | Chia S Ti Liu Min Ph
Bi tp:
Ti khon (account) gm nhiu loi. Ti mt thi im, ti khon c mt s d
(balance). Ghi n (debit) v ghi c (credit) l hai loi bt ton thc hin trn ti
khon. Tc ng ca n khc nhau ty theo loi ti khon:
- Ti khon c s d n (debit balances): ghi n (debit) lm tng balance ca n, ghi
c (credit) lm gim balance ca n. Ti khon c s d n gm cc loi sau:
+ Asset account: ti khon ti sn (tin mt, bt ng sn, thit b, hng tn kho,
khon phi thu). M bt u 1 (ti sn ngn hn), 2 (ti sn di hn).
+ Expense account: ti khon chi ph (chi ph hot ng, khu hao, li vay ph
tr). M bt u 6 (chi ph).
- Ti khon c s d c (credit balances): ghi n (debit) lm gim balance ca n,
ghi c (credit) lm tng balance ca n. Ti khon c s d c gm cc loi sau:
+ Liability account: ti khon n phi tr (cc khon vay, n di hn, li phi
tr). M bt u 3 (n phi tr).
+ Equity account: ti khon u t (khon d phng, li nhun gi li). M bt
u 4 (ngun vn ch s hu).
+ Revenue account: ti khon doanh thu (doanh thu dch v, tin li nhn c).
M bt u 5 (doanh thu).
294
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
- 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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
/* gi trong hm InList() */
NODEPTR InList() {
int x;
NODEPTR p = NULL;
while ( 1 ) {
scanf( "%d", &x );
if ( !x ) return p;
Solution( &p, x );
}
}
Gii php khng quy nh sau:
- Nu danh sch rng hoc node u cha tr ln hn tr cn chn, ta thc hin thao
tc chn u.
- Nu khng, dng phng php d pha trc, xc nh node trc node cn chn
v thc hin thao tc chn sau mt node bt k.
Mt cch trnh by khc, d hiu hn, cho gii php trn:
void Solution( NODEPTR* l, int x ) {
NODEPTR t1, t2;
NODEPTR p = ( NODEPTR )malloc( sizeof( struct NODE ) );
p->data = x;
p->next = NULL;
t1 = NULL;
t2 = *l;
while ( t2 && t2->data < x ) {
t1 = t2, t2 = t2->next;
}
if ( !t1 ) { p->next = *l; *l = p; }
else { p->next = t1->next; t1->next = p; }
}
- u tin to mt node p kiu NODEPTR cha tr x.
- Tm node x trong danh sch l bng con tr t2, con tr t1 i ngay sau t2. y l k
301
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
/* 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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
/* gi trong hm main() */
Solution( &l );
OutList( l, "List dao" );
Ta thc hin khng quy nh sau:
- Duyt danh sch lin kt cho, mi ln duyt b li node va duyt cho mt con
tr t (kiu NODEPTR) gi. Nh vy danh sch lin kt ban u dn dn b hy.
- Chn u t (khng to node mi) vo mt danh sch mi, i din bi con tr p
kiu NODEPTR (phi khi to bng NULL trc). V chn u nn danh sch mi s c
th t o ngc so vi danh sch c.
- Sau khi duyt, con tr l n cui danh sch, dng li con tr ny ch n danh
sch mi.
Khng thay i lin kt ca cc node, ta cng c th o ngc th t cc phn t
trong danh sch lin kt n bng cch hon chuyn d liu ca cc phn t t hai
u danh sch:
- Vng lp ngoi nh v node cn hon chuyn d liu th nht (nm na u danh
sch), t u danh sch bng con tr l.
- Vng lp trong nh v node cn hon chuyn d liu th hai (nm na cui danh
sch), t cui danh sch bng con tr p.
Vn l lm sao cho con tr p di chuyn ngc ln u danh sch: vng lp trong
c chn di bi con tr q. Sau mi vng lp trong p ch node cui, ta gn cho
308
TopTaiLieu.Com | Chia S Ti Liu Min Ph
/* 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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
/* 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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
/* gi trong hm main() */
printf( "Nhap k: " );
scanf( "%d", &k );
Solution( &l, k );
o hai node k tip nhau trong mt danh sch lin kt c thc hin nh sau:
a b
p t t = p->next->next->next
a b
p t
p->next->next->next = p->next
p->next = p->next->next
a b
p t
p->next->next->next = t
a b
p t
Cn ch nguyn tc:
- Khi thay i mt thng tin lin kt phi bo m thng tin c lu li.
V d: trc khi thay i p->next->next->next ta lu thng tin ny vo t.
- Nu khng lu thng tin lin kt li trc khi thay i chng th phi bo m l
cn cch khc nhn c thng tin ny.
V d: node a do p->next ch n, ta thay p->next bng p->next->next c v sau
vn xc nh c node a do con tr p->next->next ch n.
- Mt thng tin lin kt khng cn ngha na th c th thay i m khng cn lu li.
V d: bc cui, thng tin lin kt n node b c p->next lu nn c th
thay i thng tin lin kt t node a tr i.
Khi o hai node trong danh sch lin kt c cc ngoi l sau:
- Node a l node cui, khi p->next->next = NULL, ta kim tra v khng thc hin
316
TopTaiLieu.Com | Chia S Ti Liu Min Ph
317
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
20 27
12 18 23 27
16
Sao chp chng d liu cha trong node thay th trc vo node cn xa:
321
TopTaiLieu.Com | Chia S Ti Liu Min Ph
12 18 23 27
16
By gi c cy 2 node cha d liu ging nhau, ta s xa node thay th trc v
node ny hoc l node l, hoc ch c mt cy con bn tri nn d dng xa hn.
Node cha ca node thay th trc l p, lu c do dng k thut hai con tr ni
ui bc trc. Cho p ch n node gc ca cy bn tri node thay th trc:
p->right = d->left;
10
8 p 18
15 p->right 25
cng l d
12 18 23 27
d->left
16
Node thay th trc by gi tch khi cy v qun l bi con tr d, ta xa d:
free( d );
Khi tm node thay th trc, c mt trng hp c bit l node thay th trc
nm ngay sau node cn xa. Kt qu vng lp tm node thay th trc nh sau:
10 p = t
8 d 18
15 25
12 23 27
10 14
Trong trng hp ny p = t v d chnh l p->left. Sau khi sao chp chng d liu
cha trong node thay th trc vo node cn xa:
t->data = d->data;
ta tch node thay th trc ra khi cy bng cch:
p->left = d->left;
322
TopTaiLieu.Com | Chia S Ti Liu Min Ph
10 p=t
8 15
p->left
15 cng l d
25
d->left
12 23 27
10 14
Node thay th trc by gi tch khi cy v qun l bi con tr d, ta xa d:
free( d );
Tng kt cch 1:
void RemoveNodeByCopy( NODEPTR* t ) {
NODEPTR p, d = *t;
if ( !( *t )->left ) *t = ( *t )->right;
else if ( !( *t )->right ) *t = ( *t )->left;
else {
for ( p = *t, d = ( *t )->left; d->right;
p = d, d = d->right ) { }
( *t )->data = d->data;
if ( p == *t ) p->left = d->left;
else p->right = d->left;
}
free( d );
}
- Cch th hai, xa node bng ghp cy (merge).
Cch th hai xa node trong, gn hn cch trn, nhng c mt vi khc bit khi
tin hnh xa node.
Tm node thay th trc l node phi nht ca cy con bn tri node t, khng cn
dng k thut hai con tr ni ui nhau. Ta bt u t node gc ca cy con bn tri
(node t->left, ngha l p = t->left), sau lun i v bn phi (p = p->right) cho
n khi khng cn i tip c, ngha l khi con tr p->right == NULL.
for ( p = t->left; p->right; p = p->right ) { }
10
8 20
15 25
12 18 23 27
16
Kt thc vng lp trn p s ch node thay th trc.
Cy con bn phi node cn xa s c ghp vo bn phi node thay th trc
thnh cy con bn phi node thay th trc, ch t->right l con tr qun l cy
con bn phi ca node t.
p->right = t->right;
323
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
2 5 14 18
4 8
LNR: 2 3 4 5 8 9 14 16 18
Start End Start End
9 9
3 16 3 16
2 5 14 18 2 5 14 18
4 8 4 8
NLR: 9 3 2 5 4 8 16 14 18 LRN: 2 4 8 5 3 14 18 16 9
ngha mi cch duyt theo chiu su c trnh by trong bi 224 (trang 329).
326
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
int main() {
NODEPTR t = NULL;
InTree( &t );
printf( "BFS: " );
BFS( t );
putchar( '\n' );
return 0;
}
Duyt theo chiu rng cy BST l ln lt duyt tng mc (level-by-level) ca cy,
ti mi mc duyt cc node t tri sang phi:
9 cp 0 9
3 16 cp 1 3 16
2 5 14 18 cp 2 2 5 14 18
4 8 cp 3 4 8
BFS: 9 3 16 2 5 14 18 4 8
Khi duyt mt node ta ng thi bit c thng tin lin kt n hai node con, thng
tin ny c lu tr vo mt cu trc d liu b tr (helper data structure) no
x l sau. Nh vy cu trc d liu b tr phi p ng:
- X l tun t.
- Ta t node cha vo cu trc d liu trc cc node con. Sau node cha c
x l trc cc node con.
Cu trc d liu b tr thch hp l queue (hng i), hot ng theo nguyn tc
FIFO tun t, c xy dng bng danh sch lin kt n, vi cc thao tc:
- InQueue(): chn cui mt node vo queue, d liu trong node ca queue chnh l
mt node ca cy BST.
- OutQueue(): xa u mt node ca queue, trc khi xa d liu c lu li tr
v. Trong queue, thao tc nhp/xut din ra hai u khc nhau ca queue.
328
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
struct DATA {
335
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
339
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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
TopTaiLieu.Com | Chia S Ti Liu Min Ph
342
TopTaiLieu.Com | Chia S Ti Liu Min Ph
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