Урок 7. Строки и символы
Программы часто работают с текстом: имя пользователя, слово для проверки, предложение, в котором нужно посчитать буквы. В Pascal для этого два типа: char — один символ и string — строка из символов.
Строка и её символы
Строка — это ряд символов, пронумерованных с единицы. К отдельному символу обращаются как к элементу массива: s[1] — первый, s[length(s)] — последний. Функция length(s) возвращает длину строки.
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Пустая строка — две кавычки подряд: '', её длина 0. Символ s[i] можно и заменить: s[1] := 'B' превратит 'Pascal' в 'Bascal'.
Основные функции и процедуры
| Что | Пример | Результат |
|---|---|---|
length(s) — длина | length('cat') | 3 |
s1 + s2 — склейка | 'Free' + 'Pascal' | 'FreePascal' |
copy(s, i, n) — n символов с позиции i | copy('Pascal', 2, 3) | 'asc' |
pos(t, s) — где t встречается в s | pos('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 — процедуры: они меняют саму переменную-строку.
program EditString;
var
s: string;
begin
s := 'Hello, world';
delete(s, 6, 7);
writeln(s);
insert(' Pascal', s, 6);
writeln(s);
end.Hello
Hello Pascaldelete(s, 6, 7) удаляет семь символов начиная с шестого — запятую, пробел и слово world.
Перебор символов
Строку обходят циклом for от 1 до length(s). Пример — сколько раз в строке встречается буква a:
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) — вместе с пробелами, до конца строки.
Перевернуть строку — собрать новую, идя по старой с конца:
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 uppu levelКоды символов: ord и chr
У каждого символа есть числовой код. ord(c) возвращает код символа, chr(n) — символ по коду. Латинские буквы и цифры идут подряд: коды 'A'…'Z' — от 65 до 90, 'a'…'z' — от 97 до 122, '0'…'9' — от 48 до 57.
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
abcdeord(c) - ord('0') превращает символ-цифру в число: так считают сумму цифр, записанных строкой. Параметр цикла for может быть и символом: for c := 'a' to 'e' перебирает буквы от a до e.
Проверить, что символ — цифра или латинская буква, можно сравнением: (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 ограничения нет.
Частые ошибки
- Нумерация с нуля. Первый символ —
s[1].s[0]— не символ строки: в PascalABC.NET это ошибка, а в Free Pascal там хранится служебная длина строки. - Двойные кавычки вместо одинарных.
charиstringперепутаны. Вcharпомещается ровно один символ:c := 'ab'— ошибка.- Число и строка.
'5' + 3в Free Pascal — ошибка, а PascalABC.NET приклеит число к строке и получит'53', а не 8. Чтобы считать, сначала переведите строку в число — как, рассказано в справке Как перевести число в строку и обратно.
Коротко
string— строка,char— один символ, символы нумеруются с 1.length— длина,+— склейка,copy— кусок,pos— поиск (0 — не найдено).deleteиinsertменяют саму строку.ord— код символа,chr— символ по коду,ord(c) - ord('0')— цифра в число.- Строку обходят циклом
for i := 1 to length(s).