সোমবার, ১২ মে, ২০১৪

ফাংশন



আজ আমরা সি প্রোগ্রামিং এর সবথেকে সুন্দর ফিচার ফাংশন সম্পর্কে জানব। 

মনে করো আমাদের একটা বুক সেলফ বানানো দরকার। তো কি করব? প্রথমে বাগান থেকে একটা গাছ চুরি করে কেটে আনব। তারপর সেটাকে দেব ছ মিলে। ছ মিল আমার কাছ থেকে গাছটা নিয়ে ফেরত দেবে কাঠ। তারপর কাঠগুলো আমরা দেব ফার্নিচার মার্ট এ। ফার্নিচার মার্ট আমাদের কাছ থেকে কাঠগুলো নিয়ে ফেরত দেবে আমাদের কাঙ্ক্ষিত বুক সেলফ। তাই নয় কি? হুমম??

ছ মিল বা ফার্নিচার মার্ট কে আমরা একেকটা ফাংশন হিসেবে কল্পনা করতে পারি। ছ মিলের ফাংশন ইনপুট হিসেবে নিয়েছে গাছ এবং আউটপুট হিসেবে দিয়েছে কাঠ। আর ফার্নিচার মার্টের ফাংশন ইনপুট হিসেবে নিয়েছে কাঠ আর আউটপুট হিসেবে দিয়েছে বুক সেলফ। একটা ফাংশনের আউটপুট অন্য একটা ফাংশনের ইনপুট হতেই পারে। 

তো ফার্নিচার মার্টের মালিক আমার ঘনিষ্ঠ আত্মীয়। তিনি বললেন যে, একটা বুক সেলফই তো! তিনি আমাকে ফ্রি দিয়ে দিলেন। মানে এক্ষেত্রে তিনি ইনপুট হিসেবে কিছু নিলেন না কিন্তু আউটপুট ঠিকই দিলেন। 

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

মানে একটা ফাংশনের ইনপুট থাকলেই যে আউটপুট থাকবে তা নয়। আবার আউটপুট থাকলে যে ইনপুট থাকবে তাও নয়। 

সি প্রোগ্রামিং এ আমরা হামেশাই printf(); ফাংশনটা ইউস করে থাকি। এই ফাংশনটা কি করে? প্রিন্ট করে। কিন্তু আমরা কি জানি যে printf(); লিখলেই কেন প্রিন্ট করে? 

কম্পিউটার তো আর ইংরেজি বোঝে না যে সে বলবে ও!!! print বলেছে তো, প্রিন্ট করে দেই। 
আসলে এটা একটা লাইব্রেরী ফাংশন। ফাংশনটা কিভাবে কাজ করবে তা লেখা আছে stdio.h হেডার ফাইল এ। আবার কিছু ফাংশন আছে যেগুলো কিভাবে কাজ করবে তা আমরা ইউসাররা বলে দেই। সেগুলোকে বলা হয় ইউসার ডিফাইনড ফাংশন। 

ফাংশন দুই প্রকার।

১। লাইব্রেরী ফাংশন।
২। ইউসার ডিফাইনড ফাংশন। 

লাইব্রেরী ফাংশন নিয়ে আমাদের কোন চিন্তা নেই। সেগুলো তৈরি করাই আছে। এখন আমরা ইউসাররা ফাংশন তৈরি করব।  

ফাংশন তৈরি করার জন্য ফাংশনের একটা নাম চাই। তো নাম দিলাম function_name. ফাংশনের নামের পর () দিতে হয়। এরপর দরকার ফাংশনের একটা রিটার্ন টাইপ যা ফাংশনের নামের আগে থাকে। মনে করি রিটার্ন টাইপ হল return_type. আর কি? 
হুম মনে পরেছে। আর থাকে ফাংশন বডি। ফাংশন বডি হল {} এর মাঝের অংশ। 

তাহলে আমাদের বানানো ফাংশনের চেহারাটা এরকম-

return_type function_name()
{

}

ফাংশনটা যদি কোন কিছু রিটার্ন না করে তবে  return_type এর জায়গায় void বসবে। 

আর যদি কোন কিছু রিটার্ন করে তবে return_type এর জায়গায় ওই ডাটার টাইপ টা বসবে আর ফাংশন বডির শেষ স্টেটমেন্ট টা হবে এরকম-

return var;

