Header Ads

লুপ

এই অধ্যায়ে আমরা দেখব লুপ নিয়ে। আগের অধ্যায়ে দেখেছি কন্ডিশন নিয়ে। কন্ডিশন ও লুপ জানলে প্রোগ্রামিং এ অনেক মজার কাজ করা যায়। এখন প্রশ্ন লুপ মানে কি? লুপ মানে ধরে নেই ঘুরাঘুরি করা। আমরা প্রথম প্রোগ্রামে যদি ফিরে যাই, সেখানে আমরা দেখেছিলাম স্ক্রিনে "Hello World!" প্রিন্ট করতে হয় কীভাবে তার কোড। এখন যদি বলি, "Hello World!" লেখাটি পাঁচবার প্রিন্ট করতে হবে। তাহলে, আমরা পাঁচবার লিখে দিতে পারি এভাবে,

cout << "Hello World!" << endl;
cout << "Hello World!" << endl;
cout << "Hello World!" << endl;
cout << "Hello World!" << endl;
cout << "Hello World!" << endl;

কিন্তু এখন যদি বলা হয় 1000 বার লিখতে হবে বা 10000 বার লিখতে হবে। তাহলে কি এভাবেই বারবার লিখতে যাব? আমি জানি এই প্রস্তাবে আপনারা কেও রাজি হবেন না এবং পৃথিবীতে কেও আসলে রাজি নয় আর এর জন্যেই মানুষ প্রোগ্রামিং এ লুপ নামে কিছু জিনিস তৈরি করে রেখেছেন এত কঠিন কাজ সহজ করে করার জন্য। সি++ ভাষাতে সাধারণত তিন ধরণের লুপ আছে যেমন, 1. while loop 2. for loop 3. do while loop। আমরা শুধু প্রথম দুইটি নিয়ে আলোচনা করব।

ছোটবেলায় ত আমরা নাম্বার লাইন দেখেছি। নাম্বার লাইনের মাঝখানে থাকে জিরো এবং বামপাশে থাকে নেগেটিভ নাম্বারগুলো এবং ডানপাশে থাকে পজিটিভ নাম্বাগুলো। যেমন, -5 -4 -3 -2 -1 0 1 2 3 4। এখন এই নাম্বারগুলো আমরা এভাবেই প্রিন্ট করে দেখব। বাকি কথা বলার আগে তাহলে প্রোগ্রামটি দেখে নেই। 

#include <iostream>


using namespace std;


int main()

{

  int n = -5;


  while (n <= 5){

    cout << n << ' ';

    n = n + 1;

  }


  return 0;

}

Code: 4.0

এই প্রোগ্রামটিতে n এর মাঝে আমরা আগে -5 রেখে নিয়েছি। এরপর while লুপের কন্ডিশনে n কে ছেড়ে দিয়েছি, যতক্ষণ না n এর ভ্যালু 5 এর থেকে বড় হবে ততক্ষণ কন্ডিশন সত্যি থাকবে এবং বারবার ঘুরতেই থাকবে। while এবং if কিন্তু একই শুধু if চেক করে একবার আর while চেক করে যতক্ষণ না কন্ডিশন মিথ্যা হয়। এখন এই প্রোগ্রামে ত -5 এর থেকে 5 সবসময় ছোটই থাকবে তাহলে কি লুপ কখনোই থামবে না? লুপ থামাতে হলে আমাদের কন্ডিশন মিথ্যা করতে হবে আর এর জন্যেই n এর মান এক করে বৃদ্ধি করছি n = n + 1;। তাহলে প্রোগ্রামটি কাজ করবে এভাবে, প্রথমে দেখবে while (n <= 5) এখানে কন্ডিশন সত্য কারণ -5 <= 5। এরপর লুপ ব্লক এর ভিতরে চলে গেলে cout তখন n এর ভ্যালু প্রিন্ট করে দিবে আর n এর ভ্যালু এখন আছে -5 এবং পরে স্পেচ দেওয়া হয়েছে যেন দুইটি নাম্বারের মাঝে ফাকা থাকে। এরপর নিচে গিয়ে n এর ভ্যালু এক বৃদ্ধি পেয়ে হয়ে যাবে -4। এখন আবার যখন লুপের কন্ডিশনে ফিরে আসবে তখন দেখবে এবারো সত্যি কারণ -4 <= 5। এবার আবার লুপ ব্লকের ভিতরে গিয়ে -4 প্রিন্ট করবে এবং আবার n এর ভ্যালু এক বৃদ্ধি পাবে। এভাবে চলতেই থাকবে যতক্ষণ না n এর ভ্যালু 6 হবে। কারণ n এর ভ্যালু 6 হলে কন্ডিশন মিথ্যা হয়ে যাবে (6 <= 5) এবং তখন লুপ থেকে বের হয়ে নিচে চলে যাবে।

