Lesson পড়তে ৭ মিনিট লাগবে

কন্ডিশনাল বা শর্তসমূহ (Conditionals)

আপনার কোডের জন্য ট্রাফিক লাইট (Traffic lights) — যার লাল মানে থামা এবং সবুজ মানে এগিয়ে যাওয়া

আপনার কোডের জন্য ট্রাফিক লাইট (Traffic Lights for Your Code)

কন্ডিশনাল বা শর্ত (conditionals) যুক্ত না করলে, আপনার সম্পূর্ণ প্রোগ্রামটি (program) শুধু মাত্র একটি সোজা রাস্তার (straight road) মতো হয়ে যাবে — যেখানে কোনো বাঁক (turns) বা সিদ্ধান্ত (decisions) নেওয়ার সুযোগ থাকে না। কন্ডিশনাল (Conditionals) হলো সেই ট্রাফিক লাইট (traffic lights) যার মাধ্যমে আপনার কোডগুলো (code) এখানকার বর্তমান পরিস্থিতির (happening) ওপর ভিত্তি করে বিভিন্ন পথ (paths) বেছে নিতে পারে।

তবে এর আরও গভীরে ঢোকার আগেই, আপনাকে এই সি (C) প্রোগ্রামিং সম্পর্কে একটি সবচেয়ে গুরুত্বপূর্ণ (critical) বা ক্রিটিকাল বিষয় মনে রাখতে হবে: এখানে আসলে সত্যি সত্যি কোনো বুলিয়ান টাইপ (true boolean type) বলতে কিছুই নেই (ন্যূনতম এর মূল বা নেটিভ হিসেবে তো নেই-ই)। তবে সি (C)-তে এই ট্রুথ (truth) বা সত্যতাটিকে একটি মাত্র সংখ্যা (number) হিসেবে ধরা হয়:

  • 0 হলো মিথ্যা বা ফলস (false) — শুন্য (zero), নাদা (nada) মানে কিছুই না (nothing)।
  • আর এছাড়া এর বাকি সবকিছুই হলো সত্য বা ট্রু (true)1, -5, 42, 999 — অর্থাৎ এগুলো সবই ট্রুথি (truthy)।

যদিওবা সি (C)-এর এই সিম্প্লিসিটিটি (simplicity) বেশ দারুণ বা মার্জিত (elegant), তবে এটি প্রায়ই বেশ কিছু সাইলেন্ট বা লুকায়িত বাগ (sneaky bugs) তৈরি করার দরজা খুলে দেয়।

সি (C)-তে সত্যতা বা ট্রুথিনেস (Truthiness in C)

#include <stdio.h>
int main() {
if (1) printf("1 is true\n");
if (-1) printf("-1 is true\n");
if (42) printf("42 is true\n");
if (0) printf("0 is true\n"); // এটি কখনোই প্রিন্ট (prints) হবে না!
// সাধারণ প্যাটার্ন (common pattern): কোনো মান বা ভ্যালু (value) আছে কিনা তা যাচাই করা (checking if a value exists)
int items_in_cart = 3;
if (items_in_cart) {
printf("You have %d items\n", items_in_cart);
} else {
printf("Your cart is empty\n");
}
return 0;
}
Output
1 is true
-1 is true
42 is true
You have 3 items

if, else if, else

এটি মূলত সিদ্ধান্ত বা ডিসিশন নেওয়ার জন্য একটি ক্লাসিক স্ট্রাকচার (classic decision structure)। সি (C) এর প্রতিটি শর্তকে (condition) উপর থেকে নিচের (top-to-bottom) দিকে পরীক্ষা করতে থাকে এবং যে প্রথম (first) ব্র্যাঞ্চটি (branch) সত্য বা ট্রু (true) হয় সেটিকেই বেছে নেয়। তবে যদি এর ভেতরের কোনো কিছুর সাথেই এটি না মেলে বা ম্যাচ (match) না করে, তখন শুধুমাত্র তখনই এর এই else ব্লকটি (block) রান (runs) করে (যদি আপনার কাছে এটি থেকে থাকে)।

গ্রেড ক্যালকুলেটর (Grade Calculator)

#include <stdio.h>
int main() {
int score = 78;
if (score >= 90) {
printf("Grade: A\n");
} else if (score >= 80) {
printf("Grade: B\n");
} else if (score >= 70) {
printf("Grade: C\n");
} else if (score >= 60) {
printf("Grade: D\n");
} else {
printf("Grade: F\n");
}
printf("Score: %d\n", score);
return 0;
}
Output
Grade: C
Score: 78

switch/case — ভেন্ডিং মেশিন (switch/case — The Vending Machine)

যখন আপনি কোনো একটি নির্দিষ্ট ভ্যারিয়েবলকে (variable) আরও অনেকগুলো সুনির্দিষ্ট (specific) ভ্যালুর (values) সাথে তুলনা করে দেখতে চান, তখন if/else if চেইনের (chain) চেয়ে মূলত switch অনেক বেশি পরিষ্কার বা ক্লিন (cleaner) থাকে। একে অনেকটা একটি ভেন্ডিং মেশিনের (vending machine) মতো কল্পনা করে নিতে পারেন — যেমন যেখানে আপনি একটি নির্দিষ্ট বোতাম (কেস বা case) চাপলে একটি নির্দিষ্ট ফলাফল (result) হাতে পান。

