কন্ডিশনাল স্টেটমেন্ট: সিদ্ধান্ত গ্রহণ ও লজিক

সি প্রোগ্রামিং কন্ডিশনাল লজিক: if, else, else if, nested if এবং switch case স্টেটমেন্ট ব্যবহার করে সিদ্ধান্ত গ্রহণমূলক প্রোগ্রাম তৈরি (লিপ ইয়ার, গ্রেড নির্ণয়)

শেখা শুরু করুন

কন্ডিশনাল স্টেটমেন্ট: সিদ্ধান্ত গ্রহণ ও লজিক (Conditional Statements)

  1. কন্ডিশনাল স্টেটমেন্ট: সিদ্ধান্ত গ্রহণ ও লজিক
  2. প্রোগ্রামের মোড়: সিদ্ধান্ত গ্রহণ
  3. if স্টেটমেন্ট (Simple if)
  4. if-else স্টেটমেন্ট
  5. else if ল্যাডার (Ladder)
  6. লজিক্যাল অপারেটরের ব্যবহার (&&, ||)
  7. প্রোগ্রাম: লিপ ইয়ার (Leap Year) নির্ণয়
  8. নেস্টেড if (Nested if)
  9. প্রোগ্রাম: ৩টি সংখ্যার মধ্যে বড় সংখ্যা নির্ণয়
  10. প্রোগ্রাম: জিপিএ বা গ্রেড নির্ণয় (Grade Sheet)
  11. switch স্টেটমেন্ট: if-else এর বিকল্প
  12. সারসংক্ষেপ (Summary)

কন্ডিশনাল স্টেটমেন্ট: সিদ্ধান্ত গ্রহণ ও লজিক

এই লেকচার শেষে আমরা-

১। কন্ডিশনাল স্টেটমেন্ট (if, else) এর কাজ ব্যাখ্যা করতে পারব।
২। রিলেশনাল ও লজিক্যাল অপারেটর ব্যবহার করে শর্ত তৈরি করতে পারব।
৩। else if ল্যাডার ব্যবহার করে গ্রেড নির্ণয়ের মতো সমস্যা সমাধান করতে পারব।
৪। নেস্টেড if (শর্তের ভেতর শর্ত) এবং switch স্টেটমেন্টের ব্যবহার বুঝতে পারব।

হ্যালো স্টুডেন্টস! কেমন আছো তোমরা সবাই? আশা করি সবাই খুব ভালো আছো। আজকে আমরা সি প্রোগ্রামিংয়ের অত্যন্ত গুরুত্বপূর্ণ এবং ইন্টারেস্টিং একটা টপিক নিয়ে আলোচনা করব—সেটা হলো কন্ডিশনাল স্টেটমেন্ট বা সিদ্ধান্ত গ্রহণ। প্রোগ্রামিংয়ে শুধু যোগ-বিয়োগ করলেই হয় না, কম্পিউটারকে বুদ্ধি খাটিয়ে সিদ্ধান্ত নিতে শেখাতে হয়। এই লেকচার শেষে আমরা কন্ডিশনাল স্টেটমেন্টের পুরো কনসেপ্ট ক্লিয়ার করব। আমরা if, else এর ব্যবহার শিখব, লজিক্যাল অপারেটর দিয়ে জটিল শর্ত তৈরি করা দেখব, এবং কীভাবে একাধিক শর্ত যাচাই করে গ্রেড নির্ণয় করা যায় তা জানব। চলো শুরু করা যাক!

প্রোগ্রামের মোড়: সিদ্ধান্ত গ্রহণ

বাস্তব জীবনের সিদ্ধান্ত:
মনে করো তুমি রিকশায় করে যাচ্ছ। সামনে একটা তিন রাস্তার মোড়।
- বামে গেলে স্কুল
- ডানে গেলে বাজার
- সোজা গেলে বাসা

তুমি কোনদিকে যাবে? এটা নির্ভর করে তোমার গন্তব্য বা শর্তের (Condition) ওপর।

প্রোগ্রামিংয়ে কন্ডিশন:
প্রোগ্রাম চলার সময়ও এমন মোড় আসে। কম্পিউটার চেক করে কোনো শর্ত সত্য কি না। সত্য হলে এক কাজ করে, মিথ্যা হলে অন্য কাজ। একেই Control Flow বলা হয়।

শুরুতেই একটা বাস্তব উদাহরণ দিয়ে বোঝা যাক। স্লাইডে ছবিটা খেয়াল করো। মনে করো তুমি একটা রিকশায় বসে আছো এবং সামনে তিন রাস্তার মোড়। এখন তুমি কোনদিকে যাবে? এটা কিন্তু এমনি এমনি ঠিক হয় না। যদি তোমার স্কুল খোলা থাকে, তুমি বামে যাবে। যদি মা বাজার করতে বলেন, ডানে যাবে। আর যদি কোনো কাজ না থাকে, সোজা বাসায় চলে যাবে। অর্থাৎ, তোমার সিদ্ধান্ত নির্ভর করছে একটা 'শর্ত' বা Condition এর ওপর। প্রোগ্রামিংয়েও কম্পিউটার ঠিক এভাবেই কাজ করে। কোড চলার সময় কম্পিউটার চেক করে—'এই শর্তটা কি সত্য?' যদি সত্য হয়, তাহলে সে এক পথে যায়। আর মিথ্যা হলে অন্য পথে। একেই আমরা বলি কন্ডিশনাল লজিক বা কন্ট্রোল ফ্লো।

if স্টেটমেন্ট (Simple if)

গঠন (Syntax):

if (condition) {
    // code to execute if condition is true
}

উদাহরণ:
যদি নম্বর ৩৩ বা তার বেশি হয়, তবে 'Pass' দেখাবে।

if (mark >= 33) {
    printf("You Passed");
}
  • শর্ত সত্য (True) হলে ব্র্যাকেটের ভেতরের কোড কাজ করবে।
  • মিথ্যা (False) হলে কম্পিউটার চুপচাপ পরের লাইনে চলে যাবে।

সবচেয়ে সহজ কন্ডিশনাল স্টেটমেন্ট হলো 'if'। এর বাংলা অর্থই হলো 'যদি'। সিনট্যাক্সটা দেখো—if লিখে প্রথম ব্র্যাকেটের মধ্যে আমরা শর্তটা দিই। এরপর সেকেন্ড ব্র্যাকেটের মধ্যে থাকে সেই কাজটা, যেটা শর্ত সত্য হলে করা হবে। ফ্লোচার্টটা লক্ষ্য করো—ডায়মন্ড শেপটা হলো কন্ডিশন। যদি শর্ত সত্য বা True হয়, তবেই আমরা অ্যাকশন বক্সে যাই। আর যদি মিথ্যা বা False হয়, তবে আমরা পাশ কাটিয়ে চলে যাই। উদাহরণস্বরূপ, পরীক্ষায় পাস মার্ক ৩৩। আমরা লিখব `if (mark >= 33)`। যদি তোমার নম্বর ৩৩ বা তার বেশি হয়, কম্পিউটার স্ক্রিনে 'You Passed' দেখাবে। আর যদি ৩৩ এর কম পাও? কম্পিউটার কিছুই বলবে না, চুপচাপ পরের লাইনে চলে যাবে। কারণ আমরা তো তাকে বলিনি ফেইল করলে কী করতে হবে!

