( تعداد نمایش : 1780 )

دستورات انتخاب در جاوا

جاوا از دو دستور انتخاب پشتیبانی می کنند : ifو switchو . با این دستورات شما اجرای برنامه را براساس شرایطی که فقط حین اجرای برنامه اتفاق می افتند کنترل می کنید. اگر سابقه برنامه نویسی با C++/C را ندارید، از قدرت و انعطاف پذیری موجود در این دو دستور متعجب و شگفت زده خواهید شد .

if

دستور if دستور انشعاب شرطی در جاوا است . از این دستور می توان استفاده نمود و اجرای برنامه را طی دو مسیر متفاوت به جریان انداخت . شکل کلی این دستور بصورت زیر است :

if( condition )statement 1;
else statement 2;

دراینجا هر statement ممکن است یک دستور منفرد یا یک دستور مرکب قرار گرفته
در ابروها ( یعنی یک بلوک ) باشد .
condition ( شرط ) هر عبارتی است که یک
مقدار
boolean را برمی گرداند . جمله else اختیاری است . if
بصورت زیر کار می کند : اگر شرایط محقق باشد ، آنگاه
statement 1 اجرا
می شود . در غیر اینصورت
statement 2 ( در صورت وجود ) اجرا خواهد شد .
تحت هیچ شرایطی هر دو دستور با هم اجرا نخواهند شد . بعنوان مثال ، در نظر
بگیرید :

+ int a/ b;
+ //…
+ if(a < b )a = 0;
+ else b = 0;

در اینجا اگر a کوچکتر از b باشد ، آنگاه a برابر صفر می شود . در غیر
اینصورت
b برابر صفر قرار می گیرد . در هیچ شرایطی این دو متغیر در آن واحد
برابر صفر نمی شوند .
غالب اوقات ، عبارتی که برای کنترل
if استفاده میشود شامل عملگرهای رابطه ای
است . اما از نظر تکنیکی ضرورتی وجود ندارد . می توان با استفاده از یک متغیر
boolean
تکی ،
if را همانطوریکه در بخش زیر مشاهده می کنید ، کنترل نمود .

