পঞ্চম অধ্যায় পাঠ-২০ ‘সি’ প্রোগ্রামিং ভাষায় ফাংশন।
এই পাঠ শেষে যা যা শিখতে পারবে-
- ১। ফাংশন ব্যাখ্যা করতে পারবে।
- ২। লাইব্রেরী ফাংশন এবং ইউজার-ডিফাইন্ড ফাংশন ব্যাখ্যা করতে পারবে।
- ৩। ফাংশন ব্যবহারের প্রয়োজনীয়তা ব্যাখ্যা করতে পারবে।
- ৪। রিকার্শন ফাংশন এবং এর সুবিধা ও অসুবিধা ব্যাখ্যা করতে পারবে।
ফাংশন: ফাংশন হলো কতগুলো স্টেটমেন্টের সমষ্টি যা একত্রে একটি নির্দিষ্ট কাজ সম্পাদন করে। প্রতিটি ফাংশন ইনপুট নেয়, প্রসেস করে এবং একটি আউটপুট দেয়। প্রতিটি ‘সি’ প্রোগ্রাম এরূপ এক বা একাধিক ফাংশনের সমষ্টি।
Syntax of a function:
ফাংশন ডিক্লারেশনঃ ফাংশন ডিক্লারেশন ফাংশনের রিটার্ন টাইপ, ফাংশনের নাম, ফাংশনের প্যারামিটার সম্পর্কে কম্পাইলারকে তথ্য দেয়।
- ফাংশনের রিটার্ন টাইপ – প্রতিটি ফাংশন একটি মান রিটার্ন করে থাকে। ফাংশনটি কী টাইপের ডেটা রিটার্ন করবে তা Return_type নির্ধারণ করে। কিছু ফাংশন কাঙ্ক্ষিত অপারেশন করলেও অনেক সময় কোন মান রিটার্ন করে না। এই ক্ষেত্রে Return_type হয় void ।
- ফাংশনের নাম– ফাংশনের নাম একটি আইডেন্টিফায়ার যা যেকোন নাম হতে পারে। তবে ফাংশনের নাম অর্থপূর্ণ হওয়া উচিৎ, যাতে নাম দেখেই ফাংশনের উদ্দেশ্য বুঝা যায়। ফাংশনের নাম লেখার ক্ষেত্রে আইডেন্টিফায়ার এর নিয়ম অনুসরণ করে লেখতে হয়।
- ফাংশন প্যারামিটার– প্যারামিটার অংশে ডেটা টাইপ সহ চলক থাকে, যা ফাংশনটি কী ধরণের কয়টি ডেটা ইনপুট নিবে তা নির্ধারণ করে। এটি অপশনাল অর্থাৎ ফাংশনে প্যারামিটার থাকতেও পারে নাও পারে।
ফাংশন ডেফিনেশনঃ ফাংশনটি যে কাজ করবে তার জন্য প্রয়োজনীয় কোড এই অংশে লেখা হয়।
‘সি’ প্রোগ্রামে ব্যবহৃত ফাংশন সমূহকে দুটি ভাগে ভাগ করা হয়। যথা:
- ১। লাইব্রেরি ফাংশন
- ২। ইউজার-ডিফাইন্ড ফাংশন
লাইব্রেরি ফাংশনঃ লাইব্রেরি ফাংশন হলো এমন একটা ফাংশন যার ডেফিনেশন প্রোগ্রামারকে লিখতে হয় না। যেগুলো বিশেষ কিছু কার্য সম্পাদনের জন্য ‘সি’ কম্পাইলারে বিল্ট-ইন থাকে। শুধু প্রয়োজনে সেগুলোকে তাদের নিজস্ব ফরম্যাট অনুযায়ী main () ফাংশনে ব্যবহার বা কল করা হয়। যেমন- scanf(), printf(), gets(), puts(), getchar(), putchar(), abs(), pow(b,p), sqrt(), sin(), cos(), tan(), rand() ইথ্যাদি হচ্ছে লাইব্রেরি ফাংশন। এক্ষেত্রে প্রতিটি লাইব্রেরী ফাংশনের নিজস্ব হেডার ফাইল প্রোগ্রামের শুরুতে লিখে দিতে হয়। লাইব্রেরি ফাংশন দুই প্রকার।
সংখ্যাবাচক ফাংশন : যে ফাংশন গাণিতিক কার্য সম্পাদন করে তাকে সংখ্যাবাচক ফাংশন বলে। যেমন- pow(b,p), sqrt(), sin(), rand() ইত্যাদি।
স্ট্রিং ফাংশন: যে ফাংশন কোনো স্ট্রিং নিয়ে কাজ করে তাকে স্ট্রিং ফাংশন বলে। যেমন- strcpy(), strcat(), strcmp() ইত্যাদি।
বিভিন্ন লাইব্রেরী ফাংশন ও তাদের হেডার ফাইলঃ
লাইব্রেরী ফাংশন | হেডার ফাইল |
scanf(),printf(), gets(), puts(), getchar(), putchar() | <stdio.h> |
sqrt(), pow(), abs(), sin(), cos(), tan(), rand() | <math.h> |
clrscr(), getch() | <conio.h> |
strcpy(), strcat(), strcmp() | <string.h> |
ইউজার-ডিফাইন্ড ফাংশন: ইউজার-ডিফাইন্ড ফাংশন হলো এমন একটা ফাংশন যার ডেফিনেশন প্রোগ্রামারকে লিখতে হয়। যেমন – main() ফাংশন একটি ইউজার-ডিফাইন্ড ফাংশন। কারণ এর ডেফিনেশন প্রোগ্রামার লিখে থাকে। একটি প্রোগ্রামে অবশ্যই একটি main() ফাংশন থাকতে হবে। কারণ কম্পাইলার প্রথমে main() ফাংশন খুজে বের করে এবং সেখান থেকে কাজ শুরু করে। main() ফাংশন ছাড়াও প্রোগ্রামে প্রয়োজনে ইউজার-ডিফাইন্ড ফাংশন তৈরি করে ব্যবহার করা যায়।
ফাংশনের প্রয়োজনীয়তা:
- ১। ফাংশনের সাহায্যে প্রোগ্রাম সংক্ষিপ্ত আকারে রচনা করা যায়।
- ২। ফাংশন ব্যবহারে একই ধরনের কাজের জন্য একই ধরনের স্টেটমেন্ট বার বার লেখার প্রয়োজন হয় না। অর্থাৎ কোড পুনব্যবহার করা যায়।
- ৩। প্রোগ্রামের ভুল সংশোধন বা ডিবাগিং করা সহজ হয়।
- ৪। ব্যবহারকারী তার প্রয়োজন অনুযায়ী ফাংশন তৈরি করে কার্য সম্পাদন করতে পারে।
ফাংশনের উপাদানঃ ‘সি’ প্রোগ্রামে কোনো ইউজার ডিফাইন্ড ফাংশন ব্যবহার করতে গেলে সাধারণত নিম্ন লিখিত চারটি বিষয় বিবেচনা করতে হয়।
- (১) ফাংশন বর্ণনা
- (২) ফাংশন কল
- (৩) ফাংশনের প্রোটোটাইপ
- (৪) ফাংশনের রিটার্ন টাইপ ও রিটার্ন স্টেটমেন্ট
রিকার্সিভ ফাংশনঃ একটি ফাংশন অন্য যেকোনো ফাংশনকে যেকোনো সংখ্যক বার কল করতে পারে। আবার একটি ফাংশন নিজেও নিজেকে কল করতে পারে। যখন কোনো ফাংশন নিজেই নিজেকে কল করে তখন সেই ফাংশনকে রিকার্সিভ ফাংশন বলা হয় এবং এই প্রক্রিয়াকে রিকার্সন বলা হয়। যখন রিকার্সন ব্যবহার করা হয়, তখন প্রোগ্রামারকে অবশ্যই সচেতন থাকতে হবে যেন একটি এক্সিট কন্ডিশন থাকে, অন্যথায় অসীম লুপের সৃষ্টি হবে। বিভিন্ন গাণিতিক সমস্যা যেমন- একটি সংখ্যার ফ্যাক্টরিয়াল গণনা, ফিবোনাচি সিরিচ তৈরি ইত্যাদি সমাধান করতে রিকার্সিভ ফাংশন খুবই কার্যকরি।
রিকার্সিভ ফাংশন ব্যবহারের সুবিধা:
- ১। ফাংশনের অপ্রয়োজনীয় কলিং করতে হয় না।
- ২। রিকার্সনের সাহায্যে সমস্যাকে সহজভাবে সমাধান করা যায়, যেখানে ইটারেটিভ(লুপিং) সমাধান অনেক বড় এবং জটিল।
- ৩। একই সমাধান প্রয়োগের ক্ষেত্রে এটি খুবই কার্যকরী।
রিকার্সিভ ফাংশন ব্যবহারের অসুবিধা:
- ১। রিকার্সিভ সমাধান সর্বদা লজিক্যাল এবং এর সমস্যা সনাক্ত করা কঠিন।
- ২। ইটারেটিভ(লুপিং) সমাধানের চেয়ে রিকার্সিভ ফাংশন নির্বাহে বেশি সময় লাগে।
- ৩। বেশি স্ট্যাক স্পেসের প্রয়োজন হয়।
ফাংশন চেনার সহজ উপায়ঃ ফাংশন চেনার সহজ উপায় হলো ফাংশনের নামের শেষে এক জোড়া প্রথম বন্ধনী ‘( )’ থাকে, এই প্রথম বন্ধনীর মধ্যে অনেক কিছু থাকতে পারে, আবার নাও থাকতে পারে। প্রতিটি ফাংশনের একটি নাম থাকে, যে নামে কম্পাইলার তাকে সনাক্ত করে। প্রোগ্রাম নির্বাহের সময়ে কম্পাইলার যখন কোনো ফাংশন কল করে তখন মূল প্রোগ্রামের কাজ স্থগিত রেখে কল ফাংশনে নির্বাহ শুরু করে এবং নির্বাহ শেষে মূল ফাংশনে প্রত্যাবর্তন পূর্বক পরবর্তী লাইন থেকে নির্বাহ চালিয়ে যায়। তবে এই প্রক্রিয়ায় অতিরিক্ত কিছুটা সময় ব্যয় হয়। তাই ছোট কোনো প্রোগ্রামের জন্য সাধারণত ফাংশন ব্যবহার করা হয় না।
পাঠ মূল্যায়ন-
জ্ঞানমূলক প্রশ্নসমূহঃ
- ক। ফাংশন কী?
- ক। লাইব্রেরী ফাংশন কী?
- ক। ইউজার-ডিফাইন্ড ফাংশন কী?
- ক। রিকার্সিভ ফাংশন কী?
- ক। রিকার্শন কী?
অনুধাবনমূলক প্রশ্নসমূহঃ
- খ। প্রোগ্রামে লাইব্রেরী ফাংশন এবং ইউজার-ডিফাইন্ড ফাংশন এক নয়-ব্যাখ্যা কর।
- খ। main() কোন ধরণের ফাংশন? ব্যাখ্যা কর।
- খ। কোন ধরণের ফাংশন ব্যবহারে প্রোগ্রামে হেডার ফাইল লিখতে হয়?
- খ। প্রোগ্রামে লাইব্রেরী ফাংশন ব্যবহারে হেডার ফাইল লিখতে হয় কেন?