if-else স্টেটমেন্ট

গঠন (Syntax):

if (condition) {
    // সত্য হলে এই অংশ কাজ করবে
} else {
    // মিথ্যা হলে এই অংশ কাজ করবে
}

উদাহরণ: জোড়-বিজোড় সংখ্যা (Even/Odd)

if (num % 2 == 0) {
    printf("Even");
} else {
    printf("Odd");
}
  • else মানে 'অন্যথায়'।
  • শর্ত সত্য হলে if ব্লক, আর মিথ্যা হলে else ব্লক কাজ করবে।

এখন প্রশ্ন হলো, যদি পাস না করি, তবে তো ফেইল দেখাও দরকার, তাই না? শুধু if দিয়ে সেটা হচ্ছিল না। এখানেই আসে `if-else`। `else` মানে হলো 'অন্যথায়'। মানে, যদি শর্ত সত্য হয় তো ভালো, প্রথম কাজটা করো। আর যদি মিথ্যা হয়? তাহলে else এর ভেতরের কাজটা করো। ফ্লোচার্টটা দেখো—এখানে রাস্তা দুটো ভাগে ভাগ হয়ে গেছে। সত্য হলে এক পথে, মিথ্যা হলে আরেক পথে। যেমন ধরো, একটা সংখ্যা জোড় না বিজোড় সেটা বের করব। সংখ্যাটিকে ২ দিয়ে ভাগ করলে যদি ভাগশেষ ০ হয় (`num % 2 == 0`), তবে সেটা জোড় বা Even। আর যদি না হয়? মানে ভাগশেষ ১ থাকে? তাহলে সেটা অবশ্যই বিজোড় বা Odd। এখানে কম্পিউটারকে আর আলাদা করে বলে দিতে হয় না যে বিজোড় কখন হবে, সে `else` পেলেই বুঝে নেয়।

else if ল্যাডার (Ladder)

একাধিক শর্ত যাচাই (Multiple Conditions):
যখন আমাদের হাতে দুইয়ের অধিক অপশন থাকে, তখন আমরা else if ব্যবহার করি।

উদাহরণ: দুটি সংখ্যা $a$ ও $b$ এর তুলনা।
১. $a > b$ হতে পারে
২. $a < b$ হতে পারে
৩. অথবা $a == b$ হতে পারে

if (a > b) {
    printf("A is greater");
}
else if (a < b) {
    printf("B is greater");
}
else {
    printf("Both are equal");
}

এটি মইয়ের (Ladder) মতো ধাপে ধাপে কাজ করে।

আচ্ছা, যদি আমাদের হাতে দুইটা অপশন না থেকে তিনটা বা তার বেশি অপশন থাকে? তখন শুধু if-else দিয়ে কাজ হবে না। তখন আমাদের লাগে `else if` ল্যাডার। ল্যাডার মানে মই—আমরা যেমন মই বেয়ে ধাপে ধাপে নামি, কম্পিউটারও এখানে ধাপে ধাপে শর্ত চেক করে। ধরো, দুটি সংখ্যা a এবং b এর মধ্যে তুলনা করব। তিনটা ঘটনা ঘটতে পারে—a বড় হতে পারে, b বড় হতে পারে, অথবা দুটো সমান হতে পারে। প্রথমে `if` দিয়ে চেক করব a > b কি না। যদি সত্য হয়, গল্প শেষ। যদি না হয়, তখন কম্পিউটার পরের ধাপে বা `else if`-এ যাবে এবং চেক করবে a < b কি না। তাও যদি না হয়? তখন শেষে `else` দিয়ে বলে দেব যে তারা অবশ্যই সমান। মনে রাখবে, এই ল্যাডারের যেকোনো একটা শর্ত সত্য হলেই কম্পিউটার বাকিগুলো আর চেক করে না।

লজিক্যাল অপারেটরের ব্যবহার (&&, ||)

জটিল শর্ত তৈরি করতে লজিক্যাল অপারেটর ব্যবহৃত হয়।

অপারেটর নাম কাজ উদাহরণ
&& AND দুটি শর্তই সত্য হতে হবে (a>b && a>c)
|| OR যেকোনো একটি সত্য হলেই হবে (ch=='a' || ch=='e')
! NOT সত্যকে মিথ্যা, মিথ্যাকে সত্য করে !(a>b)

বাস্তব উদাহরণ:
- AND: স্কলারশিপ পেতে জিপিএ ৫ এবং ৯০% উপস্থিতি লাগবে।
- OR: পার্কে ঢুকতে টিকিট অথবা মেম্বারশিপ কার্ড লাগবে।

মাঝে মাঝে এক শর্তে কাজ হয় না, একাধিক শর্ত জোড়া লাগাতে হয়। তখন আমরা লজিক্যাল অপারেটর ব্যবহার করি। স্লাইডে দেখো, দুই ধরনের প্রধান অপারেটর আছে—AND এবং OR। AND অপারেটর (`&&`) অনেকটা কড়া হেডমাস্টারের মতো—সব শর্ত মানলেই কেবল সে সত্য বলবে। যেমন, স্কলারশিপ পেতে হলে তোমাকে জিপিএ ৫ পেতে হবে এবং (AND) ক্লাসে ৯০% উপস্থিতি থাকতে হবে। দুটোই থাকা লাগবে, একটা মিস হলে হবে না। অন্যদিকে OR অপারেটর (`||`) বেশ নমনীয়। যেমন, পার্কে ঢুকতে হলে তোমার কাছে টিকিট থাকতে হবে অথবা (OR) মেম্বারশিপ কার্ড থাকতে হবে। যেকোনো একটা থাকলেই তুমি ঢুকতে পারবে। প্রোগ্রামে আমরা এই চিহ্নগুলো ব্যবহার করে অনেক বড় বড় লজিক খুব সহজে লিখে ফেলি।

প্রোগ্রাম: লিপ ইয়ার (Leap Year) নির্ণয়

লজিক্যাল অপারেটরের একটি ক্লাসিক উদাহরণ।

লজিক:
একটি বছর লিপ ইয়ার হবে যদি-
১. বছরটি ৪০০ দিয়ে ভাগ যায়।
অথবা
২. বছরটি ৪ দিয়ে ভাগ যায় এবং ১০০ দিয়ে ভাগ না যায়।

কোড:

int year;
scanf("%d", &year);

if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {
    printf("Leap Year");
} else {
    printf("Not Leap Year");
}

লজিক্যাল অপারেটরের সবচেয়ে চমৎকার উদাহরণ হলো লিপ ইয়ার বের করা। এই কোডটা প্রায়ই আমাদের কনফিউজ করে, কিন্তু লজিকটা বুঝলে খুব সহজ। একটা বছর লিপ ইয়ার হওয়ার দুটো রাস্তা আছে। প্রথম রাস্তা: বছরটা যদি ৪০০ দিয়ে নিঃশেষে বিভাজ্য হয় (যেমন ২০০০ সাল), তবে সেটা লিপ ইয়ার। দ্বিতীয় রাস্তা: যদি সেটা ৪ দিয়ে ভাগ যায় কিন্তু ১০০ দিয়ে ভাগ না যায় (যেমন ২০১২ সাল)। ১০০ দিয়ে ভাগ গেলে সেটা সেঞ্চুরি ইয়ার হয়ে যায়, তখন আবার ৪০০ দিয়ে ভাগ যাওয়া লাগে। তাই আমরা কোডে লিখেছি: `(year % 400 == 0)` অথবা `||` `(year % 4 == 0 && year % 100 != 0)`। ভিডিওটা একটু পজ করে এই কন্ডিশনটা ভালো করে খেয়াল করো, ব্র্যাকেটগুলো কোথায় দেওয়া হয়েছে সেটা দেখো।

নেস্টেড if (Nested if)

সংজ্ঞা:
একটি if ব্লকের ভেতরে যখন আরেকটি if ব্যবহার করা হয়, তাকে Nested if বলে।

উদাহরণ: লগইন সিস্টেম
১. প্রথমে ইউজারনেম চেক করুন।
২. ইউজারনেম ঠিক থাকলে, পাসওয়ার্ড চেক করুন।

if (username_ok) {
    if (password_ok) {
        printf("Login Successful");
    } else {
        printf("Wrong Password");
    }
} else {
    printf("User Not Found");
}

নেস্টেড if মানে হলো একটা শর্তের পেটের ভেতর আরেকটা শর্ত। ছবির মতো চিন্তা করো—একটা বড় বাক্সের ভেতর আরেকটা ছোট বাক্স। একে বলে 'নেস্টিং'। বাস্তব উদাহরণ দেই—ফেসবুক লগইন। যখন তুমি লগইন করো, সিস্টেম প্রথমে দেখে তোমার ইউজারনেম বা ইমেইল ঠিক আছে কি না। যদি ঠিক থাকে (মানে প্রথম if সত্য হয়), তবেই সে চেক করে পাসওয়ার্ড ঠিক আছে কি না (ভেতরের if)। যদি ইউজারনেমই ভুল হয়, তবে পাসওয়ার্ড চেক করার কোনো দরকারই নেই, সে সরাসরি `else`-এ চলে গিয়ে বলবে 'User Not Found'। অর্থাৎ, ভেতরের শর্তটা বাইরের শর্তের ওপর নির্ভরশীল। এটাই নেস্টেড if এর মূল কনসেপ্ট।

প্রোগ্রাম: ৩টি সংখ্যার মধ্যে বড় সংখ্যা নির্ণয়

লজিক্যাল অপারেটর ব্যবহার করে খুব সহজে এই প্রোগ্রামটি করা যায়।

#include <stdio.h>
int main() {
    int a, b, c;
    printf("Enter 3 numbers: ");
    scanf("%d %d %d", &a, &b, &c);

    if (a >= b && a >= c) {
        printf("%d is Largest", a);
    }
    else if (b >= a && b >= c) {
        printf("%d is Largest", b);
    }
    else {
        printf("%d is Largest", c);
    }
    return 0;
}

চলো এবার একটা পূর্ণাঙ্গ সি প্রোগ্রাম দেখি। তিনটি সংখ্যার মধ্যে সবচেয়ে বড়টা বের করতে হবে। আমরা এখানে `else if` ল্যাডার এবং `&&` অপারেটর দুটোই ব্যবহার করব। লজিকটা খুব সিম্পল। যদি a, b এর চেয়ে বড় হয় এবং (&&) a, c এর চেয়েও বড় হয়, তবে নিঃসন্দেহে a সবচেয়ে বড়। আমরা সেটাই প্রথম `if`-এ লিখেছি। যদি এটা না হয়, তবে আমরা পরের ধাপে `else if`-এ গিয়ে b কে চেক করব। যদি b, a এবং c উভয়ের চেয়ে বড় হয়, তবে b বড়। আর যদি ওপরের দুটোর কোনোটাই সত্য না হয়? তাহলে চোখ বন্ধ করে বলে দেওয়া যায় c সবচেয়ে বড়, তাই শেষে শুধু `else`। তোমরা কোডটা খাতায় লিখে প্র্যাকটিস করবে।

প্রোগ্রাম: জিপিএ বা গ্রেড নির্ণয় (Grade Sheet)

গ্রেড শিট তৈরির জন্য else if ল্যাডার আদর্শ।

if (mark >= 80) {
    printf("A+");
}
else if (mark >= 70) {
    printf("A");
}
else if (mark >= 60) {
    printf("A-");
}
else if (mark >= 50) {
    printf("B");
}
else if (mark >= 33) {
    printf("Pass");
}
else {
    printf("Fail");
}

সতর্কতা: ক্রম বা Order ঠিক রাখা জরুরি (বড় থেকে ছোট)।

তোমাদের রেজাল্ট কার্ডে যে গ্রেড আসে, সেটা কীভাবে হিসাব হয়? ঠিক এই `else if` ল্যাডার ব্যবহার করে। এখানে আমরা একটা রেঞ্জ বা সীমা চেক করি। কোডটা খেয়াল করো। প্রথমে আমরা চেক করছি নম্বর ৮০ বা তার বেশি কি না। যদি হয়, তবে A+ প্রিন্ট করবে এবং ল্যাডার থেকে বেরিয়ে যাবে। যদি না হয়, তখন সে চেক করবে ৭০ এর বেশি কি না। এভাবে ধাপে ধাপে নিচে নামবে। একটা জরুরি টিপস দেই—এই ল্যাডারে ক্রম বা Order খুব গুরুত্বপূর্ণ। তুমি যদি প্রথমেই `mark >= 33` চেক করতে, তবে ৮০ পেলেও সে 'Pass' প্রিন্ট করে বেরিয়ে যেত, কারণ ৮০ তো ৩৩ এর চেয়ে বড়ই! তাই সবসময় বড় শর্ত থেকে ছোট শর্তের দিকে যেতে হয় গ্রেড শিট তৈরির সময়।

switch স্টেটমেন্ট: if-else এর বিকল্প

switch স্টেটমেন্ট সাধারণত মেনু বেসড প্রোগ্রামে ব্যবহৃত হয়।

সিনট্যাক্স:

switch (expression) {
    case value1:
        // code
        break;
    case value2:
        // code
        break;
    default:
        // default code
}
  • break: কোড এখান থেকে থামিয়ে বের হওয়ার জন্য।
  • default: যদি কোনো case না মিলে।

লেকচার শেষ করার আগে আরেকটা ছোট কিন্তু কাজের টপিক—Switch Statement। অনেক সময় অনেকগুলো if-else লিখলে কোড দেখতে হিজিবিজি লাগে। তখন আমরা switch ব্যবহার করি। এটা অনেকটা ইলেকট্রিক সুইচবোর্ডের মতো—যে সুইচ চাপবে, ঠিক সেই লাইটটাই জ্বলবে। এখানে `case` দিয়ে আমরা অপশনগুলো রাখি। ধরো ইউজার ১ চাপলে এক কাজ হবে, ২ চাপলে আরেক কাজ। একটা জিনিস খেয়াল রাখবে—প্রতিটা `case` এর শেষে `break` দিতে হয়। `break` না দিলে কম্পিউটার থামবে না, পরের `case`-এ ঢুকে যাবে। আর `default` হলো `else` এর মতো—যদি কোনো সুইচ বা `case` না মিলে, তখন এটা কাজ করবে।

সারসংক্ষেপ (Summary)

