Friday, 3 November 2017

একটি সংখ্যাকে উলটো করে প্রিন্ট করার প্রোগ্রাম

মনেকরি, 2017  সংখ্যাটিকে  উলটো করে প্রিন্ট করতে হবে। এখন এই কাজটি কিভাবে করা যায়?
এই কঠিন কাজটি সহজ করার জন্য আমাদের পরিচিত একটা অপারেটর আছে। মডুলাস (%) অপারেটর।

এবার দেখি কিভাবে কাজটি করবোঃ
কোন সংখ্যাকে ১০ দিয়ে মড করলে তার সর্বশেষ অংকটি পাওয়া যায়।
প্রথমে 2017  কে 10 দিয়ে মড করলামঃ 2017 % 10 = 7
এই 7 কে প্রিন্ট করে দিলাম।

তারপর 2017 কে 10 দিয়ে ভাগ করলামঃ 2017/10 = 201
আবার 201 কে 10 দিয়ে মড করলামঃ 201 % 10 =  1
এই 1 কে প্রিন্ট করে দিলাম।

তারপর 201 কে 10 দিয়ে ভাগ করলামঃ 201/10 = 20
আবার 20 কে 10 দিয়ে মড করলামঃ 20 % 10 =  0
এই 0 কে প্রিন্ট করে দিলাম।

তারপর 20 কে 10 দিয়ে ভাগ করলামঃ 20/10 = 2
আবার 2 কে 10 দিয়ে মড করলামঃ 2 % 10 =  2
এই 2 কে প্রিন্ট করে দিলাম।


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


প্রোগ্রামঃ

#include<stdio.h>
int main()
{
    int num = 2017,mod;

    mod = num%10;
    printf("%d",mod);

    num = num/10;
    mod = num%10;
    printf("%d",mod);

    num = num/10;
    mod = num%10;
    printf("%d",mod);

    num = num/10;
    mod = num%10;
    printf("%d",mod);

    return 0;
}



তোমার জন্য কাজঃ  উপরের প্রোগ্রামটি লুপ ব্যবহার করে করো।

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


লক্ষ্য করে দেখো আমরা num কে 10 দিয়ে ভাগ করার কাজ টি ঠিক ততক্ষণ পর্যন্ত করে গেছি যতক্ষণ না num এর মান 0 না হয়েছে।

প্রোগ্রামঃ

#include<stdio.h>
int main()
{
    int num = 2017,mod;


    while(num>0)
    {
        mod = num%10;
        printf("%d",mod);
        num = num/10;
    }

    return 0;

}


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

এবার চলো দেখে নেই কিভাবে কাজটি করা যায়। 
আবার 2017 এ চলে যাই, 
আমরা 2017 কে 10 দিয়ে মড করলাম, 2017 % 10 = 7
এই 7 কে আমরা rev নামক ভেরিয়েবলে রাখলাম। 
rev = 7.

তারপর, 2017 কে 10 দিয়ে ভাগ করলাম। 
2017/10  = 201

তারপর আগের মতো 201 কে 10 দিয়ে মড করলাম।
 201%10 = 1

এতক্ষণ যা করলাম সব আগের মতো , এখন ব্যপারটা বোঝতে চেষ্টা করো। 
আমরা rev এ 7 কে রেখেছিলাম। 
এবার rev কে ১০ দিয়ে গুণ করে তার সাথে 1 যোগ করে দিবো।

মানে দাঁড়ালোঃ  (rev*10) + 1 = (7*10)+1 = 70+1 =71.

এরপর আবার আগের প্রসেসে ফিরে যাই। 

তারপর, 201 কে 10 দিয়ে ভাগ করলাম। 
201/10  = 20

তারপর  20 কে 10 দিয়ে মড করলাম।
 20%10 = 0
এবার rev কে ১০ দিয়ে গুণ করে তার সাথে 0 যোগ করে দিবো।

মানে দাঁড়ালোঃ  (rev*10) + 0 = (71*10)+0 = 710+0 =710.

তারপর, 20 কে 10 দিয়ে ভাগ করলাম। 
20/10  = 2

তারপর  2 কে 10 দিয়ে মড করলাম।
 2%10 = 2
এবার rev কে ১০ দিয়ে গুণ করে তার সাথে 2 যোগ করে দিবো।

মানে দাঁড়ালোঃ  (rev*10) + 2 = (710*10)+2 = 7100+2 =7102.

ব্যাস আমরা পেয়ে গেলাম আমাদের কাংখিত ফলাফল। 


প্রোগ্রামটা নিজে লেখার চেষ্টা করো। 

