Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
45
Добавлен:
10.02.2015
Размер:
301.06 Кб
Скачать

Лекция 8. Строки.

1.Типы строк в DELPHI.

2.Использование функций и процедур работы со строками.

3.Разбить строку на слова.

4.Сортировка слов по различным критериям.

Типы строк в DELPHI

Строка в DELPHI – это специальным образом организованный одномерный массив символов. Необходимость специальной организации массива символов объясняется чрезвычайной изменчивостью размера строки. Чтобы убедиться в этом достаточно открыть любую книгу, и вы встретите как строки из одного символа – так и строки на всю страницу.

Несмотря на то, что строка в DELPHI это только массив, т.е. упорядоченная совокупность однотипных элементов типа CHAR, строковый тип объявляется отличным от массива синтаксисом. Более того, строки имеют предопределенное имя типа STRING, которое может быть использовано различным способом в зависимости от организации строки.

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

Итак, строка в DELPHI - это одномерный массив символов, организованный специальным образом, который различается по признаку статического или динамического выделения памяти под массив. Чтобы глубже понять отличие в способах выделения памяти, рассмотрим пример.

Var s80 : string[80];// Статическое sd : string; // Динамическое

begin

s80:=' Static string length='; // size=81 writeln(s80,length(s80),' size=',sizeof(s80)); sd:=' Dynamic string length='; // size=4 writeln(sd, length(sd), ' size=',sizeof(sd)); readln;

end.

У статического массива текущая (актуальная) длина хранится как число типа BYTE в нулевом элементе. Ее можно посмотреть непосредственно writeln(byte(s80[0])); Максимальная длина статической строки 255 символов.

Для динамических строк элемент sd[0] не доступен. Получить информацию о текущей длине такой строки можно только через функцию length(sd). Управление текущей длиной строки осуществляется с помощью символа #0 (нуль-терминатор), которым обозначается конец строки. Посмотреть на него можно, например так: writeln(byte(sd[length(sd)+1]));

Использование функций и процедур работы со строками.

Поскольку обработка строк на уровне отдельных символов неэффективна, хотя и возможна, поскольку «смысловой единицей» является здесь слово, а не отдельный символ, DELPHI содержит ряд встроенных процедур и функций для обработки строк на уровне именно строк.

Функции:

length(str) – возвращает текущую длину строки str;

pos(substr, str) – возвращает позицию первого вхождения подстроки substr в строку str или 0 если подстрока не

найдена:

copy(str, n, count) – возвращает из строки str count

символов, начиная с позиции n.

concat(str1, str2[, srt3…strN]) – возвращает «сумму» строк str1, str2 и т.д., полученную путем конкатенации (эту функцию можно заменить операцией «+»);

Процедуры:

Insert(substr, str, n) – вставка подстроки substr из строки str

начиная с позиции n;

delete(str, n, count) – удаляет из строки str count символов, начиная с позиции n.

str(x[:w[:d]] – преобразует число x в строку по формату :w[:d], как это делает процедура writeln;

val(str, x, code) – преобразует строку str в число x; в параметре code содержится позиция первого не цифрового символа или 0 в случае успешного преобразования.

Кроме этих процедур и функций в DELPHI определены операции отношения строк: =, <>, >, <, >=, <= , которые выполняются по правилам лексем.

Задание 1

Дана строка произвольной длины, состоящая из слов, знаков препинания и других разделителей

Сформировать из этой строки массив слов, не содержащий разделителей (создать словарь)

Каркас приложения

Type Tw = array[1..100] of string;

Var s : string;

BEGIN

s:=' Two Ticket to Dublin! Kuda Blin?’+

’ To Dublin..., Cost= 123.00: '; writeln(s);

readln;

END.

Функция удаления знаков препинания с подсчетом числа удалений

//Константа – множество символов, подлежащих

//удалению из строки. Ее надо объявить в разделе

//описаний.

Const ZnakP : set of Char=

['.',',',':',';','?','!','=','-'];

Function DelZnakP(Var s : string) : word;

Var i : word;

Begin Result:=0;

for i:=1 to length(s) do if s[i] in ZnakP then

begin inc(Result); s[i]:=' '; end;

End;

Основная программа

Var s : string; BEGIN

s:=' Two Ticket to Dublin! Kuda Blin? To Dublin..., Cost= 123.00: ';

writeln(s);

writeln('Delete Znak = ', DelZnakP(s)); writeln(s);

readln;

END.