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

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 এর মান ইনিশিয়ালাইজড এবং ব্রেকিং কন্ডিশন নিয়ে তোমাদের আর কোন অসুবিধা নেই। তবু কোন কিছু না বোঝলে অবশ্যই কমেন্টে জানাবে।

Tuesday, 5 September 2017

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

যারা লুপ শব্দের অর্থ জানো তারা নিশ্চয়ই এর কাজ সমন্ধেও কিছুটা ধারণা করতে পারছো।

লুপ শব্দের আবিধানিক ( loop ) অর্থ চক্র।



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


মনেকরো তোমাকে  "Hello World" এই লেখাটা ৫ বার স্ক্রিনে দেখাতে বলা হলো। তাহলে তুমি কি করবে?

নিশ্চয়ই 
printf("Hello World\n");
printf("Hello World\n");
printf("Hello World\n");
printf("Hello World\n");
printf("Hello World\n");

এভাবে করতে পারবে।  কিন্তু যদি বলা হয় ১০০ বার বা ১০০০ বার করতে ? না এভাবে ১০০০ বার এক লাইন লিখে আর যা হোক , প্রোগামিং এর মতো মজার একটা জিনিসকে বিরক্তিকর করার মানে হয় না। আর এ বিরক্তিটা থেকে মুক্তি পাওয়ার জন্যই লুপের অবতারণা।

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

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



কি চমৎকার তাই না। মাত্র কয়টা লাইন লিখেই আমরা ৫ বার  Hello World  প্রিন্ট করে দিলাম।
শুধু ৫ বার নয় আমরা চাইলে এই সমান প্রোগ্রামে সামান্য একটু পরিবর্তন করেই ১০০ বার Hello World প্রিন্ট করতে পারবো। শুধু নিচের মতো একটু পরিবর্তন করে কোড টা রান করে দেখো।

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

হ্যা, 5 এর জায়গায় 100  বসিয়ে দিলেই আমাদের কাজ শেষ।

উপরের প্রোগ্রামটা আমরা for লুপ দিয়ে করেছি। সি তে সাধারণত ৩ ধরণের লুপ আছে, for , while এবং do-while loop.

ধীরে ধীরে আমরা সব গুলা লুপের সাথে পরিচিত হবো। 



প্রথমে আমরা একটা ইন্টিজার ভেরিয়েবল ডেক্লিয়ার করেছি, যার নাম দিয়েছি i. তুমি চাইলে a,b,c,d...... যেকোন নাম দিতে পারো। তবে সাধারণত প্রায় সব প্রোগ্রামে  i, j, k এভাবে নাম করণ দেখবে।  i কে এইখানে বলা হয় counter variable । কারণ লুপটি কতবার ঘুরছে  তা নির্ণয়ের জন্য এখানে i ব্যবহার করা হয়েছে।
আমরা i এর মান দিয়েছি 1.
তারপর
for( i=1 ;  i<=5;  i = i+1)
এই লাইনে i=1 এর পর একটা সেমিকোলন আছে, প্রথম অবস্থায় সবার ই এই সেমিকোলন নিয়ে একটু আধটু সমস্যা হয়। তবে একটু মাথা ঠান্ডা রেখে প্রোগ্রামিং করলে এসব সমস্যা সহযেই এড়ানো যায়।

তারপর আমরা দিয়েছি i<=5.
একে বলা হয় ব্রেকিং কন্ডিশন। যতক্ষণ পর্যন্ত এই কন্ডিশন সত্য থাকবে ততোক্ষণ পর্যন্ত লুপ চলবে।
এই শর্ত মিথ্যা হয়ে গেলে লুপ বন্ধ হয়ে যাবে। ।

তারপর আরেকটি সেমিকোলন (;) । এই সেমিকোলনের পর i=i+1 লেখা হয়েছে।
অর্থাৎ , প্রতিবার Hello World  প্রিন্ট করার পর i এর মান এক করে বাড়বে।


এবার চলো দেখে নেই উপরের প্রোগ্রামটি কিভাবে কাজ করছে।

প্রথমে  কম্পাইলার for লুপে আসার পর দেখবে for(i=1; ........)

একে বলা হয় "ইনিশিয়ালাইজড" (initialized) করা। সহজ কথায় i এর মান (কাউন্টার ভেরিয়েবল এর শুরুর মান) ঠিক করে দেওয়া।

