134
Kü thuËt lËp tr×nh 1 CH¦¥NG i CH¦¥NG i CH¦¥NG i CH¦¥NG i §¹I C¦¥NG VÒ LËP TR×NH §¹I C¦¥NG VÒ LËP TR×NH §¹I C¦¥NG VÒ LËP TR×NH §¹I C¦¥NG VÒ LËP TR×NH I. I. I. I. Kh¸i niÖm thuËt to¸n Kh¸i niÖm thuËt to¸n Kh¸i niÖm thuËt to¸n Kh¸i niÖm thuËt to¸n : I.1. I.1. I.1. I.1. Kh¸i niÖm Kh¸i niÖm Kh¸i niÖm Kh¸i niÖm : : : : ThuËt to¸n lμ tËp hîp c¸c quy t¾c cã logic nh»m gi¶i mét líp bμi to¸n nμo ®ã ®Ó ®−îc mét kÕt qu¶ x¸c ®Þnh. I.2. I.2. I.2. I.2. C¸c tÝnh chÊt ®Æc tr−ng cña thuËt to¸n C¸c tÝnh chÊt ®Æc tr−ng cña thuËt to¸n C¸c tÝnh chÊt ®Æc tr−ng cña thuËt to¸n C¸c tÝnh chÊt ®Æc tr−ng cña thuËt to¸n : : : I.2.1. TÝnh tæng qu¸t I.2.1. TÝnh tæng qu¸t I.2.1. TÝnh tæng qu¸t I.2.1. TÝnh tæng qu¸t : : : ThuËt to¸n ®−îc lËp kh«ng ph¶i chØ ®Ó gi¶i mét bμi to¸n cô thÓ mμ th«i mμ cßn ph¶i gi¶i ®−îc mét líp c¸c bμi to¸n cã d¹ng t−¬ng tù. I.2.2. TÝnh giíi h¹n : I.2.2. TÝnh giíi h¹n : I.2.2. TÝnh giíi h¹n : I.2.2. TÝnh giíi h¹n : ThuËt to¸n gi¶i mét bμi to¸n ph¶i ®−îc thùc hiÖn qua mét sè giíi h¹n c¸c thao t¸c ®Ó ®¹t ®Õn kÕt qu¶. I.2.3. I.2.3. I.2.3. I.2.3. TÝnh duy nhÊt : TÝnh duy nhÊt : TÝnh duy nhÊt : TÝnh duy nhÊt : Toμn bé qu¸ tr×nh biÕn ®æi, còng nh− trËt tù thùc hiÖn ph¶i ®−îc x¸c ®Þnh vμ lμ duy nhÊt. Nh− vËy khi dïng thuËt to¸n cïng mét d÷ liÖu ban ®Çu ph¶i cho cïng mét kÕt qu¶. I.3. I.3. I.3. I.3. Ph©n lo¹i: Ph©n lo¹i: Ph©n lo¹i: Ph©n lo¹i: Theo cÊu tróc, ta cã thÓ ph©n thμnh ba lo¹i thuËt to¸n c¬ b¶n sau : - ThuËt to¸n kh«ng ph©n nh¸nh. - ThuËt to¸n cã ph©n nh¸nh. - ThuËt to¸n theo chu tr×nh cã b−íc lÆp x¸c ®Þnh vμ cã b−íc lÆp kh«ng x¸c ®Þnh. II. II. II. II. M« t¶ thuËt to¸n b»ng l−u ®å M« t¶ thuËt to¸n b»ng l−u ®å M« t¶ thuËt to¸n b»ng l−u ®å M« t¶ thuËt to¸n b»ng l−u ®å : II.1. II.1. II.1. II.1. L−u ®å L−u ®å L−u ®å L−u ®å : : : L−u ®å lμ mét d¹ng ®å thÞ dïng ®Ó m« t¶ qu¸ tr×nh tÝnh to¸n mét c¸ch cã hÖ thèng. Ng−êi ta th−êng thÓ hiÖn thuËt to¸n b»ng l−u ®å. II.2. II.2. II.2. II.2. C¸c ký hiÖu trªn l−u ®å C¸c ký hiÖu trªn l−u ®å C¸c ký hiÖu trªn l−u ®å C¸c ký hiÖu trªn l−u ®å : : : Tªn khèi Tªn khèi Tªn khèi Tªn khèi Ký hiÖu Ký hiÖu Ký hiÖu Ký hiÖu ý nghÜa nghÜa nghÜa nghÜa Khèi më ®Çu hoÆc kÕt thóc Dïng më ®Çu hoÆc kÕt thóc ch−¬ng tr×nh Khèi vμo ra §−a sè liÖu vμo hoÆc in kÕt qu¶

Ky Thuat viet lap trinh

Embed Size (px)

DESCRIPTION

ky thuat c

Citation preview

Page 1: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 1

CH¦¥NG i CH¦¥NG i CH¦¥NG i CH¦¥NG i §¹I C¦¥NG VÒ LËP TR×NH§¹I C¦¥NG VÒ LËP TR×NH§¹I C¦¥NG VÒ LËP TR×NH§¹I C¦¥NG VÒ LËP TR×NH

I. I. I. I. Kh¸i niÖm thuËt to¸nKh¸i niÖm thuËt to¸nKh¸i niÖm thuËt to¸nKh¸i niÖm thuËt to¸n::::

I.1. I.1. I.1. I.1. Kh¸i niÖmKh¸i niÖmKh¸i niÖmKh¸i niÖm: : : :

ThuËt to¸n lµ tËp hîp c¸c quy t¾c cã logic nh»m gi¶i mét líp bµi to¸n nµo ®ã ®Ó ®−îc mét kÕt qu¶ x¸c ®Þnh.

I.2.I.2.I.2.I.2. C¸c tÝnh chÊt ®Æc tr−ng cña thuËt to¸nC¸c tÝnh chÊt ®Æc tr−ng cña thuËt to¸nC¸c tÝnh chÊt ®Æc tr−ng cña thuËt to¸nC¸c tÝnh chÊt ®Æc tr−ng cña thuËt to¸n ::::

I.2.1. TÝnh tæng qu¸tI.2.1. TÝnh tæng qu¸tI.2.1. TÝnh tæng qu¸tI.2.1. TÝnh tæng qu¸t ::::

ThuËt to¸n ®−îc lËp kh«ng ph¶i chØ ®Ó gi¶i mét bµi to¸n cô thÓ mµ th«i mµ cßn ph¶i gi¶i ®−îc mét líp c¸c bµi to¸n cã d¹ng t−¬ng tù.

I.2.2. TÝnh giíi h¹n :I.2.2. TÝnh giíi h¹n :I.2.2. TÝnh giíi h¹n :I.2.2. TÝnh giíi h¹n :

ThuËt to¸n gi¶i mét bµi to¸n ph¶i ®−îc thùc hiÖn qua mét sè giíi h¹n c¸c thao t¸c ®Ó ®¹t ®Õn kÕt qu¶.

I.2.3.I.2.3.I.2.3.I.2.3. TÝnh duy nhÊt :TÝnh duy nhÊt :TÝnh duy nhÊt :TÝnh duy nhÊt :

Toµn bé qu¸ tr×nh biÕn ®æi, còng nh− trËt tù thùc hiÖn ph¶i ®−îc x¸c ®Þnh vµ lµ duy nhÊt. Nh− vËy khi dïng thuËt to¸n cïng mét d÷ liÖu ban ®Çu ph¶i cho cïng mét kÕt qu¶.

I.3. I.3. I.3. I.3. Ph©n lo¹i:Ph©n lo¹i:Ph©n lo¹i:Ph©n lo¹i:

Theo cÊu tróc, ta cã thÓ ph©n thµnh ba lo¹i thuËt to¸n c¬ b¶n sau :

- ThuËt to¸n kh«ng ph©n nh¸nh. - ThuËt to¸n cã ph©n nh¸nh. - ThuËt to¸n theo chu tr×nh cã b−íc lÆp x¸c ®Þnh vµ cã b−íc lÆp kh«ng x¸c ®Þnh.

II. II. II. II. M« t¶ thuËt to¸n b»ng l−u ®åM« t¶ thuËt to¸n b»ng l−u ®åM« t¶ thuËt to¸n b»ng l−u ®åM« t¶ thuËt to¸n b»ng l−u ®å ::::

II.1.II.1.II.1.II.1. L−u ®åL−u ®åL−u ®åL−u ®å ::::

L−u ®å lµ mét d¹ng ®å thÞ dïng ®Ó m« t¶ qu¸ tr×nh tÝnh to¸n mét c¸ch cã hÖ thèng. Ng−êi ta th−êng thÓ hiÖn thuËt to¸n b»ng l−u ®å.

II.2.II.2.II.2.II.2. C¸c ký hiÖu trªn l−u ®åC¸c ký hiÖu trªn l−u ®åC¸c ký hiÖu trªn l−u ®åC¸c ký hiÖu trªn l−u ®å ::::

Tªn khèiTªn khèiTªn khèiTªn khèi Ký hiÖuKý hiÖuKý hiÖuKý hiÖu ýýýý nghÜanghÜanghÜanghÜa Khèi më ®Çu hoÆc kÕt thóc

Dïng më ®Çu hoÆc kÕt thóc ch−¬ng tr×nh

Khèi vµo ra

§−a sè liÖu vµo hoÆc in kÕt qu¶

Page 2: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 2

Khèi tÝnh to¸n

BiÓu diÔn c¸c c«ng thøc tÝnh to¸n vµ thay ®æi gi¸ trÞ cña c¸c biÕn

Khèi ®iÒu kiÖn

Dïng ®Ó ph©n nh¸nh ch−¬ng tr×nh

Ch−¬ng tr×nh con

Dïng ®Ó gäi ch−¬ng tr×nh con

Mòi tªn

ChØ h−íng truyÒn th«ng tin, liªn hÖ c¸c khèi

IIIIIIII.3..3..3..3. Mét sè vÝ dô biÓu diÔn thuËt to¸n b»ng l−u ®åMét sè vÝ dô biÓu diÔn thuËt to¸n b»ng l−u ®åMét sè vÝ dô biÓu diÔn thuËt to¸n b»ng l−u ®åMét sè vÝ dô biÓu diÔn thuËt to¸n b»ng l−u ®å

II.3.1II.3.1II.3.1II.3.1. ThuËt to¸n kh«ng ph©n nh¸nh:. ThuËt to¸n kh«ng ph©n nh¸nh:. ThuËt to¸n kh«ng ph©n nh¸nh:. ThuËt to¸n kh«ng ph©n nh¸nh:

VÝ dô 1: TÝnh A = x2 + y2

Begin

Nhaäp (x,y)

A = x2 + y2

Xuaát (A)

End

VÝ dô 2 : TÝnhyx

CByAxS22 +

++= ; biÕt A,B,C,x,y pow(x,n)

Begin

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

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

Xuaát S

End

Page 3: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 3

II.3.2.II.3.2.II.3.2.II.3.2. ThuËt to¸n cã ph©n nh¸nh:ThuËt to¸n cã ph©n nh¸nh:ThuËt to¸n cã ph©n nh¸nh:ThuËt to¸n cã ph©n nh¸nh: VÝ dô 1: T×m gi¸ trÞ max cña ba sè thùc a,b,c

Begin

Nhaäp (a, b, c)

Max = a

Xuaát (Max)

End

a > b

Max < c

Max = c

S

SMax = b

Ñ

Ñ

VÝ dô 2: Gi¶i ph−¬ng tr×nh bËc nhÊt Ax+B =0 víi c¸c nghiÖm thùc.

Begin

Nhaäp (a, b)

Xuaát (‘PTVÑ’)

End

a = 0

S

S Xuaát (-b/a)

b = 0 Xuaát (‘PTVN’)

Ñ

Ñ

Page 4: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 4

VÝ dô 3 : Gi¶i ph−¬ng tr×nh bËc hai Ax2+Bx+C =0 víi c¸c nghiÖm thùc.

Begin

Nhaäp (a, b, c)

Xuaát (‘X1= ’,(-b + SQRT(Delta)) / (2*a))Xuaát (‘X2= ’,(-b - SQRT(Delta)) / (2*a))

End

a = 0

Ñ

ÑPTB1 (b, c)

Delta < 0 Xuaát (‘PTVN’)

S

S

Delta = b*b - 4*a*c

ÑDelta = 0 Xuaát (-b / (2*a))

S

II.3.3.II.3.3.II.3.3.II.3.3. ThuËt to¸n cã chu tr×nhThuËt to¸n cã chu tr×nhThuËt to¸n cã chu tr×nhThuËt to¸n cã chu tr×nh::::

ThuËt to¸n cã chu tr×nh víi c¸c b−íc lÆp x¸c ®Þnh th−êng ®−îc thÓ hiÖn b»ng l−u ®å sau :

i = giaù trò ban ñaàu

Leänh S;Taêng i

i <= nS

Ñ

víi n lµ gi¸ trÞ kÕt thóc.

Page 5: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 5

VÝ dô 4: TÝnh S= ii

n

x=∑

1

, víi c¸c xi do ta nhËp vµo.

Begin

Nhaäp (n)

i = 1S = 0

Nhaäp (xi)

End

i = i+1S = S+xi

i <= n

Xuaát (S)

S

Ñ

III. III. III. III. C¸C NG«N NG÷ LËP TR×NH & CH−¬NG TR×NH DÞCHC¸C NG«N NG÷ LËP TR×NH & CH−¬NG TR×NH DÞCHC¸C NG«N NG÷ LËP TR×NH & CH−¬NG TR×NH DÞCHC¸C NG«N NG÷ LËP TR×NH & CH−¬NG TR×NH DÞCH::::

III.1. III.1. III.1. III.1. Ng«n ng÷ lËp tr×nhNg«n ng÷ lËp tr×nhNg«n ng÷ lËp tr×nhNg«n ng÷ lËp tr×nh::::

III.1.1. III.1.1. III.1.1. III.1.1. Giíi thiÖu:Giíi thiÖu:Giíi thiÖu:Giíi thiÖu: Con ng−êi muèn giao tiÕp víi m¸y tÝnh ph¶i th«ng qua ng«n ng÷. Con ng−êi muèn m¸y tÝnh thùc hiÖn c«ng viÖc, ph¶i viÕt c¸c yªu cÇu ®−a cho m¸y b»ng ng«n ng÷ m¸y hiÓu ®−îc. ViÖc viÕt c¸c yªu cÇu ta gäi lµ lËp tr×nh (programming). Ng«n ng÷ dïng ®Ó lËp tr×nh ®−îc gäi lµ ng«n ng÷ lËp tr×nh.

NÕu ng«n ng÷ lËp tr×nh gÇn víi vÊn ®Ò cÇn gi¶i quyÕt, gÇn víi ng«n ng÷ tù nhiªn th× viÖc lËp tr×nh sÏ ®¬n gi¶n h¬n nhiÒu. Nh÷ng ng«n ng÷ lËp tr×nh cã tÝnh chÊt nh− trªn ®−îc gäi lµ ng«n ng÷ cÊp cao. Nh−ng m¸y tÝnh chØ hiÓu ®−îc ng«n ng÷ riªng cña m×nh, ®ã lµ c¸c chuçi sè 0 víi 1 vµ nh− vËy râ rµng lµ khã kh¨n cho lËp tr×nh viªn, v× nã kh«ng gÇn gòi víi con ng−êi.

HiÖn t¹i, ng«n ng÷ lËp tr×nh ®−îc chia ra lµm c¸c lo¹i sau:

III.1.2. III.1.2. III.1.2. III.1.2. Ph©n lo¹i ng«n ng÷ lËp tr×nh:Ph©n lo¹i ng«n ng÷ lËp tr×nh:Ph©n lo¹i ng«n ng÷ lËp tr×nh:Ph©n lo¹i ng«n ng÷ lËp tr×nh:

- Ng«n ng÷ m¸y (machine language)

Page 6: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 6

- Hîp ng÷ (assembly language)

- Ng«n ng÷ cÊp cao (higher-level language)

Do m¸y tÝnh chØ hiÓu ®−îc ng«n ng÷ m¸y, cho nªn mét ch−¬ng tr×nh viÕt trong ng«n ng÷ cÊp cao ph¶i ®−îc biªn dÞch sang ng«n ng÷ m¸y. C«ng cô thùc hiÖn viÖc biªn dÞch ®ã ®−îc gäi lµ ch−¬ng tr×nh dÞch.

III.2. III.2. III.2. III.2. Ch−¬ng tr×nh dÞch:Ch−¬ng tr×nh dÞch:Ch−¬ng tr×nh dÞch:Ch−¬ng tr×nh dÞch:

Ch−¬ng tr×nh dÞch ®−îc chia ra lµm 2 lo¹i : tr×nh biªn dÞch (compiler) vµ tr×nh th«ng dÞch (interpreter)

III.2.1. III.2.1. III.2.1. III.2.1. Tr×nh biªn dÞch:Tr×nh biªn dÞch:Tr×nh biªn dÞch:Tr×nh biªn dÞch: lµ viÖc chuyÓn mét ch−¬ng tr×nh trong ng«n ng÷ cÊp cao nµo ®ã (ch−¬ng tr×nh nguån) sang ng«n ng÷ m¸y (ch−¬ng tr×nh ®Ých).

- Thêi gian chuyÓn mét ch−¬ng tr×nh nguån sang ch−¬ng tr×nh ®Ých ®−îc gäi lµ thêi gian dÞch.

- Thêi gian mµ ch−¬ng tr×nh ®Ých thùc thi ®−îc gäi lµ thêi gian thùc thi.

Nh− vËy, ch−¬ng tr×nh nguån vµ d÷ liÖu ®Ó ch−¬ng tr×nh thùc thi ®−îc xö lý trong c¸c thêi ®iÓm kh¸c nhau, ®−îc gäi lµ thêi gian dÞch (compile time) vµ thêi gian thùc thi (run-time)

Chöông trìnhnguoàn

Trình bieândòch

Chöông trìnhñích

Maùy tínhthöïc hieän Keát quaû

Döõ lieäu

H×nh I.1. Ch−¬ng tr×nh thùc thi theo c¬ chÕ dÞch cña tr×nh biªn dÞch

III.2.2. III.2.2. III.2.2. III.2.2. Tr×nh th«ng dÞchTr×nh th«ng dÞchTr×nh th«ng dÞchTr×nh th«ng dÞch:::: qu¸ tr×nh dÞch vµ thùc thi x¶y ra cïng 1 thêi gian, dÞch ®Õn ®©u thi hµnh lÖnh ®Õn ®ã.

Chöông trìnhnguoàn

Chöông trìnhthoâng dòch Keát quaû

Döõ lieäu

H×nh I.2. Ch−¬ng tr×nh thùc thi theo c¬ chÕ dÞch cña tr×nh th«ng dÞch

Page 7: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 7

CH−¬NG 2 CH−¬NG 2 CH−¬NG 2 CH−¬NG 2 LµM QUEN VíI NG«N NG÷ CLµM QUEN VíI NG«N NG÷ CLµM QUEN VíI NG«N NG÷ CLµM QUEN VíI NG«N NG÷ C

* * * * Giíi thiÖu ng«n ng÷ CGiíi thiÖu ng«n ng÷ CGiíi thiÖu ng«n ng÷ CGiíi thiÖu ng«n ng÷ C

Ng«n ng÷ C do Dennis Ritchie lµ ng−êi ®Çu tiªn ®Ò xuÊt, ®· thiÕt kÕ vµ cµi ®Æt C trong m«i tr−êng UNIX. Nã cã nguån gèc tõ ng«n ng÷ BCPL do Martin Richards ®−a ra vµo n¨m 1967 vµ ng«n ng÷ B do Ken Thompson ph¸t triÓn tõ ng«n ng÷ BCPL n¨m 1970 khi viÕt hÖ ®iÒu hµnh Unix.

C lµ ng«n ng÷ lËp tr×nh ®a dông, cÊp cao nh−ng l¹i cã kh¶ n¨ng thùc hiÖn c¸c thao t¸c nh− cña ng«n ng÷ Assembly. V× thÕ ng«n ng÷ C nhanh chãng ®−îc cµi ®Æt, sö dông trªn m¸y vi tÝnh vµ ®· trë thµnh mét c«ng cô lËp tr×nh kh¸ m¹nh, hiÖn nay ®ang cã khuynh h−íng trë thµnh mét ng«n ng÷ lËp tr×nh chÝnh cho m¸y vi tÝnh trªn thÕ giíi.

* * * * §Æc ®iÓm ng«n ng÷ C§Æc ®iÓm ng«n ng÷ C§Æc ®iÓm ng«n ng÷ C§Æc ®iÓm ng«n ng÷ C

Ng«n ng÷ C cã nh÷ng ®Æc ®iÓm c¬ b¶n sau :

- TÝnh c« ®äng (compact) : Ng«n 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 bëi c¸c d·y ký tù ng¾n gän.

- TÝnh cÊu tróc (structured) : Ng«n ng÷ C cã mét tËp hîp c¸c ph¸t biÓu lËp tr×nh cÊu tróc nh− ph¸t biÓu quyÕt ®Þnh hoÆc lÆp. Do ®ã, nã cho phÐp chóng ta viÕt ch−¬ng tr×nh cã tæ chøc vµ dÓ hiÓu.

- TÝnh t−¬ng thÝch (compactable) : Ng«n ng÷ C cã bé lÖnh tiÒn xö lý vµ c¸c th− viÖn chuÈn lµm cho c¸c ch−¬ng tr×nh viÕt b»ng ng«n ng÷ C cã thÓ t−¬ng 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) : Ng«n ng÷ C lµ mét ng«n 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µ kh«ng cã ë ng«n ng÷ kh¸c nh− Pascal, nã gióp cho kÝch th−íc m· lÖnh cã thÓ thu gän l¹i ®Ó ch−¬ng tr×nh thùc thi nhanh chãng h¬n.

- Biªn dÞch : Ng«n ng÷ C ®−îc biªn dÞch b»ng nhiÒu b−íc vµ cho phÐp biªn dÞch nhiÒu tËp tin ch−¬ng tr×nh riªng rÏ thµnh c¸c tËp tin ®èi t−îng (object) vµ nèi c¸c ®èi t−îng ®ã l¹i víi nhau (link) thµnh mét ch−¬ng tr×nh thùc thi thèng nhÊt.

I. I. I. I. C¸C KH¸I NIÖM C¬ B¶NC¸C KH¸I NIÖM C¬ B¶NC¸C KH¸I NIÖM C¬ B¶NC¸C KH¸I NIÖM C¬ B¶N I.1. I.1. I.1. I.1. CÊu tróc c¬ b¶n cña mét ch−¬ng tr×nh CCÊu tróc c¬ b¶n cña mét ch−¬ng tr×nh CCÊu tróc c¬ b¶n cña mét ch−¬ng tr×nh CCÊu tróc c¬ b¶n cña mét ch−¬ng tr×nh C

[tiÒn xö lý] [C¸c hµm] void main()

Page 8: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 8

{ [khai b¸o biÕn;] [nhËp d÷ liÖu ;] [xö lý ;] [xuÊt ;] }

VÝ dô : Ch−¬ng tr×nh hiÖn trªn mµn h×nh c©u “Chao cac ban”

void main()

{ printf(“Chao cac ban\n”);

}

Mét vµi nhËn xÐt quan träng :

- Ch−¬ng tr×nh C bao giê còng cã mét hay nhiÒu hµm, trong ®ã cã mét hµm chÝnh b¾t buéc ph¶i cã lµ hµm mainmainmainmain(). §©y chÝnh lµ hµm ®−îc thùc hiÖn ®Çu tiªn trong ch−¬ng tr×nh.

- CÆp dÊu “{ } “ ®Ó x¸c ®Þnh mét khèi lÖnh.

- Hµm printf(“ Chao cac ban \n”) lµ hµm chuÈn cña C dïng ®Ó xuÊt c©u th«ng b¸o “Chao cac ban” ra mµn h×nh. Ký tù “\n“ lµ ký tù ®Æc biÖt dïng ®Ó xuèng dßng.

- DÊu “;” ®Ó chÊm døt mét lÖnh.

- Ch−¬ng tr×nh C cã ph©n biÖt ch÷ th−êng víi ch÷ hoa. §a sè c¸c tõ kho¸ cña C ®−îc viÕt b»ng ch÷ th−êng, cßn mét sè Ýt ®−îc viÕt b»ng ch÷ hoa mµ ta ph¶i tu©n thñ chÆt chÏ, nÕu kh«ng th× ch−¬ng tr×nh dÞch sÏ kh«ng hiÓu.

* * * * Mét vµi vÝ dôMét vµi vÝ dôMét vµi vÝ dôMét vµi vÝ dô

VÝ dô 1: In b¶ng lòy thõa 2 cña c¸c sè nguyªn tõ 10 ®Õn 50

/* Ch−¬ng tr×nh in b×nh ph−¬ng 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*/

Page 9: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 9

VÝ dô 2 : T−¬ng tù nh− vÝ dô 1 nh−ng 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 : Ch−¬ng tr×nh in lòy thõa 2, 3, 4, 5; cã dïng hµm ®Ó tÝnh lòy thõa :

#include <stdio.h> #define max 50 /*TiÒn xö lý, ®Þnh nghÜa max =50*/ float luythua(int n, int m) /*Hµm luythua víi 2 th«ng sè*/ { float s=1; /*Khai b¸o vµ khëi t¹o biÕn s*/ for ( ;m>0;m--) /*LÆp gi¶m dÇn tõ m tíi 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); /*Gäi 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è víi 2 sè lÎ */ } } /*HÕt main*/

**** Hµm xuÊt chuÈn printf()Hµm xuÊt chuÈn printf()Hµm xuÊt chuÈn printf()Hµm xuÊt chuÈn printf()

Có ph¸pCó ph¸pCó ph¸pCó ph¸p : printfprintfprintfprintf(“chuçi-®Þnhd¹ng”,thamso1,thamso2,...)

ýýýý nghÜanghÜanghÜanghÜa :

Hµm printf() sÏ xem xÐt chuçi-®Þnhd¹ng, lÊy gi¸ trÞ c¸c tham sè (nÕu cÇn) ®Ó ®Æt vµo theo yªu cÇu cña chuçi-®Þnhd¹ng vµ gëi ra thiÕt bÞ chuÈn.

Chuçi-®Þnhd¹ng lµ mét chuçi ký tù, trong ®ã cã nh÷ng ký tù xuÊt ra nguyªn vÑn hoÆc xuÊt ë d¹ng ®Æc biÖt, vµ cã thÓ cã nh÷ng chuçi ®iÒu khiÓn cÇn lÊy gi¸ trÞ cña c¸c tham sè ®Ó thay vµo ®ã khi in ra.

Page 10: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 10

- Nh÷ng ký tù ®Æc biÖtNh÷ng ký tù ®Æc biÖtNh÷ng ký tù ®Æc biÖtNh÷ng ký tù ®Æc biÖt ::::

Ký tùKý tùKý tùKý tù T¸c dôngT¸c dôngT¸c dôngT¸c dông M· ASCIIM· ASCIIM· ASCIIM· ASCII

\n Xuèng hµng míi 10

\t Tab 9

\b Xãa ký tù bªn tr¸i 8

\r Con trá trë vÒ ®Çu hµng 13

\f Sang trang 12

\a Ph¸t tiÕng cßi 7

\\ XuÊt dÊu chÐo ng−îc 92

\’ XuÊt dÊu nh¸y ®¬n ‘ 39

\’’ XuÊt dÊu nh¸y kÐp “ 34

\xdd XuÊt ký tù cã m· ASCII d¹ng Hex lµ dd

\ddd XuÊt ký tù cã m· ASCII d¹ng Dec lµ ddd

\0 Ký tù NULL 0

---- ChuçiChuçiChuçiChuçi ®Þnh d¹ng®Þnh d¹ng®Þnh d¹ng®Þnh d¹ng ::::

% [ flag][width][.prec][FNhl] type

TypeTypeTypeType : ®Þnh kiÓu cña tham sè theo sau chuçi-®Þnhd¹ng ®Ó lÊy gi¸ trÞ ra

TypeTypeTypeType ýýýý nghÜanghÜanghÜanghÜa

d,i Sè nguyªn c¬ sè 10

u Sè nguyªn c¬ sè 10 kh«ng dÊu

o Sè nguyªn c¬ sè 8

x Sè nguyªn c¬ sè 16, ch÷ th−êng(a,b,...,f)

X Sè nguyªn c¬ sè 16, ch÷ in (A,B,...,F)

f Sè thùc d¹ng [-]dddd.ddd...

e Sè thùc d¹ng [-]d.ddd e[+/-]ddd

E Sè thùc d¹ng [-]d.ddd E[+/-]ddd

g,G Sè thùc d¹ng e(E) hay f tïy theo ®é chÝnh x¸c

c Ký tù

s Chuçi ký tù tËn cïng b»ng ‘\0’

% DÊu % cÇn in

Page 11: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 11

FlagFlagFlagFlag : D¹ng ®iÒu chØnh

FlagFlagFlagFlag ýýýý nghÜanghÜanghÜanghÜa

nÕu kh«ng cã in d÷ liÖu ra víi canh ph¶i

- in d÷ liÖu ra víi canh tr¸i

+ Lu«n b¾t ®Çu sè b»ng + hay -

# in ra tïy theo type, nÕu:

