گرفتن ورودی از کاربر در برنامههایی که مینویسیم یک جزء جدایی ناپذیر است. برای اینکه برنامه ما منعطفتر شود، لازم است مقادیر ورودی در فرمتهای مختلف را از کاربر (در کنسول اجرای برنامه) دریافت کنیم. در این آموزش نحوه گرفتن ورودی از کاربر در جاوا را یاد میگیریم.
اگر با زبان برنامه نویسی جاوا کمی کار کرده باشید، میدانید که پکیجهای متنوع و متعددی برای انجام کارهای مختلف وجود دارد.
در این آموزش برای گرفتن ورودی از کاربر در جاوا از کتابخانه 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() | گرفتن بولین در جاوا |
امیدوارم با این آموزش توانسته باشید ورودی دلخواه خود را از کاربر در زبان جاوا بگیرید. اگر متد پرکاربرد دیگری میشناسید یا سؤالی دارید، از بخش دیدگاهها مطرح کنید تا به یادگیری یکدیگر کمک کنیم. 🙂
این آموزش برای همیشه رایگانه! میتونید با اشتراکگذاری لینک این صفحه از ما حمایت کنید یا با خرید یه فنجون نوشیدنی بهمون انرژی بدید!
میخوام یه نوشیدنی مهمونتون کنم
سلام ورودی برای متغیر char نداریم؟
سلام
میتونید ورودی کاربر رو بهصورت رشته (String) دریافت کنید و سپس اولین کاراکتر رو بهصورت char در نظر بگیرید. برای مثال:
سلام.چطوری میشه برای گرفتن ورودی با دستور ()next شرط گذاشت که اگه رشته ای وجود داشته برو اون رشته رو بگیر؟ چون من میخوام بک عبارت ریاضی بگیرم گه اعداد رو با nextInt میگیره و عملامت های جمع و … رو با next ولی به اخرین عدد برسه بازم منتظره تا یه علامت بگیره ولی دیگه علامتی نیست و باید بره روی بقیه کد
سلام
اگه درست متوجه شده باشم، شاید بهتر باشه یه کاراکتر رو به عنوان پایانِ ورودی در نظر بگیرید. مثلا یه رشته خالی (مثل ENTER) یا علامت = رو وقتی وارد کرد، بدونید ورودیها تموم شده و شروع به محاسبه کنید.
من از کاربر میخوام یه ورودی بگیرم نمیدونم کاربر عدد وارد میکنه یا رشته (قراره یا اسمش یا شماره دانشجویی خودش رو وارد کنه تا در ارایه ها سرچ کنم )باید اینجا چکار کنم
سلام
اگر محدودیتی در استفاده از کتابخونهها ندارید، میتونید با
tringUtils.isNumeric()
تست کنید که آیا رشتهی دریافتی تماماً عدد هست یا نه.سلام کد این سوال در جاوا چگونه نوشته میشود
برنامه ای بنویسید که آرایه ی text را از نوع کاراکتر از ورودی بگیرد و آرایه ی asctext را از نوع عدد صحیح بسازد که کد اسکی آرایه اول در آن باشد و آن را نمایش دهد
سلام
میتونید بعد از گرفتن ورودی، به کمک حلقهها یک آرایه جدید ایجاد کنید. اعضای آرایهی کاراکترها رو پیمایش کرده و معادل اسکی رو در اندیسهای متناظر آرایه نهایی قرار بدید.
گوشی من بازیابی نمیشه مشه بپرسم چرا .
ما در حوزه برنامهنویسی فعالیت داریم. اطلاعی در این مورد نداریم.
سلام خسته نباشید.
میشه بپرسم این سوال رو چطور میشه نوشت؟
“برنامه ای بنویسید که ابتدا پیغامی مبنی بر ادامه کار را به کتربر نشان دهد سپس در صورتیکه کاربر n یا N را وارد کرد به کار خاتمه دهد. در غیر این صورت مجدد پیغام ایا می خواهید ادامه دهید؟ را چاپ کند.
سلام
میتونید مقدار ورودی رو با یک ساختار شرطی (if) بررسی کنید.
ممکنه استفاده از یک حلقه بینهایت برای اینکه مداوم منتظر دریافت n باشه هم استفادتون بشه.
سلام
بخش تشریحی
۱- مفاهیم زیر را تشریح کنید و برای آن مثال بیاوری
چندریختی (Polymorphism)
ارث بری (Inheritance)
کپسوله سازی (Encapsulation)
سلام
در آموزش برنامه نویسی شیء گرا درباره این مفاهیم توضیح داده شده.
باید از do while استفاده کنید
با سلام و عرض ادب بسیار ممنونم بابت توضیحات کامل و خوبتون.شخصا استفاده کردم.
سلام
خداروشکر که این آموزش براتون کاربردی و مفید بوده 🙂
مرسی عالی بود
خواهش میکنیم. موفق باشی محسن عزیز.
مرسی نجاتم دادین
ممنون خیلی مفید بود
من میخواهم به طور خصوصی و online زیر نظر یک استاد آموزش ببینم.
آیا شما میتوانید کسی را به من معرفی کنید هزینه هاش رو میپردازم.
خوشحالیم که مقاله براتون مفید بوده
حقیقتاً مجموعه در حال حاضر اقدام به ارائه آموزش خصوصی نمیکنه و برای زبان جاوا هم زیاد با مدرسها در ارتباط نبودم.
پیشنهاد میکنم اگر میتونید از روی منابع خارجی و آنلاین موضوعات اصلی رو فرا بگیرید. سپس با انجام پروژههای کارآموزی یا فریلنسری مهارت خودتون رو افزایش بدید.
در مرحله دوم، داشتن یک منتور شاید بتونه سرعت زیادی به پیشرفتتون بده
موفق باشید