তারপর কম্পাইলার i<=5 এইখানে আসবে, এবার চেক করবে i এর মান 5 এর চেয়ে ছোট বা সমান কি না?
যেহেতু i এর মান 1 এবং 1<=5 শর্তটি সত্য তাই for loop এর বডিতে আসবে।
{

     দুইটা দ্বিতীয় বন্ধনীর মধ্যবর্তী এই অংশকে বডি বলা হয়।
}

প্রথম অবস্থায় হয়তো মনে হতে পারে, i<=5 এর পর কম্পাইলার i=i+1 এই অংশে যাবে। কিন্তু না!
শর্ত সত্য হলে বডিতে আসবে এবং { } এর ভিতরের নির্দেশ অনু্যায়ী কাজ করবে।
বডির ভিতরে কমান্ড হলো printf("Hello World\n");

তাই একবার Hello World এই লেখাটা প্রিন্ট হবে।
 তারপর i=i+1 এ যাবে, এবং i  এর মান এক বেড়ে  1 থেকে 2  হবে।
এবার কম্পাইলার আর i=1 এই অংশে যাবে না। সরাসরি i<=5 এই অংশে চলে আসবে।
i=1  এই অংশটা শুধু মাত্র প্রোগ্রাম শুরুর পর প্রথম বার গ্রহণ হবে এবং i এর মান সেট হবে।


একবার লুপ ঘুরার পর যখন i=2 হবে তখন কম্পাইলার সরাসরি i<=5 এ আসবে , এবং পরীক্ষা করবে i এর মান 5 থেকে ছোট বা 5 এর সমান কি না ?


এখন i = 2 ; তাই i<=5 শর্তটি সত্য,   

তাই কম্পাইলার আবার for লুপের বডিতে আসবে এবং আবার প্রিন্ট হবে  Hello World. তারপর, i=i+1 হবে, এখন i এর মান 3. কম্পাইলার আবার কন্ডিশনে আসবে , এবং পরীক্ষা করবে  i<=5 কি না? যেহেতু i = 3 , এবং তা 5 এর চেয়ে ছোট তাই আবার প্রিন্ট হবে Hello World.

আবার, i=i+1 হবে, এখন i এর মান 4. কম্পাইলার আবার কন্ডিশনে আসবে , এবং পরীক্ষা করবে  i<=5 কি না? যেহেতু i = 4 , এবং তা 5 এর চেয়ে ছোট তাই আবার প্রিন্ট হবে Hello World.

এখন আবার, i=i+1 হবে, এখন i এর মান 5. কম্পাইলার আবার কন্ডিশনে আসবে , এবং পরীক্ষা করবে  i<=5 কি না? যেহেতু i = 5 , এবং তা 5 এর চেয়ে ছোট নয়, কিন্তু পাঁচ তো পাঁচ এর সমান, তাই এবার ও শর্ত সত্য এবং কম্পাইলার বডিতে যাবে,  এবন প্রিন্ট হবে Hello World.

এখন,  আবার, i =i+1 হবে, এখন i এর মান 6. কম্পাইলার আবার কন্ডিশনে আসবে , এবং পরীক্ষা করবে  i<=5 কি না?
যেহেতু,  i = 6 , এবং i এর মান 5 থেকে বড়, তাই এবার  i<=5 শর্তটি মিথ্যা। শর্তটি মিথ্যা হও্যার সাথে সাথে লুপ বন্ধ হয়ে যাবে।
কম্পাইলার return 0;  তে চলে আসবে এবনহ প্রোগ্রাম শেষ হয়ে যাবে।

Solution of If-else problem (part-2)




7.একটি অ্যালফাবেট VOWEL নাকি CONSONENT ? তা নির্ণয়ের প্রোগ্রাম লিখো।

#include <stdio.h>

