ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন (part 7)

কেমন আছেন সবাই। আশা করি আল্লাহর রহমতে ভাল আছেন। আর সি এর প্র্যাকটিস নিয়মিত করে যাচ্ছেন।
গত পর্বে আমরা ফাংশন ও তার কিছু বেসিক দেখেছিলাম।আজকে আমরা দেখব ফাংশনের pass by value, pass by reference, recurrsion.

Pass by value:

Pass by value হচ্ছে কোন একটি ফাংশন এর মধ্যে যে সকল ভ্যালু প্যারামিটার হিসেবে পাস করা হয়েছে তার ভ্যালু যদি ঐ ফাংশন এর মধ্যে চেঞ্জ করা হয় তবে ঐ চেঞ্জ শুধুমাত্র ঐ ফাংশন এর মধ্যেই চেঞ্জ হবে। ফাংশন যখন আবার যেখান থেকে কল করা হয়েছিল সেখানে ফেরত আসবে তখন ঐ প্যারামিটার এর ভ্যালু আগের মতই থাকবে।

নিচের উদাহরনটি দেখুন।

এখানে কিছু কথা বলে নেয়া ভাল, কোন ফাংশন এক্সেস করার সময় প্যারামিটার এর ভ্যারিএবল ও ফাংশন এর ভ্যারিএবল সংখ্যা অবশ্যই সমান হতে হবে। যেমন ধরুন কোন ফাংশন এর definition টা অনেকটা এরকম

int findmax(int a,int b,int c)

{

//internal code of function

}

এই ফাংশন এক্সেস করার জন্য কোড লিখা হলঃ

value= findmax(x,y,z);

তখন ঐ ফাংশন এর মধ্যে

-->a এর ভ্যালু হবে x এর ভ্যালু

-->b এর ভ্যালু হবে y এর ভ্যালু

-->c এর ভ্যালু হবে z এর ভ্যালু

যে সিরিয়ালে প্যারামিটার উল্লেখ করা হবে ভ্যালুও সেই সিরিয়ালে assigned হবে।

এবার আমরা উদাহরনটি নিয়ে আলোচনা করি। উদাহরনটিতে ফাংশন এর প্যারামিটার ভ্যালু হিসেবে শুধুমাত্র a এর ভ্যালু পাঠানো হয়েছে। আর ফাংশন এর মধ্যে ঐ ভ্যালুটি ডাবল হলেও সেই ডাবল ভ্যালুটি শুধুমাত্র ঐ ফাংশন এর মধ্যেই কার্যকর। তাই যখন  main()  function এ ফেরত এসেছে তখন a এর ভ্যালু হিসেবে ফাংশন এ যাওয়ার সময় যে ভ্যালু ছিল তাই থাকবে।

লক্ষ্য করুন, আমরা যখন ভ্যারিএবল বা অ্যারে নিয়ে আলোচনা করেছিলাম তখন আমরা বলেছিলাম যে, যদি কোন ভ্যারিএবল ডিক্লেয়ার করা হয় সেক্ষেত্রে মেমরীতে ঐ ভ্যারিএবল এর জন্য জায়গা তৈরী হয়। ফাংশন কল এর সময় আমরা যখন প্যারামিটার লিস্ট এ কোন ভ্যারিএবল এর নাম উল্লেখ করছি তখন ঐ ভ্যারিএবল এর ভ্যালুটা argument হিসেবে পাস হয়। আর ফাংশন এর ডেফিনেশন এর মধ্যে যে ভ্যারিএবল এর নাম উল্লেখ করা হয়, ঐ ভ্যারিএবল এর মেমরী লোকেশন এ যে argument receive হয় সেই ভ্যালুটাই assign হয়। তাই যখন ফাংশন এ কোন ভ্যারিএবল এর মান ডাবল করা হচ্ছে, তখনঐ ফাংশনের ভ্যারিএবল এর ভ্যালু ডাবল হচ্ছে,  কিন্তু main() function এর মধ্যে উল্লেখিত ভ্যারিএবল এর মানের কোন পরিবর্তন হয় না। সেকারনে যখন main() function  এ ফেরত আসে, তখন main() function এর  ভ্যারিএবল এর ভ্যালুর কোন পরিবর্তন দেখা যায় না।

