(abstract data type) (object) (abstract) (data structure ...seree/lecture/pascal/uppascal1.pdf2...

21
1 บทที 1 โครงสรางขอมูลพื้นฐาน การสรางซอฟตแวรเพื่อประมวลผลขอมูลประกอบดวยสวนสําคัญ 2 สวน คือ การเลือกโครงสราง ขอมูล และ การออกแบบอัลกอริทึม การประมวลผลขอมูลจะมีประสิทธิภาพขึ้นกับการเลือกโครงสรางที่ เหมาะสมในการเก็บขอมูล และ การออกแบบอัลกอริทึมที่ใชไดดีกับโครงสรางขอมูลชนิดนั้น ชนิดขอมูลนามธรรม (Abstract data type) หมายถึง การกลาวถึงวัตถุ (object) ที่จะนําไปประมวลผล ในโปรแกรม ในที ่นี ้นามธรรม (abstract) หมายถึง หลักความจริงของขอมูล รวมทั ้ง การดําเนินการพื ้นฐาน และ ความสัมพันธของขอมูลที่นิยามไวนั้นไดมีการนํามาศึกษาอยางเปนอิสระจากการดําเนินงาน โครงสรางขอมูล (data structure) หมายถึง การศึกษาขอมูลในระดับตรรกวิทยา หรือ ระดับเชิงแนว คิดโดยเปนอิสระจากการเขียนโปรแกรม การนําโครงสรางขอมูลไปใชนั้นประกอบดวย 2 สวน คือ โครง สรางที่ใชเก็บขอมูล และ อัลกอริทึมที่ใชสําหรับการดําเนินงาน รวมทั ้ง ความสัมพันธพื้นฐานของโครงสราง นั ้น ภาษาปาสกาล ประกอบดวย ชนิดขอมูลที่นิยามไว เชน integer , real , char และ array โครงสรางขอ มูลเหลานี้สามารถนํามาใชในโปรแกรมโดยไมตองกําหนดชนิด การที ่นักเขียนโปรแกรมนําโครงสรางที กลาวมาไปใชไดอยางมีประสิทธิภาพนั้นขึ้นอยูกับความเขาใจในการนําชนิดขอมูลเหลานี้ไปใชในโปรแกรม โครงสรางขอมูลที่นิยามไวในภาษาปาสกาล สามารถเขียนแทนดวยรูปที่ 1.1 Data Types Simple Structured Pointer Ordinal Real Array Record Set File Predefined User defined Predefined User defined Integer Char Boolean Enumerated Sub range รูปที 1-1 การแบงชนิดขอมูลในภาษาปาสกาล

Upload: others

Post on 12-Sep-2019

12 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

1

บทท่ี 1 โครงสรางขอมูลพื้นฐาน

การสรางซอฟตแวรเพื่อประมวลผลขอมูลประกอบดวยสวนสําคัญ 2 สวน คือ การเลือกโครงสรางขอมูล และ การออกแบบอัลกอริทึม การประมวลผลขอมูลจะมีประสิทธิภาพขึ้นกับการเลือกโครงสรางที่เหมาะสมในการเก็บขอมูล และ การออกแบบอัลกอริทึมที่ใชไดดีกับโครงสรางขอมูลชนิดนั้น ชนิดขอมูลนามธรรม (Abstract data type) หมายถึง การกลาวถึงวัตถ ุ(object) ที่จะนําไปประมวลผลในโปรแกรม ในท่ีน้ีนามธรรม (abstract) หมายถึง หลักความจริงของขอมูล รวมท้ัง การดําเนินการพ้ืนฐาน และ ความสัมพันธของขอมูลที่นิยามไวนั้นไดมีการนํามาศึกษาอยางเปนอิสระจากการดําเนินงาน โครงสรางขอมูล (data structure) หมายถึง การศึกษาขอมูลในระดับตรรกวิทยา หรือ ระดับเชิงแนวคิดโดยเปนอิสระจากการเขียนโปรแกรม การนําโครงสรางขอมูลไปใชนั้นประกอบดวย 2 สวน คือ โครงสรางที่ใชเก็บขอมูล และ อัลกอริทึมที่ใชสําหรับการดําเนินงาน รวมท้ัง ความสัมพันธพื้นฐานของโครงสรางน้ัน ๆ ภาษาปาสกาล ประกอบดวย ชนิดขอมูลที่นิยามไว เชน integer , real , char และ array โครงสรางขอมูลเหลานี้สามารถนํามาใชในโปรแกรมโดยไมตองกําหนดชนิด การท่ีนักเขียนโปรแกรมนําโครงสรางท่ีกลาวมาไปใชไดอยางมีประสิทธิภาพนั้นขึ้นอยูกับความเขาใจในการนําชนิดขอมูลเหลานี้ไปใชในโปรแกรม โครงสรางขอมูลที่นิยามไวในภาษาปาสกาล สามารถเขียนแทนดวยรูปที ่1.1

Data Types

Simple Structured Pointer

Ordinal Real Array Record Set File Predefined User defined Predefined User defined Integer Char Boolean Enumerated Sub range

รูปท่ี 1-1 การแบงชนิดขอมูลในภาษาปาสกาล

Page 2: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

2

ชนิดขอมูลพื้นฐาน integer real char และ boolean ในภาษาปาสกาล เรียกวาชนิดขอมูลพ้ืนฐานหรือชนิด ขอมูลเชิงเดียว เพราะวา ขอมูลเหลานี้มีคาเพียงคาเดียว ชนิดขอมูลจํานวนเต็ม เซตของจํานวนเต็มในระบบจํานวน โดยทั่วไปใชความเปนนัยสําคัญของเลข 0,1,2,3..,9 กับตําแหนงที่เขียนเชน 724 เลข 7 แทน 7x100 เลข 2 แทน 2x10 และ เลข 4 แทน 4x1 ดังน้ันจํานวน 724 แทน จํานวน เจ็ดรอยยี่สิบสี่ ซึ่งสามารถเขียนในรูปแบบ 7 x 100 x 2.10 x 4.1 หรือ 7 x 102+2 x 101+4 x 100 การเก็บขอมูลในหนวยความจํานั้น เกบ็ในรูปของเลขฐานสอง ซึ่งระบบจํานวนแบบนี้มีเลข 2 ตัว คือ 0 และ 1 ความมีนัยสําคัญของเลขในฐานนี้ขึ้นอยูกับตําแหนงของตัวเลข เชน 1101 สามารถเขียนได คือ

!" !" # " !"$ " ! #% % % %+ + + เมื่อเปลี่ยนเปนเลขฐานสิบได 8 + 4 + 0 + 1 = 13 ดังนั้นถา นําจํานวนเต็ม 13 ไปเก็บไวในหนวยความจํา 16 บิตจะได 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 ในบางกรณ ีเม่ือตองการเก็บเคร่ืองหมายของจํานวนเต็ม จะเก็บไวที่บิตซายสุด โดย 1 แทน จํานวนท่ีมีคาเปนลบ และ ‘ 0 ‘ แทนจํานวนท่ีมีคาเปนบวก และ บิตท่ีเหลือใชเก็บจํานวน การเก็บแบบนี ้เรียกวา แบบไซนแอนดแมกนิจูด เชน การเก็บจํานวนเต็ม 6 และ –6 ไวในหนวยความจํา 8 บิต แบบไซนแอนดแมกนิจูดจะเก็บไดดังนี ้

0 0 0 0 0 1 1 0 บิตเคร่ืองหมาย (sign bit)

1 0 0 0 0 1 1 0 บิตเคร่ืองหมาย

เก็บคา 6

เก็บคา -6

Page 3: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

3

สําหรับการดําเนินการบวก ลบ จํานวนเต็ม แบบพ้ืนฐานน้ันใชหลักการของสวนเติมเต็มสอง (two’s complement notation) ในการดําเนินงานวิธีน้ี จํานวนเต็มบวกถูกเปลี่ยนไปเปนเลขฐานสอง สําหรับจํานวนเต็มลบเปลี่ยนไปเปนสวนเติมเต็มสอง โดยทําการเปลี่ยนแตละบิตไปเปนบิตตรงกันขามเรียกวาสวนเติมเต็มหนึ่ง เชน เดิมเปน 0 เปลี่ยนเปน 1 และ เดิม 1 เปน 0 ทุกบิต แลวบวก 1 ที่บิตขวาสุด เมื่อไดเปลี่ยนจํานวนเต็มทั้งสองจํานวนเปนเลขฐานสองหรือสวนเติมเต็มสองแลวจึงนําจํานวนทั้งสองไปบวกกัน ตัวอยาง 1.1 การหาผลบวกของ 5 + 7 0 0 0 0 0 1 0 1 คือ 5 + 0 0 0 0 0 1 1 1 คือ 7 0 0 0 0 1 1 0 0 ผลลัพธ คือ 12 ตัวอยาง 1.2 การหาผลบวกของ 5 + (-6) เน่ืองจาก –6 มีคานอยกวา 0 จึงเปล่ียนสวนเติมเต็มสอง 6 เปลี่ยนเปนฐานสองเก็บในหนวยความจําขนาดแบบ 8 บิต คือ 0 0 0 0 0 1 1 0 เปลี่ยนเปน สวนเติมเต็มหน่ึง 1 1 1 1 1 0 0 1 บวกหนึ่งที่บิตขวาสุดจะได 1 1 1 1 1 0 1 0 จํานวนเต็ม – 6 สามารถเก็บในหนวยความจํา 8 บิตในรูปของ สวนเติมเต็มสอง

1 1 1 1 1 0 1 0 ดังน้ัน นํา 5 + (-6) คือ 0 0 0 0 0 1 0 1 + 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 ผลที่ได คือ -1 สายอักขระไบนาร ีที่ประกอบดวยสมาชิกที่เปน 0 หรือ 1 สามารถแทนจํานวนเต็มได 2n จํานวน เม่ือ n = 16 บิต สามารถแทนจํานวนเต็มขนาด 216 = 65536 จํานวนในกรณีของทูสคอมพลีเมนต คาพิสัยจาก –32768 ถึง 32767

Page 4: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

4

ทูสคอมพลีเมนต เลขฐานสิบ 1000000000000000 -32768 1000000000000001 -32767 1000000000000010 -32766 1000000000000011 -32765

. .

. .

. . 1111111111111101 -3 1111111111111110 -2 1111111111111111 -1 0000000000000000 0 0000000000000001 1 0000000000000010 2 0000000000000011 3

. .

. .

. . 0111111111111101 32765 0111111111111110 32766 0111111111111111 32767

จํานวนเต็มท่ีมีขนาดใหญท่ีสุด ซึ่งสามารถเก็บในหนวยความจําขนาด 16 บิต คือ 215 -1 = 32767 และในหนวยความจําขนาด 32 บิต คือ 231 -1 = 2147483647 กรณีท่ีนักเขียนโปรแกรมบรรจุจํานวนเต็มท่ีมีขนาดใหญกวาความจุของหนวยความจํา ทําใหเกิดปรากฏการณ การลน (overflow) ขอจํากัดนี้สามารถแกไขโดยใชหนวยความจําขนาดใหญข้ึนในการเก็บจํานวนเต็ม แตอยางไรก็ตามพิสัยในการเก็บจํานวนเต็มในปาสกาลมีขอบเขตจํากัด ซึ่งเปนขอจํากัดของภาษานี ้ เพราะในวิชาคณิตศาสตร เซตของจํานวนเต็มไมมีขอบเขตจํากัด

Page 5: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

5

ขอมลูจํานวนจรงิ เปนจํานวนที่ใชแทนเศษสวน โดยตัวเลขที่อยูทางขวาของจุดทศนิยมแตละตัวมีกําลังของฐานสิบที่มีคาเปนลบ เชน 0.317 สามารถเขียนในรูปของ

$!# !!# &!#! " $% % %− − −+ + จุดในจํานวนจริงฐานสองท่ีใชแทนเศษสวน เรียกวา จุดทวิภาค (binary point) ตําแหนงท่ีอยูดานขวาของจุดน้ีแทนกําลังลบของฐานสอง เชน 1 1 0 . 1 0 1 คือ

!" !" # " !" #" !"" ! # ! " $% % % % % %+ + + + +− − − และมีคาเทากับจํานวนทศนิยม ' " # !

"#'

!(

) )"*+ + + + + = % การเก็บจํานวนจริงสามารถทําไดโดยเก็บไวในสายอักขระบิต ซึ่งมีอยูในรูปแบบของจุดวิทยาศาสตร หรือ จุดลอยตัว (floating point) เชน เลขฐานสอง 1 1 0. 1 0 1 หรือจํานวนจริง 6.625 มีคาเทากับ 0. 1 1 0 1 0 1 x 23

