Truyền mảng 2 chiều vào hàm

     
I. Mảng nhì chiều trong C++

1. Khai báo và truy xuất

Ngoài kiểu tài liệu mảng một chiều, C++ cung cấp kiểu tài liệu mảng từ hai chiều tới các chiều. Mảng hai phía là ví dụ vô cùng trực quan và dễ tưởng tượng, ta hoàn toàn có thể xem nó như 1 bảng hình chữ nhật gồm gồm MMM hàng cùng NNN cột. Cú pháp khai báo rất đơn giản:

Kiểu_phần_tử Tên_mảng;Khi đó, tổng số bộ phận của mảng vẫn là Số_hàng × imes× Số_cột. Chẳng hạn, khai báo một mảng nhị chiều có 101010 hàng và 121212 cột đựng toàn số nguyên, ta viết như sau:

int a<10><12>;Các hàng và cột của mảng hai chiều đều sẽ tiến hành đánh số trường đoản cú 000. Phương pháp truy cập bộ phận tương từ như ngơi nghỉ mảng một chiều, chỉ cần dùng toán tử <> ngơi nghỉ từng chiều để đưa ra một trong những phần tử như thế nào đó. Ví dụ, mong muốn truy cập phần tử ở mặt hàng 3,3,3, cột 4,4,4, ta chỉ cần viết:

a<3><4>;Để một thể cho bài toán đánh số và màn trình diễn trên hình, thường fan ta đang quy ước đánh số những hàng từ trên xuống bên dưới và các cột trường đoản cú trái qua phải:

*

Tuy nhiên, có một giữ ý nho nhỏ, đó là khi khai báo mảng nhì chiều các bạn không nên khai báo bằng biến cục bộ. Lí vì chưng là vì, khi khai báo biến cục bộ thì bộ nhớ cấp phát cho biến sẽ lưu trong stack của máy tính, và đối với một số trình biên dịch có thể gây ra lỗi ko đáng có!

2. Khởi sinh sản mảng nhì chiều

Giống như mảng một chiều, mảng hai phía cũng rất có thể khởi tạo trước giá chỉ trị. Cú pháp như sau:

Kiểu_phần_tử Tên_mảng = Danh_sách_phần_tử_của_hàng_0; Danh_sách_phần_tử_của_hàng_1; ... Danh_sách_phần_tử_của_hàng_cuối;;Ví dụ: Khởi chế tác mảng nhì chiều size 3×43 imes 43×4 bao gồm 121212 số nguyên:

int a<3><4> = 1, 2, 3, 4; 5, 6, 7, 8; 9, 10, 11, 12;;Ngoài giải pháp khởi chế tác mảng với số phần tử cố định, bên trên mảng hai phía cũng hoàn toàn có thể khởi chế tạo với những cách không khai báo số lượng hàng, cột hoặc không khởi sản xuất hết các phần tử giống như mảng một chiều. Các bạn đọc rất có thể tự mình cài đặt các cách khởi tạo khác biệt để kiểm chứng. Trong C++ không chỉ có mảng hai chiều, mà còn tồn tại mảng nhiều chiều, nhưng sẽ khá khó tưởng tượng cùng cũng không thường xuyên sử dụng, bởi vì vậy chúng ta không bắt buộc đề cập đến ở đây.

Bạn đang xem: Truyền mảng 2 chiều vào hàm

3. Nhập xuất tài liệu trên mảng nhì chiều

Ví dụ dưới đây sẽ minh hoạt một chương trình yêu cầu nhập vào một mảng nhị chiều size M×NM imes NM×N với in ra cục bộ mảng đó theo vật dụng tự mặt hàng cột. Bạn đọc rất có thể áp dụng đúng cách thức này cho câu hỏi nhập cùng truy xuất dữ liệu trên những mảng 333 chiều, 444 chiều,...:

#include using namespace std;int main(){ int M, N; cin >> M >> N; for (int i = 0; i > a; cout giả sử nhập vào mảng form size 3×43 imes 43×4 với các giá trị từ 111 cho tới 12,12,12, chạy lịch trình sẽ thu được kết quả sau:

Mảng đã nhập vào là:1 2 3 45 6 7 89 10 11 12II. Một vài bài toán với mảng nhì chiều

1. Tìm giá trị lớn nhất vào mảng nhì chiều

Đề bài

Cho mảng hai chiều AAA gồm mmm hàng nnn cột, các hàng được đánh số từ 111 tới mmm từ bên trên xuống dưới, các cột được đánh số từ 111 tới nnn từ trái qua phải. Ô nằm bên trên giao của hàng i,i,i, cột jjj gọi là ô (i,j)(i, j)(i,j) và có chứa số nguyên ai,ja_i, jai,j​.

Hãy xác định giá trị lớn nhất vào mảng A?A?A?

Input:

Dòng đầu tiên chứa nhị số nguyên dương m,nm, nm,n - kích thước mảng hai chiều (1≤m,n≤1000)(1 le m, n le 1000)(1≤m,n≤1000).mmm dòng tiếp theo, mỗi dòng chứa nnn số nguyên ai,ja_i, jai,j​ thể hiện hàng thứ iii của mảng (ai,j≤109)(a_i, j le 10^9)(ai,j​≤109).

