แปลงฐานเลข (ตั้งแต่ฐาน 2 ถึง ฐาน 16)

Last update: March 25, 2012
Visual Basic 6.0

เมื่อวันที่ 20 พฤษภาคม พ.ศ. 2554 ทีมงานฝ่ายพัฒนาภาษาวิชวล เบสิก( visual basic) ของบริษัทไมโครซอฟต์ได้ฉลองวันเกิดครบ 20 ปี ของภาษาวิชวล เบสิก ได้ประกาศการเฉลิมฉลองไว้ในเว็บไซต์ msdn.com
         เพื่อร่วมรำลึกครบรอบ 20 ปีของ visual basic ผู้เขียนจึงไปค้นโปรแกรมเก่า ๆ ที่เขียนเป็นภาษาเบสิกในยุคนั้นมารื้อฟื้น พบว่าโปรแกรมแปลงฐานเลขตั้งแต่ฐาน 2 ถึง 16 ยังคงใช้งานได้ดี เป็นโปรแกรมที่เขียนด้วย Mbasic (ย่อมาจาก Microsoft basic เป็นภาษาเบสิกที่ต้องใช้หมายเลขกำกับบรรทัดคำสั่งของแต่ละบรรทัด ) ในอดีตได้เคยจัดทำเป็นบทความไปลงในวารสารไมโครคอมพิวเตอร์ ฉบับที่ 23  ประจำเดือนพฤษภาคม พ.ศ. 2529  สามารถdownload source code ได้จากที่นี่ ผู้เขียนจะนำโปรแกรมนี้มาปรับปรุงใหม่เขียนด้วย visual basic 6.0
                ก่อนอื่นจะทดสอบโปรแกรมที่เขียนด้วย Mbasic โดยให้ทำงานใน Quick basic จะได้หน้าตาของโปรแกรมดังรูปที่ 1  สำหรับผู้ที่ใช้วินโดว์ 7 64 bit ต้องไป download QB64( www.qb64.net)  ซึ่งเป็น Quick basic ทำงานได้ในระบบปฏิบัติการวินโดว์ 7 มาติดตั้งเสียก่อน
รูปที่ 1 โปรแกรแปลงฐานเลข ทำงานใน Dos mode โดยใช้ Quick basic
       

หลักการการแปลงฐานเลข

            

    โปรแกรมนี้ถูกเขียนขึ้นมาโดยอาศัยหลักการดังนี้ “เมื่อ x เป็นตัวเลขในฐานใด ๆ สมมติให้เป็น base1 ต้องการเปลี่ยนให้เป็นเลขในอีกฐานหนึ่ง สมมติให้เป็น base2 ทำได้โดยการเปลี่ยนค่า x ในเลขฐาน base1 ให้เป็นเลขฐาน 10 แล้วจึงเปลี่ยนเลขฐานสิบให้เป็นเลขฐาน base2 อีกทีหนึ่ง”
                การเปลี่ยนเลขฐานใด ๆ (base1) ให้เป็นเลขฐาน 10 (dec Decimal base) ทำได้ดังนี้

 

  ..........................….(1)
เมื่อ  L คือจำนวนหลักของตัวเลข  
  Vn คือ ตัวเลขในหลักที่ n  
  base1 คือฐานเลขที่เราต้องการเปลี่ยน  

     

ตัวอย่าง 

(2017) ฐาน 8  มีรูปแบบในดในเลขฐานสิบ

2017 มีจำนวนหลัก 4 หลัก (L =4)  หลักที่ 1 (v1) คือ 2  หลักที่ 2 (v2) คือ 0 หลักที่ 3 (v3) คือ 1 หลักที่ 4 (v4) คือ 7  base1 คือ 8 (เลขฐาน 8)  แทนค่าต่าง ๆ ลงในสูตรที่ 1

 

  .
  dec = 1024 + 0 + 8 + 7  
  dec  =1039  ฐาน สิบ  
     

    

เมื่อต้องการเปลี่ยนเลขฐานสิบให้เป็นเลขฐานอื่น (base2) ทำได้ดังสูตรที่  (2) ดังนี้
“ให้นำเลขฐานสิบเป็นตัวตั้งแล้วหารด้วย base2 หารได้เท่าไรเก็บเศษไว้ นำผลลัพธ์ที่ได้จากการหารเป็นตัวตั้งแล้วหารด้วย base2 หารได้เท่าไรเก็บเศษไว้อีก ทำเช่นนี้จนกว่าผลลัพธ์ที่ได้
จากการหารมีค่าเป็นศูนย์ แล้วนำเศษทั้งหมดมาเขียนเรียงกัน โดยเริ่มต้นตั้งแต่เศษตัวสุดท้ายจนถึงเศษตัวแรก”

