..

Сайт города Попасная.
 

 

Программирование

 

Интернет издания:

ПОПАСНЯНСКАЯ ПРАВДА

 



 

 

 

4.2. Строки

Строка представляет собой последовательность нумерованных, начиная с 0, символов, к ней можно обращаться как к единому целому и к каждому элементу по отдельности. Для объявления переменной типа строка используется идентификатор String, являющийся зарезервированным словом:
Var s:String;
Количество элементов в строке s в процессе выполнения программы может быть любым, но не более чем 255 символов. Строки можно использовать так же, как массивы. Например, объявленная выше строка занимает столько же памяти и имеет такую же структуру, как и массив s1:Array[0..255] of Char. Однако по сравнению с массивами использование строк дает значительные преимущества. Строки можно вводить, выводить и сравнивать как единое целое. Поэтому, например, программа, которая вводит слова и расставляет их в алфавитном порядке, при использовании строк реализуется значительно проще, чем при использовании массивов. Чтобы ее составить, достаточно всего лишь внести небольшие изменения в программу 4.1.

Программа 4.2.

{Сортировка 5 слов в алфавитом порядке}
Const n=5;
Var
Mas:Array[1..n] of String;
i,j:Byte;
Exchange:String;
Begin {Ввод слов}
For i:=1 To n Do
Begin
Write('Введите слово');
Readln(Mas[i]);
End;
{Сортировка}
For i:=1 To n-1 Do
For j:=1 To n-i Do
If Mas[j]>Mas[j+1] Then
Begin
Exchange:=Mas[j];
Mas[j]:=Mas[j+1];
Mas[j+1]:=Exchange;
End;
{Вывод слов, расположенных по алфавиту}
For i:=l To n Do
Writeln(Mas[i]);
End.

Введем 5 слов: Озеро, Пруд, Река, Море, Бассейн. Программа расположит их в алфавитном порядке и выведет следующую последовательность:
Бассейн
Море
Озеро
Пруд
Река

При сравнении строк меньшей считается та из них, у которой меньше первый символ. Если первые символы совпадают, то сравниваются вторые, и так далее. Если одна строка является частью второй, например «кот» и «котенок», то более короткая строка является меньшей. Согласитесь, что реализовать подобный алгоритм сравнения для массивов из символов сложнее, чем просто сравнить две строки. Строкам, как и простым переменным, можно присваивать значение константы, которая представляет собой последовательность символов, заключенных в апострофы.
S:='Cтpoкa';
L:='символов';

Кроме операций сравнения для строк определена операция конкатенации, то есть сцепления (слияния, соединения) двух строк в одну. Эта операция обозначается знаком «+», как и операция арифметического сложения для чисел. Результатом применения операции конкатенации S+L к определенным выше строкам будет строка В, содержащая последовательность символов "Строка символов". Если выполнить оператор B:=L+S, то строка В получит значение "символовСтрока". Если заранее известно, что длина строки не превысит заданной величины, максимальное количество элементов можно задать при объявлении строки, указав его в квадратных скобках после слова String, например, Var s:String[20]. Если теперь мы попробуем ввести более 20-ти элементов, то в строку запишутся только первые 20 из них. В памяти строка S всегда будет занимать 21 байт, и соответствовать массиву S:Array[O..2O] of Char. Первый элемент строки, то есть элемент с индексом 0, содержит в памяти число, равное количеству элементов, записанному в строку. Однако, поскольку все элементы в строке, в том числе и первый, рассматриваются только как символы, это число, находящееся в диапазоне от 0 до 255, представляет собой код некоторого символа. Поэтому для того, чтобы им воспользоваться как числом, надо применить функцию Ord, возвращающую числовое значение кода символьной переменной, например, как это сделано в следующей программе, определяющей количество заданных символов во введенной строке.

Программа 4.3.

Var
Stroka:String;
Symvol:Char;
i,n:Byte;
Begin {Ввод строки}
Write('Введите строку ');
Readln(Stroka); {Ввод символа}
Write('Введите символ ');
Readln(Symvol);
n:=0;
{Определение количества символов Symvol в строке Stroka}
For i:=l To Ord(Stroka[0]) Do
If Stroka[i]=Symvol Then
Inc(n);
Writeln('Строка ',Stroka,’ содержит’,n:4,' символов ', Symvol );
End.

Каждый элемент строки, начиная с первого, сравнивается с введенным символом. При их совпадении выполняется процедура Inc(n), записывающая в переменную n (счетчик повторений) следующее по порядку значение. Цикл сравнения завершается по достижении последнего элемента строки, то есть символа с номером Ord(Stroka[0]). В TurboPascal 7.0 определено 9 процедур и функций, выполняющих операции над строками или их частями.

Функция Length(s) вычисляет длину строки s. Оператор y:=Length(s) дает тот же результат, что и оператор y:=Ord(s[0]). Функция Copy(s,start,len) возвращает часть строки s, начинающуюся с символа с порядковым номером start. Количество возвращаемых символов равно len. В результате выполнения операторов:
s:='булавка';
sl:=Copy(s,3,5);

в переменную s1 будет записано слово "лавка".

Процедура Delete(s,start,len) удаляет часть строки s, начинающуюся с символа с порядковым номером start. Количество удаляемых символов равно len. После выполнения операторов
s:='булавка';
Delete(s,3,3);

в переменной s будет записано слово "бука".

Процедура Insert(ins,s,start) вставляет в строку s, начиная с позиции start, все символы строки ins. После выполнения операторов:
s: ='булка';
ins:='aв';
Insert(ins,s,4 );

в переменной s будет записано слово "булавка".

Функция Pos(sub.s) определяет, является ли строка sub частью строки s. Если это так, то она возвращает порядковый номер первого символа в строке s, начиная с которого элементы этих строк совпадают. Если sub не является частью s, то возвращается 0. В результате выполнения операторов:
s:='буававка';
sub:= ‘ав’;
n:=Pos(sub,s);

в переменную п будет записано число 3.

Функция Concat(s1,s2,...,sn) выполняет операцию конкатенации, объединяя несколько строк в одну. В результате выполнения операторов:
first:='бул';
second:='ав';
third:='Ka’;
wrd:=Concat(first,second,third);

в переменную wrd будет записано слово "булавка". Количество символов в объединенной строке не может превышать максимальной длины wrd, лишние символы отсекаются.

Процедура Fillchar(s[n],m,c) заполняет строку s, начиная с позиции n, m одинаковыми символами, образец символа находится в переменной с. В результате выполнения операторов:
c:=’*’;
Fillchar(s[5],10,с);

в переменную s будет записано 10 звездочек, начиная с пятого символа. Данная процедура заполняет смежную область памяти, не проверяя границы расположения переменных. Поэтому, если максимальная длина строки s задана равной 11, последние три символа будут записаны в ячейки памяти, соседние с ячейками переменной s. В этом случае возможно нарушение данных в смежной с s переменной.

Процедура Str(x,s) преобразует число, записанное в переменной х, в строку. Переменная х может быть любого целого или вещественного типа. После выполнения операторов:
х:=14;
Str(x,s);

в переменную s типа String будет записано слово "14". В результате выполнения операторов
xreal:=145/3;
Str(xreal,s);

в переменную s типа String будет записано слово "4.83333333Е+01".
В процедуре Str допускается использовать формат так же, как и при выводе значений. Поэтому выполнение следующих двух операторов
xreal:=145/3; Str(xreal:6:2,s);
приведет к тому, что в переменную s будет записано слово " 48.33".

Процедура Val(s,x,err) преобразует последовательность символов, записанную в строке s, в числовое значение и сохраняет его в числовой переменной х. Тип переменной х должен соответствовать типу преобразуемого числа. Ели это не соблюдается или в строке s записано не число, то преобразование не будет выполнено, значение х не изменится, а в переменной err будет записан код ошибки, представляющий собой номер первого символа в строке, при анализе которого произошла ошибка преобразования. Если ошибки в задании исходных данных нет, то в переменной err возвращается 0. Например:
s:=’14’;
sl:='0.0035';
Val(s,x,err);
Val(si,у,err);

в переменной х типа integer будет записано число 14, а в переменной у типа Real - число 3.5000Е-03. Процедура Val не учитывает формат целочисленной переменной, поэтому при преобразовании строки в целочисленное значение могут возникнуть такие же ошибочные ситуации, как и при присваивании целочисленных значений для разных целых типов. Так, при преобразовании строки «256» в значение типа Byte в зависимости от настройки опции компилятора «Range Checking» либо в переменную х запишется 0, либо произойдет аварийное прерывание программы. В язык Pascal, начиная с версии Turbopascal 7.0, введен еще один тип строк - PChar, который позволяет использовать значительно более длинные строки. Максимальное число символов для строки типа PChar равно 65535. Следует, однако, иметь в виду, что при использовании типа PChar необходимо обязательно установить режим расширенного синтаксиса. Это можно сделать, установив опцию Extended syntax (Расширенный синтаксис) в панели Syntax options (Опции синтаксической обработки) пункта Compile (Компиляция) меню Option (Опции), либо включив в начало программы, использующей строку данного типа, директиву {$Х+}. Если режим расширенного синтаксиса не включить, то переменная типа PChar будет эквивалентна переменной типа Char. Строки типа PChar называются ASCIIZ-строками, то есть ASCII строками, заканчивающимися нулем (Zero). Аббревиатура ASCII является названием общепринятого способа кодирования символов, рассмотренного в разделе 5.5, а буква Z - Zero - означает, что данная строка завершается символов с кодом, равным нулю, который и является признаком конца такой строки. Процедуры обработки строк типа PChar включены в состав модулей Strings и WinDos, которые в данном издании не рассмотрены.

 

Вернуться к оглавлению

 
Popasnaya.com.ua Web-Source 2003 - 2004 / babelyuk jr / All Rights Reserved