آموزش جاوا (فصل ۳)

معرفی کلاس Scanner در زبان برنامه‌نویسی جاوا


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

در حقیقت، کلاس Scanner یک کلاس از پیش تعریف‌شده در زبان برنامه‌نویسی جاوا است که به منظور استفاده از ویژگی‌های آن می‌توانیم کلاس مذکور را در برنامۀ خود اصطلاحاً Import یا «وارد» کرده و آبجکتی از روی آن بسازیم که جهت آشنایی با قابلیت‌های این کلاس، پروژۀ جدیدی تحت عنوان ScannerIntro ایجاد کرده سپس کلاسی به نامProject در آن می‌سازیم که در ابتدا برنامۀ مورد نظر به صورت زیر می‌باشد:

public class Project {
    public static void main(String[] args) {

    }
}

در ادامه، قصد داریم تا امکانی را برای برنامۀ فوق فراهم کنیم تا قابلیت دریافت ورودی را از سمت کاربر داشته باشد و همان‌طور كه پیش‌تر اشاره کردیم، برای استفاده از متدها و سایر ویژگی‌های کلاس از پیش تعریف‌شدۀ Scanner آبجکتی از روی آن می‌سازیم:

public class Project{
    public static void main(String[] args) {
        Scanner myScanner = new Scanner(System.in);
    }
}

همان‌طور که می‌بینید، با به‌کارگیری کیورد new آبجکتی جدید از روی کلاس مذکور ساخته سپس آن را به متغیری تحت عنوان myScanner منتسب می‌نماییم. در ادامه، دستور System.in را به منظور دریافت ورودی از طریق کنسول به آبجکت myScanner پاس می‌دهیم تا بدین طریق ورودی‌های دریافتی از طریق صفحه‌کلید را به راحتی بتوانیم در متدهای تعریف‌شده داخل کلاس اسکنر مورد استفاده قرار دهیم که در اینجا کیورد System به کلاسی از پیش تعریف‌شده در زبان جاوا اشاره دارد که امکان دسترسی برنامه به بخش‌هایی از سیستم را فراهم می‌نماید که خارج از کنترل مستقیم ماشین مجازی جاوا هستند و کیورد in نیز به منظور دسترسی به بخش ورودی آی‌دی‌ای مد نظر اشاره دارد که بدین ترتیب در این مثال با اجرای دستور System.in برنامۀ فوق امکان دسترسی به ورودی سیستم را یافته و از این طریق می‌توان دیتای مورد نظر را وارد کرده و در ادامه پردازش‌های مورد نیاز را روی آن انجام داد.به خاطر داشته باشیدهمان‌طور که در آموزش‌های گذشته توضیح داده شد، برنامۀ مورد نظر همواره باید یک نقطۀ شروع داشته باشد و از همین روی در حین ایجاد کلاس می‌باید گزینۀ public static void main را تیک بزنیم.

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

import java.util.Scanner;
public class Project {
    public static void main(String[] args) {
        Scanner myScanner = new Scanner(System.in);
    }
}

همچنین به جای ایمپورت کردن کلاس‌ فوق توسط آی‌دی‌ای اکلیپس، می‌توانیم دستورات مربوط به ایمپورت را در کد فوق به صورت دستی وارد نماییم. به علاوه، پس از ساخت آبجکت از روی کلاس از پیش تعریف‌شدۀ مورد نظر می‌توانیم با فشردن هم‌زمان کلیدهای Crtrl + Shift + O، کلاس مربوطه را در سورس‌کد خود ایمپورت نماییم.

همان‌طور که در کد فوق مشاهده می‌شود، دستور ;import java.util.Scanner به ابتدای سورس‌کد پروژه اضافه شده است که از این پس بدون هیچ مشکلی می‌توانیم از کلاس Scanner استفاده کنیم. در ادامه، به منظور تست عملکرد برنامۀ خود قصد داریم تا دیتای دریافت‌شده از سمت کاربر را عیناً در خروجی چاپ کنیم که برای این منظور کد فوق را به صورت زیر تکمیل می‌نماییم:

