Skip to Content
CoursesCSC102การตรวจสอบความถูกต้องของ IPv4

การตรวจสอบความถูกต้องของ IPv4

โจทย์

ตรวจสอบว่า IPv4 นั้นถูกต้องหรือไม่ ถ้าถูกแสดง Valid ถ้าไม่ถูกให้แสดง Invalid โดยรูปแบบของ IPv4 นั้นประกอบไปด้วย

[0-255].[0-255].[0-255].[0-255]

เช่น 192.168.1.1 1.1.1.1 และ 255.255.255.255

InputOutput
192.168.1.1Valid
1.1.1.1Valid
256.1.1.1Invalid

โค้ด

โค้ดตามขอบเขตในคลาสเรียน

import java.util.Scanner; public class Main { public static void main (String[] args) { Scanner scanner = new Scanner(System.in); String ipV4 = scanner.nextLine(); int startIndex = 0; int dotIndex = ipV4.indexOf("."); boolean isValid = true; for(int i = 0; i < 4; i++) { int ipPart = Integer.parseInt(ipV4.substring(startIndex, dotIndex)); if (ipPart < 0 || ipPart > 255) { isValid = false; break; } startIndex = dotIndex + 1; dotIndex = ipV4.indexOf(".", dotIndex + 1); if (dotIndex == -1) { dotIndex = ipV4.length(); } } if(isValid) { System.out.println("Valid"); } else { System.out.println("Invalid"); } } }

โค้ดนอกเหนือจากคลาสเรียน

import java.util.Scanner; public class Main { public static void main (String[] args) { Scanner scanner = new Scanner(System.in); String ipV4 = scanner.nextLine(); String[] ipV4Parts = ipV4.split("\\."); boolean isValid = true; for (String part : ipV4Parts) { int partInt = Integer.parseInt(part); if (partInt < 0 || partInt > 255) { isValid = false; break; } } System.out.println(isValid ? "Valid" : "Invalid"); } }

คำอธิบาย

คำอธิบายโค้ดตามขอบเขตในคลาสเรียน

ขั้นตอนที่ 1: การนำเข้าไลบรารี

import java.util.Scanner;
  • บรรทัดนี้เป็นการนำเข้าไลบรารีที่ชื่อว่า Scanner
  • Scanner เป็นเครื่องมือที่ช่วยให้เราสามารถรับข้อมูลจากผู้ใช้ได้
  • เปรียบเสมือนการหยิบเครื่องอ่านบัตรที่สามารถอ่านข้อมูลที่ผู้ใช้ป้อนเข้ามาได้

ขั้นตอนที่ 2: การสร้างคลาส

