آموزش: آموزش زبان سی شارپ - قسمت نهم- آشنایی با آرایه ها و دستور foreach
يكشنبه, ۲۰ فروردين ۱۳۹۶، ۰۵:۳۰ ب.ظ
در بخش قبلی آموزش زبان سی شارپ با دستورات کنترلی و حلقه ها آشنا شدیم. در
این بخش قصد داریم با مبحث آرایه ها و دستور foreach آشنا شویم. همانطور
که در قسمت آشنایی با متغیرها گفتیم، یک متغیر خانه ای از حافظه است که می
توان مقداری را در داخل آن ذخیره کرد. برای مثال دستور زیر متغیری از نوع
string و با نام name تعریف کرده و مقدار neetbook را داخل آن قرار می دهد:
string name = "neetbook";
اما فرض کنید که بخواهیم در یک متغیر، بیش از یک مقدار را ذخیره کنیم. برای مثال، ما می خواهیم لیستی از نمرات یک دانشجو را در برنامه داشته باشیم. برای اینکار باید متغیری تعریف کنیم که قابلیت نگهداری بیش از یک مقدار را داشته باشد. در اینجا مبحث آرایه ها مطرح می شود. آرایه ها این قابلیت را به ما می دهند که لیستی از یک نوع را نگهداری کنیم. شیوه تعریف آرایه ها در زبان سی شارپ به صورت زیر است:
{type}[] numbers = new {type}[{length}];
در قسمت type نوع داده ای که قصد داریم به عنوان آرایه ایجاد شود و در قسمت length باید تعداد خانه های آرایه را مشخص کنیم. برای مثال فرض کنید که قصد داریم یک آرایه 10 خانه ای از نوع int ایجاد کنیم:
int[] numbers = new int[10];
بوسیله کد بالا یک آرایه 10 خانه ای از نوع int برای ما ایجاد می شود. برای مثال دوم یک آرایه 20 خانه ای از نوع string ایجاد می کنیم:
string[] names = new string[20];
در مرحله بعد باید با نحوه دسترسی به خانه های آرایه آشنا شویم. در دو حالت ما نیاز به دسترسی به خانه های آرایه خواهیم داشت:
- قرار دادن مقدار داخل یکی از خانه های آرایه
- گرفتن مقدار یکی از خانه های آرایه
ابتدا نحوه قرار دادن مقدار را با هم بررسی می کنیم:
string[] names = new string[20]; names[10] = "netbook.blog.ir";
همانطور که مشاهده می کنید ابتدا نام متغیر، سپس داخل [] اندیس خانه ای از آرایه که قصد داریم مقدار داخل آن قرار بگیرد را می نویسیم. اما به یک نکته توجه کنید که اندیس آرایه ها از شماره 0 شروع می شود. یعنی در کد بالا که عدد 10 را نوشتیم، اشاره به خانه نهم آرایه می کنید. برای مثال در یک آرایه 10 خانه ای، عدد 0 به خانه اول و عدد 9 به خانه دهم اشاره می کند.
برای خواندن مقدار یکی از خانه های آرایه به صورت زیر عمل می کنیم:
string[] names = new string[10]; names[0] = "mobin"; names[1] = "yasin"; names[2] = "Mohammad"; Console.WriteLine(names[1]); // output yasin
در زبان سی شارپ به صورت های مختلفی می توان آرایه را تعریف و مقدار دهی کرد، یکی از حالت ها را بررسی کردیم. نوع دیگری از تعریف آرایه به این صورت است که ما هنگام تعریف آرایه مقادیر خانه های آن را مشخص می کنیم و بر اساس مقادیر، تعداد خانه های آرایه تعیین می شود:
int[] numbers = new[] { 2,6,3,1,7,9};
در کد بالا، آرایه ای از نوع int تعریف شده و مقادیر مشخص شده داخل {} در خانه های آرایه قرار میگیرد. در مثال قبلی آرایه تعریف شده حاوی 6 خانه خواهد بود (بر اساس تعداد اعداد داخل {}).
می توان برای راحتی کار، از نوشتن []int صرفنظر کرد:
int[] numbers = { 2,6,3,1,7,9};
کد بالا، دقیقاً کار کد قبلی را انجام می دهد.
زمانی که ما یک آرایه تعریف می کنیم، می توانیم بوسیله دستور for به خانه های آرایه دسترسی داشته باشیم. برای مثال، فرض کنید برنامه ای می خواهیم بنوسیم که 10 عدد را از کاربر دریافت کرده، سپس حاصل جمع این 10 عدد را در خروجی چاپ کند.
1. در ابتدا باید آرایه ای که اعداد داخل آن باید ذخیره شوند را تعریف کنیم:
int[] nums = new int[10];
2. در قدم بعدی باید 10 عدد را از کاربر دریافت کرده و در خانه های آرایه ذخیره کنیم. دقت کنید، 10 مرتبه عملیات دریافت اطلاعات از کاربر تکرار می شود، پس ما باید یک حلقه تشکیل داده و داخل آن حلقه اقدام به دریافت اعداد از کاربر نماییم:
for (int index = 0; index <= 9; index++) { Console.Write("Enter number " + (index + 1) + " of 10: "); nums[index] = int.Parse(Console.ReadLine()); }
دقت کنید که شمارنده حلقه از عدد صفر شروع شده و تا زمانی که مقدار شمارنده کوچکتر یا مساوی عدد 9 باشد تکرار خواهد شد. ما می توانیم از عدد شمارنده برای دسترسی به خانه های آرایه نیز استفاده کنیم. همچنین قبل از دریافت عدد، پیغامی مناسب به کاربر جهت وارد کردن عدد نمایش می دهیم.
3. در مرحله بعد، باید تک تک خانه های آرایه را خوانده و حاصل جمع را در یک متغیر جانبی ذخیره کنیم:
int sum = 0; for (int index = 0; index <= 9; index++) { sum = sum + nums[index]; } Console.WriteLine("Sum of entered numbers: " + sum);
می توان دستور داخل حلقه for را به صورت خلاصه تر نوشت:
int sum = 0; for (int index = 0; index <= 9; index++) { sum += nums[index]; } Console.WriteLine("Sum of entered numbers: " + sum);
خاصیت Length
فرض کنید، ما طول آرایه ای که تعریف کردیم را نمی دانیم! در این مواقع می توان با خاصیت Length طول آرایه را بدست آورد. در مثال زیر نحوه بدست آوردن طول آرایه با خاصیت Length را بررسی می کنیم:
string[] names = {"neetbook.blog.IR","Mohammad","mobin","Farhad","Saeed","yasin","Mahmoud"}; Console.WriteLine(names.Length); // Output => 7
دستور بالا، مقدار 7 که تعداد آیتم های آرایه یا طول آرایه می باشد را در خروجی چاپ می کند. این خاصیت مقداری از نوع int برای ما بر می گرداند.
حال مثال قبلی که حاصل جمع اعداد را حساب می کرد به صورت زیر تغییر می دهیم:
int sum = 0; for (int index = 0; index < nums.Length; index++) { sum += nums[index]; } Console.WriteLine("Sum of entered numbers: " + sum);
ما قسمت شرط دستور for را جوری تغییر دادیم که حلقه تا زمانی که شمارنده کوچتر از طول آرایه باشد تکرار شود. دقت کنید که به جای => ما از > استفاده کردیم. زیرا Length طول آرایه را برمیگرداند و به دلیل شروع شدن خانه های آرایه از اندیس 0 حلقه باید یک عدد کمتر از طول خانه های آرایه تکرار شود.
آرایه های چند بعدی
در مثال های قبلی، آرایه هایی که ایجاد کردیم، متغییرهایی بودند که شامل چندین خانه بودند. به این آرایه ها آرایه های خطی نیز می گویند. اما فرض کنید قصد داریم جدول ضرب 9 در 9 را در یک آرایه ذخیره کنیم. برای این کار باید از آرایه های چند بعدی استفاده کنیم. برای مثال، دستور زیر یک آرایه 2 بعدی شامل 9 سطر و 9 ستون را تعریف می کند:
int[,] martix = new int[9,9];
برای ابعاد بیشتر باید تعداد اعداد داخل [] را بیشتر کنیم:
int[,,] martix = new int[9,9,9];
در مثال زیر، یک آرایه 9 در 9 تعریف کرده و جدول ضرب 9 در 9 را داخل آن ذخیره می کنیم و در نهایت خروجی را چاپ می کنیم:
int[,] matrix = new int[9,9]; for (int col = 0; col < 9; col++) { for (int row = 0; row < 9; row++) { matrix[col, row] = (col + 1)*(row + 1); } } for (int col = 0; col < 9; col++) { for (int row = 0; row < 9; row++) { Console.Write(matrix[col, row] + "\t"); } Console.WriteLine(); }
آرایه های نامنظم یا Jagged Arrays
در قسمت قبلی با آرایه های چند بعدی آشنا شدیم، مثل آرایه های 2*2 یا 3*3 یا 2*4، اما فرض کنید قصد داریم آرایه دو بعدی با تعداد خانه های نامساوی تعریف کنیم، در قسمت آرایه های چند بعدی هر سطر از آرایه دارای تعداد خانه های مشخص بود، مثل 3 سطر و 2 ستون، اما فرض کنید می خواهیم هر سطر از آرایه تعداد خانه های متفاوتی داشته باشد. برای مثال، سطر اول 5 خانه، سطر دوم 6 خانه، سطر سوم 2 خانه و ... برای اینجور مواقع ما می توانیم از آرایه های نامنظم استفاده کنیم. شیوه تعریف آرایه های نامنظم به صورت زیر است:
int[][] jaggedArray = new int[3][];
با دستور بالا یک آرایه سه خانه ای که هر یک از خانه های آن نیز یک آرایه است تعریف کردیم. حالا باید برای تک تک خانه های آرایه نیز، آرایه ایجاد کنیم:
jaggedArray[0] = new int[5]; jaggedArray[1] = new int[4]; jaggedArray[2] = new int[2];
می توان هر یک از خانه های آرایه را به صورت مستقیم مانند مثال زیر مقدار دهی نیز کرد:
jaggedArray[0] = new int[] { 1, 3, 5, 7, 9 }; jaggedArray[1] = new int[] { 0, 2, 4, 6 }; jaggedArray[2] = new int[] { 11, 22 };
در مثال بالا، یک آرایه 3 خانه ای که خانه اول دارای 5 خانه، خانه دوم دارای سه 3 و خانه سوم دارای 2 خانه می باشد را ایجاد کردیم.
برای دسترسی به خانه های آرایه باید از دو اندیس استفاده کرد، اندیس اول برای آرایه اول و اندیس دوم برای آرایه دوم:
jaggedArray[0][1] = 77; Console.WriteLine("{0}", jaggedArray[0][1]);
دستور foreach
در زبان سی شارپ، زمانی که ما یک آرایه تعریف می کنیم، در حقیقت یک مجموعه قابل شمارش (Enumerable) تعریف کرده ایم. در دات نت مجموعه های قابل شمارش زیادی وجود دارند که در بخش های بعدی با آنها بیشتر آشنا خواهیم شد. اما منظور از قابل شمارش چست؟ نوع های قابل شمارش، نوع هایی می باشند که ما می توانیم بوسیله دستور foreach به خانه های آنها دسترسی داشته باشیم. ساختار کلی دستور foreach به صورت زیر است:
foreach({type} {variable-name} in {collection}) { // loop syntaxes }
- قسمت type باید نوع متغیری که مجموعه بر اساس آن تعریف شده را مشخص کنیم. برای مثال، اگر آرایه ای داریم که خانه های آن از نوع int است، باید به جای type نوع int را بنویسیم. به جای type می توان از کلمه کلیدی var که در بخش های قبلی با آن آشنا شدیم نیز استفاده کرد.
- قسمت variable-name باید نام متغیری که خانه های آرایه در آن قرار می گیرند را مشخص کنیم. این نام کاملاً دلخواه است.
- در قسمت collection نام مجموعه ای که قصد داریم به خانه های آن دسترسی داشته باشیم را می نویسیم.
شیوه عملکرد دستور foreach به این صورت است که حلقه ای بر روی مجموعه مورد نظر ایجاد می شود، سپس هر یک از خانه های آن مجموعه خوانده شده و مقدار آن داخل متغیری که نام آن را در بخش variable-name مشخص کردیم قرار میگیرد و ما می توانیم در هر تکرار به آیتم خانه های آرایه به ترتیب قرار گیری در مجموعه دسترسی داشته باشیم. به مثال زیر توجه کنید:
string[] names = {"neetbook.blog.IR","Mohammad","mobin","Farhad","Saeed","yasin","Mahmoud"}; foreach (var name in names) { Console.WriteLine(name); }
بوسیله دستور بالا، کلیه آیتم های آرایه names در خروجی چاپ خواهد شد. دستور foeach بالا دقیقاً معادل دستور for زیر می باشد:
for (int index = 0; index < names.Length; index++) { Console.WriteLine(names[index]); }
دستور foreach هنگام کار با مجموعه ها به شدت مورد استفاده قرار می گیرد. اما توجه داشته باشید اگر در برنامه ای که قصد نوشتن آن را دارید، سرعت اجرای کدها از اهمیت زیادی برخوردار است، دستور for سرعت اجرای بیشتری نسبت به دستور foreach دارد.
با اتمام بخش آرایه ها، در بخش بعدی در مورد متدها و کاربرد متدها در برنامه نویسی توضیح خواهیم داد. امیدوارم که در طول این دوره آموزشی با وبلاگneetbook همراه باشید.
منبع:programming.itpro.ir
- ۹۶/۰۱/۲۰