Змінні#

Вступ#

Змінні зберігають дані та дозволяють вам повторно використовувати їх і маніпулювати ними протягом усієї програми. 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++. Хоча список не є вичерпним, він охоплює типи, які ви найімовірніше використовуватимете на практиці.

  • Локальні змінні — Оголошуються всередині функції та використовуються лише в межах цієї області видимості; найкраще підходить для тимчасових або ізольованих значень.

  • Глобальні змінні — Оголошуються поза будь-якою функцією та використовуються протягом усього проєкту; добре підходять для обміну даними між функціями.

  • Ціле число — Цілі числа, що використовуються для підрахунку, відстаней або будь-чого без десяткових знаків.

  • Double — Високоточні десяткові числа для математичних обчислень, що потребують точності.

  • Float — Десяткові числа стандартної точності, корисні для вимірювань або обчислень.

  • Рядок у стилі C — Текстові значення, що використовуються для повідомлень, міток або відображення читабельного виводу.

  • Boolean (bool) — true або false значення для логіки та прийняття рішень.

  • Масиви — Колекції елементів одного типу фіксованого розміру.

  • 2D Arrays — Масиви масивів; ідеально підходять для представлення рядків, сіток або таблично подібних даних.

  • 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#

Double — це десяткове число з високою точністю (зазвичай 64-бітне).

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#

Тип float зберігає десяткові числа. У більшості проектів VEX тип doubles є кращим за тип float, якщо використання пам’яті не є проблемою.

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#

Масиви – це колекції елементів одного типу фіксованого розміру, починаючи з індексу 0. Рекомендується знати довжину масиву та оголошувати його під час створення.

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);
}