Learn C Programming

lesson ১ / ৯ · Loop আর jump statement

Module ৬ · Loop আর jump statement

While: বারবার করার ধারণা

Freeপড়া

এই lesson-এ যা শিখবে

  • শুরু, condition আর step দিয়ে একটা while loop লিখতে পারবে, আর চালানোর আগে table দিয়ে trace করতে পারবে।
  • Sentinel আসা পর্যন্ত, বা input শেষ হওয়া পর্যন্ত সংখ্যা পড়তে পারবে while (scanf("%d", &x) == 1) দিয়ে।
  • একটা অংশ বাদ পড়লে কী হয় বলতে পারবে, আর প্রথম পড়া মান থেকে শুরু করে এখন পর্যন্ত সেরা মানটা ধরে রাখতে পারবে।

Bob-এর rocket game-এ একটা countdown লাগবে: 3, 2, 1, liftoff। ও চারটা printf লাইন লেখে, আর কাজ হয়ে যায়।

তারপর designer বলে, countdown শুরু হবে 100 থেকে। Bob 101টা লাইন লিখতে চায় না, আর লেখা উচিতও না। একটাই কাজ, "সংখ্যাটা ছাপো, তারপর এক কমাও", বারবার চলতে হবে।

Loop হলো code-এর এমন একটা অংশ, যেটা একটা condition যতক্ষণ অনুমতি দেয় ততক্ষণ বারবার চলে। Computer একই কাজ বারবার করতে কখনো বিরক্ত হয় না, আর ওর কাজে লাগার আসল কারণই এটা।

while: একই block, বারবার

while loop একটা condition পরীক্ষা করে। সত্য হলে block-টা একবার চালায়, তারপর ফিরে গিয়ে আবার পরীক্ষা করে। যেবার প্রথম মিথ্যা পায়, সেবারই থামে।

while loop

while (condition) {
    statements
}
  • while হলো keyword, আর এর পরে সব সময় বন্ধনী আসে।
  • Block-টা প্রতিবার চালানোর আগে condition পরীক্ষা হয়। শূন্য মানে থামো; বাকি যেকোনো মান মানে আরেকবার চালাও।
  • Brace-এর ভিতরে থাকে body। Body একবার চলাকে বলে একটা pass (কোনো কোনো বই বলে iteration)।
  • পরীক্ষা মিথ্যা হলে program শেষ brace-এর পর থেকে চলতে থাকে।
#include <stdio.h>

int main(void)
{
    int n = 3;

    while (n > 0) {
        printf("%d\n", n);
        n--;
    }
    printf("liftoff\n");
    return 0;
}
3
2
1
liftoff

3-কে 100 করে দাও, program পুরো countdown ছাপবে। আর একটা লাইনও বদলাতে হয় না।

তার মানে while হলো এমন একটা if, যেটা প্রতিটা pass-এর পরে নিজের পরীক্ষায় ফিরে যায়। উত্তর "না" হওয়া পর্যন্ত body চলতেই থাকে।

চালানোর আগে table দিয়ে loop trace করো

একই লাইন অনেকবার চলে, তাই loop একবার চোখ বুলিয়ে পড়া কঠিন। প্রতিটা pass-এর জন্য এক সারি রেখে একটা trace table বানাও (Module 5): পরীক্ষার সময় variable-গুলোর মান, উত্তর, আর body কী করল।

Passপরীক্ষার সময় nn > 0Body ছাপেn---এর পরে n
13সত্য32
22সত্য21
31সত্য10
নেই, শুধু পরীক্ষা0মিথ্যাকিছু না; loop শেষ0

সারিগুলো গোনো। Body চলেছে 3 বার, কিন্তু পরীক্ষা হয়েছে 4 বার। শেষ পরীক্ষাটা, যেটা মিথ্যা বলে, সেটাই loop শেষ করে।

