โครงสร้างข้อมูล (2)

22
โครงสร้างข้อมูล (หน่วยที2 โครงสร้างข้อมูลแบบคงที่) อาจารย์เจตวัฒน์ สมเจริญเกียรติ สาขาวิชาคอมพิวเตอร์ธุรกิจ วิทยาลัยเทคโนโลยีวิมลบริหารธุรกิจ

Upload: wbac2554hotmailcom-somcharoenkat

Post on 30-Mar-2016

220 views

Category:

Documents


0 download

DESCRIPTION

โครงสร้างข้อมูลแบบคงที่

TRANSCRIPT

Page 1: โครงสร้างข้อมูล (2)

โครงสร้างข้อมูล (หน่วยที่ 2 โครงสร้างข้อมูลแบบคงที่)

อาจารย์เจตวัฒน์ สมเจริญเกียรติ

สาขาวิชาคอมพิวเตอร์ธุรกิจ วิทยาลัยเทคโนโลยีวิมลบริหารธุรกิจ

Page 2: โครงสร้างข้อมูล (2)

โครงสร้างข้อมูลแบบคงที่ 2.1 โครงสร้างข้อมูลแบบอาร์เรย์ (Array) 2.2 โครงสร้างข้อมูลแบบคิว (Queue) 2.3 โครงสร้างข้อมูลแบบสแตก (Stack)

โครงสร้างข้อมูลแบบอาร์เรย์ (Array) เป็นโครงสร้างข้อมูลที่มีลักษณะเป็นเชิงเส้น (Linear List) และมีพื้นที่ในการจัดเก็บข้อมูลแบบคงที่ (Static) รูปแบบคือ ตารางที่เป็นช่อง ๆ แต่ละช่องต้องเก็บข้อมูลที่เหมือนกัน และมีขนาดที่เท่ากันทุกช่องลักษณะหรือโครงสร้างของอาร์เรย์ (Array) ประกอบไปด้วย

1. ชื่อของอาร์เรย์ 2. ขนาดหรือมิติ 3. ค่าสูงสุด (Upper Bound) และค่าต่่าสุด (Lower Bound)

Page 3: โครงสร้างข้อมูล (2)

อาร์เรย์ 1 มิติ (One-dimensional Array) แถวล่าดับ 1 มิติ เป็นแบบที่การอ้างอิง หรือการเข้าถึงสมาชิกตัวใด โดยใช้ตัวบอกล่าดับ (Subscript) เพียงตัวเดียว เช่น ก่าหนด A เป็นแถวล่าดับ 1 มิติ ที่มีสมาชิก 1 ถึง 4 จะได้สมาชิกของ A เป็น A(1) , A(2) , A(3) , A(4) รูปแบบของอาร์เรย์ 1 มิติ โดยทั่ว ๆ ไป จะอยู่ในลักษณะ A[1 : N] คือจะมีจ่านวนสมาชิก 1 ถึง N หรือ A[l : u]

1 32 4

A

-5 ...-4 8 9

A(4) =

A(1:4)

BB(-5:9) =

ตัวอย่าง ชื่ออาร์เรย์ (Array) 1 มิติ 1. A[1:50] 2. B[39:101] 3. C[-25:-1] 4. D[-66:-19] 5. F[-85:73] 6. IA[-25783 : 25441] 7. S[25110] 8. U[588]

Page 4: โครงสร้างข้อมูล (2)

การค่านวณหาจ่านวนช่องของอาร์เรย์ (Array) 1 มิติ สูตร จ่านวนช่องของ Array = u - l + 1 เช่น A(4) หรือ A(1:4) จ่านวนช่องของ Array = u - l + 1

= 4 - 1 + 1 = 4 ช่อง

B(-5:9) จ่านวนช่องของ Array = u - l + 1

= 9 - (-5) + 1 = 9 + 5 + 1

= 15 ช่อง

ให้ท ำ ค ำนวณหำจ ำนวนช่องของ Array ตำมตัวอย่ำง 8 ข้อข้ำงต้น ( 50 , 63 , 25 , 48 , 159 , 51224 , 25110 , 588)

