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

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

```c
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` একই হতে হবে।

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

```c
#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()` ফাংশনটিকে কল করেছি, এবং কল করার সময় `length` ও `width` কে প্যারামিটার হিসেবে দিয়েছি। এবং রিটার্ন ভ্যালুটি `area` নামের একটি ভ্যারিয়েবলে ফেরত নিয়েছি এবং সেটি প্রিন্ট করেছি। কল করা এবং ভ্যালু ফেরত নেওয়ার কাজটি হয়েছে `area = find_area(length, width);` স্টেটমেন্টে।

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

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

```c
#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` ফাংশনে গিয়ে দেখে নিতে পারি কোন ফাংশন কিভাবে কল করা হয়েছে।
