সূচিপত্র

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

আমরা আগের দিন যে কোড লিখেছিলাম, সেটাতেই ফিরে যায়। আমাদের ইন্টিজারের ধরণ চেক করার কোডটি ছিল এমনঃ

#include <stdio.h>
int main() {
    int number;
    printf("A number please?n");
    scanf("%d",&number);
    if (number > 0) {
        printf("Your input is a positive integer!n");
    }
    else if (number < 0) {
        printf("Your input is a negative integer!n");
    }
    if (number == 0) {
        printf("Your input is zero!n");
    }
    return 0;
}

এখন একটা জিনিস চিন্তা করে দেখ, একটা সংখ্যা যদি ০ থেকে বড় বা ছোট কোনোটিই না হয়, তবে সংখ্যাটি তো অবশ্যই ০ হবে! এটা কি আর চেক করে দেখার প্রয়োজন আছে? চেক করে শুধু শুধু সময় নষ্ট করার তো কোনোই মানে হয় না!

তাহলে এখন আমাদের শর্ত গুলো দাড়াচ্ছে এমনঃ

যদি ইন্টিজার ০ থেকে বড় হয়, প্রিন্ট করবে “Your input is a positive integer!”

অথবা যদি ইন্টিজার ০ থেকে ছোট হয়, প্রিন্ট করবে “Your input is a negative integer!”

নাহলে প্রিন্ট কর “Your input is Zero!”

এখন, “নাহলে” ইংরেজি কি? else!

তাহলে আমরা কোডটা লিখে ফেলিঃ

#include <stdio.h>

int main() {
    int number;
    printf("A number please?n");
    scanf("%d", &number);
    if (number > 0) {
         printf("Your input is a positive integer!n");
    }
    else if (number < 0) {
        printf("Your input is a negative integer!n");
    }
    else (number == 0) {
        printf("Your input is Zero!n");
    }
    return 0;
}

এখন কাজ কিন্তু আগের মতই হচ্ছে, শুধু সময়টা লাগছে কম। সময়ের ব্যবধান খুব অল্প হলেও তাৎপর্যপূর্ণ। যখন তুমি অনেক বড় প্রবলেম সলভ করবে, তখনই আরও ভাল মত বুঝতে পারবে!

এইবার আমরা জোড় নাকি বিজোড়, সেটাও এভাবে বের করে ফেলি! আমরা চেক করবো সংখ্যাটা জোড় কি না, যদি না হয় সেটা বিজোড়! এর বাইরে কি কিছু সম্ভব?

তাহলে কোডটা লিখে ফেলি।

#include <stdio.h>

int main() {
    int number;
    printf("An integer please?n");
    scanf("%d", &number);
    if (number % 2 == 0) {
        printf("This is an even number!n");
    }
    else {
        printf("This is an odd number!n");
    }
    return 0;
}

এখানে একটা জিনিস খেয়াল কর, আমরা কিন্তু number % 2-কে আগে একটা ভ্যারিয়েবলে রেখে তারপর দেখতে পারতাম ভ্যারিয়েবলটা শূণ্য কি না। সেটা না করে এভাবেও করা যায়। যদি “==” -এর দুই পাশের জিনিস কোনো না কোনো ভাবে একই হয়, তাহলেই শর্ত সত্যি হয়ে যাবে! 🙂

_________________________________________________________________

এখন পর্যন্ত আমরা যা যা দেখেছি, তা খুবই বেসিক জিনিসপত্র। আমরা এখন আস্তে আস্তে আরও বিস্তারিত দেখবো। আমরা এতদিন কেবল একটি শর্ত নিয়ে কাজ করেছি। কিন্তু এমনও তো হতে পারে, যখন আমাদের একাধিক শর্ত ব্যবহার করতে হবে। যেমন, ধর তোমাকে বলা হল একটি ইন্টিজার ইনপুট নিয়ে সেটি জোড় না বিজোড় এবং পজিটিভ না নেগেটিভ তা একই সাথে প্রিন্ট করতে হবে‍! এখন এটা করার একটা উপায় হতে পারে। একটা if-এর ভেতরের অংশে আরেকটা if লিখে দেওয়া, যেমনঃ

