Tuesday, July 7, 2015

Bài 8 - Mảng( Array) (2)

Sau loạt bài trước mình đã hướng dẫn các bạn về mảng 2 chiều . Hôm nay mình sẽ hướng dẫn các bạn tiếp về cách sử dụng mảng 2 chiều và mảng nhiều chiều .
Mảng 2 chiều là mảng của mảng 1 chiều . Nghe có vẻ lủng củng , nhưng thực chất nó chính là như vậy.
I. Cú pháp
dataType[][] arrayRefVar;
hoặc :
dataType arrayRefVar[][];
ví dụ :
int[][] matrix;
or
int matrix[][];
Cách tạo một mảng mới nó như thế nào : matrix = new int[5][5];
Mảng vừa tạo có 25 phần tử.
Gán giá trị cho mảng 2 chiều cũng phức tạp hơn mảng 1 chiều . Cụ thể 
Đôi khi các bạn thường hay nhầm lẫn hay lúng túng mỗi khi nhập mảng . Thì thứ tự nó sẽ được thực hiện cụ thể như sau :
Ví dụ tôi nhập một mảng 2 chiều có 3 hàng và 4 cột :
Cứ nhập theo tuần tự Hàng hết xong tới cột
Ngoài ra chúng ta có thể khai báo mảng khuyết như sau :
Thực chất mảng khuyết trên nó là dạng này:
int[][] triangleArray = new int[5][];
triangleArray[0] = new int[5];
triangleArray[1] = new int[4];
triangleArray[2] = new int[3];
triangleArray[3] = new int[2];
triangleArray[4] = new int[1];
II. Một số cách sử dụng mảng 2 chiều
* khởi tạo mảng 2 chiều với n giá trị
for(int row = 0; row < matrix.length; row++) {
  for (int column = 0; column < matrix[row].length; column++) {
    matrix[row][column] = (int)(Math.random() * 100);
  }
}
* Cách hiển thị mảng 2 chiều
for (int row = 0; row < matrix.length; row++) {
  for (int column = 0; column < matrix[row].length; column++) {
    System.out.print(matrix[row][column] + " ");
  }

  System.out.println();
}
* Tổng các phần tử
int total = 0;
for (int row = 0; row < matrix.length; row++) {
  for (int column = 0; column < matrix[row].length; column++) {
    total += matrix[row][column];
  }
}
* Tổng các phần tử của cột
 for (int column = 0; column < matrix[0].length; column++) {
  int total = 0;
  for (int row = 0; row < matrix.length; row++)
    total += matrix[row][column];
  System.out.println("Sum for column " + column + " is " + total);
}
* Số lớn nhất của hàng
int maxRow = 0;
int indexOfMaxRow = 0;

// Get sum of the first row in maxRow
for (int column = 0; column < matrix[0].length; column++) {
  maxRow += matrix[0][column];
}

for (int row = 1; row < matrix.length; row++) {
  int totalOfThisRow = 0;
  for (int column = 0; column < matrix[row].length; column++) {
    totalOfThisRow += matrix[row][column];
    if (totalOfThisRow > maxRow) {
      maxRow = totalOfThisRow;
      indexOfMaxRow = row;
    }
  }
}

System.out.println("Row " + indexOfMaxRow 
   + " has the maximum sum" + " of " + maxRow); 