Page 5: โครงสร้างข้อมูล (2)

การค่านวณหาแอดเดรสของ อาร์เรย์ (Array) 1 มิติ สิ่งที่ต้องทราบก่อนท่าการค่านวณ

1. จ่านวนช่องของอาร์เรย์ที่ต้องการ 2. แต่ละช่องของอาร์เรย์ใช้เนื้อที่เท่าไร 3. ต่าแหน่งแรกของอาร์เรย์ อยู่ ณ ต่าแหน่งใด 4. ค่า i ที่โจทย์ต้องการ

สูตร แอดเดรสที่ต้องการ = แอดเดรส [A(l)] + C ( i - l) แอดเดรส [A(l)] = แอดเดรสเริ่มต้น เช่น ให้ค่านวณหาแอดเดรสของ A(50) ของอาร์เรย์ A[-5 : 101] ซึ่งแต่ละช่องกินพื้นที่ 4 Byte ต่าแหน่งแรกของอาร์เรย์ A คือ 2101 วิธีท่า 1. อาร์เรย์นี้มีจ่านวนช่อง = u - l + 1

= 101 - (-5) + 1 = 107 ช่อง

2. แต่ละช่องของอาร์เรย์ใช้เนื้อที่ = 4 Byte 3. ต่าแหน่งแรกของอาร์เรย์อยู่ที่ = 2101 4. ค่า i ที่ต้องการ = 50

Page 6: โครงสร้างข้อมูล (2)

แทนค่าลงในสูตร แอดเดรสที่ต้องการ = แอดเดรส [A(l)] + C ( i - l) แอดเดรส [A(50)] = 2101 + 4(50-(-5)) = 2101 + 4(50 + 5) = 2101 + 4(55) = 2101 + 220 = 2321 **ทวนเร่ืองการแปลง Bit ==> เป็น Byte การแปลงเลขฐานต่าง ๆ ให้ท ำ

1. ก ำหนดให้ B เป็นอำร์เรย์ที่มีขนำด [-20 : 2] ใช้เนื้อที่ในกำรจัดเก็บข้อมูล (112) Byte B(-20) มีแอดเดรสอยู่ที่ต ำแหน่ง 7019 อยำกทรำบว่ำ B(0) จะอยู่ ณ ต ำแหน่งใด

Page 7: โครงสร้างข้อมูล (2)

อาร์เรย์ 2 มิติ (Two-dimensional Array) แถวล่าดับ 2 มิติ เป็นแบบที่การอ้างอิง หรือการเข้าถึงสมาชิกตัวใด จะใช้ตัวบอกล่าดับ 2 ตัว โดยโครงสร้างข้อมูลแบบนี ้เราสามารถมองได้ในลักษณะของเมตริกซ์ (Matrix) หรือ ตาราง (Table) กล่าวคือสมาชิกแต่ละตัวจะถูกจัดเรียงให้อยู่เป็นแถว (Row) และหลัก (Column) รูปแบบของอาร์เรย์ 2 มิติ โดยทั่ว ๆ ไป จะอยู่ในลักษณะ A[1 : M , 1 : N] คือจะมีจ่านวนแถว (M) และแต่ละแถวจะมี (N) ค่า หรือ A[l1 : u1 , l2 : u2] การเก็บข้อมูลในอาร์เรย์ 2 มิติ แบบซีเควนเชียว สามารถแบ่งได้เป็น 2 แบบคือ

1. แบบ Row Major หรือ Lexicographic Order ลักษณะการเก็บจะเกบ็แต่ละแถวต่อเนื่องกันไป เช่นการจัดเรียงของ ภาษาโคบอล , ภาษาพีแอลวัน (PL/1) และภาษาปาสคาล

N N N N M 1 1 1 2 … 1 N M 2 1 2 2 … 2 N M … … … M M 1 M 2 … M N

Page 8: โครงสร้างข้อมูล (2)

