วันพุธที่ 14 กันยายน พ.ศ. 2559

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

ทรี  ( Trees )

                   ลิสต์แบบไม่ใช่เชิงเส้น(Non-Linear Lists) คือลิสต์ที่สมาชิกแต่ละตัวสามารถมี
สมาชิกตัวถัดไป(Successor) ได้มากกว่าหนึ่งตัว ลิสต์แบบไม่ใช่เชิงเส้นนี้สามารถแบ่งออกเป็น
2 ประเภทด้วยกัน คือ ทรีและกราฟ (Trees and Graphs) สำหรับโครงสร้างข้อมูลแบบทรี สมา
ชิกแต่ละตัวยกเว้นรูทโหนดจะมีสมาชิกตัวก่อนหน้า (Predecessor) เพียงหนึ่งตัว  ในขณะที่โครง
สร้างข้อมูลแบบกราฟ สมาชิกแต่ละตัวสามารถมี Predecessorมากกว่าหนึ่ง
                       ทรีเปรียบเสมือนกับต้นไม้ที่มีราก (Root) และมีลำต้นที่แผ่กิ่งก้านสาขา  โดยแต่ละ
กิ่ง(Branch)ก็จะมีการผลิใบ (Leaf) ไปทั่ว ซึ่งเป็นไปตามความสัมพันธ์ในลักษณะแบบลำดับชั้น
(Hierarchical Relationship) และตัวทรีมีโครงสร้างแบบลำลับชั้นนี้เอง จึงมักนำไปใช้เพื่อนำ
เสนอเป็นแผนผังองค์กร (Organization Chart) โครงสร้างไดเรกทอรี (Diractory) หรือแม้กระ
ทั่งสมาชิกครอบครัวของทรีเอง

                   ทรีประกอบด้วยโหนด (Node) ที่ใช้สำหรับบรรจุข้อมูล โดยจะมีกิ่งซึ่งเป็นเส้นที่เชื่อม
โยงโหนดเข้าด้วยกันที่เรียกว่าบรานช์ (Branch) จำนวนของบรานช์ที่สัมพันธ์กับโหนดเรียกว่าดีกรี
(Degree) และ ถ้าหากทรีนั้นเป็นทรีที่ไม่ใช่ที่ว่าง โหนดแระจะเรียกว่ารูท (Root) โดยโหนดทุก ๆ
โหนดยกเว้นรูทโหนดจะมีเพียง 1 Predecessor ในขณะที่ Successor อาจเป็น 0 หรือ 1 หรือ
มากกว่า 1 ก็ได้

                   สำหรับ Leaf ก็คือโหนดใบที่ไม่มีบรานช์เชื่อมโยงไปยังโหนดตัวถัดไป กล่าวคือ โหนด
ใบก็คือโหนดใบที่ไม่มีตัวตามหลังหือ Successor นั่นเอง ในขณะที่โหนดพ่อ (Parent) จะมีโหนด
ตามหลัง หรือกล่าวอีกนัยหนึ่งว่าโหนดที่มีตัวก่อนหน้าก็คือโหนดลูก (Child) โดยที่โหนดลูกตั้งแต่
สองโหนดหรือมากกว่าที่มาจากพ่อเดียวกันจะเรียกว่าโหนดพี่น้อง (Siblings)  สำหรับความสัมพันธ์
อื่น ๆ ภายในครอบครัวของทรีไม่ว่าจะเป็น ลุง ป้า น้า อา หรือหลาน เหลน โหลนนั้น ไม่มีความจำ
เป็นต้องนำมาใส่ใจขอให้พิจารณาเพียงความสัมพันธ์หลักตัวใหญ่ ๆ ก็เพียงพอ เช่น บรรพบุรุษ
(Ancestor) หรือลูกหลาน (Descendent) เป็นต้น

                   โหนดต่าง ๆ ภายในทรีจะอยู่ในระดับที่แตกต่างกัน โดยเริ่มต้นจากรูทโหนด ซึ่งถือเป็น
ระดับแรกสุด (Level 0) ส่วนลูก ๆ ของรูทโหนดก็คือระดับที่ 1 (Level 1) และลูก ๆของโหนดในระ
ดับที่1 ก็จะอยู่ในระดับที่ 2 (Leve l ) ซึ่งจะเพิ่มระดับไปเรื่อย ๆ เมื่อมีลูกหลานเพิ่มขึ้น ดังนั้นในการ
คำนวณระดับความสูงหรือความลึกของทรีจะคำนวณได้จากการนำค่าระดับสูงสุด (Leaf Node) ของ
ทรีนั้นมาบวกด้วย 1
รูปที่ 6.1 ทรี (Tree)
                    เมื่อได้เข้าถึงศัพท์ต่าง ๆ ที่เกี่ยวข้องกับทรีแล้ว ต่อไปนี้ทำการพิจารณาทรีจากรูปที่
6.1เพื่อนำไปประกอบคำอธิบายให้เข้าใจดียิ่งขึ้น ดังรายละเอียดต่อไปนี้
  1. โหนดแรก (Root Node)
                    คือโหนด A ซึ่งโหนดรากหรือรูทโหนด ถือเป็นโหนดแรกสำหรับโครงสร้างทรีที่ใช้เป็น
โหนดเริ่มต้น เพื่อขยายลูกหลานต่อไป

- โหนดพ่อ (Parents) คือโหนด A,B และ F ซึ่งก็คือโหนดที่มี Successor

- โหนดลูก (Children) คือโหนด B,E,F,C,D,G,H และ I ซึ่งก็คือโหนดที่มี Predecessor

- โหนดพี่น้อง (Siblings) คือโหนด {B,E,F},{C,D}และ{G,H,I}

- โหนดใบ (Leaf Node) คือโหนด C,D,E,G,H และ I ซึ่งก็คือโหนดที่ไม่มี Successor
- ดีกรีทั้งหมดของทรี มีค่าเท่ากับ 8
- ดีกรีทั้งหมดของโหนด F มีค่าเท่ากับ 3
- จำนวนของ Leaf โหนด มีค่าเท่ากับ 6
- ระดับความสูงหรือความลึกของทรี คำนวณได้จากสูตร Height =2+1=3
                  นอกจากนี้  ทรียังสามารถแบ่งย่อยออกเป็นซับทรี  (Subtrees) หรือเรียกว่าทรีย่อย
