Thursday, 31 August 2017

লজিক্যাল স্টেটমেন্ট (if , else if and else) পর্ব-২

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

#include <stdio.h>
int main()
{
    int number;
    scanf("%d",&number);
    
    if(number>0)
    {
        printf("This is positive\n");
    }
    if(number<0)
    {
        printf("This is negative\n");
    }
    if(number==0)
    {
        printf("This is zero\n");
    }
    return 0;
}

উপরের প্রোগ্রামটি টাইপ করে রান করো, বিভিন্ন মান ইনপুট দাও যেমন 0, -20, 5 । এবার আরেকটি প্রোগ্রাম লিখোঃ

#include <stdio.h>
int main()
{
    int number = 10;

    
    if(number>5)
    {
        printf("Yes\n");
    }
    if(number>2)
    {
        printf("Yes\n");
    }
    
    return 0;
}

বলতে পারবে এই প্রোগ্রামের আউটপুট কি? একবার চেস্টা করে দেখো? মজার ব্যপার হচ্ছে আউটপুট হলো:
 Yes
 Yes
 কারণ কি? আমরা number এর মান দিয়েছি 10; তাই প্রোগ্রামটি if(number>5) এই লাইনে আসার পর দেখবে number এর মান ২ এর চেয়ে বড় কিনা?
 যেহেতু number 2 এর চেয়ে বড় তাই প্রিন্ট করবে Yes.
 তারপর প্রোগ্রামটি if(number>2) এই লাইনে যাবে আবার প্রিন্ট করবে Yes.
 কিন্তু যে সংখ্যা ৫ এর চেয়ে বড় তা অবশ্যই ২ এর চেয়ে বড়। তাই আমাদের ১ম শর্ত মিলে যাওয়ার পর ২য় শর্ত চেক করার প্রয়োজন নেই। যদি কোন সময় এ রকম অবস্থা আসে যে, আমাদের যেকোন একটা শর্ত মিলে যাওয়ার পর আর পরের কোন শর্ত চেক করতে হবে না , তখন আমরা if  ব্যবহার না করে else if ব্যবহার করবো। 

#include <stdio.h>
int main()
{
    int number = 10;

    
    if(number>5)
    {
        printf("Yes\n");
    }
    else if(number>2)
    {
        printf("Yes\n");
    }
    
    return 0;
}
এবার প্রোগ্রামটি রান করে দেখো একটাই Yes প্রিন্ট হবে। এখন আমরা চাই নাম্বারটা ২ এর চেয়ে ছোট হলে No প্রিন্ট করবে।

#include <stdio.h>
int main()
{
    int number = 10;

    
    if(number>5)
    {
        printf("Yes\n");
    }
    else if(number>2)
    {
        printf("Yes\n");
    }
    else
    {
        printf("No\n");
    }

    return 0;
}
লক্ষ্য করে দেখো আমি যখন number এর মান ২ এর ছোট হলে No প্রিন্ট করতে বলেছি তখন কোন শর্ত লিখে দেই নি। শুধু else লিখেছি। এর মানে হলো if এবং else if এর শর্ত মিথ্যা হলে else এ যা আছে তা প্রিন্ট হবে। এতক্ষণ আমি যা আলোচনা করলাম তার উদ্দেশ্য if , else if এবং else এর কাজ বোঝানো। আশাকরি if , else if এবং else এর কাজ বুঝে গেছো।

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

এবার আমরা মড অপারেটর ব্যবহার করে উপরের সমস্যাটি সমাধান করবো।

আমরাজানি, কোন সংখ্যাকে ২ দিয়ে ভাগ করলে যদি ভাগশেষ ০ হয় তাহলে সংখ্যা টা জোড়। আর শূন্য না হলে বেজোড়।

এবার নিচের প্রোগ্রামটা দেখে নেইঃ

#include <stdio.h>
int main()
{
    
    int number;

    scanf("%d",&number);

    if(number%2==0)
    {
        printf("Number is Even\n");
    }
    if(number%2!=0)
    {
        printf("Number is Odd\n");
    }

    return 0;
}
২য় if এর মধ্যে != এইটা দেখে কি ভাবছো? যদি আগে থেকে জেনে থাকো তাহলে নিশ্চয় বোঝে গেছো কেনো এটা ব্যবহার করা হয়েছে, হ্যা, আমরা যেভাবে কোন কিছু একটা আরেকটার সমান কি না তা যাচাই করার জন্য == ব্যবহার করি, ঠিক তেমনি কিছু একটা আরেকটার অসমান কি না তা যাচাই করার জন্য != ব্যবহার করি।

এবার দেখে নেই কিভাবে কোডটি কাজ করছেঃ