আজকের লেকচারে আমরা-

১। সিদ্ধান্ত গ্রহণ: if, else, else if এর ব্যবহার।
২। লজিক্যাল অপারেটর: && (AND), || (OR) দিয়ে জটিল শর্ত তৈরি।
৩। নেস্টেড লজিক: শর্তের ভেতর শর্ত প্রয়োগ।
৪। বাস্তব প্রয়োগ: লিপ ইয়ার, ম্যাক্সিমাম নম্বর এবং গ্রেড শিট প্রোগ্রাম।

পরবর্তী লেকচার: লুপ কন্ট্রোল স্টেটমেন্ট (Loop Control Statement)।

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

কন্ডিশনাল স্টেটমেন্ট: সিদ্ধান্ত গ্রহণ ও লজিক

পড়তে প্রায় 13 মিনিট

প্রোগ্রামিং সবসময় সরলরেখায় চলে না। আমাদের বাস্তব জীবনের মতো প্রোগ্রামকেও বিভিন্ন পরিস্থিতির ওপর ভিত্তি করে সিদ্ধান্ত নিতে হয়। ধরো, তুমি রিকশায় করে কলেজে যাচ্ছ। রাস্তায় জ্যাম থাকলে তুমি এক পথে যাবে, আর জ্যাম না থাকলে অন্য পথে। এই যে "জ্যাম আছে কি না?" - এই প্রশ্নের উত্তরের ওপর ভিত্তি করে তোমার পথ বা Decision বদলে যাচ্ছে, প্রোগ্রামিংয়ে একেই বলা হয় কন্ডিশনাল লজিক বা কন্ট্রোল ফ্লো (Control Flow)

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

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

প্রোগ্রামিংয়ের ভাষায়, যে সকল স্টেটমেন্ট বা নির্দেশ ব্যবহার করে শর্তসাপেক্ষে কোনো নির্দিষ্ট কাজ সম্পাদন করা হয় এবং প্রোগ্রামের প্রবাহ নিয়ন্ত্রণ করা হয়, তাকে কন্ডিশনাল স্টেটমেন্ট বা ডিসিশন মেকিং স্টেটমেন্ট বলে।

সংজ্ঞা (Definition): কন্ডিশনাল স্টেটমেন্ট হলো এমন এক ধরণের ইনস্ট্রাকশন সেট যা প্রোগ্রামকে একটি শর্ত (Condition) যাচাই করতে দেয় এবং সেই শর্ত সত্য (True) বা মিথ্যা (False) হওয়ার ওপর ভিত্তি করে ভিন্ন ভিন্ন কোড ব্লক এক্সিকিউট করে।

সি ল্যাঙ্গুয়েজে সিদ্ধান্ত গ্রহণের জন্য মূলত নিচের স্টেটমেন্টগুলো ব্যবহৃত হয়:
১. if statement (সাধারণ শর্ত)
২. if-else statement (দুটি বিকল্পের মধ্যে একটি)
৩. else if ladder (একাধিক বিকল্পের মধ্যে একটি)
৪. Nested if (শর্তের ভেতর শর্ত)
৫. switch statement (মেনু বা নির্দিষ্ট মান ভিত্তিক নির্বাচন)

if স্টেটমেন্ট (Simple if Statement)

এটি সবচেয়ে মৌলিক কন্ডিশনাল স্টেটমেন্ট। যখন আমাদের মাত্র একটি শর্ত যাচাই করতে হয় এবং শর্তটি সত্য হলেই কেবল কাজটি করতে হয় (মিথ্যা হলে কিছুই করার নেই), তখন আমরা শুধু if ব্যবহার করি।

গঠন (Syntax):

if (condition) {
    // শর্ত সত্য হলে এই কোডটুকু কাজ করবে
    statement;
}

এখানে condition সত্য হলে {} ব্লকের ভেতরের কাজ হবে, আর মিথ্যা হলে প্রোগ্রামটি if এর ব্লক এড়িয়ে পরবর্তী লাইনে চলে যাবে।

সতর্কতা (Warning):
অনেক শিক্ষার্থী ভুল করে if কন্ডিশনের শেষে সেমিকোলন (;) দিয়ে ফেলে, যেমন: if(x > 5);। এটি একটি বড় লজিক্যাল এরর। কারণ সেমিকোলন দেওয়া মানে কম্পাইলার মনে করে কন্ডিশনটি ওখানেই শেষ, এবং এর পরের ব্লকটি কন্ডিশন ছাড়াই সবসময় এক্সিকিউট হবে।

if-else এবং else if Ladder: একাধিক পথের সমাধান

বাস্তবে অধিকাংশ সিদ্ধান্তের দুটি দিক থাকে—হ্যাঁ অথবা না। যেমন: পাস নাকি ফেল? জোড় নাকি বিজোড়? এমন ক্ষেত্রে আমরা if-else ব্যবহার করি।

if-else গঠন:

if (condition) {
    // শর্ত সত্য হলে এই অংশ কাজ করবে
} 
else {
    // শর্ত মিথ্যা হলে এই অংশ কাজ করবে
}
else if Ladder (একাধিক শর্ত যাচাই)

যখন আমাদের সামনে দুইয়ের অধিক বিকল্প থাকে, তখন আমরা else if ল্যাডার ব্যবহার করি। যেমন: রেজাল্ট গ্রেডিং সিস্টেম (A+, A, A-, B...)।

else-if ladder flowchart

পরীক্ষার টিপস (Exam Tip):
else if ল্যাডারে শর্তের ক্রম (Order) অত্যন্ত গুরুত্বপূর্ণ। গ্রেড নির্ণয়ের প্রোগ্রামে মার্কস চেক করার সময় সবসময় বড় থেকে ছোট (যেমন: ৮০, ৭০, ৬০...) অথবা ছোট থেকে বড় ক্রমে সাজাতে হয়। এলোমেলো শর্ত দিলে লজিক ভুল হবে।

উদাহরণ: গ্রেড নির্ণয়
যদি আমরা ৮০ বা তার বেশি পেলে A+, ৭০ বা তার বেশি পেলে A... এভাবে সাজাই:

if (marks >= 80) {
    printf("A+");
}
else if (marks >= 70) {
    printf("A");
}
else if (marks >= 60) {
    printf("A-");
}
else {
    printf("Fail");
}

লক্ষ্য করো, এখানে প্রথমে ৮০ চেক করা হচ্ছে। যদি মার্কস ৭৫ হয়, প্রথম শর্ত মিথ্যা হবে, তখন সে দ্বিতীয় শর্তে (৭০ এর বেশি কি না) যাবে এবং সত্য হবে। যদি আমরা ক্রম ঠিক না রাখতাম, তবে ভুল আউটপুট আসত।

লজিক্যাল অপারেটর এবং লিপ ইয়ার (Leap Year) লজিক

জটিল শর্ত তৈরি করার জন্য আমাদের একাধিক রিলেশনাল এক্সপ্রেশনকে যুক্ত করতে হয়। এর জন্য Logical Operators ব্যবহৃত হয়।

অপারেটর নাম কাজ উদাহরণ
&& AND উভয় শর্ত সত্য হলে ফলাফল সত্য (True) (a>b) && (a>c)
|| OR যে কোনো একটি শর্ত সত্য হলে ফলাফল সত্য (True) (ch=='a') || (ch=='e')
! NOT সত্যকে মিথ্যা এবং মিথ্যাকে সত্য করে !(a>b)
লিপ ইয়ার নির্ণয়ের লজিক

