You are on page 1of 134

1

K thu t l p tr nh

CHNG i

I CNG V LP TRNH

I. Khi nim thut ton:


I.1. Khi ni m:
Thu t to n l t p hp c c quy t c c logic nh m gi i mt lp b i to n n o
c mt k t qu x c nh.
I.2. Cc t nh cht c trng ca thut ton :
I.2.1. T nh tng qut :
Thu t to n c l p khng ph i ch gi i mt b i to n c th m thi m
cn ph i gi i c mt lp c c b i to n c d ng tng t.
I.2.2. T nh gii hn :
Thu t to n gi i mt b i to n ph i c thc hi n qua mt s gii h n c c
thao t c t n k t qu .
I.2.3. T nh duy nht :
To n b qu tr nh bi n i, cng nh tr t t thc hi n ph i c x c nh
v l duy nh t. Nh v y khi dng thu t to n cng mt d li u ban u ph i cho
cng mt k t qu .
I.3. Phn loi:
Theo c u trc, ta c th ph n th nh ba lo i thu t to n c b n sau :
- Thu t to n khng ph n nh nh.
- Thu t to n c ph n nh nh.
- Thu t to n theo chu tr nh c bc l p x c nh v c bc l p khng
x c nh.
II. M t thut ton bng lu :
II.1. Lu :
Lu l mt d ng th dng m t qu tr nh t nh to n mt c ch c
h thng. Ngi ta thng th hi n thu t to n b ng lu .
II.2. Cc k hi u tr n lu :
T n khi
Khi m u ho c k t
thc
Khi v o ra

K hi u

ngh a
Dng m u ho c k t
thc chng tr nh
a s li u v o ho c in
k t qu

K thu t l p tr nh

Bi u di n c c cng thc
t nh to n v thay i gi
tr ca c c bi n
Dng ph n nh nh
chng tr nh

Khi t nh to n

Khi i u ki n

Dng gi chng tr nh
con
Ch hng truy n thng
tin, li n h c c khi

Chng tr nh con
Mi t n

II.3. Mt s v d bi u di n thut ton bng lu


II.3.1. Thut ton khng phn nhnh:
V d 1: T nh A = x2 + y2
Begin
Nhap (x,y)
A = x2 + y2
Xuat (A)
End

V d 2 : T nh S =

Ax + By + C
x +y
2

; bi t A,B,C,x,y
Begin

Nha p (A, B, C, x,y)


S = (Ax + By + C) / SQRT (x*x + y*y)
Xuat S
End

K thu t l p tr nh

II.3.2. Thut ton c phn nhnh:


V d 1: T m gi tr max ca ba s thc a,b,c
Begin
Nhap (a, b, c)
S

a>b

Max = b

Max = a
S

Max < c

Max = c
Xuat (Max)
End

V d 2: Gi i phng tr nh b c nh t Ax+B =0 vi c c nghi m thc.


Begin
Nhap (a, b)

a=0

Xuat (-b/a)

b=0

Xuat (PTV)

End

Xuat (PTVN)

K thu t l p tr nh

V d 3 : Gi i phng tr nh b c hai Ax2+Bx+C =0 vi c c nghi m thc.


Begin
Nhap (a, b, c)

a=0

PTB1 (b, c)

S
Delta = b*b - 4*a*c

Delta < 0

Xuat (PTVN)

Delta = 0

Xuat (-b / (2*a))

S
Xuat (X1= ,(-b + SQRT(Delta)) / (2*a))
Xuat (X2= ,(-b - SQRT(Delta)) / (2*a))
End

II.3.3. Thut ton c chu tr nh:


Thu t to n c chu tr nh vi c c bc l p x c nh thng c th hi n
b ng lu sau :
i = gia tr ban au
Le nh S;
Ta ng i

i <= n
S

vi n l gi tr k t thc.

K thu t l p tr nh
n

V d 4: T nhS= xi , vi c c xi do ta nh p v o.
i =1

Begin
Nhap (n)
i=1
S=0
Nhap (xi)
i = i+1
S = S+xi

i <= n
S
Xuat (S)
End

III. CC NGN NG LP TRNH & CHNG TRNH DCH:


III.1. Ngn ng lp tr nh:
III.1.1. Gii thi u: Con ngi mun giao ti p vi m y t nh ph i thng qua
ngn ng. Con ngi mun m y t nh thc hi n cng vi c, ph i vi t c c y u c u
a cho m y b ng ngn ng m y hi u c. Vi c vi t c c y u c u ta gi l l p
tr nh (programming). Ngn ng dng l p tr nh c gi l ngn ng l p tr nh.
N u ngn ng l p tr nh g n vi v n c n gi i quy t, g n vi ngn ng t
nhi n th vi c l p tr nh s n gi n hn nhi u. Nhng ngn ng l p tr nh c t nh
ch t nh tr n c gi l ngn ng c p cao. Nhng m y t nh ch hi u c ngn
ng ri ng ca m nh, l c c chui s 0 vi 1 v nh v y r r ng l kh kh n
cho l p tr nh vi n, v n khng g n gi vi con ngi.
Hi n t i, ngn ng l p tr nh c chia ra l m c c lo i sau:
III.1.2. Phn loi ngn ng lp tr nh:
- Ngn ng m y (machine language)

K thu t l p tr nh

- Hp ng (assembly language)
- Ngn ng c p cao (higher-level language)
Do m y t nh ch hi u c ngn ng m y, cho n n mt chng tr nh vi t
trong ngn ng c p cao ph i c bi n dch sang ngn ng m y. Cng c thc
hi n vi c bi n dch c gi l chng tr nh dch.
III.2. Chng tr nh dch:
Chng tr nh dch c chia ra l m 2 lo i : tr nh bi n dch (compiler) v tr nh
thng dch (interpreter)
III.2.1. Tr nh bi n dch: l vi c chuy n mt chng tr nh trong ngn ng
c p cao n o (chng tr nh ngun) sang ngn ng m y (chng tr nh ch).
- Thi gian chuy n mt chng tr nh ngun sang chng tr nh ch c
gi l thi gian dch.
- Thi gian m chng tr nh ch thc thi c gi l thi gian thc thi.
Nh v y, chng tr nh ngun v d li u chng tr nh thc thi c x
l trong c c thi i m kh c nhau, c gi l thi gian dch (compile time) v
thi gian thc thi (run-time)
D lieu

Chng trnh
nguon

Trnh bie n
dch

Chng trnh
ch

May tnh
thc hien

Ket qua

H nh I.1. Chng tr nh thc thi theo c ch dch ca tr nh bi n dch


III.2.2. Tr nh thng dch: qu tr nh dch v thc thi x y ra cng 1 thi
gian, dch n u thi h nh l nh n .
Chng trnh
nguon

Chng trnh
tho ng dch

Ket qua

D lieu

H nh I.2. Chng tr nh thc thi theo c ch dch ca tr nh thng dch

K thu t l p tr nh

CHNG 2

LM QUEN VI NGN NG C

* Gii thiu ngn ng C


Ngn ng C do Dennis Ritchie l ngi u ti n xu t, thi t k v c i
t C trong mi trng UNIX. N c ngun gc t ngn ng BCPL do Martin
Richards a ra v o n m 1967 v ngn ng B do Ken Thompson ph t tri n t
ngn ng BCPL n m 1970 khi vi t h i u h nh Unix.
C l ngn ng l p tr nh a dng, c p cao nhng l i c kh n ng thc hi n
c c thao t c nh ca ngn ng Assembly. V th ngn ng C nhanh chng c
c i t, s dng tr n m y vi t nh v tr th nh mt cng c l p tr nh kh m nh,
hi n nay ang c khuynh hng tr th nh mt ngn ng l p tr nh ch nh cho m y
vi t nh tr n th gii.
* c i m ngn ng C
Ngn ng C c nhng c i m c b n sau :
- T nh c ng (compact) : Ngn ng C ch c 32 t kho chu n, 40 to n
t chu n m h u h t c bi u di n bi c c d y k t ng n gn.
- T nh c u trc (structured) : Ngn ng C c mt t p hp c c ph t bi u l p
tr nh c u trc nh ph t bi u quy t nh ho c l p. Do , n cho php chng ta
vi t chng tr nh c t chc v d hi u.
- T nh tng th ch (compactable) : Ngn ng C c b l nh ti n x l v
c c th vi n chu n l m cho c c chng tr nh vi t b ng ngn ng C c th tng
th ch khi chuy n t m y t nh n y sang m y t nh ki u ho n to n kh c.
- T nh linh ng (flexible) : Ngn ng C l mt ngn ng r t linh ng v
ng ph p, n c th ch p nh n r t nhi u c ch th hi n m khng c ngn ng
kh c nh Pascal, n gip cho k ch thc m l nh c th thu gn l i chng
tr nh thc thi nhanh chng hn.
- Bi n dch : Ngn ng C c bi n dch b ng nhi u bc v cho php
bi n dch nhi u t p tin chng tr nh ri ng r th nh c c t p tin i tng (object)
v ni c c i tng l i vi nhau (link) th nh mt chng tr nh thc thi thng
nh t.
I. CC KHI NIM C BN
I.1. Cu trc c bn ca mt chng tr nh C
[ti n x l]
[C c h m]
main()

K thu t l p tr nh

[khai b o bi n;]
[nh p d li u ;]
[x l ;]
[xu t ;]

}
V d : Chng tr nh hi n tr n m n h nh c u Chao cac ban
void main()
{ printf(Chao cac ban\n);
}
Mt v i nh n xt quan trng :
- Chng tr nh C bao gi cng c mt hay nhi u h m, trong c mt
h m ch nh b t buc ph i c l h m main(). y ch nh l h m c thc hi n
u ti n trong chng tr nh.
- C p d u { } x c nh mt khi l nh.
- H m printf( Chao cac ban \n) l h m chu n ca C dng xu t c u
thng b o Chao cac ban ra m n h nh. K t \n l k t c bi t dng
xung dng.
- D u ; ch m dt mt l nh.
- Chng tr nh C c ph n bi t ch thng vi ch hoa. a s c c t kho
ca C c vi t b ng ch thng, cn mt s t c vi t b ng ch hoa m ta
ph i tu n th ch t ch , n u khng th chng tr nh dch s khng hi u.
* Mt vi v d
V d 1: In b ng ly tha 2 ca c c s nguy n t 10 n 50
/* Chng tr nh in b nh phng c c s t 10 n 50*/
#include <stdio.h>
void main()
{int n;
/*Khai b o bi n n ki u nguy n */
n=10;
/*G n n=10 */
while (n<=50)
/*L p t 10 n 50 b ng while */
{ printf(%3d \t %5d\n,n,n*n); /*in d ng 5d l d nh 5 v tr in n v n2 */
n++;
/* T ng n l n 1 */
}
/*H t while*/
}
/*H t main*/

K thu t l p tr nh

V d 2 : Tng t nh v d 1 nhng vi t c ch kh c :
#include <stdio.h>
#define max 50
/*Ti n x l, nh ngh a max =50*/
void main()
{ int n;
/*Khai b o bi n n ki u nguy n*/
for (n=10; n<=max; n++)
/*L p t 10 n 50 b ng for*/
printf(%3d \t %5d\n,n,n*n); /*in n v n2 d ng 5d l n m ch s*/
}
/*H t main*/
V d 3 : Chng tr nh in ly tha 2, 3, 4, 5; c dng h m t nh ly tha :
#include <stdio.h>
#define max 50
/*Ti n x l, nh ngh a max =50*/
float luythua(int n, int m) /*H m luythua vi 2 thng s*/
{ float s=1;
/*Khai b o v khi t o bi n s*/
for ( ;m>0;m--)
/*L p gi m d n t m ti 1*/
s=s*n;
return s;
/*Tr k t qu v */
}
void main()
{ int n,n2,n3,n4,n5;
/*Khai b o bi n ki u nguy n*/
for (n=10;n<=50;n++) /*L p t 10 n 50 b ng for*/
{ n2= luythua(n,2); /*Gi h m luythua*/
n3= luythua(n,3);
n4= luythua(n,4);
n5= luythua(n,5);
printf(%3d \t %5.2f \t %5.2f\t %5.2f\t %5.2f\t %5.2f\n,
n,n2,n3,n4,n5);
/*in n v nm d ng 5 ch s vi 2 s l */
}
}
/*H t main*/
* Hm xut chun printf()
C php :
printf(chui-nhd ng,thamso1,thamso2,...)
ngh a :
H m printf() s xem xt chui-nhd ng, l y gi tr c c tham s (n u c n)
t v o theo y u c u ca chui-nhd ng v gi ra thi t b chu n.
Chui-nhd ng l mt chui k t, trong c nhng k t xu t ra
nguy n v n ho c xu t d ng c bi t, v c th c nhng chui i u khi n
c n l y gi tr ca c c tham s thay v o khi in ra.

10

K thu t l p tr nh

- Nhng k t c bi t :
K t

Tc dng

\n
\t
\b
\r
\f
\a
\\
\
\
\xdd
\ddd

M ASCII

Xung h ng mi
Tab
Xa k t b n tr i
Con tr tr v u h ng
Sang trang
Ph t ti ng ci
Xu t d u cho ngc
Xu t d u nh y n
Xu t d u nh y kp
Xu t k t c m ASCII d ng Hex l dd
Xu t k t c m ASCII d ng Dec l
ddd
K t NULL

\0
- Chui nh dng :
% [ flag][width][.prec][FNhl] type

10
9
8
13
12
7
92
39
34

Type : nh ki u ca tham s theo sau chui-nhd ng l y gi tr ra


Type
d,i
u
o
x
X
f
e
E
g,G
c
s
%

ngh a
S nguy n c s 10
S nguy n c s 10 khng d u
S nguy n c s 8
S nguy n c s 16, ch thng(a,b,...,f)
S nguy n c s 16, ch in (A,B,...,F)
S thc d ng [-]dddd.ddd...
S thc d ng [-]d.ddd e[+/-]ddd
S thc d ng [-]d.ddd E[+/-]ddd
S thc d ng e(E) hay f ty theo ch nh x c
K t
Chui k t t n cng b ng \0
D u % c n in

11

K thu t l p tr nh

Flag : D ng i u ch nh
Flag

ngh a

n u khng c
+
#

in d li u ra vi canh ph i
in d li u ra vi canh tr i
Lun b t u s b ng + hay in ra ty theo type, n u:
0
: Ch n th m 0 ng trc gi tr >0
x,X : Ch n th m 0x hay 0X ng trc s n y
e,E,f : Lun lun c d u ch m th p ph n
G,g : Nh tr n nhng khng c s 0 i sau

Width : nh k ch thc in ra
Width

ngh a

n
0n
*

D nh t nh t n k t , i n kho ng tr ng c c k t cn trng
D nh t nh t n k t , i n s 0 c c k t cn trng
S k t t nh t c n in n m tham s tng ng

Prec : nh k ch thc ph n l in ra
Prec

ngh a

khng c
0
n
*

ch nh x c nh b nh thng
d,i,o,u,x ch nh x c nh c
e,E,f Khng c d u ch m th p ph n
nhi u nh t l n k t (s)
S k t t nh t c n in n m tham s tng ng

Cc ch b sung :
F
N
h
l
V d 1: char

Tham s l con tr xa XXXX:YYYY


Tham s l con tr g n YYYY
Tham s l short int
Tham s l long int (d,i,o,u,x,X)
double (e,E,f,g,G)
c=A;

char s[]=Blue moon! ;

12

K thu t l p tr nh

Dng
%c
%2c
%-3c
%d
%s
%3s
%.6s
%-11.8s
V d 2:

Thng s
tng ng

Xut

c
c
c
c
s
s
s
s

A
A
A
65
Blue moon!
Blue moon!
Blue m
Blue moo

int

i = 123;

float

x = 0.123456789;

Dng

Thng s
tng ng

Xut

%d
%05d
%7o
%-9x
%c
%-#9x
%10.5f

i
i
i
i
i
i
x

123
00123
123
7b

{
0x7b
0.12346

%-12.5e

1.23457e-01

Nhn xt
rng 1
rng 2, canh ph i
rng 3, canh tr i
M ASCII ca A
rng 10
Nhi u k t hn c n thi t
Ch nh x c 6 k t
Ch nh x c 8, canh tr i

Nhn xt
rng 3
Th m 2 s 0
H 8, canh ph i
H 16, canh tr i
K t c m ASCII 123
H 16, canh tr i
rng 10, c 5 ch s th p
ph n
Canh tr i, in ra di d ng
khoa hc

V d 3: Vi t chng tr nh in h nh ch nh t kp b ng c c k t ASCII
C9
CD
BB

C8

CD

BC

void main()
{
printf(\n\xC9\xCD\xBB);
printf(\n\xC8\xCD\xBC\n);
}

13

K thu t l p tr nh

I.2. Ki u d li u c bn
I.2.1. nh ngh a:
Ki u d li u c b n l ki u d li u c gi tr n, khng ph n chia c
na nh s, k t
I.2.2. Phn loi:
T n ki u

ngh a

K ch
thc

Phm vi

char

K t

1 byte

-128 127

unsigned char

K t khng d u

1 byte

0255

unsigned short

S nguy n ng n khng d u

2 bytes

065535

enum

S nguy n c d u

2 bytes

-3276832767

short int

S nguy n c d u

2 bytes

-3276832767

int

S nguy n c d u

2 bytes

-3276832767

unsigned int

S nguy n khng d u

2 bytes

0 65535

long

S nguy n d i c d u

4 bytes

-2147483648
2147483647

unsigned long

S nguy n d i khng d u

4 bytes

04294967295

float

S thc ch nh x c n

4 bytes

3.4 E-383.4 E+38

double

S thc ch nh x c kp

8 bytes

1.7 E-308 1.7


E+308

long double

S thc ch nh x c hn 10 bytes 3.4 E-4932 1.1


double
E+4932

Ch :
1. Ngn ng C khng c ki u logic (boolean nh Pascal) m quan ni m
0 l false ;
Kh c 0 l true
2. Ngn ng C khng c ki u chui nh ki u string trong Pascal
3. C c ki u ng nh t:
int = short int = short = signed int = signed short int
long int = long
signed long int = long
unsigned int = unsigned = unsigned short = unsigned short int
unsigned long int = unsigned long

14

K thu t l p tr nh

I.3. Bi n
I.3.1. T n bi n : T n bi n l mt chui k t b t u b ng k t ch, k t
k ti p l k t ch (d u g ch di _ c xem l k t ch) ho c s v khng
c trng vi c c t kha ca C.
Ch : - Ngn ng C ph n bi t ch thng vi ch hoa n n bi n ch
thng vi ch hoa l kh c nhau.
V d : Bien_1
_bien2
l hp l
bi&en
2a
a b l khng hp l
- Ngn ng C ch ph n bi t hai t n hp l vi nhau b ng n k t u ti n
ca chng. Thng thng n=8, nhng hi n nay nhi u chng tr nh dch cho php
n=32, nh Turbo C cho php thay i s k t ph n bi t t 8-32)
V d :Hai bi n sau b xem l cng t n
bien_ten_dai_hon_32_ky_tu_dau_tien_1
bien_ten_dai_hon_32_ky_tu_dau_tien_2
I.3.2. Khai bo bi n
C c bi n ph i c khai b o trc khi s dng nh m gip cho chng
tr nh dch c th x l chng.
Khai b o bi n c d ng :
Ki udli u

t nbi n1 [,tenbi n2 ...] ;

V d : int
a,b,c;
float x,y,delta;
char c;
* Khai b o v khi t o bi n:
Ki u d li u

t nbi n = gi tr ;

I.3.3. Hm nhp d li u chun


a) Hm scanf()
C php:

scanf(chui-nhd ng,i ch thams1, i ch thams2,...)

- Chui-nhd ng ca scanf() gm c ba lo i k t :
+ Chui i u khi n
+ K t tr ng
+ K t kh c tr ng
! Chui i u khi n c d ng :
%[width][h/l] type

15

K thu t l p tr nh

Vi type: x c nh ki u ca bi n a ch tham s s nh n gi tr nh p v o
Type

ngh a

d,i
S nguy n c s 10 (int)
o
S nguy n c s 8 (int)
u
S nguy n c s 10 khng d u (unsigned)
x
S nguy n c s 16 (int)
f,e
S thc (float)
c
K t (char)
s
Chui k t
p
Con tr (pointer)
lf
S thc (double)
Lf
S thc (long double)
Width : x c nh s k t ti a s nh n v o cho vng .
H m scanf() ch nh n cho width k t ho c cho n khi g p k t tr ng
u ti n. N u chui nh p v o nhi u hn th ph n cn l i s d nh l i cho l n gi
scanf() k ti p.
V d 1: scanf(%3s,str);
N u nh p chui ABCDEFG
th scanf() s nh n ti a 3 k t c t v o m ng str, cn DEFG s c l y
n u sau c l n gi sanf(%s,str) kh c.
V d 2: unsigned long money;
scanf(%lu,&money);
Lu : N u scanf(%ul, &money) th gi tr nh p v o s khng c lu
tr trong bi n money, nhng chng tr nh dch khng b o li.
V d 3: Nh p v o t n v b gii h n trong kho ng [A-Z,a-z]
char name[20];
printf(Name : ) ;
scanf(%[A-Za-z],&name);
Trong trng hp n y, n u ta g sai d ng th name =
! K t tr ng: n u c trong chui-d ng s y u c u scanf() b qua mt hay
nhi u k t tr ng trong chui nh p v o. K t tr ng l k t kho ng tr ng ( ),
tab (\t), xung h ng (\n). Mt k t tr ng trong chui-nhd ng s c hi u
l ch nh p n k t kh c tr ng ti p theo.

16

K thu t l p tr nh

V d 4: scanf(%d ,&num);
H m scanf() cho ta nh p mt k t kh c tr ng na th mi tho t ra. K t
s n m trong vng m v s c l y bi h m scanf() ho c gets() ti p theo.
! K t kh c tr ng: n u c trong chui-nhd ng s khi n cho scanf() nh n
v o ng k t nh th .
V d 5: scanf(%d/%d/%d,&d,&m,&y);
H m scanf() ch nh n mt s nguy n, c t v o d, k n l d u /, b d u
n y i v ch nh n s nguy n k ti p c t v o m. N u khng g p d u / k
ti p s nguy n th scanf() ch m dt.
Ch : H m scanf() i hi c c tham s ph i l c c a ch ca c c bi n
ho c l mt con tr.
* To n t a ch & : L y a ch ca mt bi n
int n; bi n n
&n; a ch ca n
printf(tr = %d, a ch = %d,n,&n);
b) Hm getch():

V d 6:

H m getch() dng nh n mt k t do ta nh p tr n b n ph m m khng


c n g Enter vi c ph p :
ch = getch();
ch = getche();

Khng hi n k t nh p tr n m n h nh
Hi n k t nh p tr n m n h nh

Vi ch l bi n ki u char.
V d 7:
void main()
{
char ch;
printf(Go vao ky tu bat ky : );
ch = getche();
printf(\n Ban vua go %c,ch);
getch();
}
V d 8: B n nh p v o 1 ch c i. N u ch c i nh p v o l 'd' th chng
tr nh s k t thc, ngc l i chng tr nh s b o li v b t nh p l i.
#include <stdio.h>
#include <conio.h>
void main()
{
char ch;

17

K thu t l p tr nh

printf("\nBan nhap vao 1 chu cai tu a den e: ");


while ((ch=getche()) != 'd')
{ printf("\nXin loi, %c la sai roi",ch);
printf("\n Thu lai lan nua. \n");
}
}
Lu : H m getch() cn cho php ta nh p v o 1 k t m rng nh c c
ph m F1, F2,.., c c ph m di chuy n cursor. C c ph m n y lun c 2 bytes: byte
th nh t b ng 0, cn byte 2 l m scancode ca ph m . nh n bi t ta g
ph m k t hay ph m m rng, ta c chng tr nh sau:
void main()
{
int c;
int extended = 0;
c = getch();
if (!c)
extended = getch();
if (extended)
printf("The character is extended\n");
else
printf("The character isn't extended\n");
}
Ph m
F1
F2
F3
F4
F5
F6
F7
F8
F9
F10
Home
"
#
$

