Kĩ thuật lập trình - Chương 2: Kiểu dữ liệu có cấu trúc
Khái niệm Khai báo Cách truy xuất thành phần bên trong cấu trúc Xử lý cấu trúc đơn Xử lý mảng có cấu trúc Bài tập
Bạn đang xem trước 20 trang tài liệu Kĩ thuật lập trình - Chương 2: Kiểu dữ liệu có cấu trúc, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
VÕ QUANG HOÀNG KHANG
Email: vqhkhang@gmail.com
CHƯƠNG 2.
KIỂU DỮ LIỆU CÓ CẤU TRÚC
#2
NỘI DUNG
Khái niệm
Khai báo
Cách truy xuất thành phần bên trong cấu trúc
Xử lý cấu trúc đơn
Xử lý mảng có cấu trúc
Bài tập
#3
KHÁI NIỆM
Kiểu dữ liệu có cấu trúc là kiểu dữ liệu do lập trình
viên tự định nghĩa bằng cách gom nhóm các kiểu dữ
liệu cơ bản có sẵn trong C thành một kiểu dữ liệu
phức hợp gồm nhiều thành phần:
Khai báo
struct tên_struct
{
khai báo các thuộc tính;
};
typedef struct tên_struct TênKDL;
#4
KHÁI NIỆM
Ví dụ khai báo kiểu dữ liệu lưu thông tin của ngày:
struct ttDate
{
char thu[10];
int ngay;
int thang;
int nam;
};
typedef struct ttDate Date;
#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_thuộc_tính;
Ví dụ
Date x;
x.ngay = 5;
#6
TRUY CẬP CÁC THUỘC TÍNH CẤU TRÚC
Biến con trỏ kiểu cấu trúc
TÊNKDL *tên_biến_con_trỏ;
tên_biến_con_trỏ -> tên_thuộc_tính;
Ví dụ:
Date *x ;
x = (Date*) malloc(sizeof(Date));
x -> ngay = 5 ;
#7
KHAI BÁO ĐỆ QUY
struct tên_struct
{
khai báo các thuộc tính;
struct tên_struct *tên_thuộc_tính_đệ_qui;
};
#8
KHAI BÁO ĐỆ QUY
Ví dụ:
struct ttNode
{
int key;
struct ttNode *pNext;
};
#9
VÍ DỤ
Viết chương trình nhập vào toạ độ hai điểm trong mặt
phẳng và tính tổng hai toa ̣ độ này
struct ttDiem
{
int x;
int y;
};
typedef struct ttDiem Diem;
#10
VÍ DỤ
void Nhap (Diem &d)
{
printf(“\nNhap vao toa do diem\n”);
printf(“Hoanh do : “);
scanf(“%d”, &d. x);
printf(“Tung do : ”)
scanf(“%d”, &d.y);
}
#11
VÍ DỤ
void Xuat (Diem d)
{
printf(“\nToa do 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
VÍ DỤ
int main ()
{
Diem A , B, AB; //khai bao 3 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);
Xuat (AB);
return 0;
}
#13
BÀI TẬP 1
Viết chương trình nhập vào thông tin của một sinh viên
gồm:
Mã số sinh viên
Họ và tên
Điểm giữa 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:
GK*10%+TH*30%+LT*60%
#14
BÀI TẬP 2
Sử dụng kiểu dữ liệu có cấu trúc để khai báo và viết
chương trình (theo phương pháp thủ tục hàm) gồm các
chức năng sau:
1. Nhập vào 2 phân số
2. Tính tổng và tích hai phân số (kết quả phải là phân
số tối giản)
3. Xuất kết quả ra màn hình
#15
BÀI TẬP 3
Viết chương trình nhập vào 2 thời gian t1 và t2 (thông
tin thời gian gồm: giờ, phút và giây); tính khoảng cách
giữa t1 và t2 (đơn vị tính bằng giây)
#16
MẢNG CẤU TRÚC
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. Nhưng do từng phần tử có kiểu
cấu trúc nên phải chỉ định rõ cần lấy thành phần nào,
tức là phải truy cập đến thành phần cuối cùng có
kiểu là dữ liệu cơ bản
#17
NGUYÊN TẮC LẬP TRÌNH TRÊN MẢNG
CẤU TRÚC
Do kiểu dữ liệu có cấu trúc thường chứa rất nhiều
thành phần nên khi viết chương trình loại này 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.
17
#18
VÍ DỤ
Viết hàm nhập vào mảng các phân số
typedef struct ttPhanSo
{
int tu, mau;
}PhanSo;
#19
VÍ DỤ
void NhapPS(PhanSo &ps)
{
printf("Nhap tu so: ");
scanf("%d ”, , &ps.tu);
printf("\nNhap mau so: “);
scanf(“%d”, &ps.mau);
}
#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
BÀI TẬP 4
4.1. Viết chương trình nhập vào mảng các phân số,
cho biết phân số có giá trị lớn nhất trong mảng
4.2. Viết chương trình nhập vào danh sách các mặt
hàng, in ra 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á
- Xuất xứ
VÕ QUANG HOÀNG KHANG
Email: vqhkhang@gmail.com
CHƯƠNG 2(tt).
KIỂU DỮ LIỆU CÓ CẤU TRÚC
#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 trong cấu trúc
Gán dữ liệu kiểu cấu trúc
Cấu trúc lồng nhau
Kích thước của struct
Bài tập
#24
KHỞI TẠO CHO BIẾN CẤU TRÚC
Cú pháp khai báo
Ví dụ
struct
{
;
;
} = {,,};
struct DIEM
{
int x;
int y;
} diem1 = {2912, 1706}, diem2;
#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 toán tử thành phần cấu trúc . hay còn
gọi là toán tử chấm (dot operation)
Ví dụ
.
struct DIEM
{
int x;
int y;
} diem1;
printf(“x = %d, y = %d”, diem1.x, diem1.y);
#26
GÁN DỮ LIỆU KIỂU CẤU TRÚC
Có 2 cách
Ví dụ
= ;
. = ;
struct DIEM
{
int x, y;
} diem1 = {2912, 1706}, diem2;
diem2 = diem1;
diem2.x = diem1.x;
diem2.y = diem1.y * 2;
#27
CẤU TRÚC PHỨC TẠP
Thành phần của cấu trúc là cấu trúc khác
struct DIEM
{
int x;
int y;
};
struct HINHCHUNHAT
{
struct DIEM traitren;
struct DIEM phaiduoi;
} hcn1;
hcn1.traitren.x = 2912;
hcn1.traitren.y = 1706;
#28
CẤU TRÚC PHỨC TẠP
Thành phần của cấu trúc là mảng
struct SINHVIEN
{
char hoten[30];
float toan, ly, hoa;
} sv1;
strcpy(sv1.hoten, “Nguyen Van A”);
sv1.toan = 10;
sv1.ly = 6.5;
sv1.hoa = 9;
#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;
struct NODE *pNext;
};
#30
CẤU TRÚC PHỨC TẠP
Thành phần của 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;
};
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
#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;
};
sizeof(B2) = ???
#32
Chỉ thị #pragma pack
Chỉ thị #pragma pack (n)
n = 1, 2, 4, 8, 16 (byte)
Biên lớn nhất của các thành phần trong struct
BC n mặc định là 1
VC++ n mặc định là 8
Project settings Compile Option C/C++
Code Generation Structure Alignment
Canh biên cho 1 cấu trúc
#pragma pack(push, 1)
struct MYSTRUCT { };
#pragma pack(pop)
#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;
};
a a a a a a a a
b b b b c c c c
b b b b đệm 4B
a a a a a a a a
c c c c đệm 4B
b b b b c c c c
a a a a a a a a
#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++, có thể bỏ từ khóa struct khi khai báo
biến (hoặc sử dụng typedef)
Khi nhập các biến kiểu số thực trong 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;
float temp; scanf(“%f”, &temp); d1.x = temp;
#35
MẢNG CẤU TRÚC
Mảng cấu trúc
Tương tự như mảng với kiểu dữ liệu cơ sở (char,
int, float, )
struct DIEM
{
int x;
int y;
};
DIEM mang1[20];
DIEM mang2[10] = {{3, 2}, {4, 4}, {2, 7}};
#36
TRUYỀN CẤU TRÚC CHO HÀM
Truyền cấu trúc cho hàm
Giống như truyền kiểu dữ liệu cơ sở
Tham trị (không thay đổi sau khi 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) { };
void xuat3(DIEM &diem) { };
void xuat4(DIEM *diem) { };
#37
KIỂU UNION
Khái niệm
Được khai báo và sử dụng như cấu trúc
Các thành phần của union có chung địa chỉ đầu
(nằm chồng lên nhau trong bộ nhớ)
Khai báo
union
{
;
;
};
#38
0 1 2 3 4
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
0 1 2 3
012 00 00 00
#39
Ví dụ
struct trong 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];
};
} date = {“29/12/89”};
#40
Ví dụ
union trong struct
struct generic_tag
{
char type;
union share_tag
{
char c;
int i;
float f;
};
};
#41
Q&A