Thông tin tài liệu
Trường Đại học Khoa học Tự nhiên Khoa Công nghệ thơng tin NHẬP MƠN LẬP TRÌNH MẢNG MỘT CHIỀU 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 NMLT - 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 SoNguyen1, SoNguyen2, SoNguyen3; 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 NMLT - Mảng chiều 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 NMLT - Mảng chiều VC & BB Khai báo biến mảng Tường minh []; Lưu ý Phải xác định cụ thể (hằng) khai báo 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 NMLT - Mảng chiều VC & BB Khai báo biến mảng Ví dụ int Mang1Chieu[10]; Mang1Chieu NMLT - Mảng chiều 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 MAX1 = 10; int Mang1C_1[MAX1]; const int MAX2 = 20; int Mang1C_2[MAX2]; int Mang1C_3[100]; Số phần tử thực dùng: nM1, nM2 Nên sử dụng thị tiền xử lý #define để định nghĩa số phần tử mảng #define MAX1 10 int Mang1C[MAX1]; int nM; // int a[10]; NMLT - Mảng chiều 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 NMLT - Mảng chiều 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 NMLT - Mảng chiều 10 VC & BB Truy xuất đến phần tử Thông qua số [] Ví dụ Cho mảng sau int Mang1C[4]; Các truy xuất • Hợp lệ: Mang1C[0], Mang1C[1], Mang1C[2], Mang1C[3] • Khơng hợp lệ: Mang1C[-1], Mang1C[4],… => Cho kết thường không mong muốn! NMLT - Mảng chiều 11 VC & Hàm Tách Mảng BB 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++; } } NMLT - Mảng chiều 33 VC & 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 NMLT - Mảng chiều 34 VC & Hàm Gộp Mảng BB 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]; } } NMLT - Mảng chiều 35 VC & 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 max ? n–1 … MAX - … … NMLT - Mảng chiều 36 VC & Hàm tìm Max BB 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; } NMLT - Mảng chiều 37 VC & 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ặp phần tử với hoán vị cặp nghịch (sai thứ tự) tạm 1 … j j j j i n–1 MAX - … … NMLT - Mảng chiều 38 VC & Hàm Sắp Xếp Tăng BB 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]); } } } NMLT - Mảng chiều 39 VC & 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 … vt MAX - … NMLT - Mảng chiều 40 VC & Hàm Thêm BB void Them(int a[], int &n, int vt, int x) { if (vt >= && vt vt; i ) a[i] = a[i - 1]; a[vt] = x; n++; } } NMLT - Mảng chiều 41 VC & BB Xóa phần tử mảng Yêu cầu Xóa 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 vt n-2 n–1 … z MAX - … … NMLT - Mảng chiều 42 VC & Hàm Xóa BB 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 ; } } NMLT - Mảng chiều 43 VC & 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 NMLT - Mảng chiều 44 VC & 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ố ngun 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ố nguyên tố mảng có c Tìm số nhỏ mảng d Tìm số dương nhỏ mảng NMLT - Mảng chiều 45 VC & 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ố NMLT - Mảng chiều 46 VC & 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 số nguyên tố có mảng NMLT - Mảng chiều 47 ... Mảng chiều 18 VC & BB Nhập mảng Yêu cầu Cho phép nhập mảng a, số lượng phần tử n Ý tưởng Cho trước mảng có số lượng phần tử MAX Nhập số lượng phần tử thực n mảng Nhập phần tử cho mảng... Chương trình cần lưu trữ số nguyên? => Khai báo biến int SoNguyen1, SoNguyen2, SoNguyen3; 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... có số từ đến -1 NMLT - Mảng chiều VC & BB Khai báo biến mảng Ví dụ int Mang1Chieu[ 10]; Mang1Chieu NMLT - Mảng chiều VC & BB Số phần tử mảng Phải xác định cụ thể số phần tử lúc
Ngày đăng: 22/09/2020, 09:06
Xem thêm: nhập môn lập trình c07 mang1chieu