آرایه ها در سی شارپ
بعد از بررسی عملگرها و ساختارهای کنترلی در این قسمت از آموزش برنامه نویسی سی شارپ قصد بررسی آرایه ها را داریم؛
آرایه ها یک بخش جدانشدنی از زبان های برنامه نویسی هستند که در برنامه نویسی تجاری هم کاربردهای فراوانی دارند.
حتما قبل از بررسی آرایه ها در سی شارپ نوشته ی مطالب قبلی این دوره ی آموزشی را با هشتگ #دوره آموزشی_سی_شارپ در سایت ما را مطالعه کنید.
آرایه چیست ؟
آرایه مجموعهای از متغیرها با نوعی یکسان یا همگن است که همگی با یک نام شناخته میشوند.
در سیشارپ آرایهها میتوانند یک بعد یا بیشتر از یک بعد داشته باشند اما با این حال آرایه یک بعدی رایجترین نوع آرایه است.
آرایه تک بعدی :
آرایه تک بعدی لیستی از متغیرهای یکسان یا همگن است.
تصور کنید که میخواهید لیستی از نام کتابهای برنامهنویسی خودتان را داشته باشید.
بنابراین شما باید آرایهای از جنس string داشته باشید تا نام کتابهای خود را در آن قرار دهید.
برای تعریف آرایه تک بعدی نیاز است که جنس ، اسم و اندازه آرایه را مشخص کنید.
آرایه تک بعدی از طریق الگوی زیر تعریف میشود:
type[] array-name = new type[size];
در اینجا type مشخص کنندهی جنس آرایه و size مشخص کنندهی تعداد عناصری است که میتوان در این آرایه قرار داد.
array-name نیز نام آرایه را مشخص میکند.
به نمونهی زیر توجه کنید:
int[] myArray = new int[10];
در اینجا ما آرایهای با نام myArray از جنس int تعریف کردهایم که ۱۰ عنصر را میتواند در خود نگهداری کند.
توجه داشته باشید که عنصرهای این آرایه همگی باید از جنس int باشند.
برای دسترسی به هر خانهی آرایه نیاز است که شماره index آن خانه را صدا بزنید.
در سیشارپ شماره index اول آرایهها برابر با صفر است.
در اینجا که اندازهی myArray برابر با ۱۰ است، index های آن از شماره ۰ تا ۹ هستند.
بنابراین برای دسترسی به خانهی اول آرایه باید اسم آرایه و در جلوی آن شماره index خانهی اول آرایه که در براکت باز و بسته قرار دارد را بنویسید.
دسترسی به خانهی اول آرایه :
myArray[0] = 20;
دسترسی به خانهی آخر آرایه:
myArray[9] = 16;
برای مقداردهی به خانههای آرایه بدین صورت عمل میکنیم:
myArray[0] = 20; myArray[1] = 13; myArray[9] = 16;
به مثال زیر توجه کنید:
int[] myArray = new int[10]; myArray[0] = 20; myArray[1] = 13; myArray[2] = 16; myArray[3] = 36; myArray[4] = 160; myArray[5] = 180; myArray[6] = 340; myArray[7] = 8; myArray[8] = 55; myArray[9] = 85; for (int i = 0; i < 10; i++) { myArray[i] = i * 5; }
در این مثال دو آرایه تعریف کردهایم که اولی برای نگه داری کلمات انگلیسی و دومی برای نگه داری ترجمه ی معادل آن هاست.
مثال :
string[] words = new string[5]; string[] translations = new string[5]; bool isFound; string input; words[0] = "book"; translations[0] = "ketab"; words[1] = "mobile"; translations[1] = "telephone hamrah"; words[2] = "mouse"; translations[2] = "moosh"; words[3] = "keyboard"; translations[3] = "safhe kilid"; words[4] = "speaker"; translations[4] = "bolandgoo"; while (true) { Console.Clear(); Console.Write("Enter a word to translate or press q to quit: "); input = Console.ReadLinee(); if (input == "q" || input == "Q") breakk; isFound = false; for (int i = 0; i < words.Length; i++) { if (input == words[i]) { isFound = true; Console.WriteLine(words[i] + " Means " + translations[i]); break; } } if (!isFound) { Console.WriteLine("Not Found!"); } Console.ReadLine(); }
کلمه و ترجمهی معادل آن در آرایه باید در index یکسانی باشند.
بهعنوان مثال اگر کلمهی book در ایندکس صفر است، ترجمهی آن نیز باید در ایندکس صفر باشد.
سپس در یک حلقهی بینهایت پیغامی را نمایش دادهایم تا ورودی را از کاربر بگیریم.
اگر کاربر حرف q یا Q را وارد کند برنامه از حلقه بینهایت خارج شده و اجرا به پایان میرسد.
در غیر اینصورت توسط یک حلقهی for تک تک خانههای آرایه words را بررسی میکنیم تا در صورت پیدا شدن کلمه وارد شده، ترجمهی موبوط بهآن نمایش داده شود.
در این میان از یک متغیر بولین برای اینکه بدانیم کلمه وارد شده در فرهنگ لغت ما وجود دارد یا خیر، کمک گرفتهایم.
همچنین عبارت words.Length بیان کنندهی طول خانههای آرایه words است.
روش سادهتری نیز وجود دارد که همزمان با تعریف آرایه به آن مقدار میدهیم.
فرم کلی این روش بهشکل زیر است:
type[] array-name = { val1, val2, val3, ..., valN };
به مثال زیر که از این روش استفاده شده و میانگین اعداد محاسبه میشود توجه کنید:
int[] nums = { 22, 56, 78, 96, 32, 15, 4 }; int average = 0; for (int i = 0; i < nums.Length; i++) { average = average + nums[i]; }
در این موارد، سیشارپ بهصورت خودکار اندازه آرایه را با توجه به مقادیری که شما معین کردهاید تعیین میکند.
رعایت مرز و حدود آرایهها در سیشارپ اجباری است.
اگر ظرفیت آرایهای ۱۰ است و شما تلاش کنید که تا ۱۱ مقدار را در آن جای دهید با خطای IndexOutOfRangeException مواجه میشوید.
اگر سعی در اجرای برنامه زیر کنید خطای نامبرده را دریافت خواهید کرد:
int[] myArray = new int[10]; for (int i = 0; i < 20; i++) myArray[i] = i;
در این برنامه ظرفیت آرایه ما ۱۰ است و ما در تلاش بودیم تا ۲۰ مقدار را در این آرایه جای دهیم که با خطای IndexOutOfRangeException مواجه شدیم.
تمرین :
برنامهی دفترچه تلفنی بنویسید که قابلیت اضافه کردن مخاطب جدید، جستجو بر اساس نام و شماره تلفن، ویرایش مخاطبان ذخیره شده و پاک کردن را داشته باشد. ( به عهده کاربران )
آرایه دو بعدی :
سادهترین شکل آرایههای چندبعدی، آرایههای ۲ بعدی هستند.
در آرایههای ۲ بعدی موقعیت هر عنصر با دو index مشخص میشود.
اگر به آرایههای ۲ بعدی به چشم یک جدول نگاه کنیم، یک index مشخصکنندهی سطر و index دیگر مشخصکنندهی ستون است.
برای ساختن یک آرایه ۲ بعدی با ابعاد ۴ × ۳ مینویسید:
int[,] twoDimensionalArary = new int[3, 4];
برای دسترسی به خانههای آرایهی ۲ بعدی باید از طریق دو index که توسط کاما از هم جدا شدهاند اینکار را انجام دهید.
به مثال زیر توجه کنید:
twoDimensionalArray[0, 0] = 1; twoDimensionalArray[0, 1] = 2; twoDimensionalArray[0, 2] = 3; twoDimensionalArray[0, 3] = 4;
دقت کنید که چگونه در این برنامه خانههای آرایهی دو بعدی را مقداردهی کردهایم.
پس از پر کردن خانههای آرایه، از طریق حلقههای تودرتو مقدار تک تک عناصر آرایه را نمایش دادهایم.
همانطور که در شکل بالا میبینید، برای مقداردهی به خانههای آرایه ۲ بعدی میبایست دو index سطر و ستون را مشخص کنید.
آرایههای چند بعدی :
سیشارپ به شما اجازه میدهد آرایههایی با ابعاد ۲ یا بیشتر از ۲ بعد بسازید:
type[ , ,,, ... , ] multiDimensionalArray = new type[size1, size2, ... , sizeN];
برای مثال در زیر یک آرایه ۳ بعدی با ابعاد ۱۰ × ۴ × ۳ میسازیم:
int[, ,] threeDimensionalArray = new int[3, 4, 10]; threeDimensionalArray[2, 4, 1] = 100;
به مثال زیر توجه کنید:
int result = 1; for (int x = 0; x < 3; x++) for (int y = 0; y < 3; y++) for (int z = 0; z < 0; z++) threeDimensionalArray[x, y, z] = result++;
در این مثال از طریق ۳ حلقهی تودرتو خانههای آرایه را پر کردهایم.
مقداردهی به آرایههای ۲ بعدی میتواند از الگوی زیر نیز انجام گیرد:
type[,] array_name = { { val, val, val, ..., val }, { val, val, val, ..., val }, . . . . { val, val, val, ..., val } };
در اینجا هر بلاک داخلی معینکنندهی یک سطر است. درون هر سطر، مقدار اول در موقعیت و مکان اول قرار میگیرد. مقدار دوم در مکان دوم والی آخر. توجه کنید که بلاکهای داخلی توسط کاما از هم جدا میشوند و در نهایت سمیکالن بعد از براکت بسته شدهی آخر قرار میگیرد.به مثال زیر توجه کنید:
int[,] myTwoDimArray = { { ۱, ۰, ۱, ۱ }, { ۰, ۰, ۱, ۰ }, { ۱, ۱, ۱, ۰ }, { ۰, ۱, ۰, ۱ } };
متغیرهای ضمنمی Implicitly Typed Variable :
همانطور که پیش از این ذکر شد، در سیشارپ متغیرها قبل از اینکه مورد استفاده قرار گیرند باید اعلام شوند.
برای اینکار بهطور معمول ابتدا نوع متغیر را مینویسید، سپس نام متغیر را پس از آن قرار میدهید:
int x;
از زمانیکه C# 3.0 منتشر شد، قابلیتی بهوجود آمد که میتوان به کامپایلر اجازه داد تا خودش نوع متغیر را با توجه به مقداری که به متغیر داده میشود، تشخیص دهد.
به این عمل Implicitly Typed Variable میگویند.
یک Implicitly Typed Variable با کلمهکلیدی var مشخص شده و حتماً بایستی مقداردهی شود.
کامپایلر با توجه به مقدار داده شده به متغیر، نوع آن را تشخیص میدهد:
var x = 2.6080;
به دلیل اینکه متغیر e بهصورت floating-point مقداردهی شده است (که بهصورت پیشفرض double هستند) نوع متغیر e نیز به double تبدیل میشود.
اگر x به صورت زیر تعریف شود:
var x = 2.6080F;
آنگاه x از جنس float خواهد بود.
var name = "Roxy"; // has the same meaning as string name = "Roxy"; var age = 30; // has the same meaning as int age = 30;
معرفی Implicitle Typed Array :
بااستفاده از همان مکانیسم قبلی میتوانید یک Implicitly typed Array بسازید.
یک Implicitly typed Array با استفاده از کلمهکلیدی var ساخته میشود اما بعد از var از براکت [] استفاده نمیشود.
علاوهبر این آرایه باید مستقیماً مقدار دهی شود چراکه نوع و جنس آرایه با توجه به مقادیر درون آن مشخص میشود.
همهی مقادیر آرایه باید از یک نوع یا از نوعهای سازگار باهم باشند.
این خط کد آرایهای از جنس int با طول ۵ میسازد:
var vals = new[] { 1, 2, 3, 4, 5 };
ساخت Implicitly typed Array دو بعدی:
var vals = new[,] { { 1.1, 2.2 }, { 3.3, 4.4 }, { 5.5, 6.6 } };
در اینجا آرایهای ۳ × ۲ ساخته شده است. شما همچنین میتوانید Implicitly typed Jagged Array داشته باشید:
var jaggedArray = new[] { new[] { 1, 2, 3, 4 }, new[] { 9, 8, 7 }, new[] { 11, 12, 13, 14 ,15 }};
توجه :
در مثال بالا چگونه به دو طریق از []new استفاده شده است.
ابتدا از آن برای ساخت آرایهای از آرایهها استفاده شده و سپس در هر سطر بهصورت جداگانه آرایهای را با توجه به مقادیر آن ساخته است.
همانطور که ذکر شد از Implicitly typed Array/Variable بیشتر در کوئریهای بر پایه LINQ مورد استفاده قرار میگیرد.
نباید از آنها در حالت معمول استفاده کرد.
حلقهی Foreach :
این حلقه تک تک عناصر یک Collection را بهترتیب از ابتدا تا انتها بررسی میکند.
یک Collection شامل گروهی از اشیاء (Objects) است. سیشارپ چندین نوع Collection دارد که یکی از آنها آرایه است.
شکل کلی دستور foreach بهصورت زیر است:
foreach (type item in collection) statement;
در اینجا type item مشخص کنندهی اسم و نوع یک متغیر است که این متغیر، عنصر بعدی Collection (در اینجا کالکشن، آرایه است) را در هربار که حلقه تکرار میشود دریافت میکند.
این متغیر در اصطلاح iteration variable نامیده میشود.
بنابراین type باید با جنس آرایه یکسان (یا سازگار) باشد.
type همچنین میتواند var باشد که در این مورد نیز کامپایلر با توجه به جنس آرایه، نوع را تشخیس میدهد.
اما بهتر است بهطور معمول، نوع متغیر را خودتان مشخص کنید.
هنگامیکه حلقهی foreach شروع بهکار میکند، اولین عنصر آرایه به متغیر item اختصاص داده میشود.
در هربار تکرار حلقه، عنصر بعدی آرایه گرفته شده و به item اختصاص داده میشود.
تکرار حلقه تا زمانیکه عنصری در آرایه وجود داشته باشد ادامه مییابد.به مثال زیر توجه کنید:
int[] anArray = { 2, 33, 56, 42, 13, 15, 79 }; foreach (int loopvar in anArray) { Console.Write(loopvar + " "); }
همانطور که میبینید، بعد از اجرای این برنامه تمام خانههای آرایه در خروجی نمایش داده میشود.
زمانیکه حلقه شروع بهکار میکند، عنصر اول آرایه در متغیر loopvar ذخیره میشود.
در چرخش بعدی حلقه، عنصر بعدی آرایه به متغیر loopvar اختصاص مییابد و این روند تا زمانیکه خانههای آرایه به اتمام برسد ادامه دارد.
( مهم ) تمرین پایانی : در این تمرین قصد داریم دفترچه تلفنی بسازیم که قابلیت افزودن، حذف ، جستجو و ویرایش کردن را داشته باشد . (مهم )
خب به در اینجا بخش مقدماتی دوره آموزش برنامه نویسی سی شارپ به پایان رسید؛
این دوره هنوز به پایان نرسیده و از جلسه ی بعد وارد بحث های اصلی سی شارپ خواهیم شد.
البته اصول پایه ای هر زبان برنامه نویسی شامل جلساتی که گذشت می شد شما در صورتی که بتوانید تمرین پایانی را انجام دهید می توانید وارد بحث های بعدی شوید.
امیدواریم از “آرایه ها در سی شارپ” لذت کافی برده باشید.
برای استفاده از تمامی جلسات از هشتگ #دوره آموزشی_سی_شارپ در سایت ما استفاده کنید.
منتظر جلسه ی بعدی دوره آموزشی سی شارپ باشید.
موفق و پایدار باشید.
ارسال پاسخ