آرایه ها در دلفی
برای تعریف متغییرها ما به این صورت عمل میکردیم
با این کار مقداری از حافظه برای a رزرو میشد تا مقدار عددی در ان قرار گیرد اما اگر بخواهیم 10 عدد را نگهداری کنیم چه؟ تعریف 10 متغییر؟ اگر بخواهیم 1000 عدد را نگهداری کنیم چه؟دلفی کار را اسان کرده است استفاده از ارایه به ما این امکان را میدهد تا برای 1000 متغییر 1 نام تعریف کرده و با استفاده از شماره ان عنصر به ان دستیابی پیدا کنیم اعضای یک ارایه در حافظه در مجاور هم قرار میگیرند و به اسانی میتوان در هر قسمت اطلاعات را وارد کرد یا خواند
دلفی به ما امکان می دهد آرایههایی از هر نوع متغییری را ایجاد کنیم. برای تعریف آرایه به صورت زیر عمل میکنیم:
کد:
var
array[indexType1, ..., indexTypen] of baseType;
در این تعریف برای نامگذاری آرایه، از قانون نامگذاری متغییرها استفاده میکنیم و مقدار اولیه را نیز درون یک جفت کروشه قرار می دهیم.
نکته: شما می توانید به جای استفاده از کروشه [] از ترکیب پرانتز نقطه استفاده کنید:
کد:
d(.i.):= 3 + i; // Equivalent d[i]:= 3 + i;
نکته: وقتی که شما یک آرایه را تعریف می کنید احتیاجی ندارید که به آن مقدار کمترین یا بیشترین بدهید:
کد:
var
A : array [Boolean] of integer;
begin
A[True] := 50;
A[False] := 100;
end;
نکته: توابع Low و High کرانهای پایین وبالای یک متغییر آرایهای یا نوعی یا ترتیبی را بر میگردانند:
کد:
for I := 0 to High(X) do S := S + X[I];
آرایههای ثابت:
آرایه های ثابت می توانند توسط ساختار ثابت نوع دلفی تعریف شود. نوع ثابت که همیشه با عبارت Const تعریف می شود، نه تنها مانع تغییر مقدار پارامتر می شود، بلکه کدهای بهینه بیشتری برای رشتهها و رکوردهای رد شده به توابع تولید می کند. ما هنگامی از این نوع استفاده می کنیم که نخواهیم مقدار رد شده به یک تابع تغییر کند.
کد:
type
TDay = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday);
const
DayNames : array [TDay] of String[9] = ('Sunday', 'Monday', 'Tuesday',
'Wednesday', 'Thursday',
'Friday', 'Saturday');
var
Today : TDay;
begin
Today := TDay(DayOfWeek(Date) - 1);
ShowMessage('Today is ' + DayNames[Today] + '!');
end;
آرایههای دینامیکی:
آرایه ایستا در زمان تعریف طول مشخصی داره و نمی شه طولش رو در برنامه تعیین کرد. این نقص در آرایه پویا وجود نداره. یعنی می شه طول آرایه پویا رو در هر جای برنامه تعیین کرداین
آرایههای دینامیکی، آرایههای تحلیلی پویایی هستند که ابعاد آنها موقع کامپایل شدن شناخته شده نیست. برای اعلان آنها کافی است یک آرایه بدون بعد تعریف کنید:
برای تعریف آرایه پویای یک بعدی باید از روش زیر استفاده کنید:
کد:
name : array of type ;
که name و type به ترتیب اسم و نوع آرایه رو مشخص می کنن. بعد از این تعریف ، شما در هر جای برنامه می تونید با استفاده از روال setlength طول آرایه رو مشخص کنید و یا تغییرش بدید. مثلا قطعه کد زیر رو در نظر بگیرید:
کد:
var
myarray : array of integer ;
i , n : integer ;
begin
readln ( n ) ;
setlength ( myarray , n ) ;
for i := 0 to n - 1 do
myarray [ i ] := i ;
.
.
.
myarray := nil ;
end .
این قطعه کد آرایه ای به طول n تعریف و عناصرش رو مقدار دهی می کنه. در آخر برنامه هم با تهی کردن آرایه فضای اختصاص یافته رو آزاد می کنه. وقتی آرایه تهی می شه در واقع اطلاعات و داده های ذخیره شده از بین می ره. اما خود آرایه هنوز پابرجاست. کافیه با روال setlength دوباره طولش رو مشخص و ازش استفاده کنید. مثل قطعه کد زیر:
کد:
setlength ( myarray , 5 ) ;
for i := 0 to 4 do
myarray [ i ] := i ;
myarray := nil;
setlength ( myarray , 10 ) ;
for i := 0 to 9 do
writeln ( myarray [ i ] ) ;
ابتدا طول آرایه 5 تعیین می شه و همه عناصر با شماره اندیس متناظرشون مقدار دهی می شن. اما تهی کردن آرایه همه داده ها رو حذف می کنه. وقتی مجددا طول آرایه 10 تعیین می شه ، همه عناصر به صورت پیش فرض با صفر مقداردهی می شن. در نتیجه خروجی برنامه فقط ده تا صفر نشون می ده.
زمانی که از آرایه پویا استفاده می کنید توجه کردن به نکات زیر ضروریه:
1- شماره اندیس آرایه پویا همیشه از صفر شروع می شه.
2- برای تغییر دادن طول آرایه تنها کافیه روال setlength رو مجددا فراخوانی کنیم.
3- اگه با روال setlength طول آرایه رو کوچکتر کنیم ، عناصر اضافی از انتهای آرایه حذف می شن.
4- اگه با روال setlength طول آرایه رو بزرگتر کنیم ، عناصری با مفدار صفر به انتهای آرایه اضافه می شن.
5- آرایههای دینامیکی همیشه مبتنی بر صفر می باشند.
6- شما میتوانید آرایههای دینامیکی را قبل از رسیدن به ترک قلمرو از حافظه خارج کنید:
کد:
MyFlexibleArray := nil;
نکته: مقدار حافظهای که در اختیار آرایه قرار میگیرد، به طول آرایه ونوع عناصر آن بستگی دارد. به عنوان مثال اگر آرایهای از نوع صحیح به طول 10 داشته باشیم 4*10 بایت حافظه به آن اختصاص مییابد.
فشردهسازی آرایهها:
در دلفی شما هنگامی که ساختار خود را تعیین کردید میتوانید با استفاده از کلمه کلیدی packed اطلاعات ذخیره شده خود را متراکم کنید:
کد:
type TNumbers = packed array[1..100] of Real;
نکته: استفاده از packed سرعت دسترسی به اطلاعات را کند میکند. در مورد آرایهای از کاراکترها این مورد سازگارتر میباشد.
آرایههای چند بعدی دینامیکی:
برای تعریف آرایههای چند بعدی دینامیکی، تنها کافی است ...array of را در ساختار خود تکرار کنید. به طور مثال:
کد:
type
TMessageGrid = array of array of string;
var
Msgs: TMessageGrid;
ارایه های 2 بعدی:
ارایه های 2 بعدی را میتوان ماتریس نامید زیرا دارای سطر و ستون میباشد و ابتدا سطر و سپس ستون قرار میگیرد.تعریف یک آرایه دو بعدی از رشتهها می باشد. سپس باید به آرایه خود فضا نسبت داد:
کد:
SetLength(Msgs, I, J);
شما میتوانید آرایههای چند بعدی دینامیکی خود را به صورت غیر مستطیلی (Not Rectangular) ایجاد کنید. ابتدا رویه SetLength را صدا زده و پارامتر بعد اول را بدهید:
کد:
var
Ints: array of array of Integer;
SetLength(Ints, 10);
ما 10 سطر به آرایه خود اختصاص دادیم. از این پس، شما می توانید ستونهای خود را در هر زمان (با اندازههای مختلف) تخصیص دهید:
کد:
SetLength(Ints[2], 5);
آرايه ها مي توانند چندين بعد داشته باشند.آرايه هاي دو بعدي خيلي مرسومند.بيشتر از دو بعد زياد استفاده نمي شود چون كنترل آن سخت مي شه
با اين وجود دلفي توانايي ايجاد آرايه تا شصت بعد رو هم داره.آرايه چند بعدي به اين صورت تعريف مي شه
کد:
Var Num:[MinIndex..MaxIndex,MinIndex .. MaxIndex,...]Of Integer
حال يك مثال از آرايه د بعدي مي زنم چاپ جدول ضرب
کد:
Var
N1[1..10,1..10] Of Integer;
I,J:Integer
Begin
For i:=1 to 10 Do
For j:=1 to 10 Do Begin
N1 [i,j]:=i*j ;
Form1.Canvas.TextOut(i*20, j*20, inttostr(N1[i, j]));
End;End;
در تنظيم نوع آرايه مي توان از مجموعه و ركورد و حتي آرايه ي ديگر استفاده كرد
برای دسترسی صریعتر به مقادیر داخل ارایه ها یا انجام عملیاتهایی مانند جستجو و ... میبایستی ارایه را مرتب سازی کرد یکی از این روشها
آرایه ها در دلفی
برای تعریف متغییرها ما به این صورت عمل میکردیم
با این کار مقداری از حافظه برای a رزرو میشد تا مقدار عددی در ان قرار گیرد اما اگر بخواهیم 10 عدد را نگهداری کنیم چه؟ تعریف 10 متغییر؟ اگر بخواهیم 1000 عدد را نگهداری کنیم چه؟دلفی کار را اسان کرده است استفاده از ارایه به ما این امکان را میدهد تا برای 1000 متغییر 1 نام تعریف کرده و با استفاده از شماره ان عنصر به ان دستیابی پیدا کنیم اعضای یک ارایه در حافظه در مجاور هم قرار میگیرند و به اسانی میتوان در هر قسمت اطلاعات را وارد کرد یا خواند
دلفی به ما امکان می دهد آرایههایی از هر نوع متغییری را ایجاد کنیم. برای تعریف آرایه به صورت زیر عمل میکنیم:
کد:
var
array[indexType1, ..., indexTypen] of baseType;
در این تعریف برای نامگذاری آرایه، از قانون نامگذاری متغییرها استفاده میکنیم و مقدار اولیه را نیز درون یک جفت کروشه قرار می دهیم.
نکته: شما می توانید به جای استفاده از کروشه [] از ترکیب پرانتز نقطه استفاده کنید:
کد:
d(.i.):= 3 + i; // Equivalent d[i]:= 3 + i;
نکته: وقتی که شما یک آرایه را تعریف می کنید احتیاجی ندارید که به آن مقدار کمترین یا بیشترین بدهید:
کد:
var
A : array [Boolean] of integer;
begin
A[True] := 50;
A[False] := 100;
end;
نکته: توابع Low و High کرانهای پایین وبالای یک متغییر آرایهای یا نوعی یا ترتیبی را بر میگردانند:
کد:
for I := 0 to High(X) do S := S + X[I];
آرایههای ثابت:
آرایه های ثابت می توانند توسط ساختار ثابت نوع دلفی تعریف شود. نوع ثابت که همیشه با عبارت Const تعریف می شود، نه تنها مانع تغییر مقدار پارامتر می شود، بلکه کدهای بهینه بیشتری برای رشتهها و رکوردهای رد شده به توابع تولید می کند. ما هنگامی از این نوع استفاده می کنیم که نخواهیم مقدار رد شده به یک تابع تغییر کند.
کد:
type
TDay = (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday);
const
DayNames : array [TDay] of String[9] = ('Sunday', 'Monday', 'Tuesday',
'Wednesday', 'Thursday',
'Friday', 'Saturday');
var
Today : TDay;
begin
Today := TDay(DayOfWeek(Date) - 1);
ShowMessage('Today is ' + DayNames[Today] + '!');
end;
آرایههای دینامیکی:
آرایه ایستا در زمان تعریف طول مشخصی داره و نمی شه طولش رو در برنامه تعیین کرد. این نقص در آرایه پویا وجود نداره. یعنی می شه طول آرایه پویا رو در هر جای برنامه تعیین کرداین
آرایههای دینامیکی، آرایههای تحلیلی پویایی هستند که ابعاد آنها موقع کامپایل شدن شناخته شده نیست. برای اعلان آنها کافی است یک آرایه بدون بعد تعریف کنید:
برای تعریف آرایه پویای یک بعدی باید از روش زیر استفاده کنید:
کد:
name : array of type ;
که name و type به ترتیب اسم و نوع آرایه رو مشخص می کنن. بعد از این تعریف ، شما در هر جای برنامه می تونید با استفاده از روال setlength طول آرایه رو مشخص کنید و یا تغییرش بدید. مثلا قطعه کد زیر رو در نظر بگیرید:
کد:
var
myarray : array of integer ;
i , n : integer ;
begin
readln ( n ) ;
setlength ( myarray , n ) ;
for i := 0 to n - 1 do
myarray [ i ] := i ;
.
.
.
myarray := nil ;
end .
این قطعه کد آرایه ای به طول n تعریف و عناصرش رو مقدار دهی می کنه. در آخر برنامه هم با تهی کردن آرایه فضای اختصاص یافته رو آزاد می کنه. وقتی آرایه تهی می شه در واقع اطلاعات و داده های ذخیره شده از بین می ره. اما خود آرایه هنوز پابرجاست. کافیه با روال setlength دوباره طولش رو مشخص و ازش استفاده کنید. مثل قطعه کد زیر:
کد:
setlength ( myarray , 5 ) ;
for i := 0 to 4 do
myarray [ i ] := i ;
myarray := nil;
setlength ( myarray , 10 ) ;
for i := 0 to 9 do
writeln ( myarray [ i ] ) ;
ابتدا طول آرایه 5 تعیین می شه و همه عناصر با شماره اندیس متناظرشون مقدار دهی می شن. اما تهی کردن آرایه همه داده ها رو حذف می کنه. وقتی مجددا طول آرایه 10 تعیین می شه ، همه عناصر به صورت پیش فرض با صفر مقداردهی می شن. در نتیجه خروجی برنامه فقط ده تا صفر نشون می ده.
زمانی که از آرایه پویا استفاده می کنید توجه کردن به نکات زیر ضروریه:
1- شماره اندیس آرایه پویا همیشه از صفر شروع می شه.
2- برای تغییر دادن طول آرایه تنها کافیه روال setlength رو مجددا فراخوانی کنیم.
3- اگه با روال setlength طول آرایه رو کوچکتر کنیم ، عناصر اضافی از انتهای آرایه حذف می شن.
4- اگه با روال setlength طول آرایه رو بزرگتر کنیم ، عناصری با مفدار صفر به انتهای آرایه اضافه می شن.
5- آرایههای دینامیکی همیشه مبتنی بر صفر می باشند.
6- شما میتوانید آرایههای دینامیکی را قبل از رسیدن به ترک قلمرو از حافظه خارج کنید:
کد:
MyFlexibleArray := nil;
نکته: مقدار حافظهای که در اختیار آرایه قرار میگیرد، به طول آرایه ونوع عناصر آن بستگی دارد. به عنوان مثال اگر آرایهای از نوع صحیح به طول 10 داشته باشیم 4*10 بایت حافظه به آن اختصاص مییابد.
فشردهسازی آرایهها:
در دلفی شما هنگامی که ساختار خود را تعیین کردید میتوانید با استفاده از کلمه کلیدی packed اطلاعات ذخیره شده خود را متراکم کنید:
کد:
type TNumbers = packed array[1..100] of Real;
نکته: استفاده از packed سرعت دسترسی به اطلاعات را کند میکند. در مورد آرایهای از کاراکترها این مورد سازگارتر میباشد.
آرایههای چند بعدی دینامیکی:
برای تعریف آرایههای چند بعدی دینامیکی، تنها کافی است ...array of را در ساختار خود تکرار کنید. به طور مثال:
کد:
type
TMessageGrid = array of array of string;
var
Msgs: TMessageGrid;
ارایه های 2 بعدی:
ارایه های 2 بعدی را میتوان ماتریس نامید زیرا دارای سطر و ستون میباشد و ابتدا سطر و سپس ستون قرار میگیرد.تعریف یک آرایه دو بعدی از رشتهها می باشد. سپس باید به آرایه خود فضا نسبت داد:
کد:
SetLength(Msgs, I, J);
شما میتوانید آرایههای چند بعدی دینامیکی خود را به صورت غیر مستطیلی (Not Rectangular) ایجاد کنید. ابتدا رویه SetLength را صدا زده و پارامتر بعد اول را بدهید:
کد:
var
Ints: array of array of Integer;
SetLength(Ints, 10);
ما 10 سطر به آرایه خود اختصاص دادیم. از این پس، شما می توانید ستونهای خود را در هر زمان (با اندازههای مختلف) تخصیص دهید:
کد:
SetLength(Ints[2], 5);
آرايه ها مي توانند چندين بعد داشته باشند.آرايه هاي دو بعدي خيلي مرسومند.بيشتر از دو بعد زياد استفاده نمي شود چون كنترل آن سخت مي شه
با اين وجود دلفي توانايي ايجاد آرايه تا شصت بعد رو هم داره.آرايه چند بعدي به اين صورت تعريف مي شه
کد:
Var Num:[MinIndex..MaxIndex,MinIndex .. MaxIndex,...]Of Integer
حال يك مثال از آرايه د بعدي مي زنم چاپ جدول ضرب
کد:
Var
N1[1..10,1..10] Of Integer;
I,J:Integer
Begin
For i:=1 to 10 Do
For j:=1 to 10 Do Begin
N1 [i,j]:=i*j ;
Form1.Canvas.TextOut(i*20, j*20, inttostr(N1[i, j]));
End;End;
در تنظيم نوع آرايه مي توان از مجموعه و ركورد و حتي آرايه ي ديگر استفاده كرد