Saturday, 30 September 2017

সি প্রোগ্রামঃ অ্যারে [Array in C]

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

মনেকরো, একটি শ্রেনীতে ৫ জন ছাত্র আছে। আমি তাদের একটি পরীক্ষা নিয়েছি ;) এবার আমি চাই তাদের প্রত্যেকের প্রাপ্ত নম্বর প্রকাশ করবো। 

তোমরা হয়তো ভাবছো ব্যপারটা তো খুব সহজ! আমরা ৫ জন ছাত্রের জন্য ৫ টা integer ভেরিয়েবল ডেক্লিয়ার করবো। এবং রোল অনুযায়ী নম্বর গুলা বসিয়ে দেবো। তারপর প্রিন্ট করে দেবো।

তাহলে আমাদের প্রোগ্রামটা হতে পারে এরকমঃ

#include<stdio.h>
int main()
{
    /* Roll no. declared*/

    int r1,r2,r3,r4,r5;

    /* Scanning marks */

    printf("Enter marks of roll no.1:\n");
    scanf("%d",&r1);
    printf("Enter marks of roll no.2:\n");
    scanf("%d",&r2);
    printf("Enter marks of roll no.3:\n");
    scanf("%d",&r3);
    printf("Enter marks of roll no.4:\n");
    scanf("%d",&r4);
    printf("Enter marks of roll no.5:\n");
    scanf("%d",&r5);

    /* Printing marks */

    printf("Marks of roll no.1: %d\n",r1);

    printf("Marks of roll no.2: %d\n",r2);

    printf("Marks of roll no.3: %d\n",r3);

    printf("Marks of roll no.4: %d\n",r4);

    printf("Marks of roll no.5: %d\n",r5);

   return 0;
}


 আশা করছি প্রোগ্রামটা বোঝতে পারছো। আমরা ৫ জন ছাত্রের রোল ডেক্লিয়ার করেছি, প্রাপ্ত  নম্বর স্কেন নিয়েছি আর তারপর, সেটা প্রিন্ট করে দিয়েছি। খুবই সহজ তাই না?  এই স্কেন আর প্রিন্ট এর কাজ কিন্তু লুপ দিয়ে ও করা যেতো। কিন্তু যদি এখানে ছাত্র ৫ জন না হয়ে ১০০ জন হতো ভেরিয়েবল কিন্তু ১০০ টা ই ডেক্লিয়ার করা লাগতো! এবার তোমাকে যদি বলা হয়, এই ৫ জন ছাত্রের মধ্যে কে সব থেকে বেশী নম্বর  পেয়েছে তা বের করতে? হ্যা সেটা ও পারবে। ( ৩ টি সংখ্যার মধ্যে বড় সংখ্যা নির্ণয়ের প্রোগ্রামটি মনে আছে!) একইভাবে ৫ টি সংখ্যা থেকেও বড় সংখ্যা নির্ণয় করা যাবে। প্রোগ্রামের সাইজ একটু বেশি হয়ে যাবে। আর যদি ১০০ জন ছাত্রের মধ্যে কে বেশি নম্বর পেয়েছে তা বের করতে বলা হয়!!!! ভেবেই দেখো কয়টা শর্ত লিখতে হতো।

আর এ সমস্ত ঝামেলা থেকে মুক্তি পেতেই অ্যারের ব্যবহার।   

অ্যারে:


Array শব্দের বাংলা অর্থ  বিন্যাস, শ্রেণি বিন্যাস,সাজানো ইত্যাদি। আপাততো আমরা সেদিকে না যাই।

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


অ্যারে ডেক্লিয়ারঃ

 অ্যারে ডেক্লিয়ার করা খুবই সহজ। সাধারণত আমরা যেভাবে ভেরিয়েবল  ডেক্লিয়ার করি সেভাবে অ্যারে ডেক্লিয়ার করা হয়।
শুধু অ্যারে ডেক্লিয়ার করার পর পাশে অ্যারের সাইজ ডেক্লিয়ার করে দিতে হয়।

যেমনঃ
int a [5] 
উপরে আমরা একটা ইন্টিজার টাইপ অ্যারে ডেক্লিয়ার করেছি যার নাম দিয়েছি  a । [5] এর মানে অ্যারেটি ৫ টি ইন্টিজার জমা রাখতে পারবে।

