Header Ads

ডাটা টাইপ

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

এই অধ্যায়ে আমরা দেখব ডাটা টাইপ নিয়ে।  ডাটা মানে তথ্য এবং টাইপ মানে ধরণ, এটা হয়ত অনেকেই জানি আমরা। এখন প্রশ্ন, তথ্যের ধরণ বলতে কি বুঝায়? এই বিষয়ে আলোচনা করতে গেলে শেষ হবে কিনা তা নিয়ে সন্দেহ আছে, তাই আমি বিস্তারিত তে যাচ্ছি না। আমাদের দৈনন্দিন জীবনে ব্যবহার হয় এমন কিছু নিয়ে একটু আলোচনা করা যায়। যেমন, সংখ্যা নিয়ে আলোচনা করতে পারি। আমাদের প্রাত্যহিক জীবনে এমন কিছু নেই যেখানে এর ব্যবহার না আছে। এখন আমি যদি বলি আমার কাছে 5, 20 এবং 2 সংখ্যাগুলো আছে। এটি কিন্তু একটি তথ্য। আর এই তথ্যের ধরণ হচ্ছে এরা পূর্ণসংখ্যা বা ইংরেজিতে বলে integer। আবার যদি বলি আমার কাছে 5.4 এবং 10.1 এই দুইটি সংখ্যা আছে। এখন কি আমরা এই তথ্য কে পূর্ণসংখ্যার ধরণে রাখতে পারি বা বলতে পারি এরা পূর্ণ সংখ্যা? বলতে পারব না, কারণ এই তথ্যগুলোর বৈশিষ্ট আগের তথ্যগুলোর থেকে ভিন্ন। তাই, এদের অন্য ধরণে/টাইপে ফেলতে হবে। আর আমরা জানি 5.4 এবং 10.1 হচ্ছে ভগ্নাংশ সংখ্যা বা ইংরেজিতে বলে fraction। তাহলে সংখ্যা থেকে আমরা আপাদত দুইটি ধরণ/টাইপ পেলাম। একটি পূর্ণসংখ্যা এবং অপরটি ভগ্নাংশ সংখ্যা। এখন আমার নাম লিখার জন্য আমি a, h, i, n, s এবং t এই তথ্যগুলো সংগ্রহ করলাম। এই তথ্যগুলোকে কি টাইপে ফেলা যায়? এরা আগের তথ্যগুলোর মত পূর্ণসংখ্যা না বা, ভগ্নাংশ সংখ্যাও না। তাহলে এদের ধরণ/টাইপ আবার অন্যরকম। আর আমরা জানি এই তথ্যগুলোকে বলে অক্ষর বা ইংরেজিতে character। 

এখন আমরা কিছু সমস্যা নিয়ে আলোচনা করি, প্রথমেই ধরা যাক, আপনার কাছে আছে 10 টাকা এবং আপনার বন্ধুর কাছে আছে 5 টাকা। এখন আপনি জানতে চান আপনাদের কাছে মোট কত টাকা আছে? আপনি চিন্তা করে হিসেব করে হয়ত বলে দিতে পারবেন কিন্তু আপনি প্রোগ্রামিং কি এবং কেন? পড়ে জেনেছেন যন্ত্র কে দিয়ে কাজ করানো যায় এবং যন্ত্র নাকি খুব দ্রুত কাজ করে। তাই, আপনি এই কাজটি যন্ত্র কে দিয়ে করাতে চান। তাহলে, প্রথমে আপনার এবং আপনার বন্ধুর টাকার পরিমাণ কে সংখ্যা হিসেবে ধরে নিয়ে চলক/ভেরিয়েবলে রাখতে হবে। এখন আমরা কোন টাইপের ভেরিয়েবল নিব? আমরা জানি 10 এবং 5 পূর্ণসংখ্যা। আর পূর্ণসংখ্যা রাখার জন্য সি++ ভাষাতে int নামে integer টাইপের ভেরিয়েবল আছে। এখন শুধু আমরা সংখ্যা দুটোকে রেখে দিব এভাবে, 

int num1 = 10;

int num2 = 5;

