Tải bản đầy đủ (.pdf) (19 trang)

Bài 10 Kiểu Cấu Trúc và Kiểu Hợp pdf

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 (114.68 KB, 19 trang )

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 <tên kiểu>
{
các thành phần ;
} <danh sách biế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 <tên kiểu cấu trúc> <danh sách biến> ;
hoặc
<tên kiểu cấu trúc> <danh sách biến> ;


 Các biến được khai báo cũng có thể đi kèm
khởi tạo:
<tên kiểu cấu trúc> 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 <iostream>
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 <iostream>
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 <iostream>
#include <ctime>
using namespace std;
int main()
{
struct tm *ptr;
time_t lt;
lt = time('\0');//gọi với con trỏ null
ptr = localtime(&lt);
cout << ptr->tm_hour << ':' << ptr->tm_min;
cout << ':' << ptr->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 <tên kiểu> {
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

×