while loop, back edge-সহ একটা flowchart হিসেবে প্রতিটা pass শেষ হয় পরীক্ষায় ফিরে যাওয়া দিয়ে শুরু: n = 3 পরীক্ষা: n > 0 হ্যাঁ body: n ছাপো step: n-- back edge না liftoff ছাপো প্রতিটা pass-এর আগে পরীক্ষা চলে। n = 3 হলে body চলে 3 বার, পরীক্ষা হয় 4 বার। বেরোনোর একমাত্র পথ "না"-এর তীর, তাই body-র ভিতরে কিছু একটাকে n-কে ওদিকে ঠেলতে হবে।

রঙিন তীরটা হলো back edge: body-র শেষ থেকে পরীক্ষায় ফিরে যাওয়ার লাফ। if-এর এমন কিছু নেই, আর সিদ্ধান্ত আর loop-এর মধ্যে পুরো পার্থক্যটা এই তীরেই।

তাই loop চালানোর আগে কাগজে table-টা ভরে ফেলো। শেষ সারিটা যদি কখনো না আসে, loop-ও কখনো শেষ হবে না।

শুরু, condition আর step: প্রতিটা loop-এর তিনটা অংশ

যে loop শেষ হয়, তার তিনটা অংশ থাকে। শুরু variable-কে প্রথম মান দেয়। Condition ঠিক করে আরেকটা pass চলবে কি না। Step variable-টা বদলায়, যাতে condition একসময় মিথ্যা হতে পারে।

অংশCountdown-এনা থাকলে বা ভুল হলে
শুরুint n = 3;Loop ভুল জায়গা থেকে শুরু হয়। n-কে 0 থেকে শুরু করলে body একবারও চলে না।
conditionn > 0একেবারে বাদ দিলে, while (), কিছুই compile হয় না। যে condition কখনো মিথ্যা হয় না, সেটা চিরকাল ঘোরে।
stepn--;n থেকে যায় 3, প্রতিবার পরীক্ষা সত্য, আর loop কখনো শেষ হয় না।

ফাঁকা বন্ধনী প্রতিটা command line-এ error, Playground-সহ: error: expected expression before ')' token।

শূন্য pass-এর ব্যাপারটা খেয়াল করো। while প্রথম pass-এর আগেই পরীক্ষা করে, তাই ওর body হয়তো একবারও চলবে না। Lesson 3-এ এমন একটা loop আসছে, যেটা অন্তত একবার চলবেই।

তাই loop উল্টাপাল্টা করলে তিনটা অংশ ক্রমে মিলিয়ে দেখো। Condition কি কখনো মিথ্যা হতে পারে, আর step কি ওদিকেই এগোয়?

Bob-এর যে timer কখনো থামে না

Bob রান্নাঘরের জন্য একটা timer লেখে। 5 সেকেন্ড থেকে উল্টো দিকে গুনবে, তারপর beep দেবে। তাড়াহুড়ায় step-টা ও ভুল লেখে।

#include <stdio.h>

int main(void)
{
    int seconds = 5;

    while (seconds > 0) {
        seconds - 1;
    }
    printf("beep\n");
    return 0;
}

seconds - 1; লাইনটা 4 হিসাব করে, তারপর ফেলে দেয়, তাই seconds থেকে যায় 5। Loop-টার আসলে কোনো step নেই।

Playground-এ কিছুই আসে না। 10 সেকেন্ড পরে (free বা sign in না করা learner-এর limit) Playground program-টা থামিয়ে দেয়। Status badge-এ লেখা ওঠে টাইম লিমিট পার হয়েছে, আর কোনো output নেই, beep-ও না।

Judge, মানে যে program hidden test দিয়ে problem গ্রেড করে, সে-ও একই নাম দেয়। সাধারণত প্রতিটা test-এ 1 সেকেন্ড সময় দেয়। Judge যখন বলে Time limit exceeded, তখন আগে সন্দেহ করো এমন একটা step-কে, যেটা মিথ্যার দিকে কখনো এগোয় না।

Playground Bob-এর timer চুপচাপ compile করে। নিজের মেশিনে GCC 12-এর gcc -Wall বলে warning: statement with no effect [-Wunused-value]। ঠিক করতে লেখো seconds--;।

তার মানে step-কে নিজের ফল জমা রাখতেই হবে। যে হিসাব কোথাও যায় না, সেটা step না।

