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 #include #include void main(void) { char *str; /* allocate memory for string */ str = (char *) malloc(10); /* copy "Hello" to string */ strcpy(str, "Hello"); /* display string */ printf("String is %s\n", str); /* free memory */ free(str); }

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