المتغيرات#

مقدمة#

تُخزّن المتغيرات البيانات وتتيح لك إعادة استخدامها ومعالجتها في جميع أنحاء برنامجك. لغة 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

تشرح واجهة برمجة التطبيقات هذه أنواع المتغيرات الشائعة في لغة C++. ورغم أنها ليست قائمة شاملة، إلا أنها تغطي الأنواع التي من المرجح أن تستخدمها عمليًا.

  • المتغيرات المحلية — يتم تعريفها داخل دالة ويتم استخدامها فقط ضمن هذا النطاق؛ وهي الأفضل للقيم المؤقتة أو المعزولة.

  • المتغيرات العامة — يتم تعريفها خارج أي دالة ويتم استخدامها في جميع أنحاء المشروع؛ وهي مفيدة لمشاركة البيانات بين الدوال.

  • Integer — الأعداد الصحيحة المستخدمة للعد أو المسافات أو أي شيء بدون كسور عشرية.

  • Double — أرقام عشرية عالية الدقة للحسابات الرياضية التي تتطلب دقة.

  • Float — أرقام عشرية ذات دقة قياسية، مفيدة للقياسات أو العمليات الحسابية.

  • سلسلة نمط C — قيم نصية، تستخدم للرسائل أو التسميات أو لعرض مخرجات قابلة للقراءة.

  • Boolean (bool) — true أو false قيم للمنطق واتخاذ القرار.

  • 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 على floats إلا إذا كان استهلاك الذاكرة يُمثّل مشكلة.

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#

يمثل 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);
}