آرایه ها
آرایه، نوعی متغیر است که لیستی از آدرسهای مجموعهای از دادههای هم نوع را در خود ذخیره میکند. تعریف چندین متغیر از یک نوع برای هدفی یکسان بسیار خسته کننده است. مثلاً اگر بخواهید صد متغیر از نوع اعداد صحیح تعریف کرده و از آنها استفاده کنید. مطمئناً تعریف این همه متغیر بسیار کسالت آور و خسته کننده است. اما با استفاده از آرایه میتوان همه آنها را در یک خط تعریف کرد. در زیر راهی ساده برای تعریف یک آرایه نشان داده شده است :
datatype[] arrayName = new datatype[length];
Datatype نوع دادههایی را نشان میدهد که آرایه در خود ذخیره میکند. کروشه که بعد از نوع داده قرار میگیرد و نشان دهنده استفاده از آرایه است.arrayName که نام آرایه را نشان میدهد. هنگام نامگذاری آرایه بهتر است که نام آرایه نشان دهنده نوع آرایه باشد. به عنوان مثال برای نامگذاری آرایهای که اعداد را در خود ذخیره میکند از کلمه number استفاده کنید. طول آرایه که به کامپایلر میگوید شما قصد دارید چه تعداد داده یا مقدار را در آرایه ذخیره کنید. از کلمه کلیدی new هم برای اختصاص فضای حافظه به اندازه طول آرایه استفاده میشود. برای تعریف یک آرایه که 5 مقدار از نوع اعداد صحیح در خود ذخیره میکند باید به صورت زیر عمل کنیم :
int[] numbers = new int[5];
در این مثال 5 آدرس از فضای حافظه کامپیوتر شما برای ذخیره 5 مقدار رزرو میشود. حال چطور مقادیرمان را در هر یک از این آدرسها ذخیره کنیم؟ برای دسترسی و اصلاح مقادیر آرایه از اندیس یا مکان آنها استفاده میشود.
numbers[0] = 1; numbers[1] = 2; numbers[2] = 3; numbers[3] = 4; numbers[4] = 5;
اندیس یک آرایه از صفر شروع شده و به یک واحد کمتر از طول آرایه ختم میشود. به عنوان مثال شما یک آرایه 5 عضوی دارید، اندیس آرایه از 0 تا 4 میباشد چون طول آرایه 5 است پس 1-5 برابر است با 4. این بدان معناست که اندیس 0 نشان دهنده اولین عضو آرایه است و اندیس 1 نشان دهنده دومین عضو و الی آخر. برای درک بهتر مثال بالا به شکل زیر توجه کنید :
به هر یک از اجزاء آرایه و اندیسهای داخل کروشه توجه کنید. کسانی که تازه شروع به برنامه نویسی کردهاند معمولاً در گذاشتن اندیس دچار اشتباه میشوند و مثلاً ممکن است در مثال بالا اندیسها را از 1 شروع کنند. اگر بخواهید به یکی از اجزائ آرایه با استفاده از اندیسی دسترسی پیدا کنید که در محدوده اندیسهای آرایه شما نباشد با پیغام خطای IndexOutOfRangeException مواجه میشوید و بدین معنی است که شما آدرسی را میخواهید که وجود ندارد. یکی دیگر از راههای تعریف سریع و مقدار دهی یک آرایه به صورت زیر است :
datatype[] arrayName = new datatype[length] { val1, val2, ... valN };
در این روش شما میتوانید فوراً بعد از تعریف اندازه آرایه مقادیر را در داخل آکولاد قرار دهید. به یاد داشته باشید که هر کدام از مقادیر را با استفاده از کاما از هم جدا کنید. همچنین تعداد مقادیر داخل آکولاد باید با اندازه آرایه تعریف شده برابر باشد. به مثال زیر توجه کنید :
int[] numbers = new int[5] { 1, 2, 3, 4, 5 };
این مثال با مثال قبل هیچ تفاوتی ندارد و تعداد خطهای کدنویسی را کاهش میدهد. شما میتوانید با استفاده از اندیس به مقدار هر یک از اجزاء آرایه دسترسی یابید و آنها را به دلخواه تغییر دهید. تعداد اجزاء آرایه در مثال بالا 5 است و ما 5 مقدار را در آن قرار میدهیم. اگر تعداد مقادیری که در آرایه قرار میدهیم کمتر یا بیشتر از طول آرایه باشد با خطا مواجه میشویم. یکی دیگر از راههای تعریف آرایه در زیر آمده است. شما میتوانید هر تعداد عنصر را که خواستید در آرایه قرار دهید بدون اینکه اندازه آرایه را مشخص کنید. به عنوان مثال :
int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
در این مثال ما 10 مقدار را به آرایه اختصاص دادهایم. نکته اینجاست که طول آرایه را تعریف نکردهایم. در این حالت کامپایلر بعد از شمردن تعداد مقادیر داخل آکولاد طول آرایه را تشخیص میدهد. به یاد داشته باشید که اگر برای آرایه طولی در نظر نگیرید باید برای آن مقدار تعریف کنید در عیر این صورت با خطا مواجه میشوید :
int[] numbers = new int[]; //not allowed
یک راه بسیار سادهتر برای تعریف آرایه به صورت زیر است :
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
به سادگی و بدون احتیاج به کلمه کلیدی new میتوان مقادیر را در داخل آکولاد قرار داد. کامپایلر به صورت اتوماتیک با شمارش مقادیر طول آرایه را تشخیص میدهد.
دستیابی به مقادیر آرایه با استفاده از حلقه for
در زیر مثالی در مورد استفاده از آرایهها آمده است. در این برنامه 5 مقدار از کاربر گرفته شده و میانگین آنها حساب میشود:
1: using System; 2: 3: public class Program 4: { 5: public static void Main() 6: { 7: int[] numbers = new int[5]; 8: int total = 0; 9: double average; 10: 11: for (int i = 0; i < numbers.Length; i++) 12: { 13: Console.Write("Enter a number: "); 14: numbers[i] = Convert.ToInt32(Console.ReadLine()); 15: } 16: 17: for (int i = 0; i < numbers.Length; i++) 18: { 19: total += numbers[i]; 20: } 21: 22: average = total / (double)numbers.Length; 23: 24: Console.WriteLine("Average = {0}", average); 25: } 26: }
Enter a number: 90 Enter a number: 85 Enter a number: 80 Enter a number: 87 Enter a number: 92 Average = 86
در خط 7 یک آرایه تعریف شده است که میتواند 5 عدد صحیح را در خود ذخیره کند. خطوط 8 و 9 متغیرهایی تعریف شدهاند که از آنها برای محاسبه میانگین استفاده میشود. توجه کنید که مقدار اولیه total صفر است تا از بروز خطا هنگام اضافه شدن مقدار به آن جلوگیری شود. در خطوط 11 تا 15 حلقه for برای تکرار و گرفتن ورودی از کاربر تعریف شده است. از خاصیت طول (length) ارائه برای تشخیص تعداد اجزای آرایه استفاده میشود. اگر چه میتوانستیم به سادگی در حلقه for مقدار 5 را برای شرط قرار دهیم ولی استفاده از خاصیت طول آرایه کار راحتتری است و میتوانیم طول آرایه را تغییر دهیم و شرط حلقه for با تغییر جدید هماهنگ میشود. در خط 14 ورودی دریافت شده از کاربر به نوع int تبدیل و در آرایه ذخیره میشود. اندیس استفاده شده در number (خط 14) مقدار i جاری در حلقه است. برای مثال در ابتدای حلقه مقدار i صفر است بنابراین وقتی در خط 14 اولین داده از کاربر گرفته میشود اندیس آن برابر صفر میشود. در تکرار بعدی i یک واحد اضافه میشود و در نتیجه در خط 14 و بعد از ورود دومین داده توسط کاربر اندیس آن برابر یک میشود. این حالت تا زمانی که شرط در حلقه for برقرار است ادامه مییابد. در خطوط 20-17 از حلقه for دیگر برای دسترسی به مقدار هر یک از دادههای آرایه استفاده شده است. در این حلقه نیز مانند حلقه قبل از مقدار متغیر شمارنده به عنوان اندیس استفاده میکنیم.
هر یک از اجزای عددی آرایه به متغیر total اضافه میشوند. بعد از پایان حلقه میتوانیم میانگین اعداد را حساب کنیم (خط 22). مقدار total را بر تعداد اجزای آرایه (تعداد عددها) تقسیم میکنیم. برای دسترسی به تعداد اجزای آرایه میتوان از خاصیت length آرایه استفاده کرد. توجه کنید که در اینجا ما مقدار خاصیت length را به نوع double تبدیل کردهایم بنابراین نتیجه عبارت یک مقدار از نوع double خواهد شد و دارای بخش کسری میباشد. حال اگر عملوندهای تقسیم را به نوع double تبدیل نکنیم نتیجه تقسیم یک عدد از نوع صحیح خواهد شد و دارای بخش کسری نیست. خط 24 مقدار میانگین را در صفحه نمایش چاپ میکند. طول آرایه بعد از مقدار دهی نمیتواند تغیر کند. به عنوان مثال اگر یک آرایه را که شامل 5 جز است مقدار دهی کنید دیگر نمیتوانید آن را مثلاً به 10 جز تغییر اندازه دهید. البته تعداد خاصی از کلاسها مانند آرایهها عمل میکنند و توانایی تغییر تعداد اجزای تشکیل دهنده خود را دارند. آرایهها در برخی شرایط بسیار پر کاربرد هستند و تسلط شما بر این مفهوم و اینکه چطور از آنها استفاده کنید بسیار مهم است.