import java.util.Scanner;
public class Project {
    public static void main(String[] args) {
        Scanner myScanner = new Scanner(System.in);
        String userInput = myScanner.nextLine();
        System.out.println(userInput);
        myScanner.close();
    }
}

در کد فوق، متد ()nextLine متعلق به کلاس Scanner بوده و از همین روی آن را روی آبجکت ساخته‌شده از کلاس مذکور فراخوانی نموده‌ایم که این وظیفه را دارا است تا دیتای ورودی از سمت کاربر را نگهداری و در خروجی ریترن کند که در سطر پنجم دیتای ریترن‌شده به آبجکتی از کلاس String تحت عنوان userInput منتسب کرده‌ایم و بدین ترتیب پردازش‌های مورد نیاز را می‌توان روی دیتای مد نظر انجام داد (توجه داشته باشیم که برای تعریف آبجکتی از کلاسString از کیورد new استفاده نکرده‌ایم چرا که در این مثال آبجکتی جدید از روی کلاس مذکور ایجاد نمی‌کنیم بلکه صرفاً یک اشاره‌گر به استرینگ مورد نظر تعریف می‌نماییم بدین معنی که در هر بار اجرای برنامه آبجکتی جدید از روی کلاس String ساخته نمی‌شود بلکه آبجکت ساخته‌شده همواره به مقدار ثابتی همچون استرینگ مربوطه در این مثال ارجاع می‌دهد.)

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

اکنون در ادامه قصد داریم تا دیتای مورد نظر را از طریق متد ()println در کنسول چاپ کنیم که از همین روی دیتای اختصاص‌يافته به آبجكت userInput را به عنوان آرگومان ورودی به متد ()println می‌دهیم تا آن را در کنسول نمایش دهد. حال برنامۀ فوق را اجرا می‌کنیم به طوری که در خروجی خواهیم داشت:

My name is Behzad Moradi
My name is Behzad Moradi

با اجرای کد فوق می‌توانیم دیتایی را در بخش كنسول آی‌دی‌ای مد نظر و در قالب یک مقدار استرینگ وارد نماییم که در این مثال جمله‌ای دلخواه مانند «My name is Behzad Moradi» را وارد کرده سپس اینتر می‌کنیم و در ادامه می‌بینیم که استرینگ ورودی از طریق صفحه‌کلید عیناً در کنسول نمایش داده می‌شود.

نحوۀ تعریف نوع ورودی کلاس Scanner در زبان برنامه‌نویسی جاوا


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

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

برای این منظور، پروژه‌ای تحت عنوان ScannerInput ایجاد کرده و کلاسی به نام ScannerClass داخل آن می‌سازیم به طوری که در ابتدا کدی مانند زیر خواهیم داشت:

public class ScannerClass {
    public static void main(String[] args) {

    }
}

اکنون همان‌طور که در آموزش گذشته بیان کردیم، جهت استفاده از متدهای مختلف کلاس Scanner می‌باید ابتدا یک آبجکت از روی آن بسازیم که برای این منظور کد فوق را به صورت زیر تکمیل می‌نماییم:

import java.util.Scanner;
public class ScannerClass {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
    }
}

همان‌طور که می‌بینیم، با استفاده از کیورد new آبجکتی جدید از روی کلاس Scanner تحت عنوان keyboardInputساخته و در ادامه دستور System.in را جهت دریافت ورودی از صفحه‌کلید به آبجکت مذکور پاس می‌دهیم تا بتوانیم بعداً دیتای دریافتی از سمت کاربر را در متدهای تعریف‌شده داخل کلاس اسکنر مورد استفاده قرار دهیم.

در همین راستا، در ادامۀ آموزش برخی متدهای از پیش تعریف‌شدهٔ متعلق به کلاس Scanner را معرفی کرده و با نحوۀ پیاده‌سازی هر یک در قالب مثال‌هایی کاربردی آشنا خواهیم شد.

متد ()nextLine

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

import java.util.Scanner;
public class ScannerClass {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.print("Please enter your input: ");
        System.out.println(keyboardInput.nextLine());
        keyboardInput.close();
    }
}

