Page 1

45 แผนการสอนประจําบทเรียน รายชือ่ อาจารยผจู ดั ทํา สุณี รักษาเกียรติศักดิ์ หัวขอของเนื้อหา ตอนที่ 3.1 ชนิดขอมูลแบบแถวลําดับ (1 คาบ) เรือ่ งที่ 3.1.1

การกําหนดคุณลักษณะเฉพาะของแถวลําดับ

เรือ่ งที่ 3.1.2

พารามิเตอรของแถวลําดับและการจัดเก็บขอมูลชนิดแถวลําดับในหนวยความจํา

ตอนที่ 3.2 ชนิดขอมูลแบบระเบียน (1 คาบ) เรือ่ งที่ 3.2.1

การกําหนดคุณลักษณะเฉพาะของระเบียน

เรือ่ งที่ 3.2.2

พารามิเตอรของระเบียนและการจัดเก็บขอมูลชนิดระเบียนในหนวยความจํา

ตอนที่ 3.3 การใชแถวลําดับและระเบียนในการจัดเก็บขอมูล (1 คาบ) เรือ่ งที่ 3.3.1

การใชแถวลําดับและระเบียนในการจัดเก็บขอมูล

เรือ่ งที่ 3.3.2

ตัวอยางการประยุกตใชแถวลําดับและระเบียนในการจัดเก็บขอมูลและการ ประมวลผล

แนวคิด 1. แถวลําดับและระเบียน เปนชนิดขอมูลเชิงโครงสรางมาตรฐานทีเ่ ปนพืน้ ฐานสําคัญในการจัดเก็บ ขอมูล และเปนชนิดขอมูลพืน้ ฐานในการสรางขอมูลชนิดอืน่ ๆ ตอไป 2. แถวลําดับเปนชนิดขอมูลเชิงโครงสราง ซึ่งประกอบดวยขอมูลยอยซึ่งตองมีชนิดเดียวกัน 3. ระเบียนเปนชนิดขอมูลเชิงโครงสราง ซึ่งประกอบดวยขอมูลยอยซึ่งอาจจะมีชนิดตางกันได และ ระเบียนเปนชนิดขอมูลที่นิยมใชในการจัดเก็บขอมูลของสิ่งตาง ๆ 4. แถวลําดับและระเบียนเปนชนิดขอมูลที่มีโครงสรางแบบเชิงเสน 5. แถวลําดับและระเบียนมีการดําเนินงานทีส่ าํ คัญคือการกําหนดคาใหกบั ขอมูลและการแสดงคา ของขอมูล 6. ในบทเรียนนี้จะไดกลาวถึงการจัดเก็บขอมูลและโครงสรางขอมูลของแถวลําดับและระเบียนใน หนวยความจําดวย วัตถุประสงค หลังจากศึกษาบทเรียนที่ 3 แลว นักศึกษาสามารถ


46 1. บอกคุณลักษณะเฉพาะของชนิดขอมูลแบบแถวลําดับและแบบระเบียนได 2. บอกวิธีการจัดเก็บขอมูลของแถวลําดับและระเบียนในหนวยความจําได กิจกรรมการเรียนการสอน กิจกรรมทีน่ กั ศึกษาตองทําสําหรับการเรียนการสอน ไดแก 1. ศึกษาเอกสารชุดวิชา/โฮมเพจชุดวิชา ตอนที่ 3.1 ตอนที่ 3.2 และตอนที่ 3.3 2. ทํากิจกรรมของบทเรียนที่ 3 3. ทําแบบประเมินผลของบทเรียนที่ 3 เอกสารประกอบการสอน 1. เอกสารชุดวิชา สื่อการสอน 1. โฮมเพจชุดวิชา 2. สไลดประกอบการบรรยาย (Powerpoint) 3. โปรแกรมคอมพิวเตอร ประเมินผล 1. ประเมินผลจากกิจกรรมที่ทํา 2. ประเมินผลจากคําถามทายบทเรียน


47 ตอนที่ 3.1 ชนิดขอมูลแบบแถวลําดับ หัวเรื่อง เรือ่ งที่ 3.1.1

การกําหนดคุณลักษณะเฉพาะของแถวลําดับ

เรือ่ งที่ 3.1.2

พารามิเตอรของแถวลําดับและการจัดเก็บขอมูลชนิดแถวลําดับในหนวยความจํา

