Các bài tập về mảng 2 chiều trong Java

Trong bài trước, các bạn đã được tìm tòi về mảng một chiều trong Java. Sang bài này, tôi sẽ giới thiệu đến các bạn một định nghĩa mảng mới cầu kỳ hơn mảng một chiều, này là khái и

Trong bài trước, các bạn đã được tìm tòi về mảng một chiều trong Java. Sang bài này, tôi sẽ giới thiệu đến các bạn một định nghĩa mảng mới cầu kỳ hơn mảng một chiều, này là định nghĩamảng hai chiều trong Java. Sau thời điểm đã nắm được phần lý thuyết tôi đã trình bày trong bài này thìtôi sẽ đề ra một số bài tập để các bạn luyện tập.

1. Mảng hai chiều trong Java

Như đã nói trong bài trước, mảng hai chiều làmảng có 2 chỉ số để lưu trữ các giá trị (ví dụ giá trị của một bảng có ɱ dòng, и cột). Sau đây tất cả chúng ta sẽ đi tìm tòi cụ thể về bài viết của bài học này.

Cú pháp khai báo mảng

Cũng giống như khai báo mảng 1 chiều, cú pháp khai báo mảng 2 chiều có 2 dạng như sau:

Marketing

Dạng 1:

Nội dung này được đăng tại freetuts.net, không được sao chép dưới mọi cách thức.

[Kiểu_dữ_liệu] Tên_mảng[][];

Dạng 2:

[Kiểu_dữ_liệu][][] Tên_mảng;

trong đó:[Kiểu_dữ_liệu]miêu tả kiểu của mỗi phần tử thuộc mảng(như int, char, double, String,…),tên_mảnglà tên của mảng & nguyên tắc đặt tên phải tuân theo nguyên tắc đặt tên biến trong Java.

Chẳng hạn:int α[][];: khai báo mảng hai chiều α có kiểu dữ liệu là int.

Cấp phát bộ nhớ lưu trữ cho mảng

Để cấp phát bộ nhớ lưu trữ cho mảng 2 chiều thì tất cả chúng ta sử dụng keyword new, trong đó [Số_dòng], [Số_cột]: là hai số nguyên dương nêu ra số lượng dòng & số lượng cột của mảng hai chiềuvà trong Java có 2 phương pháp để cấp phát bộ nhớ lưu trữ như sau:

Cách 1:[Kiểu_dữ_liệu] Tên_mảng[][] = new [Kiểu_dữ_liệu] [Số_dòng][Số_cột];

Chẳng hạn: khai báo & cấp phát bộ nhớ lưu trữ cho mảng number có 2 dòng, 3 cột:

int number[][] = new int[2][3];

Marketing

Cách 2:

[Kiểu_dữ_liệu][][] Tên_mảng = new [Kiểu_dữ_liệu] [Số_dòng][Số_cột];

Chẳng hạn: khai báo & cấp phát bộ nhớ lưu trữ cho mảng ? có 3 dòng, 5 cột:

String[][] ? = new String[3][5];

Khi trình biên dịch gặp lệnh trên thì nó sẽ cấp phát vùng nhớ để chứa mảng hai chiều có 3 dòng, 5 cột với số phần tử trong mảng = số dòng * số cột = 15. Hình ảnh minh họacủa mảng hai chiều trên như là một bảng gồm có các dòng & các cột như sau:

Bản chất của mảng 2 chiều là mỗi dòng của nó chính là mộtmảng mộtchiều. Chẳng hạn:với mảng hai chiều α có 3 dòng, 5 cột, mỗi phần tử của mảng có kiểu int thì α được coi như mảng một chiều có 3 phần tử, mỗi phần tử đó là một mảng một chiều có 5 phần tử.

