You are on page 1of 39

Array

ThS.
Trần Ngọc Bảo Duy

MẢNG
Mảng
Sự cần thiết của mảng
Định nghĩa

Kỹ thuật Lập trình (CO1027) Mảng một chiều


Khai báo

Ngày 8 tháng 3 năm 2021 Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


Ứng dụng
Khai báo
Đọc và ghi trên mảng hai chiều

ThS. Trần Ngọc Bảo Duy


Khoa Khoa học và Kỹ thuật Máy tính
Trường Đại học Bách Khoa, ĐHQG-HCM

Array.1
Array
Tổng quan
ThS.
Trần Ngọc Bảo Duy

1 Mảng
Sự cần thiết của mảng
Định nghĩa Mảng
Sự cần thiết của mảng
Định nghĩa

Mảng một chiều


2 Mảng một chiều Khai báo

Khai báo Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


Đọc và ghi trên mảng 1 chiều Ứng dụng
Khai báo
Đọc và ghi trên mảng hai chiều

3 Mảng hai chiều


Ứng dụng
Khai báo
Đọc và ghi trên mảng hai chiều

Array.2
Array
Sự cần thiết của mảng
ThS.
Trần Ngọc Bảo Duy

Bài toán
Một chương trình quản lý bán hàng cần lưu trữ tạm N món Mảng
Sự cần thiết của mảng
hàng trong bộ nhớ, nếu ta chỉ sử dụng các kiểu dữ liệu cơ Định nghĩa

bản (primitive type): Mảng một chiều


Khai báo
Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


Ứng dụng
Khai báo
Đọc và ghi trên mảng hai chiều

Array.3
Array
Sự cần thiết của mảng
ThS.
Trần Ngọc Bảo Duy

Bài toán
Một chương trình quản lý bán hàng cần lưu trữ tạm N món Mảng
Sự cần thiết của mảng
hàng trong bộ nhớ, nếu ta chỉ sử dụng các kiểu dữ liệu cơ Định nghĩa

bản (primitive type): Mảng một chiều


Khai báo

• Phải cần đến N × M biến: Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


• M là số thành phần dữ liệu của một món hàng. Ứng dụng

• Ví dụ: N = 100 món hàng, M = 10 thành phần dữ Khai báo


Đọc và ghi trên mảng hai chiều
liệu, ta cần N × M = 1000 biến.

Array.3
Array
Sự cần thiết của mảng
ThS.
Trần Ngọc Bảo Duy

Bài toán
Một chương trình quản lý bán hàng cần lưu trữ tạm N món Mảng
Sự cần thiết của mảng
hàng trong bộ nhớ, nếu ta chỉ sử dụng các kiểu dữ liệu cơ Định nghĩa

bản (primitive type): Mảng một chiều


Khai báo

• Phải cần đến N × M biến: Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


• M là số thành phần dữ liệu của một món hàng. Ứng dụng

• Ví dụ: N = 100 món hàng, M = 10 thành phần dữ Khai báo


Đọc và ghi trên mảng hai chiều
liệu, ta cần N × M = 1000 biến.
• Nhận định: Khả thi nhưng không hợp lý. Chương trình
khó đọc và khó phát triển.

Array.3
Array
Sự cần thiết của mảng
ThS.
Trần Ngọc Bảo Duy

Giải pháp

1 Gom các dữ liệu để mô tả một món hàng cùng với Mảng


Sự cần thiết của mảng
nhau, ta có struct hỗ trợ. Định nghĩa

Mảng một chiều


2 Lưu trữ N món hàng dùng kiểu dữ liệu mảng (nâng cao Khai báo

hơn là danh sách). Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


Ứng dụng
Khai báo
Đọc và ghi trên mảng hai chiều

Array.4
Array
Sự cần thiết của mảng
ThS.
Trần Ngọc Bảo Duy

Giải pháp

1 Gom các dữ liệu để mô tả một món hàng cùng với Mảng


Sự cần thiết của mảng
nhau, ta có struct hỗ trợ. Định nghĩa

Mảng một chiều


2 Lưu trữ N món hàng dùng kiểu dữ liệu mảng (nâng cao Khai báo

hơn là danh sách). Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


