Tuesday, July 7, 2015

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

Tiếp tục loạt bài hướng dẫn Java tutorial . Hôm nay mình sẽ giới thiệu cho các bạn về cách tạo mảng , sử dụng mảng và các giải thuật liên quan tới mảng.
Mảng là một tập hợp các phần tử có chung kiểu ,được biểu diễn thành một đối tượng tổ hợp . Mảng có thể là kiểu số , kiểu ký tự , kiểu đối tượng....
I . Cách khai báo mảng một chiều
Cú pháp :
dataType[] arrayRefVar; hoặc dataType arrayRefVar[];
Cách tạo một mảng một chiều mới .
dataType[] arrayRefVar = new dataType[arraySize];
Ví dụ :
double[] myList = new double[10];
Có nghĩa là khai báo một mảng có 10 phẩn tử kiểu dữ liệu của mỗi phần tử là double.
Như các bài hướng dẫn trước mình có nhắc tới bộ nhớ heap . Thì khi tạo mới một mảng thì sẽ tạo 1 ô nhớ trên bộ nhớ máy , lưu trữ đối tượng mảng , và bộ nhớ này tiếp tục lưu trữ địa chỉ của các phần tử của mảng , rồi reffer tới nó.
Chính vì tính khả chuyển và linh động thế này của mảng nên ta có thể gọi lấy giá trị của một phần tử bất kỳ của mảng .
Ví dụ mình muốn lấy phần tử thứ 9 trong mảng myList trên.
arrayRefVar[index];
double a = myList[9]
Hoặc gán 1 giá trị của phần tử này bằng phép thực hiện toán tử của các phần tử khác
myList[2] = myList[0] + myList[1];
Cách gán giá trị cho mảng:
dataType[] arrayRefVar = {value0, value1, ..., valuek};
ví dụ :
double[] myList = {1.9, 2.9, 3.4, 3.5}; hoặc
double[] myList = new double[4];
myList[0] = 1.9;
myList[1] = 2.9;
myList[2] = 3.4;
myList[3] = 3.5;
hoặc
double[] myList;
myList = {1.9, 2.9, 3.4, 3.5};
Khi muốn nhập hoặc in ra nhiều phần tử chúng ta có thể thực hiện các vòng lặp để gán giá trị . Như bài trước tôi đã hướng dẫn:
for(int i = 0; i < myList.length; i++) {
  myList[i] = Math.random() * 100;
}//nhập phần tử
/* thực hiện vào ra với mảng */
for(int i = 0; i < myList.length; i++) {
  System.out.print(myList[i] + " ");
}//in phần tử
vì vậy sử dụng mảng rất là tiện lợi ví dụ :
//Tính tổng tất cả các phần tử
double total = 0;
for (int i = 0; i < myList.length; i++) {
  total += myList[i];
}
//Tìm phần tử lớn nhất
double max = myList[0];
for (int i = 1; i < myList.length; i++) {
  if (myList[i] > max) max = myList[i];
}
// Tìm phần tử có chỉ số nhỏ nhất có giá trị lớn nhất
double max = myList[0];
int indexOfMax = 0;
for (int i = 1; i < myList.length; i++) {
  if (myList[i] > max) {
    max = myList[i];
    indexOfMax = i;
  }
}
II. Cơ chế copy Array
Khi ta thực hiện phép gán mảng có cùng số phần tử với nhau cho nhau . Nếu các bạn thực hiện gán nó như gán giá trị cho biến. Thì thực chất nó chỉ là thay đổi địa chỉ ô nhớ của mảng được gán bằng mảng bị gán . Cụ thể đó là:
Thực hiện phép gán 2 mảng : list2 = list1;
Vì vậy nên ta phải thực hiện copy từng phẩn tử trong mảng với nhau cụ thể.
int[] sourceArray = {2, 3, 1, 5, 10};
int[] targetArray = new int[sourceArray.length];
for (int i = 0; i < sourceArray.length; i++) {
  targetArray[i] = sourceArray[i];
}
III. Sử dụng array trong method.
public class Test {
  public static void main(String[] args) {
    int x = 1; // x represents an int value
    int[] y = new int[10]; // y represents an array of int values
    m(x, y); // Invoke m with arguments x and y
    System.out.println("x is " + x);
    System.out.println("y[0] is " + y[0]);
  }
  public static void m(int number, int[] numbers) {  
    number = 1001; // Assign a new value to number
    numbers[0] = 5555; // Assign a new value to numbers[0]
  }
}
Chúng ta thấy rằng method m được gọi thì x vẫn là 1, và y[0] = 5555. Bởi vì y tham chiếu tới cùng một mảng. Sau đó số y mới reffer tới giá trị của nó.
* Tương tự với trả về variable thì trả về mảng trong method cũng tương tự .
/** Count the occurrences of each letter */
   public static int[] countLetters(char[] chars) {
     // Declare and create an array of 26 int
     int[] counts = new int[26];
     // For each lowercase letter in the array, count it
     for (int i = 0; i < chars.length; i++) 
       counts[chars[i] - 'a']++;

     return counts;
   }
   /** Create an array of characters */
   public static char[] createArray() {
     // Declare an array of characters and create it
     char[] chars = new char[100];
     // Create lowercase letters randomly and assign
     // them to the array
     for (int i = 0; i < chars.length; i++) 
       chars[i] = RandomCharacter.getRandomLowerCaseLetter();
     // Return the array
     return chars;
} 
IV . Ví dụ cụ thể khi sử dụng array.
Ví dụ 1 :
Viết chương trình liệt kê tất cả các xâu nhị phân độ dài n.
public class Ex1_XauNhiPhan {
 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 void main(String[] args) {
  System.out.println("Nhap n");
  int n = nhap();
  int[] array = new int[n];
  int tich;
  do {
   tich = 1;
   // In ra mang va tinh tich cac phan tu trong mang
   System.out.println("");
   for (int j = 0; j < n; j++) {
    System.out.print(" " + array[j]);
    tich *= array[j];
   }
   int i = n - 1;
   do {
    if (array[i] == 0) {
     array[i] = 1;
     for (int j = n - 1; j > i; j--) {
      array[j] = 0;
     }
     break;
    } else
     i--;
   } while (i >= 0);
  } while (tich != 1);
 }
}
Ví dụ 2 :
Viết chương trình liệt kê tất cả các hoán vị của 1, 2, .., n
public class Ex2_LietKeHoanVi {
 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 void main(String[] args) {
  System.out.print("Nhap n");
  int n = nhap();
  int[] array = new int[n + 2];
  int i, j, k = n - 1, temp, check = 1;
  for (i = 0; i < n; i++) {
   array[i] = i + 1;
  }
  System.out.println("Cac hoan vi ke la: ");
  try {
  i = n - 2;
  while (check > 0) {
  // In ra hoan vi
  System.out.println("   ");
  for (j = 0; j < n; j++) {
   System.out.print(" " + array[j]);
  }
  for (i = n - 2; i >= 0; i--) {
  check = 1;
  if (array[i] < array[i + 1]) {
   if (i == n - 2) {
   temp = array[i];
   array[i] = array[n - 1];
   array[n - 1] = temp;
   break;
  } else {
 // Tim so a[k] nho nhat ma >a[i] trong cac so ben
 // phai a[i]
 k = i + 1;
 for (j = i + 1; j < n; j++) {
  if (array[i + 1] > array[j]
  && array[j] > array[i])
  k = j;
  }
 // Doi cho a[k] va a[i]
  temp = array[i];
  array[i] = array[k];
  array[k] = temp;
 // Sap xep lai tu a[i+1] toi a[n]
 for (j = i + 1; j < n; j++) {
  for (int m = i + 1; m < n; m++) {
  if (array[j] < array[m]) {
  temp = array[j];
  array[j] = array[m];
  array[m] = temp;
  }
 }
 }
 break;
 }
 } else {
  check = 0;
  // break;
 }
 }
 // if(i==0)check=0;
 }
} catch (Exception e) {
}
}
}
OK. Tạm thời mình tạm dừng tại đây .
Sau đây là bài tập để các bạn luyện tập thêm . Hãy tự giác luyện tập nhé.
Bài 1: Tính giá trị của đa thức  P(x)=anxn+ an-1xn-1+ ... + a1x+ a0 theo cách tính của Horner: P(x)=((((anx+ an-1)x+ an-2... + a1)x+ a0
Bài 2 :Viết chương trình nhập một số nguyên dương n và thực hiện các chức năng sau:
a)Tính tổng các chữ số của n.
b)Phân tích n thành các thừa số nguyên tố. 
Bài 3 :Nhập số liệu cho  dãy số thực  a0 , a1 ,..., an-1. Hãy liệt kê các phần tử  xuất hiện trong dãy đúng 2 lần
Source code : here
pass extract : https://coderandtutorial.blogspot.com

No comments:

Post a Comment