লুপিং (Looping)

Class চলছে। অনেক Boring Class। কিছুতেই তুমি তোমার মনোযোগ Class এ দিতে পারছো না। তাই তুমি একটি কাগজ বের করে তা দিয়ে একটা কাগজের Plane বানিয়ে ফেললে। তোমার Run Way থেকে Plane টিকে উরিয়ে দিলে কিন্তু তা উড়ে গিয়ে Crash করলো তোমার Teacher এর মাথায়। সে খুবই রাগি মানুষ। রেগে গিয়ে সে তোমাকে এক হাজার বার লিখতে বললো “I’ll never throw paper plane in the class.”। তুমিতো ভয়ে শেষ। এতো লিখা কতক্ষণে শেষ করবে। তোমার মাথায় বুদ্ধি আসলো তুমি একটা Program লিখে ফেলবে যা 1000 বার লেখাটা print করবে তুমি যা করলে তা হল একের পরপর এক printf লিখে ফেললে। ১৫টা printf লিখার পর তোমার মাথায় আসলো যে তুমি তো printf গুলো Copy Paste করতে পারো। তাই তুমি সেটাই করলে। অবশেষে তুমি যা করলে তা হলঃ

#include <stdio.h>

int main(){
    printf(“I’ll never throw paper plane in the class.\n”); // ১ বার
    printf(“I’ll never throw paper plane in the class.\n”); // ২ বার
    printf(“I’ll never throw paper plane in the class.\n”); // ৩ বার
    .
    .
    .
    printf(“I’ll never throw paper plane in the class.\n”); // ১০০০ বার
    return 0;
}

যখন তুমি এটা তোমার Teacher কে দেখালে সে আরো রেগে গিয়ে বললো, “Program ই যখন লিখবে তাহলে একটা সুন্দর Short Cut Program লিখতে? এভাবে ১০০০টা printf লিখার কি দরকার ছিলো”। তুমি হতাশ হয়ে গেলে। তোমার এতো পরিশ্রম কোন কাজে আসলো না। তুমি যদি Looping জানতে তাহলে তোমার এতো কষ্ট করতে হত না।

একি কাজ যদি আমাদের বারবার করতে হয় তবে আমরা Loop ব্যবহার করতে পারি। C Programming Language এ তিন ধরণের Loop ব্যবহার করা হয়ে থাকে।

For Loop: নির্দিষ্ট সংখ্যক বার যদি কোন কাজ Repeat করতে চাই তাহলে আমরা for loop ব্যবহার করতে পারি। এবার তোমার Punishment টা for loop দিয়ে অতি সহজে লিখে ফেলিঃ

#include <stdio.h>

int main(){
    int i;
    for(i=1; i<=1000; i++){
        printf(“I’ll never throw paper plane in the class.\n”);
    }
    return 0;
}

কত সহজে আমরা কাজটা করে ফেললাম। for loop এর তিনটা অংশ। for এর parentheses এর ভিতর প্রথমে i = 0; হল গিয়ে Initialization. এখানে আমরা বলে দিচ্ছি কত থেকে আমরা শুরু করতে চাই। এর পর আমরা বলে দিচ্ছি আমাদের শর্ত অর্থাৎ i যতক্ষণ ১০০০ এর সমান অথবা ছোট ততক্ষণ Repeat করতে চাচ্ছি। এবং শেষে আমরা এক এক করে i কে increment করছি। এখানে i কে Loop Control Variable বা Loop Controller বলা হয়।

একটি ছবির মাধ্যমে আমরা for loop কিভাবে কাজ করে বুঝার চেষ্টা করিঃ

For Loop

প্রথমে আমাদের for loop টি Initialize করা হবে। এরপর এটি Condition Test করে, Condition True হলে Loop এর Body তে যত Code থাকে সবগুলো Execute করে। Body Execution শেষে এটি Loop Controller কে Increment করে। এরপর আবার Condition Test করে এবং চলতে থাকে থাকে যতক্ষণ না পর্যন্ত Condition টি মিথ্যা হয়।

