Chương 06
Kiểu cấu trúc
Kiểu mảng – chuỗi
Trần Quang
© 2016
Chương 06: Array - struct
Kỹ thuật lập trình
1
Nội dung
Từ khố typedef
Cấu trúc
Mảng
Chuỗi ký tự
Trần Quang
© 2016
Chương 06: Array - struct
Kỹ thuật lập trình
2
Định nghĩa kiểu mới với typedef
typedef cho phép người lập trình tạo ra tên mới
cho một kiểu dữ liệu đã có.
Tên mới mang lại tính dễ hiểu hơn, trong ngữ cảnh
của bài toán đang xét.
Tên mới giúp rút ngắn mã nguồn
Cú pháp
typedef <tên_kiểu_cũ> <tên_mới>;
Ví dụ
typedef unsigned char BYTE;
BYTE a, b;
Trần Quang
© 2016
Chương 06: Array - struct
Kỹ thuật lập trình
3
kiểu cấu trúc (struct)
Là kiểu dữ liệu phức hợp, bao gồm nhiều thành
phần có thể thuộc các kiểu dữ liệu khác nhau
Các thành phần gọi là: trường dữ liệu (field)
Một biến thuộc kiểu cấu trúc được xem là một tập
hợp nhiều biến đơn lẻ thành một biến duy nhất
Ví dụ
Mỗi sinh viên cần lưu các thơng tin:
Trần Quang
© 2016
Mã số sinh viên
Họ tên
Ngày sinh
Email, …
Chương 06: Array - struct
4 trình
Kỹ thuật lập
4
kiểu cấu trúc (struct)
Tất cả các dữ liệu trong một biến cấu trúc có quan
hệ với nhau tạo thành một khối
Luôn luôn cấp phát cùng nhau và sắp xếp liên tục
trong bộ nhớ
Luôn luôn được huỷ khỏi bộ nhớ cùng nhau
Các mảnh dữ liệu thành phần có thể truy xuất độc
lập, thơng quan tên field.
Trần Quang
© 2016
Chương 06: Array - struct
Kỹ thuật lập trình
5
Khai báo kiểu dữ liệu cấu trúc
Khai báo kiểu cấu trúc
struct <tên cấu trúc> {
<khai báo các trường >
}
Ví dụ
struct sinhvien {
char mssv[8];
char hoten[30];
float dtb;
}
Trần Quang
© 2016
Chương 06: Array - struct
6
Kỹ thuật lập trình
6
Khai báo biến cấu trúc
Cú pháp:
struct <tên cấu trúc> <danh sách biến>;
Ví dụ:
struct sinhvien sv1, sv2, sv3;
Trần Quang
© 2016
Chương 06: Array - struct
7 trình
Kỹ thuật lập
7
Khai báo biến cấu trúc
Cú pháp:
struct <tên cấu trúc> <danh sách biến>;
Ví dụ:
struct sinhvien sv1, sv2, sv3;
Kết hợp khai báo biến với khai báo cấu trúc
struct [tên cấu trúc] {
<khai báo các trường>;
} <danh sách biến>;
Trần Quang
© 2016
Chương 06: Array - struct
8 trình
Kỹ thuật lập
8
Gán giá trị khởi tạo khi khai báo
struct sinhvien {
char mssv[8];
char hoten[30];
float dtb;
S1: Không được khởi động
};
s2: được khởi động không đầy đủ
void main() {
s3: được khởi động đầy đủ
struct sinhvien s1;
struct sinhvien s2 = { "001", "Nguyen Van An" };
struct sinhvien s3 = { "001", "Nguyen Van An", 9.5f };
printf("MSSV: %s\n", s3.mssv);
printf("Ho Ten: %s\n", s3.hoten);
Truy xuất dữ liệu thành phần qua tên gọi
}
Quy tắc: <tên biến>.<tên thành phần>
Trần Quang
© 2016
Chương 06: Array - struct
Kỹ thuật lập trình
9
Kết hợp typedef với struct
Bỏ từ khoá “struct” khi khai báo biến có kiểu struct
Ví dụ:
typedef struct sPoint3D {
float x, y, z;
} Point3D;
cách định nghĩa một tên kiểu mới
là Point3D thông qua typedef
void main(){
struct sPoint3D p1 = {1.0f, 2.0f, 3.0f};
Point3D p2 = {1.0f, 2.0f, 3.0f};
printf("p1 = (%4.1f,%4.1f,%4.1f)\n", p1.x, p1.y, p1.z);
printf("p2 = (%4.1f,%4.1f,%4.1f)\n", p2.x, p2.y, p2.z);
}
Trần Quang
© 2016
Chương 06: Array - struct
Kỹ thuật lập trình
10
Mảng
Trần Quang
© 2016
Chương 06: Array - struct
Kỹ thuật lập trình
11
Khái niệm mảng
Mảng là một kiểu dữ liệu gồm một số hữu hạn
thành phần. Các thành phần có cùng một kiểu, gọi
là kiểu cơ sở hay là kiểu thành phần.
Mỗi phần tử của mảng được tham khảo thông qua
tên mảng và chỉ số của phần tử trong mảng
Trần Quang
© 2016
Chương 06: Array - struct
12trình
Kỹ thuật lập
12
Khái niệm mảng
Mảng là một dãy các phần tử cùng một kiểu nằm
liền kề nhau trong bộ nhớ.
Các phần tử có cùng một kiểu, gọi là kiểu cơ sở
Mỗi phần tử của mảng được tham khảo thông qua
tên mảng và chỉ số của phần tử trong mảng
Ví dụ
Trần Quang
© 2016
Chương 06: Array - struct
Kỹ thuật lập trình
13
Khái niệm mảng
Sáu số này nằm liên tục nhau trên bộ nhớ
Do đó,
Nếu ơ nhớ đầu tiên, chứa giá trị 10, bắt đầu ở BYTE
có địa chỉ 100 trong vùng nhớ của chương trình
Thì
Trần Quang
© 2016
Địa chỉ của ơ nhớ chứa 20: 104
Địa chỉ của ô nhớ chứa 30: 108
Địa chỉ của ô nhớ chứa 40: 112
Địa chỉ của ô nhớ chứa 50: 116
Địa chỉ của ô nhớ chứa 60: 120
Chương 06: Array - struct
Kỹ thuật lập trình
14
Khái niệm mảng
Các phần tử trong mảng được đánh chỉ số để truy xuất
Phần tử đầu tiên LUÔN LUÔN CÓ chỉ số là 0
Các phần tử kế tiếp theo là 1, 2, …
Do đó,
Ơ nhớ chứa 10 có chỉ số là 0
Ơ nhớ chứa 20 có chỉ số là 1
Ơ nhớ chứa 30 có chỉ số là 2
Ơ nhớ chứa 40 có chỉ số là 3
…
Trần Quang
© 2016
Chương 06: Array - struct
Kỹ thuật lập trình
15
Khái niệm mảng
Để tính địa chỉ của ơ nhớ có chỉ số k, chương trình
dùng cơng thức sau:
Trần Quang
© 2016
Địa chỉ = địa chỉ phần tử đầu tiên + k *(kích thước
phần tử)
Do đó, chương trình dễ dàng chỉ ra ngay một phần
tử có chỉ số bất kỳ => TRUY CẬP NGẪU NHIÊN
Chương 06: Array - struct
Kỹ thuật lập trình
16
Mảng 1 chiều
Cú pháp khai báo
<kiểu dữ liệu> <tên mảng> [<kích thước>];
Ví dụ
// khai báo mảng A gồm 10 phần tử thuộc kiểu int
int A[10];
Trần Quang
© 2016
Chương 06: Array - struct
17trình
Kỹ thuật lập
17
Mảng 1 chiều
Ví dụ:
int a[6];
int b[6] = {10, 20, 30};
int c[6] = {10, 20, 30, 40, 50, 60};
a: mảng gồm 6 số nguyên giá trị các phần tử chưa
xác định
b: mảng gồm 6 số nguyên. Giá trị 3 phần tử đầu là:
10, 20, và 30. Còn 3 phần tử sau chưa xác định
c: mảng gồm 6 số nguyên. Giá trị các phần tử lần
lượt là: 10, 20, 30, 40, 50, và 60
Trần Quang
© 2016
Chương 06: Array - struct
Kỹ thuật lập trình
18
Mảng 1 chiều
Hình ảnh trong
bộ nhớ của các
mảng a, b, và c
Trần Quang
© 2016
Chương 06: Array - struct
Kỹ thuật lập trình
19
Mảng 1 chiều
Số phần tử của mảng phải biết trước thời điểm
biên dịch và là hằng số không âm.
Sử dụng macro
#define MAX_SIZE
Khai báo hằng số nguyên
const int max_size
#define MAX_SIZE 6
void main(){
const int max_size = 10;
int a[MAX_SIZE];
int b[max_size];
}
Trần Quang
© 2016
Chương 06: Array - struct
Kỹ thuật lập trình
20