সূচিপত্র

ধর তুমি হোমওয়ার্ক করে আন নাই, আর তোমার টিচার তোমাকে শাস্তি দিল যে তুমি পরের দিন ১০০ বার “I won’t miss my homework again” প্রিন্ট করে আনবে। এখন তুমি তো বুদ্ধিমান! তুমি করলে কি একবার লিখেই সেটা ৯৯ বার কপি-পেস্ট করে দিলে। তাহলে এই কাজ যদি আমরা কম্পিউটারে করতে চাইতাম, অর্থাৎ কম্পাইলারকে দিয়ে ১০০ বার এই লাইন প্রিন্ট করাতে চাইতাম, তাহলে নিচের মত একটা প্রোগ্রাম লিখতে পারতামঃ

#include <stdio.h>
int main() {
    printf("I won't miss my homework again!\n");
    printf("I won't miss my homework again!\n");
    printf("I won't miss my homework again!\n");
    printf("I won't miss my homework again!\n");
    printf("I won't miss my homework again!\n");
    return 0;
}

পাঁচবারের বেশি কপি-পেস্ট করার ধৈর্য আমার নাই। তাই আমি এখানেই রাখলাম। তবে তোমার ইচ্ছা হলে তুমি চেষ্টা করে দেখতে পার!

তবে একটা জিনিস চিন্তা করে দেখ। এখানে আমরা কি করছি? প্রথমবার লিখে চিন্তা করলাম যে একবার লেখা হয়েছে। দ্বিতীয়বার লেখার পর বুঝলাম দুইবার… এভাবে চলতে চলতে যখন দেখলাম ১০০ বার লেখা হয়ে গিয়েছে, তখন আমরা আমাদের লেখালেখি থামিয়ে দিলাম!

এখন আমরা একই কাজ কি আমাদের কম্পিউটারকে দিয়েও করাতে পারি না? এজন্য যা লাগবে তা হল, একটি ভ্যারিয়েবল যার দ্বারা আমরা হিসাব রাখবো কতবার printf() ব্যবহার করে আমরা প্রিন্ট করেছি। আর লাগবে একটি শর্ত, যাতে ১০০ বার প্রিন্ট করার পর আমরা প্রিন্ট করা থামিয়ে দি। এই বারবার একই কাজ করার জন্য আমরা যেটা ব্যবহার করবো, তার নাম হল লুপ। লুপ আছে তিন ধরণের। এই পর্বে আমাদের আলোচনা while লুপ নিয়েই।

এখন while লুপের বেসিক স্ট্রাকচার নিচের মতঃ

while (শর্ত) {
    // যে কাজটা করতে হবে
}

এখন আমাদের শর্ত কি এবং লুপকে দিয়ে কি করাব, তা আমরা ইতোমধ্যেই জানি। তো আমরা আমাদের কোডটা ঝটপট লিখে ফেলি!

#include <stdio.h>
int main() {
    int i; 
    while (i<=100) {
        printf("I won't miss my homework again!\n");
    }
    return 0;
}

কোডটা রান না করে বল তো এখানে কি ঘটতে পারে? এখানে দুই ধরণের ঘটনা ঘটতে পারে।

একঃ হয় আউটপুট আসবে নিচের মত। অর্থাৎ আমরা প্রিন্ট করতে বললেও কম্পিউটার আমাদের কথা শুনছে না।

Snap 2015-03-28 at 20.03.04

অথবা আসবে নিচেরটার মত। অর্থাৎ এটা প্রিন্ট করতেই থাকবে, ১০০ পার হয়ে গেলেও… অর্থাৎ কম্পিউটার প্রিন্ট করছে ঠিকই, কিন্তু ১০০-তে গিয়ে থামছে না!

Snap 2015-03-28 at 20.04.48

