در قسمت قبل با دو عملگر Increment و Decrement و چند عملگر ریاضی دیگر آشنا شدیم که دانستن آنها برای کار با حلقهها و بسیاری از موارد دیگر ضروری است. در این قسمت با چگونگی کار با حلقهی for و while آشنا میشویم و در انتها چند تمرین برای درک بهتر مطلب داده میشود.
حلقهی The for loop) for)
در برنامهنویسی همیشه مواردی پیش میآید که نیاز است یک بخش از کد چندین مرتبه اجرا و یککار بهصورت مکرر چندین مرتبه انجام شود. برای این منظور باید از حلقهها استفاده کرد. یکی از این حلقهها که استفادهی زیادی در برنامهنویسی دارد حلقهی for است. بهعنوان مثال فرض کنید میخواهید برنامهای بنویسید که ۵ مرتبه پیغام خوشآمد گویی را چاپ کند. آیا برای اینکار پنج مرتبه این پیغام را بهصورت دستی مینویسید؟ مسلماً اینکار زمانبر است و اگر قصد داشته باشید ۱۰۰ مرتبه پیغام خوشآمد گویی را بهصورت دستی تایپ کنید، مدت زمان زیادی از وقت شما صرف میشود. در اینجا حلقهی for به شما کمک میکند تا از کدنویسی تکراری بپرهیزید. البته از این حلقه بهمنظورهای دیگر هم استفاده میشود که در آینده با آنها آشنا خواهیم شد.
حلقهی for مانند دستورات دیگر شکل و فرم خاص خودش را دارد که با زبانهای ++C ،C و جاوا متشابه است.
شکل و فرم کلی حلقهی for را میتوانید در زیر ببینید:
for(initialization; condition; iteration) { statement sequence }
در قسمت initialization (مقدار دهی اولیه) معمولاً متغیری قرار داده میشود که این متغیر، کنترلکنندهی حلقه است و بهعنوان شمارنده (counter) حلقه عمل میکند. در قسمت condition یک عبارت بولین (true یا false) قرار میگیرد که مشخص میکند حلقه به چه تعداد باید تکرار شود. قسمت iteration مقدار متغیر کنترلکننده (متغیری که در قسمت initialization قرار دارد) را در هربار که حلقه تکرار میشود بهروز رسانی کرده و تغییراتی را روی آن اعمال میکند. توجه داشته باشید که این سه قسمت (initialization و condition و iteration) باید حتماً توسط سمیکالن از هم جدا شوند. حلقهی for تا زمانیکه مقدار condition برابر با true است تکرار شده و بهمحض اینکه condition برابر با false شد برنامه از حلقه خارج میشود.
به مثال زیر توجه کنید:
using System; class Example { static void Main() { int i; for (i = 0; i < 5; i++) { Console.WriteLine(i); } Console.WriteLine("Done!"); } }
خروجی:
0
1
2
3
4
Done!
اکنون این برنامه را بهطور کامل بررسی میکنیم تا بدانیم دقیقاً چه اتفاقی در حال رخ دادن است. هنگامی که کامپایلر شروع به خواندن کدها میکند، ابتدا متغیر i تعریف میشود سپس کامپایلر با یک حلقهی for برخورد میکند.
بر روی این حلقه به متغیر i مقدار صفر اختصاص داده میشود (initialization) سپس مقدار i با عدد ۵ مقایسه میشود تا مشخص شود که آیا مقدار i از عدد ۵ کوچکتر است یا خیر (condition). اگر i کوچکتر بود پس condition برابر با true است، اگر کوچکتر نبود condition برابر با false میشود. در حال حاضر مقدار i برابر با صفر است، صفر کوچکتر از ۵ است، بنابراین condition برابر با true میشود. حالکه condition برابر با true شد کامپایلر وارد حلقه میشود و محتوای درون حلقه را اجرا میکند. در اینجا دستور چاپ مقدار i قرار دارد، بنابراین مقدار کنونی i نمایش نمایش داده میشود (همانطور که میدانید مقدار کنونی i برابر با صفر است). پس از اینکه مقدار i نمایش داده شد، توسط عملگر افزایشی پسوندی یک واحد به مقدار i افزوده میشود (iteration) و مجدداً مقدار i با عدد ۵ مقایسه میشود. مقدار i اکنون برابر با ۱ است و عدد ۱ از عدد ۵ کوچکتر است، پس شرط برقرار است و مجدداً کامپایلر وارد حلقه شده و مقدار جدید i را نمایش داده و سپس مقدار i را یک واحد افزایش میدهد. این روند همینطور ادامه دارد تا زمانی که مقدار i به ۵ برسد. در این لحظه که مقدار i برابر با ۵ است با عدد ۵ مقایسه شده و بهدلیل اینکه ۵ از ۵ کوچکتر نیست condition برابر با false میشود و کامپایلر دیگر وارد حلقه نشده و از آن خارج میشود و به سراغ ادامهی کدها میرود. در ادامه یک پیغام !Done نمایش داده شده و برنامه به اتمام میرسد.
روند اجرای این حلقه را در شکل زیر میبینید. ابتدا مقداردهی اولیه انجام شده و شرط بررسی میشود، سپس در صورت برقراری شرط، محتوای بلاک حلقه اجرا میشود:
سپس مقدار i یک واحد افزایش یافته و مجدداً شرط بررسی میشود و درصورت برقراری شرط، محتوای بلاک حلقه اجرا میشود:
به نمونهی زیر دقت کنید:
using System; class Example { static void Main() { int count, x; x = 0; for (count = 10; count < 5; count++) { x += count; // this statement will not execute } } }
در این برنامه بهدلیل اینکه شرط حلقه برقرار نیست، هیچگاه حلقه اجرا نمیشود. توضیحات تکمیلی حلقهی for را در قسمتهای بعد میتوانید دنبال کنید.
حلقهی The while loop) while)
یکی دیگر از حلقههای سیشارپ، حلقهی while است. فرم کلی حلقهی while بهشکل زیر است:
while (Condition) { statement sequence }
در قسمت condition شرط حلقه بررسی میشود که کنترل کنندهی حلقه است و میتواند هر نوع عبارت بولینی باشد. تا زمانی که مقدار condition برابر با true است قسمت statement اجرا میشود. به مثال زیر که قبلاً آن را با استفاده از حلقهی for انجام دادیم توجه کنید:
using System; class Example { static void Main() { int i = 0; while (i < 5) { Console.WriteLine(i); i++; } Console.WriteLine("Done!"); } }
اگر این برنامه را اجرا کنید متوجه خواهید شد که نتیجهی یکسانی با مثال انجامشدهی حلقهی for دارد. در این حلقه، قسمت iteration داخل حلقه قرار دارد و مقداردهی اولیه بیرون از حلقه قرار داده شده است. در این مثال تا زمانیکه مقدار condition برابر با true است، حلقه اجرا میشود.
تمرین
تمرین شماره ۱: با استفاده از حلقهی for برنامهای بنویسید که اعداد زوج ۰ تا ۱۰۰ را چاپ کند.
تمرین شماره ۲: با استفاده از حلقهی for برنامهای بنویسید که اعداد ۰ تا ۱۰۰ را از انتها تا ابتدا چاپ کند.
تمرین شماره ۳: با استفاده از حلقهی for برنامهای بنویسید که اعداد فرد ۰ تا ۱۰۰ را چاپ کند.
تمرین شماره ۴: با استفاده از حلقهی for برنامهای بنویسید که مضارب ۵ اعداد ۰ تا ۱۰۰ را چاپ کند.
تمرین شماره ۵: تمرینهای ۱ تا ۴ را با استفاده از حلقهی while انجام دهید.
تمرینها باید توسط شما خوانندگان عزیز انجام شود. در قسمت بعدی حل این تمرینها با توضیحات کامل در وبتارگت قرار داده خواهد شد ولیکن سعی کنید ابتدا خودتان در حل تمرینها فکر و تلاش لازم را انجام دهید.
diho
5 October 2012
بلاخره رسیدیم به تمرینات :D
داوود
6 October 2012
با سلام به شما دوست و استاد عزیز آقا مسعود؛
ضمن تشکر بخاطر نظمی که در انتشار مطالب دارید و همچنین زحمتی که بابت تهیه اونها متحمل میشید من با اجازه تون تمرینها رو در اینجا قرار میدم.
ببخشید اگه مرتب نیستند.
مسعود درویشیان
6 October 2012
سلام
تمرینهایی که اینجا حلشون رو فرستادید بعضیهاشون درست هستن و بعضیهاشون مشکل دارن. یکی از مشکلاتتون اینه که توی یه برنامه چندینبار از متد ()Main استفاده کردید در صورتیکه باید فقط یکبار استفاده کنید.
توی قسمت بعد کامل متوجه میشید که مشکلتون چی بوده
ممنون بابت حل تمرینها
داوود
6 October 2012
سلام آقا مسعود؛ آره من کاملا به این موضوع واقفم و میدونم که اینجوری ایراد داره و میشد این مورد رو با switch-case نوشت و هر کدوم از برنامه ها رو که دوست داشت انتخاب کرد. من فقط جهت اینکه حل برنامه ها رو فرستاده باشم اینجوری فرستادم و در واقع زمان تست اونها رو comment می کردم.
موفق باشید.
علی حیدرزاده
11 October 2012
من اینجوری حل کردم
نمایش اعداد زوج
نمایش اعداد فرد
ومضارب عدد 5
مسعود درویشیان
13 October 2012
خوبه ممنون
علیرضا اسکندرپور شوفری
18 April 2013
مسئله 5 رو خوب درک نکردید. و الزاما نباید تعریف متغیر خارج حلقه صورت بگیره. میتونید داخل حلقه در بخش اول تعریفش هم کنید.
مهدی
16 November 2012
مسعود درویشیان
16 November 2012
روش صحیح نمایش اعداد زوج رو میتونید توی قسمتهای بعد ببینید. مضارب 5 رو درست انجام دادید.
کوثر
12 September 2013
در مورد ضریب پنج بهتره اینطوری نوشته بشه:
for (int i = 0; i < 100; i++)
{
if (i % 5 == 0)
{
Console.WriteLine(i);
}
}
بیتا
17 November 2012
سلام برای من دانلود پی دی اف باز نمیشه
مسعود درویشیان
17 November 2012
لینک سالمه!
کلیک سمت راست کنید و لینک رو save کنید.
بیتا
18 November 2012
متشکرم درست شد راستی نمیشه چند تا تمرین حل شده بذارین؟
باتشکر از زحمات شما
مسعود درویشیان
18 November 2012
تا الان 11 تا تمرین توی سایت قرار دادیم. قسمتهای بعدی رو ببینید…
علیرضا اسکندرپور شوفری
18 April 2013
اگر من نویسنده بودم تمرین هایی که میگفتم رو حل نمیکردم. دوستان زحمت حلش رو میکشیدن و توی کامنت مذاشتن و من ایراداتشون رو اونجا میگیرفتم. این بنظر من بهتره که اینجا الان در حال حاضر پیاده میشه.
Praise
12 December 2012
علیرضا
26 January 2013
int i ,b ;
i=0;
b = 2;
while (i <= 100)
{
Console.WriteLine(i);
i += b ;
}
Console.WriteLine("done");
tamrin 4:
int i,b;
i = 5;
b = 5;
while (i <= 100)
{
Console.WriteLine(i);
i +=b ;
}
Console.WriteLine("done");
علیرضا اسکندرپور شوفری
18 April 2013
تمام مسائل رو حل کردم فقط مسئله 4 رو من اینطوری برداشت کردم که اعداد از 0 تا 100 اونایی که مضربی از 5 هستن رو چاپ کنم! منم نوشتم. گفتم شاید دوستان بخوان هم با این مسئله و طریقه ی نوشتن من اشنا بشن:
علیرضا اسکندرپور شوفری
18 April 2013
در قسمت بعدی دیدم شما هم مثل من حل کردید. پس اون دوستمون در کامنت های اول (علی حیدرزاده) چرا به اون صورت نوشتن و شما افرین گفتید؟! درک درست مسئله همیشه در همه موضوع مهم ترین قسمت بوده. ولی الان خوشحالم ;)
میلاد
24 April 2013
با سلام و خسته نباشید
خیلی ممنون برای مطالبی ک مینویسید
خیلی بدرد بخور هستند
تنتون سالم انشالا
موفق باشید
علی ابراهیمی
30 December 2013
لطفا ببینین اینا درستن
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace S9_EXS
{
class Program
{
static void Main(string[] args)
{
Console.Write(“Enter the number of exercise: “);
string n = Console.ReadLine();
int x =0;
if (n == “1”)
{
Console.WriteLine(“Exercise number 1: Even numbers from 0 to 100\n”);
for (x = 0; x = 0; x–)
Console.WriteLine(x);
}
if (n == “3”)
{
Console.WriteLine(“Exercise number 3: Odd numbers from 0 to 100\n”);
for (x = 1; x <= 100; x += 2)
Console.WriteLine(x);
}
if (n == "4")
{
Console.WriteLine("Exercise number 4: Multiple's of number 5 between 0 & 100\n");
for (x = 0; x <= 100; x += 5)
Console.WriteLine(x);
}
}
}
}
[/C#]
مسعود درویشیان
30 December 2013
یه مشکلات کوچیکی داره
به مثال هایی که خودم حل کردم دقت کنید.
Yakubu
9 March 2014
That’s really sherdw! Good to see the logic set out so well.
سعید
1 June 2014
فوق العادس آقا مسعود
عاطفه
2 March 2015
سلام من تازه دارم برنامه نویسی یاد میگیرم به زبان جاوا میشه تو نوشتن این برنامه که برنامه ای بنویسید که n را از کاربر بگیرد و قطعه کد زیر را چاپ کند.تعداد سطر ها و ستون ها n تا اند خیلی ممنون یکم عجله دارم.
*@*@*@*@*@……….n تا
@*@*@*@*@*…………
……………..
…………….
سجاد بافنده
22 February 2019
باسلام خسته نباشید من میخواستم برنامه ای بنویسم که تازمانی که
عدد منفی یک وارد نشده است اعدادی را از کاربر بگیرد و میانگین انهارا نمایش دهد ممون میشم بهم بگین چجوری باید بنویسم.