PDA

View Full Version : آرایه ها در دلفی



e-shahshahani
جمعه 13 اردیبهشت 1387, 11:46 صبح
بسمه تعالی

برای نوشتن این مقاله از help دلفی استفاده شده است.
مثال های این مقاله با دلفی 7 تست شده است.
این مقاله قبلا در سایت http://prdev.com ارائه شده است.
----------------------------------------------------------------------------------------------------

یک آرایه مجموعه ای از متغیر های هم نام است که در آن هر متغیر با یک شماره مشخص می شود.

آرایه های با طول ثابت (Static Arrays)

مثلا در برنامه ای می خواهیم معدل بیست درس را محاسبه کنیم. یک راه این است که از بیست متغیر با نام های متفاوت استفاده کنیم! اما راه بهتری نیز وجود دارد. از یک آرایه که شامل بیست متغیر است استفاده می کنیم. در متغیرهای آرایه ای، یک نام برای کل مجموعه انتخاب می کنند و هر متغیر را با یک شماره مشخص می کنند. در این مثال متغیر های آرایه با اعداد صفر تا نوزده شماره گذاری می شوند، توسط یک حلقه for می توان اعداد صفر تا نوزده را تولید کرد. به همین سادگی.

برای تعریف کردن یک آرایه باید از الگوی زیر پیروی کنیم:

var x : array[index1, ..., indexN] of baseType;

که در الگوی فوق، x نام متغیر آرایه ای، index1 شماره اولین خانه، indexN شماره آخرین خانه و baseType نوع متغیر آرایه ای می باشد.مثلا:

var nomre : array[0..19] of integer;

دستور فوق بیست متغیر از نوع integer می سازد که اولین متغیر nomre[0] و آخرین متغیر nomre[19] می باشد. برای دسترسی یافتن به هر کدام از متغیر ها، شماره آن متغیر را داخل یک جفت کروشه در مقابل آن می نویسیم. در مثال زیر معدل بیست عدد را با استفاده از آرایه محاسبه می کنیم:

procedure DoIt;
var
nomre : array[0..19] of integer;
i : integer;
m : real;
begin
nomre[0] := 15;
nomre[1] := 20;
.
.
.
nomre[19] := 19;

m := 0;
for i := 0 to 19 do
m := m + nomre[i];

m := m / 20;

Edit1.Text := FloatToStr(m);
end;


می توانید در صورت نیاز، متغیر های آرایه را با شماره های دیگری شماره گذاری کنید. مثلا:

var x : array[12..46] of string;
دستور فوق، 35 متغیر با نام x ایجاد می کند که با شماره های 12، 13، ... 46 مشخص می شوند.

آرایه های دو بعدی:
یک صفحه شطرنجی را در نظر بگیرید که هر خانه آن را می توان با دو عدد طول و عرض شماره گذاری کرد. به همین ترتیب می توان در دلفی نیز یک جدول دو بعدی داشت. برای در مثال زیر یک آرایه دو بعدی تعریف می شود که 10 در 50 می باشد. یعنی به تعدد یک جدول 10 در 50 متغیر دارد.

var s : array[1..10, 1..50] of integer;

در مثال زیر یک آرایه دو بعدی 10 در 10 تعریف می کنیم و هر کدام از خانه های آرایه را با عدد مربوطه جدول ضرب پر می کنیم:

var jadval : array[1..10, 1..10] of integer;
var i, j : integer;
begin
for i := 1 to 10 do
for j := 1 to 10 do
jadval[i, j] := i * j;

for i := 1 to 10 do
for j := 1 to 10 do
form1.Canvas.TextOut(i*20, j*20, inttostr(jadval[i, j]));
end;


آرایه های دو بعدی را به صورت دیگری نیز می توان تعریف نمود، مثلا دستور زیر آرایه دو بعدی آرایه jadval در مثال بالا تعریف می کند:

var jadval : array[1..10] of array[1..10] of integer;
با کمی دقت می توان منطق ساده این دستور را درک کرد!

