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

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,

pdf37 trang | Chia sẻ: thanhle95 | Lượt xem: 406 | Lượt tải: 1download
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
Tài liệu liên quan