Proměnné#
Zavedení#
Proměnné ukládají data a umožňují vám je znovu používat a manipulovat s nimi v celém programu. C++ je staticky typovaný jazyk, což znamená, že typ proměnné musíte explicitně deklarovat při jejím vytváření. Typ nelze po deklaraci změnit. Například:
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++ je také silně typovaný jazyk, což znamená, že nelze provádět operace s nekompatibilními typy bez explicitní konverze. Například:
int blocks = 2; // blocks is an integer
char rings[] = "4"; // rings is a string
int result = blocks + rings; // Creates a compilation error
Toto API vysvětluje běžné typy proměnných v C++. I když se nejedná o vyčerpávající seznam, zahrnuje typy, které v praxi nejpravděpodobněji použijete.
Lokální proměnné — Deklarované uvnitř funkce a používané pouze v daném rozsahu platnosti; nejvhodnější pro dočasné nebo izolované hodnoty.
Globální proměnné — Deklarované mimo jakoukoli funkci a používané v celém projektu; vhodné pro sdílení dat mezi funkcemi.
Celé číslo — Celá čísla používaná pro počítání, vzdálenosti nebo cokoli bez desetinných míst.
Double — Vysoce přesná desetinná čísla pro matematické výpočty vyžadující přesnost.
Float — Desetinná čísla se standardní přesností, užitečná pro měření nebo výpočty.
Řetězec ve stylu C — Textové hodnoty používané pro zprávy, popisky nebo zobrazení čitelného výstupu.
Boolean (bool) —
truenebofalsehodnoty pro logiku a rozhodování.Pole — Kolekce prvků stejného typu s pevnou velikostí.
2D pole — Pole polí; ideální pro reprezentaci řádků, mřížek nebo tabulkových dat.
Const — Proměnnou deklarovanou s konstantou
constnelze upravit.
Deklarace a přiřazení proměnné#
Chcete-li v C++ vytvořit proměnnou, musíte deklarovat její typ následovaný názvem proměnné a poté volitelně přiřadit hodnotu pomocí operátoru =:
int distance = 100;
Při pojmenování proměnné je nutné dodržovat následující pravidla:
Název nesmí obsahovat speciální znaky (např. vykřičník).
Jméno nemůže začínat číslicí.
Název nesmí používat mezery.
Název nesmí kolidovat s předdefinovanými objekty VEXcode (například
Drivetrain).Název nemůže být rezervované klíčové slovo v C++ (např.
int,foratd.).Názvy proměnných rozlišují velká a malá písmena (např.
Distanceadistancejsou různé proměnné).
Local Variables#
Lokální proměnné jsou definovány uvnitř funkce nebo bloku kódu. Jsou přístupné pouze v rámci dané funkce nebo bloku a nejsou viditelné mimo něj.
Definujte funkci (mimo
int main())void show_local() { // This variable only exists inside this function int angle = 90; Brain.Screen.print("%d", angle); }Zavolejte funkci uvnitř
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Begin project code show_local(); }
Lokální proměnné se běžně používají k ukládání dočasných hodnot, které jsou relevantní pouze v rámci určité funkce nebo části programu.
Global Variables#
Globální proměnné jsou definovány vně jakékoli funkce nebo bloku. Lze k nim přistupovat a číst je kdekoli v programu, včetně uvnitř funkcí.
Poznámka: Globální proměnné jsou přístupné z libovolného místa v programu, což je usnadňuje sdílení dat mezi funkcemi. Silné spoléhání se na globální proměnné však může vést k nezamýšleným vedlejším účinkům, protože změny proměnné v jedné části programu mohou nepředvídatelně ovlivnit další části. Z tohoto důvodu se obecně, pokud je to možné, upřednostňují lokální proměnné, protože omezují rozsah proměnné na konkrétní funkci, ve které je definována. To snižuje pravděpodobnost konfliktů a usnadňuje ladění.
Definujte funkci (mimo
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(); }Zavolejte funkci uvnitř
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); }
V C++ lze ke globálním proměnným přistupovat a upravovat je přímo z funkcí bez použití speciálních klíčových slov. Pokud však máte lokální proměnnou se stejným názvem, můžete pro přístup k této globální proměnné použít operátor rozlišení rozsahu ::.
Definujte funkci (mimo
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(); }Zavolejte funkci uvnitř
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(); }
Typy dat#
Jazyk C++ podporuje několik typů dat, které lze ukládat do proměnných. Některé typy lze přeřadit, zatímco jiné umožňují úpravu jednotlivých prvků. Níže jsou uvedeny nejčastěji používané typy:
Integer#
Celé číslo (int) je celé číslo.
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#
Číslo typu double je číslo s vysokou přesností (obvykle 64 bitů) v desetinné čárce.
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#
Číslo typu float ukládá desetinná čísla. Ve většině projektů VEX se upřednostňuje použití typu doubles před float, pokud se nejedná o problém s využitím paměti.
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#
Řetězec ve stylu jazyka C (char variable_name[]) je posloupnost znaků uložená v poli znaků. Řetězce ve stylu jazyka C musí být dostatečně velké pro uložení textu a nulového terminátoru.
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#
Logická hodnota (bool) představuje true nebo 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...");
}
}
Booleovské hodnoty lze změnit kdykoli v projektu.
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#
Pole jsou kolekce prvků stejného typu s pevnou velikostí, počínaje indexem 0. Je vhodné znát délku pole a deklarovat ji při jeho vytváření.
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#
2D pole se běžně používá k reprezentaci mřížek, tabulek nebo matic. Každý řádek představuje specifickou skupinu dat.
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();
}
}
Můžete upravovat konkrétní prvky v rámci 2D pole:
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#
Proměnnou deklarovanou s hodnotou const nelze po inicializaci upravit.
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);
}