Lưu trữ dữ liệu. Giả sử bạn đã phát triển một trò chơi trên máy tính có tên "Người dùng thù địch", trong đó người chơi cạnh tranh với những người phức tạp và không thân thiện giao diện máy tính. Bây giờ bạn cần viết một chương trình theo dõi doanh thu hàng tháng của trò chơi này trong khoảng thời gian 5 năm. Hoặc giả sử bạn cần kiểm kê Thẻ giao dịch Hacker Hero.
Bạn sẽ sớm đi đến kết luận rằng bạn cần nhiều hơn các loại dữ liệu cơ bản đơn giản để lưu trữ và xử lý thông tin.

 

Mảng. Giới thiệu.

Để làm việc với lượng lớn dữ liệu dễ dàng hơn, một nhóm ô được cung cấp một giá trị chung tên. Một nhóm các ô như vậy được gọi là một mảng.
Mảng – nó là một nhóm các ô nhớ cùng loại, nằm cạnh nhau và có tên chung. Mỗi ô trong nhóm có một số duy nhất.

Có 3 điều bạn cần học khi làm việc với mảng:
x cấp phát bộ nhớ có kích thước cần thiết cho mảng;
x ghi dữ liệu vào ô mong muốn;
x đọc dữ liệu từ một ô.

Tạo mảng.

Khi tạo một mảng, không gian được phân bổ trong bộ nhớ (một số ô nhất định). 1) Mảng có thể được tạo bằng cách đơn giản liệt kê các phần tử: int[] nums = < mã>mới int[] { 1, 2, 3, 5 }; int có nghĩa là tất cả các đối tượng trong mảng là số nguyên. Có thể thay thế cho int bằng bất kỳ kiểu dữ liệu nào khác. Ví dụ, string[] names = ["Vasya", "Peter", "Fedya"]; 2) Chúng ta không thể chỉ định ngay các giá trị của mảng mà chỉ cần tạo một mảng có độ dài cần thiết. int[] nums = new int[4]; 3) Một mảng luôn "biết" kích thước của bạn. Kích thước của mảng a có thể được tìm thấy như sau:
a.Chiều dài;
Thường kích thước của mảng được lưu trữ trong một biến riêng để chương trình có thể dễ dàng thay đổi để làm việc với kích thước mảng khác. Ví dụ:
int N = 10; // lưu trữ kích thước của mảng trong biến N int[] nums = new int[4]; // tạo mảng kích thước N Console.Write(nums.Length); // hiển thị kích thước của mảng Kích thước của mảng có thể được đặt từ bàn phím.

Tham chiếu đến một phần tử mảng.

Hầu hết lợi ích của mảng đến từ thực tế là các phần tử của mảng có thể được truy cập riêng lẻ.
Cách thực hiện việc này là sử dụng một chỉ mục để đánh số các phần tử.
Chỉ mục là một giá trị trỏ đến một phần tử mảng cụ thể.

Ghi nhớ: Việc đánh số mảng C# bắt đầu từ 0.< br />
Ví dụ về cách truy cập mảng A:
int x = (A[3] + 5) * A[1] / / đọc giá trị A[3] và A[1] A[0] = x + 6 // ghi giá trị mới vào A[0] Hãy phân tích chương trình làm việc với các phần tử của mảng. int i = 1; int[] A = new int[5]; //tạo mảng 5 phần tử A[0] = 23; // đến từng phần tử trong số 5 phần tử của mảng (chỉ số từ 0 đến 4) A[1] = 12; // ghi một giá trị cụ thể A[2] = 7; A[3] = 43; A[4] = 51; A[2] = A[i] + 2*A[i-1] + A[2*i]; // đổi giá trị của phần tử có chỉ số 2 thành kết quả của biểu thức // vì i=1 nên thay giá trị của biến i vào biểu thức ta được // biểu thức tiếp theo A[2] = A[1] + 2*A[0] + A[2]; Console.Write((A[2] + A[4])); Kết quả của việc thực hiện chương trình này, giá trị của tổng các phần tử của mảng bằng chỉ số 2 và chỉ số 4 sẽ xuất hiện trên màn hình, bằng 116. Như bạn có thể thấy từ ví dụ, chúng ta có thể truy cập bất kỳ phần tử nào của mảng. Và cũng có thể tính số phần tử cần thiết bằng nhiều công thức khác nhau (ví dụ: như trong chương trình A[i-1] hoặc A[2*i], trong những trường hợp này, các chỉ số phần tử sẽ được tính toán và phụ thuộc vào giá trị của i).