0 : ChÌn thªm 0 ®øng tr−íc gi¸ trÞ >0

x,X : ChÌn thªm 0x hay 0X ®øng tr−íc sè nµy

e,E,f : Lu«n lu«n cã dÊu chÊm thËp ph©n

G,g : Nh− trªn nh−ng kh«ng cã sè 0 ®i sau

WidthWidthWidthWidth : ®Þnh kÝch th−íc in ra

WidthWidthWidthWidth ýýýý nghÜanghÜanghÜanghÜa

n Dµnh Ýt nhÊt n ký tù , ®iÒn kho¶ng tr¾ng c¸c ký tù cßn trèng

0n Dµnh Ýt nhÊt n ký tù , ®iÒn sè 0 c¸c ký tù cßn trèng

* Sè ký tù Ýt nhÊt cÇn in n»m ë tham sè t−¬ng øng

PrecPrecPrecPrec : ®Þnh kÝch th−íc phÇn lÏ in ra

PrecPrecPrecPrec ýýýý nghÜanghÜanghÜanghÜa

kh«ng cã ®é chÝnh x¸c nh− b×nh th−êng

0 d,i,o,u,x ®é chÝnh x¸c nh− cò

e,E,f Kh«ng cã dÊu chÊm thËp ph©n

n nhiÒu nhÊt lµ n ký tù (sè)

* Sè ký tù Ýt nhÊt cÇn in n»m ë tham sè t−¬ng øng

C¸c ch÷ bæ sung C¸c ch÷ bæ sung C¸c ch÷ bæ sung C¸c ch÷ bæ sung :

F Tham sè lµ con trá xa XXXX:YYYY

N Tham sè lµ con trá gÇn YYYY

h Tham sè lµ short int

l Tham sè lµ long int (d,i,o,u,x,X)

double (e,E,f,g,G)

VÝ dô 1: char c=‘A’;

char s[]=“Blue moon!” ;

Page 12: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 12

D¹ngD¹ngD¹ngD¹ng TTTTh«ng sè h«ng sè h«ng sè h«ng sè t−¬ng øng t−¬ng øng t−¬ng øng t−¬ng øng

XuÊtXuÊtXuÊtXuÊt NhËn xÐtNhËn xÐtNhËn xÐtNhËn xÐt

%c c “A” ®é réng 1

%2c c “ A” ®é réng 2, canh ph¶i

%-3c c “A “ ®é réng 3, canh tr¸i

%d c “65” M· ASCII cña ‘A’

%s s “Blue moon!” ®é réng 10

%3s s “Blue moon!” NhiÒu ký tù h¬n cÇn thiÕt

%.6s s “Blue m” ChÝnh x¸c 6 ký tù

%-11.8s s “Blue moo “ ChÝnh x¸c 8, canh tr¸i

VÝ dô 2: int i = 123;

float x = 0.123456789;

D¹ngD¹ngD¹ngD¹ng Th«ng sè Th«ng sè Th«ng sè Th«ng sè t−¬ng øng t−¬ng øng t−¬ng øng t−¬ng øng

XuÊtXuÊtXuÊtXuÊt NhËn xÐtNhËn xÐtNhËn xÐtNhËn xÐt

%d i “123” ®é réng 3

%05d i “00123” Thªm 2 sè 0

%7o” i “ 123” HÖ 8, canh ph¶i

%-9x i “7b “ HÖ 16, canh tr¸i

%c i “{“ Ký tù cã m· ASCII 123

%-#9x i “0x7b “ HÖ 16, canh tr¸i

%10.5f x “ 0.12346” ®é réng 10, cã 5 ch÷ sè thËp ph©n

%-12.5e x “1.23457e-01 “ Canh tr¸i, in ra d−íi d¹ng khoa häc

VÝ dô 3: ViÕt ch−¬ng tr×nh in h×nh ch÷ nhËt kÐp 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);

}

Page 13: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 13

I.2. I.2. I.2. I.2. KiÓu d÷ liÖu c¬ b¶nKiÓu d÷ liÖu c¬ b¶nKiÓu d÷ liÖu c¬ b¶nKiÓu d÷ liÖu c¬ b¶n

I.2.1.I.2.1.I.2.1.I.2.1. ®®®®Þnh nghÜaÞnh nghÜaÞnh nghÜaÞnh nghÜa::::

KiÓu d÷ liÖu c¬ b¶n lµ kiÓu d÷ liÖu cã gi¸ trÞ ®¬n, kh«ng ph©n chia ®−îc n÷a nh− sè, ký tù

I.2.2. I.2.2. I.2.2. I.2.2. Ph©n lo¹i:Ph©n lo¹i:Ph©n lo¹i:Ph©n lo¹i:

Tªn kiÓuTªn kiÓuTªn kiÓuTªn kiÓu ýýýý nghÜanghÜanghÜanghÜa KÝch KÝch KÝch KÝch th−ícth−ícth−ícth−íc

Ph¹m viPh¹m viPh¹m viPh¹m vi

char Ký tù 1 byte -128→ 127

unsigned char Ký tù kh«ng dÊu 1 byte 0→255

unsigned short Sè nguyªn ng¾n kh«ng dÊu 2 bytes 0→65535

enum Sè nguyªn cã dÊu 2 bytes -32768→32767

short int Sè nguyªn cã dÊu 2 bytes -32768→32767

int Sè nguyªn cã dÊu 2 bytes -32768→32767

unsigned int Sè nguyªn kh«ng dÊu 2 bytes 0 → 65535

long Sè nguyªn dµi cã dÊu 4 bytes -2147483648 → 2147483647

unsigned long Sè nguyªn dµi kh«ng dÊu 4 bytes 0→4294967295

float Sè thùc ®é chÝnh x¸c ®¬n 4 bytes 3.4 E-38→3.4 E+38

double Sè thùc ®é chÝnh x¸c kÐp 8 bytes 1.7 E-308 → 1.7 E+308

long double Sè thùc ®é chÝnh x¸c h¬n double

10 bytes 3.4 E-4932 → 1.1 E+4932

Chó ý :

1. Ng«n ng÷ C kh«ng cã kiÓu logic (boolean nh− Pascal) mµ quan niÖm

0 lµ false ; Kh¸c 0 lµ true

2. Ng«n ng÷ C kh«ng cã kiÓu chuçi 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

Page 14: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 14

I.3. I.3. I.3. I.3. BiÕnBiÕnBiÕnBiÕn

I.3.1.I.3.1.I.3.1.I.3.1. Tªn biÕnTªn biÕnTªn biÕnTªn biÕn : Tªn biÕn lµ mét chuçi ký tù b¾t ®Çu b»ng ký tù ch÷, ký tù kÕ tiÕp lµ ký tù ch÷ (dÊu g¹ch d−íi “_” ®−îc xem lµ ký tù ch÷) hoÆc sè vµ kh«ng ®−îc trïng víi c¸c tõ khãa cña C.

Chó ý : - Ng«n ng÷ C ph©n biÖt ch÷ th−êng víi ch÷ hoa nªn biÕn ch÷ th−êng víi ch÷ hoa lµ kh¸c nhau.

VÝ dô : Bien_1 _bien2 lµ hîp lÖ bi&en 2a a b lµ kh«ng hîp lÖ

- Ng«n ng÷ C chØ ph©n biÖt hai tªn hîp lÖ víi nhau b»ng n ký tù ®Çu tiªn cña chóng. Th«ng th−êng n=8, nh−ng hiÖn nay nhiÒu ch−¬ng tr×nh dÞch cho phÐp n=32, nh− Turbo C cho phÐp thay ®æi sè ký tù ph©n biÖt tõ 8-32)

VÝ dô : Hai biÕn sau bÞ xem lµ cïng 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.I.3.2.I.3.2.I.3.2. Khai b¸o biÕnKhai b¸o biÕnKhai b¸o biÕnKhai b¸o biÕn

C¸c biÕn ph¶i ®−îc khai b¸o tr−íc khi sö dông nh»m gióp cho ch−¬ng tr×nh dÞch cã thÓ xö lý chóng.

Khai b¸o biÕn cã d¹ng :

KiÓud÷liÖu tªnbiÕn1 [,tenbiÕn2 ...] ;

VÝ dô: int a,b,c; float x,y,delta; char c;

* Khai b¸o vµ khëi t¹o biÕn:

KiÓu d÷ liÖu tªnbiÕn = gi¸trÞ ;

I.3.3.I.3.3.I.3.3.I.3.3. Hµm nhËp d÷ liÖu chuÈnHµm nhËp d÷ liÖu chuÈnHµm nhËp d÷ liÖu chuÈnHµm nhËp d÷ liÖu chuÈn

a) Hµm scanf()

Có ph¸pCó ph¸pCó ph¸pCó ph¸p:::: scanf(“chuçi-®Þnhd¹ng“,®i¹chØthamsè1, ®i¹chØthamsè2,...)

- Chuçi-®Þnhd¹ng cña scanf() gåm cã ba lo¹i ký tù :

+ Chuçi ®iÒu khiÓn

+ Ký tù tr¾ng

+ Ký tù kh¸c tr¾ng

˜ Chuçi ®iÒu khiÓn cã d¹ng :

%[width][h/l] type

Page 15: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 15

Víi typetypetypetype: x¸c ®Þnh kiÓu cña biÕn ®Þa chØ tham sè sÏ nhËn gi¸ trÞ nhËp vµo

TypeTypeTypeType ýýýý nghÜanghÜanghÜanghÜ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 kh«ng dÊu (unsigned)

x Sè nguyªn c¬ sè 16 (int)

f,e Sè thùc (float)

c Ký tù (char)

s Chuçi ký tù

p Con trá (pointer)

lf Sè thùc (double)

Lf Sè thùc (long double)

WidthWidthWidthWidth : x¸c ®Þnh sè ký tù tèi ®a sÏ nhËn vµo cho vïng ®ã.

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 chuçi nhËp vµo nhiÒu h¬n th× phÇn cßn l¹i sÏ dµnh l¹i cho lÇn gäi scanf() kÕ tiÕp.

VÝ dô 1: scanf(“%3s”,str);

NÕu nhËp chuçi ABCDEFG ↵

th× scanf() sÏ nhËn tèi ®a 3 ký tù cÊt vµo m¶ng str, cßn DEFG sÏ ®−îc lÊy nÕu sau ®ã cã lÇn gäi sanf(“%s”,str) kh¸c.

VÝ dô 2: unsigned long money;

scanf(“%lu”,&money);

L−u ý: NÕu scanf(“%ul”, &money) th× gi¸ trÞ nhËp vµo sÏ kh«ng ®−îc l−u tr÷ trong biÕn money, nh−ng ch−¬ng tr×nh dÞch kh«ng b¸o lçi.

VÝ dô 3: NhËp vµo tªn vµ bÞ giíi h¹n trong kho¶ng [A-Z,a-z]

char name[20]; printf(“Name : ”) ; scanf(“%[A-Za-z]”,&name);

Trong tr−êng hîp nµy, nÕu ta gâ sai d¹ng th× name =””

˜ Ký tù tr¾ng: nÕu cã trong chuçi-d¹ng sÏ yªu cÇu scanf() bá qua mét hay nhiÒu ký tù tr¾ng trong chuçi nhËp vµo. Ký tù tr¾ng lµ ký tù kho¶ng tr¾ng (‘ ‘), tab (‘\t’), xuèng hµng (‘\n’). Mét ký tù tr¾ng trong chuçi-®Þnhd¹ng sÏ ®−îc hiÓu lµ chê nhËp ®Õn ký tù kh¸c tr¾ng tiÕp theo.

Page 16: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 16

VÝ dô 4: scanf(“%d “,&num);

Hµm scanf() cho ta nhËp mét ký tù kh¸c tr¾ng n÷a th× míi tho¸t ra. Ký tù ®ã sÏ n»m trong vïng ®Öm vµ sÏ ®−îc lÊy bëi hµm scanf() hoÆc gets() tiÕp theo.

˜ Ký tù kh¸c tr¾ng: nÕu cã trong chuçi-®Þ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 mét 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 kh«ng gÆp dÊu ‘/’ kÕ tiÕp sè nguyªn th× scanf() chÊm døt.

Chó ý : Hµm scanf() ®ßi hái c¸c tham sè ph¶i lµ c¸c ®Þa chØ cña c¸c biÕn hoÆc lµ mét con trá.

* To¸n tö ®Þa chØ & : LÊy ®Þa chØ cña mét biÕn

VÝ dô 6: int n; → biÕn n

&n; → ®Þa chØ cña n printf(“trÞ = %d, ®Þa chØ = %d”,n,&n);

b) Hµm getch():

Hµm getch() dïng ®Ó nhËn mét ký tù do ta nhËp trªn bµn phÝm mµ kh«ng cÇn gâ Enter víi có ph¸p :

ch = getch(); Kh«ng hiÖn ký tù nhËp trªn mµn h×nh

ch = getche(); HiÖn ký tù nhËp trªn mµn h×nh

Víi 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× ch−¬ng tr×nh sÏ kÕt thóc, ng−îc l¹i ch−¬ng tr×nh sÏ b¸o lçi vµ b¾t nhËp l¹i.

#include <stdio.h> #include <conio.h> void main() { char ch;

Page 17: Ky Thuat viet lap trinh

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"); } } L−u ý: Hµm getch() cßn cho phÐp ta nhËp vµo 1 ký tù më réng nh− c¸c

phÝm F1, F2,.., c¸c phÝm di chuyÓn cursor. C¸c phÝm nµy lu«n cã 2 bytes: byte thø nhÊt b»ng 0, cßn byte 2 lµ m· scancode cña phÝm ®ã. §Ó nhËn biÕt ta ®· gâ phÝm ký tù hay phÝm më réng, ta cã ch−¬ng 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ÝmPhÝmPhÝmPhÝm M· scancodeM· scancodeM· scancodeM· scancode F1 59 F2 60 F3 61 F4 62 F5 63 F6 64 F7 65 F8 66 F9 67

F10 68 Home 71 Æ 72 â 80 ß 75

Page 18: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 18

à 77 PgUp 73 PgDn 81 End 79 Ins 82 Del 83

B¶ng m· scancode cña c¸c phÝm më réng c. Hµm kbhit(): Hµm int kbhit() int kbhit() int kbhit() int kbhit() sÏ kiÓm tra xem cã phÝm nµo ®−îc gâ

vµo hay kh«ng. NÕu cã, hµm kbhit sÏ tr¶ vÒ mét sè nguyªn kh¸c 0, vµ ng−îc 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 I.4 I.4 I.4 H»ngH»ngH»ngH»ng: : : : H»ng lµ c¸c ®¹i l−îng mµ gi¸ trÞ cña nã kh«ng thay ®æi trong qu¸ tr×nh ch−¬ng tr×nh thùc hiÖn.

I.4.1.I.4.1.I.4.1.I.4.1. Ph©n lo¹i :Ph©n lo¹i :Ph©n lo¹i :Ph©n lo¹i :

a. H»ng sè : lµ c¸c gi¸ trÞ sè ®· x¸c ®Þnh vµ kh«ng ®æi.

int unsigned long hÖ 8 hÖ 16 float/double

D¹ng nnnn

-nnnn

nnnnU/u

nnnnL/l

-nnnnl/L

0nnnn 0xnnnn nnnn.nnnn

nnnn.nnnE/e±nnn

VÝ dô 4567

-12

123U

12uL

456789L

-1234L

0345 0x1AB 123.654

123.234E-4

Chó ý :

- C¸c h»ng sè viÕt kh«ng dÊu hoÆc kh«ng sè mò ®−îc hiÓu lµ sè nguyªn, ng−îc l¹i lµ double.

- C¸c h»ng sè nguyªn lín h¬n int sÏ ®−îc l−u tr÷ theo kiÓu long, cßn lín h¬n long th× ®−îc l−u tr÷ theo kiÓu double.

- C¸c h»ng sè nguyªn d−¬ng lín h¬n long sÏ ®−îc l−u tr÷ theo kiÓu double

- Mét h»ng sè ®−îc l−u tr÷ theo d¹ng long nÕu theo sè ®ã cã ký tù l (L),

Page 19: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 19

d¹ng unsigned nÕu sau ®ã cã ch÷ u (U), d¹ng thËp lôc ph©n nÕu tr−íc sè ®ã cã 0x vµ d¹ng b¸t ph©n nÕu tr−íc sè ®ã cã 0

VÝ dô: 50000; 10 L; → Long

5U, 100u → unsigned

0x10 → hÖ 16 = 1610

010 → hÖ 8 = 810

b. H»ng ký tù : lµ ký tù riªng biÖt ®−îc viÕt trong hai dÊu nh¸y ®¬n : ‘A’

Gi¸ trÞ cña h»ng ký tù lµ m· ASCII cña 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 phÐp to¸n nh− mäi 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 ®· xÐt ë hµm printf() nh− ‘\n’,’\a’,’\t’ ...

c. H»ng chuçi : Lµ mét chuçi ký tù n»m trong hai dÊu nh¸y kÐp “ “.

VÝ dô : “Day la mot chuoi” “Hang chuoi co ky tu ®¹c biÖt nh− \ \n \248”

“” → chuçi rçng.

Chó ý :

- Ph©n biÖt “A” ≠ ‘A’ H»ng: Chuçi Ký tù D¹ng l−u tr÷ :

A \0 A

- NhËn xÐt: ë d¹ng l−u tr÷, ta thÊy tËn cïng cña chuçi cã ký tù NULL ‘\0’ mµ kh«ng cã ë d¹ng ký tù. ChÝnh v× vËy mµ kh«ng cã ký tù rçng ‘’.

- Mét chuçi cã thÓ ®−îc viÕt trªn nhiÒu hµng víi ®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. H»ng biÓu thøc : Lµ mét biÓu thøc mµ trong ®ã c¸c to¸n h¹ng ®Òu lµ c¸c h»ng. Khi ®ã ch−¬ng tr×nh dÞch sÏ tÝnh to¸n biÓu thøc tr−íc, vµ kÕt qu¶ ®−îc l−u tr÷ th¼ng b»ng mét h»ng sè t−¬ng ®−¬ng.

VÝ dô : 8*20-13 → kÕt qu¶ l−u tr÷ lµ 173

Page 20: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 20

‘a -’A’ → “ lµ 97-65 = 32

1<8 → “ lµ 0 (sai)

I.4.2.I.4.2.I.4.2.I.4.2. Khai b¸o h»ngKhai b¸o h»ngKhai b¸o h»ngKhai b¸o h»ng::::

Có ph¸pCó ph¸pCó ph¸pCó ph¸p:::: constconstconstconst tªnh»ng = biÓuthøc;

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ã kh«ng cã dÊu ;

I.5. I.5. I.5. I.5. PhÐp to¸nPhÐp to¸nPhÐp to¸nPhÐp to¸n

I.5.1.I.5.1.I.5.1.I.5.1. PhÐp g¸n:PhÐp g¸n:PhÐp g¸n:PhÐp g¸n:

Có ph¸pCó ph¸pCó ph¸pCó ph¸p:::: biÕn = biÓu thøc;

Chó ý : PhÐp g¸n trong ng«n ng÷ C tr¶ vÒ mét kÕt qu¶ lµ trÞ cña biÓu thøc

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= b + 2*c) y = a + x;

VÝ dô 3 : (n+3) = 4+z; (kh«ng hîp lÖ v× bªn tr¸i lµ biÓu thøc)

‘ ‘= c +’o’; (kh«ng hîp lÖ v× bªn tr¸i lµ h»ng)

I.5.2.I.5.2.I.5.2.I.5.2. C¸c phÐp to¸n sè häc :C¸c phÐp to¸n sè häc :C¸c phÐp to¸n sè häc :C¸c phÐp to¸n sè häc :

a. PhÐp to¸n hai to¸n h¹ng : +, -, *, /, %

PhÐPhÐPhÐPhÐp to¸np to¸np to¸np to¸n KiÓu to¸n h¹ngKiÓu to¸n h¹ngKiÓu to¸n h¹ngKiÓu to¸n h¹ng KiÓu kÕt qu¶KiÓu kÕt qu¶KiÓu kÕt qu¶KiÓu kÕt qu¶

+, -, * char, int, long, float, double

KiÓu cña to¸n h¹ng cã kiÓu cao nhÊt

/ nguyªn/nguyªn KiÓu nguyªn vµ lµ phÐp chia nguyªn

thùc(nguyªn)/thùc (nguyªn)

KiÓu thùc vµ lµ phÐp chia thùc

% nguyªn/nguyªn KiÓu nguyªn vµ lµ phÐp chia lÊy phÇn d−

VÝ dô :

#include <stdio.h> void main()

Page 21: Ky Thuat viet lap trinh

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. PhÐp to¸n mét to¸n h¹ng : phÐp t¨ng ++, phÐp 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 chóng ®øng trong biÓu thøc (cã phÐp g¸n).

a++ : T¨ng a sau khi gi¸ trÞ cña nã ®−îc sö dông. ++a : T¨ng a tr−íc khi gi¸ trÞ cña nã ®−îc sö dông.

VÝ dô :

main() aaaa bbbb nnnn

{ int a=4 , b=6, n; n = a + b; n = a++ + b; n = ++a + b; n = --a + b; n = a-- + b; n = a+ b; }

4 4 5 6 5 4 4

6 6 6 6 6 6 6

10 10 12 11 11 10

I.5.3.I.5.3.I.5.3.I.5.3. PhÐp g¸n phøc hîp:PhÐp g¸n phøc hîp:PhÐp g¸n phøc hîp:PhÐp g¸n phøc hîp:

Có ph¸pCó ph¸pCó ph¸pCó ph¸p: biÕn op= <biÓuthøc> ⇔ biÕn = biÕn op <biÓuthøc>

Víi op lµ phÐp to¸n.

Page 22: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 22

C¸c phÐp g¸n phøc hîp : += , -= , *= , /= , %= , <<= , >>=

VÝ dô : n = n*(10+x) ⇔ n *= (10 +x)

n = n % 10 ⇔ n %= 10

I = I +3 ⇔ I += 3

<< : lµ phÐp dÞch chuyÓn bit qua tr¸i .

>> : lµ phÐp dÞch chuyÓn bit qua ph¶i .

I.5.4.I.5.4.I.5.4.I.5.4. PhÐp to¸n quan hÖ: PhÐp to¸n quan hÖ: PhÐp to¸n quan hÖ: PhÐp to¸n quan hÖ:

< : nhá h¬n

> : lín h¬n

>= : lín h¬n hoÆc b»ng

<= : nhá h¬n hoÆc b»ng

!= : kh¸c

== : b»ng

Chó ý:

- Ph©n biÖt to¸n tö so s¸nh == víi phÐp g¸n =

- C kh«ng 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= (a>6)*(a-6) → b = 4

c= (a< 5)*(a-5) → c = 0

VÝ dô: T×m sè lín nhÊt trong 3 sè nguyªn a, b, c

#include <stdio.h> #include <conio.h> void main () { int a, b, c, max; printf(“Ch−¬ng tr×nh t×m sè lín 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è lín nhÊt = %d”, max); getch(); }

Page 23: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 23

I.5.5.I.5.5.I.5.5.I.5.5.To¸n tö logic:To¸n tö logic:To¸n tö logic:To¸n tö logic:

To¸n töTo¸n töTo¸n töTo¸n tö ýýýý nghÜanghÜanghÜanghÜa

NOT ! Phñ ®Þnh

AND && Giao, vµ

OR || Héi

Thø tù tÝnh to¸n tõ trªn xuèng. B¶ng ch©n trÞ:

xxxx ! x! x! x! x xxxx yyyy x && yx && yx && yx && y

true false true true true

false true true false false

false true false

false false false

xxxx yyyy x || yx || yx || yx || y

true true true

false true true

false true true

false false false VÝ dô 1: XÐt ký tù c cã ph¶i lµ ký sè hay kh«ng?

char c;

if (c >= ‘0’ && c <= ‘9’)

printf (“% c lµ kÝ tù sè “, c);

VÝ dô 2: XÐt ký tù ch lµ ch÷ c¸i hay kh«ng?

if ((ch> =‘a’) and (ch< =‘z’)) or ((ch> =‘A’) and (ch< =‘Z’))

printf(“%c lµ chu cai \n”,ch);

VÝ dô 3:

int a=10, b=5, c=0;

a && b → 1

a && c → 0

a | | c → 1

VÝ dô 4:

int a=10, b=5;

Page 24: Ky Thuat viet lap trinh

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.I.5.6.I.5.6.I.5.6. To¸n tö phÈy:To¸n tö phÈy:To¸n tö phÈy:To¸n tö phÈy:

Có ph¸pCó ph¸pCó ph¸pCó ph¸p::::

T = (exp1, exp2, exp3 ); // T = kÕt qu¶ cña exp3

VÝ dô: m= (t=2, t*t+3) → m=7; t=2

c= (a=10,b=5,a+b); → a=10, b=5, c=15 I.5.7. I.5.7. I.5.7. I.5.7. To¸n tö ®iÒu kiÖn:To¸n tö ®iÒu kiÖn:To¸n tö ®iÒu kiÖn:To¸n tö ®iÒu kiÖn:

Có ph¸pCó ph¸pCó ph¸pCó ph¸p :

T = <®iÒu kiÖn> ? <bt1> : <bt2>;

NÕu <®iÒu kiÖn> lµ ®óng th× T = <bt1> , ng−îc 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.I.5.8.I.5.8.I.5.8. To¸n tö trªn bit (bit wise) :To¸n tö trªn bit (bit wise) :To¸n tö trªn bit (bit wise) :To¸n tö trªn bit (bit wise) :

D¹ngD¹ngD¹ngD¹ng Ký hiÖuKý hiÖuKý hiÖuKý hiÖu ýýýý nghÜanghÜanghÜanghÜa

NOT bit ~ lÊy bï 1

AND bit & giao

OR bit | héi

XOR bit ^ héi lo¹i trõ

dÞch tr¸i << nh©n 2

dÞch ph¶i >> chia 2

Page 25: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 25

B¶ng ch©n trÞ:

BitBitBitBit BitBitBitBit Bit kÕt qu¶Bit kÕt qu¶Bit kÕt qu¶Bit kÕt qu¶ AAAA BBBB ~ A~ A~ A~ A A & BA & BA & BA & B A | BA | BA | BA | B A ^ BA ^ BA ^ BA ^ B 0 0 1 0 0 0 0 1 1 0 1 1 1 0 0 0 1 1 1 1 0 1 1 0

VÝ dô:

a= 4564 0001 0001 1101 0100 b= 13667 0011 0101 0110 0011 a & b 0001 0001 0100 0000 a | b 0011 0101 1111 0111 a ^ b 0010 0100 1011 0111

ý nghÜa:

1. PhÐp AND bit th−êng ®−îc dïng ®Ó kiÓm tra mét bit cô thÓ nµo ®ã trong thµnh phÇn d÷ liÖu x cã trÞ 0 hay 1. ViÖc nµy thùc hiÖn b»ng c¸ch sö dông mét mÆt n¹ (mask) víi bit cÇn quan t©m b»ng 1 cßn c¸c bit kh¸c b»ng 0. Ta lÊy mask AND víi gi¸ trÞ x. NÕu kÕt qu¶ thu ®−îc b»ng mask th× lµ bit cÇn quan t©m lµ 1, ng−îc 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 muèn biÕt bit thø 3 cña 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”);

}

Page 26: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 26

2. PhÐp OR dïng ®Ó bËt c¸c bit cÇn thiÕt lªn còng nhê vµo mét mÆt n¹. Ch¼ng h¹n nh− ta muèn bËt bit thø 7 cña 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á h¬n) :”);

scanf (“%x %x”, &x1, &x2);

printf (“ %02x | %02x %02x \n”, x1, x2, x1| x2);

}

3. PhÐp XOR dïng ®Ó “lËt” bit nghÜa lµ ho¸n chuyÓn 0→1

VÝ dô 4: §Ó lËt bit 3 ta cã ch−¬ng 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ö << , >>

<< dÞch sang tr¸i (nh©n 2)

>> dÞch sang ph¶i (chia 2)

VÝ dô 5: num = 201 (0x00c9)

num : 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 num << 2 : 0 0 0 0 0 0 1 1 0 0 1 0 0 1 0 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 phÐp dÞch ph¶i C lµm theo 2 c¸ch kh¸c nhau tïy thuéc vµo

Page 27: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 27

kiÓu d÷ liÖu cña to¸n h¹ng bªn tr¸i.

- NÕu to¸n h¹ng bªn tr¸i kiÓu unsigned th× phÐp dÞch 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× phÐp dÞch 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

num =

num >> 2 =

0 →

1 0 0 1

9867 = 0x268B

0 0 1 0

1 0 1 0

0 1 1 0

0 0 1 0

1 0 0 0

1 1 1 0

1 0 1 1

VÝ dô 8 : int num; // 9A2E hexa

num = -26066

num =

num >> 2 =

1 →

1 0 0 1

-6517 = 0xE68B

1 1 1 0

1 0 1 0

0 1 1 0

0 0 1 0

1 0 0 0

1 1 1 0

1 0 1 1

VÝ dô 8: Ch−¬ng 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(); }

Page 28: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 28

VÝ dô 9: Ch−¬ng tr×nh m¸y tÝnh bitwise

§©y lµ ch−¬ng tr×nh gi¶ lËp mét m¸y tÝnh thùc 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 thøc ( 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ö kh«ng hîp lÖ /n “); } }

