Sunday, January 31, 2016

অ্যারে




                                            অ্যারে-০১
ভাইয়া,আজ আমরা অ্যারে শিখবো।
Array কি? হুম,এই প্রশ্নের উত্তর দরকার প্রথম। তাহোলে,উত্তর শোনো। ধরো, তোমার কাছে দশটা পাকা আম আছে। এখন এই দশটা আম তুমি ঝুড়িতে রাখতে চাইছো। অবশ্যই তুমি দশটি আমের জন্যে দশটি ঝুড়ি ব্যবহার করতে চাইবেনা। বরং একটি ঝুড়িতেই আমগুলোকে একসাথে রাখার জন্যে চেষ্টা করবে। আমাদের array ভাইয়া কিন্তু ঠিক এই ঝুড়ির মত! অবাক লাগছে! না,অবাক হওয়ার কিছুই নাই। বুঝিয়ে দিচ্ছি।ধরো,তুমি ১থেকে ১০পর্যন্ত প্রিন্ট করবে। এক্ষেত্রে তুমি এভাবে ১থেকে ১০পর্যন্ত ভ্যালুগুলো রাখলে-
int a=1;
int b=2;
int c=3;
int d=4;
int e=5;
int f=6;
int f=7;
int g=8;
int h=9;
int i=10;
এখানে তুমি দশটা ভ্যারিয়েবল ব্যবহার করেছো ১থেকে ১০পর্যন্ত ভ্যালু রাখার জন্যে। এখানে a,b,c,d,e,f,g,h,i হচ্ছে তোমার ঝুড়ি,আর 1,2,3,4,5,6,7,8,9,10 হলো তোমার এক একটা আম।
এখন তুমি এই দশটা ঝুড়ির আমকে যদি প্রিন্ট করতে চাও নিম্নোক্ত উপায়ে,তবে তা সময়সাপেক্ষ এবং মেজাজ গরমের একটা বিষয় হয়ে দাঁড়াবে।
printf(“%d\n”,a);
printf(“%d\n”,b);
printf(“%d\n”,c);
printf(“%d\n”,d);
printf(“%d\n”,e);
printf(“%d\n”,f);
printf(“%d\n”,g);
printf(“%d\n”,h);
printf(“%d\n”,i);
এইখানে একটা বিষয় খেয়াল করো যে,প্রতিক্ষেত্রে তুমি দশটি variable এবং দশটি printf ফাংশন ইউজ করেছো।
কি?? মনে হচ্ছে,আমি কি বলি! আচ্ছা,যদি তোমাকে বলি যে ভাইয়া,আমাকে ১থেকে ১০০০০০পর্যন্ত প্রিন্ট করে দেখাবে,যেখানে প্রতিটি মান মেমোরিতে সিকুয়েনশিয়ালি আলাদা জায়গায় থাকবে! তুমি কি উপরের মত করে ১ থেকে ১০০০০০পর্যন্ত ভ্যালু গুলা এক একটা ভ্যারিয়েবল ডিক্লেয়ার করে তাতে অ্যাসাইন করবে??তাহোলে তোমার কত সময় লাগবে তুমি আন্দাজ করতে পারতেছো??আর এইভাবে ভ্যারিয়েবল ডিক্লেয়ার করতে করতে তো তুমি হয়রান হয়েই যাবা!
আচ্ছা,তাহোলে উপায় কি??হুম,উপায় আছে।

#include<stdio.h>

int main()
{
          int a[10];
int i;
for(i=0;i<10;i++)
{
          scanf(“%d”,&a[i]);
}
for(i=0;i<10;i++)
{
          printf(“%d  “,a[i]);
}
return 0;
}

উপরের কোড পুরাপুরি কপি পেস্ট করে রান করে দেখো যে উপরে আমরা যে দশটা ভ্যারিয়েবল ডিক্লেয়ার করে ১থেকে ১০পর্যন্ত ভ্যালুগুলা রেখে পরে আবার সেই দশটা ভ্যালুই প্রিন্ট করেছি ,সেই একই কাজ আমরা এখানে করেছি মাত্র ৪টি লাইন ব্যবহার করেই। মজার কিন্তু বিষয়টা! তবে a[10] কে কেমন আজব টাইপ লাগছে,না! অ্যারে ডিল্কেয়ার করতে হয় এভাবে-

data_type   vaiable_name[size];