int main()
{
    char ch;

    /* Input character from user */
    printf("Enter any character: ");
    scanf("%c", &ch);


    /* Condition for vowel */
    if(ch=='a' || ch=='e' || ch=='i' || ch=='o' || ch=='u' || 
       ch=='A' || ch=='E' || ch=='I' || ch=='O' || ch=='U')
    {
        printf("'%c' is Vowel.", ch);
    }
    else if((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
    {
        /* Condition for consonant */
        printf("'%c' is Consonant.", ch);
    }
    else 
    {
        /*
         * If it is neither vowel nor consonant
         * then it is not an alphabet.
         */
        printf("'%c' is not an alphabet.", ch);
    }

    return 0;
}

8.যেকোন ক্যারেক্টার ইউজারের কাছ থেকে ইনপুট নাও। এবার ক্যারেক্টার টি  ALPHABET বা DIGIT বা Special Character  কিনা? তা নির্ণয়ের প্রোগ্রাম লিখো।
 
#include <stdio.h>

int main()
{
    char ch;

    /* Input character from user */
    printf("Enter any character: ");
    scanf("%c", &ch);


    /* Alphabet check */
    if((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
    {
        printf("'%c' is alphabet.", ch);
    }
    else if(ch >= '0' && ch <= '9')
    {
        printf("'%c' is digit.", ch);
    }
    else 
    {
        printf("'%c' is special character.", ch);
    }

    return 0;
}


9.একটি অক্ষর বড় হাতের অক্ষর নাকি ছোট হাতের তা নির্ণয়ের প্রোগ্রাম লিখো।
#include <stdio.h>

int main()
{
    char ch;

    /* Input character from user */
    printf("Enter any character: ");
    scanf("%c", &ch);


    if(ch >= 'A' && ch <= 'Z')
    {
        printf("'%c' is uppercase alphabet.", ch);
    }
    else if(ch >= 'a' && ch <= 'z')
    {
        printf("'%c' is lowercase alphabet.", ch);
    }
    else
    {
        printf("'%c' is not an alphabet.", ch);
    }

    return 0;
}
10.ইউজারের কাছ থেকে ডলার ইনপুট নাও এবং টাকায় কনভার্ট করার প্রোগ্রাম লিখ। যদি ডলারের পরিমাণ $10 এর কম হয় তবে প্রতি ডলার ৮০ টাকা। আর যদি ডলারের পরিমাণ $5 এর বেশি হয় তবে প্রতি ডলার ৮৫ টাকা ধরে।

#include<stdio.h>
int main()
{
    int dollar;

    scanf("%d",&dollar);

    if (dollar<5)
    {
        printf("Taka = %d",dollar*80);
    }
    else
    {
        printf("Taka = %d",dollar*85);
    }
    return 0;
}


11. একটি ত্রিভুজ এর তিনটি কোণের মান ইনপুট নাও। এবং ত্রিভুজটি সবগুলা বাহু সমান কি না? তা নির্ণয়ের প্রোগ্রাম লিখো।



#include<stdio.h>

int main()

{

    int side1,side2,side3;



    scanf("%d %d %d",&side1,&side2,&side3);



    if((side1==side2) &&(side1==side3))

    {

        printf("All Sides are equal\n");

    }

    else

    {

        printf("Not equal\n");

    }

    return 0;

}
12. একজন ছাত্রের ৫ বিষয়ের পরীক্ষার নম্বর ইনপুট নাও।


  • যদি ৫ বিষয়ের নম্বরের গড় ৮০%  এর সামান বা  উপরে থাকে  তাহলে আউটপুট দেখাও A+.
  • যদি ৫ বিষয়ের নম্বরের গড় ৭০%  এর সামান বা  উপরে থাকে  তাহলে আউটপুট দেখাও A.
  • যদি ৫ বিষয়ের নম্বরের গড় ৬০%  এর সামান বা  উপরে থাকে  তাহলে আউটপুট দেখাও A-.
  • যদি ৫ বিষয়ের নম্বরের গড় ৫০%  এর সামান বা  উপরে থাকে  তাহলে আউটপুট দেখাও B.
  • যদি ৫ বিষয়ের নম্বরের গড় ৫০%  এর কম থাকে  তাহলে আউটপুট দেখাও    F .


#include
int main()
{
    int sub1,sub2,sub3,sub4,sub5;

    int sum,average;

    scanf("%d %d %d %d %d",&sub1,&sub2,&sub3,&sub4,&sub5);

    sum = sub1+sub2+sub3+sub4+sub5;
    average = sum/5;
    if(average>=80)
    {
        printf("A+\n");
    }
   else if(average>=70)
    {
        printf("A\n");
    }
   else if(average>=60)
    {
        printf("A-\n");
    }
   else if(average>=50)
    {
        printf("B\n");
    }
    else
    {
        printf("Fail\n");
    }
    return 0;
}