ভেরিয়েবলের নাম দিতে হয় তাই আপনার টাকা যে ভেরিয়েবলে রাখব তার নাম দিয়েছি num1 এবং আপনার বন্ধুর টাকা যে ভেরিয়েবলে রেখে দিয়েছি তার নাম দিয়েছি num2। আর নামের প্রথমে int দিয়ে বুঝাচ্ছে যে এই ভেরিয়েবলের টাইপ integer মানে পূর্ণসংখ্যা। এখন ত আমাদের যোগফল রাখতে হবে, তার জন্য লাগবে আরেকটি ভেরিয়েবল। তার নাম দিলাম int sum; এখন আপনি নিচের প্রোগ্রামটি Codeblocks এ লিখে বিল্ড ও রান করেন, দেখবেন যন্ত্রের কাজ যন্ত্র ঠিক করে দিয়েছে। 

নোটঃ ভেরিয়েবল নামকরণের বিষয়ে কিছু নিয়ম আছে, আপনি নামকরণ এর ক্ষেত্রে ফাকা রাখতে পারবেন না, যেমনঃ s um আবার, সংখ্যা ব্যবহার করতে পারবেন কিন্তু শুরুতে ব্যবহার করতে পারবেন না, যেমনঃ 1num

#include <iostream>


using namespace std;


int main()

{

  int num1;

  int num2;

  int sum;


  num1 = 10;

  num2 = 5;


  sum = num1 + num2;


  cout << "Total taka: " << sum << endl;


  return 0;

}

Code: 2.0

যদিও অনেক কিছু বলে ফেলেছি, এরপরেও আরেকটু ব্যাখ্যা করে দিচ্ছি। মেইন ফাংশনে যাওয়ার পরে int কে সামনে রেখে তিনটা ভেরিয়েবল এর নাম লিখেছি। এর মানে হচ্ছে, যন্ত্র কে আমি বলতেছি, এই নামগুলো দিয়ে তিনটা ভেরিয়েবল এর জন্য জায়গা বেছে নাও। তোমাকে এইগুলো দিয়ে কাজ করতে হবে। এরপর num1 এর জায়গায় 10 রেখেছি এবং num2 এর জায়গায় 5 রেখে দিয়েছি। এরপর sum এর জায়গায় num1 এবং num2 যোগ করে রেখে দিয়েছি। তারপর cout এর কাছে একটা মেসেজ দিয়ে সাথে sum এর ভিতরে যা আছে তা পাঠিয়ে দিয়েছি। শেষে নিউলাইন ও দিয়েছি, দেখতে ভালো দেখাবে তাই। cout এরপরে ওর কাজ করবে আর আমরা জানি cout এর কাছে যাই দিব তাই স্ক্রিনে দেখাবে। তাহলে আউটপুট হবে এমন, Total taka: 15

যদি এমন মনে হয় এই জিনিস টা এভাবে দিলে কেমন হবে? ভুল হবে কিনা। আউটপুট কি আমি একটু অন্যভাবে দেখতে পারিনা? এমন মনে হলে সাথে সাথে ঐটা চেষ্টা করে দেখবেন। এর জন্য কিন্তু আপনার কম্পিউটার ব্লাস্ট হয়ে যাবে না বা নষ্ট হয়ে যাবে না। সুতরাং চেষ্টা করে দেখাই যায়। দেখতে যতটা সহজ মনে হচ্ছে, প্রোগ্রামিং আসলে এমন নয়। আজকে এই কাজটি আপনি শিখলেন এবং এরপর আর কিছুই করলেন না। তাহলে ভুলে যাবেন বা, দেখা গেল কিছুদিন পর এরকম কোন কাজ করতে গেছেন এবং সেখানে ভুল করছেন। মজার বিষয় হচ্ছে অনেকেই এই কোড তুলতেও ভুল করবে, তবে এটা কিন্তু স্বাভাবিক। প্রোগ্রামিং শেখার বড় পন্থা হচ্ছে ভুল করতে করতে শেখা। একটি প্রচলিত ভুল বলে দিচ্ছি যেমন, সেমিকোলন দিতে ভুলে যাওয়া। যে লাইন গুলোর শেষে সেমিকোলন আছে, সেখানে সেমিকোলন না দিলে ভুল হবে। প্রথম পর্বে বলেছি, কিছু নিয়ম কানুন আছে আর তা আমাদের মেনে চলতে হবে। আমরা একটি ভুল করে দেখতে পারি, যদি num2 = 5; এর জায়গায় সেমিকোলন উঠিয়ে দেই তাহলে কি হতে পারে দেখে নেই, 