int                                           a[10];
int a[10] মানে হচ্ছে ,তুমি ১০টা ইন্টেজার টাইপের ড্যাটা রাখতে চাইছো যেখানে a[0] মেমোরিতে যে জায়গা দখল করেছে,তার থেকে পরবর্তি ৪০বাইট জায়গা ৪বাইট করে দখল করে আছে যথাক্রমে a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]
ধরো যে,মেমোরির যে জায়গায় a[0] আছে,সেটা হলো 100াহলে দেখে নাও যে,এরা মেমোরিতে কিভাবে সিকুয়েনশিয়ালি জায়গা অ্যালোকেট করে-
100+(0*4)
100+(1*4)
100+(2*4)
100+(3*4)
100+(4*4)
100+(5*4)
100+(6*4)
100+(7*4)
100+(8*4)
100+(9*4)
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
a[9]

একটা জিনিস পরিষ্কার হওয়া যাক। যেকোনো অ্যারের 0তম ইনডেক্সের অ্যাড্রেস হলো ঐ অ্যারের বেস অ্যাড্রেসআর একটা বিষয় হলো,যেকোনো অ্যারের ইনডেক্স 0থেকে (n-1)পর্যন্ত হয় যেখানে n হলো অ্যারেটির সাইজএখানে,n এর মান যেকোনো ধনাত্বক পূর্ণসংখ্যা যেখানে n>0অনেকেই হয়তো বলতেছো যে,ইন্ডেক্স আবার কি?? ইনডেক্স মানে সূচিপত্র। আমাদের বইতে খেয়াল করলে দেখবে যে এরকম লেখা থাকে যে,বইয়ের ২৩তম পৃষ্ঠায় একটি গল্প আছে।অ্যারের ইনডেক্স ঠিক তেমন। a[5]=25; এখানে, অ্যারে ভ্যারিয়েবলটি হলো a যাকে তুমি তোমার বই হিসেবে ধরো,আর 5কে তোমার বইয়ের পৃষ্ঠা হিসেবে ধরে নাও।আর 25কে ধরে নাও তোমার বইয়ের সেই গল্পটাকে। তাহোলে,এক্ষেত্রে পুরো বিষয়টি হচ্ছে,যেকোনো অ্যারে ভ্যারিয়েবলের ইনডেক্স এর মাধ্যমে আমরা অ্যারের কততম পজিশনে কোন ভ্যালু আছে তা জানতে পারি।
 আচ্ছা,এখন তোমার মনে হতে পারে যে কিভাবে আমরা অ্যারের iতম ইনডেক্সের মান বের করবো। আমরা নিচের ফর্মুলা ব্যবহার করে অ্যারের iতম ইনডেক্সের অ্যাড্রেস জানতে পারি।
a[i]=base address + (i*size of data type);
i=0,1,2,3,4,5,6,7,……
এই ছিলো অ্যারের সিম্পল সব ধারণা।
এখন, অ্যারে নিয়ে কিছু প্রশ্নের উত্তর দেখোঃ
১। অ্যারের সাইজ যত,তোমার অ্যারের ইনডেক্সের মান যখন তত হবে,তখন তুমি যদি ঐ পজিশনে কোনো ভ্যালু অ্যাসাইন করো তাহলে দেখবা যে পুরা অ্যারে প্রিন্ট করলে শেষেরটি উলটাপালটা ভ্যালু প্রদর্শন করবে।
 
#include<stdio.h>

int main()
{
int a[5],i=0;
for( i=0;i<=5;i++)
          scanf(“%d”,&a[i]);
for(i=0;i<=5;i++)
          printf(“%d  “,a[i]);
return 0;
}
অর্থাৎ,তুমি যদি অ্যারের সাইজ দাও 5,তাহলে তুমি ৫টি ভ্যালু ঐ অ্যারেতে নিতে পারবে যাদের ইনডেক্স যথাক্রমে 0,1,2,3,4.
২। অ্যারেতে কি ভ্যারিয়েবল ডিক্লেয়ারেশনের সময় ভ্যালু অ্যাসাইন করা যাবে? উওর হলো হ্যা,যাবে। 

#include<stdio.h>

int main()
{
int a[5]={100,200,300,400,500},i=0;
for(i=0;i<=5;i++)
          printf(“%d  “,a[i]);
return 0;
}

এখানে,a[0]=100,a[1]=200,a[2]=300,a[3]=400,a[4]=500
অর্থাৎ, আমরা কাজটি করবো এভাবে,
ড্যাটা_টাইপ    অ্যারে_ভেরিয়েবল[অ্যারের সাইজ]={ সাইজ যা,ঠিক ততগুলা ভ্যালু কমা দ্বারা পৃথক করে এখানে লিখতে হবে যা অ্যারেতে সিকুয়েনশিয়ালি অ্যাসাইন হবে};
এখানে,আরো একটি বিষয় দেখো নিচের কোড দেখে,