در کد فوق، ابتدا آبجکتی تحت عنوان keyboardInput از روی کلاس Scanner ساخته و در ادامه با استفاده از دستورSystem.in امکان دریافت ورودی از کنسول را برای برنامۀ خود فراهم کرده‌ایم. در سطر بعد، استرینگ «:Please enter your input» را در معرض دید کاربر قرار داده‌ایم تا بداند که برنامه چه کاری را از وی انتظار دارد. در ادامه، متد()nextLine را روی آبجکت keyboardInput فراخوانی کرده و دیتای ریترن‌شده در نتیجۀ این فراخوانی را به متد()println می‌دهیم تا بدین ترتیب دیتای ورودی از کاربر عیناً در کنسول چاپ شود. در نهایت، با اجرای کد فوق خواهیم داشت:

Please enter your input: This is a sentence 123 % &* @ ...
This is a sentence 123 % &* @ ...

همان‌طور که مشاهده می‌کنیم، با استفاده از متد ()nextLine می‌توانیم ترکیبی از حروف، کلمات، اعداد و حتی علائم را به عنوان دیتای ورودی به برنامه بدهیم و از همین روی استفاده از متد مذکور در صورتی مناسب می‌باشد که مثلاً از کاربر بخواهیم تا رمز عبوری برای خود تعریف نماید و بدین طریق رمز عبور وی را به عنوان دیتای دریافتی در اپلیکیشن ذخیره می‌نماییم.

متد ()next

متد ()next نیز مشابه متد پیشین عمل کرده و هر نوع دیتای ورودی از صفحه‌کلید را دریافت می‌کند با این تفاوت که دریافت دیتای ورودی را تا زمانی ادامه می‌دهد که به یک اِسپیس در استرینگ مورد نظر برسد بدین معنی که سایر داده‌های ورودی از اولین علامت اِسپیس به بعد را نادیده می‌گیرد که برای آشنایی بیشتر با نحوۀ کار این متد، کد مربوط به مثال قبل را به صورت زیر تغییر می‌دهیم:

import java.util.Scanner;
public class ScannerClass {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.print("Please enter your input: ");
        System.out.println(keyboardInput.next());
        keyboardInput.close();
    }
}

حال مجدد برنامه را اجرا کرده و در ادامه تعدادی کاراکتر و عدد پشت سر هم نوشته و یک اسپیس مابین آن‌ها قرار می‌دهیم سپس تعدادی کاراکتر و عدد دیگر می‌نویسیم و در نهایت دکمۀ اینتر را می‌زنیم که در خروجی خواهیم داشت:

Please enter your input: ABC123 EFG456
ABC123

در واقع، پس از اجرای برنامۀ فوق، در کنسول استرینگ «ABC123» را وارد کرده سپس یک فاصله قرار داده‌ایم و در ادامه استرینگی به صورت «EFG456» تایپ کرده و در نهایت دکمۀ اینتر را می‌زنیم و همان‌طور که می‌بینیم، متد ()next تنها استرینگ‌های قبل از اولین علامت اِسپیس را از ورودی می‌خواند و در ادامه دیتای مربوطه به متد ()println پاس داده شده و در خروجی چاپ می‌گردد. اکنون اگر بخواهیم تا برنامۀ فوق قابلیت دریافت دیتای ورودی را پس از علامت اسپیس نیز داشته باشد، یک مرتبۀ دیگر متد ()next را به صورت زیر روی آبجکت ساخته‌شده فراخوانی می‌نماییم:

import java.util.Scanner;
public class ScannerClass {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.print("Please enter your input: ");
        System.out.println(keyboardInput.next());
        System.out.println(keyboardInput.next());
        keyboardInput.close();
    }
}

در واقع، اجرای کد فوق و فراخوانی متد ()next در سطر ششم روی آبجکت ساخته‌شده از روی کلاس Scanner منجر بدین می‌شود تا دیتای ورودیِ مربوط به پیش از اولین اسپیس توسط متد ()println در کنسول چاپ شده و در ادامه با فراخوانی مجدد این متد ()next در سطر هفتم سایر داده‌های ورودیِ کاربر مابین اولین اِسپیس تا قبل از اِسپیس بعدی ذخیره شده و توسط متد ()println در کنسول نمایش داده می‌شوند که به عنوان یک مثال از اجرای برنامۀ فوق خواهیم داشت:

