جلسه هفتم(دستورهای break و continue و توابع)
دستور های break و continue
دستور break هرگاه که در ساختارهای while و do/while و for يا switch اجرا گردد، باعث خروج فوری برنامه از آن ساختار خواهد شد و برنامه اولين دستور بعد از آن ساختار را اجرا خواهد کرد. به برنامه زير توجه کنيد:
#include <iostream.h>
int main()
{
int n;
for (n=10; n>0; n--)
{
cout << n << ",";
if (n==3)
{
cout << "countdown aborted!";
break;
}
}
return 0;
}
خروجی برنامه به صورت زير می باشد:
10,9,8,7,6,5,4,3,countdown aborted!
برنامه فوق اعداد 10 تا 4 را چاپ خواهد کرد و هنگامی که متغير n عدد 3 می شود، شمارش معکوس به پايان می رسد.
نکته : در برنامه فوق شمارنده حلقه يعنی n در خارج از دستور for تعريف شد. در چنين حالتی ، اين متغير خارج از حلقه نيز می تواند مورد استفاده قرار گيرد ولی اگر تنها در داخل حلقه تعريف شده بود ، تنها آنجا می توانستيم از آن استفاده کنيم و خارج حلقه تعريف نشده بود.
دستور continue هرگاه در ساختارهای while و do/while يا for اجرا گردد دستورات بعدی آن ساختار ناديده گرفته می شود و بار بعدی حلقه تکرار اجرا می شود. در دو ساختار while و do/while پس از اجرای دستور continue شرط حلقه مورد بررسی قرار می گيرد، اما در ساختار for ابتدا مقدار شمارنده افزايش يا کاهش می يابد، سپس شرط حلقه بررسی می شود. توجه داشته باشيد که در حلقه while وdo/while دستور continue همواره بعد از افزايش يا کاهش شمارنده به کار رود. به عنوان مثال برنامه زير مجموع اعداد 1 تا 20 به جز 10 را محاسبه می کند.
#include <iostream.h>
int main( )
{
int n=0, sum=0;
while (n < 20)
{
++n; // n = n + 1;
if (n==10) continue;
sum += n; // sum = sum + n;
}
cout << "1+2+ ...(except 10)...+20=" <<sum << endl;
return 0;
}
خروجی برنامه به صورت زير می باشد.
1+2+ ...(except 10)...+20=200
برنامه عمل جمع را تا رسيدن به عدد 10 ادامه می دهد به محض اينکه n برابر 10 می شود دوباره به شرط حلقه منتقل می شود و چون شرط همچنان برقرار است وارد حلقه شده و n يک واحد افزايش می يابد و جمع اعداد ادامه می يابد.
تعريف توابع
اکثر برنامه های کاربردی ، خيلی بزرگتر از برنامه هايی می باشند که ما تا اکنون در مباحث قبلی نوشته ايم. تجربه نشان داده است که بهترين راه برای گسترش و نگهداری و ارتقاء برنامه های بزرگ، تقسيم کردن آنها به قطعات کوچکتر می باشد. هر کدام از قطعات راحتتر از برنامه اصلی مديريت می شوند و اعمال تغييرات و خطايابی در آنها نيز ساده تر می باشد. قطعات مورد نظر ما در زبان ++C همان توابع می باشند. اگر بياد داشته باشيد در مباحث قبلی گفتيم که main نيز يک تابع می باشد و اين تابع نقطه ای است که برنامه اجرای دستورات را از آن آغاز می کند. زبان ++C توابع آماده زيادی را در اختيار ما قرار داده که در فايلهای کتابخانه ای اين زبان موجود می باشند، که گوشه ای از آنها را در مبحث قبل ديديد. در برنامه نويسی ممکن است که نياز داشته باشيم مجموعه دستوراتی را عيناً در چند جای برنامه استفاده کنيم، در چنين حالتی بهتر است اين مجموعه دستورات را در تابعی قرار دهيم و تابع را در برنامه چندين باز صدا بزنيم و از تکرار دستورات که تنها حجم برنامه اصلی را زياد می کنند و از خوانايی آن می کاهند خودداری کنيم.
در زبان ++C توابع به شيوه زير تعريف می شوند :
آرگومانهای تابع) نام تابع نوع داده خروجی)
{
تعريف متغيرها
دستورات تابع
}
نام تابع از قواعد نام گذاری متغيرها پيروی می کند. برای آشنا شدن با نحوه تعريف توابع و شيوه به کار گيری آنها به برنامه زير توجه کنيد:
#include <iostream.h>
long int power2 (int x)
{
long int y;
y=x*x;
return y;
}
int main ()
{
for (int i=1;i<=10;i++)
cout<<power2(i)<<" ";
return 0;
}
خروجی برنامه مربع اعداد 1 تا 10 می باشد.
1 4 9 16 25 36 49 64 81 100
تابع power2(x) که در اين برنامه نوشتيم تقريباً شبيه تابع pow(x,2) از توابع کتابخانه ای ++C عمل می کند. ضابطه رياضياتی اين تابع f(x) = x2 می باشد. ورودی اين تابع اعداد صحيح (int) و خروجی آن اعداد بزرگ (long int) می باشد. هنگامی که برنامه به تابع power2(i) می رسد تابع فراخوانی می شود و مقدار آرگومان i را دريافت می کند و در متغيرx قرار می دهد. سپس متغير y تعريف می گردد و مقدار x*x در y قرار می گيرد و سرانجام مقدار y به عنوان خروجی تابع برگردانده می شود و توسط دستور cout چاپ می گردد. توجه داشته باشيد که تابع تغييری در مقدار متغير i ايجاد نمی کند و حلقه for تابع را 10 بار فراخوانی می کند، ضمناً متغيرهای x وy در تابع main قابل استفاده نمی باشند و نيز متغير i در تابع power2 تعريف نشده است.
نکته : توجه داشده باشيد که توابع داخل يکديگر قابل تعريف نمی باشند و جدا از هم بايد تعريف گردند.
مثال : تابعی بنويسيد که سه عدد را به عنوان ورودی دريافت کرده و بزرگترين آنها را به عنوان خروجی برگرداند. اين تابع را در برنامه ای به کار ببريد.
#include <iostream.h>
int maximum (int x,int y, int z)
{
int max=x;
if (y>max)
max=y;
if (z>max)
max=z;
return max;
}
int main ()
{
int num1,num2,num3;
cout << "Enter three numbers: ";
cin >> num1 >> num2 >> num3;
cout << "Max is :"
<< maximum(num1,num2,num3)<<endl;
cout << "Max of 5,20,1 is "
<< maximum(5,20,1)<<endl;
return 0;
}
Enter three numbers: -5 20 150
Max is :150
Max of 5,20,1 is 20
تابع maximum دارای سه آرگومان بود. هنگامی که اعداد num1 و num2 و num3 در برنامه از ورودی دريافت می شوند با فراخوانی تابع maximun(num1,num2,num3) اعداد آرگومانهای num1 و num2 و num3 به ترتيب در متغير های x و y و z قرار می گيرند و مقادير توسط تابع مقايسه می شوند و نهايتاً بزرگترين عدد در متغير max قرار می گيرد که توسط دستور return max; به عنوان خروجی تابع برگردانده می شود. سپس دستور cout خروجی تابع را بر روی صفحه نمايش چاپ می کند.
پيش تعريف توابع
تا به حال توابع مورد استفاده در برنامه هايمان را قبل از اولين فراخوانی آنها تعريف کرديم و اين فراخوانی معمولا در تابع main بود. لذا تابع main را به عنوان آخرين تابع در برنامه نوشتيم. اگر بخواهيد که تابع main را قبل از هر تابع ديگری در برنامه بنويسيد. هنگام اجرای برنامه يک پيغام خطا دريافت خواهيد کرد. دليل وقوع خطا اين است که هنگامی که تابعی فراخوانی می شود بايد قبلا تعريف شده باشد، مانند شيوه ای که ما در برنامه های قبلی استفاده کرديم.
يک راه چاره برای اجتناب از نوشتن کد همه توابع قبل از استفاده آنها در تابع main يا ساير توابع وجود دارد. اين راهکار پيش تعريف توابع می باشد. پيش تعريف تابع به صورت زير می باشد:
نوع آرگومانهای تابع ) نام تابع نوع داده خروجی );
توجه داشته باشيد که پيش تعريف تابع شامل دستورات تابع نمی شود و تنها شامل نوع داده خروجی ، نام تابع و نوع آرگومانها می باشد و در پايان نياز به علامت (;) دارد. به عنوان مثال پيش تعريف تابع power2 در مبحث قبلی به صورت زير می باشد:
long int power2( int );
ويا پيش تعريف تابع maximum به صورت زير است :
int maximum( int, int, int );
در اينجا برنامه تابع maximum در مبحث قبلی را با روش پيش تعريف تابع باز نويسی می کنيم :
#include <iostream.h>
int maximum (int ,int,int);
int main ()
{
int num1,num2,num3;
cout << "Enter three numbers: ";
cin >> num1>>num2>>num3;
cout << "Max is :"
<< maximum(num1,num2,num3)<<endl;
cout << "Max of 5,20,1 is "
<< maximum(5,20,1)<<endl;
return 0;
}
int maximum (int x,int y, int z)
{
int max=x;
if (y>max)
max=y;
if (z>max)
max=z;
return max;
}
Enter three numbers: -5 20 150
Max is :150
Max of 5,20,1 is 20
همانطور که در برنامه می بينيد، تابع main قبل از تابع maximum نوشته شده است و اين امکانی است که پيش تعريف تابع maximum به ما داده است.
نکته: در بعضی از برنامه ها، نياز پيدا می کنيم که دو تابع يکديگر را فراخوانی کنند. در چنين حالتی ملزم به استفاده از پيش تعريف تابع می باشيم. اما به عنوان يک توصيه برنامه نويسی همواره از پيش تعريف توابع استفاده کنيد ، حتی اگر ملزم به استفاده از آن نبوديد.