Page 29: Ky Thuat viet lap trinh

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 b¾t buéc:Sù chuyÓn kiÓu b¾t buéc:Sù chuyÓn kiÓu b¾t buéc:Sù chuyÓn kiÓu b¾t buéc:

Trong C cã 2 tr−êng hîp chuyÓn kiÓu: chuyÓn kiÓu tù ®éng vµ chuyÓn kiÓu b¾t buéc.

ChuyÓn kiÓu b¾t buéc: ®−îc ¸p dông khi chuyÓn kiÓu tù ®éng kh«ng ®−îc.

Có ph¸pCó ph¸pCó ph¸pCó ph¸p: (Type) biÓu thøc

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.

* * * * Møc ®é −u tiªn cña c¸c phÐp to¸n:Møc ®é −u tiªn cña c¸c phÐp to¸n:Møc ®é −u tiªn cña c¸c phÐp to¸n:Møc ®é −u tiªn cña c¸c phÐp to¸n:

§é −u tiªn§é −u tiªn§é −u tiªn§é −u tiªn PhÐp to¸nPhÐp to¸nPhÐp to¸nPhÐp to¸n Thø tù kÕt hîpThø tù kÕt hîpThø tù kÕt hîpThø tù kÕt hîp

1 () [ ] → →

2 ! ~ ++ - - (type) * & size of ←←←←

3 * / % →

4 + - →

5 << >> →

Page 30: Ky Thuat viet lap trinh

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 VÝ dô 2: (float) 2 /4 # (float) (2/4) 2.0 /4 (float) 0 0.5 0.0

I.I.I.I.6. 6. 6. 6. ChuçiChuçiChuçiChuçi

I.6.1.I.6.1.I.6.1.I.6.1. §Þnh nghÜa :§Þnh nghÜa :§Þnh nghÜa :§Þnh nghÜa :Chuçi lµ mét m¶ng mµ c¸c phÇn tö cña nã cã kiÓu ký tù.

Khai b¸o mét chuçi ký tù chøa tèi ®a 49 ký tù

char chuçi[50];

* L−u ý: TÊt c¶ c¸c chuçi ®Òu ®−îc kÕt thóc b»ng ký tù NULL (\0). Do ®ã, nÕu chuçi dµi 50 th× ta chØ cã thÓ chøa tèi ®a 49 ký tù.

I.6.2.I.6.2.I.6.2.I.6.2. Khëi ®éng trÞ:Khëi ®éng trÞ:Khëi ®éng trÞ:Khëi ®éng trÞ:

char chuçi[ ] = {‘A’, ‘N’, ‘H’, ‘ \0’};

char chuçi[ ] = "ANH";

I.6.3.I.6.3.I.6.3.I.6.3. NhËp / xuÊt chuçi:NhËp / xuÊt chuçi:NhËp / xuÊt chuçi:NhËp / xuÊt chuçi:

a. NhËp chuçi: a. NhËp chuçi: a. NhËp chuçi: a. NhËp chuçi: gets (chuçi)gets (chuçi)gets (chuçi)gets (chuçi)

b. XuÊt chuçi:b. XuÊt chuçi:b. XuÊt chuçi:b. XuÊt chuçi: puts (chuçi)puts (chuçi)puts (chuçi)puts (chuçi)

Chó ýChó ýChó ýChó ý::::

- Khi nhËp chuçi th× kh«ng ®−îc dïng hµm scanf v× hµm scanf kh«ng chÊp nhËn kho¶ng tr¾ng.

VÝ dô: scanf(“%s”, chuçi); // ta nhËp vµo NguyÔn V¨n ¸i th×

Page 31: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 31

// chuçi = “NguyÔn” v× hµm scanf c¾t kho¶ng tr¾ng

- Khi dïng hµm gets trong ch−¬ng tr×nh th× kh«ng nªn dïng hµm scanf ë bÊt k× ®©u dï r»ng dïng hµm scanf ®Ó nhËp sè mµ ta nªn dïng hµm gets vµ hµm atoi, atof ®Ó nhËp sè.

V× : scanf(“%d”, &n); // ta nhËp sè 5 ↵ gets (chuçi); // lóc nµy chuçi = ““ (chuçi rçng)

I.6.4I.6.4I.6.4I.6.4. Hµm chuyÓn ®æi sè sang chuçi vµ ng−îc l¹iHµm chuyÓn ®æi sè sang chuçi vµ ng−îc l¹iHµm chuyÓn ®æi sè sang chuçi vµ ng−îc l¹iHµm chuyÓn ®æi sè sang chuçi vµ ng−îc l¹i

sèint = atoi (chuçisè) // chuyÓn chuçi sè sang sè nguyªn sèf = atof (chuçisè) // chuyÓn chuçi sè sang sè thùc

* Hai hµm nµy n»m trong < stdlib .h >

I.6.5.I.6.5.I.6.5.I.6.5. C¸c hµm vÒ chuçiC¸c hµm vÒ chuçiC¸c hµm vÒ chuçiC¸c hµm vÒ chuçi:::: (# include < string. h> )(# include < string. h> )(# include < string. h> )(# include < string. h> )

- int strlen(S) int strlen(S) int strlen(S) int strlen(S) : tr¶ vÒ chiÒu dµi chuçi S.

- int strcmp(S1, S2)int strcmp(S1, S2)int strcmp(S1, S2)int strcmp(S1, S2): so s¸nh chuçi S1 víi S2. NÕu chuçi S1 gièng S2 kÕt qu¶ b»ng 0. NÕu chuçi S1< S2 kÕt qu¶ lµ ©m, nÕu chuçi S1> S2 kÕt qu¶ > 0.

- int stricmp(S1, S2)int stricmp(S1, S2)int stricmp(S1, S2)int stricmp(S1, S2): so s¸nh chuçi S1, S2 kh«ng ph©n biÖt ch÷ th−êng hay ch÷ hoa

- int strncmp(S1, S2, n)int strncmp(S1, S2, n)int strncmp(S1, S2, n)int strncmp(S1, S2, n): chØ so s¸nh n ký tù ®Çu cña 2 chuçi S1, S2 víi nhau.

- int strnicmp(S1, S2, n)int strnicmp(S1, S2, n)int strnicmp(S1, S2, n)int strnicmp(S1, S2, n): chØ so s¸nh n ký tù ®Çu cña 2 chuçi S1, S2 víi nhau, kh«ng ph©n biÖt ch÷ th−êng, ch÷ hoa

- strcpy(dest, source)strcpy(dest, source)strcpy(dest, source)strcpy(dest, source): chÐp chuçi tõ nguån source sang ®Ých dest

VÝ dô: char string[10];

char *str1 = "abcdefghi"; strcpy(string, str1); printf("%s\n", string); // "abcdefghi"

- strncpy(dest, source, n)strncpy(dest, source, n)strncpy(dest, source, n)strncpy(dest, source, n): chÐp chuçi tõ nguån sang ®Ých víi 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 thóc chuçi vµo cuèi chuçi. printf("%s\n", string); // "abc"

- strcat(dest, src)strcat(dest, src)strcat(dest, src)strcat(dest, src): nèi chuçi src vµo sau chuçi dest. ChiÒu dµi cña chuçi kÕt qu¶ b»ng strlen(dest) + strlen(src)

Page 32: Ky Thuat viet lap trinh

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)strncat(dest, src, n)strncat(dest, src, n)strncat(dest, src, n): nèi nhiÒu nhÊt lµ n ký tù cña src vµo cuèi chuçi dest, sau ®ã thªm ký tù null vµo cuèi chuçi 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"

- charcharcharchar * strchr(s, ch)* strchr(s, ch)* strchr(s, ch)* strchr(s, ch): tr¶ vÒ ®Þa chØ cña ký tù ch ®Çu tiªn cã trong chuçi S; nÕu kh«ng cã th× tr¶ vÒ NULL (th−êng dïng ®Ó 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("Kh«ng t×m thÊy ký tù %c\n",c);

- char * strstr(S1, S2)* strstr(S1, S2)* strstr(S1, S2)* strstr(S1, S2): tr¶ vÒ vÞ trÝ cña chuçi S2 trong chuçi S1; nÕu S2 kh«ng cã trong S1 th× hµm strstr tr¶ vÒ trÞ NULL.

I.6.6.I.6.6.I.6.6.I.6.6. M¶ng c¸c chuçiM¶ng c¸c chuçiM¶ng c¸c chuçiM¶ng c¸c chuçi

****Khai b¸oKhai b¸oKhai b¸oKhai b¸o: : : : Khai b¸o biÕn dsdsdsds chøa tèi ®a 50 chuçi ký tù, mçi chuçi ký tù cã tèi ®a 30 ký tù.

char ds[50 ] [30]; Chó ý:

- Kh«ng nªn g¸n chuçi víi chuçi (s1= s2) mµ ph¶i dïng hµm strcpy(S1,S2)

- Kh«ng ®−îc so s¸nh 2 chuçi b»ng c¸c to¸n tö quan hÖ (S1== S2, S1>S2, S1>= S2), mµ ph¶i dïng hµm strcmp(S1,S2).

Page 33: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 33

VÝ dô: ViÕt ch−¬ng 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(“Kh«ng cã tõ”); else printf(“cã tõ”); }

II. II. II. II. C¸c cÊu tróc ®iÒu khiÓn trong CC¸c cÊu tróc ®iÒu khiÓn trong CC¸c cÊu tróc ®iÒu khiÓn trong CC¸c cÊu tróc ®iÒu khiÓn trong C::::

Ng«n ng÷ C lµ ng«n ng÷ lËp tr×nh cÊp cao cã cÊu tróc, gåm: cÊu tróc tuÇn tù, chän, vµ lÆp.

II.1 II.1 II.1 II.1 CÊu tróc tuÇnCÊu tróc tuÇnCÊu tróc tuÇnCÊu tróc tuÇn tùtùtùtù (Sequence) :(Sequence) :(Sequence) :(Sequence) :

C¸c lÖnh trong ch−¬ng tr×nh ®−îc thùc hiÖn tuÇn tù tõ lÖnh nµy ®Õn lÖnh kh¸c cho ®Õn khi hÕt ch−¬ng tr×nh.

VÝ du : ViÕt ch−¬ng tr×nh tÝnh vµ in ra diÖn tÝch cña hai ®−êng trßn b¸n kÝnh lÇn l−ît lµ 3m vµ 4.5m cïng víi hiÖu sè cña 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);

Page 34: Ky Thuat viet lap trinh

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.II.2.II.2.II.2. CÊu trCÊu trCÊu trCÊu tróc chänóc chänóc chänóc chän

Ký hiÖu : ®k lµ biÓu thøc Logic

S1, S2 lµ c¸c ph¸t biÓu hay 1 nhãm c¸c ph¸t biÓu (lÖnh)

II.2.1.II.2.1.II.2.1.II.2.1. LÖnh if else:LÖnh if else:LÖnh if else:LÖnh if else:

Có ph¸pCó ph¸pCó ph¸pCó ph¸p::::

if (®k) S1;

ÑKNO

YES

S1

if (®k) S1;

else S2; ÑK S1

S2

NO

YES

Chó ý: C¸c lÖnh if else lång nhau

if (®k1) S1; else if (®k2) S2; else if (®k3) S3; else S4;

VÝ dô 1: T×m max(a,b,c)

Page 35: Ky Thuat viet lap trinh

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

f(x) = x2 , nÕu -2 < = x< 2 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.II.2.2.II.2.2.II.2.2. LÖnh chän lùa: switch_caseLÖnh chän lùa: switch_caseLÖnh chän lùa: switch_caseLÖnh chän lùa: switch_case

Có ph¸pCó ph¸pCó ph¸pCó ph¸p::::

switch (biÓu thøc)

{ case h»ng 1: S1;

case h»ng 2: S2; break;

.

.

.

case h»ng 3: Sn; break;

default: S0;

}

C¸ch ho¹t ®éngC¸ch ho¹t ®éngC¸ch ho¹t ®éngC¸ch ho¹t ®éng:

- (biÓuthøc) cã kÕt qu¶ nguyªn

- H»ng: ký tù, sè nguyªn, biÓu thøc 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ù thùc hiÖn hÕt c¸c lÖnh ë d−íi cho ®Õn khi hÕt lÖnh switch.

- Muèn ng¾t sù tuÇn tù trªn th× ph¶i dïng 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()

Page 36: Ky Thuat viet lap trinh

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 ch−¬ng tr×nh t¹o 1 m¸y tÝnh cã 4 phÐp to¸n + , - , * , /

#include <stdio.h> #include <conio.h> void main() {

Page 37: Ky Thuat viet lap trinh

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¹, kh«ng biÕt"); }

}

II.3.II.3.II.3.II.3. CÊu tróc lÆpCÊu tróc lÆpCÊu tróc lÆpCÊu tróc lÆp

II.3.1.II.3.1.II.3.1.II.3.1. LÖnh whileLÖnh whileLÖnh whileLÖnh while:

Có ph¸pCó ph¸pCó ph¸pCó ph¸p::::

While (bt)

S; ÑK

NO

YES

S

Chó ý: Trong phÇn th©n lÖnh ph¶i cã biÕn ®iÒu khiÓn vßng lÆp.

VÝ dô 1: ViÕt ch−¬ng tr×nh in ra b¶ng m· ASCII

void main () { int n=0; while (n <= 255)

Page 38: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 38

{ printf(“%c cã m· ASCII lµ %d”, n, n); n ++ } }

VÝ dô 2: NhËp mét chuçi ký tù, vµ kÕt thóc 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 ch−¬ng tr×nh in b¶ng cöu ch−¬ng

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.II.3.2.II.3.2.II.3.2. LÖnh do while:LÖnh do while:LÖnh do while:LÖnh do while:

Có ph¸pCó ph¸pCó ph¸pCó ph¸p:

do

S

while (bt);

S

ñkNo

Yes

VÝ dô 1: ViÕt ch−¬ng tr×nh in b¶ng m· ASCII

#include <stdio.h>

Page 39: Ky Thuat viet lap trinh

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. II.3.3. II.3.3. II.3.3. LÖnh for:LÖnh for:LÖnh for:LÖnh for:

Có ph¸pCó ph¸pCó ph¸pCó ph¸p::::

for ([bt_khëi ®é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 vßng lÆp while - for:

bt_khëi ®éng; while (BiÓuThøc_®K) { S; BT_lÆp; }

for ( bt_khëi ®éng; bt_®k; bt_lÆp) S;

VÝ dô 3: ViÕt ch−¬ng tr×nh in ra b¶ng cöu ch−¬ng b»ng vßng 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 ch−¬ng tr×nh tÝnh n giai thõa

Page 40: Ky Thuat viet lap trinh

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 ch−¬ng tr×nh tÝnh biÓu thøc:

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

}

* * * * Ph¸t biÓu break, continue, goto:Ph¸t biÓu break, continue, goto:Ph¸t biÓu break, continue, goto:Ph¸t biÓu break, continue, goto:

1. Break:1. Break:1. Break:1. Break:

LÖnh break cho phÐp tho¸t ra sím khái vßng lÆp ( whiledo , for, dowhile), lÖnh switch.

2. 2. 2. 2. LÖnh continue:LÖnh continue:LÖnh continue:LÖnh continue:

LÖnh continue chØ dïng trong vßng lÆp lµm cho ch−¬ng tr×nh nh¶y t¾t vÒ ®iÒu kiÖn kiÓm tra cña vßng lÆp ®Ó b¾t ®Çu mét vßng lÆp míi.

VÝ dô: ViÕt ch−¬ng tr×nh nhËp mét c©u ch÷ th−êng kÕt thóc 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; }

Page 41: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 41

}

3. LÖnh goto: 3. LÖnh goto: 3. LÖnh goto: 3. LÖnh goto: dïng ®Ó chuyÓn ®iÒu khiÓn ch−¬ng tr×nh vÒ mét vÞ trÝ nµo ®ã.

Có ph¸pCó ph¸pCó ph¸pCó ph¸p: Goto nh·n; LÖnh goto sÏ chuyÓn ®iÒu khiÓn ch−¬ng tr×nh ngay lËp tøc vÒ vÞ trÝ ®Æt

nh·n. VÝ dô: Again:::: ;;;; . . goto Again;

Bµi tËpBµi tËpBµi tËpBµi tËp::::

1. ViÕt ch−¬ng tr×nh tÝnh diÖn tÝch

- H×nh vu«ng - H×nh thang - Tam gi¸c th−êng - Tam gi¸c vu«ng - H×nh trßn

2. TÝnh kho¶ng c¸ch mét ®iÓm (X0, Y0) tíi mét ®−êng th¼ng Ax + By + C = 0

BA

CByAxS2200

+

++= , nhËp A, B, C, X0, Y0

3. Cho 3 sè thùc 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 ch−¬ng tr×nh t×m sè lín nhÊt trong 3 sè nguyªn a,b, c

5. Gi¶i ph−¬ng tr×nh bËc 2 Ax2+Bx+C = 0 trªn tr−êng sè thùc.

6. ViÕt ch−¬ng tr×nh tÝnh diÖn tÝch h×nh trßn, biÕt b¸n kÝnh r d−¬ng; Ch−¬ng tr×nh cã kiÓm tra sè liÖu nhËp vµo, nÕu r <=0 th× ch−¬ng tr×nh b¸o lçi vµ b¾t nhËp l¹i.

7. ViÕt ch−¬ng tr×nh nhËp sè thËp lôc ph©n in ra sè nhÞ ph©n, cø 4 sè th× c¸ch mét kho¶ng tr¾ng.

8. ViÕt ch−¬ng tr×nh t¹o 1 m¸y tÝnh gåm c¸c phÐp to¸n sau : + , - , * , / , ^ (ax víi x nguyªn d−¬ng), @ (ex )

Page 42: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 42

9. ViÕt ch−¬ng tr×nh kiÓm tra 1 bit bÊt k× cña sè b»ng 0 hay 1

10. ViÕt ch−¬ng tr×nh tÝnh kÕt qu¶ cña mét sè sau khi dÞch ph¶i hoÆc dÞch tr¸i n lÇn.

11. §Õm sè lÇn xuÊt hiÖn cña tõ mét 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 ch−¬ng tr×nh ®æi c¸c ký tù ®Çu cña c¸c tõ ra ch÷ in, c¸c ký tù cßn l¹i ra ch÷ th−êng.

15. ViÕt ch−¬ng tr×nh cho phÐp ta kiÓm tra mét password lµ ®óng hay sai (nhËp tèi ®a password 3 lÇn).

16. Cho chuçi s, viÕt ch−¬ng tr×nh di chuyÓn ch÷ tõ bªn tr¸i qua bªn ph¶i cña mµn h×nh t¹i dßng 5. Qu¸ tr×nh di chuyÓn dõng l¹i khi ta Ên phÝm ESC.

17. B¹n h·y viÕt ch−¬ng tr×nh tÝnh gi¸ trÞ tæng céng cña mét s¶n phÈm cã kÓ c¶ thuÕ, biÕt r»ng tû suÊt thuÕ lµ 13.6% tÝnh trªn gi¸ gèc. Gi¸ gèc cña s¶n phÈm ®−îc ®äc vµo, vµ cÇn in ra: - TiÒn thuÕ

- Gi¸ ®· cã thuÕ

18. Trong mét kú thi cuèi khãa, c¸c häc viªn ph¶i thi 4 m«n : m«n I hÖ sè 2, m«n II hÖ sè 4, m«n III hÖ sè 1, m«n IV hÖ sè 2, ®iÓm c¸c m«n cho tèi ®a lµ 10 ®iÓm. ViÕt ch−¬ng tr×nh nhËp ®iÓm cña 4 m«n vµ tÝnh ®iÓm trung b×nh.

19. Mét ng−êi b¸n r−îu b¸n N chai r−îu cã ®¬n gi¸ lµ P. NÕu tæng sè tiÒn v−ît qu¸ 5000000 th× viÖc chuyªn chë lµ miÓn phÝ, nÕu kh«ng phÝ chuyªn chë th−êng ®−îc tÝnh b»ng 1% tæng trÞ gi¸ hµng. ViÕt ch−¬ng tr×nh nhËp vµo N, P. In ra c¸c chi tiÕt Tæng trÞ gi¸ hµng, tiÒn chuyªn chë, vµ tæng sè tiÒn ph¶i tr¶.

20. Mét sinh viªn dù tuyÓn cã c¸c chi tiÕt sau : hä tªn, ®iÓm L1 cña lÇn 1, ®iÓm L2 cña lÇn 2, ®iÓm thi cuèi kú CK. ViÕt ch−¬ng tr×nh x¸c ®Þnh xem mét 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 c«ng thøc sau lín h¬n hay b»ng 7 : Max( (L1+L2+CK)/3, CK).

21. ViÕt ch−¬ng tr×nh cho biÕt tiÒn l−¬ng hµng ngµy cña mét ng−êi gi÷ trÎ. C¸ch tÝnh lµ 15000®/giê cho mçi giê tr−íc 14 giê vµ 25000 ®/giê cho mçi giê sau 14 giê. Giê b¾t ®Çu vµ giê kÕt thóc c«ng viÖc ®−îc nhËp tõ bµn phÝm.

22. Cho 3 sè thùc x, y z

a. Tån t¹i hay kh«ng mét tam gi¸c cã 3 c¹nh cã ®é dµi x, y, z ?

b. NÕu lµ tam gi¸c th× nã vu«ng, c©n, ®Òu hay th−êng

23. Gi¶i hÖ ph−¬ng tr×nh bËc nhÊt:

Page 43: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 43

ax+by = c

a’x+b’y = c’

H−íng dÉn:

D = a b

a’ b’

= ab’ - a’b

Dx= c b

c’ b’

= cb’ - c’b

Dy= a c

a’ c’

= 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Ö ph−¬ng tr×nh 3 Èn sè bËc nhÊt

a1 x + b1 y + c1 z = d1

a2 x + b2 y + c2 z = d2

a3 x + b3 y + c3 z = d3

25. ViÕt ch−¬ng tr×nh gi¶i ph−¬ng tr×nh trïng ph−¬ng ax4 + bx2 + c = 0

26. Ng−êi ta muèn lËp hãa ®¬n cho kh¸ch hµng cña C«ng ty ®iÖn lùc. ChØ sè ®Çu vµ chØ sè cuèi kú sÏ ®−îc cho biÕt. BiÕt r»ng biÓu gi¸ ®−îc tÝnh tïy theo ®iÖn n¨ng tiªu thô.

- NÕu ®iÖn n¨ng tiªu thô nhá h¬n 100Kwh, gi¸ mçi Kwh lµ 500®.

- NÕu ®iÖn n¨ng tiªu thô tõ 100Kwh trë lªn, th× mçi Kwh d«i ra sÏ ®−îc tÝnh gi¸ lµ 800®

- PhÝ khu vùc lµ 5000® cho mçi kh¸ch hµng. ViÕt ch−¬ng tr×nh tÝnh tiÒn ph¶i tr¶ tæng céng gåm tiÒn ®iÖn, vµ phÝ khu vùc

27. BiÕt 2 sè X, Y biÓu diÓn thêi gian tÝnh theo gi©y. Ng−êi ta muèn viÕt ch−¬ng tr×nh :

- §äc 2 sè nµy vµ in ra tæng cña chóng

- ChuyÓn c¸c sè nµy vµ tæng ra d¹ng giê, phÜt, gi©y cña chóng råi in ra. KiÓm xem kÕt qu¶ cña 2 c¸ch tÝnh cã nh− nhau kh«ng?

28. ViÕt ch−¬ng tr×nh in b¶ng cöu ch−¬ng tõ 2 → 9 theo hµng ngang

29. In tam gi¸c *, h×nh ch÷ nhËt *, rçng - ®Æc

30. VÏ l−u ®å vµ viÕt ch−¬ng tr×nh tÝnh :

a. 1+2+...+n

Page 44: Ky Thuat viet lap trinh

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 tæng sau ®©y sao cho sè h¹ng cuèi cïng cña tæng lµ kh«ng ®¸ng kÓ (sè h¹ng cuèi cïng < epsilon )

a. 1/1+ 1/2+ 1/3+1/4+.....

b. 1+ 1/22 + 1/32 +....+...

32. ViÕt ch−¬ng tr×nh in ra b¶ng m· ASCII, 16 ký tù trªn 1 dßng.

33. VÏ l−u ®å vµ viÕt ch−¬ng tr×nh :

a. XÐt mét sè cã ph¶i lµ sè nguyªn tè hay kh«ng ?

b. In trªn mµn h×nh 100 sè nguyªn tè ®Çu tiªn

34. ViÕt ch−¬ng tr×nh cho phÐp mét ký tù ngÉu nhiªn r¬i trªn mµn h×nh. NÕu ng−êi sö dông kh«ng kÞp Ên phÝm t−¬ng øng vµ ®Ó ch¹m ®¸y mµn h×nh th× thua cuéc.

35. Cho hµm Fibonacci:

