SlideShare a Scribd company logo
Mảng - Array
Mảng – Array Một số tính chất Khai báo mảng trong C Truy xuất các thành phần Truyền tham số kiểu mảng cho hàm Một số thao tác cơ sở Mảng nhiều chiều
Mảng –  Một số tính chất Mảng là một kiểu dữ liệu có cấu trúc do người lập trình định nghĩa Dùng biểu diễn các đối tượng dữ liệu ở dạng một dãy các thành phần có cùng kiểu với nhau – kiểu cơ sở NNLT C luôn chỉ định một khối nhớ liên tục cho một biến kiểu mảng Kích thước của mảng được xác định ngay khi khai báo và không bao giờ thay đổi
Mảng –  Khai báo trong C typedef   kiểucơsở  Tênkiểu [ Sốthànhphần ] ; kiểu của mỗi thành phần hằng số, số thành phần tối đa của mảng do lập trình viên đặt tên typedef int   AINT[ 100 ]; // AINT  là kiểu mảng biểu diễn dãy gồm 100 thành phần int AINT a; //a: biến kiểu AINT
Mảng –  Ví dụ #define SIZE 10 int a[5]; // a dãy gồm 5 số nguyên  long int big[100]; // big: chiếm 400 bytes! double d[100]; // d: chiếm 800 bytes!  long double v[SIZE];// v:10 long doubles
Mảng –  Ví dụ int a[5]  = { 10, 20, 30, 40, 50}; double d[100]  = { 1.5, 2.7}; short primes[] = { 1, 2, 3, 5, 7, 11, 13}; long b[50]  = { 0 }; int i = 7; const int c = 5; int a[i]; double d[c]; short primes[]; khởi trị cho 5 thành phần 2 thành phần đầu tiên được khởi trị, phần còn lại: 0 compiler xác định kích thước gồm 7 thành phần cách nhanh nhất để khởi trị tất cả các thành phần bằng 0
Các thành phần của mảng được truy xuất thông qua chỉ số của chúng 0..size-1 Thao tác truy xuất không kiểm tra giới hạn của chỉ số Mảng –  Truy xuất các phần tử int main() { int a[6]; int i = 7; a[0] = 59; a[5] = -10; a[i/2] = 2; a[6] = 0; a[-1] = 5; return 0; } 0 a 1 2 3 4 5
Truyền tham số Mảng cho hàm Tham số kiểu mảng được truyền cho hàm chính là địa chỉ của phần tử đầu tiên trên mảng Số thành phần trong tham số mảng có thể để trống. Số thành phần thực sự được sử dụng phải truyền qua một tham số khác (vd: size) int add_elements(int a[], int size) { int add_elements(int *p, int size) {
Ví dụ #include <stdio.h> void sum(long [], int); int main(void) { long primes[6] = { 1, 2, 3, 5, 7, 11 }; sum(primes, 6); printf(&quot;%li\n&quot;, primes[0]); return 0; } void sum(long a[], int sz) { int i; long total = 0; for(i = 0; i < sz; i++) total += a[i]; a[0] = total; } 1 2 3 5 7 11 primes a sz 6 tổng được lưu vào phần tử đầu tiên dùng để kiểm tra giới hạn chỉ số
Một số thao tác cơ sở Nhập Xuất Thêm một thành phần dữ liệu Loại bỏ một thành phần dữ liệu Tìm kiếm Sắp xếp
Mảng –  Nhập dữ liệu void ReadData(int a[], int size)  { int i; for(i = 0; i < size; i++) { printf(“Nhap thanh phan %d: ”, i); scanf(“%d”, &a[i]); } } duyệt qua tất cả các phần tử nhập dữ liệu cho a[i]
Mảng –  Xuất dữ liệu ra màn hình void WriteData(int a[], int size)  { int i; for(i = 0; i < size; i++) printf(“%d ”, a[i]); printf(“\n”); }
Mảng –  Nhập xuất dữ liệu #include <stdio.h> void ReadData(int [], int ); void WriteData(int [], int ); void main()  { int a[100], n; clrscr(); printf(“Nhap so thanh phan cua day: “); scanf(“%d”, &n); printf(“Nhap cac thanh phan cua day: “); ReadData(a, n); printf(“Day vua nhap: \n“); WriteData(a, n); }
Mảng –  Tìm vị trí X trong dãy Bài toán: Tìm vị trí  X trên mảng a đang có N thành phần. Giải pháp: Tìm tuần tự //input: dãy (a, N), X //output: Vị trí của X, -1 nếu không có int Search(int a[], int N, int X)  { for (int i = 0; i < N; i ++) if (a[i] == X) return i; return -1; }
Mảng  – Thêm một thành phần dữ liệu Bài toán: cần thêm thành phần dữ liệu X vào mảng a đang có N thành phần. Hai trường hợp cần xem xét: Dãy chưa có thứ tự   Thêm X vào cuối a. Dãy đã có thứ tự   Tìm vị trí thích hợp, chèn X vào
Mảng –  Thêm X vào cuối dãy 2 8 5 1 6 4 15 12 Thêm 15 vào (a, 7) N = 7 N = 8 a[N] = X; N ++; X 1 2 3 4 5 6 7 0
Mảng –  Chèn X vào dãy tăng dần 2 4 5 8 12 15 6 1 Chèn 6 vào (a, 7) N = 7 N = 8 X Vị trí thích hợp: 4 pos 1 2 3 4 5 6 7 0
Mảng –  Chèn X vào dãy tăng dần //input: dãy (a, N) tăng dần, X //output: dãy (a, N) đã có X ở đúng vị trí void Insert(int a[], int &N, int X)  { int pos; for (pos = N; (pos>0)&&(a[pos-1]>X); pos --) a[pos] = a[pos – 1]; a[pos] = X; N ++; }
Mảng  – Loại bỏ một thành phần dữ liệu Bài toán: loại bỏ thành phần dữ liệu X ra khỏi mảng a đang có N thành phần. Hướng giải quyết: xác định vị trí của X, nếu tìm thấy thì dồn các phần tử ở phía sau lên để lấp vào chỗ trống. 2 trường hợp: Dãy không có thứ tự: lấp phần tử cuối lên Dãy đã thứ tự: dời tất cả các phần tử ở sau ví trí của X lên trước 1 vị trí.
Mảng –  Loại bỏ X ra khỏi dãy tăng N = 8 2 8 5 1 6 4 15 12 Loại 5 khỏi (a, 8) N = 7 pos Tìm vị trí của 5 5 X Dồn các vị trí 4, 5, 6, 7 lên 1 2 3 4 5 6 7 0 STOP  Ok, found
Mảng –  Loại bỏ X ra khỏi dãy tăng //input: dãy (a, N), X //output: dãy (a, N) đã loại bỏ 1 thành phần X int Remove(int a[], int &N, int X)  { int pos = Search(a, N, X); if (pos == -1) //không có X trong dãy return 0; N --; for (; (pos < N); pos ++) a[pos] = a[pos + 1]; return 1; }
Mảng –  Sắp xếp Bài toán: Sắp xếp các thành phần của (a, N) để thu được dãy tăng dần Giải pháp: Tìm cách triệt tiêu tất cả các nghịch thế của dãy   Thuật toán sắp xếp  Đổi chổ trực tiếp
Mảng –  Sắp xếp đổi chổ 2 8 5 1 6 4 15 12 i j 1 2 3 4 5 6 7 8 1
Mảng –  Sắp xếp đổi chổ 12 8 5 2 6 4 15 1 i j 2 2 3 4 5 6 7 8 1
Mảng –  Sắp xếp đổi chổ 2 12 8 5 6 4 15 1 i j 4 2 3 4 5 6 7 8 1
Mảng –  Sắp xếp đổi chổ 2 4 12 8 6 5 15 1 i j 5 2 3 4 5 6 7 8 1
Mảng –  Sắp xếp đổi chổ 2 4 5 6 8 12 15 1 2 3 4 5 6 7 8 1
Mảng –  Sắp xếp đổi chổ void Swap(int &x, int &y) { int t = x; x = y; y = t; } void InterchangeSort(int a[], int N) { int  i, j; for (i = 0 ; i<N-1 ; i++) for (j =i+1; j < N ; j++) if(a[j]< a[i]) Swap(a[i],a[j]); }
Mảng nhiều chiều C không hỗ trợ mảng nhiều chiều. Tuy nhiên có thể tiếp cận theo hướng: Mảng 2 chiều là mảng một chiều mà mỗi thành phần của nó là một mảng một chiều. float rainfall[12][365]; “ rainfall” là mảng gồm 12 thành phần, mỗi thành phần là mảng gồm 365 số float short exam_marks[500][10]; “ exam_marks” là mảng gồm 500 thành phần, mỗi thành phần là mảng 10 số short const int brighton = 7; int day_of_year = 238; rainfall[brighton][day_of_year] = 0.0F;
Tóm lược Khai báo mảng trong C Truy xuất các phần tử Truyền tham số kiểu mảng cho hàm Các thao tác: nhập, xuất, thêm/hủy 1 thành phần, tìm kiếm, sắp xếp Mảng nhiều chiều

More Related Content

DOCX
Bài 11 Kiểu mảng(tt)
PPT
Bai 11 kieu mang (tiet 1)
PPT
Ctdl C02
PPT
Ctdl C05
PPT
Kiểu Mảng 1 chiều
PPT
Ctdl C04
PPT
Session 11
PPTX
Công thức mảng
Bài 11 Kiểu mảng(tt)
Bai 11 kieu mang (tiet 1)
Ctdl C02
Ctdl C05
Kiểu Mảng 1 chiều
Ctdl C04
Session 11
Công thức mảng

What's hot (18)

PPT
Sap xep va tim kiem
DOCX
bai tap cau truc du lieu ptit
PDF
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
PDF
Bài tập CTDL và GT 1
PPT
Phan2 chuong6 mang
PPT
Ctdl C01
DOCX
Huong danthuchanhmang
PPT
Chapter08aarray string
PPT
Nmlt C07 Mang1 Chieu
PDF
Lect05 array
PPT
Nmlt C06 Ham
PPT
Bai11
PDF
Session 4
DOC
Phím tắt trong excel
DOC
Bài tập CTDL và GT 12
DOCX
Stl vector nguyen_trihai_11520094_khmt06
PDF
Nmlt c07 mang1_chieu_in
PPT
Nmlt C03 Cac Kieu Du Lieu Co So
Sap xep va tim kiem
bai tap cau truc du lieu ptit
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
Bài tập CTDL và GT 1
Phan2 chuong6 mang
Ctdl C01
Huong danthuchanhmang
Chapter08aarray string
Nmlt C07 Mang1 Chieu
Lect05 array
Nmlt C06 Ham
Bai11
Session 4
Phím tắt trong excel
Bài tập CTDL và GT 12
Stl vector nguyen_trihai_11520094_khmt06
Nmlt c07 mang1_chieu_in
Nmlt C03 Cac Kieu Du Lieu Co So
Ad

Similar to 5 Array (20)

PDF
PDF
NMLT_ThucHanh_Chuong07p1.pdfSlide lap trinh web sieu nang cao provip
PDF
NMLT_ThucHanh_Chuong07p1.pdfSlide lap trinh web sieu nang cao provip
PDF
01.Bai1.Mang1Chieu-cac-bai-tap-mang-mot-chieu.pdf
PPT
Session 11
PPTX
NMLT_C07_Mang1Chieu.pptx
PDF
ky-thuat-lap-trinh__chuong4_mang-mot-chieu - [cuuduongthancong.com].pdf
PDF
HÀM_NoCoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapy.pdf
PDF
Bai3 timkiemsapxep
PDF
Bai3 timkiem sapxep
PPT
Nmlt c07 mang1_chieu
PPTX
CSLT_Bai 5A_2018.pptx
PDF
Ctdl lab07-cac thuat-toan_sap_xep
PPT
1_Sapxep_Timkiem.pptdfasfasffafasdfasfasffa
PPT
PPT
Ctdl C06
PPT
Giáo án dành cho sinh viên ngành công nghệ thông tin
PPT
Timkiem&sapxep
PPT
Chapter04_Array_chinhsua
DOC
Bai tap pascal tong hop
NMLT_ThucHanh_Chuong07p1.pdfSlide lap trinh web sieu nang cao provip
NMLT_ThucHanh_Chuong07p1.pdfSlide lap trinh web sieu nang cao provip
01.Bai1.Mang1Chieu-cac-bai-tap-mang-mot-chieu.pdf
Session 11
NMLT_C07_Mang1Chieu.pptx
ky-thuat-lap-trinh__chuong4_mang-mot-chieu - [cuuduongthancong.com].pdf
HÀM_NoCoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaapy.pdf
Bai3 timkiemsapxep
Bai3 timkiem sapxep
Nmlt c07 mang1_chieu
CSLT_Bai 5A_2018.pptx
Ctdl lab07-cac thuat-toan_sap_xep
1_Sapxep_Timkiem.pptdfasfasffafasdfasfasffa
Ctdl C06
Giáo án dành cho sinh viên ngành công nghệ thông tin
Timkiem&sapxep
Chapter04_Array_chinhsua
Bai tap pascal tong hop
Ad

More from Cuong (11)

PPT
3 Function
PPT
Nmlt C08 Mang2 Chieu
PPT
Nmlt C09 Chuoi Ky Tu
PPT
Nmlt C05 Cau Lenh Lap
PPT
Nmlt C04 Cau Lenh Dieu Kien Va Re Nhanh
PPT
Nmlt C02 GioiThieuNNLTC
PPT
Nmlt C01 Cac Khai Niem Co Ban Ve Lap Trinh
PPT
4 Pointer String Struct
PPT
3 Function
PPT
2 Cau Truc Dieu Khien
PPT
1 Gioi Thieu Chung
3 Function
Nmlt C08 Mang2 Chieu
Nmlt C09 Chuoi Ky Tu
Nmlt C05 Cau Lenh Lap
Nmlt C04 Cau Lenh Dieu Kien Va Re Nhanh
Nmlt C02 GioiThieuNNLTC
Nmlt C01 Cac Khai Niem Co Ban Ve Lap Trinh
4 Pointer String Struct
3 Function
2 Cau Truc Dieu Khien
1 Gioi Thieu Chung

5 Array

  • 2. Mảng – Array Một số tính chất Khai báo mảng trong C Truy xuất các thành phần Truyền tham số kiểu mảng cho hàm Một số thao tác cơ sở Mảng nhiều chiều
  • 3. Mảng – Một số tính chất Mảng là một kiểu dữ liệu có cấu trúc do người lập trình định nghĩa Dùng biểu diễn các đối tượng dữ liệu ở dạng một dãy các thành phần có cùng kiểu với nhau – kiểu cơ sở NNLT C luôn chỉ định một khối nhớ liên tục cho một biến kiểu mảng Kích thước của mảng được xác định ngay khi khai báo và không bao giờ thay đổi
  • 4. Mảng – Khai báo trong C typedef kiểucơsở Tênkiểu [ Sốthànhphần ] ; kiểu của mỗi thành phần hằng số, số thành phần tối đa của mảng do lập trình viên đặt tên typedef int AINT[ 100 ]; // AINT là kiểu mảng biểu diễn dãy gồm 100 thành phần int AINT a; //a: biến kiểu AINT
  • 5. Mảng – Ví dụ #define SIZE 10 int a[5]; // a dãy gồm 5 số nguyên long int big[100]; // big: chiếm 400 bytes! double d[100]; // d: chiếm 800 bytes! long double v[SIZE];// v:10 long doubles
  • 6. Mảng – Ví dụ int a[5] = { 10, 20, 30, 40, 50}; double d[100] = { 1.5, 2.7}; short primes[] = { 1, 2, 3, 5, 7, 11, 13}; long b[50] = { 0 }; int i = 7; const int c = 5; int a[i]; double d[c]; short primes[]; khởi trị cho 5 thành phần 2 thành phần đầu tiên được khởi trị, phần còn lại: 0 compiler xác định kích thước gồm 7 thành phần cách nhanh nhất để khởi trị tất cả các thành phần bằng 0
  • 7. Các thành phần của mảng được truy xuất thông qua chỉ số của chúng 0..size-1 Thao tác truy xuất không kiểm tra giới hạn của chỉ số Mảng – Truy xuất các phần tử int main() { int a[6]; int i = 7; a[0] = 59; a[5] = -10; a[i/2] = 2; a[6] = 0; a[-1] = 5; return 0; } 0 a 1 2 3 4 5
  • 8. Truyền tham số Mảng cho hàm Tham số kiểu mảng được truyền cho hàm chính là địa chỉ của phần tử đầu tiên trên mảng Số thành phần trong tham số mảng có thể để trống. Số thành phần thực sự được sử dụng phải truyền qua một tham số khác (vd: size) int add_elements(int a[], int size) { int add_elements(int *p, int size) {
  • 9. Ví dụ #include <stdio.h> void sum(long [], int); int main(void) { long primes[6] = { 1, 2, 3, 5, 7, 11 }; sum(primes, 6); printf(&quot;%li\n&quot;, primes[0]); return 0; } void sum(long a[], int sz) { int i; long total = 0; for(i = 0; i < sz; i++) total += a[i]; a[0] = total; } 1 2 3 5 7 11 primes a sz 6 tổng được lưu vào phần tử đầu tiên dùng để kiểm tra giới hạn chỉ số
  • 10. Một số thao tác cơ sở Nhập Xuất Thêm một thành phần dữ liệu Loại bỏ một thành phần dữ liệu Tìm kiếm Sắp xếp
  • 11. Mảng – Nhập dữ liệu void ReadData(int a[], int size) { int i; for(i = 0; i < size; i++) { printf(“Nhap thanh phan %d: ”, i); scanf(“%d”, &a[i]); } } duyệt qua tất cả các phần tử nhập dữ liệu cho a[i]
  • 12. Mảng – Xuất dữ liệu ra màn hình void WriteData(int a[], int size) { int i; for(i = 0; i < size; i++) printf(“%d ”, a[i]); printf(“\n”); }
  • 13. Mảng – Nhập xuất dữ liệu #include <stdio.h> void ReadData(int [], int ); void WriteData(int [], int ); void main() { int a[100], n; clrscr(); printf(“Nhap so thanh phan cua day: “); scanf(“%d”, &n); printf(“Nhap cac thanh phan cua day: “); ReadData(a, n); printf(“Day vua nhap: \n“); WriteData(a, n); }
  • 14. Mảng – Tìm vị trí X trong dãy Bài toán: Tìm vị trí X trên mảng a đang có N thành phần. Giải pháp: Tìm tuần tự //input: dãy (a, N), X //output: Vị trí của X, -1 nếu không có int Search(int a[], int N, int X) { for (int i = 0; i < N; i ++) if (a[i] == X) return i; return -1; }
  • 15. Mảng – Thêm một thành phần dữ liệu Bài toán: cần thêm thành phần dữ liệu X vào mảng a đang có N thành phần. Hai trường hợp cần xem xét: Dãy chưa có thứ tự  Thêm X vào cuối a. Dãy đã có thứ tự  Tìm vị trí thích hợp, chèn X vào
  • 16. Mảng – Thêm X vào cuối dãy 2 8 5 1 6 4 15 12 Thêm 15 vào (a, 7) N = 7 N = 8 a[N] = X; N ++; X 1 2 3 4 5 6 7 0
  • 17. Mảng – Chèn X vào dãy tăng dần 2 4 5 8 12 15 6 1 Chèn 6 vào (a, 7) N = 7 N = 8 X Vị trí thích hợp: 4 pos 1 2 3 4 5 6 7 0
  • 18. Mảng – Chèn X vào dãy tăng dần //input: dãy (a, N) tăng dần, X //output: dãy (a, N) đã có X ở đúng vị trí void Insert(int a[], int &N, int X) { int pos; for (pos = N; (pos>0)&&(a[pos-1]>X); pos --) a[pos] = a[pos – 1]; a[pos] = X; N ++; }
  • 19. Mảng – Loại bỏ một thành phần dữ liệu Bài toán: loại bỏ thành phần dữ liệu X ra khỏi mảng a đang có N thành phần. Hướng giải quyết: xác định vị trí của X, nếu tìm thấy thì dồn các phần tử ở phía sau lên để lấp vào chỗ trống. 2 trường hợp: Dãy không có thứ tự: lấp phần tử cuối lên Dãy đã thứ tự: dời tất cả các phần tử ở sau ví trí của X lên trước 1 vị trí.
  • 20. Mảng – Loại bỏ X ra khỏi dãy tăng N = 8 2 8 5 1 6 4 15 12 Loại 5 khỏi (a, 8) N = 7 pos Tìm vị trí của 5 5 X Dồn các vị trí 4, 5, 6, 7 lên 1 2 3 4 5 6 7 0 STOP Ok, found
  • 21. Mảng – Loại bỏ X ra khỏi dãy tăng //input: dãy (a, N), X //output: dãy (a, N) đã loại bỏ 1 thành phần X int Remove(int a[], int &N, int X) { int pos = Search(a, N, X); if (pos == -1) //không có X trong dãy return 0; N --; for (; (pos < N); pos ++) a[pos] = a[pos + 1]; return 1; }
  • 22. Mảng – Sắp xếp Bài toán: Sắp xếp các thành phần của (a, N) để thu được dãy tăng dần Giải pháp: Tìm cách triệt tiêu tất cả các nghịch thế của dãy  Thuật toán sắp xếp Đổi chổ trực tiếp
  • 23. Mảng – Sắp xếp đổi chổ 2 8 5 1 6 4 15 12 i j 1 2 3 4 5 6 7 8 1
  • 24. Mảng – Sắp xếp đổi chổ 12 8 5 2 6 4 15 1 i j 2 2 3 4 5 6 7 8 1
  • 25. Mảng – Sắp xếp đổi chổ 2 12 8 5 6 4 15 1 i j 4 2 3 4 5 6 7 8 1
  • 26. Mảng – Sắp xếp đổi chổ 2 4 12 8 6 5 15 1 i j 5 2 3 4 5 6 7 8 1
  • 27. Mảng – Sắp xếp đổi chổ 2 4 5 6 8 12 15 1 2 3 4 5 6 7 8 1
  • 28. Mảng – Sắp xếp đổi chổ void Swap(int &x, int &y) { int t = x; x = y; y = t; } void InterchangeSort(int a[], int N) { int i, j; for (i = 0 ; i<N-1 ; i++) for (j =i+1; j < N ; j++) if(a[j]< a[i]) Swap(a[i],a[j]); }
  • 29. Mảng nhiều chiều C không hỗ trợ mảng nhiều chiều. Tuy nhiên có thể tiếp cận theo hướng: Mảng 2 chiều là mảng một chiều mà mỗi thành phần của nó là một mảng một chiều. float rainfall[12][365]; “ rainfall” là mảng gồm 12 thành phần, mỗi thành phần là mảng gồm 365 số float short exam_marks[500][10]; “ exam_marks” là mảng gồm 500 thành phần, mỗi thành phần là mảng 10 số short const int brighton = 7; int day_of_year = 238; rainfall[brighton][day_of_year] = 0.0F;
  • 30. Tóm lược Khai báo mảng trong C Truy xuất các phần tử Truyền tham số kiểu mảng cho hàm Các thao tác: nhập, xuất, thêm/hủy 1 thành phần, tìm kiếm, sắp xếp Mảng nhiều chiều