Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование на паскале2.doc
Скачиваний:
145
Добавлен:
31.03.2015
Размер:
935.94 Кб
Скачать

3.1.2.Строковые типы

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

Сначала рассмотрим строковый тип stringв Турбо Паскале.

Переменная типа stringпринимает значения на множестве строк символов переменной длины (каждый символ имеет типchar), при описании указывается максимальная длина. Например:

Const M=20;

Var LS: string[М]; {M-максимальная длина строки}(1)

Если максимальная длина строки при описании не указана (отсутствует вместе с квадратными скобками), то по умолчанию она считается равной 255.

Для хранения строки требуется (M+1) байт: нулевой байт используется для хранения текущей длины строки, байты с 1-го по М-й -для хранения символов строки. Допустимо в программе обращаться к любому элементу строки, в том числе к нулевому:LS[i] - i-й элемент строки LS, i=0,1,2,...,M. ВыражениеORD(LS[0])дает текущую длину строки; кроме того, для определения текущей длины строки в имеется встроенная функцияlength.

Для переменных типа stringввод, вывод, присваивание выполняются не поэлементно, а одним оператором, т.е. допустимы операторыREAD(LS);WRITE(LS); LS:='123'. При задании исходных данных для ввода строка ограничивается либо нажатием клавиши "ENTER", либо значением максимальной длины, определенной при описании строки. Длина строки в правой части оператора присваивания может быть произвольной (если она больше максимальной, то происходит отбрасывание "лишних" символов справа). В таких операторах, как, например, ввод и присваивание, где строка рассматривается как единое целое, длина строки (т. е. содержание ее нулевого байта) определяется автоматически. При работе с отдельными элементами строки за длиной строки должен следить программист (см. пример 2).

Для строк определены операции сравнения. Они сравниваются посимвольно, слева направо. Большей считается строка, в которой больше код первого слева несовпадающего символа. Если строки имеют разную длину, то короткая строка дополняется справа символами CHR(0). Напомним, что, в отличие от строк, массивы символов можно сравнивать, только если они имеют одинаковую длину.

Пример1. Вычислить количество слов в строке. Под словом понимается группа символов, не содержащая пробелов. Слова могут разделяться одним или несколькими пробелами.

В приведенной программе мы подсчитываем число "концов слов", т. е. число пар символов "непробел-пробел". Алгоритм (блок-схема на рис.16) предусматривает последовательный в цикле просмотр пар рядом стоящих символов строки, номер первого символа пары меняется от 1 до n-1.n– текущая длина строки. После последнего слова пробел может не стоять – эта ситуация учитывается условным оператором в конце программы.

Таблица 10. Состав данных программы примера 1.

Имя

Смысл

Тип

Структура

Исходные данные

pr

заданная строка

строка

Выходные данные

k

количество слов

целый

простая переменная

Промежуточные данные

i

номер первого символа пары

целый

простая переменная

n

текущая длина строки

целый

простая переменная

program nwd;

var pr:string;{исходная последовательность символов}

n,i,k:integer;{n-длина последовательности, k-число слов,

i-cчетчик символов}

BEGIN readln(pr);

n:=length(pr); k:=0;

for i:=1 to n-1 do

if (pr[i]<>' ') and (pr[i+1]=' ') then k:=k+1;

if pr[n]<>' ' then k:=k+1;

writeln('ЧИСЛО СЛОВ РАВНО',k)

END.

Пример 2.Удалить из текста все заглавные латинские буквы.

program dlt;{удаляет из стpоки s заглавные латинские буквы}

Var s :String;n: Integer;{текущая длина стpоки}

i,j: Integer;{счетчики элементов стpоки}

Begin Writeln(' Введите стpоку текста ');

Readln(s); n:=Length(s); i:=1;

Repeat

while (i<=n) and not ((s[i]>='A') and (s[i]<='Z')) do i:=i+1;

{по окончании цикла while i-номеp пеpвой слева заглавной буквы}

If i<=n Then

Begin

If i<n Then

For j:=i to n-1 do {все символы, начиная с (i+1)-го,}

s[j]:=s[j+1];{сдвигаются на одну позицию влево}

s[0]:=CHR(n-1); {необходимо изменить длину стpоки}

{ObjectPascal: вместо предыдущего оператораSetLength(s,n-1)}

n:=n-1;

End;

Until i>n;

WriteLn(' Измененная стpока'); Writeln(s);

End.

Объектный Паскаль, как более мощный алгоритмический язык, по сравнению с Турбо Паскалем имеет расширенный набор строковых типов. Данные типа string (эквивалентное названиеAnsiString)могут содержать до 231 символов типаchar. ТипShortString эквивалентен типу string Турбо Паскаля. ТипWideStringсоответствует строкам максимальной длины до 230 символов типа widechar. Объектный Паскаль с целью увеличения надежности программ не разрешает менять нулевой байт строки и предлагает для изменения длины строки применять процедуруSetLength(строка,новая_длина_строки) – см. комментарии примера 2.