Sentinel-এ থামো: 0 আসা পর্যন্ত পড়তে থাকো

Maria-র till দাম পড়তে থাকে, আর ঝুড়ি খালি হলে cashier 0 টাইপ করে। ওই 0-এর মতো মান, যেটা "data" না বুঝিয়ে "থামো" বোঝায়, তাকে বলে sentinel।

#include <stdio.h>

int main(void)
{
    int price = 0;
    int item = 0;

    while (scanf("%d", &price) == 1 && price != 0) {
        item++;
        printf("item %d: %d\n", item, price);
    }
    printf("%d items\n", item);
    return 0;
}
item 1: 120
item 2: 45
item 3: 300
3 items

ওই output-টা 120 45 300 0 99 input-এর জন্য। 0-টা sentinel, আর তার পরের 99 কখনো পড়াই হয় না।

Condition-টা ক্রমে দুইটা কাজ করে। আগে scanf একটা সংখ্যা পড়ে, আর 1 ফেরত দিতে হয়। তারপরই শুধু price != 0 চলে, কারণ বাঁ দিক মিথ্যা হলে && ডান দিকটা বাদ দেয় (Module 4)।

Sentinel-টা পড়া হয়, পরীক্ষায় আটকে যায়, আর body পর্যন্ত পৌঁছায়ই না। এজন্যই "3 items" 0-টাকে গোনে না।

তাই sentinel loop থামায়, কিন্তু কখনো data হিসেবে কাজে লাগে না। পড়াটা আর sentinel-এর পরীক্ষা একই condition-এ রাখো।

Input শেষ হওয়া পর্যন্ত পড়ো

অনেক judge problem-এ কোনো sentinel থাকে না। ওরা বলে "সংখ্যাগুলো আসবে, input-এর শেষ পর্যন্ত", কয়টা আসবে সেটা কখনো বলে না। এর জন্য লাগে সেই pattern, যেটার কথা Module 3 দিয়ে রেখেছিল।

#include <stdio.h>

int main(void)
{
    int mark = 0;
    int passed = 0;

    while (scanf("%d", &mark) == 1) {
        if (mark >= 40) {
            passed++;
        }
    }
    printf("%d passed\n", passed);
    return 0;
}
3 passed

ওই output-টা এমন input-এর জন্য: এক লাইনে 72 35 90, পরের লাইনে 40 12। scanf space আর নতুন লাইন দুইটাই একইভাবে টপকে যায়, তাই input কীভাবে সাজানো সেটা কোনো ব্যাপার না।

কয়টা মার্ক আসছে, Alice-এর program জানে না। পড়া যতক্ষণ কাজ করে, ও পড়তে থাকে। 12-এর পরে scanf আর কিছু পায় না, আর ফেরত দেয় EOF, মানে -1 (Module 3, lesson 5)। -1 তো 1 না, তাই loop শেষ।

Playground-এ input-এর শেষ মানে সোজা input box-এ তুমি যা লিখেছ তার শেষ। Judge-এর test file-ও একইভাবে শেষ হয়। নিজের computer-এর terminal-এ Linux আর macOS-এ চাপো Ctrl+D, Windows-এ Ctrl+Z তারপর Enter।

Input box ফাঁকা থাকলে body একবারও চলে না, আর program ছাপে 0 passed। কোনো মার্ক না থাকলে ঠিক উত্তর এটাই।

তাই while (scanf("%d", &x) == 1) মানে "যতগুলো সংখ্যা আছে, প্রতিটার জন্য"। সংখ্যা না এমন প্রথম জিনিসটা পেলেও এটা থামে।

এখন পর্যন্ত সেরাটা রাখো, শুরু প্রথম মান থেকে

Zara প্রতিদিন সকালে তাপমাত্রা লিখে রাখে, আর সবচেয়ে ঠান্ডাটা জানতে চায়। একটা loop এখন পর্যন্ত সেরা উত্তরটা একটা variable-এ রাখতে পারে, আর প্রতিটা pass-এ দরকার হলে সেটা বদলাতে পারে।

