সি তে ফাংশন

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

তাহলে আমরা এটা কিভাবে লিখব প্রোগ্রামে তা দেখিঃ

সম্পুর্ন সুতো= ফু(ছেড়া সুতো);

অর্থাৎ যাকে ফু দিবেন তা ব্র্যাকেটে লিখতে হয় তাহলে ফু দেওয়ার ফলে কি হয় তা পাওয়া যায়।

এখন ফু শুধু মাত্র ছেড়া সুতো উপর কাজ করে। এখন যদি আপনি ছেড়া সুতোর পরিবর্তে অন্য কিছু যেমন একটা কাগজকে ফু দেন তা কিন্তু টাকাতে পরিনত হবে না। তার জন্য কিছু মন্ত্র পড়তে হবে। এখানে মন্ত্রটা হচ্ছে ফাংশসন।

টাকা = ফু(কাগজ);

কাগজের উপর ফু দিলে তা টাকাতে পরিনত হচ্ছে তাই না?
ফাংশনটা ও একই রকম। এই ফু বা মন্ত্র এর মত। এখন আপনাকে বুঝতে হয় কোথায় কি ব্যবহার করতে হবে। অনেক হাবি জাবি বকা হয়ে গেছে এখন দেখি কিভাবে তা আমরা কাজে লাগাবো।

আমরা দুটি সংখা যোগ করতে চাই।

তার জন্য আমাদের যোগ নামে একটা ফাংশন লাগবে।

যোগফল = যোগ(সংখ্যা১, সংখ্যা২);

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

আচ্ছা, ফাংশন কি তা আগে জানি। ফাংশন হচ্ছে পুনরায় ব্যবহার যোগ্য কোড ব্লক। যা একটি নির্দিষ্ট কাজ করতে পারে। ফাংশন ভালো ভাবে জানলেই প্রোগ্রামিং এর একটা বিশাল অংশ শেখা শেষ হয়ে যায়। তা জানলেই নিজের ইচ্ছে মত কোড লেখা যায়। সকল প্রোগ্রামিং ল্যাঙ্গুয়েজ এ ফাংশন লেখার ধরন প্রায় একই।  আমি সি প্রোগ্রামিং দিয়ে উদাহরন দিচ্ছি। 
একটা ফাংশন নিচের মত করে লেখা হয়ঃ


Function_Data_Type Function_Name (Parameters){

....
return value;

}

  • Function_Data_Type হচ্ছে ফাংশনটি কি ধরনের ডেটা রিটার্ন করবে তা। যেমন int, char, float, double ইত্যাদি।
  • ফাংশানের তো একটা নাম থাকতে হবে তাই না? যে নাম দিয়ে ফাংশনটিকে ডাকতে হবে।  Function_Name হচ্ছে ফাংশানের নাম।
  • Parameters হচ্ছে ফাংশন দিয়ে কি কি ডেটা পাস করবে।  এখানে এক বা একাদিক Parameter পাস করা যেতে পারে। কোন কোন ফাংশানে কোন Parameter নাও থাকতে পারে।  এটা নির্ভর করে কি ধরনের ফাংশন লিখা হচ্ছে তার উপর। একের অধিক Parameter থাকলে তাদেরকে কমা দিয়ে লিখতে হয়।
  • কাজ শেষে ফাংশনটি কি রিটার্ন করবে তাই return দিয়ে  পাস করা হয়।

নিচের ছবিটি দেখি। এখানে যোগ করার একটি ফাংশন এবং এর ভিবিন্ন অংশ দেখানো হয়েছেঃ

function add

আমরা ছোট্ট একটা প্রোগ্রাম লিখে ফেলিঃ

#include <stdio.h>
int add(int a, int b){

int sum = a+b;
return sum;
}
int main()
{
int x, y , result;
scanf("%d", &x);
scanf("%d", &y);
result = add(x,y);
printf("Result is: %d", result);
 return 0;
}

#include <stdio.h> এর পরই আমরা ফাংশনটি লিখছি। main ফাংশন এর আগে। ফাংশনটি কল কছি add(x,y) দিয়ে। যার মধ্যে দুটি প্যারামিটার পাস করেছি। একটা x আরেকটা y, যে গুলো আমরা scanf ফাংশন দিয়ে ইনপুট হিসেবে নিয়েছি। এর ফলে আমাদের প্রোগ্রামটি main থেকে বের হয়ে add ফাংশানের ভেতরে যাবে। গিয়ে কিছু কাজ কমপ্লিট করবে। এবং ফাংশানের ভেতরের কাজ সম্পুর্ন হলে আবার main এ ফিরে আসবে।
এখন ফাংশানে কি করছে জানেন? int a, int b নামক যে ভ্যারিয়েবল লিখছি ফাংশানের argument এ, প্রথম প্যারামিটার মানে x assign হবে a তে। এবং দ্বিতীয়টা মানে y assign হবে b তে। তারপর ফাংশনটি sum নামক ইন্টিজার ভ্যারিয়েবলে a+b এর মান রাখবে। return sum দিয়ে ঐ sum টা রিটার্ন করবে। এবং আমাদের main প্রোগ্রামে ফিরে আসবে। আবার ফাংশানে রিটার্ন করা ভ্যালুটা result নামক ভ্যারিয়েবলে এসাইন করবে।
ছোট্ট একটা যোগের জন্য আসলেই আমরা অনেক ভেজাল করে ফেলছি। তবে এখন আমরা ফাংশন কি তা জানি, কিভাবে কাজ করে তাও জানি।

এবার আরো সহজ একটা ফাংশন লিখি।


#include <stdio.h>
void callme(){
printf("You call me form Main n");
}
int main()
{
callme();
return 0;
}

&nbsp;

এখানে আমরা callme নামক একটা ফাংশন লিখছি, যা কিছুই রিটার্ন করবে না। এ জন্য ফাংশানের Data Type লিখছি void। আচ্ছা, main থেকে যখন আমরা ফাংশনটিকে কল করছি  callme(); দিয়ে তখন ফাংশানের ভেতর গিয়ে দেখে You call me form Main লেখাটি প্রিন্ট করতে। প্রোগ্রামটি তাই করল। এবং callme ফাংশন থেকে বের হয়ে আবার main এ আসল। তারপর দেখল আর কোন কাজ নেই। তাই কি করল? প্রোগ্রামটি শেষ করল।

আমরা আরেকটু কঠিন একটা ফাংশন লিখে ফেলতে পারি না?

আমি কঠিন বলছি তাই বলে মোটেও কঠিন হবে না। এবার আমরা দুটি সংখ্যার মধে বড় সংখ্যাটা বের করার ফাংশন লিখব। তখন কি হবে জানেন? আচ্ছা আগে কোডটি লিখে ফেলিঃ


#include <stdio.h>
int max(int a, int b){

int maximum = (a>=b) ? a : b ;
return maximum;
}
int main()
{
int x, y , result;
scanf("%d", &x);
scanf("%d", &y);
result = max(x,y);
printf("max is: %d", result);
 return 0;
}

এখানে আমরা max নামে একটা ফাংশন লিখছি। বাকি অংশ আগের মতই। ফাংশানের ভেতর Conditional Operator (?:) ব্যবহার করছি। Conditional Operator সম্পর্কে জানতে লিঙ্কে ক্লিক করে লেখাটি পড়ুন। এর আগে আমরা দুটি সংখ্যা যোগ করছি ফাংশানের ভেতর। এবার দুটি সংখ্যার মধে বড় সংখ্যাটা ফাংশন রিটার্ন করছে। এবং পরে তা আমরা প্রিন্ট করছি।

