জাভা প্রোগ্রামিং # ৬ – কন্ডিশনাল, লুপ ইত্যাদি

জাভার ভ্যারিয়েবল ডিক্লারেশন গেলো । একটা ল্যাঙ্গুয়েজের কি কি বেসিক ফিচার থাকে? কন্ডিশনাল স্ট্যাটমেন্ট, রিপিটিশন স্টেটমেন্ট(লুপ), অ্যারে, স্ট্রিং ইত্যাদি । এই পোস্টে আমরা কন্ডিশনাল আর লুপ নিয়ে গেজাবো। দেখা যাক জাভাতে এই জিনিসগুলো কীভাবে কাজ করে।

কন্ডিশনাল স্ট্যাটমেন্ট

আচ্ছা কন্ডিশনাল স্ট্যাটমেন্ট বলতে আমরা এমনিতে কি বুঝি? কন্ডিশনাল মানে কি ? কোন কিছু যার সাথে কোন শর্ত বা কন্ডিশন জড়িত তাই না? তাহলে প্রোগ্রামিং এর সময় কোন কন্ডিশন কীভাবে হ্যান্ডেল করি? if-else, switch এগুলো দিয়েই তো। এগুলো নিয়েই কন্ডিশনাল স্ট্যাটমেন্ট।

তো জাভাতে কীভাবে এই জিনিসগুলো ইউস করা যায় । কয়েকটা কেস সিনারিও দিয়ে দেখি।

if - else কেস সিনারিও – ঝন্টু মামার বাজার করা

ঝন্টু মামা আজকে বাজারে যাবেন। তাকে বাসা থেকে স্ট্রিক্টলি বলে দেয়া হয়েছে শসা কিনে আনতে । তাকে এটাও বলে দেয়া হয়েছে এক ব্যাগে ১০ টার বেশি শসা না নিতে । তাহলে তাকে ডিসিশন নিতে সাহায্য করার জন্য একটা প্রোগ্রাম লেখা যাক।

কাজটা সহজ করার জন্য মামার হাতে একটা মোবাইল অ্যাপ দেয়া আছে। উনি শসা কিনে কয়টা কিনলেন সেটা ইনপুট দিবেন।

import java.util.Scanner;

public class HelpingJhontuMama {
    public static void main(String[] args) {
        int numOfCucumberBought;
        Scanner jhontuMama = new Scanner(System.in);

        numOfCucumberBought = jhontuMama.nextInt();

        if (numOfCucumberBought <= 10) {
            // ১০ তার বেশি নিচ্ছে না। 
            System.out.println("মামা সব ঠিক আছে"); 
        } else {
            // ১০ এর বেশি হয়ে গেলো
            System.out.println("মামা আরেক ব্যাগে নেন"); 
        }

        jhontuMama.close();
    }
}

মামাকে মামীর হাতে মাইর খাওয়া থেকে বাঁচিয়ে দিলাম । এজন্য একটা ট্রীট চাওয়াই যায় 😉

Imgur

switch কেস সিনারিও – কুদ্দুস মিয়ার লিফট যাত্রা

কুদ্দুস মিয়া নতুন নতুন শশুরবাড়িতে এসেছে। মস্ত বিল্ডিং । ১০ তলা। বিল্ডিং এর প্রতি ফ্ল্যাটেই কুটুম্বরা থাকে । কিন্তু কার বাসা কোন ফ্লোরে এইটা মনে রাখা মস্ত কঠিন কাজ। সে তাই একটা চিরকুট বানিয়ে নিয়েছে। চিরকুট এমন যে –

  • ১ তলায় নামলে বিল্ডিং থেকে বের হওয়া যাবে।
  • ২ তলায় শশুরের চাচির খালার ফুফার ভাইয়ের ছেলে থাকে।
  • ৩ তলায় থাকে চাচির মামীর ফুফুর দাদার নাতনী।

এবং ইত্যাদি ইত্যাদি। তো তাকেও একটা মোবাইল ফোন দেয়া হলো। সে সেটা দিয়ে ইনপুট দিবে, আমরা বলে দিবো ঐ তলায় কার বাসা।

import java.util.Scanner;

public class HelpingJhontuMama {
    public static void main(String[] args) {
        int floor;
        Scanner kuddusMiya = new Scanner(System.in);

        switch(floor) {
            case 1:
                System.out.println("১ তলায় নামলে বিল্ডিং থেকে বের হওয়া যাবে।");
                break;
            case 2:
                System.out.println("২ তলায় শশুরের চাচির খালার ফুফার ভাইয়ের ছেলে থাকে");
                break;

            case 3:
                System.out.println("৩ তলায় থাকে চাচির মামীর ফুফুর দাদার নাতনী");
                break;

            default:
                break;
        }

        kuddusMiya.close();
    }
}

এসাইনমেন্ট – ১

  • switchdefault কেন ইউস করা হয়?
  • break না দিলে সমস্যা কি?

