সূচিপত্র

কোনো এক ফ্যাক্টরিতে একটি রুম আছে। এ রুমের বৈশিষ্ট্য হল এখানে একটা বল পাঠানো হলে সেটা সবুজ রঙ করে দেওয়া হয়। এখানে তিন ধরণের জিনিস আছে।

  • ইনপুট : আমরা প্রথমে যে সাদা বলটা ভেতরে পাঠাচ্ছি
  • রুমের ভেতরের কার্যকলাপ : রঙ করা
  • আউটপুট : কাজ শেষে আমরা যে সবুজ বলটা ফিরে পাচ্ছি

ফাংশনের ব্যাপারটিও ঠিক এরকম। আমরা এই রঙ করার ব্যাপারটিকেই একটি ফাংশনের সাথে তুলনা করতে পারি। এ ফাংশনের চারটি জিনিস আছে।

  • প্রথমত, ফাংশনটির আছে একটি নাম, ধরা যাক rongKorarMachine
  • দ্বিতীয়ত, ফাংশনটি একটা ইনপুট চায়, এক্ষেত্রে সাদা বল। এই ইনপুটটাকে বলা হয় ফাংশনের প্যারামিটার
  • তৃতীয়ত, ফাংশনটির ভেতরে বিভিন্ন কাজ হয়।
  • চতুর্থত, ফাংশনটি একটি সবুজ বল আউটপুট দেয়। এটাকে বলা হয় রিটার্ন টাইপ

তো আমরা সি-তে একটি ফাংশন লেখার চেষ্টা করি। এজন্য তিনটি জিনিস দরকার – ফাংশন ডিক্লারেশন, ফাংশন ডেফিনিশন এবং ফাংশন কল। তার আগে বল তো নিচের কোডে কী হবে?

#include <stdio.h>
int main() {
    int a,b,sum;
    a=7;
    b=13;
    sum=a+b;
    return sum;
}

হ্যা, এই কোডে কোনো কিছু প্রিন্ট হবে না ঠিক। কিন্তু আমরা যে এতদিন দেখে এসেছি “Process returned 0”, তার পরিবর্তে এবার লেখা থাকবে “Process returned 20″।

Snap 2015-08-04 at 21.49.25

অর্থাৎ এবার রিটার্ন হবে sum ভ্যারিয়েবলের মানটা। এ ব্যাপারে পরবর্তীতে ফিরে আসছি। এখন চলে যাব মূল আলোচনায়।

ফাংশন ডিক্লারেশন

প্রথমেই আমাদেরকে বুঝতে হবে ফাংশন ডিক্লেয়ার করবো কীভাবে। ফাংশন ডিক্লেয়ার করার সময় আমাদের প্রয়োজন হয় তিনটি জিনিস – রিটার্ন টাইপ, ফাংশনের নাম এবং ফাংশনের প্যারামিটার। আমরা এই তিনটি জিনিস নিচের মত করে লিখবঃ

return_type function_name (parameter_type parameter_name);

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

তাহলে ডিক্লারেশনটা হবে নিচের মতঃ

int sum (int a, int b);

আমি এখানে ইন্টিজার প্যারামিটার দু’টির নাম দিয়েছি a,b। তুমি চাইলে এগুলোর নাম oga, moga যা খুশি দিতে পার! এই ডিক্লারেশনটাকে আমরা লিখবো মেইন ফাংশনের উপরে গ্লোবাল স্কোপে।

#include <stdio.h>
int sum(int a, int b); 
int main() {

    return 0;
}

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

int sum (int a, int b) {

}

এখন আমরা ফাংশনটি বানিয়েছি যোগ করার জন্য। তাই অবশ্যই এখন একটা ভ্যারিয়েবল লাগবে যোগফলটা স্টোর করার জন্য। তো আমরা এই কাজটি করেই ফেলি!

int sum (int a, int b) {
    int s;
    s = a+b;
}

এখন আমাদের কাজ হল এই যোগফল রিটার্ন করে দেওয়া। কাজটি খুবই সহজ। আমরা মেইন ফাংশনের “return 0;”-এর মতই লিখবো “return s;”।

int sum (int a, int b) {
    int s;
    s = a+b;
    return s;
}

এবার চলে যাও একেবারে শুরুতে দেখানো উদাহারণটাই। যখন আমাদের প্রসেস রিটার্ন করে দিয়েছিল 20। এবার বুঝেছ ব্যাপারটা? return 0 লেখার কারণটাও সেই সাথে বুঝে যাওয়ার কথা! 🙂

এখন প্রশ্ন হল আমরা এই ডেফিনিশনটা কোথায় লিখবো? মেইন ফাংশনের উপরে (অবশ্যই ডিক্লারেশনের নিচে) না মেইন ফাংশনের নিচে? উত্তর হল, এটা আমরা দুই জায়গাতেই লিখতে পারি। তবে আপাতত আমি লিখবো মেইন ফাংশনের উপরেই। তাহলে কোডটা দাঁড়াচ্ছেঃ

#include <stdio.h>
int sum (int a, int b);
int sum (int a, int b) {
    int s;
    s = a+b;
    return s; 
}

int main() {
    
    return 0;
}

ফাংশন কল

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

int main() {
    int s;
    return 0;
}

খেয়াল কর, আমাদের sum ফাংশনেও a, b এবং s নামের ভ্যারিয়েবল ছিল। কিন্তু এই দু’টি স্কোপ পুরোপুরি ভিন্ন হওয়ায় এরা একে অপরের কাজে কোনো প্রভাব বিস্তার করবে না! এক ফাংশনের ভ্যারিয়েবলের অন্য একটি ফাংশনের ভ্যারিয়েবলের উপর কোনোরূপ প্রভাব নেই।

আর ফাংশন কল (ডাক) করার ব্যাপারটা খুবই সহজ। আমরা শুধু ফাংশনের নামটি লিখবো এবং প্যারানথেসিসের (প্রথম বন্ধনী) মধ্যে প্যারামিটারগুলো পাঠাবো।

এক্ষেত্রে sum (a,b);

যেহেতু ফাংশনটি একটি ভ্যালু রিটার্ন করবে, সেহেতু আমরা খুব সহজেই একটা “=” অপারেটর দিয়ে এই রিটার্ন করা মানটা মেইন ফাংশনের s ভ্যারিয়েবলে রেখে দিতে পারি। এজন্য আমরা লিখবোঃ

int main() {
    int a, b, s; // a ar b jog korte hobe 
    a = 7;
    b = 13;
    s = sum(a,b);
    return 0;
}

প্রিন্ট করার স্টেটমেন্ট সহ আমাদের পুরো কোড দাঁড়াচ্ছে এমনঃ

#include <stdio.h>
int sum (int a, int b);
int sum (int a, int b) {
    int s;
    s = a+b;
    return s;
}

int main() {
    int a, b, s; // a ar b jog korte hobe
    a = 7;
    b = 13;
    s = sum(a,b);
    printf("Sum = %d\n", s);
    return 0;
}

আউটপুটঃ

Snap 2015-08-04 at 22.07.17

অর্থাৎ সব কাজ ঠিকভাবেই হল! এখন আমরা চাইলে ফাংশনটার ডিক্লারেশন আর ডেফিনিশন একসাথেই দিতে পারতাম এভাবেঃ

#include <stdio.h>

int sum (int a, int b) {
    int s;
    s = a+b;
    return s;
}

int main() {
    int a, b, s; // a ar b jog korte hobe
    a = 7;
    b = 13;
    s = sum(a,b);
    printf("Sum = %d\n", s);
    return 0;
}

আবার চাইলে ফাংশনটি মেইন ফাংশনের নিচেও লিখতে পারি। তবে সেক্ষেত্রে অবশ্যই ফাংশনটির ডিক্লারেশন মেইন ফাংশনের উপরে হতে হবে

#include <stdio.h>
int sum (int a, int b);

