অভিনন্দন! তুমি এখন প্রোগ্রামার!
আজকের কাজটা একটু বড়, কিন্তু ভয় পেও না। আমরা ধাপে ধাপে এগোবো। শেষে তুমি নিজেই একটা সফটওয়্যার বানিয়ে ফেলবে, যা দিয়ে তুমি তোমার বন্ধুদের মার্কশিট সংরক্ষণ করতে পারো! প্রোগ্রামটির ক্ষমতা:
✅ ছাত্রের নাম, রোল, ৩টি বিষয়ের নম্বর ইনপুট নেওয়া।
✅ মোট নম্বর, গড় ও গ্রেড (A+, A, B, C, D, F) ক্যালকুলেট করা।
✅ ডেটা ফাইলে সেভ করা (যাতে প্রোগ্রাম বন্ধ করলেও ডেটা থাকে)।
✅ ফাইল থেকে সব ডেটা পড়ে লিস্ট আকারে দেখানো।
🧱 ধাপ ১: খসড়া তৈরি (স্ট্রাকচার ডিজাইন)
আমরা জানি, প্রতিটি ছাত্রের আছে নাম, রোল, ৩টি বিষয়ের নম্বর, মোট, গড় আর গ্রেড। এদের জন্য প্রথমে স্ট্রাকচার বানাই।
text
struct ছাত্র {
char নাম[৫০];
int রোল;
float বাংলা, ইংরেজি, গণিত;
float মোট, গড়;
char গ্রেড[৩]; // "A+", "B" ইত্যাদি রাখার জন্য
};
🧮 ধাপ ২: গ্রেড ক্যালকুলেটর ফাংশন
একটা ফাংশন বানাই যা গড় বের করবে এবং তার ভিত্তিতে গ্রেড ঠিক করবে। মনোযোগ দিয়ে দেখো, পয়েন্টার ব্যবহার করছি (যাতে আসল স্ট্রাকচার পরিবর্তন হয়)।
text
#include <stdio.h>
#include <string.h>
void গ্রেড_নির্বাচন(struct ছাত্র *s) {
s->মোট = s->বাংলা + s->ইংরেজি + s->গণিত;
s->গড় = s->মোট / 3;
if (s->গড় >= 80) {
strcpy(s->গ্রেড, "A+");
} else if (s->গড় >= 70) {
strcpy(s->গ্রেড, "A");
} else if (s->গড় >= 60) {
strcpy(s->গ্রেড, "B");
} else if (s->গড় >= 50) {
strcpy(s->গ্রেড, "C");
} else if (s->গড় >= 40) {
strcpy(s->গ্রেড, "D");
} else {
strcpy(s->গ্রেড, "F");
}
}
✍️ ধাপ ৩: ডেটা ইনপুট ও ফাইলে সেভ করার ফাংশন
এখন ইউজার থেকে ডেটা নিয়ে ফাইলে সেভ করবো। এখানে ফাইল মোড দেবো "ab" (Append Binary), কারণ আমরা বারবার নতুন ডেটা যোগ করবো এবং বাইনারি ফর্মে স্ট্রাকচার সেভ করলে ডেটা গোছানো থাকে।
text
void ডেটা_যোগ() {
struct ছাত্র s;
FILE *ফাইল;
ফাইল = fopen("মার্কশিট.dat", "ab");
if (ফাইল == NULL) {
printf("❌ ফাইল খোলা যায়নি!\n");
return;
}
printf("\n📝 নতুন ছাত্রের তথ্য দিন:\n");
printf("নাম: ");
scanf(" %[^\n]", s.নাম); // স্পেসসহ নাম নেওয়ার ট্রিক
printf("রোল নম্বর: ");
scanf("%d", &s.রোল);
printf("বাংলা নম্বর: ");
scanf("%f", &s.বাংলা);
printf("ইংরেজি নম্বর: ");
scanf("%f", &s.ইংরেজি);
printf("গণিত নম্বর: ");
scanf("%f", &s.গণিত);
গ্রেড_নির্বাচন(&s); // গ্রেড ক্যালকুলেট করি
// পুরো স্ট্রাকচার ফাইলে লিখে ফেলি (বাইনারি)
fwrite(&s, sizeof(struct ছাত্র), 1, ফাইল);
fclose(ফাইল);
printf("✅ ডেটা সফলভাবে সেভ হয়েছে!\n");
}
💡 fwrite দিয়ে আমরা পুরো স্ট্রাকচারটা এক লাইনে ফাইলে লিখছি। এটা fprintf-এর চেয়ে দ্রুত ও সহজ।
📖 ধাপ ৪: ফাইল থেকে সব ডেটা পড়ে দেখানোর ফাংশন
এখন ফাইল থেকে সব ছাত্রের ডেটা পড়ে টেবিল আকারে দেখাবো।
text
void সব_দেখা() {
struct ছাত্র s;
FILE *ফাইল;
int কাউন্ট = 1;
ফাইল = fopen("মার্কশিট.dat", "rb");
if (ফাইল == NULL) {
printf("❌ এখনো কোনো ডেটা সেভ নেই! আগে ডেটা যোগ করো।\n");
return;
}
printf("\n📊 সব ছাত্রের মার্কশিট:\n");
printf("--------------------------------------------------------\n");
printf("ক্রম নাম রোল বাংলা ইংরেজি গণিত মোট গড় গ্রেড\n");
printf("--------------------------------------------------------\n");
// fread দিয়ে প্রতিবার একটা স্ট্রাকচার পড়ি
while (fread(&s, sizeof(struct ছাত্র), 1, ফাইল)) {
printf("%-3d %-12s %-5d %-6.1f %-7.1f %-6.1f %-5.1f %-4.1f %s\n",
কাউন্ট, s.নাম, s.রোল, s.বাংলা, s.ইংরেজি, s.গণিত, s.মোট, s.গড়, s.গ্রেড);
কাউন্ট++;
}
printf("--------------------------------------------------------\n");
fclose(ফাইল);
}
🔍 খেয়াল করো: "rb" মোড ব্যবহার করেছি (Read Binary)।
🏠 ধাপ ৫: মেইন মেনু (যুদ্ধের সেনাপতি)
এবার সব ফাংশনকে একসাথে ডাকার জন্য মেইন ফাংশনে একটা ইনফিনিট লুপ চালাবো। ইউজার ১ চাপলে ডেটা যোগ হবে, ২ চাপলে সব দেখা যাবে, ৩ চাপলে প্রোগ্রাম বন্ধ হবে।
text
int main() {
int চয়েস;
printf("🎓 মার্কশিট ম্যানেজমেন্ট সিস্টেমে স্বাগতম!\n");
while (1) {
printf("\n📌 মেনু:\n");
printf("1. নতুন ছাত্রের ডেটা যোগ করুন\n");
printf("2. সব ছাত্রের মার্কশিট দেখুন\n");
printf("3. প্রোগ্রাম বন্ধ করুন\n");
printf("আপনার পছন্দ (1-3): ");
scanf("%d", &চয়েস);
switch (চয়েস) {
case 1:
ডেটা_যোগ();
break;
case 2:
সব_দেখা();
break;
case 3:
printf("👋 ধন্যবাদ! প্রোগ্রাম বন্ধ হচ্ছে...\n");
return 0;
default:
printf("⚠️ ভুল ইনপুট! 1, 2 অথবা 3 চাপুন।\n");
}
}
return 0;
}
🔥 সম্পূর্ণ কোড (একসাথে)
নিচে পুরো প্রোগ্রামের কমপ্লিট কোড দেওয়া হলো। তুমি Code::Blocks বা Dev-C++ এ কপি করে রান করো।
text
#include <stdio.h>
#include <string.h>
struct ছাত্র {
char নাম[৫০];
int রোল;
float বাংলা, ইংরেজি, গণিত;
float মোট, গড়;
char গ্রেড[৩];
};
void গ্রেড_নির্বাচন(struct ছাত্র *s) {
s->মোট = s->বাংলা + s->ইংরেজি + s->গণিত;
s->গড় = s->মোট / 3;
if (s->গড় >= 80) strcpy(s->গ্রেড, "A+");
else if (s->গড় >= 70) strcpy(s->গ্রেড, "A");
else if (s->গড় >= 60) strcpy(s->গ্রেড, "B");
else if (s->গড় >= 50) strcpy(s->গ্রেড, "C");
else if (s->গড় >= 40) strcpy(s->গ্রেড, "D");
else strcpy(s->গ্রেড, "F");
}
void ডেটা_যোগ() {
struct ছাত্র s;
FILE *ফাইল;
ফাইল = fopen("মার্কশিট.dat", "ab");
if (ফাইল == NULL) {
printf("❌ ফাইল খোলা যায়নি!\n");
return;
}
printf("\n📝 নতুন ছাত্রের তথ্য দিন:\n");
printf("নাম: ");
scanf(" %[^\n]", s.নাম);
printf("রোল নম্বর: ");
scanf("%d", &s.রোল);
printf("বাংলা নম্বর: ");
scanf("%f", &s.বাংলা);
printf("ইংরেজি নম্বর: ");
scanf("%f", &s.ইংরেজি);
printf("গণিত নম্বর: ");
scanf("%f", &s.গণিত);
গ্রেড_নির্বাচন(&s);
fwrite(&s, sizeof(struct ছাত্র), 1, ফাইল);
fclose(ফাইল);
printf("✅ ডেটা সফলভাবে সেভ হয়েছে!\n");
}
void সব_দেখা() {
struct ছাত্র s;
FILE *ফাইল;
int কাউন্ট = 1;
ফাইল = fopen("মার্কশিট.dat", "rb");
if (ফাইল == NULL) {
printf("❌ এখনো কোনো ডেটা সেভ নেই!\n");
return;
}
printf("\n📊 সব ছাত্রের মার্কশিট:\n");
printf("-----------------------------------------------------------------------\n");
printf("ক্রম নাম রোল বাংলা ইংরেজি গণিত মোট গড় গ্রেড\n");
printf("-----------------------------------------------------------------------\n");
while (fread(&s, sizeof(struct ছাত্র), 1, ফাইল)) {
printf("%-3d %-12s %-5d %-6.1f %-7.1f %-6.1f %-5.1f %-4.1f %s\n",
কাউন্ট, s.নাম, s.রোল, s.বাংলা, s.ইংরেজি, s.গণিত, s.মোট, s.গড়, s.গ্রেড);
কাউন্ট++;
}
printf("-----------------------------------------------------------------------\n");
fclose(ফাইল);
}
int main() {
int চয়েস;
printf("🎓 মার্কশিট ম্যানেজমেন্ট সিস্টেমে স্বাগতম!\n");
while (1) {
printf("\n📌 মেনু:\n");
printf("1. নতুন ছাত্রের ডেটা যোগ করুন\n");
printf("2. সব ছাত্রের মার্কশিট দেখুন\n");
printf("3. প্রোগ্রাম বন্ধ করুন\n");
printf("আপনার পছন্দ (1-3): ");
scanf("%d", &চয়েস);
switch (চয়েস) {
case 1:
ডেটা_যোগ();
break;
case 2:
সব_দেখা();
break;
case 3:
printf("👋 ধন্যবাদ! প্রোগ্রাম বন্ধ হচ্ছে...\n");
return 0;
default:
printf("⚠️ ভুল ইনপুট! 1, 2 অথবা 3 চাপুন।\n");
}
}
return 0;
}
🏠 তোমার জন্য হোমওয়ার্ক (প্রজেক্ট এক্সটেনশন)
প্রোগ্রামটা বেসিক। এখন তুমি এতে নতুন ফিচার যোগ করো:
- রোল অনুযায়ী খোঁজ (Search): ইউজার রোল দিলে শুধু ওই ছাত্রের ডেটা দেখাও।
- ডেটা ডিলিট: কোনো ছাত্রের ডেটা মুছে ফেলার ব্যবস্থা করো (চ্যালেঞ্জিং! একটি টেম্প ফাইল বানিয়ে বাদ দিয়ে বাকিগুলো কপি করতে হবে)।
- পাস/ফেইল কাউন্ট: সব ডেটা পড়ার সময় কতজন পাস আর কতজন ফেইল করেছে, তা প্রিন্ট করো।
🎯 তোমার যাত্রার শেষ কথা
আজ তুমি শুধু কোড শেখোনি, তুমি বানিয়ে ফেললে একটা রিয়েল-ওয়ার্ল্ড অ্যাপ্লিকেশন! স্কুলের মার্কশিট, ছোট ব্যবসার ইনভেন্টরি, এমনকি তোমার পছন্দের গেমের হাইস্কোর ট্র্যাকার—তুমি এখন এগুলো নিজেই বানাতে পারবে।
মনে রেখো: প্রোগ্রামিং শেখার শেষ নেই। C ভাষা শেষ করলেও, এখন তোমার পথ খোলা—
- 🐍 Python (ডেটা সায়েন্স, এআই)
- ☕ Java (অ্যান্ড্রয়েড অ্যাপ)
- 🌐 Web Development (HTML, CSS, JavaScript)
- 🎮 Game Development (Unity, C#)
কিন্তু C-এর এই মজবুত ভিত্তি তোমাকে সব জায়গায় এগিয়ে রাখবে।
📢 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 প্রোগ্রামিং – শেষ পাতা নয়, নতুন দিগন্ত! (রিক্যাপ ও ক্যারিয়ার রোডম্যাপ)
