چرا سکان آکادمی؟
نحوۀ استفاده از متدهای کلاس Scanner با مقادیر بازگشتی بولینی در زبان جاوا

نحوۀ استفاده از متدهای کلاس Scanner با مقادیر بازگشتی بولینی در زبان جاوا

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

ابتدا یک پروژۀ جدید تحت عنوان PassApp ساخته و کلاسی به اسم Project در آن ایجاد می‌کنیم. حال یک سناریوی فرضی تعریف کرده و بر اساس آن برنامۀ مورد نظر خود را پیاده‌سازی می‌نماییم. فرض می‌کنیم که قصد داریم تا اپلیکیشنی تحت وب طراحی نماییم که کاربران به منظور استفاده از این برنامه می‌باید در ابتدا رمز عبور خود را وارد کنند که برای این منظور نیاز داریم تا یک دستور شرطی تعریف نماییم بدین صورت که چنانچه کاربر داده‌ای به غیر از یک عدد صحیحِ چندرقمی وارد برنامه کرد، استرینگی مبنی بر عدم رعایت فرمت درست را در معرض دید وی قرار دهد (در آموزش آتی با جزئیات بیشتری به نحوۀ پیاده‌سازی دستورهای شرطی خواهیم پرداخت.)

برای شروع، ابتدا یک آبجکت از روی کلاس Scanner می‌سازیم سپس استرینگی به صورت « :Please enter your password» در کنسول نمایش می‌دهیم تا بدین ترتیب به کاربر اطلاع دهیم که پسورد خود را وارد نماید و برای این منظور کد خود را به شکل زیر تکمیل می‌کنیم:

import java.util.Scanner;
public class Project {
    public static void main(String[] args) {
        Scanner passwordInput = new Scanner(System.in);
        System.out.print("Please enter your password: ");
    }
}

همان‌طور که مشاهده می‌کنیم، آبجکتی تحت عنوان passwordInput از روی کلاس Scanner ساخته و همچون آموزش‌های پیشین با استفاده از دستور System.in امکان دریافت ورودی از طریق کیبورد را به برنامه می‌دهیم سپس با به‌کارگیری دستور System.out استرینگ مد نظر خود را در کنسول چاپ می‌نماییم.

پس از آن که کاربر پسورد خود را وارد برنامه کرد، نیاز است تا چک کنیم ببینیم که آیا دادۀ ورودی از جنس عدد صحیح است یا خیر به علاوه اینکه درست یا نادرست بودن پسورد ورودی نیز می‌باید بررسی شود که برای این منظور متدی تحت عنوان ()hasNextInt متعلق به کلاس Scanner را مورد استفاده قرار می‌دهیم. نحوۀ عملکرد متد مذکور بدین صورت است که دیتای ورودی از طریق کیبورد را خوانده و در صورتی که دادۀ مذکور از جنس عدد صحیح باشد مقدار true و در غیر این صورت مقدار false را ریترن می‌کند:

import java.util.Scanner;
public class Project {
    public static void main(String[] args) {
        Scanner passwordInput = new Scanner(System.in);
        System.out.print("Please enter your password: ");
        if (passwordInput.hasNextInt()) {
            System.out.println("Thanks, you entered the right format.");
        } else {
            System.out.println("Sorry, please enter the right format.");
        }
        passwordInput.close();
    }
}

در کد فوق، متد ()hasNextInt را روی آبجکت ساخته‌شده از روی کلاس Scanner فراخوانی کرده و مقدار بولین ریترن‌شده در نتیجۀ این فراخوانی را به عنوان دستور شرطی قرار داده‌ایم و بدین ترتیب گفته‌ایم در صورت true بودن مقدار بازگشتی از این متد دستور داخلی if اجرا شده و استرینگ «.Thanks, you entered the right format» و در غیر این صورت استرینگ «.Sorry, please enter the right format» در کنسول چاپ شود که نتیجۀ حاصل از اجرای کد فوق به صورت زیر خواهد بود:

Please enter your password: 2213
Thanks, you entered the right format.

برنامۀ فوق صرفاً نوع دادۀ ورودی را چک کرده و می‌بینیم که یک رمز عبور فرضی همچون عدد صحیح 2213 را به عنوان پسورد درست شناسایی کرده است که در صورت وارد کردن داده‌ای از جنس استرینگ، خروجی برنامۀ مذکور به صورت زیر می‌باشد:

Please enter your password: asd123
Sorry, please enter the right format.

همان‌طور که مشاهده می‌کنیم، برنامه به درستی پیام خطایی مبنی بر عدم رعایت فرمت درست مرتبط با پسورد را در معرض دید کاربر قرار می‌دهد اما این در حالی است که قابلیت بررسی هم‌خوانی با پسورد تعریف‌شدۀ کاربر را ندارد که برای این منظور نیاز است تا کد خود را به صورت زیر تکمیل نماییم:

import java.util.Scanner;
public class Project {
    public static void main(String[] args) {
        Scanner passwordInput = new Scanner(System.in);
        System.out.print("Please enter your password: ");
        int builtInPassword = 2244176;
        if (passwordInput.hasNextInt() && passwordInput.nextInt() == builtInPassword) {
            System.out.println("Thanks, you entered the right format and also your password is correct.");
        } else {
            System.out.println("Sorry, please enter the right format or the right password.");
        }
        passwordInput.close();
    }
}

در کد فوق، با استفاده از دیتا تایپ int متغیری تحت عنوان builtInPassword تعریف کرده و عدد دلخواه 2244176 را به عنوان پسورد تعریف‌شدۀ کاربر بدان منتسب نموده‌ایم سپس در ادامه دستوری شرطی تعریف کرده‌ایم بدین صورت که چنانچه کاربر از یکسو داده‌ای از جنس عدد صحیح و از سوی دیگر عدد صحیحی معادل با 2244176 را به عنوان پسورد خود وارد کرد، شرط برقرار بوده و استرینگی مبنی بر درست بودن پسورد در کنسول چاپ می‌شود.

در واقع، در دستور شرطی فوق اپراتور && را به منظور بررسی دو شرط به صورت هم‌زمان مورد استفاده قرار داده‌ایم و نحوۀ عملکرد آن بدین صورت است که چنانچه هر دو شرط مرتبط با این عملگر معادل با مقدار بولین true باشند، شرط کلی نیز برابر با true بوده و بدین ترتیب دستورات مرتبط با if اجرا می‌شوند.

در واقع، شرایط مرتبط با عملگر && را بدین صورت تعریف کرده‌ایم که در ابتدا متد ()hasNextInt را روی آبجکت ساخته‌شده فراخوانی نموده‌ایم و بدین طریق چک می‌کنیم ببینیم که آیا نوع دادۀ ورودی از طریق کیبورد از جنس عدد صحیح است یا خیر و در شرط دوم نیز متد ()nextInt را روی آبجکت مذکور فراخوانی کرده‌ایم که در این صورت متد ()nextInt دادۀ ورودی از سمت کاربر را خوانده سپس دیتای خوانده‌شده با استفاده از عملگر == با مقدار منتسب به متغیر builtInPassword از نظر نوع و مقدار مقایسه می‌شود.

بنابراین چنانچه دادۀ ورودی از کاربر هم از جنس عدد صحیح و هم دقیقاً برابر با پسورد تعریف‌شدۀ کاربر باشد، مقدار هر دو شرط true شده و شرط کلی نیز برقرار می‌گردد و دستور مرتبط با if اجرا می‌گردد و در غیر این صورت دستورات مرتبط با بدنۀ else اجرا شده و استرینگ «.Sorry, please enter the right format or the right password» در کنسول نمایش داده می‌شود. حال اگر برنامۀ فوق را اجرا کنیم، در خروجی خواهیم داشت:

Please enter your password: 2244176
Thanks, you entered the right format and also your password is correct.

در نتیجۀ حاصل از اجرای برنامۀ مذکور می‌بینیم که با وارد کردن دیتایی از جنس عدد صحیح و همچنین دقیقاً معادل پسورد تعریف‌شده برای کاربر، هر دو شرط برقرار بوده و برابر با مقدار بولین true می‌باشند که از همین روی شرط کلی نیز true شده و دستورات مرتبط با if در کنسول اجرا می‌گردند. حال مجدداً برنامه را اجرا کرده و این بار داده‌ای به غیر از عدد صحیح وارد برنامه می‌کنیم که بدین ترتیب در خروجی خواهیم داشت:

Please enter your password: abx
Sorry, please enter the right format or the right password.

با اجرای برنامۀ فوق و وارد کردن دیتایی از جنس استرینگ معادل با عبارت «abx» هیچ یک از شروط دستور if برقرار نبوده و از همین روی دستور مرتبط با else اجرا شده و استرینگ فوق در کنسول نمایش داده می‌شود. در ادامه، مجدد برنامۀ خود را اجرا می‌کنیم و این بار داده‌ای از جنس عدد صحیح معادل 1234 وارد می‌کنیم به طوری که در خروجی خواهیم داشت:

Please enter your password: 1234
Sorry, please enter the right format or the right password.

با اجرای برنامه می‌بینیم که مجدداً دستور مرتبط با else اجرا شده و استرینگ فوق در کنسول چاپ می‌گردد چرا که شرط دوم قیدشده در دستور if معادل با تساوی مقدار خوانده‌شده از ورودی توسط متد ()nextInt با مقدار منتسب به متغیر builtInPassword برقرار نبوده و از همین روی مقدار بولین شرط کلی نیز برابر با false می‌گردد و در نتیجه دستورات مرتبط با else اجرا می‌شوند.

در زبان برنامه‌نویسی جاوا، یکسری متد متعلق به کلاس Scanner تعریف شده‌اند كه مقدار بازگشتی از جنس بولین داشته و به منظور چک کردن نوع دیتای ورودی از طریق کیبورد مورد استفاده قرار می‌گیرند که از آن جمله می‌توان به متدهای ()hasNextLine و ()hasNextDouble اشاره کرد که به ترتیب به منظور چک کردن نوع دادۀ ورودی از جنس استرینگ و بررسی نوع دادۀ ورودی از جنس عدد اعشاری مورد استفاده قرار می‌گیرند. برای مثال، در صورتی که متد ()hasNextLine در برنامۀ مورد نظر فراخوانی شده و نوع دادۀ ورودیِ کاربر از جنس استرینگ باشد، متد مذکور مقدار true و در غیر این صورت مقدار false را در خروجی ریترن می‌کند.