در ادامۀ مبحث حلقهها در زبان برنامهنویسی جاوا لازم به یادآوری است که در برخی مواقع نیاز به توسعهٔ برنامههایی داریم که داخل حلقههای تعریفشده در آن مقادیر منتسب به بیش از یک متغیر مورد بررسی قرار گرفته و در صورت برقرار بودن شرایط مرتبط، برخی دستورات خاصی اجرا شوند. بنابراین به دلیل اهمیت مسئلۀ نحوۀ تعریف چند متغیر در حلقههایی از جنس for
در این آموزش قصد داریم تا این موضوع را در قالب یک پروژه پیادهسازی نماییم.
به منظور پیادهسازی مسئلهای جهت بررسی نحوۀ تعریف بیش از یک متغیر در حلقۀ for
سناریویی بدین صورت تعریف میکنیم که در آن قصد داریم تا برنامۀ مربوطه به محاسبۀ مقادیر حاصلضرب عدد 2 در دیگر اعداد از 1 تا 50 بپردازد که این برنامه میتواند به خواهر یا برادرمان در یادگیری جدولِ ضرب کمک کند.
در همین راستا، پروژهای جدید تحت عنوان HelpingMySibling ایجاد میکنیم و یک کلاس در پروژۀ خود تحت عنوان MyMultiplyProgram
میسازیم و در ابتدا با بهکارگیری دیتا تایپ int
دو متغیر تحت عناوین numberOne
و numberTwo
تعریف میکنیم تا بتوانیم در حلقۀ for
عدد 2 را به یکی از آنها و همچنین هر یک از اعداد 1 تا 50 را در هر بار اجرای حلقه به متغیر دیگر اختصاص دهیم و بدین ترتیب کد برنامه تا این مرحله به صورت زیر خواهد بود:
public class MyMultiplyProgram {
public static void main(String[] args) {
int numberOne;
int numberTwo;
}
}
در کد فوق، متغیر numberOne
قرار است تا عدد 2 را نگهداری کرده و در هر بار اجرای حلقۀ for
در دیگر اعدادی ضرب شود که به ترتیب به متغیر numberTwo
اختصاص داده میشوند. حال بلوک مرتبط با حلقۀ for
را به برنامه اضافه میکنیم به طوری که خواهیم داشت:
public class MyMultiplyProgram {
public static void main(String[] args) {
int numberOne;
int numberTwo;
for ( ) {
}
}
}
در این مرحله، همانطور که قبلاً آموزش دادیم، پارامترهای داخل پرانتز در مقابل کیورد for
را به ترتیبِ نقطۀ آغازین حلقه، نقطۀ پایانی و در نهایت مقدار افزایشی اضافه میکنیم. برای شروع، پارامترهای مرتبط با نقطهٔ آغازین به صورت زیر هستند:
public class MyMultiplyProgram {
public static void main(String[] args) {
int numberOne;
int numberTwo;
for (numberOne = 2, numberTwo = 1;) {
}
}
}
همانطور که در کد فوق میبینیم، نقطۀ آغازین برنامه را با انتساب عدد 2 به متغیر numberOne
و عدد 1 به متغیر numberTwo
شروع کردهایم چرا که قصد داریم تا جدول ضرب مورد نظر با ضرب عدد 2 در 1 شروع شده و تا عدد 50 ادامه یابد.
نکته |
در صورتی که بخواهیم تا بیش از یک متغیر را در حلقهها تعریف کرده و مورد استفاده قرار دهیم، میباید حتماً متغیرهای مذکور را با یک کاما از یکدیگر جدا کرده و پس از آخرین متغیر نیز یک علامت ; قرار دهیم. |
همانطور که پیشتر اشاره کردیم، برنامۀ مورد نظر قرار است تا حاصلضرب عدد 2 در هر یک از اعداد 1 تا 50 را در خروجی چاپ نماید و از همین روی شرط نقطۀ پایانی برنامه را بدین ترتیب تعریف میکنیم که اجرای حلقه زمانی متوقف شود که حاصلضرب عدد 2 در عدد دیگر کوچکتر از 100 یا مساوی با آن میگردد و بدین ترتیب پارامتر دوم حلقه را به شکل زیر درج میکنیم:
public class MyMultiplyProgram {
public static void main(String[] args) {
int numberOne;
int numberTwo;
for (numberOne = 2, numberTwo = 1; numberTwo * numberOne <= 100;) {
}
}
}
در ادامه به تعریف پارامتر سوم در حلقهٔ مذکور یا به عبارتی میزان افزایش متغیر numberTwo
در هر بار اجرای حلقه میپردازیم. در واقع، مقدار متغیر numberOne
ثابت میباشد چرا که قصد داریم تا مقدار منتسب به این متغیر یا عدد 2 را در سایر اعدادی که به متغیر numberTwo
منتسب میشوند، ضرب کرده و در کنسول چاپ نماییم.
با توجه به آنچه که در بالا بدان اشاره کردیم، میزان افزایش مقادیر اختصاصیافته به متغیر numberTwo
در هر بار اجرای حلقه را یک واحد افزایش میدهیم؛ به عبارت دیگر، با اجرای برنامه مقدار منتسب به متغیر numberOne
معادل عدد 2 در مقدار اختصاصیافته به متغیر numberTwo
معادل عدد 1 ضرب شده و حاصل آن در کنسول چاپ میشود و در تکرار بعدی مقدار منتسب به متغیر numberTwo
یک واحد افزایش یافته و در عدد 2 ضرب شده و مجدداً نتیجۀ حاصل در کنسول چاپ میگردد که این فرآیند تا زمان اختصاص عدد 50 به متغیر numberTwo
ادامه مییابد. بنابراین به منظور تعریف پارامتر سوم کدی به صورت زیر خواهیم داشت:
public class MyMultiplyProgram {
public static void main(String[] args) {
int numberOne;
int numberTwo;
for (numberOne = 2, numberTwo = 1; numberTwo * numberOne <= 100; numberTwo ++) {
}
}
}
در این مرحله به تعریف دستورات داخلی حلقۀ for
مابین دو علامت { }
میپردازیم تا مقدار حاصل از ضرب عدد اختصاصیافته به متغیر numberOne
در مقادیر منتسب به متغیر numberTwo
را در کنسول نمایش دهیم که برای این منظور نیاز به چاپ استرینگی با مضمون «نتیجۀ حاصل از ضرب دو عدد برابر است با:» در کنسول داریم و از همین روی کد فوق را به صورت زیر تکمیل مینماییم:
public class MyMultiplyProgram {
public static void main(String[] args) {
int numberOne;
int numberTwo;
for (numberOne = 2, numberTwo = 1; numberTwo * numberOne <= 100; numberTwo ++) {
System.out.println("The result of " + numberOne + " * " + numberTwo + " is " + (numberOne * numberTwo));
}
}
}
همانطور که در کد فوق مشاهده میکنیم، در سطر ششم و داخل متد ()println
استرینگهای مورد نظر را مابین علائم " "
تعریف کرده و با استفاده از اپراتور +
گفتهایم مقادیر منتسب به متغیرهای numberOne
و numberTwo
در هر بار اجرای حلقه به عنوان آرگومان ورودی به متد ()println
داده شده و به همراه استرینگهای فوق در کنسول چاپ شوند.
در واقع، با اجرای برنامۀ فوق، اعداد 2 و 1 به ترتیب به متغیرهای numberOne
و numberTwo
منتسب شده و شرط حلقه چک میشود که آیا حاصلضرب 2 در 1 کوچکتر از عدد 100 یا مساوی با آن است یا خیر که شرط true
بوده و دستورات داخلی حلقه اجرا میشوند و بدین ترتیب استرینگ «The result of» با مقدار منتسب به متغیر numberOne
معادل عدد 2 الحاق شده سپس کاراکتر «*» و در ادامه مقدار منتسب به متغیر numberTwo
معادل عدد 1 به همراه استرینگ « is» با استرینگ مذکور الحاق میشوند و در ادامه عملیات ریاضیاتی داخل پرانتز نیز محاسبه شده و مقدار حاصل از ضرب عدد 2 در 1 به همراه استرینگهای مربوطه در کنسول چاپ میگردند و در مرحلۀ بعد یک واحد به مقدار منتسب به متغیر numberTwo
افزوده شده و فرآیند فوقالذکر تکرار میشود.
همانطور که در آموزشهای پیشین توضیح دادیم، جهت انجام عملیات ریاضیاتی به طور مجزا از دیگر بخشهای برنامه میباید آنها را داخل دو پرانتز قرار دهیم و از همین روی در کد فوق محاسبات ریاضیاتی مربوط به ضرب مقادیر متغیرهای numberOne
و numberTwo
را داخل دو پرانتز در متد ()println
تعریف کردیم چرا که در غیر این صورت مقدار اختصاصیافته به متغیر numberOne
در قالب یک مقدار استرینگ با سایر استرینگهای برنامه کانکت (الحاق) شده و در مقدار منتسب به متغیر numberTwo
ضرب میشد. حال برنامه را اجرا کرده و در خروجی خواهیم داشت:
The result of 2 * 1 is 2
The result of 2 * 2 is 4
The result of 2 * 3 is 6
The result of 2 * 4 is 8
The result of 2 * 5 is 10
The result of 2 * 6 is 12
.
.
.
The result of 2 * 46 is 92
The result of 2 * 47 is 94
The result of 2 * 48 is 96
The result of 2 * 49 is 98
The result of 2 * 50 is 100
همانطور که مشاهده میکنیم، برنامه به درستی کار کرده و خروجی مورد انتظار را ارائه مینماید و سه نقطۀ درجشده در آن نیز بدین معنی است که لیست فوق ادامه داشته و هر یک از اعداد 1 تا 50 در عدد 2 ضرب شده و خروجی حاصل از ضرب نیز تا عدد 100 در کنسول چاپ شده است و اجرای برنامه نیز با رسیدن به عدد 100 متوقف میشود چرا که در شرط مربوط به پارامتر دوم گفتهایم حلقهٔ ما تا زمانی تکرار شود که مقدار حاصل از ضرب مقادیر دو متغیر numberOne
و numberTwo
کوچکتر از 100 یا مساوی با آن میباشد که با رسیدن به عدد 100 نیز سیستم از حلقه خارج میگردد.
نکتۀ قابلتوجه در پایان در ارتباط با اپراتورهایی همچون +
و -
و سایر اپراتورهای ریاضیاتی این است که با بهکارگیری چنین اپراتورهایی میتوانیم مقادیر عددیِ مورد نظر خود را با یکدیگر و همچنین با استرینگها ادغام نماییم که در چنین شرایطی خروجی برنامه در قالب مقداری از جنس استرینگ خواهد بود. همچنین لازم به یادآوری است که جهت خوانایی بیشترِ خروجی برنامه میتوان از اِسپیسهای قبل و بعد از استرینگهای مورد نظر استفاده کرد که برای مثال در کد فوق از اِسپیسها پس از استرینگ «The result of» و همچنین قبل و بعد از کاراکتر «*» استفاده کرده و بدین ترتیب خوانایی استرینگ چاپشده در کنسول را افزایش دادهایم که برای روشن شدن این موضوع و اهمیت درج اِسپیس در استرینگهای مربوطه، کد فوق را به شکل زیر تغییر میدهیم:
public class MyMultiplyProgram {
public static void main(String[] args) {
int numberOne;
int numberTwo;
for (numberOne = 2, numberTwo = 1; numberTwo * numberOne <= 100; numberTwo++) {
System.out.println("The result of" + numberOne + "*" + numberTwo + "is" + (numberOne * numberTwo));
}
}
}
حال پس از حذف اِسپیس پس از استرینگ «The result of»، اِسپیسهای قبل و بعد از استرینگ «is» و همچنین کاراکتر «*» برنامه را اجرا میکنیم به طوری که در خروجی خواهیم داشت:
The result of2*1is2
The result of2*2is4
The result of2*3is6
The result of2*4is8
The result of2*5is10
The result of2*6is12
The result of2*7is14
.
.
.
The result of2*49is98
The result of2*50is100
همانطور که میبینیم، نحوۀ عملکرد برنامه تغییری نکرده است اما خوانایی خروجی به دلیل حذف اِسپیسها به مراتب کمتر شده است.
به علاوه، با تسلط بر مبحث حلقهها میتوانیم با تلفیق کلاس Scanner
با برنامۀ پیادهسازی شده در این آموزش، برنامهای جدید طراحی کنیم تا به طور مثال بتوانیم به صورت دینامیک مقدار متغیر numberOne
را به عنوان ورودی به برنامه داده و خروجی حاصل از آن را در کنسول ببینیم. به عبارت دیگر، در چنین شرایطی به جای عدد 2 میتوانیم عدد دیگری همچون 7 را از طریق کیبورد وارد برنامه کرده و حاصلضرب این عدد در هر یک از اعداد 1 تا 50 را در کنسول به دست آوریم و بالتبع برنامهٔ آموزشی خود را برای آموزش عملیات ریاضیاتی ضرب بهبود بخشیم.