Output:

In ra giá trị lớn nhất vào mảng AAA.

Sample Input:

4 51 2 3 4 5-1 -2 0 3 510 4 -5 -10 64 4 4 4 4Sample Output:

10

Ý tưởng

Sử dụng kĩ thuật đặt cờ, gán một biến res=a1,1res = a_1, 1res=a1,1​ để coi như phần tử lớn nhất trong mảng là a1,1a_1, 1a1,1​. Sau đó duyệt qua tất cả các giá trị vào bảng, nếu phần tử nào lớn hơn resresres thì cập nhật lại resresres bằng phần tử đó.

Kết quả cuối cùng chính là resresres.

Cài đặt

#include using namespace std;int a<1001><1001>;main(){ int m, n; cin >> m >> n; for (int i = 1; i > a; int res = a<1><1>; for (int i = 1; i res) res = a; cout

2. Tính tổng các phần tử vào mảng

Đề bài

Cho mảng nhì chiều AAA gồm mmm hàng nnn cột, các hàng được đánh số từ 111 tới mmm từ trên xuống dưới, các cột được đánh số từ 111 tới nnn từ trái qua phải. Ô nằm trên giao của hàng i,i,i, cột jjj gọi là ô (i,j)(i, j)(i,j) và có chứa số nguyên ai,ja_i, jai,j​.

Hãy tính tổng các phần tử trong mảng?

Input:

Dòng đầu tiên chứa nhị số nguyên dương m,nm, nm,n - kích thước mảng nhị chiều (1≤m,n≤1000)(1 le m, n le 1000)(1≤m,n≤1000).mmm dòng tiếp theo, mỗi dòng chứa nnn số nguyên ai,ja_i, jai,j​ thể hiện hàng thứ iii của mảng (ai,j≤109)(a_i, j le 10^9)(ai,j​≤109).

Output:

Số nguyên duy nhất là tổng các phần tử trong mảng.

Sample Input:

3 31 2 34 5 67 8 9Sample Output:

45

Ý tưởng

Giống như mảng một chiều, chúng ta chỉ cần sử dụng một biến sumsumsum để giữ tổng các phần tử vào mảng, rồi duyệt qua toàn bộ các phần tử và tính tổng của chúng.

Xem thêm: Phương Thức Thanh Toán Của Bạn Bị Từ Chối. Vui Lòng Nhập Phương Thức Thanh Toán Khác

Cài đặt

#include using namespace std;int a<1001><1001>;main() int m, n; cin >> m >> n; int sum = 0; for (int i = 1; i > a; sum += a; cout

3. Tổng đường chéo

Đề bài

Cho mảng nhì chiều dạng vuông AAA gồm mmm hàng mmm cột, các hàng được đánh số từ 111 tới mmm từ trên xuống dưới, các cột được đánh số từ 111 tới nnn từ trái qua phải. Ô nằm trên giao của hàng i,i,i, cột jjj gọi là ô (i,j)(i, j)(i,j) và có chứa số nguyên ai,ja_i, jai,j​.

Đường chéo chính của ma trận là đường chéo nối ô (1,1)(1, 1)(1,1) với ô (m,m)(m, m)(m,m). Đường chéo phụ của ma trận là đường chéo nối ô (1,m)(1, m)(1,m) với ô (m,1)(m, 1)(m,1).

Hãy tính tổng các số trên đường chéo chính và đường chéo phụ của ma trận vuông?

Input:

Dòng đầu tiên chứa số nguyên dương mmm - kích thước ma trận vuông (1≤m≤1000)(1 le m le 1000)(1≤m≤1000).mmm dòng tiếp theo, mỗi dòng chứa mmm số nguyên ai,ja_i, jai,j​ phân tách nhau bởi dấu cách, mô tả ma trận (1≤ai,j≤109)(1 le a_i, j le 10^9)(1≤ai,j​≤109).

Output:

Hai số nguyên lần lượt là tổng đường chéo chính và tổng đường chéo phụ của ma trận.

Sample Input:

31 2 13 1 82 5 4Sample Output:

6 4

Ý tưởng

Một ô (i,j)(i, j)(i,j) sẽ thuộc đường chéo chính của ma trận nếu như i=ji = ji=j. Còn nếu như i=m−i+1,i = m - i + 1,i=m−i+1, thì ô đó sẽ thuộc đường chéo phụ của ma trận.

Ta duyệt qua các phần tử của ma trận và kết hợp câu lệnh if để tính tổng nhị đường chéo.

Cài đặt

#include using namespace std;int a<1001><1001>;int main(){ int m; cin >> m; for (int i = 1; i > a; long long main_diagonal = 0, secondary_diagonal = 0; for (int i = 1; i III. Truyền mảng vào hàm như một tham số

1. Truyền mảng một chiều

