گرفتن ورودی از کاربر در جاوا

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

اگر با زبان برنامه نویسی جاوا کمی کار کرده باشید، می‌دانید که پکیج‌های متنوع و متعددی برای انجام کارهای مختلف وجود دارد.

در این آموزش برای گرفتن ورودی از کاربر در جاوا از کتابخانه Scanner در پکیج محبوب java.util استفاده می‌کنیم تا ورودی‌های مختلفی را از کاربران دریافت کنیم. در ابتدا نحوه تعریف و استفاده از آن را یاد گرفته و سپس ترفندهای بیشتری را بررسی می‌کنیم.

دریافت ورودی از کاربر در جاوا با Scanner

می‌دانید که برای استفاده از یک پکیج، ابتدا باید آن را وارد برنامه کنیم. بنابراین در خط اول کلاس خود، پکیج اسکنر را از بسته java.util به برنامه اضافه می‌کنیم.

import java.util.Scanner;

برای آنکه بتوانیم با اسکنر کار کنیم، نیاز است تا یک شئ از این کلاس ایجاد کنیم. سازنده این کلاس یک ورودی از ما می‌گیرد. این ورودی مشخص می‌کند که قرار است چه نوع جریان ورودی را تجزیه و تحلیل (parse) کنیم.

به طور معمول و در اکثر موارد، ۲ ورودی مختلف به این سازنده (constructor) می‌دهیم:

  • یک رشته (یک شئ از نوع String) : در اینصورت عمل parse روی رشته ورودی انجام خواهد شد.
  • مقدار System.in : که مشخص می‌کند قرار است مقادیر مورد نیاز برای پارس کردن را از طریق ورودی سیستم (از کاربر) بگیریم.

من در اینجا مقدار System.in را به عنوان ورودی سازنده شئ اسکنر در نظر گرفته و آن را بررسی می‌کنم. بنابراین تا الآن کدی شبیه به زیر داریم:

import java.util.Scanner;

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

متغیر input به عنوان یک شئ از Scanner تعداد بسیار زیادی تابع کاربردی دارد که می‌توان برای دریافت مقادیر ورودی با فرمت‌های مختلف و یا بررسی وضعیت ورودی‌ها از آن‌ها استفاده کرد. در ادامه چند تا از پرکاربردترین و اصلی‌ترین آن‌ها را بررسی خواهیم کرد. (درباره شئ در برنامه نویسی شی گرا بخوانید)

دریافت ورودی عدد از کاربر در جاوا

فرض کنید می‌خواهیم یک مقدار عددی را از کاربر دریافت کنیم. متدی که برای این کار استفاده می‌کنیم، باید با توجه به نوع عدد ورودی (فرمت عدد) باشد. مثلاً برای گرفتن ورودی از نوع int‌در جاوا، می‌توان از nnextInt() استفاده کرد.

در قطعه کد زیر، یک مقدار عدد صحیح (int) از کاربر گرفته و آن را در متغیر inputNumber قرار داده‌ام. پس از این می‌توانیم مانند سایر متغیرها از آن استفاده کنیم!

import java.util.Scanner;

public class MyInput {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        int inputNumber = input.nextInt();
    }
}

برای دریافت مقادیر عددی در ورودی جاوا متدهای زیر را در اختیار داریم:

  • nextFloat()
  • nextLong()
  • nextDouble()
  • nextBigInteger()
  • nextShort()
آموزش آرایه در جاوا و ترفندهای کار با آرایه

آموزش آرایه در جاوا و ترفندهای کار با آرایه

دریافت ورودی رشته از کاربر

برای گرفتن ورودی رشته‌ای (String) از کاربر دو متد مهم و پرکاربرد روی شئ Scanner وجود دارد.

تابع next برای گرفتن رشته با جداکننده

تابع next() در هر بار فراخوانی، یک رشته ورودی را تا زمانی که به جداکننده (delimiter) برسد از ورودی خوانده و آن را پارس می‌کند.

در مورد جداکننده ورودی در بخش دوم آموزش صحبت می‌کنم؛ فعلاً همین‌قدر بدانید که هر space خالی (white-space) به عنوان جداکننده پیشفرض در نظر گرفته می‌شود.

یعنی اگر جداکننده‌ای برای گرفتن ورودی در جاوا تعیین نکنیم، با گذاشتن space می‌توان چند ورودی در یک خط به برنامه داد.

چون ورودی به صورت رشته دیده می‌شود، می‌بایست خروجی را درون یک متغیر از نوع String بریزیم. فرقی نمی‌کند که در آن از عدد استفاده کنیم یا فقط شامل حروف (کاراکتر) باشد، در هر صورت به صورت یک رشته متنی خوانده شده و تجزیه تحلیل می‌شود.

import java.util.Scanner;

public class MyInput {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        String inputStr = input.next();
        System.out.println( "Your input is: " + inputStr );
    }
}

قطعه کد بالا، یک ورودی رشته‌ای از کاربر دریافت کرده و در متغیر مورد نظر قرار داده و آن را چاپ می‌کند.

