শিক্ষক মামা – ৫

আমি আর আপু মামার ঘরে গিয়ে দেখি, মামার অবস্থা বেশি ভালো না।মামাকে দেখে আমার খুব মায়া হচ্ছিল। কিন্তু আপুর সেই দিকে কোন খেয়ালই নাই।  আপুর মাথায় শুধু প্রোগ্রামিং –

* মামা, এখন তো বিশ্রাম নেয়ার সময় না। মনে আছে তো আজই আমাদেরকে প্রোগ্রামিং শেখা শেষ করতে হবে-

% হুম, তা আর ভুলার সময় দিলি কই ? তো এখন কি করতে হবে ?

* লুপতো কিছুটা বুঝেছি, কিন্তু আরো কিছু উদাহরণ দিলে –

% হয়েছে আর বলতে হবে না, স্কেচবুক বের কর-

# মামা আমিও করি?

% কর, তবে আজ শুধু ইমি কে বুঝাবো, তোকে বুঝাতে গেলে দিন শেষে আমরা লুপের ভিতরেই ঘুরতে থাকব, হা হা হা…

* মামা, এর পর কি করতে হবে বল-

% কি দিয়ে শুরু করতে চাস?

* সকালে যেভাবে শুরু করেছি, posttest loop মানে do while loop দিয়ে।

% আচ্ছা, নে শুরু কর, এখন তো আর কলম ব্যবহার করা যাবে না, আমাদেরকে একটি variable ব্যবহার করতে হবে। এটাকে বলে loopvariable।

এলগরিদম ৪.১ফ্লোচার্ট ৪.১
 
কমপক্ষে একবার কাজ করবে
এরপর,
   শর্ত সত্য থাকা পর্যন্ত কাজ করতে থাকবে
  আর  শর্ত মিথ্যা হলে সমাপ্ত।
 
আমাদের কিন্তু loop variable এর
   শুরু – initialization
   শেষের শর্ত- condition
   কত করে বাড়বে – increment
এই বিষয়গুলো খেয়াল রাখতে হবে।

# মামা, এই ফ্লোচার্ট ( Flowchart) আবার কি ?

* আরে এইটা জানিস না ? অ্যালগরিদম সহজে বুঝার জন্য ফ্লোচার্ট ব্যবহৃত হয় । ফ্লোচার্ট দেখে সহজে বুঝা যায় প্রোগ্রাম কীভাবে কাজ করে। এক এক জনের ফ্লোচার্ট দেখতে এক এক রকম হতে পারে। এক কথায়, অ্যালগরিদমের কথাগুলো ছবির মাধ্যমে বুঝানোই ফ্লোচার্টের কাজ।

% ওয়াও, তুই তো দেখি অনেক কিছু জানিস।

* কি যে বল মামা, এটা তো সবাই জানে। তুমি আগে যে অ্যালগরিদমগুলো সেগুলোরফ্লোচার্ট ও আমার কাছে করা আছে। ফ্লোচার্ট থাকলে কোড করতে সুবিধা হয়।

% সাবাস, তুই তো আমার থেকে এক ধাপ  এগিয়ে!

* মামা,  কি যে বল, তুমি হল গিয়ে ওস্তাদ আর আমি হলাম তোমার শিষ্য।

% হা হা, ভালো বলেছিস। এক দিন সময় করে তোর ফ্লোচার্টগুলো দেখব, চল এখন do while জন্য একটি প্রোগ্রাম লিখে ফেল-

প্রোগ্রাম ৪.১

 প্রোগ্রামপ্রোগ্রামের আউটপুট




 
 



 


১০
#include <stdio.h>
 int main ()
{
  int a = 10;
/* loop variable initialization */
/* do loop execution */
 do {
  printf(“value of a: %d\n”, a);
  a = a + 1;
/* loop variable increment */
  } while( a <15 );/* loop condition */
   return 0;
}
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14  

% দেখ, এখানে a থেকে শুরু হয়েছে, এরপর do এর ভিতরে কাজ শেষে a এর মান এক করে বাড়ানো হয়েছে, আর শেষে while  এর ভিতরে শর্ত দেয়া হয়েছে, যে যতক্ষন  a এর মান ১৫ এর কম থাকবে এই লুপ চলতে থাকবে।

     এখানে ছয় থেকে নয় নাম্বর লাইন পর্যন্ত do while এর অংশ, আর একটি বিষয় লক্ষ্য রাখতে হবে ৯ নাম্বার লাইনে while এর পর কিন্তু “;” আছে। আর এটা নিয়ে আমরা পরে কথা বলব।

# মামা, তুমি না বলেছিলে শর্ত মিথ্যা হলেও একবার কাজ করবে ?

% ও তাই নাকি? চল দেখি কাজ করে কিনা –

প্রোগ্রাম ৪.১.১

 প্রোগ্রামপ্রোগ্রামের আউটপুট

.
.


১০
১১
১২
১৩
 int a = 10;
 /* loop variable initialization */
 ……….
 ……………
  a = a + 1;
/* loop variable increment */
}while( a < 5 );
/* loop condition */
      ………..
value of a: 10  

% এখানে a এর মান ১০ থেকে শুরু হয়েছে, কিন্তু আমরা শর্ত দিয়েছি a এর মান ৫ এর ছোট থাকা পর্যন্ত লুপ চলবে আর প্রতিবার ১ করে বাড়বে।

     কিন্তু ১০ তো আর ৫ এর ছোট না। তাহলে তো শর্ত কাজ করার কথা না। তারপরও আউটপুটে কিন্তু ১০ দেখাচ্ছে, কারন শর্ত পর্যন্ত যাবার আগেই সে কাজ করে ফেলেছে (প্রিন্ট করেছে)।

* হুম, আর যেহেতু ১০ এর মান তো বাড়ছে, তাই ৫ এর ছোট হবার কোন সুযোগ নেই। আমরা যদি কমাই তাহলে কি কাজ করবে ?

% একদমই না কারন, একবার শর্ত মিথ্যা হলে তা লুপ থেকে বের হয়ে যায়।

* ও তাহলে তো এখানেই “শুভ সমাপ্তি” হি হি হি…

# ভালো বলেছো… হি হি …

% বাকি আছে while loop এবং for loop এইগুলো হল pretest loop এর উদাহরণ। আমরা while দিয়ে শুরু করি-

এলগরিদম ৪.২ফ্লোচার্ট ৪.২
শর্ত সত্য থাকা পর্যন্ত কাজ করতে থাকবে
আর  শর্ত মিথ্যা হলে সমাপ্ত।
 
আমাদের loopvariable এর
শুরু – initialization
শেষের শর্ত- condition
কত করে বাড়বে – increment
এই বিষয়গুলো খেয়াল রাখতে হবে।

% এই ফ্লোচার্টটি কিন্তু আগেরটা থেকে একটু ভিন্ন, আমরা এখানে অনেক তথ্য দিয়েছি।

# তাতো দেখেই বুঝতে পারছি। কিন্তু কিছুই বুঝতে পারছি না।

* হুম, ফ্লোচার্টের ভিতরে কোডও দেখা যাচ্ছে-

% হা হা, ঠিক তাই, আর এখানে কিছু নাম্বার দেয়া হয়েছে, যা এই ফ্লোচার্টটি বুঝাতে কাজে লাগবে-

# মামা, আমার কাছে তো আগেরটার মতই লাগছে!

% হা হা হা…  ভালো করে দেখ এখানে আগে শর্ত পরে কাজ।

# ও তাই তো! তাহলে শর্ত পূরণ না হলে আর কাজ করবে না, তাই তো ?

% ঠিক তাই-

এখানে সম্পুর্নএলগরিদমকে পাচ ভাগে ভাগ করা হয়েছে।

১-  initialization বা loopvariable এর শুরুর মান

২-  condition বা শর্ত পরীক্ষা। এই শর্ত কিন্তু আমাদের Conditional statement যেভাবে কাজ করত সেভাবেই কাজ করে। মানে শর্তের মধ্যে যা থাকবে তার ফল হয় সত্য হবে অথবা মিথ্যা। আর আমরা যদি ঠিক মত শর্ত দিতে না পারি তাহলে কিন্ত এটা সারা জীবন চলতে থাকবে, থামবে না, একে বলে Infinite loop।

