Тема 19. Алгоритмизация обработки строковой информации. Обработка записей. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Тема 19. Алгоритмизация обработки строковой информации. Обработка записей.



Для работы с символьной информацией в ТР используют новый тип данных - строковый, именуемый ключевым словом STRING (или просто строка). Этот тип данных во многом похож на одномерный массив символов (Array[0..N] of char), но длина строки (максимальное количество символов N ограничивается числом 255). Значение N определяется при объявлении типа STRING(N) и может быть любой константой порядкового типа, но не больше 255. Значение N при объявлении типа STRING можно не указывать: в этом случае длина строки принимается равной 255 символам.

Строка в ТР трактуется как цепочка символов и к любому символу в строке можно обратиться по адресу (индексу), подобно одномерным массивам типа Array[0..N] of char. Самый первый байт в строке, имеющий адрес 0 (ноль), содержит код, равный числу символов в строке (длине строки).

Например, дана строка, имеющая следующее описание:

Var St:string;

Тогда длину строки St можно определить как значение функции Ord(St[0]).

Значением строки может быть любая последовательность символов, заключенная в одинарные кавычки (апострофы). Можно присваивать строке пустое значение, обозначаемое как '' (две одинарные кавычки подряд). При попытке записать в переменную строку длиннее, чем задано в описании, "лишняя" часть будет отсечена.

Строки можно присваивать, сливать и сравнивать.

Например:

Var st1,st2,st3,sts:string;

Begin

...

{ Операции присваивания}

st1:='Фамилия';

st2:='Имя';

st3:='Отчество';

{ Операция слияния}

sto:=st1+' '+st2+' '+st3;

{ В результате в строке sto будет 'Фамилия Имя Отчество'}

End;...

Сравнение строк основывается на порядке расположения символов в таблице ASCII. Например:

'abcd' = 'abcd' - результат сравнения True (истина);

'abc'<'bcd' так как код символа 'a' меньше кода символа 'b' и т.п.

Для работе со строками в ТР разработан ряд стандартных процедур и функций.

Первоначально любая описанная в разделе Var строка содержит "мусор" и рекомендуется инициализировать (заполнять) строки пустыми значениями или чем-либо другим. Для заполнения достаточно длинных строк одинаковыми символами используется встроенная процедура FillChar, например:

Var S:string[80];

Begin...

FillChar(S[1],80,' '); {Заполнение строки пробелами}

S[0]:=Chr(80); {Занесение кода длины строки}

...

End;

Длину строки можно определить также, используя встроенную функцию Length(S), где S - строка типа String.

В ряде случаев возникает необходимость преобразования числовых значений в строку и наоборот. Для этого можно использовать две процедуры:

1) STR(X,S) - преобразует числовое значение X в строковое S. Возможно задание формата для Х в виде: X:F:n (для вещественных чисел, где F - общее число позиций выделяемых под число, включая десятичную точку, а n - число знаков в дробной части) или X:F (для целых чисел). Эта функция чаще всего используется при работе с процедурами модуля GRAPH. Например:

STR(55,s); - строковая переменная s принимает значение, равное '55'.

2) VAL(S,Х,ErrCode) - преобразует строку S в числовое значение, если это возможно. Параметр ErrCode содержит ноль, если преобразование прошло успешно, и тогда в Х помещается результат преобразования, в противном случае он содержит номер позиции в строке S, где обнаружен ошибочный символ. Например:

Val('125',K,kod) - в результате выполнения этой процедуры переменная К получает целое значение, равное 125, параметр kod=0;

Val(' 1.05',M,code) - M=1.05, code=0;

Val('100, ',N,code) - это ошибочный вызов, т.к. в исходной строке на 4-й позиции располагается недопустимый для числа символ ',' и поэтому параметр code=4, а переменная N остается без изменения.

Кроме перечисленных, в ТР имеется еще 5 функций и процедур:

1) Concat (S1,S2,…,Sn) -функция, результат которой равен слиянию строк S1,S2,…,Sn. Например: Ssum:=Concat(s1,s2,s3).

2) Copy (S,Start,L) - функция, результатом которой является подстрока длиной L, начинающаяся с позиции Start строки S. Например: Stcop:=Copy('TTTx1+++',4,2) - результатом является подстрока Stcop='x1'.

3) Delete (S,Start,L) - процедура, которая удаляет из S подстроку длиной L, начиная с позиции Start в строке S.

Insert (S,Subs,Start) - процедура, которая вставляет подстроку Subs в строку S начиная с позиции Start строки S. Например:

S:='Фамилия Адрес';