এবার যদি 5 থেকে -5 পর্যন্ত প্রিন্ট করতে চাই তাহলে কীভাবে করব? আগের প্রোগ্রামে কিছু পরিবর্তন করলেই হয়ে যাবে। আর এবার নাম্বারগুলো আর পাশাপাশি প্রিন্ট করতে চাই না। এক নাম্বারের নিচে আরেক নাম্বার প্রিন্ট করতে চাই। প্রোগ্রামটি দেখে নেই তাহলে আগে। 

#include <iostream>


using namespace std;


int main()

{

  int n = 5;


  while (n >= -5){

    cout << n << ' ';

    n = n - 1;

  }


  return 0;

}

Code: 4.1

এখানে, n এর ভ্যালু আগে 5 দিয়ে নিয়েছি। কারণ আমরা 5 থেকে প্রিন্ট করা শুরু করব। এবার কন্ডিশনে ছোট অথবা সমান(<=) না দিয়ে দিয়েছি বড় অথবা সমান(>=)। কারণ, এবার n এর ভ্যালু ত আসলে নিচের দিকে যাবে। আর n এর ভ্যালু আগে বৃদ্ধি করতেছিলাম কিন্তু এবার আমাদের কমাতে হবে আর কমানোর নিয়ম হচ্ছে, n = n - 1;। 

আশাকরছি এখন কিছুটা ধারণা পেয়েছেন লুপ জিনিসটা আসলে কি আর এর উপকারীতা। এখন আমরা ইউজার এর থেকে ইনপুট নিব n নামের ভেরিয়েবলে এবং আমরা 1 থেকে n পর্যন্ত সংখ্যাগুলো প্রিন্ট করব।  এখন কিন্তু আমাদের দুইটি ভেরিয়েবল লাগবে। n ইনপুট নেওয়ার জন্য এবং আরেকটি ভেরিয়েবল আগের প্রোগ্রামে n এর যে কাজ ছিলো সেই কাজটি করার জন্য মানে 1 থেকে n পর্যন্ত সংখ্যাগুলো রাখার জন্য। এখানে কিন্তু 1 থেকে n পর্যন্ত সংখ্যাগুলো একসাথে রাখতেছি না, এটা আসলে সম্ভব নয়। একটি ভেরিয়েবলে একটি সংখ্যাই রাখা যায় তবে তার ভ্যালু পরিবর্তন করা যায়। 

#include <iostream>


using namespace std;


int main()

{

  int n, i;


  cout << "Enter the value of n: ";

  cin >> n;


  i = 1;

  while (i <= n){

    cout << i << ' ';

    i += 1;

  }

  cout << endl;


  return 0;

}

Code: 4.2

এখন প্রোগ্রামটি রান করে বিভিন্ন ইনপুট যেমন, 100000000, 1000, 1000000000 ইত্যাদি দিয়ে দেখতে পারেন। এই প্রোগ্রামে i এর ভ্যালু বৃদ্ধি করার জন্য অন্যভাবে লিখেছি(i += 1)। এইভাবে লিখলেও হবে আর দেখুন আসলে এভাবে কিন্তু কাজ একটু কম করতে হয়েছে। এক করে বৃদ্ধির জন্য i += 1; দুই করে বৃদ্ধির জন্য i += 2; এভাবে ইচ্ছামত নাম্বার দিয়ে ভ্যালু বৃদ্ধি করতে পারবেন বা কমাতে পারবেন। কমাতে চাইলে i -= 1;। এখন ছোট্ট একটি প্রশ্ন, এই প্রোগ্রামে লুপ আসলে কতবার ঘুরবে? 