Fn = {

1 ; n=0,1

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

a. T×m Fn, víi n do ta nhËp

b. In ra N phÇn tö ®Çu tiªn cña d·y Fibonacci

36. ViÕt ch−¬ng 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 gåm mét triÖu tõ 32 bit, h·y ®Õm sè bit 1 trong mçi tõ.

38. ViÕt ch−¬ng tr×nh ®o¸n sè : ng−êi ch¬i sÏ ®o¸n 1 sè trong ph¹m vi tõ 0 ®Õn 100, tèi ®a 5 lÇn. Ch−¬ng tr×nh kiÓm tra kÕt qu¶ vµ xuÊt th«ng b¸o h−íng dÉn:

- Sè b¹n ®o¸n lín h¬n

- Sè b¹n ®o¸n nhá h¬n

- B¹n ®o¸n ®óng

- M¸y th¾ng cuéc

Page 45: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 45

III. III. III. III. HHHHµm µm µm µm ---- §Ö quy§Ö quy§Ö quy§Ö quy::::

III.1. III.1. III.1. III.1. HµmHµmHµmHµm::::

III.1.1. III.1.1. III.1.1. III.1.1. Môc ®ÝchMôc ®ÝchMôc ®ÝchMôc ®Ých: : : : Hµm lµ mét ch−¬ng tr×nh con cña ch−¬ng tr×nh chÝnh, víi c¸c môc ®Ých sau:

* Tr¸nh viÖc lÆp ®i lÆp l¹i c¸c ®o¹n ch−¬ng tr×nh gièng nhau, nhê ®ã, ta sÏ tiÕt kiÖm lóc lËp tr×nh.

* Tæ chøc ch−¬ng tr×nh: Dïng hµm ta sÏ ph©n m¶nh ch−¬ng tr×nh thµnh nh÷ng khèi nhá ®éc lËp, mçi khèi lµ mét hµm thùc hiÖn mét c«ng viÖc nµo ®ã. Tõng hµm sÏ ®−îc lËp tr×nh, kiÓm tra hoµn chØnh; Sau ®ã, ta kÕt l¹i ®Ó t¹o ch−¬ng tr×nh hoµn chØnh. Nhê vËy, ch−¬ng tr×nh vÒ sau dÓ hiÓu vµ dÓ s÷a.

* TÝnh ®éc lËp: cho phÐp hµm ®éc lËp víi ch−¬ng tr×nh chÝnh. VÝ dô hµm cã nh÷ng biÕn côc bé mµ ch−¬ng tr×nh chÝnh vµ c¸c hµm kh¸c kh«ng thÓ ®ông tíi. Do ®ã, nÕu ta cã khai b¸o c¸c biÕn trïng tªn víi c¸c hµm kh¸c th× còng kh«ng sî ¶nh h−ëng tíi c¸c biÕn trïng tªn ®ã.

Chó ýChó ýChó ýChó ý:

- C kh«ng cho phÐp c¸c hµm lång nhau nghÜa lµ c¸c hµm ®Òu ngang cÊp nhau (cã thÓ gäi lÉn nhau).

- C kh«ng ph©n biÖt thñ tôc hay hµm, mµ chØ quan t©m ®Õn kÕt qu¶ tr¶ vÒ cña hµm. NÕu hµm kh«ng tr¶ vÒ kÕt qu¶ g× c¶ th× cã thÓ xem lµ thñ tôc.

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 kh«ng tr¶ vÒ trÞ nµo c¶ { int i,j ; // i, j lµ 2 biÕn côc 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); // lêi gäi hµm getch(); }

Page 46: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 46

III.1.2.III.1.2.III.1.2.III.1.2. Có ph¸p ®Þnh nghÜa hµmCó ph¸p ®Þnh nghÜa hµmCó ph¸p ®Þnh nghÜa hµmCó ph¸p ®Þnh nghÜa hµm

Có ph¸pCó ph¸pCó ph¸pCó ph¸p:

KiÓu tªnhµm (ds ®èi sè) { Khai b¸o biÕn côc bé; lÖnh; [ return (expr);] }

- KiÓuKiÓuKiÓuKiÓu: Lµ kÕt qu¶ tr¶ vÒ cña hµm. NÕu kh«ng ghi kiÓu, C sÏ tù hiÓu lµ kiÓu int. NÕu kh«ng muèn cã kÕt qu¶ tr¶ vÒ th× ghi kiÓu voidvoidvoidvoid.

- Danh s¸ch ®èi sèDanh s¸ch ®èi sèDanh s¸ch ®èi sèDanh s¸ch ®èi sè: LiÖt kª c¸c ®èi sè vµ kiÓu cña ®èi sè gëi ®Õn hµm, c¸ch nhau bëi dÊu ','. NÕu kh«ng cã ®èi sè ta chØ cÇn ghi()

- LÖnh return: LÖnh return: LÖnh return: LÖnh return: cã c¸c d¹ng sau:

return;

return (expr);

return expr;

VÝ dô: Hµm chuyÓn ch÷ th−êng 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(); }

L−u ý:

- H¹n chÕ cña lÖnh return lµ chØ tr¶ vÒ mét kÕt qu¶.

- LÖnh return kh«ng nhÊt thiÕt ph¶i ë cuèi hµm. Nã cã thÓ xuÊt hiÖn ë bÊt kú n¬i nµo trong hµm. Khi gÆp lÖnh return, quyÒn ®iÒu khiÓn sÏ chuyÓn ngay vÒ ch−¬ng tr×nh gäi.

III.1.3.III.1.3.III.1.3.III.1.3. C¸c lo¹i truyÒn ®èi sèC¸c lo¹i truyÒn ®èi sèC¸c lo¹i truyÒn ®èi sèC¸c lo¹i truyÒn ®èi sè

a. TruyÒn theo trÞ

Page 47: Ky Thuat viet lap trinh

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 ch−¬ng tr×nh trªn:

Nhap a b : 12 24 Gia tri lon nhat =24 Gia tri a =12 Gia tri b=24

NhËn xÐt:

- Ta nhËn thÊy r»ng gi¸ trÞ hai biÕn a, b tr−íc vµ sau khi vµo hµm max lµ kh«ng thay ®æi (mÆc dï trong hµm max, c¶ hai biÕn a vµ b ®Òu thay ®æi); ®ã lµ c¬ chÕ cña sù truyÒn ®èi sè theo trÞ.

Lêi gäi hµmLêi gäi hµmLêi gäi hµmLêi gäi hµm: tªnhµm (ds ®èisèthùc);tªnhµm (ds ®èisèthùc);tªnhµm (ds ®èisèthùc);tªnhµm (ds ®èisèthùc);

- NÕu truyÒn ®èi sè theo trÞ th× ®èi sè thùc cã thÓ lµ biÕn, hoÆc cã thÓ lµ biÓu thøc.

VÝ dô: c = max(1000,b);

b. TruyÒn theo ®Þa chØ:::: ®èi sè thùc lµ ®Þa chØ cña biÕn

#include <stdio.h> #include <conio.h>

Page 48: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 48

max (int &aint &aint &aint &a,int b) { int m= a>b? a : b;a>b? a : b;a>b? a : b;a>b? a : b; a=a *100;a=a *100;a=a *100;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);c=max(a,b);c=max(a,b);c=max(a,b); // a lµ tham sè thùc 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 ch−¬ng tr×nh trªn:

Nhap a b : 12 24 Gia tri lon nhat =24 Gia tri a =1200 Gia tri b=24

NhËn xÐt:

- Ta nhËn thÊy r»ng gi¸ trÞ biÕn a tr−íc vµ sau khi vµo hµm max ®· thay ®æi; ®ã lµ c¬ chÕ cña sù truyÒn ®èi sè theo ®Þa chØ.

Lêi gäi hµmLêi gäi hµmLêi gäi hµmLêi gäi hµm: tªnhµm (tªnbiÕn);tªnhµm (tªnbiÕn);tªnhµm (tªnbiÕn);tªnhµm (tªnbiÕn);

- NÕu truyÒn ®èi sè theo ®Þa chØ th× tham sè thùc b¾t buéc ph¶i lµ mét 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Þ cña 2 biÕn nguyªn a,b.

void giaohoan (int &a, int &b) { int tam; tam = a; a = b; b = tam; }

Page 49: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 49

void main() { int a,b; printf ("a, b = "); scanf ("%d %d", &a, &b); giaohoan(a, b); }

* TruyÒn ®èi sè lµ m¶ng gäihµm (mang)

hµm (kiÓu mang[]) hoÆc hµm(kiÓu *mang)

VÝ dô: Céng thªm mét 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.III.1.4.III.1.4.III.1.4. Khai b¸o nguyªn mÉu cña hµmKhai b¸o nguyªn mÉu cña hµmKhai b¸o nguyªn mÉu cña hµmKhai b¸o nguyªn mÉu cña hµm

- Khai b¸o hµm theo nguyªn mÉu ®ßi hái ph¶i khai b¸o kiÓu d÷ liÖu cña ®èi sè n»m trong ®Þnh nghÜa hµm chø kh«ng ®Æt chóng trªn c¸c dßng riªng.

- C kh«ng 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 phÐp ch−¬ng tr×nh dÞch ph¸t hiÖn cã lçi do kh«ng ®óng kiÓu d÷ liÖu gi÷a trÞ truyÒn ®Õn hµm vµ trÞ mµ hµm mong muèn.

VÝ dô:

float dinhthuc (float a, float b, float c, float d) { return (a*d- b*c); } void main()

Page 50: Ky Thuat viet lap trinh

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.III.1.5.III.1.5.III.1.5. Ph¹m vi tån tPh¹m vi tån tPh¹m vi tån tPh¹m vi tån t¹i cña biÕn:¹i cña biÕn:¹i cña biÕn:¹i cña biÕn:

a. BiÕn toµn côc: lµ biÕn ®−îc khai b¸o ngoµi c¸c hµm ( kÓ c¶ hµm main). Nã ®−îc phÐp truy nhËp ®Õn tõ tÊt c¶ c¸c hµm trong suèt thêi gian ch−¬ng 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 côc void main() { }

b. BiÕn côc bé: lµ biÕn ®−îc khai b¸o trong c¸c hµm, kÓ c¶ trong hµm main. Nã kh«ng cho phÐp c¸c hµm kh¸c truy nhËp ®Õn nã. Nã tån t¹i trong thêi gian sèng cña hµm chøa nã.

void main()

{ kiÓu tªn biÕn; → biÕn côc bé trong hµm main() }

c. BiÕn ngoµi : lµ biÕn mµ c¸c hµm cã thÓ truy xuÊt tíi mµ kh«ng ph¶i ph©n phèi bé nhí. Nã ®−îc dïng ë 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µ mét biÕn côc bé cña mét hµm nh−ng vÉn gi÷ gi¸ trÞ cña lÇn gäi hµm ®ã cuèi cïng

void main() { static KiÓu tªnbiÕn; }

e. BiÕn thanh ghi : lµ mét biÕn sö dông c¸c thanh ghi cña CPU ®Ó t¨ng tèc ®é truy xuÊt

register KiÓu tªnbiÕn ;

Page 51: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 51

III.1.6III.1.6III.1.6III.1.6. C¸c dÉn h−íng tiÒn xö lý. C¸c dÉn h−íng tiÒn xö lý. C¸c dÉn h−íng tiÒn xö lý. C¸c dÉn h−íng tiÒn xö lý

III.1.6.1. #defineIII.1.6.1. #defineIII.1.6.1. #defineIII.1.6.1. #define

a. ®Þnh nghÜa h»ng:

#define tªn h»ng gi¸ trÞ

VÝ dô: #define PI 3.14 #define MAX 100 #define THONGBAO “HÕt Gi¸" #define khoangtrang ‘ ‘

b. ®Þnh nghÜa Macro:

#define tªnmacro (®èi sè ) thao t¸c

VÝ dô: #define sqr (x) x*x #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ö dông c¸c dÊu ngoÆc ®Ó tr¸nh dÉn ra mét kÕt qu¶ sai

VÝ dô: #define max (a,b) ((a) > (b) ? (a) : (b)) #define ho¸nvÞ (a,b) { int t¹m =a; a= b; b= t¹m;} #define error (n) printf (“ error %d”, n)

D−íi ®©y mét 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 c«ng. §èi víi mçi macro, thµnh c«ng ®−îc ®Þnh nghÜa nh− sau:

MacroMacroMacroMacro Ký tùKý tùKý tùKý tù

Isalpha (c) c lµ ký tù a→ z, A→ Z Isupper (c) c lµ ký tù A → Z Islower (c) c lµ ký tù a → z isdigit (c) c lµ ký sè 0 → 9

Isxdigit (c) 0 → 9, A → F, a → z Iscntrl(c) c lµ ký tù xãa hoÆc ký tù ®iÒu khiÓn

(0x7F hoÆc 0x00 ®Õn 0x1F) Ispace (c) c lµ ký tù space, tab, carriage return,

new line (0x09 ®Õn 0x0D, 0x20)

Khai b¸o: char c;

Page 52: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 52

* Ph©n biÖt Macro víi hµmPh©n biÖt Macro víi hµmPh©n biÖt Macro víi hµmPh©n biÖt Macro víi hµm:

- Dïng Macro: truy xuÊt nhanh, tèn bé nhí.

- Dïng hµm: ng−îc l¹i

III.1.6.2. #includeIII.1.6.2. #includeIII.1.6.2. #includeIII.1.6.2. #include

Lµ tiÒn xö lý dïng ®Ó kÕt nèi tËp trung khai b¸o trong include víi 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− môc ®· ®−îc chØ ®Þnh trong Include Directories.

D¹ng “ ”: t×m tËp tin.h trong th− môc Source Directories, nÕu kh«ng cã, nã ®i t×m trong th− môc ®· ®−îc chØ ®Þnh trong Include Directories.

III.2. III.2. III.2. III.2. §Ö qui (Recursion)§Ö qui (Recursion)§Ö qui (Recursion)§Ö qui (Recursion)::::

III.2.1. III.2.1. III.2.1. III.2.1. Kh¸i niÖmKh¸i niÖmKh¸i niÖmKh¸i niÖm: : : : §Ö qui lµ 1 c«ng cô rÊt th−êng dïng trong khoa häc m¸y tÝnh vµ trong to¸n häc ®Ó gi¶i quyÕt c¸c vÊn ®Ò. Tr−íc hÕt, chóng ta h·y kh¶o s¸t thÕ nµo lµ mét vÊn ®Ò cã ®Ö qui qua vÝ dô sau:

TÝnh S(n) = 1 +2 +3 +4+ ...+n

Ta nhËn thÊy r»ng, c«ng thøc 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, mét vÊn ®Ò cã ®Ö qui lµ vÊn ®Ò ®−îc ®Þnh nghÜa l¹i b»ng chÝnh nã.

§Ó tÝnh S(n): ta cã kÕt qu¶ cña 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)

*Mét sè vÝ dô

1.1.1.1. Hµm giai thõaHµm giai thõaHµm giai thõaHµm giai thõa::::

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

1 , n=0

= {{{{ n*(n-1)! , n>0

1 , n=0

Page 53: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 53

NhËn xÐtNhËn xÐtNhËn xÐtNhËn xÐt:

- Theo c«ng thøc trªn, ta nhËn thÊy trong ®Þnh nghÜa cña n giai thõa (n!) cã ®Þnh nghÜa l¹i chÝnh nã nªn hµm giai thõa cã ®Ö qui.

- Víi n >=0 , ®iÒu kiÖn dõng tÝnh hµm giai thõa lµ n=1

2.2.2.2. Hµm FIBONACCIHµm FIBONACCIHµm FIBONACCIHµm FIBONACCI::::

Fn =

1 ; n =0,1

Fn-1 + Fn-2 ; n>1

- Theo ®Þnh nghÜa trªn, hµm Fibonacci cã lêi gäi ®Ö qui.

- Qu¸ tr×nh tÝnh dõng l¹i khi n= 1

III.2.2. Hµm ®Ö qui trong ng«n ng÷ C:Hµm ®Ö qui trong ng«n ng÷ C:Hµm ®Ö qui trong ng«n ng÷ C:Hµm ®Ö qui trong ng«n ng÷ C:

Ng«n ng÷ C cã trang bÞ c¬ chÕ gäi hµm ®Ö qui. Hµm ®Ö qui lµ hµm gäi ®Õn chÝnh hµm ®ã mét c¸ch trùc 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 dõng return 1; else // b−íc ®Ö 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 thõa n.

long giaithua(int n) { return ((n==0) ? 1 : n*giaithua(n-1)); }

III.2.3. III.2.3. III.2.3. III.2.3. HHHHµm ®Ö quiµm ®Ö quiµm ®Ö quiµm ®Ö qui vµ Stackvµ Stackvµ Stackvµ Stack:::: Mét ch−¬ng tr×nh C th−êng gåm cã hµm main() vµ c¸c hµm kh¸c. Khi ch¹y

ch−¬ng tr×nh C th× hµm main() sÏ ®−îc gäi ch¹y tr−íc, sau ®ã hµm main() gäi c¸c hµm kh¸c, c¸c hµm nµy trong khi ch¹y cã thÓ gäi c¸c hµm kh¸c n÷a. Khi

Page 54: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 54

mét hµm ®−îc gäi, th× mét khung kÝch ho¹t cña nã ®−îc t¹o ra trong bé nhí stack. Khung kÝch ho¹t nµy chøa c¸c biÕn côc bé cña hµm vµ mÉu tin ho¹t ®éng cña hµm. MÉu tin ho¹t ®éng chøa ®Þa chØ trë vÒ cña hµm gäi nã vµ c¸c tham sè kh¸c.

BiÕn côc bé

MÉu tin

ho¹t ®éng §Þa chØ trë vÒ

Th«ng sè kh¸c

Khung kÝch ho¹t

Sau khi hµm ®−îc gäi ®· thi hµnh xong th× ch−¬ng tr×nh sÏ thùc hiÖn tiÕp dßng lÖnh ë ®Þa chØ trë vÒ cña hµm gäi nã, ®ång thêi xãa khung kÝch ho¹t cña hµm ®ã khái bé nhí.

Gi¶ sö ta cã c¬ chÕ gäi hµm trong mét ch−¬ng tr×nh C nh− sau:

main()

{ ......

A();

.....;

B();

....;

}

A()

{.....;

C();

....;

D();

}

B()

{.....;

D();

}

C()

{......;

D();

.....;

}

D()

{........;

........;

}

H×nh sau ®©y cho ta thÊy sù chiÕm dông bé nhí stack khi ch¹y ch−¬ng tr×nh C nh− m« t¶ ë trªn.

bé nhí

Stack

D

C C C D D

A A A A A A A B B B

M M M M M M M M M M M M M

thêi gian

T−¬ng tù víi tr−êng hîp hµm ®Ö qui, khi gäi ®Ö qui lÉn nhau th× mét 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 tr−êng hîp khi lËp tr×nh, nÕu cã thÓ ®−îc ta nªn gì ®Ö qui cho c¸c bµi to¸n.

Page 55: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 55

IV. IV. IV. IV. StructureStructureStructureStructure:::: C¸c kiÓu ®¬n gi¶n t¹i mét thêi ®iÓm chØ l−u gi÷ ®−îc mét gi¸ trÞ duy nhÊt.

Cßn mét biÕn kiÓu m¶ng dïng ®Ó l−u tr÷ c¸c gi¸ trÞ cïng kiÓu d÷ liÖu víi nhau, ch½ng h¹n nh− mét d·y sè, mét d·y c¸c ký tù,...Nh−ng trong thùc tÕ, ®iÒu nµy vÉn ch−a ®ñ v× c¸c thµnh phÇn mµ ta l−u gi÷ th−êng lµ kh¸c kiÓu d÷ liÖu víi nhau.

VÝ dô : Ta muèn l−u gi÷ c¸c th«ng tin vÒ mét sinh viªn nh− sau : MASO, HO, TEN, NGAYSINH, NOISINH, PHAI, DIACHI, LOP . Víi c¸c thµnh phÇn nh− vËy, th× râ rµng c¸c thµnh phÇn cña 1 sinh viªn kh«ng thÓ cïng kiÓu mµ ph¶i thuéc 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 ®ã, ®Ó l−u tr÷ ®−îc c¸c thµnh phÇn kh¸c nhau cña mét ®èi t−îng ta ph¶i sö dông mét kiÓu d÷ liÖu trong C lµ Structure. Structure. Structure. Structure. (t−¬ng tù nh− record trong Pascal)

IV.1. IV.1. IV.1. IV.1. §Þnh nghÜa§Þnh nghÜa§Þnh nghÜa§Þnh nghÜa: : : :

Mét biÕn cã kiÓu structure ®−îc dïng ®Ó l−u tr÷ mét ®èi t−îng cã nhiÒu thµnh phÇn. C¸c thµnh phÇn cã thÓ thuéc c¸c kiÓu d÷ liÖu kh¸c nhau.

IV.2. IV.2. IV.2. IV.2. Khai b¸oKhai b¸oKhai b¸oKhai b¸o: Muèn khai b¸o kiÓu hocvienhocvienhocvienhocvien dïng ®Ó l−u tr÷ hä, tªn, ®iÓm m«n TOAN,LY,HOA, §TB, XÕp lo¹i cña mét häc 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 hvhvhvhv cã kiÓu hocvien hocvien hocvien hocvien :

struct hocvien hv;

- §Ó truy xuÊt tíi mét thµnh phÇn, ta dïng dÊu chÊm, vÝ dô nh−: hv.hohv.hohv.hohv.ho ®Ó truy xuÊt tíi hä cña häc viªn.

* Khai b¸o kÕt hîp: võa khai b¸o kiÓu structure võa khai b¸o biÕn cã kiÓu ®ã.

struct hocvien { char ho[30];

Page 56: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 56

char ten[7]; float toan, ly, hoa , dtb; char xeploai[10]; } hv1, hv2hv1, hv2hv1, hv2hv1, hv2; // khai b¸o 2 biÕn hv1, hv2 cïng kiÓu hocvien

- Khai b¸o structure lång 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 tr−êng hîp nµy, ®Ó truy xuÊt tíi th¸ng sinh cña häc viªn hv, ta viÕt nh− sau: hv.ngsinh.thang.hv.ngsinh.thang.hv.ngsinh.thang.hv.ngsinh.thang.

V. V. V. V. FILFILFILFILEEEE::::

V.1V.1V.1V.1.... File v¨n b¶nFile v¨n b¶nFile v¨n b¶nFile v¨n b¶n::::

- File v¨n b¶n lµ file ®−îc l−u tr÷ d−íi d¹ng kiÓu ký tù

Cã 2 c¸ch truy xuÊt theo kiÓu ký tù.

- Truy xuÊt theo tõng ký tù

- Truy xuÊt theo tõng dßng

V.1.1.V.1.1.V.1.1.V.1.1. Khai b¸o tËp tin:Khai b¸o tËp tin:Khai b¸o tËp tin:Khai b¸o tËp tin:

Khai b¸o biÕn kiÓu file: FILE *fptr

V.1.2.V.1.2.V.1.2.V.1.2. Më tËp tin:Më tËp tin:Më tËp tin:Më tËp tin:

fptr = fopen (“tªn file”, “kiÓu”);

- Trong "tªnfile" , ta cã thÓ chØ ®Þnh mét ®−êng dÉn ®Çy ®ñ nh− sau "C:\THU\KTLT\VIDU.TXT". Hµm fopen nÕu më file thµnh c«ng sÏ tr¶ vÒ mét 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

Page 57: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 57

kiÓu FILE).

NÕu kh«ng 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µ kh«ng cã file ®ã )

- KiÓu: gåm cã:

“r“ : ®äc ( file ph¶i cã s½n, nÕu kh«ng cã file, hµm fopen tr¶ vÒ trÞ NULL)

“w“ : ghi ( nÕu cã file sÏ xãa file cò ) “a” : nèi vµo cuèi tËp tin “r +”: ®äc / ghi, tËp tin ph¶i cã s½n trªn dÜa “a+”: ®äc, ghi vµo cuèi tËp tin, nÕu trªn dÜa ch−a 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 thóc ch−¬ng tr×nh, hµm exit thuéc vÒ stdlib.hkÕt thóc ch−¬ng tr×nh, hµm exit thuéc vÒ stdlib.hkÕt thóc ch−¬ng tr×nh, hµm exit thuéc vÒ stdlib.hkÕt thóc ch−¬ng tr×nh, hµm exit thuéc 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.V.1.3.V.1.3.V.1.3. §ãng file:§ãng file:§ãng file:§ãng file:

fclose (fptr)

V.1.4.V.1.4.V.1.4.V.1.4. §äc / ghi ký tù:§äc / ghi ký tù:§äc / ghi ký tù:§äc / ghi ký tù: Cho biÕn ký tù char ch;

- §äc ký tù tõ tËp tin

Page 58: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 58

ch = getc (fptr)

- Ghi ký tù lªn tËp tin

putc (ch, fptr)

VÝ dô 1: T¹o 1 file trùc tiÕp tõ bµn phÝm. Qu¸ tr×nh t¹o sÏ dõng 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) // më file míi ®Ó ghi { printf("Viec tao file co loi\n"); exit(0); } while ((ch=getche()) !='\r') putc(ch,fptr); fclose(fptr); }

VÝ dô 2: In néi 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) { printf("Viec mo file co loi\n"); exit(0);

Page 59: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 59

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

Page 60: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 60

VÝ dô 3: Ch−¬ng 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.V.1.5.V.1.5.V.1.5. §äc / ghi chuçi ký tù:§äc / ghi chuçi ký tù:§äc / ghi chuçi ký tù:§äc / ghi chuçi ký tù:

* Hµm fgets fgets fgets fgets (chuçi, chiÒudµi, fptr);

Hµm fgets ®äc 1 chuçi ký tù tõ trong file fptr vµo biÕn <chuçi> víi chiÒu dµi tèi ®a lµ <chiÒudµi>. Hµm nµy tr¶ vÒ NULL khi ®· ®äc hÕt file

* Hµm fputs fputs fputs fputs (chuçi, fptr): ghi 1 chuçi ký tù trong <chuçi> vµo file fptr. Hµm nµy kh«ng tù ®éng thªm vµo m· kÕt thóc ®Ó chuyÓn dßng míi, do ®ã ta ph¶i ghi thªm m· nµy vµo tËp tin b»ng lÖnh fputs ("fputs ("fputs ("fputs ("\\\\n", fptr);n", fptr);n", fptr);n", fptr);

VÝ dô 1: Ch−¬ng tr×nh ghi chuçi lªn file, cho ®Õn khi chuçi nhËp vµo lµ rçng th× kÕt thóc.

Page 61: Ky Thuat viet lap trinh

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 míi { 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 chuçi 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(); }

Page 62: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 62

V.1.6V.1.6V.1.6V.1.6. Xãa file:. Xãa file:. Xãa file:. Xãa file: LÖnh remove xo¸ file ®−îc chØ ®Þnh qua <tªnfile>

Có ph¸pCó ph¸pCó ph¸pCó ph¸p: removeremoveremoveremove (tªn file)

Hµm remove tr¶ vÒ 0 : xãa thµnh c«ng tr¶ vÒ -1 : cã lçi khi xãa file, vµ lóc nµy biÕn errno errno errno errno cã 1 trong 2 gi¸ trÞ sau: ENOENT : kh«ng t×m thÊy file muèn xãa EACCES : kh«ng cho phÐp xãa file mµ b¹n chØ ®Þnh

L−u ýL−u ýL−u ýL−u ý: File nªn ®ãng tr−íc khi xãa.

VÝ dô: Xãa 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 th«ng b¸o lçi mµ hµm remove g©y ra }

V.2. V.2. V.2. V.2. File nhÞ ph©nFile nhÞ ph©nFile nhÞ ph©nFile nhÞ ph©n (file cã cÊu tróc)(file cã cÊu tróc)(file cã cÊu tróc)(file cã cÊu tróc)

File nhÞ ph©n lµ file dïng ®Ó l−u tr÷ c¸c cÊu tróc d−íi d¹ng struct hoÆc union

V.2.1.V.2.1.V.2.1.V.2.1. Khai b¸o:Khai b¸o:Khai b¸o:Khai b¸o:

FILE * fptr;

V.2.2.V.2.2.V.2.2.V.2.2. Më file:Më file:Më file:Më file:

fptr = fopen (tªnfile, “kiÓu”);

. rb ( b: binary): më chØ ®Ó ®äc

. wb : ®Ó ghi. NÕu file ®· cã th× xãa tr−íc khi më.

. ab : nèi thªm; më ®Ó ghi thªm vµo cuèi file, nÕu file ch−a cã th× t¹o míi

. rb+ : më file ®· cã ®Ó cËp nhËt (®äc/ghi)

. wb+ : t¹o file míi cho phÐp ®äc/ghi

. ab+ : më ®Ó nèi thªm vÒ cuèi file, cho phÐp ®äc/ghi

Page 63: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 63

V.2.3.V.2.3.V.2.3.V.2.3. §ãng fi§ãng fi§ãng fi§ãng file:le:le:le:

fclose (fptr)

V.2.4.V.2.4.V.2.4.V.2.4. §äc/ghi file: §äc/ghi file: §äc/ghi file: §äc/ghi file: Hµm fread : fread : fread : fread : ®äc sè mÉu tin(cÊu tróc) trong file fptr vµo <biÕn cÊu tróc>.

fread (& biÕn cÊu tróc, sizeof (biÕn cÊu tróc) , sè cÊu tróc, fptr);fread (& biÕn cÊu tróc, sizeof (biÕn cÊu tróc) , sè cÊu tróc, fptr);fread (& biÕn cÊu tróc, sizeof (biÕn cÊu tróc) , sè cÊu tróc, fptr);fread (& biÕn cÊu tróc, sizeof (biÕn cÊu tróc) , sè cÊu tróc, fptr);

Hµm fread tr¶ vÒ sè cÊu tróc ®äc ®−îc

Hµm fwrite fwrite fwrite fwrite ghi d÷ liÖu trong <biÕn cÊu tróc> vµo file fptr.

fwrite (&biÕn cÊu tróc, sizeof (biÕn cÊu tróc) , sè cÊu tróc, fptr);fwrite (&biÕn cÊu tróc, sizeof (biÕn cÊu tróc) , sè cÊu tróc, fptr);fwrite (&biÕn cÊu tróc, sizeof (biÕn cÊu tróc) , sè cÊu tróc, fptr);fwrite (&biÕn cÊu tróc, sizeof (biÕn cÊu tróc) , sè cÊu tróc, fptr);

Hµm fwrite tr¶ vÒ sè cÊu tróc ghi ®−îc lªn file

Chó ýChó ýChó ýChó ý::::

- §Ó kiÓm tra viÖc ®äc file ta kiÓm tra sè cÊu tróc ®−îc ®äc. NÕu sè cÊu tróc tr¶ vÒ b»ng 0 mµ ta cÇn ®äc lµ 1 cÊu tróc th× ®iÒu ®ã chøng tá ®· hÕt file.

* Ghi mét m¶ng cÊu tróc lªn file* Ghi mét m¶ng cÊu tróc lªn file* Ghi mét m¶ng cÊu tróc lªn file* Ghi mét m¶ng cÊu tróc 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: Ch−¬ng 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) // më file nhÞ ph©n ®Ó ghi { printf ("Khong the tao file\n"); exit(0); } do { printf("Nhap ho ten hoc vien :"); gets(hv.hoten);

Page 64: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 64

if (strlen(hv.hoten) !=0) { printf("Nhap tuoi :"); gets(tuoi); hv.tuoi = atoi(tuoi); // macro doi chuoi qua so nguyen fwrite(&hv, sizeof(hv), 1, fptr) ; // ghi noi dung 1 mau tin trong bien hv // vao file fptr } } while (strlen(hv.hoten)!=0); fclose (fptr); }

VÝ dô 2: Ghi d÷ 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; }

Page 65: Ky Thuat viet lap trinh

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: Ch−¬ng tr×nh ®äc file nhÞ ph©n, vµ in danh s¸ch häc viªn ra mµn h×nh.

// In danh s¸ch häc 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.V.2.5.V.2.5.V.2.5. Truy xuÊt tËp tin ngÉu nhiªn: Truy xuÊt tËp tin ngÉu nhiªn: Truy xuÊt tËp tin ngÉu nhiªn: Truy xuÊt tËp tin ngÉu nhiªn: (®iÒu khiÓn con trá tËp tin trªn file nhÞ ph©n)

Page 66: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 66

* Con trá file: Mçi tËp tin ®Òu cã con trá file sau khi ®−îc më. Con trá file lµ con trá chØ ®Õn tõng byte trªn file. Khi ®äc hay ghi d÷ liÖu trªn tËp tin, ta ®· lµm dÞch chuyÓn con trá file mét sè byte, ®©y chÝnh lµ sè byte mµ kiÓu d÷ liÖu ®· chiÕm. Khi ®ãng råi më tËp tin, con trá file lu«n ë ®Çu tËp tin ; ngo¹i trõ tr−êng hîp ta më b»ng tïy chän 'a' th× con trá file sÏ ë cuèi tËp tin ®Ó ghi thªm d÷ liÖu vµo cuèi tËp tin. Hµm fseek cho phÐp ta di chuyÓn con trá file ®Õn vÞ trÝ mong muèn.

Có ph¸pCó ph¸pCó ph¸pCó ph¸p:

int fseek (FILE * fptr, long nbytes, kiÓu)

+ nbytes : sè bytes tÝnh tõ vÞ trÝ kiÓu cho ®Õn vÞ trÝ cÇn tíi

+ 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õ cuèi tËp tin)

NÕu fseek tr¶ vÒ 0 nghÜa lµ nã ®· di chuyÓn tíi vÞ trÝ ®ã.

