آموزش برنامه نویسی جاوا قسمت دوازدهم
همانطور که در جلسات قبلی گفته شد، برنامههای کامپیوتری بر مبنای دادهها طراحی شدهاند. یعنی کاربران دادههایی را به روشهای مختلفی وارد برنامههای کامپیوتری میکنند و برنامهها پردازشهایی را روی آنها انجام میدهند و سپس خروجی را ارائه میدهند. در این جلسه از آموزش میخواهیم یاد بگیریم که چگونه دادههایی را وارد برنامه کنیم. البته ما قصد وارد کردن داده از یک منبع خارجی مثل فایل، یک جایی درون شبکه و … را نداریم. صرفا قصد داریم دادههایی را از طریق ورودی استاندارد وارد برنامه کنیم.
دادههای یک برنامه ممکن است از طریق موس، صفحه کلید، فایل، حافظهی کامپیوتر و حتی شبکه وارد برنامه شوند. در بین تمام این ورودیها صفحه کلید به عنوان ورودی استاندارد شناخته میشود. برای خواندن از صفحه کلید باید از جملهی:
;()System.in.read استفاده شود. وقتی که از این کد برای دریافت ورودی استفاده میکنیم و کاربر روی یک کلید از کیبورد فشار میدهد تا یک دادهای را وارد برنامه کند (به عنوان مثال دکمهی a)، متد ()read کد اسکی (ASCII) کارکتر a را بر میگرداند. (در مورد کدهای اسکی تحقیق کنید و با فلسفهی بوجود آمدن آنها آشنا شوید). اما برای درک بهتر با یک مثال کار خود را ادامه میدهیم. در مثال زیر میخواهیم کدهای اسکی کارکترهای a و A را بدست بیاوریم.
همانطور که در کد بالا مشاهده میکنید ما ابتدا در خطهای پنج و شش دو متغیر از نوع کارکتر تعریف کردهایم. که به ترتیب مقادیر a و A را به آنها نسبت دادهایم. حالا برای اینکه بخواهیم کدهای اسکی آنها را مشاهده کنید در خطوط ۸ و ۹ دو متغیر از نوع عدد صحیح تعریف کردهایم و متغیرهای کارکتری را به آنها نسبت دادهایم. با این کار ما اگر متغیرهای عدد صحیح را در خروجی استاندارد چاپ کنیم، بجای نمایش حروف a و A، یک سری عدد صحیح نمایش داده میشود که آنها کد اسکی حروف تعریف شده هستند. نتیجهی اجرای برنامهی فوق به صورت زیر است:
a: 97 A: 65
اعداد صحیح ۹۷ و ۶۵ کدهای اسکی حروف فوق هستند. همانطور هم که مشاهده میکنید کدهای اسکی حروف کوچک با حروف بزرگ متفاوت است. به همین دلیل است که هیچ وقت a کوچک مساوی با A بزرگ نیست. (به عنوان تمرین برنامه را طوری تغییر دهید که با چاپ کدهای اسکی، حروف آنها نمایش داده شود).
مثال فوق صرفا برای آشنایی شما با کدهای اسکی است و اینکه ما با فشار دادن یک کلید از کیبورد، در واقع عددی را وارد برنامه میکنیم. برای همین منظور وقتی ما از جملهی ;()System.in.read برای دریافت ورودی استفاده میکنیم، و بخواهیم ورودی را که دریافت کردهایم را به کاربر نمایش دهیم، حتما باید ورودی را به دادهی کارکتری اصطلاحا Cast کنیم. کست کردن کاربردهای بسیار زیادی دارد. به کد زیر توجه کنید:
char ch = (char)System.in.read();
همانطور که مشاهده میکنید ما دادهای را که از طریق ورودی دریافت میکنیم را به دادهی کارکتری کست کردهایم. یعنی دادهی پایهی char را داخل یک جفت پرانتز باز و بسته قرار دادهایم. با این کار دادهی ما هرچیزی که باشد به کارکتر تبدیل میشود و بعد در متغیر ch ذخیره میشود. (میتوانیم به دادههای دیگر هم کست کنیم. مثلا به String, double و … ).
همانطور که خودتان متوجه این قضیه شدهاید جملهی ;()System.in.read فقط یک کارکتر را میخواند! اما ما میخواهیم برنامهای را بنویسیم که به عنوان مثال یک جملهای را از کاربر دریافت کند (یعنی مجموعهای از کارکترها). بنابراین ما باید برای دریافت یک جملهی کامل از کاربر، از یک حلقه استفاده کنیم. یعنی تا زمانی که کاربر در حال تایپ است و دکمهی Enter را نزده است، برنامه متوقف نشود و به دریافت ورودی از کاربر ادامه دهد. برای این کار ما از یک حلقهی while استفاده میکنیم. علت هم این است که ما (برنامه نویس) نمیدانیم که تا چه زمانی قرار است این حلقه ادامه پیدا کند. به عبارت دیگر نمیدانیم که چه زمانی کاربر میخواهد دکمهی Enter را فشار دهد.
در زبان جاوا یک سری کارکترهایی هستند که به آنها کارکترهای کنترلی میگویند. یعنی آن کارکترها نمایش داده نمیشوند اما یک سری تغیراتی را ایجاد میکنند. کارکترهای کنترلی با استفاده از بک اسلش (Back Slash) مشخص میشوند و بعد در جلوی آنها از یک سری حروف استفاده میشود که هر کدام نشانگر کار خاصی است. مثلا n\ در هر جایی که ظاهر شود، از ادامهی آن را در خط بعدی نمایش میدهد. یا t\ یک تب (Tab) کارکتر را به جلو میبرد. (ما با کارکترهای کنترلی در ادامهی آموزشها آشنا میشویم). r\ یکی از کارکترهای کنترلی است که به عبارتی کد اسکی دکمهی Enter است. در برنامهی زیر ما از این کارکتر کنترلی استفاده میکنیم. به کد زیر دقت کنید:
در خطهای ۵ و ۶ ابتدا یک متغیر از نوع String و یک متغیر از نوع کارکتر تعریف کردهایم که مقادیری ندارند. قلب برنامهی ما در حلقهی while است. ابتدا به بدنهی حلقه توجه کنید. در خط ۱۰ همانطور که قبلتر هم گفته شد ما یک کارکتر دریافت میکنیم و آن را کست میکنیم. در خط بعدی هم مقدار دادهای را که در خط قبل دریافت کردهایم به String تبدیل میکنیم. البته برای کوتاهتر شدن کد هم میتوانیم در تبدیل به String کد را به صورت زیر بنویسیم:
str += ch;
تکه کد فوق دقیقا معادل با کدی است که ما در خط ۱۱ نوشتهایم. در حلقهی while ابتدا شرط آن بررسی میشود و اگر شرط آن برقرار بود ادامهی اجرای برنامه به داخل حلقه میرود. در غیر اینصورت برنامه از حلقه خارج میشود. علامت =! به معنی نابرابری است. یعنی تا زمانی که مقدار ch برابر با کارکتر کنترلی r\ (یا همان دکمهی Enter) نبود یا به عبارتی دیگر نابرابر کداسکی دکمهی Enter بود، حلقهی ما ادامه دارد. به محض اینکه کاربر دکمهی اینتر را فشار دهد مقدار ch برابر با کد اسکی اینتر میشود و برنامه از حلقه خارج میشود. در خط ۱۴ هم مقدار String را نمایش دادهایم. خروجی برنامه:
همانطور که مشاهده میکنید عبارتی که با رنگ سبز نوشته شده است، مقداری است که من (کاربر) نوشتهام و خط بعدی که با رنگ سیاه است برنامه نوشته است، یعنی برنامه ورودی را که من ارسال کردم را دریافت کرده و آن را نمایش داده است.
در کد فوق نکتهای است که باید به آن توجه کنید، این است که در مقابل متد main جملهی throws Exception نوشته شده است. این عبارت مربوط به ;()System.in.read است. اجرای ;()System.in.read و برخی دیگر از متدهای جاوا ممکن است با خطا مواجه شود. در چنین مواردی برنامه باید تصمیم بگیرد که با خطای احتمالی چگونه باید برخورد شود. عبارت throws Exception سادهترین نوع برخورد با خطای احتمالی است که در آن هیچ تمهیدی برای رخداد خطا در نظر نمیگیرد. اگر برای این خطاها راه حلی در نظر نگیریم، ممکن است برنامه در هنگام اجرا اصطلاحا کرش (Crash) کند. (هندل کردن استثناها (Exceptions Handling) یکی از مباحث مهم در برنامه نویسی است که در یکی از فصلهای این دورهی آموزشی در مورد آن صحبت میکنیم).
در جلسهی آینده ما با دو نوع دیگر از نحوهی ورودی گرفتن در جاوا آشنا میشویم. یکی کلاس اسکنر و دیگری دریافت ورودی از طریق واسط کاربری است.
به عنوان تمرین این جلسه، برنامهای بنویسید که کد اسکی حروف a تا z (هم حروف کوچک و هم حروف بزرگ) را نمایش دهد.
منبع: www.zoomit.ir