Bài tập C/C++ cho người mới

Bài toán FizzBuzz trong C, C++

Trong bài học này, bạn sẽ in Fizz, Buzz hoặc FizzBuzz cho các số từ 1 đến 15 bằng vòng lặp và các câu lệnh điều kiện.

Giới thiệu

FizzBuzz là bài tập lập trình kinh điển: với mỗi số từ 1 đến 15, in Fizz nếu chia hết cho 3, Buzz nếu chia hết cho 5, FizzBuzz nếu chia hết cho cả hai, còn lại thì in chính số đó. Bài tập giúp luyện vòng lặp, phép chia lấy dư và thứ tự kiểm tra điều kiện.

Những điểm quan trọng

  • Luôn bật cảnh báo của trình biên dịch (compiler warning) và sửa hết các cảnh báo.
  • Hiểu rõ kiểu dữ liệu và thời gian tồn tại (lifetime) của từng giá trị.
  • Luôn kiểm tra dữ liệu đầu vào và giới hạn chỉ số của mảng.

Code ví dụ bằng C và C++

C
Chạy code →
main.c
#include <stdio.h>
int main(void) {
    for (int n = 1; n <= 15; ++n) {
        // Check the most specific condition first.
        if (n % 15 == 0) puts("FizzBuzz");
        else if (n % 3 == 0) puts("Fizz");
        else if (n % 5 == 0) puts("Buzz");
        else printf("%d\n", n);
    }
}
Kết quả khi chạy
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
C++
Chạy code →
main.cpp
#include <iostream>
int main() {
    for (int n = 1; n <= 15; ++n) {
        // Check the most specific condition first.
        if (n % 15 == 0) std::cout << "FizzBuzz\n";
        else if (n % 3 == 0) std::cout << "Fizz\n";
        else if (n % 5 == 0) std::cout << "Buzz\n";
        else std::cout << n << '\n';
    }
}
Kết quả khi chạy
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz

So sánh C và C++

Điều kiện n % 15 == 0, tức chia hết cho cả 3 và 5, phải được kiểm tra đầu tiên. Nếu kiểm tra chia hết cho 3 trước, số 15 sẽ bị in thành Fizz và không bao giờ đến được nhánh FizzBuzz. Thứ tự từ điều kiện cụ thể nhất đến điều kiện chung nhất là điểm mấu chốt của bài này.

C

C dùng các hàm thủ tục gọn nhẹ và thể hiện rõ cách dữ liệu được biểu diễn trong bộ nhớ.

C++

C++ vẫn cho phép làm việc ở mức thấp nhưng bổ sung các kiểu dữ liệu thư viện và công cụ trừu tượng an toàn hơn.

Bài tập mở rộng

Hãy chạy cả hai phiên bản, sau đó thử thay đổi code để quan sát sự khác biệt về mức độ an toàn mà mỗi ngôn ngữ mang lại.

  • Thử nhập dữ liệu sai và các giá trị ở biên.
  • Biên dịch với các cờ -Wall -Wextra -Wpedantic để bật thêm cảnh báo.
  • Tách phần khai báo dùng chung ra file header và phần cài đặt ra file riêng.

Luyện tập với thử thách

Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.

Tất cả thử thách