সি প্রোগ্রামিংঃ স্ট্রাকচার – struct

আমরা ডেটা টাইপ সম্পর্কে জানি, int, char, float ইত্যাদি। Structures দিয়ে আমরা নিজেদের মত করে ডেটা স্ট্রাকচার তৈরি করে নিতে পারি। যেমন অ্যারে হচ্ছে একটা ডেটা স্ট্র্যাকচার। যেখানে শুধু আমরা একই ডেটা টাইপ এর ডেটা রাখতে পারি। কিন্তু স্ট্র্যাকচার তৈরি করে আমরা এক সাথে int, char, float ইত্যাদি ভিন্ন ভিন্ন ডেটা এক সাথে রাখতে পারি। Structures ব্যবহার করে আমরা নিজেদের মত করে ডেটা স্ট্রাকচার তৈরি করতে পারব। এবং ঐখানে ইচ্ছে মত একের অধিক ভিন্ন ভিন্ন ডেটা রাখতে পারব।

 স্ট্র্যাকচার ডিফাইন করা

স্ট্র্যাকচার ব্যবহার আগে তা ডিফাইন করতে হয়। স্ট্র্যাকচার নিচের মত করে ডিফাইন করা হয়।

struct name
{
	member 1;
	member 2;
	…
	member n;
}; 

struct কীওয়ার্ড দিয়ে Structures ডিফাইন করা হয়। এরপর এর মেম্বার গুলো লিখতে হয়। মেম্বার বলতে কি কি ডেটা থাকবে। যেমন book নামে একটা স্ট্র্যাকচারঃ

struct book
{
    int id;
    char name;
}; 

আমাদের স্ট্র্যাকচারটির নাম দিয়েছি book, যা হচ্ছে আমাদের নিজস্ব স্ট্র্যাকচারের নাম। এরপর দ্বিতীয় ব্র্যাকেটের মধ্যে স্ট্র্যাকচারের মেম্বার গুলো।

এখানে একটা মেম্বার হচ্ছে ইন্টিজার, যেখানে আমরা বই এর ক্রমিক নাম্বার রাখব। আরেকটা হচ্ছে কারেকটার, যেখানে আমরা বইটির নাম রাখব।

স্ট্র্যাকচার ডিক্লারেশন

Structures ডিফাইন করার পর তা ব্যবহার করার জন্য ডিক্লেয়ার করতে হয়। একটা ইন্টিজার ভ্যারিয়েবল ব্যবহারের জন্য যেমন আগে তা ডিক্লেয়ার করতে হয়, তেমনি।
ডিক্লেয়ার করার জন্য নিচের মত করে লিখতে হয়ঃ
struct book myBook;
যেখানে struct দিয়ে বুঝায় আমরা একটা স্ট্র্যাকচার ডিক্লেয়ার করতে যাচ্ছি। এরপর book, যা দিয়ে বুঝাচ্ছে আমরা কোন struct টা ডিক্লেয়ার করতে যাচ্ছি। এরপর হচ্ছে আমরা কি নামে আমাদের তৈরি স্ট্র্যাকচারটা ব্যবহার করব।

ডিক্লেয়ার করার পর স্ট্র্যাকচার ব্যবহার করতে হবে। তো আমরা আমাদের তৈরি myBook স্ট্র্যাকচার ব্যবহার করব।

myBook এর দুইটা মেম্বার। একটা হচ্ছে no আরেকটা name।

এখন আমরা বই এর নাম্বার এবং নাম সেট করব। তার জন্য লিখতে হবেঃ

myBook.no = 3;
myBook.name = ‘C’;

এবার আমাদের সেট করা বই এর নাম এবং নং প্রিন্ট করতে চাইলেঃ

printf( "Book No : %dn", myBook.no); 
printf( "Book Name : %cn", myBook.name);

আমরা ছোট ছোট কোড লিখেছি, এবার পুরো প্রোগ্রামটি লিখে ফেলিঃ

#include <stdio.h>


struct book{
    int id;
    char name;
};


int main ()
{
    struct book myBook;
    myBook.id = 3;
    myBook.name = 'C';


    printf( "Book ID : %d\n", myBook.id);
    printf( "Book Name : %c\n", myBook.name);


    return 0;
}

এখন আপনার মনে প্রশ্ন জানতে পারে, আমরা বই এর নামের পরিবর্তে একটা ক্যারেক্টার কেন ব্যবহার করছি। কারণ ছিল সহজে স্ট্র্যাকচারটা বুঝানোর জন্য। এখন আমরা চাইলে বই এর নাম পুরোটা ব্যবহার করতে পারব। তার জন্য ক্যারেক্টার অ্যারে নিতে হবে। নিচের প্রোগ্রামটি দেখোঃ

#include <stdio.h>


struct book{
    int id;
    char name[80];
};


int main ()
{
    struct book myBook;
    myBook.id = 3;
    strcpy(myBook.name, "C Programming");


    printf( "Book ID : %d\n", myBook.id);
    printf( "Book Name : %s\n", myBook.name);


    return 0;
}

এখানে দেখো, আমরা আগে যেমন একটা ভ্যালু সমান সমান চিহ্ন ব্যবহার করে এসাইন করতে পারতাম, স্ট্রিং এর ক্ষেত্রে তেমন পারি না। স্ট্রিং এর ক্ষেত্রে strcpy ফাংশন ব্যবহার করতে হয়। আর এ জন্য শুরুতেই এ উদাররণটি ব্যবহার করা হয় নি। উপরের প্রোগ্রামটি রান করে দেখো, দেখবে আমাদের স্ট্র্যাকচার কাজ করছে সুন্দর মত।

 typedef

আমরা ইন্টিজার ভ্যারিয়েবলের জন্য যেমন int ব্যবহার করি, আমাদের তৈরি করা স্ট্রাকচারের ও এমন একটা টাইপ আমরা দিয়ে দিতে পারি। তা দেওয়া হয় typedef এর মাধ্যমে। typedef ব্যবহার করে আমরা আমাদের স্ট্র্যাকচারের instanc তৈরি করার সময় struct কীওয়ার্ড ব্যবহার ছাড়াই আমাদের তৈরি স্ট্র্যাকচার ব্যবহার করতে পারি। তার জন্য আমাদের উপরের স্ট্যাকচারটা নিচের মত করে লিখতে হবেঃ

typedef struct {
    int no;
    char name;
} book;

আগের থেকে পার্থক্য হচ্ছে আমরা এখানে নতুন একটা কীওয়ার্ড ব্যবহার করেছি, typedef। তারপর লিখছি struct। এবং আমাদের স্ট্র্যাকচারের একবারে শেষের দিকে লিখেছি আমাদের স্ট্যাকচারের নাম।

এখন আমরা আমাদের এই book স্ট্র্যাকচারের instance তৈরি করার জন্য struct কীওয়ার্ড ব্যবহার ছাড়াই তৈরি করতে পারব, যেমনঃ
book myBook;
যেভাবে আমরা একটা ভ্যারিয়েবল ডিক্লেয়ার করি, ঠিক সেভাবে। আগের প্রোগ্রামটা typedef ব্যবহার করলে হয়ঃ

#include <stdio.h>

typedef struct book{
    int no;
    char name;
} book;


int main ()
{
    book myBook;
    myBook.no = 3;
    myBook.name = 'C';


    printf( "Book No : %d\n", myBook.no);
    printf( "Book Name : %c\n", myBook.name);


    return 0;
}


স্ট্রাকচার এর সুবিধে হচ্ছে একবার ডিফাইন করার পর ইচ্ছে মত instance তৈরি করে নিতে পারি আমরা। আগের দুইটি প্রোগ্রামে আমরা একটা স্ট্রাকচার ডিফাইন করেছি, এবং এরপর একটা মাত্র স্ট্রাকচার ডিক্লেয়ার করেছি। এখন আমরা আরেকটা প্রোগ্রাম লিখব, যেখানে একটা স্ট্রাকচারের তিনটে instance তৈরি করব।

#include <stdio.h>


typedef struct book{
    int id;
    char name;
} book;


