Chúng
ta đã biết thế nào là mảng một chiều. Điều này có nghĩa là các mảng chỉ
có một chỉ số. Các mảng có thể có nhiều hơn một chiều. Các mảng đa chiều
giúp dễ dàng trình bày các đối tượng đa chiều, chẳng hạn một đồ thị với các
dòng và cột hay tọa độ màn hình của máy tính. Các mảng đa chiều được khai báo
giống như các mảng một chiều, ngoại trừ có thêm một cặp dấu ngoặc vuông []
trong trường hợp mảng hai chiều. Một mảng ba chiều sẽ cần ba cặp dấu ngoặc
vuông,... Một cách tổng quát, một mảng đa chiều có thể được biểu diễn như sau:
data_type ary[exp1][exp2]....[expN];
Ở đó, ary
là một mảng có kiểu dữ liệu là data_type, và exp1, exp2,..... , expN
là các biểu thức nguyên dương xác định số phần tử của mảng được kết hợp với mỗi
chiều.
Dạng
đơn giản nhất và thường được sử dụng nhất của các mảng đa chiều là mảng hai
chiều. Một mảng hai chiều có thể xem như là một mảng của hai ‘mảng một chiều’.
Một mảng hai chiều đặc trưng như bảng lịch trình của máy bay, xe lửa. Để xác định
thông tin, ta sẽ chỉ định dòng và cột cần thiết, và thông tin được đọc ra từ vị
trí (dòng và cột) được tìm thấy. Tương tự như vậy, một mảng hai chiều là một
khung lưới chứa các dòng và cột trong đó mỗi phần tử được xác định duy nhất bằng
toạ độ dòng và cột của nó. Một mảng hai chiều tmp có kiểu int với
2 dòng và 3 cột có thể được khai báo như sau,
int tmp[2][3];
Mảng
này sẽ chứa 2 x 3 (6) phần tử, và chúng có thể được biểu diễn như sau:
Dòng
Cột
|
0
|
1
|
2
|
0
|
e1
|
e2
|
e3
|
1
|
e4
|
e5
|
e6
|
Ở đó e1
– e6 biểu diễn cho các phần tử của mảng. Cả dòng và cột được đánh số từ 0. Phần
tử e6 được xác định bằng dòng 1 và cột 2. Truy xuất đến phần tử này như sau:
tmp[1][2];
Khởi
tạo mảng hai chiều
Khai
báo mảng hai chiều có thể kết hợp với việc gán các giá trị khởi tạo. Cần phải cẩn
thận lưu ý đến thứ tự các giá trị khởi tạo được gán cho các phần tử của mảng.
Các phần tử trong dòng đầu tiên của mảng hai chiều sẽ được gán giá trị trước,
sau đó đến các phần tử của dòng thứ hai, … Hãy xem sự khai báo mảng sau:
int ary[3][4]
={1,2,3,4,5,6,7,8,9,10,11,12};
Kết quả
của phép khai báo trên sẽ như sau:
ary[0][0]
= 1 ary[0][1] = 2 ary[0][2] = 3 ary[0][3]= 4
ary[1][0]
= 5 ary[1][1] = 6 ary[1][2] = 7 ary[1][3] = 8
ary[2][0]
= 9 ary[2][1] = 10 ary[2][2] = 11 ary[2][3] = 12
Chú
ý rằng chỉ số thứ 1 chạy từ 0 đến 2 và chỉ
số thứ hai chạy tử 0 đến 3. Một điểm cần nhớ là các phần tử của mảng sẽ được
lưu trữ ở những vị trí kế tiếp nhau trong bộ nhớ. Mảng ary ở trên có thể
xem như là một mảng của 3 phần tử, mỗi phần tử là một mảng của 4 số nguyên, và
sẽ xuất hiện như sau:
Dòng 0
|
Dòng 1
|
Dòng 2
|
1 2 3 4
|
5 6 7 8
|
9 10 11 12
|
Thứ tự
tự nhiên mà các giá trị khởi tạo được gán có thể thay đổi bằng hình thức nhóm
các giá trị khởi tạo lại trong các dấu ngoặc nhọn {}. Quan sát sự khởi tạo sau:
int
ary [3][4] ={
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
Mảng sẽ
được khởi tạo như sau:
ary[0][0]=1 ary[0][1]=2 ary[0][2]=3 ary[0][3]=0
ary[1][0]=4 ary[1][1]=5 ary[1][2]=6 ary[1][3]=0
ary[2][0]=7 ary[2][1]=8 ary[2][2]=9 ary[2][3]=0
Một phần
tử của mảng đa chiều có thể được sử dụng như một biến trong C bằng cách dùng
các chỉ số để xác định phần tử của mảng.
Ví dụ:
/*
Chương trình nhập các số vào một mảng hai chiều. */
#include
<stdio.h>
void main() {
int
arr[2][3];
int
row, col;
for(row
= 0; row < 2; row++) {
for(col
= 0; col < 3; col++) {
printf(“\nEnter a Number at [%d][%d]: ”, row,
col);
scanf(“%d”, &arr[row][col]);
}
}
for(row
= 0; row < 2; row++) {
for(col = 0; col < 3; col++) {
printf(“\nThe
Number at [%d][%d] is %d”, row, col, arr[row][col]);
}
}
}
Một ví
dụ về kết quả thực thi chương trình trên như sau:
Enter a Number at [0][0]: 10
Enter a Number at [0][1]: 100
Enter a Number at [0][2]: 45
Enter a Number at [1][0]: 67
Enter a Number at [1][1]: 45
Enter a Number at [1][2]: 230
The Number at [0][0] is 10
The Number at [0][1] is 100
The Number at [0][2] is 45
The Number at [1][0] is 67
The Number at [1][1] is 45
The Number at [1][2] is 230
Mảng
hai chiều và chuỗi
Như
chúng ta đã biết ở phần trước, một chuỗi có thể được biểu diễn bằng mảng một
chiều, kiểu ký tự. Mỗi ký tự trong chuỗi được lưu trữ trong một phần tử của mảng.
Mảng của chuỗi có thể được tạo bằng cách sử dụng mảng ký tự hai chiều. Chỉ số
bên trái xác định số lượng chuỗi, và chỉ số bên phải xác định chiều dài tối đa
của mỗi chuỗi. Ví dụ bên dưới khai báo một mảng chứa 25 chuỗi và mỗi chuỗi có độ
dài tối đa 80 ký tự kể cả ký tự null.
char
str_ary[25][80];
Ví dụ
minh hoạ cách sử dụng của một mảng hai chiều:
Xét bài
toán tổ chức một danh sách tên theo thứ tự bảng chữ cái. Ví dụ sau đây nhập một
danh sách các tên và sau đó sắp xếp chúng theo thứ tự bảng chữ cái.
Ví dụ:
#include
<stdio.h>
#include
<string.h>
#include
<conio.h>
void main() {
int
i, n = 0;
int
item;
char
x[10][12];
char
temp[12];
printf(“Enter each string on a separate line \n\n”);
printf(“Type ‘END’ when over \n\n”);
/* Read in the list of strings */
do
{
printf(“String %d: ”, n + 1);
scanf(“%s”, x[n]);
} while
(strcmp(x[n++], “END”));
/*Reorder the list of strings */
n = n – 1;
for(item
= 0; item < n - 1; ++item) {
/* Find lowest of remaining
strings */
for(i = item + 1; i < n; ++i) {
if(strcmp(x[item], x[i]) > 0) {
/*Interchange
two strings*/
strcpy(temp,
x[item]);
strcpy(x[item],
x[i]);
strcpy(x[i], temp);
}
}
}
/* Display the arranged list of strings
*/
printf(“Recorded list of strings: \n”);
for(i
= 0; i < n; ++i) {
printf("\nString %d is
%s", i + 1, x[i]);
}
}
Chương
trình trên nhập vào các chuỗi đến khi người dùng nhập vào từ “END”. Khi END được
nhập vào, chương trình sẽ sắp xếp danh sách các chuỗi và in ra theo thứ tự đã sắp
xếp. Chương trình kiểm tra hai phần tử kế tiếp nhau. Nếu thứ tự của chúng không
thích hợp, thì hai phần tử sẽ được đổi chỗ. Sự so sánh hai chuỗi được thực hiện
với sự trợ giúp của hàm strcmp() và sự đổi chỗ được thực hiện với
hàmg strcpy().
Một ví
dụ về kết quả thực thi của chương trình như sau:
Enter each string on a separate line
Type ‘END’ when over
String 1: has
String 2: seen
String 3: alice
String 4: wonderland
String 5: END
Record list of strings:
String 1 is alice
String 2 is has
String 3 is seen
String 4 is wonderland
Đăng nhận xét