সি প্রোগ্রামিং এইচটিএমএল সিএসএস জাভাস্ক্রিপ্ট পিএইচপি এসকিউএল
ফোরাম
×

 সি টিউটোরিয়াল

সি প্রোগ্রামিং কি? সি এর ইতিহাস সি এর বৈশিষ্ট্যসমূহ কেন সি শিখবেন? সি ইন্সটলেশন প্রথম সি প্রোগ্রাম সি প্রোগ্রামের ফ্লো প্রোগ্রামিং শেখার সঠিক পদ্ধতি সি কীওয়ার্ড সি আইডেন্টিফায়ার সি ভ্যারিয়েবল সি কনস্ট্যান্ট সি ডাটা টাইপ সি মোডিফায়ার সি ইনপুট/আউটপুট সি অপারেটর সি কমেন্ট সি অপারেটর অগ্রাধিকার

সি কন্ট্রোল স্টেটমেন্ট

সি ইফ সি ইফ...ইলস সি ফর লুপ সি হোহাইল লুপ সি ডু...হোহাইল লুপ সি ব্রেক সি কন্টিনিউ সি সুইচ স্টেটমেন্ট সি goto স্টেটমেন্ট

 সি ফাংশন

সি ফাংশন পরিচিতি সি ইউজার কর্তৃক ফাংশন সি ফাংশন টাইপ সি রিকার্সন সি ভ্যারিয়েবল স্কোপ

 সি অ্যারে

সি অ্যারে পরিচিতি সি মালটি-ডাইমেনশনাল অ্যারে সি অ্যারে ফাংশন

 সি স্ট্রিং

সি স্ট্রিং সি স্ট্রিং ফাংশন

 সি পয়েন্টার

সি পয়েন্টার পরিচিত সি পয়েন্টার অ্যারে সি পয়েন্টার ফাংশন সি মেমোরি ম্যানেজমেন্ট

 সি ফাইল এবং স্ট্রাকচার

স্ট্রাকচার পরিচিত স্ট্রাকচার ও পয়েন্টার সি স্ট্রাকচার ও ফাংশন সি ইউনিয়ন ফাইল হ্যান্ডেলিং

 সি অতিরিক্ত টিউটোরিয়াল

সি লাইব্রেরী সি প্রিপ্রোসেসর এবং ম্যাক্রো সি ইনুমিরেশন সি এরর নিয়ন্ত্রণ সি টাইপ কাস্টিং সি বিট ফিল্ড সি ভ্যারিয়েবল আর্গুমেন্ট সি কমান্ড লাইন আর্গুমেন্ট

 

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


এই অধ্যায়ে আপনি সি প্রোগ্রামিং স্ট্রাকচার(structures) সম্মন্ধে জানবেন; স্ট্রাকচার কি, স্ট্রাকচার কিভাবে ডিফাইন্ড(defined) করতে হয় এবং কিভাবে ব্যবহার করতে হয়।

সি প্রোগ্রামিং এ স্ট্রাকচার হলো ইউজার ডিফাইন্ড(user defined) ডেটা টাইপ।

একটি একক নামের মধ্যে বিভিন্ন ডেটা টাইপ সম্বলিত ভ্যারিয়েবলের সংগ্রহ-ই হলো স্ট্রাকচার(structures)

উদাহরণস্বরূপঃ আপনি একজন ব্যাক্তির(নাম, আইডি এবং ঠিকানা) তথ্য সংগ্রহ করে রাখতে চাচ্ছেন। ব্যাক্তির তথ্য সংগ্রহ করে রাখার জন্য আপনি খুব সহজেই বিভিন্ন ভ্যারিয়েবল তৈরি করতে পারেন। যেমন- name, idNo, address ইত্যাদি।

যাইহোক, আপনি যদি অনেক ব্যাক্তির তথ্য সংগ্রহ করে রাখতে চান তাহলে আপনাকে প্রত্যেক ব্যাক্তির জন্য name1, idNo1, address1, name2, idNo2, address2 ইত্যাদি ভিন্ন ভিন্ন ভ্যারিয়েবল তৈরি করতে হবে।

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

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

একটি একক নাম(Person) এর মাধ্যমে সম্পর্কযুক্ত তথ্যসমূহের এই সংগ্রহ-ই হলো স্ট্রাকচার(structure)।


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

struct কীওয়ার্ডের মাধ্যমে স্ট্রাকচার তৈরি করা হয়।


স্ট্রাকচারের সিনট্যাক্স

struct structure_name 
{
    data_type member1;
    data_type member2;
    .
    .
    data_type memeber;
};

নোটঃ লাইনের শেষে সেমিকোলন(;) দিতে ভুল করবেন না।

উপরোল্লিখিত person এর জন্য আমরা নিম্নের ন্যায় স্ট্রাকচার তৈরি করতে পারিঃ

struct person
{
    char name[50];
    int idNo;
    float address;
};

উপরের ডিক্লেয়ারেশনে(declaration) ডিরাইভড(derived) ডেটা টাইপ struct person তৈরি হয়েছে।


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

যখন কোনো স্ট্রাকচার ডিফাইন্ড করা হয় তখন ইহা ইউজার ডিফাইন্ড(user-defined) ডেটা টাইপ তৈরি করে। কিন্তু কোনো মেমোরি বা স্টোরেজ বরাদ্দ হয় না।

উপরের person স্ট্রাকচারের জন্য নিচের ন্যায় ভ্যারিয়েবল ডিক্লেয়ার করা যেতে পারেঃ

struct person
{
    char name[50];
    int idNo;
    float address;
};