public class Main { // โค้ดอื่นๆ จะอยู่ในนี้ }
  • class Main คือการสร้างกล่องใหญ่ที่จะเก็บโค้ดทั้งหมดของเรา
  • คิดเหมือนกับการสร้างห้องทำงานที่ชื่อว่า “Main” ที่เราจะใช้ตรวจสอบ IP address

ขั้นตอนที่ 3: การสร้างเมธอดหลัก

public static void main (String[] args) { // โค้ดหลักจะอยู่ในนี้ }
  • นี่คือจุดเริ่มต้นของโปรแกรมของเรา
  • เปรียบเสมือนประตูทางเข้าของห้องทำงาน เมื่อเราเปิดโปรแกรม มันจะเริ่มทำงานจากตรงนี้

ขั้นตอนที่ 4: การสร้างตัวรับข้อมูล

Scanner scanner = new Scanner(System.in);
  • เราสร้างเครื่องมือที่ชื่อว่า scanner เพื่อรับข้อมูลจากผู้ใช้
  • คิดเหมือนกับการเตรียมปากกาและกระดาษไว้พร้อมจดบันทึก IP address ที่ผู้ใช้จะบอกเรา

ขั้นตอนที่ 5: การรับ IP address

String ipV4 = scanner.nextLine();
  • เราใช้ scanner เพื่ออ่าน IP address ที่ผู้ใช้พิมพ์เข้ามา และเก็บไว้ในตัวแปร ipV4
  • เปรียบเสมือนการจดบันทึก IP address ที่ผู้ใช้บอกเรา

ขั้นตอนที่ 6: การเตรียมตัวแปรสำหรับการตรวจสอบ

int startIndex = 0; int dotIndex = ipV4.indexOf("."); boolean isValid = true;
  • เราสร้างตัวแปร startIndex และ dotIndex เพื่อใช้ในการแบ่ง IP address
  • isValid ใช้เก็บผลการตรวจสอบว่า IP address ถูกต้องหรือไม่
  • เปรียบเสมือนการเตรียมไม้บรรทัดเพื่อวัดแต่ละส่วนของ IP address

ขั้นตอนที่ 7: การตรวจสอบแต่ละส่วนของ IP

for(int i = 0; i < 4; i++) { int ipPart = Integer.parseInt(ipV4.substring(startIndex, dotIndex)); if (ipPart < 0 || ipPart > 255) { isValid = false; break; } startIndex = dotIndex + 1; dotIndex = ipV4.indexOf(".", dotIndex + 1); if (dotIndex == -1) { dotIndex = ipV4.length(); } }
  • เราใช้ลูป for เพื่อตรวจสอบทั้ง 4 ส่วนของ IP address
  • ในแต่ละรอบ:
    • แยกส่วนของ IP ออกมาและแปลงข้อความ String เป็นตัวเลข int โดย Integer.parseInt()
    • ตรวจสอบว่าตัวเลขอยู่ระหว่าง 0 ถึง 255 หรือไม่
    • ถ้าไม่อยู่ในช่วงนี้ ถือว่าไม่ถูกต้อง
    • เลื่อนตำแหน่งการตรวจสอบไปยังส่วนถัดไป
  • เปรียบเสมือนการใช้ไม้บรรทัดวัดแต่ละส่วนของ IP address และตรวจสอบว่าอยู่ในขนาดที่ถูกต้องหรือไม่

ขั้นตอนที่ 8: การแสดงผลลัพธ์

if(isValid) { System.out.println("Valid"); } else { System.out.println("Invalid"); }
  • เราตรวจสอบค่า isValid และแสดงผลว่า IP address นั้นถูกต้องหรือไม่
  • เปรียบเสมือนการประกาศผลการตรวจสอบ IP address ว่าผ่านหรือไม่ผ่าน

โค้ดนอกเหนือจากคลาสเรียน

String[] ipV4Parts = ipV4.split("\\."); boolean isValid = true; for (String part : ipV4Parts) { int partInt = Integer.parseInt(part); if (partInt < 0 || partInt > 255) { isValid = false; break; } } System.out.println(isValid ? "Valid" : "Invalid");

ความแตกต่างและเหตุผล:

1. เมธอด split()

เมธอด split() ใช้สำหรับแบ่งสตริง (string) ออกเป็นส่วนๆ โดยใช้ตัวคั่น (delimiter) ที่กำหนด

String[] ipV4Parts = ipV4.split("\\.");
วิธีการทำงาน
  • split() จะมองหาตัวคั่นในสตริง (ในที่นี้คือจุด ”.”)
  • เมื่อเจอตัวคั่น มันจะตัดสตริงออกเป็นส่วนๆ
  • ผลลัพธ์จะเป็นอาร์เรย์ (array) ของสตริงที่ถูกแบ่ง
ตัวอย่าง

ถ้า ipV4 = "192.168.0.1" หลังจาก split() จะได้ ipV4Parts = ["192", "168", "0", "1"]

เปรียบเทียบแบบง่าย

คิดเหมือนการตัดขนมปังเป็นชิ้นๆ โดยใช้มีด ที่จุดที่เราต้องการตัด

ข้อสังเกต
  • เราใช้ \\. แทน . เพราะในภาษา Java จุดเป็นอักขระพิเศษในการเขียน regular expression จึงต้องใช้ \\ เพื่อบอกว่าเราต้องการใช้จุดจริงๆ

2. ลูป for-each

ลูป for-each เป็นวิธีการวนซ้ำผ่านสมาชิกทั้งหมดของคอลเลกชัน (เช่น อาร์เรย์) โดยไม่ต้องใช้ตัวนับ

for (String part : ipV4Parts) { // โค้ดที่ต้องการทำซ้ำ }
วิธีการทำงาน
  • ลูปจะวนซ้ำผ่านทุกสมาชิกใน ipV4Parts
  • ในแต่ละรอบ มันจะนำสมาชิกหนึ่งตัวมาเก็บในตัวแปร part
  • เราสามารถใช้ part ในการทำงานกับสมาชิกนั้นๆ ได้
เปรียบเทียบแบบง่าย

คิดเหมือนการหยิบลูกบอลออกจากกล่องทีละลูก แล้วทำอะไรบางอย่างกับลูกบอลนั้น จนกว่าจะหยิบครบทุกลูก

ข้อดี
  • โค้ดสั้นและอ่านง่ายกว่าลูป for แบบปกติ
  • ไม่ต้องกังวลเรื่องการจัดการดัชนี (index)
ข้อจำกัด
  • ไม่สามารถควบคุมจำนวนรอบของลูปได้โดยตรง
  • ไม่สามารถเข้าถึงดัชนีของสมาชิกได้โดยตรง

3. Ternary Operator

Ternary operator เป็นวิธีการเขียน if-else แบบสั้นๆ ในบรรทัดเดียว

System.out.println(isValid ? "Valid" : "Invalid");
วิธีการทำงาน
  • มีรูปแบบ: เงื่อนไข ? ค่าถ้าจริง : ค่าถ้าเท็จ
  • ถ้าเงื่อนไขเป็นจริง จะคืนค่าหลังเครื่องหมาย ?
  • ถ้าเงื่อนไขเป็นเท็จ จะคืนค่าหลังเครื่องหมาย :
เปรียบเทียบแบบง่าย

คิดเหมือนการตั้งคำถาม “ถ้า… แล้ว… ไม่งั้น…” เช่น “ถ้าฝนตก เอาร่ม ไม่งั้นเอาแว่นกันแดด”

ข้อดี
  • โค้ดสั้นกว่า if-else แบบปกติ
  • เหมาะสำหรับการตัดสินใจง่ายๆ ที่มีเพียงสองทางเลือก
ข้อจำกัด
  • อาจอ่านยากถ้าใช้กับเงื่อนไขที่ซับซ้อน
  • ไม่เหมาะสำหรับการตัดสินใจที่มีหลายทางเลือก

ตัวอย่างการทำงาน

โค้ดตามขอบเขตในคลาสเรียน

โค้ดนอกเหนือจากคลาสเรียน

ปรับปรุงล่าสุด