Переменные#

Введение#

Переменные хранят данные и позволяют повторно использовать и изменять их во всей программе. 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 значения для логики и принятия решений.

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

  • Двумерные массивы — Массивы массивов; идеально подходят для представления строк, сеток или табличных данных.

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

Вы можете изменять отдельные элементы в двумерном массиве:

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