Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

เขียนโปรแกรม C# แก้ปัญหา FizzBuzz

โจทย์ FizzBuzz

โจทย์คลาสสิกสำหรับสัมภาษณ์โปรแกรมเมอร์:

  • เลขที่หาร 3 ลงตัว → แสดง "Fizz"
  • เลขที่หาร 5 ลงตัว → แสดง "Buzz"
  • เลขที่หาร 3 และ 5 ลงตัว (คือ หาร 15 ลงตัว) → แสดง "FizzBuzz"
  • เลขอื่นๆ → แสดงตัวเลขนั้นๆ

โค้ดตัวอย่างพื้นฐาน (1 ถึง 100)

using System;

class Demo {
    static void Main(String[] args) {
        for (int i = 1; i <= 100; i++) {
            if (i % 3 == 0 && i % 5 == 0) {
                Console.WriteLine("FizzBuzz");
            } else if (i % 3 == 0) {
                Console.WriteLine("Fizz");
            } else if (i % 5 == 0) {
                Console.WriteLine("Buzz");
            } else {
                Console.WriteLine(i);
            }
        }
    }
}

ตัวอย่างผลลัพธ์ (1-20)

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz

วิธีการเขียนแบบต่างๆ (Best Practices)

1. String Builder Approach (ประหยัดหน่วยความจำ)

for (int i = 1; i <= 100; i++) {
    StringBuilder sb = new StringBuilder();
    
    if (i % 3 == 0) sb.Append("Fizz");
    if (i % 5 == 0) sb.Append("Buzz");
    
    Console.WriteLine(sb.Length > 0 ? sb.ToString() : i.ToString());
}

2. Ternary Operator (Concise)

for (int i = 1; i <= 100; i++) {
    Console.WriteLine(
        i % 15 == 0 ? "FizzBuzz" :
        i % 3 == 0 ? "Fizz" :
        i % 5 == 0 ? "Buzz" :
        i.ToString()
    );
}

3. Pattern Matching (C# 7.0+)

for (int i = 1; i <= 100; i++) {
    Console.WriteLine((i % 3, i % 5) switch {
        (0, 0) => "FizzBuzz",
        (0, _) => "Fizz",
        (_, 0) => "Buzz",
        _ => i.ToString()
    });
}

4. LINQ Functional Style

var fizzBuzz = Enumerable.Range(1, 100)
    .Select(i => i % 15 == 0 ? "FizzBuzz" :
                 i % 3 == 0 ? "Fizz" :
                 i % 5 == 0 ? "Buzz" :
                 i.ToString());

foreach (var item in fizzBuzz) {
    Console.WriteLine(item);
}

การขยายโจทย์ (Extended FizzBuzz)

// กฎเพิ่มเติม: หาร 7 ลงตัว -> "Bang"
var rules = new Dictionary {
    { 3, "Fizz" },
    { 5, "Buzz" },
    { 7, "Bang" }
};

for (int i = 1; i <= 105; i++) {
    StringBuilder sb = new StringBuilder();
    foreach (var rule in rules) {
        if (i % rule.Key == 0) sb.Append(rule.Value);
    }
    Console.WriteLine(sb.Length > 0 ? sb.ToString() : i.ToString());
}

จุดสังเกตสำคัญ

  • ตรวจสอบ FizzBuzz (หาร 15) ก่อน Fizz และ Buzz เดียวๆ
  • ลำดับ if-else สำคัญมาก - ถ้าสลับจะผิด
  • ใช้ StringBuilder หรือ String Interpolation สำหรับ Performance
  • FizzBuzz ทดสอบ: Logic, Control Flow, Modulo Operator, String Handling