এখন আমরা সি++ ভাষাতে সবথেকে জনপ্রিয় for লুপ এর ব্যবহার শিখব। এটি শেখার জন্য আমরা 1 থেকে n পর্যন্ত সংখ্যাগুলো প্রিন্ট করার প্রোগ্রাম ই আবার দেখতে পারি for লুপ দিয়ে। 

#include <iostream>


using namespace std;


int main()

{

  int n, i;


  cout << "Enter the value of n: ";

  cin >> n;


  for (i = 1; i <= n; i++){

    cout << i << ' ';

  }

  cout << endl;


  return 0;

}

Code: 4.3

for লুপ এর প্রথম ব্র্যাকেট ব্লক অংশে থাকে তিনটি অংশ। for (assign; condition; increment/decrement); আর এই তিনটি অংশ কে সেমিকোলন দিয়ে ভাগ করতে হয়। assign অংশের কাজ হচ্ছে আপনি ভেরিয়েবলে ভ্যালু এসাইন করতে পারবেন এখানে বা, আপনি চাইলে লুপের আগেও করে রাখতে পারেন সেক্ষেত্রে এই অংশটি ফাকা রেখে দিলেই হবে। এসাইন অংশের কাজ একবারই হয়। এরপর আসে কন্ডিশন অংশ, এখানে আপনি প্রয়োজনমত কন্ডিশন দিয়ে রাখবেন এবং কম্পাইলার কিন্তু এরপরেই for লুপের দ্বিতীয় ব্র্যাকেট ব্লকের ভিতরে চলে যাবে এবং ঐ ব্লকের কাজগুলো করবে। increment/decrement অংশে পরে যাবে এবং কাজ শেষে increment/decrement অংশে যাওয়ার পরে আবার কন্ডিশনে ফিরে যাবে। এভাবেই চলবে যতক্ষণ না কন্ডিশন মিথ্যা হচ্ছে। for লুপের increment/decrement অংশে আমি ভেরিয়বলের ভ্যালু বৃদ্ধির কাজ আবারো অন্যভাবে করেছি(i++), আসলে এভাবে করলেও হবে আর আপনার যদি এক করে increment/decrement করার প্রয়োজন হয় তাহলে এটাই সবথেকে দ্রুত করার উপায়। আচ্ছা, যদি ইনপুট এক এর থেকে ছোট হয় তাহলে কী হবে? প্রশ্নটির উত্তর আশাকরি নিজে নিজেই বের করে ফেলবেন। এবার for লুপ ব্যবহার করে n থেকে 1 পর্যন্ত সংখ্যাগুলো প্রিন্ট করে ফেলুন তাহলে। 

দুইটি লুপের ব্যবহার ই মোটামুটি আমরা শিখলাম। এবার প্রবলেম দেখি একটি। আপনাকে একটি সংখ্যা ইনপুট দেওয়া হবে, আপনার কাজ হচ্ছে এক থেকে ঐ সংখ্যা পর্যন্ত সংখ্যাগুলোর যোগফল বের করতে হবে। মানে সংখ্যাটি যদি হয় 5 তাহলে উত্তর হবে 15। যেমন, 1 + 2 + 3 + 4 + 5 = 15। এবার তাহলে sum নামের আরেকটি ভেরিয়েবল নিব, যেটিতে যোগফল রাখব। 

#include <iostream>


using namespace std;


int main()

{

  int n, i, sum = 0;


  cout << "Enter the value of n: ";

  cin >> n;


  for (i = 1; i <= n; i++){

    sum = sum + i;

  }


  cout << "Summation of n: " << sum << endl;


  return 0;

}

Code: 4.4

প্রোগ্রামটি কীভাবে কাজ করছে না বুঝে থাকলে একটু খাতা-কলম নিয়ে চেষ্টা করুন। আমরা প্রথমে sum এর ভ্যালু 0 রেখেছিলাম। এরপর লুপ যেহেতু 1 থেকে শুরু করেছি তাই প্রথমে sum এর সাথে 1 যোগ হবে। আগে ছিলো 0 এখন যোগ হবে 1 তাহলে এখন sum এর ভিতরে আছে 1। এরপরে 2 যোগ হবে। আগে ছিলো 1 আর এখন যোগ হবে 2। তাহলে এখন sum এর ভিতরে আছে 3। এভাবে n পর্যন্ত প্রতিটি সংখ্যাই যোগ হয়ে যাবে এবং আমরা শেষপর্যন্ত পেয়ে যাব n এর সামেশন বা 1 থেকে n পর্যন্ত সংখ্যাগুলোর যোগফল। 

