Download as pdf or txt
Download as pdf or txt
You are on page 1of 36

Kỹ Thuật Lập Trình

Khang Q.H. Vo (M.Sc.)


FIT - IUH
KIỂU DỮ LIỆU CÓ CẤU TRÚC
STRUCT
NỘI DUNG
• Khái niệm
• Khai báo
• Cách truy xuất thành phần bên trong cấu trúc
• Xử lý cấu trúc đơn
• Bài tập
• Xử lý mảng cấu trúc
• Bài tập
KHÁI NIỆM

Kiểu dữ liệu có cấu trúc là kiểu dữ liệu do lập trình viên
tự định nghĩa bằng cách gom nhóm các kiểu dữ liệu cơ
bản có sẵn trong C thành một kiểu dữ liệu phức hợp gồm
nhiều thành phần:
• Khai báo
typedef struct{

khai báo các thuộc tính;


}TênKDL;
KHÁI NIỆM

• Ví dụ khai báo kiểu dữ liệu lưu thông tin của ngày:


struct DATE
{
char thu[10];
int ngay;
int thang;
int nam;
};
TRUY CẬP CÁC THUỘC TÍNH CẤU TRÚC

• Biến kiểu cấu trúc


TÊNKDL tên_biến;
tên_biến.tên_thuộc_tính;
• Ví dụ

Date x;

x.ngay = 5;
TRUY CẬP CÁC THUỘC TÍNH CẤU TRÚC

• Biến con trỏ kiểu cấu trúc


TÊNKDL *tên_biến_con_trỏ;
tên_biến_con_trỏ -> tên_thuộc_tính;
Ví dụ:

Date *x ;

x = (Date*) malloc(sizeof(Date));

x -> ngay = 5 ;
VÍ DỤ
Viết chương trình nhập vào toạ độ hai điểm trong mặt
phẳng
- Tính tổng hai toạ độ
- Tính khoảng cách giữa hai điểm

typedef struct
{
int x;
int y;
}DIEM;
VÍ DỤ
void Nhap (DIEM &d)
{
printf(“\nNhap vao toa do diem\n”);
printf(“Hoanh do : “);
scanf(“%d”, &d. x);
printf(“Tung do : ”)
scanf(“%d”, &d.y);
}
VÍ DỤ
void Xuat (DIEM d)
{
printf(“\nToa do diem : (%d, %d)”, d.x, d.y);
}
DIEM Tong (DIEM d1, DIEM d2)
{
DIEM temp;
temp.x = d1.x + d2.x ;
temp.y = d1.y + d2.y ;
return temp;
}
VÍ DỤ
int main ()
{
DIEM A , B, AB; //khai bao 3 diem A, B, AB;
Nhap (A);
Xuat (A);
Nhap (B);
Xuat (B);
printf(“\n Tong cua hai diem vua nhap la : ”);
AB = Tong (A, B);
Xuat (AB);
return 0;
}
BÀI TẬP 1
Viết chương trình cài đặt cấu trúc của một phân số và các hàm
thực hiện các phép toán số học trên nó

Lưu ý: kết quả phải tối giản


BÀI TẬP 2
Viết chương trình nhập vào thông tin của một sinh viên gồm:
• Mã số sinh viên
• Họ và tên
• Điểm giữa kỳ (GK)
• Điểm thực hành (TH)
• Điểm lý thuyết (LT)
• Điểm tổng kết
Tính điểm tổng kết môn theo công thức:
GK*10%+TH*30%+LT*60%
Xuất thông tin của sinh viên ra màn hình.
BÀI TẬP 3
KIỂU DỮ LIỆU CÓ CẤU TRÚC
(cont..)
MẢNG CẤU TRÚC

VÕ QUANG HOÀNG KHANG


Email: vqhkhang@gmail.com
MẢNG CẤU TRÚC
• Cách khai báo tương tự như mảng một chiều (kiểu dữ
liệu bây giờ là kiểu struct).

• Cách truy cập phần tử trong mảng cũng như truy cập
trên mảng một chiều đơn giản. Nhưng do từng phần tử
có kiểu struct nên phải chỉ định rõ cần lấy thành phần
nào.

• Cú pháp: array[i].thuộc tính


NGUYÊN TẮC LẬP TRÌNH TRÊN MẢNG CẤU
TRÚC

Kiểu dữ liệu có cấu trúc thường chứa rất nhiều thành

phần nên khi viết chương trình loại này ta cần lưu ý:

• Xây dựng hàm xử ý cho một kiểu cấu trúc.

• Muốn xử lý cho mảng cấu trúc, ta gọi lại hàm xử lý
cho một kiểu cấu trúc đã được xây dựng bằng cách
dùng vòng lặp.

