Viết chương trình nhập vào một ma trận số thực. Sau đó xóa dòng có tổng lớn nhất của ma trận đó.
Bài giải
-------------------- ######## --------------------
public static void main(String[] args) { int m, n; double tong = 0, max; int rowPosition = 0; // vị trí dòng Scanner scanner = new Scanner(System.in); System.out.println("Nhập vào số dòng của ma trận: "); m = scanner.nextInt(); System.out.println("Nhập vào số cột của ma trận: "); n = scanner.nextInt(); double A[][] = new double[m][n]; System.out.println("Nhập các phần tử cho ma trận: "); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { System.out.print("A[" + i + "]["+ j + "] = "); A[i][j] = scanner.nextDouble(); } } System.out.println("Ma trận A vừa nhập:"); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { System.out.print(A[i][j] + "\t"); } System.out.println("\n"); } // tìm tổng trên dòng đầu tiên (i = 0) của ma trận for (int j = 0; j < n; j++) { tong += A[0][j]; } max = tong; for (int i = 1; i < m; i++) { tong = 0; for (int j = 0; j < n; j++) { tong += A[i][j]; } // nếu giá trị của tổng các số ở các dòng sau // lớn hơn tổng các số ở dòng đầu tiên // thì gán max = tong if (tong > max) { max = tong; // lưu lại vị trí dòng có tổng lớn nhất rowPosition = i; } } for (int i = rowPosition; i < m; i++) { for (int j = 0; j < n; j++) { // đẩy phần tử ở dòng i + 1 lên // vị trí ở dòng i A[i][j] = A[i+1][j]; } m--; // giảm số dòng của ma trận đi 1 } System.out.println("Ma trận A sau khi xóa dòng có tổng lớn nhất:"); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { System.out.print(A[i][j] + "\t"); } System.out.println("\n"); } }
Giải thích hoạt động của chương trình trên: Giả sử tôi nhập vào ma trận số thực có 3 dòng và 2 cột như sau:
3.0 1.0
1.0 8.0
2.0 0.0
Bước 1: Tính tổng các phần tử ở dòng đầu tiên của ma trận (i = 0
) và gán vào biến tong, lúc này tong
sẽ bằng 4.0.
Bước 2: Gán giá trị biến max = tong = 4.0
.
Bước 3: Thiết lập giá trị biến tong = 0
và tính tổng của các phần tử ở dòng i = 1
trong ma trận, lúc này tong = 9.0
.
Bước 4: So sánh biến max
với biến tong
, vì max = 4.0 < tong = 9.0
nên sẽ thực hiện các lệnh bên trong if
: gán giá trị max = tong = 9.0
và lưu lại vị trí của dòng này rowPosition = 1
. Mục đích đoạn lệnh bên trong if là để tìm ra vị trí của dòng có tổng các phần tử là lớn nhất trong ma trận.
Bước 5: Tăng i
lên 1, lúc này i = 2
, thiết lập giá trị biến tong = 0
và thực hiện tính tổng của các phần tử ở dòng i = 2
trong ma trận. Đến đây chúng ta sẽ tính được giá trị tong = 3.0
.
Bước 6: So sánh biến max
với biến tong
, vì max = 9.0 > tong = 3.0
nên bỏ qua không thực hiện các lệnh bên trong if
.
Bước 7: Tăng i
lên 1, lúc này i = 3
không nhỏ hơn n
nên sẽ bỏ qua không thực hiện các lệnh trong thân vòng lặp for
.
Bước 8: Thực hiện vòng lặp for
với giá trị khởi tạo i = rowPosition = 1
và j = 0
(là dòng có tổng các phần tử lớn nhất). Sau đó, chúng ta sẽ tiến hành thay thế phần tử ở dòng i
bằng phần tử ở dòng i + 1
(tức là dòng kế tiếp). Kết quả sau khi thực hiện vòng lặp for
này là các phần tử ở dòng lớn nhất sẽ bị xóa và được thay thế bằng các phần tử ở dòng tiếp theo.
Bước 9: Hiển thị ma trận sau khi xóa dòng có tổng lớn nhất ra màn hình.
Kết quả sau khi biên dịch chương trình:
Nguồn: freetuts.net