Кроме чисел программа работает с текстом: название окна, подпись оси, имя графика, название ползунка, имя файла, сообщение об ошибке. Текст называется строкой, и в C++ для него есть свой полноценный тип – std::string. Строку можно объявить, сравнить, сложить с другой, спросить её длину, передать в функцию и вернуть из неё – всё то же самое, что и с числами:
std::string name = "Тело";
std::string label = name + " (эксперимент 2)"; // сложение строк
int n = label.size(); // сколько символов
Чтобы такие переменные работали, в начале файла нужна строка:
#include <string>
В наших задачах строки чаще всего не хранят в переменных, а пишут прямо в вызове функции – потому что подпись известна заранее и меняться не будет:
add_float_param("Угол броска", 30.0f); // подпись ползунка
set_plot_axes(PLOT, "x, м", "y, м"); // подписи осей
add_plot_line(PLOT, ground_x, ground_y, "Земля", GREEN, 1.f);
Важно, что строка здесь не только подпись для человека. По ней библиотека находит нужную величину: ползунок заведён строкой "Угол броска", и расчёт получает его значение по той же строке.
add_float_param("Угол броска", 30.0f); // в main
alpha = get_float_param("Угол броска"); // в расчёте
Связывает эти две строки кода только совпадение текста, буква в букву. Опечатка – не ошибка компиляции: программа соберётся, запустится, напишет в консоль предупреждение «параметр не найден» и молча подставит ноль. Тело улетит не туда, а причина будет выглядеть как ошибка в физике.
Именно поэтому имя графика в Task_0 вынесено в переменную – оно встречается в тексте программы почти десять раз:
const char* PLOT = "Полёт тела";
const char* – доставшийся от языка C способ записать строку, которая не меняется. Здесь он равноправен: можно было объявить и так –
std::string PLOT = "Полёт тела";
все функции библиотеки принимают такую строку точно так же.