หนวยความจําท่ีใชเก็บจํานวนจริง แบงเปน 2 สวน คือ หนวยความจําสวนแรก คือ แมนทิสซา (mantissa) ใชเก็บสายอักขระบิตทั้งหมดโดยบิตแรกสุดของแมนทิสซามีคาเปนศูนยสําหรับกรณีท่ีจํานวนจริงมีคาบวก บิตแรกเปน 1 กรณีท่ีจํานวนจริงมีคาเปนลบ และหนวยความจําสวนท่ีสองใชเก็บกําลัง (exponent) เม่ือตองการนําจํานวนจริง 6.625 ใหไปเก็บไวในหนวยความจําขนาด 32 บิต จะใช 24 บิตแรกใชเก็บแมนทิสซา (1 1 0 1 0 1 ) และ 8 บิตหลังใชเก็บเลขยกกําลัง คือ –3 (10000011) สามารถเขียนแทนไดดวยรูป 0 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1

แมนทิสซา กําลัง การลน (overflow) ท่ีเกิดข้ึนในการเก็บจํานวนจริง มี 2 แบบ คือ ในกรณีของจํานวนจริงท่ีมีขนาดใหญเกินความจุของหนวยความจําที่กําหนด กับอีกกรณีหนึ่งคือสวนที่ใชเก็บเลขยกกําลังมีขนาดเล็กเกินที่จะบรรจุขอมูล

