Struct là một kiểu dữ liệu bao gồm nhiều thành phần có thể thuộc nhiều kiểu dữ liệu khác nhau. Các thành phần được truy nhập thông qua một tên.
Khái niệm cấu trúc
Một cấu trúc bao gồm các mẫu dữ liệu (không nhất thiết cùng kiểu) được nhóm lại với nhau.
Việc định nghĩa cấu trúc sẽ tạo ra kiểu dữ liệu mới cho phép người dùng sử dụng chúng để khai báo các biến kiểu cấu trúc.
Các biến trong cấu trúc được gọi là các phần tử của cấu trúc hay thành phần của cấu trúc
struct cat
char bk_name [25];
char author [20];
int edn;
float price;
};
Khai báo biến cấu trúc
– Ví dụ: struct cat books1;
– Câu lệnh này sẽ dành đủ vùng nhớ để lưu trữ tất cả các mục trong một cấu trúc.
Khởi tạo cấu trúc
- Giống như các biến khác và mảng, các biến kiểu cấu trúc có thể được khởi tạo tại thời điểm khai báo
{
};
- Các biến emp1 và emp2 có kiểu employee có thể được khai báo và khởi tạo như sau:
struct employee emp1 = {346, “Abraham”};
struct employee emp2 = {347, “John”};
Truy cập phần tử của cấu trúc
- Các phần tử của cấu trúc được truy cập thông qua việc sử dụng toán tử chấm (.), toán tử này còn được gọi là toán tử thành viên – membership.
- Cú pháp:
structure_name.element_name
- Ví dụ:
scanf(“%s”, books1.bk_name);
Gán sử dụng cấu trúc
- Có thể sử dụng câu lệnh gán đơn giản để gán giá trị của một biến cấu trúc cho một biến khác có cùng kiểu
- Chẳng hạn, nếu books1 và books2 là các biến cấu trúc có cùng kiểu, thì câu lệnh sau là hợp lệ
books2 = books1;
Sao chép cấu trúc
- Do kiểu dữ liệu cấu trúc là phức tạp nên trong một số trường hợp không thể dùng câu lệnh gán trực tiếp, thì có thể sử dụng hàm memcpy(), đây là hàm có sẵn trong thư viện lập trình
- Cú pháp:
memcpy (char * destn, char &source, int nbytes);
- Ví dụ:
memcpy (&books2, &books1, sizeof(struct cat));
Cấu trúc lồng nhau
- Một cấu trúc có thể lồng trong một cấu trúc khác. Tuy nhiên, một cấu trúc không thể lồng trong chính nó.
struct issue
{
char borrower [20];
char dt_of_issue[8];
struct cat books;
}issl;
- Việc truy cập vào các phần tử của cấu trúc này tương tự như với cấu trúc bình thường khác,
- Để truy cập vào phần tử của cấu trúc cat là một phần của cấu trúc issl
Mảng cấu trúc
- Một kiểu cấu trúc phải được định nghĩa trước, sau đó một biến mảng có kiểu cấu trúc tương ứng mới được khai báo
- Để truy cập vào thành phần author của phần tử thứ tư của mảng books ta làm như sau:
books[4].author
Khởi tạo các mảng cấu trúc
- Mảng cấu trúc được khởi tạo bằng cách liệt kê danh sách các giá trị phần tử của nó dưới dạng liệt kê
- Ví dụ:
int i;
struct unit series [3] ={{‘a’, 100}{‘b’, 200}{‘c’, 300}};
Con trỏ đến cấu trúc
- Con trỏ cấu trúc được khai báo bằng cách đặt dấu * trước tên của biến cấu trúc.
- Toán tử -> được dùng để truy cập vào các phần tử của một cấu trúc sử dụng một con trỏ
-
Ví dụ:
printf(“%s”,ptr_bk->author);
- Con trỏ cấu trúc được truyền vào hàm, cho phép hàm thay đổi trực tiếp các phần tử của cấu trúc.
Từ khóa typedef
- Một kiểu dữ liệu có thể được định nghĩa bằng cách sử dụng từ khóa typedef
- Nó không tạo ra một kiểu dữ liệu mới, mà định nghĩa một tên mới cho một kiểu đã có.
- Cú pháp: typedef type name;
- Ví dụ: typedef float deci;
- typedef không thể sử dụng với storage classes
Các cách Khai báo struct
Cách 1:
Ví dụ:
Cách 2:
Ví dụ:
Bài tập có hướng dẫn
Bài1: Khai báo cấu trúc HinhChuNhat cần thiết lưu trữ thông tin hình chữ nhật, sau đó thực hiện các chức năng: (Lưu ý: Viết chương trình dạng hàm).
Yêu cầu:
2.Xuất thông tin cho kiểu dữ liệu HinhChuNhat.
3.Tính chu vi hình chữ nhật
4.Tính diện tích hình chữ nhật
Hướng dẫn:
Bước 1: Tạo project mới (có thể xem lại bài viết Hướng dẫn Tạo Project Visual C++ trong Visual Studio 2012 Hoặc Hướng dẫn Dev-C++ căn bản)
Bước 2: Khai báo thêm các thư viện cơ bản cho chương trình.
#include <conio.h> #include <stdio.h>
Bước 3: Khai báo struct HinhChuNhat cho chương trình.
struct HinhChuNhat { int Dai; int Rong; };
Bước 4: Viết các khai báo nguyên mẫu hàm cho chương trình như sau:
void NhapThongTinHCN(HinhChuNhat &pHcn); void XuatThongTinHCN(HinhChuNhat pHcn); void TinhChuViHcn(HinhChuNhat pHcn); void TinhDienTichHcn(HinhChuNhat pHcn);
Bước 5: Viết hàm main để thực thi chương trình.
void main() { HinhChuNhat hinhchunhat; NhapThongTinHCN(hinhchunhat); XuatThongTinHCN(hinhchunhat); TinhChuViHcn(hinhchunhat); TinhDienTichHcn(hinhchunhat); getch(); }
Bước 6: Viết các định nghĩa hàm cần thiết cho chương trình như sau:
void NhapThongTinHCN(HinhChuNhat &pHcn) { printf("Moi ban nhap chieu dai hcn="); scanf_s("%d",&pHcn.Dai); printf("Moi ban nhap chieu rong hcn="); scanf_s("%d",&pHcn.Rong); } //================================ void XuatThongTinHCN(HinhChuNhat pHcn) { printf("Chieu dai hcn la=%d",pHcn.Dai); printf("\nChieu rong hcn la=%d",pHcn.Rong); } //=============================== void TinhChuViHcn(HinhChuNhat pHcn) { printf("\nChu vi hcn la=%d",(pHcn.Dai+pHcn.Rong)*2); } //================================ void TinhDienTichHcn(HinhChuNhat pHcn) { printf("\nDien tich hcn la=%d",pHcn.Dai*pHcn.Rong); }
Bài tập tương tự
1. Khai báo cấu trúc PhanSo cần thiết lưu trữ thông tin phân số, sau đó thực hiện các chức năng:
Viết hàm xuất phân số.
Kiểm tra phân số mẫu phải khác 0.
Viết hàm tối giản phân số.
Viết hàm quy đồng 2 phân số.
Nhập vào 2 phân số. Tính tổng, hiệu, tích và thương của hai phân số.
2. Khai báo cấu trúc NhanVien lưu trữ thông tin:
Tên nhân viên
Số ngày công
Lương 1 ngày công
Chức vụ
Sau đó thực hiện các chức năng:
Tính lương cho 1 nhân viên theo công thức : Luong= Số ngày công * Lương 1 ngày công.
Tính tiền thưởng cho nhân viên, biết rằng thưởng 50$ cho nhân viên làm trên 24 ngày.
Tính tiền phụ cấp chức vụ:
Phó giám đốc: 80$
Trưởng phòng: 40$
Phó phòng: 20$
Tính tiền lương thực lãnh cho nhân viên bằng lương + thưởng + phụ cấp chức vụ.
3. Hãy khai báo một cấu trúc mô tả một điểm trên tọa độ xOy. Sau đó viết hàm thực hiện các chức năng sau:
Kiểm tra điểm có nằm trên trục tung/trục hoành.
Tính khoảng cách giữa 2 điểm.
Tìm điểm đối xứng của 1 điểm qua trục tung/trục hoành
4. Cho thông tin điểm các môn học sau: NNLT, Tin học, Toán A1. Hãy khai báo một cấu trúc mô tả điểm các môn học của 1 sinh viên. Sau đó viết hàm thực hiện các chức năng sau:
Tính điểm trung bình 3 môn.
Xếp loại cho sinh viên đó theo điều kiện:
Giỏi với: 8.0<=ĐTB<9
Khá với: 6.5<=ĐTB<8.0
Trung bình: 5.0<=ĐTB<6.5
Yếu: ĐTB<5
Xem thêm: Mảng Struct và ví dụ ứng dụng