সূচিপত্র

আগের পর্বে আমরা এক ধরণের লুপ শিখেছি, যার নাম ছিল while লুপ। এই এক ধরণের লুপ দিয়েই সব কিছু করে ফেলা যায়। আজ আমরা শিখবো for লুপ সম্পর্কে। কিন্তু for লুপ এমন কোনো কাজ করতে পারে না, যা while লুপ দিয়ে সম্ভব না! অর্থাৎ এর বাড়তি কোনো কাজই কিন্তু নেই!

তবুও for লুপ আমরা ব্যবহার করি কেন?

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

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

for ( initialization ; condition ; increment/decrement) {
    // code
}

দেখ এখানে একই সাথে দুইটা সেমিকোলনের আশেপাশে সব কিছু করে ফেলা হচ্ছে। এবং একই সাথে থাকে বলে এর কোনো একটা মিস যাওয়ার সম্ভাবনাও তাই কম থাকে!

আমরা গত পর্বে while লুপ দিয়ে নামতা লিখেছিলাম এভাবেঃ

#include <iostream> 
using namespace std;
int main() {
    int num = 7, i=1, multiple;
    while (i <= 10) {
        multiple = num*i;
        cout << num << " * " << i << " = " << multiple << endl;
        i = i+1;
    }
    return 0;
}

সি কোড পাবে এখানে

এখন আমরা একই কাজ যদি for লুপ দিয়ে করতাম, তাহলে লিখতাম এভাবেঃ

#include <iostream>
using namespace std;
int main() {
    int num = 7, i, multiple;
    for (i = 1 ; i<=10 ; i = i+1) {
        multiple = num*i;
        cout << num << " * " << i << " = " << multiple << endl;
    }
    return 0;
}

সি কোড এখানে

আবার তুমি চাইলে কিন্তু ইনিশিয়ালাইজেশনটা এখানেও while লুপের মত লুপের বাইরেই করে ফেলতে পার।

#include <iostream>
using namespace std;
int main() {
    int num = 7, i=1, multiple;
    for ( ; i<=10 ; i = i+1) {
        multiple = num*i;
        cout << num << " * " << i << " = " << multiple << endl;
    }
    return 0;
}

চাইলে ইনক্রিমেন্টটাও লুপের ভিতরে করতে পার আলাদাভাবে। :p

#include <iostream>
using namespace std;
int main() {
    int num = 7, i, multiple;
    for ( ; i<=10 ;) {
        multiple = num*i;
        cout << num << " * " << i << " = " << multiple << endl;
        i = i+1;
    }
    return 0;
}

তবে, সেমিকোলনগুলা অবশ্যই দিতে হবে।

এমনকি তুমি চাইলে শর্তটাও বাদ দিতে পার প্রথম ব্র্যাকেট থেকে। এর মধ্যে রেখে দাও শুধু দুইটা সেমিকোলন। :p

#include <iostream>
using namespace std;
int main() {
    int num = 7, i=1, multiple;
    for ( ;  ; ) {
        multiple = num*i;
        cout << num << " * " << i << " = " << multiple << endl;
        i = i+1;
    }
    return 0;
}

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

অনেক বকবক করে ফেললাম। এবার তোমার জন্য একটা ছোট্ট কাজ! আমরা ৭ এর নামতা লিখলাম। ধর তোমাকে ইউজার বললো, তাকে সাতের নামতা দিলে হবে না। সে যেটা বলে, সেটার নামতা তাকে দিতে হবে!

কাজটা খুব একটা কঠিন না। প্রথমেই num ভ্যারিয়েবলটা ইউজার থেকে ইনপুট নিতে হবে। আর বাকি কাজটা আগের মতই। কোডটা নিজে নিজে লিখে ফেল! একবারও চেষ্টা না করে আমার কোডটা দেখিও না। 🙂

কোডটা হবে এরকমঃ

#include <iostream>
using namespace std;
int main() {
    int num, i, multiple;
    cin >> num;
    for (i = 1 ; i<=10 ; i = i+1) {
        multiple = num*i;
        cout << num << " * " << i << " = " << multiple << endl;
    }
    return 0;
}

 সি কোড

ও আচ্ছা, সি++ এর বিশাল একটা সুবিধার কথা তো বলা হল না! আমরা সি++ এ শুধু for লুপের মধ্যে ইনিশিয়ালাইজেশন না, এর সাথে ডিক্লারেশনটাও করে ফেলতে পারি! 😀 এটা বলার কারণ হল, এটা সি++ এ করা যায়, কিন্তু সি-তে নিষিদ্ধ!

অর্থাৎ, তুমি যদি নিচের কোডটা লিখ, তাহলে সেটা ঠিক মতই কাজ করবে।

#include <iostream>
using namespace std;
int main() {
    int sum = 0;
    for (int i = 1 ; i<=100 ; i++) { // ekhane dekho for loop er parantheses er moddhei declare korchi
        sum = sum + i;
    }
    cout << sum << endl;
    return 0;
}

এখন আমরা এই জিনিসটা জানার পাশাপাশি আরও একটা নতুন সমস্যা সমাধান করে ফেললাম! সেটা হল ১ থেকে ১০০ পর্যন্ত সকল ইন্টিজারের যোগফল বের করার সমস্যা। তাহলে তুমি ঠিক একইভাবে চাইলে অন্য যেকোনো সীমার যোগফল বের করতে পারবে না? অবশ্যই!

কিন্তু ধর তোমাকে বলা হল ১ থেকে ১০০০ পর্যন্ত যোগফলের কোড লিখতে। এবং তুমিও সমস্যা জেনে মাত্র মহা উৎসাহে লুপ দিয়ে সমস্যা সমাধান করে ফেললে!

যদিও এখানে সময়ের খুব বেশি পার্থক্য হবে না, তবুও এখানে লুপ চালানো কিন্তু পুরোটাই বোকামি! তুমি নিশ্চয় ধারা অধ্যায়টা পড়েছ! আর না পড়লেও সমস্যা নেই, গুগল তো আছেই! 🙂  এরকম ১ থেকে n পর্যন্ত যোগফল বের করার কিন্তু একটা সূত্র আছে, আমরা সেই সূত্র ব্যবহার করলে কিন্তু একবারও লুপ চালাতে হবে না! তাই, আমরা যেখানে এরকম সূত্র জানবো, কিংবা তৈরি করে নিতে পারবো, সেখানে চেষ্টা করবো লুপ ব্যবহার না করতে!

সূত্রটা হলঃ ১ থেকে n পর্যন্ত সব সংখ্যার যোগফল = n*(n+1) / 2

#include <iostream>
using namespace std;
int main() {
    int sum = (1000 * 1001)/2;
    cout << sum << endl;
    return 0;
}

সি কোড

এখন যদি তোমাকে বলা হয় 13 থেকে 999 পর্যন্ত যোগফল বের করতে, তাহলে কি তুমি পারবে না? লুপ না চালিয়ে? একটু চিন্তা করে দেখ। যদি অন্তত ৫ মিনিট চিন্তা করেও না পার, শুধু তাহলেই নিচের হিন্টটা দেখবে!

/* 1 থেকে 999 এর যোগফল – 1 থেকে 12 এর যোগফল = 13 থেকে 999 পর্যন্ত যোগফল! */

আচ্ছা, বল তো, ১ থেকে ১০০০ না বলে ১ থেকে ১০০০০০০ পর্যন্ত যোগফল বের করতে বললে কি হত? তখন কিন্তু এই সূত্র ব্যবহার করে কোড লিখে রান করে দেখবে ঠিক উত্তর আসছে না। কারণ এক্ষেত্রে উত্তরটা ইন্টিজারের সীমা অতিক্রম করে চলে যাচ্ছে! এক্ষেত্রে তোমাকে প্রথমেই ১০০০০০০-কে একটা long long int  ভ্যারিয়েবলে রাখতে হবে। এরপর আরেকটা long long int ভ্যারিয়েবলে রাখতে হবে যোগফলটা।

#include <iostream>
using namespace std;
int main() {
    long long int sum;
    long long int n = 1000000;
    sum = (n*(n+1))/2;
    cout << sum << endl;
    return 0;
}

এই কোডটা রান করলেই দেখবে আউটপুট আসছে ঠিক মত!

Snap 2015-04-29 at 22.28.38

ভয় পাওয়ার কিছু নেই, এই পর্বটা একটু সংক্ষিপ্ত রাখবো। শুধু আরেকটা জিনিস দেখেই শেষ! 😀

আমরা এখন যেটা দেখবো, তার নাম হল Nested Loop. এর অর্থ হল লুপের ভেতর লুপ! কথা না বাড়িয়ে উদাহারণেই চলে যায়!

আমরা আমাদের নামতার উদাহারণে আমরা ৭-এর নামতা প্রিন্ট করেছিলাম। ছোটবেলার কথা মনে আছে? 😀 তখন কিন্তু একটা নামতা মুখস্ত করলেই চলতো না, ১ থেকে ২০ – সবগুলোর নামতাই লাগতো! তো আমরা এই কাজটা এবার কম্পিউটারকে দিয়ে করিয়ে নি! অর্থাৎ, এখন আমরা শুধু ৭ এর নামতাই প্রিণ্ট করব না। ১ থেকে ২০ – সবগুলো সংখ্যার নামতা একটার নিচে আরেকটা প্রিন্ট করবো।

ঘাবড়ে যাওয়ার কিছুই নেই। কোনো সমস্যা পেলে শুরুতেই এর পুরো ব্যাপারটা নিয়ে চিন্তা করলে মাথা ঘুরাটাই স্বাভাবিক! তোমাকে যেটা করতে হবে, তা হলে প্রবলেমটাকে কয়েকটা সাবপ্রবলেমে ভাগ করে ফেলা! এরপর তোমাকে দেখতে হবে এই সাবপ্রবলেমগুলোর কোনোটা তুমি পার কি না।

তো এখন আমাদের বুঝতে হবে, আমরা কি পারি। আমরা একটা নির্দিষ্ট সংখ্যার নামতা লিখতে পারি। এখন আমাদেরকে সংখ্যাটার নামতা লেখা শেষে তার মান এক করে বাড়িয়ে দিতে হবে, তাহলেই তো কাজ শেষ! তাহলে আমাদের সংখ্যাটা শুরু হবে কোথা থেকে? ১। আর শেষ? ২০!

তাহলে আমাদের একটা লুপ লাগবে এমনঃ

#include <iostream>
using namespace std;
int main() {
    int num, i, multiple;
    for (num = 1; num <= 20; num++) {
        
    }
    return 0;
}

এখন আমাদের এই লুপের মধ্যেই আবার num-এর নামতাটা লেখার কাজটা করে নিতে হবে। সেটা তো আমরা আগেও করেছি। তো লিখে ফেলা যাক পুরো কোডটা!

#include <iostream>
using namespace std;
int main() {
    int num, i, multiple;
    for (num = 1; num <= 20; num = num+1) {
        for (i=1;i<=10;i = i+1) {
            multiple = num*i;
            cout << num << " x " << i << " = " << multiple << endl;
        }
    }
    return 0;
}

সি কোড 

কোডটা রান করলেই দেখবে ১ থেকে ২০ এর নামতা একটার নিচে আরেকটা খুব সুন্দর করে প্রিন্ট হয়ে গেল! আজকের মত এখানেই শেষ। আগামী পর্বে আমরা লুপ দিয়ে আরও কিছু সমস্যা সমাধান করবো। ততদিন পর্যন্ত, হ্যাপি কোডিং! আর এখন পর্যন্ত সাথে থাকার জন্য তোমার জন্য অনেকগুলো চকলেট! 😀

images (1)

Muntasir Wahed

Muntasir Wahed

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