Java - Mảng

Viết chương trình cho phép o Nhập các phần tử mảng từ bàn phím. o In mảng o Sắp xếp mảng tăng dần. o Sắp xếp mảng giảm dần. o Cho biết vị trị và giá trị phần tử lớn nhất, nhỏ nhất trong mảng. o Cho biết mảng có bao nhiêu số nguyên tố, in ra danh sách các số nguyên tố. o Cho biết mảng có bao nhiêu số hoàn hảo, in ra danh sách các số hoàn hảo. o Cho phép thêm vào 1 phần tử ở đầu mảng, cuối mảng và ở vị tí bất kỳ (nhập từ bàn phím). o Cho phép xóa một phần tử ở đầu mảng, cuối mảng và xóa ở vị trí bất kỳ (nhập từ bàn phím)

pdf32 trang | Chia sẻ: nguyenlam99 | Lượt xem: 1041 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Java - Mảng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Mảng 7 20 5 9 3 0 1 2 3 4 a Tên mảng Giá trị Chỉ số phần tử mảng Trả lời câu hỏi 1. Mảng trên có mấy chiều? 2. Các phần tử của mảng có chung đặc điểm gì? a. Màu sắc b. Hình dạng c. Số nguyên 3. Trong java, mảng trên được khai báo như thế nào? 4. Cấu trúc lệnh nào thường dùng để duyệt mảng? a. IF b. For c. While 5. Tìm các số nguyên tố trong mảng trên? NỘI DUNG MẢNG oMảng một chiều o Sao chép mảng oMảng nhiều chiều o Tìm kiếm phần tử trong mảng một chiều o Sắp xếp các phần tử trong mảng một chiều Kiểu dữ liệu mảng Java có 2 kiểu dữ liệu cơ bản: o Kiểu dữ liệu cơ sở: có 8 kiểu o Kiểu dữ liệu tham chiếu (hay dẫn xuất): có 3 kiểu - Kiểu mảng - Kiểu lớp - Kiểu giao tiếp (interface). Kiểu dữ liệu mảng o Khái niệm: Mảng là tập hợp nhiều phần tử có cùng tên, cùng kiểu dữ liệu. Mỗi phần tử trong mảng được truy xuất thông qua chỉ số của nó trong mảng. o Khai báo: []; hoặc [] ; o VD: int[] iarray; hoặc int iarray[]; int[] arrInt3, arrInt4, arrInt5; Kiểu dữ liệu mảng Cấp phát bộ nhớ cho mảng: o Không giống C, C++ o Kích thước của mảng phải được xác định trước khi khai báo: o VD: int arrInt[100]; //sẽ báo lỗi o Dùng từ khóa new để cấp phát bộ nhớ cho mảng. o VD: int iarrInt = new int[100]; Kiểu dữ liệu mảng  Khởi tạo giá trị cho mảng o Có thể khởi tạo giá trị ban đầu cho các phần tử của mảng khi nó được khai báo. o VD: int[] arrInt = {1, 2, 3, 5, 6}; char[] arrChar = {‘a’, ‘b’, ‘c’}; String arrString[] = {“Nguyen Van A”, “Tran Van B”}; Chú ý: o Luôn khởi tạo hoặc cấp phát mảng trước khi sử dụng o Một số khai báo không hợp lệ: int[5] iarray; int iarray[5]; Truy cập mảng o Chỉ số mảng trong Java bắt đầu từ 0. Vì vậy phần tử đầu tiên có chỉ số là 0, phần tử thứ n có chỉ số là n - 1. o Các phần tử của mảng được truy xuất thông qua chỉ số của nó đặt giữa cặp dấu ngoặc vuông ([]). o VD: int arrInt[] = {1, 2, 3}; int x = arrInt[0]; // x sẽ có giá trị là 1. int y = arrInt[1]; // y sẽ có giá trị là 2. int z = arrInt[2]; // z sẽ có giá trị là 3. Chiều dài mảng – số phần tử mảng o Lấy số phần tử mảng ta dùng lệnh tenmang.length o VD: int a[]=new int[10]; int b[]={1,3,5}; Kết quả: a.length=10; b.length=3; Một số ví dụ về mảng //Nhập và xuất giá trị các phần tử của một mảng các số nguyên: public class ArrayDemo { public static void main(String[] args) { int arrInt[] = new int[10]; int i; for(i = 0; i < arrInt.length; i ++) arrInt[i] = i; for(i = 0; i < arrInt.length; i ++) System.out.println("This is arrInt[" + i +"]: " + arrInt[i]); } } Một số ví dụ về mảng //Tìm phần tử có giá trị nhỏ nhất (Min) và lớn nhất (Max) trong một mảng. public class TimMaxMin { public static void main(String[] args) { int nums[] = { 99, -10, 100123, 18, -978, 5623, 463, -9, 287, 49 }; int min, max; min = max = nums[0]; for(int i=1; i < 10; i++){ if(nums[i] < min) min = nums[i]; if(nums[i] > max) max = nums[i]; } System.out.println("Min and max: " + min + " " + max); } } Một số ví dụ về mảng import java.util.Scanner; public class BTMang { public static void main(String[] args) { Scanner input =new Scanner(System.in); int [] a = new int[5]; int i, j, tg; //nhap mang System.out.println("Nhap vao cac phan tu cua mang"); for(i=0;i< a.length;i++){ System.out.print("a"+"["+i+"]"+"=" ); a[i]=input.nextInt(); } //in mang System.out.println("Mang vua nhap:"); for(i=0;i<a.length;i++){ System.out.print(a[i] + " "); } System.out.println(""); //sap xep mang System.out.println("Sap xep cac phan tu cua mang theo chieu tang dan:"); for(i=0;i<a.length;i++){ for(j=i+1;j<a.length;j++){ if(a[i]>a[j]){ tg=a[i]; a[i]=a[j]; a[j]=tg; } } System.out.print(a[i] + " "); } } } Một số ví dụ về mảng import java.util.Scanner; public class BTMang2 { public static void Nhap(int[] a){ Scanner input =new Scanner(System.in); System.out.println("Nhap vao cac phan tu cua mang"); for(int i=0;i< a.length;i++){ System.out.print("a"+"["+i+"]"+"=" ); a[i]=input.nextInt(); } } public static void In(int[] a){ System.out.println("Mang vua nhap:"); for(int i=0;i<a.length;i++){ System.out.print(a[i] + " "); } System.out.println(""); } public static void Sapxep(int[] a){ int i, j, tg; System.out.println("Sap xep cac phan tu cua mang theo chieu tang dan:"); for(i=0;i<a.length;i++){ for(j=i+1;j<a.length;j++){ if(a[i]>a[j]){ tg=a[i]; a[i]=a[j]; a[j]=tg; } } System.out.print(a[i] + " "); } } public static void main(String[] args) { } Một số ví dụ về mảng public static void main(String[] args) { int [] a = new int[5]; BTMang2 m2 = new BTMang2(); m2.Nhap(a); //in mang m2.In(a); m2.Sapxep(a); } } • 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]; Sử dụng một vòng lặp: • targetArray = sourceArray; Dùng lệnh gán: Gán tham chiếu của sourceArray cho targerArray • System.arraycopy(srcArray, src_pos, tarArray, tar_pos, length); Dùng tiện ích arraycopy Sao chép mảng import java.util.*; public class randomfile { public static void main(String[] args) { int[] s = {1,3,5,7,9,11,13,15}; int[] d = {2,4,6,8,10,12,14}; System.out.println(" mang d ban dau "); for(int i =0; i< d.length; i++){ System.out.print(" "+d[i]); } System.out.print("\n"); System.arraycopy(s,3,d,2,4); System.out.println(" mang d sau"); for(int i =0; i< d.length; i++){ System.out.print(" "+d[i]); } } } copy 4 phần tử của mảng s, bắt đầu tại vị trí thứ 3 là 7,9,11,13 rồi chép sang mảng d, bắt đầu tại vị trí thứ 2 -> kết quả mảng d: phần tử 6,8,10,12 được thay bằng 7,9,11,13 Sao chép mảng Mảng nhiều chiều o Khai báo n chiều trong java [][]...[] ; hoặc [][]..[] o Ví dụ khai báo mảng 2 chiều int a[][]; int[][] a; Mảng nhiều chiều o Khai báo 1 mảng kèm theo cấp phát bộ nhớ cho mảng n chiều [][]...[] = new <Kiểu dữ liệu>[Số phần từ 1][Số phần tử 2].....[Số phần tử n] o Ví dụ khai bào mảng 2 chiều (ma trận 2 hàng 3 cột) int a[][]=new int[2][3]; Mảng nhiều chiều o Truy xuất đến phần tử của mảng nhiều chiều A ta dùng cú pháp A[n-1][m-1]...[k-1]; o Ví dụ truy xuất mảng 2 chiều int a[][]={ {3,4}, {2,8}, }; o Lúc đó: a[0][0]=3; a[0][1]=4; a[1][0]=2; a[1][1]=8; • Lấy số dòng của mảng: ArrayName.length • Lấy số phần tử của dòng i: ArrayName[i].length • Ví dụ: Cho mảng sau: int[][] array = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}}; – Khi đó: array.length cho kết quả là 4. array[0].length cho kết quả là 3 Độ dài mảng nhiều chiều Một số ví dụ về mảng // Nhập và xuất giá trị của các phần tử trong một mảng hai chiều public class TwoD_Arr { public static void main(String[] args) { int t, i; int mang[][] = new int[3][4]; for(t=0; t < 3; ++t){ for(i=0; i < 4; ++i){ mang[t][i] = (t*4)+i+1; System.out.print(mang[t][i] + “ “); } System.out.println(); } } } Lớp java.util.Arrays • Cung cấp một số phương thức xử lý các mảng: – public static int binarySearch(double[ ] a, double x ) – public static boolean equals( double[ ] a, double[] b) – public static void fill( double[ ] a, double x) – public static void fill( double[ ] a, int lo, int hi, double x) – public static void sort( double[ ] a ) • Mỗi phương thức trên có cách thực hiện khác nhau cho các kiểu dữ liệu cơ sở (byte, short, int, long, float, double, char và boolean) và kiểu đối tượng. Tìm kiếm trong mảng • Tìm kiếm là quá trình tìm một phần tử xác định trong mảng. – Ví dụ: Tìm một sinh viên trong danh sách SV. • Tìm kiếm là một thao tác cơ bản trong lập trình. • Có nhiều giải thuật và cấu trúc dữ liệu để tìm kiếm. Hai giải thuật cơ bản là: tìm kiếm tuyến tính (linear search) và tìm kiếm nhị phân (binary search). Tìm kiếm tuyến tính • Phương pháp tìm kiếm tuyến tính so sánh phần tử khóa key với mỗi phần tử trong mảng. • Việc tìm kiếm sẽ kết thúc khi tìm thấy một phần tử mảng bằng key hoặc khi duyệt hết mảng mà không tìm thấy. • Ví dụ minh họa: Tạo một mảng 2 chiều (7 x 9) có các phần tử là các số nguyên ngẫu nhiên nằm trong [0- 1000) rồi hiển thị ra màn hình. Nhập số n từ bàn phím. Tìm kiếm và trả về số lần xuất hiện của tất cả các phần tử có giá trị bằng số vừa nhập vào. Nếu không tìm thấy thì in ra chuỗi “Khong tim thay!”. Tìm kiếm nhị phân • Để thực hiện được tìm kiếm nhị phân, các phần tử mảng phải được sắp xếp theo thứ tự tăng/giảm dần. Giả sử mảng được sắp xếp tăng dần: 2 4 7 10 11 45 50 59 60 66 69 70 79 Tìm kiếm nhị phân • Trước tiên so sánh giá trị cần tìm (key) với phần tử nằm giữa mảng. Có thể xảy ra 3 trường hợp sau: – Nếu key bằng phần tử giữa ⇒ kết thúc vì tìm thấy. – Nếu key nhỏ hơn phần tử giữa, lặp lại việc tìm key trong nửa đầu của mảng theo phương pháp nhị phân. – Nếu key lớn hơn phần tử giữa, lặp lại việc tìm key trong nửa cuối của mảng theo phương pháp nhị phân. Tìm kiếm nhị phân Tìm kiếm nhị phân • Viết chương trình tạo và nhập dữ liệu cho mảng 1 chiều có 10 phần tử kiểu int có giá trị tăng dần rồi in ra màn hình. Nhận một số từ bàn phím, tìm kiếm nhị phân rồi trả về vị trí của phần tử tìm được. Nếu không tìm thấy thì in ra chuỗi “Không tìm thấy!”. Sắp xếp mảng • Hoán đổi vị trí các phần tử trong mảng để có được một mảng trong đó các phần tử có thứ tự tăng/giảm dần • Có nhiều thuật toán có thể được dùng để sắp xếp: – Chọn (selection sort): Tìm phần tử lớn trong mảng rồi đổi chỗ với phần tử cuối cùng của mảng – Nổi bọt (bubble sort): So sánh một phần tử với phần tử kế nó, nếu lớn hơn thì đổi chỗ – Trộn (Merge sort), Sắp xếp chọn Mảng chưa sắp xếp: int[] myList = {2, 9, 5, 4, 8, 1, 6}; 2, 9, 5, 4, 8, 1, 6 => 2, 6, 5, 4, 8, 1, 9 (Số PT = 7) 2, 6, 5, 4, 8, 1 => 2, 6, 5, 4, 1, 8 (Số PT = 6) 2, 6, 5, 4, 1 => 2, 1, 5, 4, 6 (Số PT = 5) 2, 1, 5, 4 => 2, 1, 4, 5 (Số PT = 4) 2, 1, 4 => 2, 1, 4, (Số PT = 3) 2, 1 => 1, 2 Kết quả: 1, 2, 4, 5, 6, 8, 9 Sắp xếp nổi bọt Dãy chưa sắp xếp: int[] myList = {2, 9, 5, 4, 8, 1, 6}; Lần 1: 2, 5, 4, 8, 1, 6, 9 Lần 2: 2, 4, 5, 1, 6, 8, 9 Lần 3: 2, 4, 1, 5, 6, 8, 9 Lần 4: 2, 1, 4, 5, 6, 8, 9 Lần 5: 1, 2, 4, 5, 6, 8, 9 Lần 6: 1, 2, 4, 5, 6, 8, 9 Viết chương trình cho phép o Nhập các phần tử mảng từ bàn phím. o In mảng o Sắp xếp mảng tăng dần. o Sắp xếp mảng giảm dần. o Cho biết vị trị và giá trị phần tử lớn nhất, nhỏ nhất trong mảng. o Cho biết mảng có bao nhiêu số nguyên tố, in ra danh sách các số nguyên tố. o Cho biết mảng có bao nhiêu số hoàn hảo, in ra danh sách các số hoàn hảo. o Cho phép thêm vào 1 phần tử ở đầu mảng, cuối mảng và ở vị tí bất kỳ (nhập từ bàn phím). o Cho phép xóa một phần tử ở đầu mảng, cuối mảng và xóa ở vị trí bất kỳ (nhập từ bàn phím). Một số ví dụ về mảng

Các file đính kèm theo tài liệu này:

  • pdfjava_chuong_5_mang_4198.pdf
Tài liệu liên quan