آرایه ها ورشته ها در پاسکال
تاکنون برای ذخیره داده ها، از متغیرهایی از نوع char,boolean,real,integer استفاده کردیم، که هر کدام یک سلول حافظه را اشغال می کردند.
اما همیشه، تعریف این گونه متغیرها جوابگوی نیازهای برنامه نویسی نیست.
به عنوان مثال: فرض کنید، می خواهیم 10 مقدار صحیح را در حافظه نگهداری کنیم. یک روش اینست که، 10 متغیر از نوع صحیح تعریف کنیم و هر مقدار را در یک متغیر قرار دهیم. شاید این روش برای 10 عدد مطلوب باشد ولی اگر بخواهیم 100 عدد صحیح را ذخیره کنیم، آیا تعریف 100 متغیر در برنامه، کار معقول و پسندیده ای است؟
در این گونه موارد، باید از متغیرهای دیگری به نام متغیرهای اندیس دار یا آرایه استفاده کرد.
در این صورت، در مثال بالا، برای 100 مقدار صحیح، فقط یک نام انتخاب می کنیم و هر مقدار را یک عنصر می نامیم و برای دستیابی به هر عنصر از اندیس استفاده می کنیم.
عناصر متغیر اندیس دار در محلهای متوالی حافظه و تحت نظام خاصی ذخیره می شوند. به کمک این نظام، می توان در هر یک از محلها، اطلاعاتی را قرار داد و به هر یک از عناصر آرایه دستیابی داشت.
نکته: از ابن به بعد، متغیر اندیس دار را آرایه می نامیم.
نکته: نامگذاری برای آرایه ها از قانون نامگذاری متغیرها تبعیت می کند.
مثال: متغیر اندیس دار 5 عنصری

نوع زیر بازه
می دانیم که نوع integer، اعداد صحیح بین 32768- و 32767 را شامل می شود.
حال می توانیم نوعی تعریف کنیم که فقط بخشی از این بازه را در بر گیرد.
انواعی که بخشی از انواع اصلی را شامل می شوند، انواع زیر بازه نام دارند.
برای تعریف زیر بازه به صورت زیر عمل می کنیم.
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
Type
کران بالا..کران پایین=نام نوع زیر بازه
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
نکته: در تعریف نوع زیر بازه، انتخاب نام نوع زیر بازه، مثل انتخاب نام متغیرهاست.
نکته: کران پایین، حداقل مقداری را که نوع زیر بازه می تواند بپذیرد، مشخص می کند و کران بالا، حداکثر مقداری است که نوع زیر بازه می تواند بپذیرد.
نکته: پس از تعریف نوع زیر بازه، باید متغیرهایی از نوع زیر بازه تعریف شود و از آنها استفاده گردد. همانطور که متغیری از نوع integer می تواند مقادیر 32768- تا 32767 را بپذیرد، فقط می تواند مقادیر بین کران پایین و رکان بالا را بپذیرد.
تعریف آرایه در پاسکال
آرایه را در پاسکال به صورت زیر می توان تعریف کرد:
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
نام آرایه: array[نوع اندیس] of نوع عناصر آرایه
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
نکته: برای نامگذاری آرایه از قانون نامگذاری برای متغیرها استفاده می کنیم.
نکته: array کلمه کلیدی پاسکال است.
نکته: نوع اندیس می تواند کاراکتری،منطقی،شمارشی و زیر بازه باشد.
نکته: انواع real,integer نمی توانند، به عنوان نوع اندیس انتخاب شوند.
نکته: عناصر آرایه می توانند از هر نوعی باشند.
مثال: تعریف آرایه هایی از نوع صحیح و اعشاری
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
var
x: array [1..5] of integer;
y: array [4..8] of real;
m: array [-4..3] of real;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
در این مثال:
آرایه x از نوع صحیح
آرایه های y,m از نوع اعشاری تعریف شده اند.
نوع اندیس این آرایه ها، زیر بازه است. شیوه ذخیره و دستیابی به عناصر در شکلهای پایین آمده است.

