วันเสาร์ที่ 3 กันยายน พ.ศ. 2554

คำสั่ง (Statement) และโพรซีเยอร์ (Procedure) ภาค3


การสร้างโพรซีเยอร์ทั่วไป (General Procedure)
            ถึงแม้ว่า Visual Basic จะมีชุดคำสั่งและฟังก์ชันมาตรฐานอยู่มากมายแต่ก็ยังไม่สามารถครอบคลุมการทำงานได้ทั้งหมด เราสามารถสร้างซับรูทีนหรือฟังก์ชันขึ้นมาใช้งานเองได้ ซึ่งแยกออกได้ 2 แบบใหญ่ ๆ คือ 
  • ซับรูทีน (Sub routine) มีลักษณะเหมือนกับคำสั่งมาตรฐานใน Visual Basic กล่าวคือ เป็นชุดคำสั่งที่ไม่มีการส่งค่ากลับ 
  • ฟังก์ชัน (Function) มีลักษณะเช่นเดียวกับฟังก์ชันมาตรฐานใน Visual Basic ซึ่งจะส่งค่ากลับออกมา 1 ค่าเสมอ
การสร้างซับรูทีน (Sub routine)
ซับรูทีนจะต้องขึ้นต้นด้วย Sub ตามด้วยชื่อของซับรูทีนนั้น ซึ่งมีโครงสร้างทั่วไป ดังนี้

[Private | Public] [Static] Sub name [(arglist  )]
[statements ]
[Exit Sub]
[statements ]
End Sub

คำสงวน Private หมายถึง กำหนดให้ซับรูทีนที่สร้างขึ้นมามีขอบเขตในการเรียกใช้งานเฉพาะฟอร์มหรือโมดูลที่ประกาศเท่านั้น
คำสงวน Public หมายถึง กำหนดให้ซับรูทีนที่สร้างขึ้นมาสามารถถูกเรียกใช้งานได้ทุกส่วน
คำสงวน Static หมายถึง กำหนดให้ซับรูทีนเก็บรักษาค่าที่ได้จากการประมวลผลไว้ เมื่อมีการเรียกใช้งานซับรูทีนครั้งต่อๆ ไป ค่าดังกล่าวจะมีค่าเท่าเดิม
คำสั่ง Sub หมายถึง ต้องการสร้างโพรซีเยอร์ทั่วๆ ไปแบบซับรูทีน
ตัวแปร name หมายถึง ชื่อของซับรูทีน
ตัวแปร arglist หมายถึง อาร์กิวเมนต์ที่ต้องใช้ในซับรูทีน ซึ่งจะมีหรือไม่มีก็ได้
ตัวแปร statements หมายถึง ชุดคำสั่งต่างๆ ในซับรูทีน
คำสั่ง Exit Sub หมายถึง บังคับให้ออกจากซับรูทีนนี้ทันที
คำสั่ง End Sub หมายถึง จบโพรซีเยอร์

ตัวอย่างนี้เป็นการตรวจสอบตัวเลขที่น้อยที่สุดใน Text1 และ Text2 โดยการเรียกใช้ซับรูทีน smallest

'ซับรูทีนนี้ต้องการอาร์กิวเมนต์ 2 ตัว คือ a และ b ซึ่งในตัวอย่างนี้ค่าใน Text1 และ Text 2 จะผ่านค่า
มาให้อาร์กิวเมนต์  2 ตัวนี้ตามลำดับ
Sub smallest(a As Integer, b As Integer)
Dim min As Integer
If a < b Then   ‘ถ้าค่าใน Text1 < Text 2
min = a
MsgBox "a is smaller  (a = " & Str(min) & ")"
ElseIf (a > b) Then  ‘ถ้าค่าใน Text1 > Text 2
min = b
MsgBox "b is smaller (b = " & Str(min) & ")"
Else
ถ้าค่าใน Text1 = Text 2
min = a
MsgBox "Both values are equal (a,b = " & Str(min) & ")"
End If
'เรียกใช้  
Private Sub Command1_Click()  
Dim x As Integer, y As Integer
x = Val(Text1.Text)
y = Val(Text2.Text)
Call smallest(x, y)  ‘เรียกใช้งานซับรูทีน smallest โดยใช้คำสั่ง Call
End Sub

การสร้างฟังก์ชัน (Function)
ฟังก์ชันจะต้องขึ้นต้นด้วย Function ตามด้วยชื่อของฟังก์ชันนั้น ฟังก์ชันเป็นโพรซีเยอร์ชนิดที่มีการคืนค่ากลับมาซึ่งต่างจากซับรูทีนที่ไม่มีการคืนค่า ฟังก์ชันมีโครงสร้างทั่วไป ดังนี้
[Public | Private] [Static] Function name [(arglist  )] As type
[statements ]
[Exit Function]
[statements ]
End Function
 