#include<stdio.h>
int main()
{
int a[5],i=0;
a[5]={100,200,300,400,500};///তুমি এভাবেও অ্যারেতে যেকোনো সময় ভ্যালু অ্যাসাইন করতে পারবা।
for(i=0;i<=5;i++)
          printf(“%d  “,a[i]);
 
a[4]=400;///অ্যারের a[4] এর পূর্বের ভ্যালু 500এর জায়গায় এখন 400 রিপ্লেস হবে 

for(i=0;i<5;i++)
         printf(“a[%d]=%d\n”,i,a[i]);///এবার প্রিন্ট করলে দেখবা যে,a[4] এর মানও 400এভাবে প্রয়োজন অনুসারে যেকোনো সময় অ্যারের যেকোনো ইনডেক্সের ভ্যালু চেঞ্জ করতে পারো।
return 0;

}

৩। একটি অ্যারে ভেরিয়েবলের মাধ্যমে কি বিভিন্ন ড্যাটা টাইপের ভ্যালু নিয়ে কাজ করা যায়?? উত্তর হলো,না। তোমার অ্যারে ভেরিয়েবলটির ড্যাটা টাইপ যেটা,তোমাকে ঠিক সেই টাইপের ড্যাটাই নিতে হবে ঐ অ্যারেটির জন্যে।
int a[5];
এখানে তুমি integer type এর ড্যাটা নিতে পারবা শুধু। আবার যদি int এর জায়গায় float নাও,তাহোলে শুধু float type এর ড্যাটা নিতে পারবা অ্যারেটিতে।
 আজ এপর্যন্ত। পরবর্তি পর্বে,আরো বিস্তারিত আলোচনা করা হবে।

Saturday, January 30, 2016

UVA-10038

প্রবলেমটি পড়ুন এবং বুঝুন

#include<iostream>
#include<cmath>

using namespace std;

void jolly(int a[],int n)
{
    int b[n],i,j=0,k,d;

    for(i=1,j=0;i<n;i++,j++)
    {
        d=abs(a[i-1]-a[i]);
        if(d>0 && d<n)
        {
            for(k=0;k<j;k++)
            {
                if(d==b[k])
                {
                    i=n;
                    break;
                }
            }
            if(k==j)
                b[j]=d;
        }

        else
            break;
    }

    if(i==n)
        cout<<"Jolly\n";
    else
        cout<<"Not jolly\n";
}

int main()
{
    int n;

    while(cin>>n)
    {
        int a[n];
        for(int i=0;i<n;i++)
            cin>>a[i];

        jolly(a,n);
    }

    return 0;
}

Friday, January 29, 2016

UVA-494

প্রবলেমটি পড়ুন এবং বুঝুন

#include<iostream>
#include<cstdlib>
#include<string>

using namespace std;

void loop(char *ch)
{
    int i=0,counter=0;
    while(ch[i]!=NULL)
    {
        if((ch[i]>=65 && ch[i]<=90)|| (ch[i]>=97 && ch[i]<=122))
        {
            for(;(((ch[i]>=65 && ch[i]<=90)|| (ch[i]>=97 && ch[i]<=122)) &&(ch[i]!='\n'));i++);
                counter++;
        }
        else
            i++;
    }
    cout<<counter<<endl;
}

int main()
{
    string str;
    while(getline(cin,str))
    {
        loop(&str[0]);
    }
    return 0;
}

লিংক

Codeforces Round #340 (Div. 2)

প্রবলেমটি পড়ুন এবং বুঝুন 

#include<stdio.h>

int main()
{
    long long int a;
    while((scanf("%lld",&a))==1)
    {
        int remain;
        remain=a%5;
        a=a/5;
        if(remain==0)
            printf("%lld\n",a);
        else
            printf("%lld\n",a+1);
    }
    return 0;
}

UVA-10591

প্রবলেমটি পড়ুন এবং বুঝুন 


 #include<iostream>

using namespace std;

int happy(long long int a)
{
    long long int sum=0;
    int remain;

    for(; a!=0;)
    {
        remain=a%10;
        sum=sum+remain*remain;
        a/=10;
    }

    if(sum<10)
    {
        if(sum==1)
            return 1;
        else
            return 0;
    }

    happy(sum);

}

int main()
{
   unsigned long long int test,i=0,a;
    cin>>test;
    int t;

    while(test--)
    {
        i++;
        cin>>a;
        t=happy(a);
        if(t==1)
            cout<<"Case #"<<i<<": "<<a<<" is a Happy number."<<endl;
        else
            cout<<"Case #"<<i<<": "<<a<<" is an Unhappy number."<<endl;
    }
    return 0;
}