www.uit.edu.vn
TIN HỌC ĐẠI CƯƠNG
BÀI 10 BÀI 10
B NH Đ NG Ộ Ớ Ộ B NH Đ NG Ộ Ớ Ộ KI U D LI U CÓ C U TRÚC Ữ Ệ Ể KI U D LI U CÓ C U TRÚC Ữ Ệ Ể
Ấ Ấ
1
Ộ
ỘN I DUNG N I DUNG
C P PHÁT VÀ GI
I PHÓNG B NH Đ NG
Ấ
Ả
Ộ Ớ Ộ
9
i
g n ơ ư c i ạ đ c ọ h n T
2
N I DUNG BÀI B NH Đ NG N I DUNG BÀI B NH Đ NG
Ộ Ớ Ộ Ộ Ớ Ộ
Ộ Ộ
Khái ni m bi n “đ ng” ệ ế ộ
Các hàm c p phát b nh ớ ấ ộ
Hàm malloc
Hàm calloc
Hàm realloc
Hàm gi i phóng b nh ả ộ ớ
Hàm free
i
g n ơ ư c i ạ đ c ọ h n T
3
BI N Đ NG BI N Đ NG
Ộ Ộ
Ế Ế
Bi n đ ng là bi n đ ộ ế ượ ạ ạ
c “t o” ra khi ch y ỏ
c c p phát và qu n lý. ế ch ươ bi n đ ế ng trình. Thông qua con tr , vùng nh ớ ượ ấ ả
Các hàm thao tác vùng nh trên C đ ượ
nghĩa trong th vi n c đ nh ị ớ ư ệ stdlib.h ho c ặ alloc.h
Các hàm c p phát và gi i phóng b nh ấ ả ộ ớ
Hàm malloc
Hàm calloc
Hàm realloc
Hàm free
i
g n ơ ư c i ạ đ c ọ h n T
4
HÀM MALLOC / HÀM FREE HÀM MALLOC / HÀM FREE
ứ ủ malloc là g i c p phát m t ộ ọ ấ
c Ch c năng c a hàm vùng nh có kích th ớ ướ size:
void *malloc(size_t size);
Ví dụ:
int *p; p=(int *) malloc(100); p=(int *) malloc(80*sizeof(int));
i phóng m t vùng
Hàm free đ nh đã đ ượ ớ c dùng đ gi ộ ượ ể ả ỏ prt: c c p phát thông qua con tr ấ
void free(void *ptr);
i
g n ơ ư c i ạ đ c ọ h n T
5
VÍ DỤVÍ DỤ
i
g n ơ ư c i ạ đ c ọ h n T
6
#include
HÀM CALLOC VÀ REALLOC HÀM CALLOC VÀ REALLOC
ộ
Bên c nh hàm ạ ể ượ ấ ằ malloc, m t vùng nh còn có ớ calloc và c p ấ
th đ phát l ạ ằ c c p phát b ng hàm realloc. i b ng hàm
ớ ộ Hàm calloc c p phát m t vùng nh có kích
th ấ c ướ nitems* size bytes.
void *calloc(size_t nitems, size_t size);
c ỉ
i vùng nh đã đ ớ c m i là ớ ướ Hàm realloc đi u ch nh l ạ ề block, v i kích th ớ ượ size
c p phát ấ bytes.
void *realloc(void* block, size_t size);
i
g n ơ ư c i ạ đ c ọ h n T
7
B NH Đ NG VÀ M NG 1 CHI U B NH Đ NG VÀ M NG 1 CHI U
Ộ Ớ Ộ Ộ Ớ Ộ
Ả Ả
Ề Ề
C p phát vùng nh ấ ớ n ph n t ầ ử cho bi n con tr ỏ ế
int *a :
a = (int *)malloc(n*sizeof(int));
a =(int *)calloc(n, sizeof(int)); Ki m tra c p phát thành công và th c hi n các ự ể ệ
thao tác ti p (nh đ i v i m ng): ư ố ớ ả ấ ế
if(a!=NULL) {
ư ả // dùng nh m ng cho a[0], a[1], …
………… free(a); }
i
g n ơ ư c i ạ đ c ọ h n T
8
B NH Đ NG VÀ M NG 2 CHI U B NH Đ NG VÀ M NG 2 CHI U
Ộ Ớ Ộ Ộ Ớ Ộ
Ả Ả
Ề Ề
a = (int **)malloc(m*sizeof(int *));
if(a!=NULL)
{ kt=0;
for(i=0; i
if(kt==1) break;
a[i]=(int *)malloc(n*sizeof(int));
if(a[i]==NULL) kt=1;
}
if(kt==0)
{
ư ả
ề
/* dùng nh m ng 2 chi u a[i][j] */
………
for(i=0; i
i
}
}
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
9
Ộ
ỘN I DUNG
N I DUNG
KI U D LI U CÓ C U TRÚC
Ữ Ệ
Ấ
Ể
10
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
10
N I DUNG BÀI KI U C U TRÚC
N I DUNG BÀI KI U C U TRÚC
Ộ
Ộ
Ấ
Ấ
Ể
Ể
Khái ni mệ
Khai báo ki u c u trúc struct
ể
ấ
M ng và con tr c u trúc
ỏ ấ
ả
Truy xu t các thành ph n c a c u trúc
ủ
ầ
ấ
ấ
Ki u c u trúc và hàm
ể
ấ
Ví d minh h a
ụ
ọ
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
11
KHÁI NI MỆ
KHÁI NI MỆ
ấ ể ả
ng đ Ki u c u trúc (hay b n ghi đ i v i m t s NNLT
c đ nh nghĩa đ
ể ộ ố
ị ữ ệ ườ
ố ớ
ượ
ầ ề ề ộ
khác) là d ng d li u th
mô t
ki u d li u khác nhau.
ể ạ
d li u có nhi u thành ph n thu c nhi u
ả ữ ệ
ữ ệ
ầ
ể
ể ủ ừ
ơ ả ự ố
Ki u d li u c a t ng thành ph n có th là các
, s nguyên, s th c),
ki u d li u c b n (ký t
con tr , m ng, và th m chí là m t ki u c u trúc.
ể ữ ệ
ữ ệ
ả
ỏ ể
ố ự
ấ ậ ộ
Ki u c u trúc trên C đ c đ nh nghĩa thông qua ượ ị
ể
ấ
khoá t struct ừ
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
12
KHAI BÁO STRUCT
KHAI BÁO STRUCT
Cú pháp t ng quát: ổ
ấ
struct []
{
ế
ế
ế
ế
[ ];
[ ];
…
ế
ấ
} [];
ấ và
ư ấ ả
c u trúc>
m t trong 2 đ ọ
c khai báo. ấ
ộ là tùy ch n nh ng ít nh t ph i có
ượ
Các bi n cùng ki u
ế
ở ấ ể KDL có th khai báo cách
ể
ẩ KDL khác nhau khai báo
nhau b i d u ph y. Các
riêng cách nhau b i d u ch m ph y. ở ấ ấ ẩ
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
13
KHAI BÁO STRUCT
KHAI BÁO STRUCT
Trong C, ta có th đ t
ể ặ ể cho m t ộ <đ nh ị
khoá
ừ
nghĩa ki u>ể thông qua t
typedef:
ể
ị
typedef <đ nh nghĩa ki u>
;ể
Ví d :ụ
typedef struct tagHocSinh
{
char
int
float
sHoTen[50];
nToan, nVan;
fDTB;
} HOCSINH, *PTR_HOCSINH;
Khi đó ta có th khai báo m t bi n hs nh sau:
ư
ế
ể
ộ
HOCSINH hs;
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
14
M NG VÀ CON TR C U TRÚC
M NG VÀ CON TR C U TRÚC
Ỏ Ấ
Ỏ Ấ
Ả
Ả
ỏ
ộ ế ự
ữ ệ ể
Các thao tác trên m ng, con tr và vùng nh
ớ
ả
đ ng cho các bi n c u trúc hoàn toàn t
ng t
ươ
ấ
nh đ i v i các bi n có ki u d li u thông
ế
th ư ố ớ
ng.
ườ
Ví d :ụ
HOCSINH hs, manghs[20];
PTR_HOCSINH phs1, phs2;
manghs[5] = hs;
phs1 = &hs;
phs2 = (PTR_HOCSINH)calloc(10,
sizeof(HOCSINH));
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
15
TRUY XU T THÀNH PH N C U TRÚC
TRUY XU T THÀNH PH N C U TRÚC
Ầ
Ầ
Ấ
Ấ
Ấ
Ấ
ể ấ ế ế ầ ấ ộ
ấ ử
Đ truy xu t đ n m t thành ph n c a bi n c u
ủ
trúc tĩnh ta dùng toán t
ch m “.” và dùng toán t
ử
“->” đ i v i bi n con tr .
ỏ ố ớ ế
Ví d :ụ
HOCSINH hs;
hs.sHoTen=“Phúc Khang An”;
hs.nToan=10;
hs.nVan = 7;
hs.fDTB = (hs.nToan + hs.nVan)/ 2.0;
Không nên dùng toán t & đ i v i thành ph n ử ố ớ ầ
c u trúc.
ấ
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
16
TRUY XU T THÀNH PH N C U TRÚC
TRUY XU T THÀNH PH N C U TRÚC
Ầ
Ầ
Ấ
Ấ
Ấ
Ấ
V i các bi n: ế ớ
HOCSINH hs;
PTR_HOCSINH phs = &hs;
Ta có th truy xu t đ n thành ph n ấ ế ể
ng đ c u trúc b ng các cách t
ấ ằ ươ ầ sHoTen c a ủ
ng nh :
ư
ươ
gets(hs.sHoTen);
gets(phs->sHoTen);
gets((*phs).sHoTen);
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
17
TRUY XU T THÀNH PH N C U TRÚC
TRUY XU T THÀNH PH N C U TRÚC
Ầ
Ầ
Ấ
Ấ
Ấ
Ấ
Áp d ng cho bi n m ng c u trúc:
ế ụ ả ấ
HOCSINH dshs[100];
PTR_HOCSINH pdshs = dshs;
ấ ế ể
Ta có th truy xu t đ n thành ph n
ầ sHoTen
c a c u trúc b ng các cách t
ng nh :
ng đ
ư
ằ
ủ ươ ươ ấ
gets(dshs[i].sHoTen);
gets(pdshs[i].sHoTen);
gets(*(dshs+i).sHoTen);
gets(*(pdshs+i).sHoTen);
gets(pdshs->sHoTen); pdshs++;
gets((*pdshs).sHoTen); pdshs++;
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
18
KI U C U TRÚC VÀ HÀM
KI U C U TRÚC VÀ HÀM
Ấ
Ấ
Ể
Ể
ế
ng t ng. Ch ng h n
ẳ ươ ự ạ
Các thao tác trên hàm cho bi n c u trúc hoàn
cho bi n thông th
ế
ế toàn t
truy n tham bi n và tham tr nh sau:
ề ấ
ườ
ư ị
Prototype:
void NhapHS(PTR_HOCSINH phs);
void XuatHS(HOCSINH hs);
Khi đó ta có th g i dùng hàm: ể ọ
HOCSINH hs;
NhapHS(&hs);
XuatHS(hs);
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
19
VÍ D MINH H A
VÍ D MINH H A
Ọ
Ọ
Ụ
Ụ
#include
#include
#include
#include
typedef struct tagHOCSINH
{
char
float
float
sHoTen[50];
fVan, fToan;
fDTB;
}HOCSINH, *PTR_HOCSINH;
void NhapHS(PTR_HOCSINH phs, int stt);
void XuatHS(HOCSINH hs, int stt);
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
20
VÍ D MINH H A
VÍ D MINH H A
Ọ
Ọ
Ụ
Ụ
void main()
{
int i, nSoHS;
PTR_HOCSINH pDSHS;
clrscr();
printf("So luong hoc sinh: ");
scanf("%d", &nSoHS);
pDSHS = (PTR_HOCSINH)calloc(nSoHS,
sizeof(HOCSINH));
if(pDSHS==NULL) return;
for(i=0; i
NhapHS(&pDSHS[i], i);
for(i=0; i
XuatHS(pDSHS[i], i);
if(pDSHS) free(pDSHS);
getch();
i
}
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
21
VÍ D MINH H A
VÍ D MINH H A
Ọ
Ọ
Ụ
Ụ
void NhapHS(PTR_HOCSINH phs, int stt)
{
char hoten[50];
float van, toan;
flushall();
printf("\nHoc sinh thu %d:", stt+1);
printf("\nHo Ten: ");
gets(hoten);
printf("Diem van: ");
scanf("%f", &van);
printf("Diem toan: ");
scanf("%f", &toan);
strcpy(phs->sHoTen, hoten);
phs->fVan = van;
phs->fToan = toan;
phs->fDTB = (float)(van+toan)/2;
}
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
22
VÍ D MINH H A
VÍ D MINH H A
Ọ
Ọ
Ụ
Ụ
void XuatHS(HOCSINH hs, int stt)
{
printf("\n\nHoc sinh thu %d: %s",
stt+1, hs.sHoTen);
printf("\nVan %.1f, Toan %.1f. DTB %.1f",
hs.fVan, hs.fToan, hs.fDTB);
}
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
23
www.uit.edu.vn
24
if(kt==1) break; a[i]=(int *)malloc(n*sizeof(int)); if(a[i]==NULL) kt=1;
} if(kt==0) {
ư ả
ề
/* dùng nh m ng 2 chi u a[i][j] */
………
for(i=0; i
i
}
}
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
9
Ộ
ỘN I DUNG
N I DUNG
KI U D LI U CÓ C U TRÚC
Ữ Ệ
Ấ
Ể
10
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
10
N I DUNG BÀI KI U C U TRÚC
N I DUNG BÀI KI U C U TRÚC
Ộ
Ộ
Ấ
Ấ
Ể
Ể
Khái ni mệ
Khai báo ki u c u trúc struct
ể
ấ
M ng và con tr c u trúc
ỏ ấ
ả
Truy xu t các thành ph n c a c u trúc
ủ
ầ
ấ
ấ
Ki u c u trúc và hàm
ể
ấ
Ví d minh h a
ụ
ọ
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
11
KHÁI NI MỆ
KHÁI NI MỆ
ấ ể ả
ng đ Ki u c u trúc (hay b n ghi đ i v i m t s NNLT
c đ nh nghĩa đ
ể ộ ố
ị ữ ệ ườ
ố ớ
ượ
ầ ề ề ộ
khác) là d ng d li u th
mô t
ki u d li u khác nhau.
ể ạ
d li u có nhi u thành ph n thu c nhi u
ả ữ ệ
ữ ệ
ầ
ể
ể ủ ừ
ơ ả ự ố
Ki u d li u c a t ng thành ph n có th là các
, s nguyên, s th c),
ki u d li u c b n (ký t
con tr , m ng, và th m chí là m t ki u c u trúc.
ể ữ ệ
ữ ệ
ả
ỏ ể
ố ự
ấ ậ ộ
Ki u c u trúc trên C đ c đ nh nghĩa thông qua ượ ị
ể
ấ
khoá t struct ừ
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
12
KHAI BÁO STRUCT
KHAI BÁO STRUCT
Cú pháp t ng quát: ổ
ấ
struct []
{
ế
ế
ế
ế
[ ];
[ ];
…
ế
ấ
} [];
ấ và
ư ấ ả
c u trúc>
m t trong 2 đ ọ
c khai báo. ấ
ộ là tùy ch n nh ng ít nh t ph i có
ượ
Các bi n cùng ki u
ế
ở ấ ể KDL có th khai báo cách
ể
ẩ KDL khác nhau khai báo
nhau b i d u ph y. Các
riêng cách nhau b i d u ch m ph y. ở ấ ấ ẩ
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
13
KHAI BÁO STRUCT
KHAI BÁO STRUCT
Trong C, ta có th đ t
ể ặ ể cho m t ộ <đ nh ị
khoá
ừ
nghĩa ki u>ể thông qua t
typedef:
ể
ị
typedef <đ nh nghĩa ki u>
;ể
Ví d :ụ
typedef struct tagHocSinh
{
char
int
float
sHoTen[50];
nToan, nVan;
fDTB;
} HOCSINH, *PTR_HOCSINH;
Khi đó ta có th khai báo m t bi n hs nh sau:
ư
ế
ể
ộ
HOCSINH hs;
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
14
M NG VÀ CON TR C U TRÚC
M NG VÀ CON TR C U TRÚC
Ỏ Ấ
Ỏ Ấ
Ả
Ả
ỏ
ộ ế ự
ữ ệ ể
Các thao tác trên m ng, con tr và vùng nh
ớ
ả
đ ng cho các bi n c u trúc hoàn toàn t
ng t
ươ
ấ
nh đ i v i các bi n có ki u d li u thông
ế
th ư ố ớ
ng.
ườ
Ví d :ụ
HOCSINH hs, manghs[20];
PTR_HOCSINH phs1, phs2;
manghs[5] = hs;
phs1 = &hs;
phs2 = (PTR_HOCSINH)calloc(10,
sizeof(HOCSINH));
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
15
TRUY XU T THÀNH PH N C U TRÚC
TRUY XU T THÀNH PH N C U TRÚC
Ầ
Ầ
Ấ
Ấ
Ấ
Ấ
ể ấ ế ế ầ ấ ộ
ấ ử
Đ truy xu t đ n m t thành ph n c a bi n c u
ủ
trúc tĩnh ta dùng toán t
ch m “.” và dùng toán t
ử
“->” đ i v i bi n con tr .
ỏ ố ớ ế
Ví d :ụ
HOCSINH hs;
hs.sHoTen=“Phúc Khang An”;
hs.nToan=10;
hs.nVan = 7;
hs.fDTB = (hs.nToan + hs.nVan)/ 2.0;
Không nên dùng toán t & đ i v i thành ph n ử ố ớ ầ
c u trúc.
ấ
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
16
TRUY XU T THÀNH PH N C U TRÚC
TRUY XU T THÀNH PH N C U TRÚC
Ầ
Ầ
Ấ
Ấ
Ấ
Ấ
V i các bi n: ế ớ
HOCSINH hs;
PTR_HOCSINH phs = &hs;
Ta có th truy xu t đ n thành ph n ấ ế ể
ng đ c u trúc b ng các cách t
ấ ằ ươ ầ sHoTen c a ủ
ng nh :
ư
ươ
gets(hs.sHoTen);
gets(phs->sHoTen);
gets((*phs).sHoTen);
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
17
TRUY XU T THÀNH PH N C U TRÚC
TRUY XU T THÀNH PH N C U TRÚC
Ầ
Ầ
Ấ
Ấ
Ấ
Ấ
Áp d ng cho bi n m ng c u trúc:
ế ụ ả ấ
HOCSINH dshs[100];
PTR_HOCSINH pdshs = dshs;
ấ ế ể
Ta có th truy xu t đ n thành ph n
ầ sHoTen
c a c u trúc b ng các cách t
ng nh :
ng đ
ư
ằ
ủ ươ ươ ấ
gets(dshs[i].sHoTen);
gets(pdshs[i].sHoTen);
gets(*(dshs+i).sHoTen);
gets(*(pdshs+i).sHoTen);
gets(pdshs->sHoTen); pdshs++;
gets((*pdshs).sHoTen); pdshs++;
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
18
KI U C U TRÚC VÀ HÀM
KI U C U TRÚC VÀ HÀM
Ấ
Ấ
Ể
Ể
ế
ng t ng. Ch ng h n
ẳ ươ ự ạ
Các thao tác trên hàm cho bi n c u trúc hoàn
cho bi n thông th
ế
ế toàn t
truy n tham bi n và tham tr nh sau:
ề ấ
ườ
ư ị
Prototype:
void NhapHS(PTR_HOCSINH phs);
void XuatHS(HOCSINH hs);
Khi đó ta có th g i dùng hàm: ể ọ
HOCSINH hs;
NhapHS(&hs);
XuatHS(hs);
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
19
VÍ D MINH H A
VÍ D MINH H A
Ọ
Ọ
Ụ
Ụ
#include
#include
#include
#include
typedef struct tagHOCSINH
{
char
float
float
sHoTen[50];
fVan, fToan;
fDTB;
}HOCSINH, *PTR_HOCSINH;
void NhapHS(PTR_HOCSINH phs, int stt);
void XuatHS(HOCSINH hs, int stt);
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
20
VÍ D MINH H A
VÍ D MINH H A
Ọ
Ọ
Ụ
Ụ
void main()
{
int i, nSoHS;
PTR_HOCSINH pDSHS;
clrscr();
printf("So luong hoc sinh: ");
scanf("%d", &nSoHS);
pDSHS = (PTR_HOCSINH)calloc(nSoHS,
sizeof(HOCSINH));
if(pDSHS==NULL) return;
for(i=0; i
NhapHS(&pDSHS[i], i);
for(i=0; i
XuatHS(pDSHS[i], i);
if(pDSHS) free(pDSHS);
getch();
i
}
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
21
VÍ D MINH H A
VÍ D MINH H A
Ọ
Ọ
Ụ
Ụ
void NhapHS(PTR_HOCSINH phs, int stt)
{
char hoten[50];
float van, toan;
flushall();
printf("\nHoc sinh thu %d:", stt+1);
printf("\nHo Ten: ");
gets(hoten);
printf("Diem van: ");
scanf("%f", &van);
printf("Diem toan: ");
scanf("%f", &toan);
strcpy(phs->sHoTen, hoten);
phs->fVan = van;
phs->fToan = toan;
phs->fDTB = (float)(van+toan)/2;
}
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
22
VÍ D MINH H A
VÍ D MINH H A
Ọ
Ọ
Ụ
Ụ
void XuatHS(HOCSINH hs, int stt)
{
printf("\n\nHoc sinh thu %d: %s",
stt+1, hs.sHoTen);
printf("\nVan %.1f, Toan %.1f. DTB %.1f",
hs.fVan, hs.fToan, hs.fDTB);
}
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
23
www.uit.edu.vn
24
i
} }
g n ơ ư c i ạ đ c ọ h n T
9
Ộ
ỘN I DUNG N I DUNG
KI U D LI U CÓ C U TRÚC
Ữ Ệ
Ấ
Ể
10
i
g n ơ ư c i ạ đ c ọ h n T
10
N I DUNG BÀI KI U C U TRÚC N I DUNG BÀI KI U C U TRÚC
Ộ Ộ
Ấ Ấ
Ể Ể
Khái ni mệ Khai báo ki u c u trúc struct ể
ấ
M ng và con tr c u trúc
ỏ ấ
ả
Truy xu t các thành ph n c a c u trúc
ủ
ầ
ấ
ấ
Ki u c u trúc và hàm
ể
ấ
Ví d minh h a
ụ
ọ
i
g n ơ ư c i ạ đ c ọ h n T
11
KHÁI NI MỆ KHÁI NI MỆ
ấ ể ả
ng đ Ki u c u trúc (hay b n ghi đ i v i m t s NNLT c đ nh nghĩa đ ể ộ ố ị ữ ệ ườ
ố ớ ượ ầ ề ề ộ
khác) là d ng d li u th mô t ki u d li u khác nhau. ể ạ d li u có nhi u thành ph n thu c nhi u ả ữ ệ ữ ệ
ầ
ể ể ủ ừ ơ ả ự ố
Ki u d li u c a t ng thành ph n có th là các , s nguyên, s th c), ki u d li u c b n (ký t con tr , m ng, và th m chí là m t ki u c u trúc. ể ữ ệ ữ ệ ả ỏ ể ố ự ấ ậ ộ
Ki u c u trúc trên C đ c đ nh nghĩa thông qua ượ ị
ể ấ khoá t struct ừ
i
g n ơ ư c i ạ đ c ọ h n T
12
KHAI BÁO STRUCT KHAI BÁO STRUCT
Cú pháp t ng quát: ổ
ấ
struct []
{
ế ế
ế ế
[ ];
[ ];
…
ế
ấ
} [];
ư ấ ả c u trúc>
m t trong 2 đ ọ
c khai báo. ấ
ộ là tùy ch n nh ng ít nh t ph i có
ượ Các bi n cùng ki u
ế
ở ấ ể KDL có th khai báo cách
ể
ẩ KDL khác nhau khai báo nhau b i d u ph y. Các
riêng cách nhau b i d u ch m ph y. ở ấ ấ ẩ 13 Trong C, ta có th đ t ể ặ khoá ừ Ví d :ụ typedef struct tagHocSinh
{ char
int
float sHoTen[50];
nToan, nVan;
fDTB; } HOCSINH, *PTR_HOCSINH; Khi đó ta có th khai báo m t bi n hs nh sau: ư ế ể ộ HOCSINH hs; 14 ỏ ộ ế ự ữ ệ ể Các thao tác trên m ng, con tr và vùng nh
ớ
ả
đ ng cho các bi n c u trúc hoàn toàn t
ng t
ươ
ấ
nh đ i v i các bi n có ki u d li u thông
ế
th ư ố ớ
ng.
ườ Ví d :ụ HOCSINH hs, manghs[20]; PTR_HOCSINH phs1, phs2; manghs[5] = hs; phs1 = &hs; phs2 = (PTR_HOCSINH)calloc(10, sizeof(HOCSINH)); 15 ể ấ ế ế ầ ấ ộ ấ ử Đ truy xu t đ n m t thành ph n c a bi n c u
ủ
trúc tĩnh ta dùng toán t
ch m “.” và dùng toán t
ử
“->” đ i v i bi n con tr .
ỏ ố ớ ế Ví d :ụ HOCSINH hs;
hs.sHoTen=“Phúc Khang An”;
hs.nToan=10;
hs.nVan = 7;
hs.fDTB = (hs.nToan + hs.nVan)/ 2.0; Không nên dùng toán t & đ i v i thành ph n ử ố ớ ầ c u trúc.
ấ 16 V i các bi n: ế ớ HOCSINH hs; PTR_HOCSINH phs = &hs; Ta có th truy xu t đ n thành ph n ấ ế ể ng đ c u trúc b ng các cách t
ấ ằ ươ ầ sHoTen c a ủ
ng nh :
ư
ươ gets(hs.sHoTen); gets(phs->sHoTen); gets((*phs).sHoTen); 17 Áp d ng cho bi n m ng c u trúc:
ế ụ ả ấ HOCSINH dshs[100]; PTR_HOCSINH pdshs = dshs; ấ ế ể Ta có th truy xu t đ n thành ph n
ầ sHoTen
c a c u trúc b ng các cách t
ng nh :
ng đ
ư
ằ
ủ ươ ươ ấ gets(dshs[i].sHoTen);
gets(pdshs[i].sHoTen);
gets(*(dshs+i).sHoTen);
gets(*(pdshs+i).sHoTen);
gets(pdshs->sHoTen); pdshs++;
gets((*pdshs).sHoTen); pdshs++; 18 ế ng t ng. Ch ng h n
ẳ ươ ự ạ Các thao tác trên hàm cho bi n c u trúc hoàn
cho bi n thông th
ế
ế toàn t
truy n tham bi n và tham tr nh sau:
ề ấ
ườ
ư ị Prototype: void NhapHS(PTR_HOCSINH phs); void XuatHS(HOCSINH hs); Khi đó ta có th g i dùng hàm: ể ọ HOCSINH hs; NhapHS(&hs); XuatHS(hs); 19 20 21 22 23 24i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
KHAI BÁO STRUCT
KHAI BÁO STRUCT
nghĩa ki u>ể thông qua t
typedef:
ể
ị
typedef <đ nh nghĩa ki u>
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
M NG VÀ CON TR C U TRÚC
M NG VÀ CON TR C U TRÚC
Ỏ Ấ
Ỏ Ấ
Ả
Ả
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
TRUY XU T THÀNH PH N C U TRÚC
TRUY XU T THÀNH PH N C U TRÚC
Ầ
Ầ
Ấ
Ấ
Ấ
Ấ
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
TRUY XU T THÀNH PH N C U TRÚC
TRUY XU T THÀNH PH N C U TRÚC
Ầ
Ầ
Ấ
Ấ
Ấ
Ấ
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
TRUY XU T THÀNH PH N C U TRÚC
TRUY XU T THÀNH PH N C U TRÚC
Ầ
Ầ
Ấ
Ấ
Ấ
Ấ
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
KI U C U TRÚC VÀ HÀM
KI U C U TRÚC VÀ HÀM
Ấ
Ấ
Ể
Ể
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
VÍ D MINH H A
VÍ D MINH H A
Ọ
Ọ
Ụ
Ụ
#include
typedef struct tagHOCSINH
{
char
float
float
sHoTen[50];
fVan, fToan;
fDTB;
}HOCSINH, *PTR_HOCSINH;
void NhapHS(PTR_HOCSINH phs, int stt);
void XuatHS(HOCSINH hs, int stt);
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
VÍ D MINH H A
VÍ D MINH H A
Ọ
Ọ
Ụ
Ụ
void main()
{
int i, nSoHS;
PTR_HOCSINH pDSHS;
clrscr();
printf("So luong hoc sinh: ");
scanf("%d", &nSoHS);
pDSHS = (PTR_HOCSINH)calloc(nSoHS,
sizeof(HOCSINH));
if(pDSHS==NULL) return;
for(i=0; i
NhapHS(&pDSHS[i], i);
for(i=0; i
XuatHS(pDSHS[i], i);
if(pDSHS) free(pDSHS);
getch();
i
}
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
VÍ D MINH H A
VÍ D MINH H A
Ọ
Ọ
Ụ
Ụ
void NhapHS(PTR_HOCSINH phs, int stt)
{
char hoten[50];
float van, toan;
flushall();
printf("\nHoc sinh thu %d:", stt+1);
printf("\nHo Ten: ");
gets(hoten);
printf("Diem van: ");
scanf("%f", &van);
printf("Diem toan: ");
scanf("%f", &toan);
strcpy(phs->sHoTen, hoten);
phs->fVan = van;
phs->fToan = toan;
phs->fDTB = (float)(van+toan)/2;
}
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
VÍ D MINH H A
VÍ D MINH H A
Ọ
Ọ
Ụ
Ụ
void XuatHS(HOCSINH hs, int stt)
{
printf("\n\nHoc sinh thu %d: %s",
stt+1, hs.sHoTen);
printf("\nVan %.1f, Toan %.1f. DTB %.1f",
hs.fVan, hs.fToan, hs.fDTB);
}
i
g
n
ơ
ư
c
i
ạ
đ
c
ọ
h
n
T
www.uit.edu.vn