Chương 5 giúp người học hiểu về Mảng và xâu ký tự. Nội dung trình bày cụ thể gồm có: Khái niệm, khai báo, truy xuất dữ liệu kiểu mảng, một số bài toán trên mảng 1 chiều,...Đây là tài liệu học tập và giảng dạy dành cho sinh viên ngành tham khảo.
& VC BB TIN HỌC CƠ SỞ MẢNG VÀ XÂU KÝ TỰ ThS Nguyễn Mạnh Sơn Khoa: Công nghệ thông tin Email: nguyenmanhson@gmail.com 6/5/2018 & VC BB Nội dung Khái niệm Khai báo Truy xuất liệu kiểu mảng Một số toán mảng chiều & VC BB Đặt vấn đề Ví dụ Chương trình cần lưu trữ số nguyên? => Khai báo biến int a1, a2, a3; Chương trình cần lưu trữ 100 số nguyên? => Khai báo 100 biến kiểu số nguyên! Người dùng muốn nhập n số nguyên? => Không thực được! Giải pháp Kiểu liệu cho phép lưu trữ dãy số nguyên dễ dàng truy xuất & VC BB Dữ liệu kiểu mảng Khái niệm Là kiểu liệu có cấu trúc người lập trình định nghĩa Biểu diễn dãy biến có kiểu Ví dụ: dãy số nguyên, dãy ký tự… Kích thước xác định khai báo không thay đổi NNLT C định khối nhớ liên tục cho biến kiểu mảng & VC BB Khai báo biến mảng Cú pháp: []; [][]…[]; , …, : số lượng phần tử chiều Lưu ý Phải xác định cụ thể (hằng) khai báo Mảng nhiều chiều: = N1*N2*…*Nn Bộ nhớ sử dụng = *sizeof() Bộ nhớ sử dụng phải 64KB (65535 Bytes) Một dãy liên tục có số từ đến -1 & VC BB Khai báo biến mảng Ví dụ int Mang1Chieu[10]; 9 Mang1Chieu int Mang2Chieu[3][4]; 10 11 Mang2Chieu & VC BB Số phần tử mảng Phải xác định cụ thể số phần tử lúc khai báo, không sử dụng biến thường int n1 = 10; int a[n1]; const int n2 = 20; int b[n2]; Nên sử dụng thị tiền xử lý #define để định nghĩa số phần tử mảng #define n1 10 #define n2 20 int a[n1]; int b[n1][n2]; // int a[10]; // int b[10][20]; & VC BB Khởi tạo giá trị cho mảng lúc khai báo Gồm cách sau Khởi tạo giá trị cho phần tử mảng int a[4] = {2912, 1706, 1506, 1904}; a 2912 1706 1506 1904 Khởi tạo giá trị cho số phần tử đầu mảng int a[4] = {2912, 1706}; a 2912 1706 0 & VC BB Khởi tạo giá trị cho mảng lúc khai báo Gồm cách sau Khởi tạo giá trị cho phần tử mảng int a[4] = {0}; a 0 0 Tự động xác định số lượng phần tử int a[] = {2912, 1706, 1506, 1904}; a 2912 1706 1506 1904 & VC BB Truy xuất đến phần tử Thông qua số [][]…[] Ví dụ Cho mảng sau int a[4]; Các truy xuất • Hợp lệ: a[0], a[1], a[2], a[3] • Khơng hợp lệ: a[-1], a[4], a[5], … Cho kết thường không mong muốn! 10 & VC BB Chuỗi ký tự - Nhập Nhập chuỗi char *gets(char *s); Ví dụ: void main() { char chuoi[80]; printf("Nhap vao chuoi:"); gets(chuoi); printf("Chuoi vua nhap la: %s\n", chuoi); } 56 & VC BB Chuỗi ký tự - Xuất Xuất chuỗi int puts(const char *s); Ví dụ: void main() { char chuoi[] = “Dai hoc Nha Trang\n"; puts(chuoi); } Lưu ý: Cách truy xuất ký tự tương tự mảng chiều 57 & VC BB Ví dụ Nhập vào chuỗi ký tự, xuất hình chuỗi bị đảo ngược thứ tự ký tự void main() { char s1[100], s2[100]; clrscr(); void DaoChuoi(char s1[], char s2[]) printf("\nNhap vao chuoi ky tu: "); { gets(s1); int l=strlen(s1); DaoChuoi(s1, s2); printf("\nKet qua sau dao nguoc for(int i=0; i %s", s1, s2); return 0; } 62 & VC BB Chuỗi ký tự – Một số hàm thư viện Gán nội dung chuỗi: o Chép toàn chuỗi source sang chuỗi dest: int strcpy(char *dest, const char *src); o Chép tối đa n ký tự từ source sang dest: int strncpy(char *dest, const char *src, int n); Tạo chuỗi từ chuỗi có: char *strdup(const char *src); 63 & VC BB Chuỗi ký tự – ví dụ strcpy #include int main() { char s[] = "Tony Blurt"; char s2[100], *s3; Tony Blurt To123Blurt Blurt strcpy(s2, s); printf("%s\n", s2); strncpy(s2 + 2, "12345", 3); printf("%s\n", s2); s3 = strdup(s + 5); printf("%s\n", s3); free(s3); return 0; } 64 & VC BB Chuỗi ký tự – Một số hàm thư viện Nối chuỗi: char *strcat(char *dest,const char *src); Tách chuỗi: char *strtok(char *s,const char *sep); Trả địa đoạn Muốn tách đoạn tham số thứ NULL 65 & VC BB Chuỗi ký tự – ví dụ strtok #include #define SEPARATOR "., " int main() { char s[]= "Thu strtok: 9,123.45"; char *p; Thu strtok: 123 45 p = strtok(s, SEPARATOR); while (p != NULL) { printf("%s\n", p); p = strtok(NULL, SEPARATOR); } return 0; } 66 & VC BB Chuỗi ký tự – Một số hàm thư viện Tìm ký tự chuỗi: char *strchr(const char *s, int c); Tìm đoạn ký tự chuỗi: char *strstr(const char *s1,const char *s2); 67 & VC BB Chuỗi ký tự – ví dụ tìm kiếm #include int main() { char s[]= "Thu tim kiem chuoi"; char *p; p = strchr(s, 'm'); printf("%s\n", p); p = strstr(s, "em"); printf("%s\n", p); return 0; m kiem chuoi em chuoi } 68 & VC BB Chuỗi ký tự – chèn đoạn ký tự #include void StrIns(char *s, char *sub) { int len = strlen(sub); memmove(s + len, s, strlen(s)+1); strncpy(s, sub, len); } 123 Thu chen int main() 123 Thu 45chen { char s[]= "Thu chen"; StrIns(s, "123"); StrIns(s + 8, "45"); return 0; printf("%s\n", s); printf("%s\n", p); } 69 & VC BB Chuỗi ký tự – xóa đoạn ký tự #include void StrDel(char *s, int n) { memmove(s, s + n, strlen(s+n)+1); } xoa 12345 int main() { xoa 45 char s[]= "Thu xoa 12345"; StrDel(s, 4); StrDel(s + 4, 3); return 0; printf("%s\n", s); printf("%s\n", p); } 70 ... Bộ nhớ sử dụng = *sizeof( ) Bộ nhớ sử dụng phải 64KB ( 655 35 Bytes) Một dãy liên tục có số từ đến -1 & VC BB Khai báo biến mảng Ví dụ int Mang1Chieu[10];... biệt với khai báo int a[4]; a = {2912, 1706, 150 6, 1904}; => int a[4] = {2912, 1706, 150 6, 1904}; Chỉ số mảng không hợp lệ int a[4]; a [-1 ] = 1; a[10] = 0; 13 & VC BB Truyền mảng cho hàm... nằm vị trí Ý tưởng Xét phần mảng a Nếu phần tử xét x trả vị trí Nếu kơ tìm trả -1 vị trí = x a x b n-1 … x MAX - … … 23 & Hàm Tìm Kiếm (dùng while) VC BB int TimKiem(int a[], int n, int x) {