2. แบบ Column Major การเก็บอาร์เรย์ 2 มิติในลักษณะนี้ มักใช้ในภาษาฟอร์แทรน (Fortran) และภาษาเบสิค ลักษณะการเก็บจะเก็บแต่ละคอลัมน์ต่อเนื่องกันไป

M M M M N 1 1 2 1 … 1 M N 1 2 2 2 … 2 M N … … … N N 1 N 2 … N M

ตัวอย่างชื่ออาร์เรย์ 2 มิติ 1. A[500 , 100] 2. B[1 : 115 , 50] 3. C[-40 , 1 : 67] 4. D[0 : 24 , 0 : 42] 5. F[62 : 0 , -33 : 0] 6. IA[-32 : -7 , -99 : -42] 7. S[-100 : 72 , -30 : 110] 8. U[-7820 : 55 , 72 : 8890]

Page 9: โครงสร้างข้อมูล (2)

การค่านวณหาจ่านวนช่องของอาร์เรย์ 2 มิติ จ่านวนช่องของอาร์เรย์ 2 มิติ = (u1 - l1 + 1) (u2 - l2 + 1)

เช่น Lovely(1 : 4 , 0 : 9) จ่านวนช่องของ Array 2 มิติ = (u1 - l1 + 1) (u2 - l2 + 1)

= (4 - 1 + 1) (9 - 0 + 1) = (4) (10) = 40 ช่อง

ให้ท ำ ค ำนวณหำจ ำนวนช่องของ Array ดังน้ี 1. A[500 , 100] 2. B[1 : 115 , 50] 3. C[-40 , 1 : 67] 4. D[0 : 24 , 0 : 42] 5. F[62 : 0 , -33 : 0] 6. IA[-32 : -7 , -99 : -42] 7. S[-100 : 72 , -30 : 110] 8. U[-7820 : 55 , 72 : 8890] เฉลย (50000 , 5750 , 2814 , 1075 , 2142 , 1508 , 24393 , 69458444)

Page 10: โครงสร้างข้อมูล (2)

การค่านวณหาแอดเดรสของอาร์เรย์ 2 มิติ สิ่งที่ต้องทราบก่อนท่าการค่านวณ

1. จ่านวนช่องของอาร์เรย์ที่ต้องการ 2. แต่ละช่องของอาร์เรย์ใช้เนื้อที่เท่าไร 3. ต่าแหน่งแรกของอาร์เรย์ อยู่ ณ ต่าแหน่งใด 4. ค่า i ,j ที่โจทย์ต้องการ 5. ค่า M,N ที่โจทย์ต้องการ

เนื่องจาก การเก็บข้อมูลลงในอาร์เรย์แบบซีเควนเชียวนี้มี 2 แบบ ท่าให้สูตรในการหาต่าแหน่งแอดเดรส ของอาร์เรย์นี้ แตกต่างกันด้วย ดังนี้

ถ้าเก็บข้อมูลของอาร์เรย์แบบ Row Major หรือ Lexicographic Order จะใช้สูตร แอดเดรสที่ต้องการ = แอดเดรสเริ่มต้น + C ( i - l1 ) N + C ( j - l2 )

ถ้าเก็บข้อมูลของอาร์เรย์แบบ Column Major จะใช้สูตร แอดเดรสที่ต้องการ = แอดเดรสเริ่มต้น + C ( j - l2 ) M + C ( i - l1 )

Page 11: โครงสร้างข้อมูล (2)

เช่น ให้ค่านวณหาแอดเดรสของ A(3 , 6) ของอาร์เรย์ A[1 : 5 , 4 :7] ซึ่งแต่ละช่องกินพื้นที่ 4 Byte ต่าแหน่งแรกของอาร์เรย์ A คือ 2101 หาทั้งแบบ Row Major & Column Major วิธีท่า 1. อาร์เรย์นี้มีจ่านวนช่อง = (u1 - l1 + 1) (u2 - l2 + 1) = (5 - 1 + 1) (7 - 4 + 1) (จะได้ค่า M และ N) = (5) (4) = 20 ช่อง