L−u ý: sè thø tù trªn tËp tin tÝnh tõ 0.

VÝ dô: ViÕt ch−¬ng tr×nh truy xuÊt ngÉu nhiªn mét mÉu tin theo sè thø tù cña 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();

Page 67: Ky Thuat viet lap trinh

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.V.3.V.3.V.3. Ph¸t hiÖn lçi khi truy xuÊt tËp tinPh¸t hiÖn lçi khi truy xuÊt tËp tinPh¸t hiÖn lçi khi truy xuÊt tËp tinPh¸t hiÖn lçi khi truy xuÊt tËp tin

PhÇn lín nh÷ng hµm xuÊt, nhËp tËp tin chuÈn kh«ng th«ng b¸o râ néi dung cña lçi. Ch¼ng h¹n nh−:

- putc () sÏ tr¶ vÒ EOF khi cã lçi hoÆc cuèi tËp tin

- fgets () sÏ tr¶ vÒ lµ NULL khi ®äc hÕt file hoÆc khi cã lçi

Do ®ã, ®Ó ph¸t hiÖn lçi khi truy xuÊt tËp tin, ta dïng macro ferror (FILE *fptr)

int ferror (file * ptr)

Macro ferror tr¶ vÒ mét trÞ kh¸c 0 nÕu ph¸t hiÖn ra lçi trªn file fptr.

* §Ó xuÊt c©u th«ng b¸o lçi ta dïng hµm perror ()

void perror (const char * str)

víi str : chuçi ký tù chøa c©u th«ng b¸o

* Hai hµm nµy th−êng ®−îc sö dông ngay sau khi sö dông 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;

Page 68: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 68

fp = fopen("perror.dat", "r"); if (!fp) perror("Kh«ng thÓ më file ®Ó ®äc"); }

Khi ch¹y ch−¬ng tr×nh nµy, nÕu trªn dÜa ch−a cã tËp tin perror.dat th× sÏ hiÖn th«ng b¸o lçi: Kh«ng thÓ më file ®Ó ®äc: No such file or directory.

Bµi tËpBµi tËpBµi tËpBµ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 ch−¬ng tr×nh tÝnh diÖn tÝch dùa 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, víi n nguyªn.

5. ViÕt hµm ®Ö qui tÝnh phÇn tö thø n cña hµm Fibonacci.

6. ViÕt hµm ®Ö qui gi¶i quyÕt bµi to¸n Th¸p Hµ néi. Cã 3 cét A, B, C. Cét A hiÖn ®ang cã n dÜa kÝch th−íc kh¸c nhau, dÜa nhá ë trªn dÜa lín ë d−íi. H·y dêi n dÜa tõ cét A sang cét C (xem cét B lµ cét trung gian) víi ®iÒu kiÖn mçi lÇn chØ ®−îc dêi 1 dÜa vµ dÜa ®Æt trªn bao giê còng nhá h¬n dÜa ®Æt d−íi.

7. ViÕt ch−¬ng tr×nh m· hãa vµ gi¶i m· mét file v¨n b¶n sao cho nÕu ta ®· m· hãa råi th× ch−¬ng tr×nh kh«ng m· hãa n÷a, vµ nÕu file ®ã ch−a m· hãa th× kh«ng ®−îc gi¶i m·.

8. Cho biÕt trong mét 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 dßng; biÕt r»ng c¸c tõ c¸ch nhau kho¶ng tr¾ng, dÊu tab, dÊu chÊm.

9. ViÕt ch−¬ng tr×nh t¹o mét menu thùc hiÖn c¸c chøc n¨ng sau trªn file v¨n b¶n:

- T¹o file míi - §äc file - Xãa file - Ghi nèi ®u«i file - Copy file - Di chuyÓn file tõ th− môc nµy sang th− môc kh¸c - T×m mét tõ xuÊt hiÖn bao nhiªu lÇn trong file (kh«ng ph©n biÖt ch÷ in, ch÷

Page 69: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 69

th−êng) - Thay thÕ tõ nµy b»ng tõ kh¸c

10. T¹o menu thùc hiÖn c¸c c«ng viÖc sau:

- NhËp danh s¸ch cã kiÓu häc viªn vµo mét file tªn 'HOSO.TXT', mçi häc viªn cã c¸c th«ng tin sau: maso (int), hoten (chuçi tèi ®a 30 ký tù), ph¸i (NAM/NU), tuæi (int).

- LiÖt kª danh s¸ch häc viªn ra mµn h×nh theo d¹ng sau:

M· sè Hä vµ tªn Ph¸i Tuæi

- Truy xuÊt ngÉu nhiªn theo thø tù mÉu tin

- T×m kiÕm mét ng−êi trong file theo m· sè

- CËp nhËt söa ®æi c¸c mÉu tin theo m· sè (NhËp m· sè, sau ®ã hiÖu chØnh l¹i hoten, phai, vµ tuæi).

- Xãa mét ng−êi trong file theo m· sè.

Page 70: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 70

CH−¬NG 3 CH−¬NG 3 CH−¬NG 3 CH−¬NG 3 C¸C THUËT TO¸N TR£N CÊU TRóC D÷ LIÖU M¶NGC¸C THUËT TO¸N TR£N CÊU TRóC D÷ LIÖU M¶NGC¸C THUËT TO¸N TR£N CÊU TRóC D÷ LIÖU M¶NGC¸C THUËT TO¸N TR£N CÊU TRóC D÷ LIÖU M¶NG

I. I. I. I. M¶ng kh«ng s¾p xÕp vµ thuËt to¸n t×m kiÕm trªn m¶ng M¶ng kh«ng s¾p xÕp vµ thuËt to¸n t×m kiÕm trªn m¶ng M¶ng kh«ng s¾p xÕp vµ thuËt to¸n t×m kiÕm trªn m¶ng M¶ng kh«ng s¾p xÕp vµ thuËt to¸n t×m kiÕm trªn m¶ng ch−a cã thø tùch−a cã thø tùch−a cã thø tùch−a cã thø tù

I.1. I.1. I.1. I.1. Mét sè kh¸i niÖm vÒ m¶nMét sè kh¸i niÖm vÒ m¶nMét sè kh¸i niÖm vÒ m¶nMét sè kh¸i niÖm vÒ m¶ngggg::::

I.1.1. I.1.1. I.1.1. I.1.1. §Þnh nghÜa:§Þnh nghÜa:§Þnh nghÜa:§Þnh nghÜa:

M¶ng lµ 1 d·y c¸c phÇn tö cã cïng kiÓu d÷ liÖu ®−îc s¾p xÕp liªn tiÕp nhau trong bé nhí

0100

0102 1 int

0104 2 M¶ng n phÇn tö

n-1

Bé nhí

˜̃̃̃ Khai b¸o:Khai b¸o:Khai b¸o:Khai b¸o:

Có ph¸pCó ph¸pCó ph¸pCó ph¸p: : : : Khai b¸o m¶ng 1 chiÒu

KiÓu_DL Tªnm¶ng [kÝch th−íc];

♦ KiÓu_DL : lµ 1 trong c¸c kiÓu d÷ liÖu c¬ b¶n, ®ã lµ kiÓu cña phÇn tö cña m¶ng

♦ Tªnm¶ng: lµ tªn cña m¶ng ®−îc ®Æt 1 c¸ch hîp lÖ

♦ KÝch th−íc: lµ 1 h»ng nguyªn cho biÕt sè phÇn tö tèi ®a cña m¶ng

VÝ dô 1: Khai b¸o 1 m¶ng sè nguyªn

• int n ; int M[n] ; SAI

• int M[10] ; ®óng v× kÝch th−íc m¶ng ph¶i lµ h»ng kh«ng ph¶i lµ biÕn

• #define max 100 int M[max] ;

VÝ dô 2: Khai b¸o 1 danh s¸ch hä tªn häc viªn cña 1 líp häc

char dshv[50][30]; // dshv cã thÓ chøa tèi ®a hä tªn 50 häc viªn, // chiÒu dµi hä tªn mçi häc viªn tèi ®a lµ 30 ký tù

Có ph¸pCó ph¸pCó ph¸pCó ph¸p:::: Khai b¸o m¶ng 2 chiÒu

Page 71: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 71

KiÓu_DL Tªnm¶ng [kÝch th−íc 1][kÝch th−íc 2]

Chó ýChó ýChó ýChó ý: Mét m¶ng trong C, c¸c phÇn tö ®−îc ®¸nh sè tõ 0 tíi n-1 VÝ dô: Víi M[10] th× thµnh phÇn thø 1 lµ M[0] thµnh phÇn cuèi cïng M[9]

* C kh«ng b¾t bÎ, kh«ng kiÓm tra xem biÕn ®Õm cã v−ît ra khái giíi h¹n cho phÐp cña m¶ng ch−a. Do ®ã, chóng ta ph¶i kiÓm tra biÕn ®Õm trong ch−¬ng tr×nh (ph¶i nhá h¬n n)

I.1.2.I.1.2.I.1.2.I.1.2. Khëi ®éng trÞ cho m¶ng:Khëi ®éng trÞ cho m¶ng:Khëi ®éng trÞ cho m¶ng:Khëi ®éng trÞ cho m¶ng:

Ta khëi ®éng ®−îc trÞ cho m¶ng trong 2 tr−êng hîp sau:

• M¶ng ®−îc khai b¸o lµ biÕn ngoµi (main) nghÜa lµ biÕn toµn côc

• M¶ng ®−îc khai b¸o côc bé VÝ dô 1 : int M[3] = {10,11,12} 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 víi M cã 3 phÇn tö

• Tõ khãa static dïng ®Ó khai b¸o 1 biÕn côc bé th−êng trùc cho phÐp duy tr× gi¸ trÞ riªng cña nã ë nh÷ng lÇn gäi hµm sau nµy.

• Khëi t¹o m¶ng 2 chiÒu:

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

I.1.3.I.1.3.I.1.3.I.1.3.Truy xuÊt thµnh phÇn cTruy xuÊt thµnh phÇn cTruy xuÊt thµnh phÇn cTruy xuÊt thµnh phÇn cña m¶ngña m¶ngña m¶ngña m¶ng: M[chØ sè]: M[chØ sè]: M[chØ sè]: M[chØ sè]

• Truy xuÊt thµnh phÇn thø 2 cña m¶ng 1 chiÒu: M[1] • Truy xuÊt thµnh phÇn thø i cña m¶ng 1 chiÒu: M[i-1] • Truy xuÊt thµnh phÇn dßng 2, cét 3 cña m¶ng 2 chiÒu M[1][2]

I.1.4. I.1.4. I.1.4. I.1.4. §äc (nhËp) d÷ liÖu cho m¶ng:§äc (nhËp) d÷ liÖu cho m¶ng:§äc (nhËp) d÷ liÖu cho m¶ng:§äc (nhËp) d÷ liÖu cho m¶ng:

- §Ó nhËp d÷ liÖu cho m¶ng ta ph¶i nhËp d÷ liÖu cho tõng thµnh phÇn cña m¶ng.

VÝ dô 1:

Page 72: Ky Thuat viet lap trinh

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. I.1.5. I.1.5. I.1.5. XuÊt d÷ liÖu kiÓu m¶ng: XuÊt d÷ liÖu kiÓu m¶ng: XuÊt d÷ liÖu kiÓu m¶ng: XuÊt d÷ liÖu kiÓu m¶ng: §Ó xuÊt d÷ liÖu m¶ng ta còng ph¶i xuÊt d÷ liÖu cña tõng 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. I.2. I.2. I.2. ThuËt to¸n t×m kiÕm trªn m¶ng ch−a cã thø tùThuËt to¸n t×m kiÕm trªn m¶ng ch−a cã thø tùThuËt to¸n t×m kiÕm trªn m¶ng ch−a cã thø tùThuËt to¸n t×m kiÕm trªn m¶ng ch−a cã thø tù::::

Do m¶ng ch−a cã thø tù nªn ta ¸p dông ph−¬ng ph¸p t×m kiÕm tuyÕn tÝnh t×m tõ ®Çu m¶ng cho ®Õn cuèi m¶ng. Trong ch−¬ng tr×nh sau ®©y, hµm TimkiÕm sÏ tr¶ vÒ trÞ -1 nÕu kh«ng cã m· sinh viªn trong danh s¸ch ds, ng−îc l¹i hµm sÏ tr¶ vÒ vÞ trÝ cña m· sè ®ã trong danh s¸ch ds.

#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> #define MAX_SOSV 100 // sè sinh viªn tèi ®a trong danh s¸ch typedef struct sinhvien // ®Þnh nghÜa kiÓu sinhvien

Page 73: Ky Thuat viet lap trinh

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_dsvoid Nhap_dsvoid Nhap_dsvoid 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_dsvoid Lietke_dsvoid Lietke_dsvoid 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(); } /* Hµm Timkiem t×m maso trong danhsach *psv *//* Hµm Timkiem t×m maso trong danhsach *psv *//* Hµm Timkiem t×m maso trong danhsach *psv *//* Hµm Timkiem t×m maso trong danhsach *psv */ int Timkiem(danhsach_sv *psv, char maso[]) int Timkiem(danhsach_sv *psv, char maso[]) int Timkiem(danhsach_sv *psv, char maso[]) int Timkiem(danhsach_sv *psv, char maso[]) { int i=0;{ int i=0;{ int i=0;{ int i=0; while ((i<psvwhile ((i<psvwhile ((i<psvwhile ((i<psv---->tssv) && (strcmp(psv>tssv) && (strcmp(psv>tssv) && (strcmp(psv>tssv) && (strcmp(psv---->sv[i].maso, maso)!=0))>sv[i].maso, maso)!=0))>sv[i].maso, maso)!=0))>sv[i].maso, maso)!=0)) i++;i++;i++;i++; return (i==psvreturn (i==psvreturn (i==psvreturn (i==psv---->tssv ? >tssv ? >tssv ? >tssv ? ----1 : i) ;1 : i) ;1 : i) ;1 : i) ;

Page 74: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 74

}}}} void mainvoid mainvoid mainvoid main()

{ struct danhsach_sv ds;

char maso[6];

int vitri;

Nhap_ds(&ds); // Gäi hµm Nhap_ds víi 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. II. II. II. C¸c thuËt to¸n s¾p xÕpC¸c thuËt to¸n s¾p xÕpC¸c thuËt to¸n s¾p xÕpC¸c thuËt to¸n s¾p xÕp::::

Trong thùc tÕ cuéc sèng còng nh− trong lÜnh vùc lËp tr×nh, viÖc qu¶n lü d÷ liÖu th−êng ®ßi hái 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 th−êng ®−îc s½p xÕp theo mét thø tù nµo ®ã.

Cã rÊt nhiÒu ph−¬ng ph¸p s¾p thø tù, trong bµi gi¶ng nµy ta chØ kh¶o s¸t hai ph−¬ng 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ã tèi ®a 100 sè, vµ c¸c thuËt to¸n d−íi ®©y dïng ®Ó s¾p xÕp d·y sè theo thø tù t¨ng dÇn.

II.1. II.1. II.1. II.1. S¾p xÕp theo ph−¬ng ph¸p Bubble_SortS¾p xÕp theo ph−¬ng ph¸p Bubble_SortS¾p xÕp theo ph−¬ng ph¸p Bubble_SortS¾p xÕp theo ph−¬ng ph¸p Bubble_Sort (ph−¬ng ph¸p næi bät)(ph−¬ng ph¸p næi bät)(ph−¬ng ph¸p næi bät)(ph−¬ng ph¸p næi bät)

- Néi dung : Ta cho i duyÖt d·y a[0], .. ,a[n-1]; nÕu a[i-1] lín h¬n 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 kh«ng cã x¶y ra viÖc ®æi chç cña hai phÇn tö.

VÝ dô: Ta s¾p thø tù d·y sè sau : 26 33 35 29 19 12 32

B−íc 0B−íc 0B−íc 0B−íc 0 1111 2222 3333 4444 5555 6666

26 12 12 12 12 12 12 33 26 19 19 19 19 19 35 33 26 26 26 26 26 29 35 33 29 29 29 29 19 29 35 33 32 32 32

Page 75: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 75

12 19 29 35 33 33 33 32 32 32 32 35 35 35

- Ch−¬ng tr×nh: #include <stdio.h> #include <conio.h> int mang[100]; // biÕn toµn côc int size ; void Bubble_Sort(int A[100], int n)void Bubble_Sort(int A[100], int n)void Bubble_Sort(int A[100], int n)void Bubble_Sort(int A[100], int n) { int i,j,temp;{ int i,j,temp;{ int i,j,temp;{ int i,j,temp; for (i=1; i<n; for (i=1; i<n; for (i=1; i<n; for (i=1; i<n; i++)i++)i++)i++) for (j=nfor (j=nfor (j=nfor (j=n----1;j>=i; j1;j>=i; j1;j>=i; j1;j>=i; j--------)))) if (A[jif (A[jif (A[jif (A[j----1] > A[j])1] > A[j])1] > A[j])1] > A[j]) { { { { temp = A[jtemp = A[jtemp = A[jtemp = A[j----1];1];1];1]; A[jA[jA[jA[j----1] = A[j];1] = A[j];1] = A[j];1] = A[j]; A[j] = temp;A[j] = temp;A[j] = temp;A[j] = temp; }}}} }}}} int Nhap_day_soint Nhap_day_soint Nhap_day_soint 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_kevoid Liet_kevoid Liet_kevoid 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 mainvoid mainvoid mainvoid main() { size= Nhap_day_so(mang); Bubble_Sort(mang,size);

Page 76: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 76

Liet_ke(mang,size); }

Ta nhËn thÊy ph−¬ng 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µ kh«ng cã cã sù ®æi chç gi÷a hai phÇn tö th× d·y ®· cã thø tù vµ gi¶i thuËt kÕt thóc. Trong tr−êng hîp nµy, ta dïng mét 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. II.2. II.2. II.2. S¾p xÕp theo ph−¬ng ph¸p Quick_SortS¾p xÕp theo ph−¬ng ph¸p Quick_SortS¾p xÕp theo ph−¬ng ph¸p Quick_SortS¾p xÕp theo ph−¬ng ph¸p Quick_Sort

II.2.1. II.2.1. II.2.1. II.2.1. Néi dungNéi dungNéi dungNéi dung: Chän mét phÇn tö bÊt kú trong danh s¸ch lµm ®iÓm chèt x, so s¸nh vµ ®æi chç nh÷ng phÇn tö trong danh s¸ch nµy ®Ó t¹o ra 3 phÇn: phÇn cã gi¸ trÞ nhá h¬n x, phÇn cã gi¸ trÞ b»ng x, vµ phÇn cã gi¸ trÞ lín h¬n x. L¹i tiÕp tôc chia 2 phÇn cã gi¸ trÞ nhá h¬n vµ lín h¬n x theo nguyªn t½c nh− trªn; qu¸ tr×nh chia phÇn sÏ kÕt thóc khi mçi phÇn chØ cßn l¹i mét phÇn tö, lóc nµy ta ®· cã mét danh s¸ch cã thø tù.

VÝ dô: XÐt d·y 26 33 35 29 19 12 32

� LÇn chia phÇn thø nhÊt : Chän phÇn tö chèt cã khãa lµ 29, ®Æt lµ x

26 33 35 29 19 12 32

i à ß j

Dïng hai biÕn chØ sè i vµ j ®Ó duyÖt tõ hai ®Çu danh s¸ch ®Õn x. NÕu i gÆp phÇn tö lín h¬n hay b»ng x sÏ dõng l¹i, j gÆp phÇn tö nhá h¬n hay b»ng x sÏ dõng l¹i, råi ®æi chç hai phÇn tö nµy; sau ®ã tiÕp tôc duyÖt cho ®Õn khi i>j th×

Page 77: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 77

ngõng l¹i.

Lóc nµy d·y sÏ cã 3 phÇn kh¸c nhau nh− h×nh vÏ sau :

26 33 35 29 19 12 32 iiii jjjj 26 12 35 29 19 33 32 i i i i jjjj 26 12 19 29 35 33 32 ijijijij 26 12 19 29 35 33 32 j j j j iiii

� LÇn chia phÇn thø hai cho d·y con 26 12 19, chän chèt x=12

26 12 19 à 12 26 19 iiii jjjj jjjj iiii

KÕt thóc ta sÏ cã hai phÇn : 12 ; 26 19

� LÇn chia phÇn thø 3 cho d·y con 26 19, chän chèt x=26

26 19 à 19 26 KÕt thóc qu¸ tr×nh chia nhá d·y con 26 12 19 iiii jjjj jjjj iiii

- LÇn chia phÇn thø 4 cho d·y con 35 33 32, chän chèt x= 33

35 33 32 à 32 33 35 à 32 33 35 iiii jjjj ijijijij jjjj iiii

KÕt thóc ta sÏ cã ba phÇn : 32 ; 33 ; 35

§Õn ®©y qu¸ tr×nh chia phÇn kÕt thóc v× tÊt c¶ c¸c phÇn chØ cã mét phÇn tö, lóc nµy ta sÏ cã mét danh s¸ch cã thø tù lµ :

12 19 26 29 32 33 35

II.2.2. II.2.2. II.2.2. II.2.2. Gi¶i thuËt:Gi¶i thuËt:Gi¶i thuËt:Gi¶i thuËt:

a. Gi¶i thuËt kh«ng ®Ö quy:

- Ta t¹o mét Stack , mçi phÇn tö cña Stack cã 2 thµnh phÇn lµ q, r chøa chØ sè ®Çu vµ chØ sè cuèi cña 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è gåm c¸c sè b¾t ®Çu tõ chØ sè q ®Õn chØ sè r

- Sau mçi lÇn chia phÇn, ta kiÓm tra xem phÇn cã gi¸ trÞ nhá h¬n chèt vµ phÇn cã gi¸ trÞ lín h¬n chèt nÕu cã tõ 2 phÇn tö trë lªn th× ®−a vµo Stack. Sau mçi lÇn ph©n ho¹ch, ta l¹i lÊy d·y sè míi tõ Stack ra ph©n ho¹ch tiÕp.

- Qu¸ tr×nh cø nh− thÕ cho tíi khi Stack rçng th× kÕt thóc.

* Ch−¬ng tr×nh:

Page 78: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 78

#include <stdio.h> #include <conio.h> #include <time.h> #include <stdlib.h> int mang[100]; int size ; void Quick_Sortvoid Quick_Sortvoid Quick_Sortvoid 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ã tèi ®a 50 phÇn tö int sp=0; // con trá Stack, khëi t¹o sp=0 int i,j,x,q,r,temp; Stack[0].q =0 ; // chØ sè ®Çu cña m¶ng cÇn s¾p Stack[0].r =n-1; // chØ sè cuèi cña m¶ng cÇn s¾p do { // LÊy mét ph©n ho¹ch ra tõ Stack q = Stack[sp].q ; r =Stack[sp].r ; sp--; // Xãa 1 phÇn tö khái 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ö gi÷a cña d·y cÇn s¾p thø tù lµm chèt do { while (A[i] < x) i++; //T×m phÇn tö ®Çu tiªn cã trÞ lín h¬n hay b»ng x while (A[j] > x) j--; //T×m phÇn tö ®Çu tiªn cã trÞ nhá h¬n hay b»ng x if (i<=j) // §æi chç A[i] víi A[j] { temp = A[i]; A[i] =A[j]; A[j] = temp; i++ ; j--; } } while (i<=j); 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è cuèi cña phÇn thø ba

Page 79: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 79

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á h¬n chèt } while (q< r); } while (sp!=-1); // Ket thuc khi Stack rong } int Nhap_day_soint Nhap_day_soint Nhap_day_soint 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(); // dïng <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_kevoid Liet_kevoid Liet_kevoid 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 mainvoid mainvoid mainvoid 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. Gi¶i thuËt Quick Sort ®Ö qui: vÒ c¬ chÕ thùc hiÖn th× còng gièng nh− gi¶i thuËt kh«ng ®Ö qui, nh−ng ta kh«ng kiÓm so¸t Stack mµ ®Ó cho qu¸ tr×nh gäi ®Ö qui tù t¹o ra Stack.

* Ch−¬ng tr×nh:

Page 80: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 80

void Sortvoid Sortvoid Sortvoid 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ö gi÷a cña d·y cÇn s¾p thø tù lµm chèt 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Þ lín h¬n hay b»ng x while (A[j] > x) j--; //T×m phÇn tö ®Çu tiªn cã trÞ nhá h¬n 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_Sortvoid Quick_Sortvoid Quick_Sortvoid Quick_Sort(int A[], int n) { Sort( A,0,n-1); // Gäi hµm Sort víi phÇn tö ®Çu cã chØ sè 0 ®Õn

// phÇn tö cuèi cïng cã chØ sè n-1 }

III. III. III. III. T×m kiÕm trªn m¶ng ®· cã thø tùT×m kiÕm trªn m¶ng ®· cã thø tùT×m kiÕm trªn m¶ng ®· cã thø tùT×m kiÕm trªn m¶ng ®· cã thø tù::::

Gi¶ sö d·y sè cña 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 kh«ng cã x trong d·y, ng−îc l¹i c¸c hµm t×m kiÕm sÏ tr¶ vÒ chØ sè cña x trong d·y.

III.1. III.1. III.1. III.1. T×m kiÕm nhanh b»ng ph−¬ng ph¸p lÆpT×m kiÕm nhanh b»ng ph−¬ng ph¸p lÆpT×m kiÕm nhanh b»ng ph−¬ng ph¸p lÆpT×m kiÕm nhanh b»ng ph−¬ng ph¸p lÆp::::

- Néi 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Þ võa lín h¬n x th× ta cã thÓ kÕt luËn d·y sè kh«ng chøa trÞ x. V× vËy, ta sÏ rót ng¾n thêi gian t×m kiÕm.

- Gi¶i thuËt:

int Search(int A[], int n, int x)

Page 81: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 81

{ int i=0; while (i<n && A[i] < x) i++; return (i<n && A[i]==x ? i : -1) ; } void main() { int so,vitri; size= Nhap_day_so(mang); Quick_Sort(mang,size); Liet_ke("Gia tri mang da duoc sap :",mang,size); printf("\nGia tri muon tim :"); scanf("%d",&so); vitri = Search(mang,size, so); if (vitri !=-1) printf("Vi tri cua so %d trong day = %d",so,vitri); else printf(" Khong co so %d trong day",so); getch(); }

III.2. III.2. III.2. III.2. PhÐp t×m kiÕm nhÞ ph©nPhÐp t×m kiÕm nhÞ ph©nPhÐp t×m kiÕm nhÞ ph©nPhÐp t×m kiÕm nhÞ ph©n::::

- Néi dung:

˜ B−íc 1: Ph¹m vi t×m kiÕm ban ®Çu lµ toµn bé danh s¸ch.

˜ B−íc 2: LÊy phÇn tö chÝnh gi÷a cña ph¹m vi t×m kiÕm (gäi lµ y) so s¸nh víi x.

NÕu x=y th× ta ®· t×m thÊy, tr¶ vÒ chØ sè. Gi¶i thuËt kÕt thóc

NÕu x < y th× ph¹m vi t×m kiÕm míi lµ c¸c phÇn tö n»m phÝa tr−íc cña y.

NÕu x > y th× ph¹m vi t×m kiÕm míi lµ c¸c phÇn tö n»m phÝa sau cña y.

˜ B−íc 3: NÕu cßn tån t¹i ph¹m vi t×m kiÕm th× lÆp l¹i b−íc 2, ng−îc l¹i gi¶i thuËt kÕt thóc víi kÕt qu¶ lµ kh«ng 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 ch−a t×m thÊy x trong d·y // Ph¹m vi ban ®Çu t×m kiÕm lµ tõ k=0 à m = n-1 int k=0; int m=n-1; int j; while (k<=m && !found)

Page 82: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 82

{ j=(k+m) /2; //chØ sè phÇn tö gi÷a if (A[j]==x) found=TRUE; else if (x>A[j]) k=j+1; // Ph¹m vi t×m míi lµ (j+1, m) else m=j-1; // Ph¹m vi t×m míi lµ (k, j-1) } return (found ? j : -1) ; }

III.3. III.3. III.3. III.3. PhÐp t×m kiÕm nhÞ ph©n ®Ö quiPhÐp t×m kiÕm nhÞ ph©n ®Ö quiPhÐp t×m kiÕm nhÞ ph©n ®Ö quiPhÐp t×m kiÕm nhÞ ph©n ®Ö qui::::

- Néi dung: t−¬ng tù nh− trªn

˜ B−íc 1: Ph¹m vi t×m kiÕm ban ®Çu lµ toµn bé danh s¸ch (k=0à m=n-1).

˜ B−íc 2: LÊy phÇn tö chÝnh gi÷a cña ph¹m vi t×m kiÕm (gäi lµ y) so s¸nh víi x.

NÕu x=y th× ta ®· t×m thÊy, tr¶ vÒ chØ sè. Gi¶i thuËt kÕt thóc NÕu x < y th× ph¹m vi t×m kiÕm míi lµ c¸c phÇn tö n»m phÝa tr−íc cña y, nªn ta gäi ®Ö qui víi ph¹m vi míi lµ (k,j-1) NÕu x > y th× ph¹m vi t×m kiÕm míi lµ c¸c phÇn tö n»m phÝa sau cña y, nªn ta gäi ®Ö qui víi ph¹m vi míi lµ (j+1,m )

˜ §iÒu kiÖn dõng: 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); }

Page 83: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 83

Bµi tËpBµi tËpBµi tËpBµi tËp::::

1. Cho mét d·y n sè thùc A :

a) T×m phÇn tö nhá nhÊt cña d·y sè A

b) T×m phÇn tö lín nhÊt cña d·y sè A

c) TÝnh gi¸ trÞ trung b×nh cña d·y sè A.

2. HiÖn ®ang l−u hµnh c¸c tê giÊy b¹c 50000®, 20000®, 10000®, 5000®, 2000®, 1000®, 500®, 200®, 100®. NÕu cã x ®ång, hái r»ng nªn chän c¸c tê giÊy b¹c nµo ®Ó sè l−îng c¸c tê giÊy b¹c lµ Ýt nhÊt.

3. ViÕt ch−¬ng tr×nh nhËp mét ma trËn sè nguyªn cã kÝch th−íc M x N. In ra:

- Tæng c¸c phÇn tö cña ma trËn

- Sã c¸c phÇn tö d−¬ng, phÇn tö ©m, phÇn tö 0 cña ma trËn

- PhÇn tö lín nhÊt, nhá nhÊt cña ma trËn

- C¸c phÇn tö trªn ®−êng chÐo chÝnh cña ma trËn (víi M = N )

- Tæng c¸c phÇn tö trªn ®−êng chÐo chÝnh cña ma trËn (víi M = N )

4. Cho 2 ma trËn vu«ng A(n,n) vµ B (n,n) :

- TÝnh ma trËn tæng 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 jk

n

[ , ]* [ , ]→∑

1 ; i, j = 1..n

5. T¹o mét menu thùc hiÖn c¸c c«ng viÖc sau:

a. NhËp danh s¸ch cã kiÓu häc viªn vµo mét m¶ng, mçi häc viªn cã c¸c th«ng tin sau: maso (int), hoten (chuçi tèi ®a 30 ký tù), ph¸i(NAM/NU), ®iÓm (float), h¹ng (unsigned char). Qu¸ tr×nh nhËp sÏ dõng l¹i khi m· sè nhËp vµo lµ 0.

b. LiÖt kª danh s¸ch häc 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 mét häc viªn trong danh s¸ch theo m· sè, vµ in ra c¸c th«ng tin cßn l¹i cña häc viªn ®ã.

d. S¾p xÕp danh s¸ch häc viªn theo ®iÓm t¨ng dÇn.

e. XÕp h¹ng danh s¸ch häc viªn theo qui t¾c cïng ®iÓm th× cïng h¹ng, h¹ng cña häc viªn sau b»ng h¹ng cña nhãm häc viªn tr−íc céng sè ng−êi cña nhãm häc viªn tr−íc cïng ®iÓm.

f. Gi¶ sö danh s¸ch häc viªn ®· cã thø tù t¨ng dÇn theo ®iÓm; NhËp thªm 1 häc viªn sao cho sau khi nhËp th× danh s¸ch vÉn cßn cã thø tù.

g. CËp nhËt söa ®æi c¸c mÉu tin theo m· sè (NhËp m· sè, sau ®ã hiÖu chØnh

Page 84: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 84

l¹i hoten, phai, ®iÓm).

h. Lo¹i bá 1 häc viªn ra khái danh s¸ch dùa vµo m· sè.

6. a) ViÕt ch−¬ng tr×nh t¹o ngÉu nhiªn mét d·y sè 20000 sè nguyªn cã gi¸ trÞ tõ 0 ®Õn 9999.

b) §Õm sè lÇn so s¸nh cña 2 gi¶i thuËt t×m kiÕm tuÇn tù (trªn d·y sè ch−a cã thø tù) vµ t×m kiÕm nhÞ ph©n (trªn d·y sè ®· ®−îc s¾p thø tù).

c) Trong tr−êng hîp 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 tèi −u gi¶i thuËt s¾p xÕp vÒ mÆt kh«ng gian vµ thêi gian nh− thÕ nµo? Cho biÕt thêi gian thùc thi cña gi¶i thuËt Quick Sort vµ gi¶i thuËt b¹n cµi ®Æt.

7. Cho biÕt thêi gian thùc thi cña 2 gi¶i thuËt Bubble Sort vµ Quick Sort trªn d·y sè cã sè phÇn tö kh¸ lín.

8. Gi¶ sö ta ®· cã 1 d·y sè thùc A t¨ng dÇn. ViÕt gi¶i thuËt thªm 1 sè thùc 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 xãa tÊt c¶ c¸c phÇn tö cã trÞ b»ng x trong d·y sè A.

10. ViÕt ch−¬ng tr×nh tÝnh ®iÓm cña mét líp:

- NhËp c¸c th«ng tin sau cho mçi häc viªn : hoten, namsinh, trung b×nh HK1, trung b×nh HK2

- In ra danh s¸ch c¸c häc viªn cña líp theo thø tù gi¶m dÇn cña §TB toµn n¨m

TB toµn n¨m = (TB HK1 + TB HK2)/2 theo mÉu sau:

DANH S¸CH §iÓM LíP ......DANH S¸CH §iÓM LíP ......DANH S¸CH §iÓM LíP ......DANH S¸CH §iÓM LíP ......

STTSTTSTTSTT Hä & TªnHä & TªnHä & TªnHä & Tªn TB HK1TB HK1TB HK1TB HK1 TB HK2TB HK2TB HK2TB HK2 TB toµn TB toµn TB toµn TB toµn n¨mn¨mn¨mn¨m

H¹ngH¹ngH¹ngH¹ng

1

2

3

L−u ýL−u ýL−u ýL−u ý:- C¸c häc viªn cïng §TB th× cïng h¹ng

- In 17 häc viªn trªn mét trang mµn h×nh

11. Cho 2 d·y sè A cã n phÇn tö vµ B cã m phÇn tö víi thø tù t¨ng dÇn. H·y trén 2 d·y sè trªn thµnh 1 d·y míi C sao cho sau khi trén th× C còng t¨ng dÇn.

Page 85: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 85

CH¦¥NG 4 CH¦¥NG 4 CH¦¥NG 4 CH¦¥NG 4 CON TRá (POINTER)CON TRá (POINTER)CON TRá (POINTER)CON TRá (POINTER)

I. I. I. I. §ÞNH NGHÜA§ÞNH NGHÜA§ÞNH NGHÜA§ÞNH NGHÜA Con trá lµ mét kiÓu d÷ liÖu dïng ®Ó chøa ®Þa chØ. BiÕn con trá lµ mét biÕn

chøa ®Þa chØ cña mét thùc thÓ nµo ®ã, thùc thÓ ®ã lµ biÕn hoÆc lµ hµm.

Con trá th−êng ®−îc dïng ®Ó:

- 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 thøc biÕn).

- T¹o c¸c cÊu tróc d÷ liÖu phøc t¹p nh− danh s¸ch liªn kÕt vµ c©y nhÞ ph©n.

- TruyÒn m¶ng vµ chuçi gi÷a c¸c hµm kh¸ thuËn lîi.

I.1. I.1. I.1. I.1. Khai b¸oKhai b¸oKhai b¸oKhai b¸o: : : : Khai b¸o biÕn pi lµ con trá trá ®Õn mét sè nguyªn.

int *pi;int *pi;int *pi;int *pi;

Lóc nµy, pi chiÕm 2 bytes chøa ®Þa chØ cña sè nguyªn mµ nã ®ang chØ ®Õn, ®ång thêi tr×nh biªn dÞch cña C còng biÕt pi ®ang chØ ®Õn mét sè nguyªn (do khai b¸o). §Ó ®−a mét gi¸ trÞ nguyªn vµo vïng nhí mµ pi ®ang trá ®Õn, ta dïng lÖnh: *pi = 1;

VÝ dô: void main() { int x=4, y=10;

int *px, *py ; // px, py lµ c¸c biÕn con trá px = &x ; // ®−a ®Þa chØ cña x,y vµo px vµ py py = &y; *px = *px + *py; // t¨ng gi¸ trÞ cña vïng nhí mµ px ®ang trá tíi // thªm y , t−¬ng ®−¬ng víi x = x+y }

Minh häa ch−¬ng tr×nh trªn trong bé nhí:

BiÕn int x=4, y=10; int *px, *py;

px=&x; py=&y;

*px = *px + *py;

x 950 4 4 14 951 y 952 10 10 10 953

px 950 950

py 952 952

Page 86: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 86

H×nh 7.1. C¬ chÕ truy xuÊt gi¸ trÞ qua biÕn con trá.

Tæng qu¸t: KiÓu *biÕn;

I.2. I.2. I.2. I.2. TruyÒn ®Þa chØ cho TruyÒn ®Þa chØ cho TruyÒn ®Þa chØ cho TruyÒn ®Þa chØ cho hµmhµmhµmhµm: Trong 1 sè tr−êng hîp ta muèn gëi ®Þa chØ cña 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 ch−¬ng tr×nh gäi.

VÝ dô: Hµm ho¸n ®æi gi¸ trÞ cña 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Ø cña 2 biÕn x,y cho hµm hoandoi }

II II II II C¸c phÐp to¸n trªn biÕn con trá:C¸c phÐp to¸n trªn biÕn con trá:C¸c phÐp to¸n trªn biÕn con trá:C¸c phÐp to¸n trªn biÕn con trá:

II.1. II.1. II.1. II.1. To¸n tö ®Þa chØ &:To¸n tö ®Þa chØ &:To¸n tö ®Þa chØ &:To¸n tö ®Þa chØ &:

NÕu x lµ biÕn th«ng th−êng, &x sÏ lµ ®Þa chØ cña 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 néi dung cña pf }

II.2.II.2.II.2.II.2. To¸n tö néi dung * :To¸n tö néi dung * :To¸n tö néi dung * :To¸n tö néi dung * :

NÕu p lµ pointer th× *p lµ néi dung cña nã.

VÝ dô: int x,y, *p; x = 50; p = &x; // p chøa ®Þa chØ cña vïng nhí x y = *p; // y= *p = 50 v× p chøa ®Þa chØ cña vïng nhí x

VÝ dô: a =2; p = & a; b = (*p) + + + 3; // b =5, *p = 3, a= 3.

( v× p trá tíi ®Þa chØ a nªn *p t¨ng th× a t¨ng)

Tãm l¹iTãm l¹iTãm l¹iTãm l¹i: *x lµ biÕn mµ x gi÷ ®Þa chØ &x lµ ®Þa chØ cña x nÕu x lµ biÕn th«ng th−êng

Page 87: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 87

II.3.II.3.II.3.II.3. PhÐp céng trõ biÕn con trá víi mét sè nguyªn:PhÐp céng trõ biÕn con trá víi mét sè nguyªn:PhÐp céng trõ biÕn con trá víi mét sè nguyªn:PhÐp céng trõ biÕn con trá víi mét sè nguyªn:

NÕu p lµ biÕn pointer th× p+n lµ ®Þa chØ cña mét biÕn míi c¸ch nã n biÕn theo chiÒu t¨ng, cßn p-n th× ng−îc l¹i.

Chó ýChó ýChó ýChó ý::::

- PhÐp céng con trá víi mét sè nguyªn chØ ®−îc ¸p dông trªn mét d·y biÕn cïng kiÓu

- Kh«ng ®−îc céng 2 pointer víi nhau

- Kh«ng ®−îc nh©n, chia, lÊy d− biÕn con trá víi 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 tíi nums[i] thùc chÊt lµ dïng d¹ng ký hiÖu con trá, v× khi biªn dÞch, tr×nh biªn dÞch 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)); }

L−u ý: *(nums+i) t−¬ng ®−¬ng víi nums[i]

II.4. II.4. II.4. II.4. PhÐp g¸n vµ phÐp so s¸nhPhÐp g¸n vµ phÐp so s¸nhPhÐp g¸n vµ phÐp so s¸nhPhÐp g¸n vµ phÐp so s¸nh::::

---- PhÐp g¸nPhÐp g¸nPhÐp g¸nPhÐp g¸n: c¸c biÕn con trá cã thÓ g¸n cho nhau víi ®iÒu kiÖn ph¶i cïng kiÓu

VÝ dô: int *p1, *p2; *p1 = 10; p2 = p1; // lóc nµy *p2 = 10;

---- PhÐp so s¸nhPhÐp so s¸nhPhÐp so s¸nhPhÐp so s¸nh: ta cã thÓ so s¸nh 2 biÕn con trá xem cã cïng ®Þa chØ hay kh«ng, ®−¬ng nhiªn 2 biÕn con trá ®ã ph¶i cïng kiÓu víi nhau.

II.5.II.5.II.5.II.5. Sù chuyÓn kiÓu:Sù chuyÓn kiÓu:Sù chuyÓn kiÓu: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;

Page 88: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 88

*p = 97; // num =97 n = *p; // n=97 c = (char) *p; // c = ‘a’ Chó ýChó ýChó ýChó ý:::: §Þa chØ cña mét biÕn ®−îc xem nh− mét con trá h»ng, do ®ã nã

kh«ng ®−îc phÐp 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.II.6.II.6.II.6. Khai b¸o mét con trá h»ng vµ con trá chØ ®Õn ®èi t−îng h»ng:Khai b¸o mét con trá h»ng vµ con trá chØ ®Õn ®èi t−îng h»ng:Khai b¸o mét con trá h»ng vµ con trá chØ ®Õn ®èi t−îng h»ng:Khai b¸o mét con trá h»ng vµ con trá chØ ®Õn ®èi t−îng h»ng:

a. Con trá h»ng:Con trá h»ng:Con trá h»ng:Con trá h»ng:

KiÓu * const p = gi¸ trÞ;

b. Con trá chØ ®Õn ®èi t−îng h»ng:Con trá chØ ®Õn ®èi t−îng h»ng:Con trá chØ ®Õn ®èi t−îng h»ng:Con trá chØ ®Õn ®èi t−îng h»ng:

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. III. III. III. Sù t−¬ng quan gi÷a con trá vµ m¶ngSù t−¬ng quan gi÷a con trá vµ m¶ngSù t−¬ng quan gi÷a con trá vµ m¶ngSù t−¬ng quan gi÷a con trá vµ m¶ng 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 tíi phÇn tö thø i cña 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));

Page 89: Ky Thuat viet lap trinh

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;int a[n], *p;int a[n], *p;int a[n], *p; void main() { int j,temp; clrscr(); p=a;p=a;p=a;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 víi 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

NhËn xÐtNhËn xÐtNhËn xÐtNhËn xÐt::::

a = &a[0][0] = &a[0] a[i] = &a[i][0]

Page 90: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 90

a[i][j] néi dung cña « i.j Víi p = a th× ®Ó truy xuÊt tíi « 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Ø cña toµn bé m¶ng (gi¶ sö lµ 1000)

- Do a lµ m¶ng nguyªn nªn mçi phÇn tö chiÕm 2 bytes, vµ mçi dßng cña m¶ng sÏ chiÕm 10 bytes.

- Tr×nh biªn dÞch cña C biÕt sè cét (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Ø cña dßng thø 2 trong a. T−¬ng tù, 1020 lµ lµ ®Þa chØ cña dßng thø 3 trong a.

a 0 1 2 3 4 1000 1 2 3 4 5 1010 2 3 4 5555 6 1020 3 4 5 6 7 1030 4 5 6 7 8

Lóc nµy: a[1] hay a+1 lµ ®Þa chØ cña dßng thø 2 trong m¶ng 2 chiÒu a. Ta cã : *(a+1) == 1010 // ®Þa chØ cña phÇn tö ®Çu tiªn trªn dßng 1 *(a+1)+3 == 1016 // ®Þa chØ cña phÇn tö cã chØ sè 3 trªn dßng 1 *(*(a+1)+3)==5 // néi dung cña phÇn tö a[1][3] Tãm l¹i: a[i][j] = *(*(a+i)+j)a[i][j] = *(*(a+i)+j)a[i][j] = *(*(a+i)+j)a[i][j] = *(*(a+i)+j)

Ta cßn cã mét c¸ch kh¸c ®Ó truy xuÊt tíi a[i][j] :

NÕuNÕuNÕuNÕu : KiÓu a[n0 ] [n1 ] ... [nm] , *p; p = a;

th×th×th×th× a [i0] [i1]... [im] = *(*(*(p+i0) + i1) + ...im)

Chó ý:Chó ý:Chó ý:Chó ý:

1.1.1.1. Sù kh¸c nhau gi÷a con trá vµ m¶ngSù kh¸c nhau gi÷a con trá vµ m¶ngSù kh¸c nhau gi÷a con trá vµ m¶ngSù kh¸c nhau gi÷a con trá vµ m¶ng::::

- BiÕn con trá th× cã thÓ t¨ng, gi¶m hoÆc g¸n cßn biÕn m¶ng lµ mét con trá h»ng do ®ã kh«ng thÓ t¨ng, gi¶m hoÆc g¸n.

- Ta cã thÓ lÊy ®Þa chØ cña con trá nh−ng kh«ng thÓ lÊy ®Þa chØ cña m¶ng v× b¶n th©n m¶ng ®· lµ ®Þa chØ.

- Khi ta khai b¸o mét m¶ng th× ch−¬ng tr×nh dÞch sÏ cÊp ph¸t mét vïng nhí cho nã.

VÝ dô 1: KiÓu a[50]

Page 91: Ky Thuat viet lap trinh

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 mét « nhí mµ néi dung cña nã ch¼ng biÕt chØ ®Õn ®©u

VÝ dô 2: a[1] x¸c ®Þnh thµnh phÇn thø 2

p+1 : néi dung kh«ng x¸c ®Þnh

⇒ ph¶i cã p = a ®Ó p chØ tíi a

- NÕu ta muèn t¹o mét m¶ng b»ng con trá th× ta ph¶i xin cÊp ph¸t mét vïng nhí b»ng hµm malloc ()

VÝ dô: int *p;

p = (int) maloc ( 10* sizeof(int));

Trong bé nhí:

0 1 2 9

p

VÝ dô: int *p; p = malloc (10* sizeof (int)); for(i=0; i< 10; i++) scanf (“%d”, p+i)

- §Ó lo¹i bá vïng nhí ®−îc cÊp cho con trá ta dïng hµm free (p)

2. 2. 2. 2. Sù kh¸c nhau gi÷a tham sè cña hµm lµ m¶ng vµ ®èi sè lµ pointerSù kh¸c nhau gi÷a tham sè cña hµm lµ m¶ng vµ ®èi sè lµ pointerSù kh¸c nhau gi÷a tham sè cña hµm lµ m¶ng vµ ®èi sè lµ pointerSù kh¸c nhau gi÷a tham sè cña hµm lµ m¶ng 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. Hµm 3. Hµm 3. Hµm 3. Hµm tr¶ vÒ kiÓu con trá:tr¶ vÒ kiÓu con trá:tr¶ vÒ kiÓu con trá: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' ) ;

Page 92: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 92

return s1 ; }

IV. IV. IV. IV. Con trá vµ chuçiCon trá vµ chuçiCon trá vµ chuçiCon trá vµ chuçi

IV.1. IV.1. IV.1. IV.1. Khai b¸oKhai b¸oKhai b¸oKhai b¸o: : : : §Ó khai b¸o s lµ 1 chuçi ký tù vµ p lµ con trá trá ®Õn 1 chuçi ký tù, ta viÕt nh− sau:

char s [50];

char *p;

§Ó khëi t¹o 1 chuçi trong c¶ 2 tr−êng hîp:

static char s[] = “ABCD”;

char *p = “ABCD”;

Lóc nµy, nÕu ta: puts (p) ; // →ABCD

puts (++p) ; // → BCD

IV.2. IV.2. IV.2. IV.2. XÐt mét sè vÝXÐt mét sè vÝXÐt mét sè vÝXÐt mét sè vÝ dô vÒ c¸c hµm xö lý chuçidô vÒ c¸c hµm xö lý chuçidô vÒ c¸c hµm xö lý chuçidô vÒ c¸c hµm xö lý chuçi

a. a. a. a. Hµm Strcpy:Hµm Strcpy:Hµm Strcpy:Hµm Strcpy: Sao chÐp chuçi ký tù tõ source qua dest.

0 1 2 3 4 5 source A B C D E F \0 dest

#include <stdio.h> #include <conio.h> void strcpy (char dest[], char source[]) { int i=0; while ((dest[i++] = source[i]) !='\0'); } void main() { char src_str[]="Hoang Van"; char dst_str[20]; strcpy(dst_str,src_str); printf("\n%s", dst_str); }

ViÕt l¹i hµm strcpy b»ng con trá:

void strcpy (char *dest, const char *source) { while (( *dest = *source) !=‘\0’)

{ dest ++;

Page 93: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 93

source ++; } }

b.b.b.b. Hµm Strcmp ()Hµm Strcmp ()Hµm Strcmp ()Hµm Strcmp () : dïng ®Ó so s¸nh 2 chuçi s1, s2 víi 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.c.c.c. Hµm strcat: Hµm strcat: Hµm strcat: Hµm strcat: nèi chuçi s2 sau chuçi 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 ++; }

Page 94: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 94

return p ; }

d. Hµm strchrd. Hµm strchrd. Hµm strchrd. Hµm strchr: tr¶ vÒ ®Þa chØ cña ký tù c tromg chuçi 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. IV.3. IV.3. IV.3. M¶ng con trá chØ ®Õn chuçiM¶ng con trá chØ ®Õn chuçiM¶ng con trá chØ ®Õn chuçiM¶ng con trá chØ ®Õn chuçi

---- Khai b¸oKhai b¸oKhai b¸oKhai b¸o:::: §Ó khai b¸o 1 m¶ng con trá chØ ®Õn chuçi, vÝ dô nh− danh s¸ch hä tªn, ta viÕt nh− sau:

char * ds[5]= // m¶ng chuçi ds[5][7]

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

NÕu ta khëi t¹o m¶ng mµ kh«ng dïng con trá th× l−îng « nhí cÊp ph¸t cho mçi phÇn tö cña m¶ng ®Òu b»ng víi sè ký tù cña chuçi dµi nhÊt; Trong khi ®ã,

Page 95: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 95

nÕu khëi t¹o b»ng m¶ng con trá nh− trªn th× l−îng « nhí sÏ cÊp ph¸t võa ®ñ cho tõng phÇn tö cña m¶ng.

ds[0] H o a n g \0 ds[1] V a n \0 ds[2] C h i \0 ds[3] N g o c \0 ds[4] N g u y e t \0

H×nh 3.2. M¶ng con trá trá ®Õn chuçi

ds[0] H o a n g \0 ds[1] V a n \0 ds[2] C h i \0 ds[3] N g o c \0 ds[4] N g u y e t \0

H×nh 3.3. M¶ng c¸c chuçi

* Xö lý con trá ®Õn chuçi: xÐt vÝ dô s¾p xÕp danh s¸ch hä tªn theo chØ môc:

#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Ø cña chuçi hä tªn trong ds ®−a // vµo m¶ng con trá p }

Page 96: Ky Thuat viet lap trinh

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

L−u ý: Ch−¬ng tr×nh trªn thùc chÊt ta chØ ho¸n ®æi gi¸ trÞ cña m¶ng con trá p chø m¶ng chuçi ds vÉn nh− cò.

Bµi tËp:

1. S¾p xÕp l¹i danh s¸ch häc viªn theo thø tù hä t¨ng dÇn b»ng con trá.

2. S¾p xÕp l¹i danh s¸ch häc viªn theo thø tù tªn t¨ng dÇn, nÕu trïng tªn th× s¾p theo hä b»ng con trá.

3. S¾p xÕp l¹i danh s¸ch häc viªn theo thø tù tªn t¨ng dÇn, nÕu trïng tªn th× s¾p theo hä b»ng m¶ng chuçi.

Page 97: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 97

CH¦¥NG 5 CH¦¥NG 5 CH¦¥NG 5 CH¦¥NG 5 C¸C THUËT TO¸N TR£N CÊU TRóC C¸C THUËT TO¸N TR£N CÊU TRóC C¸C THUËT TO¸N TR£N CÊU TRóC C¸C THUËT TO¸N TR£N CÊU TRóC DANH S¸CH LI£N KÕT (LINKED LIST)DANH S¸CH LI£N KÕT (LINKED LIST)DANH S¸CH LI£N KÕT (LINKED LIST)DANH S¸CH LI£N KÕT (LINKED LIST)

I. I. I. I. Kh¸i niÖmKh¸i niÖmKh¸i niÖmKh¸i niÖm: : : :

CÊu tróc danh s¸ch liªn kÕt lµ cÊu tróc ®éng, viÖc cÊp ph¸t nót vµ gi¶i phãng nót trªn danh s¸ch x¶y ra khi ch−¬ng tr×nh ®ang ch¹y. Ta th−êng cÊp ph¸t nót cho danh s¸ch liªn kÕt b»ng biÕn ®éng.

C¸c phÇn tö sÏ ®−îc cÊp ph¸t vïng nhí trong qu¸ tr×nh thùc thi ch−¬ng tr×nh, do ®ã chóng cã thÓ n»m r¶i r¸c ë nhiÒu n¬i kh¸c nhau trong bé nhí (kh«ng liªn tôc) .

3 •

First 1 •

2 •

4 •

C¸c phÇn tö trong danh s¸ch ®−îc kÕt nèi víi nhau theo chïm liªn kÕt nh− h×nh trªn:

- First lµ con trá chØ ®Õn phÇn tö ®Çu cña danh s¸ch liªn kÕt

- PhÇn tö cuèi cña danh s¸ch liªn kÕt víi vïng liªn kÕt cã gi¸ trÞ NULL

-Mçi nót cña danh s¸ch cã tr−êng info chøa néi dung cña nót vµ tr−êng next lµ con trá chØ ®Õn nót kÕ tiÕp trong danh s¸ch.

* L−u ýL−u ýL−u ýL−u ý:

- CÊu tróc danh s¸ch liªn kÕt lµ cÊu tróc ®éng, c¸c nót ®−îc cÊp ph¸t hoÆc bÞ gi¶i phãng khi ch−¬ng tr×nh ®ang ch¹y.

- Danh s¸ch liªn kÕt rÊt thÝch hîp khi thùc hiÖn c¸c phÐp to¸n trªn danh s¸ch th−êng bÞ biÕn ®éng. Trong tr−êng hîp xãa hay thªm phÇn tö trong danh s¸ch liªn kÕt th× ta kh«ng dêi c¸c phÇn tö ®i nh− trong m¶ng mµ chØ viÖc hiÖu chØnh l¹i tr−êng next t¹i c¸c nót ®ang thao t¸c. Thêi gian thùc hiÖn c¸c phÐp to¸n thªm vµo vµ lo¹i bá kh«ng phô thuéc vµo sè phÇn tö cña danh s¸ch liªn kÕt.

Nil

First • • • •

Page 98: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 98

- Tuy nhiªn, danh s¸ch liªn kÕt còng cã c¸c ®iÓm h¹n chÕ sau:

+ V× mçi nót cña danh s¸ch liªn kÕt ph¶i chøa thªm tr−êng next nªn danh s¸ch liªn kÕt ph¶i tèn thªm bé nhí.

+ T×m kiÕm trªn danh s¸ch liªn kÕt kh«ng nhanh v× ta chØ ®−îc truy xuÊt tuÇn tù tõ ®Çu danh s¸ch.

§ Khai b¸o : Mét phÇn tö cña danh s¸ch liªn kÕt Ýt nhÊt ph¶i cã hai thµnh phÇn : néi dung cña phÇn tö (info) vµ thµnh phÇn next liªn kÕt phÇn tö nµy víi phÇn tö kh¸c.

Gi¶ sö ta khai b¸o kiÓu NODEPTR lµ kiÓu con trá chØ ®Õn nót trong 1 danh s¸ch liªn kÕt, mçi 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;

- Khëi t¹o danh s¸ch liªn kÕt : First = NULL;

- Ghi chó :

� Thµnh phÇn chøa néi dung cã thÓ gåm nhiÒu vïng víi c¸c kiÓu d÷ liÖu kh¸c nhau. � Thµnh phÇn liªn kÕt còng cã thÓ nhiÒu h¬n mét nÕu lµ danh s¸ch ®a liªn

kÕt hoÆc danh s¸ch liªn kÕt kÐp. � First lµ con trá trá ®Õn phÇn tö ®Çu tiªn cña danh s¸ch liªn kÕt, nã cã thÓ

lµ kiÓu con trá (nh− khai b¸o trªn), vµ còng cã thÓ lµ mét struct cã hai thµnh phÇn: First trá ®Õn phÇn tö ®Çu tiªn cña danh s¸ch liªn kÕt, vµ Last trá ®Õn phÇn tö cuèi cña danh s¸ch liªn kÕt.

struct Linked_List; { First NODEPTR; Last NODEPTR; };

II.II.II.II. C¸c phÐp to¸n trªn danh s¸ch liªn kÕt¸c phÐp to¸n trªn danh s¸ch liªn kÕt¸c phÐp to¸n trªn danh s¸ch liªn kÕt¸c phÐp to¸n trªn danh s¸ch liªn kÕt:::: II.1. II.1. II.1. II.1. T¹o danh s¸chT¹o danh s¸chT¹o danh s¸chT¹o danh s¸ch::::

