কন্ডিশনাল স্টেটমেন্ট: সিদ্ধান্ত গ্রহণ ও লজিক
সি প্রোগ্রামিং কন্ডিশনাল লজিক: if, else, else if, nested if এবং switch case স্টেটমেন্ট ব্যবহার করে সিদ্ধান্ত গ্রহণমূলক প্রোগ্রাম তৈরি (লিপ ইয়ার, গ্রেড নির্ণয়)
কন্ডিশনাল স্টেটমেন্ট: সিদ্ধান্ত গ্রহণ ও লজিক (Conditional Statements)
- কন্ডিশনাল স্টেটমেন্ট: সিদ্ধান্ত গ্রহণ ও লজিক
- প্রোগ্রামের মোড়: সিদ্ধান্ত গ্রহণ
- if স্টেটমেন্ট (Simple if)
- if-else স্টেটমেন্ট
- else if ল্যাডার (Ladder)
- লজিক্যাল অপারেটরের ব্যবহার (&&, ||)
- প্রোগ্রাম: লিপ ইয়ার (Leap Year) নির্ণয়
- নেস্টেড if (Nested if)
- প্রোগ্রাম: ৩টি সংখ্যার মধ্যে বড় সংখ্যা নির্ণয়
- প্রোগ্রাম: জিপিএ বা গ্রেড নির্ণয় (Grade Sheet)
- switch স্টেটমেন্ট: if-else এর বিকল্প
- সারসংক্ষেপ (Summary)
কন্ডিশনাল স্টেটমেন্ট: সিদ্ধান্ত গ্রহণ ও লজিক
প্রোগ্রামিং সবসময় সরলরেখায় চলে না। আমাদের বাস্তব জীবনের মতো প্রোগ্রামকেও বিভিন্ন পরিস্থিতির ওপর ভিত্তি করে সিদ্ধান্ত নিতে হয়। ধরো, তুমি রিকশায় করে কলেজে যাচ্ছ। রাস্তায় জ্যাম থাকলে তুমি এক পথে যাবে, আর জ্যাম না থাকলে অন্য পথে। এই যে "জ্যাম আছে কি না?" - এই প্রশ্নের উত্তরের ওপর ভিত্তি করে তোমার পথ বা 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...)।
পরীক্ষার টিপস (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 না মিললে এটি কাজ করে
}
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 তে a ও b হলো অপারেন্ড)। |