প্রথমে ইউজারের কাছ থেকে নাম্বারটা ইনপুট নেওয়ার পর কম্পাইলার যখন ১ম if এ আসবে,
তখন দেখবে ইনপুট এ দেওয়া নাম্বার টা ২ দিয়ে ভাগ করলে ভাগশেষ ০ হয় কিনা? যদি এই শর্তটা সত্য হয় তবে  Number is Even
এই লেখাটা আউটপুট দিবে।

তারপর কম্পাইলার ২য় if এ আসবে।
আবার দেখবে ইনপুট দেওয়া নাম্বারটা ২ দিয়ে ভাগ করলে ভাগশেষ ০ ছাড়া অন্য কিছু হয় কিনা?(শুন্য নয় কিনা) যদি এই শর্তটা সত্য হয় তবে  Number is Odd
এই লেখাটা আউটপুট দিবে।

কিন্তু , যদি উপরের প্রথম if সত্য হয় তাহলে ২য় if অবশ্যই মিথ্যা হবে।

 তাই 
if(number%2==0) সত্য হলে আউটপুট আসবে, Number is Even
 এবং
if(number%2!=0) এই শর্তটি মিথ্যা হবে। তাই কম্পাইলার এখানে কোন কাজ করবে না। return 0; তে চলে যাবে। এবং প্রোগ্রাম বন্ধ হয়ে যাবে।
 আবার, যদি প্রথম শর্ত মিথ্যা হয় তবে 
if(number%2==0) এখানে কম্পাইলার কোন আউটপুট দিবে না, ২য় if এ চলে যাবে।
যদি ২য় if সত্য হয় তবে Number is Odd এই অউটপুট দিবে।
 আর যদি ২য় শর্ত ও মিথ্যা হয় তাহলে কি হবে? তাহলে কম্পাইলার return 0 তে চলে যাবে , এবং কোনকিছুই আউটপুট দিবে না।
 উপরের প্রোগ্রামটি আমরা নিচের মতো করেও লিখতে পারিঃ

#include <stdio.h>
int main()
{
    
    int number;

    scanf("%d",&number);

    if(number%2==0)
    {
        printf("Number is Even\n");
    }
    else
    {
        printf("Number is Odd\n");
    }

    return 0;
}
এই প্রোগ্রামটা ঠিক আগের প্রোগ্রামের মতই কাজ করবে। এবং প্রোগ্রাম দুটিও প্রায় একই রকম। পার্থক্যটা হলো Program 2.8 এর ২য় শর্ত if(number%2!=0) টা বদলে Program 2.9 এ আমরা শুধু else ব্যবহার করেছি। তাতে আমাদের প্রোগ্রামটা আগের থেকে আরোও সিম্পল এবং efficient
হয়েছে।

কারণ যদি ১ম শর্ত সত্য হয় তাহলে এখন আর কম্পাইলার ২য় শর্ত চেক করবে না, return 0; তে চলে যাবে, এবং প্রোগ্রাম বন্ধ হয়ে যাবে।
আর যদি ১ম শর্ত মিথ্যা হয় তাহলে ২য় শর্ত মানে else এ চলে যাবে , এবং else এর ভিতরে যে কমান্ড দেওয়া হএছে সে অনুযায়ী আউটপুট দেবে।

তোমার জন্য একটা কাজ রয়েছে তা হলো, উপরের সব প্রোগ্রাম 2.9 এর আগ পর্যন্ত যা দেওয়া হয়েছে তা efficient করে লেখা।
 কিছু নির্দেশনাঃ
১/ শর্ত যদি একটা হয় তবে একটা মাত্র if ব্যবহার করবে।
২/ শর্ত যদি দুইটা হয় তবে একটা if এবং একটা else ব্যবহার করবে।
৩/ শর্ত যদি তিনটা হয় তবে একটা if এবং একটা else if এবং একটা else ব্যবহার করবে।
 ৪/ শর্ত যদি চারটা হয় তবে একটা if এবং দুইটা else if এবং একটা else ব্যবহার করবে।
 ৫/শর্ত যদি পাঁচটা টা হয় তবে একটা if এবং তিনটা else if এবং একটা else ব্যবহার করবে।
 এবার তুমিই বলো ছয়টা শর্তের জন্য কি হবে? একটা if এবং চারটা else if এবং একটা else তাই তো।
তার মানে যতোগুলো শর্ত তার প্রথমটা if শেষেরটা else আর মধ্যের সবগুলো এর জন্য else if ব্যবহার করবে, তখন তোমার প্রোগ্রাম সুন্দরভাবে কাজ করবে এবং দক্ষ হবে।
আজ এ পর্যন্ত কোন কিছু না বোঝলে অবশ্যই কমেন্ট করবে।

