کد:
if (condition) statement ;
درصورتي كه بيش از يک دستور مورد نظر باشد، شکل دستور if به صورت زير خواهد بود.
کد:
if (condition)
{
statements ;
}
در هر دو شکل ifدستورها درصورتي اجرا ميگردد كه شرط مورد نظر، كه پس از كلمة كليدي if در داخل يك زوج پرانتز بيان شده است، برقرار باشد. در هر حال پس از پايان اجراي ساختار if، دستورهاي پس از ساختار if اجرا ميگردند. شرط مورد نظر ممكن است به صورت عبارت منطقي بيان گردد كه در اين صورت اگر نتيجة آن true (يا عدد غيرصفر) باشد، باز هم دستورهای داخل زوج آكولاد اجرا ميگردد و سپس كنترل به اولين دستور بعد از ساختار if انتقال مييابد؛ و اگر نتيجة آن نادرست يعني false (يا عدد صفر) باشد، مشابه حالت شرطي كنترل مستقيماً به بعد از ساختار if انتقال مييابد.
شکل کلي دستور if-elseبه صورت زير است.
کد:
if (condition)
{
statements1;
}
else{
statements2 ;
}
next statement ;
در اين حالت condition عبارت شرطي يا عبارت منطقي است كه اگر شرط مورد نظر برقرار باشد يا نتيجة عبارت منطقي درست باشد، دستورهاي داخل زوج آكولاد اول اجرا ميگردد و كنترل به next statement انتقال مييابد وگرنه دستورهاي داخل زوج آكولاد دوم اجرا ميشود و باز هم كنترل به next statement انتقال مييابد.
نمودار هر دو ساختار در شکل 5ـ4 نشان داده شده است. اگر دستورهاي بعد از if يا else بيش از يك دستور نباشد، به استفاده از زوج آكولاد نیازی نخواهد بود. ساختار if را ميتوان به صورت تودرتو نيز به كار برد كه در اين صورت هم if و هم else به صورت تودرتو تا هرچند سطح كه منطق برنامه نياز داشته باشد تكرار میشوند.
مثال 5ـ10 برنامهاي بنويسيد كه متني را بخواند و تعداد محلهاي خالي، ارقام، حروف، پايان خط و جمع ساير نشانههاي موجود در آن متن را بشمارد و چاپ کند.
کد:
#include
main()
{
int c , blank_cnt , digit_cnt , letter_cnt , n1_cnt , other_cnt ;
blank_cnt=digit_cnt=letter_cnt=n1_cnt=other_cnt= 0;
while ((c=gethar())!=EOF)
if (c= =’ ’)
++ blank_cnt ;
else if (’0’<=c&&c<=’9’)
++ digit_cnt ;
else if (’a’<=c && c<=’z’ | | ’A’<=c && c<=’Z’)
++ letter_cnt ;
else if (c= =’\n’)
++n1_cnt ;
else
++ other_cnt ;
printf ("\n%12s %12s %12s %12s %12s %12s","blanks","digits",
"letters","lines","others","totals") ;
printf("\n\n %12d %12d %12d %12d %12d %12d
\n\n" , blank_cnt , digit_cnt , letter_cnt , n1_cnt , other_cnt ,
blank_cnt + digit_cnt + letter_cnt + n1_cnt + other_cnt) ;
}
شکل 5ـ4 نمودار دو ساختار if و if – else
مثال 5ـ11 برنامهاي بنويسيد كه کد اسكي كاراكتری را بخواند و تشخيص دهد كه كدام يك از كاراكترهاي پايان فايل يا EOF، خط جديد يا new line، رقم يا digit، كنترل كاراكتر (كاراكترهايي كه کد اسكي آنها كوچكتر از 32 است و قابل چاپ نيستند و 32 كه کد اسكي كاراكتر فضاي خالي يا ’’ است، پس کد اسكي كنترل كاراكترها از کد اسكي ’’ كوچكتر است)، حروف بزرگ، حروف كوچك و يا ساير كاراكترهایند.
کد:
#include
main ()
{
int ch ;
printf("please enter a character?") ;
ch = getchar() ;
if (ch= = EOF)
printf("\n end of file found\n") ;
else
if (ch= =’\n’)
printf("\n new line character\n") ;
else
if (ch<’ ’)
printf("\n control character %d \n", ch) ;
else
if ((ch>=’0’) && (ch<=’9’))
printf("\n character %c is a digit\n", ch) ;
else
if ((ch>’A’) && (ch<=’Z’))
printf("\ncharacter %c is upper-case\n", ch)) ;
else
if ((ch>=’a’) && (ch<=’z’))
printf("\n character %c is lower-case\n", ch) ;
else
printf("\n other printable character %c \n", ch) ;
}
دستور switch
اين ساختار يا دستور موجب ميگردد كه گروه مشخصي از دستورها بين چندين گروه از دستورها انتخاب گردد. اين انتخاب بستگي به مقدار فعلي يك عبارت خواهد داشت كه در switch منظور شده است. قبلاً گفتیم که در دستور if-else، بر اثر وجود يا عدم وجود شرط (يا شرايطي)، يكي از دو مجموعه دستورها انتخاب و اجرا ميگردد. به عبارت ديگر در اينجا حداكثر دو انشعاب يا دو شاخه وجود دارد كه بايد فقط بر اثر نتيجة بررسی شرط مورد نظر، يكي از آن دو شاخه يا مسير انتخاب گردد. دستور switch اين امكان را فراهم ميسازد كه از بين شاخههاي متعدد (بيش از دو شاخه) فقط يكي انتخاب گردد كه قانون انتخاب را نتيجة ارزيابي عبارت ذكر شده در switch تعيين ميكند. بنابراين، اين دستور اجازة چندين انشعاب ميدهد.
شکل كلي ساختار switch به صورت زير است.
کد:
switch(expression)
{
case exp1: statements 1
break ;
case exp2: statements 2
break ;
....
....
case exp n: statements n
break ;
default: statements
break ;
}
در دستور switch نتيجة عبارت يا expression كه پس از كلمة كليدي switch در داخل يك زوج پرانتز قرار دارد يك عدد صحيح خواهد بود. در ضمن expression ممکن است كاراكتر نيز باشد زيرا هر كاراكتر نيز مقدار صحيح همارزي دارد كه کد اسكي آن كاراكتر است. statement معمولاً دستوری مرکب است. break براي خروج از دستور است.
نمودار ساختار switch در شکل 5ـ5 نشان داده شده است.
نحوة عملکرد ساختار switch بدين شکل است كه وقتي اين دستور اجرا ميشود عبارت ذكر شده در switch محاسبه و ارزشيابي ميشود. سپس نتيجة آن از بالا به پايين به ترتيب با مقدار ذكر شده در case يعني exp 1 , exp 2 ,... , exp nمقايسه ميشود. اگر نتيـجة مقايسه با هركدام از مقادير ذكر شده در case هاي مزبور برابر باشد، دستورهاي ذكر شده در آن case اجرا ميگردد و كنترل اجراي برنامه به اولين دستور پس از ساختار switch انتقال مييابد. چنانچه مقدار ذكر شده در switch با هيچ يك از مقادير ذكر شده در caseهاي متوالي يكسان نباشد، مجموعه دستورهاي مربوط به default به عنوان پيشفرض اجرا ميگردد.
شکل 5ـ5 نمودار ساختار switch
در دستور switch استفاده از حالت default دلخواه است. بنابراين چنانچه حالت default به كار برده نشود و مقدار عبارت switch در مقابله با مقادير ذكر شده در caseهاي متوالي مساوي (همسان) نباشد، دستور switch خاتمه مييابد و كنترل برنامه به اولين دستور بعد از switch انتقال مييابد.
يادآوري مهم. گفتیم، عبارت ذكر شده در switch فقط مقادير صحيح يا كاراكتر را میپذیرد. بنابراين برخلاف دستور if نميتوان در آن از عبارت رابطهاي و منطقي استفاده كرد؛ به عبارت ديگر switch فقط تساوي را تست ميكند، اما if عبارات رابطهاي و منطقي را نيز ارزيابي ميكند. نتيجهاي كه ميتوان گرفت آن است كه در حالت كلي نميتوان دستور switch را حالت تعميميافتة دستور if-else براي m انشعاب تصور كرد.
دستور switch براي پردازش فرامين صفحه كليد بسيار مناسب است و در واقع شکل تغييريافتهاي از دستور if-else است.
مثال 5ـ12 برنامة زير با استفاده از دستور switch ارقام 0 تا 9 را از ورودي دريافت میکند و آنها را با حروف نمايش ميدهد.
کد:
main ()
{
char digit ;
digit = getchar() ;
switch (digit)
{
case 0: printf ("zero") ;
break ;
case 1: printf ("one") ;
break ;
case 2: printf ("two") ;
break ;
case 3: printf ("three") ;
break ;
case 4: printf ("four") ;
break ;
case 5: printf ("five") ;
break ;
case 6: printf ("six") ;
break ;
case 7: printf ("seven") ;
break ;
case 8: printf ("eight") ;
break ;
case 9: printf ("nine") ;
break ;
default: printf("it is not digit");
}
}
مثال 5ـ13 برنامة زير با استفاده از دستور switch متغير كاراكتري color را كه معرف رنگ است از صفحه كليد دريافت میکند و رنگي را که با آن حرف آغاز ميشود در خروجي چاپ ميکند.
کد:
#include
main ()
{
char color ;
color = getchar() ;
switch (color)
{
case ’Y’: printf ("Yellow") ;
break ;
case ’B’: printf ("Black") ;
break ;
case ’W’: printf ("White") ;
break ;
case ’R’: printf ("Red") ;
break ;
case ’G’: printf ("Green") ;
break ;
default: printf("error");
}
}
در اين برنامه ميتوان دستور switch را با دستور خواندن متغير از ورودي به شکل زير ترکيب کرد.
کد:
switch (color=getchar())
در مواردي براي چندين حالت مختلف يك نوع عمل انجام ميگيرد. در اين گونه موارد ميتوانيم همان دستورها را با چندين ثابت case مشخص كنيم.
مثال 5ـ14 به قطعه برنامة زير توجه کنید.
کد:
switch (ch)
{
case 'a':
case 'b': x = x + 1 ;
break ;
case 'c':
case 'd':
case 'e': x = x + 2 ;
break ;
default: x = x + 3 ;
break ;
}
دستور break
اين دو دستور مسير معمولي و ثابت كنترل را تغيير يا قطع ميکنند. دستور break براي خارج شدن از دستور switch و يا پايان دادن حلقهها استفاده ميشود. در واقع كنترل را به پايان ساختاري كه break در داخل آن به كار برده شده است انتقال ميدهد. در صورتي که دستور مزبور در يکي از حلقههاي for وwhile و do-while به كار رود، کنترل به محض رسيدن به break بلافاصله از حلقه خارج ميشود. بنابراين، اين روش براي پايان دادن به حلقهها در صورت بروز خطا يا شرايط خاص مناسب است.
مثال 5ـ15 به قطعه برنامة زير توجه کنيد.
کد:
while(1)
{ ch = getchar() ;
if (ch = = '@')
break ; /* exit loop */
printf ("%c ", toupper(ch)) ;
}
در صورتي که کاراکتر @ از ورودي خوانده شود، دستور break موجب خروج از حلقة بينهايت while ميگردد. در غير اين صورت حلقه ادامه خواهد يافت.
همان طور که ملاحظه ميکنيد شکل كلي دستور break به صورت زير است.
break ;
نحوة عملکرد اين دستور در شکل 5ـ6 آمده است.
شکل 5ـ6 نمودار دستور break
لازم به ذکر است که در حلقههاي تو در تو، دستور break براي انتقال کنترل به خارج از حلقة داخلي به کار ميرود.
دستور continue
این دستور به منظور عبور جانبي از کنار ساير مراحل جاري حلقه به کار میرود. در واقع باقيماندة تکرار جاري حلقه ناديده گرفته میشود و بلافاصله تكرار بعدي حلقه آغاز ميگردد. حلقه زماني که به دستور continue ميرسد خاتمه نمييابد و از اين جهت با دستور break تفاوت دارد. اين دستور ممکن است با ساختارهاي for , do-while , while به كار رود و شکل كلي آن به صورت سادة زير است.
همچنين نحوة عملکرد اين دستور به صورت شکل 5ـ7 است.
شکل 5ـ7 نمودار دستور continue
مثال 5ـ16 برنامة زير با استفاده از دستور continue، n عدد از ورودي میخواند و مجموع اعداد مثبت را محاسبه ميکند.
کد:
#include
main ()
{
int n , i , x , sum = 0 ;
printf("how many numbers? ") ;
scanf("%d", &n) ;
for (i=1 ; i
{
scanf ("%d", &x) ;
if (x<=0)
continue ;
sum += x ;
}
printf ("\n sum = %d \n", sum) ;
}
دستور goto
اين دستور ترتيب طبيعي اجراي برنامه را تغيير میدهد و کنترل را به قسمت ديگري از برنامه منتقل ميکند. در واقع انتقال كنترل بدون شرط است و اصول برنامهسازي ساختيافته در زبان C را لغو ميکند. از اين رو استفاده از آن توصيه نميشود. در برخي زبانهاي برنامهنويسي قديمي مثل فورترن و بيسيک کاربرد گستردهاي دارد. شکل كلي اين دستور به صورت زير است.
goto label ;
كه در آن label شناسهاي است كه محل انتقال يا محل دستور بعديای را كه بايد اجرا شود نشان ميدهد. بنابراين، محل انتقال كنترل يا جملة هدف بايد label داشته باشد. پس از برچسب علامت دو نقطه به کار ميرود. شکل آن به صورت زير است.
مثال 5ـ17 به قطعه برنامة زير توجه کنيد.
{
---------
---------
goto msg ;
---------
---------
}
msg: printf("\n please try again") ;
اما گاهي استفاده از دستور goto مفيد است و کار را ساده ميکند. به عنوان مثال در صورتي که نياز باشد كنترل برنامه از درون دو حلقة تودرتو به خارج انتقال یابد معمولاً سادهترين حالت استفاده از دستور goto خواهد بود.
مثال 5ـ18 برنامة زير عددي صحيح از ورودي میخواند. در صورتي که زوج باشد پيغام مناسب را نمايش ميدهد، در غير اين صورت از برنامه خارج ميشود.
کد:
main ()
{
int n ;
scanf("%d", &n) ;
if (n % 2 = =0)
goto even ;
else
goto odd ;
even: printf("even number.\n") ;
exit(1) ;
odd: exit (0);
}
تابع exit
اين تابع اجراي برنامه را به طور كامل قطع میکند و كل برنامه را خاتمه میبخشد. اين تابع كه در كتابخانة استاندارد وجود دارد معمولاً با آرگومان صفر فراخواني ميشود و بر خاتمه پذيرفتن طبيعي برنامه دلالت ميكند. اما آرگومانهاي ديگري نيز دارد.
كاربرد متداول exitزماني است كه شرط خاصی براي اجراي برنامه برقرار نباشد و اجراي برنامه قطع شود.
مثال 5ـ19 به قطعه برنامة زير توجه کنيد.
کد:
{
....
if x<5
exit (0);
....
}
خودآزمایی 5
1. برنامهاي بنويسيد كه جدول ضرب اعداد 1 تا 10 را محاسبه و چاپ كند.
2. برنامهاي بنويسيد كه يك سطر متن را بخواند و تعداد محلهاي خالي (blank) موجود در آن را تعيين و چاپ كند.
3. موجودي 500000 ريال با سود بانکي 16 درصد در سال داريم. برنامهاي بنويسيد كه براي پنج سال متوالي موجودي را در پايان هر سال محاسبه و چاپ كند.
4. برنامهاي بنويسيد كه كاراكتري را از طريق ورودي بخواند و تعيين كند كه آيا كاراكتر مزبور يكي از كاراكترهاي EOF (پايان فايل)، خط جديد، رقم، حروف كوچك، حروف بزرگ يا از كاراكترهاي ديگر است.
5. عددي که مساوي مجموع مقسومعليههاي خود باشد را عدد كامل نامند، مانند عدد 6؛ يعني 6 = 3 + 2 + 1. برنامهاي بنويسيد كه عددي صحيح و مثبت را بخواندو تعيين كند كه آيا اين عدد كامل است يا نه.
6. در رياضي، سري فيبوناچي به صورت زير تعريف شده است.
1 1 2 3 5 8 13 …
كه در آن دو جملة اول و دوم برابر 1 است. در مورد بقية جملهها هر جمله برابر است با مجموع دو جملة قبلي آن. برنامهاي بنويسيد تا جملههای اول تا ده سري مزبور و مجموع آنها را محاسبه و چاپ كند.
7. برنامهای بنويسيد که چهار عمل اصلي ماشين حساب (جمع، تفريق، ضرب و تقسيم) را انجام دهد.
8. برنامهاي بنويسيد كه نمرات امتحاني n نفر دانشجو را بخواند و معدل كلاس، نمرة امتحاني شاگرد اول و شاگرد آخر كلاس را تعيين و چاپ كند.
9. برنامهاي بنويسيد که مجموع اعداد زوج و نيز مجموع اعداد فرد 1 تا n را محاسبه و چاپ کند.