M scancode
59
60
61
62
63
64
65
66
67
68
71
72
80
75

18

K thu t l p tr nh

77
%
PgUp
73
PgDn
81
End
79
Ins
82
Del
83
B ng m scancode ca c c ph m m rng
c. Hm kbhit(): H m int kbhit() s ki m tra xem c ph m n o c g
v o hay khng. N u c, h m kbhit s tr v mt s nguy n kh c 0, v ngc l i.
K t m ta nh p v o qua h m kbhit() c th l y c qua h m getch()
ho c getche().
V d:
void main()
{
printf("Press any key to continue:");
while (!kbhit()) /* do nothing */ ;
char kytu=getch();
printf("\nKy tu vua an : %c",kytu);
}
I.4 Hng: H ng l c c i lng m gi tr ca n khng thay i trong qu
tr nh chng tr nh thc hi n.
I.4.1. Phn loi :
a. Hng s : l c c gi tr s x c nh v khng i.

D ng
V d

int

unsigned

long

h 8

h 16

float/double

nnnn
-nnnn

nnnnU/u

nnnnL/l
-nnnnl/L

0nnnn

0xnnnn

nnnn.nnnn
nnnn.nnnE/ennn
123.654
123.234E-4

4567
123U
456789L 0345
0x1AB
-12
12uL
-1234L
Ch :
- C c h ng s vi t khng d u ho c khng s m c hi u l s nguy n,
ngc l i l double.
- C c h ng s nguy n ln hn int s c lu tr theo ki u long, cn ln
hn long th c lu tr theo ki u double.
- C c h ng s nguy n dng ln hn long s c lu tr theo ki u double

- Mt h ng s c lu tr theo d ng long n u theo s c k t l (L),

19

K thu t l p tr nh

d ng unsigned n u sau c ch u (U), d ng th p lc ph n n u trc s


c 0x v d ng b t ph n n u trc s c 0
50000; 10 L; Long
unsigned
5U, 100u
h 16 = 1610
0x10
h 8 = 810
010
b. Hng k t : l k t ri ng bi t c vi t trong hai d u nh y n : A

V d :

Gi tr ca h ng k t l m ASCII ca n.
V d : printf(%c c gi tr l %d,A,A);
% A c gi tr l 65
& H ng k t c th tham gia v o c c php to n nh mi s nguy n kh c.
V d :9-0=57-48=9
& H ng k t c th l c c k t c bi t d ng \c1 m ta xt h m
printf() nh \n,\a,\t ...
c. Hng chui : L mt chui k t n m trong hai d u nh y kp .
V d :

Day la mot chuoi


Hang chuoi co ky tu c bi t nh \ \n \248
chui rng.

Ch :
- Ph n bi t
A A
H ng:
Chui K t
D ng lu tr :
A \0

- Nh n xt: d ng lu tr, ta th y t n cng ca chui c k t NULL \0


m khng c d ng k t. Ch nh v v y m khng c k t rng .
- Mt chui c th c vi t tr n nhi u h ng vi i u ki n h ng tr n ph i
c d u \.
V d :Day la mot chuoi duoc viet tren \
nhieu hang \n
d. Hng bi u thc : L mt bi u thc m trong c c to n h ng u l
c c h ng. Khi chng tr nh dch s t nh to n bi u thc trc, v k t qu c
lu tr th ng b ng mt h ng s tng ng.
V d : 8*20-13 k t qu lu tr l 173

20

K thu t l p tr nh

a -A

l 97-65 = 32

1<8

l 0 (sai)
I.4.2. Khai bo hng:
C php: const t nh ng = bi uthc;
V d : const MAX = 50;
const PI = 3.141593;
Ch : - Ta c th khai b o h ng b ng c ch nh ngh a 1 macro nh sau:
#define t nh ng gi tr
- L nh #define ph i c khai b o ngo i h m v sau n khng c
d u ;
I.5. Php ton
I.5.1. Php gn:
C php: bi n = bi u thc;
Ch : Php g n trong ngn ng C tr v mt k t qu l tr ca bi u thc
V d 1 : c = 10;
a = b = c;
printf(a=%d , b=%d,a,b); a=10,b=10
V d 2 : x = b + 2*c;
y = a + x;

y= a + (x= b + 2*c)

V d 3 : (n+3) = 4+z; (khng hp l v b n tr i l bi u thc)


= c +o;
(khng hp l v b n tr i l h ng)
I.5.2. Cc php ton s hc :
a. Php ton hai ton hng : +, -, *, /, %
Php ton

Ki u ton hng

+, -, *

char, int, long, float,


double
/
nguy n/nguy n
thc(nguy n)/thc
(nguy n)
%
nguy n/nguy n
V d :
#include <stdio.h>
void main()

Ki u k t qu
Ki u ca to n h ng c ki u cao nh t
Ki u nguy n v l php chia nguy n
Ki u thc v l php chia thc
Ki u nguy n v l php chia l y ph n d

21

K thu t l p tr nh

{ char cv;
int iv = 121;
float fv1,fv2;
printf( Chuy n ki u :\n\n);
cv = iv;
printf(int c g n cho char : %d %d (%c)\n\n,iv,cv,cv);
fv1 = iv/50;
printf( int : %d / 50 = %f \n\n,iv,fv1);
fv1 = iv/50.0;
printf( float : %d / 50.0 = %f \n\n,iv,fv1);
fv1 = 1028.75;
fv2 = fv1 +iv ;
printf( %f + %d = %f \n\n,fv1,iv,fv2);
getch();
}
b. Php ton mt ton hng : php t ng ++, php gi m -
a++ ho c ++a
a = a+1

a-- ho c --a
a = a-1
Ch : Tuy nhi n a++ s kh c ++a khi chng ng trong bi u thc (c
php g n).
a++ : T ng a sau khi gi tr ca n c s dng.
++a : T ng a trc khi gi tr ca n c s dng.
V d :
main()
{

int

a=4 , b=6, n;
n = a + b;
n = a++ + b;
n = ++a + b;
n = --a + b;
n = a-- + b;
n = a+ b;

4
4
5
6
5
4
4

6
6
6
6
6
6
6

10
10
12
11
11
10

}
I.5.3. Php gn phc hp:
C php: bi n op= <bi uthc> bi n = bi n op <bi uthc>
Vi op l php to n.

22

K thu t l p tr nh

C c php g n phc hp :

+= , -= , *= , /= , %= , <<= , >>=

V d :n = n*(10+x)
n *= (10 +x)

n = n % 10
n %= 10

I = I +3
I += 3
<< : l php dch chuy n bit qua tr i .
>> : l php dch chuy n bit qua ph i .
I.5.4. Php ton quan h :
<
>
>=
<=
!=
==

:
:
:
:
:
:

nh hn
ln hn
ln hn ho c b ng
nh hn ho c b ng
kh c
b ng

Ch :
- Ph n bi t to n t so s nh == vi php g n =
- C khng c ki u d li u boolean m qui c : Gi tr 0 l sai
Gi tr !=0 l ng
V d:
a=10;
b=4
b= (a>6)*(a-6)
c=0
c= (a< 5)*(a-5)
V d: T m s ln nh t trong 3 s nguy n a, b, c
#include <stdio.h>
#include <conio.h>
void main ()
{ int a, b, c, max;
printf(Chng tr nh t m s ln nh t trong 3 s);
printf(Nh p a, b, c);
scanf(%d %d %d , &a, &b, &c);
max = a;
if (max<b) max = b;
if (max<c) max = c;
printf(S ln nh t = %d, max);
getch();
}

23

K thu t l p tr nh

I.5.5.Ton t logic:
Ton t
NOT
AND
OR

ngh a

!
&&
||

Ph nh
Giao, v
Hi

Th t t nh to n t tr n xung.
B ng ch n tr:
x

!x

x && y

true
false

false
true

true
true
false
false

true
false
true
false

true
false
false
false

V
if
V

x || y

true
true
true
false
true
true
false
true
true
false
false
false
d 1: Xt k t c c ph i l k s hay khng?
char c;
if (c >= 0 && c <= 9)
printf (% c l k t s , c);
d 2: Xt k t ch l ch c i hay khng?
((ch> =a) and (ch< =z)) or ((ch> =A) and (ch< =Z))
printf(%c l chu cai \n,ch);
d 3:
int a=10, b=5, c=0;
a && b 1
a && c 0
a||c 1

V d 4:
int a=10, b=5;

24

K thu t l p tr nh

int i=2, j=0;


(a>b) && (i<j) 0
(a<b) | | (i>j) 1
V d 5:
n=5;
while (n)
{ printf("\nS n = %d",n);
n--;
}
I.5.6. Ton t phy:
C php:
T = (exp1, exp2, exp3 );
// T = k t qu ca exp3
m=7; t=2
V d : m= (t=2, t*t+3)
c= (a=10,b=5,a+b); a=10, b=5, c=15
I.5.7. Ton t i u ki n:
C php :
T = <i u ki n> ? <bt1> : <bt2>;
N u <i u ki n> l ng th T = <bt1> , ngc l i T = <bt2>
V d : A = i>= MAX ? 1: 0;
printf ( max (a,b) = %d , (a>b) ? a:b);
lower = (c > = A && c< = Z) ? c - A + a :c;
I.5.8. Ton t tr n bit (bit wise) :
Dng
NOT bit
AND bit
OR bit
XOR bit
dch tr i
dch ph i

K hi u
~
&
|
^
<<
>>

ngh a
l y b 1
giao
hi
hi lo i tr
nh n 2
chia 2

25

K thu t l p tr nh

B ng ch n tr:
Bit
A
0
0
1
1

Bit
B
0
1
0
1

~A
1
1
0
0

Bit k t qu
A&B
A|B
0
0
0
1
0
1
1
1

A^B
0
1
1
0

V d :
a= 4564
b= 13667
a&b
a|b
a^b

0001
0011
0001
0011
0010

0001
0101
0001
0101
0100

1101
0110
0100
1111
1011

0100
0011
0000
0111
0111

ngh a:
1. Php AND bit thng c dng ki m tra mt bit c th n o trong
th nh ph n d li u x c tr 0 hay 1. Vi c n y thc hi n b ng c ch s dng mt
m t n (mask) vi bit c n quan t m b ng 1 cn c c bit kh c b ng 0. Ta l y mask
AND vi gi tr x. N u k t qu thu c b ng mask th l bit c n quan t m l 1,
ngc l i l 0.
V d 1:
void main()
{ unsigned x1; x2;
printf (\n cho 2 s hex(2 s) );
scanf (%x %x , &x1, &x2);
printf (% 02x & % 02x = % 02x\n, x1, x2, x1& x2);
}
V d 2: Ta mun bi t bit th 3 ca s hexa ch l 1 hay 0 :
void main()
{ unsigned char ch, kq;
printf ( \n cho 1 s hex 2 s :);
scanf ( %x, &ch);
kq= ch & 0x08;
if (kq== 0x08) printf (bit 3 = 1);
else printf (bit 3 = 0);
}

26

K thu t l p tr nh

2. Php OR dng b t c c bit c n thi t l n cng nh v o mt m t n .


Ch ng h n nh ta mun b t bit th 7 ca bi n ch (unsigned char ch) l n 1:
ch = ch | 0x80;
V d 3:
void main()
{ unsigned char x1,x2;
printf (\n cho 2 s hex (ff hay nh hn) :);
scanf (%x %x, &x1, &x2);
printf ( %02x | %02x %02x \n, x1, x2, x1| x2);
}
3. Php XOR dng l t bit ngh a l ho n chuy n 01
V d 4: l t bit 3 ta c chng tr nh:
void main()
{ unsigned char ch;
printf ( nh p 1 s hex < = ff :);
scanf (%x, &ch);
printf (%02x ^ 0x08 = %02x \n , ch, ch ^ 0x08);
}
4. To n t << , >>
<<
>>

dch sang tr i (nh n 2)


dch sang ph i (chia 2)

V d 5: num = 201 (0x00c9)


0

num << 2 : 0

num :

K t qu = 0x0324 804 ngh a l 201* 4


V d 6:
void main()
{ unsigned char x1, x2 ;
printf ( nh p 1 s hex < = ff v s bit : );
scanf ( %x %d , &x1, &x2);
printf ( %02x >> %d = %02x \n, x1, x2, x1>> x2);
}
Ch : Trong php dch ph i C l m theo 2 c ch kh c nhau ty thuc v o

27

K thu t l p tr nh

ki u d li u ca to n h ng b n tr i.
- N u to n h ng b n tr i ki u unsigned th php dch s i n 0 v o c c bit
b n tr i.
- N u to n h ng b n tr i ki u signed th php dch s i n bit d u v o c c
bit b n tr i
V d 7: unsigned int num;
num = 39470; // 9A2E hexa
1 0 0 1
num =
num >> 2 9867 = 0x268B
=
0 0 1 0
0
V d 8 : int num;
num = -26066

1 0 1 0

0 0 1 0

1 1 1 0

0 1 1 0

1 0 0 0

1 0 1 1

// 9A2E hexa

1 0 1 0 0 0 1 0
num =
1 0 0 1
num >> 2 -6517 = 0xE68B
=
1 1 1 0
0 1 1 0 1 0 0 0
1
V d 8: Chng tr nh i s hex ra s nh ph n :
#include <stdio.h>
#include <conio.h>
void main()
{ int num;
unsigned int mask;
clrscr();
printf ("Chuong trinh doi so hexa sang nhi phan\n");
printf ("Nhap vao so hexa :");
scanf("%x",&num);
mask = 0x8000;
printf("\n Dang nhi phan cua so %x la ",num);
for (int j=1; j<=16; j++)
{ printf("%d",mask & num?1:0);
if (j==4 || j==8 || j==12) printf("-");
mask >>=1;
}
getch();
}

1 1 1 0
1 0 1 1

K thu t l p tr nh

28

V d 9: Chng tr nh m y t nh bitwise
y l chng tr nh gi l p mt m y t nh thc hi n c c to n t bitwise.
#define TRUE 1
main()
{ char op[10];
int x1, x2;
while (TRUE)
{ printf (\n \n Cho bi u thc ( vd ffoo & f11) : );
printf (\n);
switch ( op[0])
{ case &:
pbin (x1); printf (& (and) \n );
pbin (x2);
pline (); pbin (x1 & x2);
break;
case |:
pbin (x1); printf (| \n );
pbin (x2);
pline (); pbin (x1 | x2);
break;
case ^:
pbin (x1); printf (^ \n);
pbin (x2);
pline (); pbin (x1 ^ x2);
break;
case >:
pbin (x1); printf ( >>); printf (%d \n ,x2);
pline (); pbin (x1 >> x2);
break;
case <:
pbin (x1); printf (<<); printf (%d \n, x2);
pline (); pbin (x1 << x2);
break;
case ~:
pbin (x1); printf (~ \n);
pline (); pbin (~ x1);
break;
default : printf (To n t khng hp l /n );
}
}

29

K thu t l p tr nh

}
pbin (num)
int num;
{ unsigned int mask;
int j, bit;
mask = 0x8000;
printf (%04x, num);
for(j=0; j<16; j++)
{ bit = ( mask & num ) ? 1:0;
printf (%d, bit);
if (j= = 7) printf (- -);
mask >> = 1;
}
printf (- -);
mask >> 1;
}
pline ()
{ printf (- - - - - - - - \n);
}
* S chuy n ki u bt buc:
Trong C c 2 trng hp chuy n ki u: chuy n ki u t ng v chuy n
ki u b t buc.
Chuy n ki u b t buc: c p dng khi chuy n ki u t ng khng c.
C php:

(Type) bi u thc

V d : d = (float) (f - 32)
int a= 100, b=6;
double f;
f =a/b
// k t qu f=16
f= (double) a/ (double)b // k t qu f= 100.0 / 6.0= 16.666.
* Mc u ti n ca cc php ton:
u ti n

Php ton

Th t k t hp

()
[]
! ~ ++ - - (type) * & size of

2
3
4
5

/
+

<<

>>

30

K thu t l p tr nh

<

<=

>

==

>=
!=

&

10

11

&&

12

||

13

14
=
+=
-=
..

V d 1: 3/4 * 6
#
3*6 /4
0 *6
18 /4
0
4
#
(float) (2/4)
V d 2: (float) 2 /4
2.0 /4
(float) 0
0.5
0.0
I.6. Chui
I.6.1. nh ngh a :Chui l mt m ng m c c ph n t ca n c ki u k t.
Khai b o mt chui k t cha ti a 49 k t
char chui[50];
* Lu : T t c c c chui u c k t thc b ng k t NULL (\0). Do ,
n u chui d i 50 th ta ch c th cha ti a 49 k t.
I.6.2. Khi ng tr:
char chui[ ] = {A, N, H, \0};
char chui[ ] = "ANH";
I.6.3. Nhp / xut chui:
a. Nhp chui:
gets (chui)
b. Xut chui:
puts (chui)
Ch :
- Khi nh p chui th khng c dng h m scanf v h m scanf khng ch p
nh n kho ng tr ng.
V d: scanf(%s, chui);// ta nh p v o Nguy n V n i th

K thu t l p tr nh

31

// chui = Nguy n v h m scanf c t kho ng tr ng


- Khi dng h m gets trong chng tr nh th khng n n dng h m scanf
b t k u d r ng dng h m scanf nh p s m ta n n dng h m gets v h m
atoi, atof nh p s.
V :
scanf(%d, &n);
// ta nh p s 5
gets (chui);
// lc n y chui = (chui rng)
I.6.4. Hm chuy n i s sang chui v ngc li
sint = atoi (chuis) // chuy n chui s sang s nguy n
sf = atof (chuis)
// chuy n chui s sang s thc
* Hai h m n y n m trong < stdlib .h >
I.6.5. Cc hm v chui: (# include < string. h> )
- int strlen(S) : tr v chi u d i chui S.
- int strcmp(S1, S2): so s nh chui S1 vi S2. N u chui S1 ging S2 k t
qu b ng 0. N u chui S1< S2 k t qu l m, n u chui S1> S2 k t qu > 0.
- int stricmp(S1, S2): so s nh chui S1, S2 khng ph n bi t ch thng
hay ch hoa
- int strncmp(S1, S2, n): ch so s nh n k t u ca 2 chui S1, S2 vi
nhau.
- int strnicmp(S1, S2, n): ch so s nh n k t u ca 2 chui S1, S2 vi
nhau, khng ph n bi t ch thng, ch hoa
- strcpy(dest, source): chp chui t ngun source sang ch dest
V d: char string[10];
char *str1 = "abcdefghi";
strcpy(string, str1);
printf("%s\n", string); // "abcdefghi"
- strncpy(dest, source, n): chp chui t ngun sang ch vi nhi u nh t
l n k t.
V d:
char string[10];
char *str1 = "abcdefghi";
strncpy(string, str1, 3);
// string = "abcx1zwe12"
string[3] = '\0';
// t k t k t thc chui v o cui chui.
printf("%s\n", string);
// "abc"
- strcat(dest, src): ni chui src v o sau chui dest. Chi u d i ca chui
k t qu b ng strlen(dest) + strlen(src)

32

K thu t l p tr nh

V d :
char destination[25];
char *blank = " ", *c = "C++", *turbo = "Turbo";
strcpy(destination, turbo); // destination = "Turbo"
strcat(destination, blank); // destination = "Turbo "
strcat(destination, c);
// destination = "Turbo C++"
- strncat(dest, src, n): ni nhi u nh t l n k t ca src v o cui chui
dest, sau th m k t null v o cui chui k t qu .
V d:
char destination[25];
char *source = " States";
strcpy(destination, "United");
strncat(destination, source, 6);
printf("%s\n", destination); // destination = "United State"
- char * strchr(s, ch): tr v a ch ca k t ch u ti n c trong chui
S; n u khng c th tr v NULL (thng dng l y h)
V d:
char string[15];
char *ptr, c = 'r';
strcpy(string, "This is a string");
ptr = strchr(string, c);
if (ptr)
printf("K t %c v tr : %d\n", c, ptr-string);
else
printf("Khng t m th y k t %c\n",c);
- char * strstr(S1, S2): tr v v tr ca chui S2 trong chui S1; n u S2
khng c trong S1 th h m strstr tr v tr NULL.
I.6.6. Mng cc chui
*Khai bo: Khai b o bi n ds cha ti a 50 chui k t, mi chui k t c
ti a 30 k t.
char ds[50 ] [30];
Ch :
- Khng n n g n chui vi chui (s1= s2) m ph i dng h m
strcpy(S1,S2)
- Khng c so s nh 2 chui b ng c c to n t quan h (S1== S2,
S1>S2, S1>= S2), m ph i dng h m strcmp(S1,S2).

K thu t l p tr nh

33

V d : Vi t chng tr nh t m ki m 1 t trong 1 c u
# include < string.h>
# include < stdio.h>
void main ()
{ char cau[80], t[7], *ptr;
printf(Nh p c u
:);
gets(c u);
printf(Nh p t :);
gets(t);
ptr = strstr(c u, t);
if (ptr == NULL) printf(Khng c t);
else printf(c t);
}
II. Cc cu trc iu khin trong C:
Ngn ng C l ngn ng l p tr nh c p cao c c u trc, gm: c u trc tu n t,
chn, v l p.
II.1 Cu trc tun t (Sequence) :
C c l nh trong chng tr nh c thc hi n tu n t t l nh n y n l nh
kh c cho n khi h t chng tr nh.
V du : Vi t chng tr nh t nh v in ra di n t ch ca hai ng trn b n k nh
l n lt l 3m v 4.5m cng vi hi u s ca 2 di n t ch.
#define PI 3.14159
#include <stdio.h>
#include <conio.h>
void main()
{
float r1, r2, hieuso;
clrscr();
printf("\nCHUONG TRINH TINH DIEN TICH 2 HINH TRON VA HIEU SO\n");
printf("Ban kinh hinh tron thu nhat : ");
scanf("%f",&r1);
printf("Ban kinh hinh tron thu hai : ");
scanf("%f",&r2);
printf ("Dien tich hinh tron 1 = %.2f\n",PI*r1*r1);

34

K thu t l p tr nh

printf ("Dien tich hinh tron 2 = %.2f\n",PI*r2*r2);


hieuso = PI*r1*r1 - PI*r2*r2;
printf ("Hieu so dien tich 2 hinh tron = %.2f\n",hieuso);
getch();
}
II.2. Cu trc chn
K hi u : k l bi u thc Logic
S1, S2 l c c ph t bi u hay 1 nhm c c ph t bi u (l nh)
II.2.1. L nh if else:
C php:
if (k) S1;
K

NO

YES

S1

if (k) S1;
else S2;

K
NO

S2

Ch : C c l nh if else lng nhau


if (k1) S1;
else if (k2) S2;
else if (k3) S3;
else S4;
V d 1: T m max(a,b,c)

YES

S1

K thu t l p tr nh

35

if (a>b)
if (a>c) max=a;
else max=c;
else if (b>c) max =b;
else max= c;
V d 2: T nh h m f(x) :
, n u -2 < = x< 2
f(x) = x2
4
,
x>=2
if (x>=-2 && x<2)
fx= x*x;
else if (x>=2)
fx= 4;
else { printf("\n Khong xac dinh") ; exit(0) ;}
II.2.2. L nh chn la: switch_case
C php:
switch (bi u thc)
{ case h ng 1: S1;
case h ng 2: S2; break;
.
.
.
case h ng 3: Sn; break;
default: S0;
}
Cch hot ng:
- (bi uthc) c k t qu nguy n
- H ng: k t, s nguy n, bi u thc c s nguy n
- N u k t qu b ng h ng I n o th n s l m l nh Si v tu n t thc hi n
h t c c l nh di cho n khi h t l nh switch.
- Mun ng t s tu n t tr n th ph i dng l nh break.
V d: Nh p 1 k t s d ng hex i ra s th p ph n
#include <stdio.h>
#include <conio.h>
void main()

K thu t l p tr nh

{
unsignedchar ch;
int k;
clrscr();
printf("Nhap 1 ky tu so hex : ");
ch=getche();
switch (ch)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': k=ch-'0'; break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':k=ch-'A'+10; break;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f': k= ch-'a'+10; break;
default: k=0;
}
printf ("\nSo thap phan cua ky tu hexa %c la %d ",ch,k);
getch();
}
V d : Vi t chng tr nh t o 1 m y t nh c 4 php to n + , - , * , /
#include <stdio.h>
#include <conio.h>
void main()
{

36

37

K thu t l p tr nh

float num1, num2;


char op;
clrscr();
printf ("Go vao so, toan tu, so \n");
scanf("%f %c %f", &num1, &op, &num2);
switch (op)
{
case '+': printf("= %f",num1+num2);
break;
case '-': printf("= %f",num1-num2);
break;
case '*': printf("= %f",num1*num2);
break;
case '/': printf("= %f",num1/num2);
break;
default : printf("To n t l , khng bi t");
}
}
II.3. Cu trc lp
II.3.1. L nh while:
C php:
While (bt)
S;