Page 6: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

6

การเก็บจํานวนจริงมีขอจํากัดเชนเดียวกับจํานวนเต็ม คือ สามารถเก็บขอมูลไดในชวงที่มีขอบเขตจํากัด เน่ืองจากจํานวนของบติท่ีใชเก็บเลขยกกําลังเปนตัวกําหนดขนาดขอมูล ดังน้ัน จํานวนจริงที่สามารถบรรจุในหนวยความจํา เปนเพียงเซตยอยของจํานวนจริงทางคณิตศาสตรเทาน้ัน หนวยความจําไมสามารถ

บรรจุจํานวนจริงของเซตยอยไดทุกชนิด ขอมูลตัวอักขระ การดาํเนนิงาน และการประมวลผลของเคร่ืองคอมพิวเตอรนั้น เก่ียวของกับขอมูลที่เปนอักขระ และ จํานวนตางๆ การเก็บอักขระข้ึนอยูกับมาตรฐานการกําหนดคาท่ีใชแทนตัวอักขระ เชน รหัสแอสกี (ASCII – American Standard Code for Information Interchange) ซ่ึงเปนรหัสที่นิยมใชกันอยางแพรหลายกับเครื่องคอมพิวเตอร เชน อักขระ A แทนดวย รหัสไบนารี 0 1 0 0 0 0 0 1 อักขระ T แทนดวย รหัสไบนารี 0 1 0 1 0 1 0 0 เม่ือนําอักขระ A และ T ไปเก็บไวในหนวยความจําขนาด 16 บิต จะได 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 A T การดําเนินงานเปรียบเทียบระหวางตัวอักขระ 2 ตัว วาเทากัน หรือนอยกวา หรือมากกวา ทําไดโดยเปรียบเทียบคาของรหัสไบนารีของอักขระแตละตัว ถาคาของรหัสไบนารีของอักขระตัวแรกจะมีคาเทากับของตัวที่สอง จะไดวาตัวอักขระท้ังสองคือตัวเดียวกัน ชนิดขอมูลบูลีน ขอมูลชนิดบูลีนประกอบดวย 2 มูลคา คือ จริง และ เท็จ ซึ่งใช 0 แทนคาเท็จ และ 1 แทนคาจริงในคอมพิวเตอรบางระบบจะใชเนื้อที่เก็บ 1 ไบต หรือ 1 เวอรด สําหรับเก็บ บูลีน 1 คา โดยสายอักขระมีคาเปน 0 ทั้งสาย เม่ือเก็บคาเท็จ และเปน 1 ทั้งสายเมื่อเก็บคาจริง ในภาษาปาสกาล การดําเนินงานของบูลีนมี 3 แบบ คือ and , or และ not

