Mục lục bài viết
Nội dung
- Mảng
- Các thao tác trên mảng
- Hạn chế của mảng
Mảng là gì?
Là tập hợp nhiều phần tử có cùng kiểu dữ liệu
Số phần tử trong mảng được xác định trước
Mỗi phần tử được đánh số chỉ mục, bắt đầu từ 0
Ví dụ về mảng:
Mảng các từ:
Mảng các số nguyên:
Cách Khai báo Mảng
KiểuDữLiệu[] tênMảng;
Ví dụ
- int[] bangDiem;
- string[] loiNoi;
- DateTime[] ngaySinh;
Khởi tạo Mảng
tenMang = new KieuDuLieu[soPhanTu]
Ví dụ
- diem = new int[10];
- loiNoi = new string[20];
- ngaySinh = new DateTime[7];
- diemTB = new float[5];
Khởi tạo và gán giá trị Mảng
tenMang = new KieuDuLieu[spt]{gtri1, gtri2, gtri3,…};
- diem = new int[5]{ 5, 6, 7, 6, 9 }
Giá trị không nhất thiết phải là hằng số
Ví dụ
- Random r = new Random();
- int[] pins = new int[4]{
- r.Next() % 10, r.Next() % 10,
- r.Next() % 10, r.Next() % 10 };
Số giá trị trong dấu ngoặc phải bằng số phần tử mảng được khai báo
Truy suất từng phần tử Mảng
Xác định số phần tử của mảng
- tenMang.Length
Truy xuất phần tử: tenMang[soThuTu]
- 0 <= soThuTu <= (tenMang.Length – 1)
Ví dụ
- Lấy điểm thứ 3 (soThuTu = 2) của mảng diem
- int diem3 = diem[2];
- -> diem3 = 7
Gán giá trị cho từng phần tử Mảng
Gán điểm thứ 3 của mảng diem là 10
- diem[2] = 10
Gán điểm thứ 4 của mảng diem bằng điểm thứ nhất cộng 4
- diem[3] = diem[0] + 4
Duyệt Mảng
Dùng vòng lặp for
Ví dụ duyệt mảng diem
for (int i = 0; i < diem.Length; i++)
{
Console.WriteLine(diem[i].ToString());
}
Duyệt và gán phần tử
for (int i = 0; i < diem.Length; i++)
{
diem[i] += 1; Console.WriteLine(diem[i].ToString());
}
Duyệt Mảng bằng foreach
Ví dụ
foreach (int i in diem)
{
Console.WriteLine(i.ToString());
}
Không nên dùng foreach khi
- Cần duyệt một phần trong mảng (ví dụ duyệt từ phần tử thứ 2 tới thứ 10)
- Cần duyệt từ cuối về đầu mảng
- Cần biết chỉ số mảng trong vòng lặp
- Cần thay đổi giá trị của phần tử mảng
Sao chép Mảng
Mảng là kiểu tham chiếu à gán mảng là gán tham chiếu
Ví dụ
- int[] mangA = diem;
- à mangA và diem cùng tham chiếu đến vùng nhớ chứa các phần tử của mảng
- Thay đổi giá trị trong mangA sẽ ảnh hưởng đến diem
Tạo mảng mới và gán giá trị từ mảng cũ
Dùng CopyTo
- int[] mangA = new int[diem.Length];
- diem.CopyTo(mangA, 0);
Dùng Array.Copy
- Array.Copy(diem, mangA, diem.Length);
Dùng Clone
- mangA = (int[]) diem.Clone();
Đảo Mảng
Phương thức Reverse của lớp Array thực hiện việc đảo thứ tự các phần tử trong mảng. Cú pháp thực hiện:
- int[] mang = { 15, 26, 7, 28, 19, 6 };
Array.Reverse(mang);
Kết quả:
- mang = { 6,19,28,7,26,15};
Sắp xếp Mảng
Phương thức Sort() của lớp Array thực hiện việc sắp xếp các phần tử trong mảng. Cú pháp thực hiện:
- Array.Sort(ten_mang);
Ví dụ:
- int[] mang = { 9, 5, 7, 4, 6 };
- Array.Sort(mang);
Kết quả:
- mang = { 4, 5, 6, 7,9 };
Tìm kiếm trên Mảng
Tìm kiếm trên mảng đã được sắp xếp
Tìm kiếm trên mảng chưa được sắp xếp
Tìm kiếm trên mảng đã được sắp xếp
Phương thức BinarySearch của lớp Array thực hiện việc tìm kiếm một giá trị trong một mảng đã được sắp xếp trước, trả về kết quả là số nguyên cho biết chỉ số index của phần tử tìm được, nếu không tìm được thì trả về -1. Cú pháp thực hiện:
int vitri = Array.BinarySearch(tenMang, giaTriCanTim);
Ví dụ:
- int vitri = Array.BinarySearch(mang, 7);
- Kết quả vitri=4 (Tìm thấy số 7 ở vị trí thứ 4)
- int vitri = Array.BinarySearch(mang, 113);
- Kết quả vitri=-1 (-1 tức là không tìm thấy số 113)
Tìm kiếm trên Mảng chưa sắp xếp
Ví dụ:
Giải pháp 1: Sắp xếp mảng trước, sau đó gọi hàm tìm kiếm nhị phân(đơn giản, tuy nhiên nếu trường hợp không được thay đổi giá trị gốc thì không được dùng giải pháp này)
Giải pháp 2: Không sắp xếp, tiến hành dùng giải thuật tìm kiếm tuyến tính.
Giải thuật tìm kiếm tuyến tính
Xét phần tử từ đầu cho đến cuối một cách tuần tự
Tại vị trí thứ i nếu giá trị trong dữ liệu đúng với khoá cần tìm kiếm -> tìm thấy. Nếu không đúng tìm đến phần tử kế tiếp i+1
Nếu sau khi xét hết N phần tử mà không có giá trị khoá cần tìm à không tìm thấy
- Bước 1: i = 0; // bắt đầu từ phần tử đầu tiên của dãy
- Bước 2: So sánh a[i] với x, có 2 khả năng :
- + a[i] = x : Tìm thấy. Dừng
- + a[i] ≠ x : Sang Bước 3.
- Bước 3 : i = i+1; // xét tiếp phần tử kế trong mảng
- Nếu i = N: Hết mảng,không tìm thấy.Dừng
- Ngược lại: Lặp lại Bước 2.
int TimKiem( int x){
for (int i=0; i<N;i++) {
if (a[i]==x) return i ; // a[i] là phần tử có khoá x
};
return -1;// tìm hết mảng nhưng không có x
}
- Ví dụ: Cho dãy số a
- {12, 2, 8, 5, 1, 6, 4, 15}
- Giá trị cần tìm: 8
- i = 0
Mảng đa chiều
C# hỗ trợ mảng đa chiều, ở đây ta xét mảng 2 chiều vì nó phổ biến nhất.
Mảng hai chiều thực chất là mảng của những mảng một chiều. Ta có thể xem mảng hai chiều là một ma trận gồm các hàng và các cột
Cú pháp khai báo:
- Kiểu_dữ_liệu[ , ] mang = new Kiểu_dữ_liệu [so_hang, so_cot];
Ví dụ: Tạo mảng 2 chiều có 3 dòng 5 cột:
- int[ , ] mang = new int[3, 5];
Để truy cập phần tử trong mảng hai chiều, ta sử dụng index dạng tenMang[vị trí dòng, vị trí cột].
int soDong = 3;
int soCot = 4;
int[,] mang = new int[soDong, soCot];
for(int i = 0; i < soDong; i++)
{
for (int j = 0; j < soCot; j++ )
{
mang[i, j] = (i +1) * j;
}
}
Ngoài ra có thể duyệt bằng cách sau:
for (int i = 0; i < mang.GetLength(0); i++)
{
for (int j = 0; j < mang.GetLength(1); j++)
{
Console.Write(mang[i,j] +” “);
}
Console.WriteLine();
}
Đánh giá mảng
Ưu điểm chính của mảng:
- Truy suất nhanh, dễ sử dụng với tập dữ liệu cố định không thay đổi trong quá trình thực thi
Hạn chế của mảng:
- Mảng có kích cỡ và số chiều cố định nên khó khăn trong việc mở rộng ứng dụng.
- Các phần tử được đặt và tham chiếu một cách liên tiếp nhau trong bộ nhớ nên khó khăn cho việc xóa một phần tử ra khỏi mảng.
Xử lý Hạn chế của mảng
Sử dụng collections:
List, ArrayList, Dictionary… để thay thế cho mảng khi thao tác trên tập dữ liệu có thay đổi trong quá trình thực thi (Thay đổi giá trị, thay đổi số lượng, thay đổi vị trí các phần tử…)
Các collection này rất dễ sử dụng và có khả năng tự “co giãn” theo sự thay đổi của dữ liệu trong quá trình thực thi.
Ví dụ sử dụng List:
List ds = new List();
ds.Add(“an”);//thêm phần tử
ds.Add(“bình”);
ds.Remove(“an”);//xóa phần tử
ds.Add(“happy”);
foreach(string s in ds)//duyệt danh sách
{
Console.WriteLine(s);
}
ds.Clear();//xóa toàn bộ
11/03/2022 Ứng Dụng Miễn Phí