Wednesday, 1 November 2017

লুপ দিয়ে অংক গণনা

আগের পোস্টে আমরা log ব্যবহার করে একটি সংখ্যায় কতটি অংক আছে তা নির্ণয়ের প্রোগ্রাম দেখেছি।

এবার আমরা দেখবো লুপ দিয়ে কিভাবে কাজটি করা যায়।


#include<stdio.h>
int main()
{
    int num,i,count=0;
    printf("Enter a Number:\n");
    scanf("%d",&num);
    while(num>0)
    {
        num = num/10;
        count++;
    }
    printf("Total digit = %d\n",count);

    return 0;
}


ব্যাখ্যাঃ 
একটা সংখ্যাকে ১০ দিয়ে ভাগ করলে এর সর্বশেষ অংকটি মুছে যায়। 

মনেকরি আমাদের কাছে একটি সংখ্যা আছে ঃ 123456

এবার আমাদের প্রমাণ করতে হবে এখানে ছয়টি অংক আছে। 


ধাপ - ১ঃ  123456 / 10 = 12345 
               
               ১২৩৪৫৬ কে ১০ দিয়ে ভাগকরলে ভাগফল হবে ১২৩৪৫। তারমানে, আমরা সর্বশেষ অংকটি  মুছে দিয়েছি। 
         
     count : 1.
     
 ধাপ - ২ঃ  12345 / 10 = 1234 
               
               ১২৩৪৫ কে ১০ দিয়ে ভাগকরলে ভাগফল হবে ১২৩৪। তারমানে, আমরা সর্বশেষ অংকটি  মুছে দিয়েছি। 
         
     count : 2.

ধাপ - ৩ঃ  1234 / 10 = 123 
               
               ১২৩৪ কে ১০ দিয়ে ভাগকরলে ভাগফল হবে ১২৩। তারমানে, আমরা সর্বশেষ  অংকটি  মুছে দিয়েছি। 
         
     count : 3.

প্রতিবার একটি সংখ্যা মুছার পর যদি আমরা count এর মান 1 করে বাড়াই , তাহলে আমরা উত্তর পেয়ে যাবো।


আশাকরি তোমরা বোঝতে পেরেছো। বাকী ধাপগুলো নিজেই করে ফেলো। 

ব্রেকিং কন্ডিশনঃ
আমরা ব্রেকিং কন্ডিশন হিসেবে ব্যবহার করেছি   num>0   তারমানে যতক্ষণ পর্যন্ত আমাদের সংখ্যাটা ০ এর চেয়ে বড় থাকবে ততক্ষণ পর্যন্ত লুপ চলবে। তাহলে আমাদের প্রোগ্রামে এমন কিছু করতে হবে যাতে num এর মান শুণ্য বা তার থেকে ছোট হয়। এই কাজটা আমরা করেছি num কে প্রতিবার 10 দিয়ে ভাগ করে। 






তোমাদের জন্য একটি কাজঃ   ইউজারের কাছ থেকে একটি সংখ্যা ইনপুট নিবে এবং সবগুলা অংকের যোগফল নির্ণয়ের প্রোগ্রাম লিখবে। 
Hints : Modulus operator ( % ) ব্যবহার করে সর্বশেষ সংখ্যা বের করো । :p

Thursday, 19 October 2017

একটি সংখ্যার মধ্যে কতোগুলা অংক আছে তা নির্ণয় করার প্রোগ্রাম লিখো।

1234 - এখানে কয়টি সংখ্যা আছে? মোট চারটি।
এবার আমরা প্রোগ্রাম দিয়ে কিভাবে তা বের করবো।
অনেকগুলা পদ্ধতি আছে।

 log10(1000) = 3
লগারিদম ব্যবহার করে আমরা কাজটা করতে পারি। যারা লগারিদম নিয়ে জানতে চাও একটু কষ্ট করে গুগল করে দেখে নাও।
একে log(1000) এভাবেও লেখা হয়। কারণ এই log কে বলা হয় কমন লগারিদম এবং শুধু log মানেই ধরে নেওয়া হয় এটি 10 based.

আমাদের কে 1000 সংখ্যাটা পেতে হলে ১০ কে কয় বার গুণ করতে হবে?
10*10*10=1000
তাহলে আমাদের ৩ বার গুণ করা লাগছে।
উপরের log ফাংশনটাও কিন্তু 3 আউটপুট দিয়েছে।  তারমানে একটি সংখ্যা পেতে হলে 10 কে কতবার গুণ করতে হবে log ফাংশন সেই আউটপুট দেয়।
এবার যদি 1234 পেতে চাই তাহলে ১০ কে কতবার গুণ করা লাগবে?
চলো দেখি,
10*10*10*10=10000

