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