৩- Statement বা কাজ, এখানে আমরা শুধু এক লাইন প্রিন্ট করছি, চাইলে এখানে অনেক কাজ করা যায়, যত বার লুপ ঘুরবে এই কাজগুলো ততবার হবে। এর মাঝে আর একটি ও থাকতে পারে, Conditional statement থাকতে পারে। যাই হোক, এরপর

৪- increment বা loopvariable এর মান পরিবর্তন, আমরা যেভাবে ডান পকেটে কলম রেখেছিলাম। যদি loopvariable এর মান পরিবর্তন না হয় তাহলেও কিন্তু এই লুপ চলতেই থাকবে।

৫- যখনই আমাদের শর্ত মিথ্যা হবে, তখন লুপ থেকে বের হয়ে যাবে।

          * মামা, আমার মনে হয় আমি ব্যাপারটা বুঝেছি।

  • প্রথমে (ধাপ ১), a এর মান ১ দিয়ে শুরু করবে।
  • এর পর (ধাপ ২) শর্ত পরীক্ষা করবে, সত্য হলে ভিতরের ব্লকে ঢুকবে, আর মিথ্যা হলে “শুভ সমাপ্তি”।
  • আর  ব্লকের ভিতরে আছে ধাপ ৩ এবং ৪।  প্রথমে কাজ করবে এর পর a এর মান বাড়াবে। এরপর আবার দ্বিতীয় ধাপে চলে যাবে। এভাবে যতক্ষন শর্ত সত্য থাকবে, মানে a এর মান ৫ পর্যন্তএটা চলতে থাকবে। 
  • আর এভাবে a এর মান বাড়াতে বাড়াতে এক সময় তা ৫ এর বড় হয়ে যাবে আর আমাদের শর্ত মিথ্যা হয়ে যাবে। তখনই আমরা লুপ থেকে বের হয়ে যাব।

% একদম ঠিক। সবই দেখি পারিস!

* আরে কি যে বল, তুমি যা বলছ তার সাথে ফ্লোচার্টের দেয়া উদাহরণটি মিলিয়ে বললাম আর কি।

# আচ্ছা মামা, আমরা তো জানি লুপ চালাতে তিনটি কাজ করতে হয়, তাহলে এইগুলো আলাদা লেখার দরকার কি ?

% ও তাই তো! তোর জন্য আছে for loop। একই কাজ করে, কিন্তু ইমুর চাহিদা মত তিনটি কাজ এক সাথে লিখতে হয়।

* মামা, এই উদাহরণটা বাম পকেটের জন্য দাও, মানে আগের গুলোতে তো ছোট থেকে বড় সংখ্যা দেখিয়েছে। এটাতে উল্টো কর, বড় থেকে ছোট-

% ঠিক আছে তবে তাই হবে। আমরা তাহলে ৩০ থেকে ২৫ পর্যন্ত প্রিন্ট করার জন্য প্রোগ্রাম লিখে ফেলি। আর এই কাজটি আমরাwhile loop দিয়ে এবং for loop দিয়ে করব। তাহলে এদের মধ্যে কি মিল অমিল আছে তা বুঝা যাবে।

 প্রোগ্রাম ৪.২  – while loopপ্রোগ্রাম ৪.৩  – for loop
৪  




% এখানে যতক্ষন ২ সত্য থাকবে ততক্ষন ৩,৪ চলতে থাকবে।

* মামা, while loop আর for loop এর সবই তো মিলে, কিন্তু  for loop এ ১,২ এর পর চার কেন?

% এটাই তো মজা, মনে আছে এই দুইটাকে কি বলে ?  

*  হ্যা, Pretestloop।

