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.
Direk Bildirim
Var
Kimlik : RECORD
Sicil_No : integer;
Ad : string[20];
Soyad : string[20];
ucret : real
END;
Dolaylı Bildirim
Type
Kimlik_tipi = RECORD
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 Erişim
Record bileşenlerine değer atamak ya da atanmış bir değeri okumak için iki yol izlenebilir.
Record Adını ve Bileşeni Yazarak
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.
Yalnızca Bileşen Adını Yazarak
Ç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 := ‘ERTEM’ ;
Ucret := 1225000
End;
Deyimi, tek tek yapılan
Kimlik.Sicil_No := 1234;
Kimlik.Ad := ‘DERYA’ ;
Kimlik.Soyad := ‘ERTEM’ ;
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 := 2012;
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 : gun;
Uzun oldu ama elimden geldiğince basite indirgedim umarım anlaşılır olmuştur.
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.
Direk Bildirim
Var
Kimlik : RECORD
Sicil_No : integer;
Ad : string[20];
Soyad : string[20];
ucret : real
END;
Dolaylı Bildirim
Type
Kimlik_tipi = RECORD
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 Erişim
Record bileşenlerine değer atamak ya da atanmış bir değeri okumak için iki yol izlenebilir.
Record Adını ve Bileşeni Yazarak
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.
Yalnızca Bileşen Adını Yazarak
Ç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 := ‘ERTEM’ ;
Ucret := 1225000
End;
Deyimi, tek tek yapılan
Kimlik.Sicil_No := 1234;
Kimlik.Ad := ‘DERYA’ ;
Kimlik.Soyad := ‘ERTEM’ ;
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 := 2012;
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 : gun;
Uzun oldu ama elimden geldiğince basite indirgedim umarım anlaşılır olmuştur.