[C++] Tìm dòng có tổng lớn nhất trong ma trận

Trong lập trình C++, khi muốn tìm dòng có tổng lớn nhất trong ma trận mảng hai chiều, chúng ta cần phải sử dụng một vòng lặp để duyệt qua từng hàng của mảng và tính tổng các phần tử trong hàng đó. Sau đó, chúng ta so sánh tổng đó với tổng các phần tử của các dòng khác và tìm ra dòng có tổng lớn nhất.

Bài trước: Bài 20: xoá phần tử trong mảng c++

1.Bài toán tìm hàng có tổng lớn nhất mảng 2 chiều

Bài 21 (TH-CSLT-02): Viết chương trình nhập vào mảng hai chiều các số thực. Áp dụng:
– In lại mảng 2 chiều các phần tử dưới dạng bảng
– In các phần tử tại hàng thứ k của mảng hai chiều (k>=0)
– Tính tổng các phần tử của cột thứ k của mảng hai chiều (k>=0)
– Thực hiện tìm kiếm phần tử có giá trị là x, cho biết vị trí tìm thấy đầu tiên của phần tử trong trường hợp tìm thấy
– Cho biết hàng nào có tổng các phần tử lớn nhất trong mảng hai chiều

2. Phân tích yêu cầu bài toán

2.1 Nhập/xuất mảng 2 chiều sử dung chương trình con c++

Đầu tiên chúng ta khai báo mảng 2 chiều a với n hàng và m cột. Sau đó chúng ta sử dụng 2 vòng for lồng nhau để nhập các phần tử của mảng.

Vòng lặp i đầu tiên chúng ta sẽ duyệt qua từng hàng của mảng. Vòng lặp thứ 2 j chúng ta sẽ duyệt qua từng cột của mảng 2 chiều

Cuối cùng chúng ta sử dụng 2 vòng for tương tự để in ra các phần tử của mảng 2 chiều

2.2 In các phần tử tại hàng thứ k của mảng hai chiều (k>=0)

Thực hiện duyệt theo cột của mảng và xuất ra a[k][j] với k nhập vào từ bàn phím là hàng cần in ra.

2.3 Tính tổng các phần tử của cột thứ k của mảng hai chiều (k>=0)

Khởi tạo biến tính tổng sum=0.

Duyệt lần lượt các phần tử theo hàng i và gán sum = sum + a[i][k] với k nhập vào từ bàn phím là côt cần tính tổng.

2.4 Thực hiện tìm kiếm phần tử có giá trị là x, cho biết vị trí tìm thấy đầu tiên của phần tử trong trường hợp tìm thấy

Khởi tạo biến hang=-1, cot=-1 để lưu vị trí tìm thấy x

Sử dụng 2 vòng for lồng nhau duyệt lần lượt các phần tử. Nếu tìm thấy x thì gán hàng vào biến hang, cột vào cot và thoát vòng lặp.

Ở vòng lặp duyệt hàng, nếu như hang>=0 thì thoát vòng lặp. Nghĩa là đã tìm thấy x, không cần duyệt nữa kết thúc vòng lặp luôn.

Nếu như hang>=0 thì in ra màn hình tìm thấy vị trí đầu tiên, ngược lại đưa ra thông báo không tìm thấy x

2.5 Cho biết hàng nào có tổng các phần tử lớn nhất trong mảng hai chiều

Mô tả thuật toán tìm dòng có tổng lớn nhất trong ma trận:

  • Khởi tạo biến max_sum và hang với giá trị ban đầu là 0. Biến max_sum sẽ lưu trữ tổng lớn nhất của một hàng, và biến hang sẽ lưu trữ chỉ số của hàng có tổng lớn nhất.
  • Khởi tạo biến sum với giá trị ban đầu là 0. Biến sum sẽ lưu trữ tổng các phần tử của mỗi hàng.
  • Sử dụng hai vòng lặp lồng nhau để duyệt qua từng phần tử của ma trận a có kích thước n hàng và m cột.
  • Trong vòng lặp, cộng giá trị của phần tử hiện tại vào biến sum.
  • Sau khi duyệt qua tất cả các phần tử trong hàng hiện tại, kiểm tra nếu tổng sum lớn hơn giá trị của max_sum.
    • Nếu đúng, gán max_sum bằng sum và gán giá trị của biến i (chỉ số của hàng hiện tại) cho biến hang.
    • Nếu sai, không thực hiện bất kỳ thay đổi nào và tiếp tục với hàng tiếp theo.
  • Đặt lại giá trị của sum về 0 để tính tổng của hàng tiếp theo.
  • Sau khi hoàn thành vòng lặp, in ra màn hình thông báo với hàng có tổng phần tử lớn nhất và giá trị tổng đó.

Code tìm hàng có tổng lớn nhất mảng 2 chiều:

