«

»

ফেব্রু. 10

লেকচার ৮ – সি প্রোগ্রামিং – ফাংশন

[কোর্সের মূল পাতা]

কিভাবে ফাংশন লিখতে হয়

আমরা এখন পর্যন্ত printf, scanf ইত্যাদি ফাংশন ব্যবহার করেছি। এখন আমরা ফাংশন নিজেরা বানানো শিখব।

ধরা যাক আমরা দুইটা লাইন প্রিন্ট করতে চাই-

#include "stdio.h"

void main()
{
    printf("Hello");
    printf(" Worldn");
}

এখন আমরা যদি এই দুইটা লাইন ৩ বার লিখতে চাই তাহলে আমরা ইচ্ছা করলে এই লাইন দুটো ৬ লা্নে লিখে সেটা করতে পারি। তা না করে আমরা ফাংশন ব্যবহার করলে অনেক পরিচ্ছন্ন হবে। ফাংশনের জন্য যেকোন একটা নাম ঠিক করতে হবে। আমরা printhello নামটা ঠিক কললাম। এরপরে ফাংশনের একটা স্টেটমেনট ব্লক থাকবে। সেই ব্লকে আমরা যত খুশি স্টেটমেন্ট লিখতে পারব।

void printhello()
{
    printf("Hello");
    printf(" Worldn");
}

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

printhello();

এখন আমরা পুরো প্রগ্রামটা দেখিঃ

#include "stdio.h"

void printhello()
{
    printf("Hello");
    printf(" Worldn");
}

void main()
{
    printhello();
    printhello();
    printhello();
}

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

ফাংশন return

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

ধরা যাক আমাদের একটা ফাংশন আছে f1 যেটা থেকে আমরা ৩৫ সংখ্যাটি রিটার্ণ করতে চাই-

int f1()
{
   //[do something]

    return  35;
}

এবার আমরা এই ফাংশনটা main থেকে কল করব। এই ফাংমনটা একটা সংখ্যা রিটার্ন করে। সেই রিটার্ন করা সংখ্যাটা যদি আমরা একাট ভেরিয়েবলে রাখতে চাই তাহলে আমরা একটা = চিহ্ন ব্যবহার হরে এভাবে লিখতে পারি-

r = f1();

এভাবে আমরা যেকোন ফাংশনের রিটার্ন করা মান একটা ভেরিয়েবলে রাখতে পারি।

এবার আমরা য্ররো প্রগ্রামটা দেখি-

int f1()
{
   //[do something]
    return  35;
}

void main()
{
    int r;
    r= f1();
}

ফাংশন প‌্যারামিটার

অংকে আমরা অনেক ফাংশন ব্যবহার করি। ধরি একটা ফাংশন এরকম-

f(x)=2x+3

এখন যদি x = 5 হয় তাহলে f(x)= 13 হবে। আবার যদি x = 3 হয় তাহলে f(x)= 9 হবে।

এখনে ফাংশনে একটা প‌্যারামিটার আছে, যেটা হচ্ছে x. আমরা আরেকটা ফাংশন দেখি যেটার ২টা প‌্যারামিটার x এবং y আছে-

f(x,y)=2x+3y

এখন যদি x = 2, y = 3 হয় তাহলে f(2,3)= 13 হবে। আবার যদি x = 1, y = 1 হয় তাহলে f(x,y)=5 হবে।

সুতরাং আমাদের ফাংশনে আমরা এক বা একাধিক প‌্যারামিটার ব্যবহার করতে পারি।

এখন আমরা দেখি উপরের ফাংশনগুলোকে কিভাবে সি প্রোগ্রামিং এর ভাষায় লিখতে পারি-

প্রথমে f(x)=2x+3 ফাংশনটা সি ল্যাংগুয়েজে অনুবাদ করি-

int f(int x)
{
    return 2*x+3;
}

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

এবার আমরা f(x,y)=2x+3y ফাংশনটা অনুবাদ করি-

