ইউজার ডিফাইনড ফাংশন

এবারের অধ্যায়ে আমরা দেখব কীভাবে ইউজার ডিফাইন ফাংশন লিখা যায়। প্রথমেই দেখে নিই সি তে ফাংশনের গঠন কেমন হয়। উদাহরণ হিসেবে আমরা একটি ফাংশন লিখব যেটি একটি আয়তক্ষেত্রের ক্ষেত্রফল বের করে। শুরুতেই দেখে নিই ফাংশনের গঠন কেমন হয়।

return_type function_name(parameter list)
{
Body of the function
...
}

আসুন এটি একটু ব্যখ্যা করি।

return_type :

রিটার্ন টাইপ হল ফাংশন কি ধরনের ভ্যালু আপনাকে ফেরত দিবে। আমরা সাধারণত ফাংশন লিখি কারণ আমরা ফাংশনে কিছু একটা কাজ করে তার ফলাফলটি ফেরত আনতে চাই। রিটার্ন টাইপ হল ফাংশনটি যে ধরনের ভ্যালু ফেরত দেবে তার ডেটা টাইপ। এটি সি এর যে কোন ডাটা টাইপ হতে পারে। সব ফাংশনই যে ভ্যালু রিটার্ন করবে এমন নয়। যদি কোন ফাংশন কোন ভ্যালু রিটার্ন না করে তাহলে তার রিটার্ন টাইপ হবে void

function_name

ফাংশনগুলোর একটি নির্দিশ্ট নাম থাকতে হবে। এই ফাংশন নেম ধরেই আমরা ফাংশনটিকে প্রোগ্রামের বিভিন্ন যায়গায় কল করব। ফাংশন নেম আমরা আমাদের পছন্দমত দিতে পারি। তবে ভাল প্র্যাকটিস হল ফাংশনের নামগুলো এমনাভাবে দেওয়া যাতে সেটি পড়ে বোঝা যায় ফাংশনটি কি করে। যেমন ক্ষেত্রফল বের করার ফাংশনটির নাম আমরা finn_area() দিতে পারি আবার klmn() ও দিতে পারি। দুই ক্ষেত্রেই ফাংশনটি ভেতরের ইনস্ট্রাকশন অনুযায়ী কাজ করবে। শুধু একটি ক্ষেত্রে এটি বোঝা সহজ যে ফাংশনটি কি করে আরেকটিতে না।

Parameter list

ফাংশনটিতে আমরা যে ভ্যালুগুলো নিয়ে কাজ করতে পাঠাবো সেগুলো থাকে প্যারামিটার লিস্ট এ। প্যারামিটার লিস্ট এ আমরা বিভিন্ন ভ্যারিয়েবল ফাংশনে পাঠাই এবং এখানে ভ্যারিয়েবলের ডেটা টাইপ বলে দিতে হয়। ফাংশন কল করার সময় এই ভ্যালুগুলো ইনপুট হিসেবে দিতে হয়। কোন ইনপুট না থাকলে void দেযওয়া হয় প্যারামিটার হিসেবে। প্যারামিটার গুলোকে সরারি ভ্যারিয়েবল হিসেবে ফাংশনের ভেরত থেকে কল করা যায়।

function body

ফাংশন বডিতে আমরা আমরা ফাংশনটি কি কি ইনস্ট্রাকশন এক্সিকিউট করবে সেটি লিখব। যেমন ক্ষেত্রফল বের করার জন্য আমরা দৈর্ঘ্য ও প্রস্থ গুণ করব।এরপর আমরা ক্ষেত্রফলটি ফেরত পাঠাবো বা রিটার্ন দেব। এটিই হবে ফাংশনের রিটার্ন ভ্যালু। রিটার্ন ভ্যালুর ডেটা টাইপ এবং return_type একই হতে হবে।

এবার আসুন আমরা আমাদের ফাংশনটি লিখি। আমরা বলেছি আমরা এমন একটি ফাংশন লিখবো যেটি দিয়ে আয়তক্ষেত্রের ক্ষেত্রফল বের করা যাবে।

