Kiểm tra các giá trị trong ma trận có tăng dần theo dòng và cột hay không C

Theo em, phát triển phần mềm có phải chỉ là việc viết các đoạn mã lệnh bằng một ngôn ngữ lập trình nào đó để máy tính có thể hiểu và giải quyết một bài toán trong thực tế?

Show

03/10/2022 |   1 Trả lời

  • Theo em, những kiến thức nào ở bậc học phổ thông có ích nhất nếu sau này em muốn làm việc trong lĩnh vực phát triển phần mềm?

    02/10/2022 |   1 Trả lời

  • Điều tra khảo sát thực hiện các công việc gì?

    02/10/2022 |   1 Trả lời

  • Phân tích hệ thống là thực hiện các công việc gì?

    03/10/2022 |   1 Trả lời

  • Dựa vào tài liệu phân tích, chuyên viên thiết kế sẽ đưa ra thiết kế tổng thể, thiết kế dữ liệu và thiết kế chức năng và có thể cả giao diện chi tiết là công việc của giai đoạn nào trong sản xuất phần mềm?

    02/10/2022 |   1 Trả lời

  • Mã ASCII của một kí tự là dãy gồm bao nhiêu bit?

    04/10/2022 |   1 Trả lời

  • Bảng mã ASCII mở rộng có thể biểu diễn bao nhiêu kí tự?

    03/10/2022 |   1 Trả lời

  • Dữ liệu văn bản trong máy tính là gì?

    03/10/2022 |   1 Trả lời

  • Trang văn bản có thể có nhiều chữ số. Em hãy cho biết các kí tự là chữ số thập phân “0”, “1”, ...., “9” được số hóa, chuyển thành dãy bit như thế nào?

    03/10/2022 |   1 Trả lời

  • Trong bảng mã ASCII ở hệ nhị phân biểu diễn 100 0010 là của kí tự nào?

    04/10/2022 |   1 Trả lời

  • Pixel là gì?

    03/10/2022 |   1 Trả lời

  • Trong hệ màu RGB giá trị cường độ của mỗi màu biến thiên ở khoảng nào?

    03/10/2022 |   1 Trả lời

  • Hệ màu RGB có số lượng màu là bao nhiêu?

    04/10/2022 |   1 Trả lời

  • Lượng từ hóa là gì?

    03/10/2022 |   1 Trả lời

  • Dữ liệu âm thanh số là gì?

    03/10/2022 |   1 Trả lời

  • Tại sao chúng ta không hiểu hệ nhị phân mà phải chuyển sang hệ thập phân?

    tại sao chúng ta ko hiểu hệ nhị phân mà phải chuyển sang hệ thập phân ?

    10/10/2022 |   0 Trả lời

  • Em hãy cho biết các kí tự là chữ số thập phân “0”, “1”, ...., “9” được số hóa, chuyển thành dãy bit như thế nào?

    21/10/2022 |   1 Trả lời

  • Trong bảng mã ASCII ở hệ nhị phân biểu diễn 100 0010 là của kí tự nào?

    21/10/2022 |   1 Trả lời

  • Con đường đi từ các kí tự cho đến mã nhị phân của nó được chia làm mấy bước?

    21/10/2022 |   1 Trả lời

  • Nêu chức năng của phần mềm GIMP?

    22/10/2022 |   1 Trả lời

  • Một ảnh mới được tạo với các thông số như sau:

    Một ảnh mới được tạo với các thông số như sau:

    Kiểm tra các giá trị trong ma trận có tăng dần theo dòng và cột hay không C

    Kích thước của ảnh là bao nhiêu?

    21/10/2022 |   1 Trả lời

  • Phần mềm thiết kế đồ họa là gì?

    21/10/2022 |   1 Trả lời

  • Màn hình làm việc của một phần mềm thiết kế đồ hoạ thường có các thành phần chính nào?

    22/10/2022 |   1 Trả lời

  • Trong giờ thực hành Tin, A phát hiện B đang sử dụng tài khoản facebook của một bạn khác để nhắn tin chọc phá các bạn trong lớp do quên thoát tài khoản ở tiết học trước. Nếu em là a em sẽ làm gì để phù hợp pháp luật và văn hoá ứng xử trên không gian mạng Để tiện cho việc đánh số và biểu diễn trên hình, thường người ta sẽ quy ước đánh số các hàng từ trên xuống dưới và các cột từ trái qua phải:Tuy nhiên, có một lưu ý nho nhỏ, đó là khi khai báo mảng hai chiều các bạn không nên khai báo bằng biến cục bộ. Lí do 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 không đáng có!2. Khởi tạo mảng hai chiều

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

    {Kiểu_phần_tử} {Tên_mảng}[{Số_hàng}][{Số_cột}] = 
    {
        {{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 tạo mảng hai chiều kích thước 3×43 \times 43×4 gồm 121212 số nguyên:

    int a[3][4] = 
    {
        {1, 2, 3, 4};
        {5, 6, 7, 8};
        {9, 10, 11, 12};
    };
    

    Ngoài cách khởi tạo mảng với số phần tử cố định, trên mảng hai chiều cũng có thể khởi tạo với các cách không khai báo số lượng hàng, cột hoặc không khởi tạo hết các phần tử giống như mảng một chiều. Bạn đọc có thể tự mình cài đặt các cách khởi tạo khác nhau để kiểm chứng. Trong C++ không chỉ có mảng hai chiều, mà còn có mảng nhiều chiều, nhưng sẽ khá khó tưởng tượng và cũng không thường xuyên sử dụng, vì vậy chúng ta không cần đề cập đến ở đây.

    3. Nhập xuất dữ liệu trên mảng hai 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 hai chiều kích thước M×NM\times NM×N và in ra toàn bộ mảng đó theo thứ tự hàng cột. Bạn đọc có thể áp dụng đúng phương pháp này cho việc nhập và truy xuất dữ liệu trên các 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 < M; ++i)
            for (int j = 0; j < N; ++j)
                cin >> a[i][j];
    
        cout << "Mảng đã nhập vào là: " << endl;
        for (int i = 0; i < M; ++i)
        {
            for (int j = 0; j < N; ++j)
                cout << a[i][j] << ' ';
    
            cout << endl;
        }
    }
    

    Giả sử nhập vào mảng kích thước 3×43 \times 43×4 với các giá trị từ 111 tới 12,12,12, chạy chương trình sẽ thu được kết quả sau:

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

    1. Tìm giá trị lớn nhất trong mảng hai 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ừ 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, j}ai,j.

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

    Input:

    • Dòng đầu tiên chứa hai 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)(1m,n1000).
    • mmm dòng tiếp theo, mỗi dòng chứa nnn số nguyên ai,ja_{i, j}ai,j thể hiện hàng thứ iii của mảng (ai,j≤109)(a_{i, j} \le 10^9)(ai,j109).

    Output:

    • In ra giá trị lớn nhất trong mảng AAA.

    Sample Input:

    4 5
    1 2 3 4 5
    -1 -2 0 3 5
    10 4 -5 -10 6
    4 4 4 4 4
    

    Sample Output:

    10
    

    Ý tưởng

    Sử dụng kĩ thuật đặt cờ, gán một biến res=a1,1res = a_{1, 1}res=a1,1 để coi như phần tử lớn nhất trong mảng là a1,1a_{1, 1}a1,1. Sau đó duyệt qua tất cả các giá trị trong 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 <= m; ++i)
            for (int j = 1; j <= n; ++j)
                cin >> a[i][j];
    
        int res = a[1][1];
        for (int i = 1; i <= m; ++i)
            for (int j = 1; j <= n; ++j)
                if (a[i][j] > res)
                    res = a[i][j];
    
        cout << res;
    }
    

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

    Đề 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ừ 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, j}ai,j.

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

    Input:

    • Dòng đầu tiên chứa hai 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)(1m,n1000).
    • mmm dòng tiếp theo, mỗi dòng chứa nnn số nguyên ai,ja_{i, j}ai,j thể hiện hàng thứ iii của mảng (ai,j≤109)(a_{i, j} \le 10^9)(ai,j109).

    Output:

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

    Sample Input:

    int a[10][12];
    
    0

    Sample Output:

    int a[10][12];
    
    1

    Ý 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 để lưu tổng các phần tử trong mảng, rồi duyệt qua toàn bộ các phần tử và tính tổng của chúng.

    Cài đặt

    int a[10][12];
    
    2

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

    Đề bài

    Cho mảng hai 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, j}ai,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)(1m1000).
    • mmm dòng tiếp theo, mỗi dòng chứa mmm số nguyên ai,ja_{i, j}ai,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)(1ai,j109).

    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:

    int a[10][12];
    
    3

    Sample Output:

    int a[10][12];
    
    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=mi+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

    #include 
    
    using namespace std;	
    	
    int main()
    {
        int M, N;	
        cin >> M >> N;
            
        for (int i = 0; i < M; ++i)
            for (int j = 0; j < N; ++j)
                cin >> a[i][j];
    
        cout << "Mảng đã nhập vào là: " << endl;
        for (int i = 0; i < M; ++i)
        {
            for (int j = 0; j < N; ++j)
                cout << a[i][j] << ' ';
    
            cout << endl;
        }
    }
    
    5 để tính tổng hai đường chéo.

    Cài đặt

    int a[10][12];
    
    5III. 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 có thể được truyền vào hàm giống như một tham số để tính toán. Có 333 cách để truyền mảng vào hàm: Sử dụng tham số mảng có kích cỡ, sử dụng tham số mảng không có kích cỡ và sử dụng con trỏ. Trong bài học này chúng ta sẽ tập trung vào hai cách đầu tiên, còn cách thứ ba với C++ là không cần thiết nên sẽ không đề cập ở đây.

    Cú pháp:

    • Truyền mảng có kích cỡ:

      int a[10][12];
      
      6

      Ví dụ:

      int a[10][12];
      
      7
    • Truyền mảng không kích cỡ:

      int a[10][12];
      
      8

      Ví dụ:

      int a[10][12];
      
      9

    Khác với việc truyền biến vào hàm, việc truyền mảng vào hàm không phân biệt ra tham trị hay tham chiếu. Khi truyền mảng, hệ thống luôn luôn truyền trực tiếp địa chỉ của phần tử đầu tiên của mảng ban đầu vào hàm, dẫn đến mọi thay đổi trên tham số đại diện trong hàm sẽ tác động đến mảng gốc bên ngoài, dù là theo cách nào trong số các cách trên. Vì vậy cần hết sức chú ý đến dữ liệu khi thực hiện truyền mảng vào hàm. Dưới đây là ví dụ cụ thể:

    a[3][4];
    
    0

    Khi biên dịch và chạy chương trình này, ta sẽ thu được kết quả:

    a[3][4];
    
    1

    Trong phần tham số của hàm

    #include 
    
    using namespace std;	
    	
    int main()
    {
        int M, N;	
        cin >> M >> N;
            
        for (int i = 0; i < M; ++i)
            for (int j = 0; j < N; ++j)
                cin >> a[i][j];
    
        cout << "Mảng đã nhập vào là: " << endl;
        for (int i = 0; i < M; ++i)
        {
            for (int j = 0; j < N; ++j)
                cout << a[i][j] << ' ';
    
            cout << endl;
        }
    }
    
    6, nếu ta thay
    #include 
    
    using namespace std;	
    	
    int main()
    {
        int M, N;	
        cin >> M >> N;
            
        for (int i = 0; i < M; ++i)
            for (int j = 0; j < N; ++j)
                cin >> a[i][j];
    
        cout << "Mảng đã nhập vào là: " << endl;
        for (int i = 0; i < M; ++i)
        {
            for (int j = 0; j < N; ++j)
                cout << a[i][j] << ' ';
    
            cout << endl;
        }
    }
    
    7 bằng
    #include 
    
    using namespace std;	
    	
    int main()
    {
        int M, N;	
        cin >> M >> N;
            
        for (int i = 0; i < M; ++i)
            for (int j = 0; j < N; ++j)
                cin >> a[i][j];
    
        cout << "Mảng đã nhập vào là: " << endl;
        for (int i = 0; i < M; ++i)
        {
            for (int j = 0; j < N; ++j)
                cout << a[i][j] << ' ';
    
            cout << endl;
        }
    }
    
    8 thì cũng vẫn trả ra kết quả tương tự, do hệ thống sẽ không tạo ra một bản sao của mảng 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 cho phép trả về trực tiếp một mảng như là kết quả của hàm. Để trả ra kết quả cho hàm là một mảng, cần phải sử dụng con trỏ, nhưng việc đó khá phức tạp. Để tránh việc phải trả ra kết quả là một mảng, ta nên khai báo các mảng là biến toàn cục hoặc sử dụng kiểu mảng động

    #include 
    
    using namespace std;	
    	
    int main()
    {
        int M, N;	
        cin >> M >> N;
            
        for (int i = 0; i < M; ++i)
            for (int j = 0; j < N; ++j)
                cin >> a[i][j];
    
        cout << "Mảng đã nhập vào là: " << endl;
        for (int i = 0; i < M; ++i)
        {
            for (int j = 0; j < N; ++j)
                cout << a[i][j] << ' ';
    
            cout << endl;
        }
    }
    
    9 (sẽ học ở bài số 888).

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

    Về bản chất, mảng hai chiều thực ra là một "mảng chứa các mảng", nghĩa là nó giống như một mảng một chiều nhưng mỗi phần tử lại là một mảng một chiều khác. Do đó, trên bộ nhớ, toàn bộ các phần tử của mảng hai chiều thực ra được viết liền kề 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 vì thế, khi truyền mảng hai chiều vào hàm thì thực chất chương trình vẫn sẽ truyền địa chỉ của phần tử đầu tiên trong mảng hai chiều vào hàm. Chẳng hạn, với một mảng hai chiều 3×33 \times 33×3 thì địa chỉ của các phần tử trên thanh RAM sẽ trông như thế này:

    Kiểm tra các giá trị trong ma trận có tăng dần theo dòng và cột hay không C

    Mảng hai chiều cũng có thể được truyền vào hàm như mảng một chiều, tuy nhiên có một số lưu ý khi khai báo tham số hình thức. Có ba cách để truyền mảng hai chiều vào hàm: