Download presentation
Presentation is loading. Please wait.
1
KỸ THUẬT LẬP TRÌNH GV: Phạm Thị Xuân Diệu
Blog:
2
MẢNG VÀ CÁC THAO TÁC TRÊN MẢNG
Chương 3: MẢNG VÀ CÁC THAO TÁC TRÊN MẢNG
3
1. Khái niệm 2. Mảng một chiều 3. Mảng nhiều chiều
4
Mỗi phần tử của mảng được tham chiếu thông qua chỉ mục (index).
1. Khái niệm Mảng là một tập hợp các giá trị có cùng kiểu dữ liệu nằm liên tiếp nhau trong bộ nhớ và được tham chiếu bởi một tên chung chính là tên mảng. Mỗi phần tử của mảng được tham chiếu thông qua chỉ mục (index). Giá trị Mảng thực chất là mộ t biế n được cấp phát bộ nhớ liên tục và bao gồm nhiều biến thành phần. * Các thành phần của mảng là tập hợp các biến có cùng kiểu dữ liệu và cùng tên. Do đó để truy xuất các biến thành phần, ta dùng cơ chế chỉ mục. 1 5 3 6 4 7 9 2 8 Vị trí Vị trí được tính từ 0
5
1. Khái niệm Nếu mảng có n phần tử thì phần tử đầu tiên có chỉ mục là 0 và phần tử cuối có chỉ mục là n-1. Để tham chiếu đến một phần tử ta dùng tên mảng và chỉ mục của phần tử được đặt trong cặp dấu []. Ví dụ: a[0] Số lượng phần tử có trong mảng được gọi là kích thước của mảng. luôn cố định, phải được xác định trước và không đổi trong suốt quá trình thực hiện chương trình.
6
1. Khái niệm Mảng là 1 đối tượng dùng để lưu trữ các phần tử có cùng 1 kiểu dữ liệu Chỉ số mảng bắt đầu được tính từ 0 cho tới n-1 Tức là nếu như mảng có 10 phần tử, thì vị trí sẽ được tính từ số 0 cho tới 9. Với 0 là vị trí của phần tử số 1, số 1 là vị trí của phần tử số 2 …. 9 8 7 10 50 N=6 i=0 i=1 i=2 i=3 i=4 i=5 Mảng M có 6 phần tử M[0] M[4] M[i] Là phần tử tại vị trí thứ i Đối với duyệt mảng, người ta thường dùng vòng for, ít khi dùng vòng while, do.. while
7
type arrayName[elements];
2. Mảng một chiều Khai báo một mảng một chiều Cú pháp: type arrayName[elements]; type: kiểu dữ liệu của mỗi phần tử mảng. arrayName: tên mảng elements: số phần tử có trong mảng Ví dụ: int a[5] a 3 5 2 7 9 a[0] a[1] a[2] a[3] a[4]
8
2. Mảng một chiều Ví dụ: int a[100]; //Khai báo mảng số nguyên a gồm 100 phần tử float b[50]; //Khai báo mảng số thực b gồm 50 phần tử char str[30]; //Khai báo mảng ký tự str gồm 30 ký tự Nhằm thuận tiện cho việc viết chương trình, ta nên định nghĩa hằng số MAX ở đầu chương trình – là kích thước tối đa của mảng - như sau: #define MAX 100 void main() { int a[MAX], b[MAX]; //Các lệnh } Như vậy khi duyệt mảng thì các chỉ số không được vượt quá hoặc bằng số phần tử của mảng
9
Total_size = sizeof(type) * elements
2. Mảng một chiều Mảng phải được khai báo tường minh Kích thước (tính bằng byte) của mảng được tính theo công thức: Total_size = sizeof(type) * elements Ví dụ: int num[100]; Mảng num có kích thước là: 2bytes * 100 = 200bytes (giả sử int chiếm 2 bytes)
10
2. Mảng một chiều Mỗi phần tử mảng là một biến thông thường. Ví dụ:
int num[3]; num[0] = 2; //gán 2 cho phần tử num[0] num[1] = num[0] + 3 //num[1] có giá trị 5 num[2] = num[0] + num[1]; //num[2] có giá trị 7 cout << num[1]; //In ra giá trị 5
11
2. Mảng một chiều Khai báo và khởi tạo mảng một chiều Cú pháp:
type arrayName[]= {value1, value2, ..., value n}; Lưu ý: Không khai báo kích thước mảng. Số lượng phần tử trong mảng là số các giá trị được cung cấp trong cặp dấu ngoặc {}, được phân cách nhau bởi dấu phẩy.
12
2. Mảng một chiều Ví dụ: int soChan[] = {2,4,6,8,10}; Mảng soChan có 5 phần tử lần lượt là: soChan[0] có giá trị là 2 soChan[1] có giá trị là 4 ... soChan[4] có giá trị là 10
13
cout<<a<<endl; cout<<setprecision(3)<<a;
2. Mảng một chiều Khai báo và gán giá trị ban đầu cho mảng một chiều: Gán từng phần tử int a[5] = {3, 6, 8, 1, 12}; Gán số lượng phần tử khởi tạo ít hơn số phần tử của mảng: int a[8] = {3,5,2} Giá trị 3 6 8 1 12 Vị trí 2 4 *Mục đích sử dụng hàm: Khi có một công việc giống nhau cần thực hiện ở nhiều vị trí. Khi cần chia một chương trình lớn phức tạp thành các đơn thể nhỏ (hàm con) để chương trình được trong sáng, dễ hiểu trong việc xử lý, quản lý việc tính toán và giải quyết vấn đề. Lý do chính: Được sử dụng lại coding đỡ mất thời gian Dễ sửa chữa lỗi Chia để trị : phân nhỏ chương trình lớn thành các chương trình con để dễ xử lý #include<iostream.h> #include<conio.h> void main() { cout<<"Cop cai"; getche(); } ý nghĩa của nó là bắt ta nhấn phím bất kỳ mới cho thoát chương trình, để người sử dụng quan sát kết quả chương trình khi demo bằng Cfree thì em F5 nó vẫn dừng mặc dù em không có getche() nhưng thực ra là nó dừng rồi vì em quan sát cuối phần mềm có dòng "press any key to continue..." đó chính là kết thúc rồi còn khi có getche() gõ phím vào mới xuất hiện dòng đó em hiểu hok em thử xem nak iomanip.h --- setw(n) setprecision(n) int a=7, b=9; cout<<a<<setw(5)<<b; float a= , b=5.339; cout<<a<<endl; cout<<setprecision(3)<<a; cout<<setprecision(2)<<b; Giá trị 3 5 2 Vị trí 1 4 6 7
14
Tên mảng [ vị trí cần truy xuất ] void main() {
2. Mảng một chiều Truy xuất giá trị Tên mảng [ vị trí cần truy xuất ] void main() { int a[5] = {3, 6, 8, 11 , 12}; cout<<“Giá trị mảng tại vị trí 3 = “<<a[3]; } Kết quả: Giá trị mảng tại vị trí 3 = 11 Vị trí 3 11
15
2. Mảng một chiều Các thao tác trên mảng: Nhập Xuất (liệt kê) Tìm kiếm Đếm Sắp xếp Kiểm tra mảng thỏa điều kiện cho trước Tách/ ghép mảng Chèn / xóa
16
Có 2 cách nhập dữ liệu cho từng phần tử trong mảng:
2. Mảng một chiều Cách nhập dữ liệu cho từng phần tử trong mảng như thế nào? Có 2 cách nhập dữ liệu cho từng phần tử trong mảng: - cách 1: nhập bằng tay từ bàn phím - cách 2: cho máy tự động nhập Chúng ta nên kết hợp hàm (hôm bữa học) để nhập và xuất mảng.
17
2. Mảng một chiều Ví dụ: Tạo một mảng nguyên a có N phần tử. Mỗi phần tử có giá trị là chỉ mục của nó. In mảng ra màn hình.
18
2. Mảng một chiều Viết bằng Hàm
19
2. Mảng một chiều srand(time(NULL)); Nhập mảng tự động bằng máy:
Để khởi tạo xuất ra các số ngẫu nhiên, ta phải viết hàm này trước: Hàm trên có ý nghĩa là yêu cầu máy tính khởi động để tạo các số ngẫu nhiên : Tức là mỗi lần chạy chương trình thì nó sẽ tự động phát sinh ra các con số có giá trị khác nhau. **** nếu như không có dòng này thì mỗi lần chạy chương trình sẽ cho ra có số ngẫu nhiên GIỐNG NHAU. srand(time(NULL));
20
2. Mảng một chiều Để lấy giá trị ngẫu nhiên , ta dùng công thức bên dưới: rand()%n : Tức lấy lấy các giá trị ngẫu nhiên từ 0 cho tới n-1 Như vậy nếu ta gọi rand()%100 : tức là lấy giá trị ngẫu nhiên từ 0 99 Đề bài : Hãy xuất các số ngẫu nhiên từ cho tới 150 (-77 88) Rand()%n -77=88 n=166 (3095) rand()%n +30=95n=66 (-55150)Rand()%n -55 =150 n=206 (-50 -100)?
21
2. Mảng một chiều
22
2. Mảng một chiều Liệt kê các phần tử thỏa điều kiện cho trước: Mẫu 1:
void LietKeXXX(int a[], int n) { for (int i = 0; i<n; i++) if (a[i] thỏa điều kiện) Xuất a[i]; } Mẫu 2: void LietKeXXX(int a[], int n, int x) if (a[i] thỏa điều kiện so với x)
23
2. Mảng một chiều void LietKeChan(int a[], int n) {
Ví dụ 1: Liệt kê các phần tử có giá trị chẵn trong mảng void LietKeChan(int a[], int n) { for (int i = 0; i<n; i++) if (a[i] %2 ==0) cout<<a[i]<<“\t”; } Ví dụ 2: Liệt kê các phần tử có giá trị lớn hơn x trong mảng void LietKeLonHonX(int a[], int n, int x) { for (int i = 0; i<n; i++) if (a[i] > x) cout<<a[i]< <“\t”; }
24
2. Mảng một chiều Ví dụ 3: Chương trình nhập vào mảng một chiều số nguyên a, kích thước n. In ra các phần tử có giá trị lớn hơn x có trong mảng
25
2. Mảng một chiều
26
2. Mảng một chiều Đếm: Mẫu 1: int DemXXX(int a[], int n) { int d = 0;
for (int i = 0; i<n; i++) if (a[i] thỏa điều kiện) d++; return d; } Mẫu 2: int DemXXX(int a[], int n, int x) { int d = 0; for (int i = 0; i<n; i++) if (a[i] thỏa điều kiện so với x) d++; return d; }
27
2. Mảng một chiều Ví dụ 1: Đếm các phần tử có giá trị là số nguyên tố
28
2. Mảng một chiều Tìm kiếm Mẫu 1:
Tìm và trả về vị trí phần tử có giá trị lớn nhất int TimVTMax(int a[], int n) { int vtmax = 0; for (int i = 1; i < n; i++) if (a[i] > a[vtmax]) vtmax = i; return vtmax; } Mẫu 2: Tìm vị trí phần tử có giá trị x (nếu x không xuất hiện trong mảng trả về -1) int TimVTX(int a[], int n, int x) { for (int i = 0; i < n; i++) if (a[i] == x) return i; return -1; }
29
2. Mảng một chiều Kiểm tra xem mảng có thỏa điều kiện cho trước *TH1: kiểm tra tồn tại một phần tử trong mảng thỏa điều kiện nào đó cho trước tìm phần tử thỏa điều kiện để kết luận. *TH2: kiểm tra tất cả các phần tử thỏa điều kiện nào đó cho trước tìm phần tử không thỏa điều kiện để kết luận mảng không thỏa điều kiện.
30
2. Mảng một chiều Mẫu TH1: bool KiemTraTonTaiXXX(int a[], int n) {
for (int i = 0; i<n; i++) if (a[i] thỏa điều kiện) return true; return false; } Mẫu TH2: bool KiemTraXXX(int a[], int n) { for (int i = 0; i<n; i++) if (a[i] không thỏa điều kiện) return false; return true; }
31
2. Mảng một chiều Ví dụ 1: Kiểm tra xem mảng có tồn tại số lẻ không?
32
2. Mảng một chiều Ví dụ 2: Kiểm tra xem mảng có toàn giá trị âm không?
(true: có/ false: không)
33
2. Mảng một chiều Mẫu tính tổng: int TongXXX(int a[], int n) {
Tính tổng, giá trị trung bình có điều kiện Mẫu tính tổng: int TongXXX(int a[], int n) { int s = 0; for (int i = 0; i<n; i++) if (a[i] thỏa điều kiện) s += a[i]; return s; }
34
2. Mảng một chiều Tính tổng, giá trị trung bình có điều kiện
Mẫu tính trung bình: float TrungBinhXXX(int a[], int n) { int s = 0; int d = 0; for (int i = 0; i<n; i++) if (a[i] thỏa điều kiện) s += giatri; d ++; } if (d==0) return 0; return (float) s / d;
35
2. Mảng một chiều Ví dụ 1: Tính tổng các phần tử có giá trị lẻ trong mảng
36
2. Mảng một chiều Sắp xếp Mẫu phương thức sắp thứ tự tăng:
void SapTang(int a[], int n) { for (int i = 0; i < n-1; i ++) for(int j = i+1; j < n; j ++) if (a[i] > a[j]) HoanVi(a[i], a[j]); } void HoanVi(int &a, int &b) int tam = a; a = b; b = tam;
37
3. Mảng nhiều chiều C/C++ hỗ trợ mảng nhiều chiều. Dạng đơn giản nhất của mảng nhiều chiều là mảng hai chiều. Mảng hai chiều thực chất là mảng của những mảng một chiều. Ta có thể xem mảng hai chiều là một ma trận gồm các hàng và các cột
38
type arrayName[rows][columns];
3. Mảng nhiều chiều Khai báo mảng hai chiều type arrayName[rows][columns]; rows: số hàng columns: số cột Ví dụ: Khai báo mảng số nguyên 3 hàng 4 cột int a[3][4]
39
3. Mảng nhiều chiều Ví dụ 1: int M[5][3];
Tức là khai báo 1 mảng 2 chiều tên là M, có 5 dòng, 3 cột. tổng số phần tử trong mảng = 5*3 =15 phần tử Ví dụ 2: float K[3][4]; khai báo 1 mảng 2 chiều tên là K có kiểu số thực, số dòng là 3, số cột là 4 tổng số phần tử là 4*3=12; - Tương tự như mảng 1 chiều, chỉ số của các phần tử được đánh dấu từ số 0 cho tới số dòng -1 hoặc số cột -1
40
3. Mảng nhiều chiều i =0 i =1 i =2 i =3 j =0 j =1 j =2 j =3 j =4
Giả sử ta có mảng M 2 chiều, có 4 dòng và 5 cột Chiều duyệt theo cột, thường đặt tên là j j =0 j =1 j =2 j =3 j =4 M[0][0] 9 M[0][1] 2 M[0][2] M[0][3] 12 M[0][4] 3 M[1][0] M[1][1] 8 M[1][2] 15 M[1][3] 7 M[1][4] 5 M[2][0] 10 M[2][1] M[2][2] 19 M[2][3] 13 M[2][4] 18 M[3][0] 17 M[3][1] 86 M[3][2] 78 M[3][3] 46 M[3][4] i =0 Tức là để truy suất 1 phần tử tại dòng thứ ivà tại cột thứ j thì ta viết: M[i][j] - Ví dụ, muốn lấy phần tử tại dòng 2, cột 3 thì ta viết M[2][3] Chiều duyệt theo dòng, thường đặt tên là i i =1 i =2 i =3 Thông thường, người ta sử dụng 2 vòng for lồng nhau để duyệt mảng 2 chiều. Vòng for ngoài duyệt theo dòng, vòng for trong duyệt theo cột
41
3. Mảng nhiều chiều int M[dòng][cột]; Ví dụ: int M[3][2] ;
Dòng =3, cột =2 tổng số phần tử = 2*3 =6 phần tử Để duyệt mảng, ta kết hợp 2 vòng for lồng nhau, vòng for ngoài chạy theo chỉ số dòng (đặt là i), vòng for trong chạy theo chỉ số cột (đặt là j)
42
3. Mảng nhiều chiều
43
3. Mảng nhiều chiều
44
3. Mảng nhiều chiều
45
3. Mảng nhiều chiều
46
3. Mảng nhiều chiều Ma Trận vuông : mảng 2 chiều có số cột và số dòng bằng nhau Cách khai báo sẽ thay đổi 1 ít so với mảng 2 chiều bình thường. Vì ma trận vuông là ma trận có số cột và số dòng bằng nhau, nên ta thường khai báo CẤP của mà trận thay vì khai báo số dòng, số cột. Nếu nói ma trận vuông cấp 3 có 3*3 =9 phần tử Tức là khi nói tới ma trận vuông thì người ta nói tới cấp. Nếu ma trận là cấp N thì số phần tử của nó sẽ là N2
47
3. Mảng nhiều chiều
48
3. Mảng nhiều chiều 15 36 56 100
49
3. Mảng nhiều chiều 1) Viết hàm xuất đường chéo chính, đường chéo phụ cho mảng 2 chiều 1 2 3 4 Nhận xét: Đường chéo chính (màu vàng) thì chỉ số i và j là luôn luôn bằng nhau Đường chéo phụ (màu xanh) thì i +j =n-1 45 M[0][0] M[0][1] 7 M[0][2] M[0][3] 99 M[0][4] -9 M[1][0] 55 M[1][1] 9 M[1][2] 13 M[1][3] 75 M[1][4] M[2][0] M[2][1] M[2][2] M[2][3] M[2][4] M[3][0] M[3][1] M[3][2] M[3][3] M[3][4] M[4][0] M[4][1] M[4][2] M[4][3] M[4][4]
50
3. Mảng nhiều chiều
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.