2. แต่ละช่องของอาร์เรย์ใช้เนื้อที่ = 4 Byte 3. ต่าแหน่งแรกของอาร์เรย์อยู่ที่ = 2101 4. ค่า i ที่ต้องการ = 3 5. ค่า j ที่ต้องการ = 6

แทนค่าลงในสูตรแบบ Row Major แอดเดรสที่ต้องการ = แอดเดรสเริ่มต้น + C ( i - l1 ) N + C ( j - l2 )

แอดเดรส [A(3,6)] = 2101 + 4( 3 - 1 )4 + 4 ( 6 - 4) = 2101 + 4( 2 )4 + 4( 2 ) = 2101 + 32 + 8

= 2141

Page 12: โครงสร้างข้อมูล (2)

แทนค่าลงในสูตรแบบ Column Major แอดเดรสที่ต้องการ = แอดเดรสเริ่มต้น + C ( j - l2 ) M + C ( i - l1 )

แอดเดรส [A(3,6)] = 2101 + 4( 6 - 4 )5 + 4 ( 3 - 1) = 2101 + 4( 2 )5 + 4( 2 ) = 2101 + 40 + 8 = 2149 ให้ท ำ จงค ำนวณหำแอดเดรสของอำร์เรย์ 2 มิติ ต่อไปนี้ ทั้งแบบ Row Major & Column Major

1. J[-3 : 3 , -2 : 2] J(-3,-2) = 321 C = 6 จงหำ J(0 , 0) เฉลย Row และ Column 423 2. A[-10 : -3 , -20 : -13] A(-10 , -20) = 123 C = 6 จงหำ A(-5 , -15) เฉลย Row และ Column 393

3. D[12 : 25 , 64 : 70] D(12 , 64) = 100 C = 6 จงหำ D(20 , 66) เฉลย Row = 448 Column 316

Page 13: โครงสร้างข้อมูล (2)

อาร์เรย์ 3 มิติ (Three-dimensional Array) แถวล่าดับ 3 มิติ เป็นแบบที่การอ้างอิง หรือการเข้าถึงสมาชิกตัวใด จะใช้ตัวบอกล่าดับ 3 ตัว โดยโครงสร้างข้อมูลแบบนี้เราสามารถมองได้ในลักษณะของเมตริกซ์ (Matrix) หรือตาราง (Table) ที่มีหลายชั้น โดยตัวบอกล่าดับตัวแรกจะหมายถึงช้ัน ตัวถัดไปคือแถว และหลักตามล่าดับ รูปแบบของอาร์เรย์ 3 มิติโดยทั่วๆ ไปจะอยู่ในลักษณะ A[1:L , 1:M , 1:N] คือจะมีจ่านวนช้ัน (L) จ่านวนแถว (M) และแต่ละแถวจะมี (N) ค่าหรือ A[l1 : u1 , l2 : u2 , l3 : u3] การเก็บข้อมูลในอาร์เรย์ 3 มิติ แบบซีเควนเซียว สามารถแบ่งได้เป็น 2 ลักษณะคือ Row Major และ Column Major แต่ในที่นี้จะสอนแบบ Row Major ตัวอย่างชื่ออาร์เรย์ 3 มิติ

1. A[-120:0,1:50,100] 5. F[-222:8,-85:73,-33:0] 2. B[1:100,39:101,115] 6. IA[5:550,-25783:25441,-99:-42] 3. C[0:69,-25:-1,67] 7. S[510,25110,-30:110] 4. D[-5:15,-66:-19,0:42] 8. U[3895,588,72:8890]

Page 14: โครงสร้างข้อมูล (2)

การค่านวณหาจ่านวนช่องของอาร์เรย์ 3 มิติ สูตร จ่านวนช่องของ Array 3 มิติ

= ( u1 - l1 + 1 ) ( u2 - l2 + 1 ) ( u3 - l3 + 1 ) ตัวอย่าง A[-3:7,-4:-1,99:105] วิธีท่า จ่านวนช่องของ Array 3 มิติ

