ফাংশন হলো একটি ব্লক অফ কোড, যা একটি নির্দিষ্ট কাজ সম্পন্ন করে। ফাংশন ব্যবহার করে আমরা কোডকে মডুলার এবং রিইউজেবল করতে পারি। একটি ফাংশন একবার লিখে আমরা প্রোগ্রামের যেকোনো জায়গায় তা কল করে ব্যবহার করতে পারি।
ফাংশন কেন ব্যবহার করবো?
কোড রিইউজেবিলিটি: একই কোড বারবার লিখার দরকার নেই, শুধু ফাংশনটি কল করলেই হবে।
কোড রিডেবিলিটি: ফাংশন ব্যবহার করে কোডটি সহজে বোঝা যায় এবং মেইন্টেন করা সহজ হয়।
মডুলারিটি: বড় প্রোগ্রামকে ছোট ছোট অংশে ভাগ করে ফাংশনে লিখা যায়।
1return_type function_name(parameter_list) {
2 // ফাংশনের কাজ
3 return value;
4}return_type: ফাংশনটি কী ধরনের মান রিটার্ন করবে (যেমন: , , ইত্যাদি)
function_name: ফাংশনের নাম।
parameter_list: ফাংশনে পাস করা আর্গুমেন্টগুলোর লিস্ট (যদি থাকে)।
return value: ফাংশনটি যদি কোনো মান রিটার্ন করে, তাহলে স্টেটমেন্ট ব্যবহার করতে হবে।
চলো একটি সহজ উদাহরণ দেখি। আমরা একটি ফাংশন লিখবো, যা দুটি সংখ্যার যোগফল রিটার্ন করবে।
1#include <stdio.h>
2
3int add(int a, int b) {
4 int sum = a + b;
5 return sum;
6}
7
8int main()
9{
10 int num1 = 5, num2 = 10;
11 int result = add(num1, num2);
12 printf("Sum is: %d", result);
13 return 0;
14}এখানে আসলে হলো কী? আমাদের মূল কাজ হচ্ছে একটি আলাদা ফাংশন লেখা যা দুটি সংখ্যা কে যোগ করবে । তাই না? এখানে যে দুটি সংখ্যাকে যোগ করতে হবে তা আমরা কোড এর মধ্যেই নির্ধারণ করে দিয়েছি (5 এবং 10)। কিন্তু চাইলে আমরা ব্যবহার করে ব্যবহারকারীর থেকেও ইনপুট নিতে পারতাম ।
তো যাই হোক, যোগ করার জন্য আমরা যে ফাংশন লেখবো তার কাছে তো সংখ্যা দুটি পাঠাতে হবে, তাই না? কারণ আমরা এবং কে ডিক্লেয়ার করেছি ফাংশনের ভিতরে, অন্য কোনো ফাংশন থেকে সরাসরি এর ভ্যালু পাওয়া যাবে না । তাই আমরা এখানে ফাংশন লেখার সময় এর দুটি parameter দিয়েছি । এখানে এবং হলো parameter ।
আমরা যখন ১২ নাম্বার লাইনে ফাংশনটিকে call করছি, তখন আমরা এতে ব্র্যাকেটের ভেতরে এবং কে argument হিসেবে পাঠাচ্ছি । এর ফলে যেটা হবে সেটা হলো, এর যেখানে যেখানে আছে, সেখানে এর ভ্যালু বসে যাবে, আবার যেখানে যেখানে আছে সেখানে এর ভ্যালু বসে যাবে । তাই ভ্যারিয়েবল এ 5 ও 10 এর যোগফল বা 15 রাখা হবে ।
এরপরে আমরা এর মানটিকে করছি । এই দিয়ে কী হলো? যেখান থেকে ফাংশনটি কে call করা হয়েছিল সেখানে করা ভ্যারিয়েবলের মান ফেরত যাবে । বলো তো আমরা এখানে কে কোন লাইনে কল করেছি? ১২ নাম্বার লাইনে তাই না? তাই ১২ নাম্বার লাইনে এর ভ্যালু ফেরত যাবে । ফেরতপ্রাপ্ত মানটিকে আমরা আবার নামের আরেকটি ভ্যারিয়েবলে রেখেছি । এরপরে সেটিকে প্রিন্ট করেছি ।
আচ্ছা বলো তো আমরা যে ভ্যালুটি ফেরত পাঠালাম, সেটির টাইপ কী? নিশ্চয়ই তাই না? তাই আমরা এই ফাংশনের নামের আগে return_type লিখেছিলাম ।
আরো একটি বিষয় হলো, একটি ফাংশন ঘোষনা করার সময় আমরা যতগুলো প্যারামিটার দিবো, ফাংশন কল করার সময় ঠিক ততগুলো আর্গুমেন্টই পাঠাতে হবে । তার থেকে বেশি বা কম হওয়া যাবে না । যেমন এই ফাংশনটি ঘোষণা করার সময় লাইন ৩ এ আমরা দুইটি প্যারামিটার দিয়েছিঃ ও । তাই লাইন ১১ তে আমরা যখন ফাংশনটিকে কল করলাম তখনও আমরা দুটি আর্গুমেন্টই পাঠিয়েছিঃ ও । যদি শুধু বা শুধু পাঠাতাম তাহলে আমাদের কোডটি কম্পাইল হতো না !
চলো আমরা ফাংশন নিয়ে আরো একটি উদাহরণ দেখে আসি । মনে করো আমাদের এবার একটি ফাংশন লিখতে হবে, যা দুটি পূর্ণসংখ্যা গ্রহণ করে তাদের মধ্যে বড় সংখ্যাটি রিটার্ন করবে । মনে করো ফাংশনটির নাম হলো । তাহলে এই ফাংশনটির রিটার্ন টাইপ কী হবে? অবশ্যই কারণ আমরা পূর্ণসংখ্যা রিটার্ন করতে চাই । আর ফাংশনটিতে কী কী ডাটা পাঠাতে হবে? মানে কী কী প্যারামিটার থাকবে? যে দুটি সংখ্যার মধ্যে তুলনা করতে হবে সেই দুটি সংখ্যা । তাহলে ফাংশনটির বেসিক রূপ দাঁড়াচ্ছে এমনঃ
1int getLargeNumber(int a, int b){
2
3}এখন আমাদের কাজ হচ্ছে শুধু আর এর মধ্যে যেটা বড় সেটাকে রিটার্ন করে দেয়া । আমরা এটা ব্যবহার করে করবো:
1int getLargeNumber(int a, int b){
2 if(a > b){
3 return a;
4 }
5 else{
6 return b;
7 }
8}তাহলে আমাদের মূল প্রোগ্রাম হবে অনেকটা এরকমঃ
1#include <stdio.h>
2
3int getLargeNumber(int a, int b){
4 if(a > b){
5 return a;
6 }
7 else{
8 return b;
9 }
10}
11
12
13int main(){
14 int a, b;
15 printf("Enter two numbers: ");
16 scanf("%d%d", &a, &b);
17 int largeNumber = getLargeNumber(a, b);
18 printf("Large number is %d", largeNumber);
19 return 0;
20}
21এখন একটা বিষয় তোমাকে বলে রাখি । কোনো ফাংশনের ভিতরে যদি কোথাও এক্সিকিউট হয়ে যায়, তাহলে সেখানেই ফাংশনটি থেমে যায়, তার পরের লাইন গুলো আর এক্সিকিউট হয় না । তাই আমরা ব্লকটি চাইলে বাদ দিয়ে দিতে পারি:
1#include <stdio.h>
2
3int getLargeNumber(int a, int b){
4 if(a > b){
5 return a;
6 }
7 return b;
8}
9
10
11int main(){
12 int a, b;
13 printf("Enter two numbers: ");
14 scanf("%d%d", &a, &b);
15 int largeNumber = getLargeNumber(a, b);
16 printf("Large number is %d", largeNumber);
17 return 0;
18}
19এখানে, যদি শর্তটি সত্য হয়, তাহলে রিটার্ন হয়ে ফাংশনটি সেখানেই থেমে যাবে । আর যদি শর্তটি মিথ্যা হয় তাহলে রিটার্ন হবে । তাই আমাদের আর ব্লক প্রয়োজন হলো না ।
মনে করো, আমরা নামে একটি ফাংশন লেখতে চাই যা কথাটি প্রিন্ট করবে । এখন ফাংশনটির একমাত্র কাজ হলো এ কথাটি প্রিন্ট করা, এখানে কোনোকিছু রিটার্ন করার দরকার নেই । সেক্ষেত্রে আমরা রিটার্ন টাইপ হিসেবে ব্যবহার করতে পারি । নিচের উদাহরণটি দেখোঃ
1#include <stdio.h>
2
3void printWelcomeMessage(){
4 printf("Welcome to PyxLearn");
5}
6
7int main(){
8 printWelcomeMessage();
9 return 0;
10}
11Welcome to PyxLearn