คำสงวน Private หมายถึง กำหนดให้ฟังก์ชันที่สร้างขึ้นมามีขอบเขตในการเรียกใช้งานเฉพาะฟอร์มหรือโมดูลที่ประกาศเท่านั้น
คำสงวน Public หมายถึงกำหนดให้ฟังก์ชันที่สร้างขึ้นมาสามารถถูกเรียกใช้งานได้ทุกส่วน
คำสงวน Static หมายถึง กำหนดให้ฟังก์ชันเก็บรักษาค่าที่ได้จากการประมวลผลไว้ เมื่อมีการเรียกใช้งานฟังก์ชันครั้งต่อๆ ไป ค่าดังกล่าวจะมีค่าเท่าเดิม
คำสั่ง Sub หมายถึง ต้องการสร้างโพรซีเยอร์ทั่วๆ ไป แบบฟังก์ชัน
ตัวแปร name หมายถึง ชื่อของฟังก์ชัน
ตัวแปร arglist หมายถึง อาร์กิวเมนต์ที่ต้องใช้ในฟังก์ชัน ซึ่งจะมีหรือไม่มีก็ได้
ตัวแปร As type หมายถึง ฟังก์ชันนี้ จะส่งข้อมูลชนิดใดกลับมา เช่น Integer, Long, Single เป็นต้น
ตัวแปร statements หมายถึง ชุดคำสั่งต่างๆ ในฟังก์ชัน
คำสั่ง Exit Function หมายถึง บังคับให้ออกจากฟังก์ชันนี้ทันที
คำสั่ง End Function หมายถึง จบโพรซีเยอร์

ต่อไปนี้เป็นตัวอย่างฟังก์ชันที่ชื่อว่า AddNum มีหน้าที่สำหรับบวกตัวเลข ต้องการอาร์กิวเมนต์ 2 ตัว โดยคืนค่ากลับเป็นข้อมูลชนิด Integer

Option Explicit
Function AddNum(x As Integer, y As Integer) As Integer
Dim z As Integer 'สำหรับรับค่าที่ได้จากการบวก
z = x + y 'นำอาร์กิวเมนต์ที่เข้ามา 2 ตัวบวกกัน แล้วเก็บไว้ที่ตัวแปร z
AddNum = z 'ถ่ายทอดค่าที่ได้ ไปยังฟังก์ชัน AddNum
End Function 'จบฟังก์ชันแล้วส่งค่ากลับ (ชนิดข้อมูลแบบ Integer) ไปยังโพรซีเยอร์ ที่เรียกใช้งานฟังก์ชันนี้

Private Sub Form_Activate()
Print AddNum(10, 20) 'แสดงผลลัพธ์ออกที่ฟอร์ม โดยเรียกใช้งานฟังก์ชัน AddNum และส่งอาร์กิวเมนต์เข้าไป 2 ตัว คือ 10 และ 20
End Sub

ตัวอย่างฟังก์ชัน (ข้อสอบวิชา Visual Basic)

จงแก้สร้างฟังก์ชันสำหรับแก้ปัญหานี้
1.       สร้างฟังก์ชันสำหรับการหาค่า factorial
2.       สร้างฟังก์ชันสำหรับการประมาณค่า sin(x) โดยกำหนดให้ฟังก์ชัน
แล้วเปรียบเทียบกับฟังก์ชันมาตรฐาน  Sin(Rad) และสังเกตุว่า n ที่น้อยที่สุดที่ทำให้การประมาณ sin(x) ใกล้กับ Sin(Rad) มีค่าเท่าใด



เฉลยตัวอย่างฟังก์ชัน


1.       สร้างฟังก์ชันสำหรับการหาค่า factorial


Option Explicit
Function Factorial(n As Integer) As Long
Dim i As Integer
If n < 1 Then
MsgBox (“Error – Please try again”)
Else
Factorial = 1
For i =1 to n
Factorial = Factorial * i
Next i
End If
End Function

Private Sub Command1_Click()
Dim n As Integer, nFact As Long
N = Val(Text1.Text)
nFact = Factorial(n)
Text2.Text = Str(nfact)
End Sub



2.       สร้างฟังก์ชันสำหรับการประมาณค่า sin(x)



สร้างฟังก์ชัน Factorial
Function Factorial(n As Integer) As Long
Dim i As Integer
If n < 1 Then
Beep
MsgBox (“Error – Please try again”)
Else
Factorial = 1
For i =1 to n
Factorial = Factorial * i
Next i
End If
End Function

Private Sub Command1_Click()
Const Pi As Single = 3.1415927
Dim i As Integer, n As Integer
Dim Angle As Single, Rad As Single, Approx  As Single, Exact As Single
Dim Sum As Single, C As Single
Angle  = Val(Text1.Text)
Rad = 2 * Pi * Angle / 360   ‘เปลี่ยนจากองศาเป็นเรเดียน
n = Val(Text2.Text)
Sum = 0
C = 1
For i = 1 To n
Sum = Sum + C * Rad ^ (2 *  i – 1) / Factorial(2 * i – 1) 
C = -C  ‘กลับค่าสำหรับลำดับถัดไป
Next i
Approx = Sum
Exact = Sin(Rad)
Text3.Text = Str(Approx)
Text4.Text = Str(Exact)
End Sub



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

1 ความคิดเห็น: