স্ট্রাকচার ইন সি প্রোগ্রামিং
Structure in C Programming
আবছা ধারণা
আমাদের ভ্যারিয়েবলের দরকার পড়ত যখন আমরা প্রোগ্রামে কোন নাম বা সংখ্যা এমন কিছু স্টোর করে রাখতে চাইতাম, পরে কোন ক্যালকুলেশনের সময় লাগবে এটা ভেবে। ইন্টিজার, স্ট্রিং যেমন ডাটা টাইপ – সংখ্যা, নাম এসব মনে রাখার জন্য, স্ট্রাকচারকেও ঠিক তেমন ধরণের একটা ডাটা টাইপ এর মত করে কল্পনা করতে পারি আমরা।
পার্থক্য হল, ইন্টিজার এ শুধু আমরা সংখ্যাই রাখতে পারব, ক্যারেক্টার টাইপ ভ্যারিয়েবল এ শুধু ক্যারেক্টারই রাখতে পারব, কারণ সি প্রোগ্রামিং ল্যাঙ্গুয়েজ এ এই ডাটা টাইপগুলো প্রিডিফাইন্ড। কিন্তু স্ট্রাকচার ব্যবহার করে আমরা আমাদের নিজেদের ইচ্ছামত ডাটা টাইপ তৈরী করতে পারব, সেখানে কি টাইপ ডাটা রাখব আমাদের ইচ্ছার উপর নির্ভর করবে।
যখন আমরা সি দিয়ে কোন প্রোজেক্ট তৈরী করব, তখন এই স্ট্রাকচার এর প্রচুর ব্যবহার দেখব। এখনো এই স্ট্রাকচার কেন প্রয়োজন তা খুব বেশি বুঝে উঠবার কথা না, আশা করি, নিচের কাল্পনিক উদাহরণটা দেখলে কিছুটা হলেও পরিষ্কার হবে।
হসপিটাল ম্যানেজমেন্ট সিস্টেম
মনে কর, আমার একটা হসপিটাল আছে। তার মানে আমার মূল কাজ হল রোগীদের নিয়ে। আমি আমার হসপিটাল এর জন্য একটা সফটয়্যার বানাতে চাই, যার মূল কাজ আমার হসপিটালে যত রোগী আসে তাদের তথ্য জমা রাখা।
খুব সোজাভাবে চিন্তা করলে, আমার প্রতিটা রোগীর জন্য কী কী তথ্য জমা রাখা প্রয়োজন? ধর, আমরা প্রতিটা রোগীর নাম, বয়স, ঠিকানা আর ব্লাড গ্রুপ জমা রাখব।
প্রথমে মনে করি, আমার হসপিটালে মাত্র একজনই রোগী। এই একজনের তথ্য ইনপুট নিয়ে তা আবার আউটপুট হিসেবে দেখানোর সি প্রোগ্রাম নিচে দিচ্ছি আমি।
#include<stdio.h>
int main() {
int age;
char name[20], addr[30], bg[4];
printf("Enter patient's info (Age, Name, Address and then Blood Group): \n");
scanf("%d %s %s %s", &age, name, addr, bg);
printf("Displaying patient's info: \n");
printf("Patient's name is %s.\nHe is %d years old and lives in %s.\nHis blood group is %s.", name, age, addr, bg);
return 0;
}আচ্ছা, আবার আগের কথায় ফিরে আসি। আমার এই প্রথম রোগীর তথ্য জমা রাখতে আমাকে মোট ৪টা ভ্যারিয়েবল লাগল। এখন, আমার রোগী যদি দুইজন হত, তাহলে ৮টা ভ্যারিয়েবল লাগত। হসপিটালের জীবনকালে যত রোগী আসবে যাবে, সবার তথ্যই তো আমার এভাবে জমা করে রাখতে হবে। খুব ছোট হসপিটাল হলেও তো এতে ৫০০ রোগী থাকবেই এর ডাটাবেজে। তখন আমার প্রোগ্রামে ভ্যারিয়েবল সংখ্যা হবে ৪*৫০০ = ২০০০টা।
তার মানে এটা বোঝা গেল যে, যখন আমরা রিয়াল লাইফ অবজেক্ট (অবজেক্ট বলতে এই ক্ষেত্রে রোগী) নিয়ে কাজ করব তখন প্রিডিফাইন্ড ডাটা টাইপ ব্যবহার করা কোন ফিজিবল সল্যুশন না। এজন্য আমাদের স্ট্রাকচার ব্যবহার করতে হবে।
স্ট্রাকচার ব্যবহার করলে প্রোগ্রামটা দেখতে হত নিচের মত:
struct patient { int age; char name[20]; char addr[30]; char bg[4]; };
int main() { struct patient p1, p2; printf("Enter first patient's info (Age, Name, Address and then Blood Group): \n"); scanf("%d %s %s %s", &p1.age, p1.name, p1.addr, p1.bg); printf("Enter second patient's info (Age, Name, Address and then Blood Group): \n"); scanf("%d %s %s %s", &p2.age, p2.name, p2.addr, p2.bg); printf("Displaying first patient's info: \n"); printf("Patient's name is %s.\nHe is %d years old and lives in %s.\nHis blood group is %s.\n", p1.name, p1.age, p1.addr, p1.bg); printf("Displaying second patient's info: \n"); printf("Patient's name is %s.\nHe is %d years old and lives in %s.\nHis blood group is %s.", p2.name, p2.age, p2.addr, p2.bg); } ```
স্ট্রাকচার ব্যাখ্যা
প্রথম কোড সেগমেন্টে আমি একটা স্ট্রাকচার ডিক্লিয়ার করেছি। এভাবে চিন্তা করলে সুবিধা হবে, মনে কর আমরা নতুন একটা ডাটা টাইপ বানালাম, ঠিক ইন্টিজার, ডাবল এসব এর মতন। এখানে আমার ডাটা টাইপটা হল, patient যার কিছু অ্যাট্রিবিউট বা বৈশিষ্ট্য আছে।
এখন থেকে আমরা কোডের মধ্যে patient টাইপ এর ভ্যারিয়েবল ডিক্লিয়ার করতে পারব, ঠিক ইন্টিজার, ডাবল এর মত।
struct patient p1;p1.name, p1.age, p1.addr, p1.bg দিয়ে আমরা প্রতিটা অ্যাট্রিবিউট অ্যাক্সেস করতে পারব।
স্ট্রাকচারের অ্যারে
অ্যারে ব্যবহার করে আমরা একসাথে অনেক patient ডিক্লিয়ার করতে পারি:
struct patient p[3];এভাবে একলাইন কোডে আমি ৩টা patient টাইপ ভ্যারিয়েবল ডিক্লিয়ার করলাম, যাদের নাম যথাক্রমে p[0], p[1], এবং p[2]।
স্ট্রাকচার টপিকটা প্রোজেক্ট এবং পরীক্ষা দুইটার জন্যই খুব গুরুত্বপূর্ণ। কোথাও বুঝতে সমস্যা হলে, Google Classroom এ জানাবে।