Mảng cũng rất có thể được truyền vào hàm giống như một tham số nhằm tính toán. Có 333 cách để truyền mảng vào hàm: Sử dụng thông số mảng có kích cỡ, sử dụng tham số mảng không tồn tại kích cỡsử dụng nhỏ trỏ. Trong bài học này chúng ta sẽ triệu tập vào hai phương pháp đầu tiên, còn giải pháp thứ bố với C++ là không quan trọng nên sẽ không đề cập sống đây.

Cú pháp:

Truyền mảng bao gồm kích cỡ:

Kiểu_trả_về Tên_hàm(Kiểu_phần_tử Tên_mảng)Ví dụ:

int function1(int a<10>) Thân_hàm;Truyền mảng không kích cỡ:

Kiểu_trả_về Tên_hàm(Kiểu_phần_tử Tên_mảng<>)Ví dụ:

int function2(int a<>) Thân_hàm;Khác với việc truyền trở thành vào hàm, câu hỏi truyền mảng vào hàm không biệt lập ra tham trị tốt tham chiếu. Khi truyền mảng, khối hệ thống luôn luôn luôn truyền thẳng địa chỉ của phần tử đầu tiên của mảng ban sơ vào hàm, dẫn mang lại mọi đổi khác trên tham số thay mặt đại diện trong hàm sẽ ảnh hưởng đến mảng gốc mặt ngoài, dù cho là theo phương pháp nào trong số các giải pháp trên. Vì chưng vậy đề xuất hết sức để ý đến dữ liệu khi thực hiện truyền mảng vào hàm. Dưới đó là ví dụ nuốm thể:

#include using namespace std;void increase(int b<>){ for (int i = 0; i khi biên dịch với chạy công tác này, ta sẽ thu được kết quả:

Mảng sau khi tăng lên: 2 3 4 5 6Trong phần tham số của hàm void increase(int b<>), ví như ta nỗ lực int b<> bởi int b<5> thì cũng vẫn trả ra hiệu quả tương tự, do hệ thống sẽ không tạo thành một phiên bản sao của mảng cơ mà lấy trực tiếp địa chỉ của mảng gốc rồi truyền vào hàm.

Một lưu ý khác là C++ không được cho phép trả về trực tiếp một mảng như là tác dụng của hàm. Để trả ra công dụng cho hàm là 1 trong mảng, cần phải sử dụng con trỏ, nhưng việc đó khá phức tạp. Để tránh câu hỏi phải trả ra kết quả là một mảng, ta buộc phải khai báo các mảng là biến toàn cục hoặc sử dụng kiểu mảng cồn (sẽ học tập ở bài bác số 888).

Xem thêm: Cách Tạo Chatbot Chat Với Người Lạ, Ẩn Danh Trên Chatible Messenger

2. Truyền mảng hai chiều

Về bản chất, mảng nhì chiều thực tế là một "mảng chứa các mảng", tức thị nó y như một mảng một chiều dẫu vậy mỗi bộ phận lại là 1 trong mảng một chiều khác. Vày đó, trên cỗ nhớ, toàn bộ các bộ phận của mảng nhì chiều thực chất được viết giáp với nhau, chứ không phải tạo thành một bảng số như chúng ta vẫn tưởng tượng.Chính do thế, khi truyền mảng hai chiều vào hàm thì thực tế chương trình vẫn đang truyền showroom của phần tử đầu tiên vào mảng hai chiều vào hàm. Chẳng hạn, với một mảng hai chiều 3×33 imes 33×3 thì địa chỉ cửa hàng của các bộ phận trên thanh RAM đang trông như vậy này:

*

Mảng hai chiều cũng hoàn toàn có thể được truyền vào hàm như mảng một chiều, tuy nhiên có một số chú ý khi khai báo thông số hình thức. Bao gồm ba phương pháp để truyền mảng hai phía vào hàm:

Cách 111: Khai báo cụ thể số hàng, số cột:

Kiểu_trả_về Tên_hàm(Kiểu_phần_tử Tên_mảng)Cách 222: Khai báo cụ thể số cột, số hàng bỏ trống:

Kiểu_trả_về Tên_hàm(Kiểu_phần_tử Tên_mảng<>)Cách 333: Sử dụng từ khóa typedef để định nghĩa trước kiểu mảng:

typedef Kiểu_dữ_liệu Tên_thay_thế;// khi truyền vào hàm.Kiểu_trả_về Tên_hàm(Tên_thay_thế Tên_mảng);Ví dụ, ví như truyền mảng 3×33 imes 33×3 vào hàm void function() thì ta hoàn toàn có thể khai báo tham số vẻ ngoài theo các giải pháp sau đông đảo được:

typedef int arr<100><100>;void function(int a<3><3>); // phương pháp 1.void function(int a<><3>); // biện pháp 2.void function(arr a); // Cách 3.Thông thường, giải pháp thứ 222 và 333 sẽ tiến hành ưu tiên sử dụng hơn. Xem xét nhỏ, nếu các bạn truyền mảng từ hai phía trở lên thì chỉ tất cả chiều trước tiên được phép để trống kích thước, còn các chiều kế tiếp đều phải khẳng định kích thước. Ví dụ, cách khai báo thông số int a<><> đã là chưa phù hợp lệ với bị báo lỗi lúc biên dịch.