#include <iostream>


using namespace std;


int main()

{

  int num1;

  int num2;

  int sum;


  num1 = 10;

  num2 = 5


  sum = num1 + num2;


  cout << "Total taka: " << sum << endl;


  return 0;

}

Code: 2.1

এই কোড টি যদি বিল্ড করতে যান তাহলে দেখবেন নিচে build message সেকশনে এমন একটি মেসেজ আসছে, "expected ; before sum" মানে যন্ত্র তার নিয়ম অনুযায়ী sum = num1 + num2; এই লাইনের আগে এবং num2 = 5 এর পরে সেমিকোলন আশা করতেছে।

এখন আপনার আরেকজন বন্ধু আপনাদের এই কাজ দেখে দাবি করলেন তাহলে আমার কাছে যে টাকা আছে সে টাকাও তোমাদের টাকার সাথে যোগ দিয়ে দেখো। খুব সহজ কিন্তু, শুধু আরেকটা ভেরিয়েবল নিতে হবে। কারণ, মানুষ একজন বেশি হলে জায়গা ত একটু বেশি নিতেই হবে। এবার যন্ত্র কে এভাবে বলে দিলেন, int a, b, c; মানে আপনার টাকা রাখবেন a নামের ভেরিয়েবলে আর বাকি দুই বন্ধুর টাকা রাখবেন b ও c নামের ভেরিয়েবলে। প্রোগ্রামটি হবে এমন, 

#include <iostream>


using namespace std;


int main()

{

  int a, b, c, sum;


  a = 10;

  b = 5;

  b = 11;


  sum = a + b + c;


  cout << "Total taka: " << sum << endl;


  return 0;

}

Code: 2.2

আগের প্রোগ্রামের মতই এটি, শুধু কাজ একটি বৃদ্ধি পেয়েছে। খেয়াল করলে দেখবেন, যন্ত্র কে আমি ভেরিয়েবল নেওয়ার কথা বিভিন্ন সময়ে ভিন্ন ভিন্ন ভাবে বলেছি যেমন, প্রতিটা ভেরিয়েবলের আগে আলাদা আলাদা করে int লিখছি বা একবার int লিখে একাধিক ভেরিয়েবল কমা দিয়ে লিখে দিচ্ছি। আপনি চাইলে যেকোন ভাবেই লিখতে পারেন। এটা তে সমস্যা নেই। আবার চাইলে সরাসরি এভাবেও লিখতে পারবেন, int a = 10;( একাধিক এর বেলায় এভাবে, int a = 10, b = 5; )

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

সমস্যা ত একটি সমাধান করেছেন কিন্তু একটি শেষ হতে না হতেই আরেকটি এসে হাজির হয়ে গেছে । সমস্যাটি হচ্ছে, আপনারা তিন বন্ধু মিলে কোন এক বিচিত্র কারনে মরুভূমিতে আটকা পরে গেছেন। আপনাদের কাছে পানি আছে মোট 5 লিটার। এই বিপদে পরে আপনাদের মন থেকে দয়া বা মমতা উঠে গেলেও দুর্নীতি প্রবেশ করতে পারেনি। যেহেতু মরুভূমিতে পানির প্রতিটি ফোটাই গুরুত্বপূর্ণ তাই ঠিক করেছেন 5 লিটার পানি সমান 3 ভাগে ভাগ করে নিজেদের কাছে রেখে দিবেন। এক জায়গায় রাখলে হয়ত কারো ভাগ্যে কম জুটবে বা কারো ভাগ্যে বেশি। আপনি যেহেতু প্রোগ্রামার হওয়ার পথে পা দিয়েছেন তাই সব কাজই এখন প্রোগ্রাম করে যন্ত্র কে দিয়ে করিয়ে নিতে চাইছেন। এবারের কাজটিও কিন্তু সহজ। বন্ধু যেহেতু আপনারা তিনজন তাই person নামে একটি ভেরিয়েবল নিয়ে তাতে 3 রেখে দিবেন। আর পানি যেহেতু 5 লিটার তাই water নামের একটি ভেরিয়েবলে 5 রেখে দিবেন। আচ্ছা সব ঠিক আছে কিন্তু এবার কি পূর্ণসংখ্যা বা int টাইপের ভেরিয়েবল নিলে কাজ হবে? আমাকে ত 5 কে 3 দিয়ে ভাগ করতে হবে আর এর ফলাফল ত পূর্ণসংখ্যা আসবে না। তাই এবার আমাদের ভগ্নাংশ টাইপের ভেরিয়েবল নিতে হবে। সি++ ভাষাতে ভগ্নাংশ টাইপের ভেরিয়েবল বুঝানোর জন্য double ব্যবহার করা হয়। যেমন, double water; তাহলে প্রোগ্রামটি লিখে ফেলি, 