এসাইনমেন্ট – ২

switch কেস এ কোন কোন ডেটা টাইপ সাপোর্টেড। (হিন্টঃ C এর switchint আর char টাইপ সাপোর্টেড)

এসাইনমেন্ট – ৩

আচ্ছা কুদ্দুস মিয়া যদি জিজ্ঞেস করে তাকে এমন প্রোগ্রাম লিখে দিতে পারবে কিনা যেটায় সে ইনপুট দিবে “চাচির মামীর ফুফুর দাদার নাতনীর বাসা” আর তোমাকে আউটপুট দিতে হবে সেটা কয় তলায়, কীভাবে করবে ? (switch কেস ইউস করে করতে হবে) ফুল প্রোগ্রাম টাই লিখবা।

লুপ আর লুপ। লুপের জালে দুনিয়া কুপোকাত

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

  • for
  • while
  • do..while

লুপ কেন ইউস করি?

লুপ ইউস করার পেছনে আমাদের উদ্দেশ্য কি? একই কাজ বারবার করার জন্য বারবার কোড না লিখে সেম কোড বারবার রান করানোর জন্য আমরা লুপ চালাই।

কেস সিনারিও – কয়েকটা নাম্বারের যোগফল বের করা

ধরো তোমাকে বলা হলো ১০ টা নাম্বার তুমি একের পর এক ইনপুট নিয়ে তাদের যোগফল দেখাবে । এখন তুমি কি ১০ টা ভেরিয়েবল বানাবে নাকি লুপ চালাবে ? যদি বলা হয় কয়টা সংখ্যা আগে থেকে বলে দেয়া নাই, তাহলে কয়টা ভ্যারিয়েবল বানাবে? ঝামেলা হয়ে গেলো না? এরপর যোগ ও করতে হবে। তাহলে কীভাবে এইটাকে এপ্রোচ করা যায়?

  • প্রথমে একটা লুপ চালাবো। সংখ্যা ইনপুট নিবো।
  • সে লুপের মাঝেই সব যোগ করে একটা ভ্যারিয়েবলে রাখবো ।

for loop

এখন গ্যাজাই। ফর লুপ কীভাবে কাজ করে? ফর লুপের ৩ টা পার্ট থাকে।
– প্রথমটা হচ্ছে ইনিশিয়ালাইজিং পার্ট। যেখানে আমরা বলে দেই যে লুপ কই থেকে শুরু হবে।
– দ্বিতীয়টা হচ্ছে কন্ডিশন পার্ট, যেখানে আমরা বলে দেই কোন কন্ডিশন ঠিক থাকা পর্যন্ত লুপ চলবে। কন্ডিশন ফেইল করলে লুপ শেষ।
– তৃতীয় হচ্ছে স্টেপ ইঙ্ক্রিমেন্ট । এখানে আমরা বলে দেই লুপের প্রতি স্টেপ কত করে বাড়বে। ব্যাপারটাকে সিড়ি দিয়ে উঠানামার সাথে তুলনা করা যায়। তুমি প্রতি ধাপে চাইলে ১ সিড়ির বদলে ২ সিড়িও ডিঙ্গাতে পারো, আবার চাইলে উড়ে সব সব পার হয়ে যেতে পারো (ডিপেন্ডস অন ইউর রিফ্লেক্স অ্যান্ড ইমেজিনেশন)

তাহলে ফর লুপের স্ট্রাকচার টা দাঁড়ায় হচ্ছে এমনঃ

for(initializer; condition; increment) {}

এখন আমাদের প্রবলেমে আসি। আমাদের প্রবলেমের জন্য ১০ বার ইনপুট নিতে হবে। মানে ১০ বার ঘুরবে। আমরা ০ থেকে ৯ পর্যন্ত ১০ বার চালাতে পারি কিংবা ১ থেকে ১০ । একভাবে হলেই চলবে।

তাহলে আমাদের লুপের ইনিশিয়ালাইজার হচ্ছে ১, কন্ডিশন হচ্ছে লুপ ১০ বারের বেশি চলবে না, আর ইনক্রিমেন্ট হচ্ছে এক করে।

public class Sum {
    public static void main(String[] args) {
        int n = 10; // কয়টা সংখ্যা 
        int sum = 0;
        int x;

        Scanner in = new Scanner(System.in);
        for(int i = 1; i <= 10; i++) {
            x = in.nextInt();
            sum += x; // অথবা sum = sum + x; 
        }

        System.out.println(sum);
        in.close();
    }
}

হোল্ড অন, লুপের ভিতরে ভেরিয়েবল ডিক্লেয়ার করলাম ক্যামনে?

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

এসাইনমেন্ট – ৪

যদি for লুপ এমন থাকে?

for( ; ; ) {}

তাহলে কি হবে?

এসাইনমেন্ট – ৫

