นับการซ้ำกันของตัวเลข
โจทย์
เขียนโปรแกรมที่อ่านจำนวนเต็มระหว่าง 1 ถึง 100 จากผู้ใช้ และนับจำนวนครั้งที่แต่ละตัวเลขปรากฏ โปรแกรมควรอ่านตัวเลขต่อไปจนกว่าผู้ใช้จะป้อน 0 ซึ่งเป็นสัญญาณว่าการป้อนข้อมูลสิ้นสุดลง หลังจากป้อนตัวเลขทั้งหมดแล้ว โปรแกรมควรแสดงจำนวนครั้งที่ตัวเลขแต่ละตัวปรากฏ หากตัวเลขนั้นปรากฏมากกว่าหนึ่งครั้ง ให้เติมตัวอักษร “s” ไปยังคำว่า “time” ในผลลัพธ์
| Input | Output |
|---|---|
| 2 5 6 5 4 3 23 43 2 0 | 2 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” ถ้าไม่ใช่ก็ไม่ต้องใส่อะไร
- เราดึงจำนวนครั้งที่ตัวเลขนี้ปรากฏ (
หลักการทำงาน
ปรับปรุงล่าสุด