if (number > 0) {
    if (number % 2 == 0) {
        printf("The number is positive and even!n");
    }
}

এখানে কী হচ্ছে? প্রথমে কম্পাইলার জিজ্ঞেস করছে, নাম্বার কি ০ থেকে বড়? যদি বড় হয়, তাহলে সেটা লাল রঙের সেকেন্ড ব্র্যাকেটের ভেতরে যাচ্ছে। এরপর আবার জিজ্ঞেস করছে, নাম্বার কে ২ দিয়ে ভাগ করলে কি ভাগশেষ শূন্য? যদি শূন্য হয়, তাহলে এবার নীল রঙের সেকেন্ড ব্যাকেটের ভেতরে যাচ্ছে এবং প্রিন্ট করছে “The number is positive and even!”

এখন আমরা একটা else ব্যবহার করে “The number is positive and odd!” প্রিন্ট করতে চাইলে সেটা কোথায় লিখবো বল তো? চিন্তা কর, অবশ্যই পারবে!

যদি নাও পার সামনের অংশ পড়ার আগে অন্তত ২ মিনিট চিন্তা করবে! দেখ আমরা কিন্তু পজিটিভ নাম্বার নিয়েই কাজ করছি এখনো। নাম্বারটা পজিটিভ, কিন্তু জোড় না। অর্থাৎ পজিটিভ হওয়ার শর্ত সত্য, কিন্তু জোড় হওয়ার শর্ত মিথ্যা! তাহলে এবার লাল রঙের সেকেন্ড ব্র্যাকেটে গেলেও নীল রঙের সেকেন্ড ব্র্যাকেটের ভেতরে আর যাবে না! তাহলে আমরা এই নীল রঙের সেকেন্ড ব্যাকেট ওয়ালা if-এর নিচেই শর্তটা জুড়ে দিব!

if (number > 0) {
    if (number % 2 == 0) {
        printf("The number is positive and even!n");
    }
    else {
        printf("The number is positive and odd!n");
    }
}

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

(১) else ব্যবহার করবো, নাকি else if?

(২) সেটা কোথায় লিখবো?

চিন্তা করতে থাক। আশা করি পারবে! 🙂

প্রথম প্রশ্নের উত্তর অবশ্যই একটা else if, কারণ এখনো আমাদের দুইটা জিনিস নিয়ে কাজ বাকি। কেবল এক ধরণের পসিবিলিটি থাকলেই আমরা else ব্যবহার করতে পারতাম। তাহলে ০-এর জন্য else if ব্যবহার করে এরপর ০ থেকে ছোট সংখ্যাগুলোর জন্য ব্যবহার করবো একটা else!

আর দ্বিতীয় প্রশ্ন… এবার কি লাল রঙের সেকেন্ড ব্যাকেটের ভেতরে যাবে? না। তাহলে কোথায় লিখবো? উত্তর তো পেয়েই গেলে! 😀

তাহলে এখন কোডটা হবে নিচের মতঃ

if (number > 0) {
    if (number % 2 == 0) {
        printf("The number is positive and even!n");
    }
    else {
        printf("The number is positive and odd!n");
    }
}

else if (number == 0) {
    printf("The number is zero!n");
}

আমাদের কাজ প্রায় শেষ, এবার  বাকিটুকুও লিখে ফেলি! বাকি কাজটা কিন্তু খুবই সহজ। কারণ জোড় বিজোড়ের কাজ কিন্তু আমাদের ইতোমধ্যেই করা আছে। আমরা একটা else-এর ব্লক (সেকেন্ড ব্যাকেট দিয়ে আবদ্ধ জায়গাটা) লিখে তার ভেতরে ওই অংশটা কপি-পেস্ট করে দিয়ে একটু বদলে দিলেই হয়ে যায়! 😉

