آشنایی با نحوهٔ‌ تعریف بیش از یک متغیر در حلقه‌هایی از جنس for در زبان برنامه‌نویسی جاوا


در ادامۀ مبحث حلقه‌ها در زبان برنامه‌نویسی جاوا لازم به یادآوری است که در برخی مواقع نیاز به توسعهٔ برنامه‌هایی داریم که داخل حلقه‌های تعریف‌شده در آن مقادیر منتسب به بیش از یک متغیر مورد بررسی قرار گرفته و در صورت برقرار بودن شرایط مرتبط، برخی دستورات خاصی اجرا شوند. بنابراین به دلیل اهمیت مسئلۀ نحوۀ تعریف چند متغیر در حلقه‌هایی از جنس 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 را در کنسول به دست آوریم و بالتبع برنامهٔ آموزشی خود را برای آموزش عملیات ریاضیاتی ضرب بهبود بخشیم.

دانلود فایل‌های تمرین


بهزاد مرادی

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
amilad
amilad
۱۳۹۷/۱۰/۱۵
ممنون مثل همیشه عالی بود
moghdaminia.ra
moghdaminia.ra
۱۳۹۷/۰۸/۱۰
سلام دوستان

ممنون میشم اگر کسی راه حل مسئله انتهای همین آموزش رو اینجا به اشتراک بگذاره .
mahtab.rashidi
mahtab.rashidi
۱۳۹۷/۰۴/۰۲
سلام وقت بخیر.
وقتی که کاربر میخواد یه عدد وارد کنه چطور کنترل کنیم که حرف وارد نکنه؟ مثلا چطور از طریق پیام بهش بگیم فقط باید عدد وارد کنه و اگر حرف وارد کنه خطا بده؟
کاربر میهمان
کیوانمن یک کاربر مهمان هستم
۱۳۹۴/۱۲/۰۲
سلام و خسته نباشید.یک سوال داشتم من خواستم پروژه اخری که گفتین با کلاس اسکنر امتحان کنم انجام بدم اما من بدون لوپ انجام دادم که ساده تر بشه بعدا لوپ کنم حالا مشکلم این که توی کنسول اول باید عدد وارد کرد بعد متن و جواب ظاهر میشه اما من میخوام اول بنویسه Number2 * بعد منتظر ورودی باشه بعد از این که کاربر یک عدد زد و اینتر کرد ژاسخ مقابلس یا پایینش بنویسه اما مال من برعکس اوا مثلا میزنم 2 بعد اینتر میزنه Number2 * 2+4 مشکل از چیه؟ اینم کدimport java.util.Scanner;

public class mal {

public static void main(String[] args) {
Scanner lol =new Scanner (System.in);
int numberFx=2 ;
int numberIt;

System.out.println(numberFx +" * "+numberIt +" = " + (numberFx*numberIt));
numberIt= lol.nextInt();


}

}

hacker
hacker
۱۳۹۴/۰۹/۲۹
اگه بخوایم ضرب که بدست اومده رو تا 2 رقم اعشار خط بزنیم باید چیکار کنیم؟
عیسی پور
عیسی پور
۱۳۹۴/۰۹/۱۱
بسیار عالی