এর কারণ হল, আমাদের কোডে বড় ধরণের দুইটা ভুল আছে। প্রথমত আমরা চিন্তা করে দেখি কেন দুইটি ভিন্ন ধরণের ঘটনা এখানে ঘটতে পারে। এর কারণ হতে পারে এমন যে, এটি হয় লুপে ধুকছে, কিংবা লুপে ধুকছে না! অর্থাৎ মাঝে মাঝে i-এর মান শুরুতে ১০০-এর সমান বা এর চেয়ে ছোট, আবার মাঝে মাঝে i-এর মান শুরুতেই ১০০-এর চেয়ে বড়। এর কারণ হল আমরা i ভ্যারিয়েবলটা ডিক্লেয়ার করলেও তাতে কোনো মান অ্যাসাইন করে দি নাই। ফলে এর মাঝে একটা গার্বেজ ভ্যালু এসে বসে থাকে। এখন এই গার্বেজ ভ্যালু যে কোনো কিছুই হতে পারে।

তো আমরা এবার i-এর মান অ্যাসাইন করে দি।

#include <stdio.h>
int main() {
    int i=1; 
    while (i<=100) {
        printf("I won't miss my homework again!\n");
    }
    return 0;
}

এখন আমরা নিশ্চিতভাবে বলতে পারি যে, প্রিন্ট হবে। কিন্তু রান করলে দেখবো যে, প্রিন্ট হলেও তা প্রিন্ট হতেই আছে, থামছে না। এর কারণ হল আমরা যখন নিজেরা লিখতাম, তখন তো চিন্তা করতাম কয়বার লেখা হয়েছে এবং প্রতিবার লেখার পর এক করে বাড়াতাম… মানে প্রথম বার লেখার পর এক, দ্বিতীয়বার লেখার পর দুই… কিন্তু এখানে আমরা i-এর মান তো বাড়ায় নাই। এজন্য i-এর মান সবসময় 1 থেকে যাচ্ছে আর লুপ থেকেও বের হচ্ছে না। তো আমাদের কোডটা আবারও ঠিক করি।

#include <stdio.h>
int main() {
    int i=1; 
    while (i<=100) {
        printf("I won't miss my homework again!\n");
        i = i+1;
    }
    return 0;
}

এবার রান করলে দেখবা একসময় গিয়ে প্রিন্ট করা থামছে। ১০০ বার প্রিন্ট করেই থামছে। বিশ্বাস না হলে কোডটা একটু মডিফাই করে আবার রান করে দেখতে পার!

#include <stdio.h>
int main() {
    int i=1;
    while (i<=100) {
        printf("Printing for %dth time: I won't miss my homework again!\n", i);
        i = i+1;
    }
    return 0;
}

তোমাদের হয়তো বিরক্তি চলে আসছে শুরুতে এতবার ভুল কোড দেখানোতে। কিন্তু দেখিয়েছি একটি কারণে, তা হল পরে অনেকের এই ব্যাপারগুলোতে ঝামেলা হয়। তাই শুরুতেই দেখিয়ে দিলাম, যাতে পরে ভুল হলে সহজেই বুঝে নিতে পার!

এর সাথে সাথে তোমরা লুপের তিনটি গুরুত্বপূর্ণ অংশের সাথেও পরিচিত হয়ে গেছঃ

  •  Initialization : আমরা লিখেছি int i=1;
  •  Condition : আমাদের শর্ত ছিল i<=100
  •  Increment or Decrement : আমরা i-এর মান প্রতি লুপে বাড়িয়েছি, এটাই increment, কমালে সেটা হত decrement

এবার আমরা বুঝার চেষ্টা করি এখানে আসলে কি হচ্ছে। এজন্য আমরা এবার আরেকটি কোড লিখবো, সেটা হল ৭-এর নামতা লেখার কোড!

আমরা প্রথমেই ৭ এর নামতাটা একটু দেখে নি।

৭ * ১ = ৭

৭ * ২ = ১৪

৭ * ৩ = ২১

৭ * ৪ = ২৮

৭ * ৫ = ৩৫

৭ * ৬ = ৪২

৭ * ৭ = ৪৯

৭ * ৮ = ৫৬

৭ * ৯ = ৬৩

৭ * ১০ = ৭০

