Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие Алгоритмизация и программирование.doc
Скачиваний:
107
Добавлен:
11.03.2015
Размер:
768.51 Кб
Скачать

19.6. Строковый тип в тр

В ТР есть специальный тип для работы со строками переменной длины. Описание этого типа:

Целое определяет максимальную длину строки. Оно должно принадлежать промежутку [1; 255]. Например,

const n=10;

var s : string[n];

Переменной 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:=’’;

сли строковой переменной присваивается значение, превышающее длину строковой переменной, то перед присваиванием происходит усечение присваиваемого значения.

Оператор инициализации строки s пустой строкой: .В правой части оператора присваивания два апострофа.

В ТP определена бинарная операция конкатенация(соединение строк). Знак этой операции '+'. Операндами могут быть символы, упакованные символьные массивы и строки. Результатом является строка, полученная дописыванием в конец первого операнда второго операнда.

Пример 1.

var ch : char;

ch_arr : array[1..3] of char;

s1 : string;

s2 : string[8];

begin

ch := ‘W’; ch_arr := ‘ord’;

s1 := ‘_and_byte’ ;

s2 := ch+ch_arr+s1;

writeln(ch+ch_arr+s1);

writeln(s2)

end.

В результате выполнения программы примера 1 будет выведено

Word_and_byte

Word_and

Первая строка вывода результат конкатенации, втораязначение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 tolength(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 tolendo {Просматриваем все символы строки}

if str[i]<>ch {Символ остается в строке}

then

begin j := j+1; {Увеличиваем число сохраненных символов}

str[j] :=str[i]{Сохраняем символ}

end;

str[0]:= chr(j); {Устанавливаем новую длину строки}

write (‘Преобразованная строка: ', str);

end.