Mất 5 phút đọc

Xử lý mảng trong C#

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);

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ộ

5/5 - (2 Bình chọn)
186 lượt xem

11/03/2022 Ứng Dụng Miễn Phí

Bài viết liên quan

Block "5_tab_footer" not found