DỮ LIỆU KIỂU MẢNG LÀ GÌ ? BIẾN MẢNG LÀ GÌ? NÊU CÁCH KHAI BÁO BIẾN MẢNG

-

Dữ liệu kiểu mảng là gì là một trong những keyword được search nhiều nhất trên Google về chủ đề dữ liệu kiểu mảng là gì. Trong bài viết này, hoclamweb.vn sẽ viết bài viết Dữ liệu kiểu mảng là gì? Tại sao chúng ta lại sử dụng dữ liệu kiểu mảng?

*

Dữ liệu kiểu mảng là gì? Tại sao chúng ta lại sử dụng dữ liệu kiểu mảng?

I / định nghĩa :


Mảng là tập hợp các phần tử cùng kiểu . Kiểu của các phần tử giống như mọi kiểu của biến (trừ kiểu File ) .

Bạn đang xem: Dữ liệu kiểu mảng là gì


cách 1 :TYPE Tên_Kiểu_Mảng = ARRAY of Kiểu_Phần_tử ;VAR Tên_biến_Mảng : Tên_Kiểu_Mảng ;phương pháp 2 :VAR Tên_biến_Mảng : ARRAY of Kiểu_Phần_tử ;

lưu ý :Khi truyền dữ liệu kiểu mảng vào trong chương trình con bắt buộc phải sử dụng phương pháp 1
Tương tự cũng có 2 cách khai báo :hướng dẫn 1 :TYPE Tên_Kiểu_Mảng = ARRAY of Kiểu_Phần_tử ;VAR Tên_biến_Mảng : Tên_Kiểu_Mảng ;hướng dẫn 2 :VAR Tên_biến_Mảng : ARRAY of Kiểu_Phần_tử ;