ตารางแสดงการดําเนินงานของ and

and 0 1 0 0 0 1 0 1

Page 7: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

7

ตารางแสดงการดําเนินงานของ or

or 0 1 0 0 1 1 1 1

ตารางแสดงการดําเนินงานของ not

not 0 1 1 0

ชนิดขอมูลแถวลําดับ แถวลําดับเปนโครงสรางขอมูลที่พบในภาษาคอมพิวเตอรระดับสูงทุกภาษา โครงสรางชนิดน้ีใชเก็บขอมูลชนิดเดียวกันที่มีขอบเขตจํากัดและมีขนาดคงที่ การทํางานพื้นฐานของแถวลําดับ คือ การเขาถึงตําแหนงแตละตําแหนงในแถวลําดับไดโดยตรง สมาชิกในแถวลําดับจะถูกเก็บในแถวลําดับแบบอันดับ คือ สมาชิกตัวที่ 1 สมาชิกตัวที่ 2,… การเขาถึงแถวลําดับแบบตรง หมายถึง การเขาถึงสมาชิกของแถวลําดับ โดยการกําหนดตําแหนงของสมาชิกในแถวลําดับ ดังนั้นเวลาที่ใชในการเขาถึงสมาชิกแตละตัวในแถวลําดับจะมีจํานวนเทากัน ไมขึ้นอยูกับตําแหนงของสมาชิก เชน แถวลําดับที่มีสมาชิก 200 ตัว การเขาถึงสมาชิกตัวที ่75 จะใชเวลาเทากับการเขาถึงสมาชิกตัวที ่5 ในภาษาระดับสูง แถวลําดับแทนดวยตัวแปรซึ่งมีสมาชิกอยูภายใน การเรียกใชสมาชิกภายในแถวลําดับ จะเรียกโดยระบุชื่อตัวแปรและดรรชนีของสมาชิกในแถวลําดับ ซึ่งเปนการบอกตําแหนงของสมาชิกตัวน้ัน แถวลําดับมีดรรชนีเพียง 1 ตัว เรียกวา แถวลําดับ 1 มิติ (one dimensional array) แถวลําดับที่มีดรรชนีหลายตัว เรียกวา แถวลําดับหลายมิต ิ(multidimensional array)

การประกาศแถวลําดับ 1 มิติม ี2 สวน คือ ชนิดของดรรชนี (index type) และชนิดของสมาชิก รูปแบบในภาษาปาสกาล array (ชนิดของดรรชนี) of (ชนิดของสมาชิก) ชนิดของดรรชนี ตองเปนขอมูลชนิดอันดับ (ordinal) เทาน้ัน ชนิดของสมาชิก เปนชนิดขอมูลใด ๆ ก็ได

Page 8: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

8

เชน const limit = 20 ; type number = array [ 1 .. limit ] of integer ; var A : number ; ในการกําหนดคร้ังน้ี ตัวแปลภาษาจะจองเนื้อที่ในหนวยความจําซึ่งมีขนาดใหญพอที่จะเก็บสมาชิกของแถวลําดับทั้งหมด ที่อยูของหนวยความจําที่ใชเก็บสมาชิกตัวแรก เรียกวาที่อยูฐาน (base address) ของแถวลําดับ และที่อยูของสมาชิกแถวลําดับตัวอื่นๆ สามารถคํานวณไดจากที่อยูฐาน เชน จากการประกาศ ขางตน ถามีการเก็บจํานวนเต็มไวหนวยความจํา โดยเก็บจํานวนเต็ม 1 จํานวนไวใน 1 เซล เม่ือเร่ิมเก็บ A [1] ไวที่ base (A) ดังน้ันจะเก็บ A [5] ไวที่ base (A) + 4 กลาวคือ สามารถหาตําแหนงที่เก็บ A [i] ไดจากสูตร base (A) + ( i – 1)

ท่ีอยู หนวยความจํา สมาชิกของแถวลําดับ . . . ท่ีอยูฐาน base(A) + 0 A[1] base(A) + 1 A[2] base(A) + 2 A[3] base(A) + 3 A[4] base(A) + 4 A[5] . . . . . . . . . base(A) + 19 A[20]

.

.

.

Page 9: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

9