int f(int x, int y)
{
    return 2*x+3y;
}

এভাবে আমরা যে কোন সংখ্যক প‌্যারামিটার ফাংশনে যোগ করতে পারি।

ফাংশন রিটার্ন আরেকবার

আমরা ফাংশন রিটার্ন আরেকবার দেখি-

int f1(int n)
{
    if(n == 0)
        return 0;

    if(n == 1)
        return 1;

    return n*n;
}

void main()
{
  int r=5;
  int q = f1(r);
}

এখানে f1 ফাংশনটা যদি আমরা 5 প‌্যারামিটার দিয়ে কল করি তাহলে দুইটা if এর কোনটাই কাজ করবে না এবং শেষ লাইন থেকে 25 রিটার্ন করবে এবং main ফাংশনে q এর মান 25 হবে।
কিন্তু যদি আমরা main এ r=0 দিয়ে f1 ফাংশন কল করি তাহলৈ প্রথম if এর কন্ডিশন TRUE হওয়ার কারণে 0 রিটার্ণ করবে এবং main ফাংশনে q এর মান 0 হবে। এখানে লক্ষ্য করি যে একবার রিটার্ন করলে প্রোগ্রাম ফাংশন থেকে বের হয়ে আসবে এবং যেখান থেকে কল করা হয়েছিল সেখানে প্রোগ্রামের কন্ট্রোল ফিরে আসবে।

ফাংশন byval প‌্যারামিটার

আমরা একটা ফাংশন লিখি যেটা একটা সংখ্যার square রিটার্ন করবে।

int square(int num)
{
    num = num*num;
    return num;
}

void main()
{
    int n=3;
    int r=square(n);
    printf("%d %d", n, r);
}

এখন এখানে main ফাংশনে একটা ভেরিয়েবল n এর মান 3 অ্যাসাইন করা হয়েছে। তারপর square ফাংশন কল করা হয়েছে। square ফাংশনের প‌্যারামিটার num এর মান প্রথম লাইন পরিবর্তন হয়ে 9 হয়েছে এবং সেই 9 রিটার্ন করা হয়েছে। এক্ষেত্রে main ফাংশনের r এর মান 9 হবে। কিন্তু n এর মানের কোন পরিবর্তন হবে না। এভাবে যখন একটা প্রারামিটার একটা ফাংশনে আমরা পাঠাব যেটার মান ফাংশনের মধ্যে পরিবর্তন করা হবে কিন্তু যেখান থেকে কল করা হয়েছিল সেখানে ব্যবহৃত ভেরিয়েবলের মানের কোন পরিবর্তন হবে না- এই ধরনের প্যারামিটারকে আমরা byval প‌্যারামিটার হিসাবে চিহ্নিত করি। কনসোলে 3 9 প্রিন্ট হবে।

ফাংশন byref প‌্যারামিটার

এখন আমরা যদি চাই যে main ফাংশনের n এর মান যখন প‌্যামিটার হিসাবে square ফাংশনে পাঠাব সেই প‌্যারামিটারের মান যদি square ফাংশনের মধ্যে পরিবর্তন করা হয় তাহলে main ফাংশনের n এর মানও পরিবর্তন হয়ে যাবে তাহলে আমরা প‌্যারামিটারটিকে byref প্যারামিটার হিসাবে ফাংশনে চিহ্নিত করে দেব। এটার জন্য প‌্যারামিটার ভেরিয়েবলের নামের আগে & (অ্যামপারস্যান্ড) চিহ্ন দিয়ে দিতে হবে।

int square(int <b>&amp;</b>num)
{
    num = num*num;
    return num;
}

void main()
{
    int n=3;
    int r=square(n);
    printf("%d %d", n, r);
}

এখন কনসোলে 9 9 প্রিন্ট হবে।

Comments

comments

About the author

মারুফ মনিরুজ্জামান

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

Leave a Reply