+ boolean dataAvailable;
+ //…
+ if( dataAvailable)
+ ProcessData)(;
+ else
+ waitForMoreData)(;

بیاد آورید که فقط یک دستور می تواند مستقیما” بعداز ifیا elseا قرار گیرد.
اگر بخواهید دستورات بیشتری داخل نمایید ، نیازی به ایجاد یک بلوک ندارید
نظیر این قطعه که در زیر آمده است :

+ int bytesAvailable;
+ //…
+ if( bytesAvailable > 0 ){
+ ProcessData)(;
+ bytesAvailable- = n;
+ } else
+ waitForMoreData)(;

در اینجا ، هر دو دستور داخل بلوک if اجرا خواهند شد اگر bytes Available
بزرگتر از صفر باشد .
برخی از برنامه نویسان راحت ترند تا هنگام استفاده از
if ، از ابروهای باز
و بسته استفاده نمایند، حتی زمانیکه فقط یک دستور در هر جمله وجود داشته باشد.
این امر سبب می شود تا بعدا” بتوان براحتی دستور دیگری را اضافه نمود و نگرانی
از فراموش کردن ابروها نخواهید داشت . در حقیقت ، فراموش کردن تعریف یک بلوک
هنگامی که نیاز است ، یکی از دلایل رایج بروز خطاها می باشد . بعنوان مثال قطعه
زیر از یک کد را در نظر بگیرید :

+ int bytesAvailable;
+ //…
+ if( bytesAvailable > 0 ){
+ ProcessData)(;
+ bytesAvailable- = n;
+ } else
+ waitForMoreData)(;
+ bytesAvailable = n;

بنظر خیلی روشن است که دستور bytes Available=n طوری طراحی شده تا داخل جمله else اجرا گردد ، و این بخاطر سطح طراحی آن است . اما حتما” بیاد دارید که فضای خالی برای جاوا اهمیتی ندارد و راهی وجود ندارد که کامپایلر بفهمد چه مقصودی وجود دارد . این کد بدون مشکل کامپایل خواهد شد ، اما هنگام اجرا بطور ناصحیح اجرا خواهد شد . مثال بعدی داخل کدی که مشاهده می کنید تثبیت شده است :

+ int bytesAvailable;
+ //…
+ if( bytesAvailable > 0 ){
+ ProcessData)(;
+ bytesAvailable- = n;
+ } else {
+ waitForMoreData)(;
+ bytesAvailable = n;
+ }
if

Nested ifs های تودرتو شده
یک
nested if یک دستور if است که هدف ifیا elseا دیگری باشد. if های تودرتو
در برنامه نویسی بسیار رایج هستند. هنگامیکه
if ها را تودرتو می کنید، مهمترین
چیزی که باید بخاطر بسپارید این است که یک دستور
else همیشه به نزدیکترین دستور if
خود که داخل همان بلوک
else است و قبلا” با یک else همراه نشده ، مراجعه
خواهد نمود . مثالی را مشاهده نمایید :

+ if(i == 10 ){
+ if(j < 20 )a = b;
+ if(k > 100 )c = d; // this if is
+ else a = c; // associated with this else
+ }
+ else a = d; // this else refers to if(i == 10)

همانگونه که توضیحات نشان می دهند ، else نهایی با (۲۰
چون داخل همان بلوک قرار ندارد ( اگر چه نزدیکترین
if بدون else است ) . بجای
آن ،
else نهایی با (i==10)if همراه می شود . else داخلی به (۱۰۰>k)if ارجاع
می کند ، زیرا نزدیکترین
if در داخل همان بلوک است .

نردبان if-else-if
یک ساختار برنامه نویسی رایج براساس یک ترتیب از ifهای تودرتو شده یا نردبان if-else-if
است . این ساختار بصورت زیر است :

if(condition)
statement;
else if(condition)

statement;
else if(condition)
statement;
.
.
.
else
statement;

دستورات if از بالا به پایین اجرا می شوند . مادامیکه یکی از شرایط کنترل
کننده
if صحیح باشد (true)، دستور همراه با آن if اجرا می شود ، و بقیه نردبان
رد خواهد شد . اگر هیچکدام از شرایط صحیح نباشند، آنگاه دستور
else نهایی اجرا
خواهد شد .
else نهایی بعنوان شرط پیش فرض عمل می کند ، یعنی اگر کلیه شرایط
دیگر صحیح نباشند ، آنگاه آخرین دستور
else انجام خواهد شد . اگر else نهایی
وجود نداشته باشد و سایر شرایط ناصحیح باشند ، آنگاه هیچ عملی انجام نخواهد
گرفت .
در زیر ، برنامه ای را مشاهده می کنید که از نردبان
if-else-if استفاده کرده
تا تعیین کند که یک ماه مشخص در کدام فصل واقع شده است .

+ // Demonstrate if-else-if statement.
+ class IfElse {
+ public static void main(String args[] ){
+ int month = 4; // April
+ String season;
+
+ if(month == 12 || month == 1 || month == 2)
+ season = “Winter”;
+ else if(month == 3 || month == 4 || month == 5)
+ season = “Spring”;
+ else if(month == 6 || month == 7 || month == icon cool دستورات انتخاب در جاوا
+ season = “Summer”;
+ else if(month == 9 || month == 10 || month == 11)
+ season = “Autumn”;
+ else
+ season = “Bogus Month”;
+
+ System.out.println(“April is in the” + season + “.”);
+ }
+ }

خروجی این برنامه بقرار زیر می باشد :

April is in the Spring.

ممکن است بخواهید این برنامه را تجربه نمایید . خواهید دید که هیچ فرقی
ندارد که چه مقداری به month بدهید ، یک و فقط یک دستور انتساب داخل نردبان
اجرا خواهد شد .


switch


دستور switch ، دستور انشعاب چند راهه در جاوا است . این دستور راه ساده ای
است برای تغییر مسیر اجرای بخشهای مختلف یک کد براساس مقدار یک عبارت . این
روش یک جایگزین مناسب تر برای مجموعه های بزرگتر از دستورات if-else-if است .
شکل کلی دستور switch بقرار زیر می باشد :

switch(expression){
case value1:
// statement sequence
break;
case value2:
// statement sequence
break;
.
.
.
case valueN:
// statement sequence
break;
default:
// default statement sequence
}
expression

می تواند هر نوع ساده ای را برگرداند ، هر یک از مقادیر (values)
در دستورات case باید از نوع سازگار با عبارت باشند . هر یک از مقادیر case
باید یک مقدار لفظی منحصر بفرد باشد ( یعنی باید یک ثابت ، نه متغیر ، باشد ).
دو برابر سازی مقادیر case مجاز نیست .
دستور switch بشرح فوق عمل می کند : مقدار عبارت با هر یک از مقادیر لفظی
در دستورات case مقایسه می شوند. اگر تطابق پیدا شود ، کد سلسله ای تعقیب کننده
آن دستور case اجرا خواهد شد . اگر هیچیک از ثابت ها با مقدار عبارت تطابق
نیابند ، آنگاه دستور پیش فرض (default) اجرا خواهد شد ، اما دستور default
اختیاری است . اگر هیچیک از case ها تطابق نیابد و default وجود نداشته باشد
آنگاه عمل اضافی دیگری انجام نخواهد شد .
از دستور break داخل دستور switch استفاده شده تا سلسله یک دستور را پایان
دهد . هنگامیکه با یک دستور break مواجه می شویم ، اجرا به خط اول برنامه که
بعد از کل دستور switch قرار گرفته ، منشعب خواهد شد . این حالت تاثیر پریدن switch
است .
در زیر مثال ساده ای را مشاهده می کنید که از دستور switch استفاده نموده
است :

+ // A simple example of the switch.
+ class SampleSwitch {
+ public static void main(String args[] ){
+ for(int i=0; i<6; i++)
+ switch(i ){
+ case 0:
+ System.out.println(“i is zero.”);
+ break;
+ case 1:
+ System.out.println(“i is one.”);
+ break;
+ case 2:
+ System.out.println(“i is two.”);
+ break;
+ case 3:
+ System.out.println(“i is three.”);
+ break;
+ default:
+ System.out.println(“i is greater then 3.”);
+ }
+ }
+ }

خروجی این برنامه بقرار زیر می باشد :

i is zero.
i is one.
i is two.
i is three.
i is greater than 3.
i is greater than 3.

همانطوریکه مشاهده می کنید ، داخل حلقه ، دستوراتی که همراه ثابت case بوده
و با i مطابقت داشته باشند ، اجرا خواهند شد . سایر دستورات پشت سر گذاشته
می شوند (bypassed) . بعد از اینکه i بزرگتر از ۳ بشود ، هیچ دستور همراه case
مطابقت نداشته ، بنابراین دستور پیش فرض (default) اجرا خواهد شد .
دستور break اختیاری است . اگر break را حذف کنید ، اجرای برنامه با case
بعدی ادامه خواهد یافت . گاهی بهتر است چندین case بدون دستورات break در بین
آنها داشته باشیم . بعنوان مثال ، برنامه بعدی را در نظر بگیرید :

+ // In a switch/ break statements are optional.
+ class MissingBreak {
+ public static void main(String args[] ){
+ for(int i=0; i<12; i++)
+ switch(i ){
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ System.out.println(“i is less than 5″);
+ break;
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ System.out.println(“i is less than 10″);
+ break;
+ default:
+ System.out.println(“i is 10 or more”);
+ }
+ }
+ }

خروجی این برنامه بقرار زیر خواهد بود :

i is less than 5
i is less than 5
i is less than 5
i is less than 5
i is less than 5
i is less than 10
i is less than 10
i is less than 10
i is less than 10
i is less than 10
i is 10 or more
i is 10 or more

همانطوریکه مشاهده می کنید، اجرا طی هر case، بمحض رسیدن به یک دستور break
(
یا انتهای switch ) متوقف می شود .
در حالیکه مثال قبلی برای توصیف نظر خاصی طراحی شده بود ، اما بهر حال حذف
دستور break کاربردهای عملی زیادی در برنامه های واقعی دارد . برای نشان دادن
کاربردهای واقعی تر این موضوع ، دوباره نویسی برنامه نمونه مربوط به فصول سال
را مشاهده نمایید . این روایت جدید همان برنامه قبلی از switch استفاده می کند
تا پیاده سازی موثرتری را ارائه دهد .

+ // An improved version of the season program.
+ class Switch {
+ public static void main(String args[] ){
+ int month = 4;
+ String season;
+ switch( month ){
+ case 12:
+ case 1:
+ case 2:
+ season = “Winter”;
+ break;
+ case 3:
+ case 4:
+ case 5:
+ season = “Spring”;
+ break;
+ case 6:
+ case 7:
+ case 8:
+ season = “Summer”;
+ break;
+ case 9:
+ case 10:
+ case 11:
+ season = “Autumn”;
+ break;
+ default:
+ season = “Bogus Month”;
+ }
+ System.out.println(“April is in the” + season + “.”);
+
+ }
+ }

تودرتو کردن دستورات switch
می توانید از یک switch بعنوان بخشی از ترتیب یک دستور switch خارجی تر
استفاده نمایید. این حالت را switch تودرتو مینامند. از آنجاییکه دستور switch
تعریف کننده بلوک مربوط به خودش می باشد، هیچ تلاقی بین ثابتهای caseدر switchر
داخلی و آنهایی که در switch خارجی قرار گرفته اند ، بوجود نخواهد آمد . بعنوان
مثال ، قطعه بعدی کاملا” معتبر است .

+ switch(count ){
+ case 1:
+ switch(target ){ // nested switch
+ case 0:
+ System.out.println(“target is zero”);
+ break;
+ case 1 :// no conflicts with outer switch
+ System.out.println(“target is one”);
+ break;
+ }
+ break;
+ case 2 ://…

در اینجا دستور :case 1در switchر داخلی با دستور :case 1در switchر خارجی
تلاقی نخواهد داشت . متغیر count فقط با فهرست case ها در سطح خارجی مقایسه
می شود. اگر count برابر ۱ باشد، آنگاه target با فهرست case های داخلی مقایسه
خواهد شد .
بطور خلاصه ، سه جنبه مهم از دستور switch قابل توجه هستند :
ؤ switchبا ifا متفاوت است چون switch فقط آزمایش کیفیت انجام می دهد ، در
حالیکه if هر نوع عبارت بولی را ارزیابی می کند . یعنی که switch فقط بدنبال
یک تطابق بین مقدار عبارت و یکی از ثابت های case خودش می گردد .
ؤ دو ثابت caseدر switchر مشابه نمی توانند مقادیر یکسان داشته باشند .
البته ، یک دستور switch قرار گرفته داخل یک switch خارجی تر می تواند ثابتهای case
مشترک داشته باشد .
ؤ یک دستور switch معمولا” بسیار کاراتر از یک مجموعه از if های تودرتو شده
است . آخرین نکته بخصوص جالب توجه است زیرا روشنگر نحوه کار کامپایلر جاوا
می باشد . کامپایلر جاوا هنگامیکه یک دستور switch را کامپایل می کند ، به هر
یک از ثابتهای case سرکشی نموده و یک جدول jump table می سازد که برای انتخاب
مسیر اجرا براساس مقدار موجود در عبارت استفاده می شود . بنابراین ، اگر باید
از میان گروه بزرگی از مقادیر انتخاب نمایید ، یک دستور switch نسبت به یک
ترتیب از if-else ها که بطور معادل و منطقی کد بندی شده باشد ، بسیار سریعتر
اجرا خواهد شد. کامپایلر قادر است اینکار را انجام دهد چون می داند که ثابتهای case
همه از یک نوع بوده و باید خیلی ساده با عبارت switch برای کیفیت مقایسه
شوند . کامپایلر چنین شناسایی را نسبت به یک فهرست طولانی از عبارات if ندارد .

دستورات تکرار iteration statements
دستورات تکرار در جاوا عبارتند از for، while،و do-whileو . این دستورات آن
چه را ما ” حلقه ” می نامیم ، ایجاد می کنند . احتمالا” می دانید که حلقه یک
مجموعه از دستورالعملها را بطور تکراری اجرا می کند . تا اینکه یک شرط پایانی
را ملاقات نماید . همانطوریکه بعدا” خواهید دید، جاوا حلقه ای دارد که برای کلیه
نیازهای برنامه نویسی مناسب است .


while


حلقه while اساسی ترین دستور حلقه سازی (looping) در جاوا است . این دستور
مادامیکه عبارت کنترل کننده ، صحیح (true) باشد، یک دستور یا یک بلوک را تکرار
می کند . شکل کلی این دستور بقرار زیر است :

while(condition ){
// body of loop
}

شرط یا condition ممکن است هر عبارت بولی باشد . مادامیکه عبارت شرطی صحت
داشته باشد ، بدنه حلقه اجرا خواهد شد . هنگامیکه شرط صحت نداشته باشد ، کنترل
بلافاصله به خط بعدی کدی که بلافاصله پس از حلقه جاری قرار دارد ، منتقل خواهد
شد . اگر فقط یک دستور منفرد در حال تکرار باشد ، استفاده از ابروها غیر ضروری
است .
در اینجا یک حلقه while وجود دارد که تا ۱۰ را محاسبه کرده و دقیقا” ده خط “tick”
را چاپ می کند .

+ // Demonstrate the while loop.
+ class While {
+ public static void main(String args[] ){
+ int n = 10;
+
+ while(n > 0 ){
+ System.out.println(“tick” + n);
+ n–;
+ }
+ }
+ }

هنگامیکه این برنامه را اجرا می کنید، ده مرتبه “tick” را انجام خواهد داد:

tick 10
tick 9
tick 8
tick 7
tick 6
tick 5
tick 4
tick 3
tick 2
tick 1

از آنجاییکه حلقه while عبارت شرطی خود را در بالای حلقه ارزیابی میکند، اگر
شرط ابتدایی ناصحیح باشد ، بدنه حلقه اجرا نخواهد شد . بعنوان مثال ، در قطعه
زیر ، فراخوانی ()println هرگز اجرا نخواهد شد .

+ int a = 10/ b = 20;
+
+ while(a < b)
+ System.out.println(“This will not be displayed”);

بدنه while یا هر حلقه دیگر در جاوا ) ممکن است تهی باشد. زیرا دستور تهی دستوری که فقط شامل ; باشد ) از نظر قواعد ترکیبی در جاوا معتبراست . بعنوان مثال ، برنامه زیر را در نظر بگیرید :

+ // The target of a loop can be empty.
+ class NoBody {
+ public static void main(String args[] ){
+ int i/ j;
+
+ i = 100;
+ j = 200;
+
+ // find midpoint between i and j
+ while(++i <– j); // no body in this loop
+
+ System.out.println(“Midpoint is” + i);
+ }
+ }

این برنامه نقطه میانی (midpoint) بین iو jو را پیدا می کند و خروجی زیر را
تولید خواهد کرد :

Midpoint is 150

در اینجا چگونگی کار حلقه while را می بینید . مقدار i افزایش و مقدار j
کاهش می یابد . سپس این دو مقدار با یکدیگر مقایسه می شوند . اگر مقدار جدید i
همچنان کمتر از مقدار جدید j باشد ، آنگاه حلقه تکرار خواهد شد . اگر i مساوی
با یا بزرگتر از j بشود ، حلقه متوقف خواهد شد . تا هنگام خروج از حلقه ، i
مقداری را می گیرد که بین مقادیر اولیه iو jو می باشد . ( بدیهی است که این
رویه هنگامی کار می کند که i کوچکتر از مقدار اولیه j باشد . ) همانطوریکه
می بینید ، نیازی به بدنه حلقه نیست ، کلیه عملیات داخل خود عبارت شرطی اتفاق
می افتد . در کدهای حرفه ای نوشته شده دیگر جاوا ، وقتی که عبارت کنترل کننده
توانایی مدیریت کلیه جزئیات خود را داشته باشد ، حلقه های کوتاه غالبا” بدون
بدنه کد بندی می شوند .

do-while

گفتیم اگر عبارت شرطی کنترل کننده یک حلقه while در ابتدا ناصحیح باشد
آنگاه بدنه حلقه اصلا” اجرا نمی شود . اما گاهی مایلیم در چنین شرایطی ، بدنه
حلقه حداقل یکبار اجرا شود . بعبارت دیگر، در حالات خاصی مایلید تا عبارت پایان
دهنده در انتهای حلقه را آزمایش کنید. خوشبختانه ، جاوا حلقه ای را عرضه می کند
که دقیقا” همین کار را انجام می دهد : do-while . حلقه do-while همواره حداقل
یکبار بدنه خود را اجرا می کند، زیرا عبارت شرطی آن در انتهای حلقه قرار گرفته
است . شکل کلی آن بصورت زیر است :

do{
// body of loop
} while(condition);

هر تکرار از حلقه do-while ابتدا بدنه حلقه را اجرا نموده ، سپس به ارزیابی
عبارت شرطی خود می پردازد . اگر این عبارت صحیح (true) باشد ، حلقه اجرا خواهد
شد . در غیر اینصورت حلقه پایان می گیرد . نظیر کلیه حلقه های جاوا ، شرط باید
یک عبارت بولی باشد .
اینجا یک روایت دیگر از برنامه (tick) وجود دارد که حلقه do-while را نشان
می دهد . خروجی این برنامه مشابه برنامه قبلی خواهد بود :

+ // Demonstrate the do-while loop.
+ class DoWhile {
+ public static void main(String args[] ){
+ int n = 10;
+
+ do {
+ System.out.println(“tick” + n);
+ n–;
+ } while(n > 0);
+ }
+ }

حلقه موجود در برنامه قبلی ، اگر چه از نظر تکنیکی صحیح است ، اما می توان
آن را به شکل کاراتری بصورت زیر دوباره نویسی نمود : + do {
+ System.out.println(“tick ” + n);
+ } while–(n > 0);

در این مثال ، عبارت (۰>n) عمل کاهش n و آزمایش برای صفر را در یک عبارت
گنجانده است . عملکرد آن بقرار بعدی است . ابتدا دستور n اجرا می شود و n
را کاهش داده و مقدار جدید را به n برمی گرداند . این مقدار سپس با صفر مقایسه
می شود . اگر بزرگتر از صفر باشد ، حلقه ادامه می یابد . در غیر اینصورت حلقه
پایان می گیرد .
حلقه do-while بویژه هنگام پردازش انتخاب منو بسیار سودمند است ، زیرا
معمولا” مایلید تا بدنه یک حلقه منو حداقل یکبار اجرا شود . برنامه بعدی را که
یک سیستم Help ساده را برای دستورات تکرار و انتخاب در جاوا پیاده سازی می کند
در نظر بگیرید :

+ // Using a do-while to process a menu selection — a simple help system.
+ class Menu {
+ public static void main(String args[])
+ throws java.io.IOException {
+ char choice;
+
+ do {
+ System.out.prinln(“Help on:”);
+ System.out.prinln(” 1 .if”);
+ System.out.prinln(” 2 .switch”);
+ System.out.prinln(” 3 .while”);
+ System.out.prinln(” 4 .do-while”);
+ System.out.prinln(” 5 .for\n”);
+ System.out.prinln(“Choose one:”);
+ choice =( char )System.in.read)(;
+ } while(choice < ’1′ || choice > ’5′);
+
+ System.out.println(“\n”);
+ switch(choice ){
+ case ’1′:
+ System.out.println(“The if:\n”);
+ System.out.println(“if(condition )statement;”);
+ System.out.println(“else statement;”);
+ break;
+ case ’2′:
+
+ System.out.println(“The switch:\n”);
+ System.out.println(“switch(expression ){“);
+ System.out.println(” case constant:”);
+ System.out.println(” statement sequence”);
+ System.out.println(” break;”);
+ System.out.println(” //… “);
+ System.out.println(“}”);
+ break;
+ case ’3′:
+ System.out.println(“The switch:\n”);
+ System.out.println(while(condition )statement;”);
+ break;
+ case ’4′:
+ System.out.println(“The do-while:\n”);
+ System.out.println(“do {“);
+ System.out.println(” statement;”);
+ System.out.println(“} while( condition);”);
+ break;
+ case ’5′:
+ System.out.println(“The for:\n”);
+ System.out.print(“for(init; condition; iteration)”);
+ System.out.println(” statement;”);
+ break;
+ }
+ }
+ }

اکنون یک اجرای نمونه تولید شده توسط این برنامه را مشاهده می کنید :

Help on:
1 .if
2 .switch
3 .while
4 .do-while
5 .for
Choos one:
4

The do-while:

do {
statement;
} while( condition);

در برنامه ، از حلقه do-while برای تصدیق اینکه کاربر یک گزینه معتبر را
وارد کرده باشد ، استفاده می شود . در غیر اینصورت ، به کاربر مجددا” اعلان
خواهد شد . از آنجاییکه منو باید حداقل یکبار بنمایش درآید ، do-while حلقه
کاملی برای انجام این مقصود است .
چند نکته دیگر درباره این مثال : دقت کنید که کاراکترهااز صفحه کلید بوسیله
فراخوانی ()system.in.read خوانده می شوند . این یکی از توابع ورودی کنسول در
جاوا است .
اگر چه بررسی تفصیلی روشهای l/o جاوا به بحثهای بعدی موکول شده ، اما از
()system.in.read
در اینجا برای بدست آوردن گزینه کاربر استفاده شده است . این
تابع کاراکترها را از ورودی استاندارد می خواند ( که بعنوان عدد صحیح برگردان
شد ، این دلیلی است که چرا مقدار برگردان از طریق تبدیل (cast) به char تبدیل
شده است ). بصورت پیش فرض ، ورودی استاندارد، بافر شده خطی است (line buffered)
بنابراین قبل از اینکه کاراکترهایی را که تایپ کرده اید به برنامه اتان ارسال
کنید ، باید کلید ENTER را فشار دهید . ( این حالت مشابه C++/C است و احتمالا
از قبل با آن آشنایی دارید ) .
ورودی کنسول در جاوا کاملا” محدود شده و کار با آن بسیار مشکل است . بعلاوه
اکثر برنامه و ریز برنامه های واقعی نوشته شده با جاوا گرافیکی و پنجره ای
هستند. از سوی دیگر : چون از ()system.in.read استفاده شده ، برنامه باید جمله throwsjava.io.loException
را کاملا” توصیف نماید . این خط برای مدیریت خطاهای
ورودی ضروری است . این بخشی از جنبه های مختلف اداره استثنائ در جاوا است که
بعدا” بررسی خواهد شد .


for

خواهید دید که حلقه for یک ساختار قدرتمند و بسیار روان است .شکل کلی دستور for
بصورت زیر است :

for(initialization; condition; iteration; ){
// body
}

اگر فقط یک دستور باید تکرار شود ، نیازی به ابروها نیست .
عملکرد حلقه for بشرح بعدی است . وقتی که حلقه برای اولین بار شروع می شود
بخض مقدار دهی اولیه در حلقه اجرا می شود . معمولا، این بخش یک عبارت است که
مقدار متغیر کنترل حلقه را تعیین می کند ، که بعنوان یک شمارشگر ، کنترل حلقه
را انجام خواهد داد . مهم است بدانیم که عبارت مقدار دهی اولیه فقط یکبار اجرا
می شود . سپس شرط مورد ارزیابی قرار می گیرد . این شرط باید یک عبارت بولی
باشد . این بخش معمولا” مقدار متغیر کنترل حلقه را با مقدار هدف مقایسه می کند.
اگر عبارت صحیح (true) باشد، آنگاه بدنه حلقه اجرا خواهد شد . اگر ناصحیح باشد
حلقه پایان می گیرد . بعد، بخش تکرار (iteration) حلقه اجرا می شود . این بخش
معمولا” عبارتی است که مقدار متغیر کنترل را افزایش یا کاهش می دهد. آنگاه حلقه
تکرار خواهد شد ، ابتدا عبارت شرطی را ارزیابی می کند ، سپس بدنه حلقه را اجرا
می کند و سرانجام عبارت تکرار را در هر گذر (pass) اجرا میکند. این روال آنقدر
دادمه می یابد تا عبارت شرطی ناصحیح (false) گردد .
در زیر روایت جدیدی از برنامه “tick” را می بینید که از یک حلقه for استفاده
کرده است :

+ // Demonstrate the for loop.
+ class ForTick {
+ public static void main(String args[] ){
+ int n;
+ for(n=10; n>0; n)–
+ System.out.println(“tick” + n);
+ }
+ }

اعلان متغیرهای کنترل حلقه داخل حلقه for
غالبا” متغیری که یک حلقه for را کنترل می کند ، فقط برای همان حلقه مورد
نیاز بوده و کاربری دیگری ندارد . در چنین حالتی ، می توان آن متغیر را داخل
بخش مقدار دهی اولیه حلقه for اعلان نمود . بعنوان مثال در اینجا همان برنامه
قبلی را مشاهده می کنید که متغیر کنترل حلقه یعنی n بعنوان یک int در داخل
حلقه for اعلان شده است .

+ // Declare a loop control variable inside the for.
+ class ForTick {
+ public static void main(String args[] ){
+
+ // here/ n is declared inside of the for loop
+ for(int n=10; n>0; n)–
+ System.out.println(“tick” + n);
+ }
+ }

هنگامیکه یک متغیر را داخل یک حلقه for اعلان می کنید ، یک نکته مهم را باید
بیاد داشته باشید : قلمرو آن متغیر هنگامیکه دستور for انجام می شود ، پایان
می یابد . ( یعنی قلمرو متغیر محدود به حلقه for است . ) خارج از حلقه for
حیات آن متغیر متوقف می شود . اگر بخواهید از این متغیر کنترل حلقه در جای
دیگری از برنامه اتان استفاده کنید ، نباید آن متغیر را داخل حلقه for اعلان
نمایید .
درشرایطی که متغیر کنترل حلقه جای دیگری موردنیاز نباشد، اکثر برنامه نویسان
جاوا آن متغیر را داخل for اعلان می کنند . بعنوان مثال ، در اینجا یک برنامه
ساده را مشاهده می کنید که بدنبال اعداد اول می گردد. دقت کنید که متغیر کنترل
حلقه ، چون جای دیگری مورد نیاز نیست ، داخل for اعلان شده است .

+ // Test for primes.
+ class FindPrime {
+ public static void main(String args[] ){
+ int num;
+ boolean isPrime = true;
+
+ num = 14;
+ for(int i=2; i < num/2; i++ ){
+ if((num % i )== 0 ){
+ isPrime = false;
+ break;
+ }
+ }
+ if(isPrime )System.out.println(“Prime”);
+ else System.out.println(“Not Prime”);
+ }
+ }

استفاده از کاما Comma
شرایطی پیش می آید که مایلید بیش از یک دستور در بخش مقدار دهی اولیه
(initalization)
و تکرار (iteration) بگنجانید . بعنوان مثال ، حلقه موجود در
برنامه بعدی را در نظر بگیرید :

+ class Sample {
+ public static void main(String args[] ){
+ int a/ b;
+
+ b = 4;
+ for(a=1; a
+ System.out.println(“a = ” + a);
+ System.out.println(“b = ” + b);
+ b–;
+ }
+ }
+ }

همانطوریکه می بینید ، حلقه توسط ارتباط متقابل دو متغیر کنترل می شود . از
آنجاییکه حلقه توسط دو متغیر اداره می شود ، بجای اینکه b را بصورت دستی اداره
کنیم ، بهتر است تا هر دو را در دستور for بگنجانیم . خوشبختانه جاوا راهی
برای اینکار دارد . برای اینکه دو یا چند متغیر بتوانند یک حلقه for را کنترل
کنند ، جاوا به شما امکان می دهد تا چندین دستور را در بخشهای مقدار دهی اولیه
و تکرار حلقه for قرار دهید . هر دستور را بوسیله یک کاما از دستور بعدی جدا
می کنیم .
حلقه for قبلی را با استفاده از کاما ، خیلی کاراتر از قبل می توان بصورت
زیر کد بندی نمود :

+ // Using the comma.
+ class Comma {
+ public static void main(String args[] ){
+ int a/ b;
+
+ for(a=1/ b=4; a
+ System.out.println(“a = ” + a);
+ System.out.println(“b = ” + b);
+ }
+ }
+ }

در این مثال ، بخش مقدار دهی اولیه ، مقادیر aو bو را تعیین می کند . هربار
که حلقه تکرار می شود ، دو دستور جدا شده توسط کاما در بخش تکرار (itration)
اجرا خواهند شد . خروجی این برنامه بقرار زیر می باشد :

a=1
b=4
a=2
b=3

نکته : اگر با C++/C آشنایی دارید ، حتما” می دانید که در این زبانها ، علامت
کاما یک عملگر است که در هر عبارت معتبری قابل استفاده است . اما در
جاوا اینطور نیست . در جاوا ، علامت کاما یک جدا کننده است که فقط در
حلقه for قابل اعمال می باشد .

برخی گوناگونیهای حلقه for
حلقه for از تعدادی گوناگونیها پشتیبانی می کند که قدرت و کاربری آن را
افزایش می دهند . دلیل انعطاف پذیری آن است که لزومی ندارد که سه بخش مقداردهی
اولیه ، آزمون شرط و تکرار ، فقط برای همان اهداف مورد استفاده قرار گیرند .
در حقیقت ، سه بخش حلقه for برای هر هدف مورد نظر شما قابل استفاده هستند . به
چند مثال توجه فرمائید .
یکی از رایجترین گوناگونیها مربوط به عبارت شرطی است . بطور مشخص ، لزومی
ندارد این عبارت ، متغیر کنترل حلقه را با برخی مقادیر هدف آزمایش نماید . در
حقیقت ، شرط کنترل کننده حلقه for ممکن است هر نوع عبارت بولی باشد . بعنوان
مثال ، قطعه زیر را در نظر بگیرید :

+ boolean done = false;
+
+ for(int i=1; !done; i++ ){
+ //…
+ if(intettupted ))(done = true;
+ }

در این مثال ، حلقه for تا زمانیکه متغیر بولی done معادل true بشود ، اجرا
را ادامه خواهد داد . این مثال مقدار i را بررسی نمی کند .
اکنون یکی دیگر از گوناگونیهای جالب حلقه for را مشاهده می کنید. ممکن است
یکی یا هر دو عبارت مقدار دهی اولیه و تکرار غایت باشند ، نظیر برنامه بعدی :

+ // Parts of the for loop can be empty.
+ class ForVar {
+ public static void main(String args[] ){
+ int i;
+ boolean done = false;
+
+ i = 0;
+ for (; !done; ) {
+ System.out.println(“i is” + i);
+ if(i == 10 )done = true;
+ i++;
+ }
+ }
+ }

در اینجا عبارتهای مقدار دهی اولیه و تکرار به خارج ازfor انتقال یافته اند.
برخی از بخشهای حلقه for تهی هستند . اگر چه در این مثال ساده چنین حالتی هیچ
ارزشی ندارد ، اما در حقیقت شرایطی وجود دارد که این روش بسیار کارا و سودمند
خواهد بود. بعنوان مثال ، اگر شرط اولیه بصورت یک عبارت پیچیده و در جای دیگری
از برنامه قرار گرفته باشد و یا تغییرات متغیر کنترل حلقه بصورت غیر ترتیبی و
توسط اعمال اتفاق افتاده در داخل بدنه حلقه تعیین شود ، پس بهتر است که این
بخشها را در حلقه for تهی بگذاریم .
اکنون یکی دیگر از گوناگونیهای حلقه for را مشاهده می کنید. اگر هر سه بخش
حلقه for را تهی بگذارید ، آنگاه بعمد یک حلقه نامحدود ( حلقه ای که هرگز پایان
نمی گیرد ) ایجاد کرده اید . بعنوان مثال :

+ for (; ; ) {
+ //…
+ }

این حلقه تا ابد ادامه خواهد یافت ، زیرا هیچ شرطی برای پایان گرفتن آن
تعبیه نشده است . اگر چه برخی برنامه ها نظیر پردازشهای فرمان سیستم عامل
مستلزم یک حلقه نامحدود هستند ، اما اکثر حلقه های نامحدود در واقع حلقه هایی
هستند که ملزومات پایان گیری ویژه ای دارند . بزودی خواهید دید ، راهی برای
پایان دادن به یک حلقه حتی یک حلقه نامحدود نظیر مثال قبلی وجود دارد که
از عبارت شرطی معمولی حلقه استفاده نمی کند .

حلقه های تودرتو
نظیر کلیه زبانهای برنامه نویسی ، جاوا نیز امکان تودرتو کردن حلقه ها را
دارد . یعنی یک حلقه داخل حلقه دیگری قرار خواهد گرفت . بعنوان مثال ، در
برنامه بعدی حلقه های for تودرتو نشده اند :

+ // Loops may be nested.
+ class Nested {
+ public static void main(String args[] ){
+ int i/ j;
+
+ for(i=0; i<10; i++ ){
+ for(j=i; j<10; j++)
+ System.out.print(“.”);
+ System.out.println)(;
+ }
+ }
+ }

دیدگاه خود را بیان کنید.

باید وارد سایت شده باشید برای دیدگاه دادن