এখন n এর ফ্যাক্টোরিয়াল বের করব আমরা। ফ্যাক্টোরিয়াল মানে 1 থেকে n পর্যন্ত সংখ্যাগুলোর গুণফল। মানে সংখ্যাটি যদি হয় 5 তাহলে উত্তর 120। যেমন, 1 * 2 * 3 * 4 * 5 = 120। খুব সহজ, আগের প্রোগ্রাম এর মতই, শুধু যোগ এর জায়গায় গুণ করব। 

#include <iostream>


using namespace std;


int main()

{

  int n, i, fact = 0;


  cout << "Enter the value of n: ";

  cin >> n;


  for (i = 1; i <= n; i++){

    fact = fact * i;

  }


  cout << "Factorial of n: " << fact << endl;


  return 0;

}

Code: 4.5

এই প্রোগ্রামটি রান করে ইনপুট দিলে কি সঠিক আউটপুট দিচ্ছে? না দিয়ে থাকলে কারণ বের করতে হবে আপনাকেই। কারণটি খুবই সিম্পল কিন্তু সহজে চোখে পরার মত না। আমার একদিন লেগেছিলো এমন অদ্ভুত আচরণের কারণ বের করতে।

এবার পরের প্রবলেম হচ্ছে, 1 থেকে n পর্যন্ত যতটি জোর/ইভেন নাম্বার আছে তা বের করা এবং মোট কতটি আছে তা বের করা। আমরা জানি কোন নাম্বারকে 2 দিয়ে ভাগ করলে ভাগশেষ হয়ত 0 হবে অথবা 1 হবে। even নাম্বারকে ভাগ করলে সবসময় ভাগশেষ 0 হবে এবং odd নাম্বারকে ভাগ করলে ভাগশেষ সবসময় 1 হবে। তাহলে এই কন্ডিশন ব্যবহার করে আমরা প্রোগ্রামটি লিখে ফেলতে পারি। 

#include <iostream>


using namespace std;


int main()

{

  int n, i, total = 0;


  cout << "Enter the value of n: ";

  cin >> n;


  for (i = 1; i <= n; i++){

    if (i%2 == 0){

      cout << i << ' ';

      total++;

    }

  }cout << endl;


  cout << "Total: " << total << endl;


  return 0;

}

Code: 4.6

এই প্রোগ্রামে total নামে ভেরিয়েবল নিয়েছি ,1 থেকে n পর্যন্ত কয়টি even নাম্বার আছে তা জানার জন্য। এরপর ইনপুট নিয়ে লুপ চালিয়ে দিয়েছি n পর্যন্ত। এবার, লুপের ভিতরে প্রতিটি নাম্বার চেক করতেছি সেটি even কিনা if (i%2 == 0)। আমরা আগে দেখেছি ভাগশেষ বের করার জন্য % ব্যবহার করতে হয়। ভাগশেষ যদি এখানে 0 হয় তাহলে কন্ডিশন সত্যি হয়ে যাবে আর তখন নিশ্চিত যে i তে থাকা ভ্যালুটি even এবং i এর ভ্যালু প্রিন্ট করে দিবে আর total ভ্যালু এক বৃদ্ধি পাবে কারণ নতুন একটি even নাম্বার পেয়েছি আমরা। এরপর লুপ শেষ হলে লুপ থেকে বের হয়ে নিচে গিয়ে total এর ভ্যালু প্রিন্ট করে দিবে। 

আচ্ছা ভাগশেষ না বের করেও কি আমরা even নাম্বারগুলো বের করতে পারব? উত্তর, অবশ্যই। even নাম্বারগুলো খেয়াল করলে দেখবেন একটি নাম্বার পর পরই আসতেছে, 2 4 6 8... তাহলে আমরা i কে 2 থেকে শুরু করতে বলে এবং 2 করে increment(i += 2) করে কোনরকম অতিরিক্ত কন্ডিশন চেক না করেই even নাম্বারগুলো পেয়ে যেতে পারি। 