= ( u1 - l1 + 1 ) ( u2 - l2 + 1 ) ( u3 – l3 + 1 ) = ( 7 – (-3) + 1 ) ( (-1) – (-4) + 1 ) ( 105 – 99 + 1 ) = ( 7 + 3 + 1) ((-1) + 4 + 1)(105 – 99 + 1) = (11) (4) (6) = 264 ช่อง ให้ท ำ ค ำนวณหำจ ำนวนช่องของ Array ดังน้ี

1. A[-120:0,1:50,100] 5. F[-222:8,-85:73,-33:0] 2. B[1:100,39:101,115] 6. IA[5:550,-25783:25441,-99:-42] 3. C[0:69,-25:-1,67] 7. S[510,25110,-30:110] 4. D[-5:15,-66:-19,0:42] 8. U[3895,588,72:8890]

เฉลย (608,000 | 59,085 | 117,250 | 43,344 | 1,248,768 | 1,622,193,300 | 1,805,660,100 | 20,197,802,940 )

Page 15: โครงสร้างข้อมูล (2)

การค่านวณหาแอดเดรสของอาร์เรย์ 3 มิติ สิ่งที่ต้องทราบก่อนท่าการค่านวณ

1. จ่านวนช่องของอาร์เรย์ที่ต้องการ 2. แต่ละช่องของอาร์เรย์ใช้เนื้อที่เท่าไร 3. ต่าแหน่งแรกของอาร์เรย์ อยู่ ณ ต่าแหน่งใด 4. ค่า i ,j ,kที่โจทย์ต้องการ 5. ค่า L,M,N ที่โจทย์ต้องการ

เนื่องจาก การเก็บข้อมูลลงในอาร์เรย์แบบซีเควนเชียวนี้มี 2 แบบ ท่าให้สูตรในการหาต่าแหน่งแอดเดรส ของอาร์เรย์นี้ แตกต่างกันด้วย ดังนี้ ถ้าเก็บข้อมูลของอาร์เรย์แบบ Row Major หรือ Lexicographic Order จะใช้สูตร แอดเดรสที่ต้องการ = แอดเดรสเริ่มต้น + C ( i - l1 ) M N + C ( j - l2 ) N + C ( k – l3 )

Page 16: โครงสร้างข้อมูล (2)

เช่น ให้ค่านวณหาแอดเดรสของ A[-3:7,-4:-1,99:105] ของอาร์เรย์ A(0 , 0 , 7) ซึ่งแต่ละช่องกินพื้นที่ 21 Byte ต่าแหน่งแรกของอาร์เรย์ A คือ 1 หาแบบ Row Major วิธีท่า จ่านวนช่องของ Array 3 มิติ วิธีท่า 1. อาร์เรย์นี้มีจ่านวนช่อง

= ( u1 - l1 + 1 ) ( u2 - l2 + 1 ) ( u3 – l3 + 1 ) = ( 7 – (-3) + 1 ) ( (-1) – (-4) + 1 ) ( 105 – 99 + 1 ) = ( 7 + 3 + 1) ((-1) + 4 + 1)(105 – 99 + 1) = (11) (4) (6) (จะได้ค่า L M และ N) = 264 ช่อง

2. แต่ละช่องของอาร์เรย์ใช้เนื้อที่ = 21 Byte 3. ต่าแหน่งแรกของอาร์เรย์อยู่ที่ = 1 4. ค่า i , j , k ที่ต้องการ = 0 , 0 , 7

แทนค่าลงในสูตรแบบ Row Major แอดเดรสที่ตอ้งการ = แอดเดรสเร่ิมต้น + C ( i - l1 ) M N + C ( j - l2 ) N + C ( k – l3 )

A(0 , 0 , 7) = 1 + 21 (3) (4) (7) + 21 (4) (7) + 21 (6) = 1 + 1764 + 588 + 126 = 2479

Page 17: โครงสร้างข้อมูล (2)

Queue เป็นโครงสร้างข้อมูลที่มีลักษณะเป็นเชิงเส้น (Liner) พื้นที่ในการเก็บข้อมูลจะคงที่ (Static) คือไม่สามารถ เปลี่ยนแปลงได ้