#include <iostream>


using namespace std;


int main()

{

  double water, person, ans;


  water = 5;

  person = 3;


  ans = water / person;


  cout << "Each friend get " << ans << " liter water" << endl;


  return 0;

}

Code: 2.3

এবার তিনটি ভেরিয়েবল নিয়েছি, water, person এবং ans  আর এখানে ans মানে ভাগফল রাখব এটাতে, আর ভাগফল কে ত উত্তর ও বলা যায় তাই ইংরেজি সংক্ষিপ্তে ans লিখে দিয়েছি যেন বুঝা যায় এটাতে উত্তর আছে। এরপর cout এর কাছে একটি মেসেজ ও উত্তর সাজিয়ে পাঠিয়ে দিয়েছি। এবার আউটপুট হবে এমন, "Each friend get 1.67 liter water"। আচ্ছা, দশমিকের পর দুই ঘর দেখিয়েছে বা কারো কম্পিউটারে দেখাবে ছয় ঘর। কিন্তু, আমরা কি নিজেদের ইচ্ছা মত বলে দিতে পারিনা দশমিকের পর কত ঘর দেখাবে? উত্তর অবশ্যই পারি। এর জন্য প্রিন্ট করার আগে আপনাকে এই লাইনটি লিখতে হবে, cout << fixed << setprecision(10); এখানে দশ দেওয়ার মানে হচ্ছে দশমিকের পর দশ ঘর দেখাবে। আপনি 10 এর জায়গায় যে সংখ্যাটিই দিবেন আউটপুটে সেই কয় ঘর দেখতে পারবেন দশমিকের পরে। আর এই fixed এবং setprecision(); এর কাজ কিন্তু #include <iostream> হেডার ফাইলে নেই, এর জন্য আরেকটি হেডার ফাইল যুক্ত করতে হবে, #include <iomanip> নামে। এবার কোডটি লিখে আউটপুট দেখি ঠিক আছে কিনা। 

#include <iostream>


using namespace std;


int main()

{

  double water, person, ans;


  water = 5;

  person = 3;


  ans = water / person;


  cout << fixed << setprecision(10);

  cout << "Each friend get " << ans << " liter water" << endl;


  return 0;

}

Code: 2.4

এবার রান করলে দেখবেন উত্তরে দশমিকের পরে দশ ঘর দেখাচ্ছে। 

পূর্ণসংখ্যা ও ভগ্নাংশ সংখ্যা নিয়ে কাজ করা শিখলাম আমরা। এবার দেখব অক্ষর নিয়ে কীভাবে কাজ করতে হয়। অক্ষর বা character প্রকাশের জন্য সি++ ভাষাতে char আছে। ভেরিয়েবলের নামের আগে শুধু char বসিয়ে দিবেন। আর এটি শুধু একটি অক্ষর নিয়েই কাজ করতে পারে। আমরা একটি প্রোগ্রাম দেখি, যে প্রোগ্রাম এর কাজ একটি অক্ষরকে স্ক্রিনে দেখাবে। 

#include <iostream>


using namespace std;


int main()

{

  char ch;


  ch = 'A';


  cout << ch << endl;



  return 0;

}

Code: 2.5