লিপ ইয়ার বা অধিবর্ষ বের করার লজিকটি পরীক্ষায় প্রায়ই আসে। আমরা জানি, সাধারণত ৪ বছরে একবার লিপ ইয়ার হয়। কিন্তু সব ৪ দিয়ে বিভাজ্য বছর লিপ ইয়ার নয় (যেমন: ১৯০০ সাল লিপ ইয়ার ছিল না)।

সঠিক নিয়মটি হলো:
১. বছরটি ৪০০ দিয়ে বিভাজ্য হলে লিপ ইয়ার।
২. অথবা, বছরটি ৪ দিয়ে বিভাজ্য কিন্তু ১০০ দিয়ে বিভাজ্য নয়।

$$ \text{Leap Year Check:} \quad (\text{year} \% 400 == 0) \quad || \quad ((\text{year} \% 4 == 0) \quad \&\& \quad (\text{year} \% 100 != 0)) $$

উদাহরণ (Example):
ধরি, সালটি ২০২৪।
- এটি ৪০০ দিয়ে বিভাজ্য নয় (প্রথম অংশ মিথ্যা)।
- এটি ৪ দিয়ে বিভাজ্য (সত্য) এবং ১০০ দিয়ে বিভাজ্য নয় (সত্য)।
- যেহেতু OR (||) এর পরের অংশ সত্য, তাই ২০২৪ লিপ ইয়ার।

নেস্টেড if (Nested if): শর্তের ভেতরে শর্ত

যখন একটি শর্ত সত্য হওয়ার পর তার ভেতরে আরও একটি শর্ত যাচাই করার প্রয়োজন হয়, তখন তাকে Nested if বলে। এটি মূলত "শর্তের পেটে শর্ত"।

ব্যবহার: তিনটি সংখ্যার মধ্যে বৃহত্তম সংখ্যা নির্ণয় করতে নেস্টেড if খুব কার্যকর।

if (a > b) {
    if (a > c) {
        printf("A is largest");
    } else {
        printf("C is largest"); // কারণ a > b কিন্তু c > a, তাই c সবচেয়ে বড়
    }
} else {
    if (b > c) {
        printf("B is largest");
    } else {
        printf("C is largest");
    }
}

পার্থক্য (Difference):
else if ladder এ একটি শর্ত সত্য হলে বাকিগুলো চেক হয় না। কিন্তু সাধারণ if পরপর লিখলে প্রতিটি if চেক হয়। আর Nested if এ বাইরের শর্ত (Outer condition) মিথ্যা হলে ভেতরের শর্তে (Inner condition) কম্পিউটার প্রবেশই করে না।

সুইচ স্টেটমেন্ট (Switch Statement)

অনেকগুলো বিকল্প থেকে একটি বেছে নেওয়ার জন্য if-else ladder এর বিকল্প হিসেবে switch স্টেটমেন্ট ব্যবহার করা হয়। এটি দেখতে পরিচ্ছন্ন এবং মেনু-ভিত্তিক প্রোগ্রামে বেশি ব্যবহৃত হয়।

গঠন:

switch (expression) {
    case value1:
        // code
        break;
    case value2:
        // code
        break;
    default:
        // কোনো case না মিললে এটি কাজ করে
}
পার্থক্য: if-else vs switch | বৈশিষ্ট্য | if-else | switch | |---|---|---| | **ডেটা টাইপ** | পূর্ণসংখ্যা (int), ভগ্নাংশ (float), ক্যারেক্টার (char) সব শর্তে ব্যবহার করা যায়। | শুধুমাত্র পূর্ণসংখ্যা (int) এবং ক্যারেক্টার (char) ব্যবহার করা যায়। `float` বা `double` চলে না। | | **শর্তের ধরন** | লজিক্যাল এক্সপ্রেশন এবং রেঞ্জ (যেমন: `x > 10`) চেক করা সহজ। | শুধুমাত্র নির্দিষ্ট মান (Equality check) চেক করা যায়। রেঞ্জ চেক করা যায় না। | | **Break** | `break` স্টেটমেন্টের প্রয়োজন নেই। | প্রতিটি `case` শেষে `break` না দিলে পরের case-এ ঢুকে পড়ে (Fall through)। |

MCQ সতর্কতা:
Switch এর case ভ্যালু হিসেবে কখনো ভেরিয়েবল ব্যবহার করা যায় না (যেমন: case x: অবৈধ), এটি অবশ্যই কনস্ট্যান্ট হতে হবে (যেমন: case 5: বা case 'A':)।

কন্ডিশনাল অপারেটর (Ternary Operator)

এটি সি ল্যাঙ্গুয়েজের একমাত্র অপারেটর যার তিনটি অপারেন্ড বা অংশ থাকে। এটি ছোটখাটো if-else এর কাজ এক লাইনে করতে পারে।

গঠন:
Expression1 ? Expression2 : Expression3;

  • Expression1 সত্য হলে Expression2 এর মান ফলাফল হবে।
  • Expression1 মিথ্যা হলে Expression3 এর মান ফলাফল হবে।

উদাহরণ:
দুটি সংখ্যার মধ্যে বড়টি বের করা:

max = (a > b) ? a : b;

এর মানে হলো, যদি a > b সত্য হয়, তবে max = a; আর মিথ্যা হলে max = b

সংক্ষিপ্ত সারাংশ (Quick Revision)

রিভিশন পয়েন্ট:
- সেমিকোলন: if বা else if এর লাইনের শেষে কখনো সেমিকোলন (;) দিবে না।
- তুলনা: দুটি মান সমান কি না চেক করতে == ব্যবহার করতে হবে, = নয়। = হলো অ্যাসাইনমেন্ট অপারেটর।
- লজিক: AND (&&) এ সব শর্ত সত্য হতে হয়, OR (||) এ অন্তত একটি শর্ত সত্য হলেই চলে।
- সুইচ: switch স্টেটমেন্টে float বা double টাইপ ব্যবহার করা যায় না।

পরিভাষা (Glossary)

শব্দ ব্যাখ্যা
Control Flow প্রোগ্রামের নির্দেশগুলো কোন ক্রমে নির্বাহ হবে তার প্রবাহ।
Block দ্বিতীয় বন্ধনী {} দ্বারা আবদ্ধ একাধিক স্টেটমেন্টের সমষ্টি।
Nested একটার ভেতরে অন্যটা থাকা (যেমন লুপের ভেতর লুপ বা শর্তের ভেতর শর্ত)।
Fall through Switch স্টেটমেন্টে break না দিলে পরের case অটোমেটিক এক্সিকিউট হওয়া।
Operand অপারেটর যার ওপর কাজ করে (যেমন a+b তে ab হলো অপারেন্ড)।

অনুশীলনের প্রশ্ন

সৃজনশীল প্রশ্ন

সৃজনশীল প্রশ্ন ১

রাইসা একটি প্রোগ্রাম লিখল যা একটি সাল ইনপুট নেয় এবং সেটি লিপ ইয়ার (অধিবর্ষ) কিনা তা জানায়। সে শর্ত দিল: সালটি ৪ দিয়ে বিভাজ্য হতে হবে। কিন্তু তার প্রোগ্রাম ১৯০০ সালকে লিপ ইয়ার বলছে, যা ভুল।