অ্যারের ইন্ডেক্সঃ    
একটি অ্যারেকে আমরা একটি সোজা লম্বা কাঠের বাক্সের সাথে তুলনা করতে পারি। যেখানে অনেকগুলা খোপ রয়েছে। (উপরের ছবিটি লক্ষ্য করো)।
প্রতিটি খোপ এ একটি করে সংখ্যা রয়েছে। বাক্সে ততটি খোপ থাকবে যতটি আমরা আগে থেকে নির্ধারণ করে দিবো। 
আমরা চাইলে সবগুলা খোপ ব্যবহার করতে পারি  বা চাইলে কম ব্যবহার করতে পারি। কিন্তু নির্ধারিত খোপের বেশি ব্যবহার করতে পারবো না। 
যেমন আমরা উপরের চিত্রে a[0] a[1]  a[2]  a[3]  ব্যবহার করতে পারতাম।  a[4] চাইলে ব্যবহার নাও করতে পারতাম।

লক্ষ্য করো, অ্যারের ইন্ডেক্সিং শুরু হয় 0 থেকে। এর মানে আমি যদি array[10] ডেক্লিয়ার করি তাহলে ইন্ডেক্সিং হবে array[0] থেকে  array[9]  পর্যন্ত।
 array[10] নয়। 

 অ্যারের  মান নির্ধারণঃ 
অ্যারের  মান আমরা বিভিন্নভাবে আসাইন করতে পারিঃ

যেমনঃ
ara[10]={10,20,30,40,50,60,70,80,90,100}

অথবা,

ara[ ]={10,20,30,40,50,60,70,80,90,100}

দ্বিতীয় উদাহারণে আমরা [ ] ফাঁকা রেখেছি, কিন্তু কম্পাইলার উপাদান সংখ্যা দেখে অ্যারের সাইজ বোঝে যাবে। 
আবার আমরা অ্যারের মান স্কেন ও নিতে পারি।

অ্যারে স্কেন ও প্রিন্টঃ
আমরা লুপ দিয়ে অ্যারে স্কেন নিতে পারি। যেমনঃ

#include<stdio.h>
int main()
{
    int i,ara[10];
    for(i=0;i<10;i++)
    {
        scanf("%d",&ara[i]);
    }
    return 0;

}
 

আমরা জানি অ্যারের ইন্ডেক্সিং শুরু হয় 0 থেকে। তাই ara[10] এর জন্য আমরা 0 থেকে 9 পর্যন্ত লুপ চালাবো। i এর মান যতো, ঠিক ততো নম্বর index এ মান অ্যাসাইন হবে।
প্রথমে i=0, যা 10 থেকে ছোট, তাই বডিতে আসবে এবং একটি ইন্টিজার স্কেন নেবে। যা ara[i] এ সেভ হবে। যেহেতু প্রথমে i=0, তাই আমরা যে মান স্কেন দিবো তা a[0] তে অ্যাসাইন হবে। তারপর i++ হবে।
এবার  i=1, এবার যে মান স্কেন নিবো তা a[1] এ অ্যাসাইন হবে। তারপর i++ হবে।  

এবার  i=2, এবার যে মান স্কেন নিবো তা a[2] এ অ্যাসাইন হবে। 
এভাবে i এর মান যতো হবে  ততো নম্বর ইন্ডেক্স এ মান অ্যাসাইন হবে। 

এবার মনেকরো আমরা দেখতে চাই ara[4] এর মধ্যে কোন মান আছে। তাহলে চলো নিচের প্রোগ্রামটি দেখা যাকঃ

 #include<stdio.h>
int main()
{
    int i,ara[10];
    for(i=0;i<10;i++)
    {
        scanf("%d",&ara[i]);
    }
    printf("%d",ara[4]);
    return 0;

}


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

#include<stdio.h>
int main()
{
    int i,ara[10];
    for(i=0;i<10;i++)
    {
        scanf("%d",&ara[i]);
    }
    printf("Elements are:\n");

    for(i=0;i<10;i++)
    {
        printf("%d ",ara[i]);
    }

    return 0;

}
হ্যা,আউটপুট এবং ইনপুট ঠিক একই রকম। শুধু scanf ফাংশন এর জায়গায় printf ফাংশন লিখলেই হবে। বাকিসব একইরকম।