ওর input শুরু হয় দিনের সংখ্যা দিয়ে। প্রথম মাপটাই হয় এখন পর্যন্ত সবচেয়ে ঠান্ডা, কারণ ওই মুহূর্তে ওটাই একমাত্র মাপ।

#include <stdio.h>

int main(void)
{
    int days = 0;
    int t = 0;
    int coldest = 0;
    int day = 1;

    scanf("%d", &days);
    scanf("%d", &t);
    coldest = t;
    while (day < days) {
        scanf("%d", &t);
        if (t < coldest) {
            coldest = t;
        }
        day++;
    }
    printf("coldest: %d\n", coldest);
    return 0;
}
coldest: 12

ওই output-টা এমন input-এর জন্য: 4, তারপর 18 12 25 14। এখানে day গোনে কয়টা মাপ নেওয়া হয়ে গেছে, আর অন্তত একটা দিন সব সময় থাকে।

Passপরীক্ষার সময় dayday < daysপড়া tpass-এর পরে coldest
loop-এর আগে1এখনো পরীক্ষা হয়নি1818
11সত্য1212
22সত্য2512
33সত্য1412
নেই, শুধু পরীক্ষা4মিথ্যাকিছু না12

coldest-কে 0 থেকে শুরু করলে কী হতো? শূন্যের উপরের কোনো সকাল ওকে হারাতে পারত না, আর এই input-এ ছাপা হতো 0, যে তাপমাত্রা কেউ মাপেইনি।

তাই এখন পর্যন্ত সেরা রাখার variable শুরু হয় একটা আসল মান থেকে, প্রথম পড়া মানটা থেকে। তাহলে উত্তর সব সময় input-গুলোরই একটা।

প্রতিটা loop body-তে brace

Module 5 প্রতিটা if body-তে brace দিয়েছিল, loop-ও একই নিয়ম মানে। Brace ছাড়া একটা while-এর ভাগে পড়ে ঠিক একটা statement।

#include <stdio.h>

int main(void)
{
    int n = 3;

    while (n > 0)
        printf("%d\n", n);
        n--;
    return 0;
}

Compiler loop-এর ভিতরে একটাই লাইন দেখে, printf, তাই program বারবার 3 ছাপতে থাকে। Playground চুপ। নিজের মেশিনের gcc -Wall বলে warning: this 'while' clause does not guard... [-Wmisleading-indentation]।

তাই এই track-এ প্রতিটা loop body-তে brace থাকে, এক লাইনের body-তেও। Body কোথায় শেষ, C-কে সেটা বলে brace, space না।

Example 1: সবচেয়ে ছোট loop, যার step 1 না

মিথ্যার দিকে এগোয় এমন যেকোনো বদলই step হতে পারে। এখানে ওটা দ্বিগুণ করে।

#include <stdio.h>

int main(void)
{
    int p = 1;

    while (p < 100) {
        printf("%d\n", p);
        p = p * 2;
    }
    return 0;
}
1
2
4
8
16
32
64

64-এর পরে step p-কে 128 বানায়, আর 128 < 100 মিথ্যা। Loop চলল 7টা pass, অথচ এই সংখ্যাটা program-এ কেউ লেখেনি।

Run in Compiler
Example 2: লক্ষ্যে পৌঁছাতে কত সপ্তাহ

Kenji প্রতি সপ্তাহে একই পরিমাণ টাকা জমায়। কত সপ্তাহ লাগবে, আগে থেকে কেউ জানে না, আর while ঠিক এমন জায়গাতেই মানায়।

#include <stdio.h>

int main(void)
{
    int goal = 0;
    int weekly = 0;
    int saved = 0;
    int weeks = 0;

    scanf("%d %d", &goal, &weekly);
    while (saved < goal) {
        saved = saved + weekly;
        weeks++;
    }
    printf("%d weeks, %d saved\n", weeks, saved);
    return 0;
}
7 weeks, 1050 saved

ওই output-টা 1000 150 input-এর জন্য। ছয় সপ্তাহে হয় 900, সেটা কম, তাই সপ্তম pass চলে। লক্ষ্য 0 হলে আসে 0 weeks, 0 saved: একটাও pass না।