แนวคิด 1. แถวลําดับเปนชนิดขอมูลเชิงโครงสรางที่สมาชิกของแถวลําดับจะตองมีชนิดเดียวกัน และมี ความสัมพันธกันแบบเชิงเสน โดยมีการดําเนินงานกับแถวลําดับทีส่ าํ คัญคือ การกําหนดคาให กับแถวลําดับ (update) และการแสดงขอมูลสมาชิกของแถวลําดับ (retrieve) 2. ความเขาใจในการจัดเก็บขอมูลชนิดแถวลําดับในหนวยความจํา เปนพืน้ ฐานทีส่ าํ คัญในการ เขียนโปรแกรม วัตถุประสงค หลังจากที่ศึกษาตอนที่ 3.1 แลว นักศึกษาสามารถ 1. เขียนคุณลักษณะเฉพาะของชนิดขอมูลแบบแถวลําดับได 2. อธิบายการจัดเก็บขอมูลชนิดแถวลําดับในหนวยความจําได เรื่องที่ 3.1.1 การกําหนดคุณลักษณะเฉพาะของแถวลําดับ แถวลําดับหรืออะเรย (array) เปนชนิดขอมูลเชิงโครงสรางที่จําเปนในภาษาคอมพิวเตอรหลายๆ ภาษา เชน ภาษาปาสคาล เปนตน แถวลําดับเปนชนิดขอมูล ซึ่งประกอบดวยสวนของขอมูล ทีเ่ ปนชนิด เดียวกัน และมีความสัมพันธกันแบบเชิงเสน ชนิดของขอมูลแบบแถวลําดับอาจจะเปนแถวลําดับ 1 มิติ แถว ลําดับ 2 มิติ หรือ แถวลําดับมากกวา 2 มิติก็ได แถวลําดับ 1 มิติ เปรียบไดกบั การจัดเก็บขอมูลแบบเว็กเตอร (vector) และแถวลําดับ 2 มิติ เปรียบไดกับการจัดเก็บขอมูลแบบเมตริกซ (matrix) ในทีน่ จ้ี ะนําเสนอการ อธิบายคุณลักษณะเฉพาะของแถวลําดับ 1 มิติ และแถวลําดับ 2 มิติ โดยใชหลักการของขอมูลแบบคัดยอ คุณลักษณะเฉพาะ 3.1 : ขอมูลแบบคัดยอชนิดแถวลําดับ 1 มิติ (Specitication 3.1 : Abstract Data Type Array - One Dimensional) สมาชิกมีชนิดตามกําหนดและสมาชิกทุกตัวของแถวลําดับตองมีชนิดเหมือนกัน สมาชิก : โครงสราง :

แถวลําดับมีโครงสรางแบบเชิงเสนโดยมีดัชนีของแถวลําดับ เปนตัวกําหนดอันดับของ สมาชิกในแถวลําดับ การดําเนินงาน : มี 2 การดําเนินงาน คือ การดึงคาของแถวลําดับมาใช (retrieve) และการกําหนดคาให สมาชิกของแถวลําดับ (update) ดังนี้


48 retrieve (A,X,I) เปนโพรซีเจอรสําหรับการดึงคาของสมาชิกตัวที่ I ของแถวลําดับ A ให กับตัวแปร X นั่นคือให X := A[I] update (A,X,I)

เปนโพรซีเจอรสาํ หรับการกําหนดคา X ใหกับสมาชิกตัวที่ I ของ แถว ลําดับ A นั่นคือให A[I] := X

หมายเหตุ 1. ในภาษาปาสคาลเราสามารถจะใชการดําเนินงาน เชน A:=B ไดโดยที่ A และ B เปนแถวลําดับ จะเปนการกําหนดคาของ B ใหกับ A ซึง่ เปรียบเสมือนการใช retrieve และ update หลายๆครัง้ 2. ในภาษาปาสคาล retrieve อาจเปรียบไดกบั write แตเราไมสามารถจะแสดงผลคาของตัว แปรเชิงโครงสราง เชน write (A) ได หากตองการแสดงผลตัวแปรแถวลําดับ เราตองแสดงผลคาของสมาชิก ของแถวลําดับทีละตัว นัน่ คือ write (A[I]) 3. ในทํานองเดียวกัน ในภาษาปาสคาล update อาจเปรียบไดกบั read แตเราไมสามารถจะ กําหนดคาของตัวแปรเชิงโครงสราง เชน read (A) ได หากตองการกําหนดคาใหตัวแปรแถวลําดับ เราตอง กําหนดคาใหสมาชิกของแถวลําดับทีละตัว นัน่ คือ read (A[I]) คุณลักษณะเฉพาะ 3.2 : ขอมูลแบบคัดยอชนิดแถวลําดับ 2 มิติ (Specitication 3.2 : Abstract Data Type Array - Tne Dimensional) สมาชิก :สมาชิกมีชนิดตามที่กําหนดและสมาชิกทุกตัวตองมีชนิดเหมือนกัน มีโครงสรางแบบเชิงเสนซึ่งกําหนดโดยดัชนี 2 ตัว ชนิดแบบมีอันดับ ซึ่งมีความสัมพันธ แบบหนึ่งตอหนึ่งระหวางคารทีเชียนโพรดักทของดัชนีและสมาชิกของแถวลําดับ การดําเนินงาน : มี 2 การดําเนินงาน คือ การถึงคาของสมาชิกของแถวลําดับมาใช และการกําหนดคาให สมาชิกของแถวลําดับ ดังนี้ retrieve (A,X,I1,I2) เปนโพรซีเจอรสําหรับการดึงคาของสมาชิกตัวที่ [I1,I2] ของแถว ลําดับใหกับตัวแปร X นัน่ คือ X := A[I1,I2] โครงสราง :

