জাভা প্রোগ্রামিং # ৫ – ভেরিয়েবল, বেসিক Input, Output

JDK, JRE ইন্সটল করা তো শেষ । হ্যালো জাভা কোড লেখাও শেষ। এইসব জিনিস কেন ইন্সটল করা লাগে তাও বলা শেষ । এইবার আসল বকবক শুরু হবে । এবং প্রথম বকবক টাই শুরু হবে ভেরিয়েবল দিয়ে । এই পোস্টে আমরা ঘাটাঘাটি করে দেখবো যে জাভা আমাদের কী কী ভেরিয়েবল টাইপ ইউস করতে দিবে এবং কীভাবে সেগুলো ইউস করতে হবে। সাথে কীভাবে ইনপুট নিতে হয় , আউটপুট দিতে হয় সেটাও দেখবো ।

জাভাতে কোন ধরণের ভেরিয়েবল আছে?

ভেরিয়েবল কি জিনিস সেটা নতুন করে বলার প্রয়োজন আছে কি? তাও একটা মেমরি রিফ্রেশার, ভেরিয়েবল একটা স্টোরেজ, যেখানে কাজের জন্য ডেটা রাখা যায় ।

বলে রাখা ভালো যে জাভার ব্যাকেন্ড C/C++ বেজড । ইন ফ্যাক্ট অনেক ল্যাঙ্গুয়েজের ব্যাকেন্ড ই C/C++ বেজড । C++ আবার C বেজড । তাইলে বলা যায় এই ল্যাঙ্গুয়েজ গুলো সবই C বেজড । তো C বেজড হওয়ার কারণে C এর বেসিক ডেটা টাইপের উপর নিজের অতিরিক্ত এবং অ্যাডভান্সড ডেটা টাইপ নিয়ে এই ল্যাঙ্গুয়েজ গুলো এসেছে ।

C এর যেসব ডেটা টাইপ জাভাতে এসেছে

  • int
  • float
  • double
  • long
  • char

জাভার নিজের টাইপ

  • String
  • boolean
  • এবং আরো কতগুলো টাইপ আছে যেগুলো C এর টাইপগুলো মডিফাই করে বানানো কিন্তু অবজেক্ট ওরিয়েন্টেড এর কনসেপ্ট ধরার আগে সেগুলোর উপর ডিসকাশন অফ রাখি ।

জাভাতে আলাদা কি ?

  • জাভাতে ক্যারেক্টার টাইপ ইউনিকোড সাপোর্ট করে । জেডিকে ৯ এর রিলিজ নোট অনুযায়ী, জাভা এখন ইউনিকোড ৮ সাপোর্ট করে । কিন্তু এইটা দিয়ে আমাদের মতন আদার ব্যাপারিদের কাজ কি ? ওয়েল, C তে ক্যারেক্টার ছিলো ASCII টাইপ। তাতে ইংরেজি এবং রোমান হরফ বাদে কিছু প্রিন্ট করা সম্ভব ছিলো না । অনেকে থার্ড পার্টি লাইব্রেরী দিয়ে কাজ সারার চেষ্টা করেছে, কিন্তু C / C++ যেসব ব্যক্তিবর্গ মেইনটেইন করেন তারা এইটাকে অপারেটিং সিস্টেমের দয়া মায়ার উপর ছেড়ে দিয়েছেন। ফলাফল, কনসোলে বাংলা আউটপুট দিতে গেলে হাবিজাবি সাংকেতিক চিহ্ন আসে । কারণ ASCII এর ক্যারেক্টার টেবিলে বাংলার জন্য কোন এনকোডিং নেই ।

  • C তে float আর double টাইপের প্রিসিশন হচ্ছে দশমিকের পরে যথাক্রমে ৩ এবুং ৬ ঘর পর্যন্ত । সাধারণ কাজের জন্য এইটা ঠিক আছে কিন্তু মানুষ লোভী । তারা যত পায় তত চায় এবং এই চাওয়ার কোন শেষ নেই । তাই জাভাতে float এর প্রিসিশন দশমিকের পরে ৭ ঘর এবং double এর জন্য ১৫ ঘর ।

  • String টাইপ । আর কষ্ট করে ক্যারেক্টার অ্যারে বানিয়ে স্ট্রিং ইউস করতে হবে না । জাভাতে স্ট্রিং এর জন্য আলাদা টাইপ ই আছে । অ্যারে এর জন্য যেমন সাইজ ফিক্স করে দেয়া লাগতো , সে ঝামেলা আর নেই। নিচের কোডটা রান করে দেখো ।

