Tải bản đầy đủ (.pptx) (41 trang)

ktlt_chuong 2_kieudulieucocautruc_new

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>

<b>CHƯƠNG 2. </b>



</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

#2


<b>NỘI DUNG</b>



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


</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

#3


<b>KHÁI NIỆM</b>



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;
};


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

#4



<b>KHÁI NIỆM</b>



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;
};


</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

#5


<b>TRUY CẬP CÁC THUỘC TÍNH CẤU TRÚC</b>



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;


</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

#6



<b>TRUY CẬP CÁC THUỘC TÍNH CẤU TRÚC</b>



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 ;


</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

#7


<b>KHAI BÁO ĐỆ QUY</b>



struct tên_struct
{


khai báo các tḥc tính;


</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>

#8


<b>KHAI BÁO ĐỆ QUY</b>



Ví dụ:


struct ttNode
{


int key;



</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>

#9


<b>VÍ DỤ</b>



<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>


</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>

#10


<b>VÍ DỤ</b>



<i>void Nhap (Diem &d)</i>
<i>{</i>


<i>printf(“\nNhap vao toa do diem\n”);</i>
<i>printf(“Hoanh do : “);</i>


</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>

#11


<b>VÍ DỤ</b>



<i>void Xuat (<b>Diem </b>d)</i>


<i>{</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>


</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12>

#12


<b>VÍ DỤ</b>



<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>



</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>

#13


<b>BÀI TẬP 1</b>



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:


</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>

#14


<b>BÀI TẬP 2</b>



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>)



</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=15>

#15


<b>BÀI TẬP 3</b>



</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=16>

#16


<b>MẢNG CẤU TRÚC</b>



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).


</div>
<span class='text_page_counter'>(17)</span><div class='page_container' data-page=17>

#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>


</div>
<span class='text_page_counter'>(18)</span><div class='page_container' data-page=18>

#18


<b>VÍ DỤ</b>



Viết hàm nhập vào mảng các phân số



<i>typedef struct ttPhanSo</i>
<i>{</i>


</div>
<span class='text_page_counter'>(19)</span><div class='page_container' data-page=19>

#19


<b>VÍ DỤ</b>



<i>void NhapPS(<b>PhanSo </b>&ps)</i>
<i>{</i>


<i>printf("Nhap tu so: ");</i>


<i> scanf("%d ”, , &ps.tu);</i>


</div>
<span class='text_page_counter'>(20)</span><div class='page_container' data-page=20>

#20


<b>VÍ DỤ</b>



<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>


</div>
<span class='text_page_counter'>(21)</span><div class='page_container' data-page=21>

#21



<b>BÀI TẬP 4</b>



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á


</div>
<span class='text_page_counter'>(22)</span><div class='page_container' data-page=22>

<b>VÕ QUANG HOÀNG KHANG</b>


Email:


<b>CHƯƠNG 2(tt). </b>



</div>
<span class='text_page_counter'>(23)</span><div class='page_container' data-page=23>

#23


<b>MỘT SỐ LƯU Ý</b>



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


</div>
<span class='text_page_counter'>(24)</span><div class='page_container' data-page=24>

#24



<b>KHỞI TẠO CHO BIẾN CẤU TRÚC</b>



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>


</div>
<span class='text_page_counter'>(25)</span><div class='page_container' data-page=25>

#25


<b>TRUY XUẤT DỮ LIỆU KIỂU CẤU TRÚC</b>



Đặ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>


</div>
<span class='text_page_counter'>(26)</span><div class='page_container' data-page=26>

#26


<b>GÁN DỮ LIỆU KIỂU CẤU TRÚC</b>



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>


</div>
<span class='text_page_counter'>(27)</span><div class='page_container' data-page=27>

#27


<b>CẤU TRÚC PHỨC TẠP</b>



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>



</div>
<span class='text_page_counter'>(28)</span><div class='page_container' data-page=28>

#28


<b>CẤU TRÚC PHỨC TẠP</b>



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>


</div>
<span class='text_page_counter'>(29)</span><div class='page_container' data-page=29>

#29


<b>CẤU TRÚC PHỨC TẠP</b>



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>


</div>
<span class='text_page_counter'>(30)</span><div class='page_container' data-page=30>

#30


<b>CẤU TRÚC PHỨC TẠP</b>



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>


</div>
<span class='text_page_counter'>(31)</span><div class='page_container' data-page=31>

#31



<b>KÍCH THƯỚC CỦA STRUCT</b>



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>


</div>
<span class='text_page_counter'>(32)</span><div class='page_container' data-page=32>

#32


Chỉ thị #pragma pack


Chỉ thị #pragma pack (n)


 <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>


</div>
<span class='text_page_counter'>(33)</span><div class='page_container' data-page=33>

#33



#pragma pack



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>


</div>
<span class='text_page_counter'>(34)</span><div class='page_container' data-page=34>

#34


<b>CÁC LƯU Ý VỀ CẤU TRÚC</b>




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>


</div>
<span class='text_page_counter'>(35)</span><div class='page_container' data-page=35>

#35


<b>MẢNG CẤU TRÚC</b>



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>


</div>
<span class='text_page_counter'>(36)</span><div class='page_container' data-page=36>

#36


<b>TRUYỀN CẤU TRÚC CHO HÀM</b>



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>



</div>
<span class='text_page_counter'>(37)</span><div class='page_container' data-page=37>

#37


<b>KIỂU UNION</b>



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>


</div>
<span class='text_page_counter'>(38)</span><div class='page_container' data-page=38>

#38


… …
0 1 2 3 4 … …


<b>SO SÁNH STRUCT VÀ UNION</b>



Ví dụ
<b>struct MYSTRUCT</b>
<b>{</b>


<b>char c;</b>
<b>int n;</b>
<b>} s;</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


</div>
<span class='text_page_counter'>(39)</span><div class='page_container' data-page=39>

#39



Ví dụ



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>


</div>
<span class='text_page_counter'>(40)</span><div class='page_container' data-page=40>

#40


Ví dụ



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>


</div>
<span class='text_page_counter'>(41)</span><div class='page_container' data-page=41>

#41


</div>

<!--links-->

×