18
VÍ DỤ
Viết hàm nhập vào mảng các phân số
typedef struct
{
int tu, mau;
}PHANSO;
VÍ DỤ
void NhapPS(PHANSO &ps){
printf("Nhap tu va mau cua phan so: ");
scanf("%d%d ”, , &ps.tu, &ps.mau);
}
//---------------------------------------------------------------------
void NhapMangPS(PHANSO dsps[], int n){
for(int i=0; i<n; i++){
printf(”\nNhap vao phan so thu %d: “, i+1);
NhapPS(dsps[i]);
}
}
BÀI TẬP
Thông tin của mỗi nhân viên gồm: Code(char 8), name (char 20),
salary(double), allowance (double).

Viết chương trình gồm các chức năng:

a) Nhập thông tin cho n nhân viên.

b) Tìm thông tin của một nhân viên nào đó bằng cách nhập tên.

c) Xóa một nhân viên nào đó bằng cách nhập mã.

(b1: tìm vị trí của nhân viên theo mã: vt

b2: xóa nhân viên tại vị trí: vt )

d) In danh sách nhân viên theo thứ tự tăng dần của salary.
(sắp xếp theo lương)
Q&A
MỘT SỐ LƯU Ý
• Khởi tạo cho biến cấu trúc

• Truy xuất thành phần bên trong cấu trúc

• Gán dữ liệu kiểu cấu trúc

• Cấu trúc lồng nhau

• Kích thước của struct

• Bài tập
TRUY XUẤT DỮ LIỆU KIỂU CẤU TRÚC
• Đặc điểm
• Không thể truy xuất trực tiếp
• Thông qua toán tử thành phần cấu trúc . hay còn gọi là toán tử
chấm (dot operation)

• Ví dụ
<tên biến cấu trúc>.<tên thành phần>

typedef struct
{
int x, y;
} DIEM;
DIEM d;
printf(“x = %d, y = %d”, d.x, d.y);
GÁN DỮ LIỆU KIỂU CẤU TRÚC
• Có 2 cách
<biến cấu trúc đích> = <biến cấu trúc nguồn>;

<biến cấu trúc đích>.<tên thành phần> = <giá trị>;

• Ví dụ
type struct
{
int x, y;
} DIEM;
DIEM d1= {2912, 1706}, d2;

d2 = d1;
d2.x = d1.x;
d2.y = d1.y * 2;
CẤU TRÚC PHỨC TẠP
• Thành phần của cấu trúc là cấu trúc khác

typedef struct{
int x, y;
}DIEM;

typedef struct{
DIEM traitren, phaiduoi;
}HINHCHUNHAT;

HINHCHUNHAT rec;
rec.traitren.x = 2912;
rec.traitren.y = 1706;
CẤU TRÚC PHỨC TẠP
• Thành phần của cấu trúc là mảng

typedef struct
{
char hoten[30];
float toan, ly, hoa;
} SINHVIEN;
SINHVIEN sv1;
strcpy(sv1.hoten, “Nguyen Van A”);
sv1.toan = 10;
sv1.ly = 6.5;
sv1.hoa = 9;
CẤU TRÚC PHỨC TẠP
• Cấu trúc đệ quy (tự trỏ)
typedef struct
{
char hoten[30];
PERSON *father, *mother;
}PERSON;

typedef struct
{
int value;
NODE *pNext;
} NODE;
CẤU TRÚC PHỨC TẠP
• Thành phần của cấu trúc có kích thước theo bit
struct bit_fields
{
int bit_0 : 1;
int bit_1_to_4 : 4;
int bit_5 : 1;
int bit_6_to_15 : 10;
};

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
KÍCH THƯỚC CỦA STRUCT
• Ví dụ
struct A
{
int a;
double b;
};
sizeof(A) = ???

struct B1 struct B2
{ {
int a; int a;
int b; double c;
double c; int b;
}; };
sizeof(B1) = ??? sizeof(B2) = ???
TRUYỀN CẤU TRÚC CHO HÀM
• Truyền cấu trúc cho hàm
• Giống như truyền kiểu dữ liệu cơ sở
• Tham trị (không thay đổi sau khi kết thúc hàm)
• Tham chiếu
• Con trỏ
• Ví dụ

typedef struct {
int x, y;
} DIEM ;
void xuat1(int x, int y) { … };
void xuat2(DIEM diem) { … };
void xuat3(DIEM &diem) { … };
void xuat4(DIEM *diem) { … };
KIỂU UNION
• Khái niệm
• Được khai báo và sử dụng như cấu trúc
• Các thành phần của union có chung địa chỉ đầu (nằm chồng lên nhau trong bộ nhớ)
• Khai báo

union <tên kiểu union>


{
<kiểu dữ liệu> <tên thành phần 1>;

<kiểu dữ liệu> <tên thành phần 2>;
};
SO SÁNH STRUCT VÀ UNION
• Ví dụ
struct MYSTRUCT union MYUNION
{ {
char c; char c;
int n; int n;
} s; } u;

s.c = 1; s.n = 2; u.c = 1; u.n = 2;

0 1 2 3 4 … … 0 1 2 3 … … …
01 02 00 00 00 … … 02
01 00 00 00 … … …
c n c
n
Ví dụ
• struct trong union
union date_tag
{
char full_date[9];
struct part_date_tag
{
char month[2];
char break_value1;
char day[2];
char break_value2;
char year[2];
};
} date = {“29/12/89”};
struct tm (time.h)
Q&A

You might also like