Билет №11. Структурный тип строка. Строка, как специальная форма массива.
В Турбо Паскале имеется семейство строковых типов, рассматриваемых как специальная форма массива, а именно одномерный массив символов. Это семейство соответствует по умолчанию следующему описанию:
type string[ <m >] = array [0..m] of char;
где: <m >- максимальная длина строки (число диапазона 0 .. 255).
string- стандартное имя строкового типа, являющееся ключевым словом.
Строки длины до 255 соответствуют типу string (без указания длины строки).
Нулевая позиция строки является специальной позицией, в которой хранится текущая длина строки (код ASCII, представляющий длину строки). Эта позиция автоматически корректируется при операциях над строками.
Доступ к компоненту строки (символу строки) осуществляется также как к элементу массива, т.е. по индексу (индексному выражению).
Например: st[J+1] {Cимвол в позиции J+1 строки st}
Разрешен доступ, в том числе и к нулевой позиции строки, так что, например ord(st[0]) - длина строки st . Замечание
Изменение содержимого нулевой позиции строки оператором присваивания эквивалентно изменению текущей длины строки и может привести к отсечению части строки или присоединению к строке дополнительных пробелов.
2. Основы обработки строк.
Строки относятся к важным средствам представления нечисловой информации, и обработка строк имеет широкие приложения во многих областях использования нечисловой информации (редактирование текстов, логический анализ, автоматизация перевода, распознавание текстов и др.).
Поскольку строки указанного типа являются разновидностями массива, для них можно применять всё, что применимо к массивам. Кроме того, для обработки строк в Турбо Паскале предусмотрен ряд достаточно удобных и эффективных средств:
Для строк допустим оператор присваивания вида:
< переменная типа string > := < выражение типа string или типа char >;
Над строками допустимы отношения сравнения <,<=,>,>=, =, <>, причём длины сравниваемых строк могут быть различными (меньшая строка при сравнении дополняется справа до выравнивания длин символами chr(0)). Сравнение выполняется посимвольно слева направо по кодам символов таблицы ASCII. Например: 'A' >'1', 'Turbo' < 'TURBO PASCAL'.
К строкам применима операция сцепления строк (конкатенация), обозначаемая символом '+'. Например: 'Это -' + 'строка' {соответствует 'Это - строка' }.
Стандартные процедуры обработки строк:
Delete(st, Npos, count) -удаление из строки st, начиная с позиции Npos под- строки длины count .
Insert(subst, st, Npos) -вставка в строку st подстроки subst с позиции Npos.
Стандартные функции обработки строк:
Length(st) -длина строки st (без учёта нулевой позиции строки).
Copy(st, Npos, count) -выделение из строки st подстроки длиной count, на чиная с позиции Npos.
Pos(subst, st) -позиция начала первого вхождения подстроки subst в строку st (если подстрока не найдена, то pos=0).
Основными элементарными задачами обработки строк являются: управление пробелами в строке (удаление лишних пробелов, удаление пробелов в начале или в конце строки, выравнивание длин строк вставкой пробелов и др.), анализ частот символов, либо подстрок, поиск подстрок по заданным критериям (первого вхождения, всех вхождений, по образцу, по шаблону и др.), подстановка подстрок и другие.
3. Примеры элементарных программ обработки строк.
Приведём две такие программы на Турбо Паскале:
program bin_dec; {Перевод двоичного числа в десятичное}
uses CRT;
var bin:string; {строка-двоичное число}
dec:integer; {эквивалентное десятичное число}
r,j:integer;
begin TextBackground(cyan);TextColor(white);ClrScr; window(10,10,50,20);
TextBackground(green); ClrScr; write(' Введите двоичное число: ');read(bin);
dec:=0;r:=1;for j:=length(bin) downto 1 do
begin if (bin[j] <>'0') and (bin[j] <>'1') then
begin writeln('Ошибка ввода');halt end; if bin[j]='1' then dec:=dec + r;r:=r*2
end; writeln('Десятичное число: ', dec)
end {bin_dec}.
program del_blank;{Удаление лишних пробелов между словами в строке}
uses CRT;
var str:string; {Вводимая строка}
c:string;j:byte;
begin TextBackground(cyan);TextColor(white);ClrScr;
repeat writeln('Введите строку:');readln(str);
if str='' then writeln('Строка пустая') else
begin j:=1; if length(str)>1 then while j<length(str) do
if (str[j]=' ') and (str[j+1]=' ') then delete(str,j+1,1) else j:=j+1;
writeln('Результирующая строка:'); writeln(str);
end;readln(c);
until c=' ';
end{ del_blank}.