ตัวอย่าง

ต้องการเปลี่ยน (1039)ฐาน 10 ให้เป็นเลขฐาน 16

ในที่นี้ base2 คือ 16 อาศัยขั้นตอนวิธีในสูตรที่ 2 จะได้ผลดังนี้
1039 ÷16 =  64 เศษ 15
64 ÷ 16 = 4 เศษ 0
4 ÷ 16  = 0 เศษ 4
เรียงลำดับจากตัวสุดท้ายไปหาตัวแรกจะได้ (4) (0) (15)  ในเลขฐาน 16 จะแทน 15 ด้วย F ดังนั้น
1039 ฐาน 10    =   40F  ฐาน 16

ต่อไปจะนำสูตรที่ 1 และ สูตรที่ 2 ไปเขียนเป็นโปรแกรม visual basic

ออกแบบหน้าตาโปรแกรม

การเขียนโปรแกรม visual basic (ต่อไปจะเรียกสั้น ๆ ว่า vb)  จะเริ่มต้นด้วยการสร้างหน้าต่างที่เรียกว่า form แล้วนำ control (หมายถึง ส่วนประกอบต่าง ๆ จัดเป็น object ที่ผู้พัฒนาสามารถลากนำมาวาง และมองเห็นหน้าตาของมันได้ระหว่างที่พัฒนาโปรแกรมและขณะที่โปรแกรมทำงาน เช่น Label Textbox Listbox Combobox เป็นต้น ส่วน component นั้นหมายถึง object ที่มักจะทำงานอยู่ฉากหลังของโปรแกรม ไม่ปรากฏโฉมหน้าให้เห็นที่ตัวโปรแกรม เช่น timer) ต่าง ๆ ที่ vb จัดไว้ให้ เลือกมาใส่ลงในฟอร์มนี้ การทำงานของโปรแกรมจะเป็นลักษณะ Event driven programming โปรแกรมจะทำงานตามเหตุการณ์ที่ผู้ใช้ทำให้เกิดขึ้น เช่นผู้ใช้ป้อนข้อความลงใน textbox หรือคลิกเลือกที่ combo box หรือคลิกปุ่ม command เพื่อให้เกิดการประมวลผล
โปรแกรมนี้จะนำคอนโทรล combobox, Label , textbox, button และ shape มาใส่ลงบนฟอร์มดังรูปต่อไปนี้

 รูปที่  2 control  ต่าง ๆ ที่จัดเรียงบนฟอร์ม

เขียนชุดคำสั่งให้แก่ control ต่าง ๆ เช่นเมื่อเลือกฐานเลขที่เป็นต้นทางที่จะแปลงที่ combobox1 แล้วจะมีการเก็บฐานเลขไว้ในตัวแปรใดบ้าง และเมื่อเลือกฐานเลขที่จะเป็น output ที่ combobox2 จะมีการเก็บฐานเลขปลายทางไว้ที่ตัวแปรใดบ้าง เมื่อผู้ใช้ใส่ตัวเลขที่จะแปลงเป็นฐานอื่นลงใน textbox จะต้องมีการตรวจสอบเลขที่ป้อนเข้ามามีความถูกต้องหรือไม่ เมื่อผู้ใช้งานคลิกที่ปุ่ม calculate จะมีการคำนวณเปลี่ยนฐานเลขโดยอาศัย algorithm ตามหลักการที่กล่าวไว้ข้างต้น

รายละเอียดของโปรแกรม มีดังนี้
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
Option Explicit
Option Base 0
         Dim digits(16) As String
         Dim i As Long
         Dim j As Long
         Dim N As Long
         Dim base1 As Double
         Dim base2 As Double
         Dim dec As Double
         Dim inputValue As String
         Dim result As String
Private Sub cboInputBase_Click()
        base1 = cboInputBase.ListIndex + 2
        Label3.Caption = "Your value in base " & base1 & " :  "
         Call clearOutput
End Sub
Private Sub cboOutputBase_Click()
        base2 = cboOutputBase.ListIndex + 2
         Call clearOutput
