Type имя типа = record
имя поля 1: тип;
имя поля 2: тип;
...
имя поля N: тип
end;
Var имя записи: имя типа;
где record, end – зарезервированные слова (запись, конец);
имя поля1,..имя поля n – список полей;
Например:
Type Car = record
Number: integer; {номер}
Marka: string[20]; {марка автомобиля}
FIO: string[50] {фамилия владельца}
end;
Var a,b: Car;
Пример обращения к полям записи: a. Marka, B.FIO, A.Number
Для упрощения доступа к полям записи используется оператор присоединения With
With имя записи do оператор
где With, do – зарезервированные слова (с, делать);
имя записи – имя переменной типа запись, за которым возможно следует список вложенных полей;
оператор – любой (один) оператор языка Pascal.
Например: With A do Marka:=’Жигули’
К записям в целом применим оператор присваивания. Например А:=В
Над полями записей можно выполнять любые операции, присущие данному типу.
Pascal допускает использование вложенных записей (т.е. поле записи может быть в свою очередь тоже записью). Уровень вложения не должен превышать 9.
Например: Type zap1 = record
Day: byte; {день}
Month: 1..12; {месяц}
Year: word {год}
end;
zap2 = record
FIO: string[30]; {фамилия студента}
Gruppa: integer; {номер группы}
Birthday: zap1 {дата рождения}
end;
Var Spisok: array [1..10] of zap2;
Пример обращения к дню рождения студента:
For i:=1 to 10 do
With spisok[i], birthday do
day:= 23;
В языке Pascal имеется возможность задать тип записи, содержащий произвольное число вариантов структуры. Такие записи называются записями с вариантами. Записи с вариантами обеспечивают средства объединения записей, которые похожи, но не идентичны. Они состоят из фиксированной и вариантной частей. Вариантная часть формируется с помощью оператора Case. Он задает поле признака, которое определяет, какой из вариантов в данный момент будет активизирован. Значением признака в каждый текущий момент выполнения программы должна быть одна из расположенных далее констант. Константа, служащая признаком, задает вариант записи и называется константой выбора. Количество полей каждого из вариантов неограниченно. Объем памяти, необходимый для записи с вариантами, складывается из объемов полей фиксированной части и максимального по объему поля переменной (вариантной) части. Запись может иметь только одну вариантную часть и она должна размещаться в конце записи.
Описание вариантной записи
Type имя типа = record
имя поля 1: тип;
...
имя поля N: тип;
Case поле признака: тип of
константа выбора1: (поле, …: тип);
...
константа выбора n: (поле, …: тип)
end;
Var имя записи: имя типа;
Например:
Type Tmark1 = record {экзамены 1 семестра}
Matem1:byte; {математика}
LinAlg:byte; {линейная алгебра}
Program: byte; {программирование}
end;
Tmark2 = record {экзамены 2 семестра}
Mаtem2: byte; {математика}
Electron: byte; {электроника}
Fisika: byte; {физика}
DigAutom: byte; {цифровые автоматы}
end;
Tstudent = record {информация о студенте}
FIO:string[40]; {фамилия,имя,отчество}
Gruppa:string[4]; {группа}
Year: integer; {год рождения}
{вариантная часть}
Case semester: byte of {выбор семестра}
1: ( mark1: Tmark1);
2: (mark2: Tmark2)
End;
Var gr921: array[1..15] of Tstudent;
Пример1: Из массива записей, содержащего информацию о преподавателях (фамилия_имя_отчество, читаемые дисциплины) вывести алфавитном порядке фамилии преподавателей, читающих заданную дисциплину.
Program zapis;
Type
Mas= array [1..10] of string;
TRec = Record
FIO: String[40]; {ФИО преподавателя}
KOL: integer; {количество читаемых дисциплин}
DIS: Mas; {перечень читаемых дисциплин}
end;
zap= array [1..15] of Trec;
var rec:zap;
k:trec;
op,kol,i,j,n:integer;
st:string;
Begin
writeln('Введите количество преподавателей ');
readln(kol);
For i:=1 to kol do
Begin
Write('Введите ФИО -');
readln(rec[i].fio);
write('Введите количество дисциплин -');
readln(rec[i].kol);
For j:=1 to rec[i].kol do
Begin
Write('Введите ',j,'-ую дисциплину- ');
readln(rec[i].dis[j]);
end;
end;
op:=1;
{сортировка массива записей в алфавитном порядке фамилий}
while op=1 do {op=1 – сортировка не закончена}
Begin
op:=0;
for i:=1 to kol-1 do
if rec[i].FIO>rec[i+1].FIO then
Begin
k:=rec[i];
rec[i]:=rec[i+1];
rec[i+1]:=k;
op:=1;
end;
end;
Writeln('Введите название дисциплины для поиска преподавателя');
readln(st);
op:=0; {op- признак наличия преподавателей, читающих заданную дисциплину}
For i:=1 to kol do
For j:=1 to rec[i].kol do
if rec[i].dis[j]=st then begin
op:=1;
writeln(rec[i].Fio);
end;
if op=0 then
writeln (‘нет преподавателей, читающих дисциплину -’, st);
end.
Результаты решения задачи
Введите количество преподавателей
Введите ФИО -Смирнова Ольга Петровна
Введите количество дисциплин -2
Введите 1-ую дисциплину- информатика
Введите 2-ую дисциплину- вычислительная техника
Введите ФИО -Авдеева Людмила Петровна
Введите количество дисциплин -1
Введите 1-ую дисциплину- вычислительная техника
Введите ФИО -Фомин Иван Сергеевич
Введите количество дисциплин -2
Введите 1-ую дисциплину- физика
Введите 2-ую дисциплину- электроника
Введите название дисциплины для поиска преподавателя
вычислительная техника
Авдеева Людмила Петровна
Смирнова Ольга Петровна
Введите количество преподавателей
Введите ФИО -Романова Елена Сергеевна
Введите количество дисциплин -2
Введите 1-ую дисциплину- физика
Введите 2-ую дисциплину- математика
Введите ФИО -Дмитриев Андрей Владимирович
Введите количество дисциплин -2
Введите 1-ую дисциплину- история
Введите 2-ую дисциплину- философия
Введите название дисциплины для поиска преподавателя
информатика
нет преподавателей, читающих дисциплину -информатика
Тема 2.10 Файлы данных
Файл – представляет собой последовательность компонент одного типа, расположенных на внешнем носителе информации.
Любой файл имеет три характерные особенности:
- у него есть имя;
- содержит компоненты одного типа;
- длина создаваемого файла никак не оговаривается при его объявлении ограничивается только емкостью устройства внешней памяти.
В языке Pascal различают 3 типа файлов данных:
1. Типизированные – это файл, длина любого компонента которого строго постоянна, что дает возможность организовать прямой доступ к каждому из них (т.е. доступ к компоненту по его порядковому номеру). Компонентами типизированного файла могут быть вещественные, целочисленные, символьные, логические типы данных и записи.
2. Текстовые – это совокупность символов, разделенных на строки переменной длины. В конце каждой строки стоит признак конца строки EOLN (end of line). Доступ к каждой строке возможен только последовательно, начиная с первой. Компонентами текстового файла могут быть данные следующих типов: символьные, стринги, вещественные и целочисленные.
3. Нетипизированные – отсутствие типа компонентов делает эти файлы совместимыми с любыми другими файлами и позволяет организовать высокий скоростной обмен данными между внешним запоминающим устройством (ВЗУ) и оперативной памятью (ОП). Относятся к файлам прямого доступа.
Чтение данных из файла (т.е. ввод данных в ОП машины) и запись данных в файл (т.е. вывод данных из ОП на ВЗУ) осуществляется через файловые переменные.