Thursday, 21 September 2017

প্যাটার্ন প্রিন্টিং (pattern with loop)

গতপর্বে আমরা নেস্টেড লুপ নিয়ে নিয়ে আলোচনা করেছিলাম, আশাকরি তা সবাই বোঝতে পেরেছো।
আজ আমরা Nested Loop নিয়ে একটু মজা করবো।





আমরা চাইলেই নিচের প্যাটার্ন টা লুপ দিয়ে আঁকতে পারি। বিষয়টা অনেক মজার তাই না।



1.Triangle :


*
**
***
****
*****


তাহলে  চলো দেখে নেই কিভাবে আমরা এর জন্য প্রোগ্রাম লিখবো।
খেয়াল করলে দেখবে
প্রথম লাইনে মাত্র ১ টা * ।
দ্বিতীয় লাইনে ২ টা * ।
এভাবে প্রতি লাইনে একটা করছে * বাড়ছে।



#include<stdio.h>
int main()
{
    int i,j;

    for(i=1; i<=5;i++)
    {
        for(j=1;j<=i;j++)
        {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}


তোমরা হয়তো লক্ষ্য করেছো এখানে i এবং j এর মান আমি 0 না দিয়ে 1 দিয়েছি।
কিন্তু সচরাচর আমরা i=0 এবং  j=0 দিয়েই ইনিশিয়ালাইজড করি।

আমার মনে হয়েছে, i=1 এবং j=1 ধরে করলে তোমরা সহজে বোঝতে পারবে।
তোমরা বোঝে গেলে i এবং j এর মান 0 ধরেও করতে পারবে।

যাই হোক, মূল কথায় আসি। 

উপরের প্রোগ্রামটাতে দেখো আমরা ২ টা ভেরিয়েবল i ,j  ডিক্লেয়ার করেছি।
তারপর প্রথম লুপে দিয়েছি i<=5 ,মানে i এর মান 5 এর ছোট বা সমান হলে লুপ ঘুরবে।
বলতে পারবে কেন আমরা i<=5 এই শর্ত টা দিয়েছি?
কারণ, আমরা নিচের দিকে ৫ লাইন প্রিন্ট করবো।
আর  দ্বিতীয় লুপে  j<=i শর্ত দিয়েছি, কারণ
 দ্বিতীয় লুপ   j  এর মান যতো পাশের দিকে ঠিক ততোটা * প্রিন্ট করবে।

এবার প্রোগ্রামের ব্যাখ্যা দেখে নেইঃ

  • for(i=1; i<=5;i++)      এই লাইনে i=1; এবং i এর মান 5 থেকে ছোট। তাই কম্পাইলার বাইরের লুপের বডিতে আসবে।
  • কম্পাইলার for(j=1;  j<=i; j++)  এ আসার পর চেক করবে j এর মান i এর মান থেকে ছোট অথবা সমান কি না? যেহেতু i=1 এবং j=1, তাই i এর মান j এর মানের সমান এই শর্ত সত্য। তাই কম্পাইলার ভিতরের  লুপের বডিতে আসবে। 
  • এবার দেখবে printf("*");    তাই একটা * প্রিন্ট হবে। তার পর কম্পাইলারা j++ এ যাবে।
  • j++ এ যাওয়ার পর j এর মান 1 থেকে এক বেড়ে 2 হবে। 
  • কম্পাইলার আবার শর্ত চেক করবে j<=i শর্ত সত্য কি না? যেহেতু এখন  i=1 এবং j=2 তাই শর্ত মিথ্যা। কারণ j এর মান i এর মান থেকে বেশি। সুতরাং কম্পাইলার ভিতরের লুপ থেকে বের হয়ে দেখবে  printf("\n);  তারপর একটি নতুন লাইন প্রিন্ট করে বাইরের লুপের i++ এ যাবে।
  • i++ এ যাওয়ার পর i এর মান 1 থেকে এক বেড়ে 2  হবে। এবার i<=5 এই শর্ত চেক করবে। যেহেতু শর্ত সত্য তাই কম্পাইলার আবার বাইরের  লুপের বডিতে আসবে ।
  • কম্পাইলার for(j=1;  j<=i; j++)  এ আসার পর চেক করবে j এর মান i এর মান থেকে ছোট অথবা সমান কি না? যেহেতু এখন i=2 এবং j=1, তাই i এর মান j এর থেকে ছোট সুতরাং  শর্ত সত্য। তাই কম্পাইলার ভিতরের  লুপের বডিতে আসবে। 
  • এবার দেখবে printf("*");    তাই একটা * প্রিন্ট হবে। তার পর কম্পাইলারা j++ এ যাবে।
  • j++ এ যাওয়ার পর j এর মান 1 থেকে এক বেড়ে 2 হবে। 
  • এখন আবার j<=i এই শর্ত চেক করবে। যেহেতু এখন i এর মান 2 এবং j এর মান 2 তাই শর্ত সত্য। সুতরাং কম্পাইলার লুপের বডিতে আসবে এবং আরেকটি * প্রিন্ট করবে।তার পর কম্পাইলার  j++ এ যাবে। j++ এ যাওয়ার পর j এর মান 2 থেকে এক বেড়ে 3 হবে।
  • কম্পাইলার আবার শর্ত চেক করবে j<=i শর্ত সত্য কি না? যেহেতু এখন  i=2 এবং j=3 তাই শর্ত মিথ্যা। কারণ j এর মান i এর মান থেকে বেশি। সুতরাং কম্পাইলার ভিতরের লুপ থেকে বের হয়ে দেখবে  printf("\n);  তারপর একটি নতুন লাইন প্রিন্ট করে বাইরের লুপের i++ এ যাবে।
  • এভাবে i = 5 হওয়া পর্যন্ত চলতে থাকবে। i=6 হলে কম্পাইলার লুপ থেকে বেড়িয়ে আসবে এবং return 0; তে চলে যাবে।
  •  প্রোগ্রাম শেষ। 
কেউ না বোঝলে নেস্টেড লুপ নিয়ে করা আমার আগের পোস্টটা পড়ুন। আশা করি বোঝতে পারবেন।







2.Square :


* * * *
* * * *
* * * *
* * * *

এই প্যাটার্নে আমাদের প্রতিটি লাইনে চারটি * আছে।
এবং এভাবে মোট চার লাইন আছে।

তার মানে উপর থেকে নিচের দিকে আমাদের লুপ চারবার ঘুরবে । পাশের দিকে ও চারবার ঘুরবে।

তাহলে চলো প্রোগ্রামটা দেখে নেইঃ



#include<stdio.h>
int main()
{
    int i,j;

    for(i=1; i<=4;i++)
    {
        for(j=1;j<=4;j++)
        {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

লক্ষ্য করে দেখো এ প্রোগ্রামে আমাদের দুইটা লুপের ই ব্রেকিং কন্ডিশন সমান। অর্থাৎ i<=4 এবং j<=4 .

তুমি একটু ভেবে দেখো তো কোড টা কিভাবে কাজ করছে? তারপর আমার ব্যখ্যার সাথে মিলিয়ে নিয়ো।


ব্যখ্যাঃ

  • for(i=1; i<=4;i++)      এই লাইনে i=1; এবং i এর মান 4 থেকে ছোট। তাই কম্পাইলার বাইরের লুপের বডিতে আসবে।
  • কম্পাইলার for(j=1;  j<=i; j++)  এ আসার পর চেক করবে j এর মান 4 এর মান থেকে ছোট অথবা সমান কি না? যেহেতু  j=1, যা 4 থেকে ছোট, তাই শর্ত সত্য। সুতরাং কম্পাইলার ভিতরের  লুপের বডিতে আসবে। 
  • এবার দেখবে printf("*");    তাই একটা * প্রিন্ট হবে। তার পর কম্পাইলারা j++ এ যাবে।
  • j++ এ যাওয়ার পর j এর মান 1 থেকে এক বেড়ে 2 হবে। 
  • কম্পাইলার আবার শর্ত চেক করবে j<=4 শর্ত সত্য কি না? যেহেতু  j=2 তাই শর্ত  সত্য। সুতরাং কম্পাইলার আবার লুপের বডিতে আসবে। এবং আরেকটি * প্রিন্ট করবে। তার পর কম্পাইলার j++ এ যাবে।
  • j++ এ যাওয়ার পর j এর মান 2 থেকে এক বেড়ে 3 হবে। 
  • কম্পাইলার আবার শর্ত চেক করবে j<=4 শর্ত সত্য কি না? যেহেতু  j=3 তাই শর্ত  সত্য। সুতরাং কম্পাইলার আবার লুপের বডিতে আসবে। এবং আরেকটি * প্রিন্ট করবে। তার পর কম্পাইলার j++ এ যাবে।
  • j++ এ যাওয়ার পর j এর মান 3 থেকে এক বেড়ে 4 হবে।
  • কম্পাইলার আবার শর্ত চেক করবে j<=4 শর্ত সত্য কি না? যেহেতু  j=4 তাই শর্ত  সত্য। সুতরাং কম্পাইলার আবার লুপের বডিতে আসবে। এবং আরেকটি * প্রিন্ট করবে। তার পর কম্পাইলার j++ এ যাবে।
  • j++ এ যাওয়ার পর j এর মান 4 থেকে এক বেড়ে 5 হবে।
  •  যেহেতু  j<=5 এই শর্ত মিথ্যা তাই কম্পাইলার ভিতরের লুপ থেকে বের হয়ে যাবে, এবং  দেখবে  printf("\n);  তারপর একটি নতুন লাইন প্রিন্ট করে বাইরের লুপের i++ এ যাবে।
  •  এভাবে চলতে চলতে যখন i এর মান 6  হয়ে যাবে তখন কম্পাইলার বাইরের লুপ থেকে বের হয়ে আসবে এবং retrun 0; তে চলে যাবে। 


3.Reverse Triangle :


*****
****
***
**
*
 
তুমি যদি Triangle অর্থাৎ 1 নং প্যাটার্ন    বোঝে থাকো তাহলে উপরের প্যাটার্ন টাও সহজে বোঝে ফেলবে ।

প্রোগ্রামটা দেখে নেইঃ



#include<stdio.h>
int main()
{
    int i,j;

    for(i=1; i<=5;i++)
    {
        for(j=5;j>=i;j--)
        {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}


আমরা বাইরের লুপ দিয়ে উপর থেকে নিচের দিকটা প্রিন্ট করছি। যেহেতু আমাদের প্যাটার্ন পাঁচ লাইন  হবে তাই বাইরের লুপটা আমরা হুবহু প্রথম প্যাটার্নের বাইরের লুপের মতো রেখে দিলাম।

আর পাশের দিকে আমরা ঠিক j এর মানের সমান সংখ্যক * প্রিন্ট করছি।  

ব্যখ্যাঃ


  • for(i=1; i<=5;i++)      এই লাইনে i=1; এবং i এর মান 5 থেকে ছোট। তাই কম্পাইলার বাইরের লুপের বডিতে আসবে।
  • কম্পাইলার for(j=5;  j>=i; j--)  এ আসার পর চেক করবে j এর মান i এর মান থেকে বড় অথবা সমান কি না? যেহেতু i=1 এবং j=5, তাই  j এর মান i এর মানের থেকে বড়। সুতরাং, কম্পাইলার ভিতরের  লুপের বডিতে আসবে। 
  • এবার দেখবে printf("*");    তাই একটা * প্রিন্ট হবে। তার পর কম্পাইলার j-- এ যাবে।
  • j-- এ যাওয়ার পর j এর মান এক কমে  5 থেকে 4 হবে। 
  • কম্পাইলার আবার শর্ত চেক করবে j>=i শর্ত সত্য কি না? যেহেতু এখন  j=4 এবং i=1 তাই শর্ত সত্য,
  • সুতরাং, কম্পাইলার ভিতরের  লুপের বডিতে আসবে। 
  • এবার দেখবে printf("*");    তাই একটা * প্রিন্ট হবে। তার পর কম্পাইলার j-- এ যাবে।
  • j-- এ যাওয়ার পর j এর মান এক কমে  4 থেকে 3 হবে। 
  • কম্পাইলার আবার শর্ত চেক করবে j>=i শর্ত সত্য কি না? যেহেতু এখন  j=3 এবং i=1 তাই শর্ত সত্য, 
  • সুতরাং, কম্পাইলার ভিতরের  লুপের বডিতে আসবে। 
  • এবার দেখবে printf("*");    তাই একটা * প্রিন্ট হবে। তার পর কম্পাইলার j-- এ যাবে।
  • j-- এ যাওয়ার পর j এর মান এক কমে  3 থেকে 2 হবে। 
  • কম্পাইলার আবার শর্ত চেক করবে j>=i শর্ত সত্য কি না? যেহেতু এখন  j=2 এবং i=1 তাই শর্ত সত্য, 
  • সুতরাং, কম্পাইলার ভিতরের  লুপের বডিতে আসবে। 
  • এবার দেখবে printf("*");    তাই একটা * প্রিন্ট হবে। তার পর কম্পাইলার j-- এ যাবে।
  • j-- এ যাওয়ার পর j এর মান এক কমে  2 থেকে 1 হবে।
  • কম্পাইলার আবার শর্ত চেক করবে j>=i শর্ত সত্য কি না? যেহেতু এখন  j=1 এবং i=1 তাই শর্ত সত্য, 
  • সুতরাং, কম্পাইলার ভিতরের  লুপের বডিতে আসবে। 
  • এবার দেখবে printf("*");    তাই একটা * প্রিন্ট হবে। তার পর কম্পাইলার j-- এ যাবে।
  • j-- এ যাওয়ার পর j এর মান এক কমে  1 থেকে 0 হবে।
  • এবার শর্ত মিথ্যা তাই কম্পাইলার ভিতরের লুপ থেকে বের হয়ে যাবে ,এবং একটি নতুন লাইন প্রিন্ট করবে।  
  • তারপর বাইরের লুপের i++ এ যাবে।
  • i++ এ যাওয়ার পর i এর মান 1 থেকে এক বেড়ে 2 হবে। তারপর কম্পাইলার চেক করবে i<=5 শর্তটি সত্য কি না? যেহেতু শর্ত সত্য তাই কম্পাইলার বাইরের লুপের বডিতে আসবে।
  • কম্পাইলার for(j=5;  j>=i; j--)  এ আসার পর চেক করবে j এর মান i এর মান থেকে বড় অথবা সমান কি না? যেহেতু i=2 এবং j=5, তাই  j এর মান i এর মানের থেকে বড়। সুতরাং, কম্পাইলার ভিতরের  লুপের বডিতে আসবে। 
  • এবার দেখবে printf("*");    তাই একটা * প্রিন্ট হবে। তার পর কম্পাইলার j-- এ যাবে।
  • j-- এ যাওয়ার পর j এর মান এক কমে  5 থেকে 4 হবে। 
  • কম্পাইলার আবার শর্ত চেক করবে j>=i শর্ত সত্য কি না? যেহেতু এখন  j=4 এবং i=2 তাই শর্ত সত্য,
  • সুতরাং, কম্পাইলার ভিতরের  লুপের বডিতে আসবে। 
  • এবার দেখবে printf("*");    তাই একটা * প্রিন্ট হবে। তার পর কম্পাইলার j-- এ যাবে।
  • j-- এ যাওয়ার পর j এর মান এক কমে  4 থেকে 3 হবে। 
  • কম্পাইলার আবার শর্ত চেক করবে j>=i শর্ত সত্য কি না? যেহেতু এখন  j=3 এবং i=2 তাই শর্ত সত্য, 
  • সুতরাং, কম্পাইলার ভিতরের  লুপের বডিতে আসবে। 
  • এবার দেখবে printf("*");    তাই একটা * প্রিন্ট হবে। তার পর কম্পাইলার j-- এ যাবে।
  • j-- এ যাওয়ার পর j এর মান এক কমে  3 থেকে 2 হবে। 
  • কম্পাইলার আবার শর্ত চেক করবে j>=i শর্ত সত্য কি না? যেহেতু এখন  j=2 এবং i=2 তাই শর্ত সত্য, 
  • সুতরাং, কম্পাইলার ভিতরের  লুপের বডিতে আসবে। 
  • এবার দেখবে printf("*");    তাই একটা * প্রিন্ট হবে। তার পর কম্পাইলার j-- এ যাবে।
  •   j-- এ যাওয়ার পর j এর মান 2 থেকে 1 হবে।  এবার j>=i শর্তটি মিথ্যা তাই কম্পাইলার ভিতরের লুপ থেকে বেড়িয়ে আসবে। এবং একটি নতুন লাইন প্রিন্ট করে বাইরের লুপের i++ এ চলে যাবে।
  • i++ এ যাওয়ার পর i এর মান 3 থেকে এক বেড়ে 4 হবে। তারপর কম্পাইলার চেক করবে i<=5 শর্তটি সত্য কি না? যেহেতু শর্ত সত্য তাই কম্পাইলার বাইরের লুপের বডিতে আসবে।
  • কম্পাইলার for(j=5;  j>=i; j--)  এ আসার পর চেক করবে j এর মান i এর মান থেকে বড় অথবা সমান কি না? যেহেতু i=4 এবং j=5, তাই  j এর মান i এর মানের থেকে বড়। সুতরাং, কম্পাইলার ভিতরের  লুপের বডিতে আসবে। 
  • এবার দেখবে printf("*");    তাই একটা * প্রিন্ট হবে। তার পর কম্পাইলার j-- এ যাবে।
  • j-- এ যাওয়ার পর j এর মান এক কমে  5 থেকে 4 হবে। 
  • কম্পাইলার আবার শর্ত চেক করবে j>=i শর্ত সত্য কি না? যেহেতু এখন  j=4 এবং i=4 তাই শর্ত সত্য,
  • সুতরাং, কম্পাইলার ভিতরের  লুপের বডিতে আসবে। 
  • এবার দেখবে printf("*");    তাই একটা * প্রিন্ট হবে। তার পর কম্পাইলার j-- এ যাবে।
  • j-- এ যাওয়ার পর j এর মান এক কমে  4 থেকে 3 হবে। 
  • এবার j>=i শর্তটি মিথ্যা কারণ j = 3 কিন্তু i = 4 । তাই কম্পাইলার ভিতরের লুপ থেকে বেড়িয়ে আসবে। এবং একটি নতুন লাইন প্রিন্ট করে বাইরের লুপের i++ এ চলে যাবে।
  • i++ এ যাওয়ার পর i এর মান 4 থেকে এক বেড়ে 5 হবে। তারপর কম্পাইলার চেক করবে i<=5 শর্তটি সত্য কি না? যেহেতু শর্ত সত্য তাই কম্পাইলার বাইরের লুপের বডিতে আসবে।
  • কম্পাইলার for(j=5;  j>=i; j--)  এ আসার পর চেক করবে j এর মান i এর মান থেকে বড় অথবা সমান কি না? যেহেতু i=5 এবং j=5, তাই  j এর মান i এর মানের সমান। সুতরাং, কম্পাইলার ভিতরের  লুপের বডিতে আসবে। 
  • এবার দেখবে printf("*");    তাই একটা * প্রিন্ট হবে। তার পর কম্পাইলার j-- এ যাবে।
  • j-- এ যাওয়ার পর j এর মান এক কমে  5 থেকে 4 হবে।
  • এবার j>=i শর্তটি মিথ্যা কারণ j = 4 কিন্তু i = 5 । তাই কম্পাইলার ভিতরের লুপ থেকে বেড়িয়ে আসবে। এবং একটি নতুন লাইন প্রিন্ট করে বাইরের লুপের i++ এ চলে যাবে।
  • i++ এ যাওয়ার পর i এর মান 5 থেকে এক বেড়ে 6 হবে। তারপর কম্পাইলার চেক করবে i<=5 শর্তটি সত্য কি না? এবার শর্তটি মিথ্যা হওয়ার কম্পাইলার বাইরের লুপ থেকে বেড়িয়ে আসবে এবং return 0 তে চলে যাবে।
  • প্রোগ্রাম শেষ।





4.Hollow square :


* * * *
*       *
*       *
* * * *


আমরা দ্বিতীয় প্যাটার্ন এ square প্রিন্ট করেছিলাম, যদি সেটা বোঝে থাকো তাহলে hollow square তোমরা সহজে বোঝবে।

চলো প্রোগ্রামটা দেখে নেইঃ

 

#include<stdio.h>
int main()
{
    int i,j;


    for(i=1;i<=4;i++)
    {
        for(j=1;j<=4;j++)
        {
            if(i==1 || i==4 || j==1||j==4)
            {
                printf("*");
            }
            else
            {
                printf(" ");
            }
        }
        printf("\n");
    }
    return 0;
}


  আমি প্রোগ্রামটা সম্পুর্ণ ব্যাখ্যা করছি না, কারণ ( যদি দ্বিতীয় প্যাটার্ন টা বোঝে থাকো)
for(j=0; j<=4; j++)  এই লাইন পর্যন্ত তোমরা বোঝতে পারছো।

এবার আসো  for(j=0; j<=4; j++) এর বডিতে কিভাবে কাজ হচ্ছে জেনে নেইঃ

 for(j=0; j<=4; j++)  এর বডিতে কম্পাইলার আসার পর দেখতে পাবে

 if(i==1 || i==4 || j==1||j==4)  এই শর্ত টা।

এর মানে হলো যখন i এর মান 1 তখন * প্রিন্ট হবে। অথবা যদি i এর মান  4 হয় তখন * প্রিন্ট হবে।
অথবা যখন j এর মান 1 তখন * প্রিন্ট হবে। অথবা যদি j এর মান  4 হয় তখন * প্রিন্ট হবে।

তার মানে দাড়ালো যদি এই চারটি শর্তের যেকোন একটিও মিলে যায় তাহলে * প্রিন্ট হবে। আর যদি একটা ও শর্ত না মিলে তাহলে একটা স্পেস প্রিন্ট হবে।

প্রথমদিকে মনে হতে পারে স্পেস প্রিন্ট করার কোন প্রয়োজন নেই। কোন কিছু প্রিন্ট না করলেই তো হয় জায়গাটা ফাঁকা থাকবে।
কিন্তু আসলে ধারণাটা ভূল,  জায়গাটা ফাঁকা কারণ এখানে স্পেস আছে, স্পেস প্রিন্ট না করলে এখানে কোন কাজই হবে না।
তোমরা বিষয়টা ভালোভাবে বোঝার জন্য নিচের কোড দুটি রান করাও।

#include<stdio.h>
int main()
{
    int i,j;


    for(i=1;i<=4;i++)
    {
        for(j=1;j<=4;j++)
        {
            if(i==1 || i==4 || j==1||j==4)
            {
                printf("*");
            }
            else
            {
                printf("");
            }
        }
        printf("\n");
    }
    return 0;
}

 আসলে আমরা যা প্রিন্ট করতে চাচ্ছি তা হছে না শুধু মাত্র else এর ভিতরের printf থেকে স্পেস টা কেটে দেওয়ার জন্য।



#include<stdio.h>
int main()
{
    int i,j;


    for(i=1;i<=4;i++)
    {
        for(j=1;j<=4;j++)
        {
            if(i==1 || i==4 || j==1||j==4)
            {
                printf("*");
            }
        }
        printf("\n");
    }
    return 0;
}
এবারও আউটপুট আমাদের মনের মতো না হয়ে উপরের কোডের মতো হয়েছে। কারণটা নিশ্চয়ই বোঝতে পারছো।

এখন চলো লাইন বাই লাইন ব্যাখ্যায় :)

  • যখন i=1 এবং j=1 তখন if(i==1 || i==4 || j==1||j==4)  চেক করবে। এখানে (i==1||j==1) এই দুইটা শর্তই সত্য। তাই কম্পাইলার i==1 এই শর্ত সত্য হওয়ায় আর কোন শর্ত চেক করবে না। মানে যখনই একটা শর্ত চেক মিলে যাবে অর অপারেটর থাকলে আর পরবর্তী শর্ত চেক না করেই বডিতে চলে আসবে। বডিতে আসার পর একটা * প্রিন্ট করবে। তারপর j++ এ যাবে। 
  • কম্পাইলার j++ এ যাওয়ার পর j=2. এখন j<=4 শর্ত সত্য হওয়ার বডিতে আসবে। তার পর আবার  if(i==1 || i==4 || j==1||j==4)  চেক করবে। এবারও, i==1 শর্তটা মিলে যাওয়ার কম্পাইলার আরেকটা * প্রিন্ট করবে। আবার j++ হবে।
  • কম্পাইলার j++ এ যাওয়ার পর j=3. এখন j<=4 শর্ত সত্য হওয়ার বডিতে আসবে। তার পর আবার  if(i==1 || i==4 || j==1||j==4)  চেক করবে। এবারও, i==1 শর্তটা মিলে যাওয়ার কম্পাইলার আরেকটা * প্রিন্ট করবে। আবার j++ হবে।
  • কম্পাইলার j++ এ যাওয়ার পর j=4. এখন j<=4 শর্ত সত্য হওয়ার বডিতে আসবে। তার পর আবার  if(i==1 || i==4 || j==1||j==4)  চেক করবে। এবারও, i==1 শর্তটা মিলে যাওয়ার কম্পাইলার আরেকটা * প্রিন্ট করবে। আবার j++ হবে। এতক্ষণে আমাদের উপরের লাইনের চারটা * প্রিন্ট হয়ে গেছে।
  • কম্পাইলার j++ এ যাওয়ার পর j=5. এখন j<=4 শর্ত মিথ্যা। তাই কম্পাইলার ভিতরের লুপ থেকে বের হয়ে  i++ এ যাবে।
  • i++ এ যাওয়ার পর i=2. i<=4 শর্ত সত্য হওয়ার কম্পাইলার বডিতে আসবে। এবং ভিতরের লুপে যাবে। 
  • এখন j=1 এবং j<=4 সত্য। তাই বডিতে আসবে ।
  • if(i==1 || i==4 || j==1||j==4)  চেক করবে। এখন i==1 শর্ত মিথ্যা। কম্পাইলার i==4 এই শর্ত চেক করবে। এই শর্ত ও মিথ্যা। কম্পাইলার j==1 শর্ত চেক করবে। এই শর্ত টি সত্য। তাই কম্পাইলার if এর বডিতে আসবে এবং একটি * প্রিন্ট করবে। তারপর j++ হবে। 
  • কম্পাইলার j++ এ যাওয়ার পর j=2. এখন j<=4 শর্ত সত্য হওয়ার বডিতে আসবে। তারপর আবার  if(i==1 || i==4 || j==1||j==4)  চেক করবে। এবার কোন শর্তই সত্য নয়, তাই কম্পাইলার else এ চলে যাবে। এবং একটি স্পেস প্রিন্ট করবে। তারপর j++ হবে। 
  • কম্পাইলার j++ এ যাওয়ার পর j=3. এখন j<=4 শর্ত সত্য হওয়ার বডিতে আসবে। তারপর আবার  if(i==1 || i==4 || j==1||j==4)  চেক করবে। এবার কোন শর্তই সত্য নয়, তাই কম্পাইলার else এ চলে যাবে। এবং আবারো একটি স্পেস প্রিন্ট করবে। তারপর j++ হবে।
  • কম্পাইলার j++ এ যাওয়ার পর j=4. এখন j<=4 শর্ত সত্য হওয়ার বডিতে আসবে। তারপর আবার  if(i==1 || i==4 || j==1||j==4)  চেক করবে। এবার j==4 শর্তটি সত্য হওয়ায় আরেকটি * প্রিন্ট করবে। তারপর j++ হবে।
  • কম্পাইলার j++ এ যাওয়ার পর j=5. এখন j<=4 শর্ত মিথ্যা। তাই কম্পাইলার ভিতরের লুপ থেকে বের হয়ে  i++ এ যাবে।
  • i++ এ যাওয়ার পর i=3. i<=4 শর্ত সত্য হওয়ার কম্পাইলার বডিতে আসবে। এবং ভিতরের লুপে যাবে। 
  • এখন j=1 এবং j<=4 সত্য। তাই বডিতে আসবে ।
  • if(i==1 || i==4 || j==1||j==4)  চেক করবে। এখন i==1 শর্ত মিথ্যা। কম্পাইলার i==4 এই শর্ত চেক করবে। এই শর্ত ও মিথ্যা। কম্পাইলার j==1 শর্ত চেক করবে। এই শর্ত টি সত্য। তাই কম্পাইলার if এর বডিতে আসবে এবং একটি * প্রিন্ট করবে। তারপর j++ হবে। 
  • কম্পাইলার j++ এ যাওয়ার পর j=2. এখন j<=4 শর্ত সত্য হওয়ার বডিতে আসবে। তারপর আবার  if(i==1 || i==4 || j==1||j==4)  চেক করবে। এবার কোন শর্তই সত্য নয়, তাই কম্পাইলার else এ চলে যাবে। এবং একটি স্পেস প্রিন্ট করবে। তারপর j++ হবে। 
  • কম্পাইলার j++ এ যাওয়ার পর j=3. এখন j<=4 শর্ত সত্য হওয়ার বডিতে আসবে। তারপর আবার  if(i==1 || i==4 || j==1||j==4)  চেক করবে। এবার কোন শর্তই সত্য নয়, তাই কম্পাইলার else এ চলে যাবে। এবং আবারো একটি স্পেস প্রিন্ট করবে। তারপর j++ হবে।
  • কম্পাইলার j++ এ যাওয়ার পর j=4. এখন j<=4 শর্ত সত্য হওয়ার বডিতে আসবে। তারপর আবার  if(i==1 || i==4 || j==1||j==4)  চেক করবে। এবার কোন শর্তই সত্য নয়, তাই কম্পাইলার else এ চলে যাবে। এবং আবারো একটি স্পেস প্রিন্ট করবে। তারপর j++ হবে।
  • কম্পাইলার j++ এ যাওয়ার পর j=5. এখন j<=4 শর্ত মিথ্যা। তাই কম্পাইলার ভিতরের লুপ থেকে বের হয়ে  i++ এ যাবে।
  • i++ এ যাওয়ার পর i=4. i<=4 শর্ত সত্য হওয়ার কম্পাইলার বডিতে আসবে। এবং ভিতরের লুপে যাবে। 
  • এখন j=1 এবং j<=4 সত্য। তাই বডিতে আসবে ।
  • if(i==1 || i==4 || j==1||j==4)  চেক করবে। এখানে i==4 এই  শর্ত সত্য। তাই কম্পাইলার  চলে আসবে। বডিতে আসার পর একটা * প্রিন্ট করবে। তারপর j++ এ যাবে।
  •  
  • কম্পাইলার j++ এ যাওয়ার পর j=2. এখন j<=4 শর্ত সত্য হওয়ার বডিতে আসবে। তার পর আবার  if(i==1 || i==4 || j==1||j==4)  চেক করবে। এবারও, i==4 শর্তটা মিলে যাওয়ার কম্পাইলার আরেকটা * প্রিন্ট করবে। আবার j++ হবে।
  • কম্পাইলার j++ এ যাওয়ার পর j=3. এখন j<=4 শর্ত সত্য হওয়ার বডিতে আসবে। তার পর আবার  if(i==1 || i==4 || j==1||j==4)  চেক করবে। এবারও, i==4 শর্তটা মিলে যাওয়ার কম্পাইলার আরেকটা * প্রিন্ট করবে। আবার j++ হবে।
  • কম্পাইলার j++ এ যাওয়ার পর j=4. এখন j<=4 শর্ত সত্য হওয়ার বডিতে আসবে। তার পর আবার  if(i==1 || i==4 || j==1||j==4)  চেক করবে। এবারও, i==4 শর্তটা মিলে যাওয়ার কম্পাইলার আরেকটা * প্রিন্ট করবে। আবার j++ হবে। এতক্ষণে প্যাটার্ন প্রিন্ট হয়ে গেছে। :)
আশাকরি তোমরা বোঝতেপেরেছো। এবার তোমাদের জন্য একটি কাজ আছে , তা হলো;

উপরের সবগুলা প্রোগ্রাম কত লাইন প্রিন্ট হবে তা ইউজারের কাছ থেকে ইনুট নিয়ে করবে।

উদাহারন হিসেবে দেখে নাওঃ

int i,j,n;
scanf("%d",&n);
for(i=1;i<=n;i++)

এরকম করে সম্পুর্ণ কোড টা লিখে ফেলো।
 

Saturday, 16 September 2017

Nested Loop (parrt-2)

গতপর্বে আমরা একটা প্রোগ্রাম দেখেছিলাম যেটা,

 1111222233334444  এরকম একটা আউটপুট দিয়েছিল।


প্রোগ্রামটা আমি আবার লিখছি বোঝার সুবিধার্তে,


#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 এরকম না এসে,

1111
2222
3333
4444

এভাবে আসুক। তাহলে উপরের প্রোগ্রামটা সামান্য পরিবর্তন করে আবার লিখি,


#include<stdio.h>
int main()
{
    int i,j;

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

আমরা শুধু নতুন একটা লাইন লিখেছি, বাকীটা হুবহু একই রকম । প্রোগ্রামটা রান করে দেখো। তারপর বোঝতে চেস্টা করো কেনো দুইটা প্রোগ্রামের আউটপুট দুই রকম আসছে।

যদি পার্থক্যটা ধরতে পারো তাহলে তোমাকে অভিনন্দন, না পারলেও সমস্যা নেই তুমি শিখে নিবে।

আমি আশা করছি তোমরা প্রথম আউটপুট টা মানে 1111222233334444 আসার কারণ বোঝতে পারছো।
যখনই for(j=1; j<=4; j++)   এই অংশটা মিথ্যা হয়। তখন কম্পাইলার ভিতরের লুপ থেকে বেড়িয়ে আসে এবং বাইরের লুপের মানে for(i=1; i<=4; i++) এর i++ এ আসে। 

আর আমাদের দ্বিতীয় প্রোগ্রামে i++ এ আসার পুর্বে কম্পাইলার দেখতে পায় printf("\n");   তখন একটি নতুন লাইন প্রিন্ট হয়, তার পর i++ হয়ে i এর মান এক বাড়ে।  এভাবে প্রতিবার i এর মান চার বার প্রিন্ট করার পর একটি নতুন লাইন প্রিন্ট হয়। 


এবার নিচের প্রোগ্রামটা রান করে দেখোঃ



#include<stdio.h>
int main()
{
    int i,j;

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

    return 0;
}

 আউটপুট টা প্রথম প্রোগ্রামের মতো আসছে , তাই না! এর কারণটা নিজেই খোঁজার চেস্টা করো।


আমরা printf("\n"); টা দিয়েছি  for(i=1; i<=4; i++)   এর পর। তাই যখন এই লুপটা থেকে বেড়িয়ে আসবে তখন নতুন লাইন প্রিন্ট হবে।
 আর ততক্ষণে 1111222233334444 প্রিন্ট হয়ে যাবে। তারপর একটি নতুল লাইন প্রিন্ট হবে।


এবার নিচের প্রোগ্রামটা দেখোঃ


#include<stdio.h>
int main()
{
    int i,j;

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

    return 0;
}

 এই প্রোগামটা  রান করো। এবং আউটপুট কি আসে তা নিজে বোঝার চেস্টা করো।

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; তে চলে যাবে। এবং প্রোগ্রাম বন্ধ হয়ে যাবে।

Monday, 11 September 2017

লুপ নিয়ে কিছু সহজ সমস্যা (Loop exercise)

তোমাদের জন্য কিছু সহজ সমস্যা।

১। ১০ - ১ পর্যন্ত সবগুলা সংখ্যা প্রিন্ট করো।

২। ১ - ১০ পর্যন্ত সবগুলা জোড় সংখ্যা ও বেজোড় সংখ্যা প্রিন্ট করো।

৩।   1 থেকে n পর্যন্ত সবগুলা সংখ্যা প্রিন্ট করো। ( n এর মান ইউজারের কাছ থেকে ইনপুট নাও)

৪। যেকোন সীমার মধ্যে সব জোড় সংখ্যা প্রিন্ট করো।

নমূনা ইনপুটঃ

10  20

নমূনা আউটপুটঃ

10 12 14 16 18 20


৫। যেকোন সীমার মধ্যে সব বেজোড় সংখ্যা প্রিন্ট করো।

নমূনা ইনপুটঃ

10  20

নমূনা আউটপুটঃ

 11 13 15 17 19



সবগুলা সমস্যা for loop এবং while loop দুইটি লুপ দ্যেই আলাদা আলাদা করবে।


HappY CodinG :)

Sunday, 10 September 2017

while লুপের পরিচিতি ( while Loop)

মনেকরো, তোমাকে বলা হলো ১-১০ পর্যন্ত সব গুলা সংখ্যা প্রিন্ট করার জন্য। তুমি নিশ্চয়ই এখন সেটা লুপ দিয়ে করার চেষ্টা করবে। তাহলে প্রোগ্রামটা হতে পারে এরকম:



#include<stdio.h>
int main()
{
    int i;
    for(i=1; i<=10; i++)
    {
        printf("%d ",i);
    }
    return 0;
}


উপরের প্রোগ্রামে প্রতিবার i  এর মান প্রিন্ট হচ্ছে এবং প্রতিবার লুপ ঘুরার সাথে সাথে i এর মান ও বাড়ছে। আশা করি উপরের প্রোগ্রামটিতে তোমাদের কোন অসুবিধা নেই।

এবার আমরা এই প্রোগ্রামটি  while loop দিয়ে করবো।

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

এই প্রোগ্রাম কিভাবে কাজ করছে?
প্রথমে দেখবে i এর মান 1 .এর পর আমরা while এর ভিতর শর্ত দিয়েছি i এর মান 10 থেকে ছোট বা 10 এর সমান কি না?
ঠিক যেমন আমরা for loop এর ব্রেকিং কন্ডিশন এ দিয়েছি সেরকম। while loop এর ( ) এর ভিতরে ব্রেকিং কন্ডিশন দিতে হয়।

তারপর আমরা i এর মান প্রিন্ট করতে বলেছি। কম্পাইলার দেখবে i এর মান 1 এবং সেটা 10 এর ছোট , শর্ত সত্য। তাই  while loop এর বডিতে আসবে। এবার দেখবে i এর মান প্রিন্ট করতে বলা হয়েছে।
যেহেতু i এর মান 1 ,তাই 1 প্রিন্ট হবে। আমরা %d এর পর একটা স্পেস দিয়েছি। তাই আউটপুট এ ও 1 এর পর একটা স্পেস প্রিন্ট হবে। এবার দেখো i++ দেওয়া আছে, এর মানে i এর মান ১ বাড়বে।

এখন i এর মান 2 । কম্পাইলার এখন আবার while লুপের শর্ত চেক করবে। এখন দেখবে i<=10 শর্ত সত্য কারণ ২ এর মান ১০ থেকে ছোট। তাই আবার i এর মান প্রিন্ট করবে এবং তারপর i এর মান ১ বাড়াবে। এখন i এর মান 3 .

এভাবে যখন i এর মান 10 হবে তখন while লপের ভিতরে যাওয়ার পর কম্পাইলার দেখবে i<=10 শর্ত সত্য। কারণ ১০ এর মান ১০ এর সমান। তাই এবার ও i  এর মান প্রিন্ট হবে এবং i++ হয়ে i এর মান 1 বেড়ে 11 হবে।
কম্পাইলার আবারও while আসবে এবং শর্ত চেক করবে । কিন্তু ১১ এর মান ১০ থেকে ছোট নয় বা ১০ এর সমান নয়। তাই while  loop এর ভিতরে দেওয়া কন্ডিশনটা এখন মিথ্যা। তাই কম্পাইলার লুপ থেকে বের হয়ে যাবে। এবং return 0; তে আসবে। তারপর প্রোগ্রাম্ বন্ধ হয়ে যাবে।

আশাকরি তোমরা while loop কিভাবে কাজ করে এখন তা বোঝতে পারছো।  

Saturday, 9 September 2017

লপের ঘুরাঘুরি (Loop in C program) part-3

চলছেই চলবেঃ

শিরোনাম দেখে কি কিছুটা ঘাবড়ে গেছো ?  ঘাবড়ানোর কিছু নেই।
আমরা লুপের কথাই বলছি।  আমরা চাইলেই একতি লুপকে অবিরাম ঘুরাতে পারি। আবার নিজের অজান্তে প্রোগ্রামে দেখা যায়, কখনো কখনো প্রোগ্রাম চলতেই থাকে বন্ধ হয় না। এ ধরণের লুপকে বলা ইনফিনিট লুপ। মানে যে লুপের কোন শেষ নেই।


নিচের প্রোগ্রামটি রান করে দেখোঃ


#include<stdio.h>
int main()
{
    int i=0,j=0;
    for(i=0; i==j; i++,j++)
    {
        printf("%d %d\n",i,j);
    }
    return 0;
}
প্রোগ্রামটি শুরু হয়ে আর বন্ধ হয় নি তাই না। নিজে থেকে বন্ধ করলে তবেই বন্ধ হবে। এবার আরেকটি প্রগ্রাম দেখিঃ

#include<stdio.h>
int main()
{
    
    for( ; ; )
    {
        printf("hello\n");
    }
    return 0;
}

এই প্রোগ্রামে আমরা কোন শর্ত দেই নি। তাই কোন ব্রেকিং কন্ডিশন না থাকায় প্রোগ্রাম বন্ধ হবে না। অনির্দিষ্ট সময় পর্যন্ত চলবে।

এরকম মাঝে মাঝে প্রোগ্রাম করার পর যদি দেখো তা আর বন্ধ হচ্ছে না তাহলে খুজে দেখবে তোমার ব্রেকিং কন্ডিশন ঠিক আছে কি না?

Thursday, 7 September 2017

লুপের ঘুরাঘুরি (Loop in C program) part-2



আমরা গত পর্বে একটা প্রোগ্রাম লিখেছিলাম,

যেখানে for(i=1; i<=5; i=i+1) লুপটা এই রকম ছিলো।
আমরা আজকে করবো সামান্য কিছু পরিবর্তন করে।


 
#include<stdio.h >
int main()
{
    int i=0;
    for(i=0; i<5; i=i+1)
    {
        printf("Hello world\n");
    }
    return 0;
}

আমরা আগের প্রোগ্রামে i এর মান নিয়েছিলাম 1. কিন্তু এবার i এর মান 0.
তাই শর্তটি ও সামান্য বদলেছে। i<=5 এর পরিবর্তে আমরা i<5 বসিয়েছি। এর মানে i এর মান 0 থেকে শুরু হবে এবং
5 এর আগে অর্থাৎ 4 গিয়ে শেষ হবে।
তোমার যতথেকে ইচ্ছা i এর মান নিতে পারো, তবে সচারচর i=0 থেকেই নেওয়া হয়। এবার নিচের প্রোগ্রামটা দেখোঃ
 
#include<stdio.h >
int main()
{
    int i=0;
    for(i=0; i<5; i++)
    {
        printf("Hello world\n");
    }
    return 0;
}

এবার কি কোন পার্থক্য দেখতে পারছো? i=i+1 এর জায়গায় আমরা i++  বসিয়ে দিয়েছি।
i+1 কে i++ লেখা হয় সংক্ষেপে।

এবার নিচের প্রোগ্রামটা দেখোঃ
 
#include<stdio.h >
int main()
{
    int i;
    for(i=0; i<5; i++)
    {
        printf("Hello world\n");
    }
    return 0;
}

এই প্রোগ্রামেও শধু একটা জিনিস বদলেছি, আমরা int i=0 ; এই অংশটুকুটায় শধু int i; লেখেছি। এর কারণ হলো,
for(i=0;........) এইখানে আমরা i এর মান নির্ধারণ করে দিয়েছি। তাই আর উপরে না দিলেও চলবে।
নিচের প্রোগ্রামটা রান করে দেখোঃ

#include <stdio.h>
int main()
{
    int i=50;

    for(i=0; i<5; i++)
{
printf("%d\n",i);
}
return 0;
}

বলো তো আউটপুট কি? এর আউটপুট হলো 0,1,2,3,4
উপরে i এর মান 50 হলেও , for(i=0.. এই লাইনে এসে i er ,man ekon ০ হয়ে গেছে। তাই কাইন্ট 0 থেকেই শুরু হবে, এনং প্রতিবার i এর মান প্রিন্ট করবে।

এবার মনেকরো আমাদের বলা হলো ১-১০ পর্যন্ত  সংখ্যা প্রিন্ট করতে , নিশ্চয় ১০ বার printf(.........)
লেখা শুরু করবে না। তাহলে চলো লুপ দিয়ে প্রোগ্রামটা লিখিঃ

#include<stdio.h>

int main()

{

    int i;



    for(i=1; i<=10; i++)

    {

        printf("%d\n",i);

    }

    return 0;

}


আমরা একই  প্রোগ্রামটা for(i=1; i<11; i++) এভাবেও লিখতে পারতাম। এই স্টেটমেন্টটার লজিক তুমি নিজে বের করার চেস্টা করো।

এখন মনেকরো বলা হলো ০-১০ পর্যন্ত প্রিন্ট করতে হবে। তাহলে আমাদের প্রোগ্রামটা হবে এরকমঃ

#include<stdio.h>

int main()

{

    int i;



    for(i=0; i<=10; i++)

    {

        printf("%d\n",i);

    }

    return 0;

}

একই প্রোগ্রামটা আমরা for(i=0; i<11; i++) দিয়ে লিখতে পারি।

আশাকরি i এর মান ইনিশিয়ালাইজড এবং ব্রেকিং কন্ডিশন নিয়ে তোমাদের আর কোন অসুবিধা নেই। তবু কোন কিছু না বোঝলে অবশ্যই কমেন্টে জানাবে।