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;
}

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











Monday, 9 October 2017

বাবল সর্ট (bubble sort)

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

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

তবে, বাবল সর্ট দিয়ে যে ছোট থেকে বড় আকারে সাজাতে হবে এমন কোন কথা নেই। আমরা চাইল বড় থেকে ছোট আকারে সাজাতে পারি।

ধরা যাক আমাদের , 29 10 14 37 13 এই পাঁচটি সংখ্যা দেওয়া আছে।

আমরা ছোট থেকে বড় আকারে সাজালে দাঁড়ায় -  10  13  14  29  37
আর বড় থেকে ছোট আকারে সাজালে দাঁড়ায় -     37  29  14  13  10

সাধারণত সর্টিং বলতে আমরা বোঝবো আমাদের ছোট থকে বড় আকারে সাজাতে হবে। বড় থেকে ছোট সাজাতে হলে সাধারণত সমস্যায়  বলে দেওয়া থাকে।

আর কথা না বাড়িয়ে তাহলে কাজে নেমে পড়িঃ

আমরা 29 10 14 37 13 কে ছোট থেকে বড় অনুসারে সাজাবো।

তারজন্য আমরা নেস্টেড ফর লুপ ব্যবহার করবো।


#include<stdio.h>
int main()
{
    int a[5]={29,10,14,37,13};
    int i,j,temp,n=5;

    printf("Array's elements are:\n");
    for(i=0;i<n;i++)
    {
        printf("%d\t",a[i]);
    }
    for(i=0;i<n;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(a[i]>a[j])
            {
                temp=a[i];
                a[i]=a[j];
                a[j]=temp;
            }
        }
    }
    printf("\nAfter sorted:\n");
    for(i=0;i<n;i++)
    {
        printf("%d\t",a[i]);
    }
    return 0;

}

কোডটি বোঝানোর সুবিধার্তে আমি array এর মান ঠিক করে দিয়েছি। এবং n=5 করে দিয়েছি। তোমরা চাইলে স্কেন নিয়ে কাজটি করতে পারো।

বাইরের লুপে আমরা i=0 দিয়েছি এবং i<n পর্যন্ত লুপ চালিয়েছি,
ভিতরের লুপে j=i+1 দিয়েছি। যেহেতু i=0 , তাই j=0+1 বা 1.

এরপর আমরা একটা শর্ত দিয়েছি যে, যদি a[i]>a[j] হয় তাহলে
a[i] এবং a[j] এর স্থান অদল বদল হবে। এর একটা নাম আছে swap.
যদি swap এর বিষয় ক্লিয়ার না থাকে তাহলে এখানে দেখতে পারো ।
এবার , আমাদের উপরের অ্যারেতে a[i] = a[0] যেহেতু i এর মান 0.
a[0] তে আছে 29.
আবার, a[j] = a[1] . যেহেতু j এর ,মান 1.
a[j] তে আছে 10.

তাহলে if এর ভিতরে দেওয়া শর্তটি সত্য। কারণ , 29>10
তাই 29 এবং 10 এর স্থান পরিবর্তন হবে।

এই মুহূর্তে আমাদের অ্যারেটি দেখতে

10 29 14 37 13

এখন j++  হবে।

j=1 থেকে এক বেড়ে 2 হবে।
এখন আমাদের i = 0 এবং  j=2.
তাই a[i]  = 10 ( কারণ i=0 এবং 0 তম পজিশনে আছে 10)
এবং a[j] = 14( কারণ j=2 এবং 2 তম পজিশনে আছে 14)

এখন আবার if( a[i]>a[j]) চেক করবে। এখন শর্ত মিথ্যা। তাই if এর ভিতরে কোন কাজ হবে না। সরাসরি j++ এ চলে যাবে।

j=2 থেকে এক বেড়ে 3 হবে।
এখন আমাদের i = 0 এবং  j=3.
তাই a[i]  = 10 ( কারণ i=0 এবং 0 তম পজিশনে আছে 10)
এবং a[j] = 37( কারণ j=3 এবং 3 তম পজিশনে আছে 37)

এখন আবার if( a[i]>a[j]) চেক করবে। 10>37 শর্তটি  মিথ্যা। তাই if এর ভিতরে কোন কাজ হবে না। সরাসরি j++ এ চলে যাবে। 
j=3 থেকে এক বেড়ে 4 হবে।
এখন আমাদের i = 0 এবং  j=4.
তাই a[i]  = 10 ( কারণ i=0 এবং 0 তম পজিশনে আছে 10)
এবং a[j] = 13( কারণ j=4 এবং 4 তম পজিশনে আছে 13)

এখন আবার if( a[i]>a[j]) চেক করবে। 10>13 শর্তটি  মিথ্যা। তাই if এর ভিতরে কোন কাজ হবে না। সরাসরি j++ এ চলে যাবে।
j++ হওয়ার পর j=5 তাই j<n শর্তটি মিথ্যা। কারণ n=5. সুতরাং i++ এ চলে যাবে।

এখন i = 1.
j = i+1 বা 2.
a[i] = a[1] যেহেতু i এর মান 1.
a[2] তে আছে 29.
আবার, a[j] = a[2] . যেহেতু j এর ,মান 2.
a[j] তে আছে 14.

সুতরাং if এর ভিতরে দেওয়া শর্তটি সত্য। কারণ , 29>14
তাই 29 এবং 14 এর স্থান পরিবর্তন হবে।

এই মুহূর্তে আমাদের অ্যারেটি দেখতে

10 14 29 37 13

এখন j++  হবে।

