Cho các khai báo sau. Hãy chọn Câu đúng nhất: struct ngay { int ng, th, n; } vaotruong, ratruong; typedef struct sinhvien { char hoten; ngay ngaysinh; };
Trả lời:
Đáp án đúng: B
Đầu tiên, ta phân tích các khai báo:
- `struct ngay { int ng, th, n; } vaotruong, ratruong;` Khai báo một cấu trúc có tên là `ngay` với ba thành viên kiểu `int`: `ng`, `th`, `n`. Đồng thời, khai báo hai biến cấu trúc `vaotruong` và `ratruong` thuộc kiểu `struct ngay`.
- `typedef struct sinhvien { char hoten; ngay ngaysinh; };` Khai báo một cấu trúc có tên `sinhvien` với một thành viên kiểu `char` là `hoten` và một thành viên kiểu `ngay` là `ngaysinh`. `typedef` tạo ra một bí danh cho kiểu `struct sinhvien`, cho phép sử dụng `sinhvien` như một kiểu dữ liệu.
Đánh giá các phương án:
- A. Không được phép gán: vaotruong = ratruong;
- Vì `vaotruong` và `ratruong` cùng kiểu `struct ngay` nên phép gán này hoàn toàn hợp lệ. Do đó, A sai.
- B. “sinhvien” là tên cấu trúc, “vaotruong”, “ratruong” là tên biến cấu trúc.
- `sinhvien` là tên kiểu (sau khi typedef), `vaotruong` và `ratruong` là tên biến cấu trúc kiểu `struct ngay`. Do đó, B đúng.
- C. Có thể viết “vaotruong.ng”, “ratruong.th”, “sinhvien.vaotruong.n” để truy xuất đến các thành phần tương ứng.
- `vaotruong.ng` và `ratruong.th` là đúng vì `vaotruong` và `ratruong` là biến cấu trúc `ngay` nên có thể truy xuất đến các thành phần `ng`, `th` của nó. Tuy nhiên, `sinhvien.vaotruong.n` là sai vì `sinhvien` là một kiểu cấu trúc, không phải là một biến cấu trúc, và cũng không có thành phần nào tên là `vaotruong`. Để truy xuất đến ngày, tháng, năm sinh của một sinh viên, ta cần phải khai báo một biến kiểu `sinhvien` (ví dụ: `sinhvien sv;`) và truy xuất thông qua `sv.ngaysinh.n`. Do đó, C sai.
- D. A, B, C đều đúng
- Vì A và C sai nên D sai.
Vậy đáp án đúng nhất là B.





