Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (322.77 KB, 41 trang )
<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>
#2
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
#3
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 tḥc tính;
};
#4
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;
};
#5
Biến kiểu cấu trúc
<b>TÊNKDL</b> tên_biến;
tên_biến<b>.</b>tên_tḥc_tính;
<sub>Ví dụ</sub>
<b>Date</b> x;
#6
Biến con trỏ kiểu cấu trúc
<b>TÊNKDL *</b>tên_biến_con_trỏ;
tên_biến_con_trỏ<b> -> </b>tên_tḥc_tính;
Ví dụ:
<b>Date *</b>x ;
#7
struct tên_struct
{
khai báo các tḥc tính;
#8
Ví dụ:
struct ttNode
{
int key;
#9
<i>Viết chương trình nhập vào toạ độ hai điểm trong </i>
<i>mặt phẳng và tính tổng hai toạ đợ này</i>
<i>struct ttDiem</i>
<i>{</i>
<i>int x;</i>
<i>int y;</i>
<i>};</i>
#10
<i>void Nhap (Diem &d)</i>
<i>{</i>
<i>printf(“\nNhap vao toa do diem\n”);</i>
<i>printf(“Hoanh do : “);</i>
#11
<i>void Xuat (<b>Diem </b>d)</i>
<i>printf(“\nToa do diem : (%d, %d)”, d.x, d.y);</i>
<i>}</i>
<i><b>Diem</b></i> <i>Tong (<b>Diem</b> d1, <b>Diem</b> d2)</i>
<i>{</i>
<i><b>Diem</b> temp;</i>
<i>temp.x = d1.x + d2.x ;</i>
<i>temp.y = d1.y + d2.y ;</i>
<i>return temp;</i>
#12
<i>int main ()</i>
<i>{</i>
<i><b>Diem</b> A , B, AB; //khai bao 3 diem A, B, AB;</i>
<i>Nhap (A);</i>
<i>Xuat (A);</i>
<i>Nhap (B);</i>
<i>Xuat (B);</i>
<i>printf(“\n Tong cua hai diem vua nhap la : ”); </i>
<i>AB = Tong (A, B);</i>
#13
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:
#14
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ố (<i>kết quả phải là phân </i>
<i>số tối giản</i>)
#15
#16
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).
#17
<b>NGUYÊN TẮC LẬP TRÌNH TRÊN MẢNG CẤU TRÚC</b>
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 ý:
<i>Xây dựng hàm xử ý cho một kiểu cấu trúc.</i>
<i>Muốn xử lý cho mảng cấu trúc, ta gọi lại hàm xử lý </i>
<i>cho một kiểu cấu trúc đã được xây dựng bằng cách </i>
<i>dùng vòng lặp. </i>
#18
Viết hàm nhập vào mảng các phân số
<i>typedef struct ttPhanSo</i>
<i>{</i>
#19
<i>void NhapPS(<b>PhanSo </b>&ps)</i>
<i>{</i>
<i>printf("Nhap tu so: ");</i>
<i> scanf("%d ”, , &ps.tu);</i>
#20
<i>void NhapMangPS(<b>PHANSO</b> dsps[], int n)</i>
<i>{</i>
<i> for(int i=0; i<n; i++)</i>
<i> {</i>
<i> printf(”\nNhap vao phan so thu %d: “, i+1);</i>
<i> <b>NhapPS(dsps[i]);</b></i>
#21
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á
<b>VÕ QUANG HOÀNG KHANG</b>
Email:
#23
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
#24
Cú pháp khai báo
Ví dụ
<b>struct <tên kiểu cấu trúc></b>
<b>{</b>
<b><kiểu dữ liệu> <tên thành phần 1>;</b>
<b>…</b>
<b><kiểu dữ liệu> <tên thành phần n>;</b>
<b>} <tên biến> = {<giá trị 1>,…,<giá trị n>};</b>
<b>struct DIEM</b>
<b>{</b>
<b>int x;</b>
<b>int y;</b>
#25
Đặc điểm
<sub>Không thể truy xuất trực tiếp</sub>
<sub>Thơng qua tốn tử thành phần cấu trúc </sub><sub>. hay cịn </sub>
gọi là tốn tử chấm (dot operation)
Ví dụ
<b><tên biến cấu trúc>.<tên thành phần></b>
<b>struct DIEM</b>
<b>{</b>
<b>int x;</b>
<b>int y;</b>
<b>} diem1;</b>
#26
Có 2 cách
Ví dụ
<b><biến cấu trúc đích> = <biến cấu trúc nguồn>;</b>
<b><biến cấu trúc đích>.<tên thành phần> = <giá trị>;</b>
<b>struct DIEM</b>
<b>{</b>
<b>int x, y;</b>
<b>} diem1 = {2912, 1706}, diem2;</b>
<b>…</b>
<b>diem2 = diem1;</b>
<b>diem2.x = diem1.x;</b>
#27
Thành phần của cấu trúc là cấu trúc khác
<b>struct DIEM</b>
<b>{</b>
<b>int x;</b>
<b>int y;</b>
<b>};</b>
<b>struct HINHCHUNHAT</b>
<b>{</b>
<b>struct DIEM</b> <b>traitren;</b>
<b>struct DIEM phaiduoi;</b>
<b>} hcn1;</b>
<b>…</b>
#28
Thành phần của cấu trúc là mảng
<b>struct SINHVIEN</b>
<b>{</b>
<b>char hoten[30];</b>
<b>float toan, ly, hoa;</b>
<b>} sv1;</b>
<b>…</b>
<b>strcpy(sv1.hoten, “Nguyen Van A”);</b>
<b>sv1.toan = 10;</b>
#29
Cấu trúc đệ quy (tự trỏ)
<b>struct PERSON</b>
<b>{</b>
<b>char hoten[30];</b>
<b>struct PERSON</b> <b>*father, *mother;</b>
<b>};</b>
<b>struct NODE</b>
<b>{</b>
<b>int value;</b>
#30
Thành phần của cấu trúc có kích thước theo bit
<b>struct bit_fields</b>
<b>{</b>
<b>int bit_0 : 1;</b>
<b>int bit_1_to_4 : 4;</b>
<b>int bit_5 : 1;</b>
<b>int bit_6_to_15 : 10;</b>
<b>};</b>
#31
Ví dụ
<b>struct A</b>
<b>{</b>
<b>int a;</b>
<b>double b;</b>
<b>};</b>
<b>sizeof(A) = ???</b>
<b>struct B1</b>
<b>{</b>
<b>int a;</b>
<b>int b;</b>
<b>double c;</b>
<b>};</b>
<b>sizeof(B1) = ???</b>
<b>struct B2</b>
<b>{</b>
<b>int a;</b>
<b>double c;</b>
<b>int b;</b>
<b>};</b>
#32
<sub>n = 1, 2, 4, 8, 16 (byte)</sub>
<sub>Biên lớn nhất của các thành phần trong struct</sub>
<sub>BC n mặc định là 1</sub>
<sub>VC++ n mặc định là 8</sub>
<sub>Project settings </sub><sub></sub><sub> Compile Option C/C++ </sub><sub></sub><sub> Code </sub>
Generation <sub></sub> Structure Alignment
<sub>Canh biên cho 1 cấu trúc</sub>
<b>#pragma pack(push, 1)</b>
<b>struct MYSTRUCT { … };</b>
#33
Ví dụ: khơng có #pragma pack (1)
<b>struct A {</b>
<b>double a;</b>
<b>int b;</b>
<b>int c;</b>
<b>};</b>
<b>struct B {</b>
<b>int b;</b>
<b>double a;</b>
<b>int c;</b>
<b>};</b>
<b>struct C {</b>
<b>int b;</b>
<b>int c;</b>
<b>double a;</b>
<b>};</b>
#34
Lưu ý
<sub>Kiểu cấu trúc được định nghĩa để làm khn dạng </sub>
cịn biến cấu trúc được khai báo để sử dụng
khn dạng đã định nghĩa.
<sub>Trong C++, có thể bỏ từ khóa struct khi khai báo </sub>
biến (hoặc sử dụng typedef)
<sub>Khi </sub> <sub>nhập các biến kiểu số thực trong cấu trúc </sub>
phải nhập thông qua một biến trung gian.
NMLT - Cấu trúc
<b>struct DIEM { float x, y;} d1;</b>
#35
Mảng cấu trúc
<sub>Tương tự như mảng với kiểu dữ liệu cơ sở (char, </sub>
int, float, …)
<b>struct DIEM</b>
<b>{</b>
<b>int x;</b>
<b>int y;</b>
<b>};</b>
<b>DIEM mang1[20];</b>
#36
Truyền cấu trúc cho hàm
<sub>Giống như truyền kiểu dữ liệu cơ sở</sub>
<sub>Tham trị (không thay đổi sau khi kết thúc hàm)</sub>
<sub>Tham chiếu</sub>
<sub>Con trỏ</sub>
<sub>Ví dụ</sub>
<b>struct DIEM {</b>
<b>int x, y;</b>
<b>};</b>
<b>void xuat1(int x, int y) { … };</b>
<b>void xuat2(DIEM diem) { … };</b>
#37
Khái niệm
<sub>Được khai báo và sử dụng như cấu trúc</sub>
<sub>Các thành phần của union có chung địa chỉ đầu </sub>
(nằm chồng lên nhau trong bộ nhớ)
Khai báo
<b>union <tên kiểu union></b>
<b>{</b>
<b><kiểu dữ liệu> <tên thành phần 1>;</b>
<b>…</b>
#38
… …
0 1 2 3 4 … …
Ví dụ
<b>struct MYSTRUCT</b>
<b>{</b>
<b>s.c = 1; s.n = 2;</b>
<b>union MYUNION</b>
<b>{</b>
<b>char c;</b>
<b>int n;</b>
<b>} u;</b>
<b>u.c = 1; u.n = 2; </b>
01 02 00 00 00
c n
…
c
n
… …
0 1 2 3 … … …
01
#39
struct trong union
<b>union date_tag</b>
<b>{</b>
<b>char full_date[9];</b>
<b>struct part_date_tag</b>
<b>{</b>
<b>char month[2];</b>
<b>char break_value1;</b>
<b>char day[2];</b>
<b>char break_value2;</b>
<b>char year[2];</b>
<b>};</b>
#40
union trong struct
<b>struct generic_tag</b>
<b>{</b>
<b>char type;</b>
<b>union share_tag</b>
<b>{</b>
<b>char c;</b>
<b>int i;</b>
<b>float f;</b>
<b>};</b>
#41