ซึ่งซับทรีเหล่านี้จะเป็นโครงสร้างที่มีการเชื่อมโยงถัดจากรูทโหนด  สำหรับโหนดแรกของซับทรีก็
คือรูทโหนดของซับทรีนั้น ๆ  และยังใช้เป็นชื่อเรียกของซับทรีนั้นด้วย  นอกจากนี้ซับทรียังสามารถ
แบ่งส่วนย่อยออกเป็นซับทรีย่อย ๆ ได้อีก
1จงอธิบายลักษณะโครงสร้างเชิงแตกต่างจากโครงสร้างไม่เป็นเส้นอย่างไร
ตอบ  โครงสร้างเชิงเส้นจะมีสมาชิกตัวถัดไปเพียงตัวเดียว  แต่โครงสร้างเชิงเส้น  จะมีสมาชิกตัวถัดไปหลายตัวโดยการแตกสาขา
2.จงอธิบายการสร้างไบนารีทรีโดยใช้อาร์เรย์เป็นอย่างไร
ตอบ  การสร้างไบนารี่ทรีโดยใช้อาร์เรย์  จะได้ทรีที่มีจำนวนโหนดแน่นอน  ตามขนาดของอาร์เรย์
3.ชุดปฏิบัตการของไบนารี่ทรีโดยใช้ลิ้งลิสต์มีอะไรบ้าง
ตอบInfo(p)  เป็นการส่งค่าที่เก็บอยู่ในโหนดที่  p  ชี้กลับมาให้
Left(p)  เป็นการส่งโหนดลูกด้านซ้ายของโหนดที่  p  ชี้กลับมาให้
Right(p) เป็นการส่งโหนดลูกด้านขวาของโหนดที่  p  ชี้กลับมาให้
Father(p)  เป็นการส่งโหนดพ่อของโหนดที่  p ชี้กลับมาให้
4.ชุดปฏิบัติการของลิงค์ลิสต์มีอะไรบ้าง และมีขั้นตอนการทำงานอย่างไร
ตอบ1.Node(p) ส่งโหนดที่ถูกชี้ด้วยต้วแปรพอยเตอร์ P กลับมาให้
2.Info (P) ส่งค่าในส่วนเก็บข้อมูลของโหนดที่ถูกชี้ด้วยตัวแปรพอยเตอร์ p กลับมาให้
3.Next(P) ส่งพอยเตอร์ในส่วนขอบการเชื่อมต่อโหนดที่ถูกชี้ด้วยตัวแปรพอยเตอร์ P กลับมาให้
5.จงอธิบายและแสดงลำดับขั้นตอนารเพิ่มโหนดใหม่ไว้ที่ท้ายของลิ้งค์ลิสต์
ตอบ1.สร้างโหนดใหม่โดยให้ New ชี้ไปยัง Node ใหม่ :Next(New)=Null
2.Info (New)=Data เช่นให้เท่ากับ 5
3.P= ชี้ไปยัง Node สุดท้าย
6.จงอธิบายและแสดงลำดับขั้นตอนการลบโหนดออกจากลิ้งค์ลิสต์
ตอบ1. P=first คือ P มาชี้ที่ Node แรก
2.First=Net(First) ให้ First ไปชี้ที่ Node ที่ 2
3.Free(P) ทำการลบ Node ที่ P ชี้อยู่
7.จงอธิบายลิงค์ลิสต์วงกลมมีลักษณะและการใช้งานเป็นอย่างไร
ตอบ วิธารที่ทำให้สามารถวิ่งจากโหนดหนึ่งไปยังอีกโหนดอื่น ๆ ได้ในลิ้งค์ลิสต์โดยให้ตัวชี้ของโหนดสุดท้ายชื่อในค่า Null ที่ให้ชี้กลับไปยังโหนด แรกแทน
การใช้งาน
มีการเพิ่มหัวรายการเข้ามาในตอนต้นหรือท้ายลิ้งค์ลิสต์วงกลมการวิ่งไปแต่ละโหนดจะทราบได้ว่าจุดสิ้นสุดอยู่ตรงไหนโดยใช้โหนดหัวรายการ
8.จงอธิบายลิ้งลิสต์สองทางมีลักษณะและการใช้งานเป็นอย่างไร
ตอบ เป็นลิ้งค์ลิสต์ที่มีตัวชี้สองทางทั้งซ้ายและขวา การทำงานของลิ้งค์ลิสต์อาจต้องวิ่งไปยังโหนดต่างๆ ในลิ้งค์ลิสต์โดยการถอยหลังกลับไปยังโหนดก่อนหน้าหรือลบแต่โหนด
9.จงอธิบายยลักษณะไบนารี่เสิร์ชทรีเป็นอย่างไร
ตอบ ไบนารี่เสิร์ชทรี (Binary Search Tree, BST) เป็นไบนารี่ทรีที่รวบรวมค่าของ N เรคคอร์ดซึ่งเป็นคีย์  (Key) ตั้งแต่  K1 , K2 ,…….Kn โดยแต่ละโหนด Ri  จะมี  Ki เพียงคีย์เดียวสำหรับ i=1,2,….,N คีย์เป็นค่าสร้างความแตกต่าง (Identifier)  ให้แต่ละโหนด
9.Depth-first  Order
ตอบ การวิ่งในแนวลึกก่อน
10.Binary Search  Tree
ตอบ  ไบนารี่เสิร์ชทรี

วันอังคารที่ 13 กันยายน พ.ศ. 2559

โครงสร้างข้อมูลแบบสแตก

โครงสร้างสแตก
โครงสร้างสแตกข้อมูลที่รู้จักและนำมาใช้งานชนิดหนึ่งก็คือ สแตก (Stack) มีลักษณะเป็นรายการในแนวเชิงเส้น(Linear List) รูปแบบหนึ่ง และมีข้อกำหนดให้ชุดปฏิบัติการ สามารถเพิ่มและลบรายการเพียงด้านเดียว ซึ่งเป็นด้านบนสุดของสแตก (Top of Stack)
เรียกว่าตัวชี้สแตก (Stack Pointer) มีรูปแบบเป็น (Top)(S)โดยสแตกมีการกำหนดเป็นรูปแบบดังนี้
S = [s1 ,S2, … ,ST]
ด้านบนสุดของสแตกจะอยู่ที่ Top (S) =ST และมีจำนวนสมาชิกในสแตกเท่ากับ T
ดังในรูปที่ 4.1
 
ST
…
S2
S1
รูปที่ 4.1 ตัวอย่างลักษณะสแตกที่มีสมาชิกเท่ากับ T มีตัวชี้สแตก Top
ปัญหาที่ 1  เนื่องจากคอมพิวเตอร์ทำงานในรูปแบบของเลขฐาน 2 แต่ในส่วนของผู้ใช้งานจะเป็นเลขฐาน 10 จึงต้องแปลงค่าจากเลขฐาน 10 ไปเป็นเลขฐาน 2 เช่น เปลี่ยนจาก 26 เป็น 11010
ปัญหาที่ 2  คอมไพเลอร์ (Compiler) จะต้องคำนวณนิพจน์ (Expression) ทางคณิตศาสตร์ที่มีเครี่องหมายวงเล็บเปิดและปิดเข้ามาเกี่ยวข้อง
ปัญหาที่ 3  โปรแกรมเกมเล่นไพ่ (Card Game) จะมีที่วางกองไพ่และการแจกไพ่ได้เฉพาะใบที่อยู่บนสุด
ปัญหาที่ 4  รูปแบบปัญหาการทำงานบางอย่าง  เช่น  การทำงานของ  Switching Box ของเครือข่าย หรือรูปแบบการสลับตู้รถไฟบนราง  ดังในรูปที่ 4.3
ปัญหาต่าง ๆ  เหล่านี้สามารถแก้ไขโดยใช้โครงสร้างสแตก  ซึ่งมีลักษณะการทำงานในรูปแบบที่เรียกว่าเข้าทีหลังออกก่อน(Last-In-First-Out, LIFO) เมื่อมีค่าใหม่เข้ามาก็จะใส่ลงในสแตกซ้อนทับค่าเดิมที่เก็บอยู่ลงไปอยู่ด้านล่างไปเรื่อย ๆ ในลักษณะแบบนี้
การปฏิบัติการของสแตก
จากลักษณะดังที่กล่างมาของสแตก  จะต้องมีการปฏิบัติการเข้ามาช่วยการทำงานของสแตกให้มีความถูกต้อง
1.    CreateStack( ) ใช้สร้างสแตกใหม่ขึ้นมาใช้งานและกำหนดค่าเริ่มต้นต่าง ๆ
2.    Push(value,  stack)  ใช้เพิ่มค่าใหม่เก็บลงในสแตกที่ใช้งานอยู่  มีอัลกอริทึมการทำงานเป็นดังในตารางที่ 4.1
ตารางที่ 4.1  อัลกอริทึมการเพิ่มค่าใหม่เก็บลงในสแตก
1.  ตรวจสอบสแตกว่าจะมีสมาชิกอยู่เต็มหรือไม่  โดยเปรียบเทียบค่า Top กับขนาดอาร์เรย์
2.  ถ้าสแตกไม่เต็ม
2.1  เพิ่มค่าให้กับ Top โดยการบวก 1
2.2  ทำการนำค่าที่ได้มาเก็บลงในสแตกในตำแหน่ง Top ไม่เช่นนั้นแจ้งกลับมาว่าสแตกเต็ม
3.  Pop(stack)  ใช้ดึงค่าออกจากสแตกที่ใช้งานอยู่และส่งค่า value กลับมาให้ มีอัลกอริทึมการ   ทำงานเป็นดังในตารางที่ 4.2

ตารางที่ 4.2  อัลกอริทึมดึงค่าออกจากสแตก
1.    ตรวจสอบว่าสแตกว่างหรือไม่ โดยเปรียบเทียบค่า Top กับขนาดอาร์เรย์
2.    ถ้าสแตกไม่ว่าง
2.1  ทำการดึงค่าในตำแหน่ง  Top ออกมาให้
2.2  ลดค่าของ Top โดยการลบ 1 ไม่เช่นนั้นแจ้งกลับมาว่าสแตกว่าง
3.  isEmpty(stack)  ใช้ตรวจสอบว่าสแตกที่ใช้งานอยู่ว่างหรือไม่  ถ้าไม่มีค่าเก็บไว้เลยจะส่งค่าจริงกลับให้
เมื่อนำสแตกมาใช้งานตามลำดับดังในรูป (a) ถึง (g) มีการทำงานโดยใช้ชุดปฏิบัติการ Push และ Pop ดังนี้
(a)    เริ่มต้นสร้างสแตก  S ขึ้นมาทำงานจะได้เป็นสแตกว่าง  ไม่มีสมาชิกโดยตัวชึ้สแตก Top ยังไม่มีค่า
(b)   นำค่า  A  เข้ามาเก็บเป็นตัวแรกโดยใช้  Push(A) สแตก S = [A] ตัวชี้สแตก Top = A
(c)    นำค่า  B เก็บต่อโดยใช้ Push(B) สแตก S = [A,B] ตัวชี้สแตก Top = B
(d)นำค่า C เก็บต่อโดยใช้ Push(C) สแตก S = [A,B,C]ตัวชี้สแตก Top =C
(d)   ต้องการดึงค่าออกมาโดยใช้ Pop( ) สแตก S = [A,B] ตัวชี้สแตกTop = B
(f) นำค่า D, E เก็บต่อโดยใช้ Push(D) และ Push(E) ตามลำดับ สแตก
S = [A,B,D,E] ตัวชี้สแตก Top = E
(g) ดึงค่าออกมา 3 ค่าโดยใช้ Pop( )  3  ครั้งและเก็บค่า F โดยใช้ Push(F) สแตก S = [A,F] ตัวชี้สแตก Top = F
จะเห็นว่าการทำงานของสแตกเมื่อมีค่าใดส่งเข้ามาเก็บเป็นตัวสุดท้ายก็จะอยู่บนสุด  ค่าที่ใส่ลงมาก่อนหน้านี้ก็จะถูกซ้อนทับตามลำดับ  หากมีการดึงค่าออกมาใช้ค่าที่อยู่บนสุดจะถูกดึงออกมาก่อน  ลักษณะที่ได้จึงเป็นการกลับกันของลำดับการใช้งานและเรียกว่าเข้าทีหลังออกก่อน
ตัวอย่างการใช้สแตก
จากปัญหาในตอนต้นกล่าวถึงปัญหาการเปลี่ยนเลขฐาน  10  เป็นเลขฐาน  2   เนื่องจากการคำนวณเป็นการหารเลขฐาน  10  เศษที่เหลือจะได้เป็นเลขฐาน  2  เมื่อนำมาแสดงผลจะเป็นตัวเลขจากซ้ายไปขวา  แต่เลขฐาน  2  เป็นตัวเลขจากขวาไปซ้ายจึงเกิดการสลับด้านกัน  จึงนำสแตกมาช่วยแก้ปัญหานี้  ดังในตารางที่ 4.3 คือ โปรแกรม Stack.c
เป็นการสร้างสแตกขึ้นมาโดยใช้โครงสร้างข้อมูลเรคคอร์ด   และสร้างชุดปฏิบัติการให้กับสแตกขึ้นมาสำหนับเรียกใช้งานเพื่อแก้ใขการเปลี่ยนเลขฐาน  10  เป็นเลขฐาน  2  จากค่าที่ได้รับเข้าทางคีย์บอร์ด  สแตกทีได้เป็นแบบไดนามิกคือขอใช้พื้นที่หน่วยความจำให้กับสแตกตอนที่โปรแกรมทำงาน  ทำให้มีสแตกได้หลายตัวมาใช้งานพร้อมกันโดยที่ใช้ชุดปฏิบัติการเดียวกันจากตัวอย่างจะใช้สแตกเพียวตัวเดียว
การใช้สแตกแก้ปัญหาการแปลงนิพจน์คณิตศาสตร์
คอมไพเลอร์จะแปลงคำสั่งจากภาษาระดับสูง  (High-level  Language)  ไปเป็นภาษาเครื่อง(Machine Language) ส่วนหนึ่งที่ต้องแปลงคือนิพจน์คณิตศาสตร์ เช่น X = A * B + C ซึ่งมีลักษณะที่เรียกว่า  Infix  Notation  มีเครื่องหมายคำนวณอยู่ระหว่างโอเปอแร้น (Operand) โดยแปลงไปเป็นนิพจน์แบบPostfix  Notation มีเครื่องหมายคำนวณนำหน้าโอเปอแร้น แต่เนื่องจากนิพจน์แบบ Infix มีการนำเครื่องหมายวงเล็บเข้ามาใช้ทำให้ทิศทางการคำนวณเปลี่ยนไป   ดังในตารางที่ 4.4 เป็นตัวอย่างของการคำนวณแบบเดียวกัน
ตารางที่ 4.4  ลักษณะนิพจน์แบบ Infix, Postfix, และ Prefix Notation
Infix
Postfix
Prefix
A+(B*C)
(A+B)*C
A+B-C
(A+B)*(C-D)
(A+B)*C-(D-E) ) $ (F+G)ABC*+
AB+C*
AB+C-
AB+CD-*
AB+C*DE—FG+$+A*BC
*+ABC
-+ABC
*+AB-CD
$-*+ABC-DE+FG
การแปลงนิพจน์แบบ Infix เป็นแบบ  Postfix
เมื่อพิจารณาการแปลงนิพจน์แบบ Infix เป็นแบบ Postfix เป็นขั้นตอนการแปลงโดยเริ่มต้นจากสแกนนิพจน์Infix ทีละตัว  หากพบวงเล็บก็จะทำส่วนที่อยู่ในวงเล็บให้เสร็จก่อนเป็นนิพจน์ย่อย (Subexpression) ซึ่งจะได้เป็นอัลกอริทึมดังในตารางที่ 4.5

