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

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

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

 

خوشبختانه در زبان برنامه نویسی جاوا پکیج های متنوع و متعددی برای انجام کارهای مختلف وجود دارد که این مسئله را میتوان به عنوان یکی از نقاط قوت این زبان دانست.

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

 

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

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

 

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

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

– یک رشته (یک شئ از نوع String) که در اینصورت عمل parse بر روی رشته ورودی انجام خواهد شد.

– مقدار System.in که مشخص میکنیم قرار است مقادیر مورد نیاز برای پارس کردن را از طریق ورودی سیستم که توسط کاربر انجام میشود دریافت کنیم.

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

 

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

دریافت ورودی عددی از کاربر با شئ Scanner

فرض کنید میخواهیم یک مقدار عددی را از کاربر دریافت کنیم. با توجه به اینکه نوع عدد ورودی (فرمت عدد) به چه صورت است، تابعی که صدا زده میشود نیز متفاوت خواهد بود.

مثلاً برای گرفتن ورودی از نوع int میتوان از تابع nextInt و یا برای فرمت عددی float از nextFloat استفاده کرد.

 

با اجرای کد فوق، ۳ بار، عددی از نوع int در ورودی از ما گرفته شده و چاپ میشود.

با توجه به تعریف نوع جداکننده ورودی، به چند نوع میتوانیم ورودی را به برنامه دهیم. در مورد این موضوع در اواسط مقاله که درمورد جداکننده ورودی در اسکنر توضیح داده ایم، بیشتر میخوانیم.

با توجه به فرمت مورد نیاز ورودی توابع دیگری نظیر ()nextBigInteger() ، nextDouble() ، nextLong() و nextShort() نیز مورد استفاده قرار خواهند گرفت.

 

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

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

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

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

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

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

 

کد بالا در هنگام اجرا سه تکه رشته را دریافت کرده و چاپ میکند. (منظور از تکه، قسمت های مشخص شده با استفاده از جداکننده است.)

در صورتی که ورودی زیر را به کد فوق دهیم، نتیجه ای مشابه آنچه در ادامه میبینید خواهیم داشت.

 

در ادامه مقاله به بررسی چگونگی تغییر جداکننده رشته و تغییر نحوه ورودی دادن خواهیم پرداخت.

 

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

تابع دیگری که میتوانیم روی شئ ساخته شده از کلاس اسکنر صدا بزنیم، تابع nextLine() است. این تابع هر خط از ورودی را به عنوان یک رشته در نظر میگیرد.

 

کد بالا سه خط کد (که با زدن اینتر مشخص میشوند) را از ورودی دریافت کرده و چاپ میکند.

 

این جداسازی با استفاده از کاراکتر خط جدید (که با زدن دکمه enter ایجاد میشود) انجام میشود.

 

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

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

 

 

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

فرض کنید که کد زیر را نوشته ایم:

 

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

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

 

دلیل این اتفاق این است که اسکنر به صورت پیشفرض از whitespace ها برای جدا کردن ورودی ها استفاده میکند. مقدار این پیشفرض را میتوان به راحتی تغییر داد.

فرض کنید کد زیر را که برای گرفتن سه تکه رشته از ورودی بود را در اختیار داریم.

 

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

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

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

ما یک رشته ساده که مشخص کننده الگوی استفاده از d به عنوان جداکننده است را به صورت زیر در نظر گرفته ایم.

 

حال با تعریف این الگور، میتوانیم نوع ورودی خود را به صورت تعیین شده وارد کنیم.

 

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

 

 

در به روزرسانی بعدی این مقاله، درمورد کار با رشته به عنوان ورودی اسکنر بحث خواهیم کرد.



[ برچسب ها ] : , , , ,
ارسال شده در : بخش کامپیوتر
نظر شما در مورد اين پست چيست ؟

دیدگاه خود را به ما بگویید.

 
 
  دکتری تخصصی برق الکترونیک
طراح مدارهای الکترونیکی
برنامه نویس انواع میکروها
مشاوره و اجرای لینک های وایرلس
پیاده سازی سیستم های مبتنی بر شبکه
E_mail: electronic@sabzelco.ir
Tel: 09150462401
توسعه دهنده برنامه های سمت سرور

طراحی و برنامه نویسی سایت و پرتال های حرفه ای

E_mail: computer@sabzelco.ir
Tel: 09371974233