โปรแกรมเลขบัตรประจำตัวประชาชน โดยใช้ Java
บทความนี้เราลองมาเขียนโปรแกรมเกี่ยวกับเลขบัตรประชาชนกัน
โปรแกรมแรกเป็นโปรแกรมในการหาเลขประจำตัว ตัวสุดท้าย หรือเรียกกันว่า Check Digit
ใครที่ชอบเล่นเกม จะเห็นว่า บางครั้งการสมัคร ID แต่ละครั้ง ต้องใช้เลขบัตรประจำตัวประชาชนในการสมัครด้วย ก็เผื่อใครมีหลายไอดีจะโดนแบน อะไรประมาณนี้ หากเราใส่เลขประจำตัวเรื่อยเปลื่ย ที่ไม่ถูกต้อง ระบบก็จะแจ้งเตือนออกมา ว่าใส่เลขประจำตัวผิด
ระบบทำได้ยังไง ว่าเรากรอกเลขประจำตัวผิดหรือถูก หากจะเก็บข้อมูลของคนทั้งประเทศ ก็เยอะเกินไป คงไม่ไหวแน่ ดังนั้น ระบบ จึงต้องมีการตรวจสอบเลขที่กรอกเข้ามา โดยบางระบบเช็คที่ตัวเลขตัวสุดท้ายครับแล้วมันเช็คยังไงละ ???
เช่น มีเลขประจำตัวดังนี้ 3813459837559 เลขสุดท้ายหรือ check digit ก็คือเลข 9 ระบบก็จะทำการ บวก ลบ คูณ หาร จากเลขสิบสองหลักแรก ถ้าผลที่ออกมาได้เลข 9 แสดงว่า เลขประจำตัวนั้นผ่าน หากเลขที่ออกมาไม่ใช่เลข 9 แสดงว่า เลขประจำตัวนั้นผิด ซึ่งวิธีหาตัวเลขตัวสุดท้าย ก็คือ
1. เอาเลข 12 หลักแรกมา เขียนแยกหลักกัน แล้วเอาไปคูณกับเลขประจำหลักของมัน
ตัวตั้ง | 3 | 8 | 1 | 3 | 4 | 5 | 9 | 8 | 3 | 7 | 5 | 5 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
ตัวคูณ | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
ผลลัพธ์ | 39 | 96 | 11 | 30 | 36 | 40 | 63 | 48 | 15 | 28 | 15 | 10 |
2. เอาผลลัพธ์ที่ได้ทั้งหมดมาบวกกัน 39+96+11+30+36+40+63+48+15+28+15+10=431
3. เอาเลขที่ได้ มา mod 11 ( หารเอาเศษ ) จะได้ 431 mod 11 = 2
4. เอา 11 ตั้งแล้วเอามาลบกับเลขที่ได้เมื่อกี้ จะได้ 11-2=9
เลขที่ได้ คือ 9 ก็เอาไปตรวจสอบว่าเลขสุดท้ายคือ 9 หรือเปล่า ถ้าใช่ก็แสดงว่ากรอกถูก ถ้าไม่ใช่ก็แสดงว่ากรอกผิด
ถ้าเลขที่ได้เป็นเลขสองหลักให้เอาหลักสุดท้าย เช่น ได้ 10 ให้เอา 0
import java.util.Scanner; //import util.scanner เพื่อใช้สำหรับรับค่า public class IDPerson { public static void main(String[] args) { long id = 0; while(true){ //วนจนกว่าจะป้อนค่าที่ถูกต้อง try { Scanner in = new Scanner(System.in); //สร้างตัวแปร scanner เพื่อรับค่าทางแป้นพิมพ์ System.out.print("กรุณากรอกรหัสประจำตัว 12 หลัก "); //แสดงให้ผู้กรอกรู้ว่าต้องกรอกตัวเลข id = in.nextLong(); //รับค่าจากแป้นพิมพ์เป็นชนิด long String checkbit = id + ""; //สร้างตัวแปร checkbit เป็นชนิดสตริงเพื่อตรวจสอบความยาวของตัวเลข if(checkbit.length() == 12) break; //check ว่าค่าที่รับเข้ามามีขนาดกี่หลัก ถ้ามีสิบสองหลักให้ break ออกจาก loop }catch (Exception e) { } } long base = 100000000000l; //สร้างตัวแปร เพื่อสำหรับให้หารเพื่อเอาหลักที่ต้องการ int basenow; //สร้างตัวแปรเพื่อเก็บค่าประจำหลัก int sum = 0; //สร้างตัวแปรเริ่มตัวผลบวกให้เท่ากับ 0 for(int i = 13; i > 1; i--) { //วนรอบตั้งแต่ 13 ลงมาจนถึง 2 basenow = (int)Math.floor(id/base); //หาค่าประจำตำแหน่งนั้น ๆ id = id - basenow*base; //ลดค่า id ลงทีละหลัก System.out.println(basenow + "x" + i + " = " + (basenow*i)); //แสดงค่าเมื่อคูณแล้วของแต่ละหลัก sum += basenow*i; //บวกค่า sum ไปเรื่อย ๆ ทีละหลัก base = base/10; //ตัดค่าที่ใช้สำหรับการหาเลขแต่ละหลัก } System.out.println("Sum is " + sum); //แสดงค่า sum int checkbit = (11 - (sum%11))%10; //คำนวณค่า checkbit System.out.println("Check bit is " + checkbit); //แสดงค่า checkbit ที่ได้ } }
เมื่อรันโดยใช้ค่า 381345983755 จะแสดงผลออกมาจะได้ดังนี้
กรุณากรอกรหัสประจำตัว 12 หลัก 381345983755 3x13 = 39 8x12 = 96 1x11 = 11 3x10 = 30 4x9 = 36 5x8 = 40 9x7 = 63 8x6 = 48 3x5 = 15 7x4 = 28 5x3 = 15 5x2 = 10 Sum is 431 Check bit is 9