আচ্ছা, ফাংশন লিখলেই যে রিটার্ন করতে হবে এমন না। ফাংশন কোন কিছু রিটার্ন নাও করতে পারেন। সে ধরনের ফাংশানের Function_Data_Type লিখতে হয় void. আরেকটা ছোট্ট প্রোগ্রাম লিখে ফেলি, কি বলেন?


#include <stdio.h>

void max(int a, int b){
int maximum = (a>=b) ? a : b ;
printf("max is: %d", maximum);
}

int main()
{
int x, y;
scanf("%d", &x);
scanf("%d", &y);
max(x,y);
return 0;
}

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

Factorial কি তা তো আমরা জানি, তাই না? একটি পূর্ণসংখ্যা ও শূন্য থেকে বড় ও সংখ্যাটি থেকে ছোট সকল পূর্ণসংখ্যার গুনফল হচ্ছে ফ্যাক্টোরিয়াল। n পূর্ণসংখ্যা হয়, তাহলে n এর ফ্যাক্টোরিয়াল প্রকাশ করা হয় এভাবেঃ n! যেমন 5! এর মান হবে 120

five factorial

একটা পূর্ণসংখ্যার Factorial বের করার একটি প্রোগ্রাম লিখিঃ

#include <stdio.h>

long int factorial(int n){
int i;
long int result =1;
if(n>1){
for(i=2; i<=n; i++)
result = result*i;
}
return result ;
}

int main()
{
int a;
scanf("%d", &a);
printf("Factorial of n is : %d", factorial(a));
return 0;
}

এখানে আমরা একটি ফাংশন লিখছি যা ফ্যাক্টোরিয়াল বের করতে পারে। প্যারামিটার হিসেবে আমাদের রয়েছে একটি argument. প্রোগ্রামটি রান করে এর পর http://en.wikipedia.org/wiki/Factorial এখানে গিয়ে ভিবিন্ন সংখ্যার ফ্যাক্টোরিয়াল এর সাথে মিলিয়ে দেখুন আমাদের প্রোগ্রাম কাজ করে কিনা ঠিক মত।
বড় সংখ্যার জন্য প্রোগ্রামটি ঠিক মত কাজ করবে না। কেন করবে না? বের করার দ্বায়িত্ব আপনার 🙂

আচ্ছা, আমরা এতক্ষন যে ফাংশন গুলো লিখছি তা main এর আগে লিখছি। আমরা ইচ্ছে করলে main এর পরেও লিখতে পারি। তবে তার জন্য main ফাংশন এর আগে তাকে ডিক্লেয়ার করতে হবে। যাকে বলে Function Prototype.


#include <stdio.h>

void checkprime(int num);

int main()
{
int a;
scanf("%d", &a);
checkprime(a);
return 0;
}

void checkprime(int num){
 int i,count=0;
 for(i=2;i<=num/2;i++){
 if(num%i==0){
 count++;
 break;
 }
 }
 if(count==0 && num!= 1)
 printf("%d is a prime number",num);
 else
 printf("%d is not a prime number",num);
}

এখানে আমরা প্রাইম নাম্বার চেক করার একটা প্রোগ্রাম লিখছি। এর মধ্যে আমরা  checkprime নামক একটা ফাংশন লিখছি যা আমরা main এর পর লিখছি। checkprime নামক যে একটা ফাংশন রয়েছে আমাদের প্রোগ্রামের main এর পর তা আমাদের আগে জানিয়ে দিতে হবে। সে জন্যই Function Prototype. এ জন্য মেইন এর আগে আমাদের ফাংশন প্রোটোটাইপ লিখতে হয়। যেমন আমাদের ফাংশানের প্রোটোটাইপ হচ্ছেঃ void checkprime(int num);

অর্থাৎ Function Prototype লিখতে হবে এমনঃ

Function_Data_Type Function_Name (Parameters);

যদিও অনেক কম্পাইলারে Function Prototype লিখতে হয় না।

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

সবার জন্য শুভ কামনা। শুভ প্রোগ্রামিং।


Leave a Reply

Your email address will not be published. Required fields are marked *