Professional Documents
Culture Documents
K thu t l p tr nh
CHNG i
I CNG V LP TRNH
K hi u
ngh a
Dng m u ho c k t
thc chng tr nh
a s li u v o ho c in
k t qu
K thu t l p tr nh
Bi u di n c c cng thc
t nh to n v thay i gi
tr ca c c bi n
Dng ph n nh nh
chng tr nh
Khi t nh to n
Khi i u ki n
Dng gi chng tr nh
con
Ch hng truy n thng
tin, li n h c c khi
Chng tr nh con
Mi t n
V d 2 : T nh S =
Ax + By + C
x +y
2
; bi t A,B,C,x,y
Begin
K thu t l p tr nh
a>b
Max = b
Max = a
S
Max < c
Max = c
Xuat (Max)
End
a=0
Xuat (-b/a)
b=0
Xuat (PTV)
End
Xuat (PTVN)
K thu t l p tr nh
a=0
PTB1 (b, c)
S
Delta = b*b - 4*a*c
Delta < 0
Xuat (PTVN)
Delta = 0
S
Xuat (X1= ,(-b + SQRT(Delta)) / (2*a))
Xuat (X2= ,(-b - SQRT(Delta)) / (2*a))
End
i <= n
S
vi n l gi tr k t thc.
K thu t l p tr nh
n
V d 4: T nhS= xi , vi c c xi do ta nh p v o.
i =1
Begin
Nhap (n)
i=1
S=0
Nhap (xi)
i = i+1
S = S+xi
i <= n
S
Xuat (S)
End
K thu t l p tr nh
- Hp ng (assembly language)
- Ngn ng c p cao (higher-level language)
Do m y t nh ch hi u c ngn ng m y, cho n n mt chng tr nh vi t
trong ngn ng c p cao ph i c bi n dch sang ngn ng m y. Cng c thc
hi n vi c bi n dch c gi l chng tr nh dch.
III.2. Chng tr nh dch:
Chng tr nh dch c chia ra l m 2 lo i : tr nh bi n dch (compiler) v tr nh
thng dch (interpreter)
III.2.1. Tr nh bi n dch: l vi c chuy n mt chng tr nh trong ngn ng
c p cao n o (chng tr nh ngun) sang ngn ng m y (chng tr nh ch).
- Thi gian chuy n mt chng tr nh ngun sang chng tr nh ch c
gi l thi gian dch.
- Thi gian m chng tr nh ch thc thi c gi l thi gian thc thi.
Nh v y, chng tr nh ngun v d li u chng tr nh thc thi c x
l trong c c thi i m kh c nhau, c gi l thi gian dch (compile time) v
thi gian thc thi (run-time)
D lieu
Chng trnh
nguon
Trnh bie n
dch
Chng trnh
ch
May tnh
thc hien
Ket qua
Chng trnh
tho ng dch
Ket qua
D lieu
K thu t l p tr nh
CHNG 2
LM QUEN VI NGN NG C
K thu t l p tr nh
[khai b o bi n;]
[nh p d li u ;]
[x l ;]
[xu t ;]
}
V d : Chng tr nh hi n tr n m n h nh c u Chao cac ban
void main()
{ printf(Chao cac ban\n);
}
Mt v i nh n xt quan trng :
- Chng tr nh C bao gi cng c mt hay nhi u h m, trong c mt
h m ch nh b t buc ph i c l h m main(). y ch nh l h m c thc hi n
u ti n trong chng tr nh.
- C p d u { } x c nh mt khi l nh.
- H m printf( Chao cac ban \n) l h m chu n ca C dng xu t c u
thng b o Chao cac ban ra m n h nh. K t \n l k t c bi t dng
xung dng.
- D u ; ch m dt mt l nh.
- Chng tr nh C c ph n bi t ch thng vi ch hoa. a s c c t kho
ca C c vi t b ng ch thng, cn mt s t c vi t b ng ch hoa m ta
ph i tu n th ch t ch , n u khng th chng tr nh dch s khng hi u.
* Mt vi v d
V d 1: In b ng ly tha 2 ca c c s nguy n t 10 n 50
/* Chng tr nh in b nh phng c c s t 10 n 50*/
#include <stdio.h>
void main()
{int n;
/*Khai b o bi n n ki u nguy n */
n=10;
/*G n n=10 */
while (n<=50)
/*L p t 10 n 50 b ng while */
{ printf(%3d \t %5d\n,n,n*n); /*in d ng 5d l d nh 5 v tr in n v n2 */
n++;
/* T ng n l n 1 */
}
/*H t while*/
}
/*H t main*/
K thu t l p tr nh
V d 2 : Tng t nh v d 1 nhng vi t c ch kh c :
#include <stdio.h>
#define max 50
/*Ti n x l, nh ngh a max =50*/
void main()
{ int n;
/*Khai b o bi n n ki u nguy n*/
for (n=10; n<=max; n++)
/*L p t 10 n 50 b ng for*/
printf(%3d \t %5d\n,n,n*n); /*in n v n2 d ng 5d l n m ch s*/
}
/*H t main*/
V d 3 : Chng tr nh in ly tha 2, 3, 4, 5; c dng h m t nh ly tha :
#include <stdio.h>
#define max 50
/*Ti n x l, nh ngh a max =50*/
float luythua(int n, int m) /*H m luythua vi 2 thng s*/
{ float s=1;
/*Khai b o v khi t o bi n s*/
for ( ;m>0;m--)
/*L p gi m d n t m ti 1*/
s=s*n;
return s;
/*Tr k t qu v */
}
void main()
{ int n,n2,n3,n4,n5;
/*Khai b o bi n ki u nguy n*/
for (n=10;n<=50;n++) /*L p t 10 n 50 b ng for*/
{ n2= luythua(n,2); /*Gi h m luythua*/
n3= luythua(n,3);
n4= luythua(n,4);
n5= luythua(n,5);
printf(%3d \t %5.2f \t %5.2f\t %5.2f\t %5.2f\t %5.2f\n,
n,n2,n3,n4,n5);
/*in n v nm d ng 5 ch s vi 2 s l */
}
}
/*H t main*/
* Hm xut chun printf()
C php :
printf(chui-nhd ng,thamso1,thamso2,...)
ngh a :
H m printf() s xem xt chui-nhd ng, l y gi tr c c tham s (n u c n)
t v o theo y u c u ca chui-nhd ng v gi ra thi t b chu n.
Chui-nhd ng l mt chui k t, trong c nhng k t xu t ra
nguy n v n ho c xu t d ng c bi t, v c th c nhng chui i u khi n
c n l y gi tr ca c c tham s thay v o khi in ra.
10
K thu t l p tr nh
- Nhng k t c bi t :
K t
Tc dng
\n
\t
\b
\r
\f
\a
\\
\
\
\xdd
\ddd
M ASCII
Xung h ng mi
Tab
Xa k t b n tr i
Con tr tr v u h ng
Sang trang
Ph t ti ng ci
Xu t d u cho ngc
Xu t d u nh y n
Xu t d u nh y kp
Xu t k t c m ASCII d ng Hex l dd
Xu t k t c m ASCII d ng Dec l
ddd
K t NULL
\0
- Chui nh dng :
% [ flag][width][.prec][FNhl] type
10
9
8
13
12
7
92
39
34
ngh a
S nguy n c s 10
S nguy n c s 10 khng d u
S nguy n c s 8
S nguy n c s 16, ch thng(a,b,...,f)
S nguy n c s 16, ch in (A,B,...,F)
S thc d ng [-]dddd.ddd...
S thc d ng [-]d.ddd e[+/-]ddd
S thc d ng [-]d.ddd E[+/-]ddd
S thc d ng e(E) hay f ty theo ch nh x c
K t
Chui k t t n cng b ng \0
D u % c n in
11
K thu t l p tr nh
Flag : D ng i u ch nh
Flag
ngh a
n u khng c
+
#
in d li u ra vi canh ph i
in d li u ra vi canh tr i
Lun b t u s b ng + hay in ra ty theo type, n u:
0
: Ch n th m 0 ng trc gi tr >0
x,X : Ch n th m 0x hay 0X ng trc s n y
e,E,f : Lun lun c d u ch m th p ph n
G,g : Nh tr n nhng khng c s 0 i sau
Width : nh k ch thc in ra
Width
ngh a
n
0n
*
D nh t nh t n k t , i n kho ng tr ng c c k t cn trng
D nh t nh t n k t , i n s 0 c c k t cn trng
S k t t nh t c n in n m tham s tng ng
Prec : nh k ch thc ph n l in ra
Prec
ngh a
khng c
0
n
*
ch nh x c nh b nh thng
d,i,o,u,x ch nh x c nh c
e,E,f Khng c d u ch m th p ph n
nhi u nh t l n k t (s)
S k t t nh t c n in n m tham s tng ng
Cc ch b sung :
F
N
h
l
V d 1: char
12
K thu t l p tr nh
Dng
%c
%2c
%-3c
%d
%s
%3s
%.6s
%-11.8s
V d 2:
Thng s
tng ng
Xut
c
c
c
c
s
s
s
s
A
A
A
65
Blue moon!
Blue moon!
Blue m
Blue moo
int
i = 123;
float
x = 0.123456789;
Dng
Thng s
tng ng
Xut
%d
%05d
%7o
%-9x
%c
%-#9x
%10.5f
i
i
i
i
i
i
x
123
00123
123
7b
{
0x7b
0.12346
%-12.5e
1.23457e-01
Nhn xt
rng 1
rng 2, canh ph i
rng 3, canh tr i
M ASCII ca A
rng 10
Nhi u k t hn c n thi t
Ch nh x c 6 k t
Ch nh x c 8, canh tr i
Nhn xt
rng 3
Th m 2 s 0
H 8, canh ph i
H 16, canh tr i
K t c m ASCII 123
H 16, canh tr i
rng 10, c 5 ch s th p
ph n
Canh tr i, in ra di d ng
khoa hc
V d 3: Vi t chng tr nh in h nh ch nh t kp b ng c c k t ASCII
C9
CD
BB
C8
CD
BC
void main()
{
printf(\n\xC9\xCD\xBB);
printf(\n\xC8\xCD\xBC\n);
}
13
K thu t l p tr nh
I.2. Ki u d li u c bn
I.2.1. nh ngh a:
Ki u d li u c b n l ki u d li u c gi tr n, khng ph n chia c
na nh s, k t
I.2.2. Phn loi:
T n ki u
ngh a
K ch
thc
Phm vi
char
K t
1 byte
-128 127
unsigned char
K t khng d u
1 byte
0255
unsigned short
S nguy n ng n khng d u
2 bytes
065535
enum
S nguy n c d u
2 bytes
-3276832767
short int
S nguy n c d u
2 bytes
-3276832767
int
S nguy n c d u
2 bytes
-3276832767
unsigned int
S nguy n khng d u
2 bytes
0 65535
long
S nguy n d i c d u
4 bytes
-2147483648
2147483647
unsigned long
S nguy n d i khng d u
4 bytes
04294967295
float
S thc ch nh x c n
4 bytes
double
S thc ch nh x c kp
8 bytes
long double
Ch :
1. Ngn ng C khng c ki u logic (boolean nh Pascal) m quan ni m
0 l false ;
Kh c 0 l true
2. Ngn ng C khng c ki u chui nh ki u string trong Pascal
3. C c ki u ng nh t:
int = short int = short = signed int = signed short int
long int = long
signed long int = long
unsigned int = unsigned = unsigned short = unsigned short int
unsigned long int = unsigned long
14
K thu t l p tr nh
I.3. Bi n
I.3.1. T n bi n : T n bi n l mt chui k t b t u b ng k t ch, k t
k ti p l k t ch (d u g ch di _ c xem l k t ch) ho c s v khng
c trng vi c c t kha ca C.
Ch : - Ngn ng C ph n bi t ch thng vi ch hoa n n bi n ch
thng vi ch hoa l kh c nhau.
V d : Bien_1
_bien2
l hp l
bi&en
2a
a b l khng hp l
- Ngn ng C ch ph n bi t hai t n hp l vi nhau b ng n k t u ti n
ca chng. Thng thng n=8, nhng hi n nay nhi u chng tr nh dch cho php
n=32, nh Turbo C cho php thay i s k t ph n bi t t 8-32)
V d :Hai bi n sau b xem l cng t n
bien_ten_dai_hon_32_ky_tu_dau_tien_1
bien_ten_dai_hon_32_ky_tu_dau_tien_2
I.3.2. Khai bo bi n
C c bi n ph i c khai b o trc khi s dng nh m gip cho chng
tr nh dch c th x l chng.
Khai b o bi n c d ng :
Ki udli u
V d : int
a,b,c;
float x,y,delta;
char c;
* Khai b o v khi t o bi n:
Ki u d li u
t nbi n = gi tr ;
- Chui-nhd ng ca scanf() gm c ba lo i k t :
+ Chui i u khi n
+ K t tr ng
+ K t kh c tr ng
! Chui i u khi n c d ng :
%[width][h/l] type
15
K thu t l p tr nh
Vi type: x c nh ki u ca bi n a ch tham s s nh n gi tr nh p v o
Type
ngh a
d,i
S nguy n c s 10 (int)
o
S nguy n c s 8 (int)
u
S nguy n c s 10 khng d u (unsigned)
x
S nguy n c s 16 (int)
f,e
S thc (float)
c
K t (char)
s
Chui k t
p
Con tr (pointer)
lf
S thc (double)
Lf
S thc (long double)
Width : x c nh s k t ti a s nh n v o cho vng .
H m scanf() ch nh n cho width k t ho c cho n khi g p k t tr ng
u ti n. N u chui nh p v o nhi u hn th ph n cn l i s d nh l i cho l n gi
scanf() k ti p.
V d 1: scanf(%3s,str);
N u nh p chui ABCDEFG
th scanf() s nh n ti a 3 k t c t v o m ng str, cn DEFG s c l y
n u sau c l n gi sanf(%s,str) kh c.
V d 2: unsigned long money;
scanf(%lu,&money);
Lu : N u scanf(%ul, &money) th gi tr nh p v o s khng c lu
tr trong bi n money, nhng chng tr nh dch khng b o li.
V d 3: Nh p v o t n v b gii h n trong kho ng [A-Z,a-z]
char name[20];
printf(Name : ) ;
scanf(%[A-Za-z],&name);
Trong trng hp n y, n u ta g sai d ng th name =
! K t tr ng: n u c trong chui-d ng s y u c u scanf() b qua mt hay
nhi u k t tr ng trong chui nh p v o. K t tr ng l k t kho ng tr ng ( ),
tab (\t), xung h ng (\n). Mt k t tr ng trong chui-nhd ng s c hi u
l ch nh p n k t kh c tr ng ti p theo.
16
K thu t l p tr nh
V d 4: scanf(%d ,&num);
H m scanf() cho ta nh p mt k t kh c tr ng na th mi tho t ra. K t
s n m trong vng m v s c l y bi h m scanf() ho c gets() ti p theo.
! K t kh c tr ng: n u c trong chui-nhd ng s khi n cho scanf() nh n
v o ng k t nh th .
V d 5: scanf(%d/%d/%d,&d,&m,&y);
H m scanf() ch nh n mt s nguy n, c t v o d, k n l d u /, b d u
n y i v ch nh n s nguy n k ti p c t v o m. N u khng g p d u / k
ti p s nguy n th scanf() ch m dt.
Ch : H m scanf() i hi c c tham s ph i l c c a ch ca c c bi n
ho c l mt con tr.
* To n t a ch & : L y a ch ca mt bi n
int n; bi n n
&n; a ch ca n
printf(tr = %d, a ch = %d,n,&n);
b) Hm getch():
V d 6:
Khng hi n k t nh p tr n m n h nh
Hi n k t nh p tr n m n h nh
Vi ch l bi n ki u char.
V d 7:
void main()
{
char ch;
printf(Go vao ky tu bat ky : );
ch = getche();
printf(\n Ban vua go %c,ch);
getch();
}
V d 8: B n nh p v o 1 ch c i. N u ch c i nh p v o l 'd' th chng
tr nh s k t thc, ngc l i chng tr nh s b o li v b t nh p l i.
#include <stdio.h>
#include <conio.h>
void main()
{
char ch;
17
K thu t l p tr nh
M scancode
59
60
61
62
63
64
65
66
67
68
71
72
80
75
18
K thu t l p tr nh
77
%
PgUp
73
PgDn
81
End
79
Ins
82
Del
83
B ng m scancode ca c c ph m m rng
c. Hm kbhit(): H m int kbhit() s ki m tra xem c ph m n o c g
v o hay khng. N u c, h m kbhit s tr v mt s nguy n kh c 0, v ngc l i.
K t m ta nh p v o qua h m kbhit() c th l y c qua h m getch()
ho c getche().
V d:
void main()
{
printf("Press any key to continue:");
while (!kbhit()) /* do nothing */ ;
char kytu=getch();
printf("\nKy tu vua an : %c",kytu);
}
I.4 Hng: H ng l c c i lng m gi tr ca n khng thay i trong qu
tr nh chng tr nh thc hi n.
I.4.1. Phn loi :
a. Hng s : l c c gi tr s x c nh v khng i.
D ng
V d
int
unsigned
long
h 8
h 16
float/double
nnnn
-nnnn
nnnnU/u
nnnnL/l
-nnnnl/L
0nnnn
0xnnnn
nnnn.nnnn
nnnn.nnnE/ennn
123.654
123.234E-4
4567
123U
456789L 0345
0x1AB
-12
12uL
-1234L
Ch :
- C c h ng s vi t khng d u ho c khng s m c hi u l s nguy n,
ngc l i l double.
- C c h ng s nguy n ln hn int s c lu tr theo ki u long, cn ln
hn long th c lu tr theo ki u double.
- C c h ng s nguy n dng ln hn long s c lu tr theo ki u double
19
K thu t l p tr nh
V d :
Gi tr ca h ng k t l m ASCII ca n.
V d : printf(%c c gi tr l %d,A,A);
% A c gi tr l 65
& H ng k t c th tham gia v o c c php to n nh mi s nguy n kh c.
V d :9-0=57-48=9
& H ng k t c th l c c k t c bi t d ng \c1 m ta xt h m
printf() nh \n,\a,\t ...
c. Hng chui : L mt chui k t n m trong hai d u nh y kp .
V d :
Ch :
- Ph n bi t
A A
H ng:
Chui K t
D ng lu tr :
A \0
20
K thu t l p tr nh
a -A
l 97-65 = 32
1<8
l 0 (sai)
I.4.2. Khai bo hng:
C php: const t nh ng = bi uthc;
V d : const MAX = 50;
const PI = 3.141593;
Ch : - Ta c th khai b o h ng b ng c ch nh ngh a 1 macro nh sau:
#define t nh ng gi tr
- L nh #define ph i c khai b o ngo i h m v sau n khng c
d u ;
I.5. Php ton
I.5.1. Php gn:
C php: bi n = bi u thc;
Ch : Php g n trong ngn ng C tr v mt k t qu l tr ca bi u thc
V d 1 : c = 10;
a = b = c;
printf(a=%d , b=%d,a,b); a=10,b=10
V d 2 : x = b + 2*c;
y = a + x;
y= a + (x= b + 2*c)
Ki u ton hng
+, -, *
Ki u k t qu
Ki u ca to n h ng c ki u cao nh t
Ki u nguy n v l php chia nguy n
Ki u thc v l php chia thc
Ki u nguy n v l php chia l y ph n d
21
K thu t l p tr nh
{ char cv;
int iv = 121;
float fv1,fv2;
printf( Chuy n ki u :\n\n);
cv = iv;
printf(int c g n cho char : %d %d (%c)\n\n,iv,cv,cv);
fv1 = iv/50;
printf( int : %d / 50 = %f \n\n,iv,fv1);
fv1 = iv/50.0;
printf( float : %d / 50.0 = %f \n\n,iv,fv1);
fv1 = 1028.75;
fv2 = fv1 +iv ;
printf( %f + %d = %f \n\n,fv1,iv,fv2);
getch();
}
b. Php ton mt ton hng : php t ng ++, php gi m -
a++ ho c ++a
a = a+1
a-- ho c --a
a = a-1
Ch : Tuy nhi n a++ s kh c ++a khi chng ng trong bi u thc (c
php g n).
a++ : T ng a sau khi gi tr ca n c s dng.
++a : T ng a trc khi gi tr ca n c s dng.
V d :
main()
{
int
a=4 , b=6, n;
n = a + b;
n = a++ + b;
n = ++a + b;
n = --a + b;
n = a-- + b;
n = a+ b;
4
4
5
6
5
4
4
6
6
6
6
6
6
6
10
10
12
11
11
10
}
I.5.3. Php gn phc hp:
C php: bi n op= <bi uthc> bi n = bi n op <bi uthc>
Vi op l php to n.
22
K thu t l p tr nh
C c php g n phc hp :
+= , -= , *= , /= , %= , <<= , >>=
V d :n = n*(10+x)
n *= (10 +x)
n = n % 10
n %= 10
I = I +3
I += 3
<< : l php dch chuy n bit qua tr i .
>> : l php dch chuy n bit qua ph i .
I.5.4. Php ton quan h :
<
>
>=
<=
!=
==
:
:
:
:
:
:
nh hn
ln hn
ln hn ho c b ng
nh hn ho c b ng
kh c
b ng
Ch :
- Ph n bi t to n t so s nh == vi php g n =
- C khng c ki u d li u boolean m qui c : Gi tr 0 l sai
Gi tr !=0 l ng
V d:
a=10;
b=4
b= (a>6)*(a-6)
c=0
c= (a< 5)*(a-5)
V d: T m s ln nh t trong 3 s nguy n a, b, c
#include <stdio.h>
#include <conio.h>
void main ()
{ int a, b, c, max;
printf(Chng tr nh t m s ln nh t trong 3 s);
printf(Nh p a, b, c);
scanf(%d %d %d , &a, &b, &c);
max = a;
if (max<b) max = b;
if (max<c) max = c;
printf(S ln nh t = %d, max);
getch();
}
23
K thu t l p tr nh
I.5.5.Ton t logic:
Ton t
NOT
AND
OR
ngh a
!
&&
||
Ph nh
Giao, v
Hi
Th t t nh to n t tr n xung.
B ng ch n tr:
x
!x
x && y
true
false
false
true
true
true
false
false
true
false
true
false
true
false
false
false
V
if
V
x || y
true
true
true
false
true
true
false
true
true
false
false
false
d 1: Xt k t c c ph i l k s hay khng?
char c;
if (c >= 0 && c <= 9)
printf (% c l k t s , c);
d 2: Xt k t ch l ch c i hay khng?
((ch> =a) and (ch< =z)) or ((ch> =A) and (ch< =Z))
printf(%c l chu cai \n,ch);
d 3:
int a=10, b=5, c=0;
a && b 1
a && c 0
a||c 1
V d 4:
int a=10, b=5;
24
K thu t l p tr nh
K hi u
~
&
|
^
<<
>>
ngh a
l y b 1
giao
hi
hi lo i tr
nh n 2
chia 2
25
K thu t l p tr nh
B ng ch n tr:
Bit
A
0
0
1
1
Bit
B
0
1
0
1
~A
1
1
0
0
Bit k t qu
A&B
A|B
0
0
0
1
0
1
1
1
A^B
0
1
1
0
V d :
a= 4564
b= 13667
a&b
a|b
a^b
0001
0011
0001
0011
0010
0001
0101
0001
0101
0100
1101
0110
0100
1111
1011
0100
0011
0000
0111
0111
ngh a:
1. Php AND bit thng c dng ki m tra mt bit c th n o trong
th nh ph n d li u x c tr 0 hay 1. Vi c n y thc hi n b ng c ch s dng mt
m t n (mask) vi bit c n quan t m b ng 1 cn c c bit kh c b ng 0. Ta l y mask
AND vi gi tr x. N u k t qu thu c b ng mask th l bit c n quan t m l 1,
ngc l i l 0.
V d 1:
void main()
{ unsigned x1; x2;
printf (\n cho 2 s hex(2 s) );
scanf (%x %x , &x1, &x2);
printf (% 02x & % 02x = % 02x\n, x1, x2, x1& x2);
}
V d 2: Ta mun bi t bit th 3 ca s hexa ch l 1 hay 0 :
void main()
{ unsigned char ch, kq;
printf ( \n cho 1 s hex 2 s :);
scanf ( %x, &ch);
kq= ch & 0x08;
if (kq== 0x08) printf (bit 3 = 1);
else printf (bit 3 = 0);
}
26
K thu t l p tr nh
num << 2 : 0
num :
27
K thu t l p tr nh
ki u d li u ca to n h ng b n tr i.
- N u to n h ng b n tr i ki u unsigned th php dch s i n 0 v o c c bit
b n tr i.
- N u to n h ng b n tr i ki u signed th php dch s i n bit d u v o c c
bit b n tr i
V d 7: unsigned int num;
num = 39470; // 9A2E hexa
1 0 0 1
num =
num >> 2 9867 = 0x268B
=
0 0 1 0
0
V d 8 : int num;
num = -26066
1 0 1 0
0 0 1 0
1 1 1 0
0 1 1 0
1 0 0 0
1 0 1 1
// 9A2E hexa
1 0 1 0 0 0 1 0
num =
1 0 0 1
num >> 2 -6517 = 0xE68B
=
1 1 1 0
0 1 1 0 1 0 0 0
1
V d 8: Chng tr nh i s hex ra s nh ph n :
#include <stdio.h>
#include <conio.h>
void main()
{ int num;
unsigned int mask;
clrscr();
printf ("Chuong trinh doi so hexa sang nhi phan\n");
printf ("Nhap vao so hexa :");
scanf("%x",&num);
mask = 0x8000;
printf("\n Dang nhi phan cua so %x la ",num);
for (int j=1; j<=16; j++)
{ printf("%d",mask & num?1:0);
if (j==4 || j==8 || j==12) printf("-");
mask >>=1;
}
getch();
}
1 1 1 0
1 0 1 1
K thu t l p tr nh
28
V d 9: Chng tr nh m y t nh bitwise
y l chng tr nh gi l p mt m y t nh thc hi n c c to n t bitwise.
#define TRUE 1
main()
{ char op[10];
int x1, x2;
while (TRUE)
{ printf (\n \n Cho bi u thc ( vd ffoo & f11) : );
printf (\n);
switch ( op[0])
{ case &:
pbin (x1); printf (& (and) \n );
pbin (x2);
pline (); pbin (x1 & x2);
break;
case |:
pbin (x1); printf (| \n );
pbin (x2);
pline (); pbin (x1 | x2);
break;
case ^:
pbin (x1); printf (^ \n);
pbin (x2);
pline (); pbin (x1 ^ x2);
break;
case >:
pbin (x1); printf ( >>); printf (%d \n ,x2);
pline (); pbin (x1 >> x2);
break;
case <:
pbin (x1); printf (<<); printf (%d \n, x2);
pline (); pbin (x1 << x2);
break;
case ~:
pbin (x1); printf (~ \n);
pline (); pbin (~ x1);
break;
default : printf (To n t khng hp l /n );
}
}
29
K thu t l p tr nh
}
pbin (num)
int num;
{ unsigned int mask;
int j, bit;
mask = 0x8000;
printf (%04x, num);
for(j=0; j<16; j++)
{ bit = ( mask & num ) ? 1:0;
printf (%d, bit);
if (j= = 7) printf (- -);
mask >> = 1;
}
printf (- -);
mask >> 1;
}
pline ()
{ printf (- - - - - - - - \n);
}
* S chuy n ki u bt buc:
Trong C c 2 trng hp chuy n ki u: chuy n ki u t ng v chuy n
ki u b t buc.
Chuy n ki u b t buc: c p dng khi chuy n ki u t ng khng c.
C php:
(Type) bi u thc
V d : d = (float) (f - 32)
int a= 100, b=6;
double f;
f =a/b
// k t qu f=16
f= (double) a/ (double)b // k t qu f= 100.0 / 6.0= 16.666.
* Mc u ti n ca cc php ton:
u ti n
Php ton
Th t k t hp
()
[]
! ~ ++ - - (type) * & size of
2
3
4
5
/
+
<<
>>
30
K thu t l p tr nh
<
<=
>
==
>=
!=
&
10
11
&&
12
||
13
14
=
+=
-=
..
V d 1: 3/4 * 6
#
3*6 /4
0 *6
18 /4
0
4
#
(float) (2/4)
V d 2: (float) 2 /4
2.0 /4
(float) 0
0.5
0.0
I.6. Chui
I.6.1. nh ngh a :Chui l mt m ng m c c ph n t ca n c ki u k t.
Khai b o mt chui k t cha ti a 49 k t
char chui[50];
* Lu : T t c c c chui u c k t thc b ng k t NULL (\0). Do ,
n u chui d i 50 th ta ch c th cha ti a 49 k t.
I.6.2. Khi ng tr:
char chui[ ] = {A, N, H, \0};
char chui[ ] = "ANH";
I.6.3. Nhp / xut chui:
a. Nhp chui:
gets (chui)
b. Xut chui:
puts (chui)
Ch :
- Khi nh p chui th khng c dng h m scanf v h m scanf khng ch p
nh n kho ng tr ng.
V d: scanf(%s, chui);// ta nh p v o Nguy n V n i th
K thu t l p tr nh
31
32
K thu t l p tr nh
V d :
char destination[25];
char *blank = " ", *c = "C++", *turbo = "Turbo";
strcpy(destination, turbo); // destination = "Turbo"
strcat(destination, blank); // destination = "Turbo "
strcat(destination, c);
// destination = "Turbo C++"
- strncat(dest, src, n): ni nhi u nh t l n k t ca src v o cui chui
dest, sau th m k t null v o cui chui k t qu .
V d:
char destination[25];
char *source = " States";
strcpy(destination, "United");
strncat(destination, source, 6);
printf("%s\n", destination); // destination = "United State"
- char * strchr(s, ch): tr v a ch ca k t ch u ti n c trong chui
S; n u khng c th tr v NULL (thng dng l y h)
V d:
char string[15];
char *ptr, c = 'r';
strcpy(string, "This is a string");
ptr = strchr(string, c);
if (ptr)
printf("K t %c v tr : %d\n", c, ptr-string);
else
printf("Khng t m th y k t %c\n",c);
- char * strstr(S1, S2): tr v v tr ca chui S2 trong chui S1; n u S2
khng c trong S1 th h m strstr tr v tr NULL.
I.6.6. Mng cc chui
*Khai bo: Khai b o bi n ds cha ti a 50 chui k t, mi chui k t c
ti a 30 k t.
char ds[50 ] [30];
Ch :
- Khng n n g n chui vi chui (s1= s2) m ph i dng h m
strcpy(S1,S2)
- Khng c so s nh 2 chui b ng c c to n t quan h (S1== S2,
S1>S2, S1>= S2), m ph i dng h m strcmp(S1,S2).
K thu t l p tr nh
33
V d : Vi t chng tr nh t m ki m 1 t trong 1 c u
# include < string.h>
# include < stdio.h>
void main ()
{ char cau[80], t[7], *ptr;
printf(Nh p c u
:);
gets(c u);
printf(Nh p t :);
gets(t);
ptr = strstr(c u, t);
if (ptr == NULL) printf(Khng c t);
else printf(c t);
}
II. Cc cu trc iu khin trong C:
Ngn ng C l ngn ng l p tr nh c p cao c c u trc, gm: c u trc tu n t,
chn, v l p.
II.1 Cu trc tun t (Sequence) :
C c l nh trong chng tr nh c thc hi n tu n t t l nh n y n l nh
kh c cho n khi h t chng tr nh.
V du : Vi t chng tr nh t nh v in ra di n t ch ca hai ng trn b n k nh
l n lt l 3m v 4.5m cng vi hi u s ca 2 di n t ch.
#define PI 3.14159
#include <stdio.h>
#include <conio.h>
void main()
{
float r1, r2, hieuso;
clrscr();
printf("\nCHUONG TRINH TINH DIEN TICH 2 HINH TRON VA HIEU SO\n");
printf("Ban kinh hinh tron thu nhat : ");
scanf("%f",&r1);
printf("Ban kinh hinh tron thu hai : ");
scanf("%f",&r2);
printf ("Dien tich hinh tron 1 = %.2f\n",PI*r1*r1);
34
K thu t l p tr nh
NO
YES
S1
if (k) S1;
else S2;
K
NO
S2
YES
S1
K thu t l p tr nh
35
if (a>b)
if (a>c) max=a;
else max=c;
else if (b>c) max =b;
else max= c;
V d 2: T nh h m f(x) :
, n u -2 < = x< 2
f(x) = x2
4
,
x>=2
if (x>=-2 && x<2)
fx= x*x;
else if (x>=2)
fx= 4;
else { printf("\n Khong xac dinh") ; exit(0) ;}
II.2.2. L nh chn la: switch_case
C php:
switch (bi u thc)
{ case h ng 1: S1;
case h ng 2: S2; break;
.
.
.
case h ng 3: Sn; break;
default: S0;
}
Cch hot ng:
- (bi uthc) c k t qu nguy n
- H ng: k t, s nguy n, bi u thc c s nguy n
- N u k t qu b ng h ng I n o th n s l m l nh Si v tu n t thc hi n
h t c c l nh di cho n khi h t l nh switch.
- Mun ng t s tu n t tr n th ph i dng l nh break.
V d: Nh p 1 k t s d ng hex i ra s th p ph n
#include <stdio.h>
#include <conio.h>
void main()
K thu t l p tr nh
{
unsignedchar ch;
int k;
clrscr();
printf("Nhap 1 ky tu so hex : ");
ch=getche();
switch (ch)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': k=ch-'0'; break;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':k=ch-'A'+10; break;
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f': k= ch-'a'+10; break;
default: k=0;
}
printf ("\nSo thap phan cua ky tu hexa %c la %d ",ch,k);
getch();
}
V d : Vi t chng tr nh t o 1 m y t nh c 4 php to n + , - , * , /
#include <stdio.h>
#include <conio.h>
void main()
{
36
37
K thu t l p tr nh
NO
YES
38
K thu t l p tr nh
S
while (bt);
Yes
V d 1: Vi t chng tr nh in b ng m ASCII
#include <stdio.h>
k
No
K thu t l p tr nh
main ()
{ int n=0;
do
{ printf(%c c m ASCII %d\n, n, n);
n ++;
} while (n <= 255);
}
II.3.3. L nh for:
C php:
for ([bt_khi ng]; [bt_k]; [bt_l p])
S;
V d 1: L p l nh S t 1 n 10
for (int I=1; I== 10; I++) sai
S;
for (int I=1; I<= 10; I++) ng
S;.
V d 2: for (; ;)
{ c = getch()
if (c == ESC) break;
}
So s nh vng l p while - for:
bt_khi ng;
for ( bt_khi ng; bt_k; bt_l p)
while (Bi uThc_K)
S;
{
S;
BT_l p;
}
V d 3: Vi t chng tr nh in ra b ng cu chng b ng vng for
void main ()
{ int a;
for (a=2; a<= 9; a++)
{ for (b =1; b <= 9; b++)
printf(%d* %d = %d \t, a, b, a*b);
printf(\n);
}
}
V d 4: Vi t chng tr nh t nh n giai tha
39
K thu t l p tr nh
40
void main ()
{ long gt = 1;
for (int i =1; i<= n; i++)
gt = gt * i;
printf(%d! = %u \n, n, gt);
}
V d 5: Vi t chng tr nh t nh bi u thc:
(1 + 1/12 ) * (1 + 1/22 ) *......... (1 + 1/ n2 )
void main ()
{ int i, n;
float S;
printf(Nh p s :);
scanf(%d, &n);
S = 1;
for (i= 1;i<= n; i++)
S = S*(1+1.0 / (i*i));
printf(\nKet qua = %f, S)
}
* Pht bi u break, continue, goto:
1. Break:
L nh break cho php tho t ra sm khi vng l p ( whiledo , for, dowhile),
l nh switch.
2. L nh continue:
L nh continue ch dng trong vng l p l m cho chng tr nh nh y t t v
i u ki n ki m tra ca vng l p b t u mt vng l p mi.
V d: Vi t chng tr nh nh p mt c u ch thng k t thc b ng d u
ch m, xu t ra b ng ch hoa
void main ()
{ char ch;
while (1)
{ ch = getch ();
if ((ch> = a) && (ch< = z))
printf(%c, ch - a + A);
if (ch == ) continue;
if (ch == .) break;
}
K thu t l p tr nh
41
}
3. L nh goto: dng chuy n i u khi n chng tr nh v mt v tr n o .
C php: Goto nh n;
L nh goto s chuy n i u khi n chng tr nh ngay l p tc v v tr t
nh n.
V d:
Again:
;
.
.
goto Again;
B i t p:
1. Vi t chng tr nh t nh di n t ch
- H nh vung
- H nh thang
- Tam gi c thng
- Tam gi c vung
- H nh trn
2. T nh kho ng c ch mt i m (X0, Y0) ti mt ng th ng Ax + By + C = 0
S=
Ax 0 + By 0 + C
, nh p A, B, C, X0, Y0
2
2
A +B
3. Cho 3 s thc x, y, z. T m
a. Max(x+y+z, x*y*z)
b. Min2 ((x+y+z) / 2, x*y*z) +1
4. Vi t chng tr nh t m s ln nh t trong 3 s nguy n a,b, c
5. Gi i phng tr nh b c 2 Ax2+Bx+C = 0 tr n trng s thc.
6. Vi t chng tr nh t nh di n t ch h nh trn, bi t b n k nh r dng; Chng
tr nh c ki m tra s li u nh p v o, n u r <=0 th chng tr nh b o li v b t
nh p l i.
7. Vi t chng tr nh nh p s th p lc ph n in ra s nh ph n, c 4 s th c ch
mt kho ng tr ng.
8. Vi t chng tr nh t o 1 m y t nh gm c c php to n sau : + , - , * , / , ^ (ax
vi x nguy n dng), @ (ex )
K thu t l p tr nh
42
ch thng.
15. Vi t chng tr nh cho php ta ki m tra mt password l ng hay sai (nh p
ti a password 3 l n).
16. Cho chui s, vi t chng tr nh di chuy n ch t b n tr i qua b n ph i ca
K thu t l p tr nh
43
ax+by = c
ax+by = c
Hng d n:
D=
a
b
= ab - ab
a
b
Dx=
c
b
= cb - cb
c
b
Dy=
a
c
= ac - ac
a
c
if D!= 0
x= Dx/D; y= Dy/ D
else if (( Dx != 0) | | ( Dy != 0))
pt v nghi m
else pt v nh
24. Gi i h phng tr nh 3 n s b c nh t
a 1 x + b 1 y + c1 z = d 1
a 2 x + b 2 y + c2 z = d 2
a 3 x + b 3 y + c3 z = d 3
K thu t l p tr nh
44
b. 1+3+5+...+2n-1
c. 2+4+6+...+2n
d. 12+ 22+ 32+...+n2
e. 1/1+ 1/2+ 1/3+...+ 1/n
f. 2+4+8+...+2n
g. 1+ 1/22 + 1/32 +....+ 1/n2
31. Cho epsilon = 0.000001, x c nh c c tng sau y sao cho s h ng cui
cng ca tng l khng ng k (s h ng cui cng < epsilon )
a. 1/1+ 1/2+ 1/3+1/4+.....
b. 1+ 1/22 + 1/32 +....+...
32. Vi t chng tr nh in ra b ng m ASCII, 16 k t tr n 1 dng.
33. V lu v vi t chng tr nh :
a. Xt mt s c ph i l s nguy n t hay khng ?
b. In tr n m n h nh 100 s nguy n t u ti n
34. Vi t chng tr nh cho php mt k t ng u nhi n ri tr n m n h nh. N u
ngi s dng khng kp n ph m tng ng v ch m y m n h nh th
thua cuc.
35. Cho h m Fibonacci:
Fn =
1 ; n=0,1
Fn-1 + Fn-2 ; n>=2
a. T m Fn, vi n do ta nh p
b. In ra N ph n t u ti n ca d y Fibonacci
36. Vi t chng tr nh c v o s nguy n N v in ra 1*2*3*..*N cho n khi N <=0.
37. Cho 1 d y gm mt tri u t 32 bit, h y m s bit 1 trong mi t.
38. Vi t chng tr nh o n s : ngi chi s o n 1 s trong ph m vi t 0 n
100, ti a 5 l n. Chng tr nh ki m tra k t qu v xu t thng b o hng d n:
- S b n o n ln hn
- S b n o n nh hn
- B n o n ng
- M y th ng cuc
K thu t l p tr nh
45
III. Hm - quy:
III.1. Hm:
III.1.1. Mc ch: H m l mt chng tr nh con ca chng tr nh ch nh,
vi c c mc ch sau:
* Tr nh vi c l p i l p l i c c o n chng tr nh ging nhau, nh , ta s
ti t ki m lc l p tr nh.
* T chc chng tr nh: Dng h m ta s ph n m nh chng tr nh th nh
nhng khi nh c l p, mi khi l mt h m thc hi n mt cng vi c n o .
Tng h m s c l p tr nh, ki m tra ho n ch nh; Sau , ta k t l i t o chng
tr nh ho n ch nh. Nh v y, chng tr nh v sau d hi u v d sa.
* T nh c l p: cho php h m c l p vi chng tr nh ch nh. V d h m
c nhng bi n cc b m chng tr nh ch nh v c c h m kh c khng th ng
ti. Do , n u ta c khai b o c c bi n trng t n vi c c h m kh c th cng
khng s nh hng ti c c bi n trng t n .
Ch :
- C khng cho php c c h m lng nhau ngh a l c c h m u ngang c p
nhau (c th gi l n nhau).
- C khng ph n bi t th tc hay h m, m ch quan t m n k t qu tr v
ca h m. N u h m khng tr v k t qu g c th c th xem l th tc.
V d : V h nh ch nh t c b ng d u *:
#include <stdio.h>
#include <conio.h>
void ve_hcn(int d,int r)
// khai b o void cho bi t h m khng tr v tr
n o c
{ int i,j ;
// i, j l 2 bi n cc b trong h m ve_hcn
for (i=1;i<=r;i++)
{
for (j=1;j<=d; ++j)
printf("*");
printf("\n");
}
}
void main()
{ int d=20, r=5;
clrscr();
ve_hcn(d,r); // li gi h m
getch();
}
K thu t l p tr nh
46
47
K thu t l p tr nh
#include <stdio.h>
#include <conio.h>
int max (int a,int b)
{ int m= a>b?a:b;
a=a*100;
b=b*100;
return m;
}
void main()
{ int a,b,c;
clrscr();
printf("\nChuong trinh tim Max(a,b)\n");
printf("Nhap a b : ");
scanf("%d %d",&a,&b);
c=max(a,b);
printf("\nGia tri lon nhat =%d",c);
printf("\nGia tri a =%d",a);
printf("\nGia tri b =%d",b);
getch();
}
Gi s ta ch y chng tr nh tr n:
Nhap a b : 12 24
Gia tri lon nhat =24
Gia tri a =12
Gia tri b=24
Nh n xt:
- Ta nh n th y r ng gi tr hai bi n a, b trc v sau khi v o h m max l
khng thay i (m c d trong h m max, c hai bi n a v b u thay i); l
c ch ca s truy n i s theo tr.
Li gi hm:
48
K thu t l p tr nh
49
K thu t l p tr nh
void main()
{ int a,b;
printf ("a, b = ");
scanf ("%d %d", &a, &b);
giaohoan(a, b);
}
gih m (mang)
* Truy n i s l m ng
h m (ki u mang[]) ho c h m(ki u *mang)
V d : Cng th m mt h ng s v o m ng t n l dayso.
#define SIZE 5
// d y s c 5 s
#include <stdio.h>
#include <conio.h>
void add_const(int *a, int n, int con) // int *a int a[]
{ for (int i=0; i<n; i++)
*a = *(a++) + con;
}
void main()
{ int dayso [SIZE] = {3,5,7,9,11};
int konst = 10;
add_const(dayso, SIZE, konst);
printf("\nDay so sau khi cong them hang so :");
for (int i=0; i<SIZE; i++)
printf("%d ", *(dayso+i)); // *(dayso+i) dayso[i]
getch();
}
III.1.4. Khai bo nguy n mu ca hm
- Khai b o h m theo nguy n m u i hi ph i khai b o ki u d li u ca i
s n m trong nh ngh a h m ch khng t chng tr n c c dng ri ng.
- C khng nh t thi t ph i khai b o h m theo nguy n m u. Tuy nhi n, n n
c v n cho php chng tr nh dch ph t hi n c li do khng ng ki u d li u
gia tr truy n n h m v tr m h m mong mun.
V d :
float dinhthuc (float a, float b, float c, float d)
{ return (a*d- b*c);
}
void main()
50
K thu t l p tr nh
Ki u t nbi n ;
51
K thu t l p tr nh
III.1.6. Cc dn hng ti n x l
III.1.6.1. #define
a. nh ngh a hng:
#define
V d: #define
#define
#define
#define
t n h ng
gi tr
PI
MAX
THONGBAO
khoangtrang
3.14
100
H t Gi "
b. nh ngh a Macro:
#define
t nmacro (i s ) thao t c
sqr (x)
x*x
V d : #define
#define
sum (x,y) x+y
a = b * sum (x,y); // a = b * x+y;
#define
sum (x,y) (x+y)
a = b * sum (x,y); // a = b * (x+y);
*Ch : Trong c c thao t c Macro n n s dng c c d u ngo c tr nh d n
ra mt k t qu sai
max (a,b) ((a) > (b) ? (a) : (b))
V d: #define
#define
ho nv (a,b) { int t m =a; a= b; b= t m;}
#define
error (n)
printf ( error %d, n)
Di y mt s Macro ph n t ch k t, t t c u trong <ctype. h>. C c
macro n y tr v tr kh c 0 n u th nh cng. i vi mi macro, th nh cng c
nh ngh a nh sau:
Macro
isalpha (c)
isupper (c)
islower (c)
isdigit (c)
isxdigit (c)
iscntrl(c)
ispace (c)
Khai b o: char c;
K t
c l k t a z, A Z
c l k t A Z
c l k t a z
c l k s 0 9
0 9, A F, a z
c l k t xa ho c k t i u khi n
(0x7F ho c 0x00 n 0x1F)
c l k t space, tab, carriage return,
new line (0x09 n 0x0D, 0x20)
52
K thu t l p tr nh
=
=
{
{
1*2*3*......*(n-1)*n , n>0
1
, n=0
n*(n-1)!
, n>0
, n=0
53
K thu t l p tr nh
Nhn xt:
- Theo cng thc tr n, ta nh n th y trong nh ngh a ca n giai tha (n!)
c nh ngh a l i ch nh n n n h m giai tha c qui.
- Vi n >=0 , i u ki n dng t nh h m giai tha l n=1
2. Hm FIBONACCI:
Fn =
1
Fn-1 + Fn-2
; n =0,1
; n>1
54
K thu t l p tr nh
A
M
C
A
M
D
C
A
M
C
A
M
A
M
D
A
M
A
M
B
M
D
B
M
B
M
M
thi gian
Tng t vi trng hp h m qui, khi gi qui l n nhau th mt lo t
c c khung k ch ho t s c t o ra v n p v o b nh Stack. C p qui c ng cao
th s khung k ch ho t trong Stack c ng nhi u, do , c kh n ng d n n tr n
Stack (Stack overflow). Trong nhi u trng hp khi l p tr nh, n u c th c ta
n n g qui cho c c b i to n.
K thu t l p tr nh
55
IV. Structure:
C c ki u n gi n t i mt thi i m ch lu gi c mt gi tr duy nh t.
Cn mt bi n ki u m ng dng lu tr c c gi tr cng ki u d li u vi nhau,
ch ng h n nh mt d y s, mt d y c c k t,...Nhng trong thc t , i u n y
v n cha v c c th nh ph n m ta lu gi thng l kh c ki u d li u vi
nhau.
V d : Ta mun lu gi c c thng tin v mt sinh vi n nh sau : MASO,
HO, TEN, NGAYSINH, NOISINH, PHAI, DIACHI, LOP . Vi c c th nh ph n
nh v y, th r r ng c c th nh ph n ca 1 sinh vi n khng th cng ki u m ph i
thuc c c ki u kh c nhau, c th l :
- MASO, HO, TEN : m ng ch
- NGAYSINH : int ng y , th ng , n m ;
- NOISINH : m ng ch
- PHAI
: unsigned int;
- LOP
: m ng ch;
Do , lu tr c c c th nh ph n kh c nhau ca mt i tng ta ph i
s dng mt ki u d li u trong C l Structure. (tng t nh record trong
Pascal)
IV.1. nh ngh a:
Mt bi n c ki u structure c dng lu tr mt i tng c nhi u
th nh ph n. C c th nh ph n c th thuc c c ki u d li u kh c nhau.
IV.2. Khai bo: Mun khai b o ki u hocvien dng lu tr h, t n, i m
mn TOAN,LY,HOA, TB, X p lo i ca mt hc vi n, ta c :
struct hocvien
{
char ho[30];
char ten[7];
float toan, ly, hoa , dtb;
char xeploai[10];
};
- khai b o bi n hv c ki u hocvien :
struct hocvien hv;
- truy xu t ti mt th nh ph n, ta dng d u ch m, v d nh: hv.ho
truy xu t ti h ca hc vi n.
* Khai b o k t hp: va khai b o ki u structure va khai b o bi n c ki u .
struct hocvien
K thu t l p tr nh
56
char ho[30];
char ten[7];
float toan, ly, hoa , dtb;
char xeploai[10];
} hv1, hv2;
// khai b o 2 bi n hv1, hv2 cng ki u hocvien
- Khai b o structure lng nhau:
V d:
void main()
{ struct ngaysinh
{ unsigned int ngay, thang, nam;
};
struct hocvien
{ char ho[30];
char ten[7];
struct ngaysinh ngsinh;
float toan, ly, hoa, dtb;
char xeploai[10];
};
struct hocvien hv;
}
Trong trng hp n y, truy xu t ti th ng sinh ca hc vi n hv, ta vi t
nh sau: hv.ngsinh.thang.
V. FILE:
V.1. File vn bn:
- File v n b n l file c lu tr di d ng ki u k t
C 2 c ch truy xu t theo ki u k t.
- Truy xu t theo tng k t
- Truy xu t theo tng dng
V.1.1. Khai bo tp tin:
Khai b o bi n ki u file:
FILE *fptr
V.1.2. M tp tin:
fptr = fopen (t n file, ki u);
- Trong "t nfile" , ta c th ch nh mt ng d n y nh sau
K thu t l p tr nh
57
58
K thu t l p tr nh
// m file mi ghi
K thu t l p tr nh
59
K thu t l p tr nh
60
#include <conio.h>
#include <stdlib.h>
void main()
{ FILE *fptr;
char tenfile[67];
int ch;
int dem=0, tu=0;
clrscr();
printf("Cho biet ten file :");
gets(tenfile);
if ((fptr=fopen(tenfile,"r"))==NULL) // m file c
{ printf("Viec mo file co loi\n");
exit(0);
}
while ((ch=getc(fptr)) !=EOF)
{ if ((ch>='a' && ch <='z') || (ch>='A' && ch<='Z'))
tu=1;
if ((ch==' ' || ch=='\n' || ch=='\t') && tu)
{ dem++;
tu=0;
}
}
printf("So tu trong file =%d",dem);
fclose(fptr);
}
V.1.5. c / ghi chui k t:
* H m fgets (chui, chi ud i, fptr);
H m fgets c 1 chui k t t trong file fptr v o bi n <chui> vi chi u d i
ti a l <chi ud i>. H m n y tr v NULL khi c h t file
* H m fputs (chui, fptr): ghi 1 chui k t trong <chui> v o file fptr.
H m n y khng t ng th m v o m k t thc chuy n dng mi, do ta
ph i ghi th m m n y v o t p tin b ng l nh fputs ("\n", fptr);
V d 1: Chng tr nh ghi chui l n file, cho n khi chui nh p v o l rng
th k t thc.
K thu t l p tr nh
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
void main()
{ FILE *fptr;
char tenfile[67];
char chuoi[80];
clrscr();
printf("Cho biet ten file :");
gets(tenfile);
if ((fptr=fopen(tenfile,"w"))==NULL)
// t o file mi
{ printf("Viec tao file co loi\n");
exit(0);
}
while (strlen(gets(chuoi)) > 0)
// h m strlen() trong <string.h>
{ fputs(chuoi,fptr);
fputs("\n",fptr);
}
fclose(fptr);
}
V d 2: c c c chui k t t t p tin, v in n tr n m n h nh.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main()
{ FILE *fptr;
char tenfile[67];
char chuoi[81];
clrscr();
printf("Cho biet ten file :");
gets(tenfile);
if ((fptr=fopen(tenfile,"r"))==NULL)
{ printf("Viec tao file co loi\n");
exit(0);
}
while (fgets(chuoi,80,fptr)!= NULL)
printf("%s",chuoi);
fclose(fptr); getch();
}
61
K thu t l p tr nh
62
63
K thu t l p tr nh
V.2.3. ng file:
fclose (fptr)
V.2.4. c/ghi file: H m fread : c s m u tin(c u trc) trong file fptr
v o <bi n c u trc>.
fread (& bi n cu trc, sizeof (bi n cu trc) , s cu trc, fptr);
H m fread tr v s c u trc c c
H m fwrite ghi d li u trong <bi n c u trc> v o file fptr.
fwrite (&bi n cu trc, sizeof (bi n cu trc) , s cu trc, fptr);
H m fwrite tr v s c u trc ghi c l n file
Ch :
- ki m tra vi c c file ta ki m tra s c u trc c c. N u s c u trc
tr v b ng 0 m ta c n c l 1 c u trc th i u chng t h t file.
* Ghi mt mng cu trc l n file
fwrite(t nm ng, sizeof (t nm ng), 1, fptr);
// m file nh ph n ghi
K thu t l p tr nh
64
gets(hv.hoten);
if (strlen(hv.hoten) !=0)
{ printf("Nhap tuoi :");
gets(tuoi);
hv.tuoi = atoi(tuoi);
// macro doi chuoi qua so nguyen
fwrite(&hv, sizeof(hv), 1, fptr) ; // ghi noi dung 1 mau tin trong bien hv
// vao file fptr
}
}
while (strlen(hv.hoten)!=0);
fclose (fptr);
}
V d 2: Ghi d li u m ng v o file nh ph n
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{ struct hocvien
{ char hoten[30];
int tuoi;
} hv;
struct hocvien table[3];
FILE *fptr;
char tenfile[67];
char tuoi[3];
int i=0;
printf("Nhap ten file :");
gets(tenfile);
if ((fptr=fopen(tenfile,"wb")) == NULL)
{ printf ("Khong the tao file\n"); exit(0);
}
do
{ printf("Nhap ho ten hoc vien :");
gets(hv.hoten);
printf("Nhap tuoi :");
gets(tuoi);
hv.tuoi = atoi(tuoi);
// macro doi chuoi qua so nguyen
table[i++]=hv;
K thu t l p tr nh
65
}
while (i<3);
fwrite(table, sizeof(table), 1, fptr) ; // ghi noi dung toan bo hoc vien trong
// table vao file fptr
// ho c for (i=0; i<3; i++)
// fwrite(&table[i], sizeof(table[i]), 1, fptr)
fclose (fptr);
}
V d 3: Chng tr nh c file nh ph n, v in danh s ch hc vi n ra m n
h nh.
// In danh s ch hc vi n ra m n h nh
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void main()
{ struct hocvien
{ char hoten[30];
int tuoi;
} hv;
FILE *fptr;
char tenfile[67];
char tuoi[3];
printf("Nhap ten file :");
gets(tenfile);
if ((fptr=fopen(tenfile,"rb")) == NULL) // M file c
{ printf ("Khong the mo file\n"); exit(0);
}
clrscr();
printf(" Ho va ten
Tuoi");
while (fread(&hv,sizeof(hv),1,fptr) ==1)
{
printf("\n%-20s",hv.hoten);
printf("%3d",hv.tuoi);
}
fclose (fptr);
}
V.2.5. Truy xut tp tin ngu nhi n: (i u khi n con tr t p tin tr n file
nh ph n)
K thu t l p tr nh
66
67
K thu t l p tr nh
K thu t l p tr nh
68
fp = fopen("perror.dat", "r");
if (!fp)
perror("Khng th m file c");
}
Khi ch y chng tr nh n y, n u tr n d a cha c t p tin perror.dat th s hi n
thng b o li: Khng th m file c: No such file or directory.
B i t p
1. T o t p tin di n t ch.h
#define
Pi
3.14
#define
dthv (x)
x*x
#define
dtht (x)
(Pi*x*x)
2. Vi t chng tr nh t nh di n t ch da v o file dientich.h tr n
3. Vi t h m qui t nh t ch P(n) = 1 * 2 * 3* ....* n , n>0
4. Vi t h m qui t nh h m m xn, vi n nguy n.
5. Vi t h m qui t nh ph n t th n ca h m Fibonacci.
6. Vi t h m qui gi i quy t b i to n Th p H ni.
C 3 ct A, B, C. Ct A hi n ang c n d a k ch thc kh c nhau, d a nh
tr n d a ln di. H y di n d a t ct A sang ct C (xem ct B l ct trung
gian) vi i u ki n mi l n ch c di 1 d a v d a t tr n bao gi cng
nh hn d a t di.
7. Vi t chng tr nh m ha v gi i m mt file v n b n sao cho n u ta m
ha ri th chng tr nh khng m ha na, v n u file cha m ha th
khng c gi i m .
8. Cho bi t trong mt file v n b n do ta nh p v o c bao nhi u k t, bao nhi u
t, v bao nhi u dng; bi t r ng c c t c ch nhau kho ng tr ng, d u tab, d u
ch m.
9. Vi t chng tr nh t o mt menu thc hi n c c chc n ng sau tr n file v n
b n:
- T o file mi
- c file
- Xa file
- Ghi ni ui file
- Copy file
- Di chuy n file t th mc n y sang th mc kh c
- T m mt t xu t hi n bao nhi u l n trong file (khng ph n bi t ch in, ch
K thu t l p tr nh
69
thng)
- Thay th t n y b ng t kh c
10. T o menu thc hi n c c cng vi c sau:
- Nh p danh s ch c ki u hc vi n v o mt file t n 'HOSO.TXT', mi hc
vi n c c c thng tin sau: maso (int), hoten (chui ti a 30 k t), ph i
(NAM/NU), tui (int).
- Li t k danh s ch hc vi n ra m n h nh theo d ng sau:
M s
H v t n
Ph i
Tui
- Truy xu t ng u nhi n theo th t m u tin
- T m ki m mt ngi trong file theo m s
- C p nh t sa i c c m u tin theo m s (Nh p m s, sau hi u ch nh
l i hoten, phai, v tui).
- Xa mt ngi trong file theo m s.
70
K thu t l p tr nh
1
2
int
M ng n ph n t
n-1
B nh
!Khai bo:
C php: Khai b o m ng 1 chi u
Ki u_DL T nm ng [k ch thc];
Ki u_DL : l 1 trong c c ki u d li u c b n, l ki u ca ph n t
ca m ng
T nm ng: l t n ca m ng c t 1 c ch hp l
K ch thc: l 1 h ng nguy n cho bi t s ph n t ti a ca m ng
V d 1: Khai b o 1 m ng s nguy n
int
int
int
bi n
n;
M[n] ;
SAI
M[10] ; ng v k ch thc m ng ph i l h ng khng ph i l
C php:
Khai b o m ng 2 chi u
71
K thu t l p tr nh
Ki u_DL
Ch : Mt m ng trong C, c c ph n t c nh s t 0 ti n-1
V d : Vi M[10]
th th nh ph n th 1 l M[0]
th nh ph n cui cng M[9]
* C khng b t b , khng ki m tra xem bi n m c vt ra khi gii h n
cho php ca m ng cha. Do , chng ta ph i ki m tra bi n m trong chng
tr nh (ph i nh hn n)
I.1.2. Khi ng tr cho mng:
Ta khi ng c tr cho m ng trong 2 trng hp sau:
M ng c khai b o l bi n ngo i (main) ngh a l bi n to n cc
M ng c khai b o cc b
int M[3] = {10,11,12}
V d 1 :
main()
{
}
V d 2:
main()
{ static
int M[ ]={10,22,30};
............
}
Ta c th g n 1 h ng cho c m ng nh sau:
memset (M,0,sizeof(int) *3) ; // g n 0 cho m ng M vi M c 3 ph n t
T kha static dng khai b o 1 bi n cc b thng trc cho php duy
tr gi tr ri ng ca n nhng l n gi h m sau n y.
Khi t o m ng 2 chi u:
int
M[2][3]= {{1,2,3},
{0,1,0}};
I.1.3.Truy xut thnh phn ca mng: M[ch s]
72
K thu t l p tr nh
int n,i;
float M[10];
printf("\nCho biet so phan tu cua mang:")
scanf (%d,&n);
for ( i=0; i< n; i++)
{ printf(a[%d]= ,i+1);
scanf (%f,&M[i]);
}
V d 2: Nh p v o m ng 2 chi u.
int m, n, i, j;
float M[10] [10];
printf("So dong ="); scanf("%d",&n);
printf("So cot ="); scanf("%d",&m);
for(i= 0; i< n; i++)
for(j= 0; j<m; j++)
{ printf(M[%d] [%d] = ,i,j);
scanf(%f, &M[i][j]);
}
I.1.5. Xut d li u ki u mng: xu t d li u m ng ta cng ph i xu t d
li u ca tng th nh ph n m ng
V d:
int i, n;
float M[10];
for(i = 0; i< n; i++)
printf(a[%d] = %f,i+1, M[i]);
I.2. Thut ton t m ki m tr n mng cha c th t:
Do m ng cha c th t n n ta p dng phng ph p t m ki m tuy n t nh t m
t u m ng cho n cui m ng. Trong chng tr nh sau y, h m Timki m s
tr v tr -1 n u khng c m sinh vi n trong danh s ch ds, ngc l i h m s tr
v v tr ca m s trong danh s ch ds.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SOSV 100
typedef struct sinhvien
K thu t l p tr nh
{ char maso[6];
char hoten[30];
};
typedef struct danhsach_sv // nh ngh a ki u danhsach_sv
{ int tssv;
sinhvien sv[MAX_SOSV];
} ;
void Nhap_ds (struct danhsach_sv *psv)
{ char sosv[4];
printf("So sinh vien muon nhap :");
gets(sosv);
psv->tssv=atoi(sosv);
for (int i=0; i<psv->tssv; i++)
{ printf("Ma so :");
gets(psv->sv[i].maso);
printf("Ho ten :");
gets(psv->sv[i].hoten);
}
}
void Lietke_ds (struct danhsach_sv *psv)
{ int i=0;
clrscr();
printf (" Ma so Ho & ten \n");
while (i < psv->tssv)
{ printf ("%8s
%-s\n", psv->sv[i].maso,psv->sv[i].hoten);
i++;
}
getch();
}
/* Hm Timkiem t m maso trong danhsach *psv */
int Timkiem(danhsach_sv *psv, char maso[])
{ int i=0;
while ((i<psv->tssv) && (strcmp(psv->sv[i].maso, maso)!=0))
i++;
return (i==psv->tssv ? -1 : i) ;
73
74
K thu t l p tr nh
}
void main()
{ struct danhsach_sv ds;
char maso[6];
int vitri;
Nhap_ds(&ds);
// Gi h m Nhap_ds vi tham s l ds
Lietke_ds(&ds);
printf("Ma so sinh vien ban can tim :");
gets(maso);
vitri = Timkiem(&ds, maso);
if (vitri !=-1)
printf("Ho ten cua sinh vien la %s",ds.sv[vitri].hoten);
else printf(" Khong co sinh vien voi ma ban nhap vao");
getch();
}
II. Cc thut ton sp xp:
Trong thc t cuc sng cng nh trong l nh vc l p tr nh, vi c qu n l d li u
thng i hi s t m ki m c c d li u c n thi t; thu n ti n cho vi c t m
ki m, d li u thng c s p x p theo mt th t n o .
C r t nhi u phng ph p s p th t, trong b i gi ng n y ta ch kh o s t hai
phng ph p s p x p l Bubble_Sort v Quick_Sort.
thu n ti n ta gi s m ng l d y s c ti a 100 s, v c c thu t to n di
y dng s p x p d y s theo th t t ng d n.
II.1. Sp x p theo phng php Bubble_Sort (phng php ni bt)
- Ni dung : Ta cho i duy t d y a[0], .. ,a[n-1]; n u a[i-1] ln hn a[i] th ta
ho n i (a[i-1],a[i]). L p l i qu tr nh duy t d y n y cho n khi khng c x y
ra vi c i ch ca hai ph n t.
V d : Ta s p th t d y s sau : 26 33 35 29 19 12 32
Bc 0
26
33
35
29
19
12
26
33
35
29
12
19
26
33
35
12
19
26
29
33
12
19
26
29
32
12
19
26
29
32
12
19
26
29
32
75
K thu t l p tr nh
12
19
29
35
33
33
32
32
32
32
35
35
- Chng tr nh:
#include <stdio.h>
#include <conio.h>
int mang[100];
// bi n to n cc
int size ;
void Bubble_Sort(int A[100], int n)
{ int i,j,temp;
for (i=1; i<n; i++)
for (j=n-1;j>=i; j--)
if (A[j-1] > A[j])
{ temp = A[j-1];
A[j-1] = A[j];
A[j] = temp;
}
}
int Nhap_day_so (int A[])
{ int i,n;
printf("\nSo phan tu cua mang :"); scanf("%d",&n);
for (i=0; i<n; i++)
{ printf ("A[%d] = ",i+1);
scanf("%d",&A[i]);
}
return n;
}
void Liet_ke (int A[], int n)
{ int i;
printf("\n Gia tri mang da duoc sap : \n");
for (i=0; i<n; i++)
printf ("%5d",A[i]);
getch();
}
void main()
{
size= Nhap_day_so(mang);
33
35
76
K thu t l p tr nh
Bubble_Sort(mang,size);
Liet_ke(mang,size);
}
Ta nh n th y phng ph p n y c th c c i ti n d d ng. N u l n
duy t d y n o m khng c c s i ch gia hai ph n t th d y c th
t v gi i thu t k t thc. Trong trng hp n y, ta dng mt c hi u flag ghi
nh n i u n y, v gi i thu t Bubble Sort c c i ti n nh sau:
#define FALSE 0
#define TRUE 1
void Bubble_Sort_Ad(int A[], int n)
{ int i,temp;
unsigned char flag=TRUE;
while (flag)
{ flag = FALSE ;
for (i=0; i<n-1; i++)
if (A[i] > A[i+1])
{ temp = A[i];
A[i] = A[i+1];
A[i+1] = temp;
flag=TRUE;
}
}
}
II.2. Sp x p theo phng php Quick_Sort
II.2.1. Ni dung: Chn mt ph n t b t k trong danh s ch l m i m cht
x, so s nh v i ch nhng ph n t trong danh s ch n y t o ra 3 ph n: ph n
c gi tr nh hn x, ph n c gi tr b ng x, v ph n c gi tr ln hn x. L i ti p
tc chia 2 ph n c gi tr nh hn v ln hn x theo nguy n t c nh tr n; qu
tr nh chia ph n s k t thc khi mi ph n ch cn l i mt ph n t, lc n y ta c
mt danh s ch c th t.
V d: Xt d y 26 33 35 29 19 12 32
' L n chia ph n th nh t : Chn ph n t cht c kha l 29, t l x
26
i%
33
35
29
19
12
32
$j
K thu t l p tr nh
77
35
i
K t thc ta s c ba ph n : 32 ; 33 ; 35
n y qu tr nh chia ph n k t thc v t t c c c ph n ch c mt ph n t,
lc n y ta s c mt danh s ch c th t l :
12 19 26 29 32 33 35
II.2.2. Gii thut:
a. Gii thut khng quy:
- Ta t o mt Stack , mi ph n t ca Stack c 2 th nh ph n l q, r cha ch
s u v ch s cui ca d y c n s p. Ban u, Stack[0].q = 0 v Stack[0].r =n-1
- Ti n h nh ph n ho ch d y s gm c c s b t u t ch s q n ch s r
- Sau mi l n chia ph n, ta ki m tra xem ph n c gi tr nh hn cht v
ph n c gi tr ln hn cht n u c t 2 ph n t tr l n th a v o Stack. Sau
mi l n ph n ho ch, ta l i l y d y s mi t Stack ra ph n ho ch ti p.
K thu t l p tr nh
78
K thu t l p tr nh
79
if (i<r)
// ph n th ba c t 2 ph n t tr l n
{ // a v o Stack ch s u v ch s cui ca ph n th ba
sp++;
Stack[sp].q=i;
Stack[sp].r=r;
}
r = j ; // Chu n b v tr ph n ho ch ph n c gi tr nh hn cht
} while (q< r);
} while (sp!=-1); // Ket thuc khi Stack rong
}
int Nhap_day_so (int A[])
/* T o d y n s ng u nhi n t 0 n 9999 a v o m ng A */
{ int i,n;
printf("\nSo phan tu cua mang :"); scanf("%d",&n);
randomize();
// dng <time.h> v <stdlib.h>
for (i=0; i<n; i++)
A[i]= rand() % 10000; // Ph t sinh c c s ng u nhi n t 0 n 9999
return n;
}
void Liet_ke (char str[],int A[], int n)
{ int i;
printf("\n%s\n",str);
for (i=0; i<n; i++)
printf ("%5d",A[i]);
getch();
}
void main()
{
size= Nhap_day_so(mang);
Liet_ke("Day so ngau nhien :",mang,size);
Quick_Sort(mang,size);
Liet_ke("Gia tri mang da duoc sap :",mang,size);
}
b. Gii thut Quick Sort qui: v c ch thc hi n th cng ging nh
K thu t l p tr nh
80
K thu t l p tr nh
81
- Gi i thu t:
int Search(int A[], int n, int x)
{ int i=0;
while (i<n && A[i] < x)
i++;
return (i<n && A[i]==x ? i : -1) ;
}
void main()
{ int so,vitri;
size= Nhap_day_so(mang);
Quick_Sort(mang,size);
Liet_ke("Gia tri mang da duoc sap :",mang,size);
printf("\nGia tri muon tim :");
scanf("%d",&so);
vitri = Search(mang,size, so);
if (vitri !=-1)
printf("Vi tri cua so %d trong day = %d",so,vitri);
else printf(" Khong co so %d trong day",so);
getch();
}
III.2. Php t m ki m nh phn:
- Ni dung:
! Bc 1: Ph m vi t m ki m ban u l to n b danh s ch.
! Bc 2: L y ph n t ch nh gia ca ph m vi t m ki m (gi l y) so s nh
vi x.
N u x=y th ta t m th y, tr v ch s. Gi i thu t k t thc
N u x < y th ph m vi t m ki m mi l c c ph n t n m ph a trc
ca y.
N u x > y th ph m vi t m ki m mi l c c ph n t n m ph a sau ca y.
! Bc 3: N u cn tn t i ph m vi t m ki m th l p l i bc 2, ngc l i
gi i thu t k t thc vi k t qu l khng c x trong d y s.
- Gi i thu t:
int Binary_Search(int A[], int n, int x)
{ unsigned char found=FALSE; // Gi s ban u ta cha t m th y x trong d y
// Ph m vi ban u t m ki m l t k=0 % m = n-1
K thu t l p tr nh
82
int k=0;
int m=n-1;
int j;
while (k<=m && !found)
{ j=(k+m) /2;
//ch s ph n t gia
if (A[j]==x)
found=TRUE;
else if (x>A[j]) k=j+1;
// Ph m vi t m mi l (j+1, m)
else m=j-1;
// Ph m vi t m mi l (k, j-1)
}
return (found ? j : -1) ;
}
III.3. Php t m ki m nh phn qui:
- Ni dung: tng t nh tr n
! Bc 1: Ph m vi t m ki m ban u l to n b danh s ch (k=0%m=n-1).
! Bc 2: L y ph n t ch nh gia ca ph m vi t m ki m (gi l y) so s nh
vi x.
N u x=y th ta t m th y, tr v ch s. Gi i thu t k t thc
N u x < y th ph m vi t m ki m mi l c c ph n t n m ph a trc
ca y, n n ta gi qui vi ph m vi mi l (k,j-1)
N u x > y th ph m vi t m ki m mi l c c ph n t n m ph a sau ca y,
n n ta gi qui vi ph m vi mi l (j+1,m )
! i u ki n dng: x=y ho c k > m.
- Gi i thu t:
int Binary_Search2(int A[], int k,int m, int x)
{ int j=(k+m) /2;
if (k>m) return -1 ;
else if (A[j]==x) return j ;
else Binary_Search2(A, (A[j]<x ? j+1:k), (A[j] > x ?j-1:m),x);
}
83
K thu t l p tr nh
B i t p:
1. Cho mt d y n s thc A :
a) T m ph n t nh nh t ca d y s A
b) T m ph n t ln nh t ca d y s A
c) T nh gi tr trung b nh ca d y s A.
2. Hi n ang lu h nh c c t gi y b c 50000, 20000, 10000, 5000, 2000,
1000, 500, 200, 100. N u c x ng, hi r ng n n chn c c t gi y b c n o
s lng c c t gi y b c l t nh t.
3. Vi t chng tr nh nh p mt ma tr n s nguy n c k ch thc M x N. In ra:
- Tng c c ph n t ca ma tr n
- S c c ph n t dng, ph n t m, ph n t 0 ca ma tr n
- Ph n t ln nh t, nh nh t ca ma tr n
- C c ph n t tr n ng cho ch nh ca ma tr n (vi M = N )
- Tng c c ph n t tr n ng cho ch nh ca ma tr n (vi M = N )
4. Cho 2 ma tr n vung A(n,n) v B (n,n) :
- T nh ma tr n tng C = A+ B,
bi t C[i,j] = A[i,j] + B[i,j] , i,j [1,m]
- T nh ma tr n t ch D = A * B,
n
bi t D [i,j] = A[i , k ] * B[ k , j ]
k 1
; i, j = 1..n
84
K thu t l p tr nh
H & T n
TB HK1
TB HK2
TB ton
nm
Hng
1
2
3
Lu :- C c hc vi n cng TB th cng h ng
- In 17 hc vi n tr n mt trang m n h nh
11. Cho 2 d y s A c n ph n t v B c m ph n t vi th t t ng d n. H y trn
2 d y s tr n th nh 1 d y mi C sao cho sau khi trn th C cng t ng d n.
85
K thu t l p tr nh
CHNG 4
CON TR (POINTER)
I. NH NGHA
Con tr l mt ki u d li u dng cha a ch . Bi n con tr l mt bi n
cha a ch ca mt thc th n o , thc th l bi n ho c l h m.
Con tr thng c dng :
- Tr v nhi u tr t h m qua c ch truy n theo tham s theo a ch trong
h m (tham s h nh thc bi n).
- T o c c c u trc d li u phc t p nh danh s ch li n k t v c y nh ph n.
- Truy n m ng v chui gia c c h m kh thu n li.
I.1. Khai bo: Khai b o bi n pi l con tr tr n mt s nguy n.
int *pi;
Lc n y, pi chi m 2 bytes cha a ch ca s nguy n m n ang ch
n, ng thi tr nh bi n dch ca C cng bi t pi ang ch n mt s nguy n
(do khai b o). a mt gi tr nguy n v o vng nh m pi ang tr n, ta
dng l nh: *pi = 1;
V d:
void main()
{ int x=4, y=10;
int *px, *py ;
px = &x ;
py = &y;
*px = *px + *py;
// px, py l c c bi n con tr
// a a ch ca x,y v o px v py
// t ng gi tr ca vng nh m px ang tr ti
// th m y , tng ng vi x = x+y
}
Minh ha chng tr nh tr n trong b nh:
Bi n
int x=4, y=10;
px=&x;
int *px, *py;
py=&y;
x
950
4
4
951
y
952
10
10
953
px
950
950
py
952
952
86
K thu t l p tr nh
Ki u *bi n;
87
K thu t l p tr nh
( Ki u)
*t nbi n
88
K thu t l p tr nh
*p = 97;
// num =97
n = *p;
// n=97
c = (char) *p; // c = a
Ch : a ch ca mt bi n c xem nh mt con tr h ng, do n
khng c php g n, t ng ho c gi m.
V d : int num, *p, n;
p = & num;
p ++; // ng
( & num) ++;
// sai
con tr h ng
II.6. Khai bo mt con tr hng v con tr ch n i tng hng:
a. Con tr hng:
Ki u * const p = gi tr;
b. Con tr ch n i tng hng:
Ki u const *p = gi tr h ng;
ho c Const ki u *p = gi tr h ng;
V d: char *const p2 = ABCD
const char *p1= ABCD
p2 + + ;
// sai
p1 + + ;
// ng;
*p1= B
; p1 = "BCD"
K thu t l p tr nh
89
90
K thu t l p tr nh
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
91
K thu t l p tr nh
Trong b nh :
0
1
2
49
a
- Bi n con tr khi c khai b o th ch c c p mt nh m ni dung
ca n ch ng bi t ch n u
V d 2: a[1]x c nh th nh ph n th 2
p+1 : ni dung khng x c nh
ph i c p = a p ch ti a
- N u ta mun t o mt m ng b ng con tr th ta ph i xin c p ph t mt vng
nh b ng h m malloc ()
V d:
int *p;
p = (int) maloc ( 10* sizeof(int));
Trong b nh:
0
1
2
9
p
V d : int *p;
p = malloc (10* sizeof (int));
for(i=0; i< 10; i++)
scanf (%d, p+i)
- lo i b vng nh c c p cho con tr ta dng h m free (p)
2. S khc nhau gia tham s ca hm l mng v i s l pointer:
H m (ki u a[])
H m (ki u *p)
Ch :
N u: Ki u a[50][30], *p;
p= a;
th
H m (Ki u a[][30])
H m (Ki u *p)
3. Hm tr v ki u con tr:
Ki u *h m (is)
V d :
char *strcat (char s1[], char s2[])
{ int i=0,j=0;
while ( s1[i]!='\0' ) i++;
while ( (s1[i++] = s2[j++]) !='\0' ) ;
92
K thu t l p tr nh
return s1 ;
}
IV. Con tr v chui
IV.1. Khai bo: khai b o s l 1 chui k t v p l con tr tr n 1 chui
k t, ta vi t nh sau:
char s [50];
char *p;
khi t o 1 chui trong c 2 trng hp:
static char s[] = ABCD;
char *p = ABCD;
Lc n y, n u ta:
puts (p) ;
// ABCD
puts (++p) ;
// BCD
IV.2. Xt mt s v d v cc hm x l chui
a. Hm Strcpy: Sao chp chui k t t source qua dest.
0
source A
1
B
2
C
3
D
4
E
5
F
\0
dest
#include <stdio.h>
#include <conio.h>
void strcpy (char dest[], char source[])
{
int i=0;
while ((dest[i++] = source[i]) !='\0');
}
void main()
{
char src_str[]="Hoang Van";
char dst_str[20];
strcpy(dst_str,src_str);
printf("\n%s", dst_str);
}
Vi t l i h m strcpy b ng con tr:
void strcpy (char *dest, const char *source)
{ while (( *dest = *source) !=\0)
{ dest ++;
K thu t l p tr nh
source ++;
}
}
b. Hm Strcmp () : dng so s nh 2 chui s1, s2 vi nhau.
int strcmp (char s1[] , char s2 []);
{ int i= 0;
while (s1[i] == s2[i])
{ if (s1[i] == \0)
return 0;
i++;
}
return (s1[i]- s2[i]);
}
C i t l i b ng con tr:
int strcmp (char *s1, const char *s2);
{ while (*s1 == *s2)
{ if (*s1 == \0)
return 0;
*s1++;
*s2++;
}
return (*s1 - *s2)
}
c. Hm strcat: ni chui s2 sau chui s1
char *strcat (char s1[],char s2[])
{ int i=0,j=0;
while ( s1[i]!='\0' ) i++;
while ( (s1[i++] = s2[j++]) !='\0' ) ;
return s1 ;
}
C i t l i b ng con tr:
char *strcat (char *s1, const char *s2)
{ char *p;
p=s1;
while ( *s1!='\0' )
s1 ++;
while ( (*s1=*s2) !='\0' )
{ s1 ++; s2 ++;
}
93
94
K thu t l p tr nh
return p ;
}
d. Hm strchr: tr v a ch ca k t c tromg chui s.
#include <stdio.h>
#include <conio.h>
char *strchr (char s[], char c)
{ int i=0;
while ( s[i]!=c && s[i]!='\0' )
i++;
if ( s[i] != c) return (char *)0;
else return &s[i] ;
}
C i t l i b ng con tr:
char *strchr (char *s, char c)
{
while ( *s !=c && *s!='\0' )
s++;
if ( *s != c) return (char *)0;
else return s ;
}
char str[]="Ky ";
void main()
{ char *vt;
vt=strchr(str ,'y');
if (vt==NULL )
printf("Khong co ky tu trong chuoi" );
else printf("\nVi tri =%d", vt-str+1);
getch();
}
IV.3. Mng con tr ch n chui
- Khai bo: khai b o 1 m ng con tr ch n chui, v d nh danh s ch
h t n, ta vi t nh sau:
char * ds[5]=
// m ng chui ds[5][7]
95
K thu t l p tr nh
ds[0]
ds[1]
ds[2]
ds[3]
ds[4]
H o
a
V a
n
C h
i
N g
o
N g
u
H nh 3.2. M ng con tr
H
V
C
N
N
H
n
g
\0
\0
\0
c
\0
y
e
t
\0
tr n chui
o
a
n
g
\0
a
n
\0
h
i
\0
g
o
c
\0
g
u
y
e
t
\0
nh 3.3. M ng c c chui
K thu t l p tr nh
96
B i t p:
1. S p x p l i danh s ch hc vi n theo th t h t ng d n b ng con tr.
2. S p x p l i danh s ch hc vi n theo th t t n t ng d n, n u trng t n th
s p theo h b ng con tr.
3. S p x p l i danh s ch hc vi n theo th t t n t ng d n, n u trng t n th
s p theo h b ng m ng chui.
97
K thu t l p tr nh
CHNG 5
I. Khi nim:
C u trc danh s ch li n k t l c u trc ng, vi c c p ph t nt v gi i
phng nt tr n danh s ch x y ra khi chng tr nh ang ch y. Ta thng c p ph t
nt cho danh s ch li n k t b ng bi n ng.
C c ph n t s c c p ph t vng nh trong qu tr nh thc thi chng
tr nh, do chng c th n m r i r c nhi u ni kh c nhau trong b nh (khng
li n tc) .
First
First
Nil
K thu t l p tr nh
98
K thu t l p tr nh
99
First = NULL;
}
b. C p ph t vng nh (New_Node): c p ph t mt nt cho danh s ch li n
k t. H m New_Node n y tr v a ch ca nt va c p ph t.
Trong chng tr nh c s dng h m malloc (trong <alloc.h>) , h m n y c p
ph t mt khi nh t nh theo byte t b nh heap. N u c p ph t th nh cng, h m
malloc tr v a ch ca vng nh va c p ph t, ngc l i n s tr v NULL.
NODEPTR New_Node()
{
NODEPTR p;
p = (NODEPTR)malloc(sizeof(struct node));
return (p);
}
c. Th m v o u danh s ch (Insert_First): th m mt nt c ni dung x v o
u danh s ch li n k t.
void Insert_First (NODEPTR &First, int x)
{
NODEPTR p;
p = New_Node();
p->info = x;
p->next = First;
First = p;
}
d. Th m nt mi v o sau nt c a ch p (Insert_After): th m mt nt c
ni dung x v o sau nt c a ch p trong danh s ch li n k t First.
void Insert_After(NODEPTR p, int x)
{
NODEPTR q;
if(p == NULL)
printf("khong them nut moi vao danh sach duoc");
else
{
q = New_Node();
q->info = x;
q->next = p->next;
p->next = q;
}
}
K thu t l p tr nh
100
K thu t l p tr nh
101
Free_Node(q);
}
}
e. Xa to n b danh s ch (Delete_All): ta c th s dng l nh *First =
NULL xa to n b danh s ch, nhng trong b nh, c c vng nh c p ph t
cho c c nt khng gi i phng v l i cho memory heap, n n s l ng ph vng nh.
Do , ta s dng gi i thu t sau:
void Delete_All (NODEPTR &First)
{ NODEPTR p;
while (First != NULL)
{ p=First;
First = First->next;
// ho c First = p->next
Free_Node(p);
}
}
II.3. Duy t danh sch: Thng thng ta hay duy t danh s ch li n k t thc
hi n mt cng vi c g , nh li t k d li u trong danh s ch hay m s nt
trong danh s ch...
void Traverse(NODEPTR First)
{ NODEPTR p;
int stt = 0;
p = First;
if(p == NULL)
printf("\n (Khong co sinh vien trong danh sach)");
while(p != NULL)
{
printf("\n %5d%8d", stt++, p->info);
p = p->next;
}
}
II.4. T m ki m (Search): T m nt u ti n trong danh s ch c info b ng vi x.
Do y l danh s ch li n k t n n ta ph i t m t u danh s ch.
H m Search n u t m th y x trong danh s ch th tr v a ch ca nt c tr
b ng x trong danh s ch, n u khng c th tr v tr NULL.
NODEPTR Search(NODEPTR First, int x)
{
NODEPTR p;
K thu t l p tr nh
102
p = First;
while(p != NULL && p->info != x )
p = p->next;
return (p);
}
II.5. Sp x p (Selection_Sort): s p x p danh s ch li n k t theo th t info t ng
d n.
- Ni dung: Ta so s nh t t c c c ph n t ca danh s ch chn ra mt
ph n t nh nh t a v u danh s ch; sau , ti p tc chn ph n t nh nh t
trong c c ph n t cn l i a v ph n t th hai trong danh s ch. Qu tr nh
n y l p l i cho n khi chn ra c ph n t nh th (n-1).
- Gi i thu t:
void Selection_Sort(NODEPTR First)
{ NODEPTR p, q, pmin;
int min;
for(p = First; p->next != NULL; p = p->next)
{
min = p->info;
pmin = p;
for(q = p->next; q != NULL; q = q->next)
if(min > q->info)
{
min = q->info;
pmin = q;
}
// hoan doi truong info cua hai nut p va pmin
pmin->info = p->info;
p->info = min;
}
}
K thu t l p tr nh
103
B i t p:
1. Vi t chng tr nh t o mt menu thc hi n c c cng vi c sau:
a. Nh p danh s ch li n k t theo gi i thu t th m v u danh s ch, mi ph n t
gm c c c thng tin sau: mssv (int), v hoten ( char hoten[30] ).
b. Li t k danh s ch ra m n h nh
c. Cho bi t tng s nt trong danh s ch li n k t, t t n h m l Reccount
( int Reccount(NODEPTR First) )
d. Th m 1 ph n t c ni dung info (mssv, hoten) v o sau ph n t c th t
th i trong danh s ch.
Ghi ch: - Th t theo qui c b t u l 1
- N u (i = 0) th m v o u danh s ch
N u i > Reccount(&First) th th m v o cui danh s ch.
e. In ra h t n ca sinh vi n c m do ta nh p v o.
f. Lo i b nt c m do ta nh p v o, trc khi xa hi l i "B n th t s mun
xa (Y/N) ? "
g. S p x p l i danh s ch theo th t m s gi m d n.
h.Ghi to n b danh s ch v o file t n 'DSSV.DAT'
i. N p danh s ch t file 'DSSV.DAT' v o danh s ch li n k t. N u trong danh
s ch li n k t c nt th xa t t c d li u hi n c trong danh s ch li n k t
trc khi a d li u t file v o.
2. Vi t chng tr nh t o mt danh s ch li n k t theo gi i thu t th m v o cui
danh s ch, mi nt cha mt s nguy n.
3. -Vi t h m t n Delete_Node xa nt c a ch p.
- Vi t mt h m lo i b t t c c c nt c ni dung x trong danh s ch li n k t
First.
4. Vi t h m Copy_List tr n danh s ch li n k t t o ra mt danh s ch li n k t
mi ging danh s ch li n k t c.
5. Ghp mt danh s ch li n k t c a ch u l First2 v o mt danh s ch li n
k t c a ch u l First1 ngay sau ph n t th i trong danh s ch li n k t
First1.
6. Vi t h m lc danh s ch li n k t tr nh trng hp c c nt trong danh s ch
li n k t b trng info.
7. o ngc vng li n k t ca mt danh s ch li n k t sao cho:
- First s ch n ph n t cui
- Ph n t u c li n k t l NULL.
K thu t l p tr nh
104
105
K thu t l p tr nh
CHNG 6
H nh 5.1. C y vi nt gc l A
- A l nt gc vi 3 c y con l n
lt c 3 nt gc ri ng l B, C, D
- Nt cha (ancestor)
Nt con (descendent)
A l nt cha ca B, C, D
G, H l nt con ca C
G, H khng quan h cha con
vi A
106
K thu t l p tr nh
V d 2 : Vi cng mt mn hc T, ta c th bi u di n d ng c y nh
sau :
T
CHNG I
I.1
I.2
CHNG II
II.1
II.1.1
II.2
CHNG III
II.3
II.1.2
CHNG I
I.1
I.2
CHNG II
II.1
II.1.1
II.1.2
II.2
II.3
H nh 5.2
CHNG III
2. Nt cha (Ancestor) : Nt ng tr n ca mt nt c gi l nt cha
C l nt cha ca G, H
Nt con (descendent) : Nt ng sau mt nt kh c c gi l nt con ca
nt .
Nt I, J, K l nt con ca nt E
3. Bc (degree) :
- B c ca nt l s c y con ca nt .
C c b c l 2, E c b c l 3 (H nh 5.1)
- B c ca c y l b c ln nh t ca c c nt trong c y.
C y trong h nh 5.1 c b c l 3.
C y b c n c gi l c y n ph n nh c y nh ph n, c y tam ph n.
4. Nt l v nt trung gian:
- Nt l l nt c b c b ng 0 (tc l khng c c y con n o) :
- Nt trung gian: l mt nt c b c kh c 0 v khng ph i l nt gc.
V d : Trong h nh 5.1, B, G, H, I, J, K, F l nt l
C, D, E l nt trung gian.
5. Mc ca nt (level) : Nt gc c mc l 1
Mc ca nt con = mc ca nt cha + 1
107
K thu t l p tr nh
V d : trong h nh 5.1,
A
c mc l 1
B, C, D
c mc l 2
G, H, E, F c mc l 3
I, J, K
c mc l 4
6. Chi u cao ca cy (height) : l mc ln nh t ca c c nt l trong c y.
V d : C y trong h nh 5.1 c chi u cao l 4
7. Th t ca cc nt (order of nodes) : N u c y c gi l c th t th
ph i m b o v tr ca c c nt con t tr i qua ph i, tc l n u thay i v tr ca
mt nt con b t k th ta c mt c y mi.
V d :
A
cay khac
P i = ( n i .i ) / n
i
108
K thu t l p tr nh
ROOT %1%2%3%4%5%6%7%8%9
3
4
6
5
7
A
B
D
C
E
X
Y
F
H
H nh 5.5. C y nh ph n ng
109
K thu t l p tr nh
C
E
D
I
F
K
H nh 5.6. C y nh ph n y.
Ghi ch: C y nh ph n y l c y nh ph n c s nt ti a mi mc.
- C y nh ph n t m ki m (Binary Search Tree): Mt c y nh ph n gi l c y
nh ph n t m ki m n u v ch n u i vi mi nt ca c y th kha ca mt nt
b t k ph i ln hn kha ca t t c c c nt trong c y con b n tr i ca n v ph i
nh hn kha ca t t c c c nt trong c y con b n ph i ca n.
V d :
k1 <k1 <k1
8
7
3
2
1
11
5
10
6
H nh 5.7. C y nh ph n t m ki m (BST)
12
110
K thu t l p tr nh
- C y nh ph n c n b ng (AVL): Mt c y nh ph n c gi l c y nh ph n
c n b ng n u v ch n u i vi mi nt ca c y th chi u cao ca c y con b n
tr i v chi u cao ca c y con b n ph i hn km nhau nhi u nh t l 1. (Theo
Adelson-Velski v Landis).
A
C
D
E
G
H nh 5.8. C y nh ph n c n b ng
- C y nh ph n c n b ng ho n to n: Mt c y nh ph n c gi l c y nh
ph n c n b ng ho n to n n u v ch n u i vi mi nt ca c y th s nt ca
c y con b n tr i v s nt ca c y con b n ph i hn km nhau nhi u nh t l 1.
A
B
E
C
D
E
H
H nh5.9. C y nh ph n c n b ng ho n to n
3. Cc php duy t cy nh phn (Traverse) : l qu tr nh i qua c c nt
ng mt l n. Khi duy t c y, ta thng dng 3 c ch duy t c b n sau :
' Preorder - Ti n t (NLR) duy t qua nt gc trc, sau i qua c y con
b n tr i l i p dng Preorder cho c y con b n tr i. Cui cng qua c y con b n
ph i, p dng Preorder cho c y con b n ph i.
V d : Theo c y nh ph n 5.4, ta c:
ROOT % 1 % 2 % 3 % 4 % 6 % 7 % 5 % 8 % 9
'Inorder - Trung t (LNR) : qua c y con b n tr i duy t trc (theo th t
LNR), sau th m nt gc. Cui cng qua c y con b n ph i (theo th t LNR)
V d: Theo c y nh ph n 5.4, ta c:
ROOT % 2 % 1 % 6 % 4 % 7 % 3 % 8 % 5 % 9
'Postorder - H u t (LRN) : qua c y con b n tr i duy t trc (theo th t
LRN), sau qua c y con b n ph i (theo th t LRN). Cui cng th m nt gc.
V d: Theo c y nh ph n 5.4, ta c:
ROOT % 2 % 6 % 7 % 4 % 8 % 9 % 5 % 3 % 1
K thu t l p tr nh
111
K thu t l p tr nh
112
K thu t l p tr nh
113
114
K thu t l p tr nh
Li gi h m: Empty(tree)
c. Hy b mt nt trong c y nh ph n BST (Remove):
Xa nt c kha l x trong c y nh ph n t m ki m sao cho sau khi xa th
c y nh ph n v n l c y nh ph n t m ki m. Ta c 3 trng hp :
- Trng hp 1: nt p c n xa l nt l . Vi c xa nt p ch n gi n l hy
nt p
p1
p1
p1
p1
p
rp
5
3
10
xoa nut p
15
12
20
15
20
12
10
xoa nut p
5
15
20
rp
3
2
18
18
20
25
25
115
K thu t l p tr nh
10
20
15
12
25
5
15
30
18
25
r
35
12
30
18
28
35
28
K thu t l p tr nh
116
117
K thu t l p tr nh
4
2
1
5
3
118
K thu t l p tr nh
III.1. nh ngh a:
- C y nh ph n t m ki m c n b ng (AVL) l c y nh ph n t m ki m m t i
t t c c c nt ca n chi u cao ca c y con b n tr i ca n v chi u cao ca c y
con b n tr i ch nh l ch nhau khng qu mt.
10
20
8
30
15
12
18
25
40
H nh 5.14. C y nh ph n t m ki m c n b ng
Lu : Vi c y AVL, vi c th m v o hay lo i b 1 nt tr n c y c th l m
c y m t c n b ng, khi ta ph i c n b ng l i c y. Tuy nhi n vi c c n b ng l i
tr n c y AVL ch x y ra ph m vi cc b b ng c ch xoay tr i ho c xoay ph i
mt v i nh nh c y con n n gi m thi u chi ph c n b ng.
- Ch s cn bng (balance factor) ca mt nt p tr n c y AVL= lh(p) - rh(p)
Trong :
lh (p) l chi u cao ca c y con b n tr i ca p
rh(p) l chi u cao ca c y con b n ph i ca p
Ta c c c trng hp sau:
bf(p) = 0 n u lh(p) = rh(p)
bf(p) = 1 n u lh(p) = rh(p) +1
bf(p) = -1 n u lh(p) = rh(p) -1
nt p c n b ng
nt p b l ch v tr i
nt p b l ch v ph i
-1
A
0
U1
0
U2
U3
U4
U5
0
U6
U7
B
U8
-1
0
BB
B
U9
0
U10 U11
U12
K thu t l p tr nh
119
tr U th c y s m t c n b ng. C c s tr n c y l ch s c n b ng ca c c nt
trc khi th m nt
III.2. Cc php ton tr n cy AVL:
* Khai bo: Ta khai b o c y AVL vi mi nt c th m trng bf cho bi t
ch s c n b ng ca nt .
struct nodetype
{
int key;
int info;
int bf;
struct nodetype *left, *right;
};
typedef struct nodetype *NODEPTR;
III.2.1. Th m nt:
- Ni dung: Th m 1 nt c kha x, ni dung a v o c y nh ph n t m ki m
c n b ng sao cho sau khi th m th c y nh ph n v n l c y nh ph n t m ki m c n
b ng.
- Gi i thu t:
& Th m nt v o c y nh b nh thng, ngh a l nt va th m s l nt l .
& T nh l i ch s c n b ng ca c c nt c b nh hng
& Ki m tra xem c y c b m t c n b ng hay khng? N u c y b m t c n
b ng th ta c n b ng l i c y.
* Trc h t, ta hy xt xem cc trng hp no khi th m nt lm cy b
mt cn bng.
Xem c y h nh 5.15, ta nh n th y:
- N u th m nt v o 1 trong 6 v tr B tr n c y th c y v n c n b ng.
- N u th m nt v o 1 trong c c v tr U1%U12 tr n c y th c y s m t
c n b ng.
+ Th m c c nt v o sau b n tr i ca nt A (cfA = 1) th c y s b
m t c n b ng v nt A ang b l ch tr i. l c c v tr U1, U2, U3, U4.
+ Th m c c nt v o sau b n ph i ca nt C (cfC = -1) th c y s b
m t c n b ng v nt C ang b l ch ph i. l c c v tr U9, U10, U11, U12.
Tm l i: Ta c 2 trng hp khi th m nt x vo cy AVL lm cy mt
cn bng, l th m cc nt vo sau b n tri ca nt c cf = 1, v th m cc nt
vo sau b n phi ca nt c cf = -1.
120
K thu t l p tr nh
T2
chieu
cao
n
T3
chieu
cao
n
2 ya
S 1
T1
chieu
sa u
n
T2
chieu
sa u
n
T3 xoay pha i
chieu quanh nut ya
sa u
n
T1
chieu
sa u
n
x
0
0 ya
T2
chieu
sa u
n
T3
chieu
sa u
n
121
K thu t l p tr nh
T3
chieu
sau
n
p
xoay trai
S 0
quanh nut S
T1
chieu
sau
n
T2-1
chieu
sau
n-1
x
2
2
T2-2
chieu
sau
n-1
ya
T3
chieu
sau
n
122
K thu t l p tr nh
S 0
xoay phai
quanh nut ya
T1
chieu
sau
n
-1
T2-1 T2-2
chieu chieu
sau
sau
n-1
n-1
ya
T3
chieu
sau
n
2.a
2.b
bfya = 1
bfs = 0
bfya = 1
bfs = 0
bfya = 2
bfs = 1
bfya = 2
bfs = -1
bfya = -1
bfs = 0
bfya = -1
bfs = 0
bfya = -2
bfs = -1
bfya = -2
bfs = 1
Cc php xoay cy v ch
s cn bng mi
Xoay phi quanh nt ya
bfs=0, bf ya = 0
Xoay kp
1. Xoay tr i quanh nt s
2. Xoay ph i quanh nt ya
bfs=0, bf ya = -1
Xoay tri quanh nt ya
bfs=0, bf ya = 0
Xoay kp
1. Xoay ph i quanh nt s
2. Xoay tr i quanh nt ya
bfs=0, bf ya = 1
- Gi i thu t:
! Php xoay tr i (Rotate_Left): xoay tr i c y nh ph n t m ki m c nt
gc l root, y u c u root ph i c nt con b n ph i (gi l nt p). Sau khi xoay
tr i th nt p tr th nh nt gc, nt gc c tr th nh nt con b n tr i ca nt gc
mi.
Php xoay tr i tr v con tr ch nt gc mi.
K thu t l p tr nh
123
K thu t l p tr nh
124
K thu t l p tr nh
125
q->right = NULL;
if(x < fp->info)
fp->left = q;
else
fp->right = q;
/* Hieu chinh chi so can bang cua tat ca cac nut giua ya va q, neu bi lech
ve phia trai thi chi so can bang cua tat ca cac nut giua ya va q deu la
1, neu bi lech ve phia phai thi chi so can bang cua tat ca cac nut giua
ya va q deu la -1 */
if(x < ya->info)
p = ya->left;
else
p = ya->right;
s = p; // s la con nut ya
while(p != q)
{
if(x < p->info)
{
p->bf = 1;
p = p->left;
}
else
{
p->bf = -1;
p = p->right;
}
}
// xac dinh huong lech
if(x < ya->info)
imbal = 1;
else
imbal = -1;
if(ya->bf == 0)
{
ya->bf = imbal;
return;
}
if(ya->bf != imbal)
{
K thu t l p tr nh
ya->bf = 0;
return;
}
if(s->bf == imbal) // Truong hop xoay don
{
if(imbal == 1) // xoay phai
p = Rotate_Right(ya);
else
// xoay trai
p = Rotate_Left(ya);
ya->bf = 0;
s->bf = 0;
}
else
// Truong hop xoay kep
{
if(imbal == 1) // xoay kep trai-phai
{
ya->left = Rotate_Left(s);
p = Rotate_Right(ya);
}
else
// xoay kep phai-trai {
ya->right = Rotate_Right(s);
p = Rotate_Left(ya);
}
if(p->bf == 0) // truong hop p la nut moi them vao
{
ya->bf = 0;
s->bf = 0;
}
else
if(p->bf == imbal)
{
ya->bf = -imbal;
s->bf = 0;
}
else
{
ya->bf = 0;
s->bf = imbal;
}
126
K thu t l p tr nh
p->bf = 0;
}
if(fya == NULL)
pavltree = p;
else
if(ya == fya->right)
fya->right = p;
else
fya->left = p;
}
* t o c y nh ph n t m ki m c n b ng, ta s dng gi i thu t sau:
void Create_AVLTree(NODEPTR &root)
{ int khoa, noidung;
char so[10];
NODEPTR p;
do
{ printf("Nhap khoa :");
gets(so) ;
khoa = atoi(so);
if (khoa !=0)
{ printf("Nhap noi dung :");
gets(so) ;
noidung = atoi(so);
if (root==NULL)
{ p = New_Node();
p->key = khoa;
p->info = noidung;
p->bf = 0 ;
p->left = NULL;
p->right = NULL;
root =p;
}
else Insert(root,khoa,noidung);
}
} while (khoa!=0);
// kha =0 th dng nh p
}
Ghi ch : t o c y nh ph n do bi n tree qu n l, ta gi:
Create_AVLTree(tree);
127
K thu t l p tr nh
128
K thu t l p tr nh
129
130
K thu t l p tr nh
B i t p:
1. Vi t l i c c chng tr nh duy t c y nh ph n theo phng ph p khng qui.
2. Vi t chng tr nh t o mt menu thc hi n c c mc sau:
a. T o c y nh ph n t m ki m vi ni dung l s nguy n (khng trng nhau).
b. Li t k c y nh ph n ra m n h nh theo th t NLR
c. m tng s nt, s nt l , v s nt trung gian ca c y.
d. T nh cao ca c y.
e. Lo i b nt c ni dung l x trong c y nh ph n BST.
f. Th m nt c ni dung x v o c y nh ph n BST sao cho sau khi th m th c y
v n l BST.
3. Cho mt c y nh ph n tree, h y vi t chng tr nh sao chp n th nh mt
c y mi tree2, vi kha, ni dung, v li n k t ging nh c y tree.
4. Vi t c c h m ki m tra xem c y nh ph n:
a. C ph i l c y nh ph n ng khng.
b. C ph i l c y nh ph n y khng.
5. Vi t h m ki m tra nt x v y c tr n c y hay khng, n u c c x l n y tr n
c y th x c nh nt gc ca c y con nh nh t c cha x v y.
6. Cho mt c y bi u thc, h y vi t h m Calculate (NODEPTR root) t nh gi
tr ca c y bi u thc , bi t r ng c c to n t c dng trong bi u thc l :
+ - * / ^ % !
7. V l i h nh nh c y nh ph n t m ki m, c y nh ph n t m ki m c n b ng n u
c c nt th m v o c y theo th t nh sau:
8
20
11
30
18
131
K thu t l p tr nh
MC LC
CHNG i I CNG V LP TRNH --------------------------------------------------- 1
I. Khi nim thut ton--------------------------------------------------------------------------- 1
I.1. Kh i ni m --------------------------------------------------------------------------------------------------- 1
I.2. C c t nh ch t c trng ca thu t to n ----------------------------------------------------- 1
I.3. Ph n lo i ----------------------------------------------------------------------------------------------------- 1
II. M t thut ton bng lu ---------------------------------------------------- 1
II.1. Lu ------------------------------------------------------------------------------------------------------ 1
II.2. C c k hi u tr n lu --------------------------------------------------------------------------- 1
II.3. Mt s v d biu di n thu t to n b ng lu ---------------------------------------- 2
III. CC NGN NG LP TRNH & CHNG TRNH DCH -------------------- 5
III.1. Ngn ng l p tr nh ---------------------------------------------------------------------------------- 5
III.2. Chng tr nh dch ------------------------------------------------------------------------------------ 6
CHNG 2 LM QUEN VI NGN NG C --------------------------------------------- 7
* Gii thiu ngn ng C ------------------------------------------------------------------------- 7
I. CC KHI NIM C BN---------------------------------------------------------------------------- 7
I.1. C u trc c b n ca mt chng tr nh C -------------------------------------------------- 7
I.2. Ki u d li u c bn ---------------------------------------------------------------------------------- 13
I.3. Bi n ----------------------------------------------------------------------------------------------------------- 14
I.4 H ng----------------------------------------------------------------------------------------------------------- 18
I.5. Php to n -------------------------------------------------------------------------------------------------- 20
* S chuy n ki u----------------------------------------------------------------------------------------- 29
* Mc u ti n ca c c php to n ---------------------------------------------------------- 29
I.6. Chui--------------------------------------------------------------------------------------------------------- 30
II. Cc cu trc iu khin trong C ---------------------------------------------- 33
II.1 C u trc tu n t (Sequence) ------------------------------------------------------------------ 33
II.2. C u trc chn ------------------------------------------------------------------------------------------ 34
II.2.1. L nh if else -------------------------------------------------------------------------------------- 34
II.2.2. L nh switch_case ---------------------------------------------------------------------------- 35
II.3. C u trc l p --------------------------------------------------------------------------------------------- 37
II.3.1. L nh while --------------------------------------------------------------------------------------- 37
II.3.2. L nh do while ---------------------------------------------------------------------------------- 38
II.3.3. L nh for-------------------------------------------------------------------------------------------- 39
* Ph t bi u break, continue, goto -------------------------------------------------------------- 40
B i t p ---------------------------------------------------------------------------------------------------------------- 41
K thu t l p tr nh
132
K thu t l p tr nh
133
1. K thu t l p tr nh Turbo C
1992
2. C u trc d li u ng dng
v c i t b ng C
1999
JohnBentley