NO

YES

Ch : Trong ph n th n l nh ph i c bi n i u khi n vng l p.


V d 1: Vi t chng tr nh in ra b ng m ASCII
void main ()
{ int n=0;
while (n <= 255)

38

K thu t l p tr nh

{ printf(%c c m ASCII l %d, n, n);


n ++
}
}
V d 2: Nh p mt chui k t, v k t thc nh p b ng ESC
#define ESC \ 0x1b
#include <stdio.h>
#include <conio.h>
void main()
{ char c;
while (1)
if ((c = getche() ) = ESC ) break;
}
V d 3: Vi t chng tr nh in b ng cu chng
void main ()
{ int a, b;
b = 1;
while (b < = 9)
{ a = 2;
while (a < = 9)
{ printf(%d * %d = %d \t, a, b, a*b);
a++;
}
b ++;
printf(\n);
}
}
II.3.2. L nh do while:
C php:
do
S

S
while (bt);
Yes

V d 1: Vi t chng tr nh in b ng m ASCII
#include <stdio.h>

k
No

K thu t l p tr nh

main ()
{ int n=0;
do
{ printf(%c c m ASCII %d\n, n, n);
n ++;
} while (n <= 255);
}
II.3.3. L nh for:
C php:
for ([bt_khi ng]; [bt_k]; [bt_l p])
S;
V d 1: L p l nh S t 1 n 10
for (int I=1; I== 10; I++) sai
S;
for (int I=1; I<= 10; I++) ng
S;.
V d 2: for (; ;)
{ c = getch()
if (c == ESC) break;
}
So s nh vng l p while - for:
bt_khi ng;
for ( bt_khi ng; bt_k; bt_l p)
while (Bi uThc_K)
S;
{
S;
BT_l p;
}
V d 3: Vi t chng tr nh in ra b ng cu chng b ng vng for
void main ()
{ int a;
for (a=2; a<= 9; a++)
{ for (b =1; b <= 9; b++)
printf(%d* %d = %d \t, a, b, a*b);
printf(\n);
}
}
V d 4: Vi t chng tr nh t nh n giai tha

39

K thu t l p tr nh

40

void main ()
{ long gt = 1;
for (int i =1; i<= n; i++)
gt = gt * i;
printf(%d! = %u \n, n, gt);
}
V d 5: Vi t chng tr nh t nh bi u thc:
(1 + 1/12 ) * (1 + 1/22 ) *......... (1 + 1/ n2 )
void main ()
{ int i, n;
float S;
printf(Nh p s :);
scanf(%d, &n);
S = 1;
for (i= 1;i<= n; i++)
S = S*(1+1.0 / (i*i));
printf(\nKet qua = %f, S)
}
* Pht bi u break, continue, goto:
1. Break:
L nh break cho php tho t ra sm khi vng l p ( whiledo , for, dowhile),
l nh switch.
2. L nh continue:
L nh continue ch dng trong vng l p l m cho chng tr nh nh y t t v
i u ki n ki m tra ca vng l p b t u mt vng l p mi.
V d: Vi t chng tr nh nh p mt c u ch thng k t thc b ng d u
ch m, xu t ra b ng ch hoa
void main ()
{ char ch;
while (1)
{ ch = getch ();
if ((ch> = a) && (ch< = z))
printf(%c, ch - a + A);
if (ch == ) continue;
if (ch == .) break;
}

K thu t l p tr nh

41

}
3. L nh goto: dng chuy n i u khi n chng tr nh v mt v tr n o .
C php: Goto nh n;
L nh goto s chuy n i u khi n chng tr nh ngay l p tc v v tr t
nh n.
V d:
Again:
;
.
.
goto Again;

B i t p:
1. Vi t chng tr nh t nh di n t ch
- H nh vung
- H nh thang
- Tam gi c thng
- Tam gi c vung
- H nh trn
2. T nh kho ng c ch mt i m (X0, Y0) ti mt ng th ng Ax + By + C = 0

S=

Ax 0 + By 0 + C
, nh p A, B, C, X0, Y0
2
2
A +B

3. Cho 3 s thc x, y, z. T m
a. Max(x+y+z, x*y*z)
b. Min2 ((x+y+z) / 2, x*y*z) +1
4. Vi t chng tr nh t m s ln nh t trong 3 s nguy n a,b, c
5. Gi i phng tr nh b c 2 Ax2+Bx+C = 0 tr n trng s thc.
6. Vi t chng tr nh t nh di n t ch h nh trn, bi t b n k nh r dng; Chng
tr nh c ki m tra s li u nh p v o, n u r <=0 th chng tr nh b o li v b t
nh p l i.
7. Vi t chng tr nh nh p s th p lc ph n in ra s nh ph n, c 4 s th c ch
mt kho ng tr ng.
8. Vi t chng tr nh t o 1 m y t nh gm c c php to n sau : + , - , * , / , ^ (ax
vi x nguy n dng), @ (ex )

K thu t l p tr nh

42

9. Vi t chng tr nh ki m tra 1 bit b t k ca s b ng 0 hay 1


10. Vi t chng tr nh t nh k t qu ca mt s sau khi dch ph i ho c dch tr i n
l n.
11. m s l n xu t hi n ca t mt trong 1 c u
12. Thay th 1 t trong 1 c u b ng 1 t kh c.
13. Nh p h t n, t ch hoten ra l m 2 ph n h v t n ri ng.
14. Vi t chng tr nh i c c k t u ca c c t ra ch in, c c k t cn l i ra

ch thng.
15. Vi t chng tr nh cho php ta ki m tra mt password l ng hay sai (nh p

ti a password 3 l n).
16. Cho chui s, vi t chng tr nh di chuy n ch t b n tr i qua b n ph i ca

m n h nh t i dng 5. Qu tr nh di chuy n dng l i khi ta n ph m ESC.


17. B n h y vi t chng tr nh t nh gi tr tng cng ca mt s n ph m c k c
thu , bi t r ng t su t thu l 13.6% t nh tr n gi gc. Gi gc ca s n ph m
c c v o, v c n in ra:
- Ti n thu
- Gi c thu
18. Trong mt k thi cui kha, c c hc vi n ph i thi 4 mn : mn I h s 2,
mn II h s 4, mn III h s 1, mn IV h s 2, i m c c mn cho ti a l
10 i m. Vi t chng tr nh nh p i m ca 4 mn v t nh i m trung b nh.
19. Mt ngi b n ru b n N chai ru c n gi l P. N u tng s ti n vt
qu 5000000 th vi c chuy n ch l mi n ph , n u khng ph chuy n ch
thng c t nh b ng 1% tng tr gi h ng. Vi t chng tr nh nh p v o N, P.
In ra c c chi ti t Tng tr gi h ng, ti n chuy n ch, v tng s ti n ph i tr .
20. Mt sinh vi n d tuy n c c c chi ti t sau : h t n, i m L1 ca l n 1, i m
L2 ca l n 2, i m thi cui k CK. Vi t chng tr nh x c nh xem mt sinh
vi n c c tuy n hay b lo i, bi t r ng s c tuy n n u i m c t nh
theo cng thc sau ln hn hay b ng 7 : Max( (L1+L2+CK)/3, CK).
21. Vi t chng tr nh cho bi t ti n lng h ng ng y ca mt ngi gi tr . C ch
t nh l 15000/gi cho mi gi trc 14 gi v 25000 /gi cho mi gi sau
14 gi. Gi b t u v gi k t thc cng vi c c nh p t b n ph m.
22. Cho 3 s thc x, y z
a. Tn t i hay khng mt tam gi c c 3 c nh c d i x, y, z ?
b. N u l tam gi c th n vung, c n, u hay thng
23. Gi i h phng tr nh b c nh t:

K thu t l p tr nh

43

ax+by = c
ax+by = c

Hng d n:
D=

a
b
= ab - ab
a
b
Dx=
c
b
= cb - cb
c
b
Dy=
a
c
= ac - ac
a
c
if D!= 0
x= Dx/D; y= Dy/ D
else if (( Dx != 0) | | ( Dy != 0))
pt v nghi m
else pt v nh
24. Gi i h phng tr nh 3 n s b c nh t

a 1 x + b 1 y + c1 z = d 1
a 2 x + b 2 y + c2 z = d 2
a 3 x + b 3 y + c3 z = d 3

25. Vi t chng tr nh gi i phng tr nh trng phng ax4 + bx2 + c = 0


26. Ngi ta mun l p ha n cho kh ch h ng ca Cng ty i n lc. Ch s u
v ch s cui k s c cho bi t. Bi t r ng bi u gi c t nh ty theo i n
n ng ti u th.
- N u i n n ng ti u th nh hn 100Kwh, gi mi Kwh l 500.
- N u i n n ng ti u th t 100Kwh tr l n, th mi Kwh di ra s c t nh
gi l 800
- Ph khu vc l 5000 cho mi kh ch h ng. Vi t chng tr nh t nh ti n
ph i tr tng cng gm ti n i n, v ph khu vc
27. Bi t 2 s X, Y bi u di n thi gian t nh theo gi y. Ngi ta mun vi t chng
tr nh :
- c 2 s n y v in ra tng ca chng
- Chuy n c c s n y v tng ra d ng gi, ph t, gi y ca chng ri in ra.
Ki m xem k t qu ca 2 c ch t nh c nh nhau khng?
28. Vi t chng tr nh in b ng cu chng t 2 9 theo h ng ngang
29. In tam gi c *, h nh ch nh t *, rng - c
30. V lu v vi t chng tr nh t nh :
a. 1+2+...+n

K thu t l p tr nh

44

b. 1+3+5+...+2n-1
c. 2+4+6+...+2n
d. 12+ 22+ 32+...+n2
e. 1/1+ 1/2+ 1/3+...+ 1/n
f. 2+4+8+...+2n
g. 1+ 1/22 + 1/32 +....+ 1/n2
31. Cho epsilon = 0.000001, x c nh c c tng sau y sao cho s h ng cui
cng ca tng l khng ng k (s h ng cui cng < epsilon )
a. 1/1+ 1/2+ 1/3+1/4+.....
b. 1+ 1/22 + 1/32 +....+...
32. Vi t chng tr nh in ra b ng m ASCII, 16 k t tr n 1 dng.
33. V lu v vi t chng tr nh :
a. Xt mt s c ph i l s nguy n t hay khng ?
b. In tr n m n h nh 100 s nguy n t u ti n
34. Vi t chng tr nh cho php mt k t ng u nhi n ri tr n m n h nh. N u
ngi s dng khng kp n ph m tng ng v ch m y m n h nh th
thua cuc.
35. Cho h m Fibonacci:
Fn =

1 ; n=0,1
Fn-1 + Fn-2 ; n>=2

a. T m Fn, vi n do ta nh p
b. In ra N ph n t u ti n ca d y Fibonacci
36. Vi t chng tr nh c v o s nguy n N v in ra 1*2*3*..*N cho n khi N <=0.
37. Cho 1 d y gm mt tri u t 32 bit, h y m s bit 1 trong mi t.
38. Vi t chng tr nh o n s : ngi chi s o n 1 s trong ph m vi t 0 n
100, ti a 5 l n. Chng tr nh ki m tra k t qu v xu t thng b o hng d n:
- S b n o n ln hn
- S b n o n nh hn
- B n o n ng
- M y th ng cuc

K thu t l p tr nh

45

III. Hm - quy:
III.1. Hm:
III.1.1. Mc ch: H m l mt chng tr nh con ca chng tr nh ch nh,
vi c c mc ch sau:
* Tr nh vi c l p i l p l i c c o n chng tr nh ging nhau, nh , ta s
ti t ki m lc l p tr nh.
* T chc chng tr nh: Dng h m ta s ph n m nh chng tr nh th nh
nhng khi nh c l p, mi khi l mt h m thc hi n mt cng vi c n o .
Tng h m s c l p tr nh, ki m tra ho n ch nh; Sau , ta k t l i t o chng
tr nh ho n ch nh. Nh v y, chng tr nh v sau d hi u v d sa.
* T nh c l p: cho php h m c l p vi chng tr nh ch nh. V d h m
c nhng bi n cc b m chng tr nh ch nh v c c h m kh c khng th ng
ti. Do , n u ta c khai b o c c bi n trng t n vi c c h m kh c th cng
khng s nh hng ti c c bi n trng t n .
Ch :
- C khng cho php c c h m lng nhau ngh a l c c h m u ngang c p
nhau (c th gi l n nhau).
- C khng ph n bi t th tc hay h m, m ch quan t m n k t qu tr v
ca h m. N u h m khng tr v k t qu g c th c th xem l th tc.
V d : V h nh ch nh t c b ng d u *:
#include <stdio.h>
#include <conio.h>
void ve_hcn(int d,int r)
// khai b o void cho bi t h m khng tr v tr
n o c
{ int i,j ;
// i, j l 2 bi n cc b trong h m ve_hcn
for (i=1;i<=r;i++)
{
for (j=1;j<=d; ++j)
printf("*");
printf("\n");
}
}
void main()
{ int d=20, r=5;
clrscr();
ve_hcn(d,r); // li gi h m
getch();
}

K thu t l p tr nh

46

III.1.2. C php nh ngh a hm


C php:
Ki u t nh m (ds i s)
{ Khai b o bi n cc b;
l nh;
[ return (expr);]
}
- Ki u: L k t qu tr v ca h m. N u khng ghi ki u, C s t hi u l ki u
int. N u khng mun c k t qu tr v th ghi ki u void.
- Danh sch i s: Li t k c c i s v ki u ca i s gi n h m, c ch
nhau bi d u ','. N u khng c i s ta ch c n ghi()
- L nh return: c c c d ng sau:
return;
return (expr);
return expr;
V d: H m chuy n ch thng sang ch hoa
#include <stdio.h>
#include <conio.h>
Get_upper(char ch)
{ return (ch >='a' && ch <='z')? ch-'a'+'A':ch;
}
void main()
{ char ch;
printf("\nNhap vao ky tu bat ky ");
ch=getche();
printf("\nKy tu %c qua ham Get_upper tro thanh %c",ch,Get_upper(ch));
getch();
}
Lu :
- H n ch ca l nh return l ch tr v mt k t qu .
- L nh return khng nh t thi t ph i cui h m. N c th xu t hi n b t
k ni n o trong h m. Khi g p l nh return, quy n i u khi n s chuy n
ngay v chng tr nh gi.
III.1.3. Cc loi truy n i s
a. Truy n theo tr

47

K thu t l p tr nh

#include <stdio.h>
#include <conio.h>
int max (int a,int b)
{ int m= a>b?a:b;
a=a*100;
b=b*100;
return m;
}
void main()
{ int a,b,c;
clrscr();
printf("\nChuong trinh tim Max(a,b)\n");
printf("Nhap a b : ");
scanf("%d %d",&a,&b);
c=max(a,b);
printf("\nGia tri lon nhat =%d",c);
printf("\nGia tri a =%d",a);
printf("\nGia tri b =%d",b);
getch();
}
Gi s ta ch y chng tr nh tr n:
Nhap a b : 12 24
Gia tri lon nhat =24
Gia tri a =12
Gia tri b=24
Nh n xt:
- Ta nh n th y r ng gi tr hai bi n a, b trc v sau khi v o h m max l
khng thay i (m c d trong h m max, c hai bi n a v b u thay i); l
c ch ca s truy n i s theo tr.
Li gi hm:

t nhm (ds isthc);

- N u truy n i s theo tr th i s thc c th l bi n, ho c c th l bi u


thc.
V d : c = max(1000,b);
b. Truy n theo a ch : i s thc l a ch ca bi n
#include <stdio.h>
#include <conio.h>

48

K thu t l p tr nh

max (int &a,int b)


{ int m= a>b? a : b;
a=a *100;
b=b*100;
return m;
}
void main()
{ int a,b,c;
clrscr();
printf("\nChuong trinh tim Max(a,b)\n");
printf("Nhap a b : ");
scanf("%d %d",&a,&b);
c=max(a,b);
// a l tham s thc bi n
printf("\nGia tri lon nhat =%d",c);
printf("\nGia tri a =%d",a);
printf("\nGia tri b =%d",b);
getch();
}
Gi s ta ch y chng tr nh tr n:
Nhap a b : 12 24
Gia tri lon nhat =24
Gia tri a =1200
Gia tri b=24
Nh n xt:
- Ta nh n th y r ng gi tr bi n a trc v sau khi v o h m max thay i;
l c ch ca s truy n i s theo a ch .
Li gi hm:

t nhm (t nbi n);

- N u truy n i s theo a ch th tham s thc b t buc ph i l mt t n bi n.


V d : c = max(1000,b); l sai
V d: Vi t h m giaoho n ho n i gi tr ca 2 bi n nguy n a,b.
void giaohoan (int &a, int &b)
{ int tam;
tam = a;
a = b;
b = tam;
}

49

K thu t l p tr nh

void main()
{ int a,b;
printf ("a, b = ");
scanf ("%d %d", &a, &b);
giaohoan(a, b);
}
gih m (mang)
* Truy n i s l m ng
h m (ki u mang[]) ho c h m(ki u *mang)
V d : Cng th m mt h ng s v o m ng t n l dayso.
#define SIZE 5
// d y s c 5 s
#include <stdio.h>
#include <conio.h>
void add_const(int *a, int n, int con) // int *a int a[]
{ for (int i=0; i<n; i++)
*a = *(a++) + con;
}
void main()
{ int dayso [SIZE] = {3,5,7,9,11};
int konst = 10;
add_const(dayso, SIZE, konst);
printf("\nDay so sau khi cong them hang so :");
for (int i=0; i<SIZE; i++)
printf("%d ", *(dayso+i)); // *(dayso+i) dayso[i]
getch();
}
III.1.4. Khai bo nguy n mu ca hm
- Khai b o h m theo nguy n m u i hi ph i khai b o ki u d li u ca i
s n m trong nh ngh a h m ch khng t chng tr n c c dng ri ng.
- C khng nh t thi t ph i khai b o h m theo nguy n m u. Tuy nhi n, n n
c v n cho php chng tr nh dch ph t hi n c li do khng ng ki u d li u
gia tr truy n n h m v tr m h m mong mun.
V d :
float dinhthuc (float a, float b, float c, float d)
{ return (a*d- b*c);
}
void main()

50

K thu t l p tr nh

