Cách khai báo tương tự như mảng một chiều (Kiểu dữ liệu bây giờ là kiểu dữ liệu có cấu trúc). Cách truy cập phần tử trong mảng cũng như truy cập trên mảng một chiều.[r]
(1)CHƯƠNG
(2)#2
NỘI DUNG
Khái niệm Khai báo
Cách truy xuất thành phần bên cấu trúc Xử lý cấu trúc đơn
(3)#3
KHÁI NIỆM
Kiểu liệu có cấu trúc kiểu liệu lập trình viên tự định nghĩa bằng cách gom nhóm kiểu liệu có sẵn C thành mợt kiểu liệu phức hợp gồm nhiều thành phần:
Khai báo
struct tên_struct {
khai báo tḥc tính; };
(4)#4
KHÁI NIỆM
Ví dụ khai báo kiểu liệu lưu thông tin ngày: struct ttDate
{
char thu[10]; int ngay;
int thang; int nam; };
(5)#5
TRUY CẬP CÁC THUỘC TÍNH CẤU TRÚC
Biến kiểu cấu trúc
TÊNKDL tên_biến;
tên_biến.tên_tḥc_tính;
Ví dụ
Date x;
(6)#6
TRUY CẬP CÁC THUỘC TÍNH CẤU TRÚC
Biến trỏ kiểu cấu trúc
TÊNKDL *tên_biến_con_trỏ;
tên_biến_con_trỏ -> tên_tḥc_tính; Ví dụ:
Date *x ;
(7)#7
KHAI BÁO ĐỆ QUY
struct tên_struct {
khai báo tḥc tính;
(8)#8
KHAI BÁO ĐỆ QUY
Ví dụ:
struct ttNode {
int key;
(9)#9
VÍ DỤ
Viết chương trình nhập vào toạ độ hai điểm mặt phẳng và tính tổng hai toạ độ này
struct ttDiem {
int x; int y; };
(10)#10
VÍ DỤ
void Nhap (Diem &d) {
printf(“\nNhap vao toa diem\n”); printf(“Hoanh : “);
(11)#11
VÍ DỤ
void Xuat (Diem d) {
printf(“\nToa diem : (%d, %d)”, d.x, d.y); }
Diem Tong (Diem d1, Diem d2) {
Diem temp;
temp.x = d1.x + d2.x ; temp.y = d1.y + d2.y ; return temp;
(12)#12
VÍ DỤ
int main () {
Diem A , B, AB; //khai bao diem A, B, AB; Nhap (A);
Xuat (A); Nhap (B); Xuat (B);
printf(“\n Tong cua hai diem vua nhap la : ”); AB = Tong (A, B);
(13)#13
BÀI TẬP 1
Viết chương trình nhập vào thơng tin một sinh viên gồm: Mã số sinh viên
Họ tên
Điểm kỳ (GK) Điểm thực hành (TH) Điểm lý thuyết (LT) Điểm tổng kết
Tính điểm tổng kết mơn theo cơng thức:
(14)#14
BÀI TẬP 2
Sử dụng kiểu liệu có cấu trúc để khai báo viết chương trình (theo phương pháp thủ tục hàm) gồm chức sau:
1 Nhập vào phân số
2 Tính tổng tích hai phân số (kết phải là phân số tối giản)
(15)#15
BÀI TẬP 3
(16)#16
MẢNG CẤU TRÚC
Cách khai báo tương tự mảng một chiều (Kiểu liệu kiểu liệu có cấu trúc)
(17)#17
NGUYÊN TẮC LẬP TRÌNH TRÊN MẢNG CẤU TRÚC
Do kiểu liệu có cấu trúc thường chứa nhiều thành phần nên viết chương trình loại ta cần lưu ý:
Xây dựng hàm xử ý cho một kiểu cấu trúc.
Muốn xử lý cho mảng cấu trúc, ta gọi lại hàm xử lý cho một kiểu cấu trúc đã được xây dựng bằng cách dùng vòng lặp
(18)#18
VÍ DỤ
Viết hàm nhập vào mảng phân số
typedef struct ttPhanSo {
(19)#19
VÍ DỤ
void NhapPS(PhanSo &ps) {
printf("Nhap tu so: ");
scanf("%d ”, , &ps.tu);
(20)#20
VÍ DỤ
void NhapMangPS(PHANSO dsps[], int n) {
for(int i=0; i<n; i++) {
printf(”\nNhap vao phan so thu %d: “, i+1); NhapPS(dsps[i]);
(21)#21
BÀI TẬP 4
4.1 Viết chương trình nhập vào mảng phân số, cho biết phân số có giá trị lớn mảng
4.2 Viết chương trình nhập vào danh sách mặt hàng, in mặt hàng có xuất xứ “VietNam”, biết thơng tin mặt hàng gồm:
- Mã mặt hàng - Tên mặt hàng - Đơn giá
(22)VÕ QUANG HOÀNG KHANG
Email: vqhkhang@gmail.com
CHƯƠNG 2(tt)
(23)#23
MỘT SỐ LƯU Ý
Khởi tạo cho biến cấu trúc
Truy xuất thành phần bên cấu trúc Gán liệu kiểu cấu trúc
(24)#24
KHỞI TẠO CHO BIẾN CẤU TRÚC
Cú pháp khai báo
Ví dụ
struct <tên kiểu cấu trúc> {
<kiểu liệu> <tên thành phần 1>; …
<kiểu liệu> <tên thành phần n>;
} <tên biến> = {<giá trị 1>,…,<giá trị n>};
struct DIEM {
int x; int y;
(25)#25
TRUY XUẤT DỮ LIỆU KIỂU CẤU TRÚC
Đặc điểm
Không thể truy xuất trực tiếp
Thơng qua tốn tử thành phần cấu trúc hay cịn
gọi tốn tử chấm (dot operation)
Ví dụ
<tên biến cấu trúc>.<tên thành phần>
struct DIEM {
int x; int y; } diem1;
(26)#26
GÁN DỮ LIỆU KIỂU CẤU TRÚC
Có cách
Ví dụ
<biến cấu trúc đích> = <biến cấu trúc nguồn>;
<biến cấu trúc đích>.<tên thành phần> = <giá trị>;
struct DIEM {
int x, y;
} diem1 = {2912, 1706}, diem2; …
diem2 = diem1;
diem2.x = diem1.x;
(27)#27
CẤU TRÚC PHỨC TẠP
Thành phần cấu trúc cấu trúc khác struct DIEM
{
int x; int y; };
struct HINHCHUNHAT {
struct DIEM traitren; struct DIEM phaiduoi; } hcn1;
…
(28)#28
CẤU TRÚC PHỨC TẠP
Thành phần cấu trúc mảng struct SINHVIEN
{
char hoten[30];
float toan, ly, hoa; } sv1;
…
strcpy(sv1.hoten, “Nguyen Van A”); sv1.toan = 10;
(29)#29
CẤU TRÚC PHỨC TẠP
Cấu trúc đệ quy (tự trỏ) struct PERSON
{
char hoten[30];
struct PERSON *father, *mother; };
struct NODE
{
int value;
(30)#30
CẤU TRÚC PHỨC TẠP
Thành phần cấu trúc có kích thước theo bit struct bit_fields
{
int bit_0 : 1;
int bit_1_to_4 : 4;
int bit_5 : 1;
int bit_6_to_15 : 10; };
(31)#31
KÍCH THƯỚC CỦA STRUCT
Ví dụ struct A
{
int a;
double b; };
sizeof(A) = ??? struct B1
{
int a; int b;
double c; };
sizeof(B1) = ???
struct B2
{
int a;
double c; int b;
};
(32)#32
Chỉ thị #pragma pack Chỉ thị #pragma pack (n)
n = 1, 2, 4, 8, 16 (byte)
Biên lớn thành phần struct BC n mặc định 1
VC++ n mặc định 8
Project settings Compile Option C/C++ Code
Generation Structure Alignment
Canh biên cho cấu trúc
#pragma pack(push, 1)
struct MYSTRUCT { … };
(33)#33
#pragma pack
Ví dụ: khơng có #pragma pack (1)
struct A { double a; int b;
int c; };
struct B { int b;
double a; int c;
};
struct C { int b; int c;
double a; };
(34)#34
CÁC LƯU Ý VỀ CẤU TRÚC
Lưu ý
Kiểu cấu trúc được định nghĩa để làm khuôn dạng
còn biến cấu trúc được khai báo để sử dụng khuôn dạng định nghĩa
Trong C++, bỏ từ khóa struct khai báo
biến (hoặc sử dụng typedef)
Khi nhập biến kiểu số thực cấu trúc
phải nhập thông qua một biến trung gian
NMLT - Cấu trúc
struct DIEM { float x, y;} d1;
(35)#35
MẢNG CẤU TRÚC
Mảng cấu trúc
Tương tự mảng với kiểu liệu sở (char,
int, float, …)
struct DIEM
{
int x; int y; };
DIEM mang1[20];
(36)#36
TRUYỀN CẤU TRÚC CHO HÀM
Truyền cấu trúc cho hàm
Giống truyền kiểu liệu sở
Tham trị (không thay đổi sau kết thúc hàm) Tham chiếu
Con trỏ Ví dụ
struct DIEM { int x, y; };
void xuat1(int x, int y) { … }; void xuat2(DIEM diem) { … };
(37)#37
KIỂU UNION
Khái niệm
Được khai báo sử dụng cấu trúc
Các thành phần union có chung địa chỉ đầu
(nằm chồng lên bộ nhớ)
Khai báo
union <tên kiểu union> {
<kiểu liệu> <tên thành phần 1>; …
(38)#38
… … … …
SO SÁNH STRUCT VÀ UNION
Ví dụ struct MYSTRUCT { char c; int n; } s;
s.c = 1; s.n = 2;
union MYUNION {
char c; int n; } u;
u.c = 1; u.n = 2;
01 02 00 00 00
c n
… c
n
… … … … … 01
(39)#39
Ví dụ
struct union union date_tag
{
char full_date[9]; struct part_date_tag {
char month[2];
char break_value1; char day[2];
char break_value2; char year[2];
};
(40)#40
Ví dụ
union struct struct generic_tag {
char type;
union share_tag {
char c; int i; float f; };
(41)#41