update (A,X,I1,I2)

เปนโพรซีเจอรสาํ หรับกําหนดคา X ใหกับสมาชิกตัวที่ [I1,I2] ของ แถวลําดับ A นัน่ คือ A[I1,I2] = X

ตัวอยาง 3.1 รูปแสดงโครงสรางของแถวลําดับแบบ 1 มิติ VAR A1 : ARRAY[1..3] OF integer

ดัชนี

ความสัมพันธแบบ 1 ตอ 1

คาสมาชิก

[1]

23

[2]

49


49 [3]

87

ตัวอยาง 3.2 รูปแสดงโครงสรางของแถวลําดับแบบ 2 มิติ VAR A2 : ARRAY[1..2,1..3] OF integer

ดัชนี

ความสัมพันธแบบ 1 ตอ 1

คาสมาชิก

[1,1]

34

[1,2]

56

[1,3]

53

[2,1]

37

[2,2]

93

[2,3]

31

กิจกรรม 3.1 ฝกตัวแปรแถวลําดับ จากการนิยามตัวแปรแถวลําดับตอไปนี้ VAR !" : ARRAY[3..5,4..8] OF integer

B1 มีสมาชิกทั้งหมดกี่ตัว และแตละมีชื่อวาอะไรบาง เรื่องที่ 3.1.2 พารามิเตอรของแถวลําดับ และการจัดเก็บขอมูลชนิดแถวลําดับในหนวยความจํา พารามิเตอรที่จําเปนในการจัดเก็บและการเรียกใชขอมูลชนิดแถวลําดับไดแก ตําแหนงหนวยความ จําเริ่มตน (base address), ขนาดของขอมูลสมาชิก (component size), คาเริ่มตน (lower bound) และคาสูง สุด (upper bound) ของดัชนีแตละมิติ และจํานวนมิติ (dimension) ของแถวลําดับ ใหสัญลักษณตอไปนี้แทนพารามิเตอรที่จําเปนสําหรับแถวลําดับ B แทน ตําแหนงหนวยความจําเริ่มตน S

แทน ขนาดของขอมูลสมาชิกแตละตัว

d

แทน จํานวนมิติของแถวลําดับ

LI

แทน คาเริ่มตนของดัชนีของมิติ i; i = 1..,…,d

UI

แทน คาสูงสุดของดัชนีของมิติ i; i = 1..,….d

การจองที่ในหนวยความจําของขอมูลชนิดแถวลําดับจะเกิดขึ้นระหวางการแปลภาษา (compiling) ซึ่งหนวยความจําจะถูกจองกอนการประมวลผล และเราเรียกวาเปนการเนื้อที่ในหนวยความจําแบบคงที่หรือ แบบสแตติก (static memory allocation)


50 ตัวอยาง 3.3 เนื้อที่ที่ใชสําหรับการจัดเก็บขอมูลแถวลําดับ สูตรสําหรับเนื้อที่ที่ใชในการจัดเก็บขอมูลของแถวลําดับ โดยทั่วๆไป จะเปน S * (U1-L1+1) * (U2-L2+1) * …..*(Ud-Ld+1)

เชนให VAR A : ARRAY[10..100,5..26] OF real;

ถาเนื้อที่ในการจัดเก็บจํานวนจริง (real) ใชขนาด 6 ไบต (S=6) ดังนั้นในการจัดเก็บตัวแปร A จะใช เนื้อที่ทั้งหมด 6*(100-10+1) * (26-5+1) = 6 * 91 * 22 = 12,012 ไบต เพื่อใหเขาใจที่มาของสูตรทั่วไป ลองพิจารณาตัวอยางการจัดเก็บขอมูลชนิดแถวลําดับ 1 มิติ และขอ มูลชนิดแถวลําดับ 2 มิติ ดังนี้ ตัวอยาง 3.4 การจัดเก็บขอมูลชนิดแถวลําดับ 1 มิติ VAR A : ARRAY [3..7] OF integer

ถาให B = 500 และ S = 4 (ในที่นี้ l = 3, U = 7, d = 1) สมมติใหคา ของขอมูล 5 ตัว ของ A มีคาเรียงตามลําดับดังนี้ A[3] = -12, A[4] = 7 , A[5] = 47 , A[6] = 26, A[7] = -52 คาของขอมูลจะถูกเก็บไวในหนวยความจํา ดังนี้ ตําแหนงในหนวยความจํา

