من رفتم سربازی اگر محتوای منو دوست داشتید و بدردتون خورد از من حمایت مالی کنید

آموزش سی شارپ – آرایه‌ها

آموزش سی شارپ – آرایه‌ها
آموزش سی شارپ – آرایه‌ها

آرایه‌ها در سی شارپ

بعد از بررسی عملگرها و ساختارهای کنترلی در این قسمت از آموزش برنامه نویسی سی شارپ قصد بررسی آرایه‌ها را داریم؛ آرایه‌ها یک بخش جدانشدنی از زبان‌های برنامه نویسی هستند که در برنامه نویسی تجاری هم کاربردهای فراوانی دارند.

 

آموزش آرایه ها در سی شارپ

حتما قبل از بررسی آرایه ها در سی شارپ نوشته‌ی مطالب قبلی این دوره‌ی آموزشی را با هشتگ #دوره آموزشی_سی_شارپ در سایت ما را مطالعه کنید.

 

آرایه چیست؟

آرایه مجموعه‌ای از متغیرها با نوعی یکسان یا همگن است که همگی با یک نام شناخته می‌شوند. در سی‌شارپ آرایه‌ها یک بعد یا بیش‌تر از یک بعد دارند اما با این حال آرایه یک بعدی رایج‌ترین نوع آرایه است.

 

آرایه تک بعدی

آرایه تک بعدی لیستی از متغیرهای یکسان یا همگن است. تصور کنید که لیستی از نام کتاب‌های برنامه‌نویسی خودتان را دارید. بنابراین شما باید آرایه‌ای از جنس 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 مواجه می‌شوید.

اگر سعی در اجرای برنامه زیر کنید خطای نام‌برده را دریافت خواهید کرد: ظرفیت آرایه ما ۱۰ است و ما در تلاش بودیم تا ۲۰ مقدار را در این آرایه جای دهیم که با خطای IndexOutOfRangeException مواجه شدیم.

int[] myArray = new int[10];

for (int i = 0; i < 20; i++)
myArray[i] = i;

تمرین: برنامه‌ی دفترچه تلفنی بنویسید که قابلیت اضافه کردن مخاطب جدید، جستجو بر اساس نام و شماره تلفن، ویرایش مخاطبان ذخیره شده و پاک کردن آنها. (به عهده کاربران )

آرایه دو بعدی

ساده‌ترین شکل آرایه‌های چندبعدی، آرایه‌های ۲ بعدی هستند. در آرایه‌های ۲ بعدی موقعیت هر عنصر با دو 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 اختصاص می‌یابد و این روند تا زمانی‌ که خانه‌های آرایه به اتمام برسد ادامه دارد.

(مهم) تمرین پایانی: در این تمرین قصد داریم دفترچه تلفنی بسازیم که قابلیت افزودن، حذف، جستجو و ویرایش کردن را برای کاربر فراهم کند.

خب به در اینجا بخش مقدماتی دوره آموزش برنامه نویسی سی شارپ به پایان رسید؛ این دوره هنوز به پایان نرسیده و از جلسه‌ی بعد وارد بحث های اصلی سی شارپ خواهیم شد. البته اصول پایه ای هر زبان برنامه نویسی شامل جلساتی که گذشت می شد شما در صورتی که بتوانید تمرین پایانی را انجام دهید می‌توانید وارد بحث های بعدی شوید.

برای استفاده از تمامی جلسات از هشتگ #دوره آموزشی_سی_شارپ در سایت ما استفاده کنید.

منتظر جلسه‌ی بعدی دوره آموزشی سی شارپ بمانید.

برای امتیاز به این نوشته کلیک کنید!
[کل: 3 میانگین: 2.3]