ساختارهای تکرار،امکانات خوبی برای تکرار اجرای مجموعه ای از دستورات برنامه
می باشند . اما اگر بخواهیم تحت شرایطی که در برنامه اتفاق می افتد تصمیم گیری
لازم را داشته باشیم بطوری که تحت شرایطی ، مجموعه ای از دستورات اجرا شوند و
مجموعه ای دیگر از دستورات اجرا نشده وکنترل اجرای برنامه بجای دیگر منتقل شود
به ابزار دیگری بنام ساختارهای تصمیم نیاز داریم . این ساختارها در زبان های
برنامه سازی مختلف به اشکال متفاوتی وجود دارند که انواع مختلف آن را در زبان C
بررسی می کنیم .
ساختار تصمیم if
ساختار if ( که ساختار انتقال کنترل شرطی نیز نامگذاری میشود ) موجب میگردد
تا تحت شرایطی ، مجموعه ای از دستورات اجرا شده و یااز اجرای این مجموعه دستورات
صرفنظر گردد . این ساختار بصورت های زیر مورد استفاده قرار می گیرد .
(َ۱) ;دستور (شرط) if
(َ۲) (شرط) if {
مجموعه دستورات ۱ }
else
{
مجموعه دستورات ۲ }
در روش (۱) ، شرط ذکر شده بررسی می شود و در صورت برقرار بودن ، دستور بعد
از آن اجرا می شود و در غیر اینصورت کنترل اجرای برنامه به دستور بعد از if
منتقل می گردد .
در روش (۲) ، شرط ذکر شده بررسی می شود و در صورت برقرار بودن ، مجموعه
دستورات (۱) اجرا میشوند و در غیر اینصورت مجموعه دستورات (۲) اجرا خواهند شد.
لازم به ذکر است که وجود else در ساختار if اختیاری است . یعنی ساختار if را
بصورت زیر نیز می توان بکار برد :
(شرط) if {
مجموعه دستورات }
در روش فوق پس از این که کنترل اجرای برنامه به if رسید شرط مورد نظر بررسی
می شود . چنانچه این شرط برقرار باشد ، مجموعه دستورات داخل {و }و ( که یک بلاک
نامیده می شود ) اجرا می گردد وگرنه کنترل اجرای برنامه به اولین دستور بعد از
بلاک if منتقل خواهد شد . استفاده از ساختار if بصورت لانه ای ( تو در تو ) نیز
امکان پذیر است که در اینصورت اولین else به آخرین if بر می گردد .
مثال ۱: برنامه ای که با خواندن یک جمله از ورودی ، تعداد کاراکترها و کلمات
موجود در جمله را محاسبه می کند . کلمات با فاصله (blank) از یکدیگر جدا شده و
انتهای جمله به کلید enter ختم می گردد . main)(
{
int charcount=0 ;
int wordcount=0 ;
char ch ;
printf(“type a statement:\n” );
while((ch=getche))(!=’\r’)
{
charcount ++ ;
if(ch==’ ‘)
wordcount ++ ;
}
printf(“\n character count is:”);
printf(“%d”/charcount );
printf(“\n word count is:”);
printf(“%d”/wordcount );
}
به نمونه ای از خروجی برنامه مثال ۱ توجه نمایید : type a statement:
this book is my fifth book.
character count is:27
word count is:6
مثال ۲: برنامه ای که بااستفاده از ساختار تصمیم if یک شکل گرافیکی را به کمک
کدهای اسکی DBو BOو رسم می کند . main)(
{
int x/y ;
for(y=1 ; y<11 ; y++)
{
for(x=1 ; x<11 ; x++)
{
if(x==y)
printf(“\xDB” );
else
if(x==11-y)
printf(“\xDB” );
else
printf(“\xBO” );
}
printf(“\n” );
}
}
مثال ۳: برنامه ای که تعداد کل کاراکترهای یک جمله و همچنین تعداد ارقام
موجود در آن را شمارش می کند . main)(
{
int charcnt=0 ;
int wordcnt=0 ;
char ch ;
printf(“\n enter a statement: \n” );
while((ch=getche))(!=’\r’)
{
charcnt++ ;
if(ch>=47 && ch<=58)
digthcnt++ ;
}
printf(“\n character count is:” );
printf(“%d”/charcnt );
printf(“\ndigit count is:”);
printf(“%d”/digtcnt);
}
به نمونه ای از خروجی برنامه مثال ۳ توجه نمایید : type a statement:
my telephone number is 817694.
character count is:31
digit count is:6
نکته ای که باید در مورد برنامه مثال ۳ توضیح داد این است که در دستور if
جهت تشخیص این که ، آیا کاراکتر وارد شده ، یکی از ارقام ۰تا ۹ا است یا خیر
از اعداد ۴۷ و ۵۸ استفاده شده است . زیرا کدهای اسکی ارقام ۰تا ۹ا در بین این
دو عدد ( از ۴۸ تا ۵۷ ) می باشند .
ساختار تصمیم else if
تاکنون ساختار if را مطالعه نمودیم و مثال هایی را در این زمینه مشاهده
کردیم . نکته ای باید به آن توجه داشت این است که اگر در ساختارif خواسته باشیم
چندین شرط را مورد بررسی قرار دهیم ، باید ساختار if را به صورت تودرتو بکار
ببریم که نه تنها موجب طولانی شدن برنامه می گردد ، بلکه خوانایی آن را نیز
پایین می آورد . ساختار else if که یک ساختار انتقال کنترل شرطی است می تواند
در این زمینه به ما کمک کرده تا بتوانیم از افزایش بی رویه طول برنامه جلوگیری
کنیم .
جهت روشن شدن مطلب به دو برنامه بعدی ( مثالهای ۴، ۵ ) که یکی با ساختار if
و دیگری با ساختار else if برای حل یک مساله نوشته شده اند توجه کنید . این
برنامه ها دو عدد و یکی از عملگرهای چهار عمل اصلی را از ورودی خوانده و عملگر
را بر روی دو عدد اجرا می کنند .
مثال ۴: main)(
{
int num1 / num2 ;
char op ;
while(1)
{
printf(“type number/operator/”);
printf(“number \n” );
scanf(“%d%c%d”/&num1/&op/&num2);
if(op==’+')
printf(“\n sum=%d”/num1+num2);
else
if(op==’-')
printf(“\nsubtract=%d”/num1-num2);
else
if(op==’*')
printf(“\nmultiple=%d”/num1*num2);
else
if(op==’/')
printf(“\ndivition=%d”/num1+num2);
else
printf(“\n operator is illegal”);
printf(“\n\n” );
}
}
به نمونه ای از خروجی برنامه مثال ۴ توجه نمایید : type number/operator/number
12 + 23
sum=35
type number/operator/number
2*26
multiple=52
type number/operator/number
4%2
operator is illegal
type number/operator/number
^c
مثال ۵: main)(
{
int num1 / num2 ;
char op ;
while(1)
{
printf(“type number/operator/”);
printf(“number \n” );
scanf(“%d%c%d”/&num1/&op/&num2);
if(op==’+')
printf(“\n sum=%d”/num1+num2);
else if(op==’-')
printf(“\n subtract=%d”/num1-num2);
else if(op==’*')
printf(“\n multiple=%d”/num1*num2);
else if(op==’/')
printf(“\n divition=%d”/num1+num2);
else
printf(“\n operator is illegal”);
printf(“\n\n” );
}
}
همانطورکه ملاحظه میشود برنامه ای که با ساختار else if نوشته شده است ( مثال ۵
) کوتاهتر بوده و از خوانایی بهتری برخوردار است . لذا توصیه می شود که در
این گونه موارد از else if بجای ساختار if استفاده گردد .
انتقال کنترل غیرشرطی
ساختارهای ifو else ifو را تحت عنوان انتقال کنترل شرطی مورد بررسی قرار
داده ایم . چند دستور در زبان C وجود دارند که بدون تست کردن شرطی سبب انتقال
کنترل برنامه ، از جایی به جایی دیگر می شوند . نام این دستور انتقال کنترل
غیرشرطی می باشد که در ذیل مورد بررسی قرار می گیرند .
دستور goto
در زبان C علاوه بر ساختارهای تصمیم ، دستوری بنام goto نیز وجود دارد که سبب
انتقال کنترل اجرای برنامه ، از نقطه ای به نقطه دیگر می گردد. این دستور بصورت
زیر بکار می رود : ;
برچسب دستور goto
برچسب دستور ، همانند یک متغیر نامگذاری شده و به دو نقطه (:) ختم می شود .
پیشنهاد می گردد حتی الامکان از دستور goto که معمولا” سبب کاهش میزان خوانایی
برنامه می شود ، استفاده نگردد .
مثال ۶: برنامه ای که با استفاده از دستور goto یک حلقه تکرار می سازد . main)(
{
int x=1 ;
loop1:
x++ ;
if(x<100 )goto loop1 ;
printf(“\n the maximum value”);
printf(” of x is:%d”/x );
}
خروجی حاصل از اجرای برنامه مثال ۶ : the maximum value of x is:100
یکی از خواص gotoدر Cر این است که از تابعی به تابع دیگر نمی توان انشعاب
کرد و فقط انتقال کنترل در یک تابع امکان پذیر است . یعنی برچسب goto باید در
تابعی باشد که این دستور در آن تابع بکار رفته است .
دستور break
این دستور یکی از دستورات انتقال کنترل غیر شرطی است و به صورت زیر مورد
استفاده قرار می گیرد :
دستور break به دو منظور استفاده می شود : الف ) خاتمه داده به case در
ساختار switch ، ب ) خاتمه دادن به حلقه تکرار ( حلقه های تکرار ممکن با for do
یا whileا ساخته شوند ) . پس از اجرای دستور break در داخل ساختارهای تکرار
کنترل اجرای برنامه به اولین دستور پس از حلقه تکرار منتقل می شود .
مثال ۷: main)(
{
int t ;
for(t=0 ; t<100 ; t++)
{
printf(“%3d”/t );
if(t==5)
break ;
}
printf(“\nmaximum value of t is:”);
printf(“%d”/t);
}
خروجی حاصل از اجرای برنامه مثال ۷: ۰ ۱ ۲ ۳ ۴ ۵
maximum value of t is:5
همانطور که از خروجی برنامه پیداست پس از آن که مقدار tبه ۵ رسید کنترل
اجرای برناه از حلقه تکرار for خارج شده و با اجرای دستور printfعدد ۵د را چاپ
می کند . نکته ای که در مورد break باید توجه داشت این است که اگر دو یا چند
حلقه تکرار تودرتو داشته باشیم ، دستور break موجود در داخلی ترین حلقه ، فقط
موجب خروج از همین حلقه تکرار می شود .
مثال ۸: main)(
{
int t ;
for(t=0 ; t<100 ; t++)
{
count=1 ;
printf(“\n” );
for(;;)
{
printf(“%3d”/count );
count ++ ;
if(count==4 )break ;
}
}
}
خروجی حاصل از اجرای برنامه مثال ۸: ۱ ۲ ۳
۱ ۲ ۳
۱ ۲ ۳
۱ ۲ ۳
۱ ۲ ۳
۱ ۲ ۳
در دو مثال ۷و۸و دوحلقه تکرار وجوددارد که حلقه داخلی یک حلقه بینهایت است .
در این حلقه ر گاه مقدار countبه ۴ برسد ، کنترل اجرای برنامه از این حلقه
خارج می شود .
دستور continue
دستور continue در یک حلقه تکرار ، موجب انتقال کنترل به ابتدای حلقه تکرار
شده ، بصورت زیر استفاده می شود : continue;
پس از اجرای این دستور کنترل به ابتدای حلقه برگشته و شرط حلقه تست می گردد
که در صورت برقرار بودن شرط ، مجموعه دستورات داخل حلقه تکرار مجددا” اجرا
می شوند وگرنه کنترل از حلقه تکرار خارج خواهد شد .
مثال ۹: برنامه ای که کاراکتری را از ورودی دریافت کرده و این کاراکتر و
کاراکتر بعد از آن را به خروجی می برد . main)(
{
char done=0 / ch ;
while(!done)
{
printf(“\n type a character / “);
printf(“& for exit :”);
ch=getch)(;
printf(“\n you typed the”);
printf(“character: %c”/ch);
if(ch==’&’)
{
done=1 ;
continue ;
}
printf(“\nthe next character is:”);
printf(“%c”/ch+1 );
}
}
به نمونه ای از خروجی برنامه مثال ۹ توجه نمایید : type a character /& for exit:
you typed the character: a
the next character is:b
type a character /& for exit:
you typed the character: b
the next character is:c
type a character /& for exit:
you typed the character: &
ساختار switch
ساختار switch که یکی از ساختارهای جالب جهت بالا بردن توانایی برنامه است
بصورت زیر استفاده می شود :
( عبارت ) switch {
:مقدار case 1
مجموعه دستورات ۱ break;
:مقدار case 2
مجموعه دستورات ۲ break;
.
.
.
default:
مجموعه دستورات }
نحوه عمل ساختار switch بدین صورت است که : عبارت ذکر شده در switch ارزیابی
می شود ، سپس نتیجه ارزیابی از بالا به پایین با مقادیر ذکر شده ( مقدار ۱
مقدار ۲ و … ) مقایسه می شود ( ابتدا با ” مقدار ” ۱ مقایسه می گردد ) اگر
نتیجه ارزیابی بااین مقدار برابر باشد مجموعه دستورات داخل آن case اجرا میشود
و با دستور break کنترل اجرای برنامه از این ساختار خارج می شود . اگر نتیجه
ارزیابی با ” مقدار ” ۱ برابر نباشد ، مقایسه با ” مقدار ” ۲ انجام می شود و
این روند تا انتهای این ساختار ادامه پیدا می کند . اگر هیچکدام از مقادیری که
در case ذکر شده اند با نتیجه ارزیابی ” عبارت ” برابر نباشند ، مجموعه دستورات
پس از defaule اجرا می شود . defaule اختیاری است و ممکن است در ساختار switch
استفاده نگردد. در این صورت اگر هیچکدام از مقادیر ۱، ۲ و… با نتیجه ارزیابی ”
عبارت ” برابر نباشند ، کنترل به بعد از ساختار switch برخواهد گشت .
حداکثر تعداد case که در یک ساختار switch می تواند قرار گیرد برابر با ۲۵۷
است .
نکاتی که در مورد ساختار switch باید در نظر داشت عبارتند از : ۱
این ساختار با ساختار if از این جهت متفاوت است که در ساختار switch فقط
مساله ” مساوی بودن “(equality() مطرح است اما در ساختار if می توان یک عبارت
منطقی و یا رابطه ای را مورد بررسی قرار داد . ۲
دو یا چند case در ساختار switch نمی توانند یک مقدار مساوی را مورد تست
قرار دهند . بعضی در نحوه کاربرد ساختار switch ، مقدار ۱ ، مقدار ۲ و …
نمی توانند با یکدیگر برابر باشند . ۳
اگر ثابت های کاراکتری در ساختارswitch بکار گرفته شوند، آنها به مقادیر ”
صحیح ” تبدیل می شوند . ۴
اگر در یک case از دستور break استفاده نشود پس از اجرای مجموعه دستورات
مربوط بخ این case مجموعه دستورات موجود در case بعدی نیز اجرا می شوند . ۵
دو یا چند شرط را می توان در ساختار switch با یکدیگر OR نمود که برای
این منظور کافی است چند case را با مقادیری که می خواهیم با هم OR شوند پشت سر
هم ذکر کنیم ( مثال ۱۱ ) .
مثال ۱۰: برنامه ای که دو عدد و یکی از عملگرهای چهار عمل اصلی را از ورودی
خوانده و عملگر را بر روی دو عدد عمل می کند . main)(
{
int num1 / num2 ;
char op ;
while(1)
{
printf(“type number/operator/”);
printf(“number \n” );
scanf(“%d%c%d”/&num1/&op/&num2);
switch(op)
{
case ‘+’:
printf(“\nsum=%d”/num1+num2);
break ;
case ‘-’:
printf(“\nsubtract=%d”/num1-num2);
break ;
case ‘*’:
printf(“\nmultiple=%d”/num1*num2);
break ;
case ‘/’:
printf(“\ndivition=%d”/num1+num2);
break ;
default:
printf(“\n operator is illegal”);
printf(“\n\n” );
}
}
به نمونه ای از خروجی حاصل از اجرای برنامه مثال ۱۰ توجه نمایید : type number/operator/number
12 + 23
sum=35
type number/operator/number
2*26
multiple=52
type number/operator/number
4%2
operator is illegal
type number/operator/number
^c
اگر بجای علامت *از ‘x’ز و یا بجای ‘/’از ‘\’ز استفاده گردد، این برنامه عمل
نخواهد کرد . اما برنامه ذیل ( مثال ۱۱ ) طوری طراحی شده است که با استفاده از
امکان ترکیب شرطهای مختلف در ساختار switch ، به این دو مورد نیز پاسخ دهد .
مثال ۱۱: برنامه ای که دو عدد و یکی از عملگرهای چهار عمل اصلی را از ورودی
خوانده و آن عملگر را بر روی آن دو عدد عمل می کند . main)(
{
int num1 / num2 ;
char op ;
while(1)
{
printf(“type number/operator/”);
printf(“number \n” );
scanf(“%d%c%d”/&num1/&op/&num2);
switch(op)
{
case ‘+’:
printf(“\nsum=%d”/num1+num2);
break ;
case ‘-’:
printf(“\nsubtract=%d”/num1-num2);
break ;
case ‘*’:
case ‘x’:
printf(“\nmultiple=%d”/num1*num2);
break ;
case ‘/’:
case ‘\\’:
printf(“\ndivition=%d”/num1+num2);
break ;
default:
printf(“\noperator is illegal”);
}
printf(“\n\n” );
}
}
نمونه ای از خروجی حاصل از اجرای برنامه مثال ۱۱ : type number/operator/number
20 x 4
multiple=80
type number/operator/number
60 \ 3
division=2o
type number/operator/number
4%2
operator is illegal
type number/operator/number
12 + 23
sum=35
type number/operator/number
2*26
multiple=52
type number/operator/number
^c
مثال ۱۲: برنامه ای که اطلاعات تعدادی از ورودی خوانده و سپس معدل هر دانشجو
را محاسبه می نماید. پس از محاسبه معدل ، دانشجویان ممتاز ( معدل بیشتر از ۱۷ )
و دانشجویان مشروط ( معدل کمتر از ۱۲ ) را مشخص و در خروجی چاپ می کند . main)(
{
int sumgrad/sumunit/number ;
int cours/unit/grad/aver/j/n=0 ;
char name[20] ;
printf(“enter number of student:\t”);
scanf(“%d”/&number);
while(n!=number)
{
n++ ;
sumunit=sumgrad=j=0 ;
printf(“\n enter name of student “);
printf(“%d:”/n );
scanf(“%s”/&name );
printf(“\n enter number of cours “);
printf(“of this st:.”);
scanf(“%d”/&cours );
while(j!=cours)
{
printf(“\n enter unit of cours”);
printf(” %d:”/j+1 );
scanf(“%d”/&unit );
printf(“\n enter grade of cours”);
printf(” %d:”/j+1 );
scanf(“%d”/&grad );
sumunit=sumunit+unit ;
sumgrad=sumgrad+grad*unit ;
j++ ;
}
aver=sumgrad/sumunit ;
printf(“\n average is:\t” );
printf(“%d”/aver );
if(aver<12)
{
printf(“\n student is probation”);
printf(“… “);
}
else if(aver>17)
{
printf(“\n student is exelent”);
printf(“… “);
}
}
}
به نمونه ای ازخروجی مثال ۱۲ که برای دو نفر ازدانشجویان عمل نموده است توجه
نمایید . enter number of students :2
enter name of student 1: ali
enter number of cours of this st:.2
enter unit of cours 1:2
enter grade of cours 1:19
enter unit of cours 2:3
enter grade of cours 2:20
aver is : 19
studnt is exelent…
enter name of student 2: reza
enter number of cours of this st:.3
enter unit of cours 1:2
enter grade of cours 1:12
enter unit of
دیدگاه خود را بیان کنید.
باید وارد سایت شده باشید برای دیدگاه دادن