1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Kỹ thuật lập trình: Bài 7 - Phạm Đình Sắc

24 6 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 24
Dung lượng 4,99 MB

Nội dung

Bài 7: Mảng một chiều thuộc bài giảng Kỹ thuật lập trình trang bị cho sinh viên các kiến thức về dữ liệu kiểu mảng, khai báo biến mảng, truyền mảng cho hàm, hàm tìm kiếm, hàm kiểm tra, hàm tách số nguyên tố, hàm tách 2 mảng.

Trường Cao đẳng Kỹ thuật Công nghệ Đồng Nai Khoa Cơng nghệ thơng tin NHẬP MƠN LẬP TRÌNH Phạm Đình Sắc dinhsac@gmail.com MẢNG MỘT CHIỀU VC VC && BB 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 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ữ dãy số nguyên dễ dàng truy xuất NMLT - Mảng chiều VC VC && BB 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 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 NMLT - 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 NMLT - 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; NMLT - 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 b[n1][n2]; //  int a[10]; //  int b[10][20]; NMLT - 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 số phần tử đầu mảng int a[4] = {2912, 1706}; a 2912 1706 0 NMLT - 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 2912 1706 1506 1904 NMLT - Mảng chiều 10 VC VC && BB 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! NMLT - Mảng chiều VC VC && BB BB 11 Gán liệu kiểu mảng Không sử dụng phép gán thông thường mà phải gán trực tiếp phần tử tương ứng Ví dụ #define MAX typedef int MangSo[MAX]; MangSo a = {1, 2, 3}, b; b = a; // Sai for (int i = 0; i < 3; i++) b[i] = a[i]; NMLT - Mảng chiều 12 VC VC && BB BB Một số lỗi thường gặp  Khai báo không rõ số lượng phần tử  int a[ ]; => int a[100];  Số lượng phần tử liên quan đến biến  int n1 = 10; int a[n1]; => int a[10];  const int n2 = 10; int a[n2]; => int a[10];  Khởi tạo cách biệt với khai báo  int a[4]; a = {2912, 1706, 1506, 1904}; => int a[4] = {2912, 1706, 1506, 1904};  Chỉ số mảng không hợp lệ  int a[4];  a[-1] = 1; a[10] = 0; NMLT - Mảng chiều VC VC && BB BB 13 Truyền mảng cho hàm Truyền mảng cho hàm  Tham số kiểu mảng khai báo hàm giống khai báo biến mảng void SapXepTang(int a[100]);  Tham số kiểu mảng truyền cho hàm địa phần tử mảng • Có thể bỏ số lượng phần tử sử dụng trỏ • Mảng thay đổi nội dung sau thực hàm void SapXepTang(int a[]); void SapXepTang(int *a); NMLT - Mảng chiều 14 VC VC && BB BB Truyền mảng cho hàm Truyền mảng cho hàm  Số lượng phần tử thực truyền qua biến khác void SapXepTang(int a[100], int n); void SapXepTang(int a[], int n); void SapXepTang(int *a, int n); Lời gọi hàm void NhapMang(int a[], int &n); void XuatMang(int a[], int n); void main() { int a[100], n; NhapMang(a, n); XuatMang(a, n); } VC VC && BB BB NMLT - Mảng chiều 15 Một số toán Viết hàm thực yêu cầu sau  Nhập mảng  Xuất mảng  Tìm kiếm phần tử mảng  Kiểm tra tính chất mảng  Tách mảng / Gộp mảng  Tìm giá trị nhỏ nhất/lớn mảng  Sắp xếp mảng giảm dần/tăng dần  Thêm/Xóa/Sửa phần tử vào mảng NMLT - Mảng chiều 16 VC VC && BB BB Một số quy ước Số lượng phần tử #define MAX 100 Các hàm  Hàm void HoanVi(int &x, int &y): hoán vị giá trị hai số nguyên  Hàm int LaSNT(int n): kiểm tra số có phải số nguyên tố Trả n số nguyên tố, ngược lại trả NMLT - Mảng chiều VC VC && BB BB 17 Thủ tục HoanVi & Hàm LaSNT NMLT - Mảng chiều 18 VC VC && Nhập mảng BB BB 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 từ số đến n – 1 n4 -1 … MAX - … … NMLT - Mảng chiều VC VC && BB BB 19 Hàm Nhập Mảng void NhapMang(int a[], int &n) { printf(“Nhap so luong phan tu n: ”); scanf(“%d”, &n); for (int i = 0; i < n; i++) { printf(“Nhap phan tu thu %d: ”, i); scanf(“%d”, &a[i]); } } NMLT - Mảng chiều 20 VC VC && Xuất mảng BB BB Yêu cầu  Cho trước mảng a, số lượng phần tử n Hãy xuất nội dung mảng a hình Ý tưởng  Xuất giá trị phần tử mảng từ số đến n1 n-1 … MAX - … … NMLT - Mảng chiều VC VC && BB BB 21 Hàm Xuất Mảng void XuatMang(int a[], int n) { printf(“Noi dung cua mang la: ”); for (int i = 0; i < n; i++) printf(“%d ”, a[i]); printf(“\n”); } NMLT - Mảng chiều 22 VC VC && BB BB Tìm kiếm phần tử mảng Yêu cầu  Tìm xem phần tử x có nằm mảng a kích thước n hay khơng? Nếu có 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 - … … NMLT - Mảng chiều VC VC && BB BB 23 Hàm Tìm Kiếm (dùng while) NMLT - Mảng chiều 24 VC VC && Hàm Tìm Kiếm (dùng for) BB BB int TimKiem(int a[], int n, int x) { for (int vt = 0; vt < n; vt++) if (a[vt] == x) return vt; return -1; } NMLT - Mảng chiều VC VC && BB BB 25 Kiểm tra tính chất mảng Yêu cầu  Cho trước mảng a, số lượng phần tử n Mảng a có phải mảng tồn số nguyên tố hay không? Ý tưởng  Cách 1: Đếm số lượng số ngtố mảng Nếu số lượng n mảng tồn ngtố  Cách 2: Đếm số lượng số ngtố mảng Nếu số lượng mảng tồn ngtố  Cách 3: Tìm xem có phần tử khơng phải số ngtố khơng Nếu có mảng khơng tồn số ngtố NMLT - Mảng chiều 26 VC VC && BB BB Hàm Kiểm Tra (Cách 1) int KiemTra_C1(int a[], int n) { int dem = 0; for (int i = 0; i < n; i++) if (LaSNT(a[i]) == 1) // bỏ == dem++; if (dem == n) return 1; return 0; } NMLT - Mảng chiều VC VC && BB BB 27 Hàm Kiểm Tra (Cách 2) int KiemTra_C2(int a[], int n) { int dem = 0; for (int i = 0; i < n; i++) if (LaSNT(a[i]) == 0) // Có thể sử dụng ! dem++; if (dem == 0) return 1; return 0; } NMLT - Mảng chiều 28 VC VC && Hàm Kiểm Tra (Cách 3) BB BB int KiemTra_C3(int a[], int n) { for (int i = 0; i < n ; i++) if (LaSNT(a[i]) == 0) return 0; return 1; } NMLT - Mảng chiều VC VC && BB BB 29 Tách 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, số nguyên tố đưa vào mảng b NMLT - Mảng chiều 30 VC VC && Hàm Tách Số Nguyên Tố BB BB void TachSNT(int a[], int na, int b[], int &nb) { nb = 0; for (int i = 0; i < na; i++) if (LaSNT(a[i]) == 1) { b[nb] = a[i]; nb++; } } 31 NMLT - Mảng chiều VC VC && BB BB Tách mảng thành mảng Yêu cầu  Cho trước mảng a, số lượng phần tử na Tách mảng a thành mảng b (chứa số nguyên tố) mảng c (các số lại) Ý tưởng  Cách 1: viết hàm tách số nguyên tố từ mảng a sang mảng b hàm tách số nguyên tố từ mảng a sang mảng c  Cách 2: Duyệt từ phần tử mảng a, số nguyên tố đưa vào mảng b, ngược lại đưa vào mảng c NMLT - Mảng chiều 32 VC VC && Hàm Tách Mảng BB 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 VC VC && BB BB 33 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 VC && Hàm Gộp Mảng BB 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 VC VC && BB BB 35 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 VC && Hàm tìm Max BB 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 VC VC && BB BB 37 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 5 … i j j j j n–1 MAX - … … NMLT - Mảng chiều 38 VC VC && Hàm Sắp Xếp Tăng BB 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 VC VC && BB BB 39 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 VC && Hàm Thêm BB 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 VC VC && BB BB 41 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-1 n–1 … z MAX - … … NMLT - Mảng chiều 42 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 ; } } NMLT - Mảng chiều VC VC && BB BB 43 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 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ố 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 VC VC && BB BB 45 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 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 số nguyên tố có mảng NMLT - Mảng chiều 47 ... 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 - … … NMLT - Mảng chiều VC VC && BB BB 23 Hàm Tìm Kiếm (dùng while) NMLT - Mảng chiều 24 VC VC && Hàm Tìm Kiếm (dùng... - Mảng chiều 20 VC VC && Xuất mảng BB BB Yêu cầu  Cho trước mảng a, số lượng phần tử n Hãy xuất nội dung mảng a hình Ý tưởng  Xuất giá trị phần tử mảng từ số đến n1 n-1 … MAX - … … NMLT -. .. khai báo  int a[4]; a = {2912, 170 6, 1506, 1904}; => int a[4] = {2912, 170 6, 1506, 1904};  Chỉ số mảng không hợp lệ  int a[4];  a [-1 ] = 1; a[10] = 0; NMLT - Mảng chiều VC VC && BB BB 13 Truyền

Ngày đăng: 11/05/2021, 03:31

TỪ KHÓA LIÊN QUAN