Редактировать

Символы и основные операции над ними

Символы имеют тип 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.