Control Flow I — if, else, switch

সিদ্ধান্ত গ্রহণের যুক্তি

~25 min Beginner 12 practice problems Live code

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

  1. 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;
    }
  2. 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;
    }
  3. Convert a numeric day (1–7) to its name using switch.
    সংখ্যা (১–৭) থেকে দিনের নাম switch দিয়ে প্রিন্ট করুন।
    ✨ Show Answer

    উপরের Section 4-এর day.c-ই পুরো উত্তর।

  4. 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;
    }
  5. Read an operator (+ - * /) and two operands, compute the result using switch.
    একটি 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;
    }
  6. 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;
    }
  7. 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;
    }
  8. 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;
    }
  9. 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।

  10. Why does switch not work on double?
    switch কেন double-এ কাজ করে না?
    ✨ Show Answer

    switch-এর জন্য compiler একটি দ্রুত jump-table বা binary-search ছক তৈরি করে, যার জন্য discrete integer মান লাগে। double-এ নির্ভুল সমতা (equality) নিরাপদ নয় (IEEE 754 rounding) এবং jump-table বানানো যায় না।

  11. 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;
    }
  12. 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 (শব্দকোষ)

TermMeaningবাংলায়
Control FlowThe order in which statements execute.Statement গুলো কোন ক্রমে execute হবে।
ConditionalCode that runs only if a condition is true.শর্ত সত্য হলে চলে — এমন কোড।
ifRuns a block when its condition is non-zero.শর্ত সত্য হলে block চালায়।
elseBlock that runs when the if condition fails.if ব্যর্থ হলে যে block চলে।
else ifChained alternative condition.চেইনে যুক্ত পরবর্তী শর্ত।
switchMulti-way branch on an integer expression.Integer expression-এর ভিত্তিতে multi-way branch।
caseOne labeled branch inside a switch.switch-এর ভিতরের একটি label-করা branch।
breakExits a switch or loop immediately.Switch বা loop থেকে সাথে সাথে বের হওয়া।
defaultThe catch-all case in a switch.switch-এর সব না-মেলা case-এর জন্য default।
Fall-throughWhen a switch case lacks break and runs into the next case.break না থাকলে পরের case-এ গড়িয়ে যাওয়া।
BooleanA true/false value (in C: 0 = false, non-zero = true).সত্য/মিথ্যা মান।
Nested ConditionalAn 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.

Next Module → Loops and loop invariants।