সি/সি++ প্রোগ্রামিং টিউটোরিয়াল (পর্ব ৩) স্ট্রাকচার মেম্বার

0
210

স্ট্রাকচার মেম্বার : {} বন্ধনীর ভেতরে ডিক্লেয়ার করা বিভিন্ন ভেরিয়েবল, অ্যারে, পয়েন্টার অথবা অন্য কোনো স্ট্রাকচার ভেরিয়েবলকে ওই স্ট্রাকচারের মেম্বার বলা হয়। যেমন :
• একই স্ট্রাকচারের একাধিক মেম্বার থাকলে তাদের সবার নাম ভিন্ন হতে হবে।
• প্রত্যেক মেম্বারের শেষে সেমিকোলন দিতে হবে।
• স্ট্রাকচার ডিক্লারেশনের সময় তথা নতুন ডাটা টাইপ ডিফাইনের সময় কোনো মেম্বারের মান নির্ধারণ করা যায় না। এখানে মান ডিক্লেয়ার করতে গেলে এরর দেখাবে। কারণ এটি কোনো ভেরিয়েবল ডিক্লারেশন নয়, শুধু ভেরিয়েবল টাইপ ডিক্লারেশন।

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

struct student var;
struct student var[50];
struct student* var;

এখানে স্ট্রাকচার ভেরিয়েবল, স্ট্রাকচার অ্যারে ও স্ট্রাকচার পয়েন্টার ডিক্লেয়ার করা দেখানো হলো। কোনো স্ট্রাকচারের ভেরিয়েবল ডিক্লেয়ার করতে হলে প্রথমে struct কিওয়ার্ড লিখে ওই স্ট্রাকচার টাইপের নাম লিখে ভেরিয়েবলের নাম লিখতে হবে। আর ভেরিয়েবলটি যদি অ্যারে হয়, তাহলে সাধারণ অ্যারের মতো ওই ভেরিয়েবলের নামের শেষে [] লিখে মাঝে মোট এলিমেন্ট সংখ্যা লিখতে হয়। আর পয়েন্টার ডিক্লেয়ার করতে হলে সাধারণ ভেরিয়েবলের মতোই লিখতে হয়, শুধু টাইপের ডান পাশে একটি * সাইন ব্যবহার করতে হয়। সুতরাং স্ট্রাকচার ভেরিয়েবল ডিক্লারেশনের সিনটেক্সকে নিচের মতো লেখা যায় :
struct type_name variable_name;
আরেকভাবে স্ট্রাকচারের ভেরিয়েবল ডিক্লেয়ার করা যায়। সেটি হলো স্ট্রাকচার ডিক্লেয়ার করার সময়ই তার ভেরিয়েবল ডিক্লেয়ার করা। নিচে একটি ডিক্লারেশনের উদাহরণ দেয়া হলো।

struct student
{
char name[24];
int id;
double cgpa;
}var;

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

স্ট্রাকচার ডিক্লেয়ার করার আরেকটি নিয়ম হলো ট্যাগ না দেয়া। ইউজার যদি ট্যাগ না দেন তাহলে স্ট্রাকচার ডিক্লেয়ার করার সময়ই তার ভেরিয়েবল ডিক্লেয়ার করতে হবে। তবে ট্যাগবিহীন স্ট্রাকচার ডিক্লেয়ার করার পর যদি অন্য কোনো স্কোপে ওই একই টাইপের ভেরিয়েবল ডিক্লেয়ার করতে হয় তাহলে স্ট্রাকচারটিকে আবার ডিক্লেয়ার করতে হবে। তাই প্রতিটি স্ট্রাকচারের ট্যাগ লেখা উচিত। তাহলে পরে কোড পড়তে সুবিধা হয়।
স্ট্রাকচার ভেরিয়েবলের জন্য মেমরিতে জায়গা নির্ধারণ : যেকোনো ভেরিয়েবলকে প্রোগ্রামে চলার উপযোগী করে তোলার জন্য অবশ্যই মেমরিতে তার জন্য নির্দিষ্টসংখ্যক জায়গা নির্ধারণ করতে হবে। স্ট্রাকচার ভেরিয়েবলের ক্ষেত্রেও একই নিয়ম প্রযোজ্য। একটি স্ট্রাকচার ভেরিয়েবল মেমরিতে কতটুকু জায়গা দখল করবে তা নির্ধারণ করে তার মেম্বারদের ওপর। সব মেম্বারের জন্য দখল করা জায়গা হবে ওই স্ট্রাকচারের একটি ভেরিয়েবলের দখল করা জায়গা। উপরের ডিক্লেয়ার করা স্টুডেন্ট স্ট্রাকচারেরাধৎ ভেরিয়েবলটি কীভাবে মেমরিতে জায়গা দখল করে তা চিত্র-১-এ দেখানো হলো।

