ভাষা যখন C/C++



এই লেখাটি আমি লিখেছিলাম ২০০৯ সালে, সেসময় wordpress এ Mad Science Blog নামক একটা ব্লগে রেগুলার লেখালিখি করতাম। আলসেমি করে এই সিরিজটা নিয়ে আর আগানো হয়নাই। সেসময়ে এই লেখাটা নিয়ে বেশ ভালো ভালো মন্তব্য আসায়, ভাবলাম দুয়েকটা জিনিষ অদল-বদল করে নতুনভাবে এখানে আপলোড করি। C প্রোগ্রামিং এর সাথে আমার প্রথম পরিচয় ঘটে আমার এক চাচার মাধ্যমে (সম্পর্কে আমার চাচা হলেও তার আর আমার বয়স প্রায় কাছাকাছি হওয়ায় তার সাথে এক রকম বন্ধুত্বের সম্পর্ক) ।

তখন  আমি ঢাকা বিশ্ববিদ্যালয়ের পদার্থ বিজ্ঞান বিভাগের সম্ভবত ১ম বর্ষের শেষ ভাগে পড়তাম আর সে কম্পিউটার সায়েন্স এ পড়ত।কম্পিউটার সায়েন্সের ছাত্র ছিল বিধায় C programming তার কোর্স এর অংশ ছিলো । একদিন প্রসঙ্গক্রমে সে তার তৈরি করা কিছু program DOS এ run করে দেখায় ।
courtesy:back40design.com

ব্যাপারটা আমার এতটাই পছন্দ হয় যে মনে মনে আমার ও DOS এ ওই রকম ভয়াবহ (!) জিনিষগুলো ঘটানোর ইচ্ছা জেগে উঠে । আমি তার পরামর্শ মত নীলক্ষেতের দোকান ঘুরে ঘুরে Herbert Schildt এর Teach Yourself C বইটি কিনে নিজে নিজেই প্রোগ্রামিং করার চেষ্টা শুরু করে দেই । কিন্তু বইয়ের কয়েক পৃষ্ঠা উল্টানোর পরই বুঝতে পারি বইটির বিষয়বস্তু আমার মাথার উপর দিয়ে চলে যাচ্ছে । এবং আমার প্রোগ্রামিং শেখার প্রথম পর্বের সমাপ্তি ঘটে ।
৩য় বর্ষে পা দেবার পর (দুর্ভাগ্যক্রমে !!) ঐ C programming কে আমাদের সিলেবাসের একটি টপিক হিসাবে পাই । এবং তখন অনেকটা বাধ্য হয়েই আমি আবার C programming নিয়ে ঘাটাঘাটি শুরু করি ।
বিষয়টা নিজের খানিকটা আয়ত্ত হবার পর আমার সহপাঠি ও বন্ধুদের ও বোঝানোর সময় programming এর algorithm ব্যাখ্যা করতে গিয়ে ওদের সামনে  বিভিন্ন সময় বিভিন্ন উদাহরণ ব্যবহার করতাম । আমি সেই উদাহরণগুলোই এখানে একসাথে করে তুলে ধরার চেষ্টা করব । কোন advance level এর প্রোগ্রামিং এর ধারে কাছে যাবার ইচ্ছাও নেই ।আমি নিজেও এ বিষয়ে একজন মুখ্যু-সুখ্যু মানুষ । কোনদিন এ নিয়ে কোর্স করার সৌভাগ্য হয়নি । যারা পুরোদস্তুর প্রোগ্রামার আমার লেখা পড়ছেন কোন ভুল থাকলে অনুগ্রহ করে comment এ জানিয়ে দেবেন ।

পুনশ্চঃ do–while loop এর ব্যবহার আর Array বোঝানোর ক্ষেত্রে উদাহরণগুলো আমি রাগিব ভাই এর ব্লগ -যন্ত্র গণকের যন্তর মন্তর -, থেকে মেরে দিয়েছি  । Loop আর Array এর জন্য এর থেকে সহজ উদাহরণ আমি কোথাও পাইনি এমনকি আমার বন্ধুদেরকে বোঝাতেও আমি বার বার উনার উদাহরণগুলোই ব্যবহার করে এসেছি । রাগিব ভাই অনুগ্রহ করে ক্ষমা করে দেবেন । চলুন তবে শুরু করা যাক -

বড় বড় সমস্যাকে যদি আমারা ছোট ছোট ধাপে ভেঙ্গে ফেলি তাহলে সেটা সমাধান করা বেশ সহজ হয়ে যায়।আর প্রোগ্রামিং এর মূল কথাই হলো বড় সমস্যাকে ছোট ছোট ধাপে ভেঙে সমাধান করা।উদাহরণ দিয়ে বোঝানো যাকঃ

Do-While loop:

ধরা যাক, আপনাকে বলা হলো ১ থেকে ৫ পর্যন্ত সংখ্যাগুলোর যোগফল বের করতে হবে, অর্থাৎ ১+২+৩+৪+৫=?
ব্যপারটা খুবই সোজা । হাতে হাতেই হিসাব করা যায় । আমরা যদি এভাবে চিন্তা করি, "এক আর দুইয়ে তিন, তিন আর তিনে ছয়, ছয় আর চারে দশ, দশ আর পাঁচে পনের", অর্থাৎ আমাদের চিন্তাটা ধাপে ধাপে আগাচ্ছে, প্রতি ধাপে একটা করে সংখ্যা আমরা আগের যোগফলে যোগ করে দিচ্ছি। হাতে হাতে করার জন্য, মনে করুন আমরা টেবিলের উপরে ১ থেকে ৫ পর্যন্ত সংখ্যাগুলো রেখেছি। আর  যোগ করার বুদ্ধিটা করলাম এমন, যে বাঁ হাত দিয়ে টেবিল থেকে একটা সংখ্যা তুলবো, আর সেটাকে ডান হাতে যা ছিলো তার সাথে যোগ করে ডান হাতেই ধরে রাখবো।
courtesy: clipartpanda.com

যেমন, ১ হতে ৫ পর্যন্ত যোগ করতে হলে, প্রথমে ডান হাতে কিছুই নাই, মানে ০। প্রথম সংখ্যাটি ১। সেটাকে শূন্যের সাথে যোগ করে পেলাম ১।
পরের সংখ্যাটি ২, সেটাকে আমাদের এপর্যন্ত যোগফল ১ এর সাথে সেটাকে যোগ দিলে হয় যোগফল ৩।
পরের সংখ্যাটা ৩, সেটাকে আমাদের এপর্যন্ত যোগফল ৩ এর সাথে যোগ করে পেলাম নতুন ফল ৬।
পরের সংখ্যাটা ৪, সেটাকে আমাদের এপর্যন্ত যোগফল ৬ এর সাথে যোগ করে পেলাম নতুন ফল ১০।
পরের সংখ্যাটা ৫, সেটাকে আমাদের এপর্যন্ত যোগফল ১০ এর সাথে যোগ করে পেলাম নতুন ফল ১৫।
ব্যস, আমাদের যোগফল বের করার কাজটা শেষ, ১ থেকে ৫ এর যোগ ফল দাঁড়ালো ১৫।
এখন দেখা যাক, এই কাজটা কম্পিউটারকে কীভাবে বোঝানো যায় –

ডান হাতে শুরুতে কিছু নাই |
#(প্রথম ধাপ)# ডানহাতে = ০ একেবারে শুরুতে বাম হাতও খালি
 #(দ্বিতীয় ধাপ)# বামহাত = ০ আমরা যেটা করবো, তা হলো বাম হাতে একটা একটা সংখ্যা তুলবো, শর্ত ৫ পর্যন্ত তুলার পরে থামবো। প্রতিবারে বাম হাতে আগে যা তুলেছিলাম, তার পরের সংখ্যাটি উঠাবো।
#(তৃতীয় ধাপ)# বামহাত (নতুন মান) = বাম হাতের আগের মান + ১ এইবার ডানহাতে যা ছিলো, তার সাথে বাম হাতেরটা যোগ করে ডান হাতেই রাখবো |
 #(চতুর্থ ধাপ)# ডান হাত (নতুন মান) = ডান হাতের পুরানো মান + বাম হাতে যা তুলেছি। এখন কাজ কি শেষ হয়েছে? মানে বাম হাতে ৫ তুলে ফেলেছি কি? যদি ফেলে থাকি, তাহলে কাজ শেষ, নইলে আবার উপরের ধাপে ফিরে যেতে হবে।
 #(পঞ্চম ধাপ)# বাম হাতে যদি ৫ এর চেয়ে ছোট সংখ্যা থাকে, তাহলে কাজ শেষ হয়নি, সুতরাং তৃতীয় ধাপে ফেরত যাই। নইলে কাজ শেষ, পরের ধাপে যাই।
 #(ষষ্ঠ ধাপ)# ডান হাতে যা আছে, সেটাই যোগফল, চটপট বলে ফেলি সেটা স্যারকে।

এই বুদ্ধিটা একটা সি ল্যাঙ্গুয়েজের প্রোগ্রাম আকারে লিখলে কেমন দাঁড়াবে দেখা যাক,

rightHand = 0 // ডান হাত শুরুতে খালি
leftHand = 0 // শুরুতে বাম হাতও খালি
do { leftHand = leftHand + 1 // বাম হাতে আগের সংখ্যাটা যা ছিলো, তার পরেরটা নিলাম। প্রথম বারে কিছুই ছিলোনা, তার সাথে ১ যোগ করে পেলাম বাম হাতে ১
rightHand = leftHand + rightHand } //ডানহাতে আগে যা ছিলো, তার সাথে বামহাতেরটা যোগ করি, তারপর যোগফলটা ডান হাতেই জমা রাখি।
while (leftHand <5) // এই কাজটি চালিয়ে যাবে যতক্ষন এর মান 5 এর কম থাকবে

do–while দিয়ে লেখা অংশটি একটি লুপ বা চক্রকোড। সেটি চলবে ততক্ষণ, যখন while এর পরের শর্তটি সত্য থাকবে। যতক্ষণ ঐ শর্তটি সত্য থাকবে, প্রোগ্রামটি লুপের শেষ মাথায় পৌছে আবার প্রথম অংশে লাফ দিয়ে যাবে। (ব্যাখ্যা ছাড়া সি কোডটি হবে নিচের মতো)

rightHand = 0; leftHand = 0; do { leftHand = leftHand + 1; rightHand = rightHand + leftHand; } while (leftHand<5);

তাহলে ৫ পর্যন্ত যোগ করাটা বোঝা গেলো। ১০০ পর্যন্ত কীভাবে যোগ হবে? একই পদ্ধতি, তাই না? কেবল শর্তের লাইনটিতে ৫ তুলে ফেলেছি কি না তার বদলে আমরা দেখবো ১০০ তুলেছি কি না। সেই একটা সংখ্যা পালটে দিলেই উপরের পদ্ধতিতে ১০০ পর্যন্তও যোগ করা যাবে।

For loop:

courtesy: jeffpalm
Do-while loop দিয়ে আমরা যে কাজটি করেছি ঠিক সেই কাজটি for loop দিয়েও করা যাবে । শুধু code এর structure টা একটু change করে দিতে হবে। কিভাবে? উপরের same problem টি আমরা যদি for loop দিয়ে করি তাহলে জিনিষটা দাঁড়াবে এরকম-
rightHand=0; for (leftHand=1; leftHand<5; leftHand=leftHand+1) { rightHand = rightHand+leftHand }

do-while আর for loop দুটোর function ই প্রায় কাছাকাছি , শুধু ব্যবহারের সময় code টা একটু পরিবর্তন করে নিতে হয়

if-else:

ধরা যাক রাশেদ কয়েকজন বন্ধুসহ বইমেলায় গেছে। বেশ কিছু বই কিনে বের হয়ে আসার সময় একটা দোকানে একটা বিশেষ বইয়ের উপর তার চোখ আটকে গেলো , এই বইটা সে বহুদিন ধরে খুঁজছে।
courtesy: condenaststore

ধরা যাক বইটির দাম ২০০ টাকা ।সে মানিব্যাগ বের করে শেষ কয়টি টাকা হিসাব করা শুরু করল । যদি নিজের টাকায় না কুলায় তাহলে প্রয়োজনে বন্ধুদের কাছ থেকে ধার করে হলেও বইটা কিনবে। এই সমস্যাটা আমরা এভাবে লিখতে পারি-

#(প্রথম ধাপ)# যদি রাশেদের কাছে টাকা থাকে সে নিজের টাকায় বইটি কিনবে। #(দ্বিতীয় ধাপ)# টাকা না থাকলে সে ধার করবে । এবং বইটি কিনবে ।

এরকম এটা হলে ওটা হবে বা এটা নাহলে ওটা হবে না(ছোটবেলায় যেমন translation পড়তাম-“বৃষ্টি না হলে বাবা বাজারে যাবে”) এরকম condition মূলক হাবিজাবি জিনিষ কম্পিউটারকে বোঝাতে আমরা if-else ব্যবহার করে থাকি । এটাকে programming এর ভাষায় লিখতে পারি-

if(রাশেদের কাছে ২০০ টাকা অথবা এর বেশি থাকে) { সে নিজের টাকায় বইটি কিনবে } //টাকা থাকলে সে “সেকেন্ড ব্র্যাকেট” এর ভিতরেরcondition full-fill করবে
else { সে টাকা ধার করে বইটি কিনবে } // টাকা না থাকলে সে এই condition full-fill করবে

ব্যাখ্যা ছাড়া C code টি দাঁড়াবে এরকম-

if (n>=200) { Rashed buy the book } //n=রাশেদের পকেটে টাকার পরিমান
else { He will lend money to buy the book }

রাশেদ টাকা ধার করে বই কিনল না নিজের টাকায় বই কিনলো আমি আর সেই বিষয়ে নাক গলাতে গেলাম না । বিষয়টা কম্পিউটারকে বুঝিয়ে দিয়েই আমার ছুটি

Array:

ধরা যাক একটা তালিকা থেকে সবচেয়ে বেশি বা কম একটা মান খুঁজে বের করতে হবে। ধরা যাক, ১০০টা সংখ্যা দেয়া আছে, তার থেকে সবচেয়ে বড় সংখ্যাটা বের করতে হবে।
১টা যদি সংখ্যা হয়, তাহলে তো আর ঝামেলা নাই। যেটা আছে, সেটাই সবচেয়ে বড়। কাজ শেষ।
২টা যদি সংখ্যা হয়, তাহলে তাদের তুলনা করলেই পাবো কোনটা বড়। সংখ্যা দুইটা ডানহাত ও বামহাত – এই দুই জায়গায় নিয়ে বুঝতে পারি কোনটা বড়।
এখন একটা উদাহরণ দেয়া যাক করিম সাহেব বাজারে গিয়েছেন জাম্বুরা কিনতে। দোকানী এক গাদা জাম্বুরা সাজিয়ে বসে আছে, সবগুলো দেখতে একই আকারের লাগছে। কিন্তু জাম্বুরা কিনে কিনে চুল পাকানো করিম সাহেব ভালো করেই জানেন, জাম্বুরা যত ভারী হবে, ততো তার স্বাদ ভালো, মজা বেশি। প্রশ্ন হলো, করিম সাহেব কী করে একগাদা জাম্বুরা থেকে সবচেয়ে ভারীটি বের করবেন?
courtesy:londonliving.at

একটা জাম্বুরা হলে কথাই নেই , ওটাই সবচেয়ে ভারী (যেহেতু তার কাছে জাম্বুরা বেছে নেবার কোন optionই নেই)।কিন্ত দুটো জাম্বুরা হলে??তাহলে করিম সাহেব দুই হাতে দুইটা জাম্বুরা নিয়ে সহজেই বুঝতে পারবেন  কোনটা ভারি। 
এখন যদি জাম্বুরার সংখ্যা দুই এর বেশি হয় তাহলে?? সেটাও সহজ, প্রথমে করিম সাহেব প্রথম দুইটা জাম্বুরা দুই হাতে নিলেন, ধরা যাক ডান হাতেরটা ভারি। তখন বাম হাতেরটা ফেলে ৩য় জাম্বুরাটা বাম হাতে নিলেন, দেখতে চেষ্টা করলেন কোনটা ভারি। ডান হাতে আছে প্রথম দুইটার মধ্যের ভারিটা, আর বাম হাতে অন্যটা, এর মধ্যে যেইটা ভারি হবে, সেটাই ৩টা জাম্বুরার সবচেয়ে ভারিটা।
এই কাজটাকে একটু সাংকেতিক ভাবে এভাবে লেখা যায়, ধরাযাক তিনটা সংখ্যা আছে x, y, z যদি x ও y এর মধ্যে x বড় হয়, তাহলে x ও z এর মধ্যে যেটা বড়, সেটাই বৃহত্তম,
অন্যথায় যদি x ও y এর মধ্যে y বড় হয়, তাহলে y ও z এর মধ্যে যেটা বড়, সেটাই বৃহত্তম। অর্থাৎ আমরা বলতে চাচ্ছি-

if x>y largest = x else largest =y; if z>largest then largest = z;

এই কথাটাই C programming এর ভাষায় লেখা যায়-

if (x>y) { if (x>z) largest = x; else largest = z; } // যদি x এর মান y এর থেকে বড় হয় আবার x এর মান z এর থেকেও বড় হয় তাহলে largest number =x অন্যথায়z
else { if (y>z) largest = y; else largest = z; } // যদি x এর মান y এর থেকে ছোট হয় আবার y এর মান z এর থেকে বড় হয় তাহলে largest number =y অন্যথায় z

মানে তিনটা সংখ্যার প্রথম দুইটার মধ্যে বড় যেটা, সেটার সাথে পরেরটার তুলনা করে যেটাকে বড় পাবো, সেটাই সবচেয়ে বড়।
কিন্তু যদি ঝুড়িতে যদি ৫০টি জাম্বুরা থাকে, তাহলে কী করবেন তিনি? মূলনীতিটা কিন্তু একই থাকছে, কাজেই এভাবে আগানো যেতে পারে, শুরুতে কোনটা ভারী, তা করিম সাহেব জানেননা, তাই তিনি আন্দাজে একটা বেছে নিয়ে ধরলেন সেইটাই সবচেয়ে ভারী। ঐ জাম্বুরাটাকে নিয়ে রাখলেন ডানহাতে।
এবার ঝুড়ি থেকে একটা একটা জাম্বুরা বাম হাতে নেন, আর দেখেন ডান হাতেরটার চেয়ে এই নতুনটা ভারী কি না। যদি ভারী হয়, তাহলে কথাই নেই, ডান হাতেরটাকে অন্য কোথাও রেখে দিয়ে বাম হাত থেকে নতুন ভারী জাম্বুরাটি ডান হাতে পাচার করে দেন । এভাবে একটা একটা করে ঝুড়ির সবগুলো দেখা হয়ে গেলে সব শেষে করিম সাহেবের ডান হাতে যা থাকছে, সেটাই ঝুড়ির সবচেয়ে ভারী জাম্বুরা।
এখন সেটা programming এর ভাষায় কিভাবে লেখা যেতে পারে??
ধরাযাক, ১০০টি জাম্বুরা আছে, যাদের নম্বর দেয়া হলো ০ থেকে ৯৯ পর্যন্ত (কম্পিউটার বিজ্ঞানীরা আবার ০ থেকে গোণা শুরু করে) । আর জাম্বুরা গুলোর ওজন ধরা যাক আছে weight[0] থেকে weight[99] এভাবে।
আমাদের কাজ হবে বেকুব কম্পিউটারকে বোঝানো, ১০০টি জিনিষের মধ্যে সবচেয়ে ভারী কোনটা, সেটার ক্রমিক নম্বরটি আমাদের জানানোর কৌশল।
শুরুতে, ধরে নেই প্রথমটি সবচেয়ে ভারী।
heaviest = 0 ; (প্রথমটির ক্রমিক নং হলো ০ )
আর সবচেয়ে ভারী জাম্বুরাটির ওজন আমরা মনে রাখবো max_weight নামে, প্রথমে যেহেতু ধরেছি শুরুর জাম্বুরার ওজন বেশি, তাই সেটার ওজনকেই এখানে মনে রাখি। max_weight = weight[0];
এবার এক এক করে বাকি গুলোকে পরীক্ষা করি, দেখি এই max_weight এর বেশি পাই কি না (আমরা একটা একটা করে না লিখে বেকুব কম্পিউটার যেইটা ভালো পারে, সেই পুনরাবৃত্তি তথা লুপের মাধ্যমে করা যায়। সংখ্যা যেহেতু ১০০টি, কাজেই আমাদের অত বার মাপামাপির কাজ করলেই চলবে। এই জন্য কম্পিউটারকে নির্দেশ দেয়া যাক, ১০০ বার সে একটা করে ওজন তুলুক, তার পর দেখুক এইটা আগের চেয়ে ভারী কি না)

for (i = 1; i<100; i++) { //এখন কোনটা নিয়ে কাজ করা হচ্ছে, তা i এর মধ্যে রাখবো, আর প্রতি বার লুপের ভিতরের কাজ শেষ হলে ১ করে বাড়াবো। প্রথমটা (০তম) তো দেখেই ফেলেছি, তাই এখন দ্বিতীয়টা, মানে ক্রমিক নং ১থেকে ৯৯ পর্যন্ত বাকি ৯৯টা নিয়ে দেখলেই চলবে)
if (weight[i]>max_weight){ // আগের ওজনদার-তম জাম্বুরার চাইতে এই নতুনটা ভারী কি?
heaviest = i; max_weight=weight[i] } //তাহলে এই নতুনটাই সবচেয়ে ভারী, ঐটার ওজনটা মনে রেখে দিলাম।

ব্যস, এই কাজটুকু শেষ ওজন পর্যন্ত করে গেলেই সব শেষে heaviest এর মধ্যে পাবো সবচে ভারী জাম্বুরাটির ক্রমিক নম্বর, আর তার ওজন পাবো max_weight এর মধ্যে।

Pointer:

ধরা যাক কামরুল সাহেব একটা ব্যাংকের কয়েকটি safety deposit box এ তার মূল্যবান কিছু জিনিষ জমা রেখেছেন। এবং কোন  deposit box এ কি রয়েছে তা ছোট ছোট কার্ড এ লিখে তার বাসায় আলমারির ভেতর রেখে দিয়েছেন যেন প্রয়োজনের সময় সহজেই তা খুঁজে পেতে পারেন ।
courtesy:caglecartoons.com

Pointer এর কাজ ঐ আলমারির ভেতরের ছোট কার্ডগুলোর মত । Programming এর সময় pointer গুলো variable এর data ধারণ করে, যেন প্রয়োজনের সময় শুধু ঐ pointer কে call করলেই variable এর value পেতে পারি । অর্থাৎ

#(প্রথম ধাপ)#কোন deposit box এ কি আছে সেটা কার্ডে লিখে ফেলি । #(দ্বিতীয় ধাপ)#deposit box এর জিনিষ খুজতে কার্ড এর নম্বর দেখি ।

C++ programming এর ভাষায় আমরা লিখতে পারি –

{ int *card; int depositbox; //pointer এর আগে সবসময় “*” দিয়ে নির্দেশ করা হয় । এখানে int  দিয়ে বোঝানো হচ্ছে card আর deposit box এর নম্বর দুটোই পূর্ণ সংখ্যা বা integer ।
depositbox =10; //ধরে নিলাম ১০ নম্বর deposit box এ একটি মূল্যবান জিনিষ রয়েছে ।
card = &depositbox; //deposit box এর নম্বরটা কার্ডে লিখে ফেললাম ।
cout<<*card; //কোন জিনিষ খুজতে হলে এবার কার্ড এর নম্বরটা দেখি ।

আর কিছু করা লাগবে না । এভাবে করে এক একটি deposit box এর নম্বর এক একটি কার্ড এ লিখে গেলেই প্রয়োজনের সময় শুধু কার্ডটিকে call করলেই কামরুল সাহেব তাঁর দরকারি জিনিষগুলো খুঁজে বের করতে পারবেন । আজ এতটুকুই থাক । সবাই ভালো থাকবেন আমার এই পোস্টটিতে প্রোগ্রামিং এর একদম প্রাথমিক ধারণা সম্পর্কে আলোচনা করা হয়েছে , প্রোগ্রামিং এর আরও উদাহরণের জন্য এই লেখাগুলি দেখতে পারেন

**পূর্বে প্রকাশিতঃ Mad Science Blog (আগস্ট, ২০০৯)