تکین وب | آموزش برنامه نویسی
تکین وب | آموزش برنامه نویسی

ساختار تکرار و تصمیم در ++C

دسته بندی : آموزش ++C
۳۱ مرداد ۱۳۹۴

شاید در بسیاری از برنامه های ساده ای که می خواهیم بنویسیم ، به تکرار یک یا چند دستور برای تعدادی محدود یا نامحدود نیازمند باشیم . مثلا فرض کنید بخواهیم از ۱۰۰۰ دستور cout برای چاپ کردن یک عبارت خاص استفاده کنیم . اما آیا این عاقلانه است که ۱۰۰۰ بار دستور cout را  بنویسیم؟؟؟؟ آن وقت به یک برنامه متشکل از کدهای تکراری می رسیم که دیدن آن برای هر کسی کسل کننده است و ممکن است حتی برای خودمان هم خسته کننده باشد . پس باید به دنبال یک راه حل بود . راهی که ما را در کوتاه ترین زمان به هدفمان نزدیک کند . برای این منظور یعنی جلوگیری از دستورات تکراری ، از انواع حلقه ها استفاده می کنیم .

معرفی حلقه for

در نگاه اول برای یک مبتدی آشنایی با این حلقه کمی گمراه کننده به نظر می رسد . اما نگران نباشید . اول باید بدانید که این حلقه از اجزایی تشکیل شده اند ، اجزایی که در ادامه به بررسی آنها می پردازیم :

( گام حرکت ; شرط حلقه ; مقدار اولیه اندیس حلقه)for

}

;  دستور یا دستورات حلقه

{

for(int i = 0 ; i <10 ; i ++)
{
cout<<"welcome to Takinweb"<<endl;
}

در بالا بدنه یا پوسته کلی یک حلقه for و همینطور تکه کدی از آن را مشاهده می کنید . این حلقه دارای یک متغیر دلخواه می باشد که باید مقدار اولیه داشته باشد . وظیفه ی این متغیر کنترل تعداد دفعات تکرار حلقه می باشد . مثلا در کد بالا  متغیر i همان کنترل کننده است و دارای مقدار اولیه صفر می باشد . باید بدانید که مقدار اولیه دادن به این متغیر بستگی به شما و کاری که میخواهید برنامه انجام دهد ، دارد . پس دستور cout در کد بالا از بار صفرم شروع می شود .

نکته بعدی مربوط به شرط حلقه می باشد . قبل از اینکه دستوری از این حلقه بخواهد اجرا شود ، باید متغیری که تعریف کردیم (یعنی همان متغیر i با مقدار اولیه صفر ) ، با شرط حلقه بررسی شود . شرط حلقه در کد بالا کوچکتر بودن i از مقدار ۱۰ می باشد . پس چون i کوچکتر از ۱۰ است ، دستور cout اجرا می شود .

اما اگر یادتان باشد گفتیم میخواهیم حلقه تکرار شود پس بعد از آکولاد بسته  کامپایلر  دوباره به  داخل پرانتز for برمی گردد . تا اینجا یکبار این دستور اجرا شد . در این زمان یک گام به گام های تکرار حلقه اضافه می شود . و مقدار i یکی اضافه می شود ( یعنی همان ++i ). در این حالت i از مقدار صفر به مقدار یک تغییر می کند و دوباره شرط حلقه بررسی می شود و اگر مقدار i در شرط حلقه صدق کرد ، دوباره دستور cout اجرا خواهد شد .

این تکرار ها و بررسی ها تا زمانی جلو می رود که i دارای مقدار ۱۰ شود . حال چون مقدار i در شرط i<10 صدق نمی کند ، حلقه for دیگر تکرار نمی شود و به پایان میرسد .

گاهی میخواهیم برنامه ای داشته باشیم که حلقه for تا بی نهایت تکرار شود و تا زمانی که من کاربر دستور نداده ام به تکرار خود ادامه دهد . در این صورت باید به دستور زیر توجه کنید :

(;;)for

}

   ; دستورات حلقه