তারমানে চারবার গুণ করলে হচ্ছে ১০,০০০ যা ১২৩৪ থেকে অনেক বড়। আর ৩ বার গুণ করলে হচ্ছে ১০০০। যা ১২৩৪ থেকে ছোট।

তোমাদের হাতের কাছে ক্যাকুলেটর থাকলে log(1234) করে দেখো। রেসাল্ট আসবে 3.0913 এরকম কিছু।
আমরা যদি দশমিকে পরের অংশ বাদ দিয়ে দেই তাহলে ৩ পাচ্ছি।
তোমরা হয়তো ভাবছো  1000 অথবা 1234 এ সংখ্যা মোট চারটি আমি তিন নিয়ে এতো প্যাচাল করছি কেন? আছে আছে কারণ আছে। তবে এখনই বলছি না। এই লেখাটা সম্পূর্ণ পড়ার পর নিজেই কারণটা জানতে পারবে।
এবার তোমাদের একটি ছোট টেকনিক বলে দেই। আমাদের কাছে যতটা সংখ্যা থাকবে log ফাংশন তার থেকে উত্তর 1 কম দিবে।
ক্যালকুলেটরে  log(1) দিয়ে দেখো উত্তর আসবে 0.
log(12) দিলে উত্তর আসবে 1.
তারমানে আমাদের অঙ্ক যতটা উত্তর তার থেকে 1 কম।
আমি জানি তোমার মাথায় সমাধান এসে গেছে log ফাংশন যা রেসাল্ট দিবে তার সাথে আমরা ১ যোগ করে দিলেই খেল খতম।

 আমরা যেসব ক্যালকুলেটর ব্যবহার করে তা 10 based তাই log(num) লিখলেই আমাদের কাজ হয়ে যায় । কিন্তু প্রোগ্রামিং এর  ক্ষেত্রে  base উল্লেখ করে দিতে হবে। log10(num) এভাবে। 

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

#include <stdio.h> #include <math.h> /* log10() ব্যবহার করার জন্য এই হেডারফাইল */ int main() { int num; int count = 0; /* নাম্বার Input নেওয়ার জন্য */ printf("Enter any number: "); scanf("%d", &num); /* মোট অংক হিসাব করার জন্য log10(num) এর সাথে 1 যোগ */ count = log10(num) + 1; printf("Total digits: %d", count); return 0; }

Thursday, 12 October 2017

Swap (অদল-বদল)

Swap প্রোগ্রামিং এর একটি গুরুত্বপূর্ণ বিষয়। সহজ কথায় swap হলো দুই বা ততোধিক কিছুর মধ্যে অদল-বদল করা।

আগে একটি উদাহারণ দেই।

মনেকরো, আমাদের কাছে দুইটা বালতি আছে। একটা বালতির রঙ লাল এবং অন্য বালতির রঙ নীল।  লাল বালতিতে আছে গাভীর খাঁটি দুধ। আর নীল বালতিতে আছে বিশুদ্ধে পানি।
দুধের পরিমাণ ১ লিটার এবং পানির পরিমাণও ১ লিটার। এবার যদি তোমাকে বলা হয় নীল বালতিতে দুধ রাখতে হবে এবং লাল বালতিতে পানি রাখতে হবে। কিন্তু দুধ বা পানি যে পরিমাণ আছে সে পরিমাণই থাকবে কোন পরিবর্তন যেন না হয়।

তাহলে তুমি সহজেই তৃতীয় আরেকটি বালতি দিয়ে কাজটি করতে পারো।
মনেকরো তুমি আরেকটি বালতি আনলে যার নাম দিলাম টেম্পোরারি বালতি।

  1.  তুমি প্রথমে টেম্পোরারি বালতিতে দুধ রাখলে। তাহলে,এখন তোমার দুধের বালতি খালি। 
  2. দুধের বালতিতে তুমি পানি রাখলে। এবার তোমার পানির বালতি খালি। 
  3. এখন টেম্পোরারি বালতি থেকে পানির বালতিতে দুধ রাখলে।

এবার লক্ষ্য করে দেখো তোমার দুধের বালতিতে পানি এবং পানির বালতিতে দুধ চলে গেছে। নিচের ছবিটি দেখোঃ






এবার চলো আমরা একটা প্রোগ্রাম দেখিঃ 
#include<stdio.h>
int main()
{
    int a,b,temp;

    a=10, b=20;

    temp=a;
    a = b;
    b= temp;
    
    /* Now a = 20 and b = 10 */
    printf(" a = %d\n b = %d\n",a,b);
    return 0;
}

