หากมีคำถาม ขอให้ไปโพสต์ลง เว็บบอร์ดจีทูจีเน็ตดอตคอม ตัวใหม่แทนน่ะครับ

หรือติดต่อเข้ามาทาง Inbox ที่ เฟซบุ๊ค ผมครับ

หน้าหลัก
ข่าวสาร - บทความ ทั้งหมด
VB 6/VB.Net
ASP/ASP.Net
จับฉ่ายคอมพิวเตอร์
เรียนรู้ผ่าน Flash Movie
บทความที่มีผู้ตอบล่าสุด  
 RSS Feeds
 ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...   Download โปรแกรม RSS Reader

Forum - www.g2gnet.com
Webmaster - www.g2gnet.com
Visitors - Session views
 5 2 1 6 9 0 0

7 ธันวาคม พ.ศ.2549
1449 Users On-Line.
Visitors - Page views
 8 5 3 9 7 8 8
1 กุมภาพันธ์ พ.ศ.2551

Google   
เว็บ g2gnet.com
ขนาดตัวอักษร:  

แจกฟรี Source Code โปรแกรมการสุ่มหมายเลขบัตรประชาชน

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 7/5/2553   เวลา: 12:02
(อ่าน : 29376) 
จั่วหัวข้อแบบนี้เอาไว้ หลายคนคงคิดว่าผมมาสนับสนุนให้คนทำผิดกฏหมาย ด้วยการปลอมแปลงหมายเลขบัตรประชาชน เปล่าเลยครับ ... คุณจะไปติดต่องานทะเบียนที่อำเภอ ทำธุรกรรมทางการเงิน หรือ จดทะเบียนหมายเลขโทรศัพท์ หรืออื่นๆ คุณก็ต้องนำบัตรประชาชนตัวจริง และ สำเนาพร้อมเซ็นเอกสารกำกับเอาไว้ และนำไปด้วยทุกครั้ง ใครมันจะบ้าให้มาสุ่มเลขบัตรประชาชนไปแทนล่ะ 55555+ จริงมั้ยครับ ... หรือคิดว่าผมมาสนับสนุนให้เด็กๆปลอมเลขบัตรประชาชน เพื่อนำไปสมัครเล่นเกมส์ออนไลน์ อิอิ ... ขืนไปพูดแบบนี้กับเด็กๆ ระวังจะโดนสวนกลับน่ะครับ "โถ น้านี่เชย (หรือโง่) จัง หาตามเว็บไซต์ก็ได้มีเยอะแยะไป" เอิ๊กๆๆๆๆ (เด็กกลุ่มนี้แหละ คือ เป้าหมายกลุ่มลูกค้าของบริษัทฯให้บริการเกมส์ต่างๆ) ... ดังนั้นสิ่งที่ผมจะนำมาเขียนเป็นบทความ เรามองในแง่ของการฝึกเขียนโปรแกรม (ไม่ใช่ฝึกใช้โปรแกรมน่ะครับ) คือ มันเป็นโจทย์ที่ดีมากในการฝึกคิดทั้ง Algorithm และ ตรรกะ (Logic) ซึ่งในเรื่องของ Algorithm ผมเคยเขียนบรรยายเอาไว้แล้ว (ตั้งแต่ตอนหาข้อมูลแบบนี้ยากมากๆ) ซึ่งในส่วนของตรรกะเนี่ย ผมจะนำมาใช้ในเรื่องนี้ครับ
    หลักการคำนวณหาหมายเลขบัตรประชาชน
  • สุ่มตัวเลขมาทั้งหมด 12 หลัก โดยที่หลักแรกต้องไม่ใช่เลข 0 หรือ เลข 9 ... ส่วนนี้แหละครับคือส่วนสำคัญ ที่ผมอยากให้พี่น้องทุกๆท่าน ได้เรียนรู้กับเรื่องของ ตรรกะ (Logic) ที่มันมีเพียงแค่ 2 ค่า คือ จริง (TRUE) กับ เท็จ (FALSE) ... มองดูมันเหมือนง่ายๆ แต่เชื่อเถอะครับ พอเอาเข้าจริงๆแล้ว มันก็ไม่ได้ง่ายดายอย่างที่คิดเอาไว้เลย (ลองทดสอบเขียนเองก่อนไปดูโค้ดก็ได้ครับ) ... ลักษณะแบบนี้จะเป็นการทำซ้ำ (Repetitive) โดยอาศัยคำสั่งจำพวก While, Do While, Do Until, Do Loop While หรือ Do Loop Until (ทำไมไม่ใช้ FOR ในการแก้ปัญหาล่ะ ... ลองคิดเองเพิ่มเติมครับ) ... โจทย์ข้อนี้พี่น้องจะสามารถมองเห็นภาพความแตกต่างระหว่างการวนรอบ (Loop) แบบ FOR และ การทำซ้ำ (Repetitive) ได้อย่างชัดเจนเลยทีเดียว
    
    รูปแบบ
    Do { While | Until } condition
        [ statements ]
        [ Exit Do ]
        [ statements ]
    Loop
    -หรือ-
    Do
        [ statements ]
        [ Exit Do ]
        [ statements ]
    Loop { While | Until } condition
    อ่านรายละเอียดเพิ่มเติม จากแหล่งข้อมูลอ้างอิง
    เรื่องของ เงื่อนไข หรือ Condition เราสามารถนำมาใช้ได้ทั้ง จริง หรือ เท็จ เพื่อใช้ในการทำซ้ำ เพราะมันขึ้นอยู่กับว่าเรา เลือกใช้เงื่อนไขแบบไหน ครับ ... พี่น้อง และเนื่องจากว่าตัวเลขหลักแรกต้องไม่ใช่ 0 กับ 9 ดังนั้นมันจึงต้องใช้เงื่อนไขของ AND/OR หรือ NOT เข้ามาใช้งานด้วย ... ผมจึงขอเพิ่มเติมเรื่องของ ตารางค่าความจริง หรือ Truth Table (ซึ่งผมเรียนมาตั้งแต่ ปวช. อิเล็กทรอนิกส์) เพื่อนำมาแสดงให้เห็นกัน ... และอย่าเอาแต่ท่องจำอย่างเดียวครับ ต้องทำความเข้าใจให้ลึกซึ้ง เพราะงานเขียนโปรแกรมจริงๆจำเป็นต้องใช้งานมาก
    ตารางค่าความจริง หรือ Truth Table (สำหรับตัวอย่าง AND/OR จะมี Input 2 ตัว คือ A และ B)

    A

    B

    A AND B

    FALSE

    FALSE

    FALSE

    FALSE

    TRUE

    FALSE

    TRUE

    FALSE

    FALSE

    TRUE

    TRUE

    TRUE

    A

    B

    A OR B

    FALSE

    FALSE

    FALSE

    FALSE

    TRUE

    TRUE

    TRUE

    FALSE

    TRUE

    TRUE

    TRUE

    TRUE

    A

    NOT A

    FALSE

    TRUE

    TRUE

    FALSE

  • สรุปกันง่ายๆไม่ว่าจะมี Input เข้ามากี่ตัวก็ตามที คือ
    • กรณีการ AND (และ) ... หากมี Input ใดๆ 1 ตัว เป็น False คำตอบคือ False เสมอ
    • กรณีการ OR (หรือ) ... หากมี Input ใดๆ 1 ตัว เป็น True คำตอบคือ True เสมอ
  • คำนวณหาผลรวมของตัวเลข 12 หลักที่ได้มา (ผมอธิบายไว้ในส่วนของโค้ด)
  • คำนวณหาเลขหลักที่ 13 ซึ่งเป็นหลักตรวจสอบ หรือ Check Digit ก็เสร็จสมบูรณ์