{ float a ,b, a1, b1;


printf(Nhap a,b,a1,b1:);
scanf(%f %f %f %f,&a,&b,&a1,&b1);
printf(Dinh thuc = %f,dinhthuc(a,b,a1,b1);
getch();
}
III.1.5. Phm vi tn ti ca bi n:
a. Bi n ton cc: l bi n c khai b o ngo i c c h m ( k c h m main).
N c php truy nh p n t t t c c c h m trong sut thi gian chng tr nh
ho t ng.
V d : Khai b o ngo i h m main
Ki u t n bi n; // bi n to n cc
void main()
{
}
b. Bi n cc b: l bi n c khai b o trong c c h m, k c trong h m
main. N khng cho php c c h m kh c truy nh p n n. N tn t i
trong thi gian sng ca h m cha n.
void main()
{ ki u
t n bi n; bi n cc b trong h m main()
}
c. Bi n ngoi : l bi n m c c h m c th truy xu t ti m khng ph i
ph n phi b nh. N c dng c c h m tr n c c t p tin kh c nhau
li n k t l i.
External Ki u t n bi n;
void main()
{
}
d. Bi n t nh : l mt bi n cc b ca mt h m nhng v n gi gi tr ca
l n gi h m cui cng
void main()
{ static
Ki u
t nbi n;
}
e. Bi n thanh ghi : l mt bi n s dng c c thanh ghi ca CPU t ng
tc truy xu t
register

Ki u t nbi n ;

51

K thu t l p tr nh

III.1.6. Cc dn hng ti n x l
III.1.6.1. #define
a. nh ngh a hng:
#define
V d: #define
#define
#define
#define

t n h ng

gi tr

PI
MAX
THONGBAO
khoangtrang

3.14
100
H t Gi "

b. nh ngh a Macro:
#define

t nmacro (i s ) thao t c

sqr (x)
x*x
V d : #define
#define
sum (x,y) x+y
a = b * sum (x,y); // a = b * x+y;
#define
sum (x,y) (x+y)
a = b * sum (x,y); // a = b * (x+y);
*Ch : Trong c c thao t c Macro n n s dng c c d u ngo c tr nh d n
ra mt k t qu sai
max (a,b) ((a) > (b) ? (a) : (b))
V d: #define
#define
ho nv (a,b) { int t m =a; a= b; b= t m;}
#define
error (n)
printf ( error %d, n)
Di y mt s Macro ph n t ch k t, t t c u trong <ctype. h>. C c
macro n y tr v tr kh c 0 n u th nh cng. i vi mi macro, th nh cng c
nh ngh a nh sau:
Macro
isalpha (c)
isupper (c)
islower (c)
isdigit (c)
isxdigit (c)
iscntrl(c)
ispace (c)
Khai b o: char c;

K t
c l k t a z, A Z
c l k t A Z
c l k t a z
c l k s 0 9
0 9, A F, a z
c l k t xa ho c k t i u khi n
(0x7F ho c 0x00 n 0x1F)
c l k t space, tab, carriage return,
new line (0x09 n 0x0D, 0x20)

52

K thu t l p tr nh

* Phn bi t Macro vi hm:


- Dng Macro: truy xu t nhanh, tn b nh.
- Dng h m: ngc l i
III.1.6.2. #include
L ti n x l dng k t ni t p trung khai b o trong include vi t p tin
ang l m vi c.
# include < t n t p tin.h>
# include t n t p tin.h
D ng < > : i t m t p tin.h trong th mc c ch nh trong Include
Directories.
D ng : t m t p tin.h trong th mc Source Directories, n u khng c,
n i t m trong th mc c ch nh trong Include Directories.
III.2. qui (Recursion):
III.2.1. Khi ni m: qui l 1 cng c r t thng dng trong khoa hc
m y t nh v trong to n hc gi i quy t c c v n . Trc h t, chng ta h y
kh o s t th n o l mt v n c qui qua v d sau:
T nh S(n) = 1 +2 +3 +4+ ...+n
Ta nh n th y r ng, cng thc tr n c th di n t l i nh sau:
S(n) = S(n-1) + n, v
S(n-1) = S(n-2) + (n-1)
.....
S(2) = S(1) + 2
S(1) = 1
Nh v y, mt vn c qui l vn c nh ngh a li bng ch nh n.
t nh S(n): ta c k t qu ca S(1), thay n v o S(2), c S(2) ta thay n v o
S(3) ...., c nh v y c S(n-1) ta s t nh c S(n)
*Mt s v d
1. Hm giai tha:
n!

=
=

{
{

1*2*3*......*(n-1)*n , n>0
1

, n=0

n*(n-1)!

, n>0

, n=0

53

K thu t l p tr nh

Nhn xt:
- Theo cng thc tr n, ta nh n th y trong nh ngh a ca n giai tha (n!)
c nh ngh a l i ch nh n n n h m giai tha c qui.
- Vi n >=0 , i u ki n dng t nh h m giai tha l n=1
2. Hm FIBONACCI:
Fn =

1
Fn-1 + Fn-2

; n =0,1
; n>1

- Theo nh ngh a tr n, h m Fibonacci c li gi qui.


- Qu tr nh t nh dng l i khi n= 1
III.2.2. Hm qui trong ngn ng C:
Ngn ng C c trang b c ch gi h m qui. H m qui l h m gi n
ch nh h m mt c ch trc ti p hay gi n ti p.
V d 1: Vi t h m qui t nh S(n) = 1 + 2 + 3 +...+n
#include <stdio.h>
#include <conio.h>
int S(int n)
{ if (n==1)
// i u ki n dng
return 1;
else
// bc qui
return (S(n-1) + n);
}
void main()
{ int n;
printf("\n Nhap n = ");
scanf("%d",&n);
printf("Tong S = 1 + 2 + ...+ %d = %d",n, S(n));
getch();
}
V d 2 : Vi t h m qui t nh h m giai tha n.
long giaithua(int n)
{ return ((n==0) ? 1 : n*giaithua(n-1));
}
III.2.3. Hm qui v Stack:
Mt chng tr nh C thng gm c h m main() v c c h m kh c. Khi ch y
chng tr nh C th h m main() s c gi ch y trc, sau h m main() gi
c c h m kh c, c c h m n y trong khi ch y c th gi c c h m kh c na. Khi

54

K thu t l p tr nh

mt h m c gi, th mt khung k ch ho t ca n c t o ra trong b nh


stack. Khung k ch ho t n y cha c c bi n cc b ca h m v m u tin ho t ng
ca h m. M u tin ho t ng cha a ch tr v ca h m gi n v c c tham s
kh c.
Bi n cc b
M u tin
a ch tr v
ho t ng
Thng s kh c
Khung k ch ho t
Sau khi h m c gi thi h nh xong th chng tr nh s thc hi n ti p
dng l nh a ch tr v ca h m gi n, ng thi xa khung k ch ho t ca
h m khi b nh.

Gi s ta c c ch gi h m trong mt chng tr nh C nh sau:


main()
A()
B()
C()
D()
{ ......
{.....;
{.....;
{......;
{........;
A();
C();
D();
D();
........;
.....;
....;
}
.....;
}
B();
D();
}
....;
}
}
H nh sau y cho ta th y s chi m dng b nh stack khi ch y chng tr nh
C nh m t tr n.
b nh
Stack

A
M

C
A
M

D
C
A
M

C
A
M

A
M

D
A
M

A
M

B
M

D
B
M

B
M

M
thi gian
Tng t vi trng hp h m qui, khi gi qui l n nhau th mt lo t
c c khung k ch ho t s c t o ra v n p v o b nh Stack. C p qui c ng cao
th s khung k ch ho t trong Stack c ng nhi u, do , c kh n ng d n n tr n
Stack (Stack overflow). Trong nhi u trng hp khi l p tr nh, n u c th c ta
n n g qui cho c c b i to n.

K thu t l p tr nh

55

IV. Structure:
C c ki u n gi n t i mt thi i m ch lu gi c mt gi tr duy nh t.
Cn mt bi n ki u m ng dng lu tr c c gi tr cng ki u d li u vi nhau,
ch ng h n nh mt d y s, mt d y c c k t,...Nhng trong thc t , i u n y
v n cha v c c th nh ph n m ta lu gi thng l kh c ki u d li u vi
nhau.
V d : Ta mun lu gi c c thng tin v mt sinh vi n nh sau : MASO,
HO, TEN, NGAYSINH, NOISINH, PHAI, DIACHI, LOP . Vi c c th nh ph n
nh v y, th r r ng c c th nh ph n ca 1 sinh vi n khng th cng ki u m ph i
thuc c c ki u kh c nhau, c th l :
- MASO, HO, TEN : m ng ch
- NGAYSINH : int ng y , th ng , n m ;
- NOISINH : m ng ch
- PHAI
: unsigned int;
- LOP
: m ng ch;
Do , lu tr c c c th nh ph n kh c nhau ca mt i tng ta ph i
s dng mt ki u d li u trong C l Structure. (tng t nh record trong
Pascal)
IV.1. nh ngh a:
Mt bi n c ki u structure c dng lu tr mt i tng c nhi u
th nh ph n. C c th nh ph n c th thuc c c ki u d li u kh c nhau.
IV.2. Khai bo: Mun khai b o ki u hocvien dng lu tr h, t n, i m
mn TOAN,LY,HOA, TB, X p lo i ca mt hc vi n, ta c :
struct hocvien
{
char ho[30];
char ten[7];
float toan, ly, hoa , dtb;
char xeploai[10];
};
- khai b o bi n hv c ki u hocvien :
struct hocvien hv;
- truy xu t ti mt th nh ph n, ta dng d u ch m, v d nh: hv.ho
truy xu t ti h ca hc vi n.
* Khai b o k t hp: va khai b o ki u structure va khai b o bi n c ki u .
struct hocvien

K thu t l p tr nh

56

char ho[30];
char ten[7];
float toan, ly, hoa , dtb;
char xeploai[10];
} hv1, hv2;
// khai b o 2 bi n hv1, hv2 cng ki u hocvien
- Khai b o structure lng nhau:
V d:
void main()
{ struct ngaysinh
{ unsigned int ngay, thang, nam;
};
struct hocvien
{ char ho[30];
char ten[7];
struct ngaysinh ngsinh;
float toan, ly, hoa, dtb;
char xeploai[10];
};
struct hocvien hv;
}
Trong trng hp n y, truy xu t ti th ng sinh ca hc vi n hv, ta vi t
nh sau: hv.ngsinh.thang.
V. FILE:
V.1. File vn bn:
- File v n b n l file c lu tr di d ng ki u k t
C 2 c ch truy xu t theo ki u k t.
- Truy xu t theo tng k t
- Truy xu t theo tng dng
V.1.1. Khai bo tp tin:
Khai b o bi n ki u file:
FILE *fptr
V.1.2. M tp tin:
fptr = fopen (t n file, ki u);
- Trong "t nfile" , ta c th ch nh mt ng d n y nh sau

K thu t l p tr nh

57

"C:\THU\KTLT\VIDU.TXT". H m fopen n u m file th nh cng s tr v mt


con tr file cho t p tin "t n file", v con tr n y c c t gi trong bi n fptr (bi n
ki u FILE).
N u khng c file "t n file" tr n d a th h m fopen s tr v tr NULL
( n u fptr == NULL ngh a l khng c file )
- Ki u: gm c:
r : c ( file ph i c s n, n u khng c file, h m fopen tr v tr
NULL)
w : ghi ( n u c file s xa file c )
a : ni v o cui t p tin
r +: c / ghi, t p tin ph i c s n tr n d a
a+: c, ghi v o cui t p tin, n u tr n d a cha c t p tin th n s c
t o ra.
V d : m s k t trong file VB.TXT.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main()
{ FILE *fptr;
int dem=0;
char ch;
if ((fptr = fopen("VB.txt", "r")) == NULL) // m file c
{
printf("File nay khong the mo\n");
exit(0);
// k t thc chng tr nh, hm exit thuc v stdlib.h
}
while (!feof(fptr))
{ ch=fgetc(fptr);
// c 1 k t trong file fptr ra
dem++;
}
fclose(fptr);
printf("\nSo ky tu trong file VB.TXT =%d",dem);
getch();
}
V.1.3. ng file:
fclose (fptr)

58

K thu t l p tr nh

V.1.4. c / ghi k t: Cho bi n k t charch;


- c k t t t p tin
ch = getc (fptr)
- Ghi k t l n t p tin
putc (ch, fptr)
V d 1: T o 1 file trc ti p t b n ph m. Qu tr nh t o s dng l i khi ta n
ph m Enter.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main()
{ FILE *fptr;
char tenfile[67];
char ch;
clrscr();
printf("Cho biet ten file :");
gets(tenfile);
if ((fptr=fopen(tenfile,"w"))==NULL)
{ printf("Viec tao file co loi\n");
exit(0);
}
while ((ch=getche()) !='\r')
putc(ch,fptr);
fclose(fptr);
}
V d 2: In ni dung t p tin ra m n h nh
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main()
{ FILE *fptr;
char tenfile[67];
char ch;
clrscr();
printf("Cho biet ten file :");
gets(tenfile);
if ((fptr=fopen(tenfile,"r"))==NULL)

// m file mi ghi

K thu t l p tr nh

{ printf("Viec mo file co loi\n");


exit(0);
}
while ((ch=getc(fptr)) !=EOF)
printf("%c",ch);
fclose(fptr);
}

59

K thu t l p tr nh

60

V d 3: Chng tr nh m s t trong file


#include <stdio.h>

#include <conio.h>
#include <stdlib.h>
void main()
{ FILE *fptr;
char tenfile[67];
int ch;
int dem=0, tu=0;
clrscr();
printf("Cho biet ten file :");
gets(tenfile);
if ((fptr=fopen(tenfile,"r"))==NULL) // m file c
{ printf("Viec mo file co loi\n");
exit(0);
}
while ((ch=getc(fptr)) !=EOF)
{ if ((ch>='a' && ch <='z') || (ch>='A' && ch<='Z'))
tu=1;
if ((ch==' ' || ch=='\n' || ch=='\t') && tu)
{ dem++;
tu=0;
}
}
printf("So tu trong file =%d",dem);
fclose(fptr);
}
V.1.5. c / ghi chui k t:
* H m fgets (chui, chi ud i, fptr);
H m fgets c 1 chui k t t trong file fptr v o bi n <chui> vi chi u d i
ti a l <chi ud i>. H m n y tr v NULL khi c h t file
* H m fputs (chui, fptr): ghi 1 chui k t trong <chui> v o file fptr.
H m n y khng t ng th m v o m k t thc chuy n dng mi, do ta
ph i ghi th m m n y v o t p tin b ng l nh fputs ("\n", fptr);
V d 1: Chng tr nh ghi chui l n file, cho n khi chui nh p v o l rng
th k t thc.

K thu t l p tr nh

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
void main()
{ FILE *fptr;
char tenfile[67];
char chuoi[80];
clrscr();
printf("Cho biet ten file :");
gets(tenfile);
if ((fptr=fopen(tenfile,"w"))==NULL)
// t o file mi
{ printf("Viec tao file co loi\n");
exit(0);
}
while (strlen(gets(chuoi)) > 0)
// h m strlen() trong <string.h>
{ fputs(chuoi,fptr);
fputs("\n",fptr);
}
fclose(fptr);
}
V d 2: c c c chui k t t t p tin, v in n tr n m n h nh.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main()
{ FILE *fptr;
char tenfile[67];
char chuoi[81];
clrscr();
printf("Cho biet ten file :");
gets(tenfile);
if ((fptr=fopen(tenfile,"r"))==NULL)
{ printf("Viec tao file co loi\n");
exit(0);
}
while (fgets(chuoi,80,fptr)!= NULL)
printf("%s",chuoi);
fclose(fptr); getch();
}

61

K thu t l p tr nh

62

V.1.6. Xa file: L nh remove xo file c ch nh qua <t nfile>


C php: remove (t n file)
H m remove tr v 0 : xa th nh cng
tr v -1 : c li khi xa file, v lc n y bi n errno c 1 trong
2 gi tr sau:
ENOENT : khng t m th y file mun xa
EACCES : khng cho php xa file m b n ch nh
Lu : File n n ng trc khi xa.
V d: Xa file do ta ch nh.
#include <stdio.h>
void main()
{ char filename[80];
/* prompt for file name to delete */
printf("File muon xoa: ");
gets(filename);
/* delete the file */
if (remove(filename) == 0)
printf("Removed %s.\n",filename);
else
perror("remove"); // in thng b o li m h m remove g y ra
}
V.2. File nh phn (file c cu trc)
File nh ph n l file dng lu tr c c c u trc di d ng struct ho c
union
V.2.1. Khai bo:
FILE * fptr;
V.2.2. M file:
fptr = fopen (t nfile, ki u);
. rb ( b: binary): m ch c
. wb
: ghi. N u file c th xa trc khi m.
. ab
: ni th m; m ghi th m v o cui file, n u file cha c
th t o mi
. rb+
: m file c c p nh t (c/ghi)
. wb+
: t o file mi cho php c/ghi
. ab+
: m ni th m v cui file, cho php c/ghi

63

K thu t l p tr nh

V.2.3. ng file:
fclose (fptr)
V.2.4. c/ghi file: H m fread : c s m u tin(c u trc) trong file fptr
v o <bi n c u trc>.
fread (& bi n cu trc, sizeof (bi n cu trc) , s cu trc, fptr);
H m fread tr v s c u trc c c
H m fwrite ghi d li u trong <bi n c u trc> v o file fptr.
fwrite (&bi n cu trc, sizeof (bi n cu trc) , s cu trc, fptr);
H m fwrite tr v s c u trc ghi c l n file
Ch :
- ki m tra vi c c file ta ki m tra s c u trc c c. N u s c u trc
tr v b ng 0 m ta c n c l 1 c u trc th i u chng t h t file.
* Ghi mt mng cu trc l n file
fwrite(t nm ng, sizeof (t nm ng), 1, fptr);

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


fwrite (&t nm ng[i], sizeof (t nm ng[i] , 1, fptr);
V d 1: Chng tr nh ghi l n file nh ph n
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{ struct hocvien
{ char hoten[30];
int tuoi;
} hv;
FILE *fptr;
char tenfile[67];
char tuoi[3];
printf("Nhap ten file :");
gets(tenfile);
if ((fptr=fopen(tenfile,"wb")) == NULL)
{ printf ("Khong the tao file\n"); exit(0);
}
do
{ printf("Nhap ho ten hoc vien :");

// m file nh ph n ghi

K thu t l p tr nh

64

gets(hv.hoten);
if (strlen(hv.hoten) !=0)
{ printf("Nhap tuoi :");
gets(tuoi);
hv.tuoi = atoi(tuoi);
// macro doi chuoi qua so nguyen
fwrite(&hv, sizeof(hv), 1, fptr) ; // ghi noi dung 1 mau tin trong bien hv
// vao file fptr
}
}
while (strlen(hv.hoten)!=0);
fclose (fptr);
}
V d 2: Ghi d li u m ng v o file nh ph n
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{ struct hocvien
{ char hoten[30];
int tuoi;
} hv;
struct hocvien table[3];
FILE *fptr;
char tenfile[67];
char tuoi[3];
int i=0;
printf("Nhap ten file :");
gets(tenfile);
if ((fptr=fopen(tenfile,"wb")) == NULL)
{ printf ("Khong the tao file\n"); exit(0);
}
do
{ printf("Nhap ho ten hoc vien :");
gets(hv.hoten);
printf("Nhap tuoi :");
gets(tuoi);
hv.tuoi = atoi(tuoi);
// macro doi chuoi qua so nguyen
table[i++]=hv;

K thu t l p tr nh

65

}
while (i<3);
fwrite(table, sizeof(table), 1, fptr) ; // ghi noi dung toan bo hoc vien trong
// table vao file fptr
// ho c for (i=0; i<3; i++)
// fwrite(&table[i], sizeof(table[i]), 1, fptr)
fclose (fptr);
}
V d 3: Chng tr nh c file nh ph n, v in danh s ch hc vi n ra m n
h nh.
// In danh s ch hc vi n ra m n h nh
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void main()
{ struct hocvien
{ char hoten[30];
int tuoi;
} hv;
FILE *fptr;
char tenfile[67];
char tuoi[3];
printf("Nhap ten file :");
gets(tenfile);
if ((fptr=fopen(tenfile,"rb")) == NULL) // M file c
{ printf ("Khong the mo file\n"); exit(0);
}
clrscr();
printf(" Ho va ten
Tuoi");
while (fread(&hv,sizeof(hv),1,fptr) ==1)
{
printf("\n%-20s",hv.hoten);
printf("%3d",hv.tuoi);
}
fclose (fptr);
}
V.2.5. Truy xut tp tin ngu nhi n: (i u khi n con tr t p tin tr n file
nh ph n)

K thu t l p tr nh

66

* Con tr file: Mi t p tin u c con tr file sau khi c m. Con tr file


l con tr ch n tng byte tr n file. Khi c hay ghi d li u tr n t p tin, ta
l m dch chuy n con tr file mt s byte, y ch nh l s byte m ki u d li u
chi m. Khi ng ri m t p tin, con tr file lun u t p tin ; ngo i tr trng
hp ta m b ng ty chn 'a' th con tr file s cui t p tin ghi th m d li u
v o cui t p tin. H m fseek cho php ta di chuy n con tr file n v tr mong
mun.
C php:
int fseek (FILE * fptr, long nbytes, ki u)
+ nbytes : s bytes t nh t v tr ki u cho n v tr c n ti
+ ki u l s nguy n :
ki u = 0 (t nh t u t p tin)
ki u = 1 (t nh t v tr hi n t i)
ki u = 2 (t nh t cui t p tin)
N u fseek tr v 0 ngh a l n di chuy n ti v tr .
Lu : s th t tr n t p tin t nh t 0.
V d: Vi t chng tr nh truy xu t ng u nhi n mt m u tin theo s th t
ca n trong file nh ph n
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void main()
{ struct hocvien
{ char hoten[30];
int tuoi;
} hv;
FILE *fptr;
char tenfile[67];
int stt, sobytes;
printf("Nhap ten file :");
gets(tenfile);
if ((fptr=fopen(tenfile,"rb")) == NULL)
{ printf ("Khong the mo file\n"); exit(0);
}
clrscr();

67

K thu t l p tr nh

printf("Cho biet so thu tu mau tin can di chuyen den :");


scanf("%d",&stt);
sobytes = stt * sizeof(hv);
if (fseek(fptr,sobytes,0)!=0)
{ printf ("Khong the di chuyen con tro file toi vi tri ban chi dinh duoc");
exit(0);
}
fread(&hv,sizeof(hv),1,fptr) ;
printf("\n%-20s",hv.hoten);
printf("%3d",hv.tuoi);
fclose (fptr);
getch();
}
V.3. Pht hi n li khi truy xut tp tin
Ph n ln nhng h m xu t, nh p t p tin chu n khng thng b o r ni dung
ca li. Ch ng h n nh:
- putc () s tr v EOF khi c li ho c cui t p tin
- fgets () s tr v l NULL khi c h t file ho c khi c li
Do , ph t hi n li khi truy xu t t p tin, ta dng macro ferror (FILE *fptr)
int

ferror (file * ptr)

Macro ferror tr v mt tr kh c 0 n u ph t hi n ra li tr n file fptr.


* xu t c u thng b o li ta dng h m perror ()
void perror (const char * str)
vi str : chui k t cha c u thng b o
* Hai h m n y thng c s dng ngay sau khi s dng c c h m c /
ghi file
V d: fwrite (&table, sizeof (table), 1, fptr);
if (ferror (fptr) != 0)
{ perror (Loi ghi du lieu);
exit (0);
}
V d :
#include <stdio.h>
void main()
{
FILE *fp;

K thu t l p tr nh

68

fp = fopen("perror.dat", "r");
if (!fp)
perror("Khng th m file c");
}
Khi ch y chng tr nh n y, n u tr n d a cha c t p tin perror.dat th s hi n
thng b o li: Khng th m file c: No such file or directory.

B i t p
1. T o t p tin di n t ch.h
#define
Pi
3.14
#define
dthv (x)
x*x
#define
dtht (x)
(Pi*x*x)
2. Vi t chng tr nh t nh di n t ch da v o file dientich.h tr n
3. Vi t h m qui t nh t ch P(n) = 1 * 2 * 3* ....* n , n>0
4. Vi t h m qui t nh h m m xn, vi n nguy n.
5. Vi t h m qui t nh ph n t th n ca h m Fibonacci.
6. Vi t h m qui gi i quy t b i to n Th p H ni.
C 3 ct A, B, C. Ct A hi n ang c n d a k ch thc kh c nhau, d a nh
tr n d a ln di. H y di n d a t ct A sang ct C (xem ct B l ct trung
gian) vi i u ki n mi l n ch c di 1 d a v d a t tr n bao gi cng
nh hn d a t di.
7. Vi t chng tr nh m ha v gi i m mt file v n b n sao cho n u ta m
ha ri th chng tr nh khng m ha na, v n u file cha m ha th
khng c gi i m .
8. Cho bi t trong mt file v n b n do ta nh p v o c bao nhi u k t, bao nhi u
t, v bao nhi u dng; bi t r ng c c t c ch nhau kho ng tr ng, d u tab, d u
ch m.
9. Vi t chng tr nh t o mt menu thc hi n c c chc n ng sau tr n file v n
b n:
- T o file mi
- c file
- Xa file
- Ghi ni ui file
- Copy file
- Di chuy n file t th mc n y sang th mc kh c
- T m mt t xu t hi n bao nhi u l n trong file (khng ph n bi t ch in, ch

K thu t l p tr nh

69

thng)
- Thay th t n y b ng t kh c
10. T o menu thc hi n c c cng vi c sau:
- Nh p danh s ch c ki u hc vi n v o mt file t n 'HOSO.TXT', mi hc
vi n c c c thng tin sau: maso (int), hoten (chui ti a 30 k t), ph i
(NAM/NU), tui (int).
- Li t k danh s ch hc vi n ra m n h nh theo d ng sau:
M s
H v t n
Ph i
Tui
- Truy xu t ng u nhi n theo th t m u tin
- T m ki m mt ngi trong file theo m s
- C p nh t sa i c c m u tin theo m s (Nh p m s, sau hi u ch nh
l i hoten, phai, v tui).
- Xa mt ngi trong file theo m s.

70

K thu t l p tr nh

CHNG 3 CC THUT TON TRN CU TRC D LIU MNG

I. Mng khng sp xp v thut ton tm kim trn


mng cha c th t
I.1. Mt s khi ni m v mng:
I.1.1. nh ngh a:
M ng l 1 d y c c ph n t c cng ki u d li u c s p x p li n ti p
nhau trong b nh
0100
0102
0104

1
2

int
M ng n ph n t

n-1
B nh
!Khai bo:
C php: Khai b o m ng 1 chi u
Ki u_DL T nm ng [k ch thc];
Ki u_DL : l 1 trong c c ki u d li u c b n, l ki u ca ph n t
ca m ng
T nm ng: l t n ca m ng c t 1 c ch hp l
K ch thc: l 1 h ng nguy n cho bi t s ph n t ti a ca m ng
V d 1: Khai b o 1 m ng s nguy n

int
int
int
bi n

n;
M[n] ;
SAI
M[10] ; ng v k ch thc m ng ph i l h ng khng ph i l

#define max 100


int
M[max] ;
V d 2: Khai b o 1 danh s ch h t n hc vi n ca 1 lp hc
char

dshv[50][30]; // dshv c th cha ti a h t n 50 hc vi n,


// chi u d i h t n mi hc vi n ti a l 30 k t

C php:

Khai b o m ng 2 chi u

71

K thu t l p tr nh

Ki u_DL

T nm ng [k ch thc 1][k ch thc 2]

Ch : Mt m ng trong C, c c ph n t c nh s t 0 ti n-1
V d : Vi M[10]
th th nh ph n th 1 l M[0]
th nh ph n cui cng M[9]
* C khng b t b , khng ki m tra xem bi n m c vt ra khi gii h n
cho php ca m ng cha. Do , chng ta ph i ki m tra bi n m trong chng
tr nh (ph i nh hn n)
I.1.2. Khi ng tr cho mng:
Ta khi ng c tr cho m ng trong 2 trng hp sau:
M ng c khai b o l bi n ngo i (main) ngh a l bi n to n cc
M ng c khai b o cc b
int M[3] = {10,11,12}
V d 1 :
main()
{
}
V d 2:
main()
{ static
int M[ ]={10,22,30};
............
}
Ta c th g n 1 h ng cho c m ng nh sau:
memset (M,0,sizeof(int) *3) ; // g n 0 cho m ng M vi M c 3 ph n t
T kha static dng khai b o 1 bi n cc b thng trc cho php duy
tr gi tr ri ng ca n nhng l n gi h m sau n y.
Khi t o m ng 2 chi u:
int

M[2][3]= {{1,2,3},
{0,1,0}};
I.1.3.Truy xut thnh phn ca mng: M[ch s]

Truy xu t th nh ph n th 2 ca m ng 1 chi u: M[1]


Truy xu t th nh ph n th i ca m ng 1 chi u: M[i-1]
Truy xu t th nh ph n dng 2, ct 3 ca m ng 2 chi u M[1][2]
I.1.4. c (nhp) d li u cho mng:
- nh p d li u cho m ng ta ph i nh p d li u cho tng th nh ph n ca
m ng.
V d 1:

72

K thu t l p tr nh

int n,i;
float M[10];
printf("\nCho biet so phan tu cua mang:")
scanf (%d,&n);
for ( i=0; i< n; i++)
{ printf(a[%d]= ,i+1);
scanf (%f,&M[i]);
}
V d 2: Nh p v o m ng 2 chi u.
int m, n, i, j;
float M[10] [10];
printf("So dong ="); scanf("%d",&n);
printf("So cot ="); scanf("%d",&m);
for(i= 0; i< n; i++)
for(j= 0; j<m; j++)
{ printf(M[%d] [%d] = ,i,j);
scanf(%f, &M[i][j]);
}
I.1.5. Xut d li u ki u mng: xu t d li u m ng ta cng ph i xu t d
li u ca tng th nh ph n m ng
V d:
int i, n;
float M[10];
for(i = 0; i< n; i++)
printf(a[%d] = %f,i+1, M[i]);
I.2. Thut ton t m ki m tr n mng cha c th t:
Do m ng cha c th t n n ta p dng phng ph p t m ki m tuy n t nh t m
t u m ng cho n cui m ng. Trong chng tr nh sau y, h m Timki m s
tr v tr -1 n u khng c m sinh vi n trong danh s ch ds, ngc l i h m s tr
v v tr ca m s trong danh s ch ds.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SOSV 100
typedef struct sinhvien

// s sinh vi n ti a trong danh s ch


// nh ngh a ki u sinhvien

K thu t l p tr nh

{ char maso[6];
char hoten[30];
};
typedef struct danhsach_sv // nh ngh a ki u danhsach_sv
{ int tssv;
sinhvien sv[MAX_SOSV];
} ;
void Nhap_ds (struct danhsach_sv *psv)
{ char sosv[4];
printf("So sinh vien muon nhap :");
gets(sosv);
psv->tssv=atoi(sosv);
for (int i=0; i<psv->tssv; i++)
{ printf("Ma so :");
gets(psv->sv[i].maso);
printf("Ho ten :");
gets(psv->sv[i].hoten);
}
}
void Lietke_ds (struct danhsach_sv *psv)
{ int i=0;
clrscr();
printf (" Ma so Ho & ten \n");
while (i < psv->tssv)
{ printf ("%8s
%-s\n", psv->sv[i].maso,psv->sv[i].hoten);
i++;
}
getch();
}
/* Hm Timkiem t m maso trong danhsach *psv */
int Timkiem(danhsach_sv *psv, char maso[])
{ int i=0;
while ((i<psv->tssv) && (strcmp(psv->sv[i].maso, maso)!=0))
i++;
return (i==psv->tssv ? -1 : i) ;

73

74

K thu t l p tr nh

}
void main()
{ struct danhsach_sv ds;
char maso[6];
int vitri;
Nhap_ds(&ds);
// Gi h m Nhap_ds vi tham s l ds
Lietke_ds(&ds);
printf("Ma so sinh vien ban can tim :");
gets(maso);
vitri = Timkiem(&ds, maso);
if (vitri !=-1)
printf("Ho ten cua sinh vien la %s",ds.sv[vitri].hoten);
else printf(" Khong co sinh vien voi ma ban nhap vao");
getch();
}
II. Cc thut ton sp xp:
Trong thc t cuc sng cng nh trong l nh vc l p tr nh, vi c qu n l d li u
thng i hi s t m ki m c c d li u c n thi t; thu n ti n cho vi c t m
ki m, d li u thng c s p x p theo mt th t n o .
C r t nhi u phng ph p s p th t, trong b i gi ng n y ta ch kh o s t hai
phng ph p s p x p l Bubble_Sort v Quick_Sort.
thu n ti n ta gi s m ng l d y s c ti a 100 s, v c c thu t to n di
y dng s p x p d y s theo th t t ng d n.
II.1. Sp x p theo phng php Bubble_Sort (phng php ni bt)
- Ni dung : Ta cho i duy t d y a[0], .. ,a[n-1]; n u a[i-1] ln hn a[i] th ta
ho n i (a[i-1],a[i]). L p l i qu tr nh duy t d y n y cho n khi khng c x y
ra vi c i ch ca hai ph n t.
V d : Ta s p th t d y s sau : 26 33 35 29 19 12 32
Bc 0

26
33
35
29
19

12
26
33
35
29

12
19
26
33
35

12
19
26
29
33

12
19
26
29
32

12
19
26
29
32

12
19
26
29
32

75

K thu t l p tr nh

12
19
29
35
33
33
32
32
32
32
35
35
- Chng tr nh:
#include <stdio.h>
#include <conio.h>
int mang[100];
// bi n to n cc
int size ;
void Bubble_Sort(int A[100], int n)
{ int i,j,temp;
for (i=1; i<n; i++)
for (j=n-1;j>=i; j--)
if (A[j-1] > A[j])
{ temp = A[j-1];
A[j-1] = A[j];
A[j] = temp;
}
}
int Nhap_day_so (int A[])
{ int i,n;
printf("\nSo phan tu cua mang :"); scanf("%d",&n);
for (i=0; i<n; i++)
{ printf ("A[%d] = ",i+1);
scanf("%d",&A[i]);
}
return n;
}
void Liet_ke (int A[], int n)
{ int i;
printf("\n Gia tri mang da duoc sap : \n");
for (i=0; i<n; i++)
printf ("%5d",A[i]);
getch();
}
void main()
{
size= Nhap_day_so(mang);

33
35

76

K thu t l p tr nh

Bubble_Sort(mang,size);
Liet_ke(mang,size);
}
Ta nh n th y phng ph p n y c th c c i ti n d d ng. N u l n
duy t d y n o m khng c c s i ch gia hai ph n t th d y c th
t v gi i thu t k t thc. Trong trng hp n y, ta dng mt c hi u flag ghi
nh n i u n y, v gi i thu t Bubble Sort c c i ti n nh sau:
#define FALSE 0
#define TRUE 1
void Bubble_Sort_Ad(int A[], int n)
{ int i,temp;
unsigned char flag=TRUE;
while (flag)
{ flag = FALSE ;
for (i=0; i<n-1; i++)
if (A[i] > A[i+1])
{ temp = A[i];
A[i] = A[i+1];
A[i+1] = temp;
flag=TRUE;
}
}
}
II.2. Sp x p theo phng php Quick_Sort
II.2.1. Ni dung: Chn mt ph n t b t k trong danh s ch l m i m cht
x, so s nh v i ch nhng ph n t trong danh s ch n y t o ra 3 ph n: ph n
c gi tr nh hn x, ph n c gi tr b ng x, v ph n c gi tr ln hn x. L i ti p
tc chia 2 ph n c gi tr nh hn v ln hn x theo nguy n t c nh tr n; qu
tr nh chia ph n s k t thc khi mi ph n ch cn l i mt ph n t, lc n y ta c
mt danh s ch c th t.
V d: Xt d y 26 33 35 29 19 12 32
' L n chia ph n th nh t : Chn ph n t cht c kha l 29, t l x
26
i%

33

35

29

19

12

32
$j

Dng hai bi n ch s i v j duy t t hai u danh s ch n x. N u i g p

K thu t l p tr nh

77

ph n t ln hn hay b ng x s dng l i, j g p ph n t nh hn hay b ng x s


dng l i, ri i ch hai ph n t n y; sau ti p tc duy t cho n khi i>j th
ngng l i.
Lc n y d y s c 3 ph n kh c nhau nh h nh v sau :
19
12
32
26
33
35
29
i
j
26
12
35
29
19
33
32
i
j
35
33
32
26
12
19
29
ij
26
12
19
29
35
33
32
j
i
' L n chia ph n th hai cho d y con 26 12 19, chn cht x=12
19
%
12
26
19
26
12
i
j
j
i
K t thc ta s c hai ph n : 12 ; 26 19
' L n chia ph n th 3 cho d y con 26 19, chn cht x=26
26 19 % 19 26 K t thc qu tr nh chia nh d y con 26 12 19
i
j
j
i
- L n chia ph n th 4 cho d y con 35 33 32, chn cht x= 33
%
32
33
35
%
32
33
35 33 32
i
j
ij
j

35
i

K t thc ta s c ba ph n : 32 ; 33 ; 35
n y qu tr nh chia ph n k t thc v t t c c c ph n ch c mt ph n t,
lc n y ta s c mt danh s ch c th t l :
12 19 26 29 32 33 35
II.2.2. Gii thut:
a. Gii thut khng quy:
- Ta t o mt Stack , mi ph n t ca Stack c 2 th nh ph n l q, r cha ch
s u v ch s cui ca d y c n s p. Ban u, Stack[0].q = 0 v Stack[0].r =n-1
- Ti n h nh ph n ho ch d y s gm c c s b t u t ch s q n ch s r
- Sau mi l n chia ph n, ta ki m tra xem ph n c gi tr nh hn cht v
ph n c gi tr ln hn cht n u c t 2 ph n t tr l n th a v o Stack. Sau
mi l n ph n ho ch, ta l i l y d y s mi t Stack ra ph n ho ch ti p.

K thu t l p tr nh

78

- Qu tr nh c nh th cho ti khi Stack rng th k t thc.


* Chng tr nh:
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
int mang[100];
int size ;
void Quick_Sort(int A[100], int n)
{ struct Element_Stack
// ki u ph n t trong Stack
{
int q, r;
};
Element_Stack Stack[50]; // Stack c ti a 50 ph n t
int sp=0;
// con tr Stack, khi t o sp=0
int i,j,x,q,r,temp;
Stack[0].q =0 ;
// ch s u ca m ng c n s p
Stack[0].r =n-1;
// ch s cui ca m ng c n s p
do
{ // L y mt ph n ho ch ra t Stack
q = Stack[sp].q ; r =Stack[sp].r ;
sp--;
// Xa 1 ph n t khi Stack
do
{ // Ph n o n d y con a[q] ,..., a[r]
i = q; j =r;
x = A[(q+r) / 2] ; // L y ph n t gia ca d y c n s p th t l m cht
do
{ while (A[i] < x) i++; //T m ph n t u ti n c tr ln hn hay b ng x
while (A[j] > x) j--; //T m ph n t u ti n c tr nh hn hay b ng x
if (i<=j)
// i ch A[i] vi A[j]
{ temp = A[i];
A[i] =A[j];
A[j] = temp;
i++ ; j--;
}
} while (i<=j);

K thu t l p tr nh

79

if (i<r)
// ph n th ba c t 2 ph n t tr l n
{ // a v o Stack ch s u v ch s cui ca ph n th ba
sp++;
Stack[sp].q=i;
Stack[sp].r=r;
}
r = j ; // Chu n b v tr ph n ho ch ph n c gi tr nh hn cht
} while (q< r);
} while (sp!=-1); // Ket thuc khi Stack rong
}
int Nhap_day_so (int A[])
/* T o d y n s ng u nhi n t 0 n 9999 a v o m ng A */
{ int i,n;
printf("\nSo phan tu cua mang :"); scanf("%d",&n);
randomize();
// dng <time.h> v <stdlib.h>
for (i=0; i<n; i++)
A[i]= rand() % 10000; // Ph t sinh c c s ng u nhi n t 0 n 9999
return n;
}
void Liet_ke (char str[],int A[], int n)
{ int i;
printf("\n%s\n",str);
for (i=0; i<n; i++)
printf ("%5d",A[i]);
getch();
}
void main()
{
size= Nhap_day_so(mang);
Liet_ke("Day so ngau nhien :",mang,size);
Quick_Sort(mang,size);
Liet_ke("Gia tri mang da duoc sap :",mang,size);
}
b. Gii thut Quick Sort qui: v c ch thc hi n th cng ging nh

K thu t l p tr nh

80

gi i thu t khng qui, nhng ta khng ki m so t Stack m cho qu tr nh gi


qui t t o ra Stack.
* Chng tr nh:
void Sort(int A[], int q,int r)
{ int temp;
int i=q;
int j=r;
int x = A[(q+r) / 2] ; // L y ph n t gia ca d y c n s p th t l m cht
do
{ // Ph n o n d y con a[q] ,..., a[r]
while (A[i] < x) i++; //T m ph n t u ti n c tr ln hn hay b ng x
while (A[j] > x) j--; //T m ph n t u ti n c tr nh hn hay b ng x
if (i<=j) // Doi cho A[i] voi A[j]
{ temp = A[i];
A[i] =A[j];
A[j] = temp;
i++ ; j--;
}
} while (i<=j);
if (q<j)
// ph n th nh t c t 2 ph n t tr l n
Sort(A,q,j);
if (i<r)
// ph n th ba c t 2 ph n t tr l n
Sort (A,i,r);
}
void Quick_Sort(int A[], int n)
{ Sort( A,0,n-1);
// Gi h m Sort vi ph n t u c ch s 0 n
// ph n t cui cng c ch s n-1
}
III. Tm kim trn mng c th t:
Gi s d y s ca ta l d y s c th t t ng d n, v x l gi tr c n t m.
C c h m t m ki m s tr v tr -1 n u khng c x trong d y, ngc l i c c h m
t m ki m s tr v ch s ca x trong d y.
III.1. T m ki m nhanh bng phng php lp:
- Ni dung: Do d y s c th t t ng d n, n n n u ta t m c ph n t
u ti n c tr va ln hn x th ta c th k t lu n d y s khng cha tr x. V
v y, ta s rt ng n thi gian t m ki m.

K thu t l p tr nh

81

- Gi i thu t:
int Search(int A[], int n, int x)
{ int i=0;
while (i<n && A[i] < x)
i++;
return (i<n && A[i]==x ? i : -1) ;
}
void main()
{ int so,vitri;
size= Nhap_day_so(mang);
Quick_Sort(mang,size);
Liet_ke("Gia tri mang da duoc sap :",mang,size);
printf("\nGia tri muon tim :");
scanf("%d",&so);
vitri = Search(mang,size, so);
if (vitri !=-1)
printf("Vi tri cua so %d trong day = %d",so,vitri);
else printf(" Khong co so %d trong day",so);
getch();
}
III.2. Php t m ki m nh phn:
- Ni dung:
! Bc 1: Ph m vi t m ki m ban u l to n b danh s ch.
! Bc 2: L y ph n t ch nh gia ca ph m vi t m ki m (gi l y) so s nh
vi x.
N u x=y th ta t m th y, tr v ch s. Gi i thu t k t thc
N u x < y th ph m vi t m ki m mi l c c ph n t n m ph a trc
ca y.
N u x > y th ph m vi t m ki m mi l c c ph n t n m ph a sau ca y.
! Bc 3: N u cn tn t i ph m vi t m ki m th l p l i bc 2, ngc l i
gi i thu t k t thc vi k t qu l khng c x trong d y s.
- Gi i thu t:
int Binary_Search(int A[], int n, int x)
{ unsigned char found=FALSE; // Gi s ban u ta cha t m th y x trong d y
// Ph m vi ban u t m ki m l t k=0 % m = n-1

K thu t l p tr nh

82

int k=0;
int m=n-1;
int j;
while (k<=m && !found)
{ j=(k+m) /2;
//ch s ph n t gia
if (A[j]==x)
found=TRUE;
else if (x>A[j]) k=j+1;
// Ph m vi t m mi l (j+1, m)
else m=j-1;
// Ph m vi t m mi l (k, j-1)
}
return (found ? j : -1) ;
}
III.3. Php t m ki m nh phn qui:
- Ni dung: tng t nh tr n
! Bc 1: Ph m vi t m ki m ban u l to n b danh s ch (k=0%m=n-1).
! Bc 2: L y ph n t ch nh gia ca ph m vi t m ki m (gi l y) so s nh
vi x.
N u x=y th ta t m th y, tr v ch s. Gi i thu t k t thc
N u x < y th ph m vi t m ki m mi l c c ph n t n m ph a trc
ca y, n n ta gi qui vi ph m vi mi l (k,j-1)
N u x > y th ph m vi t m ki m mi l c c ph n t n m ph a sau ca y,
n n ta gi qui vi ph m vi mi l (j+1,m )
! i u ki n dng: x=y ho c k > m.
- Gi i thu t:
int Binary_Search2(int A[], int k,int m, int x)
{ int j=(k+m) /2;
if (k>m) return -1 ;
else if (A[j]==x) return j ;
else Binary_Search2(A, (A[j]<x ? j+1:k), (A[j] > x ?j-1:m),x);
}

83

K thu t l p tr nh

B i t p:
1. Cho mt d y n s thc A :
a) T m ph n t nh nh t ca d y s A
b) T m ph n t ln nh t ca d y s A
c) T nh gi tr trung b nh ca d y s A.
2. Hi n ang lu h nh c c t gi y b c 50000, 20000, 10000, 5000, 2000,
1000, 500, 200, 100. N u c x ng, hi r ng n n chn c c t gi y b c n o
s lng c c t gi y b c l t nh t.
3. Vi t chng tr nh nh p mt ma tr n s nguy n c k ch thc M x N. In ra:
- Tng c c ph n t ca ma tr n
- S c c ph n t dng, ph n t m, ph n t 0 ca ma tr n
- Ph n t ln nh t, nh nh t ca ma tr n
- C c ph n t tr n ng cho ch nh ca ma tr n (vi M = N )
- Tng c c ph n t tr n ng cho ch nh ca ma tr n (vi M = N )
4. Cho 2 ma tr n vung A(n,n) v B (n,n) :
- T nh ma tr n tng C = A+ B,
bi t C[i,j] = A[i,j] + B[i,j] , i,j [1,m]
- T nh ma tr n t ch D = A * B,
n

bi t D [i,j] = A[i , k ] * B[ k , j ]
k 1

; i, j = 1..n

5. T o mt menu thc hi n c c cng vi c sau:


a. Nh p danh s ch c ki u hc vi n v o mt m ng, mi hc vi n c c c
thng tin sau: maso (int), hoten (chui ti a 30 k t), ph i(NAM/NU), i m
(float), h ng (unsigned char). Qu tr nh nh p s dng l i khi m s nh p v o
l 0.
b. Li t k danh s ch hc vi n ra m n h nh theo d ng sau:
M s
H v t n
Ph i
i m
H ng
c. T m ki m mt hc vi n trong danh s ch theo m s, v in ra c c thng tin
cn l i ca hc vi n .
d. S p x p danh s ch hc vi n theo i m t ng d n.
e. X p h ng danh s ch hc vi n theo qui t c cng i m th cng h ng, h ng
ca hc vi n sau b ng h ng ca nhm hc vi n trc cng s ngi ca nhm
hc vi n trc cng i m.
f. Gi s danh s ch hc vi n c th t t ng d n theo i m; Nh p th m 1
hc vi n sao cho sau khi nh p th danh s ch v n cn c th t.
g. C p nh t sa i c c m u tin theo m s (Nh p m s, sau hi u ch nh

84

K thu t l p tr nh

l i hoten, phai, i m).


h. Lo i b 1 hc vi n ra khi danh s ch da v o m s.
6. a) Vi t chng tr nh t o ng u nhi n mt d y s 20000 s nguy n c gi tr t
0 n 9999.
b) m s l n so s nh ca 2 gi i thu t t m ki m tu n t (tr n d y s cha c
th t) v t m ki m nh ph n (tr n d y s c s p th t).
c) Trong trng hp d y s tr n l 200000 s nguy n ph n bi t kh c nhau
trong mi n gi tr [1..300000] th ta ti u gi i thu t s p x p v m t khng
gian v thi gian nh th n o? Cho bi t thi gian thc thi ca gi i thu t
Quick Sort v gi i thu t b n c i t.
7. Cho bi t thi gian thc thi ca 2 gi i thu t Bubble Sort v Quick Sort tr n d y
s c s ph n t kh ln.
8. Gi s ta c 1 d y s thc A t ng d n. Vi t gi i thu t th m 1 s thc x v o
d y A sao cho sau khi th m x th d y v n t ng d n ?
9. Vi t h m xa t t c c c ph n t c tr b ng x trong d y s A.
10. Vi t chng tr nh t nh i m ca mt lp:
- Nh p c c thng tin sau cho mi hc vi n : hoten, namsinh, trung b nh
HK1, trung b nh HK2
- In ra danh s ch c c hc vi n ca lp theo th t gi m d n ca TB to n
n m
TB to n n m = (TB HK1 + TB HK2)/2
theo m u sau:
DANH SCH iM LP ......
STT

