Control Flow I — if, else, switch
সিদ্ধান্ত গ্রহণের যুক্তি
1. Making Decisions
Programs rarely run top to bottom. They branch based on conditions — user input, data, state. C gives two tools: if and switch.
বেশিরভাগ প্রোগ্রাম শুধু উপর থেকে নিচে সরলরৈখিকভাবে চলে না — পরিস্থিতি বুঝে বিভিন্ন পথে যায়। C এই কাজের জন্য দুটি টুল দেয়:
if এবং switch।2. if / else if / else
grade.c — stdin: 76
#include <stdio.h>
int main(void) {
int marks;
scanf("%d", &marks);
char grade;
if (marks >= 80) grade = 'A';
else if (marks >= 70) grade = 'B';
else if (marks >= 60) grade = 'C';
else if (marks >= 50) grade = 'D';
else grade = 'F';
printf("Marks: %d → Grade: %c\n", marks, grade);
return 0;
}
C-তে 0 মানে false, 0 ছাড়া যেকোনো সংখ্যা true। তাই
if (x) আর if (x != 0) একই কথা।
Classic bug
if (x = 5) — এটি assignment হয়ে যায়, 5 সবসময় truthy, তাই if সবসময় সত্য। সমাধান: if (x == 5), এবং -Wall flag দিয়ে compile করুন।
3. Nested if vs Early Return
❌ Deeply nested (hard to read)
if (user) {
if (user->active) {
if (user->balance > 0) {
process(user);
}
}
}
✅ Early return (flat, clean)
if (!user) return;
if (!user->active) return;
if (user->balance <= 0) return;
process(user);
গভীরভাবে nested if লিখলে কোড পড়া কঠিন হয়ে যায়। শুরুতেই ভুল condition ধরে return করলে বাকি অংশ সহজ থাকে। এটিই early-return pattern।
4. switch — Jump Tables
day.c — stdin: 3
#include <stdio.h>
int main(void) {
int day;
scanf("%d", &day);
switch (day) {
case 1: puts("Sunday"); break;
case 2: puts("Monday"); break;
case 3: puts("Tuesday"); break;
case 4: puts("Wednesday"); break;
case 5: puts("Thursday"); break;
case 6: puts("Friday"); break;
case 7: puts("Saturday"); break;
default: puts("Invalid day");
}
return 0;
}
Missing
break = fall-through
switch-এ break না দিলে পরের case-এও চলে যায় — অনেক সময় এটি বাগের কারণ। ইচ্ছাকৃত হলে /* fallthrough */ comment লিখে রাখুন।
switch শুধুমাত্র integer type (int, char, enum)-এ কাজ করে — string বা float-এ নয়।
5. Boolean Idioms
idioms.c — stdin: 25
#include <stdio.h>
int main(void) {
int age;
scanf("%d", &age);
// Range check
if (age >= 18 && age <= 65)
puts("Working age");
// Multiple equal values
char answer = 'Y';
if (answer == 'y' || answer == 'Y')
puts("Confirmed");
// Ternary for compact assignment
int x = -7;
int absx = (x < 0) ? -x : x;
printf("|%d| = %d\n", x, absx);
return 0;
}
6. Practice Problems
-
Read three numbers and print the largest.তিনটি সংখ্যা নিয়ে বৃহত্তমটি প্রিন্ট করুন।
✨ Show Answer
max3.c — stdin: 12 45 23#include <stdio.h> int main(void) { int a, b, c; scanf("%d %d %d", &a, &b, &c); int mx = a; if (b > mx) mx = b; if (c > mx) mx = c; printf("Max = %d\n", mx); return 0; } -
Leap-year check — divisible by 4, not 100 unless 400.Leap year চেক: ৪ দ্বারা বিভাজ্য হতে হবে, ১০০ দ্বারা নয় — যদি না ৪০০ দ্বারা বিভাজ্য হয়।
✨ Show Answer
leap.c — stdin: 2024#include <stdio.h> int main(void) { int y; scanf("%d", &y); int leap = (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0); printf("%d is %sa leap year.\n", y, leap ? "" : "not "); return 0; } -
Convert a numeric day (1–7) to its name using
switch.সংখ্যা (১–৭) থেকে দিনের নামswitchদিয়ে প্রিন্ট করুন।✨ Show Answer
উপরের Section 4-এর
day.c-ই পুরো উত্তর। -
Check whether point (x, y) lies inside a circle of radius r centered at the origin.মূলবিন্দুতে কেন্দ্রবিশিষ্ট r-ব্যাসার্ধের বৃত্তের ভেতরে (x, y) আছে কি না চেক করুন।
✨ Show Answer
circle.c — stdin: 3 4 5#include <stdio.h> int main(void) { double x, y, r; scanf("%lf %lf %lf", &x, &y, &r); if (x*x + y*y < r*r) puts("inside"); else if (x*x + y*y == r*r) puts("on the boundary"); else puts("outside"); return 0; } -
Read an operator (
+ - * /) and two operands, compute the result usingswitch.একটি operator (+ − × ÷) ও দুটি operand নিয়েswitchদিয়ে ফলাফল বের করুন।✨ Show Answer
calc.c — stdin: * 6 7#include <stdio.h> int main(void) { char op; double a, b, r = 0; scanf(" %c %lf %lf", &op, &a, &b); switch (op) { case '+': r = a + b; break; case '-': r = a - b; break; case '*': r = a * b; break; case '/': if (b == 0) { puts("divide by zero"); return 1; } r = a / b; break; default: puts("unknown op"); return 1; } printf("%.2f\n", r); return 0; } -
Categorize a character as vowel, consonant, digit or symbol.একটি character vowel, consonant, digit না symbol — সেটি চিহ্নিত করুন।
✨ Show Answer
classify.c — stdin: e#include <stdio.h> #include <ctype.h> int main(void) { char c; scanf(" %c", &c); char lc = tolower(c); if (isdigit(c)) puts("digit"); else if (!isalpha(c)) puts("symbol"); else if (lc=='a'||lc=='e'||lc=='i'||lc=='o'||lc=='u') puts("vowel"); else puts("consonant"); return 0; } -
Income tax slab: 0 for ≤ 3 lakh; 5% for next 1 lakh; 10% for next 4 lakh; 15% above. Print tax on a given income.কর slab: ৩ লাখ পর্যন্ত ০%, পরের ১ লাখ ৫%, পরের ৪ লাখ ১০%, এর উপরে ১৫%। একটি আয়ের জন্য tax বের করুন।
✨ Show Answer
tax.c — stdin: 650000#include <stdio.h> int main(void) { double income, tax = 0; scanf("%lf", &income); if (income > 800000) { tax += (income - 800000) * 0.15; income = 800000; } if (income > 400000) { tax += (income - 400000) * 0.10; income = 400000; } if (income > 300000) { tax += (income - 300000) * 0.05; } printf("Tax payable = %.2f\n", tax); return 0; } -
Quadratic solver — detect real, repeated, or complex roots.Quadratic সমাধান: real, repeated নাকি complex root সেটি নির্ধারণ করে প্রিন্ট করুন।
✨ Show Answer
quad.c — stdin: 1 -5 6#include <stdio.h> #include <math.h> int main(void) { double a, b, c; scanf("%lf %lf %lf", &a, &b, &c); double d = b*b - 4*a*c; if (d > 0) { double s = sqrt(d); printf("real roots: %.3f, %.3f\n", (-b+s)/(2*a), (-b-s)/(2*a)); } else if (d == 0) { printf("repeated root: %.3f\n", -b/(2*a)); } else { double r = -b/(2*a), i = sqrt(-d)/(2*a); printf("complex roots: %.3f ± %.3fi\n", r, i); } return 0; } -
Rewrite a 4-level nested if in early-return style.৪-স্তর nested if-কে early-return style-এ লিখুন।
✨ Show Answer
উপরের Section 3-এর comparison cards-এই উভয় version দেখানো হয়েছে। Flat pattern always easier to read।
-
Why does
switchnot work ondouble?switchকেনdouble-এ কাজ করে না?✨ Show Answer
switch-এর জন্য compiler একটি দ্রুত jump-table বা binary-search ছক তৈরি করে, যার জন্য discrete integer মান লাগে।double-এ নির্ভুল সমতা (equality) নিরাপদ নয় (IEEE 754 rounding) এবং jump-table বানানো যায় না। -
FizzBuzz using if-else-if for 1 to 20.১ থেকে ২০ পর্যন্ত if-else-if দিয়ে FizzBuzz লিখুন।
✨ Show Answer
fizzbuzz.c#include <stdio.h> int main(void) { for (int i = 1; i <= 20; i++) { if (i % 15 == 0) puts("FizzBuzz"); else if (i % 3 == 0) puts("Fizz"); else if (i % 5 == 0) puts("Buzz"); else printf("%d\n", i); } return 0; } -
Menu-driven program: read a single digit 1–4 and execute different actions using
switch.১–৪ একটি digit নিয়েswitchদিয়ে ভিন্ন ভিন্ন action চালান (menu pattern)।✨ Show Answer
menu.c — stdin: 2#include <stdio.h> int main(void) { int choice; scanf("%d", &choice); switch (choice) { case 1: puts("New file created."); break; case 2: puts("File opened."); break; case 3: puts("File saved."); break; case 4: puts("Exiting..."); break; default: puts("Invalid choice."); } return 0; }
Glossary (শব্দকোষ)
| Term | Meaning | বাংলায় |
|---|---|---|
| Control Flow | The order in which statements execute. | Statement গুলো কোন ক্রমে execute হবে। |
| Conditional | Code that runs only if a condition is true. | শর্ত সত্য হলে চলে — এমন কোড। |
if | Runs a block when its condition is non-zero. | শর্ত সত্য হলে block চালায়। |
else | Block that runs when the if condition fails. | if ব্যর্থ হলে যে block চলে। |
else if | Chained alternative condition. | চেইনে যুক্ত পরবর্তী শর্ত। |
switch | Multi-way branch on an integer expression. | Integer expression-এর ভিত্তিতে multi-way branch। |
case | One labeled branch inside a switch. | switch-এর ভিতরের একটি label-করা branch। |
break | Exits a switch or loop immediately. | Switch বা loop থেকে সাথে সাথে বের হওয়া। |
default | The catch-all case in a switch. | switch-এর সব না-মেলা case-এর জন্য default। |
| Fall-through | When a switch case lacks break and runs into the next case. | break না থাকলে পরের case-এ গড়িয়ে যাওয়া। |
| Boolean | A true/false value (in C: 0 = false, non-zero = true). | সত্য/মিথ্যা মান। |
| Nested Conditional | An if inside another if. | একটি if-এর ভিতরে আরেকটি if। |
Summary — Module 09
Use if/else for ranges and complex conditions; use switch for discrete integer dispatch. Prefer early returns over deep nesting. Never forget break in switch cases.