Hãy phân tích một chương trình ví dụ.
int N = 5; int[] A = new int[N]; int x = 1; A[x + 4] = A[x] + A[2 * (x + 1)];  // sau khi thay x vào biểu thức và phép tính                            // lấy dòng tiếp theo A[5] = A[1] + A[4]                           // A[5] không có phần tử nào như vậy tồn tại                           // lỗi - mảng ngoài giới hạn Mảng được khai báo có 5 phần tử, nghĩa là các phần tử sẽ được đánh số từ 0 đến 4. Ta thấy rằng chương trình ở dòng thứ 6 đề cập đến một phần tử không tồn tại: A[5].
Hóa ra chương trình đã đi quá giới hạn của mảng.
Việc tràn mảng là quyền truy cập vào một phần tử tại một chỉ mục không tồn tại trong mảng.
Trong những trường hợp như vậy, chương trình thường gặp sự cố với lỗi thời gian chạy.

 

Khi làm việc với mảng, bạn thường phải làm việc với tất cả các phần tử của mảng cùng một lúc.
Lặp lại các phần tử: chúng ta xem qua tất cả các phần tử của mảng và nếu cần, thực hiện một số thao tác với từng phần tử đó.
Đối với điều này, vòng lặp có biến thường được sử dụng nhất, thay đổi từ 0 thành N-1, trong đó N  là số của các phần tử mảng.
Trong phần N, chúng tôi sẽ xem xét kích thước hiện tại của mảng, nghĩa là,
N = A.Chiều dài;
... for (int i = 0; i < N; i++) { // ở đây chúng ta làm việc với A[i] } Trong vòng lặp đã chỉ định, biến i sẽ nhận các giá trị 0, 1, 2, ..., N-1.  Như vậy, tại mỗi bước của vòng lặp, chúng ta truy cập đến một phần tử cụ thể của mảng có số i.
Nghĩa là, chỉ cần mô tả những gì cần thực hiện với một phần tử của mảng A[i] và đặt các hành động này bên trong một vòng lặp như vậy là đủ.

Hãy viết chương trình điền vào mảng các số tự nhiên đầu tiên, nghĩa là khi kết thúc chương trình, các phần tử của mảng sẽ trở nên bằng nhau
A[0] = 1 A[1] = 2 A[2] = 3 ... A[N - 1] = N Dễ dàng nhận thấy quy luật: giá trị của một phần tử mảng phải lớn hơn 1 so với chỉ mục của phần tử.
Vòng lặp sẽ như thế này
for (int i = 0; i < N; i++) { A[ tôi] = tôi + 1; }

Các cách khác để làm việc với phần tử mảng
Ngoại trừ for , bạn cũng có thể sử dụng foreach - nó lặp lại trên tất cả các phần tử của mảng mà không sử dụng chỉ mục. Ví dụ, đôi khi có thể thuận tiện để hiển thị một mảng trên màn hình.   foreach(int i trong A) { Console.Write(i + " "); }
Và đây là cách bạn có thể đọc một mảng, các phần tử của mảng đó được viết trên một dòng và cách nhau một khoảng trắng, từ bàn phím. sử dụng System.Linq; // bạn cần viết lệnh này để sử dụng các hàm liên quan đến làm việc với mảng ... chuỗi văn bản = Console.ReadLine(); int[] array = text.Split(' ').Select(int.Parse).ToArray(); // Split() chia chuỗi thành các đối tượng riêng biệt (trong trường hợp này là phân chia không gian) // Select(int.Parse) chuyển đổi từng đối tượng (chuỗi) thành int // ToArray() ghi tất cả các đối tượng nhận được vào mảng