note : m1 là chỉ số thể loại đầu và m2 chỉ số dạng cuốin1 là chỉ số cột đầu và n2 chỉ số cột cuối
Kí hiệu mảng 1 chiều có N phần tử là A(N). Kí hiệu phần tử thứ i ( 1 như một biến đưa giá trị của ô nhớ tương ứng với phần tử thứ i của mảng . Vậy muốn truy nhập (lấy ra hoặc đặt lại ) trị giá của phần tử thứ i của mảng 1 chiều A(N) ta chỉ cần truy nhập qua A . rạch ròi rất thuận lợi .Kí hiệu mảng 2 chiều có M dạng ,N cột A(M,N) . Số phần tử là Mx
N Kí hiệu phần tử ở thể loại i ( 1 loại , chỉ số j gọi là chỉ số cột . quan tâm chỉ số dòng viết trước.Trong chương trình , A có vai trò giống như một biến ,mang giá trị của ô nhớ tương ứng với phần tử ở dòngi , cột j của mảng . Vậy muốn truy nhập (lấy ra hoặc đặt lại ) trị giá của phần tử này chỉ cần truy nhập qua A .

V / chuyển đổi mảng 2 chiều vào mảng 1 chiều :


Để chuyển giá trị của các phần tử của mảng 2 chiều A(M,N ) vào mảng 1 chiều B(M*N) ta dùng công thức sau :

B := A với không := (i – 1) * N + j ( 1click thước của mảng :
+ hướng dẫn 1 : Mảng A có kích thước là : Sizeof(A) Byte+ cách 2 : click thước Mảng = click thước 1 phần tử * số lượng phần tử .

VII / chủ đề mảng và tự điển :


Trong một số bài tập , việc đơn vị mảng như thế nào để có thể làm việc với bộ dữ liệu to là một yêu cầu quan trọng . Thí dụ : Cho một bảng chữ nhật 2×4 gồm 2 dòng , 4 cột chứa 8 ô vuông , mỗi ô chứa 1 số nguyên không giống nhau 1 , 2 ,3 ,4 ,5 ,6 ,7 8 .

hình 11 2 3 48 7 6 5

ảnh 24 1 2 35 8 7 6

ảnh 34 8 1 35 7 2 6

rạch ròi có 8! = 40.320 Bảng giống như vậy . Bài toán đặt ra là :Nếu xếp các ô cạnh nhau theo chiều mũi tên giống như trên hình vẽ sẽ được 1 số nguyên kiểu Long
Int : 12345678 ( ảnh 1 ) hoặc 41236785 ( hình 2 ) hoặc 48136275 ( ảnh 3 ).Giá trị của số này gọi là trị giá của bảng .Hãy sắp đặt 40.320 bảng này theo thứ tự tăng nghĩa là bố trí 40.320 số kiểu Long
Int .Không thể sử dụng mảng có kiểu Array<1.. 40320> Of Long
Int để lưu trữ các bảng này .Vậy hướng khắc phục như thế nào ? Ta sẽ xây dựng 1 “Tự điển “ sắp xếp tăng các số này (nhưng không cần lưu trữ) .Mỗi số gọi là 1 từ trong tự điển .Mỗi từ tạo thành giống như phương pháp trên có những đặc trưng gì ? Nếu lần lượt tạo các chữ số từ trái qua phải , chữ số ở vị trí thứ i ( 0tạo ra trước nó ; k là số các chữ số nhỏ hơn chữ số ở vị trí i mà chưa được dùng sử dụng các chữ số trước i . Vậy từ ở vị trí thứ i là 1 cặp số ( i,k) ,trong tự điển nó đứng ở vị trí thứ :

8VT =  ki * (8-i)! + 1 ( 1≪=ii=1Thí dụ Bảng nêu ở ảnh 1 có VT = 1 vì ki =0 trong cả 8 số hạng .Bảng nêu ở hình 2 có VT = 3*7! + 3! + 2! + 1! + 1 = 5049 …Vậy chỉ cần các mảng sau :+ Mảng M có 8 phần tử kiểu Word chứa 8 trị giá (8-i)! ( 1≪= i + Mảng P để đánh dấu các chữ số nào đang được dùng đứng trước chữ số thứ i , suy ra không là số các chữ số nhỏ hơn i , vừa mới được dùng đứng trước chữ số thứ i+ Mảng A có kiểu Array<1..8> of Byte để chứa 1 bảng .Mỗi khi nhận được 1 bảng , ta có thể tìm được vị trí của nó trong tự điển , và ngược lại .

Uses Crt;Const M : Array<0..7> of Word =(1,1,2,6,24,120,720,5040);Type KX = Array<1..8> of Byte;Var A : KX; i , j : Word;Function Vitri(X : KX) : Word;Var T : Long
Int;i,j : Byte;D : KX;Begin
T := 0;Fill
Char(D,Sizeof(D),0);For i:=1 to 8 do
Begin
For j:= X-1 downto 1 do
If D=0 then T := T + M<8-i>;D> := 1;End;Vitri := T + 1;End;Procedure Timso(T : Word;Var X : KX);Var i,j,k : Byte; D : KX;Begin
Fill
Char(D,Sizeof(D),0);Dec(T);For i:=1 to 8 do
Beginkhông := T div M<8-i> + 1 ; T := T mod M<8-i>;j := 0;While (k>0) do
Begin
While D=1 do Inc(j);Inc(j);Dec(k);End;X := j; D := 1;End;End;BEGINClrscr;For i:=1 lớn 8 do
Begin
Write(‘A<‘,i,’> = ‘);Readln(A);End;j := vitri(A);Writeln(j);Timso(j,A);For i:=1 lớn 8 do Write(A);Readln
END.
Mảng được duyệt nhờ sử dụng 1 biến điều khiển nhận giá trị từ chỉ số nhỏ nhất tới chỉ số lón nhất hoặc ngược lại . Một số loại bài tập duyệt mảng .a ) Đếm số phần tử thoả mãn 1 thuộc tính nào đó ( thường dùng 1 biến đếm ) .b ) check các phần tử của mảng xem vừa mới được sử dụng vào một giai đoạn nào đó của bài toán chưa , phần tử nào đã được xem xét thì được đánh dấu bằng cách gán cho nó 1 trị giá đặc biệt .( Hoặc có thể dùng kèm theo 1 mảng phụ để đánh dấu ) .c ) cải thiện lại trị giá của 1 số phần tử có tính chất chung .d ) Tìm một dãy con các phần tử liên tiếp nhau thoả mãn 1 tính chất nào đó .e ) Xoá bỏ một số phần tử ( Thường sử dụng kèm theo 1 mảng đánh dấu ) .g ) Duyệt mảng cùng lúc dồn mảng sau khi xoá bỏ 1 số phần tử , hoặc chèn thêm vào 1 số phần tử .h) xử lý trên mảng vòng ( Hai cách thức chính – Các bài tập 5,21,23.. Sẽ đề cập )
Thường dùng một số phương pháp chính sau đây :+ Bubble
Sort+ Shell
Sort+ Quick
Sort+ Heap
Sort+ Đổi chỗ trực tiếpa ) Bubble Sort Phương pháp nổi bọt Uses Crt;Const N = 10000;Type M1 = Array<1..N> of Integer;Var A : M1;i,j,x : Integer;Begin
Clrscr;Randomize;For i:=1 to N do A := Random(10);For i:=1 lớn N do Write(A:4);For i:=2 lớn N do
For j:=N downto i do
If A > A then
Beginx := A;A := A;A := x;End;Writeln;For i:=1 to N do Write(A:4);Readln;End.

