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 ;
} ;
19 trang |
Chia sẻ: lylyngoc | Lượt xem: 1832 | Lượt tải: 1
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