Professional Documents
Culture Documents
L3 Struct
L3 Struct
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{
Date x;
x.ngay = 5;
TRUY CẬP CÁC THUỘC TÍNH CẤU TRÚC
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ó
• 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.
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 ý:
• 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).
b) Tìm thông tin của một nhân viên nào đó bằng cách nhập tên.
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
• 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>;
• 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
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