Chú ý : Đối với mảng 2 chiều thì như vậy . Tương tự với mảng 3 chiều , 4 chiều ,... n chiều cũng chỉ là dạng mảng của mảng của mảng mà thôi . Các bạn nắm chắc mảng 2 chiều thì có vạn chiều các bạn cũng hoàn toàn có thể làm được
Sau đây là các ví dụ cụ thể và hoàn chỉnh hơn về cách sử dụng mảng nhiều chiều .
III. Ví dụ vận dụng
Ví dụ  :
Viết chương trình nhập vào vào ma trận A có n dòng, m cột, các phần tử là những số nguyên lớn hơn 0 và nhỏ hơn 100 được nhập vào từ bàn phím. Thực hiện các chức năng sau:
a)Tìm phần tử lớn nhất của ma trận cùng chỉ số của số đó.
b)      Tìm và in ra các phần tử là số nguyên tố của ma trận (các phần tử không nguyên tố thì thay bằng số 0).
c)      Sắp xếp tất cả các cột của ma trận theo thứ tự tăng dần và in kết quả ra màn hình.
public class Ex1_UseArray2 {
 public static int nhap() {
  Scanner input = new Scanner(System.in);
  boolean check = false;
  int n = 0;
  while (!check) {
   System.out.print(" ");
   try {
    n = input.nextInt();
    check = true;
   } catch (Exception e) {
    System.out.println("Ban phai nhap so! hay nhap lai...");
    input.nextLine();
   }
  }
  return (n);
 }
 public static boolean checkSNT(int n) {
  if (n > 1) {
   for (int i = 2; i <= Math.sqrt(n); i++) {
    if (n % i == 0)
     return false;
   }
   return true;
  } else
   return false;
 }
 public static void inMT(int[][] A, int n, int m) {
  int i, j;
  for (i = 0; i < n; i++) {
   System.out.print("\n");
   for (j = 0; j < m; j++)
    System.out.print(" " + A[i][j]);
  }
 }
 public static int findMaxMT(int[][] A, int n, int m) {
  int Max = A[0][0];
  for (int i = 0; i < n; i++) {
   for (int j = 0; j < m; j++) {
    if (Max < A[i][j])
     Max = A[i][j];
   }
  }
  return (Max);
 }
 // Tim nhung phan tu la SNT
 public static void phanTuSNT(int[][] A, int n, int m) {
  int count = 0, i, j;
  System.out.println("\nCac phan tu la SNT (nhung phan tu ko la SNT =0): ");
  for (i = 0; i < n; i++) {
   System.out.print("\n");
   for (j = 0; j < m; j++) {
    if (checkSNT(A[i][j])) {
     count++;
     System.out.print(" " + A[i][j]);
    } else
     System.out.print(" " + 0);
   }
  }
  System.out.println("\n Co " + count + " phan tu la so nguyen to");
 }
 // Sap xep cac cot theo thu tang dan
 public static void sortColum(int[][] A, int n, int m) {
  int i, j, temp;
  for (j = 0; j < m; j++) {
   for (i = 1; i < n; i++) {
    if (A[i - 1][j] > A[i][j]) {
     temp = A[i - 1][j];
     A[i - 1][j] = A[i][j];
     A[i][j] = temp;
    }
   }
  }
  inMT(A, n, m);
 }
 public static void main(String[] args) {
  System.out.print("Nhap so hang n=");
  int n = nhap();
  System.out.print("Nhap so cot m=");
  int m = nhap();
  int[][] A = new int[n][m];
  int i, j;
  for (i = 0; i < n; i++) {
   for (j = 0; j < m; j++) {
   System.out.println("Nhap phan tu thu A[" + (i + 1) + "]["
      + (j + 1) + "]= ");
    A[i][j] = nhap();
   }
  }
  System.out.println("Ma tran nhap vao: ");
  inMT(A, n, m);
  for (i = 0; i < n; i++) {
   for (j = 0; j < m; j++) {
   if (A[i][j] == findMaxMT(A, n, m))
  System.out.println("\nPhan tu o hang " + i + " cot " + j
   + " dat Max: A[" + i + "][" + j + "]= " + A[i][j]);
   }
  }

  phanTuSNT(A, n, m);
  sortColum(A, n, m);
 }
}

Sau đây là bài tập để các bạn luyện tập . Hãy nhỡ luyện tập thường xuyên để có được kết quả ngọt ngào nhất nhé.
Bài 1 :Viết chương trình nhập vào vào ma trận A có n dòng, m cột, các phần tử là những số
nguyên lớn hơn 0 và nhỏ hơn 100 được nhập vào từ bàn phím. Thực hiện các chức
năng sau:
a)     Tìm phần tử lớn nhất của ma trận cùng chỉ số của số đó.
b)     Tìm và in ra các phần tử là số nguyên tố của ma trận
(các phần tử không nguyên tố thì thay bằng số 0).
c )Tìm hàng trong ma trận có nhiều số nguyên tố nhất
Bài 2 :Viết chương trình nhập các hệ số của đa thức P bậc n (0<n<20). Thực hiện các chức năng sau:
a)      Tính giá trị của đa thức P theo công thức Horner:
 P(x)=((((anx+ an-1)x+ an-2... + a1)x+ a0
b)      Tính đạo hàm của đa thức P. In ra các hệ số của đa thức kết quả.
c)      Nhập thêm đa thức Q bậc m. Tính tổng hai đa thức P và Q. 
Source code : here
pass extract : https://coderandtutorial.blogspot.com

No comments:

Post a Comment