সি প্রগামিং এ ফাংশন এর কিছু বেসিক জিনিস।

...............।ফাংশন।............।

ফাংশন বলতে আমরা কি বুঝি?ফাংশন বলতে সাধারনত আমরা বুঝি আমরা যদি তাতে একটা কিছু পাঠাই ফাংশনটি নির্দিষ্ট শর্ত অনুযায়ী একটা কিছু আমাদের দিবে বা রিটার্ন করবে।যেমন y=f(x) এখানে x এর ভিন্ন ভিন্ন মানের জন্যে y এর ভিন্ন ভিন্ন মান পাওয়া যাবে এটাই এই ফাংশনের শর্ত । আবার y=f(x^2) এটাও একটা ফাংশন তবে এই ফাংশনের শর্ত ভিন্ন তাই y এর মান টাও ভিন্ন পাওয়া যাবে । এই রকম প্রগ্রামিং এর মাধ্যমেও আমরা ফাংশন তৈরি করতে পারি এবং নির্দিষ্ট শর্ত দিয়ে একটা নির্দিষ্ট মান পেতে পারি। তবে ফাংশন কিভাবে তৈরি করতে হবে তাহার একটা নির্দিষ্ট পদ্ধতি আছে সেই পদ্ধতি অনুসরন করে আমারা ফাংশন তৈরি করতে পারব। এখন সেই উপাই গুলো আমরা পর্যায়ক্রমে দেখব।সি ল্যাংগুয়েজ এর সাহায্যে আমরা ফাংশন তৈরি করব।সাধারনত একটা যাথাযত বা পরিপূর্ন ফাংশন এর কয়েকটা অংশ থাকে।সেগুলো হল।

নিচে এক এক করে বর্ননা দেওয়া হল।

১।ফাংশন কি ধরনের মান রিটার্ন করবে সে অনুযায়ী সে ফাংশনের রিটার্ন টাইপ দিতে হবে। যেমন রিটার্ন টাইপ হতে পারে int,float,double,char ইত্যাদি।

২।ফাংশনের একটা নির্দিষ্ট নাম (indentifier) দিতে হবে যার মাধ্যমে আমরা সেই ফাংশনকে মেইন ফাংশন একল করতে পারব এবং ফাংশনের নামের সাথে অবশ্যই একটা প্যারেনথেসিস () বা ফাস্ট ব্রাকেট দিতে হবে। অর্থাৎ যখনি আমরা কোন নামের সাথে যখনি দেখব প্যারেনথেসিস আছে তখনি আমাদের বুঝতে হবে ঐ টা একটা ফাংশন।ফাংশন এর নাম ভেরিয়েবলের নাম যেভাবে ডিক্লেয়ার করা হই ঠিক সেই ভাবে ডিক্লেয়ার করতে হবে।

ফাংশন এর নামের জন্যে কিছু শর্তঃ

*** ফাংশন বা ভেরিয়েবলের নামের প্রথম অক্ষর _(আন্ডারস্কর) , $(ডলার) চিনহ এবং ইংরেজি বর্ন ব্যাতিত অন্য কোন চিনহ ব্যাবহার নিশিদ্ধ।

*** ফাংশনের নামের মধ্যে কোন স্পেস রাখা যাবেনা। কিছু ফাংশনের সঠিক নাম int _sahabub(),int $kajol(),int sagor_bondhu03() ইত্যাদি।কিছু ফাংশনের ভুল নাম int #sahabub(),int 12kajol(),int sagor bondhu() ইত্যাদি।

৩।ফাংশনের প্যারামিটার লিস্ট।এখন প্যারামিটার লিস্ট বলতে কি বুঝি আমরা?আর এর কাজ কি? এখন এটা বুঝার জন্যে উপরের একটা ফাংশনের কথাই ধরা যাক যেমন y=f(x)।এখানে প্যারেনথেসিস এর মধ্যে x আছে এটাই আসলে একটা প্যারামিটার হিসেবে আমরা মনে করতে পারি।অর্থাত এই ফাংশনের প্যারামিটার হচ্ছে একটি এবং তা হচ্ছে x।আমরা যদি আরেকটি ফাংশনের কথা এইভাবে চিন্তা করি।যেমন y1=f(x+y), y2=f(x+y+z); তাহলে আমরা বলতে পারি যে এই দুইটা ফাংশনের যথাক্রমে ২ এবং ৩ টা করে প্যারামিটার আছে। আর আমরা লক্ষ করলে এই প্যারামিটার গুলোর কাজ সহজেই বুঝতে পারব।প্যারামিটারের কাজ হচ্ছে আমরা ফাংশনে যেই মানগুলো দিব সেই মানগুলো কে ফাংশনের মধ্যে সরবরাহ করা।

