Символы и основные операции над ними
Символы имеют тип char, занимают 2 байта и хранятся в кодировке Unicode (UTF-16).
var c1: char;
var c2 := 'z';
Для преобразования символа c
в код используется функция Ord(c)
или метод Ord(c)
, для обратного преобразования кода i в символ используется функция Chr(i)
.
begin
var c := 'ю';
Print(Ord(c)); // 1102
c.Code.Print; // 1102
Print(Chr(1102)); // ю
end.
Классический способ определить символ, следующий за данным в кодовой таблице, - это преобразовать символ в код, прибавить к коду число и потом преобразовать полученный код снова в символ:
Chr(Ord(c)+1)
Аналогично определяется предыдущий символ
Для перебора всех символов в заданном диапазоне используется цикл for:
for var c := 'a' to 'z' do
Print(c);
Методы типа char
Методы, встроенные в тип char, делятся на две категории:
- проверяющие, принадлежит ли символ указанной категории:
c.IsDigit
,c.IsLetter
,c.IsLower
,c.IsUpper
- преобразующие символ:
c.ToUpper
,c.ToLower
,c.ToDigit
.
Отметим, что c.IsDigit
эквивалентно (c >= '0') and (c <= '9')
и эквивалентно c in '0'..'9'
Для c.IsLower
, c.IsLower
, c.IsUpper
такой простой аналогии нет. Дело в том, что в этих методах проверяются все символы, являющиеся буквами в каком-то алфавите народов мира (в частности, английские и русские)
Отметим также, что c.IsLower
возвращает True
только если это буква в нижнем регистре - для не букв возвращается False
.
Строки
Введение
Отметим, что для строк имеется много операций и методов, не все из которых мы рекомендуем для школьников.
Основная причина - многие методы строк в .NET считают, что строки индексируются с нуля, а в Паскале строки индексируются с 1.
Для устранения этой дилеммы при работе со школьниками мы не используем методы строк, которые работают с индексами, индексируемыми с нуля. Для них существуют эквивалентные замены внешними функциями, которые предполагают, что строки индексируются с 1.
Индексация строк
Строки в Паскале индексируются с 1. К символам строк можно обращаться по индексам - s[i]
.
Например:
begin
var s: string;
s := 'тор';
Print(s[1],s[2],s[3]);
end.
Символы строк можно менять:
begin
var s := 'пир';
s[1] := 'м';
Print(s); // мир
end.
Можно использовать индексацию с конца: s[^i] обозначает i-тый символ с конца
begin
var s := 'мир';
s[^1] := 'г';
Print(s); // миг
end.
Циклы по строкам
begin
var s := 'привет';
for var i:=1 to s.Length do
s[i] := Chr(Ord(s[i])+1);
Print(s);
end.
foreach var c in s do
Print(c);
Операции +, *n и in
Строки можно складывать и умножать на целое положительное число
Пример. Генерация строки ‘abcdefghijklmnopqrstuvwxyz’
Идея. Начать с пустой строки. Всякий раз в цикле добавлять к строке символы от ‘a’ до ‘z’
Код
begin
var s := '';
for var c := 'a' to 'z' do
s += c;
end.
Методы Count, CountOf, Where
Чтобы посчитать количество символов в строке, удовлетворяющих определённому условию, используется метод Count. Если нужно посчитать, сколько раз встречается определенный символ, используется более простой метод CountOf
begin
var s := 'абракадабра';
s.CountOf('а').Print;
s := 'а123бр45а67к89адабра';
s.Count(c -> c.IsDigit).Print;
end.
Если в строке надо отфильтровать только определенные символы, используется метод Where. Он возвращает последовательность символов, которую можно назад преобразовать к строке, используя метод JoinToString:
begin
var s := 'а123бр45а67к89адабра';
s := s.Where(c -> c.IsLetter).JoinToString;
end.
s.ToWords и разбиение строки на слова
Метод s.ToWords разбивает строку на массив слов, используя пробел в качестве разделителя. Полученный массив можно преобразовать и слить в строку, используя метод JoinToString:
begin
var s := 'как однажды жак звонарь головой сломал фонарь';
var a := s.ToWords;
Sort(a);
s := a.JoinToString
end.
По умолчанию JoinToString разделяет слова пробелами, но можно задать другой разделитель:
s := a.JoinToString(', ')
Функция Pos и процедуры Delete, Insert
Pos(subs,s)
возвращает позицию первого вхождения подстроки subs
в сторке s
или 0 если подстрока не найдена
Pos(subs,s,from)
начинает искать подстроку в строке с позиции from
.
Следующий код выводит позиции всех вхождений s1 в s:
begin
var s := 'абракадабра';
var s1 := 'бра';
var p := Pos(s1,s);
while p>0 do
begin
Print(p);
p := Pos(s1,s,p+s1.Length);
end;
end.
Следующий код удаляет в строке слово Python и вставляет на его место PascalABC.NET:
begin
var s := 'Язык Python - мой любимый язык программирования';
Delete(s,6,6); // удалить с 6 позиции 6 символов
Insert('PascalABC.NET',s,6);
Print(s)
end.
То же самое можно сделать с помощью метода Replace:
begin
var s := 'Язык Python - мой любимый язык программирования';
s.Replace('Python','PascalABC.NET');
Print(s)
end.