Chương 7
Kiu d liu cu trc
Mục tiêu - 1
Tìm hiểu kiểu dữ liệu cấu trúc và công dụng
Định nghĩa cấu trúc
Khai báo các biến kiểu cấu trúc
Cách truy cập vào các phần tử của cấu trúc
Khởi tạo biến cấu trúc
Sử dụng biến cấu trúc trong câu lệnh gán
Cách truyền tham số cấu trúc
Sử dụng mảng các cấu trúc
Tìm hiểu cách khởi tạo mảng các cấu trúc .
Con trỏ cấu trúc
Cách truyền tham số kiểu con trỏ cấu trúc
Cấu Trúc
Một cấu trúc bao gồm các thành phần dữ liệu, không
nhất thiết cùng kiểu, được nhóm lại với nhau.
1
Biến
I
L
L
U
S
I
O
N
Mảng
I L L U S I O N B A C H 1
Tên sách Tác giả
Lần
xuất bản
Định Nghĩa Cấu Trúc
Cú pháp định nghĩa câu trúc:
struct <Tên cấu trúc>
{
Khai bo các thnh phn dữ liệu;
};
Ví dụ:
struct Sach{
char TenSach [25];
char TacGia [20];
int NamXB;
float Gia;
};
Định Nghĩa Cấu Trúc
Một định định nghĩa cấu trúc:
Tạo ra kiểu dữ liệu mới.
Cho phép sử dụ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.
Khai Báo Biến Cấu Trúc
Khi một cấu trúc đã được định nghĩa, chúng ta có
thể khai báo một hoặc nhiều biến kiểu này.
Ví dụ:
struct Sach{
char TenSach[25];
char TacGia[20];
int NamXB;
float Gia;
} s1, s2;
struct Sach s1, s2;
hoặc
struct Sach s1;
struct Sach s2;
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 <Kiểu dữ liệu> <Tên mới>;
Ví dụ:
typedef int Int32;
typedef không thể sử dụng với storage classes
Sử dụng từ kháo typedef trong định nghĩa cấu trúc.
typedef struct
{
Khai bo các thnh phn dữ liệu;
} <Tên cấu trúc>;
Ví dụ:
typedef struct {
char TenSach [25];
char TacGia [20];
int NamXB;
float Gia;
}Sach;
Từ Khóa typedef
Các cấu trúc được định nghĩa với từ khóa typedef.
Không cần nhắc lại từ khóa struct khi khai báo biến
cấu trúc:
Từ Khóa typedef
typedef struct
{
int thuc;
int ao;
}SoPhuc;
SoPhuc sp;
Struct SoPhuc
{
int thuc;
int ao;
};
struct SoPhuc sp;
Khai Báo Biến Cấu Trúc
Bài tập 1: Viết chương trình:
Định nghĩa cấu trúc Sach.
Khai báo các biến cấu trúc Sach.
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ử (.) còn được gọi là toán tử thành viên -
membership.
Cú pháp:
<Tên biến cấu trúc>.<Tên thành phần>
Ví dụ:
scanf(“%s”, s1.TenSach);
Khởi Tạo Cấu Trúc
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
struct NhanVien {
int MaNV;
char TenNV [20];
};
Các biến nv1và nv2 có kiểu NhanVien có thể
được khai báo và khởi tạo như sau:
struct NhanVien nv1 = {100,“John”};
struct NhanVien nv2 = {101,“David”};
Khai Báo Biến Cấu Trúc
Bài tập 2: Viết chương trình:
Định nghĩa cấu trúc Sach.
Khai báo và khởi tạo giá trị cho các biến cấu
trúc Sach.
Hiển thị thông tin ra màn hình.
Khai Báo Biến Cấu Trúc
Bài tập 3: Viết chương trình:
Định nghĩa cấu trúc Sach.
Khai báo và nhập giá trị cho các biến cấu trúc
Sach.
Hiển thị thông tin ra màn hình.
Câu Lệnh Gán
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
Ví dụ, nếu s1 và s2 là các biến cấu trúc
có cùng kiểu, thì câu lệnh sau là hợp lệ
s2 = s1;
Khai Báo Biến Cấu Trúc
Bài tập 4: Viết chương trình:
Định nghĩa cấu trúc Sach.
Khai báo và nhập giá trị cho các biến cấu trúc
Sach.
Kiểm tra phép gán các biến cấu trúc.
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 tạo sẵn memcpy()
Cú pháp:
memcpy (void * destn, void *source, size_t size);
Ví dụ:
memcpy (&s2, &s1, sizeof(struct Sach));
Câu Lệnh Gán
Khai Báo Biến Cấu Trúc
Bài tập 5: Viết chương trình:
Định nghĩa cấu trúc Sach.
Khai báo và nhập giá trị cho các biến cấu trúc
Sach.
Sử dụng hàm memcpy để gán giá trị từ 1 biến
cấu trúc cho 1 biến cấu trúc khác.
Cấu Trúc Lồng Trong Cấu Trúc
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 Date{
int Ngay, Thang, Nam;
};
struct SinhVien {
int MaSV;
char HoTen[30];
struct Date NgaySinh;
}sv;
Cấu Trúc Lồng Trong Cấu Trúc
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,
sv.MaSV
Để 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 ,
sv.NgaySinh.Ngay
Cấu trúc lồng trong cấu trúc
Bài tập 6: Viết chương trình:
Định nghĩa cấu trúc SinhVien (MaSV, HoTen,
NgaySinh).
Khai báo và nhập giá trị cho biến cấu trúc
SinhVien.
Hiển thị thông tin ra màn hình.
Con Trỏ Đế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ỏ
struct Sach s;
ptr = &s;
printf(“%s”,ptr->TacGia);
Cú pháp khai báo con trỏ cấu trúc:
struct <Tên cấu trúc> * <Tên biến trỏ>
Ví dụ:
struct Sach *ptr;
Con Trỏ Đến Cấu Trúc
Cấp phát bộ nhớ
ptr = (struct Sach*) malloc (sizeof (Sach));
Truy xuất các thành phần của biến cấu trúc:
scanf (“%d”,ptr->NamXB);
Sử dụng con trỏ để tạo mới một biến cấu trúc:
Khai báo biến cần tạo ở dạng con trỏ
struct Sach *ptr;
Truyền tham số kiểu cấu trúc
Tham số của hàm có thể là một cấu trúc.
Là một phương tiện hữu dụng:
Để truyền một nhóm các thành phần dữ liệu có
quan hệ logic với nhau thông qua một biến.
Không cần phải truyền từng thành phần.
Hai hình thức:
Truyền theo tham trị.
Truyền theo tham chiếu.
Truyền tham số kiểu cấu trúc
Truyền tham trị.
Khai báo nguyên mẫu hàm:
func (struct <Tên cấu trúc> <Tên biến >);
Ví dụ:
void HienThi (struct Sach s);
Gọi hàm:
<Tên hàm> (<Tên biến cấu trúc>)
struct Sach s;
HienThi(s);