তাহলে এবার দেরী না করে পুরো কোডটি লিখে ফেলি।

#include <stdio.h>
int main() {
    int number;
    scanf("%d", &number);
    if (number > 0) {
        if (number % 2 == 0) {
            printf("The number is positive and even!n");
        }
        else {
            printf("The number is positive and odd!n");
        }
    }
    else if (number == 0) {
        printf("The number is zero!n");
    }
    else {
        if (number % 2 == 0) {
            printf("The number is negative and even!n");
        }
        else {
            printf("The number is negative and odd!n");
        }
    }
    return 0;
}

কোডটা রান করলে সব খুব সুন্দরভাবেই কাজ করবে! কিন্তু আমাদের মাথা ব্যাথা সেটা নিয়ে না। আমাদের মাথা ব্যাথা নতুন কিছু শেখা নিয়ে। এই একই কাজটা আরেকভাবে করা যায়। সেটা করতে গিয়ে আমাদের জানতে হবে তিনটা লজিকাল অপারেটর নিয়ে। এই তিনটা লজিকাল অপারেটর হল &&, || এবং ! (হ্যা, একটা আশ্চর্যবোধক চিহ্ন!)

প্রথমটির কাজ হচ্ছে একাধিক শর্তের মধ্যে সবগুলো সত্য কি না সেটা চেক করা।

দ্বিতীয়টির কাজ হচ্ছে একাধিক শর্তের মধ্যে যেকোনো একটি সত্য কি না সেটা চেক করা।

তৃতীয়টার ব্যাপারে পড়ে বলবো! আগ্রহী হলে গুগলে দেখে নিতে পার। 🙂

/* একটা জিনিস খেয়াল রেখ &  আর কিন্তু দুইটা করে। একটা দিলে হবে না! :p */

জানি কথাগুলো একটু অগোছালো মনে হচ্ছে। ব্যাপারটা হল এমনঃ

if (condition1 && condition2) {
    // condition1 ar condition2 dui tai jodi shotti hoi, tahole vitore dhukbe!
}

else if (condition1 || condition2) {
    // condition1 ar condition2 er moddhe jekono ekta shotti holei vitore dhukbe!
}

else {
    // bolo to ekhane kokhon dhukbe?? 
}

এবার তোমার কাজ হল কখন else-এর ব্লকের ভেতরে যাবে, সেটা বলা।

দেখ প্রথমেই কম্পাইলার চেক করবে condition1 আর condition2 দুইটাই সত্য কি না। যদি দুইটাই সত্য হয়, তাহলে কিন্তু পরেরগুলো আর চেকও করবে না!

যদি যেকোনো একটি বা দুইটি কন্ডিশনই মিথ্যা হয়, তাহলে এরপর কম্পাইলার যাবে else if-এর কাছে। এবার চেক করবে condition1 আর condition2-এর যেকোনো একটা সত্য কি না। এখন যদি যেকোনো একটা সত্য হয়, তাহলে কিন্তু আর পরের else-টাতে আর যাবে না। তাহলে else-ব্লকে শুধু তখনই যাবে, যখন condition1 আর condition2 দুইটাই মিথ্যা হয়!

এই দুইটাই মিথ্যা, এই ব্যাপারটা প্রকাশ করতেই আমরা ব্যবহার করি ! অপারেটরটা। আমরা যদি লিখি, (!(condition1) && !(condition2)) তাহল সেটা বুঝাবে “condition1-ও সত্য না, এবং condition2-ও সত্য না”-এই কথাটা সত্য! :p অর্থাৎ সোজাা বাংলায়, কোনোটাই সত্য না! 

/* এই জায়গাটা না বুঝলে সমস্যা নাই। তবে && আর ।।-এর ব্যাপারটা অবশ্যই বুঝতে হবে! */

