কেমন আছেন সবাই। আশা করি আল্লাহর রহমতে ভাল আছেন। আর সি এর প্র্যাকটিস ঠিকমত চালিয়ে যাচ্ছেন। আজ আমরা সি এর একটি অতি গুরুত্বপূর্ন বিষয় নিয়ে আলোচনা করব। আজকে আমরা ফাংশন এর কিছু বেসিক ধারনা, প্রয়োজনীয়তা ও প্রোগ্রামের মধ্যে এর ব্যবহার দেখব।
ফাংশন নিয়ে আলোচনা করার পূর্বে আমাদেরকে এর প্রয়োজনীয়তা জানা দরকার। আমার গত টিউনে আমি প্রবলেম এর সমাধান হিসেবে একটি প্রাইম নাম্বার চেক এর কোড করে দেখিয়েছিলাম।গতপর্বের সমাধান পেতে এখানে ক্লিক করুন। ঐ প্রোগ্রাম এ আমরা শুধুমাত্র একটি নাম্বার প্রাইম কি প্রাইম না তা চেক করেছিলাম। এখন ধরুন আমাদের প্রোগ্রাম এর বিভিন্ন জায়গায় প্রাইম টেস্ট করা দরকার। তখন আপনি কি করবেন? প্রতিবার ঐ একই কোড লিখবেন। এ ধরনের সমস্যার সমাধা্নই হচ্ছে ফাংশন। ফাংশন লিখার ফলে একই কোড বারবার লিখতে হয় না।
ফাংশন হচ্ছে একটি প্রোগ্রাম সেগমেন্ট যা কিছু সুনির্দিষ্ট কাজ করে থাকে। সকল সি প্রোগ্রাম এক বা একাধিক ফাংশন এর সমন্বয়ে গঠিত। আমরা যে main() declare করি ও তার মধ্যে বিভিন্ন কাজ করি সেই main() ও একটি ফাংশন। ফাংশন লিখার কিছু নিয়ম রয়েছে। এগুলো নিচে উল্লেখ করছি।
ফাংশন এর general form:
return_type function_name(type1 par1,type2 par2,.....,typeN parN)
{
contents of function;
return ret_value;
}
type1 parameter1,type2 parameter2,.... ,type_n parameter n হল parameter_list.
এখানে return_type হচ্ছে ফাংশনটি যে ভ্যালু return করবে তার ডাটাটাইপ। এখানে উল্লেখ্য, return করা বলতে প্রোগ্রাম এর যে জায়গা হতে function call করা হয়েছে সে জায়গায় ভ্যালু ফেরত পাঠানো। function_name হচ্ছে ঐ ফাংশন এর নাম। ফাংশন এর নামকরনের ক্ষেত্রে identifier declare করার নিয়ম মানতে হয়। identifier নিয়ে আমরা প্রথম্ টিউনেই আলোচনা করেছিলাম।আর parameter_list হচ্ছে ঐ প্রোগ্রামে যে সকল ভ্যালু পাঠাতে হয় তার list. আমরা সি তে যেসকল ডিফল্ট ফাংশন দেখেছিলাম তেমন একটি ফাংশনের স্ট্রাকচার দেখুন।
toupper() ফাংশন এর কাজ ছিল একটি ক্যারেক্টার নিয়ে তার uppercase ফেরত পাঠানো। উপরের ফাংশনটিতে function_name এর পরে ব্র্যাকেটে char ch হল parameter list. parameter যদি একাধিক হত তবে parameter গুলো কমা (",") দিয়ে লিখা হত। যেমনঃ pow(int base,int power) . পাওয়ার ফাংশন এর দুইটি প্যারামিটার। একটি হল বেস ,আরেকটি পাওয়ার।
প্রথমে উল্লেখ করা char হল return_type. toupper ফাংশনটি একটি character নিয়ে তার আপারকেস character return করে।
ফাংশন এর সর্বশেষ লাইনটি হচ্ছে return statement. ঐ স্টেটমেন্ট এর মাধ্যমে ফাংশনটি যে জায়গা হতে call করা হয়েছিল সে জায়গায় return এর ভ্যালু নিয়ে ফিরে আসে।উপরের ফাংশনটিতে যখন return ch; স্টেটমেন্টটি execute হবে তখন ch এর ভ্যালু যেখান থেকে ফাংশনটি call করা হয়েছে,সেখানে পাঠাবে এবং code এর execution ও সেখানে ফেরত আসবে।
return_type এর মধ্যে int,float,double,char, [unsigned/signed specifier] সহ datatype উল্লেখ করা যায়। কিছু কিছু ফাংশন রয়েছে যারা শুধুমাত্র parameter নেয়ার পর ঐ ফাংশন এর সুনির্দিষ্ট কাজ করে কিন্তু কোন ভ্যালু return করে না। সে ধরনের ফাংশন এর return_type হিসেবে declare করা হয় void । যদি কোন ফাংশন এর পূর্বে কোন ডাটাটাইপ উল্লেখ করা না হয় তবে সেই ফাংশন এর ডাটাটাইপ void ধরা হয়। return_type হিসেবে কোন array সি তে ডিক্লেয়ার করা যায় না।
main function হতে কোন ফাংশন কল করার জন্য ঐ ফাংশন এর নাম ও তার প্যারামিটার এর ভ্যালু উল্লেখ করে দিতে হয়।
toupper() একটি ডিফল্ট ফাংশন। আর _toupper হচ্ছে আমাদের define করা ফাংশন।দুটো ফাংশন এর নাম আলাদা রাখা হয়েছে।
যদি কোন ডিফল্ট ফাংশন এর header file declare করা না থাকে তবে ঐ নামে অন্য কোন ফাংশন declare করা যায়। কিন্তু যদি header file declare করা থাকে তবে ঐ নামে অন্য কোন ফাংশন declare করা যায় না। আমাদের উপরের প্রোগ্রামটিতে ফাংশন এর নাম চাইলে _toupper কেটে toupper লিখলে error message দেখাবে না। কিন্তু যদি #include<ctype.h> দেয়া হয় সেক্ষেত্রে আর ফাংশন এর নাম toupper দেয়া যাবে না।
ফাংশনকে main function হতে, কিংবা অন্য ফাংশন হতে কিংবা যে ফাংশন এ থাকবে সেটা থেকেও কল করা যায়। কোন ফাংশন হতে ঐ ফাংশনকে কল করাকে recurrsion বলা হয়। পরবর্তী টিউনে recurrsion নিয়ে আলোচনা করব।
ফাংশন দুইভাবে প্রোগ্রাম এ লিখা যায়। একটি হল main() function এর পূর্বে, আরেকটি হল main() function এর নিচে। main function এর উপরে লিখার ক্ষেত্রে সাধারন নিয়মে একটি ফাংশন ডিক্লেয়ার করার পর আরেকটি ফাংশন, এভাবে সবগুলো ফাংশন ডিক্লেয়ার করা হয়।আর main() function এর নিচে কোন একটি, দুটি বা সবগুলো ফাংশন ডিক্লেয়ার করা যায়। সেক্ষেত্রে যে ফাংশনটি main() function এর পর ডিক্লেয়ার করা হবে তার প্রথম লাইন বা declaration টা main() function এর উপর লিখে সেমিকোলন( ; ) দিতে হয়। আর main() function এর নিচে ফাংশনটি সম্পূর্ণ করা হয়। নিচের উদাহরনটি দেখুন।
উপরের উদাহরনটিতে একটি ফাংশন main() function এর পূর্বে, আর দুইটি ফাংশন main() function এর নিচে ডিক্লেয়ার করা হয়েছে।
এবার একটি ফাংশন লিখছি যার কাজ হচ্ছে তিনটি সংখ্যা ইনপুট নিয়ে তার মধ্য থেকে সবচেয়ে বড় সংখ্যাটি return করবে। return type যেহেতু নাম্বার তাই ডাটাটাইপ ডিক্লেয়ার করছি int.
নিচের উদাহরনটি দেখুনঃ
উপরে উল্লেখিত প্রোগ্রামটিতে আমরা তিনটি integer value এর মধ্যে সবচেয়ে বড়টি বের করার একটি ফাংশন লিখেছি। এখন আমার যেখানে প্রয়োজন সেখানে শুধুমাত্র ফাংশনটি কল করে কাজটি করতে পারি।
আজ এ পর্যন্তই। কাল আমরা ফাংশন এর pass by value, pass by reference, recursion নিয়ে আলোচনা করব।
এবার ঝটপট নিচের প্রোগ্রামগুলো করে ফেলুন। কেননা প্র্যাকটিস না করে সি পড়ে তেমন লাভ নেই।
১। এমন একটি প্রোগ্রাম লিখুন যে প্রোগ্রামটি শুন্য(0) ইনপুট দেয়ার আগে পর্যন্ত একটি করে integer input নিবে এবং তা প্রাইম হলে "%d is prime" আর না হলে "%d is not prime show" করবে।
২। এমন একটি প্রোগ্রাম লিখুন যা q ইনপুট দেয়ার আগে পর্যন্ত একটি ক্যারেক্টার ইনপুট নিবে এবং তার lowercase আউটপুট এ দেখাবে।
৩। এমন একটি প্রোগ্রাম লিখুন যে প্রোগ্রামটি শুন্য(0) ইনপুট দেয়ার আগে পর্যন্ত একটি করে integer input নিবে এবং ঐ নাম্বার এর সবগুলো ডিজিট এর যোগফল দেখাবে।
৪। এমন একটি প্রোগ্রাম লিখুন যে প্রোগ্রামটি শুন্য(0) ইনপুট দেয়ার আগে পর্যন্ত একটি করে integer input নিবে এবং ঐ নাম্বারটিকে reverse order এ show করবে।যেমনঃ ১২০ দিলে ০২১,১২৫৪ দিলে ৪৫২১ ইত্যাদি।
আমার টিউন দেখে কেউ যদি উপকৃত হন, তবে আমার কষ্ট সার্থক হচ্ছে বলে মনে করি। আর একটি কথা। আপনাদের মতামত, অভিমত কিংবা সি নিয়ে যেকোন সমস্যা আমার সাথে শেয়ার করুন।
চাইলে আমাকে email ও করতে পারেন এই ঠিকানায়ঃ [email protected]
ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 1)
ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 2)
ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 3)
ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 4)
আমি বাকের। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 14 বছর 9 মাস যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 12 টি টিউন ও 81 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 0 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।
বাকের ভাই ধন্যবাদ ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন (Part 6) দ্রুত নিয়ে আসার জন্য।
আপনার টিউনে শুধু পুথিগত বিদ্যা নয় বাস্তব অভিজ্ঞতার ছোয়া পাওয়া যায়।
তাই আপনার টিউন আমার খুব ভাল লাগে।
শুধু ভাল লাগে তা নয় প্রাকটিসও করি, কিন্তু বেধে যাচ্ছি না বলে প্রশ্ন করি না। আগে থেকেই হলকা টাচ ছিলতো তাই।
একটা অভিজ্ঞতা হয়েছে শুধু বই থেকে নিয়ম শিখে প্রোগ্রামিং শেখা
সম্ভম নয়।
চালিয়ে যান।