Insert(S,' Имя Отчество',9);

В результате строка S будет иметь вид: 'Фамилия Имя Отчество Адрес';

Pos(Subs,S) - функция поиска вхождения подстроки Subs в строку S;

результатом поиска будет номер (адрес) первого символа подстроки Subs в S, если заданная подстрока найдена, или 0, если подстроки в строке нет.

 

Множества

Под множеством в языке Паскаль понимают ограниченный неупорядоченный набор различных элементов одинакового типа, логически связанных друг с другом. Количество элементов, входящих в множество, может меняться в пределах от 0 до 255. Множество, не содержащее элементов, называется пустым. Множество имеет имя. Тип элементов, входящих в множество, называется базовым. В качестве базового типа можно использовать любой порядковый тип, кроме Word, Integer, Longint.

Множества должны быть объявлены либо в разделе Var, либо в разделах Type и Var, одновременно:

Var Имя множества:Set of базовый тип;

или

Type Имя типа=Set of базовый тип;

Var Имя множества:Имя типа;

Например:

Type

TM=Set of 1..100;

TS=Set of 'a'..'z';

Var Mch:TM; {Множество целых чисел от 1 до 100}

MSym:TS; {Множество строчных латинских букв}

M: Set of 1..10; {Множество целых чисел от 1 до 10}

 

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

Например:

Var M1,M2,M3:set of 1..99;

Begin...

M1:=[]; { Множество пустое}

M2:=[1,3,5,7,9]; { Множество нечетных чисел в первом десятке}

M3:=[2,4,6,8]; { Множество четных чисел в первом десятке}

...

End.

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

Типизированная константа - множество задается в виде правильного конструктора множества, например:

Type

Type_month=(Jn,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);

TDays=Set of 1..31;

Tmonth=Set of 1..12;

Tsym=Set of 'A'..'Z';

Tmno=Set of Type_month;

Const

SymMno:Tsym=['A','E','I','O','U']; {подмножество гласных букв}

DaysMno:TDays=[1,8,15,22,29]; {подмножество выходных дней месяца}

Spring_Mes:Tmonth=[3,4,5]; {подмножество весенних месяцев года}

Spring_Month:Tmno=[Mar,Apr,May]; {то же, что и предыдущее}

 

Над множествами определены следующие операции:

* - пересечение множеств: результат содержит элементы, общие для обоих множеств. Например: пусть имеется описание:

Var S1,S2,S3,S4,S5:Set of 1..10;

Begin

S1:=[1,3,4,6];

S2:=[2,4,5,1];

S3:=S1*S2; - в S3 будет содержаться [1,4].

+ - объединение множеств: результат содержит элементы первого множества, дополненные недостающими элементами из второго множества:

S4:=S1+S2; - в S4 будет содержаться [1,3,4,6,2,5].

- - разность множеств: результат содержит элементы из первого множества, которые не принадлежат второму:

S5:=S1-S2; - в S5 будет содержаться [3,6].

= - проверка эквивалентности (или равенства): возвращает TRUE, если оба множества эквивалентны, т.е. содержат все одинаковые элементы.

<> - проверка неэквивалентности (или неравенства): возвращает TRUE, если оба множества неэквивалентны, т.е. содержат неодинаковые элементы.

<= - проверка вхождения: возвращает TRUE, если первое множество включено во второе (т.е. все элементы первого множества присутствуют также и во втором).

>= - проверка вхождения: возвращает TRUE, если второе множество включено в первое.

IN - проверка принадлежности элемента множеству. Эта операция возвращает результат TRUE, если элемент (или выражение), стоящий слева принадлежит множеству, указанному справа.

Дополнительно к этим операциям можно использовать две процедуры:

Include - включает новый элемент во множество: Include(M,elem);

где М - множество элементов некоторого базового типа, а elem - элемент того же типа, который необходимо включить в множество М.

Exclude - исключает элемент из множества: Exclude(M,elem).

В отличие от операций "+" и "-", реализующих аналогичные действия над двумя множествами, эти процедуры оптимизированы для работыс одиночными элементами множества и поэтому отличаются высокой скоростью выполнения.

Основным достоинством использования множеств является экономия памяти: внутренне устройство множества таково, что каждому его элементу ставится в соответствие один двоичный разряд (один бит). Если элемент включен в множество, то соотвествующий разряд имеет значение 1, в противном случае - 0. Минимальной единицей памяти является 1 байт, содержащий 8 бит, поэтому для хранения множества мощностью 256 элементов выделяется память 32 смежных байта.

