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

Chuyển số thập phân sang nhị phân trong C, C++

Trong bài học này, bạn sẽ chuyển một số nguyên dương từ hệ thập phân sang hệ nhị phân bằng cách chia liên tiếp cho 2.

Giới thiệu

Để chuyển một số sang hệ nhị phân, ta chia số đó cho 2 liên tiếp và ghi lại số dư sau mỗi lần chia. Các số dư chính là các chữ số nhị phân, nhưng được tìm ra theo thứ tự từ chữ số cuối cùng (hàng thấp nhất) lên chữ số đầu tiê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) {
    unsigned number = 13, value = number; int bits[32], count = 0;
    // Store remainders generated from right to left.
    do { bits[count++] = value % 2; value /= 2; } while (value);
    printf("%u = ", number); while (count) printf("%d", bits[--count]); puts("");
}
Kết quả khi chạy
13 = 1101
C++
Chạy code →
main.cpp
#include <bitset>
#include <iostream>
#include <string>
int main() {
    unsigned number = 13;
    // Remove leading zeroes from a fixed-width bitset string.
    std::string bits = std::bitset<32>(number).to_string();
    bits.erase(0, bits.find_first_not_of('0'));
    std::cout << number << " = " << bits << '\n';
}
Kết quả khi chạy
13 = 1101

So sánh C và C++

Vòng lặp do-while lưu số dư value % 2 vào mảng bits rồi chia value cho 2, cho đến khi value bằng 0. Dùng do-while để đảm bảo số 0 vẫn có ít nhất một chữ số. Vì phép chia tìm ra chữ số cuối trước, chương trình in mảng bits theo thứ tự ngược lại, nên 13 được in thành 1101.

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