b ) Shell Sort Chèn trực tiếp với độ dài giảm dần , có biến đóng vai trò lính canh Uses Crt;Const N = 10000;Type M1 = Array<1..N> of Integer;M2 = Array<1..4> of Integer;Var A : M1;H : M2;i,j,m,k,s,x : Integer;Begin
Clrscr;Randomize;For i:=1 to N do A := Random(10);For i:=1 lớn N do Write(A:4);H<1> := 1; H<2> := 3; H<3> := 5; H<4> := 9;For m := 1 lớn 4 do
Beginkhông := H;S := -k;For i:=K+1 to N do
Beginx := A;j := i-k;If s=0 then s := -k;Inc(s);A := x;While x Begin
A := A;Dec(j,k);End;A := x;End;End;For i:=1 lớn N do Write(A:4);Readln;End.

c ) Quick
Sort$S-Uses Crt; Sắp xếp bằng phân hoạch Const Max= 15000; Nếu sử dụng đệ qui , k dùng 2 mảng DP,CP , thì Max ->32000Type Chiso = 1..Max;đưa = Array of Integer;Var A : Mang;Procedure Taomang; Tạo ngẫu nhiên Mảng A(N) Procedure Quick
Sort;Var s,D,C,i,j : Word;coc,x : Integer;d
P,c
P : Array of Chiso;Begins:=1;d
P:=1;c
P:=Max;Repeat
D:=d
P; Chỉ số đầu của phân hoạch thứ s C:=c
P; Chi số cuối của phân hoạch thứ s Dec(s);Repeati:=D;j:=C;x:= A<(D+C) div 2>;Repeat
While A While x If i
Begincoc:=A; A:=A; A:=coc;Inc(i);Dec(j);End;Until i>j;If i Begin
Inc(s);d
P:=i;c
P:=C;End;C:=j;Until D>=C;Until s=0;End;Procedure Hien(X : Mang); Hiện Mảng BEGINRepeat
Clrscr;Taomang;Quick
Sort;Hien(A);Write(‘ESC to Quit.Press any key to Continue…’);Until Read
Key=#27;END.d) Merge
Sort Đổi chỗ trực tiếp . Phương pháp này it dùng trên mảng vì tốn bộ nhớe ) Heap
Sort Phương pháp vun đống + Đệ qui sẽ học sau
cách 1 : Biến i ( biến điều khiển ) duyệt mảng nhận các giá trị tăng dần ,đến khi i = N+1 thì gán i= 1 . Hoặc ngược lại biến i ( biến điều khiển ) duyệt mảng nhận các trị giá giảm dần ,đến khi i = 0 thì gán i = N .phương pháp 2 : Nhân đôi mảng

