جلسه پنجم: ادامه عبارات کنترلی
For
حلقهfor یکی از ساختارهای قدرتمند و کاربردی جاوا به شمار می آید.
وجود دو شکل مختلف برای حلقه for از نگارش J2SE 5 مطرح شد. نخستین شکل حلقه
for ؛همان حلقه قدیمی است که از زمان عرضه نخستین نگارش جاوا مطرح بوده
است. شکل دوم که شکل جدید این حلقه است؛ به صورتfor-each می باشد.
شکل کلی حلقه قدیمی به این صورت است:
For ( initialization ; condition ; iteration) {
//body
}حلقه for به این شکل عمل می کند:
وقتی حلقه آغاز می شود؛قسمت initialization حلقه اجرا می شود. عموما این
قسمت جمله جبری است که مقدارد متغیر کنترل حلقه را تعیین می کند. از این
متغیر به عنوان شمارنده کنترل حلقه استفاده می شود. لازم است بدانید که
جمله جبری مقدار دهی اولیه تنها یک مرتبه اجرا می شود. سپس condition
ارزیابی می شود. حاصل آن باید از نوع Boolean باشد.condition معمولا متغیر
کنترل حلقه را با یک مقدار معین مقایسه می کند. چنانچه حاصل کار true باشد؛
قسمت body اجرا می شود.
چنانچه حاصل false باشد حلقه به پایان می رسد. سپس قسمتiteration حلقه اجرا
می گردد .این قسمت معمولا جمله جبری است که مقدار متغیر کنترل حلقه را
افزایش یا کاهش می دهد. حلقه سپس تکرار می شود و هر بار ابتدا جمله شرطی
ارزیابی می شود؛سپس قسمت body اجرا می گردد و سپس قسمت interation اجرا می
گردد. این فرآیند آنقدر تکرار می گردد تا حاصل جمله کنترل کنندهfalse شود.
گاهی اوقات لازم می شود که بیش از یک عبارت را در قسمتهایinitialization و
interation به کار ببرید.برای این کار این عبارت ها را توسط کاما از هم جدا
می کنیم.
می توانید سه قسمت نامبرده در حلقه for را حذف کنید؛ در این حالت می توانید یک حلقه نامحدود که هیچگاه به پایان نمی رسد بسازید.
هر کدام از این سه قسمت می تواند از ساختار اصلی حلقه for حذف گردد.
شکل for-each از حلقه for
نظریه معاصر زبانها مفهومfor-each را به خوبی پذیرفته است و این سبک به
سرعت به یکی از ویژگه های استانداردی مبدل می شود که برنامه سازان می بایست
انتظار آن را داشته باشند. حلقه سبک for-each به گونه ای طراحی شده است تا
چرخه ای برای کلکسیونی از شی ء ها ؛مثلا یک آرایه؛ به صورت کاملا متوالی و
سریال و از ابتدا تا انتها ایجاد نماید.
بر خلاف زبانهایی چون C# که این سبک از حلقه for را با استفاده از کلمه
کلیدیforeach پیاده سازی می کنند؛ جاوا این قابلیت را از طریق بهبود
عبارتfor افزوده است. مزیت این رویه آن است که کلمه کلیدی جدیدی لازم نیست و
روتین های موجود نیز تغییر نمی یابند. به سبک for-each حلقه for ؛حلقه for
پیشرفته نیز گفته می شود. شکل کلی حلقه را با هم می بینیم:
For (type itr-var : collection) statement-block
type مشخص کننده نوع و itr-var مشخص کننده نام متغیر تکرار است که عناصر یک کلکسیون را یک به یک و از ابتدا به انتها دریافت می کند. کلکسیونی که چرخه برای آن ایجاد می شود؛ با collection مشخص می شود. انواع گوناگونی از کلکسیون ها را می توان با for به کار برد اما تنها نوع مورد استفاده در این unit ؛ آرایه ها هستند(در آینده سایر انواع کلکسیونهای قابل استفاده با for ؛ همچون کلکسیونهایی که به وسیله collection framework تعریف می شوند را بررسی می کنیم).
هر بار که حلقه تکرار می شود؛ عنصر بعدی در کلکسیون بازیابی و در
itr-var ذخیره می شود. حلقه آنقدر تکرار می شود تا تمام عناصر در کلکسیون
بازیابی می شود.چون متغیر تکرار؛ مقادیرش را از کلکسیون ها به دست می
آورد؛type باید با نوع عناصر ذخیره شده در کلکسیون یکسان باشد(یا سازگار
باشد). از این رو ؛type هنگام گردش در بین عناصر آرایه باید با نوع عناصر
آنها سازگار باشد. برای درک انگیزه ابداع حلقه های سبک for-each ؛ نوع حلقه
for ایی را در نظر بگیرید که این سبک جدید به عنوان جایگزین آن طراحی شده
است.
اگرچه حلقه for-each آنقدر تکرار می شود تا تمام عناصر موجود در آرایه
بررسی شوند؛اما این امکان وجود دارد که حلقه را با استفاده از عبارت break
در همان مراحل اولیه قطع کرد.
نکته مهمی درباره حلقه سبکfor-each وجود دارد که باید به خوبی درک کنید.
چون متغیر تکرار آن با آرایه مرتبط است؛ لازم است “فقط خواندنی” باشد.
تخصیص مقدار به این متغیر؛ هیچ تاثیری بر آرایه ندارد. به عبارت دیگر؛
محتوای آرایه را نمی توانید از طریق تخصیص مقدار جدید به متغیر تکرار تغییر
دهید. برنامه زیر را در نظر بگیرید:
//the for-each loop is essentially read-only.
Class NoChange{
Public static void main(string args[]) {
Int nums[ ] = {1,2,3,4,5,6,7,8,9,10};
For (int x:nums) {
System.out.print(x+” “);
X=x*10; //no effect on nums
}
System.out.println( );
For(int x : nums)
System.out.print(x+” “ );
System.out.println( );
}
} |
نخستین حلقه for ؛ مقدار متغیر تکرار را به اندازه ۱۰۰ واحد افزایش می دهد. اما همانکونه که حلقه for نشان می دهد؛ این کار هیچ تاثیری بر آرایه nums ندارد. این نکته با خروجی زیر به اثبات رسیده است:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰
عبارات پرش
جاوا از سه عبارت پرشjump ، break,continue و return پشتیبانی می کند. این عبارات؛ کنترل را به بخش دیگری از برنامه تان انتقال می دهند.آنها را با هم بررسی می کنیم:
نکته: جاوا علاوه بر عبارت پرش مورد بررسی در اینunit؛ از روش دیگری برای تغییر جریان اجرای برنامه تان پشتیبانی می کند: از طریق مدیریت استثنا ها. مدیریت استثنا ها روش ساختار یافته ای در اختیارتان می گذارد که خطاهای زمان اجرا از طریق آن قابل به دام انداختن و مدیریت می شوند. این روش با کلمات کلیذی try,catch,throw,throws وfinally پشتیبانی می شود. در واقع مکانیزم مدیریت استثناها؛امکان پرش غیر محلیnonlocal را برای برنامه تان فراهم می سازد.از آنجایی که مدیریت استثنا ها؛ موضوع گسترده ای است؛ به طور جداگانه در unit های بعدی بررسی خواهند شد.
استفاده از break
عبارتbreak در جاوا سه کاربرد دارد. نخست اینکه؛ همان گونه که دیده اید؛ به اجرای متوالی عبارات در یکی از حالات عبارت switch پایان می بخشد. دوم اینکه از آن می توان برای خروج از حلقه استفاده نمود و سوم اینکه از آن می توان به صورت شکل متمدنی از goto استفاده نمود. دو کاربرد آخر را با هم بررسی می کنیم:
استفاده ازbreak برای خروج از حلقه ها
با استفاده ازbreak می توانید یک حلقه را فورا پایان ببخشید و از جمله شرطی و مابقی عبارت موجود در قسمتbody صرفنظر کنید.وقتی نوبت به اجرای عبارتbreak در یک حلقه می شود؛ اجرای حلقه به پایان رسیده و کنترل اجرای برنامه به نخستین عبارت پس از حلقه هدایت می شود:
//using break to exit a loop.
Class BreakLoop{
Public static void main(string args[]) {
For (int i=0; i<100; i++){
If (i==10)break; //terminate loop if I is 10
System.out.println(“i:” +);
}
System.out.println(“Loop complete.”);
}
}Out put:
I: 0
I: 1
I: 2
. . .
I: 9
Loop complete.
وقتی از عبارت break در مجموعه ای از حلقه های تو در تو استفاده شود؛ تنها اجرای داخلی ترین حلقه قطع می شود.
ممکن است بیش از یک عبارتbreak در هر حلقه وجود داشته باشد اما مواظب باشید ؛استفاده بیش از اندازه از این عبارت موجب از بین رفتن ساختار یافتگی برنامه تان می شود.
چنانچه عبارتbreak اجرای برنامهswitch را قطع کند؛ تاثیر آن تنها بر همان عبارت خواهد بود و نه حلقه در بر گیرنده آن.
نکته: break برای فراهم ساختن روش متعارف قطع اجرای حلقه ها طراحی نشده است. انجام این کار بر عهده جملات شرطی حلقه ها است. از عبارتbreak باید برای قطع اجرای حلقه ها تنها در صورت بروز شرایط ویژه استفاده نمود.
استفاده از break به عنوان نوعی goto
زبان جاوا فاقد عبارتgoto است چرا که عبارت مذبور ؛روشی برای انشعاب غیر شرطی فراهم نموده و موجب از بین رفتن ساختار یافتگی برنامه ها می شود.
انجام این کار معمولا سبس می شود تا درک و نگهداشت روتین هایgoto دار دشوار شود. این عبارت همچنین از برخی از بهینه سازیهای کامپایلر ها جلوگیری می کند. اما عبارت goto در برخی از موارد؛ساختاری ارزشمند و قانونی برای هدایت رو به جلو جریان برنامه هاست.
جاوا برای مدیریت اینگونه شرایط؛از شکل گسترده ای از عبارتbreak پشتیبانی می کند. با استفاده از این فرم از عبارتbreak می توانید ازاجرای یک یا چند بلوک صرفنظر کنید.لزومی ندارد که این گونه بلوک ها؛ در یک حلقه یا عبارتswitch باشند. این کار برای هر بلوکی میسر است. به علاوه می توانید دقیقا مشخص کنید که اجرای برنامه ها از کجا ادامه یابد؛ چرا که این فرم از عبارتbreak همراه با برچسبهاlabel به کار برده می شود.
Break label;
Label نام برچسبی است که نشان دهنده بلوک مورد نظر است.
استفاده از continue
گاهی اوقات لازم است که اجرای حلقه پیش از رسیدن به انتها تکرار شود. این کار با عبارتcontinue انجام می شود. این عبارت در حلقه های while و do-while سبس انتقال مستقیم کنترل به جمله شرطی کنترل کننده حلقه می شود. در حلقه for کنترل نخست به قسمت interation و سپس به جمله شرطی عبارتfor هدایت می شود. در هر سه حلقه جاوا؛ عبارات پس از continue (تا انتهای حلقه)نادیده انگاشته می شوند.
//demonstrate continue
Class Continue{
Public static void main(string args[]){
For (int i=0 ; i<10 ; i++) {
System.out.print( I + “ “ ) ;
If (i% 2 == 0) continue;
System.out.println ( “ “ );
}
}
}با استفاده از عملگر% بررسی می شود که مقدارi زوج است یا خیر. اگر چنین باشد ؛حلقه بون چاپ کاراکتر”سطر جدید” ادامه می یابد.
Return
آخرین عبارت کنترلی؛returnاست. این عبارت برای بازگشت صریح از یک متد به کار برده می شود.یعنی سبب بازگرداندن کنترل اجرا به برنامه فراخوان متد می شود.بدین ترتیب این عبارت به عنوان یکی از عبارات پرش طبقه بندی شده است.
با استفاده از عبارتreturn در متدها می توان کنترل اجرا را در هر لحظه به روتین فراخوان متد بازگرداند. از این رو اجرای متدی که در آن اجرا می شود را فورا به پایان می رساند. این نکته را در یک مثال نشان می دهیم:
//demonstrate return.
Class Return{
Public static void main(string args[]) {
Boolean t= true ;
System.out.println(“Before the return.”) ;
If (t) return ; //return to caller
System.out.println(“this wont execute.”);
}
}آخرین نکته : در برنامه بالا if(t) ضروری است. کامپایلر جاوا در صورت عدم وجود آن؛ پیام خطای”unreachable code” را نمایش می دهد.چرا که برای کامپایلر مشخص می شود که آخرین عبارتprintln هیچگاه اجرا نمی شود. برای پیشگیری از این خطا از عبارتif برای گول زدن کامپایلر جهت نشان دادن نکته مورد نظر استفاده شده است.
آموزش جامع جاوا