Saturday, 16 September 2017

Nested Loop (লুপের প্যাচাল)

গতপর্বে লুপ নিয়ে কিছু সহজ সমস্যা দিয়েছিলাম আশাকরি সবাই সেগুলো সমাধান করেছো।

এপর্বে আমরা নেস্টেড লুপ নিয়ে আলোচনা করবো। তোমরা নিশ্চয়ই নেস্টেড ইফ-এলসের কথা ভূলে যাও নি, যেভাবে একটা  if , else if  বা else এর ভিতর আমরা আরেকটি if , else if  বা else দিয়েছি সেভাবে একটি লপের ভিতর অন্য আরেকটি বা একাধিক লুপ  দিয়ে নেস্টড লুপ লিখতে হয়।

এবার চলো নিচের প্রোগ্রামটা দেখে নেইঃ
#include <stdio.h>
int main()
{
    int i,j;

    for(i=1; i<=4; i++)
    {
        for(j=1; j<=4; j++)
        {
            printf("%d",i);
        }
    }
    return 0;
}

বলো তো আউটপুট কি হবে? এই প্রোগ্রামের আউটপুট হবেঃ


1111222233334444 

আউটপুট টা দেখতে কেমন অবাক লাগছে তাই না? তাহলে চলো দেখে নেই এই আউটপুট কেনো আসলো!

  • int i,j; এই লাইন পর্যন্ত তোমাদের কোন সমস্যা নেই। আমরা এই লাইনে i এবং j দুইটি ইন্টিজার ভেরিয়েবল ডেক্লিয়ার করেছি। 
  • for (i=1; i<=4; i++)  এই অংশকে বলা হয় outer loop বা বাইরের লুপ। এখানে যা দেওয়া হয়েছে তাও নিশ্চয়ই বোঝতে পারছো। i = 1 দেওয়া হয়েছে , i<=4 - কন্ডিশন দিয়ে বলা হয়েছে i এর মান 4 এর ছোট বা 4 এর সমান হওয়া পর্যন্ত লুপ চলবে। i এর মান 4 থেকে বেশি মানে 5 হয়ে গেলে লুপ বন্ধ হয়ে যাবে। 
  • যেহেতু i = 1; এবং i এর মান 4 থেকে ছোট তাই কম্পাইলার outer  loop বা বাইরের লুপের বডিতে আসবে। সহজ কথায় শর্ত সত্য হওয়ায় {   }  এর ভিতরে আসবে। 
    •   এখন for (j=1; j<=4; j++) এই অংশকে বলা হয় inner loop বা ভিতরের লুপ।এই শর্ত চেক করবে। এখানেও  j = 1; এবং j<=4 এই শর্ত সত্য তাই inner  loop বা ভিতরের  লুপের বডিতে আসবে। এখন, বডিতে আসার পর কম্পাইলার দেখবে printf("%d",i);     তাই i এর মান প্রিন্ট করবে। বলতো এখানে i এর মান কতো? আমরা লুপটি শুরু করার পর i বা j কোন কাউন্টার ভেরিয়েবলের মান কিন্তু এখনো বাড়াইনি। তার মানে এখন i এর মান 1 . j এর মানও  1। যেহেতু কম্পাইলার দেখবে i এর মান প্রিন্ট করতে বলা হয়েছে তাই প্রিন্ট করবে 1 .
    • একবার প্রিন্ট করার পর কম্পাইলার j++ এই অংশে যাবে। এখন j এর মান 2 . এবং j<=4 এই শর্ত সত্য কারণ দুই এর মান চার এর  থেকে কম। তাই কম্পাইলার আবার বডিতে আসবে, এখনো দেখবে printf("%d",i);  । বলতো এবার কি প্রিন্ট হবে? আবারো 1 প্রিন্ট হবে। কারণ j এর মান বেড়ে 2 হয়েছে কিন্তু i এর মান এখনো 1 .
    • এখন আবার j++ হবে, এবার j এর মান 2 থেকে এক বেড়ে 3 হয়েছে। তাই, j<=4 শর্ত সত্য। কম্পাইলার বডিতে এসে আবার i এর মান প্রিন্ট করবে 1 । 
    • পুনরায় j++  হবে , এবং j এর মান হবে 4,  j<=4 এই শর্তটি সত্য কারণ j এর মান 4 থেকে ছোট না হলেও 4 এর সমান। তাই কম্পাইলার বডিতে আসবে এবং আবার প্রিন্ট করবে 1 ।
    • এবার, j++ হয়ে  j এর মান হবে 5 । j<=4 এই শর্তটি এখন মিথ্যা। 
    • যখন j<=4 শর্তটি মিথ্যা হবে তখন কম্পাইলার for (j=1; j<=4; j++) এই লুপ থেকে বেড়িয়ে আসবে। এবং i++ এ চলে যাবে। এই অংশটা ভালো করে বোঝার চেস্টা করো। কারণ প্রথম অবস্থায় প্রায় সবারই নেস্টেড লুপের এই অংশটাতে একটু সমস্যা হয়।
  • i++ এ যাওয়ার পর i এর মান বেড়ে 1 থেকে 2 হবে। এবার কম্পাইলার i<=4 এই শর্তটি চেক করবে। শর্তটি সত্য হওয়ার কম্পাইলার বডিতে আসবে।
    • এখন আবার দেখবে   for (j=1; j<=4; j++)  এখানেও  j = 1; এবং j<=4 এই শর্ত সত্য তাই আবার  ভিতরের  লুপের বডিতে আসবে। এখন, বডিতে আসার পর কম্পাইলার দেখবে printf("%d",i);     তাই i এর মান প্রিন্ট করবে। এবার  i এর মান কতো? এখন i এর মান 2 । তাই প্রিন্ট করবে 2 .
    • একবার প্রিন্ট করার পর কম্পাইলার j++ এই অংশে যাবে। এখন j এর মান 2 . এবং j<=4 এই শর্ত সত্য কারণ দুই এর মান চার এর  থেকে কম। তাই কম্পাইলার আবার বডিতে আসবে, এখনো দেখবে printf("%d",i);  । বলতো এবার কি প্রিন্ট হবে? আবারো 2 প্রিন্ট হবে।
    • এখন আবার j++ হবে, এবার j এর মান 2 থেকে এক বেড়ে 3 হয়েছে। তাই, j<=4 শর্ত সত্য। কম্পাইলার বডিতে এসে আবার i এর মান প্রিন্ট করবে 2 । 
    • পুনরায় j++  হবে , এবং j এর মান হবে 4,  j<=4 এই শর্তটি সত্য কারণ j এর মান 4 থেকে ছোট না হলেও 4 এর সমান। তাই কম্পাইলার বডিতে আসবে এবং আবার প্রিন্ট করবে 2 । এবার, j++ হয়ে  j এর মান হবে 5 । j<=4 এই শর্তটি এখন মিথ্যা। 
    • যখন j<=4 শর্তটি মিথ্যা হবে তখন কম্পাইলার for (j=1; j<=4; j++) এই লুপ থেকে বেড়িয়ে আসবে। এবং i++ এ চলে যাবে। 
  • এখন,  i++ এ যাওয়ার পর i এর মান বেড়ে 2 থেকে 3 হবে। এবার কম্পাইলার i<=4 এই শর্তটি চেক করবে। শর্তটি সত্য হওয়ার কম্পাইলার বডিতে আসবে।
    • এখন আবার দেখবে   for (j=1; j<=4; j++)  এখানেও  j = 1; এবং j<=4 এই শর্ত সত্য তাই আবার  ভিতরের  লুপের বডিতে আসবে। এখন, বডিতে আসার পর কম্পাইলার দেখবে printf("%d",i);     তাই i এর মান প্রিন্ট করবে। এবার  i এর মান কতো? এখন i এর মান 3 । তাই প্রিন্ট করবে 3 .
    • একবার প্রিন্ট করার পর কম্পাইলার j++ এই অংশে যাবে। এখন j এর মান 2 . এবং j<=4 এই শর্ত সত্য কারণ দুই এর মান চার এর  থেকে কম। তাই কম্পাইলার আবার বডিতে আসবে, এখনো দেখবে printf("%d",i);  । বলতো এবার কি প্রিন্ট হবে? আবারো 3 প্রিন্ট হবে।
    • এখন আবার j++ হবে, এবার j এর মান 2 থেকে এক বেড়ে 3 হয়েছে। তাই, j<=4 শর্ত সত্য। কম্পাইলার বডিতে এসে আবার i এর মান প্রিন্ট করবে 3 । 
    • পুনরায় j++  হবে , এবং j এর মান হবে 4,  j<=4 এই শর্তটি সত্য কারণ j এর মান 4 থেকে ছোট না হলেও 4 এর সমান। তাই কম্পাইলার বডিতে আসবে এবং আবার প্রিন্ট করবে 3 । এবার, j++ হয়ে  j এর মান হবে 5 । j<=4 এই শর্তটি এখন মিথ্যা। 
    • যখন j<=4 শর্তটি মিথ্যা হবে তখন কম্পাইলার for (j=1; j<=4; j++) এই লুপ থেকে বেড়িয়ে আসবে। এবং i++ এ চলে যাবে। 
  • i++ এ যাওয়ার পর i এর মান বেড়ে 3 থেকে 4 হবে। এবার কম্পাইলার i<=4 এই শর্তটি চেক করবে। শর্তটি সত্য হওয়ার কম্পাইলার বডিতে আসবে।
    • এখন আবার দেখবে   for (j=1; j<=4; j++)  এখানেও  j = 1; এবং j<=4 এই শর্ত সত্য তাই আবার  ভিতরের  লুপের বডিতে আসবে। এখন, বডিতে আসার পর কম্পাইলার দেখবে printf("%d",i);     তাই i এর মান প্রিন্ট করবে। এবার  i এর মান কতো? এখন i এর মান 4 । তাই প্রিন্ট করবে 4 .
    • একবার প্রিন্ট করার পর কম্পাইলার j++ এই অংশে যাবে। এখন j এর মান 2 . এবং j<=4 এই শর্ত সত্য কারণ দুই এর মান চার এর  থেকে কম। তাই কম্পাইলার আবার বডিতে আসবে, এখনো দেখবে printf("%d",i);  । বলতো এবার কি প্রিন্ট হবে? আবারো 4 প্রিন্ট হবে।
    • এখন আবার j++ হবে, এবার j এর মান 2 থেকে এক বেড়ে 3 হয়েছে। তাই, j<=4 শর্ত সত্য। কম্পাইলার বডিতে এসে আবার i এর মান প্রিন্ট করবে 4 । 
    • পুনরায় j++  হবে , এবং j এর মান হবে 4,  j<=4 এই শর্তটি সত্য কারণ j এর মান 4 থেকে ছোট না হলেও 4 এর সমান। তাই কম্পাইলার বডিতে আসবে এবং আবার প্রিন্ট করবে 4 । এবার, j++ হয়ে  j এর মান হবে 5 । j<=4 এই শর্তটি এখন মিথ্যা। 
    • যখন j<=4 শর্তটি মিথ্যা হবে তখন কম্পাইলার for (j=1; j<=4; j++) এই লুপ থেকে বেড়িয়ে আসবে। এবং i++ এ চলে যাবে। 
      • i++ এ যাওয়ার পর i এর মান বেড়ে 4 থেকে 5 হবে। এবার কম্পাইলার i<=4 এই শর্তটি চেক করবে। শর্তটি মিথ্যা হওয়ার
        for (i=1; i<=4; i++)  এই লুপ থেকেও কম্পাইলার বেড়িয়ে আসবে এবং return 0; তে চলে যাবে। এবং প্রোগ্রাম বন্ধ হয়ে যাবে।

0 comments:

Post a Comment