#include<stdio.h>
int find_area(int len, int wid) //function declaration
{
int area;
area = len*wid;
return area; //returning the result
}
int main(void)
{
int length, width, area;
printf("Enter the length and width of the rectangle: \n");
scanf("%d", &length);
scanf("%d", &width);
area = find_area(length, width); //calling the function and getting the value back
printf("The area of the rectangle is %d",area);
return 0;
}

এখানে প্রথমে আমরা find_area নামের একটি ফাংশন লিখেছি যেটির রিটার্ন টাইপ int এবং এটি দুটি প্যারামিটার গ্রহণ করে। একটি হল len যেটি একটি int ভ্যারিয়েবল, অপরটি wid এটিও int । এরপর আমরা ফাংশনটির ভেতরে একটি ভ্যারিয়েবল নিয়েছি যেটির নাম area এটিতে আমরা ক্ষেত্রফল রাখবো। এরপর আমরা ক্ষেত্রফল বের করে সেটিকে রিটার্ন করেছি। main() ফাংশনের ভেতর থেকে আমরা আয়তক্ষেত্রের দৈর্ঘ্য ও প্রস্থ নিয়ে find_area() ফাংশনটিকে কল করেছি, এবং কল করার সময় lengthwidth কে প্যারামিটার হিসেবে দিয়েছি। এবং রিটার্ন ভ্যালুটি area নামের একটি ভ্যারিয়েবলে ফেরত নিয়েছি এবং সেটি প্রিন্ট করেছি। কল করা এবং ভ্যালু ফেরত নেওয়ার কাজটি হয়েছে area = find_area(length, width); স্টেটমেন্টে।

বেস্ট প্র্যাকটিস

এই প্রোগ্রামটি ঠিকমত কাজ করলেও আমরা এখানে একটি বেস্ট প্র্যাকটিস ফলো করিনি। এখানে আমরা ফাংশনটি main এর আগে লিখেছি। যদিও এটি একটি ছোট ফাংশন, কিন্তু ফাংশনটি যদি অনেক বড় হত এবং এরকম আরও বেশ কয়েকটি ফাংশন থাকতো তাহলে main ফাংশনটি খুজে বের করার জন্য আমাদের স্ক্রোল করে অনেক নিচে নামতে হত এবং প্রোগ্রামটিও একটু অগোছালো মনে হতো। এধরনের ঝামেলা এড়ানোর জন্য সাধারণত ফাংশন গুলোকে main এর পরে লিখা হয়। কিন্তু ফাংশন ডেফিনেশনের আগে সেটিকে কল করলে কম্পাইলার এরর দেখাবে। এজন্য শুরুতেই ফাংশন প্রোটোটাইপ ডিক্লেয়ার করে দেওয়া হয়। প্রোটোটাইপ জিনিসটি একটি প্লেসহোল্ডারের মতই যেটি কম্পাইলারকে বলে দেয় সামনে কোথাও এরকম একটি ফাংশন ডিফাইন করা আছে। তাহলে আমরা দেখি কীভাবে এটি করতে হয়।

#include<stdio.h>
int find_area(int len, int wid); //function prototype declaration
int main(void)
{
int length, width, area;
printf("Enter the length and width of the rectangle: \n");
scanf("%d", &length);
scanf("%d", &width);
area = find_area(length, width);
printf("The area of the rectangle is %d",area);
return 0;
}
int find_area(int len, int wid) //function declaration
{
//function definition
int area;
area = len*wid;
return area; //returning the result
}

এখানে আমরা শুরুতেই int find_area(int len, int wid); লাইনটি দিয়ে ফাংশন প্রোটোটাইপ বলে দিয়েছি। এখানে আমরা ফাংশন বডি লিখি নি। কিন্তু এখন কম্পাইলার জানে সামনে কোথাও ফাংশন বডি ও ডেফিনিশন লিখা আছে।

এভাবো কোড লিখলে সেটির রিডাবিলিটিও ভালো থাকে কারণ আমরা শুরুতেই যেনে যাই সামনে কী কী ফাংশন আছে এবং আমরা দ্রুত main ফাংশনে গিয়ে দেখে নিতে পারি কোন ফাংশন কিভাবে কল করা হয়েছে।