รูปท่ี 1.2 การเก็บแถวลําดับในหนวยความจํา

สายอักขระ (String) ในภาษาปาสกาลใช packed array of char แทนการเก็บสายอักชระซึ่งเปนที่เก็บชุดตัวอักขระ สามารถกําหนดแถวลําดับ P ของสายอักขระ ดังน้ี const Limit = 40 ; type String1 = packed array [1 .. Limit] of char ; var P : String1 ; การกําหนด P เปนแถวลําดับอัดแนนน้ัน ทําใหตัวแปลภาษานําตัวอักขระหลายตัวไปเก็บไวในหนวยความจําในเวอรดเดียวกัน เชน ตัวอักขระ 4 ตัว P[1] P[2] P[3] และ P[4] เก็บไวในเวอรดแรกของหนวยความจําและมีตําแหนงที่อยู base (P) ตัวอักขระถัดมา P[5] P[6] P[7] และ P[8] เก็บไวในเวอรดถัดไปท่ีตําแหนง base (P) + 1 ซึ่งหนวยความจํา 1 เวอรดมีขนาด 4 ไบต

ท่ีอยู หนวยความจํา สมาชิกของแถวลําดับ . .

ท่ีอยูฐาน base(P) + 0 P[1],P[2],P[3],P[4] base(P) + 1 P[5],P[6],P[7],P[8] base(P) + 9 P[37],P[38],P[39],P[40]

. . .

Page 10: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

10

รูปท่ี 1-3 การเก็บสายอักขระในหนวยความจํา การเขาถึงสมาชิกของสายอักขระนั้นจะซับซอนกวาการเขาถึงสมาชิกของแถวลําดับทั่วไป เพราะการคํานวณที่อยูของสมาชิกจะยุงยากกวาแบบทั่วไป นอกจากนั้นอาจจะมีการแปลขอมูลที่บีบอัดไวในหนวยความจํา คุณสมบัตินี้ทําใหการประมวลผลสายอักขระจะใชเวลามากกวา การประมวลผลแถวลําดับธรรมดา แถวลําดับหลายมิต ิ แถวลําดับหลายมิต ิคือ แถวลําดับท่ีมีดรรชนีมากกวา 1 ตัว เชน แถวลําดับ 2 มิต ิ ซ่ึงใชในการประมวลผลขอมูลอยางแพรหลาย แถวลําดับ 2 มิต ิใชในการประมวลผลขอมูลท่ีมีการจัดไวเปนแถวและสดมภ ตัวอยาง 1-3 การใชแถวลําดับ 2 มิติ ในการเก็บขอมูลและการประมวลผลของยอดขาย (สินคา 4 ชนิด ในแตละวัน) ของรานคา 3 ราน ขอมูลการขายนี้สามารถนํามาบันทึกไวในตารางที่ประกอบดวย 4 แถว 3 สดมภ ดังน้ี สามารถกําหนดแถวลําดับ 2 มิติ

รานคา สินคา 1 2 3 1 15 20 7 2 5 0 3 3 12 14 29 4 1 1 2

const maxitems = 4 ; maxstores = 3 ; type saletable = array [1 … maxitems , 1 .. maxstores] of integer ; var saletab : salestable ; ตัวแปร saletab [3,2] สามารถนําไปใชเพื่อเขาถึงจํานวนของการขาย (14) ของสินคา 3 (แถว 3) ที่รานคา 2 (สดมภ 2) ในกรณีที่ตองการเก็บขอมูลการขายในสัปดาห รานเปด 6 วัน คือ วันจันทรถึงวันเสารดังน้ันจึงใช ตารางท้ังหมด 6 ตาราง Monday

Page 11: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

11

รานคา สินคา 1 2 3 1 15 20 7 2 5 0 3 3 12 14 29 4 1 1 2

Tuesday

รานคา สินคา 1 2 3 1 6 2 9 2 10 5 4 3 15 17 22 4 0 2 3

Saturday

รานคา สินคา 1 2 3 1 8 5 1 2 7 11 0 3 34 28 17 4 2 1 0

การประกาศแถวลําดับ 3 มิต ิ ที่ใชเก็บขอมูลการขายในสัปดาหทําไดโดย const maxitems = 4 ; maxstores = 3 ;

Page 12: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

12