Ứng dụng

Về kỹ thuật, C/C++ hỗ trợ: Khai báo


Đọc và ghi trên mảng hai chiều

• Mảng (array) để lưu trữ liên tục các phần tử có cùng


một kiểu dữ liệu.
• Con trỏ (pointer) để từ đó phát triển các loại danh sách
nếu muốn.

Array.4
Array
Định nghĩa
ThS.
Trần Ngọc Bảo Duy

Định nghĩa
Mảng là một dãy các phần tử cùng một kiểu, nằm liền Mảng
kề nhau trong bộ nhớ. Sự cần thiết của mảng
Định nghĩa

Mảng một chiều


Khai báo
Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


Ứng dụng
Khai báo
Đọc và ghi trên mảng hai chiều

Array.5
Array
Định nghĩa
ThS.
Trần Ngọc Bảo Duy

Định nghĩa
Mảng là một dãy các phần tử cùng một kiểu, nằm liền Mảng
kề nhau trong bộ nhớ. Sự cần thiết của mảng
Định nghĩa

Mảng một chiều


Ví dụ: Khai báo
Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


0 1 2 3 4 5 Ứng dụng
Khai báo
Đọc và ghi trên mảng hai chiều

10 20 30 40 50 60

Hình: Một mảng gồm 6 phần tử số nguyên

Array.5
Array
Ví dụ
ThS.
Trần Ngọc Bảo Duy

0 1 2 3 4 5

10 20 30 40 50 60 Mảng
Sự cần thiết của mảng
Định nghĩa

Hình: Một mảng gồm 6 phần tử số nguyên Mảng một chiều


Khai báo
Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


• Sáu số này nằm liên tục nhau trong bộ nhớ: Nếu ô nhớ Ứng dụng
Khai báo
đầu tiên, chứa giá trị 10, bắt đầu ở BYTE có địa chỉ Đọc và ghi trên mảng hai chiều

100 trong vùng nhớ của chương trình


• Địa chỉ của ô nhớ chứa 20: 104
• Địa chỉ của ô nhớ chứa 30: 108
• Địa chỉ của ô nhớ chứa 40: 112
• Địa chỉ của ô nhớ chứa 50: 116
• Địa chỉ của ô nhớ chứa 60: 120

Array.6
Array
Ví dụ
ThS.
Trần Ngọc Bảo Duy

0 1 2 3 4 5

10 20 30 40 50 60
Mảng
Sự cần thiết của mảng
Hình: Một mảng gồm 6 phần tử số nguyên Định nghĩa

Mảng một chiều


Khai báo

• Các phần tử trong mảng được đánh chỉ số để truy Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


xuất. Ứng dụng

1 Phần tử đầu tiên LUÔN LUÔN CÓ chỉ số là 0. Khai báo


Đọc và ghi trên mảng hai chiều

2 Các phần tử kế tiếp theo là 1, 2, ...


Vì vậy, chỉ số của các phần tử:
• Ô nhớ chứa 10 có chỉ số là 0
• Ô nhớ chứa 20 có chỉ số là 1
• Ô nhớ chứa 30 có chỉ số là 2
• Ô nhớ chứa 40 có chỉ số là 3
• Ô nhớ chứa 50 có chỉ số là 4
• Ô nhớ chứa 60 có chỉ số là 5 Array.6
Array
Ví dụ
ThS.
Trần Ngọc Bảo Duy

Mảng
0 1 2 3 4 5 Sự cần thiết của mảng
Định nghĩa

10 20 30 40 50 60 Mảng một chiều


Khai báo
Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


Hình: Một mảng gồm 6 phần tử số nguyên Ứng dụng
Khai báo
Đọc và ghi trên mảng hai chiều

• Tổng quát: Một mảng có N phần tử thì chỉ số các phần


tử là 0, 1, ... và cuối cùng là (N - 1) - không phải N

Array.6
Array
Địa chỉ của các ô nhớ trong mảng
ThS.
Trần Ngọc Bảo Duy