প্যারামিটার ডিক্লেয়ার করার নিয়মঃ

***একটা ফাংশনে প্যারামিটার নাও থাকতে পারে যদি না থাকে তাহলে সেই ফাংশনকে আমরা প্যারামিটার শুন্য ফাংশন বলতে পারি।যেমন মেইন ফাংশন একটা প্যারামিটার শুন্য ফাংশন।

এই জাতীয় ফাংশন ডিক্লেয়ার এর নিয়মঃ int main(void){} , int print(void){}

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

***একটি প্যারামিটার বিশিষ্ট ফাংশনঃ
int add(int a){},int subs(int a){}।

এইগুলো হল এক প্যারামিটার বিশিষ্ট ফাংশন।

বিদ্রঃ

অবশ্যই প্যারামিটার এর টাইপ দিতে হবে প্রতিটি প্যারামিটার ডিক্লেয়ার এর পুর্বে।

***বহু প্যারামিটার বিশিষ্ট ফাংশনঃ

int add(int a,int b,int c){),int func(int ami,int tumi ,char a,float b){} ইত্যাদি।

বিদ্রঃ

অবশ্যই প্যারামিটার এর টাইপ দিতে হবে প্রতিটি প্যারামিটার ডিক্লেয়ার এর পুর্বে।

৪।ফাংশন বডিঃ

ফাংশন বডি এখানে ফাংশন টা দিয়ে কি কাজ করান হবে তার বর্ননা করা হয়।অর্থাত এখানে ফাংশন বর্ননা করা হই।আর ফাংশন বর্ননা সেকেন্ড বা {} ব্রাকেট এর মধ্যে করতে হয়।আর এই সেকেন্ড ব্রাকেট এর মধ্যবর্তি অংশ টুকুকেই ফাংশন বডি বলা হয়।

৫।রিটার্ন স্ট্যাট্মেন্ট। এবার যেই বিষয় বলব সেটা অত্যাধিক গুরুত্বপুর্ন।আমরা যেই ফাংশন টা ডিক্লেয়ার করব সেই ফাংশনটি সব শর্ত অনুযায়ী কাজ শেষে শুধু মাত্র একটি মান আমদের রিটার্ন করবে এবং যেই মানটি রিটার্ন করবে সেই মানটিই হবে ঐ ফাংশনের মান। আর এজন্যেই যখন return 0;লিখি তখন প্রগামটির মান ০ হয়ে যায়।অর্থাত জিরো মানে মিথ্যা আর মিথ্যা হলেই প্রগ্রাম টি terminte করবে। বিদ্রঃ ফাংশনটিতে যদি প্রিন্ট এর কাজ করা হই তাহলে সে ঐ সকল প্রিন্ট এর কাজ করবে যদি শর্ত সত্য হই। যেই মানটি রিটার্ন করবে সেই মানটিই যে ঐ ফাংশনের মান হবে তা বুঝার জন্যে আমরা এখন কয়েকটা প্রগ্রাম দেখব। আর একটি কথা ফাংশন সব সময় মেইন ফাংশনের উপরে ডিক্লেয়ার করতে হই।ফাংশনটির বর্ণনা ফাংশন ডিক্লেয়ার করার সময় অথবা মেইন ফাংশেন ফাংশনের নিচে বর্ণনা করতে হবে।মেইন ফাংশনের নিচে বর্ণনা করাই সবচাইতে ভাল অভ্যাস এতে প্রগ্রামটি বুঝতে সুবিধা হয় যদি প্রগ্রামটি বড় হয় ।

৫।ফাংশন কল করার নিয়মঃ

আমরা যদি একটি ফাংশন কে আরেক ফাংশন এর মধ্যে থেকে কল করতে চাই তাহলে

