=> Khai báo 3 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 hiện được Giải pháp Kiểu dữ liệu mới cho phép lưu trữ một=> Khai báo 3 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 hiện được Giải pháp Kiểu dữ liệu mới cho phép lưu trữ một=> Khai báo 3 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 hiện được Giải pháp Kiểu dữ liệu mới cho phép lưu trữ một
Trường Đại Học Tôn Đức Thắng Khoa Công nghệ thông tin Bộ môn Khoa học máy tính LẬP TRÌNH C ThS Nguyễn Văn Tân Email: nvtan@it.tdt.edu.vn Chương 7: Mảng một chiều 19/05/2014 Chương 7: Mảng một chiều && VC VC BB BB Nội dung 19/05/2014 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 Chương 7: Mảng chiều && VC VC BB 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ữ một dãy số nguyên dễ dàng truy xuất 19/05/2014 Chương 7: Mảng chiều && VC VC BB BB Dữ liệu kiểu mảng Khái niệm Là một kiểu liệu có cấu trúc người lập trình định nghĩa Biểu diễn mợt 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 một khối nhớ liên tục cho một biến kiểu mảng 19/05/2014 Chương 7: Mảng chiều && VC VC BB BB Khai báo biến mảng (tường minh) Tường minh []; [][]…[]; , …, : 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 19/05/2014 Chương 7: Mảng chiều && VC VC BB BB Khai báo biến mảng (tường minh) Ví dụ int Mang1Chieu[10]; 9 Mang1Chieu int Mang2Chieu[3][4]; 10 11 Mang2Chieu 19/05/2014 Chương 7: Mảng chiều && VC VC BB BB Khai báo biến mảng (kô tường minh) Cú pháp Không tường minh (thông qua khai báo kiểu) typedef []; typedef []…[]; ; Ví dụ typedef int Mang1Chieu[10]; typedef int Mang2Chieu[3][4]; Mang1Chieu m1, m2, m3; Mang2Chieu m4, m5; 19/05/2014 Chương 7: Mảng chiều && VC VC BB 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 a[10]; int b[n1][n2]; // int b[10][20]; 19/05/2014 Chương 7: Mảng chiều && VC VC BB 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 một số phần tử đầu mảng int a[4] = {2912, 1706}; a 19/05/2014 2912 1706 0 Chương 7: Mảng chiều && VC VC BB 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 19/05/2014 2912 1706 1506 1904 Chương 7: Mảng chiều && VC VC BB BB Hàm Tách Mảng void TachSNT2(int a[], int na, int b[], int &nb, int c[], int &nc) { nb = 0; nc = 0; for (int i = 0; i < na; i++) if (LaSNT(a[i]) == 1) { b[nb] = a[i]; nb++; } else { c[nc] = a[i]; nc++; } } 19/05/2014 Chương 7: Mảng chiều && VC VC BB BB Gộp mảng thành mảng Yêu cầu Cho trước mảng a, số lượng phần tử na mảng b số lượng phần tử nb Gộp mảng theo tứ tự thành mảng c, số lượng phần tử nc Ý tưởng Chuyển phần tử mảng a sang mảng c => nc = na Tiếp tục đưa phần tử mảng b sang mảng c => nc = nc + nb 19/05/2014 Chương 7: Mảng chiều && VC VC BB BB Hàm Gộp Mảng void GopMang(int a[], int na, int b[], int nb, int c[], int &nc) { nc = 0; for (int i = 0; i < na; i++) { c[nc] = a[i]; nc++; // c[nc++] = a[i]; } for (int i = 0; i < nb; i++) { c[nc] = b[i]; nc++; // c[nc++] = b[i]; } } 19/05/2014 Chương 7: Mảng chiều && VC VC BB BB Tìm giá trị lớn mảng Yêu cầu Cho trước mảng a có n phần tử Tìm giá trị lớn a (gọi max) Ý tưởng Giả sử giá trị max giá trị phần tử a[0] Lần lượt kiểm tra phần tử lại để cập nhật max ma x ? 19/05/2014 n–1 … … … MAX Chương 7: Mảng chiều && VC VC BB BB Hàm tìm Max int TimMax(int a[], int n) { int max = a[0]; for (int i = 1; i < n; i++) if (a[i] > max) max = a[i]; return max; } 19/05/2014 Chương 7: Mảng chiều && VC VC BB BB Sắp xếp mảng thành tăng dần Yêu cầu Cho trước mảng a kích thước n Hãy xếp mảng a cho phần tử có giá trị tăng dần Ý tưởng Sử dụng biến i j để so sánh tất cả cặp phần tử với hoán vị cặp nghịch (sai thứ tự) tạm 5 … j j j j 19/05/2014i n–1 … … MAX Chương 7: Mảng chiều && VC VC BB BB Hàm Sắp Xếp Tăng void SapXepTang(int a[], int n) { int i, j; for (i = 0; i < n – 1; i++) { for (j = i + 1; j < n; j++) { if (a[i] > a[j]) HoanVi(a[i], a[j]); } } } 19/05/2014 Chương 7: Mảng chiều && VC VC BB BB Thêm phần tử vào mảng Yêu cầu Thêm phần tử x vào mảng a kích thước n vị trí vt Ý tưởng “Đẩy” phần tử bắt đầu vị trí vt sang phải vị trí Đưa x vào vị trí vt mảng Tăng n lên đơn vị x chèn? n–1 n a b c … z … 19/05/2014 vt … MAX Chương 7: Mảng chiều && VC VC BB BB Hàm Thêm void Them(int a[], int &n, int vt, int x) { if (vt >= && vt vt; i ) a[i] = a[i - 1]; a[vt] = x; n++; } } 19/05/2014 Chương 7: Mảng chiều && VC VC BB BB Xóa phần tử mảng u cầu Xóa mợt phần tử mảng a kích thước n vị trí vt Ý tưởng “Kéo” phần tử bên phải vị trí vt sang trái vị trí Giảm n xuống đơn vị xóa? a x b 19/05/2014 vt n-1 n–1 … z … … MAX Chương 7: Mảng chiều && VC VC BB BB Hàm Xóa void Xoa(int a[], int &n, int vt) { if (vt >= && vt < n) { for (int i = vt; i < n – 1; i++) a[i] = a[i + 1]; n ; } } 19/05/2014 Chương 7: Mảng chiều && VC VC BB BB Bài tập thực hành Các thao tác nhập xuất a Nhập mảng b Xuất mảng Các thao tác kiểm tra a Mảng có phải mảng tồn chẵn b Mảng có phải mảng tồn số ngun tố c Mảng có phải mảng tăng dần 19/05/2014 Chương 7: Mảng chiều && VC VC BB BB Bài tập thực hành Các thao tác tính tốn a Có số chia hết cho không chia hết cho b Tổng số nguyên tố có mảng Các thao tác tìm kiếm a Vị trí cuối phần tử x mảng b Vị trí số ngun tố mảng có c Tìm số nhỏ mảng d Tìm số dương nhỏ mảng 19/05/2014 Chương 7: Mảng chiều && VC VC BB BB Bài tập thực hành Các thao tác xử lý a Tách số nguyên tố có mảng a đưa vào mảng b b Tách mảng a thành mảng b (chứa số nguyên dương) c (chứa số lại) c Sắp xếp mảng giảm dần d Sắp xếp mảng cho số dương đứng đầu mảng giảm dần, số âm tăng dần, cuối số 19/05/2014 Chương 7: Mảng chiều && VC VC BB BB Bài tập thực hành Các thao tác thêm/xóa/sửa a Sửa số nguyên tố có mảng thành số b Chèn số đằng sau số nguyên tố mảng c Xóa tất cả số nguyên tố có mảng 19/05/2014 Chương 7: Mảng chiều ... ký tự… Kích thư c x c định khai báo không thay đổi NNLT C định một khối nhớ liên t c cho một biến kiểu mảng 19/05/2014 Chương 7: Mảng chiều && VC VC BB BB Khai báo biến mảng (tường... 19/05/2014 Chương 7: Mảng chiều && VC VC BB BB Một số toán bản Viết hàm th c yêu c u sau Nhập mảng Xuất mảng Tìm kiếm mợt phần tử mảng Kiểm tra tính chất mảng Tách mảng / Gợp mảng. .. Mảng chiều && VC VC BB BB Tách ca c phần tử thỏa điều kiện Yêu c u Cho trư c mảng a, số lượng phần tử na Tách số nguyên tố c mảng a vào mảng b Ý tưởng Duyệt từ phần tử mảng a,