Happy Coding :)

Wednesday, 30 August 2017

লজিক্যাল স্টেটমেন্ট (if ,else if and else)

কোন সমস্যাকে যুক্তির ভিত্তিতে সমাধান করতে আমরা if , else if , else ব্যবহার করি । এদেরকে লজিক্যাল স্টেট্মেন্ট বলা হয়।


যেমন: if ব্যবহার করে সমাধান করা যায় এমন একটি প্রোগ্রাম আমরা দেখবো,

#include <stdio.h>
int main( )
{
    int number;
    scanf("%d", &number);
    if(number == 10)
    {
        printf("This is Ten\n");
    }
    return 0;
}

উপরের প্রোগ্রামে আমরা number নামের ভেরিয়েবলটির মধ্যে একটি মান ইনপুট নিয়েছি । তারপর চেক করেছি আমাদের ইনপুট নেওয়া নাম্বারটি ১০ কি না?! যদি ১০ হয় তাহলে প্রোগ্রামটি This is Ten লেখাটি প্রিন্ট করবে।
আর যদি ইনপুট নেওয়া নাম্বারটি ১০ না হয় তাহলে কি হবে ?
প্রোগ্রাম রান করবে ঠিকই কিন্তু কিছুই প্রিন্ট করবে না।
কিন্তু আমরা চাই , নাম্বারটি ১০ না হলে যাতে কম্পিউটার আমাদের জানিয়ে দেয় যে এটি ১০ না। তাহলে , নিচের প্রোগ্রামটি দেখোঃ


#include <stdio.h>
int main( )
{
    int number;
    scanf("%d", &number);
    if(number == 10)
    {
        printf("This is Ten\n");
    }
    else
    {
        printf("This is not Ten\n");
    }
    return 0;
}
এবার কিন্তু ১০ ইনপুট না দিলে আমরা অউটপুট হিসেবে This is not Ten এই লেখাটি দেখতে পাবো! এবার চলো প্রোগ্রামটি কিভাবে কাজ করছে দেখে নেয়া যাক।
প্রথমে প্রোগ্রামটি রান করার পর ইউসারের কাছে একটি নাম্বার ইনপুট চাইবে, ধরে নাও আমরা 10 ইনপুট দিয়েছি, তাহলে প্রোগ্রামটি if(number == 10) এই লাইনে আসার পর দেখবে number এর মান 10 কিনা, যেহেতু আমরা 10 ইনপুট দিয়েছি তাই if(number == 10) কথাটি সত্য, সুতরাং This is Ten প্রিন্ট করবে।
আর যদি আমরা 10 ইনপুট না দিয়ে অন্য কিছু দিতাম? মনেকরো 20 ইনপুট দিলাম তাহলে প্রোগ্রামটি if(number == 10) এই লাইনে আসার পর দেখবে number এর মান 10 কিনা, যেহেতু আমরা 20 ইনপুট দিয়েছি তাই if(number == 10) কথাটি মিথ্যা, এখন প্রোগ্রামটি else এ চলে যাবে, এবং দেখবে সেখানে printf(“This is not Ten\n”); এই স্টেমেন্ট রয়েছে সুতরাং This is not Ten প্রিন্ট করবে।
 আচ্ছা আমরা এখন চাই আমরা যে মান ইনপুট দিবো সেই মান স্ক্রিনে দেখাবে, অনেকটা এই রকম যদি ১০ ইনপুট দেই তাহলে লেখাটা আসবে This is number 10.
 হয়তো ভাবছো Ten এর জায়গায় 10 লিখে দিলেই তো হয় কিন্তু মজাটা হচ্ছে এবার আমরা এ ব্যপার টা কম্পিউটারের হাতে ছেড়ে দিবো। তাহলে নিচের প্রোগ্রামটি লিখে ফেলো ঝটপটঃ


#include <stdio.h>

int main( )
{
    int number;
    scanf("%d", &number);
    if(number == 10)
    {
        printf("This is %d\n",number);
    }
    else
    {
        printf("This is not %d\n",number);
    }
    return 0;
}


যেহেতু number একটি ইন্টিজার টাইপ ভেরিয়েবল তাই ফরম্যাট স্পেসিফায়ার হিসেবে আমরা %d ব্যবহার করেছি।
যদি আমরা number ভেরিয়েবল টা ডাবল টাইপের নিতাম তাহলে ফরম্যাট স্পেসিফায়ার হিসেবে %lf ব্যবহার করতাম । পরের কোন পোস্টে ফরম্যাট স্পেসিফায়ার নিয়ে বিস্তারিত আলোচনা করবো।