Массивы Pascal позволяют вам определять тип переменных, которые могут содержать несколько элементов данных одного типа, но запись — это другой определенный пользователем тип данных, доступный в Pascal, который позволяет комбинировать элементы данных разных типов.
Записи состоят из разных полей. Предположим, что вы хотите отслеживать свои книги в библиотеке, вы можете отслеживать следующие атрибуты для каждой книги —
- заглавие
- автор
- Предмет
- ID книги
Определение записи
Чтобы определить тип записи, вы можете использовать оператор объявления типа. Тип записи определяется как —
type record-name = record field-1: field-type1; field-2: field-type2; ... field-n: field-typen; end;
Вот как бы вы объявили Книжную запись —
type Books = record title: packed array [1..50] of char; author: packed array [1..50] of char; subject: packed array [1..100] of char; book_id: integer; end;
Переменные записи определяются обычным образом как
var r1, r2, ... : record-name;
Кроме того, вы можете напрямую определить переменную типа записи как —
var Books : record title: packed array [1..50] of char; author: packed array [1..50] of char; subject: packed array [1..100] of char; book_id: integer; end;
Доступ к полям записи
Для доступа к любому полю записи мы используем оператор доступа участника (.). Оператор доступа к элементу закодирован как точка между именем переменной записи и полем, к которому мы хотим получить доступ. Ниже приведен пример, объясняющий использование структуры:
program exRecords; type Books = record title: packed array [1..50] of char; author: packed array [1..50] of char; subject: packed array [1..100] of char; book_id: longint; end; var Book1, Book2: Books; (* Declare Book1 and Book2 of type Books *) begin (* book 1 specification *) Book1.title := 'C Programming'; Book1.author := 'Nuha Ali '; Book1.subject := 'C Programming Tutorial'; Book1.book_id := 6495407; (* book 2 specification *) Book2.title := 'Telecom Billing'; Book2.author := 'Zara Ali'; Book2.subject := 'Telecom Billing Tutorial'; Book2.book_id := 6495700; (* print Book1 info *) writeln ('Book 1 title : ', Book1.title); writeln('Book 1 author : ', Book1.author); writeln( 'Book 1 subject : ', Book1.subject); writeln( 'Book 1 book_id : ', Book1.book_id); writeln; (* print Book2 info *) writeln ('Book 2 title : ', Book2.title); writeln('Book 2 author : ', Book2.author); writeln( 'Book 2 subject : ', Book2.subject); writeln( 'Book 2 book_id : ', Book2.book_id); end.
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Book 1 title : C Programming Book 1 author : Nuha Ali Book 1 subject : C Programming Tutorial Book 1 book_id : 6495407 Book 2 title : Telecom Billing Book 2 author : Zara Ali Book 2 subject : Telecom Billing Tutorial Book 2 book_id : 6495700
Записи как аргументы подпрограммы
Вы можете передать запись в качестве аргумента подпрограммы таким же образом, как и любую другую переменную или указатель. Вы получите доступ к полям записи аналогично тому, как вы использовали в приведенном выше примере —
program exRecords; type Books = record title: packed array [1..50] of char; author: packed array [1..50] of char; subject: packed array [1..100] of char; book_id: longint; end; var Book1, Book2: Books; (* Declare Book1 and Book2 of type Books *) (* procedure declaration *) procedure printBook( var book: Books ); begin (* print Book info *) writeln ('Book title : ', book.title); writeln('Book author : ', book.author); writeln( 'Book subject : ', book.subject); writeln( 'Book book_id : ', book.book_id); end; begin (* book 1 specification *) Book1.title := 'C Programming'; Book1.author := 'Nuha Ali '; Book1.subject := 'C Programming Tutorial'; Book1.book_id := 6495407; (* book 2 specification *) Book2.title := 'Telecom Billing'; Book2.author := 'Zara Ali'; Book2.subject := 'Telecom Billing Tutorial'; Book2.book_id := 6495700; (* print Book1 info *) printbook(Book1); writeln; (* print Book2 info *) printbook(Book2); end.
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Book 1 title : C Programming Book 1 author : Nuha Ali Book 1 subject : C Programming Tutorial Book 1 book_id : 6495407 Book 2 title : Telecom Billing Book 2 author : Zara Ali Book 2 subject : Telecom Billing Tutorial Book 2 book_id : 6495700
Указатели на записи
Вы можете определить указатели на записи очень похожим образом, как вы определяете указатель на любую другую переменную следующим образом:
type record-ptr = ^ record-name; record-name = record field-1: field-type1; field-2: field-type2; ... field-n: field-typen; end;
Теперь вы можете сохранить адрес переменной типа записи в определенной выше переменной указателя. Чтобы объявить переменную созданного типа указателя, вы используете ключевое слово var —
var r1, r2, ... : record-ptr;
Перед использованием этих указателей вы должны создать хранилище для переменной типа имя-записи, которой будут манипулировать эти указатели.
new(r1); new(r2);
Чтобы получить доступ к членам записи, используя указатель на эту запись, вы должны использовать ^. оператор следующим образом —
r1^.feild1 := value1; r1^.feild2 := value2; ... r1^fieldn := valuen;
Наконец, не забудьте утилизировать использованное хранилище, когда оно больше не используется —
dispose(r1); dispose(r2);
Давайте перепишем первый пример, используя указатель на запись Книги. Надеюсь, вам будет легко понять концепцию —
program exRecords; type BooksPtr = ^ Books; Books = record title: packed array [1..50] of char; author: packed array [1..50] of char; subject: packed array [1..100] of char; book_id: longint; end; var (* Declare Book1 and Book2 of pointer type that refers to Book type *) Book1, Book2: BooksPtr; begin new(Book1); new(book2); (* book 1 specification *) Book1^.title := 'C Programming'; Book1^.author := 'Nuha Ali '; Book1^.subject := 'C Programming Tutorial'; Book1^.book_id := 6495407; (* book 2 specification *) Book2^.title := 'Telecom Billing'; Book2^.author := 'Zara Ali'; Book2^.subject := 'Telecom Billing Tutorial'; Book2^.book_id := 6495700; (* print Book1 info *) writeln ('Book 1 title : ', Book1^.title); writeln('Book 1 author : ', Book1^.author); writeln( 'Book 1 subject : ', Book1^.subject); writeln( 'Book 1 book_id : ', Book1^.book_id); (* print Book2 info *) writeln ('Book 2 title : ', Book2^.title); writeln('Book 2 author : ', Book2^.author); writeln( 'Book 2 subject : ', Book2^.subject); writeln( 'Book 2 book_id : ', Book2^.book_id); dispose(Book1); dispose(Book2); end.
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Book 1 title : C Programming Book 1 author : Nuha Ali Book 1 subject : C Programming Tutorial Book 1 book_id : 6495407 Book 2 title : Telecom Billing Book 2 author : Zara Ali Book 2 subject : Telecom Billing Tutorial Book 2 book_id : 6495700
С заявлением
Мы обсудили, что к членам записи можно получить доступ с помощью оператора доступа к члену (.). Таким образом, имя переменной записи должно быть записано каждый раз. Оператор With предоставляет альтернативный способ сделать это.
Посмотрите на следующий фрагмент кода, взятый из нашего первого примера —
(* book 1 specification *) Book1.title := 'C Programming'; Book1.author := 'Nuha Ali '; Book1.subject := 'C Programming Tutorial'; Book1.book_id := 6495407;
Такое же назначение может быть записано с использованием оператора With, как —