استفاده از متدهای بولینی در کلاس اسکنر جاوا


همان طور که در آموزش های گذشته دیدیم، چنانچه داده ورودی به برنامه با متدی که در کلاس Scanner به کار گرفته شده بود هم خوانی نداشت، برنامه با خطا مواجه می شد و این در حالی است که ما این اجازه را نداریم تا برنامه ای طراحی کنیم که اگر کاربر چیزی به اشتباه وارد برنامه کرد برنامه در وسط اجرا Crash کند یا از ادامه کار باز ایستد.

برای این منظور نیاز داریم تا از متدهایی در کلاس Scanner استفاده کنیم که از نوع boolean باشند که چنانچه کاربر یک داده اشتباه وارد کرد به او بازخورد دهد. بنابراین یک پروژه جدید تحت عنوان PassApp ایجاد کرده و کلاسی به اسم Project در آن ایجاد می کنیم. اکنون نیاز است تا یک سناریو تعریف کنیم تا بر آن اساس پروژه خود را تکمیل کنیم:

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

در ابتدا یک شیئ از روی کلاس Scanner تحت عنوان passwordInput به معنی "ورودی رمز عبور" می سازیم. سپس می خواهیم جمله ای به این مضمون در کنسول نمایش دهیم که "لطفا رمز عبور خود را وارد کنید". برای این منظور کد خود را به شکل زیر تکمیل می کنیم:

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

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

متدهای boolean که در ارتباط با کلاس Scanner مورد استفاده قرار می گیرند و از اهمیت بیشتری برخوردارند عبارتند از ()hasNextLine برای بررسی این مسئله که ببینیم آیا داده ای از جنس یک string یا "رشته" وارد شده است یا خیر، ()hasNextDouble برای بررسی این مسئله که ببینیم آیا داده ای از جنس یک عدد اعشاری وارد شده است یا خیر و در نهایت ()hasNextInt برای بررسی این مسئله که ببینیم آیا داده ای از جنس یک عدد صحیح وارد شده است یا خیر که در برنامه خود در این پروژه از متد آخر استفاده خواهیم کرد چرا که در سناریوی این پروژه تعریف کرده ایم که رمز عبور کاربر می بایست داده ای از جنس عدد صحیح باشد. بنابراین می بایست کد خود را به شکل زیر تکمیل کنیم:

import java.util.Scanner;
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");
        }
    }
}

شرط اول برنامه این است که چک کنیم ببینیم که آیا کاربر داده ای از جنس عدد صحیح به عنوان رمز وارد کرده است یا خیر. برای این منظور همان طور که در کد فوق مشاهده می شود یک شرط if وارد برنامه کرده و داخل پرانتز نام شیئ ساخته شده از روی کلاس Scanner را نوشته سپس متد ()hasNextInt را به آن ضمیمه می کنیم.

به طور خلاصه، این شرط حاکی از آن است که برنامه ببیند آیا داده ورودی از طریق کیبورد از جنس یک عدد صحیح است یا خیر و این در حالی است که هیچ فرقی نمی کند این عدد صحیح چه مقداری داشته باشد چرا که در شرط دوم خود این مسئله را خواهیم سنجید. از آنجا که می خواهیم اگر این شرط true بود عبارت Thanks, you entered the right format به معنی "با تشکر، شما فرمت صحیح را وارد کردید" در کنسول به نمایش درآید، پس جمله خود را در دستور ;()System.out.println در داخل { } های مقابل if می نویسیم. از آنجا که می خواهیم اگر فرمت رمز چیزی به غیر از داده ای از جنس عدد صحیح بود برنامه به کاربر اخطار دهد، داخل دستور else با استفاده از دستور ;()System.out.println جمله ی Sorry, please enter the right format به معنی "متأسفیم، لطفا فرمت صحیح را وارد نمایید" را وارد می کنیم. اکنون یک بار برنامه خود را اجرا می کنیم و رمزی از جنس یک عدد صحیح مثلا عدد 2213 وارد می کنیم:

می بینیم که برنامه داده ورودی را به درستی تشخیص می دهد. مجدد برنامه را اجرا کرده این بار هر نوع داده ای به غیر از یک عدد صحیح وارد می کنیم مثلا asd132 :

همان طور که ملاحظه می شود -از آنجا که جواب شرط false است- برنامه دستور داخل else را اجرا می کند. در ادامه، می خواهیم ببینیم که اگر رمز داده ای از جنس عدد صحیح بود، حال آیا این رمز با رمز تعبیه شده در برنامه هم خوانی دارد یا خیر. برای این منظور کد خود را به صورت زیر بازنویسی می کنیم:

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

همان طور که مشاهده می شود، یک متغیر از جنس int تحت عنوان builtInPassword به معنی رمزعبور تعبیه شده در سیستم ایجاد می کنیم و مقدار آن را معادل با 2244176 قرار می دهیم (این عدد به دلخواه انتخاب شده است.) در واقع اگر کاربر داده ای از جنس عدد صحیح از یک سو، و همچنین عدد صحیحی معادل با 2244176 از سوی دیگر وارد کند خواهد توانست وارد حساب کاربری خود شود. داخل شرط if یک علامت && قرار داده ایم که در زبان برنامه نویسی جاوا به معنی "و" می باشد. در واقع هر موقع که بخواهیم بیش از یک شرط را در برنامه خود بگنجانیم از این ساختار استفاده می کنیم (به خاطر داشته باشیم که در شرط قرار گرفته در سمت چپ && متد hasNextInt به شیئ ساخته شده از روی کلاس Scanner ضمیمه شده در حالیکه در شرط قرار گرفته در سمت راست علامت && متد nexInt به این شیئ ضمیمه شده است.)

سپس این شرط را می گذاریم که اگر شیئ ساخته شده از روی کلاس Scanner که همان passwordInput است به انضمام متد ()nextInt که وظیفه دارد مقدار متغیر از جنس عدد صحیح را در خود ذخیره سازد دارای مقداری برابر با مقدار متغیر builtInPassword بود، عبارت Thanks, you entered the right format and also your password is correct به معنی "با تشکر، شما فرمت صحیح را وارد کردید و رمز عبور هم صحیح است" نمایش داده خواهد شد و در صورتی که جواب به این دو شرط یا یکی از آنها false بود، عبارت Sorry, please enter the right format or the right password به معنی "متأسفیم، لطفا فرمت صحیح یا رمز عبور صحیح را وارد نمایید" نمایش داده خواهد شد. اکنون می توانیم برنامه خود را اجرا کنیم و نتیجه را ببینیم:

از آنجا که داده ورودی از یک سو یک عدد صحیح است و از سوی دیگر معادل با مقدار متغیر builtInPassword است، جواب هر دو شرط true بوده و دستور مرتبط با آن اجرا می شود. مجدداً برنامه را اجرا کرده ولی این بار داده ای به غیر از عدد صحیح وارد می کنیم:

می بینیم از آنجا که داده ورودی یک عدد صحیح نیست از این رو جواب به شرط ()passwordInput.hasNextInt معادل با false خواهد بود و دستور مرتبط با false اجرا می شود. مجدد برای آخرین بار برنامه را اجرا کرده و این بار یک عدد صحیح وارد می کنیم اما مقدار این عدد صحیح با مقدار متغیر builtInPassword یکی نیست:

از آنجا که در مثال فوق فقط یکی از شرط های برنامه برآورده شده است، به عبارت دیگر جواب به شرط passwordInput.nextInt() == builltInPassword معادل با false است، پس در کل جواب به شرط false بوده و متعاقباً دستور مرتبط با جواب false اجرا می شود.

لازم به ذکر است که در فصل آتی، به طور مفصل با دستورات شرطی در زبان برنامه نویسی جاوا آشنا خواهیم شد.

دانلود فایل‌های تمرین
لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
کاربر میهمان
کاربر میهمانمن یک کاربر مهمان هستم
لطفا یکی کمک کنه تو vscode وقتی از system.in استفاده میکنم و ورودی رو میزنم این ارور رو میده :
.Evaluation failed because the thread is not suspended
mahtab.rashidi
mahtab.rashidi
ممنون تشکر فراوان بابت آموزش های عالیتون
هدر فایل این صفحه غلط املایی داره اسنکر------ اسکنر
کاربر میهمان
کاربر میهمانمن یک کاربر مهمان هستم
سلام
بنظرم شما inputpassword.nextint رو فراموش کردین بنویسین
البته شایدم اشتباه میکنم ولی هرچی دقت کردم این نبود
miladmoradiyan
miladmoradiyan
سلام من با یه کامپایلر انلاین کار می کنم و می گه نمی تونی Scannerروانپورت کنیم وارد کنیم راه دیگه ای ام هست غیر اسکنر برای گرفتن وردی از کاربر
کاربر میهمان
omidمن یک کاربر مهمان هستم
با سلام چگونه می توان حداقل و حداکثر کاراکتر ورودی را برای کاربر تعین کرد ؟
کاربر میهمان
soroushمن یک کاربر مهمان هستم
سلام
ممنون از آموزش های خوبتون
چطوری یه کدی بنویسیم که اگر کاربر به جای اعداد صحیح، حرف نوشت برنامه کرش نکنه؟
امین ناطق
امین ناطق
سلام کل برنامه من درست اجرا میشه ولی در قسمت آخر که else رو داریم فقط این دستور اجرا نمیشه حتی از روی کدی که شما نوشته بودید کپی کردم ولی باز برنامه اجرا نمیشه و زیر این دستور یه خط قرمز میکشه حتی علامت شروع و پایانش رو هم درست نشون میده { } ولی دستور داخل گیومه اجرا نشد هرکاری کردم باز زیر else خط میکشه و دستور داخلش اجرا نشد لطفا راهنمایی بفرمایید.
کاربر میهمان
سجاد مرادیمن یک کاربر مهمان هستم
البته نمیخوام برنامه رو پاک کنم و از اول نصب کنم
فقط میخوام از طریق خود برنامه به حالت اولیه برگردم
مثل تنظیمات کارخانه در گوشی
کاربر میهمان
سجاد مرادیمن یک کاربر مهمان هستم
سلام
ممنون از آموزش های عالیتون
من توی کلاس اسکنر ورودی رو int خواستم و بعد هم درخواست نمایش عدد رو در کد ها قرار دادم
فقط خواستم امتحان کنم و عدد اعشاری وارد کردم برنامه اکلیپس یه سوال پرسید و من بدون دقت اوکی رو زدم بعدش محیط اکلیپس کلا به هم ریخته
الان نمیدونم چجوری به حالت اول برگردم، اصلا نمیشه باهاش کار کرد
بخش دیباگ روی صفحه ظاهر شده
لطفا کمکم کنید
hooman
hooman
متوجه اشکال کارم شدم.
واقعا بابت آموزشهاتون ممنونم هر قسمت رو که میخونم کاملا متوجه میشم فوق العاده ساده و روان توضیح داده شده.