ক) কন্ডিশনাল স্টেটমেন্ট কী?
খ) if এবং switch এর মধ্যে পার্থক্য কী?
গ) রাইসার লজিকটি কেন ভুল ছিল? লিপ ইয়ার নির্ণয়ের সঠিক শর্তটি ব্যাখ্যা কর (ফ্লোচার্ট সহ)।
ঘ) সঠিক লজিক ব্যবহার করে সি ভাষায় প্রোগ্রামটি লিখ।

উত্তর

(ক) কন্ডিশনাল স্টেটমেন্ট হলো প্রোগ্রামের এমন একটি নির্দেশনা যা নির্দিষ্ট শর্ত (condition) সত্য বা মিথ্যা হওয়ার ওপর ভিত্তি করে সিদ্ধান্ত গ্রহণ করে এবং প্রোগ্রামের প্রবাহ নিয়ন্ত্রণ করে।

(খ) if এবং switch এর মধ্যে মূল পার্থক্য হলো: if স্টেটমেন্ট লজিক্যাল বা রিলেশনাল এক্সপ্রেশন চেক করতে পারে (যেমন >, <, ==), কিন্তু switch স্টেটমেন্ট শুধুমাত্র নির্দিষ্ট মানের (constant value) সমতা (equality) পরীক্ষা করতে পারে। if স্টেটমেন্টে রেঞ্জ চেক করা যায়, কিন্তু switch এ সরাসরি রেঞ্জ চেক করা যায় না।

(গ) রাইসার লজিকটি ভুল ছিল কারণ সে শুধুমাত্র সালটি ৪ দিয়ে বিভাজ্য কিনা তা চেক করেছে। কিন্তু গ্রেগরিয়ান ক্যালেন্ডার অনুযায়ী, শতাব্দী বছরগুলো (যেমন ১৯০০, ২১০০) লিপ ইয়ার হতে হলে তাদের ৪০০ দিয়ে বিভাজ্য হতে হবে। ১৯০০ সাল ৪ দিয়ে বিভাজ্য হলেও ৪০০ দিয়ে বিভাজ্য নয়, তাই এটি লিপ ইয়ার নয়।

সঠিক লজিকটি হলো:
১. সালটি ৪০০ দিয়ে বিভাজ্য হলে লিপ ইয়ার।
২. অথবা, সালটি ৪ দিয়ে বিভাজ্য কিন্তু ১০০ দিয়ে বিভাজ্য না হলে লিপ ইয়ার।
অন্যথায়, এটি সাধারণ বছর।

নিচে লিপ ইয়ার নির্ণয়ের ফ্লোচার্ট দেওয়া হলো:
লিপ ইয়ার ফ্লোচার্ট

(ঘ) সঠিক লজিক ব্যবহার করে সি প্রোগ্রামটি নিচে দেওয়া হলো:

#include <stdio.h>

int main() {
    int year;

    printf("Enter a year: ");
    scanf("%d", &year);

    // সঠিক শর্ত: (৪০০ দিয়ে বিভাজ্য) অথবা (৪ দিয়ে বিভাজ্য এবং ১০০ দিয়ে বিভাজ্য নয়)
    if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {
        printf("%d is a Leap Year.\n", year);
    } else {
        printf("%d is not a Leap Year.\n", year);
    }

    return 0;
}

সৃজনশীল প্রশ্ন ২

একটি কলেজে নম্বরের ভিত্তিতে গ্রেড দেওয়া হয় (৮০ বা তার বেশি এ+, ৭০-৭৯ এ, ৬০-৬৯ এ-, ৫০-৫৯ বি, ৪০-৪৯ সি, ৩৩-৩৯ ডি এবং ৩৩ এর কম এফ)। শিক্ষক বললেন, "এটি করার জন্য অনেকগুলো if-else শর্ত দরকার।" একজন ছাত্র বলল, "আমি নেস্টেড if বা else-if ল্যাডার দিয়ে করব।"

ক) নেস্টেড if কী?
খ) else if ল্যাডার (Ladder) কখন ব্যবহার করা হয়?
গ) উদ্দীপকের সমস্যাটি সমাধানের জন্য else if ল্যাডার ব্যবহার করে একটি অ্যালগরিদম লিখ।
ঘ) একই সমস্যাটি সমাধানের জন্য সি ভাষায় কোড লিখ।

উত্তর

(ক) নেস্টেড if হলো একটি if বা else ব্লকের ভেতরে অন্য একটি if স্টেটমেন্ট ব্যবহার করা। অর্থাৎ শর্তের ভেতরে শর্ত থাকলে তাকে নেস্টেড if বলা হয়।

(খ) যখন অনেকগুলো শর্তের মধ্যে থেকে যেকোনো একটি শর্ত সত্য হলে নির্দিষ্ট কাজ করতে হয়, তখন else if ল্যাডার ব্যবহার করা হয়। এটি ধারাবাহিকভাবে শর্তগুলো পরীক্ষা করে; প্রথম যে শর্তটি সত্য হয়, তার অধীনস্থ কোড ব্লকটি রান করে এবং বাকিগুলো এড়িয়ে যায়।

(গ) উদ্দীপকের সমস্যাটি সমাধানের জন্য অ্যালগরিদম:

ধাপ ১: শুরু।
ধাপ ২: ইনপুট হিসেবে নম্বর (mark) গ্রহণ করি।
ধাপ ৩: যদি mark >= 80 হয়, তবে প্রিন্ট করি "A+" এবং ধাপ ১০ এ যাই।
ধাপ ৪: যদি mark >= 70 হয়, তবে প্রিন্ট করি "A" এবং ধাপ ১০ এ যাই।
ধাপ ৫: যদি mark >= 60 হয়, তবে প্রিন্ট করি "A-" এবং ধাপ ১০ এ যাই।
ধাপ ৬: যদি mark >= 50 হয়, তবে প্রিন্ট করি "B" এবং ধাপ ১০ এ যাই।
ধাপ ৭: যদি mark >= 40 হয়, তবে প্রিন্ট করি "C" এবং ধাপ ১০ এ যাই।
ধাপ ৮: যদি mark >= 33 হয়, তবে প্রিন্ট করি "D" এবং ধাপ ১০ এ যাই।
ধাপ ৯: অন্যথায় (mark < 33), প্রিন্ট করি "F"।
ধাপ ১০: শেষ।

(ঘ) উদ্দীপকের গ্রেডিং সিস্টেমের জন্য সি কোড:

#include <stdio.h>

int main() {
    int mark;

    printf("Enter your mark: ");
    scanf("%d", &mark);

    if (mark >= 80) {
        printf("Grade: A+\n");
    }
    else if (mark >= 70) {
        printf("Grade: A\n");
    }
    else if (mark >= 60) {
        printf("Grade: A-\n");
    }
    else if (mark >= 50) {
        printf("Grade: B\n");
    }
    else if (mark >= 40) {
        printf("Grade: C\n");
    }
    else if (mark >= 33) {
        printf("Grade: D\n");
    }
    else {
        printf("Grade: F\n");
    }

    return 0;
}

এমসিকিউ