public class BanglaString {
    public static void main(String[] args) {
        System.out.println("স্বাগতম => কুদ্দুস");
    }
}

বিঃদ্রঃ উইন্ডোজে ফন্ট ভাঙ্গা আসতে পারে আবার বক্স ও দেখাতে পারে ।

জাভা স্ট্রিং এর উপর বিস্তারিত আরো কয়েকটা পোস্ট থাকবে । চিন্তার কোন কারণ নাই।

Imgur

  • এইবার আসি boolean নিয়ে । মনে আছে C তে কোন ভ্যালুকে true আর কোনটাকে false ধরা হয়? ০ বাদে যেকোন কিছু C তে true, তাই true ইন্ডিকেট করার জন্য ০ বাদে যেকোন কিছু দিলেই চলে । জাভাতে এমন কিছু নাই । কি আর করার ! তাই তারা boolean ডেটা টাইপ দিয়েছে। উদাহরণঃ
boolean jonSnowKnowsEverything = false;
// জন স্নো কিছুই জানে না। true দিয়া লাভ নাই।

Imgur

এবার একটা ভালো প্রোগ্রাম লেখি ।

আমরা এইবার একটা প্রোগ্রাম লিখবো যেটা দুইটা integer বা int টাইপের ভেরিয়েবল যোগ করবে এবং সেটা প্রিন্ট করবে ।

public class IntSum {
    public static void main(String[] args) {
        int a = 45;
        int b = 50;

        int sum = a + b;
        System.out.println(sum);
    }
}

কিন্তু এইভাবে হার্ড কোড করে কেন ? ইনপুট নিবো ক্যামনে?

গুড কোয়েশ্চন। এইভাবে তো সারাজীবন ভেরিয়েবলে মান বসিয়ে দিয়ে কাজ করা সম্ভব না । ইনপুট নিতেই হবে! এখন প্রশ্ন হচ্ছে জাভাতে ইনপুট ক্যামনে নেয়? C তে তো scanf ফাংশন দিয়ে সব কাজ সেরে দেয়া যায়। জাভাতে এমন কি আছে ? ওয়েল জাভাতে Scanner আছে। Scanner আদতে কোন ফাংশন না, এইটা একটা ক্লাস। কিন্তু ক্লাস কি, ক্লাসে কাজ কি সে বিষয়ে কথা বলতে গেলে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এর বেসিক জানা জরুরি । সে বিষয়ে আর অল্প ২-১ টা পোস্ট পরেই আমরা গ্যাজানো শুরু করবো। আপাতত জেনে রাখো যে Scanner ইনপুট নিতে কাজে লাগে আর Scanner কীভাবে ইউস করতে হয়।

  • Scanner ইউস করার জন্য প্রথমে Scanner সাহেব কে import করা লাগবে । C এর #include এর মতন আরকি।

  • import করার স্টেটমেন্ট হচ্ছেঃ

import java.util.Scanner;
  • এই import করার কাজটা করতে হবে সোর্স ফাইলের শুরুতে। এবার Scanner ইউস করার পালা।
Scanner scanner = new Scanner(System.in);
  • এখানে new জিনিসটা কেন আসলো? কারণ অই যে, Scanner একটা ক্লাস। একে ইনিশিয়ালাইজ করতে new দেয়া লাগবে। শুধু ক্লাস টাইপ মালামালের জন্যই যে লাগে তা না আসলে। অ্যারে ডিক্লেয়ার করতেও লাগে, আরো অনেক কাজে লাগে। এখনকার জন্য আমরা ইনপুট নেয়াতে আমাদের বাকবাকুম সীমাবদ্ধ রাখি।

