Bài giảng Lập trình C/C++ - Chương 6: Kiểu dữ liệu người lập trình định nghĩa - Lê Thành Sách
Từ khoá typedef
n 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ó.
n 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.
n Tên mới giúp rút ngắn mã nguồn
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
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình C/C++ - Chương 6: Kiểu dữ liệu người lập trình định nghĩa - Lê Thành Sách", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Bài giảng Lập trình C/C++ - Chương 6: Kiểu dữ liệu người lập trình định nghĩa - Lê Thành Sách
Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 1 Chương 06 KIỂU DỮ LIỆU NGƯỜI LẬP TRÌNH ĐỊNH NGHĨA Lê Thành Sách CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 2 Nội dung n Từ khoá typedef n Cấu trúc n Mảng CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 3 Quy ước USR_DT = Kiểu dữ liệu Người lập trình định nghĩa CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 4 Từ khoá typedef n 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ó. n 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. n Tên mới giúp rút ngắn mã nguồn 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 CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 5 Từ khoá typedef #include #include /*new name for "unsigned byte"*/ typedef unsigned char byte; int main(){ byte a = 78; unsigned char b = 'A', c; c = a; a = b; printf("a = |%5c:%5d|\n", a,a); printf("b = |%5c:%5d|\n", b,b); printf("c = |%5c:%5d|\n", c,c); system("pause"); return 0; } CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 6 Từ khoá typedef n Ví dụ ở trên n Tên kiểu mới “byte” được định nghĩa và có thể dùng thay cho kiểu “unsigned byte” n => 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 n => Ngắn hơn trong viết mã n => Có thể dùng tương thích với kiểu gốc n Biến a (kiểu mới) có thể gán cho biến c (kiểu gốc) n Biến a (kiểu mới) có thể nhận từ biến b (kiểu gốc) n Có thể in biến a (kiểu mới) như một số hay một ký tự n 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) CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 7 Từ khoá typedef n Các trường hợp dùng khác của typedef n Định nghĩa tên mới cho một enum n Định nghĩa tên mới cho một cấu trúc (struct) CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 8 Cấu trúc n Sự cần thiết n Bài toán: Quản lý sinh viên 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 n Mã số sinh viên n Họ tên sinh viên n Ngày sinh n Địa chỉ n Số điện thoại n Email n V.v CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 9 Cấu trúc n Sự cần thiết n Bài toán: Quản lý sinh viên n Nếu chỉ sử dụng các kiểu cơ bản để lưu trữ tạm một sinh viên trong bộ nhớ. n Người lập trình cần khai báo NHIỀU biến đơn lẻ, mỗi cho một mảnh dữ liệu của sinh viên n => Quá bất tiện: dài dòng, khó hiểu, v.v n => Khi cần vài sinh viên trong bộ nhớ: các dòng khai báo biến đã chiếm một vùng lớn mã nguồn! CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 10 Cấu trúc n Sự cần thiết n Bài toán: Quản lý sinh viên n Tương tự cho hầu hết bài toán trong thực tế n Thông tin một điểm hay vector trong chương trình n Thông tin một sản phẩm, hàng hoá trong siêu thị n V.v. n Giải pháp cho các trường hợp như vậy n GOM tất cả các dữ liệu có quan hệ với nhau thành một khối n Luôn luôn cấp phát CÙNG NHAU, LIÊN TỤC trong bộ nhớ n Luôn luôn được huỷ khỏi bộ nhớ CÙNG NHAU n 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ó. CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 11 Cấu trúc n Sự cần thiết n Giải pháp cho các trường hợp như vậy n GOM tất cả các dữ liệu có quan hệ với nhau thành một khối n Luôn luôn cấp phát CÙNG NHAU, LIÊN TỤC trong bộ nhớ n Luôn luôn được huỷ khỏi bộ nhớ CÙNG NHAU n 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ó. n Đó là cấu trúc (struct) trong C n Trong C++: đó là lớp (class) CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 12 Cấu trúc n Cấu trúc là gì n 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. n 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 CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 13 Cấu trúc n Cấu trúc là gì n Ví dụ struct sStudent{ char id[5]; char name[50]; float gpa; }; struct sPoint3D{ float x, y, z; }; struct sVector3D{ float x, y, z; }; struct sTable{ char code[10]; float width, length, height; }; CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 14 Cấu trúc n Cấu trúc “sStudent” n Gom các thành phần dữ liệu (field) có liên quan với để mô tả một sinh viên n Tên các thành phần hiện có là n id, name: Mã số và họ tên của sinh viên n Có kiểu dữ liệu của nó là mảng (sẽ học sau) n gpa: điểm trung bình hiện đạt: n Có kiểu dữ liệu là số thực (float) n 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; }; CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 15 Cấu trúc n Cấu trúc “sPoint3D” và “sVector3D” n Gom các thành phần dữ liệu (field) có liên quan với để mô tả một điểm và véctơ trong không gian ba chiều. n Tên các thành phần hiện có là n x,y,z: là các toạ độ của điểm và vector n Có kiểu dữ liệu của nó là số thực n Mỗi lần hệ thống cấp phát bộ nhớ cho một điểm hay vector , 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 điểm và vector struct sPoint3D{ float x, y, z; }; struct sVector3D{ float x, y, z; }; CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 16 Cấu trúc n 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; } CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 17 Cấu trúc n 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; } Định nghĩa cấu trúc sStudent S1: Không được khởi động Khai báo các biến s1, s2, s3 có kiểu sStudent s2: được khởi động không đầy đủ s3: được khởi động đầy đủ CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 18 Cấu trúc n 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; } 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ường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 19 Cấu trúc n Một ví dụ sử dụng struct khác #include #include struct sPoint3D{ float x, y, z; }; int main(){ struct sPoint3D p1; struct sPoint3D p2 = {1.5f, 2.5f, 3.5f}; p1.x = 1.0f; p1.y = 2.0f; p1.z = 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; } Lưu ý về: cách khởi động và phép gán dữ liệu thành phần Lưu ý về: cách xuất ra màn hình CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 20 Cấu trúc n Sử dụng typedef với struct n Giúp cắt bỏ từ khoá “struct” khi khai báo biến có kiểu struct. #include #include typedef struct sPoint3D{ 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; } Lưu ý về: cách định nghĩa một tên kiểu DL mới Point3D thông qua typedef CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 21 Cấu trúc n Sử dụng typedef với struct n Giúp cắt bỏ từ khoá “struct” khi khai báo biến có kiểu struct. #include #include typedef struct sPoint3D{ 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; } Lưu ý về: cách định nghĩa một tên kiểu DL mới Point3D thông qua typedef Lưu ý về: việc cắt bỏ từ từ khoá struct trong tên kiểu mới Point3D CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 22 Mảng CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 23 Nội dung n Sự cần thiết n Mảng là gì? n Mảng 1 chiều n Khai báo mảng 1 chiều n Đọc và ghi phần tử mảng n Một phần tử n Tất cả n Các bài toán với mảng n Mảng 2 chiều n Khai báo mảng 1 chiều n Đọc và ghi phần tử mảng n Một phần tử n Tất cả n Các bài toán với mảng n Chuỗi CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 24 Sự cần thiết của mảng n Bài toán: Quản lý sinh viên 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 n Phải cần đến N x M biến. n M là số dữ liệu thành phần của một sinh viên n N = 100 sinh viên, M = 10 dữ liệu thành phần n => 1000 biến! n Khả thi nhưng không hợp lý! n Chương trình khó đọc và khó phát triển CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 25 Sự cần thiết của mảng n Bài toán: Quản lý sinh viên n Giải pháp n (1) Gom các dữ liệu để mô tả một sinh viên cùng với nhau: ta có struct hổ trợ n (2) Lưu trữ N sinh viên dùng kiểu dữ liệu mảng n Nâng cao hơn là danh sách liên kết n C hổ trợ n Mảng (array) để lưu trữ liên tục các phần tử cùng một kiểu n Con trỏ (pointer) để từ đó phát triển danh sách liên kết nếu muốn CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 26 Mảng là gì n 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ớ. n Minh hoạ CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 27 Mảng là gì n Mảng của 6 số nguyên n Sáu số này nằm liên tục nhau trên bộ nhớ n Do đó, n 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 n Thì n Địa chỉ của ô nhớ chứa 20: 104 n Địa chỉ của ô nhớ chứa 30: 108 n Địa chỉ của ô nhớ chứa 40: 112 n Địa chỉ của ô nhớ chứa 50: 116 n Địa chỉ của ô nhớ chứa 60: 120 CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 28 Mảng là gì n Mảng của 6 số nguyên n Sáu số này nằm liên tục nhau trên bộ nhớ n Các phần tử trong mảng được đánh chỉ số để truy xuất n Phần tử đầu tiên LUÔN LUÔN CÓ chỉ số là 0 n Các phần tử kế tiếp theo là 1,2, v.v n Do đó, n Ô nhớ chứa 10 có chỉ số là 0 n Ô nhớ chứa 20 có chỉ số là 1 n Ô nhớ chứa 30 có chỉ số là 2 n Ô nhớ chứa 40 có chỉ số là 3 n Ô nhớ chứa 50 có chỉ số là 4 n Ô nhớ chứa 60 có chỉ số là 5 CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 29 Mảng là gì n Mảng của 6 số nguyên n Sáu số này nằm liên tục nhau trên bộ nhớ n Các phần tử trong mảng được đánh chỉ số để truy xuất n Phần tử đầu tiên LUÔN LUÔN CÓ chỉ số là 0 n Các phần tử kế tiếp theo là 1,2, v.v n Do đó, n Một mảng có N phần tử thì chỉ số các phần tử là 0,1, và cuối cùng là (N-1) - không phải N CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 30 Mảng là gì n Để tính địa chỉ của ô nhớ có chỉ số k, chương trình dùng công thức sau: n Địa chỉ = địa chỉ phần tử đầu tiên + k *(kích thước phần tử) n 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 CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 31 Mảng là gì n Tuy nhiên, Trình biên dịch đã biết trước kích thước của phần tử trong mảng n Do đó, công thức lấy địa chỉ của phần tử có chỉ số k là n first: địa chỉ của phần tử đầu tiên của mảng n first cũng chính là tên biến kiểu mảng Địa chỉ của phần tử có chỉ số k = first + k CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 32 Mảng 1 chiều Khai báo n a: mảng của 6 số nguyên n Giá trị từng phần tử chưa xác định n b: mảng của 6 số nguyên n Giá trị 3 phần tử đầu là: 10, 20, và 30 n Giá trị 3 phần tử sau chưa xác định n c: mảng của 6 số nguyên n Giá trị các phần tử lần lượt là: 10, 20, 30, 40, 50, và 60 #include #include int main(){ int a[6]; int b[6] = {10, 20, 30}; int c[6] = {10, 20, 30, 40, 50, 60}; return 0; } CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 33 Mảng 1 chiều Khai báo n Lưu ... huật tìm phần tử lớn nhất (bé nhất) n Khai báo mảng chưa NUM_STUDENT #include #include #include #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]; /... Để dùng hàm time CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 59 Mảng 1 chiều Các kỹ thuật trên mảng n Kỹ thuật tìm phần tử lớn nhất (bé nhất) n Khởi động mảng /*Initialize the list*/ time_t t; srand((unsigned) time(&t)); for(int i=0; i<NUM_STUDENT ; i++){ list[i].math = ((float)rand() / RAND_MAX)*10; list[i].english = ((float)rand() / RAND_MAX)*10; list[i].physics = ((float)rand() / RAND_MAX)*10; } Sử dụng hàm rand() để sinh số nguyên từ 0 đến RAND_MAX (hằng số) rand()/RAND_MAX: từ 0 đến 1 (rand()/RAND_MAX)*10: từ 0 đến 10 srand: khởi động bộ sinh ngẫu nhiên với thời gian của hệ thống (hàm time) CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 60 Mảng 1 chiều Các kỹ thuật trên mảng n Kỹ thuật tìm phần tử lớn nhất (bé nhất) n 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<NUM_STUDENT; i++){ gpa = (list[i].math + list[i].english + list[i].physics)/3; if(gpa_max < gpa) gpa_max = gpa; if(gpa_min > gpa) gpa_min = gpa; } CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 61 Mảng 1 chiều Các kỹ thuật trên mảng n Kỹ thuật tìm phần tử lớn nhất (bé nhất) n In ra mảng và giá trị bé nhất và lớn nhất tìm được /*Print scoreboard, max gpa, and min gpa*/ printf("|%8s|%8s|%8s|%8s|\n", "MATH", "ENGLISH", "PHYSICS", "GPA"); printf("|-----------------------------------|\n"); for(int i=0; i<NUM_STUDENT; i++){ gpa = (list[i].math + list[i].english + list[i].physics)/3; printf("|%8.1f|%8.1f|%8.1f|%8.1f|\n", list[i].math, list[i].english, list[i].physics, gpa); } printf("%-20s%4.1f\n", "MAX GPA:", gpa_max); printf("%-20s%4.1f\n", "MIN GPA:", gpa_min);CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 62 CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 63 Mảng 2 chiều Ứng dụng n Các ma trận trong toán học (Đại số tuyến tính) là những mảng 2 chiều n Ảnh là mảng 2 chiều của các điểm ảnh (pixel) n Đồ thị (mạng của các đối tượng) có thể được biểu diễn dùng mảng 2 chiều CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 64 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 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ường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 65 Mảng 2 chiều Cách lưu trữ mảng 2 chiều n Các phần tử được lưu trữ liên tục, hết hàng đến hàng n Nếu phần tử đầu tiên (giá trị 10) bắt đầu ở BYTE có địa chỉ là 100 n Phần tử có trị 20 có địa chỉ: 104 n Phần tử có trị 30 có địa chỉ: 108 n Phần tử có trị 50 có địa chỉ: 116 n Phần tử có trị 60 có địa chỉ: 120 n Phần tử có trị 90 có địa chỉ: 132 n Phần tử có trị 100 có địa chỉ: 136 n V.v CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 66 Mảng 2 chiều Cách lưu trữ mảng 2 chiều n Các phần tử được lưu trữ liên tục, hết hàng đến hàng n Các phần tử trong mảng 2 chiều được đánh chỉ số để truy cập, dùng 2 chỉ số. n Gọi row và col là chỉ số của một phần tử n Chỉ số row và col bắt đầu từ 0 đến (Số hàng -1) và (Số cột -1) tương ứng 10 20 30 40 50 60 70 80 90 100 110 120 row 0 1 2 0 1 2 3 col CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 67 Mảng 2 chiều Cách lưu trữ mảng 2 chiều n Các phần tử được lưu trữ liên tục, hết hàng đến hàng n Các phần tử trong mảng 2 chiều được đánh chỉ số để truy cập, dùng 2 chỉ số. n Chương trình có thể tính địa chỉ của ô nhớ bắt đầu của phần tử có chỉ số [row, col] dễ dàng n Địa chỉ của phần tử [row, col] = địa chỉ của phần tử đầu tiên + [row* (số phần tử trên một hàng) + col] * kích thước phần tử 10 20 30 40 50 60 70 80 90 100 110 120 row 0 1 2 0 1 2 3 col CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 68 Mảng 2 chiều Cách lưu trữ mảng 2 chiều n 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] 10 20 30 40 50 60 70 80 90 100 110 120 row 0 1 2 0 1 2 3 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 • Chính là tên mảng COLS: số phần tử trên mỗi hàng CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 69 Mảng 2 chiều Khai báo mảng hai chiều #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; } CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 70 Mảng 2 chiều Khai báo mảng hai chiều #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 mảng 2 chiều, không khởi động Kích thước: 3 hàng, 4 cột Khai báo và khởi động không đầy đủ Kích thước: 3 hàng, 4 cột Khai báo và khởi động đầy đủ Kích thước: 3 hàng, 4 cột CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 71 Mảng 2 chiều Đọc và ghi phần tử của mảng hai chiều #include #include int main(){ int a[3][4]; int r,c; r = 0, c = 2; a[r][c] = 99; printf("a[%1d][%1d] = %3d\n", r, c, a[r][c]); return 0; } Khai báo mảng: Kích thước 3 hàng, 4 cột Lấy giá trị của phần tử Cần chỉ số hàng và cột Gán giá trị cho phần tử Cần chỉ số hàng và cột Hàng và cột: biểu thức nguyên CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 72 Mảng 2 chiều Các kỹ thuật với mảng 2 chiều n Duyệt qua từng phần tử trong mảng n Duyệt qua phần tử trên cùng hàng n Duyệt qua phần tử trên cùng cột n Với ma trận vuông n Duyệt qua phần tử trên đường chéo chính n Duyệt qua phần tử trên đường chéo phụ n Duyệt qua phần tử bên trên đường chéo chính n Duyệt qua phần tử bên dưới đường chéo chính CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 73 Mảng 2 chiều Duyệt qua từng phần tử trong mảng n Gọi ROWS và COLS là tổng số hàng và cột tương ứng n ROWS và COLS là các hằng số n Thông qua #define n Thông qua const int ROWS, COLS; n Gọi row và col là hai biến chứa chỉ số hàng và cột n row: chỉ số hàng n col: số cột CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 74 Mảng 2 chiều Duyệt qua từng phần tử trong mảng n Gọi ROWS và COLS là tổng số hàng và cột tương ứng n ROWS và COLS là các hằng số n Thông qua #define n Thông qua const int ROWS, COLS; n Gọi row và col là hai biến chứa chỉ số hàng và cột n row: chỉ số hàng n col: số cột n Dùng hai cấu trúc lặp lồng nhau n Cho mỗi hàng (row) n Cho mỗi cột (col) n Truy xuất phần tử tại [row, col] để ghi hay đọc n Tăng chỉ số cột (col) để đến phần tử kế tiếp trên cùng hàng n Tăng chỉ số hàng (row) đến xử lý hàng kế tiếp CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 75 Mảng 2 chiều Duyệt qua từng phần tử trong mảng n Lưu ý n Theo cách trên thì sẽ truy xuất các phần tử theo từng hàng, hết hàng này đến hàng hàng n Chỉ số cột tăng nhanh hơn chỉ số hàng n Cách truy xuất trên giúp chương trình chạy nhanh hơn trường hợp truy xuất theo từng cột n Chỉ số hàng tăng nhanh hơn chỉ số cột CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 76 #include #include int main(){ const int ROWS = 3, COLS = 4; int a[ROWS][COLS]; int row,col; /*Initialize array*/ for(row=0; row<ROWS; row++){ for(col=0; col<COLS; col++){ a[row][col] = (row + 1)*(col + 1); } } /*Print array*/ for(row=0; row<ROWS; row++){ for(col=0; col<COLS; col++){ printf("%3d", a[row][col]); } printf("\n"); } return 0; } Lặp trên hàng trước, cột sau (lồng) Truy xuất và gán giá trị Truy xuất và đọc giá trị để in ra Xuống hàng khi in ra hết một hàng CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 77 Chuỗi CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 78 Nội dung n Mô hình chuỗi trong C n Khai báo chuỗi trong C n Các hàm xử lý chuỗi n In chuỗi n Đọc chuỗi n Lấy chiều dài chuỗi n Các kỹ thuật trên chuỗi n Tìm chuỗi con n Xoá khoảng trắng giữa các từ và các khoảng trắng đầu cuối n Nối các chuỗi n Tách chuỗi n Thành các token n Thành tên và họ CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 79 Mô hình chuỗi trong C n 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’ n => Mảng có kích thước N phần tử chỉ có thể chứa tối đa (N-1) ký tự n Ví dụ: chuỗi “LAP TRINH” n Chiều dài: 9 ký tự n 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ường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 80 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; } CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 81 Khai báo chuỗi n char s1[MAX_LEN]; n s1: có thể chứa tối đa (MAX_LEN – 1) ký tự n char s2[MAX_LEN] = {'L', 'A', 'P', ' ', 'T', 'R', 'I', 'N', 'H', '\0'}; n s2: có thể chứa tối đa (MAX_LEN – 1) ký tự n Khởi động chuỗi theo cách khởi động mảng à cần kết thúc bằng ‘\0’ n char s3[MAX_LEN] = "LAP TRINH"; n s3: có thể chứa tối đa (MAX_LEN – 1) ký tự n Khởi động bằng hằng chuỗi à không cần ghi ’\0’ CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 82 Khai báo chuỗi n char s4[] = {'L', 'A', 'P', ' ', 'T', 'R', 'I', 'N', 'H', '\0'}; n s4: mảng của 10 ô nhớ, chứa đúng 9 ký tự chuỗi “LAP TRINH” n Không cần đặt tả kích thước mảng khi khai báo có khởi động n Khởi động theo cách khởi động mảng n char s5[] = "LAP TRINH"; n s5: mảng của 10 ô nhớ, chứa đúng 9 ký tự chuỗi “LAP TRINH” n Không cần đặt tả kích thước mảng khi khai báo có khởi động n Khởi động bằng hằng chuỗi “LAP TRINH” CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 83 Các hàm thao tác với chuỗi n Hàm in chuỗi n 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ường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 84 Các hàm thao tác với chuỗi n Hàm đọc chuỗi: đọc từ (read a word) n 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ường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 85 Các hàm thao tác với chuỗi n Hàm đọc chuỗi: đọc cả dòng (read a line) n 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ường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 86 Các hàm thao tác với chuỗi n Hàm đọc chuỗi: đọc cả dòng (read a line) n 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ự CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 87 Các hàm thao tác với chuỗi n Hàm đọc chuỗi: n Không nên sử dụng chung scanf và gets trong cùng chương trình n scanf: không đọc ký tự xuống hàng à gets sau đó có thể trả về ngay mà không cần người dùng nhập liệu. CuuDuongThanCong.com https://fb.com/tailieudientucntt Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 88 Các hàm thao tác với chuỗi n 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: CuuDuongThanCong.com https://fb.com/tailieudientucntt
File đính kèm:
- bai_giang_lap_trinh_cc_chuong_6_kieu_du_lieu_nguoi_lap_trinh.pdf