Computers · May 6, 2021 2

7. Decision Making Statements -1(খাঁটি বাংলায় if-else!)

টাইটেল দেখেই বোঝা যাচ্ছে এখানে Decision Making মানে সঠিক ভাবে সিদ্ধান্ত নেওয়ার ব্যপার স্যপার জড়িত। বাস্তব জীবনে সঠিক সময়ে সঠিক সিদ্ধান্ত নেওয়া খুব কঠিন ব্যাপার হলেও কম্পিউটারের কাছে এটা পানির মত সহজ। আচ্ছা তো আমরা সাধারনত সিদ্ধান্ত নিই কোনো শর্তের উপর নির্ভর করে।
যেমন: এমন হতে পারে যে, সে আসলে আমি তার সাথে ঢাকা যাব আর না আসলে যাবোনা। অথবা এমনও হতে পারে যে সে আসলে আমি তার সাথে ঢাকা যাব আর না আসলে আমি একা একা বাইরে থেকে একটু হেঁটে আসবো।

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

কম্পিউটারেরও বেলায়ও তার কাজবাজ, হিসাব নিকাশের জন্য নানা রকম সিদ্ধান্ত নিতে হয়। যেমন, ‘শূন্য’ বড় নাকি ‘মাইনাস এক’ বড়। ‘শূন্য’ বড় হলে কোডটা নিয়ে দৌড়াব মানে রান করব আর ‘মাইনাস এক’ বড় হলে কোড রান করা থামিয়ে দেব অথবা এরর দেখাব ইত্যাদি ইত্যাদি।

তো কোডের মধ্যে আমরা ব্যাপার গুলোকে এভাবে লিখি:

যদি (সে আসে)
{
    "আমি তার সাথে ঢাকা যাব";
}
অথবা যদি (সে না আসে)
{
    "ঢাকা যাওয়া আমার হলো নাহ!";
}

এটার কোডীয় রুপ হল:

if (he comes)
{
    cout<<"I'll go to Dhaka with him";
}
else if (he doesn't come)
{
    cout<<"I'll not go to Dhaka!";
}

এখন নিচের কোডটা দেখি,

যদি (চাল < ৫)        
{
    cout<<"এই সপ্তাহে চাল কিনবো";
}
অথবা যদি (চাল > ৫)     
{
    cout<<"এই সপ্তাহে চাল কিনবো না!";
}

বা,

if (rice < 5)
{
    cout<<"I'll buy some rice in this week";
}
else if (rice > 5)
{
    cout<<"I won't buy any rice in this week!";
}

এখানে, ‘<‘ এটা হল ‘লেস দ্যান’ sign যা একটা জিনিস থেকে অন্য জিনিসের পরিমান অপেক্ষাকৃত ‘কম’ বা ‘ছোট’ বোঝাতে ব্যবহার করা হয় অর্থাৎ এখানে চালের পরিমান ৫ কেজির থেকে কম;
আর ‘>’ এটা হল ‘গ্রেটার দ্যান’ sign যা একটা জিনিস থেকে অন্য নিজিসের পরিমান অপেক্ষাকৃত ‘বেশি’ বা ‘বড়’ বোঝাতে ব্যবহার করা হয় অর্থাৎ এখানে চালের পরিমান ৫ এর থেকে বেশি;
আর “এই সপ্তাহে চাল কিনবো”, “এই সপ্তাহে চাল কিনবো না” এসব হল একাধিক character বা letter বা অক্ষরের সমাবেশ বা string টাইপের ডেটা আর আমরা আগেই দেখেছি string টাইপের ডেটাকে double quotation mark (” “) এর মধ্যে রাখতে হয়।
নিচের কোড লিখে কম্পাইল ও রান করি:

কিন্তু দুঃখের বিষয় হলো প্রথম কোডের আউটপুটেই ব্ল্যাংক আসতেছে, কারন কি? কারন হলো:
এখানে প্রথমে rice নামের integer টাইপের একটা variable নিয়েছি এবং তার ভ্যালু কিবোর্ড থেকে নেওয়ার জন্য কমান্ড দিয়েছি, তারপর rice নামের ভ্যারিয়েবলের মধ্যে ৫ ইনপুট নিয়েছি, তারপর শর্ত দিয়েছি “যদি rice ৫ এর চেয়ে ছোট হয়” বা “৫<৫” হয় কিন্তু ৫ তো ৫ এর চেয়ে ছোট না অর্থাৎ শর্তটি মিথ্যা তাই কম্পাইলার ওই ব্লকের মধ্যে ঢুকেনি তাই সে কোনো কিছু প্রিন্ট করেনি। তাহলে উপায়? নিচের কোডে উপায় আছে দেখি:

এখানে ৬ ইনপুট নেওয়ার পর ৬<৫ শর্তটি মিথ্যা হয়েছে তাই ওই ব্লকের কাজ না হয়ে ‘else if বা ‘অথবা যদি’র শর্তটি চেক করেছে এবং এখানে ৬>৫ শর্তটি সত্য তাই ওই ব্লকের ভিতের কাজটি সম্পন্ন হয়েছে অর্থাৎ “I won’t buy any rice in this week” প্রিন্ট করেছে। কিন্তু rice এর ভ্যালু ৫ নিলে কি হয় আর কেন হয় তা নিজেরা ভেবে চিন্তে ও বিচার বিশ্লেষন করে খুঁজে বের করি।

এখন তাহলে নিচের কোডটা সহজেই বুঝতে পারব,

if (-1 < 0)
{
    cout<<"This code will execute";
}
else
{
    cout<<"This is an error!";
}

এখানে খেয়ালযোগ্য একটা ব্যাপার আছে, দ্বিতীয় কনডিশনে else if ব্যবহার না করে শুধু else ব্যবহার করা হয়েছে (কম্পাইলার কি আমার এই কোড মেনে নিবে গাইজ!)
সেটা বোঝার জন্য নিজেরদের কোড লিখে কম্পাইল ও রান করে দেখাটা জরুরি। আসলে কম্পাইলার তো উপর থেকে নিচের দিকে কোড পড়ে আর একটা একটা করে শর্ত চেক করতে করতে নিচের দিকে আসে, তারপর যদি কোনো শর্তই সত্য না পায় তাহলে সে কি করে সেটা নিচের কোড ও তার কাজ দেখে বুঝে নিই:

if (rice < 10)
{
   cout<< "I'll buy some rice in this week";
}
else if (rice == 10)
{
   cout<<"I'll buy some rice in the next week";
}
else
{
   cout<<"I won't buy any rice in this month!";
}

এখানে প্রত্যেকটা শর্ত চেক করে করে যদি কোনো শর্তই সত্য না হয় তাহলে else ব্লকের মধ্যে গিয়ে সেই মত কাজ করবে। নিচের কোড লিখে কম্পাইল ও রান করে দেখলে বিষয়টা আরো পরিষ্কার হবে:

এখানে আসলে কি ঘটতেছে, decision making টা কিছু শর্তের উপর ডিপেন্ড করতেছে, উপরে if (rice < 10) অর্থাৎ চাল যদি ১০ কেজির কম হয় তাহলে ওই ব্লকের ভিতরের কাজটা সম্পন্ন হবে তারমানে ব্লকের ভিতরের কাজটা সম্পন্ন হওয়ার জন্য চাল ১০ কেজির কম এই শর্তটা আগে সত্য হতে হবে। যদি প্রথম শর্তটি সত্য না হয় তাহলে কম্পাইলার ২য় শর্তটি সত্য কিনা যাচায় করবে। ২য় শর্তটি সত্য হলে ২য় ব্লকের ভিতরের কাজটা সম্পন্ন হবে। এভাবে যতগুলো else if দেখবে ততগুলো শর্ত চেক করবে যে কোনোটা সত্য কিনা যখনই কোনো শর্ত সত্য দেখবে তাৎক্ষনাৎ ওই ব্লকের মধ্যে ঢুকে ওই ব্লকের মধ্যকার সিদ্ধান্তনুযায়ী কাজটা করে ফেলবে। এবং কাজ শেষে ব্লক থেকে বের হয়ে আসবে এবং সমাপ্তি ঘোষনা করবে। কিন্তু বারবার জান প্রান দিয়ে খুঁজে খুঁজেও যদি কোনো সত্যবতী মানে সত্য শর্ত রে খুজে না পায় তাহলে কি হবে? তাহলে সবার শেষে else ব্লকের ভিতরে ঢুকে ওই কাজটা করে ব্লক থেকে বের হয়ে আসবে যেমন, উপরের কোডে rice এর ভ্যালু ১২ নিয়েছি তারপর চেক করলাম ১২<১০ মিথ্যা তাই কম্পাইলার ওই ব্লকের মধ্যে না গিয়ে ২য় শর্ত ১২==১০ চেক করল কিন্তু দেখলো এটাও মিথ্যা তাই সবশেষে সে else ব্লকে গিয়ে সেই মতো কাজ করে এই সব checking meking শেষ করলো।

খুব তো বুঝলাম। কিন্তু যদি একের অধিক শর্ত সত্য হয় তাহলে কি হবে? সিপ্লাসপ্লাস ল্যাংগুয়েজে কম্পাইলার তো উপর থেকে কোড পড়তে পড়তে নিচের দিকে আসে। তো কম্পাইলার উপর থেকে কোড পড়তে পড়তে যখনই কোনো শর্ত সত্য পেয়ে যাবে তখনই ওই শর্তের বা কন্ডিশনের ব্লকের ভিতরে ঢুকবে এবং ওই কাজটা করে ব্লক থেকে বের হয়ে আসবে এবং সমাপ্তি ঘোষনা করবে। পরের আর কোনো কন্ডিশন চেকই করবেনা। নিচের কোডটি দেখি:

এখানে keyboard থেকে ১২ নিয়ে a এর মধ্যে রেখেছি তারপর প্রথম কন্ডিশনে চেক করেছি যে a অর্থাৎ ১২ শুন্য থেকে বড় কিনা আবার দ্বিতীয় কন্ডিশনে চেক করেছি যে a অর্থাৎ ১২ কে ২ দিয়ে ভাগ করে ভাগশেষ শুন্যের সমান হয় কিনা অর্থাৎ ১২ জোড় সংখ্যা কিনা আবার তৃতীয় কন্ডিশনে চেক করেছি যে a অর্থাৎ ১২, ১০০ এর চেয়ে ছোট কিনা। এখানে ১২ তিনটা শর্তই পুরন করে অর্থাৎ ১২ শুন্যের থেকে বড়, ১২ জোড় সংখ্যা, ১২, ১০০ এর চেয়ে ছোট সবগুলোই সত্য কিন্তু আউটপুটে দেখতে পাচ্ছি যে, 12 is positive number প্রিন্ট করেছে অর্থাৎ শুধু প্রথম ব্লকের কাজটি সম্পন্ন করেছে। তারমানে কম্পাইলার উপর থেকে কোড পড়তে পড়তে প্রথম যে সত্য শর্তটা পেয়েছে তখন সেই শর্তের বা কন্ডিশনের ব্লকের ভিতরে গিয়ে তার কাজটা করেছে, পরের আর কোনো কন্ডিশন চেকই করেনি।
তহলে মোরল অফ দ্যা ইফ – এলস হলো:

if(condition 1)
{
   if true
   execute block 1;
}
else if(condition 2)
{
   if condition 1 is false and 2 is true 
   execute block 2;
}
else if(condition 3)
{
   if condition 1 & 2 is false and 3 is true 
   execute block 3;
}
else
{  
   if false all of the above conditions
   execute block 4;
}

তারমানে হলো conditional logic এর ধারনাটা এভাবে কাজ করে:

পরবর্তিতে nested if esle নিয়ে কথা হবে।