1 Записи
2 Запись – это тип данных, который может включать в себя несколько полей – элементов разных типов (в том числе и другие структуры). Свойства: автор (строка) название (строка) год издания (целое число) количество страниц (целое число) Задача: объединить эти данные в единое целое Размещение в памяти авторназвание год издания количество страниц 40 символов80 символовцелое
3 Одна запись readln(Book.author); // ввод readln(Book.title); Book.year := 1998; // присваивание if Book.pages > 200 then // сравнение writeln(Book.author, '.', Book.title); // вывод readln(Book.author); // ввод readln(Book.title); Book.year := 1998; // присваивание if Book.pages > 200 then // сравнение writeln(Book.author, '.', Book.title); // вывод Объявление (выделение памяти): var Book: record author: string[40]; // автор, строка title: string[80]; // название, строка year: integer;// год издания, целое pages: integer; // кол-во страниц, целое end; var Book: record author: string[40]; // автор, строка title: string[80]; // название, строка year: integer;// год издания, целое pages: integer; // кол-во страниц, целое end; название запись поля Обращение к полям: Для обращения к полю записи используется точка! ! !
4 Обращение к записи Обращение к записи в целом допускается только в операторах присваивания, где слева и справа от знака присваивания используются имена записей одинакового типа. Во всех остальных случаях оперируют отдельными полями записей. Чтобы обратиться к отдельной компоненте записи, необходимо задать имя записи и через точку указать имя нужного поля, например: str.fio, str.tel Такое имя называется составным.
5 Записи Запись может входить в состав данных более сложной структуры. Можно говорить, например, о массивах и файлах, состоящих из записей. Запись может быть полем другой записи.
6 Оператор присоединения Обращение к компонентам записей можно упростить, если воспользоваться оператором присоединения With. Он позволяет заменить составные имена, характеризующие каждое поле, просто на имена полей, а имя записи определить в операторе присоединения. Формат оператора: With {, } do ; With {, } do ;
7 Оператор присоединения Обращение к компонентам записей можно упростить, если воспользоваться оператором присоединения With. Он позволяет заменить составные имена, характеризующие каждое поле, просто на имена полей, а имя записи определить в операторе присоединения. Формат оператора: With {, } do ; With {, } do ; Заголовок этого оператора открывает область действия "внутренних" имен полей записи, которые могут быть использованы как имена переменных.
8 Оператор присоединения Оператор вида With r1,..., rn do эквивалентен оператору With r1 do with r2... with rn do.
9 Оператор присоединения:пример Type Student = Record F1, F2, F3 : Name; Day : 1..31; Month : 1..12; Year : integer; StudDoc : integer end; Var A : Student; Type Student = Record F1, F2, F3 : Name; Day : 1..31; Month : 1..12; Year : integer; StudDoc : integer end; Var A : Student; Значение переменной A можно изменить операторами: A.F1 := 'Иванов '; A.F2 := 'Илья '; A.F3 := 'Иннокентьевич '; A.Day := 14; A.Month := 9; A.Year := 1976; A.StudDoc := 123; A.F1 := 'Иванов '; A.F2 := 'Илья '; A.F3 := 'Иннокентьевич '; A.Day := 14; A.Month := 9; A.Year := 1976; A.StudDoc := 123;
10 Оператор присоединения:пример Предпочтительнее использовать следующий вариант: with A do begin F1 := 'Иванов '; F2 := 'Илья '; F3 := 'Иннокентьевич '; Day := 14; Month := 9; Year := 1976; StudDoc := 123; end; { оператора with } with A do begin F1 := 'Иванов '; F2 := 'Илья '; F3 := 'Иннокентьевич '; Day := 14; Month := 9; Year := 1976; StudDoc := 123; end; { оператора with }
11 Массив записей Объявление (выделение памяти): const N = 10; var aBooks: array[1..N] of record author: string[40]; title: string[80]; year: integer; pages: integer; end; const N = 10; var aBooks: array[1..N] of record author: string[40]; title: string[80]; year: integer; pages: integer; end; Books[1]... Books[10] authortitleyearpages
12 Массив записей for i:=1 to N do begin readln(aBooks[i].author); readln(aBooks[i].title);... end; for i:=1 to N do if aBooks[i].pages > 200 then writeln(aBooks[i].author, '.', aBooks[i].title); for i:=1 to N do begin readln(aBooks[i].author); readln(aBooks[i].title);... end; for i:=1 to N do if aBooks[i].pages > 200 then writeln(aBooks[i].author, '.', aBooks[i].title); Обращение к полям: aBooks[i].author – обращение к полю author записи aBooks[i] ! !
13 Новый тип данных – запись const N = 10; var Book: TBook; // одна запись aBooks: array[1..N] of TBook; // массив const N = 10; var Book: TBook; // одна запись aBooks: array[1..N] of TBook; // массив Объявление типа: type TBook = record author: string[40]; // автор, строка title: string[80]; // название, строка year: integer;// год издания, целое pages : integer; // кол-во страниц, целое end; type TBook = record author: string[40]; // автор, строка title: string[80]; // название, строка year: integer;// год издания, целое pages : integer; // кол-во страниц, целое end; Память не выделяется! ! ! Объявление переменных и массивов: TBook – Type Book («тип книга») – удобно!
14 Записи в процедурах и функциях Book.author := 'А.С. Пушкин'; ShowAuthor ( Book ); Book.year := 1800; writeln( IsOld(Book) ); Book.author := 'А.С. Пушкин'; ShowAuthor ( Book ); Book.year := 1800; writeln( IsOld(Book) ); Процедура: procedure ShowAuthor ( b: TBook ); begin writeln ( b.author ); end; procedure ShowAuthor ( b: TBook ); begin writeln ( b.author ); end; Память не выделяется! ! ! Основная программа: function IsOld( b: TBook ): boolean; begin IsOld := b.year < 1900; end; function IsOld( b: TBook ): boolean; begin IsOld := b.year < 1900; end; Функция:
15 Файлы записей Объявление указателя на файл: var F: file of TBook; Assign(F, 'books.dat'); { связать с указателем } Rewrite(F); { открыть файл для запись } writeln(F, Book); { запись } for i:=1 to 5 do writeln(aBook[i]); { запись } Close(F); { закрыть файл } Assign(F, 'books.dat'); { связать с указателем } Rewrite(F); { открыть файл для запись } writeln(F, Book); { запись } for i:=1 to 5 do writeln(aBook[i]); { запись } Close(F); { закрыть файл } Запись в файл:
16 Чтение из файла Известное число записей: Assign(F, 'books.dat'); { связать с указателем } Reset(F); { открыть для чтения } Read(F, Book); { чтение } for i:=1 to 5 do Read(F, aBook[i]); { чтение } Close(F); { закрыть файл } Assign(F, 'books.dat'); { связать с указателем } Reset(F); { открыть для чтения } Read(F, Book); { чтение } for i:=1 to 5 do Read(F, aBook[i]); { чтение } Close(F); { закрыть файл } «Пока не кончатся»: count := 0; while not eof(F) do begin count := count + 1; { счетчик } Read(F, aBook[count]); { чтение } end; count := 0; while not eof(F) do begin count := count + 1; { счетчик } Read(F, aBook[count]); { чтение } end; В чем может быть проблема! ? ? пока не дошли до конца файла F EOF = end of file пока не дошли до конца файла F EOF = end of file
17 Пример программы Задача: в файле books.dat записаны данные о книгах в виде массива структур типа TBook (не более 100). Установить для всех 2008 год издания и записать обратно в тот же файл. type Tbook … ; const MAX = 100; var aBooks: array[1..MAX] of TBook; i, N: integer; F: file of TBook; begin { прочитать записи из файла, N - количество } for i:=1 to N do aBooks[i].year := 2008; { сохранить в файле } end. type Tbook … ; const MAX = 100; var aBooks: array[1..MAX] of TBook; i, N: integer; F: file of TBook; begin { прочитать записи из файла, N - количество } for i:=1 to N do aBooks[i].year := 2008; { сохранить в файле } end. type TBook … ; полное описание структуры
18 Пример программы Чтение «пока не кончатся»: Assign(f, 'books.dat'); Reset(f); N := 0; while not eof(F) and (N < MAX) do begin N := N + 1; read(F, aBooks[N]); end; Сlose(f); Assign(f, 'books.dat'); Reset(f); N := 0; while not eof(F) and (N < MAX) do begin N := N + 1; read(F, aBooks[N]); end; Сlose(f); Assign(f, 'books.dat'); { можно без этого } Rewrite(f); for i:=1 to N do write(F, aBooks[i]); Close(f); Assign(f, 'books.dat'); { можно без этого } Rewrite(f); for i:=1 to N do write(F, aBooks[i]); Close(f); Сохранение: чтобы не выйти за пределы массива
19 Сортировка массива записей Ключ (ключевое поле) – это поле записи (или комбинация полей), по которому выполняется сортировка. const N = 100; var aBooks: array[1..N] of TBook; i, j, N: integer; temp: TBook; { для обмена } begin { заполнить массив aBooks } { отсортировать = переставить } for i:=1 to N do writeln(aBooks[i].title, aBooks[i].year:5); end. const N = 100; var aBooks: array[1..N] of TBook; i, j, N: integer; temp: TBook; { для обмена } begin { заполнить массив aBooks } { отсортировать = переставить } for i:=1 to N do writeln(aBooks[i].title, aBooks[i].year:5); end.
20 Сортировка массива записей for i:=1 to N-1 do for j:=N-1 downto i do if aBooks[j].year > aBooks[j+1].year then begin temp := aBooks[j]; aBooks[j] := aBooks[j+1]; aBooks[j+1] := temp; end; for i:=1 to N-1 do for j:=N-1 downto i do if aBooks[j].year > aBooks[j+1].year then begin temp := aBooks[j]; aBooks[j] := aBooks[j+1]; aBooks[j+1] := temp; end; Какой ключ сортировки? ? ? Какой метод сортировки? ? ?