তবে এখানেও একটি ছোট ফাঁদ (trap) লুকিয়ে আছে: আপনাকে অবশ্যই এর প্রতিটি কেস বা case-এর পর একটি করে break বসাতে হবে। তা না হলে এর এক্সিকিউশনটি (execution) বা কাজের ধারাটি ঠিক সিঁড়ি দিয়ে গড়ানো কোনো বলের মতোই একে একে এর পরের কেস বা case-গুলোতেও চলে যেতে শুরু করবে বা "ফলস থ্রু (falls through)" হবে।

switch/case — মেনু সিস্টেম (Menu System)

#include <stdio.h>
int main() {
int choice = 2;
printf("=== MENU ===\n");
printf("1. New Game\n");
printf("2. Load Game\n");
printf("3. Settings\n");
printf("4. Quit\n\n");
switch (choice) {
case 1:
printf("Starting new game...\n");
break;
case 2:
printf("Loading saved game...\n");
break;
case 3:
printf("Opening settings...\n");
break;
case 4:
printf("Goodbye!\n");
break;
default:
printf("Invalid choice!\n");
break;
}
return 0;
}
Output
=== MENU ===
1. New Game
2. Load Game
3. Settings
4. Quit

Loading saved game...

ফল-থ্রু (Fall-Through) — বাগ নাকি ফিচার (Bug or Feature)?

#include <stdio.h>
int main() {
// ইচ্ছেকৃত বা ইনটেনশনাল (Intentional) ফল-থ্রু (fall-through): কেসগুলোকে এক সাথে গ্রুপ করা বা গ্রুপিং (grouping) করা
char grade = 'B';
switch (grade) {
case 'A':
case 'B':
printf("Great job!\n");
break;
case 'C':
printf("Not bad, keep going.\n");
break;
case 'D':
case 'F':
printf("Need improvement.\n");
break;
default:
printf("Invalid grade.\n");
}
return 0;
}
Output
Great job!
Note: সি (C)-এর সবচেয়ে সাধারণ বা কমন ২-টি কন্ডিশনাল বাগ (conditional bugs):
1. = বনাম (vs) ==if (x == 5)-এর বদলে if (x = 5) লিখে ফেলা। এখানকার এই প্রথমটি মূলত x-এর মধ্যে ৫ (5)-কে অ্যাসাইন (assigns) করে দেয় (এবং এটি সবসময়ই সত্য বা true হয় কারণ 5 নিজে কোনো শুন্য বা জিরো নয়)। এর ফলে এখানকার কম্পাইলারটি (compiler) হয়তো আপনাকে এই নিয়ে কোনো ধরনের সতর্কও (warn) করবে না। তাই কিছু কিছু প্রোগ্রামার (programmers) মূলত জিনিসটিকে ধরতে বা ক্যাচ (catch) করতে if (5 == x) লিখে থাকেন — কারণ এটি তখন 5 = x টাইপোটিকে (typo) আর কম্পাইল (compile) করতে দেয় না।
2. সুইচ (switch)-এ break ভুলে যাওয়াbreak ছাডাই, এখানকার এই এক্সিকিউশনটি (execution) সোজা এর পরের কেস (case)-এ চলে যায় (falls through)। এটি মাঝেমধ্যে ইচ্ছেকৃত বা ইনটেনশনাল (intentional) হলেও, বেশিরভাগ সময়ই এটি মূলত একটি বাগ (bug) হিসেবে বিবেচিত হয়।

টারনারি অপারেটর (The Ternary Operator)

সি (C)-তে ? : হলো মূলত একটি এক লাইনের (one-line) if/else। সহজ অ্যাসাইনমেন্টের (simple assignments) জন্য এটি বেশ দারুণভাবে কাজ করে তবে এটিকে কখনোই অতিরিক্ত বেশি (overuse) ব্যবহার করবেন না — কারণ একের ভেতরে অনেকগুলো টারনারি বা নেস্টেড টারনারিগুলো (nested ternaries) খুব দ্রুতই আপনার কোডটিকে রিড-অযোগ্য (unreadable) বা পাঠঅযোগ্য করে তুলবে।

টারনারি অপারেটর (Ternary Operator)

#include <stdio.h>
int main() {
int a = 15, b = 23;
// একটি ৫-লাইনের (5-line) if/else-এর বদলে:
int max = (a > b) ? a : b;
int min = (a < b) ? a : b;
printf("Max: %d\n", max);
printf("Min: %d\n", min);
// ইনলাইন (Inline) printf-এ
int temp = -3;
printf("%d is %s\n", temp, (temp >= 0) ? "positive" : "negative");
// পরম মান (Absolute value)
int abs_val = (temp < 0) ? -temp : temp;
printf("Absolute value: %d\n", abs_val);
return 0;
}
Output
Max: 23
Min: 15
-3 is negative
Absolute value: 3
চ্যালেঞ্জ

ছোট কুইজ

সি (C)-তে এই if (x = 0) এক্সপ্রেশনটি (expression) আসলে কী কাজ করে?
Input & OutputLoops