В ТР есть специальный тип для работы со строками переменной длины. Описание этого типа:
Целое определяет максимальную длину строки. Оно должно принадлежать промежутку [1; 255]. Например,
|
Переменной s, согласно описанию, выделяется n +1 байт. Переменную s можно рассматривать, как символьный массив с типом индекса 0..n и использовать для работы со строками длиной не более n. Собственно строка начинается с символа s[1]. Нулевой элемент массива резервируется для хранения информации о динамической длине строки. В нем хранится символ с кодом, равным динамической длине строки. Если s[0] есть символ с кодом 0 (#0), то строка s не содержит символов. Будем называть такую строку пустой. Динамическая длина определяется выражением ord(s[0]). Кроме этого, динамическую длину строки возвращает стандартная функция length(s:string): byte.
Тип string (без указания размера) эквивалентен типу string[ 255]. Длина строки при этом может изменяться от 0 до 255.
Ввод и вывод строк осуществляется с помощью процедур read[ln] и write[ln]. Следует обратить внимание на то, что при вводе в строку заносятся последовательно все символы из буфера ввода до символа перехода к новой строке. Сам символ перехода к новой строке остается в буфере, и с него начнется следующее считывание. Поэтому одним оператором read несколько строковых переменных ввести нельзя. При выполнении оператора read(s1, s2) строка s2 всегда будет пустой. Последовательный ввод строк можно выполнить, обращаясь к процедуре readln с одним параметром:
readln(s1); readln(s2); readln(s3);
Строковый тип ТР совместим по присваиванию:
1) с любым типом string;
2) c упакованным символьным массивом (равенство длин не требуется);
3) с символьным типом.
|
Оператор инициализации строки s пустой строкой:. В правой части оператора присваивания два апострофа.
В ТP определена бинарная операция конкатенация (соединение строк). Знак этой операции '+'. Операндами могут быть символы, упакованные символьные массивы и строки. Результатом является строка, полученная дописыванием в конец первого операнда второго операнда.
|
В результате выполнения программы примера 1 будет выведено
|
Первая строка вывода - результат конкатенации, вторая - значение s2, которое получено в результате конкатенации с последующим усечением до 8 символов.
Над строковым типом определены все операции сравнения, причем если один из операндов имеет строковый тип, то другой может быть строковым, символьным или упакованным символьным массивом. Примеры истинных отношений: ‘abcwt’< ’abd’, ‘abc’ > ’ab’.
Пример 2. Словом будем называть последовательность символов, не содержащую пустых символов. К пустым символам отнесем пробел (#32), символ табуляции (#9) и переход к новой строке (#10). Можно считать, что слово не содержит не только пустых, но и любых управляющих символов, то есть символов, меньших #33. Опишем программу для определения количества слов в данной строке:
Program words_number;
var str: string;
k, i: byte; {k - счетчик числа слов, i - параметр цикла}
begin
writeln('Введите строку'); ReadLn(str);
{инициализация счетчика}
if str[1]>#32 then k:=1 {первый символ - начало слова}
else k:=0; {строка начинается пустым символом}
for i:=2 to length(str) do
if (str[i-1]<#33) and (str[i]>#32) {если начало слова }
then k:=k+1;
writeln ('Число слов строки ',str,' равно ',k);
end.
Если, работая со строкой, как с символьным массивом, приходится изменять длину строки, необходимо позаботиться об изменении значения нулевого байта.
Пример 3. Программа удаления из строки символов, равных данному:
Program symb_del;
var str: string;
ch: char;
len, i, j: byte;
begin
writeln('Введите строку'); ReadLn(str);
writeln('Введите символ'); ReadLn(ch);
len:= length(str); {Запоминаем длину исходной строки}
j:= 0; {j - число сохраненных символов в преобразованной строке}
for i:=1 to len do {Просматриваем все символы строки}
if str[i]<>ch {Символ остается в строке}
then
begin j:= j+1; {Увеличиваем число сохраненных символов}
str[j]:= str[i] {Сохраняем символ}
end;
str[0]:= chr(j); {Устанавливаем новую длину строки}
write (‘ Преобразованная строка: ', str);
end.
20. ПОДПРОГРАММЫ
Один из принципов структурного программирования заключается в разбиении задачи на достаточно самостоятельные подзадачи. Для решения каждой подзадачи можно разработать свой алгоритм и записать его в виде самостоятельного программного блока, называемого подпрограммой. Подпрограммы имеют имена, и обращаться к ним можно по именам.
Подпрограммы позволяют избегать многократной записи одной и той же последовательности действий. В языке Паскаль существует два вида подпрограмм: процедуры и функции.
Программа, содержащая подпрограммы, проще для создания, легче для понимания, удобнее для использования.
При разработке программ, содержащих подпрограммы, необходимо уметь описывать подпрограммы и обращаться к ним.
Подпрограммы, как и другие программные объекты, должны быть описаны в разделе описаний. Структура описания подпрограммы такая же, как и структура программы, но в описании подпрограммы заголовок обязателен и описание подпрограммы заканчивается символом ‘;’, а не точкой.