আশা করি বোঝতে পেরেছো। না পারলে শুরু থেকে আবার চেস্টা করো। 











Wednesday, 4 October 2017

অ্যারে সার্চ (linear search)

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

আগের পর্বে আমরা অ্যারের উপাদানগুলো যোগ করার প্রোগ্রাম করেছিলাম।
মনেকরো আমরা ১ থেকে ১০ পর্যন্ত সবগুলা সংখ্যা যোগ করতে চাই, সেক্ষেত্রে আমরা একটি লুপ দিয়ে কাজটি করতে পারি। লুপ নিয়ে কিছু সহজ সমস্যা (Loop exercise)  এর প্রথম সমস্যাটা দেখতে পারো। এবার হয়তো মনে হতে পারে যে কাজটি লুপ দিয়েই এতো সহজে করা যায় সেখানে অ্যারে কেন ব্যবহার করবো?! কিন্তু মনেকরো ১-১০ পর্যন্ত যোগ করার সময় পাঁচ নম্বরে যে সংখ্যাটা যোগ করেছি তা আমরা জানতে চাই।
  1+2+3+4+5+6+7+8+9+10  তাহলে পাঁচ নম্বরে 5 আছে। এটা অ্যারে ব্যবহার করলে যেকোন সময় আউটপুট এ দেখাতে পারবে। যদি তোমার অ্যারের নাম  a হয় এবং  0 besed index হয় তাহলে a[4] প্রিন্ট করলে তা পেয়ে যাবে। আর যদি 1 besed index হয় তাহলে a[5] প্রিন্ট করলে তা পেয়ে যাবে।
তোমার মনে হতে পারে একথা তো আর প্রোগ্রাম করে বলতে হবে না। মুখেই বলে দেওয়া যায় যে, পাঁচ নম্বর ইনডেক্স এ কোন সংখ্যা ছিলো।

তাহলে আমরা আরেকটু গভীরে যাই। আমরা আসলে এমন একটি প্রোগ্রাম লিখেছি যেখানে যেকোন নম্বর দিয়ে যোগ করা যায়। 1 2 3 4  5.. এভাবে ইনপুট দিতে হবে এমন কোন কথা নেই। ইউজার চাইলে  10 300 2 5 55 .... এভাবেও ইনপুট দিতে পারে। অ্যারের যোগ [Find the sum of all elements] পোস্টটা আবার দেখতে পারো।  এখন যদি আমরা জানতে চাই পাঁচ নম্বরে কোন সংখ্যা ইনপুট দেওয়া হয়েছিল ? অ্যারে দিয়ে করলে তা খুব সহজেই বলে দিতে পারবো।

এখন হয়তো তোমার ইচ্ছা হলো অ্যারের প্রথম উপাদান আর শেষ উপাদান যোগ করে তার মান sum নামক ভেরিয়েবলে রাখবে! তো ধরে নিলাম তুমি ৫ টি উপাদানের অ্যারে নিয়েছো। যেটি শুরু হয়েছে a[0] থেকে এবং শেষ হয়েছে a[4] এ । তাহলে sum = a[0]+a[4]; এই লাইনটা লিখলেই হবে।

আশা করি অ্যারে নিয়ে তোমাদের ধারণা অনেক পরিষ্কার হয়েছে ।


এবার আমাদের আজকের মূল বিষয়ে ফিরে যাই,
আমরা  অ্যারে তে অনেকগুলা সংখ্যা জমা রাখার পর মনেকরো  হঠাৎ একটা সংখ্যা খোঁজার প্রয়োজন হলো। হতে পারে কোন শ্রেণিতে ছাত্র - ছাত্রীর রোল নম্বর,  মনেকরো,আমরা একটি শ্রেণি থেকে কয়েকজন ছাত্র -ছাত্রী নিয়ে একটা প্রোগ্রামিং ক্লাব তৈরি করেছি। ক্লাবের সব সদস্যের রোল নম্বর একটি অ্যারেতে রেখেছি। এখন আমরা জানতে চাই আমাদের ক্লাবে (অ্যারেতে) 33 রোলের কোন শিক্ষার্থী আছে কি না? সেটা আমরা খুব সহজে লিনিয়ার সার্চ ব্যবহার করে  জানতে পারি।

আরো গভীরে যাও (+_+):


লিনিয়ার শব্দের অর্থ  রৈখিক। কাজেই বোঝতে পারছো এই সার্চটি একটি রেখার মতো কাজ করে।