End Sub
Private Sub cmdCal_Click()
         Dim L As Long
         Dim ch As String
        Dim remainder As Integer
         txtValue.Text = UCase(txtValue.Text)  ' make all letters  upper case
        L = Len(txtValue.Text)
        For i = 1 To L
                  ch = Mid(txtValue.Text, i, 1)
                 If base1 <= 10 Then
                  If Val(ch) >= base1 Or (Asc(ch) < 48 Or Asc(ch) > 57) Then
                          MsgBox "Some number(s)  not valid", , "Number Error"
                          Exit Sub
                 End If
                 End If
                 If base1 > 10 Then
                 If (Asc(ch) < 48 Or Asc(ch) > 57) And (Asc(ch) < 65 Or Asc(ch) > 54 + base1) Then
                          MsgBox "Some number(s) not valid", , "Number Error"
                         Exit Sub
                 End If
                 End If
        Next i
'convert to decimal base
dec = 0
        For N = 1 To L
        For j = 0 To base1 - 1
                 If (digits(j) = Mid(txtValue.Text, N, 1)) Then
                 dec = dec + (j * base1 ^ (L - N))
                 End If
        Next j
        Next N
' Debug.Print txtValue.Text & " in  base " & base1 & " =  " & dec & " in base 10 "
'  Label7.Caption = txtValue.Text & " in base " & base1 & "  =  " & dec & " in base 10"
' convert decimal number to new base
result = ""
        While dec <> 0
                  remainder = dec - Int(dec / base2) * base2
                 result = digits(remainder) + result
                  dec = Int(dec / base2)
        Wend
        If result = "" Then result = "0"
' display results
         Label4.Visible = True
         Label5.Visible = True
        Shape1.Visible = True
        Label4.Caption = txtValue.Text & " in base  " & base1 & "  =  "
         Label5.Caption = result & "  in base " & base2
End Sub
Private Sub Form_Initialize()
        For i = 0 To 9
                  digits(i) = i  ' don't us digits(i) = str(i)
        Next i
        digits(10) = "A":        digits(11) = "B"
        digits(12) = "C":        digits(13) = "D"
        digits(14) = "E":     digits(15) = "F"
        For i = 2 To 16
                 cboInputBase.AddItem Str(i)
                 cboOutputBase.AddItem Str(i)
         Next i
        cboInputBase.ListIndex = 8
        cboOutputBase.ListIndex = 14
        base1 = 10
End Sub
Private Sub clearOutput()
        txtValue.Text = ""
         Label4.Visible = False
         Label5.Visible = False
         Shape1.Visible = False
End Sub
Private Sub txtValue_GotFocus()
         Call clearOutput
End Sub

Download sourcecode เพื่่อนำไปรันใน VB 6.0 คลิกที่นี่

การทำงานของโปรแกรม

เมื่อให้โปรแกรมทำงาน จะแสดงหน้าต่างที่ใช้ในการแปลงฐานเลข เริ่มต้นให้ผู้ใช้เลือกฐานเลขเดิมที่จะแปลง และเลือกฐานเลขใหม่ที่จะแปลงไปสู่ โดยเลือกจาก combobox ในที่นี้จะแปลงเลขฐาน 8 ให้เป็น เลขฐาน 10
รูปที่ 3 เมื่อโปรแกรมเริ่มต้นทำงาน

พิมพ์ 2017 ลงไปใน textbox  คลิกปุ่ม calculate โปรแกรมจะเปลี่ยนฐานเลขได้ผลลัพธ์แสดงไว้ในกรอบสีน้ำเงิน
รูปที่ 4 แสดงการคำนวณ 2017 ฐาน 8 ให้เป็นเลขฐาน 10

ทดสอบโดยการแปลง (1039) ฐาน 10 ให้เป็นเลขฐาน 16 จะได้ผลลัพธ์ดังภาพที่ 4
รูปที่ 5 แสดงการแปลง 1039 ฐานสิบ ให้เป็นเลขฐาน 16

ข้อพึงระวัง

ในการใช้งาน สำหรับโปรแกรมแปลงฐานเลขที่พัฒนาในวิชวล เบสิก 6.0 มีข้อพึงระวังดังต่อไปนี้

  • โปรแกรมนี้ใช้ได้กับจำนวนเต็มที่เป็นบวกเท่านั้น ไม่สามารถใช้ได้กับเลขทศนิยม
  • ยังไม่ได้ทดสอบขีดจำกัดว่าจำนวนที่มากที่สุดที่สามารถแปลงได้คือเท่าใด
  • ถ้าเลขมีจำนวนหลักมาก ๆ เช่นแปลงจากเลขฐาน 16 เป็นเลขฐาน2 การแสดงผลอาจจะดูไม่สวยงาม ต้องเปลี่ยนขนาดกรอบสีน้ำเงินและขยายบรรทัดการแสดงผลลัพธ์ให้กว้างกว่านี้

References

  1. No reference at this time