ส่วนประกอบของ Queue 1. ชื่อของ Queue 2. ขนาดหรือมิติ 3. Pointer มี 2 ตัวคือ Front (F) จะชี้ที่ข้อมูลตัวแรก

Rear (R) จะชี้ที่ข้อมูลตัวสุดท้าย ลักษณะของ Queue คือ เจ้าได้ 1 ทางและออกได้ 1 ทาง โดย

ข้อมูลที่เข้าไปใน Queue ก่อนจะออกจาก Queue ก่อนเสมอ ถ้า Queue ว่าง F , R จะชี้ที่ศูนย์ ถ้า Queue มีข้อมลู F จะชี้ที่ข้อมูลตัวแรก และ R จะชี้ที่ข้อมูลตัว

สุดท้าย เมื่อมีการแสดงข้อมูลออกมา จะท่าให้ Queue มีต่าแหน่งว่าง แต่

โครงสร้างแบบ Queue จะไม่มีการแทนที่หรือขยับข้อมูล ซึ่งท่าให้ เกิดปัญหา มีเนื้อที่ว่าง แต่ไม่สามารถจัดเก็บข้อมูลได้

จากปัญหาที่เกิดขึ้น เราสามารถแก้ไขได้โดยเมื่อ R = N แต่ทางด้าน F ยังมีพื้นที่ว่าง เราจะปรับ R = 1

Page 18: โครงสร้างข้อมูล (2)

Stack เป็นโครงสร้างข้อมูลที่มีลักษณะเป็นเชิงเส้น (Liner) พื้นที่ในการเก็บข้อมูลจะคงที่ (Static) คือไม่สามารถเปลี่ยนแปลงได้ ประโยชน์ของ Stack คือ ช่วยจดจ่าการกระโดดไปมาระหว่างโปรแกรมย่อยและโปรแกรมแบบรีเคอร์ซีฟ ลักษณะการเข้า/ออกของ Stack จะเป็นแบบ FIFO

ส่วนประกอบของ Stack 1. ชื่อของ Stack

2. ขนาดหรือมิติ 3. Pointer ที่ชี้ข้อมูลใน Stack คือ Stack Pointer (SP)

ถ้าในกรณีไม่มีข้อมูล Stack Pointer (SP) จะชี้ในต่าแหน่งที่ 0 ถ้าในกรณีชั้นที่ 1,2 ไม่มีข้อมูล จะใส่ข้อมูลในชั้นที่ 3 ไม่ได้ ถ้าในกรณีที่มีข้อมูลอยู่แล้ว Stack Pointer (SP) จะชี้ที่ช้ันสุดท้ายที่มีข้อมูลอยู่ กริยาการน่าข้อมูลเข้าเราเรียกว่า PUSH กริยาการน่าข้อมูลออกเราเรียกว่า POP

Page 19: โครงสร้างข้อมูล (2)

RECURSIVE คือการเขียนโปรแกรมเรียกตัวเอง ให้ท่างานซ้่าๆ จนกว่าจะได้ค่าตอบที่ถูกต้องออกมา แต่จะต้องก่าหนด เงื่อนไขการท่างานให้ดี มิฉะนั้นโปรแกรมอาจจะท่างานไม่รู้จบได้ ซึ่งเงื่อนไขพื้นฐานของการ RECURSIVE ได้แก่

- เงื่อนไขการเรียกตัวเอง (RECURSIVE CONDITION) - เงื่อนไขหยุดการท่างาน (TERMINATE CONDITION)

ตัวอย่างการเขียนโปรแกรม RECURSIVE ที่ง่ายที่สุดคือ การหาค่า n! (FACTORIAL)

n! = n(n-1)(n-2)(n-3)...1 ** 0!=1 เสมอ ** n! = n(n-1)! ตัวอย่าง 5! = 5 * 4 * 3 * 2 * 1 = 120

ตัวอย่างโปรแกรมหาค่า n! โดยใช้การ RECURSIVE (โปรแกรมนี้ง่ายมากๆ ควรท่าความเข้าใจให้ได้ก่อนที่จะไปเขียน โปรแกรม RECURSIVE ที่ซับซ้อนกว่านี้)