নিচের চিত্রটি দেখোঃ

source: https://www.tutorialspoint.com/data_structures_algorithms/images/linear_search.gif

এখানে ১০ টি উপাদানের একটি অ্যারে আছে। এর মধ্যে আমরা 33 সংখ্যাটাকে খোঁজবো । তার জন্য আমাদের যা করতে হবে তা হলো এক এক করে সবগুলা সংখ্যা চেক করবো যে সংখ্যাটি 33 এর সমান কি না? যখনই আমরা 33 পেয়ে যাবো আমাদের সার্চ ব্রেক করে দেবো।

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


#include<stdio.h>
int main()
{
    int a[100],i,n,item;
    printf("Enter the size of array:\n");
    scanf("%d",&n);
    printf("Enter %d elements: \n",n);
    for(i=0; i<n; i++)
    {
        scanf("%d",&a[i]);
    }
    printf("Entered elements: are\n");
    for(i=0; i<n; i++)
    {
        printf("%d\t",a[i]);
    }
    printf("\nEnter the item you want to search: \n");
    scanf("%d",&item);
    for(i=0; i<n; i++)
    {
        if(a[i]==item)
        {
            printf("Item found at %d th position\n",i+1);
            break;
        }
    }
    return 0;
}


printf("\nEnter the item you want to search: \n");      এই লাইনের আগ পর্যন্ত কোড গুলা আশাকরছি বোঝতে পারছো। কোন সমস্যা হলে আগের টিউটোরিয়াল গুলা দেখতে পারো।
  • আমরা printf("\nEnter the item you want to search: \n");    এই লাইনে ইউজারকে বলছি যে সে সংখ্যাটা সার্চ করতে হবে তা ইনপুট দিতে। তারপরের লাইনে আমরা সংখ্যাটা ইনপুট নিয়েছি। এবং তা item নামক ভেরিয়েবল এ রেখেছি।
  • এবার আমরা একটা লুপ চালিয়েছি অ্যারের শুরু থেকে শেষ পর্যন্ত। লুপের ভিতরে আমরা একটা শর্ত দিয়েছি। যেখানে প্রতিটা উপাদানকে চেক করছি তা আমাদের item এর সমান কি না।  যদি কখনো শর্ত মিলে যায় অর্থাৎ আমরা যে সংখ্যাটা খোঁজছি তা পাওয়া যায় তাহলে প্রিন্ট করবে কততম পজিশনে সংখ্যাটা পাওয়া গেছে। এবং এই পজিশনটা হলো i যতবার ঘুরেছে এর সমান। যেহেতু আমরা ইনডেক্সিং 0 থেকে করেছি তাই আমাদের আউটপুট এ i+1 করে দিয়েছি। কারণ আমরা সাধারণত পজিশন 0 থেকে হিসাব না করে 1 থেকে করি। প্রিন্ট করার পর আমরা লুপ ব্রেক করে দিয়েছি। কারণ আমাদের খোজা শেষ। 
কিন্তু মনেকরো আমরা যে সংখ্যা খোঁজছি তা অ্যারেতে নেই। এক্ষেত্রে আমাদের উপরের প্রোগ্রাম কোন আউটপুট দিবে না।
তবে আমরা যদি প্রোগ্রামটা একটু পরিবর্তন করে flag ভেরিয়েবল ব্যবহার করি তাহলে সহজেই এই সমস্যা সমাধান করা যাবে, প্রোগ্রামটা দেখে নেইঃ

 
#include<stdio.h>
int main()
{
    int a[100],i,n,item,flag=0;
    printf("Enter the size of array:\n");
    scanf("%d",&n);
    printf("Enter %d elements: \n",n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    printf("Entered elements: are\n");
    for(i=0;i<n;i++)
    {
        printf("%d\t",a[i]);
    }
    printf("\nEnter the item you want to search: \n");
    scanf("%d",&item);
    for(i=0;i<n;i++)
    {

       if(a[i]==item)
        {
            printf("Item found at %d th position\n",i+1);
            flag++;
            break;
        }
    }
    if(flag==0)
    {
        printf("Item not found in this array! \n");
    }
    return 0;
}

আমরা flag=0 ধরে নিয়েছিলাম। আর যদি আমাদের কাংখিত সংখ্যাটা পাওয়া যায় তখন আমরা break করার পুর্বে flag++ করে এর মান পরিবর্তন করে দিয়েছি। তুমি চাইলে flag--, flag=1, ইত্যাদি যা খুশি করতে পারো। তবে যাই করো লক্ষ্য রেখো flag এর মান যেন পরিবর্তন হয়।
তারপর আমরা flag এর বাইরে শর্ত দিয়েছি  flag এর মান শুণ্য এর সমান হলে প্রিন্ট করবে যে সংখ্যাটা এই অ্যারেতে খোঁজে পাওয়া যায় নি।
আর যদি flag এর মান শুণ্য না হয়? আমাদের এই শর্ত কিছু প্রিন্ট করবে না। কারণ শর্তটি তখন মিথ্যা হয়ে যাবে।  কিন্তু উপরের লুপের ভিতরের শর্ত সত্য হবে তাই প্রিন্ট করবে  সংখ্যাটি কত তম পজিশনে পাওয়া গেছে।   
কারণটা নিজেই বোঝার চেস্টা করো। আমি আর ব্যাখ্যা করছি না। 

HaPpY cOdInG :)       
   

