আজ আমরা
সি প্রোগ্রামিং এর সবথেকে সুন্দর ফিচার ফাংশন সম্পর্কে জানব।
মনে করো
আমাদের একটা বুক সেলফ বানানো দরকার। তো কি করব? প্রথমে বাগান থেকে একটা গাছ
চুরি করে কেটে আনব। তারপর সেটাকে দেব ছ মিলে। ছ মিল আমার কাছ থেকে গাছটা নিয়ে ফেরত
দেবে কাঠ। তারপর কাঠগুলো আমরা দেব ফার্নিচার মার্ট এ। ফার্নিচার মার্ট আমাদের কাছ
থেকে কাঠগুলো নিয়ে ফেরত দেবে আমাদের কাঙ্ক্ষিত বুক সেলফ। তাই নয় কি? হুমম??
ছ মিল বা
ফার্নিচার মার্ট কে আমরা একেকটা ফাংশন হিসেবে কল্পনা করতে পারি। ছ মিলের ফাংশন
ইনপুট হিসেবে নিয়েছে গাছ এবং আউটপুট হিসেবে দিয়েছে কাঠ। আর ফার্নিচার মার্টের
ফাংশন ইনপুট হিসেবে নিয়েছে কাঠ আর আউটপুট হিসেবে দিয়েছে বুক সেলফ। একটা ফাংশনের
আউটপুট অন্য একটা ফাংশনের ইনপুট হতেই পারে।
তো ফার্নিচার
মার্টের মালিক আমার ঘনিষ্ঠ আত্মীয়। তিনি বললেন যে, একটা বুক সেলফই তো! তিনি আমাকে
ফ্রি দিয়ে দিলেন। মানে এক্ষেত্রে তিনি ইনপুট হিসেবে কিছু নিলেন না কিন্তু আউটপুট
ঠিকই দিলেন।
কিছুদিন পর তিনি আমাকে বললেন, ‘বাবা তুমি তো চুরিবিদ্যায় পটু, তো তুমি
আমাকে একটা গাছ চুরি করে এনে দাও না। ফার্নিচার মার্টের জন্য একটা রুম বানাতে হবে।’
তো আমি তাকে একটা গাছ চুরি করে এনে দিলাম আর বললাম, আপনি আমাকে বুক সেলফ দিয়েছেন,
আমি আপনার কাছ থেকে কোন টাকা নিতে পারবনা। মানে আমি ইনপুট হিসেবে দেব গাছ আর উনি
গাছটা প্রসেস করে ফার্নিচার মার্টের জন্য একটা রুম বানাবে এবং আউটপুট হিসেবে কিছু
থাকবে না।
মানে
একটা ফাংশনের ইনপুট থাকলেই যে আউটপুট থাকবে তা নয়। আবার আউটপুট থাকলে যে ইনপুট
থাকবে তাও নয়।
সি
প্রোগ্রামিং এ আমরা হামেশাই printf(); ফাংশনটা
ইউস করে থাকি। এই ফাংশনটা কি করে? প্রিন্ট করে। কিন্তু আমরা কি জানি যে printf(); লিখলেই কেন প্রিন্ট করে?
কম্পিউটার
তো আর ইংরেজি বোঝে না যে সে বলবে ও!!! print বলেছে তো, প্রিন্ট করে দেই।
আসলে এটা একটা
লাইব্রেরী ফাংশন। ফাংশনটা কিভাবে কাজ করবে তা লেখা আছে stdio.h হেডার ফাইল এ। আবার কিছু ফাংশন আছে যেগুলো কিভাবে
কাজ করবে তা আমরা ইউসাররা বলে দেই। সেগুলোকে বলা হয় ইউসার ডিফাইনড ফাংশন।
ফাংশন
দুই প্রকার।
১।
লাইব্রেরী ফাংশন।
২। ইউসার
ডিফাইনড ফাংশন।
লাইব্রেরী
ফাংশন নিয়ে আমাদের কোন চিন্তা নেই। সেগুলো তৈরি করাই আছে। এখন আমরা ইউসাররা ফাংশন
তৈরি করব।
ফাংশন
তৈরি করার জন্য ফাংশনের একটা নাম চাই। তো নাম দিলাম function_name. ফাংশনের নামের
পর () দিতে হয়। এরপর দরকার ফাংশনের একটা রিটার্ন টাইপ যা ফাংশনের নামের আগে থাকে। মনে
করি রিটার্ন টাইপ হল return_type.
আর কি?
হুম মনে পরেছে। আর থাকে ফাংশন বডি। ফাংশন বডি হল {} এর মাঝের অংশ।
তাহলে
আমাদের বানানো ফাংশনের চেহারাটা এরকম-
return_type
function_name()
{
}
ফাংশনটা
যদি কোন কিছু রিটার্ন না করে তবে return_type এর জায়গায় void বসবে।
আর যদি
কোন কিছু রিটার্ন করে তবে return_type
এর
জায়গায় ওই ডাটার টাইপ টা বসবে আর ফাংশন বডির শেষ স্টেটমেন্ট টা হবে এরকম-
return var;
এখানে var হল সেই ভেরিয়েবল যার মান ফাংশনটার রিটার্ন করার
কথা। main() ফাংশনের আগে আমাদের বানানো ফাংশনটা থাকতে হবে। আর
তা না হলে কম্পাইলারকে জানিয়ে দিতে হবে যে অমুক নামের একটা ফাংশন আছে main() ফাংশনের পরে যেটা আমরা বানিয়েছি। সেটা বলার জন্য
ফাংশনটার প্রোটোটাইপ বলে দিতে হবে।
একটা
ফাংশনের প্রোটোটাইপ হল ওই ফাংশনের বডি বাদে সবটুকু। ওপরের ফাংশনের প্রোটোটাইপ হল-
return_type
function_name();
এখানে ;
দিয়েছি কারন এটার মাধ্যমে একটা ইন্সট্রাকশন দিচ্ছি।
এখন
আমাদের বানানো ফাংশনটাকে কল করতে হলে শুধু
function_name();
লিখলেই
হবে। ফাংশনটাকে কল করলে প্রোগ্রামের control ওই ফাংশন এ চলে যাবে এবং ফাংশন বডিতে থাকা
স্টেটমেন্ট গুলো execute হবে। তারপর আবার প্রোগ্রামের control সেই ফাংশন এ চলে যাবে যে ফাংশন থেকে ফাংশনটা কল
করা হয়েছিল।
ফাংশন এ কোন ডাটা পাঠাতে হলে তা () এর মধ্যে লিখতে হয়।
int
function(int x,int y)
{
int z;
z=x+y;
return z;
}
int main()
{
int a,b,c;
a=1,b=2;
c=function(a,b);
printf("%d",c);
return 0;
}
ওপরের
উদাহরনে main() ফাংশন থেকে function(); কল করা হয়েছে এবং দুটো ইনটিজার মান পাঠানো হয়েছে।
আর called function মান দুটোকে রিসিভ করেছে দুটো ইনটিজার টাইপ
ভেরিয়েবল দিয়ে। মানগুলো পরপর ভেরিয়েবলের জন্য নির্ধারিত হবে। যে ফাংশন অন্য কোন
ফাংশনকে কল করে তাকে বলে calling
function আর যে
ফাংশনকে কল করে তাকে বলে called
function.
function(); ফাংশন আবার একটা ইনটিজার মান রিটার্ন করেছে যা c এর জন্য নির্ধারিত হয়েছে। main() ফাংশনের রিটার্ন টাইপ int, মানে ফাংশনটা সিস্টেমকে একটা ইনটিজার মান রিটার্ন
করবে। main() ফাংশনের বডিতে return 0; মানে ইনটিজার মানটা হল 0.
ফাংশন
শেষ। অনেক বকবক করলাম। তাই না? হুমম??
আজ তাহলে
উঠি।
হ্যাপি
কোডিং!!! :)