Главная :: FreeFem++ :: Базовые типы данных в FreeFem++
Ночь. Сидит программист за компом, дописывает последние строчки новой программы. Но тут неожиданно звонок в дверь. Программист за дверь - а там смерть с косой, но маленькая. - Блин не вовремя ты дай допишу программу, а там и забирай меня... - Не переживай мужик, я не за тобой. Я за твоим винтом!

Базовые типы данных в FreeFem++

Декларация типа переменных является обязательной, чтобы избежать ошибок программирования из-за множества встроенных типизированных переменных.

Имя переменной может состоять из букв латинского алфавита и цифр (первый символ должен быть буквой). Регистр важен, например, переменные cflow и cFlow являются различными переменными. Нельзя использовать символ подчеркивания (_), поскольку он зарезервирован в качестве оператора.

int - целое число (эквивалентен типу long в C++). При описании переменной можно сразу же присвоить ей значение. При присвоении целочисленной переменной вещественного значения дробная часть отбрасывается.

int i = 0, j; // Переменные целого типа: i со значением 0 и j без определенного значения
cout << "i = " << i << endl; // i = 0
cout << "j = " << j << endl; // j = ? значение может быть случайным
i = 1.5; // дробная часть отбрасывается
j = 5;   // значение определено
cout << "i = " << i << endl; // i = 1
cout << "j = " << j << endl; // j = 5

bool - логическая переменная имеющая два значения: истина true или ложь false (эквивалентен типу bool в C++). При присвоении числового выражения, истинным будет любое число отличное от ноля. При использовании логической переменной в числовом выражении значению true соответствует 1, а значение false = 0.

bool b1 = false, b2 = (3 > 2), b3 = 2, b4 = 0;
cout << "b1 = " << b1 << endl;  // 0
cout << "b2 = " << b2 << endl;  // 1
cout << "b3 = " << b3 << endl;  // 1
cout << "b4 = " << b4 << endl;  // 0
cout << "2 * b1 + 3 = " << 2 * b1 + 3 << endl;  // 3

real - вещественный тип данных (эквивалентен типу double в C++). При работе с вещественными числами нужно помнить, что при делении целых чисел можно получить неверный результат при целочисленном делении. Для того, чтобы этого избежать рекомендуется всегда ставить десятичную точку после целого числа.

// Разница между целочисленным и вещественным делением
real r;
r = 3 / 2;   // целочисленное деление, дробная часть отбрасывается r = 1
cout << "r = " << r << endl;
r = 3. / 2.; // вещественное деление r = 1.5
cout << "r = " << r << endl;

complex - комплексный тип данных (эквивалентен двум типам double или complex<double> в C++). Мнимая единица i=-1½ обозначается в FreeFem++ как 1i. С комплексными числами можно проводить все те же арифметические операции, что и с вещественными числами.

complex c1 = 1.i, c2 = 1. + 2.i;
cout << "c1 + c2 = " << c1 + c2 << endl; // c1 + c2 = (1,3)
cout << "c1 - c2 = " << c1 - c2 << endl; // c1 - c2 = (-1,-1)
cout << "c1 * c2 = " << c1 * c2 << endl; // c1 * c2 = (-2,1)
cout << "c1 / c2 = " << c1 / c2 << endl; // c1 / c2 = (0.4,0.2)

string - текстовый тип данных (строка). Для присвоения строковой переменной строки, ее необходимо заключить в двойные кавычки (одинарные кавычки использовать нельзя, т.к. это символ зарезервированного оператора). Другие типы данных могут быть объединены в строку оператором сложения (символ плюс, +).

string s1 = "String: ", s2;
int i = 1;
real r = 2.5;
complex c = i + r * 1.i;
s2 = s1 + "Int i = " + i + ", Real r = " + r + ", Complex c = " + c;
cout << s2 << endl;
// Результат:
//   String: Int i = 1, Real r = 2.5, Complex c = 1+2.5i

Можно проводить более сложные операции со строками: выделения подстроки из строки (указываются номера первой и последней позиции выделяемой подстроки в строке); вставить строку в другую строку (указывается позиция для вставки); поиск подстроки в строке слева направо и наоборот начиная с крайнего символа или с заданной позиции; определение длины строки. Следует помнить, что первый символ в строке имеет позицию равную нулю.

string s1 = "abc123abc", s2, s3;
s2 = s1(0:1); // Подстрока
cout << s2 << endl; // ab
s1(3:2) = "-"; // Вставка одной строки в другую
cout << s1 << endl; // abc-123abc
// Найти позицию подстроки в строке с поиском слева
cout << "s1.find(abc) = " << s1.find("abc") << endl; // 0
// Найти позицию подстроки в строке с поиском справа
cout << "s1.rfind(abc) = " << s1.rfind("abc") << endl; // 7
// Найти позицию подстроки в строке с поиском слева начиная с заданной позиции
cout << "s1.find(abc, 3) = " << s1.find("abc",3) << endl; // 7
// Найти позицию подстроки в строке с поиском справа начиная с заданной позиции
cout << "s1.rfind(abc, 3) = " << s1.rfind("abc",3) << endl; // 0
// Определить длину строки
cout << "s1.length = " << s1.length << endl; // 10