Step-টাও মিলিয়ে দেখো: সাপ্তাহিক জমা 0 হলে কিছুই যোগ হয় না, আর loop কখনো শেষ হয় না।

Run in Compiler
Example 3: নতুন শিখছে এমন কেউ আসলে যে loop লেখে

যতগুলো সংখ্যা আছে সব পড়ো, আর প্রতিটাকে একটা গণনায় ফেলো। প্রথম দিকের অনেক judge problem দেখতে ঠিক এরকম।

#include <stdio.h>

int main(void)
{
    int x = 0;
    int even = 0;
    int odd = 0;

    while (scanf("%d", &x) == 1) {
        if (x % 2 == 0) {
            even++;
        } else {
            odd++;
        }
    }
    printf("even %d\n", even);
    printf("odd %d\n", odd);
    return 0;
}
even 3
odd 2

ওই output-টা 4 -7 10 3 0 input-এর জন্য। -7 বিজোড়, কারণ ওর ভাগশেষ -1, আর সেটা 0 না (Module 4)। এখানে 0 সাধারণ data, sentinel না।

Run in Compiler

এটা কোথায় কাজে লাগে

  • File গোনা। GNU coreutils-এর wc একটা loop-এ input একবারে এক টুকরা করে পড়ে, যতক্ষণ না একটা পড়া কিছুই ফেরত দেয়: ওটাই file-এর শেষ।
  • Online judge। UVa-র problem 100, "The 3n + 1 problem", file-এর শেষ পর্যন্ত সংখ্যার জোড়া দেয়। সাধারণ C সমাধান ওগুলো পড়ে while (scanf(...) == 2) দিয়ে।
  • Game loop। id Software 1997-এ Doom-এর source code প্রকাশ করে। Game-টা চলে D_DoomLoop-এর ভিতরে। ওই while (1) loop প্রতিটা pass-এ input পড়ে আর একটা frame আঁকে।
  • Server। Redis ওর event loop চালায় aeMain-এ, while (!eventLoop->stop) হিসেবে, আর প্রতিটা pass-এ তৈরি হয়ে থাকা connection-গুলো সামলায়।

যে ভুলগুলো সবাই করে

১. == 1 ছাড়া scanf পরীক্ষা করা।

while (scanf("%d", &x)) {
    printf("%d\n", x);
}

কোনো command line-এই বার্তা নেই। Input শেষ হলে scanf ফেরত দেয় -1, যেটা শূন্য না, তাই পরীক্ষা সত্য। 7 9 দিলে এটা 7 ছাপে, তারপর চিরকাল 9। 1-এর সাথে মেলাও। এটা তুমি লিখবে, কারণ while (scanf(...)) পড়তে ইংরেজি বাক্যের মতো লাগে।

২. যে sentinel loop scanf-এর ফেরত দেওয়া মান দেখে না।

scanf("%d", &price);
while (price != 0) {
    printf("item: %d\n", price);
    scanf("%d", &price);
}

কোনো command line-এই বার্তা নেই। 0 আসার আগেই input শেষ হলে ব্যর্থ পড়াটা price-কে যেমন ছিল তেমনই রেখে দেয় (Module 3)। 120 45 দিলে এটা চিরকাল item: 45 ছাপে। পড়াটা condition-এর ভিতরে নাও। প্রথমে এটাই লিখবে, কারণ কাজটা মুখে বললে এমনই শোনায়।

৩. while-এর পরে একটা semicolon।

while (n > 0);
{
    printf("%d\n", n);
    n--;
}

Playground-এ নীরব। নিজের মেশিনের gcc -Wall উপরের সেই -Wmisleading-indentation warning-টাই দেয়। Semicolon-টাই একটা ফাঁকা body, তাই পরীক্ষাটা চিরকাল চলতে থাকে, আর brace পর্যন্ত কখনো পৌঁছায় না। ওটা মুছে দাও।

৪. এখন পর্যন্ত সেরাটা শুরু হয় 0 থেকে।

int coldest = 0;
while (day < days) {
    scanf("%d", &t);
    if (t < coldest) {
        coldest = t;
    }
    day++;
}

কোনো command line-এই বার্তা নেই। 18 12 25 14 দিলে এটা ছাপে coldest: 0। প্রথম পড়া মান থেকে শুরু করো। 0 লিখবে, কারণ counter তো 0 থেকেই শুরু হয়, কিন্তু সেরা মান ধরে রাখা variable counter না।

মাথা খাটাও

Bob এটা একটা forum-এ পেয়েছে, যেখানে কেউ -->-কে বলেছে "goes to" operator।

#include <stdio.h>

int main(void)
{
    int n = 3;

    while (n --> 0) {
        printf("%d\n", n);
    }
    printf("after the loop, n is %d\n", n);
    return 0;
}

কোনো বার্তা ছাড়াই এটা compile হয়। এটা কী ছাপে, আর --> আসলে কী? কঠিন অর্ধেকটা: loop-এর পরে n কেন 0 না?

Space-টা অন্য জায়গায় বসিয়ে দেখো। তারপর table দিয়ে trace করো, আর মনে করো n-- কখন নিজের মান ফেরত দেয় (Module 4)।

অনুশীলন ১সহজ

Bob-এর rocket game-এ player যে সংখ্যা বাছে, সেখান থেকে countdown হয়। এবার ওর countdown সত্যি সত্যি ঠিক করে দাও।

Input. এক লাইনে একটা পূর্ণসংখ্যা n।

Output. n থেকে 1 পর্যন্ত সংখ্যাগুলো, প্রতি লাইনে একটা।

Constraints. 1 <= n <= 1000।

Sample. Input 3 দিলে তিন লাইনে 3, 2 আর 1।

#include <stdio.h>

int main(void)
{
    int n = 0;
    scanf("%d", &n);

    /* Start, condition, step: one loop, one number per line. */

    return 0;
}

আলাদা করে গ্রেড হয় না। Problem lesson-এর largest-input একটা while loop গ্রেড করে, যেখানে কঠিন edge case আছে।

Run in Compiler
অনুশীলন ২সহজ

Maria-র till-এর এবার বিল লাগবে। Cashier দামগুলো টাইপ করে, আর ঝুড়ি খালি হলে 0।

Input. Space বা নতুন লাইন দিয়ে আলাদা করা positive পূর্ণসংখ্যা, তারপর একটা 0। 0-এর পরে যা থাকে, সেটা বাদ।

Output. এক লাইনে 0-এর আগের দামগুলোর যোগফল।

Constraints. সর্বোচ্চ 1000টা দাম, প্রতিটা 1 থেকে 1000000, তাই যোগফল একটা int-এ এঁটে যায়।

Sample. Input 120 45 300 0 দিলে 465। Input 0 দিলে 0।

#include <stdio.h>

int main(void)
{
    int price = 0;
    int total = 0;

    while (scanf("%d", &price) == 1 && price != 0) {
        /* Add this price to the total. */
    }

    /* Print the total. */

    return 0;
}

আলাদা করে গ্রেড হয় না। এর একমাত্র ফাঁদ, 0-টা যোগফলে ঢুকে পড়া, sample চালালেই ধরা পড়ে।

Run in Compiler
অনুশীলন ৩মাঝারি

David-এর আবহাওয়ার sensor একটা log-এ মাপ লিখে রাখে। Log-এ কয়টা মাপ আছে, ও জানতে চায়।

Input. Space বা নতুন লাইন দিয়ে আলাদা করা পূর্ণসংখ্যা, input-এর শেষ পর্যন্ত। একটাও না থাকতে পারে।

Output. এক লাইনে কয়টা পূর্ণসংখ্যা পড়া হলো।

Constraints. সর্বোচ্চ 100000টা মান, প্রতিটা -1000000000 থেকে 1000000000।

Sample. এক লাইনে 5 -2 7 আর পরের লাইনে 0 3 দিলে 5। ফাঁকা input দিলে 0।

#include <stdio.h>

int main(void)
{
    int x = 0;
    int count = 0;

    while (scanf("%d", &x) == 1) {
        /* One more reading. */
    }

    /* Print the count. An empty log must still print a number. */

    return 0;
}