H & T n

TB HK1

TB HK2

TB ton
nm

Hng

1
2
3
Lu :- C c hc vi n cng TB th cng h ng
- In 17 hc vi n tr n mt trang m n h nh
11. Cho 2 d y s A c n ph n t v B c m ph n t vi th t t ng d n. H y trn
2 d y s tr n th nh 1 d y mi C sao cho sau khi trn th C cng t ng d n.

85

K thu t l p tr nh

CHNG 4

CON TR (POINTER)

I. NH NGHA
Con tr l mt ki u d li u dng cha a ch . Bi n con tr l mt bi n
cha a ch ca mt thc th n o , thc th l bi n ho c l h m.
Con tr thng c dng :
- Tr v nhi u tr t h m qua c ch truy n theo tham s theo a ch trong
h m (tham s h nh thc bi n).
- T o c c c u trc d li u phc t p nh danh s ch li n k t v c y nh ph n.
- Truy n m ng v chui gia c c h m kh thu n li.
I.1. Khai bo: Khai b o bi n pi l con tr tr n mt s nguy n.
int *pi;
Lc n y, pi chi m 2 bytes cha a ch ca s nguy n m n ang ch
n, ng thi tr nh bi n dch ca C cng bi t pi ang ch n mt s nguy n
(do khai b o). a mt gi tr nguy n v o vng nh m pi ang tr n, ta
dng l nh: *pi = 1;
V d:
void main()
{ int x=4, y=10;
int *px, *py ;
px = &x ;
py = &y;
*px = *px + *py;

// px, py l c c bi n con tr
// a a ch ca x,y v o px v py
// t ng gi tr ca vng nh m px ang tr ti
// th m y , tng ng vi x = x+y

}
Minh ha chng tr nh tr n trong b nh:
Bi n
int x=4, y=10;
px=&x;
int *px, *py;
py=&y;
x
950
4
4
951
y
952
10
10
953