ดาวน์โหลด Source Code สำหรับผู้ใช้งาน Visual Basic 6
ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6
 ดาวน์โหลด Visual Basic 6.0 SP5: Run-Time Redistribution Pack
 ดาวน์โหลด Microsoft Data Access Object (MDAC) และ Jet 4.0 Update
 ดาวน์โหลด Microsoft Visual Basic Service Pack 6
ดาวน์โหลดสำหรับผู้ที่ต้องการใช้โปรแกรมอย่างเดียว
ดาวน์โหลดโปรแกรมสุ่มหมายเลขบัตรประชาชน - Random IDCard.exe
 ดาวน์โหลด Visual Basic 6.0 SP5: Run-Time Redistribution Pack (หากไม่สามารถรันโปรแกรม Random ICCard.exe ได้ ให้ดาวน์โหลดไฟล์ Run-Time ตัวนี้ไปติดตั้งด้วยครับ)
ข้อมูลเพิ่มเติม
Source Code โปรแกรมการตรวจสอบหมายเลขบัตรประชาชน (VB6 + VB.Net)

โปรแกรมการสุ่มหมายเลขบัตรประชาชน

เริ่มต้นกระบวนการทำงาน

Option Explicit

Sub SetupScreen()
    txtRandomNumber.Text = ""
    txtCheckDigit.Text = ""
    txtIDCard.Text = ""