********যেই ফাংশন থেকে কল করব সেই ফাংন এ যেই ফাংশনকে কল করব সেই ফাংশন এর নাম সাথে প্যারেনথেসিস সাথে ফরমাল প্যারামিটার।ফরমাল প্যারামিটার বলতে কি বুঝি তা পরে বলা হবে।


#include< stdio.h>
 
int add(int a,int b)
{
    int sum = a + b;
    return sum;
}
int main()
{
    int num1,num2,result;
    num1 = 80,num2 = 90;
    result = add(num1,num2);
    printf("%d\n",result);
    return 0;
}

উপরের প্রগ্রাম টি একটি যথাযত (proper)প্রগ্রাম হিসেবে কল্পনা করা যেতে পারে।কারন এখানে ফাংশনের সকল বৈশিষ্টই আছে। প্রগ্রামটা একটু আলোচনা করা যাক।

১।এই প্রগ্রামটি হচ্ছে দুইটি পূর্ন সংখ্যা যোগ করার।অর্থাৎ পূর্ন সংখ্যার যোগফল অবশ্যই পুর্ন সংখ্যা হবে। তাই এর রিটার্ন টাইপ হচ্ছে int

২।ফাংশনের এর একটা বোধগম্য নাম দেওয়া হয়েছে তা হচ্ছে add

৩।তারপরে প্যারেনথেসিস() এর মধ্যে দুইটি প্যারামিটার ।এটাই প্যারামিটার লিস্ট।এখানে int a,int b হচ্ছে ফাংশনের actual প্যারামিটার।কারন বাস্তবেই int a,int b হচ্ছে এই ফাংশনের প্যারামিটার।কারন এইজন্যেই এই নামকরন।

৪।এর পরে ফাংন বডি এখানে ফাংশন টা দিয়ে কি কাজ করান হবে তার বর্ননা করা হয়।অর্থাত এখানে ফাংশন বর্ননা করা হই।আর ফাংশন বর্ননা সেকেন্ড বা {} ব্রাকেট এর মধ্যে করতে হয়।

৫।সব শেষে রিটার্ন টাইপ অর্থাৎ ফাংশনটি থেকে কোন মানটা চাচ্ছি।যেমন উপরের ফাংশন টাতে sum এর মান টা প্রয়োজন ছিল তাই sum এর মান return স্ট্যাটমেন্ট এ লেখা হয়েছে।আর এই মানটাই হবে এই ফাংশনটার মান।এখানে যদি return sum;এর পরিবর্তে return a;লিখতাম তাহলে ফাংনটার মান হত a এর যে মান সেই মান।

৬।এখন এই ফাংশনটি মেইন ফাংশন এ কল করা হইছে সেই ফাংশন এর নাম ,নামের সাথে প্যারেনথেসিস ও ফরমাল প্যারামিটার উল্লেখ করে।ফরমাল প্যারামিটার কেন বলা হচ্ছে?কারন যেই প্যারামিটার টা দিচ্ছি আসলে সেটা আসল প্যারামিটার নয়।এইটা আসলে ফরম হিসেবে কাজ করে।এবং এখানে যেই মান গুলো দেওয়া হবে সি মান গুলো actual প্যারামিটার এ assign হবে পর্যায়ক্রমে ।

৭।সব শেষে খেয়াল করলে দেখব ফাংশন্টা একটা মান রিটার্ন করছে এবং সেই মানটা আমরা result ভেরিয়েবলের মধ্যে রাখছি।

আরও কিছু প্রগ্রাম দেখি ও বোঝার চেষ্ট্রা করি।


#include< stdio.h>

int sq(int num)
{
    printf("Square of this number is ");
    return num*num;
}

int main()
{
    int N1;
    printf("please enter a number :");
    scanf("%d",&N1);
    printf("%d\n",sq(N1));
    return 0;
}

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


#include < stdio.h>
int sum(int n);

int main()
{
    int number, result;

    printf("Enter a positive integer: ");
    scanf("%d", &number);

    result = sum(number);

    printf("sum=%d", result);
}

int sum(int n)
{
    if (n!=0)
        return n + sum(n-1); // sum() function calls itself
    else
        return n;
}