Trong nhiều trường hợp, chúng ta cần lưu trữ một nhóm các biến dữ liệu khác nhau (int, float, char, string,…). Ngôn ngữ C++ có hỗ trợ lập trình viên tạo ra kiểu dữ liệu cấu trúc (struct) để thực hiện lưu trữ như thế. Bài này sẽ giới thiệu định nghĩa và cách khai báo biến cấu trúc.
1. Tại sao phải sử dụng kiểu dữ liệu cấu trúc (struct)?
Cần viết chương trình lưu thông tin 1 sinh viên gồm các thông tin:
- MSSV: kiểu chuỗi
- Tên SV: kiểu chuỗi
- Ngày sinh: kiểu chuỗi
- Phái: kiểu luận lý
- Điểm Toán, Lý, Hóa: kiểu số thực
Khai báo các biến lưu thông tin 1 sinh viên
- string mssv; // “0306201123”
- string hoten; // “Nguyễn Văn Minh”
- string ngaysinh; // “16/08/2002”
- bool phai; // true: Nữ, false: Nam
- float Toan, Ly, Hoa; //8.5, 9, 7.5
Nếu cần lưu thông tin của 10 sinh viên hoặc hơn thì phải làm thế nào? Một sinh viên tạo 7 biến, không lẻ phải tạo 7×10 = 70 biến để lưu 10 sinh viên?
Giải pháp: Gom những thông tin của cùng một sinh viên thành một kiểu dữ liệu mới. Đó là kiểu dữ liệu cấu trúc (struct).
2. Khái niệm kiểu dữ liệu cấu trúc (struct)
Kiểu dữ liệu cấu trúc (struct) là một nhóm các thành phần dữ liệu, được gom lại với nhau và đặt trong một tên. Trong đó:
– Mỗi thành phần dữ liệu gọi là trường dữ liệu hoặc thành viên.
– Các trường dữ liệu có thể có kiểu dữ liệu khác nhau.
– Lập trình viên tự định nghĩa kiểu dữ liệu cấu trúc gồm những thành phần dữ liệu.
3. Định nghĩa kiểu dữ liệu cấu trúc (struct) trong C++
Cú pháp định nghĩa một kiểu dữ liệu cấu trúc mới
struct <tên kiểu cấu trúc>
{
<kiểu dữ liệu> <tên thành phần 1>;
…
<kiểu dữ liệu> <tên thành phần n>;
};//lưu ý phải có dấu ;
Ví dụ:
struct DIEM
{
int x;
int y;
};
struct SINHVIEN
{
string mssv;
string hoten;
string ngaysinh;
bool phai;
float Toan, Ly, Hoa;
};
Muốn sử dụng các kiểu cấu trúc đã định nghĩa để lưu trữ dữ liệu thì cần tạo ra các biến của kiểu cấu trúc đó. Cú pháp khai báo biến của kiểu cấu trúc là:
<tên kiểu cấu trúc> <tên biến cấu trúc>;
Ví dụ:
DIEM d1, d2;
SINHVIEN sv1, sv2;
Định nghĩa kiểu cấu trúc và khai báo biến cấu trúc cùng lúc
Việc khai báo biến cấu trúc có thể được thực hiện đồng thời với việc định nghĩa cấu trúc. Muốn vậy, cần đặt danh sách tên biến cấu trúc cần khai báo sau dấu } theo cú pháp sau:
struct <tên kiểu cấu trúc>
{
<kiểu dữ liệu> <tên thành phần 1>;
…
<kiểu dữ liệu> <tên thành phần n>;
} <tên biến 1>, <tên biến 2>,…, <tên biến m>;
Ví dụ:
struct DIEM
{
int x;
int y;
} d1, d2;
struct SINHVIEN
{
string mssv;
string hoten;
string ngaysinh;
bool phai;
float Toan, Ly, Hoa;
} sv1, sv2;
Khởi tạo giá trị cho biến cấu trúc
Cú pháp khởi tạo giá trị cho biến cấu trúc
<tên biến cấu trúc> = {<giá trị 1>,…,<giá trị n>};
– Khởi tạo biến cấu trúc khi định nghĩa cấu trúc
struct DIEM
{
int x;
int y;
} d1 = {5, 9}, d2 = {1, 1};
– Khởi tạo biến cấu trúc khi khai báo biến cấu trúc
struct DIEM
{
int x;
int y;
};
DIEM d1 = {5, 9};
DIEM d2 = {1, 1};
Lưu ý: Có thể chỉ khởi tạo giá trị cho một số thành phần dữ liệu đầu tiên trong cấu trúc
DIEM d1 = {99};//chỉ khởi tạo giá trị cho x = 99, y không được khởi tạo. y sẽ nhận giá trị mặc định hoặc giá trị rác.
4. Một số lưu ý khi định nghĩa kiểu cấu trúc và khai báo biến cấu trúc
Thiếu dấu ; khi định nghĩa kiểu cấu trúc
struct DIEM
{
int x;
int y;
}//lỗi thiếu dấu ;
Khởi tạo biến cấu trúc sau khi khai báo sẽ gây lỗi
struct DIEM
{
int x;
int y;
}d1, d2;
d1 = {1, 5};//lỗi
DIEM d3;
d3 = {1, 9};//lỗi
Không thể khởi tạo các thành phần cấu trúc trong khi định nghĩa cấu trúc
struct HINH_TRON
{
float x = 5.5; //Không hợp lệ
float y = 3.2; //Không hợp lệ
float BanKinh = 6; //Không hợp lệ
};