অ্যারের যোগ [Find the sum of all elements]


আমরা অ্যারে ইনপুট এবং আউটপুট দেখেছি। এখন আমরা দেখবো কি করে একটা অ্যারের সবগুলা উপাদান যোগ করতে হয়।

অ্যারের সবগুলা উপাদান যোগ করার প্রোগ্রাম:


#include<stdio.h>
int main()
{
    int num[100],i,n,sum=0;
 
    printf("Enter the size of array:\n");
    scanf("%d",&n);
    printf("Enter %d numbers:\n",n);
    for(i=0; i<n;i++)
    {
        scanf("%d",& num[i]);
     
        sum=sum+num[i];
    }
    printf("Sum of all elements are:%d\n",sum);
    return 0;
}



নমূনা ইনপুট:
5
1 2 3 4 5

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

15.

বিস্তারিত:
মনেকরি, ইউজার ৫ টি সংখ্যা ইনপুট দিয়েছেন। আমাদের কাজ হলো ৫ টি সংখ্যার যোগফল দেখানো।
উপরের নমূনা ইনপুটে 1 2 3 4 5
দেওয়া হয়েছে। তাই আউটপুট হবে,
1+2+3+4+5=15।


- [ ] প্রথমে আমরা ভেরিয়েবল ডেক্লিয়ার করেছি। আশাকরি তা বোঝতে পারছো।num[100] নামের অ্যারে তে আমরা অ্যারের সাইজ 100 দিয়েছি। আমরা চাইলে অন্য যেকোন সংখ্যা দিতে পারি। তবে, 100 দেওয়ার কারণে যে, আমাদের 100 টি সংখ্যাই নিতে হবে ব্যপারটি এমন না। আমরা সর্বোচ্ছ ১০০ টি সংখ্যা নিয়ে কাজ করতে পারবো। এখন আমরা ১০০ এর কম যতটি সংখ্যা ইচ্ছা তা নিতে পারি। কিন্তু ১০০ এর বেশি সংখ্যা নিয়ে কাজ করতে হলে আমাদের অ্যারের সাইজ বাড়াতে হবে।

- [ ] একটি বিষয় পরিষ্কার করা ভালো। আমরা মোট ১০০ টি সংখ্যা নিয়ে কাজ করতে পারবো এর মানে হলো আমাদের অ্যারেতে সর্বোচ্ছ ১০০ টি সংখ্যা রাখা যাবে। তবে যে সংখ্যাগুলো রাখবো তা ১০০ এর মধ্যে থাকতে হবে এমন কোন কথা নেই। আমরা চাইলে 400,900,12000,99999 রাখতে পারি।

- [ ] যেহেতু আমরা ইন্টিজার অ্যারে ডেক্লিয়ার করেছি তাই আমরা ইন্টিজার ভেরিয়েবলে যত বড় সংখ্যা রাখতে পারি অ্যারের প্রতিটা ইন্ডেক্স এ ততো বড় সংখ্যা রাখতে পারবো।


