Array & Structure Variable
Download
Report
Transcript Array & Structure Variable
Chapter 7
โครงสร้ างข้ อมูลใน Visual Basic
รู ปแบบของโครงสร้างข้อมูลที่มีให้ใช้งานใน VB
Array
Structure
ArrayList
Array : อาร์เรย์เก็บข้อมูลเป็ นชุดที่มีชนิดเดียวกัน
ตัวแปรทัว่ ไป 1 ตัวแปรจะเก็บข้อมูล 1 ข้อมูล
ถ้าจาเป็ นต้องเก็บข้อมูลชนิ ดเดียวกันไว้เป็ นชุด ๆ ในตัวแปรชื่อเดียวกันก็
ต้องใช้ตวั แปรที่ชื่อว่า “อาร์เรย์” ในการเก็บ
ตัวอย่างเช่นเก็บชื่อนักศึกษา ของแต่ละห้อง เก็บคะแนนสอบของนักศึกษา
แต่ละคน เป็ นต้น
รู ปแบบการประกาศ
Dim ArrayName(MaxIndex) As TypeOfArray
ชื่อของอาร์ เรย์ มีหลักการตั้งชื่อเหมือนตัวแปร
MaxIndex อินเด็กซ์สูงสุ ดของอาร์ เรย์ โดยอินเด็กซ์ต่าสุ ดจะเป็ น 0 เสมอ
TypeOfArray ชนิ ดข้อมูลที่เก็บในอาร์ เรย์
ArrayName
ตัวอย่างการประกาศตัวแปรอาร์เรย์
Dim A As Integer การประกาศตัวแปรทัว่ ๆ ไป
Dim MyArray(3) As String
Dim Fruit() As String ={“banana”,”apple”,”papaya”}
อินเด็กซ์ คือการอ้างอิงถึงข้อมูลที่เก็บอยูภ่ ายในอาร์เรย์ โดยเริ่ มจาก
ไปจนถึง n ดังนั้น ขนาดของอาร์เรย์กค็ ือ n+1
Myarray(3)
Fruit(2)
“Boom”
“Ying”
0
1
“banana”
“apple”
0
1
“Dang”
“Thong”
2
3
“papaya”
2
0
ขึ้น
ขนาดและมิติของอาร์เรย์
ปกติการระบุขนาดของอาร์เรย์จะกาหนดไว้ตอนประกาศตัวแปร โดยขนาด
จะเป็ นจานวนข้อมูลที่เก็บได้ภายในอาร์เรย์
ลักษณะการเก็บข้อมูลเรี ยกว่า มิติของอาร์ เรย์ (Array Dimension) เช่น
อาร์เรย์ 2 มิติ อาร์เรย์ 3 มิติ เป็ นต้น
ดังนั้นการอ้างอิงข้อมูลที่มีมากกว่า 1 มิติ ดังตัวอย่างต่อไปนี้
Dim Name(4) As String
อาร์เรย์ 1 มิตขิ นาด 1x5 เก็บข้อความได้
Dim IntMetrix(9,9) As Integer
5 ข้อความ
อาร์เรย์ 2 มิตขิ นาด 10x10 เก็บจานวนเต็ม
Dim xQube(2,4,3) As Single
อาร์ได้เรย์1003 จมิานวน
ตขิ นาด 3x5x4 เก็บจานวนเต็ม
Dim inTable(,) As Integer = {{1,2,3},{5,6,7}}
อาร์เรย์ 2 มิติ
ได้ 60 จานวน
Dim yQube(,,) As Integer = {{{1,2},{3,4}},{{5,6},{7,8}},{{9,10},{11,12}}}
ขนาด 2x3
อาร์เรย์ 3 มิตขิ นาด
2x2x3
ขนาดและมิติของอาร์เรย์
Dim inTable(,) As Integer = {{1,2,3},{5,6,7}}
column0
column1
column2
Row 0
1
2
3
Row 1
5
6
7
Dim yQube(,,) As Integer = {{{1,2},{3,4}},{{5,6},{7,8}},{{9,10},{11,12}}}
1 22
1
1 32 4
33 44
9 10
1 2
3 4
5 6
7 8
11 12
การทางานกับอาร์ เรย์
หลังจากการประกาศตัวแปรอาร์เรย์แล้ว การอ่านและกาหนดค่าให้กบั
สมาชิกในอาร์เรย์ ทาโดยพิมพ์ชื่อตัวแปรอาร์เรย์ ตามด้วยค่า Index ที่
อยูภ่ ายในวงเล็บ ซึ่งจะเป็ นจานวนเต็มเท่านั้น
ตัวอย่างการเก็บค่าสมาชิกของตัวแปรอาร์ เรย์
Dim Stock(6) as integer
Stock(3) = 50
0
1
2
50
3
4
5
6
คาสัง่ For Each เพื่ออ้างอิงสมาชิกในอาร์เรย์
For Each Element In ArrayName
คาสัง่
Next
โดยที่
Element ชื่อของตัวแปรที่นาค่าจากอาร์เรย์มาเก็บจะต้องตรงกับ
ชนิดข้อมูลของอาร์เรย์
ArrayName ชื่อของอาร์เรย์
ตัวอย่างการใช้คาสัง่ For…Each
Dim intarray() As Integer = {2, 4, 6, 8, 10, 12}
Dim strarray(3) As String
strarray(0) = "Thailand"
strarray(1) = "Japan"
strarray(2) = "Hongkong"
strarray(3) = "Malaysia"
Dim strout As String = ""
Dim itemp As Integer, idx As Integer = 0
For Each itemp In intarray
strout &= "intarray(" & idx.ToString & ")=" + itemp.ToString & vbCrLf
idx += 1
Next
MessageBox.Show(strout, "อารเรย
์ ์ intarray")
strout = ""
idx = 0
Dim stemp As String
For Each stemp In strarray
strout &= "strarray(" & idx.ToString & ") = " & stemp & vbCrLf
idx += 1
Next
MessageBox.Show(strout, "อารเรย
์ ์ strarray")
ตัวอย่างการทางานอาร์เรย์ 1 มิติ
Public Class Form1
Dim i As Integer
Dim MyarrayI(4) As Integer
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
For i = 0 To 4
MyarrayI(i) = InputBox("ป้ อนตัวเลขตัวที่ " & i, "ป้ อนข้อมูลเก็บในอาร์เรย์")
Next
For i = 0 To 4
TextBox1.Text &= MyarrayI(i) & vbCrLf
Next
End Sub
End Class
ตัวอย่างการทางานอาร์เรย์ 1 มิติ
ผลรัน
แบบฝึ กหัด
เขียนโปรแกรมเพิ่มให้มีหน้าต่างดังภาพ
ตัวอย่างการทางานของอาร์เรย์ 2 มิติ (แบบที่ 1)
getlength(0) เป็ นการหาอินเด็กซสู
์ งสุด
Dim intarray(3, 4) As Integer
Dim strout As String = ""
ของมิตท
ิ ี่ 1
strout &= "สมาชิกในอารเรย
ิ ี่ 1 = " & intarray.GetLength(0).ToString & vbCrLf
์ มิ
์ ตท
strout &= "สมาชิกในอารเรย
ิ ี่ 2 = " & intarray.GetLength(1).ToString & vbCrLf
์ มิ
์ ตท
strout &= "-----------------" & vbCrLf
getlength(1) เป็ นการหาอินเด็กซสู
์ งสุด
Dim x, y As Integer
For y = intarray.GetLowerBound(1) To intarray.GetUpperBound(1)
ของมิตท
ิ ี่ 2
For x = intarray.GetLowerBound(0) To intarray.GetUpperBound(0)
intarray(x, y) = Int(10 * Rnd())
strout &= "intarray(" & x.ToString & "," & y.ToString & ") = " & intarray(x, y).ToString
strout &= vbTab
Next
strout &= vbCrLf
Next
MessageBox.Show(strout, "แสดงคาอารเรย
่
์ 2 มิต"ิ )
ตัวอย่างการทางานของอาร์เรย์ 2 มิติ (แบบที่ 2)
Dim intarray(3, 4) As Integer
Dim strout As String = ""
strout &= "สมาชิกในอาร์เรย์มิติที่ 1 = " & intarray.GetLength(0).ToString & vbCrLf
strout &= "สมาชิกในอาร์เรย์มิติที่ 2 = " & intarray.GetLength(1).ToString & vbCrLf
strout &= "-----------------" & vbCrLf
Dim x, y As Integer
For y = intarray.GetLowerBound(0) To intarray.GetUpperBound(0)
For x = intarray.GetLowerBound(1) To intarray.GetUpperBound(1)
intarray(y, x) = Int(10 * Rnd())
strout &= "intarray(" & y.ToString & "," & x.ToString & ") = " &
intarray(y, x).ToString
strout &= vbTab
Next
strout &= vbCrLf
Next
RichTextBox1.Text = "แสดงค่าอารเรย์ 2 มิติ" & vbCrLf & strout
ตัวอย่างการทางานของอาร์เรย์ 2 มิติ (แบบที่ 2)
ผลรันของโค้ด
เมธอดที่สาคัญสาหรับการจัดการอาร์เรย์
หาจานวนสมาชิกในอาร์เรย์ โดยต้องระบุพารามิเตอร์ของ
มิติที่ของอาร์เรย์ (มิติที่ 1 ระบุเป็ น 0, มิติที่ 2 ระบุเป็ น 1 เช่นนี้เรื่ อยไป)
GetLowerBound หาขอบเขตล่างของอาร์ เรย์ คือ อินเด็กซ์ตวั ที่
น้อยทีสุดของอาร์เรย์ ซึ่งจะต้องระบุพารามิเตอร์เป็ นมิติที่ของอาร์เรย์
เหมือนเมธอด GetLength
GetUpperBound หาขอบเขตบนของอาร์เรย์ คืออินเด็กซ์ตวั ที่มาก
ที่สุดของอาร์เรย์ โดยต้องระบุพารามิเตอร์เป็ นมิติที่ของอาร์ เรย์เหมือน
เมธอด GetLength
GetLength
แบบฝึ กหัด
จงเขียนโค้ดประกาศตัวแปรอาร์เรย์ต่อไปนี้
สายพันธุ์สุนขั ในฟาร์ม จานวน 50 ตัว
ส่ วนสู งของนักเรี ยนจานวน 25 คน
เก็บชื่อสัปดาห์ โดยระบุค่าด้วย
เก็บปริ มาณน้ าฝนในแต่ละสัปดาห์
จงเขียนโค้ดในการเก็บข้อมูลจานวนเต็มตั้งแต่ 1-12 ลงในตัวแปรอาร์ เรย์ 12
สมาชิก แล้วหาผลรวมของค่าทั้งหมดในอาร์ เรย์แสดงออกทางไดอะล็อกบ็อกซ์
เขียนโค้ดเก็บคะแนนสอบของนักเรี ยน 5 คน ชื่อตัวแปร ExamData โดย
นักเรี ยนจะสอบ 4 วิชา แต่ละวิชามีการสอบ 3 ครั้ง (คะแนนเป็ นจานวนเต็ม)
พร้อมกับแสดงผลรวมของการสอบทั้ง 3 ครั้งของแต่ละวิชาด้วย
แบบฝึ กหัด
จงเขียนโค้ดคานวนค่าของเมตริ กซ์ขนาด 4x4
จงเขียนโปรแกรมอ่านข้อมูล รหัส, ชื่อ, ชัว่ โมงการทางานต่อวัน จานวน 15 คน ,
อัตราค่าแรงต่อวัน(6 ชม.)ของพนักงาน 100 บาท หากเกินคิดเป็ นค่าล่วงเวลาจาก
ค่าแรง 2 เท่า และแสดงผลจากการคานวณหาเงินที่ได้รับต่อคน
ตัวอย่าง output
รหัส
ชม.ทางาน
คาแรง
่
111 สุ รพ ล
112 จันทนา
113 อรวรรณ
114 นนนที
ชือ
่
8
6
9
12
300
100
400
700
Dynamic Array
กรณี ไม่สามารถบอกขนาดอาร์ เรย์ได้อย่างชัดเจน หรื อประกาศอาร์ เรย์ขนาดใหญ่แต่
ใช้ไม่หมด หรื อประกาศอาร์ เรย์ขนาดใหญ่ไว้ที่ตน้ โปรแกรมแต่ไม่ถกู ใช้งานทันที ทา
ให้สิ้นเปลืองทรัพยากรของระบบไปมาก
การแก้ไขปั ญหาข้างต้นด้วย ไดนามิกอาร์เรย์ แนวคิดคือพร้อมให้ผใู้ ช้งานปรับขนาด
ได้ตามต้องการโดยการเขียนโปรแกรมให้มีการปรับขนาดอาร์ เรย์ให้เหมาะสมกับการ
ใช้งานดังรู ปแบบ
Dim DynamicArrayName() As TypeOfArray
DynamicArrayName - ชื่อของไดนามิกอาร์ เรย์ประกาศโดยไม่ตอ้ งบอกขนาดและไม่ตอ้ งกาหนดค่า
TypeOfArray - ชนิ ดข้อมูลที่เก็บในไดนามิกอาร์ เรย์
การปรับขนาดไดนามิกอาร์ เรย์จะใช้คาสั่ง
Redim DynamicArrayName() As SizeOfArray
ตัวอย่างการทางานของ Dynamic Array
Dim mydynamic() As Integer
Dim i, size As Integer
Dim strout As String = ""
size = InputBox("Input Array Boundary 1 Dimensional", "Dynamic Array")
If IsNumeric(size) And (CInt(size) > 0 And (CInt(size) < 100)) Then
ReDim mydynamic(CInt(size) - 1)
For i = 0 To mydynamic.GetUpperBound(0)
mydynamic(i) = Int(10 * Rnd())
strout &= "My Dynamic(" & i.ToString & ") = " & mydynamic(i).ToString & vbCrLf
Next
MessageBox.Show(strout, "Dynamic Array")
Else
MessageBox.Show("Please Input Array size (1-99) to Resize Dynamic Array", "Error")
End If
ผลการทางาน Dynamic Array
การทางานปกติ
Error หากกรอกค่าไม่ถูก
ข้อมูลชนิด Structure
แม้อาร์เรย์สามารถเก็บข้อมูลเป็ นชุดแล้วแต่ยงั มีขอ้ จากัดคือข้อมูลที่เก็บใน
อาร์เรย์ตอ้ งเป็ นชนิดเดียวกัน
ดังนั้นจึงมีขอ้ มูลแบบ Structure ที่สามารถเก็บข้อมูลเป็ นชุดแต่ละชุด
สามารถเก็บข้อมูลได้หลายชนิดไว้ดว้ ยกัน
name
MyStruct
“Boom”
age
20
married
False
สามารถประการตัวแปรตามตัวอย่างได้ดงั นี้
Dim aStruct As MyStruct
aStruct.name = “Boom”
aStruct.age = 20
aStruct.married = False
ข้อมูลชนิด Structure
การประกาศข้อมูล
Structure
Structure Structname
Var_1 As typeOfVar1
Var_2 As typeOfVar2
Var_3 As typeOfVar3
:
Var_n As typeOfVar_n
End Structure
โดยที่
คือชื่อ Structure
var_1 ถึง var_n คือ ชื่ อของตัวแปรตั้งแต่ตวั ที่ 1 ถึงตัวที่ n ที่อยูใ่ น Structure
typeOfVar คือ ชนิ ดข้อมูลสาหรับตัวแปรแต่ละตัวที่อยูใ่ น Structure โดยมีขอ้ แม้วา่ ชนิ ดข้อมูลนั้นต้องเป็ น
Value Type เท่านั้น
Structname
ตัวอย่างการเก็บข้อมูลแบบ Structure
Public Class Form1
Structure myStu
Dim name As String
Dim age As Integer
Dim club As Boolean
End Structure
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim myRec As myStu
myRec.name = TextBox1.Text
myRec.age = NumericUpDown1.Value
myRec.club = CheckBox1.Checked
Dim strOut As String = ""
strOut &= "MyRec.name = " & myRec.name & vbCrLf
strOut &= "MyRec.age = " & myRec.age & vbCrLf
strOut &= "MyRec.club = " & myRec.club & vbCrLf
MessageBox.Show(strOut, "ขอมู
้ ลใน Structure")
End Sub
End Class
แบบฝึ กหัด
เขียนโค้ดเก็บข้อมูลนักศึกษา ได้แก่ รหัส, ชื่อ-สกุล, อายุ, เพศ
เขียนโค้ดเก็บข้อมูลวิชาเรี ยน ได้แก่ รหัส , ชื่อวิชา , หน่วยกิต ,ตอนเรี ยน
การใช้งาน ArrayList
การใช้งานตัวแปรแบบ Structure จะเก็บข้อมูลได้หลายชนิดแต่กเ็ ก็บได้
เพียงชุดเดียว ถ้าต้องการเก็บข้อมูลได้หลาย ๆ ชุดต้องอาศัยโครงสร้างข้อมูล
ที่เรี ยกว่า ArrayList มาช่วย ซึ่งแนวคิดก็คือ อาร์เรย์ของ Structure
นัน่ เอง
name
0
1
2
3
age
married
“Boom”
20
False
“Fin”
27
False
“Donut”
24
True
“Thong”
36
True
รู ปแบบการประกาศใช้งาน
Dim ArLsName As ArrayList();
การใช้งาน ArrayList
การเก็บข้อมูลในอาร์เรย์ลิสต์ เหมือนกับอาร์เรย์ทวั่ ไป คือมีอินเด็กซ์เริ่ มจาก
0,1,2 เช่นนี้ ไปเรื่ อย ๆ
จึงสามารถใช้ foreach ในการวนซ้ าไปยังสมาชิกต่าง ๆ ของ ArrayList ได้
เหมือนกับอาร์เรย์ทวั่ ไป
พร็ อพเพอร์ ต้ ีและเมธอดที่สาคัญ ที่ใช้เพิ่มข้อมูลเข้าไปโดยจะต่อท้ายข้อมูล
ล่าสุ ดใน ArrayList
เป็ นเมธอดที่ใช้ลบข้อมูลออกจาก ArrayList โดยจะต้องระบุอินเด็กซ์
ว่า ลบข้อมูลตัวใด และในกรณี ที่ขอ้ มูลที่ถกู ลบไม่ใช่อินเด็กซ์ตวั สุ ดท้ายของ
ArrayList มันจะขยับปรับลาดับของอินเด็กซ์ใน ArrayList ใหม่
Capacity เป็ นพร็ อพเพอร์ ต้ ีที่แสดงจานวนสมาชิ กที่มีได้ใน ArrayList
RemoveAt
การใช้งาน ArrayList (ต่อ)
พร็ อพเพอร์ต้ ีและเมธอดที่สาคัญ ที่ใช้เพิ่มข้อมูลเข้าไปโดยจะต่อท้ายข้อมูล
ล่าสุ ดใน ArrayList
เป็ นพร็ อพเพอร์ ต้ ีที่แสดงจานวนสมาชิกที่มีอยูข่ อง ArrayList ณ ขณะนั้น
เป็ นการเรี ยงลาดับสมาชิกใน ArrayList
Count
Sort
ตัวอย่างการทางานในแบบ ArrayList
Public Class Form1
Structure MyRec
Dim name As String
Dim phone As String
Dim email As String
End Structure
Private MyRecords As New ArrayList
Private Sub Button_Add_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But
If TextBox1.Text = "" Or TextBox2.Text = "" Or TextBox3.Text = "" Then
MessageBox.Show("กรุณาเติมขอมู
้ ลให้ครบ", "Error")
Exit Sub
End If
Dim inputRec As MyRec
inputRec.name = TextBox1.Text
inputRec.phone = TextBox2.Text
inputRec.email = TextBox3.Text
Dim strIn As String
With inputRec 'ใช้คาสั่ ง With ช่วยในการเขียนโคดให
้
้สั้ นลง
strIn = .name & ":" & .phone & " : " & .email
End With
MyRecords.Add(inputRec) 'ใส่ข้อมูลเข้าไปใน ArrayList
ListBox1.Items.Add(strIn) 'เพิม
่ ขอมู
้ ลแสดงใน ListBox
TextBox1.Clear()
TextBox2.Clear()
TextBox3.Clear()
End Sub
ตัวอย่างการทางานในแบบ ArrayList
Private Sub Button_Del_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
If ListBox1.SelectedIndex = -1 Then
MessageBox.Show("เลือกรายการเพือ
่ ลบ หรือ ไมมี
่ รายการให้ลบแลว",
้ "Error")
Else
MyRecords.RemoveAt(ListBox1.SelectedIndex) 'ลบขอมู
้ ลอกจาก ArrayList
ListBox1.Items.RemoveAt(ListBox1.SelectedIndex) 'ลบขอมู
้ ลจากControl > ListBox
End If
End Sub
End Class