Sunteți pe pagina 1din 134

1

K thut lp trnh

CHNG i

I CNG V LP TRNH

I. Khi nim thut ton:


ton:
I.1. Khi nim:
Thut ton l tp hp cc quy tc c logic nhm gii mt lp bi ton no
c mt kt qu xc nh.
I.2. Cc tnh cht c trng ca thut ton :

I.2.1. Tnh tng qut :


Thut ton c lp khng phi ch gii mt bi ton c th m thi m
cn phi gii c mt lp cc bi ton c dng tng t.

I.2.2. Tnh gii hn :


Thut ton gii mt bi ton phi c thc hin qua mt s gii hn cc
thao tc t n kt qu.
I.2.3. Tnh duy nht :
Ton b qu trnh bin i, cng nh trt t thc hin phi c xc nh
v l duy nht. Nh vy khi dng thut ton cng mt d liu ban u phi cho
cng mt kt qu.
I.3. Phn loi:
Theo cu trc, ta c th phn thnh ba loi thut ton c bn sau :
- Thut ton khng phn nhnh.
- Thut ton c phn nhnh.
- Thut ton theo chu trnh c bc lp xc nh v c bc lp khng
xc nh.
II. M t thut ton bng lu :
II.1. Lu :
Lu l mt dng th dng m t qu trnh tnh ton mt cch c
h thng. Ngi ta thng th hin thut ton bng lu .
II.2. Cc k hiu trn lu :
Tn khi
Khi m u hoc kt
thc
Khi vo ra

K hiu

ngha
Dng m u hoc kt
thc chng trnh
a s liu vo hoc in
kt qu

K thut lp trnh

Khi tnh ton

Biu din cc cng thc


tnh ton v thay i gi
tr ca cc bin
Dng phn nhnh
chng trnh

Khi iu kin
Chng trnh con

Dng gi chng trnh


con
Ch hng truyn thng
tin, lin h cc khi

Mi tn
II.3.
II.3. Mt s v d biu din thut ton bng lu
II.3.1. Thut ton khng phn nhnh:
V d 1: Tnh A = x2 + y2
Begin
Nhap (x,y)
A = x2 + y2
Xuat (A)
End

V d 2 : Tnh S =

Ax + By + C
x +y
2

; bit A,B,C,x,y pow(x,n)


Begin

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


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

K thut lp trnh

II.3.2. Thut ton c phn nhnh:


V d 1: Tm 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
Xua t (Max)
End

V d 2: Gii phng trnh bc nht Ax+B =0 vi cc nghim thc.


Begin
Nhap (a, b)

a=0

Xua t (-b/a)

b=0

Xuat (PTV)

End

Xua t (PTVN)

K thut lp trnh

V d 3 : Gii phng trnh bc hai Ax2+Bx+C =0 vi cc nghim thc.


Begin
Nhap (a, b, c)

a=0

PTB1 (b, c)

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

Delta < 0

Xuat (PTVN)

S
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 trnh:


Thut ton c chu trnh vi cc bc lp xc nh thng c th hin
bng lu sau :
i = gia tr ban a u
Le nh S;
Ta ng i

i <= n
S

vi n l gi tr kt thc.

K thut lp trnh
n

V d 4: Tnh S= xi , vi cc xi do ta nhp vo.


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:


DCH:
III.1. Ngn ng lp trnh:
III.1.1. Gii thiu: Con ngi mun giao tip vi my tnh phi thng qua
ngn ng. Con ngi mun my tnh thc hin cng vic, phi vit cc yu cu
a cho my bng ngn ng my hiu c. Vic vit cc yu cu ta gi l lp
trnh (programming). Ngn ng dng lp trnh c gi l ngn ng lp trnh.
Nu ngn ng lp trnh gn vi vn cn gii quyt, gn vi ngn ng t
nhin th vic lp trnh s n gin hn nhiu. Nhng ngn ng lp trnh c tnh
cht nh trn c gi l ngn ng cp cao. Nhng my tnh ch hiu c ngn
ng ring ca mnh, l cc chui s 0 vi 1 v nh vy r rng l kh khn
cho lp trnh vin, v n khng gn gi vi con ngi.
Hin ti, ngn ng lp trnh c chia ra lm cc loi sau:
III.1.2. Phn loi ngn ng lp trnh:
- Ngn ng my (machine language)

K thut lp trnh

- Hp ng (assembly language)
- Ngn ng cp cao (higher-level language)
Do my tnh ch hiu c ngn ng my, cho nn mt chng trnh vit
trong ngn ng cp cao phi c bin dch sang ngn ng my. Cng c thc
hin vic bin dch c gi l chng trnh dch.
III.2. Chng trnh dch:
Chng trnh dch c chia ra lm 2 loi : trnh bin dch (compiler) v trnh
thng dch (interpreter)
III.2.1. Trnh bin dch: l vic chuyn mt chng trnh trong ngn ng
cp cao no (chng trnh ngun) sang ngn ng my (chng trnh ch).
- Thi gian chuyn mt chng trnh ngun sang chng trnh ch c
gi l thi gian dch.
- Thi gian m chng trnh ch thc thi c gi l thi gian thc thi.
Nh vy, chng trnh ngun v d liu chng trnh thc thi c x
l trong cc thi im khc nhau, c gi l thi gian dch (compile time) v
thi gian thc thi (run-time)
D lieu

Chng trnh
nguon

Trnh bien
dch

Chng trnh
ch

May tnh
thc hien

Ket qua

Hnh I.1. Chng trnh thc thi theo c ch dch ca trnh bin dch
III.2.2. Trnh thng dch: qu trnh dch v thc thi xy ra cng 1 thi
gian, dch n u thi hnh lnh n .
Chng trnh
nguon

Chng trnh
tho ng dch

Ket qua

D lieu

Hnh I.2. Chng trnh thc thi theo c ch dch ca trnh thng dch

K thut lp trnh

CHNG 2

LM QUEN VI NGN NG C

* Gii thiu ngn ng C


Ngn ng C do Dennis Ritchie l ngi u tin xut, thit k v ci
t C trong mi trng UNIX. N c ngun gc t ngn ng BCPL do Martin
Richards a ra vo nm 1967 v ngn ng B do Ken Thompson pht trin t
ngn ng BCPL nm 1970 khi vit h iu hnh Unix.
C l ngn ng lp trnh a dng, cp cao nhng li c kh nng thc hin
cc thao tc nh ca ngn ng Assembly. V th ngn ng C nhanh chng c
ci t, s dng trn my vi tnh v tr thnh mt cng c lp trnh kh mnh,
hin nay ang c khuynh hng tr thnh mt ngn ng lp trnh chnh cho my
vi tnh trn th gii.
* c im ngn ng C
Ngn ng C c nhng c im c bn sau :
- Tnh c ng (compact) : Ngn ng C ch c 32 t kho chun, 40 ton
t chun m hu ht c biu din bi cc dy k t ngn gn.
- Tnh cu trc (structured) : Ngn ng C c mt tp hp cc pht biu lp
trnh cu trc nh pht biu quyt nh hoc lp. Do , n cho php chng ta
vit chng trnh c t chc v d hiu.
- Tnh tng thch (compactable) : Ngn ng C c b lnh tin x l v
cc th vin chun lm cho cc chng trnh vit bng ngn ng C c th tng
thch khi chuyn t my tnh ny sang my tnh kiu hon ton khc.
- Tnh linh ng (flexible) : Ngn ng C l mt ngn ng rt linh ng v
ng php, n c th chp nhn rt nhiu cch th hin m khng c ngn ng
khc nh Pascal, n gip cho kch thc m lnh c th thu gn li chng
trnh thc thi nhanh chng hn.
- Bin dch : Ngn ng C c bin dch bng nhiu bc v cho php
bin dch nhiu tp tin chng trnh ring r thnh cc tp tin i tng (object)
v ni cc i tng li vi nhau (link) thnh mt chng trnh thc thi thng
nht.
I. CC KHI NIM C BN
I.1. Cu trc c bn ca mt chng trnh C
[tin x l]
[Cc hm]
void main()

K thut lp trnh

[khai bo bin;]
[nhp d liu ;]
[x l ;]
[xut ;]

}
V d : Chng trnh hin trn mn hnh cu Chao cac ban
void main()
{ printf(Chao cac ban\n);
}
Mt vi nhn xt quan trng :
- Chng trnh C bao gi cng c mt hay nhiu hm, trong c mt
hm chnh bt buc phi c l hm main().
main y chnh l hm c thc hin u
tin trong chng trnh.
- Cp du { } xc nh mt khi lnh.
- Hm printf( Chao cac ban \n) l hm chun ca C dng xut cu
thng bo Chao cac ban ra mn hnh. K t \n l k t c bit dng
xung dng.
- Du ; chm dt mt lnh.
- Chng trnh C c phn bit ch thng vi ch hoa. a s cc t kho
ca C c vit bng ch thng, cn mt s t c vit bng ch hoa m ta
phi tun th cht ch, nu khng th chng trnh dch s khng hiu.
* Mt vi v d
V d 1: In bng ly tha 2 ca cc s nguyn t 10 n 50
/* Chng trnh in bnh phng cc s t 10 n 50*/
#include <stdio.h>
void main()
{int n;
/*Khai bo bin n kiu nguyn */
n=10;
/*Gn n=10 */
while (n<=50)
/*Lp t 10 n 50 bng while */
{ printf(%3d \t %5d\n,n,n*n); /*in dng 5d l dnh 5 v tr in n v n2 */
n++;
/* Tng n ln 1 */
}
/*Ht while*/
}
/*Ht main*/

K thut lp trnh

V d 2 : Tng t nh v d 1 nhng vit cch khc :


#include <stdio.h>
#define max 50
/*Tin x l, nh ngha max =50*/
void main()
{ int n;
/*Khai bo bin n kiu nguyn*/
for (n=10; n<=max; n++)
/*Lp t 10 n 50 bng for*/
printf(%3d \t %5d\n,n,n*n); /*in n v n2 dng 5d l nm ch s*/
}
/*Ht main*/
V d 3 : Chng trnh in ly tha 2, 3, 4, 5; c dng hm tnh ly tha :
#include <stdio.h>
#define max 50
/*Tin x l, nh ngha max =50*/
float luythua(int n, int m) /*Hm luythua vi 2 thng s*/
{ float s=1;
/*Khai bo v khi to bin s*/
for ( ;m>0;m--)
/*Lp gim dn t m ti 1*/
s=s*n;
return s;
/*Tr kt qu v*/
}
void main()
{ int n,n2,n3,n4,n5;
/*Khai bo bin kiu nguyn*/
for (n=10;n<=50;n++) /*Lp t 10 n 50 bng for*/
{ n2= luythua(n,2); /*Gi hm 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 dng 5 ch s vi 2 s l */
}
}
/*Ht main*/
* Hm xut chun printf()

C php :
printf(chui-nhdng,thamso1,thamso2,...)
printf

ngha :
Hm printf() s xem xt chui-nhdng, ly gi tr cc tham s (nu cn)
t vo theo yu cu ca chui-nhdng v gi ra thit b chun.
Chui-nhdng l mt chui k t, trong c nhng k t xut ra
nguyn vn hoc xut dng c bit, v c th c nhng chui iu khin
cn ly gi tr ca cc tham s thay vo khi in ra.

10

K thut lp trnh

- Nhng k t c bit :
K t

Tc dng

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

M ASCII

Xung hng mi
Tab
Xa k t bn tri
Con tr tr v u hng
Sang trang
Pht ting ci
Xut du cho ngc
Xut du nhy n
Xut du nhy kp
Xut k t c m ASCII dng Hex l dd
Xut k t c m ASCII dng Dec l
ddd
K t NULL

\0

10
9
8
13
12
7
92
39
34

- Chui nh dng :
% [ flag][width][.prec][FNhl] type
Type : nh kiu ca tham s theo sau chui-nhdng ly gi tr ra
Type

ngha

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

S nguyn c s 10
S nguyn c s 10 khng du
S nguyn c s 8
S nguyn c s 16, ch thng(a,b,...,f)
S nguyn c s 16, ch in (A,B,...,F)
S thc dng [-]dddd.ddd...
S thc dng [-]d.ddd e[+/-]ddd
S thc dng [-]d.ddd E[+/-]ddd
S thc dng e(E) hay f ty theo chnh xc
K t
Chui k t tn cng bng \0
Du % cn in

11

K thut lp trnh

Flag : Dng iu chnh


ngha

Flag
nu khng c
+
#

in d liu ra vi canh phi


in d liu ra vi canh tri
Lun bt u s bng + hay in ra ty theo type, nu:
0
: Chn thm 0 ng trc gi tr >0
x,X : Chn thm 0x hay 0X ng trc s ny
e,E,f : Lun lun c du chm thp phn
G,g : Nh trn nhng khng c s 0 i sau

Width : nh kch thc in ra


Width

ngha

n
0n
*

Dnh t nht n k t , in khong trng cc k t cn trng


Dnh t nht n k t , in s 0 cc k t cn trng
S k t t nht cn in nm tham s tng ng

Prec : nh kch thc phn l in ra


ngha

Prec
khng c
0
n
*

chnh xc nh bnh thng


d,i,o,u,x chnh xc nh c
e,E,f Khng c du chm thp phn
nhiu nht l n k t (s)
S k t t nht cn in nm 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 gn 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 thut lp trnh

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;
Xut

Dng

Thng s
tng ng

%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 phi
rng 3, canh tri
M ASCII ca A
rng 10
Nhiu k t hn cn thit
Chnh xc 6 k t
Chnh xc 8, canh tri

Nhn xt
rng 3
Thm 2 s 0
H 8, canh phi
H 16, canh tri
K t c m ASCII 123
H 16, canh tri
rng 10, c 5 ch s thp
phn
Canh tri, in ra di dng
khoa hc

V d 3: Vit chng trnh in hnh ch nht kp bng cc k t ASCII


C9
CD
BB

C8

CD

BC

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

13

K thut lp trnh

I.2. Kiu d liu c bn


I.2.1. nh ngha:
Kiu d liu c bn l kiu d liu c gi tr n, khng phn chia c
na nh s, k t
I.2.2. Phn loi:
ngha

Tn kiu

Kch
thc

Phm vi

char

K t

1 byte

-128 127

unsigned char

K t khng du

1 byte

0255

unsigned short

S nguyn ngn khng du

2 bytes

065535

enum

S nguyn c du

2 bytes

-3276832767

short int

S nguyn c du

2 bytes

-3276832767

int

S nguyn c du

2 bytes

-3276832767

unsigned int

S nguyn khng du

2 bytes

0 65535

long

S nguyn di c du

4 bytes

-2147483648
2147483647

unsigned long

S nguyn di khng du

4 bytes

04294967295

float

S thc chnh xc n

4 bytes

3.4 E-383.4 E+38

double

S thc chnh xc kp

8 bytes

1.7 E-308 1.7


E+308

long double

S thc chnh xc hn
double

10 bytes 3.4 E-4932 1.1


E+4932

Ch :
1. Ngn ng C khng c kiu logic (boolean nh Pascal) m quan nim
0 l false
;
Khc 0 l true
2. Ngn ng C khng c kiu chui nh kiu string trong Pascal
3. Cc kiu ng nht:
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 thut lp trnh

I.3. Bin
I.3.1. Tn bin : Tn bin l mt chui k t bt u bng k t ch, k t
k tip l k t ch (du gch di _ c xem l k t ch) hoc s v khng
c trng vi cc t kha ca C.

Ch : - Ngn ng C phn bit ch thng vi ch hoa nn bin ch


thng vi ch hoa l khc nhau.
_bien2
l hp l
V d : Bien_1
bi&en
2a
a b l khng hp l
- Ngn ng C ch phn bit hai tn hp l vi nhau bng n k t u tin
ca chng. Thng thng n=8, nhng hin nay nhiu chng trnh dch cho php
n=32, nh Turbo C cho php thay i s k t phn bit t 8-32)
V d : Hai bin sau b xem l cng tn
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 bin
Cc bin phi c khai bo trc khi s dng nhm gip cho chng
trnh dch c th x l chng.
Khai bo bin c dng :
Kiudliu

tnbin1 [,tenbin2 ...] ;

V d: int
a,b,c;
float x,y,delta;
char c;
* Khai bo v khi to bin:
Kiu d liu

tnbin = gitr ;

I.3.3. Hm nhp d liu chun

a) Hm scanf()
php:: scanf(chui-nhdng,ichthams1, ichthams2,...)
C php
- Chui-nhdng ca scanf() gm c ba loi k t :
+ Chui iu khin
+ K t trng
+ K t khc trng
Chui iu khin c dng :
%[width][h/l] type

15

K thut lp trnh

Vi type:
type xc nh kiu ca bin a ch tham s s nhn gi tr nhp vo
Type

ngha

d,i
S nguyn c s 10 (int)
o
S nguyn c s 8 (int)
u
S nguyn c s 10 khng du (unsigned)
x
S nguyn 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 : xc nh s k t ti a s nhn vo cho vng .
Hm scanf() ch nhn cho width k t hoc cho n khi gp k t trng
u tin. Nu chui nhp vo nhiu hn th phn cn li s dnh li cho ln gi
scanf() k tip.
V d 1: scanf(%3s,str);
Nu nhp chui ABCDEFG
th scanf() s nhn ti a 3 k t ct vo mng str, cn DEFG s c ly
nu sau c ln gi sanf(%s,str) khc.
V d 2: unsigned long money;
scanf(%lu,&money);