এবার দেখা যাক প্রোগ্রাম কিভাবে কাজ করছে:
1. আমরা প্রথমে ইউজারের কাছ থেকে ইনপুট নিয়েছি,কতটি সংখ্যা যোগ করতে হবে।
2. তারপর আমরা লুপের সাহায্যে n  সংখ্যক সংখ্যা ইনপুট নিয়েছি। ধরি ইউজার 5 ইনপুট দিয়েছেন।
3. প্রথমে লুপে i=0, তাই যে সংখ্যা টি ইনপুট নিবো তা অ্যারের 0 তম ইনডেক্স এ বসবে। মানে num[0] তে।
4. আমাদের sum = 0 ছিলো। একটি সংখ্যা ইনপুট নেওয়ার পর আমরা sum এর সাথে সংখ্যাটি যোগ করছি। তাই, ধরে নেই প্রথম সংখ্যাটি 1. তাই, sum=sum+num[i] হওয়ার পর sum=0+1 বা sum=1.
5. তারপর i++ এ যাওয়ার পর i=1. তাই এবার যে সংখ্যা ইনপুট নিবো তা num[1] এ বসবে।ধরি এবার ইউজার 2 ইনপুট দিয়েছেন। এরপর sum=sum+num[i] হবে। যেহেতু sum এর মান 1. এর সাথে 2 যোগ হবে। তাহলে sum=3.
6. তারপর i++ এ যাওয়ার পর i=2. তাই এবার যে সংখ্যা ইনপুট নিবো তা num[2] এ বসবে।ধরি এবার ইউজার 3 ইনপুট দিয়েছেন। এরপর sum=sum+num[i] হবে। যেহেতু sum এর মান 3. এর সাথে 3 যোগ হবে। তাহলে sum=6.
7. তারপর i++ এ যাওয়ার পর i=3. তাই এবার যে সংখ্যা ইনপুট নিবো তা num[3] এ বসবে।ধরি এবার ইউজার 4 ইনপুট দিয়েছেন। এরপর sum=sum+num[i] হবে। যেহেতু sum এর মান 6. এর সাথে 4 যোগ হবে। তাহলে sum=10.
8. তারপর i++ এ যাওয়ার পর i=4. তাই এবার যে সংখ্যা ইনপুট নিবো তা num[4] এ বসবে।ধরি এবার ইউজার 5 ইনপুট দিয়েছেন। এরপর sum=sum+num[i] হবে। যেহেতু sum এর মান 10. এর সাথে 5 যোগ হবে। তাহলে sum=15.
9. আমরা ধরে নিয়েছিলাম n = 5. এখানে আমাদের লুপের ব্রেকিং কন্ডিশন i<n. যেহেতু i=4 এবং i++ হওয়ার পর  তা 5 হবে তখন  i<n শর্তটি মিথ্যা হয়ে যাবে। তাই,কম্পাইলার লুপ থেকে বের হয়ে যাবে।
10. এবার কম্পাইলার দেখবে  printf("Sum of all elements are:%d\n",sum);    তাই sum এর মান প্রিন্ট করবে। যেহেতু sum এর মান 15. তাই আউটপুট আসবে Sum of all elements are:15 
না বোঝলে অবশ্যই কমেন্টে জানাবেন ।

Monday, 2 October 2017

সায়েন্স ফিকশনঃ রহস্যভেদ

প্রতিদিনের মতো ট্রেনিং এ যাবার জন্য রবো শিপ থেকে বের হলো গ্রে বট। সে এখন লেভেল থি ক্যাটাগরির রোবট। তার মতো আরো হাজার খানেক রবোট রয়েছে লেভেল থ্রি ক্যাটাগরির। রোবটদেরকে বিভিন্ন শ্রেণিতে ভাগ করে দিয়েছে পৃথিবীর মানুষ। কাজের দক্ষতার উপর ভিত্তি করে এসব ক্যাটাগরি নির্ধারণ করা হয়েছে। প্রথম ক্যাটাগরির রবোটরা হলো সবচেয়ে বেশি ক্ষমতা সম্পন্ন। এদের দিয়ে গবেষণা,প্রতিরক্ষার এবং নানান ধরনের ঝুকিপুর্ণ পরীক্ষার প্রধান কাজগুলো করানো হয়।
এই তো বেশকিছু দিন আগে প্রোহান্টকে  নিউ-ট্রি তে পাঠানো হয়। নিউ ট্রি হলো নতুন আবিষ্কৃত একটি গ্রহ। মানুষের ধারণা এখানে  অন্য কোন প্রাণিদের অস্তিত্ব রয়েছে। গ্রহটির অবস্থান সূর্যের খুব কাছাকাছি। প্রোহান্ট সে যাত্রায় বেশকিছু গুরুত্বপুর্ণ এবং চাঞ্চল্যকর তথ্য নিয়ে এসেছে।
প্রোহান্ট এর অবস্থান বরাবর নাকি আলোর বেগে একধরণের আলোক রশ্নি ছোটে আসে।মাত্র ০.০১ মিলিসেকন্ড সময়ের ব্যবধানে নিজেকে সরিয়ে নেয় প্রোহান্ট। তারজায়গায় লেভেল সিক্স এর কোন রোবট থাকলে এতদ্রুত আত্নরক্ষা করতে পারতো না। হয় তো মারাত্নক ক্ষতিগ্রস্ত হতো। ঠিক কি কারণে এই রশ্নি এসেছে তা এখনো জানা যায় নি। তবে মনেকরা হচ্ছে নিউ ট্রি গ্রহের চারপাশে রয়েছে অদৃশ্য সয়ংক্রিয় প্রতিরক্ষা ব্যবস্থা। বেশকিছু আলামত থেকে এই সিধান্তে উপনীত হয়েছে মহাকাশ গবেষণার কাজে নিয়োজিত লেভেল ওয়ান ক্যাটাগরির রোবটরা। তবে, এ আলামতগুলো সম্পর্কে জানতে পারে নি গ্রে বট। তার কারণ হচ্ছে নিরাপত্তার সার্থে সবার কাছে আলামতগুলো প্রকাশ করা হয় নি।