int main ()
{
    book book1;
    book book2;
    book book3;

    book1.id = 1;
    book1.name = 'A';

    book2.id = 2;
    book2.name = 'B';

    book3.id = 3;
    book3.name = 'C';

    printf( "Book ID : %d\n", book1.id);
    printf( "Book Name : %c\n \n", book1.name);

    printf( "Book ID : %d\n", book2.id);
    printf( "Book Name : %c\n \n", book2.name);

    printf( "Book ID : %d\n", book3.id);
    printf( "Book Name : %c\n", book3.name);

    return 0;
}

book এর instance তৈরি করার সময় আমরা ভিন্ন ভিন্ন লাইনে না লিখে একই লাইনে লিখতে পারি। যেমনঃ

এর পরিবর্তে আমরা লিখতে পারিঃ book book1, book2, book3;
আমরা book এর তিনটে instance তৈরি করেছি মাত্র এবং ম্যানুয়ালি সব গুলো মেম্বারে ডেটা সেট করেছি। কিন্তু আমাদের এমন প্রোগ্রাম লিখতে হবে, যেখানে আমাদের ১০০ বা ১০০০ বা আরো বেশি instance তৈরি করতে হবে। তখন কি করব? এমন প্রোগ্রামটা দেখতে কি বিশ্রিই না দেখাবে, তাই না? কিন্তু না, আমরা এখানে কন্ডিশনাল ব্যবহার করতে পারব। লুপ দিয়ে সব গুলোতে ডেটা সেট করতে পারব। আবার লুপ দিয়ে সব গুলো থেকে ডেটা বের করে প্রিন্ট করতে পারব।
আমরা সিম্পল একটা প্রোগ্রাম লিখব এ জন্য। আসলে এ প্রোগ্রামটির জন্য স্ট্র্যাকচার ব্যবহার করতে হয় না। তারপর ও লুপ ব্যবহার করে কিভাবে স্ট্র্যাকচারের ভিন্ন ভিন্ন মেম্বার এক্সেস করতে হয়, তার একটা উদাহরণ দেখব।
প্রোগ্রামটিতে আমরা ০ থেকে ১০০ এর বর্গমুল [square root] এর একটা চার্ট তৈরি করব।

#include <stdio.h>

typedef struct squareRoot{
    int number[100];
    double root[100];
} squareRoot;

int main ()
{
    int i =0;
    squareRoot squareRoot1;

    // setting data
    for (i =0; i<=100; i++){

        squareRoot1.number[i] = i;
        squareRoot1.root[i] = sqrt(i);
    }
    // printing data

    for (i =0; i<=100; i++){
        printf( "Square Root of %d ", squareRoot1.number[i]);
        printf( "is : %f\n", squareRoot1.root[i]);
    }

    return 0;
}


এখানে sqrt() হচ্ছে একটা লাইব্রেরী ফাংশন। যার মধ্যে একটা নাম্বার দিলে ঐ নাম্বারটির বর্গমূল রিটার্ন করে। বাকি কোড গুলো তো সহজ। প্রথমে আমরা for লুপ ব্যবহার করে আমাদের squareRoot1 এর বিভিন্ন মেম্বারে ডেটা সেট করেছি। এপর আবার লুপ দিয়ে সেগুলো প্রিন্ট করেছি। এগুলোই স্ট্র্যাকচারের মূল বিষয়। এখন আপনার ইমাজিনেশন শক্তি ব্যবহার করে যে কোন কমপ্লেক্স প্রোগ্রাম লিখার চেষ্টা করতে পারেন।

3 thoughts on “সি প্রোগ্রামিংঃ স্ট্রাকচার – struct

    1. অনেক দিন পরে উত্তর দেওয়ার জন্য দুঃখিত। লেখাটি আপডেট করেছি। strcpy ব্যবহার করতে হবে। উপরে বিস্তারিত লেখা রয়েছে।

  1. আসলেই বইটা অনেক সুন্দর।। খুব খুব খুব ভালো লাগছে। এই জন্য বাধ্য হলাম কমেন্ট করতে। খুব ভালো লাগছে। থানক্স জাকির হুসাইন স্যার আপনাকে।

Leave a Reply