Để tìm dòng có tổng lớn nhất của ma trận, 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 mảng 2 chiều c++. 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. Mô tả bài toán
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 và xuất mảng hai chiều
- Nhập mảng: Đầ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
- Xuất mảng: 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
- 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
- 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. Tìm kiếm phần tử x
- 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. Tìm dòng có tổng lớn nhất
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ếnmax_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ếnsum
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ủamax_sum
.- Nếu đúng, gán
max_sum
bằngsum
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.
- Nếu đúng, gán
- Đặ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ả chạy chương trình
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