パスカル-記録

Pascal配列を使用すると、同じ種類の複数のデータアイテムを保持できる変数のタイプを定義できますが、レコードは、異なる種類のデータアイテムを組み合わせることができるPascalで使用できる別のユーザー定義データタイプです。

レコードはさまざまなフィールドで構成されています。図書館で本を追跡したい場合、各本に関する次の属性を追跡したい場合があります。

  • Title
  • Author
  • Subject
  • ブック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);

Booksレコードへのポインタを使用して、最初の例を書き直してみましょう。これがあなたが概念を理解するのが簡単になることを願っています-

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ステートメント

レコードのメンバーには、メンバーアクセス演算子(。)を使用してアクセスできることを説明しました。このように、レコード変数の名前を毎回書き込む必要があります。ザ・With ステートメントは、それを行うための代替方法を提供します。

最初の例から抜粋した次のコードスニペットを見てください-

(* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;

同じ割り当ては、を使用して書くことができます With -としてのステートメント

(* book 1 specification *)
With Book1 do
begin
   title  := 'C Programming';
   author := 'Nuha Ali '; 
   subject := 'C Programming Tutorial';
   book_id := 6495407;
end;