Nested if… else… এর মত আমরা Nested Loop ও লিখতে পারি। Array শিখার সময় আমরা 2D Array ব্যবহার করার জন্য Nested Loop ব্যবহার করবো। তাই Nested For Loop এর ব্যবহার আমরা ঐখানেই শিখে ফেলবো।

While Loop: আমরা জানি না কতক্ষন একটা কাজ আমাদের Repeat করতে হবে তবে এতটুকু জানি যে একটা শর্ত যতক্ষণ সত্য থাকবে ততক্ষণ Repeat করতে হবে তাহলে আমরা While Loop ব্যবহার করবো। ধর আমাদেরকে একটা সংখ্যা দিয়ে বলা হল সংখ্যাটিকে উল্টা করে দিতে অর্থাৎ 123 Input দেওয়া হলে Output দিতে হবে 321। এটা কিভাবে করবো? প্রথমে Code দেখা যাকঃ

#include <stdio.h>

int main(){
    int N, reverseN = 0;
    scanf(“%d”, &N);
    while(N!=0){
        reverseN = reverseN*10 + N%10;
        N /= 10;
    }
    Printf(“%d\n”, reverseN);
    return 0;
}

আমরা একটা Table এর মাধ্যমে Program টা বুঝার চেষ্টা করিঃ

Reverse

Table টির প্রথম Column হল N এর Initial Value, দ্বিতীয় Column হল reverseN এর Initial Value, তৃতীয় Column হল reverseN এবং 10 এর গুনফল, এরপর N কে 10 দিয়ে ভাগ করার পর ভাগশেষ, এরপর পূর্বের দুই Column এর যোগফল, এরপর reverseN এর নতুন Value এবং সব শেষে N কে 10 দিয়ে ভাগ দেওয়ার পর N এর নতুন Value।

এই Program টিতে আমরা যা করছি তা হল প্রথমে একটি সংখ্যা N Input নিচ্ছি। তারপর N যতক্ষণ না পর্যন্ত শূণ্য হয় ততক্ষন পর্যন্ত while loop চালাচ্ছি। কেন তা Table টা দেখেই বুঝতে পেরেছো আশা করি। আমরা আমাদের উত্তর রাখার জন্য reverseN নামে একটা Variable রেখেছি এবং তাকে শুরুতে ০ (শূণ্য) করে দিয়েছি তা না হলে reverseN * 10 করার সময় ভুল Result আসবে যেহেতু reverseN এর কোন Value নেই। এবারে আমরা N কে 10 দিয়ে Modulus করে N এর সর্ব ডানে Digit টি বের করে নিচ্ছি এবং reverseN কে 10 দিয়ে গুন করে একঘর বামে Shift করে দিচ্ছি এবং তার সাথে N % 10 যোগ করে দিচ্ছি। যেহেতু আমাদের সর্ব ডানে সংখ্যাটি নিয়ে কাজ করা শেষ তাই আমরা N কে 10 দিয়ে ভাগ করে ছোট করে দিচ্ছি অর্থাৎ সর্ব ডানের Digit টি বাদ দিয়ে দিচ্ছি।

Loop টি প্রথম বার শেষ হওয়ার পর আমরা সর্ব ডানে সংখ্যাটিকে সর্ব বামে এনে ফেলেছি। একই ভাবে কাজ করে আমরা প্রত্যেকটি Digit কে ডান থেকে বামে নিয়ে গিয়েছি অর্থাৎ উল্টা করে ফেলেছি। এক পর্যায়ে N কে ছোট করতে করতে শূণ্য হয়ে গেলে আমরা Loop শেষ করে দিচ্ছি। Table এর Last Row তে N এর মান 1 ছিল ভাগ করার পর 0.1 হওয়ার কথা তাহলে 0 হলে কিভাবে? কারণ হচ্ছে N একটি Integer Variable তাই এটি দশমিক সংখ্যা নিবে না। শুধু পূর্ণ অংশটিই নিবে। পূর্বের Loop গুলোর ক্ষেত্রেও একই শর্ত প্রজোয্য।