//6. Cho biet hang co tong cac phan tu lon nhat trong mang 2 chieu
void hangcotonglonnhat(int n, int m, int a[][255]) {
  int max_sum = 0, hang;
  int sum = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      sum += a[i][j];
    }
    if (sum > max_sum) {
      hang = i;
      max_sum = sum;
    }
    sum = 0;
  }
  cout << "Hang co tong phan tu lon nhat la: " << hang << " voi tong = " << max_sum;
}

3. Code hoàn chỉnh

#include<iostream>
#include<iomanip>

using namespace std;

//1. Nhap mang

void nhapmang(int n, int m, int a[][255]){

    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cout<<"a["<<i<<"]["<<j<<"]= ";
            cin>>a[i][j];
        }
    }
}

//2. Xuat mang
void xuatmang(int n, int m, int a[][255]){
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cout<<setw(5)<<a[i][j];
        }

    cout<<endl;
    }
}

//3.In cac phan tu tai hang thu k cua mang 2 chieu

void inphantutaihangthuk(int n, int m, int a[][255]){

    int k;
    cout<<"Nhap hang can in k: "; cin>>k;

    for(int j=0;j<m;j++){
        cout<<setw(5)<<a[k][j];
    }
}

//4. Tinh tong cac phan tu cua cot thu k cua mang 2 chieu

void tinhtong(int n, int m, int a[][255]){
    int k, sum=0;

    cout<<"Nhap cot thu k: "; cin>>k;

    for(int i=0;i<n;i++){
        sum+= a[i][k];
    }

    cout<<"Tong cac phan tu cot thu "<<k<<" = "<<sum;
}

//5. Tim kiem phan tu x
void timkiemphantux(int n, int m, int a[][255]){

    int x, hang=-1, cot=-1;
    cout<<"Nhap phan tu x: "; cin>>x;

    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(a[i][j]==x){
                hang=i;
                cot=j;
                break;
            }
        }
        if(hang>=0){
            break;
        }
    }

    if(hang>=0){
        cout<<"Phan tu x co vi tri hang: "<<hang<<" cot: "<<cot;
    }else{
        cout<<"Khong tim thay phan tu x";
    }
}

//6. Cho biet hang co tong cac phan tu lon nhat trong mang 2 chieu

void hangcotonglonnhat(int n, int m, int a[][255]){
    int max_sum=0, hang;
    int sum=0;

    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            sum+=a[i][j];
        }

        if(sum>max_sum){
            hang=i;
            max_sum=sum;
        }
        sum=0;
    }

    cout<<"Hang co tong phan tu lon nhat la: "<<hang<<" voi tong = "<<max_sum;

}


int main(){

    int i, n, m, chon, x, a[255][255];
    cout<<"Nhap so hang n: "; cin>>n;
    cout<<"Nhap so cot m: "; cin>>m;

    do{
        cout<<"1. Nhap mang"<<endl;
        cout<<"2. Xuat mang"<<endl;
        cout<<"3. In ra cac phan tu tai hang thu k cua mang 2 chieu"<<endl;
        cout<<"4. Tinh tong cac phan tu cua cot thu k cua mang 2 chieu"<<endl;
        cout<<"5. Tim kiem phan tu co gia tri la x, cho biet vi tri xuat hien dau tien"<<endl;
        cout<<"6. Hang co tong phan tu lon nhat cua mang 2 chieu"<<endl;
        cout<<"Lua chon: "; cin>>chon;

        switch(chon){
            case 1:{
                nhapmang(n,m,a);
                cout<<endl;
                break;
            }
            case 2:{
                xuatmang(n,m,a);
                 cout<<endl;
                break;
            }
            case 3:{
                inphantutaihangthuk(n,m,a);
                 cout<<endl;
                break;
            }

            case 4:{
                tinhtong(n,m,a);
                 cout<<endl;
                break;
            }

            case 5:{
                timkiemphantux(n,m,a);
                 cout<<endl;
                break;
            }

            case 6:{
                hangcotonglonnhat(n,m,a);
                cout<<endl;
                break;
            }

            default: exit(0);
        }
    }while(chon!=0);

}

4. Kết quả

Bài 21

Trên đây là mô tả về thuật toán tìm hàng có tổng lớn nhất mảng 2 chiều c++.  Bằng cách duyệt qua từng hàng và tính tổng các phần tử trong hàng đó, thuật toán giữ một biến max_sum để lưu trữ giá trị tổng lớn nhất và biến hang để lưu trữ chỉ số của hàng tương ứng. Nếu tổng của một hàng vượt qua giá trị của max_sum, thuật toán cập nhật max_sum và hang.

Sau khi hoàn thành việc duyệt qua tất cả các hàng, thuật toán in ra thông báo cho biết hàng có tổng phần tử lớn nhất và giá trị tổng đó. Cảm ơn các bạn đã tham khảo trên ttnguyen.net.

Tải full bài tập thực hành C/C++ có lời giải

Bài tiếp theo: Bài 22: thuật toán cờ caro c++ mảng 2 chiều

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em