نکته: اعدادی که در جلوی نام آرایه، در داخل [] آمده اند، اندیس آرایه نام دارند.
اندیس آرایه ها از تعریف نوع اندیس مشخص می شوند.
آرایه ها را در پاسکال، به روش دیگری نیز می توان تعریف کرد. در این روش، ابتدا باید نوعی به نام نوع آرایه ایجاد کرد و سپس متغیری از نوع آرایه را تعریف کرد.(مثل تعریف نوع زیر بازه).
برای ایجاد نوع آرایه به صورت زیر عمل می کنیم:
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
type
نام نوع آرایه = array [نوع اندیس] of نوع عناصر آرایه
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
نکته: انتخاب نام نوع آرایه، مثل انتخاب نام متغیرهاست.
نکته: نوع اندیس، مشخص می کند که اندیس آرایه چه مقادیری را می پذیرد.
نکته: عناصر آرایه می توانند هر یک از انواع موجود در پاسکال باشند.
مثال: تعریف نوع آرایه و تعریف متغیر هایی از نوع آرایه.
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
type
iuss1 = array [1..5] of integer;
iuss2 = array [-5..5] of real;
var
y : iuss1;
x : iuss2;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
در این مثال، دو نوع آرایه به نامهای iuss1,iuss2 ایجاد شدند و سپس دو متغیر به نامهای x,y به ترتیب iuss2,iuss1 تعریف شده اند.
نکته: قبلا در مورد ساختار برنامه پاسکال، گفته شد که ابتدا، ثوابت و سپس متغیرها تعریف می شوند. چنانچه در برنامه، نوع جدیدی مثل زیر بازه یا نوع آرایه ایجاد می شوند، ترتیب انها به صورت زیر خواهد بود:
تعریف برچسبها،تعریف ثوابت،تعریف انواع جدید،تعریف متغیرها
حافظه مورد نیاز آرایه ها
مقدار حافظه ای که در اختیار آرایه قار می گیرد، به طول آرایه و نوع عناصر آن بستگی دارد.
به عنوان مثال، اگر آرایه ای از نوع صحیح و به طول 10 داشته باشیم، 20=2×10 بایت حافظه به آن اختصاص می یابد.( یادتون هست که اعداد صحیح 2 بایت از حاظه رو اشغال می کردند...)
دستور uses
با استفاده از این دستور می توان از برنامه هایی که قبلا نوشته شدند و ر پاسکال وجود دارند، استفاده کرد.
هر یک از این برنامه ها در پاسکال، واحد(unit) نامیده می شوند.
هر واحد حاوی زیر برنامه هایی است که کار خاصی را انجام می دهند.
یکی از این واحدها، crt است که زیر برنامه های مفیدی راجع به صفحه کلید و صفحه نمایش دارد.
در اینجا فقط شیوه استفاده از دستور uses را مطرح می کنیم تا از زیر برنامه هایی مثل clrscr استفاده کنیم.
زیر برنامه clrscr برای پاک کردن صفحه خروجی به کار می رود.
دستور uses برای استفاده ز واحد crt به صورت uses crt مورد استفاده قرار می گیرد.
نکته: اگر هنگام استفاده از آرایه، اندیس آرایه از حد تعریف شده تجاوز کند، در پاسکال استاندارد، پیام خطایی ظاهر می شود ولی در توربو پاسکال در حالت عادی، پیام خطایی صادر نمی گردد.
***برای اینکه در توربو پاسکال، کامپایلر خروج از مرز آرایه را کنترل کند و پیام خطایی را صادر نماید، باید دستور زیر را بعد از دستور program تایپ کنید.
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
{$R+}
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
این نوع دستورات را راهنمای کامپایلر می گویند.
مرتب سازی آرایه ها
مرت سازی به روشهای گوناگونی انجام می شود.
مرتب سازی ممکن است، به طور صعودی یا نزولی انجام شود. در مرتب سازی صعودی، عناصر از کوچک به بزرگ قرار می گیرند و در مرتب سازی نزولی، عناصر، از بزرگ به کوچک قرار می گیرند.
در زیر نمونه ای از این دو شیوه مرتب سازی آمده است:
ترتیب صعودی 30 25 19 11 9 4
ترتیب نزولی 9 12 18 25 30 50
مرتب سازی حبابی (bubble sort)
در این روش، دو عنصر متوالی با یکدیگر مقایسه می شوند، چنانچه اولی از دومی بزرگتر باشد، جای آنها در آرایه عوض می شود. وقتی یک بار تمام عناصر، دو به دو با هم مقایسه شدند، بزرگترین عنصر به انتهای آرایه می رود. دفعه بعد که عناصر آرایه دو به دو با هم مقایسه می شوند، دومین عدد از نظر بزرگی، قبل از بزرگترین عنصر، در انتهای آرایه قرار می گیرد. این روند تا مرتب سازی نهایی ادامه می یابد.
مثال:
عناصر اولیه 3 4 6 9
مرحله اول 9 3 4 6
مرحله دوم 9 6 3 4
مرحله سوم 9 6 4 3
در مرحله اول 9 با 6 مقایسه شده، جای آنها عوض شد.
سپس 9 با 4 مقایسه شد، جای آنها عوض شد.
سپس 9 با 3 هم مقایسه شد و جای آنها عوض شد و 9 در انتهای آرایه قرار گرفت. این روند ادامه یافت تا عناصر آرایه مرتب شدند.
جستجو در آرایه های مرتب
با جستجوی ترتیبی، می توان عناصر مورد نظر را در آرایه جستجو کرد. در این روش، مقدار مورد نظر، به ترتیب با همه عناصر آرایه مقایسه می شود.
اگر آرایه مرتب باشد، روش دیگری برای جستجو در آن وجود دارد. این روش را باینری(دو دویی) گویند. در این روش، وسط آرایه پیدا میشود و مقدار مورد نظر، با عنصر وسط آرایه مقایسه می گردد. اگر با عنصر وسط آرایه برابر باشد، مقدار مورد نظر پیدا شده است و عمل جستجو خاتمه می یابد.
چنانچه با عنصر وسط برابر نباشد، یا کوچکتر از آن است و یا بزرگتر از آن، در این صورت، آرایه از وسط به دو بخش تقسیم می شود. اگر مقدار مورد جستجو کمتر از عنصر وسط باشد، جستجو در بخش سمت چپ انجام می شود و گرنه در بخش سمت راست انجام می گیرد.
برای جستجو در بخشی از آرایه نیز، مثل آرایه نیز، مثل آرایه کامل عمل می شود، و این روند ادامه می یابدو هر بار آرایه به دو بخش تقسیم می شود تا مقدار مورد نظر پیدا شود یا حد پایینی آرایه از حد بالایی آرایه بزرگتر شود.
آرایه های نوع کاراکتری
بسیاری از آرایه ها، از نوع عددی هستند، ولی استفاده از آرایه های نوع کاراکتری نیز امکان پذیر است.
با استفاده از آرایه ای از کاراکترها و متغیرهایی از نوع رشته ای، می توان اطلاعات رشته ای، مثل نام دانشجویان را ذخیره کرد.
مثال: دستورات زیر را در نظر بگیرید:
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
type
chararray = array [1..20] of char ;
str = string [20]
var
firstname : chararray ;
lastname : str ;
s : string ;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
در این دستورات، نوع chararray به صورت آرایه 20 کاراکتری تعریف شد و نوع str رشته ای 20 کاراکتری است.
متغیر firstname از نوع chararray است و می تواند تا 20 کاراکتر را ذخیره کند.
هر کاری که با آرایه های عددی انجام می شود، با این آرایه نیز امکان پذیر است.
متغیر lastname از نوع str است و رشته ای است که تا 20 کاراکتر را نگهداری می کند.
s متغیری است از نوع string و تا 255 کاراکتر را ذخیره می کند.
تفاوت دو رشته lastname و firstname
1. با دستورات read,readln,write,writeln می توان رشته ای را در lastname قرار داد یا محتویات آن را چاپ کرد. در حالی که برای خواندن و نوشتن رشته محتویات firstname باید از حلقه تکرار استفاده کرد.
2. رشته lastname را می توان با عملگرهای رابطه ای با رشته های دیگر مقایسه کرد. در حالی که در مورد firstname این طور نیست.
3. رشته lastname را در دستور انتسابی مثل 'lastname:='ali می توان به کار برد.
4. طول رشته lastname قابل تغییر است و تعداد کاراکترهایی که در آن قرار می گیرد، طول آنرا مشخص می کند.(رشته s نیز که در مثال آمده همینطور است)
5. به هر یک از کاراکترهای firstname و lastname می توان دست یافت.
مثلا [lastname[1 و [firstname[1 ، اولین عنصر هر کدام از رشته ها را بازیابی می کنند.
آرایه هایی با اندیس کاراکتری
اندیس آرایه هایی که تاکنون مورد استفاده قرار دادیم، از نوع صحیح بودند. اما می توان آرایه هایی تعریف کرد که اندیس آنها از نوع کاراکتری باشند.
مثال:
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
var
sample : array ['A'..'E'] of char ;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
این دستور، آرایه ای به نام sample با 5 عنصر (A تا E) تعریف می کند که عناصر آن از نوع کاراکتری اند.
عناصر این آرایه عبارتند از:
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
sample['E'],sample['D'],sample['C'],sample['B'],sample['A']
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
آرایه های چند بعدی
آرایه هایی که تاکنون به کار گرفته شده اند، تعریفشان طوری بود که برای دسترسی به عناصرشان، از یک اندیس استفاده می شد.
این آرایه ها را آرایه های یک بعدی می نامیم.
اما آرایه هایی وجود دارند که برای دستیابی به عناصرشان، باید از بیش از یک اندیس استفده کرد؛ اینها را آرایه های چند بعدی گویند.
مثلا، برای دستیابی به عنصری از جدول ضرب از دو اندیس سطر و ستون استفاده می شود.
نوع آرایه های چند بعدی را می توان به صورت زیر تعریف کرد:
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
type
نام نوع آرایه = array [اندیس1,اندیس 2,...,nاندیس] of نوع عناصر
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
پس از تعریف نوع آرایه چند بعدی باید متغیری از نوع آرایه نعریف و استفاده کنیم:
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
var
نوع آرایه:نام آرایه
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
آرایه هایی که دو اندیس داشته باشند، دو بعدی، آرایه هایی که سه اندیس داشته باشند، سه بعدی و آرایه هایی که n اندیس داشته باشند، آرایه های nبعدی می نامیم.
آرایه های دو بعدی
آرایه های دو بعدی، متداولترین نوع آرایه هاست.
این آرایه ها را می توان جدول یا ماتریس نامید.
در هر آرایه دو بعدی، بعد اول را سطر و بعد دوم را ستون می نامند.
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
type
twodim = array [1..3 , 1..5] of integer;
var
x: twodim;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->

می توان بدون تعریف نوع آرایه نیز، متغیر آرایه را تعریف کرد. در این صورت آرایه X به صورت زیر تعریف می شود:
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
var
x: array [1..3 , 1..5] of integer;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
حافظه آرایه های دو بعدی
آرایه های دو بعدی در پاسکال، در محلهای متوالی حافظه قرار می گیرند تا دسترسی به عناصر آنها ساده تر باشد.
آرایه های دو بعدی به صورت سطری ذخیره می شوند. (یعنی اول سطر1، بعد سطر2، سطر3 و... ذخیره میشه) این روش ذخیره را روش سطری می گویند.
کامپایلر برای دستیابی به هر یک از عناصر آرایه، تفاوت مکان(فاصله) آن عنصر را از اولین عنصر آرایه محاسبه می کند.
برای انجام این محاسبات، کامپایلر باید اندازه هر عنصر آرایه بر حسب بایت و تعداد عناصر موجود در هر سطر را بداند. هر یک از این دو مقدار، از تعریف آرایه مشخص می شود.
پردازش آرایه های دو بعدی
عناصر آرایه های دو بعدی به سه روش پردازش کرد:
1. روش تصادفی
2. روش سطری
3. روش ستونی
برای پردازش سطری و ستونی آرایه های دو بعدی، به دو حلقه تو در تو نیاز هست.
در پردازش سطری، شمارنده حلقه بیرونی، اندیس سطر و شمارنده حلقه داخلی، اندیس ستون است.
در پردازش ستونی، شمارنده حلقه بیرونی، اندیس ستون و شمارنده حلقه داخلی، اندیس سطر است.
فرض کنید آرایه x دارای mسطر و nستون است. برای پردازش سطری این آرایه از حلقه زیر استفاده می شود:
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
for i:=1 to m do
for j:=1 to n do
x[i,j]
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
برای پردازش ستونی این آرایه می توان از حلقه تکرار زیر استفاده کرد:
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
for j:=1 to n do
for i:=1 to m do
x[i,j]
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
آرایه های سه بعدی
تعداد ابعاد در پاسکال، محدودیتی ندارد ولی آرایه های دو بعدی و سه بعدی کاربرد بیشتری دارند.
در آرایه های سه بعدی، برای دسترسی به هر یک از عناصر، از سه اندیس طول-عرض-ارتفاع استفاده می شود.
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
type length=1..2
width=1..3
height=1..2
tharray=array[length,width,height] of integer;
var
arr:tharray
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
در دستورات بالا، ابتدا نوع آرایه tharray با سه بعد تعریف گردید و سپس آرایه arr از نوع tharray تعریف شد. این آرایه حاوی 2×3×2 عنصر است.
اندیسهای عناصر آرایه عبارتند از:
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
arr[1,1,1] arr[2,1,1]
arr[1,1,2] arr[2,1,2]
arr[1,2,1] arr[2,2,1]
arr[1,2,2] arr[2,2,2]
arr[1,3,1] arr[2,3,1]
arr[1,3,2] arr[2,3,2]
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
آرایه های فشرده
در پاسکال، می توان آرایه ها را طوری ذخیره کرد که حافظه کمتری اسغال کند، این آرایه ها را آرایه های فشرده گویند.
برای این منظور از دستور packed array استفاده می کنیم.
دستور زیر، آرایه فشرده ای به نام sample را که دارای 2سطر و 5ستون است تعریف می کند:
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
var
sample: packed array [1..2,1..5] of integer;
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
با استفاده از دستور pack می توان آرایه غیر فشرده را به آرایه فشرده تبدیل کرد و با استفاده از دستور unpack می توان آرایه فشرده را به آرایه غیر فشرده تبدیل کرد.
با اجرای این دستور، محتویات آرایه غیر فشرده، با شروع از اندیس مشخص شده، به آرایه فشرده منتقل می شود.
pack (نام آرایه فشرده,اندیس,نام آرایه غیر فشرده);
مثال:
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
var
ar1:array [1..15] of char;
ar2:packed array [1..15] of char;
pack (ar1,1,ar2);
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
با اجرای دستورات بالا،
آرایه غیر فشرده ar1 با 15 عنصر و آرایه فشرده ar2 نیز با 15 عنصر تعریف می شوند.
با اجرای دستور pack، عناصر آرایه ar1 با شروع از اولین عنصر به آرایه فشرده ar2 منتقل می شوند، به طوری که اولین عنصر ar1 در اولین محل ar2، دومین عنصر ar1 در دومین محل ar2 و... قرار می گیرند.
دستور unpack به صورت زیر به کار می رود:
unpack (اندیس,نام آرایه غیر فشرده,نام آرایه فشرده);
با اجرای این دستور، عناصر آرایه فشرده، با شروع از اندیس مشخص شده، به آرایه غیر فشرده منتقل می شود.
مثال:
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
var ar1:packed [1..20] of char;
ar2:arraye [1..20] of char;
unpack (ar1,ar2,10);
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
با اجرای دستورات بالا،
آرایه ar1 به صورت فشرده و ar2 به صورت غیر فشرده تعریف می شود.
دستور unpack موجب می شود تا عناصر آرایه ar1 در آرایه ar2 با شروع از محل 10 این آرایه قرار می گیرند. یعنی عنصر اول آرایه ar1 در محل 10 عنصر ar2 و عنصر دوم آرایه ar1 در محل 11 آرایه ar2 و... قرار می گیرند.
انتساب آرایه ها به یکدیگر
در پاسکال می توان محتویات کل آرایه را در آرایه دیگری کپی کرد.
برای این کار از دستور انتساب استفاده می شود.
مثلا اگر x,y دو آرایه باشند که نوع آنها یکسان باشد و ابعاد آنها برابر، با دستور زیر می توان محتویات y را در آرایه x قرار داد.
<-- Iran Universities Software Students [iuss.ir] -->
<-- Start Code -->
x:=y
<-- End Code -->
<-- Birjand University Software Students [buss.ir] -->
*********************
خوب. آنچه که خواندید قستهای مهم و کلیدی از کتاب "برنامه نویسی به زبان پاسکال" نوشته "مهندس عین الله جعفر نژاد قمی" بود که به طور خلاصه تقدیم گردید.
ما از ارائه این متن ، تنها قصدی که داریم، آموزش مطالب بود و هیچ قصد خاص دیگری نداشتیم و نخواهیم داشت.
با تشکر