এখানে আমরা ch নামের একটি character টাইপের ভেরিয়েবল নিয়েছি আর ch এর ভিতরে A রেখেছি। character এসাইন করতে চাইলে সিঙ্গেল কোটেশন ব্যবহার করতে হয়। সিঙ্গেল কোটেশন এর ভিতরে একটি অক্ষর দিতে হবে। প্রোগ্রামটির আউটপুটঃ A 

প্রশ্ন আসতে পারে আমরা কি শুধু ইংরেজি বর্ণমালা নিয়েই কাজ করতে পারব? আসলে ডাটা হিসেবে যা আছে তার সবকিছু নিয়েই আপনি character হিসেবে কাজ করতে পারবেন। কিছু character এর উদাহরণ দিলাম, 'a' 'b' 'A' 'Z' '0' '2' ',' ' ' ইত্যাদি সবই character এমন কি সিঙ্গেল কোটেশন নিজেও। শেষে আমি সিঙ্গেল কোটেশন এর ভিতরে কিছুই লিখিনি এর মানে স্পেস ও একটি character। 

এখন আপনি একটু বিপদে পরেছেন, আপনার স্যার জানতে পেরেছেন আপনি সি++ শিখতেছেন। এটা জানার পর উনি কৌতূহলী হয়ে গেছেন এবং কৌতূহলবসত আপনাকে একটি কাজ দিলেন, কাজটি হচ্ছে এমন একটি প্রোগ্রাম লিখতে হবে যা রান করলে C++ প্রিন্ট করবে। খুব সহজ আপনি প্রথম প্রোগ্রাম Hello World! থেকে শিক্ষা নিয়ে লিখে দিলেন cout << "C++" << endl; কিন্তু এটা দেখার পর আপনার স্যার সন্তুষ্ট হতে পারলেন না। তিনি আশা করছেন আপনি "C++" এর প্রতিটা character ভেরিয়েবলে নিয়ে তারপর ভেরিয়েবল গুলো প্রিন্ট করবেন।  একটু ভেবে দেখলেন এটাও খুব সহজ, কারণ আপনি ইতিমধ্যে character টাইপের ডাটা নিয়ে কাজ শিখে ফেলেছেন। "C++" এ আছে মোট তিনটি character। তাহলে আপনাকে তিনটি character টাইপের ভেরিয়েবল নিতে হবে এবং তাদের মাঝে character তিনটি রেখে শুধু প্রিন্ট করে দিবেন। আমি আশা করছি আপনি নিচের প্রোগ্রামটি দেখার আগে নিজেই একবার চেষ্টা করে দেখবেন, পারেন কিনা। এরপরে প্রোগ্রামটি দেখে আবার নিচের প্রোগ্রামটি রান করে দেখবেন।

#include <iostream>


using namespace std;


int main()

{

  char ch1, ch2, ch3;


  ch1 = 'C';

  ch2 = '+';

  ch3 = '+';


  cout << ch1 << ch2 << ch3 << endl;


  return 0;

}

Code: 2.6

দেখতে পারেন ভেরিয়েবল তিনটি এলোমেলোভাবে সাজিয়ে প্রিন্ট করলে আউটপুট কেমন আসে।

এবার নতুন সমস্যা, আপনি ও আপনার বন্ধু এখন অনেক টাকার মালিক। প্রত্যেকের আছে 100000 টাকা। এবার দেখতে চাইলেন আপনার এবং আপনার বন্ধুর টাকা গুণ করলে কত আসে? আগের মতই তিনটি ভেরিয়েবল নিতে হবে। দুইটি আপনাদের টাকা রাখার জন্য এবং বাকিটি উত্তর রাখার জন্য, যেমনঃ int a, b, prod; এখানে prod মানে product এর সংক্ষিপ্ত রুপ আর product এর বাংলা হচ্ছে গুণ। তাহলে প্রোগ্রাম লিখে দেখি। 

#include <iostream>


using namespace std;


int main()

{

  int a, b, prod;


  a = 100000;

  b = 100000;


  prod = a * b;


  cout << prod << endl;


  return 0;

}

Code: 2.7