j=2 থেকে এক বেড়ে 3 হবে।
এখন আমাদের i = 1 এবং  j=3.
তাই a[i]  = 14 ( কারণ i=1 এবং 1 তম পজিশনে আছে 14)
এবং a[j] = 37( কারণ j=3 এবং 3 তম পজিশনে আছে 37)

এখন আবার if( a[i]>a[j]) চেক করবে। এখন শর্ত মিথ্যা। কারণ 14>37 নয়।  তাই if এর ভিতরে কোন কাজ হবে না। সরাসরি j++ এ চলে যাবে। 
j=3 থেকে এক বেড়ে 4 হবে।
এখন আমাদের i = 1 এবং  j=4.
তাই a[i]  = 14 ( কারণ i=1 এবং 1 তম পজিশনে আছে 14)
এবং a[j] = 13( কারণ j=4 এবং 4 তম পজিশনে আছে 13)

এখন আবার if( a[i]>a[j]) চেক করবে। 14>13 শর্তটি  সত্য। তাই 14 এবং 13 এর স্থান অদল বদল হবে।
এখন আমাদের অ্যারেটি দেখতে এরকমঃ
10 13 29 37 14
j=4 থেকে এক বেড়ে 5 হবে।
j++ হওয়ার পর j=5 তাই j<n শর্তটি মিথ্যা। কারণ n=5. সুতরাং i++ এ চলে যাবে।
এখন i = 2.
j = i+1 বা 3.
a[i] = a[2] যেহেতু i এর মান 2.
a[2] তে আছে 29.
আবার, a[j] = a[3] . যেহেতু j এর ,মান 3.
a[j] তে আছে 37.

সুতরাং if এর ভিতরে দেওয়া শর্তটি মিথ্যা কারণ , 37>29
j++ হবে।
j=3 থেকে এক বেড়ে 4 হবে।
এখন আমাদের i = 2 এবং  j=4.
তাই a[i]  = 29 ( কারণ i=2 এবং 2 তম পজিশনে আছে 29)
এবং a[j] = 14( কারণ j=4 এবং 4 তম পজিশনে আছে 14)

এখন আবার if( a[i]>a[j]) চেক করবে। এখন শর্ত সত্য কারণ 29>14 ।  তাই 29 এবং14 এর স্থান অদল বদল হবে।
আমাদের অ্যারেটি এখনঃ

10 13 14 37 29

 এরপর  j++ এ চলে যাবে। 
j++ হওয়ার পর j=5 তাই j<n শর্তটি মিথ্যা। কারণ n=5. সুতরাং i++ এ চলে যাবে।
এখন i = 3.
j = i+1 বা 4.
a[i] = a[3] যেহেতু i এর মান 3.
a[2] তে আছে 37.
আবার, a[j] = a[4] . যেহেতু j এর ,মান 4.
a[j] তে আছে 29.
  
এখন আবার if( a[i]>a[j]) চেক করবে। এখন শর্ত সত্য কারণ 37>29 ।  তাই 37 এবং29 এর স্থান অদল বদল হবে।
আমাদের অ্যারেটি এখনঃ

10 13 14 29 37

 এরপর  j++ এ চলে যাবে। 
j++ হওয়ার পর j=5 তাই j<n শর্তটি মিথ্যা। কারণ n=5. সুতরাং i++ এ চলে যাবে।

এখন i = 4. 
j = i+1 বা 5.
  
যেহেতু n=5 এবং j=5 তাই j<n শর্তটি মিথ্যা। তাই এই লুপ থেকে বের হয়ে i++ এ চলে যাবে। এবার i++
হবে। এখন i=5 তাই, i<n শর্তটি ও মিথ্যা।
সুতরাং বাইরের লুপ থেকেও কম্পাইলার বের হয়ে আসবে তারপর
আমাদের সর্টেড অ্যারে প্রিন্ট করবে। আমাদের আউটপুট হবে

10 13 14 29 37.

আমরা সফলভাবে আমাদের কাজটি করতে পেরেছি।

তোমরা লক্ষ্য করলে দেখবে যখন i=3 তখনই আমাদের অ্যারে সর্টেড হয়ে গিয়েছিল। তাই আর i=4 এ চেক না করলেও চলবে। এবং আরেকটি ব্যাপার হলো যখন i=4 তখন j=5. তাই কোন কাজই এখানে হবে।
সুতরাং আমরা আমাদের কোড এর বাইরের লুপটা i<n পর্যন্ত না চালিয়ে i<n-1 পর্যন্ত চালালেই কাজ ভালোভাবে হবে।
কোডটা দেখে নেইঃ

   #include<stdio.h>
int main()
{
    int a[5]={29,10,14,37,13};
    int i,j,temp,n=5;

    printf("Array's elements are:\n");
    for(i=0;i<n;i++)
    {
        printf("%d\t",a[i]);
    }
    for(i=0;i<n-1;i++)
    {
        for(j=i+1;j<n;j++)
        {
            if(a[i]>a[j])
            {
                temp=a[i];
                a[i]=a[j];
                a[j]=temp;
            }
        }
    }
    printf("\nAfter sorted:\n");
    for(i=0;i<n;i++)
    {
        printf("%d\t",a[i]);
    }
    return 0;

}


happy coding :)

Saturday, 7 October 2017

ওরা শুধু বাঁচতে চায়!

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

ওরা স্বপ্ন দেখে দিন শেষে দু মুটো ভাতের আর কাচা লঙ্কার। তাতে ওরা যা তৃপ্তি পায় পাঁচ তারকা হোটেলের বিলাসবহুল ভোজনে  সেই তৃপ্তি নেই।

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

বিদ্রঃ ইহা একটি প্রতিবাদী লেখাঃ

ছবি কথা বলে!






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