Рассмотрим работу с множествами на следующем примере.

Из множества целых чисел от 1 до 20 выделить:

множество чисел, делящихся на 2 и 3 одновременно;

множество чисел, делящихся на 2 или на 3.

Первая задача соответствует нахождению пересечения множеств чисел, одно из которых содержит числа, делящиеся на 2, а другое на 3. Вторая - объединению этих двух множеств.

Обозначим множество чисел, делящихся на 2 через М2; множество чисел, делящихся на 3 через М3; множество чисел, делящихся на 2 и 3 через М2and3; множество чисел, делящихся на 2 или 3 через М2or3.

 

Записи

Запись - это структура данных, состоящая их фиксированного числа компонентов, называемых полями. Запись имеет имя. Каждое поле записи также имеет имя. Обращение к любому элементу записи осуществляется по составному имени, имеющему вид:

Имя записи.Имя поля

В отличие от массива компоненты (поля или элементы) записи могут быть различного типа. Записи удобно использовать в тех случаях, когда необходимо описать атрибуты (характеристики или свойства) одного объекта, имеющие различный тип.

Запись может быть объявлена в разделе Var или в разделах Type и Var, одновременно.

1. Var Имя записи:RECORD

Имя поля 1:тип;

Имя поля 2:тип;

...

Имя поля n:тип

END;

или

2. Type Имя типа для записи=RECORD

Имя поля 1:тип;

Имя поля 2:тип;

...

Имя поля n:тип

END;

Var Имя записи:Имя типа для записи;

Второй способ описания более предпочтителен, будем использовать его.

Например, пусть необходимо описать список студентов, имеющий следующую структуру:

 

№ п/п Фамилия Имя Отчество Факультет Группа Экзаменационные оценки Физика Математика Программиров

Описание представленной структуры будет иметь следующий вид:

Type

T_Stud=Record

Nom:word;

FIO:string[40];

Fac:string[5];

Group:string[6];

Ball:array[1..3] of byte;

End;

Var Stud: T_Stud; {Описание одной записи}

Записи могут быть составными частями массивов или других записей. Так для описания всего списка студентов, состоящего, допустим, из 1000 записей необходимо записать:

Spisok:Array[1..1000] of T_Stud; {Описание массива из записей}

Элементы записи (поля) используются в программе как обычные переменные данного типа. Чтобы обратиться к i - той записи представленного списка (массива Spisok) и к его полю FIO необходимо записать: Spisok[i].FIO. Для того, чтобы обратиться к той же записи и выбрать оценку по математике необходимо записать Spisok[i].Ball[2].

Для упрощения обращения к элементам записи используется оператор присоединения

WITH Имя записи DO

Begin

Операторы обращения к элементам записи

End;

Для нашего примера используем этот оператор при суммировании трех оценок i-го студента:

...

Sum:=0;

With Spisok[i] do

Begin

For j:=1 to 3 do

Sum:=Sum+Ball[j];

...

End;

 

Рассмотрим пример использования записи внутри другой записи.

Пусть имеется структура:

№ п/п Ф.И.О. Дата рождения Пол Национальность

 

Причем поле дата рождения состоит из полей: число, месяц, год. Тогда описание в программе будет иметь вид:

Type

Date=Record

Days:1..31;

Month:1..12;

Year:1900..2000;

End;

Tzap=Record

Nom:word;

FIO:string[40];

Birthday:Date;

Pol:(Man,Woman);

Nac:string[20];

End;

Var Zap:Tzap;

Для того чтобы обратиться к элементам записи дата рождения, необходимо записать:

D:=Zap. Birthday.Days;

M:= Zap. Birthday.Month;

G:= Zap. Birthday.Year;

или с использованием оператора присоединения

With Zap. Birthday do

Begin

D:=Days; M:=month; G:=Year;

End;

Типизированные константы - записи имеют вид:

Имя константы: Тип = (Список значений полей записи);

Список значений полей записи - это список из последовательностей вида: Имя поля: Константа;

Например:

1) Type

Tdate=Record

Day:1..31;

Month:1..12;

Year:1000..2000;

End;

Const Date:Tdate=(day:25;month:10;year:1999);

2) Type

Tkoord=record

Xk,Ykreal;

end;

Tmas=array[1..3] of Tkoord;

Const Maskoord:Tmas=((Xk:0.0; Yk:0.0),

Xk:1.5; Yk:2.5),

Xk:3.0; Yk:4.5));

 



Поделиться:


Последнее изменение этой страницы: 2016-12-10; просмотров: 342; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.117.70.132 (0.053 с.)