*px = *px + *py;


14
10

px

950

950

py

952

952

86

K thu t l p tr nh

H nh 7.1. C ch truy xu t gi tr qua bi n con tr.


Tng qu t:

Ki u *bi n;

I.2. Truy n a ch cho hm: Trong 1 s trng hp ta mun gi a ch ca


1 bi n x cho h m. Nh v o c ch truy n theo a ch n y m h m c th tr v
nhi u gi tr cho chng tr nh gi.
V d : H m ho n i gi tr ca 2 bi n x, y
void hoandoi (int *a, int *b)
{ int tam;
tam = *a;
*a = *b;
*b = tam;
}
void main()
{ int x,y;
printf ("x, y = ");
scanf ("%d %d", &x, &y);
giaohoan(&x, &y); // Truy n a ch ca 2 bi n x,y cho h m hoandoi
}
II Cc php ton trn bin con tr:
II.1. Ton t a ch &:
N u x l bi n thng thng, &x s l a ch ca bi n x
V d: float x, *pf;
x = 50;
pf = x;
// sai v pf l bi n con tr n n ta vi t pf = & x;
x = pf;
// sai ; ta vi t x = *pf; { l y ni dung ca pf }
II.2. Ton t ni dung * :
N u p l pointer th *p l ni dung ca n.
V d : int x,y, *p;
x = 50;
p = &x;
// p cha a ch ca vng nh x
y = *p;
// y= *p = 50 v p cha a ch ca vng nh x
V d : a =2;
p = & a;
b = (*p) + + + 3; // b =5, *p = 3, a= 3.
( v p tr ti a ch a n n *p t ng th a t ng)
Tm li:
*x l bi n m x gi a ch
&x l a ch ca x n u x l bi n thng thng

87

K thu t l p tr nh

II.3. Php cng tr bi n con tr vi mt s nguy n:


N u p l bi n pointer th p+n l a ch ca mt bi n mi c ch n n bi n
theo chi u t ng, cn p-n th ngc l i.
Ch :
- Php cng con tr vi mt s nguy n ch c p dng tr n mt d y bi n
cng ki u
- Khng c cng 2 pointer vi nhau
- Khng c nh n, chia, l y d bi n con tr vi b t k s n o
V d : Gi s ta c m ng nums[]= {10,20,30,40,50}. Vi c tham kh o ti
nums[i] thc ch t l dng d ng k hi u con tr, v khi bi n dch, tr nh bi n dch
s chuy n i k hi u m ng th nh k hi u con tr.
void main()
{ static int nums [] = {10,20,30,40,50};
for (int i =0; i<5; i++)
printf (%d\n, *(nums + i));
}
Lu : *(nums+i) tng ng vi nums[i]
II.4. Php gn v php so snh:
- Php gn: c c bi n con tr c th g n cho nhau vi i u ki n ph i cng
ki u
V d : int *p1, *p2;
*p1 = 10;
p2 = p1;
// lc n y *p2 = 10;
- Php so snh: ta c th so s nh 2 bi n con tr xem c cng a ch hay
khng, ng nhi n 2 bi n con tr ph i cng ki u vi nhau.
II.5. S chuy n ki u:
C ph p:

( Ki u)

*t nbi n

V d: int *p1, num ;


float *p2;
num =5;
p1 = &num;
*p2 = (float ) *p1; // * p2 = 5.0
V d: int num, *p, n;
char c;
p = &num;

88

K thu t l p tr nh

*p = 97;
// num =97
n = *p;
// n=97
c = (char) *p; // c = a
Ch : a ch ca mt bi n c xem nh mt con tr h ng, do n
khng c php g n, t ng ho c gi m.
V d : int num, *p, n;
p = & num;
p ++; // ng
( & num) ++;
// sai
con tr h ng
II.6. Khai bo mt con tr hng v con tr ch n i tng hng:
a. Con tr hng:
Ki u * const p = gi tr;
b. Con tr ch n i tng hng:
Ki u const *p = gi tr h ng;
ho c Const ki u *p = gi tr h ng;
V d: char *const p2 = ABCD
const char *p1= ABCD
p2 + + ;
// sai
p1 + + ;
// ng;
*p1= B

; p1 = "BCD"

III. S tng quan gia con tr v mng


V d : Ta c m ng A nh sau:
int A[10] , *p;
th A = &A[0]
N u p = A th truy xu t ti ph n t th i ca m ng A, ta c c c c ch sau:
A[i] *(A + i) *( p + i)
& A[i] (A + i) (p +i )
V d : Nh p m ng A:
int A[10] , *p, i;
p = A;
for (i = 0; i< 9; i++)
scanf (%d, p+i );
Xu t m ng A:
for (i = 0; i< 9;i++)
printf (%d, *(p+i));

K thu t l p tr nh

V d : S p x p m ng b ng c ch tham kh o con tr.


const n =10 ;
int a[n], *p;
void main()
{ int j,temp;
clrscr();
p=a;
printf("\Nhap day so A :\n");
for (int i=0; i<n; i++)
{ printf("A[%d] = ",i+1);
scanf("%d",p+i);
}
// Sap xep mang A theo giai thuat Bubble Sort
for ( i=1; i<n; i++)
for (j=n-1; j>=i; j--)
if (*(p+j-1) > *(p+j))
{ temp = *(p+j);
*(p+j) = *(p+j-1);
*(p+j-1) = temp;
}
printf("\n Mang A sau khi sap xep :\n");
for ( i=0; i<n; i++)
printf("%8d",*(p+i));
}
* i vi m ng 2 chi u:
N u ta khai b o : Ki u a [10] [20] , *p; th m ng a c d ng:
a
0
1
2
3
.....
18
19
0
1
2
3
a[i]
.
9
Nhn xt:
a = &a[0][0] = &a[0]
a[i] = &a[i][0]

89

90

K thu t l p tr nh

a[i][j] ni dung ca i.j


Vi p = a th truy xu tti a[i][j] :
a[i][j] = *(*(p+i) +j)
& a[i][j] = (*(p+i) +j)
V d :N u ta c int a[4][5] =
{ {1,2,3,4,5}, {2,3,4,5,6}, {3,4,5,6,7} , {4,5,6,7,8}} ;
th :
- a l a ch ca to n b m ng (gi s l 1000)
- Do a l m ng nguy n n n mi ph n t chi m 2 bytes, v mi dng ca
m ng s chi m 10 bytes.
- Tr nh bi n dch ca C bi t s ct (do khai b o) n n n s hi u a+1 l
em 1000 + 10 bytes, k t qu l 1010 l a ch ca dng th 2 trong a.
Tng t, 1020 l l a ch ca dng th 3 trong a.
a
1000
1010
1020
1030

0
1
2
3
4

1
2
3
4
5

2
3
4
5
6

3
4
5
6
7

4
5
6
7
8

Lc n y: a[1] hay a+1 l a ch ca dng th 2 trong m ng 2 chi u a.


Ta c : *(a+1) == 1010
// a ch ca ph n t u ti n tr n dng 1
*(a+1)+3 == 1016 // a ch ca ph n t c ch s 3 tr n dng 1
*(*(a+1)+3)==5
// ni dung ca ph n t a[1][3]
a[i][j] = *(*(a+i)+j)
Tm li:
Ta cn c mt c ch kh c truy xu t ti a[i][j] :
N u : Ki u
a[n0 ] [n1 ] ... [nm] , *p;
p = a;
th a [i0] [i1]... [im] = *(*(*(p+i0) + i1) + ...im)
Ch :
1. S khc nhau gia con tr v mng:
- Bi n con tr th c th t ng, gi m ho c g n cn bi n m ng l mt con tr
h ng do khng th t ng, gi m ho c g n.
- Ta c th l y a ch ca con tr nhng khng th l y a ch ca m ng v
b n th n m ng l a ch .
- Khi ta khai b o mt m ng th chng tr nh dch s c p ph t mt vng nh
cho n.
Ki u a[50]
V d 1:

91

K thu t l p tr nh

Trong b nh :
0
1
2

49

a
- Bi n con tr khi c khai b o th ch c c p mt nh m ni dung
ca n ch ng bi t ch n u
V d 2: a[1]x c nh th nh ph n th 2
p+1 : ni dung khng x c nh
ph i c p = a p ch ti a
- N u ta mun t o mt m ng b ng con tr th ta ph i xin c p ph t mt vng
nh b ng h m malloc ()
V d:

int *p;
p = (int) maloc ( 10* sizeof(int));
Trong b nh:
0
1
2
9
p
V d : int *p;
p = malloc (10* sizeof (int));
for(i=0; i< 10; i++)
scanf (%d, p+i)
- lo i b vng nh c c p cho con tr ta dng h m free (p)
2. S khc nhau gia tham s ca hm l mng v i s l pointer:
H m (ki u a[])
H m (ki u *p)
Ch :
N u: Ki u a[50][30], *p;
p= a;
th
H m (Ki u a[][30])
H m (Ki u *p)
3. Hm tr v ki u con tr:
Ki u *h m (is)
V d :
char *strcat (char s1[], char s2[])
{ int i=0,j=0;
while ( s1[i]!='\0' ) i++;
while ( (s1[i++] = s2[j++]) !='\0' ) ;

92

K thu t l p tr nh

return s1 ;
}
IV. Con tr v chui
IV.1. Khai bo: khai b o s l 1 chui k t v p l con tr tr n 1 chui
k t, ta vi t nh sau:
char s [50];
char *p;
khi t o 1 chui trong c 2 trng hp:
static char s[] = ABCD;
char *p = ABCD;
Lc n y, n u ta:

puts (p) ;

// ABCD

puts (++p) ;

// BCD

IV.2. Xt mt s v d v cc hm x l chui
a. Hm Strcpy: Sao chp chui k t t source qua dest.
0
source A

1
B

2
C

3
D

4
E

5
F

\0

dest
#include <stdio.h>
#include <conio.h>
void strcpy (char dest[], char source[])
{
int i=0;
while ((dest[i++] = source[i]) !='\0');
}
void main()
{
char src_str[]="Hoang Van";
char dst_str[20];
strcpy(dst_str,src_str);
printf("\n%s", dst_str);
}
Vi t l i h m strcpy b ng con tr:
void strcpy (char *dest, const char *source)
{ while (( *dest = *source) !=\0)
{ dest ++;

K thu t l p tr nh

source ++;
}
}
b. Hm Strcmp () : dng so s nh 2 chui s1, s2 vi nhau.
int strcmp (char s1[] , char s2 []);
{ int i= 0;
while (s1[i] == s2[i])
{ if (s1[i] == \0)
return 0;
i++;
}
return (s1[i]- s2[i]);
}
C i t l i b ng con tr:
int strcmp (char *s1, const char *s2);
{ while (*s1 == *s2)
{ if (*s1 == \0)
return 0;
*s1++;
*s2++;
}
return (*s1 - *s2)
}
c. Hm strcat: ni chui s2 sau chui s1
char *strcat (char s1[],char s2[])
{ int i=0,j=0;
while ( s1[i]!='\0' ) i++;
while ( (s1[i++] = s2[j++]) !='\0' ) ;
return s1 ;
}
C i t l i b ng con tr:
char *strcat (char *s1, const char *s2)
{ char *p;
p=s1;
while ( *s1!='\0' )
s1 ++;
while ( (*s1=*s2) !='\0' )
{ s1 ++; s2 ++;
}

93

94

K thu t l p tr nh

return p ;
}
d. Hm strchr: tr v a ch ca k t c tromg chui s.
#include <stdio.h>
#include <conio.h>
char *strchr (char s[], char c)
{ int i=0;
while ( s[i]!=c && s[i]!='\0' )
i++;
if ( s[i] != c) return (char *)0;
else return &s[i] ;
}
C i t l i b ng con tr:
char *strchr (char *s, char c)
{
while ( *s !=c && *s!='\0' )
s++;
if ( *s != c) return (char *)0;
else return s ;
}
char str[]="Ky ";
void main()
{ char *vt;
vt=strchr(str ,'y');
if (vt==NULL )
printf("Khong co ky tu trong chuoi" );
else printf("\nVi tri =%d", vt-str+1);
getch();
}
IV.3. Mng con tr ch n chui
- Khai bo: khai b o 1 m ng con tr ch n chui, v d nh danh s ch
h t n, ta vi t nh sau:
char * ds[5]=

// m ng chui ds[5][7]

{ "Hoang", "Van", "Chi", "Ngoc", "Nguyet" }


N u ta khi t o m ng m khng dng con tr th lng nh c p ph t cho
mi ph n t ca m ng u b ng vi s k t ca chui d i nh t; Trong khi ,

95

K thu t l p tr nh

n u khi t o b ng m ng con tr nh tr n th lng nh s c p ph t va cho


tng ph n t ca m ng.
ds[0]
ds[1]
ds[2]
ds[3]
ds[4]

ds[0]
ds[1]
ds[2]
ds[3]
ds[4]

H o
a
V a
n
C h
i
N g
o
N g
u
H nh 3.2. M ng con tr
H
V
C
N
N
H

n
g
\0
\0
\0
c
\0
y
e
t
\0
tr n chui

o
a
n
g
\0
a
n
\0
h
i
\0
g
o
c
\0
g
u
y
e
t
\0
nh 3.3. M ng c c chui

* X l con tr n chui: xt v d s p x p danh s ch h t n theo ch mc:


#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{ const SISO_MAX = 50;
char ds[SISO_MAX][30]; // mang chuoi
char *p[SISO_MAX];
//mang con tro den chuoi
char *tam;
char siso[2];
int i,j,n;
clrscr();
gotoxy(10,2); printf("Nhap si so lop:");
gets(siso);
n= atoi(siso);
for (i=0; i<n; i++)
{ printf("Ho ten hoc vien thu %d :",i+1);
gets(ds[i]);
p[i] = ds[i]; // l y a ch ca chui h t n trong ds a
// v o m ng con tr p
}

K thu t l p tr nh

96

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


for (j=i+1; j<n; j++)
if ( strcmp(p[i],p[j]) >0)
{ tam = p[i];
p[i] = p[j];
p[j] = tam;
}
printf("\n Danh sach ho ten sau khi sap xep\n");
for (i=0; i<n;i++)
printf("%s\n", p[i]);
}
Lu : Chng tr nh tr n thc ch t ta ch ho n i gi tr ca m ng con tr
p ch m ng chui ds v n nh c.

B i t p:
1. S p x p l i danh s ch hc vi n theo th t h t ng d n b ng con tr.
2. S p x p l i danh s ch hc vi n theo th t t n t ng d n, n u trng t n th
s p theo h b ng con tr.
3. S p x p l i danh s ch hc vi n theo th t t n t ng d n, n u trng t n th
s p theo h b ng m ng chui.

97

K thu t l p tr nh

CHNG 5

CC THUT TON TRN CU TRC


DANH SCH LIN KT (LINKED LIST)

I. Khi nim:
C u trc danh s ch li n k t l c u trc ng, vi c c p ph t nt v gi i
phng nt tr n danh s ch x y ra khi chng tr nh ang ch y. Ta thng c p ph t
nt cho danh s ch li n k t b ng bi n ng.
C c ph n t s c c p ph t vng nh trong qu tr nh thc thi chng
tr nh, do chng c th n m r i r c nhi u ni kh c nhau trong b nh (khng
li n tc) .
First

First

Nil

C c ph n t trong danh s ch c k t ni vi nhau theo chm li n k t nh


h nh tr n:
- First l con tr ch n ph n t u ca danh s ch li n k t
- Ph n t cui ca danh s ch li n k t vi vng li n k t c gi tr NULL
-Mi nt ca danh s ch c trng info cha ni dung ca nt v trng
next l con tr ch n nt k ti p trong danh s ch.
* Lu :
- C u trc danh s ch li n k t l c u trc ng, c c nt c c p ph t ho c
b gi i phng khi chng tr nh ang ch y.
- Danh s ch li n k t r t th ch hp khi thc hi n c c php to n tr n danh
s ch thng b bi n ng. Trong trng hp xa hay th m ph n t trong danh
s ch li n k t th ta khng di c c ph n t i nh trong m ng m ch vi c hi u
ch nh l i trng next t i c c nt ang thao t c. Thi gian thc hi n c c php to n
th m v o v lo i b khng ph thuc v o s ph n t ca danh s ch li n k t.

K thu t l p tr nh

98

- Tuy nhi n, danh s ch li n k t cng c c c i m h n ch sau:


+ V mi nt ca danh s ch li n k t ph i cha th m trng next n n danh
s ch li n k t ph i tn th m b nh.
+ T m ki m tr n danh s ch li n k t khng nhanh v ta ch c truy xu t
tu n t t u danh s ch.
& Khai b o : Mt ph n t ca danh s ch li n k t t nh t ph i c hai th nh
ph n : ni dung ca ph n t (info) v th nh ph n next li n k t ph n t n y vi
ph n t kh c.
Gi s ta khai b o ki u NODEPTR l ki u con tr ch n nt trong 1 danh
s ch li n k t, mi ph n t c 2 th nh ph n : info (int) v next .
struct node
{ int info ;
struct node *next ;
};
typedef struct node *NODEPTR;
- khai b o bi n First qu n l danh s ch li n k t ta vi t nh sau:
NODEPTR First;
- Khi t o danh s ch li n k t : First = NULL;
- Ghi ch :
' Th nh ph n cha ni dung c th gm nhi u vng vi c c ki u d li u
kh c nhau.
' Th nh ph n li n k t cng c th nhi u hn mt n u l danh s ch a li n
k t ho c danh s ch li n k t kp.
' First l con tr tr n ph n t u ti n ca danh s ch li n k t, n c th
l ki u con tr (nh khai b o tr n), v cng c th l mt struct c hai
th nh ph n: First tr n ph n t u ti n ca danh s ch li n k t, v Last
tr n ph n t cui ca danh s ch li n k t.
struct Linked_List;
{ First NODEPTR;
Last NODEPTR;
};
II. Cc php ton trn danh sch lin kt:
II.1. To danh sch:
a. Khi t o danh s ch (Initialize): dng khi ng mt danh s ch li n
k t, cho chng tr nh hi u l hi n t i danh s ch li n k t cha c ph n t.
void Initialize(NODEPTR &First)
{

K thu t l p tr nh

99

First = NULL;
}
b. C p ph t vng nh (New_Node): c p ph t mt nt cho danh s ch li n
k t. H m New_Node n y tr v a ch ca nt va c p ph t.
Trong chng tr nh c s dng h m malloc (trong <alloc.h>) , h m n y c p
ph t mt khi nh t nh theo byte t b nh heap. N u c p ph t th nh cng, h m
malloc tr v a ch ca vng nh va c p ph t, ngc l i n s tr v NULL.
NODEPTR New_Node()
{
NODEPTR p;
p = (NODEPTR)malloc(sizeof(struct node));
return (p);
}
c. Th m v o u danh s ch (Insert_First): th m mt nt c ni dung x v o
u danh s ch li n k t.
void Insert_First (NODEPTR &First, int x)
{
NODEPTR p;
p = New_Node();
p->info = x;
p->next = First;
First = p;
}
d. Th m nt mi v o sau nt c a ch p (Insert_After): th m mt nt c
ni dung x v o sau nt c a ch p trong danh s ch li n k t First.
void Insert_After(NODEPTR p, int x)
{
NODEPTR q;
if(p == NULL)
printf("khong them nut moi vao danh sach duoc");
else
{
q = New_Node();
q->info = x;
q->next = p->next;
p->next = q;
}
}

K thu t l p tr nh

100

II.2. Cp nht danh sch:


a. Gi i phng vng nh(Free_Node): H m n y dng hy nt c p
ph t, v tr vng nh v l i cho memory heap.
void Free_Node(NODEPTR p)
{
free(p);
}
b. Ki m tra danh s ch li n k t rng hay khng (Empty): h m Empty tr v
TRUE n u danh s ch li n k t rng, v ngc l i.
int Empty(NODEPTR First)
{
return(First == NULL ? TRUE : FALSE);
}
c. Xa ph n t u ca danh s ch (Delete_First): mun xa 1 ph n t khi
danh s ch li n k t th ta ph i ki m tra xem danh s ch c rng hay khng. N u
danh s ch c ph n t th mi xa c.
void Delete_First (NODEPTR First)
{ NODEPTR p;
if (Empty(First))
printf("Danh sach rong nen khong the xoa");
else
{
p = First; // nut can xoa la nut dau
First = p->next;
Free_Node(p);
}
}
d. Xa ph n t ng sau nt c a ch p (Delete_After):
void Delete_After(NODEPTR p)
{ NODEPTR q;
// n u p l NULL ho c sau p khng c nt
if((p == NULL) || (p->next == NULL))
printf("khong xoa duoc");
else
{
q = p->next; // q chi nut can xoa
p->next = q->next;

K thu t l p tr nh

101

Free_Node(q);
}
}
e. Xa to n b danh s ch (Delete_All): ta c th s dng l nh *First =
NULL xa to n b danh s ch, nhng trong b nh, c c vng nh c p ph t
cho c c nt khng gi i phng v l i cho memory heap, n n s l ng ph vng nh.
Do , ta s dng gi i thu t sau:
void Delete_All (NODEPTR &First)
{ NODEPTR p;
while (First != NULL)
{ p=First;
First = First->next;
// ho c First = p->next
Free_Node(p);
}
}
II.3. Duy t danh sch: Thng thng ta hay duy t danh s ch li n k t thc
hi n mt cng vi c g , nh li t k d li u trong danh s ch hay m s nt
trong danh s ch...
void Traverse(NODEPTR First)
{ NODEPTR p;
int stt = 0;
p = First;
if(p == NULL)
printf("\n (Khong co sinh vien trong danh sach)");
while(p != NULL)
{
printf("\n %5d%8d", stt++, p->info);
p = p->next;
}
}
II.4. T m ki m (Search): T m nt u ti n trong danh s ch c info b ng vi x.
Do y l danh s ch li n k t n n ta ph i t m t u danh s ch.
H m Search n u t m th y x trong danh s ch th tr v a ch ca nt c tr
b ng x trong danh s ch, n u khng c th tr v tr NULL.
NODEPTR Search(NODEPTR First, int x)
{
NODEPTR p;

K thu t l p tr nh

102

p = First;
while(p != NULL && p->info != x )
p = p->next;
return (p);
}
II.5. Sp x p (Selection_Sort): s p x p danh s ch li n k t theo th t info t ng
d n.
- Ni dung: Ta so s nh t t c c c ph n t ca danh s ch chn ra mt
ph n t nh nh t a v u danh s ch; sau , ti p tc chn ph n t nh nh t
trong c c ph n t cn l i a v ph n t th hai trong danh s ch. Qu tr nh
n y l p l i cho n khi chn ra c ph n t nh th (n-1).
- Gi i thu t:
void Selection_Sort(NODEPTR First)
{ NODEPTR p, q, pmin;
int min;
for(p = First; p->next != NULL; p = p->next)
{
min = p->info;
pmin = p;
for(q = p->next; q != NULL; q = q->next)
if(min > q->info)
{
min = q->info;
pmin = q;
}
// hoan doi truong info cua hai nut p va pmin
pmin->info = p->info;
p->info = min;
}
}

