সি প্রোগ্রামিং ইনুমিরেশন - C programming Enumeration
এই অধ্যায়ে আপনি সি প্রোগ্রামিং ইনুমিরেশন(enumeration) নিয়ে কাজ করা শিখবেন। এছাড়া সি প্রোগ্রামিং এ enum
সচরাচর কোথায় ব্যবহৃত হয় তাও জানবেন।
সি প্রোগ্রামিং ইনুমিরেশন
সি প্রোগ্রামিং এ enumeration হলো ইউজার ডিফাইন্ড ডেটা টাইপ(user-defined data type) যা অখণ্ড পূর্ণসংখ্যা(integral constants) নিয়ে গঠিত হয়। ইনুমেরেশন(enumeration) ডিফাইন্ড করার জন্য enum
কীওয়ার্ড ব্যবহৃত হয়।
enum flag { constant1, constant2, ..., constantN };
এখানে flag হলো ইউজার ডিফাইন্ড ডেটা টাইপ
এবং constant1, constant2,...., constantN হলো flag টাইপের ভ্যালু।
ডিফল্টভাবে constant1 এর ভ্যালু 0, constant2 এর ভালু 1 এবং এভাবে চলতে থাকবে। আপনার প্রয়োজনে আপনি enum এলিমেন্টের ডিফল্ট ভ্যালু পরিবর্তন করতে পারেন।
অর্থাৎ আপনি চাইলে enum
এলিমেন্টের ইন্ডেক্স পরিবর্তন করতে পারেন।
// enum এর ডিফল্ট ভ্যালু পরিবর্তন
enum color {
red = 0,
green = 3,
black = 5,
white = 3,
};
সি প্রোগ্রাম Enum টাইপ ডিক্লেয়ারেশন
আপনি যখন enum টাইপের ভ্যারিয়েবল তৈরি করেন তখন শুধুমাত্র ভ্যারিয়েবলের ব্লুপ্রিন্ট(blueprint) তৈরি হয়। নিচে enum টাইপের ভ্যারিয়েবল তৈরির পদ্ধতি দেখানো হলো
enum boolean { false, true };
enum boolean security;
এখানে enum boolean
টাইপের একটি security ভ্যারিয়েবল তৈরি হয়েছে।
এখানে ভিন্ন সিনট্যাক্স ব্যবহার করে একই security ভ্যারিয়েবল তৈরি করা হয়ছে।
enum boolean { false, true } security;
উদাহরনঃ enum টাইপের ব্যবহার
#include <stdio.h>
enum week { sunday, monday, tuesday, wednesday, thursday, friday, saturday };
int main()
{
enum week today;
today = tuesday;
printf("Today %d",today);
return 0;
}
আউটপুট
Today 2
উপরের প্রোগ্রামে “week” কে ভ্যারিয়েবল হিসাবে ডিক্লেয়ার করা হয়েছে এবং tuesday কে “week” এর জন্য বরাদ্দ করা হয়েছে। তাই আমরা 2 আউটপুট পেয়েছি।
উদাহরনঃ enum টাইপ ব্যবহারের আরোও একটি উদাহরণ
#include<stdio.h>
enum year{Jan, Feb, Mar, Apr, May, Jun, Jul,
Aug, Sep, Oct, Nov, Dec};
int main()
{
int i;
for (i=Jan; i<=Dec; i++)
printf("%d ", i);
return 0;
}
আউটপুট
0 1 2 3 4 5 6 7 8 9 10 11
উপরের প্রোগ্রামে Jan এর ইনিশিয়াল(initial) ভ্যালু 0 এবং Dec এর 11 হওয়ায় i = 0 থেকে i = 11 পর্যন্ত for লুপ রান(run) করবে।
সি প্রোগ্রামিং এ enum কেন ব্যবহৃত হয়?
সম্ভাব্য অনেক ভ্যালুর বিপরীতে Enum ভ্যারিয়েবল কেবল মাত্র একটি ভ্যালু গ্রহণ করে। নিচে উদাহরণের সাহায্যে ব্যাখ্যা করা হলোঃ
#include <stdio.h>
enum suit {
club = 0,
diamonds = 10,
hearts = 20,
spades = 3
} card;
int main()
{
card = club;
printf("Size of enum variable = %d bytes", sizeof(card));
return 0;
}
আউটপুট
Size of enum variable = 4 bytes
ইহার কারণ integer এর সাইজ হলো 4 বাইট।
একই কাজ আপনি স্ট্রাকচার ব্যবহার করেও করতে পারেন। যাইহোক enum এর ব্যবহার আপনার কাজকে সহজ করে দিবে এবং যোগ্য প্রোগ্রামারের পরিচয় মিলবে।
কিভাবে আপনি flags এর জন্য enum ব্যবহার করবেন?
flags(পতাকা) নিয়ে কাজ করার জন্য enum হতে পারে উত্তম পন্থা।
নিচে উদাহরণের সাহায্যে ব্যাখ্যা করা হলো
enum designFlags {
italics = 1,
border = 2,
color = 4
} button;
ধরুন আপনি উইন্ডোজ এপ্লিকেশনের জন্য একটি বাটন ডিজাইন করতে চাচ্ছেন। আপনি টেক্সট নিয়ে কাজ করার জন্য border, italics এবং color ফ্ল্যাগ(flag) সেট করতে পারেন।
উপরের প্রোগ্রাম(pseudocode) এ সকল অখণ্ড পূর্ণসংখ্যা(integral constant) কেন দুই এর সূচক তার একটি নির্দিষ্ট কারণ রয়েছে।
// বাইনারি মান italics = 0000 0001 border = 0000 0010 color = 0000 0100
উপরের উদাহরনে অখণ্ড পূর্ণসংখ্যা যেহেতু ২ এর সূচক সুতরাং আপনি কোনো ধরণের দুশ্চিন্তা ছাড়াই বিটওয়াইজ OR(|) অপারেটর নিয়ে একই সঙ্গে দুই বা তার অধিক ফ্ল্যাগের সমন্বয় ঘটাতে পারেন।
নিচে উদাহরণের সাহায্যে ব্যাখ্যা করা হলোঃ
#include <stdio.h>
enum designFlags {
border = 1,
italics = 2,
color = 4
};
int main() {
int myDesign = border | color;
// 00000001
// | 00000100
// __________
// 00000101
printf("%d", myDesign);
return 0;
}
আউটপুট
5
যখন আউটপুট 5 হবে তখন আপনি অবশ্যই জানবেন যে, এখানে border এবং color ব্যবহৃত হয়েছে। কারণ border=1 এবং color=4 অর্থাৎ 4+1=5
এছাড়া আপনার প্রয়োজনেও আপনি flag যোগ করতে পারেন।
if (myDesign & italics) { // italics এর জন্য ব্যবহৃত কোড }
এখানে আমরা আমাদের ডিজাইনে italics যোগ করেছি। লক্ষ্য করলে দেখবেন শুধুমাত্র italics এর কোড if স্টেটমেন্টের মধ্যে লেখা হয়েছে।
সি প্রোগ্রামিং এ আপনি সবকিছু ইনুমিরেশন(enumeration) ছাড়াই করতে পারেন। কিন্তু কিছু কিছু পরিস্থিতিতে ইহা প্রোগ্রামকে সহজ করে দেয়। আর ইহাই দক্ষ প্রোগ্রামারদের মধ্যে পার্থক্য সৃষ্টি করে।
enum ইনিশিয়ালাইজেশনে কিছু গুরত্বপূর্ণ তথ্য
- দুটি enum এর নামে একই ভ্যালু থাকতে পারে।
উদাহরনঃ নিচের প্রোগ্রামে ‘Failed’ এবং ‘Freezed’ উভয়ের ভ্যালুই 0(শূন্য)।
#include <stdio.h> enum State {Working = 1, Failed = 0, Freezed = 0}; int main() { printf("%d, %d, %d", Working, Failed, Freezed); return 0; }
আউটপুট
1, 0, 0
- আমরা যদি বাহ্যকিভাবে enum কনস্ট্যান্টে কোনো ভ্যালু এসাইন না করি তাহলে কম্পাইলার ডিফল্টভাবে ইনডেক্স 0(শূন্য) দিয়ে শুরু করে ভ্যালু এসাইন(assaign) করে।
উদাহরনঃ নিচের সি প্রোগ্রামে enum কনস্ট্যান্ট sunday এর ভ্যালু 0, monday এর ভ্যালু 1 এসাইন হবে এবং এভাবে চলতে থাকবে।
#include <stdio.h> enum day {sunday, monday, tuesday, wednesday, thursday, friday, saturday}; int main() { enum day d = friday; printf("The day number stored in d is %d", d); return 0; }
আউটপুট
The day number stored in d is 5
- কিছু কনস্ট্যান্টে আমরা যেকোনো অর্ডারের ভ্যালু এসাইন(assign) করতে পারি। যেসকল কনস্ট্যান্টে ভ্যালু এসাইন করা হয়না তারা পূর্ববর্তী ভ্যালুর সাথে এক যোগ করে ভ্যালু নিয়ে নেয়।
উদাহরনঃ নিচের প্রোগ্রামে
#include <stdio.h> enum day {sunday = 1, monday, tuesday = 5, wednesday, thursday = 10, friday, saturday}; int main() { printf("%d %d %d %d %d %d %d", sunday, monday, tuesday, wednesday, thursday, friday, saturday); return 0; }
আউটপুট
1 2 5 6 10 11 12
- enum কনস্ট্যান্টে এসাইনকৃত ভ্যালু অবশ্যই অখণ্ড পূর্ণসংখ্যর(integeral constant) হতে হবে। অর্থাৎ এসাইনকৃত ভ্যালু অবশ্যই একটি সম্ভাব্য সর্বনিম্ন পূর্ণসংখ্যা থেকে সর্বোচ্চ পূর্ণসংখ্যার পরিসর(range) এর মধ্যে থাকতে হবে।
- স্ব-স্ব স্কোপে(scope) সকল enum কনস্ট্যান্ট(constant)-কে অবশ্যই অনন্য(unique) হতে হবে।
উদাহরনঃ নিচের প্রোগ্রামটি কম্পাইলে ব্যর্থ হয়।
enum state {working, failed}; enum result {failed, passed}; int main() { return 0; }
আউটপুট
Compile Error: 'failed' has a previous declaration as 'state failed'