ตารางที่ 4.5  อัลกอริทึมการแปลงนิพจน์แบบ Infix เป็นแบบ Postfix
  1. สร้างสแตกที่ว่างเปล่ายังไม่มีการเก็บค่า
  2. ถ้าค่าในนิพจน์ Infix ยังไม่หมด หรือเกิดข้อผิดพลาด ให้ทำดังนี้
a.       รับค่า  (Token) ตัวถัดไปในนิพจน์  Infix (ประกอบด้วย ค่าคงที่ ตัวแปร เครื่องหมายคำนวณ วงเล็บเปิดและปิด
b.       ค่าที่รับเข้ามา ถ้าเป็น
b.1  โอเปอแร้น (ค่าคงที่,ตัวแปร)                                  นำไปแสดงทางจอภาพ
b.2  วงเล็บเปิด                                                               ให้นำใส่ลงในสแตก (Push)
b.3  วงเล็บปิด                                                                 ดึงค่าออกจากสแตก (Pop) และนำไปแสดงทาง                      จอภาพ  ทำจนกว่าจะพบวงเล็บเปิด
b.4  เครื่องหมายคำนวณ                                                 ถ้าสแตกว่าง  หรือค่าที่รับมามี Precedence สูงกว่าค่าบนสแตกให้นำใส่ลงในสแตก (Push) ถ้าหากค่าที่รับมามี Precedence น้อยกว่าค่าบนสแตกให้ดึงค่าออกจากสแตก (Pop)
3.  เมื่อทำจนค่าในนิพจน์ Infix หมด ให้ดึงค่าออกจากสแตก (Pop) แสดงทางจอภาพตามลำดับ จนกว่าสแตกว่าง
จากอัลกอริทึมดังกล่าวเมื่อนำมาใช้กับตัวอย่างนิพจน์ 7*8-(2+3) จะได้เป็นลำดับขั้นตอนดังในรูปที่ 4.4 หรือเขียนเป็นแบบตารางได้ดังในตารางที่ 4.6

ตารางที่ 4.6 การแปลงนิพจน์ 7*8-(2+3) เป็นนิพจน์ Postfix
นิพจน์ Infix
สแตก
นิพจน์ Postfix
7*8-(2+3)
*8-(2+3)
8-(2+3)
-(2+3)
(2+3)
2+3)
+3)
3)
) 
*
–
– (
–         ( +
-7
7 8
7 8 *
7 8 *2
7 8 *2 3
/ 8 *2 3 +
7 8 * 2 3 + –
การหาค่าคำตอบจากการคำนวณนิพจน์ Postfix
จากการแปลงนิพจน์แบบ Infix เป็นแบบ Postfix ทำให้นิพจน์ที่ได้ไม่มีเครื่องหมายวงเล็บ  ต่อจากนั้นจะทำการหาค่าคำตอบโดยสแกนนิพจน์ Postfix ทีละตัวจากซ้ายไปขวา เมื่อใดที่พบโอเปอแร้นก็นำเก็บลงในสแตก  สุดท้ายคำตอบที่ได้จะอยู่ในสแตกเพียงค่าเดียวซึ่งจะได้เป็นอัลกอริทึมดังในตารางที่ 4.7
ตารางที่ 4.7  อัลกอริทึมการหาค่าคำตอบจากนิพจน์ Postfix
1.     สร้างสแตกที่ว่างเปล่ายังไม่มีการเก็บค่า
2.     ทำงานต่อไปนี้ซ้ำจนกว่าถึงจุดสิ้นสุดของนิพจน์
a.          รับค่า (Token) ตัวถัดไปในนิพจน์ RPN (ประกอยด้วย  ค่าคงที่  ตัวแปร  เครื่องหมายคำนวณ)
b.         ค่าที่รับเข้ามา  ถ้าเป็นโอเปอแร้น ให้นำใส่ลงในสแตก (Push) แต่ถ้าเป็นเครื่องหมายคำนวณให้ทำดังนี้
b.1  ดึงค่าออกจากสแตก (Pop) สองค่า ถ้าไม่ครบให้แจ้งเกิดข้อผิดพลาด
b.2  นำเครื่องหมายคำนวณทำการประมวลผลกับค่าทั้งสอง
b.3  นำผลลัพธ์ที่ได้ใส่กลับลงในสแตก (Push)
3.  เมื่อถึงจุดสิ้นสุดของนิพจน์ ค่าที่เป็นคำตอบจะอยู่บนสแตก ซึ่งมีเพียงค่าเดียวเท่านั้น
จากอัลกอริทึมดังกล่างเมื่อนำมาใช้กับตัวอย่างนิพจน์ 2 4 *9 5 + -จะเป็นตามลำดับขั้นตอนดังในรูปที่ 4.5 หรือเขียนเป็ฯแบบตารางได้ดังในตารางที่ 4.8
ตารางที่ 4.8 การหาค่าคำตอบจากนิพจน์
นิพจน์ Postfix
ค่าที่ได้
สแตก
2 4 * 9 5 + –
4 + 9 5 + –
* 9 5 + –
9 5 + –
5 + –
+ –
– 
2 * 4 = 8
9 + 5 = 14
8 – 14 = -62
2 4
8
8 9
8 9 5
8 14
-6
-6
บทที่ 4โครงสร้างข้อมูลสแตก
1.โครงสร้างข้อมูลแบบสแตกจะแบ่งออกเป็น กี่ส่วน
ก.1 ส่วน คือ ตัวชี้สแตก ( Stack Pointer )
ข.2 ส่วน คือ ตัวชี้สแตก ( Stack Pointer )และสมาชิกของสแตก ( Stack Element )
ค.3ส่วน คือ ตัวชี้สแตก ,ตัวรับค่า ,ตัวเก็บค่า
ง.4ส่วน คือ ตัวชี้สแตก ,ตัวรับค่า ,ตัวเก็บค่า และตัว output
2 “ CreateStack( ) “ มีความจำเป็นเป็นอย่างไรสำหรับสแต็ก
ก. ใช้สร้างแสต็กขึ้นมาใช้งานใหม่           ข.เพิ่มค่าใหม่ของแสต็ก
ค.ใช้ทับค่าเดิมเข้าไปแทนที่               ง.ใช้สำหรับการตรวจสอบสแต็ก
3.ปัญหาของสแตกมีกี่ข้อ
ก.1ข้อ ข.2ข้อ
ค.3ข้อ ง.4ข้อ 
4. โครงสร้างสแตกข้อมูลที่รู้จักและนำมาใช้งานชนิดหนึ่ง และมีข้อกำหนดให้ชุดปฏิบัติการ สามารถเพิ่มและ ลบข้อมูลได้กี่ด้าน และจะต้องลบข้อมูล ด้านใด
ก. 3 ด้าน คือ ด้าน ขวา
ข. 4 ด่าน คือด้าน ล่าง
ค. ด้านเดียว คือด้าน บน
ง. 2 ด้าน คือด้าน ซ้าย
5.สแตก (Stack) มีลักษณะเป็นอย่างไร?
ก. เป็นเชิงเส้น
ข. เป็นเชิงเดี่ยว
ค. เป็นสี่เหลี่ยม
ง. เป็นวงกลม
6. การทำงานของสแตกเมื่อมีค่าใดส่งเข้ามาเป็นตัวสุดท้ายจะอยู่ที่ตำแหน่งใด
ก.ล่างสุด
ข.บนสุด
ค.ตรงกลาง
ง.ด้างข้าง
7.Push(value, stack) คืออะไร
ก.ใช้เพิ่มค่าใหม่เก็บลงในสแตกที่ใช้งานอยู่
ข.ใช้สร้างสแตกใหม่
ค.ใช้เลดค่าในสแตกที่ใช้งานอยู่
ง. ถูกทุกข้อ
8.คำสั่ง CreateStack( ) และ Push(value, stack) ใช้ทำอะไร
ก.CreateStack( ) ใช้สร้างสแตกใหม่ขึ้นมาใช้งานและกำหนดค่าเริ่มต้นต่าง ๆ , Push(value, stack)ใช้เพิ่มค่าใหม่เก็บลงในสแตกที่ใช้งานอยู่
ข.CreateStack( ) ใช้เพิ่มค่าใหม่เก็บลงในสแตกที่ใช้งานอยู่ , Push(value, stack) ใช้สร้างสแตกใหม่ขึ้นมาใช้งานและกำหนดค่าเริ่มต้นต่าง ๆ
ค.CreateStack( ) ใช้สร้างสแตกใหม่ขึ้นมาใช้งานและกำหนดค่าเริ่มต้นต่าง ๆ , Push(value, stack)ใช้แก้ไขค่าที่มีอยู่เก็บลงในสแตก
ง.ผิดทุกข้อ
9. จงแปลง 26 จากฐาน 10ไปเป็นฐาน 2 เท่ากับเท่าไร
ก. 11100 ค. 10100
ข. 01010 ง. 11010
10ด้านบนสุดของสแตก เรียกว่า?
ก.Stack
ข.Linear List
ค.Stack Pointer
ง.Top of Stack

วันอาทิตย์ที่ 11 กันยายน พ.ศ. 2559

โครงสร้างข้อมูลแบบอาร์เร

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

โครงสร้างข้อมูลอาร์เรย์
อาร์เรย์เป็นโครงสร้างข้อมูลแบบหนึ่งที่ผู้ใช้ต้องกำหนดคุณสมบัติขึ้นมาก่อน  โดยที่อาร์เรย์ประกอบด้วยสมาชิกจำนวนหนึ่งที่เรียกต่อรวมกันตามลำดับที่ถูกมองเป็นตาราง สมาชิกทุกตัวจะมีชนิดข้อมูลที่เป็นแบบเดียวกัน  ในการใช้อาร์เรย์เป็นการเข้าถึงแบบสุ่ม หรือโดยตรง เป็นการอ้างไปยังแต่ละสมาชิกที่ต้องการได้โดยตรง ซึ่งมีตัวชี้ใช้อ้างไปยังแต่ละสมาชิกเรียกว่าดัชนี หรือ Subscriptและต้องเป็นเลขจำนวนเต็ม การกำหนดช่วงหรือจำนวนของสมาชิกจะใช้ขอบเขตล่าง ซึ่งมีค่าน้อยที่สุด และขอบเขตบน ซึ่งมีค่ามากที่สุดอาร์เรย์เป็นโครงสร้างข้อมูลที่คงที่ เปลี่ยนแปลงจำนวนสมาชิกไม่ได้ขณะทำงาน และเนื่องจากข้อมูลอาร์เรย์ถูกมองเป็นตารางในการใช้งาน จึงมีการกำหนดลักษณะของอาร์เรย์ออกเป็นมิติต่าง ๆ ได้ดังนี้

อาร์เรย์หนึ่งมิติ
อาร์เรย์หนึ่งมิติ (One-dimension Array) มีลักษณะที่ง่ายที่สุดเป็นตารางที่มีเพียงแถวเดียว บางครั้งก็เรียกว่าเว็กเตอร์ ดังในรูปที่ 2.1 เป็นอาร์เรย์หนึ่งมิติชื่อ Vec ที่ประกอบด้วยสมาชิก N ตัว

Vec(1)
Vec(2)
…
Vec(I)
…
Vec(N)
รูปที่ 2.1 ตัวอย่างเป็นอาร์เรย์หนึ่งมิติชื่อ Vec มีสมาชิก N ตัว

อาร์เรย์หนึ่งมิติจะมีดัชนีเพียงตัวเดียวใช้อ้างไปยังตำแหน่งของแต่ละสมาชิกในอาร์เรย์ซึ่งมีค่าเป็นลำดับ สมาชิกแต่ละตัวจะถูกแยกแยะตัวชื่ออาร์เรย์ตามด้วยดัชนีที่อยู่ในวงเล็บดังในรูป  ดังนั้น เมื่อต้องการใช้อาร์เรย์ก็เพียงแต่กำหนดชื่อและใช้ดัชนีอ้างไปยังแต่ละสมาชิก การเขียนอัลกอริทึมจึงใช้โครงสร้างควบคุมการทำงานแบบวนลูปเพื่อใช้ควบคุมสมาชิกแต่ละตัว
การกำหนดอาร์เรย์หนึ่งมิติ
การกำหนดอาร์เรย์หนึ่งมิติจะมีรูปแบบที่กำหนดไว้เป็นดังนี้
V(L:U) = { V(I) }
สำหรับ I = L,L+1,…,U-1,U ซึ่งสมาชิกแต่ละตัว V(I) จะมีโครงสร้างข้อมูล T หมายความว่าอาร์เรย์ V มีสมาชิกที่มีโครงสร้างข้อมูล T และมีดัชนีมีค่าเริ่มจาก L ไปสิ้นสุดที่ U จะได้ช่วงดัชนีจาก L ไป U เท่ากับ U-L+1 ถ้าหากให้อาร์เรย์ V(1:N) จะได้ช่วงดัชนีเท่ากับ N ในการกำหนดค่าให้กับ L อาจเป็น 0 หรือเป็นค่าติดลบได้ เช่น V(-5:5) และมีช่วงดัชนีเท่ากับ 5-(-5)+1 = 11

ตัวอย่างการใช้อาร์เรย์หนึ่งมิติ
การนอาร์เรย์หนึ่งมิติมาใช้งานทำได้หลายหลายและมักนำไปใช้ร่วมกับโครงสร้างข้อมูลชนิดอื่น ๆ ดังตัวอย่างต่อไปนี้เป็นการบันทึกอุณหภูมิแต่ละชั่วโมงภายในหนึ่งวันหรือ 24 ชั่วโมง จะเห็นว่าสมาชิกถูกจัดลำดับตามช่วงระยะเวลาของวันสมาชิกเหล่านี้เป็นชนิดเดียวกัน คือ อุณหภูมิ ดังในตารางที่ 2.1 เป็นตัวอย่างโปรแกรม Temp1.c ที่ทำการบันทึกอุณหภูมิและแสดงผล

จากโปรแกรมในตารางที่ 2.1
ผลลัพธ์ที่ได้

อาร์เรย์ที่สร้างขึ้นมาบันทึกอุณหภูมิมีชื่อว่าTemp โดยดัชนีจะมีค่าที่ขอบเขตล่างเท่ากับ 1 มีค่าที่ขอบเขตบนเท่ากับ 24 จะได้ว่า Temp(I) เป็นอุณหภูมิในช่วงโมงที่ Iโดย 1≤ I ≥ 24 และการประกาศตัวแปร Tempดังนี้
int Temp [24];
เนื่องจากต้องมีดัชนีใช้กับอาร์เรย์จึงประกาศป็นตัวแปร I ดังนี้
Int i;
การทำงานกับสมาชิกในอาร์เรย์จะใช้การวนลูปเพื่อเก็บค่า ดังนี้
rand ( time(NULL) );
for ( i = 0; i < 24; i++ )
Temp[i] = rand( ) %20+20;
เป็นการกำหนดค่าให้แต่ละสมาชิกโดยการสุ่มค่าให้ หลังจากนั้นทำการแสดงผลบนหน้าจอ ดังนี้
for ( i = 0; i < 24; i++ )
printf ( “%d”, Temp [i] );
การสร้างอาร์เรย์มาใช้งานจะมีโครงสร้างข้อมูลที่มาเกี่ยวข้อง 2 ชนิด เพื่อกำหนดให้สมาชิกในอาร์เรย์และกำหนดให้กับดัชนี นอกจากนี้การใช้ดัชนีอ้างไปยังสมาชิกเพียงบางตัวในอาร์เรย์อาจไม่จำเป็นต้องใช้การวนลูปมาช่วย

อาร์เรย์สองมิติ
อาร์เรย์สองมิติ (Tow-dimension Array) เป็นอาร์เรย์ที่สมาชิกมีโครงสร้างข้อมูลอาร์เรย์ ลักษณะเป็นตารางที่มีทั้งแถว และคอลัมน์ หรือเรียกว่าแมตทริก ดังในรูปที่ 2.1 เป็นอาร์เรย์สองมิติชื่อ Matrix ที่ประกอบด้วยสมาชิกใยแถว M ตัว แต่ละสมาชิกจะมีสมาชิกในคอลัมน์ N ตัว ก็จะได้เป็นตารางขนาด M ต่อ N
รูปที่ 2.2 ตัวอย่างอาร์เรย์สองมิติชื่อMatrix มีสมาชิก M*N ตัว
                อาร์เรย์สองมิติจะใช้ดัชนีสองตัวเพื่ออ้างไปยังตำแหน่งของแต่ละสมาชิกแยกกัน โดยดัชนีตัวแรกใช้กับสมาชิกในแถว ส่วนตัวที่สองใช้กับสมาชิกในคอลัมน์ ดังนั้นสมาชิกอาร์เรย์ Matrix(I,J) จึงอยู่ในตำแหน่งแถวที่ I ตำแหน่งคอลัมน์ที่ J อาร์เรย์ Matrix จะเรียกว่าอาร์เรย์มิติ M ต่อ N แต่ละแถวมีสมาชิกเท่ากับ N แต่ละคอลัมน์มีสมาชิกเท่ากับ M จะได้สมาชิกทั้งหมดเท่ากับ M*N
การเขียนอัลกอริทึมเพื่อใช้อาร์เรย์สองมิติจะนำโครงสร้างควบคุมการทำงานแบบวนลูปมาใช้ 2 ลูป โดยส่วนใหญ่จะให้ลูปแรกอยู่ด้านนอกใช้ควบคุมสมาชิกในแถว ส่วนลูปที่สองซ้อนอยู่ภายในลูปแรกใช้ควบคุมสมาชิกในคอลัมน์

การกำหนดอาร์เรย์สองมิติ
การกำหนดอาร์เรย์สองมิติจะมีรูปแบบคล้ายกับอาร์เรย์หนึ่งมิติ ซึ่งการกำหนดจะเป็นดังนี้
M(L1:U1,L2:U2) = { M(I,J) }
สำหรับ L1 ≤ I ≤ U1 และ L2 ≤ I ≤ U2 ซึ่งสมาชิกแต่ละตัว M(I,J) จะมีโครงสร้างข้อมูล T
อาร์เรย์ M มีสมาชิกที่มีโครงสร้างข้อมูล T มีสมาชิกในแถวเท่ากับ U2 – L2 + 1 และมีสมาชิกในคอลัมน์เท่ากับ U1 – L1 + 1ดังนั้นสมาชิกทั้งหมดจะเท่ากับ (U2 – L2 +1)*(U1 – L1 +1)
      ตัวอย่างการเก็บอุณหภูมินี้อาจสร้างอาร์เรย์สี่มิติได้โดยเพิ่มการเก็บข้อมูลในช่วงระยะเวลาหนึ่งปี การสร้างอาร์เรย์หลายมิติเริ่มมีความซับซ้อนมากขึ้นและทำความเข้าใจยากจึงนำมาใช้งานน้อย จะมีที่ใช้คือ อาร์เรย์สามมิติดังในตัวอย่างซึ่งมีลักษณะเป็นกล่อง หรือลูกบาศก์ ดังแสดงในรูป 2.3 ที่ยังทำความเข้าใจได้ เป็นอาร์เรย์สามมิติชื่อ Triangle โดยมิติแรกมีช่วงระยะเท่ากับ 2 มิติที่สองมีช่วงระยะเท่ากับ 3 และมิติที่สามมีช่วงระยะเท่ากับ 5 จะมีสมาชิกทั้งหมดเท่ากับ 30 (M*N*P)

การเก็บอาร์เรย์หนึ่งมิติในหน่วยความจำ
เมื่อพิจารณาพื้นที่ในหน่วยความจำที่จะเก็บอาร์เรย์หนึ่งมิติ เช่น อาร์เรย์ Vec ในรูปที่ 2.1 ซึ่งมีดัชนีที่ขอบเขตล่างเท่ากับ 1 ส่วนขอบเขตบนเท่ากับ N วิธีที่จะเก็บอาร์เรย์หนึ่งมิติในหน่วยความจำก็คือ ลำดับของสมาชิกในทางกายภาพ เรียงเป็นแบบเดียวกับลำดับของสมาชิกในทางตรรกะ ดังนั้น พื้นที่จัดเก็บสมาชิก Vec(I+1) จะอยู่ต่อเนื่องจากพื้นที่ จัดเก็บสมาชิก Vec(I) สำหรับ
I = 1,…,N-1 ในการคำนวณหาแอดเดรสเริ่มต้นของสมาชิก Vec(I) จำเป็นต้องทราบในเรื่องต่อไปนี้
1. ตำแหน่งแอดเดรสเริ่มต้นของพื้นที่หน่วยความจำที่จะเก็บอาร์เรย์ เรียกว่าตำแหน่งเริ่มต้น (Base Location)
2. ขนาดพื้นที่เก็บแต่ละสมาชิกของอาร์เรย์ กำหนดให้มีขนาด S ไบต์
การหาตำแหน่งแอดเดรสของสมาชิกอาร์เรย์ Vec ตัวที่ I จะได้ ดังนี้
B + (I – 1)*S
หรือกรณีที่ใช้ขอบเขตล่าง L เป็นดังนี้
B + (I – L)*S
เช่น มีอาร์เรย์ Vec(4:10) และต้องการหาตำแหน่งแอดเดรสของสมาชิก Ves(6) โดยตำแหน่งเริ่มต้นอยู่ที่แอดเดรส 2500 และแต่ละสมาชิกมีขนาด 80 ไบต์ ก็จะได้ตำแหน่งแอดเดรสอยู่ที่ 250 + (6 – 4) * 80 = 2660

การเก็บอาร์เรย์หลายมิติในหน่วยความจำ
เนื่องจากหน่วยความจำของเครื่องคอมพิวเตอร์มีลักษณะเป็นเชิงเส้น ดังนั้น อาร์เรย์หลายมิติ ตั้งแต่สองมิติขึ้นไป เมื่อนำไปจัดเก็บลงในหน่วยความจำจะต้องมีลักษณะแบบเชิงเส้นเช่นกัน
ลำดับแถวสำคัญ   (Row-Major Order) ทางเลือกหนึ่งที่นำมาใช้คือเก็บสมาชิกทุกตัวของแถวแรกก่อน จากนั้นเก็บแถวที่สอง และสามไปเรื่อย ๆ ดังในรูปที่ 2.4 คือ อาร์เรย์ Mem(1:4,1:6) ซึ่งมีลักษณะรูปแบบตารางในทางตรรกะ
รูปที่ 2.4 อาร์เรย์ Mem (4,6) แสดงเป็นตารางในทางตรรกะ
เมื่อนำไปเก็บไว้ในหน่วยความจำซึ่งมีลักษณะเชิงเส้น ลักษณะอาร์เรย์ทางกายภาพก็จะเป็นเชิงเส้นเหมือนกัน ดังในรูปที่ 2.5
รูปที่ 2.5 ลักษณะอาร์เรย์ Mem (1:4,1:6) ในลักษณะแบบลำดับแถวสำคัญ
แบบแผนการจัดเก็บแบบลำดับแถวสำคัญนำมาใช้กับอาร์เรย์ในภาษาเขียนโปรแกรมหลายภาษา เช่น ภาษาโคบอล  ภาษาปาสคาล และภาษาซี ถ้าต้องการทราบแอดเดรสเริ่มต้นของแต่ละสมาชิกในอาร์เรย์สองมิติจะมีวิธีการคำนวณ เช่นหาแอดเดรสเริ่มต้นของสมาชิก Mem(I,J) ในอาร์เรย์ Mem(L1:U1,L2:U2) จะได้ดังนี้
B + (I – L1) * (U2 – L2 + 1) *S + (J – L2) *S
สมมุติต้องการทราบแอดเดรสสมาชิก Mem(2,5) โดยตำแหน่งเริ่มต้นอาร์เรย์คือแอดเดรส 1000 และแต่ละสมาชิกในอาร์เรย์มีขนาด 8 ไบต์ ก็จะได้ 1000+(2-1)*(6-1+1)*8+(5-1)*8 = 1080
ลำดับคอลัมน์สำคัญ (Column – Major Order) เป็นอีกทางเลือกหนึ่งที่เก็บสมาชิกอาร์เรย์ในแนวเชิงเส้นโดยเก็บสมาชิกทุกตัวของคอลัมน์แรกก่อน จากนั้นเก็บคอลัมน์ที่สองและสามไปเรื่อย ๆ อาร์เรย์ Mem ในรูปที่ 2.4 เมื่อเก็บไว้ในหน่วยความจำแบบเชิงเส้นได้เป็นในรูปที่ 2.6
รูปที่ 2.6 ลักษณะอาร์เรย์ Men(4,6) ในลักษณะแบบลำดับคอลัมน์สำคัญ
                แบบแผนการจัดเก็บแบบลำดับคอลัมน์สำคัญมีการใช้ภาษาเขียนโปรแกรม  เช่น
ภาษาฟอร์แทรน ถ้าต้องการทราบแอดเดรสเริ่มต้นของแต่ละสมาชิกในอาร์เรย์สองมอตอจะมีวิธี การคำนวณหาของสมาชิก Men(I,J)จะได้ดังนี้
B + (J – L2) * (U1 – L1 + 1) *S + (I – L1) *S
ถ้าต้องการทราบแอดเดรสสมาชิก Men(2,5) แบบลำดับคอลัมน์ก็จะได้
1000+(5-1)*(4-1+1)*8+(2-1)*8 = 1136
     ตอนที่ 1 จงเลือกคำตอบที่ถูกต้องเพียงคำตอบเดียว โดยทำเครื่องหมาย X ทับตัวเลือกที่ต้องการ

1.โปรแกรมใดที่จำเป็นต้องใช้ตัวแปรอาร์เรย์
ก.โปรแกรมคำนวนหาพื้นที่รูปวงกลม
ข.โปรแกรมคำนวนหาพื้นที่รูปวงกลม 20 วง
ค.โปรแกรมหาคำนวนหาพื้นที่และเส้นรอบวงของวงกลม
ง.โปรแกรมหาพื้นที่วงกลมใดที่มีค่ามากที่สุดจาก 20 วง
2.ตัวแปร A เป็นตัวแปรแบบอาร์เรย์แล้ว กลุ่มข้อมูลใดสามารถจัดเก็บที่ตัวแปร A ได้
ก. 25,60,boy,T
ข. A,B,C,D
ค. Dog ,cat 2.50
ง.True ,Somsri ,10.25
3.จากโปรแกรมต่อไปนี้ Data มีผลลัพธ์เป็นเท่าไร
Program Test 1;
Var Data : integer
Begin
 Data : =60 ;
 Data : =20;
Writeln (Data);
End.
ก. 60
ข. 20
ค. 80
ง. 40
4.ข้อใดต่อไปนี้ที่ผู้เขียนโปรแกรมควรกำหนดเป็นตัวแปรอาร์เรย์
ก. I เก็บค่าการนับรอบของลูป
ข. Score เก็บค่าคะแนนนักศึกษา 20 คน
ค. Mean เก็บค่าคะแนนเฉลี่ยนักศึกษา 20 คน
ง. Max เก็บค่าคะแนนนักศึกษาที่มีคะแนนสูงสุดจาก 20 คน
5.ตัวแปรอาร์เรย์ต่างกับตัวแปรเดี่ยวอย่างไร
ก.ตัวแปรอาร์เรย์เก็บค่าในฮาร์ดดิสก์ตัวแปรเดี่ยวเก็บค่าใน RAM
ข.ตัวแปรอาร์เรย์เก็บค่าแบบ Numeric ตัวแปรเดี่ยวเก็บค่าแบบ String
ค.ตัวแปรอาร์เรย์เก็บค่าคงที่ ตัวแปรเดี่ยวเก็บค่าเปลี่ยนแปลงได้
ง.ตัวแปรอาร์เรย์เก็บค่าได้หลายค่า ตัวแปรข้อมูลเดี่ยวเก็บค่าได้เพียงค่าเดียว
6.ประกาศตัวแปร A:array[1..20] of integer; ตัวแปรอาร์เรย์ชุดที่ประกาศนี้สามารถเก็บค่าได้ทั้งหมดกี่ค่า
ก. 1 ค่า
ข. 19 ค่า
ค. 20 ค่า
ง. 21 ค่า
7.J : Array [1..100,1..5] of Integer; ตัวแปรอาร์เรย์ J ประกอบด้วยสมาชิกกี่ค่า
ก. 5
ข. 100
ค. 50
ง. 500

8.ข้อใดคือความหมายของโครงสร้างข้อมูลแบบอาร์เรย์
ก.กลุ่มข้อมูลที่มีค่าชนิดเดียวกัน
ข.กลุ่มข้อมูลที่เป็นตัวเลขเท่านั้น
ค.กลุ่มข้อมูลที่มีความสัมพันธ์กัน
ง.กลุ่มข้อมูลที่มีการลดความซ้ำซ้อน
9.ถ้าประกาศตัวแปรอาร์เรย์ดังนี้ Data :array [1…5] of integer ;
ข้อมูลใดไม่สามารถเก็บในอาร์เรย์ชุดนี้ได้
ก. 500   20   40   25  2.5
ข. 601    2   0   13  100
ค. 1    0   0   0  1
ง.  0    0   0   0  0
10.การประกาศตัวแปรอาร์เรย์เพื่อใช้งานต้องประกอบด้วยอะไรบ้าง
ก. ชื่ออาร์เรย์ ชนิดข้อมูล 
ข. ชื่ออาร์เรย์ ค่าสูงสุดและค่าต่ำสุด ชนิดข้อมูล 
ค. ชื่ออาร์เรย์ ค่าสูงสุดและค่าต่ำสุด มิติของอาร์เรย์ ชนิดข้อมูล 
ง. ชื่ออาร์เรย์ ค่าสูงสุดและค่าต่ำสุด มิติของอาร์เรย์ ชนิดข้อมูล จำนวนสมาชิก