RECORD
Türleri birbirlerinden farklı olan verileri bir
araya getirip tek bir tip olarak işlemeyi sağlamak için, programcının
tanımladığı bir türdür. Bunu, kağıda yazılı formlar gibi düşünebiliriz.
Örneğin, bir nüfus cüzdanı sureti, bir sürücü ehliyeti, bir başvuru formu,
farklı türden birden çok veriyi, bir bütün olarak bir arada tutarlar. PASCAL’da
bu verileri bir arada tutacak bir yapı oluşturulabilir ve bunun adına record
denilir.
Her tür için olduğu gibi, record, programın (ya da
blokun) bildirge bölümünde tanımlanır. Programcının tanımladığı her türde
olduğu gibi, ya doğrudan değişken olarak tanımlanabilir; ya da dolaylı olarak
bir tip olarak tanımlanabilir.
Var
Kimlik : RECORD
Sicil_No :
integer;
Ad
: string[20];
Soyad : string[20];
ucret :
real
END;
Type
Sicil_No :
integer;
Ad :
string[20];
Soyad : string[20];
ucret :
real
END;
Var
Kimlik1, kimlik2 : kimlik_tipi;
Dolaylı ve dolaysız bildirimler aynı işi görürler.
Ancak, büyük bir programda, aynı biçimdeki record’u farklı bloklarda ve farklı
değişken adlarıyla kullanmak gerekiyorsa, dolaylı bildirim seçilmelidir.
Record ... End arasına yazılan değişkenlerin her
birisine bir bileşen ya da bir veri alanı (field) denilir. Bunların bildirimi
değişken bildirimi gibidir. Herbirine bir ad verilir ve karşısına (:) dan sonra
türü yazılır. Record içinde tanımlanan alanlar için tür ya da sayı kısıtlaması
yoktur. Ancak, record içinde bildirilen her türün derleyici tarafından
biliniyor olması gerekir. Bu demektir ki, ya derleyicide var olan temel
türlerden birisi olmalıdır, ya da programcının önceden tanımladığı bir tip
olmalıdır.
İç içe record tanımlanabilir.
Record bileşenlerine değer atamak ya da atanmış bir
değeri okumak için iki yol izlenebilir.
Bileşeni bir değişken olarak görmek için; record
değişkeninin adı ve bileşenin adı yazılır; aralarına (.) konulur. Örneğin,
Kimlik.Sicil_No
:= 1234;
deyimi, kimlik adlı record değişkeninin Sicil_no
adlı bileşenine 1234 değerini atar. Kimlik._Sicil_No integer türünden bir
değişkendir; dolayısıyla kendi türünden değişkenlerle yapılabilen her işi
yapar.
Çok sayıda bileşenle işlemler yaparken, her deyimde
record adını tekrarlamaktan sakınmak için, PASCAL bir kolaylık getirmiştir.
WITH kimlik DO
Begin
Sicil_No := 1234;
Ad :=
‘DERYA’ ;
Soyad := ‘ERDEM’ ;
Ucret :=
1225000
End;
Deyimi, tek tek yapılan
Kimlik.Sicil_No := 1234;
Kimlik.Ad :=
‘DERYA’ ;
Kimlik.Soyad :=
‘ERDEM’ ;
Kimlik.Ucret :=
1225000;
atamalaların yaptığı işi yapar.
program
tarih;
uses
wincrt;
type
tarih
= record
gun,ay,yil : integer;
end;
var
bugun, yarin : tarih;
Begin
Writeln(‘Bu gün ayın kaçıdır ? ‘)
bugun.gun := 12;
bugun.ay
:= 4;
bugun.yil := 2000;
writeln('Bu günün tarihi : ',
bugun.gun,'/',bugun.ay,'/',bugun.yil);
End.
Record bileşenleri, aynı türden başka değişkenlerden
veri alabşlşr ya da onlara veri verebilir. Dolayısıyla, iki recordun aynı
türden bileşenleri arasında veri alış verişi yapılabilir. Yukarıdaki programı
biraz değiştirerek, bunun nasıl yapıldığını görebiliriz.
program
yarin;
uses
wincrt;
type
tarih =
record
gun,ay,yil
: integer;
end;
var
bugun, yarin : tarih;
Begin
writeln('Bu
gün ayın kaçıdır? ');
readln(bugun.gun);
writeln('Bu
ay kaçıncı aydır? ');
readln(bugun.ay);
writeln('Bu
yıl kaçıncı yıldır? ');
readln(bugun.yil);
yarin.gun := bugun.gun + 1;
yarin.ay
:= bugun.ay;
yarin.yil := bugun.yil;
writeln('Yarının tarihi : ',
yarin.gun,'/',yarin.ay,'/',yarin.yil);
End.
Not: Bu programda, bugun değişkeni yerine ayın son
günü girilirse, program yarının tarihini yanlış verecektir. Neden? Programda,
bunu doğru verecek düzeltmeyi yapınız.
program
record06;
uses
wincrt;
type
tarih_rec =
record
gun,ay,yil
: integer;
end;
tarih_arr =
ARRAY[1..12] OF integer;
PROCEDURE
Guncelle(var yarin : tarih_rec; gunler_arr : tarih_arr);
Begin
yarin.gun := yarin.gun+1;
if yarin.gun > gunler_arr[yarin.ay] then
begin
yarin.gun := 1;
yarin.ay
:= yarin.ay +1;
if yarin.ay > 12 then
begin
yarin.ay := 1;
yarin.yil := yarin.yil + 1;
end
end
End;
Var
bugun_tarih : tarih_rec;
gunler
: tarih_arr;
Begin
gunler[1]:=31; gunler[2] :=28;
gunler[3]:=31; gunler[4] :=30;
gunler[5]:=31; gunler[6] :=30;
gunler[7]:=31; gunler[8] :=31;
gunler[9]:=30; gunler[10]:=31;gunler[11]:=30; gunler[12]:=31;
writeln('Bu
gün ayın kaçıdır? ');
readln(bugun_tarih.gun);
writeln('Bu
ay kaçıncı aydır? ');
readln(bugun_tarih.ay);
writeln('Bu
yıl kaçıncı yıldır? ');
readln(bugun_tarih.yil);
Guncelle(bugun_tarih,gunler);
writeln('Yarının
Tarihi : ', bugun_tarih.gun,'/',bugun_tarih.ay,
'/',bugun_tarih.yil);
End.
Aynı türden iki record değişkeninin bileşenleri
arasında, teker teker aktarma işlemleri yapılabildiği gibi, toplu aktarma da
yapılabilir. Örneğin, aşağıdaki programda, zaman := bugun deyimi, bugun adlı
recordun bütün bileşenlerinin değerlerini, aynı türden olan zaman recordunun
bileşenlerine doğrudan aktarmaktadır.
program
record05;
uses
wincrt;
type
tarih =
record
gun,ay,yil : integer;
end;
var
bugun,zaman : tarih;
Begin
writeln('Bu
gün ayın kaçıdır? ');
readln(bugun.gun);
writeln('Bu
ay kaçıncı aydır? ');
readln(bugun.ay);
writeln('Bu
yıl kaçıncı yıldır? ');
readln(bugun.yil);
zaman :=
bugun;
writeln('Zaman : ',
zaman.gun,'/',zaman.ay,'/',zaman.yil);
End.
Record’lar bir procedure içinde parametre olarak
kullanılabilir. Aşağıdaki örnek bunu göstermektedir.
program
record07;
uses
wincrt;
type
zaman =
record
saniye,dakika,
saat : integer;
end;
Var
gecerli, next :
zaman;
PROCEDURE
Zaman_Guncelle(var simdi : zaman);
var
yeni_zaman : zaman;
Begin
yeni_zaman := simdi;
writeln('Verilen
zaman : ‘);
writeln(yeni_zaman.saat,':',yeni_zaman.dakika,':',yeni_zaman.saniye);
yeni_zaman.saniye := yeni_zaman.saniye + 1;
if yeni_zaman.saniye >= 60 then
begin
yeni_zaman.saniye
:= 0;
yeni_zaman.dakika := yeni_zaman.dakika + 1;
end;
if
yeni_zaman.dakika >= 60 then
begin
yeni_zaman.dakika := 0;
yeni_zaman.saat := yeni_zaman.saat + 1;
end;
if yeni_zaman.saat >= 24 then
yeni_zaman.saat := 0;
writeln;
writeln('Yenizaman : ');
writeln(yeni_zaman.saat,':',yeni_zaman.dakika,':', yeni_zaman.saniye)
End;
BEGIN
writeln('Saat
açtır? ');
readln(gecerli.saat);
writeln('dakika
kaçtır? ');
readln(gecerli.dakika);
writeln('Saniye
kaçtır? ');
readln(gecerli.saniye);
Zaman_Guncelle(gecerli);
End.
Record’lardan oluşan arrayler tanımlanabilir:
Type
Tarih : RECORD
Gun, ay, yil : integer
END;
Var
Dogum_Gunu : ARRAY[1..10] OF tarih;
bildirimi, recordlardan oluşan bir array tanımlar.
Bunun bileşenlerine
Dogum_Gunu[1] .gun := 24;
Dogum_Gunu[1] .ay := 24;
Dogum_Gunu[1] .yil := 24;
biçimindeki deyimlerle erişilebilir.
Record bileşenleri
array olabilir:
Type
Ay_adi = PACKED ARRAY[1..4] OF char;
Ay = RECORD
Gunler
: integer;
Ad : ay_adi;
END;
Var
Bu_ay : ay;
Bildiriminden sonra,
Bu_ay.gun
:= 30;
Bu_ay.ad[1]
:= ‘N’;
Bu_ay.ad[2]
:= ‘I’ ;
Bu_ay.ad[3]
:= ‘S’ ;
Bu_ay.ad[4] := ‘A’ ;
Bu_ay.ad[5] := ‘N’ ;
atamaları geçerlidir.
İç-içe record tanımlanabilir:
Type
Tarih : RECORD
Gun, ay, yil : integer
END;
Zaman = RECORD
Dogum_gunu : tarih;
Kayit_Gunu :