K thu t l p tr nh

103

B i t p:
1. Vi t chng tr nh t o mt menu thc hi n c c cng vi c sau:
a. Nh p danh s ch li n k t theo gi i thu t th m v u danh s ch, mi ph n t
gm c c c thng tin sau: mssv (int), v hoten ( char hoten[30] ).
b. Li t k danh s ch ra m n h nh
c. Cho bi t tng s nt trong danh s ch li n k t, t t n h m l Reccount
( int Reccount(NODEPTR First) )
d. Th m 1 ph n t c ni dung info (mssv, hoten) v o sau ph n t c th t
th i trong danh s ch.
Ghi ch: - Th t theo qui c b t u l 1
- N u (i = 0) th m v o u danh s ch
N u i > Reccount(&First) th th m v o cui danh s ch.
e. In ra h t n ca sinh vi n c m do ta nh p v o.
f. Lo i b nt c m do ta nh p v o, trc khi xa hi l i "B n th t s mun
xa (Y/N) ? "
g. S p x p l i danh s ch theo th t m s gi m d n.
h.Ghi to n b danh s ch v o file t n 'DSSV.DAT'
i. N p danh s ch t file 'DSSV.DAT' v o danh s ch li n k t. N u trong danh
s ch li n k t c nt th xa t t c d li u hi n c trong danh s ch li n k t
trc khi a d li u t file v o.
2. Vi t chng tr nh t o mt danh s ch li n k t theo gi i thu t th m v o cui
danh s ch, mi nt cha mt s nguy n.
3. -Vi t h m t n Delete_Node xa nt c a ch p.
- Vi t mt h m lo i b t t c c c nt c ni dung x trong danh s ch li n k t
First.
4. Vi t h m Copy_List tr n danh s ch li n k t t o ra mt danh s ch li n k t
mi ging danh s ch li n k t c.
5. Ghp mt danh s ch li n k t c a ch u l First2 v o mt danh s ch li n
k t c a ch u l First1 ngay sau ph n t th i trong danh s ch li n k t
First1.
6. Vi t h m lc danh s ch li n k t tr nh trng hp c c nt trong danh s ch
li n k t b trng info.
7. o ngc vng li n k t ca mt danh s ch li n k t sao cho:
- First s ch n ph n t cui
- Ph n t u c li n k t l NULL.

K thu t l p tr nh

104

8. Vi t h m Left_Traverse (NODEPTR &First) duy t ngc danh s ch li n


k t.
9. Vi t gi i thu t t ch mt danh s ch li n k t th nh hai danh s ch li n k t, trong
mt danh s ch li n k t cha c c ph n t c s th t l v mt danh s ch
li n k t cha c c ph n t c s th t ch n trong danh s ch li n k t c.
10.- T o mt danh s ch li n k t cha t n hc vi n, i m trung b nh, h ng ca
hc vi n (vi i u ki n ch nh p t n v i m trung b nh). Qu tr nh nh p s
dng l i khi t n nh p v o l rng.
- X p h ng cho c c hc vi n. In ra danh s ch hc vi n th t h ng t ng d n
(Ghi ch : Cng i m trung b nh th cng h ng).
11. Nh p hai a thc theo danh s ch li n k t. In ra t ch ca hai a thc n y.
V d: a thc First1 : 2x5+4x2-1
a thc First2 : 10x7-3x4+x2
K t qu in ra : 20x12 + 34x9 - 8x7 - 12x6 + 7x4 - x2
(Ghi ch : Khng nh p v in ra c c s h ng c h s b ng 0)
12. Vi t gi i thu t th m ph n t c ni dung x v o danh s ch li n k t c th t
t ng d n sao cho sau khi th m danh s ch li n k t v n c th t t ng.
13. Lo i b ph n t c ni dung l x trong danh s ch li n k t c th t t ng d n.
14. Cho 2 danh s ch li n k t First1, First2 c th t t ng d n theo info. Vi t gi i
thu t Merge trn 2 danh s ch li n k t n y l i sao cho danh s ch li n k t
sau khi trn cng c th t t ng d n.

105

K thu t l p tr nh

CHNG 6

cc thut ton trn cu trc cY


(Tree)

C y l mt c u trc d li u r t thng dng v quan trng trong nhi u ph m


vi kh c nhau ca k thu t m y t nh.
V d : T chc c c quan h h h ng trong mt gia ph , mc lc ca mt
cun s ch, x y dng c u trc v c ph p trong c c tr nh bi n dch.
Trong chng tr nh n y, chng ta kh o s t c c kh i ni m c b n v c y, c c
php to n tr n c y nh ph n, cng nh c c php to n tr n c y nh ph n c n b ng
( AVL tree) v ng dng ca hai lo i c y nh ph n t m ki m (BST), c y nh ph n
c n b ng ( AVL tree).
I. Phn loi cy:
I.1. Mt s khi ni m c bn:
1. Cy: C y l t p hp c c ph n t gi l nt, mt nt (tng t nh mt
ph n t ca d y) c th c ki u b t k. C c nt c bi u di n bi 1 k t ch,
mt chui, mt s ghi trong mt vng trn.
Mt s nh ngh a theo quy
( Mt nt n cng ch nh l mt c y.
( C c nt c gi l cng mt c y khi c ng i gia c c nt n y.
( Mt c y s bao gm mt nt gc (Root) v m c y con, trong mi c y con
l i c mt nt gc v m1 c y con nh hn v.v.
( Mt c y khng c mt nt n o c gi l c y rng.
V d 1 :
Nut goc

H nh 5.1. C y vi nt gc l A

- A l nt gc vi 3 c y con l n
lt c 3 nt gc ri ng l B, C, D
- Nt cha (ancestor)
Nt con (descendent)
A l nt cha ca B, C, D
G, H l nt con ca C
G, H khng quan h cha con
vi A

106

K thu t l p tr nh

V d 2 : Vi cng mt mn hc T, ta c th bi u di n d ng c y nh
sau :

T
CHNG I

I.1

I.2

CHNG II

II.1

II.1.1

II.2

CHNG III

II.3

II.1.2

CHNG I
I.1
I.2
CHNG II
II.1
II.1.1
II.1.2
II.2
II.3

H nh 5.2

CHNG III
2. Nt cha (Ancestor) : Nt ng tr n ca mt nt c gi l nt cha
C l nt cha ca G, H
Nt con (descendent) : Nt ng sau mt nt kh c c gi l nt con ca
nt .
Nt I, J, K l nt con ca nt E
3. Bc (degree) :
- B c ca nt l s c y con ca nt .
C c b c l 2, E c b c l 3 (H nh 5.1)
- B c ca c y l b c ln nh t ca c c nt trong c y.
C y trong h nh 5.1 c b c l 3.
C y b c n c gi l c y n ph n nh c y nh ph n, c y tam ph n.
4. Nt l v nt trung gian:
- Nt l l nt c b c b ng 0 (tc l khng c c y con n o) :
- Nt trung gian: l mt nt c b c kh c 0 v khng ph i l nt gc.
V d : Trong h nh 5.1, B, G, H, I, J, K, F l nt l
C, D, E l nt trung gian.
5. Mc ca nt (level) : Nt gc c mc l 1
Mc ca nt con = mc ca nt cha + 1

107

K thu t l p tr nh

V d : trong h nh 5.1,
A
c mc l 1
B, C, D
c mc l 2
G, H, E, F c mc l 3
I, J, K
c mc l 4
6. Chi u cao ca cy (height) : l mc ln nh t ca c c nt l trong c y.
V d : C y trong h nh 5.1 c chi u cao l 4
7. Th t ca cc nt (order of nodes) : N u c y c gi l c th t th
ph i m b o v tr ca c c nt con t tr i qua ph i, tc l n u thay i v tr ca
mt nt con b t k th ta c mt c y mi.
V d :

A
cay khac

H nh 5.3: Sau khi i v tr ca 2 nt B, C ta c c y mi.


8. Chi u di ng i (Path length):
- Chi u d i ng i ca nt x: l s c c c nh i t nt gc n nt x.
V d : Trong h nh 5.1:
Nt gc A c chi u d i ng i l 1
Nt B, C, D c chi u d i ng i l 2
Tng qu t: mt nt t i mc i c chi u d i ng i l i
- Chi u d i ng i ca c y: l tng ca c c chi u d i ng i ca t t c
c c nt trong c y.
V d : Chi u d i ng i ca c y trong h nh 5.1 l 31.
Chi u d i ng i trung b nh ca c y:

P i = ( n i .i ) / n
i

trong ni l s c c nt mc i v n l tng s c c nt trong c y.


I.2. Cch bi u di n cy: bi u di n 1 c y, ta c nhi u c ch nh bi u di n
b ng th,b ng gi n , b ng ch s.. Nhng thng thng, ta hay dng d ng
th bi u di n 1 c y nh h nh 5.1
I.3. Bi u di n th t cc nt trong cy :

108

K thu t l p tr nh

Mt c y thng t chc c c nt theo mt th t nh t nh c n c v o mt


ni dung gi l kha ca c c nt. C th t chc c y c kha t ng d n theo mc
t tr i qua ph i nh v d sau :
Root

ROOT %1%2%3%4%5%6%7%8%9

Nh v y khi duy t l i c y theo mc


t ng d n v t tr i qua ph i ta s l i
c c th t c c nt nh tr n.

3
4
6

5
7

H nh 5.4. C y c th t t ng d n theo mc t tr i qua ph i


II. Cy nh phn (Binary tree)
II.1. nh ngh a :
1. Cy nh phn l c y c b c b ng 2, tc l s nt con ti a ca mt nt
b t k trong c y l 2.
C y nh ph n c th l mt c y rng (khng c nt n o) ho c c y ch c
mt nt, ho c c y ch c c c nt con b n tr i (Left Child) ho c nt con b n ph i
(Right Child) ho c c hai.
V d : H nh 5.4 l c y nh ph n.
2. Cc cy nh phn c bi t:
- C y nh ph n ng: Mt c y nh ph n c gi l c y nh ph n ng n u
nt gc v t t c c c nt trung gian u c 2 nt con.

A
B
D

C
E

X
Y

F
H

H nh 5.5. C y nh ph n ng

109

K thu t l p tr nh

Ghi ch: n u c y nh ph n ng c n nt l th c y n y s c t t c 2n-1 nt.


- C y nh ph n y: Mt c y nh ph n gi l c y nh ph n y vi chi u cao
d th :
. N ph i l c y nh ph n ng v
. T t c c c nt l u c mc l d.
H nh 5.5 khng ph i l c y nh ph n y
A
B

C
E

D
I

F
K

H nh 5.6. C y nh ph n y.
Ghi ch: C y nh ph n y l c y nh ph n c s nt ti a mi mc.
- C y nh ph n t m ki m (Binary Search Tree): Mt c y nh ph n gi l c y
nh ph n t m ki m n u v ch n u i vi mi nt ca c y th kha ca mt nt
b t k ph i ln hn kha ca t t c c c nt trong c y con b n tr i ca n v ph i
nh hn kha ca t t c c c nt trong c y con b n ph i ca n.
V d :

k1 <k1 <k1

8
7

3
2
1

11
5

10
6

H nh 5.7. C y nh ph n t m ki m (BST)

12

110

K thu t l p tr nh

- C y nh ph n c n b ng (AVL): Mt c y nh ph n c gi l c y nh ph n
c n b ng n u v ch n u i vi mi nt ca c y th chi u cao ca c y con b n
tr i v chi u cao ca c y con b n ph i hn km nhau nhi u nh t l 1. (Theo
Adelson-Velski v Landis).
A

C
D

E
G

H nh 5.8. C y nh ph n c n b ng
- C y nh ph n c n b ng ho n to n: Mt c y nh ph n c gi l c y nh
ph n c n b ng ho n to n n u v ch n u i vi mi nt ca c y th s nt ca
c y con b n tr i v s nt ca c y con b n ph i hn km nhau nhi u nh t l 1.
A

B
E

C
D

E
H

H nh5.9. C y nh ph n c n b ng ho n to n
3. Cc php duy t cy nh phn (Traverse) : l qu tr nh i qua c c nt
ng mt l n. Khi duy t c y, ta thng dng 3 c ch duy t c b n sau :
' Preorder - Ti n t (NLR) duy t qua nt gc trc, sau i qua c y con
b n tr i l i p dng Preorder cho c y con b n tr i. Cui cng qua c y con b n
ph i, p dng Preorder cho c y con b n ph i.
V d : Theo c y nh ph n 5.4, ta c:
ROOT % 1 % 2 % 3 % 4 % 6 % 7 % 5 % 8 % 9
'Inorder - Trung t (LNR) : qua c y con b n tr i duy t trc (theo th t
LNR), sau th m nt gc. Cui cng qua c y con b n ph i (theo th t LNR)
V d: Theo c y nh ph n 5.4, ta c:
ROOT % 2 % 1 % 6 % 4 % 7 % 3 % 8 % 5 % 9
'Postorder - H u t (LRN) : qua c y con b n tr i duy t trc (theo th t
LRN), sau qua c y con b n ph i (theo th t LRN). Cui cng th m nt gc.
V d: Theo c y nh ph n 5.4, ta c:
ROOT % 2 % 6 % 7 % 4 % 8 % 9 % 5 % 3 % 1

K thu t l p tr nh

111

Ghi ch : i vi c y ta c th t chc th t theo kha l mt ni dung


ca nt ho c ta t th m 1 field gi l kha ca nt .
II.2. Cc php ton tr n cy nh phn:
- Khai bo: t chc d li u theo c y nh ph n, ta c th dng mt ni
dung ca d li u l m kha s p x p v t chc c y theo nhi u c ch kh c nhau.
Nhng thng thng thu n ti n cho vi c t m ki m v thc hi n c c php to n
kh c tr n c y, ngi ta t o th m mt kha ri ng trong c c ph n t v t o ra c y
nh ph n t m ki m.
khai b o bi n tree qu n l mt c y nh ph n, vi ni dung info cha s
nguy n, ta khai b o nh sau:
struct nodetype
{
int key;
int info;
struct nodetype *left;
struct nodetype *right;
};
typedef struct nodetype *NODEPTR;
NODEPTR tree;
1. To cy:
a. Khi t o c y(Initialize): dng khi ng c y nh ph n, cho chng
tr nh hi u l hi n t i c y nh ph n rng.
void Initialize(NODEPTR &root)
{
root = NULL;
}
Li gi h m: Initialize(tree);
b. C p ph t vng nh (New_Node): c p ph t mt nt cho c y nh ph n.
H m New_Node n y tr v a ch ca nt va c p ph t.
NODEPTR New_Node(void)
{
NODEPTR p;
p = (NODEPTR)malloc(sizeof(struct nodetype));
return(p);
}
Li gi h m: p= New_Node();

K thu t l p tr nh

112

c. T o c y BST (Create_Tree): Trong gi i thu t t o c y BST, ta c dng


h m Insert.
H m Insert: dng phng ph p qui th m nt c kha x, ni dung a v o
c y c nt gc root . C y nh ph n t o c qua gi i thu t Create_Tree l c y
nh ph n t m ki m (BST).
void Insert(NODEPTR root, int x, int a)
{ NODEPTR p;
if(x == root->key)
// kha b trng, dng chng tr nh
{
printf("bi trung khoa, khong them nut nay duoc");
return;
}
if(x < root->info && root->left == NULL) // i u ki n dng gi i thu t qui
{
p = New_Node();
// c p ph t vng nh
p->key =x;
p->info = a;
p->left = NULL;
p->right = NULL;
root->left=p;
return;
}
if(x > root->info && root->right == NULL) //i u ki n dng gi i thu t qui
{
p = New_Node();
p->key =x;
p->info = a;
p->left = NULL;
p->right = NULL;
root->right=p ;
return;
}
if(x < root->info)
// bc qui
Insert(root->left, x,a);
// gi qui qua nh nh tr i
else
Insert(root->right, x,a); // gi qui qua nh nh ph i
}

K thu t l p tr nh

113

void Create_Tree(NODEPTR &root)


{ int khoa, noidung;
char so[10];
NODEPTR p;
do
{ printf("Nhap khoa :");
gets(so) ;
khoa = atoi(so);
if (khoa !=0)
{ printf("Nhap noi dung :");
gets(so) ;
noidung = atoi(so);
if (root==NULL)
{ p = New_Node();
p->key = khoa;
p->info = noidung;
p->left = NULL;
p->right = NULL;
root =p;
}
else Insert(root,khoa,noidung);
}
} while (khoa!=0);
// kha =0 th dng nh p
}
Ghi ch : t o c y nh ph n do bi n tree qu n l, ta gi:
Create_Tree(tree);
2. Cp nht cy:
a. Gi i phng vng nh(Free_Node): gi i phng vng nh m p ang tr n.
void Free_Node(NODEPTR p)
{
free(p);
}
Li gi h m: Free_Node (p);
b. Ki m tra c y nh ph n rng hay khng (Empty): h m Empty tr v
TRUE n u c y nh ph n rng, v ngc l i.
int Empty(NODEPTR root)
return(root == NULL ? TRUE : FALSE);
}

114

K thu t l p tr nh

Li gi h m: Empty(tree)
c. Hy b mt nt trong c y nh ph n BST (Remove):
Xa nt c kha l x trong c y nh ph n t m ki m sao cho sau khi xa th
c y nh ph n v n l c y nh ph n t m ki m. Ta c 3 trng hp :
- Trng hp 1: nt p c n xa l nt l . Vi c xa nt p ch n gi n l hy
nt p
p1

p1

p1

p1

- Trng hp 2: Nt p c n xa c 1 c y con, th ta cho rp ch ti nt p. Sau


, ta t o li n k t t nt cha ca p ti nt con ca rp, cui cng hy nt p.
10

p
rp

5
3

10

xoa nut p
15

12

20

15
20

12

H nh 5.10. Xa nt p trong trng hp nt n y c 1 c y con b n tr i.


10
5

10

xoa nut p
5

15

20

rp

3
2

18

18

20
25

25

H nh 5.11. Xa nt p trong trng hp nt n y c 1 c y con b n ph i.


- Trng hp 3: Nt p c n xa c 2 c y con. Ta cho rp ch ti nt p. Do t nh
ch t nt cc tr i ca c y con b n ph i ca p c kha va ln hn kha ca p,
n n lo i p th ta s cho r ch ti nt cc tr i . Sau , ta sao chp ni dung

115

K thu t l p tr nh

v kha ca nt r v o nt m rp ang ch ti. Ta t o li n k t th ch hp bt nt


rp ra khi c y nh ph n v cui cng xa nt rp.
10

10

20
15
12

25

5
15

30
18

25
r

nut trai nhat cua


ca y con ben phai

35

12

30
18

28

35

28

H nh 5.12. Xa nt p trong trng hp nt n y c 2 c y con.


H m Remove xa nt c kha l x:
NODEPTR rp;
void remove_case_3 ( NODEPTR &r )
{
if (r->left != NULL)
remove_case_3 (r->left);
//den day r la nut cuc trai cua cay con ben phai co nut goc la rp}
else
{
rp->key = r->key;
//Chep noi dung cua r sang rp ";
rp->info =r->info;
// de lat nua free(rp)
rp = r;
r = r->right;
}
}
void remove (int x , NODEPTR &p )
{
if (p == NULL) printf ("Khong tm thay");
else
if (x < p->key) remove (x, p->left);
else if (x > p->key)

K thu t l p tr nh

116

remove (x, p->right);


else // p^.key = x
{
rp = p;
if (rp->right == NULL) p = rp->left;
// p l nt l hoac la nut chi co cay con ben trai
else if (rp->left == NULL)
p = rp->right; // p l nut co cay con ben phai
else remove_case_3 (rp->right);
free (rp);
}
}
Li gi h m: Remove(x, tree); // x l kha ca nt mun xa
d. T m ki m (Search): T m nt c kha b ng x tr n c y nh ph n BST c
gc l root. N u t m th y x trong c y th tr v a ch ca nt c tr b ng x trong
c y, n u khng c th tr v tr NULL.
Do c y nh ph n l BST n n ta c th t m ki m nhanh b ng phng ph p
t m ki m nh ph n.
NODEPTR Search(NODEPTR root, int x)
{
NODEPTR p;
p = root;
while(p != NULL && x!=p->key)
if(x < p->key)
p = p->left;
else
p = p->right;
return(p);
}
Li gi h m: p=Search(tree, x);
3. Cc php duy t cy: C 3 c ch duy t c b n l NLR, LNR, LRN v
mt c ch c bi t l duy t c y theo mc. y, ta ch xt 3 phng ph p duy t
NLR, LNR v LRN. Xt c y sau :

117

K thu t l p tr nh

4
2
1

5
3

a. Duy t cy theo th t NLR (Preorder):


void Preorder (NODEPTR root)
{ if(root != NULL)
{ printf("%d ", root->info);
Preorder(root->left);
Preorder (root->right);
}
}
b. Duy t cy theo th t LNR (Inorder):
void Inorder(NODEPTR root)
{ if(root != NULL)
{ Inorder(root->left);
printf("%d ", root->info);
Inorder(root->right);
}
}
c. Duy t cy theo th t LRN (Posorder):
void Posorder(NODEPTR root)
{ if(root != NULL)
{ Posorder(root->left);
Posorder(root->right);
printf("%d ", root->info);
}
}
III. cy nh phn TM KIM cn bng (AVL):
Chng ta t o c y nh ph n t m ki m mc ch l t m kha cho nhanh, tuy
nhi n t ng tc t m ki m th c y c n ph i c n i v 2 nh nh theo tng nt
trong c y. Do v y, ta s t m c ch t chc l i c y BST sao cho n c n b ng.

118

K thu t l p tr nh

III.1. nh ngh a:
- C y nh ph n t m ki m c n b ng (AVL) l c y nh ph n t m ki m m t i
t t c c c nt ca n chi u cao ca c y con b n tr i ca n v chi u cao ca c y
con b n tr i ch nh l ch nhau khng qu mt.
10

20
8

30

15
12

18

25

40

H nh 5.14. C y nh ph n t m ki m c n b ng
Lu : Vi c y AVL, vi c th m v o hay lo i b 1 nt tr n c y c th l m
c y m t c n b ng, khi ta ph i c n b ng l i c y. Tuy nhi n vi c c n b ng l i
tr n c y AVL ch x y ra ph m vi cc b b ng c ch xoay tr i ho c xoay ph i
mt v i nh nh c y con n n gi m thi u chi ph c n b ng.
- Ch s cn bng (balance factor) ca mt nt p tr n c y AVL= lh(p) - rh(p)
Trong :
lh (p) l chi u cao ca c y con b n tr i ca p
rh(p) l chi u cao ca c y con b n ph i ca p
Ta c c c trng hp sau:
bf(p) = 0 n u lh(p) = rh(p)
bf(p) = 1 n u lh(p) = rh(p) +1
bf(p) = -1 n u lh(p) = rh(p) -1

nt p c n b ng
nt p b l ch v tr i
nt p b l ch v ph i

-1
A

0
U1

0
U2

U3

U4
U5

0
U6

U7

B
U8

-1

0
BB

B
U9

0
U10 U11

U12

H nh 5.15. Minh ha c c v tr c th th m nt l v o c y AVL, khi th m nt l


v o 1 trong c c v tr B th c y v n c n b ng, khi th m nt l v o 1 trong c c v

K thu t l p tr nh

119

tr U th c y s m t c n b ng. C c s tr n c y l ch s c n b ng ca c c nt
trc khi th m nt
III.2. Cc php ton tr n cy AVL:
* Khai bo: Ta khai b o c y AVL vi mi nt c th m trng bf cho bi t
ch s c n b ng ca nt .
struct nodetype
{
int key;
int info;
int bf;
struct nodetype *left, *right;
};
typedef struct nodetype *NODEPTR;
III.2.1. Th m nt:
- Ni dung: Th m 1 nt c kha x, ni dung a v o c y nh ph n t m ki m
c n b ng sao cho sau khi th m th c y nh ph n v n l c y nh ph n t m ki m c n
b ng.
- Gi i thu t:
& Th m nt v o c y nh b nh thng, ngh a l nt va th m s l nt l .
& T nh l i ch s c n b ng ca c c nt c b nh hng
& Ki m tra xem c y c b m t c n b ng hay khng? N u c y b m t c n
b ng th ta c n b ng l i c y.
* Trc h t, ta hy xt xem cc trng hp no khi th m nt lm cy b
mt cn bng.
Xem c y h nh 5.15, ta nh n th y:
- N u th m nt v o 1 trong 6 v tr B tr n c y th c y v n c n b ng.
- N u th m nt v o 1 trong c c v tr U1%U12 tr n c y th c y s m t
c n b ng.
+ Th m c c nt v o sau b n tr i ca nt A (cfA = 1) th c y s b
m t c n b ng v nt A ang b l ch tr i. l c c v tr U1, U2, U3, U4.
+ Th m c c nt v o sau b n ph i ca nt C (cfC = -1) th c y s b
m t c n b ng v nt C ang b l ch ph i. l c c v tr U9, U10, U11, U12.
Tm l i: Ta c 2 trng hp khi th m nt x vo cy AVL lm cy mt
cn bng, l th m cc nt vo sau b n tri ca nt c cf = 1, v th m cc nt
vo sau b n phi ca nt c cf = -1.

120

K thu t l p tr nh

* Cn bng li cy: Gi ya l nt trc g n nh t b m t c n b ng khi th m


nt x v o c y AVL. Do c 2 trng hp b m t c n b ng khi th m nt x l tng
t nhau n n ta ch xt trng hp bfya=1 v nt l th m v o l nt sau b n tr i
ca nt ya.
1 ya
S 0
T1
chieu
cao
n

T2
chieu
cao
n

T3
chieu
cao
n

H nh 5.16. Nh nh c y con nt gc ya trc khi th m nt.


Nh n xt:
- V nt ya c bfya = 1 n n nt ya ch c ch n c nt con b n tr i s vi bfs = 0
- V ya l nt g n nh t c bf l 1 n n nt s v c c nt trc kh c ca nt x
(s th m v o) c bf l 0.
-cao (T1) = cao(T2) = cao(T3)
Trng hp 1a: N u th m nt mi x v o v tr nt sau b n tr i ca s (thuc
nh nh T1) ta xoay ph i quanh nt ya
- Nt s s l nt gc mi ca nh nh c y n y vi bfs = 0
- Nt ya l nt con b n ph i ca s vi bfya = 0.
S

2 ya
S 1
T1
chieu
sa u
n

T2
chieu
sa u
n

T3 xoay pha i
chieu quanh nut ya
sa u
n

T1
chieu
sa u
n
x

0
0 ya
T2
chieu
sa u
n

T3
chieu
sa u
n

H nh 5.17. Xoay ph i quanh nt ya c n b ng l i c y.

121

K thu t l p tr nh

Trng hp 1b: N u th m nt mi x v o v tr nt sau b n ph i ca s (thuc


nh nh T2) ta xoay 2 l n (xoay kp): xoay tr i quanh nt s v xoay ph i quanh
nt ya
- Nt p s l nt gc mi ca nh nh c y n y vi bfp = 0
- Nt ya l nt con b n ph i ca p vi bfya = -1
- Nt s l nt con b n tr i ca p vi bfs = 0
2 ya
S -1
p
T1
1
chieu
sau
T2-1
T2-2
n
chieu
chieu
sau
sau
n-1
n-1

Cy AVL sau khi thm nt x

T3
chieu
sau
n

p
xoay trai

S 0

quanh nut S
T1
chieu
sau
n

T2-1
chieu
sau
n-1
x

2
2
T2-2
chieu
sau
n-1

ya
T3
chieu
sau
n

122

K thu t l p tr nh

S 0
xoay phai
quanh nut ya

T1
chieu
sau
n

-1
T2-1 T2-2
chieu chieu
sau
sau
n-1
n-1

ya
T3
chieu
sau
n

H nh 5.18. Xoay kp (xoay tr i quanh nt s, xoay ph i quanh nt ya) c n


b ng l i c y.
B ng sau y ph n bi t c c trng hp c y b m t c n b ng khi th m nt v
c c php xoay c y tng ng c n b ng l i c y:
Trng hp Trc khi th m Sau khi th m
nt x
nt x
1.a
1.b

2.a
2.b

bfya = 1
bfs = 0
bfya = 1
bfs = 0

bfya = 2
bfs = 1
bfya = 2
bfs = -1

bfya = -1
bfs = 0
bfya = -1
bfs = 0

bfya = -2
bfs = -1
bfya = -2
bfs = 1

Cc php xoay cy v ch
s cn bng mi
Xoay phi quanh nt ya
bfs=0, bf ya = 0
Xoay kp
1. Xoay tr i quanh nt s
2. Xoay ph i quanh nt ya
bfs=0, bf ya = -1
Xoay tri quanh nt ya
bfs=0, bf ya = 0
Xoay kp
1. Xoay ph i quanh nt s
2. Xoay tr i quanh nt ya
bfs=0, bf ya = 1

- Gi i thu t:
! Php xoay tr i (Rotate_Left): xoay tr i c y nh ph n t m ki m c nt
gc l root, y u c u root ph i c nt con b n ph i (gi l nt p). Sau khi xoay
tr i th nt p tr th nh nt gc, nt gc c tr th nh nt con b n tr i ca nt gc
mi.
Php xoay tr i tr v con tr ch nt gc mi.

K thu t l p tr nh

123

NODEPTR Rotate_Left(NODEPTR root)


{
NODEPTR p;
if(root == NULL)
printf("Khong the xoay trai vi cay bi rong.");
else
if(root->right == NULL)
printf("Khong the xoay trai vi khong co nut con ben phai.");
else
{
p = root->right;
root->right = p->left;
p->left = root;
}
return p;
}
! Php xoay ph i (Rotate_Right): xoay ph i c y nh ph n t m ki m c nt
gc l root, y u c u root ph i c nt con b n tr i (gi l nt p). Sau khi xoay
ph i th nt p tr th nh nt gc, nt gc c tr th nh nt con b n ph i ca nt
gc mi.
Php xoay ph i tr v con tr ch nt gc mi.
NODEPTR Rotate_Right(NODEPTR root)
{
NODEPTR p;
if(root == NULL)
printf("Khong the xoay phai vi cay bi rong.");
else
if(root->left == NULL)
printf("Khong the xoay phai vi khong co nut con ben trai.");
else
{
p = root->left;
root->left = p->right;
p->right = root;
}
return p;
}

K thu t l p tr nh

124

!Th m nt (Insert): th m nt c kha x, ni dung a v o c y AVL:


- Th m nt theo gi i thu t th m nt v o c y nh ph n t m ki m .
- C n b ng l i c y b ng c ch xoay n hay xoay kp
void Insert(NODEPTR &pavltree, int x, int a)
{
NODEPTR fp, p, q, // fp l nt cha ca p, q l con ca p
fya, ya,
/* ya l nt trc g n nh t c th m t c n b ng
fya l nt cha ca ya */
s;
// s l nt con ca ya theo hng m t c n b ng
int imbal;
/* imbal = 1 n u b l ch v nh nh tr i
= -1 n u b l ch v nh nh ph i */
// Khi ng c c gi tr
fp = NULL;
p = pavltree;
fya = NULL;
ya = p;
// tim nut fp, ya va fya, nut moi them vao la nut la con cua nut fp
while(p != NULL)
{
if(x == p->info) // bi trung noi dung
return;
if (x < p->info)
q = p->left;
else
q = p->right;
if(q != NULL)
if(q->bf != 0) // truong hop chi so can bang cua q la 1 hay -1
{
fya = p;
ya = q;
}
fp = p;
p = q;
}
// Them nut moi (nut la) la con cua nut fp
q = New_Node();
// c p ph t vng nh
q->key =x;
q->info = a;
q->bf = 0;
q->left = NULL;

K thu t l p tr nh

125

q->right = NULL;
if(x < fp->info)
fp->left = q;
else
fp->right = q;
/* Hieu chinh chi so can bang cua tat ca cac nut giua ya va q, neu bi lech
ve phia trai thi chi so can bang cua tat ca cac nut giua ya va q deu la
1, neu bi lech ve phia phai thi chi so can bang cua tat ca cac nut giua
ya va q deu la -1 */
if(x < ya->info)
p = ya->left;
else
p = ya->right;
s = p; // s la con nut ya
while(p != q)
{
if(x < p->info)
{
p->bf = 1;
p = p->left;
}
else
{
p->bf = -1;
p = p->right;
}
}
// xac dinh huong lech
if(x < ya->info)
imbal = 1;
else
imbal = -1;
if(ya->bf == 0)
{
ya->bf = imbal;
return;
}
if(ya->bf != imbal)
{

K thu t l p tr nh

ya->bf = 0;
return;
}
if(s->bf == imbal) // Truong hop xoay don
{
if(imbal == 1) // xoay phai
p = Rotate_Right(ya);
else
// xoay trai
p = Rotate_Left(ya);
ya->bf = 0;
s->bf = 0;
}
else
// Truong hop xoay kep
{
if(imbal == 1) // xoay kep trai-phai
{
ya->left = Rotate_Left(s);
p = Rotate_Right(ya);
}
else
// xoay kep phai-trai {
ya->right = Rotate_Right(s);
p = Rotate_Left(ya);
}
if(p->bf == 0) // truong hop p la nut moi them vao
{
ya->bf = 0;
s->bf = 0;
}
else
if(p->bf == imbal)
{
ya->bf = -imbal;
s->bf = 0;
}
else
{
ya->bf = 0;
s->bf = imbal;
}

126

K thu t l p tr nh

p->bf = 0;
}
if(fya == NULL)
pavltree = p;
else
if(ya == fya->right)
fya->right = p;
else
fya->left = p;
}
* t o c y nh ph n t m ki m c n b ng, ta s dng gi i thu t sau:
void Create_AVLTree(NODEPTR &root)
{ int khoa, noidung;
char so[10];
NODEPTR p;
do
{ printf("Nhap khoa :");
gets(so) ;
khoa = atoi(so);
if (khoa !=0)
{ printf("Nhap noi dung :");
gets(so) ;
noidung = atoi(so);
if (root==NULL)
{ p = New_Node();
p->key = khoa;
p->info = noidung;
p->bf = 0 ;
p->left = NULL;
p->right = NULL;
root =p;
}
else Insert(root,khoa,noidung);
}
} while (khoa!=0);
// kha =0 th dng nh p
}
Ghi ch : t o c y nh ph n do bi n tree qu n l, ta gi:
Create_AVLTree(tree);