type days = (Monday , Tuesday , Wednesday , Thursday , Friday , Saturday) ; listofsalestables = array [days , 1 .. maxitems , 1 .. maxstores] of integer ; var sales : listofsalestables ; การเขาถึงสมาชิกในแถวลําดับที่เปนการขายของ Monday แถวที่ 3 สดมภที่ 2 จะไดมูลคาการขาย คือ 14 ซึ่งสามารถเขียนแทนไดโดย sales [Monday , 3 , 2] การประกาศแถวลําดับ 5 มิต ิ type make = (Toyota , Honda , Datsun , BMW) ; style = (Twodoor , Fourdoor , Pickup , Van) ; color = (blue , green , red , bronze , gold) ; year = 1980 .. 2000 ; modelcode = 1 .. 5 ; Inventoryarray = array [make , style , color , year , modelcode ] of integer ; var Inv : Inventoryarray ; แถวลําดับ Inv อาจนํามาใชในโปรแกรมสตอกสินคาของบริษัทขายรถยนต เชน Inv [Honda , Fourdoor , red , 1999 , 4] : = Inv[Honda , Fourdoor , red , 1999 , 4] – 1; หมายถึง การที่ผูจําหนายไดขายรถยนต Honda 4 ประตู สีแดง ป 1999 รหัส 4 ไปจํานวน 1 คัน ทําใหสินคาในสตอกมีปริมาณรถยนตลดลง 1 คัน รูปแบบการประกาศแถวลําดับหลายมิต ิ array [indextype1 , indextype 2 , … , indextypeN] of elementtype ; การเก็บแถวลําดับหลายมิติในหนวยความจําโดยสมมติวา จํานวนเต็ม 1 ตัวเก็บไวในหนวยความจําเชิงเดียว 1 เซล ดังนั้นแถวลําดับ 2 มิติ ขนาด 3x4 ท่ีใชเก็บจํานวนเต็มจึงมีผลใหเกิดการจองเน้ือท่ีในหนวยความจํา 12 ตําแหนงเพื่อเก็บสมาชิกของแถวลําดับ สมาชิกเหลานี้เก็บแบบแถวหลัก โดย 4 เซลแรกใชเก็บสมาชิกทั้งหมดในแถวแรกของ M และ 4 เซลตอไปใชเก็บสมาชิกในแถวที่ 2 ตอไปตามลําดับ กําหนดให M เปนแถวลําดับ 2 มิติ ท่ีใชเก็บจํานวนเต็ม type

Page 13: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

13

table = array [1 ..3 , 1 .. 4] of integer ; var M : table ; แถวลําดับที่กลาวมาอาจใชเก็บขอมูล ดังน้ี 37 45 82 75 61 50 0 27 17 9 62 91

ท่ีอยู หนวยความจํา สมาชิกของแถวลําดับ

. . . base(M) + 0 M[1,1]

base(M) + 1 M[1,2] base(M) + 2 M[1,3] base(M) + 3 M[1,4] base(M) + 4 M[2,1] base(M) + 5 M[2,2] base(M) + 6 M[2,3]

base(M) + 7 M[2,4] base(M) + 8 M[3,1] base(M) + 9 M[3,2]

base(M) + 10 M[3,3] base(M) + 11 M[3,4] . . .

รูปท่ี 1-4 แสดงการเก็บขอมูลในหนวยความจําแบบแถวหลัก

37 45 82 75 61 50 0 27 17 9 62 91

Page 14: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

14

การเก็บขอมูลแบบคอลัมนหลัก ซ่ึงเก็บขอมูลในคอลัมนแรกไวใน 3 เซลแรก และเก็บขอมูลในคอลัมนที ่ 2 ไวใน

เซลถัดไป ดังรูป 1-5 ท่ีอยู หนวยความจํา สมาชิกของแถวลําดับ

. . . base(M) + 0 M[1,1]

base(M) + 1 M[2,1] base(M) + 2 M[3,1] base(M) + 3 M[1,2] M[1,2] base(M) + 4 M[2,2] base(M) + 5 M[3,2] base(M) + 6 M[1,3]

base(M) + 7 M[2,3] base(M) + 8 M[3,3] base(M) + 9 M[1,4]

base(M) + 10 M[2,4] base(M) + 11 M[3,4] . . .

รูปท่ี 1-5 แสดงการเก็บขอมูลในหนวยความจําแบบแถวหลัก

สําหรับการเขาถึงขอมูลในแถวลําดับ 2 มิติ น้ัน ใชวิธีการเกี่ยวกับการเขาถึงขอมูลของแถวลําดับ 2 มิติ

ระเบียน

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

รูปแบบ

37 61 17 45 50 9 82 0 62 75 27 91

Page 15: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

15

record รายชื่อสมาชิก end

การประกาศตวัแปรระเบียนในภาษาปาสกาล type string = packed array [1 .. 10] of char ; userrec = record idmumber : integer ; password : string ; resourcelimit , resourceused : real ; Var user : userrec ; ขอมูลที่เก็บไวภายในระเบียน user อาจมีดังน้ี idnumber password resourcelimit resourceused

12345 Y2K 100.00 99.99 การเขาถึงเขตขอมูลของระเบียนสามารถทําไดโดยตรง โดยการเรียกใช ตัวแปรเขตขอมูลซ่ึงมีรูปแบบ คือ ช่ือระเบียน . ช่ือเขตขอมูล การกําหนดคาของขอมูลใหเขตขอมูล idnumber สามารถทําไดโดยใชขอความสัง่ user.idnumber : = 12345 ; หรือ readln (user.idnumber) ; การแสดงขอมูลของ user . password นั้นทําโดยใชคําสั่ง writeln (user.password) ; การเก็บระเบียนในหนวยความจํา การเก็บและการทํางานของระเบียนน้ันมีความซับซอนกวาการเก็บแถวลําดับ เพราะระเบียนประกอบดวยสมาชิกตางชนิดกันและเขตขอมูลมีขนาดตางกัน ดังนั้น การคํานวณตําแหนงท่ีเก็บขอมูลยุงยากกวาของแถวลําดับ

Page 16: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

16

