লেখক পরিচিতি
লেখকের নাম:
আহমেদ ওয়াহিদ মাসুদ
মোট লেখা:৯৮
লেখা সম্পর্কিত
সহজ ভাষায় প্রোগ্রামিং : অ্যাডভান্সড সি
সি-কে প্রোগ্রামিংয়ের মাদার ল্যাঙ্গুয়েজ বলা হয়। সি প্রোগ্রামিং ল্যাঙ্গুয়েজ দিয়ে আধুনিক সফটওয়্যারও বানানো সম্ভব। এ লেখায় অ্যাডভান্সড সি-এর কিছু ফিচার তুলে ধরা হয়েছে।
scanf() ও ফরম্যাট স্পেসিফায়ারের অ্যাডভান্সড ব্যবহার : scanf() ফাংশন দিয়ে কোনো ডাটা ইনপুট নেয়া হয়। কিন্তু বিভিন্ন টাইপের ভেরিয়েবলের জন্য ভিন্ন ধরনের কোড লিখতে হয়। scanf() ফাংশনের ভেতরে একটা format_specifier দিতে হয়, যাতে কম্পাইলার বুঝতে পারে যে ইউজার কোন ধরনের ডাটা ইনপুট দিচ্ছে। একটি int টাইপের ভেরিয়েবলের ইনপুট নেয়ার স্টেটমেন্ট হলো scanf(‘‘%d’’,&a); এখানে ডাবল কোটেশনের ভেতরে %d ব্যবহার করা হয়েছে এবং এর মাধ্যমেই কম্পাইলার বুঝতে পারে কোন টাইপের ডাটা ইনপুট দেয়া হচ্ছে। char-এর জন্য %c, int-এর জন্য %d, float, double-এর জন্য %f ব্যবহার করা হয়। আর a ভেরিয়েবলের আগে যে & ব্যবহার করা হয়েছে, এর নাম অ্যাড্রেস অপারেটর। এর মাধমে a ভেরিয়েবলটির জন্য মেমরিতে যে অ্যাড্রেস নির্ধারণ করা হয়েছে, তা কম্পাইলারকে জানানো হয়।
তবে এসব ফরম্যাট স্পেসিফায়ার ছাড়াও কিছু ফরম্যাট ব্যবহার করা যায়।
যেমন : %[a-z], এটি দিয়ে কোনো স্ট্রিংয়ের শুধু ধ থেকেু-এর মধ্যবর্তী ক্যারেক্টার ইনপুট নেয়া যায়।
%[^a-z], এর মাধ্যমে a থেকেু-এর মধ্যবর্তী ক্যারেক্টার ছাড়া অন্য যেকোনো ক্যারেক্টার দিয়ে তৈরি স্ট্রিং ইনপুট নেয়া যায়।
%[]], শুধু ] ক্যারেক্টার দিয়ে তৈরি স্ট্রিংয়ের জন্য এই স্পেসিফায়ার ব্যবহার করতে হবে।
%[^]], এখানে ] ক্যারেক্টার না পাওয়া পর্যন্ত অন্য ক্যারেক্টার দিয়ে স্ট্রিং তৈরি করা যাবে।
%[-a-eu-z], শুধু a থেকে e এবং u থেকেু পর্যন্ত ক্যারেক্টার দিয়ে তৈরি স্ট্রিংয়ের জন্য এই ফরম্যাট ব্যবহার হয়।
c, মোট ২০টি ক্যারেক্টার দিয়ে (নাল ক্যারেক্টারসহ) স্ট্রিং তৈরি করা যাবে।
%[^.-], ডট (.) কিংবা মাইনাস (-) না পাওয়া পর্যন্ত অন্য যেকোনো ক্যারেক্টার দিয়ে স্ট্রিং তৈরির জন্য এই ফরম্যাট স্পেসিফায়ার ব্যবহার হয়।
ডাটা টাইপ এক্সটেনশন : যেকোনো প্রোগ্রামারের কাছে ডাটা টাইপ খুব পরিচিত একটি বিষয়। এটি নিয়ে আগেও অনেক আলোচনা করা হয়েছে। কিন্তু সি ল্যাঙ্গুয়েজের অ্যাডভান্সড ফিচার হিসেবে ডিফল্ট ডাটা টাইপের সাথে তাদের কিছু এক্সটেনশনও রাখা হয়েছে।
প্রথমে ডাটা টাইপ সম্পর্কে একটি সংক্ষিপ্ত বিবরণ দেয়া হলো। ডাটা টাইপ হলো একটি ভেরিয়েবল কী ধরনের ডাটা নিয়ে কাজ করবে, তা ঠিক করে দেয়। যেমন- কোনো ভেরিয়েবলের ডাটা হতে পারে কোনো পূর্ণ সংখ্যা (যেমন- ৪২, ৫৩ ইত্যাদি), কোনো ভগ্নাংশ (যেমন- ৮.১৪ ইত্যাদি) অথবা কোনো অক্ষর বা character (যেমন- ধ,ন,প ইত্যাদি)। সি-তে প্রধানত চার ধরনের ডাটা টাইপ থাকে। এগুলো হলো- character (লিখতে হয় char), integer (লিখতে হয় int), float, double। এখন দেখা যাক, কোন ডাটা টাইপের জন্য মেমরিতে কী পরিমাণ জায়গা নির্ধারণ করা হয়। পযধৎ টাইপ ডাটার জন্য ১ বাইট নির্ধারণ হয় এবং এ ধরনের ভেরিয়েবলে শুধু character রাখা যায়। int টাইপ ডাটার জন্য ২ বাইট নির্ধারণ হয় এবং এ ধরনের ভেরিয়েবলে শুধু পূর্ণ সংখ্যা রাখা যায়। কিন্তু এই সংখ্যার মানের একটি লিমিট আছে। ৩২ বিটে কাজ করলে একেটটা ভেরিয়েবলে -৩২৭৬৮ থেকে +৩২৭৬৭ পর্যন্ত মান রাখা যায়। এটি বের করার একটি সূত্র আছে। তা হলো 2^n থেকে 2^n-১ পর্যন্ত। এখানে হ হলো মোট বিটসংখ্যা। একটি int টাইপ ভেরিয়েবল মোট ২ বাইট (১৬ বিট) জায়গা নেয়, তাহলে একটি সাধারণ রহঃ ভেরিয়েবলের মানের সীমা 2^15 থেকে 2^15-1 পর্যন্ত। এখানে খেয়াল রাখতে হবে, ভেরিয়েবল যদিও ১৬ বিট জায়গা নিচ্ছে, কিন্তু সেটি ব্যবহার করছে ১৫ বিট এবং সবার বাম দিকের ১টি বিট ব্যবহার করা হয় ভেরিয়েবলটির মান ধনাত্মক না ঋণাত্মক সেটা নির্ধারণ করার জন্য। float-এর জন্য ৪ বাইট নির্ধারণ হয় এবং এতে ভগ্নাংশ রাখা যায়। double-এও ভগ্নাংশ রাখা যায়, তবে তা ৮ বাইট জায়গা নেয়।
এই মূল চারটি ডাটা টাইপ ছাড়া আরও পাঁচটি এক্সটেনশন আছে। যেমন : size_t, ptrdiff_t, clock_t, time_t, jmp_buff। ংরুবড়ভ এক্সপ্রেশনের রেজাল্ট রাখার জন্য size_t টাইপের ভেরিয়েবল ব্যবহার করা হয়। দুটো পয়েন্টারের বিয়োগফল রাখার জন্য ptrdiff_t টাইপ ভেরিয়েবল ব্যবহার হয়। clock_t টাইপ ভেরিয়েবলের কাজ হলো clock() ফাংশনের আউটপুট রাখা। time() ফাংশনের আউটপুট রাখার জন্য time_t টাইপ ভেরিয়েবল ব্যবহার করা যায়। আর setjmp() ম্যাক্রোর মাধ্যমে সেট করা এনভায়রনমেন্টকে রাখার জন্য ডিক্লেয়ার করা হয় jmp_buf। উদাহরণ হিসেবে কোনো অ্যারের সাইজ নেয়ার জন্য এভাবে ভেরিয়েবল ব্যবহার করা যেতে পারে,
size_t arraySize=sizeof(array);
স্ট্রিং লিটারেলস : স্ট্রিং ডিক্লেয়ারের অনেক ধরনের পদ্ধতি দেখানো হয়েছে। এর মাঝে একটি হলো ক্যারেক্টার অ্যারে ডিক্লেয়ার করে সেখানে সরাসরি স্ট্রিং অ্যাসাইন করে দেয়া। এ ক্ষেত্রে অনেকগুলো স্ট্রিং যদি একসাথে পাশাপাশি রেখে অ্যাসাইন করা হয়, তাহলে কম্পাইল করার সময় তা আসলে একটি স্ট্রিং হিসেবে গণনা করা হয়। যেমন :
char name[]=”MD” “Kamruzzaman”;
printf(“name: %s”,name);
এ ক্ষেত্রে আউটপুট আসবে MD Kamruzzaman, অর্থাৎ দুটি স্ট্রিং একসাথে অ্যাসাইন হয়ে গেছে।
অ্যাডভান্সড এক্সপ্রেশন : অপারেটর, কনস্ট্যান্ট এবং ভেরিয়েবলের সঠিকভাবে প্রোগ্রামে উপস্থাপনের মাধ্যমে এক্সপ্রেশন তৈরি করা হয়। যেমন : int a,b=১০; a=b; এখানে প্রথম লাইনে দুটি ভেরিয়েবল a এবং b ডিক্লেয়ার করা হয়েছে, যেখানে ন-এর মান ১০ নির্ধারণ করে দেয়া হয়েছে। দ্বিতীয় লাইনে ন-এর মান ধ-এর জন্য নির্ধারণ করা হয়েছে। এখানে দ্বিতীয় লাইনটি একটি এক্সপ্রেশন। অর্থাৎ সি-তে কোনো ভ্যালিড লাইনকেই এক্সপ্রেশন বলা যায়। তবে এ এক্সপ্রেশন অনেক জটিল হতে পারে। তখন তাকে অ্যাডভান্সড এক্সপ্রেশন বলে। যেমন :
((x+10)+y), এই এক্সপ্রেশনের মান হবে একটি সংখ্যা।
(x||10), এই এক্সপ্রেশনের মান হবে ১।
(x==10)?১০০:২০০, এই এক্সপ্রেশনের মান হবে ১০০ অথবা ২০০।
৭০-৩, এই এক্সপ্রেশনের মান হবে ৬৭।
“Programing” এই এক্সপ্রেশনের মান হবে “programing”-এর অ্যাড্রেস।
Lvalues I Rvalues : এলভ্যালু হলো এমন এক্সপ্রেশন, যা সাধারণত পরিবর্তন করা যাবে এমন মেমরি অবজেক্টকে উপস্থাপন করে। ভেরিয়েবল, অ্যারে এলিমেন্ট, স্ট্রাকচার, পয়েন্টার প্রভৃতি হলো এলভ্যালু। এটি যে মেমরি অবজেক্টকে পয়েন্ট করে, তার ডাটা প্রয়োজনে পরিবর্তন করা যায়। যেমন :
intX=10;
i=intX++;
ptrArray=array;
*ptrArray=10;
array[1]=intX;
structure.member1=i;
ptrStructure=&structure;
এখানে বোল্ড লেখাগুলো এলভ্যালু। অন্যদিকে আরভ্যালু হলো এমন মেমরি অবজেক্ট, যার ডাটা পরিবর্তন করা যায় না। ফলে আরভ্যালুকে অ্যাসাইন অপারেটরের বাম দিকে ব্যবহার করা যায় না। সাবস্ক্রিপ্ট ছাড়া অ্যারের নাম এবং ফাংশনের নাম হলো আরভ্যালু। আবার অ্যাড্রেস অপারেটরের সাথে ব্যবহার করা কোনো আইডেন্টিফায়ার হলো আরভ্যালু। প্রোগ্রামে আরভ্যালুকে এলভ্যালু হিসেবে ব্যবহার করলে কম্পাইলার এরর দেখাবে। যেমন :
char ch[28];
ch=”abc”;
এখানে পয হলো আরভ্যালু এবং একে অ্যাসাইন অপারেটরের বাম পাশে ব্যবহার করা যাবে না।
সাইড ইফেক্ট : কোনো এক্সপ্রেশনের একটা সাব এক্সপ্রেশন ইভালুয়েট করার ফলে অন্য সাব এক্সপ্রেশনের ডাটা পরিবর্তিত হওয়াকে সাইড ইফেক্ট বলে। যেমন :
x=array[i++] + i++;
এখানে i++ সাব এক্সপ্রেশন হলো সাইড ইফেক্ট। এ ক্ষেত্রে ভিন্ন ভিন্ন কম্পাইলারী-এর জন্য ভিন্ন ভিন্নভাবে ডাটা নির্ধারণ করবে। ফলে প্রোগ্রামে কাঙিক্ষত আউটপুট হয়তো পাওয়া যাবে না। তাই প্রোগ্রামে এ ধরনের সাব এক্সপ্রেশন ব্যবহার না করাই ভালো।
অর্ডার অব ইভ্যালুয়েশন : কোনো এক্সপ্রেশনের মান বের করার জন্য তথা এক্সপ্রেশনকে ইভ্যালুয়েট করতে সাধারণত অপারেটরের প্রিসিডেন্স ও অ্যাসোসিয়েটিভিটি ব্যবহার করা হয়। তবে কিছু কিছু এক্সপ্রেশন আছে, যাদেরকে ইভ্যালুয়েট করার কোনো অ্যান্সি স্ট্যান্ডার্ড নেই। ফলে এই এক্সপ্রেশনগুলোত মান একেক কম্পাইলারে একেক ধরনের হতে পারে। যেমন :
x=1;
printf(“%d %d”, x++,x);
এখানে আউটপুট ১ ২ অথবা ১ ১ যেকোনো একটি হতে পারে।
ট্রাইগ্রাফ : সি-এর কিছু কিছু ক্যারেক্টার আছে যেগুলো কিছু কিছু দেশের কিবোর্ডে ব্যবহার হয় না। যেমন : [,],{,} ইত্যাদি। তাই এসব কিবোর্ডে এই ক্যারেক্টারগুলো লেখার জন্য অ্যান্সি একটি উপায় বের করেছে, যার নাম ট্রাইগ্রাফ সিকোয়েন্স। এ ক্ষেত্রে দুটো প্রশ্নবোধক চিহ্নের পর অন্য একটি ক্যারেক্টার ব্যবহার করে এ ধরনের ক্যারেক্টার তৈরি করা যায়। যেমন- যেসব কিবোর্ডে # নেই, সেসব কিবোর্ড দিয়ে প্রোগ্রাম লেখার সময় ??= দিয়ে # এর কাজ করা যায়, যা নিচে দেখানো হলো,
??=define PI 3.1415
এখানে কম্পাইলার ??= কে # হিসেবে বিবেচনা করবে। অ্যান্সি সি-তে মোট নয়টি এ ধরনের সিকোয়েন্স ডিফাইন করা আছে।
সি ল্যাঙ্গুয়েজে অনেক অ্যাডভান্সড ফিচার আছে। একটি পরিপূর্ণ সফটওয়্যার বানাতে হলে একজন প্রোগ্রামারের এসব অ্যাডভান্সড ফিচার জানা অতি প্রয়োজনীয়।
ফিডব্যক : wahid_cseaust@yahoo.com