PDA

توجه ! این یک نسخه آرشیو شده می باشد و در این حالت شما عکسی را مشاهده نمی کنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : برنامه نویسی c جلسه ششم-دستورهای كنترلي



Y@SiN
04-30-2010, 01:17 PM
هدف کلی
آشنایی با مهم‌ترین دستورهای کنترلی در زبان C و کاربرد آنها
هدفهای رفتاری
از دانشجو انتظار مي‌رود پس از خواند این فصل،
1. با کاربرد دستورهای کنترلی آشنا شود.
2. شکل کلی و کاربرد دستور while را بداند.
3. شکل کلی و کاربرد دستور while‌do- را بداند و تفاوت آن را با while بیان کند.
4. شکل کلی و کاربرد دستور for را بداند.
5. شکل کلی و کاربرد دستور عملگر کاما را بداند.
6. شکل کلی و کاربرد دستورهای ‌if و if-else را بداند.
7. شکل کلی و کاربرد دستور switch را بداند.
8. شکل کلی و کاربرد دستور break را بداند.
9. شکل کلی و کاربرد دستور continue را بداند.
10. شکل کلی و کاربرد دستور goto را بداند.
11. شکل کلی و کاربرد تابع exit را بداند.
مقدمه
يکي از امکانات زبانهاي برنامه‌نویسی جدید، استفاده از دستورها و ساختارهاي كنترلي است و در نتيجه ‌اين امكان را فراهم مي‌‌سازند كه قطعه‌ای از برنامه تا موقعي كه شرط ويژه‌اي برقرار است چندين بار اجرا شود.
زبان برنامه‌‌نويسي C داراي قلمرو گسترده‌اي از اين نوع ساختارهاست. در حالت عادي دستورهاي هر برنامه به طور متوالي اجرا مي‌شود. اما اگر نياز باشد كه دستور يا مجموعه‌اي از دستورها در صورت وجود يا عدم وجود شرط يا شرايط خاصي اجرا گردند بايد شيوة ديگري به کار برد. ساختارهاي كنترلي دستورهايي‌اند كه چنين زمينه‌اي را در برنامه‌نويسي فراهم مي‌كنند.
مهم‌ترين دستورهاي كنترلي عبارت‌اند از do _ while و while _ forکه ساختارهاي حلقه‌هاي تكرار را تشکیل می‌دهند و دستورهاي switch و if که دستورهاي شرطي يا ساختارهاي تصميم‌گيري‌اند و بالاخره دستورهاي goto , ،continue ،break ، و exit.
حال به دو مفهوم درست يا true و نادرست يا false توجه کنيد. اغلب دستورهاي كنترلي برنامه در زبان C بر نتيجة وجود شرط تكيه مي‌كند تا برحسب برقراري آن شرط عملي انجام گيرد يا انجام نگيرد. درواقع نتيجة آزمايش اين شرط مقدار درست يا نادرست است. اغلب زبانهاي كامپيوتري مقاديري را به عنوان ارزش درستي يا نادرستي مشخص مي‌كنند (مثلاً 1 براي درست و 1- براي نادرست)، اما در زبان C هر مقدار غيرصفر (مثبت يا منفي) درست يا true (يعني شرط مورد نظر برقرار است) و مقدار صفر نيز نادرست يا false تلقي مي‌گردد.
در اين فصل، مهم‌ترين دستورها و ساختارهاي كنترلي زبان C را بررسي مي‌کنیم.
دستور while
اين دستور يكي از دستورهاي كنترلي زبان C است كه براي انجام عمليات تکراري به کار مي‌رود. با استفاده از اين دستور، حلقه تا موقعي كه شرط معيني برقرار باشد اجرا مي‌گردد. شکل كلي اين دستور به صورت زير است.





while (condition)

statement ;





در اينجا پس از عبارت while فقط يك دستور به كار رفته است. اما مي‌توان مجموعه‌اي از دستورها را نيز به كار برد. گفتیم که در زبان C، هر دستور به يك سميكولون ختم مي‌شود و مجموعه‌اي از دستورها (يعني بيش از يك دستور) را نيز دستورهاي مركب يا بلاک نامند که در زبان C در داخل يك زوج آكولاد قرار مي‌گيرد. بنابراين در حالت کلي شکل دستور while به صورت زير خواهد بود.







while (condition)

{

statements ;

}




نمودار كلي آن را نیز در شکل 5ـ1 می‌بینید.
http://pnu-club.com/imported/2010/04/1832.jpg (http://tinypic.com/)


سازوکار و نحوة عملكرد دستور در while به‌اين طريق است که تا موقعي كه شرط مورد نظر كه پس از كلمة كليدي while در داخل پرانتز نوشته می‌شود برقرار باشد، مجموعه دستورهاي داخل حلقة while به صورت تكراري اجرا خواهد شد. شرط مورد نظر با استفاده از عملگرهاي رابطه‌اي به صورت عبارات رابطه‌اي يا به صورت عبارت منطقي بیان می‌شود كه در اين صورت تا موقعي كه عبارت مزبور ارزش درست يا true داشته باشد حلقه اجرا خواهد شد.
مثال 5ـ1 برنامة زير به دو روش اعداد صحيح صفر تا 10 را در روي خطوط متوالي چاپ مي‌كند.







روش اول

روش دوم

#include

main()

{

int number = 0 ;

while (number<=10)

printf ("%d\n", number ++);

}


#include

main()

{

int number = 0 ;

while (number<=10)

{ printf("%d\n", number);

++ number;

}

}






مثال 5ـ3 برنامة زير يك خط متن با حروف كوچك را كاراكتر به كاراكتر از آراية text مي‌خواند. سپس با استفاده از تابع كتابخانه‌اي toupper متن مزبور را به حروف بزرگ تبديل و چاپ مي‌كند.







#include

#define eol ’\n’

main ()