তো এবার আগের কোডটাতে ফিরে যায়। আমরা চেক করেছিলাম জোড় না বিজোড় এবং পজিটিভ না নেগেটিভ। এখানে কয় ধরণের কেস থাকতে পারে?

প্রথম কেস হতে পারে এমন, ইন্টিজারটা ০ থেকে বড় এবং জোড়।

(২) ইন্টিজারটা ০ থেকে বড় এবং বিজোড়

(৩) ইন্টিজারটা ০

(৪) ইন্টিজারটা ০ থেকে ছোট এবং জোড়

(৫) ইন্টিজারটা ০ থেকে ছোট এবং বিজোড়

তো আমরা ৫ টা কেসের জন্য ১ টা if, ৩ টা else if আর ১ টা else ব্যবহার করলেই কাজ শেষ! এখন আমাদের শর্তগুলো ঠিক করতে হবে।

প্রথম শর্ত পূরণের জন্য একই সাথে সংখ্যাটা ০ থেকে বড় এবং জোড় হতে হবে। তাহলে এর শর্ত হলঃ ((number > 0) && (number%2==0))

ভেতরের ব্র্যাকেটগুলো না দিলেও চলে, তবে দেওয়াটাই নিরাপদ!

(২)  ((number > 0) && (number%2==1))

(৩) (number == 0)

(৪)  ((number < 0) && (number%2==0))

(৫) এটার শর্ত নিয়ে আমাদের ভাবতে হচ্ছে না, যেহেতু else ব্যবহার করেছি!

তাহলে আমরা এবার কোডটা লিখে ফেলি!

#include <stdio.h>

int main() {
    int number;
    scanf("%d", &number);
    if ((number > 0) && (number%2==0) ) {
        printf("The number is positive and even!n");
    }
    else if ((number > 0 ) && (number%2==1)) {
        printf("The number is positive and odd!n");
    }
    else if (number == 0) {
        printf("The number is zero!n");
    }
    else if ((number < 0) && (number%2==0)) {
        printf("The number is negative and even!n");
    }
    else {
        printf("The number is negative and odd!n");
    }
    return 0;
}

আজকের মত এখানেই শেষ। কোনো বাড়ির কাজও দিচ্ছি না! 😀 তবে যা কিছু লিখেছি, তা আরও ভাল মত বুঝানোর জন্য নিচের কোডটি দিচ্ছি। তোমার কাজ হবে ৯-টি ব্লকের কোনটি কোন ইনপুট দিলে এক্সিকিউট হচ্ছে সেটা বের করে আমাকে জানানো।

#include <stdio.h>

int main() {
    int num1, num2;
    printf("Enter 2 integersn");
    scanf("%d %d", &num1, &num2);

    if (num1 > 0 && num2 < 0) {
        printf("Number 1n");
    }
    else if (num1 < 0 && num2 > 0) {
        printf("Number 2n");
    }
    else if (num1 == 0 && num2 == 0) {
        printf("Number 3n");
    }
    else if (num1 > 0 && num2 == 0 ) {
        printf("Number 4n");
    }
    else if (num1 > 0 && num2 > 0) {
        printf("Number 5n");
    }
    else if (num1 < 0 && num2 == 0 ) {
        printf("Number 6n");
    }
    else if (num1 < 0 && num2 < 0) {
        printf("Number 7n");
    }
    else if (num1 == 0 && num2 > 0 ) {
        printf("Number 8n");
    }
    else {
        printf("Number 9n");
    }

    return 0;
}

এই পুরো কাজটি করা শেষ হলে আর কোনো সমস্যা থাকার কথা না! এরপরও যদি কোনো সমস্যা থাকলে আমাকে বলবে। 

হ্যাপি কোডিং। 🙂

Muntasir Wahed

Muntasir Wahed

System Administrator at স্বশিক্ষা.com
Jack of all trades, master of none.
Muntasir Wahed
Muntasir Wahed