১। সি ভাষায় if শর্তের শেষে কী ব্যবহার করা হয় না?

ক) সেকেন্ড ব্র্যাকেট {}
খ) ফার্স্ট ব্র্যাকেট ()
গ) সেমিকোলন ;
ঘ) অপারেটর

সঠিক উত্তর: গ) সেমিকোলন ;

ব্যাখ্যা: if শর্তের শেষে সেমিকোলন দিলে শর্তটি সেখানেই শেষ হয়ে যায় এবং নিচের স্টেটমেন্টগুলো শর্তের বাইরে চলে যায়। তাই সাধারণত if এর শর্তের শেষে সেমিকোলন দেওয়া হয় না।


২। if (condition) এর শর্ত সত্য হলে কোনটি কাজ করে?

ক) else ব্লক
খ) if এর ঠিক পরের স্টেটমেন্ট বা ব্লক
গ) প্রোগ্রামের শেষ লাইন
ঘ) কোনোটিই নয়

সঠিক উত্তর: খ) if এর ঠিক পরের স্টেটমেন্ট বা ব্লক

ব্যাখ্যা: if এর শর্ত সত্য (True) হলে কম্পাইলার if এর ব্লকের ভেতরের কোড এক্সিকিউট করে। মিথ্যা হলে else ব্লকে চলে যায়।


৩। নিচের কোডটির আউটপুট কী হবে?

int x = 5;
if (x = 10)
    printf("True");
else
    printf("False");

ক) True
খ) False
গ) Error
ঘ) 5

সঠিক উত্তর: ক) True

ব্যাখ্যা: এখানে x = 10 একটি অ্যাসাইনমেন্ট অপারেশন, যা x এর মান ১০ করে দেয়। সি ভাষায় যেকোনো নন-জিরো মান সত্য হিসেবে গণ্য হয়। তাই শর্তটি সত্য হবে এবং "True" প্রিন্ট করবে।


৪। সি ভাষায় 'সমান নয়' (Not Equal) বোঝাতে কোন অপারেটর ব্যবহৃত হয়?

ক) <>
খ) !=
গ) !==
ঘ) ~=

সঠিক উত্তর: খ) !=

ব্যাখ্যা: সি ভাষায় দুটি মান সমান নয় কিনা তা যাচাই করতে != (Exclamation mark followed by equal sign) ব্যবহৃত হয়।


৫। (5 > 3 && 8 < 5) এক্সপ্রেশনটির মান কত?

ক) 1 (True)
খ) 0 (False)
গ) 5
ঘ) Error

সঠিক উত্তর: খ) 0 (False)

ব্যাখ্যা: 5 > 3 সত্য (1), কিন্তু 8 < 5 মিথ্যা (0)। && (AND) অপারেটরে উভয় শর্ত সত্য হতে হয়। তাই 1 && 0 এর ফলাফল 0 বা মিথ্যা।


৬। switch স্টেটমেন্টে কোন কিওয়ার্ডটি ব্যবহার করে লুপ বা ব্লক থেকে বের হওয়া যায়?

ক) stop
খ) exit
গ) break
ঘ) return

সঠিক উত্তর: গ) break

ব্যাখ্যা: switch ব্লকের প্রতিটি case শেষে break ব্যবহার করা হয় যাতে পরবর্তী case গুলো এক্সিকিউট না হয় এবং কন্ট্রোল সুইচ ব্লক থেকে বের হয়ে যায়।


৭। নিচের কোডটির আউটপুট কী?

int a = 10;
if (a > 5)
    printf("A");
else if (a > 8)
    printf("B");
else
    printf("C");

ক) A
খ) B
গ) C
ঘ) AB

সঠিক উত্তর: ক) A

ব্যাখ্যা: if-else if ল্যাডারে প্রথম সত্য শর্তটি কাজ করে এবং বাকিগুলো এড়িয়ে যায়। এখানে a > 5 সত্য, তাই "A" প্রিন্ট হবে এবং বাকি অংশ চেক করা হবে না।


৮। switch স্টেটমেন্টে কোন ডেটা টাইপ ব্যবহার করা যায় না?

ক) int
খ) char
গ) float
ঘ) long

সঠিক উত্তর: গ) float

ব্যাখ্যা: switch স্টেটমেন্টের এক্সপ্রেশন অবশ্যই ইন্টিজার (int) বা ক্যারেক্টার (char) টাইপের হতে হবে। ফ্লোটিং পয়েন্ট (float, double) ব্যবহার করা যায় না।


৯। কন্ডিশনাল অপারেটর (Ternary Operator) কোনটি?

ক) ::
খ) ?:
গ) &&
ঘ) ||

সঠিক উত্তর: খ) ?:

ব্যাখ্যা: ? : কে টারনারি অপারেটর বলা হয় যা if-else এর সংক্ষিপ্ত রূপ হিসেবে কাজ করে। গঠন: condition ? true_value : false_value;


১০। !(10 == 10) এর মান কত?

ক) 0
খ) 1
গ) 10
ঘ) True

সঠিক উত্তর: ক) 0

ব্যাখ্যা: 10 == 10 সত্য (1)। এর আগে ! (NOT) অপারেটর থাকায় এটি উল্টে গিয়ে মিথ্যা (0) হয়ে যাবে।


১১। নিচের কোনটি রিলেশনাল অপারেটর নয়?

ক) >=
খ) <=
গ) =
ঘ) ==

সঠিক উত্তর: গ) =

ব্যাখ্যা: = হলো অ্যাসাইনমেন্ট অপারেটর যা মান নির্ধারণে ব্যবহৃত হয়। বাকিগুলো রিলেশনাল বা তুলনামূলক অপারেটর।


১২। if (a > b) এর সমতুল্য ফ্লোচার্ট প্রতীক কোনটি?

ক) আয়তক্ষেত্র (Process)
খ) সামান্তরিক (Input/Output)
গ) রম্বস (Decision)
ঘ) উপবৃত্ত (Start/End)

সঠিক উত্তর: গ) রম্বস (Decision)

ব্যাখ্যা: ফ্লোচার্টে সিদ্ধান্ত গ্রহণ বা কন্ডিশন চেকিংয়ের জন্য রম্বস বা ডায়মন্ড শেপ ব্যবহার করা হয়।


১৩। নিচের কোডটির আউটপুট কী?

int x = 1;
switch(x) {
    case 1: printf("One");
    case 2: printf("Two");
            break;
    default: printf("Default");
}

ক) One
খ) OneTwo
গ) Two
ঘ) Default

সঠিক উত্তর: খ) OneTwo

ব্যাখ্যা: case 1 সত্য হওয়ায় "One" প্রিন্ট হবে। কিন্তু case 1 এর পর break না থাকায় কন্ট্রোল নিচে নেমে case 2 ও এক্সিকিউট করবে এবং "Two" প্রিন্ট হবে। এরপর break পাওয়ায় লুপ থামবে।


১৪। else ছাড়া কি if ব্যবহার করা যায়?

ক) না, else বাধ্যতামূলক
খ) হ্যাঁ, else ঐচ্ছিক
গ) শুধুমাত্র main ফাংশনে যায়
ঘ) কম্পাইলার এরর দিবে

সঠিক উত্তর: খ) হ্যাঁ, else ঐচ্ছিক

