Biến số#

Giới thiệu#

Biến dùng để lưu trữ dữ liệu và cho phép bạn sử dụng lại và thao tác với dữ liệu đó trong suốt chương trình. C++ là một ngôn ngữ kiểu tĩnh, nghĩa là bạn phải khai báo kiểu dữ liệu của biến một cách rõ ràng khi tạo biến đó. Kiểu dữ liệu không thể thay đổi sau khi khai báo. Ví dụ:

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++ cũng là ngôn ngữ kiểu mạnh, có nghĩa là bạn không thể thực hiện các phép toán trên các kiểu không tương thích mà không cần chuyển đổi rõ ràng. Ví dụ:

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

API này giải thích các kiểu biến thông dụng trong C++. Mặc dù không phải là danh sách đầy đủ, nhưng nó bao gồm các kiểu mà bạn có nhiều khả năng sử dụng trong thực tế.

  • Biến cục bộ — Được khai báo bên trong một hàm và chỉ được sử dụng trong phạm vi đó; tốt nhất cho các giá trị tạm thời hoặc riêng biệt.

  • Biến toàn cục — Được khai báo bên ngoài bất kỳ hàm nào và được sử dụng trong toàn bộ dự án; thích hợp để chia sẻ dữ liệu giữa các hàm.

  • Số nguyên — Số nguyên dương được sử dụng để đếm, khoảng cách hoặc bất cứ thứ gì không có phần thập phân.

  • Double — Số thập phân có độ chính xác cao dùng cho các phép tính toán học yêu cầu độ chính xác.

  • Float — Số thập phân có độ chính xác tiêu chuẩn, hữu ích cho các phép đo hoặc tính toán.

  • Chuỗi kiểu C — Giá trị văn bản, được sử dụng cho thông báo, nhãn hoặc hiển thị đầu ra dễ đọc.

  • Boolean (bool) — true hoặc false giá trị cho logic và ra quyết định.

  • Mảng — Tập hợp các phần tử có cùng kiểu với kích thước cố định.

  • Mảng 2D — Mảng của mảng; lý tưởng để biểu diễn các hàng, lưới hoặc dữ liệu dạng bảng.

  • Const — Một biến được khai báo với const không thể được sửa đổi.

Khai báo và gán giá trị cho một biến#

Để tạo một biến trong C++, bạn phải khai báo kiểu dữ liệu của biến, sau đó là tên biến, và tùy chọn gán giá trị bằng toán tử =:

int distance = 100;

Khi đặt tên biến, cần tuân thủ các quy tắc sau:

  • Tên không được chứa các ký tự đặc biệt (ví dụ: dấu chấm than).

  • Tên không được bắt đầu bằng số.

  • Tên không được chứa khoảng trắng.

  • Tên này không được trùng với tên của các đối tượng VEXcode đã được định nghĩa trước (ví dụ: Drivetrain).

  • Tên biến không được trùng với từ khóa dành riêng của C++ (ví dụ: int, for, v.v.).

  • Tên biến phân biệt chữ hoa chữ thường (ví dụ: Distance và distance là các biến khác nhau).

Local Variables#

Biến cục bộ được định nghĩa bên trong một hàm hoặc khối mã. Chúng chỉ có thể truy cập được trong phạm vi của hàm hoặc khối mã đó và không hiển thị bên ngoài.

Định nghĩa hàm (bên ngoài int main())

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

Gọi hàm bên trong int main()

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

  // Begin project code
  show_local();
}

Biến cục bộ thường được sử dụng để lưu trữ các giá trị tạm thời chỉ có liên quan trong một hàm hoặc một phần cụ thể của chương trình.

Global Variables#

Biến toàn cục được định nghĩa bên ngoài bất kỳ hàm hoặc khối lệnh nào. Chúng có thể được truy cập và đọc ở bất kỳ đâu trong chương trình, kể cả bên trong các hàm.

Lưu ý: Biến toàn cục có thể truy cập được từ bất kỳ đâu trong chương trình, điều này có thể giúp việc chia sẻ dữ liệu giữa các hàm trở nên thuận tiện. Tuy nhiên, việc phụ thuộc quá nhiều vào biến toàn cục có thể dẫn đến các tác dụng phụ không mong muốn, vì những thay đổi đối với biến ở một phần của chương trình có thể ảnh hưởng đến các phần khác một cách khó lường. Vì lý do này, biến cục bộ thường được ưu tiên sử dụng khi có thể, vì chúng giới hạn phạm vi của biến trong hàm cụ thể nơi nó được định nghĩa. Điều này làm giảm khả năng xung đột và giúp việc gỡ lỗi dễ dàng hơn.

Định nghĩa hàm (bên ngoài 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();
}

Gọi hàm bên trong 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);
}

Trong C++, các biến toàn cục có thể được truy cập và sửa đổi trực tiếp từ bên trong các hàm mà không cần bất kỳ từ khóa đặc biệt nào. Tuy nhiên, nếu bạn có một biến cục bộ có cùng tên, bạn có thể sử dụng toán tử phân giải phạm vi :: để truy cập biến toàn cục.

Định nghĩa hàm (bên ngoài 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();
}

Gọi hàm bên trong 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ác loại dữ liệu#

C++ hỗ trợ nhiều loại dữ liệu có thể được lưu trữ trong biến. Một số loại có thể được gán lại giá trị, trong khi những loại khác cho phép sửa đổi từng phần tử riêng lẻ. Dưới đây là các loại được sử dụng phổ biến nhất:

Integer#

Một số nguyên (int) là một số nguyên dương hoặc âm.

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#

Kiểu dữ liệu double là kiểu số thập phân có độ chính xác cao (thường là 64 bit).

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#

Một float lưu trữ các số thập phân. Trong hầu hết các dự án VEX, double được ưu tiên hơn float trừ khi việc sử dụng bộ nhớ là một vấn đề cần quan tâm.

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#

Chuỗi kiểu C (char variable_name[]) là một chuỗi ký tự được lưu trữ trong một mảng ký tự. Chuỗi kiểu C phải đủ lớn để lưu trữ văn bản và ký tự kết thúc null.

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#

Một Boolean (bool) biểu thị true hoặc 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...");
  }
}

Các giá trị Boolean có thể được thay đổi ở bất kỳ thời điểm nào trong dự án.

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#

Mảng là tập hợp các phần tử có kích thước cố định cùng kiểu dữ liệu, bắt đầu từ chỉ mục 0. Tốt nhất là nên biết độ dài của mảng và khai báo nó khi tạo mảng.

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#

Mảng 2 chiều thường được sử dụng để biểu diễn lưới, bảng hoặc ma trận. Mỗi hàng đại diện cho một nhóm dữ liệu cụ thể.

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

Bạn có thể chỉnh sửa các phần tử cụ thể trong mảng 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#

Biến được khai báo với const không thể được sửa đổi sau khi đã được khởi tạo.

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