127

K thu t l p tr nh

128

III.2.2. Cp nht cy:


1. T m ki m (Search): T m nt c kha b ng x tr n c y nh ph n AVL c
gc l root. N u t m th y x trong c y th tr v a ch ca nt c tr b ng x
trongc y, n u khng c th tr v tr NULL.
Do AVL l c y nh ph n BST n n ta c th t m ki m nhanh b ng phng
ph p t m ki m nh ph n, v do t nh ch t lc n y c y c n b ng n n thi gian t m
ki m s nhanh hn r t nhi u.
NODEPTR search(NODEPTR root, int x)
{
NODEPTR p;
p = root;
while(p != NULL && x!=p->key)
if(x < p->key)
p = p->left;
else
p = p->right;
return(p);
}
2. Xa nt: Remove(root, x):
- Ni dung: xa nt c kha x tr n c y AVL vi a ch sao u root sao
cho sau khi xa th c y v n l AVL.
- Gi i thu t:
N u root == NULL th Thngb o ("Khng th xa c nt x tr n c y")
N u root != NULL th
N u x< root->info th :
+ Gi qui xa nt x nh nh b n tr i ca root :
Remove(root->left, x)
+ Gi balance_left c n b ng l i c y nt gc root n u nh nh c y
con b n tr i b gi m cao.
N u x > root->info th :
+ Gi qui xa nt x nh nh b n ph i ca root :
Remove(root->right, x)
+ Gi balance_right c n b ng l i c y nt gc root n u nh nh c y
con b n ph i b gi m cao.
N u x==root->info th :
Xa nt root nh php to n xa tr n c y nh ph n BST.
- Chng tr nh : t c i t.

K thu t l p tr nh

129

III.2.3. Cc php duy t cy:


Do c y AVL cng l c y nh ph n n n ta s p dng l i c c phng ph p
duy t Preorder, Inorder v Postorder v o c y AVL.
a. Duy t cy theo th t NLR (Preorder):
void Preorder (NODEPTR root)
{
if(root != NULL)
{
printf("%d ", root->info);
Preorder(root->left);
Preorder (root->right);
}
}
b. Duy t cy theo th t LNR (Inorder):
void Inorder(NODEPTR root)
{
if(root != NULL)
{
Inorder(root->left);
printf("%d ", root->info);
Inorder(root->right);
}
}
c. Duy t cy theo th t LRN (Posorder):
void Posorder(NODEPTR root)
{
if(root != NULL)
{
Posorder(root->left);
Posorder(root->right);
printf("%d ", root->info);
}
}

130

K thu t l p tr nh

B i t p:
1. Vi t l i c c chng tr nh duy t c y nh ph n theo phng ph p khng qui.
2. Vi t chng tr nh t o mt menu thc hi n c c mc sau:
a. T o c y nh ph n t m ki m vi ni dung l s nguy n (khng trng nhau).
b. Li t k c y nh ph n ra m n h nh theo th t NLR
c. m tng s nt, s nt l , v s nt trung gian ca c y.
d. T nh cao ca c y.
e. Lo i b nt c ni dung l x trong c y nh ph n BST.
f. Th m nt c ni dung x v o c y nh ph n BST sao cho sau khi th m th c y
v n l BST.
3. Cho mt c y nh ph n tree, h y vi t chng tr nh sao chp n th nh mt
c y mi tree2, vi kha, ni dung, v li n k t ging nh c y tree.
4. Vi t c c h m ki m tra xem c y nh ph n:
a. C ph i l c y nh ph n ng khng.
b. C ph i l c y nh ph n y khng.
5. Vi t h m ki m tra nt x v y c tr n c y hay khng, n u c c x l n y tr n
c y th x c nh nt gc ca c y con nh nh t c cha x v y.
6. Cho mt c y bi u thc, h y vi t h m Calculate (NODEPTR root) t nh gi
tr ca c y bi u thc , bi t r ng c c to n t c dng trong bi u thc l :
+ - * / ^ % !
7. V l i h nh nh c y nh ph n t m ki m, c y nh ph n t m ki m c n b ng n u
c c nt th m v o c y theo th t nh sau:
8

20

11

30

18

8. Nh p v o 1 bi u thc s hc, chuy n bi u thc th nh c y nh ph n, nt


gc l to n t, nt l l c c to n h ng, bi t r ng c c to n t c dng trong
bi u thc l : + - * / ^ % !

131

K thu t l p tr nh

MC LC
CHNG i I CNG V LP TRNH --------------------------------------------------- 1
I. Khi nim thut ton--------------------------------------------------------------------------- 1
I.1. Kh i ni m --------------------------------------------------------------------------------------------------- 1
I.2. C c t nh ch t c trng ca thu t to n ----------------------------------------------------- 1
I.3. Ph n lo i ----------------------------------------------------------------------------------------------------- 1
II. M t thut ton bng lu ---------------------------------------------------- 1
II.1. Lu ------------------------------------------------------------------------------------------------------ 1
II.2. C c k hi u tr n lu --------------------------------------------------------------------------- 1
II.3. Mt s v d biu di n thu t to n b ng lu ---------------------------------------- 2
III. CC NGN NG LP TRNH & CHNG TRNH DCH -------------------- 5
III.1. Ngn ng l p tr nh ---------------------------------------------------------------------------------- 5
III.2. Chng tr nh dch ------------------------------------------------------------------------------------ 6
CHNG 2 LM QUEN VI NGN NG C --------------------------------------------- 7
* Gii thiu ngn ng C ------------------------------------------------------------------------- 7
I. CC KHI NIM C BN---------------------------------------------------------------------------- 7
I.1. C u trc c b n ca mt chng tr nh C -------------------------------------------------- 7
I.2. Ki u d li u c bn ---------------------------------------------------------------------------------- 13
I.3. Bi n ----------------------------------------------------------------------------------------------------------- 14
I.4 H ng----------------------------------------------------------------------------------------------------------- 18
I.5. Php to n -------------------------------------------------------------------------------------------------- 20
* S chuy n ki u----------------------------------------------------------------------------------------- 29
* Mc u ti n ca c c php to n ---------------------------------------------------------- 29
I.6. Chui--------------------------------------------------------------------------------------------------------- 30
II. Cc cu trc iu khin trong C ---------------------------------------------- 33
II.1 C u trc tu n t (Sequence) ------------------------------------------------------------------ 33
II.2. C u trc chn ------------------------------------------------------------------------------------------ 34
II.2.1. L nh if else -------------------------------------------------------------------------------------- 34
II.2.2. L nh switch_case ---------------------------------------------------------------------------- 35
II.3. C u trc l p --------------------------------------------------------------------------------------------- 37
II.3.1. L nh while --------------------------------------------------------------------------------------- 37
II.3.2. L nh do while ---------------------------------------------------------------------------------- 38
II.3.3. L nh for-------------------------------------------------------------------------------------------- 39
* Ph t bi u break, continue, goto -------------------------------------------------------------- 40
B i t p ---------------------------------------------------------------------------------------------------------------- 41

K thu t l p tr nh

132

III. Hm - quy ------------------------------------------------------------------------------------------ 45


III.1. H m-------------------------------------------------------------------------------------------------------- 45
III.2. qui (Recursion) -------------------------------------------------------------------------------- 52
IV. Structure ----------------------------------------------------------------------------------------------- 54
IV.1. nh ngh a------------------------------------------------------------------------------------ 55
IV.2. Khai b o--------------------------------------------------------------------------------------- 55
V. FILE---------------------------------------------------------------------------------------------------------------- 56
V.1. File v n b n--------------------------------------------------------------------------------------------- 56
V.2. File nh ph n (file c c u trc) -------------------------------------------------------------- 61
V.3. Ph t hi n li khi truy xu t t p tin ---------------------------------------------------------- 66
B i t p ---------------------------------------------------------------------------------------------------------------- 67
CHNG 3. CC THUT TON TRN CU TRC D LIU MNG 69
I. Mng khng sp xp v thut ton tm kim ------------------ 69
trn mng cha c th t
I.1. Mt s kh i ni m v m ng ---------------------------------------------------------------------- 69
I.2. Thu t to n t m kim tr n m ng cha c th t -------------------------------------- 71
II. Cc thut ton sp xp ------------------------------------------------------------------- 73
II.1. S p x p theo phng ph p Bubble_Sort ------------------------------------------------ 73
II.2. S p x p theo phng ph p Quick_Sort -------------------------------------------------- 75
III. Tm kim trn mng c th t --------------------------------------------- 79
III.1. T m ki m nhanh b ng phng ph p lp----------------------------------------------- 79
III.2. Php t m ki m nh ph n ------------------------------------------------------------------------ 80
III.3. Php t m ki m nh ph n qui ------------------------------------------------------------- 81
B i t p ---------------------------------------------------------------------------------------------------------------- 82
CHNG 4
CON TR (POINTER) ---------------------------------------------------------- 84
I. NH NGHA ------------------------------------------------------------------------------------------------- 84
I.1. Khai b o---------------------------------------------------------------------------------------------------- 84
I.2. Truy n a ch cho h m --------------------------------------------------------------------------- 85
II Cc php ton trn bin con tr ----------------------------------------------- 85
II.1. To n t a ch & ----------------------------------------------------------------------------------- 85
II.2. To n t ni dung * --------------------------------------------------------------------------------- 85
II.3. Php cng tr bin con tr vi mt s nguy n-------------------------------------- 86
II.4. Php g n v php so s nh ----------------------------------------------------------------------- 86
II.5. S chuy n ki u ---------------------------------------------------------------------------------------- 86
II.6. Khai b o mt con tr h ng v con tr ch n i tng h ng ------------ 87
III. S tng quan gia con tr v mng ----------------------------------- 87

K thu t l p tr nh

133

IV. Con tr v chui-------------------------------------------------------------------------------- 91


IV.1. Khai b o------------------------------------------------------------------------------------------------- 91
IV.2. Xt mt s v d v c c h m x l chui--------------------------------------------- 91
IV.3. M ng con tr ch n chui------------------------------------------------------------------ 93
B i t p ---------------------------------------------------------------------------------------------------------------- 95
CHNG 5
CC THUT TON TRN CU TRC --------------------------- 96
DANH SCH LIN KT (LINKED LIST).
I. Khi nim ---------------------------------------------------------------------------------------------------------------- 96
II. Cc php ton trn danh sch lin kt ----------------------------------- 97
II.1. T o danh s ch ----------------------------------------------------------------------------------------- 97
II.2. C p nh t danh sch --------------------------------------------------------------------------------- 99
II.3. Duy t danh s ch------------------------------------------------------------------------------------ 100
II.4. T m ki m ----------------------------------------------------------------------------------------------- 100
II.5. S p x p -------------------------------------------------------------------------------------------------- 101
B i t p -------------------------------------------------------------------------------------------------------------- 102
CHNG 6 cc thut ton trn cu trc cY--------------------- 104
I. Phn loi cy ---------------------------------------------------------------------------------------- 104
I.1. Mt s kh i ni m c b n ----------------------------------------------------------------------- 104
I.2. C ch bi u di n cy --------------------------------------------------------------------------------- 106
I.3. Bi u di n th t cc nt trong c y--------------------------------------------------------- 106
II. Cy nh phn (Binary tree) ---------------------------------------------------------- 107
II.1. nh ngh a--------------------------------------------------------------------------------------------- 107
II.2. C c php to n trn c y nh ph n ---------------------------------------------------------- 110
1. T o c y-------------------------------------------------------------------------------------------------- 110
2. C p nh t c y ----------------------------------------------------------------------------------------- 112
3. C c php duy t cy ------------------------------------------------------------------------------ 116
III. cy nh phn TM KIM cn bng (AVL) -------------------------------- 117
III.1. nh ngh a ------------------------------------------------------------------------------------------- 117
III.2. C c php to n trn c y AVL -------------------------------------------------------------- 118
III.2.1. Th m nt--------------------------------------------------------------------------------------- 118
III.2.2. C p nh t c y --------------------------------------------------------------------------------- 126
III.2.3. C c php duyt c y ---------------------------------------------------------------------- 127
B i t p -------------------------------------------------------------------------------------------------------------- 129

TI LIU THAM KHO

1. K thu t l p tr nh Turbo C

Phc, Nguy n Phi Kh,


T Minh Ch u,
Nguy n nh T

1992

2. C u trc d li u ng dng
v c i t b ng C

Nguy n Hng Chng

1999

3. Nhng vi n ngc K thu t


l p tr nh

JohnBentley

You might also like