Глиф Учебники

Урок 7. Строки и символы

Курс «Pascal» · урок 7 из 9 · 3 минуты чтения

Программы часто работают с текстом: имя пользователя, слово для проверки, предложение, в котором нужно посчитать буквы. В Pascal для этого два типа: char — один символ и string — строка из символов.

Строка и её символы

Строка — это ряд символов, пронумерованных с единицы. К отдельному символу обращаются как к элементу массива: s[1] — первый, s[length(s)] — последний. Функция length(s) возвращает длину строки.

Pascal
program StringBasics;
var
  s: string;
begin
  s := 'Pascal';
  writeln('Длина: ', length(s));
  writeln('Первая буква: ', s[1]);
  writeln('Последняя буква: ', s[length(s)]);
  writeln('Со 2-й по 4-ю: ', copy(s, 2, 3));
  writeln('Где "cal": ', pos('cal', s));
  s := s + 'ABC.NET';
  writeln(s);
end.
Вывод
Длина: 6
Первая буква: P
Последняя буква: l
Со 2-й по 4-ю: asc
Где "cal": 4
PascalABC.NET
s 1 P 2 a 3 s 4 c 5 a 6 l s[1] s[length(s)] length(s) = 6 copy(s, 2, 3) = 'asc' pos('cal', s) = 4
Символы строки Pascal нумеруются с 1 до 6: первый — P, последний — l, copy(s, 2, 3) берёт три символа со второго — asc, а pos находит cal с позиции 4.

Пустая строка — две кавычки подряд: '', её длина 0. Символ s[i] можно и заменить: s[1] := 'B' превратит 'Pascal' в 'Bascal'.

Основные функции и процедуры

ЧтоПримерРезультат
length(s) — длинаlength('cat')3
s1 + s2 — склейка'Free' + 'Pascal''FreePascal'
copy(s, i, n) — n символов с позиции icopy('Pascal', 2, 3)'asc'
pos(t, s) — где t встречается в spos('a', 'Pascal')2
delete(s, i, n) — удалить n символов с позиции i'Pascal' → delete(s, 1, 2)'scal'
insert(t, s, i) — вставить t в s с позиции i'Pacal' → insert('s', s, 3)'Pascal'
upcase(c) — большая букваupcase('q')'Q'

pos возвращает 0, если подстроки нет, — так удобно проверять, встречается ли слово в тексте. copy, length и pos — функции: они возвращают значение. delete и insert — процедуры: они меняют саму переменную-строку.

Pascal
program EditString;
var
  s: string;
begin
  s := 'Hello, world';
  delete(s, 6, 7);
  writeln(s);
  insert(' Pascal', s, 6);
  writeln(s);
end.
Вывод
Hello
Hello Pascal

delete(s, 6, 7) удаляет семь символов начиная с шестого — запятую, пробел и слово world.

1 2 3 4 5 6 7 8 9 10 11 12 H e l l o , w o r l d delete(s, 6, 7) 7 символов начиная с 6-го H e l l o вставка с позиции 6 insert(' Pascal', s, 6) H e l l o P a s c a l
delete(s, 6, 7) вырезает из Hello, world семь символов с шестого и оставляет Hello, а insert вставляет пробел и слово Pascal с позиции 6, и получается Hello Pascal.

Перебор символов

Строку обходят циклом for от 1 до length(s). Пример — сколько раз в строке встречается буква a:

Pascal
program CountLetter;
var
  s: string;
  i, count: integer;
begin
  readln(s);
  count := 0;
  for i := 1 to length(s) do
    if s[i] = 'a' then
      count := count + 1;
  writeln('Букв a: ', count);
end.
Ввод
banana bandana
Вывод
Букв a: 6

Строку читают целиком командой readln(s) — вместе с пробелами, до конца строки.

Перевернуть строку — собрать новую, идя по старой с конца:

Pascal
program Reverse;
var
  s, r: string;
  i: integer;
begin
  readln(s);
  r := '';
  for i := length(s) downto 1 do
    r := r + s[i];
  writeln(r);
end.
Ввод
level up
Вывод
pu level

Коды символов: ord и chr

У каждого символа есть числовой код. ord(c) возвращает код символа, chr(n) — символ по коду. Латинские буквы и цифры идут подряд: коды 'A'…'Z' — от 65 до 90, 'a'…'z' — от 97 до 122, '0'…'9' — от 48 до 57.

Pascal
program Codes;
var
  c: char;
begin
  writeln(ord('A'));
  writeln(chr(66));
  c := '7';
  writeln(ord(c) - ord('0'));
  for c := 'a' to 'e' do
    write(c);
  writeln;
end.
Вывод
65
B
7
abcde

ord(c) - ord('0') превращает символ-цифру в число: так считают сумму цифр, записанных строкой. Параметр цикла for может быть и символом: for c := 'a' to 'e' перебирает буквы от a до e.

символ код 0 48 1 49 … 7 55 … 9 57 A 65 B 66 … Z 90 a 97 b 98 … z 122 ord('A') = 65 символ → код chr(66) = 'B' код → символ ord('7') - ord('0') = 55 - 48 = 7 символ-цифра → число
Цифры, большие и маленькие латинские буквы идут подряд: у символа 0 код 48, у A — 65, у a — 97; ord даёт код символа, chr — символ по коду, а ord('7') - ord('0') = 55 - 48 = 7.

Проверить, что символ — цифра или латинская буква, можно сравнением: (c >= '0') and (c <= '9') или диапазоном в case: 'a'..'z':.

Сравнение строк

Строки сравнивают знаками =, <>, <, >. Сравнение идёт посимвольно по кодам, как в словаре: 'cat' < 'dog', 'car' < 'cart'. Большие и маленькие буквы различаются: 'Pascal' = 'pascal' — ложь. Чтобы сравнить без учёта регистра, приведите обе строки к большим буквам — в цикле через upcase.

Русские буквы в Free Pascal

В PascalABC.NET русская буква — один символ, как и латинская. В Free Pascal строка по умолчанию хранит байты, и если файл программы сохранён в кодировке UTF-8, русская буква занимает два байта: length('мир') может оказаться 6, а s[1] — половинкой буквы. Поэтому примеры этого урока — с латинскими буквами: так они работают одинаково везде.

Ещё одно отличие: в Free Pascal в обычном режиме string вмещает не больше 255 символов. В PascalABC.NET ограничения нет.

Частые ошибки

Коротко

Проверьте себя

1. Что вернёт copy('Informatika', 3, 4)?
2. Чему равно pos('x', 'Pascal')?
3. Как получить последний символ строки s?
4. Что выведет программа?
Pascal
var
  s: string;
begin
  s := 'abc';
  s := s + s[1];
  writeln(length(s));
end.