به نظرتان اگر عبارت زیر را به عنوان ورودی به برنامه بدهیم چه اتفاقی می‌افتد؟ پیشنهاد می‌کنم ابتدا آن را تست کنید و سپس آموزش را دنبال کنید.

This is from SabzDanesh!

کمی بالاتر گفتم که علامت space به عنوان جداکننده پیشفرض در نظر گرفته می‌شود. بنابراین این عبارت در قطعه کد ما، به معنی ۴ بار ورودی دادن به جاوا است! بنابراین در خروجی صرفاً کلمه اول (This) چاپ می‌شود.

تابع nextLine برای گرفتن یک خط از رشته‌ها

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

مطمئناً می‌دانید که می‌توانم هر پردازش دیگری روی داده‌های ورودی انجام دهیم. 😉

import java.util.Scanner;

public class MyInput {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        for (int i = 0; i < 2; i++) {
            System.out.println( input.nextLine() );
        }
    }
}

حالا می‌توانم دو خط را به عنوان ورودی به جاوا بدهم. هر خط با زدن اینتر (Enter) مشخص می‌شود. در حقیقت جداسازی آن با کاراکتر خط جدید انجام می‌شود.

دریافت مقدار بولین در ورودی

برای دریافت مقدار بولین (true و false) از ورودی در جاوا، از متد nextBoolean() روی شئ اسکنر استفاده می‌کنیم. مقدار برگردانده شده نیز به صورت بولین خواهد بود.

import java.util.Scanner;

public class MyInput {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        boolean var = input.nextBoolean();
    }
}
مدیریت خطا در جاوا

مدیریت خطا در جاوا

جداکننده ورودی در اسکنر

قطعه کد زیر را بررسی کنید. احتمالاً تا الآن برایتان واضح شده باشد که این کد چه کاری انجام می‌دهد.

import java.util.Scanner;

public class MyInput {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            System.out.println(input.nextInt());
        }
    }
}

با اجرای این کد، برنامه منتظر ورودی یک مقدار عددی int‌از ما می‌ماند. می‌توانیم یک مقدار دلخواه را وارد کرده و اینتر را بزنیم. با این کار، مقدار وارد شده در خروجی چاپ می‌شود. سپس برنامه منتظر وارد کرده مقدار جدید خواهد ماند. مشابه همین پروسه برای سومین اجرای حلقه نیز انجام می‌شود.

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

14 18 25
// output:
14
18
25

حال می‌خواهیم جداکننده خود را به مقدار دلخواه (در اینجا d) تغییر دهیم. برای تعریف جداکننده از متد useDelimiter() استفاده می‌کنیم.

این تابع دو نوع ورودی می‌گیرد:

  • یک رشته متنی که الگوی (pattern) مورد نظر ما را مشخص می‌کند.
  • یک شئ از کلاس Pattern که مشخص‌کننده الگوی ما است.

چون بحث پترن‌ها کمی طولانی است، من به یک مثال ساده اکتفا می‌کنم. با یک رشته ساده مشخص می‌کنم که الگوی من از d به عنوان جداکننده استفاده می‌کند.

input.useDelimiter("\\s*d\\s*");

پس از تعریف این الگو، می‌توانیم نوع ورودی خود را با متد مرتبط تعیین کرده و انتظار دریافت ورودی با جداکننده دلخواه از جاوا داشته باشیم.

import java.util.Scanner;

public class MyInput {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        input.useDelimiter("\\s*d\\s*");

        for (int i = 0; i < 3; i++) {
            System.out.println( input.nextInt() );
        }
    }
}

برای کد بالا، علاوه بر ورود هر داده پس از دیگری (با زدن enter)، می‌توان داده‌ها را به صورت زیر نیز به ورودی برنامه داد:

14d18d25d
// output:
14
18
25
خواندن فایل در جاوا

خواندن فایل در جاوا

مرور دریافت ورودی از کاربر

در این آموزش سعی کردم روند کلی و دستورات مهم گرفتن ورودی از کاربر در جاوا را با هم بررسی کنیم. در زبان‌های برنامه‌نویسی مختلف، توابع مختلفی برای این کار داریم اما روند کار با آن‌ها تقریباً شبیه به هم است. برای مثال، اگر با زبان پایتون آشنایی دارید، می‌توانید فیلم آموزش گرفتن ورودی در پایتون را ببینید.

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

متدگرفتن ورودی
nextInt()ورودی عدد
nextFloat()عدد اعشاری
next()ورودی رشته
nextLine()گرفتن یک خط از ورودی
nextBoolean()گرفتن بولین در جاوا

امیدوارم با این آموزش توانسته باشید ورودی دلخواه خود را از کاربر در زبان جاوا بگیرید. اگر متد پرکاربرد دیگری می‌شناسید یا سؤالی دارید، از بخش دیدگاه‌ها مطرح کنید تا به یادگیری یکدیگر کمک کنیم. 🙂