ব্যাখ্যা: if স্টেটমেন্ট একা ব্যবহার করা যায়। শর্ত মিথ্যা হলে কিছু না করে প্রোগ্রাম এগিয়ে যাবে। else ব্লক থাকা বাধ্যতামূলক নয়।


১৫। লজিক্যাল OR (||) অপারেটরের ক্ষেত্রে ফলাফল সত্য হবে যদি—
i. উভয় শর্ত সত্য হয়
ii. যেকোনো একটি শর্ত সত্য হয়
iii. উভয় শর্ত মিথ্যা হয়

নিচের কোনটি সঠিক?
ক) i ও ii
খ) i ও iii
গ) ii ও iii
ঘ) i, ii ও iii

সঠিক উত্তর: ক) i ও ii

ব্যাখ্যা: || (OR) অপারেটরে কমপক্ষে একটি শর্ত সত্য হলেই পুরো এক্সপ্রেশন সত্য হয়। উভয় শর্ত সত্য হলেও সত্য হয়। শুধুমাত্র উভয় শর্ত মিথ্যা হলে ফলাফল মিথ্যা হয়।


নিচের উদ্দীপকটি পড় এবং ১৬ ও ১৭ নং প্রশ্নের উত্তর দাও:

int m = 5;
if (m > 3)
   if (m < 10)
      printf("Hi");
   else
      printf("Bye");

১৬। উদ্দীপকের কোডটির আউটপুট কী হবে?

ক) Hi
খ) Bye
গ) HiBye
ঘ) কোনো আউটপুট নেই

সঠিক উত্তর: ক) Hi

ব্যাখ্যা: m = 5। প্রথম শর্ত 5 > 3 সত্য। তাই ভেতরের if চেক হবে। 5 < 10 ও সত্য। তাই "Hi" প্রিন্ট হবে।


১৭। যদি m এর মান ১২ হয়, তবে আউটপুট কী হবে?

ক) Hi
খ) Bye
গ) HiBye
ঘ) কোনো আউটপুট নেই

সঠিক উত্তর: খ) Bye

ব্যাখ্যা: m = 12। প্রথম শর্ত 12 > 3 সত্য। ভেতরের if12 < 10 মিথ্যা। তাই ভেতরের else ব্লক কাজ করবে এবং "Bye" প্রিন্ট হবে।


১৮। নেস্টেড if ব্যবহারের সময় else সর্বদা কোন if এর সাথে যুক্ত হয়?

ক) সবচেয়ে প্রথম if
খ) নিকটতম if (যার else নেই)
গ) ব্লক বা {} এর বাইরের if
ঘ) দৈবচয়নভাবে

সঠিক উত্তর: খ) নিকটতম if (যার else নেই)

ব্যাখ্যা: সি ভাষায় else সবসময় তার ঠিক উপরের বা নিকটতম if এর সাথে যুক্ত হয়, যদি না ব্র্যাকেট {} দিয়ে আলাদা করা থাকে। একে "Dangling else" সমস্যাও বলা হয়।


১৯। break স্টেটমেন্ট কোথায় ব্যবহার করা যায়?
i. switch স্টেটমেন্টে
ii. for, while লুপে
iii. if স্টেটমেন্টের ভেতরে সরাসরি (লুপ ছাড়া)

নিচের কোনটি সঠিক?
ক) i ও ii
খ) i ও iii
গ) ii ও iii
ঘ) i, ii ও iii

সঠিক উত্তর: ক) i ও ii

ব্যাখ্যা: break মূলত লুপ (for, while, do-while) এবং switch স্টেটমেন্ট থেকে বের হওয়ার জন্য ব্যবহৃত হয়। সাধারণ if এর ভেতরে break কাজ করে না যদি না সেটি কোনো লুপ বা switch এর অংশ হয়।


২০। নিচের কোডটির আউটপুট কী?

int k = 0;
if (k)
    printf("Yes");
else
    printf("No");

ক) Yes
খ) No
গ) Error
ঘ) 0

সঠিক উত্তর: খ) No

ব্যাখ্যা: সি ভাষায় 0 মানে মিথ্যা (False) এবং অন্য যেকোনো সংখ্যা মানে সত্য (True)। এখানে k = 0, তাই if(0) মিথ্যা হবে এবং else ব্লকের "No" প্রিন্ট হবে।


২১। default লেবেলটি কোথায় ব্যবহৃত হয়?

ক) if-else
খ) switch
গ) for লুপে
ঘ) ফাংশন ডিক্লারেশনে

সঠিক উত্তর: খ) switch

ব্যাখ্যা: switch স্টেটমেন্টে যখন কোনো case এর সাথে মান মিলে না, তখন default ব্লকটি রান করে। এটি else এর মতো কাজ করে।


২২। রিলেশনাল অপারেটরগুলোর মধ্যে কোনটির অগ্রাধিকার (Precedence) সবচেয়ে বেশি?

ক) ==
খ) !=
গ) > এবং <
ঘ) &&

সঠিক উত্তর: গ) > এবং <

ব্যাখ্যা: সি ভাষায় <, <=, >, >= এর অগ্রাধিকার == এবং != এর চেয়ে বেশি। অর্থাৎ a < b == c লিখলে আগে a < b এর কাজ হবে।


২৩। লিপ ইয়ার নির্ণয়ের লজিক কোনটি?

ক) year % 4 == 0
খ) year % 400 == 0
গ) (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
ঘ) year % 100 == 0 || year % 4 == 0

সঠিক উত্তর: গ) (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)

ব্যাখ্যা: লিপ ইয়ার হওয়ার সঠিক নিয়ম হলো: সালটি ৪০০ দ্বারা বিভাজ্য হতে হবে অথবা ৪ দ্বারা বিভাজ্য কিন্তু ১০০ দ্বারা বিভাজ্য নয়।


২৪। নিচের কোডটিতে ভুল কোথায়?

int a = 5;
if a > 2
   printf("Greater");

ক) সেমিকোলন নেই
খ) if এর শর্তে ব্র্যাকেট () নেই
গ) printf ভুল
ঘ) int ভুল

সঠিক উত্তর: খ) if এর শর্তে ব্র্যাকেট () নেই

ব্যাখ্যা: সি ভাষায় if স্টেটমেন্টের সিনট্যাক্স হলো if (condition)। শর্তটি অবশ্যই প্যারেন্থেসিস বা প্রথম বন্ধনী () এর মধ্যে রাখতে হবে।


২৫। কন্ডিশনাল কন্ট্রোল স্টেটমেন্ট কোনটি?
i. if-else
ii. switch
iii. goto

নিচের কোনটি সঠিক?
ক) i ও ii
খ) i ও iii
গ) ii ও iii
ঘ) i, ii ও iii

সঠিক উত্তর: ক) i ও ii

ব্যাখ্যা: if-else এবং switch হলো কন্ডিশনাল কন্ট্রোল স্টেটমেন্ট যা শর্তের ওপর ভিত্তি করে ফ্লো নিয়ন্ত্রণ করে। goto হলো জাম্প স্টেটমেন্ট, একে সরাসরি কন্ডিশনাল বলা হয় না, যদিও শর্তের সাথে ব্যবহার করা যায়। আধুনিক প্রোগ্রামিঙে goto এড়িয়ে চলা হয়।