Chương 7 Kiểu dữ liệu cấu trúc Mục tiêu 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
Trang 1Chương 7
Kiểu dữ liệu cấu trúc
Trang 2Mụ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
Trang 5Đị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
Trang 6Khai 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
Trang 7 typedef không thể sử dụng với storage classes
Trang 8Sử dụng từ kháo typedef trong định nghĩa cấu trúc
Trang 9Cá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 {
Trang 10Khai 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
Trang 11Truy 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
Trang 12Khở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”};
Trang 13Khai 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
Trang 14Khai 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
Trang 15Câ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ệ
Trang 16Khai 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
Trang 17Trường hợp không thể dùng câu lệnh gán trực tiếp, thì
Trang 18Khai 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
Trang 19Cấ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ó
Trang 20Cấ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
Trang 21Cấ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,
Trang 22Con 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;
Trang 23Con 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;
Trang 24Truyề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
Trang 25Truyề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 >);
Trang 26Truyền tham số kiểu cấu trúc
Khai báo nguyên mẫu hàm:
func (struct <Tên cấu trúc> & <Tên biến >);
Trang 27Truyền tham số kiểu cấu trúc
Khai báo nguyên mẫu hàm:
func (struct <Tên cấu trúc> * <Tên biến >);
void Nhap (struct Sach * s );
Trang 28 Bài tập 7: Viết chương trình ở dạng hàm:
Đị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
Truyền tham số kiểu cấu trúc
Trang 29Mả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 đó mới được khai báo
Cú pháp:
struct <Tên cấu trúc> <Tên mảng> [số phần tử]
Ví dụ: struct Sach SAry[50];
Để truy cập vào thành phần TenSach của
phần tử thứ tư của mảng SAry:
SAry[4].TenSach;
Trang 30Khở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ó trong một cặp dấu móc
Trang 31Con trỏ và mảng Cấu Trúc
Cấp phát bộ nhớ động cho 1 mảng cấu trúc
Khai báo mảng dưới dạng con trỏ:
struct Sach *SAry;
Cấp phát bộ nhớ:
SAry = (struct Sach*) malloc (n*sizeof(Sach))
Ví dụ:
+ Truy xuất đến phần tử thứ i của mảng: Sary[i];
Trang 32Mảng cấu trúc
Truyền mảng cấu trúc vào hàm
Nguyên mẫu hàm:
func (struct <Tên cấu trúc> SAry[]);
Hoặc func (struct <Tên cấu trúc> SAry[100]);
Hoặc func (struct <Tên cấu trúc> *SAry);
Gọi hàm:
func (SAry);