গল্প দিয়ে শুরু করি!
তোমার স্কুলের প্রতিটি বন্ধুর একটা ‘আইডি কার্ড’ থাকে। সেই কার্ডে থাকে নাম, ক্লাস, রোল নম্বর, আর ফোন নম্বর – সবগুলো আলাদা ধরনের ডেটা, কিন্তু একটা কার্ডের মধ্যে সাজানো। প্রোগ্রামিংয়ে যদি তুমি ৫০ জন বন্ধুর ডেটা রাখতে চাও, তাহলে আলাদা আলাদা অ্যারে বানানো সম্ভব, কিন্তু তা খুব বিরক্তিকর। স্ট্রাকচার হলো সেই ‘আইডি কার্ড’–একসাথে সব ধরনের ডেটা জড়ো করে একটা নতুন টাইপ বানিয়ে ফেলা।
📁 অধ্যায় ১: স্ট্রাকচার কী আর কেন দরকার?
স্ট্রাকচার হলো ইউজার-ডিফাইন্ড ডেটা টাইপ। মানে তুমি নিজেই একটা নতুন ডেটা টাইপ বানাতে পারো, যার ভেতর int, float, char, এমনকি অ্যারে বা অন্য স্ট্রাকচারও থাকতে পারে!
মনে রেখো:
- অ্যারে → একই টাইপের ডেটার সারি (যেমন: ১০টা ইন্টিজার)।
- স্ট্রাকচার → ভিন্ন টাইপের ডেটার বান্ডিল (যেমন: নাম + বয়স + নম্বর)।
🛠️ অধ্যায় ২: প্রথম স্ট্রাকচার বানানো (Blueprint)
স্ট্রাকচার বানাতে হলে প্রথমে তার খসড়া (Blueprint) তৈরি করতে হয়। এতে ডেটা থাকে, কিন্তু মেমরি তখনও জায়গা নেয় না (ঠিক যেমন বাড়ির নকশা দেখে বাড়ি তৈরি হয় না)।
text
struct ছাত্র {
char নাম[৫০];
int বয়স;
float জিপিএ;
};
🔍 ব্যাখ্যা:
struct→ বলে দিচ্ছি যে আমরা নতুন স্ট্রাকচার বানাচ্ছি।ছাত্র→ স্ট্রাকচারের নাম (তুমি ইংরেজি বা বাংলা যেকোনো নাম দিতে পারো, তবে ইংরেজি নাম দেয়া ভালো অভ্যাস)।- ভেতরে তিনটি ভেরিয়েবল (এদের বলে মেম্বার)।
✍️ অধ্যায় ৩: স্ট্রাকচারের ভেরিয়েবল ডিক্লেয়ার ও মান বসানো
নকশা (Blueprint) বানালেই হলো না, এখন সেই নকশা দিয়ে আসল ভেরিয়েবল বানাতে হবে। তাহলেই মেমরিতে জায়গা তৈরি হবে।
text
#include <stdio.h>
#include <string.h> // strcpy() ফাংশনের জন্য
struct ছাত্র {
char নাম[৫০];
int বয়স;
float জিপিএ;
};
int main() {
struct ছাত্র ছাত্র১; // 'ছাত্র' টাইপের একটা ভেরিয়েবল বানালাম
// ডেটা বসানো
strcpy(ছাত্র১.নাম, "রাফি");
ছাত্র১.বয়স = ১৬;
ছাত্র১.জিপিএ = ৪.৫০;
// ডেটা প্রিন্ট করা
printf("নাম: %s\n", ছাত্র১.নাম);
printf("বয়স: %d\n", ছাত্র১.বয়স);
printf("জিপিএ: %.2f\n", ছাত্র১.জিপিএ);
return 0;
}
আউটপুট:
নাম: রাফি
বয়স: ১৬
জিপিএ: ৪.৫০
💡 খেয়াল করো: স্ট্রাকচারের মেম্বার অ্যাক্সেস করতে ডট (.) অপারেটর ব্যবহার করি। যেমন: ছাত্র১.বয়স।
🧙 অধ্যায় ৪: typedef – নামটা ছোট করো!
প্রতিবার struct ছাত্র লিখতে বিরক্তি লাগে? C-তে typedef দিয়ে স্ট্রাকচারের নতুন নাম দেয়া যায়।
text
#include <stdio.h>
#include <string.h>
typedef struct {
char নাম[৫০];
int বয়স;
float জিপিএ;
} ছাত্র; // এখন শুধু 'ছাত্র' লিখলেই হবে
int main() {
ছাত্র ছাত্র১; // 'struct' না লিখেও চলে!
strcpy(ছাত্র১.নাম, "মিমি");
ছাত্র১.বয়স = ১৫;
ছাত্র১.জিপিএ = ৪.৮০;
printf("%s এর জিপিএ %.2f", ছাত্র১.নাম, ছাত্র১.জিপিএ);
return 0;
}
আউটপুট: মিমি এর জিপিএ ৪.৮০
একে বলে Alias (ডাকনাম)। প্রোগ্রামিংয়ের বড় প্রকল্পে এই typedef খুব কাজে লাগে।
📚 অধ্যায় ৫: স্ট্রাকচারের অ্যারে (বহু ছাত্রের ডেটা)
একজন ছাত্রের ডেটা তো রাখলাম, কিন্তু পুরো ক্লাসের ৫০ জনের ডেটা কীভাবে রাখবো? স্ট্রাকচারেরও অ্যারে বানাতে পারো!
text
#include <stdio.h>
#include <string.h>
typedef struct {
char নাম[৫০];
int রোল;
float নম্বর;
} ছাত্র;
int main() {
ছাত্র ক্লাস[৩]; // ৩ জন ছাত্রের অ্যারে
// ডেটা বসানো
strcpy(ক্লাস[০].নাম, "আরিফ");
ক্লাস[০].রোল = ১০১;
ক্লাস[০].নম্বর = ৮৫.৫;
strcpy(ক্লাস[১].নাম, "সুমি");
ক্লাস[১].রোল = ১০২;
ক্লাস[১].নম্বর = ৯২.০;
strcpy(ক্লাস[২].নাম, "জয়");
ক্লাস[২].রোল = ১০৩;
ক্লাস[২].নম্বর = ৭৮.০;
// লুপ দিয়ে সব প্রিন্ট
for(int i = ০; i < ৩; i++) {
printf("রোল %d: %s -> নম্বর %.1f\n", ক্লাস[i].রোল, ক্লাস[i].নাম, ক্লাস[i].নম্বর);
}
return 0;
}
আউটপুট:
রোল ১০১: আরিফ -> নম্বর ৮৫.৫
রোল ১০২: সুমি -> নম্বর ৯২.০
রোল ১০৩: জয় -> নম্বর ৭৮.০
🎯 এখন তুমি চাইলে ডেটাবেসের মতো পুরো ক্লাসের রেকর্ড সংরক্ষণ করতে পারো!
🔗 অধ্যায় ৬: পয়েন্টার আর স্ট্রাকচার (-> অপারেটর)
আমরা আগের অধ্যায়ে শিখেছি, ফাংশনে পয়েন্টার পাঠালে আসল ডেটা পরিবর্তন করা যায়। স্ট্রাকচারের জন্যও তাই। আর স্ট্রাকচার পয়েন্টার দিয়ে মেম্বার অ্যাক্সেস করতে তীর (->) অপারেটর ব্যবহার করি।
text
#include <stdio.h>
#include <string.h>
typedef struct {
char নাম[৫০];
int বয়স;
} ব্যক্তি;
void বয়স_বাড়াও(ব্যক্তি *p) {
p->বয়স = p->বয়স + ১; // -> দিয়ে পয়েন্টার থেকে মেম্বার অ্যাক্সেস
}
int main() {
ব্যক্তি মানুষ = {"সাদিক", ১৭};
printf("বয়স বাড়ানোর আগে: %d\n", মানুষ.বয়স);
বয়স_বাড়াও(&মানুষ); // ঠিকানা পাঠালাম
printf("বয়স বাড়ানোর পরে: %d\n", মানুষ.বয়স);
return 0;
}
আউটপুট:
বয়স বাড়ানোর আগে: ১৭
বয়স বাড়ানোর পরে: ১৮
📝 মনে রাখার ট্রিক:
- স্ট্রাকচারের সাধারণ ভেরিয়েবল → ডট (
.) - স্ট্রাকচারের পয়েন্টার → তীর (
->)
🏗️ অধ্যায় ৭: স্ট্রাকচারের ভেতর স্ট্রাকচার (Nested Structure)
মনে করো, তোমার ঠিকানায় রয়েছে বাড়ির নাম, সড়ক, জেলা। আবার সেই ঠিকানা আছে ছাত্রের প্রোফাইলে। তাহলে একটা স্ট্রাকচারের ভেতর আরেকটা স্ট্রাকচার রাখতে পারো!
text
#include <stdio.h>
#include <string.h>
typedef struct {
char সড়ক[২০];
char জেলা[২০];
} ঠিকানা;
typedef struct {
char নাম[৫০];
int বয়স;
ঠিকানা বাসা; // এখানে আরেকটা স্ট্রাকচার
} ছাত্র;
int main() {
ছাত্র সজিব;
strcpy(সজিব.নাম, "সজিব");
সজিব.বয়স = ১৬;
strcpy(সজিব.বাসা.সড়ক, "শাহবাগ");
strcpy(সজিব.বাসা.জেলা, "ঢাকা");
printf("নাম: %s\nঠিকানা: %s, %s", সজিব.নাম, সজিব.বাসা.সড়ক, সজিব.বাসা.জেলা);
return 0;
}
আউটপুট:
নাম: সজিব
ঠিকানা: শাহবাগ, ঢাকা
🧠 অধ্যায় ৮: বাস্তব জীবনের সম্পর্ক (কেন এটা শিখছি?)
১. গেমের ক্যারেক্টার: গেমে প্রতিটি চরিত্রের আছে নাম, হেলথ, স্পিড, ইনভেন্টরি (অস্ত্রের তালিকা)। স্ট্রাকচার দিয়ে একসাথে বেঁধে ফেলো।
২. বইয়ের লাইব্রেরি ম্যানেজমেন্ট: বইয়ের নাম, লেখক, আইএসবিএন, কপি সংখ্যা – সব স্ট্রাকচারে রাখো।
৩. ই-কমার্স: প্রতিটি প্রোডাক্টের আছে নাম, দাম, স্টকে কয়টা আছে, রেটিং।
৪. মোবাইল অ্যাপের ইউজার প্রোফাইল: নাম, ইমেইল, পাসওয়ার্ড (হ্যাশ করে), জন্ম তারিখ – সব স্ট্রাকচারের মাধ্যমে ডেটাবেসে সংরক্ষণ করা হয়।
🏠 তোমার জন্য হোমওয়ার্ক (চেষ্টা করতে হবে!)
১. ‘বই’ নামে একটা স্ট্রাকচার বানাও যাতে আছে: শিরোনাম (char[]), লেখক (char[]), দাম (float), পৃষ্ঠাসংখ্যা (int)। ৩টি বইয়ের ডেটা ইনপুট নিয়ে সব প্রিন্ট করো।
২. উপরের ‘ছাত্র’ স্ট্রাকচারে ‘নম্বর’ (float) যোগ করো। ইউজারের কাছ থেকে ৫ জন ছাত্রের ডেটা নিয়ে গড় নম্বর বের করো।
৩. void তথ্য_প্রিন্ট(ছাত্র *s) নামে একটা ফাংশন বানাও যা পয়েন্টার নেবে এবং প্রিন্ট করবে (হোমওয়ার্ক: -> ব্যবহার করতে হবে)।
⚠️ সাবধানতা (স্ট্রাকচার নিয়ে ভুল)
- স্ট্রাকচার কপি: C-তে একটা স্ট্রাকচারকে আরেকটাতে সরাসরি অ্যাসাইন করা যায় (যেমন:
ছাত্র২ = ছাত্র১;)। কিন্তু অ্যারে কপি হয় না, তাই স্ট্রিং কপি করতেstrcpy()ব্যবহার করো। - মেমরি সাইজ: স্ট্রাকচারের সাইজ সব মেম্বারের সাইজের যোগফল হয় না (Padding এর কারণে)। এটা জানার জন্য
sizeof(ছাত্র)ব্যবহার করে দেখতে পারো।
🚀 শেষ কথা
আজ তুমি শিখলে—
✅ স্ট্রাকচার দিয়ে ভিন্ন টাইপের ডেটা একসাথে বাঁধতে।
✅ স্ট্রাকচারের ভেরিয়েবল ডিক্লেয়ার ও মেম্বার অ্যাক্সেস (.) করতে।
✅ typedef দিয়ে নাম ছোট করতে।
✅ স্ট্রাকচারের অ্যারে বানাতে।
✅ পয়েন্টার আর -> অপারেটর ব্যবহার করতে।
✅ Nested Structure (স্ট্রাকচারের ভেতর স্ট্রাকচার) বানাতে।
এখন তুমি শুধু কোডার না, তুমি ডেটা আর্কিটেক্ট! তুমি চাইলেই স্কুলের পুরো রেকর্ড সিস্টেম, গেমের চরিত্রের ডেটাবেস, বা ব্যাঙ্কের অ্যাকাউন্টের তথ্য স্ট্রাকচার দিয়ে ডিজাইন করতে পারো।
🎯 পরের আর্টিকেলে: আমরা ঢুকবো C প্রোগ্রামিংয়ের শেষ বড় অধ্যায়ে—ফাইল হ্যান্ডলিং (File I/O)! কীভাবে হার্ডডিস্কে ফাইল সেভ করো, আবার পড়ো। তাহলে তোমার প্রোগ্রাম বন্ধ করলেও ডেটা মুছে যাবে না! ততদিন পর্যন্ত স্ট্রাকচার নিয়ে প্র্যাকটিস করতে থাকো।
📢 www.tolearnteam.com – স্ট্রাকচার নিয়ে কোনো প্রশ্ন আছে? কমেন্টে জানাও। আমরা তোমার প্রোগ্রামিং যাত্রায় সঙ্গী। আজকের হোমওয়ার্ক করতে ভুলো না!
All Related Articles (Beginner Level)
- প্রোগ্রামিংয়ের জগতে প্রথম পদক্ষেপ: C Programming for Beginners
- C প্রোগ্রামিং – দ্বিতীয় অধ্যায়: Array আর String (ডেটার সারি ও শব্দের খেলা)
- C প্রোগ্রামিং – তৃতীয় অধ্যায়: ফাংশন (Function) – তোমার নিজস্ব জাদুমন্ত্র তৈরি করো!
- C প্রোগ্রামিং – চতুর্থ অধ্যায়: পয়েন্টার (Pointer) – কম্পিউটারের ঠিকানার খেলা!
- C প্রোগ্রামিং – পঞ্চম অধ্যায়: স্ট্রাকচার (Structure) – ডেটার ‘সুপারহিরো টিম’ বানাও!
- C প্রোগ্রামিং – ষষ্ঠ অধ্যায়: ফাইল হ্যান্ডলিং (File I/O) – ডেটাকে চিরস্থায়ী করো!
- সি প্রোগ্রামিং – সপ্তম ও শেষ অধ্যায়: পূর্ণাঙ্গ প্রজেক্ট – ‘ছাত্র মার্কশিট ম্যানেজমেন্ট সিস্টেম’
- C প্রোগ্রামিং – শেষ পাতা নয়, নতুন দিগন্ত! (রিক্যাপ ও ক্যারিয়ার রোডম্যাপ)