{

char text[80] ;

int tag , count = 0 ;

/*read the text in lower case */

text [count] = getchar() ;

while (text[count]!eol)

{ count = count + 1 ;

text[count]=getchar() ;

}

tag = count ;

count = 0 ;

while (count

{ putchar (toupper(text[count])) ;

+ + count ;

}

}



در برنامة بالا دو عبارت while جداگانه به كار رفته كه يكي براي خواندن متن از حافظه و ديگري براي تبديل حرف كوچك به بزرگ و چاپ متن تبديل شده است. حال اگر mathematics and statistics وارد شود، عبارت MATHEMATICS AND STATISTICS در خروجي نمايش داده می‌شود.


دستور do - while
در دستور while آزمايش شرط براي ادامة حلقه در آغاز هر تكرار حلقه انجام مي‌گيرد. گاهي مطلوب است كه ‌اين آزمايش در پايان حلقه انجام شود. اين كار با دستور كنترلي do-while امكان‌پذير است. شکل كلي دستور do-while به صورت زير است.







do

{

statements

}while (condition) ;




در صورتي که حلقة تكرار فقط شامل يك دستور باشد، نيازي به قراردادن زوج آكولاد نخواهد بود. در اينجا اول statements اجرا مي‌گردد، سپس شرط داخل پرانتز، يعني condition بررسی می‌شود. بنابراين، در اين ساختار هميشه statements حداقل يك بار اجرا خواهد شد. در اين حالت نيز عبارت داخل پرانتز معمولاً يك عبارت رابطه‌اي يا منطقي است كه نتيجة آن مشابه while است.
در اغلب كاربردها، آزمايش شرط ادامه براي اجراي حلقه، به طور طبيعي در آغاز حلقه صورت مي‌گيرد. بدين لحاظ دستور do-while در مقايسه با دستور while كاربرد كمتري دارد. نحوة عملكرد اين دستور در شكل 5ـ2 نشان داده شده است.




http://pnu-club.com/imported/2010/04/1833.jpg (http://tinypic.com/)


مثال 5ـ4 برنامه‌اي بنويسيد كه با استفاده از دستور do - while اعداد صحيح صفر تا 10 را در روي خطوط متوالي چاپ كند.








#include

main ()

{

int number = 0 ;

do

printf ("%d\n", number + +) ;

while (number<=10) ;

}















مثال 5ـ5 برنامه‌اي بنويسيد كه با استفاده از دستور do - while عدد صحيح n را بخواند و فاكتوريل آن را حساب و با خود عدد چاپ کند.





#include

main ()

{

int n , i =1 , fact =1 ;

scanf ("%d",&n) ;

do

fact *= i ;

while (+ +i<= n) ;

printf ("factorial of %d is %d", n , fact) ;

}

















دستور for
دستور for متداول‌ترين دستور حلقه در زبان C و شبيه به دستور while است. اين دستور شامل يک عبارت است که مقدار نخستين يک شاخص را مشخص مي‌سازد. عبارت ديگر چگونگي ادامه يا پايان حلقه را تعيين مي‌کند و سومين عبارت شاخص را در پايان هر حلقه تغيير مي‌دهد. نمودار آن را در شکل 5ـ3 می‌بینید.
شکل كلي اين دستور نيز به صورت زير است.


for (expression1; expression2; expression3) statement ;
در اينجا expression1 براي مقداردهي اولية پارامتري كه حلقه را كنترل مي‌کند (و شاخص يا index ناميده مي‌شود) به كار می‌رود. expression2 يك شرط را معرفي مي‌کند كه بايد براي ادامة اجراي حلقه صادق باشد و expression3 نيز براي تغيير مقدار پارامتري كه در آغاز به expression1 اختصاص داده شده به كار می‌رود. معمولاً expression1 عبارت جايگذاري، expression2 عبارت منطقي يا رابطه‌اي و expression3 عبارت جایگذاری یا unary expression است.
وقتي كه دستور for اجرا مي‌گردد قبل از هر گذر در داخل حلقه، expression2 ارزيابي و آزمايش مي‌شود. اما expression3 در پايان هر گذر ارزيابي مي‌گردد. بنابراين دستورfor

معادل دستورهاي زير است.
http://pnu-club.com/imported/2010/04/1834.jpg (http://tinypic.com/)






expression1 ;

while (expression2)

{

statements

expression3 ;

}





اجراي حلقه تا زماني که مقدار expression2 مساوي صفر نباشد، يعني تا هنگامي که شرط معرفي شده با expression2 برقرار و يا true باشد، ادامه خواهد داشت.
مثال 5ـ6 با استفاده از دستور for برنامه‌اي بنويسيد كه اعداد صحيح صفر تا 10 را روي خطوط متوالي چاپ كند.






#include

main ()

{

int number ;

for (number=0 ; number<=10 ; + + number)

printf ("%d\n", number) ;

}





در اين برنامه اولين خط در دستور for شامل سه expression است كه در داخل پرانتز قرار گرفته‌اند. اولين expression مقدار صفر را به متغير number اختصاص مي‌دهد. دومين expression بيان مي‌كند كه تكرار حلقه تا هنگامي كه مقدار فعلي number از 10 تجاوز نكرده باشد ادامه خواهد يافت. سومين expression پس از هر بار گذر حلقه، مقدار number را يك واحد افزايش مي‌دهد.


از نظر دستوري نياز نيست هر سه expression مربوط به دستور for به كار برده شود، اگرچه به كار بردن سميكولون مربوط به هر expression الزامي است. نتيجة حذف هر expression بايد به طور كامل فهميده شود. اگر آغازين كردن و يا تغيير شاخص يا هر دو به طريق ديگري انجام گيرد، ممكن است expression هاي اول و سوم حذف گردند. درصورتي كه expression دوم حذف گردد، ارزش آن مقدار ثابت true درنظر گرفته خواهد شد و در نتيجه تكرار حلقه به صورت نامتناهي ادامه خواهد يافت مگر اينكه خروج از حلقه به طريق ديگري مثلاً با دستور break يا return پيش‌بيني گردد. در اغلب كاربردهاي دستور for هر سه expression استفاده مي‌شود.
مثال 5ـ7 با استفاده از دستور for برنامه‌اي بنويسيد كه عدد صحيح n را بخواند و فاكتوريل آن را حساب و با خود عدد چاپ کند.






#include

main ()

{

int n , fact =1 ;

scanf ("%d", &n) ;

for (i=2 ; i<=n ; ++i)

fact = fact * i ;

printf ("factorial of %d is %d", n , fact) ;

}





مثال 5ـ8 برنامه‌اي بنويسيد كه نمره‌های امتحاني دانشجويان كلاسهاي مختلف را بخواند و معدل هر كلاس را حساب و چاپ کند. تعداد كلاسها و تعداد دانشجويان هر كلاس از طريق دستگاه ورودي خوانده شود.






#include

main ()

{

int n , count , loops , loopcount ;

float x , average , sum ;

scanf("%d",&loops) ;

/*outer loop*/

for (loopcount=1 ; loopcount<=loops ; ++ loopcount)

{

sum = 0 ;

printf("\n class number %d \n how many numbers?", loopcount) ;

scanf ("%d",&n) ;

for (count=1 ; count<=n ; + +count)

/* inner loop */

{

scanf ("%f",&x) ;

sum += x ;

} /*end of inner loop*/

average = sum / n ;

printf("\n the average is %f\n", average) ;

} /*end of outer loop*/

}





حلقه‌ها مي‌توانند در يکديگر قرار گيرند يعني به صورت تودرتو به كار روند كه در اين حالت حلقة داخلي بايد كاملاً توسط حلقة بيروني احاطه گردد. به عبارت ديگر دو حلقه نبايد يكديگر را قطع کنند. همچنين هر حلقه بايد با شاخص جداگانه‌اي كنترل شود. برنامة فوق از دو حلقه تشكيل شده است. در آغاز تعداد كلاسها (loops) خوانده می‌شود و بر اساس آن حلقة بيروني تكرار مي‌گردد يعني به ازاي هر كلاس يك بار اجرا مي‌شود. هر بار در داخل حلقة بيروني، متغير sum مساوي صفر قرار داده می‌شود، سپس تعداد دانشجويان يا تعداد نمره‌هاي امتحاني n خوانده مي‌شود. پس از آن حلقة دروني به تعداد دانشجويان كلاس مورد نظر n اجرا مي‌شود كه در هر تكرار نمرة امتحاني يك دانشجو خوانده و به sum افزوده مي‌شود. هر بار پس از كامل شدن حلقة دروني، جمع نمره‌هاي امتحاني كلاس به دست مي‌آيد كه سپس معدل كلاس با نام average حساب و چاپ مي‌شود.



عملگر كاما
در خصوص اين عملگر در فصل 4 مطالبي بيان شد. اين عملگر عملگری باينري است و به دو عبارت مختلف اجازة ظاهر شدن در موقعيتهايي را مي‌دهد که در آن بايد فقط يک عبارت به کار رود. همچنين عملگر كاما از چپ به راست عمل مي‌كند و در مجموعه عملگرهاي زبان C کمترين تقدم را دارد. عملوندهاي آن عبارت‌اند از


expression1, expression2
در اينجا ابتدا expression1 و سپس expression2 محاسبه مي‌شود.
كاما ممکن است در دستور for به كار رود و اجازة پردازش چندين انديس را به شکل يکجا مي‌دهد. همچنين امکان مقداردهي اولية چند متغير را به شکل همزمان فراهم مي‌سازد. حالتهاي مختلف دستور for با توجه به عملگر کاما به شکل زير است.





for (expression1 ; expression2 ; expression3)

for (expression1A , expression1B ; expression2 ; expression3)

for (expression1 ; expression2 ; expression3A , expression3B)



مثال 5ـ9 به برنامة زير توجه کنيد.








#include

main ()

{

int i , n , sum ;

scanf("%d", &n) ;

for (sum = 0 , i = 1 ; i

printf ("\n %d", sum) ;

}



اين برنامه مجموع اعداد صحيح 1 تا n را محاسبه و چاپ مي‌کند. همانطور که ملاحظه مي‌‌کنيد در اينجا دو بار از عملگر کاما در دستور for استفاده شده است. همچنين در انتهاي دستور for سميکولون به کار رفته است. يعني پس از پايان حلقه که مقدار sum محاسبه شد، کنترل برنامه به دستور printf منتقل مي‌شود.
لازم به توضيح است که براي تفکيک متغيرها، اعلان متغيرها و آرگومانهاي توابع از کاراکتر کاما استفاده مي‌شود که نبايد آن را با عملگر کاما اشتباه کرد.

فاطمه محبوبی
05-03-2010, 12:25 AM
varshal

فاطمه محبوبی
05-03-2010, 12:26 AM
الگوریتم وارشال رو می خواستم

فاطمه محبوبی
05-03-2010, 12:26 AM
سی و سی پلاس پلاس

Borna66
05-03-2010, 11:46 AM
سی و سی پلاس پلاس


الگوریتم وارشال رو می خواستم


varshal

اينم الگوريتم ورشال به زبان پاسكال كي مي توانيد از ساختار ان استفاده كنيد





Program
Warshall;
var
matrix:array[1..40, 1..40] of integer;
i,j,k,e, m,n:integer;
Begin
writeln(' Please Enter Number Of Rowe And Cloumn:');
readln(a);
writeln('---------------');
writeln;

for
i:=1 to e do
begin



writeln (' Enter Number ',i,' Of Row:');
for j:=1 to e do



readln(matrix[i,j]);
writeln('----------');
writeln;
end
;
for
k:=1 to e do
begin



writeln ('W:',k);
for
i:=1 to e do



if
matrix[i,k]=1 then
begin
for j:=1 to e do
if matrix[k,j]=1 then



matrix[i,j]:=1;
end
;
for
m:=1 to e do
begin
if m<>1 then
begin



writeln;
writeln;
end
;
for
n:=1 to e do
begin



write(' ',matrix[m,n],' ' );
end
;
end
;
writeln;
writeln;
readln;
end
;
End
.