a. Khëi t¹o danh s¸ch (Initialize): dïng ®Ó khëi ®éng mét danh s¸ch liªn kÕt, cho ch−¬ng tr×nh hiÓu lµ hiÖn t¹i danh s¸ch liªn kÕt ch−a cã phÇn tö.

void Initialize(NODEPTR &First) {

Page 99: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 99

First = NULL; }

b. CÊp ph¸t vïng nhí (New_Node): cÊp ph¸t mét nót cho danh s¸ch liªn kÕt. Hµm New_Node nµy tr¶ vÒ ®Þa chØ cña nót võa cÊp ph¸t.

Trong ch−¬ng tr×nh cã sö dông hµm malloc (trong <alloc.h>) , hµm nµy cÊp ph¸t mét khèi nhí tÝnh theo byte tõ bé nhí heap. NÕu cÊp ph¸t thµnh c«ng, hµm malloc tr¶ vÒ ®Þa chØ cña vïng nhí võa cÊp ph¸t, ng−îc 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 mét nót cã néi 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 nót míi vµo sau nót cã ®Þa chØ p (Insert_After): thªm mét nót cã néi dung x vµo sau nót 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; } }

Page 100: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 100

II.2. II.2. II.2. II.2. CËp nhËt danh s¸chCËp nhËt danh s¸chCËp nhËt danh s¸chCËp nhËt danh s¸ch::::

a. Gi¶i phãng vïng nhí(Free_Node): Hµm nµy dïng ®Ó hñy nót ®· cÊp ph¸t, vµ tr¶ vïng 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 rçng hay kh«ng (Empty): hµm Empty tr¶ vÒ TRUE nÕu danh s¸ch liªn kÕt rçng, vµ ng−îc l¹i.

int Empty(NODEPTR First) { return(First == NULL); }

c. Xãa phÇn tö ®Çu cña danh s¸ch (Delete_First): muèn xãa 1 phÇn tö khái danh s¸ch liªn kÕt th× ta ph¶i kiÓm tra xem danh s¸ch cã rçng hay kh«ng. NÕu danh s¸ch cã phÇn tö th× míi xãa ®−îc.

int Delete_First (NODEPTR &First) { NODEPTR p; if (Empty(First)) return 0; else { p = First; // nut can xoa la nut dau First = p->next; Free_Node(p); return 1; } }

d. Xãa phÇn tö ®øng sau nót cã ®Þa chØ p (Delete_After):

int Delete_After(NODEPTR First, NODEPTR &Last, NODEPTR p) { NODEPTR q; // nÕu p lµ NULL hoÆc sau p kh«ng cã nót if((p == NULL) || (p->next == NULL)) return 0; q = p->next; // q chi nut can xoa p->next = q->next; Free_Node(q);

Page 101: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 101

if (p->next==NULL) Last=p; }

e. Xãa toµn bé danh s¸ch (Delete_All): ta cã thÓ sö dông lÖnh *First = NULL ®Ó xãa toµn bé danh s¸ch, nh−ng trong bé nhí, c¸c vïng nhí ®· cÊp ph¸t cho c¸c nót kh«ng gi¶i phãng vÒ l¹i cho memory heap, nªn sÏ l·ng phÝ vïng nhí. Do ®ã, ta sö dông 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. II.3. II.3. II.3. DuyÖt danh s¸chDuyÖt danh s¸chDuyÖt danh s¸chDuyÖt danh s¸ch: : : : Th«ng th−êng ta hay duyÖt danh s¸ch liªn kÕt ®Ó thùc hiÖn mét c«ng viÖc g× ®ã, nh− liÖt kª d÷ liÖu trong danh s¸ch hay ®Õm sè nót 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. II.4. II.4. II.4. T×m kiÕmT×m kiÕmT×m kiÕmT×m kiÕm (Search): (Search): (Search): (Search): T×m nót ®Çu tiªn trong danh s¸ch cã info b»ng víi 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Ø cña nót cã trÞ b»ng x trong danh s¸ch, nÕu kh«ng cã th× tr¶ vÒ trÞ NULL.

NODEPTR Search(NODEPTR First, int x) { NODEPTR p; p = First;

Page 102: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 102

while(p != NULL && p->info != x ) p = p->next; return (p); }

II.5. II.5. II.5. II.5. S¾p xÕp S¾p xÕp S¾p xÕp S¾p xÕp ((((Selection_Sort): s¾p xÕp danh s¸ch liªn kÕt theo thø tù info t¨ng dÇn.

- Néi dung: Ta so s¸nh tÊt c¶ c¸c phÇn tö cña danh s¸ch ®Ó chän ra mét phÇn tö nhá nhÊt ®−a vÒ ®Çu danh s¸ch; sau ®ã, tiÕp tôc chän phÇn tö nhá nhÊt trong c¸c phÇn tö cßn 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 chän 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; } }

Page 103: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 103

Bµi tËpBµi tËpBµi tËpBµi tËp::::

1. ViÕt ch−¬ng tr×nh t¹o mét menu thùc hiÖn c¸c c«ng 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, mçi phÇn tö gåm cã c¸c th«ng 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 tæng sè nót 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ã néi 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 cuèi danh s¸ch.

e. In ra hä tªn cña sinh viªn cã m· do ta nhËp vµo.

f. Lo¹i bá nót cã m· do ta nhËp vµo, tr−íc khi xãa hái l¹i "B¹n thËt sù muèn xãa (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ã nót th× xãa tÊt c¶ d÷ liÖu hiÖn cã trong danh s¸ch liªn kÕt tr−íc khi ®−a d÷ liÖu tõ file vµo.

2. ViÕt ch−¬ng tr×nh t¹o mét danh s¸ch liªn kÕt theo gi¶i thuËt thªm vµo cuèi danh s¸ch, mçi nót chøa mét sè nguyªn.

3. -ViÕt hµm tªn Delete_Node ®Ó xãa nót cã ®Þa chØ p. - ViÕt mét hµm lo¹i bá tÊt c¶ c¸c nót cã néi 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 mét danh s¸ch liªn kÕt míi gièng danh s¸ch liªn kÕt cò.

5. GhÐp mét danh s¸ch liªn kÕt cã ®Þa chØ ®Çu lµ First2 vµo mét 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 läc danh s¸ch liªn kÕt ®Ó tr¸nh tr−êng hîp c¸c nót trong danh s¸ch liªn kÕt bÞ trïng info.

7. §¶o ng−îc vïng liªn kÕt cña mét danh s¸ch liªn kÕt sao cho: - First sÏ chØ ®Õn phÇn tö cuèi - PhÇn tö ®Çu cã liªn kÕt lµ NULL.

Page 104: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 104

8. ViÕt hµm Left_Traverse (NODEPTR &First) ®Ó duyÖt ng−îc danh s¸ch liªn kÕt.

9. ViÕt gi¶i thuËt t¸ch mét danh s¸ch liªn kÕt thµnh hai danh s¸ch liªn kÕt, trong ®ã mét danh s¸ch liªn kÕt chøa c¸c phÇn tö cã sè thø tù lÏ vµ mét danh s¸ch liªn kÕt chøa c¸c phÇn tö cã sè thø tù ch½n trong danh s¸ch liªn kÕt cò.

10. - T¹o mét danh s¸ch liªn kÕt chøa tªn häc viªn, ®iÓm trung b×nh, h¹ng cña häc viªn (víi ®iÒu kiÖn chØ nhËp tªn vµ ®iÓm trung b×nh). Qu¸ tr×nh nhËp sÏ dõng l¹i khi tªn nhËp vµo lµ rçng. - XÕp h¹ng cho c¸c häc viªn. In ra danh s¸ch häc viªn thø tù h¹ng t¨ng dÇn (Ghi chó : Cïng ®iÓm trung b×nh th× cïng h¹ng).

11. NhËp hai ®a thøc theo danh s¸ch liªn kÕt. In ra tÝch cña hai ®a thøc nµy. VÝ dô: §a thøc First1 : 2x5+4x2-1 §a thøc First2 : 10x7-3x4+x2

⇒ KÕt qu¶ in ra : 20x12 + 34x9 - 8x7 - 12x6 + 7x4 - x2

(Ghi chó : Kh«ng 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ã néi 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ã néi 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 ®Ó trén 2 danh s¸ch liªn kÕt nµy l¹i sao cho danh s¸ch liªn kÕt sau khi trén còng cã thø tù t¨ng dÇn.

Page 105: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 105

CH−¬NG 6 CH−¬NG 6 CH−¬NG 6 CH−¬NG 6 c¸c thuËt to¸n trªn cÊu tróc c©Y c¸c thuËt to¸n trªn cÊu tróc c©Y c¸c thuËt to¸n trªn cÊu tróc c©Y c¸c thuËt to¸n trªn cÊu tróc c©Y (Tree)(Tree)(Tree)(Tree)

C©y lµ mét cÊu tróc d÷ liÖu rÊt th«ng dông vµ quan träng trong nhiÒu ph¹m vi kh¸c nhau cña kü thuËt m¸y tÝnh.

VÝ dô : Tæ chøc c¸c quan hÖ hä hµng trong mét gia ph¶, môc lôc cña mét cuèn s¸ch, x©y dùng cÊu tróc vÒ có ph¸p trong c¸c tr×nh biªn dÞch.

Trong ch−¬ng tr×nh nµy, chóng ta kh¶o s¸t c¸c kh¸i niÖm c¬ b¶n vÒ c©y, c¸c phÐp to¸n trªn c©y nhÞ ph©n, còng nh− c¸c phÐp to¸n trªn c©y nhÞ ph©n c©n b»ng ( AVL tree) vµ øng dông cña 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. I. I. I. Ph©n lo¹i c©yPh©n lo¹i c©yPh©n lo¹i c©yPh©n lo¹i c©y::::

I.1. I.1. I.1. I.1. MMMMét sè kh¸i niÖm c¬ b¶nét sè kh¸i niÖm c¬ b¶nét sè kh¸i niÖm c¬ b¶nét sè kh¸i niÖm c¬ b¶n::::

1. C©yC©yC©yC©y: C©y lµ tËp hîp c¸c phÇn tö gäi lµ nót, mét nót (t−¬ng tù nh− mét phÇn tö cña d·y) cã thÓ cã kiÓu bÊt kú. C¸c nót ®−îc biÓu diÔn bëi 1 ký tù ch÷, mét chuçi, mét sè ghi trong mét vßng trßn.

Mét sè ®Þnh nghÜa theo ®Ö quy

w Mét nót ®¬n còng chÝnh lµ mét c©y.

w C¸c nót ®−îc gäi lµ ë cïng mét c©y khi cã ®−êng ®i gi÷a c¸c nót nµy.

w Mét c©y sÏ bao gåm mét nót gèc (Root) vµ mmmm c©y con, trong mçi c©y con l¹i cã mét nót gèc vµ m1 m1 m1 m1 c©y con nhá h¬n v.v.

w Mét c©y kh«ng cã mét nót nµo c¶ gäi lµ c©y rçng.

VÝ dô 1 :

A

B C

G H E

J

D

F

KI

1

2

3

4

N u ùt goác

H×nh 5.1. C©y víi nót gèc lµ A

- A lµ nót gèc víi 3 c©y con lÇn l−ît cã 3 nót gèc riªng lµø B, C, D

- Nót cha (ancestor)

Nót con (descendent)

A lµ nót cha cña B, C, D

G, H lµ nót con cña C

G, H kh«ng quan hÖ cha con víi A

VÝ dô 2 : Víi ®Ò c−¬ng mét m«n häc T, ta cã thÓ biÓu diÔn d¹ng c©y nh− sau :

Page 106: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 106

T

CHÖÔNG I CHÖÔNG II CHÖÔNG III

I.1 I.2 II.1 II.3II.2

II.1.1 II.1.2

H×nh 5.2

CH−¬NG I

I.1 I.2

CH−¬NG II

II.1 II.1.1 II.1.2 II.2 II.3

CH−¬NG III

2. Nót chaNót chaNót chaNót cha (Ancestor) : Nót ®øng trªn cña mét nót ®−îc gäi lµ nót cha

C lµ nót cha cña G, H

Nót conNót conNót conNót con (descendent) : Nót ®øng sau mét nót kh¸c ®−îc gäi lµ nót con cña nót ®ã.

Nót I, J, K lµ nót con cña nót E

3. BËc BËc BËc BËc (degree) :

- BËc cña nót lµ sè c©y con cña nót ®ã.

C cã bËc lµ 2, E cã bËc lµ 3 (H×nh 5.1)

- BËc cña c©y lµ bËc lín nhÊt cña c¸c nót trong c©y.

C©y trong h×nh 5.1 cã bËc lµ 3.

C©y bËc n ®−îc gäi lµ c©y n ph©n nh− c©y nhÞ ph©n, c©y tam ph©n.

4. Nót l¸ vµ nót trung gianNót l¸ vµ nót trung gianNót l¸ vµ nót trung gianNót l¸ vµ nót trung gian:

- Nót l¸ lµ nót cã bËc b»ng 0 (tøc lµ kh«ng cã c©y con nµo) :

- Nót trung gian: lµ mét nót cã bËc kh¸c 0 vµ kh«ng ph¶i lµ nót gèc.

VÝ dô: Trong h×nh 5.1, B, G, H, I, J, K, F lµ nót l¸

C, D, E lµ nót trung gian.

5. Møc cña nótMøc cña nótMøc cña nótMøc cña nót (level) : Nót gèc cã møc lµ 1

Møc cña nót con = møc cña nót cha + 1

VÝ dô: trong h×nh 5.1,

A cã møc lµ 1

Page 107: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 107

B, C, D cã møc lµ 2 G, H, E, F cã møc lµ 3 I, J, K cã møc lµ 4

6. ChiÒu cao cña c©yChiÒu cao cña c©yChiÒu cao cña c©yChiÒu cao cña c©y (height) : lµ møc lín nhÊt cña c¸c nót l¸ trong c©y.

VÝ dô: C©y trong h×nh 5.1 cã chiÒu cao lµ 4

7. Thø tù cña c¸c nótThø tù cña c¸c nótThø tù cña c¸c nótThø tù cña c¸c nót (order of nodes) : NÕu c©y ®−îc gäi lµ cã thø tù th× ph¶i ®¶m b¶o vÞ trÝ cña c¸c nót con tõ tr¸i qua ph¶i, tøc lµ nÕu thay ®æi vÞ trÝ cña mét nót con bÊt kú th× ta ®· cã mét c©y míi.

VÝ dô :

A

B C

A

C B

caây khaùc

H×nh 5.3: Sau khi ®æi vÞ trÝ cña 2 nót B, C ta ®· cã c©y míi.

8. ChiÒu dµi ®−êng ®iChiÒu dµi ®−êng ®iChiÒu dµi ®−êng ®iChiÒu dµi ®−êng ®i (Path length):(Path length):(Path length):(Path length):

---- ChiÒu dµi ®−êng ®i cña nót x: lµ sè c¸c c¹nh ®i tõ nót gèc ®Õn nót x.

VÝ dô: Trong h×nh 5.1: Nót gèc A cã chiÒu dµi ®−êng ®i lµ 1 Nót B, C, D cã chiÒu dµi ®−êng ®i lµ 2

Tæng qu¸t: mét nót t¹i møc i cã chiÒu dµi ®−êng ®i lµ i

- ChiÒu dµi ®−êng ®i cña c©y: lµ tæng cña c¸c chiÒu dµi ®−êng ®i cña tÊt c¶ c¸c nót trong c©y.

VÝ dô: ChiÒu dµi ®−êng ®i cña c©y trong h×nh 5.1 lµ 31.

ChiÒu dµi ®−êng ®i trung b×nh cña c©y:

n/)i.n(Pi

ii ∑=

trong ®ã ni lµ sè c¸c nót ë møc i vµ n lµ tæng sè c¸c nót trong c©y.

I.2. I.2. I.2. I.2. C¸ch biÓu diÔn c©yC¸ch biÓu diÔn c©yC¸ch biÓu diÔn c©yC¸ch biÓu diÔn c©y: ®Ó 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è.. Nh−ng th«ng th−êng, ta hay dïng d¹ng ®å thÞ ®Ó biÓu diÔn 1 c©y nh− h×nh 5.1

I.3. I.3. I.3. I.3. BiÓu diÔn thø tù c¸c nót trong c©yBiÓu diÔn thø tù c¸c nót trong c©yBiÓu diÔn thø tù c¸c nót trong c©yBiÓu diÔn thø tù c¸c nót trong c©y ::::

Mét c©y th−êng tæ chøc c¸c nót theo mét thø tù nhÊt ®Þnh c¨n cø vµo mét néi dung gäi lµ khãa cña c¸c nót. Cã thÓ tæ chøc c©y cã khãa t¨ng dÇn theo møc tõ tr¸i qua ph¶i nh− vÝ dô sau :

Page 108: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 108

1

2 3

4

Root

76 8

5

9

ROOTROOTROOTROOT à 1à 2à 3à 4à 5à 6à 7à 8à 9

Nh− vËy khi duyÖt l¹i c©y theo møc t¨ng dÇn vµ tõ tr¸i qua ph¶i ta sÏ l¹i cã ®−îc thø tù c¸c nót nh− trªn.

H×nh 5.4. C©y cã thø tù t¨ng dÇn theo møc tõ tr¸i qua ph¶i

II. II. II. II. C©y nhÞ ph©nC©y nhÞ ph©nC©y nhÞ ph©nC©y nhÞ ph©n (Binary tree)(Binary tree)(Binary tree)(Binary tree) II.1. II.1. II.1. II.1. §Þnh nghÜa§Þnh nghÜa§Þnh nghÜa§Þnh nghÜa ::::

1. C©y nhÞ ph©nC©y nhÞ ph©nC©y nhÞ ph©nC©y nhÞ ph©n lµ c©y cã bËc b»ng 2, tøc lµ sè nót con tèi ®a cña mét nót bÊt kú trong c©y lµ 2.

C©y nhÞ ph©n cã thÓ lµ mét c©y rçng (kh«ng cã nót nµo) hoÆc c©y chØ cã mét nót, hoÆc c©y chØ cã c¸c nót con bªn tr¸i (Left Child) hoÆc nót con bªn ph¶i (Right Child) hoÆc c¶ hai.

VÝ dô: H×nh 5.4 lµ c©y nhÞ ph©n.

2. C¸c c©y nhÞ ph©n ®Æc biÖt:C¸c c©y nhÞ ph©n ®Æc biÖt:C¸c c©y nhÞ ph©n ®Æc biÖt:C¸c c©y nhÞ ph©n ®Æc biÖt:

- C©y nhÞ ph©n ®óng: Mét c©y nhÞ ph©n ®−îc gäi lµ c©y nhÞ ph©n ®óng nÕu nót gèc vµ tÊt c¶ c¸c nót trung gian ®Òu cã 2 nót con.

A

B

D E

G Y

C

X F

H I

H×nh 5.5. C©y nhÞ ph©n ®óng

Ghi chó: nÕu c©y nhÞ ph©n ®óng cã n nót l¸ th× c©y nµy sÏ cã tÊt c¶ 2n-1 nót.

- C©y nhÞ ph©n ®Çy: Mét c©y nhÞ ph©n gäi lµ c©y nhÞ ph©n ®Çy víi chiÒu cao d th×:

Page 109: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 109

. Nã ph¶i lµ c©y nhÞ ph©n ®óng vµ

. TÊt c¶ c¸c nót l¸ ®Òu cã møc lµ d.

H×nh 5.5 kh«ng ph¶i lµ c©y nhÞ ph©n ®Çy

A

B

D

H I

E

J K

C

F

L M

G

N 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è nót tèi ®a ë mçi møc.

- C©y nhÞ ph©n t×m kiÕm (Binary Search Tree): Mét c©y nhÞ ph©n gäi lµ c©y nhÞ ph©n t×m kiÕm nÕu vµ chØ nÕu ®èi víi mäi nót cña c©y th× khãa cña mét nót bÊt kú ph¶i lín h¬n khãa cña tÊt c¶ c¸c nót trong c©y con bªn tr¸i cña nã vµ ph¶i nhá h¬n khãa cña tÊt c¶ c¸c nót trong c©y con bªn ph¶i cña nã.

VÝ dô:

8

7 9

3

12

11

102

1

5

4 6

k1 <k1 <k1

H×nh 5.7. C©y nhÞ ph©n t×m kiÕm (BST)

- C©y nhÞ ph©n c©n b»ng (AVL): Mét c©y nhÞ ph©n ®−îc gäi lµ c©y nhÞ ph©n c©n b»ng nÕu vµ chØ nÕu ®èi víi mäi nót cña c©y th× chiÒu cao cña c©y con bªn tr¸i vµ chiÒu cao cña c©y con bªn ph¶i h¬n kÐm nhau nhiÒu nhÊt lµ 1. (Theo Adelson-Velski vµ Landis).

Page 110: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 110

A

C

E F

B

D

G I JH 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: Mét c©y nhÞ ph©n ®−îc gäi lµ c©y nhÞ ph©n c©n b»ng hoµn toµn nÕu vµ chØ nÕu ®èi víi mäi nót cña c©y th× sè nót cña c©y con bªn tr¸i vµ sè nót cña c©y con bªn ph¶i h¬n kÐm nhau nhiÒu nhÊt lµ 1.

A

C

E F

B

D

IH

E

H

H×nh5.9. C©y nhÞ ph©n c©n b»ng hoµn toµn

3. C¸c phÐp duyÖt c©y nhÞ ph©n C¸c phÐp duyÖt c©y nhÞ ph©n C¸c phÐp duyÖt c©y nhÞ ph©n C¸c phÐp duyÖt c©y nhÞ ph©n (Traverse) : lµ qu¸ tr×nh ®i qua c¸c nót ®óng mét lÇn. Khi duyÖt c©y, ta th−êng dïng 3 c¸ch duyÖt c¬ b¶n sau :

� PreorderPreorderPreorderPreorder - TiÒn tù (NLR) duyÖt qua nót gèc tr−íc, sau ®ã ®i qua c©y con bªn tr¸i l¹i ¸p dông Preorder cho c©y con bªn tr¸i. Cuèi cïng qua c©y con bªn ph¶i, ¸p dông Preorder cho c©y con bªn ph¶i.

VÝ dô: Theo c©y nhÞ ph©n 5.4, ta cã:

ROOTROOTROOTROOT à 1 à 2 à 3 à 4 à 6 à 7 à 5 à 8 à 9

�InorderInorderInorderInorder - Trung tù (LNR) : qua c©y con bªn tr¸i duyÖt tr−íc (theo thø tù LNR), sau ®ã th¨m nót gèc. Cuèi cïng qua c©y con bªn ph¶i (theo thø tù LNR)

VÝ dô: Theo c©y nhÞ ph©n 5.4, ta cã:

ROOTROOTROOTROOT à 2 à 1 à 6 à 4 à 7 à 3 à 8 à 5 à 9

�Postorder Postorder Postorder Postorder ---- HËu tù (LRN) : qua c©y con bªn tr¸i duyÖt tr−íc (theo thø tù LRN), sau ®ã qua c©y con bªn ph¶i (theo thø tù LRN). Cuèi cïng th¨m nót gèc.

VÝ dô: Theo c©y nhÞ ph©n 5.4, ta cã: ROOTROOTROOTROOT à 2 à 6 à 7 à 4 à 8 à 9 à 5 à 3 à 1

Ghi chóGhi chóGhi chóGhi chó : §èi víi c©y ta cã thÓ tæ chøc thø tù theo khãa lµ mét néi dung cña nót hoÆc ta ®Æt thªm 1 field gäi lµ khãa cña nót .

II.2. II.2. II.2. II.2. C¸c phÐp to¸n trªn c©y nhÞ ph©nC¸c phÐp to¸n trªn c©y nhÞ ph©nC¸c phÐp to¸n trªn c©y nhÞ ph©nC¸c phÐp to¸n trªn c©y nhÞ ph©n::::

Page 111: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 111

---- Khai b¸oKhai b¸oKhai b¸oKhai b¸o: : : : §Ó tæ chøc d÷ liÖu theo c©y nhÞ ph©n, ta cã thÓ dïng mét néi dung cña d÷ liÖu ®Ó lµm khãa s¾p xÕp vµ tæ chøc c©y theo nhiÒu c¸ch kh¸c nhau. Nh−ng th«ng th−êng ®Ó thuËn tiÖn cho viÖc t×m kiÕm vµ thùc hiÖn c¸c phÐp to¸n kh¸c trªn c©y, ng−êi ta t¹o thªm mét khãa 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 treetreetreetree qu¶n lý mét c©y nhÞ ph©n, víi néi dung info chøa 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 treetreetreetree;

1. 1. 1. 1. T¹o c©yT¹o c©yT¹o c©yT¹o c©y::::

a. Khëi t¹o c©y(Initialize): dïng ®Ó khëi ®éng c©y nhÞ ph©n, cho ch−¬ng tr×nh hiÓu lµ hiÖn t¹i c©y nhÞ ph©n rçng.

void Initialize(NODEPTR &root) { root = NULL; } Lêi gäi hµm: Initialize(tree); b. CÊp ph¸t vïng nhí (New_Node): cÊp ph¸t mét nót cho c©y nhÞ ph©n.

Hµm New_Node nµy tr¶ vÒ ®Þa chØ cña nót võa cÊp ph¸t. NODEPTR New_Node(void) { NODEPTR p; p = (NODEPTR)malloc(sizeof(struct nodetype)); return(p); } Lêi gäi hµm: p= New_Node(); c. T¹o c©y BST (Create_Tree): Trong gi¶i thuËt t¹o c©y BST, ta cã dïng

hµm Insert. Hµm Insert: dïng ph−¬ng ph¸p ®Ö qui thªm nót cã khãa x, néi dung a vµo

c©y cã nót gèc 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).

Page 112: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 112

void Insert(NODEPTR root, int x, int a) { NODEPTR p; if(x == root->key) // khãa bÞ trïng, dõng ch−¬ng tr×nh { printf("bi trung khoa, khong them nut nay duoc"); return; } if(x < root->info && root->left == NULL) // ®iÒu kiÖn dõng gi¶i thuËt ®Ö qui {

p = New_Node(); // cÊp ph¸t vïng 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 dõng 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) // b−íc ®Ö qui Insert(root->left, x,a); // gäi ®Ö qui qua nh¸nh tr¸i else Insert(root->right, x,a); // gäi ®Ö qui qua nh¸nh ph¶i } void Create_Tree(NODEPTR &root) { int khoa, noidung; char so[10]; NODEPTR p; do

Page 113: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 113

{ printf("Nhap khoa :"); gets(so) ; khoa = atoi(so); if (khoa !=0) { printf("Nhap noi dung :"); gets(so) ; noidung = atoi(so); if (root==NULL) { p = New_Node();

p->key = khoa; p->info = noidung; p->left = NULL; p->right = NULL; root =p;

} else Insert(root,khoa,noidung); } } while (khoa!=0); // khãa =0 th× dõng nhËp } Ghi chó : §Ó t¹o c©y nhÞ ph©n do biÕn tree qu¶n lý, ta gäi:

Create_Tree(tree);

2. 2. 2. 2. CËp nhËt c©yCËp nhËt c©yCËp nhËt c©yCËp nhËt c©y:::: a. Gi¶i phãng vïng nhí(Free_Node): gi¶i phãng vïng nhí mµ p ®ang trá ®Õn.

void Free_Node(NODEPTR p) { free(p); } Lêi gäi hµm: Free_Node (p);

b. KiÓm tra c©y nhÞ ph©n rçng hay kh«ng (Empty): hµm Empty tr¶ vÒ TRUE nÕu c©y nhÞ ph©n rçng, vµ ng−îc l¹i.

int Empty(NODEPTR root) return(root == NULL ? TRUE : FALSE); }

Lêi gäi hµm: Empty(tree)

c. Hñy bá mét nót trong c©y nhÞ ph©n BST (Remove):

Xãa nót cã khãa lµ x trong c©y nhÞ ph©n t×m kiÕm sao cho sau khi xãa th× c©y nhÞ ph©n vÉn lµ c©y nhÞ ph©n t×m kiÕm. Ta cã 3 tr−êng hîp :

Page 114: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 114

- Tr−êng hîp 1: nót p cÇn xãa lµ nót l¸. ViÖc xãa nót p chØ ®¬n gi¶n lµ hñy nót p

p1

p

p1

p1

p

p1

- Tr−êng hîp 2: Nót p cÇn xãa cã 1 c©y con, th× ta cho rp chØ tíi nót p. Sau ®ã, ta t¹o liªn kÕt tõ nót cha cña p tíi nót con cña rp, cuèi cïng hñy nót p.

10

5

3

15

12 20

2 4

p xoùa nuùt p 10

3 15

12 202 4

rp

H×nh 5.10. Xãa nót p trong tr−êng hîp nót nµy cã 1 c©y con bªn tr¸i.

2

10

5

3

15

4

20

18 25

rp

pxoùa nuùt p

10

5

3

20

18 25

2 4

H×nh 5.11. Xãa nót p trong tr−êng hîp nót nµy cã 1 c©y con bªn ph¶i.

- Tr−êng hîp 3: Nót p cÇn xãa cã 2 c©y con. Ta cho rp chØ tíi nót p. Do tÝnh chÊt nót cùc tr¸i cña c©y con bªn ph¶i cña p cã khãa võa lín h¬n khãa cña p, nªn ®Ó lo¹i p th× ta sÏ cho r chØ tíi nót cùc tr¸i ®ã. Sau ®ã, ta sao chÐp néi dung vµ khãa cña nót r vµo nót mµ rp ®ang chØ tíi. Ta t¹o liªn kÕt thÝch hîp ®Ó bøt nót rp ra khái c©y nhÞ ph©n vµ cuèi cïng xãa nót rp.

Page 115: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 115

10

5 20

15 30

12 18

28

25 35

p

nuùt traùi nhaát cuûa caây con beân phaûi

10

5 25

15 30

12 18 28 35

r

H×nh 5.12. Xãa nót p trong tr−êng hîp nót nµy cã 2 c©y con.

Hµm RemoveRemoveRemoveRemove xãa nót cã khãa lµ x:

NODEPTR rp;

void remove_case_3 ( NODEPTR &r )

{

if (r->left != NULL)

remove_case_3 (r->left);

//den day r la nut cuc trai cua cay con ben phai co nut goc la rp}

else

{

rp->key = r->key; //Chep noi dung cua r sang rp ";

rp->info =r->info; // de lat nua free(rp)

rp = r;

r = r->right;

}

}

void remove (int x , NODEPTR &p )

{

if (p == NULL) printf ("Khong tim thay");

else

if (x < p->key) remove (x, p->left);

else if (x > p->key)

remove (x, p->right);

else // p^.key = x

Page 116: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 116

{

rp = p;

if (rp->right == NULL) p = rp->left; // p lµ nót 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);

}

}

Lêi gäi hµm: Remove(x, tree); // x lµ khãa cña nót muèn xãa

d. T×m kiÕm (Search): T×m nót cã khãa b»ng x trªn c©y nhÞ ph©n BST cã gèc lµ root. NÕu t×m thÊy x trong c©y th× tr¶ vÒ ®Þa chØ cña nót cã trÞ b»ng x trong c©y, nÕu kh«ng 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 ph−¬ng 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); }

Lêi gäi hµm: p=Search(tree, x);

3. 3. 3. 3. C¸c phÐp duyC¸c phÐp duyC¸c phÐp duyC¸c phÐp duyÖt c©yÖt c©yÖt c©yÖt c©y: : : : Cã 3 c¸ch duyÖt c¬ b¶n lµ NLR, LNR, LRN vµ mét c¸ch ®Æc biÖt lµ duyÖt c©y theo møc. ë ®©y, ta chØ xÐt 3 ph−¬ng ph¸p duyÖt NLR, LNR vµ LRN. XÐt c©y sau :

Page 117: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 117

4

2

1

5

3 6

a. DuyÖt c©y 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 c©y 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 c©y theo thø tù LRN (Posorder):

void Posorder(NODEPTR root) { if(root != NULL) { Posorder(root->left); Posorder(root->right); printf("%d ", root->info); } }

III. c©y nhÞ ph©n T×M KIÕM c©n b»ng (AVL):

Chóng ta t¹o c©y nhÞ ph©n t×m kiÕm môc ®Ých lµ ®Ó t×m khãa cho nhanh, tuy nhiªn ®Ó t¨ng tèc ®é t×m kiÕm th× c©y cÇn ph¶i c©n ®èi vÒ 2 nh¸nh theo tõng nót trong c©y. Do vËy, ta sÏ t×m c¸ch tæ chøc l¹i c©y BST sao cho nã c©n b»ng.

Page 118: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 118

III.1. III.1. III.1. III.1. §Þnh nghÜa§Þnh nghÜa§Þnh nghÜa§Þ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 nót cña nã chiÒu cao cña c©y con bªn tr¸i cña nã vµ chiÒu cao cña c©y con bªn tr¸i chªnh lÖch nhau kh«ng qu¸ mét.

10

20

15 30

6

8

12 25 4018

H×nh 5.14. C©y nhÞ ph©n t×m kiÕm c©n b»ng

L−u ý: Víi c©y AVL, viÖc thªm vµo hay lo¹i bá 1 nót 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 côc bé b»ng c¸ch xoay tr¸i hoÆc xoay ph¶i ë mét vµi nh¸nh c©y con nªn gi¶m thiÓu chi phÝ c©n b»ng.

- ChØ sè c©n b»ngChØ sè c©n b»ngChØ sè c©n b»ngChØ sè c©n b»ng (balance factor) cña mét nót p trªn c©y AVL= lh(p) = lh(p) = lh(p) = lh(p) ---- rh(p)rh(p)rh(p)rh(p)

Trong ®ã: lh (p) lµ chiÒu cao cña c©y con bªn tr¸i cña p

rh(p) lµ chiÒu cao cña c©y con bªn ph¶i cña p

Ta cã c¸c tr−êng hîp sau:

bf(p) = 0 nÕu lh(p) = rh(p) nót p c©n b»ng

bf(p) = 1 nÕu lh(p) = rh(p) +1 nót p bÞ lÖch vÒ tr¸i

bf(p) = -1 nÕu lh(p) = rh(p) -1 nót p bÞ lÖch vÒ ph¶i

-1

1

0

B

0

B

0

1 -1

00

U4

0

U3U2

0

U1 B

0

B B

0

B

U8

0

U7U6

0

U5 U10

0

U9 U12

0

U11

A

B C

H×nh 5.15. Minh häa c¸c vÞ trÝ cã thÓ thªm nót l¸ vµo c©y AVL, khi thªm nót l¸ vµo 1 trong c¸c vÞ trÝ B th× c©y vÉn c©n b»ng, khi thªm nót l¸ vµo 1 trong c¸c vÞ

Page 119: Ky Thuat viet lap trinh

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 cña c¸c nót tr−íc khi thªm nót

III.2. III.2. III.2. III.2. C¸c phÐp to¸n trªn c©y AVLC¸c phÐp to¸n trªn c©y AVLC¸c phÐp to¸n trªn c©y AVLC¸c phÐp to¸n trªn c©y AVL::::

* * * * Khai b¸oKhai b¸oKhai b¸oKhai b¸o: : : : Ta khai b¸o c©y AVL víi mçi nót cã thªm tr−êng bf cho biÕt chØ sè c©n b»ng cña nót ®ã.

struct nodetype { int key; int info; int bf; struct nodetype *left, *right; }; typedef struct nodetype *NODEPTR;

III.2.1. III.2.1. III.2.1. III.2.1. Thªm nótThªm nótThªm nótThªm nót: : : :

- Néi dung: : : : Thªm 1 nót cã khãa x, néi 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 nót vµo c©y nh− b×nh th−êng, nghÜa lµ nót võa thªm sÏ lµ nót l¸.

§ TÝnh l¹i chØ sè c©n b»ng cña c¸c nót cã bÞ ¶nh h−ëng

§ KiÓm tra xem c©y cã bÞ mÊt c©n b»ng hay kh«ng? NÕu c©y bÞ mÊt c©n b»ng th× ta c©n b»ng l¹i c©y.

* Tr−íc hÕt, ta h·y xÐt xem c¸c tr−êng hîp nµo khi thªm nót lµm c©y bÞ Tr−íc hÕt, ta h·y xÐt xem c¸c tr−êng hîp nµo khi thªm nót lµm c©y bÞ Tr−íc hÕt, ta h·y xÐt xem c¸c tr−êng hîp nµo khi thªm nót lµm c©y bÞ Tr−íc hÕt, ta h·y xÐt xem c¸c tr−êng hîp nµo khi thªm nót lµm c©y bÞ mÊt c©n b»ngmÊt c©n b»ngmÊt c©n b»ngmÊt c©n b»ng.

Xem c©y h×nh 5.15, ta nhËn thÊy:

- NÕu thªm nót 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 nót 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 nót vµo sau bªn tr¸i cña nót A (cfA = 1) th× c©y sÏ bÞ mÊt c©n b»ng v× nót A ®ang bÞ lÖch tr¸i. §ã lµ c¸c vÞ trÝ U1, U2, U3, U4.

+ Thªm c¸c nót vµo sau bªn ph¶i cña nót C (cfC = -1) th× c©y sÏ bÞ mÊt c©n b»ng v× nót C ®ang bÞ lÖch ph¶i. §ã lµ c¸c vÞ trÝ U9, U10, U11, U12.

Tãm l¹i: Ta cã 2 tr−êng hîp khi thªm nót x vµo c©y AVL lµm c©y mÊt c©n b»ng, ®ã lµ thªm c¸c nót vµo sau bªn tr¸i cña nót cã cf = 1, vµ thªm c¸c nót vµo sau bªn ph¶i cña nót cã cf = -1.

Page 120: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 120

* C©n b»nC©n b»nC©n b»nC©n b»ng l¹i c©yg l¹i c©yg l¹i c©yg l¹i c©y: Gäi ya lµ nót tr−íc gÇn nhÊt bÞ mÊt c©n b»ng khi thªm nót x vµo c©y AVL. Do c¶ 2 tr−êng hîp bÞ mÊt c©n b»ng khi thªm nót x lµ t−¬ng tù nhau nªn ta chØ xÐt tr−êng hîp bfya=1 vµ nót l¸ thªm vµo lµ nót sau bªn tr¸i cña nót ya.

1

0 T3chieàucao nT1

chieàucao n

T2chieàucao n

S

ya

H×nh 5.16. Nh¸nh c©y con nót gèc ya tr−íc khi thªm nót.

NhËn xÐt:

- V× nót ya cã bfya = 1 nªn nót ya ch¾c ch¾n cã nót con bªn tr¸i s víi bfs = 0

- V× ya lµ nót gÇn nhÊt cã bf lµ 1 nªn nót s vµ c¸c nót tr−íc kh¸c cña nót x (sÏ thªm vµo) cã bf lµ 0.

-§écao (T1) = §écao(T2) = §écao(T3)

Tr−êng hîp 1aTr−êng hîp 1aTr−êng hîp 1aTr−êng hîp 1a: NÕu thªm nót míi x vµo vÞ trÝ nót sau bªn tr¸i cña s (thuéc nh¸nh T1) ta xoay ph¶i quanh nót ya

- Nót s sÏ lµ nót gèc míi cña nh¸nh c©y nµy víi bfs = 0

- Nót ya lµ nót con bªn ph¶i cña s víi bfya = 0.

0

T1chieàusaâu n

0

T2chieàusaâun

T3chieàusaâu n

S

ya

x

2

1 T3chieàusaâu nT1

chieàusaâun

T2chieàusaâu n

S

ya

x

xoay phaûiquanh nuùt ya

H×nh 5.17. Xoay ph¶i quanh nót ya ®Ó c©n b»ng l¹i c©y.

Page 121: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 121

Tr−êng hîp 1bTr−êng hîp 1bTr−êng hîp 1bTr−êng hîp 1b: NÕu thªm nót míi x vµo vÞ trÝ nót sau bªn ph¶i cña s (thuéc nh¸nh T2) ta xoay 2 lÇn (xoay kÐp): xoay tr¸i quanh nót s vµ xoay ph¶i quanh nót ya

- Nót p sÏ lµ nót gèc míi cña nh¸nh c©y nµy víi bfp = 0

- Nót ya lµ nót con bªn ph¶i cña p víi bfya = -1

- Nót s lµ nót con bªn tr¸i cña p víi bfs = 0

2

-1 T3chieàusaâu nT1

chieàusaâun

S

ya

1

T2-1chieàusaâun-1

T2-2chieàusaâun-1

x

p

C©y AVL sau khi thªm nót x

x

T2-1chieàusaâu n-1

2

0

T1chieàusaâun

S

p

T2-2chieàusaâun-1

T3chieàusaâun

ya2

xoay traùi

quanh nuùt S

Page 122: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 122

xoay phaûi

quanh nuùt ya

x

T2-1chieàusaâu n-1

0

0

T1chieàusaâun

S

p

-1

T2-2chieàusaâun-1

T3chieàusaâun

ya

H×nh 5.18. Xoay kÐp (xoay tr¸i quanh nót s, xoay ph¶i quanh nót ya) ®Ó c©n b»ng l¹i c©y.

B¶ng sau ®©y ph©n biÖt c¸c tr−êng hîp c©y bÞ mÊt c©n b»ng khi thªm nót vµ c¸c phÐp xoay c©y t−¬ng øng ®Ó c©n b»ng l¹i c©y:

Tr−êng hîpTr−êng hîpTr−êng hîpTr−êng hîp Tr−íc khi thªm Tr−íc khi thªm Tr−íc khi thªm Tr−íc khi thªm nót xnót xnót xnót x

Sau khi thªm Sau khi thªm Sau khi thªm Sau khi thªm nót xnót xnót xnót x

C¸c phÐp xoay c©y vµ chØ C¸c phÐp xoay c©y vµ chØ C¸c phÐp xoay c©y vµ chØ C¸c phÐp xoay c©y vµ chØ sè c©n b»ng míisè c©n b»ng míisè c©n b»ng míisè c©n b»ng míi

1.a bfya = 1 bfs = 0

bfya = 2 bfs = 1

Xoay ph¶i quanh nót ya bfs=0, bf ya = 0

1.b bfya = 1 bfs = 0

bfya = 2 bfs = -1

Xoay kÐp 1. Xoay tr¸i quanh nót s 2. Xoay ph¶i quanh nót ya bfs=0, bf ya = -1

2.a bfya = -1 bfs = 0

bfya = -2 bfs = -1

Xoay tr¸i quanh nót ya bfs=0, bf ya = 0

2.b bfya = -1 bfs = 0

bfya = -2 bfs = 1

Xoay kÐp 1. Xoay ph¶i quanh nót s 2. Xoay tr¸i quanh nót ya bfs=0, bf ya = 1

- Gi¶i thuËt:

˜ PhÐp xoay tr¸i (Rotate_Left): xoay tr¸i c©y nhÞ ph©n t×m kiÕm cã nót gèc lµ root, yªu cÇu root ph¶i cã nót con bªn ph¶i (gäi lµ nót p). Sau khi xoay tr¸i th× nót p trë thµnh nót gèc, nót gèc cò trë thµnh nót con bªn tr¸i cña nót gèc míi.

PhÐp xoay tr¸i tr¶ vÒ con trá chØ nót gèc míi.

Page 123: Ky Thuat viet lap trinh

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

˜ PhÐp xoay ph¶i (Rotate_Right): xoay ph¶i c©y nhÞ ph©n t×m kiÕm cã nót gèc lµ root, yªu cÇu root ph¶i cã nót con bªn tr¸i (gäi lµ nót p). Sau khi xoay ph¶i th× nót p trë thµnh nót gèc, nót gèc cò trë thµnh nót con bªn ph¶i cña nót gèc míi.

PhÐp xoay ph¶i tr¶ vÒ con trá chØ nót gèc míi. 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; }