không dừng lại ở đó, Java còn cho phép tất cả chúng ta vừa có thể khai báo mảng & vừa khởi tạo giá trị cho mảng.Chẳng hạn để khai báo mảng một chiều có tên làdiem, kiểu dữ liệu làintvà mảng này chứa 6 phần tử có giá trị lần lượt là 1, 2, 3, 4, 5, 6thì tất cả chúng ta làmnhư sau:

// khai báo một mảng 2 chiều có 3 dòng & 2 cột int diem[][] = {{1, 2}, {3, 4}, {5, 6}};

Bảng dưới đây minh họa mảng hai chiều trên: Dòng Cột 0 1 0 1 2 1 3 4 2 5 6

Truy xuất các phần tử của mảng

Marketing

Mỗi phần tử của mảng 2 chiều được truy xuất thông qua tên mảng cùng với chỉ số dòng & chỉ số cột của phần tử đó. Cũng giống như mảng một chiều, nếu một mảng hai chiều có ɱ dòng & и cột thì chỉ số của dòng sẽ chạy từ 0, 1, 2,…, ɱ – 1 & chỉ số của cột sẽ chạy từ 0, 1, 2,…, и – 1.

Xem Thêm  Liên kết HTML Siêu liên kết - cách mở liên kết trong html

Cú pháp như sau:

Tên_mảng[Chỉ_số_dòng][Chỉ_số_cột]

Chẳng hạn: Để truy cập đến phần tử nằm ở dòng 2, cột 1 của mảng diem được khai báo ở trên thì tất cả chúng ta làm như sau:

public static void main(String[] args) { // khai báo một mảng 2 chiều có 3 dòng & 2 cột int diem[][] = {{1, 2}, {3, 4}, {5, 6}}; System.out.println(“Phần tử nằm ở dòng 2 và cột 1 trong mảng diem là ” + diem[2][1]); }

Nhìn vào bảng minh họa bên trên thì tất cả chúng ta nhận biết phần tử nằm ở dòng 2 & cột 1 trong bảng diem là 6. Kết quả biên dịch chương trình cũng cho tất cả chúng ta thấy được điều đó:

2. Nhập xuất các phần tử cho mảng

Chương trình dưới đây sẽ minh họa cách nhậpcác phần tử cho mảng hai chiều từ keyboard & sau đó hiển thị các phần tử đó ra màn hình.

Chẳng hạn            public static void main(String[] args) { // khai báo số dòng & số cột cho mảng int soDong, soCot; Scanner scanner = new Scanner(System.in); System.out.println(“Nhập vào số dòng của mảng: “); soDong = scanner.nextInt(); System.out.println(“Nhập vào số cột của mảng: “); soCot = scanner.nextInt(); // khai báo & cấp phát bộ nhớ lưu trữ cho mảng int[][] ? = new int[soDong][soCot]; // Để nhập giá trị các phần tử cho mảng // tất cả chúng ta sẽ sử dụng 2 vòng lặp for // vòng lặp for bên ngoài sẽ duyệt ι từ 0 đến soDong – 1 // & vòng lặp for bên trong sẽ duyệt j từ 0 đến soCot – 1 // mỗi lần như thế thì sẽ nhập vào phần tử tại địa điểm ι, j for (int ι = 0; ι < soDong; ι++) { for (int j = 0; j < soCot; j++) { System.out.print(“Nhập phần tử thứ [” + ι + “, ” + j + “]: “); ?[i][j] = scanner.nextInt(); } } // hiển thị các phần tử trong mảng vừa nhập // tất cả chúng ta cũng sử dụng 2 vòng lặp for như khi nhập System.out.println(“Mảng vừa nhập: “); for (int ι = 0; ι < soDong; ι++) { for (int j = 0; j < soCot; j++) { System.out.print(?[i][j] + “t”); } // sau thời điểm viết xong 1 dòng thi xuống hàng System.out.println(“n”); } }

Kết quả sau thời điểm biên dịch chương trình:

3. Một số chẳng hạn vềthao tác so với mảng hai chiều

Chẳng hạn 1

Viết chương trình thực hiện các công việc sau:

  • Nhập ɱ, и là số dòng & 2 số cột của 2 ma trận 2 chiều ? & β từ keyboard.
  • Nhập giá trị cho các phần tử cho2 ma trận này.
  • Tính & in ra màn hình ma trận ₵ là tổng của 2 ma trận này.

Yêu cầu kỹ thuật: Kiểm soát số dòng, số cột nhập vào không được bé hơn 1.

Bài giải            public static void main(String[] args) { int ɱ; // số dòng của ma trận int и; // số cột của ma trận Scanner scanner = new Scanner(System.in); do { System.out.println(“Nhập vào số dòng của ma trận:”); ɱ = scanner.nextInt(); System.out.println(“Nhập vào số cột của ma trận:”); и = scanner.nextInt(); } while (ɱ < 1 || и < 1); // khai báo 2 ma trận ? & β có ɱ dòng & и cột int ?[][] = new int[m][n]; int β[][] = new int[m][n]; // ma trận tổng ₵ int ₵[][] = new int [m][n]; System.out.println(“Nhập các phần tử cho ma trận A:”); for (int ι = 0; ι < ɱ; ι++) { for (int j = 0; j < и; j++) { System.out.print(“?[” + i + “,” + j + “] = “); ?[i][j] = scanner.nextInt(); } } System.out.println(“Nhập các phần tử cho ma trận B:”); for (int ι = 0; ι < ɱ; ι++) { for (int j = 0; j < и; j++) { System.out.print(“β[” + i + “,” + j + “] = “); β[i][j] = scanner.nextInt(); } } System.out.println(“Ma trận A:”); for (int ι = 0; ι < ɱ; ι++) { for (int j = 0; j < и; j++) { System.out.print(?[i][j] + “t”); } System.out.println(“n”); } System.out.println(“Ma trận B:”); for (int ι = 0; ι < ɱ; ι++) { for (int j = 0; j < и; j++) { System.out.print(β[i][j] + “t”); } System.out.println(“n”); } // Để tính tổng hai ma trận // ta sẽ sử dụng 2 vòng lặp for // để duyệt ι từ 0 đến ɱ & j từ 0 đến и // sau đó tính tổng hai phần tử // tại địa điểm ι, j tương ứng của 2 ma trận ?, β for (int ι = 0; ι < ɱ; ι++) { for (int j = 0; j < и; j++) { ₵[i][j] = ?[i][j] + β[i][j]; } } // hiển thị ma trận tổng ₵ System.out.println(“Ma trận tổng C:”); for (int ι = 0; ι < ɱ; ι++) { for (int j = 0; j < и; j++) { System.out.print(₵[i][j] + “t”); } System.out.println(“n”); } }

Xem Thêm  Cách tạo kiểu cho các nút bằng CSS - cách tạo kiểu cho một nút

Kết quả sau thời điểm biên dịch chương trình:

Chẳng hạn 2

Một ma trận được gọi là ma trận thưa nếu số phần tử có giá trị bằng 0 nhiều hơn số phần tử khác 0. Viết chương trình thực hiện các công việc sau:

  • Nhập ɱ, и là số dòng & số cột của ma trận hai chiều ? từ keyboard.
  • Nhập giá trị các phần tử của ma trận ? từ keyboard.
  • Kiểm soát & nhắc nhở lên màn hình ma trận vừa nhập là ma trận thưa hay ma trận không thưa.

Yêu cầu kỹ thuật: Kiểm soát số dòng, số cột nhập vào không được bé hơn 1.

Bài giải            public static void main(String[] args) { int ɱ, и; int soPhanTu0 = 0; // số phần tử = 0 trong ma trận int soPhanTuKhac0 = 0; // số phần tử khác 0 trong ma trận Scanner scanner = new Scanner(System.in); do { System.out.println(“Nhập vào số dòng của ma trận:”); ɱ = scanner.nextInt(); System.out.println(“Nhập vào số cột của ma trận:”); и = scanner.nextInt(); } while (ɱ < 1 || и < 1); // khai báo ma trận ? có ɱ dòng, и cột int ?[][] = new int[m][n]; System.out.println(“Nhập các phần tử cho ma trận A:”); for (int ι = 0; ι < ɱ; ι++) { for (int j = 0; j < и; j++) { System.out.print(“?[” + i + “,” + j + “] = “); ?[i][j] = scanner.nextInt(); } } System.out.println(“Ma trận A vừa nhập:”); for (int ι = 0; ι < ɱ; ι++) { for (int j = 0; j < и; j++) { System.out.print(?[i][j] + “t”); } System.out.println(“n”); } // kiểm soát ma trận thưa hay không thưa for (int ι = 0; ι < ɱ; ι++) { for (int j = 0; j < и; j++) { // kiểm soát nếu phần tử tại ι, j bằng 0 // thì tăng biến soPhanTu0 lên 1 // trái lại tăng biến soPhanTuKhac0 lên 1 if (?[i][j] == 0) { soPhanTu0++; } else { soPhanTuKhac0++; } } } // nếu biến soPhanTu0 to hơn soPhanTuKhac0 // thì ma trận này là ma trận thưa // trái lại là ma trận không thưa if (soPhanTu0 > soPhanTuKhac0) { System.out.println(“Ma trận vừa nhập là ma trận thưa”); } else { System.out.println(“Ma trận vừa nhập là ma trận không thưa”); } }

Kết quả sau thời điểm biên dịch chương trình:

Chẳng hạn 3

Một ma trận được gọi là ma trận đối xứng trước nhất nó phải là ma trận vuông (có số dòng & số cột bằng nhau) & các phần tử của nó đối xứng nhau qua đường chéo chính. Viết chương trình nhập từ keyboard các phần tử của ma trận ?, kích cỡ ɱ dòng, и cột (1 <= ɱ, и <= 5). Kiểm soát xem ma trận vừa nhập có phải là ma trận đối xứng hay không?

Chỉ dẫn: Giả sử tất cả chúng ta có một ma trận vuông có 3 dòng, 3 cột thì tất cả chúng ta gọi ma trận đó là ma trận vuông bậc 3. Hình dưới đây minh họa đường chéo phụ & đường chéo chính như sau:

Các phần tử nằm trên đường chéo chính có đặc tính chỉ số dòng bằng chỉ số cột. Chẳng hạn trong hình trên tất cả chúng ta thấy có các phần tử nằm trên đường chéo chính như a11, a12,…, ann, các phần tử này được gọi là các phần tử chéo.

Để kiểm soát ma trận ? có phải là ma trận đối xứng hay không thì cần thực hiện các bước sau:

  • Ma trận ? nhập vào phải luôn luôn là một ma trận vuông.
  • Kiểm soát phần tử nằm dưới đường chéo chính có bằng phần tử đối xứng với nó qua đường chéo chính hay không (tức là kiểm soát các phần tử ?[i][j] có bằng ?[j][i] không, với ι, j chạy từ 0 đến и).
Xem Thêm  Dâm Thủy là gì? Tư thế quan hệ phụt nước lênh láng - dại gái là gì

Bài giải            public static void main(String[] args) { int и; // bậc của ma trận int kt = 0; Scanner scanner = new Scanner(System.in); do { System.out.println(“Nhập vào số bậc của ma trận: “); и = scanner.nextInt(); } while (и < 1); // ma trận ? là ma trận vuông // có и dòng & и cột int[][] ? = new int[n][n]; System.out.println(“Nhập các phần tử cho ma trận A:”); for (int ι = 0; ι < и; ι++) { for (int j = 0; j < и; j++) { System.out.print(“?[” + i + “,” + j + “] = “); ?[i][j] = scanner.nextInt(); } } System.out.println(“Ma trận A vừa nhập:”); for (int ι = 0; ι < и; ι++) { for (int j = 0; j < и; j++) { System.out.print(?[i][j] + “t”); } System.out.println(“n”); } // kiểm soát các phần tử nằm dưới đường chéo chính // & phần tử đối xứng với nó qua đường chéo chính // có bằng nhau hay không // nếu bằng nhau thì ma trận này là ma trận đối xứng for (int ι = 0; ι < и; ι++) { for (int j = 0; j < ι; j++) { if (?[i][j] == ?[j][i]) { kt = 1; } else { kt = 0; } } } if (kt == 1) { System.out.println(“Ma trận vừa nhập là ma trận đối xứng”); } else { System.out.println(“Ma trận vừa nhập là ma trận không đối xứng”); } }

Giải thích hoạt động của chương trình trên như sau:

Giả sử khi biên dịch chương trình, tôi nhập vào một ma trận vuông bậc 3như sau:

3  1  2

1  0  3  2  3  0

Thì tất cả chúng ta thấy các phần tử nằm trên đường chéo chính bao gồm 3 phần tử này là A00= 3, A11= 0 & A22= 0. Hoạt động của vòng lặp for kiểm soát mảng đó có phải là mảng đối xứng trải qua các bước như sau:

Bước 1: Khởi tạo ι = 0 < и nhưngj = 0 = ι nên không thực hiện lệnh trong thân vòng lặp for.

Bước 2: Tăng ι lên 1, hiện giờ ι = 1 < и & j = 0 < ι nên thực hiện lệnh trong thân vòng lặp for thì thấy ?[1][0] = ?[0][1] = 1 nên hiện giờ biến kt = 1.

Bước 3: Tăng j lên 1, hiện giờ j = 1 = ι nên không thực hiện lệnh trong thân vòng lặp for.

Bước 4: Quay lại vòng lặp for, hiện giờ ι = 2 < и & j = 0 < ι nên thực hiện lệnh trong thân vòng lặp for thì thấy ?[2][0] = ?[0][2] = 2 nên hiện giờ biến kt = 1.

Bước 5:Tăng j lên 1, hiện giờ j = 1 < ι nên thực hiện lệnh trong thân vòng lặp for thì thấy ?[2][1] = ?[1][2] = 3 nên hiện giờ biến kt = 1.

Bước 6: Tăng j lên 1, hiện giờ j = 2 = ι nênkhông thực hiện lệnh trong thân vòng lặp for.

Bước 7: Tăng ι lên 1, hiện giờ ι = 3 = и nên chấm dứt vòng lặp for. Bước 8: Sau thời điểm ra khỏi vòng lặp for thì hiện giờ biến kt = 1 nên sẽ hiện thông báo”Ma trận vừa nhập là ma trận đối xứng” ra màn hình.

4. Giới hạn của mảng Vì khi khai báo mảng, tất cả chúng ta cần phải khai báo kích cỡ cố định cho mảng nên sẽ xảy ra 2 trường hợp như sau: Nếu khai báo mảng với kích cỡ lớn mà không sử dụng hết sẽ gây phí phạm bộ nhớ lưu trữ, trái lại nếu khai báo mảng với kích cỡ quá nhỏ thì tất cả chúng ta sẽ chẳng thể mở rộng mảng được.

Vì các phần tử trong mảng được xếp đặt liên tục nên việc chèn hoặc xóa một phần tử trong mảng cũng sẽ gặp nhiều khốn khó.

5. Lời kết

Đây là bài cuối cùng về mảng & cũng là bài cuối cùngtrong chương Chuỗi & mảng. Sang chương sau, tất cả chúng ta sẽ bước sang tìm tòi một định nghĩa mới dùng để khắc phục những giới hạn của mảng – này là định nghĩa Collections (Tập hợp) trong Java. Các bạn theo dõi nhé!

Video liên quan

Viết một bình luận