রান করার পর যে উত্তর টি দেখাচ্ছে সেটি কি আপনার কাছে সঠিক উত্তর মনে হচ্ছে? 100000 * 100000 = 10000000000; সুতরাং উত্তর যদি 10000000000 না আসে তাহলে উত্তর টি সঠিক নয় আর এই প্রোগ্রামে সঠিক উত্তর দেখাবেও না। আসল কথা হচ্ছে জায়গা স্বল্পতা। আপনি যে int টাইপের ভেরিয়েবল নিয়েছেন তা তে সর্বোচ্চ 2147483647 এই সংখ্যাটি নিতে পারবেন। আপনি যদি 2147483648 ও রাখতে যান তাহলে int টাইপে আটবে না। ইন্টিজারে আপনি চার বাইট মানে 32 টি বিট রাখতে পারবেন। আর 32 টি 1 দিয়ে বাইনারি যে সংখ্যাটি হয় তার ডেসিমাল হচ্ছে 2147483647। তাই ইন্টিজারের লিমিটেশন যদি সংক্ষেপে লিখি তাহলে (2^32 - 1)। একই ভাবে double এ রাখা যায় 64 টি বিট, char এ রাখা যায় 8 টি বিট এবং ইন্টিজারের জন্য আরেকটি টাইপ আছে। সেটি হচ্ছে, long long int আর এতে রাখা যায় 64 টি বিট। তাহলে আমাদের উত্তর যেহেতু ইন্টিজারে আটছে না সেহেতু আমরা long long int টাইপ ব্যবহার করতে পারি। আপনি শুধু int a, b, prod; এর জায়গায় long long a, b, prod; লিখে দিবেন। হ্যাঁ, long long int না লিখে শুধু long long লিখলেও চলবে। যদি কোন বিচিত্র কারণে না চলে তাহলে long long int লিখে দিবেন।

#include <iostream>


using namespace std;


int main()

{

  long long int a, b, prod;


  a = 100000;

  b = 100000;


  prod = a * b;


  cout << prod << endl;


  return 0;

}

Code: 2.8

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

ডাটা টাইপ শিখতে এসে কিছুদিন ধরে সমস্যা সমাধান করতে করতে হয়ত আপনি ক্লান্ত হয়ে গেছেন। কিন্তু আপনার কপাল খারাপ নতুন আরেকটি সমস্যা এসে হাজির। আপনার এক বন্ধু কোনভাবে জানতে পেরেছেন ক্যালকুলেটর আসলে প্রোগ্রাম করেই তৈরি করা হয়। সে আরও জানতে পেরেছে, প্রথম কম্পিউটার ছিলো আসলে একটি ক্যালকুলেটরই। প্রচলিত ক্যালকুলেটরে অনেকরকম হিসেব করা গেলেও ভাগশেস বের করা যায় না। তার দৃঢ় বিশ্বাস সে যদি আপনার কাছে আসে তাহলে আপনি তাকে এমন একটি প্রোগ্রাম লিখে দিতে পারবেন যে প্রোগ্রাম টি দুইটি সংখ্যা ইনপুট নিয়ে তাদের ভাগশেষ বের করে দিতে পারবে। ইনপুট নিবে কারণ সে ত আর প্রোগ্রামিং জানে না তাই প্রোগ্রাম এর ভিতরে ঢুকে বারবার সংখ্যা বদলে দেওয়া তার পক্ষে সম্ভব নাও হতে পারে। এর জন্য সহজ উপায় তার কাছে থেকে শুধু ইনপুট নেওয়া। শুধু সংখ্যা ইনপুট যেহেতু সবাই দিতে পারে। কিন্তু ভাগশেষ বের করে কীভাবে? সি++ ভাষাতে ভাগশেষ বের করার জন্য % মডুউলাস অপারেটর আছে। ভাগের মতই, শুধু / অপারেটর এর জায়গায় % বসিয়ে দিবেন তাহলে এটা ভাগফল না বের করে ভাগশেষ বের করে দিবে। এখন কিন্তু আপনি ভগ্নাংশ নিয়ে কাজ করতে পারবেন না। কারণ ভাগশেষ বের করতে হলে পূর্ণসংখ্যা লাগবে। যদি না বুঝে থাকেন তাহলে ঠান্ডা মাথায় একটু ভেবে দেখুন। আচ্ছা, বুঝলাম কিন্তু এবার ত ইনপুট নিতে হবে মানে সরাসরি আর এসাইন করে দেওয়া যাবে না। সি++ ভাষাতে আউটপুট দেখনোর জন্য যেমন cout ব্যবহার করা হয় তেমনি ইনপুট নেওয়ার জন্য cin ব্যবহার করা হয়। আপনি যদি একটি ভেরিয়েবল n তে ইনপুট নিতে চান তাহলে লিখতে হবে এভাবে cin >> n; আর কথা না বারিয়ে প্রোগ্রামটি দেখে নেই, 

