قسمت پانزدهم - تکرار

تکراراختارهای تکرار به شما اجازه می دهند که یک یا چند دستور کد را تا زمانی که یک شرط برقرار است تکرار کنید. بدون ساختارهای تکرار شما مجبورید همان تعداد کدها را بنویسید که بسیار خسته کننده است. مثلا شما مجبورید 10 بار جمله ”.World Hello ”را تایپ کنید مانند مثال زیر:Console.WriteLine(&quotHello World.&quot); Console.WriteLine(&quotHello World.&quot); Console.WriteLine(&quotHello World.&quot); Console.WriteLine(&quotHello World.&quot); Console.WriteLine(&quotHello World.&quot); Console.WriteLine(&quotHello World.&quot); Console.WriteLine(&quotHello World.&quot); Console.WriteLine(&quotHello World.&quot); Console.WriteLine(&quotHello World.&quot); Console.WriteLine(&quotHello World.&quot);البته شما می توانید با کپی کردن این تعداد کد را راحت بنویسید ولی این کار در کل کیفیت کدنویسی را پایین می آورد. برای نوشتن کدهای بالا استفاده از حلقه ها بهتر است. ساختارهای تکرار در سی شارپ عبارت اند از:whiledo whileforحلقه Whileابتدایی ترین ساختار تکرار در سی شارپ حلقه While است. ابتدا یک شرط را مورد بررسی قرار می دهد و تا زمانی که شرط برقرار باشد کدهای درون بلوک اجرا می شوند. ساختار حلقه while به صورت زیر است:while(condition) { code to loop; }می بینید که ساختار while مانند ساختار if بسیار ساده است. ابتدا یک شرط را که نتیجه آن یک مقدار بولی است می نویسیم اگر نتیجه درست یا true باشد، سپس کدهای داخل بلوک while اجرا می شوند. اگر شرط غلط یا false باشد، وقتی که برنامه به حلقه while برسد هیچکدام از کدها را اجرا نمی کند. برای متوقف شدن حلقه باید مقادیر داخل حلقه while اصلاح شوند. به یک متغیر شمارنده در داخل بدنه حلقه نیاز داریم. این شمارنده برای آزمایش شرط مورد استفاده قرار می گیرد و ادامه یا توقف حلقه به نوعی به آن وابسته است. این شمارنده را در داخل بدنه باید کاهش یا افزایش دهیم. در برنامه زیر نحوه استفاده از حلقه while آمده است:using System; public class Program { public static void Main() { int counter = 1; while (counter <= 10) { Console.WriteLine(&quotHello World!&quot); counter++; } } }برنامه بالا 10 بار پیغام !Hello World را چاپ می کند. اگر از حلقه در مثال بالا استفاده نمی کردیم مجبور بودیم تمام 10 خط را تایپ کنیم. اجازه دهید که نگاهی به کدهای برنامه فوق بیندازیم. ابتدا در خط 6 یک متغیر تعریف و از آن به عنوان شمارنده حلقه استفاده شده است. سپس به آن مقدار 1 را اختصاص می دهیم چون اگر مقدار نداشته باشد نمی توان در شرط از آن استفاده کرد. در خط 7 حلقه While را وارد می کنیم. در حلقه while ابتدا مقدار اولیه شمارنده با 10 مقایسه می شود که آیا از 10 کمتر است یا با آن برابر است. نتیجه هر بار مقایسه ورود به بدنه حلقه while و چاپ پیغام است. همانطور که مشاهده می کنید بعد از هر بار مقایسه مقدار شمارنده یک واحد اضافه می شود (خط 10). حلقه تا زمانی تکرار می شود که مقدار شمارنده از 10 کمتر باشد. اگر مقدار شمارنده 1 بماند و آن را افزایش ندهیم و یا مقدار شرط هرگز false نشود یک حلقه بی نهایت به وجود می آید. به این نکته توجه کنید که در شرط بالا به جای علامت > از => استفاده شده است. اگر از علمت > استفاده می کردیم کد ما 9 بار تکرار می شد چون مقدار اولیه 1 است و هنگامی که شرط به 10 برسد false می شود چون 10 < 10 نیست. اگر می خواهید یک حلقه بی نهایت ایجاد کنید که هیچگاه متوقف نشود باید یک شرط ایجاد کنید که همواره درست (true)باشد.while(true) { //code to loop }این تکنیک در برخی موارد کارایی دارد و آن زمانی است که شما بخواهید با استفاده از دستورات break و return که در آینده توضیح خواهیم داد از حلقه خارج شوید.do while حلقهحلقه do while یکی دیگر از ساختارهای تکرار است. این حلقه بسیار شبیه حلقه while است با این تفاوت که در این حلقه ابتدا کد اجرا می شود و سپس شرط مورد بررسی قرار می گیرد. ساختار حلقه do while به صورت زیر است:do { code to repeat; } while(condition);همانطور که مشاهده می کنید شرط در آخر ساختار قرار دارد. این بدین معنی است که کدهای داخل بدنه حداقل یکبار اجرا می شوند. برخلاف حلقه while که اگر شرط نادرست باشد، دستورات داخل بدنه اجرا نمی شوند. یکی از موارد برتری استفاده از حلقه while do نسبت به حلقه while زمانی است که شما بخواهید اطلاعاتی از کاربر دریافت کنید. به مثال زیر توجه کنید:استفاده از while//while version Console.WriteLine(&quotEnter a number greater than 10: &quot); int number = Convert.ToInt32(Console.ReadLine()); while (number < 10) { Console.WriteLine(&quotEnter a number greater than 10: &quot); number = Convert.ToInt32(Console.ReadLine()); }استفاده از do while//do while version do { Console.WriteLine(&quotEnter a number greater than 10: &quot); number = Convert.ToInt32(Console.ReadLine()); } while (number < 10);مشاهده می کنید که از کدهای کمتری در بدنه do while نسبت به while استفاده شده است.حلقه forیکی دیگر از ساختارهای تکرار حلقه for است. این حلقه عملی شبیه به حلقه while انجام می دهد و فقط دارای چند خصوصیت اضافی است. ساختار حلقه for به صورت زیر است:for( initialization; condition; operation ) { code to repeat; }مقدار اولیه (initialization) اولین مقداری است که به شمارنده حلقه می دهیم. شمارنده فقط در داخل حلقه for قابل دسترسی است. شرط (condition) در اینجا مقدار شمارنده را با یک مقدار دیگر مقایسه می کند و تعیین می کند که حلقه ادامه یابد یا نه. عملگر (operation) که مقدار اولیه متغیر را کاهش یا افزایش می دهد. در زیر یک مثال از حلقه for آمده است:using System; namespace ForLoopDemo { public class Program { public static void Main() { for (int i = 1; i <= 10; i++) { Console.WriteLine(&quotNumber &quot + i); } } } }Number 1 Number 2 Number 3 Number 4 Number 5 Number 6 Number 7 Number 8 Number 9 Number 10برنامه بالا اعداد 1 تا 10 را با استفاده از حلقه for می شمارد. ابتدا یک متغیر به عنوان شمارنده تعریف می کنیم و آن را با مقدار 1 مقدار دهی اولیه می کنیم. سپس با استفاده از شرط آن را با مقدار 10 مقایسه می کنیم که آیا کمتر است یا مساوی؟ توجه کنید که قسمت سوم حلقه (++i) فورا اجرا نمی شود. کد اجرا می شود و ابتدا رشته Number و سپس مقدار جاری i یعنی 1 را چاپ می کند. آن گاه یک واحد به مقدار i اضافه شده و مقدار i برابر 2 می شود و بار دیگر i با عدد 10 مقایسه می شود و این حلقه تا زمانی که مقدار شرط true شود ادامه می یابد. حال اگر بخواهید معکوس برنامه بالا را پیاده سازی کنید یعنی اعداد از بزرگ به کوچک چاپ شوند باید به صورت زیر عمل کنید:for (int i = 10; i > 0; i--) { //code omitted }کد بالا اعداد را از 10 به 1 چاپ می کند (از بزرگ به کوچک). مقدار اولیه شمارنده را 10 می دهیم و با استفاده از عملگر کاهش (--) برنامه ای که شمارش معکوس را انجام می دهد ایجاد می کنیم. می توان قسمت شرط و عملگر را به صورت های دیگر نیز تغییر داد. به عنوان مثال می توان از عملگرهای منطقی در قسمت شرط و از عملگرهای تخصیصی در قسمت عملگر افزایش یا کاهش استفاده کرد. همچنین می توانید از چندین متغیر در ساختار حلقه for استفاده کنید.for (int i = 1, y = 2; i < 10 && y > 20; i++, y -= 2) { //some code here }به این نکته توجه کنید که اگر از چندین متغیر شمارنده یا عملگر در حلقه for استفاده می کنید باید آنها را با استفاده از کاما از هم جدا کنید.حلقه های تو در تو (Loops Nested)سی شارپ به شما اجازه می دهد که از حلقه ها به صورت تو در تو استفاده کنید. اگر یک حلقه در داخل حلقه دیگر قرار بگیرد، به آن حلقه تو در تو گفته می شود. در این نوع حلقه ها، به ازای اجرای یک بار حلقه بیرونی، حلقه داخلی به طور کامل اجرا می شود. در زیر نحوه ایجاد حلقه تو در تو آمده است :for (init; condition; increment) { for (init; condition; increment) { //statement(s); } //statement(s); }while(condition) { while(condition) { //statement(s); } //statement(s); }do { //statement(s); do { //statement(s); } while(condition); } while(condition);نکته ای که در مورد حلقه های تو در تو وجود دارد این است که می توان از یک نوع حلقه در داخل نوع دیگر استفاده کرد. مثلا می توان از حلقه for در داخل حلقه while استفاده نمود. در مثال زیر نحوه استفاده از این حلقه ها ذکر شده است. فرض کنید که می خواهید یک مستطیل با 3 سطر و 5 ستون ایجاد کنید :using System; namespace NestedLoopsDemo { class Program { static void Main(string[ ] args) { for (int i = 1; i <= 4; i++) { for (int j = 1; j <= 5; j++) { Console.Write(&quot * &quot); } Console.Write(&quot\n&quot); //or Console.WriteLine(); } } } }* * * * ** * * * * * * * * ** * * * *در کد بالا به ازای یک بار اجرای حلقه for اول (خط 9)، حلقه for دوم (14-11) به طور کامل اجرا می شود. یعنی وقتی مقدار i برابر عدد 1 می شود، علمت * توسط حلقه دوم 5 بار چاپ می شود، وقتی i برابر 2 می شود، دوباره علمت * پنج بار چاپ می شود و .... در کل منظور از دو حلقه for این است که در 4 سطر علامت * در 5 ستون چاپ شود یا 4 سطر ایجاد شود و در هر سطر 5 بار علامت * چاپ شود. خط 15 هم برای ایجاد خط جدید است. یعنی وقتی حلقه داخلی به طور کامل اجرا شد، یک خط جدید ایجاد می شود و علامت های * در خطوط جدید چاپ می شوند.خارج شدن از حلقه با استفاده از break و continueگاهی اوقات با وجود درست بودن شرط می خواهیم حلقه متوقف شود. سؤال اینجاست که چطور این کار را انجام دهید؟ با استفاده از کلمه کلیدی break حلقه را متوقف کرده و با استفاده از کلمه کلیدی continue می توان بخشی از حلقه را رد کرد و به مرحله بعد رفت. برنامه زیر نحوه استفاده از continue و break را نشان می دهد:در این برنامه از حلقه for برای نشان دادن کاربرد دو کلمه کلیدی فوق استفاده شده است. اگر به جای for از حلقه های while و while…do استفاده می شد، نتیجه یکسانی به دست می آمد. همانطور که در شرط برنامه (خط 11) آمده است وقتی که مقدار x به عدد 5 رسید سپس دستور break اجرا می شود (خط 12). حلقه بلافاصله متوقف می شود حتی اگر شرط 10 > x برقرار باشد. از طرف دیگر در خط 22 حلقه for فقط برای یک تکرار خاص متوقف شده و سپس ادامه می یابد(وقتی مقدار x برابر 5 شود حلقه از 5 رد شده و مقدار 5 را چاپ نمی کند و بقیه مقادیر چاپ می شوند).