ดัชนี

คาของขอมูล

500 = (500 + 0 * 4)

[3]

-12

504 = (500 + 1 * 4)

[4]

7

508 = (500 + 2 * 4)

[5]

47

512 = (500 + 3 * 4)

[6]

26

516 = (500 + 4 * 4)

[7]

-52

นัน่ คือ ถาเราตองการทราบวา A[I] ถูกจัดเก็บไวในตําแหนงใดในหนวยความจํา เราก็จะคํานวณไดจากสูตร ดังนี้


51 addr(A[I] = = = =

B + (I -L1) * S B + I * S - L1 * S (B - L1 * S) + S * I Co + C1 * I

จะเห็นไดวาฟงกชันนี้เปนฟงกชันเชิงเสน ซึง่ เราเรียกวา อะเรยแมบปงฟงกชัน (Array Mapping Function) ใหยอเปน AMF โดยคาพารามิเตอรที่จําเปนในการคํานวณตําแหนงในหนวยความจําของขอมูลตัว ที่ I ใดๆ คือ B, L1 และ S ตัวอยาง 3.5 การจัดเก็บขอมูลชนิดแถวลําดับ 2 มิติ VAR A:ARRAY [0..2,4..5] OF real#

ในที่นี้ L1= 0 , U1 = 2 L2= 0 , U2 = 5 ถาให B = 500 S = 15 สมมติใหคา ของขอมูล 6 ตัวของ A มีคา เรียงลําดับดังนี้ A[0,4] = 54.7 , A[0,5] = 39.2 , A[1,4] = 72.8 , A[1,5] = 13.7 , A[2,4] = 17.4 , A[2,5] = 45.8 ขอมูลจะถูกเก็บในหนวยความจําในตําแหนงตาง ๆ ดังนี้ ตําแหนงในหนวยความจํา

ดัชนี

คาของขอมูล

500 = (500 + 0 * 2 * 15 + 0 * 15)

[0,4]

54.7

515 = (500 + 0 * 2 * 15 + 1 * 15)

[0,5]

39.2

530 = (500 + 1 * 2 * 15 + 0 * 15)

[1,4]

72.8

545 = (500 + 1 * 2 * 15 + 1 * 15)

[1,5]

13.7

560 = (500 + 2 * 2 * 15 + 0 * 15)

[2,4]

17.4

575 = (500 + 2 * 2 * 15 + 0 * 15)

[2,5]

45.8

นัน่ คือ ถาเราตองการทราบวา A[I,J] ควรจะจัดเก็บไวตําแหนงใดในหนวยความจําหรือถูกจัดเก็บไวใน ตําแหนงใด เราก็จะคํานวณไดจากสูตรดังนี้


52 addr(A[I,J]) = B + = Co + where C2 = S C1 = (U2 - L2 C0 = B - C1 *

(I - L1) * (U2 - L2 + 1) * S + (J - L2) * S C1 * I + C2 * J + 1) * C2 L1 -C2 * L2

โดยทั่วๆ ไป AMF สําหรับแถวลําดับ d มิติ คือ addr(A[I1,I2,….,Id] ) = C0 + C1 * I1 + C2 * I2 + …. + Cd * Id where Cd = S Ct-1 = (Ut - Lt + 1 ) * Ct 1 < t <= d C0 = B - C1 * L1- C2 * L2- … - Cd * Ld

จะเห็นไดวา AMF สามารถทําใหเราเขาถึงขอมูลชนิดแถวลําดับ แบบสุม (random access) ได เมื่อ กําหนดดัชนีหรือลําดับของสมาชิก จากที่กลาวมาขางตน จะเห็นไดวาพารามิเตอรที่สําคัญในการอางอิงถึงแถวลําดับ หรือในการสงผาน ขอมูลชนิดแถวลําดับ จะประกอบดวยพารามิเตอรที่สําคัญซึ่งเราจะเรียกวา อะเรยเดสคริบเตอร (array descriptor) หรือ dope vector ไดแก - ชื่อตัวแปรแถวลําดับ (Name) - ชนิดของสมาชิกของแถวลําดับ (Tcode) - ขนาดหนวยความจําที่ใชสําหรับสมาชิกแตละตัว (S) - ตําแหนงในหนวยความจําเริ่มตนที่จัดเก็บแถวลําดับ (B) - จํานวนมิติของแถวลําดับ (D) - ดัชนีคาเริ่มตนและคาสูงสุดของแตละมิติ (L,U) - สัมประสิทธิข์ อง AMF (C) ดังแสดงดวยภาษาปาสคาลดังนี้


53 TYPE VAR

Basetype = (real, integer, boolean, char, other); Adr = RECORD Name : ARRAY[1..8] OF char; Tcode : Basetype; S : integer; B : integer; D : integer; Bounds : ARRAY[1..D] OF RECORD L, U : integer END; C : Array[0..D] OF integer; END;

กิจกรรม 3.2 คํานวณเนื้อที่ที่ใชในการเก็บตัวแปรแถวลําดับ กําหนดให B เปนตัวแปรชนิดแถวลําดับที่มีการนิยามดังนี้ VAR

B : ARRAY [2..54, 1..6] OF integer;#

และกําหนดใหใชเนื้อที่ 6 ไบทในการเก็บ integer จงตอบคําถามตอไปนี้ จะตองใชเนื้อที่เทาใดในการจัดเก็บ B ถาใหเก็บ B ที่ตําแหนงเริ่มตนที่ 500 ตัวแปร B[34,2] จะจัดเก็บที่ตําแหนงใด


54 ตอนที่ 3.2 ชนิดขอมูลแบบระเบียน หัวเรื่อง เรือ่ งที่ 3.2.1

การกําหนดคุณลักษณะเฉพาะของระเบียน

เรือ่ งที่ 3.2.2

พารามิเตอรของระเบียนและการจัดเก็บขอมูลชนิดระเบียนในหนวยความจํา

แนวคิด 1 ระเบียนเปนชนิดขอมูลเชิงโครงสรางที่สมาชิกของระเบียนสามารถจะมีชนิดตางกันได และ สมาชิกมีความสัมพันธกันแบบเชิงเสน โดยมีการดําเนินงานกับระเบียนทีส่ าํ คัญคือ การกําหนด คาใหกับระเบียน (update) และการแสดงคาขอมูลสมาชิกของของระเบียน (retrieve) 2 ความเขาใจในการจัดเก็บขอมูลชนิดระเบียนในหนวยความจํา เปนพืน้ ฐานทีส่ าํ คัญในการเขียน โปรแกรม วัตถุประสงค หลังจากที่ศึกษาตอนที่ 3.2 แลว นักศึกษาสามารถ 1. เขียนคุณลักษณะเฉพาะของชนิดขอมูลแบบระเบียนได 2. อธิบายการจัดเก็บขอมูลชนิดระเบียนในหนวยความจําได เรื่องที่ 3.2.1 การกําหนดคุณลักษณะเฉพาะของระเบียน ระเบียน หรือเรคคอรด (record) เปนชนิดขอมูลเชิงโครงสรางพื้นฐานอีกตัวหนึ่งซึ่งภาษาโปรแกรม ภาษาสูงสวนใหญจะมี ชนิดของขอมูลแบบระเบียนตางกับชนิดขอมูลแบบแถวลําดับ ตรงที่วาสมาชิกแตละ ตัวของระเบียนจะมีชนิดของขอมูลแตกตางกันไว คุณสมบัตินี้เปนคุณสมบัติที่สะทอนถึงความเปนจริงของขอ มูล เชน เมื่อเราพูดถึงขอมูลเกี่ยวกับบุคคล เชน ชื่อ สกุล ที่อยู หมายเลขโทรศัพท เพศ อายุ เปนตน ขอมูล เหลานี้จะมีชนิดของขอมูลที่แตกตางกัน การเขาถึงสมาชิกของขอมูลแตละของระเบียนจะผานทางชื่อของ สมาชิกของระเบียนซึ่งแตกตางจากแถวลําดับ ซึ่งการเขาถึงสมาชิกขอมูลแตละตัวจะผานทางดัชนี ขอมูลชนิด ระเบียนเริ่มมีใชในภาษา COBOL และในภาษาตอมาที่เกิดตามมา เชน ภาษา PL/1 , PASCAL , และ C เปนตน ในการอธิบายถึงระเบียนวามีเปนอยางไร เราจะใชหลักการของการกําหนดคุณลักษณะเฉพาะตาม รูปแบบของชนิดขอมูลแบบคัดยอ ดังนี้ คุณลักษณะเฉพาะ 3.1 คุณลักษณะเฉพาะของระเบียน (record abstract data type specification) สมาชิกแตละตัวของระเบียนจะมีชนิดที่แตกตางกันได สมาชิก: โครงสราง:

สมาชิกแตละตัวของระเบียนจะมีชื่อกํากับซึ่งเรียกวาฟลด (field) และมีโครงสรางแบบเชิง เสน


55 การดําเนินงาน: มี 2 การดําเนินงาน คือ การดึงคาของระเบียนมาใช (retrieve) และการกําหนดคาให สมาชิกของระเบียน (update) โดยที่ retrieve(R,V,Id) เปนโพรซีเจอรสําหรับการดึงคาของสมาชิกชื่อ Id ของระเบียน R ใหกับ ตัวแปรชื่อ V ซึ่งตองมีชนิดเดียวกันกับ Id นั่นคือให V := R.Id update(R,V,Id) เปนโพซีเจอรสาํ หรับการกําหนดคา V ใหกับสมาชิกชื่อ Id ของระเบียน V นั่นคือให R.Id := V หมายเหตุ 1. ในภาษาปาสคาลเราสามารถจะใชการดําเนินงาน เชน R:=S ไดโดยที่ R และ S เปนระเบียน จะ เปนการกําหนดคาของ S ใหกับ R ซึง่ เปรียบเสมือนการใช retrieve และ update หลายๆครัง้ 2. ในภาษาปาสคาล retrieve อาจเปรียบไดกบั write แตเราไมสามารถจะแสดงผลคาของตัว แปรเชิงโครงสราง เชน write (A) ได หากตองการแสดงผลตัวแปรแถวลําดับ เราตองแสดงผลคาของสมาชิก ของระเบียนทีละตัว หรือทีละฟลด นัน่ คือ write (R.Id) เปนตน 3. ในทํานองเดียวกัน ในภาษาปาสคาล update อาจเปรียบไดกบั read แตเราไมสามารถจะ กําหนดคาของตัวแปรเชิงโครงสราง เชน read (R) ได หากตองการกําหนดคาใหตัวแปรระเบียน เราตอง กําหนดคาใหสมาชิกของระเบียนทีละตัว นัน่ คือ read (R.Id) เปนตน 4. ในทํานองเดียวกัน ในภาษาปาสคาลเราสามารถจะใชการดําเนินงานของแถวลําดับ เชน R1 := R2 ไดโดยที่ R1 และ R2 เปนขอมูลชนิดระเบียนชนิดเดียวกัน เปนการกําหนดคาของ R2 ใหกับ R1 ซึง่ เปรียบเสมือนการใช retrieve และ update หลายๆ ครัง้ ตัวอยาง 3.6 แสดงการจัดเก็บโครงสรางขอมูลเชิงเสนของระเบียน สมมติเรามีชื่อ (identifier) Emp ชนิดระเบียน ดังนี้ TYPE Emp = RECORD Id : 1000..9999; Name : string[20]; Dept : 1..99; Salary : integer; END;

รูปแสดงโครงสรางของชนิดระเบียน Emp จะเปนดังนี้ ชื่อสมาชิก

ความสัมพันธแบบ 1 ตอ 1

คาสมาชิก

Id

< - - - - - - - - - - - - - - - - > 5440

Name

< - - - - - - - - - - - - - - - - > นพวรรณ

Dept

<---------------->

20


56 Salary

<---------------->

20,000

หมายเหตุ ชื่อสมาชิก เราจะเรียกวา ฟลด (field) เรื่องที่ 3.2.2 พารามิเตอรของระเบียนและการจัดเก็บขอมูลชนิดระเบียนในหนวยความจํา พารามิเตอรที่จําเปนในการจัดเก็บและการเรียกใชขอมูลชนิดระเบียน ไดแกตําแหนงหนวยความจํา เริ่มตน (base address) ชื่อและชนิดของสมาชิกแตละตัวของระเบียน (field identifier and field type) ขนาด ของขอมูลสมาชิกแตละตัว (field size) และคาออฟเซ็ต (off-set) ของขอมูลสมาชิกแตละตัว คาออฟเซ็ต คือ คาที่นําไปบวกกับคาของ base address ของตัวแปรระเบียนนั้นแลวจะเปนที่อยูของขอมูลสมาชิก (field) ถัด ไป ตัวอยาง 3.6 การจัดเก็บขอมูลชนิดระเบียน สมมติเรามีชนิดขอมูลแบบระเบียน Date และ Work ซึ่งมีนิยามดังนี้ TYPE Date = RECORD# Mo : 1..12; Day : 1..31; Year : 1900..2010; END; VAR Work : RECORD EmpNo : 100..999; Start : Date; Stop : Date; END;

เรคคอรดเดสคริบเตอร (record descriptor) ที่ใชจัดเก็บพารามิเตอรตาง ๆ เกี่ยวกับการจัดเก็บขอ มูลชนิดระเบียนในหนวยความจํา ไดแก - ชื่อตัวแปรระเบียน (Name) -

ตําแหนงในหนวยความจําเริ่มตนที่ใชเก็บระเบียน (Base)

-

จํานวนสมาชิกหรือฟลดของระเบียน

-

รายละเอียดของขอมูลแตละฟลด (FieldDesc) ไดแก ชือ่ ฟลด (FieldName), ชนิดของฟลด (FieldType), ขนาดของหนวยความจําที่ใช (Size), และตําแหนงที่จัดเก็บจาก B (Offset)

ซึ่งนิยามไดดังนี้


57 TYPE FieldDesc = RECORD FieldName : ARRAY[1..8] OF char; DataType : Type; Size : integer; Offset : integer; END; VAR WorkDesc : RECORD Name : ARRAY[1..8] OF char; Base : integer; Field : ARRAY[1..NoFiled] OF FieldDesc

โดยที่ WorkDesc คือ Record descriptor ซึ่งเก็บคาพารามิเตอรของตัวแปรชื่อ Work ซึ่งมีขอมูล ดังนี้ No.

FieldName

Datatype

Size

Offset

1

EmpNo

100..999

4

0

2

Start

date

12

4

3

Stop

date

12

16

ขอสังเกต 1. การจองที่ในหนวยความจําของทั้งแถวลําดับและระเบียนจะเปนการจองที่ในขั้นตอนการแปล ภาษาจึงเปนการจองที่แบบคงที่หรือสแตติก (static memory allocation) 2. ในภาษาปาสคาล คาของดัชนีของแถวลําดับที่อางถึงอาจจะเปนนิพจนได เชน read(l); write (A[l]); โดยที่คาของ l สามารถเปลีย่ นแปลงไดระหวางการประมวลผล แตเราไมสามารถกระทําทํานองเดียวกัน กับขอมูลชนิดระเบียนได เชน เราไมสามารถจะเขียน read(R.X) หรือ write(R.X) ได


58 ตอนที่ 3.3 การใชแถวลําดับและระเบียนในการจัดเก็บขอมูล หัวเรื่อง เรือ่ งที่ 3.3.1

การใชแถวลําดับและระเบียนในการจัดเก็บขอมูล

เรือ่ งที่ 3.3.2

ตัวอยางการประยุกตใชแถวลําดับและระเบียนในการจัดเก็บขอมูลและการ ประมวลผล

แนวคิด 1. ในการจัดเก็บขอมูลของแตละสิ่งมักจะใชชนิดระเบียนในการจัดเก็บ เชน ขอมูลของนักเรียนคน หนึ่ง ๆ ก็คอื ขอมูลระเบียนหนึง่ ๆ ขอมูลของนักเรียนคนหนึง่ ๆ อาจจะประกอบดวย เลข ประจําตัว, ชื่อ-สกุล, วัน-เดือน-ป เกิด, เพศ, คะแนนสอบ เปนตน ขอมูลแตละตัวจะเรียกวาเขต ขอมูลหรือฟลด (field) ซึ่งแตละตัวจะมีชนิดไมเหมือนกันได 2. ถาเราตองการจะจัดเก็บขอมูลของนักเรียนหลาย ๆ คนไวในหนวยความจําเพื่อการประมวลผล ตอไป โดยที่เราสามารถจะเขาถึงขอมูลตัวไหนก็ไดแบบสุม (random access) เราก็สามารถจะ ใชชนิดขอมูลแบบแถวลําดับในการจัดเก็บขอมูลของนักเรียน ซึ่งก็จะเปนชนิดขอมูลแบบ ARRAY OF RECORD วัตถุประสงค หลังจากที่ศึกษาตอนที่ 3.3 แลว นักศึกษาสามารถ 1. เขาใจวิธีการนําชนิดขอมูลแบบระเบียนและแถวลําดับมาใชในการจัดเก็บขอมูล 2. ประยุกตการใชชนิดขอมูลแบบระเบียนและแถวลําดับในการเขียนโปรแกรมสําหรับจัดเก็บและ ประมวลผลขอมูลได เรื่องที่ 3.3.1 การใชแถวลําดับและระเบียนในการจัดเก็บขอมูล จากตัวอยางที่กลาวมาแลว เราจะเห็นไดวาเรามักนิยมใชระเบียนในการจัดเก็บขอมูลของสิ่งตาง ๆ ซึง่ เราเรียกวาสมาชิก (data element) ของชนิดขอมูลเชิงโครงสรางที่เราสรางขึ้น เพื่อประโยชนในการจัดเก็บ และการคนคืนไดอยางรวดเร็ว เราจะกําหนดใหขอมูลทุกตัวมีสวนเฉพาะ (unique identification) เรียกวาคีย (key part) และสวนทีเ่ หลือจะเรียกวาสวนขอมูล (data part) ในการนิยามคุณลักษณะเฉพาะของขอมูลชนิด คัดยอที่จะกลาวถึงในเอกสารชุดวิชานี้ จะใชชนิดเปน StdElement ซึง่ สามารถเขียนเปนภาษาปาสคาลไดดงั นี้


59 TYPE

StdElement = RECORD Key : KeyType; Data : DataType; END;

ซึง่ KeyType และ DataType ตองมีการนิยามกอน ขึ้นอยูกับขอมูลของแตละชนิด ตัวอยาง 3.7 ตัวอยางการนิยามชนิดขอมูล StdElement แบบตาง ๆ ตามการประยุกตการใชงาน สมมติเราตองการเก็บขอมูลของนักศึกษาหองหนึ่งเพื่อการประมวลผล เราตองมาพิจารณาวาเราจะ ใชอะไรเปนคีย (key part) ในการเขาถึงขอมูลของนักเรียนแตละคน และเราจะเก็บขอมูลอะไรบางของนัก เรียนแตละคน (data part) สมมติเราใหเลขประจําตัวนักเรียน (Id) เปนคีย และขอมูลที่ตองการจัดเก็บมีดังนี้ ชื่อ (Name), คะแนนวิชาคณิตศาสตร (Math), คะแนนวิชาสถิติ (Stat), คะแนนวิชาคอมพิวเตอร (Comp) นอกจากนัน้ แลว เราตองประมาณการจํานวนนักเรียนทีม่ ากทีส่ ดุ ทีเ่ ปนไปได (Size) ในที่นี้เราจะใชชนิดขอมูล ARRAY OF RECORD ในการจัดเก็บขอมูลของนักเรียนในชั้นหนึ่ง ๆ ซึง่ นิยามเปนภาษาปาสคาลไดดงั นี้ CONST Size = 100; TYPE StudentRec = RECORD Id : string[9]; {Key part} Name : string[20]# Math, Stat, Comp : integer; END; StudentType = ARRAY[1..Size] OF StudentRec

ขอสังเกต ในตัวอยางขางตน StdElement คือ StudentRec ถาขอมูลของเราเปนหนังสือในหองสมุด เราจะจัดเก็บขอมูลโดยใหรหัสหนังสือ (Call_No) เปนคีย และเก็บสวนทีเ่ ปนขอมูล ไดแก ชื่อหนังสือ (Title), ชื่อผูแตง (Author), สํานักพิมพ (Publisher), สถานะการ ยืมคืน (Status), และราคา (Price) เราก็สามารถนิยามขอมูลของเราได ดังนี้


60 CONST Size = 500; TYPE BookRec = RECORD Call_No : integer; Title : string[20]; Author : string[15]; Publisher : string[15]; Status : char; {I=Checked In, O=Checked Out} Price : integer; END; BookType = ARRAY[1..Size] OF BookRec;

กิจกรรม 3.2 ฝกเขียนชนิดขอมูล StdElement จงเขียน Pascal declaration สําหรับขอมูลชนิด ComputerRec โดยใหพิจารณาวาจะใชอะไรเปน คีย และจะเก็บขอมูลอะไรบางเกี่ยวกับคอมพิวเตอร เรื่องที่ 3.3.2 ตัวอยางการประยุกตใชแถวลําดับและระเบียนในการจัดเก็บขอมูลและการประมวลผล สมมติมีขอมูลแสดงถึงคะแนนสอบของนิสิต 3 วิชา ของนักเรียนชั้นหนึ่งในไฟลชื่อ Student.dat จง เขียนโปรแกรมเพือ่ พิมพรายงานผลการสอบของนักเรียนในชัน้ นี้ พรอมทั้งหาคาเฉลี่ยของแตละรายวิชา ตัว อยางผลลัพธเปนดังนี้

สวนของโปรแกรมดังแสดงในโปรแกรม 3.1 กิจกรรม 3.3 เขียนและทดสอบโปรแกรม จงเขียนโปรแกรม 3.1 ใหสมบูรณ พรอมทดสอบโปรแกรม


61 PROGRAM ArrayTest(InFile); USES wincrt; CONST Size = 100; TYPE StudentRec = RECORD Id : integer; {Key part} Name : string[15]; {Name,Math,Stat,Comp are data part} Math,Stat,Comp : integer; END; StudentType = ARRAY[1..Size] OF StudentRec; VAR

Student : StudentType; Total,I : integer; SumMath, SumStat, SumComp : integer; MeanMath, MeanStat, MeanComp : real; InFile:text;

PROCEDURE ReadData; BEGIN assign(InFile,'Data.Dat'); reset(InFile); I := 0; WHILE NOT EOF(InFile) DO BEGIN I := I + 1; WITH Student[I] DO readln(InFile,Id,Name,Math,Stat,Comp); END; Total := I; END; PROCEDURE PrintData; BEGIN END; PROCEDURE CalculateMeanAndPrint; BEGIN END; BEGIN ReadData; PrintData; CalculateMeanAndPrint; END.

โปรแกรม 3.1 โปรแกรมการประมวลผลขอมูลโดยใชการจัดสรรเนื้อที่หนวยความจําแบบคงที่

data structure lesson03  

ตอนที่ 3.2 ชนิดขอมูลแบบระเบียน (1 คาบ) เรื่องที่ 3.2.1 การกําหนดคุณลักษณะเฉพาะของระเบียน เรื่องที่ 3.2.2 พารามิเตอรของระเบียนและการจัดเก็บ...