এখানে var হল সেই ভেরিয়েবল যার মান ফাংশনটার রিটার্ন করার কথা। main() ফাংশনের আগে আমাদের বানানো ফাংশনটা থাকতে হবে। আর তা না হলে কম্পাইলারকে জানিয়ে দিতে হবে যে অমুক নামের একটা ফাংশন আছে main() ফাংশনের পরে যেটা আমরা বানিয়েছি। সেটা বলার জন্য ফাংশনটার প্রোটোটাইপ বলে  দিতে হবে। 
একটা ফাংশনের প্রোটোটাইপ হল ওই ফাংশনের বডি বাদে সবটুকু। ওপরের ফাংশনের প্রোটোটাইপ হল-

return_type function_name(); 

এখানে ; দিয়েছি কারন এটার মাধ্যমে একটা ইন্সট্রাকশন দিচ্ছি। 

এখন আমাদের বানানো ফাংশনটাকে কল করতে হলে শুধু

function_name();

লিখলেই হবে। ফাংশনটাকে কল করলে প্রোগ্রামের control ওই ফাংশন এ চলে যাবে এবং ফাংশন বডিতে থাকা স্টেটমেন্ট গুলো execute হবে। তারপর আবার প্রোগ্রামের control সেই ফাংশন এ চলে যাবে যে ফাংশন থেকে ফাংশনটা কল করা হয়েছিল।
ফাংশন এ কোন ডাটা পাঠাতে হলে তা () এর মধ্যে লিখতে হয়। 

int function(int x,int y)
{
    int z;
    z=x+y;
    return z;
}

int main()
{
    int a,b,c;
    a=1,b=2;
    c=function(a,b);
    printf("%d",c);
    return 0;
}

ওপরের উদাহরনে main() ফাংশন থেকে function(); কল করা হয়েছে এবং দুটো ইনটিজার মান পাঠানো হয়েছে। আর called function মান দুটোকে রিসিভ করেছে দুটো ইনটিজার টাইপ ভেরিয়েবল দিয়ে। মানগুলো পরপর ভেরিয়েবলের জন্য নির্ধারিত হবে। যে ফাংশন অন্য কোন ফাংশনকে কল করে তাকে বলে calling function আর যে ফাংশনকে কল করে তাকে বলে called function.
function(); ফাংশন আবার একটা ইনটিজার মান রিটার্ন করেছে যা c এর জন্য নির্ধারিত হয়েছে। main() ফাংশনের রিটার্ন টাইপ int, মানে ফাংশনটা সিস্টেমকে একটা ইনটিজার মান রিটার্ন করবে। main() ফাংশনের বডিতে return 0; মানে ইনটিজার মানটা হল 0.

ফাংশন শেষ। অনেক বকবক করলাম। তাই না? হুমম??
আজ তাহলে উঠি।

হ্যাপি কোডিং!!! :)
                                 


শনিবার, ১০ মে, ২০১৪

ফাইল-২


গত পর্বে আমরা ফাইলের বেসিক কিছু ফাংশন শিখেছিলাম ফাইল I/O বিষয়ক। তার আগে শিখেছিলাম কিভাবে ফাইল খুলতে হয়, বন্ধ করতে হয়। আজ আমরা ফাইলের কয়েকটা গুরুত্বপূর্ণ ফাংশন নিয়ে আলোচনা করবো।
তার আগে ফাইল সম্পর্কে আমাদের আরও একটু জানতে হবে। আমরা যখন একটা ফাইল ওপেন করি, ফাইল টা যদি ঠিকঠাক ওপেন হয় তাহলে ওই ফাইলের একটা পয়েন্টার fp রিটার্ন করে । তার মানে fp ওই ফাইলটাকে পয়েন্ট করে। ফাইলটাকে পয়েন্ট করা মানে ফাইলের প্রথম ক্যারেক্টারটাকে পয়েন্ট করা। তাই আমরা যখন ফাইল থেকে ক্যারেক্টার নেই তখন প্রথম ক্যারেক্টার টা আসে। আমরা যদি fp কে আমাদের ইচ্ছেমত কোথাও নিয়ে যেতে পারি তবে আমরা আমাদের ইচ্ছেমত ডাটা পড়তে পারব। 

fseek();

এই ফাংশন এর সাহায্যে ফাইল পয়েন্টার কে ইচ্ছেমত ফাইলের যেকোন position এ পাঠানো যায়।
নিয়মঃ

fseek(fp,n,position);

এখানে fp হল সেই ফাইল পয়েন্টার যেটাকে আমরা অন্য পজিসন এ পাঠাব, n হল যে কয় বাইট সরাবো আর position হচ্ছে যেখান থেকে সরাবো।
n এর মান +ve হলে fp সামনের দিকে যাবে অন্যথায় পেছনে যাবে।
প্রথম থেকে ফাইল পয়েন্টার টাকে সরাতে চাইলে 0,
শেষ থেকে ফাইল পয়েন্টার টাকে সরাতে চাইলে 2, ফাইল পয়েন্টারটাকে বর্তমান পজিসন থেকে সরাতে চাইলে 1

ftell();

ফাইল পয়েন্টার এর বর্তমান পজিসন জানতে ইউস করা হয়। তার মানে ফাংশনটা রিটার্ন করে ফাইল পয়েন্টার এর বর্তমান পজিসন।
নিয়মঃ

n= ftell(fp);

rewind();

ফাইল পয়েন্টার এর পজিসন রিসেট করতে ইউস করা হয়। তার মানে যদি ফাংশনটা কল করা হয় –

rewind(fp);

তাহলে fp এর মান 0 হয়ে যাবে।প্রথম ক্যারেক্টারটাকে 0 দিয়ে indicate করা হয়। 

feof();

এই ফাংশনটি ব্যাবহার করা হয় এটা জানার জন্য যে ফাইল পয়েন্টারটা ফাইলের একদম শেষে পৌঁছেছে কিনা, তার মানে EOF কনডিশন। যদি ফাইলের সব ডাটা পড়া হয়ে গিয়ে থাকে তো ফাংশনটা nonzero integer রিটার্ন করে, অন্যথায় zero. নিয়মঃ

feof(fp);

ferror();

ফাইল পয়েন্টারটা এই পর্যন্ত আসতে কোথাও কোন error ঘটেছে কিনা তা জানার জন্য এই ফাংশনটা ইউস করা হয়। যদি কোন error ঘটে থাকে তবে ফাংশনটা nonzero integer রিটার্ন করে, অন্যথায় zero.
নিয়মঃ

ferror(fp);

fflush();

আমরা যখন কীবোর্ড থেকে কোন কিছু লিখি তখন তা বাফার এ থাকে। ফাইল ফাংশন নিয়ে কাজ করার সময় ডাটা সেখান থেকে ফাইল এ যায়। এক্ষেত্রে কিছু error ঘটতে পারে যেমন বিদ্যুৎ চলে যেতে পারে বা অন্য কোন কারনে কম্পিউটার বন্ধ হয়ে যেতে পারে। সেক্ষেত্রে এই ডাটা গুলো আমরা আর পাবনা।তাই ফাইল লেখার কাজ নিশ্চিত করার জন্য এই ফাংশন ব্যাবহার করা হয়।
নিয়মঃ

fflush(fp);

আমরা ফাইল শিখে ফেললাম। কি মজা!!!
অনেক বকবক করলাম না? হুমম............
আজ তাহলে এপর্যন্তই............
হ্যাপি কোডিং !!! :)

শুক্রবার, ৯ মে, ২০১৪

ফাইল-১

আজ আমরা সি প্রোগ্রামিং এর অনেক মজার একটা বিষয় শিখব। কনটেস্ট প্রোগ্রামিং এ ফাইল ইউস হয় না কিন্তু অনেক গুরুত্বপূর্ণ কাজ আমরা ফাইল ছাড়া করতে পারি না। ফাইল এমন একটা মজার বিষয় যে যদি তুমি একবার এটা শিখে নাও তবে সারাক্ষণ ফাইল নিয়েই কাজ করতে চাইবে। ফাইল মূলত ইউস হয় ইনপুট নেয়ার জন্য অথবা আউটপুট দেয়ার জন্য।

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

ফাইল ওপেন করাঃ

ফাইল ওপেন করার জন্য যে ফাংশন ব্যাবহার করা হয় সেটা হল 

fopen(“filename”,”mode”);

filename হল ইউসারের দেয়া কোন নাম। mode মানে হল আমি কিসের জন্য ফাইলটা ওপেন করবো। ইনপুট নেয়ার জন্য না আউটপুট দেয়ার জন্য; মানে আমরা ফাইল থেকে কিছু পড়বো না কিছু লিখব। 

ফাইল mode প্রধানত তিনটাঃ

১। ফাইল থেকে কিছু পরার জন্য  r:

এই mode ইউস করলে filename নামে যদি কোন ফাইল   থাকে  তবে সেটা ওপেন হবে আর না থাকলে error ঘটবে। 

২। ফাইল এ কিছু লেখার জন্য  w :

এই mode ইউস করলে filename নামে যদি কোন ফাইল থাকে  তবে তার content গুলো মুছে যাবে এবং ফাইল টা ওপেন হবে। আর যদি না থাকে তবে filename নামে নতুন একটা ফাইল  create হবে আর তা ওপেন হবে। 

৩। ফাইলের শেষে কিছু ডাটা যোগ করার জন্য  a:

এই mode ইউস করলে filename নামে যদি কোন ফাইল থাকে তবে তার content গুলো সুরক্ষিত থাকবে এবং ফাইল টা   ওপেন  হবে। আর যদি না থাকে তবে filename নামে নতুন  একটা ফাইল  create হবে আর তা ওপেন হবে। 

অনেক নতুন কম্পাইলার কিছু additional mode সাপোর্ট করে। সেগুলো হলঃ

r+ :ফাইল থেকে ডাটা পড়া ও ফাইলে ডাটা লেখার জন্য ব্যাবহার করা হয়। 
w+ : এক্ষেত্রে ফাইল থেকে ডাটা পড়া ও ফাইলে ডাটা লেখাও যায়।
a+ : এক্ষেত্রে ফাইল থেকে ডাটা পড়াও যায়। 

fopen(); ফাংশন কল করার নিয়ম হল-

FILE *fp;
fp=fopen(“filename”,”mode”);

এখানে FILE হল একটা structure যা stdio.h হেডার ফাইল এ ডিক্লেয়ার করা আছে। আমাদের FILE টাইপের pointer নিয়ে কাজ করতে হবে। ফাইল ফাংশনগুলো যখন কল হয় তখন তারা ওই ফাইলের একটা pointer রিটার্ন করে, যদি কোন error ঘটে তবে NULL রিটার্ন করে।  

ফাইল বন্ধ করাঃ
ফাইল বন্ধ করার জন্য শুধু নিচের লাইনটা লিখতে হবে-

fclose(file_pointer);

ফাইল I/O অপারেশনঃ 

putc();

ফাইলে একটা করে ক্যারেক্টার লিখতে putc(); ইউস করা হয়।
নিয়মঃ

putc(c,fp); 

এখানে c হল সেই ক্যারেক্টার যেটা আমরা লিখব।আর fp হল সেই ফাইলের পয়েন্টার যে ফাইলে আমরা লিখব।

getc();

ফাইল থেকে একটা করে ক্যারেক্টার পড়তে getc(); ইউস করা হয়।
নিয়মঃ

getc(fp);

এই ফাংশন EOF না পাওয়া পর্যন্ত কাজ করে। 

fputs();

ফাইলে string লিখতে fputs(); ইউস করা হয়।
নিয়মঃ

fputs(string,fp);

যদি string ফাইলে ঠিকমত লেখা হয় তবে ফাংশনটি +ve মান রিটার্ন করে অন্যথায় EOF রিটার্ন করবে। 

fgets();

ফাইল থেকে ডাটা stringআকারে পড়তে ফাংশনটি ইউস করা হয়।
নিয়মঃ

fgets(string_variable,n,fp);

এখানে string_variable হল একটা string ভেরিয়েবলn হল একটা পূর্ণ সংখা,আর fp হল সেই ফাইলের পয়েন্টার যে ফাইল থেকে string পড়া হবে। ফাংশনটা ফাইল থেকে n-1 সংখ্যক ক্যারেক্টারের একটা string নেবে যেটাকে string_variable পয়েন্ট করবে। যদি ফাংশনটি ঠিকমত কাজ করে তবে string_variable এর pointed এড্রেসটা রিটার্ন করবে। অন্যথায় NULL রিটার্ন করবে। 

fprintf();

ফাইলে ডাটা লেখার জন্য fprintf(); ইউস করা হয়।
নিয়মঃ

fprintf(fp,”format specifier”,arguments);

fscanf();

ফাইল থেকে ডাটা পড়ার জন্য fscanf(); ইউস করা হয়।
নিয়মঃ

fscanf(fp,”format specifier”,&arguments); 

fprintf(); fscanf(); এর কাজ অনেকটা printf(); scanf(); এর মতই। 

putw();

ফাইলে int সংখ্যা লিখতে putw(); ইউস করা হয়।
নিয়মঃ

putw(integer,fp); 

getw();

ফাইল থেকে int সংখ্যা পড়তে getw(); ইউস করা হয়।
নিয়মঃ

getw(fp);
 
ফাংশনটা EOF না পাওয়া পর্যন্ত কাজ করে। 

আমরা ফাইল ওপেন করা, বন্ধ করা আর ফাইলে কিভাবে লিখতে হয় বা ফাইল থেকে কিভাবে ডাটা পড়তে হয় তা শিখলাম। আরও কিছু ফাংশন আছে যেগুলো দিয়ে ইচ্ছেমত randomly ফাইল নিয়ে কাজ করা যায়। আমরা সেগুলো আগামী কোন এক দিন শিখব ইনশাল্লাহ।
আজ তাহলে উঠি।
হ্যাপি কোডিং !!! :)