Imgur

  • আচ্ছা System.in দিলাম কেন? Scanner কে বলে দিতে হয় সে ইনপুট কই থেকে নিবে। স্ট্যান্ডার্ড ইনপুট আউটপুট মানে প্রোগ্রাম কনসোল থেকে নাকি কোন ফাইল থেকে নাকি ইন্টার্নেটের কোন লিংক থেকে (হ্যাঁ জাভা এই কাজ করতে পারে)। System.in স্ট্যান্ডার্ড ইনপুট বা কনসোল ইনপুট কে বুঝায়।

  • Scanner নাহয় বানাইলাম কিন্তুক ইনপুট নিবো ক্যামনে ? আচ্ছা আগে আমাদের যোগ করার প্রোগ্রাম টাকে সাইজ করে আসি।

import java.util.Scanner;

public class IntSumWithScanner {
    public static void main(String[] args) {
        int a;
        int b;

        Scanner scanner = new Scanner(System.in);

        a = scanner.nextInt();
        b = scanner.nextInt();

        int sum = a + b;
        System.out.println(sum);
   }
}

nextInt() মানে? এইটা দিয়ে কি শুধু int টাইপের ইনপুট নেয় নাকি?

নাম দেখেই বুঝার কথা । হ্যাঁ এইটা শুধু int টাইপ ইনপুট নেয়।

তাহলে বাকিগুলা ইনপুট নেয় ক্যামনে?

int এর জন্য যদি nextInt হয় তাহলে double, float, char, String, long, boolean এগুলোর জন্য কি হবে আন্দাজ করো। আমি স্পয়লার নাই বা দিলাম।

পুচকে এসাইনমেন্ট – ১

তোমাদের কাজ হচ্ছে Scanner ইউস করে সেম যোগ করার প্রোগ্রামটা অন্য ডেটা টাইপের জন্য লেখা ।

পুচকে এসাইনমেন্ট – ২

Scanner দিয়ে একটা char আর একটা String ইনপুট নিয়ে সেটা প্রিন্ট করবা।

আচ্ছা scanf এ যেমন টাইপ ওয়াইজ ফরম্যাট স্পেসিফায়ার দেয়া যাইত তা নাই স্ক্যানার এর জন্য?

ইউ মিন %d, %f, %lf? উহু নাই। জাভার ফিলোসফি ছিলো এইটা কঠিন টার্মিনোলজিগুলো সহজ করবে তারা এইটা তাই দেয় নাই , এর বদলে সোজা ফাংশন দিয়ে দিসে Scanner এর ভিতরে।

Resource Leak

রিসোর্স লিক কি জিনিস? Scanner কে যে বলে দিলাম স্ট্যান্ডার্ড ইনপুট থেকে সব নিতে, ইনপুট নেয়ার কাজ শেষ হওয়ার পরে কি সে স্ট্যান্ডার্ড ইনপুটের দখল ছেড়েছে? কীভাবে শিওর হব যে সে ছেড়ে দিয়েছে? Scanner এর একটা মেথড আছে সেটা কল করলেই চলবে।

scanner.close()

এতে Scanner স্ট্যান্ডার্ড ইনপুট এর দখল ছেড়ে দিবে। তাতে আমাদের আর এই বিষয়ে চিন্তা করা লাগলো না যে Scanner অযথা মেমরি বা অন্যান্য রিসোর্স দখল করে রাখছে কিনা। Scanner বা সমজাতীয় জিনিসের কাজ শেষ হবার পরে close করে দেয়া ভালো প্র্যাকটিস। File Read Write এর সময় এ ব্যাপারটা আরো সহজ হবে । হোল্ড ইউর হর্সেস টিল দেন ।

এই ভাই এই, printf নাই?

Imgur

printf আছে। তুমি কি System.out লেখতে লেখতে হয়রান হয়ে গেছো? ওয়েল তোমার জন্য দুঃসংবাদ হচ্ছে printf আছে System.out এর সাথেই। আর হ্যাঁ এই printf এ %d, %c ইত্যাদি ইউস করতে পারবা।

int x = 0;
int y = 20;
System.out.printf("%d %d\n", x, y);

এইটাকে শর্ট করা যায় না?

জাভা বাঁচাল ল্যাঙ্গুয়েজ । যে শর্টকাটে বিশ্বাসী না। তবে একটা শর্টকাট আছে। ডিপেন্ড করছে তুমি কোন IDE ইউস করো। Eclipse এ sysout লিখে Ctrl + Space চাপলে অটো System.out.println লিখে দেয় । Intellij তে sout লিখলেই প্রম্পট এসে পড়ে, প্রোগ্রামার ফ্রেন্ডলি জিনিস তো!

