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 là "Người dùng thù địch", trong đó người chơi cạnh tranh với một giao diện máy tính phức tạp và không thân thiện. 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 (danh sách). Giới thiệu

Để thuận tiện khi làm việc với một lượng lớn dữ liệu, một nhóm các ô được đặt tên chung. Nhóm các ô như vậy được gọi là 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.

Khi làm việc với mảng, bạn cần học cách giải quyết ba nhiệm vụ:
x cấp phát bộ nhớ có kích thước cần thiết cho một mảng
x ghi dữ liệu vào ô mong muốn
x đọc dữ liệu từ ô


Mảng trong Pascal


Theo truyền thống, Pascal sử dụng các mảng tĩnh như

var a: mảng [1..10] của số nguyên;

Các ranh giới của một mảng phải được thiết lập bởi các hằng số và bạn không thể thay đổi kích thước của một mảng trong khi chương trình đang hoạt động. Nhưng bạn có thể tạo một chỉ mục không chỉ của một số nguyên, mà còn của một ký tự hoặc kiểu liệt kê. Ví dụ, để đếm số lần xuất hiện của mỗi chữ cái, bạn có thể sử dụng một mảng

var LettersCount: mảng ['a'...'z'] số nguyên;

và làm việc với nó theo ý muốn của bạn:

LettersCount['z'] := 1; Đếm chữ cái['d'] := Đếm chữ cái['d'] + 1;

Những nhược điểm của các mảng như vậy đã được biết đến: nếu không biết trước có bao nhiêu phần tử sẽ cần được sử dụng, thì bộ nhớ có kích thước tối đa sẽ được phân bổ cho mảng. Kết quả là, trong hầu hết các trường hợp, chúng tôi "dự trữ cho tương lai" và đôi khi là "dự trữ" này hóa ra là không đủ. Đó là lý do tại sao các mảng như vậy được gọi là  tĩnh: kích thước của chúng là tĩnh và phải được đặt ở giai đoạn biên dịch chương trình. Tuy nhiên, trong Pascal có  mảng động, kích thước của các mảng này không chỉ có thể được đặt mà còn có thể thay đổi trong quá trình thực hiện chương trình. Chính những mảng này và lợi ích của việc sử dụng chúng sẽ được thảo luận thêm.

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 được tạo bằng cách liệt kê đơn giản các phần tử: var a: mảng số nguyên; SetLength(a, 3); a[0] := 1; a[1] := 2; a[2] := 3;
2) Mảng có thể bao gồm dữ liệu thuộc bất kỳ loại nào - số nguyên hoặc số thực, chuỗi ký tự  var a: mảng ký tự; SetLength(a, 3); a[0] := 'a'; a[1] := 'b'; a[2] := 'c'; 3) Một mảng luôn "biết" kích thước của bạn. Hàm  length được sử dụng để xác định kích thước của một mảng. 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ụ: N := 10; // trong biến N chúng ta lưu trữ kích thước của mảng SetLength(a, N); // thiết lập mảng và kích thước N writeln(độ dài(a)); // hiển thị kích thước của mảng Kích thước của một mảng có thể được thiết lập từ bàn phím.

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

Phần lớn tính hữu ích của mảng đến từ thực tế là các phần tử của nó có thể được truy cập riêng lẻ.
Cách để làm điều 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ể

NHỚ!
ĐÁNH SỐ Mảng TRONG PASCAL BẮT ĐẦU TỪ SỐ KHÔNG!

(Đây là điều bắt buộc — bạn phải bắt đầu lại từ đầu. Điều này đặc biệt quan trọng cần nhớ)

Ví dụ truy cập mảng A: x := (A[3] + 5) * A[1] // đọc giá trị của 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. var i: số nguyên; a: mảng các số nguyên; bắt đầu     tôi := 1;     độ dài thiết lập(a, 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];     writeln(a[2] + a[4]); kết thúc.
Là kết quả của việc chạy chương trình này giá trị của tổng các phần tử của mảng có chỉ số 2 và chỉ số 4 bằng 116 sẽ xuất hiện trên màn hình. 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 tính toán số lượng phần tử cần thiết bằng các 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, chỉ số của các phần tử sẽ được tính toán và phụ thuộc vào giá trị của i.)

Hãy xem một chương trình ví dụ var a: mảng số nguyên; bắt đầu     độ dài thiết lập(a, 5);     a[5] := 5; a[-1] := 0; kết thúc.

Bởi vì khai báo mảng có 5 phần tử nên các phần tử sẽ được đánh số từ 0 đến 4. Chúng tôi 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 а [5] và trên dòng thứ 7 của dòng a[-1].

Hóa ra chương trình đã vượt quá giới hạn của mảng
Mảng ngoài giới hạn đang truy cập một phần tử có 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 qua 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 trên 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ố phần tử mảng.
Trong N, chúng tôi sẽ xem xét kích thước hiện tại của mảng, đó là
N := chiều dài(A) ... for i := 0 to n - 1 bắt đầu // ở đây chúng ta làm việc với a[i] kết thúc; ... Trong vòng lặp xác đị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, ta truy xuất đến một phần tử cụ thể của mảng có số i.
Vì vậy, chỉ cần mô tả những việc cần làm với một phần tử của mảng a[i] và đặt các thao tác này vào trong một chu trình như vậy là đủ.

Hãy viết chương trình điền vào mảng N  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ễ thấy quy luật: giá trị của phần tử mảng phải lớn hơn chỉ số của phần tử đó 1 đơn vị.
Vòng lặp sẽ trông như thế này cho tôi := 1 đến n - 1 làm a[i] := i + 1; Hoàn thành nhiệm vụ.