#include <iostream>


using namespace std;


int main()

{

  int num, div, mod;


  cout << "Enter the number and div: ";

  cin >> num >> div;


  mod = num % div;


  cout << "Modulus: " << mod << endl;


  return 0;

}

Code: 2.9


এটি রান করার পর স্ক্রিনে আপনার থেকে ইনপুট চাইবে, আপনি যদি ইনপুট হিসেবে 10 3 দেন তাহলে উত্তর হবে 1 কারণ 10 কে 3 দিয়ে ভাগ করলে ভাগশেষ 1 ই থাকে। ইনপুট নেওয়ার জন্য রাইট শিফট >> অপারেটর আর আউটপুট দেখানোর জন্য লেফট শিফট << অপারেটর। এটা গুলিয়ে যেতে পারে।

এবার আমরা একটি বিষয় শিখি, সেটি হচ্ছে swapping বা, বাংলায় বলে অদলবদল। এটি নিয়ে বেশি ব্যাখ্যা করব না। কারণ, নিছের ছবিটি দেখলে আশাকরি অনেকটাই বুঝে যাবেন :D 

এখন এটি নিয়ে একটি প্রোগ্রাম লিখে দেখি। এই প্রোগ্রামে আপনাকে দুটো ভেরিয়েবল ইনপুট দেওয়া হবে, ধরে নিলাম n এবং m। আপনাকে n এর ভ্যালু রাখতে হবে m এর ভিতরে এবং m এর ভ্যালু রাখতে হবে n এর ভিতরে। আপনি যদি সরাসরি n এর ভ্যালু রাখতে যান m তে এবং m এর ভ্যালু রাখতে n তে তাহলে হবে না। কারণ, তখন দুটো ভ্যালুই সমান হয়ে যাবে। এখানে আপনাকে একটি অতিরিক্ত ভেরিয়েবল নিতে হবে, যার মাঝে আগে n এর ভ্যালু রেখে দিবেন। এরপর n এর ভিতরে রাখবেন m এর ভ্যালু এবং m এর মাঝে সেই অতিরিক্ত ভেরিয়েবলে রাখা ভ্যালু টি রেখে দিবেন। হয়ে গেল swapping। কোড দিয়ে দিচ্ছি নিচে, কিন্তু আমি আশা করছি আপনি কোড দেখার আগেই এটি করে ফেলবেন। 

#include <iostream>


using namespace std;


int main()

{

  int n, m;


  cout << "Enter two values: ";

  cin >> n >> m;


  // swapping start.

  int temp = n;

  n = m;

  m = temp;


  cout << n << ' ' << m << endl;


  return 0;

}

Code: 2.10

এখানে দুটো কমন স্ল্যাস ( // ) দিয়ে যা লিখেছি তা আসলে কোড এর কোন অংশ নয়। এটিকে বলে কোডের মাঝে কমেন্ট করা। এভালে কোনকিছু লিখলে কম্পাইলার সেটি পড়ে না। কমেন্ট করা জরুরী কারণ এতে অন্যেরা আপনার কোড পড়ে সহজেই বুঝতে পারবে আপনি কি কাজ করেছেন বা, আপনি যদি অনেকদিন পর আবার আপনার পুরোনো কোড দেখেন তখন বুঝতে অনেকটাই সহজ হয়ে যাবে আপনি কি কাজ করেছিলেন। একাধিক লাইন কমেন্ট করার জন্য /* write somthing here */ এভাবে লিখতে হয়। 

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

No comments

Powered by Blogger.