int main() {
    int a, b, s; // a ar b jog korte hobe
    a = 7;
    b = 13;
    s = sum(a,b);
    printf("Sum = %d\n", s);
    return 0;
}

int sum (int a, int b) {
    int s;
    s = a+b;
    return s;
}

আবার আমরা চাইলে ফাংশনের মধ্যে নতুন ভ্যারিয়েবল ডিক্লেয়ার না করে শুধু রিটার্ন ফাংশনের মধ্যেই কাজ চালিয়ে দিতে পারতাম নিচের মতঃ

int sum (int a, int b) {
    return a+b;
}

এটাও ঠিক আগের মতই কাজ করবে!

আমাদের ফাংশনের রিটার্ন টাইপ ইন্টিজার ছাড়াও হতে পারে char কিংবা double কিংবা float! যেমন নিচের ফাংশনটা বর্ণমালায় একঘর ডানের বর্ণটা প্রিন্ট করবেঃ

#include <stdio.h>
char ekGhorDaane(char c) {
    c = c+1;
    return c;
}
int main() {
    char a;
    printf("Input : ");
    scanf("%c", &a);
    printf("%c", ekGhorDaane(a));
    return 0;
}

এখানে প্রিন্ট করার স্টেটমেন্টটা খেয়াল কর। হ্যা, এভাবেও লেখা যায়। আরেকটা নতুন জিনিস শেখা হল! 🙂 তবে এই কোডে সমস্যা হল z ইনপুট দিলে আউটপুট কোনো বর্ণ আসে না। ধর আমরা চাই,  z ইনপুট দিলে আসবে আউটপুট আসবে a। এই কোডটা তোমরাই ডিবাগ করে নাও!

আবার নিচের কোডটা বৃত্তের ক্ষেত্রফল বের করবেঃ

#include <stdio.h>
double getArea(int radius) {
    double area = 3.14159 * radius * radius;
    return area;
}
int main() {
    int radius;
    printf("Radius please : ");
    scanf("%d", &radius);
    printf("Area = %.2lf\n",getArea(radius));
    return 0;
}

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

#include <stdio.h>
void getArea(int radius) {
    double area = 3.14159 * radius * radius;
    return area;
}
int main() {
    int radius;
    printf("Radius please : ");
    scanf("%d", &radius);
    printf("Area = %.2lf\n",getArea(radius));
    return 0;
}

এটা রান করলে নিচের এররটা দেখাবেঃ

warning: ‘return’ with a value, in function returning void [enabled by default]|
অর্থাৎ আমরা ভুল করেছি! এটাকে আমরা যদি লিখিঃ

#include <stdio.h>
void getArea(int radius) {
    double area = 3.14159 * radius * radius;
}
int main() {
    int radius;
    printf("Radius please : ");
    scanf("%d", &radius);
    printf("Hello world.\n");
    return 0;
}

এখন এটা ঠিক ভাবেই কম্পাইল হবে!

আমরা চাইলে কোনো প্যারামিটার না পাঠিয়েও ফাংশন লিখতে পারি। যেমনঃ

#include <stdio.h>
void printMessage() {
    printf("I love my country, Bangladesh.\n");
}
int main() {
    printMessage();
    return 0;
}

মেইন ফাংশনেরও কিন্তু কোনো প্যারামিটার দরকার পড়ে না!

এবার তোমার কাজ হবে নিচের কাজগুলো ফাংশন লিখে করাঃ

(১) একটি ইন্টিজার ইনপুট নিয়ে সেটা জোড় না বিজোড় সেটা বের করা।

(২) একটি ক্যারেক্টার ইনপুট নিয়ে সেটা consonant নাকি vowel সেটা বের করা।

(৩) ax2 + bx + c – এ সমীকরণের a, b আর c ইনপুট নিয়ে x-এর দু’টি মান প্রিন্ট করা। 

Muntasir Wahed

Muntasir Wahed

System Administrator at স্বশিক্ষা.com
Jack of all trades, master of none.
Muntasir Wahed
Muntasir Wahed