Bài 10 Kiểu cấu trúc và kiểu hợp

 Trong C++, cấu trúc (structure) là một tập hợp nhiều biến được tham chiếu dưới cùng một tên, tạo ra một phương tiện gắn kết các thông tin có liên hệvới nhau.  Khai báo struct { các thành phần ; } ;

pdf19 trang | Chia sẻ: lylyngoc | Lượt xem: 1832 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu Bài 10 Kiểu cấu trúc và kiểu hợp, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Bài 10 Kiểu Cấu Trúc và Kiểu Hợp 1 Kiểu cấu trúc  Trong C++, cấu trúc (structure) là một tập hợp nhiều biến được tham chiếu dưới cùng một tên, tạo ra một phương tiện gắn kết các thông tin có liên hệ với nhau.  Khai báo struct { các thành phần ; } ; 2  Mỗi thành phần giống như một biến riêng của kiểu, nó gồm kiểu và tên thành phần. Một thành phần cũng còn được gọi là trường (field).  Phần tên của kiểu cấu trúc và phần danh sách biến có thể có hoặc không.  Các kiểu cấu trúc được phép khai báo lồng nhau, nghĩa là một thành phần của kiểu cấu trúc có thể lại là một trường có kiểu cấu trúc.  Một biến có kiểu cấu trúc sẽ được phân bố bộ nhớ sao cho các thực hiện của nó được sắp liên tục theo thứ tự xuất hiện trong khai báo. 3  Khai báo biến kiểu cấu trúc dùng một trong các dạng: struct ; hoặc ;  Các biến được khai báo cũng có thể đi kèm khởi tạo: biến = { giá trị khởi tạo } ; 4 Ví dụ struct Phanso { int tu ; int mau ; } ; struct inv_type { char item[40]; double cost; double retail; int on_hand; int lead_time; } inv_varA, inv_varB, inv_varC; 5 Truy xuất thành viên của cấu trúc  Các biến thành viên trong cấu trúc được truy xuất bằng cách viết tên biến cấu trúc và tên biến thành viên đó cách nhau bởi dấu chấm. tên biến cấu trúc. tên biến thành viên ví dụ inv_varA.cost gets(inv_varA.item); 6 Mảng kiểu cấu trúc  Các cấu trúc có thể xếp thành mảng. Để khai báo một mảng kiểu cấu trúc, trước hết phải định nghĩa một cấu trúc, sau đó khai báo một mảng của kiểu này.  Ví dụ inv_type invtry[100];  Để truy xuất biến thành viên, phải kèm theo chỉ số. Ví dụ invtry[3].item 7 Khai báo một biến cấu trúc sinhvien để lập hồ sơ sihh viên, trong đó biến ngaysinh cũng là biến có cấu trúc. struct time { int ngay; int thang; int nam; } struct sinhvien{ char hoten[20]; time ngaysinh; char gt[5]; float diem; } 8 Truyền các cấu trúc và hàm  Khi một cấu trúc được dùng như một tham số của hàm thì toàn bộ cấu trúc được truyền vào như truyền các tham số khác.  Khi dùng một cấu trúc như là tham số, cần lưu ý kiểu tham số của hàm phải cùng kiểu của biến truyền vào. 9 ví dụ #include using namespace std; struct sample { int a; char ch; } ; void f1(sample parm); int main() { sample arg; arg.a = 1000; arg.ch = 'X'; f1(arg); return 0; } void f1(sample parm) { cout << parm.a << " " << parm.ch << "\n"; } 10 Gán các cấu trúc  Có thể gán nội dung của một biến kiểu cấu trúc sang một biến kiểu cấu trúc khác miễn là cả hai có cùng kiểu cấu trúc. Ví dụ 11 #include using namespace std; struct stype { int a, b; }; int main() { stype svar1, svar2; svar1.a = svar1.b = 10; svar2.a = svar2.b = 20; cout << "Trước khi gán.\n"; cout << "svar1: " << svar1.a << ' ' << svar1.b; cout << '\n'; cout << "svar2: " << svar2.a << ' ' << svar2.b; cout << "\n\n"; svar2 = svar1; // Gán cout << "Sau khi gán.\n"; cout << "svar1: " << svar1.a << ' ' << svar1.b; cout << '\n'; cout << "svar2: " << svar2.a << ' ' << svar2.b; return 0; } 12 Trỏ đến cấu trúc và toán tử mũi tên  C++ cho phép các con trỏ chỉ đến cấu trúc  Khai báo một con trỏ cấu trúc bằng cách đặt dấu * trước tên biến cấu trúc, ví dụ inv_type *inv_pointer; Tìm địa chỉ của biến cấu trúc dùng toán tử &, ví dụ struct bal { float balance; char name[80]; } person; bal *p; p = &person;// đặt địa chỉ của person vào con trỏ p 13  Thành phần của cấu trúc có thể được truy xuất thông qua con trỏ chỉ đến cấu trúc. Tuy nhiên, không dùng dấu chấm mà dùng toán tử mũi tên, ví dụ: p->balance  Toán tử mũi tên gồm dấu trừ và dấu lớn hơn  Con trỏ cấu trúc được dùng khi cần dùng tham số cấu trúc trong hàm, vì truyền con trỏ nhanh hơn truyền một cấu trúc lớn. 14 Ví dụ #include #include using namespace std; int main() { struct tm *ptr; time_t lt; lt = time('\0');//gọi với con trỏ null ptr = localtime(<); cout tm_hour tm_min; cout tm_sec; return 0; } struct tm { int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; } time_t time(time_t *curtime); struct tm *localtime(const time_t *curtime); time_t tm 15 Kiểu hợp (Union)  Kiểu hợp gồm hai hay nhiều biến cùng chia sẻ một vị trí bộ nhớ. Do đó một union cung cấp một phương pháp để dịch một mẫu bit thành hai hay nhiều cách khác nhau.  Khai báo union { Danh sách các thành phần; }; 16 Ví dụ union utype { short int i; char ch; } ; utype u_var; i và ch chia sẻ cùng một vị trí bộ nhớ Byte 0 Byte 1 i ch 17 Truy xuất thành viên của hợp  Để truy xuất thành viên của hợp dùng cú pháp giống như khi truy xuất thành viên của cấu trúc.  Ví dụ gán ký tự 'A' cho thành viên ch của u_var như sau: u_var.ch = 'A'; -Ví dụ con trỏ đến u_var được truyền vào một hàm. func1(&u_var); // truyền vào func1() một con trỏ chỉ đến u_var // ... } void func1(utype *un) { un->i = 10; /* gán 10 cho u_var dùng một con trỏ */ } 18 void disp_binary(unsigned u); union swap_bytes { short int num; char ch[2]; }; int main() { swap_bytes sb; char temp; sb.num = 15; // binary: 0000 0000 0000 1111 cout << "Byte ban đầu: "; disp_binary(sb.ch[1]); cout << " "; disp_binary(sb.ch[0]); cout << "\n\n"; // trao đổi bytes temp = sb.ch[0]; sb.ch[0] = sb.ch[1]; sb.ch[1] = temp; cout << "Byte được đổi "; disp_binary(sb.ch[1]); cout << " "; disp_binary(sb.ch[0]); cout << "\n\n"; return 0; } void disp_binary(unsigned u) { register int t; for(t=128; t>0; t=t/2) if(u & t) cout << "1 "; else cout << "0 "; } 19