গ্রে বট এর খুব ইচ্ছা করে সে লেভেলে ওয়ান ক্যাটাগরির রোবট হবে। নিউ ট্রি গ্রহের রহস্য ভেদ করবে সে। তারজন্য সে নিয়িমিত গুরুত্ব দিয়ে ট্রেনিং করছে। তথ্য ভান্ডার থেকে সে জেনেছে আগেকার দিনের রোবটরা নিজেদের ইন্টেলিজেন্স বাড়াতে পারতো না। তাকে যেভাবে তৈরী করা হয়েছে সেভাবেই কাজ করতো। কিন্তু আর্টিফিশিয়াল ইন্টিলিজেন্স এর অনেক উন্নতি হয়েছে। এখন রোবটদের এমনভাবে তৈরি করা হয় যেন নিজেই তার সীমাব্ধতা বোঝতে পারে এবং তা কাটিয়ে উঠতে পারে।
একটা বিশেষ মিটার যুক্তকরে দেওয়া হয় সবগুলা রোবটের সাথে। এতে  ইন্টেলিজেন্সের উপর ভিত্তি করে ক্যাটাগরি আপডেট হয়। এই তো গ্রেবটকে তৈরি করা হয়েছিল শুধুমাত্র ছোট খাটো কাজ করানোর জন্য। তখন সে লেভেল ফোর ক্যাটগরিতে ছিল। তার আগের এরর গুলো সে নিজে ফিক্স করে ফেলে। তারপর নিয়মিত ট্রেনিং এ যায়, ট্রেনিং এর বিষয় এনালাইজড করে তার নিজের মধ্যে প্রয়োগ ঘটায়। এভাবে তার ক্যাটাগরি এখন লেভেল থ্রি তে। হয় তো আরো কিছুদিন পর লেভেল টু তারপর লেভেল ওয়ান এ পৌছে যাবে। তারপর ভেদ করবে নিউ ট্রি গ্রহের রহস্য।  

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

 আচমকা একটা শব্দ হলো। অনেকটা ওয়ার্নিং মেসেজ এ যেরকম শব্দ হয়।  আরে এ তো হিক্যাপ।
আকাশের দিকে থাকিয়ে আছে। হ্যা, উপরে কিছু একটা উড়ছে, আর সেই শব্দ টা এর থেকেই আসছে। হিক্যাপ লেভেল টু এর রোবট। গ্রে বট হিক্যাপ কে জিজ্ঞেস করার আগেই হিক্যাপ রিড করে নিলো গ্রেবট এর প্রশ্ন। হিক্যাপ বলতে লাগলো - হ্যালী হচ্ছে একধনের যন্ত্র যেটা কোন চালক ছাড়াই উড়ে। প্রচন্ড রকম আর্টিফিশিয়ার ইন্টেলিজেন্স দেওয়া হয়েছে একে। কোন জায়গায় কত কোণে উড়তে  হবে, কত উপরে উড়তে হবে সব বোঝেও । তবে এখন এর থেকে ওয়ারনিং ম্যাসেজ আসছে। মনে হয় সিস্টেম ঠিক মতো কাজ করছে না। এটি তৈরির সময় নিজে কাজ করেছে হিক্যাপ।
তাই সে রিড করতে চেস্টা করলো সমস্যা কোথায়। না ! সে তো কোন সমস্যা আন্দাজ করতে পারছে না।  এবার একটি স্পস্ট ম্যসেজ আসলো হ্যালী নামক যন্ত্র থেকে "লেজার এর বিকিরণ হচ্ছে উপর থেকে" ভাবতে থাকে গ্রে বট তাহলে কি এই একই আলোক রশ্নি  প্রোহান্ট কে আক্রমণ করেছিল? রহস্যভেদ করতে চায় গ্রে বট।

চলবে............ 

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++)

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