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:
Mã số sinh viên
Họ tên
Ngày sinh
Email,
37 trang |
Chia sẻ: thanhle95 | Lượt xem: 534 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Bài giảng Kỹ thuật lập trình - Chương 6: Kiểu cấu trúc kiểu mảng – chuỗi - Trần Quang, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Trần Quang
© 2016
Kỹ thuật lập trình
1
Chương 06: Array - struct
Chương 06
Kiểu cấu trúc
Kiểu mảng – chuỗi
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
2
Chương 06: Array - struct
Nội dung
Từ khoá typedef
Cấu trúc
Mảng
Chuỗi ký tự
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
3
Chương 06: Array - struct
Đị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 ;
Ví dụ
typedef unsigned char BYTE;
BYTE a, b;
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
4
Chương 06: Array - struct
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:
Mã số sinh viên
Họ tên
Ngày sinh
Email,
4
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
5
Chương 06: Array - struct
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.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
6
Chương 06: Array - struct
Khai báo kiểu dữ liệu cấu trúc
Khai báo kiểu cấu trúc
struct {
}
Ví dụ
struct sinhvien {
char mssv[8];
char hoten[30];
float dtb;
}
6
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
7
Chương 06: Array - struct
Khai báo biến cấu trúc
Cú pháp:
struct ;
Ví dụ:
struct sinhvien sv1, sv2, sv3;
7
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
8
Chương 06: Array - struct
Khai báo biến cấu trúc
Cú pháp:
struct ;
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] {
;
} ;
8
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
9
Chương 06: Array - struct
Gán giá trị khởi tạo khi khai báo
struct sinhvien {
char mssv[8];
char hoten[30];
float dtb;
};
void main() {
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);
}
S1: Không được khởi động
s2: được khởi động không đầy đủ
s3: được khởi động đầy đủ
Truy xuất dữ liệu thành phần qua tên gọi
Quy tắc: .
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
10
Chương 06: Array - struct
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;
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);
}
cách định nghĩa một tên kiểu mới
là Point3D thông qua typedef
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
11
Chương 06: Array - struct
Mảng
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
12
Chương 06: Array - struct
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
12
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
13
Chương 06: Array - struct
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ụ
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
14
Chương 06: Array - struct
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ì
Đị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
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
15
Chương 06: Array - struct
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
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
16
Chương 06: Array - struct
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:
Đị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
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
17
Chương 06: Array - struct
Mảng 1 chiều
Cú pháp khai báo
[];
Ví dụ
// khai báo mảng A gồm 10 phần tử thuộc kiểu int
int A[10];
17
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
18
Chương 06: Array - struct
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
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
19
Chương 06: Array - struct
Mảng 1 chiều
Hình ảnh trong
bộ nhớ của các
mảng a, b, và c
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
20
Chương 06: Array - struct
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];
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
21
Chương 06: Array - struct
Truy cập đến thành phần của mảng
Truy cập phần tử của mảng thông qua tên mảng
và chỉ số của phần tử trong mảng
[]
Chú ý: chỉ số mảng luôn bắt đầu từ 0
Ví dụ
int a[10]; //mảng nguyên có 10 phần tử
a[0] : phần tử đầu tiên (thứ nhất) của mảng
a[9]: phần tử cuối cùng (thứ 10) của mảng:
a[i-1]: là phần tử thứ i của mảng a
21
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
22
Chương 06: Array - struct
Nhập dữ liệu cho mảng
Dùng hàm scanf()
Ví dụ ta khai báo mảng:
int a[10];
Nhập dữ liệu cho phần tử a[1]:
scanf(“%d”, &a[1]);
Nhập dữ liệu cho toàn bộ các phần tử của mảng
sử dụng vòng lặp for
for (int i=0; i < 10; i++) {
printf ("Nhap a[%d]: ", i);
scanf("%d", &a[i]);
}
22
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
23
Chương 06: Array - struct
Lưu ý
Trường hợp số phần tử của mảng chưa biết trước
(chỉ xác định khi chương trình đang thực hiện)
Khai báo mảng với kích thước tối đa
Sử dụng biến lưu số phần tử thực sự của mảng.
Ví dụ:
int a[100];
int n, i;
printf ("Cho biet so phan tu cua mang: ");
scanf (“%d”,&n);
for(i = 0; i < n; i++){
printf (“a[%d] = ", i);
scanf ("%d",&a[i]);
}
23
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
24
Chương 06: Array - struct
Duyệt mảng 1 chiều
Dùng 1 biến chỉ số (kiểu số nguyên)
Đầu tiên gán chỉ số này bằng 0
Chỉ đến phần tử đầu tiên của mảng
Dùng vòng lặp để duyệt qua mỗi phần tử của mảng
int arr[MAX_SIZE];
int n = 5;
// Nhập mảng ...
// In ra các phần tử trong mảng
for(int i=0; i<n; i++){
printf("%-3d", arr[i]);
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
25
Chương 06: Array - struct
Mảng nhiều chiều
Mỗi phần tử của mảng cũng có thể là một mảng
=> mảng nhiều chiều
Ví dụ
int a[6][5] ;
mảng a gồm 6 phần tử mỗi phần tử lại là một mảng
gồm 5 số nguyên int
Tương đương ma trận 6 dòng x 5 cột
a[0]: phần tử đầu tiên của mảng a, là mảng 1 chiều
a[i][j]: phần tử thứ j+1 của mảng a[i]
25
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
26
Chương 06: Array - struct
Mô hình lưu trữ của mảng 2 chiều
10 20 30 40
50 60 70 80
90 100 110 120
10 20 30 40 50 60 70 80 90 100 110 120
Mô hình một mảng 2 chiều có: 3 hàng x 4 cột
Lưu trữ trong bộ nhớ của mảng 2 chiều: tuyến tính hoá mảng 2 chiều
Phương pháp: lưu hết hàng đến hàng
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
27
Chương 06: Array - struct
Khai báo mảng hai chiều
int a[3][4];
int b[3][4] = { {10, 20, 30} };
int c[3][4] = { {10, 20, 30, 40},
{50, 60}
};
int d[3][4] = { {10, 20, 30, 40},
{50, 60, 70, 80},
{90, 100, 110, 120}
};
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
28
Chương 06: Array - struct
Nhập vào một ma trận
void main(){
int A[20][20], n, m, i, j;
printf("Nhap n va m:"); scanf("%d%d",&n, &m);
for ( i=0; i < n; i++ )
for (j=0; j < m; j++) {
printf("Nhap A[%d,%d]:", i, j);
scanf("%d", &A[i][j] );
}
//
}
28 CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
29
Chương 06: Array - struct
Xuất ma trận ra màn hình
void main(){
// ...
printf ("Ma tran da nhap:\n");
for ( i=0; i < n; i++ ) {
for ( j=0; j < m; j++ )
printf( "%4d" ,A[i][j]);
printf("\n");
}
29 CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
30
Chương 06: Array - struct
Chuỗi
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
31
Chương 06: Array - struct
Mô hình chuỗi trong C
Trong C, chuỗi là mảng của các ký tự trong chuỗi
và kết thúc bằng ký tự đặc biệt là „\0‟
=> Mảng có kích thước N phần tử chỉ có thể chứa
tối đa (N-1) ký tự
Ví dụ: chuỗi “LAP TRINH”
Chiều dài: 9 ký tự
Số lượng ô nhớ cần thiết: 10
’L’ ’P’ ’A’ ’T’ ’ ’ ’R’ ’\0’ ’I’ ’H’ ’N’
Chuỗi kết thúc bằng ký tự đặc biệt
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
32
Chương 06: Array - struct
Khai báo chuỗi
void main(){
const int MAX = 50;
char s1[MAX];
char s2[MAX] = {'L', 'A', 'P', ' ', 'T', 'R', 'I', 'N', 'H', '\0'};
char s3[MAX] = "LAP TRINH";
char s4[] = { 'L', 'A', 'P', ' ', 'T', 'R', 'I', 'N', 'H', '\0'};
char s5[] = "LAP TRINH";
printf("%s\n%s\n%s\n%s\n", s2,s3,s4,s5);
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
33
Chương 06: Array - struct
Các hàm thao tác với chuỗi
Hàm in chuỗi
Hàm: printf với đặc tả %s
#include
#include
int main(){
const int MAX_LEN = 50;
char s1[MAX_LEN] =
{'L', 'A', 'P', ' ', 'T', 'R', 'I', 'N', 'H', '\0'};
char s2[] = "LAP TRINH";
printf("%s\n%s\n", s1,s2);
return 0;
}
In ra hai chuỗi trong các biến s1 và s2
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
34
Chương 06: Array - struct
Các hàm thao tác với chuỗi
Hàm đọc chuỗi: đọc từ (read a word)
Hàm: scanf với đặc tả %s
#include
#include
int main(){
const int MAX_LEN = 50;
char str[MAX_LEN];
printf("Enter a word, %d character max:", MAX_LEN);
scanf("%s", str);
printf("%s\n", str);
return 0;
}
scanf: Đọc đến khi gặp khoảng trắng đọc từ (word)
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
35
Chương 06: Array - struct
Các hàm thao tác với chuỗi
Hàm đọc chuỗi: đọc cả dòng (read a line)
Hàm: gets đọc một dòng, đến khi gặp ký tự xuống
hàng (ENTER)
#include
#include
int main(){
const int MAX_LEN = 50;
char str[MAX_LEN];
printf("Enter a line, %d characters max:", MAX_LEN);
gets(str);
printf("%s\n", str);
return 0;
}
gets: Đọc đến khi gặp ký tự xuống hàng đọc dòng (line)
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
36
Chương 06: Array - struct
Các hàm thao tác với chuỗi
Hàm đọc chuỗi: đọc cả dòng (read a line)
Dùng hàm getchar(), đến khi gặp ký tự xuống hàng
(ENTER)
void main(){
const int max_len = 50;
char str[max_len], ch = '\0';
int i=0;
printf("Enter a string, %d chars max:", max_len);
while(ch!='\n'){
ch=getchar();
str[i]=ch;
i++;
}
str[i]='\0'; //ending string
printf("line: %s",str);
}
getchar: Đọc từng ký tự
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Trần Quang
© 2016
Kỹ thuật lập trình
37
Chương 06: Array - struct
Các hàm thao tác với chuỗi
Các hàm khác:
Hàm Công dụng
strlen Lấy chiều dài chuỗi
strcpy Copy một chuỗi sang chuỗi khác
strcmp So sánh hai chuỗi
strstr Tìm chuỗi con trong một chuỗi
Xem thêm tại:
CuuDuongThanCong.com https://fb.com/tailieudientucntt