ساختارهای تکرار، امکانات خوبی برای تکرار اجرای مجموعه ای از دستورات برنامه می باشند . اما اگر بخواهیم تحت شرایطی که در برنامه اتفاق می افتد تصمیم گیری لازم را داشته باشیم بطوری که تحت شرایطی ، مجموعه ای از دستورات اجرا شوند و مجموعه ای دیگر از دستورات اجرا نشده وکنترل اجرای برنامه بجای دیگر منتقل شود به ابزار دیگری بنام ساختارهای تصمیم نیاز داریم . این ساختارها در زبان های برنامه سازی مختلف به اشکال متفاوتی وجود دارند که انواع مختلف آن را در زبان C بررسی می کنیم .
ساختار تصمیم if ساختار if ( که ساختار انتقال کنترل شرطی نیز نامگذاری میشود ) موجب میگردد تا تحت شرایطی ، مجموعه ای از دستورات اجرا شده و یااز اجرای این مجموعه دستوراتصرف نظر گردد . این ساختار بصورت های زیر مورد استفاده قرار می گیرد .
if(شرط) دستور ;
در روش بالا شرط ذکر شده بررسی می شود و در صورت برقرار بودن ، دستور بعد از آن اجرا می شود و در غیر اینصورت کنترل اجرای برنامه به دستور بعد از if
منتقل می گردد .
if(شرط) { دستورات ; } else دستورات ;
در روش بالا شرط ذکر شده بررسی می شود و در صورت برقرار بودن ، مجموعه دستورات در if اجرا میشوند و در غیر اینصورت مجموعه دستورات در else اجرا خواهند شد. لازم به ذکر است که وجود else در ساختار if اختیاری است .
استفاده از ساختار if بصورت لانه ای ( تو در تو ) نیز امکان پذیر است که در اینصورت اولین else به آخرین if بر می گردد .
مثال ۱ : برنامه ای که با خواندن یک جمله از ورودی ، تعداد کاراکترها و کلمات موجود در جمله را محاسبه می کند . کلمات با فاصله (blank) از یکدیگر جدا شده و انتهای جمله به کلید enter ختم می گردد .
#include <stdio.h> #include <conio.h> void 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 ); getch(); }
به نمونه ای از خروجی برنامه مثال ۱ توجه نمایید :
: type a statement
.this book is my fifth book
character count is:27
word count is:6
مثال ۲ : برنامه ای که تعداد کل کاراکترهای یک جمله و همچنین تعداد ارقام موجود در آن را شمارش می کند .
#include <stdio.h> #include <conio.h> void main() { int charcnt=0 ; int digtcnt=0 ; char ch ; printf("\n enter a statement: \n"); while((ch=getche())!='\r') { charcnt++ ; if(ch>=47 && ch<=58) digtcnt++ ; } printf("\n character count is:"); printf("%d" , charcnt ); printf("\ndigit count is:"); printf("%d" , digtcnt); getch(); }
به نمونه ای از خروجی برنامه مثال ۲ توجه نمایید :
:type a statement
.my telephone number is 817694
character count is:31
digit count is:6
مثال ۴ :
#include <stdio.h> #include <conio.h> void 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"); getch(); }
همانطورکه ملاحظه میشود برنامه ای که با ساختار else if نوشته شده است از خوانایی بهتری برخوردار است . لذا توصیه می شود که در این گونه موارد از else if بجای ساختار if استفاده گردد .
انتقال کنترل غیرشرطی ساختارهای if و else if را تحت عنوان انتقال کنترل شرطی مورد بررسی قرارداده ایم . چند دستور در زبان C وجود دارند که بدون تست کردن شرطی سبب انتقال کنترل برنامه ، از جایی به جایی دیگر می شوند . نام این دستور انتقال کنترل غیرشرطی می باشد که در ذیل مورد بررسی قرار می گیرند . دستور goto در زبان C علاوه بر ساختارهای تصمیم ، دستوری بنام goto نیز وجود دارد که سبب انتقال کنترل اجرای برنامه ، از نقطه ای به نقطه دیگر می گردد. این دستور بصورتزیر بکار می رود :
; برچسب دستور goto
برچسب دستور ، همانند یک متغیر نامگذاری شده و به دو نقطه (:) ختم می شود . پیشنهاد می گردد حتی الامکان از دستور goto که معمولا” سبب کاهش میزان خوانایی برنامه می شود ، استفاده نگردد .
مثال ۵ : برنامه ای که با استفاده از دستور goto یک حلقه تکرار می سازد .
#include <stdio.h> #include <conio.h> void main() { int x=1 ; loop1: x++ ; if(x<100 )goto loop1 ; printf("\n the maximum value"); printf("of x is:%d" , x ); getch(); }
خروجی حاصل از اجرای برنامه مثال ۵ : the maximum value of x is:100
یکی از خواص goto درC این است که از تابعی به تابع دیگر نمی توان انشعاب کرد و فقط انتقال کنترل در یک تابع امکان پذیر است . یعنی برچسب goto باید در تابعی باشد که این دستور در آن تابع بکار رفته است . دستور break این دستور یکی از دستورات انتقال کنترل غیر شرطی است و به صورت زیر مورد استفاده قرار می گیرد :دستور break به دو منظور استفاده می شود :
الف ) خاتمه داده به case درساختار switch
ب ) خاتمه دادن به حلقه تکرار ( حلقه های تکرار ممکن با for do یا while ساخته شوند ) . پس از اجرای دستور break در داخل ساختارهای تکرار کنترل اجرای برنامه به اولین دستور پس از حلقه تکرار منتقل می شود .
دستور continue دستور continue در یک حلقه تکرار ، موجب انتقال کنترل به ابتدای حلقه تکرار شده پس از اجرای این دستور کنترل به ابتدای حلقه برگشته و شرط حلقه تست می گرددکه در صورت برقرار بودن شرط ، مجموعه دستورات داخل حلقه تکرار مجددا اجرا می شوند وگرنه کنترل از حلقه تکرار خارج خواهد شد . ساختار switch ساختار switch که یکی از ساختارهای جالب جهت بالا بردن توانایی برنامه است بصورت زیر استفاده می شود :
switch(عبارت) { case 1 : دستورات ; break; case 2 : دستورات ; break; defult : دستورات ; }
نحوه عمل ساختار switch بدین صورت است که : عبارت ذکر شده در switch ارزیابی می شود ، سپس نتیجه ارزیابی از بالا به پایین با مقادیر ذکر شده ( مقدار ۱ مقدار ۲ و … ) مقایسه می شود ( ابتدا با مقدار۱ مقایسه می گردد ) اگرنتیجه ارزیابی با این مقدار برابر باشد مجموعه دستورات داخل آن case اجرا میشود و با دستور break کنترل اجرای برنامه از این ساختار خارج می شود . اگر نتیجه ارزیابی با مقدار۱ برابر نباشد ، مقایسه با مقدار۲ انجام می شود واین روند تا انتهای این ساختار ادامه پیدا می کند . اگر هیچکدام از مقادیری که در case ذکر شده اند با نتیجه ارزیابی عبارت برابر نباشند ، مجموعه دستورات پس از defaule اجرا می شود . defaule اختیاری است و ممکن است در ساختار switch استفاده نگردد. در این صورت اگر هیچکدام از مقادیر ۱، ۲ و … با نتیجه ارزیابی عبارت برابر نباشند ، کنترل به بعد از ساختار switch برخواهد گشت . حداکثر تعداد case که در یک ساختار switch می تواند قرار گیرد برابر با ۲۵۷ است .
مثال ۶ : برنامه ای که دو عدد و یکی از عملگرهای چهار عمل اصلی را از ورودی خوانده و عملگر را بر روی دو عدد عمل می کند .
#include <stdio.h> #include <conio.h> void main() { int num1 , num2 ; char op ; while(1) { printf("\ntype number/operator/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"); getch(); } } }
به نمونه ای از خروجی حاصل از اجرای برنامه مثال ۶ توجه نمایید :
type number/operator/number
۱۲ + ۲۳
sum=35
type number/operator/number
۲*۲۶
multiple=52
type number/operator/number
۴%۲
operator is illegal
قسمت دوازدهم آموزش C هم تمام شد امیدوارم با پشتکاری که داشتین تا اینجا همراه ما پیش آمده باشین و در ادامه هم با میکــروپـدیا همراه باشید و از برنامه نویسی لذت ببرید .