প্রথমে নেম অ্যারের জন্য ২৪ বাইট অ্যালোকেট করা হলো, কারণ একটি ক্যারেক্টার ১ বাইট জায়গা নেয় আর স্ট্রাকচারটিতে ২৪টি ক্যারেক্টারের একটি অ্যারে মেম্বার হিসেবে আছে। তারপর আইডির জন্য ২ বাইট, কারণ একটি ইন্টিজার ২ বাইট জায়গা নেয়। এরপর সিজিপিএ’র জন্য ৮ বাইট, কারণ এটি ডাবল টাইপের। আর ডাবল টাইপ ভেরিয়েবল ৮ বাইট জায়গা নেয়।

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

var.name=”this is a name”;
var.id=42;
var.cgpa=2.86965;

এখানে প্রতিটি মেম্বারকে আলাদাভাবে ব্যবহার করা হয়েছে। কিন্তু একটি ছোট সমস্যা হতে পারে। নেম ভেরিয়েবল একটি ক্যারেক্টার অ্যারে, যার মোট এলিমেন্ট সংখ্যা ২৪। কিন্তু মান অ্যাসাইনের সময় স্পেসসহ মোট ১৪টি ক্যারেক্টার অ্যাসাইন করা হয়েছে। সুতরাং বাকি ১০টি এলিমেন্টে গারবেজ মান থাকতে পারে। গারবেজ মান যাতে না থাকে সেজন্য ক্যারেক্টার অ্যারের সর্বশেষে একটি নাল ক্যারেক্টার অ্যাসাইন করা যায়। অথবা ক্যারেক্টার অ্যারেটি ডিক্লেয়ার করার সময় কোনো এলিমেন্ট সংখ্যা ব্যবহার না করলেও হয়। সে ক্ষেত্রে যতগুলো ক্যারেক্টার ওই অ্যারেতে অ্যাসাইন করা হবে, অ্যারেটির এলিমেন্ট সংখ্যা স্বয়ংক্রিয়ভাবে ততগুলো হয়ে যাবে।
স্ট্রাকচার মেম্বার ইনপুট/প্রিন্ট : একটি স্ট্রাকচার ভেরিয়েবল ইনপুট নিতে হলে বা প্রিন্ট করতে হলে সাধারণ ভেরিয়েবলের নিয়মানুসারে তার প্রতিটি মেম্বারকে ব্যবহার করতে হবে। যেমন : var ভেরিয়েবলের ইনপুট ও প্রিন্ট করার পদ্ধতি নিচে দেখানো হলো :
scanf(“%s”,&var;.name);
scanf(“%d”,&var;.id);
scanf(“%f”,&var;.cgpa);
printf(“%s”,var.name);
printf(“%d”,var.id);
printf(“%f”,var.cgpa);

সাধারণ ভেরিয়েবলের মতোই ইনপুট নেয়া ও প্রিন্ট করতে হয়। শুধু পার্থক্য হলো এ ক্ষেত্রে স্ট্রাকচার ভেরিয়েবলের নাম এবং সাথে মেম্বার অপারেটর ব্যবহার করতে হয়। এখানে (.) অপারেটর হলো মেম্বার অপারেটর।
স্ট্রাকচার তথা কাস্টম ডাটা টাইপের ব্যবহার সি ল্যাঙ্গুয়েজের একটি অন্যতম ফিচার। এটি ব্যবহারের মাধ্যমে ইউজারের কোড করা যেমন সহজ হয়ে যায়, তেমনি প্রোগ্রামের গুণগত মানও অনেক বেড়ে যায়। তাছাড়া বড় ধরনের প্রজেক্ট করার সময় স্ট্রাকচারের তথা কাস্টম ডাটা টাইপ ব্যবহারের কোনো বিকল্প নেই

LEAVE A REPLY

two × five =