এখানে আসলে আমরা কি করছি খেয়াল কর। আমাদের একটা ফিক্সড মান আছে, সেটা হল ৭। আরেকটা ভ্যারিয়েবল আছে, যার মান ১ থেকে শুরু করে প্রতি ধাপে ১ করে বাড়ছে। আর শেষে আমরা আমাদের ফিক্সড মান ৭ আর ভ্যারিয়েবলটা গুণ করে যেটা পাচ্ছি, সেটা প্রিন্ট করছি। তাহলে আমরা এবার কোডটা লেখার চেষ্টা করি।

আমাদের প্রথমেই দুইটা ভ্যারিয়েবল অ্যাসাইন করতে হচ্ছে, যার একটাতে থাকবে । আরেকটাতে শুরুতে ১ থাকবে এবং আমরা লুপে ঢুকিয়ে তা এক করে বাড়াব।

এরপর আমাদের শর্ত ঠিক করতে হবে। যেহেতু আমরা দ্বিতীয় ভ্যারিয়েবলটির মান ১০ পর্যন্তই বাড়াবো, তাহলে এই শর্ত হবে যতক্ষন এর মান ১০ না হয়, ততক্ষন।

/* এখানে একটা কথা হল আমাদের শর্ত পুরোপুরি increment-এর উপর নির্ভর করে। আমরা যদি ভ্যারিয়েবলটির মান ১ করে না বাড়িয়ে ২ করে বাড়াতাম, তাহলে কিন্তু আমাদের শর্তে ১০-এর বদলে লিখতে হত ২০!  */ 

আর বাকি থাকে increment-এর অংশটা। তো, আমরা কোডটা লিখে ফেলি!

#include <stdio.h>
int main() {
    int num = 7, i=1, multiple;
    while (i <= 10) {
        multiple = num*i;
        printf("%d * %d = %d\n", num, i, multiple);
        i = i+1;
    }
    return 0;
}

এই কোডটা রান করলে দেখবা নিচের আউটপুটটা আসছে।

Snap 2015-03-28 at 20.34.23

আউটপুট ঠিকই আছে। কিন্তু আমাদের চিন্তা আপাতত আউটপুট নিয়ে না। আমাদের চিন্তা হল এখানে কি হচ্ছে সেটা বুঝা নিয়ে।

দেখ, আমরা প্রথমেই i-এর মান রেখেছিলাম 1. এখন লুপে এসে প্রথমেই কন্ডিশনে দেখল i-এর মান ১০-এর ছোট নাকি। যেহেতু 1, 10-এর চেয়ে ছোট, লুপে ঢুকে গেল এবং প্রিন্ট করে তারপরের লাইনে i-এর মান বেড়ে 2 হয়ে গেল। এবার আবার লুপের শুরুতে ফিরে গেল। তারপর আবারও একইভাবে চেক করা হল i-এর মান ১০ এর ছোট নাকি।

এভাবে চলতে চলতে ১০-বার লুপ ঘুরার পর i-এর মান হয়ে যায় ১১। এবার যখন i-এর মান ১০-এর ছোট নাকি চেক করা হয়, তখন দেখা যায় i-এর মান ১০-এর ছোট না এবং সেই মুহুর্তে কম্পাইলার লুপ থেকে বের হয়ে আসে এবং while লুপটা যেখানে শেষ হয়, তার পর থেকে কাজ করা শুরু করে।

আশা করি বুঝাতে পেরেছি। এবার চেষ্টা কর তো পুরো কাজটা উল্টো দিক থেকে করতে। অর্থাৎ, নামতাটা প্রিন্ট হবে নিচের মতঃ

7 * 10 = 70

7 * 9 = 63

… … … … …

… … … … …

… … … … …

7 * 2 = 14

7 * 1 = 7

আশা করি পারবে। সমস্যা হলে কমেন্ট সেকশনে জানাও! আগামি পর্বে লুপ সম্পর্কে আরও কিছু জানার পাশাপাশি আরও এক ধরণের লুপ সম্পর্কেও দেখবো। ততদিন পর্যন্ত ভাল থেক, সুখে থেক! 😀

Muntasir Wahed

Muntasir Wahed

System Administrator at স্বশিক্ষা.com
Jack of all trades, master of none.
Muntasir Wahed
Muntasir Wahed