এবার আরেকটি প্রোগ্রামঃ 

#include<stdio.h>
int main()
{
    int i,n,ara[100];

    printf("Enter the size of array:\n");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&ara[i]);
    }
    printf("Elements are:\n");

    for(i=0;i<n;i++)
    {
        printf("%d\t",ara[i]);
    }

    return 0;

}


এই প্রোগ্রামে আমরা ara[100] ডেক্লিয়ার করলেও আমরা চাইলে 1-100 এর ভিতর যেকোন সংখ্যক উপাদান নিয়ে কাজ করতে পারি। তাই আমরা একটি ইন্টিজার n ডেক্লিয়ার করেছি। তোমরা প্রোগ্রামটি রান করো, এবং 5,10 ইত্যাদি মান দিয়ে অ্যারে স্কেন করো। দেখবে আমরা আমাদের ইচ্ছা মতো উপাদান নিয়ে কাজ করতে পারবো। তবে, 100 টির বেশী উপদান নিতে পারবো না। এর থেকে বেশী উপাদান নিয়ে কাজ করতে হলে আমাদের ara[100] এর 100 পরিবর্তন করে অ্যারের সাইজ বেশী দিতে হবে।

Monday, 25 September 2017

প্যাটার্নের গুষ্ঠি উদ্ধার (last post)

আমরা প্যাটার্ন নিয়ে অনেক প্রোগ্রাম দেখেছি । আবার আমরা আমাদের প্রিয় BANGLA  কে * দিয়ে প্রিন্ট করবো।

তো চলো কাজে নেমে পড়ি!! বীর বাঙ্গালী কিবোর্ড ধরো, সাইবার জগৎ শাসন করো। :)

আমি চেস্টা করবো আমাদের কোডের মধ্যে কমেন্ট ব্যবহার করে কোড এর কাজ বোঝাতে।


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

    /*কোডের এই অংশটি B প্রিন্ট করবে */

    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
        {
            if(i==1&&j==n||i==n&&j==n||i==3&&j==n)
            {
                printf(" ");
            }
            else if(i==1||j==n||j==1||i==n||i==3)
            {
                printf("*");
            }
            else
            {
                printf(" ");
            }
        }

        /*  এখানে একটি স্পেস প্রিন্ট হবে। */

        for(j=1;j<=1;j++)
        {
            printf(" ");
        }

        /*কোডের এই অংশটি  A প্রিন্ট করবে */

        for(j=1; j<=n; j++)
        {
            if(i==1 && j==1 || i==1&&j==n)
            {
                printf(" ");
            }
            else if(j==1||j==n||i==1||i==3)
            {
                printf("*");
            }
            else
            {
                printf(" ");
            }
        }

        /*  এখানে একটি স্পেস প্রিন্ট হবে। */

        for(j=1;j<=1;j++)
        {
            printf(" ");
        }

        /*কোডের এই অংশটি  N প্রিন্ট করবে */

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

        /*  এখানে একটি স্পেস প্রিন্ট হবে। */

        for(j=1;j<=1;j++)
        {
            printf(" ");
        }

        /*কোডের এই অংশটি G প্রিন্ট করবে */

        for(j=1; j<=n; j++)
        {
            if(i==1&&j==1||i==1 && j==n||i==n&&j==1||i==3&&j==2)
            {
                printf(" ");
            }
            else if(j==1||i==1||j==n||i==n||i==3)
            {
                printf("*");
            }
            else
            {
                printf(" ");
            }
        }

        /*  এখানে একটি স্পেস প্রিন্ট হবে। */

        for(j=1;j<=1;j++)
        {
            printf(" ");
        }

        /*কোডের এই অংশটি  L প্রিন্ট করবে */

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

        for(j=1;j<=1;j++)
        {
            printf(" ");
        }

        /*কোডের এই অংশটি  A প্রিন্ট করবে */

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


    return 0;
}

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 কিভাবে কাজ করে এখন তা বোঝতে পারছো।