Bài giảng Kỹ thuật lập trình - Chương 06: Kiểu dữ liệu người lập trình định nghĩa - Nguyễn Thanh Tùng

ntypedef 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ó.

nTê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.

nTên mới giúp rút ngắn mã nguồn

nTên kiểu mới có thể được dùng như kiểu cơ bản trong định nghĩa của tên này

n

n

pptx 88 trang xuanthi 27/12/2022 3460
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ thuật lập trình - Chương 06: Kiểu dữ liệu người lập trình định nghĩa - Nguyễn Thanh Tùng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pptxbai_giang_ky_thuat_lap_trinh_chuong_06_kieu_du_lieu_nguoi_la.pptx

Nội dung text: Bài giảng Kỹ thuật lập trình - Chương 06: Kiểu dữ liệu người lập trình định nghĩa - Nguyễn Thanh Tùng

  1. Nội dung ◼ Từ khoá typedef ◼ Cấu trúc ◼ Mảng Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 2 © 2016
  2. Từ khoá 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 ◼ Tên kiểu mới có thể được dùng như kiểu cơ bản trong định nghĩa của tên này Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 4 © 2016
  3. Từ khoá typedef ◼ Ví dụ ở trên ◼ Tên kiểu mới “byte” được định nghĩa và có thể dùng thay cho kiểu “unsigned byte” ◼ => Tăng ý nghĩa cho “unsigned char”: kiểu sau khi định nghĩa mô tả các byte dữ liệu, và đương nhiên không có dấu ◼ => Ngắn hơn trong viết mã ◼ => Có thể dùng tương thích với kiểu gốc ◼ Biến a (kiểu mới) có thể gán cho biến c (kiểu gốc) ◼ Biến a (kiểu mới) có thể nhận từ biến b (kiểu gốc) ◼ Có thể in biến a (kiểu mới) như một số hay một ký tự ◼ Biến a có thể tham gia vào biểu thức với các toán tử dùng được cho kiểu gốc (nếu muốn) Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 6 © 2016
  4. Cấu trúc ◼ Sự cần thiết ◼ Bài toán: Quản lý sinh viên ◼ Mỗi sinh viên, chương trình cần lưu và xử lý các mảnh dữ liệu sau ◼ Mã số sinh viên ◼ Họ tên sinh viên ◼ Ngày sinh ◼ Địa chỉ ◼ Số điện thoại ◼ Email ◼ V.v Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 8 © 2016
  5. Cấu trúc ◼ Sự cần thiết ◼ Bài toán: Quản lý sinh viên ◼ Tương tự cho hầu hết bài toán trong thực tế ◼ Thông tin một điểm hay vector trong chương trình ◼ Thông tin một sản phẩm, hàng hoá trong siêu thị ◼ V.v. ◼ Giải pháp cho các trường hợp như vậy ◼ GOM tất cả các dữ liệu có quan hệ với nhau thành một khối ◼ Luôn luôn cấp phát CÙNG NHAU, 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 gọi của nó. Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 10 © 2016
  6. Cấu trúc ◼ Cấu trúc là gì ◼ Là một kiểu dữ liệu mô tả một tổ hợp của các kiểu dữ liệu thành phần khác. Các kiểu dữ liệu thành phần có thể có cùng kiểu hay khác kiểu, thậm chí là một kiểu cấu trúc khác. ◼ Một mở rộng của kiểu này (struct) là kiểu lớp (class) trong các ngôn ngữ lập trình hướng đối tượng Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 12 © 2016
  7. Cấu trúc ◼ Cấu trúc “sStudent” ◼ Gom các thành phần dữ liệu (field) có liên quan với để mô tả một sinh viên ◼ Tên các thành phần hiện có là ◼ id, name: Mã số và họ tên của sinh viên ◼ Có kiểu dữ liệu của nó là mảng (sẽ học sau) ◼ gpa: điểm trung bình hiện đạt: ◼ Có kiểu dữ liệu là số thực (float) ◼ Mỗi lần hệ thống cấp phát bộ nhớ cho một sinh viên, nó cấp đủ CÙNG LÚC, LIỀN NHAU TRÊN KHỐI cho tất cả các mảnh dữ liệu của sinh viên. struct sStudent{ char id[5]; char name[50]; float gpa; Trường Đại Học Bách Khoa }; Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 14 © 2016
  8. Cấu trúc ◼ Khai báo và sử dụng cấu trúc struct sStudent{ char id[5]; char name[50]; float gpa; }; int main(){ struct sStudent s1; struct sStudent s2 = {"001", "Nguyen Van An"}; struct sStudent s3 = {"001", "Nguyen Van An", 9.5f}; printf("ID:\t %-50s\n", s3.id); printf("NAME:\t %-50s\n", s3.name); printf("GPA:\t %-4.1f\n", s3.gpa); return 0; } Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 16 © 2016
  9. Cấu trúc ◼ Khai báo và sử dụng cấu trúc struct sStudent{ Truy xuất dữ liệu thành phần qua tên gọi char id[5]; Quy tắc: . char name[50]; float gpa; }; int main(){ struct sStudent s1; struct sStudent s2 = {"001", "Nguyen Van An"}; struct sStudent s3 = {"001", "Nguyen Van An", 9.5f}; printf("ID:\t %-50s\n", s3.id); printf("NAME:\t %-50s\n", s3.name); printf("GPA:\t %-4.1f\n", s3.gpa); return 0; } Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 18 © 2016
  10. Cấu trúc ◼ Sử dụng typedef với struct ◼ Giúp cắt bỏ từ khoá “struct” khi khai báo biến có kiểu struct. #include #include Lưu ý về: cách định nghĩa một tên kiểu DL mới Point3D thông typedef struct sPoint3D{ qua typedef float x, y, z; } Point3D; int 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); return 0; } Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 20 © 2016
  11. Mảng Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 22 © 2016
  12. Sự cần thiết của mảng ◼ Bài toán: Quản lý sinh viên ◼ Giả sử muốn lưu trữ tạm N sinh viên trong bộ nhớ và chỉ sử dụng kiểu dữ liệu cơ bản ◼ Phải cần đến N x M biến. ◼ M là số dữ liệu thành phần của một sinh viên ◼ N = 100 sinh viên, M = 10 dữ liệu thành phần ◼ => 1000 biến! ◼ Khả thi nhưng không hợp lý! ◼ Chương trình khó đọc và khó phát triển Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 24 © 2016
  13. Mảng là gì ◼ 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ớ. ◼ Minh hoạ Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 26 © 2016
  14. Mảng là gì ◼ Mảng của 6 số nguyên ◼ Sáu số này nằm liên tục nhau trên bộ nhớ ◼ 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, v.v ◼ 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 ◼ Ô nhớ chứa 50 có chỉ số là 4 ◼ Ô nhớ chứa 60 có chỉ số là 5 Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 28 © 2016
  15. Mảng là gì ◼ Để 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 ngày một phần tử có chỉ số bất kỳ => TRUY CẬP NGẪU NHIÊN Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 30 © 2016
  16. Mảng 1 chiều Khai báo #include #include int main(){ int a[6]; int b[6] = {10, 20, 30}; int c[6] = {10, 20, 30, 40, 50, 60}; return 0; } ◼ a: mảng của 6 số nguyên ◼ Giá trị từng phần tử chưa xác định ◼ b: mảng của 6 số nguyên ◼ Giá trị 3 phần tử đầu là: 10, 20, và 30 ◼ Giá trị 3 phần tử sau chưa xác định ◼ c: mảng của 6 số nguyên ◼ Giá trị các phần tử lần lượt là: 10, 20, 30, 40, 50, và 60 Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 32 © 2016
  17. Mảng 1 chiều Khai báo Hình ảnh trong bộ nhớ của các mảng a, b, và c Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 34 © 2016
  18. Mảng 1 chiều Đọc và ghi các phần tử của mảng ◼ Hai cách ◼ Dùng chỉ số để lấy phần tử quan tâm ◼ Tự tính toán địa chỉ và lấy phần tử quan tâm Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 36 © 2016
  19. Mảng 1 chiều Đọc và ghi các phần tử của mảng ◼ Hai cách ◼ Dùng chỉ số để lấy phần tử quan tâm #include #include Chỉ số có thể là hằng số int main(){ int c[6] = {10, 20, 30, 40, 50, 60}; Tổng quát: chỉ số là bất int id = 0; kỳ biểu thức nguyên nào /*Write to element*/ c[3] = 99; c[id + 1] = 100; /*Read and print element*/ printf("c[%1d] = %3d\n", 3, c[3]); printf("c[%1d] = %3d\n", id + 1, c[id + 1]); return 0; } Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 38 © 2016
  20. Mảng 1 chiều Đọc và ghi các phần tử của mảng ◼ Hai cách ◼ Tự tính toán địa chỉ và lấy phần tử quan tâm #include #include int main(){ int c[6] = {10, 20, 30, 40, 50, 60}; int id = 0; /*Write to element*/ *(c + 3) = 99; *(c + (id + 1)) = 100; /*Read and print element*/ printf("c[%1d] = %3d\n", 3, *(c + 3)); printf("c[%1d] = %3d\n", id + 1, *(c + (id + 1))); return 0; } Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 40 © 2016
  21. Mảng 1 chiều Đọc và ghi các phần tử của mảng ◼ Hai cách ◼ Tự tính toán địa chỉ và lấy tham khảo đến phần tử quan tâm ◼ Tính toán địa chỉ ◼ Lấy tham khảo phần tử quan tâm *(c + 3) = 99; Địa chỉ của phần tử đầu tiên của một mảng: • Dùng tên, như trên • c • Cách khác: • &c[0]: toán tử & Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 42 © 2016
  22. Mảng 1 chiều Các kỹ thuật trên mảng ◼ Duyệt qua tất cả các phần trên mảng ◼ 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ỉ ra 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 ◼ Tại mỗi vòng lặp ◼ Truy xuất phần tử chỉ ra bởi chỉ số: đọc hay ghi ◼ Tăng chỉ số lên 1 Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 44 © 2016
  23. Mảng 1 chiều Các kỹ thuật trên mảng ◼ Duyệt qua tất cả các phần trên mảng #include #include Mảng có MAX_SIZE (100) số nguyên #define MAX_SIZE 100 Số phần tử đang dùng thực là cur_size int main(){ (có thể nhập bởi người dùng) int arr[MAX_SIZE]; int cur_size = 5; //use 5 items only /*Initialize array*/ for(int i=0; i<cur_size; i++){ Vòng lòng for: duyệt arr[i] = i*i; qua từng phần tử để } ghi và để đọc và in ra /*Print array*/ màn hình for(int i=0; i<cur_size; i++){ printf("%-3d", arr[i]); } return 0; Trường} Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 46 © 2016
  24. Mảng 1 chiều Các kỹ thuật trên mảng ◼ Tính tổng các phần tử của mảng ◼ Kỹ thuật lặp ◼ Kỹ thuật đệ quy (trình bày trong chương về hàm) Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 48 © 2016
  25. #include #include #define MAX_SIZE 100 int main(){ int arr[MAX_SIZE]; int cur_size = 5; //use 5 items only /*Initialize array*/ for(int i=0; i<cur_size; i++){ arr[i] = i*i; } /*Print array*/ printf("ARRAY's elements:\n"); for(int i=0; i<cur_size; i++){ printf("%-3d", arr[i]); } // } Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 50 © 2016
  26. Mảng 1 chiều Các kỹ thuật trên mảng ◼ Kỹ thuật tìm phần tử lớn nhất ◼ Dùng biến max_value chứa phần tử lớn nhất ◼ Khởi động max_value = nhỏ hơn cả phần tử nhỏ nhất ◼ Nếu không biết miền giá trị các phần tử, có thể khởi động bằng phần tử đầu tiên của mảng ◼ Dùng cấu trúc lặp duyệt qua từng phần tử trong mảng ◼ Với mỗi phần tử tại chỉ số ID, ◼ Nếu phần tử đó LỚN NHẤT cả phần tử max_value ◼ Gán max_value = phần tử hiện tại ID ◼ Tăng ID lên 1 để đi đến phần tử kế tiếp Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 52 © 2016
  27. Mảng 1 chiều Các kỹ thuật trên mảng ◼ Kỹ thuật tìm phần tử lớn nhất (bé nhất) ◼ Bài toán ◼ Mỗi sinh viên có chứa ◼ Mã số (code), tên (name), điểm Toán (math), Anh văn (english), và Lý (physics) ◼ Giả sử có danh sách của N sinh viên. ◼ Chương trình khởi động danh sách với 3 cột điểm sinh ngẫu nhiên từ 0 đến 10. Mã số và tên của sinh viên chưa cần gán ◼ Tìm điểm trung bình lớn nhất và nhỏ nhất và in ra màn hình. Kết quả như hình sau Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 54 © 2016
  28. Mảng 1 chiều Các kỹ thuật trên mảng ◼ Kỹ thuật tìm phần tử lớn nhất (bé nhất) ◼ Phân tích ◼ Cần định nghĩa kiểu dữ liệu mới là Student, chứa các trường thông tin như trên ◼ Tổ chức lưu danh sách của tối đa là NUM_STUDENT sinh viên. ◼ Khởi động mảng theo yêu cầu ◼ 3 cột điểm ngẫu nhiên từ 0 đến 10 ◼ Tìm điểm trung bình cao nhất và thấp nhất và in ra. ◼ Điểm trung bình = tổng 3 cột điểm / 3 ◼ Viết chương trình Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 56 © 2016
  29. Mảng 1 chiều Các kỹ thuật trên mảng ◼ Kỹ thuật tìm phần tử lớn nhất (bé nhất) ◼ Khai báo mảng chưa NUM_STUDENT #include #include #include Để dùng hàm time #define NUM_STUDENT 5 typedef struct sStudent{ char student_code[10]; char student_name[50]; float math, english, physics; } Student; int main(){ /*List of students*/ Student list[MAX_SIZE]; / Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 58 © 2016
  30. Mảng 1 chiều Các kỹ thuật trên mảng ◼ Kỹ thuật tìm phần tử lớn nhất (bé nhất) ◼ Tìm giá trị lớn nhất và bé nhất trong mảng /*Find max gpa and min gpa*/ float gpa_max = -1.0f; float gpa_min = 11.0f; float gpa; for(int i=0; i gpa) gpa_min = gpa; } Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 60 © 2016
  31. Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 62 © 2016
  32. Mảng 2 chiều Mô hình vs Lưu trữ vật lý 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 10 20 30 40 50 60 70 80 90 100 110 120 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 Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 64 © 2016
  33. Mảng 2 chiều Cách lưu trữ mảng 2 chiều ◼ Các phần tử được lưu trữ liên tục, hết hàng đến hàng ◼ Các phần tử trong mảng 2 chiều được đánh chỉ số để truy cập, dùng 2 chỉ số. ◼ Gọi row và col là chỉ số của một phần tử ◼ Chỉ số row và col bắt đầu từ 0 đến (Số hàng -1) và (Số cột -1) tương ứng col 0 1 2 3 0 10 20 30 40 row 1 50 60 70 80 2 90 100 110 120 Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 66 © 2016
  34. Mảng 2 chiều Cách lưu trữ mảng 2 chiều ◼ Bộ biên dịch đã biết trước kích thước phần tử. Do đó, người lập trình tính toán địa chỉ của phần tử tại [row, col] Địa chỉ của phần tử [row, col] = first + [row* COLS + col] first: địa chỉ của phần tử đầu tiên col • Chính là tên mảng 0 1 2 3 COLS: số phần tử trên mỗi hàng 0 10 20 30 40 row 1 50 60 70 80 2 90 100 110 120 Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 68 © 2016
  35. Mảng 2 chiều Khai báo và khởi động không đầy đủ Khai báo mảng hai chiều Kích thước: 3 hàng, 4 cột Khai báo mảng 2 chiều, không khởi động Kích thước: 3 hàng, 4 cột #include #include int main(){ 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} }; return 0; } Khai báo và khởi động đầy đủ Kích thước: 3 hàng, 4 cột Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 70 © 2016
  36. Mảng 2 chiều Các kỹ thuật với mảng 2 chiều ◼ Duyệt qua từng phần tử trong mảng ◼ Duyệt qua phần tử trên cùng hàng ◼ Duyệt qua phần tử trên cùng cột ◼ Với ma trận vuông ◼ Duyệt qua phần tử trên đường chéo chính ◼ Duyệt qua phần tử trên đường chéo phụ ◼ Duyệt qua phần tử bên trên đường chéo chính ◼ Duyệt qua phần tử bên dưới đường chéo chính Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 72 © 2016
  37. Mảng 2 chiều Duyệt qua từng phần tử trong mảng ◼ Gọi ROWS và COLS là tổng số hàng và cột tương ứng ◼ ROWS và COLS là các hằng số ◼ Thông qua #define ◼ Thông qua const int ROWS, COLS; ◼ Gọi row và col là hai biến chứa chỉ số hàng và cột ◼ row: chỉ số hàng ◼ col: số cột ◼ Dùng hai cấu trúc lặp lồng nhau ◼ Cho mỗi hàng (row) ◼ Cho mỗi cột (col) ◼ Truy xuất phần tử tại [row, col] để ghi hay đọc ◼ Tăng chỉ số cột (col) để đến phần tử kế tiếp trên cùng hàng ◼ Tăng chỉ số hàng (row) đến xử lý hàng kế tiếp Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 74 © 2016
  38. #include #include int main(){ const int ROWS = 3, COLS = 4; int a[ROWS][COLS]; int row,col; Lặp trên hàng trước, cột sau (lồng) /*Initialize array*/ for(row=0; row<ROWS; row++){ for(col=0; col<COLS; col++){ a[row][col] = (row + 1)*(col + 1); } } Truy xuất và gán giá trị /*Print array*/ for(row=0; row<ROWS; row++){ for(col=0; col<COLS; col++){ printf("%3d", a[row][col]); } printf("\n"); Truy xuất và đọc giá trị để in ra } Trường Đại HọcreturnBách Khoa0; Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán Xuống hàng khi in ra hết một hàng 76 ©} 2016
  39. Nội dung ◼ Mô hình chuỗi trong C ◼ Khai báo chuỗi trong C ◼ Các hàm xử lý chuỗi ◼ In chuỗi ◼ Đọc chuỗi ◼ Lấy chiều dài chuỗi ◼ Các kỹ thuật trên chuỗi ◼ Tìm chuỗi con ◼ Xoá khoảng trắng giữa các từ và các khoảng trắng đầu cuối ◼ Nối các chuỗi ◼ Tách chuỗi ◼ Thành các token ◼ Thành tên và họ Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 78 © 2016
  40. Khai báo chuỗi #include #include int main(){ const int MAX_LEN = 50; char s1[MAX_LEN]; char s2[MAX_LEN] = {'L', 'A', 'P', ' ', 'T', 'R', 'I', 'N', 'H', '\0'}; char s3[MAX_LEN] = "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); return 0; } Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 80 © 2016
  41. Khai báo chuỗi ◼ char s4[] = {'L', 'A', 'P', ' ', 'T', 'R', 'I', 'N', 'H', '\0'}; ◼ s4: mảng của 10 ô nhớ, chứa đúng 9 ký tự chuỗi “LAP TRINH” ◼ Không cần đặt tả kích thước mảng khi khai báo có khởi động ◼ Khởi động theo cách khởi động mảng ◼ char s5[] = "LAP TRINH"; ◼ s5: mảng của 10 ô nhớ, chứa đúng 9 ký tự chuỗi “LAP TRINH” ◼ Không cần đặt tả kích thước mảng khi khai báo có khởi động ◼ Khởi động bằng hằng chuỗi “LAP TRINH” Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 82 © 2016
  42. 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) Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 84 © 2016
  43. 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) #include #include int 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); return 0; } getchar: Đọc từng ký tự Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 86 © 2016
  44. 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 chi tiết tại: Trường Đại Học Bách Khoa Lập trình C/C++ Trung Tâm Kỹ Thuật Điện Toán 88 © 2016