{

همانطور که مشاهده میکنید به جای شرط حلقه و مقدار اولیه متغیر و گام حرکت از دو سمیکالن استفاده کرده ایم . در این صورت تا وقتی بخواهیم این حلقه تکرار می شود و اگر ctrl + break را از صفحه کلید فشار دهیم این حلقه پایان می پذیرد .

نکته بعدی این است که اگر شما  خواستید فقط یک دستور را در حلقه for قرار دهید دیگر لازم نیست از آکولاد باز و بسته استاده نمایید . توجه کنید که مقدار اولیه متغیر حلقه و شرط و گام حلقه با سمیکالن از هم جدا می شوند .

می توانید از حلقه های تو در تو نیز استفاده کنید .حلقه های تو در تو به معنای قرار گرفتن یک  حلقه در یکه حلقه ی دیگر می باشد . هر حلقه برای خود دارای ویژگی هایی که در بالا بیان شد ، می باشد . با این تفاوت که به ازای هر یک بار تکرار حلقه خارجی ، هر چند بار تکراری که حلقه داخلی دارد ، تکرار می شود . برای شفاف شدن موضوع به تکه کد زیر توجه نمایید :

for(int i = 0 ; i < 4 ; i ++)
{
for(int j =0 ; < 4 ; j ++)
{
cout<<"welcome to Takinweb"<<endl;
}
}

همانطور که می بینید این کد از دو حلقه تشکیل شده که به ازای هر بار تکراز حلقه بیرونی ۴ بار حلقه داخلی تکرار می شود تا زمانیکه حلقه بیرونی شرط را i<4 را نداشته باشد . توجه کنید که حلقه داخلی از یک متغیر دیگر با یک شرط دلخواه دیگر می باشد . در این صورت باید به خروجی زیر برسید  یعنی ۱۶ بار عبارت welcome to Takinweb برایتان چاپ خواهد شد :

a90

یک برنامه خیلی ساده چاپ اشکال هندسی با استفاده از کارکتر ستاره می باشد که در پایان این بخش انتظار می رود که قبل از دانلود سورس برنامه ها خودتان را محک بزنید و با استفاده از آن چه تا به حال فرا گرفته اید ، اقدام نمایید .

 اما بعد از آشنایی با حلقه for نوبت به حلقه while می رسیم .

معرفی حلقه while و do while

ممکن است در برخی از برنامه ها نتوانید از حلقه for برای بیان آنچه می خواهید که برنامه انجام دهد ، استفاده کنید و به دنبال راه دیگری برای بیان تکرار باشید . در این جا به معرفی حلقه تکرار while می پردازیم .

( شرط )while

}

  ; دستور یا دستورات

{

در این حلقه ابتدا شرط بررسی می شود و اگر درست بود ، دستورات داخل  حلقه اجرا خواهند شد . اگر شرط درست نبود ادامه اجرای برنامه به بیرون از حلقه ملحق خواهد شد .

اما در کنار حلقه while ، حلقه ی do ….while هم وجود دارد . شاید سوالی که مطرح شود این باشد که این دو حلقه چه تفاوتی با هم دارند ؟ در ادامه تفاوت این دو حلقه مشخص خواهد شد :

do

}

  ;دستورات

;( شرط )while{

همانطور که می بینید ساختار این حلقه به صورت بالاست . ابتدا به کامپایلر دستور داده می شود که دستورات داخل آکولاد را برای اولین بار بدون در نظر گرفتن شرط ،  اجرا کند و بعد از آن به شرط می رسد و اگر شرط صادق بود دوباره دستورات را اجرا می کند . پس یک تفاوت اصلی این حلقه با حلقه while در نحوه ی اجرا شدن آن می باشد . چرا که حلقه do….while همیشه یکبار دستورات را اجرا می کند و سپس به سراغ شرط می رود ولی در حلقه while ابتدا شرط و بعد دستورات اجرا می شوند . در do…while حتی اگر شرط درست نباشد ، ما یکبار دستورات خود را اجرا کرده ایم .

معرفی if …..else

گاهی ممکن است بخواهیم برنامه ای را تنظیم کنیم که در آن از شرط های مختلفی جهت اجرا شدن برنامه نیازمند باشیم  . در این صورت به ساختار تصمیم if مراجعه می کنیم . این ساختار دارای شرطی است که در صورت درست بودن آن شرط ، دستورات اجرا می شوند و در صورت نادرستی آن دستورات دیگری اجرا می شوند . پس می توان گفت اگر شرط درست بود ، دستورات اجرا شوند وگرنه دستورات بعدی باید اجرا شوند . بنابراین اگر همان if و وگرنه همان else  است :

(  شرط  )if

}

; دستورات

{

else

}

; دستورات