Page 124: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 124

˜ Thªm nót (Insert): thªm nót cã khãa x, néi dung a vµo c©y AVL:

- Thªm nót theo gi¶i thuËt thªm nót 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 kÐp

void Insert(NODEPTR &pavltree, int x, int a) { NODEPTR fp, p, q, // fp lµ nót cha cña p, q lµ con cña p fya, ya, /* ya lµ nót tr−íc gÇn nhÊt cã thÓ mÊt c©n b»ng fya lµ nót cha cña ya */ s; // s lµ nót con cña ya theo h−íng 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 */ // Khëi ®é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 vïng nhí q->key =x; q->info = a; q->bf = 0; q->left = NULL;

Page 125: Ky Thuat viet lap trinh

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

Page 126: Ky Thuat viet lap trinh

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

Page 127: Ky Thuat viet lap trinh

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ö dông 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); // khãa =0 th× dõng nhËp }

Ghi chó : §Ó t¹o c©y nhÞ ph©n do biÕn tree qu¶n lý, ta gäi:

Create_AVLTree(tree);

Page 128: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 128

III.2.2. III.2.2. III.2.2. III.2.2. CËp nhËt c©yCËp nhËt c©yCËp nhËt c©yCËp nhËt c©y::::

1. T×m kiÕm (Search): (Search): (Search): (Search): T×m nót cã khãa b»ng x trªn c©y nhÞ ph©n AVL cã gèc lµ root. NÕu t×m thÊy x trong c©y th× tr¶ vÒ ®Þa chØ cña nót cã trÞ b»ng x trongc©y, nÕu kh«ng 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 ph−¬ng ph¸p t×m kiÕm nhÞ ph©n, vµ do tÝnh chÊt lóc nµy c©y c©n b»ng nªn thêi gian t×m kiÕm sÏ nhanh h¬n 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. Xãa nótXãa nótXãa nótXãa nót: Remove: Remove: Remove: Remove(root, x):

- Néi dung: xãa nót cã khãa x trªn c©y AVL víi ®Þa chØ sao ®Çu root sao cho sau khi xãa th× c©y vÉn lµ AVL.

- Gi¶i thuËt:

NÕu root == NULL th× Th«ngb¸o ("Kh«ng thÓ xãa ®−îc nót x trªn c©y") NÕu root != NULL th× NÕu x< root->info th×:

+ Gäi ®Ö qui ®Ó xãa nót x ë nh¸nh bªn tr¸i cña root : Remove(root->left, x)

+ Gäi balance_left ®Ó c©n b»ng l¹i c©y nót gèc root nÕu nh¸nh c©y con bªn tr¸i bÞ gi¶m ®é cao.

NÕu x > root->info th×: + Gäi ®Ö qui ®Ó xãa nót x ë nh¸nh bªn ph¶i cña root :

Remove(root->right, x) + Gäi balance_right ®Ó c©n b»ng l¹i c©y nót gèc root nÕu nh¸nh c©y

con bªn ph¶i bÞ gi¶m ®é cao. NÕu x==root->info th×:

Xãa nót root nh− phÐp to¸n xãa trªn c©y nhÞ ph©n BST.

- Ch−¬ng tr×nh : tù cµi ®Æt.

Page 129: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 129

III.2.3. III.2.3. III.2.3. III.2.3. C¸c phÐp duyÖt c©yC¸c phÐp duyÖt c©yC¸c phÐp duyÖt c©yC¸c phÐp duyÖt c©y::::

Do c©y AVL còng lµ c©y nhÞ ph©n nªn ta sÏ ¸p dông l¹i c¸c ph−¬ng ph¸p duyÖt Preorder, Inorder vµ Postorder vµo c©y AVL.

a. DuyÖt c©y 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 c©y 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 c©y theo thø tù LRN (Posorder):

void Posorder(NODEPTR root) { if(root != NULL) { Posorder(root->left); Posorder(root->right); printf("%d ", root->info); } }

Page 130: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 130

Bµi tËpBµi tËpBµi tËpBµi tËp::::

1. ViÕt l¹i c¸c ch−¬ng tr×nh duyÖt c©y nhÞ ph©n theo ph−¬ng ph¸p kh«ng ®Ö qui.

2. ViÕt ch−¬ng tr×nh t¹o mét menu thùc hiÖn c¸c môc sau:

a. T¹o c©y nhÞ ph©n t×m kiÕm víi néi dung lµ sè nguyªn (kh«ng trïng nhau).

b. LiÖt kª c©y nhÞ ph©n ra mµn h×nh theo thø tù NLR

c. §Õm tæng sè nót, sè nót l¸, vµ sè nót trung gian cña c©y.

d. TÝnh ®é cao cña c©y.

e. Lo¹i bá nót cã néi dung lµ x trong c©y nhÞ ph©n BST.

f. Thªm nót cã néi 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 mét c©y nhÞ ph©n tree, h·y viÕt ch−¬ng tr×nh ®Ó sao chÐp nã thµnh mét c©y míi tree2, víi khãa, néi dung, vµ liªn kÕt gièng 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 kh«ng. b. Cã ph¶i lµ c©y nhÞ ph©n ®Çy kh«ng.

5. ViÕt hµm kiÓm tra nót x vµ y cã trªn c©y hay kh«ng, nÕu cã c¶ x lÉn y trªn c©y th× x¸c ®Þnh nót gèc cña c©y con nhá nhÊt cã chøa x vµ y.

6. Cho mét c©y biÓu thøc, h·y viÕt hµm Calculate (NODEPTR root) ®Ó tÝnh gi¸ trÞ cña c©y biÓu thøc ®ã, biÕt r»ng c¸c to¸n tö ®−îc dïng trong biÓu thøc 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 nót 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 thøc sè häc, chuyÓn biÓu thøc ®ã thµnh c©y nhÞ ph©n, nót gèc lµ to¸n tö, nót l¸ lµ c¸c to¸n h¹ng, biÕt r»ng c¸c to¸n tö ®−îc dïng trong biÓu thøc lµ: + - * / ^ % !

Page 131: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 131

MôC LôC

CH¦¥NG i §¹I C¦¥NG VÒ LËP TR×NH --------------------------------------------------- 1 I. Kh¸i niÖm thuËt to¸n --------------------------------------------------------------------------- 1

I.1. Kh¸i niÖm --------------------------------------------------------------------------------------------------- 1 I.2. C¸c tÝnh chÊt ®Æc tr−ng cña thuËt to¸n ----------------------------------------------------- 1 I.3. Ph©n lo¹i ----------------------------------------------------------------------------------------------------- 1

II. M« t¶ thuËt to¸n b»ng l−u ®å ---------------------------------------------------- 1 II.1. L−u ®å ------------------------------------------------------------------------------------------------------- 1 II.2. C¸c ký hiÖu trªn l−u ®å ---------------------------------------------------------------------------- 1 II.3. Mét sè vÝ dô biÓu diÔn thuËt to¸n b»ng l−u ®å ---------------------------------------- 2

III. C¸C NG«N NG÷ LËP TR×NH & CH−¬NG TR×NH DÞCH -------------------- 5 III.1. Ng«n ng÷ lËp tr×nh ----------------------------------------------------------------------------------- 5 III.2. Ch−¬ng tr×nh dÞch ------------------------------------------------------------------------------------ 6

CH−¬NG 2 LµM QUEN VíI NG«N NG÷ C -------------------------------------------- 7 * Giíi thiÖu ng«n ng÷ C -------------------------------------------------------------------------- 7 I. C¸C KH¸I NIÖM C¬ B¶N ---------------------------------------------------------------------------- 7

I.1. CÊu tróc c¬ b¶n cña mét ch−¬ng tr×nh C -------------------------------------------------- 7 I.2. KiÓu d÷ liÖu c¬ b¶n ---------------------------------------------------------------------------------- 13 I.3. BiÕn ----------------------------------------------------------------------------------------------------------- 14 I.4 H»ng ----------------------------------------------------------------------------------------------------------- 18 I.5. PhÐp to¸n -------------------------------------------------------------------------------------------------- 20

* Sù chuyÓn kiÓu ----------------------------------------------------------------------------------------- 29 * Møc ®é −u tiªn cña c¸c phÐp to¸n ---------------------------------------------------------- 29

I.6. Chuçi --------------------------------------------------------------------------------------------------------- 30

II. C¸c cÊu tróc ®iÒu khiÓn trong C----------------------------------------------- 33 II.1 CÊu tróc tuÇn tù (Sequence) ------------------------------------------------------------------ 33 II.2. CÊu tróc chän ------------------------------------------------------------------------------------------ 34

II.2.1. LÖnh if else -------------------------------------------------------------------------------------- 34 II.2.2. LÖnh switch_case----------------------------------------------------------------------------- 35

II.3. CÊu tróc 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

Page 132: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 132

III. Hµm - §Ö 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 tróc) --------------------------------------------------------------- 61 V.3. Ph¸t hiÖn lçi khi truy xuÊt tËp tin ---------------------------------------------------------- 66

Bµi tËp ---------------------------------------------------------------------------------------------------------------- 67 CH−¬NG 3. C¸C THUËT TO¸N TR£N CÊU TRóC D÷ LIÖU M¶NG 69 I. M¶ng kh«ng s¾p xÕp vµ thuËt to¸n t×m kiÕm ------------------ 69 trªn m¶ng ch−a cã thø tù

I.1. Mét sè kh¸i niÖm vÒ m¶ng ---------------------------------------------------------------------- 69 I.2. ThuËt to¸n t×m kiÕm trªn m¶ng ch−a cã thø tù --------------------------------------- 71

II. C¸c thuËt to¸n s¾p xÕp ------------------------------------------------------------------- 73 II.1. S¾p xÕp theo ph−¬ng ph¸p Bubble_Sort ------------------------------------------------ 73 II.2. S¾p xÕp theo ph−¬ng ph¸p Quick_Sort -------------------------------------------------- 75

III. T×m kiÕm trªn m¶ng ®· cã thø tù --------------------------------------------- 79 III.1. T×m kiÕm nhanh b»ng ph−¬ng ph¸p lÆp ----------------------------------------------- 79 III.2. PhÐp t×m kiÕm nhÞ ph©n------------------------------------------------------------------------- 80 III.3. PhÐp t×m kiÕm nhÞ ph©n ®Ö qui ------------------------------------------------------------- 81

Bµi tËp ---------------------------------------------------------------------------------------------------------------- 82 CH¦¥NG 4 CON TRá (POINTER) ---------------------------------------------------------- 84 I. §ÞNH NGHÜA ------------------------------------------------------------------------------------------------- 84

I.1. Khai b¸o ---------------------------------------------------------------------------------------------------- 84 I.2. TruyÒn ®Þa chØ cho hµm --------------------------------------------------------------------------- 85

II C¸c phÐp to¸n trªn biÕn con trá ------------------------------------------------ 85 II.1. To¸n tö ®Þa chØ & ----------------------------------------------------------------------------------- 85 II.2. To¸n tö néi dung * --------------------------------------------------------------------------------- 85 II.3. PhÐp céng trõ biÕn con trá víi mét sè nguyªn -------------------------------------- 86 II.4. PhÐp g¸n vµ phÐp so s¸nh ----------------------------------------------------------------------- 86 II.5. Sù chuyÓn kiÓu ---------------------------------------------------------------------------------------- 86 II.6. Khai b¸o mét con trá h»ng vµ con trá chØ ®Õn ®èi t−îng h»ng ------------ 87

III. Sù t−¬ng quan gi÷a con trá vµ m¶ng ----------------------------------- 87

Page 133: Ky Thuat viet lap trinh

Kü thuËt lËp tr×nh 133

IV. Con trá vµ chuçi -------------------------------------------------------------------------------- 91 IV.1. Khai b¸o ------------------------------------------------------------------------------------------------- 91 IV.2. XÐt mét sè vÝ dô vÒ c¸c hµm xö lý chuçi --------------------------------------------- 91 IV.3. M¶ng con trá chØ ®Õn chuçi ------------------------------------------------------------------ 93

Bµi tËp ---------------------------------------------------------------------------------------------------------------- 95 CH¦¥NG 5 C¸C THUËT TO¸N TR£N CÊU TRóC --------------------------- 96 DANH S¸CH LI£N KÕT (LINKED LIST). I. Kh¸i niÖm----------------------------------------------------------------------------------------------------------------- 96 II. C¸c phÐp to¸n trªn danh s¸ch liªn kÕt ------------------------------------ 97

II.1. T¹o danh s¸ch------------------------------------------------------------------------------------------ 97 II.2. CËp nhËt danh s¸ch --------------------------------------------------------------------------------- 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 CH−¬NG 6 c¸c thuËt to¸n trªn cÊu tróc c©Y --------------------- 104 I. Ph©n lo¹i c©y ---------------------------------------------------------------------------------------- 104

I.1. Mét sè kh¸i niÖm c¬ b¶n ----------------------------------------------------------------------- 104 I.2. C¸ch biÓu diÔn c©y --------------------------------------------------------------------------------- 106 I.3. BiÓu diÔn thø tù c¸c nót trong c©y --------------------------------------------------------- 106

II. C©y nhÞ ph©n (Binary tree) ---------------------------------------------------------- 107 II.1. §Þnh nghÜa --------------------------------------------------------------------------------------------- 107 II.2. C¸c phÐp to¸n trªn c©y nhÞ ph©n ---------------------------------------------------------- 110

1. T¹o c©y -------------------------------------------------------------------------------------------------- 110 2. CËp nhËt c©y------------------------------------------------------------------------------------------ 112 3. C¸c phÐp duyÖt c©y ------------------------------------------------------------------------------- 116

III. c©y nhÞ ph©n T×M KIÕM c©n b»ng (AVL) -------------------------------- 117 III.1. §Þnh nghÜa ------------------------------------------------------------------------------------------- 117 III.2. C¸c phÐp to¸n trªn c©y AVL --------------------------------------------------------------- 118

III.2.1. Thªm nót --------------------------------------------------------------------------------------- 118 III.2.2. CËp nhËt c©y --------------------------------------------------------------------------------- 126 III.2.3. C¸c phÐp duyÖt c©y ---------------------------------------------------------------------- 127

Bµi tËp -------------------------------------------------------------------------------------------------------------- 129

Page 134: Ky Thuat viet lap trinh

TµI LIÖU THAM KH¶OTµI LIÖU THAM KH¶OTµI LIÖU THAM KH¶OTµI LIÖU THAM KH¶O

1. Kü thuËt lËp tr×nh Turbo C §ç Phóc, NguyÔn Phi Khö, 1992 T¹ Minh Ch©u, NguyÔn §×nh Tª

2. 2. 2. 2. CÊu tróc d÷ liÖu – øng dông NguyÔn Hång Ch−¬ng 1999 vµ cµi ®Æt b»ng C

3.3.3.3. Nh÷ng viªn ngäc Kü thuËt JohnBentley lËp tr×nh