Do While Loop: Do While Loop মুলত While Loop এর মতই, পার্থক্য হল এটি আগে অন্তত একবার কাজ করে এরপর শর্ত যাচাই করে। উদাহরণ দেখলেই বুঝতে পারবেঃ

#include <stdio.h>
int main(){
    int i = 0;
    do {
        printf(“Hello\n”);
    }
    while(i>0);
    return 0;
}

এখানে while এর ভিতরে যে শর্তটি আছে তা মোটেও সত্য না তারপরও আমাদের Program একবার Hello print করবে। এরপর শর্ত যাচাই করতে এসে দেখবে যে শর্তটি মিথ্যা তাই Loop টি এখানেই শেষ হয়ে যাবে। Do While তার নামের মতই কাজ করে অর্থাৎ “First Do Then Repeat While The Condition Is True”।

Break: আমরা যে শর্তই লিখি না কেন তার উত্তর দু’টাই হতে পারে হয় True নাহয় False। C Program এ True কে 1 এবং False 0 দিয়ে প্রকাশ করা হয়ে থাকে। এখন একটা প্রোগ্রাম দেখিঃ

#include <stdio.h>

int main(){
    while(1){
        printf(“Hello\n”);
    }
    return 0;
}

While এর Parentheses এর ভিতর 1 থাকা মানে শর্তটি সদা সত্য। শর্তটি যেহেতু সদা সত্য তাহলে প্রশ্ন হচ্ছে লুপটি শেষ হবে কি করে?

১. যদি তুমি বিরক্ত হয়ে প্রোগ্রাম টি কেটে দাও।

২. বাংলাদেশের এর Load Shedding এর কল্যাণে তোমার PC Off হয়ে গেলে।

৩. তোমার PC কোন কারণে Crash করলে।

অর্থাৎ নিউটন এর গতির প্রথম সূত্রের মত বায্যিক কোন বল এই Program এর উপর প্রোয়োগ না করা হলে এটি সারাজীবন চলতেই থাকবে।

এখন এটিকে কি করে থামানো যায়? এর জন্য আমাদের জানতে হবে Break এর কাজ। আমরা যদি চাই যে কোন শর্ত সত্য হওয়ার সাথে সাথে Loop থেকে বের হয়ে যেতে তাহলে Break ব্যবহার করবো।

#include <stdio.h>

int main(){
    int i = 1;
    while(1){
        printf(“Hello\n”);
        if(i = 1) break;
    }
    return 0;
}

এখন আমাদের Program টি এক বার Hello print করার পরই break করে Loop থেকে বের হয়ে আসবে যদিও আমাদের While এর Condition টি এখনো সত্য।

Continue: এখন আমাদের কে যদি বলা হয় ১ থেকে ১০০ পর্যন্ত সকল সংখ্যা Print করতে কিন্তু ৫ এবং ৫ এর গুণিতক Print করা যাবে না তাহলে কি করবো? আমরা সাহায্য নিবো continue এর। continue এর কাজ হল যখন কোন Condition সত্য হবে তখন এটি ঐ Condition এর পরবর্তী কাজ সমূহ না করে Loop টাকে continue করবে।

#include <stdio.h>
int main(){
    int i;
    for(i = 1; i<=100; i++){
        if(i%5==0) continue;
        printf(“%d\n”, i);
    }
    return 0;
}

5 বা 5 এর গুণিতক কে 5 দিয়ে ভাগ করলে ভাগ শেষ সর্বদা 0 (শূণ্য) হবে। এখানে i এর মান 5 বা 5 এর গুণিতক হলেই আমরা continue দিয়ে printf Line টিকে skip করে Loop টি Continue করছি।

Advertisements
Tagged with: , , , , , , , ,
Posted in বেসিক প্রোগ্রামিং

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: