ادامه درس دوم
یکی دیگر از انواع دادهای در زبان C#، آرایهها (Arrays) میباشند. یک آرایه را به عنوان مخزنی برای نگهداری اطلاعات در نظر میگیریم که دارای لیستی از محلهایی است که در آنها اطلاعات ذخیره شده است و از طریق این لیست میتوان به اطلاعات آنها دسترسی پیدا نمود. به هنگام اعلان آرایهها باید نوع، اندازه و تعداد بعد آنها را نیز معین نمود.
مثال 4- آرایهها و عملیات بر روی آنها
using System;
class Array
{
public static void Main()
{
int[] myInts = { 5, 10, 15 };
bool[][] myBools = new bool[2][];
myBools[0] = new bool[2];
myBools[1] = new bool[1];
double[,] myDoubles = new double[2, 2];
string[] myStrings = new string[3];
Console.WriteLine("myInts[0]: {0}, myInts[1]: {1}, myInts[2]: {2}", myInts[0],
myInts[1], myInts[2]);
myBools[0][0] = true;
myBools[0][1] = false;
myBools[1][0] = true;
Console.WriteLine("myBools[0][0]: {0}, myBools[1][0]: {1}", myBools[0][0],
myBools[1][0]);
myDoubles[0, 0] = 3.147;
myDoubles[0, 1] = 7.157;
myDoubles[1, 1] = 2.117;
myDoubles[1, 0] = 56.00138917;
Console.WriteLine("myDoubles[0, 0]: {0}, myDoubles[1, 0]: {1}", myDoubles[0, 0], myDoubles[1, 0]);
myStrings[0] = "Joe";
myStrings[1] = "Matt";
myStrings[2] = "Robert";
Console.WriteLine("myStrings[0]: {0}, myStrings[1]: {1}, myStrings[2]: {2}",
myStrings[0], myStrings[1], myStrings[2]);
}
}
خروجی مثال 4 بصورت زیر است :
myInts[0]: 5, myInts[1]: 10, myInts[2]: 15
myBools[0][0]: True, myBools[1][0]: True
myDoubles[0, 0]: 3.147, myDoubles[1, 0]: 56.00138917
myStrings[0]: Joe, myStrings[1]: Matt, myStrings[2]: Robert
در این مثال انواع مختلفی از آرایهها اعلان شدهاند. در ابتدا یک آرایه تک بعدی، سپس آرایهای دندانهدار و در نهایت نیز یک آرایه دو بعدی در این مثال اعلان شدهاند.
اولین اعلان در این برنامه مربوط به اعلان آرایه تک بعدی myInts میباشد که از نوع int بوده و دارای 3 عضو میباشد که تعداد این اعضا با اعلان چند مقدار در داخل { } معین شده است. همانطور که از این اعلان دریافت میشود، آرایه تک بعدی بصورت زیر تعریف میشود :
type[] arrayName;
که در آن type نوع آرایه و arrayName نام آرایه ایست که تعریف مینمائیم.
اما در ابتدا گفته شد که به هنگام اعلان آرایهها اندازه آنها نیز باید مشخص شود. برای تعیین اندازه آرایه، یعنی تعدا عناصری که آرایه در خود جای میدهد، میتوان به چند روش عمل نمود. اولین و سادهترین روش که در این مثال نیز آورده شده است، تخصیص مقادیری به آرایه در داخل یک زوج { } است. بسته به نوع آرایه، تعداد عناصری که داخل این زوج { } قرار میگیرند، تعداد عناصر آرایه میباشند و مقادیر عناصر آرایه نیز همان مقادیری است که داخل { } قرار گرفته است. به عنوان مثال در مثال 4، اولین آرایه ما دارای 3 عنصر است که مقادیر آنها به ترتیب برابر با 5، 10 و 15 میباشد.
روش دیگر جهت تعیین اندازه آرایه استفاده از روش تعریف کامل آرایه است که به فرم کلی زیر میباشد.
type[] arrayName = new type[n];
که در این تعریف، استفاده از کلمه کلیدی new باعث ایجاد نمونهای جدید از نوع مورد نظر، میشود. n نیز تعداد عناصر آرایه است که میخواهیم آنرا تولید نماییم. در این حالت باید توجه داشت که آرایهای تهی را تولید نمودهایم و هیچ عنصری را در آرایه جای ندادهایم و در برنامه باید آرایه را مقدار دهی نماییم. به مثال زیر توجه کنید.
int[] myArray = new int[15];
این مثال آرایهای تک بعدی از نوع int را با اندازه 15 عنصر تولید مینماید. یعنی این آرایه قادر است تا 15 عنصر از نوع int را در خود ذخیره نماید.
گونه دیگری از آرایهها، آرایههای چند بعدی (Multi Dimensional Arrays) هستند که برای نگهداری اطلاعات از چندین بعد استفاده میکنند و بیشتر برای نگداری جداول و ماتریسها مورد استفاده قرار میگیرند. فرم کلی اعلان این آرایهها بصورت زیر است :
type[ , , … , ] arrayName = new type[n1, n2, …. , nm];
که در آن تعداد ابعاد آرایه با ویرگول مشخص شده و n1 تا nm نیز تعداد عناصر هر یک از ابعاد است. بعنوان مثال تعریف یک آرایه سه بعدی به فرم زیر است :
char[ , , ] charArray = new char[3,5,7];
در این مثال یک آرایه سه بعدی از نوع char تولید کردهایم که ابعاد آن به ترتیب دارای 3، 5 و 7 عنصر میباشند.
نوع دیگری از آرایهها، آرایههای دندانهدار (Jagged Arrays) هستند. این نوع آرایهها تنها در زبان C# وجود دارند و در صرفهجویی حافظه بسیار موثر میباسند. یک آرایه دندانهدار، در حقیقت یک آرایه تک بعدی است که هر یک از اعضای آن خود یک آرایه تک بعدی میباشند. اندازه این عناصر میتواند متفاوت باشد و تفاوت این آرایهها با آرایههای چند بعدی در همین جا نمایان میشود. استفاده از این آرایهها در مواردی کاربرد دارد که نیازی نیست تا تمامی ابعاد آرایه دارای تعداد عناصر مساوی باشند. بعنوان مثال فرض کنید میخواهید آرایهای جهت نگهداری تعداد روزهای ماههای مختلف سال تهیه کنید. در صورتیکه بخواهید از آرایه چند بعدی استفاده نمایید، چون تعداد روزهای تمامی ماههای سال یکسان نیست، مجبورید تا تعداد عناصر تمام بعدهای آرایه را برابر با بزرگترین تعداد روز ماهها، یعنی 31، تعریف نمایید. ولی چون تنها 6 ماه دارای 31 روز میباشند، برای 6 ماه دیگر تعدادی از عناصر آرایه هیچگاه مورد استفاده قرار نمیگیرند و حافظه را به هدر دادهایم. اما در صورتیکه برای این مثال از آرایههای دندانهدار استفاده نماییم، میتوانیم یک آرایه دندانهدار 12 عنصری تعریف نماییم و سپس تعداد عناصر هر یک از اعضای آنرا برابر با تعداد روزهای ماه مورد نظر تعریف کنیم :
با استفاده از آرایه چند بعدی :
int[ , ] monthArray = new int[12,31];
با استفاده از آرایه دندانهدار :
int[][] monthArray = new int[12][];
در تعریف اول که در آن از آرایه چند بعدی استفاده کردیم، مشاهده میکنید که آرایهای دو بعدی تعریف کردهایم که بعد اول آن 12 عضو و بعد دوم آن 31 عضو دارد. این عمل دقیقاً همانند ایجاد یک جدول برای نگهداری روزهای ماههای سال است.
اما در حالت دوم که در آن از آرایه دندانهدار بهره بردهایم، یک آرایه تعریف نمودهایم که بعد اول آن 12 عضو دارد ولی بعد دوم آنرا را تعریف نکردهایم که دارای چند عضو است و هر یک از عناصر بعد اول آرایه میتواند دارای تعداد اعضای متفاوتی باشد که با استفاده از این روش میتوان به هر یک از ماههای سال تعداد روزهای مورد نظر آن ماه را تخصیص داد و فضایی بلا استفاده ایجاد نخواهیم کرد. توجه نمایید که چون تعداد عناصر بعد دیگر این آرایه معین نشده است در برنامه باید این تعداد عنصر را مشخص نماییم :
monthArray[1] = new int[31];
monthArray[10] = new int [30];
مشاهده میکنید که به هر ماه، تعدا عنصر مورد نیاز خود را تخصیص دادهایم. تنها باید به تفاوت اعلان آرایههای دندانهدار با آرایههای چند بعدی توجه نمایید.
دسترسی به عناصر آرایه از طریق اندیس امکان پذیر است. اندیس شماره محل ذخیرهسازی دادههای ما میباشد که با دادن این شماره میتوانیم به داده مورد نظر دسترسی پیدا کنیم. در C# همانند C و C++ اندیس خانههای آرایه از صفر آغاز میگردد یعنی اولین خانه آرایه دارای شماره صفر است و عناصر بعدی به ترتیب یک واحد به اندیسشان اضافه میگردد. پس شماره اندیس آرایه همیشه یک واحد کمتر از تعداد عناصر آن است، یعنی آرایهای که 10 عضو دارد بزرگترین اندیس خانههایش 9 میباشد. دسترسی به عناصر هر یک از ابعاد آرایه با اندیس امکان پذیر است. معمولاً به بعد اول آرایه سطر و به بعد دوم آن ستون میگوید. مثلاً monthArray[3,7] عنصر واقع در سطر 3 و ستون 7 آرایه را مشخص مینماید.(توجه داشته باشید که اندیس دهی آرایه از صفر آغاز میشود و بعنوان مثال intArray[12] به خانه شماره 12 آرایه اشاره میکند اما فراموش نکنید چون اندیس آرایه از صفر آغاز میشود خانه شماره 12 آرایه، سیزدهمین داده شما را در خود جای میدهد.)
12
11
10
9
8
7
6
5
4
3
2
1
0
اگر شکل فوق را آرایهای تک بعدی تصور نمایید، مشاهده مینمایید که خانه شماره 5 آرایه حاوی اطلاعات مربوط به ششمین داده ورودی شما میباشد.
نکته دیگری که باید در مورد تعریف آرایههای این مثال متذکر شوم در مورد آریههائیست که از نوع string تعریف میشوند. دوستانی که با زبان C کار کردهاند حتماً میدانند که آرایهای از نوع رشتهای در C وجود ندارد و برای نگهداری چندین رشته در یک آرایه باید از آرایه دو بعدی استفاده کرد. در C# این قابلیت فراهم شده تا با استفاده از یک آرایه تک بعدی بتوان چندین رشته را ذخیره نمود بدین صورت که هر یک از عناصر آرایه نک بعدی محلی برای ذخیرهسازی یک رشته است و همانند زبان C نیاز به پردازشهای گاه پیچیده بر روی آرایههای چند بعدی بمنظور کار با رشتهها، وجود ندارد. بعنوان یک توضیح کمی اختصاصی عرض میکنم که در زبانهایی مانند C، در صورتیکه میخواستید چندین رشته را در آرایهای ذخیره کنید تا بتوانید با اندیس به آنها دسترسی داشته باشید، مجبور به تعریف یک آرایه دو بعدی بودید که با استفاده از تنها اندیس اول آرایه میتوانستید به عناصر رشتهای آرایه دسترسی پیدا کنید، اما در C# تنها با استفاده از یک آرایه تک بعدی میتوان همان کار را انجام داد.
string[] stringArray = {"My name is Hadi", "This is C# Persian Blog"}
…..
Console.WriteLine("{0}",stringArray[0]);
…..
همانطور که در این مثال ملاحظه میکنید، آرایهای از نوع رشته تعریف شده و دو عنصر به آن تخصیص داده شده است و در جایی در متن برنامه با استفاده از اندیس از اولین عنصر این آرایه برای نمایش در خروجی استفاده گردیده است. خروجی این برنامه به شکل زیر است :
My name is Hadi
مطلب این درس در اینجا به پایان میرسد. در صورتیکه نیاز دارید تا در مورد عملگرهای زبان C# بیشتر توضیح دهم حتماً ذکر کنید تا در مطلب بعدی توضیح کاملتری در مورد آنها برای شما تهیه کنم. خیلی دوست داشتم که در مورد تمام عملگرهای زبان C# در همین درس توضیح بدهم اما هم فرصت اندک است و هم حجم مطلب این قسمت زیاد میشد و هم اینکه فکر کردم احتمالاً دوستان با این عملگرها آشنایی دارند. نکته دیگری که باید به آن اشاره کنم و اینست که در این سایت سعی شده است تا زبان برنامهنویسی C# به سادگی و به سرعت آموزش داده شود و علت اینکه به برخی از جزئیات تخصصی پرداخته نمیشود نیز همین مطلب میباشد. در آینده در مورد آرایهها بیشتر صحبت میکنم چون عناصر مفید و سودمندی هستند. امید است پس از کامل کردن مطالب مقدماتی در این سایت و با همکاری شما عزیزان بتوانم به مطالب پیشرفتهتری از زبان C# بپردازم. بیان نظرات و پیشنهادات شما چه در زمینه مطالب ارائه شده و چه در زمینه متن ارائه شده به شما از لحاظ سادگی و روانی در درک، مرا در امر بهبود مطالب یاری مینماید.