Skip to Content
CoursesCSC102นับการซ้ำกันของตัวเลข

นับการซ้ำกันของตัวเลข

โจทย์

เขียนโปรแกรมที่อ่านจำนวนเต็มระหว่าง 1 ถึง 100 จากผู้ใช้ และนับจำนวนครั้งที่แต่ละตัวเลขปรากฏ โปรแกรมควรอ่านตัวเลขต่อไปจนกว่าผู้ใช้จะป้อน 0 ซึ่งเป็นสัญญาณว่าการป้อนข้อมูลสิ้นสุดลง หลังจากป้อนตัวเลขทั้งหมดแล้ว โปรแกรมควรแสดงจำนวนครั้งที่ตัวเลขแต่ละตัวปรากฏ หากตัวเลขนั้นปรากฏมากกว่าหนึ่งครั้ง ให้เติมตัวอักษร “s” ไปยังคำว่า “time” ในผลลัพธ์

InputOutput
2 5 6 5 4 3 23 43 2 02 occurs 2 times
3 occurs 1 time
4 occurs 1 time
5 occurs 2 times
6 occurs 1 time
23 occurs 1 time
43 occurs 1 time

โค้ด

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[][] results = new int[101][1]; while(true) { int number = scanner.nextInt(); if (number == 0) break; results[number][0]++; } for (int i = 0; i < results.length; i++) { int occurances = results[i][0]; if (occurances == 0) continue; System.out.printf("%d occurs %d time%s\n", i, occurances, occurances > 1 ? "s" : ""); } } }

คำอธิบาย

ขั้นตอนที่ 1: การนำเข้าและการตั้งค่าเริ่มต้น

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[][] results = new int[101][1];
  • เรานำเข้า Scanner ซึ่งเป็นเครื่องมือที่ช่วยให้เราสามารถรับข้อมูลจากผู้ใช้ได้
  • เราสร้างคลาสชื่อ Main และฟังก์ชัน main ซึ่งเป็นจุดเริ่มต้นของโปรแกรม
  • เราสร้างออบเจ็กต์ Scanner เพื่อใช้ในการรับข้อมูล
  • เราสร้างอาร์เรย์ 2 มิติชื่อ results ขนาด 101x1 เพื่อเก็บจำนวนครั้งที่แต่ละตัวเลขปรากฏ (ใช้ 101 เพราะเราต้องการเก็บตัวเลข 1-100 โดยใช้ดัชนีที่ตรงกับตัวเลขนั้นๆ)

ขั้นตอนที่ 2: การรับข้อมูลจากผู้ใช้และนับจำนวนครั้ง

while(true) { int number = scanner.nextInt(); if (number == 0) break; results[number][0]++; }
  • เราใช้ลูป while(true) เพื่อรับข้อมูลจากผู้ใช้ไปเรื่อยๆ จนกว่าจะมีการหยุดลูป
  • ในแต่ละรอบ เรารับตัวเลขจากผู้ใช้และเก็บในตัวแปร number
  • ถ้า number เป็น 0 เราจะออกจากลูปทันที (นี่คือเงื่อนไขการจบโปรแกรม)
  • ถ้า number ไม่ใช่ 0 เราจะเพิ่มค่าในอาร์เรย์ results ที่ตำแหน่ง number ขึ้น 1 (เช่น ถ้าผู้ใช้ป้อน 5 เราจะเพิ่มค่าใน results[5][0] ขึ้น 1)

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

for (int i = 0; i < results.length; i++) { int occurances = results[i][0]; if (occurances == 0) continue; System.out.printf("%d occurs %d time%s\n", i, occurances, occurances > 1 ? "s" : ""); }
  • เราใช้ลูป for เพื่อวนผ่านทุกช่องในอาร์เรย์ results
  • สำหรับแต่ละตัวเลข i (ซึ่งก็คือตัวเลขที่ผู้ใช้ป้อนเข้ามา)
    • เราดึงจำนวนครั้งที่ตัวเลขนี้ปรากฏ (occurances) จาก results[i][0]
    • ถ้า occurances เป็น 0 (หมายความว่าไม่มีใครป้อนตัวเลขนี้เข้ามา) เราจะข้ามไปตัวเลขถัดไปทันที
    • ถ้า occurances ไม่ใช่ 0 เราจะพิมพ์ผลลัพธ์ โดยใช้ System.out.printf
      • %d occurs %d time%s\n คือรูปแบบที่เราต้องการพิมพ์ โดย
        • %d ตัวแรกคือตัวเลขที่ปรากฏ (i)
        • %d ตัวที่สองคือจำนวนครั้งที่ปรากฏ (occurances)
        • %s คือ “s” หรือ "" ขึ้นอยู่กับว่าเป็นพหูพจน์หรือไม่
      • occurances > 1 ? "s" : "" เป็นการเช็คว่าถ้า occurances มากกว่า 1 ให้ใส่ “s” ต่อท้าย “time” ถ้าไม่ใช่ก็ไม่ต้องใส่อะไร

หลักการทำงาน

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