Mảng
Về lý thuyết, để tính địa chỉ (đ/c) của ô nhớ có chỉ số k, Sự cần thiết của mảng
Định nghĩa
chương trình dùng công thức sau: Mảng một chiều
Khai báo
Địa chỉ = đ/c phần tử đầu tiên + k × (kích thước phần tử) Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


Do đó, chương trình dễ dàng chỉ ra ngay một phần tử có Ứng dụng
Khai báo

chỉ số bất kỳ, ta gọi đó là TRUY CẬP NGẪU NHIÊN. Đọc và ghi trên mảng hai chiều

Array.7
Array
Địa chỉ của các ô nhớ trong mảng
ThS.
Trần Ngọc Bảo Duy

Trong C/C++, trình biên dịch đã biết trước kích thước của Mảng
Sự cần thiết của mảng

phần tử trong mảng. Do đó, công thức lấy địa chỉ của phần Định nghĩa

tử có chỉ số k là Mảng một chiều


Khai báo
Đọc và ghi trên mảng 1 chiều

Địa chỉ của phần tử có chỉ số k = first + k Mảng hai chiều


Ứng dụng
Khai báo
trong đó, first là địa chỉ của phần tử đầu tiên của mảng, có Đọc và ghi trên mảng hai chiều

thể lấy thông qua tên của biến mảng.

Array.8
Array

ThS.
Trần Ngọc Bảo Duy

Mảng
Sự cần thiết của mảng
Định nghĩa

MẢNG MỘT CHIỀU Mảng một chiều


Khai báo
Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


Ứng dụng
Khai báo
Đọc và ghi trên mảng hai chiều

Array.9
Array
Khai báo mảng 1 chiều
ThS.
Trần Ngọc Bảo Duy

Để khai báo một mảng một chiều trong C/C++, ta sử dụng


Mảng
cú pháp: Sự cần thiết của mảng
Định nghĩa

<datatype> <array_name>[<size>]; Mảng một chiều


Khai báo
Đọc và ghi trên mảng 1 chiều

trong đó: Mảng hai chiều

• <datatype> là kiểu dữ liệu của các phần tử trong mảng Ứng dụng
Khai báo
Đọc và ghi trên mảng hai chiều
• <array_name> là tên mảng, do người lập trình đặt.
• <size> là một hằng thể hiện kích thước của mảng.

Array.10
Array
Ví dụ
ThS.
Trần Ngọc Bảo Duy

1 # include < iostream > Mảng


2 using namespace std ; Sự cần thiết của mảng
Định nghĩa
3
Mảng một chiều
4 int main () {
Khai báo
5 int a [6]; Đọc và ghi trên mảng 1 chiều

6 int b [6] = {10 , 20 , 30}; Mảng hai chiều


7 int c [6] = {10 , 20 , 30 , 40 , 50 , 60}; Ứng dụng
Khai báo
8
Đọc và ghi trên mảng hai chiều
9 return 0;
10 }

Array.11
Array
Ví dụ
ThS.
Trần Ngọc Bảo Duy

Mảng
Sự cần thiết của mảng
Định nghĩa

Mảng một chiều


Khai báo
Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


Ứng dụng
Khai báo
Đọc và ghi trên mảng hai chiều

Hình: Hình ảnh trong bộ nhớ của các mảng a, b, và c


Array.12
Array
Số phần tử của mảng
ThS.
Trần Ngọc Bảo Duy

Số phần tử của mảng phải biết trước thời điểm biên dịch,
do đó phải là một hằng số không âm:
• Sử dụng macro: #define MAX_SIZE
Mảng
• Khai báo hằng số nguyên: const int MAX_SIZE Sự cần thiết của mảng
Định nghĩa

Mảng một chiều


1 # include < iostream > Khai báo
2 using namespace std ; Đọc và ghi trên mảng 1 chiều

3 Mảng hai chiều


4 # define MAX_SIZE 6 Ứng dụng
Khai báo
5 Đọc và ghi trên mảng hai chiều

6 int main () {
7 const int max_size = 10;
8 int a [ MAX_SIZE ];
9 int b [ max_size ];
10 return 0;
11 }