End Sub

' ########################################################
' คลิ๊กปุ่มเพื่อทำการสุ่มหมายเลขบัตรประชาชน
Private Sub cmdRandom_Click()
' ########################################################
Dim Sum As Integer
Dim Count As Byte
    
    Call SetupScreen
    
    ' สุ่มหาตัวเลขมาทั้งหมด 12 หลัก โดยที่หลักแรกต้องไม่ใช่ 0 และ 9 ด้วย
    ' เรียกไปยังฟังค์ชั่น RandomNumber โดยไม่มีการส่งค่าใดๆไป แต่จะต้องรับค่าที่ได้กลับมา
    txtRandomNumber.Text = RandomNumber
    
    ' หลักคิดสำหรับ 12 หลักแรก
    ' เริ่มต้นคำนวณหาค่าผลรวมตัวเลขทั้ง 12 หลักแรก ดังนี้
    ' หาผลรวมตั้งแต่หลักที่ 1 ไปจนถึงหลักที่ 12 (นับจากซ้ายไปขวา)
    ' โดยให้หลักที่ 1 คูณด้วยน้ำหนักประจำหลัก = 13
    ' โดยให้หลักที่ 2 คูณด้วยน้ำหนักประจำหลัก = 12
    ' โดยให้หลักที่ 3 คูณด้วยน้ำหนักประจำหลัก = 11
    ' โดยให้หลักที่ .. คูณด้วยน้ำหนักประจำหลัก = ..
    ' โดยให้หลักที่ 12 คูณด้วยน้ำหนักประจำหลัก = 2
    ' จากนั้นนำผลการคูณของแต่ละหลักมารวมกันเข้าไป

    ' หลักแต่ละหลัก คือ Val(Mid$(txtIDcard.Text, Count, 1))
    ' น้ำหนักของแต่ละหลัก คือ (14 - Count) เมื่อ Count เริ่มต้นจาก 1 ไปสิ้นสุดที่ 12
    ' ดังนั้นค่านี้ (14 - Count) จึงเริ่มต้นค่าจาก 13, 12, 11, ..., สิ้นสุดที่ 2 ครับผม
    Sum = 0 ' Clear ค่าผลรวมก่อน (เพื่อความแน่ใจ)
    For Count = 1 To 12
        Sum = Sum + Val(Mid$(txtRandomNumber.Text, Count, 1)) * (14 - Count)
    Next
    
    ' ########################################################
    ' ขั้นตอนนี้ คือ การหาค่า Check Digit หรือ หลักตรวจสอบความถูกต้อง
    ' นำผลรวมที่ได้ (Sum) มา Mod (การหารเอาเศษ) ด้วย 11 นั่นคือค่าที่เราจะได้ก็คือ 0, 1, 2, .. , 10 (Sum Mod 11)
    ' จากนั้นให้ลบออกด้วย 11 ก็จะทำให้ได้ค่าตั้งแต่ 1, 2, 3, ... , 11 (11 - (Sum Mod 11))
    ' แล้วให้เลือกตัวขวามือสุดมาหนึ่งตัว ด้วยคำสั่ง Right$ --> Right$(Str(11 - Sum Mod 11)), 1)
    ' ค่าสุดท้ายนี้ก็คือ หลักที่ 13 หรือ หลักตรวจสอบความถูกต้อง (Check Digit) นั่นเอง
    '
    txtCheckDigit.Text = Right$(Str(11 - (Sum Mod 11)), 1)
    '
    ' ########################################################
    
    ' ########################################################
    ' เอาค่ามาจัดเรียงเพื่อนำไปใช้ในการสมัครเล่นเกมส์ต่อไป ... 55555+
    '
    txtIDCard.Text = txtRandomNumber.Text & txtCheckDigit.Text
    '
    ' ########################################################
    
End Sub

' ########################################################
' ฟังค์ชั่นที่ใช้ในการสุ่มตัวเลขจำนวน 12 หลัก ไม่มีการรับค่า แต่จะต้องส่งค่าคืนกลับไป (Return)
' ดังนั้นเราต้องใช้เป็นแบบฟังค์ชั่น (Function) จะใช้ Sub Program ไม่ได้
'
Function RandomNumber() As String
'
' ########################################################
' เพื่อบ่งบอกว่าหลักแรกหาค่าได้สำเร็จแล้วหรือไม่
Dim blnFlag As Boolean
Dim i As Byte
    
    ' เริ่มต้นในการสุ่มตัวเลขก่อน
    Randomize
    
    ' สูตรการสุ่มตัวเลข เมื่อ High = ค่าสูงสุด และ Low = ค่าต่ำสุด
    'RandomNumber = Int((High - Low + 1) * Rnd) + Low
    
    ' ตั้งค่าเป็น False ไว้ก่อน
    blnFlag = False
    
    ' สุ่มเลขจำนวน 12 หลัก โดยที่หลักแรกต้องไม่ใช่ 0 และ 9
    ' เนื่องจากเราใช้การนับเริ่มต้นจาก 1 ไปสิ้นสุดที่ 12 โดยมีค่าเพิ่มขึ้นทีละ 1 ... เหมาะสมที่จะใช้ For
    For i = 1 To 12
        ' Not False หรือ ไม่จริง ก็คือ เท็จ (หรือเขียน blnFlag = False) ... แสดงว่าตอนนี้เรากำลังจะหาตัวเลขหลักแรกอยู่
        If Not blnFlag Then
            ' สุ่มตัวเลขหลักแรก ต้องไม่ให้มีค่าเป็น 0 และ 9 ... นี่คือการทำซ้ำ หรือ Repetitive
            ' ใช้การวนรอบ (Loop) แบบ For จะไม่เหมาะสมสำหรับงานนี้ เพราะเราไม่รู้ค่าเริ่มต้น ค่าสิ้นสุด และ ค่าเพิ่ม (หรือลด)
            ' แต่มันก็นำมาใช้ได้เหมือนกันน่ะครับ เพราะมันมีคำสั่งให้ออกจาก Loop ด้วย Exit For อยู่
            Do
                
                ' บวก 0 ลบ 0 ไว้เท่ๆ ... อิอิอิอิอิ
                RandomNumber = Int((9 - 0 + 1) * Rnd) + 0
                
            ' ทำจนกว่าหลักแรกต้องไม่เท่ากับ 0 และ 9 (เงื่อนไขต้องใช้ AND)
            ' เช่น เมื่อ RandomNumber มีค่า = 1
            ' ทำให้ได้เงื่อนไข 1 <> 0 และ 1 <> 9 (True AND True = True) ... เงื่อนไขเป็น "จริง" ให้ออกจาก Loop
            ' หรือ เมื่อ RandomNumber มีค่า = 9
            ' ทำให้ได้เงื่อนไข 9 <> 0 และ 9 <> 9 (True AND False = False) ... เงื่อนไขเป็น "เท็จ" ให้วน Loop ต่อไป
            Loop Until RandomNumber <> 0 And RandomNumber <> 9
            
            ' หรือ ใช้เงื่อนไข Until แต่กลับกันด้วย Not ... คนที่เขียนแบบนี้ส่วนใหญ่จะเป็นพวกระดับอาชีพครับ ... เชื่อมั้ย
            'Loop Until Not RandomNumber = 0 And Not RandomNumber = 9
            
            ' หรือใช้ While แต่เงื่อนไขต้องกลับกันกับแบบ Until และต้องใช้ OR แทนที่
            ' เช่น เมื่อ RandomNumber มีค่า = 1
            ' ทำให้ได้เงื่อนไข 1 = 0 หรือ 1 = 9 (False OR False = False) ... เงื่อนไขเป็น "เท็จ" ให้ออกจาก Loop
            ' หรือ เมื่อ RandomNumber มีค่า = 9
            ' ทำให้ได้เงื่อนไข 9 = 0 หรือ 9 = 9 (False OR True = True) ... เงื่อนไขเป็น "จริง" ให้วน Loop ต่อไป
            'Loop While RandomNumber = 0 Or RandomNumber = 9
            
            ' แจ้งว่าหลักแรกหาตัวเลขที่ไม่ใช่ 0 หรือ 9 เสร็จสมบูรณ์แล้ว หลักต่อไปจะได้ไม่ต้องเข้าไป Do Loop อีก
            blnFlag = True
        End If
        
        ' หาค่าจำนวนหลักที่เหลือ แล้วส่งค่าคืนกลับของฟังค์ชั่นไปได้เลย
        RandomNumber = RandomNumber & Int((9 - 0 + 1) * Rnd) + 0
    Next