Lu : Nu scanf(%ul, &money) th gi tr nhp vo s khng c lu


tr trong bin money, nhng chng trnh dch khng bo li.
V d 3: Nhp vo tn v b gii hn trong khong [A-Z,a-z]
char name[20];
printf(Name : ) ;
scanf(%[A-Za-z],&name);
Trong trng hp ny, nu ta g sai dng th name =
K t trng: nu c trong chui-dng s yu cu scanf() b qua mt hay
nhiu k t trng trong chui nhp vo. K t trng l k t khong trng ( ),
tab (\t), xung hng (\n). Mt k t trng trong chui-nhdng s c hiu
l ch nhp n k t khc trng tip theo.

16

K thut lp trnh

V d 4: scanf(%d ,&num);
Hm scanf() cho ta nhp mt k t khc trng na th mi thot ra. K t
s nm trong vng m v s c ly bi hm scanf() hoc gets() tip theo.
K t khc trng: nu c trong chui-nhdng s khin cho scanf() nhn
vo ng k t nh th.
V d 5: scanf(%d/%d/%d,&d,&m,&y);
Hm scanf() ch nhn mt s nguyn, ct vo d, k n l du /, b du
ny i v ch nhn s nguyn k tip ct vo m. Nu khng gp du / k
tip s nguyn th scanf() chm dt.

Ch : Hm scanf() i hi cc tham s phi l cc a ch ca cc bin


hoc l mt con tr.
* Ton t a ch & : Ly a ch ca mt bin
V d 6:

int n; bin n
&n; a ch ca n
printf(tr = %d, a ch = %d,n,&n);

b) Hm getch():
Hm getch() dng nhn mt k t do ta nhp trn bn phm m khng
cn g Enter vi c php :
ch = getch();
ch = getche();

Khng hin k t nhp trn mn hnh


Hin k t nhp trn mn hnh

Vi ch l bin kiu 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: Bn nhp vo 1 ch ci. Nu ch ci nhp vo l 'd' th chng
trnh s kt thc, ngc li chng trnh s bo li v bt nhp li.
#include <stdio.h>
#include <conio.h>
void main()
{
char ch;

17

K thut lp trnh

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 : Hm getch() cn cho php ta nhp vo 1 k t m rng nh cc
phm F1, F2,.., cc phm di chuyn cursor. Cc phm ny lun c 2 bytes: byte
th nht bng 0, cn byte 2 l m scancode ca phm . nhn bit ta g
phm k t hay phm m rng, ta c chng trnh 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");
}
Phm
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 thut lp trnh

77
PgUp
73
PgDn
81
End
79
Ins
82
Del
83
Bng m scancode ca cc phm m rng
c. Hm kbhit(): Hm int kbhit() s kim tra xem c phm no c g
vo hay khng. Nu c, hm kbhit s tr v mt s nguyn khc 0, v ngc li.
K t m ta nhp vo qua hm kbhit() c th ly c qua hm getch()
hoc 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: Hng l cc i lng m gi tr ca n khng thay i trong qu
trnh chng trnh thc hin.
I.4.1. Phn loi :
a. Hng s : l cc gi tr s xc nh v khng i.
Dng
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 :
- Cc hng s vit khng du hoc khng s m c hiu l s nguyn,
ngc li l double.
- Cc hng s nguyn ln hn int s c lu tr theo kiu long, cn ln
hn long th c lu tr theo kiu double.

- Cc hng s nguyn dng ln hn long s c lu tr theo kiu double


- Mt hng s c lu tr theo dng long nu theo s c k t l (L),

19

K thut lp trnh

dng unsigned nu sau c ch u (U), dng thp lc phn nu trc s


c 0x v dng bt phn nu trc s c 0
50000; 10 L; Long
5U, 100u
unsigned
h 16 = 1610
0x10
010
h 8 = 810
b. Hng k t : l k t ring bit c vit trong hai du nhy n : A

V d:

Gi tr ca hng k t l m ASCII ca n.
V d : printf(%c c gi tr l %d,A,A);
A c gi tr l 65
Hng k t c th tham gia vo cc php ton nh mi s nguyn khc.
V d : 9-0=57-48=9
Hng k t c th l cc k t c bit dng \c1 m ta xt hm
printf() nh \n,\a,\t ...
c. Hng chui : L mt chui k t nm trong hai du nhy kp .
V d :

Day la mot chuoi


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

Ch :
- Phn bit
A A
Hng:
Chui K t
Dng lu tr :
A \0

- Nhn xt: dng lu tr, ta thy tn cng ca chui c k t NULL \0


m khng c dng k t. Chnh v vy m khng c k t rng .
- Mt chui c th c vit trn nhiu hng vi iu kin hng trn phi
c du \.
V d : Day la mot chuoi duoc viet tren \
nhieu hang \n
d. Hng biu thc : L mt biu thc m trong cc ton hng u l
cc hng. Khi chng trnh dch s tnh ton biu thc trc, v kt qu c
lu tr thng bng mt hng s tng ng.
V d : 8*20-13 kt qu lu tr l 173

20

K thut lp trnh

l 97-65 = 32

l 0 (sai)
I.4.2. Khai bo hng:
php:: const tnhng = biuthc;
C php
a -A
1<8

V d : const MAX = 50;


const PI = 3.141593;
Ch : - Ta c th khai bo hng bng cch nh ngha 1 macro nh sau:
#define tnhng gitr
- Lnh #define phi c khai bo ngoi hm v sau n khng c
du ;
I.5. Php ton
I.5.1. Php gn:

php:: bin = biu thc;


C php
Ch : Php gn trong ngn ng C tr v mt kt qu l tr ca biu thc
V d 1 : c = 10;
a = b = c;
printf(a=%d , b=%d,a,b); a=10,b=10
y= a + (x= b + 2*c)

V d 2 : x = b + 2*c;
y = a + x;

V d 3 : (n+3) = 4+z;
= c +o;

(khng hp l v bn tri l biu thc)


(khng hp l v bn tri l hng)

I.5.2. Cc php ton s hc :


a. Php ton hai ton hng : +, -, *, /, %
Php
Php ton
+, -, *
/

%
V d :

Kiu ton hng


char, int, long, float,
double
nguyn/nguyn
thc(nguyn)/thc
(nguyn)
nguyn/nguyn

#include <stdio.h>
void main()

Kiu kt qu
Kiu ca ton hng c kiu cao nht
Kiu nguyn v l php chia nguyn
Kiu thc v l php chia thc
Kiu nguyn v l php chia ly phn d

21

K thut lp trnh

{ char cv;
int iv = 121;
float fv1,fv2;
printf( Chuyn kiu :\n\n);
cv = iv;
printf(int c gn 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 tng ++, php gim -
a = a+1
a++ hoc ++a
a-- hoc --a

a = a-1
Ch : Tuy nhin a++ s khc ++a khi chng ng trong biu thc (c
php gn).
a++ : Tng a sau khi gi tr ca n c s dng.
++a : Tng 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: bin op= <biuthc> bin = bin op <biuthc>


Vi op l php ton.

22

K thut lp trnh

Cc php gn phc hp :

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

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

n *= (10 +x)

n %= 10
n = n % 10

I += 3
I = I +3
<< : l php dch chuyn bit qua tri .
>> : l php dch chuyn bit qua phi .
I.5.4. Php ton quan h:
<
>
>=
<=
!=
==

:
:
:
:
:
:

nh hn
ln hn
ln hn hoc bng
nh hn hoc bng
khc
bng

Ch :
- Phn bit ton t so snh == vi php gn =
- C khng c kiu d liu 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= (a< 5)*(a-5)
c=0
V d: Tm s ln nht trong 3 s nguyn a, b, c
#include <stdio.h>
#include <conio.h>
void main ()
{ int a, b, c, max;
printf(Chng trnh tm s ln nht trong 3 s);
printf(Nhp 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 nht = %d, max);
getch();
}

23

K thut lp trnh

I.5.5.Ton t logic:
ngha

Ton t
NOT
AND
OR

!
&&
||

Ph nh
Giao, v
Hi

Th t tnh ton t trn xung.


Bng chn tr:
x

!x

x && y

true
false

false
true

true
true
false
false

true
false
true
false

true
false
false
false

x || y

true
true
true
false
true
true
false
true
true
false
false
false
V d 1: Xt k t c c phi l k s hay khng?
char c;
if (c >= 0 && c <= 9)
printf (% c l k t s , c);
V d 2: Xt k t ch l ch ci hay khng?
if ((ch> =a) and (ch< =z)) or ((ch> =A) and (ch< =Z))
printf(%c l chu cai \n,ch);
V 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 thut lp trnh

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:

php::
C php
T = (exp1, exp2, exp3 );
// T = kt qu ca exp3
V d: m= (t=2, t*t+3)
m=7; t=2
c= (a=10,b=5,a+b); a=10, b=5, c=15
I.5.7. Ton t iu kin:

C php :
T = <iu kin> ? <bt1> : <bt2>;
Nu <iu kin> l ng th T = <bt1> , ngc li 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 trn bit (bit wise) :


Dng
NOT bit
AND bit
OR bit
XOR bit
dch tri
dch phi

K hiu
~
&
|
^
<<
>>

ngha
ly b 1
giao
hi
hi loi tr
nhn 2
chia 2

25

K thut lp trnh

Bng chn tr:


Bit

Bit

Bit kt qu

~A

A&B

A|B

A^B

0
0
1
1

0
1
0
1

1
1
0
0

0
0
0
1

0
1
1
1

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

ngha:
1. Php AND bit thng c dng kim tra mt bit c th no trong
thnh phn d liu x c tr 0 hay 1. Vic ny thc hin bng cch s dng mt
mt n (mask) vi bit cn quan tm bng 1 cn cc bit khc bng 0. Ta ly mask
AND vi gi tr x. Nu kt qu thu c bng mask th l bit cn quan tm l 1,
ngc li 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 bit 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 thut lp trnh

2. Php OR dng bt cc bit cn thit ln cng nh vo mt mt n.


Chng hn nh ta mun bt bit th 7 ca bin ch (unsigned char ch) ln 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 lt bit ngha l hon chuyn 01
V d 4: lt bit 3 ta c chng trnh:
void main()
{ unsigned char ch;
printf ( nhp 1 s hex < = ff :);
scanf (%x, &ch);
printf (%02x ^ 0x08 = %02x \n , ch, ch ^ 0x08);
}
4. Ton t << , >>
<<
>>

dch sang tri (nhn 2)


dch sang phi (chia 2)

V d 5: num = 201 (0x00c9)


num :

num << 2 : 0

Kt qu = 0x0324 804 ngha l 201* 4


V d 6:
void main()
{ unsigned char x1, x2 ;
printf ( nhp 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 phi C lm theo 2 cch khc nhau ty thuc vo

27

K thut lp trnh

kiu d liu ca ton hng bn tri.


- Nu ton hng bn tri kiu unsigned th php dch s in 0 vo cc bit
bn tri.
- Nu ton hng bn tri kiu signed th php dch s in bit du vo cc
bit bn tri
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
1 0 0 1
num =
num >> 2 -6517 = 0xE68B
=
0 1 1 0 1 0 0 0
1 1 1 0
1
V d 8: Chng trnh i s hex ra s nh phn :
#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 thut lp trnh

28

V d 9: Chng trnh my tnh bitwise


y l chng trnh gi lp mt my tnh thc hin cc ton t bitwise.
#define TRUE 1
main()
{ char op[10];
int x1, x2;
while (TRUE)
{ printf (\n \n Cho biu 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 (Ton t khng hp l /n );
}
}

29

K thut lp trnh

}
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 chuyn kiu bt buc:
Trong C c 2 trng hp chuyn kiu: chuyn kiu t ng v chuyn
kiu bt buc.
Chuyn kiu bt buc: c p dng khi chuyn kiu t ng khng c.

C php:

(Type) biu thc

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

Php ton

Th t kt hp

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

2
3
4
5

/
+

<<

>>

30

K thut lp trnh

6
7

<

<=

>

==

>=
!=

&

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.
I.6. Chui
I.6.1. nh ngha :Chui l mt mng m cc phn t ca n c kiu k t.
Khai bo mt chui k t cha ti a 49 k t
char chui[50];
* Lu : Tt c cc chui u c kt thc bng k t NULL (\0). Do ,
nu chui di 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 nhp chui th khng c dng hm scanf v hm scanf khng chp
nhn khong trng.
V d: scanf(%s, chui); // ta nhp vo Nguyn Vn i th

K thut lp trnh

31

// chui = Nguyn v hm scanf ct khong trng


- Khi dng hm gets trong chng trnh th khng nn dng hm scanf
bt k u d rng dng hm scanf nhp s m ta nn dng hm gets v hm
atoi, atof nhp s.
V :
scanf(%d, &n);
// ta nhp s 5
gets (chui);
// lc ny chui = (chui rng)
I.6.4. Hm chuyn i s sang chui v ngc li
sint = atoi (chuis)
// chuyn chui s sang s nguyn
sf = atof (chuis)
// chuyn chui s sang s thc
* Hai hm ny nm trong < stdlib .h >
I.6.5. Cc hm v chui: (# include < string. h> )
- int strlen(S) : tr v chiu di chui S.
- int strcmp(S1, S2):
S2) so snh chui S1 vi S2. Nu chui S1 ging S2 kt
qu bng 0. Nu chui S1< S2 kt qu l m, nu chui S1> S2 kt qu > 0.
- int stricmp(S1, S2):
S2) so snh chui S1, S2 khng phn bit ch thng hay
ch hoa
- int strncmp(S1, S2, n):
n) ch so snh n k t u ca 2 chui S1, S2 vi
nhau.
- int strnicmp(S1, S2, n):
n) ch so snh n k t u ca 2 chui S1, S2 vi
nhau, khng phn bit ch thng, ch hoa
- strcpy(dest, source):
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):
n) chp chui t ngun sang ch vi nhiu nht l
n k t.
V d:
char string[10];
char *str1 = "abcdefghi";
strncpy(string, str1, 3);
// string = "abcx1zwe12"
string[3] = '\0';
// t k t kt thc chui vo cui chui.
printf("%s\n", string);
// "abc"
- strcat(dest, src):
src) ni chui src vo sau chui dest. Chiu di ca chui
kt qu bng strlen(dest) + strlen(src)

32

K thut lp trnh

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):
n) ni nhiu nht l n k t ca src vo cui chui dest,
sau thm k t null vo cui chui kt 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):
ch) tr v a ch ca k t ch u tin c trong chui S;
nu khng c th tr v NULL (thng dng ly 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 tm thy k t %c\n",c);
- char * strstr(S1, S2):
S2) tr v v tr ca chui S2 trong chui S1; nu S2
khng c trong S1 th hm strstr tr v tr NULL.
I.6.6. Mng cc chui

bo:: Khai bo bin ds cha ti a 50 chui k t, mi chui k t c


*Khai bo
ti a 30 k t.
char ds[50 ] [30];

Ch :
- Khng nn gn chui vi chui (s1= s2) m phi dng hm
strcpy(S1,S2)
- Khng c so snh 2 chui bng cc ton t quan h (S1== S2,
S1>S2, S1>= S2), m phi dng hm strcmp(S1,S2).

K thut lp trnh

33

V d: Vit chng trnh tm kim 1 t trong 1 cu


# include < string.h>
# include < stdio.h>
void main ()
{ char cau[80], t[7], *ptr;
printf(Nhp cu
:);
gets(cu);
printf(Nhp t :);
gets(t);
ptr = strstr(cu, t);
if (ptr == NULL) printf(Khng c t);
else printf(c t);
}
II. Cc cu trc iu khin trong C:
C:
Ngn ng C l ngn ng lp trnh cp cao c cu trc, gm: cu trc tun t,
chn, v lp.
II.1 Cu trc tun t (Sequence) :
Cc lnh trong chng trnh c thc hin tun t t lnh ny n lnh
khc cho n khi ht chng trnh.
V du : Vit chng trnh tnh v in ra din tch ca hai ng trn bn knh
ln lt l 3m v 4.5m cng vi hiu s ca 2 din tch.
#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 thut lp trnh

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
trc chn
K hiu : k l biu thc Logic
S1, S2 l cc pht biu hay 1 nhm cc pht biu (lnh)
II.2.1. Lnh if else:

php::
C php
if (k) S1;
K

NO

YES

S1

if (k) S1;
else S2;

K
NO

S2

Ch : Cc lnh if else lng nhau


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

YES

S1

K thut lp trnh

35

if (a>b)
if (a>c) max=a;
else max=c;
else if (b>c) max =b;
else max= c;
V d 2: Tnh hm f(x) :
, nu -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. Lnh chn la: switch_case

php::
C php
switch (biu thc)
{ case hng 1: S1;
case hng 2: S2; break;
.
.
.
case hng 3: Sn; break;
default: S0;
}

Cch hot ng:


- (biuthc) c kt qu nguyn
- Hng: k t, s nguyn, biu thc c s nguyn
- Nu kt qu bng hng I no th n s lm lnh Si v tun t thc hin
ht cc lnh di cho n khi ht lnh switch.
- Mun ngt s tun t trn th phi dng lnh break.
V d: Nhp 1 k t s dng hex i ra s thp phn
#include <stdio.h>
#include <conio.h>
void main()

K thut lp trnh

{
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: Vit chng trnh to 1 my tnh c 4 php ton + , - , * , /
#include <stdio.h>
#include <conio.h>
void main()
{

36

37

K thut lp trnh

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("Ton t l, khng bit");
}
}
II.3. Cu trc lp
II.3.1. Lnh while:

php::
C php
While (bt)
S;

NO

YES

Ch : Trong phn thn lnh phi c bin iu khin vng lp.


V d 1: Vit chng trnh in ra bng m ASCII
void main ()
{ int n=0;
while (n <= 255)

38

K thut lp trnh

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


n ++
}
}
V d 2: Nhp mt chui k t, v kt thc nhp bng ESC
#define ESC \ 0x1b
#include <stdio.h>
#include <conio.h>
void main()
{ char c;
while (1)
if ((c = getche() ) = ESC ) break;
}
V d 3: Vit chng trnh in bng 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. Lnh do while:

C php:
do
S

S
while (bt);
Yes

V d 1: Vit chng trnh in bng m ASCII


#include <stdio.h>

k
No

K thut lp trnh

main ()
{ int n=0;
do
{ printf(%c c m ASCII %d\n, n, n);
n ++;
} while (n <= 255);
}
II.3.3. Lnh for:

php::
C php
for ([bt_khi ng]; [bt_k]; [bt_lp])
S;
V d 1: Lp lnh 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 snh vng lp while - for:
for ( bt_khi ng; bt_k; bt_lp)
bt_khi ng;
S;
while (BiuThc_K)
{
S;
BT_lp;
}
V d 3: Vit chng trnh in ra bng cu chng bng 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: Vit chng trnh tnh n giai tha

39

K thut lp trnh

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: Vit chng trnh tnh biu thc:
(1 + 1/12 ) * (1 + 1/22 ) *......... (1 + 1/ n2 )
void main ()
{ int i, n;
float S;
printf(Nhp 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 biu break, continue, goto:

1. Break:
Lnh break cho php thot ra sm khi vng lp ( whiledo , for, dowhile),
lnh switch.

2. Lnh continue:
Lnh continue ch dng trong vng lp lm cho chng trnh nhy tt v
iu kin kim tra ca vng lp bt u mt vng lp mi.
V d: Vit chng trnh nhp mt cu ch thng kt thc bng du
chm, xut ra bng 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 thut lp trnh

41

3. Lnh goto: dng chuyn iu khin chng trnh v mt v tr no .


C php:
Goto nhn;
php
Lnh goto s chuyn iu khin chng trnh ngay lp tc v v tr t
nhn.
V d:
Again::
;
.
.
goto Again;

Bi tp:
tp:
1. Vit chng trnh tnh din tch
- Hnh vung
- Hnh thang
- Tam gic thng
- Tam gic vung
- Hnh trn
2. Tnh khong cch mt im (X0, Y0) ti mt ng thng Ax + By + C = 0

S=

Ax 0 + By 0 + C
, nhp A, B, C, X0, Y0
2
2
A +B

3. Cho 3 s thc x, y, z. Tm
a. Max(x+y+z, x*y*z)
b. Min2 ((x+y+z) / 2, x*y*z) +1
4. Vit chng trnh tm s ln nht trong 3 s nguyn a,b, c
5. Gii phng trnh bc 2 Ax2+Bx+C = 0 trn trng s thc.
6. Vit chng trnh tnh din tch hnh trn, bit bn knh r dng; Chng
trnh c kim tra s liu nhp vo, nu r <=0 th chng trnh bo li v bt
nhp li.
7. Vit chng trnh nhp s thp lc phn in ra s nh phn, c 4 s th cch
mt khong trng.
8. Vit chng trnh to 1 my tnh gm cc php ton sau : + , - , * , / , ^ (ax
vi x nguyn dng), @ (ex )

K thut lp trnh

42

9. Vit chng trnh kim tra 1 bit bt k ca s bng 0 hay 1


10. Vit chng trnh tnh kt qu ca mt s sau khi dch phi hoc dch tri n
ln.
11. m s ln xut hin ca t mt trong 1 cu
12. Thay th 1 t trong 1 cu bng 1 t khc.
13. Nhp h tn, tch hoten ra lm 2 phn h v tn ring.
14. Vit chng trnh i cc k t u ca cc t ra ch in, cc k t cn li ra

ch thng.
15. Vit chng trnh cho php ta kim tra mt password l ng hay sai (nhp

ti a password 3 ln).
16. Cho chui s, vit chng trnh di chuyn ch t bn tri qua bn phi ca

mn hnh ti dng 5. Qu trnh di chuyn dng li khi ta n phm ESC.


17. Bn hy vit chng trnh tnh gi tr tng cng ca mt sn phm c k c
thu, bit rng t sut thu l 13.6% tnh trn gi gc. Gi gc ca sn phm
c c vo, v cn in ra:
- Tin thu
- Gi c thu
18. Trong mt k thi cui kha, cc hc vin phi thi 4 mn : mn I h s 2,
mn II h s 4, mn III h s 1, mn IV h s 2, im cc mn cho ti a l
10 im. Vit chng trnh nhp im ca 4 mn v tnh im trung bnh.
19. Mt ngi bn ru bn N chai ru c n gi l P. Nu tng s tin vt
qu 5000000 th vic chuyn ch l min ph, nu khng ph chuyn ch
thng c tnh bng 1% tng tr gi hng. Vit chng trnh nhp vo N, P.
In ra cc chi tit Tng tr gi hng, tin chuyn ch, v tng s tin phi tr.
20. Mt sinh vin d tuyn c cc chi tit sau : h tn, im L1 ca ln 1, im
L2 ca ln 2, im thi cui k CK. Vit chng trnh xc nh xem mt sinh
vin c c tuyn hay b loi, bit rng s c tuyn nu im c tnh
theo cng thc sau ln hn hay bng 7 : Max( (L1+L2+CK)/3, CK).
21. Vit chng trnh cho bit tin lng hng ngy ca mt ngi gi tr. Cch
tnh l 15000/gi cho mi gi trc 14 gi v 25000 /gi cho mi gi sau
14 gi. Gi bt u v gi kt thc cng vic c nhp t bn phm.
22. Cho 3 s thc x, y z
a. Tn ti hay khng mt tam gic c 3 cnh c di x, y, z ?
b. Nu l tam gic th n vung, cn, u hay thng
23. Gii h phng trnh bc nht:

K thut lp trnh

43

ax+by = c
ax+by = c

Hng dn:
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 nghim
else pt v nh
24. Gii h phng trnh 3 n s bc nht

a1 x + b1 y + c1 z = d1
a2 x + b2 y + c2 z = d2
a3 x + b3 y + c3 z = d3

25. Vit chng trnh gii phng trnh trng phng ax4 + bx2 + c = 0
26. Ngi ta mun lp ha n cho khch hng ca Cng ty in lc. Ch s u
v ch s cui k s c cho bit. Bit rng biu gi c tnh ty theo in
nng tiu th.
- Nu in nng tiu th nh hn 100Kwh, gi mi Kwh l 500.
- Nu in nng tiu th t 100Kwh tr ln, th mi Kwh di ra s c tnh
gi l 800
- Ph khu vc l 5000 cho mi khch hng. Vit chng trnh tnh tin
phi tr tng cng gm tin in, v ph khu vc
27. Bit 2 s X, Y biu din thi gian tnh theo giy. Ngi ta mun vit chng
trnh :
- c 2 s ny v in ra tng ca chng
- Chuyn cc s ny v tng ra dng gi, pht, giy ca chng ri in ra.
Kim xem kt qu ca 2 cch tnh c nh nhau khng?
28. Vit chng trnh in bng cu chng t 2 9 theo hng ngang
29. In tam gic *, hnh ch nht *, rng - c
30. V lu v vit chng trnh tnh :
a. 1+2+...+n

K thut lp trnh

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, xc nh cc tng sau y sao cho s hng cui
cng ca tng l khng ng k (s hng cui cng < epsilon )
a. 1/1+ 1/2+ 1/3+1/4+.....
b. 1+ 1/22 + 1/32 +....+...
32. Vit chng trnh in ra bng m ASCII, 16 k t trn 1 dng.
33. V lu v vit chng trnh :
a. Xt mt s c phi l s nguyn t hay khng ?
b. In trn mn hnh 100 s nguyn t u tin
34. Vit chng trnh cho php mt k t ngu nhin ri trn mn hnh. Nu
ngi s dng khng kp n phm tng ng v chm y mn hnh th
thua cuc.
35. Cho hm Fibonacci:
Fn =

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

a. Tm Fn, vi n do ta nhp
b. In ra N phn t u tin ca dy Fibonacci
36. Vit chng trnh c vo s nguyn N v in ra 1*2*3*..*N cho n khi N <=0.
37. Cho 1 dy gm mt triu t 32 bit, hy m s bit 1 trong mi t.
38. Vit chng trnh on s : ngi chi s on 1 s trong phm vi t 0 n
100, ti a 5 ln. Chng trnh kim tra kt qu v xut thng bo hng dn:
- S bn on ln hn
- S bn on nh hn
- Bn on ng
- My thng cuc

K thut lp trnh

45

III. Hm - quy:
quy:
III.1. Hm:
III.1.1. Mc ch: Hm l mt chng trnh con ca chng trnh chnh,
vi cc mc ch sau:
* Trnh vic lp i lp li cc on chng trnh ging nhau, nh , ta s
tit kim lc lp trnh.
* T chc chng trnh: Dng hm ta s phn mnh chng trnh thnh
nhng khi nh c lp, mi khi l mt hm thc hin mt cng vic no .
Tng hm s c lp trnh, kim tra hon chnh; Sau , ta kt li to chng
trnh hon chnh. Nh vy, chng trnh v sau d hiu v d sa.
* Tnh c lp: cho php hm c lp vi chng trnh chnh. V d hm
c nhng bin cc b m chng trnh chnh v cc hm khc khng th ng
ti. Do , nu ta c khai bo cc bin trng tn vi cc hm khc th cng
khng s nh hng ti cc bin trng tn .
Ch :
- C khng cho php cc hm lng nhau ngha l cc hm u ngang cp
nhau (c th gi ln nhau).
- C khng phn bit th tc hay hm, m ch quan tm n kt qu tr v
ca hm. Nu hm khng tr v kt qu g c th c th xem l th tc.
V d: V hnh ch nht c bng du *:
#include <stdio.h>
#include <conio.h>
void ve_hcn(int d,int r)
// khai bo void cho bit hm khng tr v tr
no c
{ int i,j ;
// i, j l 2 bin cc b trong hm 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 hm
getch();
}

K thut lp trnh

46

III.1.2. C php nh ngha hm

C php:
Kiu tnhm (ds i s)
{ Khai bo bin cc b;
lnh;
[ return (expr);]
}
- Kiu:
Kiu L kt qu tr v ca hm. Nu khng ghi kiu, C s t hiu l kiu
int. Nu khng mun c kt qu tr v th ghi kiu void.
void
- Danh sch i s:
s Lit k cc i s v kiu ca i s gi n hm, cch
nhau bi du ','. Nu khng c i s ta ch cn ghi()
- Lnh return: c cc dng sau:
return;
return (expr);
return expr;
V d: Hm chuyn 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 :
- Hn ch ca lnh return l ch tr v mt kt qu.
- Lnh return khng nht thit phi cui hm. N c th xut hin bt
k ni no trong hm. Khi gp lnh return, quyn iu khin s chuyn
ngay v chng trnh gi.
III.1.3. Cc loi truyn i s
a. Truyn theo tr

47

K thut lp trnh

#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 chy chng trnh trn:
Nhap a b : 12 24
Gia tri lon nhat =24
Gia tri a =12
Gia tri b=24
Nhn xt:
- Ta nhn thy rng gi tr hai bin a, b trc v sau khi vo hm max l
khng thay i (mc d trong hm max, c hai bin a v b u thay i); l
c ch ca s truyn i s theo tr.
Li gi hm:
hm

tnhm (ds isthc);

- Nu truyn i s theo tr th i s thc c th l bin, hoc c th l biu


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

48

K thut lp trnh

max (int
int &a,int
b)
&a
{ 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 bin
printf("\nGia tri lon nhat =%d",c);
printf("\nGia tri a =%d",a);
printf("\nGia tri b =%d",b);
getch();
}
Gi s ta chy chng trnh trn:
Nhap a b : 12 24
Gia tri lon nhat =24
Gia tri a =1200
Gia tri b=24
Nhn xt:
- Ta nhn thy rng gi tr bin a trc v sau khi vo hm max thay i;
l c ch ca s truyn i s theo a ch.
Li gi hm:
hm

tnhm (tnbin);

- Nu truyn i s theo a ch th tham s thc bt buc phi l mt tn bin.


V d: c = max(1000,b); l sai
V d: Vit hm giaohon hon i gi tr ca 2 bin nguyn a,b.
void giaohoan (int &a, int &b)
{ int tam;
tam = a;
a = b;
b = tam;
}

49

K thut lp trnh

void main()
{ int a,b;
printf ("a, b = ");
scanf ("%d %d", &a, &b);
giaohoan(a, b);
}
gihm (mang)
* Truyn i s l mng
hm (kiu mang[]) hoc hm(kiu *mang)
V d: Cng thm mt hng s vo mng tn l dayso.
#define SIZE 5
// dy 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 nguyn mu ca hm
- Khai bo hm theo nguyn mu i hi phi khai bo kiu d liu ca i
s nm trong nh ngha hm ch khng t chng trn cc dng ring.
- C khng nht thit phi khai bo hm theo nguyn mu. Tuy nhin, nn
c v n cho php chng trnh dch pht hin c li do khng ng kiu d liu
gia tr truyn n hm v tr m hm mong mun.
V d:
float dinhthuc (float a, float b, float c, float d)
{ return (a*d- b*c);
}
void main()

50

K thut lp trnh

{ 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 tti
i ca bin:
a. Bin ton cc: l bin c khai bo ngoi cc hm ( k c hm main).
N c php truy nhp n t tt c cc hm trong sut thi gian chng trnh
hot ng.
V d: Khai bo ngoi hm main
Kiu tn bin;
// bin ton cc
void main()
{
}
b. Bin cc b: l bin c khai bo trong cc hm, k c trong hm
main. N khng cho php cc hm khc truy nhp n n. N tn ti
trong thi gian sng ca hm cha n.
void main()
{ kiu
tn bin;
bin cc b trong hm main()
}
c. Bin ngoi : l bin m cc hm c th truy xut ti m khng phi
phn phi b nh. N c dng cc hm trn cc tp tin khc nhau
lin kt li.
External Kiu tn bin;
void main()
{
}
d. Bin tnh : l mt bin cc b ca mt hm nhng vn gi gi tr ca
ln gi hm cui cng
void main()
{ static
Kiu
tnbin;
}
e. Bin thanh ghi : l mt bin s dng cc thanh ghi ca CPU tng
tc truy xut
register

Kiu tnbin ;

51

K thut lp trnh

III.1.6. Cc dn hng tin x l


III.1.6.1. #define
a. nh ngha hng:
#define
V d: #define
#define
#define
#define

tn hng

gi tr

PI
MAX
THONGBAO
khoangtrang

3.14
100
Ht Gi"

b. nh ngha Macro:
#define

tnmacro (i s ) thao tc

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 cc thao tc Macro nn s dng cc du ngoc trnh dn
ra mt kt qu sai
max (a,b) ((a) > (b) ? (a) : (b))
V d: #define
#define
honv (a,b) { int tm =a; a= b; b= tm;}
#define
error (n)
printf ( error %d, n)
Di y mt s Macro phn tch k t, tt c u trong <ctype. h>. Cc
macro ny tr v tr khc 0 nu thnh cng. i vi mi macro, thnh cng c
nh ngha nh sau:
Macro
Isalpha (c)
Isupper (c)
Islower (c)
isdigit (c)
Isxdigit (c)
Iscntrl(c)
Ispace (c)
Khai bo: 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 hoc k t iu khin
(0x7F hoc 0x00 n 0x1F)
c l k t space, tab, carriage return,
new line (0x09 n 0x0D, 0x20)

52

K thut lp trnh

* Phn bit Macro vi hm:


hm
- Dng Macro: truy xut nhanh, tn b nh.
- Dng hm: ngc li
III.1.6.2. #include
L tin x l dng kt ni tp trung khai bo trong include vi tp tin
ang lm vic.
# include < tn tp tin.h>
# include tn tp tin.h
Dng < > : i tm tp tin.h trong th mc c ch nh trong Include
Directories.
Dng : tm tp tin.h trong th mc Source Directories, nu khng c,
n i tm trong th mc c ch nh trong Include Directories.
III.2. qui (Recursion):
III.2.1. Khi nim: qui l 1 cng c rt thng dng trong khoa hc
my tnh v trong ton hc gii quyt cc vn . Trc ht, chng ta hy
kho st th no l mt vn c qui qua v d sau:
Tnh S(n) = 1 +2 +3 +4+ ...+n
Ta nhn thy rng, cng thc trn c th din t li 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 vy, mt vn c qui l vn c nh ngha li bng chnh n.
tnh S(n): ta c kt qu ca S(1), thay n vo S(2), c S(2) ta thay n vo
S(3) ...., c nh vy c S(n-1) ta s tnh c S(n)
*Mt s v d
1. Hm giai tha:
tha:
n!

=
=

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

{1
{ 1n*(n-1)!

, n=0
, n>0
, n=0

53

K thut lp trnh

Nhn xt:
- Theo cng thc trn, ta nhn thy trong nh ngha ca n giai tha (n!)
c nh ngha li chnh n nn hm giai tha c qui.
- Vi n >=0 , iu kin dng tnh hm giai tha l n=1
2. Hm FIBONACCI:
FIBONACCI:
Fn =

1
Fn-1 + Fn-2

; n =0,1
; n>1

- Theo nh ngha trn, hm Fibonacci c li gi qui.


- Qu trnh tnh dng li khi n= 1
III.2.2. Hm qui trong ngn ng C:
Ngn ng C c trang b c ch gi hm qui. Hm qui l hm gi n
chnh hm mt cch trc tip hay gin tip.
V d 1: Vit hm qui tnh S(n) = 1 + 2 + 3 +...+n
#include <stdio.h>
#include <conio.h>
int S(int n)
{ if (n==1)
// iu kin 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 : Vit hm qui tnh hm giai tha n.
long giaithua(int n)
{ return ((n==0) ? 1 : n*giaithua(n-1));
}
III.2.3. Hm qui v Stack
Stack::
Mt chng trnh C thng gm c hm main() v cc hm khc. Khi chy
chng trnh C th hm main() s c gi chy trc, sau hm main() gi
cc hm khc, cc hm ny trong khi chy c th gi cc hm khc na. Khi

54

K thut lp trnh

mt hm c gi, th mt khung kch hot ca n c to ra trong b nh


stack. Khung kch hot ny cha cc bin cc b ca hm v mu tin hot ng
ca hm. Mu tin hot ng cha a ch tr v ca hm gi n v cc tham s
khc.
Bin cc b
Mu tin
a ch tr v
hot ng
Thng s khc
Khung kch hot
Sau khi hm c gi thi hnh xong th chng trnh s thc hin tip
dng lnh a ch tr v ca hm gi n, ng thi xa khung kch hot ca
hm khi b nh.

Gi s ta c c ch gi hm trong mt chng trnh C nh sau:


D()
C()
B()
main()
A()
{........;
{......;
{.....;
{ ......
{.....;
........;
D();
D();
A();
C();
}
.....;
}
.....;
....;
}
B();
D();
....;
}
}
Hnh sau y cho ta thy s chim dng b nh stack khi chy chng trnh
C nh m t trn.
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 hm qui, khi gi qui ln nhau th mt lot
cc khung kch hot s c to ra v np vo b nh Stack. Cp qui cng cao
th s khung kch hot trong Stack cng nhiu, do , c kh nng dn n trn
Stack (Stack overflow). Trong nhiu trng hp khi lp trnh, nu c th c ta
nn g qui cho cc bi ton.

K thut lp trnh

55

IV. Structure:
Structure:
Cc kiu n gin ti mt thi im ch lu gi c mt gi tr duy nht.
Cn mt bin kiu mng dng lu tr cc gi tr cng kiu d liu vi nhau,
chng hn nh mt dy s, mt dy cc k t,...Nhng trong thc t, iu ny
vn cha v cc thnh phn m ta lu gi thng l khc kiu d liu vi
nhau.
V d : Ta mun lu gi cc thng tin v mt sinh vin nh sau : MASO,
HO, TEN, NGAYSINH, NOISINH, PHAI, DIACHI, LOP . Vi cc thnh phn
nh vy, th r rng cc thnh phn ca 1 sinh vin khng th cng kiu m phi
thuc cc kiu khc nhau, c th l:
- MASO, HO, TEN : mng ch
- NGAYSINH : int ngy , thng , nm ;
- NOISINH : mng ch
- PHAI
: unsigned int;
- LOP
: mng ch;
Do , lu tr c cc thnh phn khc nhau ca mt i tng ta phi
s dng mt kiu d liu trong C l Structure. (tng t nh record trong Pascal)
IV.1. nh ngha:
Mt bin c kiu structure c dng lu tr mt i tng c nhiu
thnh phn. Cc thnh phn c th thuc cc kiu d liu khc nhau.
IV.2. Khai bo: Mun khai bo kiu hocvien dng lu tr h, tn, im
mn TOAN,LY,HOA, TB, Xp loi ca mt hc vin, ta c :
struct hocvien
{
char ho[30];
char ten[7];
float toan, ly, hoa , dtb;
char xeploai[10];
};
- khai bo bin hv c kiu hocvien :
struct hocvien hv;
- truy xut ti mt thnh phn, ta dng du chm, v d nh: hv.ho
truy xut ti h ca hc vin.
* Khai bo kt hp: va khai bo kiu structure va khai bo bin c kiu .
struct hocvien
{
char ho[30];

K thut lp trnh

56

char ten[7];
float toan, ly, hoa , dtb;
char xeploai[10];
} hv1, hv2;
// khai bo 2 bin hv1, hv2 cng kiu hocvien
hv2
- Khai bo 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 ny, truy xut ti thng sinh ca hc vin hv, ta vit
nh sau: hv.ngsinh.thang.
V. FILE
FILE:
V.1. File vn bn:
- File vn bn l file c lu tr di dng kiu k t
C 2 cch truy xut theo kiu k t.
- Truy xut theo tng k t
- Truy xut theo tng dng
V.1.1. Khai bo tp tin:
Khai bo bin kiu file:
FILE *fptr
V.1.2. M tp tin:
fptr = fopen (tn file, kiu);
- Trong "tnfile" , ta c th ch nh mt ng dn y nh sau
"C:\THU\KTLT\VIDU.TXT". Hm fopen nu m file thnh cng s tr v mt
con tr file cho tp tin "tn file", v con tr ny c ct gi trong bin fptr (bin

K thut lp trnh

57

kiu FILE).
Nu khng c file "tn file" trn da th hm fopen s tr v tr NULL
( nu fptr == NULL ngha l khng c file )
- Kiu: gm c:
r

: c ( file phi c sn, nu khng c file, hm fopen tr v tr


NULL)
w : ghi ( nu c file s xa file c )
a : ni vo cui tp tin
r +: c / ghi, tp tin phi c sn trn da
a+: c, ghi vo cui tp tin, nu trn da cha c tp tin th n s c
to 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);
// kt thc chng trnh, 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)
V.1.4. c / ghi k t: Cho bin k t char ch;
- c k t t tp tin

58

K thut lp trnh

ch = getc (fptr)
- Ghi k t ln tp tin
putc (ch, fptr)
V d 1: To 1 file trc tip t bn phm. Qu trnh to s dng li khi ta n
phm 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 tp tin ra mn hnh
#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)
{ printf("Viec mo file co loi\n");
exit(0);

// m file mi ghi

K thut lp trnh

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

59

K thut lp trnh

60

V d 3: Chng trnh 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:

* Hm fgets (chui, chiudi, fptr);


Hm fgets c 1 chui k t t trong file fptr vo bin <chui> vi chiu di
ti a l <chiudi>.
Hm ny tr v NULL khi c ht file
* Hm fputs (chui, fptr): ghi 1 chui k t trong <chui> vo file fptr.
Hm ny khng t ng thm vo m kt thc chuyn dng mi, do ta
phi ghi thm m ny vo tp tin bng lnh fputs ("\
("\n", fptr);
V d 1: Chng trnh ghi chui ln file, cho n khi chui nhp vo l rng
th kt thc.

K thut lp trnh

#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)
// to file mi
{ printf("Viec tao file co loi\n");
exit(0);
}
while (strlen(gets(chuoi)) > 0)
// hm strlen() trong <string.h>
{ fputs(chuoi,fptr);
fputs("\n",fptr);
}
fclose(fptr);
}
V d 2: c cc chui k t t tp tin, v in n trn mn hnh.
#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 thut lp trnh

62

V.1.6. Xa file: Lnh remove xo file c ch nh qua <tnfile>


C php:
php remove (tn file)
Hm remove tr v 0 : xa thnh cng
tr v -1 : c li khi xa file, v lc ny bin errno c 1 trong
2 gi tr sau:
ENOENT : khng tm thy file mun xa
EACCES : khng cho php xa file m bn ch nh
Lu : File nn 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 bo li m hm remove gy ra
}
V.2. File nh phn (file c cu trc)
File nh phn l file dng lu tr cc cu trc di dng struct hoc
union
V.2.1. Khai bo:
FILE * fptr;
V.2.2. M file:
fptr = fopen (tnfile, kiu);
. rb ( b: binary): m ch c
. wb
: ghi. Nu file c th xa trc khi m.
. ab
: ni thm; m ghi thm vo cui file, nu file cha c
th to mi
. rb+
: m file c cp nht (c/ghi)
. wb+
: to file mi cho php c/ghi
. ab+
: m ni thm v cui file, cho php c/ghi

63

K thut lp trnh

V.2.3. ng fi
file:
le:
fclose (fptr)
V.2.4. c/ghi file: Hm fread : c s mu tin(cu trc) trong file fptr
vo <bin cu trc>.
fread (& bin cu trc, sizeof (bin cu trc) , s cu trc, fptr);
Hm fread tr v s cu trc c c
Hm fwrite ghi d liu trong <bin cu trc> vo file fptr.
fwrite (&bin cu trc, sizeof (bin cu trc) , s cu trc, fptr);
Hm fwrite tr v s cu trc ghi c ln file

Ch ::
- kim tra vic c file ta kim tra s cu trc c c. Nu s cu trc
tr v bng 0 m ta cn c l 1 cu trc th iu chng t ht file.

* Ghi mt mng cu trc ln file


fwrite(tnmng, sizeof (tnmng), 1, fptr);

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


fwrite (&tnmng[i], sizeof (tnmng[i] , 1, fptr);
V d 1: Chng trnh ghi ln file nh phn
#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 :");
gets(hv.hoten);

// m file nh phn ghi

K thut lp trnh

64

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 liu mng vo file nh phn
#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 thut lp trnh

65

while (i<3);
fwrite(table, sizeof(table), 1, fptr) ; // ghi noi dung toan bo hoc vien trong
// table vao file fptr
// hoc for (i=0; i<3; i++)
// fwrite(&table[i], sizeof(table[i]), 1, fptr)
fclose (fptr);
}
V d 3: Chng trnh c file nh phn, v in danh sch hc vin ra mn
hnh.
// In danh sch hc vin ra mn hnh
#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 nhin: (iu khin con tr tp tin trn file nh
phn)

K thut lp trnh

66

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


l con tr ch n tng byte trn file. Khi c hay ghi d liu trn tp tin, ta
lm dch chuyn con tr file mt s byte, y chnh l s byte m kiu d liu
chim. Khi ng ri m tp tin, con tr file lun u tp tin ; ngoi tr trng
hp ta m bng ty chn 'a' th con tr file s cui tp tin ghi thm d liu
vo cui tp tin. Hm fseek cho php ta di chuyn con tr file n v tr mong
mun.
C php:
php
int fseek (FILE * fptr, long nbytes, kiu)
+ nbytes : s bytes tnh t v tr kiu cho n v tr cn ti
+ kiu l s nguyn :
kiu = 0 (tnh t u tp tin)
kiu = 1 (tnh t v tr hin ti)
kiu = 2 (tnh t cui tp tin)
Nu fseek tr v 0 ngha l n di chuyn ti v tr .
Lu : s th t trn tp tin tnh t 0.
V d: Vit chng trnh truy xut ngu nhin mt mu tin theo s th t
ca n trong file nh phn
#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 thut lp trnh

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 hin li khi truy xut tp tin
Phn ln nhng hm xut, nhp tp tin chun khng thng bo r ni dung
ca li. Chng hn nh:
- putc () s tr v EOF khi c li hoc cui tp tin
- fgets () s tr v l NULL khi c ht file hoc khi c li
Do , pht hin li khi truy xut tp tin, ta dng macro ferror (FILE *fptr)
int

ferror (file * ptr)

Macro ferror tr v mt tr khc 0 nu pht hin ra li trn file fptr.


* xut cu thng bo li ta dng hm perror ()
void perror (const char * str)
vi str : chui k t cha cu thng bo
* Hai hm ny thng c s dng ngay sau khi s dng cc hm 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 thut lp trnh

68

fp = fopen("perror.dat", "r");
if (!fp)
perror("Khng th m file c");
}
Khi chy chng trnh ny, nu trn da cha c tp tin perror.dat th s hin
thng bo li: Khng th m file c: No such file or directory.

Bi tp
1. To tp tin din tch.h
#define
Pi
3.14
#define
dthv (x)
x*x
#define
dtht (x)
(Pi*x*x)
2. Vit chng trnh tnh din tch da vo file dientich.h trn
3. Vit hm qui tnh tch P(n) = 1 * 2 * 3* ....* n , n>0
4. Vit hm qui tnh hm m xn, vi n nguyn.
5. Vit hm qui tnh phn t th n ca hm Fibonacci.
6. Vit hm qui gii quyt bi ton Thp H ni.
C 3 ct A, B, C. Ct A hin ang c n da kch thc khc nhau, da nh
trn da ln di. Hy di n da t ct A sang ct C (xem ct B l ct trung
gian) vi iu kin mi ln ch c di 1 da v da t trn bao gi cng
nh hn da t di.
7. Vit chng trnh m ha v gii m mt file vn bn sao cho nu ta m
ha ri th chng trnh khng m ha na, v nu file cha m ha th
khng c gii m.
8. Cho bit trong mt file vn bn do ta nhp vo c bao nhiu k t, bao nhiu
t, v bao nhiu dng; bit rng cc t cch nhau khong trng, du tab, du
chm.
9. Vit chng trnh to mt menu thc hin cc chc nng sau trn file vn
bn:
- To file mi
- c file
- Xa file
- Ghi ni ui file
- Copy file
- Di chuyn file t th mc ny sang th mc khc
- Tm mt t xut hin bao nhiu ln trong file (khng phn bit ch in, ch

K thut lp trnh

69

thng)
- Thay th t ny bng t khc
10. To menu thc hin cc cng vic sau:
- Nhp danh sch c kiu hc vin vo mt file tn 'HOSO.TXT', mi hc
vin c cc thng tin sau: maso (int), hoten (chui ti a 30 k t), phi
(NAM/NU), tui (int).
- Lit k danh sch hc vin ra mn hnh theo dng sau:
M s
H v tn
Phi
Tui
- Truy xut ngu nhin theo th t mu tin
- Tm kim mt ngi trong file theo m s
- Cp nht sa i cc mu tin theo m s (Nhp m s, sau hiu chnh
li hoten, phai, v tui).
- Xa mt ngi trong file theo m s.

70

K thut lp trnh

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 nim v mng
mng:
I.1.1. nh ngha:
Mng l 1 dy cc phn t c cng kiu d liu c sp xp lin tip
nhau trong b nh
0100
0102
0104

1
2

int
Mng n phn t

n-1
B nh
Khai bo:
php:: Khai bo mng 1 chiu
C php
Kiu_DL Tnmng [kch thc];
Kiu_DL : l 1 trong cc kiu d liu c bn, l kiu ca phn t
ca mng
Tnmng: l tn ca mng c t 1 cch hp l
Kch thc: l 1 hng nguyn cho bit s phn t ti a ca mng
V d 1: Khai bo 1 mng s nguyn

int
int
int
bin

n;
M[n] ;
SAI
M[10] ; ng v kch thc mng phi l hng khng phi l

#define max 100


int
M[max] ;
V d 2: Khai bo 1 danh sch h tn hc vin ca 1 lp hc
char
C php:
php:

dshv[50][30]; // dshv c th cha ti a h tn 50 hc vin,


// chiu di h tn mi hc vin ti a l 30 k t
Khai bo mng 2 chiu

71

K thut lp trnh

Kiu_DL

Tnmng [kch thc 1][kch thc 2]

Ch : Mt mng trong C, cc phn t c nh s t 0 ti n-1


V d: Vi M[10]
th thnh phn th 1 l M[0]
thnh phn cui cng M[9]
* C khng bt b, khng kim tra xem bin m c vt ra khi gii hn
cho php ca mng cha. Do , chng ta phi kim tra bin m trong chng
trnh (phi nh hn n)
I.1.2. Khi ng tr cho mng:
Ta khi ng c tr cho mng trong 2 trng hp sau:
Mng c khai bo l bin ngoi (main) ngha l bin ton cc
Mng c khai bo cc b
V d 1 :
int
M[3] = {10,11,12}
main()
{
}
V d 2:
main()
{ static
int
M[ ]={10,22,30};
............
}
Ta c th gn 1 hng cho c mng nh sau:
memset (M,0,sizeof(int) *3) ; // gn 0 cho mng M vi M c 3 phn t
T kha static dng khai bo 1 bin cc b thng trc cho php duy
tr gi tr ring ca n nhng ln gi hm sau ny.
Khi to mng 2 chiu:
int

M[2][3]= {{1,2,3},,
{0,1,0}};

I.1.3.Truy xut thnh phn ca


ca mng: M[ch s]

Truy xut thnh phn th 2 ca mng 1 chiu: M[1]


Truy xut thnh phn th i ca mng 1 chiu: M[i-1]
Truy xut thnh phn dng 2, ct 3 ca mng 2 chiu M[1][2]
I.1.4. c (nhp) d liu cho mng:
- nhp d liu cho mng ta phi nhp d liu cho tng thnh phn ca
mng.
V d 1:

72

K thut lp trnh

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: Nhp vo mng 2 chiu.
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 liu kiu mng: xut d liu mng ta cng phi xut d
liu ca tng thnh phn mng
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 tm kim trn mng cha c th t:
Do mng cha c th t nn ta p dng phng php tm kim tuyn tnh tm
t u mng cho n cui mng. Trong chng trnh sau y, hm Timkim s
tr v tr -1 nu khng c m sinh vin trong danh sch ds, ngc li hm s tr
v v tr ca m s trong danh sch ds.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SOSV 100
typedef struct sinhvien

// s sinh vin ti a trong danh sch


// nh ngha kiu sinhvien

73

K thut lp trnh

{ char maso[6];
char hoten[30];
};
typedef struct danhsach_sv // nh ngha kiu 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 tm maso trong danhsach *psv

*/

int Timkiem(danhsach_sv *psv, char maso[])


{ int i=0;
while ((i<psv((i<psv->tssv) && (strcmp(psv(strcmp(psv->sv[i].maso, maso)!=0))
i++;
return (i==psv(i==psv->tssv ? -1 : i) ;

74

K thut lp trnh

}
void main()
main
{ struct danhsach_sv ds;
char maso[6];
int vitri;
Nhap_ds(&ds);
// Gi hm 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:
xp:
Trong thc t cuc sng cng nh trong lnh vc lp trnh, vic qun l d liu
thng i hi s tm kim cc d liu cn thit; thun tin cho vic tm
kim, d liu thng c sp xp theo mt th t no .
C rt nhiu phng php sp th t, trong bi ging ny ta ch kho st hai
phng php sp xp l Bubble_Sort v Quick_Sort.
thun tin ta gi s mng l dy s c ti a 100 s, v cc thut ton di
y dng sp xp dy s theo th t tng dn.
II.1. Sp xp theo phng php Bubble_Sort (phng php ni bt)
- Ni dung : Ta cho i duyt dy a[0], .. ,a[n-1]; nu a[i-1] ln hn a[i] th ta
hon i (a[i-1],a[i]). Lp li qu trnh duyt dy ny cho n khi khng c xy
ra vic i ch ca hai phn t.
V d: Ta sp th t dy 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 thut lp trnh

12
19
29
35
33
33
32
32
32
32
35
35
- Chng trnh:
#include <stdio.h>
#include <conio.h>
int mang[100];
// bin ton cc
int size ;
void Bubble_Sort(int A[100], int n)
{ int i,j,temp;
for (i=1; i<n; i++)
for (j=n(j=n-1;j>=i; j-j--)
--)
if (A[j(A[j-1] > A[j])
{ temp = A[jA[j-1];
A[jA[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()
main
{
size= Nhap_day_so(mang);
Bubble_Sort(mang,size);

33
35

76

K thut lp trnh

Liet_ke(mang,size);
}
Ta nhn thy phng php ny c th c ci tin d dng. Nu ln
duyt dy no m khng c c s i ch gia hai phn t th dy c th
t v gii thut kt thc. Trong trng hp ny, ta dng mt c hiu flag ghi
nhn iu ny, v gii thut Bubble Sort c ci tin 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 xp theo phng php Quick_Sort
II.2.1. Ni dung: Chn mt phn t bt k trong danh sch lm im cht
x, so snh v i ch nhng phn t trong danh sch ny to ra 3 phn: phn
c gi tr nh hn x, phn c gi tr bng x, v phn c gi tr ln hn x. Li tip
tc chia 2 phn c gi tr nh hn v ln hn x theo nguyn tc nh trn; qu
trnh chia phn s kt thc khi mi phn ch cn li mt phn t, lc ny ta c
mt danh sch c th t.
V d: Xt dy 26 33 35 29 19 12 32
Ln chia phn th nht : Chn phn t cht c kha l 29, t l x
26
i

33

35

29

19

12

32
j

Dng hai bin ch s i v j duyt t hai u danh sch n x. Nu i gp


phn t ln hn hay bng x s dng li, j gp phn t nh hn hay bng x s
dng li, ri i ch hai phn t ny; sau tip tc duyt cho n khi i>j th

K thut lp trnh

77

ngng li.
Lc ny dy s c 3 phn khc nhau nh hnh v sau :
26
33
35
29
19
12
32
i
j
19
33
32
26
12
35
29
i
j
26
12
19
29
35
33
32
ij
26
12
19
29
35
33
32
j
i
Ln chia phn th hai cho dy con 26 12 19, chn cht x=12
26
12
19
12
26
19
i
j
j
i
Kt thc ta s c hai phn : 12 ; 26 19
Ln chia phn th 3 cho dy con 26 19, chn cht x=26
26 19
19 26 Kt thc qu trnh chia nh dy con 26 12 19
i
j
j
i
- Ln chia phn th 4 cho dy con 35 33 32, chn cht x= 33
32
33
35
32
33
35
35 33 32
i
j
ij
j
i
Kt thc ta s c ba phn : 32 ; 33 ; 35
n y qu trnh chia phn kt thc v tt c cc phn ch c mt phn t,
lc ny ta s c mt danh sch c th t l :
12 19 26 29 32 33 35
II.2.2. Gii thut:
a. Gii thut khng quy:
- Ta to mt Stack , mi phn t ca Stack c 2 thnh phn l q, r cha ch
s u v ch s cui ca dy cn sp. Ban u, Stack[0].q = 0 v Stack[0].r =n-1
- Tin hnh phn hoch dy s gm cc s bt u t ch s q n ch s r
- Sau mi ln chia phn, ta kim tra xem phn c gi tr nh hn cht v
phn c gi tr ln hn cht nu c t 2 phn t tr ln th a vo Stack. Sau
mi ln phn hoch, ta li ly dy s mi t Stack ra phn hoch tip.
- Qu trnh c nh th cho ti khi Stack rng th kt thc.
* Chng trnh:

K thut lp trnh

78

#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)
Quick_Sort
{ struct Element_Stack
// kiu phn t trong Stack
{
int q, r;
};
Element_Stack Stack[50]; // Stack c ti a 50 phn t
int sp=0;
// con tr Stack, khi to sp=0
int i,j,x,q,r,temp;
Stack[0].q =0 ;
// ch s u ca mng cn sp
Stack[0].r =n-1;
// ch s cui ca mng cn sp
do
{ // Ly mt phn hoch ra t Stack
q = Stack[sp].q ; r =Stack[sp].r ;
sp--;
// Xa 1 phn t khi Stack
do
{ // Phn on dy con a[q] ,..., a[r]
i = q; j =r;
x = A[(q+r) / 2] ; // Ly phn t gia ca dy cn sp th t lm cht
do
{ while (A[i] < x) i++; //Tm phn t u tin c tr ln hn hay bng x
while (A[j] > x) j--; //Tm phn t u tin c tr nh hn hay bng 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);
if (i<r)
// phn th ba c t 2 phn t tr ln
{ // a vo Stack ch s u v ch s cui ca phn th ba

K thut lp trnh

79

sp++;
Stack[sp].q=i;
Stack[sp].r=r;
}
r = j ; // Chun b v tr phn hoch phn c gi tr nh hn cht
} while (q< r);
} while (sp!=-1); // Ket thuc khi Stack rong
}
int Nhap_day_so (int A[])
/* To dy n s ngu nhin t 0 n 9999 a vo mng 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; // Pht sinh cc s ngu nhin 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()
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 hin th cng ging nh
gii thut khng qui, nhng ta khng kim sot Stack m cho qu trnh gi
qui t to ra Stack.
* Chng trnh:

K thut lp trnh

80

void Sort(int
A[], int q,int r)
Sort
{ int temp;
int i=q;
int j=r;
int x = A[(q+r) / 2] ; // Ly phn t gia ca dy cn sp th t lm cht
do
{ // Phn on dy con a[q] ,..., a[r]
while (A[i] < x) i++; //Tm phn t u tin c tr ln hn hay bng x
while (A[j] > x) j--; //Tm phn t u tin c tr nh hn hay bng 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)
// phn th nht c t 2 phn t tr ln
Sort(A,q,j);
if (i<r)
// phn th ba c t 2 phn t tr ln
Sort (A,i,r);
}
void Quick_Sort(int
A[], int n)
Quick_Sort
{ Sort( A,0,n-1);
// Gi hm Sort vi phn t u c ch s 0 n
// phn t cui cng c ch s n-1
}
III. Tm kim trn mng c th t:
t:
Gi s dy s ca ta l dy s c th t tng dn, v x l gi tr cn tm.
Cc hm tm kim s tr v tr -1 nu khng c x trong dy, ngc li cc hm
tm kim s tr v ch s ca x trong dy.
III.1. Tm kim nhanh bng phng php lp:
- Ni dung: Do dy s c th t tng dn, nn nu ta tm c phn t
u tin c tr va ln hn x th ta c th kt lun dy s khng cha tr x. V
vy, ta s rt ngn thi gian tm kim.
- Gii thut:
int Search(int A[], int n, int x)

K thut lp trnh

81

{ 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 tm kim nh phn:
- Ni dung:
Bc 1: Phm vi tm kim ban u l ton b danh sch.
Bc 2: Ly phn t chnh gia ca phm vi tm kim (gi l y) so snh
vi x.
Nu x=y th ta tm thy, tr v ch s. Gii thut kt thc
Nu x < y th phm vi tm kim mi l cc phn t nm pha trc
ca y.
Nu x > y th phm vi tm kim mi l cc phn t nm pha sau ca y.
Bc 3: Nu cn tn ti phm vi tm kim th lp li bc 2, ngc li
gii thut kt thc vi kt qu l khng c x trong dy s.
- Gii thut:
int Binary_Search(int A[], int n, int x)
{ unsigned char found=FALSE; // Gi s ban u ta cha tm thy x trong dy
// Phm vi ban u tm kim l t k=0 m = n-1
int k=0;
int m=n-1;
int j;
while (k<=m && !found)

K thut lp trnh

82

{ j=(k+m) /2;
//ch s phn t gia
if (A[j]==x)
found=TRUE;
else if (x>A[j]) k=j+1;
// Phm vi tm mi l (j+1, m)
else m=j-1;
// Phm vi tm mi l (k, j-1)
}
return (found ? j : -1) ;
}
III.3. Php tm kim nh phn qui:
- Ni dung: tng t nh trn
Bc 1: Phm vi tm kim ban u l ton b danh sch (k=0 m=n-1).
Bc 2: Ly phn t chnh gia ca phm vi tm kim (gi l y) so snh
vi x.
Nu x=y th ta tm thy, tr v ch s. Gii thut kt thc
Nu x < y th phm vi tm kim mi l cc phn t nm pha trc
ca y, nn ta gi qui vi phm vi mi l (k,j-1)
Nu x > y th phm vi tm kim mi l cc phn t nm pha sau ca y,
nn ta gi qui vi phm vi mi l (j+1,m )
iu kin dng: x=y hoc k > m.
- Gii thut:
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 thut lp trnh

Bi tp:
tp:
1. Cho mt dy n s thc A :
a) Tm phn t nh nht ca dy s A
b) Tm phn t ln nht ca dy s A
c) Tnh gi tr trung bnh ca dy s A.
2. Hin ang lu hnh cc t giy bc 50000, 20000, 10000, 5000, 2000,
1000, 500, 200, 100. Nu c x ng, hi rng nn chn cc t giy bc no
s lng cc t giy bc l t nht.
3. Vit chng trnh nhp mt ma trn s nguyn c kch thc M x N. In ra:
- Tng cc phn t ca ma trn
- S cc phn t dng, phn t m, phn t 0 ca ma trn
- Phn t ln nht, nh nht ca ma trn
- Cc phn t trn ng cho chnh ca ma trn (vi M = N )
- Tng cc phn t trn ng cho chnh ca ma trn (vi M = N )
4. Cho 2 ma trn vung A(n,n) v B (n,n) :
- Tnh ma trn tng C = A+ B,
bit C[i,j] = A[i,j] + B[i,j] , i,j [1,m]
- Tnh ma trn tch D = A * B,
n

bit D [i,j] = A[i , k ] * B[ k , j ]


k 1

; i, j = 1..n

5. To mt menu thc hin cc cng vic sau:


a. Nhp danh sch c kiu hc vin vo mt mng, mi hc vin c cc
thng tin sau: maso (int), hoten (chui ti a 30 k t), phi(NAM/NU), im
(float), hng (unsigned char). Qu trnh nhp s dng li khi m s nhp vo
l 0.
b. Lit k danh sch hc vin ra mn hnh theo dng sau:
M s
H v tn
Phi
im
Hng
c. Tm kim mt hc vin trong danh sch theo m s, v in ra cc thng tin
cn li ca hc vin .
d. Sp xp danh sch hc vin theo im tng dn.
e. Xp hng danh sch hc vin theo qui tc cng im th cng hng, hng
ca hc vin sau bng hng ca nhm hc vin trc cng s ngi ca nhm
hc vin trc cng im.
f. Gi s danh sch hc vin c th t tng dn theo im; Nhp thm 1
hc vin sao cho sau khi nhp th danh sch vn cn c th t.
g. Cp nht sa i cc mu tin theo m s (Nhp m s, sau hiu chnh

84

K thut lp trnh

li hoten, phai, im).


h. Loi b 1 hc vin ra khi danh sch da vo m s.
6. a) Vit chng trnh to ngu nhin mt dy s 20000 s nguyn c gi tr t
0 n 9999.
b) m s ln so snh ca 2 gii thut tm kim tun t (trn dy s cha c
th t) v tm kim nh phn (trn dy s c sp th t).
c) Trong trng hp dy s trn l 200000 s nguyn phn bit khc nhau
trong min gi tr [1..300000] th ta ti u gii thut sp xp v mt khng
gian v thi gian nh th no? Cho bit thi gian thc thi ca gii thut
Quick Sort v gii thut bn ci t.
7. Cho bit thi gian thc thi ca 2 gii thut Bubble Sort v Quick Sort trn dy
s c s phn t kh ln.
8. Gi s ta c 1 dy s thc A tng dn. Vit gii thut thm 1 s thc x vo
dy A sao cho sau khi thm x th dy vn tng dn ?
9. Vit hm xa tt c cc phn t c tr bng x trong dy s A.
10. Vit chng trnh tnh im ca mt lp:
- Nhp cc thng tin sau cho mi hc vin : hoten, namsinh, trung bnh
HK1, trung bnh HK2
- In ra danh sch cc hc vin ca lp theo th t gim dn ca TB ton
nm
TB ton nm = (TB HK1 + TB HK2)/2
theo mu sau:
DANH SCH iM LP ......
STT

H & Tn

TB HK1

TB HK2

TB ton
nm

Hng

1
2
3

Lu :- Cc hc vin cng TB th cng hng


- In 17 hc vin trn mt trang mn hnh
11. Cho 2 dy s A c n phn t v B c m phn t vi th t tng dn. Hy trn
2 dy s trn thnh 1 dy mi C sao cho sau khi trn th C cng tng dn.

85

K thut lp trnh

CHNG 4

CON TR (POINTER)

I. NH NGHA
Con tr l mt kiu d liu dng cha a ch. Bin con tr l mt bin
cha a ch ca mt thc th no , thc th l bin hoc l hm.
Con tr thng c dng :
- Tr v nhiu tr t hm qua c ch truyn theo tham s theo a ch trong
hm (tham s hnh thc bin).
- To cc cu trc d liu phc tp nh danh sch lin kt v cy nh phn.
- Truyn mng v chui gia cc hm kh thun li.
I.1. Khai bo: Khai bo bin pi l con tr tr n mt s nguyn.
int *pi;
Lc ny, pi chim 2 bytes cha a ch ca s nguyn m n ang ch
n, ng thi trnh bin dch ca C cng bit pi ang ch n mt s nguyn
(do khai bo). a mt gi tr nguyn vo vng nh m pi ang tr n, ta
dng lnh: *pi = 1;
V d:
void main()
{ int x=4, y=10;
int *px, *py ;
px = &x ;
py = &y;
*px = *px + *py;

// px, py l cc bin con tr


// a a ch ca x,y vo px v py
// tng gi tr ca vng nh m px ang tr ti
// thm y , tng ng vi x = x+y

}
Minh ha chng trnh trn trong b nh:
Bin
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 thut lp trnh

Hnh 7.1. C ch truy xut gi tr qua bin con tr.


Tng qut:

Kiu *bin;

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


bin x cho hm. Nh vo c ch truyn theo a ch ny m hm c th tr v
nhiu gi tr cho chng trnh gi.
V d: Hm hon i gi tr ca 2 bin 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); // Truyn a ch ca 2 bin x,y cho hm hoandoi
}
II Cc php ton trn bin con tr:
II.1. Ton t a ch &:
Nu x l bin thng thng, &x s l a ch ca bin x
V d:
float x, *pf;
x = 50;
pf = x;
// sai v pf l bin con tr nn ta vit pf = & x;
x = pf;
// sai ; ta vit x = *pf; { ly ni dung ca pf }
II.2. Ton t ni dung * :
Nu p l pointer th *p l ni dung ca n.
int x,y, *p;
V d:
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 nn *p tng th a tng)
*x l bin m x gi a ch
Tm li:
li
&x l a ch ca x nu x l bin thng thng

87

K thut lp trnh

II.3. Php cng tr bin con tr vi mt s nguyn:


Nu p l bin pointer th p+n l a ch ca mt bin mi cch n n bin
theo chiu tng, cn p-n th ngc li.

Ch :
:
- Php cng con tr vi mt s nguyn ch c p dng trn mt dy bin
cng kiu
- Khng c cng 2 pointer vi nhau
- Khng c nhn, chia, ly d bin con tr vi bt k s no
V d: Gi s ta c mng nums[]= {10,20,30,40,50}. Vic tham kho ti
nums[i] thc cht l dng dng k hiu con tr, v khi bin dch, trnh bin dch
s chuyn i k hiu mng thnh k hiu 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: cc bin con tr c th gn cho nhau vi iu kin phi cng


kiu
V d: int *p1, *p2;
*p1 = 10;
p2 = p1;
// lc ny *p2 = 10;
- Php so snh: ta c th so snh 2 bin con tr xem c cng a ch hay
khng, ng nhin 2 bin con tr phi cng kiu vi nhau.
II.5. S chuyn kiu:
C php:

( Kiu)

*tnbin

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 thut lp trnh

*p = 97;
// num =97
n = *p;
// n=97
c = (char) *p; // c = a
Ch :: a ch ca mt bin c xem nh mt con tr hng, do n
khng c php gn, tng hoc gim.
V d: int num, *p, n;
p = & num;
p ++; // ng
( & num) ++;
// sai
con tr hng
II.6. Khai bo mt con tr hng v con tr ch n i tng hng:
a. Con tr hng:
Kiu * const p = gi tr;
b. Con tr ch n i tng hng:
Kiu const *p = gi tr hng;
hoc Const kiu *p = gi tr hng;
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 mng A nh sau:
int
A[10] , *p;
th
A = &A[0]
Nu p = A th truy xut ti phn t th i ca mng A, ta c cc cch sau:
A[i] *(A + i) *( p + i)
& A[i] (A + i) (p +i )
V d: Nhp mng A:
int A[10] , *p, i;
p = A;
for (i = 0; i< 9; i++)
scanf (%d, p+i );
Xut mng A:
for (i = 0; i< 9;i++)
printf (%d, *(p+i));

K thut lp trnh

V d: Sp xp mng bng cch tham kho 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 mng 2 chiu:
Nu ta khai bo : Kiu a [10] [20] , *p; th mng a c dng:
a
0
1
2
3
.....
18
19
0
1
2
3
a[i]
.
9

xt::
Nhn xt
a = &a[0][0] = &a[0]
a[i] = &a[i][0]

89

90

K thut lp trnh

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


Vi p = a th truy xut ti a[i][j] :
a[i][j] = *(*(p+i) +j)
& a[i][j] = (*(p+i) +j)
V d:Nu 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 ton b mng (gi s l 1000)
- Do a l mng nguyn nn mi phn t chim 2 bytes, v mi dng ca
mng s chim 10 bytes.
- Trnh bin dch ca C bit s ct (do khai bo) nn n s hiu a+1 l
em 1000 + 10 bytes, kt 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 ny: a[1] hay a+1 l a ch ca dng th 2 trong mng 2 chiu a.


Ta c : *(a+1) == 1010
// a ch ca phn t u tin trn dng 1
*(a+1)+3 == 1016 // a ch ca phn t c ch s 3 trn dng 1
*(*(a+1)+3)==5
// ni dung ca phn t a[1][3]
Tm li:
a[i][j] = *(*(a+i)+j)
Ta cn c mt cch khc truy xut ti a[i][j] :
Nu : Kiu
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:
- Bin con tr th c th tng, gim hoc gn cn bin mng l mt con tr
hng do khng th tng, gim hoc gn.
- Ta c th ly a ch ca con tr nhng khng th ly a ch ca mng v
bn thn mng l a ch.
- Khi ta khai bo mt mng th chng trnh dch s cp pht mt vng nh
cho n.
Kiu a[50]
V d 1:

91

K thut lp trnh

Trong b nh :
0
1

49

a
- Bin con tr khi c khai bo th ch c cp mt nh m ni dung
ca n chng bit ch n u
V d 2: a[1]xc nh thnh phn th 2
p+1 : ni dung khng xc nh
phi c p = a p ch ti a
- Nu ta mun to mt mng bng con tr th ta phi xin cp pht mt vng
nh bng hm 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)
- loi b vng nh c cp cho con tr ta dng hm free (p)
2. S khc nhau gia tham s ca hm l mng v i s l pointer:
Hm (kiu a[])
Hm (kiu *p)
Ch :
Nu: Kiu a[50][30], *p;
p= a;
th
Hm (Kiu a[][30])
Hm (Kiu *p)
3. Hm tr v kiu con tr:
Kiu *hm (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 thut lp trnh

return s1 ;
}
IV. Con tr v chui
IV.1. Khai bo: khai bo s l 1 chui k t v p l con tr tr n 1 chui
k t, ta vit nh sau:
char s [50];
char *p;
khi to 1 chui trong c 2 trng hp:
static char s[] = ABCD;
char *p = ABCD;
Lc ny, nu 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);
}
Vit li hm strcpy bng con tr:
void strcpy (char *dest, const char *source)
{ while (( *dest = *source) !=\0)
{ dest ++;

K thut lp trnh

source ++;
}
}
b. Hm Strcmp () : dng so snh 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]);
}
Ci t li bng 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 ;
}
Ci t li bng 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 thut lp trnh

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] ;
}
Ci t li bng 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
bo:: khai bo 1 mng con tr ch n chui, v d nh danh sch
h tn, ta vit nh sau:
char * ds[5]=

// mng chui ds[5][7]

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


Nu ta khi to mng m khng dng con tr th lng nh cp pht cho
mi phn t ca mng u bng vi s k t ca chui di nht; Trong khi ,

95

K thut lp trnh

nu khi to bng mng con tr nh trn th lng nh s cp pht va cho


tng phn t ca mng.
ds[0]
ds[1]
ds[2]
ds[3]
ds[4]

H o
a
n
g
\0
V a
n
\0
C h
i
\0
N g
o
c
\0
N g
u
y
e
t
Hnh 3.2. Mng con tr tr n chui

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

H o
a
n
g
\0
V a
n
\0
C h
i
\0
N g
o
c
\0
N g
u
y
e
t
Hnh 3.3. Mng cc chui

\0

\0

* X l con tr n chui: xt v d sp xp danh sch h tn 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]; // ly a ch ca chui h tn trong ds a
// vo mng con tr p
}

K thut lp trnh

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 trnh trn thc cht ta ch hon i gi tr ca mng con tr
p ch mng chui ds vn nh c.

Bi tp:
1. Sp xp li danh sch hc vin theo th t h tng dn bng con tr.
2. Sp xp li danh sch hc vin theo th t tn tng dn, nu trng tn th
sp theo h bng con tr.
3. Sp xp li danh sch hc vin theo th t tn tng dn, nu trng tn th
sp theo h bng mng chui.

97

K thut lp trnh

CHNG 5

CC THUT TON TRN CU TRC


DANH SCH LIN KT (LINKED LIST)

I. Khi nim:
nim:
Cu trc danh sch lin kt l cu trc ng, vic cp pht nt v gii
phng nt trn danh sch xy ra khi chng trnh ang chy. Ta thng cp pht
nt cho danh sch lin kt bng bin ng.
Cc phn t s c cp pht vng nh trong qu trnh thc thi chng
trnh, do chng c th nm ri rc nhiu ni khc nhau trong b nh (khng
lin tc) .
First

First

Nil

Cc phn t trong danh sch c kt ni vi nhau theo chm lin kt nh


hnh trn:
- First l con tr ch n phn t u ca danh sch lin kt
- Phn t cui ca danh sch lin kt vi vng lin kt c gi tr NULL
-Mi nt ca danh sch c trng info cha ni dung ca nt v trng
next l con tr ch n nt k tip trong danh sch.
* Lu :
- Cu trc danh sch lin kt l cu trc ng, cc nt c cp pht hoc
b gii phng khi chng trnh ang chy.
- Danh sch lin kt rt thch hp khi thc hin cc php ton trn danh
sch thng b bin ng. Trong trng hp xa hay thm phn t trong danh
sch lin kt th ta khng di cc phn t i nh trong mng m ch vic hiu
chnh li trng next ti cc nt ang thao tc. Thi gian thc hin cc php ton
thm vo v loi b khng ph thuc vo s phn t ca danh sch lin kt.

K thut lp trnh

98

- Tuy nhin, danh sch lin kt cng c cc im hn ch sau:


+ V mi nt ca danh sch lin kt phi cha thm trng next nn danh
sch lin kt phi tn thm b nh.
+ Tm kim trn danh sch lin kt khng nhanh v ta ch c truy xut
tun t t u danh sch.
Khai bo : Mt phn t ca danh sch lin kt t nht phi c hai thnh
phn : ni dung ca phn t (info) v thnh phn next lin kt phn t ny vi
phn t khc.
Gi s ta khai bo kiu NODEPTR l kiu con tr ch n nt trong 1 danh
sch lin kt, mi phn t c 2 thnh phn : info (int) v next .
struct node
{ int info ;
struct node *next ;
};
typedef struct node *NODEPTR;
- khai bo bin First qun l danh sch lin kt ta vit nh sau:
NODEPTR First;
- Khi to danh sch lin kt : First = NULL;
- Ghi ch :
Thnh phn cha ni dung c th gm nhiu vng vi cc kiu d liu
khc nhau.
Thnh phn lin kt cng c th nhiu hn mt nu l danh sch a lin
kt hoc danh sch lin kt kp.
First l con tr tr n phn t u tin ca danh sch lin kt, n c th
l kiu con tr (nh khai bo trn), v cng c th l mt struct c hai
thnh phn: First tr n phn t u tin ca danh sch lin kt, v Last
tr n phn t cui ca danh sch lin kt.
struct Linked_List;
{ First NODEPTR;
Last NODEPTR;
};
II. Cc
c php ton trn danh sch lin kt:
kt:
II.1. To danh sch:
a. Khi to danh sch (Initialize): dng khi ng mt danh sch lin
kt, cho chng trnh hiu l hin ti danh sch lin kt cha c phn t.
void Initialize(NODEPTR &First)
{

K thut lp trnh

99

First = NULL;
}
b. Cp pht vng nh (New_Node): cp pht mt nt cho danh sch lin
kt. Hm New_Node ny tr v a ch ca nt va cp pht.
Trong chng trnh c s dng hm malloc (trong <alloc.h>) , hm ny cp
pht mt khi nh tnh theo byte t b nh heap. Nu cp pht thnh cng, hm
malloc tr v a ch ca vng nh va cp pht, ngc li n s tr v NULL.
NODEPTR New_Node()
{
NODEPTR p;
p = (NODEPTR)malloc(sizeof(struct node));
return (p);
}
c. Thm vo u danh sch (Insert_First): thm mt nt c ni dung x vo
u danh sch lin kt.
void Insert_First (NODEPTR &First, int x)
{
NODEPTR p;
p = New_Node();
p->info = x;
p->next = First;
First = p;
}
d. Thm nt mi vo sau nt c a ch p (Insert_After): thm mt nt c
ni dung x vo sau nt c a ch p trong danh sch lin kt 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 thut lp trnh

100

II.2. Cp nht danh sch:


a. Gii phng vng nh(Free_Node): Hm ny dng hy nt cp
pht, v tr vng nh v li cho memory heap.
void Free_Node(NODEPTR p)
{
free(p);
}
b. Kim tra danh sch lin kt rng hay khng (Empty): hm Empty tr v
TRUE nu danh sch lin kt rng, v ngc li.
int Empty(NODEPTR First)
{
return(First == NULL);
}
c. Xa phn t u ca danh sch (Delete_First): mun xa 1 phn t khi
danh sch lin kt th ta phi kim tra xem danh sch c rng hay khng. Nu
danh sch c phn t th mi xa c.
int Delete_First (NODEPTR &First)
{ NODEPTR p;
if (Empty(First))
return 0;
else
{
p = First; // nut can xoa la nut dau
First = p->next;
Free_Node(p);
return 1;
}
}
d. Xa phn t ng sau nt c a ch p (Delete_After):
int Delete_After(NODEPTR First, NODEPTR &Last, NODEPTR p)
{ NODEPTR q;
// nu p l NULL hoc sau p khng c nt
if((p == NULL) || (p->next == NULL))
return 0;
q = p->next; // q chi nut can xoa
p->next = q->next;
Free_Node(q);

K thut lp trnh

101

if (p->next==NULL) Last=p;
}
e. Xa ton b danh sch (Delete_All): ta c th s dng lnh *First =
NULL xa ton b danh sch, nhng trong b nh, cc vng nh cp pht
cho cc nt khng gii phng v li cho memory heap, nn s lng ph vng nh.
Do , ta s dng gii thut sau:
void Delete_All (NODEPTR &First)
{ NODEPTR p;
while (First != NULL)
{ p=First;
First = First->next;
// hoc First = p->next
Free_Node(p);
}
}
II.3. Duyt danh sch: Thng thng ta hay duyt danh sch lin kt thc
hin mt cng vic g , nh lit k d liu trong danh sch hay m s nt
trong danh sch...
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. Tm kim (Search): Tm nt u tin trong danh sch c info bng vi x.
Do y l danh sch lin kt nn ta phi tm t u danh sch.
Hm Search nu tm thy x trong danh sch th tr v a ch ca nt c tr
bng x trong danh sch, nu khng c th tr v tr NULL.
NODEPTR Search(NODEPTR First, int x)
{
NODEPTR p;
p = First;

K thut lp trnh

102

while(p != NULL && p->info != x )


p = p->next;
return (p);
}
II.5. Sp xp (Selection_Sort): sp xp danh sch lin kt theo th t info tng
dn.
- Ni dung: Ta so snh tt c cc phn t ca danh sch chn ra mt
phn t nh nht a v u danh sch; sau , tip tc chn phn t nh nht
trong cc phn t cn li a v phn t th hai trong danh sch. Qu trnh
ny lp li cho n khi chn ra c phn t nh th (n-1).
- Gii thut:
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 thut lp trnh

103

Bi tp:
tp:
1. Vit chng trnh to mt menu thc hin cc cng vic sau:
a. Nhp danh sch lin kt theo gii thut thm v u danh sch, mi phn t
gm c cc thng tin sau: mssv (int), v hoten ( char hoten[30] ).
b. Lit k danh sch ra mn hnh
c. Cho bit tng s nt trong danh sch lin kt, t tn hm l Reccount
( int Reccount(NODEPTR First) )
d. Thm 1 phn t c ni dung info (mssv, hoten) vo sau phn t c th t
th i trong danh sch.
Ghi ch: - Th t theo qui c bt u l 1
- Nu (i <= 0) thm vo u danh sch
Nu i > Reccount(&First) th thm vo cui danh sch.
e. In ra h tn ca sinh vin c m do ta nhp vo.
f. Loi b nt c m do ta nhp vo, trc khi xa hi li "Bn tht s mun
xa (Y/N) ? "
g. Sp xp li danh sch theo th t m s gim dn.
h.Ghi ton b danh sch vo file tn 'DSSV.DAT'
i. Np danh sch t file 'DSSV.DAT' vo danh sch lin kt. Nu trong danh
sch lin kt c nt th xa tt c d liu hin c trong danh sch lin kt
trc khi a d liu t file vo.
2. Vit chng trnh to mt danh sch lin kt theo gii thut thm vo cui
danh sch, mi nt cha mt s nguyn.
3. -Vit hm tn Delete_Node xa nt c a ch p.
- Vit mt hm loi b tt c cc nt c ni dung x trong danh sch lin kt
First.
4. Vit hm Copy_List trn danh sch lin kt to ra mt danh sch lin kt
mi ging danh sch lin kt c.
5. Ghp mt danh sch lin kt c a ch u l First2 vo mt danh sch lin
kt c a ch u l First1 ngay sau phn t th i trong danh sch lin kt
First1.
6. Vit hm lc danh sch lin kt trnh trng hp cc nt trong danh sch
lin kt b trng info.
7. o ngc vng lin kt ca mt danh sch lin kt sao cho:
- First s ch n phn t cui
- Phn t u c lin kt l NULL.

K thut lp trnh

104

8. Vit hm Left_Traverse (NODEPTR &First) duyt ngc danh sch lin


kt.
9. Vit gii thut tch mt danh sch lin kt thnh hai danh sch lin kt, trong
mt danh sch lin kt cha cc phn t c s th t l v mt danh sch
lin kt cha cc phn t c s th t chn trong danh sch lin kt c.
10.- To mt danh sch lin kt cha tn hc vin, im trung bnh, hng ca
hc vin (vi iu kin ch nhp tn v im trung bnh). Qu trnh nhp s
dng li khi tn nhp vo l rng.
- Xp hng cho cc hc vin. In ra danh sch hc vin th t hng tng dn
(Ghi ch : Cng im trung bnh th cng hng).
11. Nhp hai a thc theo danh sch lin kt. In ra tch ca hai a thc ny.
V d: a thc First1 : 2x5+4x2-1
a thc First2 : 10x7-3x4+x2
Kt qu in ra : 20x12 + 34x9 - 8x7 - 12x6 + 7x4 - x2
(Ghi ch : Khng nhp v in ra cc s hng c h s bng 0)
12. Vit gii thut thm phn t c ni dung x vo danh sch lin kt c th t
tng dn sao cho sau khi thm danh sch lin kt vn c th t tng.
13. Loi b phn t c ni dung l x trong danh sch lin kt c th t tng dn.
14. Cho 2 danh sch lin kt First1, First2 c th t tng dn theo info. Vit gii
thut Merge trn 2 danh sch lin kt ny li sao cho danh sch lin kt
sau khi trn cng c th t tng dn.

105

K thut lp trnh

CHNG 6

cc thut ton trn cu trc cY

(Tree)
Cy l mt cu trc d liu rt thng dng v quan trng trong nhiu phm
vi khc nhau ca k thut my tnh.
V d : T chc cc quan h h hng trong mt gia ph, mc lc ca mt
cun sch, xy dng cu trc v c php trong cc trnh bin dch.
Trong chng trnh ny, chng ta kho st cc khi nim c bn v cy, cc
php ton trn cy nh phn, cng nh cc php ton trn cy nh phn cn bng
( AVL tree) v ng dng ca hai loi cy nh phn tm kim (BST), cy nh phn
cn bng ( AVL tree).
I. Phn loi cy:
cy:
I.1. Mt s khi nim c bn:
1. Cy:
Cy Cy l tp hp cc phn t gi l nt, mt nt (tng t nh mt
phn t ca dy) c th c kiu bt k. Cc nt c biu din bi 1 k t ch,
mt chui, mt s ghi trong mt vng trn.

Mt s nh ngha theo quy


w Mt nt n cng chnh l mt cy.
w Cc nt c gi l cng mt cy khi c ng i gia cc nt ny.
w Mt cy s bao gm mt nt gc (Root) v m cy con, trong mi cy con
li c mt nt gc v m1 cy con nh hn v.v.
w Mt cy khng c mt nt no c gi l cy rng.
V d 1 :
Nu
t go
c

- A l nt gc vi 3 cy con ln
lt c 3 nt gc ring 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

Hnh 5.1. Cy vi nt gc l A
V d 2 : Vi cng mt mn hc T, ta c th biu din dng cy nh
sau :

106

K thut lp trnh

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

Hnh 5.2

CHNG III
2. Nt cha (Ancestor) : Nt ng trn ca mt nt c gi l nt cha
C l nt cha ca G, H
Nt con (descendent) : Nt ng sau mt nt khc c gi l nt con ca
nt .
Nt I, J, K l nt con ca nt E
3. Bc (degree) :
- Bc ca nt l s cy con ca nt .
C c bc l 2, E c bc l 3 (Hnh 5.1)
- Bc ca cy l bc ln nht ca cc nt trong cy.
Cy trong hnh 5.1 c bc l 3.
Cy bc n c gi l cy n phn nh cy nh phn, cy tam phn.
4. Nt l v nt trung gian:
gian
- Nt l l nt c bc bng 0 (tc l khng c cy con no) :
- Nt trung gian: l mt nt c bc khc 0 v khng phi l nt gc.
V d: Trong hnh 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
V d: trong hnh 5.1,
A
c mc l 1

107

K thut lp trnh

B, C, D
c mc l 2
G, H, E, F c mc l 3
I, J, K
c mc l 4
6. Chiu cao ca cy (height) : l mc ln nht ca cc nt l trong cy.
V d: Cy trong hnh 5.1 c chiu cao l 4
7. Th t ca cc nt (order of nodes) : Nu cy c gi l c th t th
phi m bo v tr ca cc nt con t tri qua phi, tc l nu thay i v tr ca
mt nt con bt k th ta c mt cy mi.
V d :

A
cay khac

Hnh 5.3: Sau khi i v tr ca 2 nt B, C ta c cy mi.


8. Chiu di ng i (Path length):
- Chiu di ng i ca nt x: l s cc cnh i t nt gc n nt x.
V d: Trong hnh 5.1:
Nt gc A c chiu di ng i l 1
Nt B, C, D c chiu di ng i l 2
Tng qut: mt nt ti mc i c chiu di ng i l i
- Chiu di ng i ca cy: l tng ca cc chiu di ng i ca tt c
cc nt trong cy.
V d: Chiu di ng i ca cy trong hnh 5.1 l 31.
Chiu di ng i trung bnh ca cy:

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

trong ni l s cc nt mc i v n l tng s cc nt trong cy.


I.2. Cch biu din cy: biu din 1 cy, ta c nhiu cch nh biu din
bng th,bng gin , bng ch s.. Nhng thng thng, ta hay dng dng
th biu din 1 cy nh hnh 5.1
I.3. Biu din th t cc nt trong cy :
Mt cy thng t chc cc nt theo mt th t nht nh cn c vo mt
ni dung gi l kha ca cc nt. C th t chc cy c kha tng dn theo mc
t tri qua phi nh v d sau :

108

K thut lp trnh
R oot

ROOT

Nh vy khi duyt li cy theo mc


tng dn v t tri qua phi ta s li
c c th t cc nt nh trn.

3
4
6

1 2 3 4 5 6 7 8 9

5
7

Hnh 5.4. Cy c th t tng dn theo mc t tri qua phi


II. Cy nh phn (Binary tree)
II.1. nh ngha :
1. Cy nh phn l cy c bc bng 2, tc l s nt con ti a ca mt nt
bt k trong cy l 2.
Cy nh phn c th l mt cy rng (khng c nt no) hoc cy ch c
mt nt, hoc cy ch c cc nt con bn tri (Left Child) hoc nt con bn phi
(Right Child) hoc c hai.
V d: Hnh 5.4 l cy nh phn.
2. Cc cy nh phn c bit:
- Cy nh phn ng: Mt cy nh phn c gi l cy nh phn ng nu
nt gc v tt c cc nt trung gian u c 2 nt con.

A
B
D

C
E

X
Y

F
H

Hnh 5.5. Cy nh phn ng


Ghi ch: nu cy nh phn ng c n nt l th cy ny s c tt c 2n-1 nt.
- Cy nh phn y: Mt cy nh phn gi l cy nh phn y vi chiu cao
d th:

109

K thut lp trnh

. N phi l cy nh phn ng v
. Tt c cc nt l u c mc l d.
Hnh 5.5 khng phi l cy nh phn y
A
B

C
E

D
I

F
K

Hnh 5.6. Cy nh phn y.


Ghi ch: Cy nh phn y l cy nh phn c s nt ti a mi mc.
- Cy nh phn tm kim (Binary Search Tree): Mt cy nh phn gi l cy
nh phn tm kim nu v ch nu i vi mi nt ca cy th kha ca mt nt
bt k phi ln hn kha ca tt c cc nt trong cy con bn tri ca n v phi
nh hn kha ca tt c cc nt trong cy con bn phi ca n.
V d:

k1 <k1 <k1

8
7

3
2
1

11
5

10

12

Hnh 5.7. Cy nh phn tm kim (BST)


- Cy nh phn cn bng (AVL): Mt cy nh phn c gi l cy nh phn
cn bng nu v ch nu i vi mi nt ca cy th chiu cao ca cy con bn
tri v chiu cao ca cy con bn phi hn km nhau nhiu nht l 1. (Theo
Adelson-Velski v Landis).

110

K thut lp trnh
A

C
D

E
G

Hnh 5.8. Cy nh phn cn bng


- Cy nh phn cn bng hon ton: Mt cy nh phn c gi l cy nh
phn cn bng hon ton nu v ch nu i vi mi nt ca cy th s nt ca
cy con bn tri v s nt ca cy con bn phi hn km nhau nhiu nht l 1.
A

B
E

C
D

E
H

Hnh5.9. Cy nh phn cn bng hon ton


3. Cc php duyt cy nh phn (Traverse) : l qu trnh i qua cc nt
ng mt ln. Khi duyt cy, ta thng dng 3 cch duyt c bn sau :
Preorder - Tin t (NLR) duyt qua nt gc trc, sau i qua cy con
bn tri li p dng Preorder cho cy con bn tri. Cui cng qua cy con bn
phi, p dng Preorder cho cy con bn phi.
V d: Theo cy nh phn 5.4, ta c:
ROOT
1 2 3 4 6 7 5 8 9
Inorder - Trung t (LNR) : qua cy con bn tri duyt trc (theo th t
LNR), sau thm nt gc. Cui cng qua cy con bn phi (theo th t LNR)
V d: Theo cy nh phn 5.4, ta c:
ROOT 2
1 6 4 7 3 8 5 9
Postorder - Hu t (LRN) : qua cy con bn tri duyt trc (theo th t
LRN), sau qua cy con bn phi (theo th t LRN). Cui cng thm nt gc.
V d: Theo cy nh phn 5.4, ta c:
2
6 7 4 8 9 5 3 1
ROOT
Ghi ch : i vi cy ta c th t chc th t theo kha l mt ni dung ca
nt hoc ta t thm 1 field gi l kha ca nt .
II.2. Cc php ton trn cy nh phn:

K thut lp trnh

111

- Khai bo:
bo: t chc d liu theo cy nh phn, ta c th dng mt ni
dung ca d liu lm kha sp xp v t chc cy theo nhiu cch khc nhau.
Nhng thng thng thun tin cho vic tm kim v thc hin cc php ton
khc trn cy, ngi ta to thm mt kha ring trong cc phn t v to ra cy
nh phn tm kim.
khai bo bin tree qun l mt cy nh phn, vi ni dung info cha s
nguyn, ta khai bo nh sau:
struct nodetype
{
int key;
int info;
struct nodetype *left;
struct nodetype *right;
};
typedef struct nodetype *NODEPTR;
NODEPTR tree;
tree
1. To cy:
a. Khi to cy(Initialize): dng khi ng cy nh phn, cho chng
trnh hiu l hin ti cy nh phn rng.
void Initialize(NODEPTR &root)
{
root = NULL;
}
Li gi hm: Initialize(tree);
b. Cp pht vng nh (New_Node): cp pht mt nt cho cy nh phn.
Hm New_Node ny tr v a ch ca nt va cp pht.
NODEPTR New_Node(void)
{
NODEPTR p;
p = (NODEPTR)malloc(sizeof(struct nodetype));
return(p);
}
Li gi hm: p= New_Node();
c. To cy BST (Create_Tree): Trong gii thut to cy BST, ta c dng
hm Insert.
Hm Insert: dng phng php qui thm nt c kha x, ni dung a vo
cy c nt gc root . Cy nh phn to c qua gii thut Create_Tree l cy
nh phn tm kim (BST).

K thut lp trnh

112

void Insert(NODEPTR root, int x, int a)


{ NODEPTR p;
if(x == root->key)
// kha b trng, dng chng trnh
{
printf("bi trung khoa, khong them nut nay duoc");
return;
}
if(x < root->info && root->left == NULL) // iu kin dng gii thut qui
{
p = New_Node();
// cp pht 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) //iu kin dng gii thut 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 nhnh tri
else
Insert(root->right, x,a); // gi qui qua nhnh phi
}
void Create_Tree(NODEPTR &root)
{ int khoa, noidung;
char so[10];
NODEPTR p;
do

K thut lp trnh

113

{ 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 nhp
}
Ghi ch : to cy nh phn do bin tree qun l, ta gi:
Create_Tree(tree);
2. Cp nht cy:
a. Gii phng vng nh(Free_Node): gii phng vng nh m p ang tr n.
void Free_Node(NODEPTR p)
{
free(p);
}
Li gi hm: Free_Node (p);
b. Kim tra cy nh phn rng hay khng (Empty): hm Empty tr v
TRUE nu cy nh phn rng, v ngc li.
int Empty(NODEPTR root)
return(root == NULL ? TRUE : FALSE);
}
Li gi hm: Empty(tree)
c. Hy b mt nt trong cy nh phn BST (Remove):
Xa nt c kha l x trong cy nh phn tm kim sao cho sau khi xa th
cy nh phn vn l cy nh phn tm kim. Ta c 3 trng hp :

114

K thut lp trnh

- Trng hp 1: nt p cn xa l nt l. Vic xa nt p ch n gin l hy


nt p
p1

p1

p1

p1

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


, ta to lin kt 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

Hnh 5.10. Xa nt p trong trng hp nt ny c 1 cy con bn tri.


10
5

10

xoa nut p
5

15

20

rp

3
2

18

18

20
25

25

Hnh 5.11. Xa nt p trong trng hp nt ny c 1 cy con bn phi.


- Trng hp 3: Nt p cn xa c 2 cy con. Ta cho rp ch ti nt p. Do tnh
cht nt cc tri ca cy con bn phi ca p c kha va ln hn kha ca p,
nn loi p th ta s cho r ch ti nt cc tri . Sau , ta sao chp ni dung
v kha ca nt r vo nt m rp ang ch ti. Ta to lin kt thch hp bt nt
rp ra khi cy nh phn v cui cng xa nt rp.

115

K thut lp trnh
10

10

20
15
12

25

5
15

30
18

25
r

nut trai nhat cua


cay con ben phai

35

12

30
18

28

35

28

Hnh 5.12. Xa nt p trong trng hp nt ny c 2 cy con.


Hm 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 tim thay");
else
if (x < p->key) remove (x, p->left);
else if (x > p->key)
remove (x, p->right);
else // p^.key = x

K thut lp trnh

116

{
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 hm: Remove(x, tree); // x l kha ca nt mun xa
d. Tm kim (Search): Tm nt c kha bng x trn cy nh phn BST c
gc l root. Nu tm thy x trong cy th tr v a ch ca nt c tr bng x trong
cy, nu khng c th tr v tr NULL.
Do cy nh phn l BST nn ta c th tm kim nhanh bng phng php
tm kim nh phn.
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 hm: p=Search(tree, x);
3. Cc php duyt
duyt cy: C 3 cch duyt c bn l NLR, LNR, LRN v mt
cch c bit l duyt cy theo mc. y, ta ch xt 3 phng php duyt
NLR, LNR v LRN. Xt cy sau :

117

K thut lp trnh

4
2
1

5
3

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


void Preorder (NODEPTR root)
{ if(root != NULL)
{ printf("%d ", root->info);
Preorder(root->left);
Preorder (root->right);
}
}
b. Duyt cy theo th t LNR (Inorder):
void Inorder(NODEPTR root)
{ if(root != NULL)
{ Inorder(root->left);
printf("%d ", root->info);
Inorder(root->right);
}
}
c. Duyt 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 to cy nh phn tm kim mc ch l tm kha cho nhanh, tuy
nhin tng tc tm kim th cy cn phi cn i v 2 nhnh theo tng nt
trong cy. Do vy, ta s tm cch t chc li cy BST sao cho n cn bng.

118

K thut lp trnh

III.1. nh ngha:
- Cy nh phn tm kim cn bng (AVL) l cy nh phn tm kim m ti
tt c cc nt ca n chiu cao ca cy con bn tri ca n v chiu cao ca cy
con bn tri chnh lch nhau khng qu mt.
10

20
8

30

15
12

18

25

40

Hnh 5.14. Cy nh phn tm kim cn bng


Lu : Vi cy AVL, vic thm vo hay loi b 1 nt trn cy c th lm
cy mt cn bng, khi ta phi cn bng li cy. Tuy nhin vic cn bng li
trn cy AVL ch xy ra phm vi cc b bng cch xoay tri hoc xoay phi
mt vi nhnh cy con nn gim thiu chi ph cn bng.
- Ch s cn bng (balance factor) ca mt nt p trn cy AVL=
= lh(p) - rh(p)
Trong :
lh (p) l chiu cao ca cy con bn tri ca p
rh(p) l chiu cao ca cy con bn phi ca p
Ta c cc trng hp sau:
bf(p) = 0 nu lh(p) = rh(p)
bf(p) = 1 nu lh(p) = rh(p) +1
bf(p) = -1 nu lh(p) = rh(p) -1

nt p cn bng
nt p b lch v tri
nt p b lch v phi

-1
A

0
0

0
0
U1

0
U2

U3

B
B

U4
U5

0
U6

U7

B
U8

-1

0
BB

B
U9

0
U10 U11

U12

Hnh 5.15. Minh ha cc v tr c th thm nt l vo cy AVL, khi thm nt l


vo 1 trong cc v tr B th cy vn cn bng, khi thm nt l vo 1 trong cc v

K thut lp trnh

119

tr U th cy s mt cn bng. Cc s trn cy l ch s cn bng ca cc nt


trc khi thm nt
III.2. Cc php ton trn cy AVL:
* Khai bo:
bo: Ta khai bo cy AVL vi mi nt c thm trng bf cho bit
ch s cn bng ca nt .
struct nodetype
{
int key;
int info;
int bf;
struct nodetype *left, *right;
};
typedef struct nodetype *NODEPTR;
III.2.1. Thm nt:
- Ni dung:: Thm 1 nt c kha x, ni dung a vo cy nh phn tm kim
cn bng sao cho sau khi thm th cy nh phn vn l cy nh phn tm kim cn
bng.
- Gii thut:
Thm nt vo cy nh bnh thng, ngha l nt va thm s l nt l.
Tnh li ch s cn bng ca cc nt c b nh hng
Kim tra xem cy c b mt cn bng hay khng? Nu cy b mt cn
bng th ta cn bng li cy.
* Trc ht, ta hy xt xem cc trng hp no khi thm nt lm cy b
mt cn bng.
Xem cy hnh 5.15, ta nhn thy:
- Nu thm nt vo 1 trong 6 v tr B trn cy th cy vn cn bng.
- Nu thm nt vo 1 trong cc v tr U1 U12 trn cy th cy s mt
cn bng.
+ Thm cc nt vo sau bn tri ca nt A (cfA = 1) th cy s b
mt cn bng v nt A ang b lch tri. l cc v tr U1, U2, U3, U4.
+ Thm cc nt vo sau bn phi ca nt C (cfC = -1) th cy s b
mt cn bng v nt C ang b lch phi. l cc v tr U9, U10, U11, U12.
Tm li: Ta c 2 trng hp khi thm nt x vo cy AVL lm cy mt

cn bng, l thm cc nt vo sau bn tri ca nt c cf = 1, v thm cc nt


vo sau bn phi ca nt c cf = -1.

120

K thut lp trnh

* Cn bn
bngg li cy: Gi ya l nt trc gn nht b mt cn bng khi thm
nt x vo cy AVL. Do c 2 trng hp b mt cn bng khi thm nt x l tng
t nhau nn ta ch xt trng hp bfya=1 v nt l thm vo l nt sau bn tri
ca nt ya.
1 ya
S 0
T1
chieu
cao
n

T2
chieu
cao
n

T3
chieu
cao
n

Hnh 5.16. Nhnh cy con nt gc ya trc khi thm nt.


Nhn xt:
- V nt ya c bfya = 1 nn nt ya chc chn c nt con bn tri s vi bfs = 0
- V ya l nt gn nht c bf l 1 nn nt s v cc nt trc khc ca nt x
(s thm vo) c bf l 0.
-cao (T1) = cao(T2) = cao(T3)

Trng hp 1a: Nu thm nt mi x vo v tr nt sau bn tri ca s (thuc


nhnh T1) ta xoay phi quanh nt ya
- Nt s s l nt gc mi ca nhnh cy ny vi bfs = 0
- Nt ya l nt con bn phi ca s vi bfya = 0.
S

2 ya
S 1
T1
chieu
sa u
n

T2
chie u
sa u
n

T3 xoay phai
chieu quanh nu t ya
sau
n

T1
chieu
sau
n
x

0
0 ya
T2
chieu
sau
n

T3
chie u
sa u
n

Hnh 5.17. Xoay phi quanh nt ya cn bng li cy.

121

K thut lp trnh

Trng hp 1b: Nu thm nt mi x vo v tr nt sau bn phi ca s (thuc


nhnh T2) ta xoay 2 ln (xoay kp): xoay tri quanh nt s v xoay phi quanh
nt ya
- Nt p s l nt gc mi ca nhnh cy ny vi bfp = 0
- Nt ya l nt con bn phi ca p vi bfya = -1
- Nt s l nt con bn tri ca p vi bfs = 0
2 ya
S -1
p
T1
1
chieu
sa u
T2-1
T2-2
n
chie u
chieu
sau
sa u
n-1
n-1

Cy AVL sau khi thm nt x

T3
chieu
sau
n

xoay trai

S 0

quanh nu t S
T1
chie u
sau
n

T2-1
chieu
sau
n-1
x

2
2
T2-2
chieu
sau
n-1

ya
T3
chieu
sau
n

122

K thut lp trnh

S 0
xoay phai
quanh nut ya

T1
chieu
sau
n

-1
T2-1 T2-2
chieu chie u
sau
sau
n-1
n-1

ya
T3
chieu
sau
n

Hnh 5.18. Xoay kp (xoay tri quanh nt s, xoay phi quanh nt ya) cn
bng li cy.
Bng sau y phn bit cc trng hp cy b mt cn bng khi thm nt v
cc php xoay cy tng ng cn bng li cy:
Trng hp
1.a
1.b

2.a
2.b

Trc khi thm


nt x

Sau khi thm


nt x

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 tri quanh nt s
2. Xoay phi quanh nt ya
bfs=0, bf ya = -1

Xoay tri quanh nt ya


bfs=0, bf ya = 0

Xoay kp
1. Xoay phi quanh nt s
2. Xoay tri quanh nt ya
bfs=0, bf ya = 1

- Gii thut:
Php xoay tri (Rotate_Left): xoay tri cy nh phn tm kim c nt
gc l root, yu cu root phi c nt con bn phi (gi l nt p). Sau khi xoay
tri th nt p tr thnh nt gc, nt gc c tr thnh nt con bn tri ca nt gc
mi.
Php xoay tri tr v con tr ch nt gc mi.

K thut lp trnh

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 phi (Rotate_Right): xoay phi cy nh phn tm kim c nt
gc l root, yu cu root phi c nt con bn tri (gi l nt p). Sau khi xoay
phi th nt p tr thnh nt gc, nt gc c tr thnh nt con bn phi ca nt
gc mi.
Php xoay phi 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 thut lp trnh

Thm nt (Insert): thm nt c kha x, ni dung a vo cy AVL:


- Thm nt theo gii thut thm nt vo cy nh phn tm kim .
- Cn bng li cy bng cch 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 gn nht c th mt cn bng
fya l nt cha ca ya */
s;
// s l nt con ca ya theo hng mt cn bng
int imbal;
/* imbal = 1 nu b lch v nhnh tri
= -1 nu b lch v nhnh phi */
// Khi ng cc 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();
// cp pht vng nh
q->key =x;
q->info = a;
q->bf = 0;
q->left = NULL;

124

K thut lp trnh

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 thut lp trnh

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 thut lp trnh

p->bf = 0;
}
if(fya == NULL)
pavltree = p;
else
if(ya == fya->right)
fya->right = p;
else
fya->left = p;
}
* to cy nh phn tm kim cn bng, ta s dng gii thut 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 nhp
}
Ghi ch : to cy nh phn do bin tree qun l, ta gi:
Create_AVLTree(tree);

127

K thut lp trnh

128

III.2.2. Cp nht cy:


1. Tm kim (Search): Tm nt c kha bng x trn cy nh phn AVL c
gc l root. Nu tm thy x trong cy th tr v a ch ca nt c tr bng x
trongcy, nu khng c th tr v tr NULL.
Do AVL l cy nh phn BST nn ta c th tm kim nhanh bng phng
php tm kim nh phn, v do tnh cht lc ny cy cn bng nn thi gian tm
kim s nhanh hn rt nhiu.
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);
}
x):
2. Xa nt: Remove(root,
Remove
- Ni dung: xa nt c kha x trn cy AVL vi a ch sao u root sao
cho sau khi xa th cy vn l AVL.
- Gii thut:
Nu root == NULL th Thngbo ("Khng th xa c nt x trn cy")
Nu root != NULL th
Nu x< root->info th:
+ Gi qui xa nt x nhnh bn tri ca root :
Remove(root->left, x)
+ Gi balance_left cn bng li cy nt gc root nu nhnh cy
con bn tri b gim cao.
Nu x > root->info th:
+ Gi qui xa nt x nhnh bn phi ca root :
Remove(root->right, x)
+ Gi balance_right cn bng li cy nt gc root nu nhnh cy
con bn phi b gim cao.
Nu x==root->info th:
Xa nt root nh php ton xa trn cy nh phn BST.
- Chng trnh : t ci t.

K thut lp trnh

129

III.2.3. Cc php duyt cy:


Do cy AVL cng l cy nh phn nn ta s p dng li cc phng php
duyt Preorder, Inorder v Postorder vo cy AVL.
a. Duyt cy theo th t NLR (Preorder):
void Preorder (NODEPTR root)
{
if(root != NULL)
{
printf("%d ", root->info);
Preorder(root->left);
Preorder (root->right);
}
}
b. Duyt cy theo th t LNR (Inorder):
void Inorder(NODEPTR root)
{
if(root != NULL)
{
Inorder(root->left);
printf("%d ", root->info);
Inorder(root->right);
}
}
c. Duyt 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 thut lp trnh

Bi tp:
1. Vit li cc chng trnh duyt cy nh phn theo phng php khng qui.
2. Vit chng trnh to mt menu thc hin cc mc sau:
a. To cy nh phn tm kim vi ni dung l s nguyn (khng trng nhau).
b. Lit k cy nh phn ra mn hnh theo th t NLR
c. m tng s nt, s nt l, v s nt trung gian ca cy.
d. Tnh cao ca cy.
e. Loi b nt c ni dung l x trong cy nh phn BST.
f. Thm nt c ni dung x vo cy nh phn BST sao cho sau khi thm th cy
vn l BST.
3. Cho mt cy nh phn tree, hy vit chng trnh sao chp n thnh mt
cy mi tree2, vi kha, ni dung, v lin kt ging nh cy tree.
4. Vit cc hm kim tra xem cy nh phn:
a. C phi l cy nh phn ng khng.
b. C phi l cy nh phn y khng.
5. Vit hm kim tra nt x v y c trn cy hay khng, nu c c x ln y trn
cy th xc nh nt gc ca cy con nh nht c cha x v y.
6. Cho mt cy biu thc, hy vit hm Calculate (NODEPTR root) tnh gi
tr ca cy biu thc , bit rng cc ton t c dng trong biu thc l:
+ - * / ^ % !
7. V li hnh nh cy nh phn tm kim, cy nh phn tm kim cn bng nu
cc nt thm vo cy theo th t nh sau:
8

20

11

30

18

8. Nhp vo 1 biu thc s hc, chuyn biu thc thnh cy nh phn, nt


gc l ton t, nt l l cc ton hng, bit rng cc ton t c dng trong
biu thc l:
+ - * / ^ % !

131

K thut lp trnh

MC LC
CHNG i I CNG V LP TRNH --------------------------------------------------- 1
I. Khi nim thut ton --------------------------------------------------------------------------- 1
I.1. Khi nim --------------------------------------------------------------------------------------------------- 1
I.2. Cc tnh cht c trng ca thut ton ----------------------------------------------------- 1
I.3. Phn loi ----------------------------------------------------------------------------------------------------- 1
II. M t thut ton bng lu ---------------------------------------------------- 1
II.1. Lu ------------------------------------------------------------------------------------------------------- 1
II.2. Cc k hiu trn lu ---------------------------------------------------------------------------- 1
II.3. Mt s v d biu din thut ton bng lu ---------------------------------------- 2
III. CC NGN NG LP TRNH & CHNG TRNH DCH -------------------- 5
III.1. Ngn ng lp trnh----------------------------------------------------------------------------------- 5
III.2. Chng trnh 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. Cu trc c bn ca mt chng trnh C -------------------------------------------------- 7
I.2. Kiu d liu c bn ---------------------------------------------------------------------------------- 13
I.3. Bin ----------------------------------------------------------------------------------------------------------- 14
I.4 Hng ----------------------------------------------------------------------------------------------------------- 18
I.5. Php ton -------------------------------------------------------------------------------------------------- 20
* S chuyn kiu ----------------------------------------------------------------------------------------- 29
* Mc u tin ca cc php ton ---------------------------------------------------------- 29
I.6. Chui --------------------------------------------------------------------------------------------------------- 30
II. Cc cu trc iu khin trong C----------------------------------------------- 33
II.1 Cu trc tun t (Sequence) ------------------------------------------------------------------ 33
II.2. Cu trc chn ------------------------------------------------------------------------------------------ 34
II.2.1. Lnh if else -------------------------------------------------------------------------------------- 34
II.2.2. Lnh switch_case----------------------------------------------------------------------------- 35
II.3. Cu trc lp --------------------------------------------------------------------------------------------- 37
II.3.1. Lnh while --------------------------------------------------------------------------------------- 37
II.3.2. Lnh do while ---------------------------------------------------------------------------------- 38
II.3.3. Lnh for -------------------------------------------------------------------------------------------- 39
* Pht biu break, continue, goto -------------------------------------------------------------- 40
Bi tp ---------------------------------------------------------------------------------------------------------------- 41

K thut lp trnh

132

III. Hm - quy------------------------------------------------------------------------------------------- 45
III.1. Hm -------------------------------------------------------------------------------------------------------- 45
III.2. qui (Recursion) -------------------------------------------------------------------------------- 52
IV. Structure ----------------------------------------------------------------------------------------------- 54
IV.1. nh ngha ------------------------------------------------------------------------------------ 55
IV.2. Khai bo---------------------------------------------------------------------------------------- 55
V. FILE ---------------------------------------------------------------------------------------------------------------- 56
V.1. File vn bn --------------------------------------------------------------------------------------------- 56
V.2. File nh phn (file c cu trc)--------------------------------------------------------------- 61
V.3. Pht hin li khi truy xut tp tin ---------------------------------------------------------- 66
Bi tp ---------------------------------------------------------------------------------------------------------------- 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 khi nim v mng ---------------------------------------------------------------------- 69
I.2. Thut ton tm kim trn mng cha c th t--------------------------------------- 71
II. Cc thut ton sp xp ------------------------------------------------------------------- 73
II.1. Sp xp theo phng php Bubble_Sort ------------------------------------------------ 73
II.2. Sp xp theo phng php Quick_Sort -------------------------------------------------- 75
III. Tm kim trn mng c th t --------------------------------------------- 79
III.1. Tm kim nhanh bng phng php lp ----------------------------------------------- 79
III.2. Php tm kim nh phn------------------------------------------------------------------------- 80
III.3. Php tm kim nh phn qui ------------------------------------------------------------- 81
Bi tp ---------------------------------------------------------------------------------------------------------------- 82
CHNG 4
CON TR (POINTER) ---------------------------------------------------------- 84
I. NH NGHA ------------------------------------------------------------------------------------------------- 84
I.1. Khai bo ---------------------------------------------------------------------------------------------------- 84
I.2. Truyn a ch cho hm --------------------------------------------------------------------------- 85
II Cc php ton trn bin con tr------------------------------------------------ 85
II.1. Ton t a ch & ----------------------------------------------------------------------------------- 85
II.2. Ton t ni dung * --------------------------------------------------------------------------------- 85
II.3. Php cng tr bin con tr vi mt s nguyn -------------------------------------- 86
II.4. Php gn v php so snh ----------------------------------------------------------------------- 86
II.5. S chuyn kiu ---------------------------------------------------------------------------------------- 86
II.6. Khai bo mt con tr hng v con tr ch n i tng hng ------------ 87
III. S tng quan gia con tr v mng ----------------------------------- 87

K thut lp trnh

133

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


IV.1. Khai bo ------------------------------------------------------------------------------------------------- 91
IV.2. Xt mt s v d v cc hm x l chui --------------------------------------------- 91
IV.3. Mng con tr ch n chui ------------------------------------------------------------------ 93
Bi tp ---------------------------------------------------------------------------------------------------------------- 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. To danh sch------------------------------------------------------------------------------------------ 97
II.2. Cp nht danh sch --------------------------------------------------------------------------------- 99
II.3. Duyt danh sch ------------------------------------------------------------------------------------ 100
II.4. Tm kim ----------------------------------------------------------------------------------------------- 100
II.5. Sp xp--------------------------------------------------------------------------------------------------- 101
Bi tp -------------------------------------------------------------------------------------------------------------- 102
CHNG 6 cc thut ton trn cu trc cY --------------------- 104
I. Phn loi cy ---------------------------------------------------------------------------------------- 104
I.1. Mt s khi nim c bn ----------------------------------------------------------------------- 104
I.2. Cch biu din cy --------------------------------------------------------------------------------- 106
I.3. Biu din th t cc nt trong cy --------------------------------------------------------- 106
II. Cy nh phn (Binary tree) ---------------------------------------------------------- 107
II.1. nh ngha --------------------------------------------------------------------------------------------- 107
II.2. Cc php ton trn cy nh phn ---------------------------------------------------------- 110
1. To cy -------------------------------------------------------------------------------------------------- 110
2. Cp nht cy------------------------------------------------------------------------------------------ 112
3. Cc php duyt cy------------------------------------------------------------------------------- 116
III. cy nh phn TM KIM cn bng (AVL) -------------------------------- 117
III.1. nh ngha ------------------------------------------------------------------------------------------- 117
III.2. Cc php ton trn cy AVL--------------------------------------------------------------- 118
III.2.1. Thm nt --------------------------------------------------------------------------------------- 118
III.2.2. Cp nht cy --------------------------------------------------------------------------------- 126
III.2.3. Cc php duyt cy ---------------------------------------------------------------------- 127
Bi tp -------------------------------------------------------------------------------------------------------------- 129

TI LIU THAM KHO

1. K thut lp trnh Turbo C

Phc, Nguyn Phi Kh,


T Minh Chu,
Nguyn nh T

1992

2. Cu trc d liu ng dng


v ci t bng C

Nguyn Hng Chng

1999

3. Nhng vin ngc K thut


lp trnh

JohnBentley

S-ar putea să vă placă și