چند نکته در مورد آرایه های با طول ثابت:
• اگر آرایه های a و b از یک نوع باشند، دستور b := a متغیر های متناظر a را در b کپی می کند.
• طول آرایه های استاتیک را نمی توان تغییر داد.
• می توان خانه های آرایه را با کاراکتر نیز مشخص نمود! مثال:

var x : array['a'..'e'] of integer;
begin
x['a'] := 1;
x['b'] := 2;
x['c'] := x['a'] + x['b'];
end;


آرایه های با طوی متغیر (Dynamic Arrays)
آرایه های دینامیک اندازه ثابتی ندارند و در طول اجرای برنامه می توان اندازه آن ها را به میزان مورد نیاز تعیین کرد و در حافظه صرفه جویی نمود. در مثال زیر یک آرایه دینامیک یک بعدی از اعداد صحیح به نام dyna تعریف شده است.

var dyna : array of integer;

برای تعیین اندازه آرایه دینامیک باید از دستور SetLength استفاده کرد. مثلا دستور SetLength(dyna, 10); تعداد 10 متغیر در آرایه dyna تعریف می کند. این متغیر ها از 0 تا 9 شماره گذاری می شوند. در آرایه های متغیر شماره خانه اول همواره 0 می باشد.
برای از بین بردن آرایه و آزاد کردن حافظه اشغال شده، از دستور dyna := nil; استفاده کنید.

آرایه های دینامیک از نوع اشاره گر ها هستند. در مثال زیر اگرx و y دو آرایه دینامیک از یک نوع باشند، دستور x := y; باعث می شود که x به حافظه اشغال شده توسط y اشاره کند. یعنی x برای خودش حافظه جداگانه اشغال نمی کند.
برنامه زیر را در نظر بگیرید:

var
A, B: array of Integer;
begin
SetLength(A, 1);
A[0] := 1;
B := A;
B[0] := 2;
end;


مقدار a[0] پس از اجرای برنامه بالا برابر 2 می باشد، چراکه b[0] به همان a[0] اشاره می کند. همانطور که در بالا ذکر شد در آرایه های استاتیک، عمل x := y; متغیر y را در متغیر x کپی می کند.
برای ساختن یک کپی حقیقی از یک آرایه دینامیک باید از تابع Copy استفاده نمایید.

var
A, B: array of Integer;
begin
SetLength(A, 1);
A[0] := 1;
B := Copy(A);
B[0] := 2;
end;


توجه داشته باشید که دستور b := copy(a) برای آرایه b بصورت جدا از a، حافظه اشغال می کند و سپس مقدار a را در b کپی می نماید.

وقتی متغیر های آرایه های دینامیک را با یکدیگر مقایسه می کنید در حقیقت اشاره گر آنها با یکدیگر مقایسه می شود. در مثال زیر دو آرایه همنوع a و b هر یک حافظه مخصوص به خود را اشغال کرده اند، عبارت مقایسه ای a = b مقدار false را باز می گرداند زیرا a و b به جاهای مختلفی از حافظه اشاره می کنند:

var
A, B: array of Integer;
begin
SetLength(A, 1);
SetLength(B, 1);
A[0] := 2;
B[0] := 2;
end;



توجه داشته باشید که عبارت مقایسه ای a[0] = b[0] مقدار true بر می گرداند چون a[0] و b[0] هر دو برابر 2 هستند.

در آرایه های دینامیک، برای به دست آوردن اندازه آرایه از تابع length استفاده می کنند. همچنین تابع low شماره اولین خانه آرایه و تابع high شماره آخرین خانه آرایه را باز می گرداند. توجه داشته باشید که مقدار تابع low برای آرایه های دینامیک برابر 0 می باشد. مثال:

var
A : array of Integer;
x0, x1, x2 : integer;
begin
SetLength(A, 123);
x0 := length(A);
x1 := low(A);
x2 := high(A);
end;