বিঃদ্রঃ Eclipse এর শর্টকাট অপারেটিং সিস্টেম ভেদে ভিন্ন ও হতে পারে। একলিপ্স এর সেটিংস এ গিয়ে চেঞ্জ করে নিতে পারো।

এতবার System.out লেখবো

Imgur

আচ্ছা System.out.println এ তো ফরম্যাট স্পেসিফায়ার দেয়া যায় না। তাহলে উপায়?

ওয়েল ওখানে ফরম্যাট স্পেসিফিয়ার লাগে না আসলে। জাভা শিখতেসো, একটু অ্যাডভান্সড হউ । ফিরে যাই আমাদের যোগ করার প্রোগ্রামে। আমাদের টার্গেট হচ্ছে আমাদের আউটপুট এমন হবে –

a + b = sum # sum হচ্ছে যোগফল। যেহেতু a,b ইনপুট নিচ্ছি জানি না এর ভ্যালু কি।

C তে লিখলে এইটা কি হতো?

printf("a + b = %d\n", sum);

এইবার এটাকে System.out.println দিয়ে এভাবে লিখবো।

System.out.println("a + b = " + sum);

কত সহজ দেখলা? আমাকে ফরম্যাট স্পেসিফিয়ার দিতেই হয় নাই! + চিহ্ন দিয়ে শুধু ভেরিয়েবলের নাম লিখে দিলাম আর হয়ে গেলো।

জিনিসটা আরেকটু কঠিন করি। এইবার আমরা চাচ্ছি a,b এর ভ্যালু ও দেখাবে। ধরা যাক

a = 70;
b = 30;

তাহলে sum হবে ৭০+৩০ = ১০০। আমরা এইটাকে দেখাতে চাই এইভাবে –

70 + 30 = 100

তাহলে System.out.println কি হবে?

System.out.println(a + " + " + b + " = " + sum);

জাস্ট + সাইন দিয়ে জিনিসগুলোকে আলাদা করে দিবা ।

পুচকে এসাইনমেন্ট – ৩

আমরা + চিহ্ন কেন দিচ্ছি এইখানে? চিন্তা করে দেখো ।

ভাই ফাইল থেকে ক্যামনে ইনপুট নেয় বা আউপুট দেয়?

এক পোস্টে এত চাস কেন বাপ?

দয়া করে এসাইনমেন্ট ৩ টা করিবেন।

জাভা তে বেসিক ইনপুট আউটপুট আসলে এতটুকুই। এর বাইরে কিছু ফাংশন আছে যেমন – System.out.print() ইত্যাদি, এরপর Scanner এর ও কিছু বিকল্প আছে (কিন্তু মশা মারতে কেউ সেগুলো দাগে না মানে কামান দাগে না)। সেগুলো নিজেরা Explore করবে । সব স্পুনফিড করতে গেলে তো ঝামেলা। প্রোগ্রামারদের চিন্তাশক্তি ভালো থাকা জরুরি। চিন্তা না করলে, নতুন জিনিস নিয়ে এক্সপেরিমেন্ট করার ইচ্ছা না থাকলে প্রোগ্রামার হওয়া কঠিন । হয়তো ছা পোষা প্রোগ্রামার হতে পারবে, আদতে ভালো কিছু হবে না।

আচ্ছা ৩ টা এসাইনমেন্ট। আমি কয়েকটা জিনিস এখানে কভার করিনি। আপনারা ৩ টা এসাইনমেন্ট করবেন। করার পরে সুপারম্যান না হলে আটকাবেন। গুগল করবেন। জানার চেষ্টা করবেন। তাতে আপনাদের যেমন নেট থেকে ঘেটে বের করা জিনিসটা শেখা হবে তেমনি দশটা পাঁচটা সোর্স ঘাটতে গিয়ে অনেক কিছু জানতেও পারবেন। আর একেবারেই না পারলে আমি আরেক দফা পোস্ট দিয়ে সাহায্য করে দিবো ।

Until then Sayonara!

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s