{

همانطور که در بخش قبلی گفتیم ، اگر فقط یک شرط داشتیم ، نیازی به آکولاد باز و بسته نیست .

معرفی break

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

int count = 0 , number ;
while(1)
{
cout<<"yek adad vared konid :"<<endl;
cin>>number;
if(number == 0)
break ;
if(number % 2 == 0)
count ++ ;
}
cout<<count ;

در تکه کد بالا شرط while دارای یک شرط متفاوت است . نوشتن عدد ۱ در شرط while به این معناست که تا وقتی که میخواهیم  یعنی تا بی نهایت . اما توجه کنید شرطی هم وجود دارد که باعث می شود از حلقه بیرون بیاید و آن شرط صفر بودن عدد وارد شده از طرف کاربر می باشد . اگر این عدد صفر باشد با دستور break  از حلقه بیرون می آید و تعداد اعداد زوجی که کاربر تا آن زمان وارد کرده با دستور ++count شمارش می شوند و در خروجی نمایش داده خواهد شد .

 

معرفی continue

این دستور در حلقه تکرار باعث انتقال کنترل به ابتدای حلقه می شود و بعد از آن شرط حلقه بررسی می شود . در صورت درستی شرط ، اجرای دستورات حلقه ادامه می یابد در غیر این صورت حلقه تکرار به پایان می رسد :

char ch1;
int done = 1;
while(done)
{
cout<<"yek character vared konid :"<<endl;
cin>>ch1;
if(ch1 == '*')
{
done = 0 ;
continue;
}
cout<<"characteri ke vared kardi"<<ch1;
}

برای مثال در تکه کد بالا حلقه ی while تا زمانی که شما کارکتر ستاره را وارد نکرده باشید ، ادامه دارد و به محض اینکه کارکتر ستاره را وارد کردید ، ابتدا متغیر done را صفر می کند و با دستور continue به ابتدای حلقه می رود و چک می کند که آیا done برابر ۱ است یا خیر؟ وقتی دید که این متغیر به صفر تغییر کرده و درستی شرط را زیر پا گذاشته از حلقه بیرون می آید . و در آخر کارکتری را که وارد کرده بودید را روی صفحه چاپ می کند .

ساختار switch ….case

همیشه برای نوشتن برنامه ای که قرار است به دست تعدادی زیادی کاربر برسد ، باید احتمالات زیادی را در برنامه قرار دهیم . به این معنی که اگر کاربر ۱ فلان تصمیم را گرفت ، برنامه ی من آنقدر قابلیت بالایی دارد که می تواند به خواسته ی او پاسخ دهد .  فرض کنید می خواهیم برنامه ای بنویسیم که دارای تعدادی زیادی شرط است ( این شرط ها همان خواسته های مختلف کاربران است  ). پس باید به چاره ای اندیشید که بتواند پاسخ گوی نیاز کاربران باشد . به همین منظور از ساختار switch…case استفاده میکنیم . برای درک این موضوع به ماشین حساب فکر کنید. ماشین حساب دارای یک قابلیت است و آن این است که اگر کاربری + را انتخاب کرد ، دو عدد باهم جمع ، اگر – را را انتخاب کرد دو عدد از هم کم ، اگر * را انتخاب کرد ، دو عدد در هم ضرب و ….. شوند . پس این یک پیش بینی است …..ساختار switch…case به صورت زیر است :

( عبارت )switch

}

< ;دستورات ۱>  : <مقدار ۱> case

 ;break

< ;دستورات۲ >  : <مقدار ۲> case

 ;break

….

 : default

< ;دستورات n >

{

int a, b ;
char opera ;
cout<<"2 adad a va b va operator ra vared kon "<<endl;
cin>>a>>opera>>b;
switch(opera)
{
case '+' : cout << a + b ;
break ;
case '-' : cout << a - b ;
break ;
case '*' : cout << a * b ;
break ;
case '/' : cout << a / b ;
break ;
default : cout<<"operatori ke vared kardi gheyre mojaze!!!"<<endl;
}

تکه کد بالا قسمت کوچکی از برنامه ماشین حساب را نشان می دهد . در ابتدا بعد از تعریف متغیر ها ، و وارد کردن آن ها از طریق کاربر ، متغیر opera که یک کارکتر است  بررسی می شود . (بررسی توسط case های مختلف و قرار گرفتن به عنوان متغیری که باید بررسی شود در جلوی کلمه switch)

در case اول بررسی میکند که اگر opera عملگر جمع بود ، مقدار a با b جمع شود و در صفحه نمایش داده شود در غیر این صورت از حلقه اول بیرون بیاید . (بیرون آمدن از حلقه یعنی بیرون آمدن از case اولی ). اگر opera عملگر تفریق بود ، دو عدد از هم کم شوند . به همین ترتیب تا آخر ….. اگر هیچ کدام از این ۴ کارکتر وارد نشدند ، بر روی صفحه با دستور default عبارت غیرمجاز بودن کارکتر وارد شده را نمایش می دهد .

نکته : اگردر یک case دستور break به کار برده نشودبا  case بعدی  or می شود .

نکته : می توانید ازswitch های تو در تو هم استفاده کنید .

نکته : مقادیر موجود در case ها نمی توانند با هم مساوی باشند .

نکته : برای ساخت یک منو معمولا از switch ….case استفاده می کنند .

 و اما……..

حالا نوبت شماست که خودتان را محک بزنید . قبل از دانلود سورس برنامه ها ، ابتدا خودتان تمرین کنید و بدانید که فقط با تمرین می توانید یک برنامه نویس شوید .

دانلود سورس برنامه ها شامل چاپ اشکال هندسی با کارکتر ستاره با حلقه تکرار  :  اشکال هندسی با کارکتر ستاره

در ضمن اگر اینستاگرامی هستید حتما @Takinweb را فالو کنید….

درباره ی عطیه رحمانی

دیدگاه ها

دیدگاه خود را به ما بگویید.

کلیه ی حقوق مادی و معنوی مطالب متعلق به سایت تکین وب می باشد و کپی برداری و بازنشر آن بدون ذکر منبع کاری غیر حرفه ای و غیر اخلاقی و قابل پیگرد قانونی خواهد بود.
کانال تلگرام تکین وب