Please enter your input: SokanAcademy 123456 sokanacademy
SokanAcademy
123456

همان‌طور که مشاهده می‌کنیم، تعدادی کاراکتر و عدد وارد کرده سپس یک فاصله قرار داده‌ و در ادامه تعدادی کاراکتر دیگر وارد کرده‌‌ایم که بدین ترتیب با فراخوانی متد ()next استرینگ «SokanAcademy» تا قبل از اولین اِسپیس خوانده شده و با فراخوانی مجدد متد مذکور استرینگ «123456» مابین اولین اِسپیس تا پیش از اِسپیس بعدی نگهداری شده و در ادامه توسط متد ()println در کنسول چاپ می‌شوند. به علاوه، لازم به یادآوری است که به همین منوال می‌توان با فراخوانی متد ()next به تعداد دفعات مورد نیاز استرینگ‌های مد نظر را از ورودی خوانده و پردازش‌های مربوطه را روی دیتای ورودی انجام داد.

متد ()nextInt

متد ()nextInt از جمله دیگر متدهای پیش‌فرض در کلاس Scanner است که عملکردی مشابه متد ()next دارا است با این تفاوت که با به‌کارگیری متد ()nextInt صرفاً می‌توان یکسری عدد صحیح را از طریق کیبورد خوانده و در ادامه پردازش‌های مد نظر را روی آن‌ها اِعمال کرد. برای مثال، در کد زیر متد ()nextInt را فراخوانی کرده و نحوۀ عملکرد آن را مورد بررسی قرار می‌دهیم:

import java.util.Scanner;
public class ScannerClass {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.print("Please enter your input: ");
        System.out.println(keyboardInput.nextInt());
        keyboardInput.close();
    }
}

در کد فوق، مشابه مثال‌های پیشین، آبجکتی تحت عنوان keyboardInput از روی کلاس Scanner ساخته و در ادامه متد ()nextInt را روی آبجکت مذکور فراخوانی کرده‌ایم که نتیجۀ حاصل از این فراخوانی توسط متد ()println در کنسول نمایش داده می‌شود به طوری که در خروجی داریم: 

Please enter your input: 1000 2222 524836
1000

همان‌طور که پیش‌تر اشاره کردیم، متد ()nextInt مشابه ()next عمل کرده و تمامی دیتای ورودی از نوع عدد صحیح را تا پیش از اولین اِسپیس ذخیره می‌نماید که در ادامه دیتای مذکور توسط متد ()println در کنسول چاپ می‌گردد. نکتۀ قابل‌توجه در ارتباط با متد ()nextInt این است که متد مذکور صرفاً دیتای ورودی از نوع عدد صحیح را خوانده و وارد برنامه می‌کند. برای مثال، چنانچه داده‌ای از نوع عدد اعشاری را به عنوان ورودی به برنامه بدهیم خواهیم داشت:

Please enter your input: 12.5 2222 4569
Exception in thread "main" java.util.InputMismatchException
	at java.base/java.util.Scanner.throwFor(Scanner.java:939)
	at java.base/java.util.Scanner.next(Scanner.java:1594)
	at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
	at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
	at ScannerClass.main(ScannerClass.java:6)

در واقع، فراخوانی متد ()nextInt به منظور ذخیره و نگهداری دیتایی همچون عدد 12/5 منجر به بروز خطا در روند اجرای برنامه شده است و ارور فوق حاکی از آن است که دادۀ ورودی با متد به کار گرفته شده هم‌خوانی ندارد.

متد ()nextDouble

متد ()nextDouble عملکردی مشابه متد ()nextInt دارا است با این تفاوت که به منظور ذخیرۀ نوع دادۀ عدد اعشاری از طریق کیبورد مورد استفاده قرار می‌گیرد که به عنوان مثال در کد زیر نحوۀ به‌کارگیری این متد را مورد بررسی قرار می‌دهیم:

import java.util.Scanner;
public class ScannerClass {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.print("Please enter your input: ");
        System.out.println(keyboardInput.nextDouble());
        keyboardInput.close();
    }
}

در کد فوق نیز، همچون مثال‌های پیشین، ابتدا آبجکتی تحت عنوان keyboardInput از روی کلاس Scanner ساخته و در ادامه آبجکت مذکور را روی متد ()nextDouble فراخوانی می‌نماییم که دیتای ریترن‌شده در نتیجۀ این فراخوانی با استفاده از متد ()println در کنسول نمایش داده می‌شود. بنابراین با اجرای برنامۀ فوق، در خروجی خواهیم داشت:

Please enter your input: 12.5 333 12566
12.5

همان‌طور که می‌بینیم، متد ()nextDouble دیتای ورودی مربوط به اعداد پیش از اولین اِسپیس را ذخیره کرده و دیتای مذکور با استفاده از متد ()println در کنسول چاپ شده است. نکتۀ قابل‌توجه در رابطه با متد ()nextDouble این است که بر خلاف متد ()nextInt قابلیت دریافت و ذخیرۀ اعداد صحیح را دارا است بدین معنی که نوع دادۀ عدد صحیح را در قالب یک عدد اعشاری ذخیره می‌کند. برای مثال، با اجرای مجدد کد فوق، عددی صحیح همچون 100 را در کنار سایر اعداد اعشاری به برنامه می‌دهیم:

Please enter your input: 100 25.5 69.3
100.0

در واقع، متد ()nextDouble عدد صحیح 100 را تا پیش از اولین اِسپیس دریافت کرده و در قالب یک عدد اعشاری ذخیره می‌کند که در ادامه این عدد توسط متد ()println در کنسول چاپ می‌گردد.

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

پروژۀ محاسبۀ درآمد ماهیانه با استفاده از متدهای کلاس Scanner در زبان جاوا


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

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

import java.util.Scanner;
public class Project {
    public static void main(String[] args) {
        System.out.println("My Financial Turnover");
        Scanner myScanner = new Scanner(System.in);
    }
}

به محض اجرای این برنامه، پس از رسیدن به سطر چهارم استرینگ «My Financial Turnover» در کنسول چاپ می‌گردد که در اینجا کیورد System به منظور دسترسی به بخش‌هایی از سیستم مورد استفاده قرار می‌گیرد که ماشین مجازی جاوا امکان دسترسی به آن‌ها را ندارد و کیورد out نیز به بخش خروجی در محیط برنامه‌نویسی مورد نظر (در اینجا بخش کنسولِ نرم‌افزار اکلیپس) دسترسی داشته و استرینگ مد نظر را در آن چاپ می‌کند. در ادامه، آبجکتی تحت عنوان myScanner از روی کلاس Scanner تعریف کرده و با استفاده از دستور System.in امکان دریافت ورودی از سمت کاربر را برای برنامۀ خود فراهم می‌کنیم که در این مورد نیز کیورد in نیز به منظور دسترسی به بخش مربوط به دریافت ورودی از محیط برنامه‌نویسی مد نظر (کیبورد) به کار گرفته می‌شود.

حال به منظور ذخیره و نگهداری دیتای مربوط به میزان درآمد و هزینه‌های جاری کاربر، نیاز به تعریف متغیری داریم که دیتایی از جنس عدد اعشاری یا صحیح را در آن ذخیره نماییم. (در آموزش آشنایی با روش‌های نام‌گذاری متغیرها در زبان برنامه‌نویسی جاوا با دیتا تایپ‌های مختلف به منظور تعریف متغیرها آشنا شدیم.) در واقع، دیتا تایپ int به منظور تعریف مقداری معادل 2/340/000 تومان قابل‌استفاده می‌باشد که در این آموزش به منظور سادگی در انجام محاسبات، نوع دادۀ عدد صحیح را جهت نگهداری درآمد، هزینه‌ها و سایر مخارج مورد استفاده قرار داده‌ایم و به منظور جلوگیری از طولانی شدن سورس‌کد، کلیۀ متغیرها را با یکدیگر ادغام نموده و آن‌ها را به صورت زیر تعریف می‌کنیم:

int monthlyIncome, loanPayment, currentExpenses;

در واقع، متغیر monthlyIncome به منظور نگهداری مقدار درآمد ماهیانه، متغیر loanPayment به منظور ذخیرۀ مقدار اقسام پرداختیِ وام و متغیر currentExpenses نیز جهت نگهداری مقدار هزینه‌های جاری تعریف شده‌اند.

در ادامه، دستوری دیگر به منظور چاپ استرینگ «:Please enter your monthly income» به کد فوق اضافه می‌کنیم تا کاربر عدد مربوط به مقدار درآمد ماهیانۀ خود را وارد نماید. بنابراین کد فوق را به صورت زیر تکمیل می‌نماییم:

import java.util.Scanner;
public class Project {
    public static void main(String[] args) {
        // The title of the program
        System.out.println("My Financial Turnover");
        // Object from Scanner Class
        Scanner myScanner = new Scanner(System.in);
        // Variables
        int monthlyIncome, loanPayment, currentExpenses;
        // Code to ask for entering your income
        System.out.println("Please enter your monthly income:");
        myScanner.close();
    }
}

همان‌طور که اشاره کردیم، استرینگ «:Please enter your monthly income» چاپ شده و از کاربر می‌خواهیم تا مقدار مربوط به درآمد ماهیانۀ خود را وارد کند. حال در ادامه می‌توانیم با فراخوانی متد ()nextInt مقدار دریافتی را خوانده و آن را به یک متغیر منتسب کنیم که برای این منظور دستوری را به صورت زیر به برنامۀ خود اضافه می‌کنیم:

import java.util.Scanner;
public class Project {
    public static void main(String[] args) {
        // The title of the program
        System.out.println("My Financial Turnover");
        // Object from Scanner Class
        Scanner myScanner = new Scanner(System.in);
        // Variables
        int monthlyIncome, loanPayment, currentExpenses;
        // Code to ask for entering your income
        System.out.println("Please enter your monthly income:");
        monthlyIncome = myScanner.nextInt();
        myScanner.close();
    }
}

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

همچنین توجه داشته باشیم که متد ()nextInt را جهت محدود کردن کاربر به وارد کردن دیتایی از نوع عدد صحیح مورد استفاده قرار داده‌ایم چرا که پیش از این نوع دادۀ int را برای تعریف متغیر monthlyIncome به کار گرفته‌ایم که در صورت استفاده از دیتا تایپ double برای تعریف متغیر، متد ()nextDouble به منظور خواندن دیتای ورودی مناسب می‌بود. به همین ترتیب، به ازای هر یک از متغیرهای loadPayment و currentExpenses نیز متد()nextInt جهت دریافت به ترتیب مقادیر مربوط به میزان اقساط پرداختی و هزینه‌های جاری به صورت زیر روی آبجکت ساخته‌شده فراخوانی می‌شوند:

import java.util.Scanner;
public class Project {
    public static void main(String[] args) {
        // The title of the program
        System.out.println("My Financial Turnover");
        // Object from Scanner Class
        Scanner myScanner = new Scanner(System.in);
        // Variables
        int monthlyIncome, loanPayment, currentExpenses;
        // Code to ask for entering your income
        System.out.println("Please enter your monthly income:");
        monthlyIncome = myScanner.nextInt();
        // Code to ask for entering your loan payment
        System.out.println("Please enter your loan payment:");
        loanPayment = myScanner.nextInt();
        // Code to ask for entering your current expense
        System.out.println("Please enter your current expenses:");
        currentExpenses = myScanner.nextInt();
        myScanner.close();
    }
}

در این مرحله، کد فوق را اجرا می‌کنیم به طوری که در خروجی خواهیم داشت:

My Financial Turnover
Please enter your monthly income:

همان‌طور که می‌بینیم، برنامۀ ما پس از چاپ استرینگ‌های فوق منتظر دریافت ورودی می‌ماند و بدین ترتیب کاربر در ابتدا عدد مربوط به میزان درآمد ماهیانهٔ خود را وارد نموده و به محض دریافت مقداری از جنس عدد صحیح، مرحلۀ بعدی اجرا شده و استرینگ مربوط به وارد کردن میزان اقساط پرداختیِ وام چاپ می‌گردد؛ سپس برنامه مجدداً منتظر دریافت ورودی از کاربر می‌ماند و در نهایت هم استرینگ «:Please enter your current expenses» چاپ شده و از کاربر درخواست می‌شود تا مقدار هزینه‌های جاری خود را وارد کند. بنابراین با توجه به آنچه که در بالا بدان اشاره کردیم، در خروجی خواهیم داشت:

My Financial Turnover
Please enter your monthly income:
1000000
Please enter your loan payment:
120000
Please enter your current expenses:
400000

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

import java.util.Scanner;
public class Project {
    public static void main(String[] args) {
        // The title of the program
        System.out.println("My Financial Turnover");
        // Object from Scanner Class
        Scanner myScanner = new Scanner(System.in);
        // Variables
        int monthlyIncome, loanPayment, currentExpenses;
        // Code to ask for entering your income
        System.out.println("Please enter your monthly income:");
        monthlyIncome = myScanner.nextInt();
        // Code to ask for entering your loan payment
        System.out.println("Please enter your loan payment:");
        loanPayment = myScanner.nextInt();
        // Code to ask for entering your current expense
        System.out.println("Please enter your current expenses:");
        currentExpenses = myScanner.nextInt();
        // Calculating the remainder
        int result = monthlyIncome - (loanPayment + currentExpenses);
        System.out.println("The left over money equals to: " + result);
        myScanner.close();
    }
}

در حقیقت، با استفاده از دیتا تایپ int متغیری تحت عنوان result تعریف کرده و در ادامه مقدار حاصل از جمع مقادیر منتسب به هر یک از متغیرهای loanPayment و currentExpenses را از مقدار اختصاص‌یافته به متغیرmonthlyIncome کم کرده و در نهایت نتیجۀ حاصل را به متغیر result منتسب نموده‌ایم (با توجه به آنچه در آموزشآشنایی با نحوۀ به‌کارگیری اپراتورها در زبان برنامه‌نویسی جاوا بدان اشاره کردیم، محاسبات ریاضیاتی داخل پرانتز در ابتدا اجرا شده و مقادیر منتسب به دو متغیر مربوطه با یکدیگر جمع می‌شوند و در ادامه مقدار حاصل از درآمد ماهیانه کسر می‌شود.) در نهایت، با اجرای سطر آخر استرینگ «:The left over money equals to» با مقدار منتسب به متغیرresult به اصطلاح Concate (الحاق) شده و مقدار نهایی در قالب یک استرینگ در کنسول چاپ می‌شود به طوری که در خروجی خواهیم داشت:

My Financial Turnover
Please enter your monthly income:
1000000
Please enter your loan payment:
120000
Please enter your current expenses:
400000
The left over money equals to: 480000

به طور خلاصه می‌توان گفت که به عنوان درآمد ماهیانه، اقساط پرداختی وام و هزینه‌های جاری به ترتیب مقادیری فرضی معادل با 1/000/000، 120/000 و 400/000 تومان وارده کرده‌ايم كه جمع مخارج معادل عدد 520/000 تومان از درآمد ماهيانه كسر شده و مقدار خالص 480/000 تومان به عنوان الباقی درآمد ماهیانه در کنسول نمایش داده می‌شود.

در این آموزش توانستیم یک پروژۀ حسابداری کوچک طراحی کنیم که با کمی ذوق و خلاقیت بیشتر می‌توان برنامه‌های متعددی همچون برنامۀ محاسبۀ تناسب قد و وزن (BMI)، تبدیل سرعت ماشین بر اساس واحد مایل به واحد کیلومتر و بسیاری برنامه‌های کاربردی دیگر نیز توسعه دهیم. دانلود فایل‌های تمرین

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


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

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

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

مطالب مرتبط

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *