You are on page 1of 134

Smith Nguyen Studio.

K thu t l p tr nh 1

CHNG i

I CNG V LP TRNH

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

Smith Nguyen Studio.


K thu t l p tr nh 2

Khi t nh to n

Khi i u ki n Chng tr nh con Mi t n

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 Dng gi chng tr nh con Ch hng truy n thng tin, li n h c c khi

II.3. Mt s v d bi u di n thut ton bng lu II.3.1. Thut ton khng phn nhnh: V d 1: T nh A = x2 + y2
Begin Nhap (x,y) A = x2 + y2 Xuat (A) End

V d 2 : T nh S =

Ax + By + C x +y
2 2

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

Nha p (A, B, C, x,y) S = (Ax + By + C) / SQRT (x*x + y*y) Xuat S End

Smith Nguyen Studio.


K thu t l p tr nh 3

II.3.2. Thut ton c phn nhnh: V d 1: T m gi tr max ca ba s thc a,b,c


Begin Nhap (a, b, c) S

a>b Max = a

Max = b

Max < c Max = c Xuat (Max) End

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


Begin Nhap (a, b) S

a=0 b=0

Xuat (-b/a)

Xuat (PTVN)

Xuat (PTV)

End

Smith Nguyen Studio.


K thu t l p tr nh 4

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


Begin Nhap (a, b, c)

a=0 S

PTB1 (b, c)

Delta = b*b - 4*a*c

Delta < 0 S Delta = 0 S

Xuat (PTVN)

Xuat (-b / (2*a))

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

II.3.3. Thut ton c chu tr nh: Thu t to n c chu tr nh vi c c bc l p x c nh thng c th hi n b ng lu sau :


i = gia tr ban au Le nh S; Ta ng i i <= n S

vi n l gi tr k t thc.

Smith Nguyen Studio.


K thu t l p tr nh 5
n

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

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

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

Smith Nguyen Studio.


K thu t l p tr nh 6

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

Chng trnh nguon

Trnh bie n dch

Chng trnh ch

May tnh thc hien

Ket qua

H nh I.1. Chng tr nh thc thi theo c ch dch ca tr nh bi n dch III.2.2. Tr nh thng dch: qu tr nh dch v thc thi x y ra cng 1 thi gian, dch n u thi h nh l nh n .
Chng trnh nguon Chng trnh tho ng dch Ket qua

D lieu

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

Smith Nguyen Studio.


K thu t l p tr nh 7

CHNG 2

LM QUEN VI NGN NG C

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

Smith Nguyen Studio.


K thu t l p tr nh 8

[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*/

Smith Nguyen Studio.


K thu t l p tr nh 9

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.

Smith Nguyen Studio.


K thu t l p tr nh 10

- Nhng k t c bi t : K t \n \t \b \r \f \a \\ \ \ \xdd \ddd Tc dng 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 M ASCII 10 9 8 13 12 7 92 39 34

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

Type : nh ki u ca tham s theo sau chui-nhd ng l y gi tr ra Type d,i u o x X f e E g,G c s % ngh a S nguy n c s 10 S nguy n c s 10 khng d u S nguy n c s 8 S nguy n c s 16, ch thng(a,b,...,f) S nguy n c s 16, ch in (A,B,...,F) S thc d ng [-]dddd.ddd... S thc d ng [-]d.ddd e[+/-]ddd S thc d ng [-]d.ddd E[+/-]ddd S thc d ng e(E) hay f ty theo ch nh x c K t Chui k t t n cng b ng \0 D u % c n in

Smith Nguyen Studio.


K thu t l p tr nh 11

Flag : D ng i u ch nh Flag n u khng c + # ngh a 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 n 0n * Prec khng c 0 n * Cc ch b sung : F N h l V d 1: char Tham s l con tr xa XXXX:YYYY Tham s l con tr g n YYYY Tham s l short int Tham s l long int (d,i,o,u,x,X) double (e,E,f,g,G) c=A; ngh a 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 ngh a 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

char s[]=Blue moon! ;

Smith Nguyen Studio.


K thu t l p tr nh 12

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

Thng s tng ng c c c c s s s s int float i = 123;

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

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

x = 0.123456789; Xut 123 00123 123 7b { 0x7b 0.12346 1.23457e-01 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

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

Thng s tng ng i i i i i i x x

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); }

Smith Nguyen Studio.


K thu t l p tr nh 13

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 char unsigned char unsigned short enum short int int unsigned int long unsigned long float double 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 K t K t khng d u S nguy n ng n khng d u S nguy n c d u S nguy n c d u S nguy n c d u S nguy n khng d u S nguy n d i c d u S nguy n d i khng d u S thc ch nh x c n S thc ch nh x c kp ngh a K ch thc 1 byte 1 byte 2 bytes 2 bytes 2 bytes 2 bytes 2 bytes 4 bytes 4 bytes 4 bytes 8 bytes Phm vi -128 127 0255 065535 -3276832767 -3276832767 -3276832767 0 65535
-2147483648 2147483647

04294967295 3.4 E-383.4 E+38 1.7 E-308 1.7 E+308

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

Smith Nguyen Studio.


K thu t l p tr nh 14

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 I.3.3. Hm nhp d li u chun a) Hm scanf() C php: scanf(chui-nhd ng,i ch thams1, i ch thams2,...) - Chui-nhd ng ca scanf() gm c ba lo i k t : + Chui i u khi n + K t tr ng + K t kh c tr ng ! Chui i u khi n c d ng : %[width][h/l] type t nbi n = gi tr ; t nbi n1 [,tenbi n2 ...] ;

Smith Nguyen Studio.


K thu t l p tr nh 15

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.

Smith Nguyen Studio.


K thu t l p tr nh 16

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 V d 6: int n; bi n n &n; a ch ca n printf(tr = %d, a ch = %d,n,&n); b) Hm getch():

H m getch() dng nh n mt k t do ta nh p tr n b n ph m m khng c n g Enter vi c ph p : ch = getch(); ch = getche(); 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; 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

Smith Nguyen Studio.


K thu t l p tr nh 17

printf("\nBan nhap vao 1 chu cai tu a den e: "); while ((ch=getche()) != 'd') { printf("\nXin loi, %c la sai roi",ch); printf("\n Thu lai lan nua. \n"); } } Lu : H m getch() cn cho php ta nh p v o 1 k t m rng nh c c ph m F1, F2,.., c c ph m di chuy n cursor. C c ph m n y lun c 2 bytes: byte th nh t b ng 0, cn byte 2 l m scancode ca ph m . nh n bi t ta g ph m k t hay ph m m rng, ta c chng tr nh sau: void main() { int c; int extended = 0; c = getch(); if (!c) extended = getch(); if (extended) printf("The character is extended\n"); else printf("The character isn't extended\n"); } Ph m F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 Home " # $ M scancode 59 60 61 62 63 64 65 66 67 68 71 72 80 75

Smith Nguyen Studio.


K thu t l p tr nh 18

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. int D ng V d nnnn -nnnn unsigned nnnnU/u long nnnnL/l -nnnnl/L h 8 0nnnn h 16 0xnnnn float/double nnnn.nnnn nnnn.nnnE/ennn 123.654 123.234E-4

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

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

Smith Nguyen Studio.


K thu t l p tr nh 19

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

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

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

Smith Nguyen Studio.


K thu t l p tr nh 20

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

V d 3 : (n+3) = 4+z; (khng hp l v b n tr i l bi u thc) = c +o; (khng hp l v b n tr i l h ng) I.5.2. Cc php ton s hc : a. Php ton hai ton hng : +, -, *, /, % Php ton +, -, * Ki u ton hng 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

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

Smith Nguyen Studio.


K thu t l p tr nh 21

{ 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; a 4 4 5 6 5 4 4 b 6 6 6 6 6 6 6 n 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.

Smith Nguyen Studio.


K thu t l p tr nh 22

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 : < > >= <= != == 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(); } : : : : : : nh hn ln hn ln hn ho c b ng nh hn ho c b ng kh c b ng

Smith Nguyen Studio.


K thu t l p tr nh 23

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 true false !x false true x true true false false x y x || y y true false true false x && y true false false false

V if V

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;

Smith Nguyen Studio.


K thu t l p tr nh 24

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

Smith Nguyen Studio.


K thu t l p tr nh 25

B ng ch n tr: Bit A 0 0 1 1 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 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

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); }

Smith Nguyen Studio.


K thu t l p tr nh 26

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

dch sang tr i (nh n 2) dch sang ph i (chia 2)


0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0

V d 5: num = 201 (0x00c9)

num << 2 : 0

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

Smith Nguyen Studio.


K thu t l p tr nh 27

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 1 1 0 0 0 1 0 1 0 0 0 1 1 1 0 1 0 1 1

// 9A2E hexa 1 1 1 0 1 0 1 1

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(); }

Smith Nguyen Studio.


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 ); } }

Smith Nguyen Studio.


K thu t l p tr nh 29

} 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 1 2 3 4 5 Php ton () [] ! ~ ++ - - (type) * & size of * + << / >> % Th t k t hp

Smith Nguyen Studio.


K thu t l p tr nh 30

6 7 8 9 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

Smith Nguyen Studio.


K thu t l p tr nh 31

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

Smith Nguyen Studio.


K thu t l p tr nh 32

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).

Smith Nguyen Studio.


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

Smith Nguyen Studio.


K thu t l p tr nh 34

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

YES

S1

if (k) S1; else S2;


K
NO YES

S1

S2

Ch : C c l nh if else lng nhau if (k1) S1; else if (k2) S2; else if (k3) S3; else S4; V d 1: T m max(a,b,c)

Smith Nguyen Studio.


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()

Smith Nguyen Studio.


K thu t l p tr nh 36

{ 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() {

Smith Nguyen Studio.


K thu t l p tr nh 37

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

YES

Ch : Trong ph n th n l nh ph i c bi n i u khi n vng l p. V d 1: Vi t chng tr nh in ra b ng m ASCII void main () { int n=0; while (n <= 255)

Smith Nguyen Studio.


K thu t l p tr nh 38

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

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

Smith Nguyen Studio.


K thu t l p tr nh 39

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

Smith Nguyen Studio.


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

Smith Nguyen Studio.


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 )

Smith Nguyen Studio.


K thu t l p tr nh 42

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

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

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

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

Smith Nguyen Studio.


K thu t l p tr nh 43

D=

ax+by = c ax+by = c

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

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

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

Smith Nguyen Studio.


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

Smith Nguyen Studio.


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(); }

Smith Nguyen Studio.


K thu t l p tr nh 46

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

Smith Nguyen Studio.


K thu t l p tr nh 47

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

Smith Nguyen Studio.


K thu t l p tr nh 48

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

Smith Nguyen Studio.


K thu t l p tr nh 49

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()

Smith Nguyen Studio.


K thu t l p tr nh 50

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

Smith Nguyen Studio.


K thu t l p tr nh 51

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 #define t n h ng gi tr 3.14 100 H t Gi " PI MAX THONGBAO khoangtrang

b. nh ngh a Macro: 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)

Smith Nguyen Studio.


K thu t l p tr nh 52

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