Array.13
Array
Số phần tử của mảng
ThS.
Số phần tử của mảng phải biết trước thời điểm biên dịch, Trần Ngọc Bảo Duy

do đó phải là một hằng số không âm:


• Sử dụng macro: #define MAX_SIZE
• Khai báo hằng số nguyên: const int MAX_SIZE
Mảng
Sự cần thiết của mảng
1 # include < iostream > Định nghĩa

2 using namespace std ; Mảng một chiều


3 Khai báo
Đọc và ghi trên mảng 1 chiều
4 # define MAX_SIZE 6
Mảng hai chiều
5
Ứng dụng
6 int main () { Khai báo
Đọc và ghi trên mảng hai chiều
7 const int max_size = 10;
8 int a [ MAX_SIZE ];
9 int b [ max_size ];
10 return 0;
11 }

Một số trình biên dịch cho phép khai báo kích thước với biến dữ
liệu, tuy nhiên, đó không phải là quy tắc chuẩn được định nghĩa
bởi ANSI cho C++ (http://www.gotw.ca/iso/).
Array.13
Array
Đọc và ghi trên mảng 1 chiều
ThS.
Trần Ngọc Bảo Duy

Mảng
Sự cần thiết của mảng

Phương pháp Định nghĩa

Mảng một chiều


Có hai cách để đọc và ghi trên mảng: Khai báo
Đọc và ghi trên mảng 1 chiều

1 Dùng chỉ số để lấy phần tử quan tâm. Mảng hai chiều


Ứng dụng
2 Tự tính toán địa chỉ và lấy phần tử quan tâm. Khai báo
Đọc và ghi trên mảng hai chiều

Array.14
Array
Dùng chỉ số
ThS.
1 # include < iostream > Trần Ngọc Bảo Duy
2 using namespace std ;
3
4 int main () {
5 int c [6] = {10 , 20 , 30 , 40 , 50 , 60};
6 int id = 0; Mảng
Sự cần thiết của mảng
7 /* Write to element */ Định nghĩa

8 c [3] = 99; Mảng một chiều


9 c [ id + 1] = 100; Khai báo
Đọc và ghi trên mảng 1 chiều
10 /* Read and print element */
11 cout << " c [3] ␣ = ␣ " << c [3] << endl ; Mảng hai chiều
Ứng dụng
12 cout << " c [ " << id + 1 << " ] ␣ = ␣ " Khai báo

13 << c [ id + 1] << endl ; Đọc và ghi trên mảng hai chiều

14 return 0;
15 }

Array.15
Array
Dùng chỉ số
ThS.
1 # include < iostream > Trần Ngọc Bảo Duy
2 using namespace std ;
3
4 int main () {
5 int c [6] = {10 , 20 , 30 , 40 , 50 , 60};
6 int id = 0; Mảng
Sự cần thiết của mảng
7 /* Write to element */ Định nghĩa

8 c [3] = 99; Mảng một chiều


9 c [ id + 1] = 100; Khai báo
Đọc và ghi trên mảng 1 chiều
10 /* Read and print element */
11 cout << " c [3] ␣ = ␣ " << c [3] << endl ; Mảng hai chiều
Ứng dụng
12 cout << " c [ " << id + 1 << " ] ␣ = ␣ " Khai báo

13 << c [ id + 1] << endl ; Đọc và ghi trên mảng hai chiều

14 return 0;
15 }

Chương trình trên sẽ in ra đoạn kết quả sau:

c[3] = 99
c[1] = 100
Array.15
Array
Tự tính toán địa chỉ và lấy phần tử quan tâm
ThS.
Trần Ngọc Bảo Duy

1 # include < iostream >


2 using namespace std ;
3 Mảng
4 int main () { Sự cần thiết của mảng
Định nghĩa
5 int c [6] = {10 , 20 , 30 , 40 , 50 , 60};
Mảng một chiều
6 int id = 0;
Khai báo
7 /* Write to element */ Đọc và ghi trên mảng 1 chiều

8 *( c + 3) = 99; Mảng hai chiều


9 *( c + ( id + 1)) = 100; Ứng dụng
Khai báo
10 /* Read and print element */ Đọc và ghi trên mảng hai chiều
11 cout << " c [3] ␣ = ␣ " << *( c + 3) << endl ;
12 cout << " c [ " << id + 1 << " ] ␣ = ␣ "
13 << *( c + ( id + 1)) << endl ;
14 return 0;
15 }

Array.16
Array
Tự tính toán địa chỉ và lấy phần tử quan tâm
ThS.
1 # include < iostream > Trần Ngọc Bảo Duy
2 using namespace std ;
3
4 int main () {
5 int c [6] = {10 , 20 , 30 , 40 , 50 , 60};
6 int id = 0; Mảng
Sự cần thiết của mảng
7 /* Write to element */ Định nghĩa

8 *( c + 3) = 99; Mảng một chiều


9 *( c + ( id + 1)) = 100; Khai báo
Đọc và ghi trên mảng 1 chiều
10 /* Read and print element */
11 cout << " c [3] ␣ = ␣ " << *( c + 3) << endl ; Mảng hai chiều
Ứng dụng
12 cout << " c [ " << id + 1 << " ] ␣ = ␣ " Khai báo

13 << *( c + ( id + 1)) << endl ; Đọc và ghi trên mảng hai chiều

14 return 0;
15 }

Chương trình trên sẽ in ra đoạn kết quả sau:


c[3] = 99
c[1] = 100

Array.16
Array
Tự tính toán địa chỉ và lấy phần tử quan tâm
ThS.
1 # include < iostream > Trần Ngọc Bảo Duy

2 using namespace std ;


3
4 int main () {
5 int c [6] = {10 , 20 , 30 , 40 , 50 , 60};
Mảng
6 int id = 0; Sự cần thiết của mảng
7 /* Write to element */ Định nghĩa

8 *( c + 3) = 99; Mảng một chiều


9 *( c + ( id + 1)) = 100; Khai báo
Đọc và ghi trên mảng 1 chiều
10 /* Read and print element */
Mảng hai chiều
11 cout << " c [3] ␣ = ␣ " << *( c + 3) << endl ; Ứng dụng
12 cout << " c [ " << id + 1 << " ] ␣ = ␣ " Khai báo
Đọc và ghi trên mảng hai chiều
13 << *( c + ( id + 1)) << endl ;
14 return 0;
15 }

Các bước:
1 Tính toán địa chỉ theo công thức first + k: c + 3
2 Lấy giá trị tại một địa chỉ thông qua toán tử *: *(c + 3)

Array.16
Array
Tự tính toán địa chỉ và lấy phần tử quan tâm
ThS.
1 # include < iostream > Trần Ngọc Bảo Duy
2 using namespace std ;
3
4 int main () {
5 int c [6] = {10 , 20 , 30 , 40 , 50 , 60};
6 int id = 0; Mảng
Sự cần thiết của mảng
7 /* Write to element */ Định nghĩa
8 *( c + 3) = 99;
Mảng một chiều
9 *( c + ( id + 1)) = 100; Khai báo

10 /* Read and print element */ Đọc và ghi trên mảng 1 chiều

11 cout << " c [3] ␣ = ␣ " << *( c + 3) << endl ; Mảng hai chiều
Ứng dụng
12 cout << " c [ " << id + 1 << " ] ␣ = ␣ " Khai báo
13 << *( c + ( id + 1)) << endl ; Đọc và ghi trên mảng hai chiều

14 return 0;
15 }

Như vậy first hay địa chỉ phần tử đầu tiên của mảng, có
thể được lấy thông qua hai cách:
1 Tên mảng: như trên, dùng tên c
2 Thông qua truy cập chỉ số: &c[0], với toán tử & là toán tử
lấy địa chỉ. Array.16
Array
Một số kỹ thuật trên mảng một chiều
ThS.
Trần Ngọc Bảo Duy

1 Duyệt qua tất cả các phần trên mảng


Mảng
2 Tính các giá trị thống kê từ mảng: tổng, lớn nhất, nhỏ Sự cần thiết của mảng

nhất, trung bình, trung vị, độ lệch chuẩn, ... Định nghĩa

Mảng một chiều


3 Xử lý từng phần tử trên mảng bằng một giải thuật nào Khai báo
Đọc và ghi trên mảng 1 chiều
đó. Mảng hai chiều
4 Hoán đổi từng cặp phần tử trên mảng. Ứng dụng
Khai báo
Đọc và ghi trên mảng hai chiều
5 Sắp xếp các phần tử trên mảng.
6 Tìm kiếm một phần tử trên mảng: tìm kiếm tuần tự,
tìm kiếm nhị phân.

Array.17
Array

ThS.
Trần Ngọc Bảo Duy

Mảng
Sự cần thiết của mảng
Định nghĩa

MẢNG HAI CHIỀU Mảng một chiều


Khai báo
Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


Ứng dụng
Khai báo
Đọc và ghi trên mảng hai chiều

Array.18
Array
Ứng dụng
ThS.
Trần Ngọc Bảo Duy

• Các ma trận trong toán học (Đại số tuyến Mảng


Sự cần thiết của mảng

tính) là những mảng hai chiều. Định nghĩa

Mảng một chiều

• Ảnh được lưu trữ trong máy tính là mảng Khai báo
Đọc và ghi trên mảng 1 chiều

hai chiều các điểm ảnh (pixel). Mảng hai chiều


Ứng dụng
Khai báo

• Đồ thị (mạng của các đối tượng) có thể Đọc và ghi trên mảng hai chiều

được biểu diễn dùng mảng 2 chiều.

Array.19
Array
Mô hình và Lưu trữ vật lý
ThS.
Trần Ngọc Bảo Duy

10 20 30 40
50 60 70 80
Mảng
90 100 110 120 Sự cần thiết của mảng
Định nghĩa

Mảng một chiều


Hình: Mô hình một mảng hai chiều: 3 hàng × 4 cột Khai báo
Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


Ứng dụng
Khai báo
Đọc và ghi trên mảng hai chiều

Array.20
Array
Mô hình và Lưu trữ vật lý
ThS.
Trần Ngọc Bảo Duy

10 20 30 40
50 60 70 80
Mảng
90 100 110 120 Sự cần thiết của mảng
Định nghĩa

Mảng một chiều


Hình: Mô hình một mảng hai chiều: 3 hàng × 4 cột Khai báo
Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


Ứng dụng
Khai báo
Đọc và ghi trên mảng hai chiều

0 1 2 3 4 5 6 7 8 9 10 11

10 20 30 40 50 60 70 80 90 100 110 120

Hình: Lưu trữ của mảng 2 chiều: tuyến tính hoá mảng 2 chiều

Array.20
Array
Cách lưu trữ mảng 2 chiều
ThS.
Trần Ngọc Bảo Duy

Phương pháp lưu trữ

• Các phần tử được lưu trữ liên tục, hết hàng đến hàng: Mảng
Sự cần thiết của mảng
Nếu phần tử đầu tiên (giá trị 10) bắt đầu ở BYTE có Định nghĩa

địa chỉ là 100 Mảng một chiều


Khai báo
• Địa chỉ của ô nhớ chứa 20: 104 Đọc và ghi trên mảng 1 chiều

• Địa chỉ của ô nhớ chứa 30: 108 Mảng hai chiều
• Địa chỉ của ô nhớ chứa 40: 112 Ứng dụng
Khai báo
• Địa chỉ của ô nhớ chứa 50: 116 Đọc và ghi trên mảng hai chiều

• Địa chỉ của ô nhớ chứa 60: 120


• Địa chỉ của ô nhớ chứa 90: 132
• Địa chỉ của ô nhớ chứa 100: 136
• ...

Array.21
Array
Cách lưu trữ mảng 2 chiều
ThS.
Trần Ngọc Bảo Duy

Phương pháp lưu trữ


• Các phần tử trong mảng 2 chiều được đánh chỉ số để Mảng
truy cập, dùng 2 chỉ số: Sự cần thiết của mảng
Định nghĩa

• Chỉ số hàng bắt đầu từ 0 đến (Số hàng - 1) Mảng một chiều
• Chỉ số cột bắt đầu từ 0 đến (Số cột - 1) Khai báo
Đọc và ghi trên mảng 1 chiều

Mảng hai chiều


0 1 2 3 Ứng dụng
Khai báo

0 10 20 30 40 Đọc và ghi trên mảng hai chiều

1 50 60 70 80
2 90 100 110 120

Array.21
Array
Cách lưu trữ mảng 2 chiều
ThS.
Trần Ngọc Bảo Duy

Phương pháp lưu trữ Mảng


Sự cần thiết của mảng
Định nghĩa
• Chương trình có thể tính địa chỉ của ô nhớ bắt đầu Mảng một chiều
của phần tử có chỉ số [row, col] dễ dàng: Khai báo
Đọc và ghi trên mảng 1 chiều
Đ/c phần tử [row, col] = first + [row * COLS + col]
Mảng hai chiều
trong đó: Ứng dụng
Khai báo
• first: địa chỉ của phần tử đầu tiên, là tên mảng Đọc và ghi trên mảng hai chiều

• COLS: số phần tử trên mỗi hàng

Array.21
Array
Khai báo mảng hai chiều
ThS.
Trần Ngọc Bảo Duy

1 # include < iostream >


2 using namespace std ;
3 Mảng
4 int main () { Sự cần thiết của mảng
Định nghĩa
5 int a [3][4];
Mảng một chiều
6 int b [3][4] = { {10 , 20 , 30} };
Khai báo
7 int c [3][4] = { {10 , 20 , 30} , Đọc và ghi trên mảng 1 chiều

8 {50 , 60} Mảng hai chiều


9 }; Ứng dụng
Khai báo
10 int d [3][4] = { {10 , 20 , 30 , 40} Đọc và ghi trên mảng hai chiều
11 {50 , 60 , 70 , 80} ,
12 {90 , 100 , 110 , 120}
13 };
14 return 0;
15 }

Array.22
Array
Đọc và ghi trên mảng hai chiều
ThS.
Trần Ngọc Bảo Duy
1 # include < iostream >
2 using namespace std ;
3
4 int main () {
5 int a [3][4]; Mảng
Sự cần thiết của mảng
6 int r = 0; Định nghĩa

7 int c = 2; Mảng một chiều


8 Khai báo
Đọc và ghi trên mảng 1 chiều
9 a [ r ][ c ] = 99;
10 Mảng hai chiều
Ứng dụng
11 cout << " a [ " << r << " ][ " << c << " ]= " Khai báo

12 << a [ r ][ c ] << endl ; Đọc và ghi trên mảng hai chiều

13 return 0;
14 }

Array.23
Array
Đọc và ghi trên mảng hai chiều
ThS.
Trần Ngọc Bảo Duy
1 # include < iostream >
2 using namespace std ;
3
4 int main () {
5 int a [3][4]; Mảng
Sự cần thiết của mảng
6 int r = 0; Định nghĩa

7 int c = 2; Mảng một chiều


8 Khai báo
Đọc và ghi trên mảng 1 chiều
9 a [ r ][ c ] = 99;
10 Mảng hai chiều
Ứng dụng
11 cout << " a [ " << r << " ][ " << c << " ]= " Khai báo

12 << a [ r ][ c ] << endl ; Đọc và ghi trên mảng hai chiều

13 return 0;
14 }

Đoạn chương trình trên in ra :

a[0][2] = 99

Array.23
Array
Một số kỹ thuật trên mảng hai chiều
ThS.
Trần Ngọc Bảo Duy

Mảng
• Duyệt qua từng phần tử trong mảng Sự cần thiết của mảng
Định nghĩa

• Duyệt qua từng phần tử trong cùng một hàng Mảng một chiều

• Duyệt qua từng phần tử trong cùng một cột Khai báo
Đọc và ghi trên mảng 1 chiều

• Với ma trận vuông: Mảng hai chiều


Ứng dụng
• Duyệt các phần tử trên đường chéo chính Khai báo

• Duyệt các phần tử trên đường chéo phụ Đọc và ghi trên mảng hai chiều

Array.24

You might also like