Pascal - Kayıtlar

Pascal dizileri, aynı türden birkaç veri öğesini tutabilen değişken türlerini tanımlamanıza izin verir, ancak bir kayıt, Pascal'da bulunan ve farklı türdeki veri öğelerini birleştirmenize olanak tanıyan kullanıcı tanımlı başka bir veri türüdür.

Kayıtlar farklı alanlardan oluşur. Kitaplarınızı bir kütüphanede takip etmek istediğinizi varsayalım, her kitapla ilgili aşağıdaki özellikleri izlemek isteyebilirsiniz -

  • Title
  • Author
  • Subject
  • Kitap kimliği

Bir Kayıt Tanımlama

Bir kayıt türünü tanımlamak için, tür bildirimi ifadesini kullanabilirsiniz. Kayıt türü şu şekilde tanımlanır:

type
record-name = record
   field-1: field-type1;
   field-2: field-type2;
   ...
   field-n: field-typen;
end;

İşte Kitap kaydını ilan etme şekliniz -

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;

Kayıt değişkenleri her zamanki gibi tanımlanır:

var
   r1, r2, ... : record-name;

Alternatif olarak, bir kayıt türü değişkenini doğrudan şu şekilde tanımlayabilirsiniz:

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;

Bir Kaydın Alanlarına Erişim

Bir kaydın herhangi bir alanına erişmek için üye erişim operatörünü (.) Kullanırız. Üye erişim operatörü, kayıt değişkeni adı ile erişmek istediğimiz alan arasında bir süre olarak kodlanır. Aşağıda yapının kullanımını açıklamak için örnek verilmiştir -

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.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

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

Alt Program Bağımsız Değişkenleri Olarak Kayıtlar

Bir kaydı alt program bağımsız değişkeni olarak başka bir değişken veya işaretçiyi ilettiğinize çok benzer bir şekilde iletebilirsiniz. Kayıt alanlarına, yukarıdaki örnekte eriştiğiniz şekilde erişirsiniz -

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.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

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

Kayıtlara Yönelik İşaretçiler

İşaretçileri başka bir değişkene aşağıdaki gibi tanımladığınız gibi kayıtlara çok benzer şekilde tanımlayabilirsiniz -

type
record-ptr = ^ record-name;
record-name = record
   field-1: field-type1;
   field-2: field-type2;
   ...
   field-n: field-typen;
end;

Şimdi, kayıt türü bir değişkenin adresini yukarıda tanımlanan işaretçi değişkeninde saklayabilirsiniz. Oluşturulan işaretçi türünün bir değişkenini bildirmek için var anahtar sözcüğünü kullanırsınız -

var
   r1, r2, ... : record-ptr;

Bu işaretçileri kullanmadan önce, bu işaretçiler tarafından işlenecek olan bir kayıt adı türü değişken için depolama alanı oluşturmanız gerekir.

new(r1);
new(r2);

Bir kaydın üyelerine o kaydın göstericisini kullanarak erişmek için, ^ işaretini kullanmalısınız. aşağıdaki gibi operatör -

r1^.feild1 := value1;
r1^.feild2 := value2;
...
r1^fieldn := valuen;

Son olarak, artık kullanılmadığında kullanılmış depoyu elden çıkarmayı unutmayın -

dispose(r1);
dispose(r2);

İlk örneği Books kaydına bir işaretçi kullanarak yeniden yazalım. Umarım bu, kavramı anlamanız için kolay olacaktır -

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.

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

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

İle İfadesi

Üye erişim operatörü (.) Kullanılarak bir kaydın üyelerine erişilebileceğini tartışmıştık. Bu şekilde kayıt değişkeninin adı her seferinde yazılmalıdır. With ifadesi bunu yapmanın alternatif bir yolunu sağlar.

İlk örneğimizden alınan aşağıdaki kod parçasına bakın -

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

Aynı ödev, With ifadesi -

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