End Function

Private Sub Form_Load()
    ' ป้องกันการเรียกโปรแกรมซ้ำ
    If App.PrevInstance Then End
    
    ' ตั้งฟอร์มอยู่กึ่งกลางจอภาพ
    Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
    
    Call SetupScreen

End Sub
Conclusion:
โจทย์ที่ไม่ยากมากมายนักเพียงข้อเดียว ก็ทำให้เราสามารถเรียนรู้หลักการเขียนโปรแกรมได้ตั้งหลายอย่าง ดังนั้นพี่น้องมือหัดใหม่หัดขับทั้งหลาย จงพยายามมองหาอะไรที่มันอยู่ใกล้ๆตัวนั่นแหละครับ เพื่อนำมาฝึกคิด ฝึกทำ ไม่ใช่แค่การเขียน (หรือลอก) ตามหนังสือมาแล้ว ลองรันโปรแกรมทดสอบดู แล้วพอมันผ่านฉลุย ก็กลับทึกทักคิดไปเองว่า ตัวเราเขียนโปรแกรมเป็นแล้ว มันยังไม่ใช่หรอกครับ ... พี่น้อง ... เอาแค่ง่ายๆครับ หัดคิดย้อนกลับ โดยการเขียนผังงาน หรือ Flowchart ดูทีซิครับ เพื่อทดสอบว่าเราเข้าใจแจ่มแจ้งแดงแจ๋แค่ไหนกัน ... ไม่เชื่อผมก็ลองดูได้เลยครับ

จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: [email protected] หรือ โทร. 08-6862-6560