Chương 8 ­ Arrays 1 • Giới thiệu • Khai báo • Cách sử dụng mảng • Các giải thuật cơ bản trên mảng • Các phương thức của mảng • Các đối tượng mảng trên C# Giới Thiệu 2 • Mảng là kiểu dữ liệu có cấu trúc bao gồm nhiều phần tử cùng kiểu và được đặt liên tiếp trong vùng nhớ. • Mỗi phần tử của mảng được tham chiếu thông qua chỉ mục (index). Nếu mảng có n phần tử thì phần tử đầu tiên có chỉ mục là 0 và phần tử cuối có chỉ mục là n­1. Cách tham chiếu một phần tử là tenmang[chỉ mục]. • Mảng có kích thước là số phần tử trong mảng. Giới Thiệu 3 (0) Janet Baker (1) George Lee (2) Sue Li (3) Samuel (4) Hoosier (5) Sandra Weeks (6) William Macy (7) Andy Harrison (8) Ken Ford (9) Denny Franks Shawn James Name of array (Note that all elements of this array have the same name, c) Position number (index or subscript) of the element within array c c[ 0 ] ­45 c[ 1 ] 6 c[ 2 ] 0 c[ 3 ] 72 c[ 4 ] 1543 c[ 5 ] ­89 c[ 6 ] 0 c[ 7 ] 62 c[ 8] ­3 c[ 9 ] 1 c[ 10 ] 6453 c[ 11 ] ­78 Fig. 7.1 A 12­element array. Khai báo và khởi tạo Mảng 4 • Khai báo [ ] ; Ex: int[ ] c; • Tạo mảng, gán giá trị cho biến mảng = new <[ARRAY_SIZE]>; Ex : c = new int[ 12 ]; int [ ] c = new int[ 12 ]; Ví dụ sử dụng mảng 5 void Main( string[] args ) { string output = ""; int[] x; x = new int[ 10 ]; int[] y = { 32, 27, 64, 18, 95, 14, 90, 70, 60, 37 }; const int ARRAY_SIZE = 10; int[] z; z = new int[ ARRAY_SIZE ]; for ( int i = 0; i < z.Length; i++ ) z[ i ] = 2 + 2 * i; for ( int i = 0; i < ARRAY_SIZE; i++ ) output += z[ i ] + "\t"; } Ví dụ sử dụng mảng 6 int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int total = 0; for ( int i = 0; i < a.Length; i++ ) total += a[ i ]; Truyền Mảng vào Hàm (Phương thức) 7 • Để truyền Mảng vào Hàm, ta chỉ định tên của mảng. • Có 2 cách truyền: – Truyền theo giá trị (Value) – Truyền theo địa chỉ (Reference) 8 Truyền Mảng vào Hàm (Phương thức) // method modifies the array it receives, // original will be modified public void ModifyArray( int[] b ) { for ( int j = 0; j < b.Length; j++ ) b[ j ] *= 2; } 9 Truyền Mảng vào Hàm (Phương thức) int[] a = { 1, 2, 3, 4, 5 }; outputLabel.Text = "Effects of passing entire array " + "call-by-reference:\n\nThe values of the original " + "array are:\n\t"; for ( int i = 0; i < a.Length; i++ ) outputLabel.Text += " " + a[ i ]; ModifyArray( a );// array is passed by reference ModifyElement( a[ 3 ] ); // array element passed call-by-value Truyền Mảng vào Hàm (Phương thức) 10 • Truyền theo giá trị – Tạo một bản sao của biến mảng – Bất kỳ thay đổi nào của biến mảng trong hàm cũng không ảnh hưởng đến giá trị của biến gốc. • Truyền theo địa chỉ – Tạo ra một bản sao tham khảo tới đối tượng. – Bất kỳ những thay đổi tới những tham khảo trong phương thức không làm ảnh hưởng đến biến gốc. – Bất kỳ những thay đổi nội dung của đối tượng trong phương thức làm ảnh hưởng đến đối tượng ngoài phương thức. Các giải thuật cơ bản trên mảng 11 • Các thao tác cơ bản trên mảng 1 chiều: • Nhập giá trị cho các phần tử mảng. • Xuất giá trị các phần tử mảng (ra màn hình). • Thêm 1 phần tử vào mảng. • Xóa một phần tử ra khỏi mảng. • Tìm kiếm trên mảng. • Sắp xếp mảng. Nhập xuất Array 12 Nhập, xuất thực chất là gán hoặc lấy giá trị của array tại vị trí nào đó. Thông thường nhập xuất mảng kết hợp vòng lặp. Ví dụ nhập mảng: int [] A= new int [50]; Random n = new Random(); int i=0; while (i < A.Length) { A[i] = n.Next(1, 91);// nhập cho item thứ i i++; } Nhập xuất Array 13 Ví dụ truy xuất Array: long t = 0; while (i < A.Length) { t += A[i]; i++; } Nhập xuất Array 14 Truy xuất các phần tử trong array dùng cấu trúc lặp for each rất hiệu quả. Cú pháp foreach ( type identifier in arrayName ) statement Nhập xuất Array 15 Truy xuất qua vị trí long tongmang(int[] A) { int i = 0, x; long t = 0; while (i < A.Length) { x = A[i]; t += x; i++; } return t; } Truy xuất qua foreach long tongmangForeach(int[] A) { long t = 0; foreach (int x in A) { t += x; } return t; } Sắp xếp Mảng ­ Sorting Arrays 16 • Sắp xếp các phần tử tăng dần private void sap_xep_tang_dan() { int i, j; for (i = 0; i < mang_nguyen.Length ­ 1; i++) { for (j = i + 1; j < mang_nguyen.Length; j++) { if (mang_nguyen[i] > mang_nguyen[j]) { // nếu gặp phần tử nhỏ hơn thì đổi chỗ int tam = mang_nguyen[i]; mang_nguyen[i] = mang_nguyen[j]; mang_nguyen[j] = tam; } //if } // for j } // for i } Sắp xếp Mảng ­ Sorting Arrays 17 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 18 // Fig. 7.10: BubbleSorter.cs // Sorting an array's values into ascending order. using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; public class BubbleSorter : System.Windows.Forms.Form { private System.Windows.Forms.Button sortButton; private System.Windows.Forms.Label outputLabel; // Visual Studio .NET generated code Declare and initialize array a staticrvoid Main() Output the contents of array a { Application.Run( new BubbleSorter() ); } Call method Bubble sort on array a private void sortButton_Click( object sender, System.EventArgs e ) { int[] a = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 }; outputLabel.Text += "Data items in original order\n"; for ( int i = 0; i < a.Length; i++ ) outputLabel.Text += " " + a[ i ]; // sort elements in array a BubbleSort( a ); 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 } 19 outputLabel.Text += "\n\nData items in ascending order\n"; for ( int i = 0; i < a.Length; i++ ) outputLabel.Text += " " + a[ i ]; } // end method sortButton_Click If an given element is bigger then the following element, // sort the elements of an array with bubble sort public void BubbleSort( int[] b ) { for ( int pass = 1; pass < b.Length; pass++ ) // passes for ( int i = 0; i < b.Length - 1; i++ ) // one pass if ( b[ i ] > b[ i + 1 ] ) // one comparison Swap( b, i ); // one swap } Perform contents of for loop // swap two elements of an array public void Swap( int[] c, int first ) { int hold; // temporary holding area for swap