{ {

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

Smith Nguyen Studio.


K thu t l p tr nh 53

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

1 Fn-1 + Fn-2

; n =0,1 ; n>1

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

Smith Nguyen Studio.


K thu t l p tr nh 54

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

Gi s ta c c ch gi h m trong mt chng tr nh C nh sau: main() A() B() C() D() { ...... {.....; {.....; {......; {........; A(); C(); D(); D(); ........; .....; ....; } .....; } B(); D(); } ....; } } H nh sau y cho ta th y s chi m dng b nh stack khi ch y chng tr nh C nh m t tr n. b nh Stack C A M D C A M C A M D A M D 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.

A M

A M

A M

B M

B M

Smith Nguyen Studio.


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

Smith Nguyen Studio.


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

Smith Nguyen Studio.


K thu t l p tr nh 57

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

Smith Nguyen Studio.


K thu t l p tr nh 58

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

// m file mi ghi

Smith Nguyen Studio.


K thu t l p tr nh 59

{ printf("Viec mo file co loi\n"); exit(0); } while ((ch=getc(fptr)) !=EOF) printf("%c",ch); fclose(fptr); }

Smith Nguyen Studio.


K thu t l p tr nh 60

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


#include <stdio.h>

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

Smith Nguyen Studio.


K thu t l p tr nh 61

#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(); }

Smith Nguyen Studio.


K thu t l p tr nh 62

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

Smith Nguyen Studio.


K thu t l p tr nh 63

V.2.3. ng file: fclose (fptr) V.2.4. c/ghi file: H m fread : c s m u tin(c u trc) trong file fptr v o <bi n c u trc>. fread (& bi n cu trc, sizeof (bi n cu trc) , s cu trc, fptr); H m fread tr v s c u trc c c H m fwrite ghi d li u trong <bi n c u trc> v o file fptr. fwrite (&bi n cu trc, sizeof (bi n cu trc) , s cu trc, fptr); H m fwrite tr v s c u trc ghi c l n file Ch : - ki m tra vi c c file ta ki m tra s c u trc c c. N u s c u trc tr v b ng 0 m ta c n c l 1 c u trc th i u chng t h t file. * Ghi mt mng cu trc l n file fwrite(t nm ng, sizeof (t nm ng), 1, fptr); for (i= 0; i< n; i++) fwrite (&t nm ng[i], sizeof (t nm ng[i] , 1, fptr); V d 1: Chng tr nh ghi l n file nh ph n #include <stdio.h> #include <stdlib.h> #include <string.h> void main() { struct hocvien { char hoten[30]; int tuoi; } hv; FILE *fptr; char tenfile[67]; char tuoi[3]; printf("Nhap ten file :"); gets(tenfile); if ((fptr=fopen(tenfile,"wb")) == NULL) { printf ("Khong the tao file\n"); exit(0); } do { printf("Nhap ho ten hoc vien :");

// m file nh ph n ghi

Smith Nguyen Studio.


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;

Smith Nguyen Studio.


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)

Smith Nguyen Studio.


K thu t l p tr nh 66

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

Smith Nguyen Studio.


K thu t l p tr nh 67

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

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

Smith Nguyen Studio.


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

Smith Nguyen Studio.


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.

Smith Nguyen Studio.


K thu t l p tr nh 70

CHNG 3 CC THUT TON TRN CU TRC D LIU MNG

I. Mng khng sp xp v thut ton tm kim trn mng cha c th t I.1. Mt s khi ni m v mng: I.1.1. nh ngh a: M ng l 1 d y c c ph n t c cng ki u d li u c s p x p li n ti p nhau trong b nh 0100 0102 0104 1 2 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 M ng n ph n t

int int int bi n

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

#define max 100 int M[max] ; V d 2: Khai b o 1 danh s ch h t n hc vi n ca 1 lp hc char dshv[50][30]; // dshv c th cha ti a h t n 50 hc vi n, // chi u d i h t n mi hc vi n ti a l 30 k t Khai b o m ng 2 chi u

C php:

Smith Nguyen Studio.


K thu t l p tr nh 71

Ki u_DL

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

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

int

Smith Nguyen Studio.


K thu t l p tr nh 72

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

Smith Nguyen Studio.


K thu t l p tr nh 73

{ 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) ;

Smith Nguyen Studio.


K thu t l p tr nh 74

} 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 1 12 26 33 35 29 2 12 19 26 33 35 3 12 19 26 29 33 4 12 19 26 29 32 5 12 19 26 29 32 6 12 19 26 29 32

Smith Nguyen Studio.


K thu t l p tr nh 75

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

Smith Nguyen Studio.


K thu t l p tr nh 76

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

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

Smith Nguyen Studio.


K thu t l p tr nh 77

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

Smith Nguyen Studio.


K thu t l p tr nh 78

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

Smith Nguyen Studio.


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

Smith Nguyen Studio.


K thu t l p tr nh 80

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

Smith Nguyen Studio.


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

Smith Nguyen Studio.


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); }

Smith Nguyen Studio.


