Песни о Паскале
Шрифт:
var c1 : char; S: string;
...
S:= c1;
Это и понятно, ведь строка может вмещать много символов! Строковые и символьные данные можно «склеивать» операцией сложения, результат получится строковым, например:
c1:= ’A’; c2:= ’B’; c3:= ’A’;
S:= c1 + c2 + ’B’ + c3; { результат равен ’ABBA’ }
S:= ’pascal’+ c1 + S; { «склеивание» символов и строк }
Подобно строкам, отдельные символы вводятся процедурой Readln,
Readln(c1);
Writeln(c1);
Индексация
Ясно, что «склеить» символы в строку немудрено, но ведь для решения поставленной задачи требуется обратное – разобрать строку на отдельные символы. Взглянем на строку с иной стороны – как на стройный ряд символов. Каждый символ в этом строю, подобно солдатам, занимает свою позицию. Позиции нумеруются слева направо, начиная с единицы. Например, в слове «PASCAL» символ «P» занимает первую позицию, а «L» – шестую.
Оказывается, что по этим номерам можно обращаться к отдельным символам строки, применяя операцию индексации. Она записывается с помощью пары квадратных скобок, расположенных за символьной переменной или константой. Внутрь скобок помещают числовое выражение, указывающее позицию символа в строке. Например, для извлечения 3-го символа строки можно написать
c1:= S[3];
Выражение, что внутри квадратных скобок, называется индексом. Повторяю, индексом может быть не только число, но и числовое выражение, например:
c1:= S[2*N+1];
Если N равно двум, то в символьную переменную c1 будет помещен пятый символ строки S.
Длина строки
Разумеется, что значение индекса не должно превышать количество символов в строке. Но как избежать таких ошибок? Если строка перед глазами, вы посчитаете символы, тыча в строку пальчиком. А если это строковая переменная?
В Паскале есть функция, определяющая количество символов в строке, или, иначе говоря, длину строки. Эта функция так и называется – Length – «длина». Вызвать её можно, например, так:
K:= Length(S);
Здесь переменной K целого типа присваивается значение длины строковой переменной S. Вот ещё примеры (в комментариях указаны результаты).
S:= ’’; K:= Length(S); { К=0 }
S:= ’PAS’ K:= Length(S); { К=3 }
K:= Length(S+’CAL’); { К=6 }
K:= Length(’Привет, Мартышка!’); { К=17 }
Распечатка строки
Теперь мы достаточно подкованы, чтобы решить поставленную задачу – разбить строку на отдельные символы. Вот как выглядит один из вариантов
{ P_18_1 – распечатка отдельных символов строки }
var S: string;
C: char;
k, L : integer;
begin
repeat
Write(’Введите строку: ’); Readln(S);
L:= Length(S); { определяем длину строки }
for k:=1 to L do begin
C:= S[k]; { выбираем очередной символ }
Writeln(C); { и печатаем его в отдельной строке }
end;
until L=0; { L=0, если строка пуста }
end.
После ввода запрошенной строки определяем её длину, а затем, пробегая по строке, выбираем и печатаем символы. Программа работает, пока пользователь не введет пустую строку; тогда длина строки L станет равной нулю, и цикл завершится.
В этом варианте программы я сознательно допустил некоторые излишества, дабы наглядней показать механизм доступа к символам строки. То же самое можно записать короче, а именно:
{ P_18_2 – распечатка отдельных символов строки, краткий вариант }
var S: string; k : integer;
begin
repeat
Write(’Введите строку: ’); Readln(S);
for k:=1 to Length(S) do Writeln(S[k]);
until Length(S)=0;
end.
Здесь функция Length вставлена в оператор FOR, а параметром процедуры Writeln является текущий символ строки S[k]. В цикле FOR выполняется теперь лишь один оператор, поэтому отпала нужда в блоке BEGIN-END. Обратите внимание на условие завершения цикла UNTIL, – оно записано с применением функции Length.
На этом прервем изучение символов и строк. Однако тема не исчерпана, и к ней мы ещё вернемся.
Итоги
• Строки – это цепочки символов. Для работы с отдельными символами в Паскале предусмотрен тип данных CHAR.
• Данные типа CHAR можно «склеивать» друг с другом и со строковыми данными, в результате получаются строки.
• Доступ к отдельным символам строки возможен путем индексации. Эта операция обозначается парой квадратных скобок, следующих за строкой; внутрь скобок помещают числовое выражение – индекс.
• Доступ по индексу применяется как для чтения символов строки, так и для их изменения.
• Для обработки строки необходимо знать её длину. С этой целью в Паскале применяется функция Length.
• Для последовательной обработки символов строки обычно используют цикл со счетчиком FOR-TO-DO.
А слабо?
A) Напишите программу для подсчета букв «А» во введенной пользователем строке. Или слабо?
Б) Напишите программу, меняющую символы «А» строки на символы «Б». Подсказка: изменение символа строки делается оператором присваивания вида S[i]:=…