จากการกําหนดชนิดขอมูลของตัวแปร user ท่ีไดกลาวมาแลว สมมติใหหนวยความจาํ 2 เซล ใชเก็บจํานวนเต็ม 1 จํานวน จํานวนจริงใชหนวยความจํา 2 เซล และ string ใชหนวยความจํา 5 เซล ฉะนั้นระเบียน user นั้นจองเนื้อที่ในหนวยความจํา 10 เซล ตําแหนงของเซลแรกนั้น เรียกวา ตําแหนงฐาน เขตขอมูล user . idnumber เก็บไวที่เซลตําแหนง base (user) เขตขอมูล user.password เก็บในเซลตําแหนง base (user) + 1 ถึง base (user) + 5 สําหรับ user . resource limit เก็บในเซล base(user) + 6 และ base(user) + 7 และเขตขอมูลสุดทาย user.resourced used เก็บไวท่ีเซล base (user) + 8 และ base (user) + 9

ท่ีอยู หนวยความจํา เขตขอมูล

. . . .

base(M) + 0 User. IdNumber

base(M) + 1 base(M) + 2

base(M) + 3 User. Pasword base(M) + 4

base(M) + 5 base(M) + 6 base(M) + 7 User.ResourceLimit

base(M) + 8 base(M) + 9 User. ResourceUsed . . . . .

รูปท่ี 1-6 แสดงการเก็บขอมูลของระเบียน user กระบวนงานเรียกซ้ํา (Recursive Procedure) เปนการทํางานของกระบวนงานที่มีการอางถึงชื่อตัว กระบวนงานนั้น ๆ ภายในตัวเอง การทํางานแบบเรียกซ้ํานี้สามารถทําไดในภาษาระดับสูงของบางภาษาเทานั้น เชน ในภาษาปาสกาล แนวคิดเบ้ืองตนของการเรียกซํ้า เชน การคํานวณ Xn ซึ่ง X เปนจํานวนจริง และ n เปนจํานวนเต็มบวก การนิยาม Xn แบบไมเรียกซ้ํา คือ Xn = X x X x X … x X

Page 17: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

17

n x’s และ X0 คือ 1 การคํานวณจํานวนเต็มยกกําลัง คือ 30 = 1 31 = 3 32 = 3 x 3 = 9 33 = 3 x 3 x 3 = 27 34 = 3 x 3 x 3 x 3 = 81 35 = 3 x 3 x 3 x 3 x 3 = 243 สามารถคํานวณจํานวนยกกําลังของ 3 ในอันดับถัดไป เชน 33 = 27 สามารถใชมูลคานี้มาคํานวณ 34 = 3 x 33 = 3 x 27 = 81 35 = 3 x 34 = 3 x 81 = 243 ดังน้ัน ในการคํานวณเลขยกกําลังของ 3 สามารถทําไดโดยรูมูลคาของ 30

30 = 1 และความสัมพันธพื้นฐานของ 3 ยกกําลัง อันดับตาง ๆ กับอันดับถัดไป คือ 3n = 3 x 3n-1 ในวิธีการน้ี การคํานวณเลขยกกําลัง โดยใชนิยามแบบเรียกซ้ําของฟงกชันยกกําลัง ให X0 = 1 Xn = X x Xn-1 สําหรับ n > 0 แผนภาพการเรียกซ้ําของฟงกชันยกกําลัง 35 = 3 x 34 = 3 x 81 = 243 34 = 3 x 33 = 3 x 27 = 81 33 = 3 x 32 = 3 x 9 = 27

Page 18: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

18

32 = 3 x 31 = 3 x 3 = 9 31 = 3 x 30 = 3 x 1 = 3 30 = 1

รูปท่ี 1-7 การทํางานของฟงกชันยกกําลังโดยวิธีเรียกซ้ํา การกําหนดนิยามแบบเรียกซํ้า ประกอบดวย 2 สวนคือ 1.กรณีฐานเปนการกําหนดมูลคาของฟงกชันจากพารามิเตอร 2.กรณีทั่วไป เปนการกําหนดมูลคาของฟงกชันจากมูลคาของฟงกชันที่ไดนิยามไวกอนหนา และ / หรือ จากมูลคาของพารามิเตอร เชน X0 = 1 กรณีฐาน Xn = X x Xn-1 กรณีทั่วไป ตัวอยาง 1-4 ฟงกชัน Power ใชคํานวณเลขยกกําลังโดยใชวิธีเรียกซ้ํา Function Power (X : real ; n : integer ) : real ; Begin if n = 0 then Power : = 1 else Power : = X * Power (X , n-1) end ( * power *);

Page 19: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

19

เมื่อ x = 3.0 และ n = 5 ฟงกชันน้ีใหผลลัพธเปน 243 และสงคาน้ีกลับท่ีโปรแกรมท่ีเรียกใช Power(3.0,5) = 3.0 * = 243.0

กําหนดให x = 3.0 และ n = 4 ฟงกชันนี้ให

Power(3.0,4) = 3.0 * 27.0 = 81.0 ผลลัพธเปน 81.0 และสงคานี้กลับไปที ่ ฟงกชัน Power (3.0,5)

กําหนดให x = 3.0 และ n = 3 ฟงกชันนี้ให Power(3.0,3) = 3.0 * = 27.0 ผลลัพธเปน 27.0 และสงคานี้กลับไปที ่

ฟงกชัน Power (3.0,4)

กําหนดให x = 3.0 และ n = 2 ฟงกชันนี้ให Power(3.0,2) = 3.0 * = 9.0 ผลลัพธเปน 9.0 และสงคานี้กลับไปที ่