% তাহলে খেয়াল করে দেখ, ধাপ-২ তে শর্ত পরীক্ষা হচ্ছে, এরপর আমাদের কাজ হবে, আর কাজের আগে তো আমরা loopvariable এর মান পরিবর্তন করতে পারি না। মনে কর পার্কে না ঘুরেই বাম পকেট থেকে একটি কলম সরিয়ে ফেললাম। এটা কি ঠিক?

# না, এটা তো দুর্নীতি, আর এদেশে  দুর্নীতি চলবে না ।

% আহ, শান্ত হো, আমরা কেউ দুর্নীতি করছি না, করা যাবে না সেটা বললাম।

* ও তার মানে লিখার সুবির্ধাতে for loop এর increment উপরে নিয়ে আসা হয়েছে, কিন্তু তা ধাপ-৩ এর পর কাজ করবে, ঠিক while loop এরই মত।

% for loop এর সুবিধা হল, এখানে তিনটি অংশ এক সাথে লেখা হয় তাই, ভুল হবার বা বাদ পরার সম্ভবনা কম। আর do while  এর কথা মনে আছে ? while এর শেষে যে “;” দিতে হয়, মনে আছে?

* হুম মনে আছে, আর তুমি বলেছিলে পরে কিযেন বলবে।

% সেটাই তো বলতে চাচ্ছি, আমরা যদি do while এর শেষে যদি “;” না দেই তাহলে কম্পিউটার ভুল করে মনে করতে পারে এই বুঝি while শুরু হয়েছে। তাই  do while এর শেষে “;” আছে। আর এছাড়া Conditional statement বা অন্য কোন loop এর পরে কিন্তু “;” দিতে হয় না।

এখন বল loop বুঝেছিস?

* বুঝেছি, কিন্তু আরো কিছু উধাহরণ দিলে ভালো হত।

# আর মামা, তুমি না আর এক ধরনের লুপের কথা বলেছিলে, কি যেন Infinite loop! এটা কিভাবে কাজ করে ?

% হা হা হা, সাংঘাতিক ব্যাপার, এটা এখন আমি কিভাবে বুঝাই !!

* কি বল মামা? এটা কোন ব্যাপার?

 % হা হা হা, আরে মজা করছিলাম। প্রোগ্রাম ৪.২ এর ৮ নাম্বার লাইনে আমরা যদি ++ দিই তাহলে কি হবে ?  i এর মান বাড়তে থাকবে, ৩০ থেকে বড় হবে, কিন্তু ২৫ এর ছোট কি কখনও হবে ?

# ৩০ থেকে বাড়লে ২৫ এর ছোট হবে কি করে ?

* তাহলে আমাদের লুপ কি বন্ধ হবে ??

# শর্ত অনুযায়ী তো হবার কথা না।

*জ্বী, আর এটাকেই Infinite loop বলে, যা চলতেই থাকবে, বন্ধ হবে না।

# কিন্তু এই “++” , “–” আবার কি ?

% ও এটা বলা হয়নি না? এটা এক এক করে বাড়ায়। অনেক ভাবে লেখা যায়-

i= i+ 1
i+= 1
i++

% এই সব একই কাজ করে। তবে “++” আগে বা পরে লেখা নিয়ে একটু ঝামেলা আছে, এই দেখ-

এরপর মামা, স্কেচবুকে একে দেখাল-

নামবিস্তারিতপ্রোগ্রামআউটপুট
pre-incrementআগে নিজে বাড়বে তার পর অন্যকে দিবেint I =42;int J;J =++I;I =43 J =43
post-incrementআগে অন্যকে দিবে এরপর নিজে বাড়বে।int I =42;int J;J = I++;I =43 J =42

# আরে যদি “- -” থাকে?

* এটাও বলতে হবে ??? বাড়ার জায়গায় কমবে।

# ও তাই তো!

* মামা, লুপের কিছু উধাহরণ দাও না –

% হুম, এখানে প্রোগ্রাম ৪.৩ এর ৫ নাম্বার লাইন পরিবর্তন করে printf(“%d  ”,i); এর সাহায্যে loop-variable এর মান প্রিন্ট করা হয়েছে-

