CHƯƠNG 8CHƯƠNG 8
STRUCTURES STRUCTURES
ENUM ENUM
STRUCTURES STRUCTURES
––
ENUM ENUM
typedeftypedef
typedeftypedef
1.1.
GiớiGiới
thiệuthiệu
1.
1.
GiớiGiới
thiệuthiệu
Có 5 cách đ
ể
t
ạ
okiểudữ li
ệ
utù
y
biến
ạ
ệ
y
(
custom data types
).
1.
S
tructure
1.
S
tructure
2.bit-field
3
Union
3
.
Union
4.Enumeration
5.typedef
2.2.
StructStruct
((
cấucấu
trúctrúc
))
2.
2.
StructStruct
((
cấucấu
trúctrúc
))
y M
ộ
tcấutrúclàm
ộ
tt
ập
các biến đư
ợ
c
ộ
ộ
ập
ợ
tham chiếuthôngquamột tên chung.
Nhữn
g
biếnt
ạ
onêncấutrúcđư
ợ
c
gọ
ilà
g
ạ
ợ
gọ
các thành viên (
members
).
y
Sự
khác
biệt
giữa
kiểu
cấu
trúc
và
kiểu
Sự
khác
biệt
giữa
kiểu
cấu
trúc
và
kiểu
mảng là: các phầntử củamảng là cùng
kiểu
còn
các
phần
tử
của
kiểu
cấu
trúc
kiểu
còn
các
phần
tử
của
kiểu
cấu
trúc
có thể có kiểu khác nhau.
2.1.2.1.
KhaiKhai
báobáo
StructStruct
2.1.
2.1.
KhaiKhai
báobáo
StructStruct
Struct
tructureName
y
structureNam
e
:
T
ên
Struct
tructureName
{
type member1;
củacấutrúc
y
type
: Kiểudữ liệucủa
thà h
iê
t
ứ
type member1;
type member2;
thà
n
h
viê
n
t
ươn
g
ứ
n
g
y
Member1, ,
memberN
:
Tên
các
bi
ế
n
type memberN;
memberN
:
Tên
các
bi
ế
n
thành viên củacấutrúc
y
va
rN
a
m
es
:
Tê
n
các
b
i
ế
n
.
}
varNames
;
aaes
ê
các
b
ế
cấu trúc phân cách nhau
bằng dấuphẩy.
}
varNames
;
VíVí
dụdụ
::
VíVí
dụdụ
::
y Tạomộtstructsinhviêngồmcácthôngtin:
mã số sinh viên, họ tên, năm sinh, địachỉ.
struct sinhvien
{
char *MaSv;
char *TenSv;
int Namsinh;
char *Diachi;
};
y Khai báo biếnkiểu sinhvien: sinhvien sv1, sv2;
2.2.Truy 2.2.Truy
cc
ậậ
pp
bibi
ếế
nn
cc
ấấ
uu
trúctrúc
2.2.Truy 2.2.Truy
cc
ậậ
pp
bibi
ếế
nn
cc
ấấ
uu
trúctrúc
y Dùn
g
toán tử dấuchấm
(
dot o
p
erator
)
g
(
p)
để truy cập các thành viên củamộtbiến
cấutrúc.
y Cú pháp:
varNames
memberName
varNames
.
memberName
Ví dụ:
1
MS
“
001
”
sv
1
.
M
a
S
v=
“
a
001
”
;
sv1.TenSv=“Nguyen van A”;
sv2.Namsinh=1977;
2.3.2.3.
LệnhLệnh
gángán
cấucấu
trúctrúc
2.3.
2.3.
LệnhLệnh
gángán
cấucấu
trúctrúc
y Dùng lệnh gán để gán nội dung trong 1 biến
cấutrúcchomộtbiếncấutrúckháccócùn
g
kiểu
í
d
y V
í
d
ụ:
struct coordXY
{
int x;
int y;
} diemA, diemB;
y diemA.x = 100; diemA.y = 200;
2.3.2.3.
LệnhLệnh
gángán
cấucấu
trúctrúc
2.3.
2.3.
LệnhLệnh
gángán
cấucấu
trúctrúc
y Gán n
ộ
idun
g
biếncấutrúcdiemAcho
ộ
g
biếndiemB:
diemB
=
diemA
;
diemB
diemA
;
y Hoặccóthể sao chép từng thành viên:
pointB x
pointA x
;
pointB
.
x
=
pointA
.
x
;
pointB.y = pointA.y;
2.4.2.4.
MảngMảng
cáccác
cấucấu
trúctrúc
2.4.
2.4.
MảngMảng
cáccác
cấucấu
trúctrúc
y Mảng cấutrúclàmộtmảng mà mỗiphầntử là
ể
mộtbiếnki
ể
ucấutrúc.
y Để khai báo mộtmảng các cấutrúc,trướchết
hả
kh
bá
ấ
ú
đó
kh
bá
ộ
p
hả
i
kh
ai
bá
oc
ấ
utr
ú
c, sau
đó
kh
ai
bá
om
ột
mảng củacấutrúcđó.
Ví
d
tt
d
{
Ví
d
ụ:s
t
ruc
t
d
s
{
char hoten[25];
fl t
tlh
fl
oa
t
t
oan,
l
y,
h
oa;
};
d
bd
[]//
ả
hầ
ử
k ể
d
d
s
b
an
gd
iem
[
50
]
;
//
m
ả
n
g
50 p
hầ
nt
ử
k
i
ể
u
d
s
2.4.2.4.
MảngMảng
cáccác
cấucấu
trúctrúc
2.4.
2.4.
MảngMảng
cáccác
cấucấu
trúctrúc
y Để truy cập đếntừng thành viên củatừng
phầnt
ử
củamản
g
,tadùn
g
chỉ mụccủaphần
tử và toán tử thành viên (.).
í
d
V
í
d
ụ:
for(int i=0; i<n; i++)
{
cout <<"Ho va ten: "; gets(bangdiem[i].hoten)
cou
t
<<"Diem toan: "; cin >> ban
g
diem[i].toan;
cout <<"Diem ly: "; cin >> bangdiem[i].ly;
cou
t
<<"Diem hoa "; cin >> ban
g
diem[i].hoa;
}
2.5.2.5.
TruyềnTruyền
thamtham
sốsố
kiểukiểu
cấucấu
trúctrúc
2.5.
2.5.
TruyềnTruyền
thamtham
sốsố
kiểukiểu
cấucấu
trúctrúc
a. Truyền thành viên củabiếncấu trúc vào hàm
y Có 2 cách truyền thành viên củabiếncấutrúc
vào hàm:
x
T
ruyềnthamtrị
x Truyềnthambiến
VíVí
dụdụ
::
TruyềnTruyền
thamtham
trịtrị
VíVí
dụdụ
:
:
TruyềnTruyền
thamtham
trịtrị
struct diem
{
int x;
it
i
n
t
y;
};
double
khcach
(
int
x1
int
y1
int
x2
int
y2)
double
khcach
(
int
x1
,
int
y1
,
int
x2
,
int
y2)
{
double
kc
;
double
kc
;
kc=sqrt(pow((x2-x1),2)+pow((y2-y1),2));
return
kc
;
return
kc
;
}
VíVí
dụdụ
::
TruyềnTruyền
thamtham
trịtrị
VíVí
dụdụ
:
:
TruyềnTruyền
thamtham
trịtrị
void main()
{
{
diem a,b; double kcach;
cout<<"\ntoa do diem a:";
cout<<"
\
nx1=";cin>>a.x;
cout<<"\ny1=";cin>>a.y;
cout
<<
"
\
ntoa
do diem b:
"
;
cout
<<
\
ntoa
do
diem
b: ;
cout<<"\nx2=";cin>>b.x;
cout<<"\ny2=";cin>>b.y;
cout
<<"
\
nKhoang
cach
giua
adiem:";
cout
<<"
\
nKhoang
cach
giua
a
diem:";
kcach=khcach(a.x, a.y,b.x, b.y);
cout<<kcach;
}
VíVí
dụdụ
::
truyềntruyền
thamtham
chiếuchiếu
VíVí
dụdụ
:
:
truyềntruyền
thamtham
chiếuchiếu
y Để truyền địachỉ của thành viên củacấutrúc
vào hàm dùn
g
toán t
ử
& đặttrướctênbiến
cấutrúc
d
dd
(
b)
voi
d
d
oitoa
d
o
(
in
t
&x, in
t
&
y
,in
t
a, in
t
b)
{ x=x-a; y=y-b; }
void main()
{diema,b;
doitoado(a.
x
,
a.y
,
10
,
10);
cout<<"\nx="<<a.x;
cout<<"
\
ny="<<a.y;
}
2.5.2.5.
TruyềnTruyền
thamtham
sốsố
kiểukiểu
cấucấu
trúctrúc
2.5.
2.5.
TruyềnTruyền
thamtham
sốsố
kiểukiểu
cấucấu
trúctrúc
b. Truyềntoànbộ biếncấutrúcđếnhàm
Khi mộtcấutrúcđượcdùn
g
nh
ư
một đốisố
củamộthàm,toànbộ cấutrúcđượctruyền
vào
tham
số
hình
thức
Có
hai
cách
truyền
vào
tham
số
hình
thức
.
Có
hai
cách
truyền
◦
Truyềnthamtrị.
double
khcach
(diem
a,diem
b)
double
khcach
(diem
a,diem
b)
{
double
kc
;
double
kc
;
kc=sqrt(pow((b.x-a.x),2)+pow((b.y-a.y),2));
return kc
;
;
}
2.5.2.5.
TruyềnTruyền
thamtham
sốsố
kiểukiểu
cấucấu
trúctrúc
2.5.
2.5.
TruyềnTruyền
thamtham
sốsố
kiểukiểu
cấucấu
trúctrúc
◦
Truy
ề
n tham chi
ế
u
void doitoado(diem &a,int n, int m)
{
{
a.x=a.x-n; a.y=a.y-m;
}
}
void main()
{ diem
a,b
;
{ diem
a,b
;
doitoado(a, 10, 10);
cout<<«
x=
"
<<
ax
<<«
y=
"
<<
ay
;
cout<<«
x= <<
a
.
x
<<«
y= <<
a
.
y
;
}
2.6. Con2.6. Con
trỏtrỏ
đếnđến
cấucấu
trúctrúc
2.6.
Con
2.6.
Con
trỏtrỏ
đếnđến
cấucấu
trúctrúc
y Mộtbiếncontrỏ có thể trỏđếnmộtbiếnkiểu
ấ
tú
c
ấ
u
t
r
ú
c.
y
Cú pháp khai báo mộtcontrỏ cấutrúc
structureName
*
structurePointers
;
structureName
*
structurePointers
;
Ví dụ:
struct
diem
struct
diem
{
int
x
;
int
x
;
int y;
}
;
}
;
diem *p;//p là con trỏ cấutrúc.
2.7.2.7.
SửSử
dụngdụng
concon
trỏtrỏ
cấucấu
trúctrúc
2.7.
2.7.
SửSử
dụngdụng
con
con
trỏtrỏ
cấucấu
trúctrúc
y Đ
ể
tham chiếu đếnthànhviêncủam
ộ
t
ộ
cấutrúcđượctrỏđếnbởimộtcontrỏ,
ta dùn
g
toán tử ->
(
toán tử tham chiếu
g
(
gồmmộtdấutrừ và mộtdấulớnhơn).
Ví
dụ
:
Ví
dụ
:
P->x=100;
P
>y
150
;
P
-
>y
=
150
;
2.7.2.7.
SửSử
dụngdụng
concon
trỏtrỏ
cấucấu
trúctrúc
2.7.
2.7.
SửSử
dụngdụng
con
con
trỏtrỏ
cấucấu
trúctrúc
void main()
{
{
struct diem
{
int x;
int y;
};
};
diem *p, a;
p=&a;
p
>x=100;
p
-
>x=100;
p->y=120;
cout<<a.x;
cout<<a.y;
}
2.7.2.7.
SửSử
dụngdụng
concon
trỏtrỏ
cấucấu
trúctrúc
2.7.
2.7.
SửSử
dụngdụng
con
con
trỏtrỏ
cấucấu
trúctrúc
y
Lưuý:
y Để truy cập đến thành viên củamộtcấutrúc:
◦ Nếudùng
biếncấutrúc
thì dùng toán tử
chấ
m
(dot operator).
◦ Nếudùng
biếncontrỏ
thì dùng toán tử ->
(arrow operator).
y Truyềnthamsố là con trỏ cấutrúcthìmặc
đị h
là
t ề
th
hiế
đị
n
h
là
t
ruy
ề
n
th
a
m
c
hiếu
3. 3.
KiKi
ểể
uu
lili
ệệ
tt
kêkê
(Enumerations, (Enumerations,
enumenum
))
3. 3.
KiKi
ểể
uu
lili
ệệ
tt
kêkê
(Enumerations, (Enumerations,
enumenum
))
y Một enum là mộttậpcủacáctênhằng
n
g
uyên xác định tấtcả các
g
iá trị hợplệ mà
mộtbiếncủakiểu đócóthể có.
ú
há
y C
ú
p
há
p:
enum enumName {enumList} enumVars;
ể
◦
enu
m
: t
ừ
khóa đ
ể
khai báo enum
◦
enumName
: Tên của enum
◦
enumLis
t
: Danh sách các tên hằn
g
n
g
uyên
phân cách nhau bởidấuphẩy
ê
á
b ế
k ể
◦
enumVar
s
:
Tê
nc
á
c
b
i
ế
n
k
i
ể
u enum.
3. 3.
KiKi
ểể
uu
lili
ệệ
tt
kêkê
(Enumerations, (Enumerations,
enumenum
))
3. 3.
KiKi
ểể
uu
lili
ệệ
tt
kêkê
(Enumerations, (Enumerations,
enumenum
))
y Ví dụ:
enum color {red, orange, yellow, green, blue, indigo};
color c1 = indigo;
if( c1 == indigo )
{
{
cout << "c1 is indigo" << endl;
}
}
3. 3.
KiKi
ểể
uu
lili
ệệ
tt
kêkê
(Enumerations, (Enumerations,
enumenum
))
3. 3.
KiKi
ểể
uu
lili
ệệ
tt
kêkê
(Enumerations, (Enumerations,
enumenum
))
y Mỗimột tên trong danh sách enum tượng
trưn
g
cho một
g
iá trị n
g
uyên. Giá trị củatên
thứ nhất trong enum là 0, kế tiếp là 1,
ó
hể
á
á
khá
h
ỗ
ê
hằ
y
T
ac
ó
t
hể
gá
n
g
i
á
trị
khá
cc
h
om
ỗ
it
ê
n
hằ
n
g
nguyên
3.3.
typedeftypedef
3.
3.
typedeftypedef
y Từ khóa typedef dùng để định nghĩamộttên
ể
mớichomộtki
ể
ud
ữ
liệu đãcó.
y Dạng tổng quát của dùng typedef là
typedef existingType newType;
◦
existingType
:
là
kiểu
dữ
liệu
nào
đã
tồn
tại
◦
existingType
:
là
kiểu
dữ
liệu
nào
đã
tồn
tại
◦
newType
: tên mớicủakiểudữ liệu
3.3.
typedeftypedef
3.
3.
typedeftypedef
y Ví dụ: Tạomộttênmớichokiểudữ liệuint
typedef int int2bytes;
t
yp
edef lon
g
int4b
y
tes;
yp
gy
Sau khi các lệnh trên thựchiệnthìlệnh
int n1
;
;
long n2;
tương
đương
tương
đương
int2bytes n1;
Int4bytes n2;
Int4bytes
n2;