i chạy từ 1 đến N để tạo các điểmbắt đầu không giống nhau của J

A(N) : 1 2 …….i ……….. ……………..N 1 2 3 ………..(i+N-1) ……………………2x
N

J đi từ i tới i+N-1 là duyệt xong mảng A(N)


Trong khi duyệt mảng , người đọc thường hay sử dụng 2 loại biến : Biến điều khiển vòng lặp để duyệt mảng và biến định vị để đánh dấu mốc những vị trí cần thiết ,nhằm mục đích tạo ranh giới phần đã duyệt và phần còn phải duyệt tiếp. Mỗi lần biến điều khiển “dò dẫm” duyệt mảng ,thấy điều kiện nào đó theo yêu cầu của đề bài được cung cấp trên một dãy con nào đó của mảng thì biến điều khiển gửi ngay “thông điệp” cho biến định vị tới “quản lý” 2 vị trí chốt đầu và cuối dãy con này . Biến định vị lập tức nhận Nhiệm vụ “lính canh” này và phấp phỏng chờ đợi “thông điệp mới của biến định vị “ để nhận chốt mới .

Thí dụ : Bài toán tìm dãy con dài nhất gồm các phần tử liên tiếp to hơn x :( xem lời giải chi tiết ở trang 122 )+ Chương trình sẽ sử dụng 1 biến i làm nghĩa vụ duyệt mảng , 4 biến định vị : đ,c,Lđ,Lc
Biến đ : chốt điểm đầu của dãy con mới xây dựng
Biến c : chốt điểm cuối của dãy con mới xây dựng
Biến Lđ : chốt điểm đầu của dãy con dài nhất trước dãy con mới thiết lập
Biến Lc : chốt điểm cuối của dãy con dài nhất trước dãy con mới thiết lập+ Khởi trị : Đ := 1;C := 1; LĐ := 1; LC:=1;+ Biến i duyệt mảng bắt đầu từ 1 ,* Nếu A > x thì C chốt tới giá trị i này, i liên tục tiến trình “thăm dò “ của mình , * Nếu A-Nếu C-Đ > LC-LĐ thì dãy con mới thiết lập dài hơn nên LC nhận giá trị mới là C , LĐ nhận trị giá mới là Đ . đồng thời Đ và C lên giữ chốt mới là i, để khởi đầu thiết lập một dãy con không giống-Nếu C-Đ bắt đầu xây dựng một dãy con không giống

Để mô tả màng một chiều cần xác định kiểu của các phần tử và cách đánh số các phần tử của nó (mỗi phần tử của nó có một chỉ số).

Để người lập trình có thể xây dựng và sử dụng kiều mảng một chiều, các ngôn ngữ lập trình có quy tắc cách thức cho phép xác định:

- Tên kiểu mảng một chiều;

- Số lượng phần tử của mảng;

- Kiểu dữ liệu của phần tử;

- Cách khai báo biến;

- Cách tham chiếu đến phần tử.

Có thể truy cập (hay thao tác) trên mỗi phần tử của mảng, trong việc làm đó mỗi phần tử của mảng được xác định bởi tên của mảng và chỉ số tương ứng của phần tử này.

Kiểu mảng là một kiểu dữ liệu có cấu trúc, rất cần thiết và hữu ích trong nhiều chương trình.

Xem thêm: Tên tham chiếu giao dịch là gì, hướng dẫn cách đọc bảng giá chứng khoán cơ sở

❖ Khai báo

Khai báo mảng một chiều có dạng tổng quát như sau:

Cách 1: Khai báo trực tiếp biến mảng một chiều:

var :array of ;

Cách 2: Khai báo gián tiếp biến mảng qua kiểu mảng một chiều:

type = array of ;