ধরো আমার ১০ টা নাম্বার নেয়ার দরকার নাই। আমি প্রতি স্টেপে ২ ঘর লাফ দিবো মানে i += 2 দিবো। তাহলে কি হবে ?

while loop

while লুপের স্ট্রাকচার এমন যে এতে শুধু কন্ডিশন টাই থাকে। এইরকমঃ

while(condition) {
    // your code
}

while loop সেসব জায়গায় ভালো যেখানে কিনা লুপ এর জন্য কন্ডিশন মুখ্য। ইনিশিয়ালাইজার বা ইনক্রিমেন্ট এর কাজ লাগে না। তার মানে কি এটা করা যাবে না? যাবে । কীভাবে? আগের কোডটাই নতুন করে লেখি ।

public class Sum {
    public static void main(String[] args) {
        int n = 10; // কয়টা সংখ্যা 
        int sum = 0;
        int x;

        Scanner in = new Scanner(System.in);

        int i = 1; // ইনিশিয়ালাইজার
        while(i <= 10) {
            x = in.nextInt();
            sum += x; // অথবা sum = sum + x; 
            i++; // ইনক্রিমেন্ট
        }

        System.out.println(sum);
        in.close();
    }
}

চাইলে সব সম্ভব (ব্ল্যাক হর্স ব্ল্যাক হর্স ব্ল্যাক হর্স .__. )

এখন আসি do..while এ

এই লুপের ব্যবহার আসলে কম। do..while লুপ কাউকে ইদানিং ইউস করতে দেখিও না। কেউ করে বলেও শুনি না। এর সব কাজ হয় for নাহয় while লুপ দিয়ে সেরে দেয়া যায়। তবে একটা দিক দিয়ে do..while আলাদা । সেটা হচ্ছে, for , while লুপ যেখানে লুপের পরবর্তী ধাপে যাওয়ার আগে কন্ডিশন চেক করে নেয় সেখানে do..while কন্ডিশন চেক করে পরের ধাপের কাজ শেষ করে এরপর। এই লুপের স্ট্রাকচার এমন হয় –

do{
    // your code
} while(condition)

আমাদের উপরের প্রবলেমে যদি do..while লুপ চালাই তাহলে যে ঝামেলা হবে যে, আমরা তো বলে দিয়েছি ১০ টার বেশী সংখ্যা যোগ না করতে। তখন দেখা যাবে কি যে সে ১০ টা যোগ করের ১১ নাম্বার সংখ্যা যোগ করে এরপর কন্ডিশন চেক করবে । ভুল রেজাল্ট আসবে ফলে।

তাহলে কোন জায়গায় do..while লুপ ইউস করা যায়? তোমার প্রোগ্রামে যদি এমন অংশ থাকে যেটা ইউজার ইনপুট এর জন্য অপেক্ষা করে এবং ইউজার ইনপুট দিলেই কোন কাজ হয় সেসব ক্ষেত্রে এই লুপ বেশ কার্যকর।

একটা উদাহরণ দেই। ধরো তুমি ১ থেকে ১০ পর্যন্ত সংখ্যাগুলো প্রিন্ট করতে চাও। যদি do..while লুপে করো, যেটা হবে যে সে ১০ নাম্বার প্রিন্ট করার পরে চেক করবে যে কন্ডিশন ঠিক আছে কিনা । অন্য লুপে প্রিন্ট করার আগে দেখে নিবে যে কন্ডিশন ঠিক আছে কিনা।

উদাহরণ –

int a = 1;
do {
    System.out.println("value of a: " + a);
    a++;
} while( a < 10 );

break আর continue ….

এই দুই কী ওয়ার্ডের কাজ C তে যা ছিলো তাই। তবে এইখানে একটা ছোট প্রশ্ন রয়ে যায়। break দিলে নাহয় লুপ ভাঙ্গে। continue এর কি দরকার আছে? if-else দিয়ে কি সেটার কাজ করা যায় না? নির্ভর করছে প্রোগ্রামের উপর।

একটা সিনারিও চিন্তা করি যে, একজন ভদ্রলোক একটা ঝুড়ি থেকে পটল(!) তুলবেন। পটলের সাইজ ১ সেন্টিমিটার এর কম হলে তিনি তুলবেন না। এই ক্ষেত্রে যদি continue দেই?

// ধরা যাক ১০০ টা পটল আছে ঝুড়িতে
for(int i = 0; i < 100; i++){
    if (potolSize > 1) {
        System.out.println("Picked Potol");
    } else {
        continue;
    }
}

আচ্ছা continue দিয়ে তাহলে কি হলো? যখনই প্রোগ্রাম continue স্টেটমেন্ট পায় যে এর নিচে যদি গরু রচনাও লেখা থাকে সেটা এক্সিকিউট করবে না, সোজা লুপের পরের ইটারেশনে চলে যাবে । দেখতে চাইলে if-else এর বাইরে একটা কিছু প্রিন্ট করার চেষ্টা করতে পারো।

খতম!

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

Imgur

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