ভেরিয়েবল#

ভূমিকা#

ভেরিয়েবল ডেটা সংরক্ষণ করে এবং আপনাকে আপনার প্রোগ্রাম জুড়ে এটি পুনরায় ব্যবহার ও পরিবর্তন করার সুযোগ দেয়। C++ একটি স্ট্যাটিক্যালি টাইপড ভাষা, যার অর্থ হলো, একটি ভেরিয়েবল তৈরি করার সময় আপনাকে অবশ্যই এর টাইপ স্পষ্টভাবে ঘোষণা করতে হবে। ঘোষণার পরে টাইপ পরিবর্তন করা যায় না। উদাহরণস্বরূপ:

int angle = 90;           // angle is an integer
char dist[] = "Distance"; // dist is an array of characters
double steps = 2.5;       // steps is a double

C++ একটি স্ট্রংলি টাইপড প্রোগ্রামিং ভাষা, যার অর্থ হলো সুস্পষ্ট রূপান্তর ছাড়া আপনি অসামঞ্জস্যপূর্ণ টাইপের উপর কোনো অপারেশন সম্পাদন করতে পারবেন না। উদাহরণস্বরূপ:

int blocks = 2;              // blocks is an integer
char rings[] = "4";          // rings is a string
int result = blocks + rings; // Creates a compilation error

এই API-টি C++ এর সাধারণ ভেরিয়েবল টাইপগুলো ব্যাখ্যা করে। যদিও এটি একটি সম্পূর্ণ তালিকা নয়, তবে এতে সেইসব টাইপ অন্তর্ভুক্ত রয়েছে যা আপনি বাস্তবে সবচেয়ে বেশি ব্যবহার করার সম্ভাবনা রাখেন।

  • লোকাল ভেরিয়েবল — একটি ফাংশনের ভিতরে ঘোষণা করা হয় এবং শুধুমাত্র সেই স্কোপের মধ্যেই ব্যবহৃত হয়; অস্থায়ী বা বিচ্ছিন্ন মানের জন্য সবচেয়ে ভালো।

  • গ্লোবাল ভেরিয়েবল — যেকোনো ফাংশনের বাইরে ঘোষণা করা হয় এবং পুরো প্রোজেক্ট জুড়ে ব্যবহৃত হয়; ফাংশনগুলোর মধ্যে ডেটা আদান-প্রদানের জন্য ভালো।

  • পূর্ণসংখ্যা — গণনা, দূরত্ব বা দশমিক ছাড়া যেকোনো কিছুর জন্য ব্যবহৃত পূর্ণ সংখ্যা।

  • ডাবল — নির্ভুলতা প্রয়োজন এমন গাণিতিক গণনার জন্য উচ্চ-নির্ভুল দশমিক সংখ্যা।

  • ফ্লোট — আদর্শ-নির্ভুল দশমিক সংখ্যা, যা পরিমাপ বা গণনার জন্য উপযোগী।

  • C-স্টাইল স্ট্রিং — টেক্সট ভ্যালু, যা মেসেজ, লেবেল অথবা পাঠযোগ্য আউটপুট দেখানোর জন্য ব্যবহৃত হয়।

  • বুলিয়ান (bool) — true বা false মান।

  • অ্যারে — একই ধরণের উপাদানের নির্দিষ্ট আকারের সংগ্রহ।

  • 2D অ্যারে — অ্যারের অ্যারে; সারি, গ্রিড, বা টেবিলের মতো ডেটা উপস্থাপনের জন্য আদর্শ।

  • Const — const দিয়ে ঘোষিত একটি ভেরিয়েবল পরিবর্তন করা যাবে না।

ভেরিয়েবল ঘোষণা এবং নির্ধারণ করা#

C++ এ একটি ভেরিয়েবল তৈরি করতে, প্রথমে এর টাইপ এবং তারপর ভেরিয়েবলের নাম ডিক্লেয়ার করতে হয়, এবং সবশেষে ঐচ্ছিকভাবে = অপারেটর ব্যবহার করে একটি মান অ্যাসাইন করতে হয়:

int distance = 100;

ভেরিয়েবলের নামকরণের ক্ষেত্রে নিম্নলিখিত নিয়মগুলো অবশ্যই মেনে চলতে হবে:

  • নামে কোনো বিশেষ অক্ষর (যেমন, বিস্ময়বোধক চিহ্ন) থাকতে পারবে না।

  • নামটি কোনো সংখ্যা দিয়ে শুরু হতে পারবে না।

  • নামে স্পেস ব্যবহার করা যাবে না।

  • নামটি পূর্বনির্ধারিত VEXcode অবজেক্টের (উদাহরণস্বরূপ, Drivetrain ) সাথে সাংঘর্ষিক হতে পারবে না।

  • নামটি C++ এর কোনো সংরক্ষিত কীওয়ার্ড হতে পারবে না (যেমন, int, for, ইত্যাদি)।

  • ভেরিয়েবলের নাম কেস-সেনসিটিভ (যেমন, Distance এবং distance দুটি ভিন্ন ভেরিয়েবল)।

Local Variables#

লোকাল ভেরিয়েবল কোনো ফাংশন বা কোড ব্লকের ভিতরে সংজ্ঞায়িত করা হয়। এগুলো শুধুমাত্র সেই ফাংশন বা ব্লকের স্কোপের মধ্যেই অ্যাক্সেসযোগ্য থাকে এবং এর বাইরে দেখা যায় না।

ফাংশনটি সংজ্ঞায়িত করুন ( int main() এর বাইরে)

void show_local() {
  // This variable only exists inside this function
  int angle = 90;
  Brain.Screen.print("%d", angle);
}

int main() এর ভিতরে ফাংশনটি কল করুন

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  // Begin project code
  show_local();
}

লোকাল ভেরিয়েবল সাধারণত অস্থায়ী মান সংরক্ষণ করতে ব্যবহৃত হয়, যা কেবল কোনো নির্দিষ্ট ফাংশন বা প্রোগ্রামের অংশের জন্যই প্রাসঙ্গিক।

Global Variables#

গ্লোবাল ভেরিয়েবল যেকোনো ফাংশন বা ব্লকের বাইরে সংজ্ঞায়িত করা হয়। প্রোগ্রামের যেকোনো জায়গা থেকে, এমনকি ফাংশনের ভেতর থেকেও এগুলো অ্যাক্সেস ও রিড করা যায়।

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

ফাংশনটি সংজ্ঞায়িত করুন ( int main() এর বাইরে)

// The variable is defined outside a function
int angle = 90;

void show_global() {
  // You can access 'angle' inside a function
  Brain.Screen.print("%d", angle);
  Brain.Screen.newLine();
}

int main() এর ভিতরে ফাংশনটি কল করুন

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  // Begin project code
  show_global();
  Brain.Screen.print("%d", angle);
}

C++ এ, কোনো বিশেষ কীওয়ার্ড ছাড়াই ফাংশনের ভেতর থেকে গ্লোবাল ভেরিয়েবল সরাসরি অ্যাক্সেস ও পরিবর্তন করা যায়। তবে, যদি আপনার একই নামের কোনো লোকাল ভেরিয়েবল থাকে, তাহলে গ্লোবাল ভেরিয়েবলটি অ্যাক্সেস করার জন্য আপনি স্কোপ রেজোলিউশন অপারেটর :: ব্যবহার করতে পারেন।

ফাংশনটি সংজ্ঞায়িত করুন ( int main() এর বাইরে)

// Define the global variable
int count = 0;

void increase_count() {
  // Global variables can be accessed directly
  count = count + 1;
  Brain.Screen.print("Count: %d", count);
  Brain.Screen.newLine();
}

int main() এর ভিতরে ফাংশনটি কল করুন

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  // Begin project code
  increase_count();
  increase_count();
}

ডেটার প্রকারভেদ#

C++ ভেরিয়েবলে বিভিন্ন ধরণের ডেটা সংরক্ষণ করতে পারে। কিছু ধরণের ডেটা পুনরায় নির্ধারণ করা যায়, আবার অন্যগুলোর ক্ষেত্রে প্রতিটি উপাদান আলাদাভাবে পরিবর্তন করা যায়। নিচে সবচেয়ে বেশি ব্যবহৃত ডেটা টাইপগুলো উল্লেখ করা হলো:

Integer#

একটি পূর্ণসংখ্যা (int) হলো একটি অখণ্ড সংখ্যা।

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();
  // Begin project code
  int distance = 100;

  // Move the robot forward for the variable value in mm
  Drivetrain.driveFor(forward, distance, mm);

  // Add to the variable and move forward the new value, 
  // for 200mm total
  wait(1, seconds);
  distance = distance + 100;
  Drivetrain.driveFor(forward, distance, mm);
}

Double#

ডাবল হলো একটি উচ্চ নির্ভুলতা সম্পন্ন (সাধারণত ৬৪-বিট) দশমিক-বিন্দুযুক্ত সংখ্যা।

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();
  // Begin project code
  // Store a value with decimal points
  double raw_value = 0.88;

  // Print the decimal value as a percentage
  Brain.Screen.print("%.1f%%", raw_value * 100);
}

Float#

একটি ফ্লোট দশমিক সংখ্যা সংরক্ষণ করে। বেশিরভাগ VEX প্রোজেক্টে, ফ্লোটের চেয়ে ডাবল বেশি পছন্দ করা হয়, যদি না মেমরি ব্যবহার একটি উদ্বেগের বিষয় হয়।

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();
  // Begin project code
  // Store a value with decimal points
  float raw_value = 0.88;

  // Print the decimal value as a percentage
  Brain.Screen.print("%.1f%%", raw_value * 100);
}

String#

একটি C-স্টাইলের স্ট্রিং (char variable_name[]) হলো একটি ক্যারেক্টার অ্যারেতে সংরক্ষিত ক্যারেক্টারের একটি ক্রম। C-স্টাইলের স্ট্রিং অবশ্যই টেক্সট এবং একটি নাল টার্মিনেটর ধারণ করার জন্য যথেষ্ট বড় হতে হবে।

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();
  // Begin project code
  // Set the variable to a string then print the string
  char message[] = "Ready!";
  Brain.Screen.print(message);
}

Boolean#

একটি বুলিয়ান (bool) true , ৪ বা false মানকে বোঝায়।

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();
  // Begin project code
  // Set the state of the variable
  bool delivered = false;

  // Print different messages depending on the Boolean.
  if (delivered) {
      Brain.Screen.print("Package delivered!");
  } else {
      Brain.Screen.print("Delivering...");
  }
}

প্রজেক্টের যেকোনো পর্যায়ে বুলিয়ান পরিবর্তন করা যেতে পারে।

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();
  // Begin project code
  // Print the value of the delivered variable
  bool delivered = false;
  // Print different messages depending on the Boolean.
  if (delivered) {
      Brain.Screen.print("Package delivered!");
  } else {
      Brain.Screen.print("Delivering...");
  }
  wait(2, seconds);

  // Clear the screen and print the value of the variable again
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1,1);
  delivered = true;
  // Print different messages depending on the Boolean.
  if (delivered) {
      Brain.Screen.print("Package delivered!");
  } else {
      Brain.Screen.print("Delivering...");
  }
}

Arrays#

অ্যারে হলো একই ধরনের উপাদানের একটি নির্দিষ্ট আকারের সংগ্রহ, যা ০ ইনডেক্স থেকে শুরু হয়। অ্যারের দৈর্ঘ্য জেনে রাখা এবং তৈরির সময়ই তা ঘোষণা করা একটি উত্তম অভ্যাস।

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();
  // Begin project code
  // Declare an array of 5 integers
  int distances[5] = {100, 200, 150, 300, 250};

  // Drive and turn 4 times to move the distance of the first four distances of the array
  for (int i = 0; i < 4; i++) {
      Drivetrain.driveFor(forward, distances[i], mm);
      Drivetrain.turnFor(right, 90, degrees);
  }
}

2D Arrays#

একটি ২ডি অ্যারে সাধারণত গ্রিড, টেবিল বা ম্যাট্রিক্স উপস্থাপন করতে ব্যবহৃত হয়। এর প্রতিটি সারি ডেটার একটি নির্দিষ্ট গোষ্ঠীকে প্রতিনিধিত্ব করে।

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();
  // Begin project code
  // Assign the values in the matrix 2D array
  int matrix[3][3] = {
    { 0, 1, 2 },
    { 3, 4, 5 },
    { 6, 7, 8 }
  };

  // Loop through each row
  for (int i = 0; i < 3; i++) {
      // Loop through each column in the row
      for (int j = 0; j < 3; j++) {
          Brain.Screen.print("%d, ", matrix[i][j]);
      }
      Brain.Screen.newLine();
  }
}

আপনি একটি 2D অ্যারের মধ্যে নির্দিষ্ট উপাদানগুলি পরিবর্তন করতে পারেন:

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();
  // Begin project code
  // Assign the values in the matrix 2D array
  int matrix[3][3] = {
    { 0, 1, 2 },
    { 3, 4, 5 },
    { 6, 7, 8 }
  };

  // Modify the color (in column 2) in row 0
  matrix[0][1] = 200;

  // Print the modified row from the matrix 2D array
  for (int j = 0; j < 3; j++) {
      Brain.Screen.print("%d, ", matrix[0][j]);
  }
}

Constant Variables#

const দিয়ে ডিক্লেয়ার করা কোনো ভেরিয়েবল একবার ইনিশিয়ালাইজ করার পর আর পরিবর্তন করা যায় না।

int main() {
  // Initializing Robot Configuration. DO NOT REMOVE!
  vexcodeInit();

  const int maxSpeed = 100;

  // maxSpeed can be used like a normal variable
  Drivetrain.setDriveVelocity(maxSpeed, percent);
}