- •Тема 16. Структурированные типы данных
- •16.1. Строки и средства их обработки
- •16.1.1. Процедуры и функции типа String
- •16.2. Записи
- •16.2.1. Записи с вариантами
- •16.2.2. Оператор присоединения
- •16.3. Множества
- •16.4.Файлы
- •16.4.1. Текстовые файлы
- •16.4.2. Компонентные файлы
- •16.4.3. Бестиповые файлы
- •16.4.4. Последовательный и прямой доступ
- •16.4.5. Основные задачи обработки файлов
- •16.4.6. Сортировка файлов
- •16.4.7. Задача корректировки файла
16.1.1. Процедуры и функции типа String
На строковом типе данных определены:
Функции:
Length(X: String): Byte; – длина строки X; Length(EmptyStr) = 0.
Pos(Y:String; X:String):Byte; – позиция первого символа первого слева вхождения подстроки Y в строку X. Если X не содержит Y, Pos(Y, X) = 0.
Copy(X:String; Index, Count: Integer):String; – подстрока строки X, начинающаяся с позиции Index и содержащая Count символов.
Concat(X1, X2, .., Xk: String): String; – конкатенация строк Х1, X2, .., Xk. Другая форма записи суммы X1+X2+ .. +Xk.
Процедуры:
Delete(var X: String; Index, Count: Integer); Из строки X удаляется Сount символов, начиная с позиции Index. Результат помещается в переменную X.
Insert(Y:string; var X: String; Index: Integer); В строку X вставляется строка Y, причем вставка осуществляется начиная с позиции Index.
Пример 1. Дан массив A[1..n] of string[20]. Составить программу замены всех первых вхождений подстроки L в A[i] на подстроку R. Строки L и R вводятся с клавиатуры в виде равенства L = R. Результат замен отобразить в массив, элементы которого – равенства вида A[i]=результат замены L на R в A[i].
Program RewriteArray;
Const n = 100; Single = 20; Double = 41;
Type
Sitem = string[Single]; Ditem = string[Double];
SWordArray = array[1..n] of Sitem; DWordArray = array[1..n] of Ditem;
Var
A: SWordArray; B: DWordArray;
L, R: Sitem; X : Sitem;
i, Index : Integer;
Procedure InpWord(var U, V : Sitem);
Var X : Ditem; j : Integer;
Begin
Writeln('________ Ввод равенства L = R __________');
Read(X); j := Pos('=', X);
U := Copy(X, 1, j – 1);
V := Copy(X, j + 1, Length(X))
End;
Procedure InpArray;
begin
Writeln('====== Ввод массива слов ======');
For i:=1 to n do Readln(A[i])
end;
Procedure OutArray;
begin
Writeln('====== Вывод массива слов ====');
For i:=1 to n do Writeln(B[i])
end;
Begin
InpArray; {ввод массива слов с клавиатуры}
InpWord(L, R); {ввод и анализ равенства L = R}
For i := 1 to n do begin
X := A[i]; Index := Pos(L, X);
If Index <> 0 then begin
Delete(X, Index, Length(L));
Insert(R, X, Index)
end;
B[i] := A[i] + '=' + X
end;
OutArray; {вывод массива слов на печать }
End.
16.2. Записи
Запись представляет собой совокупность ограниченного числа логически связанных компонент, принадлежащих к разным типам. Компоненты записи называются полями, каждое из которых определяется именем. Поле записи содержит имя поля, вслед за которым через двоеточие указывается тип этого поля. Поля записи могут относиться к любому типу, допустимому в языке Паскаль, за исключением файлового типа.
Значениями так называемого комбинированного типа данных являются записи. Комбинированный тип задает образ структуры объекта – данного этого типа, каждая часть которой (поле) может иметь совершенно различные характеристики.
Таким образом, запись – это набор разнотипных данных, объединенных общим именем. Более формально, запись содержит определенное число компонент, называемых полями.
Описание записи в языке Паскаль осуществляется с помощью служебного слова record, вслед за которым описываются компоненты записи. Завершается описание записи служебным словом end.
В определении типа записи задается имя и тип каждого поля записи:
<комбинированный тип>::= Record < список описаний полей > End
<список полей>::= <фиксир. часть> | <фиксир. часть>;<вариант. часть> | <вариант. часть>
<фиксированная часть>::= <секция записи> {,<секция записи>}
< секция записи >::= <имя поля>{, <имя поля>}: < тип > | <пусто>
Синтаксис записей, содержащих вариантную часть – записей с вариантами – мы определим ниже. Соответствующие синтаксические диаграммы записей с вариантами:
Комбинированный тип
Фиксированная часть Секция записи
Например, записная книжка содержит фамилии, инициалы и номера телефона, поэтому отдельную строку в записной книжке удобно представить в виде следующей записи:
type row=record
fio: string[20];
tel: string[7]
end;
var str: row;
Описание записей возможно и без использования имени типа, например:
var str: record
fio: string[20];
tel: string[7]
end;
Пример 2.
Type Complex = Record
Re, Im : Real
end;
Var z1, z2 : Complex;
Пример 3.
Type Name = array [1..15] of Char;
Student = Record
F1,F2,F3 : Name;
Day : 1..31;
Month : 1..12;
Year : integer;
StudDoc : integer
end;
Var Group : array [1..25] of student;
S : Student;
Обращение к записи в целом допускается только в операторах присваивания, где слева и справа от знака присваивания используются имена записей одинакового типа. Во всех остальных случаях оперируют отдельными полями записей. Чтобы обратиться к отдельной компоненте записи, необходимо задать имя записи и через точку указать имя нужного поля, например:
str.fio, str.tel
Такое имя называется составным. Компонентой записи может быть также запись, в таком случае составное имя будет содержать не два, а большее количество имен.
При обозначении компоненты записи в программе следом за именем записи ставится точка, а затем имя соответствующего поля. Таким образом осуществляется доступ к этой компоненте. Например:
1) z1.Re := 2; z1.Im := 3;
M := sqrt(sqr(z1.Re) + sqr(z1.Im));
2) S.F1 := Group[i].F1;
S.Year := Group[i + 1].Year;
writeln( Group[i].StudDoc);
Запись может входить в состав данных более сложной структуры. Можно говорить, например, о массивах и файлах, состоящих из записей. Запись может быть полем другой записи.
Пример 4.
Type Name = array[1..20] of Char;
FullName = Record
Name1, Name2, Name3 : Name
end;
Date = Record
Day : 1..31;
Month : 1..12;
Year : integer
end;
Student = Record
StudName: FullName;
BirthDay: Date;
StudDoc: integer
end;
Var StudGroup : Array [1..30] of Stugent;
A, B : Student;
Например, доступ к полю day переменной A возможен по имени A.BirthDay.Day, а к первой букве поля Name2 имени студента с номером 13 переменной StudGroup – по имени StudGroup[13].StudName.Name2[1]