K thu t l p tr nh 83

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, bi t D [i,j] = A[i , k ] * B[ k , j ]
k 1 n

; i, j = 1..n

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

Smith Nguyen Studio.


K thu t l p tr nh 84

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

Smith Nguyen Studio.


K thu t l p tr nh 85

CHNG 4 I. NH NGHA

CON TR (POINTER)

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 py 950 952

*px = *px + *py; 14 10

950 952

Smith Nguyen Studio.


K thu t l p tr nh 86

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

Smith Nguyen Studio.


K thu t l p tr nh 87

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

Smith Nguyen Studio.


K thu t l p tr nh 88

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

; p1 = "BCD"

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

Smith Nguyen Studio.


K thu t l p tr nh 89

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

Smith Nguyen Studio.


K thu t l p tr nh 90

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

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

Smith Nguyen Studio.


K thu t l p tr nh 91

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 () 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' ) ; V d:

Smith Nguyen Studio.


K thu t l p tr nh 92

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) ; puts (++p) ; // ABCD // 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 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 ++; 1 B 2 C 3 D 4 E 5 F \0

Smith Nguyen Studio.


K thu t l p tr nh 93

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 ++; }

Smith Nguyen Studio.


K thu t l p tr nh 94

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

Smith Nguyen Studio.


K thu t l p tr nh 95

n u khi t o b ng m ng con tr nh tr n th lng nh s c p ph t va cho tng ph n t ca m ng. ds[0] ds[1] ds[2] ds[3] ds[4] 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

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

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

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

Smith Nguyen Studio.


K thu t l p tr nh 96

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

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

Smith Nguyen Studio.


K thu t l p tr nh 97

CHNG 5

CC THUT TON TRN CU TRC DANH SCH LIN KT (LINKED LIST)

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

Nil

First

1 2

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

Smith Nguyen Studio.


K thu t l p tr nh 98

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

Smith Nguyen Studio.


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

Smith Nguyen Studio.


K thu t l p tr nh 100

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

Smith Nguyen Studio.


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;

Smith Nguyen Studio.


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

Smith Nguyen Studio.


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.

Smith Nguyen Studio.


K thu t l p tr nh 104

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

Smith Nguyen Studio.


K thu t l p tr nh 105

CHNG 6

cc thut ton trn cu trc cY (Tree)

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

- 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

H nh 5.1. C y vi nt gc l A

Smith Nguyen Studio.


K thu t l p tr nh 106

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 CHNG II CHNG III

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

I.1

I.2

II.1

II.2

II.3

II.1.1

II.1.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

H nh 5.2

Smith Nguyen Studio.


K thu t l p tr nh 107

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

A
cay khac

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

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

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

Smith Nguyen Studio.


K thu t l p tr nh 108

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

1 2 4 6 7 8 3

Root

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

Nh v y khi duy t l i c y theo mc t ng d n v t tr i qua ph i ta s l i c c th t c c nt nh tr n.

5 9

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

A B D G E Y X H C F I

H nh 5.5. C y nh ph n ng

Smith Nguyen Studio.


K thu t l p tr nh 109

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


A B D H I J E K L F M N C G O

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 :
8 7 3 2 1 4 5 6 10 9 11 12

k1 <k1 <k1

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

Smith Nguyen Studio.


K thu t l p tr nh 110

- 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

B D G E H

C F I J

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 H D E H

C F I

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

Smith Nguyen Studio.


K thu t l p tr nh 111

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

Smith Nguyen Studio.


K thu t l p tr nh 112

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

Smith Nguyen Studio.


K thu t l p tr nh 113

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

Smith Nguyen Studio.


K thu t l p tr nh 114

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

p1

p1

- Trng hp 2: Nt p c n xa c 1 c y con, th ta cho rp ch ti nt p. Sau , ta t o li n k t t nt cha ca p ti nt con ca rp, cui cng hy nt p.


p rp 3 2 4 5 12 10 15 20 2 xoa nut p 3 4 12 10 15 20

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


10 5 3 2 4 rp 20 18 25 2 3 4 18 25 15 p xoa nut p 5 10 20

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

Smith Nguyen Studio.


K thu t l p tr nh 115

v kha ca nt r v o nt m rp ang ch ti. Ta t o li n k t th ch hp bt nt rp ra khi c y nh ph n v cui cng xa nt rp.


10 5 15 12 18 r nut trai nhat cua ca y con ben phai 25 28 20 30 35 12 p 5 15 18 28 10 25 30 35

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

Smith Nguyen Studio.


K thu t l p tr nh 116

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

Smith Nguyen Studio.


K thu t l p tr nh 117

4 2 1 3 5 6

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

Smith Nguyen Studio.


K thu t l p tr nh 118

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

6 8 12 15

20 30 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
-1 A 0 0 U1 U2 U3 0 U4 U5 B 1 0 B 0 U6 U7 B 1 0 0 U8 B BB 0 B U9 0 U10 U11 0 -1 C 0 0 U12

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

H nh 5.15. Minh ha c c v tr c th th m nt l v o c y AVL, khi th m nt l v o 1 trong c c v tr B th c y v n c n b ng, khi th m nt l v o 1 trong c c v

Smith Nguyen Studio.


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.

Smith Nguyen Studio.


K thu t l p tr nh 120

* Cn bng li cy: Gi ya l nt trc g n nh t b m t c n b ng khi th m nt x v o c y AVL. Do c 2 trng hp b m t c n b ng khi th m nt x l tng t nhau n n ta ch xt trng hp bfya=1 v nt l th m v o l nt sau b n tr i ca nt ya. 1 ya
S 0 T1 chieu cao n T2 chieu cao n T3 chieu cao n

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

2 ya
S 1 T1 chieu sa u n x T2 chieu sa u n T3 xoay pha i chieu quanh nut ya sa u n T1 chieu sa u n x

0 0 ya
T2 chieu sa u n T3 chieu sa u n

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

Smith Nguyen Studio.


K thu t l p tr nh 121

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

Cy AVL sau khi thm nt x

p xoay trai quanh nut S T1 chieu sau n T2-1 chieu sau n-1 x S 0

2 2
T2-2 chieu sau n-1

Smith Nguyen Studio.


K thu t l p tr nh 122

0
S 0 xoay phai quanh nut ya T1 chieu sau n

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

ya T3 chieu sau n

H nh 5.18. Xoay kp (xoay tr i quanh nt s, xoay ph i quanh nt ya) c n b ng l i c y. B ng sau y ph n bi t c c trng hp c y b m t c n b ng khi th m nt v c c php xoay c y tng ng c n b ng l i c y: Trng hp Trc khi th m Sau khi th m nt x nt x 1.a 1.b 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

2.a 2.b

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

bfya = -2 bfs = -1 bfya = -2 bfs = 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.

Smith Nguyen Studio.


K thu t l p tr nh 123

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

Smith Nguyen Studio.


K thu t l p tr nh 124

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

Smith Nguyen Studio.


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) {

Smith Nguyen Studio.


K thu t l p tr nh 126

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

Smith Nguyen Studio.


K thu t l p tr nh 127

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

Smith Nguyen Studio.


K thu t l p tr nh 128

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

Smith Nguyen Studio.


K thu t l p tr nh 129

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

Smith Nguyen Studio.


K thu t l p tr nh 130

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 3 5 2 20 11 30 9 18 4 8. Nh p v o 1 bi u thc s hc, chuy n bi u thc th nh c y nh ph n, nt gc l to n t, nt l l c c to n h ng, bi t r ng c c to n t c dng trong bi u thc l : + - * / ^ % !

Smith Nguyen Studio.


K thu t l p tr nh 131

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

Smith Nguyen Studio.


K thu t l p tr nh 132

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

Smith Nguyen Studio.


K thu t l p tr nh 133

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

Smith Nguyen Studio.

TI LIU THAM KHO

1. K thu t l p tr nh Turbo C

Phc, Nguy n Phi Kh, T Minh Ch u, Nguy n nh T Nguy n Hng Chng JohnBentley

1992

2. C u trc d li u ng dng v c i t b ng C 3. Nhng vi n ngc K thu t l p tr nh

1999

You might also like