Page 20: โครงสร้างข้อมูล (2)

program factorial; uses crt; var n:longint; function fac(x:longint):longint; begin if x<>0 then fac:=x*fac(x-1) else fac:=1; end; {อธิบาย fac(x)} {เงื่อนไขการ recursive คือ x<>0 จึงจะมีการเรียก function ต่อไปในลักษณะ n!=n*(n-1)! ตามทฤษฎีที่กล่าวไว้ข้างต้น} {การท่างานสิ้นสุดเมื่อ ค่า x=0 ซึ่ง fac(0)=1 ตามทฤษฎ,ี หลังจากนั้น function จะค่อยๆ ถอยกลับไปทีละชั้น แล้วน่าค่า x ของทุกๆ ชั้นมาคูณกันหมด ก็จะได้ค่า fac(n) (ชั้นแรกสุด) ออกมาตามต้องการ}

Page 21: โครงสร้างข้อมูล (2)

begin {main} clrscr; write('Input = '); readln(n); writeln(n,'! =',fac(n));

end.

ตัวอย่างการเขียนโปรแกรมแก้ปัญหาโจทย์ โจทย์ : ปล่อยลูกบอลจากความสูง h ลงพื้น ลูกบอลจะกระดอนขึ้นมาสูงเป็น 3/4 เท่าจากความสูงที่ปล่อย เมื่อลูกบอลตกจากที่สูงต่่ากว่า 1 หน่วย ลูกบอลจะไม่กระดอนอีก จงเขียนโปรแกรมรับ input เป็นความสูงที่ปล่อยลูกบอล และ output เป็นจ่านวนครั้งที่ลูกบอกกระทบพื้น

วิเคราะห์โจทย์ก่อนท่า : 1. เงื่อนไขการ recursive คือลูกบอลตกจากที่สูงกว่า 1 หน่วย 2. เงื่อนไขการหยุดคือ ลูกบอลตกจากที่สูงต่่ากว่า 1 หน่วยลงมา

Page 22: โครงสร้างข้อมูล (2)

program bouncing; uses crt; var h:real; time:integer;

procedure fall(x:real); begin if x=0 then exit; if x>1 then begin time:=time+1; fall(x*3/4); end

else time:=time+1; end;

begin {main} time:=0; clrscr; write('Input ='); readln(h); fall(h); {เรียกโปรแกรมย่อย recursive} writeln('Output = ',time); end

{อธิบาย fall(x)} {x = ความสูงที่ลูกบอลตกลงมา, fall(x)= จุดสูงสุดที่กระดอนขึ้นไป} {เงื่อนไขการ recursive คือลูกบอลตกมาจากที่สูงกว่า 1 หน่วย เงื่อนไขการหยุดคือตกลงมาจากที่ต่่ากว่า 1 หน่วย} {หากมีการตกย่อมมีการกระทบพื้น จึงเพิ่มค่า time ที่ละ 1 แต่หากตกจากที่สูงกว่า 1 หน่วยย่อมมีการกระดอน แต่เป็น 3/4 เท่า ให้เรียก fall อีกครั้ง แต่ให้คูณค่า x ที่รับมาด้วย 3/4 แล้วส่งไป process ต่อ ซึ่งท่าให้ค่าน้อยลงเร่ือยๆ จนต่่ากว่า 1 และหยุดกระดอนในที่สุด} {ถ้าความสูงที่ปล่อยคือศูนย์คือวางลูกบอลไว้บนพื้นเฉยๆ ถือว่าลูกบอลไม่มีการกระทบพื้น (หากปล่อยจากความสูงที่ ไม่ใช่ศูนย์ ย่อมมีการกระทบอย่างน้อยหนึ่งคร้ัง) เพราะฉะนั้นถ้า h เป็น 0 ให้เลิกท่า procedure เลยด้วยค่าสั่ง exit;} หมายเหตุ : จะเห็นว่าตัวอย่างทั้งสองโปรแกรมสามารถใช ้while ... do ในการเขียนได้เช่นกัน (จริงๆ แล้ว while do ก็มีการ