int main()
{
    struct person person1, person2, person3[30];
    return 0;
}

স্ট্রাকচার ভ্যারিয়েবল ডিক্লেয়ারের অন্য পদ্ধতিঃ

struct person
{
    char name[30];
    int idNo;
    float address;
} person1, person2, person3[30];

উভয় ক্ষেত্রেই person1person2 ভ্যারিয়েবল এবং person3 অ্যারের ডেটা টাইপ হলো person


স্ট্রাকচারের মেম্বারকে এক্সেস করা

স্ট্রাকচারের মেম্বারকে এক্সেস করার জন্য দুই ধরণের অপারেটর রয়েছেঃ

  1. Member operator(.)
  2. Structure pointer operator(->)

স্ট্রাকচারের মেম্বার ভ্যারিয়েবলকে নিচের ন্যায় এক্সেস(access) করা যায়ঃ

structure_variable_name.member_name

ধরুন, আমরা person1 ভ্যারিয়েবলের address কে এক্সেস করতে চাচ্ছি তাহলে ইহা নিচের ন্যায় এক্সেস করা যায়।

person1.address

স্ট্রাকচারের উদাহরণ

ইউজার কর্তৃক ভ্যালু ইনপুট নিয়ে দুটি দুরত্বকে যোগ করার জন্য সি প্রোগ্রাম। দুরত্ব পরিমাপ করার জন্য ইঞ্চি এবং ফুট ব্যবহার করুন। (বিঃদ্রঃ ১২ ইঞ্চি = ১ ফুট)

#include <stdio.h>
struct Distance
{
    int feet;
    float inch;
} dist1, dist2, sum;

int main()
{
    printf("1st distance\n");

    // স্ট্রাকচার ভ্যারিয়েবল dist1 এর জন্য ফুট ভ্যালু ইনপুট। 
    printf("Enter feet: ");
    scanf("%d", &dist1.feet);

    // স্ট্রাকচার ভ্যারিয়েবল dist1 এর জন্য  ইঞ্চি ভ্যালু ইনপুট। 
    printf("Enter inch: ");
    scanf("%f", &dist1.inch);

    printf("2nd distance\n");

    // স্ট্রাকচার ভ্যারিয়েবল dist2 এর জন্য ফুট ভ্যালু ইনপুট।
    printf("Enter feet: ");
    scanf("%d", &dist2.feet);

    // স্ট্রাকচার ভ্যারিয়েবল dist2 এর জন্য ইঞ্চি ভ্যালু ইনপুট।
    printf("Enter inch: ");
    scanf("%f", &dist2.inch);

    sum.feet = dist1.feet + dist2.feet;
    sum.inch = dist1.inch + dist2.inch;

    if (sum.inch > 12) 
    {
      	//ইঞ্চির ভ্যালু ১২ থেকে বড় হলে, ইহা পরিবর্তন  হয়ে ফুট হবে।
        ++sum.feet;
        sum.inch = sum.inch - 12;
    }

    
    // দুরত্ব dist1 এবং dist2 এর যোগফল প্রিন্ট করা 
    printf("Sum of distances = %d\'-%.1f\"", sum.feet, sum.inch);
    return 0;
}

আউটপুট

1st distance
Enter feet: 12
Enter inch: 7.9
2nd distance
Enter feet: 2
Enter inch: 9.8
Sum of distances = 15'-5.7"

structure ব্যবহারের সময় typedef কীওয়ার্ডের প্রয়োজনীয়তা

স্ট্রাকচার ভ্যারিয়েবল ডিক্লেয়ার করার জন্য struct structure_name variable_name; ব্যবহার করলে ডেভেলপমেন্টের জন্য সময় বেশী লাগে। ফলে struct ব্যবহারের তাৎপর্য থেকে বঞ্চিত হতে হয়।

সুতরাং স্ট্রাকচারের নাম দেওয়ার জন্য ডেভেলপাররা সাধারণত typedef কীওয়ার্ড ব্যবহার করে। উদাহরণস্বরূপঃ

typedef struct complex
{
  int imag;
  float real;
} comp;

int main()
{
  comp comp1, comp2;
}

এখানে typedef কীওয়ার্ড ব্যবহার করে comp  টাইপ তৈরি করা হয়েছে যেখানে com এর টাইপ হলো struct complex)।

তারপরে comp টাইপের comp1 এবং comp2 দুটি স্ট্রাকচার ভ্যারিয়েবল তৈরি করা হয়েছে।


স্ট্রাকচার এর মধ্যে স্ট্রাকচার

সি প্রোগ্রামিং এ একটি Structure অন্য structure এর মধ্যে নেস্টেড হতে পারে।

struct complex
{
 int imaginary_value;
 float real_value;
};

struct number
{
   struct complex comp;
   int real;
} number1, number2;

ধরুন, আপনি number2 স্ট্রাকচার ভ্যারিয়েবলের imaginary_value কে এক্সেস(access) করতে চাচ্ছেন তাহলে নিচের স্ট্রাকচার মেম্বার ব্যবহৃত হবেঃ

number2.comp.imaginary_value

ফাংশনের মধ্য দিয়ে স্ট্রাকচার অতিক্রম(pass) করানো

ফাংশনের মধ্যে দিয়ে স্ট্রাকচার অতিক্রম করানোর দুটি পদ্ধিত রয়েছেঃ

  1. ভ্যালু অতিক্রম করানো(Passing by value)
  2. রেফারেন্স অতিক্রম করানো(Passing by reference)

স্ট্রাকচার ও ফাংশন অধ্যায়ে এ সম্বন্ধে বিস্তারিত আলোচনা করা হয়েছে।