ฟงกชันPower (3.0,3)

กําหนดให x = 3.0 และ n = 1 ฟงกชันนี้ให Power(3.0,1) = 3.0 * = 3.0 ผลลัพธเปน 3.0 และสงคาน้ีกลับไปท่ีฟงกชัน Power (3.0,2) กําหนดให x = 3.0 และ n = 0 ฟงกชันนี้ให

Power (3.0,0) = ผลลัพธเปน 1.0 และสงคาน้ีกลับไปท่ีฟงกชัน เรียกใช

รูปท่ี 1-8 การทํางานแบบเรียกซ้ําของฟงกชัน Power

คําสั่งลําลอง (Pseudocode) โดยทั่วไปการเขียนอัลกอริทึมมักจะเขียนในรูปแบบของคําสั่งลําลอง ซึง่เปนการรวมภาษาธรรมชาติ

กับสัญญลักษณ คําศัพท และ คุณลักษณะอื่น ๆ ที่ใชในภาษาโปรแกรมมิ่งระดับสูง อยางไรก็ตามคําสั่งลําลองนี้ไมมีมาตรฐานของไวยกรณ จึงทําใหภาษานี้ มีความแตกตางกันสําหรับนักเขียนโปรแกรมแตละคน คําสั่งลําลองมีคุณสมบัติดังตอไปนี ้

81.0

27.0

3.0

9.0

1.0

1.0

Page 20: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

20

!%++สัญลักษณ คอมพิวเตอร เชน +, -, *, / เปนเคร่ืองหมายทางคณิตศาสตรพ้ืนฐาน "%++ชื่อของสัญลักษณ (ตัวระบ)ุ ใชแทนมูลคาที่ไดรับการประมวลผลโดยอัลกอริทึม $%++คําอธิบายการทํางานของอัลกอริทึม เชน คําอธิบายของภาษาปาสกาลจะเขียนอยูระหวางสัญลักษณ เชน (*และ*)

'%++คําศัพท (keyword) ที่ใชทั่วไปในภาษาระดับสูงมีการนํามาใช เชน ‘read’ หรือ ‘enter’ เปนสําหรับคําสั่งนําเขาขอมูล และ ‘display’ ‘print’ หรือ ‘write’ เปนคําสั่งสงขอมูลออก

*%++การยอหนา ใชเพื่อกําหนดคําสั่งแตละกลุม ตัวอยาง 1-5 คําสั่งลําลองใชอานและนับเลข 3 จํานวน (x,y และ z ) และพิมพจํานวนที่มีคามากที่สุดพรอมกับแสดงจํานวนท้ังหมดท่ีเคร่ืองอาน

!%+Initialize Count to 0. "%+Read the first triple of numbers x, y, z. $%+While x ≠ end-of-data-flag do the following:

,%+Increment Count by 1. -%+If x > y and x > z then

Display x. Else if y > x and y >z then Display y. Else Display z.

.%+Read next triple x, y, z. '%+Display Count.

Page 21: (Abstract data type) (object) (abstract) (data structure ...seree/lecture/Pascal/uppascal1.pdf2 ชนิดข อมูลพื้นฐาน integer real char และ boolean

21

แบบฝกหัด บทท่ี 1 1.จงเปลี่ยนเลขฐานสอง 0 1 0 0 1 0 0 1 0 1 0 1 0 0 0 1 เปนเลขฐานสิบ 2.จงเปล่ียนจํานวนเต็มตอไปน้ีเปนเลขฐานสอง แลวหาทูสคอมพลีเมนต (ก) 99 (ข) 5280 (ค) 255 (ง) -255 (จ) 1024 (ฉ) -1024 3.จงเขียนโปรแกรมที่สามารถบวกจํานวนเต็มที่มีความยาวขนาด 300 หลัก วิธีการ คือ เก็บจํานวนไวในแถวลําดับซึ่งสมาชิกแตละตัวของแถวลําดับเปนที่เก็บของตัวเลขของจํานวนเต็ม เชน จํานวนเต็ม 179 , 534 , 672, 198 เก็บไวที ่Block [1] = 198 ; Block [2] = 672 , Block [3] = 534 , Block [4] =179 สําหรับการบวกจํานวนเต็ม 2 จํานวน ทําโดยบวกสมาชิกของแถวลําดับทีละชอง และ มีการนําตัวทดไปบวกที่ชองอันดับถัดไป 4.จากกระบวนงาน P ที่กําหนดใหจงตอบคําถามในขอ ก. ถึง ขอ ค. Procedure P (ch : char); begin if ( ‘A’ < = ch) and (ch < = ‘H’) then begin p (pred (ch)) ; write (ch) end else writeln end ; ( �) ผลลัพธที่ไดจากการเรียกใชกระบวนงาน P ใน กรณีตอไปนี ้คือ 1. P( ‘c’ ) 2. P( ‘G’ ) 3. P( ‘3’ )

( �) ในกระบวนงาน P ถาแทน succ ดวย pred ผลลัพธที่เกิดขึ้นในขอ (ก) คืออะไร (ค) ถาขอความสั่ง write และการเรียกซ้ํา p (pred (ch)) ; มีการสลับที่กัน ผลลัพธที่ไดในขอ (ก) คืออะไร