Mảng hai chiều
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 

Post a Comment

Mới hơn Cũ hơn