প্রোগ্রাম #প্রোগ্রামআউটপুট
প্রোগ্রাম ৪.৩.১for(i=1;   i<=5;    i++)1 2 3 4 5
প্রোগ্রাম ৪.৩.২for(i=0;   i<5;    i++)0 1 2 3 4
প্রোগ্রাম ৪.৩.৩for(i=0;   i<=25;    i=i+5)0 5  10 15  20  25
প্রোগ্রাম ৪.৩.৪for(i=30;   i>=20;    i=i-3)30 27 24 21
প্রোগ্রাম ৪.৩.৫for(i=0;   i<10;    i=i+5);10

# মামা, সবই বুঝলাম, কিন্তু শেষেরটা বুঝালাম না !

% ভালো করে দেখ-

# সবই তো ঠিক আছে, কিন্তু ১০ আসলো কিভাবে ?

* মাম, তুমি না বলছিলে “;” দেয়া যাবে না!

% হ্যা, বলেছিলাম।

* কিন্তু এখন তো কোন ভুল দেখালো না, যদিও আউটপুটের কোন কারণ খুজে পাচ্ছি না।

% এখানে কিন্তু সবই কাজ করছে, কিন্তু “;” দেয়াতে এখানেই লুপ শেষ হয়ে গেছে- তার মানে হল, ব্লকের ভিতরের printf আর লুপের অংশ না। লুপ ঠিক মত কাজ করেছে, i এর মান বেড়েছে, যখন শর্ত মিথ্যা হয়েছে লুপ থেকে বের হয়ে গেছে। আর এর পর i এর মান প্রিন্ট করেছে।

* ও তাই তো!

# মামা, একটা বিষয় আমার মাথায় আসছে না?

% আবার কি হল?

# কম্পিউটার এত কলম পায় কোথায়?

* হি হি হি! এটা আবার কেমন প্রশ্ন?

% হা হা হা… আরে কলম তো আমরা ব্যবহার করেছি আমাদের গুনার কাজকে সহজ করার জন্য। কম্পিউটার কলম ছাড়াও ভালো গুনতে পারে। এমনি এমনি কি এর নাম গুননাকারী যন্ত্র?

# তা না হয় মানলাম, এখন আবার সকালে ফিরে যাই। মনে কর আমাদের সবার পকেটে কলম আছে, আমরা ১০ বার চক্কর দিব। কিন্তু আপু বাম পকেটের হিসাব রাখছে, ১ টি করে কলম সরাচ্ছে আর তুমি প্রতিবার ৫ টি করে কলম ডান পকেটে রাখছ। আর আমি হিসাব রাখছি ১০ বার হল কিনা, প্রতিবার ডান পকেটে ১টি করে কলম রেখে। এখন বল এটা কিভাবে প্রোগ্রাম করব?

% ওরে বাবারে, কত প্যাঁচ! কিরে ইমি  পারবি?

* না মামা, আমার মাথার উপর দিয়ে গেছে।

% একটা বিষয় বলা হয় নি, জানলে আর কঠিন মনে হত না । সেটা হল for loop এর যে তিনটি ভাগ আছে  initialization, condition, increment এর মধ্যে loopvariable ছাড়াও একাধিক variable নিয়ে কাজ করা যায়।

প্রোগ্রাম ৪.৩.৬

আমাদের প্রোগ্রামপ্রোগ্রামের আউটপুট




int   i,a,m;
for(i=0, a=10, m=0; i<=10; i++, a–, m=m+5)
{
   Printf(“ i=%d a=%d  m=%d”, i,a,m );
}
           return 0;      

i=0  a=10  m= 0
i=1  a=9   m= 5
i=2  a=8   m= 10
……….
………..
i=10  a=0   m= 50

#ওরে বাবা, সবই করা যায় দেখি!

% না, অনেক কিছুই করা যায় না, যেমন তোর মাথা ঘুরানো বন্ধ করা যাবে না। হা হা হা..

এখানে খেয়াল রাখতে হবে, আমরা কিন্তু একাধিক initialization, increment/decrement ব্যবহার করলে তাদের মাঝে কমা “,” হবে।

আরো গল্প

Leave a Reply

Your email address will not be published.