var :;

Trong đó:

Kiểu chỉ số thường là một đoạn số nguyên liên tục có dạng n1...n2 với n1, n2 là các hàng hoặc biểu thức nguyên xác định chỉ số đầu và chỉ số cuối (n1, n là hằng nguyên.

Tham chiếu tới phần tử của mảng một chiều được xác định bởi tên mảng cùng với chỉ số, được viết trong cặp dấu ngoặc < và >.


❖ Lưu ý:

• Đối với ví dụ 1 về bài toán: "Tìm phần tử lớn nhất của dãy số nguyên". Chương trình của bài toán như sau:

Program tim
Max;

uses crt;

const

Nmax := 250;

type

arrint = array<1..Nmax> of integer;

var

N, i, Max, csmax: integer;

A: arrlnt;

Begin

clrscr;

write ("Nhap so luong phan tu cua day so, N- ");

readln (N);

for i:= 1 to N do

begin

write ("Phan tu thu " ,i," = " ) ;

 readln (A < i > );

end;

Max: =A (10); csmax:= 1;

for i:= 2 to N do if A > Max then

begin

Max:= A; csmax:= i;

end;

writeln("Gia tri cua phan tu Max: ", Max);

write In(’Chi so cua phan tu Max: " , csmax); readln

End

Kh chạy chương trình, giả sử ta nhập giá trị các phân tử:

Phần tử thứ nhất là 15;

Phần tử thứ hai là 5;

Phần tử thứ ba là 9;

Phần tử thứ tư là 6;

Phần tử thứ năm là 8;

thì trên màn hình thông báo kết quả: "Gia tri cua phan tu Max: 15", "Chi so cua phan tu lon nhat la 1*.


Khi đó màn hình có dạng như hình 26 dưới đây:

*

Từ chương trình này, chúng ta rút ra được một số điều cơ bản cần phải quan tâm, đó là:

- Dùng mảng có kiểu phần tử là nguyên để biểu diễn một dãy hữu hạn số nguyên và cách khai báo mảng này.

- Câu lệnh for-do thứ nhất trong chương trình thể hiện một nhiệm vụ trong bước 1 của thuật toán, dùng để nhập các phần tử của mảng, số phần tử thực sự của mảng do người chạy chương trình nhập vào bởi câu lệnh ngay trước câu lệnh for-do này.

- Câu lệnh for-do thứ hai trong chương trình thể hiện vòng lặp (gồm bước 3 và 4 trong thuật toán), dùng để duyệt tuần tự từng phần tử trong mảng lọc lấy.

Đối với ví dụ 2, về bài toán: “Sắp xếp dãy số nguyên bằng thuật toán đổi chỗ". Chương trình của bài toán như sau:

program sapxep;

uses crt;

const Nmax = 250;

type

Arr
Int = array<1..Nmax> of integer;


var

N,I,j,t: integer;

A: Arrlnt;

Begin

clrscr

write ( " Nhap so luong phan tu cua day so, N-");

readln(N); for i:= 1 to N do begin

write(" Phan tu thu",i," = ");

readln(A);

end,

for j:= N downto 1 do begin

for i:= 1 to j-1 do if A > A then

begin

t: = A < i > , A:= A;

A < i +1 > : = t;

end;

end;

writeln("Day so duoc sap xep la:’); for i:= 1 to N do write(A:4);

readln

End.

Khi chạy chương trình, giả sử ta nhập số phần tử của dãy là 5 với giá trị các phần tử như sau:

Phần tử thứ nhất= 5;

Phần tử thứ hai= 7;

Phần tử thứ ba= 9;

Phần tử thứ tư= 3;

Phần tử thứ năm= 6; 

thì trên màn hình sẽ có thông báo:

Day so duoc sap xep la:

3 5 6 7 9

Màn hình kết quả có dạng như hình 27 dưới đây:

*

Từ chương trình này, chúng ta rút ra được một số điều cơ bản cần phải quan tâm, đó là:

- Khái niệm lượt: sau lượt (lần) duyệt thứ nhất giá trị lớn nhất xếp đúng vị trí là ờ cuối dãy. Tương tự, sau lượt thứ hai, giá trị lớn thứ hai được xếp ở vị trí sát cuối,.. Sau mỗi lượt có ít nhất một số hạng đã xếp đúng vị trí. Trong thuật toán phải thực hiện bao nhiêu lượt như vậy, mỗi lượt thực hiện trên đoạn nào (từ đâu đến đâu) của dãy số? Giá trị của j chính là chỉ số phần tử cuối trong đoạn được duyệt của lượt. Đây chính là câu lệnh for j : N downto 2 do với biến đếm j chạy từ N về 2.


- Mỗi lượt bao gồm việc thực hiện một số thao tác: so sánh một phần tử với phần tử đứng ngay sau nó để xử lí, bắt đầu từ phần tử đầu tiên trong dãy đến phần tử thứ j. Thao tác so sánh để quyết định xử lí (tráo đổi hai phần tử) được lặp một số lần. Đây chính là câu lệnh lặp mà chương trình dùng để thể hiện mỗi lượt.: for i: - 1 to j- 1 do if A A then begin

t : = A < i > ;

A : = A ;

A < i +1 > : = t;

end;

Giá trị biến đếm chính là chỉ số phần tử được lấy so sánh với phần tử kề sau nó

trong dãy số. Trong cấu trúc lặp này, chỉ lấy đến j-1 chứ không phải là đến j.

Đối với ví dụ 3 về bài toán: "Tìm kiếm nhị phân"

 Thuật toán

Bước 1: Nhập N, các số hạng a1, a2... a
N và khóa k

Bước 2: Dau


while (Dau k then Cuoi:= Giua-1 else Dau:= Giua + 1;

End;

if Tim_thay then writeln("Chi so tim duoc la:". Giua)t else writeln(Khong tim thay’);

readln

End.

Khi chạy chương trình, giả sử ta nhập số phần tử của dãy N= 5 với giá trị các phần tử như sau:

Phần tử thứ nhất= 3;

Phần tử thứ hai= 5;

Phần tử thứ ba= 7;

Phần tử thứ tư= 9;

Phần tử thứ năm= 12; tiếp đến, ta nhập giá trị k =9 thì trên màn hình sẽ có thông báo:

Chi so tim duoc la: 4

Kết quả trên màn hình có dạng như hình 28 dưới đây:

*

Từ chương trình này, chúng ta rút ra được một số lưu ý như sau:

- Phần cơ bản của chương trình sẽ gồm một cấu trúc lặp (chưa xác định trước được số lần lặp);

- Cần ghi nhận được sự kiện tìm thấy, có thể dùng một biến logic Tim-thay để ghi nhận. Khi chưa tìm kiếm, tất nhiên phải khởi tạo biến này là False. Khi tìm thấy sẽ đổi giá trị của biến Tim-thay thành True. Điều này làm dễ dàng xác định điều kiện lặp.






Đối với ví dụ 1 về bài toán: “Tính và đưa ra màn hình bảng cửu chương". Chương trình tính và đưa ra màn hình bảng cửu chương:

Chương trình tính và đưa ra màn hình bảng cửu chương:

program Bangcuuchuong;

uses crt;

var

B: array<1..9, 1..10> of integer;

{B: bien mang hai chieu luu bang cuu chuong}

i, j: integer;

Begin

clrscr;

for i:=1 to 9 do

for j:=1 to 10 do

B:= i*j;

for i:=1 to 9 do begin

for j:=1 to 10 do write(B:4) ;

writeln;

end;

readln

End.

Khi chạy chương trình, kết quả có dạng như hình 29 dưới đây:

*

Đối với ví dụ 2 về bài toán: “Lập chương trình nhập vào từ bàn phím các phần tử của mảng hai chiều B gồm 5 dòng, 7 cột với các phần tử là các số nguyên