আলাদা করে গ্রেড হয় না। গ্রেড হওয়া largest-input-কেও একইভাবে ফাঁকা input চিনতে হয়, আর সেখানে ছাপার উত্তরটা আরও কঠিন।

Run in Compiler
অনুশীলন ৪কঠিন

Zara scoreboard-এ score-এর একটা তালিকা দেয়, আর সেরাটা জানতে চায়। Score negative হতে পারে, আর কোনো কোনো খেলায় একটাও score থাকে না।

Input. Input-এর শেষ পর্যন্ত পূর্ণসংখ্যা, হয়তো একটাও না।

Output. এক লাইনে সবচেয়ে বড়টা, আর কোনো সংখ্যা না থাকলে empty।

Constraints. সর্বোচ্চ 100000টা মান, প্রতিটা -1000000000 থেকে 1000000000।

Sample. Input 3 -8 12 12 5 দিলে 12।

#include <stdio.h>

int main(void)
{
    int x = 0;

    while (scanf("%d", &x) == 1) {
        /* Keep the best score so far. What is it before any score arrives? */
    }

    /* Print the best score, or empty if nothing was read. */

    return 0;
}

largest-input নামে গ্রেড হয়। Hidden test-এ আছে শুধু negative score-এর একটা তালিকা, আর একদম ফাঁকা একটা input।

Run in Compiler

সচরাচর যে প্রশ্নগুলো আসে

  • কখন while নেব, আর কখন for?

    কয়টা pass লাগবে আগে থেকে জানা না গেলে while নাও, যেমন input পড়া বা টাকা জমানোর লক্ষ্য। গোনার কাজে পরের lesson-এর for মানায় বেশি। একটা দিয়ে আরেকটার কাজ করাই যায়; যেটা পড়তে বেশি পরিষ্কার, সেটা নাও।

  • while (1) কি সব সময়ই bug?

    না। Doom-এর game loop ইচ্ছা করেই এভাবে লেখা। এমন loop ভিতর থেকে বের হয় break দিয়ে, যেটা lesson 4-এ আছে। তবে আজ তোমার program-এ এটা প্রায় সব সময়ই bug।

  • Program থামিয়ে দেওয়া হলো, আর loop-এর আগে যে লাইনটা ছেপেছিল সেটাও নেই। কেন?

    printf output একটা buffer-এ জমায়, তারপর টুকরা টুকরা করে পাঠায়। Playground বা judge-এ output যায় একটা file-এ। ওখানে program থামিয়ে দিলে buffer-এ যা অপেক্ষায় ছিল, সেটা আর কখনো যায় না।

মূল কথা

  • while প্রতিটা pass-এর আগে condition পরীক্ষা করে, আর প্রথম পরীক্ষাই মিথ্যা হলে একটাও pass চলে না।
  • Trace table-এ প্রতিটা pass-এর জন্য এক সারি, আর শেষে একটা সারি যেখানে পরীক্ষা মিথ্যা হয়।
  • প্রতিটা loop-এর লাগে শুরু, condition আর step; আসল step না থাকলে loop কখনো শেষ হয় না।
  • চুপচাপ ঘুরতে থাকা loop চলতেই থাকে, যতক্ষণ না time limit ওকে থামায়; badge-এ লেখা ওঠে টাইম লিমিট পার হয়েছে।
  • while (scanf("%d", &x) == 1) যতগুলো সংখ্যা আছে সব পড়ে; sentinel-এর পরীক্ষা থাকে একই condition-এ।
  • এখন পর্যন্ত সেরা মান শুরু হয় প্রথম পড়া মান থেকে, আর প্রতিটা loop body-তে brace থাকে।

এরপর for শুরু, condition আর step তিনটাকেই এক লাইনে বসায়, আর Bob চেষ্টা করে 1 থেকে 10 ছাপতে।

lesson ১ শেষ

শেষ হলে চিহ্ন দিন, অগ্রগতি আপনার সাথে থাকবে।

পরেরটা: For: init, condition, update, ধাপে ধাপে