|
درس چهارم – دستورالعملهاي كنترلي، حلقهها
در اين درس نحوه استفاده از دستورالعملهاي كنترل حلقه در زبان C# را فرا خواهيد گرفت.
در درس قبل، نحوه ايجاد يك حلقه بسيار ساده را با استفاده از دستور goto را فرا گرفتيد. در همان مطلب نيز اشاره كرديم كه اين روش، روش مناسبي جهت ايجاد حلقه نيست. در اين درس با نحوه صحيح ايجاد حلقهها در زبان C# آشنا خواهيد شد. اولين دستوري كه با آن آشنا ميشويد نيز دستور while است.
حلقه while
ابتدا به مثال زير توجه نماييد.
using System;
class WhileLoop
{
public static void Main()
{
int myInt = 0;
while (myInt < 10)
{
Console.Write("{0} ", myInt);
myInt++;
}
Console.WriteLine();
}
}
مثال 1-4 كه در بالا ملاحظه ميكنيد، يك حلقه while ساده را نشان ميدهد. اين حلقه با كلمه كليدي while آغاز شده و سپس به دنبال آن يك عبارت منطقي قرار ميگيرد و مورد بررسي قرار ميگيرد. تمامي دستورالعملهاي كنترلي از يك عبارت منطقي بهره ميگيرند و اين بدين معناست كه ابتدا اين عبارت بايد بررسي شود تا مشخص شود مقدار اين عبارت true است يا false. در اين مثال مقدار متغير myInt مورد بررسي قرار ميگيرد تا چك شود آيا مقدارش از 10 كوچكتر هست يا خير. چون در ابتداي برنامه به اين متغير مقدار صفر تخصيص داده شده است، عبارت منطقي مقدار true را باز ميگرداند و سپس بلوك قرار گرفته بعد از عبارت منطقي مورد اجرا قرار ميگيرد.
درون بلوك while ابتدا مقدار متغير myInt در كنسول نمايش داده ميشود و سپس يك واحد به مقدار اين متغير افزوده ميگردد. پس از اتمام بلوك while، عبارت منطقي مجددا كنترل ميشود و در صورتيكه اين عبارت مقدار true بازگرداند، حلقه while مجدداً اجرا ميشود. زمانيكه عبارت منطقي مقدار false برگرداند، اجرا برنامه به اولين دستور بعد از بلوك while منتقل ميشود. در اين مثال اعداد صفر تا 9 بر روي صفحه نمايش داده ميشوند و سپس يك خط خالي چاپ شده و اجراي برنامه خاتمه مييابد.
حلقه بعدي كه بسيار شبيه به حلقه while ميباشد، حلقه do-while است.
حلقه do-while
ابتدا به مثال 2-4 توجه نماييد.
using System;
class DoLoop
{
public static void Main()
{
string myChoice;
do
{
// منويي نمايش داده ميشود
Console.WriteLine("My Address Book\n");
Console.WriteLine("A - Add New Address");
Console.WriteLine("D - Delete Address");
Console.WriteLine("M - Modify Address");
Console.WriteLine("V - View Addresses");
Console.WriteLine("Q - Quit\n");
Console.WriteLine("Choice (A,D,M,V,or Q): ");
// ورودي كاربر بررسي ميشود
myChoice = Console.ReadLine();
// تصميمي بر اساس ورودي كاربر گرفته ميشود
switch(myChoice)
{
case "A":
case "a":
Console.WriteLine("You wish to add an address.");
break;
case "D":
case "d":
Console.WriteLine("You wish to delete an address.");
break;
case "M":
case "m":
Console.WriteLine("You wish to modify an address.");
break;
case "V":
case "v":
Console.WriteLine("You wish to view the address list.");
break;
case "Q":
case "q":
Console.WriteLine("Bye.");
break;
default:
Console.WriteLine("{0} is not a valid choice", myChoice);
break;
}
Console.Write("Press Enter key to continue...");
Console.ReadLine();
Console.WriteLine();
} while (myChoice != "Q" && myChoice != "q");
}
}
مثال 2-4 نحوه استفاده از حلقه do-while را نشان ميدهد. ساختار نوشتاري اين دستور بصورت زير است :
do
{ } while ();
دستورالعملهاي مورد استفاده در بلوك اين دستور، هر دستورالعمل معتبر زبان C# ميتواند باشد. عبارت منطقي نيز همانند نمونههائيست كه تا كنون با آنها آشنا شديم و يكي از دو مقدار true يا false را بر ميگرداند.
يكي از مصارف عمده حلقه do به جاي حلقه while، مواردي است كه ميخواهيم يكسري دستورالعمل خاص، كه آنها را درون بلوك do قرار ميدهيم، حداقل يكبار اجرا شوند. در اين مثال ابتدا يك منو براي كاربر نمايش داده ميشود و سپس ورودي از وي دريافت ميگردد. چون حلقه while عبارت منطقي خود در ابتداي اجراي حلقه بررسي مينمايد، از اينرو تضميني براي اجراي دستورات درون بلوك وجود نخواهد داشت، مگر شما بطور صريح برنامه را طوري طراحي نماييد كه اين عمل اتفاق بيفتد.
يك نگاه كلي به مثال 2-4 بيندازيم. در متد Main() متغير myChoice را از نوع رشتهاي تعريف نمودهايم. سپس يكسري دستورات را بر روي كنسول چاپ نمودهايم. اين دستورات منوهاي انتخاب براي كاربر هستند. ما بايد ورودي از كاربر دريافت كنيم كه چون اين عمل از طريق Console.ReadLine() صورت گرفته، بايد در متغيري از نوع رشتهاي قرار گيرد و از اينرو اين ورودي را در myChoice قرار دادهايم. ما بايد ورودي را از كاربر دريافت كنيم و بر روي آن پردازش انجام دهيم. يك روش كارآمد براي اين منظور استفاده از دستورالعمل switch است. همانطور كه در دستور switch ملاحظه ميكنيد، بري default نيز دستوري در نظر گرفته شده است كه نشان ميدهد مقدار ورودي معتبر نيست.
حلقه for
به مثال 3-4 توجه كنيد.
using System;
class ForLoop
{
public static void Main()
{
for (int i=0; i < 20; i++)
{
if (i == 10)
break;
if (i % 2 == 0)
continue;
Console.Write("{0} ", i);
}
Console.WriteLine();
}
}
مثال 3-4 يك حلقه for را نشان ميدهد. استفاده از حلقه for براي زماني مناسب است كه دقيقاً بدانيد كه حلقه چندبار بايد تكرا شود. محتويات درون پرانتزهاي حلقه for از سه قسمت تشكيل شده است :
(; ; )
initializer list ليستي از عبارات است كه بوسيله كاما از يكديگر جدا ميشوند. اين عبارات تنها يكبار در طول دوره كاري حلقه for پردازش ميشوند. همانطور كه در مثال 3-4 نيز ملاحظه ميكنيد، اين قسمت معمولا براي تعيين متغيري عددي جهت آغاز عمل شمارش مورد استفاده قرار ميگيرد.
پس از اينكه عبارتهاي دورن initializer list پردازش شد، حلقه for به سراغ قسمت بعدي، يعني عبارات منطقي(boolean expression) ميرود. در اين قسمت تنها يك عبارت منطقي ميتوان قرار داد ولي هر اندازه كه بخواهيد ميتوانيد اين عبارت منطقي را پيچيده نماييد، فقط توجه نماييد كه اين عبارت بايد بگونهاي شود كه مقدار true يا false برگرداند. از اين عبارت منطقي معمولا جهت كنترل متغير شمارشي استفاده ميشود.
هنگاميكه عبارت منطقي مقدار true بازگرداند، دستورالعملهاي بلوك for اجرا ميشوند. در مثال 3-4 ما از دو دستور if درون حلقه for نيز استفاده كردهايم. اولين دستور if بررسي ميكند كه آيا مقدار متغير i برابر با 10 هست يا نه. در اينجا يك نمونه ديگر از استفاده دستور break را ملاحظه ميكنيد. عملكرد دستور break در اينجا نيز همانند مورد استفاده آن در دستور switch است. در صورت اجراي دستور break اجراي حلقه for خاتمه يافته و اجراي برنامه به اولين دستور بعد از حلقه for منتقل ميشود.
دومين دستور if با اسقتاده از عملگر باقيمانده (%) بررسي ميكند كه آيا متغير i بر 2 بخش پذير هست يا نه. در صورتيكه متغير i بر 2 بخش پذير باشد، دستور continue اجرا ميشود. پس از اجراي دستور continue از ساير دستورات حلقه for كه بعد از continue قرار گرفتهاند صرفهنظر ميشود و اجراي برنامه به اول حلقه for باز ميگردد.
قسمت سوم در حلقه for، قسمت postloopaction list است. پس از اينكه تمامي دستورات درون حلقه for اجرا شد، اجراي حلقه به اين قسمت باز ميگردد. اين قسمت ليستي از عملياتي است كه ميخواهيد پس از اجراي دستورات درون بلوك حلقه for انجام شوند. در مثال 3-4 اين عمل، اضافه كردن يك واحد به متغير شمارشي است. پس از افزوده شدن يك واحد به متغير شمارشي، عبارت منطقي مجدداً مورد بررسي قرار ميگيرد و در صورتيكه مقدار اين عبارت برابر با true باشد، حلقه for مجدداً اجرا ميگردد. حلقه for تا زمانيكه عبارت منطقي برابر با true باشد اجرا ميشود.
حلقه foreach
به مثال 4-4 توجه كنيد.
using System;
class ForEachLoop
{
public static void Main()
{
string[] names = {"Meysam", "Ghazvini", "C#", "Persian"};
foreach (string person in names)
{
Console.WriteLine("{0} ", person);
}
}
}
حلقه foreach براي پيمايش مجموعهها بسيار مناسب است. يك نمونه از مجموعهها در C#، آرايهها هستند كه در مثال 4-4 نيز مورد استفاده قرار گرفته است. اولين كاري كه در متد Main() صورت گرفته، اعلان آرايه names از نوع رشتهاي و مقدار دهي آن است.
درون پرانتزهاي foreach عبارتي متشكل از دو المان قرار دارد كه اين المانها بوسيله كلمه كليدي in از يكديگر جدا شدهاند. المان سمت راست، مجموعهايست كه ميخواهيد اعضاي آنرا مورد پيمايش قرار دهيد. المان سمت چپ، متغيري از نوع مجموعه مورد نظر است كه مقادير پيمايش شده را بر ميگرداند.
در هربار پيمايش، عنصري جديدي از مجموعه درخواست ميشود. اين درخواستها از طريق متغير فقط خواندني تعريف شده درون پرانتزهاي foreach بازگردانده ميشوند. تا زمانيكه عنصري در مجموعه وجود داشته باشد كه مورد پيمايش قرار نگرفته است، حلقه foreach به كار خود ادامه خواهد داد زيرا عبارت منطقي حلقه foreach مقدار true را باز ميگرداند. به محض اينكه تمامي عناصر مجموعه پيمايش شد، عبارت منطقي برابر با false شده و اجراي حلقه foreach خاتمه مييابد. در اين حالت اجراي برنامه به اولين دستور بعد از حلقه foreach منتقل ميگردد.
در مثال 4-4، متغيري از نوع رشته با نام person براي نگهداري عناصري كه از آرايه names خوانده ميشود، تعريف كردهايم. تا زمانيكه اسمي در آرايه names وجود داشته باشد، در متغير person قرار ميگيرد و درون حلقه foreach بوسيله دستور Console.WriteLine() در خروجي نمايش داده ميشود.
نكته : يكي از مهمترين ويژگيهاي حلقه foreach در آنست كه فقط ميتواند عناصر يك مجموعه را بخواند و نميتواند تغييري در آنها ايجاد نمايد. مزيت ديگر آن، پيمايش تمامي عناصر مجموعه بدون اطلاع از تعداد عناصر موجود در آن است.
خلاصه
در اين درس با نحوه كار با دستورالعملهاي for، while، do-while و foteach آشنا شديد. حلقه while تا زمانيكه شرطش صحيح باشد انجام ميشود بدين معني كه تا زمانيكه عبارت منطقي آن داراي مقدار true باشد، دستورات درون بلوك آن اجرا ميشوند. حلقه do، دستورات بلوك خود را حداقل يكبار اجرا ميكند و سپس شرط مورد نظر را بررسي مينمايد و در صورتيكه عبارت منطقي آن مقدار true بازگرداند، دستورات بلوك خود را تكرار مينمايد. حلقه for دستورات بلوك خود را به تعداد دفعات مشخص اجرا مينمايد و حلقه foreach عناصر يك مجموعه را مورد پيمايش قرار ميدهد. در نهايت نيز اشاره ميشود كه روند اجراي حلقهها با استفاده از دستورات break و continue تغيير مينمايد.
+ نوشته شده
توسط اقبال سهرابی در 2002/4/7 و ساعت 1:17 AM | |
>
|