Pass by reference:

Pass by reference বোঝার জন্য আমাদের Pointer সম্পর্কে জানা থাকা প্রয়োজন। Pointer নিয়ে আমরা বিস্তারিত পরে দেখব। এখন শুধুমাত্র অল্প ধারনা নিন। তা না হলে pass by reference এর উদাহরনটি ঠিকভাবে বুঝতে পারবেন না।

Pointer variable হলো সে সকল ভ্যারিএবল যারা কোন ভ্যালুর পরিবর্তে "মেমরী লোকেশন" জমা রাখে।

Pointer variable declare করার নিয়মঃ

datatype *variable_name;

datatype হল pointer variable টি কোন integer এর মেমরী লোকেশন রাখবে, না double এর মেমরী লোকেশন রাখবে তা।

pointer variable নামের পূর্বে (*) asterix চিহ্ন দেয়া লাগে।

এতো গেল নাম ডিক্লেয়ার করা। প্রোগ্রাম এ pointer variable ব্যবহার সাধারন ভ্যারিএবল হতে কিছুটা আলাদা।

যেমনঃ ডিক্লেয়ার করার পর অন্য কোথাও যদি শুধুমাত্র ভ্যারিএবল এর নাম লিখা হয় তবে তা memory adderss নির্দেশ করে। আর যদি * দিয়ে ভ্যারিএবল এর নাম লিখা হয় তবে তা ঐ মেমরী লোকেশন এর ভ্যালু নির্দেশ করে।

নিচের প্রোগ্রামটি ও তার কমেন্ট এবং রান করে আউটপুট দেখলে pointer সম্পর্কে প্রাথমিক ধারনা পেয়ে যাবেন।

উল্লেখ্য, %X specifier হল হেক্সাডেসিমেল এ কোন ভ্যারিএবল এর মান দেখায়। মেমরীর কোন এড্রেস সাধারনত হেক্সাডেসিমেল এ দেখানো হয়। উপরের প্রোগ্রামটির আউটপুট এর ক্ষেত্রে u,*pu,v,*pv এর মান সমান (3) । &u,pu এর মান সমান,আবার &v,pv এর মান সমান,কিন্তু তা আলাদা আলাদা কম্পিউটারে আলাদা আলাদা হতে পারে।(মেমরী লোকেশন কি হবে তা সিস্টেম এর উপর নির্ভর করে) ।

Pass by reference এর মানে হচ্ছে প্যারামিটার হিসেবে কোন ভ্যারিএবল এর ভ্যালু পাস না করে ঐ ভ্যারিএবল এর মেমরী লোকেশন পাঠানো হয়। যার ফলে ফাংশন এর মধ্যে ঐ ভ্যারিএবল এর মান পরিবর্তন করা হলে ঐ পরিবর্তনটা main() function এ ফিরে আসার পরও বজায় থাকে।

নিচের উদাহরনটি দেখুন।

উপরের উদাহরনটিতে ভ্যারিএবল এর লোকেশন পাঠানো হয়েছে। ফলে ফাংশন এর মধ্যে ভ্যালুর পরিবর্তন হলে তা main() function এও বজায় থাকে। ফাংশন কল করার সময় মেমরী এড্রেস পাঠানো হলে সেইটি হল pass by reference. **** প্যারামিটার হিসেবে যদি কোন array পাস করা হয় তবে তা pass by reference হয়। যেমনঃ আমরা যখন কোন ক্যারেক্টার অ্যারে পাস করি তখন ঐ অ্যারের কোন value change করলে তা main() function এও চেঞ্জ থাকে।

ফাংশন এর আলোচনায় recursion কিছুটা জটিল। recursion নিয়ে কাল পারলে একটি সম্পুর্ন টিউন করব। আজ এ পর্যন্তই।

গতকালের সমাধানগুলো পেতেএখানে ক্লিক করুন।

আমার টিউন দেখে কেউ যদি উপকৃত হন, তবে আমার কষ্ট সার্থক হচ্ছে বলে মনে করি। আর একটি কথা। আপনাদের মতামত, অভিমত কিংবা সি নিয়ে যেকোন সমস্যা আমার সাথে শেয়ার করুন।

চাইলে আমাকে email ও করতে পারেন এই ঠিকানায়ঃ [email protected]

সি নিয়ে আমার পূর্ববর্তী টিউটোরিয়ালগুলো দেখুনঃ

ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 1)

ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 2)

ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 3)

ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 4)

ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 5)

ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 6)

Level 0

আমি বাকের। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 14 বছর 10 মাস যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 12 টি টিউন ও 81 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 0 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।


টিউনস


আরও টিউনস


টিউনারের আরও টিউনস


টিউমেন্টস

আমি আপনার নিয়মিত পাঠক জদিও একটু একটু সি জানি আপনার লেখা দেখে একটুর পরিমান বারাতে চেস্তা করতেসি ধন্যবাদ……………

    আপনাকে অসংখ্য ধন্যবাদ, সি নিয়ে এগিয়ে যাওয়ার জন্য।

    বাকের ভাই এবার একটু দেরি হয়ে গেল আপনার দেয়া পূর্বের পর্বগুলো ভালভাবে জালাই দিচ্ছি তাই ব্যাস্ত আছি।
    নেটে ডুকলে সময় পার হয়ে যায়।

ভাল হইতেছে চালিয়ে যান,ধন্যবাদ টিউনের জন্য।

আপনাকেও ধন্যবাদ। দোয়া করবেন যেন সম্পূর্ন করতে পারি।

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

    আশা করি খুব দ্রুতই শেষ করতে পারব।

    দ্রুত না হলেও ভালভাবে শেষ করুন সবসময় সঙ্গে আছি।

    ভাই ধীরে সুস্থ্যে সুন্দর ভাবে শেষ করুন।

    এখন তো ভাই প্রিয়তে রাখার ব্যবস্থা হইছে।

Level 0

চালিয়ে যান, ধন্যবাদ।

অনেক অনেক ধন্যবাদ ধারাবাহিক টিউটোরিয়ালের এই পর্বটি দেয়ার জন্য।
আমি part-4 পর্যন্ত প্রোবলেম সমাধান করেছি
সমাধান করতে অনেক সময় লেগে যাচ্ছে। কোড লিখতে গিয়ে দেখি পূর্বেরতা প্রায় ভুলে গেছি।
তাই আপনার দেয়া প্রোবলেম গুলো part-1 থেকেই সমাধান করা শুরু করেছি, এখন কনফিডেন্স অনেক বেড়ে গেছে। প্রথম থেকেই শুরু করা উত্তম।
প্রশ্নঃ
part-3-no-৩
3. ইনপুট এ আপনার নাম নিন। তারপর আপনার নাম এর প্রতিটি ক্যারেক্টার এর ASCII ভ্যালু প্রিন্ট করুন।

int main()
{
char name[10],i;
printf(“Please inter your name:”);
gets(name);
for (i=0; i<10; i++)
printf("Your name's part : name[%d]=%c and Ascll is:%d\n",i,name[i],name[i]);
return 0;
}
আমার নাম shaid দিলে 5 টি দেখানোর পর আরো পাচটি দেখায়। আমি চাই Counter হবে আমার দেয়ে string এর সমান।
আমি Counter Control করতে চাই আমার ইনপুট Chartres এর সমান।
আপনার সময় হলে একটু দেখবেন আর পরে দিলেও সমাস্যা নেই।
Part-5,6, নিয়ে কালকে প্রশ্ন করবো।

অনেক অনেক ধন্যবাদ ধারাবাহিক টিউটোরিয়ালের এই পর্বটি দেয়ার জন্য।
আমি part-4 পর্যন্ত প্রোবলেম সমাধান করেছি
সমাধান করতে অনেক সময় লেগে যাচ্ছে। কোড লিখতে গিয়ে দেখি পূর্বেরতা প্রায় ভুলে গেছি।
তাই আপনার দেয়া প্রোবলেম গুলো part-1 থেকেই সমাধান করা শুরু করেছি, এখন কনফিডেন্স অনেক বেড়ে গেছে। প্রথম থেকেই শুরু করা উত্তম।
প্রশ্নঃ
part-3-no-৩
3. ইনপুট এ আপনার নাম নিন। তারপর আপনার নাম এর প্রতিটি ক্যারেক্টার এর ASCII ভ্যালু প্রিন্ট করুন।

[ int main()
{
char name[10],i;
printf(“Please inter your name:”);
gets(name);
for (i=0; i<10; i++)
printf("Your name's part : name[%d]=%c and Ascll is:%d\n",i,name[i],name[i]);

আমার নাম shaid দিলে 5 টি দেখানোর পর আরো পাচটি দেখায়। আমি চাই Counter হবে আমার দেয়ে string এর সমান।
আমি Counter Control করতে চাই আমার ইনপুট Chartres এর সমান।
আপনার সময় হলে একটু দেখবেন আর পরে দিলেও সমাস্যা নেই।
Part-5,6, নিয়ে কালকে প্রশ্ন করবো।

অনেক অনেক ধন্যবাদ ধারাবাহিক টিউটোরিয়ালের এই পর্বটি দেয়ার জন্য।
আমি part-4 পর্যন্ত প্রোবলেম সমাধান করেছি
সমাধান করতে অনেক সময় লেগে যাচ্ছে। কোড লিখতে গিয়ে দেখি পূর্বেরতা প্রায় ভুলে গেছি।
তাই আপনার দেয়া প্রোবলেম গুলো part-1 থেকেই সমাধান করা শুরু করেছি, এখন কনফিডেন্স অনেক বেড়ে গেছে। প্রথম থেকেই শুরু করা উত্তম।
পিছনের পর্বের সমাধান দিয়ে দেয়ায় সবার অনেক উপকার হবে এটা খুবই ভাল উদ্যোগ।
আমি part-1-3 ওয়ার্ডে সাজিয়েছি আপনি চাইলে দিতে পারি আমি পিডিএফ করতে পারি না। সঠিক হলে তা পিডিএফ আকারে দিয়ে দিলে নতুন দের উপকার হবে। আমি এটা করার উদ্দেশ্য আমার প্রাকটিস এবং টিউটোরিয়ালটি সামনে এগিয়ে নেয়া।

    পারলে আমাকে মেইল করে দেব। আর আশা করছি যেদিন টিউন এর ধারাবাহিক পর্ব শেষ করব, ঐ দিন আমার এডিট করা একটি পিডিফ সাথে দিয়ে দেব। ধন্যবাদ আপনাকে।

    পারলে আমাকে মেইল করে দেবেন (দেব!!)।

প্রশ্নঃ ১
part-3 এর
3. ইনপুট এ আপনার নাম নিন। তারপর আপনার নাম এর প্রতিটি ক্যারেক্টার এর ASCII ভ্যালু প্রিন্ট করুন।
for (i=0; i<10; i++)
printf("name[%d]=%c and Ascll is:%d\n",i,name[i],name[i]);
সমস্যা হল আমি Counter control করতে চাই, ইনপুট string সংখ্যা অনুযায়ি কি array তে মান রাখা সম্ভব।
মানে আমি shaid লিখলে প্রথম ৫টি আউটপুট ছাড়াও অতিরিক্ত ৫টি তৈরি হয়।

    একটু দেরী হয়ে গেল, কাল টেটিতে ঢুকার চান্স পাই নি।
    যা হোক আপনার সমাধানটি ঠিক আছে, শুধুমাত্র counter control এর অংশটি। আমরা জানি যে কোন স্ট্রিং এর সর্বশেষ ক্যারেক্টার হল ” বা null character. তাই আপনি control section এর কন্ডিশন এমন দিতে পারেন।
    for(i=0; name[i] != 0 ; i++) //null এর ASCII value 0. null character ‘ \ 0 ‘
    {
    //code here
    }
    স্ট্রিং এর লেন্থ বের করার জন্য ডিফল্ট ফাংশন রয়েছে strlen() । এটি ব্যবহার করার জন্য লিখতে হবে,
    int len=strlen(name);
    for(i=0; is,1–>h,..,4–>d, 5–>”
    strlen(name) এর ভ্যালু আসবে 5. তাই i<len লিখা লাগে।
    ধন্যবাদ আপনাকে।

    বাকের ভাই ধন্যবাদ চেস্টা করে দেখতেছি। একটা মেইল করেছি।

পেরেছি Control করতে
for(i=0; name[i]!=”; i++) লেখায় কাজ হচ্ছে খুব ভাল ভাবে।
আর
len=strlen(name); দিয়েও ভাল কাজ হয়েছে।