#include <iostream>


using namespace std;


int main()

{

  int n, i, total = 0;


  cout << "Enter the value of n: ";

  cin >> n;


  for (i = 2; i <= n; i += 2){

    cout << i << ' ';

    total++;

  }cout << endl;


  cout << "Total: " << total << endl;


  return 0;

}

Code: 4.7

এবার odd নাম্বারগুলো বের করার জন্য প্রোগ্রাম দুটো করে দেখতে হবে আর চেষ্টা করবেন while লুপ দিয়েও করতে। 

এবার একটি মজার সমস্যা। ছোটবেলায় আমরা সবাই নামতা/multiplication table পড়েছি। এবার সেটিই চেষ্টা করব প্রোগ্রাম করে প্রিন্ট করতে। এই প্রোগ্রামে আমরা চেষ্টা করব 5 এর নামতা প্রিন্ট করতে। তাহলে প্রোগ্রামটি আগে দেখে নেই। 

#include <iostream>


using namespace std;


int main()

{

  int n, i;

  n = 5;


  for (i = 1; i <= 10; i++){

    cout << n << " X " << i << " = " << n*i << endl;

  }cout << endl;


  return 0;

}

Code: 4.8

আমরা সাধারণত কোন সংখ্যার নামতা পড়তাম 10 পর্যন্ত তাই এখানে 10 পর্যন্ত লুপ চালিয়েছি আর ছোটবেলায় পড়া নামতার মতই দেখতে যেন হয় তাই একটু সাজিয়ে প্রিন্ট করেছি। এখানে X মানে n ও  i  এর মাঝে গুণ সম্পর্ক বুঝিয়েছি আর প্রতিবার n ও  i গুণ করে দিয়েছি। যখন i এর ভ্যালু 1 থাকবে তখন n মানে 5 এর সাথে গুণ হয়ে প্রিন্ট করবে 5, যখন i এর ভ্যালু হবে 2 তখন 5 এর সাথে গুণ হয়ে প্রিন্ট করবে 10 এবং এভাবে চলতে থাকবে 10 পর্যন্ত। এবার একটি প্রশ্ন, এই নামতা কি গুণ না করে যোগ করে করা সম্ভব? 

আমরা শুধু 5 এর নামতা দেখলাম। 1 থেকে 5 পর্যন্ত সবগুলো নাম্বারের জন্য নামতা বের করা সম্ভব? পাঁচবার লুপ লিখে করা যেতে পারে কিন্তু সমস্যা ঐ আগের মতই যদি 10000 পর্যন্ত বের করতে বলে? এর সমাধান ও আছে। কথা না বলে প্রোগ্রামটি আগে দেখে নেই। 

#include <iostream>


using namespace std;


int main()

{

  int n, i;

  n = 5;


  for (n = 1; n <= 5; n++){

    for (i = 1; i <= 10; i++){

      cout << n << " X " << i << " = " << n*i << endl;

    }cout << endl;

  }cout << endl;


  return 0;

}

Code: 4.9

এই প্রোগ্রামে আমরা লুপের ভিতরে লুপ ব্যবহার করেছি। একে বলে Nested loop। লুপ মানেই ত ঘুরাঘুরি। প্রোগ্রামটি ভালো করে দেখেন, প্রথম লুপে i এর ভ্যালু যখন 1 তখন প্রথম লুপের দ্বিতীয় ব্র্যাকেট ব্লকের কাজ আগে শেষ করে নিবে তারপরেই increment/decrement অংশে যাবে। কিন্তু এখানে এই ব্লকে আছে আবার আরেকটি লুপ, তাহলে এটিও ত আগে শেষ করতে হবে। এটির কন্ডিশন দিয়েছি 10 পর্যন্ত তাহলে এটি চলবে 10 পর্যন্ত আর আমরা পেয়ে গেলাম 1 এর নামতা এরপর নিউলাইন দিয়ে প্রথম লুপের increment/decrement অংশে চলে যাবে। নিউলাইন দেওয়ার কারণ, নামতাগুলো যেন আলাদা দেখায়, একসাথে হলে বুঝতে সমস্যা। আপনি রান করলেই বুঝতে পারবেন। এরপর যখন i এর ভ্যালু 2 তখন আবার 2 এর নামতা বের করবে লুপের ভিতরের লুপ। এভাবে 5 পর্যন্ত চলতে থাকবে। 

এবার আমরা দেখব কি করে ম্যাট্রিক্স প্রিন্ট করতে হয়। যদি আগের প্রোগ্রাম 4.9 ম্যাট্রিক্সেই পরে তবে ম্যাট্রিক্স বুঝার জন্য এটি একটু কনফিউজিং। আমরা n ইনপুট নিব এবং n যদি হয় 3 তাহলে এভাবে প্রিন্ট করবে, 

* * *
* * *
* * *

তিনটি রো এবং প্রত্যেক রো তে তিনটি কলাম। 

n যদি হয় 4 তাহলে প্রিন্ট করবে এভাবে,

* * * *
* * * *
* * * *
* * * *

এই প্রোগ্রামটি করব আমরা while লুপ দিয়ে কারণ এই টিউটোরিয়ালে বেচারা একটু অবহেলাতেই আছে। 

#include <iostream>


using namespace std;


int main()

{

  int n, i, j;


  cout << "Enter the row and column size: ";

  cin >> n;


  i = 1;


  while (i <= n){

    j = 1;

    while (j <= n){

      cout << "* ";

      j++;

    }cout << endl;

    i++;

  }


  return 0;

}

Code: 4.10

লুপের ভিতরে লুপ। এই প্রোগ্রাম 4.9 থেকে আরো সহজ। আমরা শুধু * প্রিন্ট করে দিয়েছি। তবে while লুপ এর বেলায় খেয়াল রাখতে হবে i তে ভ্যালু আগেই এসাইন করে দিলেও দ্বিতীয় লুপের জন্য ব্যবহার করা j কিন্তু প্রথম লুপের আগেই এসাইন করে রাখা যাবে না। কারণ, প্রত্যেকবার i এর জন্য j কে n বার ঘুরতে হবে। তাহলে ত প্রতিবারই j কে প্রথম থেকে শুরু করতে হবে। for লুপে হয়ত বিষয়টি এভাবে ধরা পরেনি কিন্তু while লুপ নিয়ে কাজ করার সময় আমাদের একটু সতর্ক থাকতে হবে। 

আমরা যদি 4টি ম্যাট্রিক্স প্রিন্ট করতে চাই তাহলে কীভাবে করব? লুপের ভিতরে লুপ চারবার লিখব? এভাবে লিখলে বড় নাম্বারের জন্য অনেক কষ্ট তা এখন আমাদের কাছে পরিষ্কার। আমরা তিনটি লুপের সাহায্য নিব তবে একটির ভিতরে আরেকটি এবং সেই ভিতরের লুপের ভিতরে আরেকটি। দেখুন আমাদের 4 টি ম্যাট্রিক্স প্রিন্ট করতে হবে এবং আবার প্রতিটা ম্যাট্রিক্স প্রিন্ট করতে হলে আবার তাদের জন্য লুপের ভিতরে লুপ লাগবে। ত আমরা বারবার লুপের ভিতরে লুপ এভাবে না লিখে ঐ লুপের ভিতরে লুপের কাজটিকে আরেকটি লুপের ভিতরে ফেলে দিতে পারি। বাকিটা প্রোগ্রাম দেখলেই আশাকরছি বুঝে যাবেন। 

#include <iostream>


using namespace std;


int main()

{

  int n, m, i, j, k;


  cout << "Enter the row size: ";

  cin >> n;


  cout << "Enter the column size: ";

  cin >> m;


  i = 1;


  for (i = 1; i <= 4; i++){

    for (j = 1; j <= n; j++){

      for (k = 1; k <= m; k++){

        cout << "* ";

      }

      cout << endl;

    }

    cout << endl;

  }


  return 0;

}

Code: 4.11

না বুঝে থাকলে সমস্যা নেই, বারবার পড়তে থাকেন এবং বুঝার চেষ্টা করেন।  আর আপনাদের জন্য একটি কাজ দিচ্ছি, এটি অবশ্যই অবশ্যই চেষ্টা করবেন। নিচের ম্যাট্রিক্স টি প্রিন্ট করতে হবে।

*
**
***
****

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

No comments

Powered by Blogger.